070701000F0017000041ED000000000000000000000003556432B600000000000000FD0000000000000000000000000000000200000000.070701000F001F000041ED000000000000000000000003556432B600000000000000FD0000000000000000000000000000000600000000linux070701000F0020000041ED000000000000000000000003556432B600000000000000FD0000000000000000000000000000000B00000000linux/suse070701000F0021000041ED000000000000000000000004556432B600000000000000FD0000000000000000000000000000001900000000linux/suse/x86_64-sles12070701000F0022000081A4000000000000000000000001556432B600000190000000FD0000000000000000000000000000002400000000linux/suse/x86_64-sles12/dud.config# created by mkdud 0.0 UpdateID: f39b5d9c-5bdd-42d9-a15e-e00c32628c7b UpdateName: dracut-037-49.1.8562.0.PTF.916376.x86_64 Tue May 19 15:56:05 2015 UpdateName: dracut-fips-037-49.1.8562.0.PTF.916376.x86_64 Tue May 19 15:56:05 2015 UpdateName: yast2-3.1.108-1.16.8535.7.PTF.916376.x86_64 Tue May 26 08:27:36 2015 UpdateName: yast2-network-3.1.108-1.2.8555.0.PTF.916376.x86_64 Mon May 18 12:53:20 2015 070701000F0023000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000002100000000linux/suse/x86_64-sles12/install070701000F02E4000081A4000000000000000000000001556432B600030199000000FD0000000000000000000000000000005800000000linux/suse/x86_64-sles12/install/yast2-network-3.1.108-1.2.8555.0.PTF.916376.x86_64.rpmyast2-network-3.1.108-1.2.8555.0.PTF.916376> A AlpA?UYlts{h\\".=0(R0.M/a"i}8701f3aec8cf30fc31e3f29d595d99ceaf1c07d6^s_Pm>8(?UYlts{4W0KVF)֏-ڗ*0EҺ(p p>>T?Dd . L  %4R|R  R R  R R RXRRR   (8 A9A:14A> FG,RHtRIRXY,\tR]R^b,cd2e7f<l>uPRv wRxRy z4Cyast2-network3.1.1081.2.8555.0.PTF.916376YaST2 - Network ConfigurationThis package contains the YaST2 component for network configuration.UYsheep17 SUSE Linux Enterprise PTFSUSE LINUX Products GmbH, Nuernberg, GermanyGPL-2.0http://bugs.opensuse.orgSystem/YaSTlinuxx86_64# This fixes the files that were touched when #24842 was in effect. # #42990: shut up when no wlan files are there. shopt -s nullglob files=`echo /etc/sysconfig/network/ifcfg-wlan*` if [ -n "$files" ]; then /bin/chown root:root $files /bin/chmod 0600 $files fio! z `9Quz_? 3 ;} +;RE&'J1-R~ (B" Kf]6=gJt.]H\+ DZA"7 5X:+/*p:T%wi1F큤A큤A큤A큤A큤A큤A큤A큤T7vT7vT7vT7vT7vUYT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vUYT7vT7vT7vUYT7vUYT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vUYT7vT7vT7vUYT7vT7vT7vT7vT7vUYT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vT7vUYUYUYUYT7u67a70bc721638bd4b341c04f9f99c88f2b5df5295a7679af01e5c85eb74a19d00726dc40e27f5ae7fc7e5d0721f8fa3b311d720bb466f7bfbadbc4480c1d485b9d0cb0fb3b590d8366a8086787cad5acb4cbc23fa68e73415062e9e594ea72f57786325cbf86db6db0b99df3f41051c880367a0a9f6c7276f89767c2601a837460e40de9abb561c0f87c63d0e65f7123f9afd500df398f33ca7c01d4fc02bc0c856a77dc5afa283e33fcb6f5eb1510a084e09e63557d0fd02f9f21b35ad12929890ea98a006e7b7d544ddae282352d30d542c8d3f4cbf174081e25a45ecec605b9a8d45feb9cbc465cc2c301c3292f529c7b958bfe80859202e4cad338c7a171fa1376830ce80213f67390d094fc0d0006aa06ada8bfafbe4818da4ebb697455f811fb72c37775521634e167f298fc6749ff53b10ad4ffb4c91c715ae171f2fb3181c91a194a9576be16076d943a9ba659914389dde1b6e484c6b70d730603b8a0f86638576a4b4fc07bffccab55d132ff784f5939830c89a933a6adecb5e29a572c818663138a21876ef6ff62135cdd14fbecb07f96114d5028ba98448afcc4fdbe2ad4953a8ec8b31bee219a7a375a1c78e134ec807dee6921a0739df75639168c3c5826ef18fd4daa5fc6f9b7f9187f5e2382737a882931366ba54f6b07ed6cb360f56e12874d67665fa7e8e59201fdb9b06e5281c0d8044c78ab2f301a692dcca66d610c0454d9dfd850085cd2670115ab3cccf3257b9cd527277500f0c498f729424c40a5e3fd529f4f0d2919a7141433a1ba02edfd052787e33e4a1aa0df7cfb5c2f4e2416a00fa092f8bc0e7d0c04acebd01e7ba68b6d9730704e4bbdda216ffce5e9cf3b89542fada5c9c5dcb04dd95ff5543d8ab760430a8aebdecdb6dea0841763789fc9a0428866fd6da4ca355ea3b22311151f531de20c6eba86e61e2cc7e4ef98d5b74fd453c1a9f638c685b4e7a2c53fe16c450b854f74083cce713244da440d55a934ea5021cdabdfeaf31e27fc09ff31a6269c90a1fe7d09fa37ffb6cc6d96eb90fc5a0c145a7d22f3618c47ed89667ec12d610f4461c99be58c6af789ad653f321b30c552e3e38c5d6fe9852710b8a00358cf14ca5c29ac4889917f2e6799a7faabead70911e9a6afe63b3fac6411dc5f26e5f3f3b42a64c3838df0def68a996571ae4d46a8973b54d6a9a9fb815117eaab56d11456c979ad638f97f0a936a8702d15d83c2f76c8f364a9f46c519f60262a6209c11db1b7567b872a6dfcd34921bf040c8f169bd929f511de9c7fdf33c58035c1429f986c0bb98abb14f06c83f73489d50778238299bea18bdf9c3a04a909c3048dc4298b7e520a9dbea6648f879cfd51b54a921cfe2ffdfed11b34a735cf2fde8b08ca1bbc3ff1e5646e54cda4709aa760249b972956c717f4fefe704492d67710848612b75f6a12e12f4b1d12670e5fdb0dde3222b97cd97c0160bb3de4b7bb67e5a007c93b274c467d2399b86ca605df621e8851e1c310fcd64940f4763de9443c8a9af2bc3595ed88c8d89c14859ce95166d14a6021a3701b07823db64460037730482fd120d55554436d7245771c572ec52ecc6fce8ec9e4552971b6f8f80402b5f6e6c68b432d2b181113807c0c84fd6badc0181d15b94ee97e74b8c855b81c06adb234ee4d69f5fce4486a80fdaf4a4263rootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootyast2-network-3.1.108-1.2.8555.0.PTF.916376.src.rpmapplication()application(YaST2/host.desktop)application(YaST2/lan.desktop)application(YaST2/remote.desktop)perl(YaPI::NETWORK)yast2-networkyast2-network(x86-64) @   /bin/bash/bin/rm/usr/bin/perlrpmlib(CompressedFileNames)rpmlib(PayloadFilesHavePrefix)sysconfigyast2yast2-country-datayast2-packageryast2-ruby-bindingsyast2-storagerpmlib(PayloadIsLzma)3.0.4-14.0-10.80.03.1.108.42.16.33.1.471.0.02.21.114.4.6-1yast2-core2.10.64.11.2UY@T7@T7@T6xT2@T*@T*@T$T!`TwTwT&@T@T@T @T TT@TTT@SS@S%@S0S@SS@S@SSS@SS@SSj@S@SuSuSہ@Sہ@SR@SǺS@SSh@SsSS9@SDSSrSrS,S8@SuSuShShShSg}@S^BSZN@SO@SO@SKS>S>S;S;S;S9XS5d@S4S1oS,)S)S&S%@S L@S@SS@Sz@Sz@Sz@S(S(S @SSSR@RRR@R>Ra@Rx@RΏ@RRRR0@R;R@R@R{RpRfhR^RB@R:@R9R0[@R' RRC@R@RQ@QY@QQ5Q5QQQJQ@QU@Q@Qq1Qg@QeT@QZ@QLGQLGQ5@Q/FQ.P-PP@PPrP@P6@PP)P~Pl(P\VP;a@P2&Pw@PP@O@O!OOr@O OtNO`@OWMON@OKp@OF*@O'O@O@O@O@N{#@N{#@NyNw.N`@N^"@NK@NENC@N;@N98@N)f@N)f@N)f@N(N MM@M@MZjM4/@M9ME@M PL@L@L@Lr@L L@LNL@LLMLX@LmL[@LRLQm@LN@LMxL!@L K^Kj@K/K/K;@K@KKEKEKQ@K\K\KKKK@K@KrK@KKKqKqN@KoK`*KTM@KPXKO@KMK(K@K@K@K @K K K y@KK3@JJ@J@JUJ@J@J@JlJ@JJ@Jݦ@Jݦ@JęJJ_@J$J@J;JJJJ@JJJu@J@J@JF@JF@JF@JF@JQJS8JHJD@JCfJB@J;}J#J#J|JMJ III@IX@I@I@IܑIIԨIԨIn@In@I@I@I@I@I?@I@IIIIIII@I@rsassu@suse.deschubi@suse.delocilka@suse.comancor@suse.commfilka@suse.comancor@suse.commfilka@suse.commfilka@suse.commfilka@suse.commvidner@suse.comlocilka@suse.comlocilka@suse.commfilka@suse.comancor@suse.commvidner@suse.commfilka@suse.comlocilka@suse.commvidner@suse.commfilka@suse.comancor@suse.comlslezak@suse.czmfilka@suse.commfilka@suse.comlocilka@suse.comlocilka@suse.comsnwint@suse.demfilka@suse.comjsrain@suse.czmfilka@suse.comlslezak@suse.czmvidner@suse.comlocilka@suse.commvidner@suse.comschubi@suse.demfilka@suse.commfilka@suse.comancor@suse.comancor@suse.comlocilka@suse.comsnwint@suse.deschubi@suse.demfilka@suse.comschubi@suse.demfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.comvmoravec@suse.commfilka@suse.comlocilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.comjreidinger@suse.commfilka@suse.comjreidinger@suse.comjreidinger@suse.comlocilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.comlocilka@suse.commvidner@suse.commvidner@suse.comjreidinger@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.comsnwint@suse.desnwint@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.comjreidinger@suse.comjreidinger@suse.comjreidinger@suse.comlslezak@suse.czjreidinger@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.comlslezak@suse.czmfilka@suse.commfilka@suse.commfilka@suse.comjreidinger@suse.comjreidinger@suse.commfilka@suse.commfilka@suse.comyast-devel@opensuse.orglocilka@suse.commfilka@suse.commfilka@suse.comlslezak@suse.czmfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commvidner@suse.czmfilka@suse.commvidner@suse.czmfilka@suse.comlocilka@suse.commfilka@suse.commfilka@suse.comlocilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.commfilka@suse.comjsuchome@suse.czmfilka@suse.commfilka@suse.commfilka@suse.commkubecek@suse.czmfilka@suse.commfilka@suse.commfilka@suse.comug@suse.demvidner@suse.czmvidner@suse.czjsuchome@suse.czmvidner@suse.czmvidner@suse.czjsuchome@suse.czmfilka@suse.commfilka@suse.commvidner@suse.czmvidner@suse.czmvidner@suse.czmvidner@suse.czmvidner@suse.czvisnov@suse.czlslezak@suse.czlslezak@suse.czvisnov@suse.czmvidner@suse.czmvidner@suse.czmvidner@suse.czmvidner@suse.czmvidner@suse.cztgoettlicher@suse.demvidner@suse.czmvidner@suse.czjreidinger@suse.czlocilka@suse.czlocilka@suse.czmvidner@suse.czmvidner@suse.czcoolo@novell.commvidner@suse.czmvidner@suse.czmvidner@novell.commzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.demzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czkmachalkova@novell.commzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czkmachalkova@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czkmachalkova@suse.czmzugec@suse.czkmachalkova@suse.czmzugec@suse.demzugec@suse.czmzugec@suse.czmzugec@suse.czkmachalkova@suse.czmzugec@suse.czmzugec@suse.demzugec@suse.czmzugec@suse.demzugec@suse.czmzugec@suse.czmzugec@suse.demzugec@suse.demzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czkmachalkova@suse.czkmachalkova@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czkmachalkova@suse.czkmachalkova@suse.czmzugec@suse.demzugec@suse.demzugec@suse.dekmachalkova@suse.czmzugec@suse.demzugec@suse.dekmachalkova@suse.czmzugec@suse.demzugec@suse.demzugec@suse.demzugec@suse.dekmachalkova@suse.czkmachalkova@suse.czmzugec@suse.demzugec@suse.czmzugec@suse.czmzugec@suse.czmvidner@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.demzugec@suse.demzugec@suse.demzugec@suse.czmzugec@suse.dekmachalkova@suse.czmzugec@suse.demvidner@suse.czmzugec@suse.dekmachalkova@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czkmachalkova@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.cz- bsc#916376 - proposing iSCSI-related configuration in firewall proposal in first stage if iSCSI is in use- AutoYaST Routing Import: Initialize device list correctly. (bnc#900352) - 3.1.108- Do not set default_route to "no" in auto-configuration in inst-sys, just remove the entry completely (bnc#900466) - 3.1.107- Improved help text in "global options" (bnc#892678) - 3.1.106- bnc#889287 - during autoconfiguration at s390 use linuxrc's OSAHWAddr param for LLADDR when available. - 3.1.105- The "change hostname via DHCP" setting is now configurable via control file (bnc#870896). - 3.1.104- bnc#898620 - do not write LLADDR="00:00:00:00:00:00" into ifcfg in z/VM - 3.1.103- bnc#897394, bnc#866250 - device specific routes configuration (ifroute-) is supported - 3.1.102- bnc#892958 - propose STARTMODE=nfsroot when installing to remote device - 3.1.101- Really do not lose the default route when editing an interface (bnc#883836#c15). - 3.1.100- Do not check for / install packages in inst-sys (bnc#888130) - 3.1.99- Remote administration adjusted to warn users that they need to restart display manager manually if it's needed (bnc#893606) - 3.1.98- bnc#894089 - update udev rules correctly when changing device names for more than one net device - 3.1.97- Changed the remote administration module to get the list of required packages from yast2-packager (bnc#896178). - 3.1.96- Use a more flexible rubygem requirement syntax (bnc#895069) - 3.1.95- bnc#894053 - it is not possible to rename a device to a name same as an unconfigured device's one - bnc#895273 - when adding new device, whole name is shown instead of only number. - it is possible to fill in a name which conforms to a new device naming scheme - 3.1.94- Fixed firewall proposal to survive missing SuSEfirewall2 services files for openssh or VNC - if files are missing, services are not handled by the proposal (bnc#894419) - 3.1.93- Test speed-up. - 3.1.92- bnc#886434 - accelerated autoconfiguration at the beginning of installer - 3.1.91- Updated BuildRequires to break cycle introduced in yast2-installation 3.1.114 (which fixes bnc#893501) - 3.1.90- write the proxy credentials from install.inf separately, make it compatible with the proxy module used at installed system (bnc#885957) - 3.1.89- bnc#893638 - handle abort button correctly during installation - 3.1.88- bnc#891517 - do not require ifplugd package for devices with STARTMODE='ifplugd' in ifcfg - 3.1.87- Fixed requesting sshd/firewall packages in case of the default configuration together with minimal installation (bnc#893126) - 3.1.86- Fixed firewall proposal in case of VNC installation: using correct firewall services: vnc-httpd and vnc-server (bnc#892899) - 3.1.85- copy wickedd-nanny status (in /etc/wicked/common.xml) to target - 3.1.84- bnc#887238 - Layer2 availability option is referenced correctly during autoconfiguration - 3.1.83- fixed typo in module name (bnc#891921) - 3.1.82- bnc#841170, fate#316090 - support for filtering broadcoms storage only devices out of device list - 3.1.81- properly convert proxy configuration from install.inf during installation (bnc#885957) - 3.1.80- Fixed network_autoconfiguration_test stubbing on s390 (bnc#883836). - 3.1.79- Reading and adjusting the SuSEfirewall2 configuration has been moved from inst_finish to inst_proposal because AutoYast export can be already requested in inst_proposal (bnc#887406) - 3.1.78- Do not lose default route when editing an interface (bnc#883836). - 3.1.77- Autoyast: If NetworkManager is not available taking wicked although the user has set it explicit. ( with warning Popup ) (bnc#890238) - 3.1.76- bnc#889359 - Re-enable Add button in Overview dialog during installation - 3.1.75- bnc#884517 - fixed proposal when virtual machine proposal is selected - /etc/hosts do not contain incorrect 0.0.0.0 entry - 3.1.74- Avoid confusing firewall proposals by hidding the details (ssh and vnc ports) when the firewall is disabled (bnc#886554). - 3.1.73- Don't propose to enable the firewall if SuSEFirewall is not selected for installation (bnc#881250) - 3.1.72- Using new ServicesProposal library to set the sshd service status for AutoYast export at the end of installation (bnc#887688) - 3.1.71- Use ProxyURL when reading proxy settings from install.inf. - 3.1.70- Do not restart network if the installation has been started via a SSH connection. (bnc#885640) - 3.1.69- bnc#885257 - rephrased message informing on active NetworkManager - 3.1.68- bnc#883718 Taking wicked as default in autoyast installation. - 3.1.67- bnc#878719 - active network service selected properly - 3.1.66- bnc#879617 - fixed generated bridge port configuration - tun device is not allowed as bridge port anymore - 3.1.65- bnc#880167 - fixed internal error when renaming device - bnc#877690 - turned more labels into title style. - 3.1.64- bnc#878719 - handle inactive network service state - allow disabling network service completely - fixed disabling of unconfigureable items when e.g. NetworkManager is used as network service - 3.1.63- bnc#858908 - write hostname into cross platform /etc/hostname instead of SUSE specific /etc/HOSTNAME - 3.1.62- bnc#880754 - fixed internal error when configuring TUN/TAP device - 3.1.61- Fix failing tests due to changes in SystemdService#restart - 3.1.60- bnc#868256 - network service selection turned into combo box - showing only those services that are actually available - 3.1.59- Fixed service name for remote administration (display-manager) including code Rubyfication (bnc#878910) - 3.1.58- bnc#877690 - use title style for labels - 3.1.57- bnc#876848 - network autoconfiguration fixed for kvm guests - 3.1.56- bnc#874178 - fixed help for "Global Options" - 3.1.55- bnc872381 - installer sets target's hostname and hosts properly - 3.1.54- fixed testsuite - adapted to API changes - 3.1.53- bnc#870896 - fixed proposed DNS / Hostname configuration to be same as in SLE-11 - 3.1.52- bnc#867451 - when virtual machine is installed, propose virtual interface configuration - 3.1.51- bnc#872319 - accelerated dhcp automatic configuration which is done during initial phase of installer - 3.1.50- fixed terminology confusion. "Alias name" turned into "IPv4 Address Label". "Alias name" is obsolete since kernel 2.0.0 - 3.1.49- bnc#870406 - fixed assigning device name in ifcfg created during installation - 3.1.48- bnc#873149 - manual network configuration dialog changed to Next / Back dialog - 3.1.47- bnc#868187 - implemented heuristics for setting DHCLIENT_SET_DEFAULT_ROUTE during autoconfiguration in installation - 3.1.46- avoid client redefinition warning (bnc#872089) - 3.1.45- bnc#869199 - fix resolv.conf not getting updated (via NETCONFIG_DNS_POLICY being emptied) - 3.1.44- fix typos in latest change ( found by openqa ) - 3.1.43- split enabling sshd and opening firewall port in installation (bnc#865056) - 3.1.42- Fixed calling logging function in inst_lan (bnc#871091) - 3.1.41- bnc#870622 - opening network configuration dialogue on user's request works - 3.1.40- bnc#869776 - fixed internal error raised when building interface overview - 3.1.39- bnc#869353 - inst_lan can walk back in installer - 3.1.38- bnc#869224 - enlarged nic name input field in "Edit Nic Name" dialogue in ncurses mode - 3.1.37- bnc#868830 - remove device also from LanItems' cache when deleting during automatic configuration in installer - 3.1.36- gh#yast/yast-core#74 - automatic dhcp configuration is unable to clear unused configurations. It blocks starting manual configuration dialog. - 3.1.35- bnc#868436 - fixed internal error at the begining of installation - 3.1.34- bnc#866827, fate#314695 - show a dialog for network configuration when autoconfiguration is unable to proceed - 3.1.33- Fixed Yast Remote to allow enabling vnc-httpd and vnc-server services in firewall (bnc#867377). - 3.1.32- bnc#865707 - use wicked as dhcp client in instsys (by mfilka) - reverted wickedd-dhcp{6,4}, instead try wicked ifreload and delete the config if that didn't work - 3.1.31- Use wickedd-dhcp{6,4} instead of (dropped) dhcpcd-test when setting up DHCP interfaces (bnc#866617) - 3.1.30- fix installation crash - do not mess ruby global namespace - 3.1.29- bnc#864614 - exclude already configured devices from dhcp candidates when attempting to do an autoconfiguration at the begining of installation - 3.1.28- bnc#866224 - inst_install_inf.rb is present in instsys - 3.1.27- bnc#865199 - netmask generated corectly when handling static net configuration provided by install.inf - 3.1.26- fixed internal error in save_network client - 3.1.25- bnc#859213 - generate install.inf based netconfig at the begining of installation. Generated configuration is copied to target at the end of installation - 3.1.24- copy also ifroute-* files into installed system - 3.1.23- fix merging /etc/sysconfig/network/config, values with spaces broke the syntax and made wicked crash (bnc#864510) - 3.1.22- bnc#862378 - improved earlier fix. It handles virtual devices without configuration better now. - 3.1.21- bnc#863952 - removed remaining references to DSL, ISDN, Modem modules from network launcher - 3.1.20- bnc#862378 - Device name set according hwinfo when ifcfg["NAME"] is empty - 3.1.19- fate#315501 - IPoIB mode configuration in YaST - 3.1.18- bnc#859903 - tightvnc package is not required when enabling remote administration - 3.1.17- bnc#861078 - network configuration created during installation is copied to target - 3.1.16- bnc#859181 - dropped code related to smpppd (ifcfg: USERCONTROL) - 3.1.15- bnc#846950 - change in resolv conf policy detected and stored properly - 3.1.14- Don't show the Add button for network devices during the installation: configuring undetected ones is considered an advanced operation that should be postponed to the installed system. - 3.1.13- wicked support - initial implementation - adapted to API changes in yast2 3.0.9 - 3.1.12- fate#308681 - dropped ISDN configuration support - fate#308680 - dropped DSL configuration support - fate#313104 - dropped modem configuration support - dropped parts were moved into newly created package yast2-dialup which is available at github - 3.1.11- fix DHCP capable cards client to not break installation - 3.1.10- fix distribution of client for detection DHCP capable cards - 3.1.9- add installation client that detect all DHCP capable network cards and set it up - 3.1.8- removed automatic 2nd stage support (the 2nd stage has been dropped completely) (FATE#314695) - 3.1.7- Fix testsuite to the latest changes in NetworkInterfaces - 3.1.6- bnc#843646 - firewall can be enabled/disabled during installation - 3.1.5- bnc#847783 - do not offer ifplugd devices as bridge port candidate - 3.1.4- adapt to removal of NetworkInterfaces.HasAliases from yast2 since 3.1.2 - 3.1.3- bnc#845534 - fixed internal error which appeared when attempting to add an alias - 3.1.2- bnc#572202 - separated IP forwarding enablement for IPv4 and IPv6 because IPv6 forwarding disables IPv6 stateless address autoconfiguration (SLAAC) - 3.1.1- do not use *.spec.in template, use *.spec file with RPM macros instead - 3.1.0- Refactoring - removing ycp artifacts - separated dialog for editing nic name into own class - 3.0.7- bnc#578787 - LanItems provides API for querying all available netcard devices - 3.0.6- bnc#837793 - Network Card details / General: show the assigned firewall zone; previously "Automatically Assigned Zone" would be always shown. - 3.0.5- do not overwrite curl log for addon (BNC#632917) - 3.0.4- fix suggest for KDE network manager applet (BNC#747808) - 3.0.3- Ported changes from SLE branch (bnc#831833) - bnc#769081 - do not remove line from /etc/hosts if it contains two spaces between hostnames - bnc#810539 - fixed issue in YaPI which caused a syntax warning - fate#308978 - do not write network config files if not changed - 3.0.2- bnc#803616 - do not disable firewall proposal in second stage - 3.0.1- converted from YCP to Ruby by YCP Killer (https://github.com/yast/ycp-killer) - version 3.0.0- Fixed detection whether interface is handled by firewall and thus fixed accidental stopping and disabling the firewall services. Added detection of interfaces handled by implicit assignment with 'any' in firewall zone. (bnc#829556) - 2.25.8- bnc#695262 - fixed write sequence to enable device renaming. -2.25.7- adopted to new device type detection API provided by yast2 - minor improvement in Modem module - no country is selected when a custom provider is selected - 2.25.6- move an include statement to the top level (needed for Ruby translation)- bnc#808490 - set securitytypes=none for Xvnc when remote administration is allowed. Required due to different default value in currently used Xvnc implementation (TigerVNC). - Remote Administration module opens ports in firewall when requested by user - 2.25.5- bnc#821427 - fixed biosdevname renaming in case of buggy SMBIOS. - original patch provided by Martin Wilck (martin.wilck@ts.fujitsu.com) - 2.25.4- bnc#813232 - extended fix from 2.25.2. DNS module is able to handle FQDN now. - 2.25.3- bnc#817943 - do not propose bridge devices when a virtualization is installed on s390 - 2.25.2- bnc#813232 - fixed parsing hostname in DNS module. Number from begining is not stripped anymore. - 2.25.1- bnc#793367 - Added loading tun/tap settings from netconfig. - 2.25.0- Fix detection of properly configured LCS and CTC devices (bnc#741071#c20) - Only save LLADDR (persistent MAC) for some s390 card types, avoiding softsetup, also after the installation (bnc#728611). - Ensure persistent interface names by retriggering udev events after we have written an incomplete 70-persistent-net.rules (bnc#721520).- Changed way how list of slave candidates for bridge is created - Improved conditions for slave candidates list creation. Devices enslaved in a bond are excluded.- bnc#813835 - Crash when attempting to edit unconfigured interface.- bnc#719881 - S390: only L2 capable devices can be enslaved into bond.- bnc#747844 - Extended bugfix. Initializes reasonable defaults for s390 specific variables when configuring device for the first time. Previous fix handled switching between interfaces only. - bnc#792985 - eth not set up during installation - previous bugfix was not working- Ported several fixes in YaPI: - fate#313309 - support for bonding and bridging (WebYaST) - bnc#790219 - fixed writting ifcfg for bonding through YaPI. More than two interfaces can be added into bond device. - YaPI: drop caches when reading network interfaces, make it stateless (bnc#790219#c33) - lslezak@suse.cz - bnc#790202 - workaround for forcing reconfiguration of bridge slaves - 2.24.17- Adopted to restart / reload using NetworkService instead Service, that has been changed to use network.service alias link installed by NetworkManager.service while "systemctl enable" and obsoletes the NETWORKMANAGER=yes/no variable in /etc/sysconfig/network/config (bnc#764055,bnc#764336,bnc#798348, by mt@suse.com) - Requires sysconfig >= 0.80.0 and yast2 >= 2.23.20 - 2.24.16- fate#313548, fate#309055 and fate#100011 in general. Removed SUSEconfig calls for postfix and sendmail. Also related to bnc#786665 - 2.24.15- AutoYaST: write /etc/hosts even if keep_install_network=true (bnc#796580) - AutoYaST: If keep_install_network=true and dns/write_hostname is unspecified, use the product default (which is false on SLES), thus not writing 127.0.0.2 to /etc/hosts. (bnc#796580) (fixing a regression introduced in 2.22.1) - 2.24.14- fate#312733 - nameservers editing supported via CLI - 2.24.13- Added support for VNC in network/firewall configuration in first stage of installation (bnc#795929) - 2.24.12- s390 - bnc#719881 - only devices with L2 support can be enslaved in bond - improved filtering of devices available for enslaving. - able to load qeth config from system (layer2 support and other qeth attributes used to be lost once qeth device was configured) - 2.24.11- fate#312733 - Added edit action for DNS CLI mode. - Hostname editing supported. - 2.24.10- Testsuites adapted to switching Service module to systemd (yast2-2.23.15) - Testsuite adapted to merging SuSEfirewall2_* scripts into one (yast2-2.23.17) - 2.24.9- confirmed license- Code cleanup: - removed obsolete and empty function ScreenName. - removed reference to CVS/SVN feature ($Id$)- Fixed testsuite. tests/include.ycp, tests/udev.ycp failed when missing /etc/sysconfig/console.- initialize s390 specific device variables when switching interfaces - s390 code cleanup. chan_mode variable is not shared between different device types anymore. qeth_macaddress is set according sysconfig now. - bnc#747844 - 2.24.8- Refactoring editing interface names. - Added nic name checking according bnc#784952 - 2.24.7- Autoenabling of all interfaces allowed during installation only. - fixes bnc#782283 - 2.24.6- let curl follow redirects when downloading release notes package (bnc#781330) - 2.24.5- bnc#752464 - leak wireless passwords - 2.24.4- bnc#754940 - missing help in hw dialog when adding new device. - code cleanup - 2.24.3- bnc#766217 - Gateway IP address is invalid added default '-' for Genmask and gateway fields - 2.24.2- use "ip addr" and "ip route" for network test logs rather than ifconfig and route- bnc#767946 - configuring dummy netwok interface error disable '-o' option for dummy module hwcfg widget doesn't exist - 2.24.1- fate#312287 - hotpluging of bonding slaves - updated UI - added columns into net device overview - updated testsuite - 2.24.0- bnc#750325 - allow apostrophe in ESSID - 2.23.0- keep_install_network added to rnc file (bnc#758529)- Fixed a dead reference to proxy code; moved a forgotten file. - 2.22.7- Moved proxy client config to a new package yast2-proxy.rpm - 2.22.6- merged proofread texts- No need to chmod /etc/sysconfig/network/providers after placing files there (which opens up a race): filesystem.rpm and permissions.rpm have the correct permissions for it already (bnc#713661)- Sleep between writing udev rules and ifcfgs so that rcnetwork reload works (bnc#749365) - 2.22.5- internet test: "Abort > Continue Installation" should not abort (bnc#748251)- installer's proxy config stored on installed system - bnc#693640 - 2.22.4- added popup with security question when proxy url contains password (http://usr:pass@proxy) - bnc 694582 - fixed testsuite - 2.22.3- Simplified NetworkStorage::isDiskOnNetwork, thx locilka (bnc#726057#c12)- Fixed broken autoyast in general (bnc#742855) and in case with keep_install_network without dns without routing (bnc#712864). - Filter out more Chelsio devices, by PCI id (bnc#711432#c83) - 2.22.2- AY keep_install_network: merge dns and routing from linuxrc item by item, not just in bulk (bnc#712864). - Clarified the label for BOOTPROTO=none: "No Link and IP Setup ( Bonding Slaves)" (bnc#737333). - 2.22.1- skip USB NICs during bridge proposal (bnc#710098) - do not inherit for new bridge port devices PREFIXLEN (bnc#735109) - do not inherit for bridge device ETHTOOLS_OPTIONS (bnc#735109) - Filter out Chelsio devices without device file (bnc#711432) - Only save LLADDR (persistent MAC) for some s390 card types (bnc#658708). - 2.22.0- Moved NetworkStorage from yast2.rpm to yast2-network.rpm (bnc#726057) - Use Storage::IsDeviceOnNetwork instead of trying to do it ourselves, wrong (bnc#726057).- show module name in window title - 2.21.8- updated Network_YaPI test (adapted to systemd and sysctl changes) - 2.21.7- Routing.ycp - use /etc/sysctl.conf file instead of deprecated /etc/sysconfig/sysctl, adapted testsuite- Remove unneeded dialog and dependency on Wizard_hw - 2.21.6- Don't switch bonding interfaces to DHCP when editing them (bnc#711962). - Don't say that a NIC without an address has no encryption (bnc#711962).- More YaPI improvements from Justus Winter: - Write: default BOOTPROTO to 'static', allow omitting IPADDR - Allow manipulating STARTMODE, don't assume 'auto'. - Handle ETHERDEVICE and VLAN_ID. - 2.21.5- Sort of enable arbitrary interface names. Fix skipping the internet test, release notes, registration, with biosdevname (bnc#712232). - 2.21.4- Integrated patches from Justus Winter: - Make MTU configurable using YaPI. - YaPI (re)Read: Don't append a slash to ipaddr like '1.2.3.4/8/'. - 2.21.3- Omit unnecessary INTERFACETYPE declaration in ifcfg (bnc#711762) This broke the VM-proposed bridge because it copied ifcfg-ethN's INTERFACETYPE=eth (bnc#704999). - 2.21.2- fixed .desktop file (bnc #681249)- inst_hostname: do write the randomized /etc/HOSTNAME if left unchanged by user (bnc#695803). - Allow empty domain in autoyast profiles again (bnc#677471). - 2.21.1- Support biosdevname=1 NIC naming scheme: don't write mac-based udev rules (FATE#311332). - STARMODE='nfsroot' also for FCoE (FATE#306855). - Show NIC device names for unconfigured NICs (FATE#311335). - Fixed configuring multiple interfaces with the same VLAN (FATE#311380, FATE#309240, bnc#572747, bnc#588588) - Make the hostname resolvable to our static address coming from Linuxrc (bnc#664929). - 2.21.0- Do not enable WIRELESS_POWER by default, some APs are broken (FATE#309255).- Obsoleted X-KDE-SubstituteUID replaced with xdg-su in Exec in desktop files (bnc#540627)- Fixed Firewall and SSH proposal to be still able to adjust SSH independently on the firewall status (bnc#537980). - 2.20.13- Proofread texts for translation (by A.Turrini, bnc#703190).- WebYaST: also update /etc/hosts, for hostname -f (bnc#694283#c8) - 2.20.12- Switch is not used, so don't require it (removed from perl 5.13.1)- AutoYaST: networking/start_immediately was ignored (bnc#655571, bnc#675844) - 2.20.11- DSL: linux-atm-lib.rpm was renamed to libatm1.rpm (bnc#668586)- fixed progress messages being out of sync when writing LAN config (reported by bmwiedemann)- ifcfg-ethX.Y style config files for VLAN(fate#309240) - 2.20.10- fate#306855: FCoE boot support - 2.20.9- L3: don't propose bridge for vbox (bnc#648044) - 2.20.8- L3: AY Layer2 support - fixed portname option (bnc#573607) - 2.20.7- removed obsolete 50-ipv6.conf (bnc#632530) - 2.20.6- added search keywords (bnc#641922) - 2.20.5- accept unconfigured + BOOTPROTO=none bondslaves (bnc#652987) - 2.20.4- correctly apply BusID based udev rules in AY (bnc#648270) - 2.20.3- TP-L3: if possible, for temporary installation network use same device with same MAC address, even if devicename changed (bnc#648270) - 2.20.2- support for ordering in bonding slaves (bnc#640611) - 2.20.1- AY: when no network profile, don't change network configuration (bnc#649494) - 2.19.41- added "No IP" option for bridge devices (bnc#648620) - 2.19.40- added support for IFPLUGD_PRIORITY (bnc#586376) - 2.19.39- AY: added IPv6 option (bnc#633310) - 2.19.38- warn user about nm-applet/knetworkmanager (bnc#627273) - 2.19.37- Proxy: correctly enclose user:password into quotes (bnc#616695) - 2.19.36- ISDN: removed deprecated documentation URL (bnc#590742)- fixed typo (bnc#626280)- YaPI: allow dhcp + static hostname (bnc#624655) - 2.19.35- L3: allow unconfigured devices for VLAN (bnc#625103) - 2.19.34- L3: AY Layer2 support (bnc#573607) - 2.19.33- updated firmware dependency list (bnc#608979) - 2.19.32- fixed duplicate items issue in UI (bnc#584842) - 2.19.31- make add/edit route popup consistent (bnc#583136) - 2.19.30- updated documentation URL (bnc#590742) - 2.19.29- additional addresses for bridge (bnc#590160) - 2.19.28- improved help text (bnc#580039) - 2.19.27- don't write 79-yast2-drivers.rules if empty (bnc#601723) - 2.19.26- filter out some iucv devices (bnc#585363) - 2.19.25- hide autoreconnect from UI (bnc#558788) - 2.19.24- CLI: respect netmask argument (bnc#584406) - 2.19.23- Rollup patch with several Code11 bugfixes: - Include in cloned data (bnc#576495) - Don't check for presence of static IPs when deciding whether to append 127.0.0.2 line to /etc/hosts - Pre-fill hostname field with global hostname in static IP dialog - Warn if no hostname is specified for static IP (all bnc#583786) - In [auto]installation, prefer hostname from install.inf. Convert to FQDN if it is an IP address (bnc#556613, bnc#502715)- allow vlan on top of bonding device (bnc#591835) - 2.19.22- proxy: "/" character validation (bnc#566350) - 2.19.21- added exception to filter out virtio semi-device (bnc#585506) - 2.19.20- remove aliases from automatically bridged device (bnc#590167) - 2.19.19- store hostname from installation proposal dialog (bnc#588938) - 2.19.18- fixed description for IP/netmask (bnc#588590) - 2.19.17- L3: in case of type different from config. name write INTERFACETYPE option (bnc#585458) - 2.19.16- during 1st installation stage write correctly filename for ifcfg file (bnc#588586) - 2.19.15- L3: update device name via which is system installed by AY (bnc#578760) - 2.19.14- NetHwDetection: use blacklist (bnc#580729) - 2.19.13- added fix for saving MAC address to ifcfg (bnc#578689) - 2.19.12- mark string for translation (bnc#580019)- ipv6: enable/disable both module and sysctl method (bnc#561611) - 2.19.11- correctly setup iucv devices (bnc#575950) - 2.19.10- Evaluate modified flag of all net components (not only LanItems), so that change in any of them triggers Write (bnc#439235) - Write DNS data along with other network settings in lan_proposal, not separately in inst_hostname (related to bnc#556613) - Renamed "Write hostname to /etc/hosts" and updated related help text (bnc#510228, bnc#469752) - 2.19.9- fixed remote.desktop file (Categories) - 2.19.8- allow bridge as ETHERDEVICE for VLAN (bnc#569970) - 2.19.7- support for BOOTPROTO=ibft option (bnc#551380) - 2.19.6- Adjusted .desktop file(s) to wrap /sbin/yast2/ calls in xdg-su where root privileges are needed, removed X-KDE-SubstituteUID key (bnc#540627)- DNS: warn user to not use .local as domain name (bnc#564317) - 2.19.5- With enabled SuSEFirewall, set SuSEFirewall's FW_ROUTE variable when enabling/disabling IP forwarding in routing settings. This avoids overwriting sysctl variables by SuSEFirewall init scripts (bnc#474304) - Show proxy relogin msg only in Mode::normal (bnc#543469)- ISDN: fixed creating configuration with incorrect name (bnc#534504) - 2.19.4- fixed prefixlen validation - 2.19.3- disable ipv6 (bnc#558020) - 2.19.2- support for WIRELESS_AP_SCANMODE option (bnc#551618) - 2.19.1Cumulative patch with SLE11 SP1 bugfixes and features - Introduced option to AY profile to allow overriding product default write_hostname_to_hosts (FaTE#305281) - DNS Import: read product default write_hostname (bnc#500568) and hostname/domain from the system (generate random if needed - bnc#502715) - Read defaults and propose values in inst_hostname only once (bnc#438124) - Do not append 127.0.0.2 line when it is not needed (bnc#469752) - Validate no proxy domains (for FaTE#302377) - 2.19.0- exclude nfsroot devices from bridged slaves (bnc#557688) - 2.18.63- fixed problem with not matching udev rule (bnc#551310) - 2.18.62- support for BOOTPROTO=ibft (bnc#547569) - 2.18.61- adapt interfaces into bridge with 0.0.0.0/32 (bnc#547327) - 2.18.60- install broadcom for b43-pci-bridge driver (bnc#412248) - 2.18.59- replace kinternet dependency with qinternet (bnc#549912) - 2.18.58- allow VLAN into bridge (bnc#530109) - 2.18.57- allow physical identification only when edit device- adapted test for xen bridged network (bnc#553794) - 2.18.56- lan module in 1st stage (FaTE#303069) - 2.18.55- support for ETHTOOL_OPTIONS (FaTE#305352) - 2.18.54- physical identification for NIC cards (FaTE#307164) - 2.18.53- show BusID in lan description (FaTE#307165) - 2.18.52- missing space in translated text (bnc#545074)- for wlan require iw instead of wireless-tools (bnc#539669) - 2.18.51- YaPI: return map with return code and error message in Write function + testsuite - 2.18.50- Display simple firewall & SSH config dialog after clicking on 'Firewall' headline in initial proposal (bnc#539289) - 2.18.49- Propose opening SSH port in firewall in SSH installation (bnc#535206) - Enable SSH service if SSH port in firewall is to be opened (bnc#537980)- replace STARTMODE='onboot' (which is deprecated) with 'auto' (bnc#533818) - 2.18.48- YaPI: write all values (included interfaces) - 2.18.47- YaPI: possible to remove default GW (bnc#538397) - 2.18.46- Fixed packaging (YaPI stuff goes to @moduledir@)- Disable firewall_proposal AC step (or equivalent non-automatic subproposal) if it has been configured in 1st stage already (FaTE #303859 and bnc#534862) - 2.18.45- YaPI: read interfaces from system (not only fake data)- YaPI: added testsuite- YaPI: real data for dns, routing- Write configuration only in firewall_stage1_finish, do not try to start/stop SuSEFirewall2 service- YaPI: read real data for hostname - 2.18.44- initial commit for DBus YaPI - 2.18.43- Do a proper reload of network service on writing (standalone) DNS configuration (removed *-all-dhcp-clients workaround - bnc#528937)- fixed help text (bnc#530345)- removed old help text (bnc#513146)- L3: manually created bridge over bonding (bnc#528074) - 2.18.42- L3: proposed bridge over bonding (bnc#528076) - 2.18.41- Simple 'network' configuration in 1st stage of installation (a proposal - turn firewall&ssh on/off) (FaTE #303859) - 2.18.40- Editing /etc/hosts via host module adjusted to cope with hosts with empty alias (do not replace those with 'nil') (bnc#513033)- linuxrc DHCPTimeout -> sysconfig/network.WAIT_FOR_INTERFACES (bnc#396824) - 2.18.39- removed broadcast option from dhcp settings (bnc#513146) - 2.18.38- for lcs and ctc offer only 2 CHAN_IDS (bnc#515492) - 2.18.37- default option miimon=100 for bonding (bnc#404449) - 2.18.36- Using autodocs-ycp.ami, which contains a fix for automake 1.11.- new variable Internet::test to store status of test (bnc#506721) - 2.18.35- fixed buildtest- fixed: missing space in lan dialog (bnc#506732) - 2.18.34- fixed: modem configuration syntax error (bnc#497459) - 2.18.33- support for lcs::s390 devices (bnc#363978) - 2.18.32- fixed: after autoinstall, dns and routing info are lost (bnc#498993) - 2.18.31- correctly read/write module options (bnc#487656) - 2.18.30- improved "device renaming" functionality (bnc#447480) and (bnc#461179) - 2.18.29- don't propose bridged network for WLAN devices (bnc#450670) - 2.18.28- fixed netmask/prefixlen validation and correct write (bnc#493222) - 2.18.27- Make proxy configuration autoyast-clonable (bnc#492786)- IPv6 default gateway (bnc#458891) - added "route via device" for default gw - 2.18.26- Dropped ag_xauth (.xauth.key), superseded since 2005 by $XAUTHLOCALHOSTNAME (bnc#482223).- fixed additional addresses with bonding (bnc#420074) - 2.18.25- Show "Really abort" pop-up dialog only when data are modified (in proxy - bnc#460172 and hosts - bnc#460156) - Allow '/' character in NO_PROXY (subnet definition - bnc#490661)- show PopupAbort only when data modified (bnc#458324) - 2.18.24- don't allow to use networkmanager with bridged proposal (bnc#487419) - 2.18.23- tun/tap device - don't remove default gw (bnc#483233) - 2.18.22- improved WPA items description (bnc#481509)- Do not show the proxy relogin message in installation (both stages) (bnc#486937)- use 50-ipv6.conf instead of modprobe.d/ipv6 file (bnc#485947) - 2.18.21- fixed firewall checkbox status for dsl and modem (bnc#404359) - 2.18.20- for s390 propose CHAN_IDS values (bnc#445339) - 2.18.19- 1st stage - correctly write ifcfg for ipv6 only (bnc#477917) - 2.18.18- improve address dialog for vlan (bnc#376063) - allow all netcard devices except vlan, bridge and bond to be etherdevice for vlan - 2.18.17- in DSL module list also pppoe devices (bnc#449982) - 2.18.16- fixed testsuite for Routing- apply forwarding on both IPv4 and IPv6 (bnc#479370) - 2.18.15- fixed networking.rnc (bnc#480466) - 2.18.14- added help text (bnc#471253)- Added omitted handling of `hardware symbol in s390 device workflow (bnc#476490) - store HW address only for L2 qeth devices (bnc #479481) - do not store HW address into sysconfig on hsi and some qeth interfaces (bnc #479481) - 2.18.13/bin/bashsheep17 1431953600  !"#$%&'()*+,-./012345789:;<=>?@ABCDEFGHIJKLMNOPQRS1.0.03.1.108-1.2.8555.0.PTF.9163763.1.108-1.2.8555.0.PTF.916376 cut-messagesag_udev_persistentdns.rbdns_auto.rbfirewall_stage1_finish.rbfirewall_stage1_proposal.rbhost.rbhost_auto.rbinst_ask_net_test.rbinst_do_net_test.rbinst_install_inf.rbinst_lan.rbinst_netprobe.rbinst_setup_dhcp.rblan.rblan_auto.rbnetwork.rbremote.rbremote_proposal.rbrouting.rbrouting_auto.rbsave_network.rbnetworkcomplex.rbdevices.rbhardware.rbinstallationdialogs.rblanaddress.rbbridge.rbcards.rbcmdline.rbcomplex.rbdhcp.rbhardware.rbhelp.rbs390.rbudev.rbvirtual.rbwireless.rbwizards.rbremotedialogs.rbroutines.rbruntime.rbservicesdns.rbhost.rbrouting.rbsummary.rbwidgets.rbnetworkconfirm_virt_proposal.rbedit_nic_name.rbinstall_inf_convertor.rbnetwork_autoconfiguration.rbDNS.rbHost.rbInternetDevices.rbLan.rbLanItems.rbLanUdevAuto.rbNetHwDetection.rbNetwork.rbNetworkStorage.rbRemote.rbRouting.rbSuSEFirewall4Network.rbNETWORK.pmhost.rncnetworking.rnccfg_dhcp.scrcfg_network.scrcfg_udev_persistent.scretc_hosts.scrroutes.scrhost.desktoplan.desktopremote.desktopyast2-networkCOPYING/usr/lib/YaST2/bin//usr/lib/YaST2/servers_non_y2//usr/share/YaST2/clients//usr/share/YaST2/include//usr/share/YaST2/include/network//usr/share/YaST2/include/network/installation//usr/share/YaST2/include/network/lan//usr/share/YaST2/include/network/remote//usr/share/YaST2/include/network/services//usr/share/YaST2/lib//usr/share/YaST2/lib/network//usr/share/YaST2/modules//usr/share/YaST2/modules/YaPI//usr/share/YaST2/schema/autoyast/rnc//usr/share/YaST2/scrconf//usr/share/applications/YaST2//usr/share/doc/packages//usr/share/doc/packages/yast2-network/-fmessage-length=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -gobs://build.suse.de/PTF:8555/SUSE_Updates_SLE-SERVER_12_x86_64/a880361b41204c02af1db1fa7aa35d5a-yast2-network.SUSE_SLE-12_GAcpiolzma5x86_64-suse-linuxa /usr/bin/perl -w script, ASCII text executableawk script, ASCII textRuby module source, ASCII textASCII textdirectoryC source, ASCII textASCII text, with very long linesPerl5 module source textPascal source, ASCII textRRPPPPPPPRGfvw .B? ] crv9u_'r!W +b$WcWA֤y^bygg1Yׁj^,Ms2mQ=!&?,MRCPb.t[e;˻/*nɫ_8^ضaK[/s,z-QNG!KgŬdJfFc֫_z4zTVu׷1`AlXjhT!k_P/[16.t4N'Γ̅F9 )}_{8ӎaMK#/t,٢lQڝ|GuOF:q!'Va6DJV5I"׆UZ~h|СZ\?g,SQ:j.|(ƦJӡFZd|^3RpurcscDO J]l(^njEJwqR3}7E^X|h9x){DaD9;URW~l,~_w|qZ@I7Kۓf ,ĝm(o{"b4Ok "V@ 6N`͛Y"Q!1Kt;f| ͫ7,cPQ؀xsagOsֆٸͰZje0XgɚjߡNS.zM21b w }!o ˼x+k!RL m3gɼmS}-7|_S}jlm>䧤I0# a!F)($:xm)[fX=k\MNW8+2f aMsT݋Opqa 7ћF"((E3*!xI*-#a [ەVw>TxOSV#3Oƍ?hrt\#yR9P֙Tixo,qLx[j\`^!)@:ik{Zn᎝U_fo Uof ! ;{E

n2I1bs-l|Ea_yiuu a_6З+7Z"adhM#K a~:Q 5!*c-z>S?&ҝUV"4Y 'N.Rz |'b82% 6PtQ|a ]:Xt(5Z/-h?J_p`G&dt QeG Za!^V$Uu7Oӵ,SMWPB&0CPGJB'E om)Nmڨf*110LQf)pKF@ $],+<+%E c/%`r&byQ9¶))Z)U@-ޘcthFVqwHy7^px)YY|cpFƕ_HPUx q޼5Pupi{*u@0Sx_f֦zV"IuAnEz>syԝ-)ۼcˈ`)@˽.$x}a<' Xآi^j`$Sy`tf^:wK䒃gDl^q?gp6{8K0Y5eB+dSPJQTH/ XXͣ'"Ÿ́`Fps^*͇eqO{F1=ΎG~WX3-k>F}d1"!%1Hak,RF׽Ғz14(8 I"4ZiXz5gHcOM;AMOA*ΌSS"=V"= O*\p 'PdƼ-l͉?Seng.Ҹ]_`Pp;ߣm(L'1J izȡ*!%"~7c?u0gz_*M>@'***{6Wߢr=M(PH%V!m 0҃}__4Br#j _&C*U 0apy;/;./&΋ʒ1cR%Ij3j8/6x0\fyq^+Uh\c{Hݔ`]3>p靲~% g1Hb gJṭL ,|cCow*l`k+LB5T–9ɦ=c`۶?M7p:qu=n Xף_i:].Ug-i%_O4h"ӟBtHj`6`Ri+83e!* 1s0+(^gCV.?ʕFH(.-(4(hB*O YvLcG(%.ǞȪ^Ep6gxMyT_]xǩ=dN6 ^S} %nZy0ڃ[µShϖJ(9OɪhV7LG,][ k'@~$ G R:EZqjRdRSb0q3h2?CQ:%r`A1BT:g"Zh``σ:5ᰲ{輽'Cq[1ƂBv`\CN!p5d^~Hh>wKCVBʂfis-4g[R r%E끟h=%`X͌K8zL l cZ tg'(kދXc+ъ9+M%(x ~u0ڨqX/10k QiwR/Ju')\u#\|\׼P0}DLm~!CɑIt 7?ZN` `K@g=^L3bzH‘)X@G˯w9\#4 dGaGTQꏙA$7)!k琘F]!ЖH~䙽 G8as0]ϟeA7(PQ:ýyb;5ڥ+/'a˃ўZlpn:aYr~[ʤ!.W{$|f(kgAS'9tx0g!¤foc̤,i"6#[u=9RYHNX@iu,V(/2@`x0@tD9efXx=tI^\ $YU3rn#пMjx1ϷSVO6g1i$e$8t4_C T|:dn6$T ~>4V~mФ驈>Wt,91FW_x'{_ 5@ۚH2r! er/G ;4بH vX mɨRg(.: YOC 6^}X5:]:X2LIzTG$ /iy2SW6ispɦN.Xf4-r ߧ5cv~/RKN2o a?/}RBa=5<#崆 B;D Zv Ϥ}Z`O i삕zV;]>OP0uvf`'FbQ|S^z \\ _?g3 Td78;ê)<͋Ėj)j'G"@(|-Z21PѤAM΅+x?eh|DoNvR ƒSQM҇ˏTRJ>zu:VT2( m8PSg׹2ĮS@bs W/di7%?( vO9O n=nɪDv' . {ײeUAY^,SoQy<)*#In<\S'"pjow|"̀ g't^u򠓋R@H._NyX'X}CK+zA6?buHd uiauk/1i2̦ n%zU|)zaQVɏOf%z6{_5i~Q| 9"T#U4Nyp[(\?YFB^S c`GYz7StC{ELM򅟖7Cye֏LD9/|U *HG*bvTu pLW\BwuY%DbRLPe9{^/1`,"z<$k9N"ik"_y!HL4 rY5dzs lFD?fR,z#xm_=֝=4UO fUsP4'xb]8]5 ;hy[DQSH I|||\u 1#m0uI<}\M>.D,a2EwI+Q JP&Wn-. U6\Q+hPXjvC}>p"3d}LM>?W]@)$/!;@~X[#:c=@1od&e^A$8z) h86 Gã^3;_9^)C r1}?S a$2n'{%h8˸g$raw]gDhҴK t6k$1Tm (ӁC$ގٷF)JYጊ0멧yu-`Eœ; 05".f /v@ȮFNO߃t)5M(Z1B)2c^g|fZxv~-G|{ i}p/8Ʉ}> 'C0Xj ɭdFo(K)8CLٶ2a` I/B;H e!/&H3xXЁ}X&?kr0 "p'!QsmA΁Fo m$xF-(3PۣS쁧PGP~GF bLȇi)lT0FԬo&Zܣ߷'|3=k%gN7޳>kK6:·fui#4YYh?8)9"{{"-.xZM&eN2gF{\}l:^Mbٽ,ZrWvFZ}c,鏫m`yATaԵ17# _[w:wSn8飴Mˑ1ud2o"Bʶ@"6aR3-IXD7jXLدSœ bHL\tZpCEq1+k$q'\: e'=-*#S Vd*~/wEGsZ_wkwq*01@w3}^Y]b?$ zf1hL3!|N$?['XpFryǠJ{wO,br]60c_;i ;w9%rZK򸵡) 0Řؑ }PkF:V EhB5`mbY%mi{|H<5H!!nioS80d#--CZ[Qk2UMK^̿jSBxPzj B Fa~|)#[VawYƲiEǭ(5cYe;xE 'zEXdPˣk:^DH+s@)!yO?.9Z;j5Z83C"y°ĬCFC ԣBi`fh fq5Nqr@De8Yu=Jv`;ܭ%We {vfPCs'@?V=ç9F~R n&jJܙ6JsheV搀z)kQF&Ɛ@76d:dP2uS,MX532p]i{PcXr Q2YP4r? sQm彍tc6WԪEA+*w,%߯w!XZ'*U@?w|)m)"H55|H#x, 'нf:E~"<:}-)v1r,ZWi wkABH x@ L/uVJ~*S(fWZ`mٻ|U[IuWLpu1Vn|?[(C-bkٖb m)lD %z( (YNbބ>?&7*k8"g''*9JPl5'NSWm!ݪ~3 k@2}qr> &2)z'e@**]i] 0Fke* Jɠ1/#SroiBst ؘv \v/E-R*bu- q#Up#YJ= D?gcUoWfٟ٤/RNkChoiraO£yA9ʩ8s}|8,Yti%wrTZڦv] DRshB{1T'@V)̭ @"]E/6 X/ͺ`:;kXiV i\^@3K5*huԻV-,2N]DaU$XMv\ӊ6kXmV KJIǕ, ާcAezbgstĦ6LmهuD]oȘP03# D|(9NB{o{,ဏ OAΖ aA(}}Gmx_$$@Ji6v2߻DIx|8 **ێD%a]Y8,RK\I}}E2J|:X=8J D*[ ِvZ:ʐ<}28\#+>]P ,[ige~^&m|צ֑4jQC{ԌR!:yo1E<'ƹFʘ{#RNAǘUq4qQ.H\5{J?yhf'#2HDh\ʂlhwLr/sjf )~[&h^$7i띨lKRˇC'U:{'bo߯5V/ՁA^˨yuBq`c$Be\.1BA&>]M܃8kSc$XlgCI+ __ lkJ. x%"Fh5F(jqb#) ,$'T{颋;Q[w{$d;U_\Ows]<mw iiIB!뽡: 3/kb&U|kr')=N@פo؂!y=,NRjt dbƙ:W$vy+Po @د`'IVĮۡBC|k@랿j7$<%,Qڗen@G؁bx9 pِ2di6yͅh ;Wʏ~:/oܑH1Mc…Z#,h蕝3b[h$=,4ނ(*L2`@ڑz f%L/}A_94V3UHtuuYUy p"AafŌ9b8U (#& >4fX!yX*tJ6{x(1xsɊpqlTO;G쐫?S_K #>j- FXR2ţ4V#N4)440qXlp0~'TC~ً.Jd? (TDe+.p41 N﷟y^(\!%Nr+)? ӮX4Nr7ɳ]Z=7-"sM4NhS 0˹B @./6f丣3CK.Bs<yH]".j2^]F4@+ `5rWh NGa|vPa6X\ ʖoIzj"x´\q4`Q\-/j 6痆v# -tfLuJ%Bw@Hx3}JUüqH蘭BƛxPxH셖›#8fMN:WjwK5?!5PgeˌwGsW]xBO/*"k6ʍ,>| 5?H'GQ'pw(*/1D M5q;`+7WqFMa>~2M*E6̠" (eLҴjx%R1EYC AV(qEk61G.h E4'U}ꆂM*s-.s|W^[ |`+ N*+c3fq};THԏmzocIRo| 3(ԣ*{.x}Jl,^zq 5e#h{W)Glғȭ.$Rb eҿ9itUifulX5_LEG< Zkl=OB7xNpf!}qʹ-zЕRG?tE0(16V8`#Ad+²_Bˊ[DCǨSr% aFz1|y,JٺjsF*ZMsa? r[gz\&Wơ9]1?Ԧ=IWb  2>,":;ݘkxd_{wevhƞ:( |mC]{*}f轅@GRi{ώwO`g:M ѱ(aҧ{MO6GA\IWVM0sOt&̦!lYFWEGE0'oH8b{66hR)Mt| [\\K ]cu$Z$c+;hr)'.I$S9;z<༏ExC8]Iu*?2.GPcL/2qيjڄO"NbegXp,JmEu1nRDjmr=G(^ܰ 'Nj2<#X";6Fv^$E&U˱DTxɕ30H|.aa rI^aJ e)>&".,p hzꔠ')kg2׈ B|u1%4( 1E>5,ٯ 4 Iʭ[K4Y ns͐yά]Ɨ`BC"TCK@U/&WSQP/${`,b!J$CC Z 5&d Ddrh{lFZfJi3 l?[2. WPs@차1,dN!G{$;T |56ػP H*ff!0 c:=shVR B=oA747xwr-w FQ+ gxȤ؄YEa";_ӌ~BE`0юK[qgbeBo8ݮl Meǀ~PBa-Zv{z Rm{r),{B Owze >$ч7^6ŭX;<+Tmr剳kqP)W )``s5h>*؃qB@$̎T"Dˌl,.hG5[N=/ITJ zpd[NNId8o[]鼾 :׹;7K_n -Sb0ib?{|􊭒cN2YMIN{-)r?lis9MgLХXP}QУ(śi2#c0 GhoJT.Ŕ]0ĉT'}I$T?{}oybl)?aXW)д.R7L0:f7ͽfwvF߷~Iݰ .  ;5qFd"5NYl`܈95`oNA9y -VRvSkn37RLU۲-x pE}Kkb$$Qɓ?>vH 5ÆH՘pD?LIQ/9ZV}=]J}_5X'&L WH#WJW_wt3ݶ1Dwp*r2gҵEXS.][0ûO_ydNJ b>9qvU@z]h0^ly|GS &Ai.y N+Qpr3CnŭY#"s-dHR>#zG.p³1P*Ř˯$?m/;Øn τ=om+cWܗ{{ o)^g y˞{\/G ȰjqnpKLYb]sAN(kQ_n_f7: `8ɔGUJ C|_MU}/P[`FE_6wl쩢 bHh1.$f0~ f2j/O5;kKwg.Kw- 9lpݦ2(f Ompm:L+u yr,s%cDpه;׿jFD$C0\hR"%N7fN|%brҷ7|#{Ldi5L;) Z*4@!opGPop#OL׎x*dIWpoX'G1@#ֽlg| ͒Nsi*Pm[lܾnf *0yxB`7H-ውYI-ɱH&wJymO2C}%#QEOhk$VzCAtTT\I7d}9#l ҅X4ms{}I=1՟8NxYL礗qj1|r g@=8 Jŋ9Kc +hd@KozL]3QE뿣Cyc7F>l@;ٓ=(#_0vv VHg1 /Iw 7 ԅf+986Oy\Y/f6۬\ ДDHn9rDT|h2[,܂$r 3! 9)~Ǚ7:W`?OVM6kBp% aloH](rl[bu5n]1 2& `"4/{4_X:%kgD2bC,K_WIv]Qjh<ȞϘF=|eQ{-áPSlx$kJ,q4Z̉Q#7s&x$:1g886= t8=%Q\+,"@HcBk]9$2:Zan7!;C2xO2U9/fDaHc+Rin"᭣n.#F'a"^zɛKV;* *?L:b/O†qRӋ4ɐ14X8byehfCS.:;Hwɳ`jKx%Xl(1s4BPߚOMUY% CO?kfnRPAesRx>;̵IR<XC] y,̳PwB*\Q-B7^I}B?>-DA"'iok]&ZOK\4.ްA"D\e]8`(jb1 jz֩ͷ UΥ z~),kWȇHx\m&lJXdQ 7C;_<)IZ]˓o.1 l dPz,['c8no0ő8ۡ̀aXc6ـ7Qa/JK/\< (cZQʸ H0PsorWY>cJ>ӫJF*_iJla׸xN_ɍ\{8o9(D5gyqpjKY"W;D9 E=o;#P۹4'][0Z{b:+`9`je+}ΘTf=5!}+c|ږD#J}*U  F?usO/tzmy 5/< Nc4<°qq ʼQdnnjΖm!\~qةSZRюľهpvfT5ǝDMW)r a6e39vONY9f]Uo{(ݘi+5 ҡ3dGI{ƋmLg+ӂlrj{N͋z mļkpL=j Vu҉{" ώ:ĨhXl5aVT6h9n\ur≔7G:)2"jL Z~yVB1eStQKawcН-?:U'\UOKq&XObp챪0fi*ϋҠXuԦ)E+J\UX9C,3Y$qt7)]ڄ(!z  H(|si5ТP nF6'd" !Pi|Pӌ'@9 Fn~xn4}Aq{=npTwQşn(-! pk׫ݒ"nToEiz5,ۄxwP ĸ8*a۽*|O n*bZ}/{:ffD (Y\Ni0yM;Ԁ4:[6*M)7XѠe6\u|e6BƧޕ$Ve#!ES$[Uf!XsΣ|^{cnqÃetlx5͊8 Pl=zBS+(mIGwtEWƼ `Eŀ5l/0Z[㬄䴇Ӣg|7aH/$\J=$~џ#Yѽ.ڍT:96gŮBMR+D+ITtԅvʽ=!ʨ퉰#[.>'O3I0}8ݜ. --<Gv+b>8nt숑G ek.џ.wT7do1l:=6TN8XfTYdm_ 3PBo2A/RCRpR:v7hIIX8LjX/i@6&L@_+Jiؔ;v(M>R곾CeJXL)t1+OqְTb]b'̷]kV%PP)Ry7|M"h< GHlwdZ!y\ic&%ƴ'n(ǍR19R+[57w^)rZE7k=rSl5 ]dTj-\ْvɻ ]IJkoDyS>yw E& VX*{r 6Rv~: ]*FSk)/F uG뽚T-!d6mDaU˝b0Iٕ8ۉ:2:z9 [N,۴Ë^ՈJ :g΃$=n$Ts@A A~k_oD5({Wc!g֊s F}S1ҧ%d?ﱝ"90g(bPrSgoЏ{VENOA7:go%PV,}}z8/ vtGUImW '2 &VN>9)DYs6 9w6OT}zHp#G'D#~%|QlootV ԓ< ޱUӹH~ŐҼZ~ /С7a_0G:mVQ!՚5ʐK) _ԗ$1_1lHFV3;t r1"lH̊18 F;_%$գ;E՘Eq;B. /t@F%kg̹"N< [ ytь=|0؁X*D@ֽܥVV.=oҟ>jXS$@{jLQfH8|N͏ߥ0HfNG}THoH;`4L2=2PB#"R}9ejIFQZt>>CRO[8L} m,&_Aр1Jzt_BOaYkAWmǺVT!9) >k Ϻ(X9+jOEWDeH)ԭIoJ8siaQdk7~M4 k\kZʉT2px]y\; NC+zo SP'b,E +7}u=a)˪CFk*3п)x-먅FlLĊԥ:_k7[ggU*0$n!W:*k/↕ѺEx {Ms޸9wXeT-f_GF+PF-BR%&vj#Iܮ&w***3XBF2 cA{0 *Bf*p:p Ijb7j+bnlQ⁏Y9`k.= A d$OhZFLF榐P${b}:Rέ^ X^+|*PBFS5>#aEPa7doPlr)`jl% $!(q \\Yn[q/ hdu/J*1L6qn 򛹁Jboh},R<ӟ1??Wׇt?LB[]OZ?C+蓪:f>۲:>6Z%>3;"FS0/vJ{)Pwڐ+@#ۜ "qO+ݵZD@qيPl:lS"Fc G[RI4M5 n3{0o̩!"*&wu Dq 1{sHoC׭Jb_wU,[V__k簭s6N!(*aq_ْ2-Db W,<8 CX"͈D%,Ez|k" NqCd32mSI(p0Iw!-ьf0-F͓y )䡾1GQxL>C\tmg峳C%v?ufU$sſ &`LUsKBsc5L)AI[ҳ5aL x FcfYNxcAXo H^PG9?dgH` 6ht|G1K .ׅpP0+Fz0nPeiXk1ueĖ+>cL,<5 ڂRKL3;ƕ~ `(엉fqomhm:΄ցTW-\;Mat㯷@~H48Kҿ՚57&80^yH{Xsh[7_(1s;m$S5?˴kF5,}C>9Bq]"@4TsUn<>g^uUitJ<@QEKf̵C`?7pnUtwhv">Lq>?Aa Ǧv6g[x.=.kj/A`-(V9lE+O վQ]mxUYy|zd B׎J5QMMO_S"{8c٥Ҳ78Z_ϭfjke*s1 =W+sƙդYG<YXB-IT;gdgnV$$SNg~P  nV-eDT7zssWV:Z?swՃéXvș:v9i1OxbטaU"*)W׏5#lj̒a-ю?F|B+ =I^X{b;5[U:EʼT=n#s%WP^e7Np*Мk$ûף HTJ)"Z## .DYlNmʯ:Stz:&IK*y®pm$#fuiU1#&܇[-m6T4E ԴaqpG/T1s+t@6 ͇V^˶[(#Ϡ $:^'̪}9zoK 7awÅ<rSxע&P/5+[C^]`w8$Vag\ A*S^o&[CEKRi'jvg*qqy!0B{NX8dK8-RV[ :8_V@uT탅$jE 4.ܕrjo5<<$c#e!XDu+s+HN̊2h*[8۸U' bg,C.r,5j%˪*meI8(vVw ),2S..pHj`@m@ĕfӒDz2 h.: Qz Pcų dOf\<|Md0B[#IG7)8_Z/*&RR_2S,dNUjTk[%W[RK~l`I;Fg'$oe!i}u_S`O6>Lj4r:QlpBK؝ChDa\:L5BL~ @~f,s*s jZXĊbYy?{'HomP\ u4\FtOZ@.y;SҲџ>s yET9j}h"VN\OےX{ 5N"6۝D\ĥֳ=E{x[SS̿#Vz|rƿ?`pƻB2VeV=u%^6ƺJQlE~B`Ee 1K-S @URLKŧY].ŨyW'#jPͤzSkIs*آʉK|H ӠM^}%9[);Bk?eܷbÂ~'բ O3ٲFdC!"cŊVVn]TP3sn(Hovg^}H;u]I_4P/cLWZpKx6뵾?Ұv5I _No%ڭUkDRE1CphxiY0#O~Y=4t7Y) \LMyQmB0$P[`rN 1䨩Hp¾! "d%RJSqKٰ^aӉLE؎'SjYvb`fmkzhn0Ӳ;{1yXԠH9׎-LFRL&!.H|(2T!DR /v*3<k 1_oXbX8̿_LV8^Ag,{L&I &ʄH6B=@/cD#i}*0摅A-,iHI5 }=ϐ-?c lI`$57NBwrtq_\(WYՅC*, B@=jƍW(GOlQ tΔi )P& *q \ɣ_e Ua3<|"{E"{o;‹_Z2% s>N~0mOmvɾhPMup^AnDmXّb<!PћS坕vym7PĈw#{N#J`u/m4RIa8E7sm\V)Q)ݝ/鎢"&t$FvX=l4FI^Z!b>\G}lAo~Ŷ&3J/B(xF { rl>^>g~1$6kDTrYi&̘N'@VdŮ+v5x4WLgǦW΁B R-i=/ge!fc#6X`r$e{}Tܼ\r vyS%O̸jrl!X*".BDwW *? X_<Bϊj-rM{XLQuNѥC+]ȢLU{)=V [ TiS17 H'Ԃa35SP(AdmOw4B (oc۪>@-JKw7,|h%\ _q8qs^BKKAZ<a2y C1߶`[!KFY3N{sVʹ0@x & ПL"эJuCd}jCD0ŶxHtJ(|E;z6sPќ3A'/>>&c@i&`eه)'Ą) ʻعSȥL[1\g3T@K%'h&Fc}Ǣ_tP!A4x}#XO O&'ÄІ!q<#:<bc(||W]>Tƅ Ƥk%ndYS2AU_;6aBK{ϽMz̸[+@6 ۻ/Mu W 1-+a7\.5O3g ֽNE'}b&{ijfڐI7 Ȯc be16~3k\:fF!H,-cqmRTQzFecVyS `{` '.`&YLea[l0_U9zYG8sd _p hd;a9B۵-H:Ԃ,H&V8}d C +)OP ]T3!ΘMtBZD?ʬ/54PAY* 9pIiuڢf?_يx+JriמXzԏMvMTeb}+_"mJ;D% 2ZdX//uXO9:HF1V ,NsΠuyϾ0KdnrrqCG^ղvM[[Ղo u )} QDw?tpd Zӱ9_ZM{8DPC^6Nno!69B,e`$@0檸Z渨KO#toCuOVt7.(f ;U&0}l_M0#9l_{YN51ltb'Hb{6b|XIN;tp7D0$qKf!' J"GF2Hyn<Ȗ 3}u&X!@ 5?JI`x,&7ZdW= a(;W􏨒EV#M:Fdђ_3TxExd}A'ceE'/NfdZ! ;iqSūEu+9gI쎑 Ë-G+yʴ'SXڭ@i~b3 *h@,!C nE N kstk>(hLGYl@CDz~ uWYv(ڜAUfTjG?}nm_bx߁r,1 [݈=ŏF^c~|Yc~* ;2pC1%~m[/; ZG4W];y(錿'XGP2D홗kGp<:1v [w8yS{`@:]<Δ507|VƒxڹB Yu!ms^& F~ F9}Ud9\C"TtA>2'!&;5ipF\Ho%6*%cMh7E&P(r!p$nbp )vKOm30y(tRF';4?0%+/g{.ЖjL.tW$ș2m0188y F[+j(%'<897ꦝ|IA2YefQ|s^np &_Yخ2uB<..oaaA?Z}v28/mxVu_uV4xF$ Mѿ"=f+Ix!L+ m:8zI>b?;\_VEqEudaMJ^qlˋbS\@Uɍoo2 =p WADэ1k8YE5"USf04-non|[M^D>|jv-oұUmJ2&3 ݁wBٛDdԘ0?t8Z_288"0֛ش{#z+`fy<\({>\9HaaL59E[]| 6@iײ;>oji!5 ۸s A)'@|"?F V=}G JG\鈼R'qQf^"T >&͋A #CތvI:'Y .U8ϱHقk4"RYwcys{9_b+\HՕSO(&:eT#DN ia5辈ǁך@"k& >0)C)A3fӯlج͆d HO=O5g"ex n\۟;loSYoPzjvU%CagcݴӠ ۈ`wJwY][V6X 8&`˕C]c[KM%҆"?PzG<Jp8y8ju&}PI1.Յ}TȚHKHdIBDػqXzai$/R(FjZ"ɀeZ'y2}A>YN2,-5{$? V^Ȓ=kh2;\V iznzӊtHވ_}T ,F.҈Oɼ*Μpi>f h0ˮ[]n8ZOX|X'nAl@Exmw볫t$eM ї615ݪ`9jС^qxh8P7\jcb2~6Vns :㐇4y]I0V#]ԶZLN(zL}Z=!]4?'D %k>aCv6*:=ӈs”eE#_֙ew  #(jtl,_LU]ƳYTc''8o&+9ߔ;yJ[G,CQn)}K(yOF>=9\h+_,J ww?N~#*;V8&F(pO~WnJJd.DpSf7uztj HC Xߍ Yzμzhc`p\"Bhll|7`*r=:xv'Q6c dkY5ˏ+ * OQan˯(v{t c &C>Z1=iO֮ɪprP&%|0 G+'VS£<pf4;= 6: }X5r#$GTvfPXu|xƌ*>V2U͈ Vf=kRRYa;%S, Mc ^I̤VCs椨M9G61UU(40uqx/Ĉf+O 2>Ud0G^(ƯLhdZȦ``NԦPWhh#Kҭhl}OU$/juޖĊ)e pu~.,nȫʼnKs"=p^y:U0qmA,;~y }H Q;һ_UE-,ǜG]kb>"/o.x >כUgRJCy%{3,?Qe33n-Mi-tOړb*b)'lEO6pնSX?(LAq2~Y~=˿U+V^t:'5oƇtcXHKd+/pŏrtZrfu(=>}&<}ܰ;QGBc!Fe{9#G*)7\/T[u+~֣p\3WvCGMEՂm>2g͞qbxBE,NeKK,c00uZ^&P ϩZ#2S}y@8;3M/}L ̏ Y>]_T7 Hʙ{u~hɉlp-6φݲT6#4')1~V5P3kw> ~_ @41@YJY<nedH_15 R ƽggcu#/v(Amkui 09a7*& DS 1*9 X|)j.pTҭbRUfcAuWy1K#! 5fXdη'%k07Vܢn$NM!P{=j|+E+NP:o <ȳPb{k]G5w P<{=݀>x`8Oޅljb 䥎| 4l׌8^ق>q6!  +Iiv鏭d_ K̭j8h; %417~>[eQ%+ӎ;Tsg(ih[üM-1~I2cކ[X&wu#GtOGgQ&e2u,ܻNHQ\͡)q P/L*v1l2\eGA6;> q P>̘ 0LHd"[MݽL=yy91y9"^"`)F.Ca_~D䡃Tɸ}j5|7[z _ qE:ML5I8]%aP݀8 by'ۧCx`Ys'-Ot8Ia*C-!zwP3ᱵ@V5+Ic*3t:ϋIoY([P1:8y*Aa9s]?/K̲ ժ^]ZيN_:rl55ZO\PDxmtKI_H~ʹ b͆叫3Ci\tդ"HZ MnkKb EPdVб*=։ 5Q+ڒs6unԠA)O᪺+B([n7Vh@/*Ϛ$*%Q+t\D+b+^CODK -q=ꕽ8ڇι| [䅬bkh:n{@D =o>rSez'~ I11\see8&(:IX%T纰Fog4O,~`Mn'2v:_Fk- }?uFn o}ДzNx mQ $ߒ5wl.EZ yidId_΃'ZFLY݊KE'3: hĉY]P2+?u(5aS&9LHG{^]Ӭr!lūv(ml c4&<644͍?b%W!Ni& 7iH~[Ǡ\~9b#/w\%]u5NjOAf?3?{Uε'#?vX[bE7QeHN ݐ ʜ/3l拉ho]Jt[ԐŦS7]H*:v5ګ .#ϡ\ @Sb^l*-ٯ7)mm9sЎŗΡn*§i Us _2mWb2+J6Hd!RF"MArs ``\tLJxrŠb ̨[l1-3gaBimL kCrmQHB4Qt@R70;DD :'%΢8,y ; yKVkCB(-[ڸo+jbyy~#Y&s5w }&dSt,)#"4kFt^mLLV0kّu,v#%mc/6BE[`g䐽f}l{ʶ?t(HRȪЃb{F^bs=>tbYtrA'ũQIz"T% 3@4dLVFxpcD{]!v3U|23cyGˆl'8?žZu:\Dvd;.Z> `Mzum?3@(So}4qm+"gQ>t#vϧX"ǯwb63l$Xb)98 )Ԭ9~j**9+F{^B'Y&(W}v"]Pn5F<+@9=dHļ<%ORP9?Ԅ7A%;ߵ \S.-`N)a-@A;-䕹d9uBuBX)7`y1f&T3yTiW= C ^]Ϋ< (BJq`/,n@ R4a؄^9/B31Wy xt㛳lշPL$(SΎTRSOIﱺA>MHYՐZZQTaH(1ihſq,Ep4gOSkPͧ2%.rnUCu4x)l_fwBܞ"$N(O3EG^$qwz.J;zYlk9DTQAMÞȷR_Ӳ3%wߜ3Nj ZV-)u 'Jql|.qXKhY'"[ɀ]\ [9]8ke#(l=Ûٳe'gu/zbYѺqOƿ[-b'_)|QwrM!5B0]A pGc 0~՞ܓeQc[}fví~@,fTJ¯P~Njzt7ߟ&|1x(1_ l4k.NTJv3"Bi,=h>wAKƆ*eSF nsY5 @)Ė"mmuBB(,056C5X~u+%Zl^**Z#siBou-1>OJe~)H"Ʀ$z{-a_W 5ۼdMȻ݀6Z /\/,^GE4N8qf&W KȄH뎺j&U d%\P:՘ZQOR821:(=)a1+i)E^bM6//A?T5#(ǢF13oXd8'I/_/.#̬BqyUbDIr_]+*r00AjX+ڿЇ||(jm35AR0g;:܄+fKJЇy][{"X~~|Q=$l]89, ŠEa%ϰx+_5ĚcY>l՛Jr7XLnnlLSsQx,-8RJ#Fy/&ᔾ"S5ϿC-h wEM{p8\a_.d8 4l;znu<S0v!toU!ao/:uVZ)AN#ƛL'RfdIW[X bVԡ C$?YJVqɭU`48Sj3:1z{_ \2-u=$AmDV6Ar<"2mi+Xlt?ئOtȚϵzs+M䊀[օl,/Lw|͑TJkQa8Ьb3DnCq.XK$v@,xg~6-+ 40sJ3io sA$6L+U6=Z=Iv= vQ0I3f%-?iTܳ*ZΜ *A [\V ZА/}KMP-u4kp^ޙ7<^u^ZJJKQPEeRy|ze$/0!lzꈥ1u)eDy%\{Ӥ*Y.5}vkcYLM^_"ޑ}F9vLD8,虜 `3贈'b5~_h-`Lz]byALpqsak nӞ,Rs$([6Zg34ޑ,7 )Tj ͫzkڌgE+^Y^W:-Sf@KnDj'HZ,naA=Fa[ǵC"uT*rZ/ D&3tp/V\7xc9'c\g^ua_bl* \wqeTUUG w9]>l(do^ /6x2WR?2xi_j`fcH&x8RTXjI%9-ki: *~Sm &4yҵve#ԭEH2$,ԍ Fza9 6Ts>h ȯ/M Iz4k@JNUw̄{YX URG}{טVFyeK$EL@ӑQА5~0iWe.p?JDviRd .ĵz+8ֺHH]a+SrƾV:)K/ɤs]+2OvP<sn5\`ϻrtXBS".*ErITE'=9FZc+h'<D!i$-(b<* dA "s8_7P_|L`&̤d:nJȁFidD"iI骤B"kalu*)DE?QhlE?ifc?{OwiD U$l6)ze/ޮZ{;6_arg<+|YK_2" ݙ˧ОMpq9<@Ahw @h|hfԾR9C-/+sb|yP}a[6@Hp.',]MX2> _SM=|nj5C٥Y4ytdY;#=%k8r[1V*: KJk:'z៰އȘ3Db-h|}#ڇ͆Sɥ::"iG A7-s+C-}\$[gÁogru~)r tvV$ )n^#Ε.75dWJI% h6qD^F@ "u1/6mv]NblPqXNŋ3Ɋk-rL8ڋo 8/%Rw7e6PҢ._4cSo9"8-Kz9.=j=˥)r|k=(!h4Hh!\<-AQ &Oɻ9 a#:ٮQ/eS}#idh@\{8g)˲LD\Qz|%̠+dq +t!xӫ: ]EU9'tYK`]>4P#l}57pK:aFvl R}db?8-OSC9ѷutz׵/, 3."t: 6ˇI)rmS[I4l ǺB pw"V3eã.arAv{v|p (x뢟3yl;Pz&~gL)&ke\nJNƣ 6BvAzhYN҃y}uu?E|0@vSNmf)cuR,̳ة5+ l5Gc*Nb۴<`62&ʁMқAaUEV(^/}+⡵tSi9='бx8%$8;h%` Ŏ$)Ul2-^y $fgk k,óա%l\(].OxOKx>pzuc38&4Cݸ,˩R"tn@GK.as}[ٓtNF; PXTҸq!o_gl0^(Mb4{:t >9o# ע+R.E 9G8wwN"+LkbwωFVUE+(gTfW{4$oDB ;=_/ iR]^̸t"ԟe[R(D5:SW"&Y0qn /x TGoesaUTnXXCSm oZv_Ysn,PI[r!]؆l]Zd_UE-Fv*S4Q]RLjzy,7eG3UA ,6*vF{O*+zg)B6KڟE4V້YʿoRT0)ŶbGr*Hҋ&2/H;xbQn^#^NW MCQzNy(z[ ϙ$ΰcʹ\K#NC|TlO$F!jL5ٳk¡'-?ƆPQ[{➾qC` K!&W+h8nxN%]滘7y}PpTR`lN#1w[`@顋pg&4F_ q.E)(W _zЎ-ҖV2̹㟣 I Lx6/bFLdt.|jZm3엪yX0eјq+KOSgo^mN˿ֽ~͝>^h?>DCۓ|S)(%8P&Q.m/աF<+xawAӎa^̀ +s949Y+Sgl04v=J PO+Q uPl+@0T^pw91L5BkF,ݽ\>2f"wl!*mDW,~ߖ=ȑ\t|ߝRd)YG>`\=k7A$mƤ; sfb8{8\@wRThe(#w:Oʜ=-ؑ5L.aIˊZ l]?M(L֘mގZ_fذ`O<|3Z\I [Y@&49NVN}z()'>,17*>UwֻZ#vI @A4DT)d6r&̗n,?|ot L|ã ,8AQv3.^-phvtpx#jL3B00cQn~o/awvkt6i(2͠;.1Xb";ZqGO[ce 篞 " -tEo0̯ mR4ˆO:o"%]E-=۱p@' yEswAZ6(Ƞ@'='8 UpT" K񪮰y`FTGDͲ{FeWj w2 Oꚜ]Hv>>G]=}rւv/ lsHO @t-~kf:D9j\k l2*6O~E*v捀x.2*A9eQ+|Po*M·l|)ckHZ< ^{LA5ٱ~#UK?uǗflP O^ Yz|gGpMeV*3<XyywFgpI> ġ:=L' _2IۿT?$pe5xU~S2:~E#T 9]P|J]&ŎOH|f*d w$8nu2 &_CXx>70&sY٫k&D v&K3^|Fi{01a^[QSZ@;^욉J%DE] pVѽɬ7ެRyFfhxwG}(GX;kёSWg{O&酱Rz^u!?3 F',Adkw@ޱ}pii+ ue?'!&r8itYi/m JTak>Up) D7` TVA|jf5;0Y3~U2^D摫9zYb[dTҒ|Y3W|e]E*:ES )\"ţTVY_At.[Gۖ.4׏i6&R'@C .!ҥ&ÏCbx5IC]]=U;WRY*m;WlQIUYr+Y~d'lfMm8f6 B=Ĭ}` 4齲K\ _,UU)ۿI@3ln9rDXJ^66b:ɰLjG)5X٨lcJ*Nf#P['IuINXHer#iq nɸ'9hEͩlVI>V 5.KT,A-["u'ug-[2\&46C0*:LBɮBوwF*ĕIGmA0Q8a(cjX:um|Wt7T'{3CYv| F !r2d袧@1;$XGAu`1Xvl_cb E<¿/Բcl{ n TB H@h4ע>=KJUS46n3}JBYә).$VT\`lC>=6& }7Ē(\r{_1c~NbzX!o9[\z] ńɱi8dUa'%QP?9^E]=baH*Bq~*p{[ nLS`3A ;8l(*wZӘ"n^ĨN+nBWA qajupZY^$Ej p@e]@U V!Uyc,-,G5ZY,3l*Stps/I5b_&}x;CG^qm[߁{N mFɹIBRLɐ HJj:z"njeDVe;v}P JX;0۸Mz >O$'`Kx;I19/p}.fqʚc|J>O|+6Ύq2#XXw:1 FX`h4ڑ0tjk mbZyE|pLͮY">V .5=E+& 6X (Mbme|WEDE: ֜nSe!I |qAfD,3ǽڿ`m׶HLV2^:@a`Tm[J߀LUnb9 g[$U۪J O9M,U{UM,fYK+3[hBJR|2'miZeF.Hy #@ G&eU>񝪇(!즛-ޒ`#|쌕_l'W*6ώ Vũ#[-dy=*yy2aT9*`B} .C1reu ( M)qbg0'KkDAܑyl8SABi w7om<)N[$ceL}j§)q+bኲwِdAb 08-!y.KN7~ank4Ąz݁JH w{4i- RW~\Z>H]?&TΧoՊƦBbexAQ0fFF 9CV N$H(ōQ7<bA$!kiيb9э]204;Q3v8$2+шȘ.m2~UDpL1DuzMk(q{J5>>n;!A}Q,wRtuNwUGSV ?"#[r/B<h 5}ʭ!vh}ĈpS> y{_Zc]':)$L̩5ϠSSma[5.h-d{wmM(UʫȃhXKD}VX'uvez_ Po-H*P7V E] l2:]I-T%!Ǭ-m& -Uy!ƿK?s+m=W55] '8t)k07 9tYevө _c9OIl)(x8<9&+wiu2G")L$Mzs5W9>ՍXBr9DiD%"E澪?كy!m'4|p{)%K^#$u%|U `8)~nB6%5Q{N` */uR)=$UHLa^t(/_YQZma=rxf !JH6:dbxz 3 )phʭ8AUAk 8-V7"N: Q$&$H+-@Iю& :Z$XSx>⒢K< -1p4{/gR&e!*Jʻm1 cBd^=,gP5ny"X[s>LdxT!ƹ6 =,_C<_郆{+吂,0:4_l.h$s91M3+u "(n` 3' S(-M p#w刵FVcd4뇽JB\N[jJ63Ş=qT6< u\[knW(=!wȍםB!p7BPQtGZA*xqu $-"l!οEh(ܧRBC'")+rRqIʎR qd.}4DA̡ 3V̷EBsxO\.W޶}׶W%c0(ÓŴ;A <ʐJTE'{-㺹762lՖ䬞9Mk MӃ >m(lS2ċPy&݂]3/i߭Ycgu9 NAgP^´™]&QI}ӎM}GG)5lU1eK)L3pNcư1/؉W$+)"^T JKdIAP>ertg yE@ޕg.rД~@$ p_P|}=.Oq :2ygrl(J̤NjPiB3 mw4n^5jtHȸ`"0&ySR7|6 /? `ކr88IŽFmhaZt.C;qu嶱*AAh`#3m / YF 2D/J Hbޯ͛g ѿrN%z=b?#ٟ vDToKOYU_Cd{__ua"(VYr йKYmfL6 3'LvFzs {먚}vDт@V~7w(X=p>GQ=^[2"j!]&FCWEs'tP̧H= :4hD^le^AkR8U4_\{Cp/P0?DHL_Ckfu I4K eP()\I!1UsVq& D|s6nk"^yN껳nPǧF:\V^"ªMն4]/H2Xo|#ȵVo79'˻/|[^}_.O'A;\~,Y_ m8cMbO1kJQӟdL6H f=Eaw><L)f-Yuì/TJK5#+铩.fK+Ar䟟w9 ܲK#=mC3B ~qF[3s2w):A. FIlhjZ\䤾B@Wmhjgx؊< UZGcN8 Vǯy@~@81wcq `⋅P%!T슁ڽ[ &8: =>B"Ər 9-[iYSO?8L")iQD!f^hkg'O<4P.ұ2@z{[ RQEb%mot;fI.)[R{[L[RЎ}{ PlPD2E9NFb\0twwQ p# 60R.& ¹l ʝ_N-:mM%-w?(Ѥ}^ɜ^e1g)Tǖ)6,P0P%('D/kO8U 5չJo$ƚRU13f j_A_iAV~)`s3bX3,snRp+5/c`:?ߘwbxJrtO*pCOE!:Jx~53׼KssL>JCiѸHtڲ$ڒpa2Ylw h~GU᝶ۭ}UY* ۾F6HCSؚAT?Яb.>ٝ; 飰}0xvjܷl=Wk(6Vdb"װJw)R}\-"NWHh S}ad\4v{;EnZR>^}Q–d6%Z UmE(s09-$ ^s=-v4Kҵ'OJ8>̳|g:_ҿO#P<{B+4DHIK;ʄ"j;v#}*wewӟ~*$BypSi' i@FCdV")oˡ:_ڝg\,6(agGgE~  rCxI~At L{"͟9HU~@H<*nNڕ13RpuLP fZ•FFlѵv+i !}"z5i(ibIwhNr˥X]uoXN/پ)'jnrmJ!VYak٦m RX~5|l#q(d1[H5)֐j4RhHV넘@stK#:f /[ITWpBA1ЎR@H7G E!JMJXI_&vmʓWcf|39 ^]ҫVR@4xV)=*U.rl3)Qa\am~,dGԄT`k+U*Ka s,w# >ЍKg"Y@$c,Vc[C/\R-cy?fCVاO4\aUx1׶y.M-:X) >I@ڟTn2vyo9s8*ɮ)VERǭL *uQ2,eVKk➪2w":9-zDpIЋx},^<=f(H|=e<2 M>棂 .B"p&O̿qa5{HKpeˊQ(]:J*wqgM'{~5]`!!`3M ɃlPYy; FdxSItj/Af)oA疍LmȠBn@ndy\̄,E{B⼱"^(eܫ7!^CV1< {:-S*E)lofrn^6`\i "^ ʅO~ Xg|UW;сo߁Xժ|[;bʵ#{b^_ i 7*4&{[yihRJ bf XP(Cp,ŠykFbXf4#%\#aYpDcD6 _ۥ[/26Zc5ZtaJ6[F QIpN8ݔm'(Y͝madxr; b QI@HɄEy.wW60EUi^hn9w[s5m=3g4-]0!9*X3nRֽ҆֔ܚ֔'mWp*o;W o-mCψ˘w;ۙlk犄i03šjwӽ!^R B%q &ҴAMJX V|hLH-z +!D}uz=f$f֏1˒Vւzzҿ6 XVTJNSGљ/S Lyj.\KB 1csk(Բ)gԍJ(zj|Omik|P_ %Dq$2 tN59P$ Exu5,"԰tBuwR,zK&Pܨ}>LY=%})ϗ6UuIP0_8(>讄 i._. F=>ly|h<$҇Ljn L5&I[K%\?ѺN%˼}'gޝ.e3Bߺ7;yY\JV ]߶HK$R'VK S}@7q:[c?r& 8hf ,+/ ) #(FrOұxb`](F;DmjÜ'$Xx+[|ʝHJVUQɗ:?xmmdiB[Ƨatnp;S"xWҤI:B?ptxm$-V[cm`wMF8x|NGa3OQͅa6FhTB+\4l;z L5%]( #'݀-@jҥdWO9ykJ|ur0Ɋ+CᑿlQ! qp&$T&n ׿6 s%uH iiK,~ t9(I<[ ŏ< MdfUˊ{g^> +!d]?)*#Ptj[׏yQn@S|YkOFAw1S3.-l{%rm[;l G7}V8THհ.Eƒ,izU Jܻ]]Ӌ)pTqz7ߥAV6PC"&Vr1=ӯ+ædPYpHSg[ -6ɹFOُ2Bq{!2U$u SΣmDpTר0uEie r${r|/°žI~7o>$-rԧ8@M:>)& uLxKu4KB4v4T__2nOO,Q )2*:/Qd]6Us0d  bv!E׮͎+G-v&rUt]؊D^3 _K S Mm?oở`tG\JS]*W$ ٥`yR5wNR}NN9:=7'iʒ@撑E-p=\'>\J;/-mQ|$7qP8Ni0 yD9yjIGS3`(҄ʶod;>E<paדS9̀ Ư,k ALm;{?ozLpG {7VBzweDrfuMՏoȭ\]衎;r9"hE41&Jnzo.qp9?NwӍJ |\kq~(vVQ64,Ɗv;xd65.\d A4҅[Nhz(kz t>[ R~<'rň1>ڥƀW.J&uG$ir Py_Gjg^@/e[e!hڙR,Y)ZF3AS"J_Y-"& `/'ŚG w&B:g%bUjlӲt{0^6Nj9#wW~6L|Bα14=j\ZZkT~TeNR.d.yZABu?SS4vOI;֝HK|=V H^QmĎ |( Y=~r|glTj/(49atIV=ۧ^0JlTUib6t7soW^p.sU3 ND`==! x-"A@?Ops10;#AΔy'>2 HWF_Z*Eν(r܀]eϷx[Ah+N2Abd5b]y iN}#Ӓ]fbw([60{} Dv\f}xFZK; Ut?1d;}wdm)MNܦ|4Ә1%b\2SǯN-@#_/K48-h`yxvdڭ+ϴIeiP 0($fvlN.ZhdA>,<П~v/!|k34˭Y;#BexUPC餴+?<̣#~Kh#'-C1h7S\@ة D S,wEY &rX֯iHZx-xv暈f(?n/rob"[ӳVocJ6DU12 N ՚Ȥzq t(+j8`rE >kV !jFmNH ɋMG^}VSAF}z UX]dd.Qض8G,Q6-?DLafٻk[? 6>~ ղkW5e^pY&G, "B3[r-ԔߵX=1S'D^Z5Z< ,B{"DyS8v\9L 0͐FV,D"7'Q԰7?dhZWiXj7EZIky"F)Y(,]CsF^:ClQlߥp^Ԣmdt`u4&!?y>G2 N8.6BG@g %wl6>ǂ08/bX'Dkk!ҙOޒDGo/F,lvBCs60CM4!k\',W Ȏ;lq ,%SKj n`ʢs ?|ѳqMc7o]5\0DOF|o SK-*RA*Y\Mv~>#fm{C8yFG8J]>K ~k6%@ *).LpM}QɅTC[,E'$9W h-=h̄W-TX'͉fYo_>CnKJ _PRkˏYh3 e#j\(}znx_ry&:i] C kvqۢm%=DWoH|<+ËIE*`9w+.u 5CJyh1TgFH Ë;,ieK,kd#|+&Oj=U6C{KMr&, mi9z$ɃTtdYp9g0̢GXl/>!̖dQ1٪CkMblQtI;"i!ʸFUYVc0I5XW{29E5-&Ew\dd+ي1)F3jԺNKΎT *k\hJ:̅6SgJ%b%jII=YZϟإܰ(VλKWuY_en1f+k,Iɋ޶Z>lS.A Amj3 MD" <ٺ */$,`K"1ïRڅ5KOr_v[9U>wCu>wa[ ݌n^e8F00b[a/8W>՗Ŋ΂"D$%d9GMw'kȺC{`a<2 7ĐqҨ_Ly_"FUO״LR"^W4:RdEӔ,WT%K݋ŀ5)(I5lpgٰQ59A` {CuӭQ_:=%$/ޗz4C2?e[Sj82v9B*NЦ@iZV+ڡ Q°%΋% zg눼<ij bY<>53k#BfK9J7=)C "}A$&]܅-VyBk}5jM˜"iA;iCXT56,^svQ![DL&ޕ\,"԰,9VykݫDOk͔ {7f߱0D&e_8Yzvd-ʚfw~…i*3 ?1S4X=D$1ZY$GH]?MhnTYog »j ~%W'aVvf4E Uq`l[T{*h]Fʻ9 ~`e 9 tPʧzx|&"TA猎>+#Of/vzьLBLq \TG/Pk,5͐tqHaLF ߰nfn`)Ɇ&H@d5Wu 'DSPTLBd (#5~׸e>PLNR x%r!MQ,.y5Rtd`(YX&qZr E\@${C8iS [骾;04wح&ǭY;r {=p؆f(LO*'&wee z\͠A2ޜ'+5x.27+P|TLsfMz#!" nŘ.kIBXo]ֵKZ2GI~Ɲ`DUL*#0B/d;Mc 3n[\:{|7In`{by_]5e`z׋`kyfm/Z*h!(jQsHׂuAkFY#`m,kXv g,"TPB2?yDRc r6>i%.%- ˥9QnoUre/l*IldN+-W[͂N  ˺ LMsy?zxf .9#f_n<]&Yko%癔O_Ġ36(EOLuCf+O 6Ƙ[?.+x;lTH %㺔/1|2-`*K=ѳ:]ըM'~NOqˏ5-$<T0vQ0#jY#X:@<ېg#Y +FΦO/o,1Cp&5ױxCM"3;ٟGص}ZA@uēMFAr!7 =X7Btf(Q6'ܬ:Tr(ƦؤaeH#Sαw"-b}w?8-3Hض4`^= Vレ{<*6h!^,NqQZS.hl o6ӏb91<"b |}cg%Q<9P~"rh붐SD18}-gaA*b SHm ݕ71w.{b.B'we?0TcoUM;b} |$%w>q@1pS5(iF,_ԸI=JyxP%6hu=o՗!\f>0.Lu 7P; *MPɗ'oSOɭG4k{1N_q'-%%noF~&KvV%tR2{;)O -:HW}nBXZRUٻs)a F+Z&,lh?Wτ 7@go95r}tR|'4apP1s 1LY8ah"D^/Ta| fb,[kg-i%h)}N^NpO:>*CrPri#"?/p (#d cSݐ`WiД3I]'!p|]MѸ!;A}Ojo3w wK5D@SMzܻR^l\ b6C\Ol@9?c ˱5>p<==(h_B27|a:s@Au3"[).zzUW!ɵ>?{4T^Ui.k1S/ɏ6J1j~|C1V*1|txD9uUaOIYD5o/dW#4_0#~^-,>(_{&;lF /S)*JUUe 2:^MCzMѧX2A8 wĦ4v]p ^};[ #Fy" uS8dCWץҒ e=}iq]=v۔D2tVZ;Ry;0:Gwj Y0ijRvZ֕r罷{8S;$:Nקoջ+~yBeɭ".Aq>p v,hj uaRKdYK*Mwb+{ɘ฀%`\eJ k_4 6*=E:A*WU"|߽)Ejn-fD!;wӤgH?Q'>-d]W6hyI9wCEy(}H*lxUC/ mJkD8vn(ΫgK h[,KF%.tOy=بT.eSfc&˧XŦȭ9 ()!~u~ov6>*ᰑ(/$KiW[+X5|e\6 U+c Ei#8u X,J$MimbAN~oRc) 85=P%n:JY]¦j%ᆻr"= Heâ[K)Heފөhz`3vD^ѥQes??y̏=~(ӭ#= *]l A;5ns]Ѯ|oة{=F0I]C+]fK;F>RcN;C#]B@qg-s@7 a:q*\t(Z{ wAܑ@B ©Y,iRtݶG찢O)xȠwgdmD>yaњlX*'/MFTN,⹮u`ψJ?mJWӷ+Y]'r:8XI*(F}IpkɟR&'jq)[8>afE>7Rbݶelok/o7"<nB1鉲ude)+k?EA܋Rtf,_C}Tu*jGeġ^T#j-} `0cxDtHOkZ}`?( 4s3:*mY=o7ƧU水ŝ`w%MJlit'e9ޤF~L7 RGJli1]}XwQdLm]%4Ġ 'PiK %Q*ϣdٌg Pfv\>]OO (NVj?_gіXexF@D$Laj9^w38fD8J"٦ľu2R85K&Qf& -vk&5XN'D~a^7CyϢUzcX뻊(usd4b~;K7Hժ,b}<IoDjs!>a:vXΒgFs2 @zfX'H3 7{ Yl1{,lOAr<ɉcR@Ob_gf-ǫcqk{f /8$9؇" ӧzڒDzYq  c14>gnM]E[TְݒCVvPn?S85LlV&D$e%*ztARjS_׽.xyϓٳ^|ꉫy@E aXzWdXg. uqr+u@έrtӮNй n{DWomNhʤ^LٜneB\EF4mnJh1f C))q 7 VE& qN87`S0`d W!K`1s(@Sגtkrr =d@*L2!NB]V#Aq _ʓE/9 `zC'9Ok8Ĝ3Fq#Y8&x0> cK`&İ] $xGł6޳Gr%~»Zg@iw&.GyE2p,Qņ\X_iv{wB=ͦIK,6 Z3\h ˳xE5 sh2BT@GnidV}jy,9S»vG0JM!ՐǦXG3)VL ρ+R'E0r7"X= '# 6!aEQwGWnZI"w;W) /ip'0{ʢǼ(ؽY1Y̥#ũNg5VkD}@@`K72} YQ(A[ 6~8\ %\_SJ;0y#L f9Sxc5!s%mO)_E+$E)WrK0QK}A#a./P00} .SHz,iM DDݢe |¿͢Nu4J4n}텤׊L9􊨤MfxjR _eRGibj5Y>7VToN]T]0TsT|^M UqZ`mBQ#InU7$ʗQD;- (CKuUd1W#L>+$+Kf9bx6=th>q9h}(sIW?#;Mx+HfGedgQ.c)i>u)} d%xh 8:Y=9Չ^lȁE8VNVǹ-} 5J1ܞݚ$n8shiYxx!#댎rձTטߍEa P]W)bK~rn_txzF'vH.=b$9fP~Vt^~ ;3Ȇ ]9Sw2@7.(wxwLؤNE VZ jC?rIcDǦۤ~-ixtq;7y>2| hx |gWc9 .\ˀǛ`$XWrzjUp(*đL39 &}pgN8 hV?]çoLjdz0VJSk"LӬki8pQ%Ztc̟ZIgN"b{:Z 9`3Il SQ_4C&BbY`=n)QٗW2ā͔Ӓ4*Zqe$9_5w!a 5x^/\ r7s񊂣:6,#P>98o0}"MPU1?d:wZ$!#:g+$E&eՁJt9V2dK  pC*l!N씄'qok=ID>gm!ⷡES+O@W1=Օ}-zm , )MKE^<bUd#я0%IzVy::~V1_omv|y5Q__|]|2GE+E(J" * ǣiq"B$cCA{IwR*[`?4v7#DLM3VFq#֧s*=s +k>g_80(G?ס;haNmE=l~œ%~hٻcyl\cg5W4ITj;^2 H~I VWt]|: zdžJ;riKB=HXYxJ,9xXFyn%ncJ"p- I-CZי6!Oz=p#?""Q}Od :!AܖϦ2a_ YmC0~S,xU)7[-PVuҗbA'} `TxeCu[^>/xRQ:!.P&JPY 5mtjqʓ:D`&NgiiP7pvj!Ce7j/<(C,;킞@,pȍ*(ٟ4 3OIǒP|;m㯤mW^;9HlDT0Gwa]P>PR |#Aعo\=,hOoQ:wEo:PIHҵV4K݀ZF-1o pd}79vD(6o։TP]W-jOQN CKi{Lی~|r(@oTd\hՆߎ~=535VSj9}6E%mDrŀ4$*[cFf&1-V/RjF? XsՏʛf{#||/ ?aJ1ə.R=S@ݻQw[J S2 .?'ȎǕ\+5M4chy7Bb`~?0V"f!XKYO]au1]qGAV> TE6 zbu=V.Ga QsÿyDž>!JMl%"ϰ-毡eQ$I79E^o,'^1lћ1KXo 357A 8e`3Fmi01p(.D {xXr+ʑ:s;R{2їy ._Ho] Q{!!9u+"nk(z={.dJa Nn6ŰZRpLh7~(YYHW@͇ζSZ7y 10t|tyC^3}5ĵCŝe E$IDxᓌFKvWbt8*3Fx&ysImP )~oSI4 MV3[6. \w'eğeVt C06*Ip'DO8/dCNp!}YVĵ]8nכT~Tu}k1<:"/5lHQFFYjV9VŤ_˖*GuKZTġ]A kv5αt?!Lm-dT.Yt;?OY'4j朿Qgw,^Q'Ĉye*6a카ԹcM,E@M㠟32%SEW,Us ?fCPl(M9(?h]eXJjgմxנcW#[Ђ wA GJVa eɧN:";t"YzT"-_x-KoOOKl`<ŔG0׃TU; .ACYm}I@<_G5a+{f&tU&1$!,5>(6 dtt&?vfA˨I'VL{i(m+ЄrcQM_x\0T' rs'e"O|?1\&b5t^oc_p/L]ׄl6x+@ jf۪xd.@_$Ǎt?DR_2U wG`ժe'fjhlӥzl(3L^9dփo-= aт D;syMuVX|ہa{Ӛop|4.cHd/f FW+M n |Ѩ42-s7Ol H*ZTOpLBPq;Y*qV{D<շ B6MQuq2o.[0^#聗ԇo25vwÚ'pJSL/6zKxE9Q[&d(dD6ʼnNlIz.FOODm\Ղao( ݯ7~wiBӵtnQJ}$7G%u?9~qO$ӈl^M"lNY!+&|i qG8 X=My.N$0Be(eBhU@ C#b@vf*$z )8wb.;˳G(_r `0=c5y}#);23cvRYuH%&]&Pq_!Y1U=}Tq֐W<nZb݆1Ր''7i/V3kRBv.hQ:=U SBqVB@vcלXؒ҅6VđreхoquBJc; 535}7n_5bGb@/J'Z1O}CP^;is掀3MYFv$iNk $ٝ0ll9yb㛔=2l~ym E!I"( y!2B% F%2s}e?甒fh>+R`390:FèR*YǑ zb+zI2"UKˣt1<7l`b80z4>єE&aQjgjTup>gb1\bFoIY2u h2[D(^d`32ssV̖9؄a%62vPl1 /q5Zx ڥkE5BUE`zzGkzVU4(_Ft_B>\oyEG 4!TA Wa[BwWS<]O؇uO+>V@Rv28nsaS_wb ώ5={~}~Nq쿛kF}S85:!x-`VVjdɎ`. spRhJbUNҩvj(_b"OL,CR=4W%SBk@exWrN5${8b{μXܑ-۪T|P+4w&<1NV2L87?sU4҂?;LLqD׷g;o pr ,G8IUч~m+Lj!s ϔ,ól M`)V3Qy !쏴MP-tYuQ%N7PQF~%qxCB0* 9!EjtH[k#xFyUj`).cPs-}ᕝcL+`ػq)Qd=|Zs\ǒ<4QE&W#H{!V1)YdArL"H] 9x}vfVu۵m1ε4d 0V5 PN:9$I ԗ>FP )mIzj[̧q9/at-w8SDxnHSI`Mz`lEnu}0AC8+N}Ο`1kzGasYuC/_:8j\/;PWϫ%jbFcI:W.+ZF(k6RʀU"jYIbʇgjE/(aٹv]s:Q]Qʲ8|/3nڀТN$xyk4" f#fOrb'ϱgfM:Ӎek/ Vw~xG*k@g4Xo=,:aE|t`S# jո7c_Rbp[*<\0b f(MQK6k juȡA:)BOU&;!5ݾXCn IfjL^2-iSR=\llG J?NǗqѨ å1Xq՜;]At2H+O5#D>ت ⃥ hپj_74[bm/>' Pu3~a=6d$뺫uDaE 1gZUfb  A"Yɘܻ*hr|'NjRF7^paHfMm.9`Q?̡DU]?|5N$|c~e)QɮqَLR)0lí\j78\ sE,njT mtcbjg;d`ᖛ~ҞYmsӽLI u{ClzfxN|GY^v!/B et*4.6 '½GxJWpbd AuK;ql\^f77U}`Qz I:!h+SN/S`P&Pԃo~ Ǒj6HJdHL(m+RUYeVg;+.Kx{ ijErZH/5jޱBcqO+O.3r^Grl/!XOmź穉%r68Ҋt&Wa}u% [~kyOߒ`JO RtP7|&PJ\}sz8ݶGUHGJOx֨Nq-uCQ SFѨ sl,tTi.]H6-V.+ ^ dӸ?:hrZ?oD#"f 0*c=%tr2zqF-(svt ԐXdW'^$D `ZWPG֔;!ڸ`3*~"bc"y! my fVnc9  %&Fg Q l:G8>`yuذ }`is+bO6cLQu1^,Iqmmql^PJ۹g=LGSq%g)+iP. 2ۢo):?{>N-8Ӥ 19Rq46f^CUmwG/Fq{ز֞UT>' PE|*Tn*=Cq93agMpc4ݻ"DC dXfXqVQ^GQq#6bײ8gy&QlfޠOkzhо׿me'ѥaɟH$*a@"M;AI#ezUyê&ؘV˔[fy-f{~#)4o2vvqvFzںWA.]>jVEB~- qL['Nn^ [5&>p$$nO`CN5D#f@҇ J=Ƽ+;# F=Û*d3QVt xN5id67y{۸oO_sà330'ij`& tqVs2r+N~M!M7u~f4b!|%fTs]߀k<H+) 5Foʕi3S8AXl]u͘!5Mqԑ>ǓІZV a F$+BC+_m?ZCQ^ӿbܐ@3L}VRU}i oFU)MS2c!+A>O+u 6U`6Gǭ KuYAjfs7_2ԤWǜ:e|z}XI71Zٽ@DZά? GɏRz?VD\O17T3>sV?PqeA!2lF1US}ImY?$&'OۤxT ",~\:XW5ni}k1獁R8pΤ?@-E2]ٽVT(CwLj .vH( iŜ1*1^]%XҲ6nBDsՠG6~4d (?T3CkG >~mϏ*}Rte.V sRHloFIH_e̾eb.*@`ŸU8"&v틪?ldYf:;:(A_,5&@ c,|؎ʡK_'[%늍(ų&l`;o m\~u/Ja^W`@)‡ff`ݮܑa 5\.uВ%!&-alGWUYPtg +vZ8f6}$js96JDKHO"'tY=αPlIQZWxR%*_[25S G: )/x|9;i$:y-L!c;]0;}#ʞTn,+Ř73?*7[d枀cԛZ'_?>{(@7Hݯ-S0c?)O1ިjU(~K`[vmS]I8͡bgwr-r)^ : `òU|Sی†{]Q/IA/9†G;MDӳ>aw?o]7> BbQ°"Z|ngsz33\u?gâOXr9l)!uj]ui \^IGpКEr71JzkJh@ǠYuloCkٯDm"j]c )Ui-}aژxe )XRցǯnu1?Zd 3ϚI+r!pMwf%gѫMtrT3 ga߽qu|P!8AlÜ,aH`&&i*lP¥XWLRėbZ=8v]o#"33 =er'XgD\.zuGҨy_ ȶ,&j\:3$c͘1S KFeLrRm&%^:cSE^ 䝲/n0E]|Ɩ/K*xҧ(n2:f1:_ܶ| ~ܭ`hiln7Ү"uʭዘ~F,3 3o OuBz ӻ¦2@,]CXk>3'A;S}:P 3-O2b_/7GӅ5(-k,uyhQBc 5[)jNX})?LXbo5iC)K6LeG"9ǷIC[ Ү55yaOڶο,/nw8=GݓZVP}4V4nAGO쵩UB۟KD^ #:)02۠ZlB"C''?)W&9>WY&߈S_,P\"DoS )xNixإǰQԗP~p'.^9TrA*͛ru( `\Ug{0>υ| |e4^;p7f;&U+BMWy AI0=;.sAc‚M >|j:D@А!m^hU*XsL(a_n]Ueuw.n / ( 9c+ +w/@DYs7T!m6m`1n!D7Fĺ׭{K9j]w;)gUjv q(ª+0Z)2cHŪٚ֕!O.O'Y ܁-[omЏYS<Ҝ[LY7]]֔\KI )]<٘֯%3#iaĕtH 8z ~V 2"o>/=!p2X¶vTi_S6FxϮgO . -hqe *3X;v.k=~5'hWT~=>eh[6 3kfOS'-wȇMG9q7ޗߖGם a SOc$?uP¡K~Q[D}r8<-r{wxK0Ug%VO[LIQ=c0sĝoYCա8@L|,ps!Aʺ`#H<;5VYPin1AފÁ4ˌ/SpЀR:* {12ڀ@e{p9v 2mHic>-m8B&Ogѫ'VXd>![,TH˩Ο  E_ƆÅ ~!Y};+x"E4 V,mE|T6+jfM4xy'5F]X/uȬ@~qV;VĪoLRK44 w10¼sw%A92)rYDɄut: j&{Ex|ѱz!g@"gb?1*鏋G0ST?F a<P2E"­*Q[)z 6v ` ,zܿѲ״vHWRwL)mX4dl11ʖCK: V#׎eV/OgZxY7z$^O0Fz܅!)~Pa%ix XNL%MR z3Ȅg1٧ћNˇ*}AQ6F\ |&v)Ȭ7^ *6?y' *MsSj L:M)xXbhb~̯sYkirLCl$/(F7KnuԪN]fHWI.5+K.\%sJ- B|GcB`;<\Po\ۖ 蚉nuvoJr^rn^ /{>7xެm\ LqI=P7DF͸?%-]"<ʨcOQ wFO |`!fM2i;ǜrfwwn c$Fh06h 5t4KQdʊye98A}`(0K :|z%uWX /rr,8G dD6>[Oq[^d+ANKhXj4 x'ٿD/}v*sFcjvTXq&$ψg@/[^`ܷ,6^9*`596a^]}4>&` A:oʔ:y9E(KܼkdUV'Q"Np0f"b8{>SM Oh? nLOU/Ufss]&&S]g6JM9<֔kd\l qa}z9JR|)#_JYBe׎@tճOmd9&do Q+68]"E'89=,!sD2$Mu.hWS(gk寊1yh(ϲSI ;Wyŵi d? 04-|Hp%5K7(=gZhLJ2Ao?[%-V"s1хyͻm'Mq;IOIŏ]"%a>_8hh b, aF%&RD w?|uGqu½u]HF v|8t);DA HUB)tݜNm}|kK-V-6^bS G+[8sCvD>e#sX4 ]V3-DF.0rϚ.s8?rM-xgXbhG& imf‰h;J XX$Gk Aen"(Z @#:JrX~t Pp\Ԁ5fZ=Y |&.r +`bڄUi .ϳVLĿw>H)-ZIAi4,~uE`LTnuqx<H|TWj͓KfpUx{L|Hrr (` }n?U|urE1lg;ۀ^p4 #?e~exU40sƷ%kK;P#a( 4QƤL4;d1Xϔd2d$}>s62)u;V2\DiwLvsΔM_|ycɡ'Ǫw TϺqhr6uZo\&klѣ1nR`#<.>~VA}f A( 8Z?5sަ3*ZENwd5̔2OvýR !)al`܊.AZNPßNuH(:nL^{͠Eу$MF= )Qa (c)p#?1{A$HndWß/LL5SV4DtST\9V5k*,7T Zk5oVoPа, ' ?ng1ὁa;AxG\aioB t =D~Ц k:k{MņlAT, xy.K KkE)SJ&wA8!(Ub<s]y1[`oq;M&)J>`A80"[IR"|ȇ၄ K_(4&arC,Ŀ'r]*Ô@MU.k+MjḁyVM{~|Okgt) (m3;'d秞ZroI f  y%4Gx5ڗ#*KrTz\mFmS]9`B22<$ {dLTĿƻأGWa,DžX}%B寒szpϸoKcs-IPJ|#3 "hRuiy,|朝M`2(eI>Max;tJ@ǏkSKs!-$,u+dEbzfbO29W2YOU~ " C/A@FO^Hg|xU{˜7 [ZUz޲`G!1qFjjyWIG΁M- a="+ hΘj$Ĝ ,@~%.JiY1:PwhC%SB|O@%;7r]ҋɒ+`QV,+owη?'@m>^jR$, Ȯ.cƃnIÂSmiD½чCa~i0fwmrHqL]hXXJEyQ/һ5qjz˯Vjà$RPs d7j'y g:4cvG3;pw6C]}jn˕x1VC!! oPT($Gwz/KG1&edH}]K$g%c_h[}b2{1Ɛ,vGNW*-^5aFuX@FV=\Q K϶=n|<fypm.=#h_@q L"XHMY&dF&- $2lF WH&IR:(Tn3fYh5yU{(~(%_* ZP4,&u6FfL@IE&~]&?C?v]YtشBHV0z e5*xvG4| C^}6I:v87 U1Ew,d2::7"ůnnϗ ()TOo~#ɡR3g%{*s11<`5HƻGxhtiYhj ueg~H.Jmy쪷X`,I?YcO~_B)L4nSznT>vf%bD? v#Q$M8!s %26m4:@eR)v(Ml+R!ўBbNO$RTdjtDVgQk| L/5 Ln|$ aH7?'Q>bKU])0ؾUOJv *xGx1`9 kvCdzmO*T<\ݐl;4< {j8 PR2[ݗ|:L' "wejdF2y5hi5KqFwxɍ6u/Ė wtS5 BuqCw?ឬ愭Or( /hQ{Vr4W٣vuvq@X<&ۗ'␩sJMݪW%Ry/7!=>h:NqZ܃jÛ'l|uCVcתDR bc䗨s&\a땂"I(c3wɊ[~Q/fesHSȇYvj=V >G 4P_<<K%P`%[2s*kp9]>lsi]6^]+ #G[81N:F`f(iF5Hb5ݥ>Ë{D%ٌV@YiDN]W@ddzrW\z[Ke+ki9:a:E$2c9KX_hQM{Աꩫtw LBū ^}#LDV]&AtT ʎsp7K5$zX3I7(-#%bg9V[z+U\jw!uUUv1f6ns#@poK+0>Tv09Y%Bvl(Ym /hH>E{MVy=dkZ'_JT;^[-TBqIMkT2kOB1V었򏷀2|{q.I;G 7DbF^t{Eg4 g '^_`V0YE Q33oo {oPLO; 8UiCϤP1@ e~6O{Cxk_NW۾Vr`p=J% Qr{cLJ+w6Fo#ܽYA)rWHjCC8Q*T PaHiJ$ѽ D9lS)fxOH,72ljU`lX\ +a8H7O! ɝ&y}#5/!) 6+`w1{yTp$݃F|=G0Nl;zʎ C0j槗kza /%qNQ=uIaj]R476F֙0H0Ed[x)=}Ph~C6:2Z;ﺍDzjp÷m{ęx(4Gg/`?[PYq 䋘" DGt>ȣ gCv{7&c&B+_(6|BGߌHRYJOF!4 ȮE,yZj[i;![ .ɱ8˦cΕUO.x68tgEV6m rY; G[ՕdkShKV<<S6@)uܻk؇&ic{ 2lhb;q6@  e`|>?#=leai0lX{CbN[qq_Nq+&f6`E$J^ќ! iM9#=k&E?r/5eؽUl &!NoNbWd~+y[YʸQCWtj<.Iϰ tֵ{:tNh1׵Gyђ {^kuKwj}~P3wXZcޜu̼:}sLU5dE1D5vIRFb| wT7 -C[ L+$SqVnW &>X%"wUΤAI ِ+FxU!47(}qӻ5hga>q&DJ#_r]HxDh}5@3=ٟ@mOՇu~|{4b9W?l>uS&lxĸORC3Da6x6$uG+ߣo'-H\̿.LW\Bܐ[~[fo|6x(y98*?vFw=vE@Z.x05ZK1zΰ^V`C33:P4S]Fڀb_*\X/X:1ߵSq`ޖm~+!ȧ=귷픒D \A?1s#F1Qk#袉'ڦ2^O՜]v'I黌<u5_MM^-Ҏ/1Oe?\yw=D,C37r`,=n*LS+a.v4q%ᦂq۬z:sC(g|\eqX%x ]sITcNw3SXbP^ɣR;`6e{:.RnK13].1F'[ E(Q q@2C,Z$RD[ǥE=g%m>d 7SV|]=~ CZ&ݮHw;<)W̑b ߚa#YگC!!ӝڪ *;CL[|׍{$`gɂMFp hQjaǨE 6׭ >4Mrø&e* u PCʱHplcbXJ<5CJjЪD˶?.FKM"Y} D_mlEll*jZiq)V,3 ەOru MX{JVLJ'a N(F!3US{x^i}ф ֺH4"兰 VwҐS8`ͫs҅#Nޜk9g1%95_0}2f.RBIr2`-[7qhwPB<%fk\.2K٥ v7q4n[ {axv& @hXKfvXDlUFڂƤ;$,ڕ77@D(;f#2}aOڸ] }/88UHsp0l7χnfC܂ Oh+=K `y) 6(V]5{ .YQcgxo3pС)iWR9̾]ǟK@G^tCq/{L$r #QFo#zrԧi*cSiDIa 8{?-[So .yAK#YgǷ&0'ᮐ=&|tՇ=r~xԦZSstFZͼÄe,gLqd4jpPK ;&\=5b'Q!- :?|z\wH#_Yݙ-Drp3QȂ膭lMʓq&LZbid$j+dZ]m.a)`W!=p=J/>(l =x=gjy$ncoI%{^-?g Ӹ d{S^ |ص/%{%E?h7'{L쏮KY|rY,"pct8u>J/)? 7b'uH $RslӰ݋w#EEҦO$1yR;S&Wfy\ݺ7gkb0ۺ䓆mZIf)CRj6b޸{.]!wA|o6V2[5Gy !`Uqv8@73ڑ&V;r*"^bUu%4O{ZWŤ"MڰH8q}vJNmQNTͫP?1ۊ+e2 8&ˍ̗CCU_s(LdN`,7*~F12K2[F?k]iݲTAXA_¤Ҹe)" 4xtqaZl!?0J:R"K+1nb8Do_I-qW(IXcd?P޻6.o?b `3d[J-g*iYGBR.ϜK@V9nܰ"wtڎ;C-Qo8j~.H{&qtM,1ɱZMa/KHbٕa:ͻAEB? ]'N|0!SӚ*$E6WZY$d љ JZc*F(HtۊR*rquy[,㘙YH׻K'9E;z}l$iUoO`w!Uke QDi_sK={㴲. +\d3v0g]EbL,e 8σJy“y5_~ρ U vS5 }7遮Ukp kV%dŋ~%%7E 6C+NJg8cEki&^D , sE-3rx +Prkr}mB [~,? a ~Q &6XeܘK#_ۤGy$jI,;[ +xB>$֥44'?mFoQPh5Wi(v5H3:sVp3KdGЗ|zUcIV(Uc!f;3F@JPI_Ę&.?5|hy8~<_Pu ȿ|3@4 (ŐD ?mLܸ֯c'Pfs|BDF= _;yj! RQܤitg^P5~ݳdWTy;ty4m0c}{4CYe@4S,/,scE>MKfF}]g$1^ԧ7mt̀v|ݻFEFD lL 0Iîfegu/c'6ȡ@mpKŀ*E%hN?,!.DK\{_/ïXq]jȓw^oݧXQ 8jю`N8g4++ O5PL^ 䧏!ʍ[NI~ }!c`8=+Boj#S㾤LmEχb슜h'mwL5Fs΄e-5y6KN wNrt*t_|Z;f>Dv"YN (b2>?^rd)uwj@-L1K.zGYʘ1 (N(\1uӭ~V7D c18ɰhq>Z"Ǜ:-V#i?1^Պ}HT%]X/]2Z[ (C;&9EX!@BF+ i·&ɌC+.&JmKWD3L0Ǻ㑝]b5Ć]ţPO{ت̫?{m̨؃Ooō_9]M&n$6i]^\x²H.:j>5Uck뉹v^_9CeY3Dt=5lD>x=9,pVC4nRXo41$aYGT.#kG.^ϒ*a6փG[= 5yLAJc n:SSBMMW~{A4볺؏%*F *.<07+ `ҡRlpjYE<_D:l%jZ>Rd΃dq8~/v{x5GebI1nTnOhP\nu͏@=u@ 4,e :7|Pn"fvAQ9 ykLp=e AHd4C\,c6wX׸\w]zul*'ad/,/q4:򍰎>aA,A" ίU(,)vDTlq0Pu|${xeQ75ٽ 'sr!zBu:(ǜY3 6ebf. ձ}',lI4N| CMx{Fv Co- #a`ŋt.]cѩr a%d?Drxvљn[xa8DgR0%ibg .OL2& _@~r=DR0Q%SVgqe#Tp$>Gv&WaI3A@Ud>t%5c" h~=\Ot[98a_}tSB%Lg8.A7BʛJ㜟B .<ܗ<K =ґMs/AosRX / hX뎼]O,X"C&UB Q [>>Bgr<+؛: ʒ(X NaƓTXONI:̛GE'/Nd6(Dҙ4w%]V3ժpѮt)q<I]Pw"eFI@to|On ]Zr\ yBPe)SG|:]x"/T9^g6j!#*Ϛ^,ҬRWwE1D'D7-T!;z|LYe͠YwFq?ϷuA eʙw=5:wQ^~><3ғVaHu;Ԥ2HךI׈3_0GmYE ޛ_݋0ao`%>)'pM߃Y$T5b<<3,x;<AƢq/=cu^S:d((`b[o5\vEd-d _/>r.r>B#Mk4*AL Krl/n&O(KwzKOwO#p~JDclV#roszjSRT5 Õ-VoU-uS]2[]Xe}KKk5*:3]nP2~~x+@8Dٹ @8#;T_gLQ-R~5H ^ =dTˇ[VňS4Zi'<3nb! OAb0^͡,Ԯp40_$ PͶ/ G`5_JWL2 ~$tO{N-h'5=c_j)ZF8}q3D@a6"Mzpd&p2i2h=4”;12P=g3+›߰t5Z&sJ-Fi3mĸ4_/,ESکmCV`z>ujF%КCt[AۋҺ ZhWHOKɞ$ٲ5B,$-d١r]dwfnlQSv]ڋq c\1{P+ulH.}f "vګygtB֟oiZk餐m' vQVƩϓRyάiТTh?PII'G_[fu{:߯&aCI>7i4*kYҪ[J@_]W!L1"oI1A swQn.4 |8OD)'j볫K̓T&M̃| pqYCdA[?byl{}@L}@ /F e5B"エ7? i5}?Žf^wC1 ]aOR fOn0!Y,eZ/,0U\ 5mpkxcuAf'nZsepgRJ'p*Hh Ihԟpشp(2<.x^g#[d՛l=۰áyb6U.AV*z !&Z Q}0 $`D~G=3hBzͬX{S8E? H,k$%r/%!Fg%C:{rMW6&QGPw^@#s{o bG눆 q8@y;4~7<'2+BU`דcib:`Ҳ~excSK1uxz]0?CR*G)s9vCD ]JyJfb2cqg 2GZmakEa'G?W" 3|.Lə *L3!f}[Z t~foQV"e1:8VsxtVY,F6kLO >u3D Hܞָ[3bèI(s ޑ#2̾q5}oUAz(;!;=pWvy*-Of#wct<T13T72z`өwDIr 9eH[CR**rF/1n{þgkra3T}?jAs}L ??o)h#'&KVC[ԀAw<=9D lU5zL򭎛s<=# /tI@ L"ΎU#vT9^I\.5)exO:33Q^:dlhJ=nPgPIʥuA( -QC і mE2IORxy~fͬTm}eE'($= 6k*  qw=ċs)L<̱u= zOX-7<א˕`lk2#6>\U%WA\pسSu9dZF _HMq}o='mLiOCBTmeBFDo(ް?)INQO|M{ ;TImoXȗ"fF,80E_[Hc-pǘx)+^j>1Ƭu ?IL%;SOBl%^μf' ڃm9JEך(nD33pꕻɽٌ`=ȷ_5@Udy/V"; # mUF/)::,VFdSHrVM%3m5;bp r!}XZ!!qc5uW.bku2AKNd&`X# `6a8 Qqmv_|P*\Fn-`3OpCX/WMT0wbWo #]OX=) Rq)졣}rcKџBTc4}aZj/~i8W-FE;2hr䁨%'~Ԟ<|h\'[lk2p`NAw&P> no=a$K0;:`Gli4P+DXHT KbVlv*ZQA 75/CTMpQ ZĦVm-@u` }Urs[NgI UBvP@H.<G´@ZVVXeIvGTY+dpyYs]0E y׿J%6gc?u 'kkӺq -+,zz9##W eE?/^C`7E9{`然)-_tUl;ѦLNonN#cItuo 8ˇ4jqҳkaJ лūE*M UKt֮N%,_+}qM _?o:Y>hwL)VOɻ1h2=N[(KeHub4V ?Zl~qW"R.C0`sg:gȉ\+C5iF\LMQW }qG!"8J~J//S.s5r.\_ꃰd.QM7R02B`5&Ķׄ!@"% kr0Gh mxEG>>iWr)Ny 3G$_f;h_xlV6n\{ 90B$Mh[}mu?4ROsaXbv߆:Zu0 ]BixψKYd/VYvx=\Iv {0y=J?m:4ڛ  w"pCE'Dz896b5 <1#G3"lnY kT_ۜg=0]טN<al }}97_^0Aew0Q+!T;̕9nqjJAUMߏ{fصN2.`S@/ޔn;ͯFw ;ӯʎ822V̬G~F*FJ8Z)aZIm@Rl\NfkVu ?lJB/]Sw0khv03Tbͬ6©6V#RW=TsgRB:)WvkqlnX#R&9u] f# To*3VygemJ[bPV^b\>3#1EM+ʼnt,O=7glLR5I\魦yT/d .ǹٚы;|{ӴJ> _>]GhM"J_t<J!~\/(Ċ`7QwM=L\($dYy⽛6#E-V~ ekTni۹ۇN='W㰒bűR&H(R;Y1c(Z.̞CbjN/*[x>=%sa)ƾ$iz=-IAh.65v:Za+O!ްamOfB'LNbU3UDCA4u-8}&AF?y~@ðwY"].7,{t3\XXPq45d}@gS`[;*3=@!߮ !6 vw,`x7qJmOӓZ8Ľ~k|4!3vx71ˈ+Q쾻3@!nG;z]w|SJă3Ȕzb):q|e#+{HQo_ 4U#:ݢnCahvB=YZ^~mul:;'4"w¤tJJ:{}$/u2A:Ȓ裙L84鿢xk7 bL`ˮ]cV|Üȯ* ɴcd@RL0W=[.#QI4mD'gZTчrhU<]s\ʦ~ѳZT1_!M12W4uO*$Q$=z56ǁYgp=ṋxC#\<B5mߺg{nˍx0e@L09&t \Rhc?y9 ;es-c m($1"bA:j|qO~,` 49GTRakhИ! Z}c=gVV1Z$-RB\IӅ[.H_ڥWBDf$`NaT@x-}C;*}5q7I(SLgGA,p'!:B_Ï) PQ/.L⥪ FfT^BOy]ms>}@8iwCʡ/x@Ps/ѯ2'zrX]8t5%e9z|]kJS\\;M@S9_2_9e|vCC8o?i<ݕք刡uVNFO̪=uPx[VKѸBe K,sSjh,J#J=Ve0}~%= _^xFOn5%)$avzق˕}0,w^ ,[@fn$gt)j:K82P*NxA t>( u\xe,͟ N"/s85\r9j姯l|݌蟧M]#p~stm+#cUD! _ɵ\d.J#FI}Q')0 ˈF|ӯL~TBr(lg|X+ЉL@ih'Jd{sm. O+Qy߀Kay/my >h/ЛaU\Ax[QC?Upׯ l/Ȃ 2nt4 vH͔1_WA<j˒+ }9I?SSFG,l]?z/c!r~=5vP짋͗ =R^,B#dô3%"! jyX.cOex&>3>J`Κ+@v"YpF?7KB@ 1[0)BX+Ou5bEs?Py2c!%+lGs{ y䌩< Dcg\T UTpʡPSá \톿k[+H|Od(r&p=AɞV+\γo @{}HU0UXV @b 1*mE.S}ٝQ\0+%X?Nf0yfLd@t羟"]ޟ /ǽ}oçt%#! m7)C fFIJ VYlj1eWWD*_bJq4,M4օ0Zk-Y UOldqqyHLL(i:9vS\zY%GWq b!U|Rsb$B2}3nF#geA˿o<޸ַ J .=y᪓[d*9V8tl^фG7 [juB85Ȣ%c˲pr`mTNW&fu@[uKrяCߜ>#s:kx=P l Iluӄ,6^oiiiu>hԵ&GutG4ش^WP{MBBAE im`GR8^Cr2cFrT DXl0/(K@]V.srv5bmrʡav}:₦g/ H֘f!*.j6T8S`}2u>jPќTC\i&e1/BfFk l.;?nʥXnw6i7jr<ZL2ZRv50Ch'[ɿM5\:uZ=4WeeRɜD(vǯy2m-eHi M Nt<"I2Hw~ @&/ÇC3wypfTxa"SFPA+j%p΁VUKԉdtN~<ЪB?pm8.Lr,-cz^ў8~!-lt-j=$%u!5NHgԍטSNoO a|em {G1fq!ՈB_?DcŦ e*X˗N>Aw/Ґ&piLʈ#9`JַbUpx9Gds3kˈv`}*[PnGDuW. ljT}vW=^{?⓽'3"mƾxJUgN [TY# qz-ߢz6FQ歪skJ89w: OQ&\t s04̸HUM3*Gl+%' I1L/ID*/Íʛ j[Rւ1Y{rC0Dۖ=8vݳўx*dǬhY݅CJw`||_EHxĪ?J^#LM݂FI&:׬nqvh af.RpE!,LոZN~X_yCi+E~[C &%M2#DܴT*>hyv4ȶvi R6|q*%)Zw.;HTUũ[y*8V_J}O )$Iԫ لY!g'8e ;w^b >sJzk]k(G#8k d~m_ !MFcDLM"Oh*Q3JY)C.u񸫓a rQC_&Kb:qx0|ҡQ垭_)P?IqE.Bl4K$ރ1[Rϓ}'jy -"lzY\OvN" [R0p.ZXUM5>bv#nuJ'k7wc"Pm_hJ#˽BG8kVEݪes¨dfN~ g{Řdf y^[Į洜Ҹi7EvN2ζVT&[s`))GD錵P4 W_8K 8#|n5q}E\^+ekyG lҍ:Y\hh{5޹gz Y[`(?#bJl&2%?CuseՏiUkHLF 2F(6 - kfX x8,5CV?l\ r8H'y֐7l?7۝5*D- ms \p'Ov yxN"FaW.Zٛ2E&f"$o!z& \6W O\_̹"47ݕus_bTcbB^O@۱:RW QPcT_pkNVy"D261컒!O@VP3h0cd :P,5_D{g:v*IPȼ9bU]5e+0ɼ}^2zHaE'`R<;Jq׋+O WaYrMݜo%u{:,Ų WޔJF5qm[a]aęBF\9G1ߟ5qov}mAEϖԻ,)q1sDti_ﱓ8xF^gٞ4|Udڣ%9&)Ti~4 -b} \3'E)EtfelԮ"`S.K]9L<[%FkeW2(f4*)[3w4$rKi ůƻa [Pn]V Hf.\.* }7~ZVZXu;l  r.25+N*BfU\s\e8 715[ AK$vA(EI X\.MZ?Tai׉z/_݁qDs#_@Z $!/p+ʼnAI:3ՙ4EFoBÖUzCܶX ڈΣUv&Oy>t2XۻJVNVU` WMxX2%Z#"U ܮ/: x~.7=y|Ѣ2"zrsyj6fu{Tzm u(ʹ!*F9J-sCkOǘ9&%*@^C7[_ U]ʙ']&꒜@3^^[/[ܔ b3.NP$>9$Eto7<+v2$;MUs̔d5ne:- 2ج(у nFĞH5yhlrhsg-:Ҧ JYD&O" VmWguz8E]--lRѴ}J9e^͘:`fPb7[Eq?3yD#ӔĽ%ߒmΏ95uvWLdw#Y1fGPr'#|_x:LhH93Q7=hgaFUخw6KZZ:d"vRRBMϐ y;#h /{KY1WmznqDbD-Vg6s)X"牠wIjtk)=eJY΋i_F, ̳˦*u_ T\o 0AfH Nk4b)Ǘ1F6s@L/bZj IQpǡ[%0ȃI5{OAю-~ ΢.֡{>oW0}t+qS8Y\`UЉsJcݞctaS'6Q8BU_ {:RAaS:Y b=.Dw֊l 򛮭oPt*xR3Tr`}㳜V!"k$]aJCl.}m;gJّiׁ =]"̸C{*)BԖD)"߶F}߀.>`[n3qkMPR|!ٽ1fɛK4;E'yU%DSm@1~4+ua=(_^+V@SSCb x[mTg ʼnxOަŚc@цf̉s3!c6C><;V4XɜS;*a>";Xw_&$ڑym_,41ÅO@ :P!=-E~#Vq0 W$<7mfW>Z@ AcGdD5d8e zX]ϣ5G..T{{DۆEx!R @MhW{F*|\NzU6ff&s//ϳE)ȴ:]=jaBmg=s1aHSk$MR*!8e] ZZ,sC1[ r*qgeU3%Z'~;fܤ[,i$mR oP(>x`13TN5lt (eKIA"hK['@ l jtl!leߗ R\jQFDvcW "+ pRN$VrwtC`j^dz,_ y¼Fj]|pe_g>`<=>]B1ޛNonlɐ fC:1w>- JRhmT 1u~mXqX\$n:vFWaz_ΊJ˜7 <3UN i1$_˳]8 a^,,1@JY*Mohecw5JTfʿ!{k_r탓 ] 6A3UCgޏ'=̑/DIϳFw3q!*Nc^8C Y8{^_aHRl2fBNBc^_(Eu{]p'>«g?/L|{e< Y/oXecc)hƸh^Ȅ j@L"XpkcԂ0+.Z~=}KA>LH; %'? k>~}d™!#*mC\1%kYPR}Fw"u پIh9]$P#99zHP 79,`&B%ùV^ajƓFF{L'qoяWbL6"1T뗩n*%ԞsH-W#쨑+(EB;YTؼl. <6Aq IٴkaGV2/@;tsQj~?A`/Q!X*#V -(VO6pmGOd#:hS 3DRjsW`K`Ͷ^^-hIO6 U!ԓ4 nkRJٯ)df(ŪfnaI1pɂ^Ou4-s!):(#A/8{A`K ]ͲgOcL5 N/#Q`VseW v$yBp֤rBOQ*8yOC9o,mܑdnVBih,\f5`&+19i ZLvJX P"ܐbZݺ>k|Ѿ;2TREh$ҫ)-7Z^ ])-ln*#MF](I i, '݊ݜgx4.>羌z~\6;9HIg_WQڔha*) PbJ3&76u*#uFaV&޹ΐ4Q#/Y&~ *D)ak#a+Cq@.ڌ}_am Hgol;{ME|לҜGĈO B7jD]{.ӽt><N=LW^*o%Y+OZhC=" s!DD粒u;s,q~ w_uK_(ܷR9o.ςLP8AC&?ml[`SVͮQ Yz^EV5qwO\(69UDG1,?O<Р> g[tԡLU4Ln:ZZ/ !JP+R򽦮hC1{o!a`$a Eoϋ/BWx/ص@Ȃ,Qxk\m]/]]fqYpFdRy,-RM{4ռmH }ySv߂vS$ڃ'P1GQ6AƂV4~Gd/zdgg2~3l8QWvedWd\8|E*^{`ҷe<@s9/P=e=sՃ !I|-W?Fı!xgH9KաԘ5u2R醸~ s(%L3l`,ͤSt0TbgGJea3_9 u-2*{s3P {cZ1y yVPz+2)EOZISUY Я|5e<,3*A]%њd*npvMcjDR#ҪnYAwnڴ/fmRVAH&&@!?=q"_9Ud_z9f<[oNg1*hQDVw/ e{)}8-tz\T:֤dJ,3罡WtϪ+ "'Q" 6>_& |_"R#a==Xs [S[-=X is3G9^9 ͻU+ тL C[ d:][4%]xBL6{atP sg8$Z,HtkSt R Rf\oO-FENHk ~i?UTmJ5{JQ0(wh[#ti3,NYe=: }eE:8j\Ġ83VbP2_$->-{ XFx^[6:iJ7? sãpk=۱o6q.&qredGew950AmdNc>=w,giCȰ99Hp1RCm͠/< , jkYjV:9I);r1_>t\W按.AZHٶR W&Ӣ{stn~*<FW鶡hR)uOݼ>F( <Xnl-ctb3=c)!r6:8"XOeaJ,r\98!7ua ˞MF wgCvX*^ :ZHX#C&ly D!1;'^8g<_{ ն_v_{ݙh!3FUĬ3\Q9Bb us2dt^ pb4vI)9\K7 u2 1b%.ۇY<,uuKRL7q@OTsFi#1kk!|ɝ!ǘX 0aOV&,oPrD^@~!4udaLWmEJ)=:UJj?`Hv`NvS6YvrԀ#^5\qcUq${~DU;0vHzzW鵔 ְפZ˷aM# bK]u۩9P;7Yۍ݂PSB@_'t_9XH7 Ô 7c{ g(A=oD>O8ȉMK0&r~0\Z0Eh} 'o7G)ɡVN d UTS@8=rMhdX1s,&%G,: {f^֕hśig{;ґ죛>q-fPF;F1/PË<-Wi*b^ *ٖ5N ]#)$!'XIӝ Mc9I~NJjo!fmh)!Ψ}\ָ8m"#k#9.Cc 9uʙ*z@ D V! 9H-隟-F:BζMMƛ?+uݯE'FJE( rQE*U^PK8l$.qU٫v.s({_'D!$gCuA0u?DACmksk8U,dgs#{|eY_WϿx3 $ҝƏcܼ.Cxj30U+ Kpk!vk%2p;ctgjIT9kݎH$m (`e"WHBw'cH,Wzz#}8u9Cf=%ϸ`ڥ - .}!- M59\ VAe6l@x'tW0]ipqTJ|e@Q;F6#jIvQRpykSG r3cEy : [R 0CStRSZpDob0;^^Bk4sz\wEΈDAd է0[ضIFg% A፡P$# T IJ˛p՛fu߅L٢?6ܟMâ 7A /X5rx ITy"{Uo3V]}AYMKU/%gSyyKgFPn7.%|r,̒;õ rظkj"4Vl~l-R'e؞ G۳pDD}@N^PkgƐL|6irX؊7=$D>&%bap@#?(9 c? o]XMR Rc! T&ymIe:4&1/0YKgYyޙæTI.ڦ/n%J:ʀ&oYcg.y!<('>! N)?¤PiPa'|KY@0}jM L?i}[@kﴍWpxjJ mx8!n5R*2Ιhkޤ Ta.x }L3^9=0}>S_H* b>_M*r}XSk0#^pnhiZ϶Kr6OX \u0N Kl0<8OûE:۔sK$dD%AAdؑGC E ^q-m M;fA,$X8`Z^J| *5Xp m P SyNULaVKگl 1h y]ћ pI }ِC8zh1* k^9 7e`̆W3RpLm\ۧ7:rFA+,/SӜt;5޳ d"ܖKFT 8'd3/{J򻅁l{7`f*] w.d&(hYmSn&qYrd+}4e7~NsoB|L0>6o@ߤ1Kh(: wَ3 2׮i01eD;gNX]POpvUDyUDAK>a Djrz\~bw^Vh&~/F;>Y tt#݄D.ZTe'8.x.$e. ~`vfRUs`M}Hb:і3_|s1+iDsMʶ9Q0oLXig֮\&Mg[z5tm()6'eY~}>۽N˰~Yt3wS;b fk I#0 :_fkGlG5b']ńΦUTC7Ig !TĀ_ 00Ue{Hm}.ODOrS[LzvLWueS0{;0mᒱk_Zy < 2 ]0OnĢD\3*Bzvl[sJؘӎxO R`LA˵"t.HT@F>?*>5!b;VG $orpxH3t`&R$~AHA@ 85bt䕕ۊ3O+r1|mV X=;¿d&#.qEF[g0(b[,@eA5*>e2dVJ9W i# We;J ߼uƎ}79Ρl57X&C Po/cU<`(݁gPI̒qv9B5n?+u-7z[p6#HȘ zR|;Z"B JAjJP՛7I`~ҟu :t(8Ի0&e}GZ>ZM'tatP}v0ڕ\4R ^:M=^^8%$T~k>U޶eӕT5bDA_;}喛)n~ґȰyb@ eޔMpe0Kr.tU׏瞩2]\[k#?<.§>H>4z( p_oETL8:Z%ܹg@d ڮ!Sfp~s_S=4;Ce|N$>h;?Bm t9̇al*fDa x&~.HcARkIex@zɦ' Fg%bOByOBt#ugQ fZpvX؃B#ԁ-`V^ h)* !Z"m$=֢Rߞ~V>r/ki3p~۫7Wn+(ˀV)SI3̴";o)$r81nN'w2" f?X Wjc'=f=RAzޠ/5h( 2̱U #67w%Œ8(o՗LN+64kWpH6\q sY4p:h)2$Y+M %@ !j!+f_NM ozkT%G2.6;<=Ú铷suNrv `s/'EtAqzvE -! A,Ŵ6P2Ŀo_+Elk,~[-ܾsZL"9e0rj!GYVN/tR˹4Dlnn1^uѩ+6ѣ>=WN.3&Z$mm:@p?3p6)p/o2;cDzuKL!SW"$0tUYДPXB(CC)yՂݹs$xFڶ* ߓ1/@]Si’17a[=Jf(̆ (P.Wq"1̆-*XwW?[¯:m2g Nik\=a̔mߐ蒀!,rsvO('^Ys[Ք~qb|~\n#^S1NzjZM8]x_ݢCtϮJëdZ$̍rDBS)--8SǴ#ò* r}`KGւd-S>Pw\1[,<㳅{{ni*2jKFg#+m- d\%{UCj A,uwN<# 8[eyyҬOŝ\d zɩW0 1b fՓs6&ʼnG|#"FF KebS3Yՠ1̈́\/t;c֮+,4C2A/`ϜA)JV҄?-\Ndt$&I(N≶У$"X3PcV'i֪!ltZ ,. zJ;kxGeUzxMm3rb9Vy(? ݾnR@~JfQA'r44wD2< #lu--w~0}mʢ˟!Hi޿ڬҥ/$KNrp `WD4HhFX}k"ϠQs[m $*nxKߔU["M8 ZQN0[J̾zV 7o>j<PF lj}]l t(;6()k guX_@)xbgX!A~ٕ${2{ n)yoo9(l1W:{.9]6牕e_q럅[ҙ1XkЯ vqc]/)XRP=/B.Ÿ $R^y}o*=}Q3ot23° :TC@M?f4S3&P] kR'c1Ť,tTa=q>kZsK̓dd e n,@Z2UP+>!e c:wy$,H}-yeY ɕe.C".{m8d(J]0S.S\P5P叠4 <8&1`QTF| :=bJ^ TS|4}-(h^4*&I,&Pi2YI.kцRօx*-@D`&pK?)4oB%=)>S2`;@}9q}0*'*Cnǔ=-{YK`ֺ'_j#a )CP?Ţ"%_DAH& `h'E'VYW0aq%TktvTV=Eok=J5GTvқ!DʦrԈ)Լ8ڝR}cpQ- V%jIBZCU6;QD%4n_k>h:Z͈Qȹĭ.8kC-zo /( ?<[W26f|Jstnv? Y5F쨱}*8>z^$Nm 4ݭ8U"2p֎[l*3O+in~:1~M~hlk#퐁T/<%ThJ $гmE*ѷBCot(+6$Kh۽\ϥg`až{Yѓc}& R`Y yrC#]9dK[/MHZ黊Y% G02#KRC [wr'cuqZW˟Z_Ĩc9%0"HˆTqC5Ag|cwf \P%*3;x=e~¢Mk}L`8:5T;$7KmۀCR0I+,NnS.@c+pmǥ492dRdj#"QKr [ClmPӠ {-*r9lP n-4R@{Kzs\ݰ%.K{%% )FHO9H6 Uj-wdI}5ƍӇ"ɔ>LaRjv( <^iZf ӁchH Š5.er/ gXՠ(AHhc A#݂/=ggOM${tC04rpO^j:i`k 4FBEd۸p¹W0l ]f٦ڨ_q)l7P% v3+{N(w\<(] bO5`*59WSc"46oOΥ!}:oJ8!:4^J3zՈ+,C O!F&&~H;X mSƣUAGklڜ;GjkwlCBND󿖜,Y#J%e\~8 | n"g-44)  SO (`Sv|ulz#}'SzUL =Tù:&|~1azArr Q=IPZ(|B2:x5(A-0^m;y=c1a/ 7M&7$ko-oa-RV=KIrP(W~` `WE "nTN}>TJRf()3{[eF`\zv+ nX՛r(| u%V[Ԗ}M` 11؞XWYzɌ='ްP9n^F//¬p/Ul~P&ǎ{(ugC}_}.YK$a#K6o_8 e_w kgrA&qS,D 'ɴdѺA"ܧ6ZwlK,**&*L:'#!3SLp+ֲ֚f̿cE[ѓ7139çMy7a, \)*pvG}&Եxc' ez=bo`u?UEΔX$?gk}^3iˤt4g" fZ2L!].FK >k/65ϸu'[͒}_Zco5ެRnHeh2\A$#0*Ĕ-uz'x(p'%moD%5_nidaΠb*ʶՋh*8ϚsJ]<]Dy3oJ!BܙUr)>iѯ2+Puµz;YҌ1f<&F1̫1M`g8-'CNj^ܴ3 MBبв&jVrR\|omZR@r0B"5dXD꾬>WB܀<!!9Y1n3 YF-y4V鑆#>e/RT9E\&m+!n! -FPVK-%nx4Fptϑ\(ppU^}EϊDܕ tB\2HmTtEY4?g<ͳ$ޓX97(?/ [-Nd[&uOF4my!6"SaδXvĆJd/b ټqnφe^q[c3 ;FErV@t uvf[uV&$j6Y;U;p9k[i;Q?'Z\Y&zR]%ʊ4kM!q` p*`9#8`=AfhKNQ H_f h(kYڊ}G nsy0zyYfǺ@rwz!nqYr$ KUdͫ. ֤Es YeHowыy/Hb8M)d>G PgI/ۙ͡vOWoZH8mvV2w*Pyl}&|2*s%F3Ѥ%ƫݠng ݟBRk2ޜ5KM< Zm$6ax$^}[xOW/.x}cRV u8cYBI>|OA3f(BOwho$SSGGssI t:nyrJ2Q|Ǩ7^/t,, 39@7mR9Μ$>YEeUl܀ 0Y"C5lo0[go\Bꩼn%na"3 3MX?Z&l=(PEM+We&c{Xi ?=p-lvԜB\ Әa4Ft@~u$)8\6Z">fTKcՇ][֖YZyS y@y9gZK pgx)ua =j0 [>vv/k:Z:gDO B(L{#cI#Q9dLk'4Cp p](4ַB6VUA3$A':y(Oՙ>U#Ul?ΚLjܪ\cHP u+ێ4iUHʨ4-{҄:km66 F\ѨhdH-HTt]*̺Ϛ_Kv$ijH ׁS7-oYO,in+a؂ x͛ՈoGdcN^5أ;? >%?l1w!aOmuiӛnGެ(N_Iu_'"IRrn54 ǻ÷(Q8:L~,T{Bc c֞a<up 0 M@q]HbG`vě +m9a۫QN Gt9.:w3+Lb,anR]lD3 QO~H!k>V,nN{׼:cV8)(^=f~}eYmI6pQN$ ?.,:Ƿv4$`Sɡ8q iW`2PMcJAPxœ*=)Z$[f,p~8-S똂KLa6П`8[l:|h xF1='f?gN}B śHTd9]{r Kl|ȿϸ6~sUV#]5* {RpX*<:iSlqL :5qg&;i%kRnɓڇV_x5Yxʼng-˨i@H=>le!v$Ȏ%*$ٌ&~dϞ~Cռʣύ< )n0=83ys ض ,==aN\S!dzJ݈ĒZ9N0IK[i(BwQH>YbFHT%EHнDa!sDk1Y|T*Iy+JXZE4:⣌`LϻMP6#K~Yq])ZVW,fgș < 6W<6β@/seqJ~?dK;~P0[ayEī)/y $-w+oYk{\.vInևE<>ta`F-8*οFD]w +}Õ=L)9~BJe,: frP~&g A;AZg5vp=7ՇL>|Đ/vl/z=-6ʦAM; l#U;Stc꺅e!:'@y>O; Z[G|ݛҲplLKsjn޽HY~HH|{vEzGUMn®/$$u7F-e^ 2}G: 4l׍žfj)b e?рd4MTs{pЩzh Du">7Clq}} ?f3߮3-ZLߖ_;f jB-3fo,zw2[ђwܭ co@}jЏh+? NGtF—YH{լRƎDbsip{QEf qJ_]4|ӥ@D>9fTr*MK)= M0aB<0JDfc%eFYCֶvuaSđoHF#!<^z  g Lb I45>|Mh5mov0ˤu$gdd }+3k1 .[tO#*6eY5\dކiPGeW Ɯf9w s~AU8v Wh\ͤsA&jB@A7B ś?%Ƿ43.,369VzT amO*?*Nng7, iKtv#E Nrnn0$[z̋GUX?>N,PƁBt \-͕ZazM)JԟPtu$NwNgJt( lMu1C%1Q:~< @e lUiP8gTg_cf +/̋m=t(PiY9dT@Z6ZT;pTi/\Wy9bI+w.ospp*'v!Q&2՚ں!5; hyzˎPb?go zc箐>>˜6.iF],a Qخ"8ݬ<\ ueOF= ۰ h޿&خq#RC=l#~k K-'JY lEO‘<@ .>\I"t.L@c5si–a,{?<{A7^;~?:KUgjO*U m<: <}WAJECKA%#2(Z-}_ 7jS~Au,dtķ%ei eE*xwxDg zw9mlB)2>u˕}~dg6۪eI&``q>ab#LI%cu;k$Rqn+3Q nuFbwhp%g'6.HVs]\?i(rH\O-'~'k\(Εp@djŸ߷ eЏm2都<}s>{7 #Erd>l v|]IW CDv Ah6ƜυF` ՏvV*Hu0GE`ETTzd_@gidzœm-n2>1؄: @y$ mePRޗ$!O[GHFEU^*ޓE_A+Z6npY|&+)5 z9eyF:V8"\6e1bYt=N#|!^Dά) pVL@Ը?u UG#0X@y\*I!B-i֫~z[ O)wyӄVŝm{i Pb; E lʻuۓ>"f%ZekOel(T#VGr~<V UHz*n[o =uLx,my<&doھZUGq(L)!CgES{_{ìGMYtMQduCɨAh~ Gΰ; zcԁGB ;I 6FɎʹٚYdtWe{Rӡ,A+@ШOh)0lj{@TZػʶ ׍T(3ê[K_,UkH'&GQ36A` 8z:-\n`$hRz| bE((7ả>Nl}mX6VB:˨aONr>lRO\Mje7[ mNr'uc~]IxԁO2Xk5F;B|8ɞVt|R߭"LЊv:8X!Φ[t:qr+*i_vcW i;E1g;'xiz[#-3ORq"3M31}vkjvCׯyngr εla縐{@FvxJ5kd2xqVeUjJMsH1oR΋B<lՏB1o'GH%AI-4F4QxCw:v-U4/382wI4|xoIEz Us,# ZA`wK0r_}@+ H -: 5ojPtu^=|G BHu;-̄-"2#S[ڶ9ynp-?lsHvJ%PI27^MMZˀPЍ<'>*^fVnUcܦ1 I{učqCp\>-g$|\ɾnSyιcVZ]ʔ\nfR [@rSr<@- ,< ha HTo}ك{#c(K7IJT@]1)rMWtj+++ |L}u{Nƃ]U(}֞ƋDo\TEbBWBNL 7ý 8lDפGFnxOY1\X6a3X@"oȿZav/d[Ks>g= Za ACB\Bs(/+ݿ>WJc×`y;B*oJat_W7[GH{ފ?]2]5B|[|6,U]0 Kw:c`:?OօS7$m s03ƕ=@aq#zZ_A=ގBBՃ6_bּp>j$v 'P8G"ݓ_Y Zg5Rdz{˖L٩~cAp>wH$θg_uDx%}戌dS)'.Ek~FgQzd1mDs=萕?*x7ioڭ=+XI@S6[bN}{}GKKF;9ԫgVzj+}[v4(z#Hpls:b&Á-xoV w)H38Ü*i&ثr!z!EʽtuN87|F+3:xA<'ۘgbxz NgkKikwv1qPrGu]]L+8{]̱"SR!M?~pPŵ"v'~sja+(x@+kiZ@= M~87ME o#/n3}Ao/C/T_sUtk3+j!vTx3ԲpNpi=ܳ/@QbWP,]x&)$ ?а/v5@ o ďN|66VO]-8$4ǿkky`>f=`!$~=O P Ui*M27OӣհWnp&RN( ̢hbkfg(zRbߧ/;wjepxK E_Zn- T/7Ur; .'RkLD7.NbAv x,So)vO(ɑ M#*l]LMfȑ3ŠCM?h;CpiP?~> A7\{e2$I"ܛ|݉RoiTڐ+8|Zޭ@GYӖiT&;ZV>( i%CG5xhӯJW,_rbj>Uo3IŮ  Sr@u;^LYχ\Qt,^—C!\8U4^%D?(,Șيf)^cr~r NIs)ȏN+DTo=_^wᝮY,SgCk6ff:$47>ݽmLhm7oU+ppFHN:Uhy.'Ů7LTAgo+>rn^浮J6vk#ڊh()s5\7'~IȟE AwgYcl . %>~->]KG4=%@W\.q"Dfa=ؽbfvob.L!Ib5n$*&^ XݧUXic0݌r:آ Su!*>P=^aC.à HjuRĘiQ|9J1a#=*l`ʗN:\ub)Wտ3*?ca'E~a4W4ץUbU'Ȉ#@hhpϯRCwiU zv]3r'4ԀA|>v--|SS$ap}tQţTtsM& [?QMg:zܵbahZ)Cm%<4:C|‘sі42'kM^M ^6zg0iᄕ(+EA1.ۉ`hwS :U&! ҰG٬"/BBL&? I977GpkTEךA5˓A>!F9ReBh %i)34C40)bMց(E @;,FQgZTnXhT!hw>yx Gd;xVЖϼ'!<1fF8-UJXmK3V7_e۪s.NP(TvAzLq{y% @ @lpA>U[_Klts{lXJ@?0d   $ C 3?_el / N ( < !d Hn LRZbTbhh(ix(k((k8k9n:w=EN>EV?E^@EfBEnFEwGEHKIQXShYSxZS[S\S]Z^rYb}c~~d~e~fluv@wxyz\l#(Cdracut03749.1.8562.0.PTF.916376Initramfs generator using udevDracut contains tools to create a bootable initramfs for 2.6 Linux kernels. Unlike existing implementations, dracut does hard-code as little as possible into the initramfs. Dracut contains various modules which are driven by the event-based udev. Having root on MD, DM, LVM2, LUKS is supported as well as NFS, iSCSI, NBD, FCoE with the dracut-network package.U[]sheep13#SUSE Linux Enterprise PTFSUSE LINUX Products GmbH, Nuernberg, GermanyGPL-2.0+ and LGPL-2.1+http://bugs.opensuse.orgSystem/Basehttps://dracut.wiki.kernel.org/linuxx86_64 test -n "$FIRST_ARG" || FIRST_ARG=$1 # disable migration if initial install under systemd [ -d /var/lib/systemd/migrated ] || mkdir -p /var/lib/systemd/migrated || : if [ $FIRST_ARG -eq 1 ]; then for service in purge-kernels.service ; do sysv_service=${service%.*} touch "/var/lib/systemd/migrated/$sysv_service" || : done else if [ $FIRST_ARG -gt 1 ]; then for service in purge-kernels.service ; do if [ ! -e "/usr/lib/systemd/system/$service" ]; then touch "/run/rpm-dracut-update-$service-new-in-upgrade" fi done fi for service in purge-kernels.service ; do sysv_service=${service%.*} if [ ! -e "/var/lib/systemd/migrated/$sysv_service" ]; then services_to_migrate="$services_to_migrate $sysv_service" fi done if [ -n "$services_to_migrate" ]; then /usr/sbin/systemd-sysv-convert --save $services_to_migrate >/dev/null 2>&1 || : fi fi test -n "$FIRST_ARG" || FIRST_ARG=$1 [ -d /var/lib/systemd/migrated ] || mkdir -p /var/lib/systemd/migrated || : for service in purge-kernels.service ; do sysv_service=${service%.*} if [ ! -e "/var/lib/systemd/migrated/$sysv_service" ]; then services_to_migrate="$services_to_migrate $sysv_service" touch "/var/lib/systemd/migrated/$sysv_service" || : fi done /usr/bin/systemctl daemon-reload >/dev/null 2>&1 || : if [ -n "$services_to_migrate" ]; then /usr/sbin/systemd-sysv-convert --apply $services_to_migrate >/dev/null 2>&1 || : elif [ $FIRST_ARG -eq 1 ]; then /usr/bin/systemctl preset purge-kernels.service >/dev/null 2>&1 || : elif [ $FIRST_ARG -gt 1 ]; then for service in purge-kernels.service ; do if [ -e "/run/rpm-dracut-update-$service-new-in-upgrade" ]; then rm -f "/run/rpm-dracut-update-$service-new-in-upgrade" /usr/bin/systemctl preset "$service" >/dev/null 2>&1 || : fi done fi mkdir -p /var/run/regenerate-initrd/ touch /var/run/regenerate-initrd/all test -n "$FIRST_ARG" || FIRST_ARG=$1 if [ $FIRST_ARG -eq 0 ]; then # Package removal, not upgrade /usr/bin/systemctl --no-reload disable purge-kernels.service > /dev/null 2>&1 || : /usr/bin/systemctl stop purge-kernels.service > /dev/null 2>&1 || : fi test -n "$FIRST_ARG" || FIRST_ARG=$1 if [ $FIRST_ARG -ge 1 ]; then # Package upgrade, not uninstall if test "$YAST_IS_RUNNING" != "instsys" -a "$DISABLE_RESTART_ON_UPDATE" != yes ; then /usr/bin/systemctl try-restart purge-kernels.service >/dev/null 2>&1 || : fi else # package uninstall for service in purge-kernels.service ; do sysv_service=${service%.*} rm -f "/var/lib/systemd/migrated/$sysv_service" 2> /dev/null || : done /usr/bin/systemctl daemon-reload >/dev/null 2>&1 || : fi mkdir -p /var/run/regenerate-initrd/ touch /var/run/regenerate-initrd/all /G\ 0#lv P46XOi>D/)?nF r=Li ~/A'w h55 _YFM1TKR 2 [-4OqP7 ~]R t1k* aA, *9 eC H |6 w ' $5S @4XVx]NL lc#g AC$qNl}k+H d  =79599;88&F~:Y 3&ghaglgf+NA큤A큤AAAAAAAAAA큤AAAAAAAAA큤AA큤A큤A큤AAA큤A큤A큤AAAAAAAAAAAAAAAAAAAAAA큤AAAAAA큤AAA큤큤A큤큤큤큤큤큤큤큤큤큤AAAAAAAAAAA큤AA큤U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[]U[] U[] U[] U[] U[] U[] U[] S)S)S)S)U[]U[]U[]U[]S)S)S)S)S)S)S)S)S)U[]S)S)S)U[]U[]U[]U[]U[]U[]U[]U[]S)S)U[]U[]U[]U[]S)S)S)U[]S)U[]S)S)U[]U[]U[]U[]S)S)S)S)S)U[]U[]S)S)S)S)U[]U[]U[]U[]S)U[]U[]U[]U[]S)S)S)S)U[]U[]S)U[]S)S)U[]S)S)S)U[]S)S)S)S)U[]U[]S)S)U[]S)S)S)S)S)S)S)S)S)S)S)U[]U[]U[]U[]S)S)S)S)S)U[]S)S)U[]S)U[]S)S)S)S)S)S)S)S)S)S)S)U[]U[]U[]U[]S)S)U[]S)U[]S)S)U[]S)S)S)U[]S)U[]U[]U[]U[]U[]S)S)S)S)S)U[]S)U[]U[]S)U[]U[]U[]U[]U[]U[]U[]U[]U[]U[]U[]U[]U[]S)U[]U[]U[]U[]U[]U[]S)U[]U[]S)U[]U[]S)U[]U[]U[]U[]S)U[]U[]U[]S)S)S)S)U[]U[]U[]S)U[]S)U[]S)S)S)S)S)S)S)U[]S)S)S)U[]S)S)S)S)U[]S)U[]U[]U[]U[]S)S)S)U[]U[]S)S)S)S)S)S)S)S)S)S)S)S)S)S)S)S)S)S)S)S)U[]S)S)S)S)S)S)U[]S)S)S)S)S)S)S)S)S)S)S)U[]S)S)S)S)S)S)S)S)S)S)U[]S)S)S)S)S)U[]U[]U[]S)S)S)U[]U[]U[]U[]S)U[]S)S)U[]S)U[]S)S)S)S)S)S)U[]U[]U[]S)S)S)U[]U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[]S)S)S)S)S)S)U[] S)S)U[] U[] U[] U[] U[]U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] U[] 2edbfa6da7af33a6b0d4b3272ffa5698d5e2f0306a677fb9af2e177014899dd4649f5bf7c0c766969e40b54949a0686624e91308d7717c9067734de9c84be282b5410acbdc41239d461169a3f5cdb0e3a8433b765d0815ce803cf8adbc96a411670c23f56a91f159a865ec06f88bb2b4ad9af46f60366bfe3b2bb080c709a06d27020b08fefbc8e97f6c842f95cfedaecf4f8592f7130f9d229bf392fc61ef2377f635f00b0d9cd9abd4862db93870827c7f5964927538ec47b43b423f71ec807c492ef9d4e99641df05038dc8e5c3b37e683c05dfbfe2c30d0a91fa6eb034ec97db49676e821caf0e577eea2d78b6afac73cb7def986983015f279ba05233fb6b5b79945a1d4224d8dd93ccdb96208b7122d217408023df3e40008bff7e6914c0477ca0298871f4ed9019234e669e46db241defc9435899a2e304c99ccaf4ae4c7968df09224472f2f298005017a066c2cc8b08c987df3d47d64c1e032e6e72ed49808a22788f82f5ce8e8388927c38f77b8d93e8d445f6328a58f24d624a8b96817e507ccd4cb57b1ad1a0d94cb57df2c4caec5d716fe81e69f394dc1b15339bf741a180c2edf46cd2d14b9e7f1ebbf0515c244c7df85cc15d813234898a2881ffbe483649ea80dd56fd5b71f03c330f50f18000def113312c48de4388cd4c0fe1eded14178175c97a6b31aedd7d1cf33d95ee9ce206d43d41460820872c4edfef144807075f82eb0723394e06086c16f590ebf741bf9e9a3bb30718f0464b13693808b9f20807e9eff1b00dbfd6f5a97dbe6575dfb07cafbef5fc0b9ea768aa7faa749b9a1d05df5cab94a21efa9a666025994ea3df357c381772cad6f04bf297c31866fb2b9b33f6ad63237d0f0b44f1ee0ff65f45efa80718b6c745e1c36d2a870345968c05d330ee669ed759185ee50e2e596fa1aebda263533259a8cbb9f855d6c6c3014f2da63a390115fe5f5af9378cbda6b30a1f1b1602aa78562f3f112d469a8271349416fff3c98d101cd14c2e999105c4bdd46d4d83332a55760d2a2372263d50c75326171d1e0940371614163f7dd16e4ed302fd6a34ef6134bab21ab408b9ba3063380eaf92402db0f9cbbe9493200993d3331d69b6faadc3c88c03a8e6d6da9f7b8fa8468eab569371342e2ce6a804877ca297bd5daa3ed92a520848115e14457ac35855fcd04767eb2034b9321e70b48aa45fd2ef51e510a2b7ce34a9dc82e47b18e970c4eacafc1e536bddb2f5848012b90cabd4d37e3bb2f1d1ce811d862b02fb28f8a7b8741bb58f9c3be70e12f2dbc3c2fcdaa26e7818780d82336ce6da257fadc9c04a04aa713ca1a6f338d47a9e121448fce5f02beb0ced7fcd02bc9f8d48e18e6d4bd72106511d357d67ba2950e0446eb769b232862c81a72f42ff44646d0bd39986b79eaada642fa4920dd9869e7df259872796672981a96d78babd61ffd8487d2ef209296255bf44ab46120c278e0f5cfa1317f6244742fd174afc9e769289d5b6f227257a1c6ceec8a26923fac406354efcffa1db7df17cd8e0e1a471ee0dd61b397cff37341a3b406e79e02e3915c2af74843116b383b7480f95a3e6dac58e439e491e726cc3fc84552927717f81f04e09fa8bc699d5604f745d2eefa7ffe042e41a970e1ae80f5e2ad46dfc9028e11a4c90d9984887ebaecf56fa550d38dab8a4e8aaa870eef17ba0697b234f819419faa4318321b11ae6d093ba8bf618ae0897ad24ea8e64444dbe4aad6e3796533e0f5bb61d72845da51d44c9aea257076e8924de24a16def244922bc93dbb0875169650cbe4954c895a8ce4a9a98618dc2b9f4072f9f77cc3019a1d0ae168fc8713118227b9559253a27288613dc39a29777169d58eef597bbf6f0e842447ea1072af1cf057e7c2db53ad530e5b8d16a21992c05596a2970d41db4587a06734fdde27773203551d086fafec2e95584ba831790d059317a784e974068cd4e4bc57889bf37b944028f1969e55284a15a91e0b51267d187d3166d67910db475d393f4133189c4d08a57c8b60011b846ad9418c9ab197f00f66af71e2a8f0a91e25bf856daaa6c7441b74b9061c1d3e31a7d2aa63f60eca62c9baab7e10c4ed3e0f23b8ff463a88c85d93380f9e56202885a70ef7c64ab3ca5862a289a3dae84e651ec63bf5bc5247a201a9c6970c6d0b30213076528d035707c21035f05b61081d1c0c32940f4e9d3190f9e6cdcf57270a8cf33b01b24baf2f757c19c0a48e68dcf0f0791262568f321f9094ed96ff50cf0da0e8720fa5562145ee2da6884fbfb7c8a33abf2a3d4068f97b82c17710dc27f16800b0323906fd5d12afaedb2993514e8eebca6280f0b583e40a5fe0fdfcd44bd6d9d007dc6243cfa26b72d92a6103b1a168ab4ecaac35415f552d4ecfb6a8d88314d7d425e19e6d0c8c5f8e998476ab0950f42c616d92a35d55fd6bbe16370b249bd606964c04df1d4420cfc44f8ef30118a5b48d29329d551048c9b520739a0cc0bce129e9c3b3b1487c320a75e4fd81f54cbd26415e58d061ae72ec95937c9acbe9988b0c16988febaa0c044cf53731b41ae369d654ce589697e4ba1ba67c2ddd571800af711a642abe53293dade511a7849711047a9935c174dfc89a9cbdc699cf5f369f33b1fef8b75df487a2b514b22edc5adb93955533124156a8f19dc79e0556da7f736775d9166222b75f727dc0f5cf7f2c7b262aeafd673c1b2db04f5cf86dac0cbf40f003b22c41a265bb8a4e0f021a9c2a0d8bcafdb89b816f5a7f821dff9525de98118ad5a744a5eaea1fb2cac47a121f46cf510029a23389717ec0df17e09685b76a87953efd692712d5aeb1f8fa375dbf291f8eae83f3b4e31f44b35d436581022c65795becc405ba2f1d50b6d8fa7ea1eb7e6e1c08d9c3b199af363901c5e7b93824b899dd610e980c082a432db034a7e8bcc68986f2452308d47f0c86a4623b91370ed855a80de5825a7539bc1b2d5d3b7bac0a999660d03db083fb1c4edb81f1ba76b18f4155d14ba1f088cedc1f06d1c99cc01cdffa0774021a6696c9d2cabee3ca6fe3e82c851f6efcf761ed345b59f70697208ac2771890ef7f09bbbac29459c0ae6afa430bdf67b70a62095e6b5c8d44a0dc588af2737bc06a1accaa211797bb841cc74f253040a9feddb5934ad470d74f0fa34e47437b735b50d0d3df20ff2a8a0e5952c19843e987669248a98c2905bc0afee35f1859a9cf086291cd42a2b47b6aa6a739c2207717721b0f03e950df8bbd461fa745398fb1fa1eba49bc7740c7e37d3e9840239e7bcadb56c9e149f6c739a6480a402c72be0d8930a3df714239b431d98b686d723d28f78f8bcc04628dcbf7fecf9620d64909dff5c4e671cd023b00acb6eecf063ba2b64144f8bd61fe7ce28107cf839f21d8c913539efa33b4fc3b5b3244ed94273b2735bf0b5bcbcbd0f3c8dbf7950dd5314341e01a3dd9140d67bdac1f7ed92386398385ff3e63e62e122ab22d48091b1038a869c0f17f855493b00dd6a4d3e6f17d688a9e5a728f85aa14a8789c186a9b36cd60eb92f5e8ffa6b5cff09f99b7514fd67bc2b57103561f7d2fd1b56177625163a80414a97d868789737bd583bd04c4284f24fd8a02194ad78228651abfe58d741a86d1ac6bbf65c6ec9c5de27b03f7a7a62812cf9bccfb49a99d2190bf00d77a3272d5aaf8dbbd4e4a920ee2f78e133534507175803690d25fe3605b0410684292b802973c52d2821dd61d332e868dcc6e7684b4977801bcb8b99a57d7eb91426154a8880f8702f9a90f5914ab765e2b8378292e094ce894483a9ffe2b46c0cdd30e8653f62e0c9113e683a44b000eada4d66be3e91688f45a9ebd6a68cf3faebf36a7fe330cb44d7c8754ca8f6d80e9181d24e02abfdd888ac269157b56cf430587f37effb63d56dfe5612109238dabd737f9153915be80f41d2d91a981dbe4c4bc1ad94d32e763c19c49fac7226414b4d96abf41bb6fcf10f5601116ecbb59af27ebaa0df67d51d746cb32825440639bb422dadd8274c08d931fce9c95100e174792f5b108a23625f78d08295c45017963a82d2b70b0838e93176b823fdbf689f13ea9fd6dc9ee903451bcc6f0f28d86b6c082a484df680579fa88498c55aaff207f140871599b1fcd52d396e40edb5b8f3b2009bb5f3ab83f15c7cf9e4da0101b58a95b7caaa37baeb2e31189e849858caadbb36558dc2592913c121ee4729fa09d33f8571bd6bac412fd645856ccdbb607972643eafdbd1a86a1e67946fa6e3ffd341b05efbe95e274532431b9f691df14b2482d0b2c09224a1f47164c268c33fefd63b4f57fa418ead4a013d8a9bccda4a4127b37a917b8a9e7264cd27ae81c8d367e6119e94d73f9f2a748757a56f28f81f04613c264e71eea710bed239c52264c2cd3fabe761c24893e5a3f854be356d487c3fa5a2d097062bd3a990c9757681d8fac1f2814c017e0365bdee34d4d4b081e602fb640f9bdadd8bd6365e37cc0928193c353a614e434b669ef0dfb35c0a919c58d35c404a2218ae0bee2f1e31de8bc33ccc5a64d5c8a44be1dbce07331d9c12921a6983351ead2e08ec60fecb7b077727b2913865bd56dd7c04e18b4e6772f39148d58273e6a432f8b66937177861151b7e2efb43499b38abeff7d4f2e0dbe28486a570374370a8903d97cd6c34472e4df99955419e7d6250631f1d55f3944eef10f4c1dc4c531e077e84004b512bcacbcd465a03372107d9120a8a7789216375989953de8a2d2f789fef6ca1e921362b1c4a263bc7f4667d705e97eb86430258db8d7caf40fc02ed3e8a940a130cc67857ac7e507a22d97ac7fef904357a6d9676c2487fc4598ea0059ebab8c05388129d4d13df99690431b5b08b798ff2d6388b3a0bf66891c57af20f93ff119efb6469b397a89b1db920db377312390de2ddffd8d805bf96af0e163a091f9b8e370ef40980df893b8e37d435137e1fe3271406b7939ed267091ac60a316f2463e84d842a86a6c32f7140fec6e8727132aefe601a025f6ba96c0056e8a491852f60b53a418c2ed5a63dbb799591fc97c9db9d913bc00b3d94c67ccfb5749bf2141b6b27346ec6f3c709c309ab8061e45f38391b721169eed48066ebca6d7e4b1b55ef1665eb2b3b63b875ff1b5b1a2b74a90a782fb6f7a63525065897df3ecf953d337173196bb3a2c10b0761ade88d6cb79c276313d6e8199cc19d6b77310f8f0070aea0469917bb394188da245963bb93d48a241ae203212696e71de72edb7179f28c3587dc659db72f5c456d58e3a147c685ca19333f7cf8ac9808c21f6f067d50fb4859f4d00e3039f2d0db690231b5551595c2a08208f04d22bafe82c5898378bef117badd6f9a45d6d1bdfaae575551d453f3a2264f6b26bb9550f403b304649eec698d3fa6c609b075da0029cf6165edb5684b647b26da7148e4129825d21b36924b38796e57c76af0721d87cda6224690adeb75a9b71d83256128b0e091b03a4dd98b8c63c8050f27aaa13bbe072cc13f9ec3dbf30f5035f8265f454c4e222f0c645284eeaf775acd3723c0b91802e5c32d7457505250ae12411bdd6e25386486c9a1897c8aba562a7d9d4d73569eaa94744943067ca9d2b4ded5e9a03f977b44c7c10c85855b09747fa2ccf529fddd55034f8b8b4bc156949a199797dc6e5b7ae6d9f7fb911c345222c6cf64ed5e14f874c412d828646277c80e2999de38ce6a6bc568388c3c08542d0f0eeb6613847bd8eaf60858fdf619dc0d5548174c26bd5d6c95552a6096c3f033620f978d390d06e811a9091651ddef7bc8b32d29a03d0137f0a0165cc7576aedf1d0dc6e8b7c4123a1bf75e60b4af85ca41a6e64fb6ab2e16ed3591982fec88d1e14d24ab5504ffa01808a2b8626fbfd25e5cfed530005047eeb28d0314804ee10ef4c99bcfdef928fd688465a9564359f4567494561e6ca7f5000af0e314aa46655c468f61537eeef91b9276d0069eb7a33125cf40738ce9e58ad8ea1b0b2ca07d371d8e3ea25072bdc1bfd485c9a0e6d2b690d97f6d5229c9a954131d8702cf60bc327563a3655e3f18872ac12ee2ac7167f310d20006aff7aea0c7df59b1a25a15fabe7004f0c634631da9bab2486f84dc1fe98cc20f27cfd0932a9e27b6b8aba886e2ad71f29ca045fda29f287a9c427b8aaaedd585b148572a0658ffc406fc7ce6123e2ce2c18b234ee4d69f5fce4486a80fdaf4a42639f612768295bef473d1c891d245d722278068ad6745a4a3b3d50f0a59a4c6a1e937d28eade885f5e66324365044f70766f88d6267f1240e099a2134aa11deb9b0df31f2e2ac53533936876e218806011852c585df906086c58e564391ddb7394f334b5d2742a574c18731d93831ed9aad31dba3fb3a58a4ac7daa6b9aa27e3f966a95c6dd979aa2dafa7d9280cbda6756a247c80600dc47e73ca4608d9d5bf74d65cb1276f162ca20c2943012abcbf031a7f270ba84113185565e3ae902c6b134aa608ee3eb48d22953ee02f31653da69287be14a2720caf3cf72e1deac300fb9d39baccc75a42a278d8116dbfe73a781c60391f1d328fc4ec1bfe1b34c0edf2ecfa6fcd87f56da959e2d7f75d031e06cb080ce30c902c8505491927689e8ed1edccff1652f8a049307847203a22cc21d7949b6766906e34fe66c005d7a17d62f3353dc4a29d5dc06a9b34c5c4b8eedccefec82839afc3be60f75be559ee9fd4a6566e5a9f3782774ecf24f4962e0d0ad41d8cd98f00b204e9800998ecf8427edracut-functions.shwrite-ifcfg-suse.sh../../dracut/modules.d/98systemd/dracut-cmdline.service../../dracut/modules.d/98systemd/dracut-initqueue.service../../dracut/modules.d/98systemd/dracut-mount.service../../dracut/modules.d/98systemd/dracut-pre-mount.service../../dracut/modules.d/98systemd/dracut-pre-pivot.service../../dracut/modules.d/98systemd/dracut-pre-trigger.service../../dracut/modules.d/98systemd/dracut-pre-udev.service../../dracut/modules.d/98systemd/dracut-shutdown.service../dracut-cmdline.service../dracut-initqueue.service../dracut-mount.service../dracut-pre-mount.service../dracut-pre-pivot.service../dracut-pre-trigger.service../dracut-pre-udev.service../dracut-shutdown.servicedracut.cmdline.7.gzYrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootdracut-037-49.1.8562.0.PTF.916376.src.rpmconfig(dracut)dracutdracut(x86-64)mkinitrd@  @@@@@@@@@@     /bin/bash/bin/sh/bin/sh/bin/sh/bin/sh/bin/sh/bin/sh/usr/bin/perlbashconfig(dracut)coreutilscpiofilefilesystemfindutilsgrephardlinklibc.so.6()(64bit)libc.so.6(GLIBC_2.14)(64bit)libc.so.6(GLIBC_2.2.5)(64bit)libc.so.6(GLIBC_2.3)(64bit)libc.so.6(GLIBC_2.3.4)(64bit)libc.so.6(GLIBC_2.4)(64bit)libc.so.6(GLIBC_2.7)(64bit)libc.so.6(GLIBC_2.8)(64bit)modutilspigzrpmlib(CompressedFileNames)rpmlib(PayloadFilesHavePrefix)sedsystemdsystemdsystemdsystemdsystemdsystemd-sysvinitudevutil-linuxxzrpmlib(PayloadIsLzma)037-49.1.8562.0.PTF.9163763.0.4-14.0-12001662.214.4.6-14.11.2U[%UPU%@U hTD@TԬT[@T~@TmT"@T @TTT@Tk@S@SS@SS@S@S#@SS@S@SESES\S @SS@S-S-S@SSDSDS @S @Sg@Sg@Sg@SS{CSy@Sy@St@SsZSj @Sg}@S`S_@SZN@SNpSKSKSG@SFSE6@SE6@SE6@SCS>S=M@S:@S5d@S1oS"@S"@S L@SSSnSnS(S?SR@R@RRRRRRRb@Rb@RmRmR@R&R@R1@R@R0@Re@R_@R[RZ@RUE@RSRR@RNRNRNRL RL RB@R=@R=@R-@R-@QQQQ@Q@Q)@QKQyQQr@QkQ\QHS@Q@j@Q']QQ@Qh@Q"@PP@Pd@Pe@P@P vs mainline initramfs-.img * Add 0164-Fix-initramfs-ver.img-vs-initrd-ver-in-dracut-initra.patch - Do fsck (bnc#906592) * Add 0165-Order-root-fsck-after-pre-mount.patch - Also add ifname=: boot parameter to always identify correct NIC (bnc#900831) * Add 0166-nfs-Add-ifname-dev-mac-to-boot-parameters.patch - Typo fix (bnc#901322) * Add 0168-convertrunfs-Fix-typo.patch - also add the cmac.ko cryptographic module to the modules (bnc#905296) * Add 0171-also-add-the-cmac.ko-cryptographic-module-to-the-mod.patch - Fix install-kernel: - Call depmod (bnc#874621) - add .config (bnc#897901)- purge-kernels: Also clean up kgraft-patch packages (bnc#905869)- Add ip= and root=nfs.. to dracut internal cmdline to make nfsroot working (bnc#896464) * Add 0160-nfs-Add-ip-.-and-root-nfs.-parameters-to-internal-dr.patch - Fix error message in case there is no internal dracut cmdline added Simple fix * Add 0161-Fix-error-message-when-there-are-no-internal-kernel-.patch - Request DHCP lease instead of getting/applying the offer No bug number, but Pawel rated this high prio. This should hit SLE12 still. * Add 0162-network-Request-DHCP-lease-instead-of-getting-applyi.patch- Try to load xennet driver in network module (if loaded). bnc#896464, bnc#896259 * Add 0159-network-Try-to-load-xennet.patch- dracut.usage.asc: Remove distro specific help from manpage (bnc#895363) * Add 0156-dracut.usage.asc-Remove-distro-specific-help-from-ma.patch - Add /boot/zipl to host devs if it is a mount point (bnc#892187) * Add 0157-Add-boot-zipl-to-host-devs-if-it-is-a-mount-point.patch - Add SUSE kernel module dependencies (in /etc/modprobe.d/*) (bnc#895331) * Add 0158-Add-SUSE-kernel-module-dependencies-in-etc-modprobe..patch- Network module may take quite a lot of initrd space. Do not add it unconditionally (bnc#892851) * Add 0153-Only-add-network-module-on-request-and-on-dependenci.patch - S390x can do s2disk, allow resume module there (bnc#889795) * Add 0154-resume-Also-allow-this-module-on-S390-again-s2disk-c.patch - Harden iscsi parameter checking. No bug report, but this problem was found during multipath testing and happens with 2 or more iscsi devices. * Add 0155-iscsi-iscsi.initiator-and-others-can-and-must-only-s.patch- Do not blindly try to touch the logfile (bnc#893219) * Add 0146-dracut.sh-corrected-logfile-check.patch - Only fix UUID= fstab parsing * Add 0147-dracut.sh-Fix-UUID-fstab-parsing-in-case-mount-optio.patch - Also fix other parsing syntax in fstab like LABEL= * Add 0148-dracut.sh-Fix-LABEL-and-other-fstab-syntax.patch - Fix up some bugs from previous commit * Add 0149-dracut.sh-Fix-fstab-parsing-again.patch - bnc#893615 * Add 0150-Find-kernel-modules-in-extra-and-weak-updates-path-a.patch - pixz does need too much memory, go back to xz in a conservative way (bnc#893981) * Add 0151-Go-back-to-xz-again-pixz-may-use-too-much-memory-whi.patch - Add some default tools to initrd when debug module is included and already provided an commented example line how to easily enable it. No functional change by default. * Add 0152-Add-a-comment-to-easily-add-debug-modules-also-add-v.patch- dracut.sh: check for logfile (--logfile option) and create it if necessary Add 0139-dracut.sh-check-for-logfile-logfile-option-and-creat.patch - Avoid duplicate names in host_devs Add 0140-dracut.sh-Avoid-duplicate-devices-in-host_devs.patch - iscsi: Avoid bad ip route call on empty address Add 0141-iscsi-Avoid-bad-ip-route-call-on-empty-address.patch - 40network: Don't report error for .../ifroute-* during module setup Add 0142-40network-Don-t-report-error-for-etc-sysconfig-netwo.patch - iscsi: Fix up ipv6 in brackets , iterate over all needed iscsi mounts Add 0143-iscsi-Fix-up-ipv6-in-brackets-iterate-over-all-possi.patch - 90crypt: Fixed crypttab_contains() to also work with device in /etc/crypttab Add 0144-90crypt-Fixed-crypttab_contains-to-also-work-with-de.patch - 40network: handle 'ip=ifname:static' correctly (bnc#892801) Add 0145-40network-handle-ip-ifname-static-correctly.patch- Allow multiple configurations per network interface (bnc#887906) Add 0133-Allow-multiple-configurations-per-network-interface-.patch - Remove bootdev warning (bnc#881112) Add 0134-Remove-bootdev-warning-bnc-881112.patch - check for existance of 69-dm-lvm-metad.rules in modules_setup.sh, lvm module (bnc#891791) Add 0135-lvm-Fix-12819a579900b9691e2-check-for-existance-of-6.patch - Moved persistent network rule revert to another file (was not in github): Delete: 0133-Remove-70-persistent-net.rules.patch Add: 0136-Revert-95udev-rules-add-persistent-network-rule.patch - dracut-use-fipscheck-openssl.patch: Switch from Mozilla NSS sha256hmac checking to fipscheck as recommended Add: 0137-Switch-from-Mozilla-NSS-sha256hmac-checking-to-fipsc.patch - warpclock: Do not use warpclock module on S390(x), hwclock does not exist there (bnc#884513) Add 0138-warpclock-Do-not-use-warpclock-module-on-S390-x-hwcl.patch- 99base: Increase initqueue timeout in non systemd case (bnc#887402) * Add: 0127-99base-Increase-initqueue-timeout-in-non-systemd-cas.patch - 90lvm: Install dm-snapshot module (bnc#888530) * Add: 0128-90lvm-Install-dm-snapshot-module.patch - Revert commit 6ecab258710d158a7a6 and only do not wait for swap via parameter (bnc#882812) * Add: 0129-Revert-commit-6ecab258710d158a7a6-and-only-do-not-wa.patch - nfs: Always add all kernel modules for kdump (bnc#887906) * Add: 0130-nfs-Always-add-all-kernel-modules-for-kdump.patch - 40network: handle prefixed IP addresses correctly (bnc#880108) * Add: 0131-40network-handle-prefixed-IP-addresses-correctly.patch - 40network: fixup static network configuration * Add: 0132-40network-fixup-static-network-configuration.patch - Remove 70-persistent-net.rules * Add: 0133-Remove-70-persistent-net.rules.patch- mkinitrd-suse.sh: Bail out with exit 1 if initrd cannot be generated (bnc#886630) * Add: 0120-mkinitrd-suse.sh-Bail-out-with-exit-1-if-initrd-cann.patch - Adjust initramfs-$kernel.img to SUSE default: initrd-$kernel (bnc#882306) * Add: 0121-Adjust-initramfs-kernel.img-to-SUSE-default-initrd-k.patch - btrfs: btrfs-dump-super and btrfs-select-super do not exist (bnc#886883) * Add: 0122-btrfs-btrfs-dump-super-and-btrfs-select-super-do-not.patch - 95zfcp_rules: fix typo in module_setup (bnc#887582) * Add: 0123-95zfcp_rules-fix-typo-in-module_setup.patch - 40network: Update iBFT scanning code to handle IPv6 (bnc#887542) * Add: 0124-40network-Update-iBFT-scanning-code-to-handle-IPv6.patch - 40network: separate 'mask' and 'prefix' (bnc#887542) * Add: 0125-40network-separate-mask-and-prefix.patch - 01fips: Add drbg module to force loaded modules (bnc#875855) * Add: 0126-01fips-Add-drbg-module-to-force-loaded-modules.patch- Fixup executable bits of newly patched files manually in spec file bnc#887117- Mark all scripts as executable (bnc#887010) * Remove: 0116-81cio_ignore-Mark-scripts-as-executable * Add: 0116-Mark-scripts-as-executable.patch - 95dasd_rules: Enable device before checking type * Add: 0117-95dasd_rules-Enable-the-device-before-checking-devic.patch - 95zfcp_rules: Enable device before checking type * Add: 0118-95zfcp_rules-Enable-the-device-before-checking-devic.patch - Reset IFS variable * Add: 0119-Reset-IFS-variable.patch- Handle module alias properly (bnc#886839) * Add: 0115-Handle-module-alias-properly.patch - 81cio_ignore: Mark scripts as executable (bnc#887010) * Add: 0116-81cio_ignore-Mark-scripts-as-executable.patch- 91zipl: Translate 'ext2' into 'ext4' module * Add: 0114-91zipl-Translate-ext2-3-into-ext4.patch- Enable converting of directory /var/run /var/lock to symlinks (bnc#877680) * Add: 0106-dracut-Enable-converting-of-directory-var-run-var-lo.patch - Fixup typo 'firmare' instead of 'firmware' * Add: 0107-Fixup-typo-firmare-instead-of-firmware.patch - 91zipl: Store commandline correctly * Add: 0108-91zipl-Store-commandline-correctly.patch - 95dasd_rules: Store all devices in commandline * 0109-95dasd_rules-Store-all-devices-in-commandline.patch - 95zfcp_rules: Store all devices in commandline * Add: 0110-95zfcp_rules-Store-all-devices-in-commandline.patch - 90mdraid: Remove line for 'offroot' detection * Add: 0111-90mdraid-Remove-line-for-offroot-detection.patch - 99base: warn on invalid command for initqueue * Add: 0112-99base-warn-on-invalid-command-for-initqueue.patch - 91zipl: Install script as executable * Add: 0113-91zipl-Install-script-as-executable.patch- Print stored dracut commandline during initramfs build * Add: 0101-Print-stored-dracut-commandline-during-initramfs-bui.patch - Align dev_unit_name() with systemd's function * Add: 0102-Align-dev_unit_name-with-systemd-s-function.patch - Fixup missing separators in rootfs-block cmdline * Add: 0103-Fixup-missing-separators-in-rootfs-block-cmdline.patch - Generate fallback mount unit for root filesystem (bnc#855258) * Add: 0104-Generate-fallback-mount-unit-for-root-filesystem.patch - 95iscsi: parse output from iscsiadm correctly (bnc#886199) * Add: 0105-95iscsi-parse-output-from-iscsiadm-correctly.patch- 90btrfs: Install rescue utilities to initrd * Add: 0100-btrfs-add-initrd-rescue-utilities.patch- 40network: create /var/lib/wicked in ifup.sh (bnc#885141) * Add: 0089-40network-create-var-lib-wicked-in-ifup.sh.patch - dracut: caps: Remove whole caps module * Add: 0090-dracut-caps-Remove-whole-caps-module.patch - dracut: biosdevname: Only install if present * Add: 0091-dracut-biosdevname-In-SUSE-biosdevname-package-is-in.patch - dracut: nbd: Only complain of missing binary in hostonly mode if rootfs is on nbd * Add: 0092-dracut-nbd-Only-complain-of-missing-binary-in-hoston.patch - 95iscsi: generate commandline for software iscsi (bnc#880108) * Add: 0093-95iscsi-generate-commandline-for-software-iscsi.patch - Implement shortcut 'ip=:static' for static configuration * Add: 0094-Implement-shortcut-ip-ifname-static-for-static-confi.patch - 95iscsi: use static configuration for software iscsi (bnc#884768) * Add: 0095-95iscsi-use-static-configuration-for-software-iscsi.patch - dracut: Fix error: local: can only be used in a function * Add: 0096-dracut-Fix-error-local-can-only-be-used-in-a-functio.patch - Implement 'rd.timeout' to modify the device timeout (bnc#878770) * Add: 0097-Implement-rd.timeout-to-modify-the-device-timeout.patch - Do not call 'lvm' for non-LVM device-mapper devices * Add: 0098-Do-not-call-lvm-for-non-LVM-device-mapper-devices.patch - 90multipath: Load device_handler modules early during boot (bnc#871617) * Add: 0099-90multipath-Load-device_handler-modules-early-during.patch- 91zipl: Add new module for s390x configuration changes (bnc#884743) * Add: 0088-91zipl-Add-new-module-to-update-s390x-configuration.patch- 95dasd_rules: Fixup rd.dasd parsing * Add: 0079-95dasd_rules-fixup-rd.dasd-parsing.patch - 95dasd_rules: Print out rd.dasd command-line * Add: 0080-95dasd_rules-print-out-rd.dasd-commandline.patch - 95dasd_mod: do not set module parameter * Add: 0081-95dasd_mod-do-not-set-module-parameters-if-dasd_cio_.patch - 00warpclock: Check for /sbin/hwclock (bnc#884513) * Add: 0082-00warpclock-check-for-sbin-hwclock.patch - 95zfcp_rules: Fixup rd.zfcp parsing * Add: 0083-95zfcp_rules-Fixup-rd.zfcp-parsing.patch - 95rootfs_block: terminate commandline parameter * Add: 0084-95rootfs-block-Correctly-terminate-commandline-param.patch - 95zfcp_rules: Print out rd.zfcp command-line * Add: 0085-95zfcp_rules-print-out-rd.zfcp-commandline-parameter.patch - 95zfcp_rules: Auto-generate ipl device rule * Add: 0086-95zfcp_rules-Auto-generate-udev-rule-for-ipl-device.patch - 95dasd_rules: Auto-generate ipl device rule * Add: 0087-95dasd_rules-Auto-generate-udev-rule-for-ipl-device.patch- More empty commandline fixes * Add: 0074-More-empty-cmdline-fixes.patch - 95dasd_rules: enable parsing of rd.dasd= commandline parameter * Add: 0075-95dasd_rules-enable-parsing-of-rd.dasd-commandline-p.patch - Correctly set cio_ignore for dynamic s390 rules * Add: 0076-Correctly-set-cio_ignore-for-dynamic-s390-rules.patch - 90multipath: add missing 11-dm-mpath.rules file (bnc#883149) * Add: 0077-90multipath-add-missing-11-dm-mpath.rules-file.patch - Restore original IFS value (bnc#883770) * Add: 0078-Restore-original-IFS-value.patch- Fix non-export of journal dev boot options * Add: 0071-Fix-non-export-of-journal-dev-boot-options.patch - Also export root= boot param for hostonly-cmdline * Add: 0072-Also-export-root-boot-param-for-hostonly-cmdline-cas.patch - Don't create lots of empty cmdline files * Add: 0073-Don-t-create-lots-of-empty-cmdline-files-for-hostonl.patch- 81cio_ignore: rewrite module to not mount any filesystem (bnc#882685) * Add: 0070-81cio_ignore-rewrite-module.patch- 81cio_ignore: ignore module if cio_ignore is not specified (bnc#882685) * Add: 0069-81cio_ignore-skip-module-if-cio_ignore-is-not-active.patch- 40network: always start netroot in ifup.sh (bnc#881235) * Add: 0066-40network-always-start-netroot-in-ifup.sh.patch - 95fcoe: check() always returns 255 * Add: 0067-95fcoe-check-always-returns-255.patch - 95fcoe-uefi: Test for EFI firmware (bnc#882412) * Add: 0068-95fcoe-uefi-Test-for-EFI-firmware.patch- Rename patches to match git repository: * Old: more-fips-adjustments.patch * New: 0057-01fips-Include-some-more-hmacs.patch * Old: dracut-check-supported.patch * New: 0058-dracut-add-warning-when-including-unsupported-module.patch - Add 99suse module to git repository: * Remove: parse-suse-initrd.sh * Remove: module-setup-initrd.sh * Add: 0059-99suse-Add-SUSE-specific-initrd-parsing.patch - Add write-ifcfg-suse.sh to git repository: * Remove: write-ifcfg-suse.sh * Add: 0060-45ifcfg-Add-SUSE-specific-write-ifcfg-file.patch - Fixup error messages in write-ifcfg-suse.sh (bnc#881286) * Add: 0061-45ifcfg-Fixup-error-message-in-write-ifcfg-suse.patch - Add missing 'libgcc_s.so' library (bnc#881692): * Add: 0062-95iscsi-Install-libgcc_s-library.patch * Add: 0063-90multipath-Install-libgcc_s-library.patch - Install missing scsi_dh_alua module (bnc#871617) * Add: 0064-90kernel-modules-install-scsi_dh_alua.patch - 95iscsi: fixup bnx2i offload booting (bnc#855747) * Add: 0065-95iscsi-Fixup-bnx2i-offload-booting.patch- Add option to warn if unsupported modules are added to the initramfs - Enable this option for 'make install' when a kernel with CONFIG_SUSE_KERNEL_SUPPORTED enabled is used. (bnc#882332) - Add dracut-check-supported.patch- include the several hmacs needed for FIPS integrity checking of cryptsetup, libgcrypt, libfipscheck1. Also add the openssl HMACs too as someone else seems to use those too. Add: more-fips-adjustments.patch- Rediff patches to match git repository - 95fcoe: Check for FCoE devices prior to binaries * Modify 0055-95fcoe-Only-install-fcoe-module-if-required.patch - 99base: Install chown instead of chgrp * Modify 0052-99base-Add-chown-binary.patch - 95iscsi: do not try to detect iSCSI firmware during booting; should be handled via commandline parameter * Modify 0030-95iscsi-Autodetect-iSCSI-firmware.patch - Rename patch: * old: 0051-mkinitrd-suse-add-update-booloader-message.patch new: 0051-mkinitrd-suse-add-update-bootloader-message.patch- Rename patches to match git repository: * old: 0013-Correct-paths-for-openSUSE.patch new: 0011-Correct-paths-for-openSUSE.patch * old: 0014-Check-for-plymouth-lib-directories.patch new: 0012-Check-for-plymouth-lib-directories.patch * old: dracut_do_not_update_booloader_if_no_kernel_is_found.patch new: 0013-mkinitrd-suse-do-not-update-bootloader-if-no-kernel-.patch * old: suse_grub_manpage.patch new: 0014-Update-dracut-manpage-for-GRUB-Legacy-and-GRUB2.patch * old: replace_dhclient_with_wickedd_dhcp_supplicants.patch new: 0015-40network-replace-dhclient-with-wickedd-dhcp-supplic.patch * old: 0015-add-new-s390x-specific-rule-files.patch new: 0016-Add-new-s390x-specific-rule-files.patch * old: change_write_ifcfg_to_suse.patch new: 0017-45ifcfg-use-distro-specific-scripts.patch * old: dracut-fix-whitespace-add-drivers_call.patch new: 0018-mkinitrd-suse-Fix-whitespaces-when-adding-drivers.patch * old: wait_for_network_race_condition_fix.patch new: 0019-40network-Fix-race-condition-when-wait-for-networks.patch * old: dracut-warpclock_module.patch new: 0020-00warpclock-Set-correct-timezone.patch * old: s390-dcssblk.patch new: 0021-95dcssblk-Add-new-module-for-DCSS-block-devices.patch * old: dracut-install-persistent-rule.patch new: 0022-95udev-rules-add-persistent-network-rule.patch * old: dracut-really-always-add-autofs4.patch new: 0023-systemd-always-tries-to-load-autofs4.patch * old: mdraid-setup.patch new: 0024-Fixup-mdraid-setup.patch * old: 0015-95udev-rules-Add-59-scsi-sg_utils.rules.patch new: 0025-95udev-rules-Add-59-scsi-sg_utils.rules.patch * old: 0016-90multipath-add-67-kpartx-compat.rules.patch new: 0026-90multipath-add-67-kpartx-compat.rules.patch * old: 0017-90multipath-install-dracut-specific-service-file.patch new: 0027-90multipath-install-dracut-specific-service-file.patch * old: 0020-95udev-rules-Include-correct-sg3_utils-rules.patch new: 0028-95udev-rules-Include-correct-sg3_utils-rules.patch * old: 0021-90multipath-install-correct-multipath-rules.patch new: 0029-90multipath-install-correct-multipath-rules.patch * old: add_dracuts_network_params_for_iscsi.patch new: 0030-95iscsi-Autodetect-iSCSI-firmware.patch * old: 0022-90multipath-Fixup-service-file-for-booting.patch new: 0031-90multipath-Fixup-service-file-for-booting.patch * old: 0023-mkinitrd-suse.sh-Use-hostonly-and-hostonly-cmdline-c.patch new: 0032-mkinitrd-suse.sh-Use-hostonly-and-hostonly-cmdline-c.patch * old: 0024-95iscsi-Set-correct-iscsi_started-value-for-iSCSI-fi.patch new: 0033-95iscsi-Set-correct-iscsi_started-value-for-iSCSI-fi.patch * old: 0025-dracut_continue_adding_modules_also_on_error.patch new: 0034-dracut-Do-not-stop-installing-drivers-if-one-fails.patch * old: 0026-force_to_add_and_load_kernel_modules_other_than_via_boot_param.patch new: 0035-Introduce-force-drivers-parameter-and-force_drivers-.patch * old: 0027-95fcoe-Store-current-configuration-in-dracut-cmdline.patch new: 0036-95fcoe-Store-current-configuration-in-dracut-cmdline.patch * old: 0028-95fcoe-update-fcoe-interface-check.patch new: 0037-95fcoe-update-fcoe-interface-check.patch * old: 0029-95fcoe-start-lldpad-separately.patch new: 0038-95fcoe-start-lldpad-separately.patch * old: 0030-dracut-mkinitd_cleanup_force_host_only_var.patch new: 0039-Remove-force-parameter-from-mkinitrd.patch * old: 0031-95fcoe-skip-VLAN-devices-in-fcoe-up.patch new: 0040-95fcoe-skip-VLAN-devices-in-fcoe-up.patch * old: 0033-dracut_hostonly_hostonly_cmdline_default.patch new: 0041-mkinitd-suse-remove-hostonly-and-hostonly-cmdline.patch * old: 0034-suse.conf.example_extend.patch new: 0042-Enhance-suse.conf-example-with-SUSE-specific-setting.patch * old: 0035-always_add_network.patch new: 0043-40network-always-add-network-module.patch * old: 0036-add_extra_debug_binaries.patch new: 0044-Add-find-to-debug-binaries.patch * old: 0037-fix_s390_network_modules_install.patch new: 0045-40network-add-missing-_arch-variable-declaration.patch * old: 0038-remove_waiting_for_swap_dev.patch new: 0046-dracut-Do-not-wait-for-swap-device.patch * old: 0039-s390_no_resume_module.patch new: 0047-95resume-skip-module-for-s390-x.patch * old: 0041-only_enable_network_if_explicitly_requested.patch new: 0048-40network-Only-enable-network-interfaces-if-explicit.patch * old: 0042-ibft_autoconfig_param.patch new: 0049-95iscsi-Use-ip-ibft-for-ibft-autoconfiguration.patch * old: 0043-fcoe_strip_quotes.patch new: 0050-95iscsi-strip-one-set-of-quotes-when-calling-initque.patch * old: 0044-Add_update_bootloader_msg.patch new: 0051-mkinitrd-suse-add-update-booloader-message.patch * old: 0045-add-chown_binary.patch new: 0052-99base-Add-chown-binary.patch * old: dracut-fips-module-loading-fixes.patch new: 0053-01fips-fixup-loading-issues.patch * old: 0046-ibft_update_cmdline_printing.patch new: 0054-95iscsi-update-commandline-printing.patch * old: 0047-only_install_fcoe_if_required.patch new: 0055-95fcoe-Only-install-fcoe-module-if-required.patch * old: 0048-cio_ignore.patch new: 0056-81cio_ignore-handle-cio_ignore-commandline.patch- Mount zipl device on S390 (bnc#874902) Add 0048-cio_ignore.patch- Only install fcoe if required and suppress require-binaries output Add 0047-only_install_fcoe_if_required.patch - ibft: Correctly show ibft cmdline via print-cmdline Add 0046-ibft_update_cmdline_printing.patch- dracut-fips-module-loading-fixes.patch: bnc#875855 - adjust FIPS module list - on architecture specific modules, failing loading is not critical - ship 98selinux, for people that want to use SELinux.- Update to latest git HEAD: commit 0fa5dbedc5b222435f51f7460a81232ee120c4e1 Tue May 20 13:23 Modified dracut_v37_to_HEAD.patch Modified mdraid-setup.patch Modified dracut-install-persistent-rule.patch Removed 0032-98systemd-fixup-rootfs-generator-installation-path.patch - Add /etc/dracut.d.conf/01-dist modifications to file instead of writing to it via rpm build section Add 0033-dracut_hostonly_hostonly_cmdline_default.patch Add 0034-suse.conf.example_extend.patch - Cleanup mkinitrd-suse.sh: * Remove hostonly and hostonly-cmdline -> this is done via 01-dist config file now - Always add network module based on modules_setup.sh check() function and not via 01-dist config file Add 0035-always_add_network.patch - Add find to debug binaries - Useful and harmless Add 0036-add_extra_debug_binaries.patch - Fix adding of network modules for s390 (bnc#879302) Add 0037-fix_s390_network_modules_install.patch - Omit resume module on s390(x) - There is no suspend on s390 Add 0039-s390_no_resume_module.patch - Do not wait for swap - This causes trouble with Rudi's autobuild images: Add 0038-remove_waiting_for_swap_dev.patch - Fcoe and ibft fixes (bnc#879038): Add 0041-only_enable_network_if_explicitly_requested.patch Add 0042-ibft_autoconfig_param.patch Add 0043-fcoe_strip_quotes.patch - Print message when starting to update bootloader Add 0044-Add_update_bootloader_msg.patch - ToDo: Pass hostonly variable earlier so that is always avail in check() function. Still already add: Add 0040-fcoe_fix_check_function.patch - Add chown to initrd (bnc#879767) Add 0045-add-chown_binary.patch - Use parallel pixz instead of xz binary to compress the initrd- From Hannes Reinecke : fixup rootfs-generator installation path (bnc#878714) Add 0032-98systemd-fixup-rootfs-generator-installation-path.patch- Corrected previous patch Modified: 0031-95fcoe-skip-VLAN-devices-in-fcoe-up.patch- From Hannes Reinecke : skip VLAN devices in fcoe-up (bnc#878583) Add: 0031-95fcoe-skip-VLAN-devices-in-fcoe-up.patch- By Hannes Reinecke : - Fixup FCoE booting (bnc#877288) * Add 0027-95fcoe-Store-current-configuration-in-dracut-cmdline.patch * Add 0028-95fcoe-update-fcoe-interface-check.patch * Add 0029-95fcoe-start-lldpad-separately.patch - Cleanup host_only variable using in mkinitrd - Remove --force parameter from mkinitrd, we always force anyway * Add 0030-dracut-mkinitd_cleanup_force_host_only_var.patch - Remove acpi parameter from mkinitrd, this is done differently nowadays - Adjust manpage accordingly- also do the service magic in %post/%postun, otherwise purge-kernels will not get enabled.- Do not inst binaries explicitly into /bin or /usr/bin, it is already taken care of internally for that: Delete 0006-Install-bin-mount.patch Modify 0013-Correct-paths-for-openSUSE.patch - Do not stop trying to load drivers (via add-drivers or filesystems) if one fails Add 0025-dracut_continue_adding_modules_also_on_error.patch - Introduce force-drivers. mkinitrd should use this one instead of add-drivers later, if accepted mainline Add 0026-force_to_add_and_load_kernel_modules_other_than_via_boot_param.patch- Update add_dracuts_network_params_for_iscsi.patch to detect be2iscsi firmware devices - Remove obsolete patch fix-iscsi-firmware.sh - Fixup iscsi firmware booting with be2iscsi (bnc#873448): Added 0024-95iscsi-Set-correct-iscsi_started-value-for-iSCSI-fi.patch - Renamed mkinird_differ_host_and_cmdline_only_properly.patch to 0023-mkinitrd-suse.sh-Use-hostonly-and-hostonly-cmdline-c.patch- Update to lateste git HEAD 48b7ab1b35adf1f3f09f883ef14ea0a3fba1e468 Added: dracut_v37_to_HEAD.patch Modified: 0013-Correct-paths-for-openSUSE.patch Modified: mdraid-setup.patch Modified: replace_dhclient_with_wickedd_dhcp_supplicants.patch Deleted: 0018-fstab-do-not-mount-and-fsck-from-fstab-if-using-syst.patch Deleted: 0019-dracut-initqueue-service-runs-before-remote-fs-pre.t.patch - Fix lvm and other possible not working thing due to new parameter: hostonly-cmdline which has to be active by default bnc#874000 bnc#874905 bnc#874363 Added: mkinird_differ_host_and_cmdline_only_properly.patch - Make write-ifcfg-suse.sh more update robust Avoid rebasing of diff with every update touching this file by adding write-ifcfg-suse.sh as source file and copy/link in .spec file. Modified: change_write_ifcfg_to_suse.patch- consolidate -fips-aesni into -fips again. The problem due to it was split off upstream was solved in the kernel.- Create new -fips and -fips-aesni subpackage for kernel integrity checking. bnc#856310 FATE#316930 - add spaces around "network" in 01-dist.conf, as the addmodules list is concatenated and you never know which config is before or after and what it does.- Enable multipath correctly during booting (bnc#873686) Add: 0022-90multipath-Fixup-service-file-for-booting.patch- fix-iscsi-firmware.patch: Fix according to dracut-037 updates (iscsistarted-iscsi:).- add_dracuts_network_params_for_iscsi.patch: Add missing dracut's cmdline parameters to make network mandatory and boot using iBFT when present. Without them iBFT booting does not work.- Install correct rule files for multipath support (bnc#873151) Add: 0020-95udev-rules-Include-correct-sg3_utils-rules.patch Add: 0021-90multipath-install-correct-multipath-rules.patch- Do not always try to add iscsi module, let its check function decide - Compress initrd with xz --check=crc32 -6 by default- Remove the bootchart module, note that we still keep the systemd-bootchart one which provides similar functionality.- Remove the busybox module we have all basic tools already in the initrd - _unitdir is always defined nowadays, remove the conditionals.- Replaced dracut tarball with proper upstream tarball Add: dracut-037.tar.xz- Update dracut to 037 * Add --hostonly_cmdline switch * Update --mount syntax * Include modules from /updates directory * Fixes for network setup * Some small fixes - Rediff patches - Include iscsiuio again (bnc#872474) Remove: remove-iscsiuio.patch - Install 59-scsi-sg_utils.rules (bnc#872478) Add: 0015-95udev-rules-Add-59-scsi-sg_utils.rules.patch - Install 67-kpartx-compat.rules (bnc#872662) Add: 0016-90multipath-add-67-kpartx-compat.rules.patch - Install separate multipath service file (bnc#871610) Add: 0017-90multipath-install-dracut-specific-service-file.patch - Do not fsck and mount from fstab if systemd is used (bnc# Add: 0018-fstab-do-not-mount-and-fsck-from-fstab-if-using-syst.patch - Fixup initqueue for remote-fs Add: 0019-dracut-initqueue-service-runs-before-remote-fs-pre.t.patch- revert last change, ucode-intel is not mandatory and will get installed by default anyway, either via patterns or by modalias dependencies in the package itself.- Require package ucode-intel in x86*- mdraid-setup.patch Make mdraid scripts work with latest mdadm. Without this, boot from DDF or IMSM array fails if one device is missing (bnc#866660)- systemd always tries to load autofs4 otherwise it reports: Failed to insert module 'autofs4' dracut already adds it, but only if loaded already. Always load autofs4 even if not already loaded (bnc#869411) Add: dracut-really-always-add-autofs4.patch- Fix installkernel script bnc#862990- Add support for 70-persistent-net.rules in dracut (bnc#868375) Add: dracut-install-persistent-rule.patch- CRITICAL: Fix add-drivers passing from mkinitrd to dracut bnc#868397- Add s390 dcssblk driver and introduce rd.dcssblk= to pass mounts that should get activated at initrd stage fate#308263 Add: s390-dcssblk.patch- bnc#830060 - Dracut is missing warpclock/hwclock Add dracut-warpclock_module.patch- wait_for_network_race_condition_fix.patch: * In case of no network related params are specified, but rd.neednet=1 is set, default initqueue action is to wait until one of the network interfaces is marked as set up properly. (bnc#866771) * It also helps with initqueue's race condition when network interface shows up late. - replace_dhclient_with_wickedd_dhcp_supplicants.patch: Add a missing network setup flag. (bnc#866771)- Merge all dracut-* packages to one dracut.rpm package. Subpackages only had one or two minor files not worth splitting a package or dracut-network had important modules which should (like former main dracut package) always get installed - libcap does not exist and libcap2 or friends are not needed - > remove Requires: libcap - Reorder (sort) the files section a bit- Fix bug introduced with last commit: Bad whitespace logic when INITRD_MODULES contain more than one module.- Make sure that --add-drivers is not called with whitespace string which will lead to a "read line" user input request and things may get stuck at installation. - Add: dracut-fix-whitespace-add-drivers_call.patch - Remove s390 grub module again -> this will go into grub2 package (ask rw@suse.de for details) Delete/remove: s390_add-user-space-grub-rule.patch - Add installkernel script which installs the kernel when: make install is invoked. The script from mkinitrd has been taken over and adopted. Added source: dracut-installkernel bnc#862990- Fix syntax error -> missing then - Correct path, it is /usr/bin/grub2-emu- autofs4 is always included since mainline git commit: 314929920f27448b45bfd systemd: ensure autofs4 and ipv6 are included - Always add network and iscsi dracut module, so that ibft, iscsi, nfsroot work as expected.- change_write_ifcfg_to_suse.patch: Detect the system flavor and write the ifcfg files accordingly.Originally by Hannes Reinecke (hare@suse.de): - Install new s390x specific udev rules (bnc#856585) - Add: 0015-add-new-s390x-specific-rule-files.patch - Do not check for non-existing dasd_configure for s390x (bnc#856585)- Added 95grub2 module for s390x- remove-iscsiuio.patch: Remove iscsiuio references as this one is not present in SLE-12.- fix-iscsi-firmware.patch: Fix iSCSI iBFT boot up problem introduced with mainline changes- replace_dhclient_with_wickedd_dhcp_supplicants.patch: Replace dhclient with wickedd-dhcp4 and wickedd-dhcp6. Script up dhcp functionality in ifup.sh.-Added bug number to previous changelog entry-Updated suse_grub_manpage.patch to further correct for incorrect grub configuration paths bnc#858448-Updated suse_grub_manpage.patch for dracut-036-Added patch to fix manpage to reflect openSUSE GRUB Legacy and GRUB2 - removed patches: * dracut_git_v034_to_head.patch- Cleanup with spec-cleaner.- Version bump to 036 removing the need for patching from git. - removed patch: * dracut_git_v034_to_head.patch- Do not show usage error when no kernel was found. This may happen several times at package installation time and floods the logs. Modify dracut_do_not_update_booloader_if_no_kernel_is_found.patch- Correctly fix previous issue: Exit without calling update-bootloader (bnc#858268) Currently mkinitrd will always exit early without creating an initrd at all. Rebase: dracut_do_not_update_booloader_if_no_kernel_is_found.patch - Remove an obsolete comment from .spec fileExit without calling update-bootloader (bnc#858268): Add: dracut_do_not_update_booloader_if_no_kernel_is_found.patch Adding: Requires: systemd-sysvinit which has reboot, halt and other binaries dracut likes to add to the initrd. Cleanup and adjust to latest mainline: Dropping as these are included in the latest update_git_v034_to_head patch: Drop: 0001-95dasd-Install-kernel-modules-only-once.patch Drop: 0002-95dasd-Only-install-module-if-normalize_dasd_arg-is-.patch Drop: 0003-95dasd_mod-make-dasd_cio_free-optional.patch Drop: 0004-95zfcp-Make-installation-optional.patch Drop: 0005-95znet-Make-installation-optional.patch Drop: 0007-Fixup-keymap-setting-for-openSUSE.patch Drop: 0008-Add-DASD-configuration-for-SuSE.patch Drop: 0009-Add-zfcp-scripts-for-SUSE.patch Drop: 0010-Make-logfile-configurable.patch Drop: 0011-mkinitrd-suse-Add-SUSE-compability-wrapper-for-dracu.patch Drop: 0012-mkinitrd-suse.8.asc-Add-manpage-for-SUSE-compat-mkin.patch Drop: 0015-Fixup-script-permissions.patch Drop: 0016-Remove-shebang-from-shell-completion-files.patch Drop: dracut-git-update.patch Rebase: 0013-Correct-paths-for-openSUSE.patch This is a rename of dracut-git-update.patch to: Add: dracut_git_v034_to_head.patch- Cleanup: Remove %define replace_mkinitrd 1 and related conditionals in .spec file -> One either has to install dracut or mkinitrd and it will stay like that.- Add purge kernel service/feature which before was part of mkinitrd bnc#854348- Update with patches from git repository: * kernel-modules: add ohci-pci to the list of forced module installs * Run 'xz' and 'lzma' with multiple threads * systemd: do not exit the initqueue, if systemd asks a password * iscsi,nbd: do not fail in hostonly mode * dracut-functions.sh: Avoid loading unnecessary 32-bit libraries for 64-bit initrds * fips: also install /etc/system-fips in the initramfs * dracut.modules.7.asc: removed empty section * dracut.sh: fixed PATH shortener * dracut.spec: move /sbin/dracut to /usr/sbin/dracut * iscsi/nbd: do not try to mount the whole disk, if root= is missing * fips: include crct10dif_generic * Handle crypto modules with and without modaliases * usrmount/module-setup.sh: fixed typo * lvm: always install thin utils for lvm * kernel-modules(ARM): add mmc_block usb_storage to static list of kernel mods * dracut-functions.sh:check_block_and_slaves*() skip LVM internal devs * mkdir basic dirs in /run * network/fcoe: only redirect output to loginit.pipe, if exists * dracut.sh: no need to make subdirs in run * dracut.sh: also mkdir /run/lock, which is copied to * lvm: fix thin recognition * Add lzo, lz4 compression and read INITRD_COMPRESS * remove resume-genrules.sh * resume: fix swap detection in hostonly * base/init.sh: also mkdir /run/lock * dmsquash-live: add /dev/mapper/live-base * Doc: cleanup, extend and split and reuse * dracut.sh: do not bail out, if kernel modules dir is missing * 10i18n/parse-i18n.sh: parse rd.vconsole and rd.locale * */module-setup.sh: add comments for dracut called functions * lvm: install thin utils for non-hostonly - Patches for S/390 support * 95dasd: Install kernel modules only once * 95dasd: Only install module if normalize_dasd_arg is present * 95dasd_mod: make dasd_cio_free optional * 95zfcp: Make installation optional * 95znet: Make installation optional * Install /bin/mount * Fixup keymap setting for openSUSE * Add DASD configuration for SuSE * Add zfcp scripts for SUSE * Make logfile configurable * Add SUSE compability wrapper for dracut * Add manpage for SUSE compat mkinitrd * Work around xsltproc bug * Correct paths for openSUSE * Check for plymouth lib directories - Drop obsolete patches - Install mkinitrd-suse- Remove not needed logrotate Requires- remove use_all_paths_udev.patch, /lib/udev.. is a symlink to /usr nowadays this confuses other parts of the code causing errors/warnings during the initrd generation.- version 034 * fcoe: add FCoE UEFI boot device support * rootfs-block: add support for the rootfallback= kernel cmdline option * btrfs: use inst_hook to install the timeout hook- Correct patch mkinitrd-fix-boot-dir-detection. (";;" doesn't really work)- Updated the patch mkinitrd-fix-boot-dir-detection.patch to a more generic validation that the inidcated initrd file doesn't contain a path. If no path is given, then add the default boot_dir.- Fix again the mkinitrd script as that people don't seem to test. Added mkinitrd-fix-boot-dir-detection.patch so that an initrd is created.- Update to mainline git version 033, b7d1b6f904a5b0bdd9a5ad19149f3. - Remove all patches which went mainline: generalize_early_cpio.patch microcode_cleanup.patch acpi_override.patch mkinitrd_allow_no_option.patch mkinitrd_allow_multiple_args.patch quiet_options.patch implement_default.patch root_fs.patch suse_host_only.patch - Fix missing root fs slash in lib/udev/rules.d resulting in: /var/tmp/initramfs.Lusf6flib/udev/rules.d - bcache: removed, it's in the upstream bcache-tools package mainline git commit: 49268028b90f6344f79e3510d2 - Fix bad she-bang in mkinitrd_setup_dummy- Add patch mkinitrd_update_bootloader.diff so that after generating the initrd, the update-bootloader is called to update grub2.- Validate that the parameters passed with -i (initrd file) does not already contain the boot_dir.- Bring back the versioned Provides/Obsoletes for mkinitrd. Otherwise we run into issues as that udev is conflicting with mkinitrd < 2.7.0- Remove Provides/Obsoletes: mkinitrd versioning. Simply obsolete and provide all mkinitrd versions.- Mark /etc/dracut.conf.d/02-early-microcode.conf as config file- Add ACPI table override ability: generalize_early_cpio.patch #PATCH-FIX-UPSTREAM microcode_cleanup #PATCH-FIX-UPSTREAM acpi_override.patch #PATCH-FIX-UPSTREAM - This will replace mkinitrd with dracut as the default initrd generator. Therefore Prefer: dracut tag in the project config of the repo is needed. Otherwise OSC does not know how to build installation-images (needing mkinitrd to build) and which package to take. - To switch back and try mkinitrd instead of dracut will be: Uninstall dracut: - rpm -e dracut --nodeps And install mkinitrd again: - zypper install mkinitrd - Adjust mkinitrd-dracut.sh to SUSE mkinitrd: : Before gives a "usage" error -> now scans /boot for kernels and builds corresponding inirtrds for them - i -k : Pass a list of kernels and initrd targets (not sure it was worth the hassle to be able to pass) - b : Boot directory to search for kernel images - d : Change root file system. Not tested whether dracut's behavior matches exactly what our mkinitrd does. - s : Dummy (should even be obsolete in latest mkinitrd) These patches have been submitted, but now feedback from mainline yet: mkinitrd_allow_no_option.patch mkinitrd_allow_multiple_args quiet_options implement_default root_fs suse_host_only - Write caller and used parameters to syslog if mkinitrd is called. So that those can easily be fixed and checked for correctness. This should get reverted again before a bigger release. This patch will never show up mainline and should also get reverted from SUSE factory repo before the next release shows up: suse_only_logger - Build host only images for default paths in SUSE for faster build and smaller images. Imply --force in this case as well. * suse_host_only.patch- save a few seconds on boot by always including the autofs4 kernel module in the initrd- dracut 033 - improved hostonly device recognition - improved hostonly module recognition - do not install udev rules from /etc in generic mode - fixed LABEL= parsing for swap devices - fixed iBFT network setup - removed caching of kernel cmdline - bcache: support new blkid - ifup with dhcp, if no "ip=" specified for the interface - fixed ifup udev rules- After testing, we need to correct a major problem, /usr/bin/mount most be installed in /bin/mount on the initrd otherwise boot fails.- version 032 - add parameter --print-cmdline - dracut now creates the initramfs without udevadm that means the udev database does not have to populated and the initramfs can be built in a chroot with /sys /dev /proc mounted. - renamed dracut_install() to inst_multiple() for consistent naming - if $libdirs is unset, fall back to ld.so.cache paths - always assemble /usr device in initramfs - bash module added (disable it, if you really want dash) - continue to boot, if the main loop times out, in systemd mode - removed inst*() shell pure versions, dracut-install binary is in charge now - fixed ifcfg file generation for vlan - do not include adjtime and localtime anymore - fixed generation of zfcp.conf of CMS setups - install vt102 terminfo - dracut_install() is still there for backwards compat - do not strip files in FIPS mode - fixed iBFT interface configuration - fs-lib: install fsck and fsck.ext* - shutdown: fixed killall_proc_mountpoint() - network: also wait for ethernet interfaces to setup - fixed checking for FIPS mode- version 031_git201308011055 * systemd: add support for kmod static devnodes * crypt: Wait for udev to settle before unlocking disk * systemd/dracut-pre-trigger.service: run after systemd-tmpfiles-setup-dev * systemd: use systemd in the initramfs, if installed on the system- Drop the buildrequire for the microcode_ctl. This package is no longer in Factory and with the latest kernel (3.11) no longer required.- version 030_git201307241235 * systemd: Replace prefdm.service with display-manager.service * modsign: do not install, if no keys present * bcache: add support for bcache * Use systemd-cat for logging on systemd systems, if logfile is empty- Remove the http link for the Source0. Git snapshots can not be obtained that way.- Version 029_git201307171236 * support early microcode loading in x86- Require pigz instead of gzip- version 029 * fixes for the networking modules * fixes for systemd integration * fixes for the i18n module (removes dracut-font.patch now upstream)- version 027_git201306061213 * setup correct system time and time zone in initrd * systemd integration bugfixes * lvm bugfixes.- Recommend pigz for faster/parallel compression- Ensure we use display-manager.service instead of prefdm.- Update to 027_git201304121327 * much of patch correct-paths-for-opensuse.patch is no longer need so it has shrinked significantly. * since PRE-027 dracut requires systemd >= 199 reflect that in in the rpm buildRequires.- dracut-027 * systemd module now requires systemd >= 199 * dracut makes use of native systemd initrd units * added hooks for new-kernel-pkg and kernel-install * hostonly is now default for fedora * comply with the BootLoaderSpec paths http://www.freedesktop.org/wiki/Specifications/BootLoaderSpec * added rescue module * host_fs_types is now a hashmap * new dracut argument "--regenerate-all" * new dracut argument "--noimageifnotneeded" * new man page dracut.bootup * install all host filesystem drivers * use -D_FILE_OFFSET_BITS=64 to build dracut-install- Update to 026_git201303180829 * bugfixes * adds bash completion Support - Most importantly, fix the (silly) compatibility patch that changes the name from initramfs to initrd that went broken in last update (all initrds were suffixed by .img)- dracut-026 - introduce /usr/lib/dracut/dracut.conf.d/ drop-in directory /usr/lib/dracut/dracut.conf.d/*.conf can be overwritten by the same filenames in /etc/dracut.conf.d. Packages should use /usr/lib/dracut/dracut.conf.d rather than /etc/dracut.conf.d for drop-in configuration files. /etc/dracut.conf and /etc/dracut.conf.d belong to the system administrator. - uses systemd-198 native initrd units - totally rely on the fstab-generator in systemd mode for block devices - dracut systemd now uses dracut.target rather than basic.target - dracut systemd services optimize themselves away - fixed hostonly parameter generation - turn off curl globbing (fixes IPv6) - modify the udev rules on install and not runtime time - enable initramfs building without kernel modules (fixed regression) - in the initqueue/timeout, reset the main loop counter, as we see new udev events or initqueue/work - fixed udev rule installation- Update to 025_git201302211113 * Support out-of-tree and updated drivers in initramfs creation * shutdown: call "losetup -D" on shutdown * Mount /proc before including dracut-lib.sh. * dracut.sh: make /var/log a symlink to /run/log * systemd/dracut-pre-pivot.sh: remove /dev/root symlink after shell * kernel-modules: Add ehci support for kernel 3.8+ * Other bugfixes- BuildRequires: pkgconfig(systemd) so %{_unitdir} is defined and systemd integration works..- Require modutils instead of module-init-tools.- Update to release 025: + do not strip signed kernel modules + add sosreport script and generate /run/initramfs/sosreport.txt + make short uuid specification for allow-discards work + turn off RateLimit for the systemd journal + fixed MAC address assignment + add systemd checkisomd5 service + splitout drm kernel modules from plymouth module + add 'swapoff' to initramfs to fix shutdown/reboot + add team device support + add pre-shutdown hook + kill all processes in shutdown and report remaining ones + "--device" changed to "--add-device" and "add_device=" added for conf files + add memory usage trace to different hook points + cope with optional field #7 in /proc/self/mountinfo + lots of small bugfixes- dracut wants "strip" installed which is part of binutils recommend that package- Added additional patches to make dracut work in an openSUSE environment. - Added patch (use_all_paths_udev.patch) to use both /usr/lib/udev and /lib/udev as long as not all packages migrated. - Added patch (use_initrd_insteadof_initramfs.patch) to change the naming of the generated initrd file to be more openSUSE - Added patch (use_sysconfig_values_correctly.patch) to read the correct keymap value from /etc/sysconfig. (.gz extension)- Update to release 024: + new dracut option "--device" + new dracut kernel command line options "rd.auto" + new dracut kernel command line options "rd.noverifyssl" + new dracut option "--kernel-cmdline" and "kernel_cmdline" option for default parameters + fixes for systemd and crypto + fix for kexec in shutdown, if not included in initramfs + create the initramfs non-world readable + prelink/preunlink in the initramfs + strip binaries in the initramfs by default now + various FIPS fixes + various dracut-install fixes - Added patch (correct-paths-for-opensuse.patch) to ensure correct paths for openSUSE (Plymouth)- Add initramfs-non-world-readable.patch: fix CVE-2012-4453 (bnc#782734).- Update to release 023: + resume from hibernate fixes + -N option for --no-hostonly + support for systemd crypto handling + new dracut module "crypt-loop" + deprecate the old kernel command line options + more documentation + honor CFLAGS for dracut-install build + multipath fixes + / is mounted according to rootflags parameter but forced ro at first. Later it is remounted according to /etc/fstab + rootflags parameter and "ro"/"rw". + support for xfs / reiserfs separate journal device + new "ro_mnt" option to force ro mount of / and /usr + root on cifs support + dracut-install: fixed issue for /var/tmp containing a symlink + only lazy resolve with ldd, if the /var/tmp partition is not mounted with "noexec". + i18n: fixed inclusion of "include" keymaps - Drop dracut_makefile_cflags_pass.patch and separate-journal.patch (merged upstream)- Update to release 022: + fixed host-only kernel module bug - Changes from release 021: + fixed systemd in the initramfs (requires systemd >= 187) + dracut-install: massive speedup with /var on the same filesystem with COW copy. + dracut-install: moved to /usr/lib/dracut until it becomes a general purpose toot + new options: "rd.usrmount.ro" and "rd.skipfsck" + less mount/umount + apply "ro" on the kernel command line also to /usr + mount according to fstab, if neither "ro" or "rw" is specified + skip fsck for xfs and btrfs. remount is enough + give emergency_shell if /usr mount failed + dracut now uses getopt: - options can be position independent now!! - we can now use --option= + added option "--kver=", and the image location can be omitted : dracut --kver 3.5.0-0.rc7.git1.2.fc18.x86_64 + dracut.sh: for --include copy also the symbolic links + man pages: lsinitrd and mkinitrd added + network: We do not support renaming in the kernel namespace anymore (as udev does that not anymore). So, if a user wants to use ifname, he has to rename to a custom namespace. "eth[0-9]+" is not allowed anymore. + resume: moved the resume process to the initqueue. This should prevent accidently mounting the root file system. + improve running testsuite - Clean up package to be openSUSE only package and follow openSUSE standard. - Add dracut module to convert openSUSE/SLE initrd cmdline parameters into dracut parameters at boot time. - Add separate-journal.patch: add support for separate journal for reiserfs and XFS.- First check in of version 020 - Fix Makefile so that make -e CFLAGS="$RPM_OPT_FLAGS" can be passed - Remove Requires on libcap - some more changes, most sent mainline/bin/sh/bin/sh/bin/sh/bin/shmkinitrdsheep13 1432050965  !"#$%&'()*+,-./012456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUWYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~037-49.1.8562.0.PTF.916376037-49.1.8562.0.PTF.916376037-49.1.8562.0.PTF.9163762.8.22.8.2                   !!!! """"""""""""" ##### $% && '' ((( )))) ** ++ ,, -- . //000000 11 22222 333 444444 555 66666 7 8 9999 ::: ;; << == >> ??? @@ AA BBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC DD EEEEEEE FF GG HH II JJ KLLMMMMMMMMMNNNNNNNMOPQQQQQQQQQRSTTTTUUUUUUUUUUUVWXdracutdracutlsinitrddracut.confdracut.conf.d01-dist.conf02-early-microcode.confdracutinstallkernelmkinitrdmkinitrd_setuppurge-kernelsdracutdracut-catimageslsinitrddracutdracut-functionsdracut-functions.shdracut-initramfs-restoredracut-installdracut-logger.shdracut-version.shmodules.d00bashmodule-setup.sh00systemd-bootchartmodule-setup.sh00warpclockmodule-setup.shwarpclock.sh02caps03modsignload-modsign-keys.shmodule-setup.sh03rescuemodule-setup.sh04watchdogmodule-setup.shwatchdog-stop.shwatchdog.sh10i18n10-console.rulesREADMEconsole_init.shmodule-setup.shparse-i18n.sh30convertfsconvertfs.shconvertrunfs.shdo-convertfs.shmodule-setup.sh40networkdhcp-root.shifname-genrules.shifup.shmodule-setup.shnet-genrules.shnet-lib.shnetroot.shparse-bond.shparse-bridge.shparse-ibft.shparse-ifname.shparse-ip-opts.shparse-team.shparse-vlan.sh45ifcfgmodule-setup.shwrite-ifcfg-suse.shwrite-ifcfg.sh45url-libmodule-setup.shurl-lib.sh50drmmodule-setup.sh50plymouthmodule-setup.shplymouth-emergency.shplymouth-newroot.shplymouth-populate-initrd.shplymouth-pretrigger.sh80cmscms-write-ifcfg.shcmsifup.shcmssetup.shmodule-setup.sh81cio_ignoremodule-setup.shparse-cio_accept.sh90btrfs80-btrfs.rulesbtrfs_device_ready.shbtrfs_finished.shbtrfs_timeout.shmodule-setup.sh90cryptcrypt-cleanup.shcrypt-lib.shcrypt-run-generator.shcryptroot-ask.shmodule-setup.shparse-crypt.shparse-keydev.shprobe-keydev.sh90dm11-dm.rules59-persistent-storage-dm.rulesdm-pre-udev.shdm-shutdown.shmodule-setup.sh90dmraid61-dmraid-imsm.rulesdmraid.shmodule-setup.shparse-dm.sh90dmsquash-liveapply-live-updates.shcheckisomd5@.servicedmsquash-live-genrules.shdmsquash-live-root.shdmsquash-liveiso-genrules.shiso-scan.shmodule-setup.shparse-dmsquash-live.shparse-iso-scan.sh90kernel-modulesinsmodpost.shmodule-setup.shparse-kernel.sh90livenetfetch-liveupdate.shlivenetroot.shmodule-setup.shparse-livenet.sh90lvm64-lvm.ruleslvm_scan.shmodule-setup.shparse-lvm.sh90mdraid59-persistent-storage-md.rules65-md-incremental-imsm.rulesmd-noddf.shmd-noimsm.shmd-shutdown.shmdmon-pre-shutdown.shmdmon-pre-udev.shmdraid-cleanup.shmdraid-needshutdown.shmdraid-waitclean.shmdraid_start.shmodule-setup.shparse-md.sh90multipathmodule-setup.shmultipathd-needshutdown.shmultipathd-stop.shmultipathd.servicemultipathd.sh90qemu90qemu-netmodule-setup.shmodule-setup.sh91crypt-gpgcrypt-gpg-lib.shmodule-setup.sh91crypt-loopcrypt-loop-lib.shmodule-setup.sh91ziplinstall_zipl_cmdline.shmodule-setup.shparse-zipl.sh95cifscifs-lib.shcifsroot.shmodule-setup.shparse-cifsroot.sh95dasdmodule-setup.shparse-dasd.sh95dasd_modmodule-setup.shparse-dasd-mod.sh95dasd_rulesmodule-setup.shparse-dasd.sh95dcssblkmodule-setup.shparse-dcssblk.sh95debugmodule-setup.sh95fcoe95fcoe-uefimodule-setup.shparse-uefifcoe.shfcoe-edd.shfcoe-genrules.shfcoe-up.shlldpad.shmodule-setup.shparse-fcoe.sh95fstab-sysmodule-setup.shmount-sys.sh95iscsicleanup-iscsi.shiscsiroot.shmodule-setup.shmount-lun.shparse-iscsiroot.sh95nbdmodule-setup.shnbdroot.shparse-nbdroot.sh95nfsmodule-setup.shnfs-lib.shnfs-start-rpc.shnfsroot-cleanup.shnfsroot.shparse-nfsroot.sh95resumemodule-setup.shparse-resume.shresume.sh95rootfs-blockblock-genrules.shmodule-setup.shmount-root.shparse-block.shrootfallback.sh95ssh-clientmodule-setup.sh95terminfomodule-setup.sh95udev-rules59-persistent-storage.rules61-persistent-storage.rulesload-modules.shmodule-setup.sh95virtfsmodule-setup.shmount-virtfs.shparse-virtfs.sh95zfcpmodule-setup.shparse-zfcp.sh95zfcp_rulesmodule-setup.shparse-zfcp.sh95znetmodule-setup.shparse-ccw.sh97biosdevnamemodule-setup.shparse-biosdevname.sh98ecryptfsREADMEecryptfs-mount.shmodule-setup.sh98pollcdrommodule-setup.shpollcdrom.sh98selinuxmodule-setup.shselinux-loadpolicy.sh98syslogREADMEmodule-setup.shparse-syslog-opts.shrsyslog.confrsyslogd-start.shrsyslogd-stop.shsyslog-cleanup.shsyslog-genrules.sh98systemddracut-cmdline.servicedracut-cmdline.service.8dracut-cmdline.service.8.ascdracut-cmdline.shdracut-emergency.servicedracut-emergency.shdracut-initqueue.servicedracut-initqueue.service.8dracut-initqueue.service.8.ascdracut-initqueue.shdracut-mount.servicedracut-mount.service.8dracut-mount.service.8.ascdracut-mount.shdracut-pre-mount.servicedracut-pre-mount.service.8dracut-pre-mount.service.8.ascdracut-pre-mount.shdracut-pre-pivot.servicedracut-pre-pivot.service.8dracut-pre-pivot.service.8.ascdracut-pre-pivot.shdracut-pre-trigger.servicedracut-pre-trigger.service.8dracut-pre-trigger.service.8.ascdracut-pre-trigger.shdracut-pre-udev.servicedracut-pre-udev.service.8dracut-pre-udev.service.8.ascdracut-pre-udev.shdracut-shutdown.servicedracut-shutdown.service.8dracut-shutdown.service.8.ascemergency.serviceinitrd.targetmodule-setup.shrescue.servicerootfs-generator.sh98usrmountmodule-setup.shmount-usr.sh99basedracut-lib.shinit.shinitqueue.shloginit.shmodule-setup.shparse-root-opts.shrdsosreport.sh99fs-libfs-lib.shmodule-setup.sh99img-libimg-lib.shmodule-setup.sh99shutdownmodule-setup.shshutdown.sh99susemodule-setup.shparse-suse-initrd.sh99uefi-libmodule-setup.shuefi-lib.shskipcpiokernelinstall.d50-dracut.install51-dracut-rescue.installdracut-cmdline.servicedracut-initqueue.servicedracut-mount.servicedracut-pre-mount.servicedracut-pre-pivot.servicedracut-pre-trigger.servicedracut-pre-udev.servicedracut-shutdown.serviceinitrd.target.wantsdracut-cmdline.servicedracut-initqueue.servicedracut-mount.servicedracut-pre-mount.servicedracut-pre-pivot.servicedracut-pre-trigger.servicedracut-pre-udev.servicepurge-kernels.servicedracut-shutdown.servicedracutAUTHORSCOPYINGHACKINGNEWSREADMETODOdracut.htmldracut.pngdracut.svglsinitrd.1.gzdracut.conf.5.gzdracut.bootup.7.gzdracut.cmdline.7.gzdracut.kernel.7.gzdracut.modules.7.gzdracut-catimages.8.gzdracut-cmdline.service.8.gzdracut-initqueue.service.8.gzdracut-mount.service.8.gzdracut-pre-mount.service.8.gzdracut-pre-pivot.service.8.gzdracut-pre-trigger.service.8.gzdracut-pre-udev.service.8.gzdracut-shutdown.service.8.gzdracut.8.gzmkinitrd.8.gzdracutoverlaydracut.log/boot//etc/bash_completion.d//etc//etc//etc/dracut.conf.d//etc/logrotate.d//sbin//usr/bin//usr/lib//usr/lib/dracut//usr/lib/dracut/modules.d//usr/lib/dracut/modules.d/00bash//usr/lib/dracut/modules.d/00systemd-bootchart//usr/lib/dracut/modules.d/00warpclock//usr/lib/dracut/modules.d/03modsign//usr/lib/dracut/modules.d/03rescue//usr/lib/dracut/modules.d/04watchdog//usr/lib/dracut/modules.d/10i18n//usr/lib/dracut/modules.d/30convertfs//usr/lib/dracut/modules.d/40network//usr/lib/dracut/modules.d/45ifcfg//usr/lib/dracut/modules.d/45url-lib//usr/lib/dracut/modules.d/50drm//usr/lib/dracut/modules.d/50plymouth//usr/lib/dracut/modules.d/80cms//usr/lib/dracut/modules.d/81cio_ignore//usr/lib/dracut/modules.d/90btrfs//usr/lib/dracut/modules.d/90crypt//usr/lib/dracut/modules.d/90dm//usr/lib/dracut/modules.d/90dmraid//usr/lib/dracut/modules.d/90dmsquash-live//usr/lib/dracut/modules.d/90kernel-modules//usr/lib/dracut/modules.d/90livenet//usr/lib/dracut/modules.d/90lvm//usr/lib/dracut/modules.d/90mdraid//usr/lib/dracut/modules.d/90multipath//usr/lib/dracut/modules.d/90qemu-net//usr/lib/dracut/modules.d/90qemu//usr/lib/dracut/modules.d/91crypt-gpg//usr/lib/dracut/modules.d/91crypt-loop//usr/lib/dracut/modules.d/91zipl//usr/lib/dracut/modules.d/95cifs//usr/lib/dracut/modules.d/95dasd//usr/lib/dracut/modules.d/95dasd_mod//usr/lib/dracut/modules.d/95dasd_rules//usr/lib/dracut/modules.d/95dcssblk//usr/lib/dracut/modules.d/95debug//usr/lib/dracut/modules.d/95fcoe-uefi//usr/lib/dracut/modules.d/95fcoe//usr/lib/dracut/modules.d/95fstab-sys//usr/lib/dracut/modules.d/95iscsi//usr/lib/dracut/modules.d/95nbd//usr/lib/dracut/modules.d/95nfs//usr/lib/dracut/modules.d/95resume//usr/lib/dracut/modules.d/95rootfs-block//usr/lib/dracut/modules.d/95ssh-client//usr/lib/dracut/modules.d/95terminfo//usr/lib/dracut/modules.d/95udev-rules//usr/lib/dracut/modules.d/95virtfs//usr/lib/dracut/modules.d/95zfcp//usr/lib/dracut/modules.d/95zfcp_rules//usr/lib/dracut/modules.d/95znet//usr/lib/dracut/modules.d/97biosdevname//usr/lib/dracut/modules.d/98ecryptfs//usr/lib/dracut/modules.d/98pollcdrom//usr/lib/dracut/modules.d/98selinux//usr/lib/dracut/modules.d/98syslog//usr/lib/dracut/modules.d/98systemd//usr/lib/dracut/modules.d/98usrmount//usr/lib/dracut/modules.d/99base//usr/lib/dracut/modules.d/99fs-lib//usr/lib/dracut/modules.d/99img-lib//usr/lib/dracut/modules.d/99shutdown//usr/lib/dracut/modules.d/99suse//usr/lib/dracut/modules.d/99uefi-lib//usr/lib/kernel//usr/lib/kernel/install.d//usr/lib/systemd/system//usr/lib/systemd/system/initrd.target.wants//usr/lib/systemd/system/shutdown.target.wants//usr/share/doc/packages//usr/share/doc/packages/dracut//usr/share/man/man1//usr/share/man/man5//usr/share/man/man7//usr/share/man/man8//var/lib//var/lib/dracut//var/log/-fmessage-length=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -gobs://build.suse.de/PTF:8562/SUSE_Updates_SLE-SERVER_12_x86_64/09a92b0849d0f59135bacbb3cb09920c-dracut.SUSE_SLE-12_Updatecpiolzma5x86_64-suse-linux    directoryASCII textPOSIX shell script, ASCII text executableBourne-Again shell script, ASCII text executablePerl script, ASCII text executableELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.0.0, BuildID[sha1]=89c25a2cba291ac78d17a3590556aac37159928b, strippedBourne-Again shell script, UTF-8 Unicode text executabletroff or preprocessor input, ASCII textELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 3.0.0, BuildID[sha1]=5960f1616651bd83575622b012a984a9894d2b07, strippedUTF-8 Unicode textPascal source, ASCII textXML document textPNG image data, 85 x 66, 8-bit/color RGBA, non-interlacedSVG Scalable Vector Graphics imagetroff or preprocessor input, ASCII text (gzip compressed data, max compression, from Unix)troff or preprocessor input, ASCII text, with very long lines (gzip compressed data, max compression, from Unix)troff or preprocessor input, UTF-8 Unicode text, with very long lines (gzip compressed data, max compression, from Unix)empty  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRl\$PVOc if test -x /usr/lib/module-init-tools/regenerate-initrd-posttrans; then /bin/bash -${-/e/} /usr/lib/module-init-tools/regenerate-initrd-posttrans fi/bin/shbinutilslogrotate?`] crt:bLL)c;|:7R%fgoQibA&&R+f X+r@:&'xfYQjsFfЁ ļ%{ جx7JJ-$V(Lb_=ls#s{jA&BBQUo v+ƣ>βƹ^QrU u& y~$|<ݶ3]UC*'a}YtgQEaF ?M[Yp[V/.hM@-pn}H4YLssT0h[ğqk]i|wHg锲D2گ2Z&4zu><ȳM测H4݀[[J &iX|OӞ֨yPt$Y+.)ޓ)(y2*<M<@2Jo mpI5*M_k_ǂl`"OH.k7y -o9V+1c@*at Ov(BCLHT~GUy )bN(AWR8MO،\@%^"&PDu7emo@~Jclxf+T IVjxapLsaǸV{`~Ufz! IZ5YjBB,J=% )61hmnIʧxΣщ*:+ƥBŸ5~SG* aw/% c6hu_oGq]1Bl*\tfw &H%;NG oon݈`m֗ fL}vG\r*d:.(5$|>` [m/%.M%uN+KFDc;{K@غ*D?NEE誄Q=R†2$6? D=uy?neb{QpqNeTRXL}1FokJ>/Ey 2ۗ2 }t&tqM,{[(RcX ja|1.v7"ǔ* Aw)J2&3,N6.TeCӺp*5ulv4|nqfͳ&\?|b Á <3E]z3M]d"VomQ~& Le v[Unj Rֺ%N-G܍1M^!A"4ʒ }C-zR}7{D/,]q{tOsE53l@23^u? {xx} lawɯLCK<  !1%2˷(ey\ԭ&E80 YnYb#fO G7 h_MG M 4n^Nn'l5,}&KR[ʸ~Y >) *G¾0cfpRg'90^LhQbT'dk^O& mP_$|q ى{nk)䮗=~~zA%M䢯42Mkm񼑐\mqt1ո'0)p%cܤ4>b|djY"pus;؟cH']TE|dt΁/[\ 0<@~t_c2,;#=YFF{a'lj4q}v$&X]$ehZ|g+A(17LOS!TX; Fd=t\0Er: [\}<1j&̗5Hzܫ|cVuզ <6Z5/u$s99+HˬS6 9Lўidb5CUyV0ApdYqҩ_yp8D^FF@ C|^zth!X]yD Zz<0-ڙr&wA'"=s8Kji{F5L!7̙`f+~`x|̝F{KlM8vHei*I3Y< Y"n҂TM i{o]*p8R_scg0=kJ}9 Hy4ŶC?+EsaIb>-و쾓fFu´?97dh;O`7+Ӗ&1_o\-|CƺNZ23x'+T> vcH;,ޫ#Y`-S4 ME)sS8˫3Qg7ZKLWcʖiN$7j$S4}[ޔ+ ޶>L@tGpB-V6|W$d35(;Õgz,C3^o* `ij^28D񦌪OOH\PDxjLT.#dfӍSc=Jj/?zRU3٣bIo>dB3jLyr |ak3(X:"<" ;`j@s[Z=6/SlOrTW{>i{(oy]5t1u9uV+&l|p2|$SD Vt QR7_hV.|p*h,] 5 w`qm{Y@E4gݒǁC ё::5NK >k;u՘ojNH҃~ ?8u2]&L'ܐ>( 0beh5#WE?W g qP[8x%SKSp$e?0* l3G,čXفt^X%.z{*<{GmC /L,xp=D3  [#х7BGMb q!p"7 :S#[RLY4GmfGn+yˡьH\'XڳiѦh&vѤ!]9bQÏj^2m~GfWIdFsTf` @m:ƩisrYpc r=+}w}s*_ThG FQ#wq82iWV3#T n^ga*q`mQpp&jdRR7>) $U5! EjA_oQ78N6d0~"-`-C ;M[6ybb_q N $DYj> A+&f\:^>ˆZS۝Z.rt1i?{6W8YWD;}NgYWqPڙ~Ɍ*t#l 'F?6-,)Һ*[ ~VCǕӄ{[vxĆ4V  §t5i>zx l'I۠; CO$`D'_AX oJhc~zlŝt8vV7Q4GU,P /$Db‘}PBb9%r V0UVDC m3 qtVw,R ?Ů91XzT̳͛#gTl;uf=t':HIً4٭p uDy,ʞ'~Oć,~Nej$.Q 6 ĘWKnX$p\>,8qA=PZ;1m(o t~HavseďD=د&ǬV^o"4A@EhgFVPP|Ť^ ;&kodlS`;>, ImUkY^?사̎$-_SAXTk[8,5PTΈˌ?uf fyspHԙx93X_:zkrȘUEIN)aY#YhN;; _@_S^CE_1d&bU+J%$l[O ry 4ٞ%03IHC DB{P,M&DJd],Y`-+z@}?gծ]4cyuT6VvMB֑ӹ|\RD=k289-&ݟy@53{c2'hu fK52>tq#O9$\W/{d-^}~̿*lvhDFnsZB!r4xxOTrIɵl9d Q+y>UGp|)4]}LPʾx6 4OKEC^|5$Xdx"â* 6*)i eo ѹ=\ c u 5DzeV`{։,m^]jpl+~i)Uꂾ7԰djwb 8h@C-%Q3ˋ&QԽ`SpS8 qǹ\'E͢m)j7G*_m7J`MHZGΏ <2A/\ sJcT[~* 8|/Q!Ľvpa]B.c|t]ϭ`g gz,a3R-T |bf-@3ڄ%CiU  DOpUڋ+|ewCg~tySDsf%2(%x}պsٝ_c]^ jo [@_NֲM<ؼ9}t^ҌF+ MF)ĘK4 hQIOػ>T/nz4IO+")5p&̬NLha j$9r#2egW h&]P"^?qPhJL[J?J6>[VP}rm/IW`Q^4LAakK,jOK:0X0'Gd-,='Y-o0KRzb-+ !DLdqIlQi]k_ғ|w31a`~c>yإR"Å~O&(+s}O}t:""!E7R xX[^#4~ûoдR$~:ŠK$uByװ|Ԝi Z-ʻ$$HŤ7F/l[J^L }-! @6?˫Wr:cNE qy7L9gc|uz\' (d^o"]iHA!qF5㑛O6w%$әZtU_D(9wDeH`>^Eڞ2sVN:>2xC̲b2ղE&"ȶM;fPYtUfԹ6q0Zҙ/*eq0b>N&hʕ,S7m0XQ$}-]DLX t~vd 3Jʥ_fI+pwœf lOX D-Mu#Lejeb_+-D] {H~JgY,^`h3Qr a-~YҸkr"skNlσ*, 1ch>{:δ(E0BC-3ڨd.^)3_q>nTQmΞ)I,͙ʿ/x$qYanڂCV-JIOX˖v\Lloar5?\eM g  $Fx6{O#0ZUZW*(i"xsی"MZAK&'Ԯ)8B."8]ՙ9nÐDG,̝_Y5.FLJg-2 dG[}lXR,ˑUU\R(K18vZ>E)QG,0MyhM.W<0)4YЊ G+ >+m9C KHуscr]Tm& {NQ|Z|Vl0:4! *5jzox8L2-6!Tأލ6^Uu,r`xv7 1 #F;DϑC3]AD~R}DQc6fLS; h}7LRjMsぎ`mJdSL)(J 1t^Z!S I:g]TSx'!u JTЈ.Os.eXsA4] 2; Pݑפ?VvxZiG%([p@#'OwX9g\'W3a-Zǧ+к(j ߑ?gI &u mI$u]tHylm$HdkSaMci3j\1.j냗[bۧ8 b6܈ՕŔ4^{:L u:JoN)ߋ[ cGŢFy> o=S0(]CccJDr%f٩XȘk"VD1xvڊ츘M9lޱ~6joSDLuRCLqaT%y#pok;Bxٙ!hm~\g>ʼ0+G٧%T7kH6{YR& J? L>ѷ%[U8' FNO/FͼH|pYd}5'Ě@? 5\4bIdCTTخǸE dC>$i3ֿofz4dD"k[:| Djc̑CaZu%[\|H|87˹"c] *g􂧇uMûUYql c{&̀Ai* Z4O/@4T漫5G'k_p,jk…Xf]r5_ ..RxhQ{GƑ8Xy DBXD˛' ]\$L|OLѰ'`sPg{ "|7OY[_bm{=C.t/l? iQ]>7IdON2 ͿOUWt캣Rmzr=`בq ~L,&EA9.k?,67]DanpJ_iԼ z]sP?ԆhvL}+ӱ{d;B -znXP;}r]K5Ӆ 6&9LSZ6GL2 ^DS?XA.G)[-%ߨ>h"JJMw!"MdO>ҷx\ [ժ}}URVt$>V*mW %S $ؚ?YH/>N06AwemƵO_Bӛ}!97 7ghQ'q-oj[TzcrӻHz5©tQ(REE&ӱP Ԥ91ð >ߺ=:Γ;fQ</Α#aЃƎ5*}Ƙe`*;*S};aj}N?k lhy@Sr~됾eMC'Y.j=:% g[S !o:([qk.Aֳ**;_ ;5-[ u쑃q"pq^g_ĂSN2F dxgl [<9p__^7۠7CQa#EdrG:mMd[F8!Hk@qf{ENy5?>۟jx tד oeLvəl8JzD⭛!1UEPTW'F}WjѶJ" 0+̨i7B.4&ֺc ,+92r)X4 ))v֌9V ;umu51Db*LS.Xf(Gx2Z6"$RJ&X Vbz>J4S>^ٯAz Xt}+]wBNVXts2 fyY`: yG1G ~\S(H6 E𕱻7"8IσWX~VWc$~^ F×fHf P5\T ěh:7t'W^ߞTs zi:ً{处w`4lZ@3ҍZDZsjG tTԡj?BF&lz'k;K$|.V_RP4*%5iYc>J|(ckSiHjc?5qh懃LۖSmi.x 64Oemp ` "~\ı;Sj%\)9UXȚ5iﭦsm+.WaKq͆wv.-'bUT ɚ6FLt(0.XY6흀/*[X wbe Eotuӽ6$-$"زr}d;~(` ôE.SsS,>4HOT4‰5>ך::-̍)YOnA,DS?a}gtU]4h/J, mgX+tSpsA9\T(^bHs3҉ >@ο6Ș>|8~h9BCq&^$|ifXɭb69"WmoV[gvӒ$v`He0UV #2 7DK7x@oMGeX {: n( F_*F+.7g!NVa'˻ x0 B1܁Ck9Ia%ˍsǛżxꎠC& mM} ?_(y>õ^n32dtuR|n µ6yL֤5jeZzݯw>O~lgs/HD;bCw/8Nj~ƿyZvCPDPҍ!>}~ߎ9N ۇ.FR`s{Y6Em4/s뻅Q.JDSTvTT|?`% ;/ ,gR-Љ1({AnAtNY_|0>ڗr~Ӂ]8nj1lX=GWF># E߰dl]f¨o(&WwN(4,x=U0uWAz(t#w#Idwں#I=W -t*ZA~uSc a_;L oe >m32{wH\TLde@A=BieS/^[r[?]7jD29DϿ xȐef]jq:M%ݗ.Sv}Dꯀramz֋ 3".d\)oԸ6 q߻PYЇAglaiGZO>:Uto^ zvɍBvmtn5E`W"_hz;:3Iw2/a=4HXVvmV'fM`#,wamУGy(6JA/SfTLNgX*A( 8J3I'rpe1 MɩC={cĠ0xd6! 9J>͈0sK !xyM`mBD9k3'qShr.BjGKÂ+oz)q?3BSP  ]a+7qތ(֣]E 3z_0HvB ɀ4bY6{no:|%9V6)(5 Oh\sx |%4M8oFID6mBHJKV)e- 'hJ Pa;x9;BVo`06Vj\y/rҫq]~z.fRB;2P*KWj6l!q<]5OgTJ,Z0wKh$pyЗHSEwo3pVa1yHGIW{v>F!lvgdq11S*?s >I|)f"۞:"dAJBϰqJt6"'OFYR6CqDoj# E!P/)<]5Q7 qj.@@wt:o)XSA9~vGڻy6%X eK^#Kګ oogxRB5I EgZOۧQ\;#V`x3ŐhT@7(!~8lVD4MgCK5V}Ozۦ߰`#hbҩ2p +ײAAyN5;FY-~$~N0WmAOTVI=+eZ4)pb8ń۾CWhm%ga2OY&o]-륝n.リ {[s.{ t1o ru/J5T_Ģaq`lMӫg* ^A{|F)OgkU$'m:J_>dE ^$FVSȹ$ [h"ts] w~t?1jL+noFC?`FRW2KT IlP=@Ɲ06Gj]OXNcyCـPy̫czWp <,νcQc T0YFfw/O|(ZkiLIl¡dqQdYö|9e~DVZK svc:/t\?5-Q8>ং7e8@iu53|HS% S֭>$NBftK B)U%!9cvAеkZ0"Ӓƌ< r5/ AJRk]lCĀ*E}\c=9z ](]dx&TMHjCT` [9ͱV`E_s|?Bc8N?u $wUh|f&I!^ԓo!@@Pj]e<&v )4[G#Sݙÿ73g;; |a;cbT2Zep}5簾6=7CLp|aЊ3L&Z: x͏a%[Eq>ұsB3 KoETgZ1xˁN@Ѫo,0m1ARP m\sfڎ۾Z8:g+P$=RL~2vW1uMh/ѭZ 7 K &BN3lSzp?-bǞbN)m NEwmDvH#g,b]-dZ7ܚ?l[Rdc*#ß=5H 2"҅I@ݥ ҫo\PvKݥ904щ/ҫr}s+c("e_cJ'rRAf;mc9|/yӅA_NDo I}^|@ךݝ`v=kH=dgp&.}H" !+&uGC\`>|'DP)h*v. .<%( 45S2XMX AWV.kBY|y0Β;PnkCPvPEBe.͊`{H<4$7&$`W!҇5(#~#:w)?s[PX^BČ.tKig s_t6/fĮ n , .'ʈSq GV풁k(:ixبviIb-4U Kο/CI^*a.F[oNT4cCV CT%JPj6`!`nT5I *ZJ*D"0$:7B|-e8cwT8^N9I60P^K*}!%k69&qY@n龂>cB*9h>L?uD>d)ܩVs3= 2yLt%X|4Xy)kArff jجe[97ZԴ嘖e=ȗjāߏ<;]D(vD3m`Y:$ҳj3Q0a=D5&9^Kι T>9~q8H}%RF4t\Vj*\+ 5Oq~bb^YsGio08'l/&X:IN+ĎS8g-R|ԱCB;4 nn:*MT_Ґv - )k%D58]U} дrmh JRljJi-S X]; ݥFPKIO:$u;S{E@3bfZ3,08[Sz-q;"g[M?a\T|TkUml*o jՋWJ&t>PWn_ۡpk1g;ԛ?OS*_,N7j%_v9PHbGd9؃(i5_!]PGuX ,oH{=NfQ&oe'ۊ~$DVNR12F6mNl i)_'T= 26D.s=krS&%ݴu*<D2 ,=2WIߍJ< ζ]sZzޭү"Xr8Am8;DO$?ჴ>*MjZg"GXhnM`=ʂDn[8|"hաqlҷ#LόIdz$c|{H+¾ւz׽7&OI6ۛ \Ll8[fC`O"h׎2IfHĪl.4":no\7=]]Է׺Cc4sz_0}%˙k0)ѡqg&sؿzt!A  *|ɟJPox_Spi/C}GA >xYmKlAZNfFV]-v;Pff.]CƘ rIZ'ę`kݲR<*cx hU+a{">D1{lwr4j]~(;Tr\i0'+\ oHp>,uR K?lXьagm鐝J~>r}zIvǗxjN1+?1D*5*(iO&Dьa0ӛ(C& `4j<(SW >nH9^ !RC*;{X>_ZXr8D]θ  БO'kX™ø1's `PrΕe=hPG~Zˬ^œ='@Ġ|l7C95|w1<<} eUBDm߳#jљ i*I &AlLLN֑nKkmP;`_0*2T<hAmuT5_=3փ: z=ɷkqT)&m3IFa-|>^~"4\MS 5YifW-A7bh;Xy Uz%k-޼ /IPs8*W7IIx3Qe[@PK }}T)+X1L~.Sj@ 6%MtjA]Ja\DPl7s<)njS Dٻy{=$NHΊ ъq#UI&3l:OϽ8l#jO:9kҚM@w005; 9l!|5h&dQ K(ReQߌ\ QavI\BmCxJ>}8nZTl8P%?3m2~1\C<)>b s!o" 'E!ΦLH`ʧ+TWDm87;@V-7qHkG5Kt쀮Gd&hw+`-xրE"p` +AyZwȃBP%ز3Hi2Ĭ-?`_*Q#WA&D~ F'Pk2wk_`rzF#[QZڛ2#k$O櫽3o-TR]XE6ɊJ(E7L4[`oVVoۓwǝ2{+F\uJxmۏ"i 4 4.X2p}(C$GFA˷xD/|-u=qi/ @d)֙Cdq+,ė9՗5x'/[,0FaJ-Eaoػa:=!nkxnsmik 8))wV'jWcέN؝ DKhVFP!%YfƍNˀL,;L#G;9J 2wL_z7~C $ьk1΀"ZM Af+Nׯvl@kP{CZUoLxzqk7!O\i: s#I@󎥤6!u?YŪ˚DAD֘ ԣCtʆmV0f fGUU PV>h6~yZ1}uq|<,Z{^~d:2 ñ(I/H{#t[kxY@-| Db$ֳCSwL8 _&UWBEx§>txl5w^zw = Q ":~QEGՌj^ڦQ1jA8TH VKw;";C>U)ttCiX(60[',IdcTL؄ncc"ƻ(+ɜu?(ٳuTyNrb?ULW'^\^,h HXzA0{L1|N,՚uW8A,%U[6z$+%f\p/AQTPyyKxW}2"k"26i|5WGlfYƦZ $o;D.i&6`,BhSFN Yo T2Yȑd'{y>6=JqXVZX }T^şp63?fa4^A{`hCW}'4INFtݤBᤁ1KeN*q!Y °bGl-#l&"P&ȾqxzUQxDb/JϊHt]K)Z5\*nk>)U2P"1E3D!Mڂގ)!iNogr} 4bfBǏ5=RTey1H򧰢cc ^uU!i,J$:gy0&rǞ Fql;J8ClQ][4l|^?]FI7^ V,8zf1(zirkTÒ ;p% vMQT:.I>0@z3BOD2V TY-96@Dw0U'ĬHr%,bx+!239b4 ・$hnaj}/nj-5rH]Z-ؘxʼn^7p\睢ap]F}ِpt Ls`gP9g]d5VfZN>X#_Ҁc?@ 4zrI-d\/M.$Ur9e~OSҁ6›c~Esο Hny$w %$rҊJm6 F@"6Y` 򔰙.4e7Br:=\/Ƙr[ fXje 5OaPMK7fll* m@ۡ!BnecaiX.;:b!Z/_̃i.kY׺z `@W/&ŵ`BT0;U+ OBN½0Z'-[PCnLw}j,N/Q{S}uZ}20U+Dvo 2˻'8%jn]u XBN#,vObC/J2]Y!qe=Z<4d_svMFvvimePkoXnjyT.HpKeZ ڙ>7H- %N:'iwHg!pHQxoK P)>9}x*u;VuY*y%Ebyq"{`DnӣD6[M[m 3&))-vl$5&S ~0JNcXbZFFuQKGUdBPc ]'Py *)$SI yѹ)FkqGѕ69$[A, eFز:$f ruƫ\.a-ׅ~=F7E2(1c/ᵯ\,]Ę,%?7,zZ#&BD%I =I ~|LΌ;58xǨNA;:a4Z6P }cRvN$4Z:M}0 3c{vqM})1QYT@} G懪u]6;I&9ü{nTwKzƭ7;+ES!M]Ȯiz(pVG6lOJ^'=Y.ӾSR[6lM&$+Yo@28\ qjPx/߬F,?.Nʾ&zZ$}Kf"Ih4P;*ˌ\?ZEFYsSA8ѱOP)zBjqj/p -͛4 A:L7ltZ93@BBejH έ5̶3igéD#YA?hf|-ǡP 8DBFZ\nHr W,܄7)%AP;:Y:&o!w$h_P#jQ-̜V ,Fk٪U/%Vd L oc yHT׆Maش`׻* b[ZM% E7[Uy)ݴ6ng[~{ddl`@in0~1.8/&^`9^Հ@ W!lq\(ѻH<0^Rd$W53LIx\g<"u>hi/[іW^'`k1G!?17Jb.\T=V7JJУeKSa#>R#:Ô00Q`X)%-] 0js^%t+G.1c2ȦqJ΍%kՊ[ KQڟ *.K|[CE??m5|Bf/Q dފ;a|0!ydнNMZGLqϻ?06 a%609G! X-72374O"aȱȋb9u>c3 '=%O{ƈ@XRġ5__. }H̯Q:{MOz٬ceuO':9Q eoIBk_4Cu?RlPo#qs牄BBeNC՞ lD:ƾ ȿId@c}mU\et$ +*\ ~OAsR+t#>rH{H J; Qި5egEN6)dhpx`,fNoAނD෥(8w3a= 뭡<ĄяѳOqNb -ZX41&kIpݒ>h'j|$qs̄ R?AƖDZujiܢ\UC8cR7;wtIAvG;c D6w}e?͞F*pm:*33b)TF.oVVQc <} fA?qMV!XX[mM=PyDGd$B;4ڡtHuO;-MΔqݷRpB$s\-|R3S}gXm+[yl_Ipb3SrA׏ŵ}׫B兣 jX!4QU-\ޭrKr %/G61tF53G>ˁ}N$zzaFm5#Km%'1(z`ZR ?D^NlrCG^"JY˩OG8@e4KiǤ7}:Y"Gr 6lP[Ԭ*w·?&N2@ft :Sv]GVCi_3 d^f(%9 )=1dyE_jg_*m/KPf-YUٖ5#}׊rd BILя!m3ot›dN%A:<U yJFq;N m}π X6J4Oj@Q0+pjIfN̄j!>'(> UߑqV ƫ, o%$pp&#W/v>Aw Fbud]rۅWtޒ \4eݑW75")>B[[%3ޖ=o۴Pԛnau2k7Ì\Nw,:-' }ciTEBó},aCIm.=_-7 Q.=Y @%0_'@\V& N-ߒBdfyx7y.0TQkM3JI!JOP]+l̹54+bcUHޮE$tPU7ê8=XBIXT< B@H=%8Ml󻮵Vx,~NV.o/T'AپMFn\_}h{y+IYfRI›G6Jڨ7dׂ:gmB:aҼcb>pV\*]l\TBGt/J)1EO$tmKMM<'lEl#oEMȿBRΡ/q ?e(˹쓦'&΁PkLߩ]`5d+q.DH$Lu/3th$wwQ2vCH8m6j$cG] bX$Z^#?~H`bgsܽ)[i͈2"5T%9q1+QfVòV.T^vKC$9▴:pfW0\[K+=lx!4r}iV- ^rέtty H , v,nq^^4ʎS|5=gVp-2V­iY2ތ?E bh"ʧR/aٟsBbY0RUn4)2x]o$2=]fU Zkg*I[/] ͹ey*>=FVYnԍ,Fwf=*ā$lĖ !-"d/ټ$UQVwV>y68ֽp[ȷfi~QC@+4Y H&s-d"C6E*G52~ ؀ Ϟcdy8tѕleJ1'O1s6A}"JRa:mp='ּr|\$4%R#,vo< Z[ 5)hg-}דt =rxh*%uT>'8lSa!L%j 3l1Xe_-˹p̪9"~Š8 2^h3@)-D,ѝ9_B 7u.ҿ%~ Z-PK88f}jΌzEkK 8n(2Twǫ:1KP+Ř(jFoAztRZ4Z*Z|pŨ #D'ej^~i"57ۆ KFVܧfq䵿&j'Y:\b=ϦT0 &BnΝ+J$1qJD w-/VzFG ـGGfSP:ULm !=t٬ >0@*n? Q_~0^ sǚ|8SQͫqO\$yN?8V' 9QGuLv\s$`^A0i9;;7DSdhWG('{5aqgO+f]N)I][i *V]&BExr[L%-  TAoΝgKy>M3@Eo7МRp41Ũ&ЎXbR2tka .g_R4>_g$s 33M> jX.ʏl8q$w8Y]Ә !'Byq}*Rfۜ\Zol^!Wl6.Иؽ%%7iP6o0^ T̍v/{xy@9I.|n5E C1a|y2^ [Jo*\&,x챈1kPU_&uٰlTu;OEwhyFQ4dly!W*Mwil!AtJ9  ߉0d=k}#Yxˁh屡%E.td 7휮4ˀ4{d꒺>rۮWq6=(AKz(]|ⓜԍ7( [^@ άV͆sھ)s w:-7n4Q3}$' SsseOSA,bVF&,T+Xʉga#<"d7qc^(?4ܷPZݰ#l!6C[@۳>OnvbX_@3urK5I}>}@9QIZA)-;AJ 䮶5GED ӂۉL^H!ő+;ν ɯ` )ާ%<{*,:L4bA|}=AA M^i^vVKx6: *Ae^R}5.:r: ?vP-aQ_L˜A`Dk$E oΖԣ̲8އKSC}6xD$hd %&8ryU$^zN"FIN#xbOY/fWfgvIygV$]=}̰pd#K=-,GVzԣ_?m&\o9hF+>,qF=xPkV$ȮZH=vA3(0Hp459#LD"EgB̥~'Ypfu 1SWщlA* Qjȵ+Ol--^7d859a~C1 ~ޡ$L!&@d%ۂ__Y2Ǽ,1JwIR(kO#biaiA( dGϹy*S4F[|JTK_Z)UJ]l)BX#ֱ`W՜CF͠B^?l!b>r=97m$ vKX˽E%MC Pz` ohYv$~V Tѻٜv*rElU}:bo}kҸ0%՚K O[NGppbD 8(p8 ݎfV mVwӬ9 [_ RGݨZXh o8nvw!q"jf߹E e¶Fa.#=x #M r9zf`=A/|P2w;΍|˝93#P2ŝ{(/B,"eHsCl4 ks4!ߨ@5?'g Lr ޾@ 90m&/2&۫ ^H=G6xaH-ӡCTLƐʇfj24e Cy ;04Hy44yd_DkCWł_EcV#\ ݟt4 4qנ/CKbc5nL1s81Urny=rR7m7&\ߌ_#3ziGp:upcc|zMfWl8fJ]@u̢2Zlw'+;- hzȍsI5\ft $Kʍ.(%]_/'6ᕎQDW(n!7rbzfS q/xAD%V:̧h aY@ʘ1'W:6LU%ՄQW^([ŶhcF`\Bttx-ev11␿J+wbw(pƀ57 T\S݇yIT>MҊ u퉏V2bV湓E]Ϥ8`~ZyzF`ʯ2<Y%!o|yߣC΃uitј]G(3vN%m݊Gj ˝F'n$o X?gȝy>yW͙iE{ur!Zl񧆥v's6F2*^6>lba>dZ^΃I@P(Vs{+zlM"ܪ#(nf8hi'h"|` /7TH 7ҫOm=xVt~X4M_%Mș8+ºZGFWօ?|9>a%Uǎ_&s6֜,h6;'ʀ)o#sY;BAey{Z~ #CIJﭯ@dm"{ &-rKH'h*}t{ AIEvZYVb?$^O&` [)# xy4v]k_}G-Zrobع8L!Y EF&E &L)^8IEXf$#]n{p-GyOLSeRlI.,1*5gHL?20:.*<,闿#/ik%xB VbgrdhfS.M_#~PtAsċ ,G^Kt\kYJN|6(fs WѵXץC?-/cJ@ HT=1M @=T#?r=mVs$^5]JTy+8B-*~U@lj/vĞ_~)7&u6wRĐ7~B=Lh\uW#b+BgL/rE57g][C?qۡB, b͈JlWp$X T~M#ݔ~iF!Tk j9yzg׀$Bk6'dw*rDG^yg fwr2j<@6luS.mZQ]9QK*.mayh"|{5P\ zFTFcҾe-x[lF(RJZOМ'0S#yp-?1,Znb$5wE7h޼ SHߩmj͚wZEof ,g Y'Dd " L+vCWIV׀VOr-u@[Ɩgyx| D|ZYO@ `ݐ\IPÇ&+)bf# ByNTz;Sm}VҊoBW it}*4_T7!i%W]?!=k&s&/}d*^`qG*E)lMlj'F(*B*, &aJ(-zggȇx+?KcݥnWqߖ 5H#1$U^?w e8/R^8(Ã! [ vקO_o}z@~KQ梡N,r6 !M3Fj ^%lS7 [+/BPUx4.f,oM;*ޣ63bmJkgBN]nv9p\NF@F'VSU%U^=a  =M'ϣ0\/g\@y4ͮ縘_wo|@h*fvB 6m+_$ d$JIQ^=9V}eBnk~I" l<~hSA v>n?b˃q7m!*L̠XY'jnxfĂrƄt<{JQ ^RC+p;j<.&Io3y>lDϢK4b0:˪YKŨE-Xj' pV?G){'I~ K!5Dh/ ynR1^-P6ύ вV7ϖc5azHϑx7{"'YXc܇,/`^Cy=&7ZE9YKODUwA@$uu~w8#^J{Ֆ2&-Hوl5y'-ha7HD)GeD'4`*[`@`@R듚lZm}%]M4M )Ƈ46tV$+i\A:LzJеP% h'X*)vt<6mfeGhz-JC!q'RTKWe+^٦#tKVͫw5ȄZ̓'wU,pk;9r.lNop9$3^D"P0j 26bTh݋BgUXP_zgO0T2sǺ ĆN>wDN&3J6? %/:Zma &Z^vWu B֌i#bXRq'-zD>U16vK;-(bҴ.asj=q: 8#=NR U<'93q:KdU`|AxdڞEXTw`>9BYU/vVOOYUJ\G)/lNޤ^ 36]8C^⓽I꼰5vKeGk<ۆzlga/7p!9M,9W4ꁝQ2&fzDXaB"&y+:Ɣg=JyXe <q:h-|Rj7T^Sk_fP1eW-4Q#Tے_&kbd{ٖ6g hs}} u"6eDILuC8òۛr-8r]g7|2o0qб: k&,c;$YR% X_°XbmD l[,=t P7h-dM_'G:f "hǤ76i+`0? ㌘=Ӵbj!R&C;>/=_W]s)v50&,S-N{,-yӴEޫNsd(1n!@4FOے,Mc ~@v_G&lT }v] iˡrhF: FYsݗ|e/ݹn?(nϯP[{DKI n;P6V084؃BANV>$|.{h9 oT"`=Xڶ_t@Xk3QCzc掃q}l9HkCGЖ!NWR8h9TR/fe#á;@ͳI$l 'AumI'BNE=y;INRE0 285!ho6u\S8]jAN'.{r>ge ;6~SB bp-jg g=83􈚠ѺOd,,_nyN6Ls\kCHf?#[`-PDbꪒH:9]9[bxiIc55rp%(ɠ50ɪțD7duo?q+&wm#/]c `zZJ6~Ær3yӷ]]zJ5ݱɦq˛Is2 9+>`HCqޥOJX1KX*3;Qs;ޕ`DDɺ2n~3Xݒd&G}oT wbN+mm.nFSٳA1򬮴2&@AYg_R_drZ@&IR=&CJ~Ū}ܲ%"m#=|/ "#gr VK*?hj\ُ]$'z@(^Yɖ#]Dty42AF._\zA1y23d5(ZՑSM=BL-|h˃ +=&x_>$L))I\YNɆ%MBӟpGJpL;^~Fg۠; GlVܑ FFdB^"dESj6fʻ]HWp/X#F%U@𱴨.& % N!7#fq7g`D`n+^er[imdy81w@ξ;g ^fɗ-Zg(.\$s%aE/P4ɬUR3LRePmuR }GQT2@)qK&D=$*'{Rr4I(J\OGb b@ hN8Z;wKM4̞%`s^ }w,:;ݤ~ڿ%ӱˬgqwtz֥%>Iqh߈":U]vz^^Mb4( mdq"zfd@×6R%J"ċ(P}FȺASÿAβs<ﴱ4b45ͮ|*&|տB6yإi~M`F5cAF4/˅9ەg'hŊY<'q4VP~V`V!-C8vMsw/ TW_U뾘L@Gj#JoX|[0N J; Rtr 8rMpm( L$A?ZHؿ<"Wp<[R!9"I:9V_7TķNXDΓۢ@Wμ!9g/c{$\r[ GDP !.ܐxGyFO[<>3^pz|,psМ d㵌ΦGXDg'xuTmF^/^/OUWvA;?`>5#}ڂoD$nw^Q(Ya%S }|??gH aWZ9 ږFԶ.I ~-C)*=er4~&2">kȸK,DU AwяA^f𵘙 َ[f1j@ x'#ϬxUF8C#әVpH^5c,vdRQŵ63KJE<-dN`=k "Z7_}]LC^/[r)6ǟAu:rNT5l|VB<[#bӌ0ɋ QN0,eJ2mT5zLO,cJԜcH._)rx/IY`83_k]E>/'[o_a5)@V$nܵnjx1Hr1 ۿpʁ~i̓d[] {ġ6) ޠWCǻX}Ѣ+D[g{TIGl <^9H;hhTTvQU66;SguΫ".fSxcig'cq\}hŸJ5 d鈴@FhES|(aِ/z?KPo)慫C` f1:+ #H:$oIH"VD֐*=ORx)Ί1ȸcJu7;mcM|H] -~X-v7ƙ^4WR3a ͲkWk.p*vij2H]ўoa֭4#=S>F;KuK#ˌZ ~k?p&NUlm> }и'0\,qkM7'̙qB>MIԼ#$ Ps<Bv+x:[]OƦb Wu8'kű[3Qt Uu}h*9K}զ+%qA[~HIf ,*{rQؔd4ߠ97=RPu-[չ8 S[ LY7Os/XHr5F%@ lcuϥ[;Ni=c;Nr0N𮳭Vῇo: R2)Enp7"ŵ9$ݞ*º([F_u٩ fJ Q|H: Dc/#e0nr2W[*'VyZʞ NX:% ։JA2,9 >VmO4%dWB*Go+/&2F诘(}Ƀ]RS%XuMه$&D87Ķ*&[fL:>Tq8,5޲qTGh_m\~x^NyGѤ7ϵ„5Z=b6+6;@,cY9]{F |0ka.$Ⱦb9yуsϪe]5r6 i}%U,%y*&:Pú\8]My[f`g0WX;ތk2 k}W6j:Z+hA~KGGwkUIZ@&'{H/Ka}({~&5c!JAg:-MH CE|jV gRa'ת:9q lyΣ.lXQ='Yc>ӎCAAfXl2$> ʢ|y0'ͳ*>$?Z3(Jan (^7)1'Z<_˙A($R0R9иz e,Gś KG޷dW['&/m xECآ RzXń_ڔ5;DqE%ZиBa"%KY8'jpI4&=TR*3K](6$ۨQT\dRj:yd Л]rLY>)]zL =)q]KeY<*kCE .Md{W͍ F}sMяMsmEXL|iqgװ4ybIt޹DG^˵ {%aO*/i9e{/ӟY9e 0?ǶV>y-3L˗$J*K-L Ca @TUfw΋f Pv(Q;Pi#σzpU;{QV?b!MZhې59AIFL(c|]L5U4g#`*}f(0tJ[$6wwKF{rQsf!D`![R:esB&f78E9޽m^ i3˺YM r R'+3QpX'^3 sX$eHvG+T]>tW.R04tres:ӎbu4'=INࢅ$sJ ӵ)ruYS7g٥]&$kg K&+jW5i5>/z/@]g᷇Dpq\'UkEۄynS)Y:WuOMO!:/R-m>OJo sb(~6&mRHYZ|)ZzRa3c2Nز,xA_jJ47f' uPo_\wQwa#fy)=&.07mُ诒&!9z:[=eNH䐈)eP]bG\$ S{}EqDbtFu/ 0"S޹5Ku@ɰ 4Rj"}ی2sΎ`Wj7ɜ{”. ewY|M h4Gl! v*)҅|@$:̥S9 ?/S'߫,͡D vx,0ou|Yo3s >c8%c S:E$}%}͛BZfԾ\ob rj:H^by5Uz@:EUK~|]zX`+nJGFrh^Dl~cS%YjB~Zze!`q*#@G?%O2Z0={ -@n Ùv-=B !t;tznmSm[" C9K˯Xcȣ.>|ieHX Zt#{nXR0M-M@>TOhJ A?vIʠ'Yq } y.U-UXxg\iʌ]PI}@2`jzQ&i8Έ[H'C`1Hx:XvR}s#+deSwlXG |MbawIr.bT}a),-wB-@x ƧlRY\:Rw ql}mleϤ9م `R,fQx xN/>}J8gG8[`Y'cLiy)U!31 up]C;x~b| vkjxmؾsa ;2Vÿ +8t8,P+ E8tX"gALjVqU% O<%Qdž 3Ek{ --\,=_)-Tq$nf2=–wb!DyF.1S@ 42^َL0c-[Uc @́ Wd/QYkM"8eYl|8 }~遌n4c9&8C;pRG396*}M2&ZMVzJ\LbGPgzE}09̄#/P+䱉u ?/+1nh &qq,ۖ]`ےprJ3؃.hW)*  (qOE"9o PUxFj)i8XgwiĬ툌P& *A(c"?Hg-AaihEn7~ lCg:'2$Bu_4GCB`=5h/o%e"wJ. f٠aO5oҚfyIrr(u>q>7<e `Gy'Ռf1=*y轴U@]{SF-$`׈هYEsu7NjvfQ/5 ;S|m Y$]   +\&Qy4&}qD"G@jA& |1&UoFw{1D7ǹ#d#neK2bbq*Tżk;/=C+\$J XQ=c&NF? 2Hbnk.Tr\h|+"IbS}xj 6ge`@̮.>o(I|ME~F59qàK$na^8ճ]\9ɓSZs>A x1}ڿ͌ew.߈61ǿv 5swZy5O"3d]dSg%]arnrI1 c|hx$B^[ b͞Ei>A- B.c9ǁy$()L%[vc&V Q__Ntu'=D`·>Q%]_h#䙒93XI,}7ake-5koqӐmZG^fX>$ +әz-̔7܃g2`D 3ZuG4#ߞي;r73>WlpT5lC^HS"eQ Nʨ h8(Y' -e`kPar9ɷ͢|11ž`8"Kر-~F1c^G[4t ZY,Ȼ[XMYٿ1S-$C˛#Nޙc6veT_ [XJK]Y_fh~ʝRrRgF]$3"b}ugy*گ8-'Ww ۺyYl&"*ڀ$:T[p{ _!9@@A63A'.-0HuyI#vih*)vITIyai]X'ò~yԡY)mmL /%aM HIAa| M‚RD_N ^A70oȖ5s;lE>(2ӳ@)ɆZ= YrxmvV8m @ «}C܈0Cѿ}qsy3 `4Cg~6%NXG@>&Vjo,² 7qq2s9gV܍D{rqAGo>SzWb<56mCnC1<..՘4)dSBS*TuĜҶ[.M,_MygIG!g'Z+<(#_*&r5'-өwߪZ3;-"TK@Sdvұ3n <-A dȊ` dW7ɚHYnACRhg@/HF|oK?R~jjE/6>S'0(Ǐ/nuZ:~9iCs,YQ,O?YG6S.9:$q4ÛE\,ˌ檧x9oWԹiwSs'!`i &JP^'}(һh0SYh#vТ%ϬEψ) ].`}Jt\":%".gֺ3#}UI6rRC?ZT0XS5/-iEzZ(C1 JC۴ݙg2aF (јmC9AG~y~b&:z.TCs^'>lۋ}] }j%#_SʺOMP#XY:mߵz.Dg|o8F_yAxU=8i?+K OsI(2}4CpZ ;9À!hqy☄}7լ_;84ӏ3S˦0gK8B {Q[zz͡^+,̙kESn/XRyxcMU% \Q_,2@PחЍf D0zɀjۆ!OWVxrHo<W G89wu]45YNzpgZ'/+T( 㱦YlyYNr 845X[M ]!N%ǺWÔq_o2 tġ͘NvEQmoy[,}L1_y}^Z='GH ğMiFԡaMjTdɥk[ ۊ/s,.kv4FT)w$[9S7Bb8íWٰqE`nFP"ǷȞWWmDHj2%2'=lm~ه #"hrc`pUK\Y4ў2Gݯ?Ʊtn+vT 4|E4ڃkzWX87ڲ/z߉F[S <.q놳[SEfe+E?+%/w g)E^$_Mh*;@JR'~mb<_v+gSf7LpQ+`qΑĜN:|2rG& hCFCJxI`@`A1X>,m]Bb]jyŸ =dyVMhQ=Xxgwݒ=#& e ^7exHǢ1/WB \VG7X ?n}e-yweSFsH{O%jHޗ+d1ēaK@.cz`C'@A#p474$+'ѵ&ɲj)enZ &t{f< WMV6?sbt= ^Aё-XRv3;VnA*y`[)Ri^d\B,R¸+DX1 t[ba`&9qK%0Odp晹$IRmgg.iu _)6d 3g/S dΩo8nCb 1᏶,,&dbjc]bq #/D:T.H.bl[(T>l|eڰ`%Ž8Ґe#X{ G+3V4e]g(T(%S veMjee^ RnIG6wI6snnS+7*~b*Cgg^4x˩26~Cp#8k[tRDͦё39?Tc8d9k$QNf1 *mGtӾrVUrDaV^5wGe1w+{-&\pCsj; Y⡐̙ߕm/YQC&ͷfLzۉ?fO~;ⶔd5;($,{v7+3̠}HyH M`~Oe)y2[$2u9!RbJmed@S jr赛O0gm,ot}(t^J-?o#KtefSl(ne LU|7w{j4i;\> 5h?QIAiӺuO"'?ieXN֌,cRB[Gw)<НypkLўG S ?yQ`pMiO7].^&;٤>.'n!ɼ45L?p0䘐$zOc6Rb1X"끿; :?{&=rhy @/]"Ah ^MUO.G Y!ɨ"Y( yh+_`hPCiUjO#mnMIw؅g;5WJWKv_؍e`pg{+ $c!d2v1L l9Q^˨"U PÞ a,A&QI=jwe#M_}e6IeM f?(JgyjZCPW8iKgƹX^j,,}|q#XN@_RZ{ f,ӁSl7dBW [@eF]fL~: Qwi[aU[vCSWpiM媖YINjh挾"U[+_3eSs4ph|@i_ 89<܂܄lk}W4e:z(w O9߹Aq W +At:Js)v,.\v:U~; Ot\O4B\è|'m PHhs!+[R^ gJiܺm1EB)cCw׀nO3v뢈lKcAEy,*z5-cqi<)[JR4BK$Ҹ8dD5_?bVr@E^$ B8`jO{ u߬$* O/nuJy }0*'د`%j)dGbW^ɻbpa?UNz.F>KJwxٯ)1Etl<@mЪLI3k>HPjU ]ם |e-ylRb*-qztʨUFvul p1z+|l@YR \$HVIKgrIiOʱʹhhpJѕ~8I}Y0ۮt͛`>G~$.gAb7CInpIBcЖgjh:*l q2Y|:-ul(}(+Wfa(G6/=qTT'ԕLt8~ ,d6Po驵e/ID^-0}-B%z Cc'V ! nx-o8@9 KV@ݕ @OH)4Bؚda}5-U- }x뿫8[*jE₏d$d`9U$g?v}HkO'qo[QG7q',s_y}^ʜ#袈 CћV=Qi򀻴h4\>-jձ IHcRf׏[U<_=BkH|8VB}+/ .;賳]SyCU"F|ϳO<q[6olLL,$jaa[bF 21baYR*eL~"_#h(vz?bm>y6[Ԃ; :u7d4>:B4A~n!7xPd)&wa:(j_شxK9aO-LeP߂׆܅ jCƒak@z$px$ +?2JW8 M&z۸Vꞿ4EJ;(7ǩHDyt*stk+D`]#|˜O E!Plj}ъLB>D.d}?éN06x e Cyns+wsDw]VFra%MQ'榰\#nZ%}Z{#lT2s;iv%ڶ!ôB8FIσC­JsbWmS6 H MܩQe(碣}ϏC_v:sO -4Vcz9yB张v pn+-kK3l~SvP%HچIhKJ[w;0[ngKzß#K1FCA->ua3"sfZ׺پա0 ML4Lᦜg SK&&C+brl\{*+Ωa}Xk; l>rƻ.bMDhUP:"mK$TcL{fsО^~)K]U"_k";z ІSl " ʈV ɨyѹH oNckG xb _ ]NE96tq^ߛ 1V"WZxTo$`9g?Pͼ wepzl:>\WNg8%,X8|?L!ֹ(4%Lb)Ơh{aEdh/ fWG8TfrO_;t YہpnEqe`IV#v>Zh=)U;M#&\fʶQ$ޑ6ONrֺ2uӨ|j?IgMW]I.!pmjaA@7a:ȨpZ *>>U ;G)7?/ai0]kQ[z%NϟIz fga;uh.y?݆%쓜:R=eLhk?}1r#(j_2/8|엀 m kkU]ҞU ,r"m"@M 9/ ӔEp<8B n%% }́U پaIZ$%PfO<T<,m&auAhprb eؓŎ)( *_%x69nyܟ~VwR'nBfH>yO 3o:u=b7ec0xlmG1+ub%QȂ͊`&73#C>໚#2sÆ$@xmT  X[q*3쯊qR\5yk_c? Xe9Es[$|&FjP??d :09bOƽsftˁ~]z- sT[ΕG- k HQ?B߷}R#P0,O6 "nvEx`ZQ=%]`2Ҹgr`OTB>IydS~+S{Do}?KZlEw=XЌ+-\%.w:(m]{,k3/9ɶzF^ז|BISmvLc7:E%/ 1)/Qкp?!lbCZ_9K\ХxFڠQlG,gPӸ,S)BSx +y1(/HgM~%`deO ݟHlWH-pUSWV!K2= w<+u$)GzL0]ET%IH?uU`t= d`֛GrлD@/2K7sN~xQ2*9ow}"fG8 VGڑkߘ@Q%- MOx5]9Yc6C"vF|MW6ua!:%pA] nkxàk>( >MOB'Ɍj )tyr y4]()F%#qb+4bS̛/GN9<ҷuL)m^T^PGfD]ލ=k|n#va&%RpFq4#:SEV i#9P׊n zĆ*ث"@g(p0f;D@6dpKE{L`RX=S@朐Z6`jq+b4UlSG0Q1$+q~0P`05O0*hLNܺxE:y\qI-檢7@_ehڿן4`u|F,= h|^m u/C ƅ(nR:ֲ h͕a HNJb\nTG"j5"Y;N!'MGZiIr:w[!,V[T]J^4Ƿo'D?"䎽sxbϗuNmnT W7*/T';!;<=j4(v ǾᛰD@f_U+ժhzjb)Ys82V(+˷"je2Z8\CDi~]C9kK(iF yUqGkcgҵlR\LL;졟. ˍ>ԃ28O[#@׻lrS0& "^4}D W ^uN{Ϳi9[P?y8x =17GpSPu۴IVg4!H<".amD\TτjΉ!VRY``8&|scQ+ޏPPyk+HWʖ9W IۃOm+*cRs"Y Ў^eѬ \ejZMrOB?8vN.e KUbp\I8]e!w1p<[pvg^9-5 7UCHbzm63J/8NB'i#qO*9,KV [kk!tQȤv67)[Mblo1 xv$=^bʸ\h\Jȏ$85{Fut^rl_Y:OQEF#6̶JΧ$*]HأaڄuAߎ:nh9J!٥*Tg] [L``bIrfu[u[zLXe, ]FGi$EH% x}e َ\RcQeVlkbt`@xnrp]žm֐IGhEq:Z?c\'}̂0?{5FLix7\Z ;ۇP*'5@ a$o\;tT@Gu-t$3Qqw(9SJ9+ou2}RqwRMEZ<"!]%8nIHчĨ3 fGFӔcV_VJE~ +I1elǞGfDt@?\8G2 yJzz5JTeG~ƙ6YWb>ܬvj] VQirm:|T3 :lo&Ǖ㟹mO0w2XgI_sVnĦѣu =5*ΙS ņf Hs|F*< g4TwzH6PyŶ6z6î[/FZaj| +ad10#NK] Rb&=\<#OGvϺDrkYn2۱B'Eil I8~-.>=GILzn8R<7wnfVa>Fp0ޓaTvR̓Eq\J·+;rr(C>͹\{cURЀ &ͨ TG|NWzNX(χ`яE2q ym }ɽnbyulVlڽ7xH#9m~|Jnz]:)%do`X7C]ތi~}Bkj>hEqt?+]W:@yulPZFY\y7|%ZǏgeٖ2:_Yϲ+JYf0VW;ise^ ^s0w?E~}}Hߣm,t %`1WE':nB#L)"H64a T JΜC. #3wDXJNQE+.N @)0?{̋v$\6hGM<(Sn?=Esr,|;OO&Χɲa=̓Ю9EX:|PG̲~0PkK2Bƴn cm~(7.b=!hVPZ \L] Q^nj@[,. v{D=+Xz)pw#@c~~.67n Én(ѵIGKb8^+,Cm ZlBoID&nRTP^8\qx~F[?p ܏DirYWDCy2ۡ;M,DyB2]Et=x= ~fi0aS=æEmX%`Vsl,jq,7 )rQo̢#$0 BYQ=u8IWƮ'"A_M2 )8C*ghvkX1c cf4".4bX+QnYvi rݗW «"S~ZGA8|NK}[tgaiy+u-^;Eľ/>}A<`X|mX߾JO |#ESJړt4ѥhH@kZ9} J!hWw Y 's*@!_eឮimEA8@wQuqXo:ѮV/KEljQIKЄgsHU]ܾk%%-$g^Sq<lIKM\\~&cs?+GlgH{lgF^Öa;<N4j?NiEWhl8{4aSEzƳEUAE )r2>2WH#>v =j#SoCvA}mG;. -B?7]Do$q'RjhūRֹ: tǤ* НHyF`;6ry@PnwdYPYo~ []0GFۈS e?;v#T وST-̢ N8a lmDkY(~ 6 <ùY>2X~3V$o4B3l_a&p<.ge=[Ar1Zgge~vɨi&EIІdi߈ưyU zP!L0="q̝XÐjb[8TVid7e}MۮN0%#T(K~X^<(eD*X 0ȏ@ .yj品1RZ?\~D384ySw;Th|ރ{p$E ÚmB@( ن4^3DFpk?-M%X+i;ضdgߑJ);Bƒ:7TN b+[0Ǵ& &J5]HGn3 ?۲ }vKR>v\tЕ'$P)8T0d6U7usP]ܰD*7!HʇpŔgMN$u.dTbhm a'лz*N w9|LbA٨fU)8rq23d }Zbo BнB'.6vGuA==8=_ggL {6 \L[,϶-Yc`U)ê&bK_>Wbu5^'IZ(4rL*~ ;KF1Dd*"EMOjCdAR_ހ]mG]}9i6ɺi.&~ofy&jk% P nkJ7n;ьv NNyL"{\f2 $54v~pnCDf:A^pHZ\o BkpuS9Lӽ|_3TI# ."zCAMjE}+%UoĠ6NYO!b]X(u-Zdb$ I$䅺CʝwLRDiƇJy[⡍ =°wy >Zm NkoBUkyX_i)2ڜٍiP2)+˶ ;IBu-qX,",1 zz'+jST8 2M=L%~.M?a9Bdтg(N/ s ɚU l>-l)76R m(M"0+K3Wڕ% |PFb6d"wuUP@ ްq0Y} 48q2ZDT`4,7u-Dx?oVN{Xv}XǢ>5͡m˕#2*P#3J*Zw>cߓh<@V:0M}*q}u8"=>KKYG=ˬO"6uF"[<6w:pV+T^4>όD4^ղQ7n֏*ʃo.FI^ ܤƸ׋exGwX`,IfJ@-<_(2nJ Vy5C vM>L aNF٭jRO{I^&?GPt]8SlA)RpQ 2UY Cwl*_vX4ZZ\*ofdZ]PAO5]U)!)qn`Uv A{m4{*3kt|-k~ |Mw+lո2ͳ[rQ]eR?rw}P/ԐJ9J/O'Fk%8qý>&!kd/yro =dYY1BQBnx"c*1f!UFӛӏ q{2z,ݒTO@*KmG_(=Yiۆ|OGx߾TuV*."= UNjg(QhdפF+ ՛c;璷*hƧ,GH1#RdH PL| ;6`AD ;g2F"{NTYUdiuXyGvۜ'jVfy6O*$+ӊDԓqj8O5(.m"Y56n p`&_= 9{ur]hS!!8( u`!JEDcYuz`'twbX鬐$//"Wdi| |MXdw=9!+m@MWھ00TW@9)z(P+rj33 ښĢ/wtQUIg!)LKGl&j  9!:&YG[qNKp•V"c8J3j8ž?+FO^CSjBҁeɩ%R+Qs׬!%2?6?9c B5QD:B߃w XYBxseY=L <6ʠߥd+ nzgf̉qWx[po{?RY9k@B%pIj;8 (vciqBw1,eR}:&e鴨Qo Z2oo+dˠӜB}oȍf Ϊ»R{zQX~?o׎_f1 ^ۿzqho^D*~rUJ&DϿ'Zmc pz*8(B~uҜĥ )d2֑ʏ CF ʰAu>kי]vO] hW|xݗo͘Hts+Az~`inJ3,q/w)^+&9Dp˙H;5&)jIu[} Lz:SZv6t-\Sl6p.3cD4wO>彘<=1rZ:QK-$>>3"UcPmEϠ灅$fDtRɭ]b..2Q\1~"Tٷ+p"780AvG\i fe[IPj:6eU#O-]7E#12T+L\,1j̷1HR%˳Wb[ +($Dͻ/JKA'yM6 8|yM\';EHBe vJ+]YVtZVW,AP3hIS5@ '۽|S?蹫fff?]K7D)W#5ouqLrt@sHߩ@XlulIBLH_&꣚O*]<]P!K?#5-hX^?g(mo1&B/Bje|6F9+]Ƥ#̖p5Ԣb z;;h*8}}j!ѽdDO8CZ*`HiG "ET5BsdLI`wb% q`b;A_k}M4AF+7sR'zq3|?'ɈrMad49tz<7V4@+qt1D wbRk !n`2 /4 bo:rd'53&QK?lS@ߙGXLiY~XŠ\ j{~)N )H4ìcE]pPelk/| I+:r^X@ .Xl͞F23#O%4o@֏iW5*naϯO.@J<zٵzMXiǀyYrwX@Ƌ=-">- @9J$a>StǢz~Ľ$<Ȝ_+:gƬ>jz>tݑE.J6QMpj$ZϷ ,g+᭏G\pX}9k|8Klc:*k{ WW%\/We6" R%FQ%r;,qX2E{H ȰQA2MJywM#JWoj"] 1a:"CbV$ g][Ɇ I׃`TwXDۮі[ w[O P2/٦G؞`I!ր"Z(%I:kro;(3 0jG[:fD #܁^Yg)+72 [Ki3D0*d01"">W3d?s \X~  cC 019Ƥ-򏷤Ļ9J ݛJ7ndDu Ԯn4.;P<o 0w' *Ž:$Wx+ED0%oVp6wQS6[5TǠkmeLT_$NzjsQ*XkuC|d!ZlSYۨ6 p"M1XWX,k#r<#& 9dvGNȬ=._ +O 뎆\itکQߌK1a[)t\;׿ [̹bԳP$ihíJ_j*OAI﬜w|IC_ZC;5* 8LLGbr!*̽qW}؀{,tN4'S>$v lnU[o(@Npccԙ=d4Ls4[+D޶Q ħ5zoyҶq+=ԂiLi+\=%`6&c[w%)k _pAk<7L뎝Ȗ)۲!eT MhZJ.8ZCah춡߬O%L9 z&WѹZX̀5&^%W[$츖S2Ř$~?>JL5Xη=y7PZ헕:l(.97\03FpGou"HHwlXC ^H-N" ]9_bΆGc < 0X!lwV28.Y#6D19vsDrpPRT 蜾}KA3MZ.=DN~ё " a,nNv/p;NceqQhN8< l[=%49,ʨ[$^,Z@ML~u15kaUGX0UO(.噗$/Du[6p d b?[˃ tows׋98 qid_IiFnA(>\~ȭe!,ii;쫧;dI-xd׶e*ִb;uWf2{dc$c5Lgw,ۤm*D=QKT0`{7{|VZa퀪> ١`- ;4TfhșhVT CHEK0,a!ROGHHkR1=(z]8P/ux&J/ f#t@U~RH/M5oԤ/k ־LD}z`qXsw' S+ j0r]"{@'yʢ sV@Ed,w(ba9`*Qq>qB-sv6&۬۬d"N|m% }v1ĝLC^̾W 8zRR'af?P3*;BɯSWOa\^ v荛!˛3vA$wZ?1[TPʛN4D/ILmb'/VkN۽|  Kb:tA_H6h@^Zb@HE tD|/X'aN"'N^IdΖ"M"obh-z>Հ?u`|2ib$/.]Ae\5`^ xO˛{k뢰%MA,أ$B;H$?E%^:etxqHqh_R=gXvB\x2QyTX>vhP/r24Z<:H{gϷ*QcCw c '12MˋG/vV,OZΦ[T#k=YSÔzisY [xe%Tܐ̤=r37zS^f0[a}nV!F+t"%p$0V"&Qdt5I. 9Zp6~m_Qm\Ɋu3)~)m0L.d2t);bϨlX;O|̏z B}r[}s9K%ZnE6HZ_d,|W(6k5WΘduy @;9RiY vxu35\¶Fg?<j%oօ=8&@3bF5GjvF6X)VB!V&^ObuۻzkF }SPMJ­hK'#خÕ?q84q,FA#&;;7{B@^d6Hlɛjy7 ڶR?]|8$Gi!Q+J.BgiX]R>&܆OlT?Ohq׵vr6_$G ?ETg$1K9oߛ 6Idu+}",/?'eCIMd  .,4S4@A[;W<궺'-:ظ_5t$^O{ckUHy5|/uucg= CXQځ-׿JUaGyK[C'#:d_42}LJ8$YlݩW8wv~ck)i$&LhʀAHAbEzbpZzr@+dϾw,R> lm[&uZB3nGUbYR@[Q`Q7F/t ,~G૭H+"q-Ӓn yI>Lr|Fc1y6<󨥻 9d&w(6(/n&p0ym P v"܅Kxm? 3q|?#dԙsd`!o6 Igo46A' 9tqr&Vt:rR N 4Q+욮N2mmC'3Il=d8#4;lDJGPB6nc\6u-{_6!nXEW]1JݝwѢ)E/fߐЫo5Pd(¾v  n".9?|%ϖD@p+}@1GI V,%Y8|F9`#6Ru3?[~*QBkn2>̤z۶M:B~򱉄! sڅSF/^腱Ae#'WF-q2 NWz^ iΝ l9YDצwLP =\#VVz @SB vELEC33W><_Bhg 0pwd5DX-M!cJlF2uR:jLi_QzS?jxEJ M= 0No4T`aAC\ɊT, A#fv uFsu<Ѳ!;(UyaS@An {w!8?.*яVv8SZu[/cY47([M tCUXJ0Xp%j7@vѤ08%yfBNĸR*Īf/QaNRC82s CFwڻ3XU<,ln`+pR9-_zT׏_ ˲C``ܪuU|m u!(5@0e|77͆OVSW _#ʹŀZ@JGuPS{EVHeJ=x.vH3䬑 GeRK 7oQdANݱPڕ͝7uY`Ar _%:|, ^}ُl}X̡i{(TC:KL&(?E8N̒49=1ū+x=J/Zq/M. .6dEGIlq10*a:mfudpQ0-gHj_+WZR֛S֖v=(Zn)TV!;uυHE.{*<ȥ#@Ym_]mOweJŧF$Lx$jPsK #Hb ɽNq.Rn#C;m5X- 98)=D X2&=+~9vnj*yLR򖽾71N4*xFpĚ}"e~t4 jX]cAciS[ ݻMhtf l)zGF? kkqŸX2-ǃKg~ꦒ_ =G2LOԂ{8TO_o>ukU~"9cΊ%P f]Qt'"($gv \E EƧ㪱Y̢oY#0%ѣN &£ FFUږ9ٜsqC'g=M[p!3kDΡ/c^brlLG,*iΤયC|Twױ^rK @>H-  w=}d1|#ЭB{5DnֲI,_/ 闝Xe͜!CA2A&wH@͡ 榠sLH#XSnzr;|ࠎ-|O `=vuN9 GR'a2{]]:/K֔tI@Jny]^GjPUcDjwCL-#iaDbbebæ>o{1Mv/9h,AE]߫[ct`|x3Q7&0ȔշȺ*JZl{ o"/?b3UrB壏 m${cJF `)?X:%Bê;B١mkb i4Hduyx_E5TKi2Nr5/" "'i  sWqvfܡgz:f6p~zoʂjXFpW'T1`d ,;(3Uf%d}osbkc/xlnZUO8; \yh˲3&MpHͲ 0JKR [=`fݳqdއ ;EDNk/e^7]l|5uDIf'h r#)"LVe5)T6A*0_响'Ș*<>+}<RMnG?s>U a_0;5}|X#![kp}KT\|%*&c TeZ:@] ߒ'ʬɆHRWB= 7S[LjAǸYQ H Xa A4c5/Ji=xyr1}ܷZXgO,J_8Mh/>?A 7P8ccMy,9|&.w*JZ;!Mmk ӉW_ 05hĨ(DE=@.TŸgfJ_d=wǸ Y1|Ǩݽ2"YM2 A@<ك+~uҡnOՃUJgA6.'A&ku}A&s:;J&tYVrdz5 M6^k_M,|S UOE|Ѥ|u9V"@1)$Yk@V_|x1Wi@e.fH3Bbrnw._(_`W9}' ĀvLR,ia3qUilfTӘX(G2* /:-,FF!֓jOpc:Eg /\}M;XYל_Ld-|מ(!?!v'% R@t0XVWAG)̎(ĺ>~m /r/2Ars@A?-ZCHO>#}])KϛYˌt Ӌ饪g 1<-~#uD*!$p? C3on*I=)X˵=i|:zpǑ̐1w͈ Q?xaMFU(F&ȣ_{u\-ѲuI gCc H,$Cb_L`Ib^&%I|$*iTGy RxFcl UM^ 1EC!p"aj_e /rW#=\GFi=X>ca "bgKva&dce SZ(Kia6r¹WQʖPt|yM*IPt"RF(Ql랳 ӱFL|]HXVJk2rlPLb6OÇ(Q)IPu妱P.uA0wh1@f _tnSUAP 1XeԻJ ~Fa.ҳ"j;J9w8O*?H \pڶQkp@187˪X9v=f?AɝKݑӼZA_E"s4W?`od[nJw-N}F1.E̩)Y!X$VMee~tbwVbtcMQ T쇶zFcymA"U\ oIbamP/J)H>ӻƜ|yw1͹2My(sZqǟ+K 1mtoMS }=e|iy # 6P*$(lZ+T^oN>|x׆˲C8P:*'HozUS9|yLgfOu8+S.yTM%u~ߢAiD;Lh@qƓ` LњCgJō1_d2_N/Q+Gj&i.fQܡjFe|a1׮pMN͛ajS!HoOq&0|Bٶ"ܺ NV?C@R 5*=t^I D΄n%pX1bxVԘ*{oO$4<3O;X|1ѫ<ǯ] fvw$0&}Uu\b'u{?f*{EB+Ο4ZEZWѳ=>;Qy"̆l0%H.^Q(hs0R7U̘Zſ$h%֝F.s^Y,OI/S\<0_PQ\zG>㚀A촦低Cj=r1OF1< a $zZ#eP) ~Q"a W4CQOs1B詍VS)=`-MUe_AO-s { _'͑tpu}k yD8mvx),tL7-;2J 4!9cb:tm6rw1mb7c;c}B ۖEtPUgM G[Jr~8=ֻDkΈ\[DlS ht[6!{Y X j m?LyCq1v=^ZS35ʇyC|3 IY!^-<:inZs|e/H,Lx˿m ; UhPs5;}4C(bG8&;r%ӆщ_ȭEL\,HPh7P "d,IԻUθڋFpW$Dn÷maǟM\򒾤!I{mo0 N1䏣Vgb}( b_CeW f*ˤǛ(\/vÉ'+_B BV@F?a8&B h 2%~lJ"G5켜؎2EU&f,xy]1 Hfh|8mNo\R *&%CuVU?,Ȩ+%p#Q]6Ţ1Ǘ3,w-X5vb! >,h[Ѫoֿ٫8mlPm"*X`IlRDFBu4ï -.vX0SQf ->47 'SaA%&-t+<7%`Ső brTz}鄐i8՘Ob) !$*cxA Je[.&'ƀI kXi5!b+Xy_6gv_ 5jr[3뛾2VtN"F"0=Ӈ5ڀMq][j+d֖̅ \63sV8i)vo%LoP㌀^R3Y+/(Rw2`X5IX Wԇ10c[hYOԳf>lB2PZϜv'@17'Iz,HM}׸J)F VIGS᧙Xñ@ \ D8=T'~J4U2 i@:fnI$+E?rjߦ{ӹwlA yO!`xO]tݡيez7pv%@۟5waqֲtpss炝턗Z .'ŠRc X_<)=;nm=V'miQ˕f*b/.D՜FΦ5P^2E* XQJRkCv1|CK7 9Ff/n<4/9s{G/"2+/o]aφ4!SS6Nv3F0gq tT؀PsB,;C<}]yBJ{ W`m k")osWœ)62&L\=)ې1Dw3SP\%B),ck(*AJMKߧ%%SK 2hV>ܗ#J} mƸ/XJ'i1\T0VUJۆ:7Kƀfi-/䐒_W'Nlo/6OҖ$ٔD@̘& dp\BF1:->fh8`rQ+ &@^r9R`iY۸-mo^聎3k&`cA9]K F /}FĞ%̷otXM5 0oNr2rvuc^JV0O!nTY|is9RZtIB0'3ʔ3^\˛&B^CJQ,%͖k!b*q5}C[QSzG5\rek7R#L+1OM#Q"q犱Th.Ĝ,GG6F9Y*_ ҽ ZIҊ B {Qo$W>wPQ +R*4!m4 k}y4Y3m[סr%_U\$ t_57F &PZjq-uaw1dWe)fwQH]]By)B`o @" Z(01ɣ& \`7ꕢO{!l-dYpdQ*JhI[Qw6Lݿ|HVgE@$,[ж;de&$@[mvhSh CA=o3q\pS_qԒp3RK>yVXPH4Kr(QNNeFHEjReeUYLDUS}h{h a$.e?d[^-˨򍞀 5zlbNF'yY/1@%X\@6LHl+i4D@ ZNf5ɱ0< 6 N9,DaxZ-ԑjO p0\ 7q9hl2m}M:c)r0pŕu]D:Q(!쉩-4 dFOC &M0_nFkX5p%í}vVhݏġmdVIɘIJ4m0"5'&BIs;CugZ|s!MJ@k#D&[Ύ 孈55ek8^2+5 Z:W!\.LtO!{:NdJW_|yt:ZU%dѤN1 ?v=,gIPD&71RA&<66>ʅ><@~ kQě2!e_<mIuJrgZ~nG1_PLIeIOU xFOO)juu@O\)Aǚy?EiW<3X@2HZ$Li!ލ2ܧ~fZ%/Г^< )E[|t&Mrb|(UҵOך3C߲gLD!#G$~﵂k6 gSmju4!ꂟ;Q˫J ?OK;1mvGBi6yF|UΆzD$ϣ'Z>_&qX/R!vulJ'=>b1`nx$Ѵ06Ľ 1%kWUnf'_85Z>)Q=Q3ht9GYpO+`ӍsOq]|"f*N`=YEtm[Ǧ]W2WT(HV*0;Bj IPT̥A[Y6w/6h*> kpN5][?qq32BS_,͜Cxj(x׊/@a[aPVC;#wOV( f,ԕ !=*uB1xA̛Ǟbױ,|esYmXp/ߡe$Ban0d1DT_ + qQpSL=7(Wd'62˗7uN՝#Y,4"բPԇJL#.WwYxfhs9c)75i7k=ҚYO2>)%g<)X׽$PYV]`<)5 |ŗOH^OUN~|P6_Ο]_Q|I`rNT2ԨLŠD)ZR/oqu!4Wi鴠kxsv#~Y[DCk|}|g7UTjN՗%H*!W^Hb|‚Yѓ}Ml; :(h!b–#b}"uˡA'Пzwq6g9l/+/ mI1q{SmwjS4P0g2.X{&Dge 1ruͫgvV\G,C(=)I/3PMHM_>H82ώ& 0ۨu2\+L8LESS%+ _8}297E+[/88OǑaYT [ل۬qb<8}*Y ETFL9:.S} 7/yX͑'^61 ʬ)CW3VE1ظYx$ Sƀ\貥zͬ}: | {5 ƿ rnE9 ۛP:*J :mN-+ܛIƺh876\e, dW# 6 dњ|px7TmdM$@]ߚ[(PǽH8Ϩks .ڢ MJLA =.!U$FWC4ybҜmbosq_<$ Ze|Ga1l9̎5*3ja]'EW{hYf ,Gp>{v? oQHaUsmM݊zpAc}BAԿ$hɴ)).Uឱy]8 nE(ƒh<+fܽ,_k*)?C:@o {e99̤Gwǵrz$w60_(" :1*53+Ϲ;?2#|qkRC[=Ftiyq&^jZ%i6.&}.hȶC+xo^ ߁Dyk+9 -S\^ ky0{Nx}|Hw z/Y45R Ritω_F֗xHD5 >v-F:*7+I2g# bύ uP;z!X*+`أCZBǏV OC/SHF:h.cZL Ot8;,uNyƜgyWV] ^WS4Z> KEyኟHxLA 3>dThg[(t8hUPEȗL"GR@|ҙ'п?U:;- qYl c!1֏ Q'˵ELSh/E Э ^בt}LJ0͊ !OL;WF cdq7⛦Qmg" ս&VyS ˀ: yi%_*=IvڍJ*fі΍w5EMVj !TY܂*"w&NQ 52imeI_vn}pFG4z0M:rXwr)%b~=DcG}L5 UkO?T,1:n9v 1NġV1ǑIȝ.:V_-ÞZ&:[0ZM:-QD[#2MLtZe3۠lxM@b9Oq#c83ѳI(x![La48!}B@+Ny7:S;0!;݊S)spgVs54s/W(7H̚)W^̾[nʷZ‚v_fM2nh fnW.ggQ&LI59['.w`Ѡӽ\ Yw/x1mٷ5G(4KH>~/ j?1QoY250*|"4'MذƆY8tūܭW%{=F/Gs35 3RXT$VrAlxk75`?_|Fo{Sp)ϰ,bů. <0a0bUʿ )l ^*.'_d2 )Wl߿$=|g(kQER5v Õz*zqn)1!Xkafes!u0dMF3#7VS+4M/w|W;L3 aUJ eio~O)_yW'u1U$TW|>S{Ie]+Cxsw}[?Z7W6.,u//s¢ u"JjtV0 H<%mbׯ__s2@*PYg_sG~ E`ģgɧ6F%#CQ!18rVۨA fkᮤx3.{"`qy aa8܃>vbcIA4Փu`[\Vx nש;rrvk1qq5-eIb0?<دT*VO݇ư#(+ 2%W{+nH84_ヘq%}t @@)_?XߍQtG{3o7#rm؞a LX k" Bs$L6jqt;gMZKd"2̝\3YkEGa8(J`}4ȶF6LIk =ܸk%_ryj|R%f@=d'TE)km#9,꫿%)˓bor$ O`;sHG>nWrOe k PxgկV pr._Uo<\j ib<!oHӪ0Cg/U EیL`~=+2.+1.Hu9(?̡ɂ{ANby'IO d鴀@%ȕVdtHx/PD2_ilI}O 0PD 0AQg>yh<=d,T4қoGIYӘ~nÆ|V}C6 U.g"%M%k0ʾ2I ^Jǿ@7aP*glz3ɪECikC%BI}a`]Mۆ}In4lZFrX>c-f k _οsKɍ OiHBgؚAj _{o)i7Tڂ||bq伈(GR-W>zID !ki Kg/eLcxN\~l4!W.esyM+5j,"*Z,-Lu[bjRX@.oBdcc.%&WisYj>aA=Rc&p=(sݪ=8PP iYɿ¡{9{B^):^NP 9f*Ǹ 3i0JC>GIcWCI+4zkm1ڎnpWlָJptly^.d^6^R2c;[]Ø=;a{7ՕIލ"LGuݿϮXbLZ /Q<ku8FDls"l P=CR0r%h^ <gϓ[jR_whli%&&N{œv]Ew( A 5> wk%p nA׏6Q˱Y]ueHK\X6rBBq00gVl7)-MYuمL1 f3I[!_X,4ҝ ŠhZ.[9d[ i $`=~J̧8>'˫6#nl􀬜qK0(]MtGz9д.&7Jn\`]o><<S'a\寇;}Qdi[+w Y~'s-_0_vAR^Q틢_n xA^<\%ev8ICk/PVg*jW)+xtY !}\ +OߝeUEOTi -:6I۾t$G|BpD:s3:+vL>BEy_x9TBb,=Ջw 6$DN7яڠU,ۻePdK4ؾ'^]|uj"4vAr2+VG\$>qNB֩U\ dA1H]"lê8'^o@Hd#Xy^SJ} S=~kdb #QF/*$2|KueƁƟVGO6p"1RrM`C[K5!͒\ 6K\ ͥHF'injthBT+3X3Nv$׍B{ZJ3zKX"໲:dt=AB  .\x8- 5q/tų=lAF|'~xRn,S#s~V@T$}W`(1[9)hGQH3l"ڷ` CZJq9AXq]9Y}+T\jU^nXdG~ǗxDfAl෿Q+[=iA}>`X.߫1Ѹd[t $]Ab} ᛌf (z|%_ /rɊwqNHm p6㳙/߻xf&:L xJt/hOGd.l19ђV 2?Y@몁ވ%zulDv3PtDcX YE9I޺x^8h~6#lW6\9>G&젷n2-,:W?˅Q<E`;TfH rtQ/g=dFF!j c gij8i)*Dg oRdTBT~r P̉PJ7!MXD;Ӹ4P<'j AX,lf$eo=I7j肂.ctfr 7e">)?;m~cŶ)K ] VEG T4G/Fe_ڟo'šDN`![Aa}+x6 X(dSV8gTLn ! 4TR>OJv@Qkq~Br(=B@Z{S4K붴 & 7ߡB9o5{8&T-R&KwcBd2249HNL1V4>bWIfWxŬKg. ~J(88Yj[{HZc\Tѱ թh:y+Oa{TnhS1))roܽA!4LuLߝY籟4bm,cҀmiAj 3,[i,5V(~P¸ ׿N=lYd~ճ]ݵ Dk"/ģNAK>n@C};PZa0^ّA^OuHT#?a~<2OsXtKʯ2%'MoFc2QI$U0a^˷) r1k6tFg$BekX^DjvTL8ꏭ$9!{8A6I_@\2޹Oස鮒˝vml{i sL1>UȾr~> D #EYUKSsd͓ px9LG18=ӥncݚ3CKn<@RB?CJB -t'Aք `oW?l g. 't^bڻ`nG*By$i^Lm-@z`{J <~DtrjkfRy d5Tee!-K.wyȉ8BG:>C/7>U]˜pEϛh /=[9+8"·0H||_rz45vl)㟰'I>7?nR$ߣw1 >xZиCY K/Jxx/0)cߕ̼>o?߉ m{fK/&xϷzp!lU7XIQ_T=5SY0zE$.#BH+zkKi/^-\_ \zIpVv%0Ԭp % ݇Md_s>7kvapHetAX:"xH `k*ǔ?Hjbd]r$hTP4:j&t0W "T=|V^I/_i1]##,"2.!:Z損(u`Xp |\KKQ( Vh dgb0eKaGWX4`ll=ڨq |,503TijWsJݹ-k8( 4n6Wf41H Q2ܰ>M0*ʗlxFL-o^fΰD}or;Р~2I+a7F e} y{B;TԚT}<){gNԈA-8M3z2 kS*-`Mwʮ/U@`+OQ{Z덮C$S`}TW_B>~z4dժmY E?<^IuLH{UR^xC  F,ШDn픊)B&hhg {Bw4.cJ>~! r 2D~Y#z}iKڍB" ,h/NtCoiS'_A_OGտM9q:X 9Ke{^n2!FA;I@1elLH}^g w[d*Gf?9:dbVm&<Ʈ5, :ahTH 0u)ɥk5NO: sֱ/wU~7oCmR6Za|HwO-@3Ud?d.d$kO[%"+iVxT6e#`ySP/n5xAd0tct]) +z+G]\ J\B h),uR=s]92~e3yvx(ZLC[Ԕ5Ԅ`` `PZ^}ʴ>l8p/V[v#Ji̓=Ad8v:zUmeW׼f7$ixo3ktdB)(Ck,+>hǷPB'G]fF:ۆJZ&F`6#g`KFvZˬT@&|ߧ)dy&kN6A)}j>sh5`$a'89'↻ؑ BKټ}PM-P!h.v} eDݙ6-jQN_+O+9 DXa T;6$[c,)u93gFUVQ==gsxPcMt}/`̕|܂vb혥}HŷlsW9Krz(/pZGZ\vϚj'J&ш* ڃ[<{d[&?^lyc@Z E=8P!Ө%Vxj N#U$ҋ; nJPgq[<,B:$؆ig׀Q9c4L2Qzg&҃?bBD:sh#|=Z~09 +Q `)ʏ [?D}[7E^\Q$-\K*;lJx ZQqi3FX R!t*ZNدOsegSJTvh- [Ud3zp>VvֳOvRMjŐsPasDxdDq8d礆gr!Ɛ!%?8er#thǔORzoXm'_K-$#l=>Ͱysn CP HFr# jjIK:뭣WO Ne&eubhB F6R >i(vߵ,(.3UXNf ^PF* #AP<5PGN x+(,PH¬O-y?@KˍCges{'`o0Ss` IHnuX;h/H 9ג o {(82ثvR0zZ @0v*kgL&Qg@3DɈu bY:[KuţNg("-Heb\ 0^h2O'*w}V4j[WY5sA,[ ͽĝWV%&d-R Dp@%ͩs6=kΣwp_+>R ~)R=v:h_XjbO(0b([1-Z+_>S]Onԋ"?A؝Ø(#y:rOwԭkigG{G#Fdl}#0yQ^[n$I%36xtJSث79$6u~ᡲ+]gc =I\?duZÈ*8jՅ̓qiJo8tKr^mK%u`:" />21dr3`t MW\؍HT2oD Ic#dr_DEjQ2W*b C䶀xjKy c oDԏ`cZ+oM2Ni Ipq>v_r(85kVm۩I |Ϫ%Rj^ mi]A(zŔP.s)={KH%j' q>5O%FvXC7J-I۲fzO~8O?l!v Vt Kφ1ٖ]c%de/ 䬫Q#)adRKP+Z>4ۓ,E262hzudT .CM [s#BB״ m+y/vׂrZޠ aϑEg|AOl19z%B%MO-Џdb79"YtMDwURzj c,4윃_9gB{ oⳍ@q ų!c8X :?Wm.l{c87Iٺ(02ՎM0-ԟL o>FN }  F32j$ ^!}&S'iX7{)u=UqX|Fd=O(> XNo<q7G~!D)ٷ`=#SfNgYM W!~P@q@Yjh.?7R!)w །rvDӰQFZh//:mkݰMEJSPu?)+;- AGyԚ毟J^!`&?Qb1PV2ݝLVۀeр]ZZ[>TONA:u7%ct4wR`} @@]97Z2k3t"DcIҞ!_T(Z[;1كIm7Nk9;%gX+P_D̑mMz7v^ikpJYy}&*xAbD,K5޷{~o„SCks4FvczI?"L"uy7u4 g$|f+}H}TX)qjM@ &'E![MZ9zZ2|*@*Dԕ21IVОW&{7;ˣ܃_ [>VL@[ĻB x1`]x[# ش'Kb&}m㑣CUQIɊSG]Ƞrwmxi6 gw| RA]C7D$Kx/"OKT(b-f?~17N}r(cu@-m9j5=5nCCpItV3Ԣ:dD> G9n-PB })`7:m&e=;WYOQ*G tXN .ٓ_+(u!S #˺攦*ngkt] s s10\6AխQ'A/'ŋ#~..b= ؼ$}_H˜R @+Yu3Uۖ<:3F*:%`)6qgt͋HhpmIRMP:f%8Qw7j}'"!V PF#IpemT),h$CG8Pz/&Us 6|?ig#JĿޞ#qC3w)W/IZ`\o\/ v^Q1ܧr0=I(ȱH+J$]aZ(srgr8i&"O}7J.1Hlj ev4؞:w7M@tB ueh4Ce6.AEBZdDβLAd8hd>vlT-÷W"z-,@1M8GPWv &iޑԯeJ~(6؎c5N,iv lۺ a7Ku؛{-*OBiVIVd),s IH5R 1k@)!|RvS?(:1g/FYC֬Ze;"o#agRo P6VBA!d>B{ [ cst{$f ]VŠdr ttxS~)<ڥJ}z$O.ӜmEnoj]¥Xl5^4Zk{98۽ TeB@ьٽl=,߉uFe9lbmpR1%$:HBi!skiO\a sF.Hvaώ-E@X"` ± tccFc*M0 /}E+9\@[ha ;%Gqf@e2ǗO%w0#AS d2XlȠwO?bR}e{Ę|vs7j;iE^åĥbDoql dЧx L1L =Mc AT] oX$7jtit0Ve ʶ)"0ұF`ɓ)|E(Q0"Ljij<:f=NC|qڒT!%ĩM#ulRalQH3ܰuieOc8~9kp@<+!4j1Ų݇U)M&YT!_F_aYAP" `@ C02Q%Tp.'Q=ǹ޴:@oZ7?D>p"O`β~:O/= K&?::A `m5fERIx)S7-0xd΄~Qx2&JTɚ94EٟH<:ƫWemrKc84=M*p=JPOjҽ8S!^(@5Z3c&b("-5Ƙ-cM.̪#ԕ΀Y2gϢjQi+\ځcK+~ –]!Be\(lWZ"H"aD(ݺeO@],,( 53LMUe*w9#*_xSkm&Ş- =)V|`8S5 NSrAWnCF?ҭ>hW  r@Fl94.1j֭Q҅HP=:i?(f` \I8Zv]VݯL0k\[1I:P - C鳗Z b~}:9t Jýqh{`3P[p*"gb@o=ô64nf*Nï)1qTԁ'to\zS`)%]enVr S>"bB&OnB)=Q}CXZ x־c~ y60n8g8ku6~ 䶇ի3ћ)Zccۚ14k F5Kb)|R6zd6;1; Qd.R Ԅ#TĄZ6'2#[4;s1->#ףsXn`(![LqĴM'c3\LJF].DT}3"GhҜk+SvĵB򕫙];eKTfg_$9NUvR`,ò?[ͱNW@UMy̐UCJ߀ǪZQHUO7GvTRV7⍳",0 CַIл@}fkAR-ӹj=t 7LB :[p,zj` K_&a>S7#V hm@uFR #>Ǒ.b{j)A !$x*bEC7Hy*q4S]t1'$b yoyZ|TͶ6A+9p&m*\'v퐆P!Q_l]ޫCgua2k7Lk pI}dϮ/YX6u3T ǿZK5Y[ϼh&cZGar;*QW5by;quu $]Vr6qaύGʏ#Wf}.|bQMdmI>lD g 9x53S& b)=\uSY;z֋c ` MTQܙ} 2?"*x; Jjn4,c~R钢/6( Ӎ~/\9Z4v 1:/1$"4s}4W}0Âu.wO q>ܔ?H˪H"ط04A;Q4)?JNF,/Hɽ>@ctʾ8ch3C'nkM[,BWf G,1}AYV}wq-#.7KzP+gxnm3h?^mpmƧc[Hxh24M8ja:M\JG{X~0t46YO@*iS:x@M* !EnYvI~ٱ1HQ# Ӡ FpK&ʹD82Vd|ajbĻI1MR4OeP43v/2M]~, #c/j\Ab"t7H[R]%;S?"ĦB!̤.=]j_Kir*XUWvV1@Um[.umPFЙ#k,cof֋i|& )]\ϒNjNؠ &IJF=]Z4>sْK6*qW8*4PⱬA^yۅ'{ o._ ]ɻZu,DwUabbm_[%C;}<1]T88JkLfSuЏLqf'Lvہ8>GapwQ)õS v]G%úCaɵGrGWɳ۞חY,=W0E"L7}'k 0^JǧV !fe^AenYBv`HvX;brǣ-KDFJ=bX>@^j菺%B/)*B`|GF1%.ݝ~oYЋǮRYtBÞwt!6BiIxwVH W&aޓv(*ɂ-怐 ,Uz}O;MHeUyKUod$R ஭:*- $:B'S\c8:>UIV2멐,غC`^&P{H~Z[eY]SoߡF#k.ac` xp֡/8:{bs*JT6n4oQ;|8*9j"OYsrfZk-0O>h] ÉҹM9 O,XXwsRB kּԨux |]saGxJ}5Wq)qS #%T]TzP5XH}Nڤ6:z@2mKm@#ReIz q3Qldg*Bh} ߣS6Ac01 g>aVeK'4qxnģ#Oo)19G 6g! t+nDޜFZm27= 2POQjVgַYL3{H=\Br%mo1Np̌[H?|>7ar&MaY^w+IX_Gف ʪk b@a8\fV "+@YO U m C3f$'#n)cԚY !+ĴM,tc&bwC (>C`Fஜ`\K :}}KB$AyPk! R]HmsX}v*%Y\+E3Y[6ŝF7# x۰Θ_?+*:U~A ~$,2N_>ު!hfuKnӻ07__/j7QE`G)loTI_]|"i'6\*6:2b70n<m67ǿ\qQjI AjR4!J3c_<\U~2`G? ST[6W3~>2e-'|ZT_<kF\mq`?0RC0{̟{8±Xq"c" L(c&%lr:RHw.GGδ//0 ${D)ؿr(@oXfE\tźEΦ]Jto/N3!q  ,ee ^Te㖘/9F1n ć| ёhN$+,R,OFJU'j \ɯADn aRšF吒w* * nTр䚊_M}\JWof}\U 4EAw{{8fj W_ \w#Xʌ70$ѯ^ljZ`D;&elO47M͑,&ӹP?T?*2>ۄM&R6 1m7;h"4ǮY%NOb[=ϾjE'ʨ!jܩٳoIBN!ï7ZNjTKŹ^'6yt (,=Ŏ@ #T%Y#5j u@;0IbA`C,^Q/>TZO{.6UȽ:]R+?כj9L&8T`DdCNla:_۶a{iBAS}[eN ?d>a=fI֚/$ rFSW @;WEݓ_+Ù`oy ls6,AƋ1lʌZ!W,L^κ:ܨhiZ:bsnZd?on)6AY% u-I J%Wa[N@B-$ZߴR.H&O}\^1(+5Ү0+:N/|r"f߃} /燓ΣӞ*7SkD-qhEO7އC01F j~~w[SY׶ =KbGt%s ,K9Ư5K}@=$I ^}HEP;(`Qov[I 7ygՊx mHCQG^Qny%m]J :k* (FҞHIxߑ{W zc{6b_@^Lc6`Ut9 g)3yמ*6Թ;xfoYxƊ-CHtw V8R6 ̤4 Ao• Eum\V iTY@+sJ\ h%E:47ڔ/7]!ӛ(q?IKG^=yٹΜ>@ߪe2*?ߟLD$l4b'P sMr%Z8jrv~Rf0tL("\iOi5۾An$k,#ǖáZ#OW?"|zVMڂf ҉_n\2˜0ts<1lWJ14UJF+37ׂ@jL8R7WF=vTBG j:EcSt/5ς5^<`hxa[6,T5*V \:'rG ) &ھuo"7kM9jEkG|tj۾"ct[fOc|g3#{y \f 99D_joRQ]mDaHK ":- cCPf+J+jG e&uwKI&Ht#)`ʏ<|x)j2~zxŇ31ʹͼ+Sk!B .LFč lOYCjd]N0WżX^dbU l8˾ftjIX`oxYmֽs0)%AQcպpd!C@A8+ʠ%WBpx$.^!ss7jntv9[v>i Nq>Ϻe~n5*mTGi}Bخ(@iE xnfI}JBkh!8SQX4]:F(m#DH`/A.qU~򘉳Hͭm`1x "w,nR ANӔ&wUU5 iV:o&|]xiDό Ew}q#z^]~1Nmqi* /rd{эOIV8 b!kchwl"~_MuWt^&[~'$)Rc{t%@2ꁈ-S]E:\*/%W/ w}si/L$3R$G=(n3/!e6AlPe wo<=Wy׀Jv4Ks9)ٜc"nu@Avx#1JFfpG̃+!(fgcʴdLbE/ zC2mbLp *@zkiLis5k@~{85!ָESOS1-i0e>) U,q)_*Ր Z Do2d%tY)V𽂟w/xA  O68fZP.e1Hv27wu,̨F)dG8B%㑦s >ƎoiD cTxʇl nqZ2od-bR -17lys uT P ˗pߣOPLێ ).'k\>q}[ rir/rη)=*^า^J*Ⱦ]Q$-YTb'JH$PY}56YRJEfܚ?4fܚ22G>uro &\KblOIlNR+_V{ւyI ܧYF%P g՘3Xj%L=1*Q輭 ;:)!M ռbc飆ed5i.֐e<Znѷ_qX< A.rU[n}LR_@٣W]g~ahZN<cτxj҅<u7'xZC|6ȍ EO7>~TYe%ȘF` ю"e΅[ Op @bȊ#N{߲OX98E],i9sܱdeG!&0PUVK3_UIjxY ukuHd @]ɏZZ2@Zf!auBtfdhͺZo?>QC6YK[pVrYR៳7 Ec+Kt䆳]&;j`bgO56L)P0jTi6RKye -ZRR%sGJ$z`lQ8|EɨQ9Tܚ!Z>=#;@fC!?VBzՈ+pPkǟ4 !p]#!Z4ƎG<$H~XR/hɍBy%ZJmې]||]1 OSK7%_v59wM/ UUHҳ+Ic`Z]"B[ 4o±?kZDYxF_vsܩ7)rY+74g¦{Cb|Tw|ؙDRSaksG.FXXo>i\pn(T3P:?=r*_LEHN4Ӡ-5Kˎ ~Y5 k$jeǍ@'1 rTKU܅Qvs R<7Z}n1"*FF3bdMJ`ŝmПڌTkZ ЀRL:UI 3Pi2`4ʖ#DC:Au,_3zqf`-u}̡*xCծddt@>tQq9϶0y߅@&1ؚRGK C|2Ϻ:/J"Sr'{ooU`l )D0Rv  F8 [0 {3{^QJhXI%bdYTE~Mv'zv/H<kQ2cVM&!z[*ҕ}-@ѕ1 hCIHƙc^tɮ !@U»(nqܓJ&# g|,XPy:b _s%{ qLai^yVfrmNZ_0n?f9{<@R3qs~78t@tv[Гv&I2?}]VuQLglv/I ;d Y̷]N1h#!ߥ90%&ʖ@PPҠD u6h>Smo%B(f d[R\GWwDPk^iU1FA6ˇgxϛaeuaqBO&|5P[u %/ F{Jw-[ɶل)հ#|tҕ}6'2a|# `fx\K304 M+&Yr"t rf)E>n&Ŀ7'"˖vʮi¥RRm'0BiȒeCoIL!`*/:zKShr8q8:ZHR#9}6ѭ/"hzgIU@jѱVMXNM@`n! } sCv@?߮k B[Yڳ-KMi5hVV#»5jL}n$/6/G?iT]v}AjqN:fZ%\8IK|?;VҤz㚡PM5gg}J-P9.@'* b^"XMEڬ|F9EM÷Sgy_ڲ s[$oF0e*zږ9އݽoP%,&v 8f\JQw(NqfV eY _Oj"JfAiѦ=*7PheFGhܶL4+_d ^(iju^ȁʯ6փ<5Q嗂\]7,',(¡˰*߹E%Uv)0CT~MYcY5﨑lz* &5tJe>EkKʆZ|M`4E`[2xj5&0]nvDW xܿ&<[9]~\(Lm#'חW״y 2UUA?|Ŧ`zr_ (LRD5B}F 2HE˱k P&-2RrZU8vokrH?ւFCE;ۅ\5eroUspdjX -ÛEl(/uTXi,כ3Q1HU;k\'hR;^Rsh3&]FШ8ZR _>vKNꭾPō5Dnq՚4U2k0X]³i}ՠ(.!!(1z=;, "w#q4Z]&Zj /H|m =N(o e^q澋 (Ǐf1&Dȓ־Cv+ ES-O啸Б+s&ލ3Mv=LTˋ}UIBc(Ԁ"9ܤe 4X}PLg3F+͓ tm3ХI:nSy)`4>1A+՝QQ(AR+T55b5g2f6:i2x3)#k;oXӶOf yb سOA@BoxR 1}Nu>Il먫biT̖I8  $\~IXz7$D)adx=zKd2O؊!WHOӚ"Rg)v;bZ2zNwߡ_A6DžCMɑ)SD#~oПZEFRiZND)6VZ9 K!(.?uҝju,n>?ҊBPP.5ў"N\iy{"h+ms?!%^ z][I9I1 yԶ-2_2n1Y Y^Gv],*}i!X #y;SZD}!+Ѵ :08)(>GD.4fG{Hya!7-nˋA0}qhoVR,_F\>(bp8kRN~hVHP8<魱L&)=Oa}Wi!Q9le'XJk=~Q8J|zODa>L q"rt\vYhpႍqڇHq7'@ zZy¸+G됔(o=K:KuX}Z5jBƺCO "F@pyYm6t= 92#TϹp]pNZH`h&%n-Lk#iSa9y93Vp0=Ôkc/vkDpЃdAHh:P_}2A2' В8O:96PZKBt<KrTM:mKڏ[JҹIń,7"JvWszc6yu,̗K}}?ż.ЍP(!? /O[s+oקf~ϛ,2D9DrK`o?L6KsZxZb7ȡ 4ډ9ѳߌJ,E<$oD2e*K+~ w۩Xs7tZԡJyQqc e΀to,I^^L DyVȚ VL Ƭ)%=Q<41h# Rn&Ɨ[8 ~,Q_|-8+jNGH^+p]r~D%*|ϊeϵsGMW<0\ۧ6~>L;f'7V]b\Ziջ@[ƭv/iHn Ev9 X_9/GD͓]uw&3U'9=hf#2ӹRbRctҭzH14lwAmƎ-DYD-\vƁ&Q J,(bS zMnaFS2j4_X1_W>򛘿^9k9@oh5oq ë[~֣7}q 8@_%:6aٸJG8p}WuhA»{DgZ zv-oX Z[;սksCʗ OJ3$}@, nIo@Ut̐>{z3iPIjqVL/ȥhX(Yߖ;~@a50>gi*L^'vTf_9,I#rWK=ƳH *,P9¨3I9fMLiYRk+RK&7QADy0 J#pL`E>xuklx,5X7˚Z9K I*$qze$@ wGu C0[xa=3R(MZZ- ߻ȲF^?i4I 7v;[!$}*lm99ۢ];mcX=WH;3'&s0VWc&`9deM8FaT}H6,׫@Zv{1Xn7-Cvsbsu~L -mL0uRk?6MYgEc^ G"(D F89p:?EGNpQ4xrΕ-n6(|}+}ms9fFe%mM.&x׋r};Ӛ3l1fL:?$:c>Lmn_ 0xud3]!p!뱪 ͏z5n;e&9)Ȯt@4Ln.f!(~^=@Qz}VPI ;xJwF-BUiEc-˾h!a=7R*$aH'J|4̡)|NE[N"ڏYqqz`=~#ۋ ~v;aHu:".[Wpl}oioթtYHLލ`BD&֠ eqa8.pSv%(Sr`%Okz.3}wJn&D$U4p=E-̅:٨g6# ﬏$׊foB5P,.҈w8ǻZ9 <  #&XL&Azf$JG=i ּ>ACa3=6=&xSD4HxsҘ+Gg#NC%m Rc $@hA/1{ցj,L߼l;~iՐ_o 'GLqƾƯNF90Jq:}&#Z`d̥'5cp3D]7~7[8N3U(5 E0yau(2 vyJg&.F-ZgU.LI[#"ԫ$u'wc$!bc5+j5YB@f{v3q!A2 (BnyK_6:+@VzJ8 QÝtR-yN#V4&A`S€Jr4|wB"bm?T:W&*'9HEj2TtO^ųe#%9SR&,ȫ#z$7dycVV24XS+tv1A^*FTnEbr_6ӯ7_O:M1ZLYDk̡(AS8 \H4`)5'1.Ԧ"+4  w H}nbQWE-DOnRJXW NbZIg?D!:xG93#^wd}%#&c(Z> uZzsY5#ag_܂>'vB N+/I_m]dݒ=3#) ;;L0Lކϑ}!аެAn-fH rCTZɻr{!`qTHIe%buTJ7Tᆛ\#qr0׀x&vCxN\;_O'N~okחv\ FKѷtu"֝Giw1m(卯Pʍ]$ޜ;҆!O;fG 9aˈSjF|k]AVr(!3'$Xol~Ҏ5oScAo d 3dʏ@5?$)wřt~V`5xv·<&q6P#B<y\ %Z ~1R $?gy<*C޵-p]fΚ {g@u8w|Aރt/R1[a"Jq7ʸA.nDu+g JaˈYv4Ⴕ5LK%=||tg2Rx~4˟f[ዸǾhq8%Tk Fl#q$v/8WŨ=u,y>'IQj2|Q2wnƉKm5S+_5n+yN 'DPhLC`BVu늇{#%JD6"_я?ʏMG呉 vƚ#! BQ0wm-Sh V69)y:p||sQ=N*gyȓa޼SgRi(#?N+Tцwٗ-NjXXۻsFמ1YY̏+43 xش8<̩A]d/oӘCDͼ;ZoLkS̠ ,tiːꢠ>6?5>}0^I$!KU ).{IPXOL4˝摕0`H75MZ|5$Ēǒ'֜w]K$Q?s^nPKr|L8n/9(15 5X.HЙ>LTS̳M: iyt@ic`F:kفj;\KS 'EK ebX9nZ6lց ֍ ;zmoC xZp wZmA,_zͶ9i r6 :^3#|8GθAFhG'gawT,gCF8 Ak4S:5)O8F^x pA6+TQ̶Nl8>hܠ٬wAR@ߴ;Uv)>+!ѧ:n\۽`[ |9}hK9\?xy 9">7=ߩҝKݞOAMm5.ޢ*;x@YF>N\~9&jfv>T5:|l ^ӛkfum…3t̝:fEpDӛ~ĹS%~c RDsOAe,U{MT{ #!c. iy $- 'Ghw=qq4 pd"4>t l7՘HcR0`.N9!}[yO[aL<<9Ў. .>>bٴ^aEݳt\Tqkg7,CuO3Y<ՍE*)*C O6V#´  ڂu |!Gkz,A1a>zֹkBlߵ1+PY6h:syl@S Au%\Kvsc4aǮIxPP;] y5qkA5M]pk" ݻv9H܆40|ծK\uEJ[;?^(<[J8ф)?Hc7$ٯ\rh@ ۸\ ^V޻ هD2. e{$KScA t17rCUe6Sf>8@ors03~6[Aoئ?lpw-w/d׾<#cmAFI6d21P?8}pMq&ϩrR| &`w6ΝIJ7((' A-: gIدUp; RZ Qmz*V`f}G$LI}yhAH o6ȇrS vd,#a;1'Mزr . d߽lY.7/;7yCFIkl3+-9ޅ̟1rgI/m;;sl_?7':c7c3k=/;S0'ȜF{D̕oÞf"&׃L_vӣ~b[="1[0.X W =)#uvݫVJ4ɫ?X#U]'΀Z5 @]zk BӎG6a.C*%u+kdɝBVڤ_xI:jf&D+@tl 1@U Sػ" 7x%[\ 4fӺ$|_qh|{)~@Œt,,E2rBrBJ, w=ce:XT7:| mr/,* Bi7?q8 0UT.*h_h@uavB#ؙDHRvl%+eXBCo&{iZNs"%epZcyC#G 6i-y1kxB~[Bu#台<7ަ.էK4^fpNsaeC(|@ϕ1zYIl`}4״+^u`_-g)Nn68u~m`=+9[R+ eD嫵TDҮ[{e1~k s;ͩfyVZV.n^j:檲GE!9H+(E!1صF #Ē9878 2(Y7e0U_aBE)OKi;g8Iʉ@߫>u%yaZ=(bD dw' dOeRI h*LZ2[0K;аBVSsN\AV*L\EmSS[ 8" rG^F\b'%z0!Aw$WRJY4h XT )/9ۖv`Z&}R {ç(HzĪ{"6B:-+,)c=gWX`N_-~u'~ߍhX X@U׭L=/r2&KJD50c+EiȿI}66vBxa} %뒣c̙B鋚8"D ueݦpdع.?#}Et֚-Jn8o\2n}*6WIZO9Q%Ҧ-W#ݨZ%@ZCݡ#ڌ\=/&XHR%JH]1C @JQzq.asJy[uD_UW:PFw.=/>t; 7?}L|'e.)סbNL&8څ2;,]ΙY+g'u\yp`qpgv8/&6;DYw;#̜ARן<~c߃H7h ^ DLֲ&Y1<6)ҡ^D@؄WSXƢWۑp .5^>YG`@gN@=tFthʉp}feh0 迒 o_c"_QC> ~'nB:<{R5=/.6%pF:0AbPhzb%!˜/轛x'H#I*[Jf_VejAH-. ?. ByTEY]=bXQaw=\D2I%6e `f~6yUh=Ɩu5JV+4ta.M"ۓ/F3(L0Y|t)ŝ!;#v@8Wp} t ,#/ɧ & 36J_'}=FDr‚2r 46I&p2U%~feE ^O8O4,NV,Lv6LT N (q}ada\Q 'ξSϙǸ.^4aiaCYIxԂnp*~ yNP:ߔ߲^6Rj([nTk 8˼{QP SRU}L=.x+R=z_L^+@ Y|ߋ__"T 0;5}olkn QNj~~D=O[llB} Bj FL^/ dcBl@|&bu>PvEh% 1Y`cBl!y'8/ Z0=$ߙ=Pd2Zolj&ܑ=A٨O>a^*.s%k\\`r80Z , E:0OQ1i}w&Ot 6m"1% J9uTyBrʋ~d[ $>oN=$loTBڦԠH`0! = /3i![?w5SeƭR!kM¢)ČJLwP-|W(dN|0oϭwQJ^< KSז&%4yo!Ha/݈tkCCʹ$ i^mDmىKLY{&՚U3w $x86mPדoٝ<śWbѵ[3B4^أ0 3Qx$) 9%\5NW,>7f)_‡  &K:ZB%86<ג}}΍N*9L6STU\U{LrTO[bW@t-K![ Z wg[/۴^Su,mݪԓ0qھf.\#IӳA.=)8YXVGk-$!pL*>[{VȬWHIoCXV ƶU8X-@'U~vܹ~ApD)e ǵ.<2hb}u1F}UMYˀr,IAYؖ5 &aOc/FTن | 8b~ A `s_? bf om8]h'2znzo79V$d=cckL !jIm6R[dgxobRQEBH?*"%b;>,"پS#93H$ }):#!ZIiXlNiq4W%; 4vćtqVۙ*x"@ ]WF^@%W#$97vML$DJ$JףK)` !O3Oa!>D/Bʧ>+t,dn]i6.z$k`gCu|?CRC]Z%uCxWES% .NmwC'QǴ;-z!ٳ:|TQ.CQ G-|CwЎ(fެ gۢO^jhȓ᥎da:~[|(ՠ l-)S қ1B,=*IhLL6r*3Ns6͜IQRW<} .%PfҎ5i$СTOA0R^H`:ѡTfpѓ zFjiߴ S`5ǵ`z/+ס^5+IGGO @Yp Di]4͚wk DHQpCNctTnH S\r!k-K ./2j>jQNʰtW6|*BEaoD>S\cDO/)5N$I!;r-u|!C$ u>k79AIqd/e`r7QqhW/~;i/}bNvS5 ͂X96jVr e݈Tl ӐFG{?yJ$tiޜjT[Mɥ,-=fߧx.}?H7BgmYu<$>yϒ 6rޠx޷ezAV0"c,ZrʲyJ:yh4?4Q|>V'Jd5,ƝGp7kMJNBͥF$\ j3NDwmAx'Ӹ0UoGػm`* ~2X۾r={MT&ĕ2D׫'~u)+ urÍ . ߣM gsk#Sc^VWtLwFr9H3j,S)YҝܶMARTX٘Ns(QFD?PYr抐zv#k*kqXVJl' e#`)o5x6!k0YG%R* vz[%o-DBEᖈhZ{H o/C\ Hádս\ɵ)aѣ9ք(@G[bd3 B]6bA0 7Ft_=|^Hj 5F*r5Cw˗+sW){!qnRt74Ok|uBy?LXS1F7>c)uKD؃ xZRI*th d4XW*hK[ P\.6G\2FYXP#oA'j*"P'C 먻N-]/*'_U8"`\VQa7?|.'NM|w>x 0P7n=Bdʯ1Jr]T>St{ÐDxRLO@3fە0 nQh5l(-:Q3]w  y}~U!҈ /0oG^כZѡ7ۙd+Pf5,7V!Bwf|u^G?sGl-\0oz 9e-9N3\fG1ۡa\]6cħ6.2m nhS?}Ap:^8"=1GGL['7w[~%q@I_]UOߛ[8p k)]IJ,91vW 4Cq^J;S$P9WT]m.*+]Fr~t8zrI=&}uņohX5zV68Z `Rh,{.YEKzo_nӄ *nl8DVMVo CX(wr ?߾Sybbdծ.|,H G(N/n7J)Gz*~ (ל"ξ?%y)ސZ9B:^}Su\iDn zben)vm(Vg{v//rI0 00Ow!/S`c0aTG.@ L`:(Z * jQmKq Gt, 1[LA k#Ig72m&UcNxFze]*RࠨƶW/lBOn!ewHF@0iy]\@r3>ƨ~S!ޖu]~:- v&xD/AHL uB"2%{ة<>95ħrDF5R< V~Pw0|7 coas)6#?1ߒ^`Xk%9c0),lͲp7LK{ 9iLBIgV8> d8]`D0] _-MS r7i!<ޚLIl ͍2ic VQZR͝ 4=T3z\3SJ%R"O5Gqr 4Y~U, ;7u LHvpj _GZX&a{&ݪucZd_'&hFc,9~[=߻ MAFS.AV{X :ź B󄓌qfQ"tfXܢzpiI&+6י~&I˼%ӛpzyKN+֥ʊURhQ-{= QBŀ*cbv^Ϩ;Mê.甜iknv4rN?5@ ,G vmjS{TENF!+GRP~/#ĹD +F$3uy8}qծ[5(:?V0e~ d0'E =U?vDE}sIdz=K-:b^8 :o6ׯn7fN@H&;\8(jK0vOJ꿢ȁ/ zٝKQϗYYl'3ۇ BV :NxYfh J"oD%/퇪ڍ1*LW1g&yOhY"'U]GԛGH{1vY-^{jH݇b ^6}Gr.EK `#wyP˹ eZPK#ZAns/~ lvEZ7Fiʒ/>r46VnVXeHSEo^)Bh5VY/E *Aۧleqo{ g H:4,phZ{KȽfx Z.6ٸ%6-HMF;`mtk "ߦ3ҸVQvz!Rך2~eXF\ q:;[`kkm0+@-L!0T(:,y XeB baPNPָ 5Qg n+GSfs@1+5JPJUqf׆? A!((rk)˒4.o,Y=Yӎ]Ph bF[16% MoJ)k!cLV' d̫5d&w/W ctMݦ>8au &HJDQ "1< ?*SP9~&\<1Û'=2H4&.8h0&U=q$V.F+Zm7 f4s[F1I^Nb,p~JtrX]*D< >y:  2e$˧j ?lZ:7a.37I@LN2&tń};)^ØnT` y<H;tJd,C3l^q g BaSjLż38ש⿁*xǮ\j+j.^7%?w*5GPB p[Lsk<4h8*; ~5ք(Q:jLRx H8nAR&'jqU+g+8 g}ޚzIkwjm^Qb&o4|I DiMَkgx*,e!4[LPҏo#0ZjxCĕyfG5_q~ V鮷慛 d~ſC.%]w]j&^ @'d{/ߚh(Y #Yϣl(K /iuѮF8_jcl:y:lXhiw4e>6ǗFb.)ܐVW=f< 3& ;m`EN&G h0N~-X;B-armGƷ{"f7]WB׿AUkt6 s?S֝Å'I^L2 w,Nðoz1'*TY+]=gӧNL?ˁ,u\ ZE%"[Vq-(S^*ŧF[Y!*J8v;_k4 ^Q0 B]oҢ7R}ziB7ݲLe"!j%>!*i>ʫy(yZ۠GzЄ(8N\hT6\e7PoeiT!> j؞Z03'T4l6Ng^'qҘP܉c;ł˹J@ՠ _տ')0+7 MJO!nXX:Ч}}ZokuS6;XV6S8qkf %u`mb2F:b9Ng KM[D\m[zB2Gzn'}c _9]\4dQS2'}68~#S@:r_/hngByzR`z۫RaTOfB5 ?Y}; q"}E*9i N 8~^r9GdV5,}ucv#_oj{8TQaGU޶+G0?1BmK# jng4 Ukys^(e .W$#)A ]<$plbw7ȍi%(s?DZWi/ !v9<3艷:l ?&6OM9N=J@Oh"yw;ep+n`+̎A3 b9QK2cKR`q +Wow%[]t-xFa7ϑ"oS͙\a֝v ra'k8`P(ᅀ:v$W%hP8us j v| 6LMm g<wMsx"bk{l[F*I]gt[?U'_XDL@Vt$U>Τ„(?*-LUcI3]K )mb%ԉܲ#3IiQ+[D-~p\nX 0B+. [f},BI!'ow@-x:ꇕdV6Y8k& Hh?wڂ6nu^j=DoGpANn R zZJP|1*!p*!)rwK'A wu(lWN >3OaPm0']~v-2$ѵ[ vj^%Ȗڦʘ%PWSi>1@LrlòYf?7K}op-=9aC4%l̽1feD}z?\xwCTl1@U &QcCֲCKZO+NmQ5 x7.ֹ¢,e9ネMSVKO\p6oUx'}~ c6嘟hm,WB K R5Ŋ?9RЛj!(Ǘ˗kDjP 0Cֈוyy䨍8"A򟟌+* mtjo ;i8+.LC I ǩrM3sC*ո ߏL QZ?r0'{Ej zx0B܁AOrPڜ?"%YXc^YT!], ab4H2h["x@p8v/ss:0F>,8p*z8߹&ך̐P 0/I!LU"vmͫWLW _Vm\=Suf8Ptwt}Q-PzXyBgjHV+1G7^uk3o|J_k!|Zpz8a^@zn@ges>YArLF\>ZWrZ~(Q[BP)3toJXA}vy?nA8.LH۹*kFMa(.6>{bkw]]3~̅杉$-@fx?lV6)^,=ތ ;S%5f3Q#Zau 8oW6cm2 \*H ^1` -dH^e!lϯ~OB#/Eʮ2Ϣ.ӱ=]oH<:z`+XE T7aoߕRܳMM{EdΆ|]ZͶk7-40G!Do`ӌ{IMh%y+$uU3jED3}{ m*|#7:cU_4E8QHM/F@~*q&m#;]]2˅)Y%zɚ zA"_ V jykT09c͒`#2`ý o}Ci"E K!\J5֙4BtxYl3EXqwxy]OG451H?Piᭅp,|~@QN͙3͡l3I\xBK6"n=6>djRZO-(#/wʛ+ 3?#YeLdX]rM#ښ-]5QL_Fՙhf˿Bb+QrPsD57؃ӠRĨ) ? YcƠ5Msqf hW<$"0~vJE9iD贲![G?ӕcnx׫YJzA|q9z '">,aw/oǫ4 v02زQ5K<@ >P{rMɏxBϻ/zgfK$}[_sxV:(l[GS-@MM':c A *.J7Wc mJ,n(f~e.K3) GnޫVboPyHK. oZR kb'Ad2duW{;ʀ?m3w?Cp2$S#w:E _.FΜP6ܠ\/ժn:onqvEzcc9B%IfbpRj*ܡ JR |V;Hđ}Ύ9M˪vX난-NlA%_8Tɧ"KfqM@SXrC$I%5ۊN:-7r?d;W%Ԣtb}f4?,8{U2*O8LQDc}bid]=t_-;scj8ay >Y{Cm[tX=vs-@Amԭӊ83RD]ֵ)qcC!IXMdeijpqĦ]?Ւ1V=aYq`Jg j{OrZ,V|uC:K֭ 7gZ=bWd捱fr (cBkP)HR~'$9\RLB -1F ˬ8=N W]DB!ۄIdHey6&RVi4zH(pVw{m38TZ6* A.} jZN]u=^40}eIFno%/OB}a~GCe- NQrzިml`$fFT?B3E':E0N ~(%3B{=hY_Ő`}O`Ҵ"E(0h޺l$|jyB;A&40'slR4dOY>tK5˕+P`-d0G ]LM9&,ƥL 5*1S S/RSM>ۘy98-v<]aи5n%EYdsJy.,PrXJj]/8vY\vxB -bE}<]%QX$ok)qF3PENpJPx>׵֑{Hz\cN/xW7VsBvhX}pXzmYb\faj$KD{3 6ܲڤh+}Ǐ| Oל.U6­|𭥼=JAQ( Rzyro.[qSr\ Ebܫr>9U92(ʠMa, bB".yfhj>:f8sQYНt>i[e,ur~ͮC#ԭs "uy{5T }cGIr*34K^phO9otE6oc&'q=(ԪjmG(k`gP8 {8)ۻw݋s fѪT0S2s5[]%;Ejg84bM?)_UIOЉ[E'mծ]>{" IW6Uh lN]^Q9UOGМs޶.\޽I\a[X4M3]!`W;2[jc~^oEԘM 'n0lUnV75ݢ\^ڰ)pjO$"F@hCD牵᧞'ewKJ˦?2&s3 t<,Y ׇ)% -voT0]9ӯ9ꈝIR#_a_d{Vf+8{Zvm+ʝ7v2Ȼz)@}|@HIf|2\uPumhKP{'XGwi,o//bKoAr%F#…n]r"=l0'p a(%J}5>tT|dk1Sj;Zr,|~ma ^9 6NnEC*ɌLϤ@!nDK"g Lbh7C ?FuB}(1P-^sQkSVsmZ)K$/kY򈜰ɢ e)B㑠˷x_KL2șWS)|+nufՎ}j@1i!Q5O%"OEow"0Wԩ\mN6hG\V8l]YD>hqhKEM\0q– q5a>O⫢ @fTSov:}Ck2apY Il%\vM+NN&oZ`0nTpH%2L!MR>-QU@{ꦐ7\$́!zEk+W~XTL@t^n}yN9$6)9;bh^y8q3/ׯd;So?:IAQ$Z76 &:3΀OgBͥxfv,r*{m̴T7Z.PҚpH1uGU[&)WҊI̢-U( QS<-A!:(Lzadis~%LU/sM.)coۏoNȡ=n* NiSٖQxFNeD? x5FC}DU<~VT{TzN5зM)MF SptZV<AaݷV?4@f\Jz 4"]"+mr ֘·¦;ǴP_ _Տ$#VMŢ+0ZVsX0s#vXsdqױ5*EǬ*J{}H_M.{ ^yF I\r/@nx엣X?6% :zΉ̀3ȻitMHخ3N>1:B>/pry iИ)$so'w3hvfo۲ U7IB;x+4HP(RLdڵQ6n DKG~_soSKߟrU<nJXJDspb[q6f1SsHl0_Pi L|r6d!0%QEzk:^]ŷL)O&V:f4٭:L'dΥ|L!ʼn*ql~ Is`>ug~f\I`{g'`b8HP7|q -3ʬ`;O S9=:N-|҂~۝\ ROp3[΢I-(AW}^.)"|6Z fEC!Y*r"Â>;#Ϗ\v+kC9XG4V(Bx ք&e#q̗9L;f0 * ]##fЇA"i|_[MԌ\l'mP _c?H֐a|I'\pjԃ1Z0n*W":3n9l9.B?8%> N}ݷj o'f:/YaUԅ4'kgDfE)BP%4&Z;-$2QRH @by`%5\B!_j h۞bЕiH 8kq׀\WwJܢ]p_zqNO>^6xVv%ۍUv{m٭oU H/ޚ T9r{P(.u%c9h+he83,2 XZ<,6twg 6Rk S{׶>_l ­#{hgf4z`:Ew%r&aVhٌq~'MS.F5د 2oF_\pۼwLԗC}l'ѴH\Ѳ?K(]1p䍚Q_%Vj GW#.,Mkm?Q3p lm_x@`l4<(gaګ֧[afwO93cޔ,j2I l<>f$ `jE3,U'Y-B @Ol+F$ =}Fc2boP9VKQw O,|agѓ[q@euyhwI)f4+ӲfmEgUGI%+W?)}'ׂA%c 2v(AqLO=O^~);"Ms d ^;]TR .@T<2lK&V٧pk=L;-RyIxt䋫DɎ^[#2B)+pt=h++|}Gg)s3Pzfj5$J6ϕ NjCp 󘭜.z:q]vNe9TJjkpo@P@sO\bTcr({rG.KW5YKSR-umXʄBW3cBR|OHWb (&R.yQ_uYh+ΈPWPecS w6^3 W3BTWͮC`&!{Il 'O@F|Iܮ]M{ثCt`i(g$KX5sclG G3cSaŷQ^EfA&n_P0IvpFtk-7ćKgLNJ@'_ҕV< Fk"pֹABNمOНA\,Vd66vJ Ue!d{XF!/ΙL'C| 6GܱѥJkÍ̭ }|5:xN }lzv{j!/y(C[ah 4&HotiB}g,jx\t6Dbt̛`f!9#+aə*LR]` 8³R}|Ï%YA۷ n}Oל<(Ё<?]B6 {^SZ0x+OnƻN+Xb ū-)י,Equg}1YyNTӯF}]+:)#4IܻI{: ppC әp}rrG0S !-Z;I_ zНVXcGs>S)ôL d =VBժ*ܼRcJnT)7m[Y eR 8d_@ACKs_od% 0iaPԠ0hY:p$gF6Ez\E Y/\U:Pjp·݈3}$/qckCC4?1J r6?qyݴ+dT.pfe<n|3>zuّJ6Di Kh2zFecQؙyq̫N QJP&{Kgp?@MKHQ$]jf'ew=JV9R}k.оi7dҰ1S+7^zaZi( 1'`"#Y;g*'# sW }^2IWMzвda5$6\gUXcm,So&mz|{  ks8k( ]1|v{A;6CO 7 tŏl1v:h4BnU{:^ Jxk=#%mzcxP #B`hv]YH"CE`0cT9Ha=~b!`p}~wq(S6De.1>CjP3B7bՆ׃~ V o (ːn}"hI:!8_bR<͂Y[!:CR7Eժ2~ n %7n1( !a_z#6!$,6.-r۟QQ-(,N&ɘͅ]-rή(fs 6ϛ371 /G+H5ucw."(+vj\ۨ7{*I?)McCg>B=e LyA_nl&DS'ۏQA`("8)L$vn9혈^oboÿgS8^q f-pS=]8|~>@2j6-V:{: Am )4SY >bUȧUz"1)+W==s &cK ^`%1YFgq 7+5 ÷Lz]Ɯʾ[DWy1w3S~Zd|lxwolop%hC1}/4X&կ1UB-( X哜ΨV9w}nqG#2>%*_u%czF$u dZtb2gí`J #r(hzA _v0Wz-T!dR:0ϳNG}e5eF<K_7Y}JZ\eO~vV-49jH3 J_heЯ׌OKQ"&ZK65۫ޞztu&nŧ5SFUHz>z:*^<[_+ HCAn 7֨B0D"'dfDIzh%!B7Ex!0ӗ]/X읰MRXeJ:jN&1447i&[, _),A_g둸-MRh6h&t }shNSq¾_GptmEHqnN&bΗ,j3ibV&w@C~(`j31FwrGQZuSKQkqCWi<^xJv)ŵacT` Nb͆~$cqjO_SVO?&##-BA&O1,:<h[h6uɠt&!];,KlylOe|Be0Lk8Fx{ָC:TgP!:W$A~9|7+&d^rRtbBO7с/1`8&ў@ zBRS|38=M0:npd特v˰i>EN۟Y3WZEEҍ7=aSYHsĆE%GF[wL ǠN?[T!7gP7ab2?*kqeLjbs#~KT{r?XVʵF)ˊlg,'!G aeL^m"L4D+q;3eV΅#L<åYG1:YuLE(m.rK6AE8:  k5m!gFaR$y1P^\FSp_l0q!uYl`@G:>F=ejkH `'-X`Xr&c.Q4bH_Ի/~$X{,+ %FOXHrY_p!3 n@>&_еlt?⪰HqAʤ3& vϏsDOY{Qz쩢>ASS&ew%ʦa{L"ia{TW6C㇄,T!w0nUC-( wt([*BQj`qbЩ @6Tް5 lSq;#h9HZޅ{k 4m;x9RZuF<8f&w CӞ^]Z*1Y7 ܃f6-׸r`O.@ƵCdpR%h^&ɴaW%k }>x@zjvA 1\p*sزzOu;Yw-l>p"gO4Ëy+o^G&Z!GĴ|(̪2ŏ'K߳]-1ZAArH0-[y_֋2x޹."īC؅"G3ZjOLr'|`]sqT|W#1bLecj,/W IM<\r܆%LV 2>u}DL>o1& ֛ooĚhJ g4w<53;Ǚo # Utqzsmbπ]"jo ġ{ۡz(e֯9~&aL2p%i>lNݏ|j9U`9Z|E0 z Ǔ]T  L8Y#a.56RTLՙ{ΡJ`ooz^24U7_ܺ Ӷ?rezNPT.D&;:Bj:Rϛy.Bzq@88H$EaJȎ"^];<_S26(Aeߡ姵8X~RZ3;}"Sb$wx CFMg<(lj`EzsҀْ^KeƬ#5| e7gt̷ng6rhl0o`ơ vv T u`2k1r vV \)r͆>ji]ɦCjZJ0jOM^(dgkq,94]UfttS2H@ nQҍ @>3Q2޵94bbt 옌&KN^'seǭR{Y3UN+_86wI{_b+ 4S\Q{ˢ"ZT?ͱ(3hȸD JRdr2ǔ74fwZg<29`:|x&Q 3Xw#G᪻(3ETTJF؊s"x ^ U& A|8PA\S (Þ-v~CADKC|iI\K`B*,ʹӚZ(?,=Py݅}/l 7p^Lns@:I줔9EbI @ήֹۘ `c{n0b ibH?uY&y405"a4Wiwߑo8=SspK-p? \t~ B}X $Fhg?]_e)SV.L}$=]iUh?c6<)AzM_*kpѳSEd*S3 Ij^^7dQ[3Eɶə׉jG5md KF#K]ot pw}b Vޯ{_`DG*`:/v$1ڏgzp[>; 1y;zGXD2[2M =<5WLjz-J(OSvn(!EP}ӂ+CوbeAac'?2׎4+ 59=Mq6?x^{mוHW3Fؑ*iXN5v:Erm7'\Bκ&E6o~9v5p,6QG|%ۼh,lFr:9n>ey#pe ?$(\?cʼ Ou_2x1>j!8_1GYe!Lo_ș\zNB1k<(fqӖLK99Tf\U~UA7a4M 6 d\߹PK_" nRvg+os] K58aJ yu퍺MQ:gA1NZQ/ 9R9:nμ{/"Gt\/Gg񱊥;JX,+S<(G 5dgKb"`T!9Iɔs85nPLB2[GSl)49qeA6 ʢ_Xs5!FLP1%sRɢߞ -Eu.ns2һ1$F+M>%!nGo~Tn© e0}_#i#5?%x)Y6[&q`miB:oE; kP Ga2qIPG%v"<)I:OMgBAlx l2Gה&_W*qZT΃_$}Y9J|z4]9f-G~۠UP)R5I2ɑ޵+j^?9@{ZI`!= jc8>ݢOUs7լ[lkmݽƖ< i{ bg%@g\T߿ ճi@D[wUAg##BH0Qc:,i |OPL8t!>A g(a܂ڲ{c{gYp[m`!E]=4TVD%&SUf.D2 Kk?m䃍;1`'ָװ "AMPyw"6<*w",@SM1^N+>2^P`.tg:,IXeTgզT*@i9m&fV;N\A@9\(p)- rʥeh2NO`:e-瀗]#c,:։hz,@"Tq1 rM1ӧ{,kjsdKY_QO|-{SjYɼG_b` 3=15І8JCP]Ws7ߦSJ&86/>  sQLяT N̙W6!4c>\=!k@IԴI)L)dC(jc2+*sUl}k!D;l\K}D/^"Fj S~G X2A-H?$EU H\I.X0X湠A+\Z |Vw,Qg*8pʭ=ﹻ93y{69*iA$ANK=ďo-]&eħm:˷zBMMN@܆̤K*>zZyw+gW·!fbuCnu(CL. !s,d46#=%Y~C_#e[ؠ̼ݲvjQ)@ !LE{;3Zs4ޥK{xQS}ٱG$;EWo!:&J&D2nBO/k7+v65-exS4EұĆd9KQ䜶{n/e>xyлc2zg v^ B`^{F w0<;#IPoWqKb<5fIq~Y覰L Jʦr@[bj_S튃(11VtG4ATIq7%7}18Qt}fb:a7[; )8d䛵!j[IT[CQV8e;ohny9M[ }j^}`˸㔅Bf@h:Q".P ot}Ǟ[fMWm1V`+؎k[2AHh#$r?䖽2`M(i|>SKDf%>Py1mt>YO^; #ݱ$#Q4()hwM3m|[89J)Ƃs=RfRTt廃Ф;qEIP i;AÇu"F$wmY$MPp8UtCwDHvD{QjIEZǫ\pDvD׾DȌIZ`԰sGDYcw` 6r0d1La+C\2*N-ɍ칫A5S[WKUzyh!cͪ[uH{7I\Bd5zW֌Qoŕr &w{\*kl\v X~WK䩐!x~] ;O4-la2̳'noӁ[t[m _۞Yc)Β,)3ȁs$ԛ=bܯ6S1kݷ0D5=7_&)wh֞_fqYQP%f/SR t&V9cLH^u&E 1C92׃تx]H#"L얝vhWżvcB#sKv\ j!aJ{;[vn 6>!l'ײmXw-03B{u//mV'XjF=s|ޯG1YmYݭ2u'D\KAwsr2cTR 3!zkݗ}Qw@=j@Ӛ~Dkf d\[,fb% b2EPJwg Õ"NAuZiԟ?EyɄ[pOj{/% ɇmK&}!.%"=pf,.iJٕl64ظIGlE#­ '~+#&}~8$ S%ٖzR͚w1H!}E.raq,3FPYg-!NjޤCSـLB:/>^!k#'ǿ.^DT vRwτE#(SE}HeR 1p4`:!9,Rn2B[K' 4Q2*Ro>A'ugI1&]PG)ɤG١<^w0N/e#oN7 RgAr4]G*J_0\qWOѨלWzY柗ʾaE%7ar=_T2 |8xU-I. gp{O#,}_hU 8-l蝯pȇL]gI6B\|m- , YVF !xo,kU~ F"W@XE@.OAs )N0 Is}k7L%OnD~LYt\R_r?!tfz ςegKgy %)}Fɽ\ܪ%Z)~V:(~½޶hLRKCM`lӞS4iOIĒ 9(CI;WFb#!u@CNdMNIJ;ձ#>Uq.0^aj} jV>ߌV5]Ҵ^bYN/木UC3 # +bv:ӵOPh"ͷU|$߼Cm\EG:8$"Ya<:G܌ :Z0]){A0Y}$EY0gBOe+ @c!V_};(x6E`Y{nX˒JuZW Ѱtؑ2=>H{Sw2 (T"uyh>ӉyQWVE(ƄvIG'p^t49% &ʖiA )T}c৭-Zm ly3e +rQ} +)Ysh;h"Lv-kvhѭ }W5' )>`Y"}8ᜬBIO^薼Ȯ~)Œ嗲R4gN0xie;f mGȏ 0y}l\iD2>$j{1[zlp:L@@} '~3\ ~F|5VKIڏ'N(֊J^dl&Pm{JFv @FuOضv\ee꜠I%37(tb.ÅjcQhL m\RqC?M|tЂ ۺC"[VuxPklW݊MK_ CUa==Ǒ٫y)LsOީ"(QvD_ (yV?,^F?*m:^CDZ0ѩJwNCm9ڽ=}:O{>#/報7i'GtvZK/ :VΧ IA}7[ ?eUfY7oC|yߠ Z6ێKj0W% ?x* ^,3iy,9W e~9d\Fw6ߨ+[k*dr3 +k&}cYy$@>a/ܓI2V"C M l r<BKW5$$-b\f`{ au* qP/$'kvv׸Tsi0pFl;X{e8&'M@/CV ?BX!b0 ,ٍ8-K+ڲDs\:^K$QI흇Kʽpzx15n]{q:|lW Rz(B(r|Yu=98x/(TdD KeG.rˋ$^JIvi/7ј"i{%3A>x>mO=ưy,uI})c֜=uƱ0}{U b6+lfi ?-7vҜ)pLii ('0"R }{GJEu\kwZe׻Qp5]:vyx<1ksa\$> kuu(d/)B=]Ên8oK@e?x>mslFM 4vK4נL铫s P~2GH~ߡ y*7m6I_7zu}] ]M rlA".;^ ĩqYu"b1MUQȉunCY쀏Xɤy\`9HsQ=d6" +g,Kd;Ԓ+NԖ2h<KN|kg-.%v㵿hD?vG<هO}_p#"i\E@Q^gplg T<J9ڮ\X9rZ6<_9z{V z 7IR8"c|h)N0 5~eES,VNyB.Ԯvc.)Px[1pS|1A6t'@~C)Bܐ7.쥃,< y>وZ$4g߹JsTo}]aSoswKR'vrVy묳w\*'feHd`nI/r7Hx"L?L,6m(Kz;w"bcE+r|;#aݡ2Ab>Nh]-ױ"5Ulsk,뚹h`_v)Q/#8]# ީj\Z-re,^8*zĂ'̜Dy۸ǡF'rG! 7M1pKxBQ 򒙶IleI NJYTj Li/JnO@SBI]I \: f2Ϗ'Eɶd4h_7H `Ӕ/3V!FTkzWԊK{ߩF<bG z oK!ɹPӐѠ}~8hIq= FNCʉOI5nj: >l? "."e^+8y .C祭SAIp椑SpuٰUr? TA3*%"6zU(HsjۋNv}{djg'2 ]* Is>G\ݚkCR*7j'XP5t/ϩkYea>ğ&\['(_~I s8 ` n_} d6h[Hh-1O{ +UV *-$EHKQ~&T,{\oJ,Ԑ8-?ܲY~^b xEc>"d-XmBeqϩ8:~fr_Y6&P&e8͝s<]Y d%"-*y]!~}4\)ٜ^[[`gނPD*Ԁ1).!3]Wy R:͠`FP4ĩoC]Ƥ *ooy? X*މ*K}ᘑ=)zk>ZjųE|7'!>!֗%nNx}m2d.bĜWUEIWQf 7-zj؊;3%x&y˱HHViz3% 0h:.u_΃X r{L++͒1m-TvǏNXi wI%m"%['pBpnJΓcDhXeKW lM_ AiMo縮1syܟ4f#Īi}_5u\~/s*:cb g=^ }ר B|p 6+ Q IbAS%t+a]e zN(KA#:U+h} TRjf2> 06tE#H @SrT0~␯8NΛN}*]z3r?_i?Hh)IcG '|Հz!qHYw/}jU;Sw?rzDϔ jILtp|ɍ?!77X4et~®2~Unàda~ì6Z1o) p~}mR,u( h9 bL;DJe0\I>Ynjs0kebMe" c{?$05O?Z&ǃ#5joBN^Q2 SFDYU1 qsS+Q*3HJlh Y8qΐ(dFAl{tV#gKjȚ-&5%ػe0cn1Tgpg-RZ+*_(~{u]27.WsQ("Zk*M\7gxsެmEtMRd8+ֳF ?/;e_[4oJ3vñG!V-1K8o,_۶jŕzydf7I-{"ҺnSHR߹]=ߠkL_7'zPDYٷDaditA dZ='kVVaTV9EZ,C.F:K4w5^ 5.V6cڳ+ȭeXՂ͸BX#uss &2qh[e3dIk/+gi&$V!q4CS^*c'5 7Q~EyVau !RܮRv^UtB'pC/.¥oįFi[ءb˛-(G".##ӿ!D@LJ%ՍϪ O/(| 7:slvy"f)86?VXD+\c>({ E +unmbag[z9AKx.I <^ih $FH?_bwy%AVWy;z8}>RьM"@YNټPxw'l5x=kVA&y4QAdӧy~2 Qïd=q 1MeoeKZߙ)jO麉zku:)RX. ,5]ň<.EE-K@=W 5gy 4۔mƅS' 6зOhj H8gčDfccjV\N-w]`e žtRZXc_K9D)k q2!),yRzr9ƫƄ[):ҟo +݉hD 2*_;]}u1(.*EUpfB l.xX&Ö@r^@v3S6X_ wI^XI/QJ |[fNÄ(FŘgʯ v&*@:[jJõG/Ơ_v.ѪP(OCLK=l;`KLf›͛qD';LA3Zz^ h[Ľ'ij E8JaјJ hp &)1O'QNɳ|+"-4x6iF gWD6Dl]vp'M>~=Ŕ|k8֓'k,^+]:7T=ukkDxfGo + {D`sqc"=N0Pi'>/KL6U ?.Cz9:i.dTlj'UȾ \|"Sէ&P3ekp_L". X*s-Wҋv|ܒCS٘LA3~2 dsd$:'~|Fz z,&dfJ@&b Vq(V9[Dnʗaj){Sll Waӫ,Taz*-P-mh+=ìW?Ҟ"Wx f'(yZ3x1WFZ?.]}.Cg  7|8`nd_I\>)h&NfܻkvŸ8W XwRS1Vlzt~v(sH]Z=vVwGta{H E6,y68d\sjs;#o+gqy&IThNi;8U IuM$+#X݌䴜zjvXWU|k֏qdM}F֝J 1rARVW@#3^&­z9Z[J?G.P^ ="8B.#=d̟1FX?ZoId]!` >!8hbls)Èxz] 6^e..]YmڛGœυm"{n2wXuai~NaDr8/8ՔtQʆs1}D-Oǘׄ(F,3˩?:Y;ZX4gG'R+ݒ-9Cm{dMI ov<$v%D|L-+b'!=SDwW#Z@G~yJT_osRwC.`,_8m`VJ7fe"QN\fт4,@mO-S޾ h&8ώEZ3%YdƜ^+VtܾAɖ_9" =8P<0`ƦaU hENXyH►60Or[?l6Y`ʌWKDٶT?m 8/Cc~Y 81͘اC8CCo bTmܰ C@aeFՠrHIY87md(F #jU9p K Ǥ&_z\o|QG/O6N5QS*u+^k\dcVCϬ#q^ g &d7⧾S|8@ɵ+6 `|U~r~%]@]L0p'vЂ4TzFUx~r ,NFǯ? ג{SfWD0[!G&_zbW6lÈȶCU.Ż-f!oO[ ϛ4烡q)HXlZ}$WG&~əFvc,q8Tg(^kOҡѲM`'/ 8\#˰SPo?5)8cMx \v;(8B1*t}%{o>(c0gx0axTYtQ,EM~R(q!-UڏzЭXo n!)}_CHNj2_jͿw嫒7ICΕYdlHQowiBL$NN!E>\L͹v@dh,W'"I4a@p%HlA1ʽxl6Nh;qZipkDn,:#eN:ܳO OX D=lcׅםd(,.ߨ(S{O}]R.EGaȏWpS51G?k=0yHIGeh{nrVtQmؠ@ joLЗBOGD_{:-qe}uVxy7RTۊݍg}LFéiA22AKF|=?߷ı aIQ4v5% * &'-BP.!*vtz Ńy%m?%V):T>f;xi 6QW84ebQ]._nNykU =2Yd[a{'yYԼpP"Ksd !.c+b2 orc7jenI耍0({5}cHB6w?ue\+;V>/P A.][Zƌ&)2qRyO{=)v;C-s}B |:Eb '$gjGfшgl0 NC2C冧!={ AU Yz]r8IJ}-4/}HyN70;}0cNW+ƪxgl Ɨ4 ʔ^ԤK3,EPکZ8!7%_F_24f6ӏ+tc])SGx=ش۩N!akmmITϳ -p&~7<;+~X8 W;HqV7w_|n\\J]^3ǥvc `X9.=C'<Љ \lj$3!523wJ >UN~oh~J  9a(~ zߢ__P̤J-?7ʹ$#1@aS|٨4՞#΃>ݶ? ]*!+ $3}\ <̇>t<-)OP-ԯj =Duz` ^ -}FV*X =F*.~g&pP5{fI՜, !r &yf\JYnV-s6m:ZS1V=]! Z15p,ieN&#wuÈJ I"˩֡%DkhLI#X'lSu  jF w|/n1ە5Z>M2gs~vM3G'.-5 w>Gb8ScY8UbH!κ#| 9- yb:!XR xŒquK .ANd)nKl+ cw"h{M"UȅSdp}9,M᏿!T6.8V -"4lF(bş{/=4BKS]i߫JiD~ow7; vb ɮ *eX7j4çkYP!jrjBZ޳ϸCD_sezByTT` 2I Lp֪BU{MeKOa}( kڠqb8$\_CWӇ[q+WඎI t+BIBWw ~ "7`Gmˠ[[gV o4zobuLBڱO:k+M2S\&uJgVEaNF!mߵvU +w^t^:Qfvzx?OXhΫn37]a#} ե2N~9kFXxمHCr oZ]>>WrF*!Am$̑V^̫RM tZWggX )6١]kGJyk N#{S,䧛"yq*UB#_lC\ R²2|4ѭĨ#p5D]y,0cZI֨y0pb}t\U $7Op_U}%1lQh*\]8a\I-4-_)RQER i5^<nǕX^Dgxz/?"<\1| .B[q~ߘiKrIaayi䤵,K<%Sy8QT0SV(& NA5g$YYL \]bixev:Q{tJX':e΂ùZA8iZ?px}ßWQ9 &)q[@aOo%K|5RIwqFAEYBX=y8Hޣk"5d JBθIdҢho-bn^vu"Ykʸ+ղZ|#X6dZ_HZ9 7HۢѮ%)D,A0gJ ŬSԣw_;3ۚ3 D|oOL\:R!Ari#;4Px  9F1/?n@T+ }˯O}OX]w1eDѝH4o=&P>bT f2;Q\-e"%=J #1m3<Í`TJS~c!З̶?l`|!ܑi;N.:E03LGhvI>%vrk$ԢD[վdI4W+(*bT U0Fx0؏zgDӯR?B/0:Pv+٭,E`RxnIV6ɢuyrv)r\٢ޥ#"G׶oJhۏP"*M(hbͬn(E޲M*' '<XsI68$ՊX~RwF#,-Ldz3C;jA;;bR>xۙ\nos`٥3%״GA{Wbf^R6zϳ_z2]mw: ^Kɥ-8sC^xs=dLm(җI ]t4Jz/GR6uhkq?TL#-mVg!C-R./_AdC{KB,@c`z 7IBQj{1'h9oT}?G>#md2-t@Wy-͙ 0Ş## &;Seh\>lo\/g!g L@T+ҋ*/ٛɕx-Õ. #ێptmKUb[PF֣|r8k&?k`0"z1'3Xpr'D><@-3.z.}.pZ ̢U~FKf=gppBCC3 o@oJt~$4"Z(*cg,vd%Owy;uŃ :*2D' }ihLCcp{$eG!g}3s{rkp鴧EV`;;c{Ɛ/raa(c9bjAX щ4 13֋J`oI9@H.ln^|︴+9&( ~V͉,7w2וVnUsf?,HSt?H6 i; Fd ~W7Lm3g=}%I5:?ъt-xI{E eGwvMk2^ LI}L#mR3fӂc׎pAIv94D_\c* %2UI{7%W3Z!ULȖ Wx d0^QU muGpe &]m5G+ߢ^:j5Sjm~>܌8MAO2 } 6]Edf&Q8MQ^ؒ!=HM{sis 6~&4E?a2NzT 8e<Ջ}1q#Xۍ勇iji""̀0S6%IY}lVu7f(b? fH58336wɺUJA0eR-CTGF1Vn>: M]SO L59aT)ԈUNAԐȸRy:eMKԫ|U0,W =T"TP:l*R &|"Lo--2W$ح8'FwPhysw2B)Єp;ǠVQZ96y)(JʗUJ{OHeRl=-d2!9#PL0= m n-:ա7 "NNua]ͪ phՠѦwxG*\YqZ̕DErd0o*qdeˊÿD9܋]I5}H6[;x/[S2=&\TlSS&AmM}nYݬwTI-^~$#E PYԑ96|bDȫ[t8I4PA n#`U<٩*!CJ+iqa2yt>*ý*eݏԘ!S`8a,Tҟ`)7upQ6`y Mk /jd~3Y8N(d; tcP= ? m+ב勊A 3sVG6 B)L#X4ޮU^xHnғ!ۗ wel,[u/_mAT-@SEsգŌ* >j9ѹ?KbP8k츷"ɷbZ K.Y VVIð/-&3}Ԛ@{2RP7!PtAHY||2 _7$G2P5^ T[E7FP!7Ԝ*S2!n}R EܝoX-t=$71pe_*v^d?o'B] LވQY%I[CHuaҘNf;E'ŗdμ*_ R/_>#\X? Ʀ'vt0~#DcK$ICr P_W;RnIE̳x ~r̓p#n/" zE9jPYbɆ;+Zo;R,ؠ,(=sQKj c#-Jm Vgُ4jCPtvvΞ+'A$hܥS/0'~& pGhT!F5Q,8YD#[>Tw lGƢBe{Yf6c!̂T|ÜK> 9rW)=wż3%!j b l\TBtI92y^M̚ET@b#_: 'p=s ]/I2M hC݊ê$gKa C#٩Le6RZ }0[т:KSq㫺%boMnUT')?7<2G'/Hے`jHrCU"#< C#Lf"?Z knP@uzS&k Nd~ْQgIMNYYсQF[ xR\߀-㘳ɴBzi _K9=h'{6zK~Q$w+7c*۸YŸ́/ %anms^[8P*B``HC >wr~kJMNvtH*!pco*OWIJ%u)D*!ԩe,zoj|p؆`:T"d "=^`eXuMV_t4*n ^HT@m/GL15xV2 m5|۳toG@>;³ pP4zu[!f`c 6}VNw' f1*&LYz>̈ ={b1զa6k9^(؆jb7[,@T\SgBe`;K讣ྒ .iG *WSjob$k״_Ms4xlK3' t_c hLʲ6%<'8Dd]Ӛ܎8T''?ȇGϣ@U鴈h ;"9ZF &]P @+JOW+y*&CgD70d>]M74B CsrBR ?a 'Q.먞tIƋ2iee@=HBzn} &(9_~+[e2`oWj> %,M>wDx} l.G;qU(<oL2 _L/+B+\ !*lr X%WϺSzU Xi4KkD '$s^2%>< yh}93 ',B`=G%^~0D>5 3FyM^~`b݊AfE^._6@} Ȋ᣽+Qw/,ub 'zS4Yûo `KP&WFݬ/#`~ N9f /M@(οpvn@Q;' |pT4'6w]10JeTCm5EC;^=fTR!/Մ09c$s:~bxICi^kpfg^S0Y#ai`Զܺ4a\rl&i2 Hl{ Wd&#o]0! .RZ,A2n&0VԏjuH8}7[jiJqs6I>S\[)OYOK*dc`a#L8O\BnɭީDN)ᢒ:\yHޑ Ωy&@ "C0c !݇%<)gI#E&!*)O9uI[sv#~8x1.Nt*a`N~A~7l]QKfra 6(IO>u'd33o1۔#ǸthD{W9q6Ssj97" I VYc`Jk5|%w0D8d9l E aVc]1qYqfaq*'I'ZqA6BB$,\h\w2.BقOEFʱɏN> VXu ,͎JcQA$H6kɇ Aw_1O.u E>Gâ`'FQm^s~Hحӷ$^!,rojD H?:0wɷقbޜ|jM5}ofoY],*l7XTq/LsW06KhK!ao '2m֟>m&QFM+sCF[f*/TC4A\w4R'z+ wg,_21^df[O{tUu~zA9:1w܀}#enGpDKhC$"-hZCꭙ6A80m֔ ixxv^W ڀN@h/"IVS5 dBZik _-sJ_ye@ Sa _C26$pY.Rj xG  }ry`\ Z"WɁ["RD#ty1*PǰT& zxM3YPyD9K67[Sq"w{AP^f)1'HϽ{/P;)ޣBuԎ ɘYsBj$qcvl0 #9YVfa0cXLĬ,'E=a~=jtp&r=a~=ЭH:Kp(uAY{3@$vL|?;YOo'X_zָ؆޺GUKbb1UK˿ QmOjG%s ;lߴ3,] Bw,C:dVցit"[ࡀ?e/ND+1Uc|Hۥ&?# )\<̠XƏm{ -yS6Ŏ)6c' $SOn|oR%A7dž@Fn|`w0 Vz3Ձ]xXl4X2nuh>M{ѱ1Z|͉T/ԭ -/{E*= %ߝ`ydOOwSS5}w/ C7  n:?1 5%CZ X$nhqp9JZ,tI-^}ͩhP$HxS@ PpRǨi>{NGiqɻ{غO8Ep3MDMIKIDX< (0]o`Y4/4X[C⥑4u|i!|i.C(:]R* tG{P_Az/k=1%}5G޾4}Jۆ j v`R$l uQ> '7QP`h -pȠTH 5Ńꁶ:kde%8y.m+Kw7S@q+.NWS~qgoծH`8<]v ߹* :| 'Z7t^I/sd=G0"!{ߊY` D))>,\l[_Er?6 4.hˑ.Wa``+;'_v+V@^2ŀ(E◵u!m3]46M(,Y2-iԈ4}03i>J%3_z![#+B\5b MU qD-ܗAXJA&5Jꡨ'_h^DV*1}oa},k6_AכyVg&aߝ3TůA c1zKj/h)Ril.es5}3IIt"@OA*ϰK]36B{j)1G2Rf S"N *paV"2Id^W.Va z3SO20EaWGakp[UJׄ<<2ƭÅf_Z,;)c%ez< T]n !U:~Iw wkŮL,pJLրAG Ka~6ԧYpf|o}x0lua[WSe_R9Nҋ^z4ҖTE}w `I% k[ 7X@ Ag5޸+U@*0_{^1G|01!B P~4)eUSL0?FQ-upNmV:G C'h?~,b.8:d1Oxo\ʅvu-@S!Si߼^;},V>?;&W} /e*|_iyS$}mF:-B:ѷk.s T]' uHV]G>ʇNXHNA{؏ +{eC%Df2ӂWAY)'-D3PKK:8kʧ1KHsH/:H+KIZR/BkڦMZ(LT>Tdy~Yko׉*7gRW7딭̌-;z6#$_EBEc_ _ %9#ʮub-B?]52fzs&@ 2kǂDa.IG?9 v@'zXJLѓx@xi,ko?>P=1 pG8spg6p4"tCKgpJN8XW֢`-|fzsڪsxzn9:Jr`SꉑҦy"7)דC]w_Ui4t:w8/vg*% t=Gأ3Q+h޼(/8@>@/UKfE6& " {S33,ۗ[績p.FMXgG:ĪMdq.Agxh,W^<_;קy%}Iv*|q;gb`cm5]wQyZT; GBbpyG203q:8Ꚑv\2qU{V=8ESfyNYݿ+i^ayW-\DԘ9{# ϵs) #nȒgi+Nep+7e6 ޯG6TnXi0(t)!aB39)oD*Ts}E]BfMP4kUVo8A,GX[ٖZ}];W~Y>.#$NNkO^ r˟to!l5G` gQWcV*ܞbs^@[.*:^Sr).5\ƾbY}tJȇ?u|$xFu5:?z_@1E?1VI_A;9fʙ* n;XVHwu<`sNKŅpMglh.J$)jРTf$ 6ϡ-0 TIQׂgI*U-~|G )Ő{g;\^8b"NX3^l ʑv;_E.-3۴c[Ub ұPg#RH1!JSUxH3ɨ:`fi~S&g,;i(+Z)]nn dٓj,G]bnߠh|;{{|H/=cscCXYVn~inʐQ))7H5vzQ#_+:I<W>ćk)TL|mE&]A3jHyncсPནJGqn5E:@S`4QN>0/d 7Kte sVHZ\,̅whb⻗r?I 5Hҡv{nY%i'RԙNgw#/ιYHMi1GQz,՝+ȮkL=L׀u%NSm1YL6hl8j2ms]deFLc,7)ɓa"DLk rЋr~a/d%cUkOa5mF73r$({v&96P*-j 3t\)_MHfjʤ5t㥩!p?Ca[*(Dœf@'l߆8= MTvY#'}#1j8pOR}^Y? fezZIwp6}/Z)Eo  ]X *ZZS"stN@LNT=('KU ڿ{'^s=w +Ip _bdOj@I_2BUQ@' C9:rh6htDzr9@yġQ (t,EWE#$ D6k4S2wV9:;z֗, ?~N.Bl w2̭ y xATJzA9 |\Nz1ϣߟKyϊHտNv%| Ar21S:u!|7tivFul* c2#EAZWim0OB~V2B w6Ԑ !k- :ekA.W/ ?md{M3ר4#7Q;Ub<|NjNby]])rz͝:Q㚧ʈ5N᧣TpH#xy'4J/o%+̞]ߵ0\UFH>A㵖wdo}ك/Үݺk=#E,0P7Jv:LΜ'컸Џ#y p{e}9YMPFV،FŭPc 6uU5v9'acрBEd]e$žky0"L_*qRHo>戤ƈJ9 e~D08]d[+LSZ Y)-`|dw@4>!k ؈*"Yow`<;(eJ;K iw}F Wά̜i߫HciyDلƟ jfEp'b}tQ E"ě&t&^F*x-_--짶IBEҢEՌɜ$a|M U9!N?ܤ=nN͔;E͒RޘƔ T$šlX/v{c ;v8:0ZNj#ji -zJ%JsZ~˛>tYg/;[ D͝2OT͵A ky4iKqHJ o !NeV|ϡP x^º|}%ERgve\B|ceF-妜w3쐼y%uc\>۟lm3n:^!9~bLA^- w _8L$xJAm$0)Jt0TR2hM$-t~̅E`X8^)FM%B.C;qN&'7erڜ2/fʱ_Aޣ4H~C/5zzDB` 0>@7ºŋGr4ӛ6U&C"kw&uHt ^9p$<@ u9\4cĔڎŞ3t߅ݖqBm-R/,,}n & 6ޘXFhW )v˭l(6KSqg V5q,cW1e,e쫳o1LO(uId դx\[l(&|wK!׳3TV]Ხp@u ׫` I|m44a:_ɝ gpS` QcL!WmږiJM&Bfoո @-QVX8Cs,i)XVN`*7]+bca@?Hp!)Ɣ͉ oZFcѐtFu8\82fm:~$VY_&Ϫe@ H=[b"Z+c:*6hk R+p9 @k0 J ߅7audqq5XaiQxq_S#l烐u.<0q!Vj47tMy1OH +/^H]‰˶xD6QȂ̘9/Q*d`ƿܽb :A/"Ko}Yla{պsbdf%Ʉ~0>f9f/O'>| |dO4>=^ ɟH"?J h"{\*sw\3WR(ƈg)^zMj#&D"&{Oys* \5x5΄ /— 1DV=oO"62cq#{ϑI' pW /=(,Z)iaIf%0=  Mb BL`aUa~?ѷK wpUf2"GJM3")Cr"Q0x6#K$q|2o_ 663`32w٦R8UƜP@L]d6aRf)խ;mj05ԑNjx>q;B.O %@jatjx-2U(ahahGU8/~I,~4-MZwɳZ0Z몧r:+[7,CP_XG!Ląn?e ZGL?%>HzsJag;-9~\8M(H(֏a{8GA FwcJjڥ^@_lA LF:܃6%܌ ]sNӣL,3BA"-Kkܻ^PZbq$lfm%kv rxyJM?p;-y_\{ɻLs~!Six4e b|ˋ6ɏʗxIދ &{ 鉒1㥯CČ2z%,2bm/u:t[< S s wS|nI]Nk_ /''?Fq! "X*F3p.*O)lhpSFՒ_{t~: RD-3$5<9b\m'.K\ww4'[X[ɳn:` Ow?5-n=IeŒ$ >Fx_3EipxǾzƘⶡBB 1~.x532,%x#CՒο# O u4^e$x#7MtDbd#co!ҫj6{1tq $3`5O-LwF+p-K`{GE@)QZBK5ٌ; ֘L"cLI{ӛ7"ؤ-5CgAFpJܙ(h^ c\$6R5MKӘ?"})w+KXyTDF9>xjW ӵ]˓M<<ǚ4X wDHyK[_:EFNVW1Z n=βLɫ7lUM:'l7[F)'Q9`wJOn7E2SOZ%WUGA&zYءȉך{p\AgD Ac^K&O7ҨJ/,K'~ʨD *Gk)#B8[hV41p~*E?A Yh{G3ips6CjW*2n+I d/7Q.m:+>; ږg4ha^pTX(jԥ(tʾF蛘3&~y+p:\2Gk2!OeYMAG|RS` ꭥm 1 X2^9M'øm;}8MEiz'oWJ C]Rqd}ZLflfCVoDe|V?9֔)N- E$''8 ho%j?XZrH8ڐ 1Q~H~yfC1VoƐ5%O@jr兮͌, ؗr zIXۙ/pcbM?^rm,9e`['S2:Fx& }bUFoX+Ѻm X(bDM{QuAs94(Qm# Z|ihbXP_BM?:5Dd?{5]h5I⡠|գyk tSrfYT+aY\($o1 t:wz^ i%yIfzN$m^5AΣ8oU9hc uI[ϳE֌D=PPw˙34ʯmORcwԭbwd=cuqP*~5 # |Y!w8pm\Ĝ}LY[aݗp'CYv $~#>N-!d?IJC`CsmlQvC 1׮2XGz Pb ".k,)mNp nVyjw-wSc$f.;G?$bP >3F#qj=YuZṻ8i*nR4s6tSnΈx("%?]p1 ^MW49G>*f+lM Wx*1 [SY:iˌ%#bկ'uZm}WH!%.h%hs7|%UBP p<r6?)d$׶C>$Es5;{uvlȝ@tg2ӰiDd\.e=T2IqP"T7]Zyr;lg\9OÅDhyW[3eY]ь zÃ~֐"d 1.)`"NnQz9=BdnݓK Q.pca1n}Z&8:$ Gl2|hLC?ޅzfC̖ٕ Ďҝ^6:(-^X7M~*{;u!2և𒶽󓲊՚6oL6 &1"(:ʔ2M#~£[C@ݺ+ eW0)}B09Ǒܫ\G[ňܭ\''^_$:60y~=<낉z"H׏o:'2Xܿljxz/&T$F-O>h)ϤI?#{ok(wVÄjK^ew@frDxN|'ҾMW5*%On C2ssqd|Rj:HePWw6ַR-RǶwV%ag0w0YBqsfq-z^BK`nGZ73|֝NIS?vzV&?$o3h>ͬvYqz8ѷ:x'GZw[-H9t-Yq.Ooضᅵx0$\c'vlY?Sd-BnZu|7l3! fyl!$$_U G$~^y=xҨC CnquŅpݐ:5[q֤`R>Xa1_neHc&n Ie"c__mlǶsO*RU.#\,.o-Ad7i AըQd {\RVOƏX+ Q 9xɛ7wߖ|W2[*F?m kO&UvQ'ʃEL[;F&U5۳ղzlR_)VJ,=vӜ@Kqm* ox* VpBx>"Tcw7C5ke"q=6B|9ڐw+^q;hŇ_R`(!aWGBxY|ʳpȾoS [ayay<qxZgLϋ;IlqJcVzTfc*`%b~@m,pV[~WrQhMȠ@̫ `)n 8c&U (c.x/QxQ6cGbsяf ~_udKu{ysu.ye}u P]nӎn.p#mH|*%LNK~5Dd='$\OY!i5ւ3Y^#a" 0 y@0]8V= 1ԛM] 5?LƬQi(Cǀ%z8eB`tѺIָ򩄢RK(jog3(x\0=gkZPS)>wԍu+wk~^F܁U炦宩/<#j#ycB ;{mƕwY{vY;]K9ih#g hP`:i4VVM}Q^0?`2QčBfBe(6/ԜuE/4?-4s2=x#Y}@M-uswacrHPP7^(r^VJ@|mB"H^f~*oiCװ,WZJ.ɟftKL X@hӆ8O)^ m 3-$S^NΜ]XGp' X]uIR0VxL)3[ ]B7x\`ܱ4OFI}]DoxZ{?8t԰4h?c<7;vvf wx2apwqERi)o߬ċr>"wNBCvNwcGKJ"qQO4AjF?$1Y +pZ@WeTI￉߭0eJrD5 nWu8 ,`PT3Bٿ$7?vEDg37DQij7TN "[|^:dƲz; Ѕ{2,sv01[%l\et{;* Sf L˺ B 4!ICEՐmV!};uⅡJTE}Ќ3V74pN[j{mAu.d<C>Og3Q K-o?L*~S1Hwk}7X 7ש:3&)A#8K;݆V&[cX'|cmS(al#7be9aGUNÌĹ>iĖ r^)zu!HB$$a$_cp3j3ב:WW=ULX VBO=E'9/ ̚8a|sn:^jK>:;%yDǜ%?sm.T(BޛCS~e2L+q>}8b L3ĉ+^E-j_˃c0$0>FC³}}CV GM\GR"-^kIj]g8~8F aPKbRn\<< ML74&% g$M|Z}"8HG02Qx5Xm`)_$$72-1FuXs0$ucqAB b]e4ro<|ݽ]4=I=Bb`๺{T?;|A}SR @ G$< u{,aWO[mQB[fEO[dn $$"Y«&?F0Iʟu+Ln" Rou%߯ey%wR Ѓ]!W h !_cpǜ,7m,yZ$^s_MEk7eAZb|A+GQ g W z |q, *&X@av-c 3ax7Z;׀%o(^@ybgՕYyx4ό0@:=@zM$b&R/}Q(>:cf. yv껏9)7 Pّ{6BsńL#X H2!~Wˉ!v@7ՠ-0!_B$|Z2 YilrR8+NoIF6|ᖯbfe:$1Y@4m9lYYhnh-o&Tio&V¨C]f^T`6Z>x]hKCI\xoކ5" `I"w@(|bQnrC>4!eYVpTŘqrs; ?E%<,%Ä1 r4RO;ȝiy;auK'tdVf0\" Vg!vf"<ž $E2e)PjYt^{mֿDYH|*Urs g '9;qwPHp򁮁DabfX/<$=D\:KR8,N$/5`?bu3f?N82PKId 88^&ߊihlBvxvLSs?~PiP};>$QPRG T],wثWjt<} Ffړ:M- .j6LTNURw`!L,Kʹs}Vўx=, ⶦSrz$}+~N@/7\\Vh܇pIg蜦/>(vk(-R= w8/_,s(ʨĖ}x*.J@btY-sF}L}T&+d |jȊRJ/_. !D,0`̡=FM&K^`( 4l Zy(B *)&xF=ұq>}nw.wU&(cx ,Qߒk5II;KۏkmY/4EJJ˅.lu2{5))uIpw Ʒ(⤓^C>^ WEGEws "!rbB_ֻ+NsaޤO6l|OiCb `\lJ/'Į-3H$!Vbڠf.Mq׫:=cOF; {,֨[^g+_h]Rh?k[?3ԐW ͯ.Ruo2Q@48aϾlNf߽TwI#Ugxv27x-n@ǚ] mc W6ǗO~f҆ZtnM?p <~{b c?,Q5ğ_Cr*Qw}+PM`"[Bz3›PZt'Dă:Xt(VοM00\c/7.qz_hk:NaXwo1/f #[gFT{dޓǍM53Iy39ZD7נ^u/^$OkO1#KHǑ: #IIՃYAZ"ED䟲o+ymR$1݃xz| :4AI&˸_dRgj-i9TǘFrvneپs xyO C]Yʑd2!-]RwA6ԐԷŁM tw&H$\ 6n7oTͺNvコ$ʛ /_rVW`Hz?eXuP4VdiTc8_rxC%lвs/.xJ?P-l>օ8‹1wgdh+ـP@F,\¹r` hL;)U4o_xG$2~BQ~v6]Q̓^r78%W9"w,L' Qt/$V ! xl8'yTs?'}%$15)y3<_}sf˘1 Ŗ9ݒ ?1ZPV6 t).Į)LdirA~_nN+, 7r& C[ io6)}7޼U)l&Ά-3yXl{Jv%9 [/,^K\)ώF%B(A+ZG3O# ʕ{qs/OAnfrS\b&RI=HY7Ϭjfܦ?&B!>0_ǏXh2ѦMfǷ߿7^EG"Hc<6⑏750Y< 6= vٞac;U~`m 2n?TޑA\HNCi^ƲI+w Rh}iܼp0(` >au CEwؓe(UPmӽm|ZTVw3< v`ݥoiZ;'m‚?A{{*2Xm}s;întC_ #R:D }y#^"G|rW Mb]]z]\E\bݥcЄ|;1z*Yv3"2oȇ[ĞN,aRRP@k]ˆqF]-ڕޕ԰z4FF'f&Y!e eWS(.A̜)R|=Sgőȸ̴Nl.P\Oc^[ j* %ȞJ PH>f4$Obise pmɲUl~wy^F%B ɗBr:4{QUDSK!PF.!-MYcMsy!l“Q,̙sjw;  cix+ /f?QMY¥R[ OIx[gPe(d `Nskw76W IÎ {*9T->ؤL&܁}>(EzZ&,qX$τxbs lĄW;6뭊p˚|@@βKu[SX)>rW/)Q+wcaXc{I@hMqff݄02-)Gi=M(KndA߯"EA\lM+j FoikL+8כd PخXKv[W+ =Ownة7Cᩗ`tE=|/Y7r6Lt8L B9.sEݴGWʟbO7`۱h"V$f㫦Pzau?e>4Qe t@W<_? T_D0DWbOD e҈dNomB .Vt㑘H擨?+JhE]y2Rp2 x^; _=}]#rIiWϹ-;woq7q-\13&l/ mw]> {zbj,R܋:E<*E&۾FB^=9~CIq}y)dvM>(8O%9L_QF*e`EGwf"SRx0sruY i_PٗTVg+P+;v),6^} ixtzYxB`H\lKe\.n*$_dO3ΈD<sl 4ȰQyonz[ܮNzf'𖸭7Qh  <7"qbf螜tҋaч)6XZJ! :lu2d|[~\BQ{׊ˮi< 9#pԋ?;c "0dwMWopV'u0O"sSFA{.YTdo q& q,ȶ=;?iM9C$5g MЍ?Ld&+ER2vRoP2\LJyO)n}5~5;T̮gBlE`xU)-4̨eÜm6P9xߙAg,ɻeH?NB/ՁLrg_[؆nt7WzJȉ"P]E)/+|96|HxW7!ld\l݌~;~MZ,x$dH?l9xީPz2&%U>vVՆhq[2q~2 + gUR|\;gC,6k j3yd=,/2V!Z_xw/|083GusQW$^;b*$m6sVǝ/wͺjwcNo~K]ٜf+z~PkDJ 2r?["?#^fOfitrf5"g;K/Xka% R{\ZqCn-V;JʓZ:Ɉ173',곩Cwu' rIz kH JOh9+1qyLq/@I"X 6*nša5'ę\~(eH}f՘nV58}_}vw;u?o OiQIv٥PE9r# A|*In;,ʂ9S;x|N6#@4F+28B=+t8C+1qZCv"|fMv&hpH@r.<^(K8B- .]&ַ {6^Tr?8G"#ѧB{7( c|QOn?1T_U_lԖ9|m /TۭSh0B> W^=ӭt#WY p'#B9(9h 4gDIq&{z`(٨l[%Ծ5b)QX[1P6aQJ'+xeb#|}E-R쵙3|䴓K4aZ^Rh^XLEpV6ĨhaoI ~8=AU |]f8'45_xk划`{OySajݝ% 0#H!7@!YK܃7:쾣YWorI/G‚"7 UI {l@8tPڣivU#օyV՟%H,R57K߇^r,lZ=:qE1`+qcT=unPOrPZ%{=z$;Q~yt &F&9#cf?HϬޣm}S)b[lp{4A -lJGDRꨘY6Z5.I Ӊl6*τAX֍}g뛌m9 U zHt8OгkK&Ih-  ,fjr>Ϟ\{9C- +Q- $]V=y7+t%>&b=>n)7k3%6lZD(hdS`)Av1L9==aܑXR.N_^T"Gp/5!ϫI[8u$쐆 |thd?.63@RG⡗v4-8)2,Ϋ$ѝ"A"kk 3_6"6MukLUr"ϹAm|\ ^sFId_|gݭoCB;Ya4-i &;]:HhkƝäy<[x(vul!)Ş9e“6es6yeNdMʼM54"^Hg:E'h<%P1`feʫvyQjcʄ^oEKxBdez}eYPZO̠&3Ro{kOB=(Z{M`u@H2D<"O]6Y7"ƆBWȡ|Y{9s$-z^Ms_/ih1q Ztd >1}WݨQt!FdXt&j Þof`t\';/-CF9phT4Nε8߂ kso]oߞ/o '. 7 YቖOGLG. 7xOM1G%xVL2-lpZdBv(9LDS7.h%I#CPf";dD$텋>S4ehO@FAǵ YG q&9uv˹;X?:{Bo~.[+KڴeV jۚ,3{n_*B$V%{\3gaqxTzVoGAye9޳" ǰA_=3-,t)0QO,(s@Py\e ];C^sB)I: e:z]Іl(Γy榓 VCj2 /þrKuAJ:S//xdl/_ΦD 7@ dj0FUh ץ#uiDJ˜ ~a @]{*NU ``hJ@w䶠mGcl)+t `Au4gl1q+֝~+d$QwgdZ}3Wv I{NVuyjVLWU>}̑`Gmhb~=N CS;~|\egDP#Af?lDA>ÁvFy3cuoS3FI"u)-*t`,q']b[Ehڇ6)>iȬa_Ieno1䴁~>>E{2ڛlL _2G_rĐ[£n^9ذR^ᒙJQ{yLԺ\[^!nKRY՘%;1NjVP$`Md 9fېhڶ\;ڗ3(cс3q`aAnȱɈo&ka)n(tWm9p:,\G xF0UJiy5Kbk04k9祟Rp>#W>A#"a:j^6$8(8aƦT|f$ HKI|keor‰FZ^7q48 ?g-awr8o̓Pp*Fvqi:_"?j@N((pi!Dm@r!TV)ꎾsgup9Ck+$(3S:grQ J&*kJ؜qc%n{ܘjn5fY"bUh<;~h<0u?+.om"xud 6_I)E^fHΫB3U,p %k6e&rjY˳^2`ZsS<[ GZO) ND`gj/tcTQ`0Cf~WxRZ.s$auCUood)aJ+$J'Ea1N6tPqeDv[O_0)boh+ #7,Am+xq[C5Kuۼ )C'fy't ǜn"}kx]Ko-lvy*ZyUTn7~Gnxy;Fg }sڿ:{0(j~;XJ4hh@ί+ -R!ǴW"ui၇MXH$M1k56nm0 [-\) WX3AlpuGI+Em3+emp㿝@FžLkSg8ijFK <Ǜ0!f V'7WX.U%DDr-DD%s!IԘ9ŕĹ&\ui?MYQ+P=l=Wiϡ̹xg2NV__W$2R1%tv%aRK-y0 .\_ :Eyf1ӍSZ !A-u{FDKVF(D[@:Q|y&cef43Yz- 3[ iqcfER 8痳8AIoRqߋ=Q0,ώ;/M-Z/ȻZ?f vi: y/y]I&u#uF+UdGf" -aOP$DL_,U6T)]eB?hn I!^UDmrxGB`| 8L{ӷYeH!u0> *˜"0ݹ/aqe3H(Dw. Z>&A̝rZ7ÉqŪDOf!K,28e6MvbvHiFem{ j[g@ˮ:|ήX?E/r4 W5gm>ר=t3>)Ik2[s&f.1v{,QmK Ct_@5ZQ:A٠xt~`rRk6~WX>m< QpuCkVB:h]҇ 0.Wژ1MuC> !#zba~S w W`Oޮ1^y' @Q;F.' , zV.C"IK0WU6zqU0q(3Z%瘴f &{ٿ* TxVFJ,ȨP} R= /8REC{Eӗ:^ng5_@([-`erW|TU} Ѩ'P( ^oc2-pOEJ|M6NY/J,$ޥ#xo)⡯RKp̤zuZplAJ}D!P%,JrQj4nk_z("_tƀJxi(+w?%gXP?UovTh:˷mC[NGS@Wq}EK64W- r6rK3T^dO'*X&h-Qw ^DCl zߔnsϟM5!2KX!.\<ݩ/Y?OjgW0e\iz(A |Q.riMmiGYJ03U2d /#؂HP ]Tr3ڳ@foH=?oQ02T4oX4_f26R&҃޸0H Gya-P-buP1Y6֬ŚuqZt;܆{=PdN *9 ΓXgޜ5 TƓ7( i :ԪO,` HU_ӦSlv>XQiLQV9&[Qݝ>('Fȟ({/dǬRSK߮9mLM`WlF7/,F@1"y:[/{i $NbZqxd\*.ݬ*"UΒ D_\T<-+wD7S T#RӀCt[H-= <5oHRyKU3%-AB_q z,[e B +TBoI%n*Hv.| (5T]WͷߺQIG٠iEKRoz@vpPS-{$02Nx1TH (#YimUö7嬽n]֯3;ըn^Kd~ ՘sZ ,ڙM8B ;baÑ]%K['}Z, mEa}cbq:9U2I[Ԣ'.ȱ B/>CR|9#T2fzz_-Q$${}!@BZ#,ROUI& –T}=E9WL{nKGeM2>gN*WJִZܾ{ŧ&G듻6J@ᗻ|‘hL|m~ FV:!5؆BmG/z n9ABOLNʀ7I#zpcW/-n<8^:N#Pᵴ.US #]_g>jkZXV>])0*܊>8Ã֤)7_v+FtGi 4>BjȎfΕ ΍ k\ +GܗTq/ӣ,&tBŅ@~o#hgp$^.c=YƺwMqDhpE?~c܆~Sl]l3U],\Vdy>a}d Z_ ??pO?iuM-XgSQP'x44l=Q>pkkL /G,&U&lm!] `Set%SUP)`w灠iX'Y OiЍ+2mlJdAR~ZRH(9EbdH2-VdFͼ3W6ͷUib)ۜB$ 2״v+6zA.Jpa$uAPZ.0Ƽ.Kch2" Dm5s^ԕ9W$5:ۉŰ`,JI2K d$+6svew,UD]p2=ɘ'Z"xzZcJTKYN0r^DGͷ^.eB깔)E}/c$ruπ͑UrLl>0 Ƈ_/rS0?V+Yi5m_!F_ i0t>yC('+>ⴅfǙfltgr(VDZV#H,f L腎8(Mߜ׊}4 BdzȦǠ"Q@?Ev$=o%`/zolj<pS׃d}cɒPN,͚c*Q׹CR|+iBHytK 4RAqV$@aٴXJܐ2 еr 3$rEt:  J}^yys0PKfJ ;t׽<5>!_rp:Y6u왑(#ߵ3v92Nm,Svcȹ34H V s"r3&=H@"5nk/3.T#&H5iRDc>e؅)~)ʻg<[lO ۋcd4m8(eӠ۟Q:4eLLo׭%M2,`2}Sa P[ʳ޼/ fɭTF̚8+!-פ'&dj {1"[s\oBU>eeIotۥ r9"{|ĬC*ˆ"u#,IJ܂H׈&Vt ^>i"$QpPbXyL0L}8rp{`9':q;U~HY0L0 % Ku]5(b<a}ԕRtӲbIV`Jxl~Ǘ~R>>n0|()ʚ~}In!B%uTռQ:aK^ŕ7憰 [I?ѺI}ɑTb} hi)TF}^p*}f$ڪ\_Z0B[bFxp%XMi-YH>11Tۅ6&!>d[5q;L-`/;6z) L-oz%hhoF4Jm:2z 2Q4Pyi v{ezԎ Wtxyޜ,]{Yj>N4o?d~'G S̒i]lK6jϏ<}^RmUIZHu(.Da8V+^A$U*V(wѶ>Ҽӕ&2[m$ө'k@uNAqLjv^ͣ̄wvلEDTb9*%47aM]RpWxSså9^ESA⏮7;o)Ea'aeô1)f80-oYùnڭ^5b[C[N6{œQ=ΝK-[k,||hjЉG4>aVZ9~ȻIa+ 9LE-lh^(m-:O*ݱZ f-,uNmP &Յ4:Y*Ufqj>'QO HygG"J'aruL_Q^%vZ ǚƓqĉ^o,덷sz<-g!0(U{{p*SYxb0I_{La}ݱ@p0ppp3#rH律~β#a}%3)yUvƞIIpJ hͳeg#r+O̓}X S_շV6[ W=ēv)FxTW[ PH^X5|,Ģ$@DAb؋dXU7 wV6|ѵ)EMT⩘ UѤVvu&=2TscXIN6@3WO{jI4vwh?JitbN}is@hط4+o[8C6g~H5y`?4"js#yͧ43UO|i eu3-Cy2LPbC1Jazg*ػ`rU7 JBm/}@GjXƲ/.o Ɩo aW(z:\??M2Nu@Xν] 43^ ֎yUSWn[㡾>+Sd61X$*u)&S ѠK, `M☍Ÿϡ\14א 6`vty0n1ۀ\JQBf$XX.O\@@=,l|dЮ=Z_v>O)e$oA׍]B2T33|-SݲbU =>"zuDZ^ҙLM颛%֗Nz*kaq?r=jdom'ֻgg7+ycS~V9:>&=F Vk3F`r4# Lٍ|S4ƸDzG%Nc|9^2HY<uB8r֗ABh_[ mO!FfDOhˎMh8=:@w+gί%+I=ȘIC Ww+9Rӑ|/͚hIq2Y-vցBgآ"'׊mtlפ\]{v697HY:YR"L2eĤĴ7[WFU ˏjPFEjAHCWkpyszDt{?OsvB+9=c$2,MgL)nxWb5(Rc(dba-NxORP#l7Coݠ˽Tvh>J-^hv( ڳh*斦Yb(YR F8:\B ֭-$KEg-w`P95qL!+w9 Œۥr$hs@ p\(0/*~ѣ|d1H:!gffH@˖p_p1h~X]OQ. t(YGm BoYҝRCNY׭I;hp5;$c(P3x.rG2<g)PJ^澼 󙓟UOWU 9&{Rj,nQ0ԛ<$"҉ RB)BG#f% S̮3X[dli`3P+Ug(0OqF`.;S0 <%(*ViWR&LlHKX F{.>(]OJ]RrS!ReʖR"O iOF @ŭsipVR̘Y4$vs=ORKbKi-PL]hxd;˛х oD[ f\i+14#-*|LXhf4E+ɸ["~'瀠>\),ϔ`F nf̷\{H`o "urr!#ޗުx\eT@ɪZ*&uJQΙ%,=A*^K.RK^E:NγcؙW4eb e@c3جM+K:r Μpß46`<ݟ{HD-C>_YxW`>^aؽ񐹕ۆfJNY& vd_Xgq ͏o!ֆCJ@&&0AxQhGl#L %dN9s:̄HOlm?iȒS06!vD*@`kݬ "ro6\xFw:/bhz@#Re ӕ~w$"7W-ܻO$:: ٰ)Z,}la] 0>| O/rռ1,'/hCfM KP'%Σ傌(gfu2-Cb o%iqhM㲵b"'=T}ҝCvD$E?SO@9Ӊ`Ue^lW4sm*5Y0pZ1րȠ;e'_̘w]8xa8 n%(  VO,i.JmWMZH(X뉲,K5d=^ǐ|a#[8wf oNG#hÇҔM(Va%,:#|.AROuҡ,)$?(u^6$KV Z3ae;wCE"HvM[S?1?dJٴll.Ͱ fҌ1iXC3QD,ZL,z)"ZP#C:*{+]צyMބn@ƹ9w\ΰP TfwFQ3c|FQގ U,!ǥW^DG(ZƒX쪎O;1É}=XM&&s?9/gk/$e#7ZXCDIE~^(hdk%Fy,p'relݘG Ty,*#A1Ԓ6h^u56U~*o 3$+4az=}{l}PYָ7-hu *J/WIO$+OEB9fkڣ.(5I_|BօF8V;AZ8#b}$xxlX(l]O``{ kx9ǖp`$YT D)HoBv0?8yhOL^w85g@!z( )PJ &ߠ80js&K0 7D yTTMa+y9I5r.˄XATs% `LĦ`Mr6cFlk@b.?jUU3R!}#HE6Oac.vZ-{zEkt9! Bo%pbnW8>m@vÐ2R糢diE):@<.PäDn_B:sY-+,Ôno ] ob Io*LފD̟~㤺KV00sc1A-a^u",EW֬ƚD/$ɂ;N /":-x{vl,s~n_rK=OQ|uyX^N[3褤uOӭ ckYl+A'տKԎZU/z+xI(\Y#z.~PB-409s+` L$3Y?ԓꘅ]Y({wV ,Tr*x2ouYu PA͵&~[R(؇ i^sA- biG"}*KVW3drZӕ4roTIaw w_c1+d?ԥ=$8x%!~|y˿=)dnr 7e:,xA"T8_\5/:@(Qpo:C)ʂhYEx"3 ƒX=*3R[!!1QNnW|t+k`=[c1 ⨌O6Oء56! n0)-\#6qeLD] #Lc,uuCFHC= =mY|ł:k"E=w bvVYM86 &]}n!~L[YBfYL@ssXjƜ/ bThmS\M4~VZ |יҴߤ)pTH I_9x;=?YliZOGj*M[ n6GAh2-^^ݯreeX0΃t_wr_W S0u13#'7İ ,톷J@h<m5RQ?=ӸQ_-C6^QKLlRbW4ӓc9s._zww$YXBңӺwPu8 ݗ "0-0& =-kpH)Yܜ¨ib+k1&\f0CM7S>ԧhU;=c5Qp/$aϯ]^q1\)5k\Ү|bՒN(49 Eiso%` 5E0f4n!1<ɣRƙs 0}dvrPYRnm-ΣW?b՛ m@_:-lC^>H 9րӀt[~%^ESqX ?O9!c?!q MHkSR#ʀ0O>Fxz^W1.mBo 9ź/wb+k<[ؕ%LfĪ$g;}9`>Sb7'xkrgD՜* Rȃ \|L5M&ca 071?<8 D, py *-C' |O Ɍ%]7Al'YZ&XIqn#%{}G2E;fe.Z;[58lyJK c$3^t -LDߤC7 ~x|+% Q T/C,ͪ9@QX30u HA CV>?h7o+g hԉ=@Tw!<- vzL1 ,i^ +<29qzT}sL\a*bDG1Sbp0ryhb˶pCZ,^<23 44<>H]%N0J\[6"c=PV WقVv3.6!J:@N Rlj7>IJ!8OPd֝ gC#ˠKM5̹!5662 '236͕49su} LӒ+Dd8!K.u [ISu\D7h{C\pj}+|0&W`0 _HF˒j{̈4nƕQfJjϸP.|KSfQU\RWkV(pFm~MAJq=W>=u+IZkKP!$HJ@Á,` ?.BK&M[t."1^ɇ̈'T= 4-Ƚle9!;}2i[ rxE8UrПqVQ>`6◪tuÙfE˄;J}*7@m ̼WoALy:I$az nĎ,H$ ~3ݲ1T$ ;6 wik^GVc*n 7BZgǹy@8GL"/oJx\0g|ܒ {4ɃyZ,t}np[.LRniͷ9Vž <9-ݢxVK>y.76*\u6Pf<9=,U[v/J۬v2(3$ۘ?v+3F{ۺ| @{!y n@% l%`/ZLVY@v,ZdK{gNga{B4R Jw d7h9Coe6nW]30]Mb 1-{j5pq_{[wfldb٬6_鼷G$:\U4FB!j@n]1hHUK^F+qr>\.EĻЯA&Pī|7& [>ZXu467""*t+H٬5/w5Cq<ݛ@֫BJucESBx'e㶬)T׫~4ɉJ̊!rgX|b{6U;;28Dutf?}C*#:^]U iUtD.Be{GG]B1Ӷ-[-`l,tJf[?Nbwbg\xZ䑐ڣvPf)Ȕc8FQ5.'D&Q7=cJ\ĈRq[oLqxRoHU0 ڋ]^ET!~ˉCk8[ow$]?&`Z\؛s56?iD~hMq>O;ZlmU4yا[**,ң-vozģ1.6h.Qq I\VuoC*6a_ OPM-}2;+ '%B72y, ۶G67`<UQg$SUdw-;)|xZX}.cUs³m_>"\$OQ8OT S\\U!bINT&>H/VzГS %i):9DY芆"Z昉u<`Ilel3F@NRc|,byò=ڃ/aB,tKd$jJUw_TK쉔 rLËT<׭%B0?N14ڸW.Zpæ(O"i`PXZ0x#oCA;#Q 3 qZ}Ņ [{-;I %tu-s:aNxHբ:X'_aC~c Qqpa6BjU8CNYW&,}p[23`g|#qfE`f !:"kBLNA5 wsFj H%-Ѣⴢ!٢X;qTISrNzݒuuZv!Yyhc wp|ն# ņkܣuiUc!ci,{ 2HH` v=d"&a6ɨ`~NvjnE9ܿ騋:䘅N:)Xك>K"u~];"weGz|3{h[{]ϔr*o͑߀3{0*>)5D\sT1Je4BI2XK%=ɣ?c#&n dצKp1M{8aߍvyG1zuVB(I 4֙u2WfnbO#z.(ĩa/Nc`TQCb%})0A-(5epI"_9\}|ܞYuI8v9&p˨^#1N#1w1= i.3qw9؉l;uG%i5BZ܁o;M4TRt C,h!@]*f}!bfz 7#AL!1䪸jK$uT#SR>b~$rC" ?SC0RS3e>@fPC8!pxZg wLZBA 1H@P-+K.0(y{2 pM^MS*Au?oK7>YZ:x)HC =l=nSCj^V!Ǫ>)6zmȦoa938h >|;KqbH<|WDZMf \B;d9lX^0*ҫXHu0T6B?'[&*߉ { RY,ޱ(NƂue]p nH:h0WHңnnlr]u#$}+i&B8`(bu.gpע2-qpG?0A22-&$$jF+XTD nKVS@h\Ii 7r.գ,Qڭ!4ɂ/185NOg|S@b\-7(D.Ot3̋B[9sxz=KQ\wR9"{@$A ^ u8$&VGJe1\֊֙{4^ _jn mm$, 6u'1ZHuߌ ݘ (0Up0k򘓨CmC+R]I@on̡Jte+7-qCkOWȃVB]5 ֤F1)U uLD$}5+Ů b0J3 }5%ybD-"Я0Z. #!> S.i Ӱ[UDw;0Lqm.1L`0k녱BG ^QՠZ~јu vR6~PMUMQukӦj)KoR|wAe]591`5Cb&P̹xã~p' #yƑ>8Dw)Ѕa-M$QK(fL>A67;e+&ШZ-eɃ Y 7*2??'q(-Xa0d[YatPDmRJ!i:47E)V?O"e7By(8Noyx6\:K`IOi1= &b[Ͻ˹pTfgPX꺪5l*I$~H]5V\*G7OiΝf`$ j4<=hv Tp;Tt<LRƺtT}RgnwСHޅQ/ 4m{O 𮾟Zz{S8Rhtt-֥G5w@:>wX= Ø'O<$!{TC,`LT #7)4"D262ZHt73^oZj; -xٿ^]Q h*efQ6fYlG*lJKj1}~:5MuPIJ姑jA]3T+29R!`YpI -AeX#&S %#3zVC0X'9c!Oӡ\U4́q 﫩:ZZ-Icm@,&I6REV0}ZFeDMS لܠ(O",WKln-;+ -;iOTt(Ug֗=ք2M#]̲oI;;6k7}Q\FW~(v/uwԔ@,[ʟ ! ƁUH`9} TvNa3Fc|[\ DOO|VuFxlj Q2f)Ho6XّJۖ%`y͂qz~pMn{ur_fxH^TDBv֘q&L \qT8\t nV޿W+My)("{W,.C2DP'݂"*bYK鰟 MH/e쎛 )9DҺ:*{ϴera $!sQ. _ K9j4E1UIe&2y!*jT`w>p:"YE1aԽhhe`运  p``cS-`I(논"Þfmj )ܵ""x x09 ]}6'^K]LD*?tĤm (*ܙ`'@;H##O5So ܖ>rRޞk`>U'LXk;x(S|A4+tn"]j#u]`wR8:BTXp@J|Ufq%,KseA~`.$#F8 %p:[n`NaQ Q⻦Kh~ʼ=FM4;4ܶ1*K*VzFw!y3p-dxf3Ɉ 8;`m 8aB ӕ*$㒃/G'Ѳ4*YJ֊ mL5nQ?Z^ؽtYjCQ.k>2: W짊/긙q:EZ=⓬ (/7+ K0QAx*D-#~t ܲp6lw.5-AۛJij<ҝ@-^֊2EsD&`QRN[;IZ{vrRײ20!BmjI(mKdC0 gךU~)@"%Zh}ugV-m3g&W[ElUI6 vX'0s,5_ @e;*a*w0an!e$S+?fHVZS.5ImA"LZ}<˼Gw1a֧+7C[z],v ʿ?a:@^6`Dd- t9j,&pͮ-2! Z\|D-mGg]{$U`9#|CwNh6B2l<ik8v9bV`QK"9-KfSy,='+-&⦶|Xi8ExTl>5<|04pe}&}-R7cB=`.;xplYt2B40R iKج rيwEB9Ș5!b> )Zm H Zco[dROկXm5ffY_5"jdwp$B[}@[d(CSpq~7:yGRGҥ#NeM""Ey}iEVfB*ZO"OR+P,zr^ N3{4Jt}Q=1)(k pp t>DEa^45GD{ i*s#_@)Z$$ʕ` Z̄Qu+/d0t(?>ZjErÌaPn؀%G3˵Vf)Ur@G3UJrSE+=3&Q!V;Coޯ qo:5TJTK)_(e&Т3;f<۞E]Ҧ^qٌu VEA793.p((3cb#)`gRD湚0h!D41S d< BnVn[AB>kDkR_JtG$f[&LR5?_m^oJN/jM$j.4DvUZ'%;9iջH%ş%*jT A@n#9 }r -d<Y<>;FMу c@AȟRVvotX*Bdeu&6p]14h:Sho_v.ɕ_ jbv=^JĜ ʶh5+ĭ,H6ʖ75]&imkBJQWZN[uYw/An 1~DKl DhvN!A(rP`~O&.~0V 2swkħ|`hlQ7>[3itY rz9$9Cp|}KD+jNw:eւglӽ t/m9*pC򱭞˴0u=(zw2͏zɚ]RQLR֥1 CE}2V+_.H9[SR I2abGfڪ3Kf:d &șGFo$3,7$ˆ]f.`T`4Kmb?1uj_"2Y`^3IYeIMlf07Ѵ֔X^xWao"\ #96T?%ǜh l.+=Kv$aF2hи`(=iHřՀ5]?A2NB+$^b+O1 g+F%4UK2kWTOZ87VƥrEOj(D9nJ5؎p=GShc𸿉D/qd`! 5Ndx(b G+Vdىy9O !&{ڰJxUMQTer(p ,myp`# 쿵l%"ט"dS>.c𫿩}-|;Euh߰#sfRg @ڹ,s\=t" T%<]]pȒePC W=TFOR 3`6PR?cabhŨb.8ɀ GBHM2ª*Bd~-)^mdhDu9eM2'fL׫X.ev..P>MںJ@Tq`6='o&> =Xߠ(TL[Y>&v^i??jFOM5_"m!Ĝb\[HOW&cS{`eQ@єZ1*YbjmA0=X?Ytn_vΝ r"S #p_T/ɒWEq+U^ i.Rxq`K0~"dH,Mګ2A"|_lhإg.؟ZaN|_<"Xx IV=*hrߙEr.+MDEk%m@zMup 3)Y~}Y;\Rn9A@SE08m4Eog2p$NL( r(l{ptG4bD& ?ݞene5fk_81 ُ(q^Xjl "IC%1,r$~A<"Wp MeQCu 'q1vBSBfBk5YwJG-|MQ=A@V:/kJ8HvZmJIJXu)f\)z!.nx  &. cDe &ņ% 'f|4_"2ST!e}{s.+m<8:K=ZE]PODͼwarGֺ;ǫ/q=- }!=rb`z*-0SO;ݣnขȲ9lDeY+Q!'`B"1|`!_jЩsiH2=T%֙2rn64gv8vJ3Q1J }FDA ZI2ׁNDXR+$SUKX 5U[FG8 U\lД٘RxIg%8Ӹ"8$QSNAFc̨9S:yXɍcbV!^A@'.\)L2|*PS~Yթ]Q`۔;6ipYѱ;Yq U=d%I#]azoig\C#q2A? c^Q4J?,jl gǞܣW5ph`/H\@\&ehM }1g^3KFEh9IU?WZ 3H|4g V޼aAQ)^SmUGkUK*#?y&:x ՠ (V#k+=StE8>'^w˂v m@@b Q?2 آ.=QTo]tZL5bf~[>rB?Cq8 TD,BErI2?+GַXn_%vGRolu#a|uR712[`5r)IBxvM /zLR LJ΁դ|a& ;T~6#`hBWLYJ7w ;ƪQksrNuvv!\X?BKUq>X~۝^o1;a}>W'bNP{xn-#_EyK/xf@CYƄ%e'mҹCu/dd3K>tfnB]>{`X#4CS.ߣw[/$EܘQCi5tndPqt@1Vؚ s%ڷdgdl- YzMC]_}W%ɶ4`-??1u/L5G'RB]u"٦饀a/ O'XჅQN$ًrL'Z}}wiwP͋jTV(:J!"k_v7$Hr=|2CF/\aVлln:F}ʄ_/sFt=̙Ψ^XoM.QcĞKcp*2Q=]]ӡbD`TfD ǝ+b24&ıp[-Y,8@Q\ϭtQlɼo>([Ko.):ilG] >bYuu(J&z6EBG֜ P)'QS̚7CL6 "n,'.|`uWB1|ꀗ%ԍQ.ᆰ[#4$({SaY[|#8a8yR1Hy$h^NA7AfO.+pd*{f#=n~g@]l q RS$7Zj:pܠHiLgz]`-kfC,n@VHGԾ:*Y}1UB0ပBSuvmV吟\ft83*(֍E?1nڂ0y<,&6DnZE)pZ!przZnj[^ "]neL1RC堯sNI:ݡ3OC`aT+f@a0mt6YP_ d {n|x3[&D6e՟U 5K!uF0٬[,w<à*\B0J`Tf:d!{#t3&ZmY .U4t58χ=GQlZ--iIaT/f71r#LK8fz"Qc]sSKCYV Yˏ<+=7B=UGτynW݂jsK0 ll3UT&P5'F=YWB8|(RlJm_\c=27FnԷ`Jl_7u X> h-]WWD_> iT7kgՈ^. 8'=o?}QYjel.WjZדK71>u㱌)ƍzL`hQ070701000F01C8000081ED000000000000000000000001556432B60000038D000000FD0000000000000000000000000000002C00000000linux/suse/x86_64-sles12/install/update.pre#! /usr/bin/perl # script generated by mkdud 0.0 $dst = "/add_on_products.xml"; $prio = 50; ($base = $0) =~ s#(/[^/]*){2}$##; ($id = $base) =~ s#^.*/##; mkdir "$base/repo", 0755; system "ln $base/install/*.rpm $base/repo"; $id += 0; $id3 = sprintf "%03u", $id; @f = split /^/m, <<'# template'; # template $product = <<"# product"; Driver Update $id dir:///update/$id3/repo?alias=DriverUpdate$id $prio # product @f = () if open F, $dst; open F, ">", $dst; for (@f) { print F $product if m#\s*#; print F; } close F; 070701000F01C7000081ED000000000000000000000001556432B6000000BE000000FD0000000000000000000000000000002E00000000linux/suse/x86_64-sles12/install/update.post2#! /bin/bash # script generated by mkdud 0.0 dir=${0%/*/*} dir=${dir#/*/} repo="baseurl=dir:///$dir/repo" for i in `grep -l $repo /etc/zypp/repos.d/*` ; do [ -f "$i" ] && rm "$i" done 070701000F01F8000081A4000000000000000000000001556432B6000630B5000000FD0000000000000000000000000000005100000000linux/suse/x86_64-sles12/install/yast2-3.1.108-1.16.8535.7.PTF.916376.x86_64.rpmyast2-3.1.108-1.16.8535.7.PTF.916376> A AlpA?Ud.lts{GAp*T ; Xtm:}s˚eea3fdb7dfd11970ef9256f84443d5cddf79bc8a.w;*@`D?Ud.lts{3QwRkSdfw1`l^ Z>E?d ' <  ;AHH     h (l )t-1x569%>>@u@AA(B`8Bh:9GP::[:>$B,FԨGԼHLIX%YT%Z[\]^ bc defluv0 wx0y(z`pz|Cyast23.1.1081.16.8535.7.PTF.916376YaST2 - Main PackageThis package contains scripts and data needed for SUSE Linux installation with YaST2Ud.xsheep18ҥSUSE Linux Enterprise PTFSUSE LINUX Products GmbH, Nuernberg, GermanyGPL-2.0http://bugs.opensuse.orgSystem/YaSThttps://github.com/yast/yast-yast2linuxx86_64 PNAME=yast2 SUBPNAME= TEMPLATE_DIR=/var/adm/fillup-templates SYSC_TEMPLATE=$TEMPLATE_DIR/sysconfig.$PNAME$SUBPNAME SD_NAME="" if [ -x /bin/fillup ] ; then if [ -f $SYSC_TEMPLATE ] ; then echo "Updating /etc/sysconfig/$SD_NAME$PNAME..." mkdir -p /etc/sysconfig/$SD_NAME touch /etc/sysconfig/$SD_NAME$PNAME /bin/fillup -q /etc/sysconfig/$SD_NAME$PNAME $SYSC_TEMPLATE fi else echo "ERROR: fillup not found. This should not happen. Please compare" echo "/etc/sysconfig/$PNAME and $TEMPLATE_DIR/sysconfig.$PNAME and" echo "update by hand." fir   $D  /3_k$* , 8 >n5x o5:d*IfEF d2v/|# J:5mG717 k9B21:( %[%Vs )Q.%/+%R 95U |?  DY,\-&+Y#Ԁ. cU5 euo4C? v,P4<g|c!$^RVzUI SP7=h_=N79) m$/6;_?$O |.\\$H8@.$ gFA큤AA큤A큤AAA큤A큤A큤AA큤AA큤AAAAAA큤AA큤A큤AA큤Ud.ET{T{ Ud.IUd.IUd.IT{ T{ T{T{T{T{T{ T{T{T{T{ Ud.IT{ Ud.HT{T{T{ Ud.IT{T{Ud.jUd.HUd.HT{ Ud.HT{Ud.FT{ Ud.HUd.IT{ T{ T{ Ud.jUd.IT{T{ T{T{T{T{T{T{T{T{T{T{T{T{T{T{ T{T{T{T{T{T{T{T{T{T{T{T{T{T{ T{T{T{T{T{ T{ T{T{ T{ T{ T{ T{T{ T{T{T{T{ T{T{ T{T{T{T{T{T{T{T{ T{T{T{T{ T{ T{ T{T{T{T{T{T{T{T{T{T{T{T{T{T{T{T{T{T{T{T{T{T{ T{ T{T{T{ T{T{ T{ T{ T{T{T{T{T{T{ Ud-T{Ud-T{T{T{T{ T{T{ T{T{ T{ T{T{ T{T{T{ T{T{ T{ T{ Ud.jUd.jUd.jUd.jUd.jUd.IT{T{ T{T{T{T{T{T{ T{T{ T{T{T{T{T{T{T{T{T{T{T{T{T{T{T{T{T{T{T{ T{Ud-T{ T{ T{T{T{T{T{T{T{T{Ud.iUd.jUd.iUd.jUd.jUd.jUd.jUd.iUd.jUd.jUd.jUd.iUd.IT{T{T{T{Ud.IUd.IT{dcd72df8dd86a6f265ba94cd2445412d853173c4a6ced1719591cb4ec7cd1d31bce20d3b888273c8529102a57ace8c1bafe65184ba81ddae3ae7ccea8fb60cf47b9e88baf107a695b32e9413a33872ad61cbad29c9536924857f149301de4ba9e665b82263033c625c2c3d0db9bc45e5f593af75d4c0a60f46eb8bbe2247a708172d12f707be03051f0f957919034fe17cb5bb810089d5c4c75b0645f59a5409e431468a26b4610bae97f0beb40e67c3f7b5519d4d1a431193f4c294c02b575c706e50cbba77c93df56ea0157c6bd0b565d3433b53ef35bb13aabbdd724dd2cb690e2819c3c17a0cabb68854dbce609ad221844475e62a3b3438652e252e7336b357013e2bd5d35dbca86656641d0918af5f3c35a44ea2a7ad1aa734af73144616a308fa8ee4842cbfeb59e8e065bd3cc3f58ad808e7e0b7e7786f40ea2474b2410cf8990cb57f5d4507869ec20901fc2c7d56c947c06156edc92f7d8d8f73b72f4bc351f7c41704158308740b6bccf57e35b8d9d2f5da5ef9d493245cca0c962fbeb44e8fa36245745f05b8e81ee9931d43979d61288dca6b57381bf1e7032bbe5b4204778c5faead04c6718afe7326c08e673ba4ee7f69c563fb70f7e60e594f72bc4daee0e8249dd073476e2b0c6d67a84bf1736f660e5ad449f3396bd79caf8dc2a1e2da15ff523bf6f7e8fb584e80a9fa64ac4786714eec308e4bd5e8e6718324803f707b084e67c5ab4d70a48b5ec1a3e1145022656d8f5296d9e77fbac4dc015dd37d2fce3247b0e9a8260bb4b708907d751b812cb2a639f1d3155357ff2ea9fbf156ca04ef3a1d4bb2d178ae93254f43401f71e4805e750c4a706c8dd7cff3d937439b75e6bb44da873991dc6d7105a5a7d25d0232ffbbf808e7b1911cb9e5800a93ce6ba54c5ab77f89e193d6b5d3c2322eca0cdb593fab2f4c3ca01c068abc063b043a89e719b4d8fcd316140bec85505d0dae72f80893608453606f9ee45d3cd716c5885c8767de45d92a97fd29848de600ac48b777c0bcb8afba8ae0706f43620147bf32d1fd0e4e3edf6ae048c221e9c2331b7323ae7a95b710a672ac67f4f6528d02121363090be1f8d4e1b44d5807f3da51324d9fa2b2a8e3192d7729d08d485bde007fbec0ff92a48b4a10d259416dfb24020db9fb87c2829ceb6668fe05e0d24be2ce5a1ecfd0ef481e608a546100eaa71ae29958fb5b9be838ac020ea939dad2983156c02eea194b0a4b80bc9edda9a2f403d363d88ff3166e3371bca72793d06707768030b8d72257a11adf88404945dc763c518972d8dbb223ed798cfbeb1c4f955073d34108bcdeec1ba5fb13e318ab6b6cd709e69028c91f7fa0672869e6228b45c5774abfe5d0a0bf1400ec5fffba6acc03645901cfd2fca2bc1f5bea9ef88601fc10b5bac4a2330b3c2e37328c336d6a62b34f86dd41e866cf5cc52fe7cab9b994b03abd970932ad81289fc933e49b63e47a2fc3212f34c2ea9bbb752b502fb6855535868c51c064d1b4ba09d25d50aec16c148b03caa547d26efb1a386e21747d5642a329fea6c841307810797ec5c64722840d9a53428ccd848df35950063a047d421f6ad88077d21d6752bb4ab4adeb59d5387b172af3f23e11e0cb726138771e74f658a6cd00ff4385c2a6cc26b70d5dcedfce22a0ad1aef8bc46f1bdb35796b5f17762dd05c827cd620df34147bbce385feb116ffe64b4afbd9e99bab046609fa1b30a434a38943b2497f6e94ee2765c182c80b3fc45032a7996cea3e02a6b209ce5482fa8b87ea937f4e9e048a45183313ce6a68d11517de78d31327603a9a4dadcd371a9a55cea51feedd434893298c64bd3fe3545f5954c67a95fb610fb36cd6cd56410e54d29f321455746dc23d43d4c3da209b50a287b8b998669bdee0fe431bcae48fca32318cfd08d69d187b1b83fbe0c1dd25b3263001d1fbcc7885d838508e959d2d757ce249aedaa49f29bc66b902e7ae08d095fb345d345f7126f994576fdcd2c945af18d83a6bc7157a2e47da0d3d2ab762a41e103611b006a1d908943794fea378c52b084a4df481c250363903964f73d91066f46d2e802f41e88fa6ce67fa7644040bc564e9db21e7beedefb559455e6589307b9140881f7c026b6a617b265a7a9cbd051a4fc2eca76a719ea0d7e2f2def7e0a1d28a13c57c636a7e4d4bafdfd88c09dbdea6f7a4c60892d9a57003f681bc373ee2d80b44a7b2fdd042b16ca3695c2c0224f6cdd1c9d66c861761f56814f55e7977c6ffe7bd6e4194a90ae4eba2f5faabd2e01e56fd5d80ac314d05ee678b3a93b4802a4ad657b6ebd5fba72c90ebfd10b2e0c8447a5a1f22b6b3649a5ca55abf7fa3cd499d1e60d844e05b45e20b0a57b606f4a3437f378ef90a22969dbc041320f3ed3300b2dcaa71aa5be23c0073f313cb9b7c281ee95f0d41034ef6162a5eb83d13f20a6073fb8db7d4ae1e8ad3c2c82b7452f77281e8ae46cf745533ca9717aa44116810836b6521a11158c80bf264f4d96e53280366810e2fc3717bd80accae646ad85ec306780c8510c13cee1c55a9c25a9c22f00551ae3ff97c34f43d60b336173ad846e80cd877d1a0a93c519923a870ee7657c29c226dfb215ae2ffaf9eaef5ff46410351d680d77509918ecc5e4e7d051bb4336447f91e5794bdc94151ed4f1e1ee92b923c1142858cc9b0b8d9d02d588e798fa2769391fb1fde61c126c2f83dfd71a5c8c9b9431e07ac0033ced3ec048d0c78285415e37fa9b0bcee51c2e0c84c641a50d5c3cb6d91613192423b44fdd1a34eb44c3632b5122b216f1e6d331b6cd22fae168e19054c1b0b833a1f0e530ac39444a067fa85d12af12ae991eb1f27db6e3e24d6556eb6c2c4d7daf3d2205b344f82ecc966fd12a26358ef8b63f32e3759a545d7d4cb91705584b3eaef2bff82c1c4c4c77be14395ef720dcd25623daa1e40e5ddbc8da2273e28b9f4bf9a5d90ab91c108615423a86dd710e7c783cefffa83efeae8c61deb8c8b3f5ad732764f6c81fd6ada86feb5bcab0ec2d021acb93eb2db92faa59c3c66e40cc5561fcc2db9e5437d34a969840c08c38efb30941f88232e98b2bff87a67a857c408ebe32134b2773d74f78a50e2fd79c2a7f9e8d6882499e92406a2d85bb19ea8f098c0ebe0eb3294d2194ad8eac51e2eda52b61d0837859254b9431436fc9e03edc6d68c52392e09a6163897c1cbe1528c48b294b858d8ace4dad1345dd034e97e6676cbb4fee5fa6b3257a9cfc9eb0b956006d4a83256e20895c92f2eb2a474d9eca058ea30ec09a7d03d3cdb3d942f0303ca91ce2509b3ba52b5674bdec242d3db54431f8a3af66c0732fa2484caf9600d21a80950940b2ca7885dcd6758faf4b56f6274bd15eedc77f063ac7595ae13d710dad42044ce48e4d03db4d07d0b7a135b6d85c318417a50df2ab12297c03f047026d990de4af73179d6d2817a0ad82b824e0d0dec37a667f9e2ba65d846f37adf5053a1044285c2486757c2f959ad16408fbd1cc7a05309fd029d901e7caf67f72b7e4550f9ce2f454ad2d96e21e1f9313c55bb77d98d3efa37aa22d2d3137c433375d33f1a415bb3acd423c610426cc3829c400c5d850abe35f7def2080e1bddc6abfbd2b1dc98222f9c7fa4dd1d8f8e5c6d50e6e3a5078db9354923244f05bd4e2e88a48e9d18c9f4af2db7621afd68eb6d203ee654d99d55ef94f8a6b60fe3483f339bf41a91d7626340443e135225f355493380acc4cc88c967f633f94acf836662413fd5a58ed0f0f342911f52bc8124562d02e24d088dd817cd2de3e482b60fd42921ca53d965a2486b93f3fe521b1b5d6788e42235a3e13fd3d93ea635b8711e511793d74752362f41149a6e8a7c58b103934fabc9b970f4797e3a579b0f06db3583dda671cd340d1b52d78b209c1a8865fda03eb5651058720d3fdc7cfda2ae94fc1458b77e55e7c328a0abf9339b1973f2a802112c49556d7d055fdb86bff5c5149bdabd5c46654c4c7bcf5ea2a053b94ce26502dfd1a97541be6db82ff338fb9d9fcfe0e0dff7bb5712b9641924e8481ae61a06d36e5426f876b994351719973258c428df2d058529deff3e7b8fef5aaf1bdf0735d2e1defc15a7619c4889e69ba8deacc763f0d96cd15e17c2d3ed497d775c0e19932d18e00ac89d5d08badf64240a2939b5a1b14b6e4be9ffbc06e829bd269a2005242f3753a8a0ec3cefa08d5bc7936edbf31b9d5aac2a8d794c503440f785ea425a96b1456c5cb164fcb807eb4305d99350c89df9e5c0ed54198d01c904ed125fdaa53077b95e52cf2077674550ff5dc346c6490c16a7d58296b1712a60e5706f1f3efcf7cd47e0b6e9494bf73e8d44a1095b79f4d2b74d31ca0e24d0487311923363b5be9d14325bae620d47543dc5396fc4834abbff6ab234ee4d69f5fce4486a80fdaf4a4263001f97594decb4b102581b8e31f55403001f97594decb4b102581b8e31f55403f20f69bd0c3f4dab674a7fa80caec0958d8ce8b78b9fa7f7938d52fcb17c87e1/usr/sbin/yast2/usr/sbin/yast2yast2rootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootyast2-3.1.108-1.16.8535.7.PTF.916376.src.rpmapplication()application(YaST2/groups/hardware.desktop)application(YaST2/groups/high_availability.desktop)application(YaST2/groups/misc.desktop)application(YaST2/groups/network_devices.desktop)application(YaST2/groups/network_services.desktop)application(YaST2/groups/security.desktop)application(YaST2/groups/software.desktop)application(YaST2/groups/support.desktop)application(YaST2/groups/system.desktop)application(YaST2/messages.desktop)config(yast2)perl(DnsServerAPI)perl(MailTable)perl(MailTable::Aliases)perl(MailTable::PostfixSenderCanonical)perl(MailTable::PostfixVirtual)perl(MailTable::SendmailGenerics)perl(MailTable::SendmailVirtuser)perl(RegistrationStatus)perl(SLPAPI)y2t_menuyast2yast2(x86-64)yast2-dns-server:/usr/share/YaST2/modules/DnsServerAPI.pmyast2-installation:/usr/share/YaST2/modules/Hotplug.ycpyast2-installation:/usr/share/YaST2/modules/HwStatus.ycpyast2-installation:/usr/share/YaST2/modules/Installation.ycpyast2-installation:/usr/share/YaST2/modules/Product.ycpyast2-lib-sequenceryast2-lib-wizardyast2-lib-wizard-develyast2-mail-aliasesyast2-network:/usr/share/YaST2/modules/Internet.ycpyast2-packager:/usr/lib/YaST2/servers_non_y2/ag_anyxmlyast2-trans-menuyast2-trans-wizard@@    /bin/bash/bin/sh/usr/bin/perlbind-utilsconfig(yast2)coreutilscoreutilsdiffutilsfillupgpg2grepperl-Config-Crontabperl-XML-Simpleperl-XML-XPathrpmlib(CompressedFileNames)rpmlib(PayloadFilesHavePrefix)sysconfigyast2-coreyast2-hardware-detectionyast2-perl-bindingsyast2-pkg-bindingsyast2-ruby-bindingsyast2-xmlyast2-ycp-ui-bindingsyui_backendrpmlib(PayloadIsLzma)3.1.108-1.16.8535.7.PTF.9163763.0.4-14.0-10.80.02.23.02.20.31.0.02.18.44.4.6-1  yast2-securityyast2-inetdyast2-tuneyast2-storageyast2-networkyast2-sshdyast2-instserveryast2-wagonyast2-installationyast2-updateyast2-packageryast2-mouseautoyast2-installationyast2-countryyast2-dns-server2.13.22.13.42.15.62.16.42.16.62.16.12.16.32.22.22.18.52.16.13.1.342.16.02.16.22.16.32.17.04.11.2Ud`@U\w@U[%UY@USRa@Ra@RR=R1@R@R@R@R@RR0@R;RR@R R RiRRw@RsRrF@RfhRfhRUE@RD!RA~R%@R7R@R@R@R RR@QQ@QY@QQQzQ)@Q@QJQaQ@Q'@Q'@QQQU@QU@QC @Q7/Q5@Q@Q @PP@P@PP@PZP@PN@P@PYPpP6@PP@PoP)P@PvPiP`K@PXb@P;a@P.2@P!@O@O^@OOtNOr@ODO'OO@O@O@O@N0NN @NFN]Ni@N|tNs:@NqNp@NoENiNh@Nh@Nh@NdN_sN^"@N^"@NWN?N;@N98@N7N1O@N/N)f@N)f@N(N$ @N @N*N*NM@M@M@M@MQ0@M6@M5M# M!@M!@M@ME@Lr@L,@L,@L,@LL@L6L@L@LD>@K@KtKEK@KK[KrKKKK{@Ks@KoKoKhKTM@KPXKO@KO@KLd@KEKC)K@KmKmKmK3@JUJJ@JJTJJ0@JJ@J Jp9J_@JUJT@J;}J7@J0J0J&eJ#JJJJ*@IA@IIcI@IܑI@@I@I@IIII?@I@I@Irsassu@suse.dersassu@suse.dersassu@suse.dersassu@suse.dersassu@suse.dejsrain@suse.czschubi@suse.deancor@suse.comlslezak@suse.czmvidner@suse.comjreidinger@suse.comlocilka@suse.comlocilka@suse.comlocilka@suse.comancor@suse.comschubi@suse.delocilka@suse.comschubi@suse.delocilka@suse.comancor@suse.comjsrain@suse.czlslezak@suse.czlocilka@suse.comjreidinger@suse.comancor@suse.comjreidinger@suse.comlocilka@suse.comlocilka@suse.comlslezak@suse.czlocilka@suse.comlslezak@suse.czvmoravec@suse.comjreidinger@suse.commfilka@suse.comschubi@suse.demfilka@suse.comlslezak@suse.czmfilka@suse.comlocilka@suse.comvmoravec@suse.comlslezak@suse.czlocilka@suse.comlocilka@suse.comjreidinger@suse.comlslezak@suse.czjreidinger@suse.comlocilka@suse.commfilka@suse.comlocilka@suse.comlocilka@suse.comaschnell@suse.dejsrain@suse.czlslezak@suse.czvmoravec@suse.comjreidinger@suse.comjsrain@suse.czlocilka@suse.comgs@suse.delocilka@suse.comlocilka@suse.comlocilka@suse.comlocilka@suse.commvidner@suse.comlocilka@suse.comvmoravec@suse.comjreidinger@suse.commfilka@suse.comlocilka@suse.comlocilka@suse.comlocilka@suse.commvidner@suse.comjsrain@suse.czjsrain@suse.czjreidinger@suse.comlocilka@suse.comlslezak@suse.czjreidinger@suse.comgs@suse.devmoravec@suse.comvmoravec@suse.comvmoravec@suse.comvmoravec@suse.comvmoravec@suse.comlslezak@suse.czlslezak@suse.czvmoravec@suse.comlocilka@suse.comlocilka@suse.comlslezak@suse.czjsuchome@suse.czvmoravec@suse.comgs@suse.devmoravec@suse.comvmoravec@suse.comvmoravec@suse.comvmoravec@suse.comvmoravec@suse.comlslezak@suse.czjsuchome@suse.czmfilka@suse.comjreidinger@suse.commfilka@suse.comjreidinger@suse.comlocilka@suse.comvmoravec@suse.commfilka@suse.commfilka@suse.comvmoravec@suse.comjreidinger@suse.comvmoravec@suse.comvmoravec@suse.comjreidinger@suse.comlslezak@suse.czlslezak@suse.czjsuchome@suse.czjreidinger@suse.comaschnell@suse.dejsrain@suse.czlocilka@suse.comlocilka@suse.comlocilka@suse.commfilka@suse.comlocilka@suse.comjreidinger@suse.comlslezak@suse.czjreidinger@suse.commfilka@suse.comjreidinger@suse.comjreidinger@suse.comjsuchome@suse.czjsuchome@suse.czlocilka@suse.commfilka@suse.comtgoettlicher@suse.dejsuchome@suse.czyast-devel@opensuse.orglslezak@suse.czmfilka@suse.commfilka@suse.commfilka@suse.comjsuchome@suse.czlslezak@suse.czlocilka@suse.comjsuchome@suse.czjsrain@suse.czmfilka@suse.comtgoettlicher@suse.delocilka@suse.comlocilka@suse.comlocilka@suse.comlslezak@suse.czjsuchome@suse.cztgoettlicher@suse.demvidner@suse.czaschnell@suse.delslezak@suse.czlocilka@suse.comlocilka@suse.comlocilka@suse.comlocilka@suse.comaschnell@suse.delocilka@suse.comlslezak@suse.cztgoettlicher@suse.degs@suse.delocilka@suse.comjdsn@suse.detgoettlicher@suse.dejsuchome@suse.czjsuchome@suse.czjsuchome@suse.czjsuchome@suse.czjsuchome@suse.czjsuchome@suse.czmfilka@suse.comlocilka@suse.comjsuchome@suse.cztgoettlicher@suse.delocilka@suse.comjsuchome@suse.czgs@suse.detgoettlicher@suse.demfilka@suse.comjsuchome@suse.czgs@suse.demfilka@suse.comtgoettlicher@suse.demvidner@suse.czmvidner@suse.czjreidinger@suse.commvidner@suse.czmvidner@suse.czlocilka@suse.czlocilka@suse.czlocilka@suse.czjsrain@suse.czlslezak@suse.czjsrain@suse.czlslezak@suse.czvisnov@suse.demvidner@suse.czlslezak@suse.czlocilka@suse.czlocilka@suse.czlslezak@suse.czjsuchome@suse.czlslezak@suse.czlslezak@suse.czjsrain@suse.czmvidner@suse.czlslezak@suse.czlocilka@suse.czlslezak@suse.cztgoettlicher@suse.delslezak@suse.czlocilka@suse.czmvidner@suse.czlslezak@suse.czmvidner@suse.czlocilka@suse.czlocilka@suse.czjsrain@suse.czlslezak@suse.czlslezak@suse.czlslezak@suse.czlocilka@suse.cztgoettlicher@suse.delocilka@suse.czmvidner@suse.cztgoettlicher@suse.dejsrain@suse.czjsrain@suse.czaschnell@suse.delslezak@suse.czlslezak@suse.czlslezak@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czmzugec@suse.czlslezak@suse.czlslezak@suse.czlslezak@suse.czjsuchome@suse.czlslezak@suse.czmzugec@suse.czjsuchome@suse.czjsrain@suse.czlslezak@suse.czgs@suse.decmeng@novell.commzugec@suse.czjsuchome@suse.czlocilka@suse.czmvidner@suse.czjsuchome@suse.czjsrain@suse.czjuhliarik@suse.czlocilka@suse.czlocilka@suse.czlocilka@suse.czjsuchome@suse.czaschnell@suse.demzugec@suse.czkmachalkova@suse.czlslezak@suse.czjsrain@suse.czlslezak@suse.czjsrain@suse.czlocilka@suse.czkmachalkova@suse.czlslezak@suse.czlocilka@susue.czjsuchome@suse.czjsrain@suse.czmzugec@suse.czmzugec@suse.czlslezak@suse.czmzugec@suse.czmvidner@suse.czjsuchome@suse.czkmachalkova@suse.czmvidner@suse.czjsrain@suse.czjsuchome@suse.czlslezak@suse.czaschnell@suse.dejsrain@suse.czmvidner@suse.czlslezak@suse.czjsrain@suse.czjsrain@suse.czmzugec@suse.czjuhliarik@suse.czmvidner@suse.czaschnell@suse.dejsrain@suse.czlslezak@suse.czlslezak@suse.czjsrain@suse.czlslezak@suse.czlslezak@suse.czjreidinger@suse.czlslezak@suse.czjsrain@suse.czlslezak@suse.czlslezak@suse.czjsrain@suse.czug@suse.deaschnell@suse.dejsrain@suse.czjsuchome@suse.cz- Don't open the iSCSI port during the proposal - new patches from: https://github.com/kobliha/yast-yast2/commits/SLE-12-L3-916376- Correct service name for iSCSI Target Daemon (bsc#916376)- Fixed proposal to open fallback ports for services (bsc#916376)- Making SuSEFirewallProposal.propose_iscsi function public (bsc#916376)- Propose SuSEfirewal2 to fully initialize (e.g. open ports) already in the init phase to allow using iSCSI (bsc#916376)- change order in mode initialization so that selected Upgrade entry in boot menu does not override AutoUpgrade (bnc#897044) - 3.1.108- Checking nil for repository name. (bnc#896466) - 3.1.107- Added an extra help message when authentication against a registration server fails while refreshing repositories (bnc#895719) - 3.1.106- do not write /etc/sysconfig/kernel:INITRD_MODULES, it has been dropped (bnc#895084) - 3.1.105- Use a more flexible rubygem requirement syntax (bnc#895069) - 3.1.104- fix using changed root in netd agent so it can be used in installation (bnc#893965) - 3.1.103- Lazy-loading SuSEfirewall2 services - some new services can be added when Yast is already running, and the config has been read already (bnc#872960) - Preventing from showing incorrect service name or description if they are coming from TEMPLATE file (bnc#893583) - Fixed service file parsing - comments starting with more than one '#' characters were reported as unexpected input (just warning) - 3.1.102- Fixed checking whether SuSEfirewall2 package is selected or installed - in inst_finish, the package is already installed (bnc#892935) - 3.1.101- Fixed RPM description (bnc#888994) - 3.1.100- Untrusted repositories are disabled during installation to avoid asking for the key import over and over during the installation. - Fixed bnc#723019 and bnc#886572 - 3.1.99- Package.rb: Each call is polling which installation mode is active currently. So Mode.rb has not to take care about modules which are using Mode.rb. (Fixing current testcases) - 3.1.98- Fixed checking for SuSEfirewall2 package installed/selected for installation depending on the current stage/mode (bnc#887406) - 3.1.97- When changing installation mode in "Mode.rb" the mode in Package.rb has to be updated too. (bnc#888212) - 3.1.96- SuSEFirewall: Reading SuSEfirewall2 configuration whenever it's possible instead of simply skipping it in Stage.initial - package can be already available at the end of installation (bnc#887406) - 3.1.95- Added two new generic 'waiting' messages, needed in yast-country to fix bnc#888804 - 3.1.94- read products from system (not repository) also during live installation (bnc#889157) - 3.1.93- fixed a crash in package management when running in Qt UI with libproxy1-config-kde4 package installed (bnc#866692) - 3.1.92- Fixed setting the default target during installation - systemctl doesn't return any target properties while running in chroot so we have to guess the Id and AllowIsolate properties (bnc#889323) - 3.1.91- Fix timing of slideshow - now slides goes in cycle and all have equal time to display which improve user experience (bnc#885973) - 3.1.90- Fixed .proc.cmdline parsing to support more situations (bnc#889241) - 3.1.89- fix hidding cd statistics in text only mode (bnc#864507) - 3.1.88- Fixed checking for :active state of a systemd unit - it's :active already even if it's just being activated (bnc#884756) - 3.1.87- Added new ServicesProposal library to hold and export services enabled/disabled during installation (bnc#887688) - 3.1.86- Product.rb: do not stop initialization on solver errors (bnc#886588) - 3.1.85- Fixed Product.get_property by ensuring that we don't try to get property of an undefined product (bnc#886151) - 3.1.84- view_anymsg: remove escape sequences from input log file (bnc#879629) - 3.1.83- Fix SystemdTarget.all not to return nil in the collection - 3.1.82- add option to disable os probing for some products (bnc#884007) - 3.1.81- bnc#864619 - old network service is also disabled when switching to new one. - 3.1.80- Fixed error message for missing services (bnc#882609) - 3.1.79- bnc#878719 - improved handling of inactive network service - 3.1.78- make sure the total installation progress is always 100% (adjust the rounding issues when computing the subprogress percentages) (bnc#865585) - 3.1.77- bnc#864619 - stop wicked service(s) properly when switching network services - 3.1.76- Adjusted textdomain for OSRelease library - 3.1.75- Add Service.call method to make available all systemctl commands - 3.1.74- DonePackage callback: remove invalid UTF-8 characters to avoid crash (bnc#876459) - 3.1.73- Fixed network backend handling during upgrade - unified with installation (bnc#879594) - 3.1.72- Removed warning message when starting Yast in Qt instead of GTK and vice versa (bnc#861807) - 3.1.71- split too wide urls for accepting GnuGP key (bnc#870822) - 3.1.70- removed system verification check when yast module installs required packages (bnc#866256) - 3.1.69- save_y2logs: store also pbl.log from target system, if bootloader installation failed (bnc#879622) - 3.1.68- Added check for existence of /etc/modules.d/ directory in Kernel library, the directory is created when missing (bnc#879428) - 3.1.67- bnc#879399 - offer /var/log/boot.log in SysLog module for view - 3.1.66- Always using special InstallationProperties for systemd_unit while called in first stage (bnc#878560) - 3.1.65- Changed dialog label for updating/installing in SlideShow depending on the selected method (bnc#874995) - 3.1.64- added error handing for viewing log files (bnc#876895) - 3.1.63- avoid hiding release notes button when new wizard window is opened (bnc#876668) - 3.1.62- Product.rb - fixed base product detection (do not check the product status, always use the product from the initial repository during installation) (bnc#876836) - 3.1.61- Fix getting the status of sysvinit services (bnc#876144) - 3.1.60- save_y2logs: store target of symlinks as symlinks are useless - 3.1.59- fixed incorrect function name (bnc#876105) - 3.1.58- Fixed Product lazy loading in Update mode (bnc#875605) - 3.1.57- Add support for 'stop' and 'restart' of services in inst-sys (related to bnc #873057, bnc #873448) - 3.1.56- Fixed SlideShow table header to match the reality (bnc#874823) - 3.1.55- Product library changed to read data only from os-release and libzypp (bnc#873877), no more from content file - 3.1.54- Published Service.Active (used from Perl) - 3.1.53- Removed Product.patterns (replaced by Packages.default_patterns) (bnc#873923) - 3.1.52- rewrote URLRecode.pm to URLRecode.rb so that 'yast2 repositories' can run without Perl bindings - 3.1.51- Decreased number of logs coming from Hooks (to enhance logs readability) - 3.1.50- Add path to deprecation warnings (bnc#873973) - Fix enabling LSB services during installation (bnc#873929) - 3.1.49- ensure that dialog was closed even if exception is raised (bnc#873916) - save_y2logs: store versions of packages in inst-sys - 3.1.48- bnc#869661 - fixed internal error raised in inst_lan during update - 3.1.47- Changed Product.FindBaseProducts to throw an exception if no base products are found in installation (bnc#873458, bnc#873377) - 3.1.46- Changed OSRelease not to read content file instead of os-release file in inst-sys (bnc#873366) - Changed Product to use OSRelease.ReleaseInformation as :name instead of creating it from ReleaseName and ReleaseVersion, these are only used as fallback (bnc#873366) - 3.1.45- Prefering os-release file to content file (which is used only as a fallback now) both in installation and on a running system (bnc#871261) - 3.1.44- Enable wizard title on the left instead of on top during the installation (bnc#868859). - 3.1.43- adjusted Product.FindBaseProducts to be usable during installation (needed for fix of bnc#871158) - 3.1.42- added tabs for release notes into slide show dialog (bnc#871158) - 3.1.41- save_y2logs: save also log from perl-Bootloader (bnc#872486) - 3.1.40- Changed way of reading the product information: Reads it from /content file if it exists, then from /etc/os-release, then it throws exception if there is no other place to read (bnc#871261) - 3.1.39- fixed "uninitialized constant Yast2::HwDetection::SCR" error (bnc#871783), fixed testsuite - 3.1.38- add control option to enable sshd in installation (bnc#865056) - 3.1.37- Add info about text mode navigation in trees to general help (bnc #840672)- Fix failing tests - 3.1.36- Fix enabling services in inst-sys (bnc#870949) - 3.1.35- Add more systemd unit commands to SystemdService - 3.1.34- Don't change service name which might be frozen string (bnc#870803) - 3.1.33- Fix for template systemd units properties - 3.1.32- fixed popup_test - 3.1.31- fixed syntax error in Popup.Feedback() - 3.1.30- Deprecate and refactor Service module with SystemdService backend - Add support for /bin/service_start script in installation system that has no running systemd - 3.1.29- Throwing exception Yast::OSReleaseFileMissingError from OSRelease if /etc/os-release file is missing (bnc#869091) - 3.1.28- Refactored SUSEFirewallServices to throw exceptions when user or code tries to handle unknown services (bnc#867377) - Adjusted CWMFirewallInterfaces to handle the new exception and inform user about it (bnc#867377) - 3.1.27- added Popup.Feedback for displaying progress popup when running a block of code - 3.1.26- better check if chef-client is running (bnc#868483)- Add support for systemd target with SystemdTarget module- Check IPv4 and IPv6 for running network (bnc#868001) - 3.1.25- Adapt System.Status for latest systemctl (bnc#867378) - 3.1.24- Allow raising exceptions for not found systemd units; updates the expectations for bnc#853300 - 3.1.23- Add systemd service support; needed by fate#314946 - 3.1.22- Allow the Service module to configure services witout systemd unit files (bnc#864934) - 3.1.21- Add systemd socket support (bnc#853300) - 3.1.20- added memory detection code (gh#yast/yast-packager#33) - 3.1.19- Check for Chef outside in the yast2 shell script to catch modules not using CommandLine (bnc#803358) - 3.1.18- bnc#861078 - detected network service set properly when running in installation mode - 3.1.17- remove from wizard icons for title as proposed by Ken (fate#314695) - 3.1.16- fate#316768 - use wicked tools for network service restart / reload when running in installation mode - 3.1.15- make the package owner of /usr/share/YaST2/lib - 3.1.14- Upgrade mode in installer is newly set by Linuxrc (bnc#857847) - 3.1.13- Add fail and abort hooks for installation - 3.1.12- changed API for querying network configuration backend - 3.1.11- bnc#851769 - fixed reading bridge configuration - thanks to Waldemar Spitz - 3.1.10- add hook file #output method - 3.1.9- deprecate yast --install, --upgrade and --remove and use zypper instead. Suggest using zypper directly from command line. (FATE#316458) - 3.1.8- Update hooks - 3.1.7- Add hook into installation workflow - 3.1.6- Make sure the system ruby is used (BNC#845897) ( thanks to Marc Schütz ) - Add hooks module (FATE#315992) (vmoravec) - Fix rspec run on OS-12.3 - 3.1.5- PKGMGR_ACTION_AT_EXIT: change the default action to "summary", added combobox for changing the value- removed support for automatic 2nd stage (the 2nd stage has been dropped completely) (FATE#314695) - 3.1.4- Warn the user if Chef could overwrite her changes (bnc#803358).- Removed unused API from NetworkInterfaces- use correct binary prefix (see bnc#849276)- added dedicated "Show Release Notes" button support for NCurses (fate#314695)- Removed obsolete clients: password, remotechooser, remoteinstall (gh#yast/yast-yast2#100)- Removed checking for a fallback control file, that file is always outdated and cannot work for all products (gh#yast/yast-installation#86) - 3.1.3- Configuration of Kernel modules loaded on boot has been moved to /etc/modules-load.d/*.conf files. Adapted Kernel library internal handling (bnc#838185). - 3.1.2- bnc#846550 - deleting aliases works even for devices with name according new scheme- Added Linuxrc.keys (FATE#314982) - 3.1.1- Install binaries to /usr/sbin instead of /sbin to be consistent with rest of world and use common specs. Symlinks are kept for backward compatibility. - do not create sym links in sbin for zast or camel case yast- do not use *.spec.in template, use *.spec file with RPM macros instead - 3.1.0- allow nested ipv4 in ipv6 (BNC#828683) - 3.0.9- bnc#837517 - fixed misinterpreting IPv6 prefixes when converting to netmask - 3.0.8- use ruby builtin IP regexp and clean a bit code - 3.0.7- removed output redirection for /sbin/yast2, now it ends up in ~/.xsession-errors like for every other X program (BNC#766555) - 3.0.6- prevent accessing /etc/os-release during tests from Product.rb constructor - 3.0.5- replace SuSERelease with OSRelease, which uses /etc/os-release (bnc#833955,fate#316268) - 3.0.4- Changed some y2milestone into y2debug in GetTypeFrom* in NetworkInterfaces to decrease overfilling Yast log - 3.0.3- bnc#798620 - disabled starting firewall during second stage. It could cause deadlock in systemd initialization sequence. - 3.0.2- fixed navigation in yast2-cc without mouse (bnc#651350)- added support for handling product profiles (port of fate#310730) - 3.0.1- converted from YCP to Ruby by YCP Killer (https://github.com/yast/ycp-killer) - version 3.0.0- PackageSystem.ycp - do not initialize the target system in the first installation stage when running in instsys, there is no RPM DB in the RAM disk image (bnc#742420#c7)- added net device type detection based on sysfs - fixed type detection workflow - 2.24.5- fixed device type detection when commiting new device into NetworkInterfaces' cache. Fixes bnc#809053. - changes API for device type detection - incompatible to previous versions - 2.24.4- bnc#817797 - data imported into NetworkInterfaces cannot be overwritten by subsequent Read anymore - 2.24.3- show gpg key info in a term that allows copying the text (bnc#611456) - 2.24.2- updated the testsuite to make the transition to Ruby easier- Reverted resetting disabled steps (bnc#813072) - 2.24.1- do not propose desktop kernel for minimal installation (bnc#819335) - 2.24.0- handle GPG keys in AutoUpgrade the same as in AutoYaST (bnc#820166) - 2.23.29- bnc#819327 - InfiniBand device is not available on s390 arch. - 2.23.28- accept any version of libyui - 2.23.27- Fixing resetting steps in installation (bnc#813072) - 2.23.26- Added functionality for checking network entry with optional netmask in IP or CIDR format (bnc#800592). - Using new IP::CheckNetwork in Firewall (bnc#800592). - ValidNetwork definition moved to IP module. - 2.23.25- Re-enabling all disabled items (steps, proposals) if stagemode has changed (bnc#813072) - 2.23.24- correct function signature for Pkg::CallbackErrorScanDb() callback- testsuite adapted to previous change (new code in Enable call)- applied lnussel's patch: Don't use Info function to check enable state (bnc#807507) - 2.23.23- Changed to use network.service alias link, that is installed by the NetworkManager.service while "systemctl enable" and obsoletes the NETWORKMANAGER=yes/no variable in /etc/sysconfig/network/config (bnc#764055,bnc#764336,bnc#798348, by mt@suse.com) - Requires sysconfig >= 0.80.0 - 2.23.22- added CommandLine::PrintTable, String::Repeat and String::SuperPad - 2.23.21- added perl-XML-XPath dependency (needed by RegistrationStatus.pm) - 2.23.20- Extended checking for service in Service module by also checking in /etc/init.d as a fallback (bnc#795929 comment#20). - 2.23.19- Testcase for Service module moved here from yast2-iscsi-client- Runlevel definitions (targets) are now in /usr/lib/systemd/system (bnc#795929) - Checking for systemd scripts in more directories (bnc#795929) - 2.23.18- SuSEfirewall2 has merged *_init and *_setup services into one systemd service (bnc#795929). - 2.23.17- fixed path for get_kernel_version (bnc#794084) - 2.23.16- Adapted Service module to use systemd directly instead of via init.d (FATE #312568) - 2.23.15- allow some characters in URL password field (bnc#786757)- fixed bnc#791294: frame for firewall settings - 2.23.14- Added sysconfig variables (solver options) PKGMGR_VERIFY_SYSTEM, PKGMGR_AUTO_CHECK, PKGMGR_REEVALUATE_RECOMMENDED- Dropped obsolete Runlevel YCP module- move RegistrationStatus.pm from wagon to yast2 (fate#312712) - new version for proper package dependencies in wagon - 2.23.13- confirmed license GPL v2 - 2.23.12- move Log Viewer client here from dropped repair module (bnc#787070) - 2.23.11- Kernel::InformAboutKernelChange - always return boolean - fixed build dependencies - 2.23.10- use Kernel::InformAboutKernelChange after package installation - do not read SuSEconfig log - 2.23.9- added Kernel::InformAboutKernelChange - replacement for only non-SuSEconfig part of inst_suseconfig - 2.23.8- added Syslog module, simple API to write into system log - 2.23.7- removed calls to /sbin/SuSEconfig, packages should care of updating configurations on their own- extended support for IPv6 - 2.23.6- Fixed detection whether firewall is running (BNC #779455) and unified with starting and stopping the service via Service API.- added San Marino to the list of countries (bnc#780639) - 2.23.5- fix bnc#776567 YaST doesn't support input method - 2.23.4- Fixed a typo (BNC #766703) - Added support for iSCSI Target into the Firewall proposal (BNC #766300)- fixed checking for systemd status (bnc#774799) - 2.23.3- added color schemes "highcontrast" and "inverted" to description of Y2NCURSES_COLOR_THEME in sysconfig.yast2- search for UI plugins at new and old location - 2.23.2- removed ShellSafeWrite as it is not needed anymore with new ag_ini - bnc#750325 - 2.23.0- merged proofed texts - 2.22.6- Revert the change in FileUtils::Exists() (change is not needed here but will cause failure of testsuites) - 2.22.5- bnc#694582 - added @ as it is allowed in authority part of URI. - improve Exists(), don't return 'true' if SCR::Read() returned nil - fixed testsuite for WorkFlow.ycp - corrupted due to above Exists() fix - added String::YesNo - 2.22.4- Fixed typo- Internet test: fail early if NetworkManager has crashed (bnc#739390). - 2.22.3- Relicensed ConfigHistory from GPL-2.0 to GPL-2.0+ to match the rest of the package (bnc#728950). - 2.22.2- forbid appending to IPADDR additional suffix if there is already one. Original name have preference (bnc#735109).- create user-unreadable ifcfg files without a race (bnc#713661, CVE-2011-3177) - 2.22.1- Moved NetworkStorage from yast2.rpm to yast2-network.rpm (bnc#726057) - 2.22.0- Unified starting, stopping and checking for firewall status (bnc#727445) - 2.21.25- Added new function String::ReplaceWith that is a replacement for often used mergestring(splitstring(...))- Fixed script for generating translations for firewall services defined by other packages - Regenerated translations for firewall services defined by other packages (bnc#722877)- removed list of controller modules not to be included in ititrd (bnc#719696) - 2.21.24- Service::RunInitScriptWithTimeOut() - fixed memory leak, release the process info at the end- simplify usage of save_y2logs (bnc#673990)- use Pkg::ResolvableProperties() instead of obsoleted Pkg::TargetProducts() - removed obsoleted Pkg::CallbackAcceptNonTrustedGpgKey() and the related dialog - 2.21.23- Added UIHelper library module - contains useful UI helpers from now obsolete Wizard_hw - Drop Wizard_hw - Added Wizard::SetDesktopTitleAndIcon - Added Desktop::ParseSingleDesktopFile - 2.21.22- Added the interface name patterns emN, pN and pNpM. It fixes recognizing them as configured (bnc#713644) and unbreaks the proposed bridged configuration (bnc#713048). - 2.21.21- .etc.sysctl_conf agent - support also ';' comment character - 2.21.20- Fixed SuSEfirewall2 SCR agent to understand single-quoted and double-quoted, single and multi-line variables and also single-line variables without any quotes (bnc#716013). - 2.21.19- Using ButtonBox in Wizard where possible (bnc#571939)- adapted to systemd (bnc#664548) - 2.21.18- added agent for /etc/sysctl.conf (fate#312343) - 2.21.17- GPG.ycp - fixed initialization after creating a new GPG key, fixed creating a GPG key in KDE desktop or after logging via plain "su" (gpg agent problem) (bnc#715242)- added new Systemd.ycp module for handling systemd configuration, (needed for bnc#707418) - 2.21.16- enhanced the help command-line parameters (bnc#712271) - 2.21.15- Update Deleted and OriginalDevices in NetworkInterfaces::Write. Thanks to Justus Winter - 2.21.14- fixed trusting a GPG key (wrong id check) (bnc#713068) - added String::FindMountPoint() function (moved from yast2-wagon to share it with other modules) - 2.21.13- Fixed handling of FW_SERVICES_ACCEPT_* in SuSEFirewall modules to understand flags as the fifth parameter (bnc#712670) - Fixed SuSEfirewall2 SCR agent to parse the sysconfig file properly (bnc#712670) - 2.21.12- improved GPG key import dialog: changed "Import" button to "Trust" (bnc#694213), display expiration warning for expired keys, better layout for displaying GPG key properties, hide additional help text in ncurses UI (so the GPG key properties are displayed completely) - 2.21.11- fixed .desktop file (bnc #681249)- use term "Software manager" instead of "Package manager" (bnc#585679) - 2.21.10- Fixed Get/SetBroadcastAllowedPorts in SuSEFirewall to keep user-entered values instead of translating them magically into list of ports (bnc#694782). - 2.21.9- Fixed NetworkInterfaces::GetTypeFromIfcfg to recognize bridges (bnc#704999). - 2.21.8- command line - properly display multiline help texts (bnc#708553) - 2.21.7- FCoE detection in NetworkStorage::isDiskOnNetwork (bnc#677251, FATE#306855). - Added NetworkInterfaces::GetTypeFromIfcfg which knows ETHERDEVICE=>vlan (FATE#311380). - 2.21.6- Removed obsoleted X-KDE-SubstituteUID from desktop files (bnc#540627)- Fixed SuSEfirewall2 config library: By default any unassigned network interface is automatically assigned to the external firewall zone (bnc#547309). - Fixed CWM library for opening ports in firewall not to list any empty strings returned by network module, just interface names (bnc#547309). - 2.21.5- fixed typo (bnc#702662)- Suppress decimal zeroes for kB sizes (e.g. display "743 kB" instead of "743.00 kB") (bnc#495045) - 2.21.4- read GPG keys in UTF-8 locale to properly read non-ASCII characters, UTF-8 characters caused SLMS webyast module crashing (bnc#696312) - 2.21.3- Fixed abort callback to abort installation completely (bnc#673629) - 2.21.2- Fixed group desktop files by adding Exec=/sbin/yast2 (BNC#470482)- Fixed crushed progress bar (bnc #675443) - Version bump - 2.21.1- Fixed regexp in Custom broadcast definition in SuSEFirewallExpertRules (BNC #676972). - 2.20.15- Don't assume YaST has crashed (and scare the user with a pop-up) simply if a YCP script returns false (bnc#645434). - 2.20.14- Fixed dependencies (bnc #667938) - 2.20.13- do not define splash screen resolution to mkinitrd if boot splash is not installed (bnc#670225) - 2.20.12- adaptations for unattended migration (fate#310481) - 2.20.11- call snapper from yast2 script- check PackageKit status, suggest to quit the daemon if it is running (bnc#659522) - 2.20.10- fixed VLAN config type detection (wrong regexp) - 2.20.9- don't abort when package checksum verification failes, ask to download the file again (bnc#657608) - 2.20.8- ifcfg-ethX.Y style config files for VLAN(fate#309240) - 2.20.7- fate#306855: FCoE boot support - 2.20.6- save log file into home directory by default (bnc#653601) - 2.20.5- FileChanges: fixed testsuite- yast2 added bind-utils dependency (bnc#651893) - 2.20.4- FileChanges: test rpm command exit value- PackageCallbacks: removed the retry/abort/skip dialog from DoneProvide callback - the user is asked via MediaChange callback, don't ask twice when aborting. - 2.20.3- updated to match the changed StartPackage callback signature - 2.20.2- don't display extra error popup when a download fails, the error is reported later via MediaChange callback anyway (bnc#625987) - 2.20.1- open LongError popup instead of Error if the message is too long (bnc#611596)- just log problemDeltaDownload callbacks - libzypp automatically tries full rpm if patch/delta cannot be downloaded, displaying error popup breaks unattended installation (bnc#377569) - 2.20.0- yast2 bash completion - show all yast modules (bnc#621848) - thanks to Andrea Florio- ag_anyxml: do not die on broken XML (bnc#600928) - 2.19.13- fixed typo (bnc#594384)- URLRecode.pm - fixed "deprecated defined(%hash)" warning (bnc#596920) - 2.19.12- yast2 start script: don't start YaST on console in UTF-8 mode by default and don't fix settings, but respect and trust the locale ('testutf8' is removed, see bnc#556555 and bnc#436378). - 2.19.11- Add a new category High Availability (bnc #575787)- L3: autoinstallation with manual setup (bnc#568653) - 2.19.10- SERVICES.pm moved to webyast-services-ws (bnc#587876) - 2.19.9- Added special comments for translators to RTL languages (BNC #584466).- Mode::test(): check getenv instead of the UI so that it works also in WebYaST (bnc#243624#c13). - 2.19.8- SERVICES.pm: added support for enabling/disabling service - 2.19.7- do not save unmodified interfaces (fate#308978)- added fix for deleting splash from initrd (bnc#292013)- Fixed SuSEFirewall::ActivateConfiguration to return a boolean value in all scenarios (BNC #577932).- Showing also zone of interface for 'Open Port in Firewall' details (BNC #483455). - 2.19.6- Fixed generating unique step IDs for Wizard too keep the same durign one YaST run (BNC #575092).- SERVICES.pm: read descriptions (bnc#570298); get single service status from the Read function (bnc#570968) - 2.19.5- extended Report and Popup module (needed for fate #304500) - 2.19.4- NetworkStorage: adapt functions needed for iBFT (bnc#551380) - 2.19.3- Added Recommends: xdg-utils. xdg-su is now used in .desktop files of root-only YaST modules (bnc#540627) - 2.19.2- GPG.ycp - run gpg in C locale (bnc#544680) - GPG.ycp - return success/error result in GPG::Init() and GPG::CreateKey() functions (bnc#544682)- updated start-up script to behave correctly if QT CC is to be used without QT back-end (bnc#545331)- added missing UI::SetProductName() call - display the proper product name in help texts (using &product; macro) (bnc#535483) - 2.19.1- translate module names properly in NCurses CC (bnc#553644)- Fixed access rights for /etc/install.inf (bnc #500124)- Fixed striping trailing \n from Hostname::CurrentHostname() (bnc#553213) - 2.19.0- PackageLock - use "Software Management" term consistently (bnc#558625)- REGISTERPRODUCT from content file moved to control file to globals->require_registration (FATE #305578) - Extended SuSEFirewallServices module (FATE #306804)- SERVICES.pm: use ruby-bindings to read yml file (bnc#551276)- issue an error message instead of trying to start YaST in NCurses without a terminal available (bnc#502688)- NetworkPopup: display link state (FaTE#307166) - 2.18.28- Internet.ycp: skip interface status test in case of NM (bnc#535837) - 2.18.27- added explicit gpg2 Requires (bnc#544683)- separation of netmask and prefix validation in Netmask module - 2.18.26- YaST would not start from the GNOME menu (Unknown option -S) bnc#537470. - 2.18.25- package new YaPI file SERVICES.pm (fate #306696) - 2.18.24- ProductControl: support for disabling AC sub-items and sub-proposals (related to FaTE #303859 and bnc#534862) - 2.18.23- save_y2logs: print usage to stderr (bnc#522842). This is to notify users who use "$0 > l.tgz" instead of "$0 l.tgz"- select kernel-desktop by default if exists - 2.18.22- Wizard.ycp: use Fancy UI for 1024x576 screen size (fate#306298) - 2.18.21- Call UI::RecalcLayout() after changing push button label (bnc#510282) - Improved automatic retry after download failure (more attepts, logarithmic back-off, retry download in more cases) (bnc#119813) - 2.18.20- added GetIntegerFeature() and SetIntegerFeature() to ProductFeatures module - 2.18.19- removed cyclic dependency between YCP modules preventing from correct build - 2.18.18- Using autodocs-ycp.ami, which contains a fix for automake 1.11.- use float::tolstring() function in String::FormatSize() and String::FormatSizeWithPrecision() to use the current locale decimal separator (bnc#372671)- Getting hostname info from /etc/HOSTNAME only if the file exists.- prefer Gtk front-end when running xfce (bnc#509121)- new variable Internet::test to store status of test (bnc#506721) - 2.18.17- added fix for problem with parsing command line (bnc#462276)- yast2-completion.sh: removed <(process substitution) so that it works even with POSIXLY_CORRECT=1 (bnc#504844).- moved .proc.mounts agent from yast2-installation to yast2 (bnc [#504429])- remove all passwords from install.inf in save_y2log (bnc#500130)- media change popup - display also the URL in the short summary (bnc#439069) - 2.18.15- URL.ycp - escape also non-ASCII characters in URL, added URLRecode.pm module (bnc#446395) - URL.ycp - fixed processing of smb:// URLs (bnc#495109)- at start-up, check that /sys, /proc and /dev are not empty and prevent YaST from start if they are (bnc#450643)- PackageSystem.ycp - check nil result of Pkg::PkgCommit() call which indicates an error (bnc#157551)- PackageCallbacks.ycp - don't read non existing y2logRPM file (bnc#456446)- Add to CWM widget for unified table CWMTable - 2.18.14- Do not display "No package source" popup, just log a warning (bnc#485587)- save_y2logs additionally collects /var/log/zypper.log and /var/log/pk_backend_zypp- Fixed layout of the authentication popup- moved functions RunCommandWithTimeout() and RunDumbTimeout() from SourceManager.ycp to Misc.ycp- fixed typo (bnc #483915) - report when GTK UI is wanted but not installed (bnc #472448)- docu for Popup::ShowTextTimed fixed- added Event.ycp to easy use of UI events - 2.18.13- fixed textdomain- GPG.ycp: --batch option is needed for hiding password popup/bin/shyast2-mail-aliasesyast2-lib-sequenceryast2-lib-wizardyast2-lib-wizard-develyast2-trans-wizardy2t_menuyast2-trans-menusheep18 1432628856  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~3.1.108-1.16.8535.7.PTF.9163763.1.108-1.16.8535.7.PTF.9163763.1.108-1.16.8535.7.PTF.916376 2.14.0   YaST2XVersionyast2-completion.shyastyast2bincheck-all-syntaxyast2-funcsag_anyxmlag_contentag_cronag_freespaceag_initscriptsag_netdag_showexportsag_ttysave_y2logsyastyast2clientsmenu.rbother_tools_warning.rbview_anymsg.rbdatacountry.ycpcountry_long.ycpimagesincludehwinfoclassnames.rbpackagescommon.rbwizardsequencer.rblibyast2hw_detection.rbsystemctl.rbsystemd_unit.rblocalemodulesALog.rbAddress.rbArch.rbAsciiFile.rbAssert.rbAutoinstData.rbCWM.rbCWMFirewallInterfaces.rbCWMServiceStart.rbCWMTab.rbCWMTable.rbCWMTsigKeys.rbCall.rbCommandLine.rbConfigHistory.rbConfirm.rbContextMenu.rbCrash.rbCron.rbCustomDialogs.rbDebugHooks.rbDesktop.rbDialogTree.rbDirectory.rbDistro.rbDnsServerAPI.pmDontShowAgain.rbEncoding.rbEvent.rbFileChanges.rbFileUtils.rbGPG.rbGPGWidgets.rbGetInstArgs.rbHTML.rbHWConfig.rbHooks.rbHostname.rbHotplug.rbHwStatus.rbIP.rbIcon.rbInitrd.rbInstError.rbInstExtensionImage.rbInstallation.rbInteger.rbInternet.rbKernel.rbLabel.rbLinuxrc.rbLogView.rbLogViewCore.rbMailAliases.rbMailTable.pmMailTableInclude.pmMap.rbMessage.rbMisc.rbMode.rbModuleLoading.rbModulesConf.rbNetmask.rbNetworkConfig.rbNetworkInterfaces.rbNetworkPopup.rbNetworkService.rbOSRelease.rbPackage.rbPackageAI.rbPackageCallbacks.rbPackageCallbacksInit.rbPackageKit.rbPackageLock.rbPackageSystem.rbPackagesProposal.rbPackagesUI.rbPopup.rbPortAliases.rbPortRanges.rbProduct.rbProductControl.rbProductFeatures.rbProductProfile.rbProgress.rbPunycode.rbRegistrationStatus.pmReport.rbRichText.rbSLPAPI.pmSequencer.rbService.rbServicesProposal.rbSignatureCheckCallbacks.rbSignatureCheckDialogs.rbSlideShow.rbSlides.rbStage.rbString.rbSuSEFirewall.rbSuSEFirewallExpertRules.rbSuSEFirewallProposal.rbSuSEFirewallServices.rbSummary.rbSyslog.rbSystemd.rbTablePopup.rbTypeRepository.rbUIHelper.rbURL.rbURLRecode.rbValueBrowser.rbWizard.rbWizardHW.rbWorkflowManager.rbXML.rbXVersion.rbsystemd_service.rbsystemd_socket.rbsystemd_target.rbschemaautoyastrnccontrolrncscrconfanyxml.scrboot_vmlinuz_version.scrcfg_apache.scrcfg_apache2.scrcfg_cron.scrcfg_displaymanager.scrcfg_features.scrcfg_hardware.scrcfg_hotplug.scrcfg_kernel.scrcfg_policykit.scrcfg_security.scrcfg_services.scrcfg_suseconfig.scrcfg_sysctl.scrcfg_xversion.scrcfg_yast2.scrcfg_ypserv.scrcontent.scrcontentfile.scrcron.scretc_fstab.scretc_inetd.scretc_inittab.scretc_login_defs.scretc_ssh_sshd_config.scretc_sysctl_conf.scretc_xinetd.scrinitscripts.scrnet_showexports.scrnetwork.scrproc_cmdline.scrproc_cpuinfo.scrproc_meminfo.scrproc_mounts.scrrun_ifconfig.scrsysconfig_SuSEfirewall2.scrsystem_freespace.scrtty.scryast2_desktop.scryast2_groups.scrYaST2groupshardware.desktophigh_availability.desktopmisc.desktopnetwork_devices.desktopnetwork_services.desktopsecurity.desktopsoftware.desktopsupport.desktopsystem.desktopmessages.desktopyast2COPYINGyast.8.gzyast2.8.gzsysconfig.yast2YaST2hooksREADME.md/etc//etc/YaST2//etc/bash_completion.d//sbin//usr/lib/YaST2//usr/lib/YaST2/bin//usr/lib/YaST2/servers_non_y2//usr/sbin//usr/share/YaST2//usr/share/YaST2/clients//usr/share/YaST2/data//usr/share/YaST2/include//usr/share/YaST2/include/hwinfo//usr/share/YaST2/include/packages//usr/share/YaST2/include/wizard//usr/share/YaST2/lib//usr/share/YaST2/lib/yast2//usr/share/YaST2/modules//usr/share/YaST2/schema//usr/share/YaST2/schema/autoyast//usr/share/YaST2/schema/control//usr/share/YaST2/scrconf//usr/share/applications//usr/share/applications/YaST2//usr/share/applications/YaST2/groups//usr/share/doc/packages//usr/share/doc/packages/yast2//usr/share/man/man8//var/adm/fillup-templates//var/lib//var/lib/YaST2//var/lib/YaST2/hooks/-fmessage-length=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -gobs://build.suse.de/PTF:8535/SUSE_Updates_SLE-SERVER_12_x86_64/72fce2df35864d0ab0ec4c0ff35067ed-yast2.SUSE_SLE-12_GAcpiolzma5x86_64-suse-linux directoryASCII textBourne-Again shell script, ASCII text executablea /usr/bin/perl -w script, ASCII text executablePerl script, ASCII text executableRuby module source, ASCII textPerl5 module source textRuby module source, UTF-8 Unicode textPascal source, ASCII texttroff or preprocessor input, ASCII text (gzip compressed data, max compression, from Unix)  "$&RRRRRRRRRRRP P PPPPPPPPPPPPPPPPPPPPPPPPP PP [讅L,LBPxdg-utils?] crt:bLL)ZL+=8)Z$ z_RwæEydFB_3tAfcY:K< ~4 C*Y6Sթ"WiH˼Nwe3@t6Q6)8>ڵqWζ?8Sh>q6ik=cNcdro0QxS%⧢`JBqEh$~2#;1qY?}ByƷB FPl _x%ՠJ)eEb? ] i'{1v] {O7 .qC t~Cy?t=-N #ᶙu6 uEyK>ut&rXV#@Nڃv&ߦoL' ;٠c7'fV-gt ר6@i}tհUj!ϲX;*]L)޳T5!O{c<n`p5%QZ|=HeTNOC=FN\f)mc2B{3,* 7ֶUdlilKLD˫EudzV9 {=W[*ޔw~4}fhк|nML޽Ѣ~Hc9V:| <*gc/?H?v!瀔eNmBc|$lՌz\NBZ ej*z/ X-K3RoBex򗚤CrA@5'%峰:p{65Uw18_*Z@$u ߿dh dѠV[9$hE復f7{.G5rҶq,J=+{8FC^ZB{R% ٔl򸠬w8dmA)|n`#3aIH[_ _Zq"bZ}eySGUF7=ixz$rqE{XOwkfimxP1_3~x3]Z?р+9;j-kcH*qw4(37:|~.~v~6k~W;uUGݍsN(-{# 7|J#27\[Jk5bI"/Fxw`q$soJfNEGQѕԔ>9$ܨ}!1_*)'5R%_jkB&.FF@r6呩e'0(U_ԵLLubKJZQemAR#}pOS&LnyDuѣP_VHJ1?t4Q.@q Ikm$(zǨk5>29L+ -AA!h`vM1 n.#>e>0dmqJ(эh܅Z-VhSz.HTf1Tn*h'x=E:Ed ;pǯvj50FV'i91}Ju 3?d]sl"n#Cm'T+klNTebE\7Y$/*1ӵ~`102Ff,JkFzJr>KgqgbCs 5ĶmL딠tVT(`-׊HϭkԮǛZ$2;\g U蓑HGF*C9wjy1|&UvXo6ULeY:S~Mn9":6Kf2I~?CE?(nhuTi5M̲=I[E t>ZZs!31{X|QRU 8|~bp>py١G6f+'zi1 rf{ '>5si[jbTB!c'I"T ,{ﭸ֔m}T8`9^﻾$`h1y{#pbM'Q`B EJ .ϙooMc.1\`M R`:GRm닉5 pDJhl1 =[)j:o1^3irnlZ~ WC_UlPPšctRmW>k8౵4EZT AMw bS%zN{W5:$$]Gws^?ttzOk}߶ a+/S'8g_-}CCU$tP&fj} k'_el<-*Za ?fq/DZC #0;70L;_YyuI^~7x )F%ta>`LE!e)7iEO -C K][Q5c$F>Gk~Q(E==1wκL}9oG+iuQ;y ^}\?1$ԵmW0(M-T]`*hp;,떑4#*P& [a)o 90w>H hd7euA%8{O <)qL'!mY} \WnA^*"BQz /-T|okßըW1A䯥4,O3l^XKhG``.rWX77;֭D %>8 G}md9Tڅev15u zЕ_@tU1 S:.$;MшYnU;|(dTv$6oAޫ2\ʢO^~;[h^a6#€5E+i1F0M="cMܜĥ|G.ȳuFP8=bpj2 ~;4_]Q[{Ë>G9pz2KhR~Z .{Co"lfi񑂅3skw'#26E_?i#*xsȽe,kPrjJW{̒$ubRm¼+|]!K4F_ \rt 6=ShCxS/ MI36XJvmy;2cWeNm.1=4 *fo۔Y˅nc I?Q 9 FEkrRP PM53x3})(| #9MһD< y`/1ȁo` F9,uZv|w7Cvw$SRGI6]?{l J(U ̺6.Ljح)`ZE6EN~K:KR=B;vLƁ`9IiTA"PEHe}gў(_f|_( 'ywQ.ioQK Mg3Q_9 粦 lZ5T~\N׆Y]*{_MƁ ;^Umgln $%mā4{|Nps!M68ACetf(sO\vҢ36xaIHʅi=pl;:%$olH&^@r1?{bB>M&(w]NO ͽVP?ad=,4e(wz̏lU 1|P/4<Œk<kfLguXx =KJ"GRz3m&zAa#™EԐG*= &<%re]-ȅwnA|Fo_< f!T+4Rf4C~;M7`ܸ.*.U:qc^r2GkoA4=*-d CO`Gvte sNHidYQާbz@✃.Zh5Ddz4G Q-rďlyDJ `، g66'HyuґByDlYōz&/{ #U8?gӚih"]BݎipvucHm2)U8- Bu^'n.&|)6>Z>)6fvѝadzuLßT3oZ:Hg\%&W7sڟ$MH崚N\Hb4 L$, xHP Xh(JjUk`w9 t֝$ؕ#ICE4 *+AǬ F1et3;&*$sZ|2 |K- 4b) 3}?iojxߧ#gK~F q,I9Jwfз놉N]Uq8HOT.<4o}Ĉe|Tr"c ^CQl;&5j2?cp }خxD=+n/P}}QqQъoFy{D>QTNqM##%|POlvEPA8\lIԵzWA3sHQ)H R 3sBP򷫔X_i?};8O9C<̝(}WLFf.tj~v8ctXNQp&)&X6*׾= $Z!ji/hIr#l2];D[V՞ | & N(c$ aX[|-@ďywei)Ț"b1QR~.RZOdR0 r?]@E\N AJ ӕg oXWj/R3kJ_7O\(Jw)ioGĭ.tm/_]aLUESJ0{? WS.jk |Kz EP혆>k FeXRUJS#^6LT`]!֥_͏Iq~U* s- 'FN}t7,l}D hGM:s 4:DC?~izٸp@0Rw$;K{ `$\E ٴݮ03d d;-;Q :?_y/af_2@ypL;/W ijT Cgwk>ȥW` tBoEW_:*<mO 2k茭aW?v@d#4 [pt#"x/ah9٢!QR:Xy%D\ƒTRbWm_TZ6DE/A@~@0H/(]|?5pU1N.Ny5R $ r˙z w7LK8GM.9`Q :>_!%:x~w.˽o4%AqN p#w@.5퇃JB<^7Uk>N\6OEg9|񙽇OxYXf,o3݀X?P6)%XqШaV^'Ђw5dY/M~E[vϪpMWŰ,<-'jLV0U׀:\m<~P['꫙Nmک4B} 5/R^Tcwb."ڃPon n# gUBpMB%(|lc !Ʒqbr@'^_<2y ieؿ ^T14wBJRAN_>!\AXcz#Ai*n,z-AuAR__~Es.h>Y h}/7 ?ra#'R cߟƯW=nlw-Iْ`5:_{vCDr|:?;4[˵ \?iSMhL$aLJ9a U ҜuZGS~P߸hp[ΕZ@e9jʢ%)OG͛l'ST0(c?{g^7w"2DvkVIn}7pB+@R4Ϣ|e=-K98\&`NBmLwB`VfVLX!vAT d°PzuF+o5Q7UYM6Ϫ;QLgηGqBa]#SbG9;7ǤQ E^$0~҇QA M䨟qDȢ\ <]=wU3}l¾%. FbEXt'Ԫc2m2EVڊ;')(+ Zئ8#K!RΡ!tz̒A;gb/G[4<_ APN2A&r"\KJ[lٛkŸ@0XIG K:_x& ]%o=x@Y`ߥd00=e;_>^A ݊1JF׀v8;Cij"csķxxiD`][0TZt1E&[{#6"mϛLog-\_ը[$-Ǻfy$:&|˥d͟L*f=EvS%۸7} ihssGz$*d f5DY7 v~+P{,jt\x;Uj/)K$!W&tF y}l mh\| *D:"uЇ;]PG[kpQv683JIY}ӎ+yY61M%Ci^A5 "[D/K$`^QwxNFi@B<q:M#DEИ}H/6;np:qd*<Ցx7g}SMm_NTD3][6w*` ->鰖"rT$IGxa?+~W[֭9;]mg^xG88JuL \t3屽Iʳj "l?V̺1Wc0ZnexIcV],]|wTRE@?\Xqynq<(dDEpQͣõ͓˳b:jSA ӎ(GS|;A7:U43$?*x!4͚=zMLGvBA -WW,CU!G>ЎBd^s%8$>Cy!u ,INkL=NhTKڮd_b3v~ (8TBqy"&gj 8+Z߱%qg Hc:~,ڋN\Q;y0UKEqx:RDV0qϯ2 ~[@d*4V ï? |azH s?= /S6K˥-TsFd 8C*RFW1'H`Duɜ4Fw1:ѻtzc[}Зam|bqV+c#vS?(!{sw1 oڵ "r* 9Sn0#&5 J|ͭQ\:bwMg/줄Acvw>|Ӽb#P"!XWYdLc]mrִsda jGO7.X8ܘ3۹N[ ca]YT`兿;eCڝKT_g(!4w2S?>N?vV!2Q`j㋪(kQMi XkmU[ H8f].y]'bF#R`tL?7_̎=(} sLb^':퓇, xI;C& 2H/3>_/M L@rZ^ռ.HC>wVDVIcKдfgv%1$88E2#}iy!~c@n8Xy̡R.(IVgm\74]Filɀ1iasLb~sWrޚAې"̕1+gxɗ\"F6b%|u>5R/xq. 29WA:VTE_ bdPa2^@#Q%2.̴a#LCՆ@;M߯Yhqo?-h6ǜt6}\}ڐfwKx,_~6Va|X,PLeX1L+glNh)cNqޚ{C1-taME8.NL(dc6@gZĥIV!)YfDu)?oZÍϕKFShL8rEWS10I)դsx Fѐ. F3xX=F">cu|ۀzԋ@ngel7q QPC@psPnO5Qo hQ!#G;xm.Bb `Z' &0*UP-cZ"&[U7NV4Ʉ =Ae!74 Ҝ2գXzJH4սZY*-Po M|r߸I pX6EUꛓeE<ت(#a=;ą7w\/H WK ] yJALTLq?? _fQΕ{EF,Ha7ls^b5+sVLl={L(Et]B[ˎ~vi}  )Nq^cؚ$:1nrDkQ= ;\cS5Ad#dh#~r $_=sש/Չy#6s F&A(RNuڬ#&V)x?c=`+׍&!k8`ےCG$!qBG0(}Q߷}lzyz*:6E;m/9wy kQtm]^CLnA$Deӕbf*"pBXc@9Jfͷyʺ&]`_sUMnX3f|?7|ۈ6_,=," (~iTemR#56Py[ͽ):9޼d֣~BAe#QzVNz utZ oi$"Z*!q'GgW׆)Xq_wg'ja1(KI.܃bzSm{l=ӍMnzVqKP.P %R^2oX'p.>[A~R)RwE_lk՝thLp9& LO|Iԫ3;r!5N; h`z߀p jXcwK޲:3m}Hkx1JS fQ\,jL tuSMXcܶ7c1V.Jŧ:;4x Tr9{ѻ+HF!I\Ku@|xi,Vlq)WƽZ+/n#K՟1K%Ty[K$ uXAH]qmpZn`<<fңJASOwVo6) 3[]Ifhk%qkASެKXF@tQ89D}⡚0a6o!خU<4oїy7ؓJ(>өk %ZsG3 rڵ+pL׸u5sۈM+>F pb|r3II;J:7J"۬ I5/6hLfyS`z#^5"Щnd.|~+bE/5c~`]9 f4;cw* kEDhn@.nA#q@+wFNJڙ'":g9ޏ2A+;)eU y¨#WZi~IPtxQ),HR,~vO稐KCcQF:) fYró_-n]^Te7'{&L=Ћu52lH:m S`a8jU'E0սa3=/pF,qxŀcQ[\ur42a8"7 ] `)z/4ϣBA+A&AϞsPe:\k9VĴLI5"RvtlJqAmN;8[S\Wh]zwũpJ6Dը?Plp<}bK;IႲ Ǫ#t?)@q-7xg=4x <1 0b}j%+çq֖_t\Bһ)).'F.{|'=gԛElJTf%o˲6Ƈ)J-f*>j{vďg2M+ 1AZYZLȒtŃ"T Yޭ/3zB3NU%2WDA)cߝmP.b.Qlp)* xWK& ͼNͰYuKv: 7C0둒ΘZ}7kAӅv`01݇TOϽvP.>zbNP0Y{^EK\t<1w+:&Act lD;rp!tzDyBP*C-!8ņ*OXW{L^0$ʵL9Q0.I691q2Uc,w@ vO&>Dt1ض038wM'Fˎ QТ(- :L6걎O ~dQ;oSso50~LLR ajBƍcV{B^Ǯ[[foHSvS,+7'J,Fv8uJfQy\Аe=,enbIOId*sȚW_+3lwaQ!]!3ao1Z]+XSHLZȤ l C 0GFvA=-OuSEW2 yǏ,zMiաAٯi[㉒AWG 2vǓqh ~G$0{{|\pKQJ@tUb6K&A5j]wco6=SѬJ[8GJ@éuC("E])lwJ>uX;F$]{W0tObXKC&C-K~>$s|)r[=y]?qnHe,0f YҿLK\j;rUq.}0H0D%QNeY-vmČrk&q*)4S!Ug+|hioRf/x&X\7۞C88{/ { (ފ^ Y쒐!q)+y'mia9,U%-Ib+"+ڜ֍ )B0Ҭ TfqbM_VeCW[4Gn4.OcRU+fj3č4lۏ4(`Zum<ċ&[*.~x_D=~;)ǁ!iD\BQ9VGڦ/Ko\܌oւ Q:Zb7'&UkآVl2n98)nRQ7?,k[R&P O5/Cjy:<ݣ٥~yebޗu<Z7SD/R UF>)Dmn!~v+ZkamWPNXQ>2UTa gmi"!rUTq:D!٧>@D>XO%bY9}brlXV[c$':y(ԸJ^W-:RuACk6#wy"s.) ~ENެ{M+ 6ǽ(u[Nu (BF3"dAfk qZB~p1&JlQ^͈`΂Ix ʄH(\Ur'/uoKtAT9= *Sm6x) j%et7`ȧ'kX6{q"6ǿN;Զ[-$u#NtEVd v&1J+q|&=;@&DtPM;E"!evWFhUVB)w>D`PEbq;fFA;$s..FѶaa`J1Lk$H.{얉W旨|,Nml^W8Ncq >9Lek"<**v}-5jtoJ2K)7X}..-mvr7#oDW c抃a|&_-}'XK]YoYh݂֮ %j68YjXu1IYɲq)5 fd_poZKh8qhRa!Ib7(򆬵k{{7 dryw*HT(. MK$//?-ަl,2# ? 񪶈V/8t9}7E.U  rN;7(b|W[0GDo@vG_Uڸ{fF T 81qlcM*z;`ymox՞8}R-e=%4Ga$Shꈺ!+g#gѭ& ف;,pp"G=lC?t6u¾&rpe ,RAlGi6Nh,5s`+ϞkdZX* :dw6!>έdI$& ' kвm LI~E@~.вܯY Y1H[#?v@.!n@5<3H68[&*N%NIicH&#۫W8rF[x8RMV^Ϙ^^AdZZn [ÖGS[lqK^;k,Da7ᘝgΣ{Xy ٬ʐ lSRHfbq0&ƤUM]Z!ka}Bg/n-_HC|>ͧpGƅY_ 0'Lhg"&ߏY0^?ιwrc%]k 7>KnkH74 jJ 0" 2*#LJb! m!E'?"Q`, -4KƲi†~ cڵf yU-xݺV+:ʋh {\c,/ _NJ^ 0g󩽆P/B*MG{cxVlí`*v@i;;z<aVpItc\/ozJ׵$11yY7Lޓ\n~X`*qKQmC+5ͨ EndG0ߴQ@P 4h3qV6kYDxCO t{_$u E=QݯQ2oO\n61Tx&|#?#)zvZƺE8^hxBG% ͐,e PGB+ HW|2?F]U;;H:\o^C=Ȝ@{9^ PXNLNg׿G`?2_8N *!6 *0NzbthN\;rFiEt|Sl)J}C}+ !x c_U3ЪNm^XlEb@2">`Lܒ5+A?¿+u5-"A i13@h0X7TqLɿk O 2]/h}bl瑣o/r]tZ*Z}BJC.dG;=/pjŔaDU( HՐov7SHax?5L"z]:!7?iL*05a5ZTH9pҿ9 s{v܅G-B>:t&)rHğ"w[okNĴ;z;G:j7 ƂmJ8Vl@dl4Ҝ)xh'N,d>YJzČMh:d[}cy3&~N.zYC*omN_4}MA`j7hl]Z̵MRbc'z{IR`~W9ڑ6MD^ݮ t{3~F9AoQ8L b $"vtl CՈ[rEx\LڳSLNر&Yrq=S 4TnD|SP<q1fX*Vyc_MjN`gCӄP;퐪GCy g.K/ql@*,}7𑮛ݷxG=9{!'UújIú6huZg];=C\,<'[Q=f8&XLyʬlB6E5E9ß_F"h4^D I aL|W9@:$}7J@bb䱄Ș\oH8-?O}%RlyHÎ/6c@s_#֣"du&%d' H*i[tK`en!w֦B2VLB:ģf-{Nu_Rp)f؇jC=gr#о-z"ml ilƿ^R^|OQE&CStg7?}B`e;**ִM6Yg#CQ 8PjkV3 4VՃfpyίaǙ9(ZN9vDvfDIeeVc!-P.ݷ-yEB[w=DL x`f%{9ǻIv߻O5xN袬-5\{SI![E|EwX0EF=/EC/TB|yPp&q)GM0vlq6v.L 3$oVM6k/4cD{-:vuozsj P<~iP@#Z^Sd@J.K \jSfݸ(B3*<ɎGJG#yX\=t)!oi$)6n}P3 wS[ 'Y S]X#V5i J)zGʤê) !省.ʿA~Ą>OA-i},K*8,C?T~WK.~HdM_~N 3PîW/ 56apl \oTfYmNtUړ`r7M `2DuޒlrcMԌJkan;>/,9/N3^ŤGF7^pitPDSA_W_c{3xjvKg + v)6~`_|YMU{,T1 NZJb8 HL$ NYfrL9@"-yvMAH3 чt5>(jCqpXޮbY@Yg֦G̴7L2' ۣWK6],(oVb#y[J;/xo"ဘyQ򘽙`:l>BX%/"#X#6:-kMs&GR7D*r^vRr3ݟrFfĸ>3B^%Ӳc- fUxg"ֹ| Z5N"ÚPoUflp,:mQ#BZ!"Ι$wȿ@_J )gY索|r4vQN7ͼG*gX`$PTwOvG&'q5|ۅ|b8,*ԛbZ]c:3h HwҔL],{mIě*) /l3tpk;(ckU礴 UH< paޯOKe6'2` lm0w2\)k}QOxm?\K[S%W+Gl{ ,Vg>O0Hm2X d6MHt?H;gmr[(vؓ n6gPY# p ntɽbgPo-]A`u[ i 4ķh7suGmlrؒ.DB#@Ox=]%ȝ/4uWwM2Hs 3Fi"\~MOG+NEOcOZ|i"e+g2_]CG`"!I`|P2I(;_\}k7fFSH&1i!~I nQy|Lm&,&{%iZ"( A G >f4`wjݲg6!}(}z?s]*mڄts26JF́`EUK${9I=c,: 9vӂR#vKvn6rǐ{j #8:pmK]2>)vz*sJZTF%vFŪgqٰͽӃ`TJ"H)s5Uʑ+/{ٛyUx|¨|WdJ;zAowpu% ߡ +4W]5|dAd'Å]SzK R >&h. uBR7EcDP4nC=Il$xjHRo`bKB(URNʬVUjz#_XǥRH{^Xص{q|(#~2-u7X+$Z2/<& h5G |qV|#D݂0Y_32=YJP7@{FF "I'g?I \ Nڮ#'8KjBw9FzA21bg'717گ@%-Ӫ4n|~v;4iH?ꔚW(G5A(.Ŏ[g1 ƣ D19ʌC4ѾA\ }k1Mn\f)əPtOu:QOLr RttQo9S/ ts5O_/t%ţ h/zOj'\a$;( 预pVѨ^*:-EGJl8H_,,pzJnL3N>}5ڨwj-}rlv;fl ߹"ӆ89/t^}"+L[b9;mVYD!I)Gݹ202b$׉.]>PVibz{nYPaTOT=h ׁx//)p9Rj,GoRxstv-AҞdB'׃OVrqX\4>ߍ?2#&@47bK)bLatLV t ]Q6iw#}n2sVaCl[kOBS4ZGc(:~C] LyL*yhaNA=@|lAa](,>NċuEZ.AMqWW+r?}/m%$5?=ٟ_dRm a$MF]m](,t^yN7=:<[ߟ~x~MN!|Pĩ>^a2bV|U#8΋wLZ'5lH1k"8 &,^93ׯaQp‚e"9ܞ0[ 2l0\}ABHl)*bCp<>x; MϬ2i+ l^j莠|ŲފҙyG|4w]h'(6i(:Ob<|2<K)*9&0b񚨹M5.RM^CؗXSd5U-ק8~|6hy ˯l=66HIDAq'K~U0 k@-ŷz@v-}⪌6_}=bH-5.&^TuMǻ9 z!H߹U|o8ض?ri4AgYjnW $!,͢| lC/YqImu(ή|{Қ%uiH,Z1/KM06k~O Q;45V ?Xc2l lLv~Du,Y=têʼnvqGl*;0|R[OlEI+rBi͌ݐ}Q䧦$^qZJ"FJ(S9t@}5^3#VguqPQr N UT%vftg4OO^RK>tfrD2+^#؁#=pF_k:]uy7Wۃ7G! VS6D?pw5pegR Nˀicjd.yvY%}Et*LN80Jf} 0p+|Rc3-Lje$˚=k/Nփ,3 W޴u=%\MK[ ڻ?9fN1-0P::f֎eZi2TQ]Kd}KLfe_]stQUVF0  /J@" .ɖsN$ $bE`MIlVt[99ԫꡣoJ]ʛL <*1b IĄ/WR=:z=<~3^2G`z\6hn%"%}sVJ,ږQPVlgY6mp+5+XI{ lS0}MB|P8Y'-B^ƪ'9/3ܙvی,r&~yeXЅ6,QfDmxקU5(@LzR5xfp=6l۩;5fƕQhdHol`)ZT-↰boHxW{25[?˂3) /fWvs(k<[~1<֥U MxCKX;g 88նZoruvLҎ(Imy|> 1Y̿>톐wDRi/j[2xû;RSJ7C6pveLx@Uk`}ɣS^^o0Y>4st q:L\b\jIԃ*!FI Ԩ_.q>YrJx]3R3vlns}ri¬m^hzM+eaY4@L^{│`WL22T >(ogB/E%[|K4Tc_ΊofϨ%v>tr.oǴo l'YdÌ@1k=hf(,}CwVQ^вPaK[&M&hͼ 8NJgq2MUHT~X=4Rmyl!PF'n02B3ϸR0N؜m-W`Dp Ri%sO'jKqʼ/6'봿(ǹâטݰiD(il? ӂ7m7j;o񷥷Q`mI5s=6@ȵk[̛JVZd'ÞMݖW딇b-qa %3Dsgyd sΪt~Сk1\U,R' W \qvc:}|AUQH]ƈ[C$|U#]1Ou!Ù u! 𢰮3?:~!$&_!Z3:VZ^Z ~T f<Bz]i5@C!'5n^ !.GB-8u`rߪmc! 4 ?;"*+4fN?PŶGcC=<30pI$ղ|n(0jIJͽz\oVW֕ Xj}xt^&H_T18,斠.BS(YTbL? Hmi= Ü'%<&i{@k4WB0wyjXm\=p@Q@8h`tUn@ ]4q.ؚ2chv3eZqo@NE $1a}wa5+L_Xr L4YyJm+giK7FyGgaR cCuP޻.Ȝ:ifpI$kXz UWVb}_Iryʰfy?2zӇ}|Ksg퓬RT5 l|!TSiK0vE`;Y7-gxdпֆpDeG]5BVWs3떶tN`2wt_-^=3YAi:z"S˙GcZGdD] "d0^}$@T[x ZfFͳ]^;mJsGw{)9uB` eU,Xh@]%:S^eI5}H^XH f ,N؈0, 5b.mXSz;e.^>Xa8%4cz+\J:`SN'EIE"2B}Nw|9λ7\ gZ`3h&9'%V^] Golzw^jgՃ2oe`pס%zz~Edn -.y?xM 櫐vC@Uh+NA7V),Lu1Y.8-t;l'kVHK'·;K4RHy\fi=Z[\}M@qB?u,פbe!YV/Ѫ=R[/|)}1{q/SBh)κg#M 8v0RT4O螻Z>O&h]uYlǷ$F|n lE27H9! )&cIuC{#rȻk~Z^P~qC6gdY2]j{}cdg[ dI^9q$OC2gFY9 wJ5 {APTh,Ң<"uU_* a SHn זּg eoYBc4a!L⹑uN5^[Z:Tm F2cY< b#ٱ[D܈Y ۔~9! E̎q 5+bf(MH%oSKbAS= @bKG|Y-"&2rF€q[jsS`sXoi1+ i]4\H/~ iƨ0Qv4A~:]cd<ɮ.N=6#K os P8K!:- 4 t$t\-%7=*>bm"2%@ex޳ppŤ0+&^JY:ㆮקT [9e-Df lYʓ!kcU!dV(5i@?ޒc9zz"k)k4>~],$21 HzMGB ,on} |$|)5 &07Hi`@fpѾ%HG|mNϠݖV&@xI3"鋚js]0Vl:+t^bرD2WaFjL\VrP+?+dyTsQ@R"\T TMora\ަ4DDw.UІ;:R#olg]hnBߨ6}`}jPƽ-ٯz\%N}gLќ. ǧ. ZjUr|{{NO" fAEN-/tϢ8ltD=3cc/=\;N+ha\."(1[9a'K'M& +K{wq$geśdZl|,!aN%~`φ&aҵ 쑒?xŧ@)0;' cgrYƂ~D~[W}g9Jt\s$aOeB!SD%"{oԗ8gLJ p~NUWEJqΣCwt'n'.M83ZfaʤyԸ TcQ6/);E?YSVY%d_1fpb.ϊ(U&xpK V;On ]C6 Z#^ԩVbgK4*Izz4EP@Ʒ%bo8QBy.`Ccm߇ 3,k3D: X3ih6"s2YBjhDںokgIDq8P&t*2 q=R&je5> bd_xl]@4h/R%m:i2cByYD{aTX)Κ#DT׎X/aes0iP̌rD ʬbQp*9FUa"L+ |Y|?_9&r g?:i*6,R#r(:? ͟AzK wyf? 2QXXp~rؗq V 'ZUÏi qG@5;,,SvE(y 7e1!X-q ٦gsl=Xi4$2BE:)VQCebB\+BsMrمrя8^! st75# zlKcGZ"QJxb'ZYUD~r'qr‹8W*s8,Nyd 2!qlc1NU:}s1A̹A0NoLT7^ qBL-muBݞ'aEfƣ92X_udzψA;Q9ȴqVB5eF Qbm){{6y@ܺJ <%ohIon^z?|Bћc{_uShJb|*}V6v̰Hq~`Ҿ@\DT(o6jn ]7?Y["d M=%2stXO_v9}}4I+!.DON*k/;G2zn"ȯ-Œ[rnc8rds̠OV6YjRr?#4G)?rPEL t~1 8_1:VQ&VܥqČ|__PtA’[N`įHA~e=G':)!CFka0/IQyA&5@ړPªwa調S[dꭚ aeM36ax6ɑ^ߒF)-K6tu%>NP'X4GUA]-k45N. =5hTx%بt1gFm#m_Nm\y8.{:uڮ13ep?zL,z| +gnj`,mBc^wPZ?uڲC* z]34ǝ2XHj[.JH,ײVdbYN.!C8B >!)H-}{̄(U׃*Z1pm];Đ>\GUF_5Bߠ-b03B ؿ/uYU(1Țmڟa4+q:JfO+.Wq̒rN ^B:bfvK?Ln>@V0Y[[̚(*>~4 /v>.VO ĎdOMl2Oyds׻ɉOH$sݰLjjuZ 4jڀg J/a>̧ɩnލe.d/ii*6w+d؇|pO;+W `Ljy%7g!b_iP̺K!enc)"ePRglNtg? ]u_Y)LΣAqmZ)g;Q3 =s?i{[I5vIɼMڏz;Oly`_\#4oEp/CV{ᇸMG+޿ʇssz>o$E?uSz*TT2%VpqN^ĂtOOx0DWmu*JfTQVݷ1 R/ua\D)ul5R΃uIS 8{e0P#D7WX<BZ!n*-ƶa!cwg$~p)aU?5Me>_h 7A)B86I3x LX{U`O?[=}]OeʮW!~5Qؼk4CfFNY0u}XRc%0H`<5:ѱ-kdj͜q^ٛWCqA҄Z9w_yW3$+39^R]q1U BvP J` 2rDOxp3qƹ';(!kC 4^Ġ(X9,=V&Ɵ 7J+)֬=wVs^`Jиlmbl@7f6kzqY0 (Qp}g5|!ddl16X}5b5H0QozԔgT9W=XN٣`IJw2t DZ=ߌrVqÈEݦ{%7˳<5&l4^g9tM G>EG?hE,{NemoCΈ^5JQi0""E?:E&q}3{ qVQK\Ka&3Zo=B7~g;q]LKq+N7vP/еå MEb3/R_}}>/]:gulHhCf\?҂mKޱUdiċmq6Z.z _hZ+rz ֖YDTHT|F>:cA)Dao9H˸P!a@69Ys'SinVjŎUﯣdm!\D\0<}~= ej-)8-PvL6o%6nyfQAKmafܬct'bPA.,0 D`i zтZA Ij?1 SU;!KFvȻe\ ϧt×~^&([.^"- }E<1GFĉtʞ}"IAvs_y]=- kDS!|Ay.<]K1 g<Bi#s3.-myN :20A%(ޝXt sv@~hjSuV|)fF ⴁ̕~i͡A!(Vaz:Mp('^^jW~9 E_HV0U&7βO`)!LF6R[SE ͔DZorJXm^uHևlsU/Y^"c }B4|s{3elg{U)%O <ڏ_- 4_$+#;08e{X)"Tdcr~ٰǜPBP[{zv]yL H>,섟ܲx]S0 cȾ1BP(>Xq 5 ue-D|b:YJXu S}T O EZ ᓿ xzTMgr!fGe1~2DŽ@ŧ\[W(ӳN\j+<:Y)|>yDG.K'wIYUi&\`/19Uo8 `@рDtU{2~π2!K\Fdn"n﷓yl0[WfM[cҌR˓|^^Ry]tn>92f2ѠO@ki*XuԞy~X5hlz"|iiq>v۝o88̎fj5 ?Y'"O؏V3֨b5Y\6H&] A8yǯ rX($?L5bȚ3w/2w7/@BZQ(ܟgܴ I \AEYa?&&K!"ܙC)ɻ.giorW9HoZwqa+Q8>\Sxl0bW=e0c'5](Dr~oSE=]S0Emҟ5p5 aGR~cP0&~QLGh,`M.n&l"^  H @!26%Ln:T=!èkVۢOq ţ[9DzZpN}*=sdR`,{z<:DVuUg.cے~gV*K~$MVͣR3޺)Yi[vc 獚"`[7Qp6A ya":n[^Һa-Zbv[(kE( TLYx$_H`ԠM"|GB[m/)M~6gNh$T7Vʏ\3,3 "V764imbyR;{A`,(F.\^߽[OS20 'kꦍ9ݑdVF b.Zt6.l܀#@90W.6r"8x6zst`-dMs~P8])e2$J͂"4G§;nUS jZI bV۞3C[zٓm8s9R^n =UQ;3z<P^Ƅ.D0ٵNc,2.r櫗)Q[zNesBk}'g6y녦O-zb }'pHe_D+a yoφsmde`e_Lg!v@ ;a~!}YQ E7 &`D|$& 2y${s Ky*2ڸ~ '2 !ŎCǟ(0_/Rxh\<s]zSLsdt?2 I&dwN&^<LنϿxU^R>,u ז|+R aP^<].7HzZ: wR2>}˧u4>݁0RzgW;VFdť̅d -w9ƿ\p=qX8Pl=2v$g'\曉XD3 3vs,Ɩ R /-xQFbV9Wї&"U o _?ymE)7KS?i܈mJy( w[Fd蓄,ˆCD i渽K({^-Z4&'5zjߐBRƹNҘkH b[+0&ifn0y}@Zh5x0HQ>6ܕqh<XͳMtn>1K1~0\b2PF0%#HbZhº6FF%NL! ".g@ErPi9c{gdkDq/R VŅ6A.{M Y$ʝ+\Y tƏ>D"qj`TG6[ MLHF/4M?sU2GAePpg^R4U$cbmvM(]c d`F+nw^~}E49Y7t8d`@t;֮f#'et[V0q y$L4dv&zx}];T}l+9Qm<\y/&-9]ВR|\U )L?Od;%mVb:Fd}6Οw`KuSTO7FsˀW|I$ n/}>Z!Y֧*]y5\S ?p3a|(N!Cw8m+a$W2ϓ*e/ W〳0 ԻjX$ z{P諔uŘV:MC+(=r4gPz-'0  jMnV60.[9 TlӼL Լ.CM~ j?b+j{A$ D:!t }g:Vz~މM -adEj%A^Ioj!9 xȫdt-ph/>ޅ<4kT@wcMa}@":x?hb0ds)Q50)눦QݎEpAΤ@xbUȮ($ܸHߨd<'i xI㘂~vRr|ُR*l62|Vh뻯irZNހ܏Uzyn@s3{ q$%<^;2g54`(@(o啈-eu{G_nʮ͔5A!n %2Tͽ4A3SA3cv>8B%Oa`OS'2?U+2=up֯g!!Ml!Reմ~kE9"26Qѫw i۶}V5x^'Kpvw>}j$\^{%d9+D'|:~4D>PLj7h dQuх[1 UlT(D}%;qyS$JqȬL Y4P]HWKq+t^L8ڙ!/xn06:4Q|_=}0򪵧LTOcIX!;$?bEddD`T;t2"dLȵ.wWd龫i&N|[8*ҾB&m\BHwo^9?+R!˒ $^?˺d?DG B!r&~/0Sb,YK"$8s(u1튔jOr;0FRQQUT~Cњ jqmoIS1@dk*YKf Qݓ8PՎ]KT5!An@9ʗ0gZjO}y׫.du.iY}tkGv~#*{$ڶ{IJ)kduTJ&9/bWԺGՏVKaert<ǹHrTx=)c2gh% 0 `al̴0HRGsO^|?[ Dr\^MSL,ݏLp;(|~h"G%)͙;Eht:AŠ͑Kژaܟ]I_/KYz %J'lPWD)m.t{Y7uB Hie1XydAIlP6 |(7\ b%UUW Q*pt$Cl>SZaٳvt''{SN<[H %Ja'Ot#д9†{/![fWM/xEXdv$ P C@40ƵeM0b 0d.}?`K%(@O)r2o"Aێ-AȝcW OOɬ[(}h\N-"S1% M!#ԥ1Ո$hAKږ\յQr[>&Vdf&'QH Fbc/&o^ Pp19QU}Q'd_W>g>1&u0$f*ӄ $Z.a ݽ{9#{wc7V7Qѱ~aO;IvƊ_ՊchlN Ӡ:Sf8w$j3uvh|?eCdwF*g{{GgԬbpgՓ޺Q Q8JN=|M:jjD:ц9~+l'2߻'NJuX\aIvyM>8ʖSXdyi}AwMCO xT[T+iNkiMؒtyhAk)e,&fgYl|K5ûsL@?/OpiRu>9&7`qm4DkݓfcBAhV~x!Jc|3mxʡi!b!UfZPi׊D/ITV)+!*ŭϘUD} U݄X z\ rhEJnrȬQ6m% ݡV3h€(.s,xdMSh+eeH8G8ǚAD%o,K,XK١z)~9q1?W#K|~qU$g!J.76hT=is`(+Vxd?9i&LLH,GwYZU5U2?Y ӄq?0 uÄQx1Fvoj6ԿV%,FԌj|fO]Fk~ G9W]wu2EGy,cqd]Q@sOA@<뢱嶖!|p{pÐ3e%6 {v9fYrWNt"8WeĉIUyJ2hBb$P41^ly] Y8 mk'\-O!:8 ~Y, w/K$@B=ex񡪮$LxnF03;/Hp#gEQލ6?RSÚyCf'+$H_%ES>"nPϚxg͸ZRc3%ҲO]ط"?OSK\ +|}(Sy4 )9Z,N>[Nr3'@fimM%t/<"dTk۟%eD CyrYQqUh% \XjVi#ƺr&\h'#2EES0:iC,2՝餮0;βdۀfA!cMz4Uh_&k4pFhavv1>9ŝ싟SxP@Wcn;Mh$%*f4( (䅳2aeJJ%4aNն s U',y"hfy9~EDKU:;p~+(K) eb|U X  ;x00EO7 A:j_g\yL‰q=JTIL-J !+:|#R {j*=$m<>¦Xp`LAel"GlδD8qCEڵxK c(k(%m?*n@x:0ްqQFBzrٯ?:zvmG/1bܱ[] -c|vmљI7(p&N3'W?dzN,zN.*y!RT9mӈ7,ad=tI3}䕉PxW,rNfCi BC|`/=O8[.Y/K-0*kܻ}%,p|¸neU@ g-h~IOd#ЂFעD{[tsyN$Ll+RuXL$(CgNm8ͭ}=#vϺuFLAspjo?D Y2if9Bo)DfbKTp\o!tչܲ@7h~+[IEur-\C׽b>\kY&}ӱy BRelWXWt)<^A }NZ剚uTΫ.fk>yp]G-{;ObbfC5#ge?|0ra3qߍEf8VIsu܀Py"kC6cr~W1 2 (v,Rԧd@!a';mw0,kTpYYN ZCg@]J%ul)Q+]{I H01bݿ ˠu`T )>jp>hM'* І϶v\y`l'Z jh DɎI+1Ϣ7?FLʉ-Vr5=USGD+[9v՝voL_gY < ȁS6gR%K L.jǏ7Ǜ?G;;3>֖Lr>G}ҡ_&F~[N9C#@'σHNbMku EIZf#B^o/-Uř։jd8[Pe?T 0t3P wӁ^FMϸ>S%/1|nL`9!vJA4H/7-b|eX6 R}pݯԈ3C.pHC{#|[. "5U҆OVY]l`OpDgEݻK旟Z+~$mM_00>;Iiŵ]we)+D `ՙgW`JuPsro~_(zذo#DnƯ!zi0R&#nb.Nٮ;mFZ'q~#mS|_sjybrhnZ8}>nև9%ʙk-; kgSƜx `)p| Ue 0m>i5g2X{ T@dNɅGmfՋi ỵe̯E~]̿{Ҡ>+yjMC検YE[oUdT#=#jf-A{y4K2^>SD53 karQ <5%{VSP8U34fG|׳~3mTw-Vr(buQf`r!X'gw0TKgp/Bhԁ'^Nfb 1 WJ@17ױCVW/Q:Á#ݫC *HwQH.^z"S uM#> V:BߋMsn+U{~ˀau؍v"GwsZx$,o_PzFIn(rΞ=HGpTX]0ex 2,",$g1h` ԁ?%Fj]*~)\x?qݓv"56F1^3T4c)ۛJ"¼=tͻZ *Yھ[wc A"W;Vㅯk=G _poA#8F>E'ܫi>ӷOSL\nmQw=ISõ1wbnN7MV-fSKF+6?LHuD7 \ ÍM 4{;q) ŏ˛%c9YoNOL.4hj0|U-iuAQeRgcoAȢ׾UMOL>$b+*`lNeW0 T"-t?Z*HC(:(5s]O|ˏ[S$8f9s$ /I;D@9Bf06?@?=~^OZNSpQt*d78=M+"\'&8  z5pmNeܭ祴$D-u:WB슂x^?`X#,kfo WEW jcMAj 1a)7/`Y(IԞ^dKyY)0cJݱY+k2\aj >'X !g^T`jQŸ<|6eB\4i0q$L_!ԫTiGkKQ^4 {^:T{t8L/ۨ ;3tv|]I;\--f!2Uzx0uA8_ ABU8IU7/wqD*1?|4k'(r,i]HcyջU8ED ׭P< _@^_BE#}SmSbgaz\pn?';w뺥3lz"n_T=𶿫7pD_KpI~P ;2";/+`"%?z+@0ָ; 㰏˨wVMW|gY۬#].i"9ԧo ߂e5!x9$gf@;KXԛH`pZf [+ug9?p`f (%UάtVsEFENt@[+7n0x_Ey&N<@:vHE  ?ܶ鈝n:koM]7ߴ|ir~g6WVN.vgg:Eo +O7WhTјrRIlCë`G.W585)ڣ&hs.XcYŵ- m#^w@ܨ!ŚX|dϸ2>== ZRpzڪvƉ ͆#>U8v>F3Y]WŽlO*Zrkzsk9sq1@j0ቅ.ޕi,)vnKa\a:7(b>Lq ƅ'nOdMއ.Pj͑[@\--2 >G_85Ů=aO Йl`/E`FA 3 S h7lȎJӾԷ֧^+G({/.6i$jU) S&gz'"(`"W~v 6t[jM0&K3 hAmdKZ,t|Cͭ&AQ+NsgZQb `01ݳٕFtٌloy˰\Ow1, /$nL=1B XԾ8n3eΫgX核vNO +g_9à&N2+ N@)lsFg]MfA綝fPml+RSs)YSjyz3+ʟc!\+ULcT{wSIz4=PnCآIp_xJ/l\IwaLۏ I?{G//5eNb$5j醻dS&WoxKeuۊ\jHu dV3XҭR7g2syNŧ黛 js@qh)j05Rs+Ww28t\S=iolkWdv,N8$Anhtړl3I6(h1C15}pؗIk҉r.c=K>$oj  ѻ1E&`D0pm|!d$VnAZ!9="&^:MKfR>=ĚG8g8s;EHܫ@@]#:VE:*YWYQ-C~s>rRdClN #9gW Cè I*4'Ve]u|pfvh LsN a=u1#ҌE)[zr:3SYeI v/|g|{ZG*9w8w᡹ɠ_:!}XgRDdG;t!yd_ӬL+P#z-]%kڍ/GfD'߁&T?<= YY02xգƤuΒ'$6LKx8 9G;?.Pd`t~mYS5"P 2̯͇@3> !2n5{ e;z߲-Hlabl@yCg]9>h`8uUی<{o˜ɯ& u3́ώ'#:֫l+鑙x؉P2OAR3-9JJRgwSGi߰l JoGXqB)m%z~6t4BeHWmt x@?lc$oDJ;p~tS+ kްsi(;qlAan鬧ZfFJ櫍jٕ~DƘ(0@!k '9H8Kzc%8'&Z#Z3ΖcļL 7n~NayBh E\Lŷq׳щlR)M̝[fb* {oYƳ!\HWBϒOZT#7JUT|ݯ扒Ĩ4#.I$藂`zZtlcP2S=;{CiB 3xN3R bғ*Y2cL\T^Q!ƯzJrBwG:sBbOE3e "B5$JYBgg Im'ߋ1`<ȆׄD迌MB3H\N"E = ߡCF4_vAd,!/lb|`Ab)ѾŚO)$PRu{Nư*[K1d< L*cxFb4#}qV~"jbޒK;YGE(Eåނ])x"w_wGrok4rCIʂ'VNj?ɠ1~PKԀ_z*P"=`Mλdž>ӖHD'-O>?往# (iq ]4Ȗ 戯i>GV& # s`;m}J|0=sn̝+V5ST!\Yc(e MJIy VNqB>jpB"//t '|6y}5oD㊍%[d'.lKP% 8&)ϭy8WQ\|E@.+@TNj/Tm#4^D)1%~hHխ<ٹ{:*Svf*+هB} :DuWb+@ӚTץGiDvGބ^|\T=6# )!KL]PѬșiIH%-y5M?XMO.Z \3vn\1n6^6- 3F< r[2\d ҤR" ~7ney;B'd5Efh6 hk5l?Q )|v,ͬ 3Wj9¤po2)|ƙxG%/ʋkygPËl [?VYE>3DC{sҪ#soHö٫96J<wX(  4OBY:E7#BNEgј~owh<L8KүH) C; VNE[Ș8I]6?XcLơVlVyoDʠXԿ3v:LwBLv/v'/'"V&N~><OQm[jsk6e4B^'JNۚ[p}Je%jޝS!y8M6igbI^ڨMJAz9xEYYҏ /CںB·0KO2 EaD2cHT/`EF @_b:W|\uV<\dc^])N-o/8@B ~0F1YGrQ?bso0̈>vˢ;'/^ C[YU}Qh,!++^/T0$_7@gqq_m-N9Px e3WD%g/!+#oZ: v%ffgN.f,%F{A{ qy;dgx 0RDX[haQ$ z'zy fl3I/gI HLF?52X3$ETQJMȑ*x}g< Z]O&QwBfh7@E;1,]˝7Sk[˾ƌD*G$&^WXPƏCE0>kO9A] p\M4;CE*OC@'sW<*G9Zk<*cSඞY+!'I" aPQch_;IDNAB?^+NV @Ws[y+7\3^}6'kR c7a.dm&pA?I1RմE&,?>SwHIN{5dIF#=AO1z=ѕ>"H[Ǵz3@nq E<|1X4O4q7lA=g7zPA |ja;c6K+UćNE*<M=ٔ]֗i{>6VB;Jrp({nb½^yg~ NQolv&H{6'C"(*{*BajEpպ!~0E9 {ѾB;7is,<$ibB#^pY#7PpDsSo("j\DZXQ$a@}٧]2L6;IY!~9Xk."tӻT_JؗSm%j*t^6-e13DaDϵ#Ip] `xb{`'e8q(a+ ՉDBi=[ j%f88) )Z1_i*c:Vmb-^gm3Ͳܽn^PpOdPOBڔ?6EE)8Z`MU1"wBC\%b?,U 9?, -APn4- A&dnLGKL8i#&S9 l%2Wp 9Uǂ]W\ND[WLSv ?"w}%vEv`kh$f)m`aJ͑xGTr8T`;@ټ!~On8l5%pƧy,6d%·){~?z*<(C+"/߮qS{u/izfz3%G UZqc0شcy[p1ח#dq!Gr/I}\ӕREm,%I@\Gk'h"; fJ]A FQTD~) fXٶC2Mq1Ke῍( 4;K? `ZfU!#w]Np"}o.6Ȏ0EL>1Ы5KGH9trHǯI }h:͆>om1Ӂ+Gx PbcJ3і9,DEi}Ǭ"evЛUíE(-y\e@yj &;1S y%&,'r%Yvbʠ.0%.kcnoW|~n / V2H]">_]FrDpk?![oTM ΤJ '_^.4[eͧO u …Jy0Ĕr'TdcUwd^^~ 8r Q> 0VKk( o_zRܤoߑ=XKo{&,1.Yzf䪂yLQsmwZI/KxZ1sЊ15?^eD -B\4ٞpA );sL4R]'۾w0.!~h~WM$zqټ:N)\ c!=n~YZ.=攇e3]7 FgA1 1ve.&"c=f#sj+q+GͶ~{PCq%\=nD#:ΐ;8<,NK>k3ʞ-U>/m=UaH/GHpEcy'k7b XF*o^8Tsϫ_ws^{n 7h^,Uf:[pMe%/g Ep jS ,;e0<9AA9NV'ցwb~?L[`^3mN>Y١.}35%̹2fxG :'r"j\v|!M8b9'-xKw)d#_V>kzF6G 2Ikt?N>Gy"\hB)ҋO僉@zyqAmFBR8'Zv,.x^ɮUj+gZEs!>${8.7 dJpDO]MȸC-qh-6`6Fa^R#^MVF؛D +XZd\cDYBk0pr6ljvƽ(^$%n8o>B^DqJз ~tkֺqVsS~/EQXA^ 4Wӥc J.X:𨃐8Z>e'V<@Y+3B+9jD2/'"tM fݍC;=< ,*U4ʮSROHyp?pj5# ^k?r>EO쥅G͍}6Mi٤4 ? IHEQ([x0#J[TTe߼Ěǫ#բfA~Emx]؂:.z\^ I7mD 5:OcB^@8Ò v<`W&qI`}soF>(XLqka|W58vs #'iIB<È" Ͱt,}Ɉ&i87_0wEF:OwtY2(p8S,^g]1}|f]4_-3]#>͉1j}q[ٙ/:%>9l )rk@>{\N7WO;:taP 4 I *Gdg/!8GuΆ u_«o:SӭbYF=bۺtpWdn|w1q>k8[ Hn8s}U4ʏ6]γM /iu<oP?EIw5/EBg(Be?J9vOjon`Vh2RRE4`͉ "tg<`ULPўс$"APk4xDÍꐾ9zi=cRbJcnss,/#FBIe|}Mawg{-ϧW&0<.{헖5@%<-GI gԽM*;S)ɩ.NPyT<OeN0֦@!'jY-Z; GBpji97GM ;ho4, }z/։3SEZǔ+̸EQ($p!WW[DT8x&@m4 |u>+S[.~j 2 {]2suQOc^P"TikvD:E~SH%ۦϛיo'7(h;V WC98<WHhipJbLP*Prw#vUh~WM {+[(#g {~zMK.QJHDAў~Bg~ Ǟ<>` JS]Ke4@/qyu+:CnEZI ǔڝ&@j!7YY@m}աw-8]?q%U^YH|/r[5`Y$Z׮ EYE$VcE}p? CCgR=^Ȧ9uĎ)rY !ގjWuۤ;j83f9ic_ &ח%*wS< Ovftbݦ$_u6PkANUPRX}P]ma1/]~k;p7Z&1o,[~VXNLPe[H{[m$*GA:bqnV*ctpMN2n m01R}?L0}\2Et4D}n!d $@&OX|rz̢a;Zׄ{R/bv~9nYeeK Xq|:/{9;4Ptֻ͞B+U&<o8M"׬I|LSAK#3=sf ;fcىJ"wDT7nWDoXtzuoh #%fWB!==Ze0M.ʲnΈvulHy*!Rbja}p& y/hCْy8K<3IgE~G!mFc1BV8|:bʁzLH}%iF`ꗇԥ#*^xt*EA޻ଏ|#W]OΒ̭#ym?9|Sw2D֗5i^4d8eBod;6"r@&EQE&BVS^ۍ9́Zƍl"MnP]OCڠ_U8TnkJIU7o!3NH%pO}lϕA#itgΧ,1$lk>izB!YT).) G;ǥːr{Y* # q$ Ŭ![^{{SijWOUH*$c29s:e%KFS-5ygpO]BLe nU_]˜P5EzV߻[pPB#W\yyЍV7?ڷ=Q5V q5 aaJ2uhT+4(tS!K3lA1>"A~|yF#+g&׷DHi.t}? OWs:Cc܁l':#'eL\4 LGnrsC (y\"RB}v0z#_ЙEgۢ QQ۴L [upx<$O3Eb=t R[p// ɣCdj?"gJ+@8 jF'|@B&^%mvxC Vo-ܛsċO\PzH_u}&6<#ny" |$wY7Q@U -1 `7᭣F31SW(d^:Q_*ўԉ),wjo,7FA+0]EvwY?I XSp-U5, ]M RJ!u'PsQ%,HP"# {.>ǝMn6#K@+Q'`b{<,eSC6Lf: "eJh礸Tk1 "]>MWrM+D]lg7e{)ૐQi)UsÈKxXS Q.Ӹ8l{ .b=´I}!n$5ɳ?:(Ie橇v٦zY iFo A/w\?ʼn6ϞA :9&oDoN ٺrN\/c2&JKT e|hc>,!|L˫RvR,|ErE)e94#п/{"~;Ĉ vW8E\Kƃ t>Bo GÚ^C~ CY@⛟ráoXVaV2yP }l8i\IuO֗:NqMU"A8!OcAEvݖtA_zQ9htQ{o[qT(ձIiBddm j p|k[ ~MB6T^!oZ˪-q/d(;t-J33@,<$!(՝hxD{H3{8G@@saGiz+Zy.U'O>u.Ћ^FLs@.coWs7>arပ N'{x6h8 B3t$s`3Pu9?m>!=Ȣ *A}؟`P}fc(scWt}8ӌ8gX8ŕ gd.y1vͨ7WЙ*G6X#=xmiF fa}+e=߃4pUQ;[!%{t-h>@NjPA .lBxMelE%kr몓cVdN܀pIj1A`!&`L{_cqSn? 92&$cpQE8Cჩe) IQ:ن޻_4rw *4|n!P-`큝ߨfc;[PY `T(2M8|=pkE`|Ek^=T@^nCrj\V0'ˎ񤭼B+4fc\xQ! 0qޥE9tHҸYN(ys^mB+>{o|fK傘 wdy*&10ӟe:9oV23D9w>R\L7Z9h,5511.qGFD1J t?Ibh*D9XzJ hd,yFq D Jwz?"_x7 +:+ޓ@&_Ze[`h\6+nRCKٯ3,aFTyE =2l#篺T7ɗux+OAľ,yc,Fb7`|h{j/ZJt53I@Q0K77.P2M?ZVqHfP7WV;P*:W殍h D$ s.lJs</.Q?V)j ?bVP^@yK#jY=F<Ӯp"m6*huD c&ugñ9EN- uήDlWnkC~}x~F,TAR 2c!>3@d8e U&> VpU;;*hY T/W(4ֵ840bY;lfiPGD nw}5Z>f>H@5SMg3w:4jC)p5%nP:)!K Ӂ{*z P*!c5U+L|A.@  !*׌?yA\Fyse(L_n 1n;BJvהY vg̊$厙9#s6ݒ԰)c]CK)|l0E=ra({6!! %̿"~ r')IC'+TQxW"`>]fzN[CQ@9bzmշm@I)Z,qm/3D~!4,C:oHg=p-Bێd k R s>gl#/+\[!!lU]IOPj s6,?܎sՓ%&7tRQ"+4ǝ%LϹ11zz!2N+%d矵l3?#m-͋]&Dh$m"̊uT7L" _%+W;,0$qy[EXm+=K @\;u ߾6q}@@j@/9MSk~^=FO) J FVHН إNp=^G98A,KE yME9!j.7 s_)r{sɁUAE&bDDa$"sp eJo[WŃpABY'=vX?C\&v=2n[D}ξњ9"#`5"eI8RJ eOUJHS4.8.&Gb ގD"䌒_Ҩ8 :lz>Y+&a~Yox:A-i3\g~GACqs6T%1F%&k{.T(ǐ=|f :ۣ:hδ$Մw~A0}牓G>azi&5;PC^39G8:4ԱKlv;ԂV 8PZY}s@=*~ ^"5H3(G$N<)iwnHA ·.4#Oi,nObW_Tf͊i*NZbdkdA AZ@M>_c.oq푰VjѤ`%#o,ۃg!&y2 k1N91 dˢ]}JBF JD*$mF˒_H%e]{S@=` `Yᥩ_"@,<Đk4{AA.莱l%.oūù'<޳5;b81|=Nn>NΘx0Vh)~>m՝'(j z] @Wtk:~D⽭f@y[DwK׿*GN*g,^)u=J=[H*m-1\d`FQ@2HJ$h(Hd>)O+A& ܜHhEwM9'HU0GTG°'7XߕZucE(š}ポ+x,8}nWJ]%߸gRW9k7soݪBkVaYEd'Y渱-Iĉ"-H.],B[mD~JqhW% 6^u{/̸44TbXu83a%~|}aXt[lp eQ* T2r@8N6T\H~Gwj:~~lT1bTwl&͒# P%03wPÚN>- K=z&X?(]{.LU8^-nS _v`r%fӭWP"O2t:Y̏"?eZ܎Q(BM]LڕA8-G mcFl$;21 c 7T7kWa Z0bRqIڙw@8D"sB4CS&"h_ ˙ <}3.c73sq7, LL+[H&cn2G ̏&swb<o69Ez.۾~gxZsoěJxX5vԕcDMcLj2,<Šk )CLXޒjL˚=,3! @{W &O.`=KK8oc̢ז]8͡(E"֔C汳,fpm Y},)1^޼Uo.tn`DuX+iPAm];EKNWF.0{UW! ]{Sy.k(!HK^(r?S#jU7L"#8g츘lBoh"H{ j/(9?qRmu}.GV,jȦL%72WxJBi΄#sO`ډ}Yó;R @U]Sh $ƹHe0'2eoZu`rE#7xγrYǾ`uOM`U  &d)cG5̟mU-"foZuB`XmD#kvN(IQi߱q2][eZ^ n V9%n;{m_}(sm*8Wwnю-B %]uaS4DA lжBxzm_jjjOJO:{L+6"P Ju@tP\O HGb;8(K +vXpZ GM0%ߡ}pcxLѭ#B{t̤|ؖV]dvqDqЄf rf#wei?<ķ&|.7y*(M>Z.GGnJ o`Fc=kMNp6Z{'%љ|fNVpfDMF/ `O=&2yzBZt}ѨZN|YR¯ f-.AFl],}j|E>/ffeFDkU󀏨f*HbVSbEMٛ$eVm:LaZea 5e$ B7]@,tDT5yAIKYX!N{>-@Ջxˀei_M:hrlSsN-4)Uk Xև[[p A8e+p=?o5r~wmaFICH6&bMObi ;WڷcW r1fs"6q]A:5D Dl'gX]` m];ซHTæ)<T$//Ӵe73z\3 82%U ʛxo'~De< =kGRI_=Wʧ?an:^b2I̖0ۥID6Z# CauqTIڑQ4[л@Q)5,k=%(!{Np18$ɝ Vs5Clgs㿄JwG `2dԳUZAѤnͼ!glFl@d G=2`Ux` ;{nؐ%1wqmc=9*P Y}Lțȶ{nd5EK ^VnTo>9m"KW,*jQ(:1!{hr:J:FTzGNN,q_Z=XF!^;FM.GQilDѻu4F(ԿEPmMb&}Ib;tc<%PUU `.t 던[PiڔeVS@j!ڟ2DkYJ=-.8eW^JziiJ_py`b` |quMGf 0ɱ3c?pc _W)eF={Nsٯ5P=xw똭]'/Q݀8!:Rhb'(m ]r))k餇Kٚ O^^ B8E2u0Ǖ{[UbWȏUmu`QBhctM~e| #@Wq uq:* Q9T+!4}Ͷ;\n jOIp@f^?!B8f2uAR3ݔ,\e p}/sc;hԕ(}OJ[u 9'$;37f&{w+G+$P)?*Y< B>IV=:scb`Bʿc<9 i8t={o;l! zbQ5;шmR+QX4lm4E'115AĒ:dMni?KEճS}싅T6 W;&;<+ j>S@@} ǚ*oNr6ljXʌ_#LRWjP}UlS+h*sᤳoFtݖsc8ishb_ YTr ;I!!); J["k :s`qZ,{RfnגF\r;zqsQ3[`}+cB4 ȭ@ʵk-`` j$d}IYdRjn W@Y{2{EV]to+Z[)`nM D0_wfa vd+3(mO|P~iܵLYk30wDŽpX++PC+2|u%QsI8wQ dO K8mNWgs?\/%J2[qվP4{}bCTIcKJ' 5Xlz^L>;q0 {!9N8>#|ŪJyGgCiqյj{+9_BVyyX߸#yc9V?`tm)YwٵRU Q>MPOdMrdf©3pEeajMJn`5m:XD3cTEa(iUT3l ܬ+z;\ʼnn9.ڠ5$1}07B{mI,"-`EM"6杖OK*T_O'=[ _rN59"?_3-ؕuEYlF fp0ܴ Z'@|?zYݲe$}A66+yj6guu=JsorQ^v6# Ze![WbD]B P>9c3J: e)Шݖlj$ q (p[&Tۇtgf*Njn4$ j=W>#8 a1]J4h?HJƉW1Gd8[i0n"X :nw X`<(w6RQ`W|Pljp(3<r$z6s31M?jzD\|>D0KDwtUw,I5uዿ2jg~FVI-iLlqfJEy7|{Kjrkgf'0/㟫I:`v+H/蟀>#e,DEݔJ7ih0U n"Uc;n8NDvADJ,XƄ#{YIɣb{*9gPV Y]T}tˀL]@Тe jAݔ8zyX,aQd^9܆X;Y++ܯsSC#.'BpGF|BD7i!i|&N!R#v2.trt}$T1ï|b<h"ءAr^Vzδ7W:o_i'jRZe",!"sE}J-` n]x@<`J{u]{hXk.I"I{b@{Ph?R!cA(ȕɲСN**u|$XGJGq_-:P墖o0,JM+^k`or%m";OK'FIy2,$tCbEϙYDU#cێ{[.qcg Dg%fxE=7q`ؖ[F,;oxA{8imjFrKK,ߟz'N!0qJVR6 } A|.2z4qo 7~ BM;3V>+?D?(UϿX3ƙАkf&a?Ɗrgͧ&XɊhۘMϨť ª_. ɋjlv`WpyV})y OJKgT9w1ڙrx؉QE 'uY@7⇨&A=+q9k}E+P;ؼj6Ѱ$O8pH|OufrrIQS3طqpcPyߝ[3}kdfIogSjԑ1K:FAtUc?X[ј>Bxp|zV$:R`E?}@'ԖEr_459jtRqڀ |,j5?|U l|F}]6Wn%{Souo{0w0"D#VS:GZyۡ CiB_߹KJBGJ@FVȄĀbO࿱ݛ`%+./e=º.ku2R HCfEPTmĖَ7@D(1!HNeR\)3mORNJI8|TSqݚs0~_Mb@)gI/h.p~D d+?@=E0!7u+x0/.Br Lut2-6nvhԄj?u>u;"]`>#&pz{OGWthK9ɥ7_ke$5s]m3Hj-BE'$Jxbe^(m %~G~`⃸yL%njdIS!pe 9X:DASwF5bDaw~kMܮܑUHu_I gء3gRV!}eڸPn*57HDY:[?* @6zz%?I6I_.9}*QŬȧӲĺX烄}zU)fsz/N8O ,90ܦLl QivEtPc9'9<.hHg'z~ꋞ=jKƽ$xͫ~5V)*zh&onk:hPDFL[i1hGAxCP'ʾ}1j3~‘^mVWiʧG/Ck5r|8v[@|C_)MzV&D {4-`|8y=4׫\p_=!:gΈI6h[X^qUY[ QM͙8Dt"^ȫD_տپ =0H+Emm].|%BvyqJL_Zژ1gƓJbFŖl恑a2lN>[ *v:8  6^+G]"h3;44<2‹=X~d_3:JQbOU *826 ۓ˨js~pR;Bq ^g^[m \IzI8-Pa EIfiˬ{9ҫ}a)} S C$X+E„D$,^I6)۩kEdpkgFж!r`_II5Abw{۞eccB匝x I\&9KA-Jڀ?J8-U/d4@Z jR7 D2v>?MOWiC*QjacԒmA XBVR{aAy} Is)OΡ׌9_;$vɗqg$_ߴmY4H^ao5ޗS*V|2QWqgv'roS+j&=bejByE_mF(yf yLoO|j­_HUPTOLR岋2J B!̪aKXnxxֳwGMNh%3V8eqio]&zEdqc%e*'5~6b#:µm)癍:}MuF,  l+TIvKOx^Q]}~Q`Z 3d`GM)eh!D>;X{"6n /i$U֨YNOrinh.)Vyz" . $C)2gIlLqU{4^< gz[lggTqfd)=1ޤ1*}vo˨3UPZt\O%=dCxjыCGsQYeɘl\]{4.,Be% ^Z.Oɨ2"I$TWDhpi u@)cVwB5)NqgB [8FKL:-\Pi ޸BxoX6%G[ҏch2}Tn8PAxh4 4wybĕU /nr=)(ᏺCyW(`@$\@~"g$5m۟ΤoF:^پW_ƽٶ,tS_?Çz݄R,J^#CI s ( #ΏzY(jZ뽗$'ĿMcy@` t®X!+T*]BP)Jc3<8]t t=GVlK YXN@հͮ~58f(-_L]]4#Lr&ol"ͥ)dGlѵyk3G{#>c_IbG +s{i>ED buE9,D5qyC gDUG{)(ҔXGI#tK4YtkӴcUV:Ah%,75nU࡞]ܵP;RFrOُ)`$Қ(ą}~ey +mnZ:}d b[`=wm˒qRgGδ`.MoB8yǖ(.#.}*(ռ5|+Iq d#)jt |82\ZR_ll Qb"1Wl$%߹NچPВh;V1ѭ(>ܔ!W.`Kݰ_AŘ7m6 :tG8>I(PYtbxL[\O&pЗ5M#VMw{Sbܝ8+m=.1}n0) C ~N?3$sՆ1Vg[FgQIruƧ @Z v4Ҁ%to4_W7m$Jt~hWr*H8.l-BQ TיeTlhK,"c3w ɟE.yk:BNZCC)F+h^ ߣΥiYٲۜtFlĴG hMea$z3ڕEtva~,clݨ؇sN*B;+[ߒZG֜6 2-"wMI;l9"ZҳxaRj$I|mXݐY/XE_-dΏ)j|;=T6+>9stzL"[MyyGsK.ƛ(Lq] +iDSؒrx=F85"2Pq,ֿ2^'w&i,C-ϯJT[AMsZZ:U}b_k S;I6:`h*p8μ'-MdƠY>(vIi%8~9yiUѻ@qYtu524:1Nw]YE9D),تu9+}JP r l xF:~T[Wi㰩Pِ컼G.=ՄҪLҌ| Cϖ9D&l2XQn#Ѹɕ9-CHsPOOt9[HPeH\m zj sAGK<6*.ӏt;ц9wKxRJ_C7^ҤML9L`P]!FELE7b[(\jj_MNܚY2m`Zv/m1͠8V5ꮑvi+ן}jYҟߕB_m:Ŵ"/Ka3$ SF Y_Ojb,~)L"w*'GN9Uuȋ#}'VWOsey[zI`gš0dmx˽r~N&بw (l"kFg/{(fZ_Yza*F$.&ƀ饫 !LL,flIп02(ŕ1Q;Nhջn?[캘Sy`w Βq7S<ڜ "B0+oV!-W$}8 Q hZο@06;C6a#8E|َo@WziL+!`%IϓW] ~ɚx!|! Gt.Hl%+T#E5G;\ҠzTgu[BJ6Gk"eUxi%2.+)zybn宸\<()[MP73~c"5bouGRyv~:0uУ`j\;1V&n7QQ,*yԚ`=*%fLdR#EDt0 !oQqtPZVݾyc./q3{umJʠGFv% S6 c#@{ E tXJ'LNU͈O&=&K+$d{T3 hY+pcfs?aGh Lc5h>Ub6 6L&9mٿ+sE<,&)@<[;X҄zD 툚Cvy@? SdƩeVihUDý~mBV}pÒ!eJ\RXڪ/Okl@qBpy$$\"5k=<2/Mfz"4YMUQ kτwlk?VC[|dP.*j@-(7] {X vuؽ@D ࢶw;d ˿Ҩ;S_$ XVv@r\ߛik#ȼQL^,/a lCMb+s|YA(h*l&lm4yO6 9&~X#n ƛt̏j,Bd4D>5V;2 ;y6 ]:zuzg 8"U~3A}66Bu[WM߾cn$I'ЭLL#MlXT3/"NIO[_u^)K\^N| #r=62`qS)PNϘW/R=n]pZ}?攺ش j+i233ZV Yס վE&T1edJ$U{ gI&ic|0Љ502coHfO?a~bT̝ꍮE([`.kşn7;?~8XmBM89.;~22ޣ,egPﱼ~@׮n˼Z=άO`-vàJČc <݅*9VLLWd=| rɕQYIř[-Rz`#HBĜp:vBkOG6V)Xotns:&od^ӎbDMoyYūJ5.i]::xɉ{aVڠ ᆶ-&b pAPأwJ<;>Ɲ1 u8q~1yO P# FM7{WlÕw6mS{ǃ"ql_ڱIN]~a*'?W ;6~4TPt)?MۥofY.4Z޻ Wo c@7]E`Dn4`yf=WW 8*QAe303,HVǿ :[XR/$; ?gB lAø@Ci` μVMݱ /y+4,bfu Dos0*;V8=pNImF^vfN) >4/tg,R |{~&@c,q"W"6%%gޯmކc>Le(&Y7|K1u >i֭y&:~yL`DʌV}΃s|u|#wIY_ Rj QA+\zf_jsA{.'6wDG >?ђޘc & u +:ţx8ͩh,~> +>!Q xDC4z;/w\nwAZ}A%FF K+$= UJZdǶw_=PBH>S-Å[i-קЁR(euA13Vzyd#Z="HUQvI? ytuLq FSf@z6͚xڵ +4O*hb\[tǡTpVFWvûB4r^i?w99,uefM?313rdpSh!f*='4;>o ;A;VzfrxfZF,]^wT\HJ|pi1`z5O蓼#k8?q!P(@ˑ9\5p7/sT"O  1R`͌2aNň-~ ^jJ[+TBB`Q3INݴ+և:WTplv3i Po3{x dv&#U%ZaG$484=IYI>g[.t3+̂wc`5\,OrYՄE(Qd㼏.1kY7]..+tT5װج-3B=GCޠ ԩD<3kekRNֶB5l{`6p 6dwIǫөu[SA^5!@\aϴ4!rY8VmdI sy=LOZڬ:h>;Jdߨ&|٦A;7Yn*ψwI8d NWqDQJ+ESfi؂w~ݶ-!!aS IA=vhsl s4Y;$%Df pE/4N 6uv#g[J^t îݠCm';q)0(/1 t`뱴 g)āc%Wov%.n"H|r gdj/cK1Brr#cZ^ 4WY@{_Bȫ{rr CaynLdr_>#}[f A(,##E7k75%[/稹 "#*zezqG$0:Є '|L^."p {n?rAI: ͚cZR(wgon_"QRn@@AAq/vE%J EN/KJ[!I&I8O]P`̔A9ibXst#륊 7fbMK'U!Lx߱ hl-A,k3X5)xu4g+HyV\D7ZB';JFqP8'Ξ%e%x}ٰ9/~Q/:`U:6N R7Zg"o0Q~ҦDLIYK) @~GWJ%GZw`BsOHB%oKJu悘1N\6^I6?Gl27 $P~R5W/@8ذm%fS^Di !|iuӿ"6y Euq [47#iW/a<"I#J:7[MChSYrjuN L'Q\~bXPp ep6[@<-VE;~ޯgB뜎Vh>CFRNt0VnK8mxQ.7cg5&rzv6R"'Nbb)\:U6F`[lÃ`aF7 fƋ gn9p'1XZ@VdrHt} 'p~Ls7 r,S2ybŹREbTEy`sϋV~&xrLצ9m[TF [fٗ1; Mc7a2./(Б)o?hn)R Bѱ{z ]v {<;Jq}BIR9eV,pq ˧PR~pY=mͨw V983=KFrY#T]i njwFp` &w0C24dعAÑy^mO7`n}Lݩn܀e9IHӒg>KrҤ Z=q8Z2 Fc6Z[רЀԄɕh&!րӺ݇ ZC8L&d#_h0Cuv+8@t,4 <L]EkطS9g~#Mci7.0Lۨe( aay`hjq9/:!f >b~/…<['xN$ cC`7ඉ5 x.. orMs}G/r8 UOprHk7`j.L Gٻ"^ Ec38}+3\M1 n[;Qh9(Lb&E g#kH4ozCƏ, q햺*UшI>:`q{('Vb`[*#uT.nVi@NSmӽLa=X>1"pK J|:H6C}81|nKYRE_ZPMRS8Ue  Ȯ)2i5Z~7sߔCz MjƪimH9Q3Esږo uϲr47 o.*.K[20ka@FBP"GP6!ogi 2lgWH޲.OOX% JPN#Jћ\L.ۿ@ Y/WͭЗLQ$|_KQE.i,U:ff=%K?.\\HeK>r~VV0kx XZEzT)SUks[$TtF_A| o~m5Xs@M~ {C\yAbw l եAl.Q>΅KP EmRHUO?p7<|l$eB wiwcI [jQW HfBN+ΙoOQ>3^i‰ G1|>&j)ekMg0XJ翡^􋖂t9XQ4kUG\sJwΞvN =Ah~ڼ g7rBokҍJA0)N.VFip\'”v&Scl8T|ڏfi-6¾$TY>_,hل#׉]ڑhH_Hj2bed'[-܍6ޯ%KKK +8![ !igM;;d 06_u]ir'H(GOɅ1=a..FS"" u)Uy=wڛfB=,Njr8-=~PpӲr2JNPTȺpY'4wؒ8:GL&-` $-XI%Xّ̤(۟<͒v~3.$d#4hӽ уB7-w Ė' mv"ߤL LCk4"/ ؈ Sk#BĚ~n3#oPr%0c\ "貤V^[4jY뛆$[Y'oVL>'X91JTB<[JR|t,\wuϡ11 1N{ N6ak_3t4c!)%댁m6{&Uf50"y|:ը~'spTϔ ֎w]`KC@(շkJ/ ma|OEf~[}̥x9T'+mT?](Xu>ՁZskmZ2 xkor c/E⨫qOi?$J~֨wOIvL^WE EKj9" IV?wc!2Qg~_6EJJQ!5Q>ΓuŸ׊P ILJl]w>>)goto/m2_L-Y2-G>CݞHݓb;76xz7hōx귕8Z簫~!H3θo9\ glu' ո OZ nޔu@8錗%ث y)*4xAY+F6;+!],VOP#~Km;++C6 h37Ł)@{PCqEg՗iIEm (@$TW Ƈ-I4%(~v9wK-ܴ|PzT^>{uשUQip d`f0-R}@ wi`,]Fn}ߟdg6랰*uUq%:=(oaF90)HpYapg7ЌHypw@,0qyyIR4+? EmlM`yA0U /b3H<)# QQfc}fG<6*q%n?VC<ϱD>Z~yø@M乬 2)8z蕣>s8,p)*sJcvRf إ׼0B~ЩH*dU b[ )8 l$qB-Q~ዂ~6(J$8 ][l_m51:eն P?fKYfXΒF:J㹿kbj 2E7)d+!ʪ&L*CkVz9+; F2; []殂-5<҈ח)M%G$< x* M-ߙZ-4b<$ i31hGs?_} 6&הUK$ݥ7pI̺){zjH#d,un$мea]j䖦B*bv;s]>U$4IÛ-\[ U4ͩjX9- U nHj3tmx8*]CT3]o}nQ-~Y/bqӌשf8|hYK}-\U ĀPqN=X[wX1]30.1O /a\iu?-#(u#na!#a_ pVa2@׀Ĝ~z@VX-}~MkϾ( BA_HP0%.go`f+GX/WfzDJ3fgfk+5ǿ,\t Mo1!(*b3-qJËcv7xI HԊ$3[;'|۳ϼ)0ZEI_26 D\خ.<ޙZB{D gnxQ3`B He_5Rbk7*H%Oi?DAx:[CL>F6ՖPf׆TQA%YsL0ˇNM&t߱X(uVs)ٮ~b4a,2,{/Xf+:D셧j(4ѐ \Gw5x$ݼ\|<{溙sP-2Vex M5 Ŧvj Ot9JbQap wn"[!U#F[H@ a> m3CEh˭A ;R!Q0Lj7YnTy[Ѳw^(4svp4M!GKa X(G*~sT;B8H;pW*?avC# 7Ei4SVCc71q P.6E\ T9C*]#V E 77&ݮis-,Bs=aK;>ͧ9F&2'~dLmvN̚+$"uZ豇{~u-st00&^LVDƻad L<*UΖC$Q֜>; *k_!Q)ƐmEyEI jbSVlž™LvSĐ)[VVPL" [ +^j>14I3* I0G e)]PHaE^V*x#GdxeDRoQ"Ю7]J8+&ȍо֖ Z'4)߳2(A4TKi+9q.Q"  :7rd  u?I!  5cέY4X7-ܬ=EWF\~] q2}Y?W}A}Ow׬9bZTD-,~Em/\20PAמMK~ЊHHaCB OFU+YT2 /!M:#y䧛ɞF6,uj} numyMuOz(`} (E*t=0EUk)F:ͰR: ח^(2<RLIgnxoՇcS٫XZ>k_ $ᕔ-Ě2`}9ÀK. Q7g22hB׆͓gяvWL'a>{@fRO9-h,񦃷*L{ ,l 7_.ԁzVK-+,$i6@eAɤ;mv|K4#jŵ't;8 Da/uGRu>}~TrB$,qg>lJQ3:K!.WU'`ME`U#\1%x޻~|֨ Rdh8txI}Eq )M UW.#b`bAn &*'$R#SGHKN1Zcs^IQ :VtZeW"iPS"{n=7iKJxʯUF{Vj ,`Ad3HLk=B\R [d_GݎO<3?׀ \v1ͧQڷ\<'ҰR\ͮBUm! *P*v5~b-2V? HQ{ =EE*hR3GC`Cm%؈p5H d?"pߖ~( .O Og2x)saaWw)T 2Fᑰ^2^G]r/kXm-z$i{>/*ĺ%pG6b ":?W!Ǔ \i ~iÓfv~NV LcᢴLA,nj˔BXa*Kn- ^x<'P Xg^]n<zHwyQnPT}vv$ӂt ct1.*Q`oDDYRu%Ej\PEHc82#//ۙqD&wZ~{N`W:>)X>` _uI%=Di=1d'jsB4ABSE_v2ymW5͟EGsSwh64.sv: ][x7\ ;>=aץ0 I|{X+ҌN [kFro\*4f 3);U9|: `>,ZjdZV) N}TPUw¹> hp?vۭ."op=<3?ZT^`n0|UZG ߖ)DP5(,ˊ&+?7**DpeVc%BL`B⚞E~):SdrߦBjLwt1|@tX+ 3MȱҨ<<3Ar `Lk(N<؛+zj5ޗ̠I+z9.C8 /~ 1 bMYItqGJa?0b3((n Z|')^hc6t 5pYG,K昏b+{>`I,xP[0 W=$ ~^ף&FAbL';=Ra-@F>oHzh @g~,Wᱡ G&j5PFQ! ʂ_EZ~j~9M҅ vKR"țrv'q% 3;p}}ҧqşrԾ!M+[l iLs]}OZa&@v5 /ec`${}K PY:sCQkXE)=}[K/z5lD;cV ?߳Ď.ua*h3pxMzX^aH^{Mehذ<2ETԅ6"|~N4 +7NOrtqeGIEJGwD=*N#&'[%H,^r }7 /fIгksʹ1 5Vڪ\ 5Y/΢P[R!vf s>6|wb姸g4eFhk(pVyh/#;oMk0}i%7IRfws-Ep{%~6B>t{8؜8Y5B߻HDZYd$:1JƇCȇ$ň"zΆ?Jb,XeEytͅng*zڊso4jt~ݘ򠨚S a:\o~ɝW2̝Qaaz)<U&#RR* 8d&AUYgYmQ胜Gs{\5sD4@&*vח nXzo\&6fʰ@Ь>zRB2tnrjQ*ɫ,6C.${kk0 ~kIN`2"6f1qRc_SI:XuĂ] L-1kb'u.ޟ-sq nGbS(_hb)Nה P x| 2%v3̬|s "T}lޯG5v-#fLȺVǛ}U' Bbk~-mL~lh%&+R} Y9 GU'XE-g/sSChks1wM#*a&m'X8xƯ /Z-GQdUu|2QY$2]ZQ:m-P|sm`Ɓ ;,_(@bd߮dc(ߛcﴷYzH/Kt3&XP[T5k)5hLo'ݽ5ƞo&q@ D\wf#w`Vu-Lە<遝p> i0{Wʹ{nҰ{Ab}GLzPj5b1羥t\3r3:#T1짅ζBHH m ]|fɺ"|RkVʈ5&ѾSqxHӆO$3:nOsq}p40+2Q#r;1 pFi#M__,'B?f, wE?yI b(MbSI2M$7VLLNkˡ vRlaQAXcfbK)>C _R] Z(uwP%dwzjJDfMםi*12jQYfYpٮPzi4qlaQ ŠPur ~^[q @~ـtVי/wE s;."4KJ:,% aMNlm E/C$}jihi{4?5 0^JU8i@جA&lRGLm]tjg) E"Ԃ5^.W[ho`#~C츩;rDyjn[勤w1{@G \D y ǗY -``36cbZA/Ф/C382Cv> 1*_bVkV!/]тDYktlyQpeQ+MEr @\UXJӪ|+$s2&.U*wCHuYCu˚;C7Xc!Oy/źP!10i sPUW1KmG!(>]u)u;E(jeeW<_rmL6tUikvV^o8vǃwdBJdb!#]nیc01alc.>KcX4 u<41pܸ !ھ)>'䱄,`-(ۈH4S|[lņʄ%`̽9 ﶐?:!C1A;l,*<_\v8#;-2ǵ՞@v#LNIrS\3UH,`)^s'%0KX-S^o3RͦumZ45]*fsF[PKh5{߸{V0RKXgN3\Mbhf _8?K9DJ;B$ ԫSG7e~'{}!Usb Q;Q+7Zt%PU9P)t.>rȄ߫t9v g$=!ӭ\8nJP*R:Zt&*1дB^C]o `r}DpgBZ}T Y ćɤMpܳMwD-j-gBL{|?P[S8h=S;KB#"b=c²k5Pqlsqk , 1ԟ! ^qڧgAO|=!83Ar#ˋΪk ~yWl2us58Th)f[ndCgpQ}Y,HTnZoZ`(X:m(4 t+.Xosщ MTM< P4DpbVӽ>0x D˴B{dڥ>h1%GC&VadDWz;S*lC'Q\4}ȵ1mSxx| ~4&Ş{b4lPWww ?SVP˄1T2ʟcG) .%0=ȎUPߵ|(k"^k8vQY@kF +6 L&5W[ rig(zVG6sEp?yO|pQd=N>(Гؓ&B?#g'V4cG$r.:+;pX aRţ،m/0k-f7ıC`:Q(Yw\Y [ح(W篚 k!:鴃rM0.1Ј 98 :>-Q7YM:c 6mEڑ|URD */d0JfT]bT'Ad [|bY(OdL1WYcߊV"mMnA$܈0i.Ri=KޓcL~¹,o,j2'H }F*/1a~$÷أMb%=S4^_Cpdgn4$LХv$򼑞W'~1&}JvL_Q^FJ[=EN1/.L 5|$+^Ap ŢDӢjЮݸg0פ22|ku]ّ˞Sd^@Rj_TvKCU>U٨ofSMs $6ЖbpƐ;[BH6t,5hѡg =oҽ3ЌN6D2,P!fQ%ke8+ 4 nKwY\m@}u-ݕl)5pV[Jc]"Fv5ؚU89^^%Yi D%w؆ﱃ<"Ѓl LAT&%.ʦl+H 6%۔#)%IsTk;fƄ\%T޷f.ڦRn_=20A)gJz-WX-b<Ќi(o6ƴA9>aaaC#ǁd=cs]A"x'թ占-mܺzQ)DE 6(4B?`gJ o7;^,igZmtO?^'2{.56c/.qNpgdsY~}Z lՖ&$ eڔt 8fl- UآxMԸ;J9`Um3шa۩x _gAXu[9ؙ3CԑQ3 }LFƾ,DJP&+*#T5OSM<@MV}V,| z 7k5 =q_6w*_nM㥼Q ,dMk]x)݌^/Ng%$ ڌ V0;CMW.C@j&*YoϺ>8u}Qj2?VBtݻ5S0+"]hRE[@tJN8j(/r()-pL#Mf FbjbtEqJ>NτjJ DL1g^K&ʵ?4;ktkeW )%ŀ,Flbr߈Xds{EV"Q]WQZmPRN&kdpd9vcQZG @`ߢT++X^ D%ň B@Y |@^2؛w}Ef$Td fnL]5e@)ҿO3x,b@IJF8k ɭKC*Z ˽գ%`:@zLU+qS sێ5AMb@fXkZ ^~pWԠf[oM }IW>PÌ,.ҠX?:L^pb!# Fso-7ҷ+= 3 ga(Ri4=q5~iĞoV!RAVKoM^M"SU2 *(WzhgXN<;VP田(nb֖H9 %w+>N+DIx~%EqɈh ذ,zϱR9̇ߵU0ښ U6Cݠҗ>9a8w;*ey+W-kYQ!Rn0%l);%f #RVvDuaP*Y"F04Dq'fiM<=XD!UHKlʩFRc>x?]'&7Mt DL(~⟓m'ϟ";1*%a*kY7p;*P90;[0Pt[A#T- Mt-=gq=uJS̈́-M@uIOV+>0ۆ @j)lV|3^}4 c$`7~yb'vj2':p\B8 )>' oн&/·('KYj/*@ٲ Y9F=3$.uDF~j:Tۧ8_xGg3 qmk|[:{0+8w*ݕ]J kf*׼UkX;UmBXYQZ5[ke}f4I>}PE# Q=Oj-|ql+R}ӌz2m3%7ll}M.~OF݋°ɶ;՟t33 <#^W鷄$OGAc2H(ǡP[ߍ9dI$)"3`+o14#TZG`^qO",[bBz+mɦ7(%PA8ᄠ+]]#0RBn9hh'Um+Rlىy *tjkK>B\d ivWOfME$viZ*/,K{_rV (1Gevrs_`j8hPUR=V4x>uԔ߃ ~Oำ P{__|/ljr#?A ųu,Qz$0p+ <(Er :LFP{-gIl_%W9o\: xs'﹉ԇW Wv?d.w*.HI ػ}o; naE T*Tmyǃ\ۻbazϫ3Yj^f^LVRp2f'XlezEqXԭx5Fb?qSް쾶kNֶ6su͇'H Wǹ[=+XQ¿oWʺߦ5tPyFJPI/,:9:Boh!I/= 015-MI؏Y}`QK(pN589# Su|ao#AZ7r+U- r  .lxQ<ʠt}m" n{YI 6Rk SuBr& thᩋBה}%ay:W,>Qu uR/kS$MΠb(>ļI]t>Qom׊`Ғ!Jez(nM8tc ZsQR-jpc-saGǛ5=3&Qu+xmȀu%vy̨,2ŦOz0g"-$mFJ@i rm=QX l& :b*-BhT-*PnEgd,y,(=3ΒSLK _~g}]C#wRkD'~.qgk`@ e2Ol21 ,Ѱ؆Z՚OE֙cocbOjH:g wFʼn1LN$ChPfg mF.NRn7c UKϠu+F g[m%~׸zW}X4\JZ+o?kA6Qh5r:8BVm9c]v l'qx vcHt4)fGDsy cFŻّ^7ыWClGRx{}#r{n.u~Hyi5 >]jhH`(m$3'<3#5$3CJNi쒃ps[D?h͏CLIθ)ƜC֗M]2 ck`HWM['i*LCTjk :pIOhѝEO!9( _LFJqb\"ȋQ#vY0߮mlXBjR0n7A3|K`11'lqVt)`cT us ,"= +j jL|),uW8'-AbcΝ_<X4pRkQ;XfJаt)Df׹m6F<5^5cxM%$5FsCS6D3Z Qnٸ4 83̞p +vH'"x**:2 O_Bn=f7L&s3 ']KB!\uzʓ5y=f9~)ITNl  ~c+^9P+`̘ŗYV(*_&AٔHrD& s_ je{м۰VpC.AOO?W3S6jyzrX @!Ր~؋U0\yՁE#>ELw_EnrQT!J)r0\<el01T N6OXlS2U9sw#`aSvMP?h7L'hx9{謙 !_Iřat/gV\ +@:~iWQmzZƸaWd†ȍKqVpQ-{5Wm =?uK}!mEToF_^ڽqqq'Y E4ktKkG u3Hc"jBQ"Ly۪ ?Ŭa 0\:TzP8_ GLjX3T?-͓IǺ%ڵ;C&͎o㡬&W v&Lw?'`EFs7I2[UfIasLVKGeux~0.pI"y,Hg,aRpZ6FvXas8Kp:{낞VpVM46 Y܊tX&}x3o[:|tIjTC_,)L[EYlWl 9[{m]"R#P Bfq=l"ɵJ1#-W-WЭ-+3fqh$2];P3s;} " d0Mfudޝ!コd| ۓLESJ&n !Zj[=~yt0HaP{wK+ b]OR̦v5@ h$RYpXZD8&z0Fmi2}o ź^Xvޢ,T | BvPƒ8p ˉ|$و޽ F{!ߩe)oRd"ԀߤR,J728J}xQ;N7[;sG^! :Nh2=Mh¹2$8/.ՏI3y@4J#kjC¸!rdaCL;*^0ov7d'gF#X5 yB)qkHIpfH<%ZF4ļw1}Gw E;*pL{ɽJE { qQG<Uf ?,=K^$ d-Qei풎و|TQURj@Ecˠ+k& qjdQ}FC~(m#Vͣ^#gŠ05`C2ʒpbRsdzerou WͪX:dHAHLu݈(RWA'&FF@q.]h'`?110TkD/4ש 9*@`tQ&5e! n@|~6t=iO9,m&Zvv9YъZGRMMSw^~v5FmqӅ/G{-kZk)<kKe!eW`)0qI^ y[2,|l޷Qcb T)|+k&/b|c$dnɞeM|ZwB4!%n]C 6U]'58/9W|m̛ W\CRbn|#;yvZ.\+bP`,K*W&rE? ?\xLV['Epy 1$o}<ƛ@t{69Er<; We)>9[p*U|y\wO8Qh螘ԲEcӴ0/}G# R ;rT\}{:RhY͕:v~pN]ٻRI!eXRиעj.:Pjw<"_b2^X֕|q\3̔ ̎%,IxZH:zi9i8-[-zGp\Pd.OB)ӢXaa@|]R<םrG$Q;zoVِh A7׾YCaGs02#M!+vOݣC'b(}hSus3o^׉Y (٢_Ϩ"^6p0eYf\ }JIn)$Ȍsú|>9{l &s1 FJ<*6FG]M͹pfJ_`Hv!"$Ԧc z(B')`jA1S9w8039+$Xx.I&5`B [z O>N˱q@9$[/sLJ%b?7.O$%"ĉRس:h¡DUHQ86,HI)@$O\TJpV/k?^pZ~gxa%; M i5oBk{su"UZ'aGql+ MǪ!vSy;rgXW0n% IIޘJPa4͗'R]9zsAG@ט7T_s(MI) ``ħl]lKeXV=Ɖ:O6ÍOOܷpy3*+~+wZNUϐBb5~4u\HwOC]E~pA_A~H(4I ڤn=c[7ޓ-xT 3z_? $ W?\p 7ew Nt0: i*t'G 3΋4)uYeb0 [g:{5+e+]s+1ηJO% [7t_'զrHK $J툟Y/p\UytKl^9#oT+t"߄z:JH nۨ]qjD~\`5OE"\NwQ-McKffXL$[ ڙ~U_=ǝη'e`T#/NŸ;SZ{D,#`>pGӄʳ Ye/ 7'KNcT ,S9 i +wJɲ .9;̰ 51|\'~ÍֹW<3JyOY6֚t?D;yA?-U<ٹ9[s ?f0>tĴhڴSR#Ų>8~?MVY#s/ɧ3VM-Okr ! >5pk/ &ܞ7vl"yg\B9?F3RY k7z N8 e3t_joMUY]Ni L y ?-- -I\L>I}8uQ#^L#ˊr !_S'OIt۰NZuxw|[xЍ̑)ᵩ9Ճ/8 !#E5ǽlfsLDW*Rץ[G lV 6},)=+R7w}$@9O`ɮ ,m<&:];;^~ .p* I^rq#%s'ag18\׺9?8)JRW (j5^\Q+~>'w.:z(y{CZ.Vid]@kqV=W&[)" ~0{cWUYDBA7 V<·kƺ+8 'ޱgUufj:RmiZBk7C4 \\v1S!ij4ОwNRN'ݜoB>i-qc ^vxh^h"$'>yĉEĦS.}$%{մ<.ޢF(vfzꏦf?\3k~Rи}G ^0^> /Xܢt7g񃎐a?mʠ/AuA}G3qGȚQdx|"i[M7mud{|rǓ=:L<@BH&Gqɪ^nD`OUSL(b}¾~uUP'ox[;z/h,Iu.ϥ3erTX yG쮜(@%U"(C]9~(bUU/HkN(- l6izV`ǿ%Mv^= nN K`YÊ;=\RnۖD;@{/#6SaY;~F-kqt{ƲL "@$9ɜԸ}n0~W+h(. [G&Do= sg/C7[ţ]/}Z#8\1׌TL:NʋJh -: Q?cyޖ26|=/K] }C܉<<ƉbB1y<.?Q2G5Dw1P Jv.N($22bt:h۱q(;@72"+G8Vdǧ#^Y8MyL 5mu,:!/`Ifto@ {uМpQ: Э7ELňlkI]Z{/g8d-b˝љtV=N)WVx"Q'/7vJ")C}e^K q)_p ;-i?k¨%.Cn H< )zŕ/ &ktG>QrQ9냻v!@Ty)4CI@h#͒"vaݕ]SY٠0z>ϬgnVǩ7!o T뷿Sp;Y(aW֢3kg1]LjG f-OPo/ c/O%aB֞sIy*̹j}e3;,6J EL/#9XWom Ɣ疤D x՘npؙ-M"~ua_󼂌ݙdj&T.BɴDaw7 [6vNܰ-=0&K/wZԻ %o{1Dl9}JǏ>h-6;+?;Įa47m9"4(~i^ÐpwA)~G??񊂆W6>/*)0bBcB* ^z|GguAGaڊ- T>v xGa7\Kcmb($9gȣRq{8PmurqE_f0B}'NIҮ^!ns oQ~, a Zc827OD]~*R9'NT]+ꂾR&帼;NevUZzR&k5۳L2}x 40"zSݛ?$BYSV|E​+cMlP^+4g8F'W@I6ɭ2AL" f7LcTb#b20|-5䘃O;o %tWˬUPYzK|/9VqO!\$;6\uJђXH:R6ɤbjws-#+HɷB6wgWTߋL?;A`5? =CH2qj-:M]r/0Z-T-7|xY|^g~hkO-F L4c;Phyunba~0X>"zt9W %6qYToW& ʻ|qI38% 0}) < Kv)EV:l _R*J(WRg/]@8ali"1SGe[*hN.KD2}N#GSgJs%Z}CU4uWzVٯL ?6Nb4p,Td0F\r@}ab#_t < G\񙹷c5ƪ̥Y`IHy=guZ'<-0*1uۭSce o1e+ˈwm(\Xǯ],bOum!ALK&o)pn :mV.-h+0 ie?J=b bpЀїV(2*Aymdv23"<&5<$c`S?aؖ(A5[@Z:ؘ-Uخ |*6CrէYr~kbb2S;m;}!Wq; '/4ZV9ލWBs ]6G͍62ܝ#ޮ$Jf`&ݩ͡ JSig3[8sNu5c@K:w ^}Lϣg"F@s$Jn`wh#G`t ~+pc]? ܞ$dر]6$xKjԭD`AE-j1QVIR,eٶUd@YqK_Ǻ斮ݕ>ކdC<0&ϛ|։LRn]e]=%=J>r(O#V<4d!BbcUݞKiwo{)ٲVCUH #UB 8M0*" [bF][;e.3 qB kkrp3FBUeP#Ӈ iHI Pݶ˓-7H=MXl {zv`6OvWуj LE<|+nj&ioY IOfzdak_hToZ 596G P'WK,l 4U8 q.OexF5ܠ3-a4eݛUMBx5>)=E 9.Z#nI~Ѩ $/e]AjQ]g7L#:B"~dgz.%0գ"doqWl NG;k=`ݠ`#|>tex.BnaaۨfQ>NOT2g5 GBNsUJ>K ;DЧhCUz'kG@p⽀; Jj z@~_B PZaK/ MVUC8Qv0g]xW}zhVN_hBXdưgw5O`W/0R/nK `ˏM$Ѫ$?^!ani?d&d{C9|Z*}gW̤ 7- ֶbOo-ׂXC]RIJ(ZcsQ&Qea,Ol .;leN\eϊKrI˾p8tK 8ZH6kStTl6A =.S@ʧߎSG^}"a38rϻX"R嚝CwaIwhZκ[PTw.(`ݜ󝠀=$V< kŞNWfZv`AIy[$So쩫y)Cim͏ Wcps #^|/9۰tٗ~ZB:/Ǽ  "Hwwvvi2@4$AZW A{+cF,WHO !eJl#i:q&g,J=6DWLH4o/ `֩Yٓr "]+ߣk2{0 8dDF.igȜ( /C^ [Y6DE>*._+!|eʛ&F('YІH[9-1ev)b#ՕTLJzp֜ ׇol~Jzo#-`ߘ5Rc.?йw̋Ju/ݶ)2#{Ut4l%E"ܼ-:)DEqc sCD/fPֱ. On횠DHD9n3t |$AAtGZZ(vMwi:%5n2$/Vy]G~^}2MFC7PМk- 6 `h=Ywm Rpd淨Bo(𥹉kn9iYfX,J*EgETy;"ڟi8 R=w0i 2%']~F–G|L2GQ_ʅ#7DDlW^:/-@CsBbz+DA%H85h04 K5q+yټfx>S*ޫK>i /y:jk|#`<}]1:c.&~ʜn"͚hn$/H.xwnӒD@zt_zݹ~@#OXuQNF~_9?m"T-RB6UA^߁E{hQ:&{ɶaRn:.ZYBş#-vJ%&t"Sc%a5> ua7Ӟ-:̵]1m/d2 tp0 HU59u e$1-$q,ݺws &>emPrk3gʦg@3IqԬ Mt@ y(Q~{Z6 R;$vv y'R|\)6ȕMsBŚB;s?>h*K裢j)AptHДRދ<O4{X.qF(3.=J$`gC,&^w 4(*9mswz: (G\xWcѐ!$iLӍ^Di33<;Z?m,ϧx+f̓S@>E "6;VQ{^a^'p.Е?3¯mM6I7ly}d yY*2bbڡI6ϐK; eu[yj@+@6IԍbԈ̯T̬@Ku廒?!ˈE9zV{Yy,TҜLC\ʕtLq"V{w} gbcC1LP y۶ e)Frd.xE*e`}7CVOx"*#wC :* >e\C] ҫWY{좆R#z-!J f ;+HHZ`!)8omNjV!v~=5AO5NXPz ܻG Cj }#$i$ZYB8#LҫCÞZyBx7!x' *" e-1c͞iQ\^Ƌzy"]o9oVO' :!?V3X1@=AZ])iZ5rcCGB f C!V<|~T==ivyPƢN)OV҄ȳ釴]kNJr %Bc_bZTuw*N+$]}%Jb<7GQ2͒)<~*r4O5{~_ on[dlv:=1<-Ripf[]$iu:W72S>SZ>Psm|^/i+9}jEKEC*IVtn7g8W#VrIq[\Q\+ELE[3`I?IBU^Fv4.pԛqm}:,/h*#^|nZ(g#{Z4\3s&4?J%)K!U6- ı0Oy+<i?/7`ܖΠ_' a2- a_X娞;s ל%q(/fcqtG3MOfO5V grr)!`)H`z(Ķu$S 2޾f޲OMp .@ Vp/|$'2`=KuYzq)9D+#6l*DpϳLoC()aV_٠'&( @ˁ̷@j>?ч.tcDd(t_ &Y`H*i@EM n::בj_sAGdYN$wLALt!lA 63Qj++԰ e\#U ôόm&,i&\2rwPu4c%hwug[`4 K\QĿ ꡿"mRJIe(#c> j_g.O飡w\ վ$(YLKH;VuC5{qUĭӄ~۞ץg%K_o8hz0 !7q=]+G 5﹖.PD"0zWXW'o%r<^+贕5190%,  G' O6dev`)Kt?NPZ;M1)ŹdB$cK8UduffBm//JdM&{0a\~k4SYvaX,PR"Eƾ2@L/{^Fm ՟.:% /Q~1+p*haMxhq4|n{S2P&Xti] >ZU70S*6PNpl-^0t l&̊B|CsVL J*p~:&e]u9(x^^?k#J3&s2.}iakR?D.5j+J6?M}(3k儫GsP~ <ڜW%CsQy곞e$%. swB,U(ӑ}7p&4#tnףhR֠elKƏ3X[ndPAM$XO0%?6u=[Xx\s}m&gjdzKw_t*t3}ڙQZY8H3>P. n&C 0GHaV[tq2!M(gsgiѽ)|`Ǽآ>xTwN;hx;:09蕎k&r`U\!gMJ<%Z (7j̈́P KqY3 pP (X♱d𢬢'nLN!.%jTNEeR@j&zӽ&º|2;ma ׭I@ dƑ?bXh%WTO~vcSZc?Z9,F:/2x+]bi\ 3oVՠ+Z@E!ޫD{υH^%ki/3 ]䳙cD~!v?+96NҌ=HK:8ЎܶȰۆQz&1y7!6h7d{_NOIٹc먴M,M0Oxֈքi(ܠu(mmTwoU|!цto?8.loco״U!Fتa|]/,_ 89!K/&f$XИ2 7+[U JP~Ԫ0rͯ䟑N4c}.hH}G$S\{/P(@w88xReq9PH@013o%|(Jǥ'Q*J'j<HyG9O-1*'ޢ-zꑒYGB :v-q_hr/!ͤ^)h! Ԉhyz`풝~[bx$;"(KCU]esJ)%y>uzK1Mfo*Rוyi1ZN}ڟ'$QlC)MT_hnDjdÜL.KςjGc,\v7Bg@ǘ5fT.E{/ƈ!X+`'5~c >9RdTzhZ|t}fN")R1YkU 7bc4SSUF{>Ê#]J4 `Y0]2@c,A9JhQ(PFـMO Fp'gД'Ǵ Ozm, vUL| pE,7A*< YruUR⽦1O[&?0EUq\h6 F 5sYncc{2[#WnR-w1f/I5tW\6/=N=#n`$.t 3CR94?j1Wu_ :iȑ  v(q9Ձ '#kWp=݃9_A)XKtS%ʹPW&~+_R誴ZdvWttJLÓޡ09|0Jtk_v]QZ &X.o%D=xWXX|@ӗŐ恿^)*7^ 3xd-tCLn~31%,^6^wI0ˇ]E?B{춽bj)Yx2M?gQTiԕo/'ԫ^~5"T4߫;CW\\6?P*R w!yptk_ؿ5ňh]߯g8v$Ҟxu-׌i ۑنR0=Կq4%0b r.vk'8[ufr'E0;yE B+QķaŽaϴs'I}.OYSi HO8PxmRj:+X]waN7>@y(td NXp| 5[mawcmB,ae, f|qaF )Hxї9,гal swBS˨5jF@U;-ί p}ǟ$8mӟФ +R&'@/2EP= ^1 G4s}sŦ[%IØĚ>A!i,Yj᪃iZV! #*]A9?I_1X]]فoC:i8 鼼R+*^ZJd s]oEDW۬nd<i7|G_ =H@ܲ yPaFar$ir`x jpĥP=R4Pg:9~7iR7o\\T;\js/!!t$ ZT \zRmvv}ؼ5w;$6dZ͝Pp< 3GoYy`.F3<ٷSrôZt8uTXTw M.GoAE'Ӂ*Ig4艘[Lۂ~7)}uqKɺ/my>Ho.f:[;{U q#6ĮVx !3T&Y؊4}\[ R6}K fȸ!0s1nmaӔnױStXMU5KPC c^לQ2Ja[NHTZFNSqj-Μ%J}R| [5D{9>V  gM2.ͼR(gs+P}/-l7 XTMCWMzJ0 Hm3ŤxX2Za4S<) u"n7#DUV$92ߪ!`B*5 O 0&}Y@cE mϾ[7Cg/MYʈ iLJΒMf`2gU]Ժy>yXCQҹ{|.~3U lOMSZGN~NIp$NBH4$q._$5:+I.Ž_x ]ҽ&({ ~UƘlo鲛"du6\5p DFŸ'Մ4rٝ&s.&ʈ/ty; =Zj=ZYn=ϾV+y y14^}8^!8W{x-mBN {7mɁ0Gf Rf3:Z4nq>a:LP]~#A< u6-nlNKcOS<:$S.j^DGK}'R}s(9J5Y]櫿[-}}"bXeU(9'M>K&I`p|Fp8HwSpo.y\9>GJ^si;3rT!!*֤wۨWW)=2(iդPb˞`'KÑT[ƸSẲAӱ<?>-/ 3o v? Ƌ)\=J~oOp>.H*ۼ9 E^%h8Uy-?GD`F#(Fh&>omth&(BzgO>g PHjjJ)JZ^Zޥ.^2"3Ń&!i|!l1,gɿxᚈP1-93Y,lm?)*:aҰ)-;=HƤco!4ٞ/7F?t"mq=Du7v:,&fV@#gve|]iLYZNvZ@'{>PfypA7e\4[je~67ΰ[Uf{A9)(S6lN\+4x~A8QO?~eT,6OP^0s~neˠIyGqB&B鬛}HS{`FO$J$w˹ޟ < q۝yS9E`!SVX8k!řzm`r-w'?s0NHJm`tS ܬs*4ANvu 5^u@8\j}HX)H?ԘgI52ɷ#!N;‡c09M..{0oq0uzU;+eU%"clӜ%&'.1́Tޱ:xdnUKN6$M85i3!=BaZrm@e TT E8ԋVԌv DNYQ# |~qVl(TG?FgJ(&PY c=SfSևDA.gFkumETl}Hs,ECN3g5 [àq:erdMtY$!O7;Oan>͗OЩ&ߵ< ; %])h YVJn~ l (yZ21Kf0U)[r \=]LVkt+xGU/)~f@Ig̱^-'35G=x%fȊG0i9FAvwג xg_08MF^6]w9z藺u0GglĨj0 xb*o?9m.v3$?cPq?* wҿF%*NLSѬ D,fkױEH'D/&S`5FۘgO@yt0w4j$K-gC`è۷ "nL C,;6vA;K4/\jj._9Wᘏ7v2fg;-uЖcwZaAԈ m {kMvOp J4Vծ~-M8jIǃo2UKXLX 46^+B:Bs6 X'g_Vbva8FH*\݁mzK0tN0@\)JgE{Mlq֙mC@yr~ГvGVÝG$ eޫaƵLPҺD9H@Sϛ^i;:؞Tw>íV.jylyΘdzWi ?3YO.HD;}K[}$qTdeQ )+,$ 3+c*f޽ko "|;s-?ǛfWv2Z!l R-=6 ⵶ɖyrR!^RhCQP[١rwlo"+%U_y-~EMw^zؗ|[Յh 3XWfêmG99vCew g{N`7&QlX*QT nh*A7,#t`rui0:k;:bTc \>,#R *Yn{JQQ?~2]ZEt{x{-ۀ^NU(iEϢ6 g[I5(0y/"$,fvRھ+J͂S }]O9By|J.SH-wD֣ӗ3#ۖL}30ٱ@穽i)Q]>?w^xnBGʐ4$Lk˓SJMbA;>j!%9\:pٷC>[횭<8Ԣf+ܖV.| e>#Y仚=%A3̾e\)_Cߎ#D{[,9igS(t]^N/ӫQax{w4AK+X\Zه.o'*]bRCBI?4 ޚA-^%肌KN]uES?@TckAj'U)aTy@*9zG=OBPFXȹQ@[͜]LLߵnlFnVOɂzd3}_jO)}.&b 8+&-Hw`65S_֬}G})^iwjʈ#!('=#|pg w/135 BRWW=HOz}pPso ]A{}KǏ=r',Y4ALiyT#JO` LR49ȉFر39c4\xYJPDO'dNڍ垖Å쪾xj|A˲*QZsM:l|E%o[5 ȁ`{Gu$TOh]6qxt@Ю(/bz-"@ʿJ#4HI t qǻMa$,dq&B%.ѰggRn97ovR/7W!ݿE +gLZ|r8HQx1 Y+Mc`.=aGH֭hՐQFxȥjwFC눩|pZP"ci& mN۱c$Y5(DJF%{u"nČ?Kq ʳУj-Vޫ5-O Kay ݍI_}dB߶?]Xɶ9ijT<ڜڴlA=]V́k\]L1Om1@SįCkIp #;]wGͿ70L녩1FmH3(h$1G&ɕКb`vQjK^0v(~x^k!%}95A}!)AA'h^Y|rEȖ(aw_4\ Qܖ##HgO *,75ٓ Dq n9xrǚ& Ň5^1B{솁pq,.>CWp13hwCs5 ;̲r+χ&6 y.n bu7u/j|+([fBn j7 Spfu:|n 'iy0#\UL V݀o]d]l!}<[.ٸ$3h|ަ/'IwEh#?GPs%MHq Uc|Kl`I1?,B=K@D-qw,e:>Q}NsceXĚ۹9Xv"{Q2&..;yޚS Hj^+]CLz?^"֛qU5\%ҹ) z6CM݈?ӷ3񒄳&F'qѹTəDc7D E0ɞ!Mo$İB|>=JBYک2Ow[AԩrajDnu]u{ xO%5aJe}mq>&'~=;usXo%eY~[9&ߓ >pY/&DFOPkfgg2eDd{{[HG5o$ۄm#:."EEHuU:QcEƈ/m~swE0 e*RO # bgHggtÏ CXݾ`0Ӿ"")Lz(ū~x:iwyrrwۦ}]Txޒ*E74 oE0xn٥soz4OA^t CbD쿣slH.uI`垵nct/4}+"[z8@Sh'mXqu?A3.X))ioT^5?9F1{ »0h}zqAMx}LKs*h sOk;̄*xD.=lWkU-g7 v_䀿{TK\8B86,5Z Ej~߿+_Jir(k[DZwryw{%ꯈ,]oJ`>Jvt|D+En'sKD[oAT1|CB-Ⱥeϡi(6xV`ҥA+-0)X2nY0=tcp#H ^y %D's`ڊ͙ޔrJ-xuU ET3('m).Q ٦iI !\Nj Tv_r! rھJ2~qɳW. ^)1 +2&z}KyXf<A=N]~EԻt,wJ x}˯{Kb fWGD)O>'ne c'Lx.T4 gd 5wλZ&}`fVy/R` K #|4(L%lk&1GN1E D4En.HXY!l6RfbU\cײ |hIᅣ`aNNGcB@о1 l:LʼnH>:%"BE'I끮y.=9N$3 4%~0.dUqOJ"Vi^<|cđv"/BC2~iSQ='S)=^RZ{'9C}fOgoܩLSSP!+ɨxwպRAɹPPSGVL&R4q9kzD-3*[f;jԃtSΓyJL 3>u>J? @x>ۗG; OAFVANX<'uIuL|,EXJFp6@Rς +cyiϰalg&A=$?ah< }Qz^jI3/Lk 4I\1>ᆁJE F4mP6szD}fnrH)n;oۤ ʒ J2(DXMfQ[xp3-~ث/8DinKGwUz3]ee?!䶆Mj sAzx{vLTc7`l&[پwtTEG~h =w8[CH>r:ce#Ce0JeEbU}-ˊv LWȾ]6O\vS&Qkӷpޢ&<P1WB ts-I (PPQEmA<3Iղ2([o @;S=>mܽ: 6BzNbǽ2 Y3r pzY,!KŸͳk;,\D DJnAwe9s" v4,1aFoM,H Œ;1;CJ^A:iKKuڕ}8;=oa1M +: =$4MְHtΟG'S&Mc\5'yaI 2 mޛ/FʎNSI\7lEٸyEQ `ײ}@6#4Jq%:x[YSO2$1S<ܑfF?Z*FW$䯌3MmHnʦ(r(鐃S!aU3oX?xtJf,EV?-ѥ[< cNn:2J{& woUI#G?709} -O+Pi7jI5Mm$^ֶ #UgEhv4}w0>?_f;gTδy*`cn%SQHt, mӘw|rsޅBQm?މǓK^4忳ھ jDٔ ɮÁR,w&:[:0SWFK.6Pu9xGmdvbYFhųFI ʳB0cRqd&KK[M=dЊ]2^]+F}yΑ+؁0[9iVV-%D- 4cL!M<;h$s43n{(I(g_6^]6VaB1ilo|e,z[>aR,ɗH0+֦'$jrs1~--s R*mSL8^0>qi$x#Ă軦 N8%*ه#gvȞߘ4MڳT_ՐiY茮1?R,P4d &Abz )cMz:Nlb\MJl:LTCo~/{*O't!10~Lӳ-caoa(1H+ewy Z@ծedH jm0bH( E.l,V ZA.8i+mx_dyxQZ.x7WܶZCEtD AX{Cߒs:'\V\;tJ1]IER@2cic L*),6i夯tn 4^Q\I_/UcW4T?u rS L[PDXZ}(SPJzKn;@<=> cf}`~Pe4ԟ{kZbyb)#6 o1Td:\_^hɿYm9}jV(0tJ@EA&K4  Io[c˥H,ve?*hp̨}貖ȉ bϧ( I/67][ LzN> &EVz.K~TM9Vޟw} dr*v"D ԇ ؗxc`D&SD YfhJƖ3XxyBZ'x 7ξ -PW֏¡RѠ]GjLK,4JoBqh*U,u}pg\@v#IB66Y<ڗCyz`8QZޮqCB<%^}g-ڨ$*L s0%IZ{c2X\LLhF]O>!8^ fпª|{"Nu^O@뀭o U쾆q%BN[D\d-QB֐X k6eyY 9`7jz?g;2xG C9]bmm2 j#hFӦUYbudfKyR$T>g﮷ uVfw}QJ+Xzr_/4᯵s]O2\10-P }Yb|a名OwjnMץ7@BTVuJ(u5*ፌt>"ԱNTKJyfbZ*/դ8y9l-\`޻OL@Y9ir|9 =J1?`(]@]{GYo0JmƎN;%m2EK/W?j_X\O}U eM̷w;Y[vdOF~ QTE%P'1.}Qtɣ ALEm(9N6z V-ǨlCڿhE+wi r^ivVT[<0Yw k,ӮNF&6[{F1xw1ub/eG+XmA0H27{!*8cXvӥGE7w mC/_ng:lS+f5kS0HTu8 g1e) Z=iVgU t5s`DnZD^(Ďzdz,8eIf+Z* 0hڰ1\gEˏF6hnFVW^3#/ji3#z"pEԛ>cQlDZ㳺%=Pw?. RL6(5"2~K3a17=aV@W/ـYLOSMxd#;ڛ_h|]62v \d5/)Q~&1ݧQD4h*"(BZ/]9m ۩n飘0=J ӊmJ8j@${Wܿdzp瀛77j0?H VtBTNil*k.0mD_[+ ܯA[[Eĉ1z~a#*ͳ@P@ )n1ߠ1z`PY~K䎩w #ASy[Wz@5b| Nt+vb0͂Tp~b&Qvh5e7^2Hrq@H.{>'[x.pQa:*cC+x'X=3p 6iF9Kݭ) #:̾!";Nu"Opi6+V0Unaިdߡ|ec$^]I#)^ Kآn~.30©RǿtTgRúTi}PUȔM!jX`Q(}:\ΛF{4ߺ,*)}ߚibWt4*fIB66'@x}qW_!.=m mP5j7+7xݮ&5!N? A0 >/^!AfQL%> Z>\hyTۖiP0<řJn(ȇ6Ob}%`zl/,7%Cz>Ľhxq¹OU^rJA~eԐhZp-L%101,FsnG@̤GǛA`)4ø&/J'~] B+Wc.JܠnIj"8qG)qxZ=O\B9kxflPaqJfkCˑmQRH\u"qH>l*&9.JQ'fCX3&%cǔabAs$i#&p' j9Yd LB63VX/w 1ێ?FIC`!ϒ'S6>hFx>6KM<t  ֻZ}.D CڌF1L ~œj4jjkS.;V2ǓEIiug"idb[A$53z9Lh}eBfAzΖ 0Ȼ(c )}_L3$\`za 9=\ wA'A4B7lq0Ozd8q&x)SߙaMA,dTJq*. b>G^;)`H6?˸6sNPa7ؿ$Iā?juKA`N?z&(Sl EA J.Ǎ}6!%9Yj"s/T >v 3\Q>e6+o+!M#n _M7 GOe/ a'eO0>[Sf-e'>8 坈=]),2}cx{E%O7v؋ o&C? }q&XP~*$Ctm m;6'v\g=dY Ty^A($g&PMpd {@Г.W19 XSДJ;lk5Ƥ)ѯieqrTj>7A2޴q't{?އ {DzsNi> pdRd=Gah}?Upcf|eêʳuZqC{D='~lۑVUm7_2 ňlpFW+5F\b x̨㌋ɘaq (G(ΔV*~vۥu[b$[bt_3?J9f%v=iB`_SEq)'rsdM) \#_nqo'c9c[AN/߆sZҍgxIgL<:L.;n`MHt=.X;ldgR_>Xoň_s'Z,0z/ c蛗iO7aI-&FOg|>=l#*nθ ; {܁oP H%goTڸ̞ Vمn'[4j@ ]N*,TVLsό(<,ak!&9vdVL)U[^dJҞxĎe="u7ܢ1@bο.1rCܟ Qb(3)["qfoԊk´שC:5†)67sٮ!M˿;؋j"I mN홀 LRVp㊟E= &T\؃(8ڏ$w}.v繪FT c *0*Hz^i %آǦýCҒ4/-I5]h9ZehnbG`hF`Pf A&%e*g(-'0.y X׹ͣeޥ9ݯsr2lg mu$ l~vw~l$UdfjqJ0PZm ؏$"RChRJH`\w4CM2[^ HX>C[|GsE]A[MEnkVaPB@gmf^ N$R$vBF0 H[8ߦHOuhIb>3~'JDXVa- YOy$ALY7ؓ@94̑tuKke0ey%4Z s1Gd3_]"vPE9 TͯviR7LX1O|Ɓe*.KG-^^Mr\:N"6.rc+LZuu? ̅~ϱ)qķӱ9;hɆ׸vbB{ni@^[lK˧&"m&PӈSۋe` \Wzϻ;?\x#6}_zҥQa;E~nL^$qa]Vtj V)OJ,AƂ%oN<&?➷B1Yrn!,mAVk'WS*OM+cx:] Ȟq_iNjn8u]5]C;6LQjcPŴǪ<a~v{YBh>aȓ,=}AZИr!Ψxz,ݭ vU57 djߵG_h/C F_,uBB`mZj šQm`M#ql_}m<ۃu "΁[ʮnJ,vGW[Po 褯OP}P]`0XB$Pn9hldQdydA ,( xT#5@+]U`/R`4e@y |sv/fԖ|M79^fH>ϒu#嚎$!UTyT)`mCdc{r\JgǟWzp K)NOk|ee +0gyS-|\u2B2|)ě'ԡ? ~*f6Zy bnӳi"*l#~'cBk1B~ xʳO}cy3(dh/դP;4HmrY}x/v4Iq6j<{l_+vCS&0^(DG}5qK!(+ VhvBH^˼΋=),e^^AYkLڽ5HCTh|.~" АL≋+v7b$Iq6% twe)7|e*Lep'7OA{t0:{w[ofA~w$}37 Uz+Y3QXw=7_qAe_%L{(FSl]izorw|\~dʤճADa0q SytiZ$HsJ1ު"Z c":\/%8NBHҐ>G›s_Imҍ Ϙ1{یx)דZ{| ߢ<"#9ߍ~*p@i,W%:NtMGۋPH=zqmޕi#KQٰrͦƘã$Rnzmc0wK[P?$?= AWMf\V-ȳ•Qrs_Kم ӦCmFAu`[o)ػMAsy5ru_DN-):5͕I~06sD>f{GF+]eLyME> \ $s)ܲG,(V[\U}u\JNDZ03v:]mBIPfz@/{~L9RvLxp6VZL3{bN[S<@ ZGʦpȢ'WVś&?PLDO:q*~z>Ң؀lXfR"2I*F9u 8>OrLqa  ~QۈҴBɠ6pИ A5:šdH-@X1D4 h"((FS]9&|Rk'mBqvzn^CQʹbihlzڒt`V@_gHk04{jXj ,A%]7'AzzqԳM Ed} zF*ڳ&ri4ʄ 2ښW9hfF;D>KmGs0#ORy؝ɭ^͟AWQ=R,A/NbRx؄=F VC+:d sD Y̬&kՑ`.])M6{gGtby\u=0R8ܶ?М%[X50,>֠G569JRC/cWڇoaMD`y҈~bpL"l/kDlDc:g9@T~<ѲT5{ð2VAit(3zRaEQ+@ĩ*&S4_б+Z1.+zTedY91,Mr5%—X]gu xހvn#%#CMLGf0boIĤ+7g^".*rl=n 2{S4d=0+~%Txk_Ex6gЖ6Ihպ/DV5!Z(>t3Z~K Sۨ9 SO& o1i6'f=B?īL9KLķ0)҃z@Х#W` Mu5^9{ɢtF$A0| >JK-ZYkӛ@uӿ);uܮ*9rt;&Sj\ieo#m\@An_MncMX^4gK aH5kˋvOB1Tda/0m_׳; 0A/'9*\cx`&D&]ZwmHji4jny7U|m"lj1%(St\*%q8w85!BQwBt uʦw5q ŧuϣIiԉ2FcjrRpэ]E|>cl>Y F@z{..,!\ZIiG7egEn0'%yJ4aLߐWU;}GeSִ(JT%`+h3\GzFHwί0.v *[V U-v\XH BBFt2/y)c-Sr$IlNUL3k5q&ɕm'N!*n-ZvMNj9m%,w#啱G;d0yXG] dEU!\mآnuh)X4$I13Di -꨾>k :<;ثE V=h`K|C:_/G`1,?RyV\1 Xd&bn 5&yn ~`KI'@[V[:p_0iBCUEZ1#n}: )zؗ>;\Qw_(&p?Lm?% =Ҡ,>iJ3'+3!M%YE;?`|׻RMcUb9(d`w{*I;L'upYN&5xCȤV95ЯI1:\ٜ Uuު(c= grM0xFQa,,g7Rq^N+t@"G =U+]}ӹ9ut;: m䅶kB!Cކ9:e5 zHI35M+ *mUcܑzyo$w9'gRu͓$1l A iY{:S wx>οL׫==<4 5ƨ /a)0؟݈Yw"h enRډH $nCXx㼅OCvG o[AP1xT"җ0. ߫7aq =D̓[xl>V;'Gq1NjohL# zn(-8 *9# jQ ax9.a`yЬ mE @ˇE VP0z^!G9eLfns]J4W0{ZDءAN&csE.QIf=!LX M"?z|)錋/^I7PE(`<~" L4n <*H=xz,;^}ދR3Zcq|\7N7yKw"=$fNAQ{hҵCY\ zl!' ^u)hp Xβh6Cʼµ4ǔWI;ASi-b wX  :78@bhp՟sjR!y;nO ʠ[p`}iUPD^ Ր-%Vu078\jq.|g3yƗehкU$ |z}ִYS8b8Ѹ-*¼tꏦ^EbS9b^,=}񓔱p JLه[`w;93Qe{TɃ!;by^94_P#c^kˆ2tu%|M1 /dJuͥ4 Eqٟ1b+2w!'F `>?̊X [*+t%gҢmBnZ7k1,ԳX w7S{ClٶZSWѠ_*%`V1=='T3B|Ku%8yC ?Ih_ `MտBjhP4Ƴ`)LsO7,`/̷>&EP1muV J7&S gEn\{oR-\J' _Y]qnȬShQgPsJ8Iɰ?O՟h!ݝ ,Z?]OyTi:Jx{~&<0KoDpmYDU5|=DT /iHV]}wb.kk>ZKtHx7YLUBUNBsfql/K_Qo_⻌o:q㬦뺔R퍸cB1rjx3PaxS9I(s4)KKF.c^P_kGtLjj9XPjFa8ΤF 2<MXZQPNU9R% lh(m5 Ky?;) gt @֙yG29Tx Q]Ӑ|@"M~}uz2٢f1F(5cDՉyL4Zm鏞ְ! QۼW2CjwDn@]#~MH< Īn(dt/wGj6ޟ[葢IRA\/3Ik!6﹵>H(V·3.z5u^$kbɤ c6>zoEpZ(Bm[[2uNCuHOtT=-k0#r{CW cֲP:N/AQޜwQ/ ԏfpluQnޛp1-|YP/1@Flrp'GYTR?;˪a!޽18^.T_qftS=m9KסwIЍoq~)JriOPqj;pSZ iC71ZUޡq8:>o7r[ t@C?0p^"6AيdS'ӶsEd/@Ą);t XP}ARݪw2YwkI lXBEm? {uPz-"/Cd̿go'BI4>`a&aLONp<@K1`Z Y9[ YTz5=#MqnZTv% S(߯Gͮ02q\WLNOZf+èo|M4S΢4=_.=KOotK ~P ft;^8¯MZ!2k  ۡy=n*1ڮ@\_.f m+YOEܕe(i:9mjWOJJ+/m"wԠ2ɬ~u7^熘b'%{x!3HM-)º́ͫ ;v3Gx]> !T& ?ePb-ErmP-nAmK خ 28|øwl DbKPfVc\fX*{9qoļ-sT,0n.<OBI7bV K0J`?AwSTRНET c+gv,$))Iiu}+ϐ2ǡI0-F?݌9X,ב~ qvYgWu?&g$l(Hte,Pv_6u D`?r80 g[!n on`ГDvDq^C49`HK^ՎojpNOgɒfZk0{MFijWR򂤞M>$+ux5& ٲ'm2/4C@%-@0=wXzgyὶAg9ˑOKluU|!bK$, PeqrNxu,3ŧESCAͅ6KYLCw*z?IC\ӹƖJӖgaN# x{8vUIX0.C~lL"ڕ}ƌUpS".fB= 8Z!#rZ ;G՝^ KDקG$|-ұ)p cJϮt{)0Ǵµ~2+cْMWK=%'N\\w,D|^hRyF]4ק"pk98YZЍ. T$ɔ \ZFW;Fy#l!c.Qނ_畺s ؊ &AnUT8هzYS$Eǽ%x=_n7D$e\5- 6AxfÌgҶIk:M m13}4*,$GQN6btJ=Uڜ7l`-ܲPcXc߅xi urf>)O w}煋qT|f6x1h|FNd7@[&ngWƪ,HG +<3A3Yk£02R)s$a ) xI_FN("/.Άqlڒ6S-Ȇقj 9 -dPVN Jb0~)D0~BSd3ϘA->Rė|T$ozۦ]n6bS`(r=g1,^8pV,7w g?X%Ꮷm݋uP[(;%W $AY]>Z~uy`4Fbo"ἲbkb X9U^UWS97gFi⧇"ZٻFċ"K/ L%>Rn Aj5|Ҩn4?湿Fh+g# P.rm=ӈ oM #v^ D #` Y1faݝ];\.^M ya-"9(T^KW`B P~cZؐf3 ڸxrrBz A<jORA Ő@ю%+zGj^ kPyŖBnUM—Qn @m@.?RCVU`~ۏz:5-T@ LMԵ]%rk{>ύ}pdiy@ASn#2L>&^"v f;2/7v%wbGߣ.#{Mj)æDŤ\ҽKE3qFt.؈TOJ.sS1?x6BL6xBSo _'#ז q0M;ҪŐ.ExR2"$ WEs@XҤ1T! {~n48zr^9o֙2I@ yhP:M 2Bղjede+f%x? mيA/`]޻-oz"ni/!PshЈ~.B7ĵv^lZZ& .J-W j 2'/kϬmʉ~KVFAY{'r^eMEDɢU?VF.K u<2'J1IqtP/w)!8䃰"vn*@mM 0\Б!毀Iژ-qtJ@bA>8D!:'B^ %z*:Lu\3 8JQPb(xEe{3L" N+!Z"Z_46&J5dU1ޅWI3>>VM*<2?r ]3T: =+o-g70'?QR֦w_+؋bj֛ ᦎhod\*RP[9v>7_]*@KP8BĎV5MS9A>q,&HQ6Pq7Kmo|¼ӖT!ъ D<[_Z7UPF &ہ0CHYs%a2. R !ap^8DhӆB5P?K2ƫgh̺U3wz'|紕7;^<['QQ\7P-ث=LH%r0f$1@ka39]3 £y$7eUJO,Hw\2? cDFߓ`,vfZhM"5J.Py8koQO[z(mʓ>D%H&Y8{acx'(AZE!LX@|JT-*$Q;%c&{>B y$aϰA. 80I%y#q 0& [RaٯWJK8V\L}_&W1`S3xglL`QV;bv. gͫ~ X8HWj]ٕ#QE  a6D"bde} d45+R Ѓ]T#*Xm('kU2dzt 'Eߊ̬\uAOPR齿j1\|iE}Y Qj"+7dqs.OWI8(!.3"'@́+4IF MyT[D^T13Rzl߲J4a_>]''N1w%P Wx%zZ+p{3[HIԘ$Ʉ?p3玗ETe9١Tb="ܚD)~g;Pfb oЩuiebk)x!B|j8J?yz#{:)ZM Qb]3M/C 40\]R?1FsgShU?w5,a^¼2Ecv/S\+ghb?U_]-EV.l당(|!qdHi 35{-PZ6~&!NpKYM`V0khPuB%'m >e~e_A2k17ƕz^6y00:F RbgY{>NV%1-)5t3ִTWe/`a7}l H IA撦j[r|z.}H7L&!%w4&5ӯVoTx-0yAs]@V,] !M2/0)TBSk&y*dX;>\ >vM!crE KxGJP& ?_$q'-L9DpV#ݩ͜MQFEߵb釹Mh#1a]ꃣ~a镑PTt ,6½Ps_3ɒ9;OL1F6;Ecj۷E NA%vmX2Ɖw n]tH_Kۺti@0)ixcC+#e~0?zqARa(3 #{-W` gz6 L|eb`̭ ZyX@؞Mq>xy3c{DI!'=: ^WzəڍhzIG•ehe뫠x.rQB~i]-D]baHlL9:tUvSPwĂ";~|d3Zj8] *1ʔ$VB~㑒ܯ )y`Ħ֩aD*MBF'>M,z.C/ZicvvQ>!;Bi˥#F1}!.>6RKurC<. \ &ўaNh@muB0v6kd ].&WGlc25mM^4J8<5%FsMXEa B*ζV9%DQ"Hn>L]##N-WXa31FsLi4\8R 0B-f32)\h 'nŨa*Tr8@oC(g]X/h4 8MF㖽JSf0.5Efِl1ơrrOi*fc%`Fv!w9|\GnvFW|$ `K"\!S SkQ5_RXrrʫ ꯡ N(vt9=HZWQoK~|Oۚ)Zb#|]Tou xnwVA܌Wbb+L2KWLGmzksXaK6C1m06t6*pzRCDRd\?اr! G0#]y~pKJ1 YK Q+%{lwcЙes@5iV:}`v"p pɰZBsEsA}#:m'Z J@Ј";~1.[^ T8B^*-@"fqжͳ}CHl=ѹ<$\k Ϧ C;È!yݩqyVn3qg(;N5#Ǽ;I ҁl %QM:ˤ2̝LN-4a>{hA O;ңlmYD=&qLжP}̽=>Y2*_Ndxv) Y&Qv欔6s>9WCH%rGo岟?ג2 H Էtuq'0Kx}:sOd$Kv6cf1}.^}1|av*˭ \R]׉]|h4ENhWH'aF:s]kp* 0J Z0ldO҈HXyp6 ҋcvf#1vmm,3JYT(qӸt3=!6gG/ A1= s櫭"yřd]l w +^7Sɓ.*Gн*r-Ԏx߻ DȶWL%Ұcp`?\@#nB{eE*4?2bcMB_8?QkvSO٩ EkCʼF@3G?B{i6wہC *7HECDv>Vx@ FzIADlW{xsGIP7Khiִ0.ArpRh "D3^P&^kk@w?@ c]r-VIփ4)އFﴋk禖!ԶKQ>uuY!zNێJ8*&[k<`) cSan6۵/&풣e-.T5=cp/$^EJ, oDlLH=V4j_٢&yye]t@אhvb&Nv&wҶPdD7 $¯I4y7vv qxDP`1G2|SI]f0c5Y 62F΄m0Fqp41 ~ zUאv/@ZLX2Wow|Aߖ;Y= yL)*R .G'{ ~cH<' ȫ֍X_BkBio,8)=U^C8ș#FUB?ԫމUE{͘]zbdxh6?Z7`([)X.QvgႮ%Gn{guKWgt'MKuO>G6=~ό8@U>߽b%;LFrDFPa4dA#څ3Wy0̨N5]ƨDxтHi:HȷHq7iZ>3qTHGKf|,pA~@*+y=SQ#_U=VIB9U-WyJK4ˌQ^$ԣ}GN 8e76B[\!OѕPOmk5W8o.wkآ ?5 Z3='=Gi6SjD e:k()>@q,Y,v2hs DYVdR^^6 o-eJ*7SL題@ 樁7S~ܟ3+(m//6P+T!IdC8_Oc*Y_\4 U)|w!P9dcǩt-AH$9i _%$oyÞrV y!dp}Whp2I 6rBK%Cp^Q +K/p$.,vD)L8DzVN8G)`|ۿeB+;!axpQ3ɞ9r^[$"jҍl4, 0}5=IqM='wm[xo^:$5aXڈOLn+,w{g;j[ZCc;%#G>>|1>Œs+n7ERF1@-<D|Ș(r>-ӿ?wPJg ]AV{2b&mXZr2^)q[7krn+Ib#J8!*'b[;:;VKKe` Qo/kd.qX#ӌ`!1S #{:]V:NcyӅmoV k|+k8C<sfeЭ;`.NOy#r(D"tVSnՄ<䗉U&%œ֖x]fic SKi`6)ĩ-FvЊVb}7$ztZdM}`j!|&x5W©`{$'&j5HS02  ,V h֜Pu1`ęVzMM2cQ#J_F\J2μEiAy>Q J%]t3|x%?w_qmdQ#iM*mDo'"CO0?|dXt5]-IV'ZuPMk8'&iRoP{Jp vd!c]Q8.ْo(y9dH YS Rhπ =qZFrD ͔;>Ǭį, |reTjHcƲP*¸L`b nX>ڌm[jOv/gWtΔuhۼ:b[_S]<[Fv5CMu)[DÛ%= W!K).?r!|K:iԍO94VWVʡ!uTyz;FSQvJ_h_hq%1;':Kʹ,uIa!VݡӜR&:DEՐhWzQ|۴S2Į6;mXp-C7R굖FˌHz̻ lv[pWHw<|$NEGKܩ%KE 8XqeJ&׸Wb|[oe +LBF@d)X,X)5i4>[*˶IPWW\NN%R:Xj3o/ ҂.&d74Q 0/#h]_efɽ)NU{wW.Q@ =>ô}|qOrUi`g/! éU2Kݡ5{ 3M \4\V&ClLhg/TIPgz4nv^oiT$y0AᅉC-Aھ:Cy!.8w&'AEpe&>{Q:?a'px֍~Fl6t#q4h!$ٍ/m!%؂H0cnFp3Gr<͔dN&@BxY W#5)]nQ g ^^]$,|4\[R0:<@yZ-c6B~e4$뽧Tp0>B*8Y/0 <*Ki ngmԅ r}Y{\&hF#1ndsL%ȯ1s-&2Psd~i5lXn^j|zG3 ua:>uἡ+(&/Ú1Liy]҅]GrOYࢼZFQiJHA4mJzq-MH4BRL*'K&0BYAJٴګU!\TWXyTxJ49Hi4ʐ2KU[*ʚ%ci^qz7ާ#w5{*; \jTY8|R;pbkIZセY'v5L×Uo2Q"_wOSbfm3YtFS{9&aRn&z7YRp.s5J[8jr ͧY%)2km[i^!|/qpz-Z;N[6R9l\;zD("U 3=]g׉ IdDC[Mb`bn]|,@i\5/J5WLߊd=I 6#D*/FJ;Gg ܵqj8}6EL=QdY3Ҧ{3^Aes@)*J7ԩ&s"]~|՚F Ʋj>܂Ql.*;o K; .)VR&pбմPkכihO%S֚Q*׳VSN)|<@ 7K@bKTmlGH/$unsKt0+"Op[L-,vR8{Bd~ W;kLp,Gp1QjQnUi̜eY _`h 'kl_PK#WlSU-X: JTӾ3 M݁-Y 4ҁX$CS7Hj:Vhkj'pǪ9(2D0gV9k%O`J ,ZuЇCS،ӯ`:=G>P-bqB>GooE}p+ϔNĐ- [peWjODi{?pzsgV ⫐U4*6D}ƔB\Ӕ̆'Յi6qJ^7;E`).{6ޗ S>=j0e㜌-`>@cax{1]m9g  w377*^ v6`cMܨ7M5A{7Irtj)*G6{ S426L˴.,bQZ_BU4]PTun謍S$c>HYfj 伎DIyS۸MRMAW"0G9׃"񸬰bĆӚ7!Ѐ⮂DӯW}`UxXPW^M'X0Qf^}B}ׅ]*pN%s9<]&K n>NAhflA^!hSPL @?)Ϋh!A?gfš  5}wɑ\G,~ 4sOqpr .8@X{uR^UEp0C `,%qڦƉ_j)?BTu3" 4JC B!^uFKuFГ=0Kn `踑x r?#0)E5AvAHRC^׃aUk)[D~$NƐ)@;4|zkOx'( hi#_PCMX7]Ά'lLd#A$7&!ABȜ'&#g 6e J%ߝPk̫DL=+vM$20T gZ&kc)$CwR Xf[ϣMg^~CٮEX%#( ő g%O)ݝNxdŌj6'h+j+@a߂&}ŌHc=vУ}}cA.6t魊L.*uDpH]\ԖvVYz IlE\!@"Fxj7|+ Z]%D"Xą.(.-hS1C[oSG֨"4_Ͼc~zMՌzP|~̣u`1 }&6iu(vkcLc*֠?02$[INHM}JX@+=Xy_j<%HXAgExwnys! (D ^<܈"Pq!3N$$Q358CaXer]쥰-%jq>!!I!+d8O#['"I:ﰿJ]"!6~GZ=fŝN` gӏ+h}:Ph-ċ9z< jKUhSqF&C䪕+z]lc[^E)s5|}Of/nǷ? %@.Ԥ[\:͕ȜNO| %.;SET3%턤Y!ijwӍ֔\oƵR7re^g/ 0#o r0vXԄg,ID؂O>_J"@HhVy e,J6m PhCߤ8=xFݶ8+"aE<9fU)<6 ܲn J@i3I(Q4jҺvt;}g@yS˙>oc$) eҝ:۴iJeTLy}c6:*d=\s<4"جω N (x1>[*5j;((m~bU؋&/'h,0GAGum=Ue.l'&&gi;8yInpsƄ`#D*{cU׋pv(46A}#K f[fm#/0!f!!\`r}Y庫''k_v-{"җxTmfǬt<2JAqnO/kZ@/Wl 0,=EqA\Ai ְT*S U2.{(v)G7o]"&P3Na ö OP}۫Ŧ6pm"K<el$f]&qhFL~2f'!O Kg+T2Xf}=WSNZWInt肘voZ?H@4$A|OhOw,?NQ!ΑĽ*^a "RKЧ+mgx߮/e gȀ՜ݯF%_amiX:1LwݷsVus#DI=.aP? #*Lٚ:(8k:}tiV A{W&3|3Tnՠ~X7&i0WM:ts Z'm ߘqB] ~gH*2j7 ^->4暞us g5_0#U¤TGGre[\qb "g} ڗ_z>!<*\@_p<(PT3\(FSJ IOW}t3G^I/iؐbO P{7JŒ OaT2>@I{_ z6|+~?ZϷy#V/~[ڪFtN O珍<&+WVVz2 KbظG$c&"Iw58:# )f@t%|hVC=3*G AmC*g7p{%OPTpgA>a4Ր|Y+bo <"#ca(.bQP#znoH#['[#tO||E"E0!lVM`8TEAxDB?!wS [7;[bR%r"Ύ6T\qؑQlP~;5~i¼;يPk}/ LYUu3_S`(TQo1fcA}F Laʹ.}ct$E Uݘ*4VTXI5]碧T׽_Fyy^A[ q{TY R8H1;\=k΁Ξ79fUؗmbR^YZU Gdka, 00ґ,u?/K _#0 m=`ZKo`v!ks_X)e',zI%X#_yEnRS@;| gNu(g ըV#5!19xwQY*=?Rߺ s'pʟ}Sm˫l^Nߑ1W*VO* xL{Wth%ٶ{Rm 4iq`4C 2aD\4ѨIp!%4M~}e8!ZP5YRv]S_+s0O.> (Z`K漙o1>>m(,e'ZrblD0s+4XH|EO2 (^kh(S:>{0{cuܹvCq뉗ͧM3w' dx41k2|Зz0!=^gՅf ~; {2G8CӞo@_A?`FīMî;dAK0zWbW~}c0Sj]9KP( #@fNEd/7Fl ik} q.&A;vQ9`ho`u΀RhUHFzg? q+1^l\܇7Di|/3 GCVaFI:U?tQ0;}r4)^Kam$ H"_d^ Vhqū.f 1AZZ6n+B|#} [ѿ< ۈ$x)?kmv=@ $?rb]E֕ R[܉oqHS-PCo}*G'f؃]\3]W7- 5GE؂$؃BR5 ڠGf)\qew.捃 :bv/< jfv_;D+&bhr*C0NQE$֍Hjqۆ}ynoOTgSs̳'[i#HU6L,’}8*ցjW-乮63bU ]+F9B-PbuE(_15>pu\~^UAz. eeǭPs6Z?D=J:k\ݴs k jJao:(R[+M!IrV21IV⏅j 96^4+]Ku~7ۋM$8V_ )X:l_̢r]tsY?5)K Co O}VdQ 4Ef fI6vJTK(f|x`VD r%ɵkm,+C=AApA( -Jlj|vUwZюPemnvjAkA;#hUP2 dcZq%"IA D0YHI3'I9|%ehXD!U EI4 ϵhC}x|Mu ponHH6 #Fi߇Y,WhuW)1u=Nf;0UD!((1Ʋ)*/?#wM,dgh+e%&j7A8+tZ'b9xz 6RLg?c.[D=(K%2M4v轫 %4Gh_Aߌn@z'S9%wLHA>  14W#7fb|3j|{uФb%e9)~΂lԏS ?i`kh2Du$6bz~S[A`y卿ϓãm݉_t< =Z'PbtP1;~VY T76·e]A?E8}K\1l~}pcl!wQ;G:|tn!~MD40ôX!XUłSP4k}:A1T3?G$57savNAL’%| fj@寧4Ȁ1H0pk|D Xf k$]}%mꟀ /y6T) m9ވv=^04+09*J?ZI皴pX[#rCq $j74kVA߭U.\B}.V L^њ~ڵW=Pܡ*s{J F+:#qFV2ÇB`nnN EYq-Z }QuvzL85w]Jq {r9#;4jQ aFwVbN ףÈUNz 40H_$t11duAy2WH9{R! lYkALZU`]q =V *9@mNm|J pǹ:(*%n$!S:&D fo1n_DMxu6O !m$hXzLBd6 -u[6S:|کO[8S*K9b:+KB9-]Nbpݮ?uJxETk*U0HQ-;i8{Оˌ}X@qat⧏ (T1mf㠋>!_ֺ.7eȼ|Qfq'72,2ll ubm5~35G[1;C8ҸPGM 6x5.tl&BțPY|GU]齉%8sWc՝Bnl[^![+;y_k :6@/u08+;*`w)_wgTVCL9 VT: >Uu(8] 4*koH ֦ )Q`TQ W@ޅr}lu>K0]j. +Iz>\Sk>B ˯%i#z|vdd0ɭ\nt+.7leHPxR.{gI_V^ΊGK%=A:'U8\(7&,f`701G`'}d"sQ4%5n/?8ru#N,jc+{)UJžBl@%=~zG~/=5Og|\mL_VSUj(Aa,0&7N8Xq ^~s *p\g{6|6T_Y=˫`&Iy΄1wK(5]wad{P>X4DͲSOd[ "3Vme3*$1,kJ4w%ymweޕ7݅9DUzEczPCoÝKRz(Ο;򦯦/J>-&A|D. W?5FRD΀'s)  -RXr0)NO. n^win2ԮdaNBb}Vjz5;OZ=1=#k"w,"lt٫ x;S}0-x(󵒨op[Pa 2\FcacZw<`zo%7QQl(;,8̕QZ@܅Ph=ؚ G %Ot.V&jiPyA%kw@,o hg |u0vy~ƁŘɳ֝`lDSی;.0/m2/_`` =\V|g 0YY=l93E> Л=\ǔgh|`eIGXodw]]:ATسk:x O0k=K){;. l%ϵԟ!-6IJ;VG? -K;Gc_pz0'fJC^QK#2J#Ipj9> `S$2ypj7|~ uNX77[c„H բ:n"f&q$8@lk:$hdņ4[c68! k/U7Z1N4eo*D@P0GEob .^ M]!ni4"%gl$LH rЖBqZjo T c#'!8~maOʰm d-BOXk> W_; ,_s8\ְady0sYb RK%<@F H}M)2m?wSke]Ϣw{Xb`½FIC~ ) AՌ7<0O'] )0~CoŊ!javulVsH~Ԍ؀r s 9f63>O er&Fb E1I@=b$HBòe/27#12ͭH?Ϳ-0[\)wp1WXˣxi{S[,T$ _y@\9b8N1;m)LFbr`qZG KE/S_Mڙ9ƶ?j_7 ?#:ee&64Nb;ִ /[ O=B s&IJA3cT3(" 0+ӘZ/GE/ui(5^-3s- M<ߏԵP+), ?$&ՄE(}Ƈ2Jth q(8iQiF 7-<[1vIsxD/-y6|NM^Ǟo༄Pl.S0mgb:@ R<tu6_UY' XXnX._TRxmK$D_9a>AG]SFl 61UW R ]ꭁmI>%xאgPBp?ugI׉Y:acę)F3ROpjY,s']G(<ԷeQGS u)gN^ӵMdp-G^}5=9tz vhsMs&ybm=E EeNcF\nˬu;qf'd9;*]\ ETٓZQW2~EG*SږsR!o^ao  &Y`(;[~i(Ե ϗ]"<0?*"@ՆLT0'C!qwlz5ȍPb}OD݋ȇlݛE:.B{sԸK1WF#cydZ)*9RL7Śe v6F&Bh2.?7Mh5Ip_= -7R=JS$Qgº͟Qt㋑q ;i[eop}91%ZܴAw6ƛAvNRؗ8YKk615tw Eγ'ڸŚ?c'UU n@wU?wnRA£i_MӵO"&hGi'ۊB2.#:F#S6/IVs4L=vQڠRD^S[_֞*=db*156& =y1n /Osw9w>$CeNw t&[JL(2/!IZjHgԯsp)hȄ4_) MV>Cg~q eV|?9E(d!uT?{4|#"H;:oHyA<& U@vD a}.a\LG*ɛRI ?Рfhw=kdDi\_xOIv^(>>[ZGhw'ʓÈ(I:}s?ԲMJ 45cչ2qYFB8.*Mw1mhޯ0a뺌LkDxuӮ3[?]Ù^pVsQC_TpwJeک4a2ֳhZ~xMNz$4Ee29b*|h OHϰ%DdXr`::u2^R`$j@~lʋ-ϐR~uP7M&Ccx ͦOdE.ciB,,$,?jtB4bAGMkH8tDu54 ]gd*K8U9(تGN [bͰiw0p\Gd#azcEU]$#D}3Nr% @m:6%e+M!VذG٦q<Ѐo=«O: ȉⲆ<-#q+M JH9;;1P/IWFn HԊo>fOsVI|o$F g wnyD;].R,005执rZKGBqA ]]]T\1$?܅ZR;;lw"8[} #(G43+v( th>8i zo4Wu7rgϸ@a|<; M&2 9h tk#~"gh6t>R%f,]!VSPtZSmvb/'>x nc;cs;Y0l:W#>{\:ޔW֯ReřЈ-''`ǰ ! m.F[.!E7b-o[#ѯD|-ӏ[.Nr*TL+|-d NhjB 01Y;b%]`*!57SvڣgX= ~C17Hvmwau)I%TciG S`:B%. #H)qk?D@]rC[lZ._>S^H{&( fBEt.hњF;&5_:x%A7J" TQoh!xı~I2GG*tiuk@c&zbv|zy #|xyia8{g${p&J;|ͦ@ĚK?}2/_}XGYsѸm^!`J2aZBxAq]f{_@Z/ij.iu|L|}>&K6=z/ÈcED)GH23ɻaz,s_j}׀ G(,~I̖t!dh2 )ԙE O68AbW?hp Wr-3+Zܞ߭rklp* /e>]uc'.1=%t#,jZٌoq P7!,Sy`1=#07X4xMMa" 2*4dH}'T1 X7x7" }sb57mڑ2PIe|]޺[gҷ$:~WV'U\y XI1 O8֒Kڡ3Ø|0L=SjF|@*;YjJwRO=A,~jF#CgTEȅ؍ݡvX.91Q.;WF?Zjp/|S5vm$YKqi% hv8w3rjߘ]K}ԞbڨW K,S>l{ 8KHA*r) eL/8[EL8" #ʾuSey1xWUqz*f, Ua)?xǣsMiPᏅ&jANԃ (C|k#"g(m]#C$/eI|Ŷqk9P(Z<ʅU=%B\p*䐰ŧOs-$dNn\V7d'YNNK\E)J( &K&Xv?4ڣ2| +[Yb]#\}?ţt#KLC]s&,.84C;Ï_>ΰ,_dhsB7BHrvm課1xI%f9QUrc^"DKn JZ<'VR퍥3C`I-8\ԛZȆ7+@+Q0,#Ϻ2q!d9ku\8-(Ժl-v]Y]X/}9\S ?|orRw "@@xiU-u3?1(+P%5ߤ&8a T>XwyZvofoJBe ؛\pLtsliѲ=\-eZ 2Uf tع){!F'H]BĂIds)B;g l5(<,˾R ӷh@߳&K{owwVk.E tYg{i]{b'ݻcG1}2<63 i؝|@;rFOмrtlz|pXdX*iREcfL_|g|gS7Vb= (FRAlSK TW 0/A6z0-ܲz|BVѰA]})"f`HZ"`ByD; >c5ôuUj?Mi0!mx!3(/m.oJl_~XAHɮw2A娏뼕nH o}^B4ND;6jP"|Z}`EMu} KIfljb\0 F&s.]ݖ.zXY@mg UDH'~S$t~S< ʣQ#F%۴sO@w}-x/>U1IHd*opwaJ5*L| k]n+?~c ֮txUԐw-#C?{nI%-kZ"`#`+[CR\;{%:+5lpcMn 2zglķэ쾤 # D"B ~ͩ@PƉo}߉A'TfQ.|_ad>>CjzDf XBŃ]ۆ)6+BpYTZ!̥K9 H|񄶉8L܄H_bl H_3 X)DnmF"'=,r('0c*IlkM//7TmU,?/iȌX0K|X\KR띔xK{uUExC4Ľg}iMYb=$vujL={oySLfO,]mi#hAڇ}^$;cWݝ=@1P1-(L=K?,ueFΩЄzOe! R19ՌW`gPm\b45h躆w]2zțbf"?TNqI:uʗB`]%b);LTDȷ,Y? `VߎDG<&`Xjvyqo2LDȡb#qLle3ʫ>/z }S Je,4r(M kǟ^@1O*Z r_Xqhtw1Q&NYk ,ĘR"\5==*:/OAjx7HIM׵XD[}p ?+C$b9*Cʪ6* f "&5QV@GN@'-!'X?,LJ[KeWǠFIh+JhsrD<ä', E&5HEjTmWymJaB csޤVj:Dpj"'F PPc\N=ΣW-T+3S/h"䔆Uԑ(%" }"^/QH Ngo]\ >j!U4;>'lb̠wia |\t gKA7dǒko+0@+/<^i>mRu]M{% 0v[TwB"+GO4%*1ʙjIw"LDӧihD]cNuftNδ)IT[?<|GB]!!yi1^G/qTl ˞;v-9JznO3 S{i)I=4|fw-5|G*Π- \J:O)j'`2@XC\u#BRȽٸ] ]pUp%ӄr:̷Z#kY&CwH~ ?z1YCRR V"%FYR&cO^0H%\O\R'jr^_mfMgamgdeu !6jf97a6 Y!kSRnirr,l qsQEbSiö7ЀYPj)Іr1cmg",jO3}(Wn dD[tȰ5(FtD i :8-b;ɳ;=xF$30XM@ :GOO?_I%:+LV%6^Lp)458jWas+ T8Y4f>@#ܹބn)VѰ SUÂxRp)F8 @j%YՉؚj{`s3<_ [)7k"2lXo g -bD;ϱ^ ' ccl΃7=]m#}P:fyJ=QZJ\>f..%U1.o 9LJseDZXc!Zq:$J~ҚV (m(C.f%3ΛIE]71HYIUYǍ)/%i"<3Bt.R≧(n3-s:IEle?[b:Xdk7mAWt|T<Hx5Zs]1`#݁m8|;&eff`ME[~v}-_Q TFw};ŏpZ$R6kY[3lyIWi @iDdFp6. W{Wic||9gz0%M 20|>gu<e%CG/dd\@J!e~pAt}'ngX@D-NO27NSQ2vؠdQhQ}XH7\U8,'XY)Hp ƨ9[]CM]18tXY6n }A$lKζ|,HS ;tg~FCi6TEuϜ vŒKV`XoX嘦nD2Y #hGXޘL<51 [q-Dσ_X#pk"~47Y"npğj3c;$טO0+ ar*,RUR[Y/ek*_)+9^ *; |jҟO'o^T^$?ƴ`@C+/yQrvv@8d,,UBhE_b^ Y|xcmaoՖ_<[47)zCo1^of7մvv?P)^ErQ_F8XG{Wc&8x,, jmS}JwwrD[_%|>dm6.Ҝ2`"Yd\=@U3p1%&+=.OńdT<7!ϲF@jV& mo|5D k&uiUX802D # j Xl7p8nyU7ݺvhA[\;GNPVCSk JFw0:7H<ז1׎& D9$ͼa ltoNbM%Q K~Eaӷk:b @6]ނR1 Z)w)9-cs{P"S̵D̄aKʏf [~E\N-ʨAyUUuAQp;"ft; _uC$񁉟.fBQ_3n#xxI)%N+}3<qѰ[QG5OImA.{."tCbFߺ 毵fhIġ+̄\tʕvC*cR6*C @Lh~ _8 O@vz,0]{VyKS|AeM3JE`XΓ*চNM9Z^*c4iSVr&;Y QXH ) A^N ~C%X8]EY. P dXW֨VI=&oci0xmQI @Ah\)Pi)F6*aa703z)`fSIKt4ZB5Eݭo9"̭?ވP#Yh5gqt+f!4gQ+o7S̽7˅AfgAذE<Ϥkr_ll 9$rฃ[X ,Zb?}nջdp_SU`&~Zka!zY=yv=YrnD7vsn ] -`w$ΓSrEl@(Hk*yI T|??T@ d.{ ~*\\Ҷz](1+B L/?S= X:ĄJe̐Y v0ɯ$O&/NE],d*J׉"2λ {%Z d/ _džyr[ɫM8~_Mо_pE%jnzΘEAQ  _g;^czi%q;X8- KwY'j $$mKQʇWCy QϵV~Em܆{{ c7=2`UϑJ.۵\DC/wpQVAęp}3TIkӹiǭ[7[ԼcbDg2X=UF Z h³֗*S96 7@Wc 7f9=Cu-ȑ^\$+MmU۴v)ְ='=zQXN֊0o S YSA @l< 㿞|Tg)B1@&l{|{K*^t)_4 G;9Rչ̯H >()YI0ʄw C3Xl; 'Axi/3g4?@qٕ B3M2 @%MsH&~W4IF~ )'&!D6Գ7J)]9$'abwgZ%oIC&谬 nS%A L7T@XGVhw.IR[3h,[}[$Ԡ 6L`9cN Ӯ5g`)t0rJ-߯K㌬lB$*}r,9Ia q\D^PL 8f\ bzhMfHu"Kp*O.%^S p'7ó!_$b/Č @B}0͍ _O!;(:uqRJNU\\cam6v``$9J ' J\p72ӠA܆*~dQ_B :[;(2[!!lR|eye^o֎z KK;F+Nq]Wu(DֺYXd?<#SIkQF)Θ\-4]M3ǞWJ'RfM;`sD](bBa#=]M %ᑺ( *F DmP2WKq-t>/^e/} %\/笊[P#H>XpQF@"x%ˆ{xtDi̱3ݬf vŽaCgm3f.%g\rE[9/ԣR<ʟ(mɻ$by<,ykѭ\n3 #.+UC:GF4Q?Z$$ vY!dGYZ|^,K{hkxMj، 뇧vAiP$287fend~ĎFr2 EW9vB|;θ䮄Q:4O謺M-Ss#A" Ji$ˆ'@T3 .7OUd;%/z-=X.MIO'XA3\-kDtyτ#)DR4mN /l佭W #,_1 ]Daii 5ITJ|׍#HSh! ~ 4g'$?Jm R.%(G!`:.(@~s;,EA^;쿹Ǻ탊d5y2VBhg|qĢ;sY;U:Y(OɈ{}Ύ`)NѾ\6#9b.Z/6I ѡ׏t# ґV!`K̗i{5IȒ#h #Au)4&?XNWȕk"wWxONP٦QoOBB ->b=<3˩,iz-{"l6-: rC /pj|Q<d^SO\=ʇR+$,3gŏ=-ElN ߂|'oz [(1ű\HI-bG羏de kٟˢ㵛҆-ѭjL@oҞ&*NMcH}ʮʄvyjKG˧3FaqPZ)0wK&ٺV؊]!j =` vzU>i[~0j@瓴p5sl|"vhp+Ӷe++Ĩ k %{ )'DLMmneSrFwnQ[tIYU6,F"I_V#;'|kLmLepX(HI+QafzT0x;BTm?FFYgڀjq5Eވ!pZp9?g@ "s{WYmMg.s)U'HRR FSp?͕LC&ƌ !4s1$!|zby(- \kYok 8mM૷dJJfk>yԺ/ПA,~&Gw'*]vQ=INlM~7!姱5 5[Bo+- LVGΎt,~vg8[+K$ z&: 4~:㖘#!'x,^nDl9t)~0eYe@TBD$&i5-宲+Y"0@ _w+SY㌍^<>\v}xeXH #k]κV1;]Ka08nMdm;~bDe<1]/+I_L=&OwڪFn&L糐Iͳu ׼zfo|!} *4Ɩ3'pR'?:Ao!tÔ *gZ|f3Mʙ)[trap)JjErsZFu P ~?R]_j^9lف59L![bGBy+j4{&,2)ͷǠ\Oa]٪P=鷉y֕6Hv k6l4@B2sˍ!R5^@EWdQ, 7㿤ek`7'Ao΅o[FS+gd$ -tg)*dRȕ}r+'_^.8ǎcYtOt%v.pjHI-?Vcvl'ĭ\7i=ƊTFaSmAEy/:Qr]SW~;*Hi@uDŽ '9'dy4c>G=Qƻ!#k:8!%Ŕ_I9$ZNbdv|fˋj%+q >NJ@+چ]pL?xu#F}Hv_W H}'-MAoͪ:5ZI(ӔJ /s^?qi Q&۱ =HDHn("6&N3_y𫎣9_mt7#oTwݼD!ٌN/֥W'EfzFC4/92c45&e@o/WWBrƏ·RZy[L%EEwْ\+Z9swkŠIiEt@)n[ӠsMH۶BT?ui?MVNf3(I,$ i?ybD`N}*چ&)sf(p//8L+Oli]򷜍wz#9;m7{$Tqo仜^ &5xo\+{B(|Tal>3Ɇ!/$(ұ*U6P2"T%uE5Ta ᬏB9X[g|'qEs8 D|=BK.!ּ2tˡK%vD% iȹtJS{@RD ȕ7Ȥqe '4 i4dmW rmLd!wjrgJ ī *\ [gö́4Dhi*7WYhtm?KN*lCDMP Vpf7۩3?j$*UKW͌Dwacx*'tB|C;RQ}Q#&-aR?Ib'I ű^ʫ$ *jv\@֠F\"EXi|RZ䄧α<ǥ4/]gLǂ;YIVK (F3UiZ@JL3< fYqiE֦F/}7&bR4_jXZ +-RN;bYWɑ}XX@v]f,Ȩ0[.+g dɜr!|DBSI7Zr t?nM#Nu.1*KbL! {W i!C:9W}?Grz2LJ; ǻXn0zQ2: vly8:.2 x)D]vi9Tg ܻd͙Jq2Ր#2zq}7KZp:dF:pw/bjx6} 7C}61t{N$vm5r,a~Mt¸/07u]@s/)I%Q!o8a?1B/:sa| XmFmQ#Ͷj$ml7X.ʛƶV{ TwIbpbWjd]|)%վ bg:2~1ER?E&[sYHh E!لpEC TLX ~Y#x_ #9:ᑒ_ qw\ԵA/\盛Y%`%w~s @#a}TV]RxPߡJ* X؟O|0.y3/1 zu@s({=!xsL-w\h07r'P.dsYm>b== Y H'pГm>*'րFZ,DcQ/$ϕ$k u%^ƀs GSLថ\~Czϒi['f!GLuEYBAQ$W x;_%00J ;¾1Sg?u{io*'{PFy/^ 0 q@pIhT0T_g[X'&.sm`&Mua}4]uJĘkwVIN@`21SkAl: X<QOO#w._7ЎmL%-oQ;YJ z@YZ"Hk2e۰B\Q0ɿLօ^:" #4\MεRf^}(RW'}59bE~uQo_0R+Xdm#h$V=uI>=Opx<tQ*yIt-/V"ҷj1,MUDJK$NIag#؆"Z2/hzZ vk!ҳG5m[,|E{qƅ%ItJ>4JVdhy!"I'{;M72` (V5wot@iU FN9Ì>@1|#|)=E=qHOĆd:YWQM"a,-]);m%Lu1lOΞ!r (X"NM|8WOPǥQMet [Bt]pӇ[-ՔzE|N:8`[xB&4A\D4BX,`~;p N[Bي'!lu3+*"P`Qqw ehɠW ?C]+̀alR*}j1DF>BC`6U{ p'J4 i> e>*z+5R`ߑŭ\$}ḶY*>Zp]@QS_Z=c'tJz!>4cJ EM @ԬrOjxeyE=WMc^m/#rhNbjgF?ydqn>(Ϊ>L|*uB'<:}fuqDm-~8(c"qQ7\ $bEZ-@v%*1#%lBW>mۼ] 0Txl{O!5e%w\jIKֻ.k$aA .lԋr.mw }|D`vrϋ2۱/Z>/M]&=ZqvY_&ajK. !liHf}ײh<H #&1ψT<5Cbj0xxu~VWH5u+g5 픯aDO HfT a򘬢[y}DY=ߦ=w$ܥSKDM>y(h[|Q+:.Ml*gF,eOvN#bW"~3\G=~^I 5i߈Sr  -c+ğIoq{O"*PPCSaZnƒyF,=n`1c$ Wa9&OK 4fR*>AZX&J9!o8ȿ#TlAf+®`i(Ա9$%d m!G!wZA%"@(nc j湝h8C0{-oSFdvkEU"0^1K\' D)Cf9Shm;x?ə}xߚ= -2.hx;܂٢^SGL YJ5 g%E9_f5G[ ՄRΐ7URgOײ9Lt<@f,&/Wn֑7̗NFW ɲQ_;h SI=aU E爑qSAڑSrse\k_?"=sߋ=7jPLTBh `7}Dv_ R]NM60dDs= EwVg+㓂PkɐKT@M;Rv9Dɿ#Phmk?aHt_G;t/)i :&j FL>#L t&s,4& T٥3~` 4Xbki7,4Kws& ZczR;o@aMrlzݧH_?2Ga oG6ԯva0pYV`HcQA.O>㷈!>VțQlgv=gTd0b]J']Aiq $XYfyV) T^_%Wxu;anfCB'T!!WCK˭b|`~g aaNxRSұѬ>[Z^^liԚatԑPui8|FϬ:i_JxNKoM헪u&SOq%\GI bEEwgvU1W#z&fP!;Ι+$~7Vy;^KXÂtJʝiɂjіM;1 Z4TfJu9I:v c-JZÛ%SIhTC %`wFd97k ~m& roun:4zv~^'zY.fng :2]11#|ohM6hF1 SнuZU^x!r`zEC=^'bʲK-ڳrFpĞٷ߄cw 7pr#貍jan\7#g_l FT ZG:3ȣ"ʭ<Ҡ SoN! lk*AV0 ?-wN - jWo.#6iQv캋NfDˆ]w2 N2e`ntllgM Yq01ac}ep4%oZjv:ZT{cj*)ۀ+Cctю}m9s %lpCQ$>} }(DtajnPϓ*f6x[}~4W[)ӳmeiT?cx|sܨsAik|C6"A>(,~s79l:k78MErUxa 62Nh N Ʈ ,͏v͡\thR3^jݤ`1Aڂ,ScdOVvx(, fG%Jw7qt ~;[^&s^(ݬLZ:^Z$xXq)@a;X{R#\vph""/oBp}MKV"õ1"]1,m/15@|IHEnu,kIQ67 _-O]Ëdqh`` M6tG这*D(&Wŀ}*>fsYLh֠a/Avm ۝YRioӞZ&~Ϙ#hv:sk9+?eۤ*]}娶n +6ɲ)T?5J^r˔ OE.۾j^}qK;#,Wlu3*"{a̝b1)H¤=r OY+6{, s?'h384&sVDNțDŽsxc>OIo~.IJó8>=뉎f4hEn. mbRO~7&%8ɡ9 '0oҷf[Iw %Ӯ~),K2%?udzH) "\"l~E3=wOi2/;U.MJ 4 3HPF*MC\VҤ)K/[ݾ'=4]{sXŢ Ihv^[zy٬k-,;mOMS.uTtN_pz3Ng3*NzD1u\-~/ vȀ}֒Il^6BTdFaNϔuZpF/n.*";JW~M`AZ4#/W#z+-+ṦD 4)ܦY|^T*[&2`wНego r}m–'V1eGKK 6R5>Ә;BSXׯ Δ49Ʊp I4` 3&3P1 0#E>GFg"iX[߼"(KnYi1rCظ;u;刟w #sR3)$'NdJJ'QȐ T`,'ʭF ŪрDCO^N'/R|69K8KAj0`@oeBqYmn-1W iլ}6N`:{RGN3Tsq5'MKm?)kO TkWp/,#sjYmi C$2&'.!-[r.V;ʸh0]Ū06bH_diL}У6/@(d@W_<(FBdռ8(D3:ۃQ{km?e͓iI d&ڰ^Lx'$A4$ԞhUq`LİukO">0C.!Wٔ0dPI 4FveZV>wk*$?P:޳`9r:ٵp'LR*Nd{ewҢy>uzR_=Qb 0.eRT FҶ-IV/In<P#E2J$!z_Ǚ̙DZRV6.1WZ I#ocz>ic2c'Z$+L_5#&I?a{P L cfd"#2[eE4Iuue+N68<-$Ci]5Z#]oR(HɶKzgDa'%v0a +i4_WM+AŠ[#'#uVYqsZZ4 |ܹK['MݔN\4%:rRE~@U~H"ߙ"*WAprC{>0uKXzj(z.W>K!N*;ǜ`L*.PoT >?ǩSGYr+`afuCII]#1ߡ`i_1aihm6j0$ͱ*X(}oi5 ,95+J͝odP+JY~nynSlJ+m!ּ'輮!Ak˧Dr )S`Bg(P|t"``!]j@Q0lk8j0vޜug<ɮ*G,.' q3aY;5svg]3jqtߔZb0*qaGr5c'ؚ-u-'!ޘYT6$mK .>,*EIFL\tɆ4Iȹ)PLTO1꘡"?O_wܽSOGTY- }3kE|>Yx5Xn=} )!~2c9+eJ|Ty'2+:%!h!sesԧ5 =5)+v]Г0u̡Lh6|VNzNOwcDHJ7Gl +l`Plra;35BXsލmsMݼ #r')U9&HJy:ued&[G(JK٘8x @ @q]P7^>yE|h$Jdɬ%R3}aĿ%AZItϑqWŬ4(tǝUדa=I.ޙTBE\jnKd ԙM^\a_Oq0|!о< ^PZ]k _P%^"Lj%0y ؇Zt*"xoe?b2Pc/%pùo }DF0 9aӹ2~)ѮlH2hi3^SgK*&'zn$?"VŏMFrF+Pzʡd.4OJ0Rv3M _0y_){@KAD .;]_V*a|`S 9r]酸Y3Qg0ڏiɡiX3ߴjXώMEhd U}y;lF<+pu쾸v P-%@ܮ^|"T([bhG(4mdyq(y:mEw@-&ǫё튀0Ns:|"u9J Z\+9/L{9ȵYJ8f:xnjs/URVw~Qm$P+ mj^xNMޱ7d2O$ܤMy0 B +BvVM`# %n[@e4)b&YVxy8i\qSeL!(Rb _e|QDڪpa?&%(WuУJ`3CeQmVH&%wusbI@,-N jɋW4VeC.ܔ.`e Y/MxΠ އ.{<##§-ƉK礬h VC-qfF~}.b( xDzdkrPP6t23/g~/Gr`Sf\Ě@r~. `y fNN?r ϥ8onk+}5Nz6\?ё$/7.TXeWirhmC'A.;)?1]9|M&h(i)}b9Z2U8׬#^HL5W |>;|y!RI]^I$N &8uk~> 2A*-"k2,H2R68:\I3ؘUj{6.CЏS))`>0voQ xųNeMJ$;_cWKk@oY'l ~6iH\'dD֏:ߎ!CchĠ?# 0[D `K35Si#%b:uE#c3Պg$x~CfJ{op$WYX4b\音.? `S]-MrW\OP Òͯ],%Zcma˗N~Fu< 1W4 kKr:pb̋rVP @X1ea4L>ǽT) HzV5Zz^@C2m|M T5+fɡ՛L٭i_Ä ,4jf6X)V6]ޙ7OY@b|KOIWLƀSv2tJxcUw-f]/Šaks vjNJ?UM\nSqұג'K@ 5X}eT{2Z2&)ÀvNq‹a0J?JG,+)b^M E rIMy'1.Ƌ Fcm/q`Nti낼Lolٵi+EbrUR#{Q MM(6"*N0"t}{ fix6z Ax(YtxGz;%0Tw+=AkWͣE?%އ?qVt2Fɧ=NyV%Ix#3'W1cޗ9뙖s? l6׌% NvwP X`SIJsieۈZΩαFw*&j1Ns{Aف+tZXMpaU|*6pճbuv8拚=& ܴ+ nFIz HrQ 1$0Yn@>8u;RݟIw&:Ql"e[rP}f)nY*]EC+1:Fy0Ĝ;f}Hlo;py*>!~YT1Ayr֓U|UQD o0pnFȲ,c]ai#N@`lF-C@ ҆3C"{Y݄Gu;g܀*9|"¦4S,&fQņd;as=znr ٰs>oi>@B6Ѵuusu(^:cEL}qNk]{܍6]OpBOi5(whE53FT>Dt1{{ x| ]#l1БƍZ41ـ0r0n{ٵC8Af [;;x]:ҔO$L=xP=̅xàLEiu_z1HǚqR׎|/DFP!U !oRmy3nsMU܉$EuLqUjT*_w|?d6%y- :k8@7 z~R&G]Ov4נF' tJ0 lPN^'Bv`HBFYy˲t~qKa^(lpHat΃P6p-m!g暎{e@x6\O   9#m}x҂ײWfl;k4|t6ՉF{@_z2:Dm麕EdTìPWUa~L#BDm~E]9cjM&~u4 1F.̢oX8$xrK8 `$&!{&HzƲIc sdn٤RqGF"=0M/D:hX.I2uPNor/7#IdN4q^@aBz٘5pAϋP_|߬kۘNP~ ,l|9I:]E}{eh{1S)~*> UGFo_ H\Awlt?ll2VBr\ 5Ю f'PNaCB :S+to{)'=g9\&RC=HwPuM {j=zP ^dㆋ':1ї;~͹ 3J+2#Gd=OJ ׆x+b1Ϙ Sn* 4|st2 Kd_ޔ#dז>}$-IPQ (u@$wk,T{^"8xjCfB=Gl5-paT+Uw wX݇i͢[5ܑ nZ,PN!+Jc_B҂QV'S%V#bv*ilI'Nzo`śڱs1 |eEIJYewF'5f͆\  86zz22enQii ~ljۧBFW 0'?WNxER;δp Ҕ7fcŐEyԇlDు͡M>eY18_N7m B-8wth}01 :"0t=45st7QfBteZ7ʥ OT6cpAhD&!ݿ=!q},V*ewWP s Z.hu}h+ZF;x3a>*JLD vC7)"AMO7w `fnjK`>x[,eCol;+2*KiF)'Pw|eWD4'w-K|TMSl;spRDŽ^$$]PigfkJs5g'.[X,;9@;.RXG]o1Q[ sVeKa{2j$K?޻h8%}K"\~8F +h nw\M֎8"0fR:t6a1N6^qX|0ߟ[ErPL6W0%uIW>z|_}΢d^ @ֹzf+ PcOq-E;\0+;[HHĆpvwÄVgmKjRe1 юnAk{k_us֖IA%Roεi"Ղ^q/-b =z'{Msˮw% >X1fyf49VxvAld إN4Q6}[5ә3QEYHP<P$<"rQs7lnnHKr$^@DPw% @46Iy֦I!\lueE `fPRv9kAwȿMH8vD (v>dXxdA\ڍz{  yˮX~K}1RjOxI~H\!RA#2s͇a[=25r7#3 $p-Ǖz/}uGWX qaʼncJE>10N!8TU}mc}M~\N_z9`L!VУ1 bv] `^9.2\~.}Z% /;amahEWH2 M4 =_eOqc(uGm] +8F!ɰǢbQᵠ#Eh "Sq?"jt^g KvT"apa'֠PL.sIIt26?& (et#2XqRkLꊇw;y|%|~h6ae@qߵpF=KTWOubyaRUbKA:ݵ(l2- ڰG`ןa- m op(؂M{헹%vq[JD }pcz;jY " N|WQ>COlƖZ+4a*dһ4cp)zy)] uo~;Q%©f>ggk1IPZ6<=|U7rڈ UTCs;Z!V-ƺWM-|j m]]S Pg.WmQbp!U3EIH>Ja밠@WNE&|8+5m6Xꀼ.Up3C^!i~yg;v+a>d\avVY8fU+-& ]m~8 ]d5EB>KCė@v}X,O=6?">$u@/VM\}.x@ʕjdDŚq|u ^$Ӏ-/zsc]&%`8SEA*@2/H$G$2HpcԂxB"^UwMT!s~jG/T#ElB5lgL?JNOR7hN>Nw渃Z_)R,eIa}I2A&wgmg# H/3?GSА, 髯 2 (OQcVGBNOYVt>ǝ |1`ڑ$}Z|0pU=75mv{a C q /c&zL.ђl`Uz7I;_yUϷ//ߪoVȿ^VJ)]B_2CL@P%II8rV3r$lC".'zO~wbv~㙪DQFr%&kU w#-F0_1Ϊp0Ś`99Ihs>y;QaNq`uP_jmi$f5Ԭ'B䪛/ DdK53pe9.b m#t_]} !ב) iO(?0: Aj: aT|o{Yg  ۸/slHeIoM1߿N&x(zybS_nIK]uw_|tΔy'H^:o`6V@T< v 1gH6/Y)Js:JNTnHV?{ sNZ ')m5N*,l{Z%N @9r|'I3oRCȱ)qD > m=a)zNȱXH朗WPN.`~ &P>_sI+k݊6@1/b Eb]GZQܜcLd ˈsʙuW FTU>=# p;'n5:pqV![O_I-(s94^pDG(O7%̸97ES0$BF-+눀im3>TɾT֗Н8p;)[9|b\N3OF`WzkQu}š ,7FE=n&VfCɺbdczIY,fť63%LENT/BPUaz8d"?} 3a f{d@'?锴<]^+T OkݷbY$8}@MV{B>aȔtU5~NZtcLBy]‚ts4~^C9GB|b.$Ӕå~RۅĬ(44Ay@y:Ǔl6&kPX܇zW-+/muV"z,J^Cڇgjʤ+ n%}>[@CcèF,3PP7||T1p%#ՆxW9TO{b ~9ء}MǫB12 I(z،R^VDe%ZUÐ>6;H"K8}!g=)^[b8bbEm$BޘC@sl؂;uYr9ʓhs`wvNv/:x t5>a#0oj. >Ǩx?S Ҵidvs}WR)y߄me15yҢ%=ae7*P7aGRn\ؓ#dZeB!!Y[0K u0MSKd87v=}cOZ͟dM4 dߑt|M%k ̣Ѹkڡg=xǼȹd8/+ط_FI&M~U-S% l+Ö1hi3ok "BZ'͔踥JL<.- &<bN_N#[`d/ /VG]5Mx*vVօuM~ #ed%˶~KpX^;kB4FFעt!*bSlv~T`B1ײ*cCs&KY1I/iq^I@둛W*0 ;j2֡ѝJ;:_M^ZxDb U:Rf,KFoS\q" 74ÑU>qr_{&4 a0o~]oj(Ĥ_0:7i:sSֲOڽUHN&IFb=un~|RTg}{g`Tn¼"2U=x50NL!#r NP0JtN1"cձˡ2H'j,诅.fu<엵kp`bXrfᔬf^xZ`2MM}3?.x1ׁtΝ|AD{Oi.aУ@a8 ;?oXG̕||{K1b,r=鑌\*7zqIcSEFY!ݟژ] ;LjpU!^3Ѥ|QdDB;ҩ% ᙌ"6>?}uq4[e#Ā\ԎeCQV鶎˔TO:$o2 @C[uF+`zz,}@} a")Hl'LeU$)=XiFBikW]B{:ԢMA q3c CeG0ŗ+p{po mDtR. 23#_yV!m/A:,Ѯ&}xyW(58Kۧ-a^Qh\TA81Mj5bڝqAcz M똷kj $nsÓ(- ϫLm>lͺ1  i2fz<]q'? eh'Ј.({*ݏP'qJ3@An C{mR騩|.0^k=[||4EI]d+Dx{f`Q1̬C=@]_S'uUvOOt%jn\下ezk̒/s3U흁t5Δ&w;˃ȷU+WxJ-kuujGA7KBsfi7jTeWf ,8:vZr!fȟ3vBM[>ib3b8h"+Y!UyQ/ݬlfx||=C\q鹕ayHԒ: zv)2=A4*vyxqCz6,=ssBQt`,Jk v-J~Tmrcل+Y8iF6 t<4|L̒n7ž-$/U=o qd-= ^{'M}`x ,0ő[G] ͎||Qb<+ \?1`,;N&:[/U1dOI7Sm,*| X$хnZW1Ōè$# LdOt]K_(`B`@lLnP8<ሿC/C)r+q6(*P W0;WmͥNpީ rȚU TxO?zԱL'' Ej^kw#cz]z@ڌ(+{|[]X.7ΰq(3Szs>6k 2-l6tv`@7K\c)?oc|q%]gG K=,X[9DAHd amn4b+8zPY6$Jc9T鲀ޖ Z>ffWYnB+@ƹ[2{˭*S,q=:l>SHpZ庑x)ROĭ4-nH ^Ԓ@ ^qzֽ?kNhƊ#o {e·l6<[΀q DOnƊܘKJ5\WC0!X.1URT K?2!>EQ6vK JOك7f oY.ۢ~4:eŤANtfkvY]'[ުXG!ovO46QL[xp*`Գ#| 7*s3PNeP3M{RA/2h\#Xc|(IF+ͨlbvfy\+ߗ#'\s!KeoP mtƊngz.azb{G9ɼz9#H"|jeX吣KY(%bWXQ~Ѧ.A,1mNW2]Vn ,K.:p gjі쭎sʣGE4gX :[Gd ?}k%Ov+fo쎍E1K%J"$VzFjDeMkv{ ϲFxR:Co9,1\ƞY3N: /)PJZIbP%Y~[xhɟZ;=l_$?߳ dw1(?G 'wf9S/{-V%No޻hv-7/e83@twBؐ w,y5A-m}T.Ih[F' :5h 2!2m Ǩe\QL?$HWm6FB3%-zGIL`S.0jj ܓOoʒ&sBx.tz18?_8T!#X)%2J=k7+S].*XSq.;N=P"yjNyȈxai\MhvO# @6|c{2u2(wxǼo3 O8'~X- uO&K\㟸"F32@b;U>VRЬ#Mg60]`%Zj-xϳëSH/`_0`ն\ ԉ v OƳR/,yffI8kRMɏQQ!s+@L'j<69ӿbq ljQZRO4"NsA{|k:^@rLfQ!W)`y ^Lx0bTkO`jÂ]qb N>27þפбɌ g;ςwVUn.eDkX9d^uG|N5%uSm})ٮhMT[ZE-+1Ѱѭ) obMpNn*]ŏ(5D ҽ+VHt G\'ܮJZEGa!ٷVZܩD4Ê*<<ݤ7P~5/fFSnd["Nv&1ex rNBQGt *K֦+# hf?,JЗf%)Rӻh /󊣉piyʥa)b< B0ߝM8HC+ cCfٗaSЊa! 9s;^c}:Vׇ$ 9Lb kX$)Kh2聍aCzl B+ ]^OȖwi+ i< UmT@kI# jA&-_rg_`"B~b0d:܇@e11=d㢂 PlVkRiɨ1lZ` w=˺AYHORFEK'&oD@=A/DLimT"Wt˭Q @VX﬚M$z>?]>X#C;!Lr_AwɈoteZ9 ݽh># `L&Z0] 5D^%{d eI\k JiON;3JKҧ:P,f_kAS(#)l54YCFS WrfL↪afn1#$g^Yf ğR!$zc~9Ygz. 8ϰޢRFlf&Ps*wVWAP^EؘG *\b8.V57UX#\@XqjJ_e p/;3xfuLI2)XWCQfhZw%-mujkK$n |=8٠Z60o {Rіa )mfeS:-$( ܪ_]ܜ= pj‡8U< \w<.Sz`[ / lac&Q"A&w)sHOľ#ׯi@iVX{q1XTװ)}hE~P8Ksrͼ:l?7pR< (_31AֶdwZ2"1.h̯'s?.e[ǜj˧272gӍ',#UȐ*?1!~-`3X[sO Cڇ6i?}Czz–+Am=3$H\BjU56*.'r7m2 $y2-.w[ ?ڭضP|43P6сe6͢6Yǘx$vi{}yHD/)#xi{]E*XtF2 ]zrt=%śe{EA?GHαu.pP{ Xx~yC/dQpti*58ekgw#nqӺOZnx`2?u~'jN/5vTZKS\t%i=oM8c}FSC $V g7jOO0P:kpE<.8/¾Gk3cZ|Dx3 da޴by=N>8CDjTQ]ChZo9FLefpo[5d Ɇ3EiGUlG.%;1Lc =IPh/ ~Gd|qZW^ bA:_E׆ 9 䇴y5OS^ģԧou\c!,a| զ&ׅZqw7)^i}i7(/CYεBYbhJ2Tdhj<RN"[PeKE 4'L8td7#gsYOؕSnA^`+I{v!OfcOl̇)94*|Q!5'ttMlפ>oVY]qd Xյ~97?rW \ >`lr)p̑Z̜Bt橊dI}كRUp[/A!c6HR.a8,msgO FÒJmvPNM#CU=䥝Kssɏ e9C8F ~g*AӴp97s@P7MܻqI9^1hGiYE*A@Ί^B(ŭHu-Q0x͖+` -/H%L359T8ojk%2}TU|BƔ+t ,&3L^ẛe0|!0_#UO'ghR߬uDF YD?=u%5Uc@顗fͮL], n@jhm%?' s_MB&R"eӻWdxg TqAwwl⛞}+B:dYg{-i8hɐ&iHn{0y i|ZԤi[pBY"dcRV(/A86#1>ŵD5w`Wql\I  ݹdj:wy+xDc-vC(+܅E@,o2q7glo|Aoߪ vw,-ǻMd0ʶ!܎eHp?_՛ݰ =\A6 \m,O +9F1C*񉮾٫3ؠ!կg{zkPS!m$7W)0_?OKi`? @ܟ슠Dy{0=汆??ͣb--,V N58OUQb\ b tn!2$}:mRJ##~CJzQ3&x,wyXh` xs8JG&N H}?ycxAMZ]#F'@&ls;\d /YsM[~LLqoLLayD-C( n@}T1%jKCbCT]HFx}_zޢ5Ka8<2tV,5^c0O ؃ݚkJ/;];_׽5ᾡJ5CJAIfXiKZSC\giMHzuп8_ާ0j|g"a(;f+yApCi ͜.3EytGlL N〦gF/IԒ rw!X6h|µC(p"ТT+q\[`2eV=O ,'4 Q̽QČEX︖čcIy̌|/zl$o[/6ލFiN*~: 3аo@)HG[}>HAg5Mkr(9#Rzk"ct1q4|YƿMLNCҠ ,T:VҒ\6LdԨ{EA Usg(>˓+1xڒ FWyFg?|$4{G%5YS z< PVv#.G*D·q'J'?p3}f~I Lp,9DOkV|2Jc1)q⥀]V0\5& 0ݎ&ؐwwz&FS;CZ֋`GG<+nL2x8[VԌXP}a$ f=AwYHԀ{3$ޒI#CCXD2X,wڤE @٫CSnÁEo *WB4Y]e! jB!ń׭U$oN9 kY?j\QH$)ׁGz/Ntʴ:1fVQ"cgVgSC<gv–%qÁ5^W?X_%?3 []F9tr U>.WZMOeoU^ FViTcv2gB&r~ɛ<2Qߤأy1b!$iԏ"hU&l,K9RՀ=?G#Sߧv[i;=R!QG;#>9@q Y}5 و>)c L3QFzO8k^-Ņ$oLK1LJ=ARQG[ðHc]Ŭ55x Vdlt =_tK 5 ᥁b3!CLz1mO) H^L9 b_]qL7aրG(Uߧ5svmQŰ#N|OWdJ%)THɲv#}WP2MLZ7Gum(eK}DF-2;=O׽6̍5%UOQff` "P'h7ք(0$e4Q/ʬav 0dPPN8s"DU]d{A6B:z/zg[Q)\@8>Gw|Vf bĦQMdm7,?1, 9#qؘ͘7,G`&ȈK=\ t40BC *16L gCD֣k鉋 d7Ύ$g)Ii/<eSmKE:xS-? 7 DBmP2_B?<82 -uw< w<.;&^gE*ÒHIQL(j{Vg{Z^=]'ZwG:T^0UՒ{2=ec h=Dx  tuB \IV|S=֧x5 =) ]_L [g0=(]Xa`CrkAMʭ6\ǚ|rTԮEuO~W0v@h jXԛ1⏠n-DQYBc0@uV߷DD/ތ& _&(oc6;_z^bSrҒ~zR5 NEujLG뵰P&2 ?;0| AM(eI:K+c3\Lq܈lmts)"XuLAD!g7/h]/4SQmؾ4*j^St3W 9=Y_'{@qUVyH3VfbVG ͷlPUrJ.4M.~ o @|ӥ w]R$kCTcLV!_K*E  N6tx[c4/$˴a^a DpG2 *͈ ^=icG;ruǓI-HuxK˘ 8fX;pSFwhg3VEFxqښki+8N0۬)Z`jX$>@mjoL*EZc(m+ߢq<rt`Ƙj57ԓfRj| ղ 5`-Jʪïgw_T Ry N֝l3bvzP k:"qSbW2Ɠ,= Љ5p3.g#BP$eY]{fCcfܫyKPʬ>'6%a[v1$Ojo~Gxy"<ћJ+7?ٯV'9 M{ ^,8MPrr;zAh y%K%D68M.#CCE};4>MEZ[հm !"p$O՘!!K3OSqvxx9j4-_{'¬[`hUt }Gj)EGO헜"Qe7㹻HyKNrUkϝP[>b߈Q|%LӘB/쳄`p7$^\!10u:%Y3B?HٝZyJ  Hj+P4OxXrb1W3Xe|vpU3( b0Mў{TV"ijM` +\;NwsLFMB s9L1|bӛ}| &iwuւxk0qB(XNR,뻜#2_hO np8S[2V1\JNPxoM/oSEWHPyR8 kWI6%JUzh$ 䠮3~]UUF\Q(>,u4ՊU vʁ ϋk. u(cmHxcT;3)e/B?+ۙc] :#ik@ u݄֪ݧ:ȿ(ɷg36TPHl,c̰k'nps4':΢zlnq\ye7؆:0I<`&׻4?n>=ڽ(9ɖ# 0mQZ&ƽ^/ݵ+ ;,JG9YtÞLs( DND~Ԁ:Ey٥7,?FYJZ]]M8LEg`qBo = 2x_!I _a:/f'2SWڏ`SޮF4REZ@|h/ ʡT | ɮ"0y_ww͘gF]n[#כ<U{J}t?\ugt7+"̄?ER9*#pܰe1=`^.cfθHy?2u,էH<ovߒ;XghGC(fPg8tbW :@Qumhٸ9I2(w뻶4Cr#54l79~ 1Fo|l6W/1%B=}b;yGpƆ{ny CuvFG>)bW_g}ۚ. 2y %R 4鷩/ LȲ)jiP vgUf 폐UU(} $r_kᐰŘA03?1i33id9͖WDԴo̝^_D*."{RեuT ~;dʋmI @m49jIN*!fcG&'ݚҕ @vvll\%f8愃#x J5?wW_9D^i;aۍhȕU]&B6?/M3 `f-(kCOg U>Mfmf/Q F1՗\3^6gxזnSo9%%v$_ =mXG~134Wyr~W& W@ uf++i5^ eq1opBӑwMJ `S.%Wj槟.}4-Ul F+Ui.x?pIŘBf5![j/!ӮOPuohp*G>0㑀WQֽAb*O(1>4-hΉ}h$x v$\vMy dqh$[HOf0L3k6~&9(m^QHcxp-| PkL ۦIM$u;kQlJ6JM'./*!zC!8[d&TCYcZ#[F;qTi?h*WDҠ w!), ^k`;0w}^I$EMU4(: Y.|Zn7^VWC4~ Rx-6`V*>|,v>ܚJ9RӬ>DRwҕ_C\ID(gZ'LKGt5Soc4ʆ\"GB@ڝ$RvLeV@,$FMRޢ+1ȁ̍R}˒E@cKVKl*YJ {5ɒkػ;L𘁫rB#3Q#3i-)M2RvԩN}KOOԕI! qHA;H2<u\ø8H;.Y8M1@1o p+L))N;K% $!E %?z㿯?g=#8S4_L5#Y_K9oZzjBFӅg<l1r_,p}"ᅴYDƬUx-{ޓfNr` } Qt؜Q'2UOA椷cmbޠbj{Jo~n'AjMT:z.R+ _=Nιn}z2]u'גtSƽC;nWFWژ|UCx?1w0̆`j~\9P[)Y͉(=tH0 `>We jv5h!3Z.&#AXdq/2 JgJ4iA6suD%%3̑~U}yj'Y9*~{<%\D_K~d7r!ʇ; 5~:IdIPd5b64 /bPƙ z_H,+Br5)\~<"LM7Q 0yK@k:vn M/oJej-(pd>ex54Sc</؀J g-d*|r1F|!@J:]ɗ &Xb8q4g6F.x<"ApR1-FI 8o+g$ֵ1rTJ+ Y-1VD^.dܧ夃P4h@:y5[#<$ (H.Ȅ2cl_3ua\kS~QaMI6SP:y >Gͣ-)y-D1Ѷe{ҺXԬsڻGzֱD\La9(x~?;#-Zj&W跛Mҋ>CNo){ܑu<7w WQ`ۜ>S;Ysu#`f:WAD g C) \%T閘~]= ڗ}{ٝUL͒L9%!Dyw&KM0oھdJ&5Z'_4,kEQIǗY i:1Ik0'\M`O%9Ibuf@3{:-#hR;h_n=`ZKXb1NƟ:Ɩ!8Va0 c$b^&kuurh2.02U 'An4n!fAیЋn #Fz67mW(PqPN%}`ie kU|R|@sy/A]!!uM׍B0E;{zUT)qYCbbq:"'/b(ϙ-cʪHL ?]*b+K0džk4:֕  aj~B'r_b/thq9uH:ᐰj_HN\'xϦT&&[kq_sBW^PǣԋǮ]Hw3sQN^=ƅ7=2X{c>ig"Aܥ|#>r[*=orx+8? 0,֩rVed|!04ȇǚ5vLZ(Fa'&I<6M#6$ 08/~DV*.Nʫp6Lo.;szVHTADzOyK~1[tijR}yFۛʜ[t~G_ԥJOzb>i褛ϫ@ovþ@|s-+sG!KKTT mgWG.O-lLҀ:kxJ @᥋@qM?F &T>|TGd9OJd{>dOF{sdud5ƃSnblo,igjmJjt\?=ë4,(yEZ65iYxI J,6l"DeGhIG`z/ X(KYij)#bXC:< amcg=HH盱Z dpS}tꤨˬEcQʦ7$>/wjAoPZKV~K#Iq&ڿdۉpG =/,D=ҬtO^Ӆ680ӝAMvG0bAT8HiRӸePd:HBdR6U_uu{DH\_&IOz u?]:/X()0A<670\}4aR2 NXWpRhb{[N ʫl|ևЅ >rpl> 6pAJ~i/]y,X |8틱>yA{WI}nQ,)CDVJo*}ɠ EAVEɿށ~ VPT^-, r w"orf/EF~vet2RJ wT#Qه4a9UU>Wãl=f7 1VN7+ҡ)'YgQF#~+5J|)8}H ;.!{6h Ȣ,yfTצLNcwa/ mk_8>]vݾ5St{.S-X͐$!2xҒe|<2?ɽSqu4.xK ܝh+6v\MIazށ:M{&O(zC̹q%totfaB^$xd5_LmC 9+OÇm@o) at(n|O9)t1BT1KK!q'bfDqzF hEʢnLϋ~pzl%Nj;'@ڍֺuUȂms~hߗ291>.[-hOж)Ѯs:0ڢH7C0@u k~~d2'I XTm֩.z30q`2&2@p:y0ջdXd(QRlw6lm)vj< a|XO W_'[8O./g,"nE\uBARw*yg'E\A2Dk|E>yWAEg$ƶ챆9Yoxm|am)F)`wli X EiPٖIPGD`H$crv NdóG:p!;#_n4?(VW`/!F[z geD;.+P3-jqk7\b;F=OEf"řy}IG'Q30\/:x)'t*{clz(svdp#OGg[BպeYPi)=-hL>Tc%+jE_)GS]HÎࣅ/ 3wg7L>/;[M4(~W˅ \38Dj%N͚2a\7)%Ǽ&"fH]4d/nM-o: $ uBȳٹzPA7>J!!IOڹX)bHD%AĀ Yo/8g!:D#ePIX|bکfx@GOZ*) z4!KχbVKtݾ23@e?MxxþMSߘg۹ Hx*JϾY!BO>CSsV9^lȣ@CqčYzf4TQKWF~xZcDͼI=4H}M;"V"6yܰ&LS#+pݜ8Qu)ZIe*c0nބ#&YfR(o7r/"5B|ڞ3Or䃝E|n̮5A*>bidw.ANRcY'Frڳ5ܜ._=4» [b~ţ|* -k ĸ6 n_٭՛ cifV;aF5,0~dc 7)Ln ߾!䅫{AuhlT!҉7v%D,5}h#y= L>"n16֦[:7=ף{2 /5<*r +h 8|5wZV2u*Ь_&|$G[ƣ38SHEg@lHv %ϼ0cLʻޙn=/JI/ Rĵ*\$2Nu?:؆% HDc(φ IhF?J_He4ј[ˆ җtYmdp_L$+kioRP;P$Yl"MWܢb QD86j I H!=r~y7ȊQȮ+hЁ ^a Q jUK*͒]S.^/2k& {rJ{l6Sј*:TH;goTz~PBwɢhQI%M(c9䴚"E CkZ8;ʮK)ETD\B6+c~K%6-KZK0GuHnJkZSq6hSFTJD70~I2nJyZ |%bKXSTg8`/ "\y ߚ>RvQYYwC!' 'ѵ ~-"M6l|Z)baATHor櫝n,/f|nUV̓2A<q"5qv+W{׬̾*e#7OsMUT2,1'y̾NFN _+z|`b X^NӬ9nяd ="ʲߛXWAw#Ќiƛ?YERj_r> ׎b6P R9A,R1%ue$E){]m+|DTv:Mۑ*K]VIHSazAg"G+'(2_O0n|Zvq[kSc!_'n2̂}L7VOnmpIo=Ɉ ~nݺGOi1^޶0lgku~@fZ,uPk'O"&|Ɇ& g.}1|$gB{`&*{Wzm#dv74SL㗧Q˜* 9mE58Th >LF3:N h߷& i[1ݷ+ cxCg֔xjIC;y ;/*oJ%jQa7+Y)x"nܲ{ )l4:;l njG'?ø퐟۶ e6w,7K}4*ڇ;ido>Ƙ@&t1'O#f>YfXsO؎B_`+W70~*Cjdp^EK)V}N4ZhڛQ/lb9Ë u&/yoɻ7mw(:hm\oapVD0۪"%d=VٙV5 !~0SؐcsXEj dsDUgoˉ.߭*HB}r",cW K($D2QfD~w5eϾwM3Ey t9t^ ڕC6'r1kB#&Z3::rfյn}Xe0ACp~:NPs>C ]YG^ p9"9%uvEKBqg3o7'YJxiRcX絍؀Ԩ/WhΉt4ܷ\F bZyvH= "t*ْ.o Sk@Ps1y7O{ N;+ȍ qxUM ~ci:sH2@6toPR31yzUiuqm,aHbX(B{h`Ć+)0:DYk>5\vB'J#Z} RQh 'A^N6~8>uy5.S|"o!u. _ fn:E?jߡ#d]Ul2&X[.5yCWL[&3)W = ͧ3g Kk9 ggNc;6v͒Ha6nv7Z›)I6{t+6%JQBmt f~}kX@3TZu?[IY$Q(H7h,EרּcCRUVCs G;?Dd5:\ :*Ý慉$׌լ] L#WD[7_1A0郦93oI*ɁNzD0,O](c2J_L^~T@޹k)%it 7Ux7!j;($99qSW0룙5ni-L#dLo*f+*ɕ _"vǍkTCىqr<AzK΁X?bdޖ N[lk Ћp뉁u7⑒rQWS5U& ΑC]'n)۴@38pZ;P/b^:{" [KZLdi*yE1ۆt,@IlK,E_+cRda^륱ړ<VQŸ"räfG0E{Dk Yȍvb64#bP$H}ql-V,(iNPt3i^i"/٠P Q |Ppqm ڂ-B6r+@Tܸuf)ۯ0Wd9dG2/ѯKExLO1»]rK)8^ů&%?Rq)[e7,:@GŦ0Iat KTG{K52(d9}֞8C`ㄽS jO:mH滼ko)/l{Pq+J{NOyzŇ69Q=̗-{M8&lŚ Oו/O(\YfFBA> +0DJ d7\rv^иY~E' 5تK6d ՁaBGSxQ/\E5 V{ G܇)Yo51xwlէ@lq Tevr+5&ÑU.2'06LΆ<۱J?XG6_n%g̯ 9mRiYH^ĈWbD/>*BvוR$COp 赋_t߳vʍ}!j*$d'ti/A5xazZ֨)(gʝ~Z𿕺O_υ6PT,lӒw쒴)#SUXEq7 ?}--1C?xSg㤚jAtXC km l-3YEBf_jQB"U% ֘4F^cJrS`4QJ\ g5ĜTv~/mj"3:N e6҈U;c7(ïmd|#: FVU 4R5_y(<2:ϋVQsĚ lkT׌GI a[`\NM&k頔Do4S7Zj%a2?Z;bͷ pj:1d*~a\]EݕBC@uuּ7ILo^ẁt~h[»0)Եjz(|S-.*w7oqj0ͭ0!˘%a8 C!LE IPo)e琈nc!j`H-OǟP&h ~m:>E)zu46;!\C+?gœ3-sOPj4ܟ#wc"x;RqpJ̽ S /jf1 @m*%.DpJ`;g|~ (S`:sTx>nj!W;?R4qlXu 5ikMzD]ڑGPj>'oKp_<a|]NbC#x/_B^¶M0t2]Z/sM]ԝ{! ޝ 2%# 8vŠ[DօH#Y8ektNOg|tymOo݄51_v2K4C*6n#ү41GӶ?~\ܫVŪ~qj}e؏oRw8_SaAyzCh.P>mS$5zOZ|ZQ X?ջ7~ːjwq>B|͆rH,B?9&~"(.zI /RDI+'*M1`B5n|OEܼpk򅶓WיQ0gK4i> 7B6)m %Г)ZmuU 6jk=c w w纶D9Ӯz'-U!Dp#͆p;դz}0uwI1;(Gف j`{an߬!!BtٿA=cxIN%`Y &<&\bJ*Md@I-C Q{HL!**`PhȓMdٕ˘' K,[A%T"^0aTl4t Pɟ]s$Ivt ]6W.G_Twrx||iC{Hk4K{t],@p٦7KR-|ݹ]kb&}JD ?D5\m $S5ꘓOYmC?ˬfhŹlaS%fyj)/^>"HѣC9o.Ea%P][mpvn7ue`NAB>j5&`PxOkλgi=&gXp7"&OY;B~[]N|~B} KݤdΤ`(EBZD}mN p|o:1-Zv6/3ΥxNq@/QR/s ^Zhn;Q1/#$V;\^riS ԳE>AJG xnՅ4F~k?n1@.GTtIi\7,F>|MsФS_ JyXYh;jӧ~mIC F\֍'s&VJ}ɀ"f;YƜfɱQШC¡6Gkߒ| J;ԸUKJ; B1~ZӝC² ~(&! ="Wll'uړg7zT{'c W$C w qfM+I %{yY-k5Bhg";϶?!r.~[ Bnc](@r]f*jhH{W)u,t ޞYQ u¦cvy= տ()Fqwkї؈y"ZH gE.ok!6[?>Q Gz'$ܰଈe ,T3ZFϞ9Kk_^K1.b0)3,wс M0lKphAȁ#ď-Zc<=ҙWi2,! _@8Q$IeIYM‘cYA:g ӛk'] N |Ex/[Ji_JMl!1qR!a3 =ی.^ë,\2T-&2{fV LAܽK(VDI9SuH9rGzݡ*~9[x"Jmm!ڡr[$qMzٴ)@TpqT$8eWeS= J Yij~ZxP7̯v]Q[mjggܽH8>(E?'3Lm IiVy4}"߿^hb?v+&*,#|X"Q^&Io֬[>C!!n08NU;0Ia7{O}ɑ[͟e$TX~Zz@CۮX׬"gf/b2El`~vKI&W¦}oU ׌v 24M+n&KSLTрV&Y'r>B>]%SRK6YDc K<=u DП`q^g녳ҫqflśLf.~ytq?!֥ޤ*67*t+9UY(|DqTvM6c=D c%h#صpB!.6C_},f#d䭽a$*<ŀ\gz+ZDUtzjSLb'k灒J\M1=tB{MM;$Gۏ$֟|&NlnLxQ,.e=)r ׃_d%>k oU`nd ̎<sGJQ~d~+-GEX1[)Ogix!5g EG0$Z\,>8`mtzbMbg[=@w g@\ѸA=Ӂg"V5"(&{v["70B/Es8xU VI{"($'F(Π Cɿzx57*X2T#[X#>(c&T r~aCcuSru-`NMSj&Thŭ ގezlAnmX\qwVĸ (9S$RQX]qGCm:|('1]'kST̏!nM1to#ā_9a}#φvhˆOv26Y>[ဲ - UH69;|m9/ NM%m5C1gk?ڻwW1#!UDqK KՐ vUĢRcedlo!S("g &% lrH܅ 1261sNԨE3d۾gOŰq8+P҂7ĩփ:CZuqTHa蛉N@q{mPx P$CI@J!K30/ <Md,uw *_# EXXM47÷>(Kr 1:ry#%v*tFXoܴ0 *EN{?+m=z%7q>9==d(ڞbgenYqsV2n*ØnK[FSǞ7m9bjbNthV )Ļ'H:rxz29|ԓ">eD"ɳmӛŌ z6i/͵"ٮZMI^J8^H9T/Y4|扰i f*+ns|EZ喁įy2ƕB0y#{m$B=+It,VߏW!v-ouϒ"?ٝ\=u \mPbn0a\c6 NIt^upđ*WOh,P;UX߸Ԫs[+7dmM~G;2f^㚀D'/*L]㓻W0LA/.l>-x} }h<{].JC;[G+PiDv6Q" U\Џˀ@Pײ@"u7G{= &g)ƫ<{] sJf"=$p*j^-CI;~H ugY+!O5lLZm:45'ARY5tg;[ۡ# l4t ؞4ȼ"BncƉtϯ#K`ȻP0~uHo7_ʚ'';ËxG?'t6VZ,Imtв#K8I-nQ`(n'[S\Nfw\k[C(Ǧ]pm,^K$s15fժ9FR5]1vPɗI?đ/^y~MJA~6dFOuS)F}QkίBSt!5--k,*hF[A8vt.T! OP!ke;nz#'RUK|d^ͬSMI8\#jeG?O~u T ӭ! uMF?} FR|.d6*[2 1np]X I'$M]JIdH}8Y\ag;V@P([\,$xbtP$9np$g5{ \j$&F_i;^&YT[H|1>jn7tY9=7f>x'{>2󓏐Ad`/lO;+v'Y7DG\ҊzYrC3G 5uC:Ԋi$5=95I})*Quͳ TRƖ32);o8\{>$J6W,GK_W(=Tdp!C2xMۢ~T/xT1G%+d[\ݔϗ%;Ebms. <\NK?绢< 2ƿo&T>5H ? ?33YցfXK8&{c\r{)R,(`_Wَsbf¹M y||o@Ln-AgA!5Wތ<Lpd^hrF)[?z'&4˟RTTGeK~a4yiwyهFp' =[Tvh|JE=6ڸao*"B?xc[ լknl]{šO"ArTƯQ~loZS|nGGOM7TNsR^W t[g8R^M JUA98ovANd:YNBdRJuT۳ͽ7D\Jp 3#]᛿=wj=&GLX &ɩi"B˼x.\t[T&\\Tp*}Z #~2U=aߕ\#82.R#ڝ{:x4A))$MN '߯(u?;~c 7tXdhFvQ瓙{V~1<a]>WVzB~>d4c HmrZ/ YR5S93t#Nו@TsPvZ2;nDqJsq5bڊskbi<,‚_ͼL#ٲ?^c&?RhM,S'i\c0zD6Gx>|/uh& Ä툖PI N~ĸE=,#x[=bј!fX ZC͗!$}ab&̰pe0qQfv h5zx!H'53]Dz/ #9\/L'99mۈ铰iUC}NV*-,ӌԂ>navٞ:FяX*"S2H[hX_,ܭl;`Qkki~e=óe0x:jMyꂀrVtY>"ҭ.^|xe+܊C:hĂ`"[YW)-T 'KM\F.zpc\VPPD!GopW8suc6p?3lMB% 9G]mDʥȀ=fP>IxxpFK}\0 Be/$'FK񨃐@،hܶD4^LȜ9`Zސs,|n|lA,/ewjo [ʨzOEFВ-\/s$TRaJvoI LhLJ <>?4p(ӷ32degQUz6|nɷ'lV7▙RvU.CLG 7[L}*NGJ,/$_U$)>cz>r[ ŐFNbRjYKbIih֍3DM."L~ﳇCagjg͵_IR*n ÀtqJ|1ea*dVJ" [ [4>Xr{?KzEݣ90#XS(>Q)8aW\zwi&،<=qϖUܛ]ԧ]2W= 6a89~4Ric9 E}eXM3B믘u`RyZq̵w-#TwECM-xK/Aou< j0&GC8;fYf/[*I;)/|K:tNáN~\pl1T\Z쯓Sn#g=XGЙO_t)vffZ ĹXyʄS0"~A={%l>DWKPx(PwEHSv/FX 'gi M*u~s-3ܥI\heH`1pH4븕ZU|J5׫?Hl>iV:|rtO”F{g 5t{S&R"#>Av2 i(nAV5 jr(L5d`[tRxi^Di dM=~-@Tkd#eS^DhN4P{}e!җ(*v׳)6k@g5Hy:Fyz`dhZԪF zwq&g8;[Y YjZlƇf6w0SO&xBR{'r,|raybx}q澔n/&(5߶WPX3Uє)LMpeM/n`P{2>MKc#9"&k̪gp̣ofv?#)0q.isMЛgNok^oh!7ȜicqѺ-cLWHV GI}C8ޘ*7y$P\C6<@6Bnݲ-BГсrOKW8{o:A&\PC Odm 0 DģY4u'(ofwVjK)>8:任p7ġY1XxjyYe?rs+ < rT~hw/-d)!vjmȕǤq}m?u+) od"bdcȉی?ǕʝӺiZhb 9#It_~&K+7 & BXz"|?dJ߷K* T'4L43ko/ .2TM ]][P;tnd+^gH|dxM6+˓Vc6E635Tu@# '@?w[cSleYG6sY/! ӳHpW:^燡GDn-{}8Z׾%?g};q?X3 KssߘAwQ/<Q,r֚8E4zڱSrFG~cj55Ap\AxH_{1|V!, jiz +٤Y^کQigbEtPGzXx]$ſ5(/`jHLHY/jڼsX2z8==-<l*wB~G+."`kkDJIrJ G(1br%[朽X\/d[#/$}|9[7;q, NA&g  !r*h7M/f/Փ?pIUĿ@C ~?Pz"jMYF'MMdV`)4١O~wHكXٻ+pRĵϾwMs:gS}x0/erVnUѕm6[d3/M*a!<&B{2@M\# v I9v%w{,DuۈPDD{+G3lY˿>>G7ơcv_'1SP"H|rBnfj\_tgܦ*N0mk8 .wjTFQKvWԔcr,~-M*2rA׃A珷"jt-?/dHmD]Qґ݂\J6hׁr}1ɶ ԉ©ݟ8( peL)!MڋCs쿈8%`K˃k0v A!Dx׀H* ]٠$v䈟ԟF:afgvJ}̗"VpAK;/qAMJMw#%Gh4=xVd[#?Kȧ`4#@9?"uh4v-n1H_Yvp$]{ͤRCS[`=#; 8qV +S7f2ۖX|򓇲c![i,ti VXƼFHm@zK4\|0Vk%EsUE%)jdȣ$E"nv'<;y.a$?SgvԤ)3G487|Ql}+ HY8Q^w\ϑ4 :%+_(($rs% >3tGAg '_tKBz;Ղ!4FHp[.?l)i0L) ?D#c/v㗚mDqۮPn!TzWp`'b딜 zx y]s`=k7[Lt]Wv\q{1<¢dX܂Ê>ͷFtjb#lDAJI4oy|H&ޖ 3uexpmbz#K(x=D96'3Lox ^cʄuqlTO} `R/Þ6""(.bj,98\#F932_xڏ>mClqa;tN|>3k qx\MKo\/ބrƹ2ƏK N+.;uKcĐs X_D6P ֏#JmfA8 ܐhÜTo@ZX䉴J@*#}$s Ҧ؊njuMΏ^m(W;@iŨ%tTW+tC")h]( d!ة'򝚡}X2Ysd. YĄhsyGzd y#ks/:T%vuht,-ї@rG;Qp2gv}EMG.ergf@P3 ɻDA#d:Eў~YAPs03:Ӥq"5dZϟ2T-rNՂ?«oދ?EtFbۅ@@hl/ 9(9,=,6TA̩a W-YÓ'1p |7oa\E>wc9gtY4iIOscۻ|iIe,m-}U"dI 9h0qL=?1(؜ 5ڋF7_ n3 K-VJB&N-TfĒv5:,ǹ>k|/ӉG=Or29]) ?NKrĞٍ|_4q>E3+%LZk̚+$ ;C7%z6ɏrxUEPśP&RPGٽ8 gF3,tٟ}r@# K!fѡ]VQ嚗{ZB8"QsFy<Q<^ /0Ꮯx7ģ \კϔ5TJ3`EAr^V3۴_I}(R"#[Υ8@[Tp( @CH"Wmό[>] Zlf -)xo4fReICӴڠR LV6af-^A9O7:c2mAdqcV1ؓ(X}cCJ؝AJd:OV4>d0ШNwqS_&72=-Q2LfUTo!~5RS0N/F'pX=~dG5"Ӫyk_mDx[+~ݭr748GeDIwآKڰ$in=&h- [c\]Zc/>,+\]>OpILͅ*&x|t&_Їr$]~VTVAOF3wz/.I@w¯.GXIp)_ /R28zA\rpI|y rDQh5%Nnh-?x^hY- Y[&8p͊@½fxwAGcZȋ_w<\qL߲>H6= Li6l,z R ~'|?&uj?%8ъ0& JIrD~N4t.>d/( 6W]%lu^͛Z7nwyg<w "d7܊:sW.jt-* :sU̶(.i59Zs%歐SCO&j73;G{ Mϒ.91抆҃f5% `JXHma2P<9|Gd&5@s p@d|TXa!m8E|F-$v`O]: }/ Q1.*i b+ʞhݪ0 xho¸6lj}IVZ&Dc<,<끬 2R@KELn/G-'$]Me?>ePE+0RtXu)WnBТvH VeV\-lVV;C8.kzGHMhsنcIi.FmuPA4P"瑎IʠuVo4w+Ґꔅ!OQ5jw!3y c!B=DvQ2< bwҿV)<ֶ!pZh~p<?w"<5NcU#[my4 #ÁC`Šxo]>ra6p~BoJt!ʸW n !1 : +xgPk)zV-,T28L纰߾Eǚo\gT>\%=W+?K ꉓ'p*ph01~F&H 5;}ۍ_k-DZ}y+e*!CŪorw#ܹ:ʢOcagn㬣e/~k=sk캑uzr E~NuG$D:wzC6\4-Tn/;m-P5Wgh6$UBwJ]8~65W(f6yvy;TB_MwV\e 5*#IAfʧ/xW{< 9^bD''mhZ81cv6b8;7ܕV)/RbŅ,0wn9MDV<ښ9FˠE\ٸ0$%ӜZӼ5'o1kpnXwr8Հ0/4gʗ^W?"?MQC%Adi _bxH!LVKWDf`VlgӋzvUqM0[ KW4[M@- |54=\L7ÔJZƣ3P*]i[+ 8'W?Z&?X4r8Mg߂uxhC׆]G |y=y&r,ܗ6ZgonY,vQ% 5$;q+Z]S4.}U^Т)_ GP9mֻwb#"3 séRsT;.gOZx^˞[zhO ڈ-.0%ntkolfAԦS/eUA!?^K$>#1m<MT\rp;:f}_pk X *ڠ$"v" J?eFzLLioM SI)l:B$,i2J]GR&&>ӱ_8ZS)jV 8I!KcV3;&? Z*X+{@r$=w ׁ42YHlhŽRą>q(#~,'gG5x^z})zgЧ|P$%md $AvX\|8 zlIF$\Z^$G93b$D͆ 9E*53>TnVxfwqY ( 8Ŗ(MT(|%Q΅w"U[csoº"wTʔߺ3.-zQ۳3ҦhVo{&e}c=.]>C3;.<ζY#փ4#If!vnW91:k_jiiplk7Ք3驘"\u|I6;}?;8QJ ? ֪DŽ0[_zTF|1|̟]Q]uiO `7~U&Da(I8]x =.^E97.0Z+=0mb jj^v!($K/="0 +R7wi>G8jPjnK{P]ADObޡ͗ی;G'muݵFu ewg? q8G, ;5m:'*jɅ]̣ HHD L|R/-\sٽ0ߡ?'е,`^? EF~nSg5:'ņ>zp Z D`s)t&|UNzz$XV Oli6 \1nIcMpi\ścYMq% ^(>j%L?KyzРxf'"V8,J`(ia]'i+** n7ye<RS]}N)4_Ns7Ӆl DŽ3ٿȉd?; i-GU"SB2Ѫ+F_lǮ{F"(T]ZKd,f72 ^9pل4L{٤>ID2CE /4kLw[ 06oN@MYxLgn}Zf[A udl~x, d.zMoqkU*D$ :,&4&6eJ>6ԮpZ-u_ޮl#6iR^2RرYv,HXt#@X5N9n^S=Qx ?Ӻ3ҔP1HMKTlAdzr VF$~Ub[jǭ_Z Ix^> |hFq HsW12EC?VH~N:P[8u=ic7(Tw(;Sv?f#Kg fK8PdmVW#rt&0dC<1Rj @x= 7јX=1Uܕ NZ,FX}?Etڏoݖ?9'?~=!QǬk)b[6j2mJ` h{ 459TZ KR:<`U4 8M%,(Ea !^l :13s[vQ@q 02턜0vhmH(F凟qG! '䶪e nإeo.~V~~_+F4x=Sh+)B]мWQ:]$0 JTq"Eyj >>:)g44P%H 8s§Lu{= j0a.&KK6 3/i[aCiXXHub T$L8At9ba/V~YTƸ)7D=kY-slݩ ۛ=bQvx^D9yajbQӾ\/!DSx3{&@iD=Z͙{n. ѸʷmU.yB R)"=߄ K_kՁULȀaTa qd l,ê۵923cg pDX&+LZsw Ӹ50^j|o|;r]z [S]:YL%OlnY9x{7hC)nTs:SpND,N2P'j!: ?WK|=<ϳQ7Ɏ٘ qu9[5ItԮ&ity^UNl$snц8",e<PIFQ,gWҽ*BrBp픍Ku"=ĕϐNZ_Q_qJP唴cl,bxda#diĝf%1Rb.UhUrTڝ˔q96B`αwD@0((w6z=0KN* jF'HZJ.AG`-0G۞qo7!=F)#Sf´,h\6j:#>8^pD1TSHˀΩphj,C`:A'}xaA%yttmOU `}Q7ZӷIz\]GS݉C㢍qJ/zᄢ: HW7՟sX@eS. _KOmpBמzan,huktN1yb"`:ђnk׊8#0Ņ72HV֗_pdžMK!5Jg] { F5DX&6Uem j^,5dZQկh-(8rcx`D,P[gG݃Q>Oi"]86ސԐLEnt4b^ARɲݢlVLd.J,N(I-1d6F檈g(.:mS_5q*~u 7 YT)N]O./ : ~Lm6SŔb?"s:>N4%fwsJȻl=@EKEݚ)[~n>i '. UdT"lyEĮXMU,fǡq.~^m-]!([H,Aeրg7'{Zާx<>HςՔL`9Mjc?3$7eb.Yr J+ۘ{a7ʀ[P9() HnRفc]L\O{tʛe}yA-Yuf}M(dףA7Q9[՛a_s. kR$'Fl%w:[,q5 (^B&@6[ʹ-#))LE$!v Vd_H㍎#RW= w}zlM ѲNꕕiZuț<0e5A;u-;F-= &1(-Pk2fd~$u Qo $t,1q=^xOTAmtNOq{͚"ȕWгHqE. ӕPǖ6^ R3k޸rK9K Ίh-&,6\XX$(3ެN"y}J _BiyG{̪9Ԇ(*W">}|ēȞAV.gGXxby#4,Yos>} `9,rwdG|>3KFo7(E2:HQ%vow:=}me*gV-qu?):ფ$${h׵.yg6_l!"B ۓ- r"@:TM4YTΛjȃ}r`D aqL1C}zЂԭ}Wׅ0< sY}KIhQl^_хZ:拒`;j^_gxg(P7BSuTkڱ˪CwzʡC|ht:cf+kQeOս>Q6e+f?$B^4a!Nn>v}]:0:TvV uͺV:Sh"6%;q>6#5}/3MbaB:vpl(S0WWMC4-HX ubWQwܪ)[oW'1FkLps;=+Otw-9a y LLf\E/Ftƺ)9G; @tc{.hI&`7ar .uҹjFܤ,p7s&h}-I +5PgyYycPLHmFa"1!50E@ [q,7qy ;<1O pfɑȨr}".Tf3ln!jmZ, Bf<'?/45B3[L78Ohqw5T 3h}B,(_=ŵgߢ3dK;%+nW8v#4{t:UV+\׈4O*в7B)S-TIgG73ܐ#&* 6#2۝Phb: TSk;9}]i ,'&%V*gJnQJ/4{\o+l=9 GP1Hs $+0׋O)=\ |Ky/"@lAl Z9\`ĘZȩ,5k9yDҾłt6LyDC (! :7jٚ FdFc'T*ǚ2mS*)!bTD|ܛ^8+زL|'kTTv0Br \~ JMݳΡѩe΢~~yS, Si 2=+ ҃0;eY'gF6?&g"'o`&E! R묈_9Jk 1C5mG"Ä@}1͝]vBY\\l!Y,f++bDH<@od>o˪L1A]U Vuw8[ mzEV5GVB5O-aU;m5Yp_pfyZ'QT)eM:r~AcLL>As@*dl(~w:3;gQ_V#%?w`;9rgw99 k~Yq$ڨ=t@5w^/hf T-,J 0^5mw}j]JYߊ}z4&ϴoz^rxH< I ]DdܭCד% [G&UHu/f!a>:ӵŔJ ^T1OǛH&?kMkŒ>n>׮/6y$$Nz1(ya@RrG~"O9C2t[PL[K䈪a8Ҩ+=UrwL< 93q%pФ˲}EK%.NyEA1DhS,$#YE8N{_ڴ 1jna"SAV&B;wT,p@hY:Yٹ f)Bz91'f%H0ʦHA#<0map]h)0 f_Yp9b a WަkOH4?cヂ@ N/ J[4b*]%Oэ۰qQ?+}0T"յWuV"%vђ#hIъ/D#2pFպc75K N*|q~MvK>Y8S;mwTĐQ T(Ծ%]9_zyg3kQSiL  "R{36N(6k?Ro37Mv3Ҧ~gD7V^TYqJc +$o߸LHFN3C?OpNRH*&ѣa0۩?y qKo8;)۳DSZ#wm.Bvqmɍ,ˍrF=-Ib['ۜy*BT~c{&*#xFԂ2‚'|'NɌs Sf7sꄩx%J% [*HUȀs"s\Sm`T #聫 BZ+ӈl Ag,|Yy$Ķqr姞f-]"^>1̌NX+@5$98g[:AНOμ& Q\[OEݜ#0#xףty$~!O r9јh|n~B"F&^ڝ60*OMM)P-^飉ZA%3c6Fci:Imqy掜`o\zutýQ1n>7Q0Ό*ak9Xq1xYH%\gOV$.n<~ 2Ce@Mcq7xp.4i,W!I!H5tE^yw:D̡nzܗgዠjw1YfQƬj08OFvfZo)&O9,jڤYο/6wX)Wn,9XX$r_dƨA-|BCY!aƵ: 6wOC6D1^i23-Ze=i2S?\LC$&OO=xG#)!p!x2w ($ .5SUJ y\ssZD=PްM$ ·vf^ׅ lӋZSla*OZ3 1$6шb@(2CEޙ۳i:w._ bzS\nNCN\orF]dE$ÿqL9DzZV[~7`ArC5ҶE1`ddb?$T@ s`)ގ .¼: YF(O~Bt XHfQ χJ~} xkݍD>uJ:5&HGWdzTg|w8;/3=TKAzòum҉#OZ, 8fu"t!/CPB=oqZ%_V:&s1VhH~Z1@/u!=ݑع+'IZ%![S \b@t~Mg4F8@ h<]/]2Ѧ?w (I lU"`$4[]'QL@ҩØq@w¬1ZOH~K%{͈;2DP+CAψvs+iHj]$|[<7킫^ #5CC<lW Etcu)R| D'999꼃 M{;nm _ؿܢ;Y3aKD|AYFL5 ZY2u+TÚ+ hրXѫXm1<$(J7u#%u>s##$,QeEd\=ɧoڍXɕs&-9.Mv+QʦFA+aEDvcFz9Mp9$Ov3P, ٧̬ak JZɥ2|4l{~z/tvx0'FKpUՌp[檩cǾV~.,EFO_kz B{ߟ6s#WCQ>&nbO{3? _ o#v^y~z'ƶ]Wb,&>l8rybζۭP7 p9;xL b-xt#Rcj]je?ْ6rQp)gn &5sY ˲` 9{-uzN E#<3(>^_vN$?_cl*: O Ki}ߋzuSDG_7wx 'lХ sl};(YO6E;|`P췄Qv58}åYyuv=0 QeMhLݒ>ƹd)r9sPP_6/`V($ D3)h/ϻE= 2ܬ>1\h+u.nd rՄ=S|l}ې-,ǯ2ӮPKv>|LnAi6Zy(C#khmR=ֻłs|(UFIɪͦƭ%lU\C4O09Lj溰7Ѹ$vU ǽ]9J>mȄ4}IS=isYd;loz7lSp:c.?#N&͜iE pyI˅@X8qW UXh>ɉ*].a ~clvo cFr:ddPƧlb#78@>AVEUduHLl cp#WȑᬑLw| dA rCd"$Å "5KA+Gg;j2,pؤݕ8^ n_D6JNPmz`0xBB?M@ ^!Թ0w2@;Cp/*2 vLܼʞX]* kp*hoo]8MlRGń}'kaoggZx/qrd DUus݆y1/7 0Z:bZ6?6ejILxa(N!&YntS]f`OLzk%c#Y X6a STg?'C~H~Oitrr?avwg<0yF>JѸɶ懖ٟי Dᬿq( {Ś6݇ma@U"$3ϔ8˫BnWinG}rҠEkW~ NL@ݏN+D :/$)djӈ5TqAHT/ݸMʀYZdtZ'S ijCf$7D;dkԯ LdaݑHM#.-ۚu7>j9BO .+~}@Ĵ#=\ʫB:y윓`F)Bp~x;9\0Fwԝ6@P1XW*}΁yRy;U2nDq-ۆ/S#!ǡEiřЮT[%sN;baI\2Ϗ4>F*hT >g2L\To+gUa&n\_X%foV+U gZ f95ϳbMlScJ ߑe.%;D331Zes>1o-P.b4'En۴hOniuHri9h3CPQ%l#يx`, sTiW(#KBz)B8mqAF_[20g%̆,I0A:A]C}}i/{ i~!`w';,8kN"AeoH莞q#m9A\v~೦`}#4VTz/O|[߿06y=ͬtN='<"kX<8{~˅ڪCyb`g˰sŧD4XybBwc0 n"̕=Q 1edIݛ@-,a ہ`XNͲAM8DWVtFHފI-kf]Ȱ7RKƥeQEPz]sPuRj<l׎BET*"Xʹz}7_UxEE"P{CYvL8`=(Ks 5>K, C EaR%p /nk< X=>X}%rvY\Ʌ'-`紙m$e#ᡇ # $ŕzOQE̷%>'#j $*{D rDur%X|EIΕM{3VOm_,G2M:|X Yfk`fQ(s';Uz%) t8_ఄf+]c( 5Xy!(acDw"v9uDHh`-[,f/@X=8$@S1ߺ _4ׂkPܼL Dth l{s'wOdVF5E8Fgܯ:6 ,% !Z>1szUT.5!^}X(8E2JgbץONʃ5$^ØioT2/B✹E2$e rU,茍Z߫NNdC r){NQ^-U>ɥUe9w=dMĒE- _2/f+'U,'M)J-7wS,Uiњq E;Arsr-۔ KnO+v߃7lU7S+JKS[zoӻ?JҏBض H!hA>h,`H)&̅gEfy"+rr|!:*EF윣ĐT3ƜoE[OߛX pεT5ˑՃA_M~Al&zIb^%͍A&ըԝ|(?Ncs^(“? @Ag=[ճ3et0' YKzpwazk tH/3(r`݉#cN>Lrxwv\8Au-q Gs EUiL1[-0U`supj\VBMEa3..3mMv^zdа(GAdqܝH'$!BZl?jjvaN]4{΀+ҿ zWɰo6yxil6<"`^qAs,.D qfNuwM';bhFl4ӟhvt03Y2;mRGdFHFQqQǡ2BGfOWEy0qˣ8N~5tu }q'8Vꂰ.W#%>86xTt gu7ԙ/'5ߏyk|!ha 5"XM!)*:$q@p` {whIg31TEp9=q88 VN 78s&Q?_rL?]T>qON} G7juIw9iH砆'QUJ" G|\"ѳU,Tc7.Ts`-)8#C]M &l(PϋX{E`]4N~P0mCœ9QҞ&Ǫ Z\Oeo[岽 $ /eNv'L~6x1ٓ{&U6Vi[E[|`dVSEcKkT֧)mY F λzL DނpI=_㟪Gd@}dn$0's۾TG =${,ɪ6*XiL U:^VMx,[\M&5[]YV6痠N5[{*VAu,iMp%,ؒ=mA[|&r9I9m&nզxaUHݖSIj>3w~䶅DsEn;V8"kIź m 8|WC&q׷їS㑊= qNýVdy5@JZ}#tQ!US#aj ANLfӧ޺JYײ*H$6{ڄS+Z{_ͭA? ۹eVձ3ɝWqҙ[ldZ'YUyQ8'>sȤG lע[gLFc)6r## r ('6ALUQyBw>n ń6}ܻRyJ1dǓz܉8п_>&#@Y:o%ٸ&U:o`yhfLT] !VםQ <S4ES噤|УӍ> Vdq#eMnV3GS;7/gt1D}KY:V'.#p0=n~VE.eT,FLjoN6klQ2ˇAGmV;QXX p@̳`k~V"+C ѫ o=DkY; fwSN9̀1nOɘy_x29uy;n ktBƴBC ?l!$!s27 c VEl-I cP~v^w"icRu N̾\ℎfbbBY C`a=o9fwG0F;}Sj̚yZ Z!pf.s{[bfE^Řw[X: Z%H~]m3,Δd%Hup~ҋk;ct(ƪVx%fueof~L_ȟV=IyXH?fXg>KAsaux⃬8S~qqO K! $ |P̸2MƤ' 1^%o~"uTcLn叮r;C_ ;f$4иҊ뒘-DLZdWg6Gp/8VngPŠKpIt{O<-a}7 'b#8;{b׬c ѻ_sǗ_ 5qb7Z RۗͶB4_zT 0gݧb8܀^B ~dD}y >Wa*< WEcx$ctp-M/JtsCiB k>!VTI&urD^|"#CNI<$ qOtwt㖉WaC di1~s@~D+M¬'r!+,ȗ/RaN5BUs-l) Ȃ*pf/e{V!؃ *w*_q/2bZwlQ4-DDoiG0#Q[ȎgJQ!) L˞+#I1`(:q̗{kؐT* !-^QRggKc޺>#^>K& ƅWɺAʜ#V-'=LĤ;LO[߬q(i"lJ&c$,Pks`PF̮Tzw Uļ/e_]D8hyo͒cs7^ֶ/g3(uUeRIRdkn z @'1t̎gND_,$]jU6Sgol8oGר BK?$%Y@Jc‡(V)w) B^ .,VaICtB{TN. o"u1t_McA c\!~s!v Y8N J>YӾ !|%^M28x+^AΏn۝>*YЈ  O%g?ҤZoAF/,A$q: 2Hs8x v*Qi c CAAtGK~~DRKo"?,pbCGòZ&iE;f(k\vu.c=*m%Ezؽ)(D#geV&@O]>dQr8 NW0CK Qz;艂O'Nc.ŵ[E (¿{.$qC@fS۴ZIhF侫\ݩG~ ew[2HBKM Y688Yt K AgG!>"|71ҽkM 'F#<xv<|(e9M(\@CQ`@î@ӣg IE#1FЂ}; {(4rح)d={5E'9G;Jflu%TSrEdPDi/པqs ] ŶUCJNZ  7(#G{c ȝ oTb`HpY x|-˞m@B`״LvKY,M/a!i-J4Cm"PnވjҸ(aj=n t9@.PSر|AwsQb>Fcm I=n)~sz7g2SF5þ*t6MT$EֿuűKsqL0jq̤o'\@0j#HSzFynl$m]l)3v!)Ca"郹+ENvlEİOQy7mCWD(b~g-9d)T9eb){v@^&o X ?Q(,XNFx v9pm6:~[;?)u%qH H1BiѤDžpY, 9ȡZ z1V#ј$0I/qXq=}yd.4HEs`nawaGp1(|!ž%MV}|O1嫲WS pi[Oux3rӋ:ʔLhB#B8&3 o.z$!rG61O'1*aK{L̡ꂭ_S%;=XLWR襅3YD,oBPݮu Vu 2>R̩+3w`Fz^tv"j+$"$Z0}VQ%h^#@nPdeP2jN0n+nkb5پ" oi}^^:gdQQڙ{7쒲ߠ@&3.)ow_5ag~SRF5!@w {P | "9Q`W*1(Gi)0p,m8Fv%S-Qk`b3Hې96( Q+hbՑB#"O&5 KJ/ӍBͦث.F'd ȥgLfm}]*9؝!iWGc%_1yTQl6϶/m;#*i<߾8>'5mZF0'Y$nZ׀khNj4Ȓ'D$zTzv6p4<5GfU".8XKJ5|R0b?g`CJog1=yt/$0JV\m>Қ|۵_܀=PPr7$xGk15 ^w|5te put)"! ZrE̳w)LIu}`asg\wY}btD`@*/m niȫ=x d10$pU_I՗:'xDILG50oSW;#DyE%%~" b` GE}Nk4~!EmF+ ;]6) "7Bί>ȬXA:"mA(S0 ѧNS71D:ba@KD0о- ${Q{XT[~$Ź5~4t(wgp%;OW8cǮFA iI̛1=yZ1$প)sJ"45Ll.Z!e瑩C=1#fzBU^w/Vki)B,ܨ](-WQ:ﻉ+9c4?$R+̭v2[ǟnӲԚ&@K_D̫*+m2RID=<摅^f;}uqPa7IN ~z,8P~܉zg+qT򃖽9kRiYwyN2=aJ(_hZ;Ev]ѿRILBk rRO!lU[m*6Z`%!_ʮ A+SoA!nGp'S6*z|_񟶝 TaGYU8guW_Hpws, Ts8aA)wmRx_r/iށ$>|BRY $}Wf3Ċ鑱*U('ˡH00,&31D.3ٸ>-ٿjRsInМTQXZj%ul@]` x#%[d*ȓjuT@bG.U\/"aH}k`:j){b1"ECDLqN#2-:ѯqTƠôyXןfԻ6Y*I<t r2hϜ)?G*dPrz~g~u8%0 3s($iT4"nI%5DanQnVQ> "m :[Zvkg8"d%5~:\2~w:A^~Φ 7%s3LK MA3PĒLOأ1\' H8k9Ѻ.R!: n)f38+4K*ŏTxde2,zĶ_fv?HŴn[ FZ} [[zHo98. 7݃˝ 'ٴ &9B/GZ:a[])4b柼"&V*e|1 JJ607oׇN5('(j_P"\PC'N^zvsI7z88U3A.\#efj>qx3 g7ďp)q{jz4+NUb5qcO8jeA˓\)pe\@3x^ dCru?!n)\VRM@fhV7L _/뢄.oav7vW!)nu' a~,k_+2bc5bwry 7g=t~g hkpr?:|juC"L/{N BPo¶M: (޳\,"^׶xj;]FN>QK޳88ldQHf~'KK]aEr2;9}Ʃ+E&߬x$풕{fIU%ۋHqYU+B Wi%F6ā go/%hL9͗xWj99dcg#vD%n$NK6SL_91Z0c+0/ pRX@NtR^MU"l,tbZCCW/$Gc?˳W%:; (xf*55~5C@W [§4gF/& z X뇚\Q~[r#|V7,eLF{Ba Ph9JX{;@-]R~ٞjXAy׸ڇ6{ΎC?15x*@\U% cgFH NiGM)'*&?qM}ln#^8Qw=j: kSo49")P%(0n| `ɛ9Rmu^1 e,c%D\1v0x #lս85J7>UR*j P/>B'&!<\k_h|di8ʛe)w'B~"B fn y*c@E 7ZfEʴ>*L b$.EMjKBUn@s՗}/,/ssja-GSQ]3դƘ a32 3SFt( Wj&`zQq|*U*FD=$t*3r1$\+8N5>%*` t ^GoF}1>~EkMʵy:92jۜG#+D Y\%fGᯑMqv+H~ɥ#\Ƴ`ehl,' z5ʿl:pQ~8r9\%3pybrYK9h273@*{> էA'بɋ ±[ %!X0 .y$Lhlm;S6:;2ҢXaHΞ)n>6g`aImK&uUD (?!B.{WUVޖ3?J~Pf{jA0A/(-Ig;* ΨV9庉؉1)靡 N4nC_Ӳ8) F4S'Oz^em.W5kT ^[QQBo]J"CaljfiAfZx|)@  %J)KotI 3_m5+Bdv|PI `".j,枬"@~Z8X./-> 7\$T'u$: oMiD`tyP_ɻΝD& X&!\'ʊ[8W&ܸ!b_%Em7Ȋ03s{2w){L}\X^"`$W \LL$d[X&JVk<$4(A*8Zߚ"@bÇ^(uOؕ؋ Z uR'!.N-kW0fQYrINe]Go40PаŇZ8 RΚPGV X Nwհ}i-"CPU\,Nr@FO0-7a-EۤMь=',!/mOOfɋz(VʭuvQEE_MtLJyoI9ݧ"'V߇Ќ$ ]X-yl~f 3Ϲ";2IϤ r>At0Dα)I518p 04䰚"-?okLnTD"dCv`Zvk-/qmE_UĐgL} mI?9'e)G DK-4f?]&UgGƦJY;B1}QU5m;9(.|VxVc e¯jF*IߪX`znۖ3kM )S{❊0 #$)zq ݚC;E:YV>4Ya^ЅMX8̲P AiZӌj'kgv}ţ4é6")cŸS6uYPį;s]_"lu&y+ޛـЫ A ϫK4!ƒH-O\k1 ߓ9j]<̀9I,9sJ Luj{֟o("TxClv칶_ٞ>[pHkB RifXARMyt{Xai* QWo0K2d61[8:؎3h.e{}?@H aK_GTKx-H\5WZtǯEr|D yM8/aJ|ëȸ lY8vG," >X:ˀ6ނhfh'df-0}x'믈(1^RN 'û1S nbt?Xfku4Jd*g/س %(HN|WsF+?dpY~[mT?3u 9;3RDVeelwL t+/>7ʶa.PR}[bm`V++GLTx]= t<߈?a|G9Ce%J\j6T],p?yUQl}Ŗ/F(M4XQ'6:52@܋3lA<c_pіI #2\ƪh.ynkA@}΢zJ!k E~8%ois_{ٝ 2`io]&pr_8E)1 'J#dFmeGޑ}U7t6:QH3b`l?B0+U5@&j5sY݉ޅm`4vP6);mrόY|r,}tʑg_\[In&դL*9QY.q 4\}iEd%h^%?]s qr:m$4:`˽u"+6vl$J!ehsxVITv }3m M>/oGQ^/Q k(߽勼IDhf7zmyaKbPbv.~Yg`7TU}RϱͲKƚ P儳}(w 1z>|Э$*eBޗ w}XCYSgUYC??M]lCX5g!<8կԽ{L;rg*X3|J,qR5 JܘwaOÙ˝ߴL,ڵ]C,*vSw~]S%a3ދTjmnY6KGy 3FGN#xMV9j{5K>] -B.6l4g2#k\Lv9kM#jd3ylĝ#)@Ihɿ-59k1|#D`[ bQCj:t(:wo9- .Q-gtJ4ү _%.*V:4nRo|1MT_4]bI>*Ҳ(Y![5{}]\` LL7"N6B;(qfX?}b|h< *r?۳}vnozTAQd&}&wci=e2`/!wW>_\*HMH]uu!!hɟ?i%GdijCc=· ^Eo͍up(!@ s᣽Oy9ұTWd^éEKzMgU:q|Cr@y72gF|_-ןߓ:&9emk;2MLvLC0>g܌~3# h&@-;Wء٩=۩NP]*hiޖ|@y1-t+jKAj_ʷD>H C4-uA:fm~K͜I}dV̸MKqN$|ua7U5#yϣkDoi\R֨\jr?,2MĔn+aP3o&ŴƧ@rAX&Ra# ~Vvi%'pA-G &}2pY҅Fj n/,o aS&EgNЪgH"'Nt398&!3)uRyQ31ND.#qS)?]kT з,qX=5Б>.SDQ՘e˖YB ^[D +V#7BQ:CtP!o$r=TRr| OM?Wy_y5QE dQNB""cNޢ5un O$XY8ēs4!Sb/_2L O> OZ#"ɇ)j} A1)kયrbʲ1Ҟa/O"mt,C_ۂu? $X* MtEE>A&Ԡсs̭e(䷕o0b<,($ytluN+hPd`1zܯcR*N| ,VUBye9UkzY]ZuĚc!̽ ӕsC & y΄%~l[w_N#]ԧR-]{.IKs턜g̚uZm0!'Oo]wQ#9+SOp`jU^#%`sbH'ԭmlMh:5Men癖T4RPo jtWeN/d) x jjmĵ.PM(DHd:r4$x[ЂӦQmw9:LR_ [ 11x?A#hQƠm'D .9]%< {-4Wl B_Ɩɠ9ITJmn'{/U?KNIԡ\njo/ER=h(%s9P0Q$~x\ x+a[2k⦹ٷ?6$#g@\Kir ŀ\EN &U6nl_2Ckl1**4*n5(`'@[47R7AM]:O]SBN;@c&nlUy)Ì4 Nug?+ ǟZ:շ!|Zj'H'],qEXfaAd pΰ|Yx*{tx.!O"cd(5½Beˎ /ˡ_i&-S$VrR<+ֳ@sl l_HBMRP%>PáL-l / k L\T.Wc;DB gr% TnZ`Y3' ȓ|OYru3BLjqko8z/xJncL_] <6?)1K+Cy݊x:=ʰE;@Pj>'onii +fs+Pޕϲ\=>Et^5 ::IB%q/|Nq+rB|1(_KTa\]j"F?${6vHz}M=Wl1#|g0!GI%]bu<He'15^ BɈ# ^{۲`} ~EvO H!שN:ht³yr*bz߳`:luj2{wvl>)7fh&ˠT)f l@&N3p;Bw`EDPI3 N$-$5fP`jJ_Eu"\L!4UQ= rTm܇F@ oVķ)kv.>o+ CW %PZch XT¤VrMҼhtֻz;i\2DMl9Q'(o,QGt;~+I(U郐Q2j.y:EmHL:MDkɣH|wHpz,MLbmYvK/a_ϗ=!*#t<9I 9rI)xӿWHcg0>BF\e1v;w(ap0 =TY K2Ilͽd>Jg˿A_%JHfq:t;;ZBͷ(MRݖ=i.8{0_P"Є]Ҫ k\Q@n*l5fEE(q{((rTlA3qg`Prgg[CJF LGt>(6Q{r zt:ifvu˲"@%́ʐyd;ū M2vC~j.\('Ce\%[?[Rrg똊}G5I/s8Kh͆$;ĘX ]fjF6'$\xU"ѐ x.o'3.̫yw)1#.2.hj.9J\䮄8+.Eb :MaKM0ģ+sh'$ mSt5̱7JZe^wQ魯1NY/l<+\ԅ54MM< NOҋ~yM֎JplP (J-RܞLf+|f fc5d1=e3158It_*0e+)h$l 5Vy8e?p5(E̠|+9Iӏ|tgnQj; l*j .xKCB[h2KXe 6b3=yG^S҂1g oT `x0S Tܗ= Z:x#:w[*Z Qk{F'Y׎'%YE,ǘSb5=Z J\l€|ӂyguW /~iu.Yd* Gs/q5ޫڛ*D:h\sqHn02aGKmE03 y"F.L5\}cHDd@VkXz`2~SʫPXJeX_aťcmN䆹w4E'MEM.5ūqF!V ȌI{br#{7#k$Oe(F`Av҅P3y_%_r)V ̼Cn 77l}Ne(E=}b8T@RRר{"RWC=Ƹ%x'1^j'@dev36r(6㽯wKrm~a DĶDj纨0*D6pM1hIo/}VdmDw7zx M`7ĸ(%%QRi:ܝI?h Ct4BWNdP(3jj#8{<"$ΔW~}lcNaJ]a>.}հ$eI[DC]? 0.enǾ{COT>@/V.NBT͒+_THAHt 6wq̊aqx]d*>o3AD5۫n&b%\Z24W&ּ;iҘ8,V@H GC(ZI,IW"9p;O#Xk-­B 5^iϩQMٟ~ a[H=KYՑx=,<׮Bd>M'ܠv7?*?G3*-Y+:u _,B¦73FML )2>"$6RVꫢ0\ mXw:QxĂqhh7Mӱ~J]=LXG:]\~:۝o#}h/2Mc vךNYm&csn},K_uθ7͗C/Q,F  䞀_ܲ[:^:̛9XQwn~41T#.̜i$E*>gPOQS"ZnK]kO3dvΧM7ϔ@\##TDb>b:ˣm=X]bܢ= А| H A"SJzGR̍Uv6pq1WyI9'DN *rt(ޗ1$\aÕ]497OO.'Bv #vvxŨYʓ?~ C|~~P?[x? ?k%kb[33&@G}\ D}`pt|fn5sŏِF3>.i؈2uޏt]…lFo&oy: W6c0Psҟג$.=S_W[zKڟTvWPjjS0Fkj/ A If,M3M~b_ӓK8"c晨]KÈIin>rqJ_u m$İ3&9-EV86dGZ^XYb՟q hwNlOMb1+) =jC708T- #B>1S1C]e })EFlyvc FD *,Z)U p .ƱEE|h bfTM %a2٢b e,rݤ_AHƶz 4>z2rz!a^L g?շ+ ,5I \UHj3qk>`۱e4lw; KJ) Wmza|YlmJܫ5rl+LaP rԷ}k9A8ĪsEųMO $e-]Ō&8m&4T>CFQR0. }Zo!<D 2?[p=r,r]e["`fE71b{ 睵.& GQPmRac0??1GFE8 [tIj/;y Nc]gF̵FT(:x12$_aU}R=`~K}Q#ϝmF AI)u~OcÛo9I[{nu~,e偟s `%5 6_^Ls]4,ɫYN7$Έv0 Ƈc#">x@|ejwm5+2CiayLç(|2~3w Sƃx6f~SdaLY-z8Ƹg Y+c DRѬdi(2~AeZQVln;Jr?v.ۃ*&BjDoN/=z[Nf^M+X _58O\IvH@Տ줭S@ Ԁ)@v48l:DAVH.Pugٲ򑆏: ϽEHTRO7>Yð]Rd;.kƍš4p}P̆@k`q%MJp X\].Շ?ʓydzvX!`ׁ:YV<%q9luJ,S ΩB_SWu0e`+A} wBl'qc].ݰ4۴dDQEqlFKD & UUaD4b?׶䱨WL ._jkA &ۯHA.bnB!bdN +A+mH7nSPz^>Xy1[z!w4|Lejpdk"Bw癴ewv`C@{k l{'Y۴ oXSCLnzqу #(|M⿠xDQQ$\֚)B"'ALm2#,FOqBe&%Wm7]sz@(LBe-ާ%C?qFwbeSOl=nũ9m (xȨLJGDR֧ FU*OHE r n܇\GdݮFbduBn}}?Zx']k̑[Q _Y­DyzfO . _e0ydJX7ӥ]*xJި-ng{$eT46z F6Yٌ&  c2zء 5INupU#X%YҼ.CĦlnօH1߫7uMuCTP_ CT$6i=+QzYCu8e l D)^^)m˾OERdCaw{m <\g){>~apQ(k_}TqG ..J"qEmts {jb>,]rݳ?d݉mi#Pe݊`< kjPFXBt]q)e*|0X)Y$ @ xקZEr7@9[1X]wWd?u*;Kgfo)_zϽ=JV9%&Їbj\dlF,9CQ" en0qkaQt߫Ϥb$n?ãcw tl=j</G?蟈 ua~yQ\9gU=(sFD|&R-ȓCZT'}EyS/,)GVy6Mj)WU(~pM,bX(gЉA _\j ,>jm=Fi5iBǂ& +#^q rrx>}߳氰l3&b!\U)++s7V{iĤИdz *" -6*^b_ eK25BVfD^:`69IC!OoR`^ V}f/P^tIXPh3NBM"FU~ȃrqB `KQH?ߊ /.d\90vS^F kuh]NnPk-hu;1 Wf*qH=樗z 5-Y[FT`5ChRB _:'+ފ2 tLw'Lq cq/2h՜r(DKYVy4Zc R 'dlۦ+28uoO9F(<xc#+%-*mLh{r  u)d3,ZM{f_\K9Ԗ7Y+Z㋤GWpc@'YdLf!^N "X Ya?ui?`M1r2ӯ9 4o4 I&E[?7462')UU ;f ! '|KWxTwحK$PT)*$< vJfQWUX6tcƀ39:a 5VV.H p/˘^R@4Ns*, 5Nj]~hhȈT,af?=NX_ʳ06TOyR/c7m0Had/92U?_YsݑcyY ǩ[K֌l-18Sw*KrlmX$E`9gJqd/mM |4wj?Kvnsm=$э؎K=9tw+4Nt`S. C$p—,U?Ty*D I}9(X"Fަ9EbtxF^"6Q\jǵ+a C ?H? 4Ӥ`6V~ܜL:3~ۗKxvq{_԰Ϸk8*uNQ'C1 HHIRԮMy*ZNzs дCBt}^PQv״R*덡pͫZdБXءr߼DM73 w&Lٶi%:7Y).ڀKIt 9NO~/Ɛfە&2-#$O"@*(X.M/x|8Ҋ57H%Z(a"$B7x,ϜB~M‡ɍR=lGQ1YZF=tAFu:RȚ7v Bm#1/ROo=to8 ď@h>HM U [apUx_m&Vt1X\P tFp (zhH\W(Nu )yFL.9cg,IA8C}:N gh7 q~%1Φ tzj؅EޢPn#)v h8~dX3DA䦟5qTOhՀnv <ԇʊXWj=}Np~/M--{g aeƹ0^岆Ͽ'iš]~JљBS1Jw| 2-~6dD'/)@pz~:1L}TVο /PEJNSj! \EԳ¼';t5Jm |u2̺ g 6D:;M,^`ц:@I^@G>;`VmDeNQe¢j,c`L9~cU[yy vǍv(0RKPxchF t: 盓= (xDۓ4Jݧ^ )rrF%APb9`Us+.YR-;YWCmw%)fWHn^FUTvNܥc:g 1 !c: , (T6q N˖UR?:+f(4RwSsx'p|.)CЏHFAJ#_9BEY4 t-$f+2$Sth^说2S[ﳱƻ'Gi.`XoZ{O{<6} 1 Mr|%U$%eZ-y 5DN?4{k|܁h|[e? EnRm1YlPNd)J&;U3@Eh {+6Lofum~!&|XWfbxj' -d|9ǜ5H`wPF6K[:, kM6qp l.x0[ "j;orA3A܉FM*v4;lo{[Ϥ3/.xki9 04I $} Qɟc8Qp)4ʓ)9C,L 'OIQkŃyŲ,aėP>q# 33QQBI39z;QB ~<i&Er|)Pz/ ڠ$;,K@^y@·c~)tW^F|z ztFXBP iYe_ӻ啧i1r2=>: D0sTR$KUK4+NXbQC@a<)}ff$.<^bH@WSBBg@o~?]bR3>Yx mnkc] c9׿ߣ$i@p}>0?~<7S`" exao:`C`kr43~b*ݞ) e?,-HNiŻáC2Ɖs bPMTڽLG2M9+|b;֍etd#Is˗q oSDf&4e1rt LC4j>U 3ǵ9in=Lf@PWGQ\FcqMbp:Dm$!3A6TiC.i\JF1¦jvKV.A#$?)Ԉo{GVu͐d 'oΧcSs>O=˺;!A O9{B%Gʨ1Tez~hZq3xQի%D!Ns,M.9jvG5LoVݧ՛}na:5jЉ0iS'Q pۤ4cB;q҄'fsUV~^ռTO󹳐/(>[`Qۘ7nUvm pw#CCt_R.8<(*VI||׫M|8Ug|׬Ӭ4p6gM:˒9CC qhžD;}z99 `p3[ɸ:ЈcMךȥش._sT%R/aV`͛DbhVX"d@W魕{& k7J(~S)lFP4vj5F#̃{RN"C>.:{w zE|+%ʞ/(`&4s|n,2hv t1weqW9qU U1 F~2d.VR6iuO9ձ荮,4ׄgg&DBƩP>G'j;R&ڀp—Y pX-|V  D8x[*\Ѷی]?T#{ 4@YSY'i0ah/R=̇XdBUFa:(ο! W!,ˮFÂxp|0֣:ih\AboaN S }g/CYm+nWs2}&m.LSvXҞ?4t*ƃ1Sp6/TctF_ʥ Ev;&EgRl5ãN:!~+ېO̞ &_0b{Z+wfu#Jn$V. EP["[6 peRnٚK^y/: <j2擞j -9*[n'93q7*Q(-4GRJ~tPXۉwzBg/i#P xeZe'CwoȡʾXzW+q$?iμ>#CYg?p럊6=΁ LJHy 4g[v |ťMУogѵċPd`g inbS'#vR-z%UZ{vc[;].9d'{b >ĻSC59SSE~UgA^l*_Ђ:<- o6TDTeWC459w 7+DvKnSh cA9-}n͜/΁wuG}R24AG87iY6Yje3i;`7+a,.C LrLm|z j>$j)APIpĎ6NqùXV[m pC $ sqZ<42E3Π T]^GÌΞߟ2Z2HЂ&B^.EUH:ZE,6 .8!,az3X'6w IȎ˧G\P1~FD璋l}-~ADw3J:XA|B f㼪 } $dGS q* > -MyoL+a, 1.B+(͒8!j2A~V~Nml'{MXU\]wJh3y E)66G]db8羉T[TCCeArN A5,&FTMZG{#m֮yz hZ# T*Qw"TlA\*?PV 2Tr8(CI .xe*TYAKذi@JGGЫ.>ߗeu+eq#p:9={.!B j &sQZKLp\`6iue9? [Wd@ L *:i"MfDݿjV HWK\;3m%+-~kr1?j2> ˟aE22C;^p>P> d4n> 壀 %o0*VUAҒB!MצU:GM]] L&]@q"t%i`h>\@4A5m㛁'kC PCJM%xIV*B. Ј;; y)kuq~f}A;~HV\Qض5߻rwKkPa7!KN +hzWe`-E3l%|/qԬn߀OI[0`_g_;enE%iDTDgDNYg\mzGl^iplH}3*('mҸT?%K3COg~]*ɐGIfVx}uanWk/ۋҭ'IҶJ;@PXGx%7LU/CIIFFigtѷ"YTa_Jϗ| 1\A\`,60R\:}uF\U Y 1 d[QԳ bGtUe:Ov"o:q"#*`MTb! $B⩝^XuN eD/"_H_,!s7f)<~EQg/'Η{'㪄XUym30#\7 wʹ)/p |QqʖRfzprբ 0;դi?\իiR)EQf:> Q#~fRЌAT⍋%z]1Hu?*e4IpA=+uL9wrY'xfQ0Æ\{x_"U^^<7aύ!PkU {tO-RkaNlf{\sDB'z}z)[1 1B)rus|+‹|B,rI _1Kq Y2.1Ca?"%{R2Dn+XZ̥?nʒFBҨR!2f͹;#S:[J87w ݥh)vX%e7&Rո$c1u.m? 27Ow8p.LIhpzDϿ#ú9n\/ܶ ׬W.&ۜcNfK vRGz9y"Z{ Ӵ޴0{Ҙ=L ?~ 34:?hp 킁(jՓWo1} HLꞾMZuhϕA L׻ZL][@j.@j_&!ua:!nCݥ4xQea}۟R>7{jʵW~ڸ(hњ97hʪso Nj[E>dX&V7Ԫ`EUkGr>>luNRB7_-qId)_̧rj}}R 9$zNu=-:]deq!z#;},#вL_pN#OTXbkR@K C,; Is'i[%=XS4[TM7dkv1 ̥du38\:I%aW<TCyxɂhɛypZ \)6IsU =Y1 (<3܍ .O8JL1>ߖEWR 8q*ɨ N @u\k(TUǣ@Fûb/`α~DdLRA#MdsLYܳ=M@Z%qF[⇦"Hc1 #uعŨ>+z!*E;ny\,#đGA<:ꥨ%o/{;u~j$Ƨh1떻q.137zRb[!{fzcHKK 5Ѻ* -S ffJLZxY=Tע:6l|]GܤH e0Ò̵`xH;rc"aq.ȖǷ%V+(AF]mްO!v%8o[=pK>1UzB-AjwF|ٓbje%TQOC<|XM*u! !5d@%T9m8saP'ڕye_H&1q\p躛 Uͯp>C)۳hxQRK2Ɂa*]^S`+4nocyt*9;$\ CzQf! ֲ}g:7C.>GSU1f1\tt$t Z0Y$7*bN1!^_xUEQ]av] ܳ8 \$js x镤7eL*MclKM$[" s}%g6'F3D:Cg sQP/tuֵkO 94 GztوZ&^6V,3^a,zHhcLh :1 e&uI -+ 5 +-zFTƯ~0W/WYF0͸!YZ|k(T_gl-x0k~e q4^'k}mg3'KVQښсQ|Ċ{i)ɜC;Y~'ٜeuK7eoAgϋ^MYɌϣXx&ӹ+|2۫sŒ劙m8m,x#r8|$Wd{T7}@n;8#U9/'&d =w9^ZA-& .6Qʶ4snb0oc:X[WC%SGB$)@.:}S_Y 1 K%j )i1%8\#d5 -f<{۵*O/ n#|<3f,ɍ/fyz=w6R]eL olQ {OSfëhLڮR>Z0_p4ΈZ;<*蔳:̒^\0fpw@@הV/ٞ`\ʋXd[ݡ7,]A7~0O7/GPf@n:@&_K<4M[ ԎF+k^loNI71SMp9s"x,C"{l$]X4 Q2Y?ޑ5Ā1"Kܣ\t'36hH;F@\Ո~ሽ={@2 :l9:H4@fP}eKc<2;FO5-(ll (?: c1kVÖ~UyI6Th j2A z\Bqgar(4se~u Mu"QS  ) n"Q hz^Gy[KشDAOi?'^wzb>:csu0CQZQtn[ 9So ݇,nOPLȈ''I􂐠L_eCS;[EC%4otq}>NO+ۘ&NS[s㒣' m>I_bE=R3hp psBTq1q)*{RT1%HCPtʨ3foCt-wTJA9ş@ nQT.]5鏿V>E5M-VfgIdT.BH:Eb2 v2`] [YmKBCss)·қ M]&$f%UYn٦.'(0Pqlӵ" g_2`oE69z2Dž6:$YY҉xMUwwʤ^|FW"}x^H 0ئ!3GVax&_ɯDn†xDe==uE xS,bi5!I/ݩ`:s:r֌H]I"(Uv+B1 kmKVDrBqFy^lfI>݁קSJBNhH54bEPytL/C4sEz{^G5e1ol^ΫkUͩx{V=qP  %NchWCy;(˶s%,}-O dD {<.w/yGNٜ>X0*2釢@]rnk{YN68QnMtLSPLAN(YWO9YcE_oP\0PEHTjHCBaY(n="lp=TD= C1Tf :2k0іbs73h{ w1?,差 -RYs@mKX*E}d; ѝK|Dx7e_X\ _>E?`t`ڙ/3>nlѶŪn:沋m*`Pg<`tx"RN8ϕm u"OSpyWj45:6¾P9|EG?D66 uU_w\e'ڛw2o1㚍Qϓt{(=2᯦6>3dv$kiҫ\sWv]LSMyacWGg^HdU)ݗW"ޫKHɼ=-\|Z!]f)PJB ڑe ~E/.y\ @c)/A:c_RK-*vlK2VV#Ĥ4# "e60T!XSYn؄0$$I ]ag\Gb-C8q/]aH6r7s8.=A8%PɎAR׃ 7WͩHp}ҫ?xT` S}i,jzOUMm5avteI@ ]?.CA¶SYWgdo1m>pQ?P mðd/UQ B lr3_V/s5u0䙖<}hX+7Qc ~&nW]K,=_?<<Βf6{jm殔OYvgD4cq B!c!X $@qYK1Dz z~xv)f_E8`a$iX=y\߸ G`7z2 <#ﶭDLsE쨐?Ngoc w(YIi@X&/qDB֛ R>%3JRV5S~:r`2wQzq*_H<4cC46W7n-*hS}{;CmkhNOН(mgry ZWA̽Zݤr%Huo9 +M=]<;4 A^Dɺ莸S6^;#f펍ckh|cV|W3o-GB%أ`fKUzloO!EB̹\.6[ݖb6kݯ_>sJ$H4S.5N@LX *?D'΄nUz4MJBy25=<7+{n0ZެZY+ Iߖma'ayvmnn ~ ).kkҎTvU\rbז%2ɝY~jyj6.ܫDm[ oa)Gs8$PiD q;>g)G@ 왎x] BRZ_}4WE[AcH<-$mqLUѱ^J dsc52^zu͎4R+w &p <)ܶΖ\bu )7DB&`3zZ<C vA\HQvTTIv!&jTd?Nc.rp*;+"ՑItjZM] %VYw|;#5~,}N,.Ub[6UUC1qBCG=9'soz4 bҬ,ٙhs۾f7Z4mU_?n>JD A7~>:LƎTR/F_+Y98k\ǁ2kZYA6Lqm6axQαtdҗpM8WOA*07%UE^Tu4' Hs! !J^p*IQ9aڨ8c;ɒug7"U˯ l 4* Q_ެ۽A] IOώfX:KQɜ뿈e Ac$Z Jiz̺.b̪\smZEn" =؎̆=ߕ `H}&ВÎ!UwvfwgB~N B6jr{&@_TRڇ+2BdM^_egq*BC+'xK v&g5*5T*ahpS"-\Iݙ"4wf۲x avkg"2sJ5(CN/虱k:/&lw Pq\*E~uIuƯ]u4֛ .f,hq"QzmT 1;ZYgqױAqu61H  Pe9O4l7?g uOȶ0sjzRh^& k5lI!jme?j}NfǦ}rbZAwؼzj>O. vekÝGyNm{ap\`\2c&H8b ~d&[ڙ,PhD V0nҦk˨#MKiXa!ue L/`{_^49wR* UR d3DIkU8A> ̽%T{Rdkibə W$rJ0"=bS6Th^.WۆXlC-t N@@~If&%иQPÓ3QaMKԊH4+Y7 i@:0p\w-U6TV>KEҧ9{:G,֕㓔frQMnv '@w"x ,TAkAr ĝϺJGqhEq`;H-:*}>[ǣ4$ UD $%-#xYN2e'>@M4)3y|ڈozoAqd 7'1UA_G'4ATX]<BinH?+建~|BH1y0}ԣ`\am{hu/mԝE'4sxK]c{;:rT7R'cMovŰ06UL'/31qTy;.ŘU bBg P˓Foz;cf%zi{#jXNv<5` I_RDF&ê 1t \TK< >/cms/LHf>uZÓ&)V_`j 6G2p0}w0i9ŕã~x(Qq-ᨃ.\R͍ J(jsV0 ⻫ٸO&p[&bRFP<.7'| I DE\U&~<3]sLnw7iT`x[s2Y,Ȋ_)i4 )UAӖgeәZ|?G4C3;"8s`m5@}GH7 E@ށ_v" ]1d9@0]4nX2v Jv:_eQ/"BҲX"|PXW4-iv V(9NY] yxiY:x7ϥ) / JXjSn ]zŢDik[Sz~6*}Whh<]Voxl1}P: d]X`|׫0='7I $&X*!&.@!sXtM6\vl)c~EZM:L7eTJHAH9<{%QA+QH.!Xx(tbI7*9<%6ޣE4^7M{&*epxN&A%puVqMfX)큆%s (NVN'~*Q 9p$3pqGL]3x}/j|FC(k5lz kvx0\~3C>{=;k-EwVeX < ڶy)!#?cAi#;0-zWBKqg^ZςZ\ݓU#ϵx \R`M.Xִdv q9Ul=rƜ23EJ? Y]F9P[\Ҫ9fwЉV8G%6N؄!zz̷<^[B#KNLOQe6 p9Dp HB͗x~k((2Hx$сj]CH=?sYԒgQm2cNРY7j n\WQi-S n J^ihGZͲqC$Oa;Ѕ;4B(c+B]lVEY4u'FCj,'1H?_K{DB*Eh;dE c7_)m/ T>}Hn nېOKؠP Vƛ}"yD̆Qq%`nLTJO{Ir8ji{xcwH.&|&Nx>d]!/6hꂕFBPEU10oϳ=FYasX[&`˽N=`3i&o;ggZs8$$CWCp|%eFdГE/^cwCPa %#0}:(&&};oGmly,y\:/sfA蔞og9~>[ ƇiϻӇk~, bm++07qPv֮F8qdmTPUH(bi^,#e>1<"\ްq`8O K:śssq˨l_bņdz'TVO*%aӻg9/: nV&<3Sql/jN%Rb '|Նø[ 6"zEt(]Bh=_F^q޾ށ. v1_:'/5$W۠i>rj#LURvRp?Uݥq㛋T<*`#.ĸ썓ڰS 41?ܟF!–;Kt!@k}4UC§i3eH/Tp8yfm"Ro@P-"RqB?;% !\lFi\s1UW_Vr sQDw9[9sz˩U-k)KǻHЇ$=  S&YA^;׍ 뜹]/TDd){[ c$N*T}ŦsxGHICIF!H?e/nҗ{@%q@2 l2pz-P}2mbgYXpPޯG2b='MdNjDeTl1eν"+M>KFtC ̩L7pk} ^-j,\tvUo&,_p!t r"L/KWFq*x&ȟWq{Д.׸@XLLҀ& \M,kB7 3cΏHsTDd"ʌ/JK\ߓ6&_p[z@t3 \`Sh0B[_7]YӯM?= 4GPh<5% XM8ɚ3aWߜrӗh4P#atlhOQ[Ie ,3ntDw0 agDhmɯc sO?1jd(T܀co?h6Tu_oBGILmJNb3]x` iUǪHnXÑ<ze.Ix2=u.3-*M~`lj-*2TqƂ819kMC3quwNS͊Fۅap7^JKkpHoJ[ DUiuJ-h嶚T|T7_Lg9}PxpI"xR5fNJBF[vad@, ų[5hs'u`P:eir*#;$vcX!P]N⥜VP4KT*PQOj%qW2TsĔ0a)}[Z0q)Zr mr>в1,Tݩ+D+!WcvG /"Rl9KPZzlVN[-RqN=?!46qā>XE~2@4M; a[Rʤ5tԛ1`1VߖjFTy7BAݚ3+|P+k[MϛN~PIGCJe9?RуR`CqŅ֒iC$Ei]!l=Ll1}%{O`v_c9WmUDY4 Ns c5P̉>._norY//'d \RթLoCit;ajZ"< ~c'y;\$+I$r(N2doRo+fWoLj-=mu54;y? "n =PU"AcvM(s ZX95mUWb9ڂW4QEfĜ"Ź3  8-Odt7w8 rMj65qmeg/u[+UD.C|ŘӰγn\ZvK7Usv?H<ËjaD\KTfau!ktNDTsFSF*T PyokOwi1b-:VՇ,6%CPKѽ`.)Y!LNXjE,$Rp+kONz1s7{/t:_[{p73늨tژB@Oi+=S_ G|chtIU%ľL1|f"N3N [ed: ^d({\(ͫ_* ʫ`VuhZ'r$Y^0~:}467|(acC%_: `AHD;E5ZM~Y1~A]VSGص7>Avc^I)=3eheyY^7+btLCH}<#?#  |- -SLN19M]8Y%5( `r x ca8 )`uةҵO)R!asm!'ĕ^XVc{[gӈp &!+ AP:ٳ wOp.F B;~sp6 ~UDá"pGOBT OxqwӼDu'hL&bZ(X]W5(nhJ!N綔3o=6g$<ӃL:4҉:v333NW4OG٢* HăfeUOY[L;!I ]^SG$_V)ՔCvpV)'Ǭ./KYЎ aVeyPtnocÇSUIY ?B0z|#?hD[~;` NGfՅn~Lݦ/4k@T^wc> t͟@|zVׁ6]zLlѰU܀wB%KMq0͗,Jz*tX9+TÝG}+LCʪ \`&b=[sݠڟpK'r~YuNpWn ̯+{:[GXWS+LS}Aqk,ūp[fu5d5 f1$1ޤf /L+=vK䕉5UG$ʰKi7#CT ޗ, T%>h ͚iw^辁 ꏸro aj@xl2ls@e+aߞj Z-8Jܧ5 P*5$Irh^#P2Ie+i5HDy64jN`$٫x-Iѻ=Piiī{u?T6TdkfP[Kar]@.pȤ rY4e$: 'z=u%:h.8lWk'h DKYXD֞ 6䬄^@ծ88$ x>l I!2pssq+,w ߟx|`dfD.VjS"2s3Wkj& ѝ;,mҭ"El%aCɩrig"ĝ?@uМ_of;Mj痳 %쏆FLgegrO/pecwMNj52=9`а+bldwFÙj fUȭ;n&^ny`LhXJ4/,|0\Sy t<]:(ٕ}2dZ`Njco Vv糈@mgDgBj'& EѺZ{JQ~!>j*,:Lqz8Dm=gšŒWSai33Z|Z5;j I5<!+09 .JiBzk1Ɍ}}Ϛ3KeE/wY`;QXyaObO_b4t !((,XDkFm_sWo0^7eūuPi.W3f84]"gỈE'Mz64"~|Y#R4e>^>ЊwQM#yn=a^dD37e3))SDu0R%o'2"GAaY~s Gk.Ki'0]Mde=*9r*42im0(~wTR!Tu0sfp "a'_7M]RըI% 8c=}]XU>'(·Sw„N5@$;po`Aŀ0@YYUe'S~KOڃ- =~Ed 4%'(/߳~j7tCYM$k"~gD @WfP ġX(>S%{#4nxcEC$ZðjY'i+]3(O-PQfÕvǯ+iCR #[#OBH*Z89zY<[-:i_Ⱦ1(\7Ͱy]Ŭ8,qnJʖ7Z`f$XC:_ٙ @ .TsAhSl.tSiٽ#̯=C0dg`tEV= lj\.&z`d1𿈨  ʿG1r2 >g-Nbb/z2oFngve}dvk {2+wG=fW Y8ci>DH ?UO*$Ӧmxφr K,F[Ԩgp/[vލgtK& i:ŞX:vQp= ӕ[yAJnoxdrPP'uq9GR${*A=cRg*ﭗ\}˲ htEC A:͵ AwGoDa}iݿ,ť< (~T&Q\3"K1zA@ռ.icj|jӃ8ll?KAIz$@\d3u0<`wz*[ .5IͧۘGKﲠ4@-U/R{B mc|):rh0틽fU܆} Qpu.w0:^HHqP~g4֦B'ry#E>06e< T37ې^͝;Uau>.f< u' 슭_mk3c/_uMcfyP`ys4hsA\\w^PR<;OA1Cz/qPlb4! qN/ (<@kӬQrlP>~&$="!($QԁwE~>}}7A}Pf@r*{p mBМ@-fqDo,Ul RnǞ`5O0:&ծ'Ҷ)ق_bi.?&-XVwB|Vm[wgmG1%CƋl+@˛ˀUNR}>ʙ0me17~JZ9F1"H6~HZٲH%ȵ$o ȸ)B)?%n9A=uJ ׎w5ZF*]Ā6\q#{߰G(s-Ε&b5nIˁSSw?\6dQqj,$Qy6/*dFzV)04F5&Wa9wwPIVg08G:VH8ZA0!]ՕD<d3\ZBeꃥlk?|Ȇ< ,-T0ycߕ;A'H|EͧVS v]$.9[Q:ə k'4'?n} EǯLՠ;pc M]`'سqz0]3;]~x'pqۿ ܰF~ \}z.] 3'{>Tg(:I>h䕅Rd9Q^>/;u9!?e=EMFoSmvBcvRwg.*lNYڨݙNGly 3cJ3\u6O$`V iPN$?0Z7GVk 0߭[  qɌgC*SƷI5$ӮTSO&gU[snG p]I%NTaL&xfWS`wzR@&0.x &6G 5:g2!i+ )?%vȵ`.XO>\'-tyrT6{T%WIЩ${{}0Y÷WUeZ@[Ɉ?OcZ\ "`'Fr`@Yg9k s]Y4PM:ӎjVB Y>UfjnWpA/f1zWgS\s2/@ǿM0rKDsS&qJd$iҬBXTћ(#:ۊe6ƸVw~LJH]fA§0xwvs=*͏mdLbZb._ifs 'p5hn;ͳaF5ݸ*><W=ohk=_sgqll7Vc`Yعx=˽@ðUK꧜ۛ=| &_oυ7B*Mw )9NIfs`Mǥ7@^e0nZj[/`'3 L-3CE9)0qPQk6 mQ:-HѩTW(a|+6BQKU&}aFmDr8n6XwF"CoMَyƸ̯3釩}$x\[si3$>>9. 8ɚ?VɎ7%]KSB}83+FJF7Th "!;23[É*B4XVЃ,0O (t@ 1UC)J]wmD m*$ڹ"))vw-}T(Gtq]P:Iz0d^`9!`l c1~ښ, gppF?l1Tmڛnj+3c>glL K쫅Ο% Dv۫Q&; Qf+Xϭ[rf[J{4ۀy'7oFD|1Q`~ROarw?ވCya^~Fd#n'ȪJ=}b9URZH_&(Aҽ.9Iv'/ :-Ǩү@uF@PG)H٨G`OQv^5bk]GV@?ȮrT!v)ѹ! naCߧrCNU G:3H۫rr,-"Xyy7ͱ 9E92x2LG2ӎ4(lRXE+ gQ~Դ(Fߔl>{!w;iwSD4W 4MvX:2FnD+0TwԂ']x^ uN1g!#tF`N-I*?5Ļd-u*k{3}hh@$ ~ˏH160=whv{8e~U|K,v4-p 4fKE˜\if1h FSa$@]Dɀ k̀`g@k|SiwRBܨ3j#g!Z}7T>啕{[ ߢ&>_miӑmCylE8CDnkx"VNWlCvJxU;mºA ;Z1{a22Gb(G A\821:)=S\J2J6:,ePR!؃Lt,(YvZ@Z%g۰C Oo9(hX.Zqd-vt"KWoNHe/~Ej?E8ћT/*N .BJt jyb6bmkXf$8LVGI@GJo*{`TCq:}OWM&5foo3Xq^ ~c 0w^_kN+,R91UT<=2SkK,&&}yfo{P#'Ezpn%Yȫy `b v悜),=]wyJGQCmؽB~@C&ifS,?ė ڼ!6l})iqvթbK?{JƮ> EODӃ T?-}hYƽk o[c=I<3$TM3uOz){7 #p$̉w;^H(2D*FiҌ&mO\o-YaSzCPzr8""4> 6(0D[} +$="gO!?}T&$yVnd{Oץ&o!GEȃ9هȑ-״ RhAKTǎK@tN(;|K;fWmaW9,jycމ3k yNe^R ʼ ]ʊAvY070701000F01ED000081A4000000000000000000000001556432B600010CC4000000FD0000000000000000000000000000005300000000linux/suse/x86_64-sles12/install/dracut-fips-037-49.1.8562.0.PTF.916376.x86_64.rpmdracut-fips-037-49.1.8562.0.PTF.916376> A AlpA?U[_Klts{֐zYN c /4,@UIRb?G/T\51bc25facdc298d85c6e7902a9f0f915b08c18209 @?d ) l $>k "p             6 h  $  (=8D9d:>ߖ@ߞFߦG߼ H I XY$\x ] ^bcYdeflu vw x yz Cdracut-fips03749.1.8562.0.PTF.916376Dracut modules to build a dracut initramfs with an integrity checkThis package requires everything which is needed to build an initramfs with dracut, which does an integrity check of the kernel and its cryptography during startup.U[]sheep13cSUSE Linux Enterprise PTFSUSE LINUX Products GmbH, Nuernberg, GermanyGPL-2.0+ and LGPL-2.1+http://bugs.opensuse.orgSystem/Basehttps://dracut.wiki.kernel.org/linuxx86_64 mkdir -p /var/run/regenerate-initrd/ touch /var/run/regenerate-initrd/all mkdir -p /var/run/regenerate-initrd/ touch /var/run/regenerate-initrd/all3wbFAAA큤U[] U[]S)S)U[]U[]S)S)U[]S)35f6228bc571b22aacadbc6fbd7e11e48332010f757708cba36c9a6e5a48724a9f08f9ac1f288cb25192cc034233c72b8db9c744b14f1ac5cbd4793708e008015a1eab1698b417d8816cc4e2d5623cb890e2234317b25faff88b48bde6e851b7b234ee4d69f5fce4486a80fdaf4a4263rootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootdracut-037-49.1.8562.0.PTF.916376.src.rpmconfig(dracut-fips)dracut-fipsdracut-fips(x86-64)@ @   /bin/bash/bin/sh/bin/sh/bin/sh/bin/shconfig(dracut-fips)dracutfipschecklibcryptsetup4-hmaclibgcrypt20-hmacrpmlib(CompressedFileNames)rpmlib(PayloadFilesHavePrefix)rpmlib(PayloadIsLzma)037-49.1.8562.0.PTF.916376037-49.1.8562.0.PTF.9163763.0.4-14.0-14.4.6-14.11.2U[%UPU%@U hTD@TԬT[@T~@TmT"@T @TTT@Tk@S@SS@SS@S@S#@SS@S@SESES\S @SS@S-S-S@SSDSDS @S @Sg@Sg@Sg@SS{CSy@Sy@St@SsZSj @Sg}@S`S_@SZN@SNpSKSKSG@SFSE6@SE6@SE6@SCS>S=M@S:@S5d@S1oS"@S"@S L@SSSnSnS(S?SR@R@RRRRRRRb@Rb@RmRmR@R&R@R1@R@R0@Re@R_@R[RZ@RUE@RSRR@RNRNRNRL RL RB@R=@R=@R-@R-@QQQQ@Q@Q)@QKQyQQr@QkQ\QHS@Q@j@Q']QQ@Qh@Q"@PP@Pd@Pe@P@P vs mainline initramfs-.img * Add 0164-Fix-initramfs-ver.img-vs-initrd-ver-in-dracut-initra.patch - Do fsck (bnc#906592) * Add 0165-Order-root-fsck-after-pre-mount.patch - Also add ifname=: boot parameter to always identify correct NIC (bnc#900831) * Add 0166-nfs-Add-ifname-dev-mac-to-boot-parameters.patch - Typo fix (bnc#901322) * Add 0168-convertrunfs-Fix-typo.patch - also add the cmac.ko cryptographic module to the modules (bnc#905296) * Add 0171-also-add-the-cmac.ko-cryptographic-module-to-the-mod.patch - Fix install-kernel: - Call depmod (bnc#874621) - add .config (bnc#897901)- purge-kernels: Also clean up kgraft-patch packages (bnc#905869)- Add ip= and root=nfs.. to dracut internal cmdline to make nfsroot working (bnc#896464) * Add 0160-nfs-Add-ip-.-and-root-nfs.-parameters-to-internal-dr.patch - Fix error message in case there is no internal dracut cmdline added Simple fix * Add 0161-Fix-error-message-when-there-are-no-internal-kernel-.patch - Request DHCP lease instead of getting/applying the offer No bug number, but Pawel rated this high prio. This should hit SLE12 still. * Add 0162-network-Request-DHCP-lease-instead-of-getting-applyi.patch- Try to load xennet driver in network module (if loaded). bnc#896464, bnc#896259 * Add 0159-network-Try-to-load-xennet.patch- dracut.usage.asc: Remove distro specific help from manpage (bnc#895363) * Add 0156-dracut.usage.asc-Remove-distro-specific-help-from-ma.patch - Add /boot/zipl to host devs if it is a mount point (bnc#892187) * Add 0157-Add-boot-zipl-to-host-devs-if-it-is-a-mount-point.patch - Add SUSE kernel module dependencies (in /etc/modprobe.d/*) (bnc#895331) * Add 0158-Add-SUSE-kernel-module-dependencies-in-etc-modprobe..patch- Network module may take quite a lot of initrd space. Do not add it unconditionally (bnc#892851) * Add 0153-Only-add-network-module-on-request-and-on-dependenci.patch - S390x can do s2disk, allow resume module there (bnc#889795) * Add 0154-resume-Also-allow-this-module-on-S390-again-s2disk-c.patch - Harden iscsi parameter checking. No bug report, but this problem was found during multipath testing and happens with 2 or more iscsi devices. * Add 0155-iscsi-iscsi.initiator-and-others-can-and-must-only-s.patch- Do not blindly try to touch the logfile (bnc#893219) * Add 0146-dracut.sh-corrected-logfile-check.patch - Only fix UUID= fstab parsing * Add 0147-dracut.sh-Fix-UUID-fstab-parsing-in-case-mount-optio.patch - Also fix other parsing syntax in fstab like LABEL= * Add 0148-dracut.sh-Fix-LABEL-and-other-fstab-syntax.patch - Fix up some bugs from previous commit * Add 0149-dracut.sh-Fix-fstab-parsing-again.patch - bnc#893615 * Add 0150-Find-kernel-modules-in-extra-and-weak-updates-path-a.patch - pixz does need too much memory, go back to xz in a conservative way (bnc#893981) * Add 0151-Go-back-to-xz-again-pixz-may-use-too-much-memory-whi.patch - Add some default tools to initrd when debug module is included and already provided an commented example line how to easily enable it. No functional change by default. * Add 0152-Add-a-comment-to-easily-add-debug-modules-also-add-v.patch- dracut.sh: check for logfile (--logfile option) and create it if necessary Add 0139-dracut.sh-check-for-logfile-logfile-option-and-creat.patch - Avoid duplicate names in host_devs Add 0140-dracut.sh-Avoid-duplicate-devices-in-host_devs.patch - iscsi: Avoid bad ip route call on empty address Add 0141-iscsi-Avoid-bad-ip-route-call-on-empty-address.patch - 40network: Don't report error for .../ifroute-* during module setup Add 0142-40network-Don-t-report-error-for-etc-sysconfig-netwo.patch - iscsi: Fix up ipv6 in brackets , iterate over all needed iscsi mounts Add 0143-iscsi-Fix-up-ipv6-in-brackets-iterate-over-all-possi.patch - 90crypt: Fixed crypttab_contains() to also work with device in /etc/crypttab Add 0144-90crypt-Fixed-crypttab_contains-to-also-work-with-de.patch - 40network: handle 'ip=ifname:static' correctly (bnc#892801) Add 0145-40network-handle-ip-ifname-static-correctly.patch- Allow multiple configurations per network interface (bnc#887906) Add 0133-Allow-multiple-configurations-per-network-interface-.patch - Remove bootdev warning (bnc#881112) Add 0134-Remove-bootdev-warning-bnc-881112.patch - check for existance of 69-dm-lvm-metad.rules in modules_setup.sh, lvm module (bnc#891791) Add 0135-lvm-Fix-12819a579900b9691e2-check-for-existance-of-6.patch - Moved persistent network rule revert to another file (was not in github): Delete: 0133-Remove-70-persistent-net.rules.patch Add: 0136-Revert-95udev-rules-add-persistent-network-rule.patch - dracut-use-fipscheck-openssl.patch: Switch from Mozilla NSS sha256hmac checking to fipscheck as recommended Add: 0137-Switch-from-Mozilla-NSS-sha256hmac-checking-to-fipsc.patch - warpclock: Do not use warpclock module on S390(x), hwclock does not exist there (bnc#884513) Add 0138-warpclock-Do-not-use-warpclock-module-on-S390-x-hwcl.patch- 99base: Increase initqueue timeout in non systemd case (bnc#887402) * Add: 0127-99base-Increase-initqueue-timeout-in-non-systemd-cas.patch - 90lvm: Install dm-snapshot module (bnc#888530) * Add: 0128-90lvm-Install-dm-snapshot-module.patch - Revert commit 6ecab258710d158a7a6 and only do not wait for swap via parameter (bnc#882812) * Add: 0129-Revert-commit-6ecab258710d158a7a6-and-only-do-not-wa.patch - nfs: Always add all kernel modules for kdump (bnc#887906) * Add: 0130-nfs-Always-add-all-kernel-modules-for-kdump.patch - 40network: handle prefixed IP addresses correctly (bnc#880108) * Add: 0131-40network-handle-prefixed-IP-addresses-correctly.patch - 40network: fixup static network configuration * Add: 0132-40network-fixup-static-network-configuration.patch - Remove 70-persistent-net.rules * Add: 0133-Remove-70-persistent-net.rules.patch- mkinitrd-suse.sh: Bail out with exit 1 if initrd cannot be generated (bnc#886630) * Add: 0120-mkinitrd-suse.sh-Bail-out-with-exit-1-if-initrd-cann.patch - Adjust initramfs-$kernel.img to SUSE default: initrd-$kernel (bnc#882306) * Add: 0121-Adjust-initramfs-kernel.img-to-SUSE-default-initrd-k.patch - btrfs: btrfs-dump-super and btrfs-select-super do not exist (bnc#886883) * Add: 0122-btrfs-btrfs-dump-super-and-btrfs-select-super-do-not.patch - 95zfcp_rules: fix typo in module_setup (bnc#887582) * Add: 0123-95zfcp_rules-fix-typo-in-module_setup.patch - 40network: Update iBFT scanning code to handle IPv6 (bnc#887542) * Add: 0124-40network-Update-iBFT-scanning-code-to-handle-IPv6.patch - 40network: separate 'mask' and 'prefix' (bnc#887542) * Add: 0125-40network-separate-mask-and-prefix.patch - 01fips: Add drbg module to force loaded modules (bnc#875855) * Add: 0126-01fips-Add-drbg-module-to-force-loaded-modules.patch- Fixup executable bits of newly patched files manually in spec file bnc#887117- Mark all scripts as executable (bnc#887010) * Remove: 0116-81cio_ignore-Mark-scripts-as-executable * Add: 0116-Mark-scripts-as-executable.patch - 95dasd_rules: Enable device before checking type * Add: 0117-95dasd_rules-Enable-the-device-before-checking-devic.patch - 95zfcp_rules: Enable device before checking type * Add: 0118-95zfcp_rules-Enable-the-device-before-checking-devic.patch - Reset IFS variable * Add: 0119-Reset-IFS-variable.patch- Handle module alias properly (bnc#886839) * Add: 0115-Handle-module-alias-properly.patch - 81cio_ignore: Mark scripts as executable (bnc#887010) * Add: 0116-81cio_ignore-Mark-scripts-as-executable.patch- 91zipl: Translate 'ext2' into 'ext4' module * Add: 0114-91zipl-Translate-ext2-3-into-ext4.patch- Enable converting of directory /var/run /var/lock to symlinks (bnc#877680) * Add: 0106-dracut-Enable-converting-of-directory-var-run-var-lo.patch - Fixup typo 'firmare' instead of 'firmware' * Add: 0107-Fixup-typo-firmare-instead-of-firmware.patch - 91zipl: Store commandline correctly * Add: 0108-91zipl-Store-commandline-correctly.patch - 95dasd_rules: Store all devices in commandline * 0109-95dasd_rules-Store-all-devices-in-commandline.patch - 95zfcp_rules: Store all devices in commandline * Add: 0110-95zfcp_rules-Store-all-devices-in-commandline.patch - 90mdraid: Remove line for 'offroot' detection * Add: 0111-90mdraid-Remove-line-for-offroot-detection.patch - 99base: warn on invalid command for initqueue * Add: 0112-99base-warn-on-invalid-command-for-initqueue.patch - 91zipl: Install script as executable * Add: 0113-91zipl-Install-script-as-executable.patch- Print stored dracut commandline during initramfs build * Add: 0101-Print-stored-dracut-commandline-during-initramfs-bui.patch - Align dev_unit_name() with systemd's function * Add: 0102-Align-dev_unit_name-with-systemd-s-function.patch - Fixup missing separators in rootfs-block cmdline * Add: 0103-Fixup-missing-separators-in-rootfs-block-cmdline.patch - Generate fallback mount unit for root filesystem (bnc#855258) * Add: 0104-Generate-fallback-mount-unit-for-root-filesystem.patch - 95iscsi: parse output from iscsiadm correctly (bnc#886199) * Add: 0105-95iscsi-parse-output-from-iscsiadm-correctly.patch- 90btrfs: Install rescue utilities to initrd * Add: 0100-btrfs-add-initrd-rescue-utilities.patch- 40network: create /var/lib/wicked in ifup.sh (bnc#885141) * Add: 0089-40network-create-var-lib-wicked-in-ifup.sh.patch - dracut: caps: Remove whole caps module * Add: 0090-dracut-caps-Remove-whole-caps-module.patch - dracut: biosdevname: Only install if present * Add: 0091-dracut-biosdevname-In-SUSE-biosdevname-package-is-in.patch - dracut: nbd: Only complain of missing binary in hostonly mode if rootfs is on nbd * Add: 0092-dracut-nbd-Only-complain-of-missing-binary-in-hoston.patch - 95iscsi: generate commandline for software iscsi (bnc#880108) * Add: 0093-95iscsi-generate-commandline-for-software-iscsi.patch - Implement shortcut 'ip=:static' for static configuration * Add: 0094-Implement-shortcut-ip-ifname-static-for-static-confi.patch - 95iscsi: use static configuration for software iscsi (bnc#884768) * Add: 0095-95iscsi-use-static-configuration-for-software-iscsi.patch - dracut: Fix error: local: can only be used in a function * Add: 0096-dracut-Fix-error-local-can-only-be-used-in-a-functio.patch - Implement 'rd.timeout' to modify the device timeout (bnc#878770) * Add: 0097-Implement-rd.timeout-to-modify-the-device-timeout.patch - Do not call 'lvm' for non-LVM device-mapper devices * Add: 0098-Do-not-call-lvm-for-non-LVM-device-mapper-devices.patch - 90multipath: Load device_handler modules early during boot (bnc#871617) * Add: 0099-90multipath-Load-device_handler-modules-early-during.patch- 91zipl: Add new module for s390x configuration changes (bnc#884743) * Add: 0088-91zipl-Add-new-module-to-update-s390x-configuration.patch- 95dasd_rules: Fixup rd.dasd parsing * Add: 0079-95dasd_rules-fixup-rd.dasd-parsing.patch - 95dasd_rules: Print out rd.dasd command-line * Add: 0080-95dasd_rules-print-out-rd.dasd-commandline.patch - 95dasd_mod: do not set module parameter * Add: 0081-95dasd_mod-do-not-set-module-parameters-if-dasd_cio_.patch - 00warpclock: Check for /sbin/hwclock (bnc#884513) * Add: 0082-00warpclock-check-for-sbin-hwclock.patch - 95zfcp_rules: Fixup rd.zfcp parsing * Add: 0083-95zfcp_rules-Fixup-rd.zfcp-parsing.patch - 95rootfs_block: terminate commandline parameter * Add: 0084-95rootfs-block-Correctly-terminate-commandline-param.patch - 95zfcp_rules: Print out rd.zfcp command-line * Add: 0085-95zfcp_rules-print-out-rd.zfcp-commandline-parameter.patch - 95zfcp_rules: Auto-generate ipl device rule * Add: 0086-95zfcp_rules-Auto-generate-udev-rule-for-ipl-device.patch - 95dasd_rules: Auto-generate ipl device rule * Add: 0087-95dasd_rules-Auto-generate-udev-rule-for-ipl-device.patch- More empty commandline fixes * Add: 0074-More-empty-cmdline-fixes.patch - 95dasd_rules: enable parsing of rd.dasd= commandline parameter * Add: 0075-95dasd_rules-enable-parsing-of-rd.dasd-commandline-p.patch - Correctly set cio_ignore for dynamic s390 rules * Add: 0076-Correctly-set-cio_ignore-for-dynamic-s390-rules.patch - 90multipath: add missing 11-dm-mpath.rules file (bnc#883149) * Add: 0077-90multipath-add-missing-11-dm-mpath.rules-file.patch - Restore original IFS value (bnc#883770) * Add: 0078-Restore-original-IFS-value.patch- Fix non-export of journal dev boot options * Add: 0071-Fix-non-export-of-journal-dev-boot-options.patch - Also export root= boot param for hostonly-cmdline * Add: 0072-Also-export-root-boot-param-for-hostonly-cmdline-cas.patch - Don't create lots of empty cmdline files * Add: 0073-Don-t-create-lots-of-empty-cmdline-files-for-hostonl.patch- 81cio_ignore: rewrite module to not mount any filesystem (bnc#882685) * Add: 0070-81cio_ignore-rewrite-module.patch- 81cio_ignore: ignore module if cio_ignore is not specified (bnc#882685) * Add: 0069-81cio_ignore-skip-module-if-cio_ignore-is-not-active.patch- 40network: always start netroot in ifup.sh (bnc#881235) * Add: 0066-40network-always-start-netroot-in-ifup.sh.patch - 95fcoe: check() always returns 255 * Add: 0067-95fcoe-check-always-returns-255.patch - 95fcoe-uefi: Test for EFI firmware (bnc#882412) * Add: 0068-95fcoe-uefi-Test-for-EFI-firmware.patch- Rename patches to match git repository: * Old: more-fips-adjustments.patch * New: 0057-01fips-Include-some-more-hmacs.patch * Old: dracut-check-supported.patch * New: 0058-dracut-add-warning-when-including-unsupported-module.patch - Add 99suse module to git repository: * Remove: parse-suse-initrd.sh * Remove: module-setup-initrd.sh * Add: 0059-99suse-Add-SUSE-specific-initrd-parsing.patch - Add write-ifcfg-suse.sh to git repository: * Remove: write-ifcfg-suse.sh * Add: 0060-45ifcfg-Add-SUSE-specific-write-ifcfg-file.patch - Fixup error messages in write-ifcfg-suse.sh (bnc#881286) * Add: 0061-45ifcfg-Fixup-error-message-in-write-ifcfg-suse.patch - Add missing 'libgcc_s.so' library (bnc#881692): * Add: 0062-95iscsi-Install-libgcc_s-library.patch * Add: 0063-90multipath-Install-libgcc_s-library.patch - Install missing scsi_dh_alua module (bnc#871617) * Add: 0064-90kernel-modules-install-scsi_dh_alua.patch - 95iscsi: fixup bnx2i offload booting (bnc#855747) * Add: 0065-95iscsi-Fixup-bnx2i-offload-booting.patch- Add option to warn if unsupported modules are added to the initramfs - Enable this option for 'make install' when a kernel with CONFIG_SUSE_KERNEL_SUPPORTED enabled is used. (bnc#882332) - Add dracut-check-supported.patch- include the several hmacs needed for FIPS integrity checking of cryptsetup, libgcrypt, libfipscheck1. Also add the openssl HMACs too as someone else seems to use those too. Add: more-fips-adjustments.patch- Rediff patches to match git repository - 95fcoe: Check for FCoE devices prior to binaries * Modify 0055-95fcoe-Only-install-fcoe-module-if-required.patch - 99base: Install chown instead of chgrp * Modify 0052-99base-Add-chown-binary.patch - 95iscsi: do not try to detect iSCSI firmware during booting; should be handled via commandline parameter * Modify 0030-95iscsi-Autodetect-iSCSI-firmware.patch - Rename patch: * old: 0051-mkinitrd-suse-add-update-booloader-message.patch new: 0051-mkinitrd-suse-add-update-bootloader-message.patch- Rename patches to match git repository: * old: 0013-Correct-paths-for-openSUSE.patch new: 0011-Correct-paths-for-openSUSE.patch * old: 0014-Check-for-plymouth-lib-directories.patch new: 0012-Check-for-plymouth-lib-directories.patch * old: dracut_do_not_update_booloader_if_no_kernel_is_found.patch new: 0013-mkinitrd-suse-do-not-update-bootloader-if-no-kernel-.patch * old: suse_grub_manpage.patch new: 0014-Update-dracut-manpage-for-GRUB-Legacy-and-GRUB2.patch * old: replace_dhclient_with_wickedd_dhcp_supplicants.patch new: 0015-40network-replace-dhclient-with-wickedd-dhcp-supplic.patch * old: 0015-add-new-s390x-specific-rule-files.patch new: 0016-Add-new-s390x-specific-rule-files.patch * old: change_write_ifcfg_to_suse.patch new: 0017-45ifcfg-use-distro-specific-scripts.patch * old: dracut-fix-whitespace-add-drivers_call.patch new: 0018-mkinitrd-suse-Fix-whitespaces-when-adding-drivers.patch * old: wait_for_network_race_condition_fix.patch new: 0019-40network-Fix-race-condition-when-wait-for-networks.patch * old: dracut-warpclock_module.patch new: 0020-00warpclock-Set-correct-timezone.patch * old: s390-dcssblk.patch new: 0021-95dcssblk-Add-new-module-for-DCSS-block-devices.patch * old: dracut-install-persistent-rule.patch new: 0022-95udev-rules-add-persistent-network-rule.patch * old: dracut-really-always-add-autofs4.patch new: 0023-systemd-always-tries-to-load-autofs4.patch * old: mdraid-setup.patch new: 0024-Fixup-mdraid-setup.patch * old: 0015-95udev-rules-Add-59-scsi-sg_utils.rules.patch new: 0025-95udev-rules-Add-59-scsi-sg_utils.rules.patch * old: 0016-90multipath-add-67-kpartx-compat.rules.patch new: 0026-90multipath-add-67-kpartx-compat.rules.patch * old: 0017-90multipath-install-dracut-specific-service-file.patch new: 0027-90multipath-install-dracut-specific-service-file.patch * old: 0020-95udev-rules-Include-correct-sg3_utils-rules.patch new: 0028-95udev-rules-Include-correct-sg3_utils-rules.patch * old: 0021-90multipath-install-correct-multipath-rules.patch new: 0029-90multipath-install-correct-multipath-rules.patch * old: add_dracuts_network_params_for_iscsi.patch new: 0030-95iscsi-Autodetect-iSCSI-firmware.patch * old: 0022-90multipath-Fixup-service-file-for-booting.patch new: 0031-90multipath-Fixup-service-file-for-booting.patch * old: 0023-mkinitrd-suse.sh-Use-hostonly-and-hostonly-cmdline-c.patch new: 0032-mkinitrd-suse.sh-Use-hostonly-and-hostonly-cmdline-c.patch * old: 0024-95iscsi-Set-correct-iscsi_started-value-for-iSCSI-fi.patch new: 0033-95iscsi-Set-correct-iscsi_started-value-for-iSCSI-fi.patch * old: 0025-dracut_continue_adding_modules_also_on_error.patch new: 0034-dracut-Do-not-stop-installing-drivers-if-one-fails.patch * old: 0026-force_to_add_and_load_kernel_modules_other_than_via_boot_param.patch new: 0035-Introduce-force-drivers-parameter-and-force_drivers-.patch * old: 0027-95fcoe-Store-current-configuration-in-dracut-cmdline.patch new: 0036-95fcoe-Store-current-configuration-in-dracut-cmdline.patch * old: 0028-95fcoe-update-fcoe-interface-check.patch new: 0037-95fcoe-update-fcoe-interface-check.patch * old: 0029-95fcoe-start-lldpad-separately.patch new: 0038-95fcoe-start-lldpad-separately.patch * old: 0030-dracut-mkinitd_cleanup_force_host_only_var.patch new: 0039-Remove-force-parameter-from-mkinitrd.patch * old: 0031-95fcoe-skip-VLAN-devices-in-fcoe-up.patch new: 0040-95fcoe-skip-VLAN-devices-in-fcoe-up.patch * old: 0033-dracut_hostonly_hostonly_cmdline_default.patch new: 0041-mkinitd-suse-remove-hostonly-and-hostonly-cmdline.patch * old: 0034-suse.conf.example_extend.patch new: 0042-Enhance-suse.conf-example-with-SUSE-specific-setting.patch * old: 0035-always_add_network.patch new: 0043-40network-always-add-network-module.patch * old: 0036-add_extra_debug_binaries.patch new: 0044-Add-find-to-debug-binaries.patch * old: 0037-fix_s390_network_modules_install.patch new: 0045-40network-add-missing-_arch-variable-declaration.patch * old: 0038-remove_waiting_for_swap_dev.patch new: 0046-dracut-Do-not-wait-for-swap-device.patch * old: 0039-s390_no_resume_module.patch new: 0047-95resume-skip-module-for-s390-x.patch * old: 0041-only_enable_network_if_explicitly_requested.patch new: 0048-40network-Only-enable-network-interfaces-if-explicit.patch * old: 0042-ibft_autoconfig_param.patch new: 0049-95iscsi-Use-ip-ibft-for-ibft-autoconfiguration.patch * old: 0043-fcoe_strip_quotes.patch new: 0050-95iscsi-strip-one-set-of-quotes-when-calling-initque.patch * old: 0044-Add_update_bootloader_msg.patch new: 0051-mkinitrd-suse-add-update-booloader-message.patch * old: 0045-add-chown_binary.patch new: 0052-99base-Add-chown-binary.patch * old: dracut-fips-module-loading-fixes.patch new: 0053-01fips-fixup-loading-issues.patch * old: 0046-ibft_update_cmdline_printing.patch new: 0054-95iscsi-update-commandline-printing.patch * old: 0047-only_install_fcoe_if_required.patch new: 0055-95fcoe-Only-install-fcoe-module-if-required.patch * old: 0048-cio_ignore.patch new: 0056-81cio_ignore-handle-cio_ignore-commandline.patch- Mount zipl device on S390 (bnc#874902) Add 0048-cio_ignore.patch- Only install fcoe if required and suppress require-binaries output Add 0047-only_install_fcoe_if_required.patch - ibft: Correctly show ibft cmdline via print-cmdline Add 0046-ibft_update_cmdline_printing.patch- dracut-fips-module-loading-fixes.patch: bnc#875855 - adjust FIPS module list - on architecture specific modules, failing loading is not critical - ship 98selinux, for people that want to use SELinux.- Update to latest git HEAD: commit 0fa5dbedc5b222435f51f7460a81232ee120c4e1 Tue May 20 13:23 Modified dracut_v37_to_HEAD.patch Modified mdraid-setup.patch Modified dracut-install-persistent-rule.patch Removed 0032-98systemd-fixup-rootfs-generator-installation-path.patch - Add /etc/dracut.d.conf/01-dist modifications to file instead of writing to it via rpm build section Add 0033-dracut_hostonly_hostonly_cmdline_default.patch Add 0034-suse.conf.example_extend.patch - Cleanup mkinitrd-suse.sh: * Remove hostonly and hostonly-cmdline -> this is done via 01-dist config file now - Always add network module based on modules_setup.sh check() function and not via 01-dist config file Add 0035-always_add_network.patch - Add find to debug binaries - Useful and harmless Add 0036-add_extra_debug_binaries.patch - Fix adding of network modules for s390 (bnc#879302) Add 0037-fix_s390_network_modules_install.patch - Omit resume module on s390(x) - There is no suspend on s390 Add 0039-s390_no_resume_module.patch - Do not wait for swap - This causes trouble with Rudi's autobuild images: Add 0038-remove_waiting_for_swap_dev.patch - Fcoe and ibft fixes (bnc#879038): Add 0041-only_enable_network_if_explicitly_requested.patch Add 0042-ibft_autoconfig_param.patch Add 0043-fcoe_strip_quotes.patch - Print message when starting to update bootloader Add 0044-Add_update_bootloader_msg.patch - ToDo: Pass hostonly variable earlier so that is always avail in check() function. Still already add: Add 0040-fcoe_fix_check_function.patch - Add chown to initrd (bnc#879767) Add 0045-add-chown_binary.patch - Use parallel pixz instead of xz binary to compress the initrd- From Hannes Reinecke : fixup rootfs-generator installation path (bnc#878714) Add 0032-98systemd-fixup-rootfs-generator-installation-path.patch- Corrected previous patch Modified: 0031-95fcoe-skip-VLAN-devices-in-fcoe-up.patch- From Hannes Reinecke : skip VLAN devices in fcoe-up (bnc#878583) Add: 0031-95fcoe-skip-VLAN-devices-in-fcoe-up.patch- By Hannes Reinecke : - Fixup FCoE booting (bnc#877288) * Add 0027-95fcoe-Store-current-configuration-in-dracut-cmdline.patch * Add 0028-95fcoe-update-fcoe-interface-check.patch * Add 0029-95fcoe-start-lldpad-separately.patch - Cleanup host_only variable using in mkinitrd - Remove --force parameter from mkinitrd, we always force anyway * Add 0030-dracut-mkinitd_cleanup_force_host_only_var.patch - Remove acpi parameter from mkinitrd, this is done differently nowadays - Adjust manpage accordingly- also do the service magic in %post/%postun, otherwise purge-kernels will not get enabled.- Do not inst binaries explicitly into /bin or /usr/bin, it is already taken care of internally for that: Delete 0006-Install-bin-mount.patch Modify 0013-Correct-paths-for-openSUSE.patch - Do not stop trying to load drivers (via add-drivers or filesystems) if one fails Add 0025-dracut_continue_adding_modules_also_on_error.patch - Introduce force-drivers. mkinitrd should use this one instead of add-drivers later, if accepted mainline Add 0026-force_to_add_and_load_kernel_modules_other_than_via_boot_param.patch- Update add_dracuts_network_params_for_iscsi.patch to detect be2iscsi firmware devices - Remove obsolete patch fix-iscsi-firmware.sh - Fixup iscsi firmware booting with be2iscsi (bnc#873448): Added 0024-95iscsi-Set-correct-iscsi_started-value-for-iSCSI-fi.patch - Renamed mkinird_differ_host_and_cmdline_only_properly.patch to 0023-mkinitrd-suse.sh-Use-hostonly-and-hostonly-cmdline-c.patch- Update to lateste git HEAD 48b7ab1b35adf1f3f09f883ef14ea0a3fba1e468 Added: dracut_v37_to_HEAD.patch Modified: 0013-Correct-paths-for-openSUSE.patch Modified: mdraid-setup.patch Modified: replace_dhclient_with_wickedd_dhcp_supplicants.patch Deleted: 0018-fstab-do-not-mount-and-fsck-from-fstab-if-using-syst.patch Deleted: 0019-dracut-initqueue-service-runs-before-remote-fs-pre.t.patch - Fix lvm and other possible not working thing due to new parameter: hostonly-cmdline which has to be active by default bnc#874000 bnc#874905 bnc#874363 Added: mkinird_differ_host_and_cmdline_only_properly.patch - Make write-ifcfg-suse.sh more update robust Avoid rebasing of diff with every update touching this file by adding write-ifcfg-suse.sh as source file and copy/link in .spec file. Modified: change_write_ifcfg_to_suse.patch- consolidate -fips-aesni into -fips again. The problem due to it was split off upstream was solved in the kernel.- Create new -fips and -fips-aesni subpackage for kernel integrity checking. bnc#856310 FATE#316930 - add spaces around "network" in 01-dist.conf, as the addmodules list is concatenated and you never know which config is before or after and what it does.- Enable multipath correctly during booting (bnc#873686) Add: 0022-90multipath-Fixup-service-file-for-booting.patch- fix-iscsi-firmware.patch: Fix according to dracut-037 updates (iscsistarted-iscsi:).- add_dracuts_network_params_for_iscsi.patch: Add missing dracut's cmdline parameters to make network mandatory and boot using iBFT when present. Without them iBFT booting does not work.- Install correct rule files for multipath support (bnc#873151) Add: 0020-95udev-rules-Include-correct-sg3_utils-rules.patch Add: 0021-90multipath-install-correct-multipath-rules.patch- Do not always try to add iscsi module, let its check function decide - Compress initrd with xz --check=crc32 -6 by default- Remove the bootchart module, note that we still keep the systemd-bootchart one which provides similar functionality.- Remove the busybox module we have all basic tools already in the initrd - _unitdir is always defined nowadays, remove the conditionals.- Replaced dracut tarball with proper upstream tarball Add: dracut-037.tar.xz- Update dracut to 037 * Add --hostonly_cmdline switch * Update --mount syntax * Include modules from /updates directory * Fixes for network setup * Some small fixes - Rediff patches - Include iscsiuio again (bnc#872474) Remove: remove-iscsiuio.patch - Install 59-scsi-sg_utils.rules (bnc#872478) Add: 0015-95udev-rules-Add-59-scsi-sg_utils.rules.patch - Install 67-kpartx-compat.rules (bnc#872662) Add: 0016-90multipath-add-67-kpartx-compat.rules.patch - Install separate multipath service file (bnc#871610) Add: 0017-90multipath-install-dracut-specific-service-file.patch - Do not fsck and mount from fstab if systemd is used (bnc# Add: 0018-fstab-do-not-mount-and-fsck-from-fstab-if-using-syst.patch - Fixup initqueue for remote-fs Add: 0019-dracut-initqueue-service-runs-before-remote-fs-pre.t.patch- revert last change, ucode-intel is not mandatory and will get installed by default anyway, either via patterns or by modalias dependencies in the package itself.- Require package ucode-intel in x86*- mdraid-setup.patch Make mdraid scripts work with latest mdadm. Without this, boot from DDF or IMSM array fails if one device is missing (bnc#866660)- systemd always tries to load autofs4 otherwise it reports: Failed to insert module 'autofs4' dracut already adds it, but only if loaded already. Always load autofs4 even if not already loaded (bnc#869411) Add: dracut-really-always-add-autofs4.patch- Fix installkernel script bnc#862990- Add support for 70-persistent-net.rules in dracut (bnc#868375) Add: dracut-install-persistent-rule.patch- CRITICAL: Fix add-drivers passing from mkinitrd to dracut bnc#868397- Add s390 dcssblk driver and introduce rd.dcssblk= to pass mounts that should get activated at initrd stage fate#308263 Add: s390-dcssblk.patch- bnc#830060 - Dracut is missing warpclock/hwclock Add dracut-warpclock_module.patch- wait_for_network_race_condition_fix.patch: * In case of no network related params are specified, but rd.neednet=1 is set, default initqueue action is to wait until one of the network interfaces is marked as set up properly. (bnc#866771) * It also helps with initqueue's race condition when network interface shows up late. - replace_dhclient_with_wickedd_dhcp_supplicants.patch: Add a missing network setup flag. (bnc#866771)- Merge all dracut-* packages to one dracut.rpm package. Subpackages only had one or two minor files not worth splitting a package or dracut-network had important modules which should (like former main dracut package) always get installed - libcap does not exist and libcap2 or friends are not needed - > remove Requires: libcap - Reorder (sort) the files section a bit- Fix bug introduced with last commit: Bad whitespace logic when INITRD_MODULES contain more than one module.- Make sure that --add-drivers is not called with whitespace string which will lead to a "read line" user input request and things may get stuck at installation. - Add: dracut-fix-whitespace-add-drivers_call.patch - Remove s390 grub module again -> this will go into grub2 package (ask rw@suse.de for details) Delete/remove: s390_add-user-space-grub-rule.patch - Add installkernel script which installs the kernel when: make install is invoked. The script from mkinitrd has been taken over and adopted. Added source: dracut-installkernel bnc#862990- Fix syntax error -> missing then - Correct path, it is /usr/bin/grub2-emu- autofs4 is always included since mainline git commit: 314929920f27448b45bfd systemd: ensure autofs4 and ipv6 are included - Always add network and iscsi dracut module, so that ibft, iscsi, nfsroot work as expected.- change_write_ifcfg_to_suse.patch: Detect the system flavor and write the ifcfg files accordingly.Originally by Hannes Reinecke (hare@suse.de): - Install new s390x specific udev rules (bnc#856585) - Add: 0015-add-new-s390x-specific-rule-files.patch - Do not check for non-existing dasd_configure for s390x (bnc#856585)- Added 95grub2 module for s390x- remove-iscsiuio.patch: Remove iscsiuio references as this one is not present in SLE-12.- fix-iscsi-firmware.patch: Fix iSCSI iBFT boot up problem introduced with mainline changes- replace_dhclient_with_wickedd_dhcp_supplicants.patch: Replace dhclient with wickedd-dhcp4 and wickedd-dhcp6. Script up dhcp functionality in ifup.sh.-Added bug number to previous changelog entry-Updated suse_grub_manpage.patch to further correct for incorrect grub configuration paths bnc#858448-Updated suse_grub_manpage.patch for dracut-036-Added patch to fix manpage to reflect openSUSE GRUB Legacy and GRUB2 - removed patches: * dracut_git_v034_to_head.patch- Cleanup with spec-cleaner.- Version bump to 036 removing the need for patching from git. - removed patch: * dracut_git_v034_to_head.patch- Do not show usage error when no kernel was found. This may happen several times at package installation time and floods the logs. Modify dracut_do_not_update_booloader_if_no_kernel_is_found.patch- Correctly fix previous issue: Exit without calling update-bootloader (bnc#858268) Currently mkinitrd will always exit early without creating an initrd at all. Rebase: dracut_do_not_update_booloader_if_no_kernel_is_found.patch - Remove an obsolete comment from .spec fileExit without calling update-bootloader (bnc#858268): Add: dracut_do_not_update_booloader_if_no_kernel_is_found.patch Adding: Requires: systemd-sysvinit which has reboot, halt and other binaries dracut likes to add to the initrd. Cleanup and adjust to latest mainline: Dropping as these are included in the latest update_git_v034_to_head patch: Drop: 0001-95dasd-Install-kernel-modules-only-once.patch Drop: 0002-95dasd-Only-install-module-if-normalize_dasd_arg-is-.patch Drop: 0003-95dasd_mod-make-dasd_cio_free-optional.patch Drop: 0004-95zfcp-Make-installation-optional.patch Drop: 0005-95znet-Make-installation-optional.patch Drop: 0007-Fixup-keymap-setting-for-openSUSE.patch Drop: 0008-Add-DASD-configuration-for-SuSE.patch Drop: 0009-Add-zfcp-scripts-for-SUSE.patch Drop: 0010-Make-logfile-configurable.patch Drop: 0011-mkinitrd-suse-Add-SUSE-compability-wrapper-for-dracu.patch Drop: 0012-mkinitrd-suse.8.asc-Add-manpage-for-SUSE-compat-mkin.patch Drop: 0015-Fixup-script-permissions.patch Drop: 0016-Remove-shebang-from-shell-completion-files.patch Drop: dracut-git-update.patch Rebase: 0013-Correct-paths-for-openSUSE.patch This is a rename of dracut-git-update.patch to: Add: dracut_git_v034_to_head.patch- Cleanup: Remove %define replace_mkinitrd 1 and related conditionals in .spec file -> One either has to install dracut or mkinitrd and it will stay like that.- Add purge kernel service/feature which before was part of mkinitrd bnc#854348- Update with patches from git repository: * kernel-modules: add ohci-pci to the list of forced module installs * Run 'xz' and 'lzma' with multiple threads * systemd: do not exit the initqueue, if systemd asks a password * iscsi,nbd: do not fail in hostonly mode * dracut-functions.sh: Avoid loading unnecessary 32-bit libraries for 64-bit initrds * fips: also install /etc/system-fips in the initramfs * dracut.modules.7.asc: removed empty section * dracut.sh: fixed PATH shortener * dracut.spec: move /sbin/dracut to /usr/sbin/dracut * iscsi/nbd: do not try to mount the whole disk, if root= is missing * fips: include crct10dif_generic * Handle crypto modules with and without modaliases * usrmount/module-setup.sh: fixed typo * lvm: always install thin utils for lvm * kernel-modules(ARM): add mmc_block usb_storage to static list of kernel mods * dracut-functions.sh:check_block_and_slaves*() skip LVM internal devs * mkdir basic dirs in /run * network/fcoe: only redirect output to loginit.pipe, if exists * dracut.sh: no need to make subdirs in run * dracut.sh: also mkdir /run/lock, which is copied to * lvm: fix thin recognition * Add lzo, lz4 compression and read INITRD_COMPRESS * remove resume-genrules.sh * resume: fix swap detection in hostonly * base/init.sh: also mkdir /run/lock * dmsquash-live: add /dev/mapper/live-base * Doc: cleanup, extend and split and reuse * dracut.sh: do not bail out, if kernel modules dir is missing * 10i18n/parse-i18n.sh: parse rd.vconsole and rd.locale * */module-setup.sh: add comments for dracut called functions * lvm: install thin utils for non-hostonly - Patches for S/390 support * 95dasd: Install kernel modules only once * 95dasd: Only install module if normalize_dasd_arg is present * 95dasd_mod: make dasd_cio_free optional * 95zfcp: Make installation optional * 95znet: Make installation optional * Install /bin/mount * Fixup keymap setting for openSUSE * Add DASD configuration for SuSE * Add zfcp scripts for SUSE * Make logfile configurable * Add SUSE compability wrapper for dracut * Add manpage for SUSE compat mkinitrd * Work around xsltproc bug * Correct paths for openSUSE * Check for plymouth lib directories - Drop obsolete patches - Install mkinitrd-suse- Remove not needed logrotate Requires- remove use_all_paths_udev.patch, /lib/udev.. is a symlink to /usr nowadays this confuses other parts of the code causing errors/warnings during the initrd generation.- version 034 * fcoe: add FCoE UEFI boot device support * rootfs-block: add support for the rootfallback= kernel cmdline option * btrfs: use inst_hook to install the timeout hook- Correct patch mkinitrd-fix-boot-dir-detection. (";;" doesn't really work)- Updated the patch mkinitrd-fix-boot-dir-detection.patch to a more generic validation that the inidcated initrd file doesn't contain a path. If no path is given, then add the default boot_dir.- Fix again the mkinitrd script as that people don't seem to test. Added mkinitrd-fix-boot-dir-detection.patch so that an initrd is created.- Update to mainline git version 033, b7d1b6f904a5b0bdd9a5ad19149f3. - Remove all patches which went mainline: generalize_early_cpio.patch microcode_cleanup.patch acpi_override.patch mkinitrd_allow_no_option.patch mkinitrd_allow_multiple_args.patch quiet_options.patch implement_default.patch root_fs.patch suse_host_only.patch - Fix missing root fs slash in lib/udev/rules.d resulting in: /var/tmp/initramfs.Lusf6flib/udev/rules.d - bcache: removed, it's in the upstream bcache-tools package mainline git commit: 49268028b90f6344f79e3510d2 - Fix bad she-bang in mkinitrd_setup_dummy- Add patch mkinitrd_update_bootloader.diff so that after generating the initrd, the update-bootloader is called to update grub2.- Validate that the parameters passed with -i (initrd file) does not already contain the boot_dir.- Bring back the versioned Provides/Obsoletes for mkinitrd. Otherwise we run into issues as that udev is conflicting with mkinitrd < 2.7.0- Remove Provides/Obsoletes: mkinitrd versioning. Simply obsolete and provide all mkinitrd versions.- Mark /etc/dracut.conf.d/02-early-microcode.conf as config file- Add ACPI table override ability: generalize_early_cpio.patch #PATCH-FIX-UPSTREAM microcode_cleanup #PATCH-FIX-UPSTREAM acpi_override.patch #PATCH-FIX-UPSTREAM - This will replace mkinitrd with dracut as the default initrd generator. Therefore Prefer: dracut tag in the project config of the repo is needed. Otherwise OSC does not know how to build installation-images (needing mkinitrd to build) and which package to take. - To switch back and try mkinitrd instead of dracut will be: Uninstall dracut: - rpm -e dracut --nodeps And install mkinitrd again: - zypper install mkinitrd - Adjust mkinitrd-dracut.sh to SUSE mkinitrd: : Before gives a "usage" error -> now scans /boot for kernels and builds corresponding inirtrds for them - i -k : Pass a list of kernels and initrd targets (not sure it was worth the hassle to be able to pass) - b : Boot directory to search for kernel images - d : Change root file system. Not tested whether dracut's behavior matches exactly what our mkinitrd does. - s : Dummy (should even be obsolete in latest mkinitrd) These patches have been submitted, but now feedback from mainline yet: mkinitrd_allow_no_option.patch mkinitrd_allow_multiple_args quiet_options implement_default root_fs suse_host_only - Write caller and used parameters to syslog if mkinitrd is called. So that those can easily be fixed and checked for correctness. This should get reverted again before a bigger release. This patch will never show up mainline and should also get reverted from SUSE factory repo before the next release shows up: suse_only_logger - Build host only images for default paths in SUSE for faster build and smaller images. Imply --force in this case as well. * suse_host_only.patch- save a few seconds on boot by always including the autofs4 kernel module in the initrd- dracut 033 - improved hostonly device recognition - improved hostonly module recognition - do not install udev rules from /etc in generic mode - fixed LABEL= parsing for swap devices - fixed iBFT network setup - removed caching of kernel cmdline - bcache: support new blkid - ifup with dhcp, if no "ip=" specified for the interface - fixed ifup udev rules- After testing, we need to correct a major problem, /usr/bin/mount most be installed in /bin/mount on the initrd otherwise boot fails.- version 032 - add parameter --print-cmdline - dracut now creates the initramfs without udevadm that means the udev database does not have to populated and the initramfs can be built in a chroot with /sys /dev /proc mounted. - renamed dracut_install() to inst_multiple() for consistent naming - if $libdirs is unset, fall back to ld.so.cache paths - always assemble /usr device in initramfs - bash module added (disable it, if you really want dash) - continue to boot, if the main loop times out, in systemd mode - removed inst*() shell pure versions, dracut-install binary is in charge now - fixed ifcfg file generation for vlan - do not include adjtime and localtime anymore - fixed generation of zfcp.conf of CMS setups - install vt102 terminfo - dracut_install() is still there for backwards compat - do not strip files in FIPS mode - fixed iBFT interface configuration - fs-lib: install fsck and fsck.ext* - shutdown: fixed killall_proc_mountpoint() - network: also wait for ethernet interfaces to setup - fixed checking for FIPS mode- version 031_git201308011055 * systemd: add support for kmod static devnodes * crypt: Wait for udev to settle before unlocking disk * systemd/dracut-pre-trigger.service: run after systemd-tmpfiles-setup-dev * systemd: use systemd in the initramfs, if installed on the system- Drop the buildrequire for the microcode_ctl. This package is no longer in Factory and with the latest kernel (3.11) no longer required.- version 030_git201307241235 * systemd: Replace prefdm.service with display-manager.service * modsign: do not install, if no keys present * bcache: add support for bcache * Use systemd-cat for logging on systemd systems, if logfile is empty- Remove the http link for the Source0. Git snapshots can not be obtained that way.- Version 029_git201307171236 * support early microcode loading in x86- Require pigz instead of gzip- version 029 * fixes for the networking modules * fixes for systemd integration * fixes for the i18n module (removes dracut-font.patch now upstream)- version 027_git201306061213 * setup correct system time and time zone in initrd * systemd integration bugfixes * lvm bugfixes.- Recommend pigz for faster/parallel compression- Ensure we use display-manager.service instead of prefdm.- Update to 027_git201304121327 * much of patch correct-paths-for-opensuse.patch is no longer need so it has shrinked significantly. * since PRE-027 dracut requires systemd >= 199 reflect that in in the rpm buildRequires.- dracut-027 * systemd module now requires systemd >= 199 * dracut makes use of native systemd initrd units * added hooks for new-kernel-pkg and kernel-install * hostonly is now default for fedora * comply with the BootLoaderSpec paths http://www.freedesktop.org/wiki/Specifications/BootLoaderSpec * added rescue module * host_fs_types is now a hashmap * new dracut argument "--regenerate-all" * new dracut argument "--noimageifnotneeded" * new man page dracut.bootup * install all host filesystem drivers * use -D_FILE_OFFSET_BITS=64 to build dracut-install- Update to 026_git201303180829 * bugfixes * adds bash completion Support - Most importantly, fix the (silly) compatibility patch that changes the name from initramfs to initrd that went broken in last update (all initrds were suffixed by .img)- dracut-026 - introduce /usr/lib/dracut/dracut.conf.d/ drop-in directory /usr/lib/dracut/dracut.conf.d/*.conf can be overwritten by the same filenames in /etc/dracut.conf.d. Packages should use /usr/lib/dracut/dracut.conf.d rather than /etc/dracut.conf.d for drop-in configuration files. /etc/dracut.conf and /etc/dracut.conf.d belong to the system administrator. - uses systemd-198 native initrd units - totally rely on the fstab-generator in systemd mode for block devices - dracut systemd now uses dracut.target rather than basic.target - dracut systemd services optimize themselves away - fixed hostonly parameter generation - turn off curl globbing (fixes IPv6) - modify the udev rules on install and not runtime time - enable initramfs building without kernel modules (fixed regression) - in the initqueue/timeout, reset the main loop counter, as we see new udev events or initqueue/work - fixed udev rule installation- Update to 025_git201302211113 * Support out-of-tree and updated drivers in initramfs creation * shutdown: call "losetup -D" on shutdown * Mount /proc before including dracut-lib.sh. * dracut.sh: make /var/log a symlink to /run/log * systemd/dracut-pre-pivot.sh: remove /dev/root symlink after shell * kernel-modules: Add ehci support for kernel 3.8+ * Other bugfixes- BuildRequires: pkgconfig(systemd) so %{_unitdir} is defined and systemd integration works..- Require modutils instead of module-init-tools.- Update to release 025: + do not strip signed kernel modules + add sosreport script and generate /run/initramfs/sosreport.txt + make short uuid specification for allow-discards work + turn off RateLimit for the systemd journal + fixed MAC address assignment + add systemd checkisomd5 service + splitout drm kernel modules from plymouth module + add 'swapoff' to initramfs to fix shutdown/reboot + add team device support + add pre-shutdown hook + kill all processes in shutdown and report remaining ones + "--device" changed to "--add-device" and "add_device=" added for conf files + add memory usage trace to different hook points + cope with optional field #7 in /proc/self/mountinfo + lots of small bugfixes- dracut wants "strip" installed which is part of binutils recommend that package- Added additional patches to make dracut work in an openSUSE environment. - Added patch (use_all_paths_udev.patch) to use both /usr/lib/udev and /lib/udev as long as not all packages migrated. - Added patch (use_initrd_insteadof_initramfs.patch) to change the naming of the generated initrd file to be more openSUSE - Added patch (use_sysconfig_values_correctly.patch) to read the correct keymap value from /etc/sysconfig. (.gz extension)- Update to release 024: + new dracut option "--device" + new dracut kernel command line options "rd.auto" + new dracut kernel command line options "rd.noverifyssl" + new dracut option "--kernel-cmdline" and "kernel_cmdline" option for default parameters + fixes for systemd and crypto + fix for kexec in shutdown, if not included in initramfs + create the initramfs non-world readable + prelink/preunlink in the initramfs + strip binaries in the initramfs by default now + various FIPS fixes + various dracut-install fixes - Added patch (correct-paths-for-opensuse.patch) to ensure correct paths for openSUSE (Plymouth)- Add initramfs-non-world-readable.patch: fix CVE-2012-4453 (bnc#782734).- Update to release 023: + resume from hibernate fixes + -N option for --no-hostonly + support for systemd crypto handling + new dracut module "crypt-loop" + deprecate the old kernel command line options + more documentation + honor CFLAGS for dracut-install build + multipath fixes + / is mounted according to rootflags parameter but forced ro at first. Later it is remounted according to /etc/fstab + rootflags parameter and "ro"/"rw". + support for xfs / reiserfs separate journal device + new "ro_mnt" option to force ro mount of / and /usr + root on cifs support + dracut-install: fixed issue for /var/tmp containing a symlink + only lazy resolve with ldd, if the /var/tmp partition is not mounted with "noexec". + i18n: fixed inclusion of "include" keymaps - Drop dracut_makefile_cflags_pass.patch and separate-journal.patch (merged upstream)- Update to release 022: + fixed host-only kernel module bug - Changes from release 021: + fixed systemd in the initramfs (requires systemd >= 187) + dracut-install: massive speedup with /var on the same filesystem with COW copy. + dracut-install: moved to /usr/lib/dracut until it becomes a general purpose toot + new options: "rd.usrmount.ro" and "rd.skipfsck" + less mount/umount + apply "ro" on the kernel command line also to /usr + mount according to fstab, if neither "ro" or "rw" is specified + skip fsck for xfs and btrfs. remount is enough + give emergency_shell if /usr mount failed + dracut now uses getopt: - options can be position independent now!! - we can now use --option= + added option "--kver=", and the image location can be omitted : dracut --kver 3.5.0-0.rc7.git1.2.fc18.x86_64 + dracut.sh: for --include copy also the symbolic links + man pages: lsinitrd and mkinitrd added + network: We do not support renaming in the kernel namespace anymore (as udev does that not anymore). So, if a user wants to use ifname, he has to rename to a custom namespace. "eth[0-9]+" is not allowed anymore. + resume: moved the resume process to the initqueue. This should prevent accidently mounting the root file system. + improve running testsuite - Clean up package to be openSUSE only package and follow openSUSE standard. - Add dracut module to convert openSUSE/SLE initrd cmdline parameters into dracut parameters at boot time. - Add separate-journal.patch: add support for separate journal for reiserfs and XFS.- First check in of version 020 - Fix Makefile so that make -e CFLAGS="$RPM_OPT_FLAGS" can be passed - Remove Requires on libcap - some more changes, most sent mainline/bin/sh/bin/shsheep13 1432050965 037-49.1.8562.0.PTF.916376037-49.1.8562.0.PTF.916376037-49.1.8562.0.PTF.91637640-fips.conf01fipsfips-boot.shfips-noboot.shfips.shmodule-setup.sh02fips-aesnimodule-setup.shdracut-fipsCOPYING/etc/dracut.conf.d//usr/lib/dracut/modules.d//usr/lib/dracut/modules.d/01fips//usr/lib/dracut/modules.d/02fips-aesni//usr/share/doc/packages//usr/share/doc/packages/dracut-fips/-fmessage-length=0 -grecord-gcc-switches -fstack-protector -O2 -Wall -D_FORTIFY_SOURCE=2 -funwind-tables -fasynchronous-unwind-tables -gobs://build.suse.de/PTF:8562/SUSE_Updates_SLE-SERVER_12_x86_64/09a92b0849d0f59135bacbb3cb09920c-dracut.SUSE_SLE-12_Updatecpiolzma5x86_64-suse-linuxASCII textdirectoryPOSIX shell script, ASCII text executableBourne-Again shell script, ASCII text executablePascal source, ASCII textRRRRRl\$PVOc if test -x /usr/lib/module-init-tools/regenerate-initrd-posttrans; then /bin/bash -${-/e/} /usr/lib/module-init-tools/regenerate-initrd-posttrans fi/bin/sh?] crv(vX0F͓+1б!{JZn9 "jyi9Mz"ԙ%m~ >̇"ӽ8읖])g3vlJVePs(OqL?>Q"h\!3gKr4wuc׏2vo WqX'D*Y|7_? sLwI$ CmI/KwbN忕7[BfBI\ZT@`HPa蒍$cV y+Լ+kQ1*'f(c7b%?PӃdBGf/*+UQ7X=:18߲dfmA u0Y UH|LHN&iXI7 Fֆa6 V7/6]rނ!NTNa&`Jk~(2wq*Jq9*8fM[V0I2GUE:+n9C[!Y]02K_U 7>>B: (u.I{& yvt* SZ+0УYSH=22SXfXO*JOC oՃNZ5A~U0mƫz9Uh hh< `͕~+1 MeL݅<绻9a>1‰$t zTP&Ķ! |mCHo]*I֒\G -$%M`b +3ɸ%NW%Hp8)'U[c[V"LTInh?DU)ꚂAl gACi7ul;[qFqy].j w \-]0&]3rsx>AtG=,3 e+>\,?H~[xk/nAˋ c'xV K, W!,:&KGbmnDpҷ4].B1@s#K^x4wŔSJv7<#e2,PY9Q Qذɳ2ۊm ]}ӿ yfn9TO|Uc~k @iPn0UDѼq<6ADwAxhV@홯(SR)d\+H7(;QNSft"Ϭ֋  w?QQQ6w&MiYkd[zLSeȭeScꡥW'DYC.Z;RailDSNIO+ 3,^#(Xi,Tu1M^A>߈3zVT8+-Ҥ|z;ea I򿣓vnKaDAV'~}13Xz$w_DJiGxWZ0 &Q !pї|dg%M[x|QHmW  ֓YSTlV]? A\B-҇ Ѝ j=vP5b) bL 7U:9H@+t _f@#D䵉ab[m ȗ&u \KG@Hŵ N2K \BL B[$ eFkX+llTvO>[ďֲ ?[yVv: Bf2LBQۺKalGc"DqT =-&?:TE hǶ%I!y}]+a*4GimyNGV*2Y&`U/ (k /)Ud𼨑PQDs3 '`mT ?ꀬ* o%%l:FB1,2/:0b,t1QCT^ȅE$jw<#]?*p(c$m h` < :4HحT3sALDC)IGN]IDmwTsX ,wDE cÜ6ˤ-KZ[A gf{3dWeb@%)^I?A3zZD G'恆Dua}|"y$ hcA/QL-ڔ$'O0W}+v(q{3hB87.dedtbN$oydMX@F{LBmJt\uc8y|iQKU^)pꩴ2o 4DkmEukN/SECi3NGJ?Xj.?AhaA>UIlZdʭ5OmBA4bmca;,.2>DU̙ſ~SG'T'ш:Z %>ynmF7,PQcÌOXotJЖZX³eHIyFϽ㻅YטL+. z67ŵҍ(0U&;S.*zY:mM%oG5(a >0VBDUu,9] Vaܬ+*rm{@9ꮤ\{6ކ&*1U;볬3$e:7\L{Zt ZHq(A{ \ֹE<]ʻIFDMNTlއ0d}|J\ 1dO M$Fg%؅c*;`;p0rs&Σ%!;o2-3a] t>tiWS;|}%YCmr!*7tģ3f+/baqj~I/(b+0 ):1"98/7pT\VnJ6щFplKۡ bnu7zUslF1PK+xJ6"꒨3\d}:R-Elpb.^ܓh wcu%Ay8̫V;-u=GWv3t? /b}P3o9EDVƨI IU6A?+Q:`+@0'ʃR!m E˯׭1DXda3A 0)Kő:(z/Uwt Zȩ-)O~';$ROF }Lkyt cIQĮg'7<@Y^1e(mIvJƯ 2;t1c3H<1W(5Ңx &Ģn>!!p-иaJEvDQ޸wyO)~H-L(q4L&b:_Ñ=kS,:6Z^{wOKRD "&?ѫfZhO9]'`t"O_8DŶW*{'9 HP?@5驻7 ++UxYwj[DƕկafN2"O`ۉoAsƙs} t+3pna0DCa ΤAcٝ<ȍ5X0pUڢ$ vvY4WN\!* a~BFksbнvWoNFQ1Sw/l zUٿ3LUD:MP١d*7dxfo:)Z`_9'c) zVpF,g\*8r@a6v^6 Lꂹ if4!^3)-\[caid3=H6ZI!:.m%FClGsIWJ6pٚP5&8 L'^&UΣY3639Po}s Qw|!/7E`%#f&C3`mﴇsnOj>^@A_ ][D ߩ_KT$Oq!=pjS<'y _9[ZdBf߂2f xFWI'j%8(8fhAL]{Un&HH#} y4t /TAסXNr]U˂+4D ~t@ˠGْ*Use. {ȳ&avNb #v܏#?͐ixNaBOE?W7 | ̺ol81VPK ]{zyIPսK> HH]HF8;;6M[7Hǝe:i'=zf6힡@ހMο2nzg'ń~'<_VtfJOV(Rh^W(mt)b["ܗs~h|AܓF[DYKi-e JKh 9W@@4S*2̗qnIH@HJtIlJvt;,F֦mLNQA sJ`CT\AَJO3M@8%ŠtX1d3na8c]Dsys7۳6SoU(:݉P3OQ6~!oGA4$lzrdCĮj_.P|mEHLrA OA~&Hr\"mX'l>o.UN~Tpqd)oU+! )a.^V>eʲɸA>䵊 ftI2!Z*烈JKA 7ܶ0CzO;6&bA@f(&'|m⹀ê`Nʃ0y 'z<@VsʿEg鋙BJW/"znDٜqtA1s'#VHb 맗ցD Hieܱ6m;1(ǔv~BfG~ʌsq{)dLPOXV6O.;_if{}vˌ]z,Uh\2B*Mc&rogdUFRMJ3 L A=Y݂US1A%FdBFchcɝ;!!8$bqn׮e>H#w/gYyL ۜ $lq$/9(KA*56u.>u\?jQEA3 E p$/R1'FDUA')]Ƙ _vs gGk\:n,Z֕˭,>Ǽ ["79C;ޚC i4j 0aVobQ:Y*)AsC &s Cxnc*^SGq[*T%aT#t$ n^s86)+H2bSZW}b2yo;T ~Qjo!-Q MÑJ( wzmՋ] `4;ca MgR5')И zk @9Z} W4&2)L* DLq+h,y+?ffA(*+(_?J}@i#5&ah:M{@S O=@f?LZMfX1.6](iu&Ov;kk )$B4%cDco9}HrGK)75eO3Kde :(!s XP%oX3q62@T!WᎦ3sCdn"Me6s3(-Bےd_iqdM2e{QcFiʊ.^EqCv⮬ f; )ꮚVs:jS>%"Zuώvjǫ<4ԀsgbWhz@~} ןwtvNÑ^L|qDcÀ{`72qQ7r070701000F0032000041ED000000000000000000000007556432B600000000000000FD0000000000000000000000000000002200000000linux/suse/x86_64-sles12/inst-sys070701000F003E000041ED000000000000000000000003556432B600000000000000FD0000000000000000000000000000002700000000linux/suse/x86_64-sles12/inst-sys/boot070701000F003F000041ED000000000000000000000002555B5D0D00000000000000FD0000000000000000000000000000002E00000000linux/suse/x86_64-sles12/inst-sys/boot/dracut070701000F01E9000041ED000000000000000000000004556432B600000000000000FD0000000000000000000000000000002600000000linux/suse/x86_64-sles12/inst-sys/var070701000F01EA000041ED000000000000000000000004556432B600000000000000FD0000000000000000000000000000002A00000000linux/suse/x86_64-sles12/inst-sys/var/lib070701000F01EB000041ED000000000000000000000003556432B600000000000000FD0000000000000000000000000000003100000000linux/suse/x86_64-sles12/inst-sys/var/lib/dracut070701000F01EC000041ED000000000000000000000002555B5D0D00000000000000FD0000000000000000000000000000003900000000linux/suse/x86_64-sles12/inst-sys/var/lib/dracut/overlay070701000F02E1000041ED000000000000000000000003556432B600000000000000FD0000000000000000000000000000003000000000linux/suse/x86_64-sles12/inst-sys/var/lib/YaST2070701000F02E2000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000003600000000linux/suse/x86_64-sles12/inst-sys/var/lib/YaST2/hooks070701000F02E3000081A4000000000000000000000001541A7B1F000001AD000000FD0000000000000000000000000000004000000000linux/suse/x86_64-sles12/inst-sys/var/lib/YaST2/hooks/README.md# Default hook search path This is the default directory used by yast for searching hook scripts if not specified otherwise by the documentation for a particular workflow using the hooks feature. More information is to be found in the main readme file for hooks in `/usr/share/doc/packages/yast2/Hooks.md` If you are going to make use of the installation hooks, please put you scripts into the subdirectory `installation`. 070701000F02DE000041ED000000000000000000000003556432B600000000000000FD0000000000000000000000000000002A00000000linux/suse/x86_64-sles12/inst-sys/var/adm070701000F02DF000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000003B00000000linux/suse/x86_64-sles12/inst-sys/var/adm/fillup-templates070701000F02E0000081A4000000000000000000000001541A7B1F00000E92000000FD0000000000000000000000000000004B00000000linux/suse/x86_64-sles12/inst-sys/var/adm/fillup-templates/sysconfig.yast2# Tweakable settings for the 'yast2' script. # to over-ride these settins per-user create a # ~/.yast2/yast2 file. ## Path: System/Yast2/GUI ## Description: Default UI for YaST ## Type: list(auto,qt,gtk) ## Default: "auto" # Default control center for YaST # selects the control-center implementation to be used # to render yast widgets # auto: will attempt to detect both desktop & plugin # presence and adapt accordingly WANTED_SHELL="auto" ## Type: list(auto,qt,gtk,ncurses) ## Default: "auto" # Default UI backend for YaST # selects the GUI plugin to be used to render yast widgets # auto: will attempt to detect both desktop & plugin # presence and adapt accordingly, falling back to # qt rendering if gtk is not present WANTED_GUI="auto" ## Type: string(linux,xterm,rxvt,mono,inverted,highcontrast,braille) ## Default: "" # Color theme for YaST ncurses UI # xterm: blue-white-red # linux: blue-white-yellow # rxvt: black-yellow-red # mono: white-black # inverted: black-white # highcontrast: lightgrey-black # braille: for visually impaired Y2NCURSES_COLOR_THEME="" ## Type: list(yes,no) ## Default: "no" # Enable tracking of configuraiton changes in subversion repository # This is EXPERIMENTAL and not all YaST modules do support it. # Use at your own risk STORE_CONFIG_IN_SUBVERSION="no" ## Type: list(yes,no) ## Default: "no" # Track all changes in all files in configuration directory # If set to "no", YaST adds to the repository only files it changes # itself and the first change of a particular configuration file # gets lost (it can only be manually compared to the one in # configuration file). # If set to "yes", all files in the configuration directory # are tracked in the subversion repository. This has big impact # on start-up and finish times of YaST modules # This option is experimental and not all YaST modules do support # configuration tracking via subversion SUBVERSION_ADD_DIRS_RECURSIVE="no" ## Type: list(close,restart,summary) ## Default: "summary" # Set the default behavior of the package manager when package installation has finished. # Possible actions are: # close - just finish the package manager # restart - go back to the package manager, install/remove more packages # summary - display an installation summary dialog, there user can decide whether to finish or restart # The summary dialog is always displayed when an installation error has occured. PKGMGR_ACTION_AT_EXIT="summary" ## Type: list(yes,no) ## Default: "yes" # # By default the package dependencies are checked on every action (installation/update/removal) # done in the package selector and possible conflicts are shown immediately. # Set the value to "no" if you want the dependency check only onces before starting the # package installation/update/removal. PKGMGR_AUTO_CHECK="yes" ## Type: list(yes,no) ## Default: "no" # # The default is "no", i.e. the package dependencies of already installed package are # not checked when installing a package (only the dependencies of the new package). # Set this option to "yes" if you want to verify your system (check the dependencies of # all already installed packages). PKGMGR_VERIFY_SYSTEM="no" ## Type: list(yes,no) ## Default: "no" # # By default the recommended packages for already installed packages are not taken into # account, i.e. they are not automatically selected for installation. # Set this option to "yes" if you want to reevaluate which packages are recommended, e.g. to # get the language dependent packages for an additional language or hardware related packages # if the hardware has changed. PKGMGR_REEVALUATE_RECOMMENDED="no" ## Type: list(yes,no) ## Default: "no" # Enable use of snapper for YaST. USE_SNAPPER="no" 070701000F003D000081A4000000000000000000000001556432B6000000B6000000FD0000000000000000000000000000004F00000000linux/suse/x86_64-sles12/inst-sys/.update.f39b5d9c-5bdd-42d9-a15e-e00c32628c7bdracut-037-49.1.8562.0.PTF.916376.x86_64 dracut-fips-037-49.1.8562.0.PTF.916376.x86_64 yast2-3.1.108-1.16.8535.7.PTF.916376.x86_64 yast2-network-3.1.108-1.2.8555.0.PTF.916376.x86_64 070701000F0051000041ED000000000000000000000006556432B600000000000000FD0000000000000000000000000000002600000000linux/suse/x86_64-sles12/inst-sys/usr070701000F0057000041ED000000000000000000000006556432B600000000000000FD0000000000000000000000000000002A00000000linux/suse/x86_64-sles12/inst-sys/usr/lib070701000F0058000041ED000000000000000000000003556432B600000000000000FD0000000000000000000000000000003100000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut070701000F005E000081ED000000000000000000000001555B5D0C0000348B000000FD0000000000000000000000000000004200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/dracut-logger.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 et filetype=sh # # logging faciality module for dracut both at build- and boot-time # # Copyright 2010 Amadeusz Żołnowski # # 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; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . __DRACUT_LOGGER__=1 ## @brief Logging facility module for dracut both at build- and boot-time. # # @section intro Introduction # # The logger takes a bit from Log4j philosophy. There are defined 6 logging # levels: # - TRACE (6) # The TRACE Level designates finer-grained informational events than the # DEBUG. # - DEBUG (5) # The DEBUG Level designates fine-grained informational events that are most # useful to debug an application. # - INFO (4) # The INFO level designates informational messages that highlight the # progress of the application at coarse-grained level. # - WARN (3) # The WARN level designates potentially harmful situations. # - ERROR (2) # The ERROR level designates error events that might still allow the # application to continue running. # - FATAL (1) # The FATAL level designates very severe error events that will presumably # lead the application to abort. # Descriptions are borrowed from Log4j documentation: # http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/Level.html # # @section usage Usage # # First of all you have to start with dlog_init() function which initializes # required variables. Don't call any other logging function before that one! # If you're ready with this, you can use following functions which corresponds # clearly to levels listed in @ref intro Introduction. Here they are: # - dtrace() # - ddebug() # - dinfo() # - dwarn() # - derror() # - dfatal() # They take all arguments given as a single message to be logged. See dlog() # function for details how it works. Note that you shouldn't use dlog() by # yourself. It's wrapped with above functions. # # @see dlog_init() dlog() # # @section conf Configuration # # Logging is controlled by following global variables: # - @var stdloglvl - logging level to standard error (console output) # - @var sysloglvl - logging level to syslog (by logger command) # - @var fileloglvl - logging level to file # - @var kmsgloglvl - logging level to /dev/kmsg (only for boot-time) # - @var logfile - log file which is used when @var fileloglvl is higher # than 0 # and two global variables: @var maxloglvl and @var syslogfacility which must # not be overwritten. Both are set by dlog_init(). @var maxloglvl holds # maximum logging level of those three and indicates that dlog_init() was run. # @var syslogfacility is set either to 'user' (when building initramfs) or # 'daemon' (when booting). # # Logging level set by the variable means that messages from this logging level # and above (FATAL is the highest) will be shown. Logging levels may be set # independently for each destination (stderr, syslog, file, kmsg). # # @see dlog_init() ## @brief Initializes dracut Logger. # # @retval 1 if something has gone wrong # @retval 0 on success. # # @note This function need to be called before any other from this file. # # If any of the variables is not set, this function set it to default: # - @var stdloglvl = 4 (info) # - @var sysloglvl = 0 (no logging) # - @var fileloglvl is set to 4 when @var logfile is set too, otherwise it's # - @var kmsgloglvl = 0 (no logging) # set to 0 # # @warning Function sets global variables @var maxloglvl and @syslogfacility. # See file doc comment for details. dlog_init() { local __oldumask local ret=0; local errmsg [ -z "$stdloglvl" ] && stdloglvl=4 [ -z "$sysloglvl" ] && sysloglvl=0 [ -z "$kmsgloglvl" ] && kmsgloglvl=0 # Skip initialization if it's already done. [ -n "$maxloglvl" ] && return 0 if [ -z "$fileloglvl" ]; then [ -w "$logfile" ] && fileloglvl=4 || fileloglvl=0 elif (( $fileloglvl > 0 )); then if [[ $logfile ]]; then __oldumask=$(umask) umask 0377 ! [ -e "$logfile" ] && >"$logfile" umask $__oldumask if [ -w "$logfile" -a -f "$logfile" ]; then # Mark new run in the log file echo >>"$logfile" if command -v date >/dev/null; then echo "=== $(date) ===" >>"$logfile" else echo "===============================================" >>"$logfile" fi echo >>"$logfile" else # We cannot log to file, so turn this facility off. fileloglvl=0 ret=1 errmsg="'$logfile' is not a writable file" fi fi fi if (( $UID != 0 )); then kmsgloglvl=0 sysloglvl=0 fi if (( $sysloglvl > 0 )); then if [[ -d /run/systemd/journal ]] \ && type -P systemd-cat &>/dev/null \ && systemctl --quiet is-active systemd-journald.socket &>/dev/null \ && { echo "dracut-$DRACUT_VERSION" | systemd-cat -t 'dracut' &>/dev/null; } ; then readonly _dlogdir="$(mktemp --tmpdir="$TMPDIR/" -d -t dracut-log.XXXXXX)" readonly _systemdcatfile="$_dlogdir/systemd-cat" mkfifo "$_systemdcatfile" readonly _dlogfd=15 systemd-cat -t 'dracut' --level-prefix=true <"$_systemdcatfile" & exec 15>"$_systemdcatfile" elif ! [ -S /dev/log -a -w /dev/log ] || ! command -v logger >/dev/null; then # We cannot log to syslog, so turn this facility off. kmsgloglvl=$sysloglvl sysloglvl=0 ret=1 errmsg="No '/dev/log' or 'logger' included for syslog logging" fi fi if (($sysloglvl > 0)) || (($kmsgloglvl > 0 )); then if [ -n "$dracutbasedir" ]; then readonly syslogfacility=user else readonly syslogfacility=daemon fi export syslogfacility fi local lvl; local maxloglvl_l=0 for lvl in $stdloglvl $sysloglvl $fileloglvl $kmsgloglvl; do (( $lvl > $maxloglvl_l )) && maxloglvl_l=$lvl done readonly maxloglvl=$maxloglvl_l export maxloglvl if (($stdloglvl < 6)) && (($kmsgloglvl < 6)) && (($fileloglvl < 6)) && (($sysloglvl < 6)); then unset dtrace dtrace() { :; }; fi if (($stdloglvl < 5)) && (($kmsgloglvl < 5)) && (($fileloglvl < 5)) && (($sysloglvl < 5)); then unset ddebug ddebug() { :; }; fi if (($stdloglvl < 4)) && (($kmsgloglvl < 4)) && (($fileloglvl < 4)) && (($sysloglvl < 4)); then unset dinfo dinfo() { :; }; fi if (($stdloglvl < 3)) && (($kmsgloglvl < 3)) && (($fileloglvl < 3)) && (($sysloglvl < 3)); then unset dwarn dwarn() { :; }; unset dwarning dwarning() { :; }; fi if (($stdloglvl < 2)) && (($kmsgloglvl < 2)) && (($fileloglvl < 2)) && (($sysloglvl < 2)); then unset derror derror() { :; }; fi if (($stdloglvl < 1)) && (($kmsgloglvl < 1)) && (($fileloglvl < 1)) && (($sysloglvl < 1)); then unset dfatal dfatal() { :; }; fi [ -n "$errmsg" ] && derror "$errmsg" return $ret } ## @brief Converts numeric logging level to the first letter of level name. # # @param lvl Numeric logging level in range from 1 to 6. # @retval 1 if @a lvl is out of range. # @retval 0 if @a lvl is correct. # @result Echoes first letter of level name. _lvl2char() { case "$1" in 1) echo F;; 2) echo E;; 3) echo W;; 4) echo I;; 5) echo D;; 6) echo T;; *) return 1;; esac } ## @brief Converts numeric level to logger priority defined by POSIX.2. # # @param lvl Numeric logging level in range from 1 to 6. # @retval 1 if @a lvl is out of range. # @retval 0 if @a lvl is correct. # @result Echoes logger priority. _lvl2syspri() { printf $syslogfacility. case "$1" in 1) echo crit;; 2) echo error;; 3) echo warning;; 4) echo info;; 5) echo debug;; 6) echo debug;; *) return 1;; esac } ## @brief Converts dracut-logger numeric level to syslog log level # # @param lvl Numeric logging level in range from 1 to 6. # @retval 1 if @a lvl is out of range. # @retval 0 if @a lvl is correct. # @result Echoes kernel console numeric log level # # Conversion is done as follows: # # # FATAL(1) -> LOG_EMERG (0) # none -> LOG_ALERT (1) # none -> LOG_CRIT (2) # ERROR(2) -> LOG_ERR (3) # WARN(3) -> LOG_WARNING (4) # none -> LOG_NOTICE (5) # INFO(4) -> LOG_INFO (6) # DEBUG(5) -> LOG_DEBUG (7) # TRACE(6) / # # # @see /usr/include/sys/syslog.h _dlvl2syslvl() { local lvl case "$1" in 1) lvl=0;; 2) lvl=3;; 3) lvl=4;; 4) lvl=6;; 5) lvl=7;; 6) lvl=7;; *) return 1;; esac [ "$syslogfacility" = user ] && echo $((8+$lvl)) || echo $((24+$lvl)) } ## @brief Prints to stderr and/or writes to file, to syslog and/or /dev/kmsg # given message with given level (priority). # # @param lvl Numeric logging level. # @param msg Message. # @retval 0 It's always returned, even if logging failed. # # @note This function is not supposed to be called manually. Please use # dtrace(), ddebug(), or others instead which wrap this one. # # This is core logging function which logs given message to standard error, file # and/or syslog (with POSIX shell command logger) and/or to /dev/kmsg. # The format is following: # # X: some message # # where @c X is the first letter of logging level. See module description for # details on that. # # Message to syslog is sent with tag @c dracut. Priorities are mapped as # following: # - @c FATAL to @c crit # - @c ERROR to @c error # - @c WARN to @c warning # - @c INFO to @c info # - @c DEBUG and @c TRACE both to @c debug _do_dlog() { local lvl="$1"; shift local lvlc=$(_lvl2char "$lvl") || return 0 local msg="$*" local lmsg="$lvlc: $*" (( $lvl <= $stdloglvl )) && echo "$msg" >&2 if (( $lvl <= $sysloglvl )); then if [[ "$_dlogfd" ]]; then printf -- "<%s>%s\n" "$(($(_dlvl2syslvl $lvl) & 7))" "$msg" >&$_dlogfd else logger -t "dracut[$$]" -p $(_lvl2syspri $lvl) -- "$msg" fi fi if (( $lvl <= $fileloglvl )) && [[ -w "$logfile" ]] && [[ -f "$logfile" ]]; then echo "$lmsg" >>"$logfile" fi (( $lvl <= $kmsgloglvl )) && \ echo "<$(_dlvl2syslvl $lvl)>dracut[$$] $msg" >/dev/kmsg } ## @brief Internal helper function for _do_dlog() # # @param lvl Numeric logging level. # @param msg Message. # @retval 0 It's always returned, even if logging failed. # # @note This function is not supposed to be called manually. Please use # dtrace(), ddebug(), or others instead which wrap this one. # # This function calls _do_dlog() either with parameter msg, or if # none is given, it will read standard input and will use every line as # a message. # # This enables: # dwarn "This is a warning" # echo "This is a warning" | dwarn dlog() { [ -z "$maxloglvl" ] && return 0 (( $1 <= $maxloglvl )) || return 0 if (( $# > 1 )); then _do_dlog "$@" else while read line; do _do_dlog "$1" "$line" done fi } ## @brief Logs message at TRACE level (6) # # @param msg Message. # @retval 0 It's always returned, even if logging failed. dtrace() { set +x dlog 6 "$@" [ -n "$debug" ] && set -x || : } ## @brief Logs message at DEBUG level (5) # # @param msg Message. # @retval 0 It's always returned, even if logging failed. ddebug() { set +x dlog 5 "$@" [ -n "$debug" ] && set -x || : } ## @brief Logs message at INFO level (4) # # @param msg Message. # @retval 0 It's always returned, even if logging failed. dinfo() { set +x dlog 4 "$@" [ -n "$debug" ] && set -x || : } ## @brief Logs message at WARN level (3) # # @param msg Message. # @retval 0 It's always returned, even if logging failed. dwarn() { set +x dlog 3 "$@" [ -n "$debug" ] && set -x || : } ## @brief It's an alias to dwarn() function. # # @param msg Message. # @retval 0 It's always returned, even if logging failed. dwarning() { set +x dwarn "$@" [ -n "$debug" ] && set -x || : } ## @brief Logs message at ERROR level (2) # # @param msg Message. # @retval 0 It's always returned, even if logging failed. derror() { set +x dlog 2 "$@" [ -n "$debug" ] && set -x || : } ## @brief Logs message at FATAL level (1) # # @param msg Message. # @retval 0 It's always returned, even if logging failed. dfatal() { set +x dlog 1 "$@" [ -n "$debug" ] && set -x || : } 070701000F005B000081ED000000000000000000000001555B5D0C0000DC16000000FD0000000000000000000000000000004500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/dracut-functions.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # # functions used by dracut and other tools. # # Copyright 2005-2009 Red Hat, Inc. 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; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # export LC_MESSAGES=C if [[ $DRACUT_KERNEL_LAZY ]] && ! [[ $DRACUT_KERNEL_LAZY_HASHDIR ]]; then if ! [[ -d "$initdir/.kernelmodseen" ]]; then mkdir -p "$initdir/.kernelmodseen" fi DRACUT_KERNEL_LAZY_HASHDIR="$initdir/.kernelmodseen" fi if [[ $initdir ]] && ! [[ -d $initdir ]]; then mkdir -p "$initdir" fi # Generic substring function. If $2 is in $1, return 0. strstr() { [[ $1 = *"$2"* ]]; } # Generic glob matching function. If glob pattern $2 matches anywhere in $1, OK strglobin() { [[ $1 = *$2* ]]; } # Generic glob matching function. If glob pattern $2 matches all of $1, OK strglob() { [[ $1 = $2 ]]; } # helper function for check() in module-setup.sh # to check for required installed binaries # issues a standardized warning message require_binaries() { local _module_name="${moddir##*/}" local _ret=0 if [[ "$1" = "-m" ]]; then _module_name="$2" shift 2 fi for cmd in "$@"; do if ! find_binary "$cmd" &>/dev/null; then dinfo "dracut module '${_module_name#[0-9][0-9]}' will not be installed, because command '$cmd' could not be found!" ((_ret++)) fi done return $_ret } require_any_binary() { local _module_name="${moddir##*/}" local _ret=1 if [[ "$1" = "-m" ]]; then _module_name="$2" shift 2 fi for cmd in "$@"; do if find_binary "$cmd" &>/dev/null; then _ret=0 break fi done if (( $_ret != 0 )); then dinfo "$_module_name: Could not find any command of '$@'!" return 1 fi return 0 } # find a binary. If we were not passed the full path directly, # search in the usual places to find the binary. find_binary() { if [[ -z ${1##/*} ]]; then if [[ -x $1 ]] || { [[ "$1" == *.so* ]] && ldd "$1" &>/dev/null; }; then printf "%s\n" "$1" return 0 fi fi type -P "${1##*/}" } if ! [[ $dracutbasedir ]]; then dracutbasedir=${BASH_SOURCE[0]%/*} [[ $dracutbasedir = "dracut-functions" ]] && dracutbasedir="." [[ $dracutbasedir ]] || dracutbasedir="." dracutbasedir="$(readlink -f $dracutbasedir)" fi ldconfig_paths() { local a i declare -A a for i in $( ldconfig -pN 2>/dev/null | while read a b c d; do [[ "$c" != "=>" ]] && continue printf "%s\n" ${d%/*}; done ); do [[ "$i" = "/lib" || "$i" = "/usr/lib" || "$i" = "/lib64" || "$i" = "/usr/lib64" ]] && continue a["$i"]=1; done; printf "%s\n" ${!a[@]} } # Detect lib paths if ! [[ $libdirs ]] ; then if [[ "$(ldd /bin/sh)" == */lib64/* ]] &>/dev/null \ && [[ -d /lib64 ]]; then libdirs+=" /lib64" [[ -d /usr/lib64 ]] && libdirs+=" /usr/lib64" else libdirs+=" /lib" [[ -d /usr/lib ]] && libdirs+=" /usr/lib" fi libdirs+=" $(ldconfig_paths)" export libdirs fi if ! [[ $kernel ]]; then kernel=$(uname -r) export kernel fi # Version comparision function. Assumes Linux style version scheme. # $1 = version a # $2 = comparision op (gt, ge, eq, le, lt, ne) # $3 = version b vercmp() { local _n1=(${1//./ }) _op=$2 _n2=(${3//./ }) _i _res for ((_i=0; ; _i++)) do if [[ ! ${_n1[_i]}${_n2[_i]} ]]; then _res=0 elif ((${_n1[_i]:-0} > ${_n2[_i]:-0})); then _res=1 elif ((${_n1[_i]:-0} < ${_n2[_i]:-0})); then _res=2 else continue fi break done case $_op in gt) ((_res == 1));; ge) ((_res != 2));; eq) ((_res == 0));; le) ((_res != 1));; lt) ((_res == 2));; ne) ((_res != 0));; esac } srcmods="/lib/modules/$kernel/" [[ $drivers_dir ]] && { if ! command -v kmod &>/dev/null && vercmp "$(modprobe --version | cut -d' ' -f3)" lt 3.7; then dfatal 'To use --kmoddir option module-init-tools >= 3.7 is required.' exit 1 fi srcmods="$drivers_dir" } export srcmods if ! type dinfo >/dev/null 2>&1; then . "$dracutbasedir/dracut-logger.sh" dlog_init fi if ! [[ $initdir ]]; then dfatal "initdir not set" exit 1 fi # export standard hookdirs [[ $hookdirs ]] || { hookdirs="cmdline pre-udev pre-trigger netroot " hookdirs+="initqueue initqueue/settled initqueue/online initqueue/finished initqueue/timeout " hookdirs+="pre-mount pre-pivot cleanup mount " hookdirs+="emergency shutdown-emergency pre-shutdown shutdown " export hookdirs } dracut_need_initqueue() { >"$initdir/lib/dracut/need-initqueue" } dracut_module_included() { [[ " $mods_to_load $modules_loaded " == *\ $*\ * ]] } # Create all subdirectories for given path without creating the last element. # $1 = path mksubdirs() { [[ -e ${1%/*} ]] || mkdir -m 0755 -p -- "${1%/*}" } # is_func # Check whether $1 is a function. is_func() { [[ "$(type -t "$1")" = "function" ]] } # Function prints global variables in format name=value line by line. # $@ = list of global variables' name print_vars() { local _var _value for _var in "$@" do eval printf -v _value "%s" \""\$$_var"\" [[ ${_value} ]] && printf '%s="%s"\n' "$_var" "$_value" done } # normalize_path # Prints the normalized path, where it removes any duplicated # and trailing slashes. # Example: # $ normalize_path ///test/test// # /test/test normalize_path() { shopt -q -s extglob set -- "${1//+(\/)//}" shopt -q -u extglob printf "%s\n" "${1%/}" } # convert_abs_rel # Prints the relative path, when creating a symlink to from . # Example: # $ convert_abs_rel /usr/bin/test /bin/test-2 # ../../bin/test-2 # $ ln -s $(convert_abs_rel /usr/bin/test /bin/test-2) /usr/bin/test convert_abs_rel() { local __current __absolute __abssize __cursize __newpath local -i __i __level set -- "$(normalize_path "$1")" "$(normalize_path "$2")" # corner case #1 - self looping link [[ "$1" == "$2" ]] && { printf "%s\n" "${1##*/}"; return; } # corner case #2 - own dir link [[ "${1%/*}" == "$2" ]] && { printf ".\n"; return; } IFS="/" __current=($1) IFS="/" __absolute=($2) __abssize=${#__absolute[@]} __cursize=${#__current[@]} while [[ "${__absolute[__level]}" == "${__current[__level]}" ]] do (( __level++ )) if (( __level > __abssize || __level > __cursize )) then break fi done for ((__i = __level; __i < __cursize-1; __i++)) do if ((__i > __level)) then __newpath=$__newpath"/" fi __newpath=$__newpath".." done for ((__i = __level; __i < __abssize; __i++)) do if [[ -n $__newpath ]] then __newpath=$__newpath"/" fi __newpath=$__newpath${__absolute[__i]} done printf "%s\n" "$__newpath" } if [[ "$(ln --help)" == *--relative* ]]; then ln_r() { ln -sfnr "${initdir}/$1" "${initdir}/$2" } else ln_r() { local _source=$1 local _dest=$2 [[ -d "${_dest%/*}" ]] && _dest=$(readlink -f "${_dest%/*}")/${_dest##*/} ln -sfn -- "$(convert_abs_rel "${_dest}" "${_source}")" "${initdir}/${_dest}" } fi # get_fs_env # Get and the ID_FS_TYPE variable from udev for a device. # Example: # $ get_fs_env /dev/sda2 # ext4 get_fs_env() { local evalstr local found [[ $1 ]] || return unset ID_FS_TYPE ID_FS_TYPE=$(blkid -u filesystem -o export -- "$1" \ | while read line; do if [[ "$line" == TYPE\=* ]]; then printf "%s" "${line#TYPE=}"; exit 0; fi done) if [[ $ID_FS_TYPE ]]; then printf "%s" "$ID_FS_TYPE" return 0 fi return 1 } # get_maj_min # Prints the major and minor of a device node. # Example: # $ get_maj_min /dev/sda2 # 8:2 get_maj_min() { local _maj _min _majmin _majmin="$(stat -L -c '%t:%T' "$1" 2>/dev/null)" printf "%s" "$((0x${_majmin%:*})):$((0x${_majmin#*:}))" } # get_devpath_block # get the DEVPATH in /sys of a block device get_devpath_block() { local _majmin _i _majmin=$(get_maj_min "$1") for _i in /sys/block/*/dev /sys/block/*/*/dev; do [[ -e "$_i" ]] || continue if [[ "$_majmin" == "$(<"$_i")" ]]; then printf "%s" "${_i%/dev}" return 0 fi done return 1 } # get a persistent path from a device get_persistent_dev() { local i _tmp _dev _dev=$(get_maj_min "$1") [ -z "$_dev" ] && return for i in \ /dev/mapper/* \ /dev/disk/${persistent_policy:-by-uuid}/* \ /dev/disk/by-uuid/* \ /dev/disk/by-label/* \ /dev/disk/by-partuuid/* \ /dev/disk/by-partlabel/* \ /dev/disk/by-id/* \ /dev/disk/by-path/* \ ; do [[ -e "$i" ]] || continue [[ $i == /dev/mapper/control ]] && continue [[ $i == /dev/mapper/mpath* ]] && continue _tmp=$(get_maj_min "$i") if [ "$_tmp" = "$_dev" ]; then printf -- "%s" "$i" return fi done } expand_persistent_dev() { local _dev=$1 case "$_dev" in LABEL=*) _dev="/dev/disk/by-label/${_dev#LABEL=}" ;; UUID=*) _dev="${_dev#UUID=}" _dev="${_dev,,}" _dev="/dev/disk/by-uuid/${_dev}" ;; PARTUUID=*) _dev="${_dev#PARTUUID=}" _dev="${_dev,,}" _dev="/dev/disk/by-partuuid/${_dev}" ;; PARTLABEL=*) _dev="/dev/disk/by-partlabel/${_dev#PARTLABEL=}" ;; esac printf "%s" "$_dev" } shorten_persistent_dev() { local _dev="$1" case "$_dev" in /dev/disk/by-uuid/*) printf "%s" "UUID=${_dev##*/}";; /dev/disk/by-label/*) printf "%s" "LABEL=${_dev##*/}";; /dev/disk/by-partuuid/*) printf "%s" "PARTUUID=${_dev##*/}";; /dev/disk/by-partlabel/*) printf "%s" "PARTLABEL=${_dev##*/}";; *) printf "%s" "$_dev";; esac } # find_block_device # Prints the major and minor number of the block device # for a given mountpoint. # Unless $use_fstab is set to "yes" the functions # uses /proc/self/mountinfo as the primary source of the # information and only falls back to /etc/fstab, if the mountpoint # is not found there. # Example: # $ find_block_device /usr # 8:4 find_block_device() { local _majmin _dev _majmin _find_mpt _find_mpt="$1" if [[ $use_fstab != yes ]]; then [[ -d $_find_mpt/. ]] findmnt -e -v -n -o 'MAJ:MIN,SOURCE' --target "$_find_mpt" | { \ while read _majmin _dev; do if [[ -b $_dev ]]; then if ! [[ $_majmin ]] || [[ $_majmin == 0:* ]]; then _majmin=$(get_maj_min $_dev) fi if [[ $_majmin ]]; then printf "%s\n" "$_majmin" else printf "%s\n" "$_dev" fi return 0 fi if [[ $_dev = *:* ]]; then printf "%s\n" "$_dev" return 0 fi done; return 1; } && return 0 fi # fall back to /etc/fstab findmnt -e --fstab -v -n -o 'MAJ:MIN,SOURCE' --target "$_find_mpt" | { \ while read _majmin _dev; do if ! [[ $_dev ]]; then _dev="$_majmin" unset _majmin fi if [[ -b $_dev ]]; then [[ $_majmin ]] || _majmin=$(get_maj_min $_dev) if [[ $_majmin ]]; then printf "%s\n" "$_majmin" else printf "%s\n" "$_dev" fi return 0 fi if [[ $_dev = *:* ]]; then printf "%s\n" "$_dev" return 0 fi done; return 1; } && return 0 return 1 } # find_mp_fstype # Echo the filesystem type for a given mountpoint. # /proc/self/mountinfo is taken as the primary source of information # and /etc/fstab is used as a fallback. # No newline is appended! # Example: # $ find_mp_fstype /;echo # ext4 find_mp_fstype() { local _fs if [[ $use_fstab != yes ]]; then findmnt -e -v -n -o 'FSTYPE' --target "$1" | { \ while read _fs; do [[ $_fs ]] || continue [[ $_fs = "autofs" ]] && continue printf "%s" "$_fs" return 0 done; return 1; } && return 0 fi findmnt --fstab -e -v -n -o 'FSTYPE' --target "$1" | { \ while read _fs; do [[ $_fs ]] || continue [[ $_fs = "autofs" ]] && continue printf "%s" "$_fs" return 0 done; return 1; } && return 0 return 1 } # find_dev_fstype # Echo the filesystem type for a given device. # /proc/self/mountinfo is taken as the primary source of information # and /etc/fstab is used as a fallback. # No newline is appended! # Example: # $ find_dev_fstype /dev/sda2;echo # ext4 find_dev_fstype() { local _find_dev _fs _find_dev="$1" if ! [[ "$_find_dev" = /dev* ]]; then [[ -b "/dev/block/$_find_dev" ]] && _find_dev="/dev/block/$_find_dev" fi if [[ $use_fstab != yes ]]; then findmnt -e -v -n -o 'FSTYPE' --source "$_find_dev" | { \ while read _fs; do [[ $_fs ]] || continue [[ $_fs = "autofs" ]] && continue printf "%s" "$_fs" return 0 done; return 1; } && return 0 fi findmnt --fstab -e -v -n -o 'FSTYPE' --source "$_find_dev" | { \ while read _fs; do [[ $_fs ]] || continue [[ $_fs = "autofs" ]] && continue printf "%s" "$_fs" return 0 done; return 1; } && return 0 return 1 } # find_mp_fsopts # Echo the filesystem options for a given mountpoint. # /proc/self/mountinfo is taken as the primary source of information # and /etc/fstab is used as a fallback. # No newline is appended! # Example: # $ find_mp_fsopts /;echo # rw,relatime,discard,data=ordered find_mp_fsopts() { if [[ $use_fstab != yes ]]; then findmnt -e -v -n -o 'OPTIONS' --target "$1" 2>/dev/null && return 0 fi findmnt --fstab -e -v -n -o 'OPTIONS' --target "$1" } # find_dev_fsopts # Echo the filesystem options for a given device. # /proc/self/mountinfo is taken as the primary source of information # and /etc/fstab is used as a fallback. # Example: # $ find_dev_fsopts /dev/sda2 # rw,relatime,discard,data=ordered find_dev_fsopts() { local _find_dev _opts _find_dev="$1" if ! [[ "$_find_dev" = /dev* ]]; then [[ -b "/dev/block/$_find_dev" ]] && _find_dev="/dev/block/$_find_dev" fi if [[ $use_fstab != yes ]]; then findmnt -e -v -n -o 'OPTIONS' --source "$_find_dev" 2>/dev/null && return 0 fi findmnt --fstab -e -v -n -o 'OPTIONS' --source "$_find_dev" } # finds the major:minor of the block device backing the root filesystem. find_root_block_device() { find_block_device /; } # for_each_host_dev_fs # Execute " " for every " " pair found # in ${host_fs_types[@]} for_each_host_dev_fs() { local _func="$1" local _dev local _ret=1 [[ "${!host_fs_types[@]}" ]] || return 0 for _dev in "${!host_fs_types[@]}"; do $_func "$_dev" "${host_fs_types[$_dev]}" && _ret=0 done return $_ret } host_fs_all() { printf "%s\n" "${host_fs_types[@]}" } # Walk all the slave relationships for a given block device. # Stop when our helper function returns success # $1 = function to call on every found block device # $2 = block device in major:minor format check_block_and_slaves() { local _x [[ -b /dev/block/$2 ]] || return 1 # Not a block device? So sorry. if ! lvm_internal_dev $2; then "$1" $2 && return; fi check_vol_slaves "$@" && return 0 if [[ -f /sys/dev/block/$2/../dev ]]; then check_block_and_slaves $1 $(<"/sys/dev/block/$2/../dev") && return 0 fi [[ -d /sys/dev/block/$2/slaves ]] || return 1 for _x in /sys/dev/block/$2/slaves/*/dev; do [[ -f $_x ]] || continue check_block_and_slaves $1 $(<"$_x") && return 0 done return 1 } check_block_and_slaves_all() { local _x _ret=1 [[ -b /dev/block/$2 ]] || return 1 # Not a block device? So sorry. if ! lvm_internal_dev $2 && "$1" $2; then _ret=0 fi check_vol_slaves "$@" && return 0 if [[ -f /sys/dev/block/$2/../dev ]]; then check_block_and_slaves_all $1 $(<"/sys/dev/block/$2/../dev") && _ret=0 fi [[ -d /sys/dev/block/$2/slaves ]] || return 1 for _x in /sys/dev/block/$2/slaves/*/dev; do [[ -f $_x ]] || continue check_block_and_slaves_all $1 $(<"$_x") && _ret=0 done return $_ret } # for_each_host_dev_and_slaves # Execute " " for every "" found # in ${host_devs[@]} and their slaves for_each_host_dev_and_slaves_all() { local _func="$1" local _dev local _ret=1 [[ "${host_devs[@]}" ]] || return 0 for _dev in ${host_devs[@]}; do [[ -b "$_dev" ]] || continue if check_block_and_slaves_all $_func $(get_maj_min $_dev); then _ret=0 fi done return $_ret } for_each_host_dev_and_slaves() { local _func="$1" local _dev [[ "${host_devs[@]}" ]] || return 0 for _dev in ${host_devs[@]}; do [[ -b "$_dev" ]] || continue check_block_and_slaves $_func $(get_maj_min $_dev) && return 0 done return 1 } # ugly workaround for the lvm design # There is no volume group device, # so, there are no slave devices for volume groups. # Logical volumes only have the slave devices they really live on, # but you cannot create the logical volume without the volume group. # And the volume group might be bigger than the devices the LV needs. check_vol_slaves() { local _lv _vg _pv _dm for i in /dev/mapper/*; do [[ $i == /dev/mapper/control ]] && continue _lv=$(get_maj_min $i) _dm=/sys/dev/block/$_lv/dm [[ -f $_dm/uuid && $(<$_dm/uuid) =~ LVM-* ]] || continue if [[ $_lv = $2 ]]; then _vg=$(lvm lvs --noheadings -o vg_name $i 2>/dev/null) # strip space _vg=$(printf "%s\n" "$_vg") if [[ $_vg ]]; then for _pv in $(lvm vgs --noheadings -o pv_name "$_vg" 2>/dev/null) do check_block_and_slaves $1 $(get_maj_min $_pv) && return 0 done fi fi done return 1 } # fs_get_option # search for a specific option in a bunch of filesystem options # and return the value fs_get_option() { local _fsopts=$1 local _option=$2 local OLDIFS="$IFS" IFS=, set -- $_fsopts IFS="$OLDIFS" while [ $# -gt 0 ]; do case $1 in $_option=*) echo ${1#${_option}=} break esac shift done } if ! [[ $DRACUT_INSTALL ]]; then DRACUT_INSTALL=$(find_binary dracut-install) fi if ! [[ $DRACUT_INSTALL ]] && [[ -x $dracutbasedir/dracut-install ]]; then DRACUT_INSTALL=$dracutbasedir/dracut-install fi if ! [[ -x $DRACUT_INSTALL ]]; then dfatal "dracut-install not found!" exit 10 fi [[ $DRACUT_RESOLVE_LAZY ]] || export DRACUT_RESOLVE_DEPS=1 inst_dir() { [[ -e ${initdir}/"$1" ]] && return 0 # already there $DRACUT_INSTALL ${initdir:+-D "$initdir"} -d "$@" (($? != 0)) && derror $DRACUT_INSTALL ${initdir:+-D "$initdir"} -d "$@" || : } inst() { [[ -e ${initdir}/"${2:-$1}" ]] && return 0 # already there #dinfo "$DRACUT_INSTALL -l $@" $DRACUT_INSTALL ${initdir:+-D "$initdir"} ${DRACUT_RESOLVE_DEPS:+-l} ${DRACUT_FIPS_MODE:+-H} "$@" (($? != 0)) && derror $DRACUT_INSTALL ${initdir:+-D "$initdir"} ${DRACUT_RESOLVE_DEPS:+-l} ${DRACUT_FIPS_MODE:+-H} "$@" || : } inst_simple() { [[ -e ${initdir}/"${2:-$1}" ]] && return 0 # already there [[ -e $1 ]] || return 1 # no source $DRACUT_INSTALL ${initdir:+-D "$initdir"} "$@" (($? != 0)) && derror $DRACUT_INSTALL ${initdir:+-D "$initdir"} "$@" || : } inst_symlink() { [[ -e ${initdir}/"${2:-$1}" ]] && return 0 # already there [[ -L $1 ]] || return 1 $DRACUT_INSTALL ${initdir:+-D "$initdir"} ${DRACUT_RESOLVE_DEPS:+-l} ${DRACUT_FIPS_MODE:+-H} "$@" (($? != 0)) && derror $DRACUT_INSTALL ${initdir:+-D "$initdir"} ${DRACUT_RESOLVE_DEPS:+-l} ${DRACUT_FIPS_MODE:+-H} "$@" || : } inst_multiple() { local ret #dinfo "initdir=$initdir $DRACUT_INSTALL -l $@" $DRACUT_INSTALL ${initdir:+-D "$initdir"} -a ${DRACUT_RESOLVE_DEPS:+-l} ${DRACUT_FIPS_MODE:+-H} "$@" ret=$? (($ret != 0)) && derror $DRACUT_INSTALL ${initdir:+-D "$initdir"} -a ${DRACUT_RESOLVE_DEPS:+-l} ${DRACUT_FIPS_MODE:+-H} "$@" || : return $ret } dracut_install() { inst_multiple "$@" } inst_library() { [[ -e ${initdir}/"${2:-$1}" ]] && return 0 # already there [[ -e $1 ]] || return 1 # no source $DRACUT_INSTALL ${initdir:+-D "$initdir"} ${DRACUT_RESOLVE_DEPS:+-l} ${DRACUT_FIPS_MODE:+-H} "$@" (($? != 0)) && derror $DRACUT_INSTALL ${initdir:+-D "$initdir"} ${DRACUT_RESOLVE_DEPS:+-l} ${DRACUT_FIPS_MODE:+-H} "$@" || : } inst_binary() { $DRACUT_INSTALL ${initdir:+-D "$initdir"} ${DRACUT_RESOLVE_DEPS:+-l} ${DRACUT_FIPS_MODE:+-H} "$@" (($? != 0)) && derror $DRACUT_INSTALL ${initdir:+-D "$initdir"} ${DRACUT_RESOLVE_DEPS:+-l} ${DRACUT_FIPS_MODE:+-H} "$@" || : } inst_script() { $DRACUT_INSTALL ${initdir:+-D "$initdir"} ${DRACUT_RESOLVE_DEPS:+-l} ${DRACUT_FIPS_MODE:+-H} "$@" (($? != 0)) && derror $DRACUT_INSTALL ${initdir:+-D "$initdir"} ${DRACUT_RESOLVE_DEPS:+-l} ${DRACUT_FIPS_MODE:+-H} "$@" || : } # find symlinks linked to given library file # $1 = library file # Function searches for symlinks by stripping version numbers appended to # library filename, checks if it points to the same target and finally # prints the list of symlinks to stdout. # # Example: # rev_lib_symlinks libfoo.so.8.1 # output: libfoo.so.8 libfoo.so # (Only if libfoo.so.8 and libfoo.so exists on host system.) rev_lib_symlinks() { [[ ! $1 ]] && return 0 local fn="$1" orig="$(readlink -f "$1")" links='' [[ ${fn} == *.so.* ]] || return 1 until [[ ${fn##*.} == so ]]; do fn="${fn%.*}" [[ -L ${fn} && $(readlink -f "${fn}") == ${orig} ]] && links+=" ${fn}" done echo "${links}" } # attempt to install any programs specified in a udev rule inst_rule_programs() { local _prog _bin if grep -qE 'PROGRAM==?"[^ "]+' "$1"; then for _prog in $(grep -E 'PROGRAM==?"[^ "]+' "$1" | sed -r 's/.*PROGRAM==?"([^ "]+).*/\1/'); do _bin="" if [ -x ${udevdir}/$_prog ]; then _bin=${udevdir}/$_prog elif [[ "${_prog/\$env\{/}" == "$_prog" ]]; then _bin=$(find_binary "$_prog") || { dinfo "Skipping program $_prog using in udev rule ${1##*/} as it cannot be found" continue; } fi [[ $_bin ]] && inst_binary "$_bin" done fi if grep -qE 'RUN[+=]=?"[^ "]+' "$1"; then for _prog in $(grep -E 'RUN[+=]=?"[^ "]+' "$1" | sed -r 's/.*RUN[+=]=?"([^ "]+).*/\1/'); do _bin="" if [ -x ${udevdir}/$_prog ]; then _bin=${udevdir}/$_prog elif [[ "${_prog/\$env\{/}" == "$_prog" ]] && [[ "${_prog}" != "/sbin/initqueue" ]]; then _bin=$(find_binary "$_prog") || { dinfo "Skipping program $_prog using in udev rule ${1##*/} as it cannot be found" continue; } fi [[ $_bin ]] && inst_binary "$_bin" done fi if grep -qE 'IMPORT\{program\}==?"[^ "]+' "$1"; then for _prog in $(grep -E 'IMPORT\{program\}==?"[^ "]+' "$1" | sed -r 's/.*IMPORT\{program\}==?"([^ "]+).*/\1/'); do _bin="" if [ -x ${udevdir}/$_prog ]; then _bin=${udevdir}/$_prog elif [[ "${_prog/\$env\{/}" == "$_prog" ]]; then _bin=$(find_binary "$_prog") || { dinfo "Skipping program $_prog using in udev rule ${1##*/} as it cannot be found" continue; } fi [[ $_bin ]] && dracut_install "$_bin" done fi } # attempt to install any programs specified in a udev rule inst_rule_group_owner() { local i if grep -qE 'OWNER=?"[^ "]+' "$1"; then for i in $(grep -E 'OWNER=?"[^ "]+' "$1" | sed -r 's/.*OWNER=?"([^ "]+).*/\1/'); do if ! egrep -q "^$i:" "$initdir/etc/passwd" 2>/dev/null; then egrep "^$i:" /etc/passwd 2>/dev/null >> "$initdir/etc/passwd" fi done fi if grep -qE 'GROUP=?"[^ "]+' "$1"; then for i in $(grep -E 'GROUP=?"[^ "]+' "$1" | sed -r 's/.*GROUP=?"([^ "]+).*/\1/'); do if ! egrep -q "^$i:" "$initdir/etc/group" 2>/dev/null; then egrep "^$i:" /etc/group 2>/dev/null >> "$initdir/etc/group" fi done fi } inst_rule_initqueue() { if grep -q -F initqueue "$1"; then dracut_need_initqueue fi } # udev rules always get installed in the same place, so # create a function to install them to make life simpler. inst_rules() { local _target=/etc/udev/rules.d _rule _found inst_dir "${udevdir}/rules.d" inst_dir "$_target" for _rule in "$@"; do if [ "${_rule#/}" = "$_rule" ]; then for r in ${udevdir}/rules.d ${hostonly:+/etc/udev/rules.d}; do if [[ -e $r/$_rule ]]; then _found="$r/$_rule" inst_rule_programs "$_found" inst_rule_group_owner "$_found" inst_rule_initqueue "$_found" inst_simple "$_found" fi done fi for r in '' $dracutbasedir/rules.d/; do # skip rules without an absolute path [[ "${r}$_rule" != /* ]] && continue if [[ -f ${r}$_rule ]]; then _found="${r}$_rule" inst_rule_programs "$_found" inst_rule_group_owner "$_found" inst_rule_initqueue "$_found" inst_simple "$_found" "$_target/${_found##*/}" fi done [[ $_found ]] || dinfo "Skipping udev rule: $_rule" done } inst_rules_wildcard() { local _target=/etc/udev/rules.d _rule _found inst_dir "${udevdir}/rules.d" inst_dir "$_target" for _rule in ${udevdir}/rules.d/$1 ${dracutbasedir}/rules.d/$1 ; do if [[ -e $_rule ]]; then inst_rule_programs "$_rule" inst_rule_group_owner "$_rule" inst_rule_initqueue "$_rule" inst_simple "$_rule" _found=$_rule fi done if [ -n ${hostonly} ] ; then for _rule in ${_target}/$1 ; do if [[ -f $_rule ]]; then inst_rule_programs "$_rule" inst_rule_group_owner "$_rule" inst_rule_initqueue "$_rule" inst_simple "$_rule" _found=$_rule fi done fi [[ $_found ]] || dinfo "Skipping udev rule: $_rule" } prepare_udev_rules() { [ -z "$UDEVVERSION" ] && export UDEVVERSION=$(udevadm --version) for f in "$@"; do f="${initdir}/etc/udev/rules.d/$f" [ -e "$f" ] || continue while read line; do if [ "${line%%IMPORT PATH_ID}" != "$line" ]; then if [ $UDEVVERSION -ge 174 ]; then printf '%sIMPORT{builtin}="path_id"\n' "${line%%IMPORT PATH_ID}" else printf '%sIMPORT{program}="path_id %%p"\n' "${line%%IMPORT PATH_ID}" fi elif [ "${line%%IMPORT BLKID}" != "$line" ]; then if [ $UDEVVERSION -ge 176 ]; then printf '%sIMPORT{builtin}="blkid"\n' "${line%%IMPORT BLKID}" else printf '%sIMPORT{program}="/sbin/blkid -o udev -p $tempnode"\n' "${line%%IMPORT BLKID}" fi else echo "$line" fi done < "${f}" > "${f}.new" mv "${f}.new" "$f" done } # install function specialized for hooks # $1 = type of hook, $2 = hook priority (lower runs first), $3 = hook # All hooks should be POSIX/SuS compliant, they will be sourced by init. inst_hook() { if ! [[ -f $3 ]]; then dfatal "Cannot install a hook ($3) that does not exist." dfatal "Aborting initrd creation." exit 1 elif ! [[ "$hookdirs" == *$1* ]]; then dfatal "No such hook type $1. Aborting initrd creation." exit 1 fi inst_simple "$3" "/lib/dracut/hooks/${1}/${2}-${3##*/}" } # install any of listed files # # If first argument is '-d' and second some destination path, first accessible # source is installed into this path, otherwise it will installed in the same # path as source. If none of listed files was installed, function return 1. # On first successful installation it returns with 0 status. # # Example: # # inst_any -d /bin/foo /bin/bar /bin/baz # # Lets assume that /bin/baz exists, so it will be installed as /bin/foo in # initramfs. inst_any() { local to f [[ $1 = '-d' ]] && to="$2" && shift 2 for f in "$@"; do if [[ -e $f ]]; then [[ $to ]] && inst "$f" "$to" && return 0 inst "$f" && return 0 fi done return 1 } # inst_libdir_file [-n ] [...] # Install a located on a lib directory to the initramfs image # -n install matching files inst_libdir_file() { local _files if [[ "$1" == "-n" ]]; then local _pattern=$2 shift 2 for _dir in $libdirs; do for _i in "$@"; do for _f in "$_dir"/$_i; do [[ "$_f" =~ $_pattern ]] || continue [[ -e "$_f" ]] && _files+="$_f " done done done else for _dir in $libdirs; do for _i in "$@"; do for _f in "$_dir"/$_i; do [[ -e "$_f" ]] && _files+="$_f " done done done fi [[ $_files ]] && inst_multiple $_files } # install function decompressing the target and handling symlinks # $@ = list of compressed (gz or bz2) files or symlinks pointing to such files # # Function install targets in the same paths inside overlay but decompressed # and without extensions (.gz, .bz2). inst_decompress() { local _src _cmd for _src in $@ do case ${_src} in *.gz) _cmd='gzip -f -d' ;; *.bz2) _cmd='bzip2 -d' ;; *) return 1 ;; esac inst_simple ${_src} # Decompress with chosen tool. We assume that tool changes name e.g. # from 'name.gz' to 'name'. ${_cmd} "${initdir}${_src}" done } # It's similar to above, but if file is not compressed, performs standard # install. # $@ = list of files inst_opt_decompress() { local _src for _src in $@ do inst_decompress "${_src}" || inst "${_src}" done } # module_check # execute the check() function of module-setup.sh of # or the "check" script, if module-setup.sh is not found # "check $hostonly" is called module_check() { local _moddir=$(echo ${dracutbasedir}/modules.d/??${1}) local _ret local _forced=0 local _hostonly=$hostonly [ $# -eq 2 ] && _forced=$2 [[ -d $_moddir ]] || return 1 if [[ ! -f $_moddir/module-setup.sh ]]; then # if we do not have a check script, we are unconditionally included [[ -x $_moddir/check ]] || return 0 [ $_forced -ne 0 ] && unset hostonly $_moddir/check $hostonly _ret=$? else unset check depends cmdline install installkernel check() { true; } . $_moddir/module-setup.sh is_func check || return 0 [ $_forced -ne 0 ] && unset hostonly moddir=$_moddir check $hostonly _ret=$? unset check depends cmdline install installkernel fi hostonly=$_hostonly return $_ret } # module_check_mount # execute the check() function of module-setup.sh of # or the "check" script, if module-setup.sh is not found # "mount_needs=1 check 0" is called module_check_mount() { local _moddir=$(echo ${dracutbasedir}/modules.d/??${1}) local _ret mount_needs=1 [[ -d $_moddir ]] || return 1 if [[ ! -f $_moddir/module-setup.sh ]]; then # if we do not have a check script, we are unconditionally included [[ -x $_moddir/check ]] || return 0 mount_needs=1 $_moddir/check 0 _ret=$? else unset check depends cmdline install installkernel check() { false; } . $_moddir/module-setup.sh moddir=$_moddir check 0 _ret=$? unset check depends cmdline install installkernel fi unset mount_needs return $_ret } # module_depends # execute the depends() function of module-setup.sh of # or the "depends" script, if module-setup.sh is not found module_depends() { local _moddir=$(echo ${dracutbasedir}/modules.d/??${1}) local _ret [[ -d $_moddir ]] || return 1 if [[ ! -f $_moddir/module-setup.sh ]]; then # if we do not have a check script, we have no deps [[ -x $_moddir/check ]] || return 0 $_moddir/check -d return $? else unset check depends cmdline install installkernel depends() { true; } . $_moddir/module-setup.sh moddir=$_moddir depends _ret=$? unset check depends cmdline install installkernel return $_ret fi } # module_cmdline # execute the cmdline() function of module-setup.sh of # or the "cmdline" script, if module-setup.sh is not found module_cmdline() { local _moddir=$(echo ${dracutbasedir}/modules.d/??${1}) local _ret [[ -d $_moddir ]] || return 1 if [[ ! -f $_moddir/module-setup.sh ]]; then [[ -x $_moddir/cmdline ]] && . "$_moddir/cmdline" return $? else unset check depends cmdline install installkernel cmdline() { true; } . $_moddir/module-setup.sh moddir=$_moddir cmdline _ret=$? unset check depends cmdline install installkernel return $_ret fi } # module_install # execute the install() function of module-setup.sh of # or the "install" script, if module-setup.sh is not found module_install() { local _moddir=$(echo ${dracutbasedir}/modules.d/??${1}) local _ret [[ -d $_moddir ]] || return 1 if [[ ! -f $_moddir/module-setup.sh ]]; then [[ -x $_moddir/install ]] && . "$_moddir/install" return $? else unset check depends cmdline install installkernel install() { true; } . $_moddir/module-setup.sh moddir=$_moddir install _ret=$? unset check depends cmdline install installkernel return $_ret fi } # module_installkernel # execute the installkernel() function of module-setup.sh of # or the "installkernel" script, if module-setup.sh is not found module_installkernel() { local _moddir=$(echo ${dracutbasedir}/modules.d/??${1}) local _ret [[ -d $_moddir ]] || return 1 if [[ ! -f $_moddir/module-setup.sh ]]; then [[ -x $_moddir/installkernel ]] && . "$_moddir/installkernel" return $? else unset check depends cmdline install installkernel installkernel() { true; } . $_moddir/module-setup.sh moddir=$_moddir installkernel _ret=$? unset check depends cmdline install installkernel return $_ret fi } # check_mount # check_mount checks, if a dracut module is needed for the given # device and filesystem types in "${host_fs_types[@]}" check_mount() { local _mod=$1 local _moddir=$(echo ${dracutbasedir}/modules.d/??${1}) local _ret local _moddep [ "${#host_fs_types[*]}" -le 0 ] && return 1 # If we are already scheduled to be loaded, no need to check again. [[ " $mods_to_load " == *\ $_mod\ * ]] && return 0 [[ " $mods_checked_as_dep " == *\ $_mod\ * ]] && return 1 # This should never happen, but... [[ -d $_moddir ]] || return 1 [[ $2 ]] || mods_checked_as_dep+=" $_mod " if [[ " $omit_dracutmodules " == *\ $_mod\ * ]]; then return 1 fi if [[ " $dracutmodules $add_dracutmodules $force_add_dracutmodules" == *\ $_mod\ * ]]; then module_check_mount $_mod; ret=$? # explicit module, so also accept ret=255 [[ $ret = 0 || $ret = 255 ]] || return 1 else # module not in our list if [[ $dracutmodules = all ]]; then # check, if we can and should install this module module_check_mount $_mod || return 1 else # skip this module return 1 fi fi for _moddep in $(module_depends $_mod); do # handle deps as if they were manually added [[ " $add_dracutmodules " == *\ $_moddep\ * ]] || \ add_dracutmodules+=" $_moddep " [[ " $force_add_dracutmodules " == *\ $_moddep\ * ]] || \ force_add_dracutmodules+=" $_moddep " # if a module we depend on fail, fail also if ! check_module $_moddep; then derror "dracut module '$_mod' depends on '$_moddep', which can't be installed" return 1 fi done [[ " $mods_to_load " == *\ $_mod\ * ]] || \ mods_to_load+=" $_mod " return 0 } # check_module [] # check if a dracut module is to be used in the initramfs process # if is set, then the process also keeps track # that the modules were checked for the dependency tracking process check_module() { local _mod=$1 local _moddir=$(echo ${dracutbasedir}/modules.d/??${1}) local _ret local _moddep # If we are already scheduled to be loaded, no need to check again. [[ " $mods_to_load " == *\ $_mod\ * ]] && return 0 [[ " $mods_checked_as_dep " == *\ $_mod\ * ]] && return 1 # This should never happen, but... [[ -d $_moddir ]] || return 1 [[ $2 ]] || mods_checked_as_dep+=" $_mod " if [[ " $omit_dracutmodules " == *\ $_mod\ * ]]; then dinfo "dracut module '$_mod' will not be installed, because it's in the list to be omitted!" return 1 fi if [[ " $dracutmodules $add_dracutmodules $force_add_dracutmodules" == *\ $_mod\ * ]]; then if [[ " $force_add_dracutmodules " == *\ $_mod\ * ]]; then module_check $_mod 1; ret=$? else module_check $_mod 0; ret=$? fi # explicit module, so also accept ret=255 [[ $ret = 0 || $ret = 255 ]] || return 1 else # module not in our list if [[ $dracutmodules = all ]]; then # check, if we can and should install this module module_check $_mod || return 1 else # skip this module return 1 fi fi for _moddep in $(module_depends $_mod); do # handle deps as if they were manually added [[ " $add_dracutmodules " == *\ $_moddep\ * ]] || \ add_dracutmodules+=" $_moddep " [[ " $force_add_dracutmodules " == *\ $_moddep\ * ]] || \ force_add_dracutmodules+=" $_moddep " # if a module we depend on fail, fail also if ! check_module $_moddep; then derror "dracut module '$_mod' depends on '$_moddep', which can't be installed" return 1 fi done [[ " $mods_to_load " == *\ $_mod\ * ]] || \ mods_to_load+=" $_mod " return 0 } # for_each_module_dir # execute " 1" for_each_module_dir() { local _modcheck local _mod local _moddir local _func _func=$1 for _moddir in "$dracutbasedir/modules.d"/[0-9][0-9]*; do [[ -d $_moddir ]] || continue; [[ -e $_moddir/install || -e $_moddir/installkernel || \ -e $_moddir/module-setup.sh ]] || continue _mod=${_moddir##*/}; _mod=${_mod#[0-9][0-9]} $_func $_mod 1 done # Report any missing dracut modules, the user has specified _modcheck="$add_dracutmodules $force_add_dracutmodules" [[ $dracutmodules != all ]] && _modcheck="$m $dracutmodules" for _mod in $_modcheck; do [[ " $mods_to_load " == *\ $_mod\ * ]] && continue [[ " $omit_dracutmodules " == *\ $_mod\ * ]] && continue derror "dracut module '$_mod' cannot be found or installed." done } check_supported_kmod() { kmod=$1 supported=$(modinfo -k $kernel -F supported $kmod 2>/dev/null) case "$supported" in yes|external) ;; *) dwarn "Module \"$(basename $kmod)\" is unsupported. This may cause" \ "problems while booting." ;; esac } # Install a single kernel module along with any firmware it may require. # $1 = full path to kernel module to install install_kmod_with_fw() { # no need to go further if the module is already installed [[ -e "${initdir}/lib/modules/$kernel/${1##*/lib/modules/$kernel/}" ]] \ && return 0 if [[ $DRACUT_KERNEL_LAZY_HASHDIR ]] && [[ -e "$DRACUT_KERNEL_LAZY_HASHDIR/${1##*/}" ]]; then read ret < "$DRACUT_KERNEL_LAZY_HASHDIR/${1##*/}" return $ret fi if [[ $omit_drivers ]]; then local _kmod=${1##*/} _kmod=${_kmod%.ko*} _kmod=${_kmod/-/_} if [[ "$_kmod" =~ $omit_drivers ]]; then dinfo "Omitting driver $_kmod" return 0 fi if [[ "${1##*/lib/modules/$kernel/}" =~ $omit_drivers ]]; then dinfo "Omitting driver $_kmod" return 0 fi fi if [[ $silent_omit_drivers ]]; then local _kmod=${1##*/} _kmod=${_kmod%.ko*} _kmod=${_kmod/-/_} [[ "$_kmod" =~ $silent_omit_drivers ]] && return 0 [[ "${1##*/lib/modules/$kernel/}" =~ $silent_omit_drivers ]] && return 0 fi inst_simple "$1" "/lib/modules/$kernel/${1##*/lib/modules/$kernel/}" ret=$? [[ $DRACUT_KERNEL_LAZY_HASHDIR ]] && \ [[ -d "$DRACUT_KERNEL_LAZY_HASHDIR" ]] && \ echo $ret > "$DRACUT_KERNEL_LAZY_HASHDIR/${1##*/}" (($ret != 0)) && return $ret local _modname=${1##*/} _fwdir _found _fw _modname=${_modname%.ko*} for _fw in $(modinfo -k $kernel -F firmware $1 2>/dev/null); do _found='' for _fwdir in $fw_dir; do if [[ -d $_fwdir && -f $_fwdir/$_fw ]]; then inst_simple "$_fwdir/$_fw" "/lib/firmware/$_fw" _found=yes fi done if [[ $_found != yes ]]; then if ! [[ -d $(echo /sys/module/${_modname//-/_}|{ read a b; echo $a; }) ]]; then dinfo "Possible missing firmware \"${_fw}\" for kernel module" \ "\"${_modname}.ko\"" else dwarn "Possible missing firmware \"${_fw}\" for kernel module" \ "\"${_modname}.ko\"" fi fi done if [[ "$check_supported" = "yes" ]]; then check_supported_kmod $1 fi return 0 } # Do something with all the dependencies of a kernel module. # Note that kernel modules depend on themselves using the technique we use # $1 = function to call for each dependency we find # It will be passed the full path to the found kernel module # $2 = module to get dependencies for # rest of args = arguments to modprobe # _fderr specifies FD passed from surrounding scope for_each_kmod_dep() { local _func=$1 _kmod=$2 _cmd _modpath _options shift 2 modprobe "$@" --ignore-install --show-depends $_kmod 2>&${_fderr} | ( while read _cmd _modpath _options; do [[ $_cmd = insmod ]] || continue $_func ${_modpath} || exit $? done ) } dracut_kernel_post() { local _moddirname=${srcmods%%/lib/modules/*} local _pid if [[ $DRACUT_KERNEL_LAZY_HASHDIR ]] && [[ -f "$DRACUT_KERNEL_LAZY_HASHDIR/lazylist" ]]; then xargs -r modprobe -a ${_moddirname:+-d ${_moddirname}/} \ --ignore-install --show-depends --set-version $kernel \ < "$DRACUT_KERNEL_LAZY_HASHDIR/lazylist" 2>/dev/null \ | sort -u \ | while read _cmd _modpath _options; do [[ $_cmd = insmod ]] || continue echo "$_modpath" done > "$DRACUT_KERNEL_LAZY_HASHDIR/lazylist.dep" ( if [[ $DRACUT_INSTALL ]] && [[ -z $_moddirname ]]; then xargs -r $DRACUT_INSTALL ${initdir:+-D "$initdir"} -a < "$DRACUT_KERNEL_LAZY_HASHDIR/lazylist.dep" else while read _modpath; do local _destpath=$_modpath [[ $_moddirname ]] && _destpath=${_destpath##$_moddirname/} _destpath=${_destpath##*/lib/modules/$kernel/} inst_simple "$_modpath" "/lib/modules/$kernel/${_destpath}" || exit $? done < "$DRACUT_KERNEL_LAZY_HASHDIR/lazylist.dep" fi if [[ $check_supported ]]; then while read _modpath; do check_supported_kmod $_modpath done < "$DRACUT_KERNEL_LAZY_HASHDIR/lazylist.dep" fi ) & _pid=$(jobs -p | while read a ; do printf ":$a";done) _pid=${_pid##*:} if [[ $DRACUT_INSTALL ]]; then xargs -r modinfo -k $kernel -F firmware < "$DRACUT_KERNEL_LAZY_HASHDIR/lazylist.dep" \ | while read line; do for _fwdir in $fw_dir; do echo $_fwdir/$line; done; done | xargs -r $DRACUT_INSTALL ${initdir:+-D "$initdir"} -a -o else for _fw in $(xargs -r modinfo -k $kernel -F firmware < "$DRACUT_KERNEL_LAZY_HASHDIR/lazylist.dep"); do for _fwdir in $fw_dir; do if [[ -d $_fwdir && -f $_fwdir/$_fw ]]; then inst_simple "$_fwdir/$_fw" "/lib/firmware/$_fw" break fi done done fi wait $_pid fi for _f in modules.builtin.bin modules.builtin modules.order; do [[ $srcmods/$_f ]] && inst_simple "$srcmods/$_f" "/lib/modules/$kernel/$_f" done # generate module dependencies for the initrd if [[ -d $initdir/lib/modules/$kernel ]] && \ ! depmod -a -b "$initdir" $kernel; then dfatal "\"depmod -a $kernel\" failed." exit 1 fi [[ $DRACUT_KERNEL_LAZY_HASHDIR ]] && rm -fr -- "$DRACUT_KERNEL_LAZY_HASHDIR" } [[ "$kernel_current" ]] || export kernel_current=$(uname -r) module_is_host_only() { local _mod=$1 local _modenc a i _k _s _v _aliases _mod=${_mod##*/} _mod=${_mod%.ko*} _modenc=${_mod//-/_} [[ " $add_drivers " == *\ ${_mod}\ * ]] && return 0 # check if module is loaded [[ ${host_modules["$_modenc"]} ]] && return 0 [[ "$kernel_current" ]] || export kernel_current=$(uname -r) if [[ "$kernel_current" != "$kernel" ]]; then # check if module is loadable on the current kernel # this covers the case, where a new module is introduced # or a module was renamed # or a module changed from builtin to a module if [[ -d /lib/modules/$kernel_current ]]; then # if the modinfo can be parsed, but the module # is not loaded, then we can safely return 1 modinfo -F filename "$_mod" &>/dev/null && return 1 fi _aliases=$(modinfo -k $kernel -F alias $_mod 2>/dev/null) # if the module has no aliases, install it [[ $_aliases ]] || return 0 # finally check all modalias for a in $_aliases; do for i in "${!host_modalias[@]}"; do [[ $i == $a ]] && return 0 done done fi return 1 } find_kernel_modules_by_path () { local _OLDIFS [[ -f "$srcmods/modules.dep" ]] || return 0 _OLDIFS=$IFS IFS=: while read a rest; do [[ $a = */$1/* ]] || [[ $a = updates/* ]] || [[ $a = extra/* ]] || [[ $a = weak-updates/* ]] || continue printf "%s\n" "$srcmods/$a" done < "$srcmods/modules.dep" IFS=$_OLDIFS return 0 } find_kernel_modules () { find_kernel_modules_by_path drivers } # instmods [-c [-s]] [ ... ] # instmods [-c [-s]] # install kernel modules along with all their dependencies. # can be e.g. "=block" or "=drivers/usb/storage" instmods() { [[ $no_kernel = yes ]] && return # called [sub]functions inherit _fderr local _fderr=9 local _check=yes local _silent=no # Leave this in for compatibility reasons. if [[ $1 = '-c' ]]; then _check=yes shift fi if [[ $1 = '-s' ]]; then _check=no _silent=yes shift fi function inst1mod() { local _ret=0 _mod="$1" case $_mod in =*) ( [[ "$_mpargs" ]] && echo $_mpargs find_kernel_modules_by_path "${_mod#=}" ) \ | instmods ((_ret+=$?)) ;; --*) _mpargs+=" $_mod" ;; *) _mod=${_mod##*/} # Check for aliased modules _modalias=$(modinfo -k $kernel -F filename $_mod 2> /dev/null) _modalias=${_modalias%.ko*} [[ -z "$_modalias" ]] && return 1 if [ "${_modalias##*/}" != "${_mod%.ko*}" ] ; then _mod=${_modalias##*/} fi # if we are already installed, skip this module and go on # to the next one. if [[ $DRACUT_KERNEL_LAZY_HASHDIR ]] && \ [[ -f "$DRACUT_KERNEL_LAZY_HASHDIR/${_mod%.ko*}" ]]; then read _ret <"$DRACUT_KERNEL_LAZY_HASHDIR/${_mod%.ko*}" return $_ret fi _mod=${_mod/-/_} if [[ $omit_drivers ]] && [[ "$_mod" =~ $omit_drivers ]]; then dinfo "Omitting driver ${_mod##$srcmods}" return 0 fi # If we are building a host-specific initramfs and this # module is not already loaded, move on to the next one. [[ $hostonly ]] \ && ! module_is_host_only "$_mod" \ && return 0 if [[ "$_check" = "yes" ]] || ! [[ $DRACUT_KERNEL_LAZY_HASHDIR ]]; then # We use '-d' option in modprobe only if modules prefix path # differs from default '/'. This allows us to use dracut with # old version of modprobe which doesn't have '-d' option. local _moddirname=${srcmods%%/lib/modules/*} [[ -n ${_moddirname} ]] && _moddirname="-d ${_moddirname}/" # ok, load the module, all its dependencies, and any firmware # it may require for_each_kmod_dep install_kmod_with_fw $_mod \ --set-version $kernel ${_moddirname} $_mpargs ((_ret+=$?)) else if [[ $DRACUT_KERNEL_LAZY_HASHDIR ]] && [ -n "$_mod" ]; then echo ${_mod%.ko*} >> "$DRACUT_KERNEL_LAZY_HASHDIR/lazylist" for suse_mod_dep in ${suse_mod_deps["$_mod"]}; do echo $suse_mod_dep >> "$DRACUT_KERNEL_LAZY_HASHDIR/lazylist" done fi fi ;; esac return $_ret } function instmods_1() { local _mod _mpargs if (($# == 0)); then # filenames from stdin while read _mod; do inst1mod "${_mod%.ko*}" || { if [[ "$_check" == "yes" ]] && [[ "$_silent" == "no" ]]; then dfatal "Failed to install module $_mod" fi echo $_mod >> /tmp/dracut_failed_drivers } done fi while (($# > 0)); do # filenames as arguments inst1mod ${1%.ko*} || { if [[ "$_check" == "yes" ]] && [[ "$_silent" == "no" ]]; then dfatal "Failed to install module $1" fi echo $1 >> /tmp/dracut_failed_drivers } shift done return 0 } local _ret _filter_not_found='FATAL: Module .* not found.' # Capture all stderr from modprobe to _fderr. We could use {var}>... # redirections, but that would make dracut require bash4 at least. eval "( instmods_1 \"\$@\" ) ${_fderr}>&1" \ | while read line; do [[ "$line" =~ $_filter_not_found ]] || echo $line;done | derror _ret=$? return $_ret } # get_cpu_vendor # Only two values are returned: AMD or Intel get_cpu_vendor () { if grep -qE AMD /proc/cpuinfo; then printf "AMD" fi if grep -qE Intel /proc/cpuinfo; then printf "Intel" fi } # get_host_ucode # Get the hosts' ucode file based on the /proc/cpuinfo get_ucode_file () { local family=`grep -E "cpu family" /proc/cpuinfo | head -1 | sed s/.*:\ //` local model=`grep -E "model" /proc/cpuinfo |grep -v name | head -1 | sed s/.*:\ //` local stepping=`grep -E "stepping" /proc/cpuinfo | head -1 | sed s/.*:\ //` if [[ "$(get_cpu_vendor)" == "AMD" ]]; then # If family greater or equal than 0x15 if [[ $family -ge 21 ]]; then printf "microcode_amd_fam15h.bin" else printf "microcode_amd.bin" fi fi if [[ "$(get_cpu_vendor)" == "Intel" ]]; then # The /proc/cpuinfo are in decimal. printf "%02x-%02x-%02x" ${family} ${model} ${stepping} fi } # Not every device in /dev/mapper should be examined. # If it is an LVM device, touch only devices which have /dev/VG/LV symlink. lvm_internal_dev() { local dev_dm_dir=/sys/dev/block/$1/dm [[ ! -f $dev_dm_dir/uuid || $(<$dev_dm_dir/uuid) != LVM-* ]] && return 1 # Not an LVM device local DM_VG_NAME DM_LV_NAME DM_LV_LAYER eval $(dmsetup splitname --nameprefixes --noheadings --rows "$(<$dev_dm_dir/name)" 2>/dev/null) [[ ${DM_VG_NAME} ]] && [[ ${DM_LV_NAME} ]] || return 0 # Better skip this! [[ ${DM_LV_LAYER} ]] || [[ ! -L /dev/${DM_VG_NAME}/${DM_LV_NAME} ]] } 070701000F005C000081ED000000000000000000000001555B5D0C00000450000000FD0000000000000000000000000000004A00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/dracut-initramfs-restore#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh set -e KERNEL_VERSION="$(uname -r)" [[ $dracutbasedir ]] || dracutbasedir=/usr/lib/dracut SKIP="$dracutbasedir/skipcpio" [[ -x $SKIP ]] || SKIP=cat [[ -f /etc/machine-id ]] && read MACHINE_ID < /etc/machine-id if [[ $MACHINE_ID ]] && [[ -d /boot/${MACHINE_ID} || -L /boot/${MACHINE_ID} ]] ; then IMG="/boot/${MACHINE_ID}/${KERNEL_VERSION}/initrd" fi [[ -f $IMG ]] || IMG="/boot/initrd-${KERNEL_VERSION}" cd /run/initramfs [ -f .need_shutdown -a -f "$IMG" ] || exit 1 if $SKIP "$IMG" | zcat | cpio -id --no-absolute-filenames --quiet >/dev/null; then rm -f -- .need_shutdown elif $SKIP "$IMG" | xzcat | cpio -id --no-absolute-filenames --quiet >/dev/null; then rm -f -- .need_shutdown elif $SKIP "$IMG" | lz4 -d -c | cpio -id --no-absolute-filenames --quiet >/dev/null; then rm -f -- .need_shutdown else # something failed, so we clean up echo "Unpacking of $IMG to /run/initramfs failed" >&2 rm -f -- /run/initramfs/shutdown exit 1 fi exit 0 070701000F01AC000081ED000000000000000000000001555B5D0F000018D8000000FD0000000000000000000000000000003A00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/skipcpioELF> @@@8 @@@@@@88@8@@@ `` ``TT@T@DDPtdx x @x @44QtdRtd``/lib64/ld-linux-x86-64.so.2GNUGNUY`afQWV"M+     )9R=Xj " K(6`D`libc.so.6exitfopenfeofstrstrfseek__fprintf_chkstdoutfclosestderrfwritefread__libc_start_main__gmon_start__GLIBC_2.3.4GLIBC_2.2.5ti yui `` ` ` `(`0`8`@`H`P`X` `` h` HH] Ht[H5R %T @%R h%J h%B h%: h%2 h%* h%" h% hp% h`% h P% h @UHSH*H~6 @HHH` H11HH= 0uA\DHٺ`Ht*H  H¾`3Ht HtHH1[]À=k 7uڀ=c 0uр=[ 7uȀ=S 0u=K 1u1$j @`HunHH puv1HHHٺ `  HuDHMH= O @HNH-`1HHl HHuoHHٺ` H1 HH9t`tHtH1`uH11HHM8 @H= 1H$ @1I^HHPTI @H @Hp@`UH-`HHw]øHt]``UH-`HHHH?HHu]úHt]Hƿ`=9 uUH~]& @H= tHtU`H]{sAWAAVIAUIATL%H UH-H SL)1HHHtLLDAHH9uH[]A\A]A^A_ff.HHUsage: %s rCannot open file '%s' Read error from file '%s' TRAILER!!!;48>P( zRx *zRx $FJ w?;*3$",DHFADD  CAA DtHeBEE E(H0H8M@l8A0A(B BBBpp @P @ @  @``@o@`@@ `@@@H o@oo@`@@@@@@&@6@F@V@f@skipcpio.debug4.shstrtab.interp.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.jcr.dynamic.got.got.plt.data.bss.gnu_debuglink 8@8T@T !t@t$8@L4o@(> @PF`@`No@[o@0j@@@Ht@ ~@y@p@p @  @ Ux @x 4 @ ``````pp`p`8070701000F005A0000A1FF000000000000000000000001556432B600000013000000FD0000000000000000000000000000004200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/dracut-functionsdracut-functions.sh070701000F005F000081ED000000000000000000000001555B5D0D00000036000000FD0000000000000000000000000000004300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/dracut-version.sh#!/bin/bash DRACUT_VERSION=037-49.1.8562.0.PTF.916376 070701000F005D000081ED000000000000000000000001555B5D0D0000BAF0000000FD0000000000000000000000000000004000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/dracut-installELF>g"@@p@8 @@@@@@00pp@p@@@ ``L ``@@DD``Ptd@@@@@QtdRtd``/lib64/ld-linux-x86-64.so.2GNUGNUZ,)ǍYVqYCG&@/;6(158D =#>%9407?:FB, .3<A2$ C) -+'E ! *"C  CEPvbA2i=~:Rp.\udI&  M LR& !E--5=W[B``!``Bh`yp`libc.so.6__xpg_basenamestrcpy__rawmemchr__printf_chkstrncmpoptind__strdupputsforkfutimes__stack_chk_fail__lxstatunlinkmkdirreallocabort_exitpopengetpidstrspnisattyfeofsymlinkexeclpcallocstrlendirnamewritevstrstrstrcspn__errno_locationreadmemcmpstrndupfchownmemcpy__vsnprintf_chkstrtoulmallocumaskrealpath__ctype_b_locgetenv__open_2optargioctl__snprintf_chkgetopt_longpcloseusleep__getdelimwaitpidstrchrprogram_invocation_short_nameqsortsyscall__xstatstrcmpstrerror__asprintf_chk__libc_start_mainstpcpysysconffree__progname__gmon_start__GLIBC_2.14GLIBC_2.8GLIBC_2.4GLIBC_2.3GLIBC_2.7GLIBC_2.3.4GLIBC_2.2.5\ii gii qii {ii ti ui `+``Ch`Ep`F` `(`0`8`@`H`P`X` `` h` p` x` `````````Ȱ`а`ذ```````` `! `"(`#0`$8`%@`&H`'P`(X`)``*h`+p`,x`-`.`/`0`1`2`3`4`5`6ȱ`7б`8ر`9`:`;`<`=`>`?`@`A `BHHř HtH5 % @% h% h% h% h% h% h% h%z hp%r h`%j h P%b h @%Z h 0%R h %J h %B h%: h%2 h%* h%" h% h% h% h% h% hp% h`% hP% h@%ژ h0%Ҙ h %ʘ h%˜ h% h% h % h!% h"% h#% h$% h%% h&%z h'p%r h(`%j h)P%b h*@%Z h+0%R h, %J h-%B h.%: h/%2 h0%* h1%" h2% h3% h4% h5% h6% h7p% h8`% h9P% h:@%ڗ h;0%җ h< %ʗ h=%— h>% h?% h@% hAP ~@z@|@6fDAWAVAUATUHSH(E1~@|@HFh6@.RDNDHf 뤐vElfoe xDatHt$D1҉xDL$DA/|@`~@z@1>\$D\$0A{@~@yz@1AA6f.IApx@~@z@E1AA>MCA-{@~@&z@1E1LA@L,$IAx@`~@z@1D$DXE.LL$HAs{@~@9z@1!H|$HA6f.1HHIL$ 1EHHMA~{@~@Oz@1ALfDE1AfAV{@~@*z@1_HHIHHD$0NLT$01AALLLT$8D$0LT$8MAx@~@3z@1LT$ LT$ 4HT$pLAtlMA{@~@THgD$0LL$HAs{@~@Az@1h$H|$H@΀AwHt$HHT$pGu7=I} 1HHqL AYH } H$1M({@HDŽ$Ll$HH$LA{@IHD$ ~@z@1L,$H|$ Lt*LL$ L,$A{@~@z@1HH|$ >H$1$DzhA&z@~@z@1zA&z@~@]Ӿ,|@HD$Ll$HH$A{@A{@|@|@1AAWAVIAUIATUSHH($LIMHHD$HD$HHJ|@HI .MLJ\;C<H|$DI1L|@H|$1IL|@^HD$LL$A|@c~@z@H$1Ht$H|$A11"H|$1fH|$\HTLLH([]A\A]A^A_Hߺ;|@LHߺJ|@LHߺ[|@Lxi|@LHhJ\;LC<H|$DI1Ly|@H|$1IHy|@A&z@c~@z@1xfD1A&z@c~@A&z@c~@A&z@c~@fDATUH|@SHHD$HD$HH|IA|@6~@)z@1|@Hy HIHHHK@LL$A|@6~@8z@1rH|$hHHD$tVH HtNH|$1I z@XHt$HT$ uHt$H|$$HuH\$HtDfHHt.H$I1A|@6~@Dz@HuH\$MtLhHİH[]A\A&z@6~@3z@1xA|@6~@%f.fffff.1H9Cffffff.HHHHF HN(HtEHH(HN(HtHHA HFHtHNHHHNHt2HAG t0G H@HHOuHGfHD(ɹ1@E@Y@1@E@s@1@E@W@|fff.HHHHD(HHFHVHHtHrH0HGHF HHF(t HtqHp G HwtHfDHujHw޹@E@Y@@E@s@@E@W@@E@l@@E@k@vfDUSHHHHt P H9sJH։H HDH[]1ɍ, Ht$'Ht$HCHH|H1H!HGHHHtHHt$h@ HH11ATHUHStd~wFIH\(Hu.fDH[HtLH;UuH[]A\f.[]1A\ù@+E@@`@*E@W@GUHSHHHHtdH>UHHiH )))Hމ}$tHs Hs HH[]@HH[]>@E@s@>@E@W@t@Hu{ff.ATIUHS'H0s H7HHs HA @@D1AHu~Au`AuRf.M0;@B IEHHBH @;@HBHE͈Z$HHJ[]A\1HfGAtfDHAtf AHHe1띐HzA1HAfO DAHD `qHH1:fffff.HSHt(1H?t[DHHMHH[ùP@E@W@vfDHSHuDHHsHu[ffff.HSHt{$tH%q Hq H[fH[AUATUHSHHIHIUÉHHiH )L))ȉƉHt!1L9hEH[]A\A]fD}$tBH5kp HtOHH\p L&LnHH[]A\A]f0HHu댾0`H%@8E@W@ f.ATHUSHtfHHIHiH )H))H߉HtH(L`1[]A\HHL[]A\~@XE@W@e DUSHHHtRHHAHHiHH A)ADAAA)D)DHtH@H[]@1fff.USHHHtbHHAHHiHH A)ADAAA)D)HtHhHHPHH[]fD1fff.AWAVAUATIUSHHHHIIA$ÉHHiLH )))ȉƉFHIt~LA$ʼnLHiH )))LƉHu#LLpM/MwLL<1H[]A\A]A^A_ffAWAVAUATUSHHHIHIIʼnLHiHH )))ȉƉXHILAĉHMiI D)AADD))LAHtI9t HHLHnMuM}DLH81H[]A\A]A^A_fATHUSHtOIHHALHiHH A)ADAAA)D)cHt L`I9t[E1]LA\f.HH[]LA\ffff.HtnHtFHHt=Ht(Hx HHHEHHtHH H@HGHuHHtH1f.1P@E@|@c Ht^Ht6HHt.HtHH(HHtHH H@ÐHGHuHHtH1f.1PЀ@E@|@ATHUSHtTHHIAHHiHH A)ADAAA)D)HtI$H@[]A\Ð1fff.HtHGHt H@D1DHtHGHt HfD1DHtHGHt H@D1DHtHwHtSH^H[1ffff.SHf.HHHuH[rfHtHwHtSHYH[@1ffff.Ht G 1ffff.Ht G ff.UHSHHtKHt=H^Hu 2fH[ Ht'HSH3HytH[]H1[]ù@xE@W@fffff.AVHAUATIUSHIt^HnHuSfLH}Lu A$ÉLHiH )))HUƉHtMu[]A\A]A^DH}AULHiH )))HHL먹@E@W@f.AVHIAUATUSHIIHA$ÉLHiH )))LƉHuZLAʼnLHiH )))LƉfHIt>HƉLLL1[]A\A]A^[]A\1A]A^׹@E@W@USHHHtFHwH?fHHtHHcxHH[]D1@H@1๐@E@W@cAUATIUSH HHItlHt$1LHD$4HtKL1f.Ht$H1LHHuHcHID-LH[]A\A]11f.fATUHSHP=m HDIIALу t tu  tH uHhD%d ExW1 HHLLD$H$i@HD$HDHD$HD$ z@HD$(BHx-HD1HP[]A\f1yf؅yϐUIտ`1SHH(HL$T$H4$:`Hxl Hnl `4@Sc x t [fc [ffffff.ff.=~c fAUATUSH(dH%(H$1;=Oc ~(1H$dH3 %(uH([]A\A]}HLL$L$jLL$L$H|$D(I"HT$HƄ${E,$DHLL$Ht7)D$P)L$`)T$p)$)$)$)$)$H$LL$HD$HD$ D$(D$ 0HD$HË:b S1ۅx [#tb [þ|@Aa x#A8@Ѓ@K@1؉A@IЃ@G@1a ifff.HAh@A9u=ya P@^@@fDHA@Hx$=i Hù@@@@@@ffDHGx \1HDRi f` fwHcH@1DUHSHHD$ tj1H<@Ht Ht7HH uHt$ Hx%T$ FH[]fDH[]ø`@&@|@gHWx1HDfSԁ@HHt HxQ@HHt Hx [fIA @@[@1IA@@@1lf.H6H?DATHIUStFHHu!2f.LHutHtH+Hu[H]A\1[H]A\ù@"H@W@DAUIATUSHHtnHHtVH/Ht8HIHt:H+HtLLHuJD%HtHH[]A\A]H1[H]A\A]ù@.H@W@wUHSHHt2H?HHtHH;HuHH[]H[]fAUATUSHHHttH/HtlH1HH8uHHItuIf.HH+IHt@H8HI$uL7H1[]A\A]ÿPHItIDI$LH[]A\A]1fD1HtH?tHH?uÐfff.AUATUHSH(HJHHHAAHD$HFHD$HvHt$'HD$HHt+H‹D$0rHL$HAHD$HHuՃH<YHIEHHI$t{fD 0s7HS H:Ht8HtM,HIEt< 0rHSHBHCH:HuHI,H(L[]A\A]@LH(1[]A\A]1qfHIt1f.HHt$(HT$0HL$8LD$@LL$Ht7)D$P)L$`)T$p)$)$)$)$)$H$Ht$HD$HD$ D$D$ 0HD$Hfff.AWAVAUIATUHHSHHHLe1HMt@HH8uzM}ML1fDHH8uHPHIMHuff.HLeHMtGL׿HHuL1H[]A\A]A^A_fDL訿HHtHIM}MuHHL[]A\A]A^A_HH[]A\A]A^A_1>1DAWAVAUATIUHSHHHIH?H1HH8uJM<$ML1fDHH8u< HHIHH}HHu[@HH}HHtB蒾HHuL1H[]A\A]A^A_ÐLLuHHtHIM<$MuHHL[]A\A]A^A_&fDH19H[]A\A]A^A_a1zf.AUATUHSHHHIHt$HH$H1@Ht$HLHZHuH<žHIHt$HLHH$H~1Ht$HLHHt5Ht$HhHHILuL!1H[]A\A]@HIDHL[]A\A]ÿQ11׹@H@|@:f.AUATUHSHHHt$HH$%H1f.Ht$HHHuH<舽HIHt$HHH$HH1@Ht$HHHHt5Ht$MdtHI$uL1H[]A\A]fDHIDHL[]A\A]ÿN11׹Є@H@|@f.USHHthN@kHHtRH8tBH1fDHqH:uHt"H,H}Ht?ucHEHH[]1@0H@|@d@AVHAUIATUHSHIHH}HI1I<$HtJ3HHEǹHIuH{赻HHteHuHHu$0H}t"H9t LtHHuhHHuH[]A\A]A^AAx@Q1ۿ:HHtHffff.AVHAUIATUSHHL'H1MtgHH8uH׺HIHfDHL#HMt@LhHHEuLg1[]A\A]A^ÿ肺HHtPIL(HHEtHEL[]A\A]A^[]A\L11A]A^[]A\A]A^J1fDATHUSHttHH?HtYH?tSH1fDHH8urAHHt>DAHJHE1[]A\fE1fD[]1A\øf1Ht0ATIHUH7HHt7HLDxH]A\HD$ TD$ fDѐAVHIAUATUStmHItiHIHHuAHI$IH]Ht$LH@uHHH]HuI$L[]A\A]A^1󹣄@H@|@fDUHSHHt+H7Ht#H DH3HtHH,HuHH[]ffff.AWIAVAUATUSHHHIHIHHu!Xf.HHH]Ht9LLHHI"uIMuHIIH]HuILH[]A\A]A^A_1@H@|@fff.AWAVAUATUSHHHAH L$3HD$L9D8T$HL9uD$|3AHHD$E1L9ryfAHtgH]I9v^M1HI)L蛵HL$HDHHH)HLIuHt5LHt*H3Ht"HjuH[]A\A]fDIt I,$HuH1[]A\A]@HSHt.H?t(H1@HH:u S@HIH[@HSHtH;Ht Hu[f.dH%HtQƴH~ dH%Zù@* @@]ffff.ATHUSHt^HHt=HIH¸Ht1I9rI)HJ<#[]A\ù@5 @@@4 @|@ffff.Sy+蛰ux[[ùԉ@C @"@sATUSUHD uD#[]A\ù@W @*@3AUIATAUSHfPƳDL蛰yE(u)uԽH[]A\A]É[趯(@H[]A\A]Ð)xuĉ'DHuHH!@HtH花Hd%tSد1j9Dd%[ffffff.ATUSHHHHD$HI~ҮHt$1HHHT$Ht(:u#Uu4H9u=A $H[]A\fDUuH[]A\ÐH[]A\ݹ@ @@@P@ @|@7wHcH@1DUHSHHD$ tj1H<@Ht Ht7HHuHt$ Hx%T$ FH[]fDH[]ø㹠@ @|@wAWAVIAUIATUHSHHH„uyIH1I9wDO<,HT$IݯHHHT$t%LHH肯J<#LLsB;HHH[]A\A]A^A_fuHLL[]A\A]A^A_sH[]A\A]A^A_铮H[]A\A]A^A_ffff.UHSHHHtHHHHH[]1fff.ATIUSHPHHD$pHt$(HT$0HL$8LD$@HD$HD$ LL$HD$HD$袬Hl$H3ЃHT$H8Ht6wHHH9HËT$0rHD$H8HPHT$HuH{=HHHLHHD$pD$HD$HD$ HD$#DHT$L$H2Ht'իHNjL$0rHT$H2HBHD$HuHPH[]A\HP1[]A\ÿ蛭HtHP[]A\f.AUATUSHHHHIHkHSJ|(IFHItkLHHIJ4+K"H9rHfD HHH9v3 \uKLKxDB$Š@@HH\HL[]A\A]DCHЀ VHHCx@ J0YHH ȈB^ LHO LH? LH/ LH LH LHLHLH\LHCD@AwxCD@AwL0tDH H Jf.'LHo"LH_\CHLˈBHHCx@ x@wWx@v-\BxLHx@fH^7jH~HIE1@ @|@f.1)fAVHAUATUSHIHIHL@HHDHL4A`'1"LANIFH„D1\"tH t@tH 1uHH)IM:HI$[]A\A]A^\tKL@HuH t@tH 1uHL)IEI$L[]A\A]A^ffAVIFHt{1@\tC'tHt@tH1uHH)IU9HI $[]A\A]A^ffD[]A\A]1A^11h@ @m@h@ @F@h@ @}@ffffff.AUATUHSHHHHD߀;tD?t?IHHIHLHIEHHEHH[]A\A]H1[]A\A]G< v)G<vG<w+@G@G@Gf.G<w @GÐf.AWAAVIAUIATL%< UH-< SL)1HH%HtLLDAHH9uH[]A\A]A^A_ff.HHUsage: %s -D DESTROOTDIR [OPTION]... -a SOURCE... or: %s -D DESTROOTDIR [OPTION]... SOURCE DEST Install SOURCE to DEST in DESTROOTDIR with all needed dependencies. -D --destrootdir Install all files to DESTROOTDIR as the root -a --all Install all SOURCE arguments to DESTROOTDIR -o --optional If SOURCE does not exist, do not fail -d --dir SOURCE is a directory -l --ldd Also install shebang executables and libraries -R --resolvelazy Only install shebang executables and libraries for all SOURCE files -H --fips Also install all '.SOURCE.hmac' files -v --verbose Show more output --debug Show debug output --version Show package version -h --help Show this help Example: # mkdir -p /var/tmp/test-root # %s -D /var/tmp/test-root --ldd -a sh tr # tree /var/tmp/test-root /var/tmp/test-root |-- lib64 -> usr/lib64 `-- usr |-- bin | |-- bash | |-- sh -> bash | `-- tr `-- lib64 |-- ld-2.15.90.so |-- ld-linux-x86-64.so.2 -> ld-2.15.90.so |-- libc-2.15.90.so |-- libc.so |-- libc.so.6 -> libc-2.15.90.so |-- libdl-2.15.90.so |-- libdl.so -> libdl-2.15.90.so |-- libdl.so.2 -> libdl-2.15.90.so |-- libtinfo.so.5 -> libtinfo.so.5.9 `-- libtinfo.so.5.9 convert_abs_rel(): target '%s' directory has no realpath.you do not have execution permissionERROR: failed to install '%s' for '%s'hash hit items_failed for '%s''%s' already exists, but checking for any depsERROR: failed to create directory '%s'Failed: cp --reflink=auto --sparse=auto --preserve=mode,timestamps -fL %s %sEnvironment DESTROOTDIR or argument -D is not set!Environment DESTROOTDIR or argument -D is set to '/'!Environment DESTROOTDIR or argument -D is set to '%s': %mERROR: installing '%s' to '%s'install/dracut-install.c%s/%sOut of memory!.soScript install: '%s'ERROR: failed to install '%s'ldd %s 2>&1ldd: '%s'not a dynamic executableloader cannot load itselfnot regular filecannot read header=>Lib install: '%s'.so./dracut_install('%s', '%s')hash hit items for '%s'%s%sERROR: stat '%s': %m'%s' already existsdest dir '%s' does not existmkdir '%s''%s' install errorlstat '%s': %mln -s '%s' '%s'ERROR: ln -s '%s' '%s': %mdracut_install ret = %dcp '%s' '%s'-fL--preserve=mode,timestamps--sparse=auto--reflink=autocpcp ret = %d/lib/fipscheck/lib64/fipscheck/lib/hmaccalc/lib64/hmaccalc%s/.%s.hmac%s/%s.hmachmac cp '%s' '%s')PATHPATH is not setPATH=%s:stat(%s) != 0find_binary(%s) == %siadhloD:HRNo SOURCE argument givenDESTROOTDIROut of memoryresolve_deps('%s')Handle '%s'dracut_install '%s'dracut_install '%s' OKERROR: installing '%s'dracut_install '%s' '%s'dracut_install '%s' '%s' OKhelpversiondebugverboselddresolvelazyoptionalallfipsdestrootdiritem_freeinstall_onefind_binaryinstall_alllibrary_installcphmac_installconvert_abs_relln_rdracut_installresolve_depsresolve_lazyparse_argv}@h}@~@d}@}@v}@l}@R}@o}@a}@H}@Dmaininstall/hashmap.chh->n_entries >= 1!h->iterate_list_headhash < 127hashmap_copyhashmap_move_onehashmap_movehashmap_mergehashmap_iterate_backwardshashmap_iteratehashmap_replacelink_entryhash_scanhashmap_putunlink_entryremove_entryhashmap_ensure_allocateddracut-install: /dev/consoleinstall/log.c(level & 0x07) == leveltarget >= 0target < _LOG_TARGET_MAXDRACUT_LOG_TARGETDRACUT_LOG_LEVELsafenullFailed to open /dev/console for logging: %sSuccessfully opened /dev/console for logging.Assertion '%s' failed at %s:%u, function %s(). Aborting.Code should not be reached '%s' at %s:%u, function %s(). Aborting.Failed to parse log target %s. Ignoring.Failed to parse log level %s. Ignoring.log_target_from_stringlog_parse_environmentlog_set_targetlog_set_max_levellog_open_console@|@@@install/strv.cnames || l <= 0i == cstrv_parse_nulstrstrv_remove_prefixstrv_removestrv_split_newlinesstrv_split_quotedstrv_splitstrv_find_prefixstrv_findinstall/util.cpostfixfd >= 0close_nointr(fd) == 0ret_ustate emergalertcriterrwarningnoticeinfo(r = sysconf(_SC_PAGESIZE)) > 0l@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@m@n@n@n@n@m@n@n@n@n@n@n@n@n@m@m@m@m@m@m@m@m@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@n@m@n@n@n@n@pm@`m@n@n@n@Pm@n@n@n@n@n@n@n@@m@n@n@n@0m@ m@m@n@m@n@l@split_quotedcunescape_length_with_prefixlog_level_from_stringsafe_atouclose_nointr_nofailclose_nointrendswithpage_sizeQ@W@]@b@f@n@u@}@;p@`' P8  p( @`0 8 P0p8x( x   ( @@ `X x  0 `  X x p @ 0 pX p  0 @ Pp X@x`@Px@0`PP@ `H`` @ `@8P`p@`@(h Hp`xzRx w*zRx $00FJ w?;*3$"D(H\0FD} A CD|`hBBE A(G0G 0A(A BBBA LBBB B(A0A8G 8C0A(B BBBK L BOB K(A0D8Oc 8D0A(B BBBF LdjBBE E(A0A8G`1 8C0A(B BBBD 4BAI Gl  DABA ALBBB B(A0D8F` 8A0A(B BBBA TتlЪتD_ E De G ,xAAG0e AAA 4BDD x ABK A ADA 4,@ADD ` AAE D DAE d(|Э,ȭBDD  ABH $(JDN F X A P#D^ `9Db J DL,BBA D(D0\ (C ABBG q (F ABDJ <|@BDA M ABI J ABE ,dAAG P AAE ,аtAAG ^ AAG L BBB B(D0A8D@ 8C0A(B BBBJ LlBBB B(A0A8G@ 8A0A(B BBBH 4pBDA U DEK LAEȲt @}d,$dBDA T ABB Tl#OM.Ah #OL084,@rADD | AAI D CAA <dBEB D(A0m (A BBBF L8BHB A(A0 (A BBDH A (A BDDD ,mAAG o AAF <$(BBD A(D@x (A ABBA 4dBAD Dp  AABJ `\AMG@$AAU J P H ȷ< BEA A(Gw (A ABBA T (Gx$t GI H W A  D *Q D JDS A  HDV P4 HL @4d HADD0^ AAG D CAA  'DV F $ A} J O Y  8 4 0kBGA t DBD C DBA L4 hBEA A(D0Q (D ABBI D (C DBBA 4 GADD l DAF DAAL кBBA A(G0p (C ABBA i (A ABBA  @$L$ XvBBA D(DP (D ABBE L (C ABBD t G| ;BBB E(A0G8D@ 8A0A(B BBBG l 8D0A(B BBBA G 8A0A(B BBBE | ȽVBBB B(D0D8D@ 8A0A(B BBBB o 8D0A(B BBBD ` 8A0A(B BBBE L 6BBA D(D@ (A ABBE Q (D ABBA L 6BBA D(D@ (A ABBG Q (D ABBA ,4AAD f AAA <dBEE A(D0 (A BBBA tBEE A(A0~ (A BBBA y (A BBBA A (A BIBE A (A BBBE <0BDA \ ABJ Q ADA ,\_IGD0`ABI0<BHB A(A0g (A BBBA $CADD tDAL8BEB B(A0A8D@ 8A0A(B BBBA |DBBB B(A0A8GP 8C0A(B BBBE P 8A0A(B BBBF T 8K0A(B BBBE ,}AG P CE N AA L(|BBD A(D0A (F ABBG S(C ABBDX<Dwdx%D`CPY A ,BDA F ABA $MCe H C A ,@=BAC Z ABA L,PBED A(I0@ (C ABBA V (C CBBB |0aNASmTBAA G0`  CABG P  CABB D  CADD  p4$xADD0^ AAG D CAA \BBE E(A0D8DPr 8D0A(B BBBJ H 8G0A(B BBBH D 8K0A(B BBBH D8A0A(B BBB,P4ADG T GAH L`fBDA Dp&  DABH D  CABA V AAB<lBBA A(G0 (D ABBF tBEB A(A0 (A BBBH F (A BBBC e (A BBBD a (A BBDA L<mBBA D(D0B (D ABBH D(C ABBFDeBEE E(H0H8M@l8A0A(B BBB80#@#@ (@ Dr@``@o@ @8@  `0@@` o@oo@`f@v@@@@@@@@@@@&@6@F@V@f@v@@@@@@@@@@@&@6@F@V@f@v@@@@@@@@@@@&@6@F@V@f@v@@@@@@@@@@@&@6@F@V@f@v@dracut-install.debug@H.shstrtab.interp.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.text.fini.rodata.eh_frame_hdr.eh_frame.tbss.init_array.fini_array.jcr.dynamic.got.got.plt.data.bss.gnu_debuglink p@p@ !@$8@04o@4> 8@8F @ No@[o@j@`t@0 ~(@(yP@P0@WDr@Dr `r@`r @@@Ѝ@ЍL```````((`($``Lp Lh070701000F0060000041ED000000000000000000000045556432B600000000000000FD0000000000000000000000000000003B00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d070701000F0192000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98usrmount070701000F0193000081ED0000000000000000000000015329C2C800000194000000FD0000000000000000000000000000005600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98usrmount/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { [[ $mount_needs ]] && return 1 return 0 } # called by dracut depends() { echo 'fs-lib' } # called by dracut install() { if ! dracut_module_included "systemd"; then inst_hook pre-pivot 50 "$moddir/mount-usr.sh" fi : } 070701000F0194000081ED0000000000000000000000015329C2C800000E6C000000FD0000000000000000000000000000005300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98usrmount/mount-usr.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type info >/dev/null 2>&1 || . /lib/dracut-lib.sh type fsck_single >/dev/null 2>&1 || . /lib/fs-lib.sh filtersubvol() { local _oldifs _oldifs="$IFS" IFS="," set $* IFS="$_oldifs" while [ $# -gt 0 ]; do case $1 in subvol\=*) :;; *) echo -n "${1}," ;; esac shift done } fsck_usr() { local _dev=$1 local _fs=$2 local _fsopts=$3 local _fsckoptions if [ -f "$NEWROOT"/fsckoptions ]; then _fsckoptions=$(cat "$NEWROOT"/fsckoptions) fi if [ -f "$NEWROOT"/forcefsck ] || getargbool 0 forcefsck ; then _fsckoptions="-f $_fsckoptions" elif [ -f "$NEWROOT"/.autofsck ]; then [ -f "$NEWROOT"/etc/sysconfig/autofsck ] && . "$NEWROOT"/etc/sysconfig/autofsck if [ "$AUTOFSCK_DEF_CHECK" = "yes" ]; then AUTOFSCK_OPT="$AUTOFSCK_OPT -f" fi if [ -n "$AUTOFSCK_SINGLEUSER" ]; then warn "*** Warning -- the system did not shut down cleanly. " warn "*** Dropping you to a shell; the system will continue" warn "*** when you leave the shell." action_on_fail fi _fsckoptions="$AUTOFSCK_OPT $_fsckoptions" fi fsck_single "$_dev" "$_fs" "$_fsopts" "$_fsckoptions" } mount_usr() { local _dev _mp _fs _opts _rest _usr_found _ret _freq _passno # check, if we have to mount the /usr filesystem while read _dev _mp _fs _opts _freq _passno; do [ "${_dev%%#*}" != "$_dev" ] && continue if [ "$_mp" = "/usr" ]; then case "$_dev" in LABEL=*) _dev="$(echo $_dev | sed 's,/,\\x2f,g')" _dev="/dev/disk/by-label/${_dev#LABEL=}" ;; UUID=*) _dev="${_dev#block:}" _dev="/dev/disk/by-uuid/${_dev#UUID=}" ;; esac if strstr "$_opts" "subvol=" && \ [ "${root#block:}" -ef $_dev ] && \ [ -n "$rflags" ]; then # for btrfs subvolumes we have to mount /usr with the same rflags rflags=$(filtersubvol "$rflags") rflags=${rflags%%,} _opts="${_opts:+${_opts},}${rflags}" elif getargbool 0 ro; then # if "ro" is specified, we want /usr to be mounted read-only _opts="${_opts:+${_opts},}ro" elif getargbool 0 rw; then # if "rw" is specified, we want /usr to be mounted read-write _opts="${_opts:+${_opts},}rw" fi echo "$_dev ${NEWROOT}${_mp} $_fs ${_opts} $_freq $_passno" _usr_found="1" break fi done < "$NEWROOT/etc/fstab" >> /etc/fstab if [ "$_usr_found" != "" ]; then # we have to mount /usr _fsck_ret=0 if ! getargbool 0 rd.skipfsck; then if [ "0" != "${_passno:-0}" ]; then fsck_usr "$_dev" "$_fs" "$_opts" _fsck_ret=$? [ $_fsck_ret -ne 255 ] && echo $_fsck_ret >/run/initramfs/usr-fsck fi fi info "Mounting /usr with -o $_opts" mount "$NEWROOT/usr" 2>&1 | vinfo if ! ismounted "$NEWROOT/usr"; then warn "Mounting /usr to $NEWROOT/usr failed" warn "*** Dropping you to a shell; the system will continue" warn "*** when you leave the shell." action_on_fail fi fi } if [ -f "$NEWROOT/etc/fstab" ]; then mount_usr fi 070701000F01A3000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/99shutdown070701000F01A4000081ED0000000000000000000000015329C2C8000002AC000000FD0000000000000000000000000000005600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/99shutdown/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { return 0 } # called by dracut depends() { echo base return 0 } # called by dracut install() { local _d inst_multiple umount poweroff reboot halt losetup inst_multiple -o kexec inst "$moddir/shutdown.sh" "$prefix/shutdown" [ -e "${initdir}/lib" ] || mkdir -m 0755 -p ${initdir}/lib mkdir -m 0755 -p ${initdir}/lib/dracut mkdir -m 0755 -p ${initdir}/lib/dracut/hooks for _d in $hookdirs shutdown shutdown-emergency; do mkdir -m 0755 -p ${initdir}/lib/dracut/hooks/$_d done } 070701000F01A5000081ED0000000000000000000000015329C2C800000BE1000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/99shutdown/shutdown.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # # Licensed under the GPLv2 # # Copyright 2011, Red Hat, Inc. # Harald Hoyer ACTION="$1" [ -w /dev/console ] && exec >/dev/console 2>>/dev/console export TERM=linux export PATH=/usr/sbin:/usr/bin:/sbin:/bin . /lib/dracut-lib.sh mkdir /oldsys for i in sys proc run dev; do mkdir /oldsys/$i mount --move /oldroot/$i /oldsys/$i done # if "kexec" was installed after creating the initramfs, we try to copy it from the real root # libz normally is pulled in via kmod/modprobe and udevadm if [ "$ACTION" = "kexec" ] && ! command -v kexec >/dev/null 2>&1; then for p in /usr/sbin /usr/bin /sbin /bin; do cp -a /oldroot/${p}/kexec $p >/dev/null 2>&1 && break done hash kexec fi trap "emergency_shell --shutdown shutdown Signal caught!" 0 getarg 'rd.break=pre-shutdown' && emergency_shell --shutdown pre-shutdown "Break before pre-shutdown" source_hook pre-shutdown warn "Killing all remaining processes" killall_proc_mountpoint /oldroot umount_a() { local _did_umount="n" while read a mp a; do if strstr "$mp" oldroot; then if umount "$mp"; then _did_umount="y" warn "Unmounted $mp." fi fi done /dev/null || break _cnt=$(($_cnt+1)) done [ $_cnt -ge 40 ] && umount_a if strstr "$(cat /proc/mounts)" "/oldroot"; then warn "Cannot umount /oldroot" for _pid in /proc/*; do _pid=${_pid##/proc/} case $_pid in *[!0-9]*) continue;; esac [ $_pid -eq $$ ] && continue [ -e "/proc/$_pid/exe" ] || continue [ -e "/proc/$_pid/root" ] || continue if strstr "$(ls -l /proc/$_pid /proc/$_pid/fd 2>/dev/null)" "oldroot"; then warn "Blocking umount of /oldroot [$_pid] $(cat /proc/$_pid/cmdline)" else warn "Still running [$_pid] $(cat /proc/$_pid/cmdline)" fi ls -l "/proc/$_pid/exe" 2>&1 | vwarn ls -l "/proc/$_pid/fd" 2>&1 | vwarn done fi _check_shutdown() { local __f local __s=1 for __f in $hookdir/shutdown/*.sh; do [ -e "$__f" ] || continue ( . "$__f" $1 ) if [ $? -eq 0 ]; then rm -f -- $__f __s=0 fi done return $__s } while _check_shutdown; do : done _check_shutdown final getarg 'rd.break=shutdown' && emergency_shell --shutdown shutdown "Break before shutdown" case "$ACTION" in reboot|poweroff|halt) $ACTION -f -d -n warn "$ACTION failed!" ;; kexec) kexec -e warn "$ACTION failed!" reboot -f -d -n ;; *) warn "Shutdown called with argument '$ACTION'. Rebooting!" reboot -f -d -n ;; esac emergency_shell --shutdown shutdown 070701000F0069000041ED000000000000000000000002555B5D0200000000000000FD0000000000000000000000000000004200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/02caps070701000F019D000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/99fs-lib070701000F019E000081ED0000000000000000000000015329C2C8000018CB000000FD0000000000000000000000000000004E00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/99fs-lib/fs-lib.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh fsck_ask_reboot() { info "note - fsck suggests reboot, if you" info "leave shell, booting will continue normally" action_on_fail -n "(reboot ?)" } fsck_ask_err() { warn "*** An error occurred during the file system check." warn "*** Dropping you to a shell; the system will try" warn "*** to mount the filesystem(s), when you leave the shell." action_on_fail -n "(Repair filesystem)" } # inherits: _ret _drv _out fsck_tail() { [ $_ret -gt 0 ] && warn "$_drv returned with $_ret" if [ $_ret -ge 4 ]; then [ -n "$_out" ] && echo "$_out"|vwarn fsck_ask_err else [ -n "$_out" ] && echo "$_out"|vinfo [ $_ret -ge 2 ] && fsck_ask_reboot fi } # note: this function sets _drv of the caller fsck_able() { case "$1" in xfs) # { # type xfs_db && # type xfs_repair && # type xfs_check && # type mount && # type umount # } >/dev/null 2>&1 && # _drv="_drv=none fsck_drv_xfs" && # return 0 return 1 ;; ext?) type e2fsck >/dev/null 2>&1 && _drv="_drv=e2fsck fsck_drv_com" && return 0 ;; jfs) type jfs_fsck >/dev/null 2>&1 && _drv="_drv=jfs_fsck fsck_drv_com" && return 0 ;; reiserfs) type reiserfsck >/dev/null 2>&1 && _drv="_drv=reiserfsck fsck_drv_com" && return 0 ;; btrfs) # type btrfsck >/dev/null 2>&1 && # _drv="_drv=none fsck_drv_btrfs" && # return 0 return 1 ;; nfs*) # nfs can be a nop, returning success _drv="_drv=none :" && return 0 ;; *) type fsck >/dev/null 2>&1 && _drv="_drv=fsck fsck_drv_std" && return 0 ;; esac return 1 } # note: all drivers inherit: _drv _fop _dev fsck_drv_xfs() { # xfs fsck is not necessary... Either it mounts or not return 0 } fsck_drv_btrfs() { # btrfs fsck is not necessary... Either it mounts or not return 0 } # common code for checkers that follow usual subset of options and return codes fsck_drv_com() { local _ret local _out if ! strstr "$_fop" "-[ynap]"; then _fop="-a ${_fop}" fi info "issuing $_drv $_fop $_dev" # we enforce non-interactive run, so $() is fine _out=$($_drv $_fop "$_dev") _ret=$? fsck_tail return $_ret } # code for generic fsck, if the filesystem checked is "unknown" to us fsck_drv_std() { local _ret local _out unset _out info "issuing fsck $_fop $_dev" # note, we don't enforce -a here, thus fsck is being run (in theory) # interactively; otherwise some tool might complain about lack of terminal # (and using -a might not be safe) fsck $_fop "$_dev" >/dev/console 2>&1 _ret=$? fsck_tail return $_ret } # checks single filesystem, relying on specific "driver"; we don't rely on # automatic checking based on fstab, so empty one is passed; # takes 4 arguments - device, filesystem, filesystem options, additional fsck options; # first 2 arguments are mandatory (fs may be auto or "") # returns 255 if filesystem wasn't checked at all (e.g. due to lack of # necessary tools or insufficient options) fsck_single() { local FSTAB_FILE=/etc/fstab.empty local _dev="$1" local _fs="${2:-auto}" local _fsopts="$3" local _fop="$4" local _drv [ $# -lt 2 ] && return 255 # if UUID= marks more than one device, take only the first one [ -e "$_dev" ] || _dev=$(devnames "$_dev"| while read line; do if [ -n "$line" ]; then echo $line; break;fi;done) [ -e "$_dev" ] || return 255 _fs=$(det_fs "$_dev" "$_fs") fsck_able "$_fs" || return 255 info "Checking $_fs: $_dev" export FSTAB_FILE eval "$_drv" return $? } # takes list of filesystems to check in parallel; we don't rely on automatic # checking based on fstab, so empty one is passed fsck_batch() { local FSTAB_FILE=/etc/fstab.empty local _drv=fsck local _dev local _ret local _out [ $# -eq 0 ] || ! type fsck >/dev/null 2>&1 && return 255 info "Checking filesystems (fsck -M -T -a):" for _dev in "$@"; do info " $_dev" done export FSTAB_FILE _out="$(fsck -M -T "$@" -- -a)" _ret=$? fsck_tail return $_ret } # verify supplied filesystem type: # if user provided the fs and we couldn't find it, assume user is right # if we found the fs, assume we're right det_fs() { local _dev="$1" local _orig="${2:-auto}" local _fs _fs=$(udevadm info --query=env --name="$_dev" | \ while read line; do if str_starts $line "ID_FS_TYPE="; then echo ${line#ID_FS_TYPE=} break fi done) _fs=${_fs:-auto} if [ "$_fs" = "auto" ]; then _fs="$_orig" fi echo "$_fs" } write_fs_tab() { local _o local _rw local _root local _rootfstype local _rootflags local _fspassno _fspassno="0" _root="$1" _rootfstype="$2" _rootflags="$3" [ -z "$_rootfstype" ] && _rootfstype=$(getarg rootfstype=) [ -z "$_rootflags" ] && _rootflags=$(getarg rootflags=) [ -z "$_rootfstype" ] && _rootfstype="auto" if [ -z "$_rootflags" ]; then _rootflags="ro,x-initrd.mount" else _rootflags="ro,$_rootflags,x-initrd.mount" fi _rw=0 CMDLINE=$(getcmdline) for _o in $CMDLINE; do case $_o in rw) _rw=1;; ro) _rw=0;; esac done if [ "$_rw" = "1" ]; then _rootflags="$_rootflags,rw" if ! getargbool 0 rd.skipfsck; then _fspassno="1" fi fi echo "$_root /sysroot $_rootfstype $_rootflags $_fspassno 0" >> /etc/fstab if type systemctl >/dev/null 2>/dev/null; then systemctl daemon-reload systemctl --no-block start initrd-root-fs.target fi } 070701000F019F000081ED000000000000000000000001555B5D02000006D6000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/99fs-lib/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { return 0 } # called by dracut depends() { return 0 } echo_fs_helper() { local dev=$1 fs=$2 case "$fs" in xfs) echo -n " xfs_db xfs_repair xfs_check xfs_metadump" ;; ext?) echo -n " e2fsck " ;; jfs) echo -n " jfs_fsck " ;; reiserfs) echo -n " reiserfsck " ;; btrfs) echo -n " btrfsck " ;; esac echo -n " fsck.$fs " return 0 } include_fs_helper_modules() { local dev=$1 fs=$2 case "$fs" in xfs|btrfs) instmods crc32c ;; esac } # called by dracut installkernel() { # xfs and btrfs needs crc32c... if [[ $hostonly ]]; then for_each_host_dev_fs include_fs_helper_modules : else instmods crc32c fi } # called by dracut install() { local _helpers inst "$moddir/fs-lib.sh" "/lib/fs-lib.sh" > ${initdir}/etc/fstab.empty [[ "$nofscks" = "yes" ]] && return if [[ "$fscks" = "${fscks#*[^ ]*}" ]]; then _helpers="\ umount mount /sbin/fsck* xfs_db xfs_check xfs_repair xfs_metadump e2fsck jfs_fsck reiserfsck btrfsck " if [[ $hostonly ]]; then _helpers="umount mount " _helpers+=$(for_each_host_dev_fs echo_fs_helper) fi else _helpers="$fscks" fi if [[ "$_helpers" == *e2fsck* ]] && [ -e /etc/e2fsck.conf ]; then inst_simple /etc/e2fsck.conf fi inst_multiple -o $_helpers fsck } 070701000F0117000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95fcoe070701000F0120000081ED000000000000000000000001555B5D020000070D000000FD0000000000000000000000000000005000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95fcoe/parse-fcoe.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # # Supported formats: # fcoe=: # fcoe=: # # Note currently only nodcb is supported, the dcb option is reserved for # future use. # # Note letters in the macaddress must be lowercase! # # Examples: # fcoe=eth0:nodcb # fcoe=4a:3f:4c:04:f8:d7:nodcb [ -z "$fcoe" ] && fcoe=$(getarg fcoe=) # If it's not set we don't continue [ -z "$fcoe" ] && return # BRCM: Later, should check whether bnx2x is loaded first before loading bnx2fc so do not load bnx2fc when there are no Broadcom adapters [ -d /sys/module/fcoe ] || modprobe -a fcoe || die "FCoE requested but kernel/initrd does not support FCoE" modprobe bnx2fc >/dev/null 2>&1 udevadm settle --timeout=30 parse_fcoe_opts() { local OLDIFS="$IFS" local IFS=: set $fcoe IFS="$OLDIFS" case $# in 2) fcoe_interface=$1 fcoe_dcb=$2 return 0 ;; 7) fcoe_mac=$1:$2:$3:$4:$5:$6 fcoe_dcb=$7 return 0 ;; *) warn "Invalid arguments for fcoe=$fcoe" return 1 ;; esac } parse_fcoe_opts if [ "$fcoe_interface" = "edd" ]; then if [ "$fcoe_dcb" != "nodcb" -a "$fcoe_dcb" != "dcb" ] ; then warn "Invalid FCoE DCB option: $fcoe_dcb" fi /sbin/initqueue --settled --unique /sbin/fcoe-edd $fcoe_dcb else for fcoe in $(getargs fcoe=); do unset fcoe_mac unset fcoe_interface parse_fcoe_opts if [ "$fcoe_dcb" != "nodcb" -a "$fcoe_dcb" != "dcb" ] ; then warn "Invalid FCoE DCB option: $fcoe_dcb" fi . $(command -v fcoe-genrules.sh) done fi 070701000F011E000081ED000000000000000000000001555B5D020000016B000000FD0000000000000000000000000000004C00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95fcoe/lldpad.sh#!/bin/bash # Note lldpad will stay running after switchroot, the system initscripts # are to kill it and start a new lldpad to take over. Data is transfered # between the 2 using a shm segment lldpad -d # wait for lldpad to be ready i=0 while [ $i -lt 60 ]; do lldptool -p && break info "Waiting for lldpad to be ready" sleep 1 i=$(($i+1)) done 070701000F011F000081ED000000000000000000000001555B5D020000082A000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95fcoe/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh get_vlan_parent() { local link=$1 [ -d $link ] || return read iflink < $link/iflink for if in /sys/class/net/* ; do read idx < $if/ifindex if [ $idx -eq $iflink ] ; then echo ${if##*/} fi done } # called by dracut cmdline() { for c in /sys/bus/fcoe/devices/ctlr_* ; do [ -L $c ] || continue read enabled < $c/enabled [ $enabled -eq 0 ] && continue d=$(cd -P $c; echo $PWD) i=${d%/*} read mac < ${i}/address s=$(dcbtool gc ${i##*/} dcb | sed -n 's/^DCB State:\t*\(.*\)/\1/p') if [ -z "$s" ] ; then p=$(get_vlan_parent ${i}) if [ "$p" ] ; then s=$(dcbtool gc ${p} dcb | sed -n 's/^DCB State:\t*\(.*\)/\1/p') fi fi if [ "$s" = "on" ] ; then dcb="dcb" else dcb="nodcb" fi echo "fcoe=${mac}:${dcb}" done } # called by dracut check() { [[ $hostonly ]] || [[ $mount_needs ]] && { for c in /sys/bus/fcoe/devices/ctlr_* ; do [ -L $c ] || continue fcoe_ctlr=$c done [ -z "$fcoe_ctlr" ] && return 255 } require_binaries dcbtool fipvlan lldpad ip readlink || return 1 return 0 } # called by dracut depends() { echo network rootfs-block return 0 } # called by dracut installkernel() { instmods fcoe 8021q edd } # called by dracut install() { inst_multiple ip dcbtool fipvlan lldpad readlink lldptool mkdir -m 0755 -p "$initdir/var/lib/lldpad" if [[ $hostonly_cmdline == "yes" ]] ; then local _fcoeconf=$(cmdline) [[ $_fcoeconf ]] && printf "%s\n" "$_fcoeconf" >> "${initdir}/etc/cmdline.d/95fcoe.conf" fi inst "$moddir/fcoe-up.sh" "/sbin/fcoe-up" inst "$moddir/fcoe-edd.sh" "/sbin/fcoe-edd" inst "$moddir/fcoe-genrules.sh" "/sbin/fcoe-genrules.sh" inst_hook pre-trigger 03 "$moddir/lldpad.sh" inst_hook cmdline 99 "$moddir/parse-fcoe.sh" dracut_need_initqueue } 070701000F011B000081ED0000000000000000000000015329C2C800000274000000FD0000000000000000000000000000004E00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95fcoe/fcoe-edd.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh dcb=$1 if ! [ -d /sys/firmware/edd ]; then modprobe edd while ! [ -d /sys/firmware/edd ]; do sleep 0.1; done fi for disk in /sys/firmware/edd/int13_*; do [ -d $disk ] || continue for nic in ${disk}/pci_dev/net/*; do [ -d $nic ] || continue if [ -e ${nic}/address ]; then fcoe_interface=${nic##*/} if ! [ -e "/tmp/.fcoe-$fcoe_interface" ]; then /sbin/fcoe-up $fcoe_interface $dcb > "/tmp/.fcoe-$fcoe_interface" fi fi done done modprobe -r edd 070701000F011C000081ED000000000000000000000001555B5D0200000331000000FD0000000000000000000000000000005300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95fcoe/fcoe-genrules.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # We use (fcoe_interface or fcoe_mac) and fcoe_dcb as set by parse-fcoe.sh # If neither mac nor interface are set we don't continue [ -z "$fcoe_interface" -a -z "$fcoe_mac" ] && return # Write udev rules { if [ -n "$fcoe_mac" ] ; then printf 'ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="%s", RUN+="/sbin/initqueue --onetime --unique --name fcoe-up-$env{INTERFACE} /sbin/fcoe-up $env{INTERFACE} %s"\n' "$fcoe_mac" "$fcoe_dcb" else printf 'ACTION=="add", SUBSYSTEM=="net", NAME=="%s", RUN+="/sbin/initqueue --onetime --unique --name fcoe-up-$env{INTERFACE} /sbin/fcoe-up $env{INTERFACE} %s"\n' "$fcoe_interface" "$fcoe_dcb" fi } >> /etc/udev/rules.d/92-fcoe.rules 070701000F011D000081ED000000000000000000000001555B5D02000006B8000000FD0000000000000000000000000000004D00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95fcoe/fcoe-up.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # # We get called like this: # fcoe-up # # Note currently only nodcb is supported, the dcb option is reserved for # future use. PATH=/usr/sbin:/usr/bin:/sbin:/bin type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh type ip_to_var >/dev/null 2>&1 || . /lib/net-lib.sh # Huh? Missing arguments ?? [ -z "$1" -o -z "$2" ] && exit 1 netif=$1 dcb=$2 iflink=$(cat /sys/class/net/$netif/iflink) ifindex=$(cat /sys/class/net/$netif/ifindex) if [ "$iflink" != "$ifindex" ] ; then # Skip VLAN devices exit 0 fi ip link set dev $netif up linkup "$netif" netdriver=$(readlink -f /sys/class/net/$netif/device/driver) netdriver=${netdriver##*/} if [ "$dcb" = "dcb" ]; then # wait for lldpad to be ready i=0 while [ $i -lt 60 ]; do lldptool -p && break info "Waiting for lldpad to be ready" sleep 1 i=$(($i+1)) done while [ $i -lt 60 ]; do dcbtool sc "$netif" dcb on && break info "Retrying to turn dcb on" sleep 1 i=$(($i+1)) done while [ $i -lt 60 ]; do dcbtool sc "$netif" app:fcoe e:1 a:1 w:1 && break info "Retrying to turn fcoe on" sleep 1 i=$(($i+1)) done sleep 1 fipvlan "$netif" -c -s elif [ "$netdriver" = "bnx2x" ]; then # If driver is bnx2x, do not use /sys/module/fcoe/parameters/create but fipvlan modprobe 8021q udevadm settle --timeout=30 # Sleep for 3 s to allow dcb negotiation sleep 3 fipvlan "$netif" -c -s else echo -n "$netif" > /sys/module/fcoe/parameters/create fi need_shutdown 070701000F006A000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/03modsign070701000F006C000081ED0000000000000000000000015329C2C80000034F000000FD0000000000000000000000000000005500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/03modsign/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # # Licensed under the GPLv2 # # Copyright 2013 Red Hat, Inc. # Peter Jones # called by dracut check() { require_binaries keyctl || return 1 # do not include module in hostonly mode, # if no keys are present if [[ $hostonly ]]; then x=$(echo /lib/modules/keys/*) [[ "${x}" = "/lib/modules/keys/*" ]] && return 255 fi return 0 } # called by dracut depends() { return 0 } # called by dracut install() { inst_dir /lib/modules/keys inst_binary /usr/bin/keyctl inst_hook pre-trigger 01 "$moddir/load-modsign-keys.sh" for x in /lib/modules/keys/* ; do [[ "${x}" = "/lib/modules/keys/*" ]] && break inst_simple "${x}" done } 070701000F006B000081ED0000000000000000000000015329C2C800000158000000FD0000000000000000000000000000005A00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/03modsign/load-modsign-keys.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # # Licensed under the GPLv2 # # Copyright 2013 Red Hat, Inc. # Peter Jones for x in /lib/modules/keys/* ; do [ "${x}" = "/lib/modules/keys/*" ] && break keyctl padd asymmetric "" @s < ${x} done 070701000F00F7000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90qemu-net070701000F00F8000081ED0000000000000000000000015329C2C800000311000000FD0000000000000000000000000000005600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90qemu-net/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { if type -P systemd-detect-virt >/dev/null 2>&1; then vm=$(systemd-detect-virt --vm >/dev/null 2>&1) (($? != 0)) && return 255 [[ $vm = "qemu" ]] && return 0 [[ $vm = "kvm" ]] && return 0 [[ $vm = "bochs" ]] && return 0 fi for i in /sys/class/dmi/id/*_vendor; do [[ -f $i ]] || continue read vendor < $i [[ "$vendor" == "QEMU" ]] && return 0 [[ "$vendor" == "Bochs" ]] && return 0 done return 255 } # called by dracut installkernel() { # qemu specific modules hostonly='' instmods virtio_net e1000 8139cp pcnet32 e100 ne2k_pci } 070701000F0100000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/91zipl070701000F0102000081ED000000000000000000000001555B5D0200000550000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/91zipl/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { local _arch=$(uname -m) [ "$_arch" = "s390" -o "$_arch" = "s390x" ] || return 1 return 0 } # called by dracut depends() { echo grub2 return 0 } # called by dracut installkernel() { local _boot_zipl _boot_zipl=$(sed -n 's/\(.*\)\w*\/boot\/zipl.*/\1/p' /etc/fstab) if [ -n "$_boot_zipl" ] ; then eval $(blkid -s TYPE -o udev ${_boot_zipl}) if [ -n "$ID_FS_TYPE" ] ; then case "$ID_FS_TYPE" in ext?) ID_FS_TYPE=ext4 ;; esac instmods ${ID_FS_TYPE} fi fi } # called by dracut cmdline() { local _boot_zipl _boot_zipl=$(sed -n 's/\(.*\)\w*\/boot\/zipl.*/\1/p' /etc/fstab) if [ -n "$_boot_zipl" ] ; then echo "rd.zipl=${_boot_zipl}" fi } # called by dracut install() { inst_multiple mount umount inst_hook cmdline 91 "$moddir/parse-zipl.sh" inst_script "${moddir}/install_zipl_cmdline.sh" /sbin/install_zipl_cmdline.sh if [[ $hostonly_cmdline == "yes" ]] ; then local _zipl=$(cmdline) [[ $_zipl ]] && printf "%s\n" "$_zipl" > "${initdir}/etc/cmdline.d/91zipl.conf" fi dracut_need_initqueue } 070701000F0103000081ED000000000000000000000001555B5D020000051D000000FD0000000000000000000000000000005000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/91zipl/parse-zipl.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh zipl_arg=$(getarg rd.zipl) if [ -n "$zipl_arg" ] ; then case "$zipl_arg" in LABEL=*) \ zipl_env="ENV{ID_FS_LABEL}" zipl_val=${zipl_arg#LABEL=} zipl_arg="/dev/disk/by-label/${zipl_val}" ;; UUID=*) \ zipl_env="ENV{ID_FS_UUID}" zipl_val=${zipl_arg#UUID=} zipl_arg="/dev/disk/by-uuid/${zipl_val}" ;; /dev/mapper/*) \ zipl_env="ENV{DM_NAME}" zipl_val=${zipl_arg#/dev/mapper/} ;; /dev/disk/by-*) \ zipl_env="SYMLINK" zipl_val=${zipl_arg#/dev/} ;; /dev/*) \ zipl_env="KERNEL" zipl_val=${zipl_arg} ;; esac if [ "$zipl_env" ] ; then { printf 'ACTION=="add|change", SUBSYSTEM=="block", %s=="%s", RUN+="/sbin/initqueue --settled --onetime --unique --name install_zipl_cmdline /sbin/install_zipl_cmdline.sh %s"\n' \ ${zipl_env} ${zipl_val} ${zipl_arg} echo "[ -f /tmp/install.zipl.cmdline-done ]" >$hookdir/initqueue/finished/wait-zipl-conf.sh } >> /etc/udev/rules.d/99zipl-conf.rules cat /etc/udev/rules.d/99zipl-conf.rules fi wait_for_dev -n "$zipl_arg" fi 070701000F0101000081ED000000000000000000000001555B5D0200000271000000FD0000000000000000000000000000005A00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/91zipl/install_zipl_cmdline.sh#!/bin/bash DEV="$1" MNT=/boot/zipl if [ -z "$DEV" ] ; then echo "No IPL device given" > /tmp/install.zipl.cmdline-done exit 1 fi [ -d ${MNT} ] || mkdir -p ${MNT} mount -o ro ${DEV} ${MNT} if [ "$?" != "0" ] ; then echo "Failed to mount ${MNT}" > /tmp/install.zipl.cmdline-done exit 1 fi if [ -f ${MNT}/dracut-cmdline.conf ] ; then cp ${MNT}/dracut-cmdline.conf /etc/cmdline.d/99zipl.conf fi umount ${MNT} if [ -f /etc/cmdline.d/99zipl.conf ] ; then systemctl restart dracut-cmdline.service systemctl restart systemd-udev-trigger.service fi > /tmp/install.zipl.cmdline-done exit 0 070701000F0063000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004F00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/00systemd-bootchart070701000F0064000081ED0000000000000000000000015329C2C8000001B8000000FD0000000000000000000000000000005F00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/00systemd-bootchart/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { [[ "$mount_needs" ]] && return 1 require_binaries $systemdutildir/systemd-bootchart || return 1 return 255 } # called by dracut depends() { return 0 } # called by dracut install() { inst_symlink /init /sbin/init inst_multiple $systemdutildir/systemd-bootchart } 070701000F00E2000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90mdraid070701000F00EA000081ED0000000000000000000000015329C2C8000002C4000000FD0000000000000000000000000000005600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90mdraid/mdraid-cleanup.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh _offroot=$(strstr "$(mdadm --help-options 2>&1)" offroot && echo --offroot) containers="" for md in /dev/md[0-9_]*; do [ -b "$md" ] || continue udevinfo="$(udevadm info --query=env --name=$md)" strstr "$udevinfo" "DEVTYPE=partition" && continue if strstr "$udevinfo" "MD_LEVEL=container"; then containers="$containers $md" continue fi mdadm $_offroot -S "$md" >/dev/null 2>&1 done for md in $containers; do mdadm $_offroot -S "$md" >/dev/null 2>&1 done unset containers udevinfo _offroot 070701000F00EB000081ED0000000000000000000000015329C2C800000109000000FD0000000000000000000000000000005B00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90mdraid/mdraid-needshutdown.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh for md in /dev/md[0-9_]*; do [ -b "$md" ] || continue need_shutdown break done 070701000F00EE000081ED000000000000000000000001555B5D0200001086000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90mdraid/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { local _rootdev # No mdadm? No mdraid support. require_binaries mdadm || return 1 [[ $hostonly ]] || [[ $mount_needs ]] && { for dev in "${!host_fs_types[@]}"; do [[ "${host_fs_types[$dev]}" != *_raid_member ]] && continue DEVPATH=$(get_devpath_block "$dev") for holder in "$DEVPATH"/holders/*; do [[ -e "$holder" ]] || continue [[ -e "$holder/md" ]] && return 0 break done done return 255 } return 0 } # called by dracut depends() { echo rootfs-block return 0 } # called by dracut installkernel() { instmods =drivers/md } # called by dracut cmdline() { local _activated dev line UUID declare -A _activated for dev in "${!host_fs_types[@]}"; do [[ "${host_fs_types[$dev]}" != *_raid_member ]] && continue UUID=$( /sbin/mdadm --examine --export $dev \ | while read line; do [[ ${line#MD_UUID=} = $line ]] && continue printf "%s" "${line#MD_UUID=} " done ) [[ -z "$UUID" ]] && continue if ! [[ ${_activated[${UUID}]} ]]; then printf "%s" " rd.md.uuid=${UUID}" _activated["${UUID}"]=1 fi done } # called by dracut install() { local rule rule_path inst_multiple cat inst_multiple -o mdmon inst $(command -v partx) /sbin/partx inst $(command -v mdadm) /sbin/mdadm if [[ $hostonly_cmdline == "yes" ]]; then local _raidconf=$(cmdline) [[ $_raidconf ]] && printf "%s\n" "$_raidconf" >> "${initdir}/etc/cmdline.d/90mdraid.conf" fi # =mdadm-3.3 udev rules inst_rules 63-md-raid-arrays.rules 64-md-raid-assembly.rules # remove incremental assembly from stock rules, so they don't shadow # 65-md-inc*.rules and its fine-grained controls, or cause other problems # when we explicitly don't want certain components to be incrementally # assembled for rule in 64-md-raid.rules 64-md-raid-assembly.rules; do rule_path="${initdir}${udevdir}/rules.d/${rule}" [ -f "${rule_path}" ] && sed -i -r \ -e '/(RUN|IMPORT\{program\})\+?="[[:alpha:]/]*mdadm[[:blank:]]+(--incremental|-I)[[:blank:]]+(--export )?(\$env\{DEVNAME\}|\$tempnode|\$devnode)/d' \ "${rule_path}" done inst_rules "$moddir/65-md-incremental-imsm.rules" inst_rules "$moddir/59-persistent-storage-md.rules" prepare_udev_rules 59-persistent-storage-md.rules # guard against pre-3.0 mdadm versions, that can't handle containers if ! mdadm -Q -e imsm /dev/null >/dev/null 2>&1; then inst_hook pre-trigger 30 "$moddir/md-noimsm.sh" fi if ! mdadm -Q -e ddf /dev/null >/dev/null 2>&1; then inst_hook pre-trigger 30 "$moddir/md-noddf.sh" fi if [[ $hostonly ]] || [[ $mdadmconf = "yes" ]]; then if [ -f /etc/mdadm.conf ]; then inst /etc/mdadm.conf else [ -f /etc/mdadm/mdadm.conf ] && inst /etc/mdadm/mdadm.conf /etc/mdadm.conf fi if [ -d /etc/mdadm.conf.d ]; then local f inst_dir /etc/mdadm.conf.d for f in /etc/mdadm.conf.d/*.conf; do [ -f "$f" ] || continue inst "$f" done fi fi inst_hook pre-udev 30 "$moddir/mdmon-pre-udev.sh" inst_hook pre-trigger 30 "$moddir/parse-md.sh" inst_hook pre-mount 10 "$moddir/mdraid-waitclean.sh" inst_hook cleanup 99 "$moddir/mdraid-needshutdown.sh" inst_hook shutdown 30 "$moddir/md-shutdown.sh" inst_script "$moddir/mdraid-cleanup.sh" /sbin/mdraid-cleanup inst_script "$moddir/mdraid_start.sh" /sbin/mdraid_start if dracut_module_included "systemd"; then if [ -e $systemdsystemunitdir/mdmon@.service ]; then inst_simple $systemdsystemunitdir/mdmon@.service fi fi inst_hook pre-shutdown 30 "$moddir/mdmon-pre-shutdown.sh" } 070701000F00E9000081ED0000000000000000000000015329C2C8000000F0000000FD0000000000000000000000000000005600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90mdraid/mdmon-pre-udev.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # save state dir for mdmon/mdadm for the real root [ -d /run/mdadm ] || mkdir -m 0755 /run/mdadm # backward compat link 070701000F00ED000081ED0000000000000000000000015329C2C800000432000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90mdraid/mdraid_start.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh _md_force_run() { local _udevinfo local _path_s local _path_d local _offroot _offroot=$(strstr "$(mdadm --help-options 2>&1)" offroot && echo --offroot) # try to force-run anything not running yet for md in /dev/md[0-9_]*; do [ -b "$md" ] || continue _udevinfo="$(udevadm info --query=env --name="$md")" strstr "$_udevinfo" "MD_LEVEL=container" && continue strstr "$_udevinfo" "DEVTYPE=partition" && continue _path_s="/sys/$(udevadm info -q path -n "$md")/md/array_state" [ ! -r "$_path_s" ] && continue # inactive ? [ "$(cat "$_path_s")" != "inactive" ] && continue mdadm $_offroot -R "$md" 2>&1 | vinfo # still inactive ? [ "$(cat "$_path_s")" = "inactive" ] && continue _path_d="${_path_s%/*}/degraded" [ ! -r "$_path_d" ] && continue done } _md_force_run 070701000F00EF000081ED000000000000000000000001555B5D02000007BF000000FD0000000000000000000000000000005000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90mdraid/parse-md.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh MD_UUID=$(getargs rd.md.uuid -d rd_MD_UUID=) if ( ! [ -n "$MD_UUID" ] && ! getargbool 0 rd.auto ) || ! getargbool 1 rd.md -d -n rd_NO_MD; then info "rd.md=0: removing MD RAID activation" udevproperty rd_NO_MD=1 else # rewrite the md rules to only process the specified raid array if [ -n "$MD_UUID" ]; then for f in /etc/udev/rules.d/65-md-incremental*.rules; do [ -e "$f" ] || continue while read line; do if [ "${line%%UUID CHECK}" != "$line" ]; then printf 'IMPORT{program}="/sbin/mdadm --examine --export $tempnode"\n' for uuid in $MD_UUID; do printf 'ENV{MD_UUID}=="%s", GOTO="md_uuid_ok"\n' $uuid done; printf 'GOTO="md_end"\n' printf 'LABEL="md_uuid_ok"\n' else echo "$line" fi done < "${f}" > "${f}.new" mv "${f}.new" "$f" done fi fi if [ -e /etc/mdadm.conf ] && getargbool 1 rd.md.conf -d -n rd_NO_MDADMCONF; then udevproperty rd_MDADMCONF=1 rm -f -- $hookdir/pre-pivot/*mdraid-cleanup.sh fi if ! getargbool 1 rd.md.conf -d -n rd_NO_MDADMCONF; then rm -f -- /etc/mdadm/mdadm.conf /etc/mdadm.conf ln -s $(command -v mdraid-cleanup) $hookdir/pre-pivot/31-mdraid-cleanup.sh 2>/dev/null fi # noiswmd nodmraid for anaconda / rc.sysinit compatibility # note nodmraid really means nobiosraid, so we don't want MDIMSM then either if ! getargbool 1 rd.md.imsm -d -n rd_NO_MDIMSM -n noiswmd -n nodmraid; then info "no MD RAID for imsm/isw raids" udevproperty rd_NO_MDIMSM=1 fi # same thing with ddf containers if ! getargbool 1 rd.md.ddf -n rd_NO_MDDDF -n noddfmd -n nodmraid; then info "no MD RAID for SNIA ddf raids" udevproperty rd_NO_MDDDF=1 fi 070701000F00EC000081ED0000000000000000000000015329C2C80000038E000000FD0000000000000000000000000000005800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90mdraid/mdraid-waitclean.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh if getargbool 0 rd.md.waitclean; then _offroot=$(strstr "$(mdadm --help-options 2>&1)" offroot && echo --offroot) type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh containers="" for md in /dev/md[0-9_]*; do [ -b "$md" ] || continue udevinfo="$(udevadm info --query=env --name=$md)" strstr "$udevinfo" "DEVTYPE=partition" && continue if strstr "$udevinfo" "MD_LEVEL=container"; then containers="$containers $md" continue fi info "Waiting for $md to become clean" mdadm $_offroot -W "$md" >/dev/null 2>&1 done for md in $containers; do info "Waiting for $md to become clean" mdadm $_offroot -W "$md" >/dev/null 2>&1 done unset containers udevinfo _offroot fi 070701000F00E4000081A40000000000000000000000015329C2C8000005C4000000FD0000000000000000000000000000006100000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90mdraid/65-md-incremental-imsm.rules# This file causes block devices with Linux RAID (mdadm) signatures to # automatically cause mdadm to be run. # See udev(8) for syntax ACTION!="add|change", GOTO="md_end" SUBSYSTEM!="block", GOTO="md_end" ENV{rd_NO_MD}=="?*", GOTO="md_end" KERNEL=="md*", ENV{ID_FS_TYPE}!="linux_raid_member", GOTO="md_end" KERNEL=="md*", ACTION!="change", GOTO="md_end" # Also don't process disks that are slated to be a multipath device ENV{DM_MULTIPATH_DEVICE_PATH}=="?*", GOTO="md_end" ENV{ID_FS_TYPE}=="ddf_raid_member|isw_raid_member|linux_raid_member", GOTO="md_try" GOTO="md_end" LABEL="md_try" ENV{ID_FS_TYPE}=="isw_raid_member", ENV{rd_NO_MDIMSM}=="?*", GOTO="md_end" ENV{ID_FS_TYPE}=="ddf_raid_member", ENV{rd_NO_MDDDF}=="?*", GOTO="md_end" # already done ? PROGRAM="/bin/sh -c 'for i in $sys/$devpath/holders/md[0-9_]*; do [ -e $$i ] && exit 0; done; exit 1;' ", \ GOTO="md_end" # for native arrays - array's uuid has to be specified # for containers - container's uuid has to be specified # TODO : how to get embedded array's uuid having container's component ? # # UUID CHECK ENV{DEVTYPE}!="partition", \ RUN+="/sbin/partx -d --nr 1-1024 $env{DEVNAME}" RUN+="/sbin/initqueue --timeout --name 50-mdraid_start --onetime --unique /sbin/mdraid_start" # # Incrementally build the md array; this will automatically assemble # any eventual containers as well (imsm, ddf) # LABEL="md_incremental" RUN+="/sbin/mdadm $env{rd_MD_OFFROOT} -I $env{DEVNAME}" LABEL="md_end" 070701000F00E3000081A40000000000000000000000015329C2C80000034B000000FD0000000000000000000000000000006300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90mdraid/59-persistent-storage-md.rulesSUBSYSTEM!="block", GOTO="md_end" ACTION!="add|change", GOTO="md_end" # Also don't process disks that are slated to be a multipath device ENV{DM_MULTIPATH_DEVICE_PATH}=="?*", GOTO="md_end" KERNEL!="md[0-9]*|md_d[0-9]*|md/*", KERNEL!="md*", GOTO="md_end" # partitions have no md/{array_state,metadata_version} ENV{DEVTYPE}=="partition", GOTO="md_ignore_state" # container devices have a metadata version of e.g. 'external:ddf' and # never leave state 'inactive' ATTR{md/metadata_version}=="external:[A-Za-z]*", ATTR{md/array_state}=="inactive", GOTO="md_ignore_state" TEST!="md/array_state", GOTO="md_end" ATTR{md/array_state}=="|clear|inactive", GOTO="md_end" LABEL="md_ignore_state" IMPORT{program}="/sbin/mdadm --detail --export $tempnode" IMPORT BLKID OPTIONS+="link_priority=100" OPTIONS+="watch" OPTIONS+="db_persist" LABEL="md_end" 070701000F00E6000081ED0000000000000000000000015329C2C8000000C7000000FD0000000000000000000000000000005100000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90mdraid/md-noimsm.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh info "rd.md.imsm=0: no MD RAID for imsm/isw raids" udevproperty rd_NO_MDIMSM=1 070701000F00E7000081ED0000000000000000000000015329C2C8000002A0000000FD0000000000000000000000000000005300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90mdraid/md-shutdown.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh _do_md_shutdown() { local ret local final=$1 local _offroot=$(strstr "$(mdadm --help-options 2>&1)" offroot && echo --offroot) info "Waiting for mdraid devices to be clean." mdadm $_offroot -vv --wait-clean --scan| vinfo ret=$? info "Disassembling mdraid devices." mdadm $_offroot -vv --stop --scan | vinfo ret=$(($ret+$?)) if [ "x$final" != "x" ]; then info "/proc/mdstat:" vinfo < /proc/mdstat fi return $ret } if command -v mdadm >/dev/null; then _do_md_shutdown $1 else : fi 070701000F00E5000081ED0000000000000000000000015329C2C8000000C5000000FD0000000000000000000000000000005000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90mdraid/md-noddf.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh info "rd.md.ddf=0: no MD RAID for SNIA ddf raids" udevproperty rd_NO_MDDDF=1 070701000F00E8000081ED0000000000000000000000015329C2C800000152000000FD0000000000000000000000000000005A00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90mdraid/mdmon-pre-shutdown.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh _do_mdmon_takeover() { local ret mdmon --takeover --all ret=$? [ $ret -eq 0 ] && info "Taking over mdmon processes." return $ret } if command -v mdmon >/dev/null; then _do_mdmon_takeover $1 fi 070701000F008A000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/40network070701000F008F000081ED000000000000000000000001555B5D0200000E6E000000FD0000000000000000000000000000005500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/40network/net-genrules.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh getargbool 0 rd.neednet && NEEDNET=1 # Don't continue if we don't need network if [ -z "$netroot" ] && [ ! -e "/tmp/net.ifaces" ] && [ "$NEEDNET" != "1" ]; then return fi command -v fix_bootif >/dev/null || . /lib/net-lib.sh # Write udev rules { # bridge: attempt only the defined interface if [ -e /tmp/bridge.info ]; then . /tmp/bridge.info IFACES="$IFACES ${ethnames%% *}" MASTER_IFACES="$MASTER_IFACES $bridgename" fi # bond: attempt only the defined interface (override bridge defines) for i in /tmp/bond.*.info; do [ -e "$i" ] || continue unset bondslaves unset bondname . "$i" # It is enough to fire up only one IFACES="$IFACES ${bondslaves%% *}" MASTER_IFACES="$MASTER_IFACES ${bondname}" done if [ -e /tmp/team.info ]; then . /tmp/team.info IFACES="$IFACES ${teamslaves}" MASTER_IFACES="$MASTER_IFACES ${teammaster}" fi if [ -e /tmp/vlan.info ]; then . /tmp/vlan.info IFACES="$IFACES $phydevice" MASTER_IFACES="$MASTER_IFACES ${vlanname}" fi if [ -z "$IFACES" ]; then [ -e /tmp/net.ifaces ] && read IFACES < /tmp/net.ifaces fi if [ -e /tmp/net.bootdev ]; then bootdev=$(cat /tmp/net.bootdev) fi ifup='/sbin/ifup $env{INTERFACE}' [ -z "$netroot" ] && ifup="$ifup -m" runcmd="RUN+=\"/sbin/initqueue --name ifup-\$env{INTERFACE} --unique --onetime $ifup\"" # We have some specific interfaces to handle if [ -n "$IFACES" ]; then echo 'SUBSYSTEM!="net", GOTO="net_end"' echo 'ACTION!="add|change|move", GOTO="net_end"' for iface in $IFACES; do case "$iface" in ??:??:??:??:??:??) # MAC address cond="ATTR{address}==\"$iface\"" echo "$cond, $runcmd, GOTO=\"net_end\"" ;; ??-??-??-??-??-??) # MAC address in BOOTIF form cond="ATTR{address}==\"$(fix_bootif $iface)\"" echo "$cond, $runcmd, GOTO=\"net_end\"" ;; *) # an interface name cond="ENV{INTERFACE}==\"$iface\"" echo "$cond, $runcmd, GOTO=\"net_end\"" cond="NAME==\"$iface\"" echo "$cond, $runcmd, GOTO=\"net_end\"" ;; esac # The GOTO prevents us from trying to ifup the same device twice done echo 'LABEL="net_end"' if [ -n "$MASTER_IFACES" ]; then wait_ifaces=$MASTER_IFACES else wait_ifaces=$IFACES fi for iface in $wait_ifaces; do if [ "$bootdev" = "$iface" ] || [ "$NEEDNET" = "1" ]; then echo "[ -f /tmp/net.${iface}.did-setup ]" >$hookdir/initqueue/finished/wait-$iface.sh fi done # Default: We don't know the interface to use, handle all # Fixme: waiting for the interface as well. else cond='ACTION=="add", SUBSYSTEM=="net"' # if you change the name of "91-default-net.rules", also change modules.d/80cms/cmssetup.sh if [ "$NEEDNET" = "1" ]; then echo "$cond, $runcmd" > /etc/udev/rules.d/91-default-net.rules echo "ls -1 /tmp/net.*.did-setup >/dev/null 2>&1" >$hookdir/initqueue/finished/wait-network.sh fi fi # if you change the name of "90-net.rules", also change modules.d/80cms/cmssetup.sh } > /etc/udev/rules.d/90-net.rules 070701000F0090000081ED000000000000000000000001555B5D0200004698000000FD0000000000000000000000000000005000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/40network/net-lib.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh get_ip() { local iface="$1" ip="" ip=$(ip -o -f inet addr show $iface) ip=${ip%%/*} ip=${ip##* } } mask_to_prefix() { local mask="$1" local prefix=0 local OLDIFS="$IFS" IFS=: set -- $mask IFS="$OLDIFS" for mask in $@ ; do if [ "$mask" -eq 255 ] ; then prefix=$(($prefix + 8)) elif [ "$mask" -eq 254 ] ; then prefix=$(($prefix + 7)) elif [ "$mask" -eq 252 ] ; then prefix=$(($prefix + 6)) elif [ "$mask" -eq 248 ] ; then prefix=$(($prefix + 5)) elif [ "$mask" -eq 240 ] ; then prefix=$(($prefix + 4)) elif [ "$mask" -eq 224 ] ; then prefix=$(($prefix + 3)) elif [ "$mask" -eq 192 ] ; then prefix=$(($prefix + 2)) elif [ "$mask" -eq 128 ] ; then prefix=$(($prefix + 1)) fi done } iface_for_remote_addr() { set -- $(ip -o route get to $1) echo $5 } iface_for_ip() { set -- $(ip -o addr show to $1) echo $2 } iface_for_mac() { local interface="" mac="$(echo $1 | sed 'y/ABCDEF/abcdef/')" for interface in /sys/class/net/*; do if [ $(cat $interface/address) = "$mac" ]; then echo ${interface##*/} fi done } # get the iface name for the given identifier - either a MAC, IP, or iface name iface_name() { case $1 in ??:??:??:??:??:??|??-??-??-??-??-??) iface_for_mac $1 ;; *:*:*|*.*.*.*) iface_for_ip $1 ;; *) echo $1 ;; esac } # list the configured interfaces configured_ifaces() { local IFACES="" iface_id="" rv=1 [ -e "/tmp/net.ifaces" ] && read IFACES < /tmp/net.ifaces if { pidof udevd || pidof systemd-udevd; } > /dev/null; then for iface_id in $IFACES; do echo $(iface_name $iface_id) rv=0 done else warn "configured_ifaces called before udev is running" echo $IFACES [ -n "$IFACES" ] && rv=0 fi return $rv } all_ifaces_up() { local iface="" IFACES="" [ -e "/tmp/net.ifaces" ] && read IFACES < /tmp/net.ifaces for iface in $IFACES; do [ -e /tmp/net.$iface.up ] || return 1 done } get_netroot_ip() { local prefix="" server="" rest="" splitsep "$1" ":" prefix server rest case $server in [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*) echo "$server"; return 0 ;; esac return 1 } ip_is_local() { strstr "$(ip route get $1 2>/dev/null)" " via " } ifdown() { local netif="$1" # ip down/flush ensures that routing info goes away as well ip link set $netif down ip addr flush dev $netif echo "#empty" > /etc/resolv.conf rm -f -- /tmp/net.$netif.did-setup rm -f -- /tmp/net.$netif.conf [ -e /sys/class/net/$netif/address ] && \ rm -f -- /tmp/net.$(cat /sys/class/net/$netif/address).did-setup # TODO: send "offline" uevent? } setup_net() { local netif="$1" f="" gw_ip="" netroot_ip="" iface="" IFACES="" [ -e /tmp/net.$netif.did-setup ] && return [ -e /sys/class/net/$netif/address ] && \ [ -e /tmp/net.$(cat /sys/class/net/$netif/address).did-setup ] && return [ -e "/tmp/net.ifaces" ] && read IFACES < /tmp/net.ifaces [ -z "$IFACES" ] && IFACES="$netif" # run the scripts written by ifup [ -e /tmp/net.$netif.hostname ] && . /tmp/net.$netif.hostname [ -e /tmp/net.$netif.override ] && . /tmp/net.$netif.override [ -e /tmp/dhclient.$netif.dhcpopts ] && . /tmp/dhclient.$netif.dhcpopts # set up resolv.conf [ -e /tmp/net.$netif.resolv.conf ] && \ cp -f /tmp/net.$netif.resolv.conf /etc/resolv.conf # Handle STP Timeout: arping the default gateway. # (or the root server, if a) it's local or b) there's no gateway.) # Note: This assumes that if no router is present the # root server is on the same subnet. if [ -e /tmp/net.$netif.gw ] ; then while read line ; do eval $line done < /tmp/net.$netif.gw fi # Get DHCP-provided router IP, or the cmdline-provided "gw=" argument [ -n "$new_routers" ] && gw_ip=${new_routers%%,*} [ -n "$gw" ] && gw_ip=$gw # Get the "netroot" IP (if there's an IP address in there) netroot_ip=$(get_netroot_ip $netroot) # try netroot if it's local (or there's no gateway) if ip_is_local $netroot_ip || [ -z "$gw_ip" ]; then dest="$netroot_ip" else dest="$gw_ip" fi unset layer2 if [ -f /sys/class/net/$netif/device/layer2 ]; then read layer2 < /sys/class/net/$netif/device/layer2 fi if [ "$layer2" != "0" ] && [ -n "$dest" ] && ! strstr "$dest" ":"; then arping -q -f -w 60 -I $netif $dest || info "Resolving $dest via ARP on $netif failed" fi unset layer2 } save_netinfo() { local netif="$1" IFACES="" f="" i="" [ -e /tmp/net.ifaces ] && read IFACES < /tmp/net.ifaces # Add $netif to the front of IFACES (if it's not there already). set -- "$netif" for i in $IFACES; do [ "$i" != "$netif" ] && set -- "$@" "$i"; done IFACES="$*" for i in $IFACES; do for f in /tmp/dhclient.$i.*; do [ -f $f ] && cp -f $f /tmp/net.${f#/tmp/dhclient.} done done echo $IFACES > /tmp/.net.ifaces.new mv /tmp/.net.ifaces.new /tmp/net.ifaces } set_ifname() { local name="$1" mac="$2" num=-1 n="" # if it's already set, return the existing name for n in $(getargs ifname=); do strstr "$n" "$mac" && echo ${n%%:*} && return done # otherwise, pick a new name and use that while :; do num=$(($num+1)); [ -e /sys/class/net/$name$num ] && continue for n in $(getargs ifname=); do [ "$name$num" = "${n%%:*}" ] && continue 2 done break done echo "ifname=$name$num:$mac" >> /etc/cmdline.d/45-ifname.conf echo "$name$num" } # pxelinux provides macaddr '-' separated, but we need ':' fix_bootif() { local macaddr=${1} local IFS='-' macaddr=$(for i in ${macaddr} ; do echo -n $i:; done) macaddr=${macaddr%:} # strip hardware type field from pxelinux [ -n "${macaddr%??:??:??:??:??:??}" ] && macaddr=${macaddr#??:} # return macaddr with lowercase alpha characters expected by udev echo $macaddr | sed 'y/ABCDEF/abcdef/' } ibft_to_cmdline() { local iface="" modprobe -q iscsi_ibft ( for iface in /sys/firmware/ibft/ethernet*; do local mac="" dev="" local dhcp="" ip="" gw="" mask="" hostname="" local dns1 dns2 prefix [ -e ${iface}/mac ] || continue mac=$(read a < ${iface}/mac; echo $a) [ -z "$mac" ] && continue dev=$(set_ifname ibft $mac) [ -e /tmp/net.${dev}.has_ibft_config ] && continue [ -e ${iface}/flags ] && flags=$(read a < ${iface}/flags; echo $a) # Skip invalid interfaces (( $flags & 1 )) || continue # Skip interfaces not used for booting (( $flags & 2 )) || continue [ -e ${iface}/dhcp ] && dhcp=$(read a < ${iface}/dhcp; echo $a) [ -e ${iface}/origin ] && origin=$(read a < ${iface}/origin; echo $a) [ -e ${iface}/ip-addr ] && ip=$(read a < ${iface}/ip-addr; echo $a) if [ -n "$ip" ] ; then case "$ip" in *.*.*.*) family=ipv4 ;; *:*) family=ipv6 ;; esac fi if [ -n "$dhcp" ] || [ "$origin" -eq 3 ]; then if [ "$family" = "ipv6" ] ; then echo "ip=$dev:dhcp6" else echo "ip=$dev:dhcp" fi elif [ -e ${iface}/ip-addr ]; then # skip not assigned ip adresses [ "$ip" = "0.0.0.0" ] && continue [ -e ${iface}/gateway ] && gw=$(read a < ${iface}/gateway; echo $a) [ -e ${iface}/subnet-mask ] && mask=$(read a < ${iface}/subnet-mask; echo $a) [ -e ${iface}/prefix-len ] && prefix=$(read a < ${iface}/prefix-len; echo $a) [ -e ${iface}/primary-dns ] && dns1=$(read a < ${iface}/primary-dns; echo $a) [ -e ${iface}/secondary-dns ] && dns2=$(read a < ${iface}/secondary-dns; echo $a) [ -e ${iface}/hostname ] && hostname=$(read a < ${iface}/hostname; echo $a) if [ "$family" = "ipv6" ] ; then if [ -n "$ip" ] ; then # Prefix defaults to 64 for IPv6 [ -n "$prefix" ] || prefix=64 ip="[${ip}/${prefix}]" mask= fi if [ -n "$gw" ] ; then gw="[${gw}]" fi else if [ -n "$prefix" ] ; then ip="$ip/$prefix" mask= fi fi if [ -n "$ip" ] && [ -n "$mask" -o -n "$prefix" ]; then echo "ip=$ip::$gw:$mask:$hostname:$dev:none${dns1:+:$dns1}${dns2:+:$dns2}" else warn "${iface} does not contain a valid iBFT configuration" warn "ip-addr=$ip" warn "gateway=$gw" warn "subnet-mask=$mask" warn "prefix-len=$prefix" warn "hostname=$hostname" fi else info "${iface} does not contain a valid iBFT configuration" ls -l ${iface} | vinfo fi if [ -e ${iface}/vlan ]; then vlan=$(read a < ${iface}/vlan; echo $a) if [ "$vlan" -ne "0" ]; then case "$vlan" in [0-9]*) echo "vlan=$dev.$vlan:$dev" ;; *) echo "vlan=$vlan:$dev" ;; esac fi fi echo $mac > /tmp/net.${dev}.has_ibft_config done ) >> /etc/cmdline.d/40-ibft.conf } parse_iscsi_root() { local v v=${1#iscsi:} # extract authentication info case "$v" in *@*:*:*:*:*) authinfo=${v%%@*} v=${v#*@} # allow empty authinfo to allow having an @ in iscsi_target_name like this: # netroot=iscsi:@192.168.1.100::3260::iqn.2009-01.com.example:testdi@sk if [ -n "$authinfo" ]; then OLDIFS="$IFS" IFS=: set $authinfo IFS="$OLDIFS" if [ $# -gt 4 ]; then warn "Wrong authentication info in iscsi: parameter!" return 1 fi iscsi_username=$1 iscsi_password=$2 if [ $# -gt 2 ]; then iscsi_in_username=$3 iscsi_in_password=$4 fi fi ;; esac # extract target ip case "$v" in [[]*[]]:*) iscsi_target_ip=${v#[[]} iscsi_target_ip=${iscsi_target_ip%%[]]*} v=${v#[[]$iscsi_target_ip[]]:} ;; *) iscsi_target_ip=${v%%[:]*} v=${v#$iscsi_target_ip:} ;; esac # extract target name case "$v" in *:iqn.*) iscsi_target_name=iqn.${v##*:iqn.} v=${v%:iqn.*}: ;; *:eui.*) iscsi_target_name=iqn.${v##*:eui.} v=${v%:iqn.*}: ;; *:naa.*) iscsi_target_name=iqn.${v##*:naa.} v=${v%:iqn.*}: ;; *) warn "Invalid iscii target name, should begin with 'iqn.' or 'eui.' or 'naa.'" return 1 ;; esac # parse the rest OLDIFS="$IFS" IFS=: set $v IFS="$OLDIFS" iscsi_protocol=$1; shift # ignored iscsi_target_port=$1; shift if [ $# -eq 3 ]; then iscsi_iface_name=$1; shift fi if [ $# -eq 2 ]; then iscsi_netdev_name=$1; shift fi iscsi_lun=$1; shift if [ $# -ne 0 ]; then warn "Invalid parameter in iscsi: parameter!" return 1 fi } ip_to_var() { local v=${1}: local i set -- while [ -n "$v" ]; do if [ "${v#\[*:*:*\]:}" != "$v" ]; then # handle IPv6 address i="${v%%\]:*}" i="${i##\[}" set -- "$@" "$i" v=${v#\[$i\]:} else set -- "$@" "${v%%:*}" v=${v#*:} fi done unset ip srv gw mask prefix hostname dev autoconf macaddr mtu dns1 dns2 case $# in 0) autoconf="error" ;; 1) autoconf=$1 ;; 2) [ -n "$1" ] && dev=$1; [ -n "$2" ] && autoconf=$2 ;; 3) [ -n "$1" ] && dev=$1; [ -n "$2" ] && autoconf=$2; [ -n "$3" ] && mtu=$3 ;; 4) [ -n "$1" ] && dev=$1; [ -n "$2" ] && autoconf=$2; [ -n "$3" ] && mtu=$3; [ -n "$4" ] && macaddr=$4 ;; *) [ -n "$1" ] && ip=$1; [ -n "$2" ] && srv=$2; [ -n "$3" ] && gw=$3; [ -n "$4" ] && mask=$4; [ -n "$5" ] && hostname=$5; [ -n "$6" ] && dev=$6; [ -n "$7" ] && autoconf=$7; case "$8" in [0-9]*:*|[0-9]*.[0-9]*.[0-9]*.[0-9]*) dns1="$8" [ -n "$9" ] && dns2="$9" ;; [0-9]*) mtu="$8" ;; *) if [ -n "${9}" -a -n "${10}" -a -n "${11}" -a -n "${12}" -a -n "${13}" -a -n "${14}" ]; then macaddr="${9}:${10}:${11}:${12}:${13}:${14}" fi ;; esac ;; esac # Extract prefix length from CIDR notation case $ip in */*) prefix=${ip##*/} ip=${ip%/*} ;; esac # ip= means anaconda-style static config argument cluster: # ip= gateway= netmask= hostname= mtu= # ksdevice={link|bootif|ibft||} if strglob "$autoconf" "*.*.*.*"; then ip="$autoconf" gw=$(getarg gateway=) mask=$(getarg netmask=) hostname=$(getarg hostname=) dev=$(getarg ksdevice=) autoconf="none" mtu=$(getarg mtu=) # handle special values for ksdevice case "$dev" in bootif|BOOTIF) dev=$(fix_bootif $(getarg BOOTIF=)) ;; link) dev="" ;; # FIXME: do something useful with this ibft) dev="" ;; # ignore - ibft is handled elsewhere esac fi } parse_ifname_opts() { local IFS=: set $1 case $# in 7) ifname_if=$1 # udev requires MAC addresses to be lower case ifname_mac=$(echo $2:$3:$4:$5:$6:$7 | sed 'y/ABCDEF/abcdef/') ;; *) die "Invalid arguments for ifname=" ;; esac case $ifname_if in eth[0-9]|eth[0-9][0-9]|eth[0-9][0-9][0-9]|eth[0-9][0-9][0-9][0-9]) warn "ifname=$ifname_if uses the kernel name space for interfaces" warn "This can fail for multiple network interfaces and is discouraged!" warn "Please use a custom name like \"netboot\" or \"bluesocket\"" warn "or use biosdevname and no ifname= at all." ;; esac } # some network driver need long time to initialize, wait before it's ready. wait_for_if_link() { local cnt=0 local li while [ $cnt -lt 600 ]; do li=$(ip -o link show dev $1 2>/dev/null) [ -n "$li" ] && return 0 sleep 0.1 cnt=$(($cnt+1)) done return 1 } wait_for_if_up() { local cnt=0 local li while [ $cnt -lt 200 ]; do li=$(ip -o link show up dev $1) [ -n "$li" ] && [ -z "${li##*state UP*}" ] && return 0 sleep 0.1 cnt=$(($cnt+1)) done return 1 } wait_for_route_ok() { local cnt=0 while [ $cnt -lt 200 ]; do li=$(ip route show) [ -n "$li" ] && [ -z "${li##*$1*}" ] && return 0 sleep 0.1 cnt=$(($cnt+1)) done return 1 } wait_for_ipv6_dad() { local cnt=0 local li while [ $cnt -lt 500 ]; do li=$(ip -6 addr show dev $1) strstr "$li" "tentative" || return 0 sleep 0.1 cnt=$(($cnt+1)) done return 1 } wait_for_ipv6_auto() { local cnt=0 local li while [ $cnt -lt 400 ]; do li=$(ip -6 addr show dev $1) if ! strstr "$li" "tentative"; then strstr "$li" "dynamic" && return 0 fi sleep 0.1 cnt=$(($cnt+1)) done return 1 } linkup() { wait_for_if_link $1 2>/dev/null\ && ip link set $1 up 2>/dev/null\ && wait_for_if_up $1 2>/dev/null } type hostname >/dev/null 2>&1 || \ hostname() { cat /proc/sys/kernel/hostname } iface_has_link() { local interface="$1" flags="" [ -n "$interface" ] || return 2 interface="/sys/class/net/$interface" [ -d "$interface" ] || return 2 linkup "$1" [ "$(cat $interface/carrier)" = 1 ] || return 1 # XXX Do we need to reset the flags here? anaconda never bothered.. } find_iface_with_link() { local iface_path="" iface="" for iface_path in /sys/class/net/*; do iface=${iface_path##*/} str_starts "$iface" "lo" && continue if iface_has_link $iface; then echo "$iface" return 0 fi done return 1 } is_persistent_ethernet_name() { case "$1" in # udev persistent interface names eth[0-9]|eth[0-9][0-9]|eth[0-9][0-9][0-9]*) ;; eno[0-9]|eno[0-9][0-9]|eno[0-9][0-9][0-9]*) ;; ens[0-9]|ens[0-9][0-9]|ens[0-9][0-9][0-9]*) ;; enp[0-9]s[0-9]*|enp[0-9][0-9]s[0-9]*|enp[0-9][0-9][0-9]*s[0-9]*) ;; enP*p[0-9]s[0-9]*|enP*p[0-9][0-9]s[0-9]*|enP*p[0-9][0-9][0-9]*s[0-9]*) ;; # biosdevname em[0-9]|em[0-9][0-9]|em[0-9][0-9][0-9]*) ;; p[0-9]p[0-9]*|p[0-9][0-9]p[0-9]*|p[0-9][0-9][0-9]*p[0-9]*) ;; *) return 1 esac return 0 } 070701000F0097000081ED0000000000000000000000015329C2C800000395000000FD0000000000000000000000000000005300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/40network/parse-team.sh#!/bin/sh # # Format: # team=: # # teamslaves is a comma-separated list of physical (ethernet) interfaces # # return if team already parsed [ -n "$teammaster" ] && return # Check if team parameter is valid if getarg team= >/dev/null ; then : fi parseteam() { local v=${1}: set -- while [ -n "$v" ]; do set -- "$@" "${v%%:*}" v=${v#*:} done unset teammaster teamslaves case $# in 2) teammaster=$1; teamslaves=$(str_replace "$2" "," " ") ;; *) die "team= requires two parameters" ;; esac } unset teammaster teamslaves if getarg team>/dev/null; then # Read team= parameters if they exist team="$(getarg team=)" if [ ! "$team" = "team" ]; then parseteam "$(getarg team=)" fi echo "teammaster=$teammaster" > /tmp/team.info echo "teamslaves=\"$teamslaves\"" >> /tmp/team.info return fi 070701000F008E000081ED000000000000000000000001555B5D0200000EEB000000FD0000000000000000000000000000005500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/40network/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh WICKEDD_DHCP_PATH="/usr/lib/wicked/bin" WICKED_EXT_PATH="/etc/wicked/extensions" # called by dracut check() { local _program require_binaries ip arping $WICKEDD_DHCP_PATH/wickedd-dhcp4 $WICKEDD_DHCP_PATH/wickedd-dhcp6 || return 1 return 255 } # called by dracut depends() { return 0 } # called by dracut installkernel() { # Include wired net drivers, excluding wireless local _arch=$(uname -m) net_module_filter() { local _net_drivers='eth_type_trans|register_virtio_device|usbnet_open' local _unwanted_drivers='/(wireless|isdn|uwb|net/ethernet|net/phy|net/team)/' local _ret # subfunctions inherit following FDs local _merge=8 _side2=9 function nmf1() { local _fname _fcont while read _fname; do [[ $_fname =~ $_unwanted_drivers ]] && continue case "$_fname" in *.ko) _fcont="$(< $_fname)" ;; *.ko.gz) _fcont="$(gzip -dc $_fname)" ;; *.ko.xz) _fcont="$(xz -dc $_fname)" ;; esac [[ $_fcont =~ $_net_drivers && ! $_fcont =~ iw_handler_get_spy ]] \ && echo "$_fname" done return 0 } function rotor() { local _f1 _f2 while read _f1; do echo "$_f1" if read _f2; then echo "$_f2" 1>&${_side2} fi done | nmf1 1>&${_merge} return 0 } # Use two parallel streams to filter alternating modules. set +x eval "( ( rotor ) ${_side2}>&1 | nmf1 ) ${_merge}>&1" [[ $debug ]] && set -x return 0 } { find_kernel_modules_by_path drivers/net; if [ "$_arch" = "s390" -o "$_arch" = "s390x" ]; then find_kernel_modules_by_path drivers/s390/net; fi; } \ | net_module_filter | instmods #instmods() will take care of hostonly instmods \ =drivers/net/phy \ =drivers/net/team \ =drivers/net/ethernet \ ecb arc4 bridge stp llc ipv6 bonding 8021q af_packet virtio_net xennet } # called by dracut install() { local _arch _i _dir inst_multiple ip arping hostname sed inst_multiple -o ping ping6 inst_multiple -o brctl inst_multiple -o teamd teamdctl teamnl inst_simple /etc/libnl/classid inst_simple "$WICKEDD_DHCP_PATH/wickedd-dhcp4" "/usr/sbin/wickedd-dhcp4" inst_simple "$WICKEDD_DHCP_PATH/wickedd-dhcp6" "/usr/sbin/wickedd-dhcp6" inst_libdir_file "libwicked*.so.*" inst_libdir_file "libdbus-1.so.*" inst_script "$moddir/ifup.sh" "/sbin/ifup" inst_script "$moddir/netroot.sh" "/sbin/netroot" inst_simple "$moddir/net-lib.sh" "/lib/net-lib.sh" inst_hook pre-udev 50 "$moddir/ifname-genrules.sh" inst_hook pre-udev 60 "$moddir/net-genrules.sh" inst_hook cmdline 91 "$moddir/dhcp-root.sh" inst_hook cmdline 92 "$moddir/parse-ibft.sh" inst_hook cmdline 95 "$moddir/parse-vlan.sh" inst_hook cmdline 96 "$moddir/parse-bond.sh" inst_hook cmdline 96 "$moddir/parse-team.sh" inst_hook cmdline 97 "$moddir/parse-bridge.sh" inst_hook cmdline 98 "$moddir/parse-ip-opts.sh" inst_hook cmdline 99 "$moddir/parse-ifname.sh" _arch=$(uname -m) [[ $hostonly ]] && { inst_multiple /etc/sysconfig/network/ifcfg-* inst_multiple -o /etc/sysconfig/network/ifroute-* inst_simple /etc/sysconfig/network/routes } inst_libdir_file {"tls/$_arch/",tls/,"$_arch/",}"libnss_dns.so.*" \ {"tls/$_arch/",tls/,"$_arch/",}"libnss_mdns4_minimal.so.*" dracut_need_initqueue } 070701000F0095000081ED0000000000000000000000015329C2C800000296000000FD0000000000000000000000000000005500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/40network/parse-ifname.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # # Format: # ifname=: # # Note letters in the macaddress must be lowercase! # # Examples: # ifname=eth0:4a:3f:4c:04:f8:d7 # # Note when using ifname= to get persistent interface names, you must specify # an ifname= argument for each interface used in an ip= or fcoe= argument # check if there are any ifname parameters if ! getarg ifname= >/dev/null ; then return fi command -v parse_ifname_opts >/dev/null || . /lib/net-lib.sh # Check ifname= lines for p in $(getargs ifname=); do parse_ifname_opts $p done 070701000F0093000081ED0000000000000000000000015329C2C800000572000000FD0000000000000000000000000000005500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/40network/parse-bridge.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # # Format: # bridge=: # # is a comma-separated list of physical (ethernet) interfaces # bridge without parameters assumes bridge=br0:eth0 # # return if bridge already parsed [ -n "$bridgename" ] && return # Check if bridge parameter is valid if getarg bridge= >/dev/null ; then command -v brctl >/dev/null 2>&1 || die "No 'brctl' installed" fi parsebridge() { local v=${1}: set -- while [ -n "$v" ]; do set -- "$@" "${v%%:*}" v=${v#*:} done unset bridgename ethnames case $# in 0) bridgename=br0; ethnames=$iface ;; 1) die "bridge= requires two parameters" ;; 2) bridgename=$1; ethnames=$(str_replace "$2" "," " ") ;; *) die "bridge= requires two parameters" ;; esac } unset bridgename ethnames iface=eth0 # Parse bridge for bridgename and ethnames if bridge="$(getarg bridge)"; then # Read bridge= parameters if they exist if [ -n "$bridge" ]; then parsebridge $bridge fi # Simple default bridge if [ -z "$bridgename" ]; then bridgename=br0 ethnames=$iface fi echo "bridgename=$bridgename" > /tmp/bridge.info echo "ethnames=\"$ethnames\"" >> /tmp/bridge.info return fi 070701000F008B000081ED0000000000000000000000015329C2C80000039E000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/40network/dhcp-root.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # This script is sourced, so root should be set. But let's be paranoid [ -z "$root" ] && root=$(getarg root=) if [ -z "$netroot" ]; then for netroot in $(getargs netroot=); do [ "$netroot" = "dhcp" ] && break [ "$netroot" = "dhcp6" ] && break done [ "$netroot" = "dhcp" ] || [ "$netroot" = "dhcp6" ] || unset netroot fi if [ "$root" = "dhcp" ] || [ "$root" = "dhcp6" ] || [ "$netroot" = "dhcp" ] || [ "$netroot" = "dhcp6" ]; then # Tell ip= checker that we need dhcp NEEDDHCP="1" # Done, all good! rootok=1 if [ "$netroot" != "dhcp" ] && [ "$netroot" != "dhcp6" ]; then netroot=$root fi # Shut up init error check [ -z "$root" ] && root="dhcp" echo '[ -d $NEWROOT/proc -o -e /dev/root ]' > $hookdir/initqueue/finished/dhcp.sh fi 070701000F0094000081ED000000000000000000000001555B5D020000018C000000FD0000000000000000000000000000005300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/40network/parse-ibft.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh command -v getarg >/dev/null || . /lib/dracut-lib.sh command -v ibft_to_cmdline >/dev/null || . /lib/net-lib.sh # If ibft is requested, read ibft vals and write ip=XXX cmdline args for i in $(getargs ip=); do [ "ibft" = "$i" ] && ibft_to_cmdline && break done 070701000F0092000081ED0000000000000000000000015329C2C8000007B7000000FD0000000000000000000000000000005300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/40network/parse-bond.sh#!/bin/sh # # Format: # bond=[::[:]] # # bondslaves is a comma-separated list of physical (ethernet) interfaces # options is a comma-separated list on bonding options (modinfo bonding for details) in format compatible with initscripts # if options include multi-valued arp_ip_target option, then its values should be separated by semicolon. # # bond without parameters assumes bond=bond0:eth0,eth1:mode=balance-rr # # return if bond already parsed [ -n "$bondname" ] && return # Check if bond parameter is valid if getarg bond= >/dev/null ; then : fi # We translate list of slaves to space-separated here to mwke it easier to loop over them in ifup # Ditto for bonding options parsebond() { local v=${1}: set -- while [ -n "$v" ]; do set -- "$@" "${v%%:*}" v=${v#*:} done unset bondname bondslaves bondoptions case $# in 0) bondname=bond0; bondslaves="eth0 eth1" ;; 1) bondname=$1; bondslaves="eth0 eth1" ;; 2) bondname=$1; bondslaves=$(str_replace "$2" "," " ") ;; 3) bondname=$1; bondslaves=$(str_replace "$2" "," " "); bondoptions=$(str_replace "$3" "," " ") ;; *) die "bond= requires zero to four parameters" ;; esac } unset bondname bondslaves bondoptions # Parse bond for bondname, bondslaves, bondmode and bondoptions if getarg bond >/dev/null; then # Read bond= parameters if they exist bond="$(getarg bond=)" if [ ! "$bond" = "bond" ]; then parsebond "$(getarg bond=)" fi # Simple default bond if [ -z "$bondname" ]; then bondname=bond0 bondslaves="eth0 eth1" fi # Make it suitable for initscripts export bondoptions=$(str_replace "$bondoptions" ";" ",") echo "bondname=$bondname" > /tmp/bond.${bondname}.info echo "bondslaves=\"$bondslaves\"" >> /tmp/bond.${bondname}.info echo "bondoptions=\"$bondoptions\"" >> /tmp/bond.${bondname}.info return fi 070701000F0096000081ED000000000000000000000001555B5D0200000EAF000000FD0000000000000000000000000000005600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/40network/parse-ip-opts.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # # Format: # ip=[dhcp|on|any] # # ip=:[dhcp|on|any][:[][:]] # # ip=::::::{dhcp|on|any|none|off}[:[][:]] # # When supplying more than only ip= line, is mandatory and # bootdev= must contain the name of the primary interface to use for # routing,dns,dhcp-options,etc. # command -v getarg >/dev/null || . /lib/dracut-lib.sh if [ -n "$netroot" ] && [ -z "$(getarg ip=)" ] && [ -z "$(getarg BOOTIF=)" ]; then # No ip= argument(s) for netroot provided, defaulting to DHCP return; fi BOOTDEV=$(getarg bootdev=) # Check ip= lines # XXX Would be nice if we could errorcheck ip addresses here as well for p in $(getargs ip=); do ip_to_var $p # make first device specified the BOOTDEV if [ -z "$BOOTDEV" ] && [ -n "$dev" ]; then BOOTDEV="$dev" warn "Setting bootdev to '$BOOTDEV'" fi # skip ibft since we did it above [ "$autoconf" = "ibft" ] && continue # We need to have an ip= line for the specified bootdev [ "$dev" = "$BOOTDEV" ] && BOOTDEVOK=1 # Empty autoconf defaults to 'dhcp' if [ -z "$autoconf" ] ; then warn "Empty autoconf values default to dhcp" autoconf="dhcp" fi # Error checking for autoconf in combination with other values case $autoconf in error) die "Error parsing option 'ip=$p'";; bootp|rarp|both) die "Sorry, ip=$autoconf is currently unsupported";; static) if [ ! -e /etc/sysconfig/network/ifcfg-${dev} ] ; then warn "No ifcfg configuration present for interface $dev, skipping" continue fi ;; none|off) [ -z "$ip" ] && \ die "For argument 'ip=$p'\nValue '$autoconf' without static configuration does not make sense" [ -z "$mask" -a -z "$prefix" ] && \ die "Sorry, automatic calculation of netmask is not yet supported" ;; auto6);; dhcp|dhcp6|on|any) ;; *) die "For argument 'ip=$p'\nSorry, unknown value '$autoconf'";; esac dup=0 if [ -n "$dev" ] ; then # We don't like duplicate device configs if [ -n "$IFACES" ] ; then for i in $IFACES ; do [ "$dev" = "$i" ] && dup=1 && break done fi # IFACES list for later use if [ $dup -eq 0 ]; then IFACES="$IFACES $dev" fi fi # Do we need to check for specific options? if [ -n "$NEEDDHCP" ] || [ -n "$DHCPORSERVER" ] ; then # Correct device? (Empty is ok as well) [ "$dev" = "$BOOTDEV" ] || continue # Server-ip is there? [ -n "$DHCPORSERVER" ] && [ -n "$srv" ] && continue # dhcp? (It's simpler to check for a set ip. Checks above ensure that if # ip is there, we're static [ -z "$ip" ] && continue # Not good! die "Server-ip or dhcp for netboot needed, but current arguments say otherwise" fi done # put BOOTIF in IFACES to make sure it comes up if getargbool 1 "rd.bootif" && BOOTIF="$(getarg BOOTIF=)"; then BOOTDEV=$(fix_bootif $BOOTIF) IFACES="$BOOTDEV $IFACES" fi # This ensures that BOOTDEV is always first in IFACES if [ -n "$BOOTDEV" ] && [ -n "$IFACES" ] ; then IFACES="${IFACES%$BOOTDEV*} ${IFACES#*$BOOTDEV}" IFACES="$BOOTDEV $IFACES" fi # Store BOOTDEV and IFACES for later use [ -n "$BOOTDEV" ] && echo $BOOTDEV > /tmp/net.bootdev [ -n "$IFACES" ] && echo $IFACES > /tmp/net.ifaces 070701000F0098000081ED0000000000000000000000015329C2C800000316000000FD0000000000000000000000000000005300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/40network/parse-vlan.sh#!/bin/sh # # Format: # vlan=: # # return if vlan already parsed [ -n "$vlanname" ] && return # Check if vlan parameter is valid if getarg vlan= >/dev/null ; then : fi parsevlan() { local v=${1}: set -- while [ -n "$v" ]; do set -- "$@" "${v%%:*}" v=${v#*:} done unset vlanname phydevice case $# in 2) vlanname=$1; phydevice=$2 ;; *) die "vlan= requires two parameters" ;; esac } unset vlanname phydevice if getarg vlan >/dev/null; then # Read vlan= parameters if they exist vlan="$(getarg vlan=)" if [ ! "$vlan" = "vlan" ]; then parsevlan "$(getarg vlan=)" fi echo "vlanname=\"$vlanname\"" > /tmp/vlan.info echo "phydevice=\"$phydevice\"" >> /tmp/vlan.info return fi 070701000F0091000081ED0000000000000000000000015329C2C800000AB6000000FD0000000000000000000000000000005000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/40network/netroot.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh PATH=/usr/sbin:/usr/bin:/sbin:/bin command -v getarg >/dev/null || . /lib/dracut-lib.sh command -v setup_net >/dev/null || . /lib/net-lib.sh # Huh? Empty $1? [ -z "$1" ] && exit 1 # [ ! -z $2 ] means this is for manually bringing up network # instead of real netroot; If It's called without $2, then there's # no sense in doing something if no (net)root info is available # or root is already there [ -d $NEWROOT/proc ] && exit 0 [ -z "$netroot" ] && exit 1 # Set or override primary interface netif=$1 [ -e "/tmp/net.bootdev" ] && read netif < /tmp/net.bootdev case "$netif" in ??:??:??:??:??:??) # MAC address for i in /sys/class/net/*/address; do mac=$(cat $i) if [ "$mac" = "$netif" ]; then i=${i%/address} netif=${i##*/} break fi done esac # Figure out the handler for root=dhcp by recalling all netroot cmdline # handlers when this is not called from manually network bringing up. if [ -z "$2" ]; then if [ "$netroot" = "dhcp" ] || [ "$netroot" = "dhcp6" ] ; then # Load dhcp options [ -e /tmp/dhclient.$netif.dhcpopts ] && . /tmp/dhclient.$netif.dhcpopts # If we have a specific bootdev with no dhcpoptions or empty root-path, # we die. Otherwise we just warn if [ -z "$new_root_path" ] ; then [ -n "$BOOTDEV" ] && die "No dhcp root-path received for '$BOOTDEV'" warn "No dhcp root-path received for '$BOOTDEV' trying other interfaces if available" exit 1 fi # Set netroot to new_root_path, so cmdline parsers don't call netroot=$new_root_path # FIXME! unset rootok for f in $hookdir/cmdline/90*.sh; do [ -f "$f" ] && . "$f"; done else rootok="1" fi # Check: do we really know how to handle (net)root? [ -z "$root" ] && die "No or empty root= argument" [ -z "$rootok" ] && die "Don't know how to handle 'root=$root'" handler=${netroot%%:*} handler=${handler%%4} handler=$(command -v ${handler}root) if [ -z "$netroot" ] || [ ! -e "$handler" ] ; then die "No handler for netroot type '$netroot'" fi fi # Source netroot hooks before we start the handler source_hook netroot $netif # Run the handler; don't store the root, it may change from device to device # XXX other variables to export? if $handler $netif $netroot $NEWROOT; then rm -f -- $hookdir/initqueue/finished/dhcp.sh # Network rootfs mount successful - save interface info for ifcfg etc. save_netinfo $netif fi exit 0 070701000F008D000081ED000000000000000000000001555B5D0200003FF3000000FD0000000000000000000000000000004D00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/40network/ifup.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # # We don't need to check for ip= errors here, that is handled by the # cmdline parser script # # without $2 means this is for real netroot case # or it is for manually bring up network ie. for kdump scp vmcore PATH=/usr/sbin:/usr/bin:/sbin:/bin type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh type ip_to_var >/dev/null 2>&1 || . /lib/net-lib.sh # Huh? No $1? [ -z "$1" ] && exit 1 # $netif reads easier than $1 netif=$1 use_bridge='false' use_vlan='false' [ -d /var/lib/wicked ] || mkdir -p /var/lib/wicked # enslave this interface to bond? for i in /tmp/bond.*.info; do [ -e "$i" ] || continue unset bondslaves unset bondname . "$i" for slave in $bondslaves ; do if [ "$netif" = "$slave" ] ; then netif=$bondname break 2 fi done done if [ -e /tmp/team.info ]; then . /tmp/team.info for slave in $teamslaves ; do if [ "$netif" = "$slave" ] ; then netif=$teammaster fi done fi if [ -e /tmp/vlan.info ]; then . /tmp/vlan.info if [ "$netif" = "$phydevice" ]; then if [ "$netif" = "$bondname" ] && [ -n "$DO_BOND_SETUP" ] ; then : # We need to really setup bond (recursive call) elif [ "$netif" = "$teammaster" ] && [ -n "$DO_TEAM_SETUP" ] ; then : # We need to really setup team (recursive call) else netif="$vlanname" use_vlan='true' fi fi fi # bridge this interface? if [ -e /tmp/bridge.info ]; then . /tmp/bridge.info for ethname in $ethnames ; do if [ "$netif" = "$ethname" ]; then if [ "$netif" = "$bondname" ] && [ -n "$DO_BOND_SETUP" ] ; then : # We need to really setup bond (recursive call) elif [ "$netif" = "$teammaster" ] && [ -n "$DO_TEAM_SETUP" ] ; then : # We need to really setup team (recursive call) elif [ "$netif" = "$vlanname" ] && [ -n "$DO_VLAN_SETUP" ]; then : # We need to really setup vlan (recursive call) else netif="$bridgename" use_bridge='true' fi fi done fi # disable manual ifup while netroot is set for simplifying our logic # in netroot case we prefer netroot to bringup $netif automaticlly [ -n "$2" -a "$2" = "-m" ] && [ -z "$netroot" ] && manualup="$2" [ -z "$netroot" ] && [ -z "$manualup" ] && exit 0 if [ -n "$manualup" ]; then >/tmp/net.$netif.manualup else [ -e /tmp/net.${netif}.did-setup ] && exit 0 [ -e /sys/class/net/$netif/address ] && \ [ -e /tmp/net.$(cat /sys/class/net/$netif/address).did-setup ] && exit 0 fi dhcp_apply() { unset IPADDR INTERFACE BROADCAST NETWORK PREFIXLEN ROUTES GATEWAYS HOSTNAME DNSDOMAIN DNSSEARCH DNSSERVERS if [ -f /tmp/leaseinfo.${netif}.dhcp.ipv${1:1:1} ]; then . /tmp/leaseinfo.${netif}.dhcp.ipv${1:1:1} else warn "DHCP failed"; return 1 fi if [ -z "${IPADDR}" ] || [ -z "${INTERFACE}" ]; then warn "Missing crucial DHCP variables" return 1 fi # Assign IP address ip $1 addr add "$IPADDR" ${BROADCAST:+broadcast $BROADCAST} dev "$INTERFACE" # Assign network route the interface is attached to if [ -n "${NETWORK}" ]; then ip $1 route add "$NETWORK"/"$PREFIXLEN" dev "$INTERFACE" fi # Assign provided routes local r route=() if [ -n "${ROUTES}" ]; then for r in ${ROUTES}; do route=(${r//,/ }) ip $1 route add "$route[0]"/"$route[1]" via "$route[2]" dev "$INTERFACE" done fi # Assign provided routers local g if [ -n "${GATEWAYS}" ]; then for g in ${GATEWAYS}; do ip $1 route add default via "$g" dev "$INTERFACE" && break done fi # Setup hostname [ -n "${HOSTNAME}" ] && hostname "$HOSTNAME" # If nameserver= has not been specified, use what dhcp provides if [ ! -s /tmp/net.$netif.resolv.conf.ipv${1:1:1} ]; then if [ -n "${DNSDOMAIN}" ]; then echo domain "${DNSDOMAIN}" fi >> /tmp/net.$netif.resolv.conf.ipv${1:1:1} if [ -n "${DNSSEARCH}" ]; then echo search "${DNSSEARCH}" fi >> /tmp/net.$netif.resolv.conf.ipv${1:1:1} if [ -n "${DNSSERVERS}" ] ; then for s in ${DNSSERVERS}; do echo nameserver "$s" done fi >> /tmp/net.$netif.resolv.conf.ipv${1:1:1} fi # copy resolv.conf if it doesn't exist yet, modify otherwise if [ -e /tmp/net.$netif.resolv.conf.ipv${1:1:1} ] && [ ! -e /etc/resolv.conf ]; then cp -f /tmp/net.$netif.resolv.conf.ipv${1:1:1} /etc/resolv.conf else if [ -n "$(sed -n '/^search .*$/p' /etc/resolv.conf)" ]; then sed -i "s/\(^search .*\)$/\1 ${DNSSEARCH}/" /etc/resolv.conf else echo search ${DNSSEARCH} >> /etc/resolv.conf fi if [ -n "${DNSSERVERS}" ] ; then for s in ${DNSSERVERS}; do echo nameserver "$s" done fi >> /etc/resolv.conf fi info "DHCP is finished successfully" return 0 } # Run dhclient do_dhcp() { # dhclient-script will mark the netif up and generate the online # event for nfsroot # XXX add -V vendor class and option parsing per kernel [ -f /tmp/leaseinfo.${netif}.dhcp.ipv${1:1:1} ] && return 0 info "Preparation for DHCP transaction" [ -d /var/lib/wicked ] || mkdir -p /var/lib/wicked local dhclient='' if [ "$1" = "-6" ] ; then local ipv6_mode='' if [ -f /tmp/net.$netif.auto6 ] ; then ipv6_mode="auto" else ipv6_mode="managed" fi dhclient="wickedd-dhcp6 --test --test-mode $ipv6_mode" else dhclient="wickedd-dhcp4 --test" fi if ! iface_has_link $netif; then warn "No carrier detected" warn "Trying to set $netif up..." ip $1 link set dev "$netif" up if ! iface_has_link $netif; then warn "Failed..." return 1 fi fi echo "Starting dhcp for interface $netif" $dhclient --test-format leaseinfo --test-output /tmp/leaseinfo.${netif}.dhcp.ipv${1:1:1} --test-request - $netif << EOF EOF dhcp_apply $1 || return $? if [ "$1" = "-6" ] ; then wait_for_ipv6_dad $netif fi return 0 } load_ipv6() { modprobe ipv6 i=0 while [ ! -d /proc/sys/net/ipv6 ]; do i=$(($i+1)) [ $i -gt 10 ] && break sleep 0.1 done } do_ipv6auto() { load_ipv6 echo 0 > /proc/sys/net/ipv6/conf/$netif/forwarding echo 1 > /proc/sys/net/ipv6/conf/$netif/accept_ra echo 1 > /proc/sys/net/ipv6/conf/$netif/accept_redirects echo 1 > /proc/sys/net/ipv6/conf/$netif/autoconf linkup $netif wait_for_ipv6_auto $netif [ -n "$hostname" ] && echo "echo $hostname > /proc/sys/kernel/hostname" > /tmp/net.$netif.hostname return 0 } # Handle ip configuration via ifcfg files do_ifcfg() { if [ "$autoconf" = "static" ] && [ -e /etc/sysconfig/network/ifcfg-${netif} ] ; then # Pull in existing static configuration . /etc/sysconfig/network/ifcfg-${netif} # The first configuration can be anything [ -n "$PREFIXLEN" ] && prefix=${PREFIXLEN} [ -n "$MTU" ] && mtu=${MTU} [ -n "$REMOTE_IPADDR" ] && server=${REMOTE_IPADDR} [ -n "$GATEWAY" ] && gw=${GATEWAY} [ -n "$BOOTPROTO" ] && autoconf=${BOOTPROTO} case "$autoconf" in dhcp6) load_ipv6 do_dhcp -6 ;; dhcp*) do_dhcp -4 ;; *) do_static ;; esac # loop over all configurations in ifcfg-$netif (IPADDR*) and apply for conf in ${!IPADDR@}; do ip=${!conf} [ -z "$ip" ] && continue ext=${conf#IPADDR} concat="PREFIXLEN$ext" && [ -n "${!concat}" ] && prefix=${!concat} concat="MTU$ext" && [ -n "${!concat}" ] && mtu=${!concat} concat="REMOTE_IPADDR$ext" && [ -n "${!concat}" ] && server=${!concat} concat="GATEWAY$ext" && [ -n "${!concat}" ] && gw=${!concat} # Additional configurations must be static do_static done else do_static fi return 0 } # Handle static ip configuration do_static() { strglobin $ip '*:*:*' && load_ipv6 linkup $netif [ -n "$macaddr" ] && ip link set address $macaddr dev $netif [ -n "$mtu" ] && ip link set mtu $mtu dev $netif [ -n "$mask" -a -z "$prefix" ] && prefix=$(mask_to_prefix $mask) if [ "${ip##*/}" != "${ip}" ] ; then prefix="${ip##*/}" ip="${ip%/*}" fi if strglobin $ip '*:*:*'; then # Always assume /64 prefix for IPv6 [ -z "$prefix" ] && prefix=64 # note no ip addr flush for ipv6 ip addr add $ip/$prefix ${srv:+peer $srv} dev $netif wait_for_ipv6_dad $netif else # Assume /24 prefix for IPv4 [ -z "$prefix" ] && prefix=24 ip addr add $ip/$prefix ${srv:+peer $srv} brd + dev $netif fi [ -n "$gw" ] && echo ip route add default via $gw dev $netif > /tmp/net.$netif.gw for ifroute in /etc/sysconfig/network/ifroute-${netif} /etc/sysconfig/network/routes ; do [ -e ${ifroute} ] || continue # Pull in existing routing configuration read ifr_dest ifr_gw ifr_mask ifr_if < ${ifroute} [ -z "$ifr_dest" -o -z "$ifr_gw" ] && continue if [ "$ifr_if" = "-" ] ; then echo ip route add $ifr_dest via $ifr_gw >> /tmp/net.$netif.gw else echo ip route add $ifr_dest via $ifr_gw dev $ifr_if >> /tmp/net.$netif.gw fi done [ -n "$hostname" ] && echo "echo $hostname > /proc/sys/kernel/hostname" > /tmp/net.$netif.hostname return 0 } # loopback is always handled the same way if [ "$netif" = "lo" ] ; then ip link set lo up ip addr add 127.0.0.1/8 dev lo exit 0 fi # start bond if needed if [ -e /tmp/bond.${netif}.info ]; then . /tmp/bond.${netif}.info if [ "$netif" = "$bondname" ] && [ ! -e /tmp/net.$bondname.up ] ; then # We are master bond device modprobe bonding echo "+$netif" > /sys/class/net/bonding_masters ip link set $netif down # Stolen from ifup-eth # add the bits to setup driver parameters here for arg in $bondoptions ; do key=${arg%%=*}; value=${arg##*=}; # %{value:0:1} is replaced with non-bash specific construct if [ "${key}" = "arp_ip_target" -a "${#value}" != "0" -a "+${value%%+*}" != "+" ]; then OLDIFS=$IFS; IFS=','; for arp_ip in $value; do echo +$arp_ip > /sys/class/net/${netif}/bonding/$key done IFS=$OLDIFS; else echo $value > /sys/class/net/${netif}/bonding/$key fi done linkup $netif for slave in $bondslaves ; do ip link set $slave down echo "+$slave" > /sys/class/net/$bondname/bonding/slaves linkup $slave done # add the bits to setup the needed post enslavement parameters for arg in $BONDING_OPTS ; do key=${arg%%=*}; value=${arg##*=}; if [ "${key}" = "primary" ]; then echo $value > /sys/class/net/${netif}/bonding/$key fi done fi fi if [ -e /tmp/team.info ]; then . /tmp/team.info if [ "$netif" = "$teammaster" ] && [ ! -e /tmp/net.$teammaster.up ] ; then # We shall only bring up those _can_ come up # in case of some slave is gone in active-backup mode working_slaves="" for slave in $teamslaves ; do ip link set $slave up 2>/dev/null if wait_for_if_up $slave; then working_slaves+="$slave " fi done # Do not add slaves now teamd -d -U -n -t $teammaster -f /etc/teamd/$teammaster.conf for slave in $working_slaves; do # team requires the slaves to be down before joining team ip link set $slave down teamdctl $teammaster port add $slave done ip link set $teammaster up fi fi if [ -e /tmp/bridge.info ]; then . /tmp/bridge.info # start bridge if necessary if [ "$netif" = "$bridgename" ] && [ ! -e /tmp/net.$bridgename.up ]; then brctl addbr $bridgename brctl setfd $bridgename 0 for ethname in $ethnames ; do if [ "$ethname" = "$bondname" ] ; then DO_BOND_SETUP=yes ifup $bondname -m elif [ "$ethname" = "$teammaster" ] ; then DO_TEAM_SETUP=yes ifup $teammaster -m elif [ "$ethname" = "$vlanname" ]; then DO_VLAN_SETUP=yes ifup $vlanname -m else linkup $ethname fi brctl addif $bridgename $ethname done fi fi get_vid() { case "$1" in vlan*) echo ${1#vlan} ;; *.*) echo ${1##*.} ;; esac } if [ "$netif" = "$vlanname" ] && [ ! -e /tmp/net.$vlanname.up ]; then modprobe 8021q if [ "$phydevice" = "$bondname" ] ; then DO_BOND_SETUP=yes ifup $phydevice -m elif [ "$phydevice" = "$teammaster" ] ; then DO_TEAM_SETUP=yes ifup $phydevice -m else linkup "$phydevice" fi ip link add dev "$vlanname" link "$phydevice" type vlan id "$(get_vid $vlanname)" ip link set "$vlanname" up fi # No ip lines default to dhcp ip=$(getarg ip) if [ -z "$ip" ]; then namesrv=$(getargs nameserver) for s in $namesrv; do echo nameserver $s >> /tmp/net.$netif.resolv.conf done if [ "$netroot" = "dhcp6" ]; then do_dhcp -6 else do_dhcp -4 fi fi # Specific configuration, spin through the kernel command line # looking for ip= lines for p in $(getargs ip=); do ip_to_var $p # skip ibft [ "$autoconf" = "ibft" ] && continue # skip if same configuration appears twice while read line do [ "$line" = "$p" ] && continue 2 done < /tmp/net.${netif}.conf echo $p >> /tmp/net.${netif}.conf case "$dev" in ??:??:??:??:??:??) # MAC address _dev=$(iface_for_mac $dev) [ -n "$_dev" ] && dev="$_dev" ;; ??-??-??-??-??-??) # MAC address in BOOTIF form _dev=$(iface_for_mac $(fix_bootif $dev)) [ -n "$_dev" ] && dev="$_dev" ;; esac # If this option isn't directed at our interface, skip it [ -n "$dev" ] && [ "$dev" != "$netif" ] && \ [ "$use_bridge" != 'true' ] && \ [ "$use_vlan" != 'true' ] && continue # setup nameserver namesrv="$dns1 $dns2 $(getargs nameserver)" for s in $namesrv; do echo nameserver $s >> /tmp/net.$netif.resolv.conf done case $autoconf in dhcp4|dhcp|on|any) do_dhcp -4 ;; dhcp6) load_ipv6 do_dhcp -6 ;; auto6) echo $netif > /tmp/net.$netif.auto6 do_ipv6auto ;; static) do_ifcfg ;; *) do_static ;; esac if [ $? -eq 0 ]; then > /tmp/net.${netif}.up setup_net $netif source_hook initqueue/online $netif if [ -z "$manualup" ]; then /sbin/netroot $netif fi fi done # netif isn't the top stack? Then we should exit here. # eg. netif is bond0. br0 is on top of it. dhcp br0 is correct but dhcp # bond0 doesn't make sense. if [ -n "$DO_BOND_SETUP" -o -n "$DO_TEAM_SETUP" -o -n "$DO_VLAN_SETUP" ]; then exit 0 fi # no ip option directed at our interface? if [ ! -e /tmp/net.${netif}.up ]; then if getargs 'ip=dhcp6'; then load_ipv6 do_dhcp -6 else do_dhcp -4 fi fi if [ -e /tmp/net.${netif}.up ]; then > /tmp/net.$netif.did-setup [ -e /sys/class/net/$netif/address ] && \ > /tmp/net.$(cat /sys/class/net/$netif/address).did-setup fi exit 0 070701000F008C000081ED0000000000000000000000015329C2C8000004CD000000FD0000000000000000000000000000005800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/40network/ifname-genrules.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # if there are no ifname parameters, just use NAME=KERNEL if ! getarg ifname= >/dev/null ; then return fi command -v parse_ifname_opts >/dev/null || . /lib/net-lib.sh { for p in $(getargs ifname=); do parse_ifname_opts $p if [ -f /tmp/ifname-$ifname_mac ]; then read oldif < /tmp/ifname-$ifname_mac fi if [ -f /tmp/ifname-$ifname_if ]; then read oldmac < /tmp/ifname-$ifname_if fi if [ -n "$oldif" -a -n "$oldmac" -a "$oldif" = "$ifname_if" -a "$oldmac" = "$ifname_mac" ]; then # skip same ifname= declaration continue fi [ -n "$oldif" ] && warn "Multiple interface names specified for MAC $ifname_mac: $oldif" [ -n "$oldmac" ] && warn "Multiple MAC specified for $ifname_if: $oldmac" printf 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="%s", ATTR{type}=="1", NAME="%s"\n' "$ifname_mac" "$ifname_if" echo $ifname_if > /tmp/ifname-$ifname_mac echo $ifname_mac > /tmp/ifname-$ifname_if done } >> /etc/udev/rules.d/80-ifname.rules 070701000F0115000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95debug070701000F0116000081ED000000000000000000000001555B5D02000001E5000000FD0000000000000000000000000000005300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95debug/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { # do not add this module by default return 255 } # called by dracut depends() { return 0 } # called by dracut install() { inst_multiple -o ps grep more cat rm strace free showmount \ ping netstat rpcinfo vi scp ping6 ssh find vi \ fsck fsck.ext2 fsck.ext4 fsck.ext3 fsck.ext4dev fsck.vfat e2fsck } 070701000F01F4000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/02fips-aesni070701000F01F5000081ED0000000000000000000000015329C2C80000028B000000FD0000000000000000000000000000005800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/02fips-aesni/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { return 255 } # called by dracut depends() { return 0 } # called by dracut installkernel() { local _fipsmodules _mod _fipsmodules="aesni-intel ghash_clmulni_intel" mkdir -m 0755 -p "${initdir}/etc/modprobe.d" for _mod in $_fipsmodules; do if instmods $_mod; then echo $_mod >> "${initdir}/etc/fipsmodules" echo "blacklist $_mod" >> "${initdir}/etc/modprobe.d/fips.conf" fi done } # called by dracut install() { return 0 } 070701000F0061000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/00bash070701000F0062000081ED0000000000000000000000015329C2C8000001D7000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/00bash/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { require_binaries /bin/bash } # called by dracut depends() { return 0 } # called by dracut install() { # If another shell is already installed, do not use bash [[ -x $initdir/bin/sh ]] && return # Prefer bash as /bin/sh if it is available. inst /bin/bash && ln -sf bash "${initdir}/bin/sh" } 070701000F01A9000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/99uefi-lib070701000F01AA000081ED0000000000000000000000015329C2C8000000EF000000FD0000000000000000000000000000005600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/99uefi-lib/module-setup.sh#!/bin/bash # module-setup for img-lib # called by dracut check() { return 255 } # called by dracut depends() { echo bash return 0 } # called by dracut install() { inst_simple "$moddir/uefi-lib.sh" "/lib/uefi-lib.sh" } 070701000F01AB000081ED0000000000000000000000015329C2C8000012F3000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/99uefi-lib/uefi-lib.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # # Copyright 2013 Red Hat, Inc. All rights reserved. # Copyright 2013 Harald Hoyer # # 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; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # getbyte () { local IFS= LC_CTYPE=C res c read -r -n 1 -d '' c res=$? # the single quote in the argument of the printf # yields the numeric value of $c (ASCII since LC_CTYPE=C) [[ -n $c ]] && c=$(printf '%u' "'$c") || c=0 printf "$c" return $res } getword () { local b1 b2 val b1=$(getbyte) || return 1 b2=$(getbyte) || return 1 (( val = b2 * 256 + b1 )) echo $val return 0 } # Acpi(PNP0A08,0x0)/Pci(0x3,0x0)/Pci(0x0,0x0)/MAC(90E2BA265ED4,0x0)/Vlan(172)/Fibre(0x4EA06104A0CC0050,0x0) uefi_device_path() { local IFS= LC_CTYPE=C res tt len type hextype first first=1 while :; do type=$(getbyte) || return 1 subtype=$(getbyte) || return 1 len=$(getword) || return 1 hextype=$(printf "%02x%02x" "$type" "$subtype") if [[ $first == 1 ]]; then first=0 elif [[ $hextype != "7fff" ]]; then printf "/" fi case $hextype in 0101) # PCI tt=$(getword) printf "PCI(0x%x,0x%x)" $(($tt / 256)) $(($tt & 255)) ;; 0201) # ACPI printf "Acpi(0x%x,0x%x)" $(($(getword) + $(getword) * 65536)) $(($(getword) + $(getword) * 65536)) ;; 0303) # FIBRE getword &>/dev/null getword &>/dev/null printf "Fibre(0x%x%x%x%x%x%x%x%x,0x%x)" \ $(getbyte) $(getbyte) $(getbyte) $(getbyte) \ $(getbyte) $(getbyte) $(getbyte) $(getbyte) \ $(( $(getword) + $(getword) * 65536 + 4294967296 * ( $(getword) + $(getword) * 65536 ) )) ;; 030b) # MAC printf "MAC(%02x%02x%02x%02x%02x%02x," $(getbyte) $(getbyte) $(getbyte) $(getbyte) $(getbyte) $(getbyte) read -r -N 26 tt || return 1 printf "0x%x)" $(getbyte) ;; 0314) # VLAN printf "VLAN(%d)" $(getword) ;; 7fff) # END printf "\n" return 0 ;; *) printf "Unknown(Type:%d SubType:%d len=%d)" "$type" "$subtype" "$len" read -r -N $(($len-4)) tt || return 1 ;; esac done } get_fcoe_boot_mac() { data=${1:-/sys/firmware/efi/vars/FcoeBootDevice-a0ebca23-5f9c-447a-a268-22b6c158c2ac/data} [ -f $data ] || return 1 local IFS= LC_CTYPE=C tt len type hextype first=1 while :; do type=$(getbyte) || return 1 subtype=$(getbyte) || return 1 len=$(getword) || return 1 hextype=$(printf "%02x%02x" "$type" "$subtype") case $hextype in 030b) # MAC printf "%02x:%02x:%02x:%02x:%02x:%02x" $(getbyte) $(getbyte) $(getbyte) $(getbyte) $(getbyte) $(getbyte) read -r -N 27 tt || return 1 ;; 7fff) # END return 0 ;; *) read -r -N $(($len-4)) tt || return 1 ;; esac done < $data } get_fcoe_boot_vlan() { data=${1:-/sys/firmware/efi/vars/FcoeBootDevice-a0ebca23-5f9c-447a-a268-22b6c158c2ac/data} [ -f $data ] || return 1 local IFS= LC_CTYPE=C tt len type hextype first=1 while :; do type=$(getbyte) || return 1 subtype=$(getbyte) || return 1 len=$(getword) || return 1 hextype=$(printf "%02x%02x" "$type" "$subtype") case $hextype in 0314) # VLAN printf "%d" $(getword) ;; 7fff) # END return 0 ;; *) read -r -N $(($len-4)) tt || return 1 ;; esac done < $data } 070701000F0162000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98syslog070701000F0166000081A40000000000000000000000015329C2C800000334000000FD0000000000000000000000000000005100000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98syslog/rsyslog.conf#rsyslog v3 config file # if you experience problems, check # http://www.rsyslog.com/troubleshoot for assistance #### MODULES #### $ModLoad imuxsock.so # provides support for local system logging (e.g. via logger command) $ModLoad imklog.so # provides kernel logging support (previously done by rklogd) #$ModLoad immark.so # provides --MARK-- message capability # Provides UDP syslog reception #$ModLoad imudp.so #$UDPServerRun 514 # Provides TCP syslog reception #$ModLoad imtcp.so #$InputTCPServerRun 514 #### GLOBAL DIRECTIVES #### # Use default timestamp format $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat # File syncing capability is disabled by default. This feature is usually not required, # not useful and an extreme performance hit #$ActionFileEnableSync on #### RULES #### 070701000F0163000081A40000000000000000000000015329C2C800000340000000FD0000000000000000000000000000004B00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98syslog/READMESyslog support for dracut This module provides syslog functionality in the initrd. This is especially interesting when complex configuration being used to provide access to the device the rootfs resides on. When this module is installed into the ramfs it is triggered by the udev event from the nic being setup (online). Then if syslog is configured it is started and will forward all kernel messages to the given syslog server. The syslog implementation is detected automatically by finding the apropriate binary with the following order: rsyslogd syslogd syslog-ng Then if detected the syslog.conf is generated and syslog is started. Bootparameters: syslogserver=ip Where to syslog to sysloglevel=level What level has to be logged syslogtype=rsyslog|syslog|syslogng Don't auto detect syslog but set it 070701000F0164000081ED0000000000000000000000015329C2C80000050F000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98syslog/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { # do not add this module by default return 255 } # called by dracut depends() { return 0 } # called by dracut install() { local _i local _installs if type -P rsyslogd >/dev/null; then _installs="rsyslogd" inst_libdir_file rsyslog/lmnet.so rsyslog/imklog.so rsyslog/imuxsock.so elif type -P syslogd >/dev/null; then _installs="syslogd" elif type -P syslog-ng >/dev/null; then _installs="syslog-ng" else derror "Could not find any syslog binary although the syslogmodule" \ "is selected to be installed. Please check." fi if [ -n "$_installs" ]; then inst_multiple cat $_installs inst_hook cmdline 90 "$moddir/parse-syslog-opts.sh" inst_hook pre-udev 61 "$moddir/syslog-genrules.sh" inst_hook cleanup 99 "$moddir/syslog-cleanup.sh" inst_simple "$moddir/rsyslogd-start.sh" /sbin/rsyslogd-start inst_simple "$moddir/rsyslogd-stop.sh" /sbin/rsyslogd-stop mkdir -m 0755 -p ${initdir}/etc/templates inst_simple "${moddir}/rsyslog.conf" /etc/templates fi dracut_need_initqueue } 070701000F0168000081ED0000000000000000000000015329C2C800000156000000FD0000000000000000000000000000005500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98syslog/rsyslogd-stop.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # Kills rsyslogd if [ -f /var/run/syslogd.pid ]; then read pid < /var/run/syslogd.pid kill $pid kill -0 $pid && kill -9 $pid else warn "rsyslogd-stop: Could not find a pid for rsyslogd. Won't kill it." fi070701000F0167000081ED0000000000000000000000015329C2C800000358000000FD0000000000000000000000000000005600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98syslog/rsyslogd-start.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # Triggered by udev and starts rsyslogd with bootparameters type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh rsyslog_config() { local server=$1 shift local syslog_template=$1 shift local filters=$* local filter= cat $syslog_template for filter in $filters; do echo "${filter} @${server}" done # echo "*.* /tmp/syslog" } read server < /tmp/syslog.server read filters < /tmp/syslog.filters [ -z "$filters" ] && filters="kern.*" read conf < /tmp/syslog.conf [ -z "$conf" ] && conf="/etc/rsyslog.conf" && echo "$conf" > /tmp/syslog.conf template=/etc/templates/rsyslog.conf if [ -n "$server" ]; then rsyslog_config "$server" "$template" "$filters" > $conf rsyslogd -c3 fi 070701000F0165000081ED0000000000000000000000015329C2C8000002F3000000FD0000000000000000000000000000005900000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98syslog/parse-syslog-opts.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # Parses the syslog commandline options # #Bootparameters: #syslogserver=ip Where to syslog to #sysloglevel=level What level has to be logged #syslogtype=rsyslog|syslog|syslogng # Don't auto detect syslog but set it type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh syslogserver=$(getarg syslog.server -d syslog) syslogfilters=$(getargs syslog.filter -d filter) syslogtype=$(getarg syslog.type -d syslogtype) [ -n "$syslogserver" ] && echo $syslogserver > /tmp/syslog.server [ -n "$syslogfilters" ] && echo "$syslogfilters" > /tmp/syslog.filters [ -n "$syslogtype" ] && echo "$syslogtype" > /tmp/syslog.type 070701000F0169000081ED0000000000000000000000015329C2C800000205000000FD0000000000000000000000000000005600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98syslog/syslog-cleanup.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # Just cleans up a previously started syslogd type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh if [ -f /tmp/syslog.server ]; then read syslogtype < /tmp/syslog.type if command -v "${syslogtype}-stop" >/dev/null; then ${syslogtype}-stop else warn "syslog-cleanup: Could not find script to stop syslog of type \"$syslogtype\". Syslog will not be stopped." fi fi070701000F016A000081ED0000000000000000000000015329C2C800000478000000FD0000000000000000000000000000005700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98syslog/syslog-genrules.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # Creates the syslog udev rules to be triggered when interface becomes online. type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh detect_syslog() { syslogtype="" if [ -e /sbin/rsyslogd ]; then syslogtype="rsyslogd" elif [ -e /sbin/syslogd ]; then syslogtype="syslogd" elif [ /sbin/syslog-ng ]; then syslogtype="syslog-ng" else warn "Could not find any syslog binary although the syslogmodule is selected to be installed. Please check." fi echo "$syslogtype" [ -n "$syslogtype" ] } read syslogtype < /tmp/syslog.type if [ -z "$syslogtype" ]; then syslogtype=$(detect_syslog) echo $syslogtype > /tmp/syslog.type fi if [ -e "/sbin/${syslogtype}-start" ]; then printf 'ACTION=="online", SUBSYSTEM=="net", RUN+="/sbin/initqueue --onetime /sbin/'${syslogtype}'-start $env{INTERFACE}"\n' > /etc/udev/rules.d/70-syslog.rules else warn "syslog-genrules: Could not find binary to start syslog of type \"$syslogtype\". Syslog will not be started." fi 070701000F00BF000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90dm070701000F00C0000081A40000000000000000000000015329C2C80000008E000000FD0000000000000000000000000000004C00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90dm/11-dm.rulesSUBSYSTEM!="block", GOTO="dm_end" KERNEL!="dm-[0-9]*", GOTO="dm_end" ACTION!="add|change", GOTO="dm_end" OPTIONS+="db_persist" LABEL="dm_end" 070701000F00C4000081ED000000000000000000000001555B5D0200000468000000FD0000000000000000000000000000005000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90dm/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { require_binaries dmsetup || return 1 return 255 } # called by dracut depends() { return 0 } # called by dracut installkernel() { instmods =drivers/md instmods dm_mod dm-cache dm-cache-mq dm-cache-cleaner } # called by dracut install() { modinfo -k $kernel dm_mod >/dev/null 2>&1 && \ inst_hook pre-udev 30 "$moddir/dm-pre-udev.sh" inst_multiple dmsetup inst_multiple -o dmeventd inst_libdir_file "libdevmapper-event.so*" inst_rules 10-dm.rules 13-dm-disk.rules 95-dm-notify.rules # Gentoo ebuild for LVM2 prior to 2.02.63-r1 doesn't install above rules # files, but provides the one below: inst_rules 64-device-mapper.rules # debian udev rules inst_rules 60-persistent-storage-dm.rules 55-dm.rules inst_rules "$moddir/11-dm.rules" inst_rules "$moddir/59-persistent-storage-dm.rules" prepare_udev_rules 59-persistent-storage-dm.rules inst_hook shutdown 30 "$moddir/dm-shutdown.sh" } 070701000F00C1000081A40000000000000000000000015329C2C80000029E000000FD0000000000000000000000000000005F00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90dm/59-persistent-storage-dm.rulesSUBSYSTEM!="block", GOTO="dm_end" ACTION!="add|change", GOTO="dm_end" # Also don't process disks that are slated to be a multipath device ENV{DM_MULTIPATH_DEVICE_PATH}=="?*", GOTO="dm_end" KERNEL!="dm-[0-9]*", GOTO="dm_end" ACTION=="add", GOTO="dm_end" IMPORT{program}="/sbin/dmsetup info -c --nameprefixes --unquoted --rows --noheadings -o name,uuid,suspended,readonly,major,minor,open,tables_loaded,names_using_dev -j%M -m%m" ENV{DM_NAME}!="?*", GOTO="dm_end" ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=="1", GOTO="dm_end" ENV{DM_UUID}=="CRYPT-TEMP-?*", GOTO="dm_end" ENV{DM_UUID}!="?*", ENV{DM_NAME}=="temporary-cryptsetup-?*", GOTO="dm_end" IMPORT BLKID LABEL="dm_end" 070701000F00C2000081ED0000000000000000000000015329C2C8000000D3000000FD0000000000000000000000000000004F00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90dm/dm-pre-udev.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh strstr "$(cat /proc/misc)" device-mapper || modprobe dm_mod modprobe dm_mirror 2>/dev/null 070701000F00C3000081ED0000000000000000000000015329C2C8000001D1000000FD0000000000000000000000000000004F00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90dm/dm-shutdown.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh _do_dm_shutdown() { local ret local final=$1 info "Disassembling device-mapper devices" dmsetup -v remove_all ret=$? if [ "x$final" != "x" ]; then info "dmsetup ls --tree" dmsetup ls --tree 2>&1 | vinfo fi return $ret } if command -v dmsetup >/dev/null; then _do_dm_shutdown $1 else : fi 070701000F00A0000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004100000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/50drm070701000F00A1000081ED0000000000000000000000015329C2C8000007EE000000FD0000000000000000000000000000005100000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/50drm/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { return 255 } # called by dracut depends() { return 0 } # called by dracut installkernel() { local _modname # Include KMS capable drm drivers drm_module_filter() { local _drm_drivers='drm_crtc_init' local _ret # subfunctions inherit following FDs local _merge=8 _side2=9 function nmf1() { local _fname _fcont while read _fname; do case "$_fname" in *.ko) _fcont="$(< $_fname)" ;; *.ko.gz) _fcont="$(gzip -dc $_fname)" ;; *.ko.xz) _fcont="$(xz -dc $_fname)" ;; esac [[ $_fcont =~ $_drm_drivers && ! $_fcont =~ iw_handler_get_spy ]] \ && echo "$_fname" done } function rotor() { local _f1 _f2 while read _f1; do echo "$_f1" if read _f2; then echo "$_f2" 1>&${_side2} fi done | nmf1 1>&${_merge} } # Use two parallel streams to filter alternating modules. set +x eval "( ( rotor ) ${_side2}>&1 | nmf1 ) ${_merge}>&1" [[ $debug ]] && set -x return 0 } for _modname in $(find_kernel_modules_by_path drivers/gpu/drm \ | drm_module_filter) ; do # if the hardware is present, include module even if it is not currently loaded, # as we could e.g. be in the installer; nokmsboot boot parameter will disable # loading of the driver if needed if [[ $hostonly ]] && modinfo -F alias $_modname | sed -e 's,\?,\.,g' -e 's,\*,\.\*,g' \ | grep -qxf - /sys/bus/pci/devices/*/modalias 2>/dev/null; then hostonly='' instmods $_modname continue fi instmods $_modname done } 070701000F00FA000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/91crypt-gpg070701000F00FB000081ED0000000000000000000000015329C2C800000434000000FD0000000000000000000000000000005800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/91crypt-gpg/crypt-gpg-lib.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=4 sw=4 sts=0 et filetype=sh command -v ask_for_password >/dev/null || . /lib/dracut-crypt-lib.sh # gpg_decrypt mnt_point keypath keydev device # # Decrypts encrypted symmetrically key to standard output. # # mnt_point - mount point where is already mounted # keypath - GPG encrypted key path relative to # keydev - device on which key resides; only to display in prompt # device - device to be opened by cryptsetup; only to display in prompt gpg_decrypt() { local mntp="$1" local keypath="$2" local keydev="$3" local device="$4" local gpghome=/tmp/gnupg local opts="--homedir $gpghome --no-mdc-warning --skip-verify --quiet" opts="$opts --logger-file /dev/null --batch --no-tty --passphrase-fd 0" mkdir -m 0700 -p "$gpghome" ask_for_password \ --cmd "gpg $opts --decrypt $mntp/$keypath" \ --prompt "Password ($keypath on $keydev for $device)" \ --tries 3 --tty-echo-off rm -rf -- "$gpghome" } 070701000F00FC000081ED0000000000000000000000015329C2C800000195000000FD0000000000000000000000000000005700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/91crypt-gpg/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # GPG support is optional # called by dracut check() { require_binaries gpg || return 1 return 255 } # called by dracut depends() { echo crypt } # called by dracut install() { inst_multiple gpg inst "$moddir/crypt-gpg-lib.sh" "/lib/dracut-crypt-gpg-lib.sh" } 070701000F0141000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95terminfo070701000F0142000081ED0000000000000000000000015329C2C800000296000000FD0000000000000000000000000000005600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95terminfo/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut install() { local _terminfodir # terminfo bits make things work better if you fall into interactive mode for _terminfodir in /lib/terminfo /etc/terminfo /usr/share/terminfo; do [ -f ${_terminfodir}/l/linux ] && break done if [ -d ${_terminfodir} ]; then for i in "l/linux" "v/vt100" "v/vt102" "v/vt220"; do inst_dir "$_terminfodir/${i%/*}" cp --reflink=auto --sparse=auto -prfL -t "${initdir}/${_terminfodir}/${i%/*}" "$_terminfodir/$i" done fi } 070701000F012E000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004100000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95nfs070701000F0132000081ED0000000000000000000000015329C2C8000003BB000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95nfs/nfsroot-cleanup.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type incol2 >/dev/null 2>&1 || . /lib/dracut-lib.sh [ -f /tmp/nfs.rpc_pipefs_path ] && rpcpipefspath=`cat /tmp/nfs.rpc_pipefs_path` [ -z "$rpcpipefspath" ] && rpcpipefspath=var/lib/nfs/rpc_pipefs pid=$(pidof rpc.statd) [ -n "$pid" ] && kill $pid pid=$(pidof rpc.idmapd) [ -n "$pid" ] && kill $pid pid=$(pidof rpcbind) [ -n "$pid" ] && kill $pid if incol2 /proc/mounts /var/lib/nfs/rpc_pipefs; then # try to create the destination directory [ -d $NEWROOT/$rpcpipefspath ] || \ mkdir -m 0755 -p $NEWROOT/$rpcpipefspath 2>/dev/null if [ -d $NEWROOT/$rpcpipefspath ]; then # mount --move does not seem to work??? mount --bind /var/lib/nfs/rpc_pipefs $NEWROOT/$rpcpipefspath umount /var/lib/nfs/rpc_pipefs 2>/dev/null else umount /var/lib/nfs/rpc_pipefs 2>/dev/null fi fi 070701000F012F000081ED000000000000000000000001555B5D0200000FC5000000FD0000000000000000000000000000005100000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95nfs/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { # If our prerequisites are not met, fail anyways. require_any_binary rpcbind portmap || return 1 require_binaries rpc.statd mount.nfs mount.nfs4 umount || return 1 [[ $hostonly ]] || [[ $mount_needs ]] && { for fs in ${host_fs_types[@]}; do [[ "$fs" == "nfs" ]] && return 0 [[ "$fs" == "nfs3" ]] && return 0 [[ "$fs" == "nfs4" ]] && return 0 done return 255 } return 0 } # called by dracut depends() { # We depend on network modules being loaded echo network } # called by dracut installkernel() { hostonly='' instmods nfs sunrpc ipv6 nfsv2 nfsv3 nfsv4 nfs_acl nfs_layout_nfsv41_files lockd rpcsec_gss_krb5 auth_rpcgss } cmdline() { local nfs_device local nfs_options local nfs_root local nfs_address local lookup local ifname ### nfsroot= ### nfs_device=$(findmnt -t nfs4 -n -o SOURCE /) if [ -n "$nfs_device" ];then nfs_root="root=nfs4:$nfs_device" else nfs_device=$(findmnt -t nfs -n -o SOURCE /) [ -z "$nfs_device" ] && return nfs_root="root=nfs:$nfs_device" fi nfs_options=$(findmnt -t nfs4,nfs -n -o OPTIONS /) [ -n "$nfs_options" ] && nfs_root="$nfs_root:$nfs_options" echo "$nfs_root" ### ip= ### if [[ $nfs_device = [0-9]*\.[0-9]*\.[0-9]*.[0-9]* ]] || [[ $nfs_device = \[.*\] ]]; then nfs_address="$nfs_device" else lookup=$(host $(echo ${nfs_device%%:*})| head -n1) nfs_address=${lookup##* } fi ifname=$(ip -o route get to $nfs_address | sed -n 's/.*dev \([^ ]*\).*/\1/p') if [ -e /sys/class/net/$ifname/address ] ; then ifmac=$(cat /sys/class/net/$ifname/address) printf 'ifname=%s:%s ' ${ifname} ${ifmac} fi printf 'ip=%s:static\n' ${ifname} } # called by dracut install() { local _i local _nsslibs inst_multiple -o portmap rpcbind rpc.statd mount.nfs \ mount.nfs4 umount rpc.idmapd sed /etc/netconfig host sed inst_multiple /etc/services /etc/nsswitch.conf /etc/rpc /etc/protocols /etc/idmapd.conf if [[ $hostonly_cmdline == "yes" ]]; then local _netconf="$(cmdline)" [[ $_netconf ]] && printf "%s\n" "$_netconf" >> "${initdir}/etc/cmdline.d/95nfs.conf" fi if [ -f /lib/modprobe.d/nfs.conf ]; then inst_multiple /lib/modprobe.d/nfs.conf else [ -d $initdir/etc/modprobe.d/ ] || mkdir $initdir/etc/modprobe.d echo "alias nfs4 nfs" > $initdir/etc/modprobe.d/nfs.conf fi inst_libdir_file 'libnfsidmap_nsswitch.so*' 'libnfsidmap/*.so' 'libnfsidmap*.so*' _nsslibs=$(sed -e '/^#/d' -e 's/^.*://' -e 's/\[NOTFOUND=return\]//' /etc/nsswitch.conf \ | tr -s '[:space:]' '\n' | sort -u | tr -s '[:space:]' '|') _nsslibs=${_nsslibs#|} _nsslibs=${_nsslibs%|} inst_libdir_file -n "$_nsslibs" 'libnss_*.so*' inst_hook cmdline 90 "$moddir/parse-nfsroot.sh" inst_hook pre-udev 99 "$moddir/nfs-start-rpc.sh" inst_hook cleanup 99 "$moddir/nfsroot-cleanup.sh" inst "$moddir/nfsroot.sh" "/sbin/nfsroot" inst "$moddir/nfs-lib.sh" "/lib/nfs-lib.sh" mkdir -m 0755 -p "$initdir/var/lib/nfs/rpc_pipefs" mkdir -m 0755 -p "$initdir/var/lib/rpcbind" mkdir -m 0755 -p "$initdir/var/lib/nfs/statd/sm" # Rather than copy the passwd file in, just set a user for rpcbind # We'll save the state and restart the daemon from the root anyway egrep '^nfsnobody:|^rpc:|^rpcuser:' /etc/passwd >> "$initdir/etc/passwd" egrep '^nogroup:|^rpc:|^nobody:' /etc/group >> "$initdir/etc/group" # rpc user needs to be able to write to this directory to save the warmstart # file chmod 770 "$initdir/var/lib/rpcbind" egrep -q '^rpc:' /etc/passwd \ && egrep -q '^rpc:' /etc/group \ && chown rpc.rpc "$initdir/var/lib/rpcbind" dracut_need_initqueue } 070701000F0130000081ED000000000000000000000001555B5D02000010DC000000FD0000000000000000000000000000004C00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95nfs/nfs-lib.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh . /lib/net-lib.sh # TODO: make these things not pollute the calling namespace # nfs_to_var NFSROOT [NETIF] # use NFSROOT to set $nfs, $server, $path, and $options. # NFSROOT is something like: nfs[4]::/[:|,] # NETIF is used to get information from DHCP options, if needed. nfs_to_var() { # Unfortunately, there's multiple styles of nfs "URL" in use, so we need # extra functions to parse them into $nfs, $server, $path, and $options. # FIXME: local netif=${2:-$netif}? case "$1" in nfs://*) rfc2224_nfs_to_var "$1" ;; nfs:*:*:/*) anaconda_nfs_to_var "$1" ;; *) nfsroot_to_var "$1" ;; esac # if anything's missing, try to fill it in from DHCP options if [ -z "$server" ] || [ -z "$path" ]; then nfsroot_from_dhcp $2; fi # if there's a "%s" in the path, replace it with the hostname/IP if strstr "$path" "%s"; then local node="" read node < /proc/sys/kernel/hostname [ "$node" = "(none)" ] && node=$(get_ip $2) path=${path%%%s*}$node${path#*%s} # replace only the first %s fi } # root=nfs:[:][:] # root=nfs4:[:][:] nfsroot_to_var() { # strip nfs[4]: local arg="$@:" nfs="${arg%%:*}" arg="${arg##$nfs:}" # check if we have a server if strstr "$arg" ':/' ; then server="${arg%%:/*}" arg="/${arg##*:/}" fi path="${arg%%:*}" # rest are options options="${arg##$path}" # strip leading ":" options="${options##:}" # strip ":" options="${options%%:}" # Does it really start with '/'? [ -n "${path%%/*}" ] && path="error"; #Fix kernel legacy style separating path and options with ',' if [ "$path" != "${path#*,}" ] ; then options=${path#*,} path=${path%%,*} fi } # RFC2224: nfs://[:]/ rfc2224_nfs_to_var() { nfs="nfs" server="${1#nfs://}" path="/${server#*/}" server="${server%%/*}" server="${server%%:}" # anaconda compat (nfs://:/) local port="${server##*:}" [ "$port" != "$server" ] && options="port=$port" } # Anaconda-style path with options: nfs:::/ # (without mount options, anaconda is the same as dracut) anaconda_nfs_to_var() { nfs="nfs" options="${1#nfs:}" server="${options#*:}" server="${server%:/*}" options="${options%%:*}" path="/${1##*:/}" } # nfsroot_from_dhcp NETIF # fill in missing server/path from DHCP options. nfsroot_from_dhcp() { local f for f in /tmp/net.$1.override /tmp/dhclient.$1.dhcpopts; do [ -f $f ] && . $f done [ -n "$new_root_path" ] && nfsroot_to_var "$nfs:$new_root_path" [ -z "$path" ] && [ "$(getarg root=)" == "/dev/nfs" ] && path=/tftpboot/%s [ -z "$server" ] && server=$srv [ -z "$server" ] && server=$new_dhcp_server_identifier [ -z "$server" ] && server=$new_next_server [ -z "$server" ] && server=${new_root_path%%:*} } # Look through $options, fix "rw"/"ro", move "lock"/"nolock" to $nfslock munge_nfs_options() { local f="" flags="" nfsrw="ro" OLDIFS="$IFS" IFS=, for f in $options; do case $f in ro|rw) nfsrw=$f ;; lock|nolock) nfslock=$f ;; *) flags=${flags:+$flags,}$f ;; esac done IFS="$OLDIFS" # Override rw/ro if set on cmdline getarg ro >/dev/null && nfsrw=ro getarg rw >/dev/null && nfsrw=rw options=$nfsrw${flags:+,$flags} } # mount_nfs NFSROOT MNTDIR [NETIF] mount_nfs() { local nfsroot="$1" mntdir="$2" netif="$3" local nfs="" server="" path="" options="" nfs_to_var $nfsroot $netif munge_nfs_options if [ "$nfs" = "nfs4" ]; then options=$options${nfslock:+,$nfslock} else # NFSv{2,3} doesn't support using locks as it requires a helper to # transfer the rpcbind state to the new root [ "$nfslock" = "lock" ] \ && warn "Locks unsupported on NFSv{2,3}, using nolock" 1>&2 options=$options,nolock fi mount -t $nfs -o$options $server:$path $mntdir } 070701000F0133000081ED0000000000000000000000015329C2C800000339000000FD0000000000000000000000000000004C00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95nfs/nfsroot.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh . /lib/nfs-lib.sh [ "$#" = 3 ] || exit 1 # root is in the form root=nfs[4]:[server:]path[:options], either from # cmdline or dhcp root-path netif="$1" root="$2" NEWROOT="$3" nfs_to_var $root $netif [ -z "$server" ] && die "Required parameter 'server' is missing" mount_nfs $root $NEWROOT $netif && { [ -e /dev/root ] || ln -s null /dev/root ; [ -e /dev/nfs ] || ln -s null /dev/nfs; } [ -f $NEWROOT/etc/fstab ] && cat $NEWROOT/etc/fstab > /dev/null # inject new exit_if_exists echo 'settle_exit_if_exists="--exit-if-exists=/dev/root"; rm -- "$job"' > $hookdir/initqueue/nfs.sh # force udevsettle to break > $hookdir/initqueue/work need_shutdown 070701000F0131000081ED0000000000000000000000015329C2C8000003A1000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95nfs/nfs-start-rpc.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh if modprobe sunrpc || strstr "$(cat /proc/filesystems)" rpc_pipefs; then [ ! -d /var/lib/nfs/rpc_pipefs/nfs ] && \ mount -t rpc_pipefs rpc_pipefs /var/lib/nfs/rpc_pipefs # Start rpcbind or rpcbind # FIXME occasionally saw 'rpcbind: fork failed: No such device' -- why? command -v portmap >/dev/null && [ -z "$(pidof portmap)" ] && portmap command -v rpcbind >/dev/null && [ -z "$(pidof rpcbind)" ] && rpcbind # Start rpc.statd as mount won't let us use locks on a NFSv4 # filesystem without talking to it. NFSv4 does locks internally, # rpc.lockd isn't needed [ -z "$(pidof rpc.statd)" ] && rpc.statd [ -z "$(pidof rpc.idmapd)" ] && rpc.idmapd else warn 'Kernel module "sunrpc" not in the initramfs, or support for filesystem "rpc_pipefs" missing!' fi 070701000F0134000081ED0000000000000000000000015329C2C800000CAF000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95nfs/parse-nfsroot.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # # Preferred format: # root=nfs[4]:[server:]path[:options] # # This syntax can come from DHCP root-path as well. # # Legacy format: # root=/dev/nfs nfsroot=[server:]path[,options] # # In Legacy root=/dev/nfs mode, if the 'nfsroot' parameter is not given # on the command line or is empty, the dhcp root-path is used as # [server:]path[:options] or the default "/tftpboot/%s" will be used. # # If server is unspecified it will be pulled from one of the following # sources, in order: # static ip= option on kernel command line # DHCP next-server option # DHCP server-id option # DHCP root-path option # # NFSv4 is only used if explicitly requested with nfs4: prefix, otherwise # NFSv3 is used. # type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh # This script is sourced, so root should be set. But let's be paranoid [ -z "$root" ] && root=$(getarg root=) [ -z "$nfsroot" ] && nfsroot=$(getarg nfsroot=) [ -n "$netroot" ] && oldnetroot="$netroot" # netroot= cmdline argument must be ignored, but must be used if # we're inside netroot to parse dhcp root-path if [ -n "$netroot" ] ; then for n in $(getargs netroot=); do [ "$n" = "$netroot" ] && break done if [ "$n" = "$netroot" ]; then warn "Ignoring netroot argument for NFS" netroot=$root fi else netroot=$root; fi # LEGACY: nfsroot= is valid only if root=/dev/nfs if [ -n "$nfsroot" ] ; then # @deprecated warn "Argument nfsroot is deprecated and might be removed in a future release. See 'man dracut.kernel' for more information." if [ "$(getarg root=)" != "/dev/nfs" ]; then die "Argument nfsroot only accepted for legacy root=/dev/nfs" fi netroot=nfs:$nfsroot; fi case "$netroot" in /dev/nfs) netroot=nfs;; /dev/*) unset netroot; return;; # LEGACY: root=:/> /etc/idmapd.conf fi nfsroot_to_var $netroot [ "$path" = "error" ] && die "Argument nfsroot must contain a valid path!" # Set fstype, might help somewhere fstype=${nfs#/dev/} # Rewrite root so we don't have to parse this uglyness later on again netroot="$fstype:$server:$path:$options" # If we don't have a server, we need dhcp if [ -z "$server" ] ; then DHCPORSERVER="1" fi; # Done, all good! rootok=1 # Shut up init error check or make sure that block parser wont get # confused by having /dev/nfs[4] root="$fstype" echo '[ -e $NEWROOT/proc ]' > $hookdir/initqueue/finished/nfsroot.sh 070701000F0143000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95udev-rules070701000F0147000081ED000000000000000000000001555B5D0200000C7C000000FD0000000000000000000000000000005800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95udev-rules/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut install() { local _i # Fixme: would be nice if we didn't have to guess, which rules to grab.... # ultimately, /lib/initramfs/rules.d or somesuch which includes links/copies # of the rules we want so that we just copy those in would be best inst_multiple udevadm cat uname blkid \ /etc/udev/udev.conf [ -d ${initdir}/$systemdutildir ] || mkdir -p ${initdir}/$systemdutildir for _i in ${systemdutildir}/systemd-udevd ${udevdir}/udevd /sbin/udevd; do [ -x "$_i" ] || continue inst "$_i" if ! [[ -f ${initdir}${systemdutildir}/systemd-udevd ]]; then ln -fs "$_i" ${initdir}${systemdutildir}/systemd-udevd fi break done if ! [[ -e ${initdir}${systemdutildir}/systemd-udevd ]]; then derror "Cannot find [systemd-]udevd binary!" exit 1 fi inst_rules 50-udev-default.rules \ 55-scsi-sg3_id.rules 58-scsi-sg3_symlink.rules \ 60-persistent-storage.rules \ 61-persistent-storage-edd.rules 80-drivers.rules 95-udev-late.rules \ 60-pcmcia.rules \ 50-udev.rules 95-late.rules \ 50-firmware.rules \ 59-scsi-sg3_utils.rules \ 75-net-description.rules \ 80-net-name-slot.rules 80-net-setup-link.rules \ "$moddir/59-persistent-storage.rules" \ "$moddir/61-persistent-storage.rules" prepare_udev_rules 59-persistent-storage.rules 61-persistent-storage.rules # debian udev rules inst_rules 91-permissions.rules # eudev rules inst_rules 80-drivers-modprobe.rules for _i in \ ${systemdutildir}/network/*.link \ ${hostonly:+/etc/systemd/network/*.link} \ ; do [[ -e "$_i" ]] && inst "$_i" done { for i in cdrom tape dialout floppy; do if ! egrep -q "^$i:" "$initdir/etc/group" 2>/dev/null; then if ! egrep "^$i:" /etc/group 2>/dev/null; then case $i in cdrom) echo "$i:x:11:";; dialout) echo "$i:x:18:";; floppy) echo "$i:x:19:";; tape) echo "$i:x:33:";; esac fi fi done } >> "$initdir/etc/group" inst_multiple -o \ ${udevdir}/ata_id \ ${udevdir}/cdrom_id \ ${udevdir}/create_floppy_devices \ ${udevdir}/edd_id \ ${udevdir}/firmware.sh \ ${udevdir}/firmware \ ${udevdir}/firmware.agent \ ${udevdir}/hotplug.functions \ ${udevdir}/fw_unit_symlinks.sh \ ${udevdir}/hid2hci \ ${udevdir}/path_id \ ${udevdir}/input_id \ ${udevdir}/scsi_id \ ${udevdir}/usb_id \ ${udevdir}/pcmcia-socket-startup \ ${udevdir}/pcmcia-check-broken-cis inst_multiple -o /etc/pcmcia/config.opts [ -f /etc/arch-release ] && \ inst_script "$moddir/load-modules.sh" /lib/udev/load-modules.sh inst_libdir_file "libnss_files*" } 070701000F0145000081A40000000000000000000000015329C2C8000003FC000000FD0000000000000000000000000000006400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95udev-rules/61-persistent-storage.rulesSUBSYSTEM!="block", GOTO="pss_end" ACTION!="add|change", GOTO="pss_end" # Also don't process disks that are slated to be a multipath device ENV{DM_MULTIPATH_DEVICE_PATH}=="?*", GOTO="pss_end" ACTION=="change", KERNEL=="dm-[0-9]*", ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}!="1", GOTO="do_pss" KERNEL=="cciss[0-9]*", GOTO="do_pss" KERNEL=="nbd[0-9]*", GOTO="do_pss" KERNEL=="md[0-9]*|md_d[0-9]*|md/*", GOTO="do_pss" GOTO="pss_end" LABEL="do_pss" # by-path (parent device path) ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="", DEVPATH!="*/virtual/*", IMPORT PATH_ID ENV{DEVTYPE}=="disk", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}" ENV{DEVTYPE}=="partition", ENV{ID_PATH}=="?*", SYMLINK+="disk/by-path/$env{ID_PATH}-part%n" # by-label/by-uuid links (filesystem metadata) ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{ID_FS_UUID_ENC}=="?*", SYMLINK+="disk/by-uuid/$env{ID_FS_UUID_ENC}" ENV{ID_FS_USAGE}=="filesystem|other", ENV{ID_FS_LABEL_ENC}=="?*", SYMLINK+="disk/by-label/$env{ID_FS_LABEL_ENC}" LABEL="pss_end" 070701000F0144000081A40000000000000000000000015329C2C800000114000000FD0000000000000000000000000000006400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95udev-rules/59-persistent-storage.rulesSUBSYSTEM!="block", GOTO="ps_end" ACTION!="add|change", GOTO="ps_end" # Also don't process disks that are slated to be a multipath device ENV{DM_MULTIPATH_DEVICE_PATH}=="?*", GOTO="ps_end" KERNEL=="cciss[0-9]*", IMPORT BLKID KERNEL=="nbd[0-9]*", IMPORT BLKID LABEL="ps_end" 070701000F0146000081ED0000000000000000000000015329C2C8000000BC000000FD0000000000000000000000000000005800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95udev-rules/load-modules.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # Implement blacklisting for udev-loaded modules modprobe -b "$@" 070701000F014C000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95zfcp070701000F014D000081ED0000000000000000000000015329C2C8000002A5000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95zfcp/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { arch=$(uname -m) [ "$arch" = "s390" -o "$arch" = "s390x" ] || return 1 require_binaries zfcp_cio_free grep sed seq || return 1 return 0 } # called by dracut depends() { return 0 } # called by dracut installkernel() { instmods zfcp } # called by dracut install() { inst_hook cmdline 30 "$moddir/parse-zfcp.sh" inst_multiple zfcp_cio_free grep sed seq inst_script /sbin/zfcpconf.sh inst_rules 56-zfcp.rules if [[ $hostonly ]]; then inst_simple /etc/zfcp.conf fi } 070701000F014E000081ED000000000000000000000001555B5D0200000195000000FD0000000000000000000000000000005000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95zfcp/parse-zfcp.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh getargbool 1 rd.zfcp.conf -d -n rd_NO_ZFCPCONF || rm /etc/zfcp.conf for zfcp_arg in $(getargs rd.zfcp -d 'rd_ZFCP='); do ( local OLDIFS="$IFS" local IFS="," set $zfcp_arg IFS="$OLDIFS" echo "$@" >> /etc/zfcp.conf ) done zfcp_cio_free 070701000F00AD000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/81cio_ignore070701000F00AE000081ED000000000000000000000001555B5D020000042F000000FD0000000000000000000000000000005800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/81cio_ignore/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { # do not add this module by default local arch=$(uname -m) [ "$arch" = "s390" -o "$arch" = "s390x" ] || return 1 return 0 } cmdline() { local cio_accept if [ -e /boot/zipl/active_devices.txt ] ; then while read dev etc ; do [ "$dev" = "#" -o "$dev" = "" ] && continue; if [ -z "$cio_accept" ] ; then cio_accept="$dev" else cio_accept="${cio_accept},${dev}" fi done < /boot/zipl/active_devices.txt fi if [ -n "$cio_accept" ] ; then echo "rd.cio_accept=${cio_accept}" fi } # called by dracut install() { if [[ $hostonly_cmdline == "yes" ]] ; then local _cio_accept=$(cmdline) [[ $_cio_accept ]] && printf "%s\n" "$_cio_accept" >> "${initdir}/etc/cmdline.d/01cio_accept.conf" fi inst_hook cmdline 20 "$moddir/parse-cio_accept.sh" inst_multiple cio_ignore } 070701000F00AF000081ED000000000000000000000001555B5D02000001F0000000FD0000000000000000000000000000005C00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/81cio_ignore/parse-cio_accept.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh CIO_IGNORE=$(getarg cio_ignore) CIO_ACCEPT=$(getarg rd.cio_accept) if [ -z $CIO_IGNORE ] ; then info "cio_ignored disabled on commandline" return fi if [ -n "$CIO_ACCEPT" ] ; then OLDIFS="$IFS" IFS=, set -- $CIO_ACCEPT while (($# > 0)) ; do info "Enabling device $1" cio_ignore --remove $1 shift done IFS="$OLDIFS" fi 070701000F0148000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95virtfs070701000F014A000081ED0000000000000000000000015329C2C8000007A4000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95virtfs/mount-virtfs.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh filter_rootopts() { rootopts=$1 # strip ro and rw options local OLDIFS="$IFS" IFS=, set -- $rootopts IFS="$OLDIFS" local v while [ $# -gt 0 ]; do case $1 in rw|ro);; defaults);; *) v="$v,${1}";; esac shift done rootopts=${v#,} echo $rootopts } mount_root() { local _ret rootfs="9p" rflags="trans=virtio,version=9p2000.L" modprobe 9pnet_virtio mount -t ${rootfs} -o "$rflags",ro "${root#virtfs:}" "$NEWROOT" rootopts= if getargbool 1 rd.fstab -n rd_NO_FSTAB \ && ! getarg rootflags \ && [ -f "$NEWROOT/etc/fstab" ] \ && ! [ -L "$NEWROOT/etc/fstab" ]; then # if $NEWROOT/etc/fstab contains special mount options for # the root filesystem, # remount it with the proper options rootopts="defaults" while read dev mp fs opts rest; do # skip comments [ "${dev%%#*}" != "$dev" ] && continue if [ "$mp" = "/" ]; then rootopts=$opts break fi done < "$NEWROOT/etc/fstab" rootopts=$(filter_rootopts $rootopts) fi # we want rootflags (rflags) to take precedence so prepend rootopts to # them; rflags is guaranteed to not be empty rflags="${rootopts:+"${rootopts},"}${rflags}" umount "$NEWROOT" info "Remounting ${root#virtfs:} with -o ${rflags}" mount -t ${rootfs} -o "$rflags" "${root#virtfs:}" "$NEWROOT" 2>&1 | vinfo [ -f "$NEWROOT"/forcefsck ] && rm -f -- "$NEWROOT"/forcefsck 2>/dev/null [ -f "$NEWROOT"/.autofsck ] && rm -f -- "$NEWROOT"/.autofsck 2>/dev/null } if [ -n "$root" -a -z "${root%%virtfs:*}" ]; then mount_root fi : 070701000F0149000081ED0000000000000000000000015329C2C800000436000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95virtfs/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { [[ $hostonly ]] || [[ $mount_needs ]] && { for fs in ${host_fs_types[@]}; do [[ "$fs" == "9p" ]] && return 0 done return 255 } if type -P systemd-detect-virt >/dev/null 2>&1; then vm=$(systemd-detect-virt --vm >/dev/null 2>&1) (($? != 0)) && return 255 [[ $vm = "qemu" ]] && return 0 [[ $vm = "kvm" ]] && return 0 [[ $vm = "bochs" ]] && return 0 fi for i in /sys/class/dmi/id/*_vendor; do [[ -f $i ]] || continue read vendor < $i [[ "$vendor" == "QEMU" ]] && return 0 [[ "$vendor" == "Bochs" ]] && return 0 done return 255 } # called by dracut depends() { return 0 } # called by dracut installkernel() { instmods 9p 9pnet_virtio virtio_pci } # called by dracut install() { inst_hook cmdline 95 "$moddir/parse-virtfs.sh" inst_hook mount 99 "$moddir/mount-virtfs.sh" } 070701000F014B000081ED0000000000000000000000015329C2C8000000CB000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95virtfs/parse-virtfs.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh if [ "${root%%:*}" = "virtfs" ] ; then modprobe 9pnet_virtio rootok=1 fi 070701000F00C5000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90dmraid070701000F00C8000081ED000000000000000000000001555B5D02000008A3000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90dmraid/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { local _rootdev # if we don't have dmraid installed on the host system, no point # in trying to support it in the initramfs. require_binaries dmraid || return 1 [[ $hostonly ]] || [[ $mount_needs ]] && { for dev in "${!host_fs_types[@]}"; do [[ "${host_fs_types[$dev]}" != *_raid_member ]] && continue DEVPATH=$(get_devpath_block "$dev") for holder in "$DEVPATH"/holders/*; do [[ -e "$holder" ]] || continue [[ -e "$holder/dm" ]] && return 0 break done done return 255 } return 0 } # called by dracut depends() { echo dm rootfs-block return 0 } # called by dracut cmdline() { local _activated declare -A _activated for dev in "${!host_fs_types[@]}"; do local holder DEVPATH DM_NAME majmin [[ "${host_fs_types[$dev]}" != *_raid_member ]] && continue DEVPATH=$(get_devpath_block "$dev") for holder in "$DEVPATH"/holders/*; do [[ -e "$holder" ]] || continue dev="/dev/${holder##*/}" DM_NAME="$(dmsetup info -c --noheadings -o name "$dev" 2>/dev/null)" [[ ${DM_NAME} ]] && break done [[ ${DM_NAME} ]] || continue if ! [[ ${_activated[${DM_NAME}]} ]]; then printf "%s" " rd.dm.uuid=${DM_NAME}" _activated["${DM_NAME}"]=1 fi done } # called by dracut install() { local _i if [[ $hostonly_cmdline == "yes" ]]; then local _raidconf=$(cmdline) [[ $_raidconf ]] && printf "%s\n" "$_raidconf" >> "${initdir}/etc/cmdline.d/90dmraid.conf" fi inst_multiple dmraid inst_multiple -o kpartx inst $(command -v partx) /sbin/partx inst "$moddir/dmraid.sh" /sbin/dmraid_scan inst_rules 64-md-raid.rules inst_libdir_file "libdmraid-events*.so*" inst_rules "$moddir/61-dmraid-imsm.rules" #inst "$moddir/dmraid-cleanup.sh" /sbin/dmraid-cleanup inst_hook pre-trigger 30 "$moddir/parse-dm.sh" } 070701000F00C9000081ED0000000000000000000000015329C2C8000003A7000000FD0000000000000000000000000000005000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90dmraid/parse-dm.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # nodmraid for anaconda / rc.sysinit compatibility if ! getargbool 1 rd.dm -d -n rd_NO_DM || getarg "rd.dm=0" -d nodmraid; then info "rd.dm=0: removing DM RAID activation" udevproperty rd_NO_DM=1 fi if ! command -v mdadm >/dev/null \ || ! getargbool 1 rd.md.imsm -d -n rd_NO_MDIMSM -n noiswmd \ || ! getargbool 1 rd.md -d -n rd_NO_MD; then info "rd.md.imsm=0: no MD RAID for imsm/isw raids" udevproperty rd_NO_MDIMSM=1 fi if ! command -v mdadm >/dev/null \ || ! getargbool 1 rd.md.ddf -n rd_NO_MDDDF -n noddfmd \ || ! getargbool 1 rd.md -d -n rd_NO_MD; then info "rd.md.ddf=0: no MD RAID for SNIA ddf raids" udevproperty rd_NO_MDDDF=1 fi DM_RAIDS=$(getargs rd.dm.uuid -d rd_DM_UUID=) if [ -z "$DM_RAIDS" ] && ! getargbool 0 rd.auto; then udevproperty rd_NO_DM=1 fi 070701000F00C6000081A40000000000000000000000015329C2C8000003CC000000FD0000000000000000000000000000005900000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90dmraid/61-dmraid-imsm.rules# This file causes block devices with RAID (dmraid) signatures to # automatically cause dmraid_scan to be run. # See udev(8) for syntax SUBSYSTEM!="block", GOTO="dm_end" ACTION!="add|change", GOTO="dm_end" # Also don't process disks that are slated to be a multipath device ENV{DM_MULTIPATH_DEVICE_PATH}=="?*", GOTO="dm_end" ENV{ID_FS_TYPE}=="linux_raid_member", GOTO="dm_end" ENV{ID_FS_TYPE}!="*_raid_member", , GOTO="dm_end" ENV{ID_FS_TYPE}=="isw_raid_member", ENV{rd_NO_MDIMSM}!="?*", GOTO="dm_end" ENV{ID_FS_TYPE}=="ddf_raid_member", ENV{rd_NO_MDDDF}!="?*", GOTO="dm_end" ENV{rd_NO_DM}=="?*", GOTO="dm_end" ENV{DM_UDEV_DISABLE_OTHER_RULES_FLAG}=="1", GOTO="dm_end" PROGRAM=="/bin/sh -c 'for i in $sys/$devpath/holders/dm-[0-9]*; do [ -e $$i ] && exit 0; done; exit 1;' ", \ GOTO="dm_end" ENV{DEVTYPE}!="partition", \ RUN+="/sbin/partx -d --nr 1-1024 $env{DEVNAME}" RUN+="/sbin/initqueue --onetime --unique --settled /sbin/dmraid_scan" LABEL="dm_end" 070701000F00C7000081ED0000000000000000000000015329C2C800000518000000FD0000000000000000000000000000004E00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90dmraid/dmraid.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh DM_RAIDS=$(getargs rd.dm.uuid -d rd_DM_UUID=) if [ -n "$DM_RAIDS" ] || getargbool 0 rd.auto; then DM_CLEANUP="no" # run dmraid if udev has settled info "Scanning for dmraid devices $DM_RAIDS" SETS=$(dmraid -c -s) if [ "$SETS" = "no raid disks" -o "$SETS" = "no raid sets" ]; then return fi info "Found dmraid sets:" echo $SETS|vinfo if [ -n "$DM_RAIDS" ]; then # only activate specified DM RAIDS for r in $DM_RAIDS; do for s in $SETS; do if [ "${s##$r}" != "$s" ]; then info "Activating $s" dmraid -ay -i -p --rm_partitions "$s" 2>&1 | vinfo [ -e "/dev/mapper/$s" ] && kpartx -a "/dev/mapper/$s" 2>&1 | vinfo udevsettle fi done done else # scan and activate all DM RAIDS for s in $SETS; do info "Activating $s" dmraid -ay -i -p --rm_partitions "$s" 2>&1 | vinfo [ -e "/dev/mapper/$s" ] && kpartx -a "/dev/mapper/$s" 2>&1 | vinfo done fi need_shutdown fi 070701000F013F000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95ssh-client070701000F0140000081ED0000000000000000000000015329C2C8000004D3000000FD0000000000000000000000000000005800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95ssh-client/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # fixme: assume user is root # called by dracut check() { [[ $mount_needs ]] && return 1 # If our prerequisites are not met, fail. require_binaries ssh scp || return 1 if [[ $sshkey ]]; then [ ! -f $sshkey ] && { derror "ssh key: $sshkey is not found!" return 1 } fi return 255 } # called by dracut depends() { # We depend on network modules being loaded echo network } inst_sshenv() { if [ -d /root/.ssh ]; then inst_dir /root/.ssh chmod 700 ${initdir}/root/.ssh fi # Copy over ssh key and knowhosts if needed [[ $sshkey ]] && { inst_simple $sshkey [[ -f /root/.ssh/known_hosts ]] && inst_simple /root/.ssh/known_hosts [[ -f /etc/ssh/ssh_known_hosts ]] && inst_simple /etc/ssh/ssh_known_hosts } # Copy over root and system-wide ssh configs. [[ -f /root/.ssh/config ]] && inst_simple /root/.ssh/config [[ -f /etc/ssh/ssh_config ]] && inst_simple /etc/ssh/ssh_config return 0 } # called by dracut install() { inst_multiple ssh scp inst_sshenv } 070701000F00A2000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/50plymouth070701000F00A5000081ED0000000000000000000000015329C2C8000000DF000000FD0000000000000000000000000000005A00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/50plymouth/plymouth-newroot.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh if type plymouth >/dev/null 2>&1 && [ -z "$DRACUT_SYSTEMD" ]; then plymouth --newroot=$NEWROOT fi 070701000F00A7000081ED0000000000000000000000015329C2C8000004A9000000FD0000000000000000000000000000005D00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/50plymouth/plymouth-pretrigger.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh if type plymouthd >/dev/null 2>&1 && [ -z "$DRACUT_SYSTEMD" ]; then if getargbool 1 plymouth.enable && getargbool 1 rd.plymouth -d -n rd_NO_PLYMOUTH; then # first trigger graphics subsystem udevadm trigger --action=add --attr-match=class=0x030000 >/dev/null 2>&1 # first trigger graphics and tty subsystem udevadm trigger --action=add --subsystem-match=graphics --subsystem-match=drm --subsystem-match=tty >/dev/null 2>&1 udevadm settle --timeout=30 2>&1 | vinfo info "Starting plymouth daemon" mkdir -m 0755 /run/plymouth read consoledev rest < /sys/class/tty/console/active consoledev=${consoledev:-tty0} [ -x /lib/udev/console_init -a -e "/dev/$consoledev" ] && /lib/udev/console_init "/dev/$consoledev" plymouthd --attach-to-session --pid-file /run/plymouth/pid plymouth --show-splash 2>&1 | vinfo # reset tty after plymouth messed with it [ -x /lib/udev/console_init -a -e "/dev/$consoledev" ] && /lib/udev/console_init "/dev/$consoledev" fi fi 070701000F00A3000081ED000000000000000000000001555B5D0200000469000000FD0000000000000000000000000000005600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/50plymouth/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { [[ "$mount_needs" ]] && return 1 require_binaries plymouthd plymouth } # called by dracut depends() { echo drm } # called by dracut install() { if [ -d /usr/libexec/plymouth ] ; then _plymouth=/usr/libexec/plymouth; elif [ -d /usr/lib/plymouth ] ; then _plymouth=/usr/lib/plymouth fi if [ -n "$_plymouth" ] ; then if grep -q nash ${_plymouth}/plymouth-populate-initrd \ || [ ! -x ${_plymouth}/plymouth-populate-initrd ]; then . "$moddir"/plymouth-populate-initrd.sh else PLYMOUTH_POPULATE_SOURCE_FUNCTIONS="$dracutfunctions" \ ${_plymouth}/plymouth-populate-initrd -t "$initdir" fi fi inst_hook emergency 50 "$moddir"/plymouth-emergency.sh inst_multiple readlink if ! dracut_module_included "systemd"; then inst_hook pre-trigger 10 "$moddir"/plymouth-pretrigger.sh inst_hook pre-pivot 90 "$moddir"/plymouth-newroot.sh fi } 070701000F00A6000081ED0000000000000000000000015329C2C8000005E2000000FD0000000000000000000000000000006200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/50plymouth/plymouth-populate-initrd.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh PLYMOUTH_LOGO_FILE="/usr/share/pixmaps/system-logo-white.png" PLYMOUTH_THEME=$(plymouth-set-default-theme) inst_multiple plymouthd plymouth \ "${PLYMOUTH_LOGO_FILE}" \ /etc/system-release mkdir -m 0755 -p "${initdir}/usr/share/plymouth" inst_libdir_file "plymouth/text.so" "plymouth/details.so" if [[ $hostonly ]]; then inst_multiple \ "/usr/share/plymouth/themes/details/details.plymouth" \ "/usr/share/plymouth/themes/text/text.plymouth" \ if [[ -d /usr/share/plymouth/themes/${PLYMOUTH_THEME} ]]; then for x in "/usr/share/plymouth/themes/${PLYMOUTH_THEME}"/* ; do [[ -f "$x" ]] || break inst $x done fi if [ -L /usr/share/plymouth/themes/default.plymouth ]; then inst /usr/share/plymouth/themes/default.plymouth # Install plugin for this theme PLYMOUTH_PLUGIN=$(grep "^ModuleName=" /usr/share/plymouth/themes/default.plymouth | while read a b c; do echo $b; done;) inst_libdir_file "plymouth/${PLYMOUTH_PLUGIN}.so" fi else for x in /usr/share/plymouth/themes/{text,details}/* ; do [[ -f "$x" ]] || continue THEME_DIR=$(dirname "$x") mkdir -m 0755 -p "${initdir}/$THEME_DIR" inst_multiple "$x" done ( cd ${initdir}/usr/share/plymouth/themes; ln -s text/text.plymouth default.plymouth 2>&1; ) fi 070701000F00A4000081ED0000000000000000000000015329C2C8000000A0000000FD0000000000000000000000000000005C00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/50plymouth/plymouth-emergency.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh plymouth --hide-splash 2>/dev/null || : 070701000F0104000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95cifs070701000F0106000081ED0000000000000000000000015329C2C8000002CF000000FD0000000000000000000000000000004E00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95cifs/cifsroot.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh . /lib/cifs-lib.sh [ "$#" = 3 ] || exit 1 # root is in the form root=cifs://user:pass@[server]/[folder] either from # cmdline or dhcp root-path netif="$1" root="$2" NEWROOT="$3" cifs_to_var $root echo server: $server echo path: $path echo options: $options mount.cifs //$server/$path $NEWROOT -o $options && { [ -e /dev/root ] || ln -s null /dev/root ; } # inject new exit_if_exists echo 'settle_exit_if_exists="--exit-if-exists=/dev/root"; rm -f -- "$job"' > $hookdir/initqueue/cifs.sh # force udevsettle to break > $hookdir/initqueue/work 070701000F0107000081ED0000000000000000000000015329C2C8000004E4000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95cifs/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { # If our prerequisites are not met, fail anyways. require_binaries mount.cifs || return 1 [[ $hostonly ]] || [[ $mount_needs ]] && { for fs in ${host_fs_types[@]}; do [[ "$fs" == "cifs" ]] && return 0 done return 255 } return 0 } # called by dracut depends() { # We depend on network modules being loaded echo network } # called by dracut installkernel() { instmods cifs ipv6 } # called by dracut install() { local _i local _nsslibs inst_multiple -o mount.cifs inst_multiple /etc/services /etc/nsswitch.conf /etc/protocols inst_libdir_file 'libcap-ng.so*' _nsslibs=$(sed -e '/^#/d' -e 's/^.*://' -e 's/\[NOTFOUND=return\]//' /etc/nsswitch.conf \ | tr -s '[:space:]' '\n' | sort -u | tr -s '[:space:]' '|') _nsslibs=${_nsslibs#|} _nsslibs=${_nsslibs%|} inst_libdir_file -n "$_nsslibs" 'libnss_*.so*' inst_hook cmdline 90 "$moddir/parse-cifsroot.sh" inst "$moddir/cifsroot.sh" "/sbin/cifsroot" inst "$moddir/cifs-lib.sh" "/lib/cifs-lib.sh" dracut_need_initqueue } 070701000F0108000081ED0000000000000000000000015329C2C80000050C000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95cifs/parse-cifsroot.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # # root=cifs://[user:pass@]/ # # This syntax can come from DHCP root-path as well. # # If a username or password are not specified as part of the root, then they # will be pulled from cifsuser and cifspass on the kernel command line, # respectively. # type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh . /lib/cifs-lib.sh # This script is sourced, so root should be set. But let's be paranoid [ -z "$root" ] && root=$(getarg root=) if [ -z "$netroot" ]; then for netroot in $(getargs netroot=); do [ "${netroot%%:*}" = "cifs" ] && break done [ "${netroot%%:*}" = "cifs" ] || unset netroot fi # Root takes precedence over netroot if [ "${root%%:*}" = "cifs" ] ; then if [ -n "$netroot" ] ; then warn "root takes precedence over netroot. Ignoring netroot" fi netroot=$root unset root fi # If it's not cifs we don't continue [ "${netroot%%:*}" = "cifs" ] || return # Check required arguments cifs_to_var $netroot # If we don't have a server, we need dhcp if [ -z "$server" ] ; then DHCPORSERVER="1" fi; # Done, all good! rootok=1 echo '[ -e $NEWROOT/proc ]' > $hookdir/initqueue/finished/cifsroot.sh 070701000F0105000081ED0000000000000000000000015329C2C800000437000000FD0000000000000000000000000000004E00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95cifs/cifs-lib.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # cifs_to_var CIFSROOT # use CIFSROOT to set $server, $path, and $options. # CIFSROOT is something like: cifs://[[:]]@/ # NETIF is used to get information from DHCP options, if needed. type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh cifs_to_var() { local cifsuser; local cifspass # Check required arguments server=${1##cifs://} cifsuser=${server%@*} cifspass=${cifsuser#*:} if [ "$cifspass" != "$cifsuser" ]; then cifsuser=${cifsuser%:*} else cifspass=$(getarg cifspass) fi if [ "$cifsuser" != "$server" ]; then server="${server#*@}" else cifsuser=$(getarg cifsuser) fi path=${server#*/} server=${server%/*} if [ ! "$cifsuser" -o ! "$cifspass" ]; then die "For CIFS support you need to specify a cifsuser and cifspass either in the cifsuser and cifspass commandline parameters or in the root= CIFS URL." fi options="user=$cifsuser,pass=$cifspass" } 070701000F010C000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95dasd_mod070701000F010D000081ED0000000000000000000000015329C2C800000252000000FD0000000000000000000000000000005600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95dasd_mod/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { local _arch=$(uname -m) [ "$_arch" = "s390" -o "$_arch" = "s390x" ] || return 1 require_binaries grep sed seq return 0 } # called by dracut depends() { return 0 } # called by dracut installkernel() { instmods dasd_mod dasd_eckd_mod dasd_fba_mod dasd_diag_mod } # called by dracut install() { inst_hook cmdline 31 "$moddir/parse-dasd-mod.sh" inst_multiple grep sed seq inst_multiple -o dasd_cio_free } 070701000F010E000081ED000000000000000000000001555B5D0200000211000000FD0000000000000000000000000000005800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95dasd_mod/parse-dasd-mod.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh mod_args="" for dasd_arg in $(getargs rd.dasd= -d rd_DASD= DASD=); do mod_args="$mod_args,$dasd_arg" done mod_args="${mod_args#*,}" if [ -x /sbin/dasd_cio_free -a -n "$mod_args" ]; then [ -d /etc/modprobe.d ] || mkdir -m 0755 -p /etc/modprobe.d echo "options dasd_mod dasd=$mod_args" >> /etc/modprobe.d/dasd_mod.conf fi unset dasd_arg if [ -x /sbin/dasd_cio_free ] ; then dasd_cio_free fi 070701000F010F000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95dasd_rules070701000F0110000081ED000000000000000000000001555B5D0200000600000000FD0000000000000000000000000000005800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95dasd_rules/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut cmdline() { is_dasd() { local _dev=$1 local _devpath=$(cd -P /sys/dev/block/$_dev ; echo $PWD) [ "${_devpath#*/dasd}" == "$_devpath" ] && return 1 _ccw="${_devpath%%/block/*}" echo "rd.dasd=${_ccw##*/}" return 0 } [[ $hostonly ]] || [[ $mount_needs ]] && { for_each_host_dev_and_slaves_all is_dasd || return 255 } | sort | uniq } # called by dracut check() { local _arch=$(uname -m) local found=0 local bdev [ "$_arch" = "s390" -o "$_arch" = "s390x" ] || return 1 require_binaries /usr/lib/udev/collect || return 1 [[ $hostonly ]] || [[ $mount_needs ]] && { for bdev in /sys/block/* ; do case "${bdev##*/}" in dasd*) found=$(($found+1)); break; esac done [ $found -eq 0 ] && return 255 } return 0 } # called by dracut depends() { echo 'dasd_mod' return 0 } # called by dracut install() { inst_hook cmdline 30 "$moddir/parse-dasd.sh" if [[ $hostonly_cmdline == "yes" ]] ; then local _dasd=$(cmdline) [[ $_dasd ]] && printf "%s\n" "$_dasd" >> "${initdir}/etc/cmdline.d/95dasd.conf" fi if [[ $hostonly ]] ; then inst_rules_wildcard 51-dasd-*.rules inst_rules_wildcard 41-s390x-dasd-*.rules fi inst_rules 59-dasd.rules } 070701000F0111000081ED000000000000000000000001555B5D0200000BA6000000FD0000000000000000000000000000005600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95dasd_rules/parse-dasd.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh create_udev_rule() { local ccw=$1 local _drv _cu_type _dev_type local _rule=/etc/udev/rules.d/51-dasd-${ccw}.rules if [ -x /sbin/cio_ignore ] && cio_ignore -i $ccw > /dev/null ; then cio_ignore -r $ccw fi if [ -e /sys/bus/ccw/devices/${ccw} ] ; then read _cu_type < /sys/bus/ccw/devices/${ccw}/cutype read _dev_type < /sys/bus/ccw/devices/${ccw}/devtype fi case "$_cu_type" in 3990/*|2105/*|2107/*|1750/*|9343/*) _drv=dasd-eckd ;; 6310/*) _drv=dasd-fba ;; 3880/*) case "$_dev_type" in 3380/*) _drv=dasd_eckd ;; 3370/*) _drv=dasd-fba ;; esac ;; esac [ -z "${_drv}" ] && return 0 [ -e ${_rule} ] && return 0 cat > $_rule < 0)); do case $1 in autodetect|probeonly) shift ;; *-*) range=$1 OLDIFS="$IFS" IFS="-" set -- $range start=${1#0.0.} shift end=${1#0.0.} shift IFS="$OLDIFS" for dev in $(seq $(( 16#$start )) $(( 16#$end )) ) ; do create_udev_rule $(printf "0.0.%04x" "$dev") done ;; *) dev=${1%(ro)} if [ "$dev" != "$1" ] ; then ro=1 fi dev=${dev#0.0.} create_udev_rule $(printf "0.0.%04x" $(( 16#$dev )) ) shift ;; esac done ) done 070701000F0121000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95fstab-sys070701000F0122000081ED0000000000000000000000015329C2C80000019F000000FD0000000000000000000000000000005700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95fstab-sys/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { test -f /etc/fstab.sys || [[ -n $add_fstab || -n $fstab_lines ]] } # called by dracut depends() { echo fs-lib } # called by dracut install() { [ -f /etc/fstab.sys ] && inst_simple /etc/fstab.sys inst_hook pre-pivot 00 "$moddir/mount-sys.sh" } 070701000F0123000081ED000000000000000000000001555B5D0200000561000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95fstab-sys/mount-sys.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh type det_fs >/dev/null 2>&1 || . /lib/fs-lib.sh fstab_mount() { local _dev _mp _fs _opts _dump _pass _rest test -e "$1" || return 1 info "Mounting from $1" while read _dev _mp _fs _opts _dump _pass _rest; do [ -z "${_dev%%#*}" ] && continue # Skip comment lines ismounted $_mp && continue # Skip mounted filesystem if [ "$_pass" -gt 0 ] && ! strstr "$_opts" _netdev; then fsck_single "$_dev" "$_fs" "$_opts" fi _fs=$(det_fs "$_dev" "$_fs") info "Mounting $_dev" if [ -d "$NEWROOT/$_mp" ]; then mount -v -t $_fs -o $_opts $_dev "$NEWROOT/$_mp" 2>&1 | vinfo else [ -d "$_mp" ] || mkdir -p "$_mp" mount -v -t $_fs -o $_opts $_dev $_mp 2>&1 | vinfo fi done < $1 return 0 } # systemd will mount and run fsck from /etc/fstab and we don't want to # run into a race condition. if [ -z "$DRACUT_SYSTEMD" ]; then [ -f /etc/fstab ] && fstab_mount /etc/fstab fi # prefer $NEWROOT/etc/fstab.sys over local /etc/fstab.sys if [ -f $NEWROOT/etc/fstab.sys ]; then fstab_mount $NEWROOT/etc/fstab.sys elif [ -f /etc/fstab.sys ]; then fstab_mount /etc/fstab.sys fi 070701000F00D8000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90livenet070701000F00DB000081ED0000000000000000000000015329C2C8000001A5000000FD0000000000000000000000000000005500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90livenet/module-setup.sh#!/bin/bash # module-setup.sh for livenet # called by dracut check() { return 255 } # called by dracut depends() { echo network url-lib dmsquash-live img-lib return 0 } # called by dracut install() { inst_hook cmdline 29 "$moddir/parse-livenet.sh" inst_hook initqueue/online 95 "$moddir/fetch-liveupdate.sh" inst_script "$moddir/livenetroot.sh" "/sbin/livenetroot" dracut_need_initqueue } 070701000F00DA000081ED0000000000000000000000015329C2C800000246000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90livenet/livenetroot.sh#!/bin/sh # livenetroot - fetch a live image from the network and run it type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh . /lib/url-lib.sh PATH=/usr/sbin:/usr/bin:/sbin:/bin # args get passed from 40network/netroot netroot="$2" liveurl="${netroot#livenet:}" info "fetching $liveurl" imgfile=$(fetch_url "$liveurl") [ $? = 0 ] || die "failed to download live image: error $?" # TODO: couldn't dmsquash-live-root handle this? if [ ${imgfile##*.} = "iso" ]; then root=$(losetup -f) losetup $root $imgfile else root=$imgfile fi exec /sbin/dmsquash-live-root $root 070701000F00D9000081ED0000000000000000000000015329C2C800000359000000FD0000000000000000000000000000005900000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90livenet/fetch-liveupdate.sh#!/bin/bash # fetch-liveupdate - fetch an update image for dmsquash-live media. # this gets called by the "initqueue/online" hook for each network interface # that comes online. # no updates requested? we're not needed. [ -e /tmp/liveupdates.info ] || return 0 command -v getarg >/dev/null || . /lib/dracut-lib.sh command -v fetch_url >/dev/null || . /lib/url-lib.sh command -v unpack_img >/dev/null || . /lib/img-lib.sh read url < /tmp/liveupdates.info info "fetching live updates from $url" fetch_url "$url" /tmp/updates.img if [ $? != 0 ]; then warn "failed to fetch update image!" warn "url: $url" return 1 fi unpack_img /tmp/updates.img /updates.tmp.$$ if [ $? != 0 ]; then warn "failed to unpack update image!" warn "url: $url" return 1 fi copytree /updates.tmp.$$ /updates mv /tmp/liveupdates.info /tmp/liveupdates.done 070701000F00DC000081ED0000000000000000000000015329C2C8000003CE000000FD0000000000000000000000000000005600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90livenet/parse-livenet.sh#!/bin/sh # live net images - just like live images, but specified like: # root=live:[url-to-backing-file] [ -z "$root" ] && root=$(getarg root=) . /lib/url-lib.sh # live updates updates=$(getarg live.updates=) if [ -n "$updates" ]; then # make sure network comes up even if we're doing a local live device if [ -z "$netroot" ]; then echo > /tmp/net.ifaces fi echo "$updates" > /tmp/liveupdates.info echo '[ -e /tmp/liveupdates.done ]' > \ $hookdir/initqueue/finished/liveupdates.sh fi str_starts "$root" "live:" && liveurl="$root" str_starts "$liveurl" "live:" || return liveurl="${liveurl#live:}" # setting netroot to "livenet:..." makes "livenetroot" get run after ifup if get_url_handler "$liveurl" >/dev/null; then info "livenet: root image at $liveurl" netroot="livenet:$liveurl" root="livenet" # quiet complaints from init rootok=1 wait_for_dev -n /dev/root else info "livenet: no url handler for $liveurl" fi 070701000F00CA000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004B00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90dmsquash-live070701000F00D1000081ED0000000000000000000000015329C2C8000004F1000000FD0000000000000000000000000000005B00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90dmsquash-live/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { # a live host-only image doesn't really make a lot of sense [[ $hostonly ]] && return 1 return 255 } # called by dracut depends() { # if dmsetup is not installed, then we cannot support fedora/red hat # style live images echo dm rootfs-block return 0 } # called by dracut installkernel() { instmods squashfs loop iso9660 } # called by dracut install() { inst_multiple umount dmsetup blkid dd losetup grep blockdev inst_multiple -o checkisomd5 inst_hook cmdline 30 "$moddir/parse-dmsquash-live.sh" inst_hook cmdline 31 "$moddir/parse-iso-scan.sh" inst_hook pre-udev 30 "$moddir/dmsquash-live-genrules.sh" inst_hook pre-udev 30 "$moddir/dmsquash-liveiso-genrules.sh" inst_hook pre-pivot 20 "$moddir/apply-live-updates.sh" inst_script "$moddir/dmsquash-live-root.sh" "/sbin/dmsquash-live-root" inst_script "$moddir/iso-scan.sh" "/sbin/iso-scan" # should probably just be generally included inst_rules 60-cdrom_id.rules inst_simple "$moddir/checkisomd5@.service" "/etc/systemd/system/checkisomd5@.service" dracut_need_initqueue } 070701000F00CF000081ED0000000000000000000000015329C2C80000018E000000FD0000000000000000000000000000006800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90dmsquash-live/dmsquash-liveiso-genrules.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh if [ "${root%%:*}" = "liveiso" ]; then { printf 'KERNEL=="loop-control", RUN+="/sbin/initqueue --settled --onetime --unique /sbin/dmsquash-live-root `/sbin/losetup -f --show %s`"\n' \ ${root#liveiso:} } >> /etc/udev/rules.d/99-liveiso-mount.rules fi 070701000F00CD000081ED0000000000000000000000015329C2C8000002CE000000FD0000000000000000000000000000006500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90dmsquash-live/dmsquash-live-genrules.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh case "$root" in live:/dev/*) { printf 'KERNEL=="%s", RUN+="/sbin/initqueue --settled --onetime --unique /sbin/dmsquash-live-root $env{DEVNAME}"\n' \ ${root#live:/dev/} printf 'SYMLINK=="%s", RUN+="/sbin/initqueue --settled --onetime --unique /sbin/dmsquash-live-root $env{DEVNAME}"\n' \ ${root#live:/dev/} } >> /etc/udev/rules.d/99-live-squash.rules wait_for_dev -n "${root#live:}" ;; live:*) if [ -f "${root#live:}" ]; then /sbin/initqueue --settled --onetime --unique /sbin/dmsquash-live-root "${root#live:}" fi ;; esac 070701000F00D2000081ED0000000000000000000000015329C2C80000069A000000FD0000000000000000000000000000006200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90dmsquash-live/parse-dmsquash-live.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # live images are specified with # root=live:backingdev [ -z "$root" ] && root=$(getarg root=) # support legacy syntax of passing liveimg and then just the base root if getargbool 0 rd.live.image -d -y liveimg; then liveroot="live:$root" fi if [ "${root%%:*}" = "live" ] ; then liveroot=$root fi [ "${liveroot%%:*}" = "live" ] || return modprobe -q loop case "$liveroot" in live:LABEL=*|LABEL=*) \ root="${root#live:}" root="$(echo $root | sed 's,/,\\x2f,g')" root="live:/dev/disk/by-label/${root#LABEL=}" rootok=1 ;; live:CDLABEL=*|CDLABEL=*) \ root="${root#live:}" root="$(echo $root | sed 's,/,\\x2f,g')" root="live:/dev/disk/by-label/${root#CDLABEL=}" rootok=1 ;; live:UUID=*|UUID=*) \ root="${root#live:}" root="live:/dev/disk/by-uuid/${root#UUID=}" rootok=1 ;; live:PARTUUID=*|PARTUUID=*) \ root="${root#live:}" root="live:/dev/disk/by-partuuid/${root#PARTUUID=}" rootok=1 ;; live:PARTLABEL=*|PARTLABEL=*) \ root="${root#live:}" root="live:/dev/disk/by-partlabel/${root#PARTLABEL=}" rootok=1 ;; live:/*.[Ii][Ss][Oo]|/*.[Ii][Ss][Oo]) root="${root#live:}" root="liveiso:${root}" rootok=1 ;; live:/dev/*) rootok=1 ;; live:/*.[Ii][Mm][Gg]|/*.[Ii][Mm][Gg]) [ -f "${root#live:}" ] && rootok=1 ;; esac info "root was $liveroot, is now $root" # make sure that init doesn't complain [ -z "$root" ] && root="live" wait_for_dev -n /dev/mapper/live-rw 070701000F00D3000081ED0000000000000000000000015329C2C800000135000000FD0000000000000000000000000000005D00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90dmsquash-live/parse-iso-scan.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # live images are specified with # root=live:backingdev isofile=$(getarg iso-scan/filename) if [ -n "$isofile" ]; then /sbin/initqueue --settled --unique /sbin/iso-scan "$isofile" fi 070701000F00CB000081ED0000000000000000000000015329C2C8000001EC000000FD0000000000000000000000000000006100000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90dmsquash-live/apply-live-updates.sh#!/bin/sh if [ -b /dev/mapper/live-rw ] && [ -d /updates ]; then info "Applying updates to live image..." mount -o bind /run $NEWROOT/run # avoid overwriting symlinks (e.g. /lib -> /usr/lib) with directories ( cd /updates find . -depth -type d | while read dir; do mkdir -p "$NEWROOT/$dir" done find . -depth \! -type d | while read file; do cp -a "$file" "$NEWROOT/$file" done ) umount $NEWROOT/run fi 070701000F00CC000081A40000000000000000000000015329C2C8000000F8000000FD0000000000000000000000000000006000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90dmsquash-live/checkisomd5@.service[Unit] Description=Media check on %f DefaultDependencies=no Before=shutdown.target [Service] Type=oneshot RemainAfterExit=no ExecStart=/bin/checkisomd5 --verbose %f StandardInput=tty-force StandardOutput=inherit StandardError=inherit TimeoutSec=0 070701000F00CE000081ED0000000000000000000000015329C2C800001EFE000000FD0000000000000000000000000000006100000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90dmsquash-live/dmsquash-live-root.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh PATH=/usr/sbin:/usr/bin:/sbin:/bin if getargbool 0 rd.live.debug -n -y rdlivedebug; then exec > /tmp/liveroot.$$.out exec 2>> /tmp/liveroot.$$.out set -x fi [ -z "$1" ] && exit 1 livedev="$1" # parse various live image specific options that make sense to be # specified as their own things live_dir=$(getarg rd.live.dir -d live_dir) [ -z "$live_dir" ] && live_dir="LiveOS" squash_image=$(getarg rd.live.squashimg) [ -z "$squash_image" ] && squash_image="squashfs.img" getargbool 0 rd.live.ram -d -y live_ram && live_ram="yes" getargbool 0 rd.live.overlay.reset -d -y reset_overlay && reset_overlay="yes" getargbool 0 rd.live.overlay.readonly -d -y readonly_overlay && readonly_overlay="--readonly" || readonly_overlay="" overlay=$(getarg rd.live.overlay -d overlay) # CD/DVD media check [ -b $livedev ] && fs=$(blkid -s TYPE -o value $livedev) if [ "$fs" = "iso9660" -o "$fs" = "udf" ]; then check="yes" fi getarg rd.live.check -d check || check="" if [ -n "$check" ]; then type plymouth >/dev/null 2>&1 && plymouth --hide-splash if [ -n "$DRACUT_SYSTEMD" ]; then p=$(str_replace "$livedev" "-" '\x2d') systemctl start checkisomd5@${p}.service else checkisomd5 --verbose $livedev fi if [ $? -ne 0 ]; then die "CD check failed!" exit 1 fi type plymouth >/dev/null 2>&1 && plymouth --show-splash fi ln -s $livedev /run/initramfs/livedev # determine filesystem type for a filesystem image det_img_fs() { udevadm settle blkid -s TYPE -u noraid -o value "$1" } modprobe squashfs CMDLINE=$(getcmdline) for arg in $CMDLINE; do case $arg in ro|rw) liverw=$arg ;; esac; done # mount the backing of the live image first mkdir -m 0755 -p /run/initramfs/live if [ -f $livedev ]; then # no mount needed - we've already got the LiveOS image in initramfs # check filesystem type and handle accordingly fstype=$(det_img_fs $livedev) case $fstype in squashfs) SQUASHED=$livedev;; auto) die "cannot mount live image (unknown filesystem type)" ;; *) FSIMG=$livedev ;; esac [ -e /sys/fs/$fstype ] || modprobe $fstype else mount -n -t $fstype -o ${liverw:-ro} $livedev /run/initramfs/live if [ "$?" != "0" ]; then die "Failed to mount block device of live image" exit 1 fi fi # overlay setup helper function do_live_overlay() { # create a sparse file for the overlay # overlay: if non-ram overlay searching is desired, do it, # otherwise, create traditional overlay in ram OVERLAY_LOOPDEV=$( losetup -f ) l=$(blkid -s LABEL -o value $livedev) || l="" u=$(blkid -s UUID -o value $livedev) || u="" if [ -z "$overlay" ]; then pathspec="/${live_dir}/overlay-$l-$u" elif ( echo $overlay | grep -q ":" ); then # pathspec specified, extract pathspec=$( echo $overlay | sed -e 's/^.*://' ) fi if [ -z "$pathspec" -o "$pathspec" = "auto" ]; then pathspec="/${live_dir}/overlay-$l-$u" fi devspec=$( echo $overlay | sed -e 's/:.*$//' ) # need to know where to look for the overlay setup="" if [ -n "$devspec" -a -n "$pathspec" -a -n "$overlay" ]; then mkdir -m 0755 /run/initramfs/overlayfs mount -n -t auto $devspec /run/initramfs/overlayfs || : if [ -f /run/initramfs/overlayfs$pathspec -a -w /run/initramfs/overlayfs$pathspec ]; then losetup $OVERLAY_LOOPDEV /run/initramfs/overlayfs$pathspec if [ -n "$reset_overlay" ]; then dd if=/dev/zero of=$OVERLAY_LOOPDEV bs=64k count=1 conv=fsync 2>/dev/null fi setup="yes" fi umount -l /run/initramfs/overlayfs || : fi if [ -z "$setup" -o -n "$readonly_overlay" ]; then if [ -n "$setup" ]; then warn "Using temporary overlay." elif [ -n "$devspec" -a -n "$pathspec" ]; then warn "Unable to find persistent overlay; using temporary" sleep 5 fi dd if=/dev/null of=/overlay bs=1024 count=1 seek=$((512*1024)) 2> /dev/null if [ -n "$setup" -a -n "$readonly_overlay" ]; then RO_OVERLAY_LOOPDEV=$( losetup -f ) losetup $RO_OVERLAY_LOOPDEV /overlay else losetup $OVERLAY_LOOPDEV /overlay fi fi # set up the snapshot sz=$(blockdev --getsz $BASE_LOOPDEV) if [ -n "$readonly_overlay" ]; then echo 0 $sz snapshot $BASE_LOOPDEV $OVERLAY_LOOPDEV p 8 | dmsetup create $readonly_overlay live-ro base="/dev/mapper/live-ro" over=$RO_OVERLAY_LOOPDEV else base=$BASE_LOOPDEV over=$OVERLAY_LOOPDEV fi echo 0 $sz snapshot $base $over p 8 | dmsetup create live-rw # Create a device that always points to a ro base image echo 0 $sz linear $base 0 | dmsetup create --readonly live-base } # live cd helper function do_live_from_base_loop() { do_live_overlay } # we might have a genMinInstDelta delta file for anaconda to take advantage of if [ -e /run/initramfs/live/${live_dir}/osmin.img ]; then OSMINSQFS=/run/initramfs/live/${live_dir}/osmin.img fi if [ -n "$OSMINSQFS" ]; then # decompress the delta data dd if=$OSMINSQFS of=/osmin.img 2> /dev/null OSMIN_SQUASHED_LOOPDEV=$( losetup -f ) losetup -r $OSMIN_SQUASHED_LOOPDEV /osmin.img mkdir -m 0755 -p /run/initramfs/squashfs.osmin mount -n -t squashfs -o ro $OSMIN_SQUASHED_LOOPDEV /run/initramfs/squashfs.osmin OSMIN_LOOPDEV=$( losetup -f ) losetup -r $OSMIN_LOOPDEV /run/initramfs/squashfs.osmin/osmin umount -l /run/initramfs/squashfs.osmin fi # we might have an embedded fs image to use as rootfs (uncompressed live) if [ -e /run/initramfs/live/${live_dir}/ext3fs.img ]; then FSIMG="/run/initramfs/live/${live_dir}/ext3fs.img" elif [ -e /run/initramfs/live/${live_dir}/rootfs.img ]; then FSIMG="/run/initramfs/live/${live_dir}/rootfs.img" fi if [ -n "$FSIMG" ] ; then BASE_LOOPDEV=$( losetup -f ) losetup -r $BASE_LOOPDEV $FSIMG do_live_from_base_loop fi # we might have an embedded fs image on squashfs (compressed live) if [ -e /run/initramfs/live/${live_dir}/${squash_image} ]; then SQUASHED="/run/initramfs/live/${live_dir}/${squash_image}" fi if [ -e "$SQUASHED" ] ; then if [ -n "$live_ram" ] ; then echo "Copying live image to RAM..." echo "(this may take a few minutes)" dd if=$SQUASHED of=/squashed.img bs=512 2> /dev/null umount -n /run/initramfs/live echo "Done copying live image to RAM." SQUASHED="/squashed.img" fi SQUASHED_LOOPDEV=$( losetup -f ) losetup -r $SQUASHED_LOOPDEV $SQUASHED mkdir -m 0755 -p /run/initramfs/squashfs mount -n -t squashfs -o ro $SQUASHED_LOOPDEV /run/initramfs/squashfs BASE_LOOPDEV=$( losetup -f ) if [ -f /run/initramfs/squashfs/LiveOS/ext3fs.img ]; then losetup -r $BASE_LOOPDEV /run/initramfs/squashfs/LiveOS/ext3fs.img elif [ -f /run/initramfs/squashfs/LiveOS/rootfs.img ]; then losetup -r $BASE_LOOPDEV /run/initramfs/squashfs/LiveOS/rootfs.img fi umount -l /run/initramfs/squashfs do_live_from_base_loop fi if [ -b "$OSMIN_LOOPDEV" ]; then # set up the devicemapper snapshot device, which will merge # the normal live fs image, and the delta, into a minimzied fs image echo "0 $( blockdev --getsz $BASE_LOOPDEV ) snapshot $BASE_LOOPDEV $OSMIN_LOOPDEV p 8" | dmsetup create --readonly live-osimg-min fi ROOTFLAGS="$(getarg rootflags)" if [ -n "$ROOTFLAGS" ]; then ROOTFLAGS="-o $ROOTFLAGS" fi ln -s /dev/mapper/live-rw /dev/root printf 'mount %s /dev/mapper/live-rw %s\n' "$ROOTFLAGS" "$NEWROOT" > $hookdir/mount/01-$$-live.sh need_shutdown exit 0 070701000F00D0000081ED0000000000000000000000015329C2C800000385000000FD0000000000000000000000000000005700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90dmsquash-live/iso-scan.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh PATH=/usr/sbin:/usr/bin:/sbin:/bin isofile=$1 [ -z "$isofile" ] && exit 1 ismounted "/run/initramfs/isoscan" && exit 0 mkdir -p "/run/initramfs/isoscan" do_iso_scan() { local _name local dev for dev in /dev/disk/by-uuid/*; do _name=$(dev_unit_name "$dev") [ -e /tmp/isoscan-${_name} ] && continue > /tmp/isoscan-${_name} mount -t auto -o ro "$dev" "/run/initramfs/isoscan" || continue if [ -f "/run/initramfs/isoscan/$isofile" ]; then losetup -f "/run/initramfs/isoscan/$isofile" rm -f -- "$job" exit 0 else umount "/run/initramfs/isoscan" fi done } do_iso_scan rmdir "/run/initramfs/isoscan" exit 1 070701000F006D000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/03rescue070701000F006E000081ED0000000000000000000000015329C2C8000001DD000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/03rescue/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { # do not add this module by default return 255 } # called by dracut depends() { return 0 } # called by dracut install() { inst_multiple -o ps grep more cat rm strace free showmount \ ping netstat rpcinfo vi scp ping6 ssh \ fsck fsck.ext2 fsck.ext4 fsck.ext3 fsck.ext4dev fsck.vfat e2fsck } 070701000F009D000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/45url-lib070701000F009E000081ED0000000000000000000000015329C2C80000044C000000FD0000000000000000000000000000005500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/45url-lib/module-setup.sh#!/bin/bash # module-setup for url-lib # called by dracut check() { require_binaries curl || return 1 return 255 } # called by dracut depends() { echo network return 0 } # called by dracut install() { local _dir _crt _found _lib inst_simple "$moddir/url-lib.sh" "/lib/url-lib.sh" inst_multiple curl # also install libs for curl https inst_libdir_file "libnsspem.so*" inst_libdir_file "libnsssysinit.so*" inst_libdir_file "libsoftokn3.so*" inst_libdir_file "libsqlite3.so*" for _dir in $libdirs; do [[ -d $_dir ]] || continue for _lib in $_dir/libcurl.so.*; do [[ -e $_lib ]] || continue _crt=$(grep -F --binary-files=text -z .crt $_lib) [[ $_crt ]] || continue [[ $_crt == /*/* ]] || continue if ! inst_simple "$_crt"; then dwarn "Couldn't install '$_crt' SSL CA cert bundle; HTTPS might not work." continue fi _found=1 done done [[ $_found ]] || dwarn "Couldn't find SSL CA cert bundle; HTTPS won't work." } 070701000F009F000081ED0000000000000000000000015329C2C800000FB0000000FD0000000000000000000000000000005000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/45url-lib/url-lib.sh#!/bin/sh # url-lib.sh - functions for handling URLs (file fetching etc.) # # Authors: # Will Woods type mkuniqdir >/dev/null 2>&1 || . /lib/dracut-lib.sh # fetch_url URL [OUTFILE] # fetch the given URL to a locally-visible location. # if OUTFILE is given, the URL will be fetched to that filename, # overwriting it if present. # If the URL is something mountable (e.g. nfs://) and no OUTFILE is given, # the server will be left mounted until pre-pivot. # the return values are as follows: # 0: success # 253: unknown error (file missing) # 254: unhandled URL scheme / protocol # 255: bad arguments / unparseable URLs # other: fetch command failure (whatever curl/mount/etc return) fetch_url() { local url="$1" outloc="$2" local handler="$(get_url_handler $url)" [ -n "$handler" ] || return 254 [ -n "$url" ] || return 255 "$handler" "$url" "$outloc" } # get_url_handler URL # returns the first HANDLERNAME corresponding to the URL's scheme get_url_handler() { local scheme="${1%%:*}" item="" for item in $url_handler_map; do [ "$scheme" = "${item%%:*}" ] && echo "${item#*:}" && return 0 done return 1 } # add_url_handler HANDLERNAME SCHEME [SCHEME...] # associate the named handler with the named scheme(s). add_url_handler() { local handler="$1"; shift local schemes="$@" scheme="" set -- for scheme in $schemes; do [ "$(get_url_handler $scheme)" = "$handler" ] && continue set -- "$@" "$scheme:$handler" done set -- $@ $url_handler_map # add new items to *front* of list url_handler_map="$@" } ### HTTP, HTTPS, FTP ################################################# export CURL_HOME="/run/initramfs/url-lib" mkdir -p $CURL_HOME curl_args="--globoff --location --retry 3 --fail --show-error" getargbool 0 rd.noverifyssl && curl_args="$curl_args --insecure" proxy=$(getarg proxy=) [ -n "$proxy" ] && curl_args="$curl_args --proxy $proxy" curl_fetch_url() { local url="$1" outloc="$2" echo "$url" > /proc/self/fd/0 if [ -n "$outloc" ]; then curl $curl_args --output - -- "$url" > "$outloc" || return $? else local outdir="$(mkuniqdir /tmp curl_fetch_url)" ( cd "$outdir"; curl $curl_args --remote-name "$url" || return $? ) outloc="$outdir/$(ls -A $outdir)" fi if ! [ -f "$outloc" ]; then warn "Downloading '$url' failed!" return 253 fi if [ -z "$2" ]; then echo "$outloc" ; fi } add_url_handler curl_fetch_url http https ftp tftp set_http_header() { echo "header = \"$1: $2\"" >> $CURL_HOME/.curlrc } ### NFS ############################################################## [ -e /lib/nfs-lib.sh ] && . /lib/nfs-lib.sh nfs_already_mounted() { local server="$1" path="$2" localdir="" s="" p="" cat /proc/mounts | while read src mnt rest; do splitsep ":" "$src" s p if [ "$server" = "$s" ]; then if [ "$path" = "$p" ]; then echo $mnt elif str_starts "$path" "$p"; then echo $mnt/${path#$p/} fi fi done } nfs_fetch_url() { local url="$1" outloc="$2" nfs="" server="" path="" options="" nfs_to_var "$url" || return 255 local filepath="${path%/*}" filename="${path##*/}" mntdir="" # skip mount if server:/filepath is already mounted mntdir=$(nfs_already_mounted "$server" "$path") if [ -z "$mntdir" ]; then local mntdir="$(mkuniqdir /run nfs_mnt)" mount_nfs "$nfs:$server:$filepath${options:+:$options}" "$mntdir" # lazy unmount during pre-pivot hook inst_hook --hook pre-pivot --name 99url-lib-umount-nfs umount -l -- "$mntdir" fi if [ -z "$outloc" ]; then outloc="$mntdir/$filename" else cp -f -- "$mntdir/$filename" "$outloc" || return $? fi [ -f "$outloc" ] || return 253 if [ -z "$2" ]; then echo "$outloc" ; fi } command -v nfs_to_var >/dev/null && add_url_handler nfs_fetch_url nfs nfs4 070701000F0073000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/10i18n070701000F0074000081A40000000000000000000000015329C2C8000000A8000000FD0000000000000000000000000000005300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/10i18n/10-console.rules# Console initialization - keyboard, font, etc. KERNEL=="tty0", RUN+="/sbin/initqueue --onetime --unique --name console_init_$name /lib/udev/console_init $root/$name" 070701000F0075000081A40000000000000000000000015329C2C800001144000000FD0000000000000000000000000000004900000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/10i18n/READMEdracut i18n module ------------------ INDEX 0. Introduction 1. Hostonly vs Generic 2. Configuration 2.1. Variables 2.2. Setting up mappings 2.3. Additional settings 3. Kernel parameters ~ 0. Introduction i18n module provides internationalization for initramfs at runtime. It is intended to be generic across different GNU/Linux distributions. i18n and keyboard settings are stored in different files among distributions. To deal with it avoiding hardcoding those differences in the installation script we handle it by mappings between variables used by dracut and the ones in the system. Package maintainer is expected to create those for his/her distribution and it's appreciated to share it with us, so we can include it in source package. 1. Hostonly vs Generic If you invoke dracut with '-H' option, i18n module install script will gather variables values from your configuration files using mappings provided in "/etc/dracut.conf.d/.conf". Those variables will be put in "etc/vconsole.conf" and "etc/locale.conf" files inside initramfs image. Next it will install only declared font, keymaps and so. When building generic image (dracut without '-H' option), install script copies all content of directories: consolefonts, consoletrans, unimaps and keymaps to image. Take into account that's about 4 MiB. 2. Configuration 2.1. Variables The following variables are used by i18n install script and at initramfs runtime: KEYMAP - keyboard translation table loaded by loadkeys KEYTABLE - base name for keyboard translation table; if UNICODE is true, Unicode version will be loaded. Overrides KEYMAP. EXT_KEYMAPS - list of extra keymaps to bo loaded (sep. by space) UNICODE - boolean, indicating UTF-8 mode FONT - console font FONT_MAP - see description of '-m' parameter in setfont manual FONT_UNIMAP - see description of '-u' parameter in setfont manual The following are appended to EXT_KEYMAPS only during build time: UNIKEYMAP GRP_TOGGLE They were used in 10redhat-i18n module, but not sure of its purpose. I'm leaving it in case... The following are taken from the environment: LANG LC_ALL If UNICODE variable is not provided, script indicates if UTF-8 should be used on the basis of LANG value (if it ends with ".utf8" or similar). 2.2. Setting up mappings Mappings between variables listed in 2.1. and the ones spread around your system are set up in /etc/dracut.conf.d/.conf. You need to assign mappings to i18n_vars. Here's an example: i18n_vars="/etc/conf.d/keymaps:KEYMAP,EXTENDED_KEYMAPS-EXT_KEYMAPS /etc/conf.d/consolefont:CONSOLEFONT-FONT,CONSOLETRANSLATION-FONT_MAP /etc/rc.conf:UNICODE" First we've got name of file in host file system tree. After colon there's mapping: -. If both variables have the same name you can enter just a single, but it's important to specify it! The module will source only variables you've listed. Below there's detailed description in BNF: ::= | " " ::= ":" ::= | "," ::= "-" | We assume no whitespace are allowed between symbols. is a file holding in your system. is a variable holding value of meaning the same as . is a variable which will be set up inside initramfs. If has the same name as we can omit . Example: /etc/conf.d/keymaps:KEYMAP,extended_keymaps-EXT_KEYMAPS = /etc/conf.d/keymaps:KEYMAP,extended_keymaps-EXT_KEYMAPS = /etc/conf.d/keymaps:KEYMAP,extended_keymaps-EXT_KEYMAPS = /etc/conf.d/keymaps = KEYMAP,extended_keymaps-EXT_KEYMAPS = KEYMAP = KEYMAP = extended_keymaps-EXT_KEYMAPS = extended_keymaps = EXT_KEYMAPS 2.3. Additional settings If you encounter following error message: "Directories consolefonts, consoletrans, keymaps, unimaps not found.", you can provide path where those directories lie in your system by setting kbddir in configuration file (the same where you put mappings). 3. Kernel parameters If you create generic initramfs you can set up i18n by kernel parameters using variables listed in 2.1. (except of UNIKEYMAP and GRP_TOGGLE) The recommended minimum is: FONT and KEYMAP. 070701000F0084000081ED000000000000000000000001555B5D02000004F5000000FD0000000000000000000000000000005000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/10i18n/parse-i18n.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh inst_key_val() { local _value local _file local _default _file="$1"; shift _key="$1"; shift _default="$1"; shift _value="$(getarg $@)" [ -z "${_value}" ] && _value=$_default if [ -n "${_value}" ]; then printf '%s="%s"\n' ${_key} ${_value} >> $_file fi unset _file unset _value } inst_key_val /etc/vconsole.conf KEYMAP '' rd.vconsole.keymap KEYMAP -d KEYTABLE inst_key_val /etc/vconsole.conf FONT '' rd.vconsole.font FONT -d SYSFONT inst_key_val /etc/vconsole.conf FONT_MAP '' rd.vconsole.font.map FONT_MAP -d CONTRANS inst_key_val /etc/vconsole.conf FONT_UNIMAP '' rd.vconsole.font.unimap FONT_UNIMAP -d UNIMAP inst_key_val /etc/vconsole.conf UNICODE 1 rd.vconsole.font.unicode UNICODE vconsole.unicode inst_key_val /etc/vconsole.conf EXT_KEYMAP '' rd.vconsole.keymap.ext EXT_KEYMAP inst_key_val /etc/locale.conf LANG '' rd.locale.LANG LANG inst_key_val /etc/locale.conf LC_ALL '' rd.locale.LC_ALL LC_ALL if [ -f /etc/locale.conf ]; then . /etc/locale.conf export LANG export LC_ALL fi 070701000F0083000081ED000000000000000000000001555B5D0200001F1C000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/10i18n/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { [[ "$mount_needs" ]] && return 1 require_binaries setfont loadkeys kbd_mode || return 1 return 0 } # called by dracut depends() { return 0 } # called by dracut install() { if dracut_module_included "systemd"; then unset FONT unset KEYMAP [[ -f /etc/vconsole.conf ]] && . /etc/vconsole.conf fi KBDSUBDIRS=consolefonts,consoletrans,keymaps,unimaps DEFAULT_FONT="${i18n_default_font:-LatArCyrHeb-16}" I18N_CONF="/etc/locale.conf" VCONFIG_CONF="/etc/vconsole.conf" # This is from 10redhat-i18n. findkeymap () { local MAP=$1 [[ ! -f $MAP ]] && \ MAP=$(find ${kbddir}/keymaps -type f -name $MAP -o -name $MAP.\* | head -n1) [[ " $KEYMAPS " = *" $MAP "* ]] && return KEYMAPS="$KEYMAPS $MAP" case $MAP in *.gz) cmd=zgrep;; *.bz2) cmd=bzgrep;; *) cmd=grep ;; esac for INCL in $($cmd "^include " $MAP | while read a a b; do echo ${a//\"/}; done); do for FN in $(find ${kbddir}/keymaps -type f -name $INCL\*); do findkeymap $FN done done } # Function gathers variables from distributed files among the tree, maps to # specified names and prints the result in format "new-name=value". # # $@ = list in format specified below (BNF notation) # # ::= | " " # ::= ":" # ::= | "," # ::= "-" | # # We assume no whitespace are allowed between symbols. # is a file holding in your system. # is a variable holding value of meaning the same as . # is a variable which will be set up inside initramfs. # If has the same name as we can omit . # # Example: # /etc/conf.d/keymaps:KEYMAP,extended_keymaps-EXT_KEYMAPS # = /etc/conf.d/keymaps:KEYMAP,extended_keymaps-EXT_KEYMAPS # = /etc/conf.d/keymaps:KEYMAP,extended_keymaps-EXT_KEYMAPS # = /etc/conf.d/keymaps # = KEYMAP,extended_keymaps-EXT_KEYMAPS # = KEYMAP # = KEYMAP # = extended_keymaps-EXT_KEYMAPS # = extended_keymaps # = EXT_KEYMAPS gather_vars() { local item map value for item in $@ do item=(${item/:/ }) for map in ${item[1]//,/ } do map=(${map//-/ }) if [[ -f "${item[0]}" ]]; then value=$(grep "^${map[0]}=" "${item[0]}") value=${value#*=} echo "${map[1]:-${map[0]}}=${value}" fi done done } install_base() { inst_multiple setfont loadkeys kbd_mode stty if ! dracut_module_included "systemd"; then inst ${moddir}/console_init.sh /lib/udev/console_init inst_rules ${moddir}/10-console.rules inst_hook cmdline 20 "${moddir}/parse-i18n.sh" fi } install_all_kbd() { local rel f for _src in $(eval echo ${kbddir}/{${KBDSUBDIRS}}); do inst_dir "$_src" cp --reflink=auto --sparse=auto -prfL -t "${initdir}/${_src}" "$_src"/* done # remove unnecessary files rm -f -- "${initdir}${kbddir}/consoletrans/utflist" find "${initdir}${kbddir}/" -name README\* -delete find "${initdir}${kbddir}/" -name '*.gz' -print -quit \ | while read line; do inst_multiple gzip done find "${initdir}${kbddir}/" -name '*.bz2' -print -quit \ | while read line; do inst_multiple bzip2 done } install_local_i18n() { local map eval $(gather_vars ${i18n_vars}) [ -f $I18N_CONF ] && . $I18N_CONF [ -f $VCONFIG_CONF ] && . $VCONFIG_CONF shopt -q -s nocasematch if [[ ${UNICODE} ]] then if [[ ${UNICODE} = YES || ${UNICODE} = 1 ]] then UNICODE=1 elif [[ ${UNICODE} = NO || ${UNICODE} = 0 ]] then UNICODE=0 else UNICODE='' fi fi if [[ ! ${UNICODE} && ${LANG} =~ .*\.UTF-?8 ]] then UNICODE=1 fi shopt -q -u nocasematch # Gentoo user may have KEYMAP set to something like "-u pl2", KEYMAP=${KEYMAP#-* } # openSUSE user may have KEYMAP set to something like ".gz" KEYMAP=${KEYMAP/.gz/} # KEYTABLE is a bit special - it defines base keymap name and UNICODE # determines whether non-UNICODE or UNICODE version is used if [[ ${KEYTABLE} ]]; then if [[ ${UNICODE} == 1 ]]; then [[ ${KEYTABLE} =~ .*\.uni.* ]] || KEYTABLE=${KEYTABLE%.map*}.uni fi KEYMAP=${KEYTABLE} fi # I'm not sure of the purpose of UNIKEYMAP and GRP_TOGGLE. They were in # original redhat-i18n module. Anyway it won't hurt. EXT_KEYMAPS+=\ ${UNIKEYMAP}\ ${GRP_TOGGLE} [[ ${KEYMAP} ]] || { dinfo 'No KEYMAP configured.' return 1 } findkeymap ${KEYMAP} for map in ${EXT_KEYMAPS} do ddebug "Adding extra map: ${map}" findkeymap ${map} done inst_opt_decompress ${KEYMAPS} inst_opt_decompress ${kbddir}/consolefonts/${DEFAULT_FONT}.* if [[ ${FONT} ]] && [[ ${FONT} != ${DEFAULT_FONT} ]] then FONT=${FONT%.psf*} inst_opt_decompress ${kbddir}/consolefonts/${FONT}.* fi if [[ ${FONT_MAP} ]] then FONT_MAP=${FONT_MAP%.trans} if [ -f "${FONT_MAP}".trans ]; then inst_simple ${kbddir}/consoletrans/${FONT_MAP}.trans else if [ -f "$FONT_MAP" ]; then inst_simple ${kbddir}/consoletrans/${FONT_MAP} fi fi fi if [[ ${FONT_UNIMAP} ]] then FONT_UNIMAP=${FONT_UNIMAP%.uni} inst_simple ${kbddir}/unimaps/${FONT_UNIMAP}.uni fi if dracut_module_included "systemd" && [[ -f ${I18N_CONF} ]]; then inst_simple ${I18N_CONF} else mksubdirs ${initdir}${I18N_CONF} print_vars LC_ALL LANG >> ${initdir}${I18N_CONF} fi if dracut_module_included "systemd" && [[ -f ${VCONFIG_CONF} ]]; then inst_simple ${VCONFIG_CONF} else mksubdirs ${initdir}${VCONFIG_CONF} print_vars KEYMAP EXT_KEYMAPS UNICODE FONT FONT_MAP FONT_UNIMAP >> ${initdir}${VCONFIG_CONF} fi if dracut_module_included "systemd" && [[ -f /etc/sysconfig/console ]]; then inst_simple /etc/sysconfig/console fi return 0 } checks() { for kbddir in ${kbddir} /usr/lib/kbd /lib/kbd /usr/share /usr/share/kbd do [[ -d "${kbddir}" ]] && \ for dir in ${KBDSUBDIRS//,/ } do [[ -d "${kbddir}/${dir}" ]] && continue false done && break kbddir='' done [[ -f $I18N_CONF && -f $VCONFIG_CONF ]] || \ [[ ! ${hostonly} || ${i18n_vars} ]] || { derror 'i18n_vars not set! Please set up i18n_vars in ' \ 'configuration file.' } return 0 } if checks; then install_base if [[ ${hostonly} ]] && ! [[ ${i18n_install_all} ]]; then install_local_i18n || install_all_kbd else install_all_kbd fi fi } 070701000F0081000081ED0000000000000000000000015329C2C8000006BA000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/10i18n/console_init.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh [ -n "$DRACUT_SYSTEMD" ] && exit 0 if [ -x $systemdutildir/systemd-vconsole-setup ]; then $systemdutildir/systemd-vconsole-setup "$@" fi [ -e /etc/vconsole.conf ] && . /etc/vconsole.conf DEFAULT_FONT=LatArCyrHeb-16 DEFAULT_KEYMAP=/etc/sysconfig/console/default.kmap set_keyboard() { local param [ "${UNICODE}" = 1 ] && param=-u || param=-a kbd_mode ${param} } set_terminal() { local dev=$1 if [ "${UNICODE}" = 1 ]; then printf '\033%%G' >&7 stty -F ${dev} iutf8 else printf '\033%%@' >&7 stty -F ${dev} -iutf8 fi } set_keymap() { local utf_switch if [ -z "${KEYMAP}" ]; then [ -f "${DEFAULT_KEYMAP}" ] && KEYMAP=${DEFAULT_KEYMAP} fi [ -n "${KEYMAP}" ] || return 1 [ "${UNICODE}" = 1 ] && utf_switch=-u loadkeys -q ${utf_switch} ${KEYMAP} ${EXT_KEYMAPS} } set_font() { local dev=$1; local trans=''; local uni='' [ -z "${FONT}" ] && FONT=${DEFAULT_FONT} [ -n "${FONT_MAP}" ] && trans="-m ${FONT_MAP}" [ -n "${FONT_UNIMAP}" ] && uni="-u ${FONT_UNIMAP}" setfont ${FONT} -C ${dev} ${trans} ${uni} } dev_close() { exec 6>&- exec 7>&- } dev_open() { local dev=$1 exec 6<${dev} && \ exec 7>>${dev} } dev=/dev/${1#/dev/} devname=${dev#/dev/} [ -c "${dev}" ] || { echo "Usage: $0 device" >&2 exit 1 } dev_open ${dev} for fd in 6 7; do if ! [ -t ${fd} ]; then echo "ERROR: File descriptor not opened: ${fd}" >&2 dev_close exit 1 fi done set_keyboard set_terminal ${dev} set_font ${dev} set_keymap dev_close 070701000F0118000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95fcoe-uefi070701000F0119000081ED000000000000000000000001555B5D02000001EC000000FD0000000000000000000000000000005700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95fcoe-uefi/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { [[ $hostonly ]] || [[ $mount_needs ]] && { [ -d /sys/firmware/efi ] || return 255 } require_binaries dcbtool fipvlan lldpad ip readlink || return 1 return 0 } # called by dracut depends() { echo fcoe uefi-lib return 0 } # called by dracut install() { inst_hook cmdline 20 "$moddir/parse-uefifcoe.sh" } 070701000F011A000081ED000000000000000000000001555B5D0200000408000000FD0000000000000000000000000000005900000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95fcoe-uefi/parse-uefifcoe.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh command -v getarg >/dev/null || . /lib/dracut-lib.sh command -v get_fcoe_boot_mac >/dev/null || . /lib/uefi-lib.sh command -v set_ifname >/dev/null || . /lib/net-lib.sh print_fcoe_uefi_conf() { local mac dev vlan mac=$(get_fcoe_boot_mac "$1") [ -z "$mac" ] && return 1 dev=$(set_ifname fcoe $mac) vlan=$(get_fcoe_boot_vlan "$1") if [ "$vlan" -ne "0" ]; then case "$vlan" in [0-9]*) printf "%s\n" "vlan=$dev.$vlan:$dev" dev="$dev.$vlan" ;; *) printf "%s\n" "vlan=$vlan:$dev" dev="$vlan" ;; esac fi # fcoe=eth0:nodcb printf "fcoe=%s\n" "$dev:nodcb" return 0 } for i in /sys/firmware/efi/vars/FcoeBootDevice-*/data; do [ -e "$i" ] || continue print_fcoe_uefi_conf $i > /etc/cmdline.d/40-fcoe-uefi.conf && break done 070701000F0155000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004900000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/97biosdevname070701000F0156000081ED000000000000000000000001555B5D02000001C4000000FD0000000000000000000000000000005900000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/97biosdevname/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { [[ "$mount_needs" ]] && return 1 # Include biosdevname if the binary is installed type -P biosdevname >/dev/null || return 1 return 0 } # called by dracut depends() { return 0 } # called by dracut install() { inst_multiple biosdevname inst_rules 71-biosdevname.rules } 070701000F0157000081ED0000000000000000000000015329C2C8000001A2000000FD0000000000000000000000000000005E00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/97biosdevname/parse-biosdevname.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh if ! getargbool 1 biosdevname; then info "biosdevname=0: removing biosdevname network renaming" udevproperty UDEV_BIOSDEVNAME= rm -f -- /etc/udev/rules.d/71-biosdevname.rules else info "biosdevname=1: activating biosdevname network renaming" udevproperty UDEV_BIOSDEVNAME=1 fi 070701000F00F0000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90multipath070701000F00F4000081A4000000000000000000000001555B5D020000019B000000FD0000000000000000000000000000005A00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90multipath/multipathd.service[Unit] Description=Device-Mapper Multipath Device Controller Before=iscsi.service iscsid.service lvm2-activation-early.service After=systemd-udevd.service DefaultDependencies=no Conflicts=shutdown.target [Service] Type=simple ExecStartPre=/sbin/modprobe dm-multipath ExecStart=/sbin/multipathd -s -d ExecReload=/sbin/multipathd reconfigure ExecStop=/sbin/multipathd shutdown [Install] WantedBy=sysinit.target 070701000F00F1000081ED000000000000000000000001555B5D0200000DE9000000FD0000000000000000000000000000005700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90multipath/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { local _rootdev # if there's no multipath binary, no go. require_binaries multipath || return 1 is_mpath() { local _dev=$1 [ -e /sys/dev/block/$_dev/dm/uuid ] || return 1 [[ $(cat /sys/dev/block/$_dev/dm/uuid) =~ mpath- ]] && return 0 return 1 } [[ $hostonly ]] || [[ $mount_needs ]] && { for_each_host_dev_and_slaves is_mpath || return 255 } return 0 } # called by dracut depends() { echo rootfs-block echo dm return 0 } # called by dracut cmdline() { for m in scsi_dh_alua scsi_dh_emc scsi_dh_rdac ; do if module_is_host_only $m ; then printf 'rd.driver.pre=%s ' "$m" fi done } # called by dracut installkernel() { local _ret local _arch=$(uname -m) mp_mod_filter() { local _funcs='scsi_register_device_handler|dm_dirty_log_type_register|dm_register_path_selector|dm_register_target' # subfunctions inherit following FDs local _merge=8 _side2=9 function bmf1() { local _f while read _f; do case "$_f" in *.ko) [[ $(< $_f) =~ $_funcs ]] && echo "$_f" ;; *.ko.gz) [[ $(gzip -dc <$_f) =~ $_funcs ]] && echo "$_f" ;; *.ko.xz) [[ $(xz -dc <$_f) =~ $_funcs ]] && echo "$_f" ;; esac done return 0 } function rotor() { local _f1 _f2 while read _f1; do echo "$_f1" if read _f2; then echo "$_f2" 1>&${_side2} fi done | bmf1 1>&${_merge} return 0 } # Use two parallel streams to filter alternating modules. set +x eval "( ( rotor ) ${_side2}>&1 | bmf1 ) ${_merge}>&1" [[ $debug ]] && set -x return 0 } ( find_kernel_modules_by_path drivers/scsi; if [ "$_arch" = "s390" -o "$_arch" = "s390x" ]; then find_kernel_modules_by_path drivers/s390/scsi; fi; find_kernel_modules_by_path drivers/md ) | mp_mod_filter | instmods } # called by dracut install() { local _f inst_multiple -o \ dmsetup \ kpartx \ mpath_wait \ multipath \ multipathd \ mpathpersist \ xdrgetuid \ xdrgetprio \ /etc/xdrdevices.conf \ /etc/multipath.conf \ /etc/multipath/* inst $(command -v partx) /sbin/partx inst_libdir_file "libmultipath*" "multipath/*" inst_libdir_file 'libgcc_s.so*' if [[ $hostonly_cmdline ]] ; then local _conf=$(cmdline) [[ $_conf ]] && echo "$_conf" >> "${initdir}/etc/cmdline.d/90multipath.conf" fi if dracut_module_included "systemd"; then inst_simple "${moddir}/multipathd.service" "${systemdsystemunitdir}/multipathd.service" mkdir -p "${initdir}${systemdsystemunitdir}/sysinit.target.wants" ln -rfs "${initdir}${systemdsystemunitdir}/multipathd.service" "${initdir}${systemdsystemunitdir}/sysinit.target.wants/multipathd.service" else inst_hook pre-trigger 02 "$moddir/multipathd.sh" inst_hook cleanup 02 "$moddir/multipathd-stop.sh" fi inst_hook cleanup 80 "$moddir/multipathd-needshutdown.sh" inst_rules 11-dm-mpath.rules 56-multipath.rules \ 66-kpartx.rules 67-kpartx-compat.rules } 070701000F00F2000081ED0000000000000000000000015329C2C8000000D6000000FD0000000000000000000000000000006200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90multipath/multipathd-needshutdown.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh for i in /dev/mapper/mpath*; do [ -b "$i" ] || continue need_shutdown break done 070701000F00F3000081ED0000000000000000000000015329C2C80000015B000000FD0000000000000000000000000000005A00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90multipath/multipathd-stop.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh if [ -e /etc/multipath.conf ]; then HARD="" while pidof multipathd >/dev/null 2>&1; do for pid in $(pidof multipathd); do kill $HARD $pid >/dev/null 2>&1 done HARD="-9" done fi 070701000F00F5000081ED0000000000000000000000015329C2C80000012D000000FD0000000000000000000000000000005500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90multipath/multipathd.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh if [ -e /etc/multipath.conf ]; then modprobe dm-multipath multipathd -B || multipathd need_shutdown else rm -- /etc/udev/rules.d/??-multipath.rules 2>/dev/null fi 070701000F00F6000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90qemu070701000F00F9000081ED000000000000000000000001555B5D0200000394000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90qemu/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { if type -P systemd-detect-virt >/dev/null 2>&1; then vm=$(systemd-detect-virt --vm >/dev/null 2>&1) (($? != 0)) && return 255 [[ $vm = "qemu" ]] && return 0 [[ $vm = "kvm" ]] && return 0 [[ $vm = "bochs" ]] && return 0 fi for i in /sys/class/dmi/id/*_vendor; do [[ -f $i ]] || continue read vendor < $i [[ "$vendor" == "QEMU" ]] && return 0 [[ "$vendor" == "Bochs" ]] && return 0 done return 255 } # called by dracut installkernel() { # qemu specific modules hostonly='' instmods \ ata_piix ata_generic pata_acpi cdrom sr_mod ahci \ virtio_blk virtio virtio_ring virtio_pci \ virtio_scsi virtio_console virtio_rng } 070701000F00FD000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/91crypt-loop070701000F00FF000081ED000000000000000000000001555B5D02000001D9000000FD0000000000000000000000000000005800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/91crypt-loop/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { require_binaries losetup || return 1 return 255 } # called by dracut depends() { echo crypt } # called by dracut installkernel() { instmods loop } # called by dracut install() { inst_multiple losetup inst "$moddir/crypt-loop-lib.sh" "/lib/dracut-crypt-loop-lib.sh" dracut_need_initqueue } 070701000F00FE000081ED0000000000000000000000015329C2C80000064F000000FD0000000000000000000000000000005A00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/91crypt-loop/crypt-loop-lib.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=4 sw=4 sts=0 et filetype=sh command -v ask_for_password >/dev/null || . /lib/dracut-crypt-lib.sh # loop_decrypt mnt_point keypath keydev device # # Decrypts symmetrically encrypted key to standard output. # # mnt_point - mount point where is already mounted # keypath - LUKS encrypted loop file path relative to # keydev - device on which key resides; only to display in prompt # device - device to be opened by cryptsetup; only to display in prompt loop_decrypt() { local mntp="$1" local keypath="$2" local keydev="$3" local device="$4" local key="/dev/mapper/${mntp##*/}" if [ ! -b $key ]; then info "Keyfile has .img suffix, treating it as LUKS-encrypted loop keyfile container to unlock $device" local loopdev=$(losetup -f "${mntp}/${keypath}" --show) local opts="-d - luksOpen $loopdev ${key##*/}" ask_for_password \ --cmd "cryptsetup $opts" \ --prompt "Password ($keypath on $keydev for $device)" \ --tty-echo-off [ -b $key ] || die "Tried setting it up, but keyfile block device was still not found!" initqueue --onetime --finished --unique --name "crypt-loop-cleanup-10-${key##*/}" \ $(command -v cryptsetup) "luksClose $key" initqueue --onetime --finished --unique --name "crypt-loop-cleanup-20-${loopdev##*/}" \ $(command -v losetup) "-d $loopdev" else info "Existing keyfile found, re-using it for $device" fi cat $key } 070701000F006F000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/04watchdog070701000F0070000081ED0000000000000000000000015329C2C800000369000000FD0000000000000000000000000000005600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/04watchdog/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { return 255 } # called by dracut depends() { return 0 } # called by dracut install() { inst_hook cmdline 00 "$moddir/watchdog.sh" inst_hook cmdline 50 "$moddir/watchdog.sh" inst_hook pre-trigger 00 "$moddir/watchdog.sh" inst_hook initqueue 00 "$moddir/watchdog.sh" inst_hook mount 00 "$moddir/watchdog.sh" inst_hook mount 50 "$moddir/watchdog.sh" inst_hook mount 99 "$moddir/watchdog.sh" inst_hook pre-pivot 00 "$moddir/watchdog.sh" inst_hook pre-pivot 99 "$moddir/watchdog.sh" inst_hook cleanup 00 "$moddir/watchdog.sh" inst_hook cleanup 99 "$moddir/watchdog.sh" inst_hook emergency 02 "$moddir/watchdog-stop.sh" inst_multiple -o wdctl } 070701000F0072000081ED0000000000000000000000015329C2C8000000F5000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/04watchdog/watchdog.sh#!/bin/sh if [ -e /dev/watchdog ]; then if [ ! -e /tmp/watchdog_timeout ]; then wdctl -s 60 /dev/watchdog >/dev/null 2>&1 > /tmp/watchdog_timeout fi info "Triggering watchdog" >/dev/watchdog else modprobe ib700wdt modprobe i6300esb fi 070701000F0071000081ED0000000000000000000000015329C2C80000003E000000FD0000000000000000000000000000005700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/04watchdog/watchdog-stop.sh#!/bin/sh [ -c /dev/watchdog ] && echo -n 'V' > /dev/watchdog 070701000F0112000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95dcssblk070701000F0114000081ED000000000000000000000001555B5D0200000107000000FD0000000000000000000000000000005600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95dcssblk/parse-dcssblk.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh dcssblk_arg=$(getarg rd.dcssblk=) if [ $? == 0 ];then info "Loading dcssblk segments=$dcssblk_arg" modprobe dcssblk segments=$dcssblk_arg fi 070701000F0113000081ED000000000000000000000001555B5D02000002DB000000FD0000000000000000000000000000005500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95dcssblk/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { local _arch=$(uname -m) [ "$_arch" = "s390" -o "$_arch" = "s390x" ] || return 1 return 0 } # called by dracut installkernel() { if [ -e /sys/devices/dcssblk/*/block/dcssblk* ];then hostonly='' instmods dcssblk fi } # called by dracut install() { inst_hook cmdline 30 "$moddir/parse-dcssblk.sh" # If there is a config file which contains avail (best only of root device) # disks to activate add it and use it during boot -> then we do not need # a kernel param anymore #if [[ $hostonly ]]; then # inst /etc/dcssblk.conf #fi } 070701000F01A0000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/99img-lib070701000F01A2000081ED0000000000000000000000015329C2C80000019B000000FD0000000000000000000000000000005500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/99img-lib/module-setup.sh#!/bin/bash # module-setup for img-lib # called by dracut check() { require_binaries tar gzip dd bash || return 1 return 255 } # called by dracut depends() { return 0 } # called by dracut install() { inst_multiple tar gzip dd bash # TODO: make this conditional on a cmdline flag / config option inst_multiple -o cpio xz bzip2 inst_simple "$moddir/img-lib.sh" "/lib/img-lib.sh" } 070701000F01A1000081ED0000000000000000000000015329C2C800000886000000FD0000000000000000000000000000005000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/99img-lib/img-lib.sh#!/bin/sh # img-lib.sh: utilities for dealing with archives and filesystem images. # # TODO: identify/unpack rpm, deb, maybe others? # super-simple "file" that only identifies archives. # works with stdin if $1 is not set. det_archive() { # NOTE: echo -e works in ash and bash, but not dash local bz="BZh" xz="$(echo -e '\xfd7zXZ')" gz="$(echo -e '\x1f\x8b')" local headerblock="$(dd ${1:+if=$1} bs=262 count=1 2>/dev/null)" case "$headerblock" in $xz*) echo "xz" ;; $gz*) echo "gzip" ;; $bz*) echo "bzip2" ;; 07070*) echo "cpio" ;; *ustar) echo "tar" ;; esac } # determine filesystem type for a filesystem image det_fs_img() { local dev=$(losetup --find --show "$1") rv="" det_fs $dev; rv=$? losetup -d $dev return $rv } # unpack_archive ARCHIVE OUTDIR # unpack a (possibly compressed) cpio/tar archive unpack_archive() { local img="$1" outdir="$2" archiver="" decompr="" local ft="$(det_archive $img)" case "$ft" in xz|gzip|bzip2) decompr="$ft -dc" ;; cpio|tar) decompr="cat";; *) return 1 ;; esac ft="$($decompr $img | det_archive)" case "$ft" in cpio) archiver="cpio -iumd" ;; tar) archiver="tar -xf -" ;; *) return 2 ;; esac mkdir -p $outdir ( cd $outdir; $decompr | $archiver 2>/dev/null ) < $img } # unpack_fs FSIMAGE OUTDIR # unpack a filesystem image unpack_fs() { local img="$1" outdir="$2" mnt="$(mkuniqdir /tmp unpack_fs.)" mount -o loop $img $mnt || { rmdir $mnt; return 1; } mkdir -p $outdir; outdir="$(cd $outdir; pwd)" copytree $mnt $outdir umount $mnt rmdir $mnt } # unpack an image file - compressed/uncompressed cpio/tar, filesystem, whatever # unpack_img IMAGEFILE OUTDIR unpack_img() { local img="$1" outdir="$2" [ -r "$img" ] || { warn "can't read img!"; return 1; } [ -n "$outdir" ] || { warn "unpack_img: no output dir given"; return 1; } if [ "$(det_archive $img)" ]; then unpack_archive "$@" || { warn "can't unpack archive file!"; return 1; } else unpack_fs "$@" || { warn "can't unpack filesystem image!"; return 1; } fi } 070701000F015F000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98selinux070701000F0160000081ED0000000000000000000000015329C2C800000153000000FD0000000000000000000000000000005500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98selinux/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { return 255 } # called by dracut depends() { return 0 } # called by dracut install() { inst_hook pre-pivot 50 "$moddir/selinux-loadpolicy.sh" inst_multiple setenforce } 070701000F0161000081ED0000000000000000000000015329C2C800000920000000FD0000000000000000000000000000005B00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98selinux/selinux-loadpolicy.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # FIXME: load selinux policy. this should really be done after we switchroot rd_load_policy() { # If SELinux is disabled exit now getarg "selinux=0" > /dev/null && return 0 SELINUX="enforcing" [ -e "$NEWROOT/etc/selinux/config" ] && . "$NEWROOT/etc/selinux/config" # Check whether SELinux is in permissive mode permissive=0 getarg "enforcing=0" > /dev/null if [ $? -eq 0 -o "$SELINUX" = "permissive" ]; then permissive=1 fi # Attempt to load SELinux Policy if [ -x "$NEWROOT/usr/sbin/load_policy" -o -x "$NEWROOT/sbin/load_policy" ]; then local ret=0 local out info "Loading SELinux policy" mount -o bind /sys $NEWROOT/sys # load_policy does mount /proc and /sys/fs/selinux in # libselinux,selinux_init_load_policy() if [ -x "$NEWROOT/sbin/load_policy" ]; then out=$(LANG=C chroot "$NEWROOT" /sbin/load_policy -i 2>&1) ret=$? info $out else out=$(LANG=C chroot "$NEWROOT" /usr/sbin/load_policy -i 2>&1) ret=$? info $out fi umount $NEWROOT/sys/fs/selinux umount $NEWROOT/sys if [ "$SELINUX" = "disabled" ]; then return 0; fi if [ $ret -eq 0 -o $ret -eq 2 ]; then # If machine requires a relabel, force to permissive mode [ -e "$NEWROOT"/.autorelabel ] && LANG=C /usr/sbin/setenforce 0 mount --rbind /dev "$NEWROOT/dev" LANG=C chroot "$NEWROOT" /sbin/restorecon -R /dev umount -R "$NEWROOT/dev" return 0 fi warn "Initial SELinux policy load failed." if [ $ret -eq 3 -o $permissive -eq 0 ]; then warn "Machine in enforcing mode." warn "Not continuing" action_on_fail -n selinux || exit 1 fi return 0 elif [ $permissive -eq 0 -a "$SELINUX" != "disabled" ]; then warn "Machine in enforcing mode and cannot execute load_policy." warn "To disable selinux, add selinux=0 to the kernel command line." warn "Not continuing" action_on_fail -n selinux || exit 1 fi } rd_load_policy 070701000F00DD000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004100000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90lvm070701000F00E0000081ED000000000000000000000001555B5D0200001131000000FD0000000000000000000000000000005100000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90lvm/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { # No point trying to support lvm if the binaries are missing require_binaries lvm || return 1 [[ $hostonly ]] || [[ $mount_needs ]] && { for fs in "${host_fs_types[@]}"; do [[ $fs = LVM*_member ]] && return 0 done return 255 } return 0 } # called by dracut depends() { # We depend on dm_mod being loaded echo rootfs-block dm return 0 } # called by dracut cmdline() { local _activated declare -A _activated for dev in "${!host_fs_types[@]}"; do [ -e /sys/block/${dev#/dev/}/dm/name ] || continue [ -e /sys/block/${dev#/dev/}/dm/uuid ] || continue uuid=$(/dev/null) [[ ${DM_VG_NAME} ]] && [[ ${DM_LV_NAME} ]] || return 1 if ! [[ ${_activated[${DM_VG_NAME}/${DM_LV_NAME}]} ]]; then printf " rd.lvm.lv=%s\n" "${DM_VG_NAME}/${DM_LV_NAME} " _activated["${DM_VG_NAME}/${DM_LV_NAME}"]=1 fi done } installkernel() { instmods dm-snapshot } # called by dracut install() { local _i inst lvm if [[ $hostonly_cmdline == "yes" ]]; then local _lvmconf=$(cmdline) [[ $_lvmconf ]] && printf "%s\n" "$_lvmconf" >> "${initdir}/etc/cmdline.d/90lvm.conf" fi inst_rules "$moddir/64-lvm.rules" if [[ $hostonly ]] || [[ $lvmconf = "yes" ]]; then if [ -f /etc/lvm/lvm.conf ]; then inst_simple /etc/lvm/lvm.conf # FIXME: near-term hack to establish read-only locking; # use command-line lvm.conf editor once it is available sed -i -e 's/\(^[[:space:]]*\)locking_type[[:space:]]*=[[:space:]]*[[:digit:]]/\1locking_type = 4/' ${initdir}/etc/lvm/lvm.conf sed -i -e 's/\(^[[:space:]]*\)use_lvmetad[[:space:]]*=[[:space:]]*[[:digit:]]/\1use_lvmetad = 0/' ${initdir}/etc/lvm/lvm.conf fi fi if ! [[ -e ${initdir}/etc/lvm/lvm.conf ]]; then mkdir -p "${initdir}/etc/lvm" { echo 'global {' echo 'locking_type = 4' echo 'use_lvmetad = 0' echo '}' } > "${initdir}/etc/lvm/lvm.conf" fi inst_rules 11-dm-lvm.rules 69-dm-lvm-metad.rules # Do not run lvmetad update via pvscan in udev rule - lvmetad is not running yet in dracut! if [[ -f ${initdir}/lib/udev/rules.d/69-dm-lvm-metad.rules ]];then if grep -q SYSTEMD_WANTS ${initdir}/lib/udev/rules.d/69-dm-lvm-metad.rules; then sed -i -e 's/^ENV{SYSTEMD_ALIAS}=.*/# No LVM pvscan in dracut - lvmetad is not running yet/' ${initdir}/lib/udev/rules.d/69-dm-lvm-metad.rules sed -i -e 's/^ENV{ID_MODEL}=.*//' ${initdir}/lib/udev/rules.d/69-dm-lvm-metad.rules sed -i -e 's/^ENV{SYSTEMD_WANTS}=.*//' ${initdir}/lib/udev/rules.d/69-dm-lvm-metad.rules else sed -i -e 's/.*lvm pvscan.*/# No LVM pvscan for in dracut - lvmetad is not running yet/' ${initdir}/lib/udev/rules.d/69-dm-lvm-metad.rules fi fi # Gentoo ebuild for LVM2 prior to 2.02.63-r1 doesn't install above rules # files, but provides the one below: inst_rules 64-device-mapper.rules # debian udev rules inst_rules 56-lvm.rules 60-persistent-storage-lvm.rules inst_script "$moddir/lvm_scan.sh" /sbin/lvm_scan inst_hook cmdline 30 "$moddir/parse-lvm.sh" inst_libdir_file "libdevmapper-event-lvm*.so" if [[ $hostonly ]] && type -P lvs &>/dev/null; then for dev in "${!host_fs_types[@]}"; do [ -e /sys/block/${dev#/dev/}/dm/name ] || continue dev=$(/dev/null) [[ ${DM_VG_NAME} ]] && [[ ${DM_LV_NAME} ]] || continue if [[ "$(lvs --noheadings -o segtype ${DM_VG_NAME} 2>/dev/null)" == *thin* ]] ; then inst_multiple -o thin_dump thin_restore thin_check thin_repair break fi done else inst_multiple -o thin_dump thin_restore thin_check thin_repair fi } 070701000F00DF000081ED0000000000000000000000015329C2C800000E4D000000FD0000000000000000000000000000004D00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90lvm/lvm_scan.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # run lvm scan if udev has settled extraargs="$@" type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh VGS=$(getargs rd.lvm.vg -d rd_LVM_VG=) LVS=$(getargs rd.lvm.lv -d rd_LVM_LV=) SNAPSHOT=$(getargs rd.lvm.snapshot -d rd_LVM_SNAPSHOT=) SNAPSIZE=$(getargs rd.lvm.snapsize -d rd_LVM_SNAPSIZE=) [ -d /etc/lvm ] || mkdir -m 0755 -p /etc/lvm # build a list of devices to scan lvmdevs=$( for f in /tmp/.lvm_scan-*; do [ -e "$f" ] || continue echo -n "${f##/tmp/.lvm_scan-} " done ) if [ ! -e /etc/lvm/lvm.conf ]; then { echo 'devices {'; echo -n ' filter = [ ' for dev in $lvmdevs; do printf '"a|^/dev/%s$|", ' $dev; done; echo '"r/.*/" ]'; echo '}'; # establish LVM locking if [ -n $SNAPSHOT ]; then echo 'global {'; echo ' locking_type = 1'; echo ' use_lvmetad = 0'; echo '}'; else echo 'global {'; echo ' locking_type = 4'; echo ' use_lvmetad = 0'; echo '}'; fi } > /etc/lvm/lvm.conf lvmwritten=1 fi check_lvm_ver() { maj=$1 min=$2 ver=$3 # --poll is supported since 2.2.57 [ $4 -lt $maj ] && return 1 [ $4 -gt $maj ] && return 0 [ $5 -lt $min ] && return 1 [ $5 -gt $min ] && return 0 [ $6 -ge $ver ] && return 0 return 1 } # hopefully this output format will never change, e.g.: # LVM version: 2.02.53(1) (2009-09-25) OLDIFS=$IFS IFS=. set $(lvm version 2>/dev/null) IFS=$OLDIFS maj=${1##*:} min=$2 sub=${3%% *} sub=${sub%%\(*}; check_lvm_ver 2 2 57 $maj $min $sub && \ nopoll="--poll n" if check_lvm_ver 2 2 65 $maj $min $sub; then sysinit=" --sysinit $extraargs" fi unset extraargs export LVM_SUPPRESS_LOCKING_FAILURE_MESSAGES=1 if [ -n "$SNAPSHOT" ] ; then # HACK - this should probably be done elsewhere or turned into a function # Enable read-write LVM locking sed -i -e 's/\(^[[:space:]]*\)locking_type[[:space:]]*=[[:space:]]*[[:digit:]]/\1locking_type = 1/' ${initdir}/etc/lvm/lvm.conf # Expected SNAPSHOT format ":" ORIG_LV=${SNAPSHOT%%:*} SNAP_LV=${SNAPSHOT##*:} info "Removing existing LVM snapshot $SNAP_LV" lvm lvremove --force $SNAP_LV 2>&1| vinfo # Determine snapshot size if [ -z "$SNAPSIZE" ] ; then SNAPSIZE=$(lvm lvs --noheadings --units m --options lv_size $ORIG_LV) info "No LVM snapshot size provided, using size of $ORIG_LV ($SNAPSIZE)" fi info "Creating LVM snapshot $SNAP_LV ($SNAPSIZE)" lvm lvcreate -s -n $SNAP_LV -L $SNAPSIZE $ORIG_LV 2>&1| vinfo fi if [ -n "$LVS" ] ; then info "Scanning devices $lvmdevs for LVM logical volumes $LVS" lvm lvscan --ignorelockingfailure 2>&1 | vinfo for LV in $LVS; do if [ -z "$sysinit" ]; then lvm lvchange --yes -ay --ignorelockingfailure $nopoll --ignoremonitoring $LV 2>&1 | vinfo else lvm lvchange --yes -ay $sysinit $LV 2>&1 | vinfo fi done fi if [ -z "$LVS" -o -n "$VGS" ]; then info "Scanning devices $lvmdevs for LVM volume groups $VGS" lvm vgscan --ignorelockingfailure 2>&1 | vinfo if [ -z "$sysinit" ]; then lvm vgchange -ay --ignorelockingfailure $nopoll --ignoremonitoring $VGS 2>&1 | vinfo else lvm vgchange -ay $sysinit $VGS 2>&1 | vinfo fi fi if [ "$lvmwritten" ]; then rm -f -- /etc/lvm/lvm.conf fi unset lvmwritten udevadm settle need_shutdown 070701000F00E1000081ED0000000000000000000000015329C2C800000254000000FD0000000000000000000000000000004E00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90lvm/parse-lvm.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh if [ -e /etc/lvm/lvm.conf ] && ! getargbool 1 rd.lvm.conf -d -n rd_NO_LVMCONF; then rm -f -- /etc/lvm/lvm.conf fi LV_DEVS="$(getargs rd.lvm.vg -d rd_LVM_VG=) $(getargs rd.lvm.lv -d rd_LVM_LV=)" if ! getargbool 1 rd.lvm -d -n rd_NO_LVM \ || ( [ -z "$LV_DEVS" ] && ! getargbool 0 rd.auto ); then info "rd.lvm=0: removing LVM activation" rm -f -- /etc/udev/rules.d/64-lvm*.rules else for dev in $LV_DEVS; do wait_for_dev -n "/dev/$dev" done fi 070701000F00DE000081A40000000000000000000000015329C2C800000308000000FD0000000000000000000000000000004E00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90lvm/64-lvm.rules# hacky rules to try to activate lvm when we get new block devs... # # Copyright 2008, Red Hat, Inc. # Jeremy Katz SUBSYSTEM!="block", GOTO="lvm_end" ACTION!="add|change", GOTO="lvm_end" # Also don't process disks that are slated to be a multipath device ENV{DM_MULTIPATH_DEVICE_PATH}=="?*", GOTO="lvm_end" KERNEL=="dm-[0-9]*", ACTION=="add", GOTO="lvm_end" ENV{ID_FS_TYPE}!="LVM?_member", GOTO="lvm_end" PROGRAM=="/bin/sh -c 'for i in $sys/$devpath/holders/dm-[0-9]*; do [ -e $$i ] && exit 0; done; exit 1;' ", \ GOTO="lvm_end" RUN+="/sbin/initqueue --settled --onetime --unique /sbin/lvm_scan" RUN+="/sbin/initqueue --timeout --name 51-lvm_scan --onetime --unique /sbin/lvm_scan --partial" RUN+="/bin/sh -c '>/tmp/.lvm_scan-%k;'" LABEL="lvm_end" 070701000F016B000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd070701000F017D000081ED0000000000000000000000015329C2C800000263000000FD0000000000000000000000000000005900000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-pre-mount.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh export DRACUT_SYSTEMD=1 if [ -f /dracut-state.sh ]; then . /dracut-state.sh 2>/dev/null fi type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh source_conf /etc/conf.d make_trace_mem "hook pre-mount" '1:shortmem' '2+:mem' '3+:slab' # pre pivot scripts are sourced just before we doing cleanup and switch over # to the new root. getarg 'rd.break=pre-mount' 'rdbreak=pre-mount' && emergency_shell -n pre-mount "Break pre-mount" source_hook pre-mount export -p > /dracut-state.sh exit 0 070701000F018A000081A40000000000000000000000015329C2C8000002A5000000FD0000000000000000000000000000005D00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-shutdown.service# This file is part of systemd. # # systemd 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; either version 2 of the License, or # (at your option) any later version. [Unit] Description=Restore /run/initramfs Documentation=man:dracut-shutdown.service(8) After=getty@tty1.service display-manager.service Before=systemd-reboot.service shutdown.target DefaultDependencies=no ConditionPathExists=/run/initramfs/.need_shutdown ConditionPathExists=!/run/initramfs/bin/sh [Service] ExecStart=-/usr/lib/dracut/dracut-initramfs-restore Type=oneshot RemainAfterExit=yes 070701000F017A000081A40000000000000000000000015329C2C8000003F7000000FD0000000000000000000000000000005E00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-pre-mount.service# This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # See systemd.special(7) for details [Unit] Description=dracut pre-mount hook Documentation=man:dracut-pre-mount.service(8) DefaultDependencies=no Before=initrd-root-fs.target sysroot.mount After=dracut-initqueue.service After=cryptsetup.target ConditionPathExists=/etc/initrd-release ConditionDirectoryNotEmpty=|/lib/dracut/hooks/pre-mount ConditionKernelCommandLine=|rd.break=pre-mount [Service] Environment=DRACUT_SYSTEMD=1 Environment=NEWROOT=/sysroot Type=oneshot ExecStart=-/bin/dracut-pre-mount StandardInput=null StandardOutput=syslog StandardError=syslog+console KillMode=process RemainAfterExit=yes # Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash # terminates cleanly. KillSignal=SIGHUP 070701000F0173000081A40000000000000000000000015329C3020000060C000000FD0000000000000000000000000000006000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-initqueue.service.8'\" t .\" Title: dracut-initqueue.service .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 03/19/2014 .\" Manual: dracut .\" Source: dracut .\" Language: English .\" .TH "DRACUT\-INITQUEUE\&." "8" "03/19/2014" "dracut" "dracut" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" dracut-initqueue.service \- runs the dracut main loop to find the real root .SH "SYNOPSIS" .sp dracut\-initqueue\&.service .SH "DESCRIPTION" .sp This service runs all the main loop of dracut in the initramfs to find the real root\&. .SH "AUTHORS" .sp Harald Hoyer .SH "SEE ALSO" .sp \fBdracut\&.bootup\fR(7) \fBdracut\fR(8) 070701000F017E000081A4000000000000000000000001555B5D0200000523000000FD0000000000000000000000000000005E00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-pre-pivot.service# This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # See systemd.special(7) for details [Unit] Description=dracut pre-pivot and cleanup hook Documentation=man:dracut-pre-pivot.service(8) After=initrd.target initrd-parse-etc.service sysroot.mount After=dracut-initqueue.service dracut-pre-mount.service dracut-mount.service Before=initrd-cleanup.service Wants=remote-fs.target After=remote-fs.target ConditionPathExists=/etc/initrd-release ConditionDirectoryNotEmpty=|/lib/dracut/hooks/pre-pivot ConditionDirectoryNotEmpty=|/lib/dracut/hooks/cleanup ConditionKernelCommandLine=|rd.break=pre-pivot ConditionKernelCommandLine=|rd.break=cleanup ConditionKernelCommandLine=|rd.break ConditionPathExists=|/dev/root ConditionPathExists=|/dev/nfs [Service] Environment=DRACUT_SYSTEMD=1 Environment=NEWROOT=/sysroot Type=oneshot ExecStart=-/bin/dracut-pre-pivot StandardInput=null StandardOutput=syslog StandardError=syslog+console KillMode=process RemainAfterExit=yes # Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash # terminates cleanly. KillSignal=SIGHUP 070701000F0183000081A40000000000000000000000015329C3020000060C000000FD0000000000000000000000000000006200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-pre-trigger.service.8'\" t .\" Title: dracut-pre-trigger.service .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 03/19/2014 .\" Manual: dracut .\" Source: dracut .\" Language: English .\" .TH "DRACUT\-PRE\-TRIGGER" "8" "03/19/2014" "dracut" "dracut" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" dracut-pre-trigger.service \- runs the dracut hooks before udevd is triggered .SH "SYNOPSIS" .sp dracut\-pre\-trigger\&.service .SH "DESCRIPTION" .sp This service runs all dracut hooks before udevd is triggered in the initramfs\&. .SH "AUTHORS" .sp Harald Hoyer .SH "SEE ALSO" .sp \fBdracut\&.bootup\fR(7) \fBdracut\fR(8) 070701000F017C000081A40000000000000000000000015329C2C8000001B2000000FD0000000000000000000000000000006400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-pre-mount.service.8.ascDRACUT-PRE-MOUNT.SERVICE(8) =========================== :doctype: manpage :man source: dracut :man manual: dracut NAME ---- dracut-pre-mount.service - runs the dracut hooks before /sysroot is mounted SYNOPSIS -------- dracut-pre-mount.service DESCRIPTION ----------- This service runs all dracut hooks before the real root is mounted on /sysroot. AUTHORS ------- Harald Hoyer SEE ALSO -------- *dracut.bootup*(7) *dracut*(8) 070701000F018C000081A40000000000000000000000015329C2C800000699000000FD0000000000000000000000000000006300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-shutdown.service.8.ascDRACUT-SHUTDOWN.SERVICE(8) =========================== :doctype: manpage :man source: dracut :man manual: dracut NAME ---- dracut-shutdown.service - unpack the initramfs to /run/initramfs SYNOPSIS -------- dracut-shutdown.service DESCRIPTION ----------- This service unpacks the initramfs image to /run/initramfs. systemd pivots into /run/initramfs at shutdown, so the root filesytem can be safely unmounted. The following steps are executed during a shutdown: * systemd switches to the shutdown.target * systemd starts /lib/systemd/system/shutdown.target.wants/dracut-shutdown.service * dracut-shutdown.service executes /usr/lib/dracut/dracut-initramfs-restore which unpacks the initramfs to /run/initramfs * systemd finishes shutdown.target * systemd kills all processes * systemd tries to unmount everything and mounts the remaining read-only * systemd checks, if there is a /run/initramfs/shutdown executable * if yes, it does a pivot_root to /run/initramfs and executes ./shutdown. The old root is then mounted on /oldroot. /usr/lib/dracut/modules.d/99shutdown/shutdown.sh is the shutdown executable. * shutdown will try to umount every /oldroot mount and calls the various shutdown hooks from the dracut modules This ensures, that all devices are disassembled and unmounted cleanly. To debug the shutdown process, you can get a shell in the shutdown procedure by injecting "rd.break=pre-shutdown rd.shell" or "rd.break=shutdown rd.shell". ---- # mkdir -p /run/initramfs/etc/cmdline.d # echo "rd.break=pre-shutdown rd.shell" > /run/initramfs/etc/cmdline.d/debug.conf # touch /run/initramfs/.need_shutdown ---- AUTHORS ------- Harald Hoyer SEE ALSO -------- *dracut*(8) 070701000F018F000081ED000000000000000000000001555B5D02000024D6000000FD0000000000000000000000000000005500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { [[ $mount_needs ]] && return 1 if require_binaries $systemdutildir/systemd; then SYSTEMD_VERSION=$($systemdutildir/systemd --version | { read a b a; echo $b; }) (( $SYSTEMD_VERSION >= 198 )) && return 0 return 255 fi return 1 } # called by dracut depends() { return 0 } installkernel() { hostonly='' instmods autofs4 ipv6 } # called by dracut install() { local _mods if [[ "$prefix" == /run/* ]]; then dfatal "systemd does not work with a prefix, which contains \"/run\"!!" exit 1 fi inst_multiple -o \ $systemdutildir/systemd \ $systemdutildir/systemd-cgroups-agent \ $systemdutildir/systemd-shutdown \ $systemdutildir/systemd-reply-password \ $systemdutildir/systemd-fsck \ $systemdutildir/systemd-udevd \ $systemdutildir/systemd-journald \ $systemdutildir/systemd-sysctl \ $systemdutildir/systemd-modules-load \ $systemdutildir/systemd-vconsole-setup \ $systemdutildir/system-generators/systemd-gpt-auto-generator \ \ $systemdsystemunitdir/cryptsetup.target \ $systemdsystemunitdir/emergency.target \ $systemdsystemunitdir/sysinit.target \ $systemdsystemunitdir/basic.target \ $systemdsystemunitdir/halt.target \ $systemdsystemunitdir/kexec.target \ $systemdsystemunitdir/initrd.target \ $systemdsystemunitdir/initrd-fs.target \ $systemdsystemunitdir/initrd-root-fs.target \ $systemdsystemunitdir/local-fs.target \ $systemdsystemunitdir/local-fs-pre.target \ $systemdsystemunitdir/remote-fs.target \ $systemdsystemunitdir/remote-fs-pre.target \ $systemdsystemunitdir/network.target \ $systemdsystemunitdir/nss-lookup.target \ $systemdsystemunitdir/nss-user-lookup.target \ $systemdsystemunitdir/poweroff.target \ $systemdsystemunitdir/reboot.target \ $systemdsystemunitdir/rescue.target \ $systemdsystemunitdir/rpcbind.target \ $systemdsystemunitdir/shutdown.target \ $systemdsystemunitdir/final.target \ $systemdsystemunitdir/sigpwr.target \ $systemdsystemunitdir/sockets.target \ $systemdsystemunitdir/swap.target \ $systemdsystemunitdir/timers.target \ $systemdsystemunitdir/paths.target \ $systemdsystemunitdir/umount.target \ \ $systemdsystemunitdir/sys-kernel-config.mount \ \ $systemdsystemunitdir/kmod-static-nodes.service \ $systemdsystemunitdir/systemd-tmpfiles-setup-dev.service \ $systemdsystemunitdir/systemd-ask-password-console.path \ $systemdsystemunitdir/systemd-udevd-control.socket \ $systemdsystemunitdir/systemd-udevd-kernel.socket \ $systemdsystemunitdir/systemd-ask-password-plymouth.path \ $systemdsystemunitdir/systemd-journald.socket \ $systemdsystemunitdir/systemd-ask-password-console.service \ $systemdsystemunitdir/systemd-modules-load.service \ $systemdsystemunitdir/systemd-halt.service \ $systemdsystemunitdir/systemd-poweroff.service \ $systemdsystemunitdir/systemd-reboot.service \ $systemdsystemunitdir/systemd-kexec.service \ $systemdsystemunitdir/systemd-fsck@.service \ $systemdsystemunitdir/systemd-udevd.service \ $systemdsystemunitdir/systemd-udev-trigger.service \ $systemdsystemunitdir/systemd-udev-settle.service \ $systemdsystemunitdir/systemd-ask-password-plymouth.service \ $systemdsystemunitdir/systemd-journald.service \ $systemdsystemunitdir/systemd-vconsole-setup.service \ $systemdsystemunitdir/systemd-random-seed-load.service \ $systemdsystemunitdir/systemd-sysctl.service \ \ $systemdsystemunitdir/sysinit.target.wants/systemd-modules-load.service \ $systemdsystemunitdir/sysinit.target.wants/systemd-ask-password-console.path \ $systemdsystemunitdir/sysinit.target.wants/systemd-journald.service \ $systemdsystemunitdir/sockets.target.wants/systemd-udevd-control.socket \ $systemdsystemunitdir/sockets.target.wants/systemd-udevd-kernel.socket \ $systemdsystemunitdir/sockets.target.wants/systemd-journald.socket \ $systemdsystemunitdir/sysinit.target.wants/systemd-udevd.service \ $systemdsystemunitdir/sysinit.target.wants/systemd-udev-trigger.service \ $systemdsystemunitdir/sysinit.target.wants/kmod-static-nodes.service \ $systemdsystemunitdir/sysinit.target.wants/systemd-tmpfiles-setup-dev.service \ $systemdsystemunitdir/sysinit.target.wants/systemd-sysctl.service \ \ $systemdsystemunitdir/ctrl-alt-del.target \ $systemdsystemunitdir/syslog.socket \ $systemdsystemunitdir/initrd-switch-root.target \ $systemdsystemunitdir/initrd-switch-root.service \ $systemdsystemunitdir/initrd-cleanup.service \ $systemdsystemunitdir/initrd-udevadm-cleanup-db.service \ $systemdsystemunitdir/initrd-parse-etc.service \ \ $systemdsystemunitdir/slices.target \ $systemdsystemunitdir/system.slice \ \ journalctl systemctl echo swapoff systemd-cgls systemd-tmpfiles inst_multiple -o \ /usr/lib/modules-load.d/*.conf \ /usr/lib/sysctl.d/*.conf modules_load_get() { local _line i for i in "$1"/*.conf; do [[ -f $i ]] || continue while read _line; do case $_line in \#*) ;; \;*) ;; *) echo $_line esac done < "$i" done } _mods=$(modules_load_get /usr/lib/modules-load.d) [[ $_mods ]] && instmods $_mods if [[ $hostonly ]]; then inst_multiple -o \ /etc/systemd/journald.conf \ /etc/systemd/system.conf \ /etc/hostname \ /etc/machine-id \ /etc/vconsole.conf \ /etc/locale.conf \ /etc/modules-load.d/*.conf \ /etc/sysctl.d/*.conf \ /etc/sysctl.conf _mods=$(modules_load_get /etc/modules-load.d) [[ $_mods ]] && instmods $_mods fi if ! [[ -e "$initdir/etc/machine-id" ]]; then > "$initdir/etc/machine-id" fi # install adm user/group for journald inst_multiple nologin egrep '^systemd-journal:' "$initdir/etc/passwd" 2>/dev/null >> "$initdir/etc/passwd" egrep '^systemd-journal:' /etc/group >> "$initdir/etc/group" ln_r $systemdutildir/systemd "/init" ln_r $systemdutildir/systemd "/sbin/init" inst_script "$moddir/dracut-emergency.sh" /bin/dracut-emergency inst_simple "$moddir/emergency.service" ${systemdsystemunitdir}/emergency.service inst_simple "$moddir/dracut-emergency.service" ${systemdsystemunitdir}/dracut-emergency.service inst_simple "$moddir/emergency.service" ${systemdsystemunitdir}/rescue.service ln_r "${systemdsystemunitdir}/initrd.target" "${systemdsystemunitdir}/default.target" inst_script "$moddir/dracut-cmdline.sh" /bin/dracut-cmdline inst_script "$moddir/dracut-pre-udev.sh" /bin/dracut-pre-udev inst_script "$moddir/dracut-pre-trigger.sh" /bin/dracut-pre-trigger inst_script "$moddir/dracut-initqueue.sh" /bin/dracut-initqueue inst_script "$moddir/dracut-pre-mount.sh" /bin/dracut-pre-mount inst_script "$moddir/dracut-mount.sh" /bin/dracut-mount inst_script "$moddir/dracut-pre-pivot.sh" /bin/dracut-pre-pivot inst_script "$moddir/rootfs-generator.sh" $systemdutildir/system-generators/dracut-rootfs-generator inst_simple "$systemdutildir/system-generators/systemd-fstab-generator" $systemdutildir/system-generator-moved/systemd-fstab-generator inst_binary true ln_r $(type -P true) "/usr/bin/loginctl" ln_r $(type -P true) "/bin/loginctl" inst_rules 70-uaccess.rules 71-seat.rules 73-seat-late.rules 99-systemd.rules for i in \ emergency.target \ dracut-emergency.service \ rescue.service \ systemd-ask-password-console.service \ systemd-ask-password-plymouth.service \ ; do mkdir -p "${initdir}${systemdsystemunitdir}/${i}.wants" ln_r "${systemdsystemunitdir}/systemd-vconsole-setup.service" \ "${systemdsystemunitdir}/${i}.wants/systemd-vconsole-setup.service" done mkdir -p "${initdir}/$systemdsystemunitdir/initrd.target.wants" for i in \ dracut-cmdline.service \ dracut-initqueue.service \ dracut-mount.service \ dracut-pre-mount.service \ dracut-pre-pivot.service \ dracut-pre-trigger.service \ dracut-pre-udev.service \ ; do inst_simple "$moddir/${i}" "$systemdsystemunitdir/${i}" ln_r "$systemdsystemunitdir/${i}" "$systemdsystemunitdir/initrd.target.wants/${i}" done mkdir -p "$initdir/etc/systemd" # turn off RateLimit for journal { echo "[Journal]" echo "RateLimitInterval=0" echo "RateLimitBurst=0" } >> "$initdir/etc/systemd/journald.conf" } 070701000F016F000081ED0000000000000000000000015329C2C800000815000000FD0000000000000000000000000000005700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-cmdline.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh if [ -f /dracut-state.sh ]; then . /dracut-state.sh 2>/dev/null fi type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh [ -f /etc/initrd-release ] && . /etc/initrd-release [ -n "$VERSION" ] && info "dracut-$VERSION" getargbool 0 rd.udev.log-priority=info -d rd.udev.info -d -n -y rdudevinfo && echo 'udev_log="info"' >> /etc/udev/udev.conf getargbool 0 rd.udev.log-priority=debug -d rd.udev.debug -d -n -y rdudevdebug && echo 'udev_log="debug"' >> /etc/udev/udev.conf source_conf /etc/conf.d root=$(getarg root=) rflags="$(getarg rootflags=)" getargbool 0 ro && rflags="${rflags},ro" getargbool 0 rw && rflags="${rflags},rw" rflags="${rflags#,}" fstype="$(getarg rootfstype=)" if [ -z "$fstype" ]; then fstype="auto" fi export root export rflags export fstype make_trace_mem "hook cmdline" '1+:mem' '1+:iomem' '3+:slab' # run scriptlets to parse the command line getarg 'rd.break=cmdline' -d 'rdbreak=cmdline' && emergency_shell -n cmdline "Break before cmdline" source_hook cmdline [ -f /lib/dracut/parse-resume.sh ] && . /lib/dracut/parse-resume.sh case "$root" in block:LABEL=*|LABEL=*) root="${root#block:}" root="$(echo $root | sed 's,/,\\x2f,g')" root="block:/dev/disk/by-label/${root#LABEL=}" rootok=1 ;; block:UUID=*|UUID=*) root="${root#block:}" root="block:/dev/disk/by-uuid/${root#UUID=}" rootok=1 ;; block:PARTUUID=*|PARTUUID=*) root="${root#block:}" root="block:/dev/disk/by-partuuid/${root#PARTUUID=}" rootok=1 ;; block:PARTLABEL=*|PARTLABEL=*) root="${root#block:}" root="block:/dev/disk/by-partlabel/${root#PARTLABEL=}" rootok=1 ;; /dev/*) root="block:${root}" rootok=1 ;; esac [ -z "$root" ] && die "No or empty root= argument" [ -z "$rootok" ] && die "Don't know how to handle 'root=$root'" export root rflags fstype netroot NEWROOT export -p > /dracut-state.sh exit 0 070701000F0175000081ED0000000000000000000000015329C2C80000086C000000FD0000000000000000000000000000005900000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-initqueue.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh export DRACUT_SYSTEMD=1 if [ -f /dracut-state.sh ]; then . /dracut-state.sh 2>/dev/null fi type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh source_conf /etc/conf.d make_trace_mem "hook initqueue" '1:shortmem' '2+:mem' '3+:slab' getarg 'rd.break=initqueue' -d 'rdbreak=initqueue' && emergency_shell -n initqueue "Break before initqueue" RDRETRY=$(getarg rd.retry -d 'rd_retry=') RDRETRY=${RDRETRY:-180} RDRETRY=$(($RDRETRY*2)) export RDRETRY main_loop=0 export main_loop while :; do check_finished && break udevadm settle --exit-if-exists=$hookdir/initqueue/work check_finished && break if [ -f $hookdir/initqueue/work ]; then rm -f -- "$hookdir/initqueue/work" fi for job in $hookdir/initqueue/*.sh; do [ -e "$job" ] || break job=$job . $job check_finished && break 2 done udevadm settle --timeout=0 >/dev/null 2>&1 || continue for job in $hookdir/initqueue/settled/*.sh; do [ -e "$job" ] || break job=$job . $job check_finished && break 2 done udevadm settle --timeout=0 >/dev/null 2>&1 || continue # no more udev jobs and queues empty. sleep 0.5 for i in /run/systemd/ask-password/ask.*; do [ -e "$i" ] && continue 2 done if [ $main_loop -gt $((2*$RDRETRY/3)) ]; then for job in $hookdir/initqueue/timeout/*.sh; do [ -e "$job" ] || break job=$job . $job udevadm settle --timeout=0 >/dev/null 2>&1 || main_loop=0 [ -f $hookdir/initqueue/work ] && main_loop=0 done fi main_loop=$(($main_loop+1)) if [ $main_loop -gt $RDRETRY ]; then if ! [ -f /sysroot/etc/fstab ] || ! [ -e /sysroot/sbin/init ] ; then action_on_fail "Could not boot." && break fi warn "Not all disks have been found." warn "You might want to regenerate your initramfs." break fi done unset job unset queuetriggered unset main_loop unset RDRETRY export -p > /dracut-state.sh exit 0 070701000F0182000081A40000000000000000000000015329C2C800000467000000FD0000000000000000000000000000006000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-pre-trigger.service# This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # See systemd.special(7) for details [Unit] Description=dracut pre-trigger hook Documentation=man:dracut-pre-trigger.service(8) DefaultDependencies=no Before=systemd-udev-trigger.service dracut-initqueue.service After=dracut-pre-udev.service systemd-udevd.service systemd-tmpfiles-setup-dev.service Wants=dracut-pre-udev.service systemd-udevd.service ConditionPathExists=/etc/initrd-release ConditionDirectoryNotEmpty=|/lib/dracut/hooks/pre-trigger ConditionKernelCommandLine=|rd.break=pre-trigger [Service] Environment=DRACUT_SYSTEMD=1 Environment=NEWROOT=/sysroot Type=oneshot ExecStart=-/bin/dracut-pre-trigger StandardInput=null StandardOutput=syslog StandardError=syslog+console KillMode=process RemainAfterExit=yes # Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash # terminates cleanly. KillSignal=SIGHUP 070701000F0185000081ED0000000000000000000000015329C2C800000241000000FD0000000000000000000000000000005B00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-pre-trigger.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh export DRACUT_SYSTEMD=1 if [ -f /dracut-state.sh ]; then . /dracut-state.sh 2>/dev/null fi type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh source_conf /etc/conf.d make_trace_mem "hook pre-trigger" "1:shortmem" "2+:mem" "3+:slab" source_hook pre-trigger getarg 'rd.break=pre-trigger' 'rdbreak=pre-trigger' && emergency_shell -n pre-trigger "Break pre-trigger" udevadm control --reload >/dev/null 2>&1 || : export -p > /dracut-state.sh exit 0 070701000F017F000081A40000000000000000000000015329C30200000603000000FD0000000000000000000000000000006000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-pre-pivot.service.8'\" t .\" Title: dracut-pre-pivot.service .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 03/19/2014 .\" Manual: dracut .\" Source: dracut .\" Language: English .\" .TH "DRACUT\-PRE\-PIVOT\&" "8" "03/19/2014" "dracut" "dracut" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" dracut-pre-pivot.service \- runs the dracut hooks before switching root .SH "SYNOPSIS" .sp dracut\-pre\-pivot\&.service .SH "DESCRIPTION" .sp This service runs all dracut hooks before the system switched to the real root\&. .SH "AUTHORS" .sp Harald Hoyer .SH "SEE ALSO" .sp \fBdracut\&.bootup\fR(7) \fBdracut\fR(8) 070701000F0174000081A40000000000000000000000015329C2C8000001B7000000FD0000000000000000000000000000006400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-initqueue.service.8.ascDRACUT-INITQUEUE.SERVICE(8) =========================== :doctype: manpage :man source: dracut :man manual: dracut NAME ---- dracut-initqueue.service - runs the dracut main loop to find the real root SYNOPSIS -------- dracut-initqueue.service DESCRIPTION ----------- This service runs all the main loop of dracut in the initramfs to find the real root. AUTHORS ------- Harald Hoyer SEE ALSO -------- *dracut.bootup*(7) *dracut*(8) 070701000F018E000081A40000000000000000000000015329C2C8000000F7000000FD0000000000000000000000000000005300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/initrd.target[Unit] Description=Initrd Target Requires=basic.target Conflicts=rescue.service rescue.target After=basic.target rescue.service rescue.target AllowIsolate=yes OnFailure=emergency.target OnFailureIsolate=yes ConditionPathExists=/etc/initrd-release 070701000F016D000081A40000000000000000000000015329C30200000611000000FD0000000000000000000000000000005E00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-cmdline.service.8'\" t .\" Title: dracut-cmdline.service .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 03/19/2014 .\" Manual: dracut .\" Source: dracut .\" Language: English .\" .TH "DRACUT\-CMDLINE\&.SE" "8" "03/19/2014" "dracut" "dracut" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" dracut-cmdline.service \- runs the dracut hooks to parse the kernel command line .SH "SYNOPSIS" .sp dracut\-cmdline\&.service .SH "DESCRIPTION" .sp This service runs all the dracut hooks to parse the kernel command line in the initramfs\&. .SH "AUTHORS" .sp Harald Hoyer .SH "SEE ALSO" .sp \fBdracut\&.bootup\fR(7) \fBdracut\fR(8) 070701000F0180000081A40000000000000000000000015329C2C8000001AD000000FD0000000000000000000000000000006400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-pre-pivot.service.8.ascDRACUT-PRE-PIVOT.SERVICE(8) =========================== :doctype: manpage :man source: dracut :man manual: dracut NAME ---- dracut-pre-pivot.service - runs the dracut hooks before switching root SYNOPSIS -------- dracut-pre-pivot.service DESCRIPTION ----------- This service runs all dracut hooks before the system switched to the real root. AUTHORS ------- Harald Hoyer SEE ALSO -------- *dracut.bootup*(7) *dracut*(8) 070701000F018D000081A40000000000000000000000015329C2C8000003AC000000FD0000000000000000000000000000005700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/emergency.service# This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # See systemd.special(7) for details [Unit] Description=Emergency Shell DefaultDependencies=no After=systemd-vconsole-setup.service Wants=systemd-vconsole-setup.service ConditionPathExists=!/lib/dracut/no-emergency-shell [Service] Environment=HOME=/ Environment=DRACUT_SYSTEMD=1 Environment=NEWROOT=/sysroot WorkingDirectory=/ ExecStart=/bin/dracut-emergency ExecStopPost=-/usr/bin/systemctl --fail --no-block default Type=oneshot StandardInput=tty-force StandardOutput=inherit StandardError=inherit KillMode=process IgnoreSIGPIPE=no # Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash # terminates cleanly. KillSignal=SIGHUP 070701000F0189000081ED000000000000000000000001555B5D0200000643000000FD0000000000000000000000000000005800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-pre-udev.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh export DRACUT_SYSTEMD=1 if [ -f /dracut-state.sh ]; then . /dracut-state.sh 2>/dev/null fi type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh source_conf /etc/conf.d make_trace_mem "hook pre-udev" '1:shortmem' '2+:mem' '3+:slab' # pre pivot scripts are sourced just before we doing cleanup and switch over # to the new root. getarg 'rd.break=pre-udev' 'rdbreak=pre-udev' && emergency_shell -n pre-udev "Break pre-udev" source_hook pre-udev _modprobe_d=/etc/modprobe.d if [ -d /usr/lib/modprobe.d ] ; then _modprobe_d=/usr/lib/modprobe.d elif [ -d /lib/modprobe.d ] ; then _modprobe_d=/lib/modprobe.d elif [ ! -d $_modprobe_d ] ; then mkdir -p $_modprobe_d fi for i in $(getargs rd.driver.pre -d rdloaddriver=); do ( _IFS="$IFS" IFS=, for p in $i; do modprobe $p 2>&1 | vinfo done IFS="$_IFS" ) done [ -d /etc/modprobe.d ] || mkdir -p /etc/modprobe.d for i in $(getargs rd.driver.blacklist -d rdblacklist=); do ( _IFS="$IFS" IFS=, for p in $i; do echo "blacklist $p" >> $_modprobe_d/initramfsblacklist.conf done IFS="$_IFS" ) done for p in $(getargs rd.driver.post -d rdinsmodpost=); do echo "blacklist $p" >> $_modprobe_d/initramfsblacklist.conf _do_insmodpost=1 done [ -n "$_do_insmodpost" ] && initqueue --settled --unique --onetime insmodpost.sh unset _do_insmodpost _modprobe_d unset i export -p > /dracut-state.sh exit 0 070701000F0170000081A40000000000000000000000015329C2C8000003D0000000FD0000000000000000000000000000005E00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-emergency.service# This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # See systemd.special(7) for details [Unit] Description=Dracut Emergency Shell DefaultDependencies=no After=systemd-vconsole-setup.service Wants=systemd-vconsole-setup.service Conflicts=emergency.service emergency.target ConditionPathExists=!/lib/dracut/no-emergency-shell [Service] Environment=HOME=/ Environment=DRACUT_SYSTEMD=1 Environment=NEWROOT=/sysroot WorkingDirectory=/ ExecStart=/bin/dracut-emergency ExecStopPost=-/bin/rm -f -- /.console_lock Type=oneshot StandardInput=tty-force StandardOutput=inherit StandardError=inherit KillMode=process IgnoreSIGPIPE=no # Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash # terminates cleanly. KillSignal=SIGHUP 070701000F0181000081ED0000000000000000000000015329C2C8000003C7000000FD0000000000000000000000000000005900000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-pre-pivot.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh export DRACUT_SYSTEMD=1 if [ -f /dracut-state.sh ]; then . /dracut-state.sh 2>/dev/null fi type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh source_conf /etc/conf.d make_trace_mem "hook pre-pivot" '1:shortmem' '2+:mem' '3+:slab' # pre pivot scripts are sourced just before we doing cleanup and switch over # to the new root. getarg 'rd.break=pre-pivot' 'rdbreak=pre-pivot' && emergency_shell -n pre-pivot "Break pre-pivot" source_hook pre-pivot # pre pivot cleanup scripts are sourced just before we switch over to the new root. getarg 'rd.break=cleanup' 'rdbreak=cleanup' && emergency_shell -n cleanup "Break cleanup" source_hook cleanup getarg rd.break -d rdbreak && emergency_shell -n switch_root "Break before switch_root" # remove helper symlink [ -h /dev/root ] && rm -f -- /dev/root [ -h /dev/nfs ] && rm -f -- /dev/nfs exit 0 070701000F0184000081A40000000000000000000000015329C2C8000001B8000000FD0000000000000000000000000000006600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-pre-trigger.service.8.ascDRACUT-PRE-TRIGGER.SERVICE(8) ============================= :doctype: manpage :man source: dracut :man manual: dracut NAME ---- dracut-pre-trigger.service - runs the dracut hooks before udevd is triggered SYNOPSIS -------- dracut-pre-trigger.service DESCRIPTION ----------- This service runs all dracut hooks before udevd is triggered in the initramfs. AUTHORS ------- Harald Hoyer SEE ALSO -------- *dracut.bootup*(7) *dracut*(8) 070701000F017B000081A40000000000000000000000015329C30200000608000000FD0000000000000000000000000000006000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-pre-mount.service.8'\" t .\" Title: dracut-pre-mount.service .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 03/19/2014 .\" Manual: dracut .\" Source: dracut .\" Language: English .\" .TH "DRACUT\-PRE\-MOUNT\&" "8" "03/19/2014" "dracut" "dracut" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" dracut-pre-mount.service \- runs the dracut hooks before /sysroot is mounted .SH "SYNOPSIS" .sp dracut\-pre\-mount\&.service .SH "DESCRIPTION" .sp This service runs all dracut hooks before the real root is mounted on /sysroot\&. .SH "AUTHORS" .sp Harald Hoyer .SH "SEE ALSO" .sp \fBdracut\&.bootup\fR(7) \fBdracut\fR(8) 070701000F018B000081A40000000000000000000000015329C30200000E17000000FD0000000000000000000000000000005F00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-shutdown.service.8'\" t .\" Title: dracut-shutdown.service .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 03/19/2014 .\" Manual: dracut .\" Source: dracut .\" Language: English .\" .TH "DRACUT\-SHUTDOWN\&.S" "8" "03/19/2014" "dracut" "dracut" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" dracut-shutdown.service \- unpack the initramfs to /run/initramfs .SH "SYNOPSIS" .sp dracut\-shutdown\&.service .SH "DESCRIPTION" .sp This service unpacks the initramfs image to /run/initramfs\&. systemd pivots into /run/initramfs at shutdown, so the root filesytem can be safely unmounted\&. .sp The following steps are executed during a shutdown: .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} systemd switches to the shutdown\&.target .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} systemd starts /lib/systemd/system/shutdown\&.target\&.wants/dracut\-shutdown\&.service .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} dracut\-shutdown\&.service executes /usr/lib/dracut/dracut\-initramfs\-restore which unpacks the initramfs to /run/initramfs .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} systemd finishes shutdown\&.target .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} systemd kills all processes .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} systemd tries to unmount everything and mounts the remaining read\-only .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} systemd checks, if there is a /run/initramfs/shutdown executable .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} if yes, it does a pivot_root to /run/initramfs and executes \&./shutdown\&. The old root is then mounted on /oldroot\&. /usr/lib/dracut/modules\&.d/99shutdown/shutdown\&.sh is the shutdown executable\&. .RE .sp .RS 4 .ie n \{\ \h'-04'\(bu\h'+03'\c .\} .el \{\ .sp -1 .IP \(bu 2.3 .\} shutdown will try to umount every /oldroot mount and calls the various shutdown hooks from the dracut modules .RE .sp This ensures, that all devices are disassembled and unmounted cleanly\&. .sp To debug the shutdown process, you can get a shell in the shutdown procedure by injecting "rd\&.break=pre\-shutdown rd\&.shell" or "rd\&.break=shutdown rd\&.shell"\&. .sp .if n \{\ .RS 4 .\} .nf # mkdir \-p /run/initramfs/etc/cmdline\&.d # echo "rd\&.break=pre\-shutdown rd\&.shell" > /run/initramfs/etc/cmdline\&.d/debug\&.conf # touch /run/initramfs/\&.need_shutdown .fi .if n \{\ .RE .\} .SH "AUTHORS" .sp Harald Hoyer .SH "SEE ALSO" .sp \fBdracut\fR(8) 070701000F0188000081A40000000000000000000000015329C2C8000001A8000000FD0000000000000000000000000000006300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-pre-udev.service.8.ascDRACUT-PRE-UDEV.SERVICE(8) ========================== :doctype: manpage :man source: dracut :man manual: dracut NAME ---- dracut-pre-udev.service - runs the dracut hooks before udevd is started SYNOPSIS -------- dracut-pre-udev.service DESCRIPTION ----------- This service runs all dracut hooks before udevd is started in the initramfs. AUTHORS ------- Harald Hoyer SEE ALSO -------- *dracut.bootup*(7) *dracut*(8) 070701000F0187000081A40000000000000000000000015329C302000005FF000000FD0000000000000000000000000000005F00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-pre-udev.service.8'\" t .\" Title: dracut-pre-udev.service .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 03/19/2014 .\" Manual: dracut .\" Source: dracut .\" Language: English .\" .TH "DRACUT\-PRE\-UDEV\&." "8" "03/19/2014" "dracut" "dracut" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" dracut-pre-udev.service \- runs the dracut hooks before udevd is started .SH "SYNOPSIS" .sp dracut\-pre\-udev\&.service .SH "DESCRIPTION" .sp This service runs all dracut hooks before udevd is started in the initramfs\&. .SH "AUTHORS" .sp Harald Hoyer .SH "SEE ALSO" .sp \fBdracut\&.bootup\fR(7) \fBdracut\fR(8) 070701000F016E000081A40000000000000000000000015329C2C8000001BA000000FD0000000000000000000000000000006200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-cmdline.service.8.ascDRACUT-CMDLINE.SERVICE(8) ========================= :doctype: manpage :man source: dracut :man manual: dracut NAME ---- dracut-cmdline.service - runs the dracut hooks to parse the kernel command line SYNOPSIS -------- dracut-cmdline.service DESCRIPTION ----------- This service runs all the dracut hooks to parse the kernel command line in the initramfs. AUTHORS ------- Harald Hoyer SEE ALSO -------- *dracut.bootup*(7) *dracut*(8) 070701000F0172000081A4000000000000000000000001555B5D020000054C000000FD0000000000000000000000000000005E00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-initqueue.service# This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # See systemd.special(7) for details [Unit] Description=dracut initqueue hook Documentation=man:dracut-initqueue.service(8) DefaultDependencies=no Before=remote-fs-pre.target Wants=remote-fs-pre.target After=systemd-udev-trigger.service Wants=systemd-udev-trigger.service ConditionPathExists=/etc/initrd-release ConditionPathExists=|/lib/dracut/need-initqueue ConditionPathExistsGlob=|/lib/dracut/hooks/initqueue/*.sh ConditionPathExistsGlob=|/lib/dracut/hooks/initqueue/settled/*.sh ConditionPathExistsGlob=|/lib/dracut/hooks/initqueue/finished/*.sh ConditionPathExistsGlob=|/lib/dracut/hooks/initqueue/online/*.sh ConditionPathExistsGlob=|/lib/dracut/hooks/initqueue/timeout/*.sh ConditionKernelCommandLine=|rd.break=initqueue [Service] Environment=DRACUT_SYSTEMD=1 Environment=NEWROOT=/sysroot Type=oneshot ExecStart=-/bin/dracut-initqueue StandardInput=null StandardOutput=syslog StandardError=syslog+console KillMode=process RemainAfterExit=yes # Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash # terminates cleanly. KillSignal=SIGHUP 070701000F016C000081A40000000000000000000000015329C2C80000045D000000FD0000000000000000000000000000005C00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-cmdline.service# This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # See systemd.special(7) for details [Unit] Description=dracut cmdline hook Documentation=man:dracut-cmdline.service(8) DefaultDependencies=no Before=dracut-pre-udev.service After=systemd-journald.socket Wants=systemd-journald.socket ConditionPathExists=/etc/initrd-release ConditionPathExistsGlob=|/etc/cmdline.d/*.conf ConditionDirectoryNotEmpty=|/lib/dracut/hooks/cmdline ConditionKernelCommandLine=|rd.break=cmdline ConditionKernelCommandLine=|resume ConditionKernelCommandLine=|noresume [Service] Environment=DRACUT_SYSTEMD=1 Environment=NEWROOT=/sysroot Type=oneshot ExecStart=-/bin/dracut-cmdline StandardInput=null StandardOutput=syslog StandardError=syslog+console KillMode=process RemainAfterExit=yes # Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash # terminates cleanly. KillSignal=SIGHUP 070701000F0191000081ED000000000000000000000001555B5D020000104E000000FD0000000000000000000000000000005900000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/rootfs-generator.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh generator_wait_for_dev() { local _name local _timeout _name="$(str_replace "$1" '/' '\x2f')" _timeout=$(getarg rd.timeout) _timeout=${_timeout:-0} [ -e "$hookdir/initqueue/finished/devexists-${_name}.sh" ] && return 0 printf '[ -e "%s" ]\n' $1 \ >> "$hookdir/initqueue/finished/devexists-${_name}.sh" { printf '[ -e "%s" ] || ' $1 printf 'warn "\"%s\" does not exist"\n' $1 } >> "$hookdir/emergency/80-${_name}.sh" _name=$(dev_unit_name "$1") if ! [ -L /run/systemd/generator/initrd.target.wants/${_name}.device ]; then [ -d /run/systemd/generator/initrd.target.wants ] || mkdir -p /run/systemd/generator/initrd.target.wants ln -s ../${_name}.device /run/systemd/generator/initrd.target.wants/${_name}.device fi if ! [ -f /run/systemd/generator/${_name}.device.d/timeout.conf ]; then mkdir -p /run/systemd/generator/${_name}.device.d { echo "[Unit]" echo "JobTimeoutSec=$_timeout" } > /run/systemd/generator/${_name}.device.d/timeout.conf fi } generator_mount_rootfs() { local _type=$2 local _flags=$3 local _name [ -z "$1" ] && return 0 [ -f /run/systemd/generator/sysroot.mount ] && return 0 _name=$(dev_unit_name "$1") [ -d /run/systemd/generator ] || mkdir -p /run/systemd/generator #make sure that the initial mount is ro for i in $(echo $_flags | sed 's/,/ /g'); do [[ $i == rw ]] || [[ $i == ro ]] || rootflags="$rootflags,$i" done _flags="${rootflags#,},ro" { echo "[Unit]" echo "Before=initrd-root-fs.target" echo "RequiresOverridable=systemd-fsck@${_name}.service" echo "After=systemd-fsck@${_name}.service" echo "[Mount]" echo "Where=/sysroot" echo "What=$1" echo "Options=${_flags}" echo "Type=${_type}" } > /run/systemd/generator/sysroot.mount if ! [ -L /run/systemd/generator/initrd-root-fs.target.requires/sysroot.mount ]; then [ -d /run/systemd/generator/initrd-root-fs.target.requires ] || mkdir -p /run/systemd/generator/initrd-root-fs.target.requires ln -s ../sysroot.mount /run/systemd/generator/initrd-root-fs.target.requires/sysroot.mount fi } generator_fsck_after_pre_mount() { local _name [ -z "$1" ] && return 0 _name=$(dev_unit_name "$1") [ -d /run/systemd/generator/systemd-fsck@${_name}.service.d ] || mkdir -p /run/systemd/generator/systemd-fsck@${_name}.service.d if ! [ -f /run/systemd/generator/systemd-fsck@${_name}.service.d/after-pre-mount.conf ]; then { echo "[Unit]" echo "After=dracut-pre-mount.service" } > /run/systemd/generator/systemd-fsck@${_name}.service.d/after-pre-mount.conf fi } root=$(getarg root=) case "$root" in block:LABEL=*|LABEL=*) root="${root#block:}" root="$(echo $root | sed 's,/,\\x2f,g')" root="block:/dev/disk/by-label/${root#LABEL=}" rootok=1 ;; block:UUID=*|UUID=*) root="${root#block:}" root="block:/dev/disk/by-uuid/${root#UUID=}" rootok=1 ;; block:PARTUUID=*|PARTUUID=*) root="${root#block:}" root="block:/dev/disk/by-partuuid/${root#PARTUUID=}" rootok=1 ;; block:PARTLABEL=*|PARTLABEL=*) root="${root#block:}" root="block:/dev/disk/by-partlabel/${root#PARTLABEL=}" rootok=1 ;; /dev/nfs) # ignore legacy /dev/nfs ;; /dev/*) root="block:${root}" rootok=1 ;; esac if [ "${root%%:*}" = "block" ]; then generator_wait_for_dev "${root#block:}" "$RDRETRY" generator_fsck_after_pre_mount "${root#block:}" cmdline=$(/dev/null fi type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh source_conf /etc/conf.d type plymouth >/dev/null 2>&1 && plymouth quit export _rdshell_name="dracut" action="Boot" hook="emergency" source_hook "$hook" if getargbool 1 rd.shell -d -y rdshell || getarg rd.break -d rdbreak; then echo rdsosreport echo echo echo 'Entering emergency mode. Exit the shell to continue.' echo 'Type "journalctl" to view system logs.' echo 'You might want to save "/run/initramfs/rdsosreport.txt" to a USB stick or /boot' echo 'after mounting them and attach it to a bug report.' echo echo [ -f /etc/profile ] && . /etc/profile [ -z "$PS1" ] && export PS1="$_name:\${PWD}# " exec sh -i -l else warn "$action has failed. To debug this issue add \"rd.shell rd.debug\" to the kernel command line." exit 1 fi /bin/rm -f -- /.console_lock exit 0 070701000F0178000081A40000000000000000000000015329C2C8000001A0000000FD0000000000000000000000000000006000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-mount.service.8.ascDRACUT-MOUNT.SERVICE(8) ======================= :doctype: manpage :man source: dracut :man manual: dracut NAME ---- dracut-mount.service - runs the dracut hooks after /sysroot is mounted SYNOPSIS -------- dracut-mount.service DESCRIPTION ----------- This service runs all dracut hooks after the real root is mounted on /sysroot. AUTHORS ------- Harald Hoyer SEE ALSO -------- *dracut.bootup*(7) *dracut*(8) 070701000F0179000081ED0000000000000000000000015329C2C800000492000000FD0000000000000000000000000000005500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-mount.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh export DRACUT_SYSTEMD=1 if [ -f /dracut-state.sh ]; then . /dracut-state.sh 2>/dev/null fi type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh source_conf /etc/conf.d make_trace_mem "hook mount" '1:shortmem' '2+:mem' '3+:slab' getarg 'rd.break=mount' -d 'rdbreak=mount' && emergency_shell -n mount "Break mount" # mount scripts actually try to mount the root filesystem, and may # be sourced any number of times. As soon as one suceeds, no more are sourced. i=0 while :; do if ismounted "$NEWROOT"; then usable_root "$NEWROOT" && break; umount "$NEWROOT" fi for f in $hookdir/mount/*.sh; do [ -f "$f" ] && . "$f" if ismounted "$NEWROOT"; then usable_root "$NEWROOT" && break; warn "$NEWROOT has no proper rootfs layout, ignoring and removing offending mount hook" umount "$NEWROOT" rm -f -- "$f" fi done i=$(($i+1)) [ $i -gt 20 ] && action_on_fail "Can't mount root filesystem" && break done export -p > /dracut-state.sh exit 0 070701000F0190000081A4000000000000000000000001555B5D0200000371000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/rescue.service# This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # See systemd.special(7) for details [Unit] Description=Rescue Shell DefaultDependencies=no [Service] Environment=HOME=/ Environment=DRACUT_SYSTEMD=1 Environment=NEWROOT=/sysroot WorkingDirectory=/ ExecStartPre=-/usr/bin/plymouth quit ExecStart=-/bin/sh -i -l ExecStopPost=-/bin/rm -f -- /.console_lock ExecStopPost=-/usr/bin/systemctl --fail --no-block default Type=idle StandardInput=tty-force StandardOutput=inherit StandardError=inherit KillMode=process IgnoreSIGPIPE=no # Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash # terminates cleanly. KillSignal=SIGHUP 070701000F0176000081A40000000000000000000000015329C2C8000003D7000000FD0000000000000000000000000000005A00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-mount.service# This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # See systemd.special(7) for details [Unit] Description=dracut mount hook Documentation=man:dracut-mount.service(8) After=initrd-root-fs.target initrd-parse-etc.service After=dracut-initqueue.service dracut-pre-mount.service ConditionPathExists=/etc/initrd-release ConditionDirectoryNotEmpty=|/lib/dracut/hooks/mount ConditionKernelCommandLine=|rd.break=mount [Service] Environment=DRACUT_SYSTEMD=1 Environment=NEWROOT=/sysroot Type=oneshot ExecStart=-/bin/dracut-mount StandardInput=null StandardOutput=syslog StandardError=syslog+console KillMode=process RemainAfterExit=yes # Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash # terminates cleanly. KillSignal=SIGHUP 070701000F0186000081A40000000000000000000000015329C2C800000487000000FD0000000000000000000000000000005D00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-pre-udev.service# This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation; either version 2.1 of the License, or # (at your option) any later version. # See systemd.special(7) for details [Unit] Description=dracut pre-udev hook Documentation=man:dracut-pre-udev.service(8) DefaultDependencies=no Before=systemd-udevd.service dracut-pre-trigger.service After=dracut-cmdline.service Wants=dracut-cmdline.service ConditionPathExists=/etc/initrd-release ConditionDirectoryNotEmpty=|/lib/dracut/hooks/pre-udev ConditionKernelCommandLine=|rd.break=pre-udev ConditionKernelCommandLine=|rd.driver.blacklist ConditionKernelCommandLine=|rd.driver.pre ConditionKernelCommandLine=|rd.driver.post [Service] Environment=DRACUT_SYSTEMD=1 Environment=NEWROOT=/sysroot Type=oneshot ExecStart=-/bin/dracut-pre-udev StandardInput=null StandardOutput=syslog StandardError=syslog+console KillMode=process RemainAfterExit=yes # Bash ignores SIGTERM, so we send SIGHUP instead, to ensure that bash # terminates cleanly. KillSignal=SIGHUP 070701000F0177000081A40000000000000000000000015329C302000005F9000000FD0000000000000000000000000000005C00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98systemd/dracut-mount.service.8'\" t .\" Title: dracut-mount.service .\" Author: [see the "AUTHORS" section] .\" Generator: DocBook XSL Stylesheets v1.78.1 .\" Date: 03/19/2014 .\" Manual: dracut .\" Source: dracut .\" Language: English .\" .TH "DRACUT\-MOUNT\&.SERV" "8" "03/19/2014" "dracut" "dracut" .\" ----------------------------------------------------------------- .\" * Define some portability stuff .\" ----------------------------------------------------------------- .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .\" http://bugs.debian.org/507673 .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" ----------------------------------------------------------------- .\" * set default formatting .\" ----------------------------------------------------------------- .\" disable hyphenation .nh .\" disable justification (adjust text to left margin only) .ad l .\" ----------------------------------------------------------------- .\" * MAIN CONTENT STARTS HERE * .\" ----------------------------------------------------------------- .SH "NAME" dracut-mount.service \- runs the dracut hooks after /sysroot is mounted .SH "SYNOPSIS" .sp dracut\-mount\&.service .SH "DESCRIPTION" .sp This service runs all dracut hooks after the real root is mounted on /sysroot\&. .SH "AUTHORS" .sp Harald Hoyer .SH "SEE ALSO" .sp \fBdracut\&.bootup\fR(7) \fBdracut\fR(8) 070701000F015C000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98pollcdrom070701000F015D000081ED0000000000000000000000015329C2C800000135000000FD0000000000000000000000000000005700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98pollcdrom/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { return 255 } # called by dracut depends() { return 0 } # called by dracut install() { inst_hook initqueue/settled 99 "$moddir/pollcdrom.sh" } 070701000F015E000081ED0000000000000000000000015329C2C8000002E9000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98pollcdrom/pollcdrom.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # # Licensed under the GPLv2 # # Copyright 2008-2012, Red Hat, Inc. # Harald Hoyer if [ ! -e /sys/module/block/parameters/events_dfl_poll_msecs ]; then # if the kernel does not support autopolling # then we have to do a # dirty hack for some cdrom drives, # which report no medium for quiet # some time. for cdrom in /sys/block/sr*; do [ -e "$cdrom" ] || continue # skip, if cdrom medium was already found strstr "$(udevadm info --query=env --path=${cdrom##/sys})" \ ID_CDROM_MEDIA && continue echo change > "$cdrom/uevent" done fi 070701000F01A6000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/99suse070701000F01A7000081ED000000000000000000000001555B5D0200000103000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/99suse/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # module-setup.sh for openSUSE / SLE initrd parameters conversion install() { inst_hook cmdline 99 "$moddir/parse-suse-initrd.sh" } 070701000F01A8000081ED000000000000000000000001555B5D02000004FA000000FD0000000000000000000000000000005700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/99suse/parse-suse-initrd.sh#!/bin/sh # convert openSUSE / SLE initrd command lines into dracut ones # linuxrc=trace shell=1 sysrq=yes sysrq=1-9 journaldev mduuid # TargetAddress TargetPort TargetName # sysrq sysrq=$(getarg sysrq) if [ "$sysrq" ] && [ "$sysrq" != "no" ]; then echo 1 > /proc/sys/kernel/sysrq case "$sysrq" in 0|1|2|3|4|5|6|7|8|9) echo $sysrq > /proc/sysrq-trigger ;; esac fi # debug if getarg linuxrc=trace; then echo "rd.debug rd.udev.debug" >> /etc/cmdline.d/99-suse.conf unset CMDLINE fi # debug shell if getargbool 0 shell; then echo "rd.break" >> /etc/cmdline.d/99-suse.conf unset CMDLINE fi # journaldev journaldev=$(getarg journaldev) if [ -n "$journaldev" ]; then echo "root.journaldev=$journaldev" >> /etc/cmdline.d/99-suse.conf unset CMDLINE fi # mduuid mduuid=$(getarg mduuid) if [ -n "$mduuid"]; then echo "rd.md.uuid=$mduuid" >> /etc/cmdline.d/99-suse.conf unset CMDLINE fi # TargetAddress / TargetPort / TargetName TargetAddress=$(getarg TargetAddress) TargetPort=$(getarg TargetPort) TargetName=$(getarg TargetName) if [ -n "$TargetAddress" -a -n "$TargetName" ]; then echo "netroot=iscsi:$TargetAddress::$TargetPort::$TargetName" >> /etc/cmdline.d/99-suse.conf unset CMDLINE fi 070701000F012A000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004100000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95nbd070701000F012B000081ED000000000000000000000001555B5D02000003CC000000FD0000000000000000000000000000005100000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95nbd/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { local _rootdev # if an nbd device is not somewhere in the chain of devices root is # mounted on, fail the hostonly check. [[ $hostonly ]] || [[ $mount_needs ]] && { is_nbd() { [[ -b /dev/block/$1 && $1 == 43:* ]] ;} _rootdev=$(find_root_block_device) [[ -b /dev/block/$_rootdev ]] || return 1 check_block_and_slaves is_nbd "$_rootdev" || return 255 } require_binaries nbd-client || return 1 return 0 } # called by dracut depends() { # We depend on network modules being loaded echo network rootfs-block } # called by dracut installkernel() { instmods nbd } # called by dracut install() { inst nbd-client inst_hook cmdline 90 "$moddir/parse-nbdroot.sh" inst_script "$moddir/nbdroot.sh" "/sbin/nbdroot" dracut_need_initqueue } 070701000F012D000081ED0000000000000000000000015329C2C800000698000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95nbd/parse-nbdroot.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # # Preferred format: # root=nbd:srv:port[:fstype[:rootflags[:nbdopts]]] # [root=*] netroot=nbd:srv:port[:fstype[:rootflags[:nbdopts]]] # # nbdopts is a comma separated list of options to give to nbd-client # # root= takes precedence over netroot= if root=nbd[...] # # Sadly there's no easy way to split ':' separated lines into variables netroot_to_var() { local v=${1}: set -- while [ -n "$v" ]; do set -- "$@" "${v%%:*}" v=${v#*:} done unset server port server=$2; port=$3; } # This script is sourced, so root should be set. But let's be paranoid [ -z "$root" ] && root=$(getarg root=) if [ -z "$netroot" ]; then for netroot in $(getargs netroot=); do [ "${netroot%%:*}" = "nbd" ] && break done [ "${netroot%%:*}" = "nbd" ] || unset netroot fi # Root takes precedence over netroot if [ "${root%%:*}" = "nbd" ] ; then if [ -n "$netroot" ] ; then warn "root takes precedence over netroot. Ignoring netroot" fi netroot=$root unset root fi # If it's not nbd we don't continue [ "${netroot%%:*}" = "nbd" ] || return # Check required arguments netroot_to_var $netroot [ -z "$server" ] && die "Argument server for nbdroot is missing" [ -z "$port" ] && die "Argument port for nbdroot is missing" # NBD actually supported? incol2 /proc/devices nbd || modprobe nbd || die "nbdroot requested but kernel/initrd does not support nbd" # Done, all good! rootok=1 # Shut up init error check if [ -z "$root" ]; then root=block:/dev/root wait_for_dev -n /dev/root fi 070701000F012C000081ED000000000000000000000001555B5D0200000C2A000000FD0000000000000000000000000000004C00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95nbd/nbdroot.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh PATH=/usr/sbin:/usr/bin:/sbin:/bin # Huh? Empty $1? [ -z "$1" ] && exit 1 # Huh? Empty $2? [ -z "$2" ] && exit 1 # Huh? Empty $3? [ -z "$3" ] && exit 1 # root is in the form root=nbd:srv:port[:fstype[:rootflags[:nbdopts]]] netif="$1" nroot="$2" NEWROOT="$3" # If it's not nbd we don't continue [ "${nroot%%:*}" = "nbd" ] || return nroot=${nroot#nbd:} nbdserver=${nroot%%:*}; nroot=${nroot#*:} nbdport=${nroot%%:*}; nroot=${nroot#*:} nbdfstype=${nroot%%:*}; nroot=${nroot#*:} nbdflags=${nroot%%:*} nbdopts=${nroot#*:} # If nbdport not an integer, then assume name based import if [ ! -z $(echo "$nbdport" | sed 's/[0-9]//g') ]; then nbdport="-N $nbdport" fi if [ "$nbdopts" = "$nbdflags" ]; then unset nbdopts fi if [ "$nbdflags" = "$nbdfstype" ]; then unset nbdflags fi if [ "$nbdfstype" = "$nbdport" ]; then unset nbdfstype fi if [ -z "$nbdfstype" ]; then nbdfstype=auto fi # look through the NBD options and pull out the ones that need to # go before the host etc. Append a ',' so we know we terminate the loop nbdopts=${nbdopts}, while [ -n "$nbdopts" ]; do f=${nbdopts%%,*} nbdopts=${nbdopts#*,} if [ -z "$f" ]; then break fi if [ -z "${f%bs=*}" -o -z "${f%timeout=*}" ]; then preopts="$preopts $f" continue fi opts="$opts $f" done # look through the flags and see if any are overridden by the command line nbdflags=${nbdflags}, while [ -n "$nbdflags" ]; do f=${nbdflags%%,*} nbdflags=${nbdflags#*,} if [ -z "$f" ]; then break fi if [ "$f" = "ro" -o "$f" = "rw" ]; then nbdrw=$f continue fi fsopts=${fsopts:+$fsopts,}$f done getarg ro && nbdrw=ro getarg rw && nbdrw=rw fsopts=${fsopts:+$fsopts,}${nbdrw} # XXX better way to wait for the device to be made? i=0 while [ ! -b /dev/nbd0 ]; do [ $i -ge 20 ] && exit 1 if [ $UDEVVERSION -ge 143 ]; then udevadm settle --exit-if-exists=/dev/nbd0 else sleep 0.1 fi i=$(($i + 1)) done # If we didn't get a root= on the command line, then we need to # add the udev rules for mounting the nbd0 device if [ "$root" = "block:/dev/root" -o "$root" = "dhcp" ]; then printf 'KERNEL=="nbd0", ENV{DEVTYPE}!="partition", ENV{ID_FS_TYPE}=="?*", SYMLINK+="root"\n' >> /etc/udev/rules.d/99-nbd-root.rules udevadm control --reload type write_fs_tab >/dev/null 2>&1 || . /lib/fs-lib.sh write_fs_tab /dev/root "$nbdfstype" "$fsopts" wait_for_dev -n /dev/root if [ -z "$DRACUT_SYSTEMD" ]; then printf '/bin/mount %s\n' \ "$NEWROOT" \ > $hookdir/mount/01-$$-nbd.sh fi fi if strstr "$(nbd-client --help 2>&1)" "systemd-mark"; then preopts="--systemd-mark $preopts" fi nbd-client $preopts "$nbdserver" $nbdport /dev/nbd0 $opts || exit 1 # NBD doesn't emit uevents when it gets connected, so kick it echo change > /sys/block/nbd0/uevent udevadm settle need_shutdown exit 0 070701000F0099000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/45ifcfg070701000F009A000081ED000000000000000000000001555B5D020000023D000000FD0000000000000000000000000000005300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/45ifcfg/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { local link=$(readlink $moddir/write-ifcfg.sh) [[ "$link" = "write-ifcfg-suse.sh" ]] && \ [[ -d /etc/sysconfig/network ]] && \ return 0 [[ "$link" = "write-ifcfg-redhat.sh" ]] && \ [[ -d /etc/sysconfig/network-scripts ]] && \ return 0 return 255 } # called by dracut depends() { return 0 } # called by dracut install() { inst_hook pre-pivot 85 "$moddir/write-ifcfg.sh" } 070701000F009B000081ED000000000000000000000001555B5D02000014C1000000FD0000000000000000000000000000005700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/45ifcfg/write-ifcfg-suse.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # NFS root might have reached here before /tmp/net.ifaces was written udevadm settle --timeout=30 if [ -e /tmp/bridge.info ]; then . /tmp/bridge.info fi if [ -e /tmp/vlan.info ]; then . /tmp/vlan.info fi mkdir -m 0755 -p /tmp/ifcfg/ mkdir -m 0755 -p /tmp/ifcfg-leases/ get_vid() { case "$1" in vlan*) echo ${1#vlan} ;; *.*) echo ${1##*.} ;; esac } for netup in /tmp/net.*.did-setup ; do [ -f $netup ] || continue netif=${netup%%.did-setup} netif=${netif##*/net.} strglobin "$netif" ":*:*:*:*:" && continue [ -e /tmp/ifcfg/ifcfg-$netif ] && continue unset bridge unset bond unset bondslaves unset bondname unset bondoptions unset uuid unset ip unset gw unset mtu unset mask unset macaddr unset slave unset ethname [ -e /tmp/bond.${netif}.info ] && . /tmp/bond.${netif}.info uuid=$(cat /proc/sys/kernel/random/uuid) if [ "$netif" = "$bridgename" ]; then bridge=yes elif [ "$netif" = "$bondname" ]; then # $netif can't be bridge and bond at the same time bond=yes fi if [ "$netif" = "$vlanname" ]; then vlan=yes fi [ -e /sys/class/net/$netif/address ] && \ cat /sys/class/net/$netif/address > /tmp/net.$netif.hwaddr { echo "# Generated by dracut initrd" echo "NAME='$netif'" if [ -f /tmp/net.$netif.has_ibft_config ]; then echo "STARTMODE='nfsroot'" else echo "STARTMODE='auto'" fi local bootproto="static" if [ -f /tmp/leaseinfo.${netif}.dhcp.ipv6 ]; then bootproto="dhcp6" fi if [ -f /tmp/leaseinfo.${netif}.dhcp.ipv4 ]; then if [ "$bootproto" = "dhcp6" ]; then bootproto="dhcp" else bootproto="dhcp4" fi fi echo "BOOTPROTO='$bootproto'" if [ "$bootproto" = "static" ]; then # If we've booted with static ip= lines, the override file is there [ -e /tmp/net.$netif.override ] && . /tmp/net.$netif.override echo "IPADDR='$ip'" if [ -n "$mask" ]; then if strstr "$mask" "."; then echo "NETMASK='$mask'" else echo "PREFIXLEN='$mask'" fi fi if [ -n "$gw" ]; then echo "GATEWAY='$gw'" fi fi [ -n "$mtu" ] && echo "MTU='$mtu'" } > /tmp/ifcfg/ifcfg-$netif # bridge needs different things written to ifcfg if [ -z "$bridge" ] && [ -z "$bond" ] && [ -z "$vlan" ]; then # standard interface { if [ -n "$macaddr" ]; then echo "LLADDR='$macaddr'" else echo "LLADDR='$(cat /sys/class/net/$netif/address)'" fi echo "INTERFACETYPE='Ethernet'" } >> /tmp/ifcfg/ifcfg-$netif fi if [ -n "$vlan" ]; then { echo "INTERFACETYPE='Vlan'" echo "VLAN_ID='$(get_vid $vlanname)'" echo "ETHERDEVICE='$phydevice'" } >> /tmp/ifcfg/ifcfg-$netif fi if [ -n "$bond" ] ; then # bond interface { # This variable is an indicator of a bond interface for initscripts echo "BONDING_MASTER='yes'" echo "BONDING_MODULE_OPTS='$bondoptions'" echo "INTERFACETYPE='Bond'" } >> /tmp/ifcfg/ifcfg-$netif local i=0 for slave in $bondslaves ; do echo "BONDING_SLAVE_$i='$slave'" >> /tmp/ifcfg/ifcfg-$netif i=$((i+1)) # write separate ifcfg file for the raw eth interface { echo "# Generated by dracut initrd" echo "NAME='$slave'" echo "INTERFACETYPE='Ethernet'" echo "STARTMODE='hotplug'" echo "BOOTPROTO='none'" echo "# ETHTOOL=''" } >> /tmp/ifcfg/ifcfg-$slave done fi if [ -n "$bridge" ] ; then # bridge { echo "INTERFACETYPE='Bridge'" echo "BRIDGE='yes'" echo "BRIDGE_STP='off'" echo "BRIDGE_FORWARDDELAY='0'" echo -n "BRIDGE_PORTS='" } >> /tmp/ifcfg/ifcfg-$netif if [ "$ethname" = "$bondname" ] ; then { for slave in $bondslaves ; do echo -n "$bondname " done echo "'" } >> /tmp/ifcfg/ifcfg-$netif else echo "$ethname'" >> /tmp/ifcfg/ifcfg-$netif fi fi done # Pass network opts mkdir -m 0755 -p /run/initramfs/state/etc/sysconfig/network mkdir -m 0755 -p /run/initramfs/state/var/run/wicked echo "files /etc/sysconfig/network" >> /run/initramfs/rwtab echo "files /var/run/wicked" >> /run/initramfs/rwtab { cp /tmp/net.* /run/initramfs/ cp /tmp/net.$netif.resolv.conf /run/initramfs/state/etc/resolv.conf copytree /tmp/ifcfg /run/initramfs/state/etc/sysconfig/network cp /tmp/leaseinfo.* /run/initramfs/state/var/run/wicked/ } > /dev/null 2>&1 070701000F009C0000A1FF000000000000000000000001556432B600000013000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/45ifcfg/write-ifcfg.shwrite-ifcfg-suse.sh070701000F0158000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98ecryptfs070701000F0159000081A40000000000000000000000015329C2C800000927000000FD0000000000000000000000000000004D00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98ecryptfs/README# Directions for creating the encrypted key that will be used to mount an # eCryptfs filesystem # Create the eCryptfs key (encrypted key type) # # The encrypted key type supports two formats: the 'default' format allows # to generate a random symmetric key of the length specified, the 'ecryptfs' # format generates an authentication token for the eCryptfs filesystem, # which contains a randomly generated key. Two requirements for the latter # format is that the key description must contain exactly 16 hexadecimal # characters and that the encrypted key length must be equal to 64. $ keyctl add encrypted 1000100010001000 "new ecryptfs trusted:kmk-trusted 64" @u 782117972 # Save the encrypted key $ su -c 'keyctl pipe `keyctl search @u encrypted 1000100010001000` > /etc/keys/ecryptfs-trusted.blob' # The eCryptfs key path name can be set in one of the following ways (specified in # the order in which the variable is overwritten): 1) use the default value: -------------------------------------------------------------------------- ECRYPTFSKEY="/etc/keys/ecryptfs-trusted.blob" -------------------------------------------------------------------------- 2) create the configuration file '/etc/sysconfig/ecryptfs' and set the ECRYPTFSKEY variable; 3) specify the eCryptfs key path name in the 'ecryptfskey=' parameter of the kernel command line. # The configuration file '/etc/sysconfig/ecryptfs' is also used to specify # more options for mounting the eCryptfs filesystem: ECRYPTFSSRCDIR: existent directory in the lower root filesystem; ECRYPTFSDSTDIR: mount point directory for the eCryptfs filesystem (the directory must be created in the root filesystem before rebooting the platform); ECRYPTFS_EXTRA_MOUNT_OPTS: extra mount options for the eCryptfs filesystem (the 'ecryptfs_sig' option is automatically added by the dracut script). # Example of the configuration file: ----------- '/etc/sysconfig/ecryptfs' (with default values) ----------- ECRYPTFS_KEY="/etc/keys/ecryptfs-trusted.blob" ECRYPTFSSRCDIR="/secret" ECRYPTFSDSTDIR="${ECRYPTFSSRCDIR}" ECRYPTFS_EXTRA_MOUNT_OPTS="" ----------------------------------------------------------------------- # If the variable ECRYPTFSDSTDIR is not specified in the configuration file, # its value will be equal to that of ECRYPTFSSRCDIR. 070701000F015B000081ED0000000000000000000000015329C2C800000182000000FD0000000000000000000000000000005600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98ecryptfs/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { return 255 } # called by dracut depends() { echo masterkey return 0 } # called by dracut installkernel() { instmods ecryptfs } # called by dracut install() { inst_hook pre-pivot 63 "$moddir/ecryptfs-mount.sh" } 070701000F015A000081ED0000000000000000000000015329C2C800000B24000000FD0000000000000000000000000000005800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/98ecryptfs/ecryptfs-mount.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # Licensed under the GPLv2 # # Copyright (C) 2011 Politecnico di Torino, Italy # TORSEC group -- http://security.polito.it # Roberto Sassu ECRYPTFSCONFIG="${NEWROOT}/etc/sysconfig/ecryptfs" ECRYPTFSKEYTYPE="encrypted" ECRYPTFSKEYDESC="1000100010001000" ECRYPTFSKEYID="" ECRYPTFSSRCDIR="/secret" ECRYPTFS_EXTRA_MOUNT_OPTS="" load_ecryptfs_key() { # override the eCryptfs key path name from the 'ecryptfskey=' parameter in the kernel # command line ECRYPTFSKEYARG=$(getarg ecryptfskey=) [ $? -eq 0 ] && \ ECRYPTFSKEY=${ECRYPTFSKEYARG} # set the default value [ -z "${ECRYPTFSKEY}" ] && \ ECRYPTFSKEY="/etc/keys/ecryptfs-trusted.blob"; # set the eCryptfs key path name ECRYPTFSKEYPATH="${NEWROOT}${ECRYPTFSKEY}" # check for eCryptfs encrypted key's existence if [ ! -f "${ECRYPTFSKEYPATH}" ]; then if [ "${RD_DEBUG}" = "yes" ]; then info "eCryptfs: key file not found: ${ECRYPTFSKEYPATH}" fi return 1 fi # read the eCryptfs encrypted key blob KEYBLOB=$(cat ${ECRYPTFSKEYPATH}) # load the eCryptfs encrypted key blob ECRYPTFSKEYID=$(keyctl add ${ECRYPTFSKEYTYPE} ${ECRYPTFSKEYDESC} "load ${KEYBLOB}" @u) [ $? -eq 0 ] || { info "eCryptfs: failed to load the eCryptfs key: ${ECRYPTFSKEYDESC}"; return 1; } return 0 } unload_ecryptfs_key() { # unlink the eCryptfs encrypted key keyctl unlink ${ECRYPTFSKEYID} @u || { info "eCryptfs: failed to unlink the eCryptfs key: ${ECRYPTFSKEYDESC}"; return 1; } return 0 } mount_ecryptfs() { # read the configuration from the config file [ -f "${ECRYPTFSCONFIG}" ] && \ . ${ECRYPTFSCONFIG} # load the eCryptfs encrypted key load_ecryptfs_key || return 1 # set the default value for ECRYPTFSDSTDIR [ -z "${ECRYPTFSDSTDIR}" ] && \ ECRYPTFSDSTDIR=${ECRYPTFSSRCDIR} # set the eCryptfs filesystem mount point ECRYPTFSSRCMNT="${NEWROOT}${ECRYPTFSSRCDIR}" ECRYPTFSDSTMNT="${NEWROOT}${ECRYPTFSDSTDIR}" # build the mount options variable ECRYPTFS_MOUNT_OPTS="ecryptfs_sig=${ECRYPTFSKEYDESC}" [ ! -z "${ECRYPTFS_EXTRA_MOUNT_OPTS}" ] && \ ECRYPTFS_MOUNT_OPTS="${ECRYPTFS_MOUNT_OPTS},${ECRYPTFS_EXTRA_MOUNT_OPTS}" # mount the eCryptfs filesystem info "Mounting the configured eCryptfs filesystem" mount -i -t ecryptfs -o${ECRYPTFS_MOUNT_OPTS} ${ECRYPTFSSRCMNT} ${ECRYPTFSDSTMNT} >/dev/null || { info "eCryptfs: mount of the eCryptfs filesystem failed"; return 1; } # unload the eCryptfs encrypted key unload_ecryptfs_key || return 1 return 0 } mount_ecryptfs 070701000F01EF000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/01fips070701000F01F3000081ED000000000000000000000001555B5D02000007B5000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/01fips/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { return 255 } # called by dracut depends() { return 0 } # called by dracut installkernel() { local _fipsmodules _mod _fipsmodules="aead aes_generic aes-x86_64 ansi_cprng arc4 blowfish camellia cast6 cbc ccm " _fipsmodules+="chainiv crc32c crct10dif_generic cryptomgr crypto_null ctr cts deflate des des3_ede dm-crypt dm-mod " _fipsmodules+="ecb eseqiv fcrypt gcm ghash_generic hmac khazad lzo md4 md5 michael_mic rmd128 cmac " _fipsmodules+="rmd160 rmd256 rmd320 salsa20 seed seqiv serpent sha1 sha224 sha256 sha256_generic " _fipsmodules+="sha384 sha512 sha512_generic tcrypt tea tnepres twofish wp256 wp384 wp512 xeta xtea xts zlib " _fipsmodules+="sha512-ssse3 sha1-ssse3 sha256-ssse3 " _fipsmodules+="ghash-clmulni-intel aesni-intel " _fipsmodules+="drbg" mkdir -m 0755 -p "${initdir}/etc/modprobe.d" for _mod in $_fipsmodules; do if hostonly='' instmods -c -s $_mod; then echo $_mod >> "${initdir}/etc/fipsmodules" echo "blacklist $_mod" >> "${initdir}/etc/modprobe.d/fips.conf" fi done } # called by dracut install() { local _dir inst_hook pre-trigger 01 "$moddir/fips-boot.sh" inst_hook pre-pivot 01 "$moddir/fips-noboot.sh" inst_script "$moddir/fips.sh" /sbin/fips.sh inst_multiple rmmod insmod mount uname umount fipscheck strace inst_libdir_file \ fipscheck .fipscheck.hmac \ libfipscheck.so.1 \ .libfipscheck.so.1.hmac .libfipscheck.so.1.1.0.hmac \ libcrypto.so.1.0.0 libssl.so.1.0.0 \ .libcrypto.so.1.0.0.hmac .libssl.so.1.0.0.hmac \ .libcryptsetup.so.4.5.0.hmac .libcryptsetup.so.4.hmac \ .libgcrypt.so.20.hmac \ # we do not use prelink at SUSE #inst_multiple -o prelink inst_simple /etc/system-fips } 070701000F01F0000081ED0000000000000000000000015329C2C800000177000000FD0000000000000000000000000000004F00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/01fips/fips-boot.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh if ! fipsmode=$(getarg fips) || [ $fipsmode = "0" ]; then rm -f -- /etc/modprobe.d/fips.conf >/dev/null 2>&1 elif getarg boot= >/dev/null; then . /sbin/fips.sh if mount_boot; then do_fips || die "FIPS integrity test failed" fi fi 070701000F01F2000081ED000000000000000000000001555B5D0200000F98000000FD0000000000000000000000000000004A00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/01fips/fips.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh mount_boot() { boot=$(getarg boot=) if [ -n "$boot" ]; then case "$boot" in LABEL=*) boot="$(echo $boot | sed 's,/,\\x2f,g')" boot="/dev/disk/by-label/${boot#LABEL=}" ;; UUID=*) boot="/dev/disk/by-uuid/${boot#UUID=}" ;; PARTUUID=*) boot="/dev/disk/by-partuuid/${boot#PARTUUID=}" ;; PARTLABEL=*) boot="/dev/disk/by-partlabel/${boot#PARTLABEL=}" ;; /dev/*) ;; *) die "You have to specify boot= as a boot option for fips=1" ;; esac if ! [ -e "$boot" ]; then udevadm trigger --action=add >/dev/null 2>&1 [ -z "$UDEVVERSION" ] && UDEVVERSION=$(udevadm --version) i=0 while ! [ -e $boot ]; do if [ $UDEVVERSION -ge 143 ]; then udevadm settle --exit-if-exists=$boot else udevadm settle --timeout=30 fi [ -e $boot ] && break sleep 0.5 i=$(($i+1)) [ $i -gt 40 ] && break done fi [ -e "$boot" ] || return 1 mkdir /boot info "Mounting $boot as /boot" mount -oro "$boot" /boot || return 1 elif [ -d "$NEWROOT/boot" ]; then rm -fr -- /boot ln -sf "$NEWROOT/boot" /boot fi } do_rhevh_check() { KERNEL=$(uname -r) kpath=${1} # If we're on RHEV-H, the kernel is in /run/initramfs/live/vmlinuz0 if fipscheck $NEWROOT/boot/vmlinuz-${KERNEL} ; then warn "HMAC sum mismatch" return 1 fi info "rhevh_check OK" return 0 } do_fips() { local _v local _s local _v local _module KERNEL=$(uname -r) if ! [ -e "/boot/.vmlinuz-${KERNEL}.hmac" ]; then warn "/boot/.vmlinuz-${KERNEL}.hmac does not exist" return 1 fi FIPSMODULES=$(cat /etc/fipsmodules) info "Loading and integrity checking all crypto modules" mv /etc/modprobe.d/fips.conf /etc/modprobe.d/fips.conf.bak for _module in $FIPSMODULES; do if [ "$_module" != "tcrypt" ]; then if ! modprobe "${_module}"; then # check if kernel provides generic algo _found=0 while read _k _s _v; do [ "$_k" != "name" -a "$_k" != "driver" ] && continue [ "$_v" != "$_module" ] && continue _found=1 break done /tmp/fipsdone umount /boot >/dev/null 2>&1 return 0 } 070701000F01F1000081ED0000000000000000000000015329C2C800000162000000FD0000000000000000000000000000005100000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/01fips/fips-noboot.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh if ! fipsmode=$(getarg fips) || [ $fipsmode = "0" ]; then rm -f -- /etc/modprobe.d/fips.conf >/dev/null 2>&1 elif ! [ -f /tmp/fipsdone ]; then . /sbin/fips.sh mount_boot do_fips || die "FIPS integrity test failed" fi 070701000F014F000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95zfcp_rules070701000F0150000081ED000000000000000000000001555B5D0200000695000000FD0000000000000000000000000000005800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95zfcp_rules/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut cmdline() { is_zfcp() { local _dev=$1 local _devpath=$(cd -P /sys/dev/block/$_dev ; echo $PWD) local _sdev _lun _wwpn _ccw [ "${_devpath#*/sd}" == "$_devpath" ] && return 1 _sdev="${_devpath%%/block/*}" [ -e ${_sdev}/fcp_lun ] || return 1 _lun=$(cat ${_sdev}/fcp_lun) _wwpn=$(cat ${_sdev}/wwpn) _ccw=$(cat ${_sdev}/hba_id) echo "rd.zfcp=${_ccw},${_wwpn},${_lun}" return 0 } [[ $hostonly ]] || [[ $mount_needs ]] && { for_each_host_dev_and_slaves_all is_zfcp } | sort | uniq } # called by dracut check() { local _arch=$(uname -m) local _ccw [ "$_arch" = "s390" -o "$_arch" = "s390x" ] || return 1 require_binaries /usr/lib/udev/collect || return 1 [[ $hostonly ]] || [[ $mount_needs ]] && { found=0 for _ccw in /sys/bus/ccw/devices/*/host* ; do [ -d "$_ccw" ] || continue found=$(($found+1)); done [ $found -eq 0 ] && return 255 } return 0 } # called by dracut depends() { return 0 } # called by dracut install() { inst_multiple /usr/lib/udev/collect inst_hook cmdline 30 "$moddir/parse-zfcp.sh" if [[ $hostonly_cmdline == "yes" ]] ; then local _zfcp for _zfcp in $(cmdline) ; do printf "%s\n" "$_zfcp" >> "${initdir}/etc/cmdline.d/94zfcp.conf" done fi if [[ $hostonly ]] ; then inst_rules_wildcard 51-zfcp-*.rules inst_rules_wildcard 41-s390x-zfcp-*.rules fi } 070701000F0151000081ED000000000000000000000001555B5D020000091A000000FD0000000000000000000000000000005600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95zfcp_rules/parse-zfcp.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh create_udev_rule() { local ccw=$1 local wwpn=$2 local lun=$3 local _rule=/etc/udev/rules.d/51-zfcp-${ccw}.rules local _cu_type _dev_type if [ -x /sbin/cio_ignore ] && cio_ignore -i $ccw > /dev/null ; then cio_ignore -r $ccw fi if [ -e /sys/bus/ccw/devices/${ccw} ] ; then read _cu_type < /sys/bus/ccw/devices/${ccw}/cutype read _dev_type < /sys/bus/ccw/devices/${ccw}/devtype fi if [ "$_cu_type" != "1731/03" ] ; then return 0; fi if [ "$_dev_type" != "1732/03" ] && [ "$_dev_type" != "1732/04" ] ; then return 0; fi [ -e ${_rule} ] && return 0 if [ ! -f "$_rule" ] ; then cat > $_rule <> $_rule </dev/null 2>&1 || . /lib/dracut-lib.sh type parse_iscsi_root >/dev/null 2>&1 || . /lib/net-lib.sh type write_fs_tab >/dev/null 2>&1 || . /lib/fs-lib.sh PATH=/usr/sbin:/usr/bin:/sbin:/bin # Huh? Empty $1? [ -z "$1" ] && exit 1 # Huh? Empty $2? [ -z "$2" ] && exit 1 # Huh? Empty $3? This isn't really necessary, since NEWROOT isn't # used here. But let's be consistent [ -z "$3" ] && exit 1 # root is in the form root=iscsi:[]:[]:[]:[]: netif="$1" iroot="$2" # If it's not iscsi we don't continue [ "${iroot%%:*}" = "iscsi" ] || exit 1 iroot=${iroot#iscsi} iroot=${iroot#:} # XXX modprobe crc32c should go in the cmdline parser, but I haven't yet # figured out a way how to check whether this is built-in or not modprobe crc32c 2>/dev/null if [ -e /sys/module/bnx2i ] && ! [ -e /tmp/iscsiuio-started ]; then iscsiuio > /tmp/iscsiuio-started fi handle_firmware() { if ! [ -e /tmp/iscsistarted-firmware ]; then if ! iscsistart -f; then warn "iscistart: Could not get list of targets from firmware." return 1 fi for p in $(getargs rd.iscsi.param -d iscsi_param); do iscsi_param="$iscsi_param --param $p" done if ! iscsistart -b $iscsi_param; then warn "'iscsistart -b $iscsi_param' failed" fi if [ -d /sys/class/iscsi_session ]; then echo 'started' > "/tmp/iscsistarted-iscsi:" echo 'started' > "/tmp/iscsistarted-firmware" else return 1 fi need_shutdown fi return 0 } handle_netroot() { local iscsi_initiator iscsi_target_name iscsi_target_ip iscsi_target_port local iscsi_target_group iscsi_protocol iscsirw iscsi_lun local iscsi_username iscsi_password local iscsi_in_username iscsi_in_password local iscsi_iface_name iscsi_netdev_name local iscsi_param local p # override conf settings by command line options arg=$(getarg rd.iscsi.initiator -d iscsi_initiator=) [ -n "$arg" ] && iscsi_initiator=$arg arg=$(getarg rd.iscsi.target.name -d iscsi_target_name=) [ -n "$arg" ] && iscsi_target_name=$arg arg=$(getarg rd.iscsi.target.ip -d iscsi_target_ip) [ -n "$arg" ] && iscsi_target_ip=$arg arg=$(getarg rd.iscsi.target.port -d iscsi_target_port=) [ -n "$arg" ] && iscsi_target_port=$arg arg=$(getarg rd.iscsi.target.group -d iscsi_target_group=) [ -n "$arg" ] && iscsi_target_group=$arg arg=$(getarg rd.iscsi.username -d iscsi_username=) [ -n "$arg" ] && iscsi_username=$arg arg=$(getarg rd.iscsi.password -d iscsi_password) [ -n "$arg" ] && iscsi_password=$arg arg=$(getarg rd.iscsi.in.username -d iscsi_in_username=) [ -n "$arg" ] && iscsi_in_username=$arg arg=$(getarg rd.iscsi.in.password -d iscsi_in_password=) [ -n "$arg" ] && iscsi_in_password=$arg for p in $(getargs rd.iscsi.param -d iscsi_param); do iscsi_param="$iscsi_param --param $p" done parse_iscsi_root "$1" || return 1 # XXX is this needed? getarg ro && iscsirw=ro getarg rw && iscsirw=rw fsopts=${fsopts:+$fsopts,}${iscsirw} if [ -z $iscsi_initiator ]; then # XXX Where are these from? [ -f /etc/initiatorname.iscsi ] && . /etc/initiatorname.iscsi [ -f /etc/iscsi/initiatorname.iscsi ] && . /etc/iscsi/initiatorname.iscsi iscsi_initiator=$InitiatorName # XXX rfc3720 says 'SCSI Initiator Name: The iSCSI Initiator Name specifies # the worldwide unique name of the initiator.' Could we use hostname/ip # if missing? fi if [ -z $iscsi_initiator ]; then if [ -f /sys/firmware/ibft/initiator/initiator-name ]; then iscsi_initiator=$(while read line; do echo $line;done < /sys/firmware/ibft/initiator/initiator-name) fi fi if [ -z $iscsi_target_port ]; then iscsi_target_port=3260 fi if [ -z $iscsi_target_group ]; then iscsi_target_group=1 fi if [ -z $iscsi_initiator ]; then # XXX is this correct? iscsi_initiator=$(iscsi-iname) fi if [ -z $iscsi_lun ]; then iscsi_lun=0 fi echo "InitiatorName='$iscsi_initiator'" > /run/initiatorname.iscsi ln -fs /run/initiatorname.iscsi /dev/.initiatorname.iscsi # FIXME $iscsi_protocol?? if [ "$root" = "dhcp" ]; then # if root is not specified try to mount the whole iSCSI LUN printf 'SYMLINK=="disk/by-path/*-iscsi-*-%s", SYMLINK+="root"\n' $iscsi_lun >> /etc/udev/rules.d/99-iscsi-root.rules udevadm control --reload write_fs_tab /dev/root wait_for_dev -n /dev/root # install mount script [ -z "$DRACUT_SYSTEMD" ] && \ echo "iscsi_lun=$iscsi_lun . /bin/mount-lun.sh " > $hookdir/mount/01-$$-iscsi.sh fi # force udevsettle to break > $hookdir/initqueue/work iscsistart -i $iscsi_initiator -t $iscsi_target_name \ -g $iscsi_target_group -a $iscsi_target_ip \ -p $iscsi_target_port \ ${iscsi_username:+-u $iscsi_username} \ ${iscsi_password:+-w $iscsi_password} \ ${iscsi_in_username:+-U $iscsi_in_username} \ ${iscsi_in_password:+-W $iscsi_in_password} \ ${iscsi_iface_name:+--param iface.iscsi_ifacename=$iscsi_iface_name} \ ${iscsi_netdev_name:+--param iface.net_ifacename=$iscsi_netdev_name} \ ${iscsi_param} \ || : netroot_enc=$(str_replace "$1" '/' '\2f') echo 'started' > "/tmp/iscsistarted-iscsi:${netroot_enc}" } ret=0 # loop over all netroot parameter if getarg netroot; then for nroot in $(getargs netroot); do [ "${nroot%%:*}" = "iscsi" ] || continue nroot="${nroot##iscsi:}" if [ -n "$nroot" ]; then handle_netroot "$nroot" ret=$(($ret + $?)) fi done if getargbool 0 rd.iscsi.firmware -d -y iscsi_firmware ; then handle_firmware ret=$(($ret + $?)) fi else if [ -n "$iroot" ]; then handle_netroot "$iroot" ret=$? else if getargbool 0 rd.iscsi.firmware -d -y iscsi_firmware ; then handle_firmware ret=$? fi fi fi need_shutdown # now we have a root filesystem somewhere in /dev/sda* # let the normal block handler handle root= exit $ret 070701000F0128000081ED0000000000000000000000015329C2C8000001BA000000FD0000000000000000000000000000005000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95iscsi/mount-lun.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh if [ -z $iscsi_lun ]; then iscsi_lun=0 fi NEWROOT=${NEWROOT:-"/sysroot"} for disk in /dev/disk/by-path/*-iscsi-*-$iscsi_lun; do if mount -t ${fstype:-auto} -o "$rflags" $disk $NEWROOT; then if [ ! -d $NEWROOT/proc ]; then umount $disk continue fi break fi done 070701000F0125000081ED0000000000000000000000015329C2C8000000A8000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95iscsi/cleanup-iscsi.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh [ -e /sys/module/bnx2i ] && killproc iscsiuio 070701000F0127000081ED000000000000000000000001555B5D0200001BC6000000FD0000000000000000000000000000005300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95iscsi/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh get_ibft_mod() { local ibft_mac=$1 local iface_mac iface_mod # Return the iSCSI offload module for a given MAC address for iface_desc in $(iscsiadm -m iface | cut -f 2 -d ' '); do iface_mod=${iface_desc%%,*} iface_mac=${iface_desc#*,} iface_mac=${iface_mac%%,*} if [ "$ibft_mac" = "$iface_mac" ] ; then echo $iface_mod return 0 fi done } install_ibft() { # When iBFT / iscsi_boot is detected: # - Use 'ip=ibft' to set up iBFT network interface # Note: bnx2i is using a different MAC address of iSCSI offloading # so the 'ip=ibft' parameter must not be set # - specify firmware booting cmdline parameter for d in /sys/firmware/* ; do if [ -d ${d}/ethernet0 ] ; then read ibft_mac < ${d}/ethernet0/mac ibft_mod=$(get_ibft_mod $ibft_mac) fi if [ -z "$ibft_mod" ] && [ -d ${d}/ethernet1 ] ; then read ibft_mac < ${d}/ethernet1/mac ibft_mod=$(get_ibft_mod $ibft_mac) fi if [ -d ${d}/initiator ] ; then if [ ${d##*/} = "ibft" ] && [ "$ibft_mod" != "bnx2i" ] ; then echo -n "ip=ibft " fi echo -n "rd.iscsi.firmware=1" fi done } install_iscsiroot() { local devpath=$1 local scsi_path iscsi_lun session c d conn local iscsi_session iscsi_address iscsi_port iscsi_targetname iscsi_tpgt scsi_path=${devpath%%/block*} [ "$scsi_path" = "$devpath" ] && return 1 iscsi_lun=${scsi_path##*:} [ "$iscsi_lun" = "$scsi_path" ] && return 1 session=${devpath%%/target*} [ "$session" = "$devpath" ] && return 1 iscsi_session=${session##*/} [ "$iscsi_session" = "$session" ] && return 1 for d in ${session}/* ; do case $d in *connection*) c=${d##*/} conn=${d}/iscsi_connection/${c} if [ -d ${conn} ] ; then iscsi_address=$(cat ${conn}/persistent_address) iscsi_port=$(cat ${conn}/persistent_port) fi ;; *session) if [ -d ${d}/${iscsi_session} ] ; then iscsi_initiator=$(cat ${d}/${iscsi_session}/initiatorname) iscsi_targetname=$(cat ${d}/${iscsi_session}/targetname) fi ;; esac done [ -z "$iscsi_address" ] && return local_address=$(ip -o route get to $iscsi_address | sed -n 's/.*src \([0-9a-f.:]*\).*/\1/p') ifname=$(ip -o route get to $iscsi_address | sed -n 's/.*dev \([^ ]*\).*/\1/p') printf 'ip=%s:static ' ${ifname} if [ -e /sys/class/net/$ifname/address ] ; then ifmac=$(cat /sys/class/net/$ifname/address) printf 'ifname=%s:%s ' ${ifname} ${ifmac} fi if [ -n "$iscsi_address" -a -n "$iscsi_targetname" ] ; then if [ -n "$iscsi_port" -a "$iscsi_port" -eq 3260 ] ; then iscsi_port= fi if [ -n "$iscsi_lun" -a "$iscsi_lun" -eq 0 ] ; then iscsi_lun= fi # In IPv6 case rd.iscsi.initatior= must pass address in [] brackets case "$iscsi_address" in *:*) iscsi_address="[$iscsi_address]" ;; esac # Must be two separate lines, so that "sort | uniq" commands later # can sort out rd.iscsi.initiator= duplicates echo "rd.iscsi.initiator=${iscsi_initiator}" echo "netroot=iscsi:${iscsi_address}::${iscsi_port}:${iscsi_lun}:${iscsi_targetname}" fi return 0 } install_softiscsi() { [ -d /sys/firmware/ibft ] && return 0 is_softiscsi() { local _dev=$1 local iscsi_dev [[ -L "/sys/dev/block/$_dev" ]] || return iscsi_dev=$(cd -P /sys/dev/block/$_dev; echo $PWD) install_iscsiroot $iscsi_dev } for_each_host_dev_and_slaves_all is_softiscsi || return 255 return 0 } # called by dracut check() { local _rootdev # If our prerequisites are not met, fail anyways. require_binaries iscsistart hostname iscsi-iname || return 1 # If hostonly was requested, fail the check if we are not actually # booting from root. is_iscsi() { local _dev=$1 [[ -L "/sys/dev/block/$_dev" ]] || return cd "$(readlink -f "/sys/dev/block/$_dev")" until [[ -d sys || -d iscsi_session ]]; do cd .. done [[ -d iscsi_session ]] } [[ $hostonly ]] || [[ $mount_needs ]] && { pushd . >/dev/null for_each_host_dev_and_slaves is_iscsi || return 255 popd >/dev/null } return 0 } # called by dracut depends() { echo network rootfs-block } # called by dracut installkernel() { local _arch=$(uname -m) instmods bnx2i qla4xxx cxgb3i cxgb4i be2iscsi hostonly="" instmods iscsi_tcp iscsi_ibft crc32c iscsi_boot_sysfs iscsi_module_filter() { local _funcs='iscsi_register_transport' # subfunctions inherit following FDs local _merge=8 _side2=9 function bmf1() { local _f while read _f; do case "$_f" in *.ko) [[ $(< $_f) =~ $_funcs ]] && echo "$_f" ;; *.ko.gz) [[ $(gzip -dc <$_f) =~ $_funcs ]] && echo "$_f" ;; *.ko.xz) [[ $(xz -dc <$_f) =~ $_funcs ]] && echo "$_f" ;; esac done return 0 } function rotor() { local _f1 _f2 while read _f1; do echo "$_f1" if read _f2; then echo "$_f2" 1>&${_side2} fi done | bmf1 1>&${_merge} return 0 } # Use two parallel streams to filter alternating modules. set +x eval "( ( rotor ) ${_side2}>&1 | bmf1 ) ${_merge}>&1" [[ $debug ]] && set -x return 0 } { find_kernel_modules_by_path drivers/scsi; if [ "$_arch" = "s390" -o "$_arch" = "s390x" ]; then find_kernel_modules_by_path drivers/s390/scsi; fi;} \ | iscsi_module_filter | instmods } # called by dracut cmdline() { local _iscsiconf=$(install_ibft) { if [ "$_iscsiconf" ] ; then echo ${_iscsiconf} else install_softiscsi fi } | sort | uniq } # called by dracut install() { inst_multiple umount iscsistart hostname iscsi-iname inst_multiple -o iscsiuio inst_libdir_file 'libgcc_s.so*' # Detect iBFT and perform mandatory steps if [[ $hostonly_cmdline == "yes" ]] ; then local _iscsiconf=$(cmdline) [[ $_iscsiconf ]] && printf "%s\n" "$_iscsiconf" >> "${initdir}/etc/cmdline.d/95iscsi.conf" fi inst_hook cmdline 90 "$moddir/parse-iscsiroot.sh" inst_hook cleanup 90 "$moddir/cleanup-iscsi.sh" inst "$moddir/iscsiroot.sh" "/sbin/iscsiroot" if ! dracut_module_included "systemd"; then inst "$moddir/mount-lun.sh" "/bin/mount-lun.sh" fi dracut_need_initqueue } 070701000F0129000081ED000000000000000000000001555B5D0200000E2C000000FD0000000000000000000000000000005600000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95iscsi/parse-iscsiroot.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # # Preferred format: # root=iscsi:[]:[]:[]:[]: # [root=*] netroot=iscsi:[]:[]:[]:[]: # # Legacy formats: # [net]root=[iscsi] iscsiroot=[]:[]:[]:[]: # [net]root=[iscsi] iscsi_firmware # # root= takes precedence over netroot= if root=iscsi[...] # # This script is sourced, so root should be set. But let's be paranoid [ -z "$root" ] && root=$(getarg root=) if [ -z "$netroot" ]; then for netroot in $(getargs netroot=); do [ "${netroot%%:*}" = "iscsi" ] && break done [ "${netroot%%:*}" = "iscsi" ] || unset netroot fi [ -z "$iscsiroot" ] && iscsiroot=$(getarg iscsiroot=) [ -z "$iscsi_firmware" ] && getargbool 0 rd.iscsi.firmware -y iscsi_firmware && iscsi_firmware="1" [ -n "$iscsiroot" ] && [ -n "$iscsi_firmware" ] && die "Mixing iscsiroot and iscsi_firmware is dangerous" type write_fs_tab >/dev/null 2>&1 || . /lib/fs-lib.sh # Root takes precedence over netroot if [ "${root%%:*}" = "iscsi" ] ; then if [ -n "$netroot" ] ; then echo "Warning: root takes precedence over netroot. Ignoring netroot" fi netroot=$root # if root is not specified try to mount the whole iSCSI LUN printf 'ENV{DEVTYPE}!="partition", SYMLINK=="disk/by-path/*-iscsi-*-*", SYMLINK+="root"\n' >> /etc/udev/rules.d/99-iscsi-root.rules root=/dev/root write_fs_tab /dev/root fi # If it's not empty or iscsi we don't continue [ -z "$netroot" ] || [ "${netroot%%:*}" = "iscsi" ] || return if [ -n "$iscsiroot" ] ; then [ -z "$netroot" ] && netroot=$root # @deprecated echo "Warning: Argument iscsiroot is deprecated and might be removed in a future" echo "release. See 'man dracut.kernel' for more information." # Accept iscsiroot argument? [ -z "$netroot" ] || [ "$netroot" = "iscsi" ] || \ die "Argument iscsiroot only accepted for empty root= or [net]root=iscsi" # Override root with iscsiroot content? [ -z "$netroot" ] || [ "$netroot" = "iscsi" ] && netroot=iscsi:$iscsiroot fi # iscsi_firmware does not need argument checking if [ -n "$iscsi_firmware" ] ; then [ -z "$netroot" ] && netroot=iscsi: modprobe -q iscsi_boot_sysfs 2>/dev/null modprobe -q iscsi_ibft initqueue --onetime --timeout /sbin/iscsiroot dummy "$netroot" "$NEWROOT" fi # If it's not iscsi we don't continue [ "${netroot%%:*}" = "iscsi" ] || return modprobe -q qla4xxx modprobe -q cxgb3i modprobe -q cxgb4i modprobe -q bnx2i modprobe -q be2iscsi if [ -z "$iscsi_firmware" ] ; then type parse_iscsi_root >/dev/null 2>&1 || . /lib/net-lib.sh parse_iscsi_root "$netroot" || return fi # ISCSI actually supported? if ! [ -e /sys/module/iscsi_tcp ]; then modprobe -q iscsi_tcp || die "iscsiroot requested but kernel/initrd does not support iscsi" fi if [ -n "$netroot" ] && [ "$root" != "/dev/root" ] && [ "$root" != "dhcp" ]; then if ! getargbool 1 rd.neednet >/dev/null || ! getarg "ip="; then initqueue --onetime --settled /sbin/iscsiroot dummy "$netroot" "$NEWROOT" fi fi if [ -n "$iscsi_firmware" ] ; then echo "[ -f '/tmp/iscsistarted-firmware' ]" > $hookdir/initqueue/finished/iscsi_started.sh else netroot_enc=$(str_replace "$netroot" '/' '\2f') echo "[ -f '/tmp/iscsistarted-$netroot_enc' ]" > $hookdir/initqueue/finished/iscsi_started.sh fi # Done, all good! rootok=1 # Shut up init error check [ -z "$root" ] && root="iscsi" 070701000F00A8000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004100000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/80cms070701000F00AC000081ED0000000000000000000000015329C2C8000003D5000000FD0000000000000000000000000000005100000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/80cms/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { arch=$(uname -m) [ "$arch" = "s390" -o "$arch" = "s390x" ] || return 1 return 255 } # called by dracut depends() { arch=$(uname -m) [ "$arch" = "s390" -o "$arch" = "s390x" ] || return 1 echo znet zfcp dasd dasd_mod return 0 } # called by dracut installkernel() { instmods zfcp } # called by dracut install() { inst_hook pre-trigger 30 "$moddir/cmssetup.sh" inst_hook pre-pivot 95 "$moddir/cms-write-ifcfg.sh" inst_script "$moddir/cmsifup.sh" /sbin/cmsifup inst_multiple /etc/cmsfs-fuse/filetypes.conf /etc/udev/rules.d/99-fuse.rules /etc/fuse.conf \ cmsfs-fuse fusermount ulockmgr_server bash insmod rmmod cat normalize_dasd_arg sed \ $(rpm -ql s390utils-base) inst_libdir_file "gconv/*" #inst /usr/lib/locale/locale-archive dracut_need_initqueue } 070701000F00AA000081ED000000000000000000000001555B5D020000037E000000FD0000000000000000000000000000004C00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/80cms/cmsifup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh DEVICE=$1 . /tmp/cms.conf strglobin "$IPADDR" '*:*:*' && ipv6=1 if [ "$ipv6" ] && ! str_starts "$IPADDR" "["; then IPADDR="[$IPADDR]" fi if [ "$ipv6" ] && ! str_starts "$GATEWAY" "["; then GATEWAY="[$GATEWAY]" fi if [ "$ipv6" ]; then DNS1=$(set -- ${DNS/,/ }; echo $1) DNS2=$(set -- ${DNS/,/ }; echo $2) else DNS1=$(set -- ${DNS/:/ }; echo $1) DNS2=$(set -- ${DNS/:/ }; echo $2) fi { echo "ip=$IPADDR::$GATEWAY:$NETMASK:$HOSTNAME:$DEVICE:none:$MTU:$MACADDR" for i in $DNS1 $DNS2; do echo "nameserver=$i" done } > /etc/cmdline.d/80-cms.conf [ -e "/tmp/net.ifaces" ] && read IFACES < /tmp/net.ifaces IFACES="$IFACES $DEVICE" echo "$IFACES" >> /tmp/net.ifaces ifup $DEVICE -m 070701000F00AB000081ED000000000000000000000001555B5D02000018AD000000FD0000000000000000000000000000004D00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/80cms/cmssetup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh function sysecho () { file="$1" shift local i=1 while [ $i -le 10 ] ; do if [ ! -f "$file" ]; then sleep 1 i=$((i+1)) else break fi done local status read status < "$file" if [[ ! $status == $* ]]; then [ -f "$file" ] && echo $* > "$file" fi } function dasd_settle() { local dasd_status=/sys/bus/ccw/devices/$1/status if [ ! -f $dasd_status ]; then return 1 fi local i=1 while [ $i -le 60 ] ; do local status read status < $dasd_status case $status in online|unformatted) return 0 ;; *) sleep 0.1 i=$((i+1)) ;; esac done return 1 } function dasd_settle_all() { for dasdccw in $(while read line; do echo ${line%%(*}; done < /proc/dasd/devices) ; do if ! dasd_settle $dasdccw ; then echo $"Could not access DASD $dasdccw in time" return 1 fi done return 0 } # prints a canonocalized device bus ID for a given devno of any format function canonicalize_devno() { case ${#1} in 3) echo "0.0.0${1}" ;; 4) echo "0.0.${1}" ;; *) echo "${1}" ;; esac return 0 } # read file from CMS and write it to /tmp function readcmsfile() # $1=dasdport $2=filename { local dev local numcpus local devname local ret=0 if [ $# -ne 2 ]; then return; fi # precondition: udevd created dasda block device node if ! dasd_cio_free -d $1 ; then echo $"DASD $1 could not be cleared from device blacklist" return 1 fi modprobe dasd_mod dasd=$CMSDASD modprobe dasd_eckd_mod udevadm settle # precondition: dasd_eckd_mod driver incl. dependencies loaded, # dasd_mod must be loaded without setting any DASD online dev=$(canonicalize_devno $1) numcpus=$( while read line; do if strstr "$line" "# processors"; then echo ${line##*:}; break; fi; done < /proc/cpuinfo ) if [ ${numcpus} -eq 1 ]; then echo 1 > /sys/bus/ccw/devices/$dev/online else if ! sysecho /sys/bus/ccw/devices/$dev/online 1; then echo $"DASD $dev could not be set online" return 1 fi udevadm settle if ! dasd_settle $dev ; then echo $"Could not access DASD $dev in time" return 1 fi fi udevadm settle devname=$(cd /sys/bus/ccw/devices/$dev/block; set -- *; [ -b /dev/$1 ] && echo $1) devname=${devname:-dasda} [[ -d /mnt ]] || mkdir /mnt if cmsfs-fuse --to=UTF-8 -a /dev/$devname /mnt; then cat /mnt/$2 > /run/initramfs/$2 umount /mnt || umount -l /mnt udevadm settle else echo $"Could not read conf file $2 on CMS DASD $1." ret=1 fi if ! sysecho /sys/bus/ccw/devices/$dev/online 0; then echo $"DASD $dev could not be set offline again" #return 1 fi udevadm settle # unbind all dasds to unload the dasd modules for a clean start ( cd /sys/bus/ccw/drivers/dasd-eckd; for i in *.*; do echo $i > unbind;done) udevadm settle modprobe -r dasd_eckd_mod udevadm settle modprobe -r dasd_diag_mod udevadm settle modprobe -r dasd_mod udevadm settle return $ret } processcmsfile() { source /tmp/cms.conf SUBCHANNELS="$(echo $SUBCHANNELS | sed 'y/ABCDEF/abcdef/')" if [[ $NETTYPE ]]; then ( echo -n $NETTYPE,$SUBCHANNELS [[ $PORTNAME ]] && echo -n ",portname=$PORTNAME" [[ $LAYER2 ]] && echo -n ",layer2=$LAYER2" [[ "$NETTYPE" = "ctc" ]] && [[ $CTCPROT ]] && echo -n ",protocol=$CTCPROT" echo ) >> /etc/ccw.conf OLDIFS=$IFS IFS=, read -a subch_array <<< "indexzero,$SUBCHANNELS" IFS=$OLDIFS devbusid=${subch_array[1]} if [ "$NETTYPE" = "ctc" ]; then driver="ctcm" else driver=$NETTYPE fi printf 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="%s", KERNELS=="%s", ENV{INTERFACE}=="?*", RUN+="/sbin/initqueue --onetime --unique --name cmsifup-$env{INTERFACE} /sbin/cmsifup $env{INTERFACE}"\n' "$driver" "$devbusid" > /etc/udev/rules.d/99-cms.rules # remove the default net rules rm -f -- /etc/udev/rules.d/91-default-net.rules [[ -f /etc/udev/rules.d/90-net.rules ]] \ || printf 'SUBSYSTEM=="net", ACTION=="online", RUN+="/sbin/initqueue --onetime --env netif=$env{INTERFACE} source_hook initqueue/online"\n' >> /etc/udev/rules.d/99-cms.rules udevadm control --reload znet_cio_free fi if [[ $DASD ]]; then echo $DASD | normalize_dasd_arg > /etc/dasd.conf echo "options dasd_mod dasd=$DASD" > /etc/modprobe.d/dasd_mod.conf dasd_cio_free fi unset _do_zfcp for i in ${!FCP_*}; do echo "${!i}" | while read port rest; do case $port in *.*.*) ;; *.*) port="0.$port" ;; *) port="0.0.$port" ;; esac echo $port $rest >> /etc/zfcp.conf done _do_zfcp=1 done [[ $_do_zfcp ]] && zfcp_cio_free unset _do_zfcp } [[ $CMSDASD ]] || CMSDASD=$(getarg "CMSDASD=") [[ $CMSCONFFILE ]] || CMSCONFFILE=$(getarg "CMSCONFFILE=") # Parse configuration if [ -n "$CMSDASD" -a -n "$CMSCONFFILE" ]; then if readcmsfile $CMSDASD $CMSCONFFILE; then ln -s /run/initramfs/$CMSCONFFILE /tmp/$CMSCONFFILE ln -s /run/initramfs/$CMSCONFFILE /tmp/cms.conf processcmsfile fi fi 070701000F00A9000081ED000000000000000000000001555B5D0200000C88000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/80cms/cms-write-ifcfg.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh mkdir -m 0755 -p /run/initramfs/state/etc/sysconfig/network-scripts function cms_write_config() { . /tmp/cms.conf OLDIFS=$IFS IFS=, read -a subch_array <<< "indexzero,$SUBCHANNELS" IFS=$OLDIFS devbusid=${subch_array[1]} if [ "$NETTYPE" = "ctc" ]; then driver="ctcm" else driver=$NETTYPE fi DEVICE=$(cd /sys/devices/${driver}/$devbusid/net/ && set -- * && [ "$1" != "*" ] && echo $1) uuid=$(cat /proc/sys/kernel/random/uuid) IFCFGFILE=/run/initramfs/state/etc/sysconfig/network-scripts/ifcfg-$DEVICE strglobin "$IPADDR" '*:*:*' && ipv6=1 # to please NetworkManager on startup in loader before loader reconfigures net cat > /etc/sysconfig/network << EOF HOSTNAME=$HOSTNAME EOF echo "$HOSTNAME" > /etc/hostname if [ "$ipv6" ]; then echo "NETWORKING_IPV6=yes" >> /etc/sysconfig/network else echo "NETWORKING=yes" >> /etc/sysconfig/network fi cat > $IFCFGFILE << EOF DEVICE=$DEVICE UUID=$uuid ONBOOT=yes BOOTPROTO=static MTU=$MTU SUBCHANNELS=$SUBCHANNELS EOF if [ "$ipv6" ]; then cat >> $IFCFGFILE << EOF IPV6INIT=yes IPV6_AUTOCONF=no IPV6ADDR=$IPADDR/$NETMASK IPV6_DEFAULTGW=$GATEWAY EOF else cat >> $IFCFGFILE << EOF IPADDR=$IPADDR NETMASK=$NETMASK BROADCAST=$BROADCAST GATEWAY=$GATEWAY EOF fi if [ "$ipv6" ]; then DNS1=$(set -- ${DNS/,/ }; echo $1) DNS2=$(set -- ${DNS/,/ }; echo $2) else DNS1=$(set -- ${DNS/:/ }; echo $1) DNS2=$(set -- ${DNS/:/ }; echo $2) fi # real DNS config for NetworkManager to generate /etc/resolv.conf [ "$DNS1" != "" ] && echo "DNS1=$DNS1" >> $IFCFGFILE [ "$DNS2" != "" ] && echo "DNS2=$DNS2" >> $IFCFGFILE # just to please loader's readNetInfo && writeEnabledNetInfo # which eats DNS1,DNS2,... and generates it themselves based on DNS if [ "$ipv6" ]; then [ "$DNS" != "" ] && echo "DNS=\"$DNS\"" >> $IFCFGFILE else [ "$DNS" != "" ] && echo "DNS=\"${DNS/:/,}\"" >> $IFCFGFILE fi # colons in SEARCHDNS already replaced with spaces above for /etc/resolv.conf [ "$SEARCHDNS" != "" ] && echo "DOMAIN=\"$SEARCHDNS\"" >> $IFCFGFILE [ "$NETTYPE" != "" ] && echo "NETTYPE=$NETTYPE" >> $IFCFGFILE [ "$PEERID" != "" ] && echo "PEERID=$PEERID" >> $IFCFGFILE [ "$PORTNAME" != "" ] && echo "PORTNAME=$PORTNAME" >> $IFCFGFILE [ "$CTCPROT" != "" ] && echo "CTCPROT=$CTCPROT" >> $IFCFGFILE [ "$MACADDR" != "" ] && echo "MACADDR=$MACADDR" >> $IFCFGFILE optstr="" for option in LAYER2 PORTNO; do [ -z "${!option}" ] && continue [ -n "$optstr" ] && optstr=${optstr}" " optstr=${optstr}$(echo ${option} | sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/')"="${!option} done # write single quotes since network.py removes double quotes but we need quotes echo "OPTIONS='$optstr'" >> $IFCFGFILE unset option unset optstr unset DNS1 unset DNS2 echo "files /etc/sysconfig/network-scripts" >> /run/initramfs/rwtab echo "files /var/lib/dhclient" >> /run/initramfs/rwtab } [ -f /tmp/cms.conf ] && cms_write_config 070701000F00B6000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90crypt070701000F00BB000081ED000000000000000000000001555B5D0200000CE9000000FD0000000000000000000000000000005300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90crypt/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { local _rootdev # if cryptsetup is not installed, then we cannot support encrypted devices. require_binaries cryptsetup || return 1 [[ $hostonly ]] || [[ $mount_needs ]] && { for fs in "${host_fs_types[@]}"; do [[ $fs = "crypto_LUKS" ]] && return 0 done return 255 } return 0 } # called by dracut depends() { echo dm rootfs-block return 0 } # called by dracut installkernel() { instmods dm_crypt =crypto } # called by dracut cmdline() { local dev UUID for dev in "${!host_fs_types[@]}"; do [[ "${host_fs_types[$dev]}" != "crypto_LUKS" ]] && continue UUID=$( blkid -u crypto -o export $dev \ | while read line; do [[ ${line#UUID} = $line ]] && continue printf "%s" "${line#UUID=}" break done ) [[ ${UUID} ]] || continue printf "%s" " rd.luks.uuid=luks-${UUID}" done } # called by dracut install() { if [[ $hostonly_cmdline == "yes" ]]; then local _cryptconf=$(cmdline) [[ $_cryptconf ]] && printf "%s\n" "$_cryptconf" >> "${initdir}/etc/cmdline.d/90crypt.conf" fi inst_multiple cryptsetup rmdir readlink umount inst_script "$moddir"/cryptroot-ask.sh /sbin/cryptroot-ask inst_script "$moddir"/probe-keydev.sh /sbin/probe-keydev inst_hook cmdline 10 "$moddir/parse-keydev.sh" inst_hook cmdline 30 "$moddir/parse-crypt.sh" if ! dracut_module_included "systemd"; then inst_hook cleanup 30 "$moddir/crypt-cleanup.sh" fi > /tmp/dracut_block_uuid.map if [[ $hostonly ]] && [[ -f /etc/crypttab ]]; then # filter /etc/crypttab for the devices we need while read _mapper _dev _rest; do [[ $_mapper = \#* ]] && continue [[ $_dev ]] || continue [[ $_dev == UUID=* ]] && \ _dev="/dev/disk/by-uuid/${_dev#UUID=}" echo "$_dev $(blkid $_dev -s UUID -o value)" >> /tmp/dracut_block_uuid.map for _hdev in "${!host_fs_types[@]}"; do [[ ${host_fs_types[$_hdev]} == "crypto_LUKS" ]] || continue if [[ $_hdev -ef $_dev ]] || [[ /dev/block/$_hdev -ef $_dev ]]; then echo "$_mapper $_dev $_rest" break fi done done < /etc/crypttab > $initdir/etc/crypttab fi inst_simple "$moddir/crypt-lib.sh" "/lib/dracut-crypt-lib.sh" inst_simple "/tmp/dracut_block_uuid.map" "/usr/lib/dracut/modules.d/90crypt/block_uuid.map" inst_multiple -o \ $systemdutildir/system-generators/systemd-cryptsetup-generator \ $systemdutildir/systemd-cryptsetup \ $systemdsystemunitdir/systemd-ask-password-console.path \ $systemdsystemunitdir/systemd-ask-password-console.service \ $systemdsystemunitdir/cryptsetup.target \ $systemdsystemunitdir/sysinit.target.wants/cryptsetup.target \ systemd-ask-password systemd-tty-ask-password-agent inst_script "$moddir"/crypt-run-generator.sh /sbin/crypt-run-generator dracut_need_initqueue } 070701000F00B8000081ED000000000000000000000001555B5D0200001CC9000000FD0000000000000000000000000000005000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90crypt/crypt-lib.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh command -v getarg >/dev/null || . /lib/dracut-lib.sh # check if the crypttab contains an entry for a LUKS UUID crypttab_contains() { local luks="$1" local _uuid _line local l d rest if [ -f /etc/crypttab ]; then while read l d rest; do strstr "${l##luks-}" "${luks##luks-}" && return 0 strstr "$d" "${luks##luks-}" && return 0 if [ -e /usr/lib/dracut/modules.d/90crypt/block_uuid.map ]; then # search for line starting with $d _line=$(sed -n "\,^$d .*$,{p}" /usr/lib/dracut/modules.d/90crypt/block_uuid.map) [ -z "$_line" ] && continue # get second column with uuid _uuid="$(echo $_line | sed 's,^.* \(.*$\),\1,')" strstr "$_uuid" "${luks##luks-}" && return 0 fi done < /etc/crypttab fi return 1 } # ask_for_password # # Wraps around plymouth ask-for-password and adds fallback to tty password ask # if plymouth is not present. # # --cmd command # Command to execute. Required. # --prompt prompt # Password prompt. Note that function already adds ':' at the end. # Recommended. # --tries n # How many times repeat command on its failure. Default is 3. # --ply-[cmd|prompt|tries] # Command/prompt/tries specific for plymouth password ask only. # --tty-[cmd|prompt|tries] # Command/prompt/tries specific for tty password ask only. # --tty-echo-off # Turn off input echo before tty command is executed and turn on after. # It's useful when password is read from stdin. ask_for_password() { local cmd; local prompt; local tries=3 local ply_cmd; local ply_prompt; local ply_tries=3 local tty_cmd; local tty_prompt; local tty_tries=3 local ret while [ $# -gt 0 ]; do case "$1" in --cmd) ply_cmd="$2"; tty_cmd="$2" shift;; --ply-cmd) ply_cmd="$2"; shift;; --tty-cmd) tty_cmd="$2"; shift;; --prompt) ply_prompt="$2"; tty_prompt="$2" shift;; --ply-prompt) ply_prompt="$2"; shift;; --tty-prompt) tty_prompt="$2"; shift;; --tries) ply_tries="$2"; tty_tries="$2"; shift;; --ply-tries) ply_tries="$2"; shift;; --tty-tries) tty_tries="$2"; shift;; --tty-echo-off) tty_echo_off=yes;; esac shift done { flock -s 9; # Prompt for password with plymouth, if installed and running. if type plymouth >/dev/null 2>&1 && plymouth --ping 2>/dev/null; then plymouth ask-for-password \ --prompt "$ply_prompt" --number-of-tries=$ply_tries \ --command="$ply_cmd" ret=$? else if [ "$tty_echo_off" = yes ]; then stty_orig="$(stty -g)" stty -echo fi local i=1 while [ $i -le $tty_tries ]; do [ -n "$tty_prompt" ] && \ printf "$tty_prompt [$i/$tty_tries]:" >&2 eval "$tty_cmd" && ret=0 && break ret=$? i=$(($i+1)) [ -n "$tty_prompt" ] && printf '\n' >&2 done [ "$tty_echo_off" = yes ] && stty $stty_orig fi } 9>/.console_lock [ $ret -ne 0 ] && echo "Wrong password" >&2 return $ret } # Try to mount specified device (by path, by UUID or by label) and check # the path with 'test'. # # example: # test_dev -f LABEL="nice label" /some/file1 test_dev() { local test_op=$1; local dev="$2"; local f="$3" local ret=1; local mount_point=$(mkuniqdir /mnt testdev) local path [ -n "$dev" -a -n "$*" ] || return 1 [ -d "$mount_point" ] || die 'Mount point does not exist!' if mount -r "$dev" "$mount_point" >/dev/null 2>&1; then test $test_op "${mount_point}/${f}" ret=$? umount "$mount_point" fi rmdir "$mount_point" return $ret } # match_dev devpattern dev # # Returns true if 'dev' matches 'devpattern'. Both 'devpattern' and 'dev' are # expanded to kernel names and then compared. If name of 'dev' is on list of # names of devices matching 'devpattern', the test is positive. 'dev' and # 'devpattern' may be anything which function 'devnames' recognizes. # # If 'devpattern' is empty or '*' then function just returns true. # # Example: # match_dev UUID=123 /dev/dm-1 # Returns true if /dev/dm-1 UUID starts with "123". match_dev() { [ -z "$1" -o "$1" = '*' ] && return 0 local devlist; local dev devlist="$(devnames "$1")" || return 255 dev="$(devnames "$2")" || return 255 strstr " $devlist " " $dev " } # getkey keysfile for_dev # # Reads file produced by probe-keydev and looks for first line to # which device matches. The successful result is printed in format # ":". When nothing found, just false is returned. # # Example: # getkey /tmp/luks.keys /dev/sdb1 # May print: # /dev/sdc1:/keys/some.key getkey() { local keys_file="$1"; local for_dev="$2" local luks_dev; local key_dev; local key_path [ -z "$keys_file" -o -z "$for_dev" ] && die 'getkey: wrong usage!' [ -f "$keys_file" ] || return 1 local IFS=: while read luks_dev key_dev key_path; do if match_dev "$luks_dev" "$for_dev"; then echo "${key_dev}:${key_path}" return 0 fi done < "$keys_file" return 1 } # readkey keypath keydev device # # Mounts , reads key from file , optionally processes it (e.g. # if encrypted with GPG) and prints to standard output which is supposed to be # read by cryptsetup. is just passed to helper function for # informational purpose. readkey() { local keypath="$1" local keydev="$2" local device="$3" # This creates a unique single mountpoint for *, or several for explicitly # given LUKS devices. It accomplishes unlocking multiple LUKS devices with # a single password entry. local mntp="/mnt/$(str_replace "keydev-$keydev-$keypath" '/' '-')" if [ ! -d "$mntp" ]; then mkdir "$mntp" mount -r "$keydev" "$mntp" || die 'Mounting rem. dev. failed!' fi case "${keypath##*.}" in gpg) if [ -f /lib/dracut-crypt-gpg-lib.sh ]; then . /lib/dracut-crypt-gpg-lib.sh gpg_decrypt "$mntp" "$keypath" "$keydev" "$device" else die "No GPG support to decrypt '$keypath' on '$keydev'." fi ;; img) if [ -f /lib/dracut-crypt-loop-lib.sh ]; then . /lib/dracut-crypt-loop-lib.sh loop_decrypt "$mntp" "$keypath" "$keydev" "$device" initqueue --onetime --finished --unique --name "crypt-loop-cleanup-99-${mntp##*/}" \ $(command -v umount) "$mntp; " $(command -v rmdir) "$mntp" return 0 else die "No loop file support to decrypt '$keypath' on '$keydev'." fi ;; *) cat "$mntp/$keypath" ;; esac # General unmounting mechanism, modules doing custom cleanup should return earlier # and install a pre-pivot cleanup hook umount "$mntp" rmdir "$mntp" } 070701000F00BE000081ED0000000000000000000000015329C2C8000001EC000000FD0000000000000000000000000000005300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90crypt/probe-keydev.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh . /lib/dracut-crypt-lib.sh real_keydev="$1"; keypath="$2"; luksdev="$3" [ -z "$real_keydev" -o -z "$keypath" ] && die 'probe-keydev: wrong usage!' [ -z "$luksdev" ] && luksdev='*' info "Probing $real_keydev for $keypath..." test_dev -f "$real_keydev" "$keypath" || exit 1 info "Found $keypath on $real_keydev" echo "$luksdev:$real_keydev:$keypath" >> /tmp/luks.keys 070701000F00B9000081ED0000000000000000000000015329C2C800000377000000FD0000000000000000000000000000005A00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90crypt/crypt-run-generator.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh . /lib/dracut-lib.sh type crypttab_contains >/dev/null 2>&1 || . /lib/dracut-crypt-lib.sh dev=$1 luks=$2 crypttab_contains "$luks" && exit 0 allowdiscards="-" # parse for allow-discards if strstr "$(cryptsetup --help)" "allow-discards"; then if discarduuids=$(getargs "rd.luks.allow-discards"); then discarduuids=$(str_replace "$discarduuids" 'luks-' '') if strstr " $discarduuids " " ${luks##luks-}"; then allowdiscards="allow-discards" fi elif getargbool 0 rd.luks.allow-discards; then allowdiscards="allow-discards" fi fi echo "$luks $dev - timeout=0,$allowdiscards" >> /etc/crypttab if command -v systemctl >/dev/null; then systemctl daemon-reload systemctl start cryptsetup.target fi exit 0 070701000F00BA000081ED0000000000000000000000015329C2C8000010F0000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90crypt/cryptroot-ask.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh PATH=/usr/sbin:/usr/bin:/sbin:/bin NEWROOT=${NEWROOT:-"/sysroot"} # do not ask, if we already have root [ -f $NEWROOT/proc ] && exit 0 . /lib/dracut-lib.sh # if device name is /dev/dm-X, convert to /dev/mapper/name if [ "${1##/dev/dm-}" != "$1" ]; then device="/dev/mapper/$(dmsetup info -c --noheadings -o name "$1")" else device="$1" fi # default luksname - luks-UUID luksname=$2 # number of tries numtries=${3:-10} # TODO: improve to support what cmdline does if [ -f /etc/crypttab ] && getargbool 1 rd.luks.crypttab -d -n rd_NO_CRYPTTAB; then while read name dev luksfile luksoptions; do # ignore blank lines and comments if [ -z "$name" -o "${name#\#}" != "$name" ]; then continue fi # UUID used in crypttab if [ "${dev%%=*}" = "UUID" ]; then if [ "luks-${dev##UUID=}" = "$luksname" ]; then luksname="$name" break fi # path used in crypttab else cdev=$(readlink -f $dev) mdev=$(readlink -f $device) if [ "$cdev" = "$mdev" ]; then luksname="$name" break fi fi done < /etc/crypttab unset name dev fi # check if destination already exists [ -b /dev/mapper/$luksname ] && exit 0 # we already asked for this device asked_file=/tmp/cryptroot-asked-$luksname [ -f $asked_file ] && exit 0 # load dm_crypt if it is not already loaded [ -d /sys/module/dm_crypt ] || modprobe dm_crypt . /lib/dracut-crypt-lib.sh # # Open LUKS device # info "luksOpen $device $luksname $luksfile $luksoptions" OLD_IFS="$IFS" IFS=, set -- $luksoptions IFS="$OLD_IFS" while [ $# -gt 0 ]; do case $1 in noauto) # skip this exit 0 ;; swap) # skip this exit 0 ;; tmp) # skip this exit 0 ;; allow-discards) allowdiscards="--allow-discards" esac shift done # parse for allow-discards if strstr "$(cryptsetup --help)" "allow-discards"; then if discarduuids=$(getargs "rd.luks.allow-discards"); then discarduuids=$(str_replace "$discarduuids" 'luks-' '') if strstr " $discarduuids " " ${luksdev##luks-}"; then allowdiscards="--allow-discards" fi elif getargbool 0 rd.luks.allow-discards; then allowdiscards="--allow-discards" fi fi if strstr "$(cryptsetup --help)" "allow-discards"; then cryptsetupopts="$cryptsetupopts $allowdiscards" fi unset allowdiscards # fallback to passphrase ask_passphrase=1 if [ -n "$luksfile" -a "$luksfile" != "none" -a -e "$luksfile" ]; then if cryptsetup --key-file "$luksfile" $cryptsetupopts luksOpen "$device" "$luksname"; then ask_passphrase=0 fi else while [ -n "$(getarg rd.luks.key)" ]; do if tmp=$(getkey /tmp/luks.keys $device); then keydev="${tmp%%:*}" keypath="${tmp#*:}" else if [ $numtries -eq 0 ]; then warn "No key found for $device. Fallback to passphrase mode." break fi sleep 1 info "No key found for $device. Will try $numtries time(s) more later." initqueue --unique --onetime --settled \ --name cryptroot-ask-$luksname \ $(command -v cryptroot-ask) "$device" "$luksname" "$(($numtries-1))" exit 0 fi unset tmp info "Using '$keypath' on '$keydev'" readkey "$keypath" "$keydev" "$device" \ | cryptsetup -d - $cryptsetupopts luksOpen "$device" "$luksname" unset keypath keydev ask_passphrase=0 break done fi if [ $ask_passphrase -ne 0 ]; then luks_open="$(command -v cryptsetup) $cryptsetupopts luksOpen" ask_for_password --ply-tries 5 \ --ply-cmd "$luks_open -T1 $device $luksname" \ --ply-prompt "Password ($device)" \ --tty-tries 1 \ --tty-cmd "$luks_open -T5 $device $luksname" unset luks_open fi unset device luksname luksfile # mark device as asked >> $asked_file need_shutdown udevsettle exit 0 070701000F00B7000081ED0000000000000000000000015329C2C800000227000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90crypt/crypt-cleanup.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # close everything which is not busy rm -f -- /etc/udev/rules.d/70-luks.rules >/dev/null 2>&1 if ! getarg rd.luks.uuid -d rd_LUKS_UUID >/dev/null 2>&1 && getargbool 1 rd.luks -d -n rd_NO_LUKS >/dev/null 2>&1; then while true; do local do_break="y" for i in /dev/mapper/luks-*; do cryptsetup luksClose $i >/dev/null 2>&1 && do_break=n done [ "$do_break" = "y" ] && break done fi 070701000F00BD000081ED0000000000000000000000015329C2C8000004EC000000FD0000000000000000000000000000005300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90crypt/parse-keydev.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh if getargbool 1 rd.luks -n rd_NO_LUKS && \ [ -n "$(getarg rd.luks.key)" ]; then exec 7>/etc/udev/rules.d/65-luks-keydev.rules echo 'SUBSYSTEM!="block", GOTO="luks_keydev_end"' >&7 echo 'ACTION!="add|change", GOTO="luks_keydev_end"' >&7 for arg in $(getargs rd.luks.key); do unset keypath keydev luksdev splitsep : "$arg" keypath keydev luksdev info "rd.luks.key: keypath='$keypath' keydev='$keydev' luksdev='$luksdev'" if [ -z "$keypath" ]; then warn 'keypath required!' continue fi if [ -n "$keydev" ]; then udevmatch "$keydev" >&7 || { warn 'keydev incorrect!' continue } printf ', ' >&7 fi { printf -- 'RUN+="%s --unique --onetime ' $(command -v initqueue) printf -- '--name probe-keydev-%%k ' printf -- '%s /dev/%%k %s %s"\n' \ $(command -v probe-keydev) "${keypath}" "${luksdev}" } >&7 done unset arg keypath keydev luksdev echo 'LABEL="luks_keydev_end"' >&7 exec 7>&- fi 070701000F00BC000081ED0000000000000000000000015329C2C800000CCC000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90crypt/parse-crypt.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type crypttab_contains >/dev/null 2>&1 || . /lib/dracut-crypt-lib.sh if ! getargbool 1 rd.luks -d -n rd_NO_LUKS; then info "rd.luks=0: removing cryptoluks activation" rm -f -- /etc/udev/rules.d/70-luks.rules else { echo 'SUBSYSTEM!="block", GOTO="luks_end"' echo 'ACTION!="add|change", GOTO="luks_end"' } > /etc/udev/rules.d/70-luks.rules.new LUKS=$(getargs rd.luks.uuid -d rd_LUKS_UUID) tout=$(getarg rd.luks.key.tout) if [ -n "$LUKS" ]; then for luksid in $LUKS; do luksid=${luksid##luks-} if [ -z "$DRACUT_SYSTEMD" ]; then { printf -- 'ENV{ID_FS_TYPE}=="crypto_LUKS", ' printf -- 'ENV{ID_FS_UUID}=="*%s*", ' $luksid printf -- 'RUN+="%s --settled --unique --onetime ' $(command -v initqueue) printf -- '--name cryptroot-ask-%%k %s ' $(command -v cryptroot-ask) printf -- '$env{DEVNAME} luks-$env{ID_FS_UUID} %s"\n' $tout } >> /etc/udev/rules.d/70-luks.rules.new else if ! crypttab_contains "$luksid"; then { printf -- 'ENV{ID_FS_TYPE}=="crypto_LUKS", ' printf -- 'ENV{ID_FS_UUID}=="*%s*", ' $luksid printf -- 'RUN+="%s --settled --unique --onetime ' $(command -v initqueue) printf -- '--name systemd-cryptsetup-%%k %s start ' $(command -v systemctl) printf -- 'systemd-cryptsetup@luks$$(dev_unit_name -$env{ID_FS_UUID}).service"\n' } >> /etc/udev/rules.d/70-luks.rules.new fi fi uuid=$luksid while [ "$uuid" != "${uuid#*-}" ]; do uuid=${uuid%%-*}${uuid#*-}; done printf -- '[ -e /dev/disk/by-id/dm-uuid-CRYPT-LUKS?-*%s*-* ] || exit 1\n' $uuid \ >> $hookdir/initqueue/finished/90-crypt.sh { printf -- '[ -e /dev/disk/by-uuid/*%s* ] || ' $luksid printf -- 'warn "crypto LUKS UUID "%s" not found"\n' $luksid } >> $hookdir/emergency/90-crypt.sh done elif getargbool 0 rd.auto; then if [ -z "$DRACUT_SYSTEMD" ]; then { printf -- 'ENV{ID_FS_TYPE}=="crypto_LUKS", RUN+="%s ' $(command -v initqueue) printf -- '--unique --settled --onetime --name cryptroot-ask-%%k ' printf -- '%s $env{DEVNAME} luks-$env{ID_FS_UUID} %s"\n' $(command -v cryptroot-ask) $tout } >> /etc/udev/rules.d/70-luks.rules.new else { printf -- 'ENV{ID_FS_TYPE}=="crypto_LUKS", RUN+="%s ' $(command -v initqueue) printf -- '--unique --settled --onetime --name crypt-run-generator-%%k ' printf -- '%s $env{DEVNAME} luks-$env{ID_FS_UUID}"\n' $(command -v crypt-run-generator) } >> /etc/udev/rules.d/70-luks.rules.new fi fi echo 'LABEL="luks_end"' >> /etc/udev/rules.d/70-luks.rules.new mv /etc/udev/rules.d/70-luks.rules.new /etc/udev/rules.d/70-luks.rules fi 070701000F0109000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95dasd070701000F010A000081ED0000000000000000000000015329C2C80000027E000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95dasd/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { local _arch=$(uname -m) [ "$_arch" = "s390" -o "$_arch" = "s390x" ] || return 1 require_binaries normalize_dasd_arg || return 1 return 0 } # called by dracut depends() { echo "dasd_mod" return 0 } # called by dracut install() { inst_hook cmdline 30 "$moddir/parse-dasd.sh" inst_multiple dasdinfo dasdconf.sh normalize_dasd_arg if [[ $hostonly ]]; then inst /etc/dasd.conf fi inst_rules 56-dasd.rules inst_rules 59-dasd.rules } 070701000F010B000081ED000000000000000000000001555B5D020000015D000000FD0000000000000000000000000000005000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95dasd/parse-dasd.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh for dasd_arg in $(getargs rd.dasd= -d rd_DASD= DASD=); do ( local OLDIFS="$IFS" local IFS="," set -- $dasd_arg IFS="$OLDIFS" echo "$@" | normalize_dasd_arg >> /etc/dasd.conf ) done 070701000F0139000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004A00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95rootfs-block070701000F013A000081ED0000000000000000000000015329C2C800000243000000FD0000000000000000000000000000005C00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95rootfs-block/block-genrules.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh if [ "${root%%:*}" = "block" ]; then { printf 'KERNEL=="%s", SYMLINK+="root"\n' \ ${root#block:/dev/} printf 'SYMLINK=="%s", SYMLINK+="root"\n' \ ${root#block:/dev/} } >> /etc/udev/rules.d/99-root.rules printf '[ -e "%s" ] && { ln -s "%s" /dev/root 2>/dev/null; rm "$job"; }\n' \ "${root#block:}" "${root#block:}" > $hookdir/initqueue/settled/blocksymlink.sh wait_for_dev "${root#block:}" fi 070701000F013D000081ED0000000000000000000000015329C2C80000040A000000FD0000000000000000000000000000005900000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95rootfs-block/parse-block.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh case "$root" in block:LABEL=*|LABEL=*) root="${root#block:}" root="$(echo $root | sed 's,/,\\x2f,g')" root="block:/dev/disk/by-label/${root#LABEL=}" rootok=1 ;; block:UUID=*|UUID=*) root="${root#block:}" root="${root#UUID=}" root="$(echo $root | tr "[:upper:]" "[:lower:]")" root="block:/dev/disk/by-uuid/${root#UUID=}" rootok=1 ;; block:PARTUUID=*|PARTUUID=*) root="${root#block:}" root="${root#PARTUUID=}" root="$(echo $root | tr "[:upper:]" "[:lower:]")" root="block:/dev/disk/by-partuuid/${root}" rootok=1 ;; block:PARTLABEL=*|PARTLABEL=*) root="${root#block:}" root="block:/dev/disk/by-partlabel/${root#PARTLABEL=}" rootok=1 ;; /dev/*) root="block:${root}" rootok=1 ;; esac [ "${root%%:*}" = "block" ] && wait_for_dev "${root#block:}" 070701000F013E000081ED0000000000000000000000015329C2C800000548000000FD0000000000000000000000000000005A00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95rootfs-block/rootfallback.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh for root in $(getargs rootfallback=); do case "$root" in block:LABEL=*|LABEL=*) root="${root#block:}" root="$(echo $root | sed 's,/,\\x2f,g')" root="/dev/disk/by-label/${root#LABEL=}" ;; block:UUID=*|UUID=*) root="${root#block:}" root="${root#UUID=}" root="$(echo $root | tr "[:upper:]" "[:lower:]")" root="/dev/disk/by-uuid/${root#UUID=}" ;; block:PARTUUID=*|PARTUUID=*) root="${root#block:}" root="${root#PARTUUID=}" root="$(echo $root | tr "[:upper:]" "[:lower:]")" root="/dev/disk/by-partuuid/${root}" ;; block:PARTLABEL=*|PARTLABEL=*) root="${root#block:}" root="/dev/disk/by-partlabel/${root#PARTLABEL=}" ;; esac if ! [ -b "$root" ]; then warn "Could not find rootfallback $root" continue fi if mount "$root" /sysroot; then info "Mounted rootfallback $root" exit 0 else warn "Failed to mount rootfallback $root" exit 1 fi done [ -e "$job" ] && rm -f "$job" 070701000F013B000081ED000000000000000000000001555B5D020000079C000000FD0000000000000000000000000000005A00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95rootfs-block/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { return 0 } # called by dracut depends() { echo fs-lib } cmdline_journal() { if [[ $hostonly ]]; then for dev in "${!host_fs_types[@]}"; do [[ ${host_fs_types[$dev]} = "reiserfs" ]] || [[ ${host_fs_types[$dev]} = "xfs" ]] || continue rootopts=$(find_dev_fsopts "$dev") if [[ ${host_fs_types[$dev]} = "reiserfs" ]]; then journaldev=$(fs_get_option $rootopts "jdev") elif [[ ${host_fs_types[$dev]} = "xfs" ]]; then journaldev=$(fs_get_option $rootopts "logdev") fi if [ -n "$journaldev" ]; then echo "root.journaldev=${journaldev}" fi done fi return 0 } cmdline_rootfs() { local dev=/dev/block/$(find_root_block_device) if [ -e $dev ]; then printf "root=%s rootflags=%s rootfstype=%s\n" \ "$(shorten_persistent_dev "$(get_persistent_dev "$dev")")" \ "$(find_mp_fsopts /)" "$(find_mp_fstype /)" fi } # called by dracut cmdline() { cmdline_rootfs cmdline_journal } # called by dracut install() { if [[ $hostonly_cmdline == "yes" ]]; then local _journaldev=$(cmdline_journal) [[ $_journaldev ]] && printf "%s\n" "$_journaldev" >> "${initdir}/etc/cmdline.d/95root-journaldev.conf" local _rootdev=$(cmdline_rootfs) [[ $_rootdev ]] && printf "%s\n" "$_rootdev" >> "${initdir}/etc/cmdline.d/95root-dev.conf" fi inst_multiple umount inst_multiple tr if ! dracut_module_included "systemd"; then inst_hook cmdline 95 "$moddir/parse-block.sh" inst_hook pre-udev 30 "$moddir/block-genrules.sh" inst_hook mount 99 "$moddir/mount-root.sh" fi inst_hook initqueue/timeout 99 "$moddir/rootfallback.sh" } 070701000F013C000081ED0000000000000000000000015329C2C8000011A2000000FD0000000000000000000000000000005800000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95rootfs-block/mount-root.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh type det_fs >/dev/null 2>&1 || . /lib/fs-lib.sh mount_root() { local _ret local _rflags_ro # sanity - determine/fix fstype rootfs=$(det_fs "${root#block:}" "$fstype") journaldev=$(getarg "root.journaldev=") if [ -n "$journaldev" ]; then case "$rootfs" in xfs) rflags="${rflags:+${rflags},}logdev=$journaldev" ;; reiserfs) fsckoptions="-j $journaldev $fsckoptions" rflags="${rflags:+${rflags},}jdev=$journaldev" ;; *);; esac fi _rflags_ro="$rflags,ro" _rflags_ro="${_rflags_ro##,}" while ! mount -t ${rootfs} -o "$_rflags_ro" "${root#block:}" "$NEWROOT"; do warn "Failed to mount -t ${rootfs} -o $_rflags_ro ${root#block:} $NEWROOT" fsck_ask_err done READONLY= fsckoptions= if [ -f "$NEWROOT"/etc/sysconfig/readonly-root ]; then . "$NEWROOT"/etc/sysconfig/readonly-root fi if getargbool 0 "readonlyroot=" -y readonlyroot; then READONLY=yes fi if getarg noreadonlyroot ; then READONLY=no fi if [ -f "$NEWROOT"/fastboot ] || getargbool 0 fastboot ; then fastboot=yes fi if ! getargbool 0 rd.skipfsck; then if [ -f "$NEWROOT"/fsckoptions ]; then fsckoptions=$(cat "$NEWROOT"/fsckoptions) fi if [ -f "$NEWROOT"/forcefsck ] || getargbool 0 forcefsck ; then fsckoptions="-f $fsckoptions" elif [ -f "$NEWROOT"/.autofsck ]; then [ -f "$NEWROOT"/etc/sysconfig/autofsck ] && \ . "$NEWROOT"/etc/sysconfig/autofsck if [ "$AUTOFSCK_DEF_CHECK" = "yes" ]; then AUTOFSCK_OPT="$AUTOFSCK_OPT -f" fi if [ -n "$AUTOFSCK_SINGLEUSER" ]; then warn "*** Warning -- the system did not shut down cleanly. " warn "*** Dropping you to a shell; the system will continue" warn "*** when you leave the shell." action_on_fail fi fsckoptions="$AUTOFSCK_OPT $fsckoptions" fi fi rootopts= if getargbool 1 rd.fstab -d -n rd_NO_FSTAB \ && ! getarg rootflags \ && [ -f "$NEWROOT/etc/fstab" ] \ && ! [ -L "$NEWROOT/etc/fstab" ]; then # if $NEWROOT/etc/fstab contains special mount options for # the root filesystem, # remount it with the proper options rootopts="defaults" while read dev mp fs opts dump fsck; do # skip comments [ "${dev%%#*}" != "$dev" ] && continue if [ "$mp" = "/" ]; then # sanity - determine/fix fstype rootfs=$(det_fs "${root#block:}" "$fs") rootopts=$opts rootfsck=$fsck break fi done < "$NEWROOT/etc/fstab" fi # we want rootflags (rflags) to take precedence so prepend rootopts to # them rflags="${rootopts},${rflags}" rflags="${rflags#,}" rflags="${rflags%,}" # backslashes are treated as escape character in fstab # esc_root=$(echo ${root#block:} | sed 's,\\,\\\\,g') # printf '%s %s %s %s 1 1 \n' "$esc_root" "$NEWROOT" "$rootfs" "$rflags" >/etc/fstab ran_fsck=0 if fsck_able "$rootfs" && \ [ "$rootfsck" != "0" -a -z "$fastboot" -a "$READONLY" != "yes" ] && \ ! strstr "${rflags}" _netdev && \ ! getargbool 0 rd.skipfsck; then umount "$NEWROOT" fsck_single "${root#block:}" "$rootfs" "$rflags" "$fsckoptions" _ret=$? ran_fsck=1 fi echo "${root#block:} $NEWROOT $rootfs ${rflags:-defaults} 0 $rootfsck" >> /etc/fstab if ! ismounted "$NEWROOT"; then info "Mounting ${root#block:} with -o ${rflags}" mount "$NEWROOT" 2>&1 | vinfo elif ! are_lists_eq , "$rflags" "$_rflags_ro" defaults; then info "Remounting ${root#block:} with -o ${rflags}" mount -o remount "$NEWROOT" 2>&1 | vinfo fi if ! getargbool 0 rd.skipfsck; then [ -f "$NEWROOT"/forcefsck ] && rm -f -- "$NEWROOT"/forcefsck 2>/dev/null [ -f "$NEWROOT"/.autofsck ] && rm -f -- "$NEWROOT"/.autofsck 2>/dev/null fi } if [ -n "$root" -a -z "${root%%block:*}" ]; then mount_root fi 070701000F00B0000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90btrfs070701000F00B5000081ED000000000000000000000001555B5D0200000518000000FD0000000000000000000000000000005300000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90btrfs/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { local _rootdev # if we don't have btrfs installed on the host system, # no point in trying to support it in the initramfs. require_binaries btrfs || return 1 [[ $hostonly ]] || [[ $mount_needs ]] && { for fs in ${host_fs_types[@]}; do [[ "$fs" == "btrfs" ]] && return 0 done return 255 } return 0 } # called by dracut depends() { echo udev-rules return 0 } # called by dracut installkernel() { instmods btrfs } # called by dracut install() { if ! inst_rules 64-btrfs.rules; then inst_rules "$moddir/80-btrfs.rules" case "$(btrfs --help)" in *device\ ready*) inst_script "$moddir/btrfs_device_ready.sh" /sbin/btrfs_finished ;; *) inst_script "$moddir/btrfs_finished.sh" /sbin/btrfs_finished ;; esac fi if ! dracut_module_included "systemd"; then inst_hook initqueue/timeout 10 "$moddir/btrfs_timeout.sh" fi # rescue utilities inst_multiple btrfs-zero-log btrfs-image btrfs-debug-tree \ mkfs.btrfs btrfstune inst $(command -v btrfs) /sbin/btrfs } 070701000F00B2000081ED0000000000000000000000015329C2C800000241000000FD0000000000000000000000000000005900000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90btrfs/btrfs_device_ready.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh btrfs_check_complete() { local _rootinfo _dev _dev="${1:-/dev/root}" [ -e "$_dev" ] || return 0 _rootinfo=$(udevadm info --query=env "--name=$_dev" 2>/dev/null) if strstr "$_rootinfo" "ID_FS_TYPE=btrfs"; then info "Checking, if btrfs device complete" btrfs device ready "$_dev" >/dev/null 2>&1 return $? fi return 0 } btrfs_check_complete $1 exit $? 070701000F00B3000081ED0000000000000000000000015329C2C8000002C3000000FD0000000000000000000000000000005500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90btrfs/btrfs_finished.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh btrfs_check_complete() { local _rootinfo _dev _dev="${1:-/dev/root}" [ -e "$_dev" ] || return 0 _rootinfo=$(udevadm info --query=env "--name=$_dev" 2>/dev/null) if strstr "$_rootinfo" "ID_FS_TYPE=btrfs"; then info "Checking, if btrfs device complete" unset __btrfs_mount mount -o ro "$_dev" /tmp >/dev/null 2>&1 __btrfs_mount=$? [ $__btrfs_mount -eq 0 ] && umount "$_dev" >/dev/null 2>&1 return $__btrfs_mount fi return 0 } btrfs_check_complete $1 exit $? 070701000F00B1000081A40000000000000000000000015329C2C80000010E000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90btrfs/80-btrfs.rulesSUBSYSTEM!="block", GOTO="btrfs_end" ACTION!="add|change", GOTO="btrfs_end" ENV{ID_FS_TYPE}!="btrfs", GOTO="btrfs_end" RUN+="/sbin/btrfs device scan $env{DEVNAME}" RUN+="/sbin/initqueue --finished --unique --name btrfs_finished /sbin/btrfs_finished" LABEL="btrfs_end" 070701000F00B4000081ED0000000000000000000000015329C2C8000000FC000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90btrfs/btrfs_timeout.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh info "Scanning for all btrfs devices" /sbin/btrfs device scan >/dev/null 2>&1 070701000F0152000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95znet070701000F0153000081ED0000000000000000000000015329C2C800000277000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95znet/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { arch=$(uname -m) [ "$arch" = "s390" -o "$arch" = "s390x" ] || return 1 require_binaries znet_cio_free grep sed seq readlink || return 1 return 0 } # called by dracut depends() { return 0 } # called by dracut installkernel() { instmods ctcm lcs qeth qeth_l2 qeth_l3 } # called by dracut install() { inst_hook cmdline 30 "$moddir/parse-ccw.sh" inst_rules 81-ccw.rules inst_multiple znet_cio_free grep sed seq readlink /lib/udev/ccw_init } 070701000F0154000081ED0000000000000000000000015329C2C800000103000000FD0000000000000000000000000000004F00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95znet/parse-ccw.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh for ccw_arg in $(getargs rd.ccw -d 'rd_CCW=') $(getargs rd.znet -d 'rd_ZNET='); do echo $ccw_arg >> /etc/ccw.conf done znet_cio_free 070701000F0065000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/00warpclock070701000F0066000081ED000000000000000000000001555B5D0200000286000000FD0000000000000000000000000000005700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/00warpclock/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { # hwclock does not exist on S390(x), bail out silently then local _arch=$(uname -m) [ "$_arch" = "s390" -o "$_arch" = "s390x" ] && return 1 [ -e /etc/localtime -a -e /etc/adjtime ] || return 1 require_binaries /sbin/hwclock || return 1 } # called by dracut depends() { return 0 } # called by dracut install() { inst /usr/share/zoneinfo/UTC inst /etc/localtime inst /etc/adjtime inst_hook pre-trigger 00 "$moddir/warpclock.sh" inst /sbin/hwclock } 070701000F0068000081ED000000000000000000000001555B5D0200000097000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/00warpclock/warpclock.sh#!/bin/sh if test -e /etc/adjtime ; then while read line ; do if test "$line" = LOCAL ; then hwclock --systz fi done < /etc/adjtime fi 070701000F00D4000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004C00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90kernel-modules070701000F00D7000081ED000000000000000000000001555B5D020000045F000000FD0000000000000000000000000000005C00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90kernel-modules/parse-kernel.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh _modprobe_d=/etc/modprobe.d if [ -d /usr/lib/modprobe.d ] ; then _modprobe_d=/usr/lib/modprobe.d elif [ -d /lib/modprobe.d ] ; then _modprobe_d=/lib/modprobe.d elif [ ! -d $_modprobe_d ] ; then mkdir -p $_modprobe_d fi for i in $(getargs rd.driver.pre -d rdloaddriver=); do ( OLDIFS="$IFS" IFS=, for p in $i; do modprobe $p 2>&1 | vinfo done IFS="$OLDIFS" ) done [ -d /etc/modprobe.d ] || mkdir -p /etc/modprobe.d for i in $(getargs rd.driver.blacklist -d rdblacklist=); do ( OLDIFS="$IFS" IFS=, for p in $i; do echo "blacklist $p" >> $_modprobe_d/initramfsblacklist.conf done IFS="$OLDIFS" ) done for p in $(getargs rd.driver.post -d rdinsmodpost=); do echo "blacklist $p" >> $_modprobe_d/initramfsblacklist.conf _do_insmodpost=1 done [ -n "$_do_insmodpost" ] && initqueue --settled --unique --onetime insmodpost.sh unset _do_insmodpost _modprobe_d 070701000F00D6000081ED000000000000000000000001555B5D0200000D13000000FD0000000000000000000000000000005C00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90kernel-modules/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut installkernel() { if [[ -z $drivers ]]; then block_module_filter() { local _blockfuncs='ahci_init_controller|ata_scsi_ioctl|scsi_add_host|blk_cleanup_queue|register_mtd_blktrans|scsi_esp_register|register_virtio_device|usb_stor_disconnect' # subfunctions inherit following FDs local _merge=8 _side2=9 function bmf1() { local _f while read _f; do case "$_f" in *.ko) [[ $(< $_f) =~ $_blockfuncs ]] && echo "$_f" ;; *.ko.gz) [[ $(gzip -dc <$_f) =~ $_blockfuncs ]] && echo "$_f" ;; *.ko.xz) [[ $(xz -dc <$_f) =~ $_blockfuncs ]] && echo "$_f" ;; esac done return 0 } function rotor() { local _f1 _f2 while read _f1; do echo "$_f1" if read _f2; then echo "$_f2" 1>&${_side2} fi done | bmf1 1>&${_merge} return 0 } # Use two parallel streams to filter alternating modules. set +x eval "( ( rotor ) ${_side2}>&1 | bmf1 ) ${_merge}>&1" [[ $debug ]] && set -x return 0 } hostonly='' instmods \ sr_mod sd_mod scsi_dh ata_piix hid_generic unix \ ehci-hcd ehci-pci ehci-platform \ ohci-hcd ohci-pci \ uhci-hcd \ xhci-hcd instmods yenta_socket scsi_dh_rdac scsi_dh_emc scsi_dh_alua \ atkbd i8042 usbhid hid-apple hid-sunplus hid-cherry hid-logitech \ hid-logitech-dj hid-microsoft firewire-ohci \ pcmcia usb_storage nvme hid-hyperv hv-vmbus \ sdhci_acpi if [[ "$(uname -p)" == arm* ]]; then # arm specific modules hostonly='' instmods sdhci_esdhc_imx mmci sdhci_tegra mvsdio omap omapdrm \ omap_hsmmc panel-tfp410 sdhci_dove ahci_platform pata_imx sata_mv \ ehci-tegra mmc_block usb_storage fi # install virtual machine support instmods virtio virtio_blk virtio_ring virtio_pci virtio_scsi \ "=drivers/pcmcia" =ide "=drivers/usb/storage" find_kernel_modules | block_module_filter | instmods # if not on hostonly mode, install all known filesystems, # if the required list is not set via the filesystems variable if ! [[ $hostonly ]]; then if [[ -z $filesystems ]]; then silent_omit_drivers="kernel/fs/nfs|kernel/fs/nfsd|kernel/fs/lockd" \ instmods '=fs' fi else for i in $(host_fs_all); do hostonly='' instmods $i done fi fi : } # called by dracut install() { inst_multiple -o /lib/modprobe.d/*.conf [[ $hostonly ]] && inst_multiple -o /etc/modprobe.d/*.conf /etc/modprobe.conf if ! dracut_module_included "systemd"; then inst_hook cmdline 01 "$moddir/parse-kernel.sh" fi inst_simple "$moddir/insmodpost.sh" /sbin/insmodpost.sh } 070701000F00D5000081ED000000000000000000000001555B5D0200000135000000FD0000000000000000000000000000005A00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/90kernel-modules/insmodpost.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh . /lib/dracut-lib.sh for modlist in $(getargs rd.driver.post -d rdinsmodpost=); do ( local IFS=, for m in $modlist; do modprobe $m done ) done 070701000F0085000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/30convertfs070701000F0089000081ED000000000000000000000001555B5D020000027F000000FD0000000000000000000000000000005700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/30convertfs/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { # Only check for /var/run if test -L /var/run;then return 255 else require_binaries bash find ldconfig mv rm cp ln || return 1 return 0 fi } # called by dracut depends() { return 0 } # called by dracut install() { inst_multiple bash find ldconfig mv rm cp ln inst_hook pre-pivot 99 "$moddir/do-convertfs.sh" inst_script "$moddir/convertfs.sh" /usr/bin/convertfs inst_script "$moddir/convertrunfs.sh" /usr/bin/convertrunfs } 070701000F0087000081ED000000000000000000000001555B5D02000004CD000000FD0000000000000000000000000000005700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/30convertfs/convertrunfs.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh ROOT="$1" if [[ ! -d "$ROOT" ]]; then echo "Usage: $0 " exit 1 fi if [[ "$ROOT" -ef / ]]; then echo "Can't convert the running system." echo "Please boot with 'rd.convertfs' on the kernel command line," echo "to update with the help of the initramfs," echo "or run this script from a rescue system." exit 1 fi while [[ "$ROOT" != "${ROOT%/}" ]]; do ROOT=${ROOT%/} done if findmnt "$ROOT" -O ro;then WAS_RO=1 mount $ROOT -o remount,rw else WAS_RO=0 fi testfile="$ROOT/.usrmovecheck$$" rm -f -- "$testfile" > "$testfile" if [[ ! -e "$testfile" ]]; then echo "Cannot write to $ROOT/" exit 1 fi rm -f -- "$testfile" if [ ! -L $ROOT/var/run -a -e $ROOT/var/run ]; then echo "Converting /var/run to symlink" mv -f $ROOT/var/run $ROOT/var/run.runmove~ ln -sfn ../run $ROOT/var/run fi if [ ! -L $ROOT/var/lock -a -e $ROOT/var/lock ]; then echo "Converting /var/lock to symlink" mv -f $ROOT/var/lock $ROOT/var/lock.lockmove~ ln -sfn ../run/lock $ROOT/var/lock fi if [ $WAS_RO -eq 1 ];then mount $ROOT -o remount,ro fi 070701000F0086000081ED000000000000000000000001555B5D020000172F000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/30convertfs/convertfs.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh ROOT="$1" if [[ ! -d "$ROOT" ]]; then echo "Usage: $0 " exit 1 fi if [[ "$ROOT" -ef / ]]; then echo "Can't convert the running system." echo "Please boot with 'rd.convertfs' on the kernel command line," echo "to update with the help of the initramfs," echo "or run this script from a rescue system." exit 1 fi while [[ "$ROOT" != "${ROOT%/}" ]]; do ROOT=${ROOT%/} done if [ ! -L $ROOT/var/run -a -e $ROOT/var/run ]; then echo "Converting /var/run to symlink" mv -f $ROOT/var/run $ROOT/var/run.runmove~ ln -sfn ../run $ROOT/var/run fi if [ ! -L $ROOT/var/lock -a -e $ROOT/var/lock ]; then echo "Converting /var/lock to symlink" mv -f $ROOT/var/lock $ROOT/var/lock.lockmove~ ln -sfn ../run/lock $ROOT/var/lock fi needconvert() { for dir in "$ROOT/bin" "$ROOT/sbin" "$ROOT/lib" "$ROOT/lib64"; do if [[ -e "$dir" ]]; then [[ -L "$dir" ]] || return 0 fi done return 1 } if ! [ -e "$ROOT/usr/bin" ]; then echo "$ROOT/usr/bin does not exist!" echo "Make sure, the kernel command line has enough information" echo "to mount /usr (man dracut.cmdline)" exit 1 fi if ! needconvert; then echo "Your system is already converted." exit 0 fi testfile="$ROOT/.usrmovecheck$$" rm -f -- "$testfile" > "$testfile" if [[ ! -e "$testfile" ]]; then echo "Cannot write to $ROOT/" exit 1 fi rm -f -- "$testfile" find_mount() { local dev mnt etc wanted_dev wanted_dev="$(readlink -e -q $1)" while read dev mnt etc; do [ "$dev" = "$wanted_dev" ] && echo "$dev" && return 0 done < /proc/mounts return 1 } # usage: ismounted # usage: ismounted /dev/ if command -v findmnt >/dev/null; then ismounted() { findmnt "$1" > /dev/null 2>&1 } else ismounted() { if [ -b "$1" ]; then find_mount "$1" > /dev/null && return 0 return 1 fi while read a m a; do [ "$m" = "$1" ] && return 0 done < /proc/mounts return 1 } fi # clean up after ourselves no matter how we die. cleanup() { echo "Something failed. Move back to the original state" for dir in "$ROOT/bin" "$ROOT/sbin" "$ROOT/lib" "$ROOT/lib64" \ "$ROOT/usr/bin" "$ROOT/usr/sbin" "$ROOT/usr/lib" \ "$ROOT/usr/lib64"; do [[ -d "${dir}.usrmove-new" ]] && rm -fr -- "${dir}.usrmove-new" if [[ -d "${dir}.usrmove-old" ]]; then mv "$dir" "${dir}.del~" mv "${dir}.usrmove-old" "$dir" rm -fr -- "${dir}.del~" fi done } trap 'ret=$?; [[ $ret -ne 0 ]] && cleanup;exit $ret;' EXIT trap 'exit 1;' SIGINT ismounted "$ROOT/usr" || CP_HARDLINK="-l" set -e # merge / and /usr in new dir in /usr for dir in bin sbin lib lib64; do rm -rf -- "$ROOT/usr/${dir}.usrmove-new" [[ -L "$ROOT/$dir" ]] && continue [[ -d "$ROOT/$dir" ]] || continue echo "Make a copy of \`$ROOT/usr/$dir'." [[ -d "$ROOT/usr/$dir" ]] \ && cp -ax -l "$ROOT/usr/$dir" "$ROOT/usr/${dir}.usrmove-new" echo "Merge the copy with \`$ROOT/$dir'." [[ -d "$ROOT/usr/${dir}.usrmove-new" ]] \ || mkdir -p "$ROOT/usr/${dir}.usrmove-new" cp -axT $CP_HARDLINK --backup --suffix=.usrmove~ "$ROOT/$dir" "$ROOT/usr/${dir}.usrmove-new" echo "Clean up duplicates in \`$ROOT/usr/$dir'." # delete all symlinks that have been backed up find "$ROOT/usr/${dir}.usrmove-new" -type l -name '*.usrmove~' -delete || : # replace symlink with backed up binary find "$ROOT/usr/${dir}.usrmove-new" \ -name '*.usrmove~' \ -type f \ -exec bash -c 'p="{}";o=${p%%%%.usrmove~}; [[ -L "$o" ]] && mv -f "$p" "$o"' ';' || : done # switch over merged dirs in /usr for dir in bin sbin lib lib64; do [[ -d "$ROOT/usr/${dir}.usrmove-new" ]] || continue echo "Switch to new \`$ROOT/usr/$dir'." rm -fr -- "$ROOT/usr/${dir}.usrmove-old" mv "$ROOT/usr/$dir" "$ROOT/usr/${dir}.usrmove-old" mv "$ROOT/usr/${dir}.usrmove-new" "$ROOT/usr/$dir" done # replace dirs in / with links to /usr for dir in bin sbin lib lib64; do [[ -L "$ROOT/$dir" ]] && continue [[ -d "$ROOT/$dir" ]] || continue echo "Create \`$ROOT/$dir' symlink." rm -fr -- "$ROOT/${dir}.usrmove-old" || : mv "$ROOT/$dir" "$ROOT/${dir}.usrmove-old" ln -sfn usr/$dir "$ROOT/$dir" done echo "Clean up backup files." # everything seems to work; cleanup for dir in bin sbin lib lib64; do # if we get killed in the middle of "rm -rf", ensure not to leave # an incomplete directory, which is moved back by cleanup() [[ -d "$ROOT/usr/${dir}.usrmove-old" ]] \ && mv "$ROOT/usr/${dir}.usrmove-old" "$ROOT/usr/${dir}.usrmove-old~" [[ -d "$ROOT/${dir}.usrmove-old" ]] \ && mv "$ROOT/${dir}.usrmove-old" "$ROOT/${dir}.usrmove-old~" done for dir in bin sbin lib lib64; do [[ -d "$ROOT/usr/${dir}.usrmove-old~" ]] \ && rm -rf -- "$ROOT/usr/${dir}.usrmove-old~" || : [[ -d "$ROOT/${dir}.usrmove-old~" ]] \ && rm -rf -- "$ROOT/${dir}.usrmove-old~" || : done for dir in lib lib64; do [[ -d "$ROOT/$dir" ]] || continue for lib in "$ROOT"/usr/${dir}/lib*.so*.usrmove~; do [[ -f $lib ]] || continue mv $lib ${lib/.so/_so} done done set +e echo "Run ldconfig." ldconfig -r "$ROOT" . $ROOT/etc/selinux/config if [ -n "$(command -v setfiles)" ] && [ "$SELINUX" != "disabled" ] && [ -f /etc/selinux/${SELINUXTYPE}/contexts/files/file_contexts ]; then echo "Fixing SELinux labels" setfiles -r $ROOT -p /etc/selinux/${SELINUXTYPE}/contexts/files/file_contexts $ROOT/sbin $ROOT/bin $ROOT/lib $ROOT/lib64 $ROOT/usr/lib $ROOT/usr/lib64 $ROOT/etc/ld.so.cache $ROOT/var/cache/ldconfig || : fi echo "Done." exit 0 070701000F0088000081ED000000000000000000000001555B5D0200000329000000FD0000000000000000000000000000005700000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/30convertfs/do-convertfs.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # This converts all, /usr/bin -> /bin, ... and /var/run -> /run # Do not enable by default! if getargbool 0 rd.convertfs; then info "Converting both /var/run to /run tmpfs and /usr/bin -> /bin" if getargbool 0 rd.debug; then bash -x convertfs "$NEWROOT" 2>&1 | vinfo exit 0 else convertfs "$NEWROOT" 2>&1 | vinfo exit 0 fi fi # This only converts /var/run -> /run as tmpfs if ! test -L "$NEWROOT"/var/run;then info "Converting /var/run to /run tmpfs" if getargbool 0 rd.debug; then bash -x convertrunfs "$NEWROOT" 2>&1 | vinfo exit 0 else convertrunfs "$NEWROOT" 2>&1 | vinfo exit 0 fi fi 070701000F0135000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95resume070701000F0136000081ED000000000000000000000001555B5D02000005CD000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95resume/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { # No point trying to support resume, if no swap partition exist [[ $hostonly ]] || [[ $mount_needs ]] && { for fs in "${host_fs_types[@]}"; do [[ $fs =~ ^(swap|swsuspend|swsupend)$ ]] && return 0 done return 255 } return 0 } # called by dracut cmdline() { local _resume for dev in "${!host_fs_types[@]}"; do [[ ${host_fs_types[$dev]} =~ ^(swap|swsuspend|swsupend)$ ]] || continue _resume=$(shorten_persistent_dev "$(get_persistent_dev "$dev")") [[ -n ${_resume} ]] && printf " resume=%s" "${_resume}" done } # called by dracut install() { local _bin local _resumeconf=$(cmdline) [[ $_resumeconf ]] && printf "%s\n" "$_resumeconf" >> "${initdir}/etc/cmdline.d/95resume.conf" # Optional uswsusp support for _bin in /usr/sbin/resume /usr/lib/suspend/resume /usr/lib/uswsusp/resume do [[ -x "${_bin}" ]] && { inst "${_bin}" /usr/sbin/resume [[ -f /etc/suspend.conf ]] && inst /etc/suspend.conf break } done if ! dracut_module_included "systemd"; then inst_hook cmdline 10 "$moddir/parse-resume.sh" else inst_script "$moddir/parse-resume.sh" /lib/dracut/parse-resume.sh fi inst_script "$moddir/resume.sh" /lib/dracut/resume.sh } 070701000F0137000081ED000000000000000000000001555B5D0200000E65000000FD0000000000000000000000000000005400000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95resume/parse-resume.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh if resume=$(getarg resume=) && ! getarg noresume; then export resume echo "$resume" >/.resume else unset resume fi case "$resume" in LABEL=*) \ resume="$(echo $resume | sed 's,/,\\x2f,g')" resume="/dev/disk/by-label/${resume#LABEL=}" ;; UUID=*) \ resume="/dev/disk/by-uuid/${resume#UUID=}" ;; PARTUUID=*) \ resume="/dev/disk/by-partuuid/${resume#PARTUUID=}" ;; PARTLABEL=*) \ resume="/dev/disk/by-partlabel/${resume#PARTLABEL=}" ;; esac if splash=$(getarg splash=); then export splash else unset splash fi case "$splash" in quiet ) a_splash="-P splash=y" ;; * ) a_splash="-P splash=n" ;; esac if ! getarg noresume; then if [ -n "$resume" ]; then { printf "KERNEL==\"%s\", ACTION==\"add|change\", SYMLINK+=\"resume\"\n" \ ${resume#/dev/}; printf "SYMLINK==\"%s\", ACTION==\"add|change\", SYMLINK+=\"resume\"\n" \ ${resume#/dev/}; } >> /etc/udev/rules.d/99-resume-link.rules { if [ -x /usr/sbin/resume ]; then printf -- 'KERNEL=="%s", ' "${resume#/dev/}" printf -- '%s' 'ACTION=="add|change", ENV{ID_FS_TYPE}=="suspend|swsuspend|swsupend",' printf -- " RUN+=\"/sbin/initqueue --finished --unique --name 00resume /usr/sbin/resume %s \'%s\'\"\n" \ "$a_splash" "$resume"; printf -- 'SYMLINK=="%s", ' "${resume#/dev/}" printf -- '%s' 'ACTION=="add|change", ENV{ID_FS_TYPE}=="suspend|swsuspend|swsupend",' printf -- " RUN+=\"/sbin/initqueue --finished --unique --name 00resume /usr/sbin/resume %s \'%s\'\"\n" \ "$a_splash" "$resume"; fi printf -- 'KERNEL=="%s", ' "${resume#/dev/}" printf -- '%s' 'ACTION=="add|change", ENV{ID_FS_TYPE}=="suspend|swsuspend|swsupend",' printf -- '%s\n' ' RUN+="/sbin/initqueue --finished --unique --name 00resume echo %M:%m > /sys/power/resume"' printf -- 'SYMLINK=="%s", ' "${resume#/dev/}" printf -- '%s' 'ACTION=="add|change", ENV{ID_FS_TYPE}=="suspend|swsuspend|swsupend",' printf -- '%s\n' ' RUN+="/sbin/initqueue --finished --unique --name 00resume echo %M:%m > /sys/power/resume"' } >> /etc/udev/rules.d/99-resume.rules printf '[ -e "%s" ] && { ln -s "%s" /dev/resume; rm -f -- "$job" "%s/initqueue/timeout/resume.sh"; }\n' \ "$resume" "$resume" "$hookdir" >> $hookdir/initqueue/settled/resume.sh { printf -- "%s" 'warn "Cancelling resume operation. Device not found.";' printf -- ' cancel_wait_for_dev /dev/resume; rm -f -- "$job" "%s/initqueue/settled/resume.sh";\n' "$hookdir" } >> $hookdir/initqueue/timeout/resume.sh mv /lib/dracut/resume.sh /lib/dracut/hooks/pre-mount/10-resume.sh else { if [ -x /usr/sbin/resume ]; then printf -- '%s' 'SUBSYSTEM=="block", ACTION=="add|change", ENV{ID_FS_TYPE}=="suspend|swsuspend|swsupend",' printf -- ' RUN+="/sbin/initqueue --finished --unique --name 00resume /usr/sbin/resume %s $tempnode"\n' "$a_splash" fi printf -- '%s' 'SUBSYSTEM=="block", ACTION=="add|change", ENV{ID_FS_TYPE}=="suspend|swsuspend|swsupend",' printf -- '%s\n' ' RUN+="/sbin/initqueue --finished --unique --name 00resume echo %M:%m > /sys/power/resume"'; } >> /etc/udev/rules.d/99-resume.rules fi fi 070701000F0138000081ED0000000000000000000000015329C2C80000029E000000FD0000000000000000000000000000004E00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/95resume/resume.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh PATH=/usr/sbin:/usr/bin:/sbin:/bin [ -s /.resume -a -b "$resume" ] && { # First try user level resume; it offers splash etc case "$splash" in quiet ) a_splash="-P splash=y" ;; * ) a_splash="-P splash=n" ;; esac [ -x "$(command -v resume)" ] && command resume $a_splash "$resume" # parsing the output of ls is Bad, but until there is a better way... ls -lH "$resume" | ( read x x x x maj min x; echo "${maj%,}:$min"> /sys/power/resume) >/.resume } 070701000F0195000041ED000000000000000000000002556432B600000000000000FD0000000000000000000000000000004200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/99base070701000F019A000081ED000000000000000000000001555B5D0200000DA9000000FD0000000000000000000000000000005200000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/99base/module-setup.sh#!/bin/bash # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # called by dracut check() { return 0 } # called by dracut depends() { echo udev-rules return 0 } # called by dracut install() { local _d inst_multiple mount mknod mkdir sleep chroot chown \ sed ls flock cp mv dmesg rm ln rmmod mkfifo umount readlink setsid inst $(command -v modprobe) /sbin/modprobe inst_multiple -o findmnt less kmod if [ ! -e "${initdir}/bin/sh" ]; then inst_multiple bash (ln -s bash "${initdir}/bin/sh" || :) fi #add common users in /etc/passwd, it will be used by nfs/ssh currently egrep '^root:' "$initdir/etc/passwd" 2>/dev/null || echo 'root:x:0:0::/root:/bin/sh' >> "$initdir/etc/passwd" egrep '^nobody:' /etc/passwd >> "$initdir/etc/passwd" # install our scripts and hooks inst_script "$moddir/init.sh" "/init" inst_script "$moddir/initqueue.sh" "/sbin/initqueue" inst_script "$moddir/loginit.sh" "/sbin/loginit" inst_script "$moddir/rdsosreport.sh" "/sbin/rdsosreport" [ -e "${initdir}/lib" ] || mkdir -m 0755 -p ${initdir}/lib mkdir -m 0755 -p ${initdir}/lib/dracut mkdir -m 0755 -p ${initdir}/lib/dracut/hooks mkdir -p ${initdir}/tmp inst_simple "$moddir/dracut-lib.sh" "/lib/dracut-lib.sh" if ! dracut_module_included "systemd"; then inst_multiple switch_root || dfatal "Failed to install switch_root" inst_hook cmdline 10 "$moddir/parse-root-opts.sh" fi mkdir -p "${initdir}/var" if ! dracut_module_included "systemd"; then inst_multiple -o $systemdutildir/systemd-timestamp fi if [[ $realinitpath ]]; then for i in $realinitpath; do echo "rd.distroinit=$i" done > "${initdir}/etc/cmdline.d/distroinit.conf" fi ln -fs /proc/self/mounts "$initdir/etc/mtab" if [[ $ro_mnt = yes ]]; then echo ro >> "${initdir}/etc/cmdline.d/base.conf" fi if [ -e /etc/os-release ]; then . /etc/os-release VERSION+=" " PRETTY_NAME+=" " else VERSION="" PRETTY_NAME="" fi NAME=dracut ID=dracut VERSION+="dracut-$DRACUT_VERSION" PRETTY_NAME+="dracut-$DRACUT_VERSION (Initramfs)" VERSION_ID=$DRACUT_VERSION ANSI_COLOR="0;34" { echo NAME=\"$NAME\" echo VERSION=\"$VERSION\" echo ID=$ID echo VERSION_ID=$VERSION_ID echo PRETTY_NAME=\"$PRETTY_NAME\" echo ANSI_COLOR=\"$ANSI_COLOR\" } > $initdir/etc/initrd-release echo dracut-$DRACUT_VERSION > $initdir/lib/dracut/dracut-$DRACUT_VERSION ln -sf initrd-release $initdir/etc/os-release ## save host_devs which we need bring up if [[ $hostonly_cmdline == "yes" ]]; then if [[ -f "$initdir/lib/dracut/need-initqueue" ]] || ! dracut_module_included "systemd"; then ( if dracut_module_included "systemd"; then DRACUT_SYSTEMD=1 fi PREFIX="$initdir" . "$moddir/dracut-lib.sh" for _dev in ${host_devs[@]}; do [[ "$_dev" == "$root_dev" ]] && continue _pdev=$(get_persistent_dev $_dev) case "$_pdev" in /dev/?*) wait_for_dev $_pdev;; *) ;; esac done ) fi fi } 070701000F019B000081ED0000000000000000000000015329C2C800000164000000FD0000000000000000000000000000005500000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/99base/parse-root-opts.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh root=$(getarg root=) rflags="$(getarg rootflags=)" getargbool 0 ro && rflags="${rflags},ro" getargbool 0 rw && rflags="${rflags},rw" rflags="${rflags#,}" fstype="$(getarg rootfstype=)" if [ -z "$fstype" ]; then fstype="auto" fi 070701000F0198000081ED000000000000000000000001555B5D02000004C7000000FD0000000000000000000000000000004F00000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/99base/initqueue.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh # # Licensed under the GPLv2+ # # Copyright 2008-2010, Red Hat, Inc. # Harald Hoyer PATH=/usr/sbin:/usr/bin:/sbin:/bin type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh while [ $# -gt 0 ]; do case "$1" in --onetime) onetime="yes";; --settled) qname="/settled";; --finished) qname="/finished";; --timeout) qname="/timeout";; --unique) unique="yes";; --name) name="$2";shift;; --env) env="$2"; shift;; *) break;; esac shift done if [ -z "$unique" ]; then job="${name}$$" else job="${name:-$1}" job=${job##*/} fi exe=$1 shift [ -x "$exe" ] || exe=$(command -v $exe) if [ -z "$exe" ] ; then echo "Invalid command" exit 1 fi { [ -n "$onetime" ] && echo '[ -e "$job" ] && rm -f -- "$job"' [ -n "$env" ] && echo "$env" echo "$exe $@" } > "/tmp/$$-${job}.sh" mv -f "/tmp/$$-${job}.sh" "$hookdir/initqueue${qname}/${job}.sh" [ -z "$qname" ] && >> $hookdir/initqueue/work exit 0 070701000F0196000081ED000000000000000000000001555B5D0200007D6B000000FD0000000000000000000000000000005000000000linux/suse/x86_64-sles12/inst-sys/usr/lib/dracut/modules.d/99base/dracut-lib.sh#!/bin/sh # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- # ex: ts=8 sw=4 sts=4 et filetype=sh export DRACUT_SYSTEMD export NEWROOT if [ -n "$NEWROOT" ]; then [ -d $NEWROOT ] || mkdir -p -m 0755 $NEWROOT fi [ -d /run/initramfs ] || mkdir -p -m 0755 /run/initramfs [ -d /run/lock ] || mkdir -p -m 0755 /run/lock [ -d /run/log ] || mkdir -p -m 0755 /run/log debug_off() { set +x } debug_on() { [ "$RD_DEBUG" = "yes" ] && set -x } # returns OK if $1 contains literal string $2 (and isn't empty) strstr() { [ "${1##*"$2"*}" != "$1" ] } # returns OK if $1 matches (completely) glob pattern $2 # An empty $1 will not be considered matched, even if $2 is * which technically # matches; as it would match anything, it's not an interesting case. strglob() { [ -n "$1" -a -z "${1##$2}" ] } # returns OK if $1 contains (anywhere) a match of glob pattern $2 # An empty $1 will not be considered matched, even if $2 is * which technically # matches; as it would match anything, it's not an interesting case. strglobin() { [ -n "$1" -a -z "${1##*$2*}" ] } # returns OK if $1 contains literal string $2 at the beginning, and isn't empty str_starts() { [ "${1#"$2"*}" != "$1" ] } # returns OK if $1 contains literal string $2 at the end, and isn't empty str_ends() { [ "${1%*"$2"}" != "$1" ] } if [ -z "$DRACUT_SYSTEMD" ]; then warn() { check_quiet echo "<28>dracut Warning: $*" > /dev/kmsg echo "dracut Warning: $*" >&2 } info() { check_quiet echo "<30>dracut: $*" > /dev/kmsg [ "$DRACUT_QUIET" != "yes" ] && \ echo "dracut: $*" } else warn() { echo "Warning: $*" >&2 } info() { echo "$*" } fi vwarn() { while read line; do warn $line; done } vinfo() { while read line; do info $line; done } # replaces all occurrences of 'search' in 'str' with 'replacement' # # str_replace str search replacement # # example: # str_replace ' one two three ' ' ' '_' str_replace() { local in="$1"; local s="$2"; local r="$3" local out='' while strstr "${in}" "$s"; do chop="${in%%"$s"*}" out="${out}${chop}$r" in="${in#*"$s"}" done echo "${out}${in}" } killall_proc_mountpoint() { local _pid local _t for _pid in /proc/*; do _pid=${_pid##/proc/} case $_pid in *[!0-9]*) continue;; esac [ -e "/proc/$_pid/exe" ] || continue [ -e "/proc/$_pid/root" ] || continue strstr "$(ls -l -- "/proc/$_pid" "/proc/$_pid/fd" 2>/dev/null)" "$1" && kill -9 "$_pid" done } getcmdline() { local _line local _i local CMDLINE_ETC_D local CMDLINE_ETC unset _line if [ -e /etc/cmdline ]; then while read -r _line; do CMDLINE_ETC="$CMDLINE_ETC $_line"; done ", we want the exact match if [ "$_o" = "$1" ]; then _val="1"; unset _doecho fi continue fi if [ "${_o#*=}" = "$_o" ]; then # if cmdline argument has no "=", we assume "=1" _val="1"; unset _doecho continue fi _val="${_o#*=}" _doecho=1 fi done if [ -n "$_val" ]; then [ "x$_doecho" != "x" ] && echo "$_val"; return 0; fi return 1; } getarg() { debug_off local _deprecated _newoption while [ $# -gt 0 ]; do case $1 in -d) _deprecated=1; shift;; -y) if _dogetarg $2 >/dev/null; then if [ "$_deprecated" = "1" ]; then [ -n "$_newoption" ] && warn "Kernel command line option '$2' is deprecated, use '$_newoption' instead." || warn "Option '$2' is deprecated." fi echo 1 debug_on return 0 fi _deprecated=0 shift 2;; -n) if _dogetarg $2 >/dev/null; then echo 0; if [ "$_deprecated" = "1" ]; then [ -n "$_newoption" ] && warn "Kernel command line option '$2' is deprecated, use '$_newoption=0' instead." || warn "Option '$2' is deprecated." fi debug_on return 1 fi _deprecated=0 shift 2;; *) if [ -z "$_newoption" ]; then _newoption="$1" fi if _dogetarg $1; then if [ "$_deprecated" = "1" ]; then [ -n "$_newoption" ] && warn "Kernel command line option '$1' is deprecated, use '$_newoption' instead." || warn "Option '$1' is deprecated." fi debug_on return 0; fi _deprecated=0 shift;; esac done debug_on return 1 } # getargbool # False if "getarg " returns "0", "no", or "off". # True if getarg returns any other non-empty string. # If not found, assumes - usually 0 for false, 1 for true. # example: getargbool 0 rd.info # true: rd.info, rd.info=1, rd.info=xxx # false: rd.info=0, rd.info=off, rd.info not present (default val is 0) getargbool() { local _b unset _b local _default _default="$1"; shift _b=$(getarg "$@") [ $? -ne 0 -a -z "$_b" ] && _b="$_default" if [ -n "$_b" ]; then [ $_b = "0" ] && return 1 [ $_b = "no" ] && return 1 [ $_b = "off" ] && return 1 fi return 0 } isdigit() { case "$1" in *[!0-9]*|"") return 1;; esac return 0 } # getargnum # Will echo the arg if it's in range [minval - maxval]. # If it's not set or it's not valid, will set it . # Note all values are required to be >= 0 here. # should be with [minval -maxval]. getargnum() { local _b unset _b local _default _min _max _default="$1"; shift _min="$1"; shift _max="$1"; shift _b=$(getarg "$1") [ $? -ne 0 -a -z "$_b" ] && _b=$_default if [ -n "$_b" ]; then isdigit "$_b" && _b=$(($_b)) && \ [ $_b -ge $_min ] && [ $_b -le $_max ] && echo $_b && return fi echo $_default } _dogetargs() { debug_off local _o _found _key unset _o unset _found CMDLINE=$(getcmdline) _key="$1" set -- for _o in $CMDLINE; do if [ "$_o" = "$_key" ]; then _found=1; elif [ "${_o%%=*}" = "${_key%=}" ]; then [ -n "${_o%%=*}" ] && set -- "$@" "${_o#*=}"; _found=1; fi done if [ -n "$_found" ]; then [ $# -gt 0 ] && echo -n "$@" return 0 fi return 1; } getargs() { debug_off local _val _i _args _gfound _deprecated unset _val unset _gfound _newoption="$1" _args="$@" set -- for _i in $_args; do if [ "$i" = "-d" ]; then _deprecated=1 continue fi _val="$(_dogetargs $_i)" if [ $? -eq 0 ]; then if [ "$_deprecated" = "1" ]; then [ -n "$_newoption" ] && warn "Option '$_i' is deprecated, use '$_newoption' instead." || warn "Option $_i is deprecated!" fi _gfound=1 fi [ -n "$_val" ] && set -- "$@" "$_val" _deprecated=0 done if [ -n "$_gfound" ]; then if [ $# -gt 0 ]; then echo -n "$@" else echo -n 1 fi debug_on return 0 fi debug_on return 1; } # Prints value of given option. If option is a flag and it's present, # it just returns 0. Otherwise 1 is returned. # $1 = options separated by commas # $2 = option we are interested in # # Example: # $1 = cipher=aes-cbc-essiv:sha256,hash=sha256,verify # $2 = hash # Output: # sha256 getoptcomma() { local line=",$1,"; local opt="$2"; local tmp case "${line}" in *,${opt}=*,*) tmp="${line#*,${opt}=}" echo "${tmp%%,*}" return 0 ;; *,${opt},*) return 0;; esac return 1 } # Splits given string 'str' with separator 'sep' into variables 'var1', 'var2', # 'varN'. If number of fields is less than number of variables, remaining are # not set. If number of fields is greater than number of variables, the last # variable takes remaining fields. In short - it acts similary to 'read'. # # splitsep sep str var1 var2 varN # # example: # splitsep ':' 'foo:bar:baz' v1 v2 # in result: # v1='foo', v2='bar:baz' # # TODO: ':' inside fields. splitsep() { debug_off local sep="$1"; local str="$2"; shift 2 local tmp while [ -n "$str" -a "$#" -gt 1 ]; do tmp="${str%%$sep*}" eval "$1='${tmp}'" str="${str#"$tmp"}" str="${str#$sep}" shift done [ -n "$str" -a -n "$1" ] && eval "$1='$str'" debug_on return 0 } setdebug() { [ -f /etc/initrd-release ] || return if [ -z "$RD_DEBUG" ]; then if [ -e /proc/cmdline ]; then RD_DEBUG=no if getargbool 0 rd.debug -d -y rdinitdebug -d -y rdnetdebug; then RD_DEBUG=yes [ -n "$BASH" ] && \ export PS4='${BASH_SOURCE}@${LINENO}(${FUNCNAME[0]}): '; fi fi export RD_DEBUG fi debug_on } setdebug source_all() { local f local _dir _dir=$1; shift [ "$_dir" ] && [ -d "/$_dir" ] || return for f in "/$_dir"/*.sh; do [ -e "$f" ] && . "$f" "$@"; done } hookdir=/lib/dracut/hooks export hookdir source_hook() { local _dir _dir=$1; shift source_all "/lib/dracut/hooks/$_dir" "$@" } check_finished() { local f for f in $hookdir/initqueue/finished/*.sh; do [ "$f" = "$hookdir/initqueue/finished/*.sh" ] && return 0 { [ -e "$f" ] && ( . "$f" ) ; } || return 1 done return 0 } source_conf() { local f [ "$1" ] && [ -d "/$1" ] || return for f in "/$1"/*.conf; do [ -e "$f" ] && . "$f"; done } die() { { echo "<24>dracut: FATAL: $*"; echo "<24>dracut: Refusing to continue"; } > /dev/kmsg { echo "warn dracut: FATAL: \"$*\""; echo "warn dracut: Refusing to continue"; } >> $hookdir/emergency/01-die.sh [ -d /run/initramfs ] || mkdir -p -- /run/initramfs > /run/initramfs/.die getargbool 0 "rd.debug=" && emergency_shell if [ -n "$DRACUT_SYSTEMD" ]; then systemctl --no-block --force halt fi exit 1 } check_quiet() { if [ -z "$DRACUT_QUIET" ]; then DRACUT_QUIET="yes" getargbool 0 rd.info -d -y rdinfo && DRACUT_QUIET="no" getargbool 0 rd.debug -d -y rdinitdebug && DRACUT_QUIET="no" getarg quiet || DRACUT_QUIET="yes" a=$(getarg loglevel=) [ -n "$a" ] && [ $a -ge 28 ] && DRACUT_QUIET="yes" export DRACUT_QUIET fi } check_occurances() { # Count the number of times the character $ch occurs in $str # Return 0 if the count matches the expected number, 1 otherwise local str="$1" local ch="$2" local expected="$3" local count=0 while [ "${str#*$ch}" != "${str}" ]; do str="${str#*$ch}" count=$(( $count + 1 )) done [ $count -eq $expected ] } incol2() { debug_off local dummy check; local file="$1"; local str="$2"; [ -z "$file" ] && return 1; [ -z "$str" ] && return 1; while read dummy check restofline; do if [ "$check" = "$str" ]; then debug_on return 0 fi done < $file debug_on return 1 } udevsettle() { [ -z "$UDEVVERSION" ] && export UDEVVERSION=$(udevadm --version) if [ $UDEVVERSION -ge 143 ]; then udevadm settle --exit-if-exists=$hookdir/initqueue/work $settle_exit_if_exists else udevadm settle --timeout=30 fi } udevproperty() { [ -z "$UDEVVERSION" ] && export UDEVVERSION=$(udevadm --version) if [ $UDEVVERSION -ge 143 ]; then for i in "$@"; do udevadm control --property=$i; done else for i in "$@"; do udevadm control --env=$i; done fi } find_mount() { local dev mnt etc wanted_dev wanted_dev="$(readlink -e -q $1)" while read dev mnt etc; do [ "$dev" = "$wanted_dev" ] && echo "$dev" && return 0 done < /proc/mounts return 1 } # usage: ismounted # usage: ismounted /dev/ if command -v findmnt >/dev/null; then ismounted() { findmnt "$1" > /dev/null 2>&1 } else ismounted() { if [ -b "$1" ]; then find_mount "$1" > /dev/null && return 0 return 1 fi while read a m a; do [ "$m" = "$1" ] && return 0 done < /proc/mounts return 1 } fi # root=nfs:[:][:] # root=nfs4:[:][:] nfsroot_to_var() { # strip nfs[4]: local arg="$@:" nfs="${arg%%:*}" arg="${arg##$nfs:}" # check if we have a server if strstr "$arg" ':/' ; then server="${arg%%:/*}" arg="/${arg##*:/}" fi path="${arg%%:*}" # rest are options options="${arg##$path}" # strip leading ":" options="${options##:}" # strip ":" options="${options%%:}" # Does it really start with '/'? [ -n "${path%%/*}" ] && path="error"; #Fix kernel legacy style separating path and options with ',' if [ "$path" != "${path#*,}" ] ; then options=${path#*,} path=${path%%,*} fi } # Create udev rule match for a device with its device name, or the udev property # ID_FS_UUID or ID_FS_LABEL # # example: # udevmatch LABEL=boot # prints: # ENV{ID_FS_LABEL}="boot" # # TOOD: symlinks udevmatch() { case "$1" in UUID=????????-????-????-????-????????????|LABEL=*|PARTLABEL=*|PARTUUID=????????-????-????-????-????????????) printf 'ENV{ID_FS_%s}=="%s"' "${1%%=*}" "${1#*=}" ;; UUID=*) printf 'ENV{ID_FS_UUID}=="%s*"' "${1#*=}" ;; PARTUUID=*) printf 'ENV{ID_FS_PARTUUID}=="%s*"' "${1#*=}" ;; /dev/?*) printf -- 'KERNEL=="%s"' "${1#/dev/}" ;; *) return 255 ;; esac } # Prints unique path for potential file inside specified directory. It consists # of specified directory, prefix and number at the end which is incremented # until non-existing file is found. # # funiq dir prefix # # example: # # ls /mnt # cdrom0 cdrom1 # # # funiq /mnt cdrom # /mnt/cdrom2 funiq() { local dir="$1"; local prefix="$2" local i=0 [ -d "${dir}" ] || return 1 while [ -e "${dir}/${prefix}$i" ]; do i=$(($i+1)) || return 1 done echo "${dir}/${prefix}$i" } # Creates unique directory and prints its path. It's using funiq to generate # path. # # mkuniqdir subdir new_dir_name mkuniqdir() { local dir="$1"; local prefix="$2" local retdir; local retdir_new [ -d "${dir}" ] || mkdir -m 0755 -p "${dir}" || return 1 retdir=$(funiq "${dir}" "${prefix}") || return 1 until mkdir -m 0755 "${retdir}" 2>/dev/null; do retdir_new=$(funiq "${dir}" "${prefix}") || return 1 [ "$retdir_new" = "$retdir" ] && return 1 retdir="$retdir_new" done echo "${retdir}" } # Copy the contents of SRC into DEST, merging the contents of existing # directories (kinda like rsync, or cpio -p). # Creates DEST if it doesn't exist. Overwrites files with the same names. # # copytree SRC DEST copytree() { local src="$1" dest="$2" mkdir -p "$dest"; dest=$(readlink -e -q "$dest") ( cd "$src"; cp -af . -t "$dest" ) } # Evaluates command for UUIDs either given as arguments for this function or all # listed in /dev/disk/by-uuid. UUIDs doesn't have to be fully specified. If # beginning is given it is expanded to all matching UUIDs. To pass full UUID to # your command use '$___' as a place holder. Remember to escape '$'! # # foreach_uuid_until [ -p prefix ] command UUIDs # # prefix - string to put just before $___ # command - command to be evaluated # UUIDs - list of UUIDs separated by space # # The function returns after *first successful evaluation* of the given command # with status 0. If evaluation fails for every UUID function returns with # status 1. # # Example: # foreach_uuid_until "mount -U \$___ /mnt; echo OK; umount /mnt" \ # "01234 f512 a235567f-12a3-c123-a1b1-01234567abcb" foreach_uuid_until() ( cd /dev/disk/by-uuid [ "$1" = -p ] && local prefix="$2" && shift 2 local cmd="$1"; shift; local uuids_list="$*" local uuid; local full_uuid; local ___ [ -n "${cmd}" ] || return 1 for uuid in ${uuids_list:-*}; do for full_uuid in ${uuid}*; do [ -e "${full_uuid}" ] || continue ___="${prefix}${full_uuid}" eval ${cmd} && return 0 done done return 1 ) # Get kernel name for given device. Device may be the name too (then the same # is returned), a symlink (full path), UUID (prefixed with "UUID=") or label # (prefixed with "LABEL="). If just a beginning of the UUID is specified or # even an empty, function prints all device names which UUIDs match - every in # single line. # # NOTICE: The name starts with "/dev/". # # Example: # devnames UUID=123 # May print: # /dev/dm-1 # /dev/sdb1 # /dev/sdf3 devnames() { local dev="$1"; local d; local names case "$dev" in UUID=*) dev="$(foreach_uuid_until '! blkid -U $___' "${dev#UUID=}")" \ && return 255 [ -z "$dev" ] && return 255 ;; LABEL=*) dev="$(blkid -L "${dev#LABEL=}")" || return 255 ;; /dev/?*) ;; *) return 255 ;; esac for d in $dev; do names="$names $(readlink -e -q "$d")" || return 255 done echo "${names# }" } usable_root() { local _d [ -d $1 ] || return 1 for _d in proc sys dev; do [ -e "$1"/$_d ] || return 1 done return 0 } inst_hook() { local _hookname _unique _name _job _exe while [ $# -gt 0 ]; do case "$1" in --hook) _hookname="/$2";shift;; --unique) _unique="yes";; --name) _name="$2";shift;; *) break;; esac shift done if [ -z "$_unique" ]; then _job="${_name}$$" else _job="${_name:-$1}" _job=${_job##*/} fi _exe=$1 shift [ -x "$_exe" ] || _exe=$(command -v $_exe) if [ -n "$onetime" ]; then { echo '[ -e "$_job" ] && rm -f -- "$_job"' echo "$_exe $@" } > "/tmp/$$-${_job}.sh" else echo "$_exe $@" > "/tmp/$$-${_job}.sh" fi mv -f "/tmp/$$-${_job}.sh" "$hookdir/${_hookname}/${_job}.sh" } # inst_mount_hook