From 54f591848736b27804f8aa7190441ea28501f4b1 Mon Sep 17 00:00:00 2001 From: vspader Date: Mon, 4 Sep 2006 18:06:23 +0000 Subject: [PATCH] Added basic preferences framework. --- Cog.xcodeproj/project.pbxproj | 56 +- English.lproj/MainMenu.nib/classes.nib | 6 + English.lproj/MainMenu.nib/info.nib | 6 +- English.lproj/MainMenu.nib/keyedobjects.nib | Bin 66201 -> 66417 bytes Playlist/DNDArrayController.m | 1 - .../General/English.lproj/InfoPlist.strings | Bin 0 -> 204 bytes .../English.lproj/Preferences.nib/classes.nib | 20 + .../English.lproj/Preferences.nib/info.nib | 24 + .../Preferences.nib/keyedobjects.nib | Bin 0 -> 1939 bytes Preferences/General/FileDrawerPane.h | 17 + Preferences/General/FileDrawerPane.m | 20 + .../General/General.xcodeproj/project.pbxproj | 311 ++++++++++ Preferences/General/General_Prefix.pch | 7 + Preferences/General/HotKeyPane.h | 17 + Preferences/General/HotKeyPane.m | 20 + Preferences/General/Icons/file_drawer.png | Bin 0 -> 1904 bytes Preferences/General/Icons/hot_keys.png | Bin 0 -> 1374 bytes Preferences/General/Info.plist | 26 + Preferences/General/PrefPaneController.h | 23 + Preferences/General/PrefPaneController.m | 34 + Preferences/General/PreferencePane.h | 31 + Preferences/General/PreferencePane.m | 57 ++ .../General/SS_PreferencePaneProtocol.h | 50 ++ Preferences/PreferencesController.h | 18 + Preferences/PreferencesController.m | 40 ++ Preferences/SS_PreferencePaneProtocol.h | 50 ++ Preferences/SS_PrefsController.h | 76 +++ Preferences/SS_PrefsController.m | 579 ++++++++++++++++++ 28 files changed, 1472 insertions(+), 17 deletions(-) create mode 100644 Preferences/General/English.lproj/InfoPlist.strings create mode 100644 Preferences/General/English.lproj/Preferences.nib/classes.nib create mode 100644 Preferences/General/English.lproj/Preferences.nib/info.nib create mode 100644 Preferences/General/English.lproj/Preferences.nib/keyedobjects.nib create mode 100644 Preferences/General/FileDrawerPane.h create mode 100644 Preferences/General/FileDrawerPane.m create mode 100644 Preferences/General/General.xcodeproj/project.pbxproj create mode 100644 Preferences/General/General_Prefix.pch create mode 100644 Preferences/General/HotKeyPane.h create mode 100644 Preferences/General/HotKeyPane.m create mode 100644 Preferences/General/Icons/file_drawer.png create mode 100644 Preferences/General/Icons/hot_keys.png create mode 100644 Preferences/General/Info.plist create mode 100644 Preferences/General/PrefPaneController.h create mode 100644 Preferences/General/PrefPaneController.m create mode 100644 Preferences/General/PreferencePane.h create mode 100644 Preferences/General/PreferencePane.m create mode 100644 Preferences/General/SS_PreferencePaneProtocol.h create mode 100644 Preferences/PreferencesController.h create mode 100644 Preferences/PreferencesController.m create mode 100644 Preferences/SS_PreferencePaneProtocol.h create mode 100644 Preferences/SS_PrefsController.h create mode 100644 Preferences/SS_PrefsController.m diff --git a/Cog.xcodeproj/project.pbxproj b/Cog.xcodeproj/project.pbxproj index 3fec52e7c..3d3d8d72b 100644 --- a/Cog.xcodeproj/project.pbxproj +++ b/Cog.xcodeproj/project.pbxproj @@ -11,6 +11,12 @@ 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; }; 8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; + 8E07AAF10AAC910500A4B32F /* SS_PreferencePaneProtocol.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8E07AAEE0AAC910500A4B32F /* SS_PreferencePaneProtocol.h */; }; + 8E07AAF20AAC910500A4B32F /* SS_PrefsController.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8E07AAEF0AAC910500A4B32F /* SS_PrefsController.h */; }; + 8E07AAF30AAC910500A4B32F /* SS_PrefsController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E07AAF00AAC910500A4B32F /* SS_PrefsController.m */; }; + 8E07AB780AAC930B00A4B32F /* PreferencesController.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8E07AB760AAC930B00A4B32F /* PreferencesController.h */; }; + 8E07AB790AAC930B00A4B32F /* PreferencesController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E07AB770AAC930B00A4B32F /* PreferencesController.m */; }; + 8E07AEEA0AACA08100A4B32F /* General.preferencePane in Resources */ = {isa = PBXBuildFile; fileRef = 8E07AEE90AACA08100A4B32F /* General.preferencePane */; }; 8E0AD92B0A338CFF00215AEF /* Shorten.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8EA9172F0A336CC30087CDE2 /* Shorten.framework */; }; 8E1296DA0A2BA9CE00443124 /* PlaylistHeaderView.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 8E1296D80A2BA9CE00443124 /* PlaylistHeaderView.h */; }; 8E1296DB0A2BA9CE00443124 /* PlaylistHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E1296D90A2BA9CE00443124 /* PlaylistHeaderView.m */; }; @@ -171,15 +177,9 @@ 8EFFCD720AA093AF00C458A5 /* UKFNSubscribeFileWatcher.h in CopyFiles */, 8EFFCD750AA093AF00C458A5 /* UKKQueue.h in CopyFiles */, 8EFFCD770AA093AF00C458A5 /* UKMainThreadProxy.h in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 8EB44F4B0A2BB82B00AA711F /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 7; - files = ( + 8E07AAF10AAC910500A4B32F /* SS_PreferencePaneProtocol.h in CopyFiles */, + 8E07AAF20AAC910500A4B32F /* SS_PrefsController.h in CopyFiles */, + 8E07AB780AAC930B00A4B32F /* PreferencesController.h in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -196,6 +196,12 @@ 32CA4F630368D1EE00C91783 /* Cog_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Cog_Prefix.pch; sourceTree = ""; }; 8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 8D1107320486CEB800E47090 /* Cog.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Cog.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 8E07AAEE0AAC910500A4B32F /* SS_PreferencePaneProtocol.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = SS_PreferencePaneProtocol.h; path = Preferences/SS_PreferencePaneProtocol.h; sourceTree = ""; }; + 8E07AAEF0AAC910500A4B32F /* SS_PrefsController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = SS_PrefsController.h; path = Preferences/SS_PrefsController.h; sourceTree = ""; }; + 8E07AAF00AAC910500A4B32F /* SS_PrefsController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = SS_PrefsController.m; path = Preferences/SS_PrefsController.m; sourceTree = ""; }; + 8E07AB760AAC930B00A4B32F /* PreferencesController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PreferencesController.h; path = Preferences/PreferencesController.h; sourceTree = ""; }; + 8E07AB770AAC930B00A4B32F /* PreferencesController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PreferencesController.m; path = Preferences/PreferencesController.m; sourceTree = ""; }; + 8E07AEE90AACA08100A4B32F /* General.preferencePane */ = {isa = PBXFileReference; lastKnownFileType = folder; name = General.preferencePane; path = Preferences/General/build/Release/General.preferencePane; sourceTree = ""; }; 8E1296D80A2BA9CE00443124 /* PlaylistHeaderView.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PlaylistHeaderView.h; sourceTree = ""; }; 8E1296D90A2BA9CE00443124 /* PlaylistHeaderView.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = PlaylistHeaderView.m; sourceTree = ""; }; 8E1849C40A43DB5C0084C69D /* MAD.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MAD.framework; path = Libraries/MAD/build/Release/MAD.framework; sourceTree = ""; }; @@ -385,6 +391,7 @@ 080E96DDFE201D6D7F000001 /* Classes */ = { isa = PBXGroup; children = ( + 8E07AAEA0AAC90DC00A4B32F /* Preferences */, 8EFFCD410AA093AF00C458A5 /* FileDrawer */, 8E75752309F31D5A0080F1EE /* Feedback */, 8E75755D09F31D5A0080F1EE /* Updates */, @@ -453,11 +460,12 @@ 29B97317FDCFA39411CA2CEA /* Resources */ = { isa = PBXGroup; children = ( - 8EB44FF90A2BB8B300AA711F /* Cog Help */, - 8E7575D909F31E930080F1EE /* Localizable.strings */, + 8E07AD280AAC9BE600A4B32F /* Preference Panes */, 8E75758E09F31D800080F1EE /* Icons */, + 8EB44FF90A2BB8B300AA711F /* Cog Help */, 8D1107310486CEB800E47090 /* Info.plist */, 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */, + 8E7575D909F31E930080F1EE /* Localizable.strings */, 29B97318FDCFA39411CA2CEA /* MainMenu.nib */, 8E7575C309F31DCA0080F1EE /* Changelog */, 8E7575C409F31DCA0080F1EE /* Cog.scriptSuite */, @@ -481,6 +489,26 @@ name = Frameworks; sourceTree = ""; }; + 8E07AAEA0AAC90DC00A4B32F /* Preferences */ = { + isa = PBXGroup; + children = ( + 8E07AAEE0AAC910500A4B32F /* SS_PreferencePaneProtocol.h */, + 8E07AAEF0AAC910500A4B32F /* SS_PrefsController.h */, + 8E07AAF00AAC910500A4B32F /* SS_PrefsController.m */, + 8E07AB760AAC930B00A4B32F /* PreferencesController.h */, + 8E07AB770AAC930B00A4B32F /* PreferencesController.m */, + ); + name = Preferences; + sourceTree = ""; + }; + 8E07AD280AAC9BE600A4B32F /* Preference Panes */ = { + isa = PBXGroup; + children = ( + 8E07AEE90AACA08100A4B32F /* General.preferencePane */, + ); + name = "Preference Panes"; + sourceTree = ""; + }; 8E75751A09F31D5A0080F1EE /* Custom */ = { isa = PBXGroup; children = ( @@ -660,6 +688,7 @@ 8EFFCD410AA093AF00C458A5 /* FileDrawer */ = { isa = PBXGroup; children = ( + 8EFFCD540AA093AF00C458A5 /* UKKQueue */, 8EFFCD440AA093AF00C458A5 /* FileIconCell.h */, 8EFFCD450AA093AF00C458A5 /* FileIconCell.m */, 8EFFCD4E0AA093AF00C458A5 /* ImageTextCell.h */, @@ -678,7 +707,6 @@ 8EFFCD470AA093AF00C458A5 /* FileNode.m */, 8EFFCD520AA093AF00C458A5 /* PathNode.h */, 8EFFCD530AA093AF00C458A5 /* PathNode.m */, - 8EFFCD540AA093AF00C458A5 /* UKKQueue */, ); path = FileDrawer; sourceTree = ""; @@ -710,7 +738,6 @@ 8D11072C0486CEB800E47090 /* Sources */, 8D11072E0486CEB800E47090 /* Frameworks */, 8E757AEC09F3265E0080F1EE /* CopyFiles */, - 8EB44F4B0A2BB82B00AA711F /* CopyFiles */, ); buildRules = ( ); @@ -742,6 +769,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 8E07AEEA0AACA08100A4B32F /* General.preferencePane in Resources */, 8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */, 8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */, 8E75758709F31D5A0080F1EE /* SOUNDTODO in Resources */, @@ -840,6 +868,8 @@ 8EFFCD730AA093AF00C458A5 /* UKFNSubscribeFileWatcher.m in Sources */, 8EFFCD760AA093AF00C458A5 /* UKKQueue.m in Sources */, 8EFFCD780AA093AF00C458A5 /* UKMainThreadProxy.m in Sources */, + 8E07AAF30AAC910500A4B32F /* SS_PrefsController.m in Sources */, + 8E07AB790AAC930B00A4B32F /* PreferencesController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/English.lproj/MainMenu.nib/classes.nib b/English.lproj/MainMenu.nib/classes.nib index 5b3e6ca70..9d01297d9 100644 --- a/English.lproj/MainMenu.nib/classes.nib +++ b/English.lproj/MainMenu.nib/classes.nib @@ -125,6 +125,12 @@ }; SUPERCLASS = NSTableView; }, + { + ACTIONS = {showPrefs = id; }; + CLASS = PreferencesController; + LANGUAGE = ObjC; + SUPERCLASS = NSObject; + }, { ACTIONS = { changeVolume = id; diff --git a/English.lproj/MainMenu.nib/info.nib b/English.lproj/MainMenu.nib/info.nib index 9679d38a3..375b72d22 100644 --- a/English.lproj/MainMenu.nib/info.nib +++ b/English.lproj/MainMenu.nib/info.nib @@ -3,7 +3,7 @@ IBDocumentLocation - 71 108 639 388 0 0 1024 746 + 33 358 639 388 0 0 1024 746 IBEditorPositions 1063 @@ -29,12 +29,12 @@ 564 IBOldestOS - 3 + 4 IBOpenObjects - 463 29 21 + 463 IBSystem Version 8J135 diff --git a/English.lproj/MainMenu.nib/keyedobjects.nib b/English.lproj/MainMenu.nib/keyedobjects.nib index bd689c6967c2a9a57c411f500f2f4b7f29ffc355..0fd607ed7698b97b2b443f83fbcff121b94d516c 100644 GIT binary patch delta 39758 zcmbrm2Vhi1@G$;*yYk+z9{0+-0SxEfr2E|qJ{HQ}0bt+`HI2G^DA z!S&^GxYxL$Tpm}zm2hLZah#i*%)QCY{3w1jKZYO6kK-rs9v<-%`ANKcYWc^R{9JxMzkpxJFNUAX_*MLS{0ICd zejC4?-^(B35A)yhKk+~Fzw>wa`}|-0BmRj%3bbG$j*zK>LkJbZgeW0eh!tG$cZyI` zs3X)B8VZesWVWp_|Z47$6K23WOq|SQz0J#tRdKX~OHmo5Dt^N9JEdCWXv{$mN@uy929N;n~W!*&-=vYEmu;k0mG_)fSe z{3Ki!t_atK8^RsoPvO4sL?ncCkrZiB7VV(PE64BqodX#KvNCv4z-Hbhi^b zh#6ESiSxw;;xciyxJKL{e&i)U z+$e4mw~5=uPsPu~ed2!ci1>wgOgt{07QYq06TcUK5`Pn~ioc7u#QWj{@h|aT@v%fn zw9rrz;M?Se9~Submx82VsfrXK#Y)MNOG=TdNwuX$QmWKgY9h6iI!GO*PEu#@W=Y+p z-clc_zcfG^BIQc?Qh`(=l}clzv64qZ(o|`h^p-SBnk~(d7D=& z45^03hE|4-hE9fVhVF(eLqEe1L#|<{p~z5d7)RVE9vH?OCP+bsNru-AvkaPHo?*UW zf#Ds)GQ)DiTEj-eCc~$O{e}aEqlT{xrwpeJ-y41~{OC4ZH2i9~Zn$B%X}D#$XL!Ib zF#Kis*YMa#8EK;1w8|exyIL|AY*~C#8_$^V;pPr7^fLuH%>RsHEKrpJmY-h zJH~g7ON^^XH$U3=o^ic2%ecY#k#Q?=!nobbaO3CYzYiL}hTdbw0Q$jXj!VatR|P4)|fV$HbKi~y=5o4+qBDcz;qB= z+=uk0V-#&VZaQuH*7Sokiyv*eVEWZ`*>uJ9o9TvOnd!FaPtzmQzoy4#%1oOjX_nbw zHkz&Q+h+DNJIoR0NOP1q+8kp}FjqI%HMcN#Fn2TeG!HT7nqM;yH4itBF^?r4n?2^q z<{9QWX3hMzd9k^SYHD8THm`$UAHsl*=1t}u=1$~!-8f0 z&X{YyC!QB0Hp6vQrK+Zk4OZadK4{ z6>oefyQCnwrrc0&1YfCgbGe1wR&FP|JIiTuH@UmqTka$Gmj}p0*tc34X%16pJ zWxKM2T&C<+_K>@k!^#ngR*owt$TRTyEagysR4$S?l`G0`ZsnG8Px(`Mto)}^Dy{OW zph~K$+Estbp@yo_c$ivMjaQRZms%GiRvW8rh(XFqVvyQV?WYb=3)N97QdX)H)oJQ< z^-XoAI$vF)E>+)CSCePd4eEAvuewh?s2*0oP*17fso#@R)nC+W>UDCr>b|EwR3DMc zEVM(sgGA_X^K~6X@gf~>5Nxp>5f-r>5Ero z$+6^Fh8eC~@-4{nhGmZ7hGnkhZOdZIJC-ubO3NzCddtU>%d*w-x#h6sgykE{NjLmD zOV+krwESfG)pEsh({ju5m*qdp6Dwimtpc;xs#>kqAZ4XB*cxh$w^p-Ox7M&WRI5Tu zOKT@<4{J7j>Texr9cCS2bz42wH;F;knbuj>Io2f%PiI?KTh~}OSvOlhvF^0)w;r$_ zqJN+-SdUvzSkGF|Tiride`Z=(uUl_f?^_>OA6uW;gz^jLKjsNb*i@UvX19et(-v!s zvn8_KZAomVE!pO>)wMOTHMKQ^pRH^i$z|MiTNhiptvk8f*4LJ0>t`E6PPG--3Mtw) z(l&~`X>;2=w&}`B+jQF-ZreiJa@$(lM%yOaX4@yWowi-J1Ga;<TXA%6{7Zt^JJsEPS1Vuk*$+_V0v0 z?cdvfuwStMXuk+Qf3p8^auMDYqtHa;Q?Sh>o5B&)cn5wl>Kji z)!*Xp=WmyrlO_KC_G|tD{*nH!fE7fh!@`_(SRFQppTq9(cLX>B9S(=n5#$JVgg8Q} zzK$?QxTA_A!V&3+azr~~9I=i#M^#6>Bf*jANOB}=SBzCPi>buoa63E>9X1m#0-`T*~(AmhD>TK+6q6Nsc>-TZ?b!IvHIkTPpodcW$ojJ}y z&cV(h&Rlw$^EKyCXP$GIGv8U@EOZWc7CDQZCC*ak2#vrmeVizMO3-O~ooQF`E{abD*tK!I6TjtaYA}RLfmi6^NAUhzY zho|=`_BLT>@342-d+eXxJEphK?w^y_qhoq{L21!|97J|PWM@RSJjXs@|6>1U|6w1p zkJx_!r>OCSov6l{wGNGi0Lto!?5U&d_5w<-roQ}Iu>3k0B_g{cvIipDA~F+^?Gf4W z6#I|Piw3}nMu;7vFFm(Mvx324t#k4U-D#=bMKvYrWEKx87>OGz&EEp%Z-vM#eg57r z&fi9#ziq{m5ZMQjePMnNY(JjNeJ6!im+^!IY4 zKOzU{92xjLNrSk-KvFJZ-bKs@I!Q}kI592Uh^M>(N`_S8O=gq+1*Q6A-l@iGlbb}>f4W8l=qF+9 z`8xKYFLEE_pUO>xwNBRs>T;9DmEh+9yoTY6b@;-U!o%TN0Pu@+_$HRs$(9vkGK*O^f$@4mzq!yuW6QCJTP&oQ2HM|07EQowpN3-Y!G`tP(F7F3u z{4p9tzKzJm`tH8-%`1 zD-ZgW2mQKSpLXdB({j2{@lW-usb!UN$Yg*_LF6hOvg`#&?=8aD@Cow3mQjJ3d;|72 z-;i&FFD5>fZ_GC#GWn)_Gp(#;>-d&@E50?~hHuNazLj#w|}S7lDwRfW(E2AAb15um2thx&nDLE zxQ+oXkJZ;ltmjw2JgFWlB2Vbktj;XS?w^;_EjMSRZxp|pUjw7oBJvy}@9D#|ac$N3 zb^JPhJ+SHu-HP9c$W!|N)1qe^BELON6F z_3SV&(JI)5z%s!m_#yH)ME+hT_zMAuyo|^zh`jzSnMyVx>yb?fJK0|d(wrUZlU20t z9pkcN=nZA`1|szo(TZLUxZ{Kbz(cPT;yoZjf0PM{LJ}fxBJviX0fVV){=l4~yxjbp zQ$jVe9spD)j*<ASt?M+n zdv_v9$Rvso`4|{Yg?d(>Bw7J2y@|>134MgVLYB}^$VTLUh@ufCAtEcxlke;c+ zKq8<1m6##q06<6h8Y1M;lgAsC#^XgN4xNbFhkpz7S6pT%qkORX=l@7 zbx_SK+`NVQ3E=}bR$nJoAz0i+13dldwZg**2 z9}}j+4B1VzT`lYp_6qxi{lWp^pjMpT)cFM+ zN}Od)^h_4m5-cDxrrgREzSd5pH0(qV^Zg!%CG5w7ZO%QLF@+HMNBpzXHyO@@uUr(MaYV|^g}CHyV? zBRmuy@$2+0|4&Ql+SSewlh^WVMYtFEbD}6pqCqr@Chgs>i6+n)qQ%Qr(N8l2e# zLUV1gCL+%xsyU)s;bRJtCN{z6cC{AXJ;cyb#0{;9qhcGaZTI-N_WYSL{tTR1ENx6{ zsIsk?RHCcVOaGICoy$lenrZFsMs z8WnPQTRaMFBH%&PFnoDa?Ya-h&L5DISMRA1HWj~N?+N|1y}fKcWKG4h(AHP`wO3?= z3S>>i3xEvN^?gK@>d1;;umrsBgLuhj2{iBB$cNyzcpVVj)TtS*BN+KA1h;(%KJVS2 zW;q2Q$^Yp5p?V++tX<5X9)pSshCRz1qxb|y-PDr%M7w>Ql~{hZXw*6D)**ZN7yze4 zf;;vcFb7dc?`-(AQ<7wW1Qr7GCh48+o^~1~8+3x^1cIjMot=H1{2VDT4sL%J7!Zh> z2E87t$3U=62ZJZ%8%4B{Lb17_J?;}w!6<-?V(&?yH~{c1ol!GhV3gNLl&W&1l%U(1 zX??3zLQn$`)Y1`XI)d4+LQoeF)YlR0?pwPOf@XlAg^pm6j$r<)5VQsaZFL0IvN|+; z&gPQ3Na;kTlmRvui>)B)T|_NL6qvF5J@tJ|U<##7oe7_21ytxzX1J7v+Ykv?7nrQr z4(nN1lr!Qv9m*6*IXbMNUtq;{6C~*e9(&m-Y zX5s;n3PGdhMcE^Biq1+O>xSe(Z1@q?q^;667`{WS#pFplwb}h69G?=C*GZpApG&)? zJys1%4ykGPRkcLA^Mnv@-fNUpT05s%f~bv z52g=86Dj(CfoQe+G4}%)h>C!y_p*NLf=&SV_+)~cQ z_mE+rbg29u+Bmq4PDg(E9K$tkNE7}rnQ0hf7^`(0;;ImFevZKd%B78dLa)J=dj#Kc zB1Rdeu=fnpJkt;bmkB7Y8!sGQ!*uLp8s6YY!<)K~Nr7Gld6G|c8i!(7CU z)qTuy+T$Tn6*L$Y8W!maj=GCz64OAHhszA_0?<-K-NQiCpBdf=6&L`96~yG#hBCuS z!z#mjhSi2Oh=SV$?ApH(^$<~Do&D$O{ahHxu#o-Fu&&}lK-67rMQ(7EFK%Vn>tXLaNols zTFg=`m=pc82Mh(*wxp;aFE8h*Z)><~_=mlxofulhRE`l^oZ7J*Egy zBU-^kl493WeSZdrr7g0qHSJ+ zpK@cp(XRJd5p74>ygb`es*FMWY;9{^WcLbvyxv#^A06<#X~(lC2dIf*?-}ECYC?6c z2ED*l@6j2Co5+^v%J~F+yNiJDVRdu;O}KV$|x%q<%ycbnv z$nn5Cu@0Fa(29AMsP z+>DWKLUgAU#w}Wt;W5wO_r_0*I{{=D0HEQ1FZAv)?uFic(EHJFzn4sS*mwl`zc79Y zBYqyp?5yo?5a1>$8dq0U5^ zXd=_Zm{^$Q^Wp)?29wD*i^+`WVwmLxyUJuSSpmuhFr7=*$(-Z`~!O**ts9&5>kxNG~%w&FF@ zP#`_eGz?fXYh-u764OYCiFs%dl4^8U9BT_h;z6GB%@s`7EZZrr-60 zM4v$PxBAAGTV|%4oM`$3(cfUpj6SJ{X-sz@Ok)BY?i2+7p3e}Qu41Fg^uVVt-yIiI zA)$P#32uDTUG3z!D$h%`nKg4nrkMw+-lxgqo4wF)Hp|ejK>uNF*!UI|z6>PV{lOrZ zgy^3UeHklpvgS*D8MBi}qCwqYU&b724kMDxRkR1=8+R?|fjQO;?zh>F=-&_nmIa)Z zpU?Pw8t`b$iRL5#axr=4YKT!0eHEgljEqPdVicV*<{A*%GS@WMGS}8-Oo;KT2RLKR z4b6?rspiJSB6AaSQ*%S@@Pw-7mJm{fj;7|u(AiFVG9gCp2!J)sX~YKj-e}IyYP!R? z?!ahsn%2u*J-in*HYARj`#_ZF8~AjJIBm{0_b1Mp+nEOv-S;ix zX;G-Yi~(wzmlBVtM&{+_66PwCk>!VJXYnP7-pVYL%L?POk zAv|ifgPp*54Y{9vYKNa={#oBOxWgH{ch{af66VY1E9T!ocCPZx%xQ=TKuio`q7V}e zQ3XWb{DE(2zG1%kG`VEH9@3ulS*TlhpK zWKyPNT3bAM5IJ5Wr?d_A-Sb|(Wxg!iWIrNPw#)uNz(nn}DLqqy8Nuxh?e-BzM+f+l{dO|kW1zRX^b z>&SHhdp*n)ZPC;o6^GPpmz(Gzi6>J7Yn9K)&yicP_sq4irNro#5+mUVNz2^4oZ_dp zAPnmO!)j?Ar}<*hKu@}k&OI%n;$neunQ*auG|f?AvJsQy^5{)X#I(TM2qxPg!2WE& zVeiQh?1XV`@o8sTy`X};2DkhgN6LA+y`1=ZT!k$0sd6!}2NcC>#I(l~F#$f_ zLFXvI4!LpY?4o1u_?&Yok7NIn#{*_J#*COwhyjh$7BOkhc){`{PL!u0<|($^pZCKu+;f*G{ir!9B&g@{`voZ+xWuD1Rugmp2$|%Nq@A) zyiFb~?+}fk3IzF6o{|pByX8HEN7`>rlMjfZd`LPVA7O^eUkbOmeWaU~#|c@|ZvGs} z$YX??d?YOEtY{+K#8~-zQj{+krg4`*pRAW>(#J(fzARsnf0M8BsUW-8iAf{}0``Y| zTfQS5l<&!Z%J<>wIw9?$BjktjBl%zXvCvO`q7eLAQeq!-pwbjh;T3_)QY6Ko7~RAe zDMpcnK3pHBP_dG%G0t$;Tw4hc4eX!91SJU4mMMl`lrSZnXrn|Zk^DMtlGH+pRpOMY z(jl%G!b%I3WW~kXq$Nsqr3P;iFA|VCGq#{1@TD|R8k%F3RAQ9K5#tQgO;?o`N=u~` zlPIJrZIyO}dn7U1P{u_nos~4{GbNqd$W>RmDc!jhhLzj~`5mUnbXV!iwNm$%NM0!+O1Zn{iAJ|F+VGzFGUU|8D-#sA z$Sa7L$eolvSEd+NE7OFg%5=o^LvCguVkUqmikR2IVM7c^WFN%LgYYOb9}XO17U2js zv(5v>WO<0x5OoPLA0Y;EgMNqtKj9`~HsbI&a|}^u5Cf+TP5}g0LCv{6q4?C`^x*+S zHT2X%Oh-h4Ze`;Ay6xoQH_*i4Vu5>c}eI}=eb`$WVn zN6bY}Ys9?e0i)<}}k zcRCdBLE##NobrqNLedS7Z88A+RrPdrsJur^eqR{~>hM$fOQoTbrVLhq%enY~!J&cE z0NV&#!i)kId3sk~vAew3(zj%&+fuxBTX?A;mT=z;^)9t*8>k!@mDZ**{PW;D0sK?% zbp_zVbntvHcv_Q}0J?n>?*qsKK1dJ;n0RLGuF=F6AP4JBKjOl@s zSh)qI#pUG$$`i^>c@Q(%GtyJqr=l}!a8dT?@)0WI9WnLU5&iQ@b50W4pc(KK{|03jt0eh zk`VJITpF0{7pxAY1Rr2EoFml;FTdYH%q)GQW_#IP?sBRzoT$bjMt3=xlfb)9g*o|Q z-U3xkSZ3zc1n@VwR$B0~u&4E?PviRD!nDe9eO$~j2A|%xV#OI2Um_G<5{aW~eIT-- zkH`f&kqf;_s%_PFu+k2Q zor>56SVytbbk(7D!o_PcS1evsS{mKrO=W`o4qWAKh2u1C61PGb%0VO!?u}x&tCnId z3#u5a)=XUquRw5tVdV`v0u;4n5UZ0u*GW!Vm^7ZADB!1buLwqTfwAPL%BKT z{{`%&P|vZ}%ULgx%5-&X1(~WxXX`4&lz}->iM1)Rjwj$@fhTo)HjI9%RRlJEIbReemMr5J1LitS1%q`k^29@v&xItmM*a; zJf~&!)48Jjbiy*dr}IPobgtJHF0MHMAHol0i1gypsFxhV4cIt?Ls-sHyn?64!z<;_ z9S^v)pFJLPy9Ot#JJe6qo$4<2Q}r{2$5lh>9>jnRvKcX35VHv}VC{U32_%~#=40*j z!f>b(e6TRO>zBmjHHu5gRbu6<@=m3@yb;?rU^#&014bLO4%;4}D0;ta>1WE9e!gPq z+x4aI(1tInm4TOjQE|O;>7T$vc4-no9xbYwg%SUu){-O~$-O2Yb&)-|9dnV9^6yiJ)RpOt?D*QQ88@@DWE zkLV7_Da4%7t$#2`FJem)927V9KQ6x{9_f{KOGA#dr1~^El!k&q0)b9!AH3qGvNQ*f zmOhZPItbYHF9&h!x0|IMz;y7ze5b>F|0)L7%%?Ek_8q-8-oTTn7ud z4whpalclH~)0>o(6y^3WEy)>}kqc$>y83veF9phT+au;NtfsH-jlm-v-tbzQ^OWTj zt{S(TwtQ-mPX8f<)zt{bC&NR1!J+Dw?Mprg8yZfA1oIT3+5Q9rLAx_ zwfsz`kk#nFt2F6H5S~a+lwQVcxy(N-;~x^KF9{G@u2$G8m|B+AdaaIsnW6f>WAjTz ziG5=E2N?CJVs}{qvxF7By9@VDmz)tf*rUAtPUyloT4<-bN3?lXsoo?qp@=3 z9t~^2HvntY7SFEXwu;P7W*3!jHOb%OYv37&1!|p1aQ02$u&^c^vVohoQgQxEF9oly z%-gK?3NBflx~=>+Vij0Lh4G14HKS#&I}e-|Fxad?K7-8~21UydDH|ZwlJ7wn&!QNl z7zyG$5cBZYLlO}7fuPPJ9Jzs@4K@EI_ky<`(wfMT)?}TD5O`tzbSB!pOzhn;XJlAs zH|PZY>6rYNin|xhbJ~b}`#ELwQa*S=xi;3uK0dV2AKmGL*gzj2++;_@I{yF9{j6U3 z-;?cz=RcKa0w&)5V;@_4`RMMa?_Vp#hWO~lWQTV17IJtuF#G8S=0H^!`zN2GRE02V zDi;ZXGaN93fEbRMML@vHr~G?8OSrd0>3M#)dO5%UPoP@=H4)?mjqDoGfaq>TM5cA3 zb&_?mb&7SWb(;Jb8@$#xtTPk{6ZS%E3}Ryu8;#hWi0zF}3K+d?9Af)uDeFU9rF&Ng zl1k)0UFcjasSwDOH^|@1_mvt-fc&Qdk{YiEhofh)ohb*@#U>Y=U-ePD%*WNLtq^kzm6eB{QubSvPu`Ao2`& z;;aj%(dy0(s{XPg4==C4K@97T3e45?BVS#QR8+44k&47r>n>&jXe27<|m->848=j1`3|Df)*sXI%tg1eFsR(E_t*w`8=H4?(=xWXb;ebwmW>4S9XfZIiM85!R=X_V7 z?FXp(=k9VR<&U`yJjLzfBe_eEn|%aN1VWMsGC<5coPUBWA_-UOQk?8#`@%M7L1yV$ zqRM$q)%7Y2MY7%S(R4@G7;yFgWhFVA^*_j|JkECC2M;N#w{>HEjt&o$VBLV&x&H$K zuBPq33Iu-OQb4%3J7Qrql?a&M3xbMIHw2zO_2a0>GAa^3iweOcxsY`91fK)r4c3T>!>bi;a#;YugSvSvEe0qc1W4lL3xvy!2k`hjd2hz3MCTumiN;khisLdc*4 zQKqZFfi{Z7WeKT3@E+(bk@wJhFw?m#Obq5RjLA~mCBVc(L_c6y8mw}UVIkpyM`ioz z!`1=Qp$9V`9%+D8Dqt%>W)0#AkW+@V&~#kF4`CKaKSSEVgg@eDkPir5O~;9BxYQtF zvJ3Yx195_P7bKqXyB}ZxB*%9F!nZsRU>t560}yab@w2GAU<8Km3fB~k0q56c_@z6~kzy*0`_b$l5`?}dEJrSIv zdnb5)U1Q)RG|q2q#8(kkDKm8>oq!gM3|0#cdVg32n*$)Ae<=(BlfWX$Rxl3*`F}m@ z-b!Z=UK31-d6*1?`s-Lg8NjqK09M`~ldcbeR@pZiCW9{Ue}O+YA^(oq3TSlJ!8AI5 zK-1yzI$Gv!&yVm2fWdIgIoK?i0k1y09GG>#j?Xfz0mruc>mwjMju!)&cGyc2d^Dg7 zXoPqQjDp>VpTOX3;GTE?aVPu-;`E)yK)|fG@FpF@RKXs3n_$wrn4W)es~6~$zW@3l zyc!T6cq9Zf5R&KYLa*ZZ9V?DPX&+aU8Lq^_`5(jWBgP7;P%%Hs%U3!m@C2y49G1uZLc(Ae- zJd4*tzV3#?Lpw>!SEa+ax&Xgs2U0hm=m5 zf7MSUP;&|wr9iC%)dS8Y7Upvx2vCIqB@YmxAZub_fMO6h5I9M)5%zx`)T;vsN_CfZ+_96CM`)l^0_B{JAd%nHEUZ^F09PBsB?y)2LMEfNB zWcw8RRQojh>-JGv*2k%>*4jte*V#X`ueWcoe`Mci-(=rx-(vq*USr>8-)`Sw|HQu2 zzRUip{WJUL_TBb9_PzFf_Wb~J(0<5%*nY(Rh5bwWQTtcg7azCMtXsoF!GD9jgrb<; zh~0zOy@=h1*!_q-fY^hG-KKTe8m1L)ZAxy_Hf{|yGjRBBBlZqrVZZKa7q&X;LHWpI z7>L;a5c>pi1mZ}J%9yJ4sf4y#N|%(BO3>9aQs5tyl9XfieX0So zd8@aprC5BwAz)3tX{M7lqr?jU9$(S3B`|Z z>&R^f@aoEGa_baU9$lj{o@aLoclpEt??L(i{Ja{*oYDh7D&(8PvJ%hn%!sGLQbXT9 z@9w$t23D)}ly9|tA8XV~PpOvT`?GotopygKEE`j=JJjCId}fyFK8PA1uV5;QHd zI~>Y4|7E{Wa=AY2Y<3L$9x)2nQ@Wv~aG=tb7!R(-Aa1KbE z_8V5RuPHLypZ$<2lz$@`t`++&yNf-?9#tB$gV?L=6#5uDm)plqVvn(_MUnl09mOsH zJ90Er#12*vdsvB-@3Z6NKcrgVcKpsxBSx_6*~w64X&}Zb-J#wxRzAcIQKq=rq3q8} zI22P(7cYuNwut?jy~b@Y$Fj@Wsq$d?SDNW4|X#2{${|@E()Mo|M05^Vo|br?ey{uxHrmN;h_xQl0h4_t+Ke4_qY4 zvNPFY_Po54-D0@QE(FhFB6o>hsSM^{nfoZTkvW6R{rrn~G6H~S8IP=1F!%}#`}+!K5X)W+s04ZvSGM@O*R**8Ur zJ*5zAiTN^bVLygg!8hz;0)Yq7SLh3l&S-XtbV%r9t}XA8kC-Pa0z^tX%eUE5b}4s~ z{mHO~y}@oZ*8~IJAb-j3Hm9*WjJ1^rc9wjd{R9em-Iv6hY#}j8xXq4`?+B^vA@&5n z7Hs)+_A_u}Vx-U5x7hLQ9Hk$9T(L^KGg2Dfr7qE#>wyv3uq>LwR551#GdvVz6^1EK?U!?z`(&mn3Vwp-}A zh=#&4D2?5Un0mNG2TT%Wz!!0?C({EP1#tI6*aWJ7*eQs)g=k2Ne1*ua zh%UiNR-7d{kE88iS%Q%S_BcHX(P6lx2uu>NF`1^=Vxhpcourq%f^`%HHWhOoOd+TZ zrQvC^9*Bmu&cjuVWC3EDL)GdCu(GHn*o~(O5e-jNfz{s*(N07~A_`auHf*$RGyxHp z5dEee2Cs!EC<%Co(>B-_X^E(DV9C%`5e0Q;P-EH^J0gb=1+zox$T38Y!u6sgSU)vz z1{s%+f;msKf-r5@#NOa+e;40K;r0&PC($RD@3H|3`DlTb{cpE zZU(k(HuzN^A^M8$NA$z`n1YS+AZie<(xR&&Y6xPi9vK`73YPc~3`80%90`##5t9VA zCDibOrAb2>vtJJ;{uEK`5$OOU7f18(o1|_cW-Ow9*NdV5(~W6xr!He-7so?e;8Y11 z&m;)fbv<4LT!dlih^~iiUF?cMfp&o#(RujxqubzcAyg1hvvg~?Gn95SAY~A`1PQ3A zI|$z(<{I`O=+_aw1>4uyHTxUU1F>xl3B%72^#-B_A_`=p0Pa-?%7Q1sX5oT&;4=iy zytiaPnfI0qSQ)Tt%d$O%Bt@^()P3`)!1uK^`<7FI|7atONn6tQCsCB=;1+bypVSr~ zy5r`DBfbdn#fUFKd@15b078{+q%xCKX1K}}DDNsWRLZ3Mq%y5krjJU`P?;3vb(MTg zrH&})RWev*Mk@zY<~5ZWtI{Ktbd~9$QYTb0Q1MrpmMXbOIjz!fs&rSCGOOf8mD!}s zQpr6k^|{KFx>e=_m8`CGR++9UldQz3wQ(YxLP!_06k;-JL)Nz#_sEko*plhhg zj8o|$Dz#f>(p0*!N}Aj%ouN{vlzK{m0xRC3(t}hwK-sL4Wr|y+PAex>rkip?nV>Rp zDxIVa0rFR~cAxj!HIAdMi^^>YTDlB|}wmvFc`qsZ2+e1ah{jsni*zj!MHutXAnn zl^&onF)GtjrH3oPN=ap4^Ny>`5am0StfkV!R5Dhj{!poFDjBCTvz22i1B_!;dYsAx zsdNM7W0m<(C9NvcUZqE=OjVVv0|n??Ri=|lR&^`mR0_6jj>4+sG?g5z+)$afRHlYX z-BhW)D!Ei;vQ^5ee5g`~RAzumDk>STGHX<3ud-jI2dmT#}8O>acQ2B^@f0 zt1MONrYZ^i>80#dDNd!^skB|Cb5!b}0;I&MWIdIH-FD|INM)i`GC^fJsPsF^LB$W= zPtNpHfR(aJ^D6C7$^I%6sQ|gG%B)n{sMIY5q~5NQ+f>S?G9VR&DjB4b05?!2VRPE4 zWQfYZ#sOe=m3dudKmePlbUkH*N^&ZBM_I2j>s5*e{=-4Ituj-U@hSuVLHatV%rupb zS4mi7zDnk*bZwPRQ0Xoz^N~s>E5L>~RWeK^LEw9LsW8AI>q#8_O#cigSF$9}p>a zdYq`tiL^yWW8MAaLGmVfzkE@zuo4uzQcX!!x+s~jtEI{$Wr?yDUMasKW!h7Upc!#`I4N{}k8fq;yRc)=Nt3A~` zwN#w|Z;5|XeMemd?}h&a-V6V=dO|(vR=ujrLU0_{g{lNVjt>Yd^B=^3_ewjQ>gw%+gx^?tSiwn4Tbw%2TV@apu}ZJKR9yfyu8+dH-;wq>>> zwv)CWY*%boZP#o!Y`1K;ZFg;d+8)^cu|0w}rSpEGpTTdCpT}>e-&((2eqZ{X@%zc| znq9O<+UwbSLu8}`;vWm$_IK?|?aS?D_Eq+^daz?F1Uf#2@WvhpZ5)8G#t{f|osAUmKi zU{t`AfY|}>1S|L6dfti7W0t*650>=iv9ymL2N#NSRb%7rTeiFDh@J!&P zz}ta$1OE(s5cqfCL$`y3*Q|%Zi`1jwwdr*o9UNJXJV&u(wqvPdxueXn%CXwcHVXV>3kUE_74gSas~wlg$9KOMFw>U z>J*d~)Ger2P@kZ_LH&aI2jvD$4SGH3ji5J!-U^x>G(YIwpiMzrg0=>25BenNV9?2+ zZ-dST{TcKi=_(<^A!N-G71fL8(9sGUp-@y-q{|){xgb1NR#E|Ha z*pR9r2_Z=#u8_=-ULk!#`iBe-$qjieBrhaCq&Q@D$lQ>5Aqzqlg)9zP7V>Gx=OKGS z_Jte>ITZ3o$eoaTA%BNF40#mtIOItv8(JkaGBi3gHneJJLTI(nPN8X`?)1>Eq1{6> zLnnq#4xJi0BXoA?+)yoae(1u`C80Y*KMnmnbWiBM&;y}ghW-}%d+7Dho1uS%-U)pe zMusV20bz+@$zdsB)x&CrrG~W+OAAX6%L*G3HY{vh*u1bMVXMP7g`EuhKJ0SXt+3l+ zcf|33WJ@SEWetN2$5tm3Q^TqUGRc$J7MQB@jLDXlWC%Hk^TSJ__Wt191Bxe-A{ zFcDmY5FtevBg_#>gkOYzL|}w7A}k^@qGm+xh`JFCBHBdsi0B#7JECvIpooHqQ4#J4 z_uPop5nCd*Mr@DxBw}C0{)n$4jzye}xD@e6#N$XVQjK&(){d+jSwFI2WTVK&kxe5r zBj-lWi(C-7C~|S+yOB#Hmq(UGu8rIlxg&CCQU6=Xus%=(Ve5aL}x^Ii|!HKGrD(l-{_p^ zqUe(75z(WfCq>VWo*O+cdO`H^=(W-7qK`y>8U0oCvFPK`-$b8^z8(`96CD#9Q#B?b zCMm`hQ!S=OjJtkJ>zKAN?PEH|^o$uClN&QMW?0Oq7!)%p=Hr;XF{ffK#{3@hS1cJz z$Fi|}tQc#EHO0!YN~|T;85&JGE&5Z3ATN*nq_U+hrVwc1& zi(L`BGImYur?H>M?up$Odm#3^*xzFB$Nm*Z#EEfoTtZxuJI)nXEv|Z8&A8feo#G1P zisDM*M#PPZ8xuD!4#iE4TOPM5Zd=@rxSesI#hr{h9d{<~T-w(7O2PvZUJtHw8tZyw(=zIA-t`1bJ~<2%Kt z#dnME5#KYucYJpIfcPQt?!5RV@yp^@#IKBhFMdt@hw&TYH^py@-x0q%{@Vm8!Ie-g zp+-WjggOcJ5*j2lN@$+YA)#|ZmxPRj?1bEe{Di`UqJ)tNqZ7s^j8B-6usz}Pgu@BP z5`Im%lgKBkiH^jm#JY)16Vnp266Yl@NL-Y-IPu-YrHRWE%Mw>6zL&TraicqNOXAkV z?TKF{9!ortcrx*H;+e#YiB}S@CSFUtk$5Y~n&g+{pA?wnObSX0O$twnNQz3Tk<>6L zBWY$*S<=R&LrK3R-Aa0pOePzX{gVBY1CyP}LCI0cG0CyXiOJQH>nAr%?wFjO+%>s- za%S>?#jUva<}EHT zSqg4kI1xw?Ln#>*8?&-(@4YPByPofJ->>`n;X40`^E{5)$KRSSGB-1~HupA9HcvHAH_tTBHqSLLH?K7BGVd|(Gv}J~%}<$&%!kco z<|=cIx!!!-e8T*V`Ly|a^AF}9%|DxewODT9Y~gC*ZsB2pvH-j-d@TYkf-Nu>@fLWC zB#RV_Jc|kol0}t8wMCspn?;9(%tB#t&O&9Ow$NG_EFM{!SejazS?;pjW4Yh*kmV7} zqn4JIP)oR_v!$!0uVuJpq-C^atYw;IzGb0hqh+%t+p^uV!;)j!V=1%zYWc(Rx8*;p z*;ezc7FsQ~S_)XLvNE+Yv)XC3+v-0ndn<^Qqm`4Dhn2ropjE0>o)yuGX2r7-SPfbY zS&6MAR#K}mt83QFtyfyFv0iVz!Fs#(4(pxPhpdlSTU$e|W34l+i>(1`qIJ1-g*Dl_ z+L~rfw{EoVvF^9#S)Z~NSr1!}Sf8=JZnMPZkd3Pi&ITy5sj#8gG}*My~%^#b;wzF*)*sitRV7tlI#CDJEf3`NZFk5fiVB2WhG}}7c2HPfEwr#6zhi#W_ zuWg^L&{k%vw7p=fvDMp-+g`Grw0&c@%x|}OIJH4IJ?xNkK-2=PFc2Dh|+s)YhIWg_6Clw*O}T)BX==7HBSL0cbI38E7SF4QM@R6KD$v*aq4G+6~$VItV%fItH=; zS%d6AAdmyd34{Q-f{-8-$OnW51%g6ASP%{r1&ReFfRaF|pbStpC=XN!B7lgXau5l0 z5<~?tKul0Qs0qXdwSzdI9#B7s2Ra23frddNpfeyDNC~%beqCSX&r8F&|XFZclX zF!(6g9Bc))1>1umU?><4b^*JCJ;B~!KX3pz7#s=?2S3@*4O{~r z0!zVK@E!0I@HF^4WIkjO1XvDP16dE*1la=F2H62Ihd>}u2pr-9afkRp{2`H$7)Tr> z0a6GdL#iQE2pz(K@E}6SS%?a98*&%&4D!}tp2J!PGlyLcdmRoqxI1_{csuwx_&WqS zU>wpM@*S!js1D5ztqvUyT@ES-t%JegqQhl}s}9#4o;W;rcm+7Tb@<}&&2g6F631nZ zn;o}0Zg<@22y=9HbaV7@L^=96q8(!#;~f(nQykMBiySK)TOHdSg^qGZrQ-!hjicW2 zwd1tojN>QAuZ}+)e?yl;S3%c8H$XQ-cS3hVk3emqC!k2EC)6A22MvH`LUW+`&>|=S zN`#g}Y0w5JFaniA4bXAuCFmq{3i=iL1Nzr#w$nVPg-%PHmOE{B+TvvCgm7|ka(D7{ z@^(sh%5uteDsU=xDsd`vqBzw$bvgAo^*iyLPB~q2nsl0Sy6JS=>7LU=r&q8!u$8bi zu=TJ_Fgq9s<^XeoAz-dBBrFJqfrY^$U@@>bSQ-G!hULP_VIVbib~_-gn%_(r%1+!SsG-v!?fKM1#g+rjPOu5ctA1^0nx zz_a0b@Ip8NPK1}k>F^qOGrR}h2Ooxyz|X*C@cZyb@Tc$>@YnEZ_ze6D{2Kz8g;;=C zgjkQ*gxG@EhHyYQArJ^x1QLNl_#grhL5K)M93lacgUCk|Apk@Nq6^WB;3D{lLBtS3 zfjEy)BXo!xh+Bvkh|h>`h@Xf*&fA=KIPZ4e=X}8Vu=7!8YiEcv(i!FK2k;AzRM$*CoWH2Uby^rUFEvj)yWm%>gtMgMY;O8qFn=BLtL@0IM*oG zSl0yCB-d2e4A*SeJl8_kV%G{+nrppln=8+C*!8^YMc3P|A6$R90Sn!hxvg~DUZbNRT-A3KcxEb9h+^)D?bGza8(Cx9?Gq+Ffi`-YcZ*o8C z?&uD4cXoGkN4kf)hq*_%N4v+lr@NQBSGbeitKDhtJoi)XBKKkU)9xegXWWhM6YiJY zuewjUzeBD?u19V{ngGbH$n8io4J1edLU8AAS4klL*g;&an?ibVf47@aoOXl$6b&69xps*JePR_J3J419`QWpY3^z7>FDX^ ziSkVKtn{RL_IsZ7obY_&`P}oB=Nr#y&l%58o?kq_q2{3$qn4poqSm1{qD)YxD07r0 z$_8bJvPT7@Qc!8AOjI^17gdd7p_)*=C>~0H5~5C{Mp0)`a+Cpe19cDe6!jeS9`)I4 zsn;g29e~$=UMIYuUY=fIUJ+i=UU6P{uS~COuRO16uQ4x$*Lg3sm(I)RHQ{x|>zdaM zuMghyy;pc|^xo`!(EEt@QEzi^OK-5Zt2fdcveJXrNJ|}&s zKD9n9pL(BBpL0GJeJ=Z4^||Zw%;&Z5EMHS!Gv8gldwuu$9`HTv3-^ujjq^?LP4rFi zP4~_8>jY3Vp@C5?`tB8Q(Eqh3|F0rG6{?R{5>*Tkp5YZ-?J5zde2j{Ve>f{6hS& zemK7sRha@;m8A^<(%k{p$Ui{Dgj2{I2;;`Q7w;=J(R?wclI6 zkLbndb?6;vbF>xO7HyA)pxw|RXe=6sjzY(x)6u2q3N#sAji#YH&?59OdIWt2Ekj>H zKSn=8zeK-5ze9gR|3LrtU+wSYkMMW(2ax_Ke;^Vua1MwH zhz&>xND4>}NDascI2phT5CjYchysQKMgpV(=L6mcd<^&!@IByHz~BF|yXFQi00I{W zE)854xFv8~;EurEfqMgw2AT(21=<9n0x^Lxff<3>fq8)?fmMODz`?+wz|(=FfoB6{ zfy%&}L9>JA1uYC(60|&MWzf2yjX~x?$e{S3#GsU*^q`EOtf1T=dXOqe8>A0122BKA z3A!3I6?8Y~SVmjo{lUJ(qe3SJw0C>R$U6&w>B7mN>14o(eD56%e&f{DSL z;GW?AU|#U4U{SCnSQMvReQq?mJY)H2jRG$<4k8WxHRjS7toEe@>-<%ITx_J{I9Pla9z zoeZ4{y%~Bt^j_%0&`(%kG1dfYiZ#RT!tTW$#X4ePSZAyo)&m=j&Bo?o3$X+&5nGF` z!!}}Dux;2u>=5=eb`*OSJC41Coy1OIZ(?6z-(ufmKVm;)|AegwTNSo8Y(v=Qu-#!+ zVYXrRVURFrSY%jCSbSJwSV~xWSXNkRSb11&SXWqY7&nX$gbjvW4!at5J?vK4-LMB? zkHfx%eG8u-z9D>b_}1|4;XA`&;m+Z1;U3{$;lAPi;RWGE;k0mG_^EJF_;C10_?hsr z@QdM>!Y9M0!f%E@3I81aE&ONrpZ~wIiQ9_Xj@yabgWHd@z`=3OI5(UJ&I=ce!{d^0 zskjVWHm(#0FmZLbMqCT74adjHa0=XcoEoRYUBx}cJ;%Mmy~Vx9{fO8Qu{mOE#P*1t z5ql!`MOa6GBH$4b5z!HG5%`GYi2spgBT6D_B3Ka(5zP^;5t@i=5ziyOM=p)r7I`Gn zF%lMuh;)zii1do|jYLNVMn*;^MrK78MwUl*MhbvPVWc?nbmVB{*+_Y$Hu8StqsXU` zFCt$@PDjo}ev14W`6KdoO?~2|Vy)XJe^x~Ww8nJANMmlt+>Ln< z^C;#?%=4I+vGZdW#V(Cq5xX*Wb?my>BeAGh?^r(|);~5dHY7GQHb1r~7Kkm4EsL#) zCC7Hgo{v?(m5x*;b zZ#*O(2#=45kBX0pkBi60C&j17=fo4^sqt;`o$=lAeevA*Gx1~bium*K>iFmJuj1dv zzmNYI|0Vu=!u*6q2}=`JBP^!dLuU0KXc)4!;4v8E=B$irLU?@wNB{{3!k`UXDM9zkt`^_4o<=d;CZI7yNhpPyC<6 zS&54i*CcLCG)p|5Xpv~0XqN~|#3terqY`5i6B3gWQxo$N3leJ+yApd7xrzKlU@&ns z@l2vDaWe5q;`78;iEk6%CCyG+le9i*Q__~CZArV6tdeY#?2{l#&?J|npd?IESW-k% zbW%oASyDw3IjK5{meiiqnbe)smo$(xlB7#ACQT$=NxGW!GU-RsucW`pvy1Cuz^q zUZuTFd!P0(?MvFXbklTDx?8#jknWZ4o9>?;l%A8Go6bsaNN-MWP47tWO7BTOpRP{V zr5n>H(yydnP5+$!E&XTupNv@s|o2N{nuo@M@z`jWXUb7kh5%=MX@GEFk=GJP_`GJ%N9=*+lG zd}eYcA(NO{o=M8A%4B8sWcFwBGEZd+Gp}S`%e;|!JM&)V!^|g{&$5#b*6)KAn}Cm64T|Rhz}l(q!qg#z&Rl~*c@C= zR8DM8LQYc7$(+udp`78Ik(@I*vK(#B&79jg_i`TQJjwZ(J2!Vh?&92KxhrzlMWmvW zMU)~zk+4WyBqz(>^rYx{(W|1jMemE}7Mm6CD&AXsp!jg{(PHyr&*F$; zLNT$pyqHvcvY1-TDCQTRE1oQ#D!y5Kr}#c$Az=w&8DRxsHDMiLGhqv18{q)KoB$>u z2myp(LMS1e5J@N`5C8&^P)4XER1qkIIs%)}PT&xF2z`XRga?GjglB}8gg1nDgb#$z zgl~kOgx|n?U=^?y*Z^z>wgTIM9e_LF33vm3KmZT~V1O_H2P6PVKq`<9r~oZs04@QS zfvdn2a1*!#+y@>3Pk`sZOWgl!ZJ{qLm9LTR_0vhR)#F|Eb}P~DGM!&D@!ZOC@U+gC?l6um(j}F%Q$5{ zW&LHmGF_RmY@+N+*|oA8Ww*?aI;Rf#pHvnDWqaY&otxsywzlp**oXsXVp3 zyu6{jqnuZMs$5h)Ts~5MrhKgYT)CnAMfps{yo%)&Ybw@PY^&H);aK5X5mHfDL8u^B zlvj`{PF7GW7!^Ym7b|X8+^cw4@ucE;#jDB%m5VEvRj#aDQ@Or!Q>9ZSsxlm?jI4~Q zjIT_rEUE-5ODiiX$(7tne&t~0Q03{$(aN)x^2%40|46GyYe^eOn@L+q`$)DVdlG~M zCBaE3QaCA+6hn$9C6WLVgTy4&lbT3ul8AJkq$cS|M$$#nP0}mUThe>dN75JaEb?md zI`T%c3E7kkAw$V!cliSH-WCi&=SxwfF zjpPaP9rAthBl1)7SMv9&Syij6)>Un+GO04Hf>c4P;8iYF?p2;u-c{JD@T#<`%&MHK z{Hmg=)~b%GuBzTDZWX_3uu4~DsJdD;Rdus!rt0U(xj^;#YIU`)+E_hNeWm(Z^^NM= z)%U6&R6nkMR{gU2P4&C#nd(o~U#ovq|E~T=nM0XRSwvY%SwUG%Sx4DOF`<}J%qY7k zdno%UhbaG1j#Dfs))YGmh~hwTq97V3lw?X8 zC6fZ=Q1U576as}vDW{MqCn;14gTkcLQ<^9(lr~BSrHj%_;ZpdNLCO&2G-Z@>h9aXV zDHkXjik>n~xkQN{@-cY6~Gn7x1uaqB@-;{sU+0=Q|h14a~ z<5g8=mi^%&KHYE8AHf~XEuCn|#KN<~spR3EAzHGmpS z#Zbej5!7gE92HMZqNY;Qsae!qY5}#FT0$+QR#3^*YATgVr`A&IsEyPXY8$na+D+}F z4p0SDAyrJ3P^Hu{s)Bl+s;26wM(PCh3iTTG2K6@e9`ykgcuajpeMx;oeMkL3{Y?Ev z{Ym{p{YRTan@3wnTS8k-TSZ$-+d$h)+d|t$+d1~v!Gei>}VjG1I>vR zM@yw;(6VWHv_cwzMx@bbH8d8jf!0JjPaCIQqD|7KXg6uMY4>OkX-{Y~w14zP^v(3G z^zHPW0DTXAKm8E>Kl*XH1wDw4p@-2U=+X2zI-Z_J&!9KZo9V6e4tf{8m(Hd0=$GkN z>DTGE=y&N4=#S}78H*Xq7%LfT80#6E7+V;o3?~MH;mSZVPz)ainvu^aVgQU%Mg@b+ zsAfuB-W(Vq}6296xNVys%xk<^qSV1ff_;0V2!9oQKPFd)V!#9T{B%XQ}dzbQ_a`f zg|$m+m({MUU0u7s7F!!$8(AA&8&`|3O{z_)rPtQh*3~xFw$!%OcGjM%6#=!wwIj6? zwKr;S*WRmrQ2U*^gSnfzmwAABka?JSlxfbiUon#G#STEJS&TE<$*TEkk;+Qizz+Qu?t zAy}>~ca|s1i{;DmX8{4MLKcBl!YX4`u*j@x7KJ5Z4YMRHDeEjt&N|0B&w9gp$NIqf z%=*Uq!TQbmS2w3_Y2DVk?R7ir_SEgKJ6>l|2dV?tIn?>o<<#ZZ71j~zO6tn$D(gsf z{JOz9QQdHzq)u8lRwt`7)V-*CT{m4fQ}?0nQ{C74<@HWLJ-ptf-mTuF-mBiH-mku> z9;heQm)BR+lj={_Q|oEUv$hv3{cdO8vF^8}+yAztsP2nAfnNVP(VW29t)Z z4SO0a8*Ca*G=Li%8(s{hWLiWhLnc%hKz=+hTH~vgQ`K(pl>iXOf+0+xY{t) z@Uh`b!}kW@SHtgyzm2mSH#K@TdNuksq8kGnLmERH!x{@435~?Y^2UlrQsc=+PUDTn zTa9-c?>9bbeA@WD@nzHerbSIln^rWfY+Bv4uIW${t|_u9rYWuo-;~^x+LYczYpQ8t zH8nIfHZ?c3HVrquYI@W3u4$&}Q`6U`?@d3OS2v$%1_RBG&9G+YX4ht9GpgCAIk-8p zIk&l>xwyHcxvaUexvH7cOmD7ju4`^+9&J9`EN?#7tZLRa8=BuVzia-`{JHsC^Uvl# zE!$dlwCrx#*K)AsNXxMnpB8jWU`t2~wguM`)l%L{eN;vh_l%rd8iM z-g>F^M%%2mxoz{?7PT#ITiUjwZFSq4Hv2Y6n`0ZS4c_M5=GNxX=Gm6fR@qk7MrotB z)wb2OHMX_14Ycvwq-~luecO23rMA0mkJ_HLy=Z&e_P*_7+n4rv?d#i3+PAiEYX|nV zA8vPR_h|QO_iabF2eyZ_=e2jXcenSpbK3{n`R#-4L+#@BYwb7MZ@1rTf7t${{dxP} zj#(Y19cCT7I`($#>p0MHxC7Qv)B$vqc2snbI!<;_JLnxX9nBr=4t0mF!`Ly=ai!yG z$Mud|9d|n(b-eC)+wrAyQRmXm6`iYr&UKv|J54%GJIy+Gb?)hO?sV()==AFJ?ey;q z>Wt}(>tu8?JL@_dJDWONI@>xsJ2{=k&WX+|o!2^Vbl&Q`+xejLF=r`f1!om!EoU8P z17|a5E60@M%yHu&IVg@7$A^RF1ag8nL{2$}#5u{Ka_F2|P93L_)6VJV00SH`N6ERs z(Qx#fan2>qB4tX0yIs0nfo}J1&u;JTgznmIR(C^pQ#ZT2y}P5E)6MG^cAxFO*?p(` ze)ps9$K6l6Uv&TNvFSO{1L}eFIQGDLoO@h*+G5N z>Jjuj?|IqtrsrMH`<@RyAA5fF{OL96HSIO)-POChcW>{3UZ>u~ULd76tv91LyEm^l zzqhcrq_?8CwzsLbrFXRVY_GicT<`f_b+4}XQJ+cQ*1qk1JNtI^?djXwceL+#UqD}Q zUua)=AFeN|FSakC58s#BSJGG3SJ_w9N9m*Y)%Ml(3Hm1buJldzP4)fk`_n(Ge{TQ0 z{)PQZ`j_{w=-=4CyMG_hf3W{Z|FM3He(Qd_e((PD{;dA&{=9x#e`9}VzoGwP|E2!P z{;T~{{WtsX^xx&q=Fa<{R(1(@Id>IzEq4QV2X`0u7}tVp&9&o(aIst*H;Nm}P2eVR z^SMP_fLqEXaT#1Dx1QU`m2$_p3hsHXnycd)xfi*2xKFvjd+tZ>7w&iNFYe!gSpz!; zb`R_uI5==*;Mjo0fYm_2K=455K=?r9K+Hh=0Dho)fHqJwz#3>6XdY-CXdloG7zZW> zt_)loxIS=e;O@YKffoZay!pIEyrsMqyw$vQyp22)o+;0aw~M!jhvND0{CEMpKwdB} zlo!s!@u~nGg-7Gn@M?K1UIVY0*TNg)DR}33YMzc~qdPXcROHS_K_~F2T6ql3-FWCAcZLEx0FmD0m`xFZeF_b85k$dQdlL z9Gn=uGI(w9#^CM2dxH-L9}hkod^z}L@ZI2t!B2x<2Y(Fy9{eYqBb+B(2nd%5mkC!2 z*9g}OHwjIIro!#QoxcMtDL95;_Q-gm9s=&`pRGqJ%y|v@lQ@ zEDRNf2_uBj!Z;ybm@G^crVBHL*}`05zOYCL2up<(Lb9-0NE0%IwZb}KgRoiHD(nz; z344WHAzwHs1VqAN;fU~zP$pCgF9MK3Nq9wgO?X3iTX;|SK=@erRQN*pO88dz zUieY?MfgqlL-P1Z=wy0gi5%q}rMFS#%NGKAEBqFJ3Or#K<7pX-$kx_I}bXjy& zbX{~ybXW91^jP#v^iuRjG%cDDeH48WeHZ-_{T-S;G4*~0jHVkbZ z+B&p-Xy?$Lp?yOKhmH(ci#Ln6inoh*iuZ{3iw}yAh>wcR#a3clvAq}~hKk{07qPq8 zQ|u-775j^W#29gy7$=Sr$BGlgN#Yc7x;RUmD=rWhi%Z01;!1IqxLQmT*N9o-263~P zEp8Wgio3;q;sG%q5D$t);$iWK_>5R4R*El()nc94D4q~s5nmHu7vB=!6+aL^7C#fe z6u%Zvi)X|i#b3nV#lOUVhi4DZ8(uiPWO(`Ts^PW68-_OxZyDY;Y&N`ec+c?u;e*3R zhK~(f3|kM|4TFXqhM~joVV7a|Vb5W&Vc%i@;h^D&)9};G=I@ojD#=>O2FYg0R>^kB zPRSn0e#s%pf0E-8ONou-gaj;cl)xm;5;uv5#7p8U@s|WiFp@Aygd|!LC&5dSC25jO zNsc66QX~N+rIHE>SyC;bNopi4NrR+YB9IJ9&Pddf%aXg2Cz2V-pOK{_D@II4wvQYb zu^54jcmN}TBM~FXBSj+>Bcze~k@k_!5&p=T5&g*I$i0!*BVR}Ujm{ojHM(W=z^M7C z!zgqVIf@<)7!4YY8ciE59<3aukJgN~jt-2DjH*W`M<0&98vQu>Svp6$T)IWNS9)A( zC3Td#Ns&@dX|Oa-njtNe(xeP2Q(7-=l(tBLHfg7{OWGstmx`n+sYa@oj!P$`SESdZ zH>9_ucck~FFUGWE`myn`OJkE`Q)4&B?u^|Zdo=cR?8VsYvFWjyu}@=P$9|0c9{Ves zEt@A>C|e?1E?X&EBU>-qB-;7i1clUN$bfB%72?$!^N-$nMJ?$)3ty$X?5)W$$Gl zWuIl=WIttpl7Om zCJIx9nPQh>ui}8>u;Qq~Tw$fKQP?R!3I_#L0av&v+!dY*Z-t-2UlF9hD8iU4e{TlL z6(q$;1y#XNFctNRCIws3uHYzo6#WXG;*>(D5Gy1KsbWl_P@Gq&6*`4cF`>AkxTd(F zxUIOSc&K=yc&>P*c&m7?_^9}z_^$Y+_@kVqoTHqtT%=s8T%la0T&vum+^pQH+^*cI z+@svDJf!?jd0c6!v{9Z=f&rzY5~g%kx+y)BUP@o3zcNUPQHCial+nsKC0?1VOjBkm zbCmhYA|;?KRaPj;%4#J|S)*hr8 zy;e=DW>lY4UsXR;zg7R#bJX+Ii_}ZiE7Ysi>(m?7CTdf)nR=Iculj)cu==RlTy3Sc zRokl}YN#5nc2T>lJ=NZ7KXrf_2v&!x!_|@M7OS>=TA&uH#cGLKsvc7-)aTV|wN7nRPpGe`uc>dSZ>#UA zAF7|IpQ~S~->ToMKdQf|zpH<#|7vDy=4lpcmS~o1R%+I0)&rVNnk|}bnjMf-k7~`eR$5!Fy%wT{YT;TJt-ID!>#g z+FWgcwpd%DEz?$NtF#m?U0Vxi>$Hv97HylhQ`@cW(++3_TA@~~m1w2fF|9&-UaQvX zv_|cO_KNnJ_J;Ph_MY~k_KEhn_LcUn_PzF__KWtr_LugrZnkcoZlP|8ZnJvm!M11rRp+tS-MN7XTOOkKUMNypZ;={j}Yx?UYu$JY(& zhIGTa5uH>wrc>z7=~Ozc&Y&CDP3W%ZuIjGqZtCvn?&}`up6XucUhAfH?{yz_Uv%Gf zzX07I{Ve@l{Q~`B{WASZ{Tlsx{U-euy{Ue?eusXyexLrJ{;>Y2{_h}+v~x4 zM?FmMtasCU=uvtfJz5{A57CF}!}XE+7=64xQJ@m+MLTlX{At zrmxYn^!55CJzL+V@6>ne`}DwoUZ5B1hxDiQBl-p z-H>I-G2|PH41l53P+=e&P8ui%x}nyx>(XCPq`EnQ^Caw{frWfbo#=KjU$urP0QC!U!@t7@dr8ql?ka=wb9S z`WpR>K}L)*%ot&eHpUt8#$;ofG1Hi1%r_Pp0VB~^ZX_A2j1(i?SZk~^HX56at;P;x zm$BE#HS&#v#v$WrH+xA4#qaxme?pSW&b&8o-n@D9+U$dg+=6$w8Ci7E#(`59 z*FF9ZffHoGELa3hKtct2qgA*2emg*rlgp|Q|PNE6x%orLZ} zUm;5vC=3#EgaTotFiIFJj2ET|Q-$}1X@V|%0G~b-77ELRkA>C38sSr6tMIw-g|I`| zCF~Qv7QPXV2uFpJF5$fJgYctpLAWCPD%=uo3-^SF!e7GQ!au@ukr7RzESg0{w23}q zfEXwSiNRu+7$e4tabl8KU3^QdAvO>@iJiqRVy>7c4xt0+dGvPLML%Wi^mY1}m@gKH zg<_F7R2(J_7e|OA#ZlrI(IvV?ERGXh@05I;D$W#Vi*v-e;sW@&SX?fy5Lb&E#I52s zagX?wcu+hoUKB5hH^tw?Kg2)9zs2VgB{34B4%4+IA1P1@lES2LDN;&+zZ0btshU(> zswKTG)sq@ZjifeGTdAFtCUuayO1-6QDMuP2C#+jp0q?- zDt#nAZA7x+q8R9py*=?BwA({#Z%c*j0xsKdWZXvgnTgk0G zizRoIyUFQthTL23FAtCh%QGWm^+$#n0uQ0n+KQ&nunP4&7-JC)Su?j<}tFLd7OEYd762a zSvSu%&oO^sUTj`s{@A?UyurM~ywAMf{EhjD`K0-j`3Lil=AT{W3+7+Ux6HTAcg%Oq z56zFnIp#mj|CpazXbWQzEt17*QRHqGyT#k$V+phb$+RWR5^dgRNwg$ck}cINsg~N% zw~nQurG=#>K(sRdV@b1gwse8dJ)otJWq>71_Os+z3M_?|5tfk_mt~@5l4Y`Gre&7J zrCVlOKCpafS!h{KyTsv^6_!urX_j@CPc2)hYQ^)(!Avqw(Z(dbjlp z>wfD2c;foXc=R2^T8~;!Sx;Mkl&6Wqtv^|Rv0k-avtGB}HZQi`xBhPZ+xn07sX{A^ zVv?sRvSL8}h>vXp^Jo-#riNj+0s z%6R2HWri|KnXfERmNE5|VwbW8eyxQL>y-`4XUcYEkFr7YwuT-_Z+CXipHd9@#)i!DewWHciO;Y-++Eoz6-P*>CqrK7%R5Xwe_Q6Va#@1imE5;Ot5gQlYyXeRue zgO-v((MJZ(PmR{C^lr2heaW!s0Q!nP1E0TTe9uBpm^+PkL zezq*zDBA?v`?k4ghHaj0p>45knXTBi*0#mA)wTdpGkf zG{bz$-q$|N?y^rb-?mS(PqRX@6{g0zaQRSO@2@q8Sdwp*egU6&*2-SVtB3yNaW#qlTlV zqe01`^ql*bryMOEtsLzfT^wB{#IV zz_HA++_A>7mTTzP>e%ks?Q-mK9CCc^IQbI7A00nAE;%kc?o$06_Z+|Rog5GOE{@+F ze>ncEaK_oh`Gs=_o59R+e(Buh+^yDk?s4vQ?sp!5Cto=aI=^;)<2>U0*7=?DD0LC~ z922~u<+#+4y6CVvPdHDao6c_qZ|5oJX{YOZ=Nac&wyyJ>^Lyuc^CRbv&Yzse0Kpmf z`)B6`=SAlw0RG-G!g*Qx-Fe0Ni}R}Un)9aM%|CM9a^40cmz{T@?>+ds@BED}RQ`58 za6Y6SIe&NVcHU;@h_ju4I3J0Z#ZGJnJbeuKpExf$|8oBA{KxsX!}-+t%=z5;uNULR zdU0Nwm%sNEedGT4Kwso*^R@drd@J}meZ73WeSLg=ef@m>eFJ<0eS`F+7Jtdy%{SgR zf$E~~u~cHXLHaFAp@Tc?>tZMQx_z`cA8_e$HA+=adLN zR+*dV7v~r6mq5+;OY}?fOZKbmm*Q8&uc}`)zv_N(`PE>~`_=TT<@dHf%MKnEa^P(F5^yVEk*U-(}>8JSnl#~CBf51QFfA7>Ptwl!f%u;=(`Z&Z))hy_Q8V)MGjjT8HqB|2pPN$% zW0bH;NCcG0nC@zz?D!f=A%$>8r~;g+Mo?n96Q(<3x*4XsV7djSTb<&c7;LHuOnMvh z?G3JU=v+Uye{hq`>^xW7+MfB=rK)!+7?3-RJS;bU0~o&%rh6LWr@uaa6Jz|QrBlLm zcTD$y@!cam!=L6$*QvG821sa!c~}+3pn~pNKf6|DMt(3^I1d#a2sbM9$%d!xGW%ra z6gJ51Q#2TU7XVGCh0Y!Uq7sF!Kv%lHp^l&H6scj%0W^(i_u#436}Dm849e zACNQvbJsEVJ0Xd?(Yb9=R$(x3r|l3AMcGvKu7#QTgR^on3d!P^Cn67sh|YI2n9efz z)Bmg?xn*)oXc3A^d7~H94WUQtbLvLad@&CbVbY~p{L?kgUa!g58VK=j<0ufvip`6~=DJ_g)~@m5 zgyrG{A&9CCdaPAitE}GjvU2)n<@B$go09_zo|}JGc$Kb6;$)!fU9lbw`g;|o4`KQ% zOdrJbes@rrx&iv9iPOayMvo(y{ua|;pCrc_Raw;CJf^?tUNl#<&l0UPN!fK!>~sIsoP%GMy(T9h&S}q z7S-&(inqkW@btELhi(Xz+!OEXlUr0b!!s%s{(dO_t{-XPBR>{@T_OG|J`w-Y@3nZV z!9Uc5W#TDJ|L9Kltoy&>m16M<1t%yN1QIQNQ!IW%)jlV&5-0HzYy!$DNz`GDqK%x&~bjc-LF<(_>rJ zq(k%pt)g8K?5D--r&R4zRAY82;Es}F01vxds^kWNxnC^BN^zLJi|KoS1`MJOIejzp zv$JwCPf1C14FE`{j?lF_v`TB&xL%{g;Kbl0${pz;zKT?}SgJ~-79^&9=I}zY%4q{K zK-)FQD9lJ7l~T2uuC-R=x5Ue<#LH3*siq#)Ix?)}B$HC5+TwJnE~X!226i||=c5wo zlp5#-t*hD_OHHJvQZuQ!)Iw@WWl+7P*80xY{X2D};-$`1KBk|!Da-`9SDmC91Et-l z2`i;^sk_ue>M8ZY^mELxn2|A~V8-rFKSv}?>O|H5K8Ym6Y zN481S24jZuOfOf;E0*%~FWSTi1ybP(sZhV&Ce}(|h7-ADdP<}8u(l1YF1nM1rS4Q0 zW{5OiAKJD7Y)z;1uJoS1w{3{HXvZP<`po|gqiV6#JbINu%@c*)>A22`K(~nrIMTNQb2W0jc zRN7rF9Y0;VLHg?(+gB_TjXTm^cy=E%37F|aa4>PDqVZ6F+`hW~k@TnZSb8G;CH*a~ zF+}5;Uavz3CreFOEq-j`O@esVB$-Sm*(_xd08kH0qoHQmjcvMPq<=Eil#KbXUPMI2-8bQy- z)Dcq?y<4Z4=;q@0#p3s%5{S5RO_*vPWyQQjloi(;rqu?7FV)meU*D;=z4TdU3RD$5 z?P}_#)1A8-lgaSNlBusgpmTk-KanNVK$BD=OJ8(;+vrtT(rcK`b*Zn8GgHQ2uduq?4cVYiVy3@G zHo6rQ^&SW(({##x@b6o|;yWX`HQ1;b)%=I9p!`?tRk%{-MbP-7o_) zYlE3K-AV68nVEfiXQcNTRHJ;~Z=kPa^c`&UZQiL*Moyp1>~fvznvU}iCGdkDVJ6q; zq;w!V=A|xYpi6iCQMa&Kr5mEI=_kN_!2l~VzzSY7UOX;~>2jIz(jh&y48eWVEkJO` zAZ~<#VAy{lxL=0gSbD80B^1DxdE((*XUu^0O*q%NUw-c3m-%ZpJ%?U*^g7)mUM!Bx ziPKGHOcuvwKz1%;8XRdRIQP$Dra5M?(fIa@Mw6@nBybe?KHg|-{-V(=+o2Jb1_*k` zXlzr~D9(_*qroBpQ}1icOoCQ7)44C0%KgFnD(gixl>><_q$@qVOBn@_Vf;fm!T_9R zFlx$cjPls5au$S*!CD^Eu@=ybE0cOAuB#_+;1{C${m!0`4^l*8!0sUn!@7kr% z!{l)W^jOS%QZjCS=3o!xYsRuXS$-FI^Bx%Sj*R42O?-KltV8Q;XziI1+Mr|vd4c?a zI9&!V?!e4VG6b{j2YE3ySY9G8C5E89OfHs}%PZuSRJ{BVbp(E{me;_ic=;3kV8+_S z4f4k2@F+At$#(VPbyj7B5#H6pP8y~+4AT5vfiP-JE#e3 z<(=}E@-BI|yhq+E@00h-2js8hgZhQum8}batRvKM`8&3;d`u7QQ`>5o!tzeKi+m1r z>cBpcMxURk<4h0eb5UR1rw)5f{!+i(C&6gBQ_^x@59nKmeI)PFd-aVrTAr4){HxD} z7GB=1pYIz_TFe$ti&@njnRVC-@*cfYW}MOD@1eyUq|eN(RYJ?&5?X%93^e-0l=O+$ z`F^E+_LcN$)z8zXMoFKy^%4DQRrkzkzo(CTEvC=7;~_T0oN=eT;w1n(7MPoskk>-L z+piAWPClR~_BSSL?m`_mcVl{*yX)Eg8>zj>(Pr)=e^qj{?d{*xAaHQW;CZ^&fV$#A zx{G;)d8FQRKw_Cvn_+f=eralK(pw-4ZmDcXQNzs>_=o0+?n#*W&Dg(pUfaLs$;9h5 zzbjDYDP;d*<}PNy+-`=M`!5AG%+m$QJQH*88&2>vUC9b>ULud?x#oF>j$BAx!Aniyu!TFyhl72=n^OvRAFi^_;RW7X8 zwM}-$h=ev7MFp9!v&aMdRVlEJ2YPpW^8nwK_Av%{R&Idyt-uHQFVx?cg6a1M2Dkc& ze^ksrg00y%x6dHLu@?*4)O-mR^okoIO9EL?mVFJSCvsrE1`B$_P{`c}RVy`J#Z>cs zak?2oGOI8v6UD(wC8n$S4}JR}e{1QAJ}^JwAL^F}RV?@9IXuy_orz_AEFAxk%Lg2o z)d)4TsY4FT@`VLqeqfOSsAG0uObHN|XVC}+?kAW9XOR%_Vs`5+6-b-DB-{7JuogdY zx_&S_tWyaFYMmv72t2s)tnbV64#P$84=qs!ML`CC{9ogbN8l|n0%eIa_)~YVf9Z(_ z2vPt+RRckofgt3+5WEElY8nU@3=S`c0FF#c0|Np07qCJR|AhdKOpE8p{CjXn>2?MR z+Q14gHxR@S1k95%20>#7Xk1}5f@2Jge|IP-%*}g=7&+Mm4o$l2e5US7ov^%(nDA@RxH6J3+)Jw_J#1hGmd({D4Wrf_XuDmW?6K zus{@9znK%-w`9TOg%;y9g=lmH^ZLrKTU$324-LDL& z1Z1&g34kmW>zSA7v+|PPfOM7RBk1w5Wi=qZoYzNLZ`nwYZoq8oWtL5PyCIQ{Uq!mz z@;QKf0frB3SKxaZX4_)69Wi|Bzh(+pc3bv9@4bM2&yWglAmE_o5VRk*d<{Jw4(U+& znB~L^0#0HUQWdw)y@qWtVW+M$W)6M`1moU7ot3sSR2M62 z%SGXeyu&#S{vHyK>JR;>(Hj9 z<|up2+St&1=P>&|*#)fBr7&x7W}~dk?7n4OWRF@~8anXY&~nPyng&~n9#-LnRMW_3{jZ#NYiI;T7@j@K%jb%H5<6HbXcbf z1=gVuinA74i!i$cvrCJu!>q$~%kb49ovmX_irI~r-BfHX zwl3Enj);0A{4wil>l%PxYyAY^YmRJIVUu+$f!}Q1g4r)HyQA2;&H9=C!N@m{f86?| zbr-$d|hVGSYaPp&%p?5M^%1JDlb?sLhB`HeLSjt?~+lhH>@{}J;WZz?DxjP zmY7!7JA!1rhuIUv9%D}$F&*n~5Yw?f!0aiAD88C>w%#C?lJ!xU>RdNEvMiL5YK7C? z`au6>bj4Q%THzF)>Y@lB(0ldZG4)?-w<-#>tI&Q>A3LUDsh6TuP@McjYCL8yWA+-+ z=X8}fdMS!870=$Jx)3i#2~>ipcqK#^$JXgk!UH8zi4vzPz~&p6vl*Pee5TA>0bfOl zRpJ0Bfy-8sFo!UE6GE??ifIStG=nipWr%|*DM}Tks=jb+WQDf?XQWa~d0R6$B2Z3%!WN*n4^_}-wT>5W{$LPub<(nimARSxM2 z4{K3Jm2`*|oq$iLsMAU>C4)MvG*kLeKPZ{{9#>DXjgk!r-_|4CQRX3lt^mHfDqZz1 z?v!AHehl>w^%S$e8vh@;13YBA$uL-7=k_zVQQnb1QYKQzmC5=kcQ`#o|I1yAZlhPl zHC2KjMOj4s!=x%pl%={G*GHabs{k#8-jt7()%t0iB78y+cGZ<}aaO{C&BQ%ndMexW zCgbX=pA#oU*{M`1aYE*gt7Y^$2))ijudnsXI!zvZP zgy1~Z-Q_YhB+gJS8LJ4#JLmMQ;wxK3xvE@Ku7fPy5bG&zFz1cANX&&}4uT-C2k-tQ zHdJmacV6VUl)IiRm$z~c`0^Vpz;Wew^q6v0wW|)Qi&{Z-0s&Yb^-k9$e>Je|G*W{w2WHo+rxCz~s&JyH zaH0T|FtJ&eQpvrl#=@LEQ!#8R_HG$N04%Aj(J-UfyP%n0XjfvGC|CKP)oN;W!2T9t zioSYc=h989R8Z>}!3S-UPt}qU#TjZN{-IKp7*U*IL~$~SdNj()&MbIgCPKFs(5;Hz zb5g}JbXV1O2D%xOLQ4-C=+_wznmvj&6hjf{*}`|=Of zez55=2h|(EgT}9^B#$kwW(kx!$S|c-Cr6iB!eXkL5A3;0tOu?I8Hn>P;~g{(1MCn# zghnu@0DG%fY8BK`{4;elU>-{_W3DykKm#?yT-%r2T6LTtsS_|CWaR3DdupB4cA0~7 zhh_$+<>vG+h>wqND|LeK4Lo^?eec2WQw=UdfeH-Y{=%`2#JraS6Fc>%2D5?WT5sl{qPxq+0fu2MfTuN0Eyh3Z-^Upy=CQP(Sx z>PB@Fh|L!BDw;P>R<~25)GyQ>>Q41bh|7EhX`Ui=pSoW?V3O2>>LFphI76zdq?n6^ zb?Q-hFEvbcolsA*q0)Wzduq6PR%oK0SAS4{6hBsfRxg+zsF&2slw1Ci8mV3r_6iS# zM(i>57OeOk^)COrxKg@fGN}*M-z`;z6Y8JpWAzE;Qva5EC{@HY>T~s9TI8R~2jzVx zi^gjL&53r+q{$*;k5fZ6MN>uEr6J8mv(#vLmoQ87;_|3<6t>gchWZ(n7R~ zN*gUq!CHhCNsTpMF`0#NTC7Q?B_UlMA%>bKS|4aBQcta_R!z99R27!W`#~J03i)E9 zR>u-0SJCQg4TMnhTq#v+!tT+UY0b43T1#q-yxZ(rX1buY)6%r|S_iG8)`>Qm1a64d zjfuVXS^`ixCfR-ioGB1}8ut&8VAw`bRhG_X(0o4n0UBLUo zbTnp$VXi9)#lbnpWxG3JE)R1>Anup}OYAx3hGPywflo2r5xc+#;vn=4!Q!_u10wA< z4z=-^d)H8RQ!(@0U6aIMINe>0xp|oT0CS5mw+u61V&-Q^8oE`?L1o%*%)wvHF}DJ9 zmoN>LC|{G9JRBg*V@!|0+%3!;caO!~N0{f`D@eGV@8ot(!h8m)Y2u-r;V$M|lUO)+ z0`vWdPsjn-8e-2dd)x~!4@w$Hh0t@l`yA#W!c+zGDVPHwcKXRgKMf|?t9F??GAFU$IJmt155k4pODnOF9uVH?v0r$?irYGMK(5{iaGEZ zfoXqX_A%y1VQ!oI2n0t+NS+>qxh%|daJR&Ch70rrrWa%84%kST`<$d-`4G&(;=lqx zM5G8Jd4^JHk7>x?z!H3iS%1vHP!%z^6VvTTWCxPM+;sPMm^WkYA?E91zAYHu%wfzx zG6kyjd@v8E)-%ijm<99o+yDihFNIy)5cgGbI^M*5W6VcEcmVS(rk`Ry7TjIT{o$^U z`8>>XkQD~kA2a9O$1o4e07fyQ@yJ`(PYg_izN%sf!Ozf zl>m;u!N61(lFBaaeSy-ZdvtDB%#qqT%=Pr>+_tXQLtrIPa{$Vy=OUYl0~rOV-X5se zHLGW!g#fa+Y@ogdNM^}E*>47Ny`!xFs8wZ9u*NXZfD)+wZ-#nD`vibKEdv^806`WG zj-^&@N0cmtw)sWuQY#?3pE{y#1;Eb;AXJB@6=t{!Ghz8Kmt$ba^c-yA0M3uE}@U@?$C7GVuLCg&?{^y(AV=z~6+KAxiP)_YI6|a2*RS4Vx zVhW#kukxgLb+1_oE~p96PN>T~H33WkQ%Emnim0b1F;@s0%stvY@^xmwi3SUN z7Up!`!wfi7hZ<8E=9x;TG*6o36{6u_xujj9j&o;$=onBDplIO#NQ3H8FQ~o-RNnxq z`COoyf7iWAk6oJL(r$BKa66bB?Y_E-5Y6P563q<7+!#!QrEhf?U~V+%T0*!{YR62a zs=K*2Y!c78{L&`jT9@A>txP|>*jna|uF_DmC-y`DOGC}Dzv$iusEPa};$V7>YaUrZ zl0YHZ!!-~9Y;bK{i3qhnZxk5qe^FvYB@><@gltscaprUCG^&7{rF?q_a}!PO49rc! z+yuSNiljiuN+5rABZ$Qjx(fNKs+I=oe654JUEOD%2xcKDRc<;tH$Vfz zQ3{%p1D!vYXl4#d6ku%E%Qe&g2krI-=6f_EY5|jMWlWMBtuu{D&hjw7OGm?J5AKkc z@t7*lB$rXDU4ozkAm~(vV77q(PIt26-AWKN$Q_oG@tA%C*Zx9==3{pnfp$ z0ApY{^Ek-Dg1TCuuYNZq_LV(G6a&ihCW=^1_lv;T zc;mh=kzf~)0%h{Vm<9=6Vvw@5M1t#q%F`z2lKbTvdo(5&xP_hi6l$?SdP(4BV*6mZ6m77zeL|39&f`n#c4&vOP z-aI8%Xf8G3WA%i38BElF!Q710QnUud{sEf?tQ5|*ffyGY7+{~nNp6T3k+AY=TRrGe z+o%|(y23M6pbv7u!1dLhsg|to8^Kls*xE8MNDcznC#7JX!tOW1K}j+4loS(od}_e0 zFNHHQO>YGI48T4w8*ZZkwy9)6TD(T5i*lCDZ#O{hErZ-*KyEF8Z2THzIlw~z_;nfJ zX9nQ*|DDpK0M_n!8Qd2J+>Vj~+x<@io&m^nWq@BAfV)ZnyXdGxKmz(1T|gJnC3G2G z(YldxD|8KWKVoh#=JsK359WTr+)rdf(DgC5U;kll2z^t3Iya)jeQLr-V9!_7>Zm_! z2pp+p#KHno5{y1DiopUU)_0ye{Y_i#pOUQx2EJ#j9W=JuA${1qs$sCzY@9aaKeyUp z7)U=c&*2Z7)&^xqoQD!C71$BF&#B99n;^N z@1ZG7gNk8N3RrrAmOJ*3!?X#ea6%I##toX_1o6!7q=D&_$Bd{R8?57bu?BG|>d*g) z@-(oqjJTR5D8X3wpgd!sJgfgX$Iwl-1{(TLOy^)Vh;DkRQY|?ND%FyzrHmO~NV(jz^fvY=`SHsnQ*^psuXu(h?d17q0M9&?v5-_g)0S30-M$jT|pR@*v( zq^OUze(FiB9r(<*w3dda^9T4=hPCfc{3CDz(%-BG4-vH@^sx0QHOy@TF!91EQeKHGPEZBV80$8sPF?SDhzZvUw-!S=X zbBW34;ouT#!ctP$sP=^8rUV07&o@uSWn8lP-%PtV!~UN@(}4^qXV1rSJwWp`h#CD}@);CB{0Adu}^Ot7*FYNu+d6_xE zo{LmvBzV^Q7Byj+&`AGbR`8puMBYr#|GlT@?0%VY&w2^#?QALKc5v)rSC7QJP@ZyL zY~QeNR-v(8c2n7U*{x7d1wpnG8ZWF9X<@GzDqMzWRY&!j5p{uh3Irq|#Hm9Z1{B0% z5~F~K1Boa&%gmP-=9YPr=eo&Do((JJy&vKxU9a+;1KH!A4_djmR&PG+A}tlNvC++pr;qlDhxMEt8*{EMpnW({S` zPF-jR&jA?f0;|{FmP`hs6TH_;tLyzn1Rm)yPqu^S00;;?#5FFF&>rvm61?C40I!a+ z_aN{t0|A6yE*bHzfR_*i8au$ANzM#SovMz2&}e;#arV;kA)LHL{Zi`-0nkobPxT{p z6GW;>3=D!^5YXboNeqgFl;D_{iXqAfVJH&Lsz<_85Vhpq^$42lrR%HaP5%cU`n4mO zzzFZyp>)GO-g6{Fw25yWbn{3?c01hW9a?6Tpb4Fr`u2;i_NK~bjNDwpgRSNRR|f0+E6m()lIXa#l% zL6wNaYQqH@jCn{ay>Nl}_)clL`Guu{IQu7*Yr-0JiMk#l{RcD^!tsABkOU#xx!#uYi29R&cK&l%c5C;99K;Yc5d(Iv3G5MMXNG;HR1g31zDw3L;h2$6dS!E-DQ7X zDp-b=Xri}X67%0D7yr~DmiBj8jFSsO(#?RJ($fO-%{zK(zl^iXVJ$nm90KnJ-H%o=uk&BVnx7y=;%)G1{PbX6QC!3qpqVK#Qr>COunZH)1XCrVZO7;gQg)|d2%#zGTzP`)oDd5E*rJ`eP%zBIx&z(AccHc(x=SyF*(M1{u->Wn;GEAdOF?# z`xG*mXVnYpDs6!JH)Qy7RPeFKlbjS}pdeAkL+WEFN#H=r1JYIL{}C5;=#JUcarPW_ z+A+^DzjQhfH!dJyQN9rKLwagXxYCpao@(XF`qGt&fsTdR0O~9o#NK6ZviIOSi2V(` zU&t~Q!La(hl|lZ5|EmaIwy^^=vxiB;Ozv%%AFfBQim&GQgziXpa;#VX245B;t&Yu( zEtntaPKHP;4-6e@a;Mn1y3gy_q&gB+a!Jv#O`oL8`gAbBr9G4C!B z#8X5NPdmPMoN=6WoO7JVJjVPu%md58ynF}q6ZKgi)%SuILm2nJ-ZJigC8fj$SBL9g zKkL)yde@>lIj&G$9KSfOI<7gcJ8n2`s+UNR#c|tlM}zDcq`0PH{(a0(!Tfa0&m_b^ zpoO1?`C0m>%Y$6)JX(WTd0FIRmr;h_o?LAVd1*u1;EZgD6~lc~$0H`JmNP5nN`%DgI<1>J$~;-LOD%yBqs()K6nJ|=56UI3krzOFB6$iw zp#}Q3Gf#FAa0reTsG~?lKHSypWu8n>LC*S1=y;MKRw4n>dZCBBfa*n3=M+J42|i!a z+N+1uqx@5G4GeqLq=4$R{qwNAZ72ocwi4nSi+c)C!uvwO(US^+!-Vj(XMgOC==MHNxKVBp7am#`QA zR6Va1Xx)?)(XO{~YxG|Q@9iG5E;LgHa_koAWp()z-k1Tc0P*F(rwf@=>x3j^p%lsgn@A4Q+Nz*WE3OuybM0N zApK1ShT<_Y0@wwRJKg~uNvQRbyO{JILH>kco*4%AEt07wd27Hv0-7Pe&8;Aq2^2x# z`QIH9z<>ZC2NSOVV3@a|HvwD$zsc;tT^I~e88F(rdPacB5;_tH5zq@J15EPJe#+CG zaOV%B8Bi{8e@EbeP?!%OBhz);;SrfEVCd@p)2+I#WD38)z|a6xkkmd)UXT@_NsrImxDGK zEAN#++RYCj6zf(maCssv?-bJE0@N<~ph@E5M7z9@8ZF(YhDxc_a1wq|PYUa$JF07y z)SW#hq?mXq-6X4D2j#8D&m%kEch@o->TI5mo$@g z%Y%b718PQ?^Q1n3o&e%=j8q~(`2$@A>O&wdM9N0)0vADENYr~bsa1f`1BAk%{(}^9 zJb_(u1jO3dQv5>0s8G8x z1w-`-Df}7_buF-2Kup16fZzy}l|W4mRDeLN7+jN%L;#ugZxhL8<`{J+drC#c+0+mf zXESGWXA5UbXDerGXB%f*XFF$_v%Rx}v!k<*~^*X?CtF1 z?CVU^hi<7{!R2&2v2&brJixr;oamh7oa}s8-?gQ7Oqz3zbFK3e=Q`)7&h^d>&W+Gx zvvZ4ct8<(4Gv{{9&%-=~;TB;21HHl4#`IGC-L0Ye`mKKYcUuGDuV1$|&=a=>DEx1j ze}H)?G5HFA2geN0?;p@RxW{+2DZwE;vw2ToeP(6{Uo5<5O%j!t zW?N0Cw|l!%QaZz1t&E#$FRe{-4^j#M@>P_P?MbD;Y`iF#8lW%F!jzYg0uf;UdGT7& zYW5g=TujvlC|B8|>PAq`>)hwuki}U=90krBG#NM#aKOPiQE~)$Apqk9E?Dg7n6LcB z{)n7PFY0^uc{ikeJ_5f0b3Sf3=q6zHo*P1lo`b_H0JH(3v-zd+K7Kznk{_+L=f4qW zm@cT>wTjYxE|1UR-{E`l+5A@C#qZ*m@q;058)RP2Z&zK1_`_O9sGfYt@8EN(Fc!{qpyr`o|0jM4KZ`GdyiXIpr&58RtMyRYm{+LJwcb#{IToVYKl8g?{7`kD z#&dD}82$)t;#aEwiXU_N{1p-LXOtBFsF*76R(J5L`9ta^DV0ADd4UB|cm4~0Hk5!a z)v8*ms@K#lS_de3tV0bmuT+14s^d9Y4lQbZr8|6IIfDOAy}*COFEAI2w1#-M^#Px$ z{-{(1hx|R&b&DFx9tYcal$a>&kfZ`f7c|a%lP?P7&VT6AFS3rasvvh zkNJN58g)PaAwPltRXxuhlX~)>x!67Oerhz|AIdBi@nEc~Px!qi3)s;S{9^u=x$OP!wmMY|<-elV@t+In{P*fweyTcO-boel z8z`4n4V;|ma1s40TIN5McbS)|8~L;RMt%rH>t(1naINR_p=3T0sz+0x-c_I_^>@Ax zKMiuqz4+7W7g|4lCYU1qgeLrExe6P~f5~6s4+{DGFMKh7N{OVJ@`L#6{3?Ev$;6+4 zr15Zmo48WF%+KJj3J>@ZCY~S0FQnW;isr@Z>Q4R!Ka%gQHINsYC-PWp<`QPHNBIJw zkyKZ+@#pw!n!+E`T1q|SJ+#1o&EJIg0q65u!0ltfDm{hS(NNsU#1dE$lftdlA9f(;G)6f@u##W>%k!?zhS{BR@3uaxA^;n15&X`^V zMUYU7$5JLfP@l;n%xxex6_^?v7!UI? zd&annv5cr2FrAtZq69y80p&LZhnh^#|Z6BN&qfcgxh zsPj8wXMtS}hPXFomP2p@s$n70PW*s=#GYZn7=V%}n9f?Gd>2;Zd&~ga!AKiO!fB*5 z75oeE+?%>{K?8zcQcU7)V4$%sFB1A?0DiN(DijYxT%QdlrNLlQ(NK5_+75DQP(Tda z>_O}^NC-0@VFom4SIj~N0A}UJOc+TEFwYGu3_`DUNnsXL{6b=x6#YhFi0yz~2(`@& zghu|tr0{t%G2K~L4zaGFE|>TqxtR4cOvsIxf$GCX;EjNZ2UWIgLonvxmi&557ZO9C zftxO{>ZeFeDGN`!5vvf)IOaCynv=LT$xT!l?pN5$TsCvdU;NMEjZ>R}|Qe4Kh#7F?t!%P&WyOAPgW*aG^ zV}OTdC<7q&{$Wf*y}%=q7hr$FTq=f2D0U6;BA`l}`4)T2D!21L554{(9FY;dOy~KN|_cHI| z&FtPnn(^tbkJvYxVVCRb{-tndSHOaZ1qlnL%@_B_Gn>_eUNqzWN{=}7z{Tr`*@M`A zi0y#rT8NI&Mk98rb_LP#h#P{qBt!>mC$$ZTPJ+s=Er|II(b0%)j+lMgR&5<(b|ZM3 zJsYD1Aoe}P6(D9W;<6AMukA^8)Gg6JxUIf%GnP||z?(JJCPB6a}cTr&{8 z0pn5WN`DafmBI%xOdyBX%(2S|LV6w1Qk5 zaAgppS0QdHqM?5m#H~SebwoQ5R~6Aq5jP4kc0~8r-a>3^tqo!vT6JwcVoo3~9?{zo zort&{h#i91QHTa1@I~wh#P&z5tSvw^%=$87zDKkbaqu_|(UrB;h^>R@2Z-AV>z{_W zo``FQ*nADdBLT4>gEbJBt$|$#g40`DiWnMk{)jn?IGEdR#I@8wVsf-&h>g`IBQ9Dy zfaudTyw;>L(Cb(_C~B1V&6hsBgEX&E@_`Y&yk25 zh`9FJWyFEp0cZMXGZ5Dmv274rO`C#f5Yozs>w&lk4QoLEyNG=oabIX-5OY^+f>^j_ z0~}a~*gOsB-iVm55Eq8H30ehhGvYo&%r}U+gE%MR61DS)bt16jxB-ZUQMYJ|U5E}v zH1PK#ViXOY4Mp^P#C1U2b`56H7tydURwFt_`&65V*pb>DZ7iaL5Z4WH%@DU0as3g8 zwEl?pLu_BfMj&(`w2Rsm?V5H2UfO;~yQe)yEaDLq#~@!61@CFEjB26As1@pk zvQR!6h1~EK_W5WnT8Flwz3|5MgD&(ndTz7X!ff%jTDE4kPPV?b9C%0iJGPm&k8Epf zpV-#hHrh7B+tIh%cG$kO?X!JlJ7oLD_KWR??Y`}a?V0UgyJq*Z$H9xxtJ&Xz;)PUr z4f+84Kzp`5$DU`;w-?%n+K1am+DF^R+Od5CyafF{`&9c^_7nDt_B(dhzYep*;RtX< zJE}PvKvt;Bqp(;Yn=y&MJb!tzOucO6q4?>nYDWb=-G6as1Zl*9wIdaD_z`)>qh7;hPGlD_p4X z%<1inhhRv$bAWT0bBfD3!#T@2+d0=c-?_-S%K4FVHN-YHI5$B&W1Dk3yv%$jyvBTw zb056C{3N__{8xAtIOipJNnWy-)l2oN?p4F9mRG7*9j|&`4ZIq8HSuca)y=D~*KjYF z*A%a%Ud3K3yjFRw_uA-n*z1JX4_-ID9(Xg}oVVaDdCT4wZ`84rq=F`%rt4|-F0Y14tqkSg$%=B60v&83PpLIT4eZKKI<8#&L zy3b9YTRwMu?zwy(`HJu!b1!&h?>`Ofy8>pS1~1K)+d%Y0Y) ze&)N=cbD%T-~GPle1Gu$$@hZqCEvgN1V5Xf!!Oz|23}X5052+U;MdZxqhC+IzJB?B zANsBG``B-d-+I3-e%t&$^ZVRyhu>bm3x1dUuJ~Q`yY6?>@1DQQ>~Hl~{gJ=jzk)+15y?;ml?*1eFNBfWUcl(d?pWy$l{|x_?{vY|T_FwD2&i`}& zgZ^LpAMwBGf6M=l|2_ZT{2vDR1q1{H1%w4e2gC%#2E+#>22>453+NEgDWFS0w}9>e zeFEG8;{qlGObnPD@Ls@XSHRYQ&jNM^>aLJ_A^k(LLI#Bl4#^D}5;8Poc*u;91tAMV z7Kbbi*%opv zS@B85zbihi_&k&fWkR`7Q>Z!A8mfjmLcK$yLt{eYLK8#Z4s8+IDzr^#yU?zoeL}NC z3qoBJLq7=pD0Fq`+R$~O+d@AJ-4nVm^hoHL&|g9yg#I1Ihbdt(VR2yzVM$@hVJTr% z!&-(-44WMGUf9&IX<;+MW`)fTn;W($Y)#lFVV{O=2-_LJ~DiCI1Zl{J|lcq`0Vh-;cLU! zg|83a7``L?K={G%U&612-w6LT{8sqg@cZEpB1{qWA{s$d4npMjnbh75Q`I?Z`)w zk0bwz{3r5RGv2@OkhmanCdY#Vrs>t#?*rJ}`6Om@%-1o`W5Z%2 zVxwX!#m2_Q$0o)m$5xN68`~hZQEZdg4zb;1d&l;T?H4;Jc5rNN?2uSj?Aq8(u{&b- z#h#137W+>eAE(6m#Kpx`jcXW}7B@NWy|}4y)8b~t&5D~HH#crx+=93d<5sxhK8jl% zw>EB1+`hO2aR=iL$9)rbD(;84pW-gWU5dLBFUFhV&GFWFHC~Ii$5)8=iuZ|+icgAf z5|88O#;=I~BK~armH1onj}oW^Q-V3cnxH0V2|fva3H}Ko2@wei2}ud{5*jBoO=zCb zGNDsKuY|0Gp$Q)*EJ|3CuqM+vJF)+Ve=*q(4a;X%Uh36ByUC;XN0Pr|cA zCQ(eZB-Tx=pV%<5abnZN=7}v6TPL`A#7`1G zP27;UDRE2Uw#4m;UnK5K{3`Kq;x~!kCjOduJMnJf{lwoAA13~h_&g~nDI_U0DLg6C zl@y&6la!cLKdEI>PSS{^QAuNx#wATinwT^>>Aj?tNk@~8C!I_>opdJYY|{Cp3rUxf zo+dkzDXYQpM2D}~jSf5{JvLCZiZ zL90RQKpR1uL0dt)K-M5TkUar}fx0%utU=Z`)^KYNYcK0KYl3x-b(uBW zy34xTnr|(z?z0}W7F!!^rrJ!mnPoG_X0FXro8>kuY&P0#w%KE2Z4+*jV3T2!Ws_rb z)F$7i$Of<}vnjWs*tFR&ZP+$kn;x59n|_<)HYS@twi|6BwkTU5-8SF0#FlEyu`ov@SJsqEBtI=e~m6!3KL4Df95GVn_9YVca{PB0Se3U&v3 zfxW@L-~ccl+zo*FU?F$_d>kwR4};}kCHN#*2fhTp3ce1$34R2A5B>!H0{&({&EC>} zzWp|Ph`pOV&YozWX?z#f98nO2pocdxI#Q2-Vi@XAOsBwgi0l5vCggk&ehCGA3guH>ghkSy3h5Ug0hE9P_ht7h|fzJEKW?BMW4qXLZ3*7+S z4BZCZ3EczT4?P66g4#gAPzV$Tb%we?-JxDkUuXan1r33QK@*^<&^%}Xlmsn-c0qfg zqfis{BJ?)&DfAQcEA*EmFx7E}1ojs89rhD$0k?!N zfG>t0fm_4v;0|yo91cgoQScCWI6M*_4Nrk*!zpkYoDCm@i{L}>5%@U#2K+XB68-@G z82$|Y68;PR*J+y5OeYJc#ZF6|);aBT+U;cT1aX2nIXk&H#X7}1B{`)y5uMVVvYbdx zRZe^-px0@_=|3lh(@7_d(_^P+POqKbIem2c;`H6=m$QZQT<5LMAZHtAurtIN<{a%D z=bYf2>`ZV@bIx=wbS`ynaBg&Nac+0+bXGW@bk;cQosG_?ozFR6cYg2u2Qd{f12G%1 z3$Yh*0C5-rLf9hg5pD=igb%_WfkFf$q7XO$k$}iTi6>$S`8!?HTf}D<=g`9)@=k-J`L9RruMs7jwLheD@BJGh-Bpexo#32)r zcq9>-j?6+9BTJCA$VOx{vKz@q3XucIGsyGEOUSFp8_3(pN#rBs6XaVY@EQ5lWroXa zm$@$UT@JV$b^*EAy4brwUEnS*E^aRVF2OFLF7Yl&E-5alE_E&qE=?}2E*&l`moAs% zE)thvmoXQei^1ip%R`qZF3(+Fxz2Z8Bw>mAp7t`A+GxIS}R?zYX%!!5zB)UDm^xSPsN z?WS?ly6N2XZYH-gZs*-Dx?OU+>h{v@ue*i&VRw+bt-HND)E(}QaCde0aQAlia}RV! zyN9}C+_CO4?l|{Ecf32nJ=>k+Ug=JCZ+Gu@m$=K^jqdl{pSgc=2Y$N$@tEx~&*P8> z*dxdz!XwV3(4*C(!-M6~<-zk1cnCdCc*s3e9%>Jr$2pG+9+y2HczpGo;yK%MgXcld zBc9ftcAoa0UYae!Jg5c8J^jmd7cHHB+quwPEU?!w=;VJi2dYhl`( z5_?I#M!d$o{_|3Jz4ZFz_0{W#*KhAB-qXBidRur~de8S><-OnA&fC))z(Ia>0Rf|_3rT&c=ve^dY|x?c`Ln7d7Hh@cwhCN^#19y$Ol;Mv(9Iu&t{)JJ_mj5 ze4sv9pBx{OPm52VkKE^?&lR8RJ~w@C`%L;g@Ok9(#OI^WH=mzAe|)F=&hnk(JI{Bs z?^fR(zPo()_`3T>`bPQ2`r>>Od<%TbeQSK1eA|7QzHDEfufVs@chGmjSLb`$_mb}w z-@CpKeSi4P_FLq)9`M`kcgPRo=i}$^7vvZ07v>l1hx1GHEAZ?0JMJg(8}=LXJK-ny zQ~9a=bbj~zKKcFjpXG1izuJGD{|5if{#*U``P=&2`$PTV{s@0pe|P_6|1AF!|8oB- z|5|^Ff1Q7Wf0KW^f2Tj+zu$k<|E&Kt|9k#l0+t4>2v{AkE&x~`urXjufPFw(Kt@1z zKyE;OKv6(xKzTrAfFM8|APZ0ioC+`pTn@Mq@HTK>;KINqfy)C|1g;8P8)y}X3JeYm z4Ga&A42%wp4NMFy3uFg!1A78{1BHS8fyV>2fj}rB|*!ARtIef z+7{#yl?7D>)daDFR6*(>O^`n5a?rJ) z8$q{%?gxECO-C(4ZANWF?L_TC?MK<6JW$>!KU5$JjfzHPpt4bUr~(uTRfpoBx>0Sa4WaSVR~$EIKScEHx}W zj2_k)))Lkp))~eL>j~=(I~jI2?0(pzu%}_q!d`^E4xbgiH++Biq3|Q&pm5u8yKwt( zSa?KuRCsK7e0V~5Qg}*uc{neeAKn|@7d{v+4j&314?h=vH~ek*hw#tg-@<=lW@A%!!;AxiE4`L|RAMMLI+VMdBh8Bk_^M z$n?n4$co77$YYVzNLFN5Brj4B*%$d=q$2WUq$W}yc|G!0lo`4i->iN4Tueojf=&{X2sUWGGp05EH{=HD~Roj9gH1~ zJrjFA_EPNC*c-98V<%%D#6FIF7W*>xP3*h4`EiTlmd34!TN$?|Ze85QIJ>y8I7}Qi zE;=qYEEl?snW{+=IABac^<+a0_uuaLaKk zaI0`@aUdKT7lI4J0T>(>7lVt#CE+S@H8?VkhO5KTagDe^+*#at+(q1F+%?=y+-=;G z`04Sp;^)NAi=Q9AFn&q=-gxhL-+2G{z<6|gXngoT`dUeRd3;rTZTzu#N_<^>Z@e+y z9Dg?ceEh}uEAiLjKgEBI{}KN?{!hY`gy{+E5}*mN1m^@Kkl>o&k>Hh(l#r5;nvju@ znUI~3mr$P|NsuOtCX6SXNRTHe6K*F=COk-ZobV*!S;EW28Hw8ycP8#m+?#kH@o=J5 zqGKW^5t|s3h)ax5OiIKj5)&&EPbA6{m5C=4HHrE}W1>0nZsOC#=Sj1Y<|NHaT9~vb zX-U%Zr2R?0Nq~P+U=k`RI4LX%lN6m4pOl_dltfLcPhuoBC$%OCllqg6CrOfqlddFP zPr8+KH|c)Tqok)vpOU^N{Yd(qyeN4|@}}g&$)IH0Wcy@DvPZIavR`swa!7LYKZ;;_ za#nI~a(;4AGLT%F%u4P`<|PY~g~A#Uw~hXUxK&7 z+u*@?2;LFzgh%52@agz0d@ep8Ux+Wpm*T7N0(>8S5HH3L;YaY}csc$q{yzQ@{we-B z{uTZ${#(k_lvybYQ#Pe+N!gyVD`jtrcZy$1UQdu%B>tcoKXF z{)8Yx3?Y+{O~@k@5J&_Xp`O4XG!xnge8L#v1VK(v5l#`V5uOoV5MC4B5k3&76K4_U z5a$sW5)Torh&Dtp5kiC!ory@ICqTpyvBVf6j+jWSA(DwSBAwVsY$3K2dx`x-8Bs|* zMbr`v#OK6U#J9u`#LvWU#Gk1%Q!P?gr>;xgn7So(d#X(;I2Do#OLb0lPYp|rNR3L3 zO^r{@P0dd&N(EBOQW>dDsjaCUsjSrgR9UJr^;D`h)sT84^>*rHD)1onQR=s}Icf9K z7N#vpTb{Nl?Qj|>%{I+G4Vs2ci%G+!C8i~(5z^Aqiqopn1Zk4A;k2=|6KV1^Rhl|Y zoAxGsX8Nl1?diMH_og36Kb#IqcT2~mm!?;wSEnCKr>57ZGtwpL7t^n#Ur)c4emDJo z`lIwG8S^ssX4qvoWH?~E5I!l*j%sQQQF6&~}<*XmstFw1x@6O(reK7k-wsm%3 zHaa^r8F#{X1t(&ib59Ia_mfT`{`r*qHcUd+9p`yuyp?zh~Zxxe$K=Pk=ynYSiyecr}A z`#i5apFID(pgeS5LS9l{N?vMSdLBKmF|Q@BJ+Cv5lh>WslLws2JDqno?`7V*ypMTb z@_y$1IXd;|jH9cL?l{Ulsy}+?=)I#4k3Kp2{OGHrZ;yUB`YC@&{`&kq`3Lil1UaJ=AB!PSBr1-A<(3mz0a zE_hb(qR^snY2l{A?S;Dv_ZA*1v?{bI1Q((U6AF_H3598enT0?hvyffLE$k`mE$lBG zEHoEBD|}h_rtp2?r^2s=--}ikZ7H%V@+k5y@+%4~LKVdn;ffNA0DMtaQEpLwQDG6Y zh+V`j>M0Tw^%V^k$%;-ET`am%biL?S(cPjCq=lpWY*9S7cz*G!;?2eTib2IL#qPyk z#lFP>#rR@kaXL_(S)5aRw79UiqL^GvE2bAW7B?50i_aEcD85{Lt@vi~o#K1N4~w4^ zKQDe+{HgdaFb$XqSOAv50$>pU1|R?oa0XleH^39{0sMea00UrwXg~^#0uz7&Py(j_ z4WI{1z!~5?a1poyTmzm1UrVNxtS(viFaHkMQnI~dXNiAFP)Tq}SV=@lR7q?Jt|Xx( zy`-|Fri5HVE2;mdlxCK&OS(#QCB~A|B^OFAmRu>hR`RLjYsvSLpZ{!Oe@o|;E-2kw zy1(>b>ETjPsZFVGX5bC&r9Vo4 z17%anrj@NJvn{hPgOgX=CanZjxtsmr;J+hvnwU&{BEA1FUmex%&G+^*cd98wN1_bB%&4=#@?k15YA&o0j^FDNIK)5_`P zjpZ%n?d4 zvMQ=7>MGhRIx9F8-4*-_VMTw1xMHH>YQ<#5$BJK-Q!8gw&aYfnd9c#9(xVbzNvuq- z%&N?-%&#n}1S-2KWtGOt)0O8cFIHZuyk7aa@>}K4%0E?8t7cTqt~y)=t@5o30IE<` zAywg3DOIUe8CBU;c~z}d9aXHVt}0%YpsKHGu-gD z{kCRG&GedCHFIj_)$Ff1RAW_RQv-l&AT_X>z#3Fdd`(hKN=<4_Mon2wWlc>DxrSEL zUvs=hQZrmLR&%08USp~`Q**xNQqAL&?yp_Czyqmm_e1LqI3?kc-?a5FwoQxp5l0C@Y0NIZmNJf)G z$rv)097D#D6Ulfok(@@(B0aG9p7{!@_ zq_|N$DLxc`N)RQO5=y~Pu#^}Ij*>u0qNGq#DH)V(N**PjQb;MLlu{}vRg@YEnL?w` zDUFn7N*jeqVNn~MVxpX(oTpr(T&3Kg+@?%Y z9#9@ro>5*>-ca6CK2g3>eo%f>r%!tP625Dz$7igDh z*Jw9scWCzj+Jn03b+hW`)Xl3~Shu8ZdELr7NFB1ytqhG)>i(;{SpQE?T|cjWLH$1vd;N;~RrTO{NIk6H zx!$GTz22)ns6M?ut3J0rzrLWps2-@VuV>UZ)wk9I?e&uS7xk~}-_?Jt|6KpA{%8H~ z`oDAw`ds=!`Vl&aZc7K#A#@lWPEV#2=&AG!dL})ao<}dB7t)z@Hl0iFq4(1J>Bs3} z`W5)4*xqHs~8n4W}EMh@dBqmWU|C}mVIsu^@fBV&Xy&iId^V4P%V7<$Gf##P2o z#-GM1jnf-vHd-`VHqL9@-*~9esu8eh1UEt&VU3}U;f;BX1&yS}lE%`;^2Vyh&c=(4 zmm9A&-e|ntIN5l=@nO@9rrAw%o8~tyYFgT~qG?r=QsM`O}ZvS)9a>pO&^=SG<|RS)$|u=-qyUc zc~A5H=0nX^%{I-LW^8jzGp;$Y8Q)B7ZfI_5Zf)*pW;J&;^P2h1=H|1_7n(0OUu(YE ze5ZM`Wk$>FmboqSTNbq}ZCTOc(BjzQ)PihrYw>LHY4K~xZpmvYXd$(fw3N40wbZms zw8&bNEvH(vEru3z%h{F-Etgw>w=LgV{&Dgtt%qAdt+uW9terWyN`la<->(90& zZEkHIZQgCZZ2@hlw&1qVww$)3ZG~;cZ9rRTTSXhQ?Lyn7wySN|+itbp1={YlJ!t#e zKCOLbyG8q)cFXn!?c3YK+aube+GE;r?TPKl?J4aw?c{b^JH5T3y|KNe{doJs_Q&nd z+F!K4ZhzPQq5V^bWyijbgB?dYtUK&F96B63{5k?V&>f*2m=0VAv7@L1=qT%`?5OD= zchEZM9gGfHhqB{ThqlAe0hl_@be!+F)N#AxH**SeI&&6t4s#xJA#(|HIdc_rEpr2N zGjkhrCvy*T9}~?CWri~&nOJ5tGme?SOk~zG8O$bTE3=K+!DKPJm|Uird6s#Bd6{{Q zd4qYIImvv$e98R9{M$LLb7rSS=i<(#o$ET+cW&%F+!@{(*%<|N#&*Va#&;%lrgRcI zn>t%N+dDfuS)H8D?oNKEpmVtMPUpSOhn-J4pLf3OeAD^9^Hb+{)-=`()_m3`)>hUI z)^655)$VM$q|tO?c$){_vp7n|KmGy(Yn7xL*p1p~^h3&w`u@l+JYyz9ePGe`XbJ)3THk-@lu?6g2 zb{~6?EoMvDH`#aC_t+2FPuS1cFWGO{@7Z72e>qb*b2*zi+c-NpdpP?!hd5Ro8xEKQ z;lMb~93&^1L*S%xGB{bBTuwfxfWzi+0S=EN;0QSb91%y%xx#tQdBu6l`M~+i`NsLl z`O`J0%d%@#*Y>VmU3)LFuDGu3uKcdTE>c%j7rAS=Ypm-; zm%K~Wb*f9-W#}?@ed_w!^`q-IcM5kJcP7_@Ysm$1ZMpVbC>PFk=DKj*xqufJ#m(au za7o+}ZaKG#Tg#$nZvCT=UYgUjM}ad}(;SI9lfy}-T1y~@4Ly~VxDo$Q{{J-vHY z_nhu|-3z;ybg%1%cEh_7-LBmp-QL}P-I(sk?&9v!?uzc}?ql85?)q+SH?P~+eY*Q> z_l53D-B-JBbl>Dn=gk6mb9nQ33weuq%Xlk!Yj|6DdwFmkg6GQf;Cb`>c!4}LFO-Mj zVR_NKQeFkGnsjTTW9%{aob5T^ zbE)TQ&$XUkJ%9Pr_%rzyd`tcU{$l=4-;R&whw?FeEI*nb$4}r_@CW%~ zzLY=8pWy$;SMX2rHGDJwGXE-nlK+bTmj8kOng5OdlmACBMX+12PjEnRSa3uD64(mt z1rC4!CrA_|3kU+DAWe`d$PwfUDh0;{62Y)wOmIRV6DS3z1X_Vfa7l1ga6@oQ@U(Yc z@50_Cy~}%7^seq**SoQIQ}6Cxn_h4)q!-rf-0RZo-s{yH+gsjS)mzRZycw(mgS;XY8GZJ&J~ zv=82g=yUD!==17J@5}1T?aS{g>Lc|5ePw->eXPD~eK-1U_f7WQ>wD1m5a@f=_om;n ze?kA^{$>5k`&ag_>9^{S=#T1;>5uDA=uhs)_Y?Xv`g8ls`;YZg`i1=i{i6P%erf+` z|3v@A0n35;1B(Wh4lEm3F|cxA)4-Miw*k)qp8@}YfC1D%$Uyi2W&k&kF_1lwH&8G@ z8YmekAE+8&4JZdr4X6in1HkRU#e+)+R}8KmTsOFJaLeHK!CixU2M-J$9`qax8bl9b z2crk^gIR+`gQbJVL~bHak&nnv6evQALPTMr2oY8kBf^OiMR*ZWlrG8=<%;q}g`#3n ziKtvuC8`yXMKlpz#1J)$+C&{9mZ(eAE#ixWq5+XeG$a}UMB}0pBDqK@IwjJI3?h^0 zjOd)`g6Oj7n&_tJj_97~f#|X5ndpV+mFTVLz37wZtLTU5w|I(px_Fj&j@VMXK)hJI zRJ=mGO1xIQLA+VKO}s^CQXNq&gN5utVlDI@%F0K;Sh>wY>;(9Sd+$?SrcZfU19C5dpFYXoh zi3h~T#S-zbcvL(gmWh?(Q(~>yAU2E7iZ6&SiLZ)ph;NH0#Sg@f#81U9#IMEg#2>|9 z#NWlg#D68zBr_!z5=+T^$s);82KwuA;IITFv6a|Mpc0tGS>hsbmv~8hB>@tYBt#M} ziI7A|Vk9_8f+R_jB1x5GNU|k)k^%`yQX(mrR7z?jWC=||mo!S6C2bO>ge~DpdL+G) zKFOeDbf{&heW-JYGt@oA9}*4?42gz@hDL_QhE5F0hg3tShO|QlV8}FdX6XFTrJ*ZB z*M@Em-5I(!^kC@m(6gbJL$8P44SgK?GW31u*U(?-H0eyKg>L&G+dQ1JJfl{5PO4PP9-GJJjb*6`io`@@fhpANqm zem(qd_~Y=G;qSx0hX0OC8<{y`F=9EgU}W*gvXPbRM%Ik1AK5grb!5lL?vZ^X2S<*K zSdZ9^IE*-sI5B2_uLV|*ZW-M+dSKLk6ge6&8a^5^nmC$1N*b*iWsEkBaz^_`$47Oe zmq+i9z8d{HHgjyz*qX5&V^(9ZG1sx6v4}D3Sn^o*SpHbmSmPLXOfn`LGmc#zyE8U9 zc7N=}*sHOh8xGW5RpF zZz5mF`2zW3`7-%R`5O6p z`6l^R`40JR`9AqU`4PFb+*WQchsxn{M6ldd?jiS*`^p34LGoaEm^?xrC6ATI%ai0O z@>F?-JX@Y8FOZYuCGv84mAqC?k=Mx^lNu@@q zR~nV4mFJWfl~gDn;$4_Eh_*{nbJ0V0D-} zLLH@!RmZE7)G6vzb%r`you@8Plhh^Za&?uuR!vdYsTQ+GAp=PPO)I7C7-KQQ@ zi`7!~sCq&zQ!CY{)LOMcZC0OEUr=9GUsK;y-%;OFKU62GEpgDm674vWBLiYZ^5zns!a6hNJ1$ z@HIlsfJUSl(u`=vHUDW8nv)uhMz1kx&S=hSE@`f6ZfI_6CN&Qy?Pl#Z?N03;?SAbct(DeB3)VukFs-xJ zMeDBh()wxxv?y(eHe4I2jn>9#6ST=%f;LT?sm;+I)fQ@twWZn$ZMF88ma47SGPKRw zHZ4=j)^fEy+FotH_PAD}9oCL%PiW;@l~%3QX^q;`+H=~ATHuQIy7rd#uJ*q6k@l(f zh4!`fo%W;li}t(rm-er2nr^1fLT9O4pj)h4rdz37qg$`rq}!_7q1&z7r#q-SqO;c7 z=^S*9Iwu`c=ce=2`RM$0LAqdFm@YyWrHj?Y>ymUSx>Q|;E?bwUE6|a2CAxB5m9ADt z(bef109})=RoAZT)Nyp(I=)V*8_&xb8olLU&T9(dl(2-5K3^-6h>s-3{Gs z-K6e;?y>Hf?xpUH?!E4l?yK&H?zeu5e!6~^evW>gexZJeez|^?eyx6kezSg?ey4tq ze!u>Z-b!zy2kRkvnBH0MqIcJO>3#J;fF7j}(TD3J_0jq`eS$t&Ptd37Gxa(8qxwR9 zvA$Gap|92-(^K{JdWODP-==5kS^6%0x1O&T>Id{9y+kk7kLt(uC-ic?O0U-I^aj02 ze@1^^e@TBue_ek|e^-BB|49Et|6Kn{|5pD&|5^V{|5N{4|JN`LFw8Vq7%UA742uoR z3@Z(*4eJaW44VyG4Lc0G4SNj-42KOMgRKEUAB01Rb@3PZKwn1O1jH!uv%hBiZofo0$rx($4T(9mx< zZjcy&VZ)f=gh6gl8Po=y!Du*bIA^$MxNNv)xM{d!xMz51cw%^NcxiZJcxU)%_+t2O z_+|KOoNAn5oNb(IoNruYTw+{qTxDEqTyNZH++y5j+-clx+-p2wJZuCRZH#tC2cx6W z$%r(%8a<5OMn7Yq5p4`Hh8rV|(Z;wP#sp)sF~yi_%rIsf^Na;XlCi{CZmcra8Y#v) zV}r5D*lO(f7i%(gB_J~@j3Md*s%ZBv=Kme5Fyy^_xDn;J8+CjLwb{$gz->i_@% literal 0 HcmV?d00001 diff --git a/Preferences/General/English.lproj/Preferences.nib/classes.nib b/Preferences/General/English.lproj/Preferences.nib/classes.nib new file mode 100644 index 000000000..ec6441322 --- /dev/null +++ b/Preferences/General/English.lproj/Preferences.nib/classes.nib @@ -0,0 +1,20 @@ +{ + IBClasses = ( + {CLASS = FileDrawerPane; LANGUAGE = ObjC; SUPERCLASS = PreferencePane; }, + {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, + {CLASS = HotKeyPane; LANGUAGE = ObjC; SUPERCLASS = PreferencePane; }, + { + CLASS = PrefPaneController; + LANGUAGE = ObjC; + OUTLETS = {fileDrawerPane = FileDrawerPane; hotKeyPane = HotKeyPane; }; + SUPERCLASS = NSObject; + }, + { + CLASS = PreferencePane; + LANGUAGE = ObjC; + OUTLETS = {view = NSView; }; + SUPERCLASS = NSObject; + } + ); + IBVersion = 1; +} \ No newline at end of file diff --git a/Preferences/General/English.lproj/Preferences.nib/info.nib b/Preferences/General/English.lproj/Preferences.nib/info.nib new file mode 100644 index 000000000..72f7bc250 --- /dev/null +++ b/Preferences/General/English.lproj/Preferences.nib/info.nib @@ -0,0 +1,24 @@ + + + + + IBDocumentLocation + 69 77 356 240 0 0 1024 746 + IBEditorPositions + + 10 + -9 537 668 209 0 0 1024 746 + 11 + 155 171 241 464 0 0 1024 746 + + IBFramework Version + 446.1 + IBOpenObjects + + 11 + 10 + + IBSystem Version + 8J135 + + diff --git a/Preferences/General/English.lproj/Preferences.nib/keyedobjects.nib b/Preferences/General/English.lproj/Preferences.nib/keyedobjects.nib new file mode 100644 index 0000000000000000000000000000000000000000..d5763a9621ba8fec832b2e3972270a0cdbd060e3 GIT binary patch literal 1939 zcmZWp3s6*57{2F)@(?bs^??u2^#Sr&76jCyc!;35AXish5xnePWO3Q6_g+9no#P`L zb<9kxM$!n;#?0rG)uh%mjGej5q@%LSo)-_C!WlkRyt>1rC3|nu*5H`%Uf5iTi@`^ z<}J@}-}%a(eTUvY@y@&NpZ@IYOW$1n_R7_3*KgeV{_b3>zscvj!AA`WkKiMtqGMt$ zgNF2^b5-9Nt;{O63n(y~4gL@R#|RcFjA4tcEMYZ8vR|7e z`o+bPGN0i|%QcqhbO;r)tkKbQ5>2E@bPSz9v*|<{M04msYNhcsixSH5JcZpBdqyS` zZ3xxrP)tz`A62eMb>*U8Vth44_W2~GJ3D9cluA>Gq`J(7pH*~DnOe;Nnp910G$mB_ zX{q7)lKcYMEsOn}yK^m1J;`hrr$}y=Z3F z^x~2kG?>QFI68ukx;V>WDJ!2{Au#=glB#+AqQ(rJ=MYN8TFJ+{3v!drq(QC>ZdK&B)>lDY;7gR^{JV^^c6LASwlQwN&U%wFtl>9W1c6owVUZrNK~)};9)t$(JO|Ln{DtznQh zyP|~-HXMl69aza6uv8a$eNv$!wn)l9F05XYTCyPHX32z z3C~v8Xb2t79EGm>ej|;umaXh8mX6fVs_XvMf>D2A$KD-n`iulj$Ws(?1-mUHvI~B( zy{lXkTG(|BW({I#0;}2G*4Z|doxR%LWn&M8flmVaZh!kemT&7TfJRBK<#7AHBS)Rb zSJJU`91W%8sf8v4Zd^C=G3olYN_S$s8ei7pXS1Dad9S^LHO{r148#xG4`{X$VMcNJ zblpbCMlXa7Ukqaz9B6p9{lMqvzWDO1^W7IN(qx)KQ)wEt(R6C388nk7@F6_l!}%aS zf*-_(@?kt-_%~;E&`~UY7wB`xh}k*!dOLe{k4o~*-%ug@3*`oKkz5>S{OTG>nBwFb(Fw0$2p+!fLn-Hp8`W9ozsn!L4u? z?11~=8}Lnd7#@Yk;al(&JPR+ttMEF!32(vM@E*JmAHatQp$HU*QcxO7M;T}m%0~HU zI+~3tkqgxzH)=v_&}Os^wV~J0esmBWL1$18x{hw5Tj(~rgYKgT=qL0D2jfsY2uI*Z z9F0ffF?cLa#WrlmnK%pQ;TgCTJ8(I!z#^{04R{4!i#Osecq`t9x8ognC*Fm3<4*iK zK7bG6L-+_jhEL#=_%!|ye}q5AXYi-^9KL{i@Fjd1U%}V#4cv?WAVDOQgpqI(O=5_J z#F4RNJV_)INeW3L=_G?pBH3gz$tA^P1}P;DQcfz!9O5LE#6_w|HCaSziHFpYdeT6A k#7|VBk!I3LR*^MiJ=s7uk}c#p&Uhd&BX>U#1A*-R8||Nk(*OVf literal 0 HcmV?d00001 diff --git a/Preferences/General/FileDrawerPane.h b/Preferences/General/FileDrawerPane.h new file mode 100644 index 000000000..b875027b0 --- /dev/null +++ b/Preferences/General/FileDrawerPane.h @@ -0,0 +1,17 @@ +// +// FileDrawerPane.h +// Preferences +// +// Created by Zaphod Beeblebrox on 9/4/06. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import +#import "PreferencePane.h" + + +@interface FileDrawerPane : PreferencePane { + +} + +@end diff --git a/Preferences/General/FileDrawerPane.m b/Preferences/General/FileDrawerPane.m new file mode 100644 index 000000000..a4e37fedd --- /dev/null +++ b/Preferences/General/FileDrawerPane.m @@ -0,0 +1,20 @@ +// +// FileDrawerPane.m +// Preferences +// +// Created by Zaphod Beeblebrox on 9/4/06. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import "FileDrawerPane.h" + + +@implementation FileDrawerPane + +- (void)awakeFromNib +{ + [self setName:@"File Drawer"]; + [self setIcon:@"file_drawer"]; +} + +@end diff --git a/Preferences/General/General.xcodeproj/project.pbxproj b/Preferences/General/General.xcodeproj/project.pbxproj new file mode 100644 index 000000000..dabfd3a46 --- /dev/null +++ b/Preferences/General/General.xcodeproj/project.pbxproj @@ -0,0 +1,311 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 42; + objects = { + +/* Begin PBXBuildFile section */ + 8D5B49B0048680CD000E48DA /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C167DFE841241C02AAC07 /* InfoPlist.strings */; }; + 8D5B49B4048680CD000E48DA /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */; }; + 8E07AA870AAC8EA200A4B32F /* FileDrawerPane.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E07AA7F0AAC8EA200A4B32F /* FileDrawerPane.m */; }; + 8E07AA880AAC8EA200A4B32F /* HotKeyPane.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E07AA810AAC8EA200A4B32F /* HotKeyPane.m */; }; + 8E07AA890AAC8EA200A4B32F /* PreferencePane.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E07AA830AAC8EA200A4B32F /* PreferencePane.m */; }; + 8E07AA8A0AAC8EA200A4B32F /* PrefPaneController.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E07AA850AAC8EA200A4B32F /* PrefPaneController.m */; }; + 8E07ABDC0AAC95BC00A4B32F /* file_drawer.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E07ABDA0AAC95BC00A4B32F /* file_drawer.png */; }; + 8E07ABDD0AAC95BC00A4B32F /* hot_keys.png in Resources */ = {isa = PBXBuildFile; fileRef = 8E07ABDB0AAC95BC00A4B32F /* hot_keys.png */; }; + 8E07AC050AAC968C00A4B32F /* Preferences.nib in Resources */ = {isa = PBXBuildFile; fileRef = 8E07AC030AAC968C00A4B32F /* Preferences.nib */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 089C1672FE841209C02AAC07 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; + 089C167EFE841241C02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; + 089C167FFE841241C02AAC07 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; + 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = /System/Library/Frameworks/Cocoa.framework; sourceTree = ""; }; + 32DBCF630370AF2F00C91783 /* General_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = General_Prefix.pch; sourceTree = ""; }; + 8D5B49B6048680CD000E48DA /* General.preferencePane */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = General.preferencePane; sourceTree = BUILT_PRODUCTS_DIR; }; + 8D5B49B7048680CD000E48DA /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = Info.plist; sourceTree = ""; }; + 8E07AA7E0AAC8EA200A4B32F /* FileDrawerPane.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = FileDrawerPane.h; sourceTree = ""; }; + 8E07AA7F0AAC8EA200A4B32F /* FileDrawerPane.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = FileDrawerPane.m; sourceTree = ""; }; + 8E07AA800AAC8EA200A4B32F /* HotKeyPane.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = HotKeyPane.h; sourceTree = ""; }; + 8E07AA810AAC8EA200A4B32F /* HotKeyPane.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = HotKeyPane.m; sourceTree = ""; }; + 8E07AA820AAC8EA200A4B32F /* PreferencePane.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PreferencePane.h; sourceTree = ""; }; + 8E07AA830AAC8EA200A4B32F /* PreferencePane.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = PreferencePane.m; sourceTree = ""; }; + 8E07AA840AAC8EA200A4B32F /* PrefPaneController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PrefPaneController.h; sourceTree = ""; }; + 8E07AA850AAC8EA200A4B32F /* PrefPaneController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = PrefPaneController.m; sourceTree = ""; }; + 8E07AA860AAC8EA200A4B32F /* SS_PreferencePaneProtocol.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SS_PreferencePaneProtocol.h; sourceTree = ""; }; + 8E07ABDA0AAC95BC00A4B32F /* file_drawer.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = file_drawer.png; path = Icons/file_drawer.png; sourceTree = ""; }; + 8E07ABDB0AAC95BC00A4B32F /* hot_keys.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = hot_keys.png; path = Icons/hot_keys.png; sourceTree = ""; }; + 8E07AC040AAC968C00A4B32F /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/Preferences.nib; sourceTree = ""; }; + D2F7E65807B2D6F200F64583 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = /System/Library/Frameworks/CoreData.framework; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 8D5B49B3048680CD000E48DA /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D5B49B4048680CD000E48DA /* Cocoa.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 089C166AFE841209C02AAC07 /* General */ = { + isa = PBXGroup; + children = ( + 08FB77AFFE84173DC02AAC07 /* Classes */, + 32C88E010371C26100C91783 /* Other Sources */, + 089C167CFE841241C02AAC07 /* Resources */, + 089C1671FE841209C02AAC07 /* Frameworks and Libraries */, + 19C28FB8FE9D52D311CA2CBB /* Products */, + ); + name = General; + sourceTree = ""; + }; + 089C1671FE841209C02AAC07 /* Frameworks and Libraries */ = { + isa = PBXGroup; + children = ( + 1058C7ACFEA557BF11CA2CBB /* Linked Frameworks */, + 1058C7AEFEA557BF11CA2CBB /* Other Frameworks */, + ); + name = "Frameworks and Libraries"; + sourceTree = ""; + }; + 089C167CFE841241C02AAC07 /* Resources */ = { + isa = PBXGroup; + children = ( + 8E07ABD90AAC95AF00A4B32F /* Icons */, + 8D5B49B7048680CD000E48DA /* Info.plist */, + 089C167DFE841241C02AAC07 /* InfoPlist.strings */, + 8E07AC030AAC968C00A4B32F /* Preferences.nib */, + ); + name = Resources; + sourceTree = ""; + }; + 08FB77AFFE84173DC02AAC07 /* Classes */ = { + isa = PBXGroup; + children = ( + 8E07AA860AAC8EA200A4B32F /* SS_PreferencePaneProtocol.h */, + 8E07AA840AAC8EA200A4B32F /* PrefPaneController.h */, + 8E07AA850AAC8EA200A4B32F /* PrefPaneController.m */, + 8E07AA820AAC8EA200A4B32F /* PreferencePane.h */, + 8E07AA830AAC8EA200A4B32F /* PreferencePane.m */, + 8E07AA7E0AAC8EA200A4B32F /* FileDrawerPane.h */, + 8E07AA7F0AAC8EA200A4B32F /* FileDrawerPane.m */, + 8E07AA800AAC8EA200A4B32F /* HotKeyPane.h */, + 8E07AA810AAC8EA200A4B32F /* HotKeyPane.m */, + ); + name = Classes; + sourceTree = ""; + }; + 1058C7ACFEA557BF11CA2CBB /* Linked Frameworks */ = { + isa = PBXGroup; + children = ( + 1058C7ADFEA557BF11CA2CBB /* Cocoa.framework */, + ); + name = "Linked Frameworks"; + sourceTree = ""; + }; + 1058C7AEFEA557BF11CA2CBB /* Other Frameworks */ = { + isa = PBXGroup; + children = ( + 089C167FFE841241C02AAC07 /* AppKit.framework */, + D2F7E65807B2D6F200F64583 /* CoreData.framework */, + 089C1672FE841209C02AAC07 /* Foundation.framework */, + ); + name = "Other Frameworks"; + sourceTree = ""; + }; + 19C28FB8FE9D52D311CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + 8D5B49B6048680CD000E48DA /* General.preferencePane */, + ); + name = Products; + sourceTree = ""; + }; + 32C88E010371C26100C91783 /* Other Sources */ = { + isa = PBXGroup; + children = ( + 32DBCF630370AF2F00C91783 /* General_Prefix.pch */, + ); + name = "Other Sources"; + sourceTree = ""; + }; + 8E07ABD90AAC95AF00A4B32F /* Icons */ = { + isa = PBXGroup; + children = ( + 8E07ABDA0AAC95BC00A4B32F /* file_drawer.png */, + 8E07ABDB0AAC95BC00A4B32F /* hot_keys.png */, + ); + name = Icons; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 8D5B49AC048680CD000E48DA /* General */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB913A08733D840010E9CD /* Build configuration list for PBXNativeTarget "General" */; + buildPhases = ( + 8D5B49AF048680CD000E48DA /* Resources */, + 8D5B49B1048680CD000E48DA /* Sources */, + 8D5B49B3048680CD000E48DA /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = General; + productInstallPath = "$(HOME)/Library/Bundles"; + productName = General; + productReference = 8D5B49B6048680CD000E48DA /* General.preferencePane */; + productType = "com.apple.product-type.bundle"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 089C1669FE841209C02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 1DEB913E08733D840010E9CD /* Build configuration list for PBXProject "General" */; + hasScannedForEncodings = 1; + mainGroup = 089C166AFE841209C02AAC07 /* General */; + projectDirPath = ""; + targets = ( + 8D5B49AC048680CD000E48DA /* General */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 8D5B49AF048680CD000E48DA /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8D5B49B0048680CD000E48DA /* InfoPlist.strings in Resources */, + 8E07ABDC0AAC95BC00A4B32F /* file_drawer.png in Resources */, + 8E07ABDD0AAC95BC00A4B32F /* hot_keys.png in Resources */, + 8E07AC050AAC968C00A4B32F /* Preferences.nib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 8D5B49B1048680CD000E48DA /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8E07AA870AAC8EA200A4B32F /* FileDrawerPane.m in Sources */, + 8E07AA880AAC8EA200A4B32F /* HotKeyPane.m in Sources */, + 8E07AA890AAC8EA200A4B32F /* PreferencePane.m in Sources */, + 8E07AA8A0AAC8EA200A4B32F /* PrefPaneController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 089C167DFE841241C02AAC07 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 089C167EFE841241C02AAC07 /* English */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + 8E07AC030AAC968C00A4B32F /* Preferences.nib */ = { + isa = PBXVariantGroup; + children = ( + 8E07AC040AAC968C00A4B32F /* English */, + ); + name = Preferences.nib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 1DEB913B08733D840010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_FIX_AND_CONTINUE = YES; + GCC_MODEL_TUNING = G5; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = General_Prefix.pch; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Library/Bundles"; + PRODUCT_NAME = General; + WRAPPER_EXTENSION = preferencePane; + ZERO_LINK = YES; + }; + name = Debug; + }; + 1DEB913C08733D840010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = ( + ppc, + i386, + ); + GCC_GENERATE_DEBUGGING_SYMBOLS = NO; + GCC_MODEL_TUNING = G5; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = General_Prefix.pch; + INFOPLIST_FILE = Info.plist; + INSTALL_PATH = "$(HOME)/Library/Bundles"; + PRODUCT_NAME = General; + WRAPPER_EXTENSION = preferencePane; + }; + name = Release; + }; + 1DEB913F08733D840010E9CD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; + }; + name = Debug; + }; + 1DEB914008733D840010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB913A08733D840010E9CD /* Build configuration list for PBXNativeTarget "General" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB913B08733D840010E9CD /* Debug */, + 1DEB913C08733D840010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DEB913E08733D840010E9CD /* Build configuration list for PBXProject "General" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB913F08733D840010E9CD /* Debug */, + 1DEB914008733D840010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 089C1669FE841209C02AAC07 /* Project object */; +} diff --git a/Preferences/General/General_Prefix.pch b/Preferences/General/General_Prefix.pch new file mode 100644 index 000000000..df2732e06 --- /dev/null +++ b/Preferences/General/General_Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'General' target in the 'General' project. +// + +#ifdef __OBJC__ + #import +#endif diff --git a/Preferences/General/HotKeyPane.h b/Preferences/General/HotKeyPane.h new file mode 100644 index 000000000..4a514e1f1 --- /dev/null +++ b/Preferences/General/HotKeyPane.h @@ -0,0 +1,17 @@ +// +// HotKeyPane.h +// Preferences +// +// Created by Zaphod Beeblebrox on 9/4/06. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import +#import "PreferencePane.h" + + +@interface HotKeyPane : PreferencePane { + +} + +@end diff --git a/Preferences/General/HotKeyPane.m b/Preferences/General/HotKeyPane.m new file mode 100644 index 000000000..1261f0be2 --- /dev/null +++ b/Preferences/General/HotKeyPane.m @@ -0,0 +1,20 @@ +// +// HotKeyPane.m +// Preferences +// +// Created by Zaphod Beeblebrox on 9/4/06. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import "HotKeyPane.h" + + +@implementation HotKeyPane + +- (void)awakeFromNib +{ + [self setName:@"Hot Keys"]; + [self setIcon:@"hot_keys"]; +} + +@end diff --git a/Preferences/General/Icons/file_drawer.png b/Preferences/General/Icons/file_drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..59f76ccad4513121b7e7fdd97c5253cd1061f8bd GIT binary patch literal 1904 zcmV-$2aouPP)HX+dHo(u~@DVe!p6uQ`)%XoWBnSCa;}qNX#v1@_B9oa1#r3OE(a?ia`4y5i@syRXZAd^Q2rs1NlpE4> z$`818Br9tzm-s3Nrxs9W9mCnuR%nde^oPIe)<9&3|z8k&V7>6!kV2-x{~xK5`SPDm(SU43E<` zFpJ)?TU>UG-=;>cMUt%0`w0Ta(+l28$jHA_SkVk~&m?zZuno(x52l`Jgo$Mjo7#sG{;ipQtS615MXz^i zs)a7O>_RiQ?H#)fjWEb#u*Dor$}(?w3=bz{E)l?xmR*eUIvbkoQ>d|waRO$?3=St3 z%{}94^<))dP0M^V^+T}s%}^g)g+f&ecYK!X2?AdpPhV>6a>3%bvI1kf3&xH~It6!7 zRBOjMO>^b5?)Lc1vXQ#BG44}i8AoH+&ScTu%^)5+^K0iW9&Pm#RR4riqN5bkru$ zarqh=hmc}mxheXJZB`f$!88r0T8Evz? zA}k?8z5N>WwC82Qz=~aVkrDes!*2!$i(c6q5+2Ru&tu|1@d7t&!k~SkcLD-Lo~y_2 z?K`k6FK&c_UQ##mG*%Q;c5vjDS=P)kNRku?dVjxa_2Pow7lr;uUqq||yY_rE@YRVd z`n)pWNTM7ceG)?#Nh(gtE4Yr~+dLh_$20Lsz-431ry+Znu+AT0p{lihlsJ$ts%c=5BC6I|~Xus3GY z6`S literal 0 HcmV?d00001 diff --git a/Preferences/General/Icons/hot_keys.png b/Preferences/General/Icons/hot_keys.png new file mode 100644 index 0000000000000000000000000000000000000000..36239029a648c598044f00af134f75b31f8176e1 GIT binary patch literal 1374 zcmV-k1)=(hP)B1~@p>EQhn=~OPf)Me!RjHa51g$Yqthx}aj~J=3)M9<%_&_Ytah!+F z%XvBDs3ShUe*ZJ~T%A`dH8DN#=bV{)&j0(}^PO|P7ZBCe z)u8}~hlixqY6aa7KR&1Bm6i7f0N=r(LE#Nw07T9Jcih<6pvO-hQ`R@xG&?&Z{@dT* z|IdLj7J~10j~>yNUwO+N@Z7I}UIh249v7Z_(E&XC!0qvnhvin}Q6%9|(EjYs9ZE<@pv1&P zN=izi)losd(hW!tIJW1zucpscJcIz2rVc}Hn!X`zym z646E=kMibdOAqPiV4a=wr8k(4xpylOdajaHV zRjD)JQQjOurN@P*L%=KjuLdCLL2fdcC?_X}`uqDu3I+xSsI;_H9xTBbQ{Mct$F%^^ zmH<0DJCvE3DfV=4Z!e9FjZtxNF_o8>t1|!qIqu2;=w#oGE#wXZjYcD-r>BeUXR%mB z(B{TQDk>^c0U$AkgGGAT>Ez@j62NZXC7az&Hk&P2%eL}+mj`1Y0MgRZ#NJ0bP`+n? zyu3Wo&!wcm&TRy|>=A6+>G=3K62Qt2tyXJH!4Lr3+uM|ynko(>y8X6iX=fMM- zotq<_PDgI1TMc^I!-AUs4+H{KSydSdV6j-q%u^am060AfrXVFHCFC35#+QwI_wUpA z+qbl+StN(cp}tV4k6Az*9vxC;Wf%Y+?wEIC%4)OH@yRi1by|v#k5~6RN?lzYWn^T~ zATP|x-+v>k-O6uo6G6j$@E_6_0kF-h8`B$0X0w^xu3&DvySv5Js-vTW`uh6ld2=(B zS5#1EXD7XW^MCz)WtgYk*RZphBg76(#pZZ4HSdqzFH zC4XY5AwHV_;+qeq9|5EJc=lOQ+Jmfj#%J!*r|q`u)2U$K52AE#gVL>%GZ zfAGa)eSKYwMKFvB_r=<&;FPHVjl7T1QKMO)`T2SAo&R%cii7D%r{Ch7>P1_vS$Y65 z^g3U+7Wlg`Jv~kHbMv&qLGXXDZ?KlWDDcHW6$xO_)AYR>RxBgB|!*vzzi?1aB5E}ru>-jb_ z#ZxoKCmDqHhtTZItVq?;(h`-Gl>y*30KUM!F68OS&(FURVf*6nLTmth%1UK@e#1&t gVv9U{@{x4wZ&r4hy`*6J>i_@%07*qoM6N<$g1?EG$N&HU literal 0 HcmV?d00001 diff --git a/Preferences/General/Info.plist b/Preferences/General/Info.plist new file mode 100644 index 000000000..8fab1133d --- /dev/null +++ b/Preferences/General/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleName + ${PRODUCT_NAME} + CFBundleIconFile + + CFBundleIdentifier + com.vspader.cogpreferences + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + BNDL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + NSPrincipalClass + PrefPaneController + + diff --git a/Preferences/General/PrefPaneController.h b/Preferences/General/PrefPaneController.h new file mode 100644 index 000000000..2c28b10b4 --- /dev/null +++ b/Preferences/General/PrefPaneController.h @@ -0,0 +1,23 @@ +// +// PreferencesController.h +// Preferences +// +// Created by Zaphod Beeblebrox on 9/4/06. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import +#import "SS_PreferencePaneProtocol.h" + +#import "HotKeyPane.h" +#import "FileDrawerPane.h" + +@interface PrefPaneController : NSObject { + IBOutlet HotKeyPane *hotKeyPane; + IBOutlet FileDrawerPane *fileDrawerPane; +} + +- (FileDrawerPane *)fileDrawerPane; +- (HotKeyPane *)hotKeyPane; + +@end diff --git a/Preferences/General/PrefPaneController.m b/Preferences/General/PrefPaneController.m new file mode 100644 index 000000000..a2d3d028c --- /dev/null +++ b/Preferences/General/PrefPaneController.m @@ -0,0 +1,34 @@ +// +// PreferencesController.m +// Preferences +// +// Created by Zaphod Beeblebrox on 9/4/06. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import "PrefPaneController.h" +#import "SS_PreferencePaneProtocol.h" + +@implementation PrefPaneController + ++ (NSArray *)preferencePanes +{ + BOOL loaded; + + PrefPaneController *prefPaneController = [[PrefPaneController alloc] init]; + loaded = [NSBundle loadNibNamed:@"Preferences" owner:prefPaneController]; + + return [NSArray arrayWithObjects: [prefPaneController hotKeyPane], [prefPaneController fileDrawerPane], nil]; +} + +- (HotKeyPane *)hotKeyPane +{ + return hotKeyPane; +} + +- (FileDrawerPane *)fileDrawerPane +{ + return fileDrawerPane; +} + +@end diff --git a/Preferences/General/PreferencePane.h b/Preferences/General/PreferencePane.h new file mode 100644 index 000000000..64aa4ee6f --- /dev/null +++ b/Preferences/General/PreferencePane.h @@ -0,0 +1,31 @@ +// +// PreferencePane.h +// Preferences +// +// Created by Zaphod Beeblebrox on 9/4/06. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import +#import "SS_PreferencePaneProtocol.h" + +@interface PreferencePane : NSObject { + IBOutlet NSView *view; + + NSString *name; + NSImage *icon; +} + +- (NSView *)paneView; +- (NSString *)paneName; +- (NSImage *)paneIcon; +- (NSString *)paneToolTip; + +- (BOOL)allowsHorizontalResizing; +- (BOOL)allowsVerticalResizing; + +- (void)setName:(NSString *)s; +- (void)setIcon:(NSString *)i; +- (void)setToolTip:(NSString *)t; + +@end diff --git a/Preferences/General/PreferencePane.m b/Preferences/General/PreferencePane.m new file mode 100644 index 000000000..4b7e18133 --- /dev/null +++ b/Preferences/General/PreferencePane.m @@ -0,0 +1,57 @@ +// +// PreferencePane.m +// Preferences +// +// Created by Zaphod Beeblebrox on 9/4/06. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import "PreferencePane.h" + + +@implementation PreferencePane + +- (NSView *)paneView +{ + return view; +} + +- (NSString *)paneName +{ + return name; +} + +- (NSImage *)paneIcon +{ + return icon; +} + +- (NSString *)paneToolTip +{ + return nil; +} + +- (BOOL)allowsHorizontalResizing +{ + return NO; +} + +- (BOOL)allowsVerticalResizing +{ + return NO; +} + +- (void)setName:(NSString *)s +{ + [s retain]; + [name release]; + name = s; +} + +- (void)setIcon:(NSString *)i +{ + [icon release]; + icon = [[NSImage alloc] initWithContentsOfFile:[[NSBundle bundleForClass:[self class]] pathForImageResource:i]]; +} + +@end diff --git a/Preferences/General/SS_PreferencePaneProtocol.h b/Preferences/General/SS_PreferencePaneProtocol.h new file mode 100644 index 000000000..2193a5484 --- /dev/null +++ b/Preferences/General/SS_PreferencePaneProtocol.h @@ -0,0 +1,50 @@ +#import + +@protocol SS_PreferencePaneProtocol + + +// preferencePanes is called whenever the calling application wants to instantiate preference panes. +// This method returns an array of preference pane instances. This array is autoreleased, +// so the calling application needs to retain whatever it wants to keep. +// If no instances were generated, this returns nil. + ++ (NSArray *)preferencePanes; + + + // paneView returns a preference pane's view. This must not be nil. + +- (NSView *)paneView; + + + // paneName returns the name associated with a preference pane's view. + // This is used as the label of the pane's toolbar item in the Preferences window, + // and as the title of the Preferences window when the pane is selected. + // This must not be nil or an empty string. + +- (NSString *)paneName; + + + // paneIcon returns a preference pane's icon as an NSImage. + // The icon will be scaled to the default size for a toolbar icon (if necessary), + // and shown in the toolbar in the Preferences window. + +- (NSImage *)paneIcon; + + + // paneToolTip returns the ToolTip to be used for a preference pane's icon in the + // Preferences window's toolbar. You can return nil or an empty string to disable + // the ToolTip for this preference pane. + +- (NSString *)paneToolTip; + + + // allowsHorizontalResizing and allowsVerticalResizing determine whether the Preferences window + // will be resizable in the respective directions when the receiver is the visible preference + // pane. The initial size of the receiver's view will be used as the minimum size of the + // Preferences window. + +- (BOOL)allowsHorizontalResizing; +- (BOOL)allowsVerticalResizing; + + +@end diff --git a/Preferences/PreferencesController.h b/Preferences/PreferencesController.h new file mode 100644 index 000000000..93d6ddce7 --- /dev/null +++ b/Preferences/PreferencesController.h @@ -0,0 +1,18 @@ +// +// PreferencesController.h +// Cog +// +// Created by Zaphod Beeblebrox on 9/4/06. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import +#import "SS_PrefsController.h" + +@interface PreferencesController : NSObject { + SS_PrefsController *prefs; +} + +- (IBAction)showPrefs:(id)sender; + +@end diff --git a/Preferences/PreferencesController.m b/Preferences/PreferencesController.m new file mode 100644 index 000000000..4428cb338 --- /dev/null +++ b/Preferences/PreferencesController.m @@ -0,0 +1,40 @@ +// +// PreferencesController.m +// Cog +// +// Created by Zaphod Beeblebrox on 9/4/06. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import "PreferencesController.h" + + +@implementation PreferencesController + +- (IBAction)showPrefs:(id)sender +{ + if (!prefs) { + // Determine path to the sample preference panes + NSString *pathToPanes = [[NSBundle mainBundle] resourcePath]; + NSLog(@"Loading preferences...%@", pathToPanes); + + prefs = [[SS_PrefsController alloc] initWithPanesSearchPath:pathToPanes bundleExtension:@"preferencePane"]; + [prefs setDebug:YES]; + + // Set which panes are included, and their order. +// [prefs setPanesOrder:[NSArray arrayWithObjects:@"General", @"Updating", @"A Non-Existent Preference Pane", nil]]; + } + + // Show the preferences window. + [prefs showPreferencesWindow]; +} + + +- (void)dealloc +{ + [prefs release]; + + [super dealloc]; +} + +@end diff --git a/Preferences/SS_PreferencePaneProtocol.h b/Preferences/SS_PreferencePaneProtocol.h new file mode 100644 index 000000000..172f60fb4 --- /dev/null +++ b/Preferences/SS_PreferencePaneProtocol.h @@ -0,0 +1,50 @@ +#import + +@protocol SS_PreferencePaneProtocol + + + // preferencePanes is called whenever the calling application wants to instantiate preference panes. + // This method returns an array of preference pane instances. This array is autoreleased, + // so the calling application needs to retain whatever it wants to keep. + // If no instances were generated, this returns nil. + ++ (NSArray *)preferencePanes; + + + // paneView returns a preference pane's view. This must not be nil. + +- (NSView *)paneView; + + + // paneName returns the name associated with a preference pane's view. + // This is used as the label of the pane's toolbar item in the Preferences window, + // and as the title of the Preferences window when the pane is selected. + // This must not be nil or an empty string. + +- (NSString *)paneName; + + + // paneIcon returns a preference pane's icon as an NSImage. + // The icon will be scaled to the default size for a toolbar icon (if necessary), + // and shown in the toolbar in the Preferences window. + +- (NSImage *)paneIcon; + + + // paneToolTip returns the ToolTip to be used for a preference pane's icon in the + // Preferences window's toolbar. You can return nil or an empty string to disable + // the ToolTip for this preference pane. + +- (NSString *)paneToolTip; + + + // allowsHorizontalResizing and allowsVerticalResizing determine whether the Preferences window + // will be resizable in the respective directions when the receiver is the visible preference + // pane. The initial size of the receiver's view will be used as the minimum size of the + // Preferences window. + +- (BOOL)allowsHorizontalResizing; +- (BOOL)allowsVerticalResizing; + + +@end diff --git a/Preferences/SS_PrefsController.h b/Preferences/SS_PrefsController.h new file mode 100644 index 000000000..d7cb5639b --- /dev/null +++ b/Preferences/SS_PrefsController.h @@ -0,0 +1,76 @@ +/* SS_PrefsController */ + +#import + +@interface SS_PrefsController : NSObject +{ + NSWindow *prefsWindow; + NSMutableDictionary *preferencePanes; + NSMutableArray *panesOrder; + + NSString *bundleExtension; + NSString *searchPath; + + NSToolbar *prefsToolbar; + NSMutableDictionary *prefsToolbarItems; + + NSToolbarDisplayMode toolbarDisplayMode; +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_2 + NSToolbarSizeMode toolbarSizeMode; +#endif + BOOL usesTexturedWindow; + BOOL alwaysShowsToolbar; + BOOL alwaysOpensCentered; + + BOOL debug; +} + +// Convenience constructors ++ (id)preferencesWithPanesSearchPath:(NSString*)path bundleExtension:(NSString *)ext; ++ (id)preferencesWithBundleExtension:(NSString *)ext; ++ (id)preferencesWithPanesSearchPath:(NSString*)path; ++ (id)preferences; + +// Designated initializer +- (id)initWithPanesSearchPath:(NSString*)path bundleExtension:(NSString *)ext; + +- (id)initWithBundleExtension:(NSString *)ext; +- (id)initWithPanesSearchPath:(NSString*)path; + +- (void)showPreferencesWindow; +- (void)createPreferencesWindowAndDisplay:(BOOL)shouldDisplay; +- (void)createPreferencesWindow; +- (void)destroyPreferencesWindow; +- (BOOL)loadPrefsPaneNamed:(NSString *)name display:(BOOL)disp; +- (BOOL)loadPreferencePaneNamed:(NSString *)name; +- (void)activatePane:(NSString*)path; +- (void)debugLog:(NSString*)msg; + +float ToolbarHeightForWindow(NSWindow *window); +- (void)createPrefsToolbar; +- (void)prefsToolbarItemClicked:(NSToolbarItem*)item; + +// Accessors +- (NSWindow *)preferencesWindow; +- (NSString *)bundleExtension; +- (NSString *)searchPath; + +- (NSArray *)loadedPanes; +- (NSArray *)panesOrder; +- (void)setPanesOrder:(NSArray *)newPanesOrder; +- (BOOL)debug; +- (void)setDebug:(BOOL)newDebug; +- (BOOL)usesTexturedWindow; +- (void)setUsesTexturedWindow:(BOOL)newUsesTexturedWindow; +- (BOOL)alwaysShowsToolbar; +- (void)setAlwaysShowsToolbar:(BOOL)newAlwaysShowsToolbar; +- (BOOL)alwaysOpensCentered; +- (void)setAlwaysOpensCentered:(BOOL)newAlwaysOpensCentered; +- (NSToolbarDisplayMode)toolbarDisplayMode; +- (void)setToolbarDisplayMode:(NSToolbarDisplayMode)displayMode; +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_2 +- (NSToolbarSizeMode)toolbarSizeMode; +- (void)setToolbarSizeMode:(NSToolbarSizeMode)sizeMode; +#endif + +@end diff --git a/Preferences/SS_PrefsController.m b/Preferences/SS_PrefsController.m new file mode 100644 index 000000000..370c880af --- /dev/null +++ b/Preferences/SS_PrefsController.m @@ -0,0 +1,579 @@ +#import "SS_PrefsController.h" +#import "SS_PreferencePaneProtocol.h" + +@implementation SS_PrefsController + +#define Last_Pane_Defaults_Key [[[NSBundle mainBundle] bundleIdentifier] stringByAppendingString:@"_Preferences_Last_Pane_Defaults_Key"] + +// ************************************************ +// version/init/dealloc/constructors +// ************************************************ + + ++ (int)version +{ + return 1; // 28th June 2003 +} + + ++ (id)preferencesWithPanesSearchPath:(NSString*)path bundleExtension:(NSString *)ext +{ + return [[[SS_PrefsController alloc] initWithPanesSearchPath:path bundleExtension:ext] autorelease]; +} + + ++ (id)preferencesWithBundleExtension:(NSString *)ext +{ + return [[[SS_PrefsController alloc] initWithBundleExtension:ext] autorelease]; +} + + ++ (id)preferencesWithPanesSearchPath:(NSString*)path +{ + return [[[SS_PrefsController alloc] initWithPanesSearchPath:path] autorelease]; +} + + ++ (id)preferences +{ + return [[[SS_PrefsController alloc] init] autorelease]; +} + + +- (id)init +{ + return [self initWithPanesSearchPath:nil bundleExtension:nil]; +} + + +- (id)initWithPanesSearchPath:(NSString*)path +{ + return [self initWithPanesSearchPath:path bundleExtension:nil]; +} + + +- (id)initWithBundleExtension:(NSString *)ext +{ + return [self initWithPanesSearchPath:nil bundleExtension:ext]; +} + + +// Designated initializer +- (id)initWithPanesSearchPath:(NSString*)path bundleExtension:(NSString *)ext +{ + if (self = [super init]) { + [self setDebug:NO]; + preferencePanes = [[NSMutableDictionary alloc] init]; + panesOrder = [[NSMutableArray alloc] init]; + + [self setToolbarDisplayMode:NSToolbarDisplayModeIconAndLabel]; +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_2 + [self setToolbarSizeMode:NSToolbarSizeModeDefault]; +#endif + [self setUsesTexturedWindow:NO]; + [self setAlwaysShowsToolbar:NO]; + [self setAlwaysOpensCentered:YES]; + + if (!ext || [ext isEqualToString:@""]) { + bundleExtension = [[NSString alloc] initWithString:@"preferencePane"]; + } else { + bundleExtension = [ext retain]; + } + + if (!path || [path isEqualToString:@""]) { + searchPath = [[NSString alloc] initWithString:[[NSBundle mainBundle] resourcePath]]; + } else { + searchPath = [path retain]; + } + + // Read PreferencePanes + if (searchPath) { + NSEnumerator* enumerator = [[NSBundle pathsForResourcesOfType:bundleExtension inDirectory:searchPath] objectEnumerator]; + NSString* panePath; + while ((panePath = [enumerator nextObject])) { + [self activatePane:panePath]; + } + } + return self; + } + return nil; +} + + +- (void)dealloc +{ + if (prefsWindow) { + [prefsWindow release]; + } + if (prefsToolbar) { + [prefsToolbar release]; + } + if (prefsToolbarItems) { + [prefsToolbarItems release]; + } + if (preferencePanes) { + [preferencePanes release]; + } + if (panesOrder) { + [panesOrder release]; + } + if (bundleExtension) { + [bundleExtension release]; + } + if (searchPath) { + [searchPath release]; + } + [super dealloc]; +} + + +// ************************************************ +// Preferences methods +// ************************************************ + + +- (void)showPreferencesWindow +{ + [self createPreferencesWindowAndDisplay:YES]; +} + + +- (void)createPreferencesWindow +{ + [self createPreferencesWindowAndDisplay:YES]; +} + + +- (void)createPreferencesWindowAndDisplay:(BOOL)shouldDisplay +{ + if (prefsWindow) { + if (alwaysOpensCentered && ![prefsWindow isVisible]) { + [prefsWindow center]; + } + [prefsWindow makeKeyAndOrderFront:nil]; + return; + } + + // Create prefs window + unsigned int styleMask = (NSClosableWindowMask | NSResizableWindowMask); + if (usesTexturedWindow) { + styleMask = (styleMask | NSTexturedBackgroundWindowMask); + } + prefsWindow = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 350, 200) + styleMask:styleMask + backing:NSBackingStoreBuffered + defer:NO]; + + [prefsWindow setReleasedWhenClosed:NO]; + [prefsWindow setTitle:@"Preferences"]; // initial default title + + [prefsWindow center]; + [self createPrefsToolbar]; + + // Register defaults + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + if (panesOrder && ([panesOrder count] > 0)) { + NSMutableDictionary *defaultValues = [NSMutableDictionary dictionary]; + [defaultValues setObject:[panesOrder objectAtIndex:0] forKey:Last_Pane_Defaults_Key]; + [defaults registerDefaults:defaultValues]; + } + + // Load last view + NSString *lastViewName = [defaults objectForKey:Last_Pane_Defaults_Key]; + + if ([panesOrder containsObject:lastViewName] && [self loadPrefsPaneNamed:lastViewName display:NO]) { + if (shouldDisplay) { + [prefsWindow makeKeyAndOrderFront:nil]; + } + return; + } + + [self debugLog:[NSString stringWithFormat:@"Could not load last-used preference pane \"%@\". Trying to load another pane instead.", lastViewName]]; + + // Try to load each prefpane in turn if loading the last-viewed one fails. + NSEnumerator* panes = [panesOrder objectEnumerator]; + NSString *pane; + while (pane = [panes nextObject]) { + if (![pane isEqualToString:lastViewName]) { + if ([self loadPrefsPaneNamed:pane display:NO]) { + if (shouldDisplay) { + [prefsWindow makeKeyAndOrderFront:nil]; + } + return; + } + } + } + + [self debugLog:[NSString stringWithFormat:@"Could not load any valid preference panes. The preference pane bundle extension was \"%@\" and the search path was: %@", bundleExtension, searchPath]]; + + // Show alert dialog. + NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"]; + NSRunAlertPanel(@"Preferences", + [NSString stringWithFormat:@"Preferences are not available for %@.", appName], + @"OK", + nil, + nil); + [prefsWindow release]; + prefsWindow = nil; +} + + +- (void)destroyPreferencesWindow +{ + if (prefsWindow) { + [prefsWindow release]; + } + prefsWindow = nil; +} + + +- (void)activatePane:(NSString*)path { + NSBundle* paneBundle = [NSBundle bundleWithPath:path]; + + if (paneBundle) { + NSDictionary* paneDict = [paneBundle infoDictionary]; + NSString* paneName = [paneDict objectForKey:@"NSPrincipalClass"]; + if (paneName) { + Class paneClass = NSClassFromString(paneName); + if (!paneClass) { + paneClass = [paneBundle principalClass]; + + if ([paneClass conformsToProtocol:@protocol(SS_PreferencePaneProtocol)] && [paneClass isKindOfClass:[NSObject class]]) { + NSArray *panes = [paneClass preferencePanes]; + + NSEnumerator *enumerator = [panes objectEnumerator]; + id aPane; + + while (aPane = [enumerator nextObject]) { + [panesOrder addObject:[aPane paneName]]; + [preferencePanes setObject:aPane forKey:[aPane paneName]]; + } + } else { + [self debugLog:[NSString stringWithFormat:@"Did not load bundle: %@ because its Principal Class is either not an NSObject subclass, or does not conform to the PreferencePane Protocol.", paneBundle]]; + } + } else { + [self debugLog:[NSString stringWithFormat:@"Did not load bundle: %@ because its Principal Class was already used in another Preference pane.", paneBundle]]; + } + } else { + [self debugLog:[NSString stringWithFormat:@"Could not obtain name of Principal Class for bundle: %@", paneBundle]]; + } + } else { + [self debugLog:[NSString stringWithFormat:@"Could not initialize bundle: %@", paneBundle]]; + } +} + + +- (BOOL)loadPreferencePaneNamed:(NSString *)name +{ + return [self loadPrefsPaneNamed:(NSString *)name display:YES]; +} + + +- (NSArray *)loadedPanes +{ + if (preferencePanes) { + return [preferencePanes allKeys]; + } + return nil; +} + + +- (BOOL)loadPrefsPaneNamed:(NSString *)name display:(BOOL)disp +{ + if (!prefsWindow) { + NSBeep(); + [self debugLog:[NSString stringWithFormat:@"Could not load \"%@\" preference pane because the Preferences window seems to no longer exist.", name]]; + return NO; + } + + id tempPane = nil; + tempPane = [preferencePanes objectForKey:name]; + if (!tempPane) { + [self debugLog:[NSString stringWithFormat:@"Could not load preference pane \"%@\", because that pane does not exist.", name]]; + return NO; + } + + NSView *prefsView = nil; + prefsView = [tempPane paneView]; + if (!prefsView) { + [self debugLog:[NSString stringWithFormat:@"Could not load \"%@\" preference pane because its view could not be loaded from the bundle.", name]]; + return NO; + } + + // Get rid of old view before resizing, for display purposes. + if (disp) { + NSView *tempView = [[NSView alloc] initWithFrame:[[prefsWindow contentView] frame]]; + [prefsWindow setContentView:tempView]; + [tempView release]; + } + + // Preserve upper left point of window during resize. + NSRect newFrame = [prefsWindow frame]; + newFrame.size.height = [prefsView frame].size.height + ([prefsWindow frame].size.height - [[prefsWindow contentView] frame].size.height); + newFrame.size.width = [prefsView frame].size.width; + newFrame.origin.y += ([[prefsWindow contentView] frame].size.height - [prefsView frame].size.height); + + id pane = [preferencePanes objectForKey:name]; + [prefsWindow setShowsResizeIndicator:([pane allowsHorizontalResizing] || [pane allowsHorizontalResizing])]; + + [prefsWindow setFrame:newFrame display:disp animate:disp]; + + [prefsWindow setContentView:prefsView]; + + // Set appropriate resizing on window. + NSSize theSize = [prefsWindow frame].size; + theSize.height -= ToolbarHeightForWindow(prefsWindow); + [prefsWindow setMinSize:theSize]; + + BOOL canResize = NO; + if ([pane allowsHorizontalResizing]) { + theSize.width = FLT_MAX; + canResize = YES; + } + if ([pane allowsVerticalResizing]) { + theSize.height = FLT_MAX; + canResize = YES; + } + [prefsWindow setMaxSize:theSize]; + [prefsWindow setShowsResizeIndicator:canResize]; + + if ((prefsToolbarItems && ([prefsToolbarItems count] > 1)) || alwaysShowsToolbar) { + [prefsWindow setTitle:[@"Preferences: " stringByAppendingString:name]]; + } + + // Update defaults + NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; + [defaults setObject:name forKey:Last_Pane_Defaults_Key]; + + return YES; +} + + +- (void)debugLog:(NSString*)msg +{ + if (debug) { + NSLog(@"[--- PREFERENCES DEBUG MESSAGE ---]\r%@\r\r", msg); + } +} + + +// ************************************************ +// Prefs Toolbar methods +// ************************************************ + + +float ToolbarHeightForWindow(NSWindow *window) +{ + NSToolbar *toolbar; + float toolbarHeight = 0.0; + NSRect windowFrame; + + toolbar = [window toolbar]; + + if(toolbar && [toolbar isVisible]) + { + windowFrame = [NSWindow contentRectForFrameRect:[window frame] + styleMask:[window styleMask]]; + toolbarHeight = NSHeight(windowFrame) + - NSHeight([[window contentView] frame]); + } + + return toolbarHeight; +} + + +- (void)createPrefsToolbar +{ + // Create toolbar items + prefsToolbarItems = [[NSMutableDictionary alloc] init]; + NSEnumerator *itemEnumerator = [panesOrder objectEnumerator]; + NSString *name; + NSImage *itemImage; + + while (name = [itemEnumerator nextObject]) { + if ([preferencePanes objectForKey:name] != nil) { + NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:name]; + [item setPaletteLabel:name]; // item's label in the "Customize Toolbar" sheet (not relevant here, but we set it anyway) + [item setLabel:name]; // item's label in the toolbar + NSString *tempTip = [[preferencePanes objectForKey:name] paneToolTip]; + if (!tempTip || [tempTip isEqualToString:@""]) { + [item setToolTip:nil]; + } else { + [item setToolTip:tempTip]; + } + itemImage = [[preferencePanes objectForKey:name] paneIcon]; + [item setImage:itemImage]; + + [item setTarget:self]; + [item setAction:@selector(prefsToolbarItemClicked:)]; // action called when item is clicked + [prefsToolbarItems setObject:item forKey:name]; // add to items + [item release]; + } else { + [self debugLog:[NSString stringWithFormat:@"Could not create toolbar item for preference pane \"%@\", because that pane does not exist.", name]]; + } + } + + NSString *bundleIdentifier = [[NSBundle mainBundle] bundleIdentifier]; + prefsToolbar = [[NSToolbar alloc] initWithIdentifier:[bundleIdentifier stringByAppendingString:@"_Preferences_Toolbar_Identifier"]]; + [prefsToolbar setDelegate:self]; + [prefsToolbar setAllowsUserCustomization:NO]; + [prefsToolbar setAutosavesConfiguration:NO]; + [prefsToolbar setDisplayMode:toolbarDisplayMode]; +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_2 + [prefsToolbar setSizeMode:toolbarSizeMode]; +#endif + if ((prefsToolbarItems && ([prefsToolbarItems count] > 1)) || alwaysShowsToolbar) { + [prefsWindow setToolbar:prefsToolbar]; + } else if (!alwaysShowsToolbar && prefsToolbarItems && ([prefsToolbarItems count] == 1)) { + [self debugLog:@"Not showing toolbar in Preferences window because there is only one preference pane loaded. You can override this behaviour using -[setAlwaysShowsToolbar:YES]."]; + } +} + + +- (NSToolbarDisplayMode)toolbarDisplayMode +{ + return toolbarDisplayMode; +} + + +- (void)setToolbarDisplayMode:(NSToolbarDisplayMode)displayMode +{ + toolbarDisplayMode = displayMode; +} + + +#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_2 +- (NSToolbarSizeMode)toolbarSizeMode +{ + return toolbarSizeMode; +} + + +- (void)setToolbarSizeMode:(NSToolbarSizeMode)sizeMode +{ + toolbarSizeMode = sizeMode; +} +#endif + + +- (void)prefsToolbarItemClicked:(NSToolbarItem*)item +{ + if (![[item itemIdentifier] isEqualToString:[prefsWindow title]]) { + [self loadPrefsPaneNamed:[item itemIdentifier] display:YES]; + } +} + + +- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar +{ + return panesOrder; +} + + +- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar +{ + return panesOrder; +} + + +- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag +{ + return [prefsToolbarItems objectForKey:itemIdentifier]; +} + + +// ************************************************ +// Accessors +// ************************************************ + + +- (NSWindow *)preferencesWindow +{ + return prefsWindow; +} + + +- (NSString *)bundleExtension +{ + return bundleExtension; +} + + +- (NSString *)searchPath +{ + return searchPath; +} + + +- (NSArray *)panesOrder +{ + return panesOrder; +} + + +- (void)setPanesOrder:(NSArray *)newPanesOrder +{ + [panesOrder removeAllObjects]; + + NSEnumerator *enumerator = [newPanesOrder objectEnumerator]; + NSString *name; + + while (name = [enumerator nextObject]) { + if ([preferencePanes objectForKey:name] != nil) { + [panesOrder addObject:name]; + } else { + [self debugLog:[NSString stringWithFormat:@"Did not add preference pane \"%@\" to the toolbar ordering array, because that pane does not exist.", name]]; + } + } +} + + +- (BOOL)debug +{ + return debug; +} + + +- (void)setDebug:(BOOL)newDebug +{ + debug = newDebug; +} + + +- (BOOL)usesTexturedWindow +{ + return usesTexturedWindow; +} + + +- (void)setUsesTexturedWindow:(BOOL)newUsesTexturedWindow +{ + usesTexturedWindow = newUsesTexturedWindow; +} + + +- (BOOL)alwaysShowsToolbar +{ + return alwaysShowsToolbar; +} + + +- (void)setAlwaysShowsToolbar:(BOOL)newAlwaysShowsToolbar +{ + alwaysShowsToolbar = newAlwaysShowsToolbar; +} + + +- (BOOL)alwaysOpensCentered +{ + return alwaysOpensCentered; +} + + +- (void)setAlwaysOpensCentered:(BOOL)newAlwaysOpensCentered +{ + alwaysOpensCentered = newAlwaysOpensCentered; +} + + +@end