From 1ea8fc9d0f3c05f1811453b2191dbff325c3876f Mon Sep 17 00:00:00 2001 From: wuggy Date: Sat, 19 Sep 2026 07:41:29 -0700 Subject: [PATCH] Gopher support initial commit (OverbiteFF plugin ported to browser itself) --- browser/gopher/LICENSE.txt | 69 + browser/gopher/README.md | 51 + browser/gopher/components/about.js | 177 ++ browser/gopher/components/gopher.manifest | 8 + browser/gopher/components/protocol.js | 2054 +++++++++++++++++ browser/gopher/content/chrome/favicon.png | Bin 0 -> 935 bytes .../gopher/content/chrome/gopherchrome.css | 150 ++ browser/gopher/content/chrome/icn.png | Bin 0 -> 330 bytes browser/gopher/content/chrome/icn0.png | Bin 0 -> 386 bytes browser/gopher/content/chrome/icn1.png | Bin 0 -> 1248 bytes browser/gopher/content/chrome/icn2.png | Bin 0 -> 468 bytes browser/gopher/content/chrome/icn3.png | Bin 0 -> 560 bytes browser/gopher/content/chrome/icn3b.png | Bin 0 -> 413 bytes browser/gopher/content/chrome/icn4.png | Bin 0 -> 406 bytes browser/gopher/content/chrome/icn5.png | Bin 0 -> 406 bytes browser/gopher/content/chrome/icn6.png | Bin 0 -> 406 bytes browser/gopher/content/chrome/icn7.png | Bin 0 -> 468 bytes browser/gopher/content/chrome/icn8.png | Bin 0 -> 1117 bytes browser/gopher/content/chrome/icn9.png | Bin 0 -> 406 bytes browser/gopher/content/chrome/icnI.png | Bin 0 -> 408 bytes browser/gopher/content/chrome/icnT.png | Bin 0 -> 1117 bytes browser/gopher/content/chrome/icnd.png | Bin 0 -> 1274 bytes browser/gopher/content/chrome/icng.png | Bin 0 -> 408 bytes browser/gopher/content/chrome/icnh.png | Bin 0 -> 570 bytes browser/gopher/content/chrome/icnhURL.png | Bin 0 -> 933 bytes browser/gopher/content/chrome/icnp.png | Bin 0 -> 408 bytes browser/gopher/content/chrome/icns.png | Bin 0 -> 397 bytes browser/gopher/content/chrome/interface.js | 180 ++ browser/gopher/content/chrome/root.png | Bin 0 -> 489 bytes browser/gopher/content/chrome/up.png | Bin 0 -> 438 bytes browser/gopher/content/infobabe.html | 356 +++ browser/gopher/content/mascot.png | Bin 0 -> 76040 bytes .../gopher/defaults/preferences/overbiteff.js | 1 + browser/gopher/jar.mn | 34 + browser/gopher/locale/da-DK/aboutp.properties | 13 + browser/gopher/locale/da-DK/itypes.properties | 25 + browser/gopher/locale/da-DK/obff.properties | 15 + browser/gopher/locale/de-DE/aboutp.properties | 13 + browser/gopher/locale/de-DE/itypes.properties | 25 + browser/gopher/locale/de-DE/obff.properties | 15 + browser/gopher/locale/en-US/aboutp.properties | 13 + browser/gopher/locale/en-US/itypes.properties | 25 + browser/gopher/locale/en-US/obff.properties | 15 + browser/gopher/locale/es-ES/aboutp.properties | 13 + browser/gopher/locale/es-ES/itypes.properties | 25 + browser/gopher/locale/es-ES/obff.properties | 15 + browser/gopher/locale/fr-FR/aboutp.properties | 13 + browser/gopher/locale/fr-FR/itypes.properties | 25 + browser/gopher/locale/fr-FR/obff.properties | 15 + browser/gopher/locale/hu-HU/aboutp.properties | 13 + browser/gopher/locale/hu-HU/itypes.properties | 25 + browser/gopher/locale/hu-HU/obff.properties | 15 + browser/gopher/locale/ja-JP/aboutp.properties | 13 + browser/gopher/locale/ja-JP/itypes.properties | 25 + browser/gopher/locale/ja-JP/obff.properties | 15 + browser/gopher/locale/nb-NO/aboutp.properties | 13 + browser/gopher/locale/nb-NO/itypes.properties | 25 + browser/gopher/locale/nb-NO/obff.properties | 15 + browser/gopher/locale/nl-NL/aboutp.properties | 13 + browser/gopher/locale/nl-NL/itypes.properties | 25 + browser/gopher/locale/nl-NL/obff.properties | 15 + browser/gopher/locale/pl-PL/aboutp.properties | 13 + browser/gopher/locale/pl-PL/itypes.properties | 25 + browser/gopher/locale/pl-PL/obff.properties | 15 + browser/gopher/locale/ru-RU/aboutp.properties | 13 + browser/gopher/locale/ru-RU/itypes.properties | 25 + browser/gopher/locale/ru-RU/obff.properties | 15 + browser/gopher/locale/tr-TR/aboutp.properties | 13 + browser/gopher/locale/tr-TR/itypes.properties | 25 + browser/gopher/locale/tr-TR/obff.properties | 15 + browser/gopher/moz.build | 16 + browser/installer/package-manifest.in | 6 + browser/moz.build | 1 + 73 files changed, 3739 insertions(+) create mode 100644 browser/gopher/LICENSE.txt create mode 100644 browser/gopher/README.md create mode 100644 browser/gopher/components/about.js create mode 100644 browser/gopher/components/gopher.manifest create mode 100644 browser/gopher/components/protocol.js create mode 100644 browser/gopher/content/chrome/favicon.png create mode 100644 browser/gopher/content/chrome/gopherchrome.css create mode 100644 browser/gopher/content/chrome/icn.png create mode 100644 browser/gopher/content/chrome/icn0.png create mode 100644 browser/gopher/content/chrome/icn1.png create mode 100644 browser/gopher/content/chrome/icn2.png create mode 100644 browser/gopher/content/chrome/icn3.png create mode 100644 browser/gopher/content/chrome/icn3b.png create mode 100644 browser/gopher/content/chrome/icn4.png create mode 100644 browser/gopher/content/chrome/icn5.png create mode 100644 browser/gopher/content/chrome/icn6.png create mode 100644 browser/gopher/content/chrome/icn7.png create mode 100644 browser/gopher/content/chrome/icn8.png create mode 100644 browser/gopher/content/chrome/icn9.png create mode 100644 browser/gopher/content/chrome/icnI.png create mode 100644 browser/gopher/content/chrome/icnT.png create mode 100644 browser/gopher/content/chrome/icnd.png create mode 100644 browser/gopher/content/chrome/icng.png create mode 100644 browser/gopher/content/chrome/icnh.png create mode 100644 browser/gopher/content/chrome/icnhURL.png create mode 100644 browser/gopher/content/chrome/icnp.png create mode 100644 browser/gopher/content/chrome/icns.png create mode 100644 browser/gopher/content/chrome/interface.js create mode 100644 browser/gopher/content/chrome/root.png create mode 100644 browser/gopher/content/chrome/up.png create mode 100644 browser/gopher/content/infobabe.html create mode 100644 browser/gopher/content/mascot.png create mode 100644 browser/gopher/defaults/preferences/overbiteff.js create mode 100644 browser/gopher/jar.mn create mode 100644 browser/gopher/locale/da-DK/aboutp.properties create mode 100644 browser/gopher/locale/da-DK/itypes.properties create mode 100644 browser/gopher/locale/da-DK/obff.properties create mode 100644 browser/gopher/locale/de-DE/aboutp.properties create mode 100644 browser/gopher/locale/de-DE/itypes.properties create mode 100644 browser/gopher/locale/de-DE/obff.properties create mode 100644 browser/gopher/locale/en-US/aboutp.properties create mode 100644 browser/gopher/locale/en-US/itypes.properties create mode 100644 browser/gopher/locale/en-US/obff.properties create mode 100644 browser/gopher/locale/es-ES/aboutp.properties create mode 100644 browser/gopher/locale/es-ES/itypes.properties create mode 100644 browser/gopher/locale/es-ES/obff.properties create mode 100644 browser/gopher/locale/fr-FR/aboutp.properties create mode 100644 browser/gopher/locale/fr-FR/itypes.properties create mode 100644 browser/gopher/locale/fr-FR/obff.properties create mode 100644 browser/gopher/locale/hu-HU/aboutp.properties create mode 100644 browser/gopher/locale/hu-HU/itypes.properties create mode 100644 browser/gopher/locale/hu-HU/obff.properties create mode 100644 browser/gopher/locale/ja-JP/aboutp.properties create mode 100644 browser/gopher/locale/ja-JP/itypes.properties create mode 100644 browser/gopher/locale/ja-JP/obff.properties create mode 100644 browser/gopher/locale/nb-NO/aboutp.properties create mode 100644 browser/gopher/locale/nb-NO/itypes.properties create mode 100644 browser/gopher/locale/nb-NO/obff.properties create mode 100644 browser/gopher/locale/nl-NL/aboutp.properties create mode 100644 browser/gopher/locale/nl-NL/itypes.properties create mode 100644 browser/gopher/locale/nl-NL/obff.properties create mode 100644 browser/gopher/locale/pl-PL/aboutp.properties create mode 100644 browser/gopher/locale/pl-PL/itypes.properties create mode 100644 browser/gopher/locale/pl-PL/obff.properties create mode 100644 browser/gopher/locale/ru-RU/aboutp.properties create mode 100644 browser/gopher/locale/ru-RU/itypes.properties create mode 100644 browser/gopher/locale/ru-RU/obff.properties create mode 100644 browser/gopher/locale/tr-TR/aboutp.properties create mode 100644 browser/gopher/locale/tr-TR/itypes.properties create mode 100644 browser/gopher/locale/tr-TR/obff.properties create mode 100644 browser/gopher/moz.build diff --git a/browser/gopher/LICENSE.txt b/browser/gopher/LICENSE.txt new file mode 100644 index 0000000000..348f4486d6 --- /dev/null +++ b/browser/gopher/LICENSE.txt @@ -0,0 +1,69 @@ +*** FOR MORE DETAILED CREDIT INFORMATION, TYPE about:gopher AFTER INSTALL *** + +This code is issued under a disjunctive tri-license giving you the choice of +one of the three following sets of free software/open source licensing terms: + + * Mozilla Public License, version 1.1 + * GNU General Public License, version 2.0 + * GNU Lesser General Public License, version 2.1 + +For users under the Mozilla Public License: + +The contents of this file are subject to the Mozilla Public License +Version 1.1 (the "License"); you may not use this file except in +compliance with the License. You may obtain a copy of the License at +http://www.mozilla.org/MPL/ + +Software distributed under the License is distributed on an "AS IS" +basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +License for the specific language governing rights and limitations +under the License. + +The Original Code is the OverbiteFF Gopher addon. + +The Initial Developer of the Original Code is Cameron Kaiser. +Portions created by Cameron Kaiser are Copyright (C) 2008-2011 +Cameron Kaiser. All Rights Reserved. Copyright (C) 2008-2011 Contributors +to the Overbite Project. + +For users under the GNU Public License: + +OverbiteFF Gopher/CSO Firefox addon +Copyright (C) 2008-2011 Cameron Kaiser +Copyright (C) 2008-2011 Contributors to the Overbite Project + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; version 2. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +[ or http://www.gnu.org/licenses/gpl-2.0.html ] + +For users under the GNU Lesser General Public License: + +OverbiteFF Gopher/CSO Firefox addon +Copyright (C) 2008-2011 Cameron Kaiser +Copyright (C) 2008-2011 Contributors to the Overbite Project + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; version 2.1. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +[ or http://www.gnu.org/licenses/lgpl-2.1.html ] + + diff --git a/browser/gopher/README.md b/browser/gopher/README.md new file mode 100644 index 0000000000..f08a8db010 --- /dev/null +++ b/browser/gopher/README.md @@ -0,0 +1,51 @@ +## libgopher + +libgopher is a fork of OverbiteFF, a plugin which lets you browse Gopher sites on legacy Firefox-based browsers such as Dactyloidae. + +In this tree it is built into the browser rather than installed as an add-on. The browser registers the Gopher protocol handler during startup, so `gopher://` links work immediately in a new profile. + +### Built-in integration + +The integration is split into the same pieces used by other browser-native features: + +- `moz.build` adds the component files, default preferences, and chrome package to the browser build. +- `components/gopher.manifest` registers the Gopher protocol and the `about:gopher`/`about:overbite` pages. +- `components/protocol.js` implements Gopher networking, directory conversion, internal resources, and supported item types. +- `components/about.js` supplies the Overbite information page. +- `jar.mn` packages the `overbiteff` content and locale namespaces. +- `defaults/preferences/overbiteff.js` initializes the build marker preference. + +The browser-level build entry is `browser/moz.build`; no XPI installation or add-on manager registration is required. + +### Supported URLs + +The primary entry point is any Gopher URL, for example: + +```text +gopher://gopher.floodgap.com/ +``` + +The built-in information pages are available at: + +```text +about:gopher +about:overbite +``` + +The protocol handler also serves the generated internal resources used by Gopher directory pages, including icons, CSS, and the page interaction script. These resources are addressed through `gopher:///internal-*` URLs and are resolved from the packaged `content/chrome/` directory. + +### Gopher item types + +Directory conversion includes the traditional Gopher item types for text, menus, CSO/ph, errors, archives, searches, Telnet, images, sound, HTML, movies, PNG, PDF, and generic binary content. Unknown types receive the generic icon and label instead of preventing the directory from loading. + +### Profile customization + +The protocol handler first checks the profile’s `gopherchrome` directory for replacements for internal CSS, JavaScript, and image resources. This allows local visual or behavior changes without editing the browser package. + +The following preferences are recognized when present: + +- `extensions.overbiteff.dotless` — enables dotless text cleanup. +- `extensions.overbiteff.fixitype` — enables the legacy item-type correction behavior. +- `extensions.overbiteff.buildmark` — records the initialized OverbiteFF build number. + +Only the build marker is given a default value by the built-in preference file; the other options remain opt-in. diff --git a/browser/gopher/components/about.js b/browser/gopher/components/about.js new file mode 100644 index 0000000000..ba1077e4ff --- /dev/null +++ b/browser/gopher/components/about.js @@ -0,0 +1,177 @@ +/* + +This code is issued under a disjunctive tri-license giving you the choice of +one of the three following sets of free software/open source licensing terms: + + * Mozilla Public License, version 1.1 + * GNU General Public License, version 2.0 + * GNU Lesser General Public License, version 2.1 + +For users under the Mozilla Public License: + +The contents of this file are subject to the Mozilla Public License +Version 1.1 (the "License"); you may not use this file except in +compliance with the License. You may obtain a copy of the License at +http://www.mozilla.org/MPL/ + +Software distributed under the License is distributed on an "AS IS" +basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +License for the specific language governing rights and limitations +under the License. + +The Original Code is the OverbiteFF Gopher addon. + +The Initial Developer of the Original Code is Cameron Kaiser. +Portions created by Cameron Kaiser are Copyright (C) 2008-2011 +Cameron Kaiser. All Rights Reserved. Copyright (C) 2008-2011 Contributors +to the Overbite Project. + +For users under the GNU Public License: + +OverbiteFF Gopher/CSO Firefox addon +Copyright (C) 2008-2011 Cameron Kaiser +Copyright (C) 2008-2011 Contributors to the Overbite Project + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; version 2. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +[ or http://www.gnu.org/licenses/gpl-2.0.html ] + +For users under the GNU Lesser General Public License: + +OverbiteFF Gopher/CSO Firefox addon +Copyright (C) 2008-2011 Cameron Kaiser +Copyright (C) 2008-2011 Contributors to the Overbite Project + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; version 2.1. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +[ or http://www.gnu.org/licenses/lgpl-2.1.html ] + + +*/ + +const OBFFABOUT = "chrome://overbiteff/content/infobabe.html"; +// register this to three contract IDs +const OBFFABOUT_CONTRACTID1 = "@mozilla.org/network/protocol/about;1?what=gopher"; +const OBFFABOUT_CONTRACTID2 = "@mozilla.org/network/protocol/about;1?what=overbite"; +//const OBFFABOUT_CONTRACTID3 = "@mozilla.org/network/protocol/about;1?what=overbiteff"; + +const OBFFABOUT_CID = Components.ID("{80d3faa0-de53-11dc-95ff-0800200c9a66}"); + +const nsISupports = Components.interfaces.nsISupports; +const nsIFactory = Components.interfaces.nsIFactory; +const nsIModule = Components.interfaces.nsIModule; +const nsIAboutModule = Components.interfaces.nsIAboutModule; +const nsIIOService = Components.interfaces.nsIIOService; +const nsIObserver = Components.interfaces.nsIObserver; +const nsIComponentRegistrar = Components.interfaces.nsIComponentRegistrar; + +Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); + +var OverbiteAbout = { + + classID: OBFFABOUT_CID, + + // nsISupports + QueryInterface : XPCOMUtils.generateQI([nsISupports, + nsIObserver, + nsIFactory, + nsIAboutModule]), + + // nsIObserver + observe : function(subject, topic, data) { + // nothing yet + }, + + // nsIAboutModule + newChannel : function(uri) { + var chan = Components + .classes["@mozilla.org/network/io-service;1"] + .getService(nsIIOService) + .newChannel(OBFFABOUT, null, null); + chan.originalURI = uri; + return chan; + }, + + getURIFlags : function(uri) { return 0; }, + + // nsIFactory + createInstance : function(outer, iid) { + if (outer != null) + throw Components.results.NS_ERROR_NO_AGGREGATION; + return this.QueryInterface(iid); + }, + + lockFactory : function(lock) { // ignored + } +}; + +var Module = { + + // nsISupports + QueryInterface : XPCOMUtils.generateQI([nsISupports, + nsIModule]), + + // nsIModule + getClassObject : function(compMgr, cid, iid) { + if (cid.equals(OBFFABOUT_CID)) { + return OverbiteAbout.QueryInterface(iid); + } + + throw Components.results.NS_ERROR_FACTORY_NOT_REGISTERED; + }, + registerSelf : function(compMgr, fileSpec, location, type) { + var compReg = compMgr.QueryInterface(nsIComponentRegistrar); + + // do the treble + compReg.registerFactoryLocation(OBFFABOUT_CID, + "about:gopher", + OBFFABOUT_CONTRACTID1, + fileSpec, + location, + type); + compReg.registerFactoryLocation(OBFFABOUT_CID, + "about:overbite", + OBFFABOUT_CONTRACTID2, + fileSpec, + location, + type); +/* sigh. it must not like the length. + compReg.registerFactoryLocation(OBFFABOUT_CID, + "about:overbiteff", + OBFFABOUT_CONTRACTID3, + fileSpec, + location, + type); +*/ + }, + unregisterSelf : function(compMgr, location, type) { + var compReg = compMgr.QueryInterface(nsIComponentRegistrar); + + // undo the treble + compReg.unregisterFactoryLocation(OBFFABOUT_CID, location); + }, + canUnload : function(compMgr) { return true; } +}; + +function NSGetModule(compMgr, fileSpec) { return Module; } +function NSGetFactory(component) { return OverbiteAbout; } diff --git a/browser/gopher/components/gopher.manifest b/browser/gopher/components/gopher.manifest new file mode 100644 index 0000000000..b9549b9aa2 --- /dev/null +++ b/browser/gopher/components/gopher.manifest @@ -0,0 +1,8 @@ +component {977ffc4c-a635-433d-8477-ea575bfb7b19} protocol.js +contract @mozilla.org/network/protocol;1?name=gopher {977ffc4c-a635-433d-8477-ea575bfb7b19} +category profile-after-change GopherProtocol @mozilla.org/network/protocol;1?name=gopher +component {80d3faa0-de53-11dc-95ff-0800200c9a66} about.js +contract @mozilla.org/network/protocol/about;1?what=gopher {80d3faa0-de53-11dc-95ff-0800200c9a66} +contract @mozilla.org/network/protocol/about;1?what=overbite {80d3faa0-de53-11dc-95ff-0800200c9a66} +category profile-after-change OverbiteAbout @mozilla.org/network/protocol/about;1?what=gopher +category profile-after-change OverbiteAbout @mozilla.org/network/protocol/about;1?what=overbite diff --git a/browser/gopher/components/protocol.js b/browser/gopher/components/protocol.js new file mode 100644 index 0000000000..e1fff72a77 --- /dev/null +++ b/browser/gopher/components/protocol.js @@ -0,0 +1,2054 @@ +/* + +This code is issued under a disjunctive tri-license giving you the choice of +one of the three following sets of free software/open source licensing terms: + + * Mozilla Public License, version 1.1 + * GNU General Public License, version 2.0 + * GNU Lesser General Public License, version 2.1 + +For users under the Mozilla Public License: + +The contents of this file are subject to the Mozilla Public License +Version 1.1 (the "License"); you may not use this file except in +compliance with the License. You may obtain a copy of the License at +http://www.mozilla.org/MPL/ + +Software distributed under the License is distributed on an "AS IS" +basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the +License for the specific language governing rights and limitations +under the License. + +The Original Code is the OverbiteFF Gopher addon. + +The Initial Developer of the Original Code is Cameron Kaiser. +Portions created by Cameron Kaiser are Copyright (C) 2008-2016 +Cameron Kaiser. All Rights Reserved. Copyright (C) 2008-2016 Contributors +to the Overbite Project. + +For users under the GNU Public License: + +OverbiteFF Gopher/CSO Firefox addon +Copyright (C) 2008-2016 Cameron Kaiser +Copyright (C) 2008-2016 Contributors to the Overbite Project + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; version 2. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +[ or http://www.gnu.org/licenses/gpl-2.0.html ] + +For users under the GNU Lesser General Public License: + +OverbiteFF Gopher/CSO Firefox addon +Copyright (C) 2008-2016 Cameron Kaiser +Copyright (C) 2008-2016 Contributors to the Overbite Project + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; version 2.1. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +[ or http://www.gnu.org/licenses/lgpl-2.1.html ] + +*/ +const OBFFVERS = 3.1; +const OBFFBUILD = 1695; +const OBFFBUILDPREF = "extensions.overbiteff.buildmark"; +const OBFFDOTLESSPREF = "extensions.overbiteff.dotless"; +const OBFFFIXITYPEPREF = "extensions.overbiteff.fixitype"; +const OBFFSCHEME = "gopher"; +const OBFFCHROMEURL = "chrome://overbiteff"; +const OBFFABOUTURL = (OBFFCHROMEURL + "/content/infobabe.html"); +const OBFFIABOUTURL = "about:overbite"; +const OBFFRABOUTURL = (OBFFCHROMEURL + "/content/startpage.html"); +const OBFFPROT_HANDLER_CONTRACTID = "@mozilla.org/network/protocol;1?name="+OBFFSCHEME; +const OBFFPROT_HANDLER_CID = Components.ID("{977ffc4c-a635-433d-8477-ea575bfb7b19}"); + +const Ci = Components.interfaces; +const Cc = Components.classes; +const Cr = Components.results; +const Cu = Components.utils; + +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); + +const nsILoadInfo = Ci.nsILoadInfo; +const nsIFactory = Ci.nsIFactory; +const nsISupports = Ci.nsISupports; +const nsIProtocolHandler = Ci.nsIProtocolHandler; +const nsIProxiedProtocolHandler = Ci.nsIProxiedProtocolHandler; + +const nsIRequest = Ci.nsIRequest; +const nsIChannel = Ci.nsIChannel; +const nsIProxiedChannel = Ci.nsIProxiedChannel; +const nsIProgressEventSink = Ci.nsIProgressEventSink; + +const nsISocketTransport = Ci.nsISocketTransport; +const nsIStreamConverter = Ci.nsIStreamConverter; +const nsIStreamListener = Ci.nsIStreamListener; +const nsIObserver = Ci.nsIObserver; +const nsIRequestObserver = Ci.nsIRequestObserver; +const nsITimerCallback = Ci.nsITimerCallback; + +/* port control */ +// 80 is okay because of some hybrid servers that can speak both on one port +var alwayslet = [ 13, 43, 70, 71, 72, 79, 80, 105, 1070, 2347, 3000, 3070, + 3099, 4323, 7055, 7070, 7071, 7072, 7077, 7080, 7777, 27070 ]; +//var badports = [ 20,21,22,23,25,53,69,111,115,137,138,139,443,513,514,548 ]; + +/* cache */ +var capscache = new Object(); +var nullcaps = { + PathKeepPreDelimiter : false, + PathParentDouble : false, + PathDelimiter : "", + CapsVersion : 1 +}; + +/* global functions for logging to the error console */ +function OverbiteLogAlways(msg, error) { + var consoleService = Cc["@mozilla.org/consoleservice;1"] + .getService(Ci.nsIConsoleService); + msg = "OverbiteFF says: "+msg; + if (error) { + consoleService.logStringError(msg); + } else { + consoleService.logStringMessage(msg); + } +} + +function OverbiteLog(msg, error) { + + // return Cr.NS_OK; // comment out for logging + + // OverbiteLogAlways(msg, error); +} + +/* crap on a stick. + you mean I have to implement my own NS_QueryNotificationCallbacks? + so what do I have XPConnect for anyway?! + rot in hell. */ +function OverbiteQNC(one, two, three) { + var progsink = null; + + if (three) + return three; + if (one.notificationCallbacks) { + progsink = one.notificationCallbacks + .getInterface(nsIProgressEventSink); + if (!progsink && two) { + // try that instead + var cbs = two.notificationCallbacks; + if (cbs) + progsink = cbs.getInterface( + nsIProgressEventSink); + } + } + return(progsink); +} + +/* global functions for processing caps */ +function OverbiteCapsKey(host, port) { + var nport = (port < 1) ? 70 : port; + return host.toLowerCase()+":"+nport; +} +function OverbiteCapsPro(caps) { + if (caps.substr(0, 4) != "CAPS") + return nullcaps; + + var capsarr = caps.substr(4).split(/[\r\n]{1,2}/); + var ncapsarr = nullcaps; + var i; + + try { + for (i=0; i opaque, jump to root + var i = sel.lastIndexOf(d); + if (i == -1) return ""; // no delimeter in sel => jump to root + + // putative + var s = sel.substr(0, i); + + // handle the situation where the delimiter was on the end with nothing + // after it + if ((s + d) == sel) { // grrr + i = s.lastIndexOf(d); + if (i == -1) return ""; // no delimiter in sel => jump to root + s = s.substr(0, i); + } + + return s; +} +function OverbiteCapsUniversalBackURL(host, port, itype, sel) { + // based on the caps, return either a .caps pseudo URL, a real URL or + // nothing. used for the direct links. the capupurl is only valid iff: + // + // 1. we have a cached caps *and* it supports path delimeters + // or + // 2. we have no cached caps, in which case we hope for the best + // + // I thought about having this suppress the capupurl if it equals the + // root, but this is inconsistent, especially with new hosts. + + var capupurl = ''; + var caps = capscache[OverbiteCapsKey(host, port)]; + + // the itype could be in one of two places: either itself, or the + // first character of the sel. if itype == '' then get it from there. + if (itype == '') { + itype = sel.substr(0, 1); + sel = sel.substr(1); + } + // by definition backing up only can *ever* go up to a menu. + itype = '1'; + + if (!caps) { // no cache; construct pseudo URL + capupurl = OverbiteURLFromSel( + host + '.caps', port, itype, sel); + } else { + var kk = caps["PathDelimiter"]; + // if we have a path delimeter, use it + if (kk && kk.length) + capupurl = OverbiteURLFromSel( + host, port, itype, + OverbiteCapsBackPathFromSel(caps, sel)); + } + return capupurl; +} + +// utility function, used by lots of things +function OverbiteURLFromSel(host, port, itype, sel) { + var nport = (!port || port < 1) ? 70 : port; + var suburl = OBFFSCHEME + '://' + host + + ((nport != 70)?(':'+nport): '') + + '/' + encodeURI(itype + sel); + ; + return suburl; +} + +/* + * HACK! + * the OverbitePrompter "debounces" back to back alerts and acts + * effectively as the front end mutex. Needed since our channels + * can get multiplexed even in single-process Firefox and our + * channel object does a certain amount of front-end work currently. + * + * TODO: For e10s, remove all use of the prompter and use content + * controls (a form for searches, HTML error messages, etc.) +*/ + +var lastPromptKey = null; +var lastCachedResponse = null; +// These need to be globals so that responses cache properly. +var chequestub = { value : false }; +var query = { value : '' }; +function OverbitePrompter(newkey, response) { + if (lastPromptKey == newkey) { +OverbiteLog("prompter key "+lastPromptKey+" returning cached "+lastCachedResponse); + lastPromptKey = null; + return lastCachedResponse; + } + query = { value : '' }; + lastPromptKey = newkey; + lastCachedResponse = response(); +OverbiteLog("caching prompt "+newkey+" responded "+lastCachedResponse); + return lastCachedResponse; +} + +/* + * the OverbiteCaps object is a pseudo-object that controls browser navigation + * and stores caps data in the cache. it is mostly the same as Dotless and + * implements the same interfaces. + * + * future expansion: have the caps display a proper info page. +*/ + +function OverbiteCaps() { } +OverbiteCaps.prototype = { + + // my stuff + _contentType: null, + _listener : null, + _context : null, + _buf : '', + _sstream : null, + _browser_callback : null, + _host : '', + _port : -1, + _itemtype : '', + _selector : '', + + // feed the beast (i.e., the listener on the other end) + _feedBeast : function(request, listener, context, what) { + // create a new instance each time (instead of reusing one) + // just to make sure the previous instance has time to finish + var stringstream = Cc["@mozilla.org/io/string-input-stream;1"] + .createInstance(Ci.nsIStringInputStream); + stringstream.setData(what, what.length); + listener.onDataAvailable(request, context, + stringstream, 0, what.length); + }, + + // nsISupports + QueryInterface : XPCOMUtils.generateQI([nsISupports, + nsIStreamListener, + nsIStreamConverter, + nsIRequestObserver]), + + // nsIRequestObserver + onStartRequest : function(request, context) { + // init the channel with data and content type + // this is almost always text/plain but we are flexible + + this._context = context; + this._buf = ''; + + var chan = request.QueryInterface(nsIChannel); + if (chan) + chan.contentType = "text/html"; + this._listener.onStartRequest(request, context); + }, + + /* when the request terminates, we then parse the data (using the + global functions above) and manipulate the browser. the other + end gets a StopRequest but we don't pass it any data. */ + + onStopRequest : function(request, context, status) { + // stop the stream and destroy it + if (this._sstream) + this._sstream.close(); + this._sstream = null; + + // process it here before we tear down everything + var w = OverbiteCapsPro(this._buf); + var k = OverbiteCapsKey(this._host, this._port); + capscache[k] = w; + OverbiteLog("cached caps entry created for "+k); + + // if there is a callback, send NO data. manipulate the URL + // and we are done! + if (this._browser_callback) { + // compute the new URL ... + var s = OverbiteCapsBackPathFromSel(w, this._selector); + s = OverbiteURLFromSel(this._host, this._port, + this._itemtype, s); + OverbiteLog("backing up to "+s); + + // briefly stop the load group before we retarget ... + this._listener.onStopRequest(request, this._context, status); + this._listener = null; + this._context = null; + + // ... and force the browser to the new URL. + // we need to biff the current history entry so that + // the caps redirect is seamless. + this._browser_callback.webNavigation.loadURI(s, + 128, // LOAD_FLAGS_REPLACE_HISTORY + null, null, null); + return; + } + + // we are being asked to display the caps, so squirt it out + // to the _listener, and conclude. + var x = ""; + for (var i in w) { + if (w.hasOwnProperty(i)) { + var v = w[i]; + if (v == true) + v = "true"; + if (v == false) + v = "false"; + x += i + " ==> " +w[i] + "
\n"; + } + } + this._feedBeast(request, this._listener, this._context, + x); + this._listener.onStopRequest(request, this._context, status); + this._listener = null; + this._context = null; + }, + + // nsIStreamListener + onDataAvailable : function(request, context, stream, offset, count) { + var nbuf; + + if (!this._sstream) { + // create (and cache) our scriptable input stream + // note: this is NOT BINARY SAFE (but Gopher is + // mostly 7-bit) + this._sstream = Cc["@mozilla.org/scriptableinputstream;1"] + .createInstance(Ci.nsIScriptableInputStream); + this._sstream.init(stream); + } + nbuf = this._sstream.read(count); + this._buf += nbuf; + }, + + // nsIStreamConverter + convert : function(from, to, listener, context) { + // synchronous conversion will not be supported w/o good reason + throw Cr.NS_ERROR_NOT_IMPLEMENTED; + }, + asyncConvertData : function(from, to, listener, context) { + // if this were a real translator, we'd uncomment this +// if (from != ... || to != ...) +// throw Cr.NS_ERROR_NOT_IMPLEMENTED; + this._contentType = to; + this._listener = listener; + this._context = context; + } +} + +/* + * the dotless object handles things like svg and xml that barf on the + * terminal period that certain servers emit, and is also nice for + * text/plain. it is similar to Caps and implements the same interfaces. +*/ + +function OverbiteDotless() { } +OverbiteDotless.prototype = { + + // my stuff + _contentType: null, + _listener : null, + _context : null, + _buf : '', + _sstream : null, + + // useful internal functions + + // feed the beast (i.e., the listener on the other end) + _feedBeast : function(request, listener, context, what) { + // create a new instance each time (instead of reusing one) + // just to make sure the previous instance has time to finish + var stringstream = Cc["@mozilla.org/io/string-input-stream;1"] + .createInstance(Ci.nsIStringInputStream); + stringstream.setData(what, what.length); + listener.onDataAvailable(request, context, + stringstream, 0, what.length); + }, + // charAtEnd allows easier snarfing of trailing characters + _charAtEnd : function(index) { + return this._buf.charAt(this._buf.length - index); + }, + _lopOff : function(index) { + OverbiteLog("dotless removed "+index+" characters"); + this._buf = this._buf.substr(0, this._buf.length - index); + OverbiteLog("now "+this._buf.length+" long"); + }, + + // nsISupports + QueryInterface : XPCOMUtils.generateQI([nsISupports, + nsIStreamListener, + nsIStreamConverter, + nsIRequestObserver]), + + // nsIRequestObserver + onStartRequest : function(request, context) { + // init the channel with data and content type + + var chan = request.QueryInterface(nsIChannel); + if (chan) + chan.contentType = this._contentType; + // from asyncConvertData + this._context = context; + this._buf = ''; + this._listener.onStartRequest(request, context); + }, + + /* this is a very simple construct with a rolling buffer. essentially + we start by priming the pump with a small one character output, + then delaying and buffering data until the last pulse of data and + onStopRequest gets called, which if there is a final dot, should + be in the leftover buffer. */ + + onStopRequest : function(request, context, status) { + // trim the end of _buf + if (this._buf.indexOf(".")) { // don't bother if there's no dot + // check for very specific sequences + var l = this._buf.length; + if (l == 1) + this._buf = ""; // must be a bare dot + else if (this._buf == ".\r\n" || this._buf == ".\n") + this._buf = ""; + else if (this._buf == "\n." || this._buf == "\r\n.") + this._buf = ""; + else if (this._charAtEnd(1) == "." && + this._charAtEnd(2) == "\n"){ + this._lopOff(1); + } else if (this._charAtEnd(1) == "\n") { + if (l > 3 && this._charAtEnd(2) == "\r" && + this._charAtEnd(3) == "." && + this._charAtEnd(4) == "\n") { + this._lopOff(3); + } else if (l > 2 && this._charAtEnd(2) == "." + && this._charAtEnd(3) == "\n") { + this._lopOff(2); + } + } + // otherwise must be some other construction + } + this._feedBeast(request, this._listener, + this._context, this._buf) + if (this._buf.length); + this._buf = ''; + this._listener.onStopRequest(request, this._context, status); + this._listener = null; + this._context = null; + if (this._sstream) + this._sstream.close(); + this._sstream = null; + }, + + // nsIStreamListener + onDataAvailable : function(request, context, stream, offset, count) { + var nbuf; + + if (!this._sstream) { + // create (and cache) our scriptable input stream + // note: this is NOT BINARY SAFE (but Gopher is + // mostly 7-bit) + this._sstream = Cc["@mozilla.org/scriptableinputstream;1"] + .createInstance(Ci.nsIScriptableInputStream); + this._sstream.init(stream); + } + nbuf = this._sstream.read(count); + if (this._buf.length) { + this._feedBeast(request, this._listener, this._context, + this._buf); + this._buf = nbuf; + } else { + if (count == 1) { // degenerate case + this._feedBeast(request, this._listener, + this._context, nbuf); + // come back for more + } else { + this._buf = nbuf.substr(1); + this._feedBeast(request, this._listener, + this._context, nbuf.substr(0,1)); + } + } + }, + + // nsIStreamConverter + convert : function(from, to, listener, context) { + // synchronous conversion will not be supported w/o good reason + throw Cr.NS_ERROR_NOT_IMPLEMENTED; + }, + asyncConvertData : function(from, to, listener, context) { + // if this were a real translator, we'd uncomment this +// if (from != ... || to != ...) +// throw Cr.NS_ERROR_NOT_IMPLEMENTED; + this._contentType = to; + this._listener = listener; + this._context = context; + } +} + +/* + * the converter object for turning a gopher directory into HTML. we no + * longer use HTTP_INDEX because frankly it can't handle all that gopher + * offers. +*/ + +function OverbiteDirconv() { } +OverbiteDirconv.prototype = { + + // my stuff + _listener : null, + _context : null, + _buf : '', + _pbuf : '', + _sstream : null, + _divlevel : 0, + + /* l10n/i18n support and string bundles */ + + // for strings that are already Unicode (like our localization) + _unicodeEntityFix : function(what) { + // needed to ampersand-encode ALT text and other stuff + return "&#" + what.charCodeAt(0) + ";"; + }, + _unicodeStringFix : function(what) { + var q; + q = what; + q = q.replace(/([\u0080-\uFFFF])/g, this._unicodeEntityFix); + return q; + }, + + // we load both itypes and obff because we use both of them now. + _bundle : Cc["@mozilla.org/intl/stringbundle;1"] + .getService(Ci.nsIStringBundleService) + .createBundle(OBFFCHROMEURL + "/locale/itypes.properties"), + _getL10NString : function(msg, args) { + var q; + OverbiteLog("string query: "+msg); + + if (args) + return this._unicodeStringFix( + this._bundle.formatStringFromName(msg, args, + args.length)); + else + return this._unicodeStringFix( + this._bundle.GetStringFromName(msg)); + }, + _obundle : Cc["@mozilla.org/intl/stringbundle;1"] + .getService(Ci.nsIStringBundleService) + .createBundle(OBFFCHROMEURL + "/locale/obff.properties"), + _ogetL10NString : function(msg, args) { + if (args) + return this._obundle.formatStringFromName(msg, args, + args.length); + else + return this._obundle.GetStringFromName(msg); + }, + + _itypes : [ '0', '1', '2', '3', '4', '5', '6', + '7', '8', '9', 'g', 'I', 's', 'h', ';', + 'p', 'd', 'T' ] , + + // useful internal functions + + // feed the beast (i.e., the listener on the other end) + _feedBeast : function(request, listener, context, what) { + // create a new instance each time (instead of reusing one) + // just to make sure the previous instance has time to finish + var stringstream = Cc["@mozilla.org/io/string-input-stream;1"] + .createInstance(Ci.nsIStringInputStream); + stringstream.setData(what, what.length); + listener.onDataAvailable(request, context, + stringstream, 0, what.length); + }, + // mungers and twisters to convert RFC-1436 cdata into valid SGML + _dsSpaceFix : function(what) { + var wout = what; + wout = wout.replace(/ /g, "  "); + wout = wout.replace(/ \ /g, "  "); + wout = wout.replace(/\  /g, "  "); + wout = wout.replace(/^ /, " "); + return wout; + }, + _entityFix : function(what) { + var wout = what; + wout = wout.replace(/\&/g, "&"); + wout = wout.replace(/>/g, ">"); + wout = wout.replace(/' ; + + rootbutt = +'
' + capupurl + +'' + +'
' + +"\n"; + } + whoami = whoami.asciiSpec; + } + if (whoami && whoami.length) { + twhoami = ": "+whoami; + if (whoami.indexOf("?") > -1) + whoami = ((whoami.split("?"))[0]) + "?..."; + else if (whoami.indexOf("%09") > -1) + whoami = ((whoami.split("%09"))[0]) + "?..."; + } + if (!whoami) + whoami = ''; + + var ibuf = +'' + "\n" + +"\n"+ +"\n"+ +'' + "\n" + +'' + "\n" + +"Gopher document" + twhoami + "\n"+ +''+ +'\n"+ +"\n"+ +'
'+ +'
'+ +'
'+ +'
' + whoami + '
' + + "\n" + +rootbutt + +'
'+ +'
' + "\n" + +'' + "\n"; + + // init the channel with data and content type + var chan = request.QueryInterface(nsIChannel); + if (chan) + chan.contentType = 'text/html'; + this._context = context; + this._listener.onStartRequest(request, context); + this._feedBeast(request, this._listener, context, ibuf); + + }, + + onStopRequest : function(request, context, status) { + this._buf += +"
\n"+ +"
\n"+ +"
\n"+ +"\n"+ +"\n"; + + this._feedBeast(request, this._listener, + this._context, this._buf); + this._buf = ''; + this._listener.onStopRequest(request, this._context, status); + this._listener = null; + this._context = null; + if (this._sstream) + this._sstream.close(); + this._sstream = null; + }, + + // nsIStreamListener + onDataAvailable : function(request, context, stream, offset, count) { + var i; + var obuf = ''; + + if (!this._sstream) { + // create (and cache) our scriptable input stream + // note: this is NOT BINARY SAFE (but Gopher is + // mostly 7-bit) + this._sstream = Cc["@mozilla.org/scriptableinputstream;1"] + .createInstance(Ci.nsIScriptableInputStream); + this._sstream.init(stream); + } + this._pbuf += this._sstream.read(count); + while((i = this._pbuf.indexOf("\n")) > -1) { + // pull the next tab-delimited string off the buffer + var w = this._pbuf.substr(0, i); + if (i < this._pbuf.length) + this._pbuf = this._pbuf.substr(i+1); + else + this._pbuf = ''; + + w = w.replace("\r", ""); + w = w.replace("\n", ""); + + var itype = w.substr(0,1); + + var attribs = w.substr(1).split("\t"); + var ds = this._dsSpaceFix(this._entityFix( + attribs.shift())); + if (!ds.length) + ds = " "; + + var sel = attribs.shift(); + if (!sel) + sel = ''; + + var host = attribs.shift(); + if (host && host.length) + host = encodeURI(host); + var port = parseInt(attribs.shift()); + if (isNaN(port)) + port = 0; // falls through to bogosity filter + var icalt = (this._itypes.indexOf(itype) > -1) + ? this._getL10NString(itype) + : this._getL10NString('unknown'); + var iconbase = "gopher:///internal-"; + + if (itype == "'" || itype == '"') { + // these are just going to cause all kinds of + // problems, so they are simply suppressed + obuf += +'\n"; + } else if (itype == 'i' || itype == '3') { + var lclass = (itype == '3') ? 'erroritem' + : 'infoitem'; + if (itype == '3') { + obuf += + '' + + ''; + //+ 'border = "0">'; + } else + obuf += ""; + obuf += '' + + '' + + ds + "\n"; + } else if (host && host.length && port > 1) { + var suburl; + var icon = "icn.png"; + var lclass = "fileitem"; + var spannable = 0; + + if (itype == '8' || itype == 'T') { + // don't let them inject + // arbitrary HTML with " + sel = sel.replace(/["']/g, ""); + suburl = "telnet://" + host + ":" + + port + "/" + sel; + var icon = "icn" + itype + ".png"; + var lclass = "telnetitem"; + icalt = this._getL10NString('telnet'); + } else if (itype == 'h' && + (sel.substr(0,4) == "URL:" || + sel.substr(0,5) == "/URL:")) { + var subn = (sel.substr(0,1) == "/") + ? 5 : 4; + suburl = encodeURI(sel.substr(subn)); + if (suburl.match(/^javascript:/) || + suburl.match(/^data:/)) { + suburl = ""; + ds += + ' (' + this._getL10NString('unsafeurl') + ')'; + } + icon = "icnhURL.png"; + lclass = "urlitem"; + icalt = this._getL10NString('exturl'); + } else if (port >= 80 && itype == 'h' && + sel.match(/^[A-Z]+(%20| )/)) { + sel = sel.replace(/^[A-Z]+(%20| )/,''); + suburl = "http://"+host+":"+port+ + (sel.substr(0,1) == "/" ? + "" : "/") + + encodeURI(unescape(sel)); + icon = "icnhURL.png"; + lclass = "urlitem"; + icalt = this._getL10NString('exturl'); + } else { + suburl = OverbiteURLFromSel(host, port, + itype, sel); + + if (itype == "g" + || itype == "h" + || itype == "p" + || itype == "I" + || itype == "7" + || itype == "0") spannable = 1; + this._divlevel += spannable; + var dl = this._divlevel; + + // attempt to escape weird itypes + var eitype = escape(itype); + if (eitype.length > 1) // it was + eitype = eitype.substr(1) + .toLowerCase(); + icon = (this._itypes.indexOf(itype)>-1) + ? ("icn"+eitype+".png") + : "icn.png"; + lclass = + (itype == '7' || itype == '2') + ? 'searchitem': + (itype == '1') ? 'diritem' : + 'fileitem'; + } + obuf += + ''; + if (spannable) obuf += +''; + obuf += + '' + + '' + + '' + + '' + + '' + + ds + "\n"; + if (spannable) obuf += + ''+ + '
'+"\n"; + + } else { + obuf += // no point in localizing this, I think + "\n"; + } + } + this._feedBeast(request, this._listener, this._context, obuf); + }, + + // nsIStreamConverter + convert : function(from, to, listener, context) { + // synchronous conversion will not be supported w/o good reason + throw Cr.NS_ERROR_NOT_IMPLEMENTED; + }, + asyncConvertData : function(from, to, listener, context) { + // if this were a real translator, we'd uncomment this +// if (from != "text/x-overbite-gopher-dir" || to != "text/html") +// throw Cr.NS_ERROR_NOT_IMPLEMENTED; + this._listener = listener; + this._context = context; + } + +}; + +/* + * the channel object that actually does the protocol negotiation. +*/ + +function OverbiteChannel(input_uri, proxyinfo, loadinfo) { + this.init(input_uri, proxyinfo, loadinfo); +} + +OverbiteChannel.prototype = { + + // my stuff + _itemtype : null, + _selector : null, + _host : null, + _port : null, + _transport : null, + _proxyinfo : null, + _pump : null, + _listener : null, + _context : null, + _progsink : null, + _browser_callback : null, + _is_caps : false, + + // for bug 769764 + _proxyresolveflags : null, + _proxy_uri : null, + + csoargs : '', + queryargs : '', + transreq : null, // actual transmitted request (see sendRequest) + + // we only need itypes for the notification helper. + _bundle : Cc["@mozilla.org/intl/stringbundle;1"] + .getService(Ci.nsIStringBundleService) + .createBundle(OBFFCHROMEURL + "/locale/itypes.properties"), + _getL10NString : function(msg, args) { + var q; + OverbiteLog("string query: "+msg); + + if (args) + return this._bundle.formatStringFromName(msg, args, + args.length); + else + return this._bundle.GetStringFromName(msg); + }, + // for strings that are already Unicode (like our localization) + _unicodeEntityFix : function(what) { + // needed to ampersand-encode ALT text and other stuff + return "&#" + what.charCodeAt(0) + ";"; + }, + _unicodeStringFix : function(what) { + var q; + q = what; + q = q.replace(/([\u0080-\uFFFF])/g, this._unicodeEntityFix); + return q; + }, + + // nsISupports + // we can simplify this later; see nsIProxiedProtocolHandler + QueryInterface : XPCOMUtils.generateQI(((Ci.nsIProtocolProxyCallback) + ? [nsISupports, nsIChannel, nsIRequest, Ci.nsIProtocolProxyCallback] + : [nsISupports, nsIChannel, nsIRequest])), + + // nsIRequest + loadFlags : 0, + name : null, + _pending : false, + isPending : function() { return this._pending; }, + _status : Cr.NS_OK, + _loadGroup : null, + + get status() { + if (this._pump) + return (this._pump.status); + else + return this._status; + }, + set status(status) { this._status = status; }, + cancel : function(status) { + if (this._pump) + return (this._pump.cancel(status)); + else + return Cr.NS_OK; + }, + suspend : function() { + if (this._pump) + return (this._pump.suspend()); + else + return Cr.NS_OK; + }, + resume : function() { + if (this._pump) + return (this._pump.resume()); + else + return Cr.NS_OK; + }, + + // nsIChannel + loadInfo : null, + loadAttributes : null, + contentCharset : null, + contentLength : -1, + contentType : null, + _notificationCallbacks : null , + originalURI : null, + owner : null, + URI : null, + init : function(input_uri, proxyinfo, loadinfo) { + // constructor + this.URI = input_uri; + this.originalURI = input_uri; + this.name = input_uri; + if (proxyinfo) + this._proxyinfo = proxyinfo; + + // process item type and set contentType + var sel = decodeURI(input_uri.path); + if (sel == null || !sel.length || sel == '/') { + this._itemtype = '1'; + this._selector = ''; + } else if (sel.length == 1) { + this._itemtype = sel; + this._selector = ''; + } else { + this._itemtype = sel.substr(1,1); + this._selector = sel.substr(2); + } + + if (!input_uri.host || !input_uri.host.length) + throw Cr.NS_ERROR_MALFORMED_URI; + else + this._host = input_uri.host; + if (!input_uri.port || input_uri.port < 1) + this._port = 70; + else + this._port = input_uri.port; + + // force our itemtype. realistically, the old Gopher let people + // slide a lot with content sniffing, but that's not going to + // happen anymore. this is written to be as rigid as possible + // for a particular itemtype (but see type I, sigh). + var c; + switch(this._itemtype) { + case '1' : + case '7' : + c = 'application/x-overbite-gopher-dir'; + // this lets us override 1.9's gopher support + break; + + case 'c' : + c = 'text/css'; + break; + + case 'x' : + c = 'application/xml'; // I miss text/xml + break; + + case '0' : + case '2' : + c = 'text/plain'; + break; + + case 'g' : + c = 'image/gif' ; + break; + + case 'I' : + // oh, man, this is gross -- designed to + // support both the common use of I for + // JPEG images, and the official spec that + // I is a 'general image type' (we only + // support the ones Mozilla will display) + // + // taken from netwerk/mime/public/nsMimeTypes.h + if (this._selector.match(/\.jpe?g$/i)) + c = 'image/jpeg' ; + else if (this._selector.match(/\.gif$/i)) + c = 'image/gif' ; // grrRRR! use 'g'!! + else if (this._selector.match(/\.xbm$/i)) + c = 'image/x-xbitmap' ; + else if (this._selector.match(/\.png$/i)) + c = 'image/png' ; + else if (this._selector.match(/\.svg$/i)) + c = 'image/svg+xml' ; + else if (this._selector.match(/\.bmp$/i)) + c = 'image/bmp' ; + else if (this._selector.match(/\.icon?$/i)) + c = 'image/x-icon' ; + else if (this._selector.match(/\.tiff?$/i)) + c = 'image/tiff' ; + else + c = 'image/jpeg' ; + // this broke too many things + //c = 'application/octet-stream'; + break; + + case 'h' : + c = 'text/html'; + break; + + case 'p' : + c = 'image/png'; + break; + + case 'd' : + c = 'application/pdf'; + break; + + case '8' : + case 'T' : + throw Cr.NS_ERROR_NOT_IMPLEMENTED; + break; + + default : + c = 'application/octet-stream'; + break; + } + this.contentType = c; + this.loadInfo = loadinfo; + + OverbiteLog(("channel initialized: "+ + this._host + " " + + this._port + " " + + this._itemtype + " " + + this._selector + " " + + "")); + return Cr.NS_OK; + }, + + /* open is not being implemented */ + open : function() { + throw Cr.NS_ERROR_NOT_IMPLEMENTED; + }, + + asyncOpen2 : function (listener) { + return asyncOpen(listener, null); + }, + + asyncOpen : function (listener, context) { + this._listener = listener; + this._context = context; + + // we can simplify this later; see nsIProxiedProtocolHandler + if (Ci.nsIProtocolProxyCallback) { + // if we can do asynchronous proxy resolution, ask + // the proxy service what to do + var nsPPS = Cc["@mozilla.org/network/protocol-proxy-service;1"] + .getService(Ci.nsIProtocolProxyService); + OverbiteLog(("async proxy resolution in progress")); + nsPPS.asyncResolve(this.URI, this._proxyresolveflags, + this); + OverbiteLog(("waiting for proxy")); + } else { + // otherwise assume already synchronously resolved + OverbiteLog(("no proxy callback needed")); + this.onProxyAvailable(null, null, this._proxyinfo, + Cr.NS_OK); + } + }, + + onProxyAvailable : function(request, uri, proxyinfo, status) { + if (proxyinfo) + OverbiteLog(("proxyinfo: "+proxyinfo)); + + this._proxyinfo = proxyinfo; + OverbiteLog(("proxyinfo on; trying to initialize transport")); + + var transportService = Cc["@mozilla.org/network/socket-transport-service;1"] + .getService(Ci.nsISocketTransportService); + this._transport = transportService + .createTransport(null, 0, + this._host, + this._port, + this._proxyinfo); + if (!(this.loadFlags & nsIRequest.LOAD_BACKGROUND)) { + // hook up our event sink to the current UI thread + var cq = Cc["@mozilla.org/thread-manager;1"] + .getService().currentThread; + OverbiteLog("yes, we have sink "+cq); + this._transport.setEventSink(this, cq); + } + // open and initialize the data pump to read from the socket + var sinput = + this._transport.openInputStream(0,0,0); + this.sendRequest(); + this._pump = Cc["@mozilla.org/network/input-stream-pump;1"]. + createInstance(Ci.nsIInputStreamPump); + this._pump.init(sinput, -1, -1, 0, 0, true); + this._pump.asyncRead(this, null); + if (this._loadGroup) { + this._loadGroup.addRequest(this, null); + OverbiteLog("load group added"); + } + this._pending = true; + + // if this is caps, start it and abort now + if (this._is_caps) { + OverbiteLog("caps request in progress"); + var caps = new OverbiteCaps(); + caps._host = this._host; + caps._port = this._port; + caps._itemtype = this._itemtype; + caps._selector = this._selector; + caps.asyncConvertData( + 'generic/caps', + this.contentType, + this._listener, + this._context); + this._listener = caps; + this._context = null; + caps._browser_callback = this._browser_callback; + OverbiteLog(("now with caps: "+caps)); + return Cr.NS_OK; + } + + // push on another content listener (in this case us) for + // those itemtypes requiring translation to something else + var transitives = [ '1', '7' ]; // item types for translation + if (transitives.indexOf(this._itemtype) > -1) { + OverbiteLog(("this type requires translation")); + var dirconv = new OverbiteDirconv(); + dirconv.asyncConvertData( + 'application/x-overbite-gopher-dir', + 'text/html', + this._listener, + this._context); + this._listener = dirconv; + this._context = null; + OverbiteLog(("now with dirconv: "+dirconv)); + } + // dotless conversion + var prefs = Cc["@mozilla.org/preferences-service;1"] + .getService(Ci.nsIPrefBranch); + var do_dotless = true; + // first load hidden preference for dotless + if (prefs.getPrefType(OBFFDOTLESSPREF) == prefs.PREF_BOOL) { + do_dotless = prefs.getBoolPref(OBFFDOTLESSPREF); + OverbiteLog(("dotless has been set to "+do_dotless)); + // otherwise default is true + } else { + OverbiteLog(("no "+OBFFDOTLESSPREF+" not bool")); + } + if (do_dotless && ( + this.contentType.match(/^text\//) || + this.contentType == 'application/xml' || + this.contentType == 'image/svg+xml' || + 0)) { + OverbiteLog("this type needs to be dotless"); + var dotless = new OverbiteDotless(); + dotless.asyncConvertData( + 'generic/dotless-type', + this.contentType, + this._listener, + this._context); + this._listener = dotless; + this._context = null; + OverbiteLog(("now with dotless: "+dotless)); + } + OverbiteLog(("transport service for "+ + this._host + " initialized")); + return Cr.NS_OK; + }, + + get loadGroup() { return this._loadGroup; }, + set loadGroup(loadGroup) { + this._loadGroup = loadGroup; + this._progsink = null; + }, + get notificationCallbacks() { + return this._notificationCallbacks; + }, + set notificationCallbacks(nc) { + this._notificationCallbacks = nc; + this._progsink = null; + }, + get securityInfo() { + if (this._transport) + return this._transport.securityInfo; + //throw Cr.NS_ERROR_NOT_AVAILABLE; + return null; + }, + // set securityInfo? bwahahaha + set securityInfo(foo) { + throw Cr.NS_ERROR_NOT_IMPLEMENTED; + return null; + }, + + + onStartRequest : function(request, context) { + if (this._listener) + this._listener.onStartRequest(this, + this._context); + OverbiteLog(("onStartRequest"+this._listener)); + }, + onStopRequest : function(request, context, status) { + OverbiteLog(("onStopRequest: "+status)); + if(Components.isSuccessCode(status)) + this.status = status; + + if (this._listener) { + this._listener.onStopRequest(this, + this._context, + this.status); + OverbiteLog("listener stopped"); + this._listener = null; + this._context = null; + } + if (this._loadGroup) { + this._loadGroup.removeRequest(this, + context, // null, + this.status); + OverbiteLog("load group stopped"); + } + + this._pump = null; + this._transport.close(this.status); + this._transport = null; + this.notificationCallbacks = null; // use our own getter/setter + this._progsink = null; + this._pending = false; + + OverbiteLog("end of request"); + + // Attach a notification box for navigation. + // Attach only iff: + // - the tab URL matches ours. (We could be in an iframe.) + // - there is no notification box there already. + // - this is not a gopher menu. We do this in the HTML instead. + // Backing up to a menu doesn't restore this box, so we should + // only do this to a terminal document. + var transitives = [ '1', '7' ]; // item types that are menus + if (transitives.indexOf(this._itemtype) == -1) { + try { // no meaning if this fails. + OverbiteLog("attempting to load nav bar "+this.originalURI.spec); + // XXX try selected tab first for speed? + + // Iterate over all windows and tabs to find us. + // If there are multiple instances, add the box; it + // won't hurt (as long as we didn't before). + + var wm = Cc["@mozilla.org/appshell/window-mediator;1"] + .getService(Ci.nsIWindowMediator); + var be = wm.getEnumerator("navigator:browser"); + while(be.hasMoreElements()) { + var win = be.getNext(); + var tabb = win.gBrowser; + + // check each tab + var tabs = tabb.browsers.length; + for (var i=0; i 1 && + (input_uri.path.charAt(input_uri.path.length-1) == "/" || + input_uri.path.match(/^\/[^1]$/))) { + var prefs = Cc["@mozilla.org/preferences-service;1"] + .getService(Ci.nsIPrefBranch); + // first load hidden preference for cluefulness + if (prefs.getPrefType(OBFFFIXITYPEPREF) == + prefs.PREF_BOOL) { + rv = prefs.getBoolPref(OBFFFIXITYPEPREF); + // this is our default answer + } else { + rv = OverbitePrompter("swapitype", function() { + return prompter.confirm(null, + self._getL10NString('swapitype.title'), + self._getL10NString('swapitype')) + }); + } + if (rv) { + var newuri = "gopher://" + input_uri.host + + ((input_uri.port == 70 || + input_uri.port == -1) ? "" : + (":"+input_uri.port)) + + "/1" + input_uri.path.substr(2); + this._getBrowser().webNavigation.loadURI( + newuri, 0, null, null, null); + // this is a bit cheap, but we don't want + // Fx freaking that we didn't give it a channel + throw Cr.NS_ERROR_ABORT; + return null; // above will do redirect + } else { + // INSERT COINS AND CONTINUE + } + } + + // handle itemtype 7 at this stage and turn into a channel + // for itemtype 1 instead, except if this particular URL has + // arguments (but wouldn't you want to do that as itype 1?). + if (input_uri.path.substr(0,2) == "/7" && + input_uri.path.indexOf("?") == -1 && + input_uri.path.indexOf("%09") == -1) { + // we will accept "blank" responses -- could be valid + // use the global prompter objects + var rv = OverbitePrompter("search", function() { + return prompter.prompt(null, + self._getL10NString('search.title'), + self._getL10NString('search'), + query, null, chequestub) + }); + if (!rv) { + throw Cr.NS_ERROR_ABORT; + return null; + } + // stuff query into channel query args rather than + // kludging it into a URL + var ob = new OverbiteChannel(input_uri, proxyinfo, + loadinfo); + ob._proxyresolveflags = proxyresolveflags; + ob._proxy_uri = proxy_uri; + ob.queryargs = query.value; + return ob; + } + + // similarly handle itemtype 2 + // if it's /2....fjhgkrjgh then pass that on to the CSO server + // (it's a fully qualified query that requires no parsing) + if (input_uri.path == "/2" || input_uri.path == "/2/") { + // unlike itype 7 we MUST enter a query for this + var rv = OverbitePrompter("cso", function() { + return prompter.prompt(null, + self._getL10NString('cso.title'), + self._getL10NString('cso'), + query, null, chequestub) + }); + if (rv && !query.value.length) // blank query + OverbitePrompter("csobogus", function() { + prompter.alert(null, + self._getL10NString('csobogus.title'), + self._getL10NString('csobogus')) + }); + if (!rv || !query.value.length) { + throw Cr.NS_ERROR_ABORT; + return null; + } + // stuff query into channel csoargs + var ob = new OverbiteChannel(input_uri, proxyinfo, + loadinfo); + ob._proxyresolveflags = proxyresolveflags; + ob._proxy_uri = proxy_uri; + ob.csoargs = query.value; + return ob; + } + + // make chrome channel either to images or CSS if + // input_uri is "gopher:///internal-" and no / and + // extension is .png, .css or .js + if (!input_uri.host.length && + // PARANOIA STRIKES DEEP IN THE HEARTLAND!!!1 + !input_uri.path.substr(1).match(/\//) && + input_uri.path.match(/^\/internal-[^/ ]+\.(css|png|js)$/)) { + OverbiteLog("handling internal chrome: " + +input_uri.asciiSpec); + var IURL; + var mpath = input_uri.path.substr(1) + .replace(/^internal-/, ""); + + // try profile directory + var dirService = Cc["@mozilla.org/file/directory_service;1"] + .getService(Ci.nsIProperties); + + var uprof = dirService.get("ProfD", Ci.nsIFile); + var basedir = "gopherchrome"; + //uprof.appendRelativePath(basedir); + uprof.append(basedir); + + if (uprof.exists() && uprof.isDirectory()) { + // use the user's gopherchrome directory for + // CSS, icons and content level javascript + OverbiteLog("trying user directory"); + var fileProServ = Cc["@mozilla.org/network/io-service;1"] + .getService(Ci.nsIIOService) + .getProtocolHandler("file") + .QueryInterface(Ci + .nsIFileProtocolHandler); + + uprof.append(mpath); + if (uprof.exists() && uprof.isFile()) + IURL = fileProServ.getURLSpecFromFile( + uprof); + } + if (!IURL) { + OverbiteLog("trying internal chrome dir"); + IURL = OBFFCHROMEURL+ "/content/chrome/" + +mpath; + } + OverbiteLog("resulting URL: "+IURL); + return ioService.newChannel(IURL, null, null); + } + + // otherwise + // make chrome channel to about page if + // input_uri lacks a hostname + if (!input_uri.host.length) { + OverbiteLog("internal about page served up instead"); + OverbiteSetPrefs(); // sigh + + // SEKRIT FUNKTION. gopher:/// clears the caps cache + capscache = new Object(); + OverbiteLogAlways("caps cache is cleared"); + + return ioService.newChannel( + OBFFABOUTURL, + null, null); + } + + // otherwise + // immediately reject "pseudo" item types we don't handle + // do this here because it traps internal URLs + var wontshow = ['/i', '/3', '/8', '/T']; + if (input_uri.path && input_uri.path.length > 1 && + wontshow.indexOf(input_uri.path.substr(0,2)) > -1) { + OverbitePrompter("baditype", function() { + prompter.alert(null, + self._getL10NString('baditype.title'), + self._getL10NString('baditype')) + }); + throw Cr.NS_ERROR_ABORT; + return null; + } + + // silently reject port numbers we will never allow + //if (badports.indexOf(input_uri.port) > -1) { + if (input_uri.port && input_uri.port >= 0 + && alwayslet.indexOf(input_uri.port)== -1) { + OverbiteLog("illegal port: "+input_uri.port); + throw Cr.NS_ERROR_PORT_ACCESS_NOT_ALLOWED; + return null; + } + + // else it's a legit gopher request + // make our channel and gopher it + ob = new OverbiteChannel(input_uri, proxyinfo, loadinfo); + ob._proxyresolveflags = proxyresolveflags; + ob._proxy_uri = proxy_uri; + return ob; + } +}; + +/* Startup code */ + +var components = [ OverbiteProtocol ]; +function NSGetModule(compMgr, fileSpec) { + return XPCOMUtils.generateModule(components); +} +/* for Gecko 2 (deprecated) */ +if (XPCOMUtils.generateNSGetFactory) + var NSGetFactory = XPCOMUtils.generateNSGetFactory(components); + +function OverbiteSetPrefs() { + var prefs = Cc["@mozilla.org/preferences-service;1"]; + var prefserv = prefs.getService(Ci.nsIPrefService); + prefs = prefs.getService(Ci.nsIPrefBranch); + prefs.setIntPref(OBFFBUILDPREF, OBFFBUILD); + prefserv.savePrefFile(null); +} + +OverbiteLog("startup with version "+OBFFVERS+" build "+OBFFBUILD); + +var prefs = Cc["@mozilla.org/preferences-service;1"]; +var prefserv = prefs.getService(Ci.nsIPrefService); +prefs = prefs.getService(Ci.nsIPrefBranch); + +if (prefs.getPrefType(OBFFBUILDPREF) != prefs.PREF_INT || + prefs.getIntPref(OBFFBUILDPREF) < OBFFBUILD) { + var obs = Cc["@mozilla.org/observer-service;1"] + .getService(Ci.nsIObserverService); + + // create an observer to wait for the top level window + // and then take it over for startup + var listeno = { + _timer : null, + _window : null, +/* TEMPORARY HACK: Complain in the brag screen if this is an e10s window. */ + _e10s : false, + + // nsISupports + QueryInterface : XPCOMUtils.generateQI([nsISupports, + nsIObserver, + nsITimerCallback]), + + // nsITimerCallback + notify : function(timer) { + OverbiteLog("timer tripped"); + this._timer = null; + this._window.focus(); + this._window.getBrowser().selectedTab = + this._window.getBrowser().addTab(OBFFIABOUTURL+ +/* TEMPORARY HACK: Complain in the brag screen if this is an e10s window. */ + ((this._e10s) ? "#e10s" : "")); + this._window = null; + }, + + // nsIObserver + observe : function(subject, topic, data) { + // we're not picky about topic, since it + // is designed to respond to *at least* two. + OverbiteLog("observer tripped by topic: "+topic); + +/* TEMPORARY HACK: Complain in the brag screen if this is an e10s window. */ + if (subject && subject.gMultiProcessBrowser) + this._e10s = true; // damn + + var obs = Cc["@mozilla.org/observer-service;1"] + .getService(Ci.nsIObserverService); + var wm = Cc["@mozilla.org/appshell/window-mediator;1"] + .getService(Ci.nsIWindowMediator); + + var w = wm.getMostRecentWindow('navigator:browser'); + if (!w) + return; // and live to hook another day + OverbiteLog("trying window"); + this._window = w; + + // for some reason this doesn't work until the window appears + // so we do it at the window opening level + var prefs = Cc["@mozilla.org/preferences-service;1"]; + var prefserv = prefs.getService(Ci.nsIPrefService); + prefs = prefs.getService(Ci.nsIPrefBranch); + + if (prefs.getPrefType(OBFFBUILDPREF) != + prefs.PREF_INT || + prefs.getIntPref(OBFFBUILDPREF) < + OBFFBUILD) { + // save even if the tab fails -- we + // only want to try this the first time + prefs.setIntPref(OBFFBUILDPREF, OBFFBUILD); + prefserv.savePrefFile(null); + OverbiteLog("prefs set"); + + this._timer = Cc["@mozilla.org/timer;1"] + .createInstance(Ci.nsITimer); + this._timer.initWithCallback(this, 2000, 0); + } + obs.removeObserver(this, topic); + return; + } + }; + + obs.addObserver(listeno, "sessionstore-windows-restored", false); + obs.addObserver(listeno, "browser-delayed-startup-finished", false); + OverbiteLog("no window yet, listener installed"); +} + diff --git a/browser/gopher/content/chrome/favicon.png b/browser/gopher/content/chrome/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..b1bd4a558f3516cfa44f7d90f18b9e4bbad9ab46 GIT binary patch literal 935 zcmV;Y16cftP)nyT!0P*NK7g(4@}{fB%F6U9uA(fSAC3<`$mBAf(8_ z>X^rH@%n8BF)=ZQxpU_-%$_})!N$yg~2ABk%5Jc;lhOr419ci3`dR}VQ6k{X4tS{14B?y5QC|yDZ{>f`xrib z`^muISilPmUsI4?fB<6rUn{$dfnUmsA!iTww!McK)~s2>5Fa1UaPQtdhMt}th95tE zFxc4GFbE0?g7NwD=NZ;4TgbpN+wUL4+xvR~0*D1@3Nyp+A79?Rf6px{D#|c#-aK&N zfHZ-^r@z0Sp`oFHK~ho@Y^c7zKEwL;8yG?v7(ubb3=lw&SYTviynFX9*qL9yeq~Tq zRb|+|eLL9yixw?nc=_@r*mf5e7X~LMCt!ebf%Sm20t67q1%E-&`S#5lhBIf*fJ0wS zPL9FX*O$S=!-L_;lP3&Uu3Q1zvwZn-hO=kSGJO2-fq~&CFp7YB0Rjl*f_V(z-U&EJ z{QOl|SO`{_mzM{oPn|l2l1M?`TCrjULzuoG1292xgY*If5GW8qNp~-Ukb?FizF6Kb zKYlZ0Wo3a~uw}~@xMon`J$m$r;n<-A3>~s(zc74wd;^#k>;VD@98f?*-2d0fz5Bnd z;i0R&_5Xr`g8#pN|Nj5*;luyHu=x)Hz$pB0pr!Wz_onLmV6`AUK)nC~gvbk^gp$)e`^!002ov JPDHLkV1kk>yV?K% literal 0 HcmV?d00001 diff --git a/browser/gopher/content/chrome/gopherchrome.css b/browser/gopher/content/chrome/gopherchrome.css new file mode 100644 index 0000000000..85f17800a6 --- /dev/null +++ b/browser/gopher/content/chrome/gopherchrome.css @@ -0,0 +1,150 @@ +/* You can modify this to your heart's content. This version tries to + harmonize with your computer's theme. */ + +img.gicon { + border: 0px; +} +table.gmenu { + width: 100%; + border: 0px; +} +td.gicon { + text-align: right; + vertical-align: middle; + padding: 0px; + margin: 1px; +} +td.ds { + text-align: left; + vertical-align: middle; + width: 100%; + padding: 0px; + margin: 1px; +} +span.diritem { + font-family: lucida sans typewriter, lucida console, droid sans mono, liberation mono, monaco, andale mono, bitstream vera sans mono, monospace; + font-size: small; +} +span.fileitem { + font-family: lucida sans typewriter, lucida console, droid sans mono, liberation mono, monaco, andale mono, bitstream vera sans mono, monospace; + font-size: small; +} +span.infoitem { + font-family: lucida sans typewriter, lucida console, droid sans mono, liberation mono, monaco, andale mono, bitstream vera sans mono, monospace; + font-size: small; + opacity: 0.9; +} +span.searchitem { + font-family: lucida sans typewriter, lucida console, droid sans mono, liberation mono, monaco, andale mono, bitstream vera sans mono, monospace; + font-size: small; + font-weight: bold; +} +span.urlitem { + font-family: lucida sans typewriter, lucida console, droid sans mono, liberation mono, monaco, andale mono, bitstream vera sans mono, monospace; + font-size: small; + font-weight: bold; +} +span.telnetitem { + font-family: lucida sans typewriter, lucida console, droid sans mono, liberation mono, monaco, andale mono, bitstream vera sans mono, monospace; + font-size: small; + font-weight: bold; +} +span.erroritem { + font-family: lucida sans typewriter, lucida console, droid sans mono, liberation mono, monaco, andale mono, bitstream vera sans mono, monospace; + font-size: small; + font-weight: bold; +} +span.purl { + /* font-family: lucida sans, lucida grande, droid sans, droid sans mono, monospace; */ + font: message-box; + font-weight: bold; + font-size: 1.5em; +} +div#topbar { + display: table-row; + padding: 0px; + margin: 0px; +} +div#urlparent { + display: table-cell; + width: 100%; + text-align: left; + padding: 0px; + margin: 0px; +} +div#urlarea { + padding: 8px; + margin-bottom: 0px; + border-style: none; + border-top-width: 1px; + border-left-width: 1px; + border-right-width: 1px; + border-bottom-width: 0px; + border-top-left-radius: 10px; + border-top-right-radius: 10px; + -moz-border-radius-topleft: 10px; + -moz-border-radius-topright: 10px; + display: table-cell; + vertical-align: text-bottom; +} +div#buttonarea { + padding: 8px; + margin-bottom: 0px; + border-color: ThreeDShadow; + border-style: solid; + border-top-width: 1px; + border-left-width: 1px; + border-right-width: 1px; + border-bottom-width: 0px; + display: table-cell; + border-top-left-radius: 10px; + border-top-right-radius: 10px; + -moz-border-radius-topleft: 10px; + -moz-border-radius-topright: 10px; +} +div#contentarea { + clear: both; + padding: 5px; + margin-top: 0px; + border-style: solid; + border-width: 1px; + border-color: ThreeDShadow; + -moz-border-radius-topleft: 10px; + -moz-border-radius-bottomleft: 10px; + -moz-border-radius-bottomright: 10px; + border-top-left-radius: 10px; + border-bottom-left-radius: 10px; + border-bottom-right-radius: 10px; +} +div#everything { + background-color: #ffffff; + -moz-border-radius: 10px; + border-radius: 10px; +} +body { + background-color: -moz-Dialog; +} +a.plus { + text-decoration: none; + font-family: monospace; + font-weight: bold; + font-size: 2.0em; + padding-right: 2px; + color: #000000; +} +span.inlineprompt { + font: message-box; +} +div.inlineprompt { + border: 1px solid #b0b0b0; + background-color: #d8d8c8; + -moz-border-radius-topleft: 7px; + -moz-border-radius-topright: 7px; + -moz-border-radius-bottomleft: 7px; + -moz-border-radius-bottomright: 7px; + border-top-left-radius: 7px; + border-top-right-radius: 7px; + border-bottom-left-radius: 7px; + border-bottom-right-radius: 7px; + padding: 10px; +} diff --git a/browser/gopher/content/chrome/icn.png b/browser/gopher/content/chrome/icn.png new file mode 100644 index 0000000000000000000000000000000000000000..03d5e7149033773d7676f6fc8e9fbe38eba6bb71 GIT binary patch literal 330 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz4!3-n|x$R~FDVB6cUq=RpYd5a=M;HP5k|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5Xt<7Z_F@r=Kud49UW)R z{NKHMH&CX$ygV)K3{WcK%!dg;K37SQUoemh0SueY=$r?N&hd0{45_%4^x#QK3v-zt z2Lp!!+X4k<9s@%s7Dgrx*9ojzTmlX&ngX^mFt(_12(of0lsK}fEyx9Ol}<1gF-fbd zJ1{KdFfw3f3=mLg2w;_rh>UD(V`34QrEo;8f#Hxq3Ii9A7v>0LYjFrTM6d$QU9I52 zkSNN+p|GY2Xiz9n;|7?bB!@m_jt5UzI1Cv6>#~Ub?BDtb=uQStS3j3^P6t<7Z_F^Wyu5t(?%k_a zt(y7&|CuxYLqkJ5Iy!(#($db{y?Ym^=0bbXMSg6( zVi5?N%D~8CE}Uf^A)wH(VHHsO8lavd4KnTm2M#j}Brx1r#>RbN)y@>4pBOw{{an^L HB{Ts5b*q4j literal 0 HcmV?d00001 diff --git a/browser/gopher/content/chrome/icn1.png b/browser/gopher/content/chrome/icn1.png new file mode 100644 index 0000000000000000000000000000000000000000..8bef0842dfeab7e4fddea6cf24192aa207d811e5 GIT binary patch literal 1248 zcmV<61Rwi}P)`ei2bUNdJEzmXe}5q^_|FJ26=)h83(MaRA3o?_d~=`cf%t*d{rm5KkbZsoGe7{b zu(7f60>jNwSV%~mot>TO_KVL97oUD%c=hEs0}C@V6Hp@u$N-4j7=f4t%w=a~VtDiF zuf~}djEPKqT#{dZF+I2=WVI9^fLOkN{|<@(&cFZuF@5>@hvD?&&kR>z{$gNfV_{$c zdkyF!VAA>vHSiA*{{uM^$ol@BgC<{AQoVNGqAFYK~jRBfsdb!fsqLk4?rn~Kff6me*FTe0|n)O z21aNsef{y9;nPn>22mcC|J8ny6oq#{|tYCe2`^dfBt27`}ybp&%YVIN%FBi{QZaN7eD~P4Fq}X{nuX%f0)^U z=KN>)@EhVXkYWG81_BNG^AAk_`vWqNk>UHVe+(airoR92?}h+3Yn!r^;&XriVgbf1 zP&>%hzYHI~{$OC`;AHsu_dmnCpAduo0ofq>FVHX$`wuW6{{wAe0y^=_ufGhRzWx6H z>g~^O&t5Y=taN4k1rR{sNC74rplyGEhW=w<1S=m<*Bt06`FF|9`K>q*lVg>!QmjV2$PEc5`|% z)vsCf45Jj#G=ry<}MKwtxZ0i*ES&)*D;z;G00`_CZ92}%}BKm(Y- z+3i0pF+z(@P)=b25}$#Y=-WGXhF9A$H z=XZv;@4hp9BC;?AB{>N(f&ZM$>_7hT{(cD(0|+2SYS$?M0R{k;bUSf?#)AX^0000< KMNUMnLSTY9!b!IP literal 0 HcmV?d00001 diff --git a/browser/gopher/content/chrome/icn2.png b/browser/gopher/content/chrome/icn2.png new file mode 100644 index 0000000000000000000000000000000000000000..bcd2c66d202f58a4f3de596303f20538333a3e5c GIT binary patch literal 468 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz4!3-n|x$R~FDVB6cUq=RpYd5a=M;HP5k|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5X>;rs4T>t<7Z_F@r_wL;t9UVZi znKNg;d-rbU|NnRI-YqXLKXc~4i;GKWXy}}%WQgJIuKrpd|*-wyzfkT09fdVtn24g1{MkWr| z3EWy-0uC#h0=6eT}<7bYs8i{8}J1{u1{FIQ0nE7)? ztD|3npdcfM!UhFlb9-rKb$xYaV*v(MkRFW_r_LNWcFROP(Dd*vw(2`?~zys#|DNbtIqlD(G8+{90Cpn$2S)i9|jrmP}xr`Y=(jZgCdJ% z1WRHQ17pjRayc=z6(Au_qm3UNK&mXKuteNY07>ecILH;sDd3>-kaIJKLW9JF#~e&9 cE(}aO3>FDoQ{o?cf})AR)78&qol`;+0Ce-EFaQ7m literal 0 HcmV?d00001 diff --git a/browser/gopher/content/chrome/icn3.png b/browser/gopher/content/chrome/icn3.png new file mode 100644 index 0000000000000000000000000000000000000000..947538bf93ad13ef0bf86053103bfa55ef65069d GIT binary patch literal 560 zcmV-00?+-4P)@urUyy0pgiNsAT{MAVLZRfp`@Vg97F*5Qh>n5FmgE z8JGsd@1O?$hZ-)3PY*x<;WJDLh<76y_8)3^8a@L70tlahw$vk-E|KpcuIk^uq;S44EcTolC0`U@u2f$B;ZY%T-{AZ!MPLSq!H8ClAa zh2=Mr*E_I95I_K-dszwURV6S_P3^Iupdeh5RZs6dlG-#_upk3~0K%3`5E1b5<=M0} zM5NA~IrIO2HMK`*$p|Ha00Ia-M<9|(Xy{pBKL3CB?p?67l9JMYFaTPD7V9X<2q1uP zCzGE)AN_{{7Z;cR9UUG2;UFjH7+NwihM5BpKrq8xpb`*8^XBb`=>-`Cv-8ZEGY~Kj3PjqxBiyzZXD?Ur^ew00t<7Z_F_B%$fh?<>fPH z{x>#G3k?nJ=;#2-&;0-2#l;1v!2QSsF(99(B*-rq$b|t0q5J2~0mYwtx;TbZ+)8@z zEUkq(EsukNLxF990<*A4k&zP%BNKbP0l+XkK`Us9t literal 0 HcmV?d00001 diff --git a/browser/gopher/content/chrome/icn4.png b/browser/gopher/content/chrome/icn4.png new file mode 100644 index 0000000000000000000000000000000000000000..5b0ebe6e90bd946cfd28231a925bc632c8f5934d GIT binary patch literal 406 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz4!3-n|x$R~FDVB6cUq=RpYd5a=M;HP5k|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5X6a#!hT>t<7Z_F?=E$z(Ang7q6 z`9Jgj|BjB1-Me=K<;%;pMb(oJY5_^DsCk`c$Cz_ z?5D@Uz@fmlK!KTOgOL*pBNK<~1Xe9B0f!Y$0b3auSwvIPnmC+XfZ|FgSXcxc*}@j& z0)@p`Rx)=QHO@J3@F=T*gMy=2+JriVg9q4H92^@Mn7Esc%sBAs=FOXpZA>fzE&?iS ziU-UXfh=pMo<>Fu4grURZiO}@#~3yd77m3Oj}Im#OlM>T+VQSp#_EWMCZGkuoTABW z+(6xj-k%9L4H9Y*VA(B_Bp00i_>zopr03e-!`~Uy| literal 0 HcmV?d00001 diff --git a/browser/gopher/content/chrome/icn5.png b/browser/gopher/content/chrome/icn5.png new file mode 100644 index 0000000000000000000000000000000000000000..5b0ebe6e90bd946cfd28231a925bc632c8f5934d GIT binary patch literal 406 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz4!3-n|x$R~FDVB6cUq=RpYd5a=M;HP5k|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5X6a#!hT>t<7Z_F?=E$z(Ang7q6 z`9Jgj|BjB1-Me=K<;%;pMb(oJY5_^DsCk`c$Cz_ z?5D@Uz@fmlK!KTOgOL*pBNK<~1Xe9B0f!Y$0b3auSwvIPnmC+XfZ|FgSXcxc*}@j& z0)@p`Rx)=QHO@J3@F=T*gMy=2+JriVg9q4H92^@Mn7Esc%sBAs=FOXpZA>fzE&?iS ziU-UXfh=pMo<>Fu4grURZiO}@#~3yd77m3Oj}Im#OlM>T+VQSp#_EWMCZGkuoTABW z+(6xj-k%9L4H9Y*VA(B_Bp00i_>zopr03e-!`~Uy| literal 0 HcmV?d00001 diff --git a/browser/gopher/content/chrome/icn6.png b/browser/gopher/content/chrome/icn6.png new file mode 100644 index 0000000000000000000000000000000000000000..5b0ebe6e90bd946cfd28231a925bc632c8f5934d GIT binary patch literal 406 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz4!3-n|x$R~FDVB6cUq=RpYd5a=M;HP5k|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5X6a#!hT>t<7Z_F?=E$z(Ang7q6 z`9Jgj|BjB1-Me=K<;%;pMb(oJY5_^DsCk`c$Cz_ z?5D@Uz@fmlK!KTOgOL*pBNK<~1Xe9B0f!Y$0b3auSwvIPnmC+XfZ|FgSXcxc*}@j& z0)@p`Rx)=QHO@J3@F=T*gMy=2+JriVg9q4H92^@Mn7Esc%sBAs=FOXpZA>fzE&?iS ziU-UXfh=pMo<>Fu4grURZiO}@#~3yd77m3Oj}Im#OlM>T+VQSp#_EWMCZGkuoTABW z+(6xj-k%9L4H9Y*VA(B_Bp00i_>zopr03e-!`~Uy| literal 0 HcmV?d00001 diff --git a/browser/gopher/content/chrome/icn7.png b/browser/gopher/content/chrome/icn7.png new file mode 100644 index 0000000000000000000000000000000000000000..bcd2c66d202f58a4f3de596303f20538333a3e5c GIT binary patch literal 468 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz4!3-n|x$R~FDVB6cUq=RpYd5a=M;HP5k|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5X>;rs4T>t<7Z_F@r_wL;t9UVZi znKNg;d-rbU|NnRI-YqXLKXc~4i;GKWXy}}%WQgJIuKrpd|*-wyzfkT09fdVtn24g1{MkWr| z3EWy-0uC#h0=6eT}<7bYs8i{8}J1{u1{FIQ0nE7)? ztD|3npdcfM!UhFlb9-rKb$xYaV*v(MkRFW_r_LNWcFROP(Dd*vw(2`?~zys#|DNbtIqlD(G8+{90Cpn$2S)i9|jrmP}xr`Y=(jZgCdJ% z1WRHQ17pjRayc=z6(Au_qm3UNK&mXKuteNY07>ecILH;sDd3>-kaIJKLW9JF#~e&9 cE(}aO3>FDoQ{o?cf})AR)78&qol`;+0Ce-EFaQ7m literal 0 HcmV?d00001 diff --git a/browser/gopher/content/chrome/icn8.png b/browser/gopher/content/chrome/icn8.png new file mode 100644 index 0000000000000000000000000000000000000000..629cd3eb22265c8e017bdd86090504c20f83eb83 GIT binary patch literal 1117 zcmV-j1fu(iP)%ptx{4vs;sO`3VHyC@Apb zHSN`_uhQ-9C)-Y+ep&kJ)y&iAh5`f-+&OG)EMUVFftZJtg@J>C2`iQn<7F)^HZ>I$ zeuhUU zG#G+@v*HXAfB<5_Cit59Kf_GnUktCs{xdL${bXR^1Y)3p{~3NW{AOkY(u_C_1PCCk z1~Pp8z`%NVF@wC=F9yc1Ul>>!elrjY00IcBfsFtDGO&Gq3w0T303d)^KxvSH;lIMa ze+;a@fev8@ihu$i6kh+)Tm}+j{fj@H0t65XC_&51^Ro&Ha!Oyn{*6IjlLs7=puh)( z7cu}DCM_Vyz{(1Y^ZyLcn4b9nIV}PN5Tk;^^#8MFc`$Hsu`;Y$b&DY=Pz4y(jKE~W z0(2p!Yk&@5`1R{6LqWmL-(S9bJN@(L|I&Bwc;E>fAb?mvSq+q+L71JLnPJM5vkb3a zf5YpoU%&n_NJwz9y0}P~E?DrW?cKX~37{+qk^=}Jc%-nfFfnLoh%r=F+A#bErbUd1 z0;iO}K+C=}2ncX8aB#3NeEj&8b=9gj^1i-2^7Zv+o|>4L{00ahxSv1~^6VKCkOt*t zK@7~o0>T^&n>IaU`0#;);m;odhPQ9I7`VBarCnTj+nzjmVtVGx8CHM*0=e)3D8q}0 z@UT97_>JM~*MC^O33H*AmORjvKY)h*W_bSmBg2m$KUrVD{$wgBDA@h%*|REu0Ac|Z zMWE6nHdfno+O&(Tz}RB|h3ntH|A2;nVc_KCWcdF5I|j|g#l`UD%MXTk?>;m9{P~ad z{rmT(+}zv?00M{wRIY)FqU+aRcLT%GbjlPrR#{mdpzY5YE?v3^j4XME2M_LJ&>9-5 z3=bc^XIQf28_@NCftZ=~)2B}g00G3zz_8`t*RTFB-oO8FRZNUqJ2+TPLQamI`SIiH z3`Ry844*!|U@$h;!k|BVc*bCAs?H!K#R^Q5atvx}vJ5shCJX=p#0&|cEx>>aeZj=^ z`|7=WAGFofge3$7M44Gx`GB!0#DI-vXBT8(V&VeExF9fMc!9q8#h{}j$^Z~RXvM}% zRxztit<7Z_F?=E$z(Ang7q6 z`9Jgj|BjB1-Me=K<;%;pMb(oJY5_^DsCk`c$Cz_ z?5D@Uz@fmlK!KTOgOL*pBNK<~1Xe9B0f!Y$0b3auSwvIPnmC+XfZ|FgSXcxc*}@j& z0)@p`Rx)=QHO@J3@F=T*gMy=2+JriVg9q4H92^@Mn7Esc%sBAs=FOXpZA>fzE&?iS ziU-UXfh=pMo<>Fu4grURZiO}@#~3yd77m3Oj}Im#OlM>T+VQSp#_EWMCZGkuoTABW z+(6xj-k%9L4H9Y*VA(B_Bp00i_>zopr03e-!`~Uy| literal 0 HcmV?d00001 diff --git a/browser/gopher/content/chrome/icnI.png b/browser/gopher/content/chrome/icnI.png new file mode 100644 index 0000000000000000000000000000000000000000..dc1e0c4bc7c7de51098b5f77962126e5d66e5bd9 GIT binary patch literal 408 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz4!3-n|x$R~FDVB6cUq=RpYd5a=M;HP5k|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5X%mREuT>t<7Z_F^0f#L4|v@^yt z(`Nqvf9A{?hTRNj&ivoKdv`}ihw=ZJ#>Q#o<>f#f#%Vxs2B<|#;bAP0FH{ob7YyX0 z0)|KX_X`1KPkFjHhE&{25)esgVUBa;VBk<-TcE(qv%$!Tg^`KFbpo>%mw>~Hrhu&s zj4f&$f~*`0Eeht=-0UY}7UTkj1X9uy1sNa@mMfj$Vd4N8^i3@WXnMdOzRes84I8+CI>La$hqO2Z9C%I?vM@FQ^|3K{ujHuj T(U&#>`ijBR)z4*}Q$iB}*`J4{ literal 0 HcmV?d00001 diff --git a/browser/gopher/content/chrome/icnT.png b/browser/gopher/content/chrome/icnT.png new file mode 100644 index 0000000000000000000000000000000000000000..629cd3eb22265c8e017bdd86090504c20f83eb83 GIT binary patch literal 1117 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 T(U&#>`ijBR)z4*}Q$iB}*`J4{ literal 0 HcmV?d00001 diff --git a/browser/gopher/content/chrome/icnh.png b/browser/gopher/content/chrome/icnh.png new file mode 100644 index 0000000000000000000000000000000000000000..0ca7da3ae999856bcbbf3e56892c65f7d7136e56 GIT binary patch literal 570 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz4!3-n|x$R~FDVB6cUq=RpYd5a=M;HP5k|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5X(gJ)!T>t<7Z_F?g$SW@|-@SYH z-Me>Z&YY>Fq?DGHwrbTXZ*T9J|Noyk^S`5`BQ!KLJUm=NLc-nMor8lTJw3gkpg=%C zfQN_2-{0TG#U(B6jHINb1cUpcMT-m!42+G9Ei5c_7+Qf==(D)o1=^uh666;Qx6x%p4TEXZYGWD!b9ew3Q@{K12S2`rY4 zo`Hf24Gv93Yvwq`oZ<0_sj1mhv&X>^XvmC{=NJ#Y(OILTqvPNVv`XiM*11DETp`*g zj-ENhAi~0-FvHq0>*kCZ4LS=H92gw$YM$W_Iez5Gp#$7PK*^T=8#898He@-bF|i1Q zs2VeOGiXn4m?0oOd&?pv2L{ETbNf4I&Ta1XbOgCzfmY;%+xFhuc#%$@QfB_Wla8))b%1?D3k85oZ=$hZqESivEX!0;eb@a#JU S1~XtNGkCiCxvX_UEjJV_h0*C=*AP5^X%=}Lb0I7niWx$330*Hx$L|}ZD zfg$aG8crVp1Q5vvf;nFWYhA%>53@l&2FlhgM!w_QO z3pbPjYUr8&Y49)w2q3I3T)ccELqN+OhOHk28U9F1Ge{XKGyIj6X4vq7535TnDk|VE z1qdJv7jD?GpCNbU0|r4UQHKA5oD6@t*cljp{bFEv_nv|A-8+U^v(7S{1!81ymZ1|A z^I$eW0HGN8{{4G~yseKJzL^>^aPYA)d=(dA_{7e}@aw@#hSyi_Gcd3*F>L*FiQz-| ze+DK|9)=9A%M8Lof(&OX5M}@b5Q>4j51wLp{Fwu&@jb)mZ%hmjZhX1GcGyHjW zm*M}v?+hXWtQaW-Ab?N|w6oG?VCcEPz`zO={top1kB}-xt<7Z_F^0f#L4|v@^yt z(`Nqvf9A{?hTRNj&ivoKdv`}ihw=ZJ#>Q#o<>f#f#%Vxs2B<|#;bAP0FH{ob7YyX0 z0)|KX_X`1KPkFjHhE&{25)esgVUBa;VBk<-TcE(qv%$!Tg^`KFbpo>%mw>~Hrhu&s zj4f&$f~*`0Eeht=-0UY}7UTkj1X9uy1sNa@mMfj$Vd4N8^i3@WXnMdOzRes84I8+CI>La$hqO2Z9C%I?vM@FQ^|3K{ujHuj T(U&#>`ijBR)z4*}Q$iB}*`J4{ literal 0 HcmV?d00001 diff --git a/browser/gopher/content/chrome/icns.png b/browser/gopher/content/chrome/icns.png new file mode 100644 index 0000000000000000000000000000000000000000..dff7c2123a115c50a95da5ee106f823a6c3bfec6 GIT binary patch literal 397 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz4!3-n|x$R~FDVB6cUq=RpYd5a=M;HP5k|nMY zCBgY=CFO}lsSJ)O`AMk?p1FzXsX?iUDV2pMQ*D5XR04cLT>t<7Z_F@r=KufY<>hH< zXMn=Hcke!P=6^>=2T*j?s#QP*|0c@10VQ}!g8YJkTo_;wx_|B*Q2e^5i(^Q|t)vIf z(ps3)@;Dec6xbFhF!LA~IIFgkgIfp zsfbD2+}wfTAnVSCj$USth9(9^7Eu;1LuO4g1qLagPJ^iqieYSQZXLcr8Nnw^+=d2C zPZ~kWLQnEI_4ouhHZU}0w!diQVqy_+5lG=wR#*2CP-uAImz0wDFok9HvuA7^3NsWe zUPL%#f%LUJQg##T@M>Ui5^R~t333{b0MLv>S{wonJSPfS81LL+U}R(P+'); +} + +// Toggle the disclosure icon, and insert the page image or iframe or +// form for [pgI], [0h] or 7. This uses the
scaffolding that chrome +// has already set up for us; we just fill it in. +function x(x, y, z) { + if (!openstates[z]) { + var h = window.innerHeight / 3; + openstates[z] = 1; + document.getElementById("pl"+z).innerHTML = "-"; + if (timestates[z]) + clearTimeout(timestates[z]); + try { + document.getElementById("pv"+z).style.opacity = 0.0; + opacstates[z] = 0.0; + timestates[z] = setTimeout("fade("+z+")", outtime); + } catch(e) { alert(e); } + if (y == "p" || y == "g" || y == "I") { + document.getElementById("pv"+z).innerHTML = +'' + } else if (y == "7") { + document.getElementById("pv"+z).innerHTML = +'
'+ +'
'+ +''+localization[0]+'

'+ +' ' + + '
'; + document.getElementById("src"+z).focus(); + } else { + document.getElementById("pv"+z).innerHTML = +''; + } + } else { + openstates[z] = 0; + if (timestates[z]) + clearTimeout(timestates[z]); + timestates[z] = null; + document.getElementById("pl"+z).innerHTML = "+"; + document.getElementById("pv"+z).innerHTML = ""; + } + return false; +} + +// Resize images (onLoad handler for images) +function s(i) { + var w = window.innerWidth - 100; + if (!i.width) return; + if (i.width > w) { + i.width = w; + i.height = w / (i.width / i.height); + } +} + +// Dynamically turn a form into a Gopher item type 7 query +function f(u, r) { + window.location=u+"%09"+encodeURI(document.getElementById("src"+r).value); + return false; +} + +function fade(z) { + opacstates[z] += 0.1; + document.getElementById("pv"+z).style.opacity = opacstates[z]; + if (opacstates[z] >= 1.0) { + timestates[z] = null; + } else { + timestates[z] = setTimeout("fade("+z+")", outtime); + } +} +// future expansion +function edaf(z) { + opacstates[z] -= 0.1; + document.getElementById("pv"+z).style.opacity = opacstates[z]; + if (opacstates[z] <= 0.0) { + timestates[z] = null; + } else { + timestates[z] = setTimeout("edaf("+z+")", outtime); + } +} diff --git a/browser/gopher/content/chrome/root.png b/browser/gopher/content/chrome/root.png new file mode 100644 index 0000000000000000000000000000000000000000..5c5a24262cd554ba2aeb7e538ec92eec083481b3 GIT binary patch literal 489 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3Ea{HEjtmUfZd~z?Faq)=OI#yL zg7ec#$`gxH85~pclTsBta}(23gHjVyDhp4h+AuIMR(rZQhE&{2`t$$4J@e9ri4!NX zdss4_z2&k-u7M%xK=Q{rg@62$j<+^4q$COo>}Ps(_{Wt+$qfvLQa3UR%x91EYia$z zaE3}ZBNNB;qrVrn2_`G@{AYcnZ}Guhp^o{8f5Q)^6FNZUX&adZ?z2Do=@Hm?-l@pI z-hm-;^A0(!mk!L_55<^S1cYZT_!YC@sM4n7N9nfx+p!;imkFPaUUiXZXmT z^;1HjVS=uiLsv9oO7}z|aXa=ujF0>y48lNm-%Mg(kziZZk#N%QhD?D(d(;|`p*}*Z zm+sIx_K;zc4jYHUj3taF@6{$G8O~x}LpUHx3vIVCg!07X%x AVE_OC literal 0 HcmV?d00001 diff --git a/browser/gopher/content/chrome/up.png b/browser/gopher/content/chrome/up.png new file mode 100644 index 0000000000000000000000000000000000000000..d465b5c1d8205bd30f9160ebd728307033551b14 GIT binary patch literal 438 zcmeAS@N?(olHy`uVBq!ia0vp^8bB<^!3HGb?#A2&QY`6?zK#qG*KS<#k1zuAB}-f* zN`mv#O3D+9QW+dm@{>{(JaZG%Q-e|yQz{EjrrIztFnV~pIEGZ*O8WEvzy09^HU`Ec zM+{CdIxsA>m@skTM|%!op~dP9919%fn-~~d9yugbrLZJsoH)6#o0o-wL*dxLd7cbR z9N8kw&i(Qo@=Y%q%M=_K9(pzZbkJd6$}YmdBH$+C?EF?yp!r3=gARYl=fVXt90CqL z7Eb(PTmLZ2b^%QlYRXv1&de+YWFKi!|02QWtii-0V8c?_a<8FX$$`O8kYg_+ziR^n zQ@cXr1?dX`EF21IN>2F>&VmXJ5(~xbRSq>W3xRYq9ogluN9dF}Lz1!1D?Nsfni|qe z{&DOD*|^{umkhHb>k7tZ*6qrx7pt=Y{d8ZB1xUVkXkd`~!Utn2nN1E5ojeKXt&9up zK+o`2u`{t;SWpgR8YZqZWD^B?JEwNi|B@3kT)uB+1giSp&B(;VaIc?Xp1iHTF)-j6 NJYD@<);T3K0RW$>hs6K@ literal 0 HcmV?d00001 diff --git a/browser/gopher/content/infobabe.html b/browser/gopher/content/infobabe.html new file mode 100644 index 0000000000..169b1921f0 --- /dev/null +++ b/browser/gopher/content/infobabe.html @@ -0,0 +1,356 @@ + + + + + + +About OverbiteFF + + + + + +
+
+ +
+
+ + +| + +
+
+ +
+
+

OverbiteFF

+
+ +
+
Version +3.1-Mozilla +() +
+
+
+ +
+
+ +
+ +Cameron Kaiser +
+ +
+ +
+Cato Auestad, +Shaine Mata, +David Meyer, +Máté Nagy, +Roman Pavlov, +Jacob Dahl Pind, +Jeroen Schot, +Dennis Schulmeister, +B.J. Stobiecki, +Benoit Triquet, +Stegozor +
+ +
+ +
+Cato Auestad, +Sridhar Ayengar, +Michael Casadevall, +Philip Chee, +John Goerzen, +Brian Koontz, +Jacob Head, +David Meyer, +Avery Morrow, +José Moya, +Máté Nagy, +Roman Pavlov, +Jacob Dahl Pind, +Rob Sayers, +Jeroen Schot, +Dennis Schulmeister, +B.J. Stobiecki, +Benoit Triquet, +Peter Tynan, +Stegozor +
+ +
+Copyright © 2008- Contributors to the +Overbite Project. + +
+ +
+Overbite Mascot, Copyright © 2008- Cameron Kaiser. + + +
+ +
+ +
+ + +
+Mozilla Public License +| +GNU Public License +v2 +| +GNU Lesser +Public License v2.1 +
+ + + diff --git a/browser/gopher/content/mascot.png b/browser/gopher/content/mascot.png new file mode 100644 index 0000000000000000000000000000000000000000..dd70e21ab54ed5d3841b4f03406671343dba4ccb GIT binary patch literal 76040 zcmeGE_dnL}|38kO!^w#gr+pgXwB@uyS>?1>Wu=VNDTHjY*Lm6@BYW>c#+j_FPGm(! znb{GFoTQA1&%MX%{rnfcKYf32>2kW{xF5&;xXtVJdOM#O-PEC@;iLh9Ky-S#nkFC+ zI2rgEg+qYf{Dg760sf(IP`jZ90!__K7@A)KK65S>^K;c6Q538c$AW-?kl5>`YSJ{?U81OqAU?b{ zZME^gPsv~qSk4mnG#vO8jR3)m#v#ru3BV^i5Ek^5%^djSgm5$z1aWL2asIay2e4Er zZ0f&-2S9ibrv&leqA(3g5XG1yLH@r-T>Ae%0`dQ&7lrwEtZaF-YahqPDqgwgB=!`#r& zFfla+i5J1W`hC2=(G$a<@$Anbd5K`pY?K!f(E~hYX2yTC;3~=M$Je3E>gsB2Wjwo7 zH(g3>waixC>t9aDP!XMYoEx(~e2?CflZ(Si$fa|9R&{BAc4hyXTJZVRn2Ofm5G z@p|*)h_4BdO!! z;;@&K+r2mFiR{@01@tZ+;FI*;-roD2!5nle1jzpjK{oKkj-bP}L1tVkjrnF|Ow2i8 z&~wf1*gfazT2F6pjn){fiJqR*!S<|&brP>?ZAAqr&Ol%P&!0c<2L?d1Brm#(3!-ga zU-fbQNYMxO_Ar;sr<6bO{|iz?SkU1Ptf_2%ex7fhRs6P~kkH=Vo|=wER?#ZDrltnC z<>)QT&R|75F{rAls*!TCOvseE0(Sn7GOI%bGE>(Q%)-C+PRWusi@Ql{H7VvF`lC9PLBt=C!zSYzXqXU|M@jlZ*TY_-X8$;$oY}uKl8@Gg|uW zEdPLj73hxv@us}|{II`&d^X3>IH}R$VZ;prfdCc}*&slvb{0FtF&Gy&w?vhruiw5M zf9Z{{G=1^N(Q$KgGa*{G1`MR4rhi%HXlZFlN-+>eX z$9k#zoj`C&NlyW6;C7e@;v?0NKXSyS7iDFUVvVkIm+#-dU!({`H4+oe4K~M1 zV;LbQ2d{_;1z!v_{ufw(E(6a7f@vG@P~g;4wbmymhwfrxVz{1|+*~emY48wZ(Ll5N z68`-yGqVd9E&xtDJ3Bi_tY~UtGrvVmLvu4rnvj{9nUus}j)Bl>IypJvJ|RTm7=H8# zK^y!ONaP0}#whVfcsMm3UnQ7;ea2T24*3SwfcZb-8-pb3?MitRN`HA5m!2wr82S51 zTsKZF&6~&e*WzBR_ehXbq`C8}7ilIn^1?}tx1B=@yd;aBmfv>1A(n1(Q&+LznaLMS z!$7__r!9QkK0zkZ<3(>jl@;jV2NG6-jO+GjYGX+4UFJz(yYt+w+ioHqemfOca2%lQ zFKtgU?ZBNVu>D1d@Vc4kdymLOr!hUr^R{%JFn3Nj!O~pIdPjRRC7y{z-AKQq zBe9Rg)}_XHY55!e$4u{A44k98VI2j-@-nOuyW~ZtbF)Rq)7`Z@AO>I|-51C9%Oa!8Uh_JA*h)7bO za1@9S6y)FtRfB7euZ1u0d74vb6;*(qzCh*_NvR0oNj3*xr(6#v3f5>@>`2!aWqaJr zmEB)Yh3l;6p*YG`JI;qFeob+*K&$XK8>eLYJh|23RlgS9b5)n_GCy@sG5O*)qKKq+ zy`|4#Tiy8f`xpFU-ai6fhb_fvfU#ur&B&jC8J^1USD_>O1?E*Zsv93J+>h%R6a#kU z0+E47twdZeiqiVN3~J&a>6utW+c7zKP>KwI#3ZVjA@s@o^ZnMD-K&32do}z^M%P!v z_>Vwa<6+%z%hD28Ma$ozim8!Ka~b~DnI@08`)TMy>aCFsewYD(qudm+t+$7(3{nLccf;57~pPR}jUEr@MbFx|=s`RkH0dQ~3P>AUA z=(23dQ}tN)+?Vo;s{;RwTmy~J8VBn(cRl0ZLV*aCHWV3-I%=#e(U0S4xJ#z%alCP|p^!Y%r8}@fU^_ zYs-R@zP3rb4b@}$(eD%zKgo6F?5j-sd}Z?I<~OetY#|t!>jiT~gZF>uttrquyMB_} zS2+y1@B2LMAmmElnCwHMtCg7jNcIhS>uKQb6Bzg5>9{ZZjtD_DZ27H#8(_ze4C&R> zhX#ecbp)Pp9_yqeqW=BYvwQLQ z{HG$jEPAe~%4;-Y2Wr@PSKnDBQ*(r{4B@z)L8Cg{Y*k{{VunqHz4tofgL|Otyw``F z^Ke9!(PDD<)iUx)nu(0#s>066*{bEV&xifs0ufn;9%8NdCGaB)=e+{Mx5ANFnsJ!s zeoqj;oTc+^2Novp4FaDnf=RfXqJ{7Iv-=tLb4@>A{`uH9DM$Bc=%EI@-*dNJqzl^Q zI%K?iCU?VndW8<$@G>EXA|2Zj->_q3+4wYKV^HE6nnDIC+ z*zw^65i^u|$8qV<$C|h9TyWYlOp&(6!=xz^soU4&$`f8KFv>!Uiprh&xW)Z4TcrG! zKKR~lp-qAHTM`bY(Ea+$2z-;2l;0xjMyu>l^!9wgS z+L@4u>jHs+fsk3C8KP{uK|@QsV&wqz2tXPq?uGlFiE#SwE`y0auiclfT{@-R{sayR z$6kRN2%Vlmn#jox)P&xt#0$!N(P^2PP%ZpUzZ`D`<%}IIH8uDEt7FQ}3RF!8A5buL zRBTC*V3)=k=o`kH4sD+^k0tI=e5=tc5t$LrPq&7P&g}F&ZX*tL`);vRMrR`g3(rNe zo$F7RT)A~@6An8?Y2J;r)_SDQDT=e(YA$^pp}!?+(0#@7=c>j^C;6^>jeJ+WH?m?? zp}O(LC%lCM{@EBa4!*NL(d{4$mo#$85e7Y;Yf59fgtYwSIvBFl>}qg&dbI;%@KbWA zo90oejI4EQA)7iM`&S266-1B9sF~TM&r|Q6(znl%>d3qLm1*Bw>BD{V8wzJM{;LBe z{rA^zn3=HxHM;Z#kgSB=xBxM`w6rurr9gs@5BKn4UvDogI~VH9M1ZA6MZt^&h);l* zBqAlnAXe4h(UH>j&~X_^xi@d##M-}l^$L5LXt%w!6%i|qza#zY*RQ;5A)KbG*|HA! zg)7R+%0n4|3#|NcsAUJ7}qZA8=8vmmF)~oCfCgV~*k1SJT zBtG?Plu>`%ZYP+-GuRFa(396t$-O^(hkP!=Ruv-l15zn|UT;0Gtl9c3M^`T1#=LfA zvo%qYI(+k_;C)$sv6x29G9QRyQo8RQ$|*|pPEDgXJ+;QsLC6N!f*e#x+3Hf@@R-II zNa0?wQHMNsrut@PFd>3qK*5ss(^UloG?t2L(#M)5ihD9jN-liPP-i26-vd{=ovbg$ z2xs5DHP@s&%KpYOBWlGWGpaon`f?1l99>n$Z&4YqnV@w zCVYr&Q!z5KWRs!^fz`6zqwOzx!H>aifrhbom}7zvvvgeQX{w>^gHVSTb#jyfe{PP1 z^i30a?l@|})!<#LI%%YgG_RcJCht4Rt6?n5>Y0yf`mcoE3TG4IX7q5hz8g{DZ=JnK z(O%nc(76Q(S8oGsWkxZ@*w zUFVizDW8IpG8YmO91^9Zuoq6=) zVsAXVMr&%afgT5`*-7GV3v%XBPZiIM@FO=jHgCin)f@Vvs&b zvHSh=>(ELDgzGlx=BMr1*L&9wplunFl9Il@zB)-fy;aL+e@{p}9Faid@?&D+7LEhF zeG_7UJvEJ!gOGgriF~(>jPOUsK%~3mhXy=s+XBiuoGmLNAYd!UXhQpcTLZde)sLS) z(>P6of&!9<;(!*0@C7>y^impLoYE1M6&2NY-!R=!ChiM~iu&)&E3Vz-*uw!&OlAzx zUGnZvya2Rpq*9(459qo#&W2`N9g-VF;%A!4+4}KgfoKCAtCYIej(>RyG-zddsd%@h z=4RD^pKG9KA|pyA^b{5P7(v{mIrn#Ep9A$PMyIOI&2}1Ny5phVkTwqb2I*MhTi>~yn*7?s+u*EsGe zWD^===nHda4Y;BMW=;|PK>ksU)N6iK&<~CKGp(s=i96=b9nJ|~G38^w-F?uBI{r2DLC(U#pndrOljj)6$ZESZGQl&&8jnWSbZiKINobK%Q zvHQbGBeSJg1jP6V#q(Y`S!2c$p3%i@{vxyN{RJ=RR$6#|W94B4fu-#O8?8k~NTX^G ze)RD1FGF+HsC|{EGCygqY+zJhVRtE5b!(P?d^fKZ6-G7~xlde_-4#GnXt8F{As|nT zc2juX8PtiDZ{9DgZhT4YMn!LnP@r|zuE^W(-4+wF9X1i4stQ#QkxyI66A-R1pL4)- zrMEs=A%9sGMBhKibqz!p}pd7_N3x^W3Kxbv@oh3A7H2DFumq%X{6ZEl2K% z#rxP*Hk#ZLy~UfomirH~kET8X+Dk`AQR$$v^76k_b++}5jWrb&c*6>4?&V#A4US;{ z=n>8JzyE5Prie?IF6HFp00=M@hB1*_@#p5a0PZDKg$zG`czXI|SC`Fd-_vBzKwR(H z!4InjA1LV=Nw3raQHF!5PyeNJnuoL9oqjsdHg`9E`Y*8)EN# zOEq(k^0o+;sS{;pZG8bn*4+8Z{Sjzvm4T{Q254+)*N|db$Z8<9K4)P_vDK}b*Fa*t z5`Nw5^4^Xh5F_pN-bCga8rG1g?4aC{n?adwGp!4*zx_yL%;@ z56Yg?*gd^D5_5$4hD~amLZy0V+z;hTng7NSt>#RJlaWZt(65~OtTK9(X(&;i=b*q? z!#kRDRu8WGBv+mmNL~_fuBp$~{b`(1#31_GbuPb|yZ;p?zT&0{jTRkxj7?o%Rgl*h zp`|5IxAnb4#D!Z&^YC^5vB5tArU%^6*a-e4z7{TqyP~G4xi<64mQ)X#`3B8k-~AMX zo|XZ{i?Fk2o}GmjNdj>d=ZBba5cJ_3`t*s}e5^g_kpAN%Xbv?-9Kc%%F1Rh|CIVLo z%bLaaa<4nm68QwOCaDzp&gQd#&m=_d2~axWea#CK>L zkC&HMv)e+>WmnE*8HbTPy;R}Bp`o53c3a!k@87?_@!pu4o`#AC;Lz!Xh3;-{^xJ!{ zUca{GaUBM#xM2{05{8F|lb$mh(GsJn4rErgs_tU`$yZcbcQj8i!XN~w8jU>l_1^<14Dli;<0vE~ zgye<%;lk}7#yzvdTdQ0Ph7kP@L=oLa+^QO$w06=~Zb+#w+uOnl3J&ijBJZlzEBaGd z&vU=_rz%#>DW9k;A2a#$T=N0^=i)h(X@4o^_k%L!OZncTJH~-Q6Fzj*3_bY3i*b-_ zjjPF@HZhuPcDdF3@U~j#ggpiNsq3>K*MteneN8c;$Rb+*@p7gtk)cc5T)GrEJu$-N zdxaYuFJ5D4pYDI4hbwXOCwk2_HM#D|o0)-&coqNTdYy2c70@@!-+<|DB5w^hdk1gmU=;Mk6ZmeV))Bh=JgZC6`Mm1iqw>o zkSw|?1r_+zYt@D@>Gz6UwiRq+aS&Y1g*)`}9=`2;r5d%1ZGWykx~}i!S5QSMI#JAs zeX6x2r|H3r?|9v8gQ6($_yL}Y(5fgd^6ls2>48d9v0h;2i+o3^D|akd7Avf(Z!7d( zd|^g=6WNfuPpjT*-rdk-96 zP;*dp_;{^vU}M~Ju8HnW_eqf~T9bT%KjJMs7%5e*xy;+&)!}&Y&4577%f?Xic9$9- zei4y8tFGD zlt%Zzx=q%N-T0R~C~!dTm{W-Ecx`STS8KaU^9547f;yJ!yV@4XMEh^waLXA8pD(wR@QpI6- z!V*gJQ7Y2IO-Dc=k8mCSN|lo2*GBhi@%~5sk!*XD_l66XNS?XgMW38&7o#AoRVC>*%IhUF>c;l=HfennD4hYA zpCF^)^ZnL9tl-pR7ze&k#+H(!_Qv(=6yL31KcpiXN+T}+`mZ3?T8}-!%Mk&>0~0^X3gHlwVqVIh@of2t8s6#vMxv3Q_>odi>?P!q|s@29$ev zyv7@zKVRS7WP<$T>b2;L&O^Kb7Ot|cE~aos(R=;+faAn?sSdyZTHn2k7h{^y>r$Dm zudg?;us8CJ?%$vk>6_lnlEN92bu{qD!h+Mn*=_^9w~i1UCp%ovmtb=eBq> zUZQn+dJ2#~6IUngSd1WmT~MknaX|P)PQfSJ0Ks^$x7YO=P74?12+LCmxU{aPpuzZm z_ZOA354FcuII+?&!7KMoWst75&x*=_%q<3faU|&0$zog&;cEk zAz$v9hv~cF=1_7xhU1)rh8Qg~qR)a+{q=)yyHcLvp* z^oyWPd2erTT)vLA?KeQ8K=kYTm*`OidCGAS;U6b8TBtd=1(z@KkZfC&;vGDEJ$IH_ zx%2J@f;^FbQksEqa6zB;uTB@Db1mqcLHJm?dive`#klY_7-y{0jZXtwp$$?1&9u6& za>q zY&vZqcLF%nY%Uf~VT_V|tBV{bK`uAJyExz7GOs30U}YL0&{wdRND9-g2}lCDXONBF zO{Rr*r}z8!*8N4Uu!m>#Ly);9wd-m~L=Q-)+(}=BZ`_zA%4YK``G%5-ZKDT8Zu>pStJCvk={SttljGK6g=HgNwJ=09nG@mFtE`7;9sCK<`vvB z=*jJb+i$_M5A3&BRXOFfkd`XF^rj+i>BaZ%dvAu?T(5da4}z~cL|np{;C+qiA>o)0Q!9z1Zk_jAtJ@`J9J6hf;d|FVW% zx$A4b#>OV6oKEsv9~p{2@JHk;z5JmY0XLgpX^JU8-^bpzlQLo9mi|yezCKB>Ns z-{!8SH?)y-qaAJ*JQr&|+1Wis0+nVz0ZGxl>Di8#@WW4u8+kz_NfIhhy7Xv$1&H5l z=Jjsjt(@{#(iXH_%%|DeQe+K|^YGt`Ma3vvxLQWmmw`W)G{<3=-rW3XI?3yrFj7Pj zYWT@60X;27PEj;=mNyGSiB8e$n8D|pHbZZ!jh)y8EfMzE!v zeE|Te?NhkzmeOsu)y@fv+%jV|aJ;ZC*wT`eApDlOP*JdN-W~3x*hUKg@^jJv2KAWo za_t%Q3t%>@NQ1-|7Sq_~dw(1>fD3Q6PrVnA(SA2AcLU4w?s&jNW)fLpO3&!ezlJ9h z$0Obo1~TuYyUj(jT5ipiN>E`3zY_b9@nxcaZmmhH?3(}bg0D=of3pVgLsX0!D!QbD z^961Vf=J*{&=KY&T#A&rg5}6whPWs~y$gxA(3+pBe%z90HZh7M{{8zy@PLk|;mx0aB~ID4$0K{|vh=bI>On%#qp2oWV-~F5w2y~4LXQb+W)`v~ z$R4?~cqdyyZq$3=f+RtKUGM2CoT3L?)7Y2w-09w|=IYWH#CpKaNoTFIrtj=$U#u@Z z!dU;y4{%D-@#(;v4L+h8QScKZF~Ot8#0k$U#tqe%O>2I^|74gKYNrNrV%|SEvV}V7 zUIWOr`(^_>*-}SoV3G-Npn6_}F7Aq|oguBVjtpOEXMo}0K7%e!tZze2+w5 z8-Pw;+d$Ytgz+jh@>W`6U-LAe876D(?sJz{Zp*2w>t&K;zC9q_AAy~iA}Tjh*@{?^ zV#_Dylbx&V=7>TXG|F}?A}IIvQR(myLi%fB($-(c8a2c?vBPg{EXZ&qslMOHHX$=6 ziKrW3b2$AUujgZPBk2}bkMB$U zVXscrq?S#04K>)3>4}0-yb#)YY(O7UroUWuny+e^A!PCWFVnt^b`2n{Fwsxmc-YNq zed#uX*ZFm$c2Ho>b1`C5?bcAHh=A0p&{!n3u&wwdbi{R6|Ke>clml3n`Bl*H0LX5xzOcZe#|n>AalzDq_FPKwbZ+U z=%^pMVqQYpF)j;#&&iLQ&heA-Y4okw25L{Invk|1O|uSnN*;?|ImoY(-{20U`Z-~l zI*A$CAEvR8Fum-U`Xcj$Jm)X?Eya7s$8eY1mL*ba3Y>WqQ(pJz&hO85L-qb-#$tG~ zi9Q^R5uOvHRMR_Ns*+hJRkQK*d9vWKKaKw0_(buiZcG1L|72aLZtBMHLI+QZ$>%{A zRJ7$*R18EWl3R|ix-u=?oj&Oe`sowGKFuNfHX7jile&%I6f4jG*vmVyom~FNE-Q2A zAB^|DUT9A?yOt%4)E!`;R{8j3nXP+dq*{ERs+y{XqC=+md`Zkm`uVB?N#Hl<0C+j+ zqNTG?=XxMca_X~8^qI6kr(4J6*+Io6jv}hG4<>Iv^vBF>EyPRJt($swkO&*dz z0YLnzeJ|>(>H*7;m2-L8t;_9)>br^}=BHLk@^UAQHqT_%Uw0dsy*Q*Vjuv?BR?~ru zSsi(U>{hJ*$q#Hjz6T4}w26UfgsVMhdAAtT zZesWZz48GFuIvZ>DClc6b6MJEkxXCa)jLco2`?J^{uZ-WHbI6fW#P@IbQC|^4`m&qzh>(o9fNlGFNooUB8j0LMMCaLkoI-vpK82!oEMs03n2Pp z)*=BMzv*ZcHl_&v-{-{{JQz&-1+iW-eH`C+)e5I_OfGJma>WO*144H;UyucTDIl2T zu!S52>6X0K1}r}Nv~Icar<6rEJ0 z1!H%vnG@&{)SR_cHtdbzeOZI26XBoVJl&d2_PN#k_J|Qtb=0lcG@e_|B9zC+)P5_0 zEE_#FH!rg>aic?u7u$Fm$26n7$JXy`6ux3K zIKy^u&sqa8*&;V*PK0io4;t%(&D0>Ifdxj+{psu!dR)ZayiSX;fsfGp-3)j82^N28#z%!+-$w= z8(VEJ>Zy#{mRzdLU~L8C&Ed{tJu55G*&H0|E7f+8gn7TyY;NGSii0ap~U3SKGs7XKn?~(EYvq82fww(r!|8ILPO8GPN}!(^u=~r0kj@a`*GVO&d6Y5CE?{IpyU%$q{lG*uSVAri4!jqLtfsv_o5?J3bMkFatM843B~ zZ{W~Xh7|9=(w7(S?0s|g^F`ZMJFB3=UxUM}wrfU~TYqz(z-FU$m-iM0cue)3w|77o zaAV_IZX?@1%9iiF9o4rttozi+5`YUl2x&iV-evmd3jBIqFO_k&R9X5>fE+wv|KR}I zBkk^2k3YYh)`XeH*sQFqa1n5Go`n`qsCf%Wb~lQa9sm0U00af!JqGZS!NEZak#2k< zg;HZn3+iK!C4h=a&%Jy14$&k>^NXFhKqdAX0Gs$;4v#5)Cant+!_ojd=HjAN3GAu!LG28m?Sy6GZC51}$j=ySJ1liAz@$gd-Veof8ON zmd=E-kQ0_)@l&4_MXoT!s^Myg!X!#*dCzwhQ zJe0Pj0G*YJvSL z<+E}4MvOrX>j?h_@nKx0ETr;@43jBJw$6L!z_GelYp~gClhBy*^6fRhxNioon{RSQ z{G{E!skK$7nc$-Q-A6cTx;P<}R?hljx01yXDS-4M`r}vc0+C2dH!119yUdT&dK#xh zS=F=VB?W_OwrE6y?qoxbg2>0R9e&s=tzrIcyJjZ(sGg)Q@ij?MfP*`bN;Fn-665Gl zgsU^qSJWjoQ2mERC3Z}KY=A4Z?nu56O(}`w8N>&KHl6Ojz(>(Vn&Q9jBAsVE(;RR8HQ;Y}yvO}zYnaq7&#ON;#vX$mx&ZhFo z=anTA+d`O9D5G|2FP5D(*yM+)A<)u?3a0ug-g8jDgN0-zsQiFpKWaARx^OA~cR&gH zt7RC<<~<@70l7_U8F1eAJJr}Z9U;}#i-KyD4YzP=lpLN}KYFE-2#%Ik@E8k0DfI0w z@)GJ5Mf_FEHCLOa>aR5ynLF=2llxOxJ^xQg@GscLcH;zvwJBS(vs1c!`DS9xo`jea zgl5JqKlS_Y_a!9c~_D4UQy%u7=1s6 zcYq!Zx-{{?x#qA_{UT<&N-FxL^2U_cEGh!?*He7oDw-;g-0Z6HWZKg6^D3IcSwdyY zlb8)i$w3V4=F5A0Osn_u0T|IIU|{2(R= z%7PU)DxC@()`TpJi#57uz!J=v>7uCBZS=&7Z(lF*rmrkC>7M!_rOOpDWqDHg*MM&f zgb~er(W#>j*B2xIZ5-k7i^#GEvYhR3p7-H;oDAe%ra0GH(o|rAP0iOwM6WjMxqfUn zEjp0gZ*f<)nmWXb>}aS^*GS28A+?g`lK05DE8R((KMl}@=3NKpI-3w`wY=R-mh4vjs5{#lKcp+R?AL)M%{pL^49y0d@( z%cHITgwJ#v$sFhTZYyzylpyoa&&i}_+Oke=lZAop-iM3jx^;o%U1+lCN#4F=pT$5i zyyDjL^VTa%|HcBlA$Pev4m#$XUxii8VToCOr~8gC{_yfO|bgtA9s?tcoO`wAO-CgMcrc?;5OscBqKt1$i z0`6ir`2IbFYnyZ{MvT_U4{G48rKM$HFa${Bal%diI2`es=g*&`bC_Z&KtKawB@nB| zM>FS0Ln_sys|0bx@Cjdwqx|wM9P&Vvz~(W5Z+E9meG?Yo=lv2nG(u`$IGox(qn)~t zY7(AnDSou&T>9Lpekxp@=zoAfk0ny0EuD{4pJbarQY^QwH8Vv2T1>6gO;}afOsJg- zxOPeZg-KP?RZ@{Bzw*Z7EXO`Ud#eFM`!+^Xh#`e(t2I>0%gDUFA}u^oJJ6J9q#@<5 z78i2TAoFnP(25G~greMhy04H(yp^!Go$OukPqH%byV-mHU$y;DH47UTQqj0b-OSl7 z?hmUeQeQTkcY>PT{(5y@x9E2Mpa8EXA9dvguNr&Ip6Vf)bnP6dInqoNbdEU=%#?%%6Kt0P+&LIcPdU69k`r{v7P2aQJQP=pt49JGy+b8?iZbKO;LG8&;&6 z>@lh{dlYY0J`ud!iHSetp(v%$qf=N&$Pm=*Hcr@^`%CZC(8#8qsN^7P|OQ_4H|c>wMHpf4e~-jiMrt~e{5`RO^u8| zQx$->krsKSoz~aaTie>0RbB-FGCmRlbca%r$TDrVt^o(hqRZfvz9boP$^}c%i~#hmAsBsMrpZ+5@U=vDe-310O0WDHhRTUs-0fygluekFV zb1(z*%vR=`%l%2bSYZD1S(dNq)pp0W)U>l#~p=K~&MwYf9WW z#l*(`tC1jSFJN4d@DzjdM(Jwn=s@F%07Lu5Jxxt=J_>aAhqG=reYGi51HjM zRc!&~LY&HF@%TB!#Hr18t(=0u~Ob57HSvC87f z4%4!``C*QCG;-NHg>hjPwc09q$-4$N_jdhuO=B8U2v|2NvG}6hQ*W_yoOsKVXybyg zAfq7iV%y=pzN?YGVnTgKk5@J_r!3DTqllzYsVos(o0sdNq7G@oQV6yrHtYB<)%)7U zKLn}qV4D6Lkp63z|49;lZw=XScO?nyf7Oj&MlUuSE9u#>2-_z@5aeg8zr24d|-3~2l#g;2DEn9zvk8|@Je?ys`n zT1W&? z%Rj#OJvAH-VwRH$Q5vwJBz01j-3M*ktAw4+FD>!TT;||eVNeut0OV$cfaLpos4*al zZhB5|^@dLa+M~@%Kmf~F%8q)SY$_;Ij<1XY2hTgYxM0R;a0Ix8tL#T$vJOya@ev>N z#sNBTm!-}Nt|9oG98Tg}%3)m~&rtZX?v1iO2nX7rYe5IquU>fq61e1=5fT$Xi`LZD zjRG^7GoK+%m{<#`KtT11gG9NrQutExUJHgRHhBAk2I|j%Wk9dDj1J=gY8z;zhyYbr zjUx4TW9fU)+GJox6VS*70Ha>R9w16aq8Ut%Sr0&LSf0gQZbUFosmp{bDWn}cVkkT)eDyRck${|i$)S%G8&FpGtanAYg{=BHy` znLfvwuX&1HdFr-^>pV>TF331VktY#ybeZ@sy(kU%Or&$Y?nd7CYlnCmZ)B>y?fbAU z%b_W0eNci!mwD4!{z`|TSjw$>me!KW#xHN1+{yHa{39y8%%+2)-$C$e|4EM!QCK7$ z8+s;LYX+Zg{_F}PMG#UdgU^5e=zje)R`A8{APezc-zVm%HXls%oo{43CCS2LF#PvWLWu${JeGoRPTRC|O|Z5*Ipi%hLM}f3@4`@@p-s(X zP^MFEzw>tVx*%akU{k|#EAO?pWTbSTu9$_h4WCbfjQ7pQ`gf0u;fsjOe@e+%NP2pD z@{kiAq0;s}Ma|SS6&PBVHj}VyfO~1v5l=r(P6E0~kgo*6RovFr_Q5dtJLGl^Am2br z64UzuJDNqv1)HFmneFiIb4{)q3sQh$1WN|RvktU+<2Wc>SbAa_;DAuU6c7Vs`CoQl zybFvL*uQ7tizqDQH6K-DlWPw?X7Y;r1xV#$RXQIk{L?Jom7xbQB7Wn;mPO%ItKcn{*s*?A0_{zLWtb zb&}Pt0Wb+P+%^Gt2|FH6^ET3HNXTCkn)Pn^d2zpMNCm^6z`R>C8HRwV6Il3z3<8+` zoUe`#bWIq0W@w}l~vi+)tXdK-~p@w3_r0p3FA^< zHu45DwxlZ3Oxh=+dMg^Ek!<4k+bH^|B8JhAQ-0G0(H1M19T$;b?}*g59^Q;rUMJfW zxg`)r9%O=8U4DmJK4?>b{ZqMc0$)r3y^T*c71Geq05ls(mFvK0Kgo@cXc9F)^loT~ z7E|!~^JhMhNDvnzAQaKGJUsgwgkuNQtMNL1`==bbpa*<8L0}-qOm(ijGuzKS&;+c_ z_lFW7D3Mkn6l*G5ZO#vTSzV3b-Uf5<^@rW&l;q>*=a-c1eE5Nra(9tZ*XeAz3##&x zH~Q*-U$GG{$0sH>yR^hmy(A|m2LK?zNIJfpfrwLg%Y)8o){#J7q9;IZ1E%WHTQz`5 zY_F_hbz6LpwQCU$unAfg$05W zV3`4d4;l$SU=5#wqD6t}RA?{_!=>!_-xbaeK+>}yt6#|n^2CGiUpa(tRG|_xx+Cec5C`BJ=K_WFBp@G%20Ni)U{C`quq;Qx=O^A4x_ z|Ns9v$KEpz4h~6X$jBbYjAZAS9h+>j5}jl3y+e|f)yc~47#S%eWoH*cRwYq>Pw&t7 z`t@g5SLdA9>p35f`~7xL1Y7`VcA8wp&|lPON+N$G{*>r0rK%7la15vUE#ZsK862K~ltMkx#L}NUg7Uq#sSy|cCB(;v>)ZrobXn^Vy$#h3WMa69Q>;{7s z8A#z{?0~9H-*OC#?j;(xm#14!VZg?tu`y8k%dJoCGZeS}4EdHx4Vzu7T_bewoztD3 z{U#cxA;PzYb{@O3HQAEeB|)RIjUVjsJ#C80&3p=K=CppJ`wiQC5ex2hHwP~@UG-x$ z7i)J4v)@-^3||Toq|0O!EDx~BH?O-ScrVF!RAMqw;Rh>Czsi{Zyv&)TRGj3-!)*@E zJ3nP!SNs$=)SP=+1xfE;#EZzA3#isOAe-`;qyYHNOB|UE*J*sWap`o}_ zLh-O|>XxZ>;w#T*pDowmvB=d(8iB6kUW*MxQulrb4{^J`;L9$}&1}leqv>2HsQ($l zPt{#i^UtpD&4^BCc#QGeV{^^DBD=Jh#2!&WA$9p(!oWR-N9yEnh_@01Hwv?j*JQZ@ z+`{?3gH=C9mOfII`8|6*>KlVBwfQn|AU{Ad7fb%2jg!`YFexnV0Wnghw#*Z4f3>Dp9ldZ_YN(&G| z$JXXs(w)5>o5GeV-4Y~(%3X{6(ZvBaD-0I)FPbw}nx|Z^+!C53ydq{X_8{lp4d_3K z?lq?5XO$ok%5@6iwoB?6MFO=Yf`$6uSt_&^7Zvf!xXL%=MML3VMf3tv~EI5o=d_c(>3+bi<*;!CSS>8&{1=v&LQ`TREw7#2#oL+Bp}Un$T1^_j0< z@%_=GClP8D~cW>6#R-|e;5F6^XTW+%XQN7G5~P`EK`NrfIx z_kQ9D+)+~_h5qlJ#@MMgj(TRpl60RtS(K12Ky3X+r(aVc;SPCoS;m&`$9-vexnjIN zf>-LKg8_=*=ra6Q;7r?c>)z=Nb=cDQc>VUhIzNJlSK6yC(q(7%p*e}5JyL&Dv-G6 zOs*vL^X~+qz{;MUo(>FC&^wwAnWQtKx+`HBYb*I0^V42^qqQiiM-oNB~D6 zie&avvokQD89yQ^P z%@BylN~3heWw9~pme9g@<&jTmDfg2f=gX!9@fYJ7t42~UkNt)BtKhpEo2MKTknb|s zs4d;2D2!9Q)IWqi670)jwDpOimD}JWsMY>0{n|hbN^SUtREh9k*^*8_ICt#R_?E8^ zAT@nguHT+`f4Phju=r zM(xz(FtKm+s8*udW)@OUz8YgnnyYiGoWD>QPcUPC0T;R|^C*9XDjvF>$7wxzSt62( zr9{h~OiL~6+L53+zj0Q-F2ff}Rura(i&6k^$*>8zl6+G3sjhE4IR4qjE5g`+qWgsz`Fj33iA$D$Oqh7ae9OU) zMJlV$`}~c`5;62y#^qUAAEssc{*&U(Cf>i3mNNW;xaK`$y4YC?`>-qxYiwgb39THj#{}ji+KB{*=d4*X7qwkHtW<>Q~n(58qoPjXOJ5VdMLT>ro z{Vr{8lO$noozklt9P_*TI2_rjg7-S@8aHTfBB`*N%|g~v=DKA)wS=AkGMXQI4VAAO~)??L6$amTr};Yq6}QF zuz&6KoBdQ3?sZ8wg|5a5^(3tGbGKu{=4I-dKML%g+TNMec!(2nuk!~Ls(s=*$K3Hy zZWMA5=XzI`ee@$#q}ZMcp<=7Q4g0nQ~5-Ig<;q3>k`^ zvXu4d3hh)2vn`}vZA)Jkrp7KrWob#ZhWmA8(p$#4E>KX1dV+YJ&U;AvJZGP(p3=Ki z8lQ#YM4_jp%kSH;O1_heee!4BWJpM)m{EjZ={oo!M?aq?agZmrqFi{MhZF};x)f9_ zc1SoUsWH8!dWu=7ZLZpA@jUGwd27cpcGMYUpRX-gr*^{hM^a$)_`N7z=x2jSJF~4I zR&8#IU5nZwvG+PwLW?<>e^1GjTwG{ldn>}CPqy!)y>QoCj{NVf4v?I1iDiL+x=WoA z{{Ex)nVLT=PQ8ep2UYd&i!o|&@)DmhQo{~MMtK?gOO$-_q$LiNy1C3;5eD*t`eiz4 zW$~*Sz1V}U(Abj`j;W6K#EgsIm`fP;?>pF-kMf$j>Mgjx=F|R@uJ^b?V#MKP{K+E< zv^~UbH;z2-Zvt=-6Dy*ivloVMUl!9`Ul#s|}Hc!(?B(ft(Q^UV*ok;gqdrO_U<@r}kZtJpXYM4@xpvXn=d&TEu17{@LHJYZrS_hpJ*Ej#n zwUpnzem9C@mTF1JKlkvCkslgcN>uGTN$2OPkG^e4m>IZTe}})HIr7Z>meoTtxrnWXJ?;hqjZizXn)THLhXG3VbuYH37O475ZDP z_3M7?T0w^?ZKXk=~P1_kWKkm}vEM9%~vc%T8BL zK5RXr-I876)6r33xVf*dV94Yy+Fbs10KT!%AYzfz^P;*MBfQ`1<2@K;Wa%Eq;^0`L zI0hPXc_zUH{OuCMo;{RlS2ntSM|vIJVT&hy`nF-c^zxSAm2auHBbGyoUwKB_H_65R zR_kjAGC$5|7ruMQXOmzGE79g3BC9-#(Szf>=n$kH9saX2b(9m81*?Z+C3yz#JL0cn z=RLRnVSjeq5?~r)^(Y}B|RKLZ%%H97(AvGcP2g!JN}ru);Jihc@3Jg7n!Ntq2{R+lo+Z^ zO=J%`TTq?)Lm!Kr;EilR0#}%W_FU)k>~Hk1%ka&Piox?u8o(X z@sY1xJ(q%v5|9{5?zf%&`TA+4Q$kgW{-fLN;NGA;V=ovjqLdPeQuNkyE$>LJ2!L>gzL1vI+Hm~2rr|2A#QysyTFkZw^%GwZEpb9lrF)U5duc2&r zWg{%KTSr;TwqJQV5Pg_#EY;LZ%5M3RIbB%t6lUs{wwNS1G^%$iymsOLpB4&@@*osK z4@gU#$@wwr{jmG@y=)w@4-YeInT^6l+Ftra>p5J0y|-xh@E_4Ori8oB_U5mPE_-T) zv2cW3%a}>s>Zdb-f#48yNvkoU)3mt9D9p2H}H|K^lvXI^{_KkcJVeva%f|PPh&ZN+|>-rHg$v&sU zwa(5jUrBbz=hd##v+Hj|pn=gGtvBN-3z{W=If&Pc$}P<5{i%6xM-C;6WxdQAzBX6S zO7~yKBTfwtiOCT~Wv8&;8Deom{qfU^At;&$MZQWW zc;zdjgGf2r-Hr{C&C)ePG#$5pD|wwnHH|^XK`zZV$nZJEjRD0m{E%_;6!&!z!C*!s z-7kd`*yzR3&Ro}*^};b~T}~F`cif$}`C{)JDMrqPEzL^WpPP65QPbL5p0SMlIw@td z*E44B?VbAiYwww`s)&Y`=hDQ=ixG9Oh0>GRgDtd+*c{fU>7&E|8>0b^mU#Z(f5PlC z=HAQbHQ2wtC+w=8cXFiS2<}N&CoCr?0!i!>oY+z0qRVP+Lry=`?(U#%uhkB@lN_pj zKIR-a+9 zBbd|rOC9~D`_-wPu{1da3r-Fhe-8lq!_&UJAe+Nb2E&g@B}M)-g?!s_101mE(OZC1ySA`wNMQre z?ypV_l^V~2=@Lp$H@MG!2;LRp-zzi+L}vj6d|%gX)A$r1OQ z_J4!&f|ld>0=o(uA|=Ubx=~fXBPa{iCh*FVWqh16`+*ENMKMM2>NW5Qw^Xx1sl}fh zPxAbwn)2*il??yxSB5I6NH^w62iOJ@EYHXDs~u0i)(Jy|$1%kl_TG<4ZMiIYHC!aH zw>pmn%cqrP%`I}U6l#2K7CF_`1HKC_@8OdAnaw%z^bx;(?Sjmgu!0$Hf{nx16{v}B zMSW@OmV2`(o3c0ZR~zH8bW9#K#XcU{m}Sf?L#avWInNs>kn2x7v9YX361OukN~-ZB z7uR{{ttxP8ju7Z%L2b4Jf67o({dT3%fy*EO^j&Da=_&iDOm2AFt-kwqE6#i$w#sR( z$dG6k$mC3R)oY^pE}xx`t0hwme;8A|5f^#tUToAc9r|wSP}UtJTOwEFp&v4C@%grV zE(O|iKD?FUjVU#csaf_+EcQ*4NS5H$Orxb^V_n65197tcXEx%jsRO=_-*MtqDCSZL zQk{dvv7>kQ9w7$1sweKde%o;CFR_DH9sd>mIc)YIlGWrPaY0(_X}55>Yj2C^lx1Gc zwtSuROsfdh-&AZ^;gl4O@*q5smJXSv^1YA=wa_uhTQgEv5mZnCd{J7I4|BfY`-{IC zTxdkTe+H*nz#<$_MRDO6I%)lGMh9WY1NX__LHpJ->lw=vP<++>oXPJm0hrVQ(K*Ss zwOq>Olr1f`7@m!@1X90vnypi1E-Uw19M{p}Hy|z|t!}1BJ%I4E8@$aZQSK zk(x~KSN)QI=V-g}#6N%d9k@QbNQ@l?3|MuER%;qre^zjQvsLC~fsW_9IoIOUFYw-! zf22WVDO*fs)s+ui?QiHmLy&h+pqWWp$NL`8$K3jLkf1nbA#_+=0R#!iN!548$=!Qw zh;9SnQ6PwfAHRxqg;$ z^}|Vvr_J=6lf{`=T|Y}leGxw&8%^oyuzROJWHt5{)ts-cR(&hb|G`QAQ^4Ow*ux9O z%)BZ&D7eLx1X82)5!ilN2-8d}X|#AOMRt)WkvKN~@dE2z`}#J$cW=I>yoE;{Q=gBW zb45Ig4tPr6IYe>Q7%oqMcXowO)Mvp^p7Rx1_v$1DoGfaak;w`+({dXFz7KPMK!fL7 zc+h-G#EY&7hM-LC3_F}GvM9jjjcMHVC`dFgtrS_h!+ACo$0Q>XDaVs{f*AJoWJ5fQ z6%iU%JZ!-px?87Qk+F6qwBc%I zI-;{;AzZrt+G^HJcN_?7vO*h=^GP3d9mi?^_}FGhAo0Ae!-wGCkNWcHTTnG940nVw zk>do&2_)#amzp9i$Ouj}mS!gM4fzxXgYmF;^a|uwl%=Jmy)E88Kl7I($azC_`)Ci} zEgcSJMbDDtLvsucpOwBcx?{@pbRy$B^Q% zrA)?OlpRs1V;hE~%$@q}`w677&Zgk(&rBH+?i&EPqVe1@@zWvSm$wZb7A#)9NHObs z$!7=mH)K=tiWWy2&J3fgaP9^CDZ{dtW1|9j6@)EZv^r^_B1G3y96s_^cp&$o?$=gE zyyWSLnHM(2>WFu~WKErR6Xg@X*rqIckp<$4E)$I8=?9F%JrJIxjtS1;5HyHYR z7Z*4iZ&c0m|z`Qfok^ z)Pu>{`LwVp32b>il6X=^VR2$BLrLvoKSq>Pe4=T*0;QwJ$-lpk7K+ZXX5wBesRAr* zQ_lf~?F`toHu8;LdJb4m2S`1U^Y2+vl*L^}g9Z~? zHlq2ZGo!g(rheGzZoJ-%yaXRlPbB5WL`UZuovQ|ILr`>x1mmc47*lP|?LL~`+#O?HAL`|ZXa zfly?x(vY+k7t_keI8nbQt7?WAwC4ZwK`PoEeQW7hz|n{qS+U(d zpC9}Cn=M)=3&$zq|30cS7_p#1Qt$&fwJU0hKL+SCQvMXDo|J0SzB zL?Ig*D-kJqr1I<^!&DVwkcUfhplNDGSZ-rJ-$O9(vxE9#Xf3@*Qns<>wlDUVDpLPL zWU9oJTS`z9+9%fl!)?pQp`yVouJXAlu^B|;EOT$mm&eyoYqGze7T(05@dbkQ`-npMlc7qU32bv=-i146U8% zBO!n4Lo82~i~n~ugyJMVd8vQkp)fJcpWd!LTd6$*w0UY)20Xd2@dski*EY9=LBuZ5 z%Ye`6rhO7T-wuuGjt<|WGSn- z*UXK%HCdD`D}`R~{Pr(Z^mx?SmDEnn%BHC@XD$k&t?5?-sIncoT8DSjP--V!Syv)3^%y6hayPr;FLj| zf~}fa5~xBXmG)2}F8%UT4f~jFjoHa)T-_6VRCS<0-CTL~)o^A*WOz88)z`bS4?b47 z$$NfU2{op64zCpR8;!D1JbUTJca5*kp_rYPT7=PCPtbU2|5J#sLLpmeR4aVYx7Y=6 zhiNx9Jd%uL=uLQtQSyGx+wv)dp{6NsQ_@B|{1@48P#ydHru zoRk{KoByVg$Lt zhFw^jp+OJtLwqAml|?6i^sDlB9Kt%2+#In`6XiOT7;--1^6|_C-OR7@1EQ)c_@w-_ zJCXx*zYUTsOXJe7Y99WToG?3y`=MyyE}E2M{GfBECOp0T=5+2My8~9xl-dpZdKtJ0 zP@u2j;|HDtmTfToomgYp9S3J!SN+L;iJv7RfLNhpuyia1f1_bXVYzM~_$i?1m@A_^ zB+hd5q*Q43mPhdhzj2M!eh8fOBc)d66>~(V5gq$FC=5sjlxOiJ=R70R&#Pug>q3}eP-Yw!>YX3-&ro&?8dPQcJ!)5G+CeARUektbH&!&q z9G2QpzI|cuTf8AMQYsK}XKKzD@l-TkQW=PpoGf&@x{hyVq|vUiYJLzJIc!s=YS3&{ z3I6Nwzvb#FeN4~(f>khWs$oLoGxL|aH^|f;;83Z{>zv;hh{-kN%am)Fkr*^h>4rYm1*(eQmzxe0Y~)=te|*z)e2PwJIS=fsc^}zd;4F{G)72ZB2Fi{4`lcq5t*eJJZrLx@SJz zyp-NV28t=A0y?pN1teRGJO}3WRfFnhPjs5n9g!?s8`jf|h z+v_!r%Cda+Qgc-uA?gJYerzJ@KQ_9wrJwixL9JhY+||!5Q2aM!1*P*BUQQnYhs9kR zfxU6BD^Kp1(*Ho0=t!CDB}9DH>9TBgGK0mWBFnZ76~ldtocWgFEubBzW8?N8wiMou z+gl_Rh!@|wHcsKIQwpZKj-0G|U^}eF*K+!-+ z{m$?;6oE;DkL-|A4p-y&?wg!qe2|aNwl>Mucp9T?tZ^lMT5Rd-b5`zQUjfxNCnUPgC`LV+VL2jPwn+j zi0&2g&#e@?-+fzhn|HPCwnAwoye227hmR=RRXBVf$ocz$`&g1lQDYP?c2)ZY4|a9U zm}0kU&kga8+H%Uf=~2b!i<5~b9K3U^S1-J{M;Li$pO(6pF$X9pU6o*UWJ8&^OXHb& zpO(d~CcwC7x=)W^%Pj*#c-?V|#BeYV1;Crp#LJEkQz4mOD5dnB&?o5ao?bg#da)AD z!v3yd`CG%4)1~JZh9iTB{WC};GU;{w+Jm8IXJTVZVtB2a*vo1fd-P&Kx+gC)ENd(x z^vkn+5i~sq4I&36%l^q2GM4T37<%IU9PsW(&b6UDK{ z*+#9Gk8=GNTaulFB*9hfkcTmVN2omZZo**fMZuDS01B4cFa4RO@l8!Z#8ewTYzn@l z(?gMw^o(gpiLxQHj1pGqf2U6r_Q`6~)t;3l9l1_hg}kY4?pNLGV$M3edzf}4nJ&p| zO?3-7N!}S;b}&~fw;{Jd591yyOOmLf##|X7uMF-d=@Tj^IKf%koiz`=nxPG~@l%$@ zg(XC%B=?d+KUtQiB)OXEwylwWiJMVOe)nPb_@IQX$RGc4F;ti0-n;M~VJr8}0==Y% zQ!@Xxv9Q4DJ-Wu_bV$aL$U4q2L~(njC;0k{C-Zl z|0WqI)(MsjeuhuFx|Hz!09#9OGX=Mkhub*?H!*%z*6E%|vRHjXF*IHk2wrCLVKQXc z=xM_rfLI2r9mdwdhxWO}X&@bAzY|F@_K+4VwjJ4}!wbdtQPomS*IGpCu{2B(H|Wsk zJ;1rq8NY@-_EQM@PE3i?{j>u8F9ivP18zyw*PkTB#8{h4x5XhjCao#&`HXJPHH6ai7Yl6Hb0+6mKJt)&18SqutWn=~#S$+VGJ`D{` z+TSrkR=naBn%aG=^-##AzRO<#Z%aoEkKNr}UdDh*#zizxKg5LR5W2hHN_NMhl~T;a zWD*b}KYTC-(NUOFL>>{&V&cPxLl6lALOm`Z;F>)6Rh#B}m&9kGlT!HG{9mIo!N;lp zN>|mg>gvH(bd+pS0Kgce7LNTafFX+>9rEY_ZiAY zWbxfnbxNvxDb?iFgOsXORkL$Cy6wkgRs8w1E&8cAf6Pek5tQ|xIbK(A%JMgYNOtU~ zy}n_Pa)K?!u7H0+u$;MS>A1`A(ub*lqNzD}qljLTL^&S}s0gT|X*68LGX#)X_lqk% zu4EgrqkKSc!Q-0nPDlkb>>)5VBFH@D1Xpg@BecV5*#EX$*tK(fh7#V;9r7iPFF8Ab z?tj%o`Daagr#8|PNuKjMm<$$4^2h4_$JsTi@*%&&i%why0E=`SMg=b-D6`{#Z0+ov z(Jj&rP?8d~rU1AO$v_wHOhrYdq|^mWxR`dRa~;4%Lu(oU9}I+HK@;168hr^^;lukW z9Z~e?S`hvP1sn}+?OI{Ta&F@q8Bp&N_`6zKWbk>B)}xkp?#OtQLS__kQe<&%dDKDx zVCMP1v@9JmpVPcZPlW*IaDnjxKbu6DicLHFKPYC^h(Y+3YzDvM| zd}14l@r!tI1(5)BU~>N#FCywuThu>#rT?vJwSIOPmq2INTa#8x0g0l`GGx z`p^*`oo4qenA9c9xVqVPMhG);X*Onxy(dD2r{7?*>FSCD{=bbu~11>mY*m3_}2qURbUZ>(DxeN zrv>a%Ul>P^MB&>j{c451X5V|rMwsYCzF(`;AK(9b^WE`XEQt!RqQT0USDlldrn9?U zO%GA~`E-(pcvA{<-`}O7{UI}D*kubWOY;<0uwG%vo{8>go2BsRG93OVe{D#v@nj?? zKPt>VsbgW?@Mm%!&!>zGdAxfP&#t^uNw@p{ou8Bkce0}vPtVd2nU(|FJB+HA%L%ZG z#=JZ@raANRW2$@~s5249m}qLB0H)8FlY_&vii(^kPv|`Cj1Fe@vW3mRZEt6OmWQx} z5ExlzZX_ip68Ygor7bKhn*23mu0igcg0vdqngzqT;ivG0MP#L{Xcpp`n2#=~<>;C!t~?r=lWqck=T3{_o$v^W|a05S-lc4G}(F zZ+NTq$3I} zNRdz-B(l1&ge zklTL9FCyY5a1M^fmoL@6-vr5PaMW{hBsRt$7jUqu354>PT*~ebWN2|US^_ByBOiH7 zZ_*`bvpryY;q&L4HhcfLA6_L9e+DRtOfxMJ_mzO-AIk<`{oO-n+x?KjLmnEsn)XaL zU5uvB--1?L3_2o>5#u^Jlt2RSP1%H!O@AbaTvDAI0g6!7t37n7Ft?Rx?GnSMqN-{5v_1x{G;P$b+wLhj*~B9(s6trGBqq=a+kf8!sbwM?}N>x6pv+M>3-Ogx0QC+ zMi_~qQc-Vl`%9PX2&~y4%i)bGJf0`+mR=>b^>nmTNiltp=lr*P?4X4JioA;HA5q7S z7d$4U_({jpx8S@-)kjXWmoN#@A_wQ<7bv30yncIV3K5>yqOpis* zU+ZhGM$F@xe_L~3yv<*eW%MveT<=zMIu1)!R&rB=)MBr`W`7Z8ZU!fi3+#nHvCo3e=VNyd_IcFFCoA}xpzu! zJN@&bPzD(J~s<^LO0k6n=%SM$>?+||MXKS~}&BzkkB|sU71}wbQ zLcNTB%S0=Nf%Ap9Ut!utJ_>*OJ--a@xD|YmqUodm{b#j*bZpue5eII%r5tje*}WIY zdx3n{AI%MX=wn4XyXkixVdTc&VPy9;LX z(H=xLD14zdNhn`^FwzkBinb4OFv0A~HYmZ71W$X}w`IiaWI^hw^zgF8#`2{gMb5AG zHsd;GX7GH#(Qer-y0@7>eFYNqf1Qc@r2J1y193ChjNWJBB$vgZlC9-$#qWo_y(v%{ zr@?!L(wx0#Ht+QOiRh@g3EK42ZKU0GHI&lrKc`E+c6;4>bcvT`Gt)c@z9tuJ+QEto z)8jyx)cYRFTV<@@+DYkA>7;TWkJi)SI1SHvEji50%X;@wHUY(R-!>5{a{3R;f(!A1 zvR1lK#F}icn7QU@qEo-;e2iV(bw@5`{Y+w}O$>5wqZT~{t@oy5dL^6mR(!pF`3r{`u|^ zY2oP$@+?lQM!o_ z%6{@(WggD?d&If(+W?-kuj<7aKVi#seat^=IBaq!{E@}RCFHmGICqmC|bPQMx@lzPs0@9p}FNUzVH7Mep5uWoyEFL78FF->=M06&So zf3Z-D-j9F;;Z8bRjQoCFx7cgl{i5JDY6y>)aCCvplPQ8>w*T3SIW98ZUaR z`rYs64$c-iz6ggux9`8!UU91X85BnGHAZV^_(hBzM!rTp{odJn%U*;B%qM6NU}Z7z z81I#@oCr+>Cue60**KAG{Ht*ja@#(=`}er1qj3w_L$ zCT%EGf2Rs50pZ9zcxo>H8-?*Q9Z z$4tKXd8IQ~MiD2AdlH;lIhMC3P3tCv^0M6*f2o5vd?6W*gZaE?-idI*AUAD7Nj3V2 zrJ6p9>&^k%46{)NzaaUwbSGR}=w8v;(LXM{IA3^pd$YRg;F#nF> zQ5owpXEvCV5Vz_H$}&Yn8JM;ba|gA>>%8%s4#?=-J5`m)P|MaX0{B1c7SB)@*@T=+ z(^@%QL#oQ#h>mOaA=eO)N1@e$#V(g8@4RdRgLnks7i;FKNYnIfpYLgqxM{_rSS0rC zj;D4fuvud~-M6ACk{p7}%zC~T9!cq|5z#N4Quq1bIBE_oY^IrA(eg6-4&d_j<{=l? zoyV2;E+)D_{ReG$Eb!j8yJ6mbe>)BFG*}@lBZkA@09Q%ypw@Kqn<;Ks3 z)~`RNcVHj7Hga8`DfXH*{!D5mYygK1TiQDfw_)wol;{;L^T~ge=VZaGDa)GrQ_)~M zjUR9HT6m&rG!nz*buq>zw-i)J?(JLVB%Qz99ige+o+|}ycQ!r+uk4EFD0LwIqdBRj zT_P^|Zhad)=qu<(g@-4y(d;&v0m zMgG`7|1wzvi;s)r?U;%+9bRrhX$~x?%=U`H0@2o4ISTU!Fi`u!dRDGkLw7qSQg%T40oq{uJG@vF&(} zr<2hvGmvL&-#S%5KfC3$m8kpt(xdbTM(~Gt=70f>zElC}kz9Z0it{VZD)svRopCUL zG4^;?A*#h|89BO48i5h6cVx@ZrbX$nG7XKH*+2FBcEt4aObEaKyqU$4v#MVpH}V$_ zi>IewH1gZ~dvMH6^tEfrFq+KJRwSb;tWG+kaY~o{_UDFNx4PjvJwtLbJ;76zmtQ*1 z63Vmk01Tb)(z|j>3UNr-0A=BwXD$}Wexq^H{Uq;|f1=;YX*(D?9=#SBi1RiwqYec< zT-+^(q%-Z4>LH6n2zxcjoq&MmvNAr)54gg=N7jg*PQ*vJe-bjK4xIMTW+-wYLMSDFBA6%UqiJ z_>mez9vTwj=ITmaw?-33%*1~SGNnW)rG)zux{p903{F%Z1ZS*THUGFskLRNj!HgjC z%*N|iY&!x)@uOr3z{k}$Ccn*^fr->Cv-?(wr zn@)WFyBH{D&L~0ukj$hKwXjs`KPI&}kiyU32U)i`rMvf9MuDNBn6{ySd4?O9QAO|!WR35$SvbDTPwGViJcK*{WW)QqI*$$3N&X0HqYu!sLfo(5#m((NtezeE$47 z3p`C-Zxg z^8EQ0#P;6#?);4muNOR|kW67b{Q@W(F2}zITpv{#4lsiDW?mAZoz=W%_W|ghI-d%> z6=NI;wF0I}jpb`EbUkSo)DAJ`zC%SEl8O*K4i9qYK?nlm8N`o@OT3N)4j&pGhAIRB z)*(j~`JUQQ;?tSJq`qfTa(kjB6?(3+yk_DgoKgGf@cB+ps`V97zrc zHUNcE+yVf6sJAqa6)6M}K9ka`sy`J96E5xGvmO3-FnAJ-v532a zqoegDB_(BL{lmj-92|+SYyN>CUJN(!3?g!Y4kogU-F5xlqJeo#)u5iH75kk|1cW?f zB`3ef)VT9pB~cBu`1|*iwE=wtL|79z|M!V7erwDgUAGYNj1qC6JO~=cWgmew9BryZ zH5ir?@jC~JA%0#{qh5cx_Zf-b66<=&1I%Y4i^#Wt7qBJlCnIq2I?giVi$Ekc zOwI(cO?*vU3wdOi=6;B6n;sk_GoFEVoTn8MSv;MaoRqYV6jo9yvJ83vhMhRb*+C~# zk(2A_=@E7KU8MDN%i*Dq^YX~$o+jx$Ltb?>yK@KCIx#V!>ZPvUM~Jzk3Zcn|QRQVN zCnYUcj_2g$ph$y2Mv(5ihRc`%$iP%*$Pw1_Gx)v}u*9il@KaY;SJOBrKmi@_KZt+P zOFY)mPC-D0_V@Q81A8Ej4@?9&8yhGd;i50{D{wDKExPGyzr}v>(39au7s;%(8dc^^p$o zs1VIR26+-ZCYaB!AKe9&r0WSUFW`sQH$ij)V4a_6yP zn%QCU+FkGuXln}rc7P|hP7Nad=iU4FxDd!p5=ask!_Pz@(ja$jXgn0uZ|@XccX}&M zTLnT!U>s`wuflxHhJU}h2RWSs*$t1C!`h>xqXF{}Z>NW!vu*KU!zb@-Zjw7bQ3_@8 z+uSA;;{oZTvr!ugkLua{F44a&Cl}22B8{n4u051_l#9)a*uYgjTWxlUc(gF^R-~vc zsaL4nXU0osf0S7T*mWq0>&P!dy%`2?0+EDa4Po>??HtNqa?EWnt#*I!K- z(qf02uE>{yPgXGGY)XWM*a_d?X_{<3Mx2-NIjmxYVKl|plD0Ad(PI7nUIeVpiA_GlYAs0jHYySDB%5l0e|Kq>pPJTBXr4GTiQ~SLOisf9ieG@7AO=7OrBehWoU-Rr>0_d&Q%xZFACpk&AT~)%V3)Z zt7t$#zq8W!CcCm8Xf#1|`tl3Hl)uC7Kr;s)_=H*hqc!4}ufX(>(_2eo?Tjm6dhwQWi8IMGzFp+cY?5CfKU*u>YQt z5=eAJYZ93#{?pGRz)1$&RaFU_EML^fK}~sLRO8F?GS;I5DkG4_s`L;X3HoAaBG;oJ z@(|1{CleEq9oXS7!9_rIcZd?p>FDe0TaYq<`rhj4?XAs1{PmgpbUk$bHQ}~W8dY1& zy|3@`i7pvJp#4&&v`>^n4*A5@5)%@HgoW3Pk5>A~9zA+gQt)$onl7GcR+}B{p4hVB zp_7NI`(U3=WEHbSqdfqr<7Cthm!c!wfl7^uKW z0vpYY-)IJ_m=4U@&JH&MD+g6%DQRgQDk@hp4^PjF@$BIUohS2A8~U3{=)S;mMMgwm zi~dNvPl0{IMHNN~c6U`AiAdc&cXu)CR!D8m5jfCuJ!bXN2qS7laW%Yd{t7J7KbB zL0b|1Kc3DqE~@u=*t<*Zl1sO+G_oK_2-01Wf^?^ZlyoiKuyl8b2nZ-0(jX`yNJ}dy z9kL)G&++^Fe;(iPRu1RP%sn&rb#+Dp)1k|w&PsfDA0OOd^_MTtfhWt%0=Ro{adBm+ zAvS8yo>47acKaUPLrXG)fxH(HOh~W*k1A-wZs&46TJ1K>1Ye_ocRXh&7HbbYTH&Xm zLDb-B2ryjGQq95D5rAJuPDBJNF!WgLHBcC0>UH=Fey!5&=al$Ul%&K1go>ap#f}} zL_kPB+P4Ofha@BY5|}o0`X*2jOrY_7q<}58h25FALAOT08M$&A`o?CUJ=hO z8UjJhuQL*;*caY8q!bsg0n<6u3H7~ue-FQje=2=xNlmiQ4#H*Mu5l2(1SXuXpT0u< z3Ih{~IWl-^&2rHgmQ+&pSSsa|On<6gi} zy1h>HP2*`rGDb#=fd3I78^P;=M4pyL)?f!h0!uUxWp;>E48hn_%)AYB^z>oh^^}!I zKBjYqb<44`vI1d$bT0J$Ul#`lPJSUop!hl{hv*rAvf7)glQmQczB~pSiYIL+;@2ty zx+6f|_teDX8UVDBnj3@Pd_6yZ2~40Zv*BcPy-ojA&j0u{_QVZa0F68DFSCdUm7%39 z?tB>g>-zdbfF833%o^bE-p`+J0f`kj_X7m_ziFDBz3aPbae3e?r*8~ z27VU$cLX(0a*|j)f{ayhCi?LZV01N-jg!N^Z-v)2kNa~E1-{J)FhVWRoU@mI1ZoWaWoIK&$Tq-%lU0>N(t*gsy$(ns7Uqk(-44VHAtFT(+A%0SbG@Y0|p#X zFzGIcCl*;n1zy$B;Gn`bRvoIak5+1jA85f`k7p@ZJNBQ}PS{-o4M(lKr~6b`UM} zT44Z;=1T6v2?!51+5U6Dp{NN@M_=6$5#GreRzN}_PZu;(08}!Z<=-|>Nm@u*u~FjQ zy+PyaB!lG^a6P}z9e40`zjQYy_UKf zUIN1zX#g-}2@_o8kO!+14%c^P9BIT@k3O9MaJx##aZd)kYd2LBHPs)6weav?;*;d6 zx50F7U?D@}e~}R4gO!@Eh>rLZ6cnUlECJaUgRll37u>lzIzrE*+S{)}7e1HB9F{32 zaA@RV+g7}KmGbEVfIQ-`T>-prn~Ez&!+gjat5Lh&UKb{S*^TT2@&!qf3u^r&SIJ+JNPy8&9cf2{^!&#D0Op6o$3s1KH?StvHc}1Y#J+3 zVpQY9aXhtQya37I(*l~0mp96V52u6H zvvgPms~3thJPVxQlxOvR&efR!_3pyl9PX29F)=Z7b93N9MXJ;pHg3+oeu^%%1wOK4 zFcIKo8-1;Y{)lf$vIK-&83vMS`vcu`+94z z{EcmanAiJ^vZ3|K4aZ-gtb~~G^oH~l6|JtTmOD8)^%CE`wfKPgYGZ9(79Wq_pwZ~` zwFXG`F;P+A1YS$>hkSg*UU7>J#axlL{ea4@)K!P3-V)Hkp~>H(V4#QNRTUMsZfCq%Reyd&@(j5sp9;!4(`2#wERU)V2NNMUSWah0e({t z&NGSgm$)(@Pe6r1pu`k^bX|((2oIT=5s=VJh5Ts zXYXK~mnP1NPgE`3rp9On05PxEi@Ho*<|Ss*Fe1|_=1nrh78%znp>G0;cL6T-?c6fFgpNxpd~^ zvdF;+G;`O?&M=;|mu<%msYBVImBLaYYy@1_RJi*ls5$m5x34FzZD@K1^r*P^G@&P2g60rM6hZC36MSGl zFl-wQ?~RRQAi>@LLjHVWIEjAa%p(F03XJN#=M3bKhFcQS#+DY~l#zu-8#dX(_%*J9 zHI8Kq)>m#&7j2pQ6@7CoReT^NM>DfRU&g=O8SxKz--lu5!dZZfxv@>;d0_bm-rTvjATdXuA+W zJj_fO<)E_?X5-F89L~-Lt&dbdw1J3Y6c5Jv)$OZ>i*LNwnZI}URPpAsTh;w;lVWaj z^L)S)^ZQGFD!MYGc&u5PC{m4kqt?0IbOylAphRG8@aVgz%J(bxyIEna=jFjR6Jk?p z&aR2MUJxyGR&$nUUIZ)aA$y6KgI^v7Nb6N!Z4%L#yjMNrP?8av(XU&1AGjhN>%#h( zd?SkfJxrwK4s>A*g?y#Z2BX48|DM9``_~q;%ZiKp$gI@|IP3#%{|H9{-4)_mo3Q5; zIse+iz)lQGV{dM5j#St3^k~2ZUey4!@*|yGb@MRIos6LZ zLsiv_=S$Xy>kmNF8{PB9@&YO$_?^v4bmWUkI)t^7JGPz*LBCh)nzM@^t8h=ZCkZqu zm-oQqcCyeX@Mt@-KY#7MB0#=?N}M0Kdo^J`A>St2=11*8F}Uo9gEy3ZJ}ncICHJaD zC_Oe|_-314)m-FM0JmpXVzQm9@(@JTNcs40h+nfydk}4jUzrNG9&-T~K#6||Z03dW z*EOHJ-n~)jscpucMm@W+d?%yN&Azh|Xwedqz~3Xr`DBg8OJ9Y|8d?TcZGJZAbgUk5PWd;W_xG$nGJ+>7y^*FCg8$O%}`0HD47fo-wP>dlF1Hd{kNC zB7BxxAWbw$B!y}^%l3#|WUSxHRnVkh56o~uVp!C|w6{}~@TSPiJatZY?3Owvg=qy; z+dQXu?=>O~`*E=xbeIN8?YhI@LQr`98PoNGo9FvrfRfRT0VP>kWyWeCP`wfcE1gCl z4P(gk)clV~;#g;~bcp0txf|8PoaJKYmL9{v(As9d(4&+BTcNt&d&3W{S{A$qXcxk@ zEXU8p(ltOtwqf2|!$g*ZR#b+emZ+ShpS>M)3rh4i{`8(k!@vSh*hdebMb~>F&EHN> zODhXBY*yyy=ITva>tDZy<&=btp}tdV)1Eq|SmFL#1rsI*YQ{Omv!IJYGp)4~yu z^6oWk5Y}2C2K3Rf0GD-QY)p=xH56F0Z7{_W=|l0VSy@?8@jJS@Ha9eI@$f7+*%374 z{$uKHtG3>)({G1;=J`WHX?1W8jR05lT>ajop8DW8;QA5-0=NC2cWOc=!c^N2CnanU zitObuA0%TZ!zYpqC(Vh#Ikg=V(!n>GAVQ(;+V4nUhZB*)%kn|^$m3p+2o&oy>6yg` zXK8F6yCMqN;T$-`vUQICPRv0;wDSFt_^jkW%eridn8e04ck7jm5S zhr|PhZp>LU9%UlA^3ep|H&}$SFmtcS3ak`bVgv`FxjA60**35 z5+g!$wHzH7M!*jC^VQ1{#(=iV|0l7cm@iHJ-Ushc0-10ByH>q`D2Rwwz?Z|C2GfLd z8=}C~3;p0)mpF36j*;NhZO@Ow&wT%=xlG~RU58je?kJF}x!r#>3=KKI#F=zi!w1`L$8M;NI%myLQmpfwfM-x8_%jcFlSeP?2 z(rSqY0I(M&*Kn+{{}GtIlH#MCJA*P=lAi0b2tcZvqZw$MqdR?^jJ0Au?`=diMs})P z3TZ+e`VesTIrQmNWgMamzAZL6ED?bgi*}LYr51LCMo+}Y~fEIDDW$H?p7!7K5@bbrYFX}FN{&XjXs>I{QYS6 zx+kM7BfPwn(-yf509Bfv)n(>z(2XvOIpFjBoMIgz8-y=@z8!po`kt`&vU~Fq&x0Wb z6JloY14d-z9AgEy1OA+>?w^G;hG|Y-FAf;*9RZ@)vuF>7*G1K@ul@)q39+U!UpT74 z`dN5&9K?3Emv-u#TLz#h`4MGL(BAKAyiecxXV~z%8R8 zRDcPF9|UNr{#AM?AdWxN*N@tt`PV6~poc!$?G+-b9eh@2jI(duo1Fs@r|w+}ymS@8 zuJTi9R@nLWZZHC9)Ii?gQ&VSq@68R3j9_*80XxzpFj!djGk^vMXn6R;jZI8E>T1AQ z;((GEJdA9JgwR2eM-VKmF!t2W&d%&?>IP;g5m9D(Isq{;E*%b%j(M*bFjIYn;YJ`B zP>hTvBViiqz`xj0U`sJ9lc=GrGIW`V8RYGd0ug}XZ18qxa!xz@5!E3jV+xz=9v$PG zGc!q`BO}q)0-aO{1=7&9Pw*T}RakM3ygb*0{@l{!H2NLp?=zqM2UPZbGl3~IE_Ia| zqI=8-E@&^RH!jJw0`>vE@V-K?Z0Fyv6hpoW%5n|AO(JSnt4^yB29Q$6JwAz~a+Y}Q zy|I1yAu^_ZPZLS;qa!2D5%fB-?)8h&f35g>Ti6EqDvwirwSSemeGf-YmDK9i%-w&H zr{F5bzwddQxdOak`>wzXCfWlc(9YB5$HfvwbuXad1|>GQ1XPVy;QRLO=xg=|rEQ&m zCdBW@4NLeR-Aa>XxBvieE6aGx0MMDf8uKh{ z7XVvXrUL_G#CZ=D4L_er2*u7ljs&&dfi3Iy)JSBeq3CM`c9Y{VJg(uKEm5U8nrb#= zQFGS2)j);K<@~8H04)AX6JQ}rBxT3p`|!7&ep}A@=vvCDCj*kIH4}Nz@i9;44K{8N zYjcjZ+vujVyQH45z4SW@y*%@(WXFEX&ij20L=(J*p#dbw#(RP+!H!skmHli*5E7^fz^Zp; z!!WQ$g8CGgzH`wT*2Rkc58fzHzzL17=Xtd>@Iq%=ACeBaQhI8g$os`O+HX&m_V_fmt;%-R<`#qLh zRJl{D;d1)=7**cLpr3mkd`1Sn&3c<32FE|(lpGQ!{kzo_5Y8uKr7Ls(6%}6wa*-(H z*CB=KmC0dcg!M+0Lf?E;A7{0g!^FbK7=i9ue^N4fG(n+M4VoE39}9*Y>8&s z!H&LR9kB^*-RA4G!-ifzke z4J}#T5}g{q?jZ*lQe!?>6*9D$x{!)q;Ytd<_pbEvyUsUUg7OP0nH}}Hu7Hske;Y7g zOrG8O;aiRBH>E7tgsnfA%>7>drx-N*tq~T*4M;vTy7a}GQ9VU4jawyR0=p@>aTn5?yxd_ zF|N=xOIT;03DE#LYVCqU@sH2#VeIgSlKZx^LZ3yGtKr-PoYy@g<)Kp8AAsRUiz`oj z{|y=M&}r}_nd-?Y#<8rqp$@0fNCdy_Q?pFw#l%jhQPGT$e{YddHJ)OwL~RHMEL|Gh z)*e9)Y^&gx{FLK&A-G^!3QIDKq)u6_>(zY1e(!7nObS87pkuwhQaU(X+)3{r-Uxp1 zNI;+6{3fmG^WIHh_`M`d%u@Q@b-Bz-Q-?yK*;6Y76a3&BoTUf-#W6VLq80~2h)e@1 zRdlTY{oTE0@3Fi!G1KC(M{Ny$k9zGHg^}AQvLV$1$t)FV!6zuO5`gvQ@pAEoWWfCf zfN53Ve~-8wHEhhUf=$eM*WDk1dsO)zjjRbJK@S60Mh@H>SH)5E-?soT#Bor}Q#&JL zoM{Flb}ps~a@i@uio?YhSH!fV#J*B)1{lRa{N8W0<^Oc1@82(+EiA`BYIyPi?}SXm zTsG1&y}y5A?0TPd2HNS8OC+ucRT$hYzFM=z4Sh1ITY7qOMs@gjXPdj>Z@!CLT{G0> z7@v6ER!;DNim82hX-2$2xbaONAWrxNf7OL?<{YL`NpV$IgYAM|wixhB7=tW;%LkX& z+UL~4M7y$gLw5Sz00d})R-Z@tKK~seQg{nSgu_0SxFM+(0kAyZzk5PRztV%b5q16k zDl`8(F7b=HgKJ_EAmtCE1E}W;*V*IBTgTdMI@(xPVOojDqQu)lb(ze3(oB3U*`QB_ zeJ}v8s`yln?&DWt?1Tmq9Qskf;RefZfI7odE*esx17uVe?>`2_i?RLMy*m?(ylZ%X zNEJ`svME$_<}LBb|HknWPpLOuIzVcNtx`yRD80nePn%E&G^C7X~Zl3zMV(@U^&*0j;vOw4SZn%sYE@y2->!zjAYa&T|nWYA!ORw$dP zeKcY;E^9_j^9hJFxWYKrmugOo^V#W<287K_;m`LUc285Mz8c#kY7<=N3X<&6*u+ve z;y}l$dp$%x-bKQyjWzcy>Sf)BP1V4gxhhAue@}qhsD~~dGypRpah(f$2&WB%kA(G= zL#;_Aaj~NY))8C`_)#MsP-KloZpCx$3e{59c^4mh%;)^pP>lLLKZI%;7GBo!eNcNW z<9t^ga3!2!M9->z?{781Wkz*7+X6E*z6@X)_U2W^?Q3M7`0Kp>_pLVH*0^TbMO!tr z;Gn8`z8AL{K)r*_3?3q+C^k~QpDZN(ROEQ?YQpV(^0bAMvA*#7<*9RdP*qjLC~`cU zK1>Cjz;)R};BrT1A(%$X!7g{3v2*hbtd&Pq+#HYrbH=#Yg~6pF%#>0R1&^p zMMJ}36*WcrmMcCM`pqayasN+`)=Wn3lu(k3!c;Ru%_W|V z-sF#_Aiy>X10xt^V1ws!a$to>p)lxk6ct|yG}O8x-Mgv4ut%JQ?b(}e8^B=q`r5i5 zLaKMW^_oy%BkJ2x_U=vV6jqO&QIU@T>@EDQf?uEXc$2r;kSvLUlE2YbQ|NGmp=o8AlMG;|4Aa^`%xZx1z};YSJx_?@ul@wK&%JI$F8+ z*CEHPXrPZKKDGM$5h`BE4pJa*%b0}q!I#BVusuq}>6QZ%oJ_;8DED+WgmivY>ZFs1 zwznB3jUyP=yTX{S0*%xGty(^9B&q9Tc|tV!>ES0rWFPMPl!M->UI;chPg}~ZEb$?5 z%h1j3p;^SqK^Nx3NTQ${6%t&;hS)F&gmKvM_xw!BZJrl?PmR0Wk~H{Nd1~#*Y<`-% z4^FJq#d2}QeA;vLlbUJ+>j#%3%e~Xuy+3{un}%Ledf*H^;FsN7x_zF9X7gEB+S(HJ z!>?Uv(Wur#cmQ|(*i=_LaalwV>(S?D)alkB0T-x{Yg)q~kQ6LwShzgW69KmvvXiPU zHO+&;$oTQZ-@&Q-@z!g;qCo2K9>9A4;D^ALgp>;8Ktc=g?JWba#aSyLme6eAj{7?1 zO-=Z5N>)_2O91;^bB(?{;!zomt$C(eQbCqe=|lE1Ql0`Gn}>sgzS=;{cD_O5)} z;>V8m0DXuW1SgVFMQFIx4{>mm?-^<+8SEnds23|#Jk5Tl@#X%}^<}7JWxzX2aOChk zo$;oiKmw`W7t11h4v)^+-yB`vW7+ZlD?7$6w4Xtho+&X&sw7P&GSOKdt~mNd=&JzW zB*3yh?#qgtKt*1H2E~e zok`c@dy|Zi5b3gl8gR#5 zKsPmc!Zp9VGFH@y>Y#iW_6w!Hf8<7dYbh|HoLC!B`R+AZ1iPgPzEYQ0X1Mc9gM3*pCtdv6zq9 ztPFl%Mx@{Y=EI%QiHEcmEV*@WWl;0VH*i0&q`l{_kKi^xA=znh=I8nv{8Eb1QiMzz zO*9(2XhwO`G@gvMcvQ(1&9H_9!)V}-A5x>4X&resA?T9qa~Vknn!Uv$nVj0a4%cN5 z21ArI7`Ndg6|Xl;WN--tE9+<**lGK6_STz9TA~cD$Tc>F+86M~nQp*WHhrW{$4JoV zJ|pxV0g3<0u2}-DnEdi)WH0tY3EML^x}d@#!L41+XN$OuX=J+neKNV`YX+rsxMZy`Q44U#D=Nj-Plp74ZyqdSf?OWxvw!WkAmg5fDy_m?U((%2gDCQWXe&u09KD4#&m>$ZeQ ztvNNG_A5Nonqj+LXFaq>HC6r{5AxRELF*z)yrq(-w@}qO#u8G&nnIXqTEIu`ZTijL1qG3B`@G3H znEf&&hnu$jPP5NXK;7lwG|X%5v)t?R$as{-o= zuMyOuY>nnx4(>p6O-O65(@TJ=Id(5@EAZrzXH88!(bJI76`*wbKd8e)Y;pbsWlIt& zOI%}PsuCHOf&2cO>Mv?3Qp@1@krbSbDc5&@J%A#mp(AjOhnNkwg~_8+!Wp3NEVmrl zM=@mF@s6Lm@LqNBvG6=k*yT+-^JXqBQUN_Dz7O8tzq)&_@%a{qlPa2}zk;titAR$U z*7I|hWlfeWN=@+KojuNi%DoPxDvzA(VXhU^PtMmB8m2anFDLivIs)myOP_gJcbnem z{oo1)#4GEfXos6urna6aXbp2wdgcZ|ZUI|85zw;7vCNWL zj73zNHsVO04e~T-F3nzTbLyZ<;;|3OkU>&wk{`rx&SJZpwBz{rKnbJ+-u8dimOFO* zm42&pw^kGwc{SO$4TvU-nR}WUr1R>RXg2&z^b@2b)utLbGpSEwbXwt7b>!b5vIcmP zI-|Zkv!kv}c}}NR;Sgx4&U3>W8KUTKRqcZOzw}mc%>$rFk#U(?{w{woTq* zuaalV46J##DUQfG+;Z#{)za2LPGT6@#REsiU-Tl$otr~znn>3x{Y(I zR71TTXrf~Zz7-*4=sSJfp}NmoR310a)x6r@8Lq682C6ZeS!fslsEcWwT^%FeC+&)g z3cx+VwLSu46Nq<8h9_m->l4|IKr~@DA<*bTC$#KN=tSUMzK6THTtnNYe-YCwUW1QK zwMT(2=RTnryf2t*py(F*J5xBPHMS*jXuM&s|EnV_@QO5Jm}m~vY5R9ebQD}F&@>&b zDyuhN&ZX;tS1>5KgvTew6t+l28E?N3Rk>I7dJ3sVQ*Qg|`SM;K85)1!SkLqn@DQ$qbuUq|MX6Z`_Xl zB@t0LSce9MAsmy$ZXTp%kUN0T&1(}>4uef)-gxERZnBr@x%BIGN_^__zXOKFq-Xg3 zWs^Jp9JKXs1a+E_2_T%Mo+EbUJLB$O9mzeE=2}C8!ZLkibbxb|^q2lI&U3MET=QDrm7T zr24{N2Di-;UR=in8rWF+xmZ0h8Y!N@>!y=v5@jt%6rL~8|J66OBwMxx-*WRiEoPqutK@goKmVxGDxBo@rlySfm{|7ym-Y1AcQ^9W z^baT9Y)8kdyZ-dfXe;>V>-?{)eCIaFV#!-^_4${rdPrwkPD?QMyE9Mv zlaOLpc;qmD<=p)mp?-ZG3ITNb^9RdcF~POCy1?~C!tn#0vcjt871|Sa&Q~2-4;aU? z2Nu&oRMiLyDy^Aq(gf)jkE{BPP)m93+YJ>(i&o`SwxC(as zji|chL%l&}I4jbAbr1?Vx~()XC94+VzO5IIw*e&5;-(%AquHAyZCk*lu~gFBmsT9; z2}z^}HL6{_#R`sF22ztvWt1Q+#5=aU7mZWBz@ruPk)LS1s^fQ|mP)peifA>lvi@mK{4IIuBek$osCr19#HB%9W;(bsQ_y5I@(JI2*|B3}c&h!?^rw7>gC|91 zqZx7LkX_{sJ46Hn0hD{r&u<+;3(W3^w` zpP$S#5ci9gM<3`O(#h1(190{hg7i#JUP$*mvS7o=v=OPUO%Hw~)ar6sbnx$F{IAij zu+jarV>X<#@jZo0i&`EjV9fQtID{IVrz8e(B= zY<(_PthI-U;&-9;_P4Cjiub)P#9SwXy67u2ms_s(rD~h`1azW)6|dE;Y8aJVI&c{t-fo>!_ONoT_wu~=(<=^pFqMhev z@x^|^p@8rW|3Idkv@X%hY#tyWz~-U^I_t0H0~`7ClHC%nd+4icD2x82g5~F1T%ki} z<=QvinOFBY^1^^&L?mt?ht7z{w&oB2A7<`MEtNThg5KOK9g5=vx)ZeZZP-`WJ-$Dq zPPH=BXM|Gn1|FIxCq4WseUs&tHYHH`GI0OLziOn9D3X~1TRWkIqW)fOFUS61XDQUU z0sNN2isyP$`bCyY)1r4fi~~aZV{(w>hSbXY2L!Uf0uRF~1Kb)~QnPDzWXox8x!~y7 z-&;ls`%_N`*RMZDl2Vd({2eIBbnD;>vRcsdz~DyLhCeR$({*~J$)JTg@{^9490@gTf&>(LakKl7 z&{eKII1(qm+sM}~ku}`$H+FtYLsTGFm)QjL4M4APp@ex=&a#qDulfs1?^XlP@0#yn z-vNi>v6ep(a?ozy{Y*9c?G1t^64S5_C;{D9IHK@$)qx4MRzUtl?oo~E2CJxJqU=h; zdn6X?Fm6QYx^}Q?#ti2RY@#!qfR7Wu>%!&Gu?2$7{Vk7Gk_3Q##GC465%0#L2`j1c zEbGMW*e(gHoFx;`um5aHv1Rk6CG3bkVv;^1Q3zg11%hF~#E_g%_QQkRVe9$+L1Epz z5)XIaaAUEzY053IyNjs_k{i^^NLJ%oryK{M`s4RgkMi84KX9bv#zd z7vr?W6Tvr>xnG(qBY`*Vi^>p)Zb)yfq$tCmGIWmPcQN1|8XQ+ucU`~~=D00$FkvMM z7-pN?mVG%qp8rtv;l+BqR!%=h=SMwp6y?h-5sQ?Rl>h#WSO~%>Hzs^FrBXYnj}@MR zviu}&A}C?|X;B7?icZFdr>1Rf(c(7J(#45a`Of?9)Je(xxl<3Y=C=Gq87EY(XQBUM z>o+^GPLQe%p$Zt#o-T1-bYTFKn|`fR3f^sx>{BMIFMw(;VX9J_j7s(<3VwhXX zAd?y=?Zlu<6A35WW+;rdc0QAbNio{}uUSzXG2510}T|0kw9=*Fd&Ddsf| z#6#jM{0s+6pw!iz=$z)PA|$?7jOtQwH*RvZe;Hno`gVKG#JVQ^``gQjOx==0F$d>^ zcauRe8XfVB(fuhjvV^f9!|hM3ma2D@P(A0mIW^pH?FJBj2_}SLB)G+k$|CHjDG|q8 z?$jM2I64QH(cm5e<=|9OE_^Xg*NH?v!KOTp3cVNC0Fm^N(t?DFz1^d>j=^kFHJMPx z`L-_x_exCeZo>PUki$8?JDhI0F(L5(Mmz8ogFGNN!=J@se~{G_@AB_`Z;Eer>`oEBO@>Ui{`x<=^_0L zJlSj?|LGz(%=RA=dFi~RrFsC$N{(zOry&R{#Q2b9oG`vxUrv%L1~Qi;<8;Er*%7-T%qKhW%H)810oS{(E z?p{oH5}{6RarK%2RAL4~mmi-jG{4Uvvx6J_@Hd~&Z242HIZN^n8AK0AdE$Lq3CM6L ziG&4p1i(0wfy``Gs5IBZpUBGCvR!i*rJ^+^VbCo8Pe!Wpj3i!2r>v?Z2JR}tAwKd-7|pi zUSpSK2T#XnyamMHb1ag39ceagqn!!-gnhb|6jwi-IT}EWmM|v1ZG+*kWqdsM(o6#_ zM~0DMnvL501fCac8fbxbIIv~cWOfqlSO>g2hXSMgwdbYwS6{t9dsiF~s;*+XyQpl# zr%Hm?#G;xh%$@V1w_KMYDT#nMk5H6G{pYQ1XAiJsFkQxV?5ib~Fp^O;`aCZ_@uBG` z!}wd|_z|M^DS)z|iIQcGg*e8W_K%H?E$u;l=I#xSO?+YX!&QG!lKqhti;RT~nuC6V z7>`Gacb;KF-5u(ssXv_)o4I~<&8VrlcLcjj+St}srGW=~n<+c6g^53u!Lnxfmg+w7 zV!-HBf?CCOSvOVLyZb!b?zI(jxE&AF`ehiPEC`zr(rB$w*_|A(Fg~J8IRO|@U}hS{-Pl&1B`%r-x&Zngj6JLcik75}22z6Vv$`7qbN z%;v8OvXu9RJrXm*bh6{e~9)EPw@7@zDv$0|_eR$c1$ z7oZyx^LppTu;g zf~>l*cF}huTg@O^CxOa}4CA`BR6T3}sw)UHUM1}7(~#NG8s-Q*3Y$2~VOk+-IEBj@ z5@wHq;zI80_dGO7h{K*}P{ex%f5fGyVhF92(Laa7Qffm5z__k7S0V>L{*EbS= z5lr1Pg^HUN8;R87y7&Z@*Hc4OOBsE6rZz;g<3Ay$ZXV};D@R9Qu&@WeNW&DZLK3Vt zwwr|C`4w!5RuCudar0f+WuU?-V8F0YtF?ZhSMKOZ`jI z^nMNsb1M^^{>V0O;vDs*^#1mvNx@@wc2x_VI6Wna$^D1=rSGi$3$Q=P*MH&>Q;UbA z{6<1M&8IVTH&a@79vM>G`M6sx;B%a=dgW_lNq3rRiPdDT5M^Q3aoHa_r zkUIqeN-=a|4jDts=4h!$e_fo|ZS|a!BvR5?zJ=X$O3EO69yIMPcc5|pBAHnNLU8i7 z)G)I8ao$rS@?v;Rh8(Z_dLuIhc%D+68H8={!E zcaphjf9Kig6*F>4q5B?_%yzOG1K0HRcdFBV{((8U_=IzzX|BGN_0GkH@M}b`aYqV6 zoQOi^2#v+pPTJ*v$<~!Q60kOYS;f~giqKeyiH9|TSf`X05jbbZk?a+n;lHLl_((^a z(u3~Y6n{Jbt49rfndWh}P|L0Q88eXV)&v0b$Q!sl}sNo9{$rQ(P1A<*khF4qa znxj37-ZcQdK+BBboS{El%fRYYvIaA7Kqus!j}?ZtSlPPRmofjKvSNvCUkGC~jKy&z z!t`-?nz}>79hmQjcZv(T-BGt)|CtHk8~4oPXpAwAcP-k%BR>3YLxXFK41+#1o3Ge@ zW8BA8h09mB_p26dSi}{d##SnhubT8bn54PIRWP;cxmraN(gsLQQt1Xd6dU~m5|bwe zhI@scNm~m-pMwi2We*lHl1SX~gVjDGZBjEbM~f?udF!JA7P1dWb;A=#KuI79cg9ch zS>6q;Q)~2Ym;a>)gG_Br&GEbUnyLoD6ly}4f+sT#06WSb@CJ=k#B*yvr5Fz7lUspZ zD*^mSet6VI|Jj0n@=C8B)#})iaTlr`wXWLL7sAh+Fw_JkSk&t?+_gQOq)*HZ#mSiZTJF*Iy`$dqaU-ckg@_VP5ICr4 zXG?TlRa#A@QD3j{(zDog-rIHAe25za3}n|_nGl!;W~tS_c%h54Fgp^ub4wyp@X5P&=)uMP$~L)?uy6c? zzeVYP@Qs(HdnJoDy3(6~_X2+kzBT&zR_p<|y3>XNFgim^G!8e2kS_BR69j(PJX-eO zacZ#%`X;Wo`(oJ9LI{RLT3E2$MV0lN{G)rcTRI*K?EMI)MpH);0x1YZL8icIy)@+{pT`GR2sRuA! zdOAKSq;WEHD5#4tu5l_s!Hh$?IOK8+fBP2!puvq#Tw{$7>3Ss&t?GTv{bU>;D04e;HsOGF z*7qat7rMpK{rv~Ee^0u-gP;v83qaG>=%0XzQdENyaK#0-~m#bYd5 zGuc$vFpx0pQc~?4$2^XVI<2rrX>2|?#~eRj9vX~|;vNscLYoLU2gt6z?mg{*lv%UydLuCd&*WPYQc zRcXtjk(gz-IC+;9Qhb|gWdP0I@h>`)c*JqVVc_xbsUHxB7-G_nJr+%VM{KvBQfc8R zZ;2M|ycYfT<4I>-pvcYQl%oAzm=PXb{Xf?X6^_MXBQiJFQ)v(tAydWv*J7T7){WC&#d;3kUCM(-- z2l8B(FFW6I2~oBJ7Mi{45g`p-xrA)`Q_}@1$L=4(BOap+eS|j`!6{UbDHTqg&G+>@ zKNJN|Oz8OH3{{!_4sp``6d8X=i%zk(wtY$9=aD(D(!WF3ZP7eC{dn_W=Wx)voOA)L zoMB}|mE)3E#TEYsGb6bzaW5-A4KQxo=<5>=$Vh$01W%qQ9)x%EZ|p1z@6OEQ9!iw} zuWA~b#~g>0KP7UnBN-;~uu`Dq?%fZI|FEl20Nidq&`T*A=X(sNii{srB9^t2ACKaK zVHUD)BJEq3_BovFkg+s>KV9D!Oo18ZP~R{+)i!UUe*C6kHO4uLbHuJ)6;A{u20cl; zkMleB%JU63`@w+>?v6i18JpwiwlfD%D2oN$;qbr=Yn#WLcIms~$>E8!1wT6YVzDw7 zT8J7qWWt1VAym~D-$779Vf7S<)E$B0{ma)DjmFNSN|`FaOo6nP$%e2UP%;%gfo?d* zjBBefVhq&!L?FLMJU-pX{$a4O6p89aH?=sBQNQ@g7&Dvc^#i+zB_?$_hdB20OM6z6 zjPC`VnYQNtx+4G#P@Cp(YEgYq*!LJTk^I8rb4j-QB$wvB{@SpDJ^_>Z=@21!B!1MF zFMp~op;|?MkGk*h1hSX?3C)R+Tx?Zyt819x8h7_x?IvIeD$ozDWOK)>(pl4?UTpXBh){Wm8(32S|e+)R_9Y7I=#+h*I zqMZR>3=bCne2mymTR~OaDqE%P_A8=e<*L~a`h#YmUxy3-@PGa8YR}|q`yf+Oy6tv& zJ|`fg%z)fgMtUt*oVEfw%`^(za8$(iZp-DcxG8cfW0U+d8X{BD`;+wyi{sN7p`95s zfW#9{wz2)gWDFu*TN?2GRP`KUbd!LoIJ$0ne`NGv&7m{4k1K7$ zCE*qJ@hfp3p!pLhW(9}#gIr+GEX6iIzfmS=00+X6z4^j^7f$r|y5f1aSqaotnAzZ} z4>^s1@blw0$-t-LOkq$&xT_~~I6Hm=AgA#!GC{D9co=Sv(bQHwFRAFHZ*aak(eZ z1`82l0U;hxsFY3sg3Y6)xFmgjc87_1zwCd6QGs?Jb8_2h3eD6M-@Ase$$^+19A}Ht z1fb*=z#n9$P$+dp>xshS z^?=8iv4=mbp2x?vYMHa9NqT%6Z~SB>wqxftPaZU4EQe+_^iKfr>o)2a^wFEUtMHk% zqZ)GC`W>WBu=jc2VbsQ_tvoyiH7A|8-I}MOIO4Xg|1{WfLkPGJL zI;OA-z^n(tL8Z^OH*7LJujp?fUSthj%tmi4@)vp4ZNz4_@)qURw;ugRtA4xH=UzL( znw1;m+dlD`C(tYL8?f5V%{MK>D}T$H7ute(YC;_`kPfBVhdxBS{1^C;f0YC>e9&qo z3A$cuu`XPA7y)S_scJYe?&x(At}hIIAg_gcFxt-F6h>QqWT9a-pyp`W_ zNm7%W_L1yk>a3zXeq3Zm1xH%-dlO{}m4P^?WeOigf$qQMXKSXfz-v6~!2mN`;k-Fh$HDVbr2=~Oy zFUwVvGT`ZE76Qw`dYH^wrma*qE13Ccqf^0iZq$yL;?lfUQKuL) z+$1w12*)0OsoNz(rwfb!XJ1fHCS6Pb`!uCWlFifUqaU6C^&pp?#=I5z@akp))`B`k zUZ^3=>I*F}Cek?cLx)#vNsb6N>GA#aQk$4?nAInRY7a|Hi8FIN-Tw`Lai#qB=OjBV zhhF4aMUy^}-SiGM#9bfEH?e7Q+aLvjZq13f&1WL4>dzTTP&g{gy;W8%^fe(EvG?s8 zT((m6cQ;89zI&;LUZX8I%0>-I2q)B0V{f!HrV{IB_~k;BbKEh5j_GcX8~U|a_is?2Eune%T863??{P-SS|qu-dB`RfjRb;8&@F>rQptDz44-^> zSbpN0o&+hH*Bg{*x^u&=7}OwX>>3Px3aC{-60=wC@;`CbTxLLPIL}slcTk$t3trTw zmEBym)L6A;Tgeoe6zMX<7#sXLSA2ko7AY$Yv$uMXtnZlqnXs3(u1^NDi$XUGkAvIr zPJx$rJ@m|O>d03RJPgKOA%VGLnSd0{CJk-HCy~C9a5g49l*Ex?Lp9jx;5qs4YNxrS zK3Kyz)w+UC7*~8?iQU^A0Qm;xgL>jh7Rt+>&QPye{}P5_PTd(&XV)1r{{>=hp;5kD zXRs6nAaCh z>irai=5)7v7zVz^i1zFha1Yj0Ya|6kW+uS21;-~`TUi#4KJt9K z+GOe@^9gNV7B7BblH#@EZLX1|tQWR-mi#RCSq%?Dbj+QBy)a)H-X$>p%rQ{is^Y_8 z?5(F`dX{)+VOM-V@*t7Xc_kmEE3ez+{}btFnv$S9bH!nBH55YxZbEKj-;HW^0%>@t zJQ*H!w3GfMf2-}cT1WkF5%H|sPtZfHX=2+WX0?%9OyRqRlXtWGhXHLC|4jEQ&B%d( zk#m$fwBNDwMOm3<(kgz>VjIg8-McuV#|Km)e`M<=e@cC7sB zH7rzBvY$nok@}6HB3J@Y8~_Xz_BL3|zchHpXQfu#Gz)~?B$t_6jFI;?Mz%V*RrG+O zn+CTbRyapHY&TFY-ll~*?5ib1vEz+C_l4&HbfhYr=ZNB0@KgD9!rNwrj!$DHGKxBC z2K1L=^(gCHwBj@E=*(Jpw0^&3zk5sfhj8mXuIHe<@*gJxZra!%swgo_HU}H4B~hLV zFG5!(#Pi(nt?GvQkL0szvh(s~YU)tTTkh^0DM`;P|KTQ9;Var|yr$*-D2ZKS=g~QvE0pG84-q3BL-i4v>vHHF50F*cw^7^$4#|rDoJHeo~s+d^vFI5uwDF?%FC4i&u62KG`B1M;X&~m$rPG*>yz zOeC(g+eX3c4ST9qO;yO}Ua+DUN(M65TL(_cSwj96BG)pB&DJWmG!eASs{L+%DbNl$ z(l7T(n2b@6?241M8@@*?EVNf}a{eU@HEOu?`it2?3;nfdpck9Q9TOsr)^9Tc~ws4R<$#d4jq2eaB;CS z0{OYQ0s#U%JqU>e#urkFM{2i1ybT*!gz@xDKQb=dQyz%K)lye4!%KRn{Px0T{kQ+{ z<+)w50G*r&F0kom8jpOOCuLnSEInfJFOX@eWGm; zIZS7=U9@%!kx=B*^!fOLJ+^ZH0zVcHJ<7LTkhExl!5S;tAkWGL5gqrL)Fz!S zZ*YC+E`~2`Ir?SiciU<59EfnP?(BFWpqA!tgfND$LAmfcJaDARU$J(C_AN``JcNvJ z{~Pd9ywy@}#QQrvY}DK!@UN(x`N*w`3=dq5Il>&Z2&O}KoROKMIT1Vc6Q)DW!dKZI z-$Yi#K{HtAfw-b81ficRG*~lwOAmO=o1{RGXJT$kq}T}nKKMk$J!IXs3iDmEnWepN zTjtwc)1EW+`CMpi@hr;^5~6AAbjF|N+ciMjy{yXnS?j>sR`VG23;k25X*dpFzf!D2 zr0diLNnRA|SH+u`mc$zdhE(&>D^o8H?8#&(ytd+)j(6ikbb5Hj(D!O-pJ%Q+8sx$6 zvc%-8A9=3VJ~c3T_;FD@UBLNRd0*Ddacj*`EgY^Gl0r zq{7<3y#|-TCoB)ewyWPXy`|4eW$cDvi;}Hqv-wZ_gRLS8mGQm7Q|WcLeG`%8I3SAo zq{}`?LMRo_RxZ#}D5O7tM;v01JHSI#dLS+1%u>H2#jLO5`ST-2g|VLX(PUlISTIU6 zhP$lfrDJ+?6&uCTNhrHEo_KE8dqut`%ZKGP?#227KZg>O`D@bNyyiL~IgZs6A(L%z znK_aX%O4y$>e9964J#5!Hpr9v%wd*pB{0gZqv$DDOvAQkksoTHAMmttu*Qc8x!8HkXA9qlmAzxBCi1B54jmOm)h*AIS(#A(Oy*Bctd z>uFDTQ>A;gF+32aN;^7p8F{Yy{i1T`%r8489~E#~F>2;*t|Sa7dV}r^&8f!m33hZL z4-H{k9@??JIeSYq_cRs*7c|QH?LYqX8#Zdh<%;-5LW$Cne3rxxDI6?#FkSy0U&FvM zKW|y@YrV@q+9)^X*`ImoefU)6rt?9$5g-LxNz4HM| zzw0blzx3UL`rij!@~Od2K!S}#krNJY1YC)wpW|9?9`*Xo(U8LiZrC{B(&c;hUE-Q( zPBY&yC1Hw=qddAhoia#H*aR`m%#UIT598d}P_XQasSNB)7BNHOw~RR*&gXhWs?iHa{W@%)WasP zQ3!!;ze^^k`}+y!aRt$AKwAb){cX~aCZ@8q{hl(*PsYDLeIN3+!jw7jCWaZwHSU57 zs08jd`kp-}2D+aHkA`j{`fQ2(d}Fe&D8ZiUtpp%a$d}PKZ^{J#%!u{FM{I;RgdBJt z#>Kc16*jbHc>Ut6kTo=H@w%O@NSW7Nb9H{N;+VIoy?WoyWV(Lt+AK|`OQ6~}qKHM^ zWb*qx0Dy64aKD%p8R8|_eFlBoQl+$=Gs5|Fz@=jEBI$jkc!;dUk*_ollSR&Yw9%q0 z!9zpC3Q?U0>Nu&EOe%CtN3IF+?kft3k8eMTJ&hQ6^9bum925CEX~a6@bVb`-*YVrL z+CeY2Lwri{P$W0icY^6~MW=P+k>pvu%dK6TtSC7Ilthp%k?0-XyFH7=m;wyFGHFwR z@i)f4ubdo|Dv3b%n&Knt86T$4@=rwPC&$2>ZwYoL3rAN6K|}vghEfs)l|-hAMti=N zV#^FgkU!QZO#dH|V%Y@m{vs^XY_=vw4Ao&HF1fMIlifk@8!5Z1v^kbHs^C?VG=47V zcM$0KG&{Fik;K7x?@VTg8H5m%!se=s;*R3Lg}Qs19ki+I61_tQ0p%Aw!7{XxA0R27 zi8Wmx%-DFAyv_UEbE)Y54ky{AeWm*R)BC1Lzo3_{|2W+w^*4+2n+Z$Fr-`r(1IL9U zxc%c!Qy=p_Gv}FqCfU9vZ@RtIOj4Th!nhed+!G~(d8Dv0zPyyxiV(Mamyv?;;mP zbdJlL4U%6O8qQT`b&vBddTebqlXS^9zX(|5IInm4dNR}5OwY)FO>d!xTY+|d8tw-O zVw73aC^zJ#2}#_LaB!K?7(g`*ET5 zDPbD}!aWT7i^ad5&te|6?F-9M$A30g`cu=oTk3eDKPnZ?IG;Vqmt>n`Bi1CrzmD+; zcwbg#7EZ)v*g?mKtDK;$|1Jr0{=%2(CO169k3yH=9fzg^K9s9CEmNp~UVZ$%U}?Uq zS#*{A({cq!5`C5oguB2Ax9radD+(~F4uK5;#c+lFRSi>6kojZ{&uV06!ky=IKIUr9 zo_!26^*1Ay5ER{&Nzqej&NH!?bIMOuPP;VQrt9tu!ToFht*=`sr~;+@RyA&iC{M3s z1y;Tqri807s_u-1@~kliBxr@jko-Yl`?P#4apOnqFWCY1r%88? zdXw{MpA4T3xdqMR@`#Rj>QQzHbc=jl5udJq^XC_L)1#Ck^ngSsmx0c=1Sj5$hPLg? z?!uee1))oC*$GE8*B@Kdrbba_Jaw6gP}79h3Jrf%DDk;B#}4`M=l)h!@n(-_;j=XS zCDrXQ`YYY*DIF^TvP0#zYFUt z4hBqm{$`&TWPqZ3%qMleQKn8<{SCazX%c5qVt$n_mMkVz_g&9Rhu++YeVhn~= zxbb;ha$UOJ?8|#*tvSD|#VyGExkKyO8-2VSmzkg!LRv~McC?8J<>yBvc8+I_=a(+F z&*BxZ$)5jAKE@eLO=j+Uo3oP(&^?Tjx8?qta3I~G#dv446p{~D{kvAfvzs?;#(R&< zPCK7S813%F!~Qii!b!WUBTX&ZD#zS3)VWWYD zr<<$X?mz0G6SqPBZuTs@_%?RUH3HNd<_PF65we5GU~*JfPrrun?oY#q^AH{^M7x{h zgk6g=I$!yn?kpxjBJ211QQ_H%7C2Z{)B7KQPO>J+4Ca({pw4J=O^yoqpio{2DAVmpu~?HaBB-NG^afyJl_zX1%9 zM_vRumr0T+t3h<6;(f9?a~27WdR0-GDqiP`UIsK#g7=i)O=$MJk=y%zbzg>!S3RrzgMnG<$_L)4$5bvd>-Jd4>HH zFFvWK-eVZ*GT+KBWwEpHsa*yb;E;e?AfFi>KSiuf4nGQX>cM3>n2> z;y>w)9igHoU!=GWMax(3IsbbnXM}9>vQuuJr7Q#?Z99JR{&MwFnJzOvGotr2`SbpQ zd$&CV1J3zml6JM(PSB{HA}*+=@IuO~b)a|>?`Kl76tcVIDy7)b2OOQq7rb5&ja!MR& zd*m|1HwdV3f<<%Dm2*DB2eGaO(WSri!xs6l`8wjSgkL}SpctS~?#{sf5bqG&%tWqG zy8OiJby~pRL~GE(L`33Aj`go4oqpMBi52{aMJf><0TzNdrA9LMy@r_AjsDDP`EPNCC}4J@E$bSZv~! z+2r@FowICxk8vya**7pX1?v6F5)ET}Lqo;5Z7zFjrjGKhW-HnNoPV#H0v8r)5C2?m znW+f{W;oXEsZXvw^ftA;HFU^4gAiMWC!b+SM z(R{HP6f8_72d{TQ7=DO(WBq{rvCrEnQKx{58;FcGKT!(i@wT0Q{gfhO9-Rj^1G!yV zFIuXIZuRs=y$pj8+nRwHrUkW?PN?wM7BxF zPru8|dS3=L=*K0;bk=8|;zEXurLDxnqsL^?EiN<9zyA(?0u6mAn;fJ^X)w*M^IM10 z7XGu?@wDyAB|1ay*~9C^gFOn(Ow{GiCdBe^k(@PA8h27u&DNVS0wFsdKcSW@)$!zGm{+ES0VoxIKYd59!u)nR!vba~c29j>TZo zdqq4VJqoiBwf%MezG|3=j!N*WNur9*C7wZJx3GtgQ-Ck%BSS--Z(JnXvb_5*eoWCL zRho;L6DzuI6iK!1NC|{HNXB;&+sv{ie2raapg+xa`>wMc4VxBt5{e=XA<1ntdb23x zQE>-IwNnX`OzHvA;!io>n0E8<fHbGSpIp3sW-My*QRn}MOWO&r`=@Z6r};E4$g*E#pl3iI39xcBhkf?!V? zuwhi|M}YZ#pF_gFnOyb60?8%SEC{chbAr1mxqNzF`;oHh%lQQ1P$PmuwU*uE{t2JA zDK|$^;lmeBPkOghl7db59|QCt{}?H>w9X^h0@9f+TeScV#0YW9P61j`_7;L0T{j7y zJjlemdk>9GY?{OQU`4hOF7=6jb5N0B`RBVnC2C>Q(<_&Tx?qIyGFF`Mi(d+`>r#1Z z2ZqzcB`9%fuYCc~9+_LQ$PNFK71UPK+aZ{><|N z(YV=MbzKPex#PX*mtR5>ZdoEWvtt8hL>=H_^braqK5fsVUgnqGRs^G$BmTk0CQdrG z3QtL8duj9TP`kAVv{gCYP+$`A@oT9nPi}VeU1#V{*%@eXL3CeL{MCEQ(ETPcN?w?J z%+n?oD=4i~aq86`L8{&C~t&FsP4SK4Kg-LFu&tQ8|oRs75>e%fA^#+%M z6CyAQ!oF~=4A_l}|G`ht<(KVP0O7ic`b~b3#o)+{C3^37nRl;BQC>d9GeyBNupKN0 zabVr?P&|b^6q(BnERWnHi}W=gn|!|%pZZ|k9iyZDK)g3xr=^RkPEPj!|J@f}%j|ZoGwO%h z`I6xwS=8GK1>qhN>!>+k=Go$<=cF^GBNw$jW?HagtD)eN$z7DY`}WF9+Q^7~6R()4 zmP$|V9-~e7>z}sofQ5PF_ARhcoxw&8UvkRo=5^r8#1b;|$U7BeRVgeJg}nqKVyf+( z!B1hdyziU7b%x*_${Yt@%AIz05hA1)rABot+C9&tM@*f(!nO~#nnfMF%{jgOuITTw zd+^=veoIKeF|{JDNU(7O5{pQAewCQTWOldzxJWW?Of0*$ps8aw9`xe zQk&ZqGCOt67~MP+`Wvb@EMYdL@RgSBcR}S>7CheflNe#S`L7ODZK0EstY5^#D8 zbw-nehhMsyR?Hm+vCe(m=U%PVOS_&~^~u|WWGJwS@fW!03J)6Nj;GkUSh3UOmAA-Y zyh>hb6m1Kv34)qC^}uGwDd=@i{N0~p>L!$HqIRwYS&y9FeH4!+G~)({WY{n*L}!`H-4i3JhE+C-Uj1i)Zng9be3Tl0qEN zgn66O;8Ga0lA+oLOtp$8-)gOA)>e3dR8)+hed1-dP;V4l*XWSMeTu>Jvx0?ohk z?HTxA%r!NfKK;^aJvOSSI$uRM&es!f9#PnZ>+8iNH3+H>r#W?V7qP2;k=jQ^24$~j zRi9G=x>Ez@n(jnxg5ev)im2BjA@uSv&%#1$C_8*WCX1sR;^?uS1dVPV34(67qjMx&Y z{-d8re(x?x=6rVklXV75TEzro%UGN;xhR{8wuu+!mFV-N+vRoeBf_HPW{+WhB2`_# zWSYaSpI;>2=p(_12k=Dp3r3I$70LM|$X&ZU-$I4SQ&y^Nckoqoz{Bo-B*opTCPD}Z z-2H(2I&c=tLX$E3CoCkFE$B*#Zh_SpPyKz}<%iR4eW%~^%b7DeMg&V58tUAEMfi@Q zz2l}w_Do*2wqwA!vUN!*ROuH=e51 zVcJ$Rv~0C!YFpyH2~H+EGMq#LcjSbZD;GQTi5RI%c)X8tC>wyiw-zyk1*y#8wirb^ zYl*96wui<@GItQ1b+Ui29{e{&pL5TCOfeYGn5!-GV{_1)`kL8nU5fu&W?0dyu~@;U zBwKeQRCnD8)h$KHnCtE<=sY9W;{KJuU=xNKmmZ2JO#V`F6#udA-@aW4dKbaOQOPlG zs$f-ERV%kd+;m25@cV%bTHse5Ga;=H($t-+)LRH8t(RjZpR*IQtOkk8g(3*hX~a|6 ziY*!pQ@=<0`{k)|eBPpe|H{v2RVUtFTN9O@sK#~xE3ZV-XSfqzdV71Z($#i@)Buyx z_832v4s9s1>aYp8P)sr}D5s90)TardOZZJp7)F!!AemK7bAWu$-9fj>dTpQzOQAlb zQj(Gp8_K&OFa-0~87BOhjZHyB1l-o2t@_;t0LVML>10crXlXgAf1ytxf+C85sCbQ#1Y1p0rRfDI-Jb*uGH%_WSqm{w+du&jg^* zJO_xL;Hx0@3`A8dPQW~0VV5r+67K21AQ#kHU5yGler8}mSsmlGJ@o-F(E3dU0J~}R z?jI!tgbnIp)D0L3fIx_}y@q#8WkabuurgfQWC(T3Y-q zEEof>hJb_xa}(dvM`bun-VTtGu&t-NO90cRWLX1wN*9#(!RNQBdK&Dp7(ybJcFHki zhZT?denmw^D!mh&9^&ITSz)rWy^S<^af_c{4tz;r`{7J+cUB1rIw22yXB}Jw|MB!` z9sx74g=GvaEgKOLk&KKCR#sM^QV9Kw5wFgwulMLqp52s6a*e`7#;MK&SZ@}b66;DKYM1h{sh97=PU z$$rjKXS5?D_+&UOQ<3^c@OqKX>pCOJG@Dpkrat%C2VY<71?+qbh`*F9IHk@Br+}|Ea~VpaRoNH1R5A{j{+%p zJ~A+JciFjeO)?NQ-1STjv{>rjJ>3GsLUD!BliW!0+wK+p#JQ6PX+bZ2Nqi%0q5%)MZImRs;K z^!YC9aQ0{6Ly(s^BC;~t6p~O>7RSM@mdkRIJkh3ijG)f_o2FVRl*`PkM66FL!`mV3 z?BPf7v83AMvAdLKJ-&+iyNRAvbzlH-o$2a4P*zWtFP623mhDm4Ks*%--t-Kcc$DB+ zl163SQMP~BU^c#lmd_h~ZJi&(+mFLB7RY!z>VJi7tYNiZB!W-PzxyA~e>gGtQ$*Ri zI#2)dExWwFwCwFu!QMJ6e;PnOQvFYXX6LNJ!!u?a6~ft1$m2=N|C3NUCJ=OwU3`A{ ze56(oh!%JfbeYqgb_L^^e>mLqiJvkgR|YU!2)pWx2yoWINtPA#7;e~iaqK2!9?-7% zJ?R+eaQMI(?(rA)DLLe>EH+Z8vAz6VPi3s&^>}li>6SY~3w6B1jcMXpE7s#_Cr82y zi=9t>Ybfl*v|siaULNOY@6SnZkY0@}{e7h4m<8K1j((%aF{*|mFzsJ*wYc$Snip)C z>w;DJtCO*Nl1vCy19M6?HiB(5(HHXKy*%y*=27RGtmuX*np+=cCOWe^m1}RL%3Zxn zlv7b8T%T>OO2`dp!P-6`Md4E+=!KH>6?;9>fEEiTb5s{N7ge%bFu5BiUZaua7dPf4>0p1Zkm@$*NzVI+p8r*DjLV3Z{fkJS*F9)RGiv(0#w*iE?Hp}{*!NL@f|irX@vQ;MP%hl}N19&)$qs>`)| zrc~Bxa#zQY6ZvyYT_V;QJhijkA%d!<5B|7lgIm?Kf%`haPP6~zRFE(M$~i?hCbjBn zcbs)yJWe-!sYhyVxLTY|_&6D%^o!@=>Y4-hFVzGaXn0VHx#dUmdiuJEMA*-$K3WaL zQehpn#DwX=yi?^sb~1T}=^f<|n~L?BcTPCLZXr?c1mO|xl^pje2>yJsBif|nWck=M zpZn)dk-%Cb;|T^bsU)RfcyY47ML}@ibS0Cb-a2SAncbcnMxX5|+Pes7RALN0Y!H8N zkbv61BX%(aw($dFm|%<;XlX34r9Cw})Oo3m+T+kQ`FB7{z|{HTRPktj?p>~6uUt_#l=fG*ZdBC74T&^QpXb8gVEv{syq?3+&x3+j!o;M9+Z%JyPk;5K0AiXhc+ym8nE0PYdzM~0|N$QR{jQ`JlRKL-I=rfZwW z%o-vOiK8~=x`uaS^YNz~0PpjRwCxx%^#ZhOBWCxF^z}P?dvEdZAf2D8C@ZULYTn}H zR3Z_El$kZUEjiG}L!aXG>v&=7&jFq@`0||4Z`kZdLl3C6)GUiXjKFc4a<++;KqZ z0i>_diMq73GzHZ~Hg>?=47 z7B^LUm#822zZa_G>EQw0Qa?_V#TtDFBuQ;;ZS*_$ZaB$*FZLJmv5Y6@thKR>?#3_AxH07{|G zebNB*TvA*dTh#jLQ;xJB)VX+bYYRa{1pNy@<=!IF;MC8O|0Qbqm{f--)e>NlPL7YC z3}+H*dt+^Jb4CD>{l_Q&hSE~50J+|NJU}WmwIqWBYB8+-Bgn5iJ3A95+a4JkL&`N* ztsOv#(%)kOlK0@Kl|LmLzv4i7K@uy$8K03zCF zZDYey=U{8Q3V>DssQ5@v567e&K)FSeG7bv>G4AcFp==p?zWtRx(tf;q!NGFupE}BA zEYs@TS9(8x*0dZ8d8{B{jq~42>JAA!`-hWZkbodsQtJaHAf3(+P=R5%kyEbtw}kp% z@={Q|2G!r?>0c+nu1@eDlaZE=`02M>fTnf3x(oz`kmV+>wjL_+evT{$2L}!XJRvNq zwyv%N0S0NyaPdjNwvBf!g8c7`sY3vn1OQD`8DG$llS_L4qO3^=)muz-^a((J{Q&W8 zcwhiiN{U2E`)t!zvu1%ZtgvWeYAVWm%9|2t193KMsI3*3l>9T-LgTT;T73&aOl${P z;K2Fedj&YQ>OF8gY#5$%o|B{FP^N^Z$RYZFi)0K7Slr;PCE%A878cgK&b_R-#m0tf z%m}EKh)!^e39B{>WuQY!VCbhVLwJ&Ojf~)*<4ac*RD~M-k6d+h;LJw1h$uOE8C zyVdGyf&R*I>^?%Mp$k-T+Kd29L_$RL8CYKv%MbwkGhm(Dx}6?60)UbF9YXyld;9x7 z&!2Za^T0RCmRDG%Uq;`Qx1@pO8-o&-%Ns1*>1k7Sg|%P5h_>Y}&rdu>oFnfX1HLJU zq@X^wv9Vctm}1uI`*m!LJQY$=S;^u#gk{I0dlhN$gp7Y627uMJyr4V}eYRxgVf+z*B*W5$0{AhkNMyYQ<<#G;ot=mJ`XS}`_4Uoo&1=J1 z;0L4zBO@aV)6+zcr|uF(D6r!E!@+#m-r9-@NZ12>cNVeP((-aZ2R)WMw!S_Uxo+Qv zzQ$Bk@Q{+e0{wvW^yyH1Qq@qhYrZx3=CY~6_9S=i+?igwqNb*P#VBLi79de5oi1cY zl+I`Q3gS_~&{~aqYv{T>-gRTf?T4j=0^4YLy99+FdIHSoeVyErds!d^udJ>*KYbdq z&`Yp=cvnP3zN!*lUxWG7d9^r@2L5^!Gd+C<=$;5zLFhN}Nf>D32t@vOOsYVPr4@`m zGvB`nE!VN+hXfH3PxRztPpPLC)%Z5i=5PS0j&e*mQRC#~wCoU@Ud$JU7*Tz+AA$S) z=oiJA+QF?)#t?G=xGq>{T|GOqO}IRr%wLCwhCV%8khQdTn{V|4B-8}N2Id`su_HGZ z7liK4!zzY2g!c6Zm<-UvL&F}px$Rz~nz@n2%K_)ddw`aja1n~_odk;%1Y``yFhIWo zc>UKy3jk4_T5R|D`S}`-e3w_5EufMaG%l*sF94_>;I$GH6M@}TM#jv>_ec>KmKMZi z;%e;v;UN-%P?{N1V{Zi1>A=7Xu!;X39)fd&c`FXHINRh2@RkX8i2!d8&xahtF&#ln zkB5hc4v{xc7_`O=RcXEDGkNq#sn}H&=f?kbi$0`+1!LX{J}VGk@9yqGob)Uea0v}9 z^FDg64};tSfGq)7md2w*8g#`SxvPX^HH{jnjX>XTb6Vgy_W)iEC0H;1mM7F~A?=ilC-!L)8Zct{L>mDR%%Z z087L22fp?wcG|agm6aZ{MQGUqpAy3dF5){2ualC{yv$#4C8C}g59P=)Iozn;G%zxX zpyLN@XaPY%9MJ~A{PXqm1BoHV{IauC(Q@H|rY4cG2S7Yyld8(fh`6B1;T3^QFb7aF z`2!LjAT)iQxNS#*LJii=_jGoCj!B(YjQYg+VUM6mUh+Njc4%@-HL8B*+(>V9=S#+C zwd$Y;U`qX|CN~$5`eh0)hgbprx7GRA3wI!K+GkZp%vZ8Ls zQ-F~3A`P5Yt>3GJJb5F@ef|nUC`%3G$>fLylrmWbUe9{!FuMRn>Uq6Q}(jdeTv% zLkP_pw&IysiFRq7snheE?AP$>KkdR@n(+z*n50$d#JLctO>8E>Y0@6N&~hTCBuVIa#Qe0L5hUP!nUFYJCpuM#ut=UfytZ;t*g_)^y~}%ak60%WaaQKLMaH zFeu#+)Fr-As?vp1mRQrlMa2E`8#WPEw0$3T&JLuzQc_U)Wo3TZ-1U@W^)4%jD_P(zjzR)Y#zPv*#Epfc ztZu~FQFW3BF?ENX`J`XAy-CCsYr*nW&t;uhUkO8>yZPHA#&lg3W3JSm*(HM{_E81y z9_A+(G@bvJ3rZX{za>*mn94Qo?2 zwfzT)z}f4<*!`$&aW>h7b)lEfcY}8>md&uICJHaPUPf3kzg4)yqWn!n|8t+1uN0jX zRW*5^yP@H~$#3_aX6ox*>L$PhK{GI3B&--Yh-HFUFMxT_WefS<@7}<~LS_UJf~Ip> zc)onQq5ASM5xq^+_xKe7#hSbR$0Uj!w{GCRqk|C)69h@cxF~V~cP4&L`F4^wE8_RQ z;Z^Di={#7wb?5RxE9AC%H*NUw(Z_&=lB{IAAKo`>>`ja)Rm>+fxkIGyYbC9Ej7oVE zVCQcZs1qnzF}yFXCEIQd$;N(m)#P8n!FzAHNymfd@Bj7D#$o8x?@MEaV$*us`gBSK zk%YHzTX!xD6=g&I4%fJ3e2+%&j@R(4h*PV$%QnxsQpOpZ#Z?{`J8n$($d0Ugf^WAm zu@IAc^LmaY3#cp2+b?IxO>Gl>3D-bNt4+<`KCE0pExp*C0bc=47M2;tUoOm#?ApqW zySgHBJ(iE&<70f)H#w4W>!0VXl)~{o_r|W*H%gmGN;PryC|PbIGwjkZyDVQ;55&^( zCxAVJ>Rh7Sj}1dSIwg@$dph5M*+8Xs(rQq9j=%a$J)^8h&7-;>WR$uD7Zqa=~n(%KM*aWn|*g=@qL_8J>Y!qWPi z5iwUgS8ThS6-<$LKRVvf$X-{`8}}x*Nmz+=`W`2A?rB`)r(yZ}(WmmV{hk`0%@F=U zY=GLrQDX$vT?X9!`ZPEt-MTLW{ZJLU-6z+Qgj9Yr z#rrtR;=AjD0{}$oY#X{U0O6E_Rk(d8yDMz`ba#24P`dmXi2`w9uI_*nwlu!#VZ;%VN zBz~1C9D-#~u*%J4q_r|Tr_w2$i0oj9=vb1Beb}b-z9?D#GYLzK*B#a2;o`wp3KwP3 zJ+%ddEyObFWpFO~74etj(z_)UnOmJsD{r|{b%%$upSi?X&(!yDh88=P)umHUs&J3t z;!*UB`q+OC|3`^77ZwHG@Pb{WSeWBBJH0qM?%pB+_f6KiFl|fDMs!_~lx^IZ_>y=P zA%ofa0v$Obc;Udm!_oNawou4X_D3%)OndKAtXno-FiB`M*vSRb&o!?Mv1QO_flvC6 zNKBeaWWKfQ7}jkOg!AIaZe&J276?!I7pNvM+~hJ-nEa8Z;Vxf`(!1Kwq6t%*tW_r@ z4Z6ANPLY8oo!Hkm`diJNJ*i(;40A?rDCRZ=*j3uW^DnMdMdH_8uvDkZM=~(W zb)*Xy93zm)_Z3!#a_&U3Q{9BXOW&0~2_Xv5F%(lkTjD(NeeAJ(*RN{8Gn2JHXEt~t zG1S#KI2Hv>VR3tZzt%_9WiHX%k1@~bCp+D{Ol zak!7uV`(s!1|CT`lLb~LlW(?JgDdK`b+68hH(#^rT}t2YPA0WT0M3i}dJn7Foe`0W zZX(W=7?lI*J4MC?yW;WfnFy)S@7zUpCap(aZJC?(E^dNbv}~z943XypUsucn@GRH= zFF7I}f-8XgpwWu$mKB6L_wOzBWJ<57PQ-5V>wGS~m&%&AtAthY>%Ffo8%X)Er+Jv$ zimw`@01K~h`C_u*J{aL6NL!a!2X67Y9|h1VfweAL7Gy6JRi>iKr!?|(mba17xKEk4 z#Yy^&HKWt7!@77Zk_JfX$VB!C)H#j3_tqG1aEit%()K16aeA}>Lw*&pu*U|pixE|9 z?#3*f7Mn54HCM(>bhpB5I}^Rlae$+TDpBDEpv|m_=%mQY3aB3B4#sNWGJj!c^Bi6h zKsE|+?uTg$#}|ArB(4Y$&;AsoO4gR6#Lv(#$U5`G}wuRADQ$4d?$-|T4XA5~) z{qZl{`pqk8f)JEI!tgsIiaziD^ENt;GssrEs+G6-a|SihB23P{->2{88jKRcBOh7q z(r=B62dB#>jwdOS8KpuwL<~$)`Z;*##$xj2@7NLC6a(ij5^XKy=zWkT7nXqir?&O; z9m9Gptw51y?3>X6`|QtjQnNpf8uH$V6mS1({x`&=%#f2yh+0cvOpqyk+dE;eQrD95 zL@uPo=kRfgo%zH30Tp+r;ZAjYx;qVohVJwAI>~`FnEgUw;RaM)7(>b=APN^K_{L8q`DUvf0=+NaE;!m8f=ldjMNgfGihrI zG@rCHsra5bUhdS7HjU!dd9V$6U+kD&U+CdtK8f=acvi8U$TeyyE8)n{&~*LO`0_zI z+Kh&pAuMT%01SO|?yQI#5QbYdRBh#R&Epd>`tdBXQqIPZx8&#Q4*k?M{9f;3kvTx6 zE_>Ft!uAjWWX$q~%MOHDr%_FN;aX+ue(@^=hWW^@(W5}^$Jy&og0tHdD)FV!4c2GwaiO_=On*cEf$VMXc#(sPYBWp1aRB? z$h>gypuy+(B`9iiusi^9^aAgbjiBywc8Maq+P+xDSnlppy;vhXi!YY6s^)pw2jA(Z z`uL;Yrz%8#4_qLm9@cXdnCPl^@%WWP{*`6U%G}@;sV_jX@eCe{jtFNbrNIj|3|ZbT zcl@8;&io(BH|pcF8)Gan*2tDMvV%~D^wXodc@X4Iy=zdq*k58&TZrtO#MUwKY+i5bO zo&6|a<*5GWv&W#k)%FvAd&_xH)iTx<+`Q?{%R$;|6Lg^94V~O({^NquYjfM1${&KU zf-Pg-=a*Ob_WeQ6JW@=RQ~yBDlJcK3?3mEs+-3@;5}pe{54D?6;q2>+=-(G#moB-6 z#f2s-zFMekt&eE2kX_Ey>|$Q?FQk%g_=UD@fMT3QrK&Ibcn>LOJjIxE*lwj$$J=Jg zYYxdbcjv~LQd&mQx~4Hz0TBl2Xc=gUQ~Vtz`pn_(f&wL2)#l0P4l7ZO5>f~uzGi5H zkN)R-%>`#HG+nZb`U6$2xmFlhQ`#5JsiUKAhpAd0j|sD(4+D4aadp_|#{5K~OYPx( zy~lrtODEME4Z0!1{+9Z|7x+GDH+?QRJ32g%A~|&L4(BpAJEVoTrkX165#M(Afp@T^ z?dOHebVJsYtp#Ttmrh0RFqu~|{!)BopsI-fp4a{mG2FbT_0g3;pXCYu3(*NX-Li{j zwh4}Xc)x8!&~?g%<(TT0<-A&-sym6?NoXB7sg+w_s(L^~=3)p=W4xf_xZz z(J!UM8G$LLVH&fb<0(&)!xhVl_xjT~9Vh_6aZ) zcNYp^px*Pn#N~PKe0E&*JZju=piY|CT&#S35G?;($ayKQ5_*|6z+{rmDd_40cK}ez_PW}=39-;hXASzMGTFuO_eCe5y ztozdeC&ahE)0xyTzu~T{W?Uk3yJe_*+^6ZT`|(QL*8+uNNJYt6yC0)uLnUdU^&|bX z)tDuBc?IYUkp0d@wW`-Ucl`6>+$NFKqZ<0?Bs;=I5C7GRvRfXj7ah4g=;6f|cfWe^ zx&8jOs0OHIl(!}H?hJ+ZwaRT1E)Qion~?BrM2ZW4xR97d*lpY*#!ljAUdLH)w0prj zS$Ji1zG<&wqCktxgjY^~&*x_kPD!vWp6fiqglL)<^U9pn>e|yL#8opyPem55(-|w=cXqp$yo%&#W~`-{eo0#Kk+ap?%B>Xq%4>Ge>^S7&F>Htm4(zK_q$st8cS z_N}wh#{B+qc3PThjUztnU36@~ayj)Z2JFqKVTiI+iZA$;-+bTZ=ES!DHll^bTKlW> z;SWrc1&9_8kJm8NZxebN()D9!)kt1M!?buG;wGPzUn8~&lC?Y76&s~fLq7G`O5Y-R z1^*6Lq`c2N;-bv@#_VA=BKF)!)5Tb{2<9DjWz^gKe$UcJxFf+nq8 zfh5aKIr@i#5IKRQTb*`O%yvY?q|71wk&UuW&eSLy>D9JEW2T5GLNIeAvV7@h%GoWN z=~@&O8LPR3R%clZqA)F;|K!Uaoaa+U&hnqr&je=M4A5%RI5Kw-RjEw8lqF5L8d9$7 zuig}sr96}#yF*pDMJqAzaO!LK{jUr~ve+pi>uz1PllujNy{ZSif5yKy{MrnqXIHkvym;5g2WEK4)Rb z#0%5dAIHaor#odKcMoaI0{kRhgcdE*Dy4_+A|LDnJ<|wF_uwtF)H^m(bGTzeYq?>g zZpGgWw5~FOSw6Xj(_N7?49}>M-_KA)%>3Zu-(Uy=C5RR*MWT1D0&{>%0#A>2c6R1n z@ftot*niLc_xxC6R+gYn5UmWkQpJ++q&aD-xjhL5eF8GnERh+_bS!8?wYrCyjFsg% z^nsnAbaiVBaM~hQzNs^Rp{nW`0a`ROnoh=Z9IG=fPXkARTu1~|%Cq?3HH3^z*5NUeL zoEJb5zI5r5#}424H4?FsC6P)49uBhCxT=bTFQFaEGU#8RN;D-4t=FShNBz)d^75&b z<7x_b9sZk!@0Gzq&X*)4B=5tss4T`k3OXwc+S{6lg?JuOP$niOCK88?svVGjg^RRU zTg`BG-@SvtQdWZc2vlYL$)y*AgWC-aT^$@kn{ap#%SI@ggq>^}X6|kM+egO^9y_)s zCtrkgx)fPMLu0b7c9-JcOtwEMHP!@^Zya3*GGp5Mt##pFVy|8u1_>FY@P-Cd#M70r z#zau_j8d21j{e^h%#V)LMrOSH1W(=#@~DFYk()axB&6|)<4jB1de+_XR-*D>b#NzJ zlM7@>NL@>uc_Rub_8Pd+>l?d3zrpmsxO?XgD1u|4p-gQi7Hlp!0b;ev2vc z?^3}wiqFCfwYSg0@`4#sDq*3r6*mS%JU%|tTX$-O(JaI~f}@)Oqq>2*8{`+nw!pxje3fU= z-rgP-7IrD|b7Rj?br72Bu%^FqPG)6hB1M!zynXfR)zHw8goFeR2mJ|MJUuCu)*>4uI$7J$$Ik z96sZ^6A|gXD_znce0~(P5QbD`^y(jO9v<`oBXTpVYonId>(|01 zZZ?BIq6#YP?A1a*qXjTRPgq@;4QBk63^|%|1}6R%j~YSo2d=d(x_9JV@7^$8SDM=? z69*u(Ys)U!`D1mwh#ajclBwY+&9B_(aZ8EV4G87U8(tVh&Y9u;)loe>KIdA_c)?z!S-5YE*E0Ik5Dv!p5rI|iy{XhhVPg_UFYTv&7 z_V(LP{nWAfHrrnThz6@=9dlYsS9iER+E~k3ilbv`ZTGpNh zxs9$zPxv+%m1<#-Y?)HRb9dF^Cu)~3Q?JS3@fsUfb5=d7V~)>kHI1~R>`{pq@Jzkk zcqErhNUc5Ly_HfTfHIhI`^DaTQ_tbpD`(1cu>;u_DoZYNwOpl83T4P(S^rS^?`bI3 z1FgNhdt46q=Y>>Dc_G5q`i;{Y*Gr<@4@TLCmIMq2Dr>8u6lF0lM-{RH4OZ$_Kiycd zM|^wLiSra7G;X5#Y4%{A;lzmC6*Q(*CpYKDS#ByqHMhcTqR#bY@|~J3eFqC#+a{7V zR<8-HJ@Bn<>F6sJcQ@Ui`IQc(pBqRbKKX~E2&oMHDN2=G>>d?+%A700v51r^+*8@x z>tbUeC5zE5+>i$cW(GyP3>QZ0=32yxNSD7%D13cp>6JRN{cf7KlYf!)w16qg>VD#m zt04z-+aIV&o=02>@ga?@M4!GmMzKb6{%xpn)T9HWqN0u8qKPsJpbR9rk<}Qt*YTon z7St(OnBH11^Rij0Rqt+oor$&v(>=0*(HfDjbF_BZKxx*70{CN*q*s9}c%o2pywDfH z`%$ron`uC2(q4`GlR3CPR#}ZR)m-|EJp3(~iF$e_cJi0;zlPJOn=0BUJF% zIEFCd%0f1+lYExKQynKd%ql!7kTfL|J72$FuJGKl@JD2C$q62j3w8o>tTTiou1>~(qwpNmRS>(NW1TW5z^ zH8snl{6}L=lR6`n-V7gnhrBHi>t5*K-NL`hPSdiZ)MU79vbq)`7-@#*PyhbsklR1z zOh>I$FJM3?@*ACIrl_M+SyPi&^X3`wS^YypM71TxsYWI1d<1V$SlG9vC2UoBQa$fH z*iSGuED`aH&=V)PL>#AHUFG59!)2c&3;Axlm&j8S{>2lJ1F+Thc6Mh$7hR69&ePA# z&;J9vB!|OUBf;A4flB_`@|?_?y`EE$#OfefRYaz5#)S(Y9UFzu%V@6HdP*?+aC9W{ z%_gR-UdVeZZ7XGUb*vthVPsBwjZoY3L7epa_wWAxe%5~3Tzw`U_Y+Uu4<^vZ+Z!>+ z2vniH71u7y&&@sC)4s-`q!m@{!l40SDSj;%NwN_IYbvjy(b3$Dz4R_@mZRm-fN^tk zb4@G~;NI+7jcA`I<2pG_P3BpPr++S%0C~W9#xBK?4eLdg-I^ zgK7}$nI+Y*3jnFLM)JMBZV_0*U@&@n_tWkW#4cSkj&9Kj>3?wO%GP5WVqR`ubGLRM zC)o(WeqyYu`Vri>*w|Qj0ALHin;U!ozPOVEUx#el@ehumexPc0=&?{&z5MMU(0W;a zNE!FNp9|XB+Jdd3#T@eW-F>m_4_H3n)!=5Q*|At4qvD7$9;zX@xaa4UjKk*<)G!`y zZj+{%@_jV&Wx&z~Pq9ot!3GCne4rb-@90qVm#!j9*a)hss(ksX?%(Go5^pwBewy&X zMipALqFlg-c;8|G#~1*317C$j@8@uC!`P5+Me$2@vJTdtMv4Qo0DSL8ru0Sy1+0#t zjt(hDgmz~V^mY4UD+5?-5fKK=^?32_oSYo%J$qoUl6EAN0ce2WA-yJc31hhOj30sl*s0{JuK1cXUmOmFVWxq7owdfVgP+>q-h zJyTny0}&=W>e)Z3)!cm$5r0p%IecB!6tJsu>yqa&yUk+G)3x}{qj{bx+gXz^EWjzbQo zq1<=x^dbt5yZFz2%4;)N?-htqdACZaKWbbv5<6V8tm)&=d&kpSthvda($wX$>5ic3 zkPkv|DsP^a`sJHEpQBk4NBs1z>rv_bMQhsz2U8%1xjyJkcodjM%+P(X_X%-~6t?I5 zPvgKi^7pi@F-bck6;h)74)X=x^Ps5Ww$#&gF0);?rpEO=3_uCA;NGrqPK{%cpdHQ18* z!ohtF5C7hrA{rBqfA{Q~Hk#!fN-!U4GE&A>peNKp^GIDoXQ9R`AU02z4|LbXs%q?I5- zPc=rp4gkKSloa&#W?o)iAY^V7fg17`r@O(BM9i)*D=O@3C4WGK0@dk%uB^laY^5dJ z*xQ?Rsmz9=!MDU__pt;CR2KzBMU>^8*Becw{~HXh+c9i-klR!Y7@cS^5UkI_%pN`e z-ZE(4V>0Li{MQ=O#H<94RBA7A@gFQP4HeAD$mqP|bZ-ZE_n!v0QU;uX415~;p$h^( zQFWI^@c03Hg`kQZ9Vi9XC_>3P6-8KM0QsJrLus=opPyg&`W470rMGMK#EE~a3+9pOHsN~*_db6HMC*bj&-Q9~zOGUqA5^XiF|2Oh-^MLxm znJGsnr`2CS&I7Lp=gg=yWQwdzPJH}3m{Bl90F|bI5wETe4-S3+3nVvJVnA;cV$Y=i zMp6|)do~Zp*nm*NW