From bbd08fe954366b12c2360068bd163172943a4a8b Mon Sep 17 00:00:00 2001 From: martino Date: Tue, 18 Jan 2011 17:26:06 +0100 Subject: [PATCH 001/347] Fixed pom.xml target jvm --- .../Maven__commons_codec_commons_codec_1_3.xml | 13 +++++++++++++ .../Maven__commons_lang_commons_lang_2_4.xml | 13 +++++++++++++ ...Maven__commons_logging_commons_logging_1_1_1.xml | 13 +++++++++++++ .idea/libraries/Maven__junit_junit_3_8_1.xml | 13 +++++++++++++ .idea/libraries/Maven__log4j_log4j_1_2_16.xml | 13 +++++++++++++ .../Maven__org_apache_commons_commons_io_1_3_2.xml | 13 +++++++++++++ ...__org_apache_httpcomponents_httpclient_4_0_3.xml | 13 +++++++++++++ ...en__org_apache_httpcomponents_httpcore_4_0_1.xml | 13 +++++++++++++ .idea/libraries/Maven__org_jsoup_jsoup_1_3_3.xml | 13 +++++++++++++ pom.xml | 12 ++++++++++++ src/main/java/eu/ahref/Test.java | 11 +++++++++++ 11 files changed, 140 insertions(+) create mode 100644 .idea/libraries/Maven__commons_codec_commons_codec_1_3.xml create mode 100644 .idea/libraries/Maven__commons_lang_commons_lang_2_4.xml create mode 100644 .idea/libraries/Maven__commons_logging_commons_logging_1_1_1.xml create mode 100644 .idea/libraries/Maven__junit_junit_3_8_1.xml create mode 100644 .idea/libraries/Maven__log4j_log4j_1_2_16.xml create mode 100644 .idea/libraries/Maven__org_apache_commons_commons_io_1_3_2.xml create mode 100644 .idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_0_3.xml create mode 100644 .idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_0_1.xml create mode 100644 .idea/libraries/Maven__org_jsoup_jsoup_1_3_3.xml create mode 100644 src/main/java/eu/ahref/Test.java diff --git a/.idea/libraries/Maven__commons_codec_commons_codec_1_3.xml b/.idea/libraries/Maven__commons_codec_commons_codec_1_3.xml new file mode 100644 index 000000000..36880019d --- /dev/null +++ b/.idea/libraries/Maven__commons_codec_commons_codec_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_lang_commons_lang_2_4.xml b/.idea/libraries/Maven__commons_lang_commons_lang_2_4.xml new file mode 100644 index 000000000..5e8b8d335 --- /dev/null +++ b/.idea/libraries/Maven__commons_lang_commons_lang_2_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_logging_commons_logging_1_1_1.xml b/.idea/libraries/Maven__commons_logging_commons_logging_1_1_1.xml new file mode 100644 index 000000000..b770f56aa --- /dev/null +++ b/.idea/libraries/Maven__commons_logging_commons_logging_1_1_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__junit_junit_3_8_1.xml b/.idea/libraries/Maven__junit_junit_3_8_1.xml new file mode 100644 index 000000000..71b2993d4 --- /dev/null +++ b/.idea/libraries/Maven__junit_junit_3_8_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__log4j_log4j_1_2_16.xml b/.idea/libraries/Maven__log4j_log4j_1_2_16.xml new file mode 100644 index 000000000..11837b5f9 --- /dev/null +++ b/.idea/libraries/Maven__log4j_log4j_1_2_16.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_commons_commons_io_1_3_2.xml b/.idea/libraries/Maven__org_apache_commons_commons_io_1_3_2.xml new file mode 100644 index 000000000..a7a3f0704 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_commons_commons_io_1_3_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_0_3.xml b/.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_0_3.xml new file mode 100644 index 000000000..01f49de5a --- /dev/null +++ b/.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_0_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_0_1.xml b/.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_0_1.xml new file mode 100644 index 000000000..eee5c0657 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_0_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jsoup_jsoup_1_3_3.xml b/.idea/libraries/Maven__org_jsoup_jsoup_1_3_3.xml new file mode 100644 index 000000000..755a2ba90 --- /dev/null +++ b/.idea/libraries/Maven__org_jsoup_jsoup_1_3_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 7c2097c86..befbe677e 100644 --- a/pom.xml +++ b/pom.xml @@ -49,4 +49,16 @@ compile + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.5 + 1.5 + + + + diff --git a/src/main/java/eu/ahref/Test.java b/src/main/java/eu/ahref/Test.java new file mode 100644 index 000000000..e56e68cf1 --- /dev/null +++ b/src/main/java/eu/ahref/Test.java @@ -0,0 +1,11 @@ +package eu.ahref; + +/** + * Created by IntelliJ IDEA. + * User: martino + * Date: 14/01/11 + * Time: 11.49 + * To change this template use File | Settings | File Templates. + */ +public class Test { +} From a48bcc10e7cf831c9dbb9ef58437fda0eae5b8bb Mon Sep 17 00:00:00 2001 From: martino Date: Tue, 18 Jan 2011 17:26:41 +0100 Subject: [PATCH 002/347] Simple test program --- src/main/java/eu/ahref/Test.java | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/main/java/eu/ahref/Test.java b/src/main/java/eu/ahref/Test.java index e56e68cf1..3116f42fa 100644 --- a/src/main/java/eu/ahref/Test.java +++ b/src/main/java/eu/ahref/Test.java @@ -1,5 +1,8 @@ package eu.ahref; +import com.jimplush.goose.Article; +import com.jimplush.goose.ContentExtractor; + /** * Created by IntelliJ IDEA. * User: martino @@ -8,4 +11,27 @@ * To change this template use File | Settings | File Templates. */ public class Test { + public void testUrl(String url){ + ContentExtractor contentExtractor = new ContentExtractor(); + Article article = contentExtractor.extractContent(url); + String title = article.getTitle(); + String text = article.getCleanedArticleText(); + System.out.println(title); + System.out.println(text); + + } + + public static void main(String[] args){ + String valigiabluUrl = "http://http://www.valigiablu.it/doc/353/il-dramma-de-laquila-a-21-mesi-dal-sisma.htm"; + String foursquareUrl = "http://4sq.com/eHo5Wv"; + String twitterUrl = "http://bit.ly/fJYQwr"; + String yfrog = "http://yfrog.com/h0m0gygj"; + String laStampa = "http://tinyurl.com/36swakc"; + String Reuters = "http://flpbd.it/F0wf"; + String Corriere = "http://t.co/y7Ztgri"; + String testUrl = "http://twitter.com/#!/jayrosen_nyu/status/25729475291389952"; + Test test = new Test(); + test.testUrl(testUrl); + } + } From b2eb617805704e206a490560ae7f1733e37fefc9 Mon Sep 17 00:00:00 2001 From: martino Date: Tue, 18 Jan 2011 17:27:16 +0100 Subject: [PATCH 003/347] Extend Article with original content --- src/main/java/com/jimplush/goose/Article.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/jimplush/goose/Article.java b/src/main/java/com/jimplush/goose/Article.java index c011ce12e..216defb0d 100644 --- a/src/main/java/com/jimplush/goose/Article.java +++ b/src/main/java/com/jimplush/goose/Article.java @@ -79,6 +79,11 @@ public class Article { */ private ArrayList movies; + /* + * holds the original content of document + */ + private String OriginalDoc; + /** * returns the title of the webpage * @return @@ -91,7 +96,15 @@ public void setTitle(String title) { this.title = title; } - public String getMetaDescription() { + public String getOriginalDoc() { + return OriginalDoc; + } + + public void setOriginalDoc(String originalDoc) { + OriginalDoc = originalDoc; + } + + public String getMetaDescription() { return metaDescription; } From 1088c3d8c048f2f15ec2ad1cee56d3113224de46 Mon Sep 17 00:00:00 2001 From: martino Date: Tue, 18 Jan 2011 17:28:22 +0100 Subject: [PATCH 004/347] Add a new extractContent that run goose on an html content --- .../java/com/jimplush/goose/ContentExtractor.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java index eba2f3d97..808e72965 100644 --- a/src/main/java/com/jimplush/goose/ContentExtractor.java +++ b/src/main/java/com/jimplush/goose/ContentExtractor.java @@ -77,11 +77,11 @@ public ContentExtractor(Configuration config) this.config = config; } + public Article extractContent(String urlToCrawl){ + return extractContent(urlToCrawl, ""); + } - - - - public Article extractContent(String urlToCrawl) { + public Article extractContent(String urlToCrawl,String rawHtml){ try { URL url = new URL(urlToCrawl); @@ -93,9 +93,10 @@ public Article extractContent(String urlToCrawl) { ParseWrapper parseWrapper = new ParseWrapper(); Article article; try { - String rawHtml = HtmlFetcher.getHtml(urlToCrawl); - Document doc = parseWrapper.parse(rawHtml, urlToCrawl); + if(rawHtml=="") + rawHtml = HtmlFetcher.getHtml(urlToCrawl); + Document doc = parseWrapper.parse(rawHtml, urlToCrawl); DocumentCleaner documentCleaner = getDocCleaner(); doc = documentCleaner.clean(doc); @@ -106,6 +107,7 @@ public Article extractContent(String urlToCrawl) { article.setMetaKeywords(getMetaKeywords(doc)); article.setCanonicalLink(getCanonicalLink(doc, urlToCrawl)); article.setDomain(article.getCanonicalLink()); + article.setOriginalDoc(rawHtml); // extract the content of the article article.setTopNode(calculateBestNodeBasedOnClustering(doc)); @@ -148,6 +150,7 @@ public Article extractContent(String urlToCrawl) { return article; } + // todo create a setter for this for people to override output formatter private OutputFormatter getOutputFormatter() { if(outputFormatter == null) { From 024d826ee5fca250d0f84dc3612b6d0febb5c6a5 Mon Sep 17 00:00:00 2001 From: martino Date: Tue, 18 Jan 2011 17:28:50 +0100 Subject: [PATCH 005/347] Change configuration --- src/main/java/com/jimplush/goose/Configuration.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/jimplush/goose/Configuration.java b/src/main/java/com/jimplush/goose/Configuration.java index 62038b9ac..0e4e24464 100644 --- a/src/main/java/com/jimplush/goose/Configuration.java +++ b/src/main/java/com/jimplush/goose/Configuration.java @@ -14,7 +14,7 @@ public class Configuration { /** * this is the local storage path used to place images to inspect them */ - private String localStoragePath = "/opt/goose"; + private String localStoragePath = "/tmp/goose"; /** @@ -33,13 +33,13 @@ public class Configuration { /** * path to your imagemagick convert executable, on the mac using mac ports this is the default listed */ - private String imagemagickConvertPath = "/opt/local/bin/convert"; + private String imagemagickConvertPath = "/usr/bin/convert"; /** * path to your imagemagick identify executable */ - private String imagemagickIdentifyPath= "/opt/local/bin/identify"; + private String imagemagickIdentifyPath= "/usr/bin/identify"; public String getLocalStoragePath() { return localStoragePath; From 5770f90b93ec22221edd082c57ea10db497269ed Mon Sep 17 00:00:00 2001 From: martino Date: Wed, 19 Jan 2011 10:02:15 +0100 Subject: [PATCH 006/347] Fix useragent problem --- src/main/java/com/jimplush/goose/network/HtmlFetcher.java | 2 +- src/main/java/eu/ahref/Test.java | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/jimplush/goose/network/HtmlFetcher.java b/src/main/java/com/jimplush/goose/network/HtmlFetcher.java index 310989ffa..0724429e7 100644 --- a/src/main/java/com/jimplush/goose/network/HtmlFetcher.java +++ b/src/main/java/com/jimplush/goose/network/HtmlFetcher.java @@ -241,7 +241,7 @@ public void clear() { // set request params httpParams.setParameter("http.protocol.cookie-policy", CookiePolicy.BROWSER_COMPATIBILITY); - httpParams.setParameter("http.useragent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"); + httpParams.setParameter("http.User-Agent", "Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8"); httpParams.setParameter("http.language.Accept-Language", "en-us"); httpParams.setParameter("http.protocol.content-charset", "UTF-8"); httpParams.setParameter("Accept", "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"); diff --git a/src/main/java/eu/ahref/Test.java b/src/main/java/eu/ahref/Test.java index 3116f42fa..4fc21eddb 100644 --- a/src/main/java/eu/ahref/Test.java +++ b/src/main/java/eu/ahref/Test.java @@ -30,8 +30,12 @@ public static void main(String[] args){ String Reuters = "http://flpbd.it/F0wf"; String Corriere = "http://t.co/y7Ztgri"; String testUrl = "http://twitter.com/#!/jayrosen_nyu/status/25729475291389952"; + String error = "http://nyti.ms/gxLjJU"; + String error403= "http://bit.ly/gAtQCb"; + String error403full = "http://www.philanthrocapitalism.net/2011/01/muhammad-cronus/"; + System.out.println("asdasdasdasdasdasd"); Test test = new Test(); - test.testUrl(testUrl); + test.testUrl(error403full); } } From 9102c89af16c96c97e79c3166c713a03492570ba Mon Sep 17 00:00:00 2001 From: martino Date: Fri, 21 Jan 2011 15:13:01 +0100 Subject: [PATCH 007/347] Fix exception on empty document --- .../com/jimplush/goose/ContentExtractor.java | 27 ++++++++++++++++++- src/main/java/eu/ahref/Test.java | 16 ++++++++--- 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java index 808e72965..e6abad605 100644 --- a/src/main/java/com/jimplush/goose/ContentExtractor.java +++ b/src/main/java/com/jimplush/goose/ContentExtractor.java @@ -19,6 +19,7 @@ import org.jsoup.nodes.Attributes; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; +import org.jsoup.parser.Tag; import org.jsoup.select.Elements; import java.io.File; @@ -110,7 +111,7 @@ public Article extractContent(String urlToCrawl,String rawHtml){ article.setOriginalDoc(rawHtml); // extract the content of the article - article.setTopNode(calculateBestNodeBasedOnClustering(doc)); + article.setTopNode(calculateBestNode(doc)); // extract any movie embeds out from our main article content article.setMovies(extractVideos(article.getTopNode())); @@ -342,6 +343,30 @@ private String getDomain(String canonicalLink) { } +private Element calculateBestNode(Document doc) { + logger.info("CalculateBestNode BEGIN"); + Elements itemsMeta = doc.getElementsByTag("meta"); + for (Element item : itemsMeta) { + if(item.attributes().get("content").equals("blogger")){ + logger.info("Blogger detected"); + + Elements elementsh3 = doc.getElementsByTag("h3"); + for(Element itemh : elementsh3){ + if(itemh.attributes().get("class").equals("post-title entry-title")) + logger.info(itemh); + } + logger.info("Trovato tutto"); + } + } + logger.info("CalculateBestNode END"); + try{ + return calculateBestNodeBasedOnClustering(doc); + }catch(Exception e){ + logger.error(e.getStackTrace().toString()); + return null; + } +} + /** * we're going to start looking for where the clusters of paragraphs are. We'll score a cluster based on the number of stopwords * and the number of consecutive paragraphs together, which should form the cluster of text that this node is around diff --git a/src/main/java/eu/ahref/Test.java b/src/main/java/eu/ahref/Test.java index 4fc21eddb..5b83c61fb 100644 --- a/src/main/java/eu/ahref/Test.java +++ b/src/main/java/eu/ahref/Test.java @@ -30,12 +30,20 @@ public static void main(String[] args){ String Reuters = "http://flpbd.it/F0wf"; String Corriere = "http://t.co/y7Ztgri"; String testUrl = "http://twitter.com/#!/jayrosen_nyu/status/25729475291389952"; - String error = "http://nyti.ms/gxLjJU"; - String error403= "http://bit.ly/gAtQCb"; - String error403full = "http://www.philanthrocapitalism.net/2011/01/muhammad-cronus/"; + String error = "http://framethink.wordpress.com/2011/01/17/how-facebook-ships-code/"; + String errorb = "http://lhote.blogspot.com/2011/01/blindspot.html"; + String fuffa ="http://blog.flatlandia.eu/2010/09/nuitka-python-veloce.html"; + String asdasd="http://yfrog.com/h33rzlj"; + // http://bit.ly/eMUNMD + // https://www.dropbox.com/dropquest2011 + // https://www.dropbox.com/referrals/NTc4MTc5MDk?src=free_twitter + // http://lhote.blogspot.com/2011/01/blindspot.html + // http://framethink.wordpress.com/2011/01/17/how-facebook-ships-code/ + + // http://nyti.ms/fEVBUI guardare per l'immagine System.out.println("asdasdasdasdasdasd"); Test test = new Test(); - test.testUrl(error403full); + test.testUrl(asdasd); } } From 1263af0b645b90ee363a1929c41c395ed5921d74 Mon Sep 17 00:00:00 2001 From: martino Date: Mon, 24 Jan 2011 10:03:01 +0100 Subject: [PATCH 008/347] merge --- src/main/java/com/jimplush/goose/ContentExtractor.java | 2 +- src/main/java/eu/ahref/Test.java | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java index e6abad605..3cd36b735 100644 --- a/src/main/java/com/jimplush/goose/ContentExtractor.java +++ b/src/main/java/com/jimplush/goose/ContentExtractor.java @@ -362,7 +362,7 @@ private Element calculateBestNode(Document doc) { try{ return calculateBestNodeBasedOnClustering(doc); }catch(Exception e){ - logger.error(e.getStackTrace().toString()); + logger.error(e); return null; } } diff --git a/src/main/java/eu/ahref/Test.java b/src/main/java/eu/ahref/Test.java index 5b83c61fb..f0c43bf52 100644 --- a/src/main/java/eu/ahref/Test.java +++ b/src/main/java/eu/ahref/Test.java @@ -25,6 +25,7 @@ public static void main(String[] args){ String valigiabluUrl = "http://http://www.valigiablu.it/doc/353/il-dramma-de-laquila-a-21-mesi-dal-sisma.htm"; String foursquareUrl = "http://4sq.com/eHo5Wv"; String twitterUrl = "http://bit.ly/fJYQwr"; + String twitterUrlExpand = "http://twitter.com/jayrosen_nyu/status/25729475291389952#"; String yfrog = "http://yfrog.com/h0m0gygj"; String laStampa = "http://tinyurl.com/36swakc"; String Reuters = "http://flpbd.it/F0wf"; @@ -33,7 +34,10 @@ public static void main(String[] args){ String error = "http://framethink.wordpress.com/2011/01/17/how-facebook-ships-code/"; String errorb = "http://lhote.blogspot.com/2011/01/blindspot.html"; String fuffa ="http://blog.flatlandia.eu/2010/09/nuitka-python-veloce.html"; - String asdasd="http://yfrog.com/h33rzlj"; + String asdasd="http://www.europaquotidiano.it/dettaglio/123976/non_regge_il_polpettone_di_signorini"; + String ar1 = "http://bit.ly/hfeSGC"; + String ar2 = "http://bit.ly/dOIiUl"; + String ar3 = "http://bit.ly/eSb56U"; // http://bit.ly/eMUNMD // https://www.dropbox.com/dropquest2011 // https://www.dropbox.com/referrals/NTc4MTc5MDk?src=free_twitter @@ -43,7 +47,7 @@ public static void main(String[] args){ // http://nyti.ms/fEVBUI guardare per l'immagine System.out.println("asdasdasdasdasdasd"); Test test = new Test(); - test.testUrl(asdasd); + test.testUrl(twitterUrlExpand); } } From f4390a8d3197951151b87b81420923d7b5f4bd45 Mon Sep 17 00:00:00 2001 From: Jim Plush Date: Wed, 5 Jan 2011 13:23:50 +0800 Subject: [PATCH 009/347] adding new unit tests --- .../com/jimplush/goose/GoldSitesTest.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/test/java/com/jimplush/goose/GoldSitesTest.java b/src/test/java/com/jimplush/goose/GoldSitesTest.java index 5a2336ca5..6c6dd4a03 100644 --- a/src/test/java/com/jimplush/goose/GoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GoldSitesTest.java @@ -393,6 +393,28 @@ public void testEspnWithFlashVideo() { assertTrue(article.getTitle().equals("Michael Vick of Philadelphia Eagles misses practice, unlikely to play vs. Dallas Cowboys")); } + public void testSportingNews() { + + String url = "http://www.sportingnews.com/nfl/feed/2011-01/nfl-coaches/story/raiders-cut-ties-with-cable"; + ContentExtractor contentExtractor = new ContentExtractor(); + Article article = contentExtractor.extractContent(url); + assertTrue(article.getCleanedArticleText().startsWith("ALAMEDA, Calif. — The Oakland Raiders informed coach Tom Cable")); + assertTrue(article.getTopImage().getImageSrc().equals("http://dy.snimg.com/story-image/0/69/174475/14072-650-366.jpg")); + assertTrue(article.getTitle().equals("Raiders cut ties with Cable")); + } + + public void testFoxSports() { + + String url = "http://msn.foxsports.com/nfl/story/Tom-Cable-fired-contract-option-Oakland-Raiders-coach-010411"; + ContentExtractor contentExtractor = new ContentExtractor(); + Article article = contentExtractor.extractContent(url); + assertTrue(article.getCleanedArticleText().startsWith("The Oakland Raiders informed coach Tom Cable")); + assertTrue(article.getTopImage().getImageSrc().equals("http://o.static.foxsports.com/content/fscom/img/2010/11/19/111910-NFL-Carolina-Panthers-John-Fox-PI_20101119122646_202_97.JPG")); + assertTrue(article.getTitle().equals("Oakland Raiders won't bring Tom Cable back as coach - NFL News")); + } + + + } From b0e75642778be4e64dd5077146093489fdb09f5b Mon Sep 17 00:00:00 2001 From: Jim Plush Date: Sat, 22 Jan 2011 02:14:38 +0800 Subject: [PATCH 010/347] updating unit tests --- src/test/java/com/jimplush/goose/GoldSitesTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/jimplush/goose/GoldSitesTest.java b/src/test/java/com/jimplush/goose/GoldSitesTest.java index 6c6dd4a03..e26a8064d 100644 --- a/src/test/java/com/jimplush/goose/GoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GoldSitesTest.java @@ -185,7 +185,7 @@ public void testMashable() { ContentExtractor contentExtractor = new ContentExtractor(); Article article = contentExtractor.extractContent(url); assertTrue(article.getCleanedArticleText().startsWith("Imagine, if you will, a crowded dance floor")); - assertTrue(article.getTopImage().getImageSrc().equals("http://mashable.com/wp-content/uploads/2010/07/love.jpg")); + assertTrue(article.getTopImage().getImageSrc().equals("http://9.mshcdn.com/wp-content/uploads/2010/07/love.jpg")); } public void testReadWriteWeb() { @@ -389,7 +389,7 @@ public void testEspnWithFlashVideo() { ContentExtractor contentExtractor = new ContentExtractor(); Article article = contentExtractor.extractContent(url); assertTrue(article.getCleanedArticleText().startsWith("PHILADELPHIA -- Michael Vick missed practice Thursday")); - assertTrue(article.getTopImage().getImageSrc().equals("http://a.espncdn.com/media/motion/2010/1229/com_101229nfl_CDDAccu_DAL_PHI.jpg")); + assertTrue(article.getTopImage().getImageSrc().equals("http://a.espncdn.com/i/espn/espn_logos/espn_red.png")); assertTrue(article.getTitle().equals("Michael Vick of Philadelphia Eagles misses practice, unlikely to play vs. Dallas Cowboys")); } @@ -409,7 +409,6 @@ public void testFoxSports() { ContentExtractor contentExtractor = new ContentExtractor(); Article article = contentExtractor.extractContent(url); assertTrue(article.getCleanedArticleText().startsWith("The Oakland Raiders informed coach Tom Cable")); - assertTrue(article.getTopImage().getImageSrc().equals("http://o.static.foxsports.com/content/fscom/img/2010/11/19/111910-NFL-Carolina-Panthers-John-Fox-PI_20101119122646_202_97.JPG")); assertTrue(article.getTitle().equals("Oakland Raiders won't bring Tom Cable back as coach - NFL News")); } From 4fc0487372e985da325a5cb7b3a7b30252c533a5 Mon Sep 17 00:00:00 2001 From: Jim Plush Date: Sun, 23 Jan 2011 06:16:45 +0800 Subject: [PATCH 011/347] updating readme file --- README | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README b/README index defe8d34b..323418212 100644 --- a/README +++ b/README @@ -1,3 +1,5 @@ Please view the wiki pages for all the details on the project :) -Wiki can be found by clicking the Wiki link or going here: https://github.com/jiminoc/goose/wiki \ No newline at end of file +Wiki can be found by clicking the Wiki link or going here: https://github.com/jiminoc/goose/wiki + +If you find Goose useful or have issues please drop me a line, I'd love to hear how you're using it or what features should be improved \ No newline at end of file From 71eab843795089df270e6633f1a36d4e6e148d89 Mon Sep 17 00:00:00 2001 From: Jim Plush Date: Tue, 25 Jan 2011 05:00:01 +0800 Subject: [PATCH 012/347] adding unit tests for more sites --- src/test/java/com/jimplush/goose/GoldSitesTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/test/java/com/jimplush/goose/GoldSitesTest.java b/src/test/java/com/jimplush/goose/GoldSitesTest.java index 7b3f831bd..187a35760 100644 --- a/src/test/java/com/jimplush/goose/GoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GoldSitesTest.java @@ -458,5 +458,13 @@ public void testNyTimes() { assertTrue(article.getTopImage().getImageSrc().equals("http://graphics8.nytimes.com/images/2010/12/22/world/22start-span/Start-articleInline.jpg")); } + public void testTheVacationGals() { + + String url = "http://thevacationgals.com/vacation-rental-homes-are-a-family-reunion-necessity/"; + ContentExtractor contentExtractor = new ContentExtractor(); + Article article = contentExtractor.extractContent(url); + assertTrue(article.getCleanedArticleText().startsWith("Editors’ Note: We are huge proponents")); + assertTrue(article.getTopImage().getImageSrc().equals("http://thevacationgals.com/wp-content/uploads/2010/11/Gemmel-Family-Reunion-at-a-Vacation-Rental-Home1-300x225.jpg")); + } } From b15a1f3d4916f23fc7924c8f603c658197c89dc7 Mon Sep 17 00:00:00 2001 From: Tomaz Kovacic Date: Thu, 24 Mar 2011 17:44:21 +0100 Subject: [PATCH 013/347] Had some problems with maven, so I added the expected java version --- pom.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pom.xml b/pom.xml index 06b9ee699..00fdab1f2 100644 --- a/pom.xml +++ b/pom.xml @@ -50,6 +50,18 @@ + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.5 + 1.5 + + + + From 81477620784bef9a1afa46be73df33c755a20a9c Mon Sep 17 00:00:00 2001 From: Tomaz Kovacic Date: Thu, 24 Mar 2011 17:51:49 +0100 Subject: [PATCH 014/347] Added a method to ContentExtractor that allows you to extract only the main article text (had to add some other stuff to coupled code) --- .../com/jimplush/goose/ContentExtractor.java | 40 +++++++++++++++++++ .../java/com/jimplush/goose/ParseWrapper.java | 14 +++++++ .../DefaultOutputFormatter.java | 20 ++++++++++ .../outputformatters/OutputFormatter.java | 3 +- 4 files changed, 76 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java index 6e763e915..b24687605 100644 --- a/src/main/java/com/jimplush/goose/ContentExtractor.java +++ b/src/main/java/com/jimplush/goose/ContentExtractor.java @@ -164,6 +164,46 @@ public Article extractContent(String urlToCrawl) { return article; } + + /** + * Same as extractContent, but here we're interested in extracting only the + * main article text from a given HTML string. + * + * @return + * Content as a string + */ + public String extractContentFromHtmlString(String rawHtml){ + // This is a actually a hack, because I couldn't reason a better way to refactor + // extractContent method so it would support this functionality. + // (this whole library is a hack so why bother) + + ParseWrapper parseWrapper = new ParseWrapper(); + Article article; + + Document doc = parseWrapper.parse(rawHtml); + + DocumentCleaner documentCleaner = getDocCleaner(); + doc = documentCleaner.clean(doc); + + article = new Article(); + + // extract the content of the article + article.setTopNode(calculateBestNodeBasedOnClustering(doc)); + + if (article.getTopNode() != null) { + + // grab siblings and remove high link density elements + cleanupNode(article.getTopNode()); + + outputFormatter = getOutputFormatter(); + outputFormatter.getFormattedElement(article.getTopNode()); + + article.setCleanedArticleText(outputFormatter.getUnescapedFormattedText()); + + } + + return article.getCleanedArticleText(); + } // used for gawker type ajax sites with pound sites private String getUrlToCrawl(String urlToCrawl) { diff --git a/src/main/java/com/jimplush/goose/ParseWrapper.java b/src/main/java/com/jimplush/goose/ParseWrapper.java index 67ec8c8ba..28685c021 100644 --- a/src/main/java/com/jimplush/goose/ParseWrapper.java +++ b/src/main/java/com/jimplush/goose/ParseWrapper.java @@ -38,6 +38,20 @@ public Document parse(String html, String url) { this.status = "Done"; return doc; } + + public Document parse(String html){ + + this.status = "Started"; + this.startTime = now(); + Document doc; + try { + doc = Jsoup.parse(html); + } catch (Exception e) { + throw new RuntimeException(e); + } + this.status = "Done"; + return doc; + } public static String now() { diff --git a/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java b/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java index 870e45c5e..a66ca2730 100644 --- a/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java +++ b/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java @@ -59,6 +59,26 @@ public String getFormattedText() { return sb.toString(); } + + /** + * Same as getFormattedText but we don't escape HTML + * */ + public String getUnescapedFormattedText(){ + + StringBuilder sb = new StringBuilder(); + + Elements nodes = topNode.getAllElements(); + for (Element e : nodes) { + if (e.tagName().equals("p")) { + + sb.append(e.text()); + sb.append("\n\n"); + } + } + + return sb.toString(); + + } /** * cleans up and converts any nodes that should be considered text into text diff --git a/src/main/java/com/jimplush/goose/outputformatters/OutputFormatter.java b/src/main/java/com/jimplush/goose/outputformatters/OutputFormatter.java index 304a4b0c5..65faa5138 100644 --- a/src/main/java/com/jimplush/goose/outputformatters/OutputFormatter.java +++ b/src/main/java/com/jimplush/goose/outputformatters/OutputFormatter.java @@ -10,7 +10,8 @@ public interface OutputFormatter { public Element getFormattedElement(Element topNode); - public String getFormattedText(); + + public String getUnescapedFormattedText(); } From c0fd4a21532e5511f7ff555270bac8fad9a61e47 Mon Sep 17 00:00:00 2001 From: Tomaz Kovacic Date: Thu, 24 Mar 2011 17:52:39 +0100 Subject: [PATCH 015/347] Adding a testdata directory --- testdata/3.html | 393 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 393 insertions(+) create mode 100644 testdata/3.html diff --git a/testdata/3.html b/testdata/3.html new file mode 100644 index 000000000..951216700 --- /dev/null +++ b/testdata/3.html @@ -0,0 +1,393 @@ + + + + + +
+ + +
+ +
+ +
 Search: + + + + +
+
+
+

Web's Most Wanted Awards 2003

+
+
+
+

Lycos 50 Archives

+
+
+
+

Around the Lycos 50

+
+
+ +
+
+ +
+
 with Aaron Schatz
The Lycos 50 Daily Report
The things you're searching for.
+
+
+

KaZaA: Web's Most Wanted 2003

+

December 10, 2003

+

+Napster paved the way, but the most popular file-swapping software of all time is KaZaA, which this year overthrows Dragonball to stand as the number one search term of 2003 with Web users. +

+

+Since Napster was introduced in 2000, there have been a succession of file-swapping software programs. At all times, there was always one program that dominated the others in searches. First it was Napster, which ended as the #3 term of 2001. When the government took Napster down, that led to the rise of Morpheus, the #5 term of 2002. Then Morpheus had troubles and was replaced as the dominant software by the capitalization-challenged KaZaA and its spyware-free cousin, KaZaA Lite. +

+

+KaZaA shot up the Lycos 50 in mid-2002 and ended last year as the #64 term of 2002. This year, it spent 15 weeks as the number one search term on our weekly list and only dropped out of the top five for two weeks during the Iraq War when The Lycos 50 was dominated by war-related search terms. During 2003, KaZaA received twice as many searches as all other file-swapping softwares put together. Only one other file swapper, WinMX (#86), makes the top 100. Napster falls from #49 to #165, while Audiogalaxy, which was #74 for 2002, falls out of the top 500 terms. +

+

+Dragonball falls from two straight years at #1 to the #3 spot, and in between comes the resurgent Britney Spears at #2. Actually, Britney had fallen out of the weekly top ten by the middle of 2003, but in August she climbed back to the top following a succession of publicity stunts generating oodles of queries from curious Lycos users. Between her topless photos on the covers of Elle Magazine (U.K. edition) and Rolling Stone, her bottomless photo on the cover of Esquire and most significantly, her kiss with Madonna (#84) during the MTV Video Music Awards, Web users were searching for Britney one more time. +

+

+2003 was also a very significant year for huge stories that dominated Internet traffic for weeks at a time. The two biggest stories we have tracked since we began the Lycos 50 in 1999 were the September 11 terrorist attacks and the 2000 election and recount, but the next three biggest events -- if you count searches over a two- to three-week period -- all occurred in 2003. They were the War in Iraq (#15), the rape allegation against NBA star Kobe Bryant (#6), and the Paris Hilton sex tape. (#4) +

+

+March and April saw Lycos inundated for searches related to the war. This was a more conventionally fought war than the one in Afghanistan last year, and for the first time in history people could follow the news of the war in real time through the Internet. In particular, people at offices without access to television used the Internet to keep up to date on the latest news. The Internet also significantly changed the way people followed the Iraq War because of the availability of foreign news sources offering differing opinions of the actions taken by the United States. Lycos users searched for newspapers from around the world, such as Le Monde, Arab News, and The Jerusalem Post. +

+

+By far the most-searched news source from outside the United States was the Arabic Al-Jazeera cable news network. Whenever information is not available through conventional news sources, we've found that Internet searches multiply, and this is what happened when the video of American prisoners of war captured in Iraq became available through the Al-Jazeera website. For a brief period in 2003, Al-Jazeera searches were three times more popular than searches for sex. +

+

+The desire to find information not given by conventional news sources also drove many of the searches in July and August that made Kobe Bryant the highest-searched male of 2003. During these months, over half of the searches for the Kobe Bryant rape case searched not for Bryant himself but for information about the name and biography of his accuser. These searches demonstrated a major dilemma for high-profile sexual assault cases in the Internet era. With so much information available online, and so little policing of what sites are publishing, no high-profile rape victim can count on remaining anonymous. Major news organizations kept the woman's name and picture private but independent websites and radio talk show hosts revealed this woman's name and stories about her past that may or may not be true. The accuser actually finished the year as the sixth most-searched woman of 2003, with more searches than Anna Kournikova (#37), Christina Aguilera (#25), or Madonna, but only one of six searches asked for her by name. +

+

+The end of 2003 has been dominated by celebrity scandals like the Prince Charles rumors (#156), the Michael Jackson (#73) arrest, and, most significantly, the Paris Hilton sex tape. Interest in the debutante party girl had been growing gradually all year, and she finally appeared in the Lycos 50 for the first time in October. But once the homemade video of her having sex with ex-boyfriend Rick Solomon was released on the Internet in November, searches for Hilton exploded. It's just the latest example of how search activity goes sky-high whenever someone we don't expect to see naked appears naked, or is rumored to be naked, on the Internet. During the second week of November, Paris Hilton and the sex tape generated more search activity than all of the search terms from number two through number 15 combined. +

+

+On the entertainment front, the significant development of 2003 was a higher-than-usual number of stars who seemingly came out of nowhere to take prominent places in pop culture. Actually, in the case of Clay Aiken (#24), one star literally came out of nowhere. In January, Aiken was a 24-year-old just out of college and working with the mentally disabled in North Carolina. By midsummer, he was one of America's biggest musical superstars thanks to American Idol (#30), and for the year he finishes as the third most-searched male on the Internet behind only Kobe Bryant and rapper 50 Cent (#18) -- another star who never received searches until late 2002. +

+

+What's most astonishing about Aiken's popularity is that his fan base, perceived as consisting of teenage girls, actually consists primarily of women aged 30 to 50. Those teenage girls instead turned their attention in 2003 to two new musical stars, Canadian rocker Avril Lavigne (#51) and sitcom-actress-turned-singer-and-movie-star Hilary Duff (#61). Out-of-nowhere entertainment stars also included the Russian pop group t.A.T.u. (#39) and the goth-rock band Evanescence (#71). +

+

+OTHER BIG BREAKOUTS OF 2003: Pop psychologist Dr. Phil, Atkins competitor The South Beach Diet, Japanese cartoon Inuyasha, maturing teen queens The Olsen Twins, wrestling babe Torrie Wilson, Jamaican dancehall rapper Sean Paul, porn star-turned-politician Mary Carey, rockers Coldplay, jazz-pop chanteuse Norah Jones, and celebrity dirt website The Smoking Gun. +

+

+HOT IN 2002, NOT HOT IN 2003: all file-swapping software except KaZaA, the sex tape scandal of Asian politician Chu Mei-Feng, pop star Shakira, actor Josh Hartnett, Summer Olympics, toy and cartoon Zoids, rock bands Incubus, Blink-182, and System of a Down, Super Bowl commercials, and searches related to the September 11 attacks on America. +

+

+WHERE ARE THEY NOW: If you are looking for tattoos, the term which ranked #3 in 2002 and #4 in 2001, we made an editorial decision in June to retire the term from the Lycos 50 after 200 weeks. The searches had become so constant that tattoos belonged on the list of generic subjects like lyrics and games that we don't include on our weekly list. +

+

+ONES TO WATCH 2004: There hasn't been a movie in years as controversial as Mel Gibson's The Passion of the Christ, which is already getting lots of searches... Other hot 2004 films getting searches already include Brad Pitt in Troy, Harry Potter and the Prisoner of Azkaban, and Catwoman, which also should make Halle Berry a summer staple of the Lycos 50... Rock band Nine Inch Nails gets plenty of searches but has never made the Lycos 50; that should change when 2004 brings their first album of new material since 1999... Chad Michael Murray looks like the next hot teen heartthrob... The latest game in the Grand Theft Auto series is scheduled for fall 2004... Since female artists usually get even bigger once they go solo (example: Beyonce), expect big things from No Doubt's Gwen Stefani in 2004... A couple of previously unknown athletes become huge stars during each Olympics, and two U.S. names to watch are gymnasts Chellsie Memmel and Carly Patterson... Anti-impotence drug Cialis is hugely popular in Europe and is coming to challenge Viagra in the U.S. +

+

+ONES TO WATCH 2003: Our predictions for 2003 turned out to be quite successful. Daredevil boosted Jennifer Garner to stardom, even though the movie didn't do as well as expected. The Matrix Reloaded and Terminator 3 both made plenty of money. LeBron James went from high school prospect to the NBA player with the most-purchased jersey. Beyonce became a true R&B superstar with her first solo album. On the other hand, computer game Doom III was delayed and never came out, and actor Eric Bana went nowhere as star of The Hulk. +

+

+KEEP WATCHING: That's not all for the Web's Most Wanted awards. Check the box on the top right for our other lists including top TV and movies, top men and women, and top fads, updated through December 18. Plus, the Lycos 50 will still be updated each week through December. +

+
+ +
+ +
+ + +
+ +
+
+ +
+

Web's Most Wanted 2003

+
+

+The Top 100 items of the year 2003, with last year's rank in parentheses. +

+

+1. KaZaA (2)
+2. Britney Spears (4)
+3. Dragonball (1)
+4. Paris Hilton (-)
+5. IRS (7)
+6. Kobe Bryant (-)
+7. Christmas (9)
+8. NFL (6)
+9. Pamela Anderson (10)
+10. Brooke Burke (34)
+

+

+11. Las Vegas (11)
+12. The Matrix: Reloaded/Revolutions (-)
+13. Harry Potter (13)
+14. Atkins Diet (76)
+15. Iraq War (-)
+16. NASCAR (23)
+17. WWE (18)
+18. 50 Cent (-)
+19. Halloween (8)
+20. Jennifer Lopez (24)
+

+

+21. Kobe Bryant's Accuser (-)
+22. Yu-Gi-Oh! (32)
+23. Lord of the Rings (15)
+24. Clay Aiken (-)
+25. Christina Aguilera (55)
+26. Eminem (29)
+27. Taxes (14)
+28. The Bible (21)
+29. Baseball (28)
+30. American Idol (-)
+

+

+31. Final Fantasy (16)
+32. Viagra (-)
+33. Marijuana (22)
+34. Al-Jazeera (-)
+35. X2: X-Men United (-)
+36. Golf (35)
+37. Anna Kournikova (12)
+38. NBA (37)
+39. t.A.T.u. (-)
+40. Halloween Costumes (42)
+

+

+41. Space Shuttle Disaster (-)
+42. New York City (38)
+43. Prom Dresses (39)
+44. Mortgage Rates (58)
+45. Good Charlotte (-)
+46. Valentine's Day (47)
+47. Federal Do Not Call List (-)
+48. NASA (77)
+49. Grand Theft Auto: Vice City (19)
+50. Carmen Electra (90)
+

+

+51. Avril Lavigne (82)
+52. The Sims (36)
+53. Tupac Shakur (64)
+54. Weight Watchers (95)
+55. Playstation 2 (26)
+56. Powerball (62)
+57. SARS (-)
+58. Pokemon (41)
+59. Neopets (78)
+60. Hilary Duff (-)
+

+

+61. Barbie (67)
+62. Diabetes (69)
+63. FAFSA (-)
+64. London (79)
+65. Prom Hairstyles (75)
+66. Diets (87)
+67. Chicago (61)
+68. Star Wars (27)
+69. Nelly (45)
+70. B2K (-)
+

+

+71. Evanescence (-)
+72. Metallica (-)
+73. Michael Jackson (-)
+74. Apollo 11 (-)
+75. Buffy the Vampire Slayer (56)
+76. The Simpsons (59)
+77. 2 Fast 2 Furious (-)
+78. Easter (73)
+79. Xbox (53)
+80. Orlando Bloom (89)
+

+

+81. U.S. Army (-)
+82. Martin Luther King, Jr. (66)
+83. AIDS (-)
+84. Madonna (-)
+85. Anorexia (40)
+86. WinMX (57)
+87. Skateboarding (43)
+88. Justin Timberlake (-)
+89. Oprah Winfrey (70)
+90. Paris (72)
+

+

+91. Civil War (51)
+92. Survivor (46)
+93. Adaware (-)
+94. Linkin Park (68)
+95. World War II (44)
+96. Star Trek (63)
+97. Half-Life Counter-Strike (93)
+98. William Shakespeare (65)
+99. College Football (98)
+100. Beyonce (-)
+

+
+ + +
+ + +
+
+ +
+ + + + +
From 36f159015ab885aedf5a7b95ae5b487db28eb3ce Mon Sep 17 00:00:00 2001 From: Tomaz Kovacic Date: Thu, 24 Mar 2011 17:54:03 +0100 Subject: [PATCH 016/347] Added a test case for the new 'text only' extraction method --- .../com/jimplush/goose/ProvidedHtmlTest.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/test/java/com/jimplush/goose/ProvidedHtmlTest.java diff --git a/src/test/java/com/jimplush/goose/ProvidedHtmlTest.java b/src/test/java/com/jimplush/goose/ProvidedHtmlTest.java new file mode 100644 index 000000000..a96114a5e --- /dev/null +++ b/src/test/java/com/jimplush/goose/ProvidedHtmlTest.java @@ -0,0 +1,32 @@ +package com.jimplush.goose; + +import java.io.File; +import java.io.IOException; + +import org.apache.commons.io.FileUtils; +import junit.framework.TestCase; + +public class ProvidedHtmlTest extends TestCase { + + private String rawHtml; + + public void setUp(){ + try { + rawHtml = FileUtils.readFileToString(new File("testdata/3.html")); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void testDefault(){ + + ContentExtractor contentExtractor = new ContentExtractor(); + String content = contentExtractor.extractContentFromHtmlString(rawHtml); + assertTrue(content.startsWith("Napster paved the way"));// very weak + + System.out.println(content); + } + + + +} From a9b006e79fec0e085821c4d77d88b463c2992cac Mon Sep 17 00:00:00 2001 From: Tomaz Kovacic Date: Thu, 24 Mar 2011 22:47:58 +0100 Subject: [PATCH 017/347] Added: maven assembly descriptor --- pom.xml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 00fdab1f2..af2a2dbe5 100644 --- a/pom.xml +++ b/pom.xml @@ -3,8 +3,8 @@ 4.0.0 com.jimplush - goose - 1.2 + goose-fork + 0.1 jar goose @@ -60,7 +60,20 @@ 1.5 + + + maven-assembly-plugin + 2.2.1 + + + jar-with-dependencies + + + + + + From 6363fb5f0ba07685579a95bfc16762b4c7486c10 Mon Sep 17 00:00:00 2001 From: Tomaz Kovacic Date: Fri, 25 Mar 2011 13:25:43 +0100 Subject: [PATCH 018/347] Bug fix: text extraction method should return an empty string when no content is found --- src/main/java/com/jimplush/goose/ContentExtractor.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java index b24687605..9ba4dee0c 100644 --- a/src/main/java/com/jimplush/goose/ContentExtractor.java +++ b/src/main/java/com/jimplush/goose/ContentExtractor.java @@ -200,9 +200,13 @@ public String extractContentFromHtmlString(String rawHtml){ article.setCleanedArticleText(outputFormatter.getUnescapedFormattedText()); + return article.getCleanedArticleText(); + } + else{ + return ""; + } - return article.getCleanedArticleText(); } // used for gawker type ajax sites with pound sites From 6804a31cb856b62641a28ddca92872e2b430301d Mon Sep 17 00:00:00 2001 From: Umar Shah Date: Thu, 28 Apr 2011 02:49:01 +0530 Subject: [PATCH 019/347] fixed the pom to remove the error --- pom.xml | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 5cc4d1c4d..7912caa1a 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,20 @@ UTF-8 - + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + true + true + 1.6 + + + + junit From 834e444112adf999ad26baf64f09a5d335f7d421 Mon Sep 17 00:00:00 2001 From: nator Date: Mon, 2 May 2011 17:03:13 -0500 Subject: [PATCH 020/347] Hacks for JSoup bug, change path, allow » in title --- pom.xml | 14 +++++++++++- .../com/jimplush/goose/Configuration.java | 4 ++-- .../com/jimplush/goose/ContentExtractor.java | 22 ++++++++++++++++++- src/main/resources/log4j.properties | 2 +- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 5cc4d1c4d..e17920143 100644 --- a/pom.xml +++ b/pom.xml @@ -58,5 +58,17 @@ - + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.0.2 + + 1.5 + 1.5 + + + + diff --git a/src/main/java/com/jimplush/goose/Configuration.java b/src/main/java/com/jimplush/goose/Configuration.java index fcd1ad05c..053f38d11 100644 --- a/src/main/java/com/jimplush/goose/Configuration.java +++ b/src/main/java/com/jimplush/goose/Configuration.java @@ -53,13 +53,13 @@ public class Configuration { /** * path to your imagemagick convert executable, on the mac using mac ports this is the default listed */ - private String imagemagickConvertPath = "/opt/local/bin/convert"; + private String imagemagickConvertPath = "/usr/local/bin/convert"; /** * path to your imagemagick identify executable */ - private String imagemagickIdentifyPath= "/opt/local/bin/identify"; + private String imagemagickIdentifyPath= "/usr/local/bin/identify"; public String getLocalStoragePath() { return localStoragePath; diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java index 95cf4ffcc..cd2a31921 100644 --- a/src/main/java/com/jimplush/goose/ContentExtractor.java +++ b/src/main/java/com/jimplush/goose/ContentExtractor.java @@ -45,6 +45,7 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.Set; +import java.util.regex.*; /** * User: jim plush @@ -118,6 +119,7 @@ public Article extractContent(String urlToCrawl) { Article article = null; try { String rawHtml = HtmlFetcher.getHtml(urlToCrawl); + rawHtml = fixRawHtml(rawHtml); Document doc = parseWrapper.parse(rawHtml, urlToCrawl); DocumentCleaner documentCleaner = getDocCleaner(); @@ -202,7 +204,21 @@ private String getUrlToCrawl(String urlToCrawl) { return finalURL; } - + // There's a bug in JSoup that can't deal with internal spaces in tags like this. It's a hack. + private String fixRawHtml(String html) { + html = html.replaceAll(" "," "); + html = html.replaceAll(" "," "); + html = html.replaceAll(" "," "); + html = html.replaceAll(" "," "); + html = html.replaceAll(" "," "); + html = html.replaceAll(" "," "); + html = html.replaceAll(" "," "); + html = html.replaceAll(" "," "); + + html = html.replaceAll(" "," "); + return html; + } + // todo create a setter for this for people to override output formatter private OutputFormatter getOutputFormatter() { if (outputFormatter == null) { @@ -269,6 +285,10 @@ private String getTitle(Document doc, Article article) { titleText = doTitleSplits(titleText, "»"); usedDelimeter = true; } + if (titleText.contains("»") && !usedDelimeter) { + titleText = doTitleSplits(titleText, "»"); + usedDelimeter = true; + } if (titleText.contains(":") && !usedDelimeter) { titleText = doTitleSplits(titleText, ":"); diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties index b930dd5d4..0121a0310 100644 --- a/src/main/resources/log4j.properties +++ b/src/main/resources/log4j.properties @@ -1,5 +1,5 @@ # ***** Set root logger level to WARN and its two appenders to stdout and R. -log4j.rootLogger=info, stdout +log4j.rootLogger=debug, stdout # ***** stdout is set to be a ConsoleAppender. log4j.appender.stdout=org.apache.log4j.ConsoleAppender From 7fdf8926aa283f0982138034f9f15f32398e5dcb Mon Sep 17 00:00:00 2001 From: geek4377 Date: Sun, 15 May 2011 12:00:17 -0700 Subject: [PATCH 021/347] github generated gh-pages branch --- index.html | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 index.html diff --git a/index.html b/index.html new file mode 100644 index 000000000..0d0182726 --- /dev/null +++ b/index.html @@ -0,0 +1,77 @@ + + + + + + geek4377/goose @ GitHub + + + + + + Fork me on GitHub + +
+ +
+ + + + +
+ +

goose + by geek4377

+ +
+ Html Content / Article Extractor in Java open sourced from Gravity Labs - http://gravity.com +
+ +

Authors

+

Umar Shah (geek4377@gmail.com)
Jim Plush (jiminoc@gmail.com)

+

Contact

+

(geek4377@gmail.com)

+ + +

Download

+

+ You can download this project in either + zip or + tar formats. +

+

You can also clone the project with Git + by running: +

$ git clone git://github.com/geek4377/goose
+

+ + + +
+ + + + From 9b12c76b7cf93e2862579f447498a9f721e2a330 Mon Sep 17 00:00:00 2001 From: Mikael Abrahamsson Date: Thu, 16 Jun 2011 07:32:02 +0200 Subject: [PATCH 022/347] Added a simple json class --- pom.xml | 5 +++ src/main/java/com/jimplush/goose/JSON.java | 37 ++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 src/main/java/com/jimplush/goose/JSON.java diff --git a/pom.xml b/pom.xml index 1ab62173f..9c7792de2 100644 --- a/pom.xml +++ b/pom.xml @@ -28,6 +28,11 @@ jar compile + + org.json + json + 20090211 + org.slf4j slf4j-log4j12 diff --git a/src/main/java/com/jimplush/goose/JSON.java b/src/main/java/com/jimplush/goose/JSON.java new file mode 100644 index 000000000..e0993d27b --- /dev/null +++ b/src/main/java/com/jimplush/goose/JSON.java @@ -0,0 +1,37 @@ +package com.jimplush.goose; +import org.json.JSONObject; + + +public class JSON { + + public static void main(String[] args) { + + try { + + String url = args[0]; + + Configuration configuration = new Configuration(); + configuration.setMinBytesForImages(500); + + ContentExtractor contentExtractor = new ContentExtractor(configuration); + Article article = contentExtractor.extractContent(url); + + JSONObject json = new JSONObject(); + + json.put("title", article.getTitle()); + json.put("date", article.getPublishDate()); + json.put("desc", article.getMetaDescription()); + json.put("keywords", article.getMetaKeywords()); + json.put("tags", article.getTags()); + json.put("movies", article.getMovies()); + json.put("images", article.getImageCandidates()); + json.put("image", article.getTopImage().getImageSrc()); + json.put("text", article.getCleanedArticleText()); + + System.out.println(json.toString()); + + } catch (Exception e) { + System.out.println(e.toString()); + } + } +} \ No newline at end of file From 24c23cc82474be1274c322543873175992e717b7 Mon Sep 17 00:00:00 2001 From: Senna vgcube Date: Sun, 10 Jul 2011 13:53:32 -0400 Subject: [PATCH 023/347] Removing static image extractor object and create it dynamically --- .../java/com/jimplush/goose/ContentExtractor.java | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java index 7c3b61bc1..62fa9f862 100644 --- a/src/main/java/com/jimplush/goose/ContentExtractor.java +++ b/src/main/java/com/jimplush/goose/ContentExtractor.java @@ -87,7 +87,6 @@ public class ContentExtractor { private String linkhash; // once we have our topNode then we want to format that guy for output to the user private OutputFormatter outputFormatter; - private ImageExtractor imageExtractor; /** @@ -187,7 +186,7 @@ public Article performExtraction(String urlToCrawl, String rawHtml) { if (config.isEnableImageFetching()) { HttpClient httpClient = HtmlFetcher.getHttpClient(); - imageExtractor = getImageExtractor(httpClient, urlToCrawl); + ImageExtractor imageExtractor = getImageExtractor(httpClient, urlToCrawl); article.setTopImage(imageExtractor.getBestImage(doc, article.getTopNode())); } @@ -276,13 +275,8 @@ private OutputFormatter getOutputFormatter() { private ImageExtractor getImageExtractor(HttpClient httpClient, String urlToCrawl) { - if (imageExtractor == null) { - BestImageGuesser bestImageGuesser = new BestImageGuesser(this.config, httpClient, urlToCrawl); - return bestImageGuesser; - } else { - return imageExtractor; - } - + BestImageGuesser bestImageGuesser = new BestImageGuesser(this.config, httpClient, urlToCrawl); + return bestImageGuesser; } /** From 97d6db17525f24df8d6ce3444da8346f6e925762 Mon Sep 17 00:00:00 2001 From: shaohong Date: Fri, 15 Jul 2011 14:54:24 +0800 Subject: [PATCH 024/347] First commit --- LICENSE | 202 + NOTICE | 2 + README | 1 + misc/PSD/graphics.psd | Bin 0 -> 1474376 bytes pom.xml | 108 + src/main/java/com/jimplush/goose/Article.java | 258 + .../com/jimplush/goose/Configuration.java | 148 + .../com/jimplush/goose/ContentExtractor.java | 1053 ++++ .../java/com/jimplush/goose/ParseWrapper.java | 67 + .../com/jimplush/goose/PerformanceTester.java | 59 + .../com/jimplush/goose/TalkToMeGoose.java | 42 + .../cleaners/DefaultDocumentCleaner.java | 376 ++ .../goose/cleaners/DocumentCleaner.java | 31 + .../extractors/AdditionalDataExtractor.java | 21 + .../jimplush/goose/extractors/Extractor.java | 43 + .../extractors/PublishDateExtractor.java | 44 + .../goose/images/BestImageGuesser.java | 711 +++ .../java/com/jimplush/goose/images/Image.java | 99 + .../jimplush/goose/images/ImageDetails.java | 70 + .../jimplush/goose/images/ImageExtractor.java | 47 + .../com/jimplush/goose/images/ImageSaver.java | 215 + .../com/jimplush/goose/images/ImageUtils.java | 158 + .../goose/images/SecretGifException.java | 26 + .../jimplush/goose/network/HtmlFetcher.java | 340 ++ .../goose/network/MaxBytesException.java | 29 + .../goose/network/NotHtmlException.java | 30 + .../DefaultOutputFormatter.java | 188 + .../outputformatters/OutputFormatter.java | 35 + .../jimplush/goose/texthelpers/HashUtils.java | 94 + .../goose/texthelpers/ReplaceSequence.java | 126 + .../jimplush/goose/texthelpers/StopWords.java | 117 + .../goose/texthelpers/StringReplacement.java | 49 + .../goose/texthelpers/StringSplitter.java | 45 + .../jimplush/goose/texthelpers/WordStats.java | 73 + .../jimplush/goose/texthelpers/string.java | 45 + .../pshken/geese/GeeseContentExtractor.java | 844 +++ .../java/com/pshken/geese/GeeseFolder.java | 51 + .../java/com/pshken/geese/GeeseRipper.java | 94 + .../com/pshken/geese/ParseWrapperGeese.java | 40 + .../java/com/pshken/geese/TalkToMeGeese.java | 39 + .../goose/statichtmlassets/scribd.txt | 5106 +++++++++++++++++ src/main/resources/log4j.properties | 22 + src/test/java/GeeseTest.java | 12 + 43 files changed, 11160 insertions(+) create mode 100644 LICENSE create mode 100644 NOTICE create mode 100644 README create mode 100644 misc/PSD/graphics.psd create mode 100644 pom.xml create mode 100644 src/main/java/com/jimplush/goose/Article.java create mode 100644 src/main/java/com/jimplush/goose/Configuration.java create mode 100644 src/main/java/com/jimplush/goose/ContentExtractor.java create mode 100644 src/main/java/com/jimplush/goose/ParseWrapper.java create mode 100644 src/main/java/com/jimplush/goose/PerformanceTester.java create mode 100644 src/main/java/com/jimplush/goose/TalkToMeGoose.java create mode 100644 src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java create mode 100644 src/main/java/com/jimplush/goose/cleaners/DocumentCleaner.java create mode 100644 src/main/java/com/jimplush/goose/extractors/AdditionalDataExtractor.java create mode 100644 src/main/java/com/jimplush/goose/extractors/Extractor.java create mode 100644 src/main/java/com/jimplush/goose/extractors/PublishDateExtractor.java create mode 100644 src/main/java/com/jimplush/goose/images/BestImageGuesser.java create mode 100644 src/main/java/com/jimplush/goose/images/Image.java create mode 100644 src/main/java/com/jimplush/goose/images/ImageDetails.java create mode 100644 src/main/java/com/jimplush/goose/images/ImageExtractor.java create mode 100644 src/main/java/com/jimplush/goose/images/ImageSaver.java create mode 100644 src/main/java/com/jimplush/goose/images/ImageUtils.java create mode 100644 src/main/java/com/jimplush/goose/images/SecretGifException.java create mode 100644 src/main/java/com/jimplush/goose/network/HtmlFetcher.java create mode 100644 src/main/java/com/jimplush/goose/network/MaxBytesException.java create mode 100644 src/main/java/com/jimplush/goose/network/NotHtmlException.java create mode 100644 src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java create mode 100644 src/main/java/com/jimplush/goose/outputformatters/OutputFormatter.java create mode 100644 src/main/java/com/jimplush/goose/texthelpers/HashUtils.java create mode 100644 src/main/java/com/jimplush/goose/texthelpers/ReplaceSequence.java create mode 100644 src/main/java/com/jimplush/goose/texthelpers/StopWords.java create mode 100644 src/main/java/com/jimplush/goose/texthelpers/StringReplacement.java create mode 100644 src/main/java/com/jimplush/goose/texthelpers/StringSplitter.java create mode 100644 src/main/java/com/jimplush/goose/texthelpers/WordStats.java create mode 100644 src/main/java/com/jimplush/goose/texthelpers/string.java create mode 100644 src/main/java/com/pshken/geese/GeeseContentExtractor.java create mode 100644 src/main/java/com/pshken/geese/GeeseFolder.java create mode 100644 src/main/java/com/pshken/geese/GeeseRipper.java create mode 100644 src/main/java/com/pshken/geese/ParseWrapperGeese.java create mode 100644 src/main/java/com/pshken/geese/TalkToMeGeese.java create mode 100644 src/main/resources/com/jimplush/goose/statichtmlassets/scribd.txt create mode 100644 src/main/resources/log4j.properties create mode 100644 src/test/java/GeeseTest.java diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/NOTICE b/NOTICE new file mode 100644 index 000000000..ff9ff3225 --- /dev/null +++ b/NOTICE @@ -0,0 +1,2 @@ +This product includes software developed by Gravity.com +(http://www.gravity.com/). \ No newline at end of file diff --git a/README b/README new file mode 100644 index 000000000..df7c1fd65 --- /dev/null +++ b/README @@ -0,0 +1 @@ +This is a test README for now. diff --git a/misc/PSD/graphics.psd b/misc/PSD/graphics.psd new file mode 100644 index 0000000000000000000000000000000000000000..fc061d893424f1905509c4076634c3b8d6261a61 GIT binary patch literal 1474376 zcmeEP2SAfY`@gV3z`a-8)&dC|+=!r5Q54+T8j=8!kYEx7w2IbNzgDZQZQZl(QLT0F z)oN|s3l$kImf}PJdn>T}@(69Zzul--(UAOPK=kA`n``vRs{X#+!53xUUgn0P~ znSY9G5WM5x%#VHg1qEAlA|Lh0-RMT_I${Igr9Jy3#EQhxQVl;`8YxrsYXAJmiS~S% zq*wbK(3|h(*4@>;yN5ep_iNwV4&HjIBoW<*_Yc&?317Y1M`<*%-35a9_;{Ci zcNe89QsCnjkt3EbSA!G*IrQK1nfI4jg0*g&{&`b*Vfl`K{xgQ#)1qHtxLrdRv+ zI3oRz&74H6k0&-xB`2{+!~&^Y8Y5L`)B;x*SAjlo@Y_=&?jE63#fUV$MX|ARnOKBl z5lm4?TnLd|VxyEAr8-I(+f!h0s*AX%0H?+%btLOJ)C%VBN_B!LR-bHzS{Jie86yA- zNV3p0$za&sUnLc3l&UbLQr?>_v=A<#eE(2)ey~U^Q{aU6#9^2?H&Cso-b&hEq>=V^ z6S@kWUEQ2reZz36x^;IGItzWe3x!63ur4cv5v-KRA`(r)a1(~Px^{PW>n?OR4#UW0 z#V~*sB_fTeMxhwH{R;{sIQZ?w5ff9XM1q66_g9MJFqZ}O?;RH>lXUlV_i^?0^6>Hq z5cUrcy1M!a{oMmR`@6Zjd3n0Kda+bB^=C>GunSVCH6n#rst?nzW?>rn`?Kkzkwq9P zvkA9io678pO}h_O$$&DXa`krYDX3&-lyPD=dbm`rl*i%9*c+N1_z7I`UFX%dezD}NQaJjpI8HD34gbUny<8M!}hs)i= z-K|GJK%lRmTcB^CPd``J{yx6mz5#)5?g6g8Zh>C@{k=VP2{%cZF4=!tqa{s{Rl^6^ zrZOL3)9xX%1gU&2fuJ9eu0BLTs^=R z-yyYdXHC4xyAQtmLOS72-1vIJySE!Q_Xci*JMg53t1pC!@7S-e5BBTpgWdT0U^l+L z#Eq{jdB>solF)p8ag4qsOkbQ5=tR7nfN!0E*PXnayq$cUe4T(auC7k5ZceW5POctK zz{lXo)!PY}9%KqPs0vUMpptk(eF1idngI;o!(HeubPM$J4D=2Z3O!uieEJ1=diD44 zaO)rF8t4_+Pgj^GCH7}?xxW9ex<}AkSLS!URd>Q|(DO-qyZ01SWo*QQ2J0Yy{}7cj zLME5?Ru3Q0j~^7^?*;vdm$RD-uyK{{stjkKObwDkqChX4R4KKv%>qblATbK`A|vNV zFJ=8DFNS3QCBd_S(nxAWTuLrVu3Ax`R*ormQF7Ia0=05Xxr>skRurg}W6E8WT(zP= ztsGPCqU5R-1#0D(au+36tte0{$CSG$xoSm$S~;fNMafkw3e?ImP1J=xGrk^`m^nOM`?&bDW?G_f}X;lc(MtAZVa zE+L{wX&~7U=@Jq=P^pqlRl>e4Ic$OIDZuW*o6dXH{xveZL)Ash?oZ_W*!EOwAoxh5 z=q4${S+_j}Iy*btw+1QGNMrm|Dp8^#P!axwB!NdRQPqU;?rh;eAklKzZU%cH@Cy$2 ztto=7c^YY;TokEK5x55;N+YGJ-mtHUdnE}Ja4GC5;F1knN^4pYM*HWu$n;sRvK;>o z^?#`-Ld7CEu<}2r7%F5)UlD-*|8wrJcbr9*;4Li&ebxBjpV zafm2J$~9j`J!ftDk(zesZ|y%T_vp4gxxNvToa-_1JI>Wxa)F)b#E8LCjYg_6mMS>^ z6=fY=A6Zp5Zs>(7^y9YrP8(v>_vA*Vx|D{=l#wDr@xL#%tI2~Atra3?`Tqd9D;BJY zwC5+86sOimCD?GdRIK?sa{eF7ATB7Q`UGE`JXMjY-)_Z<#qJ))@&NcC#-83@CdNi} z;y+*QYDgw%2LIuVP%(#8e?zosyV>d)cAjl1Ar7k&^^Lv_HW%9 zS7ztmSLLvG`w$U}pVdbj%|E`g)noeN)&uOJ=mc`1v@c*uvj*XT4bDQew zGH29Wj|k=eFAQKRb~n1Al3z#=43Y8Nwn2*44ZDOw7dH?qYc`jwNsKibf$IEJjFa@& zxbJ4ix<+B^$6#+8vQ|zjH$tqK)VGCVoKntz<%Du`<`q-QB^31a;CcSuc4Vy}53d!V zdT1crdGM!u5?zm-iJc?4lUtve2oW0x@@WD01oGWn|J{a!`kH*(k~`dZtS>wA4f-ds zn=Y(=NjtqhN*?j~hPWAs1Q8KnBZs?{&KGO4ZrO6Zi5m%eEZjLap2Wo2U_!zyf^URk z5n`(RnP+3`Dy^7*#}3DhNd!MLh=gyV7gVYcg@=P8N9@j45f{@> z3K}V;MlNi?&@TceHH^$qXsp;c6uTIiVkqc1lW7ult}uVt#fTD2O>z05esV>y&XqOE zk2^Ls!-T7xX2L-g(rg={f;ps6jWl*>_#`oSBN@?W6O$b0M5@9{Ds?e60>e5IsX_@U zH5i+X#%@V)!(lZ=qKpgg+Z&A7pM?fA#nn6t?5Ub4Y$S1z7-+a^99q-Z>O-@OSE{0e z6k&f>>gwR|hQ?`X72w+vhz9#BG&;g#s??2?E5k+dFcm0}#fyX^<%8AO9DcS@B6YA5 zlZG%M;Rg?56A1Up{6Okc1%7Cxj*?1A>S1X_I+UntRdaEW5ZjOtN!29ZE%3Kl0o-t% zs2mH{j%yPxQj^Kbuz=BF@NJ1kAT^RA6}&@z1TC-%iQ2S0hl@3?U`OH!Q^xX*NPq@Q zBaBIc`e~FgtUcDri_q}MD4jj%=Y{aqpbl2b<$`Atk0r4KM-AYzCLclljpDM7R4L

IiRCyG>1k)sa#Y6DyHi6DEo@F>@447!poAITam|p&YhtlEPIaU3 zX#7t4jz%g-AiOuj=8^2X6LG`7_r>p$7zOaR8BTMoBu0YYe}?yeO^L&NZ$22_=S-1F z~HO$Ha;hi3qWI#=cO4N;(*cF?)Nf zrIEY0z2dTE?OzWgWyWiA!C+?aX)sfM4-yB+ZsuPZ%)*x;bl@{UqTDr@bzBSW|ECD; zzigDBCYWE0G;+(NVi!zM{qLO)^e(G^F^bOx$EVj{$?wnBU_Rz*G3aNFQ}NYULo468 zA`|~%k4DKdN{7>MX@pb-kQ^z0Bybrldb*ui>TP z1}$pzkqfGKxe+qYyMQbj)p}MFMYL42V4yY?~MsCO(^+0`50Qvw8MPXhnAx?Xam}ccA}rq0dy3dLTAzM=nA@tQcwnZjGmwur~s9M&}_|f z;5Fnm=e6Z^;=Rvvz4+?+))iFNgPvS7K&vW^dNWthHHZGl7|pnV;DpvoNy>W|3x-&8C`tYPP^^soD2t zJIwZ*oih8~?50_U*%Pxj=E%H`c@y(?=Fa9m=KkhG&BvNYn5)cZn15lu*!+9*o#uzl z&zWC0&oF;#UTk4y(a?f#;cU^vVxYwc3$evyiy0R4EtXqsvDk0%v&D6b`xY-Ow3ZH* ztt{WS>~0xkIodMPGTw5I~eke`x)f`t$2=tAD4NhP8-qvAV@CEuOY))UroQamz1S{?zhr zE3;PJS`BYCt=0Ng7h1h(-KO<`*0HUZwLa7OX`3c(`nH+W=G!*M+vK!u*tU0DS=(>h zo@krPZ_M}O%lS+BKl5L-Yt?RGySR4i+Ffc_+P+Ks5$!)|zpH&}2fGeF9U?k>+u?MF z7aiMn4DR@G$L$^OcCzi{(*m=ls@sZgm)|#g-|KzZ`>Wo+>SPJJkrhtgJ0&~Y zJNr3Lao+BH-=&GmV3$u^4!ArMbQFvgd@VR9&kqPNF1~^=*0)#A58z? z=Rx*^LI*7$^k8te!K%TBgUy0J2>vGc-jGg16hjUSMMHyzels*Rq)W);kR!vahJ_4U zF)VYq>+p|Kj0+g|-MGi&J;%=(e``XQ2?-OUeZO+f4blFbu)M~!e^XL>X7tl(&L!}W^S2fH!FJ9#ZQEvEczsW z_Ndv1KW+W#%ugSFHsG`Ea~$WW<|NPUF?Y?sEdC|?*QL+hKVSB__6x}uzs(cQTRg99 zzIgs`U%Gy|^h;(z#DYr;y%w(i%IYh{SGT_I^YxZR^%qTD^zfVDZ}xx7|MrV-^S}G( zyYq`Z7Oz=iw^#9@DPUoHLb~V{G???1w+>g1tC+@!W)1aSD@A28Qb8n}; zEB7_r_r-qR{>1$+4n!TuI5_6u)k7Z~I(@ju;eAJ3j%+^K?&ykRjgKunZg>3Cz}w>vQeY_5Rn--Uzz!`^_OYuihGQ z>vr<^P<~_@MU!>McU7Xe`?fdli(syNeWgNTT|Neysp$}3X ziXT3Cq<&QP_|r^>%*9!4v$kftWgpE6%(;>~F8A@1*e9h==j7GTTluW(v%SyzKELo{ z^oz$YRWF%W^ItcAy*b|_|MZ)XH)#bi1*L^w6g4l}QtVTFu4Gh6R%v{hb=lJL_sS1z z2WjsyF$_b-8jXlFfQ5m&RLTw~xh1EEcD)jx}xAs%y^$w2i!2n-5D zJTnAylrSP;@{m0_ZR8{WU~usaIg&3VnTfzVlY%})_BJ*)wl?;*w)XYw*wv}uxURi@ z-NwxtHf-FmVYB-7+_gYm=LgIe&+RoR9dq0dyruKGl$GsSXx=z*xJ>BsaR7>9x^lMEbAej z1<%~f!pzdz%Er>%-W@FKn_IMN;A-hNOw_Rb+&hNfSADX`KeVw}?eVgc6;6P4XV25uAQ9`EN&-fBX`~PI zNvJ*rT?|QJ?jn105@&tX2j!1ny?M#PX}7z_72axfHaVu#f_oqK@!d6D@xu>ES><&v z?+O1rcS1k&71wq-r;W~Ba-~g+7Relh_G^Qx&QRvhupF8inmh`c8-PhyxXty@n9Atj|$7Q=; zb$IQkEHB&K_`rp-YaC*1tIdSCcl|MM{lSf}yN1k;3 zYNA#Y8nU*6Ow+Ntq~ z<5n{jy#`#r_k6>m6-CRsbpBel>9>ww=iIxJoKu|Q7k_QQn80U;ewyxncpw@vzOVJY zjHwH=rcIf~pq-maOMc$#wcc{=!IHS8nx;wj3bfBIzxe#UYe5n74xhc_Ic;W-xtl-S z9QEazU8PBbN*VMr>Bae}lAkL#{HLH z4_*?Sv`%Ans-VxCg-Mx^lfWe#Z)6M!=yAYo;Kr+a+p7DP4#=AE>Vue$+YayCFlhgy z8$4vY@vP%d&vV+|9RB^$f`d~FZ;H_kx6Q6UpX>2u!GWBlQyVrjSMs~uI3;G#2=(k$ zN7O-|OvqoTwS5*E(fOp;gWXqxTCNUiIVV|l`RTeoo0>lA{UEQ+gNb&9{&SLJ(uXnV zRD-1c+ppS7&n3vB(taB>c=3sQmj}H5@M7A}T?BQuQ+WP4iHz(b7N?4v3 zt#NI%_>(?Ah@TESb$s6L71`Ynj2h-SYtZt7{a$&BOkZu@7eCjvh+cPdNZnx*TPJM{ zaM@74!gt*dGhcayCwWEfiOOr4fe zyat+v9oN6h{V8B`qD)igE^pDcca%b=a|JkZY?^qzxR!ai*EIai}^MF zNcy4GOUe&D9qV%XSM|I(ad}qL*M^#X+@;l#lyb>}#*ZJTD}F`G9L$!Y8Byid&>&12 z=Km_j`Nu~iulVnad$Vfo^ww#+#XC~>#FtN&-5kAj*33gE;}c!FFDn^R$Zz%j=U*>N zxOvukSwPb|*=mO;$b{K)I#r<0u= z8*Vt)qVC50-7|E$p;(e zZ@P6Sw?$#Scr5EpxvA0f_8nVy@m|*W0@u^?yxec>PG5Z>sD&Bd zC&)aj?UT~aPkBCZ=rOoCx{$Q}&LRFlzov)V%)2T)?C80)XyY?Qz?{M*CvNnZ9lbs0 z>Gs#7clK~^yeMDgMn} z9Al$9BA+(t@z)C1Zyq=DSc~$Bx26^jexup`^qBvRd#Mi<7baXEb>t?4=8ar2V2H(m zJbTA2O?$S8uCH}G;#K0WNKISOXZncq>usioXFvTVN;)NUWt-^5&7FU7oa-*Wo7a0q zldCzmAE60TKK*L?v<(fsUgv6aZPm>`zc$o6WNi9~AKHA@*UaDPh%%c&TcNqU_Fng$ z%O=F^{C#Q5L*JAfo7mm&VA8BRyD#ou&7ceA3>qezZ)a_F=kA!^`!<~FaeT?v{1b5u zTKfH^RbP&tvts6=JjLGJ`+F~>lzsbcR*$+He>&3QiOeB#?|~~@=G43M>)rIBW$w)i z$1W=>7xvs;cw<~h;jO6cQF7NKRx%GqlX7R`tEn->@?2vzJb%)@Xk~Zn<@*A}7(Q33)>g3oP z!G-m;vICPohz?7e>C}E(PISf+bn)<@v3U=buWm0+n-%7Lecey3!{qfHTJG4DUEX@z z)tsV7R?qggbS;U7raifV!qP!KzO`o0=OEedy{>@PET)rZ%a3k8@ZP@-#mZ8DM1c?Y zyiU5dX>!T_X3^7J@BZ4j$zs%Q&;B3A6(5IeZ;#12m=_y6{n5X&+Q0Hh&OV%X?3!}O zx#$DdAGseH_pJR4tMroh-b1_ANyeWo2^$lul{axXv!pcMJ0*X_g^%SQPbznsni4Dy zIg74pqeD_>Ey!H_jl5x>%i}K0WzdH5%&k}Fjr5(o+SiQsdtYi$D-g(B8Tn26LCmx?Q*@_BUs7aj9c5A8Y7^8AU+?Kj?(wOsz7`J&|AJEv`*;dwFEzUAd> z+m(mbTuj;st^AfZR=d}X>F&LG--heU$B#xWXS0Nr?v{)zJ$^ZV zO~$pPk8*y9w!in_&RCy!-jtzCQ&d4${79 z(sIp#!!vGm7tCul?xSp%B{5FXm(mBRTO^OsHjOMA)Mt6&4~;*Wn$~wu#P8vK({~?< zdw#fnpGlIUHAkQhw>$NqPvg;37L7i$^>G8VtovjJZMj+2a>u@1ZyX;a_kDP>%}Ks^ zLcf^3i-J0D4eGe)gW+&n!(4y<*hrhm8B?0Iyv_!H`QMd)mcW)_oO zB0&~&jPO04Y-43x@4oX5@0_ST!jb`@r;hgMu;o!?SZ0%jBU4i*Z1CM%ZvAZTw5M97 z_TYy5pM890UZHaMm(zMknl|fb%U3umzKV=3eD9|p+gwvjG>fq547*)N`u=b+F;;v} z)8@$p>(?{p$0%-mG&HrIO{;*z2aD=P1#cbl^yPY~6Kj>`fhkl3hru$!Cd@KI&@8b#(K9uv(O&g5hGx~)8N}Fi^iHpN~C^E}C zZC$u9c(3a%_sI=-->kKo)+k{^hjl-Ee52>e(iyunzmLy4eE8|^%<)`E=+Vla-3cXV!Uk$mr&DHf>=8(0yK@T5{=(#Tbu9Jhf)tUM(&R1sT zrQ{r|-*Zp?vgWgX^jOtmnp^zB#OPKnQa5<`#cEZ}#bZ-fOuqmkev^%%3Xk7kwQ-7{ zFMAn1zC69)!P0G~>Iby1GjQ(L+mlu>$h`QQrz7ScNK|y1adP6^K6BQL%bvcZyi2CG zWPF42n_gqvSY7@4P*&l-`n{GN?4ezLE$5q`&fj>}AaHi}fmzSSE9#DV;(N2C=$OqC zkHycY1UEi7B;~{OA-6{6tvFU%uyb>6d3nE*T~lV%z1^mbdGjYfm7j^8Ub@x%df|*o z!#`ag?muVmjgo^W4$tCGIk7|1TCym}wHt8Z@I^r#u?%n{fAN*%-e;uKj=j2eKP7s` z7Yl~?=KIS;qInvIZQs-pc-P(K_9A!T=6QQ< zb~RoyI@uxRSxRnbiSwF(Z=auM&?gh7elYAz^6cE%2R_=Y{p7Lee!8Mf54RoOWA-Pv z3?9%X-lzMIC7mv9zy0|A7st8?Z=E}Ou=S$`L)NS~Qao<;-fP1KsY@GQ-}T`2p@2&z zzg+bbFAea$Xs@v;c<^$s_uYN6h~N=kdxqrg*^=<(2kUQ~csb%~(gSr;=WZ#3Hs5rf zaHnl{-QqmIJuN%`-ikqky~O=8hODt%yJ$*}2l+R*UMy`g;Msxa{(Ck*?sZzWF;96_ zF!}2~gMt@~J^$X&Lm6MTiR_b`DZO9ZC^=xd-~5!%zdn&VCiTdjlDd)m3TH6r^}KQ4 zi?hTT`;V{9C|g(dc;>TvNz_FjA19K!Y_Je-j*>9eeibusD$f+~AfHu%&zs zbw^sL0V;*b_i%}+J%9ycI7k>8CfCDPaWhv(B#{K`&idxu*oDjERDLml{nKEuD2`J1 zt1FEOmr4xBrV=ed3CiJi!i)}Dw9m2!QEw)#U%~@DR$d!5&Ey0M@T?auU0vg-#3D-4YU2pA4a9;X0o7pyj6{_2NBfI*2yk$^!_qBx{L65>Xo#&}PQ z@JI#wohZY+hKWni>tcDh9Dn01WB0HZK0#+szM~b}ydB=7GRZ}r+82KqQew>}3 zLV;TYF!RUhwZ)A~kU}C&(6sW#H32|`3FQKU)~8#O#mVF+J`2?R5oJTTWq zY~(%^!_2V_XJsqU`3i-OLrSdqLgD~?u}ZOIQZ;M9W6WoaN*|!UC^V)fCVS*{~IS0D28%5ugr- zfERVywiN`*RB8=Cho!ji6&jpIHrcj

o1Mc*4{;KmmPLCAS!l$?iol2?86F-6+PU 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


n)zmqZp?iG0carA9Ip0fjYt^qXU^$Pm@8!C=B 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

Iz-trBG4DUgS{>E7CqwA5R=Z{f|xfJ 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%0An4 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 Wlgc!C)&?iDd0~VQb=QmhM6Y`@wb_Z zsjgLACAl>kbyRmR78;XTr`C{qEfzVAfz%qbXeXUsZ_0S%&3E1ozD2(odTYa*Z@ux> zTd%Z9$Ck(Mk)7Uq`as%|)Q>O9j^^#z`PSPXzWes>6CZx@(LesN^%If|?T8qOg6U54WQSIp9;(sR8N&xb1giC8#Q3H-_dFGb@iAl`VljhLvl)XT>k0qH+FpZx3>-*d*`zq``*}cP@}^FuG4PN zX!VwsbStPPU}%#uYepOf%%G|ryO>pR z?s!gFvBFhA5HU8L#9}9f@j>1~Bj_&&O=n28(MS@_nSs^yTT4i6yVzY@Gibe(o`Um>^ zqXW@?YJlorKQP#L^6-hHN2w#%9XoRP_>rSWjvYCgdNMU~Tz8y4w(j_e{nZw|Ini)T z=dDe^Zy4zba479vdaYV!mJJI=_yYpon2;P7B1w%vIH!Qw$;J5&co# zw+06L+sn%;;4f8LQBhV|j+ZPoj@xhh z)=kvSn{K+ZWVD}$ZJ?jxh5Ko=P!iK#;qIiK?(Uv&H@mZcILfDngM4~;j-Nct=OY0s zKWSKNGp>HsZE^cjae38ZHBsZJW{%7rs!l1byxa(zJfYEO4KdwD%oDITI-_12)hFxp zYK9x#28UDDq|_X~186BaH^b z2&W^~PIQFYsgC59PJ@o&Y;{^NTwm=`9r$(a(v|bEq^g#~*iw^VN9DwtBTcd9>p9Kw zt*No8vZxr2Y^C?C=Oz$irB@>|I8Ut94bo5ue}^Oh6)p)t#^S7(3>T4$dOi) z)?h(QBx$tSbQZxgPsRR{^vqxW@=WY6u|I$NFF1Sj^pwlua19I0Ae6R_ygo{HbMv@* zT&k3)L@J4BRAZ57EsN$P3(3QR$ug3wM&heIie&=Ju3?o->QFI6`8#n@oKt@S6Cyh+ zEi3Khsgozu&!4}LaXvdOaB|(*-1D-PMQ;FkQ&XH*c&Bcd1knb6MS_gpVKA!FFN*q` z#e@0Maq-9)%1T%1C-WbB&;R$$+uwWRMYCORF!M%il;I9*?z!{l_vIb>BCGMhxs0mx z%9H2LG}}c=EH)8Clw@oB$f$v3(61VZ_#QJ5xIv)UDII5*60n;AdqQh8@RuJv^3czJ zeG~iP4KZR}%J+Z#hi^apr&VIztqcOE^FmVV;QnZx@Jg!kV3<>3>DB&gs^2bZ0_ZjPAE}m&)l_-=deCzR*l*EPj=|L`q3YTvsjm2?m8>N+}?%)8^FFR#jifsn9eQ zRW@`V&aTjVEEmrVe7PHY}6X-3ZtMcI&UwGm9r5CPy@rA$r=`AyL->hoxApZ z{Kd}Cj|_}Z{BI5Mhp@7F80_4y9OwP?v)`P0`9YfVzvs6+_xA>x{^W_XzpH)x3phpw ze{n|g7%hD6Sh;TB-v9Y1boxc}RoEqY^g3ODq;)JKfW5^4$%q8^V6Yg#43nqd|L9}t zlcbM7`2-)gfA}$T^6}emwdn*kHv2H&j6MPtWN?TA(Fh67+Dw}W%c^+;(>~}~vzZNM znlgj$HZ!sbGg?hC^ExnwxM_--Ay>uwHUP@lp=LVwdvOZVu5N5-;K(9hG$|wj-4{7wmL6ZTd2aE==g357{6tw|F zbqgPTE*%}|pMB%$*I)bVU!QMQio|1L<1!GBlGmAqt=yj8?rv^ZS9f=`YhycC-QL&B z>*ewOmDk$~0kfCO>ln}o1fwFOx~;Dd7jccb!R_U>^E3kZC1Q-MGb#i^F(ckw;vEz6 zHYX-JnT4Fjnfg+=K zi)m@i{icC~X?a!U=W{Z%bI%s-K9$L7`XuK8+6By$DES@GDzR+Ds7D=3hMHj>==v2hu}r8Djy*8092ZEWO690>xUJwqb%91L zlPDw_xm>9fkF4Ej&A(8Ur@+#=&e(5s^Hi8Xlrbs6CaYA-{17TpZxqEZ@>NK zsS7>xr7bgi-pt4!&Hem8|NXOV&YV=#SO0&a%4ns+aU_QiW$Z7`-ko`P@6n@Y-pu%- zYkk^7TV+0_MECHc8|twP@Tn4nXs6_%%+t}Mu}D5xyRsm;sD zZ64(cg+r|}6Xr(>Z*p-!zSg4*Q~T36rQ<}DTi$$X$AQ9zhI-*Zf0tNU!i7I=|Aj7# zhM!em?JqbSN0Xk;ZG`(fd5!W5-3rwyqgZ4#s%mvm`%}GAEEf%riuff`fpm08JSNqP zMRM`j$bdiyn}x_`c;S_;+qZ3d1N|x$iA@G|V(Q*+Qf4%c^a@607Lm5S?7~QH#>vyg zX`>|Y)(ogdOY`fq%gTP9l~z+!Sus$a-!;N_NqdA!&1gkVe%2^wq_DiGx^AF6w_Px3 z8*d$yf%PR#9PV(95+VmPk{P_?Q#+3n8~=|7o_hY}tmCik-TGE~MOk4*)&7Q>?DIwS zW5SlK?Z+z%{Y>}LBRk2U!Wo%e`j*eF@yQ}Hl8O1{xdn+kqMDo`ugWqDUIgs{T_d!S zj5_uIXp|7%^q9g1odNu=0iq?4(UW>LI7H@->G&g$Klb?Je{7V(w_Rl-HKvg9R%>}< zPUhK9i(O)sUL!L}#j<{h6#A!)+5sh${xYpt@^ghsE>fvTolHI0#~T`KQK=*!RFT|S=^1dc-sZcV=T`#<@YjT;{L#lQdPmOFp)6Eqg^zr(J_;mlx!-C=A0p4Ku zkOIE21Ei+Amm0o(kk`u}85!pD`UiUk6kXh&0Rz-ZCR5Cw4DP{fi7|qJg1j^waye1K zeYbAfxOu}JKYi$@4?J|+UC%uC(C_~9H-CEL=|}Eo6W4wF?vzJ-3}K@M$CoZ>>+=em zzFmAFOzvsVbe(SOOY1G%*Iu&vc8T+vhDfMFurwRl=fXA@aNoSE@a za=n&m4gAH(+jRzcNkPL9Pp;>Vbd-%W4I8yO!{dB+q9b%Nc(WE)bIhA#ys-^3~?lU_|9h8ZA z;Y}vpu`dr6e0u))=`)$Br*=rq6q(c+=X)-Z{r+D)@WA7LehUetXxq!jM)b0(TqsyW zLm@ikLORARPppxBgk$?Eu8Cw`7gv2j4`gIR$sL4B+W@t{1$+$7wN zu<3LAhA0(FD43DlA@9#=E<|bVlFEwuwm})XytcIBLSb9q`r`VQ(#8szDM24^G?LYg zUHw)4T~)mWtyKe-AbFF~&{oUouj#1ntZVD*sM2C&t#Pt(eDXL{-|wIL<4fCju+v4NAqBqEXMUN^2#D_PznLaR_A+k`^O=WcOq0CO|vNctl=lc-_b-M6uRt zWU`o?EtM&P%uzQBZJ4zd zGlnrfFkIG<{8?fVqj(Sf=2yS|BC`oGsBrN z8jgnX7Y)bY+89HodUz7AhFAy~58Mc^rqxyWG{r0;yGc)KW71U#EsbJNmdoUF%tDqF z{Y}d@fSneL#>eG`B)y7Jl3$V!<47@68fYf;5tr5(-ln9Dn{T-OmK)X+(9E$}Nt^He z!N1(GX+808e`KXxcRle)d=%382**n8NpIY9)A8DpaN6r`!5#zya0`xiWL=e?hN8dc zR%z5)<(MWg+bLd{CG9gFg=cAUe!_2bPEP5NQYnIL$bl8a9WC9k98bx#>Kqi<7#WL# zc`3x0m@I^ug8ku66V%@rT~OQ`!FidP4+9n^t3l7U84Wh{-Yh8BWgG+?tMqB7jvYR7 z>_kS!+4Epwb57*(N5>iq@{gV@KX~xyiNnRH;DJFW**>UGH=XR?c~kq)Db1-}jgDRL z-0V1?t2r0P>1y@ncXf(kRgmNil;vdg=QWp`rN#ZN+(@P9P^c|giP!qOS^l^$hn=f!U4pTu_JAb&Pl*{!a zQ&ytvR|KE2<&8@LW8<)m!DfZL&)krE;cQ`M9kdlS`%+5^o0J-jq9Y&TXr)Z2(v6oq z_WQr2JW*o9!Xo|(ncG%PjH-P_+k2tMtg7V=iCf9Z$*HO6Br&xzne;W&e#J~-;QX#m zHmC_KPRy;$&d<#G{YwkprKyEwvup)5Vd8b4gRAV7Ri+N~%KC_T%(@1qtuL=2we-tc zJ4woiI5i>|q2&ra>V~UKQjI~&FW$j%rRZc@wR#Oqh7Vn9^Pr%wqe5+N>+F*E8R73q zc{jjC%_H!5?QaxU@c?9gEu)7`Zt>eqXDX>($Vxk|vvuU%~|&s@E9#Z3;b@ z6Vjk5Eg@4FyNC+hCG-7DLSaHx&=Sdf_1#xGTzsK~FBcDijTMbahNW^I-##0jz9E5u z`Jon-lLiNoT8!KdxoD?rq%-I z-koQh?;cjPryW34$yKZEjUM=n7?c9}-0aNE?CkV(aF#tY6+ceTz#D0rm)C@g)`;-UkA@er@)Mn_)OgeTVe7v*jdyRe2qBjmz zT-;IF($w0MPB))frlX&oc$u3wo^x^j%(dNlW8AW;9#i_~CMPC5Zg;@La!*7&@S|W( z0v>82?Ae4Hp2=~c4NS5dJ_XnrA`n9;X*hTTCKS%RA0O}RJl!De_+IB& zZF^_8s9KfH8H6~Ts%YPhg1QCE%_rK$9aRTTUOV*|4drH|YE&`rl0vhp*9YO?5m?i9 zQ&=K#EoJ};#(q9C>83GOLxC6uH(jn-t)su%|wHK`m=l7pcQNonlsWD+0HKgDqJ>y3JaQY}{~WAf{TVyLGS(7!0uGJ!NnDVK@C zPsnH~A)&y})6%=4g=1tK2|i^|f5@bAwPaKz)~NMR^1^_+#^}ZIWb)(9BlhZ=By3C< z+(I&4V6z8T{c!LH#EUblRPYC@aL}HcS`7Ma6Mp~P(sC&1n_dnx-rN4U&?>6E1yK%j zeNZ1q1ZuRKv~sf*@)8V8^5)v2d>%>ZZcsK z{@LM0cwKJReo!ce@_6pE3~5aq)5{rz$6%!~7}W_(!#YmCU_d(1+1$@lc1{__Tm^DR@N|GChxP9m-cb<+Ce8_02#elFl0gZ zSx8yY#cnH3dh+F>3qLI(@4)9}8Po>o^&7dVqg3iS>CnZ|y5 zqoGF-Xl-NnbR)*$M(+936*Jb_ffEI%3XFA}n4ei1E^iKWyzch~rBLCw+CpJ-c`c`` zvZ%eWw5_S$GMvV1sccayh4$i7z58ODR#DY?zRJ}v@93$rXt<@#a^#};x;e~+Ef)?P zI+pGrZQ}mUvVwjz2h>hI6}jE8-q}mu>!{!Pv+X>ESR#@tWcyxkRfr_w(LO1+7Xug# zAyDvpB#>7{BHb`oG%g;O>g3M(`Q_=j6M&MTMVDIR$eyPBmUE8mj!H#t-^a$|yGHhR z1P}(M$Ua$guJ_Z~%pTXix-$NuqLY5^7osn6*=JMX&wj(e+vSBl$26LE^7t2)PM*I; z&SqGcKj>t`GM~j73iwF9N8{93b%u%Yl8I^Mq)Ba?n({6hbY8#KIgNWp^|DjzF!g%< za*KT`uzaa8;+z+kGu+r!-)$zX>cQ^(f&r#A$f2H+f*xjS*mY{jfuHT{8WYM(pKa_( z{h(DM921TX^tB8_k2NL`@!RV9Mg`+yzHFqbeN@6^ZWz`2d<&CbyCcL~16AhsDe26* z9B&o3v2kZ_=IY0V6GIbzuqu5u_kwZ(SQ4Xpfr>W=IECn*}~WDsEd*;gE$QZ_so#mgaSmn2~0s zQJwj(>4OTXf|uXfUUH&WC6!C1<1Jjd6eJykVt5b+38_TcS2!|O$){xNMT4z6_p~cM zS=!_N8HwT1Ob^XRM;7Z_^v#|N6?OqFtFd)-so~z|85y4*Q&m`O&D`ofGJUtqGFMzL zkehEaNp+{Av`J1Yor*l!7}CjfWbJHO>{CrI^$#k{ zq}gean^XaV!Y(t3jY^d*JfNi|o!tYYTvXdc>6VT01~G%)8)jf)k*U;hE+QF=A0)bp66heI<5si$ibYFXa ztgUCLalMK%>1<6Y4R%>*!I7*bfwvR8AS@Qcu>gJlN@=k4Q zYdNQEhTB@5(bkkzSKS^`iAhyoU;mh3c{RF*5VL?`O^(I&L)WX}2c%T0)C!qFBa)^l zWdI+7Z?a4dutU&dh+#B}Nm76XP@^O%Vwq8;!Fqg&N4(@@<2QN{hcYpZvp%s34M48_#Y+YK>FZ;F|0&PymPFsm-%2~8fcY6>oDqRCLS6NmEJG24x#iBQav1d z^SVlW32whotkBgR*WkuX#G4Yh*@A&p2$z9XEW3f*umIy<)N&03?Mva1S&IcKfaHCv z#3B_SmcuI>zM6!KP%;G86b&#?gUd6B*if_t$LR6MSPGIJboX$>-Rt18(#aEcP~Eq3 zyF2)Tfg$967#ZQq8Q!GrGTR=9KGL+%kt&y`*Ue`Cv#+>rcJER3XzK9c!@Ez859I9T zOV1u#rRy%zXYy0`!*%fV(VIJjCwnI{`Um%^OW*H-c5r;2S)Q*DRW?t+!P=k_$eHzs zT461Nx%f6hx)>{g49xCq#RfEfmz8G21XD7A{du0FHVQ9j zjdwVm`nvJT&(5E&PTSu!;jnQ>2Hj3WWmZ;t*4g57yE%v=8(@ahZ@zZ!7>=hgg6#=6Dus{hlYuf z$S_MV7LK1Jjmd-~D>!AY2iJCLn2jt~F{Hcdx?+-D(UVKapdE;hzO@k;QjS4zAWfj> zA!zn!;}031V*C#UA5>#dh?y)}#tbZ1D3sU~&`8U{QbRkvP9Yc;iXgZsHYuS3u#jy= z>k2{};y{&D=1w-%uiH} zm;-zUvEx%2iGLz;Xe}aWod(My{-U@NQKty5@bqHH@%pu;<_ciL0GwL64p~&a7muG$ zJ$WWA?euCIaVD4+!%mzDq}`cuHX}WqIh;*T%Ydie*^G?zGiUcc_xua1&k@f@pJPA& z+_SOgS5*~s&aOSJ#y8)@{!m`rr z1IN##r=3nu52vy58BHV7V`(&?VV_P*kEF3O&foUs+aG^;^5iGSPVYXjYxnzyKlvj4 z#PKtkPm=^|{YZ#T#8Wq;sPjBBf&{_oMFPuutK!dRKsZJ-`iuN9-R}s1!04tR1j#fSFLrqDV>8}E-krf{zaDvdAINXlKAfv>E?uDYRV>Gsd zTiR_~_P^yQ*!a%H)(`0J|B8rq#xc7>n2KX2jk6$EcEoiIW@g94uvlx*q1GAOpi?se zE86%WjQADf9itf;IeYVJ3QuP>*|M8+PN!#O73iFM2)N=VL*dV6QBeHHfJ5@8^+|!` zq$FY!QZ4*Toa1Pwm&H?4)ALk}3e7Lg&xfJ`gVW=%%q}oB6qc63q$kk$uaV4m>Cg83 zX``C9JRLgqbi4SC{|_3=myM?c8g>_71TSeNV!z@(3mPR8(8WYWF+oFWnC)3=?QI4% zQVAiPN2^h2V8ce}6r!M<`@#glS|C^~_7cHbhoKek2gITH&U&CbK@OE=pLcoLx47J@ zc4`K^ZfMNhws{JQnD_vb{_cZ!=?{ZW0;0F#ZlMepLTBRq{^ybZq<%sCJo*dzm+OB1tN(cDx4-?L@NZKd`R#u{{CjmM5itzJ z5Vndr1Km$d^ijr2EEWat62>PIWFQd@gVf-jk4ztK+cHzP`7gVwcjgUyKd60T$M98| zisK|wyPgr%=fN6XiB`N{EKavTs)NW4l^N7%@PSFu!2`?yXHiaawUwrX@KJh?RWx?Wxh!5J# z)*4NSpu*D`yJ8~fyP2Nm`X*-S?Yw4KCGSz z@0@pPX3{e~JriaKTi6Jq$99cD_<(qb5SdxqH8SEAyv(&DFOcXHAOiO?1LKW}XasbF z9xNWT;KgnE51iR^a@&c|N=J@;n)%No2X-Cbz2j^K_k)LC*@|$|EnBv3`QH~>%bUSu zV1tV(^NeHz0)l`}f&<4G<01j~N)YzfDev4WE%?n*wOl4rh_#;iS+8#v79XY~Xwm=f zwJ_QU`nE$%%_4-4Q(;t$gEj=^_*UtWLI$}jsKqtNF-A|O6zpnzPpnB8baHr=>ej|w z5+W=ivaaEYd1W#{gV8CvLpnIb6Y!P%60uaE7#$S}g`-0@%l_xK$F^?Vwtf4nZ%)YT z;>u@m{?M_f;E{1G6NaE>dg_7$qRCP)xM-hp&&Bi^h5p%T@65y^%*@EK1q8>=w|unt|Bqk-F$O_q7zQk^i7^H_3`4~KFd>4B z8#|zjk49JqnO-zn&DPsZ26&QM;cWxv%4#rS*4T{XM8(6@lf+Zhlea(p@R8}U5{DhZ z-*$MN;%CgvWK0h0pma|l`rWnB8Jt~3N|#6|vWoHsOHiyMXA=IX+dvm%@hy(+_*PY2 z-$3VB+ij<8uVrcKFZfdXs<}tQ#|pV6lJ-N~vTquzx;T~egMLhY)s2ajD?uR*TDZ@H zJhCxkf(8~sM-2!a4I4l{Za2Vj7WM{EN|^mMT7*V`EE-H5R1H;!Tz}1a_t9qu`(nHe zy`xrqM@xdbu1lO?uqKr3%}7j&3@uEUKeKKTNMpv3d0{Ty!grlNZMyAPAORZU@c}7J(J}448m*=G;GVNv&gXCG zZ`ieW&nKySKRmqa;O-uy;+5C8y!Cc;%cj4+)>b{Ni92#euZ1cFEjpivXzA-r(1k=e zNQBZzlXi?0nTRQydnHM_ibGz(F#cLZyE)EFCICi6dct!Q4)B_Iz&Tn)O`~PNge3-p z3h>jK@0i>7m1G{xuRbX)In-ECR9%){cc%PYuTk;0H?~H$Y~J?LTQW`!qWIun$$$?R zLzvjVYE))Gw4_f)M@_VT{2rZ)9A7@ZK!<FjqH3oe6Cmv zufm4{K0fRTLUf6##Ng0t;~k*7#7}}VLp(j4os$?W+ zGaN!OQ!$QT{PSzCz7qS}t*`#>Q_olvyx|d*uVzNr6$mkT9e|MQ^O63dJl>)4d+LUi zUkqd}(t)F&7uIB)YT8#{|6xPUg|hDbbsg_@#SyxqT;1llu2C9Sj9)`!;yt5JOiTuy z#KdIA5^xD?Hv(+6mSHDNFpPmm#uSCOfW}n&#@la4-`ViiKltA4gKn#ZvTd~54PZyV zVRBNAPt(+OXV232)V5b0sXV)Yx{;&5EqK31l)L(R*2@hA*1Ur&yodWidafE9(5W$TByjH>rAsZF3bDNy$m8(C|EW#j)J6WEN-&AoGA&e+z6S6kt7qW z;@YYW_RyfCV7JF2htCaIpRhK8OJUSNOq4yM>ahH6X82@;4S)$Vzzyg-28~Hu!*`AL z>3if_i_KvewVABSXP$WMrRSfcp5OS=uTFbRU?KeyMS&xW;0AwqRBDr0U0=OaO#AYK*k2vOaR%RVk@B)@aA(X z*CZj_JjpDB39~R1XmRE>v=X1NRwu)U17f(Pt{ruH#v6i(xL_j5VkDc?LF1eZJQyB; zY2+Vi?VRH3Pv6f~oH&1AM^@^o)Gv8X(O>`i%=UM{1ith4=RO*$fb+~(Am;((^_Z!$ zaui?#&_#q5%xY0*S(M%|cl^cUaBVABUITTUqq~~*zKqsf!LDi(jT^(#V@_`%(l1Re&?OHwmp5+KiGO1rc0Q9a2c$+#rxlg$eRKH(6Q{_p#y7zt)?vGgxSRM6 zag?Yhtl0R35c|Inzb2j`9>?}4;tAqW;y1)^i9Zuth}Vg?h&Qosjep)p+)3Pl-`-8! zPyB%RF3x{J{5yWr$=V#>k_nnH68{x{&MU+=;sN4cu|Gg;#&!#?-iF`oC#nb?p(hqu z*AvaeAW=uO;VqvNJ8^uF_=NZoar;->cW_-u2#9fFj2IyX@V;B{#Fy|p&f4|>ahNzl zWDqEIfISPaeV=%NcomQ%xDJqf7r#g+R5&KKKM;Q;_7M_7flWq~5Pt=B+wgobHX-pM z@pIx8;x*#b+V&It>bJzpgnVuLG5-G(;IAcGh(`SCb>cDNN#beZ55(`#BF_TaFpI_d z9_vSV=Z8c&D+SN&Bsz$8;)j6c7;7E2^?1{E;yFOk!rH*vKxl|5!0;?_mS`d-2`lS% z*3D>x?*cDB&TnPiL8t-IqiDBUq5*xji#U$=K8NjD;QBp4SAZuPi74xC*4@M&;vMuO z#k!Mq5B|S{_$ToY@d2?y1c)HE-=d!n62$};+X~)u4DJ09p7Jcd^8p~}V*M-O#FI9n z6`mvB$6Y<^L3~e-UVe%=Nfa{5BH%Pjyn(iQ1J61P{69i#y%yi@13cfw_6Dwr2n$+B zK-@?C1Tc-@+)nt2Md11hagLRYXD$%Sga_aJf=FW}K9&Wah10Vg^ss0Phenffimu zTc@CJQt(s6e1#dG?!*;D>>q3 zPcxfSEm~k|IEs~N z>O+8F#ip6egGtnk7g>N(W}tKR1vPZCb0##8kfQZS;l7G|{PE(F5jWnu-e*AyTrX-~ z%_PrxQN#!u_=Pzn^UyIq+iE1yT|eok>7M2eKb}6S#Kk#iXOfqX`N>RxGzp89S;q%R z_0>oO!m=UHFPkzVqgT>oMXMN)xk^tBGmr&2amYGbI+u`TyM2+?ovmNd(m!xHX2MHz zbE`}9latf43jwEpX@1JRI5QENv-_53y-N=7EC9V3fZFwDE(+&5Y{;PNQ2E33Zvm=2 z^_XnQOhq)aC)$u84A6QD;ZrZ{ogd8C={mX>`<1+WBL{hg0!PP$8H?@1o{P;EomyaT zM_Twh>y-gsl_r-v%{Ayb%GSoI<}sC(<5=uc;$|xn-H150ZiBzmWUTC_rrT+Kx7W%s zmHeO<9yL?NuuRs<^;T17lYFs3*;FOg*7dr&B-724zD}KmzR&G+En1y6?~KK5w8!X` zi7C?Pwjk-q%#uxOk(gX&XT%%F&K8gboDF@Pu@00ytDbX+6WGypwRFzm;mQL0sbdFL z80_2?w0*)@+pEwBI~JP;Dmzv3sY>K?Td6JU;0!oKyx!^7Ud2#twTz;FSvNG_NDj67 z+iUvyI{m1zyDrj0*4hS(d!dhN1c%;b=9TcfN`*s`p4o|3IL15>c3HVo6!@)(zR1hNt)>V|34Tm6;M+1@7 zl_(M|qUHh9cebE>WufYPZcQq`v%O0@DFb#(J{YiTBkxy??VY5LOAjF@>;g?y4pj5& zYItpx$`M|*txjd*Og0Xn4DmqgSgV2CtE(KA3@U{D4yNyF`DCw)&y%W}OruV7bFa3Y z?s0Xt+iP^VsVm_(4NmLpOv(nc(A?+sw9xIm89vY1{sV6dy!1-@RO7Pc`pR+6e7m*5 z+BMlPt#0hDsh;HU$a6u&5S?6_D&&-5x&b2tB zobbu*Zq}TOTD)gcsCG{+X?0UhpKD2Fa?edn%dIn7BWk=ZXe|rYMYh3?z953CRnO|W zfJd{q;IhVSEW4GmvF)=c5XZ8+scHB-qp-uTr~T8@{+VgN7l+xI>1nUuH|v8L+&`z2 zdS-odGdPETEL@6bagM*ZHf`4LrKazk^RM|*`)1v4(&%wcINUCe+v%C09Cte5%<6VJ znSbF!jI#-c%j0rQy4@@%?%$2ZaJw8Hk88r|b~0aeyCx@G9{8oY@BphL$!T>>+op)= zCG4>&&s6fX+v;>Ky9g9*V!5KN@R86UNudoKcemAwNP{KpF^k)>WM#tvhxt;d6_qe% z;epDE(e8L+bQ9~2G5M&432&_>W&c5MVTVs z!YoE`3p9n4afOae8eI4(5~b2N<5Iwg%#^WdgwDIef!XLZe&da3A_QJ_>2b4qqu1ey zTJWf!ct=EjpChzr^pB`#-8|RSyxlXq;Pu-b5x;4wAN7`_^NPW#!I=pYt-k6xGb;BY z=}tU{M(8Df*fM5a9hL}2^~jit&`g^`J2LDNxO{ygDNJxK5p9sF7ot}^XV#;h)G6&T z2A&6KsUgs#@eEBz_?}_Spl?}aSmw*68d72$nx7wb3SrE%3F&2yG^V-|oLMgnyb32C zLxjzd2VzbSlGU1766>iUz-S3u9TfJ7KZ1!4XG3_LE#e>#QOvMeU1IQup{N^}te?=9VT)g*A}Q#`2u&%!1}2K~RsPsK8~VaktVc^L zVdUuV{^u704{kV+0&rpq1p#34i-fI_;}JTH_2W|iFqQkHT#A>}#~s5W%8rhxBLA1O z_keG!Iva=WID}PRAPJC!3@EgemerQGZ~L}Tpp>>iDYQ^V*aQLu$c~dZi4*U=_nwlM zB-^sQC0Snblw@0bT3fdE-uHaZby!L0|NH*mFS)XG$2reA_nc=BbiMiDNpj13@nI8+ zojU|H4jK@JqcBbn93|g99YHs_?RNI0-41&TAcfL^C<53MfZY^5SOTBHf0cly4=6Dd zo(Z7MvtK}VSzrn_8Vo^Wncp=AUQG+r7`oFi&z6EmgK?hC_hC~@3O2`q=Kl$+_6A{> zeUR}sZ$ylto7>ENgGq-z)1m+oW^BvCm+dD%$_I1n<)&TGv;d9(95df_fuVgNDAb3| zLqCR5sb*pkGmQwf6Vv`#x+Gltsem)eRZbaPYv~Rqx@n)VtnP*no)SmfY zHrh2W(Z1>A5|k4IpW$z&5*qifZZwXf(~y$fJZR=XqH(9t!v@N#rlXWxXx#WD#8f4{ z(}0dYC46<m1Ushu%r}igW$Zj?-Txi%A<%TsPa{8bhR5TK$fx8` z?jbtKM@UOYRTm>@w{vXuEm$pyXR5^cPqZ9hb+UV3&HM_5f$5q53fPs3Q<06e5R!#A z!M>h==EuI@{BFGY07GO2XCK$37#zDzzNrd+ zRZEG~yiWWO6uJ@NXPDlsew=aKDV6z8|&{GhoxAMYCDe^%)N~~?|a`Tcf)JI3qL&|qk1UP$RV+7%} z1&)Sr1U}tx09O45pI*M@QrHBiVVUD-_-lN>@$99rBzzsR&#)os^mpgQaPuX=FIzBO zVMBL5lq9%JA~qf=hl>{cA|h5dmXQGDjf4TNSAl#;mI zfDXqDI95=>(Tm@K7EfMkq7}g^zkG*r9qzakRzN+F@N!XKaZYZ|1{n)Ljm4-Cy99ZL zkUthkQz!<86025Bt7CLFbu3U$_~KCq)Ug_!L5=XAdcQhm6-rJ+Vk4OvX=2n-IPi`_ z(-6WGwxd{s1;mS}%mbFK*nk2MplKaWU{c5i?v{q&ZaowTjg3H6T)5jW zhr5ky_~Q_LA8S}wK(1n^%?S%1h#inkJiRm|^Yqx(%u!&7(2d$4a)*PFkiiVHjM4`I zt{8Y1`tWLkkUTur3@p`;bRh)QAdmzQnj461tlAIx#q|&{s?|ZCb|ah$sbE<^nh3N> zfoC{{A9!h}Eq)pFD}$0v>yCeH^6*gwX7y(6gYH4 z(696$>m<}|G9xJ23rhwoc`v;R@`>A5f_Mn13?IEtEswh(wg_qu$2NgLzvd^7>662lRPEqYqv2D}fWA*7Ak zbP;4-N7f)c4f0dN8@71NMlD~?0&x)4^_b~zBE+_NFgOYp&QcsUY-g@-jQTN z!=aqQU*e@ zFq)1}_nnBZ89j1hCVf0N!-NbLRB}!zN$FZj9A+mqF+Vv$Z^-E4q~)%hZCyqYDVjV8 z>{wRnGBKl(zd!xLXezG?N^J+^sOJPiGanAOr?n5Yw-22^TOi0v7oR_q4R3WF5ucxX zr>;m)QZf5kYkPX5@Jr@eZu;c0lG4K-@IyoPk5^K7l%^9W`1u+6#{6QKK3M7xOrPnj zECEC(7RVR$NHC!u6Y-J96oB;{z4T9dx(vBreZPU#`OQ?=-p=_1jOoSwv@a-m3&@^a z9z>zfrn0I|nNE^&kOyIf8E;LTA4{!jXd$F85Zj6MmpW3}uqu?{NOI0wa|!&DggRnr ze)&h0YGkmYk|fPUN=haTWgc&(6$~CbyLRmSOhwBlAKOtxhGq_6rKQ!QsmIMHlJ<92 z^2N&~GMV+Yx(f$kjM~WmBMLY!l0^X#A!vl4w zJ-JvDmLi79DS2SpWc(y1W-7V9BZ0`!dH*h0>fNumY@9-V=Iuy8fN1{<)0BSHH zW0Ds2*MdC{h1Nj_gFhJ!dBCaCfjrg-AT$hUrwhtBB40ELSP>arC;&9ej#>AYCaA(# z)a--80U&c2yZ{AqV94zcC(596=m~-?HrfO(8Hj(>64fb<2sD4SI)tSw3!EDlL;e^q$4soGslU}ViYvF{Jr-ID!npM79BN4+Fh$w{$ ztD5Z)J*rjX*R^m4|BwH`v&-KCPlNb(`K(5MABzvwxgZP`Pe6}fz#~!d=QQe-Rrm`3 z)f&9T7qmNfk=@i+;J@4Py)q*xIt$g6_aK>XA<0st&1D$SbtnY(sXRRpCTN*}CQ1J8>m24l$Pc^-_pcD^s-tQ2s#8 zfrYpN+{LC<-eMTiso*J9JaE|Hh{6$qLk9n5mC{J%dDJ)q=s;|hi zHF+y&eI@FdQXJP9;C>Y+ta0kN`F0SSW}Ie=-l1NGRnCl86c;pOnN_H!pa?@#`RKes z!;Pj5jRa*`b^1BCBDn6x{O4;Ja{9!(j6B%A(?@9Y2Agi3>Q@w$hI!zeii7u}U&3+w zxNexMnCx~R{V>YO^(`}70-pm63`W?&@Dcy7eD6zSKhxJJb10xb4vBa&p-_!d83 zRVb0VAsGspUNNfk_^84(_B3kB1aoKnFbA8H6I+^26D!FdbxtDRp%%@%bII(So}-+P zU?I14WM{#!rawz(#G2ZZeHW7FlgqPya9Eg}V@9K& zS%Q__xs;D;=Z@;of%k#a8&78^CHJ10Nr82FM4ph>e4cR@SZ&ownI#bzvF`j((#!=9 zVx4mxZ_Av?EFfnR3hQgy&!nxqMgu*;`>Le2^ywV`ap2l3vR2Ml63uMoX+>3g7x0evT$$~A!auH+`%gD#p!t7 z`P#<3UXahzj@FkqSDs~`D*Kd7y)+0+A^x`T(okT!!NbL4pvW>5z61>f{6MR40n9lY zn zHTh|yvf@6_SG}kuEcY!JvsQ~1Dqz>NW!oB=gtRsR*;@yTg*h^u1{6V*RkAu>%4rid zDO%JSZ!zIQSt&0+b!t2%Pu*O}QPpDbR^+Ovd#alK}_`m?Jj-A&nG5pg$F0wEmE5xrG0lgAe( z*SyFeNjevElV$eetZ%@L!@&(<8>PQ+_yCb~Cmaz5=rb7kzL# z1cw)tk}=2#hYQ;h#m9l;;TRNv1B3g&hM)EUnru#ME;+@9Sth?MM%d>|muLqm`+YsY z(sTY1KXGjQY*#^L$rm#xdh!ZW?>n9!Pdy3uQeK9Qm~+&4ctLnLbND^&hnB5F$7c}t#1J7h0k?7ssqRbPAV=F zoA7s_n%=1Td((x~p5%HAO?>ok5GBtL6Z(!-9`<$uk(_z!tKy@l4|nAjmVKUfkdjqE z`tiBSBc~DoaenmgVT7^&PD*J${_)B7JoMiD*@XRF$5RQ`PFNlr3u6P)DE0udv`{n` z>cLz^`-E{MU%FZcI>wx228&f%Q%koskHPM8Y1Uv)V}NCjK^i!`7`zt`e8DFh|Lgi1 z<|ukZ(>fI3jA2^P%sE*zO286qk^W%wDq4aS=RJAMBoyp2y9%0lvqmP#y3CQCedv4=U^k#v`i%t0spYdWUTS&{_pyW z)f!SIEQni$Y#m~=VIA1DFl4mZ4Capzru%k+fIl>*c?Lak78t{KY|kdW^zzUG%BxO0 zFOT>?o&G+D2aSAlH_m$sWt%qGPW*HkxJ0;cw$vvNxH&GNYZF*;aBfxV1S&U>UA_eM zKJ~2~J;Ywz9^yK>;6ib_iUMu`3MTXczc#ky$Xqw0IO~x^Hh5ySn>Y_LHrgc33j#)8 zx*n}SMFMF)*c4((XThIgoq;T4Xl)s8QGIE0piR*6qIc!%KEVnc`Sju3Y;r^;i6DnZ z@5BnuSvn6JkVgQl$X)Whf8Tte)*;d%^H2N0cPuIbleA?8Sgo755673@-yXGiw1A&~ zqKbJ8)5pBw$pmd4AKaPO0!Ruf%!n9}gFzHUiT94QeF^5k8s!k=+70W-~1Atdh*%7=pWxc`R?^?^5_2cBnNB|J&*d)z_Dk$e7_t#MGk%b@^gme zXFnT+L45ESLZ|OD|LXMz(_s*bM|X%D_8eIMUp?c|7kdkT@!Imyr+-(DKHQ&-x_8EpV znx2_@@^)_N-nV}Wd`R>+b?Mg)9$ct<{^?Q0eXs91f9)W4_1$4X3|54B`mX4K=asvb zPrQNho_>CCGr=RxIvSHk>$`tM^e zee%Bio+E#LQ}pAR)_a^KCk~Uq)OXdI+O>KE0sZ@<`adV_K_4E+_AQo4E~dB}?XdF-Wk!~gT_Jz@`mKm$;aM?fty_{a z&wRz~Kl=Ph7>4Q%nKlj_L(4j+r z)HnU|<$rjR{)B`-PsSJ3ldxYNZ$yHvzuy0A$;?lJdB6Uu&hWcGCwPzjMh@Gc^+(!@ zTTSl!xg+~Va-T*|mqSV#hJ4vhqZj3X4c66&{W_>l`*Py_efnt*L0xSq(9l9-G zz`O<&-GBj#rkY%kLw!_6iYG6w<4IhU`x5p*lwclUq6fv#LX0h|$+`s%B>pw?>5@B?2BCKT~=P<-j7 zW-+j(Fh`rLFEvN-22=ly4laW+8nP%Bm0sKEU5@`6e(ED%St=Kqt5a7I^(-5$XJ%{% zAE}rB_$Bpr2C;20T6=aH4c4QT^T5@RP7QQy%?Cz(D&}$28FRr^oGwB`v;rEMxYXoB zL&+_@NN|COWQ3+FQRWoVrB-65+Wt%@VMlfpUEjLn@kq3*@8W$7)Z3fehR#2aQk7U; z{G2{7TkCk_DGjL;jh=2nx;9d-MSjg3+~wT&*QccRt~0+6$3NV^PJJllVeNZQW!?-E z^77wbJM!?vt*_7%ewVvblK2nfL+KANTXyBKx^Ha_Lshfi{(Rx+7PuUik37 zyZtZx`qW+gjF-@k$#Xw1;VLNa><|9(CGR^2XYVd}xRia%7eBxBL-6h{eLqEe@y!S9 zW50Y)8^8PXlVd*_M0dmV?t1yr9Hn-L9Nk}m9;`}zgB5f7_r%xU2U@rn$keZxubp`O z>_=y{7yf-Odh=v>*FyK%9~ZamLHWxI2GNub?(Jf^gvbqOXwczuXBJII{UXjpchlnJBN~=Ko_54{@j1$jURy5 zaZCGKPb55EutOwY+^}@!GdUWw=>@QU!MNWzn}hT`1OAVU;n7* zuDNGUFz)w$^sg)7l{kUWdp~~tqXqeEDQ^z69ylhAroQ&EY3y$oKL9r3?Td{-!XYqN zbKvzN1W1(f(%a+yBmXXoX1@<8U?nLuh91vTtP z+iWVc!(q3mwJwoh!nU?WEn~S#DP0IX?62;_TK+GjN)=Wx=O%p=fI}hgM*0khHID#fd{me)rHxR(S=D(%RhH)b%bkV6%U5;+eJfr>mdJHSuvLU2b8PXqnkT zXzlDE_PC9q02U^XHAj~0bQ~St}#G|pLe#S&m+PT+4xO?F|Vtt-C zf8^xgnc`E1n$JO*`Q{<34D{11RQ|Iu>yMPwF0*pa9>R`LUzF$Qx4V*_D5h+tQ)$~5p{z0MEZ4Hg7Z$!i3Mkt=V2$e1Xk ztp)`Y#Jd49fF&OStl=Z!4=z^Jqc(6|+dX%ooQFUy1?EG@Zwc;icp@s$#;fPB2=2pn z1#SSJZ{?sLZLtnJUA$S)bp1#;wzf9PM~kyaF)D{Gh<<`C9YT|5f$92WBJ8VAo2Dh4 z$tqn=IFoxx-;g8ENN6X#Ejm4Pb;~d%*kX@U?UMVJ=YTJ}jt6N|*`P@Mky6BQar~}X zH0z(nDA2=CP5C+`1xK zQ2lqwz95jx#n8oy6-lN6bKc_R1t%k1rVJ>as|9TKO}ONx#2r9*%h8^XX<`nP909IB_d&f z(#Wqh`_zueJop*u)b23Ywan^JK<*`9vtmGA2q}%gHAd>LxrXZsuAVMDODRM@LZ(s# zfAQ}>bo`&LU49;a4m3Ld7f*))`CSbSa-MWJosbL)|8zlOZTxfN$N%f+#;x$cH&6fH zJ%F5l`agB_|FLm+XIGBs+8O`}%9Zv5B2z2SW^dxLO9_o2P9+h4o3 z^Pd{0Equ@hGFB9r!;d^ppDRq)2OR2<%Z=IHVNmqiLQ%Inie4;U@VVqcq+F}8x-fMp zDl39?9t&)-3;cWiPQRJ&S@wp&^ASlbCXf~FCju zIB^8`8aO*{0l@d}+Y3-{+OvB%w&(i0_uP9Az`YmScLRQY;~%!~mOb!g#~!$F*X2?D z;8^0Zi2>j@SEfPEoSQL^uviSk_{5ZkCmUs06ij2cPBP0eQsg102g|9eH&oEa8blTK ztIVn)W=EDCIUyTvM9y%|uqH(`Q;%VO4w#L8RwfsCv|4=ygQV7P_TKT(Aj3K-8Al4jaIn;0GEE>9uc5Q&f>||FMV=}%@>1PgF`s6b*0W@D zk#RG_If|h+9+enD_UeV!7NWR<)w5Vrg;Xs(5`{4|-PU9TGf+?OW(w+R0|fsE&%?X+ z?7n-?Pk-^qV~;-ai=RLE@S_jkeeb?IAN}n3m+`;+OF{mh?%ezSUtTHtYR{c#EXju- zieF1Q{;OLbJCgX%T|2K`YcL+eGKThr*(`wpG6{1H61kQ;BUs}rRbn}ty}BgRPKzzv z2zs%$Zjw^pxLi6%9b$-EmM05JLFFl9jLO+FiY3dUecZ927O=r%WpuHN5JhfkSA7#Z zzjS4MX{NVzX;j2y&d<#+j~17L8kMuTZGqGVewu%9|6=#!|NZMw<@-<>ZhB}PO|Ff6MbFYJ)657Ppr&uc*8aRzq2@DFbq^->4vr?+17c6=a=fcFu| z78p3j1Dyh6JxI-<%f&sPHa>xC*vM#sJBQ*bc-#yZ16I8_xCvZ9V}QBXG~K`jE(Ae* z5X|;NyMFewhoAc}r*p8crK-FV%IF-u>yE+k9goTnJonKpd)M=Cm$3J3$@D#X-u~F` z-D%dxwmHL!uBscZfiD+$P;htJXm$7P?=UG<7f&UmO;Ttm?zqoVnjYX~pUcMS%2tkwrgcJqWgP15A zZ{Gdj-S^!4)W;_Z8yc$%Ap2S6ncKJSyYp4`tXTE?T@~XemAPAGOaYT zldO;2Sg>~gj(dKTf*$|J)y;zx=Nf_bM=f3y+ZzNm@hX2~3=i+P=Rz-~CFSJ#%(BX= z+KQYHAKSC@zvsFRKXUU~_rtM*%$sD5cqfm=2OizJBgymFb?>7KTW|f9hIQ+!S9cOc z4+>U;Q>(sN(<)MeZy&)w1)6D_*=!Sv(Gs{O8{IO$Udy+X3_yAu)cl;>HD&bA*gOjX z*K`WF^-jC7HhP7uu(v{5o-jpKyLf%*z&4RlVWqw>5l(n$Sic`LOpt*e4w+&WNF&(4Mfb+E2}v3uWLTem;<$zT5`xf1Gjmu0^D z%-;K|*5oQ}#-4Meqo%?DO=+ z=1Z26vE`59r3_9HR23F9)77xZDx;==M{eL4@hesuMO34$vW<-S8l_D=ExERezLL77 z>eXyNTA;EU+EB5nibYH5Udi+5D!^u0F6tWZYRevP5w;E&wzdjd+VZBTi%qKP=7Jg8 zeD6dHw2QCd-9U8i*?Z@<```b^Zyx*Yi>F_^CNf4g;8D*DS!+qQ4rde^o)_wLtzz1+ zw|fGxM30>0UhLMATcuI-*Rh5fUMFdpAl7uL=Ih#{Xz^UXdKxXZh{h*`6w`duYMT}L z$8-zgc_N8Dr=1;WXRj1i+iC12)zsRUmAtT`STxcUFp{5o9^SoY@4ff#-h0pP9Xod3 zefN%?yZ3E>CvfV2e_!r-dM8dzaq_u0wC}&}*}G@&J^OHq3TL)ngFayYY33I|Y{A7n zW3wI9u8Ty89s0N#`q*d%cnzS^XoFJkItvn>;Da4eU^V=3xcB`4f$j%fX~dBSzJ7pX zx!b;P%igU&`Sa8FY{#Fm{?Id!$Jh%(Tx`_iLDz-72=fB!*#w_zxDfH<4Y}{VEwnvm zTX_48+qQ4twr%@uH{X0awk@(f4*!X5N84Q6V{drz>doUpo4UE6vWT;z$p~;!5ho1P zX(f2j7EKolQN$uZ)^@-}UETnSTTIM_$fww8KSc48H7M!`LC>)f&dhx5EQmx`vV|CW z#Z8^pclNmGEjr>H-`zbYq!<$h<|1P>_hbw36!TxKGX{f5_u0awPLp;3Ol_Tcg~|9XmLNMoUxW<8@Mt)G4gBFef3tLmWrmxZ465N1VqHX75Gr`i z;{K|U&ep*es9{*Z?HtWkAzMDbt#9H7Az2%pZ!1}_WDYr$I(cAZadDh4?G{c8L`Z&v5tZpTxO49y=TTb%yKC8x^)VWhR4l*JUbt3fjUZ` z$IlY$N7e=2;S`R{Df5nt%`_(1CMMPvSfKN{`t3lt2>94}S0rG8;KCXYaY1+I8=8n% zuetSF5eJs6!|Fm?KDTgk>UIP55{ucTH3TSn%U0B^I& zUtzws-FW&THIX$-nlKLy1W}~B)zDMSgmAalIgN=TWq;>lIe)0$M(YbQ>y$}tCk8C; zmI;vetIMIno~&tfZC2SKmDG(LfL+pC(p)Z|sdlzhvNR1VtMx6W(V^9*(zbdhZCF!X zzItQ~VFFH2F}t=fEbF^Pq7`d(YaF#_T(04Q81hTUMPMN41Z`!t>_Y1?rnDN2d9sgI zy9xI3#>GXxY=r7!(2Py9z^?T-YWquQxPRsqdK;jy;KUR`xA!)(DgDoM%}ET>aC4 zV}7}oj#g#D!hx!(QIfITU1w^GzYnx*nuesBYx7tE9U1(7IWuF|?Ki zj6zVBc-JEuiOb>gSTqP*Uxz5YaKH=U;XZfJ74e#F5UCKk`xsI6h#tOGrE zYy_LRYS`D}0@%nl8HiVY5qt|mlK)Ln14t%u294PdhGM@2r9S_1Dp*AUEUa<;(MMf@zVHm(O?U&la*T~og@{OJDRHd z!O*Jjo+z?Ul_=^uhbrvIL(+E+h_mIR(g8K0mpw8epdL~5ga2c=uX-iBKs!Ifngv`%IT+ZttbQCHV$?NCl381gc86L(belM7kWnlW*G z!O+YkpRh#i=jEw6c&4a;FW}|*M37zp7?ce+A3z?0Hcr#UPIebn)Za&~me;a+#Ne7& zr>>HfEvHxTDjf16*h%E#A>w+)G)2@b?60KLyR;K*<;8jcq(CA*zu;b|6_^Vf(}syS1nWJOwTg zCpr+LNz6@MB9mkkN&hrR>U9;Ak$HDrqm0CB?q4k%VS>p~Q`O75tBOm|5rvgYjN&48 z=>>ilr+!>rI>;07E@$By_3<2H$7V}EWJvr5*dIqjpmqm0S^5yf5kc?{My~*>5wrxn z;M}_oS*ShMD0&(4xCGau(RF{s?(~Pleup(0fPg_{hvIbMXkZPT5_FLM6aJW?Y5+tv zLz$@%l>9**3n7rwJ&xr@zjqzEEfF{u0Gsh$P{;|g#+Y5$I+T)gz*naY>g3f?9?7ZIP1r2H-;EOuL&P^VlL+#vb9r|`4K44^V)P~87b3nTx5;E2e z{l@AnZeRoO9Awa<$$6J=pf%LNf^;J8Xwatjx=m#jOW}wQVkmF+hCGN~5ygDosNZl! z<2bJPx`{RC4p->n|7d?-IiJB+=Z*Bf0BL{Uh(ErZIkR$WJ`_X}kvkKFd2C+#pwDIc zPpx1uG@Em$!xboeidi=rja} z|39?_)8mF!+d8HZe6ex1DMmVcA2^ai?kdWPIPGvoP>(_?hp3FT%W zS#AVMF8ZBekHZC#tq{A$`wp(Gw2&{d!o1-@UwV=XX3T^T+st{#YLbT}%9% z-NWC$V9@V`G*DzP))0gk;;X?K?K(Rs(JTHK#WW3mbzMIkG>fO{c#@8;3mp3o= zeXq~khwFhzw#9bI)*aKoc%4%(t$%v6o$-2 zbGdC65<&6d3PMlM)hy4I*DK40T!WxluI5oDsN$OO34Xh9x{e1~QdlWJNnL7}U#_H}C-rJwy6fd#kjfkCq6Y*qd>14t6^SB{Vp1%E zoaRFD#s}0<=h41Da!NOvGY-_(EmSBP_3fH&HAEi#5>sX~k-xxRNYrw(M=Bdbh$0?r zCyb3CM9s==s8SAhR(Tri)sh0xEwvijhPxq!LAY|QMol7+C+cLimP*i4m!h$L($dm7 zS$?DuDD6!oCZ%?Eb^!3F@98RUC1I>>qP?vSjJ3K-B5jJ)=xnTSIz`}=!zeW+T_vl1 zJ>(TKP!wH>wRK=*0wa zqA50{kc|`a#%DtKpHWd5{wy(IYOb7s=hWwExt+x&W$FrJmZ(_KLYSNdgjtc=iGt}= za@#^i7U%o`$VAOV`T%@d2pw)0A1!K290v zA}%C!r~6wAVKFCB<~!=eIfdX9QZq^DZp9#`lwXTF8>Ce^M8X8ISq34D8&fa}=-q|% zezeEmBbJelCljDT8RU7~NZ}5ti}4@QX_^!h#VKo=B$!~QJnyq+NNWtKM8%S+bE=J7 zgwokWIX`&C{6x{8wQQYBwrT{Xa@C>sn8a8o>}{<=j{f>owA`z;ZzO$Tk51Xi!ZEmyBuk=Z~58_`V; zpDnCWAUzl`Z*=p0PM_Uv=fliCZjx&(9%q2>zzl))ARm}1tQ`t|=#X3r&O27ER{(@F zybOWYA(7cA*Sa)*fhDw&C|utOv(vQSn}`H@pV{fM0vFdK5g+f-OG}eST2CilAT-7& zC3KEtch{fEsd!_$qGCF(=!*s!CfFs<&Rg!eG)zh8uPtO8NbDWD*f5oqGk&p-E)HEW zO%^bp0_z#k0|JWbq!1Lyb{j#7>;lRgYjHs3t*BOV8JsQvr{&4gOT8B^_GY9c*Md;h zBjF#Rn;2=6i6!+(tp&-1vmFKT=S$LC(;F(upJ(Ty*1h#o0bd}`j%P70W?fvIdN+-5 zar{yWJ3XPNw)Txn@+)5&j<@j~>3Y1c+K&BiCk>=_AO85|5_mg3VtL8oI#NnrWqDg} zS6*g!T6a#xg}!WBM%(GZ(~a$M7mnBALziVylnEzO3bXp-s|LO(s;$k*YRpce9KX;b zy>jTFOLM^Di)7^PGc*OQYUs@0ppiLQNmcc`Mb+-P8a2V4I&*-%F0}l z>{3yvx+|LjEKV;Jf1|X|PW3^tuo=$m43`ad6dG%m$6g*>9;dCu4fHLFFySuI3`acH zKfxi-&QceKXe-OTGvXn-V0K|b91?C``aYI>7K23zJi7(cD}ejKEQUUir~;62!A@pE z;bBNIOYaF`p|N2wLk3`NVkIib>=ZT(fZK!BzevHX(XbWVV7oYek98>I1&a+H)Exv) z+>fAA2&_U!uOD2nLXMCFmhzU3wn@xAUpL;3H$L=D;~c-+0?>}8b;rwxZC8Hy`-bAW5 zv=>qd=8nbw(MEB_FovGXDyC4?z05;vC_<~48yctyk{iJM*f&mXW1i&XEdh=nTw&CW zxa!)K7dgd~pmFmwFahETX*+)zpHOxjy-B42LY0*%ufMU{X?F)Aa!aQ4&H z-fEucGJU3WvRvb_EQV$*c8uvCi(#7Kh>l&?PagUn!HVbi$jh5hQM8=ZdyzN+$r^Z%o)zwgx7H#17F&3uII*36<8WYnDJZaZg-g4G1bY&4D~HeG)H{ zX1b$I{ShRfOb*jK7>VS$7DVa*mbbx3m?t%dnuU$_jkX6+*U~;{yzQID+rDYMo;1-n z)wTm2{>ZcRbz4fwu6ABI$i7JMBB_w$ZRau%p z+EQ4vGTPsz8_fo6R@5}e%FEIh8;~NusGYTx&L=m3qJ3z(t6N{g>#7MOb7l^Uo~x-I zUFi+?7J-zI$1hDCqWUSyc1TS*jJHjd?ES9sYP@kR-Z<9Q&mH6!D#+E~1AUo_LJ%$h zZMy>KpGsRj2=<>7tp{=ExotixhFJsP zTm^zL@avH805_T65QZuRQJ)9yL_c!5BhZ4^4k-hzKoPfjA(0741hCn_glGc;jXfN_ zDg15Y;Hwm8-e??!x4=D6?g4hqe}*|W1nxJnzSZKdWdp#0*Np5Nz80=Q+~P_vFAPRb zPVYP@y(b|2I95#s?YKIwSD*&F!xeJ^dQ6cUG>9v>w}MRpczprXD{%`t5jZ7n8n@sK zC=1t2g~ZtGH&8~=&l2k^)7=ccl`3~Ifx9`?BH_`z?jF8t)K+_ufvxn1+*J8u;wmUm zVw!JFI?|BhVHnqFGBm|RoH;0BcIAt?FC-I(b*i8&>X2gVx`<&VK$tU$LMv~uTz0u;;)Y7HNVtuHaNmQg~A8r%zgHN0*I_RV#Mr5DblM55U_)S0?R}P zIAh`=FCn=?rA4b&q{><0N2NL|KUB4f9*rnWYZ6pGW&<~*ffp_;VTT)@jLV-*a^ zOXvmDopVG2H@&fmnGfFiFJpCm`FUVYZ>X!L<%-H0dRTO7UoW|zw$jZ^0X+k4>^!@v zgTPCfBIUx%3HB9t7l6P#mgGW$q~eNtc2UZckyC8o?_25!lGe4&~vvRJyrCDD|8_ccm8S7SjZx(Jo-9tE^eRjCx+@W3w zm)LW7%#(GvAd&7nnZ&BBFU-yu%}AU)Pkr;G3StSXZp%TuOQ{LN?PuTjw13j~e!K3P zS%?>Oiz{1EVv|6aH=ac15rjQtAxO4jnY5s1jE?3(K5fWg<)(m1<% zY(SRPC}^nhHnz`It`b2FVmwSZMH`m37oqld!8=h+PM!en!PE5cevG(N- zPD>dFO;z-OG2}5-^Je!?e8&88xSJMinOC#stCz%u)shyF!NQfoY7eE}(1j)@x&laC z**MeaM{Cu!OGr7+<+CJR0&B}-6fL?qu)*gAH{%Y`ZZ`bc6G!D#zb(*!^|jlSPRGq zQ^4VY<8nB(4ZcB@L5vE%RdKYS&hTxMpeMxwpqvGTWo!tvjGHj*u|w*7wZ!MvV~iO<;} z$n+m6XdFmC>h_$HZzjJpclKI<;}^5+E-PK9rE^s0n2AmiBRK1wmVndGdG`e0tz9=Q z4XW)1#NPNLA9=KA{maqCAga1#!pw3V~Dpb{-zO$T~R~U#Co%%1!uqF#(<7 z9tY03{8CEo;PDUGr@BpsuqWij(Bco%y%AN`Dc`UmELL_;#uaA$G<12yvJ?HROe3?RV7g{?xCxa0 z-_3(5Y_hE{y4G}#6`kLRj6S@qS!8iO8Wt*jMqr@UCv`|Ehaj@`b?;`G%4ovy-E+kP zj-Smml@8RGS7^%BrRq9m$6^NxQ}d%}rE6@qV~9xXE4G%7jJLF<4bOF;g>z1{LYX5F z3(1XhO$Z5ytVu{zt!Z2w9w67|4-ZWA5~;+2n(D6cI`Icmc*pZ&*;B)eA$l>YS2R}5 z*NoOuI-105r)jqU;V)MgSj*Z=xZPv*7Sg3;2kkTa<(jd#beQIcRZECY3nA08nn&whVblYia#7Z(BM{6x59y?MB-(;Rt{!V#o~I6R zRI|2Az+g%gp^>@a+(9o3DTpF-bElcoF4fm7mIs~y1juGjyV$Ot6`>LWi;+UAkT0*8 z$;<_-w}UxPwa@kKkO1H5gF%xMazeSG>JfNj z_}IGO2EzUx=4*wx6u^+NLX{1HNoS!y0!8G%L8T8}%+geZ_&#cv-e>Y!LOfeYraU4x zEl*p;3Zz~(L#%L>+$2CGWn{^u%S7GWanAL|e->Ir-JK36>-P8PKb4OD_9{V5k z^XW_dt<@)wP9vyL=EWBfqS{Rf%%SghCy-<;~35j z1~dfp22YWUAUzkPdVqWz$Op`>D+KfbUUaM*Qk6j-6DUjZ?eOwgf6F+TKGxW7dpYf& zi)WS-I}^}XuZVhTi$_xnGh6Zi#WtNvpG|5jKhXB&X2gA?MSj)N2Y8ym0vAieE%pQx zz+)x>JiSUFb!PZtSOHbA^<2INJY#y#K;o%b6@I7N1*QZ$Fu5^~O+K+2K%D_lyP(E> z>>Lo9IJb9D0MMEt*zr4Pi4Icxa_;C-wmWSh**%xuBdtSqgH_Do9&Y1u-uo3OLQH37 z#@9-+3+R;1IWn-&Uj;3gy&P?_wH9uE`Lef9;OfenTv5qe6|7lHhZxi=RHly58sL^! z0|KB7wH5V%OO(Bt_N9=z2x?B=1g`DWRFS&}2Gyczk#L#nrj9m^lt>86N;#u?r46co z2fFH&%pN0EBPKZ{eU`B*VO^oDQ&#>=#fpa4Vwr9pwGe@uoiq+wYIE9yykW~g4eW3$ zakZs*AVMAyC>Toayt1J)FyA^34uF}|JW6nU!X)4|S%C~*esyYeldnA&9>Xxy$PZu3 zgv9HTRF#5A)@&mszoB=T(%n19>}$`fwf^!Wwj zWlU16V_h z;fCJ+HbD(=>mx(`b^QfJ)4jwY5GTJL<|>GSmn$(}g>Bs}wOurQxxR8Nf4-YiI#6BA z?CQ&7*c-|r>t#_gi8(S-*$3Z6MbcIgp%*Ono#7%qRGCAZCZe(~g4F*HVebLmSazNX z7OT2i-EC=P^{m6%ve#P4>(t(JcC$C zhc_?jr|FR~1R{$eCb0J~u>~UzAjo41BEC&uut)Fiu8@y5JR~uPx;QTTvt0q3D&)^4 zCo}V~kDK16+}6nXib?Jv!3q0W5r-%HHiQhi<{JG24_+h@3P>#Ioq@!1;T5Ao6O-cl z#P1Do=Ye*$TRT(jJn@1|r`ofSF9O_!P$L~YTj19Q^o3HZ?NX? z>JG~yL-9b8jnrJGloC9=MYYwHP87TXe-Hf^y&+VJ#5ER3tg?CaFeUQgNIBT&2tz%C z3HdUvW?Gf>p>PouWyhIBpyqFAn<#%*TMD)txO(~O+QlxD1YHgW6Gez?eSv64i z$Ca=jmAuJNCKWHm)yZf9CP7-6h?GKgofX;3)=n^)JSo`6nSe?#1dD;D+mMMzi;oS< zxmF3npXD>3`}*le+F*D-F(6m~9k|oTg3jti<;*8@>N6YNV-or^$G~CG25iyUP7yT7 z=Nc^_Yy|&EHw=jFa}9qCbov2b5mfnT0q7v1%nB&vpNgwy_Q>-7MH=YPs;_6Ker(=xylF6u6AxYwJw7axZ{A*<`EYe^Mg30b-WGQMZ}~lR8?@NFZ`sCh=)o#N zWB)cDdgqex!iC-0uM*#iqT_!Y`3HmU<^7>MnYZ-Ily}DN@FwrE=B{TxJ1h?B;o@p@ zrm?i@XR)x2n+t9-ySM_JNs)ED8CONsNi#sDuMwq}w)P243eLDrR%-V4HXxDkKi*m& z+2RWemr4vN;1HY#4)++XwIviLMHy^5O4qAn^*hD16Qk(eTHO1UdmbTq0Wm~rxC9|~o<~r3v^CI^m%J48dLKdz{Y<%Kz=YPutr<6guf(bDU2^OSEIfofrq06e8;s z|5^oAF)pS;u(T7N-U&~+nd^bIgUu=F!8NzEhyLRV2&`SrZRR=qH{$)Rl!rGs_ z9fXLXh%!4xH!)yXmWX7wDK#!kY|bCdnRq6ac_H@LWchVz)gX`Kl#$ItQGL(6ueH%3 zPh)FnPdq}X(jLGL`mLQb?8yN5DgI1PXdRkl@l2*#%!45G2SSOGMIz zc>WJS&xYLAvIK0{!deR&(Dgx34W)gB@NvElLK5K=Ww1h1!LqM}{E14v)IKSGIxZFj zq(bQ}8U$!giG_h`7W@Nw9c)Txo5p|@Jyitfb_x(-AO&G7tz^I{knA2knt4=F0>l?c zUI5yhuhzkn32#7V7a(~!{N$w{6aS#DjsxcOS!gi-fTOcbZo#*A2ZwgAgMR@yH0#)P z&vgKaq2MY16*!NNJrKVg2*lvexCS6E1MVb{dpKi2k~a|OnttNW?xGhGA71IsjLN5m zbn6aWbY(U3fY?TY+4qMi%dg)t&ZVgk+nQZ!ymfi4FpK|617*L*YrS@rm>Zit9-n{j zZD2rpVsN_XuZm2TyOpgMtEiYZ9Pp*!-ABDSZ6ycv`@KRI=+=>0%M=z63>ttK>fKBh zRZhAadLUuRmr@;W(Aa}5vX*Q*K4~cxM8a=u-uaH{Bhxf%jCE`O&eo6bAKh7Qq4Z0G zZ_M+i$3%lyl@J}k5zxE4mp5M-|9S8gMPFlF*u9FOla}B0;HjsEsfYeLxi-U;>WB8p z_{gFJKg;J(0zA~YES%&Buwu*PJ?vBm5y!a0GeOb{Xg+kDZhX-`H?O2BMYaWlYut2w zkDOj3*p|lGkF~UizE+%a5e9E3q?dju9lr39`J;`%=0AaT_9FXj3V&-+Df}0RZ#;v+ zqYvyCP48`dC4+LDYlN$|EBklut1s8YAJ$F{DzsIsF%no}iE)t0;vtb$rY1pQ4TMWf zlreR}wv6sr0^g=iU?sOgEvrRxw}Q21$SlPorcbiK33LfJtEnw>+S@z@wk+ zc0H$`KalxGCntCIG|CEI5TEC|Huny-H=wE%F}~K7ElEv!o}W-d9^8(f?k8;5k#TZy zbBydA#@cq&e9xQ=KfMh|-z=D=P%{y#fBA->O1<36PrbzS>eqnneOY<>8Y`r3IYUkSh=TI6%2r zZ#{O`zQUn|5jkg1Tc9xbKpuR3=X2RorV1F&Q>_3qvet>Br=WmFwdWAD%8k8YAilD9^KCCWxq9cV1;Ib;jx5g8-+b>W-Pp<--Bb4G zW5TAd)&1V;JFkzbCwVux-@#cvI!<4i0N>!1JGWP9-hWtwt>wozKl;#gv-(EhgH`VME^0U z*8|x$omAaKP<<3ui0l2vW|9;BRbLC3qw4nitw(ZAVe7OUOhyC1xPTz}t zwh2THunB<$00u2;RgLiWJh*O18n8eA7XZJ2Y7L)*JO;fxYk_x$^5jF^-jxE%NAwHu zRZ!O3=r9SVqE^ff{_j3dDR_RshmZWAll`J>r`>BBn{Ya6PNv{II0L#1>|$4_otHIB zI}H^6a15BT;DD}QR^wbN?1RgEJPe;Pc)&pt{EnFFq6@{A4Wk#O_5yMayUnDghINEp zxH63pq3pWmCO`#nFF157y0@irpE|H?XY4OCN^Bt3)U8ji&8Ampqet{c^e$HV|d4eQHXPy+)`?iNngJdoCkg3KQ*9Q_0(KeI)eepLLA-ItT|qD z=;jhA@{)N>%frNW7p7LkkgIS#@_qFbKsEwP)YUmVcO|=byiG4`a0oZcKdWc|pPRlo zik)Cku@~23C_;2FgjD18b@M`xN^7CxX;cs{?CoqDQ7^oVTSg5+lxk;2i4?Y$#GF-v zGnzqE@@S^{%H&LQld+QpWYafR%44DB)tT*W)e`77Jo6roTv{q&1niq6-ZHZB%X8pS z`SYsgwv;L10YVOp61j!rnpRNI;cW|Q%^xp?m~kS(vS5W{l(FfVOz2h`1uxp=JU2VY z$1@+Sa~TlK`qU=^6!!=8ut5TzGKmRrlWhSf4&Zs1MCXu^>VTL?Z@(CQa#6xlb?qJf zSih*WU*CQJY}pScSo)jpS%G__C%p^%{@e~{dXl*h0md$Vc$KmlSv^=9=HTa+sM^hV zpI}MA+}5fXwqZI)K%}XK)iE&h7d4B?)%`^~R|$OkNH|9lZnv>ysaSz$g_Z>7=@TqG z$Zy$4hsjEb60@`d@RF%n(##YeZ&(=QqvmvEy}G_`pnBFl8(tC?MCmlhSvx>iZY%mg^sDarC2Y;HLeJMQFKK-TreSfmOyDl(y3 zxfcdV^{*9trQ>*^4&VutJ;^m`O;iw)f`2i&IY%7vX*K5tZ7xu^hD-y0IqNQ9e z0kv3q1%N1ILp{jkXoB)qZlQAC3Hl6VOo61!gu~0#4A8&^ItiQViNSf1!QPnuU@SFt zefxe4bMu1y>ic`|PXWgEM?X?A-x(FYICeMkO%Y3QwY zwO6KVrv^s_q7|4I&ZGb$TSiF%gCCYIokXR|Gz=QjXCu=MEvY z2ekJL31I6eSKw)38#-4$DJA|0C2}y|y2S))#o;cs4wOMFp;WVz&J<~&ZpDjTfOuD8 z4S~Sj$*0Qkw#a0y)=p6U1kf-aKSE$>1y;fSW(1C-FLW!_z8VKs(>W0OK!E;quTp~8 zaP%CQ7BFb2`xz1Qk0%(Sbyx^q(J9LuOE;%Dp3&TANLR%OjT3Rxivb+TtX;!4AhV0i zmCXtT_m;pR9DBobQ%l9UDD!uh0V#{6WHEfj9iM1f{gG=-L|Juh?57)5xjV;vH0?qV0+s|?N1g6TaU>I$YU zV+#kEMb553=vq<+=VY@a#xZe2zdnKMJ{B1MHOB`#h`5T(w;`syH?rgSsL7k@Z^BcC zfB*rT$v=Sh*ZtVaACa%F7IU(*y{{^DZjX5tt_s84nk%MLb zrgLR;GrP4l%onIgo;B<^Z%@7_2gR@`y(Qg)r&1=9c^uL%I$WU$BkL+sX^!B>fs}bT zF&?hGoqq};;dOLZb2WrE=aafWk==Sr3|_w1U*h8xgL~VmNgWqpu@^lY{=1W39ero- z<;y;V=C+V~c-Q|Sn>02PUR+HNvXy^%^qJAQkXhYwFkwa=j;U!a>$;sXw<+Q1HsJDV zIxR(rtjP^3Hi*7Fb|b#18$RAhfv3HNkJDP@6)%`HM-13hr`=mr#eQ^Q!m{F7;A(Yh z?JhjHARW;noG@Mt<)CKOlk)~DLBG8Ls9utvXZmB_?7}W9%pxr?_7`SCn=*}=8zLRy z)S3gC3lgD&(+kAmP5&fDt(FRcOMLPiQO2g8(6Aj_r)QRaqz7RwVP#4M){pzEmt^WH~tJ#7r3%&$z`k$Xe&AvMMe|G8} z7gh-7*`t#oxf~9{B0!CfmDlVN;fcWgn$-@R4UK^SBb@lDGy!pa@a`?N^xX*W(xi^* zS(#7~$CyK6&|!y)FRiYR%oP7S>+b+#uz^Q-_LAhQrpp{Wo(2No)y>;iF9^qb_bz{6 zx(FevfAzoaJ~e6Xfp=pd2Q^}!0xvbH2S0ffaMP?LgCc=)&rztRQ}#xq(rx7=4lvVD zwcLUVu$g9`HKPQ%e?TVmRTRuY>0Xe*Zg(mgE9ZNXt1~F+E_jnr5AD=V3t(MzVLNPt z`F#dz90)$Ss|5j{bv=v3H zU`Pz_RUF-rr8at)tfzD4vM<%?hpM~INrO8Su%omg3X<1UO+c|E=cEe;#C$(xDFj{J zs3wPy^ub9rRX);p@&^BK$ce1cme0`kJDN*};YkCa4gqZwI@-tj!;Sw*?_bG=vR!cf zWc4BB@@Ix}aX%1x2O*cE9W(hXHFv^$&?_p2d(L9fl6JzEpDh`(MWYXe)*u_`<7EVT zR__Wv96s=(z(M!eu{~M}LRdcbnk>e(4CNw+K-2x?07Iu6JCh34Dm{neh@jI_;-t=V z-*nxC^E1f!{iS8gEtp^i`ttTYzkSe+-JSu;mWkcPWrm6~;|5bkFw2~?Z_re8G;9w^ zX15(g_5Ee#vc`Mav0TAiDNRS(NZ7gEdmpCX;9FEB70W35i zaEs{TjY*fXD|#&5C%Y#su5cjX)WRS$5Myj_@n{xxB;y+-KON&D*in5ku|T#uxJK$$ zX0C&*I}**blwl!{^&0ahi+hJ0qCm$H-qdbV4NDc;2W9Y^_0%)!T_bPmPcyx@hnt(% zz#bqRk(MpHQf%;jUKVv{8rR6qH805^pfN-W@l0}ReM-Zzbk`vG1fECi7{|t@Z|`#+ z?{~M2xqRo~+RU(O=&sdvt4sZ19Ca#h&s?xyH~$kp@~GcWVr<-4vcRoeD{K=Wo+(P% z>3%XnB-e_jM7m&up$Ke1bRISu{eBm}r7}#+0!V$6A&sd5OZ_r=@@2B_s7WVB$1sqZ z70|{o^PYXLRgFEN7-R+f?vcT*rx0Xv?U6#SokR;Q)a27nXj-f1=_R9Fb+A9tLw}$= zmWHX6Cc!7(hRQFzmW}F@M^$c%R%f*yiRZ`}(t$CQT!)MX*s^hyy^tnCm@z)y@8-s^ z{^pg927WR`^Vf%MgwZ^TPfa`5N>gUWeCRX%wgL|m8C3tXO<@~IW{n=?1G5XnKN~ealJ;*_{lZk#CEw`g-GmAeSz-;B2wt596bk>2Ktf7$3-PQdsGL)Nw%%1T=1KJQSFy)Cg+bbD zhqSFa>I#*4uE)-Zv(gDJ1Y!o}m%pCf_T>b8_uGJcRVnjQdNocSZ$KkBNw$8OnNqP5Bi7GW4*5eyhe*lV{98D!n&Q#mba3i zk?;Q|$-XKOi}~|4l)&9&a`oHuW{4=JSL|#tk)~j7w3k(ONw_#!*m?3Q6LVVjP6$3?oDN%mp|zZ#P|7mdn+sOTBDzK8rAAFyD#b^fA@xnV@Gvv4FXt^Qm%xxaz zP}JoN@V-1D7{Dagw2uKq=JJ9LtOvnVD|LUOc|jv;-%S=H7iM0aSc=}Bp=`~_JM5Ri z{+W5@%H^%Kan2xZd133yf$o*v%VZk3>!xRspMqN;?A(cf)?*#~k@Md0Md@84W{A6T z?}Gfo`;s>>eS_|C>GXt0`}e!o=f{V}ltX(Hvlp(ct&d1i?wOVpX2A^t0Chi`*I^m+G# zpnDE8WzmJTexr)LbKum6krfZS*SHXD?r{FE?TLWc0siP3=n3F7&kv8x#(2(jLFN?%iQhh4HE1?s-O+iY?M{e!nHAIgDn>P|By!Z2%T%_Zre-}`~t{I637{8x4_7!aCRL^oIO!0P0_Vj~ZgzB9^u?G6cbUIdry z_G{eH-%#9>PEK##p}U8u z37OIc`ffZ+3rvrQ77jHfu*u{g6B{;Cvk$(oTLG&>lmjGEQNlTb>Wv*o7r9)hY=MhE zQZu00H(a@ktIBsT;sznnB=F|shewxTIxrUyeGLtdnDBSOvB7WRE1Kk1BW{rXP9)(z@YWKPKfH?*f5 z5S;v#jJcW6=_gGn=jdhjmSgqf=t|RC&mA<-w@^}7N@}9WH3N^MW*mwfq$KP412C1^ z#%S{p1{hIxHrPJo2D3soxxJkQKA%)A)CwGmHpN&=*wh8Es zdZAZ#1FPF(^UVXtE>xx;Xf`pcR_eM06<7E1M2>_IUT!19f-f>7$6!H)t=__qVI1mV z-z`>rX&%J06`+s|#;#^5vdO}g@0q7pCl^fkDbqa)j>J&Cn{)GA(#$N(O!8;Ky633+x#1tq!g+EtFmL zoPIfa-${sW+Sqc@4XSS|2_O6$kbdKWo2C~it*I!C%5kkFspQ?i)NZzRId%vm5Xy{ zASv|J$~f1d&Qkyo1$Gu}D-5WMFkmSq(YX?`DJT+E5^pbWQ!U@}cFH7lrPw-LR#4Uq) z!@p}d_Ggr0Q(R609Ru{~G}{fHT#AelNeN2{aq5D?9Tu>PUM7gtmOxVxfQg>v-8DwM zdvzzv6A5I@s*=bFWy0xcA4>wf{j}|psdX5Ul=Kw$!rGq!6geZ*ht?_TIPi1Rx0;<0 zJ85K?Ro5u@D+-u^c@LzzYMm4o+`-EBbA29lOQtw_^VqfzkqfyLGMyiGi~89_;vRaL zwu53t&IXP>?U`~eM#vh7L9h?jNos+0&_z^F)4A)85pWPvra^2lMtHQPN%7*8bRx#s z9cM8p2TMJq67aZVC#c6T;TS3^J~p3F3wKQ`{P^8NIhST(t*|G+qWlu`hMk~b%r1*& zw<)CkKV!K!qMF-BTXfkvJ&YEu;BdsV$3?TYH95<=y{kaEjp;cSR>OqMgX~07Jr@~V z@R{$MW_%-auIXFl#%A5rxC?J`)^6@VuEkAIdc)o)ZQP^RU7aPDV84j0UKkEYlw z^YfAU$W&lCKvFVc2`gvWw8?|XEYDfZ&N)(6NYb!Fk#)sq|tFb%$*lY_QI?fk_G67N7h2=|}qB^CuQz7yX4~L+umF^#w~)5>=#4J0(btV(ex4 ztct5JZuv$L>Xd#)WNSf z7$>{Tq+Xfabwp!fR??lfM_^)mh}xtAg?A&aoab2nXBoOEDv-O}uJ$IZxejZ~ViTzh zHB)mpAt@=upr{=B%*Vc{#|J)13;QsL9Mbr%jKR)%em22>=; zKGGOZLI0p3E-DoqGXX*!oy(m>y|4*|8}N6yxd?FT^QkQC!Urh;ogM>?so4gWB{XeE zLux_7ZTmP*dAxBqFCGqRFPZ-F;G$-I*_16Q;qBU2sU{ky!?y_% z`h|w{!2vA~sCA7bqgN9{?};45Di6Pov!Tw1oaqH&l3-nd<(bne7P-|`*~yync-~A| zwE3`>qj~3!Q1NzjN0wU!DV`*`TyvXPZE!VgFv6P6{0>3oT~DKm+#&Yrm@b|YsJglW zYHA%6f*OhIcuO%h9Xh0B>5N+Bv8QuE*uAKHPy0R^+{LWk(OzfVyoHCDH0{m1+qcM< zgY4PV|qAyQW-&HY|93PNp2wdG4G7Q0Gzn zntFpIL>oaC1>2g4PcG#*XpENO9w2{j;*K7`4BEQKW${34RLYewRbg7=fnUUh<0F~x}-9qw9Ox|k}t z@UJ_lw~O^>2?ivhx$MU6y#u&}q3Y4)pQmV2^a`x+Mq}5IXtdeJuSRY`4sI6F)^K*ioh(xt7p@5toae; zIwTHYA)!mM;M!$U_zd)5k4ocH_EfIItD@e4Ps==%Qa-!I?$XxX{)hH8wlxv1F?TF2gnHH{b_?Y$v>u&7F3 z0BBr$OZZIfLh_32&JXY3I(7AaLQ>xW5A2t~wgL>%ZGbHPLapaXbSs@oH>MB!!9kB8 zCef*HKXLy%AChkAZcZ;Nu5j>|-{(xTx3(t)ccqK8n>z^6@aU3cQZVEl`k;&SfBE2< z_|}DW6LEg~_Nn^=4So&?Jh9xs{h6gL_xvbs*}Si_Y>WvHtW-vdMipJu+6*{>ePk{? zrGK&o7|dvtI3$nw4I>1UVU~7WX|ZWY3uc6Z3v{vZaTWn(3e36d0^H>XhijV(=_^3p@ zNwn@L4P232;362u?`f$4=8gi#Ro|ad<3uVUfudDP_IDDG z0qi`KMMu%(xl|$#$-8IE0;sqB#9Zs5-^(O>C&1;|Y&DwAM!VKaWZU(=rBgX>q%+N2 zxz&pSwy9Z<*J{NlZuY|9*qZ@a1euh{?0(hRiL2CgZNXPLtVEAx1=s-iE(Lg2gtts} zBv||M!uX!a0u{_%u@6Iuf(#17Khcs;XZ=Hj%B@S|(fMntp&`upd)#pzZFL>iGZR6l4VZWd5<0c%sl&9$9f=4P(RbL zF9TZz(D^!03w@vpSc|j0lP;(*?KE)pgFo!)dMlMJ)*zk-T3jg$DKc;zl)OX>Cfes( zpI>yog{aGtCGcOYUZsJpn>O_UFa8eDzL%p%fF3&A!L-s)vwUT>KpYAJsir+n+Ey9c zS&$>=DpB(`+^MtDcS?g30^!r2+)ezjpQR__%ufgZYj9+eu-`-f2`8E$bKGmHlqNz7 zd6o@tYr*fcrS%>h;Y3`@5yQ2=M3KH_!HILKUhn>-{s`wk*Z|8of|IL~dNa{$Sb{y} ze_K`ZyEyH1F=X7{^z(EPT21@_@u=Hfz>c*x%4gk}+mV_s9-b3AcoNO(4e{_w| zoB_!{JMWpv&1W~|_>~#%au#7~5Oqe9{cY7)eJ-&y&mhV+mCR$tCSHoVW6tH1b-Hp1 zbl|NBg-oO`4DXQ?@RU_XCnpW?D1}MJPr6hCBJav+J$Rl@5 z*`c(lXDC&8#XtUCry@#;dY;VZJl;7MV|W*5W8z>iq6kxGaJL);KE_9-#4vVLo|3CE zw^W$UT7GZQLUj=gGj`6wn@~}D{&*ETyXb{dr=WYSCEk}PW*s!}7n$GJrq>tXQ;CFa zrL9^v84}z9V3HT3fLz97hhk&fWPETn75?V^J%BO~3CJu?51mXX#k=AadJbh)tsF6F zbdxg8lsfIg~^?)wcJ833ku3*Ft=3dhhN0COy9?O8F zNbBs~kPbdA6ta~}vXaUc503z`-jG(}UEdd&(I+fKgOSAwFBR@Mx+hRqkKqSNqa zJ5k9NvM%olc(=>PRZA`nvMA9=CS6A{D*%Mg^$EpIokQRSf{4dMI`J%UYpAPzi>)Ar z{pBe*qgpU$53^@VpPbT{AHeY4PHwVU>@@cbrwXq+_Y5n|I>XGfo}%uwKB3PB`H_aG z{`o>FX^3QnZgPzHC=H|q^Y4j>G`_#O$bnf2X9xn1n_s_h*3ln{Wgf$!a8 z=*OiRwYsomZ4}WiB-?(~_VB=wOX5BCA>KygLMjVuY1I3;5mXZ{gz*-g$0 z4HyaO)-j21n4CIz*(r>#ij;~j`hS==_VxF$8TvGIViHU}*PL@CuFE{_sb30XfOn<3J?cp(xix zh6iC_n_O{@PV1S`-A_B=VV9ji#-u!R7z1wO+UbrI7j!H-Be=n|uqh&DahbA*LagfePFp0sTt&u$41cUUrJZq+j_X3Q@xCot*zaJ5@Rkp$0mEe2NQ3cbKOZKpCP zmIM-29m)4{ix?N%v^d3pnAx2b0(KFH$>M`cx~)ST9%SsgcL9#*#)gwfZ02*tdy7H# zW(?&f$2WNg1jBDF8+SbxwTwUaKsRfnB;HNwmqFA~e1c7uN(20#V-qB~+N`=1LcjP) z_p)eWPypL=J&#;!pn2?mwcdd;D{by|um|708tj0GDb|%91lV!Z@A>Iz`RC0~oQHA29g%qr$ zFDF9HTBcZsuV-Kz&q6rp*BjLnSe%_S1esf)VuGew@5EsX$w5|gFWdXAQ~^+~tyVi% zfOL#z--H169{{X&6Yw#JxJQQ%YhSf7(JzdTmd6kust8-!3-4k0axqkBL6<9SjVykgfuJ=0zIFFh?%MY zCpcmthZ}%*8EDFaj~c~tyP1$h)P~(8(@5uf=~h0|szc67uv6?OH9#>z1a(8QfbdI~ zBJc>+iZiaL8sU)5ft|}yP;+`Fq}e1 zlSl1hv)l}p+<91-)-A+&KRXugX8qW3xZq`+DeA&+Sz)19%n5?2RSI&G6_hXWF~L*_~T( z3~ub`MkE^Ay(|je!g1&xfoL+lBX}_BXO8&BrGeXrU@hES+h#B6i0q7d*uUmyP>7|K zKKzlg4oqmQIass9{Ang{PV5+ELb8ARp31)fz43 zSn#-(<6!v4$@x`G4a3qkF+yfy$Lb?vxDM&|S_wZtqh8A_C6SjLnxmLE6Vo~dT_KR) z*$ioCvqV@MFB9A!@%G|?92`mYK<^f2)wZHaBkcW@@x4(thS4fMBAgpBrT4IVB7)KisSZBaBS92 zrzY3+CLMs%`da}_41VxZy;JMtO7(8zD;20u0)+4NTD{T8XSz^MqTV+jE06WLgZ|wk zOAuCg50b+{s~-+&ZS0lKW8@d|0T@X@nyBalPAPOn#c zq(K47tOqmV>yWH)=uX8`PVaFv5;_SThLhIdQO4(wM;w-PIuEuNG-v?Q+0hr^b_g!l zf8PPm+!Kz61f(56v)Y>|*gtyoXnxSdsMkCLwO5{otp>KW4v-ypo^H2*hP=}+QPllX zC!Wuug5FZ{XYJ<0U#dqEu2eZz&_Vd2d8jo90oa?h*i)zO1|4jb0qNVU*!n+!Ius(g zk7}HDOdsF6-$59T-T;hmZ=eN#0sR~N3CYLMk1r-6<1r>t2lXLI&i+e!i%%*D*~CWx zx9T;7@hm^F7Zvz{#N&xxf~73Ms1PfhLg#F&cqlg5A7A)cWgkb;7kVfH`k)zf-Ln;T zJP!!mGXiLrEDkC-2a;a~qDTG6H+a1s&LvS19$x|dyJjr`jY)9%O?_C=J9$oS^_q=b z8?TxJG|01xTzUJDAKQZ($WJx~@(FBX$*?BhD9bcznTxC_Hp-I+sm5S;vq=&0jRg0}4 z&76dChIUG>xsi{e=O1+z#tHIndg-GRUlsJHv&~Kio(a63hgZ|I8!TnevCd`EhD1j3 zb1{osR~48Xaxuioo|RuTR559U@IF2!mSU~3&lUm3zSYTk(xG;HQn}q@T)>XNez?aVv?-7Mq4vssz#UmJY z?|ZhC?X=i$|^ zHTv_QS?Oj=&3rWX9IDnUJ;>vaN5J#_Y_Z)bqEagx&3$GJF6gE*Hm#HlT@=wLN5lfectb#TS_7iSr)#>|Q{a?goc)5pF|CmVZ& zb5Mz1>dLTIB`}Crl6dZ}W|QK9oh`I!kXVF@9fF&@zm3`#Hs6sxpm}~56IsqnGY6emxAC5u4d_yv>Kd2Wf%|;^=1H3$} z-A8yp(5+GhFk4SK;2^}@W6taq)jjl<1|Qv{fLNCw6vA7s7%jvF4OBU|<)Se~Zf8t! zps>5vT>z)hgtizFk}OO=G*ZAMaA5+ft@QqhCTdw;)>hfNIP>sGzOT=4xJg|M{2Li< z$ll|y%9_~0kpql9AG_dSMbB~x;2Qh7c1`1?G3;dL3EgMIkz2@lc_*qtc7k0iK4Ko* z@L^i=C;h9&Te*PGU$0ebjifi`0$#Cx|DFf2)62%<@Qgv9?|>Zu38avlU#q0@Kpp&e zXaubLRLP146qQ2+C4Zs@5HZ<}j1T?0higfiGG*%ZRz6#YOwIaPf3OL4v0A?XA{NyA zhD{!TrDPB3g5KJJ6g_PWHeLJXlT)|odmeuI;ngJhJn-tl2KJC%uU;<$D@0#Rc6!gl z1_F)li^}l6NNq10_Hs|hRiUs}4s|4-Xfc40O7Mt*yw3v{e(vFg#Rx82gOabcUj1w% z0e;CZ!sA6Xrg7UIRZ0v`_xRF=$_tjk6PF4=5DAQ_T$-iOxxyU7 zmLM~W(!Gv~Y|ro#W(te$P3|NuYevD1B1+Mm-c4a{dn3E#I?Ryl2b`1F_w`+_xVVRp zTlr9QK&TG{-6;drKHAS!J)#_&p-L>0s&sirx@J4>`NAmZ$RCCqhgQF>;j>1d0}oXv znz+}go`osWtNsf7Y`PrfVzE#x=Anck{45poN7g`pG4v(+{w*`+I0`anZJ)EI*v6Wg-dncW_>5ss%$(;5ND!rM zj_fOxd;GbQe`ZGj&v}tSBZHnH75d70Rg#ws2{k@>t>zLYga>M6c+a;7Su8wqxYr~Cot!?0Z zTOOi%qlrWlqckB+ye^V0$~YvEfAxlX&O2qJbJ%nn!+qU_I+}YD;;3-`&_O$3p)TbC z&UphAInjYsFBO(GvSWcaD#>_dyMEn~(|9EF%R^@}yN`SoFzzsG`nBEaPs8j47A%0D zo-M`N4fI^A(igy`1Udno>3nNn7>t2zdd49Q9cuDbIr!4f7L;L7KB9qBuorkD`M^mc z?3eF*Q;}nhGNv7pRAl}@-kT2=rQu-SU(u9NSZ2cE4g(|dh9?oO@Lf91k;COdDnliZ z3)$3A?m}a!NkkR5ARY!g3^`Or!#>QXs56%dMbo}CiXJsijP&9; z(UPEvyTFZEtKkXb4Jr1_v+=;#l=VH+XStdOn+ zN+$p6miWi?=v~4^Ga$czd^H0#>R<&{NsLq71Q4BE49?D{j(~^3w~NjI+Wq4N*}r?O zZju#S{fcb0XR0Uuyl+1T``g0}zSC&-1)u9blUCJp^zj?tp#7Le+p#Va{HO=a*sa%; zma9lK2DZkH8TZn ztbHhGj9U-h8NNcK>%I}h%L$9!cRz%wdC81w?|7Y;kzfLD_MIu?OL)p__%(q6%&8|* z3i~(v^-phBuS9jSMwZ0Xy`9aD-bta%e1JbT%AYj}A_U;bo3C|>gl@f57`En4pZ*@A2Dika}>E%+O zy?qcq3{%lHC+zW;>FX{ zp7)R(o?sLG%A=tNSX!k5@)2NsFt-7q*WXop)nESPvpRtG!eBxur+SwIJK@sq*P<78 z>7+j+n90>Vq!886w z@TpMnC=}`i&jh+~njcOZ2*C04p+GPahK%)(O#naoVg~^8`hT8!IlVf)_rcdruIVu1 zH?SLXyeYwZV9H|$-}1cfm}M+3I_CwK?pa>)^qc>fec405dh9S8Tn@9>?sU2i4=pyR zmgg{8Jv)E+|NiaY^#1nQzxms5e@o}Go2|Bn6@Xdr^Ngu(9k7|;t<7p~TA#An%@#Yn zGg)lS{(+B=BHLM${nJk@=7#k=oNu*(f%9?mkI>Hn4o5kKZjmQ0rEh(WJL{bn%-Dy= z48xh51XOyT@G53CJ1$#V6p;@d}i=}%ZwYMvF|KxYUGsdt+nA9DxORpv4pn1 z{qjpM{iy%{mA@2Poi<0qIpDC@oC7vj-<#ZVK5cV49S$e>mIoZRo)f`G12%gdet@g_ ztiuVV0&Nc+&;8FIe%soEFSeX#Y;cmp-f=z)C&2}54hIA;KJJkZJ=a5iIogxq35KPw zd9?!Vp**6qT$=DKSx^k%N^x^8!D7M5D`0(=2bm-UE7cNa-`R9q3cQ=<8FWtU$ zclOmcwnoh%(qH`W2j7432fY{1zx1v7tyOCensOFyUWW$toV`!_(f{LVhYcF$bo880 zIh?kBf4&57t#;_{!_OW4uC?Gar^5=b4s?FN2^Z-*+RyhtbVBYVvNxSi+a2~Ny7w@v zK)&jNV0dqD<+yZuDg2I?D;Do;%XZBMu7t0V?5SA7U8y;^_2;j?{L;(tL|%UR&sDxP zgU#V=I?h;Xjx*2?(MxOA3Ya%GLO!MZ`mGA$*204 zfz$gB=FzY}>YhA;HCzf`qC@xgU;p0vNCOJVJFZZ~Tqt(v0_!Ap0|TAZ(Fg8T0i2%r zbBF|-p9y`SWdi8)R5zbKcGw**r?clmPUJf8u)Ey-dGfqhid|pdAS~RvbDP0q;Vmwg zv*UW&>2liP8U!IRhf#q34|{ZOm={S0?VG+j`E)Hh9iR=;CE*asfc=n(J-J>kl%7nZWw$ z8?f$O7b^8lx|aI;gLx7@{r@xe9&l})SO54Gc-GBqX4{M=-F?&Xw$0nOY15H3tBLIl zx7khN#A)IrP8{!n4K`qGh7H)5WiWd$vk{0Xg!Y!MCPHEe4L}U-dw<_6aJFSQ>p7V@z&U2nK4s$NlKt6oozZ5sj!$%TsMUkp{w+eYYyBjl_K~y}Sd!5?J*lP0D6L8x zB-i4iRz;H9Fs??CYK@P%fP0zCK5`WbC2`yBT2hGv+!y&ElO%I?74Bh*BD9ol6^X6| z^p|-jn@&D*?D(aNHSCm=BCz|S;PK(Y^Izse+tz)wwyZXvPs{G;?DDZ$%vV%*XP1{vbS|-39gzbso9<$Dvjg3$Ib!78{Hnd#boq|DFGURv zLv61EfxZjAH06b^xE_kuHOE$T)HS5%T*{uSDTH#m^=SLiroO62j+^$^$Wp1c?Gv;x zRUez!IvoSec<@EuKjf!9t$AtP0EN5Ff=ga-4l0K>!$b9GB zUW#hkrzc52)6QCg3~1M=NmAV_QG?biF^mJtKhfy&OtEQCe zFj5tLLLGxzWJ(Fm#Nsq831(&&2I0H&(1HsoshyP8K+*Q0iN(2@B^%PfhZaewp}8j7 zr1s1{GDX{z9tWi!g`BZK&y3B{RypMLDZec=9SkWZeeU`Bk@$=Bwem*vB-pf_%X~O`yT21OlxW+l%2E9(F$42U;?5-s? z9Z|cpyMtW|T|}q1E6n!cH`qn9*K~0-dYx7u*3sl@gR&>mU02u}yk5o^^t6#)FXRTU z1B;=c1YUiwT0^Rh%*(WTgN`(iTGO~SCFk5(GwIW#fcSX`XlMTC9u=0~IG>HSfx(7U-vM7X=oq>TlA_Y6;Dmr(sZ=XTV+QpR>*G)S z+lh~twy*hk`}VDkQhrFl;tMD~C3rxR5|a{_7N4~9oTRim{nVbl#}4jJzYu#S;YiHB zgUEXv)TlIT)hbg*r9p$HiM}LOfoZOffYcN2D03=r1ZuTat^in+^1BMPq`FQ{>J)>Z z0(w1nuy0U4Xw;DkQ|Zqh5C56^3-MsRDPEnj6aop zp)B)AZE!RffX;zH%^ycRq#q-EGO7Xru!si#9%g@ct z%fFD9mye&^f`Yu9?3|q3Tq-9jHzy~Q8^j*U3F7xw{Lf|fyqpV}tw!B4TtcRr{*SKC zR8dIzfI=ma=tl;*1O04nFPEno9>MC=;BdckH2asEHg0@jW+T06&BjfeHllih{HPKB zNQfUE3Gr^@@`t-RJ3-Oeon2k{>FlJsR`e70JRLak6y+O=x%%$}$I^aSL;Fj z;)y4p4C3$`fBWm>k3IIsKmOsdT0wXyiaX5p4iVho&}!}=r>Cbo+(UGGdx)VRFN!xZ z66O)ZVIDo=#jhVbh2tPEnyWPE7B2%AQJXb3x5!$_*42$|S1+RyHcH9TK+IW--leQrBtH)R~n{=bSFFg0c;znW5Y`8=M;Xa(3L-HDRu~||x)8aVp>aB0kYwpd3X&C}WhAHQ78wa- zZdoQVHA!bO&YwG*dM+(|YVGOFjI6ZubE*DQ>rS3Z&&`x9&AXw7Sz0}QOgy@Qo9u4jSOQTBFD^sFPKBK^a}8z z7asc4FMsp9TcaLZ7bez3KlI}#?)?4VmWVZX{_^GmI^c+?C$E(;84kEa-rrwZ`Qh#} z$G07mXB<9{+;3kVG+6VWdH>z_-g}qXg74Aq-t^wqt?$0^d}T$K!O%Nsq{w^por>N| zMU4gdmufH87dI8P6n2!hnFVs4M;lG5yZ>*nTjUJb_eJV_ur}#LT-@=4hm&Ft9zJj& zHvVKvV)Dtjn8SfXw;hZ-5i3OESvri=G!A+yF>F|^GwQ+pDIDnad>P5$tm?XgGt)em zccz(^@qI9YFK2RSaA;_d%TsD}>aG^v2%k4H%o7OZfGniF71NLz24hp#taXU$onSv= z8qf?)HH~4Frl-qaV`Q6P%dQY9Y(0iym0a%@3q_r?t)noox&~unk^-UowoZe=1YnJ3 z6A6&vC95%O$147J^NTNrHq)EDn>W1j98ojZ1zyM);xr;53Q3hfAY*$n}NB>p- zyNuA~zPF6j0}-V9R8?#ar?0!Aw|}s?vZ}nSxU9aYqP)DcZy?l9_1(;wU~pRKl}$AA zTNIo}XiJ}ZuzLt{nv;g@4S`dv1 z*&i(e{4kRt4SJ1Mr%UAa{OcMIAVGU$KJ!&juh{Ck$TAU+O!J0m4O-*$}+MHiifhnbWdi|L`!S7`E5ew&gUnOP+ccQ1s-Yp#pk+;? zMuT~bGTv(*GZ;-q^O&r-BlWT0JhyG@n~jnYz5q0K8TnOekx(RD6s;1fNQp2ciV_Kh z0TH1N>7z)kB#iUS^?+!#8WOJF5R6PJ_1?>Z*fQe1qnzA=!-rq{*IS?0_x7~4wII=8 zeRXN!`Gaq7d1=cVTTUO^IbvrJw+oGKGp+ZJ-!?1@`Bd{N%=*V>XT}{$K2{X&LEfAx zp4b{JRrv@6lf^o3IXN}*B@_iD9DFfA3SCS?kqRyWwH)9B=v z`p_3d!$V#6cb|XzwJlp-tOw@90^I^yJw$%fz-{X6=xT58Y-?+854Ejt?o>3hySib> z^ONqbE=&%)I=fqXltbKMzD{uohCN+qzsQBouI`p@#SoXvL)TcNlMZnOB-qD_46!^f z?xw_BcK!Z48@}`4AC8?Z9v+rVh(u&rtyo?EhhKdA$G`ts_Msg!UR24~tP!nZBq5a# zI1ETq&Pme>{v~0{xffH+xq_dZ#PN> z0zMClA1@dhF#HY(kw84C(;&?v=86oNQ};-bQl6{i@_srZ8yOOcWU^t|Ky!X}#Ra88 zER+hB5{XPE7>rzy_c!HcmFGzH6p-xE*}CPRXKOGZmPO1JJj0v^{&4r2J0AT0?|%MY z|FipGQqR#7HE+BWmt3)H(<49l=ii$@+dZ@N^>{`^s(^Ae6imREQvMI4-cxEgF{wu{ zo;{p?^k7`V>3^l~F6%jX@X(QyNrz+Jj;oAmXnE_mZ*K)BdZR%CbcdC41*)FXK4>r* zAu9+aY55sL7gF*{O3z6kt!oq<*E+GHwjamuOE zyxfw!(!6t(Ip?w)hC8_Yp-V!2m|WdG>ETGOwCb-SRINKG-2BWRU;f7@@d>*R9XgYd zel|WwqSG~ed89D=%zOLedOmv#E0#=0&#r}$IC;JDYGoe4sMewsO0@CAk`a+$kUPRD zkPJu$21j@jsYoCa4-NNl!4srHqjt-y+o<=~qj80T5x!ol@RQ%y%hGBGyM~6vM!u@K zC~Gh~E$LK2$}kCZl^pr-#oX$%MMXc&OsTj~TEZ#LZ5!;j$$N&S%Hfi8xtYTagZaf5 z%BwiV*{$53QCVld5JJ%!eM9F!g-ridFJ2zl-Ql5!AAJ0ekMI2Cr4OHaX5X3A6Pf3B zq-UOpjZ3_kdt%osUmQD(9t?a3_mDp6SkN*5Ew@eS76+$=Ecn5@3nFS^ML%R3~LAlrHMi(pw!<19cRu$+onJH$7h~>=5K$i6AW{?GCir% z`*jbSN@~w#oZeYr705M8v0f|`_XtHArkATYGKoSdRtbbZmC7Z2xtvss6}{}9fq^Eu zLMT^BRS+qaV!mwoLPuABU!6G8$;AWxysJj?N*#pyZ(-eY-@^|?vmW^2kA8H^JwN;5 z-K^Vw_48kS=bqpF_79If@X&v~iApE^6TJ-tI0~p$_zS_w=@NA{Vq!C+hX#(N!jBGK?XRGKmJWwUr8>2JXCh z-P+aBx7>TrJ$F5L(`_%j@#CN0^YEi@KL0-tM-!{Rac}gW+>r_xN|?`5Rp;c_-BFMg zAP+QWSWnfmQ@ZjGHy19wTR3(@1wf;zRzZiwXcS2@sHI63)RHTI{o1>sh0&>0CX-G# zW;HXK4TD;#NG{AFbf^&t7H#%3Hlj@ z%ZiY8c_j4x;^B37-+%Y*A6N98`sGg^-xc@UN543ooR$>x;h&%U%jPF;eqy;2lnt~w zwQM@&z#W_xUtfYT|41CUKfNz0qq&2wEt>rLN`M|AN~Hm{iPEVU^38nRtu}B=&o}mW zOXZydjb(%N{mg*i3WSRSLKqZ$TPTt@)+8sy798Gv=+v=|6B8;|(V>Pn0#bW$jP?;-ZDp6F7ahULAk%Xx`5Bgj2~Gi6_4h8Nef! zMYyj>`{O^k<)QEY<{ev@<~^}>@A=a^5O|CpO&SXtD(WV=e|kKEvKMxmEO*HbzN}31 zs-dw8>Cmx(Axn)~r9o_HU9=kVR|u1?yVRz^bhv4L-pu*%%d*7O100!BJ~Y602<{Pg zpRLU+Xg^n2QdHT5}Ov=p@E_O+hOy;xe1KB$KBo;xRaKqwGIJ|eM1DiuqmGO1Jo(k~Q>B{&?B zuQ91H<27M+NfB)-quP2{)=68=h{lo9Rw9KoPPQ@4H!XO?dwC9X4 z*Boq~{5nimlNz~f${xgI%a0v%FFP@{h~GP>9Zt8?ZJ(Z-ak%GX!=tEi-Y`Ej62wmM zgV@6(G%uRbV=+1onop0ghE&l8kTqWf6Q(u?RR|Zj_*Ho zKlOwA?)&xw4?TF_4}Sae`|kPHt!w`3_AvywF%dq!``UsHx3U9;jp=;2y?zfdxJ}a7xuzlgnog6mDfjkH!LoN z%{&w47D}NgBn)CFL_Xmfkr0i^7luXALXn71jj+V(XtkW_^jFaOYQ`YbVyb)DjDxd* zShH^Z+Hb5~#R?Mlue$fU_usm9E%DetSgY5qCzi(-oeMXn#E#V31Ggqr76ww@vJD-8 zDSl^OLQCcicztgS%Ze)bkkaR96?hz^WqLw3IX^WwF{`&uOsPGKupn4YqUxdMSqqE7 zh4r2#Yww_0kLsXwgx;s4jA1>cThB}z%m!$|^^}P=uZM;k3L*^*B%(}O?eJx3cZE9o zv?=j%aYtiflTMyWPC1j27MIb+?kPH#6_;8O6B8SM^a9dIpoxUrdNrx~q@F#uHus%W zp4?k&*$d;!mh^1pnHx}fAR-4#2b4kMrM}YabDX@UQiHgVa|uJes-k3mX=Wh|RKoMr z!ut6j`)!ar46a4;VXaUk0Nh#)sVj&%a%f*ZG^56n&vxzk>=cyJYLogxOiXlKzfs4# zjKzu}pvR6bfGmfwKSAWAd29>R>{`$K{Nnr!QeQ0GGCRJ&U_lQR3-umtSa9o5sDDWB z5$oW|NlzI}vxfhGg}7htA1h%uTxhGyYHS?U<+e5V4Kx;ZbhsC1<_XWzJX(RQ={K)n zV5rH?I-Q?Uq0<{HW0EdjXjDif($=EX6M2;am0CXB`QFA?SG`!GS7}Esqj1-f9$NaI zB}IK=18E+Vi?zd+>B*_7&?H9bWb}WK!6S976!$5X7T_i7n6W!&W<0Zw`Kj4?y=cMZ zSqv|*<|9=cnrC?ysCk59m|q(*j+mgIW9r(>&dE!>c(B~4HOTrJD)?HtR3uVsG86ih z0;Ntl(4N_2TdfkQ6v!xi8Pw%r-Luq}AA3@48gc_&jtvOlv2`64e$Xn%sE4%7|Jjw(1?+a9>z}y z$N(cM(qk69s$r8J`q6pvdn%1Yt%Rmjt1~Hk3p(@~IrIo;V+5G!Ye}QBqD;M74B7H3 z9F|o#J^sw+o_?Xl+Rqd9$OL`J*U9Gz2Sk$Y{!vH3e)BR4hR+(=AzOfQ-)?ui>1n3} zwqpy_%+zA;ycaP>zOncShe8y9v5K-g?gMwjx8qzq_rK7ZKfQwOA$tS=mq7@j}VSOmF z`}NFI%s>z8<}SBUWL#Hsf`@y-C`~}on{g%gCJCxTVWO3V1o9Yk@+=RQcjDb z1UvyH3rj=TgEGH#gAANi4*n{UYsoNVs^}Jp2E=!HMXP7tLYX&MEofxYAT{C5l!Kb4 z9d}PnOioQQpK;(eO_yfS;S+&`*0Kj{*@b15wS6V$zbI|2YwAd)>ysDg(3dA(?aUcD zcYZec#`a?rsvC65Vfl<}a(rUKX7f(4Y~w3m)VObAoo!;8KWqkKHZlrga1gD7rFv2) zCsjkMp?u&D^A;lVF3k-f#`A_@K9qy}5#EplN^31k!>su%Ypj>C>JA2|(7M0^az@V1 zP0s~=1pIW6@zi%S1`v*%I}%!3Pt}N89&F`RHn+C(%jIVqptKPrN}Km1XKUU<{fTBl zOWBd68;2T$&03v;E1MY;|X6U4Qb%?GYvFFLcY{eGAJ&w(yZ6Qeg_j6 z1u5gLVz{IrAY=)!@<$5^0VQO9Y3!8XCcZ$-7f6LX!HAI5pcaS-W)Z#c%BqnTxfX1T zNUTAJ;p-9(-wUI1?<|gJzZZ_3H2j1R0+^yhGuMawrRZB3VUz^uvnETJ;qU>{^{hDudOSEG)T+ zi`52!6zUVHQamjD4fL-8LPvu-5DSE2sfa6-2>4Kafb(KS z;Lug^E@4tRaufFIJ#TE8}e324Q)RT2Zt^da`^#kJ)HIo(hosHAn}1=+1Iky)h~ zGf2Bv_3_0bF(v$&ppP>QWB~fGP{?PH67V{@fQ(42$bD;|>CHwNFx2P_W;2BFYt~S@ z>EfLod@p>t!XD%dZH7U2zytfo4XRJ_1r`_%e3>SyU=Y2=sE_GuPcVHAi28%-Mh>@E z+}qZ`>5;eDNxt;bg<6NacDRWxc6D^QhAy;7JDoboK!tXEYDmy(^Dix3MiflSSbUM) znS(4%q*g5*$j$0Cp$#<>VgC7c9GTczZ7u1)IoTr|fr>>a%uZ|*VOep6lTkS`BH%+? z+Iut!M*_ZJ_}y1G?G=p(xk|atVi_|t`l02)w;~78iFJF1y*(Yr)AbIuy+NjD`?*7Q z*ujcUDau824U@<6H8nHSwLPP?+KwS_)1|16b~qW_(wTm$WZG28IgxiVPgm6tp1Gb# zqB_)1kn$n)-_bzOP*T-cR9?_hSJYfzV;V^9ZYpb%%ZDw6McRq%X0@!mEu-AVfeU-N zN!3-^>tZq5nu`VNSb|)Q*SvtgjNt-3?6)$z+OUCir8W$2_8ZACd9 zSaZ~31}!@J>wR58SBuJ*E90CLv{4ch6X*=jhgz2tdh|oT3lgnX;Z+0Zeno6&XboI&Gnt-Y%+Df z*yt*#9+DXD(u>rmLbP5&%f_TRVjd!zw4Cj)=(wReet%W(2#+@!1+|m9ZpHKhrw)ymsyka<(GpMybqY3{!y8(}JoYMt>|{8i`ngE~^Gumcu8@kgsuAHTv4GD9+^fV` z9T511Q5fYR;Rc|<7YHR-gOZ9U!D_yUl&f^i%Fk66CTw~}=Y&JZxE(P7<~@k+IZwjf zi{;i62yn(4pPIP7vpxz`Ll>9bRx~6O z5BsM_XFH+f>ki5BcVaewO^RgOc)6~l=GadG>TMmXp8_lr))FVR)! z>EztR7_7gZI(}OVH>qnpt*7^};^OuWnl_Kj-oT!39fwe-l@Cg1z>hHHT7+zIM`ZHF zc%=9uM*)08hVrh3%Yv7gmLZ|{)vb6nmR=I8(^^^+*8Yf8u%S+xFwA=35$2h-V?x-+ z0|-vb#GKPPJ3nW4xZLCY44%zWMx4KlXKcPIWA1e9Oh$^Zt*iWkD#LgzYd-t5s#epJ zpT<9z?1**I#l>{i(F^T}yOk7sTTZesmMl#x?&daea7Ow?{tfaLvueIp$H-eIOF+Lw zz_)1K3WZQ>q%bBS(4!bb!=EuULMQKC@VGlVW&A#gK*$+f@XQU3h!#Bd;&x;AC1EGG zg6;FT2ALVyvP$wY=qILvIhmJgb25969bk8T%KIXZU7K0eoYz#?UQnngY&^exo*w%m z>ma+P6D0E3q1#eR&X?rG9=#wi#(dER7u{kcgSu{B^_8^#^`Os^ztG7?TE@mSRU@Te zrk^TLiK!d6m^%l1ZDZQfjI(K(rwh*PZ-7r1hY@+N7IWCND?ra_{9)}3O`4WWlcRBF zdP%bwHZNK{b4XcW&Pc@onHX{hJ&Ox)tW(_L^{bZ_3|6dp8nqAwgG`vZ8|1yUD+2nJ ziVlzwX;n%x&?dNZ6%F61R+N$!(Vn$rhwL~l?BbHkA4ZCD%yjMP8in zVGm&sWA}?z_t#x*W_AS{i1+i6?#6Vvm2MZ1^OzZyUWXZ%ZmnKN0@VmbV+@%nSO>xD zWkIqEstP%D&#S~-tSkm3>$G~Efo#i{2PxeHZdMAJYr z6L>w#Ji2Hi%sx}J-awjzrgcV>$xwb#Eb^?tS=UG!b+C2v;_=m@YfP**e8oi|@?87& zZ(w-3vJ*2Blaf=YWN!+Q>`w_L`y#(|^4+Ovr%$J)rKaFJH7zaqOiBvAQ)AwtKA^S* zv9E`%598_a;nw#;u+&<+?cZbNktcX@ zdCH23{*njtRzw;=xCcy-H!%82NEBfg_}cn;7ozS!3lQ?(kg1nJV3{#rjR3K@u=I^Z zzu7#>8J0*T;(&COOe&L!ebQ(dRw{f_mRRDK5}NxOckWG$IkrD3_Vdc&xa6eR{V^xb zDGWz`zxjn1HogFxR{uug1!`mTGk@8%F}R7|xO&rzn>KDz`RO07V6b3!Oxh9hX~`4t zE=&jLC6i@r%r-jb^J3}>#R^4zlTp1+4vftYiu)JH^@G~6VcOPAF=;EWr+ijQ@eQS< z_i|f=m%@wTCGR5qs;MO(4&gns^iBBF`Sg~FUI7f2l|jaIQq34l!fj+V+{lzljZggz zW*wGUf5igUy#uE+&K$}u%{`gfXvwU}Njq~UtAHGh{o|Gw{hR3*iOsCN;@tDgPq z=FOV|u;8UP6KX&GgBAQ{`k^nIMZ^dH+=2%}z>>x8ni`#+VDU1fQm!`Nq@FV0-$RXa4%w)1jw`zXhM7pCm9Q zBCUt84%10+AZFs5c%9C9uY1}nMFuW`(+VY;%{)s%MHA_V&bDDLJuK;1KTXedyLtu( zCI@f8Zi5wqsY=`@nYm$T--BV~H(G4H0+@Hh#|yRrjL8U&;cs;#UhqazYBZE;9b?go zW5)Yutz6vs?u##Pc_qAM^*=T~``q83qyD}Q-+zDZ`6vIfg?gEIiF%oOg?O2IiD|rL zgG4qRLMU5=E%W-rnv9CYFy>QOErO~j#AG{XFq;(e=7t9cyygvTp;4fn@(r6iN2aa| zlZ$9IFcHeq>a~7Btcoz)sDk{n=ihA`}Ph?zp zw0g$g@{X0hIji<~mb{o5Qrx(-St^WBHV8}t*_R?9^hU;A2%)i<*v#~*08%bO$req8 z{h=EW+z?SuEvwnS9>K{W39R&Bf98iGSM4Qf4c5Dvm0?)p>ZOg!Z(9rov)XLbk6N(4 zsW6Vg^Hf{nJp0(oFQHM^Z+`jDJI9R%%*#WDwXkB;V{R5v$AJT4ehQ?P?GM?squb+x z_sLS&IgoNjM$fzKPAd}yhshm=)RG`3Ut@cT0LW$lN(7|yq%F4s61hYrDxH!x=Od+pG77%2w<(Mm7Zv`Xmm6lodJb^U=T1TtX z=eM4{C-rdR2Z?*i`i|^OKNxrH%fvm0PGq<5_~k!72)?`a{nuV;ENakc8Rs3e>?+0w z5y&jdxNO?f??!kie<sJZ?}}ye z<-o<83Lsk<6eZAKEYXAcUyqtDB8vPc)CSS%7{hYt>ojOH|CP2O1KZ2jP$Z;y$p82fCPj7DjhwOz(%jzRFN9(Q4K ze%=Gz<}D7po0<{z&bVE(GcF*DfLB0`mwYbmn7H7y{;o{}4O#Y_(z(N;Ua}>nuY2zq zM|SaW!GA(+dHV7H*=m}v#*>B_Pw)UW8}5eHCd>r%8l4FSoQ#F5(O}ZqO8yY|`X<2dgkG9J7$yG8!~c>({IW*<-vf)HtjC0rLkN+85*!v@>!^L$;KcS5{S3R#nz( zt;b)62jIG{5v=y1L~STiU^K`m8gE72j);)R)5MT+ZZ_T6Z%sd?zw4Mgp?H$LU0Zmf zjF+2TTt8fXaZgNX=?%y*!YCv9NoJsqWRO`F*cqYEZy2@p^1-F#jEgXg9HSs51|n=Y z;wQ}TVz_Ro!J2;rKUOVz6wuLXN6n;Vl<~wj>W}{6ug^UT&inK;e=am!DJUBJ`wIB* zLkH+S528KMlNS0eH$6`-j!pV?^9%kZogaae7DsJgqgWysNhu<=0(3}7%Tgjlqcsc`W=m9(##Eg0gDsQG=vaJ=XcjEMLHa;@~m zH$QlPYxuo2A3XnwO|QYNYggFz6=xs=LYRFWExs1E%M$e!*qEASU<)hPM#KPs2ZK7e zS!JC$w{cX zP*i;Jbj8V%(`>!;)qjDBFwP{~{;^F|SI(G#LlumE#+aBAR|C%UkH*x=(6FA?jNGrb zk|PTVb9CT$4Xr&Et@fzQXY@~wArzXRqHz?_R8m zWBX5-Sa%KfT*&E;9l5`%PqvSf;i0|9cjZ^4ovb@tUHxgzxvZl0n5veK+it`pGILy> zr;P?2%N!mJab359xOlnCGwtEMf`uA>{@;O=3~`bHP=iKeL{Vr|m11l*F%Nl+>Z+itld+Dvr zS8MW2IY$?}AL~I}!|R#@%v=p+2{ZZrT8?KLn;4WZtttW;T*Ar#2f9!K41E$3Oq%GwRdzA0NSrGeeLs zQ=Mw|G8(*;hVk^u#q8qy+0vZsn&u^X=@NZf-dQr0Z_1Zux>{34YZoLv#m*bh_)1!w z!y4b$a5s|`G6_1#inPdxSm1Dsk!ZwFk}(7kE8C8YYZl{ zdf2QtDmFd!^viH>dFiEB{x^9-2OjYi3N=9CKMvmYb=`UKncPp$7Uf>Z&puu#8x_3##!K7Y z{{SZ5AHH}{D`nWz<@#L#4sthC(8#uqpb4yLB)nZ0Ui2?QICotioe_6k4fV3N@>Yh9 z8?BR!1QhXxhrAO7C-6u;E(>_k5P4T1W|rM?5*U0hBH5x+)u!5#@*Q8~OAepeACsMw za5ARfB7Ei5m)?Ij{NDQaH}Bw-bVAa&8tAnkHR56<`vO202oprp3#~;VdYvobl>`{B z70Yf2;P?MSIE}!M+F7n~bOqElzEn(KAXPX7cSTh{0xZ!H&`sIH9G*zSmkI`CQn-_< zjG~vfy!bv`*xr5bgBOmwdYfPsb~V%tfgH-9CGxzq;gb6sdE*(<*}`p&xxDlYW6;RC4NpkNz}78M7Ah`B8+&F zDd#of1LCK|Pq6=#*nsVJJbO3sJ>oPWCp6eRtlL;WCRzbSA+d${g!q)$N<2Y4N_-!8 zUEaP!>;iN{#0bG71_=({cRNblLevutE89j zPNd?Ex36q}B%UG?2r(hWCdL#00B#?kd;vB-@gebRViUeku53TUQ;!38$;$R){C}D# zBPsxOEuMM{r9DSH54iu18hjD3_*pF0_gFu|J3l3gS!;w|zU4<+h|5bHkHeZ&FcJzzkw?q%JN|Mw8PiC>~_7YQ%n!}d6!JW3Q0o!A!f zo_OMO;xm-88TWhw2-;XbA;wVBdbHk)#CBZOupYsE8np7?i6kPQ6~&4|i#X6HUcr78 zP(FteP69$^dl>M17u(x7$JD40t@beS2w)mSD{2Wh;Q_9%5ocM^D02>QO%OW(;{{eU zYZYNZ2-bH2%X7rX=#kBY9yN0aaD4_ip1}L+&@VL>o%ZB?fT+C}3Bir#Ao#3+~jSPB_FxqL&b18%573j647?c&7PqBUx4Vm_C-D({dAB;yiR z&oHDOqz;^7j8P_+@^Fo1bMt9rrkOW0msqn%K*O3u_^_yH2SRnRW)RDJ6?ia($YX1K z(=@fTfKVYRn#5 z#B%)Fr3HEkk?NTs#bKneAE(#4jR-{RL~f<&RW2uzy?Anf zfy~zsfvmN$bshn%n?1DpboHW&e#koR2`oaRVE2z3ryL&d*v$Owl+80e?stv47aY!c zi_-x>Zv&vC8bc=%v|7xgJklbc3DA!NR7qmIcpmZDm5vja5V8xi1U5yxnEW>`r^9R?{GBs-3Fm$xRIw zPn!%En-Eoo-(YUn&a~=vrR|ixnbx#BO%3|Ohbm!LGgW}~$x4aFq;IX0cxq&IWdc=I zm$gl3ub*_cs*Uu+*6~@N&7w9K99HRQm|h&8B6T(+1f1!4v&tycTMc7DghB>(X0O;g zR>N-KwIID#xzi$8#*VJ4q|e0-l;(||j6br-U}r0#N5^%QT~Z~t#Z$*AZIw%=N)c*p zv9hS8fn(u!ciEe|q}#57uITAkYle00RlyFj(%f6ng~@a+r13UG zcVU0qMQ)$4!!h1O=hQ397U{BwEDdnAD1&)O-#AynE44NbDCs(qEiSxd9j+NKw{~3Y z1$JZhz=C%%xVY$YEup8-OIUjd1)yYs$})&Rgs^l&nt%v)KFQ)-S$cLwVt;FMn`%-F z?B?BA!>$Z&FX0`Uq!UE3aG;)}sZvgPe^o{IrBc~oce%MrZf=;Ybx+ZL&vHUfW(#KH1PsR_lz2GYS0`YcZ@~ z5STI1HvNRjYBicCOrsNHBo-D4UwHQM3CrwkZOvTe$^N#Oft-;umRY@Rc5ZS=Zr7;C z)l!$Pwq{1Ntd8TH*1|6 zAD2(gt95f8&w_$CHsP96n`YIfiRp2-%j%hyjk_hIHkJ$8x%(%%3ft7YN-wF2#%`aPw$C{6<(Rg^9^373V>x`rr4~&%+^%UH!$cNV#10(e6H%NwW}KA$Uf0Zu z{WLU$Hc~e+X0zC=6E@2PQWoAbF=?}njZN6_u~~6svsfprxN2jK*(l3>s0*9bGBJTm zcmTKBtdrx`iE-P66;Bu~Q6{ThFf}o?%5KBL%%YVwhO|K}Yp97{m#&#<=nb)m&bsBf==2<8L8DY)z?rr5~SBu zpi>Gi_ASykdzgeqw5-0dr7yIgrZJm`Li)Su}_F*9Z_HX~B;Xs4yqvN0N zzJM%J@3kFhP0il1owJjpf9+@@sBw1;U6gRnc0)N+ib*vzl?*%&(uu|MFJ|$!Nxc8& zeR6)Qek#3a`lC|`S!MARA6iDY_v`}UZvK*X{yv_TUx$`kh7~p&ia{^S5sKvmeiSAN?>$uXTL5yRPJ4dxKLni@zO=Xxu?-s4#FzxcbQrlujgl{09<| z7NRwtLO=2T>LX^N6BYh26W{)qGZD!jxgL=~#Ye9i`2+!3!L}o%1yEYjmD0dSH~pNV z@2Y?HFR>U+mtOem4qN!qx6}T*MNSJ|0^eJwu9<1?c~jb@rRWV6j^_5b?H^fbUpZsh zBmA^-_trG5lP(t>d!<;4e!w$~$=3^yAcy5W$1ncupLE+TdrE%snCs8C9WVa=W7PS$ z0R6zkU-t?EdlM&V$y3%>-x*s>+C?YrS5#OQ1i!jCGq$niO2H05jeWWQqHt#&kbeFV zI`rFJa41shyPOCTZQzOe^$TJ@0lRq8+~O-bX*&B>mvR$?r8^tmnR)}N`ol-tvO0g#_*s5^DDR);?_s$pq#pbfm&+{&%!aFB zUS~6-HC!3HM-Xv#;oNQrEM`bSGkPpEt?NH>6!~HTHjKMF>q1Tpo%O#losLVPcu z*HLSb-mkDB6{$0>x{wtqp1D|&d+}T?z`N>V4=xUYpsl4B(+bLpYmqZy`KpZ>*Rhc+ zlHIXIE$Qg0%U32{kt;@OJxwXnTQZVUk|Vsrhs1bcb>tb^%feU>5Ex!8i;-&~Y;Fq+ zYzYSo7M}$yX~IHB{(3FMD6$4yjTS@_A0sSb?97V-T(|@UXK2=h6Owxv@m)YFd`1wg zscD>`bO@S0=`doZ5CIE!>jJoY9626YAzkEduK{;Y+L_1Uq0X9^HXZj*}{!n1T0g=RnHPBU*hlv3W3d!W&a6r!grY%4t)d5Xn!EPQ; zu`FJM(Z*m}vf2RM%p^_)&{tUSd_^>OCdeoLFiD5jc=dRX9{HlyPul6Fd8C({T=LKx zyiEGPu$B%&h{bdz0^-PTe|P6GAAOHGYtJXU4ah113P)3%{8q$?r$aW)1l~>`2Dnvy zIqbpsTnOXSRF^z)YzD@}0fa2Bqo=~AOEV~$`mBLog6e%Xz1Z&#z_7T&u)7TdXl^r7Kz{#|-#d!qZnF`Tw zAk))cjSo(7K+F?+wra^Uha86Ru=FoEeDusLy$GLq8o1VdNFOinu?MY-i?iXWAhIvh zi%vS{Xm4)_>YVwu-KWu3h&@Oz*}Y!WFU{1!k7^z{{=-)>jQr4T1?f&<*3Wi#(4i$P z5Ykj*x_)qq4m7xo@3n!_MXI7F_48w8h1+JHG6wSW8%fSSKInQ zc@H1(#q2waB*8Uj4|XLd>XNi4V^7dDf+chJCNAyTo5%iq7ca3t<-`;dXDIWKnmk@3 zJJLBESH#)2tGn<-jW{7iaiA0#)phjXhhf@wGG1PO;-d16#29wGGzTe?eFnM_q@MR) zXJtZVM`dNl;RB~tClj@Y_n*Q%W|}U4j{nw$bXDg0k&j9%6ECVi<=9ga2X|(k-LXLH zKuC4iV z)9pJC*moZ0oiEw;!3-VJ)4cbovuAVJ@n1T2#l2CT(|Dr!?JOScGt$kUQ>oSQz8$0c z3oo3l-LKx4&|ICpm-j`Osfw!O@1z$b)PF`>K3n|4v`dpz(2+WLDo5T@1ja-M6YA;G z4|*y}GSg!@N98FWtyG2Ne;<7`1+j9GI1{tz@{ON7eF4$&7d)7^hlS0OK{yVzJhnLn znP``L1-*MPw!8CEXZ;-{Ozo-Zqo)gJ+S1a+>Ed0Vx8`W9 ziAlyJ)#2Uez$(M0(z)`pU&Pm4`ZPh2E=)N$MO&xo3v4bRcE_hoZE2O?7;k=8c#)y3)z>=~5ax?Zvo*JK8SLmB%VoU+(Pr{CJTe z@dSB7b39CsPtpxtr5)vGG-osVPto96lea&0jQP7jR zJ+b=OemiZOGSboXqI=d$e?#)hi|_0Q|A7Do77Sk?R7I3=7#7=14S2DP3#lBLSHg^O zt|#nw!bL0`2nR!Yxco1A;2I6);tL?q`odBO#~A5IOFoYUV5tw8&*{lHE8UupH846b z4UGo#WH_*}$k>}LxI&;~6ciUQ=L^zH;V_6HJ?Wu+^XSWz>y5Jq%^+P41d;c_pkxAB zP{Q;qMbCSKNA!3(-V}nl22*C34#6}f?DR$M2)K}a6aGUXdOmW1V`CP})VO7Q+KLlaso8?lqe{ydsl|b1%o+k~x&!8F zRts|-g+)HhA9!tAZo<=;PA#7uGd$dhFtX9(Eu~2Xb1>*#>0-+36W{7fJ;5%$&58W_|C5-wK zgV5JfjdqAq7d3-}@uz7|MTlk@Lj5Zfv&X?V=$LJNs+ZN(Eun$3nZa^rj=d*urs-0U zHZ4&xC&adT-g8y^>SH1+Fe9{AUSG|3g>t4DTN&W;UJj zyq~*OrFsl$28>G!FT3Z)_V<3E`v|1B_#i!2o0(s6qJ4km;hIlBodW~Cx*YnmPc@@2 zSH1H@bL)R|n|?F6HSN7|&#C{Np^b~-9r-5`V|Y6PdwXeG{MzsvrHA*F9jo77y0hfn zN*Md1oHLkF%rSNgh&d0tA1s}~HixEv%pmHH-Oa93W#o32q+1Fz?9~$`XS5lGLE5s2 z3~Y(Q?y;5-7daSi?>wG2m6NC8SliQE=W9ygB^m6e)9L8B!a657cw-$R+F&vfWG1mA z#uTKZBq%dp0(mGN_uXpyx5!;c)_3emo~X=TXgw$0kXl|WO^7dbU96OHzPj@aeT!jt zLy|C~4YtLV>B_ydYr_}Lv;8NOvAO%tTIRpH5k*e59An4Ep6fV~EbjYwFtbdwA)d}0 zIGLBBime|Uy!y^1xdjOg=axoow8cy>s@)sh^vsgWI7d(Fr=4Hj$tYDBh^hF?b99R- z-qvPgSuJ98Ma38@&mtZgOdM(-iW-z^L@<@aDf>u6Um~Z2v#PgwkoJkaYA=&eV~xE} zH9s>ycXFm%qr;paDpev;}*!yL!DgJ~L8jd;2?YFb$rkCu*^t}BJ z$1E(hW~c2g*OX%xst$+C?w+RXYiC{V=_&Wjl;6I7dT!R?p7zYxaX!jD=ceqdr)Q?8 zTr*y~!@dp|X6NivE?3ANg(SyeJIn1@u&=?hcKe)zvag$R&e|Ph|FlC43L0gY13dRK z@XX}?dt%zHsp}sQEZALh(@xKHlMRKx=Emy~;$jBSIOkw{g~Qothp}1g*0$KDB~sUD zi_tl4luiq+vvbZa(eT8AsDI7_O^wSj<+3)nXou}}9N=Yl3u=buoHG*x;|tPW_nb3e ze|~y)&f%DIK+WSsZOq`R3+3Bu``PtVE~#|Z9@EPjh~B?;2OJ$#a-a6bfI>s@}%`!8In(mgzjmS-^ zOK;S_UFmXn^%yz~&e_J#2PgHtQq&Mcv`jc70opD^3OLQnX_ekf_@~sBf)baGBw6dg2ADtR=c*Fp50sG zwI|iYx5Ty|K9-rkGjZ0T>FAwsKQDY|@A<4Ra?&ooeW7L6_Q83{>zxNX;z~a5`PYzp zF7HBYtjRgszV*=Aq#bp~*&iQ_YdwCTY|g1pJ=k+NF856Oj`BSR*#}Z$zZNY=Yo2(% zcB^qZwd8ow+v!~&%N*~#!E?#c zc>96QJ(jtq-D98T#kLaLQ*(AU zAG#2mle%wzwcRPNZW(t!&)wa0WXEw%#XFyWpq!a5-!`~Y_GQuDws`C3W6rs==lkF7 zoSkimtKaqB>HdAKJ9>AgpFLjcnQ4gmI5Q>6UDK}V$uoQMD>^QY)F$<}9_`Mn&2l(w=aNLlhcmT_ zJh!_su915%ekhxC%`|*;RA0HL$DVY6?A%l9au4LY(iJ%;gr#lyl4CK=d1)ESZCa<@ zUA<>tXW>x6^yyZ&({OC}S!@LjstCJDTNLwZGkchgoKctuu6c^mQtER znSn9_Ng$9(_IBcU?hM^&+4!4tL!A ztPO5sbvofY3*5s57G|f-1cVQowZWNy4l-X{AhSaxDm3AOhJj>R;gd5#RIQdcS}S^0 zVDr`$Yj&1^B3xGmTJal|1Rf!^DIj^zh9=(qqLU(N8EG$|be;Qbls1(4K(4nw8{8e< zdJJ&o?i|Ux72|nA@ulil`l<8H)47-A&f=_Z=P4yIPhoSi#SCB#<`iHL0JVW^Nf2J2 zWQoAx1a1J(6c$SijOq!dVmAX+k;Mpy2iSl%0WkrLBgwJ^N8G&f+g^8kgoYcgG?W}0 zgMBzm9Vb51pbEU`oCi|Ee{wFztaO`NtVY;avI-;DkAc zj0dK~2Qs@qSp3*_VDvEIP|20(6)+Zj{dBMPI%>Yx;`E7f35{;c;=*L1$8L8!%vObF zd@xb`3<_Go^Ic)F+hou)nRx+T0bt1zyy_fC4DP$Wn%=JbXZ^Xf)=Stp;_P}8)Y+4y z)9r^b2mH;zsK?*kUwr7q0ZMLR+2>dG(6b7t_n*NWJa!tP(OqwLqxjfAsh1m$e0sDo z4}HKrb$Tb|NE*@J49oHALcH45nE7GrdqtPAIla2)OCu5UU9M(HtF6_9G% z(*-k|yeNdSde;v65m)p6Pa97am3tlI`&%y)^NUZknY;~GFcmp17nv6u4m7oPy5vRq z0$XCGS*|{uB#X+NSbK)6>kdFmyx%>iTkL=~1WVeaQ5hBA2^-%}a3|oJ@#kz7Q_tkI zXl9YoXR@ifxB}ihSH?B;F~_IuI-Sv$SiLql_;7%885VbvMe^M}ekr=}w@RmWiI{c) z3lj){7!E~DfBns(=7($`Isj!b0d;Y}wzooJrP+Fw0KhJ`Ld87*@UmJap=pa*0Y|mb_?4lXOZ_#8$lpR!6`CC3RQ&;~?+rzB^}ye%^G&*Xc{K zDU8>MM=SI)PojKR%93)~*Y2xdLsH}QXMg*(;TowC8u|8X8%Vff`HHK;ZQ|=Ph)nP# z+7Bp}ygZNCv%&`|Ef{oVZeWJ2?DAO)x>-+XY9+OSavi_+Z z0-<6OaKhOH0IGe<%$nn+4>rbZzD2MpJ)}x{BCbz*+m{JOKp_Mao0pIbOrB9GY;l7m zhR*-7hx{dg$^H1!ohN?R=kOTOLp~8`bh)5D!g&#?#=f@&On>Q5$G87E{zgx+w)B+q z@-{p0$Y0F;UXM%iza`f@eONg@d#g81%+(r82=2{rUzLZzM-!Hv)_Ju!9zGHfRZbq{9Xm&NdqZh84lga|)h{7vhXC*$Zr`Ah%ZduZ1OhI>TYcgJFda>ai z)5dqi=nwgUTYIygN99|=`IYyJzkcprd&2wK?c1Y&-N$}Zf7{9DcH)2Qj`<#HkE7c| zn-3j&`rv8bA7@Yg2jx7f+=PMo-TUU@S9gD?xbNU!-jUotPPorq^3?$wqhsKfye>s-_=)#m zAZLH)N3TC`|KkGY>BK<(+MaYW<6Xmj!e_xzb#e#l{*9gXJBR-0-3#}YquY9No=24% zU?6E5z<{@&h(5jjuV}{}_G{qv_2Y=4-&WuM>7y6PYYzOj=Zk}(KhAXC%Mw45 zC*At?rs2de9=D^NFTb%?y0z!se@8xgem|Re=;fm@4C}xD_R)Hg<9=z`pJ7qS|7`kl zD(79py_&ZB-fug<0|j=zv^6WdZ{MHw_3L*0%a{5B60f?HSX9r#e%XjaqB}P1+%P}> zP$+N1{#wJfznu0T-mHLaK=|2W#cd|E=e1|HJ{T;DPs7 zonF4EqUcUt58sO{IC25$eiI@#9m`4q(IRbuG`HOMbS?p z69XP_8H7D1pdt})McwDJ!kPr#FDzXB=uQaz*hFAC~DamJD&Ixfr|J2dE`#@&KYs+z^N-EG~+1W7wpC0MP3n z!4+_XtRQ_h(SO7Doy)#40|=Zb2qLuC$pEwCN|Op%LqO!*bIVQylZ^krJHOz;tvn9_ z%}7c6&wp~k8b-(f_l_Q1F4C89$o6W36!a6AqZRg78={E@)80gT=D_0&c!fo!H#T~w z>*w9i?Fy8o%^+)4ni?@qjY0Bb#;+h$X~&~8 z=VVUG$)_U6*Dx)N)tA>Se(+r8PhmoK{PT^2YdE+4yYKY2+~3Zh|Ce!f`onDe-Fbs8 zw-LZX&e^(Z>d?lscIsD8qjw(J_eV9Sbv0RdSN322>Rg-pL`r0EtAJ;JW>v||0{#7+p>?nN-`_Lw zyMi^PW4C^>>f#Ue_xGhAUS7QL&cn`ubssDq|NV()2OjD~zk}($d&k-w<>Flm^k4;g zv@-4O!K4#Uk>2hDjZS1zOX_g#7hU3iYYDtPeiALy^^*2Z_AIlZyqE{S6LSLbMVu%@gpyjPjTkE8dV zJ^~!#4hec=$JiYsY5!5)p2stszGqx5y}J!`;hw(_CAEKi`q*>XzjVEJ%=7E^`-;~e zo&I(4i~lm*k;&5%*P>O8?A7M`_wyDwKacJHP<3|)RBzpVt_O4H#53ne58Ptd@lM|z zeV1NDxA(vMBwzo|KTrHA^44piw|2GOIr;oo{SW$gy?%Xv=iR{Q{hz+IYfACP<#$+w zPY%msX>WXL8uU%@MgKw6_vOfe8AV>{&1&fJ- zw^MhrOYwnEeOwL5vgK$ zU=rLh!65Viyc;O~^N0_{qN3RVn)1b`e2Keq>l&$0i$s7t@laAY8d|v&f;#cbZ=NtU zjJP4flgRSUKu0{5&bDrgTo5&CCxRZgHQ%pSmw z4TW4w5pZ^2KNnDhb@Dihb#u^cyJwg*Zf=@Fh<)N@r+{EyqV|arJ=9lFhgAwuR4N-0 znP(?-!K*!VmmBkZ2F-|wAEEf2Ph5+ zQ95E65w==Ne zG{bb=DxDF?ctRnVEaFb9HDFn31861Ks!1?yKMBtCX5z-Ve&mhWR>A-rfDoH(|AB3o z6n90FBcSsx7Z$ES+~`d~kYwT^P>cLV2qd|FQ9vR}EF6#d!4LXV0LDO2KN>=`QGlAb zaJmAE$PkP6`^j_Vd<0Gc@G%0oWF!U=-4MAELYhe^VGjnL>!e}`vsQKn(arX5w}(Fg zR?nY_2h8SPA)1~*3%v>&wER$fb{`r(1p?M?P9%W6GTL$aWLD|i>65t^^>sOljMI(8 z_arB}mbVNNXMDQVt??)VbCV#0-NXm5(lOW%KT}G09$wHh0rkU1<8-*gpG^5WB)bGo zuMb2>bwqQrr0HxAgf&#+^BOWSq`yr-weJEIq3`)iw7CF55x{0qEP z`GL8DFZ?&&<3W)?&z_j<(@&4cVY0iWeq&!y8w2t&?U8Z0aYb8b77BU6IBs^T)yS;( z0(sGhyg@BQ&U?ci0PqWXV?MbTJ|h!UmcMbP9t1(ut0ugp@Y8NsF`yfSl}3;dqqR5umaq#fpRVXqQV4PkLoqnM{+#%G`SE}K_Vx9N zYhc~qaOL;EE^jrm1S0cwD-Zab`=|>bv%r)HuO7F{m3Y1S$N$gQtEa*R-(LOy?gHd~ z;s3hP|DTP+GrN97H_rI~*Ka`ZkEvtIxC+XfD;8o(qzb|j1Nfo%H%AEGBg*6juw5+g z1h_2xe_k73|FcaS)^Aw9Zo`Ik8`rJd6a=hc z6aZ(Ntc5Vx75*1C#<%=z^Oh}}w>`aW%cgA*@DkjzV(Yf8;VnPkymi}C+qP`ox@9YT zy=ilFOY)k%H}>LB1D{P5#E|AcS@@X5f)-^)h4=rkv)ru+`@)`(UV}Ue zaiIq4JDHWpqXdKR0xyN=HA9%=uVDnx{Y_h+gg$QA{N$5QZCbZ&>z4TDKWy5(X%qai zb!*~%(=)d*6!?{_y^Zf4sNz_5Sxi*xi1y?q9D@ z6W|!@%IgxCe4+R@ummYX`SNYS!PxKxC zDjy-{VCD=&5!L7``l-sMu?rY3u19>Xe6VXgCs#mhEJvufIpqTX%3KsZ4a0#M-?Vk} zh9_1(^2nq2KDvI@MtA}nRZz^XOw+Hm~|@%OmSof4=#Vty|Zx zUcGknmeqTfKOK1H%{$}hP|d3m^#0hFMW0a4 zBzA{NgC(OxVzC*WIupvO9x3uwLW<62O=?BKQ~i6pcjAsNeK7f^?A0hD^BJTla#l?d z@FZ!)VC!^sB~sz}RC<5cD7oGUE}GW1m2^ZQ1DQ|uZ;!9rvi9*+_uX^P@9zH1uYdE0 zyB>Ue+m^>)IFWiL{iV07D&JVM`S4pG*PY+^*d=G)xo0m~vo5~;=t~!JKYn7}+8b6I zwAY^=NB8=_{BJ@3m#LD}{%U;t`TYeW`Atpb4PSgoO|N5phT&d}qE~8ahv`_{T8`TyJqH7*2UB$x~D^1S3D~e`(dK`|kV0Z|}VC@jw6V-|xQh%2S)xZhGQF&4L;A zTro)v?hl?&Sq8d8weRUbib+?4oc^!97L(H5@#JG59bQid0ub*3uv#JD4PYJsK>=^;50WR(OG#Y&J=0XYbYwnqSOCLuY%N7%%pbu%E1AV|$YPy4oS zeB{1|*FE>%(bGrvfBxy-JqOd@er)}~@Vf1)gKr*wbfdZQVdd1O-K%HU`5}Ono zgXW+1Kfht)v(LWr)`649j~@K;z~M6o9(!W*x=-~p^2HtN36mEz6_2W$);xX${Uz1? z=k=>|oiF~W#`^S{O%LazzunM0Xl|Y!XusFyN6Bp=Fb%7PS8wvtw$%qR(@yQ)dm^J4 zQ-i6<{^GA2HvW^}e(HtCGQ7{^^@~DV2@6nYP{T_K&xkQN?(j`5 zc}6co=6qxpX?)Ox!fgNrTun;jm~tG$o47jQSLlG4rrIHfwPJX0klavpGg* zHCIem2lC>k4gYxU*}s=k>I-uV3JbDwh_%l>y3<|%!L#?CLRGn8?rvS{V~-v~fB$c6 zv^W2)$XIV)1sY@64X;0N!y=5M2wFN!+CO-OE~#Fubo2}aaI*SVe6FLSy`*-w zN}U}YK z!T~DLs-SwOTNY^qSq%Mcpl+PsOr0Z2wGaQ&_8)~?&IZtaH6 z+n)GxDQ(BU>%9Noylu;qTQ)zrZPS(~fi1Bq|)i<4?OYI=FQL^$R%5V zRsUksX1D`<1a`h{>*md?Z`hAaAdtocO-U@PgjD0&@{=dGtlIY0>zh_@+ot;=W)Jwn ze(*Ua$9z6?Q^b$rejrFI;8g=ZM1xn`*|sXYCTVqK&Cgb^S+jce<7*yW^*Fri)+FEm z;qrm{(2ABBNTp42qTwirS5Y?%*lj2J(9K#33ey2}4JA2&E>XaQlrnujcMd*}1|gZ2 zrbRJVIB~z2knfs}0}$fe9K7jflX;5ew~3>Fdl_7PbE~HhuOm$gy)Bbsy74q?GCI)V z9ma!!gZqW0zcYk%pG{qCHZ8Ki?KW61659E)^UZ3aNTJ1RkbSRomgdrt^Yk4&zGn{1 zc=vWQEthRwS{vOo;p?R;xx|?uQ|)D(*COF(rlAhdV>_3zFX%~VAfu1o(Nf8ykk~Cv zUH-+~A*`yD-#FP+)`epy$Zk@mvWWW zg8F80jjg|;g-(Rq+}qcSa&s$5bLqB9W(SK^-ifEDH@DB!sL^7nh|2E&p`Ls-U6R(; z+TK$)%Bt_7w$gQkw2lU0u@K+iOj3Y**jNnW$s`Kp%-2c?we=blFXCazZC7TCMrh=I zI+g=Ts=4!3qr`@R@~(;u{lPAi9TKD~ITgeTzPp%N+0#tu#48)91vAaP*(&777n0jK zKiCs4@s>ZZ17WX z%u|CPA1r@5;J4O-4@EE!-iR4k<>48y?FG6xQTq+2-lzh>@^#rg=w`4=fJ_1)w>O2r z4Xh5rmWc$W&R8&x&A$^~QFO_wCb=1}CT-YZohoqAdhN zYcU%k>svhBd5MzQJY6pA!a6$IL+n~*D)}px&5P%NJ)o*w&`Ocl_nIe^O|tpgflpwU zw3RfJE5@tbc+8--PN2r(O}$;}`cg91-O;VBDpwyIK(T^z9@4?l`$ zN7wzgq3!%!9IbO*0KuYnVXU73F^-8_ zWR`S5B*FFKAFwMaIn1mW`$#aG3OLasnyRK|8W%_ATqw}Qrj(#znv^bMP^mJqkxX1@ z00NHbjUj7^zNFHDHP>-y`Bm+O4g?k@R6JEYPE%y_vgXUIjn$2dBt}|8e`9MOzA>k2 zxW2!S;6<^+$0q+Hc&99XcHgb4cmMfjp8VMRyzPoVe+K^9b>?)WmWvBnl_R}WW4X81 zR%Zt6AVK>a7K4P0p|K9i?1efZ27+%?1XE@0R4vGwHwDQO&md?P7rz=>Fq5IVO9%PLSfX1sg2qk6+$)h z^|Qp{?6z`CMRRdcZ(}~Mq?5~H&D0MU_HmgUHhv04n%7hJUrepKVtnO!^^2FD?7Z;y zf7*AWPYw?)icq|OR7@!>#8GGZ>4Vs*b_(8yJcXuO(kQNTrsVPnKXtUc!`hM&M$Q^K zlekcOgAov(PE2l*E|>x)pI!v}Kr4w_gH}ipa)iQWchEcsRhM+)h*Ak))Dc_Qp+;db z>{Lg#G-Qp1g@(S)h|m<~S@fXELe(L^Qzg?`!WOGoYao;@8O2~s@mr$Wd5_EEvuROu zavYfk{8k;B*=kU`GIBWyn6|m5Y38 z1u~0VLI`=d*&vKqm#oVc+q`=MP>FQ#$fCnO;J}6gZfnOR!!2VEF2$lyK*w&JTp^0S;gBB{O^`fxPRu%OG z{c}+-7`PyE1=2+#$Q^-1;;1L)0Yhj6`FL?ZWRk=p&gc+RW_5Yv2_Zi23?aB-Oj-lt zH27=5QU|UecRUF7dAR(Bn@EEL;=Sa$I)2T+)f>HxK4k%7&?h<*xcFCOBR7Eu13fNXbHNb615E z`KbD4mNZ+@D`RPhZDTzg5#!(jv&w-Y?Nx&8g2f&T2#%(V^0A5zZl#cpcXd|FE3(H6 zs-lQmKp4&vlX3Ds35BAr>B=btr(ULx^Xn?%rNTj3^?(#x&^10RB+inU{5%a0tpuA~ zAUNZf06+{#C|4tXV0DVfy!s2xV-$vj+0Lj^)C{&t0o$QgQzSy`!ahkjbT1=g_p})4T-kVc6a`${&%A ztQ?wvDj?r=b-rV|yOlQI(ve3Jvk1C66QO_tFcF2tirnFz1{J|6&V>j`@ktxmP~9|^ zRnnPT&fxU)?qe80EehW)f#dj2 zGe9hon1fYw79|5>!AQ*#Ora&aHA{6m! z0xP|v;C=jh)&n5JCTLn*ZkzKN@l6xvz+FLfX{+(+YJN6XU&v;@qKGZLd+Mk- zXG(foVVJ4Z=vKv@w*rH6nxSB8S}L<&aPlY{m*l~ z``eCSfBtFKsl5~X7?-r?PLf_zhm8NLrK|nPEqu2y<1k^r^7u!hca2f`YtGpI+S7zv zzse}yeet7~GljeNR9rzJxM>0)H2A;Tg6RoOD|G^qv`#K-7+<1E!?wO)cpj(fxb^K; z&p^Y#!sJvdb80H|Kc{Eu>N88+<4!-NI@utK93WR(0*%>GNE?=_8x#)7ak{~X7rETPzU9i$qfTe-ODP>9Qm4c90Z-ADa z6<}tz*4mJe2^vgP7=VbM%`Gb|k@+x4ns_KEkqc$-2@N1eiwY-_qdike}-Jo4j zo4PW~+)TW?l(mnIB9KcznM<}&i3=YK5ZXRjJvUj7RhD&mI>Gc@#iw%^(&{0Ouu(i( z%ZCVOiGV|<8wZr5DD)+ZTg!!$N_qJ9dAw4LQ563IG{R+L&7}c*Zn2aHPvH{?b;3cSEskv_8^cFN}WMONkDi(11Ms16x0VJ}xGMkNp z1<2nKR@3!oW9Fy?9vl}O{% z%4=*Gh>j{n15E1d>=}7}6bIb)7Al)wGcmyeQX1G^>BkTU$ec!U?Kn^?45?#;igV+z z^~Z?3au}qxgi@kzZ>0$!P_|ZA;xCG#3Khx^=9Kg-ma}V|7qQ*njGN7MqaR0yjC!+Z zLT+&CSC}C8QJ-QIiVW~(P|r%ji8rn(0&f~FOwIKZ@RH_iM{aX*Ntvd?m?bG*z!Qfj zfOb}-HKR~EgGQdp$l{%4fnL-=>SK*{L+Jb|O3o~S$Z3ca6Y~u@9S|8nCQdYi@))HP z%NnyW1WDauwlvp-Tm|g*$#zEZr9mvJnj8j2>6Ugr)ce5B=P6M%sWDD_M%XmaB>e<- zWqoEv;}D%iAx)ibNe>bVVJ)Z9xlLGUP9fNdtA~j#gg7Lp3Tsevovbp4MC6bf$^ zRY2(gWHpciFg>n-BcfeEdhl}o#48NA15U3~2vfV!q|n-Y?j@lsZdkH}gdkDH8)ZnQ zLkby0^Vk>tBH%rdIY{6RORPr4qDLDPf%hH2y1$;D`knssNTd%~-5xtA{zGQt>3+YZ zE_b5sVn%u!<$TU1)D2)|cod3Q%_-9Kmww=4s zmT~z~jXlvF-3h2vRUpWyZO(43%x=5HtURAqThLla!FL}jDMPLIG+FgJy}k7O%v5G^ zhC=vBL0cw2D_2}_xu4wlewO|EhnC=x-wnN{Y3F;XthAN`pYA9Db`J{#dyL$bTS2IA zFYBr(>MiIi!>13H4i$D>7`;I0NV#&lF)?&oNssf=+1#oU&UwPfk(x$wc`>y#yYJMM ze#`Yk2P2ycR$sCLqI!}oN)W(x8gOC91%MZqY*~QuE1+axvI0PNzWo`#)5T`K?;=Am znJT|f6sl^@?gw#)V>TLlIwZouMX5rfltR*hQlcN4k*dVnQSHpoV#@H~f-!Em+bCHu z&v51zdZdy8#VALsWlPLsT)jj-X9^ouYOf`8FUDa}g5Yk8>lZ*0irWnBAZ9E9a)Xn` z4kU1<1AVRGczB>Y;zmobHsd8K5N{#|7Q{x_gVXf5Jr=P;Tr7nb^x3<@esJg{(!)a_ zjt3Ex8-P{lY70X0dDsO2tDp;AZJWye!#9n$BpUDfwsBt2>+!UO!w&J+lQ1ym^#%d_ z0m7P~&}C%F>$PhgxYR!TyF8_^8xgb+%R10vb zdO@vLz&Ubwiz`<^iJGYVdN#L4b){mwfX&8rN`^UDA=H`QYetd$Aw8zQ=@QmN#Tpt5 z8ANN-G_w~ct>})Um$HiK3{4w*pBY6vDki&F)gfBlC_?Q+3^MyDFK-see5atlw#QT3 zsJy@{9tOkP?n#!gueP03fB~mc!H@yd*PMC})@aTmh!+SO1eNDZ;912qew&_ z?(S>qKTn&)BWe=}zI8?-m)a0+5aXOz+h!rk?7h%9`P;_H-!_h=a@t1-<~mn>T>3Q+ zW^?&y9zG6S*K6r{@)#8{am-m}A5qhWmFJsKsH;d)(cLyrRp1%Q()?b0VYQ%_NzwIY z105@>?;Om_(ia=hLVi)>;B2~(RtNU?u2D*hzM4;|jv#Ah&R}1zwyIaq7HKO2i7roA zn%2b#(v^(>7TKL>n=yaS_l;L28edE_9w#$rI)#M`v?>UPzA8AdC$DzeeO;&jBqR91 zCy4C!dT|^uPOM=t9LGVT^Ety{megvStcx_yWsNg^# zL$ZbehH_0xn@9uhh?}mR6EI^+ykI~Sz#dL^EC5BH0_#f3luiP|^NJx`Li8L=7^cF~ z_{6upjG;%)V=?L8e!ZQcaIrzKIfkF-clf=nLQk)w=0bm5zzlmCis|!eu%9F~+?IN< z?y|4nXzq}s5jNsYLSeCMI}t|@gyqtRP8E{JT(Y=D7c~f$h?6Es7|#>>3^HUAyOyMW zh!&6M>r`Nt_?v6a9F#e&23I7oun-Uiq0amgIE;}sYK%LLGNe}#A$JFbAY-{Hg5rtn zm#|_%wTRSqq{${l%ZcX3-g!jSeaaU!BiF1+)%*JEE_E7Qk3)+ zj5be_h%@Q9dUiep>hFlxw&&+*!1rET)sZVHt7{$XW3;!?m>q%^_GLK$s0^GPt8XIm zFON`j;o*eZi(3jnZ5~MVAW>>@1$L~6!lh;jntE%cx`HuqUaVa_Jx(O@O7T^*1ajXg zRSOFzFQ>#%xTp;uGHM8*36RpIv*{8aj&g^Tu1oHBM z0bkaEg7bZWqp5=!Y+-grZ^rrIvy69+svtSA@)tRXe=+TJcjKuKeT}=@KWx<9Fbl^; zEm8~tov#;(^M+Dse4@COrW~mzGVMf4m%OpqQDV-U0hfIoLm6T6zz=M~<0jOHS@JBL zsIJ#MHo6cXjB*hm!C z@zvZl%<<5BGOzTCfJ1vsF|n z9nztA`;c%{0ruVee(qePr6YvrY6iJgv(mzi{h{K^QAt?qojte4l zRn06?4$TM$=P5&qifk22RWZ_rr9r6Z6Q<5cYmK3~X3&mnb`s_W=F5i%Kt)AeRSJ5Y ziK*=sPZU*+^;J{Y%5HDT@Ko=2(;!4i5Tp*g;`()+tnLYbGcf_#Wkt!|iwWqB1vq?g zgyD#Q>mw-+)&JrQ0Q*kq21^p<6myyYZyJ(8qAhD6c0;56_pwYsY;4lIFLon9Hz*ha;-BzD3Jm9RanR}gGC#zDP zZmhjj8biKMcr%~33^$1ivs|d}eT}!c(A1wcS-rRtUnxJj{N|7f6K7&*AaEua2}&lL z!6IR&Tc9h0GU$qu4JHCp9}FpKK`Yp^ZO|RIHU#l4E5ZmOiIOF7!OdJcVor(y;pfNf zX&AmUAM1gixQUlUq{w$2z9;=%%*+Ql6Q{f<_+L$bVn5z?(1RR1gZ@2vtr?up$3TT) z9xTAI(hqrk#}q4R?@yk(vBSrwvz#7#pKh^_r#izv@0Rq3Cj6uG5Dj$J%Mp43sb{uZ z9UsXQ&I^4Uv2-eqq*n$4)8j~v1wp1i%{MXwPkE$&a@5b31O^A38t0<1*G3yDmp~B& zWbV=P7Oey9=osJDWrz)D&1f73cZW_h^$e7^IX9l&r3#H$7YsZwdv^XO{wY=F8=YEU zJE7Gv2^ycYpXj}~h*TxbjU27CKgRco1ZZZcy%1#N@8)6kg~6kp$7_|RM{-YpI(-_Q zoH+tAbNR)~HJwL38an~52r>0A{Yn-)zk+|Eb>*SYXeWMP9;hA2;ieJl$c54@Ug09C zmx*krL8ki<5^S*#et(SM)6f+BoOlIy2=~c8%VtIcHvyk32tj{ieMuwspvW$*u zRsp$dBn!+iQ%5?o8I0C?eN9(aFLCC)nBT(aEu7ACp~aJpv@#K?YaGX}C>X6)ch`f> z|ND6`MNAIMw8yM-33NdtG6n$38bznMv4~h1FoFPO8P*}C0`kc$7XM1Q%4mu&+dW`S zpU5605q3GE^)5NCwZCJCHrn-QU$$jIay1N^W&; z4ZW#eYCh3%D=_|YO@Y0vv1F!Y02@cEImE*>S__HdB^cW$n?=2)13kSgoT)m1l$mIv zM@!`PI+%gim))ipy&f8zb(vngyqVEQq$b1UAllY zb5=+ju2h)Bs<=RoTqzS?N}f0%Oq4C zJv4GDvj`#F{>AK5hvqx>i7%~e;+;P!S+>-G9J&(0Z(b0-lid-}*&_)G=LP>60)CSK z8AAZ^m8i4{b{s%{=bKNX z{r{G<))e=q6=ve|fW+1xOP@$3mw!V3awVF18?U&rKlQ-Uk~9Ns?j0>$T(CxOwVc>SFs z=&cp<9>4D`$wh6P%k7=b_FkE~kMu#@52fdC8e`7kJrp+7xd9r z=E%W8zpS^gQC(!Y89$R>KId;2c_>-K0+oWWFgRgrl7iWb!PXH8OEcvOuLZq}T+|AY zQqG2sFU5>$uyFD@2}7s0lGeiN)JR4p;yH$w(OchBGEbaSD*CGgWGKnKM8PWAtwx4c zN_EY*+XgDdwT1F#dHM4d0xchJ8*S*dkwBUqHg?)-avDSYZX2r_cDS9S#uu}qv>wqy zzjB7FtZQE45{4iyFq4r-4-IilB7Qy8OZ{dtH0YKF*0{1UsirN3bT+*}iNA!28ZemG53Y^`x*K#tT55tE=J zhNCPxhfT#_!8B)No@^Vc>PDf9LKEGh7j7@DDcG9YP zpP%V%rpRf9qs78>&_ift=}isIw88Wmc4;paAyulTp|`Gms2|gO0^dsRu4`kGMb#j! z_jEC9nFU3oZKN(xC%+k{8dSlk_XkGj#n(_e^yPZYKt8vHUdpN}W>ebp`ki&<;1DUg zL}mB%VA|ocq)0}P5Zl0E-yA8@L;W|zt0yUIqezpFrl`%cS@@HaMO1Ar0+L1RBeZr` z>&vIH5SyGkM8ZX=<$}e_T~&>WhIw*dTXRL;!1k`r*5)2osky*b27H`%pec29kTq1m zkPt+`&)isCqr9PqMjbs%{c0Z9+uzekZh_Hp$t_~sP)-kz-X#9k%nP6GIckO>GjEp*L~-=3H#;tQK+ndJG9V^|;Tlc@p=u?dN{m+PMDw`&7p zo`nOpUH1q8qnKQ>&V@L7b&{+0Xbq!$l@86xCSgf9HCnGKj{FNK&gCJwO&qcgo8?I3 zM(zQf&7=%0ERBVb^YWNS6+3Ioo#LqEkEIR|Xdh9N}KT zAe1|0X+aM%eX=}J$a~QRkdjdN1O)Q$$W;o@;u8TjI}l`23u9g!K|h%wa78o-swBYo zDMFeM^no8E3fN&L5#J1aSwxN@C`(^kuJ5F|m~9igrIWoS zSO*z1(?Nl8JY^zPo@cTJ``G!ppe_sp1#pr2#)@lYpSJH^?5UF50~HgnKFJJ0ajh0t zEFh1KX(~r&E9Q@MblvPH6Bmj3gE6$K)jZH&Gd?SZLdOwOlZL?ImzF@bU29?6WTC8$ zr7sie@LX;lX=0Q`VY8&7CRDtHsaa@g zsa?8IE^TaeR}I9FwjMWw^&@}53`9_$C9zKu#|fb(>~wu2XSBP!0rCu=yjY)2Y@5ae zE9Ss4*jtar7W**x@j5xyj@2x?j3uwF zo5e%CdVdL}EL7jjr^t}B0@;|=9X%9aniaNc+_3O?qr7w)TSRYTw{mFq?{~rKEWwV; z7t_Y@Rs3_F)41~amzp3w?=zYCT&;ojmHac1C(}w#4Sd)*wX0Hi?)Oa}Xwkyw=t6V) zZqn@geQ8sr4X3!L$k}IG#qYP>Fe%%l8I*1!YNC>-@Odl}!ccTWm-KD9OE4)-3w1u^ zuNKpXIx!uZq7F@=lwPl_o5B~er_M^*ar9(SV->A`re?T70qU~#JUyFURD_ww>2f4R z3nY9W3bdz(&}eoxxr#hp)Hq6F(?=_(D%0EWBjuYGtH}e6^5zNPoMWWrb>BCUdv3m{+h*d58KZjG+;SeyrehSJu^NwM}>4l zVtRL9Ho;HH1P*&kpSf##xK6{X7E6C$jB_JcTr0KdB-F3s4XD{sCQwPI|P|rG3OE_qPrAfry^u>cwHf9uqRJ$0N`1; zug~v=I^=G>I|OmPt8G*I0Kn41RYsTD>rwzDg#rZhpwh&kn(XEBhzE+kE$9Kn%w=$H z0y#VG3VHiMhjrD3p#w2FxYHmx%capdgFqw^cE}4_s72+Kd(eW(7xYAo?(gP>j{slD zN~C~mW*J#X_Cp%`3g-kcr4n*3CI^vUI@3j z$sYtuCj0?3+ZFLawApn{Uqk*uT+M@!)1N?xSyOEja|J}Wx+^Wc>m1k@5ajLF*3X|y z|#}oEt3>Moh3)on=1ERnl80AgIB8rv$X$IovQ?Q`x3Ih&kTQlhUCaC(dCsLJ^)}y z*Nq^C{_du?NW=C7+_u}wono=Ux{uWRQN}FF z?M*ww0q+2ofDUz?!tc%d1=xxfKc^k{K2l8K_HdJ5V)Yy0>GS85BRh?L97DprxJK=PqtC-N!;rDdFEPVZbfSDeQ?*WGBX zBg|p)TCeG89R1Np5?#J>&N*~hI1npngNPR~y8Z~V9#hrSY= z;2mzb-G&@(X9;KKPLE&87&#T_I~rIvsnFNH(P=_UU;lI(y@iQ-X9q^eP*ek9P5IvH zAfbJLD#U_)7Hl{TM1(V!Pe>+eD01P`G z4~DO~YeL}Qz>K5_tb98tu1>J^-Q=))Y<>vgT-FOvBLmSzv@(>4iei7?bC{I)xjMCv zAIk4ICALUniz54+3c}wqUijb2dmOEa*Bnw- zeAR~OzC4n8f^(>(c{f;{9Jya`Nqf659FQU7nM?c2JKyNat|+5^d3fbSZq*mDW%}ne z#3mutJyvsYU(QGY^E~5SEdQ9!dO9C$gQqX0)=*?`)B$VRbK%%g-Ua^`%CBm06)Q<6 z`al0a8(b5r&luxtASE`0(O)HzN=*SQo_gqwr-%b0m#`;wn4UhvPSAhKZOh$Ps{|F!!aF**U5H( zHu*+82aXZ;#C%EK=nozc+w6mXKk#dc*XLWVXn>$SwTr zpkM-=s270!8=L`&qJLn+M++d6{brye5)Vy>;B*u!u)uk61`HQ~#!fd!caLH^mXPLX zE`Vmi4-)}klqq429GdxN8g5W{z;d8^x35`D?djt;Ov{j^TRGU)8lg8^vL*;!&@zRf zZR!%2=7R_zEf-EyO&nkk%14xy0@`>b&C?1fwGWtx<>1Sp9?2S zO-TFcOzs%7THjS(Sk(uq3g@&Rjub+$h7!|UQz~Fo*}HY^R98bA;ez-78ri?3)QX(i zd|Gqui8?*fl7zIL=IL|wGv)DSN*L*ikgKP>yQ6&?#Wj`KO0+~+Y!=WLNlmR|WO@k) zjL|d_he_d;`3j0dcv^=YVwxVT^5&{5Yl_?3hZ8ul%$aU%qX*-u?rgn4W>%s(mbVlv zD$n~zQ`z)>CIrWUQZmSI6Bi9NAxSD9h0AmpHQhiW@XKf6x2D{pVw?J+6{$`L2AR@U z6$?kttY^@`nf0Ab1VHkqs2XlRSjzf&5HT6)Y%@UYJS?IVG~Fx&pGbV%y?Fhmgr_R* zR_vLq;0VsOXU35yGrwi>g0!Sl+7M@72EJd~(NY==QQJC6l#w2PE~xnxqZQ_w@d^QhLx5G+Q%de>kJL7@`-X5WYE0)$ zk+BvY#~Bx|mAFxH|MYstk4XVlH$>Wu3u^Ry%ThQIHnt zlG!>aZcCHg$r!qXM|Yr$C7;>4*fGjt-#~1(KRQE)K(6a37D&9n+#E=+i#o!9+x0WO z)(=%KY-*@psDZ%hKe*%`oxv4^;0a{c+5GcR$il1&xU^wOl~k5D6Re=utL<=Y=^W0k5XS}@G8PCMNscqfFO~dgtcZX#0)uQz#q40 zHGb2g$KfzRHJ7*xLKN)kxHsepf$-)HBd=2g@(d(Q0j0BPG?jjvDsEOrO>@K7P0q)( z)`p_5axI1D+B5Xk7mg2}InsTk5Ta{8`DB=WFsJ9U{EBqOdFET9Q%sngD<2fbJ9kMh z4SvX0?>{tlx+t)0a)yDly1$pFlE7j3{bM;(b^wFD^8XO_ z9`KD_*PSpqoEeQA+losZCoU=WrrNtnE$KC(qNb(dZ`y&Ao?>)SC&%NiKUM|ae&c8yh-DqXk z%)CHzy@3pZ&6hiydSBy-ZjQ8HkzJU$Np8=SK2EN5pBG+wN^;RQ`g6li2A0&{GCuTV z4di;+FZemcW>LM|VTun*)y&D&kvWY^v2O2o3gN0f;HSq{Saaf^jO>JH##ITiv5Oxk zqHTeY#WpCs!?Oj=fQLV@_0SVgoXeO3zu1hU4U@%z0Oe>H5XI#Rqdt%1mH?au9#Rnu ztRUpNJe+<{O9|qW2m;lEc!Z6)wF&vVME)tZbr3Hm3aQmR*Hxr+2a$tj+#|{KYWOgQ zkK3F1Tqd90je%zDU)|W+J3wAGBCCO6nHWkHW;XU>`)iZgy_kFgC1*di-gjoP)qOxV zA-yNZQtP{9YiCXaHdL{{z8Cuo659g46?f5NXbn#}ENpHd`7V(ypnf(J;?~-35z*bL z)eN8SDQqY9*YZM>_26)wq}LG*^Ue~YU@Hm?Qp^a3qsNLV6s-j-fzAY?kCN#pOQ}8h zhLs z21>g=zdYBua@{5GLS$RvPIF!JUwS3=YuDSPo@S%4zt=HHK&LbR{-t#INaqn;iQ z5>R#BG8$Rr9?EYTxQ0<86Nn6$7+*i>4vllJaZwDDo|&s&ALUAZ055c=)i>e8092vRG<15F!eZ6&a3$g_n1jAj)HOT^2Wq*8pZhCB}@dJEL_-JgptX z?NuyhVmR6-(<`Sy`nG!q*E+O!R|XTXwCDQQn7Q$8A5@wE8%(vyGcqAxTyC$obbH%p zG+LEr9t#&{5oUBc(l0_osTNg3n|@+gH#>-U-m&1E=`ZJ6+UGeD&R9EpvAua|NUAo^ zER6-|Dz!oCLLPLuseSbBP_TifQc3vXPTqLysB~&#o!M)eiL%hb=e>RNhqYJX)g~7r z*ImV3R;}UkGgY?{P+F?%`Bvxoz#0B4ufGWCVfNaTj9aF@4=c@Xx z*o&5n{m)g0ZqOYUaMSxy2a}R5r|hrg2Pm!d_+h4qQvL|BJNiJ`YcYzW)7cE9P8@(9 zOdSRaQhzW32rwz`<2IRW30Xt%7?2`b8-3>9*&Ovbm&@kBvhXE*ppI9dhZ)4luN2Y+ zSFZr-*}aRAXO5HD1SC_i&Si_ESP?ugdr-jDh?Rwd5f{EkO+c;09 zrn7KS{W$od=OLuI4eLhv7TWzChn1S7!|yHy9=a(`l4xkZi%{~e6g9tJv+WQI;uVN&>d(OMX z)bBDhk>bDmR0~0A>##Wsqv!pL2VQA+z<}@=?lpAg0H5d1wb#p0+}M zD~Y_6{FVq(`Hy_?BnQQlN<1jGVe@_7&tuz?p%7UP>F+#F7mwiCUpZ z++9dHic6Nm8h1Rsv1Q)(Ckm9Sy69}sdzM0WvY}rF(;-e%0i+9C~6tLuprjx8&U2wQM-?<;VB*o4ZCoS?WU`&^y}* za#ra=ecF=yy(>vRYN-p*D9bIhYbh8Jl48LWv)jr5nwlaH5 zMBFm#7*$nuDZ13Y^Nv9~gCVVLG1{(s#-mYdb62bb*<-x_|s#^5WG~odQtq8>C&s-y+^@5;~Txjm%FQ_tWYlo5V|(% znyZy`Zg%T>S$^ql!EX07@=Y!5aW-MsE_4K1NI_gTI2L5lT*G#f?ufOITOBjTiIHS$ zfmpd>b(4f`8Lus6+SWT3+|#3c?X=*kW@tj+nPR@V54%}O)vTH~&NY5DS$g$ucIXoH zf#JYdmt|hk8$La^Ns7&xOXJQy-?1S?OmdD=OY1!o=I{1L-w$q2?>OJ1=-ZhchCfr7u(N{W z!$O%x*eKM7Gi-Ti5Z-w(8r@>Ce?+OTZ$WVS5L>dU40Uz_KV@Cx+CY{yzFbQ~QdUT_ zN^A2j`mCznb%tKL(?1{3dvuIpsZ0})>og6d9qEfa<~mbj^`7iB%9Mu1`V#q5#fl^{ z!N?B#MYB6d%+J{-{IX@G$D+|%tpQQ%cyi2OT#659XQ1}!=!}IWb#%Ddct70P!MnPv z7X~x^4NJ^m`mSxbW*aR~o1A@njb?V+(j#zNQJ!fWqW`h1Adh;pMlbQDq0E;XVW%r! zp=8>7(Hsy_`SDDZ~Z=zIc6pIO*5$_ofZ zEK8Q9LF3T8+4$}~aAAJGcmPlA`@Ud1fk%qG&)Ev9{wzeM`$;93PBCv)qtAd_PD*C8 z*tG$?DK8y@hH^Zx?qo`^^`OCNMVjak-&4+wV`Q!c4B0(bhO5eu9eAwB$vikb7@kre z^rD9M{$~*a`N;6zP+pPM@N+IT;u9r^UYpvpt0zOeE4t)LoLF8@swD{Od^Td`?_0$V z{``VxnVYB|hsZKBw=K~oM28M(-mc$QFq2htZvN(Vu_dKl$g8FTYkcgbp;nzE>r9iP zK(RgJwX@ea8?hNUV#?dPzOXs#-{SK;uOjkQso0jV4%Wu&G8n|Pf}ht34)l@@Nj&iG zqCB#&CGv)aX6PPR=&XVwroFDFFEGdDGjo#zHrD7e@i*JpTn)+IaQA6A?beaWN?uR0 zk1?S}t?Bl;(Yn>P26fj=u(?)S%NEd`%Wd3&rG5cNB)lc;m9#?k=#$Yp1S4sp?cL}% z56dP-ER%CbJ%0O){PBC1xKo_U8laE8TVfpX~ zsTvD=E-R{d_6hSe%fM(FVTXEo9O+#1Moa8A;G^q$k2?Kn=o>WKpm2D=&YF^;X%CrR z{4Znn9==G#Yda({`qjx9-E5l~9>tAr`;=&uDW4q7clFrTcS7&ZI?(cfJ>Y|h+T)*7 z_ERd8Il89=yVxK0SrGyg%96*)VxKtZTWJaAf!GE!-1a%bvppnYz)X|jJC}V)C(vSt zD_P_U_H7ZbFD~5e)xs9Yi^&C05jD^Qwj3FE!m?>K@-!i7iP)}4H*6%zkLvjui)huo z9tTxkM8W>w%)YeRltdHAK z`H zkVBD{v0;6AfG|KMSLas{MCS5A2G)Tv9qtu>A$egChd+$(M$a@qU*EZWy_qr6EGtYs z1O2D@xeMn<`s$`{F}vDFE*P}W&7U7`!M%L6jG1%*3X@{@1B+19Hmvx zbl*NBJ9Aq65{**m?x#)LpCLZYW{BMNX~`K`Xe2G+%~ zw(72zXRkcPXM8(G$QKk(OMlki+ru+njY1RcqSqjv_Ug<{2CZ|VnOn(wuFw4{1fmam z9-Qu5v_^|Iq6r$6Q(S{n7a`VuaIeMSwm3CDzb|zgmuc+C)U-iVhrAN9P&e(eS$%1? zLPv6FYRi``$+i{4JK-r+K)Goh@``sq_-RP+Q-JI|BxXGT{_!I44<4Hj0h`d=6UxOF z1pi~1IMn2_or=sZeo${>=U^M#-~|5e>`XGRb4&*SF0von<<=r2%DKImD{ z4HkadzTMTdF;%%#e|v+_st(T7eNRXT=T)cV1;xx=m$Xt&iZ9M*v(vYNw|-N0V{wFi z;qrD@Z7Y-`?Hd{0?XCu_$PAd_i{-JMfU6rO@f zcJ_stn%|V)mNYbt+?Y6HISokd7sy%HWh2Df%cPEVh4UW`iw}(lN<>r)2I{jSVn4}4 zt;mEXM49m{=q6qs)!DabqyTQ4v3F-Y@84peE>|j_`(zXS3vwA;)ydx}8`{?tTb6XKz2fo0~p20Nh4rcoK$D`0*^F zH_|($eGdw}-G^^poI8_hx}zSV^;jnc#ALT;v43=0JRIrD6Mefs+AO2>LWDiI)?Z6= zsP6i&an?H9K%T7#g=Dkm)t%8H4t@W&xv8h2-PGS`y3L@E&B^b;nmRb$)D(nN(!1Ge z)ZZFVPt?k%W=DIX9l>Ev#~hGDLN) zz{~#W;r=Fldt;8sTf_sCLM_qFT;~t5IDNu;nsQ88)3E|D@8OgMuDfG?S83&b2q}~J z8QrbEhW55hip?a;gt!0{dOzr4AhH}Jj7IUF~m@{u%%?>=-4%526||?+j1+= z-_U1?-tv;aE6JO?C;Y6z#Yqh*(xM%L(Pp6}G<-QvCcNx1fdY5onFm+9Ik))*VxN|3 zx+@Pz`tLL7d$J2Y-m_ z0(MD)aOUFTbvh093&-uEux~@%Ntx}srJRWwc}#*5MS|r;mu3*vZPZo+J5DlVqf&OK zhHIN?7n_FSGKo55u=}j+2ya)oH0kNX`b)GP102EHp%vM%$>?#r7_0DlS!uMSG{SHh zQQ7BDh-i3HvZ`9{?Z8$ub&smYM!am(;OIJ8>lX(sPA3G0DM@mEds>JO+pfTA+)U*3N8`Yq+H zn?t1ZbMQ#{%hKyt-imQvG+%4Gvek0-p&P59+mw{Q5GKGNuFMS$`43b-Fe2}@vh(Tj zE1GM)jg&X?QtMu{=B55h`6a=f|6rV(J}|93y4`W7XI_k+gQ#MO)&uYE$A{*sM4r~v!JRN0^l=paH~4RF zn`ZW*-tcbfSAt1}$h0OKgN%W2^^GYHEV&FRJDL#e#YBlSa!-WM+4W6=q~`eQ6dx-3 z=G;wV)VGj!a=g({(yZJQI?-yJwc+Q8QP!V1yJyO|qvAas!_(gP*9b*U3Uo^Y4AojZ zL|7x)!qQaS$Tll4F{)B>AmFwasjeC)gM%knr-CznuPP^%2VP#WEy8mllOWUigTZ=+ z$tA11(}VP>CU2v&BRZ~z4`RwNFs9;LZ@ETQO{|##M>PzDj3$r`cJ&;yvq99+D5+m% z&)0F-3`1v$DEV_Uwd5Lm`X5j>gKK8bjxO#7Ebq6Jv7RXOkS}M%h@em z!j@Ua*y3MvJcG;X>wyuLbbu8h9ab0|`={!JEw(-x$2vPNCtHI}t(;!+>*K1{ z=&g3Yxysb+uWkj~HJwks2N%TP{64hm6hagJ-|zdWgD)PW_Wz&PJ{sh3#(Xo-IMvH5$#}u(Q!F4(rAqA@bCSyuA&eo!`W>hl2cY)_>y`$># z-r((%RoVsLeUnv@PaPh@Z1I7w_di2f&mY)?Me_IJL6u)1)9qNY;$``UiMxm7DE7i8 zkCQYO+{^y;sJEj9#F8gV5qHA5;fXIq;tNra!5{LiN8R=CdS~a=+h7x4T4sxa%MM=3 z!Cs%AjO!HfdB^f=y)@YSUe3piZ_k>{tBVBqSd1Hb|)I1i@R zxBgIcV1_()nB0UOkU@(e7^IfrY(@lnc`@UJhLPSZAtkjD0zs!MsA6iiL9@ir zxazSS5^nP=YmEB`clE6Mmgb!4-wkKg1A}Kk*wMhb6DH?<4m!`5zW&n=C-W9Fboy56T) zX)`lAZ2n$Lpv}n@$X{LNO1FAI#p7cxSL;x(CfpOz8?k4Tzdx+>4Q!B<%pvk=CtY(2 z6zMARClUh?2oA?)9Iwc0o0i;+O&0qwdf)1t5fslV-q4&Tx8`X*H#C>oSFiQMC(V5M z=Ipic^WmwcjyGQ)YbK=H`MoPOAHS|*)E<1j;~(7B>>IP^$?2ztix0W&F$3~3(iR(q zEi0j|F%9}#hGQeFxfHL~#&@zu7~HxB)N5~6O8cf%O>3jU>N;1W>z1t-R-g4oN7MF9 zs~l11%l&<-!7%|D409O0x%#z+&h0@aJEy;m$lt5^*2^1`K=RuA zeQuqlX@lfO>T1X9TA1_7AqNOKUzZX0 zyv3zmRmR(Y%q6Ay-r(l2o(P#PyK#2GfLrJfyxQ%LGt>!I3i~?~8?kK3i892^Jvsy4 zdJA)IKs`LBtEv&y&+;aw=Vr{R>bp9cPCR`f(Z)!Soap+_OUhUkkD=)vjWs12qrkF$ zRm(;zr>$BsfW(1bBy@?}UGtL+9-G`*m|*f43rbhpRb9K~jx0Wa>{#^%p3#`WvV|j}&Yg#=>r0q!^zgCtwA4bZ)7`>*e;ltH>viKIlJF)MYPX{on8`-Z0v8QOdG4k_ke)M z3;FX~=_JI7itP3w$UynwHi%Weg5=U$ki<~Rk)X#C0m&-mu=@Ag20Sofhw+vR2ksX* zf34e2gu%Cw`vl|fE^*#+8?8Z?PgP45^m{_cCCwh0)r-(UfIL!rYE5vJ=X+^y9%}ak zcYlBef9ax%w3shU8k|+*iMAelm6&zD`obkyi{dt=LcPR(MngY$!+RDyvzUARlap@~uX{?5exBmUAAE4jS*;!pN(zuo2Reo0x&9_mmJ3aquSV^0(I z+Y2v=?sO9dgEtR*B-h%m5@Xk;86n;)mBg-I**XWUpXv!W5rY< zRb16Yf-uk%_#_JH*$19~JO^wXf^KVKzm{+-kF#E|laRa~7 zSNUd<=>Fl(skM$tX8lPqfWgPzOtZr~dz98%IFlGn($lgMeM&MfL$kL{GLhUH` zz7f2SjsHt)HDb}wsFkbG&j@9F*RZkfwq_zU$(7S*R8@^Cx=<+?W@r@RMQ*)cH+TPh z9`lJ;;9pts;Vp>TUnkJ#oGiyH60vP0?;hLdm(X?WeoQWsKTO6;>j%YjHkZj}Gx@_( zY%`yxG@aB+W+R#1+Rv3%5!;kauN@xlKJc(F-Ku>#B#jc2BEGqJ;4G{uRcXzRKjls> zuSj>m0C+ArEGvR*rZnOAJ<(pbV6vb^xoh>UrPz)%`cN622eJOzxw_@HOUlYhTHPBn zb#u&~0oq%%?w+RxMVD$JmDP;BeB%}pv97kPk>v|dTzR8y_N|+;w=SyQx}6+)Vd+1; z^_g)pb@{pB+Pcmcnr)`9^Jm>^E}Ecl9^6HU9yH?RNip?VE%QFsem_{N#zM*ROJa z&YAtusO7022ZOKB{?l7eED>o}x25ifQ>GSOp?=jY3$)D~wm8~~>^eAXW|U0dIQD)+ ze~OTaC-huNws#=L>T*qsrZqLH556@-m7U?9Wawd%d*7U)Ltwd7HP|Hiu;W-OV#yn}l`X(pWt+Q)=fTie!5IhoPjE}O~?=FnVvCK-Nb9w{uSAxkw1*_LGJ}n!ZmFwAccF457 zE4}*WrTRKeTh#PqBN(l`J=~pyF+ad?jdNMGjVRYpryStwj5UU);`uwpYwfDG3?yG` zXMD2H+_?S@C}OSHD)CBAi1o7jL2ffuGY?u_lJ8DkteGb5V>5*ALmS$$a=j(G%xCAZINV;by_r5 zQ^Ok~H7zFkXrvv!zV0Y}prtNcIiIAeZfCcZ8C{vytMllNtIYSqacNNbaEXuoTQl--$%mEyUgBf5Ez$as>QUPxc1^=y3A6^`1W;AJgqB$_GM zSCgO(8(MpDNsFU9JDaIwJeAnoiIx1GB4jI^G%Y7A=|gKWo?m~G5_^^%xlJ=34R(tX z(HrqE#yWK=%*Q*6 z2iBv<#Z;I>hpXJX?ui{=k-sQfew_W+(V?v0b=P2 z5ps$$z$xPirOxRp7kbOqy$@6;Tfl3tw*Sk7s>yayt1gf-J4`J0f+`@cdk}vd+RLcW?OTlZv@PD zPTLSc=r3acd;C_vc~Q|Gl6L_Mq%D@Ij%M5M^~vOI(x#f2sLlOzJAXXR)6qeNZZH&m zLj9cx3QKl7YnpVE%k%F65m%<1DBSFNA0T$ywHy{ZJUD5YVhAU9yBG^(i8Ig{Y761< zhpp-Q=HlS2QFw>L7tN^#(zGQ;mkQM9tEsas)m$xyy$}Wz_1*)qw{Nm(z00~N@y>Z< z5NW%-9VTe1f~!b-QqD}WTe8_J-42p9-Vn|3JoMjdLU|hV+=9wW1bF z!}{OtGR}J~Dk-n^j<&_dh`pZBb%De&{QMz~QjPMSwe@2%m05XiiG1o^uy#oOEk3w# zdYiaZsODJwY`TDED*2hqQ2SoL7)Ix1vYS?T2|~mP1@XhE__b^-pDoEcj9Gjymqo#| ztz<5_bBOrHZMY^nVx?jX$)aR?Bb(0__x5v{5Cb`Z>(%jLIrkadxzGzAp- zL0oDvhQpw1$=$ttE-zOv-7CzhjK`HbqEyyPCZ{pp*o?_Xr7&Yzp0 zd(RDbq15QVHjJK=oI~L6_pHLpvMYjTZC4F}XHfx%y8Rk%fAGNVdnkWI5;T)4`n#?; z8uK|F>AE1e{?_Y~*Bnp(bhJ?td#%Cx!qYbi8EYf)i)SU`A2J8;nqIr~i<=g31S#87-iS zB8k=diiZ($=-H2~5@ejGLd9(~O8tagHWQSkgBVRae=~Xz$(JHXGJSj_O4gUQeOb2t z@zv#}c5k6Iwhb56f8FwD_q;nK+6m^J3U50PgX`hF%u*y(OO}9Fv(h3QDdg}lm0e#a zQN#*UtCQfWHR45s$!IWIOeVA0h##{NAI%n{*IZ*P+DHTpEm%NI6m zaQSx{f|J$$I!Wld8+yUjzS*fx?dViebvM`-WHUzhx~V`%#sF%baayr$@A8@^=UPRM znn@%%v4?Ff>kX+ZP(D#q~>#3-kt-b)pvH_29rdhgWmAi!Eqvv(U_~ zu=}-)2q#cHUa1s`t1RByvD6WlTGwu&EV*-y#JuY#VjK6@{y*bj`|HNHduWF=jy6jZ zOvboY|2S>NA(`#l>u+mT^(8yw#5caw$}kVbnzU?|oG-gEw4`a-9L4rnr6*dhGIcd1 z!>!iR%p<;L?VD5UFy3(yR}iWP;A2ZI2Mrzi;c6MUW=Tq)oFUe(!3FtWsp}Y=7>lO6 zII%{GC>=2#nC$URfg`w^bYnAGh@n#!#cc0jgAmGneFy;1&9kdPAPfI~eQFwX)Sfv^@e_vv^{88ZzJm){Yo53~)L> zM8crX(3g)8M4~U1vSnzt0vPfY=(~|CQSjxDqu6+X>PA%jNMUUoZOY%c5gImCUu*f* z#FV0GF(h!maY;vZnqRucq>&!W^&0gAAzux!lzhU3`<{<2Ng^h2B%wLoJui3vH zT6^fBP>IDfCE-L8q{7zIj|PL(?Be}kYGs)`Rw7YIfo4d!$5K;k+X%HS<6}_LH3;6* z$Z{!P4p1&`n758l2^E>|1w3IobJU{aMb+o{X!bCM(aHbpZ+708{Bc3_q3_?KU%l|( zE5EvCokx_*j~q*X-ul&rulMafG&*Dw*lOc7+;b37R|IFcfy_7m>1AS*pun|_|m&6X~enjjc#&urXvhRk; zleU=hE+KG1e{My+YBvy{+@eJLc9^7Amd#to+NPj>d|`s-+E+$1>iD5Hl~UeBVz^3q zV6p8;lIu%b`g}sBzOucH`OaYrqCY$RI$YHZZ&tfb3 zqJ#7~&8@_E-5jRC(Sp+VswP1l%~WlHB@y!dF?*2*Roi5y#vYt4Y#jD*kiI@hc5W5_lOCWoGMNTxh$&RuYk7a+yeGP&@l^|G}Z31a~cS_DAO6jJ7dZCm4c?Tc1+! zl)P?v$H-c$b+WzJy`Lr<7vqC-qm3gXp`j<%oa_zL(y+kBSa-oIC6pUz{cRGefUQ?l8T7K#O*5 zOJu20+vwy_^=2=-tJBi!uh}Jz2?I)>w5)b2XDgYmx~)Vraw6}|0qi>2><;RpgAA7P z8KmeR#eq;;0n%1t2g>V1mN)p8OOwqDyQ&g-Mcu!=zyOt(8FnHgu2tsJ3}jM8>xhdv zDfBp3vIisvo7TwRNoX8d{5NWwsND za?6m|@}d)UgYUN{L(fm_SxLD(v@hG2rP}{^gn4(A!_PpAq+b0YE^E;bA>)CtgP9gY@VEi~X;6?eyW67ctk(ZHK z92lwB$8hg=I1R#Ik72Nd(r>1~qVo6s7P2k{MNdl4YfsM)tggNGSgGMHa{Wh@`G*P| z!C$(`V9f}&*tXdC{&FrB_3!Pe~HW~a-Y9J3py z*I!)J6=y`d3;kH8V%UZL3 zK{VMm#~*`-He0a!>50y`KpTfzn|~_Q9Rc2kMeJv zfA*)-U+@1q`Zzr}|3yeC=;?7(ix2p6^m}Y$8{>XtAD?kBWGdEpWAmhDW_sWTca+5$ z>U9lzdR={kbpMEVR5h3-!ulGffGHXfN;{;}W5Qt16;-RR(Z-sdV%gZ9%Pvw--xiP7 z2-@5Zrh!9>j5~Da6^M2Ja`D@zzw?iw=f5}qx82-t8)@JDyOB4B8ZQogZ|H}tGQ<3P zqo%}x;yoE555MKHeELWnqqKm1iVyF_$U64aiQJ+fyb2-XltZ%QR&O83U{O1^qliEf zSq?oE?}Fvn4z0%`LD`}&5nWL$RyCF4lr$LH_HBoEC6VxUFs0rn5vhqzcZaHF8E-6- z;<>cyfWze_N_{G{wPaJF&xP7@C>EwX{Iv+QGU8Ag^^3rxxfZ*DHK*&>k-4Ew$)J%n zZ88L$M(@`fJ&R@b`Fr*lY&L4|=21b2q6DY%XjM_n9%kO53fZtS0IHz)tL&Zqor2Er zMO*ba(~3kb$eg^3Bcf+n%QuJ5ni2E;?8W3EJdpSuV?P8Z!slcn%IFzD1qS~-DT9d4 zCm(r-xq)QZ6=?$hZyvsk)DDE4LWyGU#cYlud9MF8)}v}=)m`}_^I0a7Ywa2ik`fAH z=Uz})E)roa6pt&-p1w{mz0=oo1}(Q9pf41?`sH`oC@BW8!*S2Y%CTuP-W5_XS? z9MKr#$eq{jUKnL*zZmY94R;h@e+!6t&P)zp^EuBGem$P`{YK-{{frm-`}lgOR*yXE zGw(r#(gA8Dd{DECj^ztBN|460J`O}GBtt8J%*+e^z*sl0Z~CHnSjimI4>mf%mY#2x zzSiSztbEglB@_%zv=4`xM;$lb;=a$*-qAK-^noiq6vLyAIL4ZDgVGZq_kR*g3+-Up zxr9|jFD8^eL!quya1!TGvAaN(@QQ^~d#GRL--1^tS14o-(4%<0w3WcOAA#;mN6;De zldj=Y zzPoHQMz*)MY$li9VRx@t9Hx!kWrty9XDbY19F!6cG=}3KXWA`D$Q=)t^Mo;m;z9_? zFClS)!0H9<LC%}|X!v!6?6Ga0lW zdgmDUOB8B|qOo*7#EtCD|JL#uu01B3I*f3fTLO4mH=kr?`5y0#H?-r+=p99Y9~Sug z`7;9M(I6>TC{pIOOeUK@%%VF|0qrA;i+B190Na;Z{Byx)EF-n4l(dzp_o5@K*5SFkUs|dKH$q9 zp!{pGaGb)rLu$N`<%-AP_{KTJgWQ81D^NHF=Qt)QUvWs8DFGc?N>R`q%c9XI?su}7 zg<+Fw!SjyJ6hN;`P_0ICZM^>6#>q3hsoaQ;pb^Rn|0F89{zde z3)7n&)sF!7>9Dk4r5zB6lR=F^Hb2ZX&g;~p86uyBirZ~PeVQDGgl?b54|8}g6e|k( z!(66#0%OARmWohx5e`g|)qJrW_*6WOngP^_WBA&!LME36te6q%7Fa=GL=k}DAi{`? z#Sh^Cw0KyM^FYvd!19w1l}J!V7Nq^d`p)0-Y4{qqEULAftM_(V$ST62Ml~hjTRnlA z-n~h_zhCw!RI~MMjGHfxycOc}CYn1MT9~g@$^exTAh$0G%6%o1c?(mPY5@bCt zIMYiD-79+!Z;ekUT}vUGd)1%W@8yA{@0zx2u4t}%; zb~{vdiX>BIeabOT^2s8MMYD4PK5s#=z-iwj3o%$XvW1TwVnC2YG3lj3>PRFl1ci=1Nts>K(7G*F#EUwX#{hG+(T6J1bxR{Go)o1(p{-L(wK`x{G8@El_E-{2n@8=W$3-+Y_qV(H6lRKUOFe4vuI+ z35`&o(!vG=KgS6egkZeNmMSRo736c2)}U-M#nK7rB}ZDt$0(J6I*PwXqFA0}O89cR zbOJ>;aN^yrhQ@U3&^IUPZ(r9e$X&B*ye0vgsZNsaPADEZuc*&byOGz zs4Z$%7Y~qvge{Hb{gB(dwX^!2A8x_^hNL}AEJYMgVa&+127VNd_I4hW0Vcd7%1|nv zz_es2Y7g2*At8mY)RwA%j!WSy4uPytRN@F<)6|u~S{yh<8PXuEVT#B-zN{xTS8m*# z>1PUS?;0UV4CHTW`Z`YcU>u^WtPvJ%z}Hfp=y$-AYQE5OwnohQa*gb{8uitDdmrSv z7jM3>Fl>AMMuNn?*Zs<5?RxuC=VT#L z`^wv?5(Pex7lWg0ilq$J@X%)|n#%RMtf|6mGU!UCGIPm9%*QNxL)v^?XE2*gdGj%o z-jFd@7D&_4yoqm3`XC;i!1u z2N<&6OueI5a9vy?zS(PI^K4F2*G%Uwvk!*wxvTuE(=x`FZ-&k>t#u{di)+MC=f74t zm$(coeEyq@|88s8o1@i>MuijY^^by`L*&_KfE(7v%89EpwyQ1lp392h_~{@0$&*ih z`2tp(GB_4c+lf-B9X40NUFIs`l{@-NJQWUiz?JeI_jr9i@W%t+F+Yq!Xh@j#mHG2N z;yvZ_dK^xV*Xb&{PkJ1B6e`3$?+LIva*#mi!uC!|iS(e~PHm$1b+Y6Mlt^5)cCfpB zxPnIWg#$0_-|7$vx%PIx93v}^y^WF!`AMjBwH@6h%Qmp;Sazk5$QSJEnXUbO?XCVt zmKW`_DLB<^DSNJMG0qpOhx*+G?{LkZ{`V)J>?IIE-dSJ71wk8HGlheDfe!`!{$L;& zborx>g1y3Ou~hN z`~J^|mqNi%7(Ywm$@$q?E_Zg0JByz=E{{LMnap!s95Q`^GsDmZ19?9QobaGH!F@w| zB#4S40n|u7orSzZ$@r9I77al_p0L{oCP{IfRIHgp!BpV$OS3|y)uypHoB@SHU|V)O z!cJ#26!yCV0iEBQ3%Y`jhl1XyN)Zfs14aL1-k{el2aC<#i@=cRN=4hFnlU(77IISI z^LTigN=SkX1gQbKRIvmfGHTM#RaM@ps>GVijc%)jAi zyxw@T`A+rQJ#LkP%W7#G>22aK4sscN^zK@pCzyA;+>d+Qj(}1f4kG%+|CrAo2*?hp z^}lDIH5BJZl8#45cEp79h0hjK8Z)9$_9_1W{A>@z=@vF_`C!@wD7uO8-%)H5w&#pra?$VhdaOw%^Wm};aAxy|;x$K`q4>9Bj1 z>Sb@hi{%Pd+&?Nk8F^j%KBGFCFYuqwB2>F;WPDaRM%PLg=Z(v3j%c)FUM$U!g&$tn zKVNa~{P}aa^C!+-ewA-C?OTpn?Y5GY*gj>jOQKG66ZQLi(TFePiRhjFklR)C5Hy)8 zc=GqXe#z}|`vTEL<%-J}d}M@%oZVXZfDvXe!r#EA8VfLndz(6|+ZA=Z;uvSV=Xz^9 zV}~sK#|4b8aK7y5l|Fys%$v{gT$X)v$wDy73bSK|S>Szy&zqa$^LTUfbJLTYDGI$G zXR%?Y(MEh83c;xv1N!_zHuFBr-H+C=Q21=VkliPVNFuW0kFB7Wa5BCTURj6flFWVg z{K46>Go`bSojH5v@kFy`?pnDY4h%edSKr?1g!G=xIFu*Y}bwB3_{7ms$~j`$ahm}=@sZGuAK1Z1cJ zB`tvA0@=`g5F+8J0$FM?^+=K^&LWHE2Yr3bK|g78tyN1;|()n4@p zxmNvNTog4V*e*&1i2kMGuc5*id}EN7!NMUvQ%oKMbB!~YS=KQoYof&Z=meX?nzJ|^ zW`{?pbh%5OC%kT;7^tZasOI+te5C;KA5%?nQ*$Nm@oApVgNy8*V?M7hO$~`cehleo zPbwFUb{i1kn9XV{+Do?MRvZ3H+fUjowne#Ik(TEWEEbWUkQje4X2@M2Wfj>>90gxb z!WM%f0U%`1VWN%GhcjflICGpoJKc@k+|Nafp&%OS&UFdls-Mz3bw-=fZm^pSi_Wm# zzUx00@QCt(@__#^Q1;#{A2<>8d%^b7{u2R32J|vV?%7I=tm>wg&i1y3_J*38+M34J z*3QP}HZ(Oq*-UG-qz|^!X>a;O{Ju4RSNQr=etl$a#iv^f2)7ffp;d3dqD6!OLIoe+ zYRys=4FdW=$^YpHt*N>BGVR9scFy&drt!wn>X!QHsNUw=^H%tr;y}S)?)M$~%N}@T zzyprIGteiF%mriNz+c>{vc`H0csrv~hLp8*3e1Au`VbA=p|<+~z-jd`c)`t_R^F5S6) zu5{_KYd7xHRMpm8%Ut}}h3i$<4Cq2jGLth)IwH@6zud-8EAq-cSAj@PL>%V#n@Lfy zoAk!pCrggtw$0pUEE)QiA7RIou<)t;8fQ@?mocX`2kI$>#@aKk$pOYBIkn%q96>s^ zUsv)IUq#R#2p2*p0^wjN7%btRU=Rt_d!7ofQ~1FP@eWYGd9)73HI-7OQmPjnZhyd} z^*Wq3iv=j}_IbSp&o8^2&TR^?v48T+KArz}(LaBA{6AWsl|4CIUn1Z7r=2g3{PUm8^*cLbH$$q-7UauG)=R|pka zloOv9aE0^pyo~$_sbr0UXyv=NMSpzyFYkWm%Y^g8rk{QDSr#F$eZAqY$N%9hA`LTt zTBHAaqW;%ggRV;#zxqnH`dfiVAfnK*94b916zV}yv=YXsDP+j?(o211^kQFGPpS74 zG-m?PfzXswfg#*j&ozT&s_MfC;8(m z4?qgKRm?+IhUEedE=Xm?Pa>kA2-ysB5d<{QV;DE7xCZ=^PvHo(<8l+M>zl z@j9%56qdf=|4c|TwXh)I@fY|!K7M&T{+!Us6{01VNc0tvKp+xQZ(NysQKi-gTsVWz zLZLt?#+yJiE%7Q<8XdS9_^54h(dd6y3ZbUt9m8@_|FwVnjbAGJ$P>T)!uhHNF4w|g zOf_^%InZ5#Scsyhc1cDy3#{;fZ9-x2>>aBW{(&t8ZMQ|&R*X#F4 zZ5F*r?NBfNf!3;38H`q|#-`$SwU2f?TxNsC;4qu5R=x7*gjvb!>KyN}1xx;u0jYmg z>;O$W2`soLoxTHQPW0hluPA%$*IZ)gh)mie+lflUx5(eXdWIGG1?~D>U)L;UYTmu*c%(_+Xsg08s8pNcH1ql zy@Gr%s%3ZD_d7>~Xm~PMKZZ*HAw?)cJ>Z zTSsXvechd1(~Dxg)x2PHYX)kohiTnIv|(D?cvoBJq*kOh>E}#AFxV54cuHoye>wm7 zh@=^Eia+~<-+%H;fBC&1{N3@6b)f;UCH~#6bzVq+j`@KK^x9b1#HMA!L zhQ~Wuh!KB(0Tf`u3I^{#wXBz%U$?aI#jJJo%)8ZQ8L%N*MN?unLx{;#yuj`j`@ zN(Q@m@WKW3I;(4OsI9w2!%_AO_Kq?ngPpUBvL%l~We7qJ3{DGG4Ez03{k<)%FG+vp z6Myty|L|*n|L1@Ed;j%E*RH*G{^B>j|I?rR=m+0@`L%!f#$SB*>1WmN zn%~&}#MX*q%al(TR(DdHyM~p#Z9U4kTYa4!bW%k7R)1>MYTdWSwi?b z%xaV|4vr=2_$RQ9XPSnGhDVzu4vW?73V0m;obQX?&>*X=x#2W@8Q?igev{rP(iz;q za-U0TGus^|r@{CYv&~|#JA7`lLoO0)7N>1alig)?2HakUNoTcrT_(F+AXKY3W@;t^ z7L`)>&Q6A0{2p=Bmn4ssee730_wll_U;g}Wedd=w@jIXUXxXX%@;iUzy0y= zeeTzOPy!zEs}Pwa~Bp@US7ufrFTDFaR$Hmb?$$~wQ`7KnI~x&DQq zYKA}0n-@vMpilVa^JnL+T!BO)Rw_Orl&Canl}svMP}mj(0-4_hcCPwWxkM;aDioL% z>Ac)Fj}yK?2trITdVC4Sh5yUmd&kFdUH7B2C?qISl%Ph*b`+bkV#$dt+lX5d`)9w0 z*l{d5c4E595{n3tVy|HD1i%J@1PKy_0EpfRkRSk}_qw~-Hak0QcTotiqU~Yhl;U4r-ajwzLoR1$G4-5t&pr2h&Mn6Vc=N!(&km6AH9j{lK%(9V3Z64>?lW_O zfAX7`{_2_MU;o!1edCK16&Ug?^$*Ct0vWVLIWEwJNta4qNW0)>ca_HvoG7k6RdZ=? zdAe&^djDfGP~r}x9ful_XcJZiKmZh>+G#TCj&yV(Wejv-u)B}32wJsqihj*xA;rux zCZk4I5t~_m<9fx#jH(+Y9qJyv>Eh{&6_w|!7o5M`a{Y1x+z^@*?UL=A0(Um6s;%^D z!G)UI?8*+>U@+o@&2AIetlVrYkI+(B-&Ln+C4lvjX1>SU@bxcJ^PZg_^z-PftuHO9eZ9^7ZEYf)Z!J42O2R8*e_hqZ z_|wJ54#p&&IoH~U#<(E2s8bRXpXviGU0gMwHt}MW4B}u zNFs&9i$qKG-b1Nd&&8aIJ%8-vmR>9HkRM~unsaaMcfLf;oBzy@D)hp|w|*G*v+(bH z{iAaicK`6g)#zXU+riZ@|08-ri8;sY-;u1xrmdoDQ^Md)6dbw=NTHGrOLQtMa>-m? z@~N!jW@cw}OM3392D8Q3p%KI}!N+;~Rd^RL`!%xk=nSC?9z*JPXK7YW?;!mEu1mHAag*Xt|u7=rB{;l)$;zrOqW z*S`MdyZ;*ghgEO?p)EgaFsHT|PdN<(C&70CK&+s$1ZVunReQWp@zHZ;Tc?e77GKRsUKRrRjFwNHT;m28hULtcOrUb@d zqG=OqiP50fOYp#h@Y6&i6l#EXGHsMiFVc*KV|a#U5x}xG)d61#nDjJ8%dEtx;P{)L zvv4d!o6O*yXBiSD?qvf7M2)8vu82Z@>ZU&A?#;G8zUBoX^XCW8d20UCPe1j_%g=w| zi(h>HxtCvA^!%bXUVkxk;Zp%WystF4Wzm?yyQ9)m`fRN`z3gmL8+UOK13FU6Pjo!C zh6o7^d=XQzXxd-_fPjl-Va+tiH?s_5Vhjea(Px@6dQ7r$p@}gYO?+)jAA|6v!EhfD zvqgHH^3j{jdabTkZ$P7?(e@hHK#S4O)Wd$a!jRu#nD0jr-r6}7rE*e%!SfdcOO)!H z?|P|czN^$HIk^z4MBa!k-t}x$e!BbAp9kA^VeEZ%O4Rjpk1;`fYy^qCt`VB;O(|t` zwJkmEr5(mjeLIFHcI#?P5IIeo5$507WYMB6y^1^iKa83 z;poc}0lco;I!i-xLF}PJMbXKp+bWOcU&@J2J|BOArV;v)jR8o=nX?r!mz?>)y85zddtGS6v$EXdouG40uxqfs+&;j-VLE))M@m~Cc zCDe{PQ@)uAm)kYzoOVt~js;G~=;+9VV`9=VhPnIBXT~uP9z4lynQDH*;_G>~&D-3@ zPiQ&BXXIOgbximSPk*g|_$lzzdNMot*yW1{lM*|d52s!#EKWX=k)}8MNZA-k`AlP5 zU_w=6nvxo<7M2$#`PZx^$%$vv&ga|d{;rJTww7LlhC$RZC84=NW3m{#j3%>5HU)?l zu7{M7AC!N|#iJ8RJ#HvIP{BhkV!S_tPG^a|qo)n+TC>*B zqt*8s^gVbBU025R8qmuTgut5t^<&!LHA#jLy`{O?3YUVA+E<^FdMtBK{xEOWHeSi? zGOLYrZ(r*V|E>r%i#0WBE3134F0EN*64am4`l3=RG!u2FR`2b;W#G(1+|7ym_oaIw z_wU`kcklk4+qXQo=iO42Nw!vWdu6Pt!^2?+aQDDSJz}FJ85|&T>bTi!Hlc2tX*2#q zL@07p1=?&fdLeGfFK*+kxJ^u5vz3GTIQXwHtRDIy_E`lx({j1C&&rrs{x@Omyczms z7jw^c25YSX`v?dA5RTe?{wF{9+0}uT4o#iDy8*d6yF1k_n%=r*`(5|#g?q3wve#qb>7kH^+t3= z^}2L&uTMwm(Tk#!@QvTSKE2l<>*v8J-Du$%6bpKsghg=VMZv%ZGqvaIZ@n3RU!xQBW{VD%Qwu6Aw7M5# zrj*9-wx7dvOwNRN+Pm|)tue>iH|{wS&m^Qa?cCM!D}8i6IIP)zvVYYfUHPf~fC!Ip zh$R4hGc%IwwzScB^&9P9ZiW+h*+kqmpgDXtTGq2&{!il^^3N;0K9+ z0oWZiUEu9~sQv=STNp+#&FxiptF@?AJ`_9p>pa-an4Y7}dIN2MKA^DC4J6nEgn|&c zLk9vPjW78v^#o~q2l{!|!ihTZ?p?I|(jEEkqFX~sJsKXq39Y;%XUEIF7}`G#Y)d*wQRm2SOCl*+$w=AGXEO$dprp5hq#?cE;%-SXWTPQp<^DYQKuK8 zuHo0c4N(;pCyF%Jzg*FoUtUqwoohH>+E`!N6Rj)XiR7*+&MPtHJ=b&gAA7u3`Y;WM zaCw`#$+Qv8MYoO*xi14S?M>1n2&E51i;9CYdaurl6LN2e{zfCO@OT#z0czzW~Li0wwYzpik_Bo`{UzO3;@0faQleKrP7D zFgS_S92jQ<@5=WI>FyjO0kxSa%o)X)2aM5|Fv?*R@cc1leT87$Dey#du5ps@ZvxBZ zO*$sfTu6>*v4A~U^#x1lP2dbx+>;y>jt7&A91h<^$fUUyumerjBp(F$&I{;?6j*~1 zC1mvJpGJp=T4T^@4F+1@XSN(|iUBg@nQq7>}{?HadO5ig}Rc9OHLy-@b>O@}on@uMVCjCvFdp zIPVC3ckbRE8Ff1D+#Gc|rHPO`wM){pJi0l=yh(MUR}h`9?PeLb`nuNIqJQ(c$h1L{{e0YcKU6dVGJ&X-(c|nEfeG zJYjag#7<1=i>sSzx@xZ$R^QNE9W=G}lqBX2Y4Tc%E4yx$SKMk$EbXZnrhDo$jrPID z_A;wuY|LqFhJh5&;Dy?No4-WgEPwT91~e=dvu@>kzdLAQ%q-m#`5)hY=|kHi-1>pA zT8=K+-Z52w%O=S2JEZeE1SmGlv)B;!;7k>tTt!W=*@6c<^xasX?1H?v4E!m)mSS z-<~n%2GeTD%$q zX0%-6YvFnw-D5CzL~s3F*apEb5#rdPm+gT>4(}>SE<4kA{(819v33I&71_G)`qX`_ zW_bQs>Y19&cjIpi>@CP>KA3uJw0cMPj>LetXe*|fH7v`#bmOSWv^=T#g5%iP$9!^0 z{+WW=oI~`Wk(+efH5>bNHXUa$^|ht+-P8;)z5L+dtr3&q)*Zd|X1~sA?j5u0MW*uB z-5yj&$Jn@{BdFX2ztvuCyKnhWU!zWA z%31Q^doeq17)#DOh8e_KL(}@LTYj^LBLX44 zq)Nx_1A*+-%kc#X_j0O>i?`RryEa_9*|Y)iNLh0{fs4I)D8KYZ;r4Tht%ol)3>?~V zHLd=o+C&WoFI1hBbIT6)>vmu&b=QXByW?Yz>Ig)F7}X4t&e4M=e$qMSm>L;(V!*3w zW@r!-K@o+Yo^l{Zq1!d>o|&F>VN~(GF~`LHLFWY497U~pSR@=gU^{$S)FQs7G(Cfe zL}070W+Ydkbz?cBjXwWUf(FA{x^r?aUXE=S0a(PA$W)QzecTu9Rqg#&UK9rte%)F4 zPTe5l*{u;P4{T3RYRzLJ>5-epysZ<3Wz3bK3t9FyS(|6OUTMTIx}nyt+nt6i(RQUe zx0a3FsTJ?16}I&XFYy}l39roe%KCm?lC~4;rd&VYoOk0hBKZdeY7&tcx#|8ZY+GJG zU8TJ_T3xHQ(5#j1VYCjD#@fSnG8!%Ks?mEp%PZ^JZ`{MI7HNFmry{w>hd>f~jHJQ9 zCw?K@+0)ylF_;WSgt*kLf2{^`6U4s$0bM7J&T}*YXwK03qmN4HM+iaULdABqXzl7n zzZPStuV`x3ie#9<1Lc@C{z%a5LXPhM(`7PV3gi3kNLVNZQ+OXQ>+e6rn5QTAMniKq zd!f3$w=gRs?W(b)B&{fQxbjN&$@xQ)Gc@{&D>C9JwH_0++N>oscUI$ ztGQiR(NuNqQe#I~v-2i@7nAqfDmvT`^JC)!NkdDzK^P-1GP(dDDG3AIJe&_LG6A7p zR_3201w*=o&^Ysg(ZCtaq7MVffK*7IiBes^=Es-vf&HCmugGL)UqKDo;SY~&=%f2M zhJ<|4r8no^?sEr`%Lj7;j()Hp8y8{7E=bZFEQF1g^Md@?zDA4d0`I1+lj{aDS-)AfyejhENl zkY!uf*kjE(@R_ubfR|eYhdIYEXKX?m51tsquZijLr=0lZoWvib$_3&qcGTFcnzjgj zr|(mK$(RF~r7RQN+q}7c^d7R5jREC2oD+9PM(?(CE!f5Hv4pDUHjDr9MNsM^ca^ujFF!O&}QDrk5Qw}v5*NEMCX9&z8M zN=ypQMBb^#0OkLQ+_wc&Pvt;AQ_z*Y<6oQX?2v$OQh zfUOAz;t_JY<@*>r$;|jHqcUrCS%>Y1Y_f})^w}o+P{`90w)j|7kD;~^53nhQHyEFp znlZba!ocX1ELwmSJ&!GjM`Wv@U*_hlY$wO&jZV<55H5@?5$@Z9xw}BG>8&oR%CD_2 zuc~O%_i9TUuNrkdrBwyRMYXMUo~8SsR2r9MCn_C))yy)75s^pmo5%yc^@UR2VQKs5m$;vhX}$J<1CMsn9wLRz}}z zH0s?3+4wY)&7j8$kve^IW1E`9D(1oE5d|zdgc0z5GTXFu?s}?D!sf#^iOq%0Q}4m| zgQMikRDEDweO;ZmKDf^K>4G94+c)i&{7%eg$)40_8F;}8gN;@OUJ;Ol;1xZ}CZm;- zL@#NDLPQMS<=}{*QH8G!rvwAMz$%(77lIK!dvKqfxA3gbCfP#>qow6{?_#QiG84I} z37`fMd~Du6pPlOS+MRtWyG`n&?4CXkzU_U%^h3*Ipihg8>F@$*4!~d!D{>AT1z4IH z3mF}E+&XtKF7Bd~F!y{y!i5Xiqy+iAbis{pRl)^Nf{X*yd2fR1LPEgB#3U)@snnE< zDVHuJCL~`>my&}oCLUe0al^=Fc~kJZk2h`JyvetD?xroPfBMH&5hM|nzYP*F$!uI1 z=k>610wnvJ%waRsU=rr@4(z6DJa7#2a%aXDV(02gK7S@NH$M+L>CFqu&&$inp2}0@ zuu1P6USiNN+*6o(IMz?WfAp703rKLeae29I#lEHeDf51dS`DJes@FR&x>}Qa5oW1xSO6Wy=U-y(qgvu;k9ne^TL2s%<1xB z>Kz8E`h0<8$dv!5f2JPBuS%~>J21%xgTxTq@_44*Ak~F#znuTrxIx++yk+yIjq5k~ zHc}g;jq-*$n>Kv(-uew|rS+wW72H>_L5ep;fpqxy+ggxM}5BU3XIV_wVs$y@sI zK?K~)uCu>&8>kj{PUc1cyyZ%2uT+y)NGYroMIaA(Ae}Oubx<=|7H8wfE z2%Z9Cw%V{##Eir1^UtY5WLBA8hzWxp%;lV&-iFDM9!x{Rh}ZcS+joi%9)6el@TAUdhd^0w`}xokqOfqH*7{pzC2r!9<0{j!E$YGpE3F} z(9I+X1>((Q))!%^ap!t|-O3er3g*8XnY%ry<=)!-pKok^Y!zVAWlzQoleix(OuEN? zsCJ|X$CL^q?s&8qiwIZD?$)637HJpX>=HQ|ll#`PEszM)X*`2on<} zxq8)J^!1V{;&?1xAWIZ5wxXcZLqOhG*Gvu?yNyM0NZ!er(doySBj9{40=Eikc(j## z8W!B4aD+!=bPIaJaWQ6dVw?w=L=}kUl^C;eJ;r<>!ylPrf!Lt@tWS1V%e9vQJMiI! zQq1ll-R8up3Bo*QG6dE?uChnIRW&v;HtBTv?$jPWuJgJk?u`$5AT_)x5W&mOjwX8) z=6J^_#O)}Q$ivOMLOA*d`mtt?*ELHx+<8JcSz+lZKjB_ag|>B3O;t}`e!Xz_>W${| z&Z>sS2F(?w#&%Ie!!njM>cAXbc$m|82pPJLp&ckVxBSi7au}@|L}=9Q_1^BV_1*T3 zm|8|0lVc-;_eSpBx-&d<`?h}|jhn+f#ejiMU1<0|QuwoikVn?PT-doqMPfIENJR*!ry;|{z<$Mp0> z-@SVdnJyEjMn=ZQMrJU`11oxgvCfkTrw?n>;`o>Tt)=wB?WFASy_!b$`l+V6$TN2n zGdt2ghp|t6nnxJ}&O{Aj#C|7HM7O^JeacrL$rnsQ^D0txVDZRuQkeSbk=xJKR!g-Z zHMI@N#qyw%L>s*tpU=_^8hp3MgX!ucPKOI2EJz9?(ePg)i^t%j@YVI90fU$;I)4oISz6ba*5xbGUYmB|RpmGdVHy zN=NSH?fbH`ALBxSrqk2j$szNgk#+jO!o5!#B|jUqU?0aY*9lC)$2?AmZ5lJIl?Hd( z`xKeKi|S3}N#-iMG0_u~F%(-$Y#*i%qw`NHJD!rB?aQ5$8Pf`bKJE6-#SJr)XlOoR z1+(6vT+_&g=aPr}G)_{!N?cUj^5O;x9{A)?;E{!8>_Z)ckeq!hi2r_ z3s~|ughQ97MCM!jW*LB;e~1Cq=a^%HuOBAx0lp>#5^(Kg6!H2zPL!ipBJ-Zf(gHvBQY^D}tYxe1{!9{DKe(PG;F^2jAAG9m zgojBBE!wc=6VY^xc*RV12veDW^~p?j72pe|1``p>y0f*}$v0}Rj27f{U8}FJ%x}+W zDe9B&W} ziuyi_<$!)#oEh%N`ffdWWp)g&`y5XJfwRY)orekojGz>-k`-C40yPd;4TwZ35iDte zYO5?8fbw}2X@>`pv;sxr70Cp8c^X6XVceyOM8hzasvdgjR#lcf)ZqpfxSjwSFoQyQ zjG2M0t@Wu%bqBj%Eojp3Xo#PXr;cpBly~}g$=<@kbwvpmGOG3!T>rT8bC@AcrH?q3 zez#{v@!AwHNdV=iHNZNGMLHa)sIa1BR{jje!jKjIQsCo6-WQ^_{1}$-7wQ) zAFw3J#03(9U~JGg0aFeOOPs7(3rj%dLLb}&FZ9TZ;_2Ksk8Q>*QKv73+r0}Q$EVd z=UFKQUHLoifv(2J`f)GCuE$Bf>;7Q0UKaJr2ohdZqzDejPI(8=? zTlw!%LP>zsHTDRR56}@>+XqAv;Qc6(Z(=!}_L>`qqHFHNmz<0*Og@`_X+Rz-9l}a| zile|?FxO*Q{YMF%3#+NkL@G0ono3#m$kd7q%+kCc^_wV+-OJQ}KCS;{$O_ltGc->_ zqyauG^dY~ACF(rlpzZbqR>Hp9KQZ2Sa{#O8We;jm@u1w^-m9{xf%PTu`xD`kHnlBY z?lq*G?#Ozztn+5PZY({bEV=V+Jn4am_VOom+2ytOlN)XxXFt(fN<}?QeUbVh^l@`N%%ZMNy$-8>Lio4Nis2kpd-Cs<0Yp zrWiRx1uT&xr>TG#Ic$tv;vqjHBr0IB9ER^OxxlU5eatyvB<%kD&!<~yvl;!Z-RAA@`c|l;9D2Mapm2OHN!Nmo# z8sBO;^wV2p@}R`qnDSD=i2pwm%iGkcr2tDJl^&Bh)xYNME!>P9#s4Bd7>$p}1B#AOgbGgyMY^jwgm9t#ObV zkHD=@ky|5VQ5*@Q0&2($->kt4<(Tj=JSTKyWJ!49gBQwSp*3h;9<|< z#zYySUMxqVxWdEnH_EL5Wd$nmDF6F#6s1t}v|ph9_tnTgD(J!MB4p4=WCm%1N?&AP zL^!!8ND-2k6f*w6q1n6eE?*?Icvh?CEEaJ$x#TOL5vonde1y5ghnb^7VXr|lN(aS1 z0ySI^rf^P$Ld@`T6gd&rVjyU8CXzgIaVToy66iu?;s{FnllMWhV)F>*fCf}hkI0*5Fqs;uJi`OlJ#KI$$k{gMPfetPn5f_K5M?z6$!=Y2E5fqmq zf|p4dpbp6~kG>Cc=jGs<2k(Pk`s*R?3dPjEpn^~kggv2J_E0YsVCh|=n9!DyMBKFm zDn7D=7>}^WwHnA9O0Sv*O8=fJg5ky-brXW=BVYw zNVUAAf||Q{WF#hXWMuIS4hM(A7K}ueQ^8@dBVzb8Mr2a~fBAEq`pcjHk31oSdKO0d zdFm~g=^s)5gby*;KcZfw6-(@a79rjgDJmv+ih{jG<&|ovh-pd{83BofM=qvdPiIfn zI7xBeBPKB1;lJ8{2=m1ueqy*#p~Hi44>2WyFo%nMR4|1->{&RfdE~ssVGuhE3$gig zQ2a2%Fl#VjHLzD`Hp6ka2DhW|5p7d616rVhr30zo!eLoWY9nkG%!M2gzSwVVYAB*+ zk&9vQB5*g#ch&|4`^^^Kj^-pVMwSy{9`LeoQdfwjBy}J~by~CBnc;IBDkDB+%y*L<1tiwb1dZ{mjji^Opj~?7i%=2enjQWRz#6Ep` zGeq{S@KD?f>A`{%x)n1r5&@f|FdYuI{e(lR5&p_Mdp{A`Gm*p;h3Y1S*q@)WA?5iX4g^^q+mYaQ^@4_CMfx3#l(tU#GrF zy-w|8=<{6*@ z(Ii3F2+*0LRO%5JF_fs2YEi17`=Kj?P}C#DyrKMXX@UBoOHn01z4Q*Lt6qu}q@q_Lwz!HH(Xcu9UunQG|US;|9NEjFe1mKqN&|tPN=T42rgCJ# zyjh%q-zZ}d_6|@CDhMiJi9%(7Cln48EgTP2G)tmFYUIUu0j!~qdQn!ZK_fU;uJBt( zVo-rb6hj7M=_e9S^osSBUMR^1eu?Fj}tNgdaW+@L^fLA_D)~f^%grdR0D`P%^ zUVn+M#204;_W-=X1wl;!YQx2V6^I150@u!hwZBARI22HUbf3UI1=-7x-Lu5EK?$HLEs+aC z!$yd6Bfnk%`1nBoBEpIOK}`}LTmq#e0FV&*Npm8~5de*g$(4(N2ImmPrXt`|1p=1> z;XO^7-oHd7D%tE+4=`dFY3kwX%>nj+AkeOoOH^uDmoE@^hlmYgR4}DdkKxP2kW1#N zfr*5s2=m5J;IgZi?p_2*b4)U{LY1V0#s-2ji>?g$G8#z~Qp6 zX(|Y}lD#U-Z`yDI_8d?W?H(Q%PLT(qgnB60yjdK{ks_~C4$Wdn)_>$LHERCGvxhp0 z`~Lge|1aJEZG7_Yi3FZV;E4pDNZ^SCo=D({1fEFXf0_i~r$71kL;_DF@I(SnB=AH6 zPbBa}0#79HL;_DF@I(SnB=AH6PbBa}0#79HL;_DF@I(SnB=AH6PbBa}0#79HL;_DF z@I(SnB=GqXP*EXIKL1S#*t7U{yPd&5YJO5sKd(VER~=fNvAGSm#H+&Cu*Y-F~ppqu24mos&o;bIO+)IDqY5v zXQ)%uZK@EzC#e)Fnaad>3a%=rhN=715OtUGQd874<)ZFTR(u+$YO02+q#CJcs*JjX zYcJ#KA}Srzpt3O?>Li|!hG!;Fxl}E6jT%-xt(vczhwWK>=Ba|I5vrR~Q=K?lOLc(q zXzCa~F|#xu!%+AH>JTA6^aw_?sO`jD!{wSs8akY#o1EO zex8cQ=M0ska8reQuYvAr@LYpmm6(xl#+g%pMHc9HV$IvBnNi1#bHX`=#k26^p36Ns zj`b;=bFqrGEDX7)u_nWG0GV>{44lL&)?=*2ewG~lGe6*T2? zIh|uJm2(oyV3XaLOUBt102XeY+8tAFp-?W!s(41jf@Nu zJ>SF{dl{qK6MQ(+p#v$Cv;EZ5d}&$gRXs zhH)m)Vm6w`8QC<(1Y)IVi<@!d7=AghLyiOo6NDxA$<@j&Dg!Q_YbN=ejF?M7FS0Ni zBW*-dBO^l_kp>AlA{evY#7XqiW*YgN%x31@zxm@ImMn4qHuw*JT=M$w#9&-y)*Hvn z$Q@3Pn^k(_ggKBl>r4)F5E88DX#B|-^b9#=m^ROtk*SAvkW0u-K{^v-rk&;>Mvs?a zk2`6c4x!Dxc$sNb{+h^{uGDn%VqLvx22G-wVOg8C`I^96kpF-$?_x|A&09-XNz2_U z+DZjkja6D@1fyzBiV%7HS!fhqT4(^ILd+yx9ihYTH zIxo98jPmWb{7t1=94oaZ@0z*V8km8T_SO zW+24q$WP^Ba@(BVSrYbSt&cjJdGe2&($@SwZfHkk>yd(w4<6r|xcO@Q2k)gAc2`=9cVTfkPvDHe;ILw z-Z)MNkOG>$nA|o81*1qIHu7ZTiMZ7(cElWCUp8>|XzHoG`!6OPJh-oP?a)nBXWuGW|8Eym&&O;K-8PuGoRJ+cXv)pgb)bC>p; zOP9a@0SaPS@CWZN|MRyE!Ce3491C~~(3#8=U>Q3H*ravj4HzbG8^925bPn3*OXlHdcOyoJh&q*^?Ov}Xc{6p&>G`ACe&A%>hA0y3P@G-Les zuh*^q_+$K+R?k_rdiDBWeuoZb>}d*7fxWN+4!pScQ>r9r0ABasrfLq79qEzJW`+(y z?LxjIliuh-sv|EQES&iAx4!kZ=Nt03g2TS^_g_7454QBB=Mw2Cgn-9hzm_=Y|F={G z5E@QUXhllNb(%`(CVpM)XUVcVKT=1`wFZD3Y7#nC}EEWeFfMjl7d@~j|mUvg0 z*$FO?wV2p(E{HMXVGd3<%dDGo<1p+L{=`L$gPVh8-)X!Ymz$9I&WYmz_09iA=Gd^!hNMgp!T-8_&~75M z(H3$~AcseLSu9xWMuI@AMYK7sfygUpnXt+>8Q@ zw~;@P@5n)pSwxq00oFW5QW@y4pDvjmXBRViy02`{(T=_WuJ6|M`r)#pntomwwr1+J z(IC~z{5C3he9LkhXI2EpS|(VPA}>+jI@1)`SkutxY?2!T8mb#-ny5w}eg`+z)iyOX zI-2BKRa2w8X{Je4S3lOIs;$SN#-OGexTtD$1*FlwY5&m{(p_hfM99g_J84n417~G-pq|%17>a zFXh5-4`mHRZ&|x{W66O(9qyvH=l^i|FJq=$Ay_7N^Kvsw)J>sIWwJmo#I{Oq#wJ@; zqSavwwA!pzw+)$~kO)%j?{iq)qKrJ{5-vc|<0DyBHmetheB>UR)q~v}<%}JNC|v1- zR`~Zg?Xx{=#iOkFvSaOTe&D8Hov}S-7sc8e;w%e6W*S=Tgl-~T-q{Q3N4M`tjQmYx z#?YDFYjO|AZ29fZF0nlA?|%N{BoFcv2hSY%4Pyn*3J)Pf!Yot9@Kabwe-xXWoy&>H z=PB5%PAs+U=Dd6W$BTr65QR<=$(cN0K(+-#6-7S_!Q_bLv?rV|Z?-m+6|`Nu8jm~{ zY@g6I)b;Bm_gshT=zAKh`#sCST*86SeN}KN45%zfxbzfw671H_jN`|mq-YA86h%c( zMa?}L6%`$IyTv+Wvm@OYV`KYz-btP}b?A3U-^d|Txki#fQ(dSK=V0d| z%Y+5i1|)`9kjbpz!>t>)Oz(Pn=dPW*cJ1D?XD>cGcS?JLcO&8Hu3hrZKG2*_}jn9JLg5NDinE!6IqK3?`$tc%0I=1(PkF*D40VI zP>%6gUM7^nkRUZL5hBCk1EXo}`t7{`cu&Xo(ntjQfRhlyiKVSTun%Et!N}T@57`HJv%zQt7BnK2H-H}S^3wp3dWN?m4=PDxCL@g*Sua=cA%Td8mjor3 zi09MeDk+1Eaux;z!hp~WC!pEKTJVC|+}}EHD}Bo@4BWceH{cu$wDt`SI0gd-to_np zpr%;lkXC|Iv7C#4TkPFpzR=T-44j%CYqxG-AnAbV53E{oT)hzdCx$FIT+3FK6kxjoU7)jQn`T?jUVkk%C` zX^^jMYaEg?Ayp4Ybh^=Y$_xu7&xZh!W)qbl{GOfO?+*o zUTD-4Wneg+!K8XE&`injch@%8H8$RF2y1L9Khd-`VdH^w1xZP%+mCm2MDNvn5Vg|X)fTq;(l`a%Gs3JC~Q1#jwT zY;L$;8&=oQ(A?P4T;JH#Kw8#@rsgBtTaIoyopboag_8%P;?JH>Ie0Yl(2<11Ey+i|jVr zZ|UKbr1c-4`+Zc@#uS>iY64!SC<_P+4hY`dT2otppCo>0@YerLLw$X1b0X@bRjK{pYT1 z{Z>sZp!mKe#i0uYt98Qj3gKkZNOVZT;N_NBzqUwT&t3 zPsg5wWsi=EK6*6fSk%$zw z3J%=TiL$w0H&H*gwXwG3=(>;Ade(%jUbS}Jn$>I9ua(vWul;zw?!~UHA1^n%=wKvrbv1URvk*^f)=@Tj#&nyH2$pmn~ek7LVGt=X|%7rjeBG^9V=v z)L8@rEt-vRX)G2v;ARtVK^|3$RcnTkw!r%V%(dvd0{KmHsbt1AdU=e8GkcVogY@pyTEJm0C(Gyy4HX9g{#gj9dShe0_LV&;o=Ms$% zt@=l5CLka%Aix(m4?C4AK!pgJq$0jJV|KNMymww>;zV8RB@Bcvhe!vgD{{zoIy!eCffBy&H z|L*s```z!6?fc((>!7Zyy=A(YYH>9CTBe!+CRPhjkmrr z_IAKq-}r{_ZTXw>+dS>#Z|g@6NxlKVQL+O9+a+7D9U144PaQxPY1M6mrM)0m=7LDxOyqij&*bGj zXtVJuR{Y1SrTrX_ z@F2s~=h=9V<*R+Ehhr}mwrBNr9642ch0QFlFEkZZX|o%(mwNK53aTN+TJw-)4kH$8 zAj=tx%#1y>%~%3~7)V~SPe}E9c`6g!Jem1&fB8oT<8E0DsesO1F$I0Rj^|A_uHGPs zm)k6CUw80Z5i39ZaK+e%Gb>*BaK(z1A8q{GxIQzZClQdQf<7znv%JpO)7PJlKYo5q z^y##H8zL`WuGzHq^4_enZCB5yAJ|#CH4~|b{}Po`1ie2(Ae?5%5{@Ws9wo z_s8mkyVG}N4`-~q5x=W&WBla}2j0!Ja{WE3zk6R=8n|rfvZcOd-lftqc`1dE-2b&4 z2bQl`^S2jnf_FX-|x zabM<{-*)qyt&@7|?s92`v|L`{TmI~dHE+Kc8*?}Tp#!!l4+h)IepP5~wRbksNnM?1 z>&vsaOJ()xy_YIG6I%2MUA3CT8aR7(mYZy_wM2`%2nHT|YST?kjsPxih%Rc`4X)9c04sS2+{V$NF=n4s1z%*D} zn+1D2uQ&A?kOo(@(Y?ej}t5NiwcX13Jb@Ie1&t03X07CCGja*H_mZ9)gY51j_wjkIv#i|(8RHedxLSYVyfVBOA20e-9 zE@n(XBNk-s)R`HrfKDDW4Ul4BO$L_MbMRVCreKu2U}k5KW_?BofIsOKUgd192XnG= z-~Ylh3*UVA7r*%VkD@j09qk<*UBDQh$nhz`YJ~^|vU6C25%)kP@mf73>L-d$D=|_s zC`PQpV(3lN2erJDT-UQtjKLg46m0bxd(HUJSA(V?J6SPgK6c#Xh&+8;3{ zfEgnVkJktVMo$fV0>o7TzX-5EK~xvq9?E$Aoh3{D9T~me{YkX0yQ{OatD_ZHqyCIR zNvGH#;aYlDrj!+&nU#f9bzb!ExwGVqxuv`%Hv`AyEGpZV6^K(fH$NNu?2Ixba<`%h z4+PjW_;80eD+rfnXS%W$Uap2Hlonm7s9tCckcAcA+@oMoPuL7F>-3X!h#6Q&-xJH* zBreb*qG`8MX4(2pR6V}87X3@Kc~3*X*={ipT#l=Qh2;eMjokj~OzX{MKUlwPMMT7h zD_8#hq_Nkho~vy!5c>{oCCoj|Uu#2wb#|cGkor>U2qXzGy&ZCUNM|N%yxP;<-6i$N z-EZ^&Sao;xboUU1)urz4&a`ODu2)o+U+ds`%{6sTPq&&}+#_`_>Ovm}F6zeB-EH}{ z_A-Pb%dcs94=VgzLwWi2@+$LV$oLaxo%C}kFq1m++`h83y-l%kSB_uYS^DkdQ-x6( z2TuI9BRWUS{rB8cT^Z-w4y}%i$jLoecJ5gAsl>v(es;}|SAPIp0x+`VxKZm<2Wgs( z00*kT1Y8CAN!ZBhWC)!XLHr8$v#D3&&webaF zQF8f(vrU}c5cyAKa7S-0lW ziEZiI&PMz?s=MG{&o*t@|JGN+S1l!6t^k(?O^>9WqiyL%3VH*HSGw5eYnY}zx(l&- zPM=cQt}z<)4MvN{EHiWSErxpTe0wkZFYrtnN}bgob!6kfJOWET7(+iuN4Y5q9Ljy8Nw6*KW&Llb~%r zx^aKbM<-7n+Ouu<#(}4=zgK;*bhbnlUgv6BdKnX~0V02jv!dZ8 ztsDna_!3vkUSDBCqWz&pN+n>y@;^Et#zmO{Z^^?oG`tJ$B;K)dQv? zTMm$b(cDptERuNTJd03WdwbwcX~Uz%{3!3Jxkh7Cqo%b!LtlEeOS9#o?%UN@Tf1wr z8!9wKHD;!zy+q$sVk|9d%&e;}X|2fb*3@=z?CsS*{`mdbay~({d5)$H+HC2a06@!+ zz1(U?uo(eoiF>}rWREG0zffL#E-N8^-KB%2`|<_%1HR8ECI6x){yGyXfbM#nKr_Ysv~VykY(d`V~dNgoXp2xnM@; zy-}pCtjUI85zX2W9E7JwGZy>DZ>?SV(dyM7ty=Y`Q>I?8Cb-3j5(e9g`NofHi;7R5 zPv}l8hAUQM=97BPoifr1`;y|07iC{LR{DVLdLb^Z_7@51xjCClvre8Xk2~Cu5vA6p z^c>C+^MxyhK18Og&jU~ zs5TpXH`#gK%AjY1fHz54M6)o8$kfeRO+|g_It+v`)j-WjX~Ut@Yc(1J0N`u|_s2pJ zXjXclbp~`#2bs*+Ptrbg$Qs7zuW1o2$8ZgV-b^&Y8;wyhNA@886ty{l?$v0u>Rtrh zSw<%~xWznuM3LA(u5(qxPe(Rl;Zl zgi0jiT-szH3AzoE@wqIvKJIM%x%jy2BB!m!c?0b;sthKdQ8r;G8AB0}*W~qGjg3Ex zs~SZ#gd`j-bAiNTme@IfQN*z!Z8Bo2N_@m38^;lENZ)!B=uB5zr$LTluzgc61mJSj<|@|r*B(ZXGiB) zM^JZXXHSRJrBZiG9lq`tw6WV_+IzaXTRWR;;tDm*n$DJ?`P^)4X?m#f7;1^M|VTo~i} zvN5UYa9(t5MS?#5-kFT^>(b*^?`3)T5sNtWme^gX%k(P2DPM@yGh zP`{vy+I8Ss-!TOW~Cr%s;-L^TZ{Gc&r=aGi}+fJW8 z9%X`9Ugo(yvAJ<&skv)Y**!6drCax&zq~We%HiB1UUTYHY{G@|Gl$Ffow=BFASJOP zA#-b!@G$A{MQArhCy;(Gh7u-_#@cKV+`N~YLqcfK{|WA^&=BrcN=?t!eS2=KJkVx8 z`oV`Wt!Gai%UGLd)pT2o+NP#XEw6sQtESV?)~?ocH+FY)X&ZZcG-{2vCs?hk>(F*R z+tS{pZO|g!x!KffF`0DmH(o?ET@5#u)v%ntgB36mh3TacuZ5Xn7IG#X-@~wGy_sbg zR^xd@S4hms#|BwAlcvY54$yRVjjIDS9bFoa+S4QT1gP6P$9lfnsnHsW8k&>SQ#($_ zb!yKZDmu3(=S=ZVjHyxU2$t&Z&}yt|S%X0?NX4#|G;_5Ytp?a$EolM?rkB)IucVoe z7D3(42%;I`L5ZVy7koGm`#jQjLw8|JSrQ(A!0>Ylr)CgkT8QJs5|Q8}`F@ywiJead z%#q%{PBfc7^E`k12@enbrZZ+4ha}j24}FJz4W64BJyEV+JeXrV zh3o3*6~MP!L#d^1xrb6uYJi_wVZls#Xyv2PqK6|zGCF5y8UbC}+}<}cJ>#2JArs$} zOm@-~(r-@rrae>AG#P9vO$ARQ`SCPB*THj97Jfryy9k3Jm3)sN$6v^G* zt4G|+?5B-H_R;@uk_~UsCcU<&eqeI)-uc)<=ftqH-g^I*v&T^8c8(4^$A_Jxx7%;s zA9iWAt_g?3>-0G($0#$bM(wlW2p21-d9W{zVAoH#KvbL^NIWHB?N9gbOG;nDZJM^55&P1n1-`~74|M>>-H zKQI3Ad2|MghOdNM#865a?|NWH@i5kL3BPN|=@>k6u9#JxT)DBSaX+`DJ121ENcx3} zJ>1H}Nz!9UEl1KElM|BxN6^8T9CJiWI{Z!$BsxQrx4SOxd_Q9dfq&!?VQOIa9LFBJ zKxZ`5^APeG(07p7c8DWSHKJsFvKX72u~obJNF<@6ju<^^r8Bzqu#D62u}bxdBD zkTL0X#L_M3a8i!jCLQi8dq04f7|Dp>DJajg%H$OO9wUb$Vw7*oFD@Z!k)RP^Y(b;3p+tANLQfaYm zrhMc2U!|PcpPRZNJ!5-jAH0kjZ9_?EReLwHyLw7NpWAyztr^`9zGdDtanc0GK47SQ`7D8gLy57wX z8%*qEW505_JMms4WNT~Kwx6dE$`N@KDP>Yq_kg&%&ma{^HHdO4B=d`oepEha zHcJrVHNZpp6(MJ#r}+b27d=jg!x?fRs~wA6&>8D+dC4K=@;fPKgbQ;y(&2PXIOpQg z=`@^0%nR`?iXMOC*a~0~8Psre!4H^Cov1H-VL?JGKct(}*f427<5unr=OeW}+ z^Nsu?30k8Fda{PB+&76ehaP}vyCK)usCSGp8W{79Q)8j=(5Mfje}U29XlP`dzTY-H zGCDD#fjkEIE~i^+0`nFLno!{ldavR8Fs%(*W}hnTKPGegY@^*(Z)&^3HmU<0spqOe%fLAeN>c2aj6 zdd;98sKS?Es$Z9jcyMEh8wT+JKfXvAex!%V35x-mjLD|bBlQAG4KYf!8l%k=Qq8q9 zYZO?3;CMstN#IN;!GQBKhMIN`e772fh}UHu8y%sBgCn7<T!{Z|n zfp-`n58946UD2$#Y@=a5>ITq#7>p`~ zTrAfs;SfZUm)Qh|s-8m76srt0KPcj)bzt=)7f45T527cK6j&IuJ+{%&5#Mm=O2qKh zNjy1+L&H&5hp${6AC9^L>g>tkd3d^VRelD06GoTrG8Q-Ds)Irdg$uz15_TY+L?R*c zkVT}^a0f_cL0>OR!43^9VDtE}965X*i^*bh1th9NL5qPfa8S^xY$$pN%VHhDz`?+Z z7#J(ebgUk%;?1RZO2}SUB9$&~|4)8=GE}O$)bA$teAi@)rk#3@LbOdRl z+sG_1s3f8u>&V!p{s9F2Bl?-+ypg71Nl__Kp{Hm;s68S1%X(uhBr~u@lAsuLAyDqTcy@^+At&@x$mtXRfG?IyxE!Ha3`0~T!6SbMVwq58P^zUW312Bys70z+#Hn;V zp_Gy^AZZYiGSH&oD4){Z7&v&F1PtCVh7in*P;K3k>nJ>g$;vCDUqqfa8ttntx-#r zDv3}c)yiU^dNA4IpfpM%5TS`Z;uweo=Z#MsE0K!HF@<*ji9{rni~2YUxkMrm%GL6L zKB0(%bU2ybj66rINHawy`YPhf(-ND-ATEybxm`Y=D-v6XADbCAH8)YPDOZFi5D$W7 z>?AH1*t|n{)9;EQ+NuXCBZFwLZga!*Rb4^jJM{OO1Z5R)iIkN|;xmMl zIE44^k%;kH&Xrh&Y`u)5V)La!5f5FXHVuJ~-i$=9nLYCqno@s#Sc!2JF1K;iX>|Al zZcosA@$!{m5FF)xr^n;!N)?x5Eb47kuvv)wM^SpzapG5&_3apJ-#xJZ5pWiz}M3+o#zGtx71k?se7kk%}# zt*_3`%FGb!HAFg{c^=~EHmoiE0+9@JoD#kyl1PLsHXCh&VJH%bc_Nuy$P-~^x6~)=}BW;>-2F9 zQ}m&C7xU`Y34PC`z4P*sCMm!1lCe(c8MG^{`i{hk(=1o8yk?<9wRyZdDd=X)T7>?Q zgHj1S%Xr+-+5Vb>;#{5Yrlz>6|AA`P`OK=5M?TL= z-c7a{XfR5dB&WEzM1>7!j@B?FR7*?q3i3!(gp3i&Kg|1OGPA0)JhQluFJy6f6zdNI z{cL7YW@aOc$KmifEUrQ-hHr_-V)Hp{E~}5phZWT-<#GnNT(&?k(9b#B!OZLF@8xlL zEQEq(*2(cPs9i${7hG!y{4aF~6%7(0z3hs8Xa{FWRZ%hPxV$G(Ca-EQuh6A7Up(!< zayqThSW$hJQ^yZg@E1;5a|&z9{O*cOQ}#JuS#x)PVy;*fELHjH>!iJjR|BP&+foIM zGXG8OFs%QPLAlFzy71Jtr0V45D(oc|Q%hfaQ*l{-4t5gS{lI6oG}h+k<%`LnK<4z` zcRs6bEh=36*L5NU#^s2O8{mBIeeaDGT%}x!*9z&GR+;!rnN&fhg+eCRqABF;N{Lb| zht(-TX7eQ;i>Jh5C>1FX{uk*c#zq{Ij&su+B{~F_DDsL!nprXdx5IpO)FAQ&UH5fz zT6?cHmgxG5WZext?WS%{>S>>+zOC;a`%KA-Ef+<)0^z^u<-A?L%XwdIFkk_~8SoVqiyJgU5&DOp% zhe1u80@{?GSX``NuL7W2f0EcHO$i~s(Y z1~$8w$?of8b#?HWRb5QDy8HXsy?sLdna;kVQa17>Su9aU4@=jdU(+-o?CV3SD2FBD zimr}8Q5hd1?QtWEIi$D^)o$0@gOsvTQ?op7ufyY;gt0+Q-QjMn=6IZ76{j5tm}gV& zd3f-`nc&7Fb_{Cj`>;wTy)F+76OXG$?Sn}?MLzFzeNBUm>wjQW8IjuqwTSqqkf;Y& zvmm3WxD?3%7_PcmcCB8LS6W;oF=Kpa^=8XEQi)tAXl`$3@emRh%ijLp%C@ZL-o~^2 zd@)}rhO)}r0B3>@$adndP;(=PG0XvOAAm*@y%%RIy zp{5OzjT8m^iS$qTrDrJ3ibw*eb|g>bl+S z^7`;@z&{oAyM0dVMKH^-eTLx5_`0D%l1wQ0BB7Jgi6tl!vVK?IeP2hxj^|N~;o5IYt4my0nUe?E|eM67q!DUZIU*H-)AO#Yun%9&#$Mpo-+u z)_Sf&B<*bE^06ID(MDBg`i00``AV*YBBY+#2>$+B?s!K@p2~N5gQT`{#AnFg!|JMJ zS+kA(gFWm*ZF|KAXf*v%=I`Usc693IP+>KIbm3mhzgZTxkXh)#b&$Y{TNEM0RfG^fAaBH@ zkJvJ^TqS`m_?0m@VM?BLeg0rg;l9RVz3FW;z&d%{MY(q z3_t=;(S_7xMX?NzkPCq-8NeP9^tzmWuRjP|BS_)d?+$r9LBBWX3s4?E_g)L-r9#6s z&BMW3b`CQ%7kk%$oj8x7~CmNL`Un@woq%_0EfeE zYi~oLW_(*yE051)_VPVElD8iuvX{_!10nStsD;-~Zwo|rDAjJt`8}-r#LpJ~!!d9k zh=-pd=91Ipie5rc41#&V2k`mV*BZAM}&wCiXl<7P?}%c8R%fN zk9T~pJ)a}ZtMBS)@92Q^?Y;f|J-t1oS~jYuiYS}(jy4@rSIyBQOeUa}Kam&4UD!@)(MgAe*)@f4xJ67N$qj899w1nv z(@u>4fg~3F(*}j6)G|Ig;%qCnwe%k8I&w^Pvb_FibG~~7Z}xWC%7#X-j<`Bg+Rt=1 zRjfHvb@+H{%c0Fvqaz~@PXEnf%rNf%M-5^_gFLO~X^Rx+hwPWj8YY!pyY`<_p5@aQMh`|sdJ0= zaGK5{aztDrH+qH^M8%h8vk{5Za1!_Bocv;MRzdOJtdqOTvn|Ms)z_WT=1H__wXP-M zc**X~g_~2-T1tx!q$i@zNMma4qlXB;0wy@AG7WtTLExMDJ3*}aXAE#3WiS=cmK6MU zxugf)3I&TL?S*|RmPu9Bb-Gl(9M-3#r&~S1kuqVCL%oplr6ktX*h}{ew*r>`w~{01 zivJohEXXZZs*aU4QuQ$nO-&7rEy0Ed8}Za|w!WdRzUesAaHy)Wv7zB?b5ngwQ&UTQ zLt|3|xivI4Hm7o7N+J3s_?A-4BWsvj-Sl^@;Xtw-aVA3@)nO-^WopmNA^9@7Io`ae zd^`v8;?t{*iiRBI(olJG^V3h|<)oa>!mGUeKwe}{4R(!L2A#RT3U2AJa}w1GVLN%Tw+snrI0360e@0`FJ`)26;ozWk z1c}l<6wp%u2Z(}Uj@0jvdA8NAP1@PX>g&Bov_SbBC}p%oh^_9Ht#O-YxP9%RlSd9D zBqSy#B_$?~B{32wll-`c5}CdM5( z{^eV5z5VXn<8M)Kd*7P(_FHeh`PRE{zWvTyZ@l@|+djNG>&=H^=iPDpf(3=sy6FtN zoorEL%plY>eMEXJ=$h{yJdto<+sZH2ZrHSG^QH}xo1!;w+O&S-#HOf?8#Zm6+!WgA z*%aIq+8n!O&FU>{zSu-<`N5a#w`|_HW!r`?)@)s~;>)d{Z`ihJ^X3if*KgeLT{a^k zDuQA}WPLjczC-2|x~HxEOi^M=YGzJ$PIksvPDEz*L{3Cj=6FshD{4yTLD-6)WC&NTMtj92x=qb8X!>-Xek0#r34z4 zLg~>`+6Of%y*+d1icM)Jm#r^2@kZ;?&v&0TnoHiUOn<-Pz-McBY_8pHR2gKyoW)?o z_#&<{P*sX5-I&Pum{CS3GKvvFH`BKhX#Ui|`C)4}S0F<&3_=NjkWrDx5b%&l)~QEL zsUK9ywdUg7&vMe%f00;OR+N&tt$L$GFIXzdJGJ$*vMtqFE0G+kll~G-6yZZ5=_oBy zY(#A2ygAX4RCGjCG!+$y4n>8c8Ic%Vnc+$IZ5r&`$hT0XKozH)R53`j3LtwK1qLaK zIkiZYmCJP!wN|82D)r*~s>`{|wE{lVRLegFHeyW_uq_g#12^}RcbLX>76l6f^U5wFuSJPI@6 zR^r7&yb)WUKrE-Ufc2vB&;V{Wp$RF*ac5|~8cOqHn3FmpZ#cDAgX}Mr8UpI&NGMQi zgPPffuFSmrs)B^1q+?Vvbv$$|I{A27N^5aR}51OYAr))9b;$c9O(up9;;lwc#n8w|s* zuni->*@*BiLWV{Q_9ng3rqQD^+oD!l3CahwGch^NggN7&?@LQYDga7|^4@No{^aJ6OG8mzJcC+0E?ELDY$v?Iydy0x%IS z(~efR*{xRlk%2+Ye=J+Rbh+=NdCQkATlvmYDDX0v&<#j#Rp1|l@ueo{@jwR$!ZF!f zDIH&F*sqmQrJk1YVS{*sp}%}*`R4Zg?Q7SxZ)>piuTMO6H2>gf_Kq_J3Hf!$3Jdo1 zBqMF-85G}om(BZV>5`A%`RzH_9%d9Ze?`Q9w)06lGL#cHnvu><4oI9AH>pdQxoA4ide^u&c0@$-cWGKx^%6hiQ8L=J`U+_?rO-WhW(DdR+%5s zSq~)dJ5imsCu94^TaP90D8AVE+3_#gyAO12Kbf46*tvS&{)P?5t+IWeJh61ylI39; zSG@CUK2LJG%tAM$YKDx6zuz1i{5lcC^Zv#J!gcCyZbT%6P7C<3-fU_R1OK5zBF82L>)%fn9XEFU8zAY<^j*gY}1)FfI`wi zX}23tLt)fE_3EnSo)w|xvp;#^8LM%q3duKQFwShl@L;6-dD>j~hmAPh&tDyibT^Ys zyIDvOM7AG_I8Z!%FJKRV7G%*PArLDn@^X-R1WW@gt4706!jB(&{Bi2Bz~i&=d~e>M z$#^W=a zf550DwQo>46dtuNTmv_$zFQ{+peTIjM8%-XgA9W<)WTY<6pieFC9~o4yMDXugT=lj zvlcHujXWeZP!Y!no+a(@Bd+i{&f)Q1+5LZp9V)VWDKlaLt)botz{Ljz%-P7MY z1nfvSRn;i`iATl=G$|TM1e(UoIMuB*?3*>UYYOcQ{K&9YOJt;LiXJo%X$ut=Y=An{ zi)pP^t&R8rOwD3!AE-#Pno$5`Pk8k6)vH&n^sJiw`K!;Fv}imUp_0f)%CSf+;h&U` zR5wAv16Jd8gv*;G^r;z2O1;q7e!TK2&up3{+C-PxbbPH*XM>1@cY zP%9O-L;tyoMtNB3TQ+<7o4*@Ea78OqV)Xof5%dxCsdjL0^5^@{e7 zU%fW@qjwJ+{(SofYxb{Qf8g_D2wvL~e!X%Tum%`Q{mbSoS@yG8&5XUm$7N zhPicvK1wRI2M-=uzjyDu?`|zEeRECs(4NCzBo)4wkh&#t+k2V&SG-lTW2r!?uqXU_ z6~G#(CH|#z7B74K$%@kI&2?IWP5MuW3EOYl)S@)dfy2n6Go+jex9U}gP*(PUZO__{ z{>szMjYq}R1#0`o9qrxfoOWJsJ1>jb+gvNiu0kD}{m`#hECsqp#FE9-k~xc)EdJ=P z&)Urw3Tku|fjlMk3~H6ie;vE_TMyNLByco|5lqi_g%SrL<%1|Ds^pmgJO~sj0Kuuv z)naTnNP{$MQIv`NQnlF#BmmpNN51%!`Xu7hPkgKAeg5*(CXFqx7Nv}sYe6h^STF+r zdUPK3F^#r>;45FkmH?LZ;a`}o?D_5>sxoQQq za#p%oXY2j(t_xN>_5pje4LCrgVXv*Jx{wN*aM=AedQ10PScw}M>=#I|&*}ivF-ej* zfo81(V%-F45>zUW&PSe6zZe5cSEp1{x=1APPT@_IMq>M%4<91l0C3gNxpU^hbJWo7 z=LUy{;9WOZWodV=%uGv9O%0~Sq^IVvt-wo+CDpxj4I#0E$d>-i&PrOy%h=MzQhG~= z9Ym7Wh>jFRjEYIJkxy^vDvcL5TpY3TB9`~%^zOX2OzOY zlU-@B4>8;MR&I@{7X}@m1Z+H>-HeZ%+xy`9mtX(lQ=l$Wt3s<|KK<<9|8fpj1Wi7y zl@Kj?rqyP+Da=H)rI|{+3fdAhWSDFkH3DI1R40tcKTS5bP^pu`om~YI*wQ{vzSj zdkLG?oY=W#_b2JFWH0P^=CkKtTlEp(rhw~&$Ca=CLBZomk%)3#RlnJs_^L=ZH59SM zG5Fv~n3jpuE7CGeH`ciR*TA>2e$jI#?clPtTPrT7?aV*A@w1~xO4lbBB%as+{G9XK zp8k}Gv~<}=AB9DF?Kfrl#k-j#iR^~;Fe4cCjUv%HF6p7K?LBm1NVU*p>)4#svi)#Y zLDyhiQDb%Ym-V&HO<8*@4jscFIluLp&t7;1`^{qPIJYlevh?FWFS=^GlG#iOkRTA9 z@jP=Z{X=5`GbcRs72$TeY3S2sp2*Ig&_AqD8)1Bz?Uo^<$% zZ+d3^OV@jkS~h?6pI@3WC*wdJca7z#ui4&RZFaZ$#AZ9^$ zV5zkZ{f{v`09B12SEBY-tG6JP59=hsgG5{jYszeU$-lkz$3MRJ*6VM)Nxc<%^R~C% z{L$8P`k{(F z#HjivCm$O|6`Xtuvid6szk)*JM8!*lN=fOQU|qoPXnb0)_D=X}p_UM^SW>ir1Ncp` z$vp*d9VF4yMH49MfYXoQhyrj4GZ3yoSggEt zB;HN@#LCAOKK|sBo~PzN_8Nl0mXt=oAcpBD=0mFrOa09*)v%${!wY-vzv7anu~EE$ z?*A>Z3*}OcP9i`po|fd8;yV%;?c*1S*u3orK|KMlmtJ#~`gM*Yh;y>SW82 zUYWwE(5XcRsUfXUua^ShOo^&EwSE25pAxjY;L`5^a&5`dRj>TPsy3%IKxGOWl_3ST zzU!esKMHEyAs5(6T*!%^J{os3TtWA&DGzb56WN0rh8+9}H`{F2b<3CK3YD>T`|5So z83#94tvmHr_PNaWl8Vix8tl7JBciSgB zzg&D0Saxf(cJ6{p-M;zhl~`SaOXdNk1zXXom;VgOPc;Hnic*1jS7B(f9~sI4}}F)^mQ?LgWrx9p6A@@MjELOWm5ir;o2%yyb&4ruE(DP8{2{ zt7X%U>~}X*eR0B4yYpbqrqlZycN)%|+Ph|3^}eN@8;@>JNvi*^%CseG)@;ptb4|Zi zGq?q!!?2tCF;EeguYUFAnSv8X!`y34K74^Wzz(t^2UzS$Rs?&%!3we%17obvz&QOT z#fl%`4PTv>K0*z519&^W&Sd%%k_1hidruc;?%tPFvF6l{taEvV$*G^@udUmd+Pr%I zVDquO;-d)}tBcJ|OE#nwd~!N}%_k>5&-&otmfF1BtyxK|t;fVL3b#J9a-k)A8XVgWT@p^W`99N2& zTNQAh7*GnJmkaQL!Hv&;y2Q8mJJ^wzE?fD^OE$F?Q}dcv0(F5Xa3%4X(W_T|!x2}n zj1PydI){V95u}JL^2*h#6XY;}cVkAZom>%CJS>0LtkY?sBM~MeLSxhc#FZ>yeKMlY zQ<~cVKLd0l)a+uuL1dKD-w(eY4iNCdD#>rfS)~}X34m6`_XxJC+IsB1k5>gh4z0Ko z2%13h`{b942i5kRRvlSUh%;pt5nC?g1NYX`9nsM_(H+^<(dq0Ck{9FMksV!K6FBS& zc89v=_JCA@FT?_jz!x2vyWZNgqYRc5O<@wib?LMo3?Z6O?ZxL z?&#@c9~au-EB^zZh8EuRnP`L z#*%PL1g%&qOb03adL2_0J@-!BsZr+req_YAK!htF~ph(PfBV*J_ zvPO|aKZV+hc(-E;Y-4!k^F&YiDYrA$MZQEz4H?dWJA~Z(NPK>bu#b^Me1K+PgAS99 zxttR?>B4r+z`H*Bn9!8DrluzGZ30i>!WS5>3BpkZ`mrgz6L7~m@jEUbb(<1d)rgHl z4I&cl z2q_to2}KlYbmUG&j1uKNQk;uIN`lg-@ZkiGCKM4;nL`n)RNzxer9%;^l*q}K@XDcx z$9KWs13I#WMAd`Ktl#9a@2}< zA6G&eEM0_mi!e^%5kQ&9M$j;%^kz;DffK61d-PUAHW^xZrKyjU^hcwx#*p(``~X?e z2`N*o48{A3k*GAt?lx?X z(#PLkwiJ#I@3N?m-+v@2Ciz$*2+0W1Sa`F&!81nZm5f7Eh=i{0C%e}z2+5|yLfEk( z!~^@b?O&gf@X3dtrSIO*YE9WzaBRo!gq$rq57vJC?ygqn)B_pb zdAuuz$val6BP45Ip=Bd&LDRCuko*&+(*F&_Y_N|o5T%qV68*7IRI6(5lQgt*dcm^t-4pMBw47STfGrUVj<)6RKBbP=S@KKa;e>BJ%=pHT z`LXf&RDijimd%0sW+1j`vI@>qxXOa7qE~fB%TeJl25LG^`hi_X9L_Y88s3A) z8H^S4$QQ$WYUCFX>cL0I{~$WUiY^jCpL9#~Sk!QO5$7eJimMGx!!e28Rz-MraVnx-$IdLZj0rF_AHn^kD(WGb9#ib|XU&+em z(;)mH@gYtLEh^37$xv$jI=40gE14EfdL;10LVH5?3y#nzv~vRh^5a?r_3-;nEyBw9 zXf&wI2fI*T`v~-sLHL^1TgKrtM0ihh8CM3Jq00WBU9XM1VJA>o?yy4^c zm(~nf0neo;4l}}chT`9lE(Vc&jA=O8O&)WE*5oip8{rT$O_+fXJ#Ge?pxNXzd(8-$ zTPDoFS_eRo%N%VnYr%MiXB_~yC(RK$yg3J_5KO-&8qIfR)Tqs8b{-ZIzO#!h-Gj}C zRhP~Bi?&jwJkbWoe)ZoD$4{(TVS_`4$OVo#J!)w}x;b!vVsp^zEea0P*B=QT-O*3= zMRbDxEE*gu-CYy?(afIinS^KEJz>JLE);e+`Xia0eS`(A542~@KGX^!FduHS&@|5( zWV0t!l_mCOtFw!aRN3Fz)qbjobF_YgRC@f9`jYZ*hrMx5$A;wu)nQT>O+-UG`E+*? z!Qj-#N?>9(G`F<0lE2p0W~zm14dNbXnFI9U@U6WKZ^X4Ull=2$aH9E}BXQ_y@q!_3 zyd|==8IKW7%@ZwAtxYYh-j+Ma?=`nHw>Gu4H8-}BpT_UaYHsL8!j+bQLtP_6!!WcT z>(y-iY)M|q2kRQnZ`}UnmhIJBR&J9kHrGA9V$sonGk)9!`H>KzcjzJ^KLM2V;10Gn zbh>e%#Q+MlnS^LwYlIC2brBY`*BY>ZEY0k(c#-iuVWG_97KU{U#~#akpbT5BfEPAf z>}G@A=0`@C8F<-Utzc=SMZ8XQMua?6n1lFj*82B8t-G*q-@4+X2R~oDUSeu0dGMuY z^Qp182}khY8<<+*HYVkrM8+`RndTV^<+tgdM32bLn$LhjUcb+kIbe|k`Itf_;^GVbO`d1 z(kv8NBCuaaAjj#V1%wEI`-*Ulx$$7Cp*@{*I=fn6X=*;hY^y&}TC3LCY}^anmoxow zPT#>dMJ9rDjzEnQ<_z-v$@nn}8bL?|Kp2#f(QIf0qXQ^;n)YH($wXL`ihBp+cFvyUk&duyB!dIvRMxe0~r%k#T4UF?`x3Fjz~OA9hwCSpM=DOLkABY3MBM^p3R*w>rles?LElE(P=#R3bD%Abrwx{oq~%N z%{5DfSx9a=1nItmRa6VB4tgMY508WFzeT_OzI;%P49RPP%_0t49lHi7R-~nz`g?E* z_~|g88Q^fNjj6W5b2gLNY_ph5R=WjgoZvVhJOEa}$1==8OEZQoRwv83Lv?n{U7Zf~ zqF5*KE38V8;i6m$)MReZ++n68Scq1{dT6*C#|S-Rp(HUml4pcTgKyb-F8mdX19|DvB0n{ygGx zC2kSgJE9{|=i8uc5KjYf)k5#r80TK47$?yhbFSiuf_i#c& zoq&$4gp#KGg+{Kmn-wzDHIW#)0xCb9V+3yxxd@m}3PjkEeHNX3&(D5#fAD9H`$IpE zxc}#qc#66IXZQbTx9~FaF;?C7oHuf|u0LFSH08@Bn|pZ0nWEjIlb?O~#jfmwA8y=` z*}Gv^!qJ+oN!vG^__)*pWhSTwI~eS+SsH^aq0xfSII7!e5owJnMAUe>+5=7E{+6sl zDRFUVl)Y$NI)_Wk?6LGVNG-i$B*s})GM!Es_wcX(`j@}{^)G)h{x#*#YS?y zq4WSD5biMOT?9{9b!`H3!`i|1`O=Qn18piv1NuYXAMwzi ze2apw1s4TgV=VH&7O@D2q1U1oz4qE7>b3Yque|ciQ8@?}h5-~Ahk`E=mjLt&?&k~n z(y~l-@ri0?enn$>Zqb>#rtaK)Wz7Dc>@!_cD0R~Id!UY)h*)t6s+=7<990atl31U{00Mt%p6MBtKilR^nh z9bg1t4oK#S2M5E)I3JN0VBB0Pm& zja>BVtJI>nR~P;Dug@P>2(AF((#H$&Vke8F~74iQ9hHIMPI<3!+O3w`o4o9~t4jx`ss%|3 z0GU!@7^4v1%!~NNi~dE7R~@+f&^|#t2NuP@wrJ67&mLC_MP30z=oC2k-{Sxb4AuV< zDSZQ64zQJg9z+q0D^z16GAEZ)vL;fCEzl2HNk)Vg`sWSl=oNt2h;hKkg8PKz&D@1V zBShjLJ=RC!?}1%~v8mQZ{NdifbCJ(J_Z;rMgjDS-NY0hi+V@F558W)NZc zI3aEfXP_T=Y-6;rB@l*QQR%P_JPlGg1SN?-46GP;zyXAi7QJYY)_ghmlFWD)RLTnE;jNWlOn zfTyD3c`CgArN-M!rdJnsxTSpLqONk3CM(lAj1Z9>P89SC2nV4j;pr#~w?v!xaYQ z&}ia-85Y_nZborMz1D8D0~eKVv+BU!Vg(|U0VsKPs5n*vlh|##XpTe4Nt;;a)ngOa{EG|sh z*#&Hwy9pAyPy(L^vb2Z>izx~8Sff!L`I}!a9zo{lcb6_+0!P(f|E(Up2}r}zLC3

" + firstParagraph.text() + "

"); + insertedSiblings++; + } + + } + + currentSibling = currentSibling.previousElementSibling(); + } + return node; + + + } + + /** + * we could have long articles that have tons of paragraphs so if we tried to calculate the base score against + * the total text score of those paragraphs it would be unfair. So we need to normalize the score based on the average scoring + * of the paragraphs within the top node. For example if our total score of 10 paragraphs was 1000 but each had an average value of + * 100 then 100 should be our base. + * + * @param topNode + * @return + */ + private int getBaselineScoreForSiblings(Element topNode) { + + int base = 100000; + + int numberOfParagraphs = 0; + int scoreOfParagraphs = 0; + + Elements nodesToCheck = topNode.getElementsByTag("p"); + + for (Element node : nodesToCheck) { + + String nodeText = node.text(); + WordStats wordStats = StopWords.getStopWordCount(nodeText); + boolean highLinkDensity = isHighLinkDensity(node); + + + if (wordStats.getStopWordCount() > 2 && !highLinkDensity) { + + numberOfParagraphs++; + scoreOfParagraphs += wordStats.getStopWordCount(); + } + + } + + if (numberOfParagraphs > 0) { + base = scoreOfParagraphs / numberOfParagraphs; + if (logger.isDebugEnabled()) { + logger.debug("The base score for siblings to beat is: " + base + " NumOfParas: " + numberOfParagraphs + " scoreOfAll: " + scoreOfParagraphs); + } + } + + return base; + + + } + + private String debugNode(Element e) { + + StringBuilder sb = new StringBuilder(); + sb.append("GravityScore: '"); + sb.append(e.attr("gravityScore")); + sb.append("' paraNodeCount: '"); + sb.append(e.attr("gravityNodes")); + sb.append("' nodeId: '"); + sb.append(e.id()); + sb.append("' className: '"); + sb.append(e.attr("class")); + return sb.toString(); + + } + + /** + * cleans up any temp shit we have laying around like temp images + * removes any image in the temp dir that starts with the linkhash of the url we just parsed + */ + public void releaseResources() { + if (logger.isDebugEnabled()) { + logger.debug("STARTING TO RELEASE ALL RESOURCES"); + } + File dir = new File(config.getLocalStoragePath()); + String[] children = dir.list(); + + if (children == null) { + logger.debug("No Temp images found for linkhash: " + this.linkhash); + } else { + for (int i = 0; i < children.length; i++) { + // Get filename of file or directory + String filename = children[i]; + + if (filename.startsWith(this.linkhash)) { + + File f = new File(dir.getAbsolutePath() + "/" + filename); + if (!f.delete()) { + logger.error("Unable to remove temp file: " + filename); + } + } + } + } + + } + + +} diff --git a/src/main/java/com/jimplush/goose/ParseWrapper.java b/src/main/java/com/jimplush/goose/ParseWrapper.java new file mode 100644 index 000000000..e88f741ba --- /dev/null +++ b/src/main/java/com/jimplush/goose/ParseWrapper.java @@ -0,0 +1,67 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose; + +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; + +import java.text.SimpleDateFormat; +import java.util.Calendar; + +/** + * User: jim plush + * Date: 12/16/10 + */ + +/** + * This wrapper class is helpful when you start to multithread this bitch + * You'll be able to see the url clearly that you were processing at the time + * by viewing the stack dump of this class + */ +public class ParseWrapper { + + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + public String status = "notStarted"; + + public String url; + public String startTime; + + + public Document parse(String html, String url) { + this.url = url; + this.status = "Started"; + this.startTime = now(); + Document doc; + try { + doc = Jsoup.parse(html); + } catch (Exception e) { + throw new RuntimeException(e); + } + this.status = "Done"; + return doc; + } + + + public static String now() { + Calendar cal = Calendar.getInstance(); + return DATE_FORMAT.format(cal.getTime()); + + } + +} diff --git a/src/main/java/com/jimplush/goose/PerformanceTester.java b/src/main/java/com/jimplush/goose/PerformanceTester.java new file mode 100644 index 000000000..c2ce5b699 --- /dev/null +++ b/src/main/java/com/jimplush/goose/PerformanceTester.java @@ -0,0 +1,59 @@ +package com.jimplush.goose; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.time.StopWatch; + +import java.io.IOException; +import java.io.InputStream; + +/** + * Created by Jim Plush + * User: jim + * Date: 5/13/11 + */ +public class PerformanceTester { + + + /** + * testing the performance of the extraction algos only + * current best time on local macbook + * run this 3 times and take the best time + * 32329 ms for 100 articles v1 + * 27047 ms for 100 articles v2 (erraggy perf improvements) + */ + public static void main(String[] args) { + + System.out.println("testing performance of general goose extraction algos"); + + // make sure to set the logging level to "info" + String html = PerformanceTester.getHTML("/com/jimplush/goose/statichtmlassets/scribd.txt"); + String url = "http://www.scribd.com/doc/52584146/Microfinance-and-Poverty-Reduction?in_collection=2987942"; + Configuration config = new Configuration(); + config.setEnableImageFetching(false); + ContentExtractor contentExtractor = new ContentExtractor(config); + + StopWatch clock = new StopWatch(); + + System.out.println("How long does it take to extract an article?"); + clock.start(); + for (int i = 0; i < 100; i++) { + contentExtractor.extractContent(url, html); + } + clock.stop(); + + System.out.println("It takes " + clock.getTime() + " milliseconds"); + + } + + + private static String getHTML(String filename) { + String html = ""; + InputStream is = PerformanceTester.class.getResourceAsStream(filename); + try { + html = IOUtils.toString(is, "UTF-8"); + } catch (IOException e) { + e.printStackTrace(); + } + return html; + } +} diff --git a/src/main/java/com/jimplush/goose/TalkToMeGoose.java b/src/main/java/com/jimplush/goose/TalkToMeGoose.java new file mode 100644 index 000000000..9628e70f0 --- /dev/null +++ b/src/main/java/com/jimplush/goose/TalkToMeGoose.java @@ -0,0 +1,42 @@ +package com.jimplush.goose; + +/** + * Created by Jim Plush + * User: jim + * Date: 5/13/11 + */ +public class TalkToMeGoose { + + /** + * you can use this method if you want to run goose from the command line to extract html from a bashscript + * or to just test it's functionality + * you can run it like so + * cd into the goose root + * MAVEN_OPTS="-Xms256m -Xmx2000m" mvn exec:java -Dexec.mainClass=com.jimplush.goose.TalkToMeGoose -Dexec.args="http://techcrunch.com/2011/05/13/native-apps-or-web-apps-particle-code-wants-you-to-do-both/" -e -q > ~/Desktop/gooseresult.txt + * + * Officer: [in the midst of the MIG battle] Both Catapults are broken, sir. + * Stinger: How long will it take? + * Officer: It'll take ten minutes. + * Stinger: Bullshit ten minutes! This thing will be over in two minutes! Get on it! + * + * @param args + */ + public static void main(String[] args) { + + try { + + String url = args[0]; + Configuration config = new Configuration(); + config.setEnableImageFetching(false); + ContentExtractor contentExtractor = new ContentExtractor(config); + Article article = contentExtractor.extractContent(url); + System.out.println(article.getCleanedArticleText().trim()); + + } catch (Exception e) { + System.out.println("Make sure you pass in a valid URL: " + e.toString()); + } + + + } + +} diff --git a/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java b/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java new file mode 100644 index 000000000..bb37244c2 --- /dev/null +++ b/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java @@ -0,0 +1,376 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.jimplush.goose.cleaners; + +import com.jimplush.goose.texthelpers.ReplaceSequence; +import com.jimplush.goose.texthelpers.string; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.nodes.Node; +import org.jsoup.nodes.TextNode; +import org.jsoup.select.Elements; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * User: Jim Plush + * Date: 12/18/10 + * This class is used to pre clean documents(webpages) + * We go through 3 phases of parsing a website cleaning -> extraction -> output formatter + * This is the cleaning phase that will try to remove comments, known ad junk, social networking divs + * other things that are known to not be content related. + */ + +public class DefaultDocumentCleaner implements DocumentCleaner { + + private static final Logger logger = LoggerFactory.getLogger(DefaultDocumentCleaner.class); + + /** + * this regex is used to remove undesirable nodes from our doc + * indicate that something maybe isn't content but more of a comment, footer or some other undesirable node + */ + private static final String regExRemoveNodes; + private static final String queryNaughtyIDs; + private static final String queryNaughtyClasses; + private static final String queryNaughtyNames; + + /** + * regex to detect if there are block level elements inside of a div element + */ + private static final Pattern divToPElementsPattern = Pattern.compile("<(a|blockquote|dl|div|img|ol|p|pre|table|ul)"); + + private static final ReplaceSequence tabsAndNewLinesReplcesments; + private static final Pattern captionPattern = Pattern.compile("^caption$"); + private static final Pattern googlePattern = Pattern.compile(" google "); + private static final Pattern entriesPattern = Pattern.compile("^[^entry-]more.*$"); + private static final Pattern facebookPattern = Pattern.compile("[^-]facebook"); + private static final Pattern twitterPattern = Pattern.compile("[^-]twitter"); + + static { + + StringBuilder sb = new StringBuilder(); + // create negative elements + sb.append("^side$|combx|retweet|menucontainer|navbar|comment|PopularQuestions|contact|foot|footer|Footer|footnote|cnn_strycaptiontxt|links|meta$|scroll|shoutbox|sponsor"); + sb.append("|tags|socialnetworking|socialNetworking|cnnStryHghLght|cnn_stryspcvbx|^inset$|pagetools|post-attributes|welcome_form|contentTools2|the_answers"); + sb.append("|communitypromo|subscribe|vcard|articleheadings|date|print|popup|tools|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text"); + regExRemoveNodes = sb.toString(); + queryNaughtyIDs = "[id~=(" + regExRemoveNodes + ")]"; + queryNaughtyClasses = "[class~=(" + regExRemoveNodes + ")]"; + queryNaughtyNames = "[name~=(" + regExRemoveNodes + ")]"; + + tabsAndNewLinesReplcesments = ReplaceSequence.create("\n", "\n\n").append("\t").append("^\\s+$"); + } + + + public Document clean(Document doc) { + + if (logger.isDebugEnabled()) { + logger.debug("Starting cleaning phase with DefaultDocumentCleaner"); + } + Document docToClean = doc; + docToClean = cleanEmTags(docToClean); + docToClean = removeDropCaps(docToClean); + docToClean = removeScriptsAndStyles(docToClean); + docToClean = cleanBadTags(docToClean); + docToClean = removeNodesViaRegEx(docToClean, captionPattern); + docToClean = removeNodesViaRegEx(docToClean, googlePattern); + docToClean = removeNodesViaRegEx(docToClean, entriesPattern); + + // remove twitter and facebook nodes, mashable has f'd up class names for this + docToClean = removeNodesViaRegEx(docToClean, facebookPattern); + docToClean = removeNodesViaRegEx(docToClean, twitterPattern); + + // turn any divs that aren't used as true layout items with block level elements inside them into paragraph tags + docToClean = convertDivsToParagraphs(docToClean, "div"); + docToClean = convertDivsToParagraphs(docToClean, "span"); + + + return docToClean; + } + + private Document convertDivsToParagraphs(Document doc, String domType) { + + if (logger.isDebugEnabled()) { + logger.debug("Starting to replace bad divs..."); + } + int badDivs = 0; + int convertedTextNodes = 0; + Elements divs = doc.getElementsByTag(domType); + for (Element div : divs) { + + try { + + Matcher divToPElementsMatcher = divToPElementsPattern.matcher(div.html().toLowerCase()); + if (divToPElementsMatcher.find() == false) { + Document newDoc = new Document(doc.baseUri()); + Element newNode = newDoc.createElement("p"); + + newNode.append(div.html()); + div.replaceWith(newNode); + badDivs++; + + } else { + // Try to convert any div with just text inside it to a paragraph so it can be counted as text, otherwise it would be ignored + // example

This is some text in a div
should be

this is some text in a div

+ //db(div.childNodes().size() + " childnodes"); + + //create a master text node to hold all the child node texts so that links that were replaced with text notes + //don't become their own paragraphs + + StringBuilder replacementText = new StringBuilder(); + + ArrayList nodesToRemove = new ArrayList(); + + //cleanTags(div); + + + for (Node kid : div.childNodes()) { + + if (kid.nodeName().equals("#text")) { + + TextNode txtNode = (TextNode) kid; + String text = txtNode.attr("text"); + if (string.isNullOrEmpty(text)) continue; + + //clean up text from tabs and newlines + text = tabsAndNewLinesReplcesments.replaceAll(text); + + if (text.length() > 1) { + + // check for siblings that might be links that we want to include in our new node + Node previousSib = kid.previousSibling(); + + if (logger.isDebugEnabled()) { + logger.debug("PARENT CLASS: " + div.className() + " NODENAME: " + kid.nodeName()); + logger.debug("TEXTREPLACE: '" + text.replace("\n", "").replace("
", "") + "'"); + } + + if (previousSib != null) { + if (previousSib.nodeName().equals("a")) { + replacementText.append(previousSib.outerHtml()); + if (logger.isDebugEnabled()) { + logger.debug("SIBLING NODENAME ADDITION: " + previousSib.nodeName() + " TEXT: " + previousSib.outerHtml()); + } + } + } + + replacementText.append(text); + nodesToRemove.add(kid); + + convertedTextNodes++; + } + + } + + + } + + // replace div's text with the new master replacement text node that containts the sum of all the little text nodes + //div.appendChild(replacementTextNode); + + Document newDoc = new Document(doc.baseUri()); + Element newPara = newDoc.createElement("p"); + newPara.html(replacementText.toString()); + + + div.childNode(0).before(newPara.outerHtml()); + + newDoc = null; + + + for (Node n : nodesToRemove) { + n.remove(); + } + + + } + } catch (NullPointerException e) { + logger.error(e.toString()); + } + + } + + if (logger.isDebugEnabled()) { + logger.debug("Found " + divs.size() + " total divs with " + badDivs + " bad divs replaced and " + convertedTextNodes + " textnodes converted inside divs"); + } + + + + + return doc; + } + + private Document removeScriptsAndStyles(Document doc) { + + if (logger.isDebugEnabled()) { + logger.debug("Starting to remove script tags"); + } + Elements scripts = doc.getElementsByTag("script"); + for (Element item : scripts) { + item.remove(); + } + if (logger.isDebugEnabled()) { + logger.debug("Removed: " + scripts.size() + " script tags"); + } + + if (logger.isDebugEnabled()) { + logger.debug("Removing Style Tags"); + } + Elements styles = doc.getElementsByTag("style"); + for (Element style : styles) { + style.remove(); + } + + return doc; + + + } + + /** + * replaces tags with textnodes + */ + private Document cleanEmTags(Document doc) { + Elements ems = doc.getElementsByTag("em"); + if (logger.isDebugEnabled()) { + logger.debug("Cleaning " + ems.size() + " EM tags"); + } + for (Element node : ems) { + // replace the node with a div node + Elements images = node.getElementsByTag("img"); + if (images.size() != 0) { + continue; + } + TextNode tn = new TextNode(node.text(), doc.baseUri()); + node.replaceWith(tn); + } + return doc; + } + + + /** + * remove those css drop caps where they put the first letter in big text in the 1st paragraph + */ + private Document removeDropCaps(Document doc) { + Elements items = doc.select("span[class~=(dropcap|drop_cap)]"); + if (logger.isDebugEnabled()) { + logger.debug("Cleaning " + items.size() + " dropcap tags"); + } + for (Element item : items) { + TextNode tn = new TextNode(item.text(), doc.baseUri()); + item.replaceWith(tn); + } + return doc; + } + + + private Document cleanBadTags(Document doc) { + // only select elements WITHIN the body to avoid removing the body itself + Elements children = doc.body().children(); + + + Elements naughtyList = children.select(queryNaughtyIDs); + if (logger.isDebugEnabled()) { + logger.debug(naughtyList.size() + " naughty ID elements found"); + } + for (Element node : naughtyList) { + if (logger.isDebugEnabled()) { + logger.debug("Cleaning: Removing node with id: " + node.id()); + } + removeNode(node); + } + if (logger.isDebugEnabled()) { + Elements naughtyList2 = children.select(queryNaughtyIDs); + logger.debug(naughtyList2.size() + " naughty ID elements found after removal"); + } + + Elements naughtyList3 = children.select(queryNaughtyClasses); + if (logger.isDebugEnabled()) { + logger.debug(naughtyList3.size() + " naughty CLASS elements found"); + } + for (Element node : naughtyList3) { + if (logger.isDebugEnabled()) { + logger.debug("clean: Removing node with class: " + node.className()); + } + removeNode(node); + } + if (logger.isDebugEnabled()) { + Elements naughtyList4 = children.select(queryNaughtyClasses); + logger.debug(naughtyList4.size() + " naughty CLASS elements found after removal"); + } + + // starmagazine puts shit on name tags instead of class or id + Elements naughtyList5 = children.select(queryNaughtyNames); + if (logger.isDebugEnabled()) { + logger.debug(naughtyList5.size() + " naughty Name elements found"); + } + for (Element node : naughtyList5) { + if (logger.isDebugEnabled()) { + logger.debug("clean: Removing node with class: " + node.attr("class") + " id: " + node.id() + " name: " + node.attr("name")); + } + removeNode(node); + } + + return doc; + + } + + /** + * Apparently jsoup expects the node's parent to not be null and throws if it is. Let's be safe. + * @param node the node to remove from the doc + */ + private void removeNode(Element node) { + if (node == null || node.parent() == null) return; + node.remove(); + } + + /** + * removes nodes that may have a certain pattern that matches against a class or id tag + * + * @param pattern + */ + private Document removeNodesViaRegEx(Document doc, Pattern pattern) { + try { + + Elements naughtyList = doc.getElementsByAttributeValueMatching("id", pattern); + if (logger.isDebugEnabled()) { + logger.debug("regExRemoveNodes: " + naughtyList.size() + " ID elements found against pattern: " + pattern); + } + for (Element node : naughtyList) { + removeNode(node); + } + + Elements naughtyList3 = doc.getElementsByAttributeValueMatching("class", pattern); + if (logger.isDebugEnabled()) { + logger.debug("regExRemoveNodes: " + naughtyList3.size() + " CLASS elements found against pattern: " + pattern); + } + for (Element node : naughtyList3) { + removeNode(node); + } + } catch (IllegalArgumentException e) { + e.printStackTrace(); + logger.error(e.toString()); + } + return doc; + } + +} diff --git a/src/main/java/com/jimplush/goose/cleaners/DocumentCleaner.java b/src/main/java/com/jimplush/goose/cleaners/DocumentCleaner.java new file mode 100644 index 000000000..d1ce527e3 --- /dev/null +++ b/src/main/java/com/jimplush/goose/cleaners/DocumentCleaner.java @@ -0,0 +1,31 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.jimplush.goose.cleaners; + +import org.jsoup.nodes.Document; + +/** + * User: Jim Plush + * Date: 12/18/10 + */ +public interface DocumentCleaner { + + public Document clean(Document doc); + +} diff --git a/src/main/java/com/jimplush/goose/extractors/AdditionalDataExtractor.java b/src/main/java/com/jimplush/goose/extractors/AdditionalDataExtractor.java new file mode 100644 index 000000000..05c902cc3 --- /dev/null +++ b/src/main/java/com/jimplush/goose/extractors/AdditionalDataExtractor.java @@ -0,0 +1,21 @@ +package com.jimplush.goose.extractors; /** + * Created by IntelliJ IDEA. + * User: robbie + * Date: 5/19/11 + * Time: 9:57 PM + */ + +import org.jsoup.nodes.Element; + +import java.util.Map; + +/** + * Implement this abstract class to extract anything not currently contained within the {@link com.jimplush.goose.Article} class + */ +public abstract class AdditionalDataExtractor implements Extractor> { + + public abstract Map extract(Element rootElement); + +} + + diff --git a/src/main/java/com/jimplush/goose/extractors/Extractor.java b/src/main/java/com/jimplush/goose/extractors/Extractor.java new file mode 100644 index 000000000..ff13b1b58 --- /dev/null +++ b/src/main/java/com/jimplush/goose/extractors/Extractor.java @@ -0,0 +1,43 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose.extractors; + +import org.jsoup.nodes.Element; + +/** + * Created by IntelliJ IDEA. + * User: robbie + * Date: 5/19/11 + * Time: 2:45 PM + */ + +/** + * Encapsulates the process of extracting some type T from an article + * @param the type of {@link Object} the implementing class will return + */ +public interface Extractor { + /** + * Given the specified {@link Element}, extract @param + * + * @param rootElement passed in from the {@link com.jimplush.goose.ContentExtractor} after the article has been parsed + * @return an instance of type T + */ + T extract(Element rootElement); +} + + diff --git a/src/main/java/com/jimplush/goose/extractors/PublishDateExtractor.java b/src/main/java/com/jimplush/goose/extractors/PublishDateExtractor.java new file mode 100644 index 000000000..9205ed8d7 --- /dev/null +++ b/src/main/java/com/jimplush/goose/extractors/PublishDateExtractor.java @@ -0,0 +1,44 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose.extractors; /** + * Created by IntelliJ IDEA. + * User: robbie + * Date: 5/19/11 + * Time: 2:50 PM + */ + +import org.jsoup.nodes.Element; + +import java.util.Date; + +/** + * Implement this class to extract the {@link Date} of when this article was published. + */ +public abstract class PublishDateExtractor implements Extractor { + + /** + * Intended to search the DOM and identify the {@link Date} of when this article was published. + *

This will be called by the {@link com.jimplush.goose.ContentExtractor#extractContent(String)} method and will be passed to {@link com.jimplush.goose.Article#setPublishDate(java.util.Date)}

+ * + * @param rootElement passed in from the {@link com.jimplush.goose.ContentExtractor} after the article has been parsed + * @return {@link Date} of when this particular article was published or null if no date could be found. + */ + public abstract Date extract(Element rootElement); +} + + diff --git a/src/main/java/com/jimplush/goose/images/BestImageGuesser.java b/src/main/java/com/jimplush/goose/images/BestImageGuesser.java new file mode 100644 index 000000000..a18882a84 --- /dev/null +++ b/src/main/java/com/jimplush/goose/images/BestImageGuesser.java @@ -0,0 +1,711 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose.images; + +import com.jimplush.goose.Configuration; +import com.jimplush.goose.network.HtmlFetcher; +import com.jimplush.goose.texthelpers.HashUtils; +import com.jimplush.goose.texthelpers.string; +import org.apache.http.Header; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpHead; +import org.apache.http.client.protocol.ClientContext; +import org.apache.http.protocol.BasicHttpContext; +import org.apache.http.protocol.HttpContext; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * User: jim plush + * Date: 12/19/10 + */ + +/** + * This image extractor will attempt to find the best image nearest the article. + * Unfortunately this is a slow process since we're actually downloading the image itself + * to inspect it's actual height/width and area metrics since most of the time these aren't + * in the image tags themselves or can be falsified. + * We'll weight the images in descending order depending on how high up they are compared to the top node content + */ +public class BestImageGuesser implements ImageExtractor { + + private static final Logger logger = LoggerFactory.getLogger(BestImageGuesser.class); + + + /** + * this lists all the known bad button names that we have + */ + private static final Matcher matchBadImageNames; + private static final String NODE_ID_FORMAT = "tag: %s class: %s ID: %s"; + + static { + StringBuilder sb = new StringBuilder(); + // create negative elements + sb.append(".html|.gif|.ico|button|twitter.jpg|facebook.jpg|digg.jpg|digg.png|delicious.png|facebook.png|reddit.jpg|doubleclick|diggthis|diggThis|adserver|/ads/|ec.atdmt.com"); + sb.append("|mediaplex.com|adsatt|view.atdmt"); + matchBadImageNames = Pattern.compile(sb.toString()).matcher(string.empty); + } + + /** + * holds an httpclient connection object for doing head requests to get image sizes + */ + HttpClient httpClient; + + /** + * holds the document that we're extracting the image from + */ + Document doc; + + + /** + * holds the result of our image extraction + */ + Image image; + + + /** + * the webpage url that we're extracting content from + */ + String targetUrl; + + + /** + * stores a hash of our url for reference and image processing + */ + String linkhash; + + /** + * What's the minimum bytes for an image we'd accept is + */ + int minBytesForImages; + + + /** + * location to store temporary image files if need be + */ + String tempStoragePath; + + + /** + * holds the global configuration object + */ + Configuration config; + + + public BestImageGuesser(Configuration config, HttpClient httpClient, String targetUrl) { + this.httpClient = httpClient; + + image = new Image(); + + this.config = config; + + this.targetUrl = targetUrl; + this.linkhash = HashUtils.md5(this.targetUrl); + + } + + public Image getBestImage(Document doc, Element topNode) { + this.doc = doc; + if (logger.isDebugEnabled()) { + logger.debug("Starting to Look for the Most Relavent Image"); + } + + if (image.getImageSrc() == null) { + this.checkForKnownElements(); + } + + // I'm checking for large images first because a lot of the meta tags contained thumbnail size images instead of the goods! + // so we want to try and get the biggest image around the content area as possible. + if (image.getImageSrc() == null) { + this.checkForLargeImages(topNode, 0, 0); + } + + // fall back to meta tags, these can sometimes be inconsistent which is why we favor them less + if (image.getImageSrc() == null) { + this.checkForMetaTag(); + } + + + return image; + } + + private boolean checkForMetaTag() { + + if (this.checkForLinkTag()) { + return true; + } + + if (this.checkForOpenGraphTag()) { + return true; + } + if (logger.isDebugEnabled()) { + logger.debug("unable to find meta image"); + } + return false; + + + } + + /** + * checks to see if we were able to find open graph tags on this page + * + * @return + */ + private boolean checkForOpenGraphTag() { + try { + Elements meta = this.doc.select("meta[property~=og:image]"); + for (Element item : meta) { + if (item.attr("content").length() < 1) { + return false; + } + String imagePath = this.buildImagePath(item.attr("content")); + this.image.setImageSrc(imagePath); + this.image.setImageExtractionType("opengraph"); + this.image.setConfidenceScore(100); + this.image.setBytes(this.getBytesForImage(imagePath)); + if (logger.isDebugEnabled()) { + logger.debug("open graph tag found, using it"); + } + return true; + } + return false; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * checks to see if we were able to find open graph tags on this page + * + * @return + */ + private boolean checkForLinkTag() { + try { + Elements meta = this.doc.select("link[rel~=image_src]"); + for (Element item : meta) { + if (item.attr("href").length() < 1) { + return false; + } + this.image.setImageSrc(this.buildImagePath(item.attr("href"))); + this.image.setImageExtractionType("linktag"); + this.image.setConfidenceScore(100); + this.image.setBytes(this.getBytesForImage(this.buildImagePath(item.attr("href")))); + if (logger.isDebugEnabled()) { + logger.debug("link tag found, using it"); + } + return true; + } + return false; + } catch (Exception e) { + logger.error(e.toString(), e); + return false; + } + } + + public ArrayList getAllImages() { + return null; //To change body of implemented methods use File | Settings | File Templates. + } + + + /** + * although slow the best way to determine the best image is to download them and check the actual dimensions of the image when on disk + * so we'll go through a phased approach... + * 1. get a list of ALL images from the parent node + * 2. filter out any bad image names that we know of (gifs, ads, etc..) + * 3. do a head request on each file to make sure it meets our bare requirements + * 4. any images left over let's do a full GET request, download em to disk and check their dimensions + * 5. Score images based on different factors like height/width and possibly things like color density + * + * @param node + */ + private void checkForLargeImages(Element node, int parentDepth, int siblingDepth) { + if (node == null) return; + + Elements images = node.select("img"); + + + String nodeId = this.getNodeIds(node); + if (logger.isDebugEnabled()) { + logger.debug("checkForLargeImages: Checking for large images, found: " + images.size() + " - parent depth: " + parentDepth + " sibling depth: " + siblingDepth + " for node: " + nodeId); + } + ArrayList goodImages; + + goodImages = this.filterBadNames(images); + if (logger.isDebugEnabled()) { + logger.debug("checkForLargeImages: After filterBadNames we have: " + goodImages.size()); + } + + if (logger.isDebugEnabled()) { + goodImages = findImagesThatPassByteSizeTest(goodImages); + } + + if (logger.isDebugEnabled()) { + logger.debug("checkForLargeImages: After findImagesThatPassByteSizeTest we have: " + goodImages.size()); + } + + HashMap imageResults = downloadImagesAndGetResults(goodImages, parentDepth); + + + // pick out image with high score + Element highScoreImage = null; + for (Element image : imageResults.keySet()) { + if (highScoreImage == null) { + highScoreImage = image; + } else { + + if (imageResults.get(image) > imageResults.get(highScoreImage)) { + highScoreImage = image; + } + } + + } + if (highScoreImage != null) { + + + File f = new File(highScoreImage.attr("tempImagePath")); + this.image.setTopImageNode(highScoreImage); + this.image.setImageSrc(this.buildImagePath(highScoreImage.attr("src"))); + this.image.setImageExtractionType("bigimage"); + this.image.setBytes((int) f.length()); + if (imageResults.size() > 0) { + this.image.setConfidenceScore(100 / imageResults.size()); + } else { + this.image.setConfidenceScore(0); + } + if (logger.isDebugEnabled()) { + logger.debug("High Score Image is: " + this.buildImagePath(highScoreImage.attr("src"))); + } + } else { + if (logger.isDebugEnabled()) { + logger.debug("unable to find a large image, going to fall back modez. depth: " + parentDepth); + } + if (parentDepth < 2) { + + // we start at the top node then recursively go up to siblings/parent/grandparent to find something good + + Element prevSibling = node.previousElementSibling(); + if (prevSibling != null) { + if (logger.isDebugEnabled()) { + logger.debug("About to do a check against the sibling element, tagname: '" + prevSibling.tagName() + "' class: '" + prevSibling.attr("class") + "' id: '" + prevSibling.id() + "'"); + } + siblingDepth++; + this.checkForLargeImages(prevSibling, parentDepth, siblingDepth); + } else { + if (logger.isDebugEnabled()) { + logger.debug("no more sibling nodes found, time to roll up to parent node"); + } + parentDepth++; + this.checkForLargeImages(node.parent(), parentDepth, siblingDepth); + } + + } + } + + } + + + /** + * loop through all the images and find the ones that have the best bytez to even make them a candidate + * + * @param images + * @return + */ + private ArrayList findImagesThatPassByteSizeTest(ArrayList images) { + int cnt = 0; + ArrayList goodImages = new ArrayList(); + for (Element image : images) { + if (cnt > 30) { + if (logger.isDebugEnabled()) { + logger.debug("Abort! they have over 30 images near the top node: " + this.doc.baseUri()); + } + return goodImages; + } + int bytes = this.getBytesForImage(image.attr("src")); + // we dont want anything over 15 megs + if ((bytes == 0 || bytes > this.minBytesForImages) && bytes < 15728640) { + if (logger.isDebugEnabled()) { + logger.debug("findImagesThatPassByteSizeTest: Found potential image - size: " + bytes + " src: " + image.attr("src")); + } + goodImages.add(image); + } else { + image.remove(); + } + cnt++; + } + return goodImages; + } + + + /** + * takes a list of image elements and filters out the ones with bad names + * + * @param images + * @return + */ + private ArrayList filterBadNames(Elements images) { + ArrayList goodImages = new ArrayList(); + for (Element image : images) { + if (this.isOkImageFileName(image)) { + goodImages.add(image); + } else { + image.remove(); + } + } + return goodImages; + } + + /** + * will check the image src against a list of bad image files we know of like buttons, etc... + * + * @return + */ + private boolean isOkImageFileName(Element imageNode) { + String imgSrc = imageNode.attr("src"); + if (string.isNullOrEmpty(imgSrc)) { + return false; + } + matchBadImageNames.reset(imgSrc); + if (matchBadImageNames.find()) { + if (logger.isDebugEnabled()) { + logger.debug("Found bad filename for image: " + imgSrc); + } + return false; + } + return true; + } + + /** + * returns a string with debug info about this node + * + * @param node + * @return + */ + private String getNodeIds(Element node) { + String stuff = String.format(NODE_ID_FORMAT, node.tagName(), node.className(), node.id()); + return stuff; + } + + + private static final String[] knownIds = {"yn-story-related-media", "cnn_strylccimg300cntr", "big_photo"}; + /** + * in here we check for known image contains from sites we've checked out like yahoo, techcrunch, etc... that have + * known places to look for good images. + * //todo enable this to use a series of settings files so people can define what the image ids/classes are on specific sites + */ + private void checkForKnownElements() { + Element knownImage = null; + + if (logger.isDebugEnabled()) { + logger.debug("Checking for known images from large sites"); + } + + for (String knownName : knownIds) { + try { + Element known = this.doc.getElementById(knownName); + + if (known == null) { + known = this.doc.getElementsByClass(knownName).first(); + } + + if (known != null) { + Element mainImage = known.getElementsByTag("img").first(); + if (mainImage != null) { + knownImage = mainImage; + if (logger.isDebugEnabled()) { + logger.debug("Got Image: " + mainImage.attr("src")); + } + } + } + + } catch (NullPointerException e) { + if (logger.isDebugEnabled()) { + logger.debug(e.toString(), e); + } + } + + } + + if (knownImage != null) { + String knownImgSrc = knownImage.attr("src"); + this.image.setImageSrc(this.buildImagePath(knownImgSrc)); + this.image.setImageExtractionType("known"); + this.image.setConfidenceScore(90); + this.image.setBytes(this.getBytesForImage(knownImgSrc)); + } else { + if (logger.isDebugEnabled()) { + logger.debug("No known images found"); + } + } + + + } + + /** + * This method will take an image path and build out the absolute path to that image + * using the initial url we crawled so we can find a link to the image if they use relative urls like ../myimage.jpg + * + * @param image + * @return + */ + private String buildImagePath(String image) { + URL pageURL; + String newImage = image.replace(" ", "%20"); + try { + pageURL = new URL(this.targetUrl); + URL imageURL = new URL(pageURL, image); + + newImage = imageURL.toString(); + } catch (MalformedURLException e) { + logger.error("Unable to get Image Path: " + image); + } + return newImage; + + } + + + /** + * does the HTTP HEAD request to get the image bytes for this images + * + * @param src + * @return + */ + private int getBytesForImage(String src) { + int bytes = 0; + HttpHead httpget = null; + try { + String link = this.buildImagePath(src); + link = link.replace(" ", "%20"); + + HttpContext localContext = new BasicHttpContext(); + localContext.setAttribute(ClientContext.COOKIE_STORE, HtmlFetcher.emptyCookieStore); + + httpget = new HttpHead(link); + + HttpResponse response; + + response = httpClient.execute(httpget, localContext); + + HttpEntity entity = response.getEntity(); + + bytes = this.minBytesForImages + 1; + + try { + int currentBytes = (int) entity.getContentLength(); + Header contentType = entity.getContentType(); + if (contentType.getValue().contains("image")) { + bytes = currentBytes; + } + } catch (NullPointerException e) { + + } + + } catch (Exception e) { + + logger.error(e.toString()); + } finally { + try { + httpget.abort(); + } catch (NullPointerException e) { + logger.error("HttpGet is null, can't abortz"); + } + } + + return bytes; + } + + /** + * download the images to temp disk and set their dimensions + *

+ * we're going to score the images in the order in which they appear so images higher up will have more importance, + * we'll count the area of the 1st image as a score of 1 and then calculate how much larger or small each image after it is + * we'll also make sure to try and weed out banner type ad blocks that have big widths and small heights or vice versa + * so if the image is 3rd found in the dom it's sequence score would be 1 / 3 = .33 * diff in area from the first image + * + * @param images + * @return + */ + private HashMap downloadImagesAndGetResults(ArrayList images, int depthLevel) { + HashMap imageResults = new HashMap(); + + int cnt = 1; + int initialArea = 0; + + for (Element image : images) { + + if (cnt > 30) { + if (logger.isDebugEnabled()) { + logger.debug("over 30 images attempted, that's enough for now"); + } + break; + } + + // download image to local disk + try { + String imageSource = this.buildImagePath(image.attr("src")); + + + String localSrcPath = ImageSaver.storeTempImage(this.httpClient, this.linkhash, imageSource, this.config); + if (localSrcPath == null) { + if (logger.isDebugEnabled()) { + logger.debug("unable to store this image locally: IMGSRC: " + image.attr("src") + " BUILD SRC: " + imageSource); + } + continue; + } + if (logger.isDebugEnabled()) { + logger.debug("Starting image: " + localSrcPath); + } + + // set the temporary image path as an attribute on this node + image.attr("tempImagePath", localSrcPath); + + int width; + int height; + try { + ImageDetails imageDims = ImageUtils.getImageDimensions(config.getImagemagickIdentifyPath(), localSrcPath); + width = imageDims.getWidth(); + height = imageDims.getHeight(); + + // check for minimim depth requirements, if we're branching out wider in the dom, only get big images + if (depthLevel > 1) { + if (width < 300) { + if (logger.isDebugEnabled()) { + logger.debug("going depthlevel: " + depthLevel + " and img was only: " + width + " wide: " + localSrcPath); + } + continue; + } + + } + + } catch (IOException e) { + throw e; + } + + + // Check dimensions to make sure it doesn't seem like a banner type ad + if (this.isBannerDimensions(width, height)) { + if (logger.isDebugEnabled()) { + logger.debug(image.attr("src") + " seems like a fishy image dimension wise, skipping it"); + } + image.remove(); + continue; + } + + if (width < 50) { + if (logger.isDebugEnabled()) { + logger.debug(image.attr("src") + " is too small width: " + width + " removing.."); + } + image.remove(); + continue; + } + + float sequenceScore = (float) 1 / cnt; + int area = width * height; + + float totalScore = 0; + if (initialArea == 0) { + initialArea = area; + totalScore = 1; + } else { + // let's see how many times larger this image is than the inital image + float areaDifference = (float) area / initialArea; + totalScore = (float) sequenceScore * areaDifference; + } + if (logger.isDebugEnabled()) { + logger.debug(imageSource + " Area is: " + area + " sequence score: " + sequenceScore + " totalScore: " + totalScore); + } + + cnt++; + imageResults.put(image, totalScore); + + } catch (SecretGifException e) { + + continue; + + } catch (Exception e) { + logger.error(e.toString()); + continue; + } + + + } + + + return imageResults; + } + + + /** + * returns true if we think this is kind of a bannery dimension + * like 600 / 100 = 6 may be a fishy dimension for a good image + * + * @param width + * @param height + */ + private boolean isBannerDimensions(Integer width, Integer height) { + if (width == height) { + return false; + } + + if (width > height) { + float diff = (float) width / height; + if (diff > 5) { + return true; + } + } + + if (height > width) { + float diff = (float) height / width; + if (diff > 5) { + return true; + } + } + return false; + } + + + public int getMinBytesForImages() { + return minBytesForImages; + } + + public void setMinBytesForImages(int minBytesForImages) { + this.minBytesForImages = minBytesForImages; + } + + public String getTempStoragePath() { + return tempStoragePath; + } + + public void setTempStoragePath(String tempStoragePath) { + this.tempStoragePath = tempStoragePath; + } +} diff --git a/src/main/java/com/jimplush/goose/images/Image.java b/src/main/java/com/jimplush/goose/images/Image.java new file mode 100644 index 000000000..a43fc2e2f --- /dev/null +++ b/src/main/java/com/jimplush/goose/images/Image.java @@ -0,0 +1,99 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose.images; + +import org.jsoup.nodes.Element; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * User: Jim Plush + * Date: 12/19/10 + */ + + +public class Image { + private static final Logger logger = LoggerFactory.getLogger(Image.class); + + /** + * holds the Element node of the image we think is top dog + */ + private Element topImageNode; + + /** + * holds the src of the image + */ + private String imageSrc; + + /** + * how confident are we in this image extraction? the most images generally the less confident + */ + private double confidenceScore = 0.0; + + + /** + * what kind of image extraction was used for this? bestGuess, linkTag, openGraph tags? + */ + private String imageExtractionType = ""; + + + /** + * stores how many bytes this image is. + */ + private int bytes; + + public String getImageSrc() { + return imageSrc; + } + + public void setImageSrc(String imageSrc) { + this.imageSrc = imageSrc; + } + + public double getConfidenceScore() { + return confidenceScore; + } + + public void setConfidenceScore(double confidenceScore) { + this.confidenceScore = confidenceScore; + } + + public String getImageExtractionType() { + return imageExtractionType; + } + + public void setImageExtractionType(String imageExtractionType) { + this.imageExtractionType = imageExtractionType; + } + + public int getBytes() { + return bytes; + } + + public void setBytes(int bytes) { + this.bytes = bytes; + } + + public Element getTopImageNode() { + return topImageNode; + } + + public void setTopImageNode(Element topImageNode) { + this.topImageNode = topImageNode; + } +} diff --git a/src/main/java/com/jimplush/goose/images/ImageDetails.java b/src/main/java/com/jimplush/goose/images/ImageDetails.java new file mode 100644 index 000000000..590377149 --- /dev/null +++ b/src/main/java/com/jimplush/goose/images/ImageDetails.java @@ -0,0 +1,70 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.jimplush.goose.images; + +/** + * holds the details of the result of inspecting an image + * @author Jim Plush + * + */ +public class ImageDetails { + + /** + * the width of the image + */ + private int width; + + /** + * height of the image + */ + private int height; + + /** + * the mimeType of the image JPEG / PNG + */ + private String mimeType; + + + + public int getWidth() { + return width; + } + + public void setWidth(int width) { + this.width = width; + } + + public int getHeight() { + return height; + } + + public void setHeight(int height) { + this.height = height; + } + + public String getMimeType() { + return mimeType; + } + + public void setMimeType(String mimeType) { + this.mimeType = mimeType; + } + + +} diff --git a/src/main/java/com/jimplush/goose/images/ImageExtractor.java b/src/main/java/com/jimplush/goose/images/ImageExtractor.java new file mode 100644 index 000000000..cb58bc908 --- /dev/null +++ b/src/main/java/com/jimplush/goose/images/ImageExtractor.java @@ -0,0 +1,47 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose.images; + +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; + +import java.util.ArrayList; + +/** + * User: Jim Plush + * Date: 12/19/10 + * Image extraction algorithm was developed alongside Steve Kuo, PhD. + */ +public interface ImageExtractor { + + + + + /** + * pick the best image you can find + * @return + */ + public Image getBestImage(Document doc, Element topNode); + + /** + * return all the image candidates we think we have + * @return + */ + public ArrayList getAllImages(); + +} diff --git a/src/main/java/com/jimplush/goose/images/ImageSaver.java b/src/main/java/com/jimplush/goose/images/ImageSaver.java new file mode 100644 index 000000000..8cc2f0a25 --- /dev/null +++ b/src/main/java/com/jimplush/goose/images/ImageSaver.java @@ -0,0 +1,215 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose.images; + +import com.jimplush.goose.Configuration; +import com.jimplush.goose.network.HtmlFetcher; +import org.apache.commons.io.IOUtils; +import org.apache.http.Header; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.protocol.ClientContext; +import org.apache.http.protocol.BasicHttpContext; +import org.apache.http.protocol.HttpContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.util.Random; + + +/** + * This class will be responsible for storing images to disk + * + * @author Jim Plush + */ +public class ImageSaver { + + private static final Logger logger = LoggerFactory.getLogger(ImageSaver.class); + + + private static String getFileExtension(Configuration config, String fileName) throws IOException, SecretGifException { + String fileExtension = ""; + String mimeType; + try { + + ImageDetails imageDims = ImageUtils.getImageDimensions(config.getImagemagickIdentifyPath(), fileName); + mimeType = imageDims.getMimeType(); + + if (mimeType.equals("GIF")) { + if (logger.isDebugEnabled()) { + logger.debug("SNEAKY GIF! " + fileName); + } + throw new SecretGifException(); + } + if (mimeType.equals("JPEG")) { + fileExtension = ".jpg"; + } else if (mimeType.equals("PNG")) { + fileExtension = ".png"; + } else { + throw new IOException("BAD MIME TYPE: " + mimeType + " FILENAME:" + fileName); + } + + } catch (SecretGifException e) { + throw e; + + } catch (FileNotFoundException e) { + logger.error(e.getMessage()); + } catch (IOException e) { + logger.error(e.getMessage()); + throw e; + + } finally { + + } + + return fileExtension; + } + + + /** + * stores an image to disk and returns the path where the file was written + * + * @param imageSrc + * @return + */ + public static String storeTempImage(HttpClient httpClient, String linkhash, String imageSrc, Configuration config) throws SecretGifException { + + String localSrcPath = null; + HttpGet httpget = null; + HttpResponse response = null; + + try { + + imageSrc = imageSrc.replace(" ", "%20"); + if (logger.isDebugEnabled()) { + logger.debug("Starting to download image: " + imageSrc); + } + + HttpContext localContext = new BasicHttpContext(); + localContext.setAttribute(ClientContext.COOKIE_STORE, HtmlFetcher.emptyCookieStore); + + httpget = new HttpGet(imageSrc); + + response = httpClient.execute(httpget, localContext); + + String respStatus = response.getStatusLine().toString(); + if (!respStatus.contains("200")) { + return null; + } + + HttpEntity entity = response.getEntity(); + + String fileExtension = ""; + try { + Header contentType = entity.getContentType(); + } catch (Exception e) { + logger.error(e.getMessage()); + + } + + // generate random token + Random generator = new Random(); + int randInt = generator.nextInt(); + + localSrcPath = config.getLocalStoragePath() + "/" + linkhash + "_" + randInt; + + if (logger.isDebugEnabled()) { + logger.debug("Storing image locally: " + localSrcPath); + } + if (entity != null) { + InputStream instream = entity.getContent(); + OutputStream outstream = new FileOutputStream(localSrcPath); + try { + try { + IOUtils.copy(instream, outstream); + } catch (Exception e) { + throw e; + } finally { + entity.consumeContent(); + instream.close(); + outstream.close(); + } + + // get mime type and store the image extension based on that shiz + fileExtension = ImageSaver.getFileExtension(config, localSrcPath); + if (fileExtension == "" || fileExtension == null) { + if (logger.isDebugEnabled()) { + logger.debug("EMPTY FILE EXTENSION: " + localSrcPath); + } + return null; + } + File f = new File(localSrcPath); + if (f.length() < config.getMinBytesForImages()) { + if (logger.isDebugEnabled()) { + logger.debug("TOO SMALL AN IMAGE: " + localSrcPath + " bytes: " + f.length()); + } + return null; + } + + File newFile = new File(localSrcPath + fileExtension); + f.renameTo(newFile); + localSrcPath = localSrcPath + fileExtension; + + if (logger.isDebugEnabled()) { + logger.debug("Image successfully Written to Disk"); + } + + } catch (IOException e) { + logger.error(e.toString(), e); + } catch (SecretGifException e) { + throw e; + } catch (Exception e) { + logger.error(e.getMessage()); + } + + } + + } catch (IllegalArgumentException e) { + logger.warn(e.getMessage()); + } catch (SecretGifException e) { + raise(e); + } catch (ClientProtocolException e) { + + logger.error(e.toString()); + } catch (IOException e) { + logger.error(e.toString()); + } catch (Exception e) { + e.printStackTrace(); + logger.error(e.toString()); + e.printStackTrace(); + } finally { + + httpget.abort(); + + } + + return localSrcPath; + } + + + private static void raise(SecretGifException e) { + // TODO Auto-generated method stub + + } + + +} diff --git a/src/main/java/com/jimplush/goose/images/ImageUtils.java b/src/main/java/com/jimplush/goose/images/ImageUtils.java new file mode 100644 index 000000000..437cfd1d0 --- /dev/null +++ b/src/main/java/com/jimplush/goose/images/ImageUtils.java @@ -0,0 +1,158 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose.images; + + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.imageio.ImageIO; +import java.awt.color.CMMException; +import java.awt.image.BufferedImage; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.HashMap; + + +public class ImageUtils { + + + private static final Logger logger = LoggerFactory.getLogger(ImageUtils.class); + + /** + * User: Jim Plush + * gets the image dimensions for an image file, pass in the path to the image who's dimensions you want to get + * this will use imageMagick since the Java IO and imaging shit SUCKS for getting mime types and file info for jpg and png files + * + * @param filePath + * @return + */ + public static ImageDetails getImageDimensions(String identifyProgram, String filePath) throws IOException { + ArrayList command = new ArrayList(10); + command.add(identifyProgram); + command.add(filePath); + + // we should get a string back like: /Users/jim/Code/kelly.jpg JPEG 1024x768 1024x768+0+0 8-bit DirectClass 89.7KB 0.000u 0:00.000 + String imageInfo = execToString((String[]) command.toArray(new String[1])); + + ImageDetails imageDetails = new ImageDetails(); + + if (imageInfo == null || imageInfo.contains("no decode delegate for this image format")) { + throw new IOException("Unable to get Image Information (no decode delegate) for: " + filePath); + } + + + // let's break apart the returned line and set the properites in our map + try { + + String[] infoParts = imageInfo.split(" "); + + imageDetails.setMimeType(infoParts[1]); + + String[] dimensions = infoParts[2].split("x"); + imageDetails.setWidth(Integer.parseInt(dimensions[0])); + imageDetails.setHeight(Integer.parseInt(dimensions[1])); + return imageDetails; + + + } catch (NullPointerException e) { + //logger.warn("Unable to get Image Information for: "+filePath + " INFO: "+imageInfo); + throw new IOException("Unable to get Image Information for: " + filePath); + } + + } + + /** + * gets the image dimensions for an image file, pass in the path to the image who's dimensions you want to get, uses the built in java commands + * + * @param filePath + * @return + */ + public static HashMap getImageDimensionsJava(String filePath) throws IOException { + + BufferedImage image = null; + try { + File f = new File(filePath); + image = ImageIO.read(f); + HashMap results = new HashMap(); + results.put("height", image.getHeight()); + results.put("width", image.getWidth()); + return results; + + } catch (CMMException e) { + logger.error("ERROR READING FILE: " + filePath + " \n", e); + throw new IOException("Unable to read file: " + filePath); + } finally { + if (image != null) { + try { + image.flush(); + } catch (Exception e) { + } + } + } + + + } + + /** + * Tries to exec the command, waits for it to finish, logs errors if exit + * status is nonzero, and returns true if exit status is 0 (success). + * + * @param command Description of the Parameter + * @return Description of the Return Value + */ + private static String execToString(String[] command) { + Process p = null; + BufferedReader in = null; + try { + p = Runtime.getRuntime().exec(command); + in = new BufferedReader( + new InputStreamReader(p.getInputStream())); + String line = null; + line = in.readLine(); + p.waitFor(); + + return line; + + } catch (IOException e) { + logger.error(e.toString(), e); + } catch (InterruptedException e) { + logger.error(e.toString(), e); + throw new RuntimeException(e); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + + } + } + if (p != null) { + p.destroy(); + } + } + return null; + + + } + + +} diff --git a/src/main/java/com/jimplush/goose/images/SecretGifException.java b/src/main/java/com/jimplush/goose/images/SecretGifException.java new file mode 100644 index 000000000..9c2eb7f7a --- /dev/null +++ b/src/main/java/com/jimplush/goose/images/SecretGifException.java @@ -0,0 +1,26 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose.images; /** + * User: Jim Plush + * Date: 12/19/10 + */ + + +public class SecretGifException extends Exception{ + +} diff --git a/src/main/java/com/jimplush/goose/network/HtmlFetcher.java b/src/main/java/com/jimplush/goose/network/HtmlFetcher.java new file mode 100644 index 000000000..45cf83990 --- /dev/null +++ b/src/main/java/com/jimplush/goose/network/HtmlFetcher.java @@ -0,0 +1,340 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose.network; + + +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.HttpVersion; +import org.apache.http.client.CookieStore; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.params.CookiePolicy; +import org.apache.http.client.protocol.ClientContext; +import org.apache.http.conn.ClientConnectionManager; +import org.apache.http.conn.params.ConnManagerParams; +import org.apache.http.conn.params.ConnPerRoute; +import org.apache.http.conn.routing.HttpRoute; +import org.apache.http.conn.scheme.PlainSocketFactory; +import org.apache.http.conn.ssl.SSLSocketFactory; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.cookie.Cookie; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; +import org.apache.http.params.BasicHttpParams; +import org.apache.http.params.HttpConnectionParams; +import org.apache.http.params.HttpParams; +import org.apache.http.params.HttpProtocolParams; +import org.apache.http.protocol.BasicHttpContext; +import org.apache.http.protocol.HttpContext; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.*; +import java.net.SocketException; +import java.net.SocketTimeoutException; +import java.net.URLConnection; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * User: jim plush + * Date: 12/16/10 + */ + + +public class HtmlFetcher { + + private static final Logger logger = LoggerFactory.getLogger(HtmlFetcher.class); + + /** + * holds a reference to our override cookie store, we don't want to store + * cookies for head requests, only slows shit down + */ + public static CookieStore emptyCookieStore; + + + /** + * holds the HttpClient object for making requests + */ + private static HttpClient httpClient; + + + static { + initClient(); + } + + + public static HttpClient getHttpClient() { + return httpClient; + } + + + /** + * makes an http fetch to go retreive the HTML from a url, store it to disk and pass it off + * + * @param url + * @return + * @throws MaxBytesException + * @throws NotHtmlException + */ + public static String getHtml(String url) throws MaxBytesException, NotHtmlException { + HttpGet httpget = null; + String htmlResult = null; + HttpEntity entity = null; + InputStream instream = null; + try { + HttpContext localContext = new BasicHttpContext(); + localContext.setAttribute(ClientContext.COOKIE_STORE, HtmlFetcher.emptyCookieStore); + httpget = new HttpGet(url); + + HttpResponse response = httpClient.execute(httpget, localContext); + + entity = response.getEntity(); + + + if (entity != null) { + instream = entity.getContent(); + + // set the encoding type if utf-8 or otherwise + String encodingType = "UTF-8"; + try { + + //todo encoding detection could be improved + encodingType = EntityUtils.getContentCharSet(entity); + + if (encodingType == null) { + encodingType = "UTF-8"; + } + } catch (Exception e) { + if (logger.isDebugEnabled()) { + logger.debug("Unable to get charset for: " + url); + logger.debug("Encoding Type is: " + encodingType); + } + } + + try { + htmlResult = HtmlFetcher.convertStreamToString(instream, 15728640, encodingType).trim(); + } finally { + entity.consumeContent(); + } + + + } else { + logger.error("Unable to fetch URL Properly: " + url); + } + + } catch (NullPointerException e) { + logger.warn(e.toString() + " " + e.getMessage()); + + } catch (MaxBytesException e) { + + logger.error("GRVBIGFAIL: " + url + " Reached max bytes size"); + throw e; + } catch (SocketException e) { + logger.warn(e.getMessage()); + + } catch (SocketTimeoutException e) { + logger.error(e.toString()); + } catch (Exception e) { + logger.error("FAILURE FOR LINK: " + url + " " + e.toString()); + return null; + } finally { + + if (instream != null) { + try { + instream.close(); + } catch (Exception e) { + logger.warn(e.getMessage()); + } + } + if (httpget != null) { + try { + httpget.abort(); + entity = null; + } catch (Exception e) { + + } + } + + } + + if (logger.isDebugEnabled()) { + logger.debug("starting..."); + } + if (htmlResult == null || htmlResult.length() < 1) { + if (logger.isDebugEnabled()) { + logger.debug("HTMLRESULT is empty or null"); + } + throw new NotHtmlException(); + } + + + InputStream is; + String mimeType = null; + try { + is = new ByteArrayInputStream(htmlResult.getBytes("UTF-8")); + + mimeType = URLConnection.guessContentTypeFromStream(is); + + if (mimeType != null) { + + if (mimeType.equals("text/html") == true || mimeType.equals("application/xml") == true) { + return htmlResult; + } else { + if (htmlResult.contains("") == true && htmlResult.contains("<p>") == true) { + return htmlResult; + } + + logger.error("GRVBIGFAIL: " + mimeType + " - " + url); + throw new NotHtmlException(); + } + + } else { + throw new NotHtmlException(); + } + + + } catch (UnsupportedEncodingException e) { + logger.warn(e.getMessage()); + + } catch (IOException e) { + logger.warn(e.getMessage()); + } + + return htmlResult; + } + + + private static void initClient() { + if (logger.isDebugEnabled()) { + logger.debug("Initializing HttpClient"); + } + HttpParams httpParams = new BasicHttpParams(); + HttpConnectionParams.setConnectionTimeout(httpParams, 10 * 1000); + HttpConnectionParams.setSoTimeout(httpParams, 10 * 1000); + ConnManagerParams.setMaxTotalConnections(httpParams, 20000); + + ConnManagerParams.setMaxConnectionsPerRoute(httpParams, new ConnPerRoute() { + public int getMaxForRoute(HttpRoute route) { + return 500; + } + }); + + HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1); + + + /** + * we don't want anything to do with cookies at this time + */ + emptyCookieStore = new CookieStore() { + + public void addCookie(Cookie cookie) { + + } + + ArrayList<Cookie> emptyList = new ArrayList<Cookie>(); + + public List<Cookie> getCookies() { + return emptyList; + } + + public boolean clearExpired(Date date) { + return false; + } + + public void clear() { + + } + }; + + // set request params + httpParams.setParameter("http.protocol.cookie-policy", CookiePolicy.BROWSER_COMPATIBILITY); + httpParams.setParameter("http.User-Agent", "Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8"); + httpParams.setParameter("http.language.Accept-Language", "en-us"); + httpParams.setParameter("http.protocol.content-charset", "UTF-8"); + httpParams.setParameter("Accept", "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5"); + httpParams.setParameter("Cache-Control", "max-age=0"); + httpParams.setParameter("http.connection.stalecheck", false); // turn off stale check checking for performance reasons + + + SchemeRegistry schemeRegistry = new SchemeRegistry(); + schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); + schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); + + final ClientConnectionManager cm = new ThreadSafeClientConnManager(httpParams, schemeRegistry); + + httpClient = new DefaultHttpClient(cm, httpParams); + + httpClient.getParams().setParameter("http.conn-manager.timeout", 120000L); + httpClient.getParams().setParameter("http.protocol.wait-for-continue", 10000L); + httpClient.getParams().setParameter("http.tcp.nodelay", true); + } + + /** + * reads bytes off the string and returns a string + * + * @param is + * @param maxBytes The max bytes that we want to read from the input stream + * @return String + */ + public static String convertStreamToString(InputStream is, int maxBytes, String encodingType) throws MaxBytesException { + + char[] buf = new char[2048]; + Reader r = null; + try { + r = new InputStreamReader(is, encodingType); + StringBuilder s = new StringBuilder(); + int bytesRead = 2048; + while (true) { + + if (bytesRead >= maxBytes) { + throw new MaxBytesException(); + } + + int n = r.read(buf); + bytesRead += 2048; + if (n < 0) + break; + s.append(buf, 0, n); + } + + return s.toString(); + + } catch (SocketTimeoutException e) { + logger.warn(e.toString() + " " + e.getMessage()); + } catch (UnsupportedEncodingException e) { + logger.warn(e.toString() + " Encoding: " + encodingType); + + } catch (IOException e) { + logger.warn(e.toString() + " " + e.getMessage()); + } finally { + if (r != null) { + try { + r.close(); + } catch (Exception e) { + } + } + } + return null; + + } +} diff --git a/src/main/java/com/jimplush/goose/network/MaxBytesException.java b/src/main/java/com/jimplush/goose/network/MaxBytesException.java new file mode 100644 index 000000000..ba070b731 --- /dev/null +++ b/src/main/java/com/jimplush/goose/network/MaxBytesException.java @@ -0,0 +1,29 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose.network; /** + * User: jim plush + * Date: 12/16/10 + */ + +/** + * Thrown when we've reached the max number of bytes we want to process for a given HTML page + * some html pages are janky with tons of spam on them from over the years. + */ +public class MaxBytesException extends Exception { + +} diff --git a/src/main/java/com/jimplush/goose/network/NotHtmlException.java b/src/main/java/com/jimplush/goose/network/NotHtmlException.java new file mode 100644 index 000000000..4cbdaea62 --- /dev/null +++ b/src/main/java/com/jimplush/goose/network/NotHtmlException.java @@ -0,0 +1,30 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose.network; /** + * User: jim plush + * Date: 12/16/10 + */ + + +/** + * Thrown when we're unable to detect any HTML from this page, could be an MP3, PDF or some + * other media type + */ +public class NotHtmlException extends Exception { + +} diff --git a/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java b/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java new file mode 100644 index 000000000..0ae194c44 --- /dev/null +++ b/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java @@ -0,0 +1,188 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose.outputformatters; /** + * User: jim plush + * Date: 12/19/10 + */ + +import com.jimplush.goose.texthelpers.StopWords; +import com.jimplush.goose.texthelpers.WordStats; +import org.apache.commons.lang.StringEscapeUtils; +import org.jsoup.nodes.Element; +import org.jsoup.nodes.TextNode; +import org.jsoup.select.Elements; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * this class will be responsible for taking our top node and stripping out junk we don't want + * and getting it ready for how we want it presented to the user + */ +public class DefaultOutputFormatter implements OutputFormatter { + private static final Logger logger = LoggerFactory.getLogger(DefaultOutputFormatter.class); + + private Element topNode; + + /** + * Depricated use {@link #getFormattedText(Element)} + * @param topNode the top most node to format + * @return the prepared Element + */ + @Deprecated + public Element getFormattedElement(Element topNode) { + + this.topNode = topNode; + + removeNodesWithNegativeScores(); + + convertLinksToText(); + + replaceTagsWithText(); + + removeParagraphsWithFewWords(); + + return topNode; + + } + + /** + * Removes all unnecessarry elements and formats the selected text nodes + * @param topNode the top most node to format + * @return a formatted string with all HTML removed + */ + public String getFormattedText(Element topNode) { + + this.topNode = topNode; + + removeNodesWithNegativeScores(); + + convertLinksToText(); + + replaceTagsWithText(); + + removeParagraphsWithFewWords(); + + return getFormattedText(); + } + + /** + * Depricated use {@link #getFormattedText(Element)} + * takes an element and turns the P tags into \n\n + * // todo move this to an output formatter object instead of inline here + * + * @return + */ + @Deprecated + public String getFormattedText() { + + StringBuilder sb = new StringBuilder(); + + Elements nodes = topNode.getAllElements(); + for (Element e : nodes) { + if (e.tagName().equals("p")) { + String text = StringEscapeUtils.unescapeHtml(e.text()).trim(); + sb.append(text); + sb.append("\n\n"); + } + } + + return sb.toString(); + } + + /** + * cleans up and converts any nodes that should be considered text into text + */ + private void convertLinksToText() { + if (logger.isDebugEnabled()) { + logger.debug("Turning links to text"); + } + Elements links = topNode.getElementsByTag("a"); + for (Element item : links) { + if (item.getElementsByTag("img").size() == 0) { + TextNode tn = new TextNode(item.text(), topNode.baseUri()); + item.replaceWith(tn); + } + } + } + + /** + * if there are elements inside our top node that have a negative gravity score, let's + * give em the boot + */ + private void removeNodesWithNegativeScores() { + Elements gravityItems = this.topNode.select("*[gravityScore]"); + for (Element item : gravityItems) { + int score = Integer.parseInt(item.attr("gravityScore")); + if (score < 1) { + item.remove(); + } + } + } + + /** + * replace common tags with just text so we don't have any crazy formatting issues + * so replace <br>, <i>, <strong>, etc.... with whatever text is inside them + */ + private void replaceTagsWithText() { + + Elements strongs = topNode.getElementsByTag("strong"); + for (Element item : strongs) { + TextNode tn = new TextNode(item.text(), topNode.baseUri()); + item.replaceWith(tn); + } + + Elements bolds = topNode.getElementsByTag("b"); + for (Element item : bolds) { + TextNode tn = new TextNode(item.text(), topNode.baseUri()); + item.replaceWith(tn); + } + + Elements italics = topNode.getElementsByTag("i"); + for (Element item : italics) { + TextNode tn = new TextNode(item.text(), topNode.baseUri()); + item.replaceWith(tn); + } + } + + /** + * remove paragraphs that have less than x number of words, would indicate that it's some sort of link + */ + private void removeParagraphsWithFewWords() { + if (logger.isDebugEnabled()) { + logger.debug("removeParagraphsWithFewWords starting..."); + } + + Elements allNodes = this.topNode.getAllElements(); + for (Element el : allNodes) { + + try { + // get stop words that appear in each node + + WordStats stopWords = StopWords.getStopWordCount(el.text()); + + if (stopWords.getStopWordCount() < 5 && el.getElementsByTag("object").size() == 0 && el.getElementsByTag("embed").size() == 0) { + el.remove(); + } + } catch (IllegalArgumentException e) { + logger.error(e.getMessage()); + } + //} + } + } + +} diff --git a/src/main/java/com/jimplush/goose/outputformatters/OutputFormatter.java b/src/main/java/com/jimplush/goose/outputformatters/OutputFormatter.java new file mode 100644 index 000000000..4888874a8 --- /dev/null +++ b/src/main/java/com/jimplush/goose/outputformatters/OutputFormatter.java @@ -0,0 +1,35 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose.outputformatters; + +import org.jsoup.nodes.Element; + +/** + * User: jim plush + * Date: 12/19/10 + */ +public interface OutputFormatter { + + public Element getFormattedElement(Element topNode); + + + public String getFormattedText(); + + public String getFormattedText(Element topNode); + +} diff --git a/src/main/java/com/jimplush/goose/texthelpers/HashUtils.java b/src/main/java/com/jimplush/goose/texthelpers/HashUtils.java new file mode 100644 index 000000000..3804e40a6 --- /dev/null +++ b/src/main/java/com/jimplush/goose/texthelpers/HashUtils.java @@ -0,0 +1,94 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose.texthelpers; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class HashUtils +{ + /** + * Return a string of 40 lower case hex characters. + * + * @param input + * @return a string of 40 hex characters + */ + public static String sha1(String input) + { + String hexHash = null; + try { + MessageDigest md = MessageDigest.getInstance("SHA1"); + md.update(input.getBytes()); + byte[] output = md.digest(); + hexHash = bytesToLowerCaseHex(output); + } catch (NoSuchAlgorithmException nsae) { + throw new RuntimeException(nsae); + } + return hexHash; + } + + /** + * Return a string of 32 lower case hex characters. + * + * @param input + * @return a string of 32 hex characters + */ + public static String md5(String input) + { + String hexHash = null; + try { + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(input.getBytes()); + byte[] output = md.digest(); + hexHash = bytesToLowerCaseHex(output); + } catch (NoSuchAlgorithmException nsae) { + throw new RuntimeException(nsae); + } + return hexHash; + } + + @SuppressWarnings("unused") + private static String bytesToUpperCaseHex(byte[] b) + { + char hexDigit[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + StringBuffer buf = new StringBuffer(); + for (int j = 0; j < b.length; j++) { + buf.append(hexDigit[(b[j] >> 4) & 0x0f]); + buf.append(hexDigit[b[j] & 0x0f]); + } + return buf.toString(); + } + + private static String bytesToLowerCaseHex(byte[] data) + { + StringBuffer buf = new StringBuffer(); + for (int i = 0; i < data.length; i++) { + int halfbyte = (data[i] >>> 4) & 0x0F; + int two_halfs = 0; + do { + if ((0 <= halfbyte) && (halfbyte <= 9)) + buf.append((char) ('0' + halfbyte)); + else + buf.append((char) ('a' + (halfbyte - 10))); + halfbyte = data[i] & 0x0F; + } while (two_halfs++ < 1); + } + return buf.toString(); + } + +} \ No newline at end of file diff --git a/src/main/java/com/jimplush/goose/texthelpers/ReplaceSequence.java b/src/main/java/com/jimplush/goose/texthelpers/ReplaceSequence.java new file mode 100644 index 000000000..f02a4dd5c --- /dev/null +++ b/src/main/java/com/jimplush/goose/texthelpers/ReplaceSequence.java @@ -0,0 +1,126 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose.texthelpers; +/** + * Created by IntelliJ IDEA. + * User: robbie + * Date: 5/13/11 + * Time: 12:03 AM + */ + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Wraps the usage of making multiple string replacements in an ordered sequence. + * For Example... instead of doing this over and over:</p> + * <blockquote> + * <pre> + * String text = " Some example text "; + * text = text.{@link String#replaceAll(String, String) replaceAll}("e", "E"); + * text = text.{@link String#replaceAll(String, String) replaceAll}(" ", "_"); + * text = text.{@link String#replaceAll(String, String) replaceAll}("^\\s+$", ""); + * </pre> + * </blockquote> + * You can use a <code>ReplaceSequence</code> like this:</p> + * <blockquote> + * <pre> + * static final betterReplacements = ReplaceSequence.{@link #create(String, String) create}("e", "E").{@link #append(String, String) append}(" ", "_").{@link #append(String) append}("^\\s+$"); + * + * void fixMyString(String text) { + * return betterReplacements.{@link #replaceAll(String) replaceAll}(text); + * } + * </pre> + * </blockquote> + * + * Internally, an ordered list of {@link Matcher}s and its associated replacement is built as the {@link #append} method is called.<br/> + * Each matcher is {@link Matcher#reset(CharSequence) reset} with the input specified in the {@link #replaceAll(String)} method.</p> + * Use of this class can improve performance if the sequence of replacements is intended to be used repeatedly throughout the life of an application.<br/> + * This is due to the fact that each {@link Pattern} is only compiled once and each {@link Matcher} is only generated once. + */ +public class ReplaceSequence { + + /** + * Creates a new <code>ReplaceSequence</code> with the first pattern to be replaced with an empty <code>String</code> + * @param firstPattern The regex {@link Pattern pattern} string for the first replacement + * @return a new instance + */ + public static ReplaceSequence create(String firstPattern) { + return create(firstPattern, string.empty); + } + + /** + * Creates a new <code>ReplaceSequence</code> with the first pattern to be replaced with the specified <code>replaceWith</code> parameter. + * @param firstPattern The regex {@link Pattern pattern} {@link String} for the first replacement + * @param replaceWith The {@link String} to replace matches of the specified pattern + * @return a new instance + */ + public static ReplaceSequence create(String firstPattern, String replaceWith) { + ReplaceSequence result = new ReplaceSequence(StringReplacement.compile(firstPattern, replaceWith)); + return result; + } + + /** + * Appends a new pattern to this instance in a builder pattern + * @param pattern The regex {@link Pattern pattern} {@link String} for this replacement + * @return this instance of itself for use in a builder pattern + */ + public ReplaceSequence append(String pattern) { + return append(pattern, string.empty); + } + + /** + * Appends a new pattern to this instance in a builder pattern + * @param pattern The regex {@link Pattern pattern} {@link String} for this replacement + * @param replaceWith The {@link String} to replace matches of the specified pattern + * @return this instance of itself for use in a builder pattern + */ + public ReplaceSequence append(String pattern, String replaceWith) { + replacements.add(StringReplacement.compile(pattern, replaceWith)); + return this; + } + + /** + * Applies each of the replacements specified via the initial {@link #create(String)} and/or any additional via {@link #append(String)} + * @param input the {@link String} to apply all of the replacements to + * @return the resulting {@link String} after all replacements have been applied + */ + public String replaceAll(String input) { + if (string.isNullOrEmpty(input)) return string.empty; + for (StringReplacement rp : replacements) { + input = rp.replaceAll(input); + } + + return input; + } + + // shhhhh... it's private! + private List<StringReplacement> replacements = new ArrayList<StringReplacement>(); + + private ReplaceSequence(StringReplacement pair) { + replacements.add(pair); + } + +} + + diff --git a/src/main/java/com/jimplush/goose/texthelpers/StopWords.java b/src/main/java/com/jimplush/goose/texthelpers/StopWords.java new file mode 100644 index 000000000..35db66354 --- /dev/null +++ b/src/main/java/com/jimplush/goose/texthelpers/StopWords.java @@ -0,0 +1,117 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose.texthelpers; + + +import java.util.*; + +public class StopWords { + private static final Set<String> STOP_WORDS; + + static { + String elements[] = {"a's", "able", "about", "above", "according", "accordingly", "across", "actually", + "after", "afterwards", "again", "against", "ain't", "all", "allow", "allows", "almost", "alone", + "along", "already", "also", "although", "always", "am", "among", "amongst", "an", "and", "another", + "any", "anybody", "anyhow", "anyone", "anything", "anyway", "anyways", "anywhere", "apart", "appear", + "appreciate", "appropriate", "are", "aren't", "around", "as", "aside", "ask", "asking", "associated", + "at", "available", "away", "awfully", "be", "became", "because", "become", "becomes", "becoming", + "been", "before", "beforehand", "behind", "being", "believe", "below", "beside", "besides", "best", + "better", "between", "beyond", "both", "brief", "but", "by", "c", "c'mon", "c's", "came", "campaign", "can", + "can't", "cannot", "cant", "cause", "causes", "certain", "certainly", "changes", "clearly", "co", + "com", "come", "comes", "concerning", "consequently", "consider", "considering", "contain", + "containing", "contains", "corresponding", "could", "couldn't", "course", "currently", + "definitely", "described", "despite", "did", "didn't", "different", "do", "does", "doesn't", "doing", + "don't", "done", "down", "downwards", "during", "each", "edu", "eight", "either", "else", + "elsewhere", "enough", "endorsed", "entirely", "especially", "et", "etc", "even", "ever", "every", "everybody", + "everyone", "everything", "everywhere", "ex", "exactly", "example", "except", "far", "few", + "fifth", "first", "financial", "five", "followed", "following", "follows", "for", "former", "formerly", "forth", + "four", "from", "further", "furthermore", "get", "gets", "getting", "given", "gives", "go", + "goes", "going", "gone", "got", "gotten", "greetings", "had", "hadn't", "happens", "hardly", + "has", "hasn't", "have", "haven't", "having", "he", "he's", "hello", "help", "hence", "her", "here", + "here's", "hereafter", "hereby", "herein", "hereupon", "hers", "herself", "hi", "him", "himself", + "his", "hither", "hopefully", "how", "howbeit", "however", "i'd", "i'll", "i'm", "i've", "ie", + "if", "ignored", "immediate", "in", "inasmuch", "inc", "indeed", "indicate", "indicated", "indicates", + "inner", "insofar", "instead", "into", "inward", "is", "isn't", "it", "it'd", "it'll", "it's", "its", + "itself", "just", "keep", "keeps", "kept", "know", "knows", "known", "last", "lately", + "later", "latter", "latterly", "least", "less", "lest", "let", "let's", "like", "liked", "likely", + "little", "look", "looking", "looks", "ltd", "mainly", "many", "may", "maybe", "me", "mean", + "meanwhile", "merely", "might", "more", "moreover", "most", "mostly", "much", "must", "my", "myself", + "name", "namely", "nd", "near", "nearly", "necessary", "need", "needs", "neither", "never", + "nevertheless", "new", "next", "nine", "no", "nobody", "non", "none", "noone", "nor", "normally", + "not", "nothing", "novel", "now", "nowhere", "obviously", "of", "off", "often", "oh", "ok", + "okay", "old", "on", "once", "one", "ones", "only", "onto", "or", "other", "others", "otherwise", + "ought", "our", "ours", "ourselves", "out", "outside", "over", "overall", "own", "particular", + "particularly", "per", "perhaps", "placed", "please", "plus", "possible", "presumably", "probably", + "provides", "quite", "quote", "quarterly", "rather", "really", "reasonably", "regarding", + "regardless", "regards", "relatively", "respectively", "right", "said", "same", "saw", "say", + "saying", "says", "second", "secondly", "see", "seeing", "seem", "seemed", "seeming", "seems", "seen", + "self", "selves", "sensible", "sent", "serious", "seriously", "seven", "several", "shall", "she", + "should", "shouldn't", "since", "six", "so", "some", "somebody", "somehow", "someone", "something", + "sometime", "sometimes", "somewhat", "somewhere", "soon", "sorry", "specified", "specify", + "specifying", "still", "sub", "such", "sup", "sure", "t's", "take", "taken", "tell", "tends", + "than", "thank", "thanks", "thanx", "that", "that's", "thats", "the", "their", "theirs", "them", + "themselves", "then", "thence", "there", "there's", "thereafter", "thereby", "therefore", "therein", + "theres", "thereupon", "these", "they", "they'd", "they'll", "they're", "they've", "think", "third", + "this", "thorough", "thoroughly", "those", "though", "three", "through", "throughout", "thru", "thus", + "to", "together", "too", "took", "toward", "towards", "tried", "tries", "truly", "try", "trying", + "twice", "two", "under", "unfortunately", "unless", "unlikely", "until", "unto", "up", + "upon", "us", "use", "used", "useful", "uses", "using", "usually", "uucp", "value", "various", + "very", "via", "viz", "vs", "want", "wants", "was", "wasn't", "way", "we", "we'd", "we'll", + "we're", "we've", "welcome", "well", "went", "were", "weren't", "what", "what's", "whatever", "when", + "whence", "whenever", "where", "where's", "whereafter", "whereas", "whereby", "wherein", "whereupon", + "wherever", "whether", "which", "while", "whither", "who", "who's", "whoever", "whole", "whom", + "whose", "why", "will", "willing", "wish", "with", "within", "without", "won't", "wonder", "would", + "would", "wouldn't", "yes", "yet", "you", "you'd", "you'll", "you're", "you've", "your", + "yours", "yourself", "yourselves", "zero", "official", "sharply", "criticized"}; + STOP_WORDS = Collections.unmodifiableSet(new HashSet<String>(Arrays.asList(elements))); + } + + // the confusing pattern below is basically just match any non-word character excluding white-space. + private static final StringReplacement PUNCTUATION = StringReplacement.compile("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\p{Pc}\\s]", string.empty); + + public static String removePunctuation(String str) { + return PUNCTUATION.replaceAll(str); + } + + + public static WordStats getStopWordCount(String content) { + if (string.isNullOrEmpty(content)) return WordStats.EMPTY; + + WordStats ws = new WordStats(); + + String strippedInput = removePunctuation(content); + String[] words = string.SPACE_SPLITTER.split(strippedInput); + + // stem each word in the array if it is not null or a stop word + List<String> stopWords = new ArrayList<String>(); + for (int i = 0; i < words.length; i++) { + String word = words[i]; + if (string.isNullOrEmpty(word)) continue; + String wordLower = word.toLowerCase(); + if (STOP_WORDS.contains(wordLower)) + stopWords.add(wordLower); + } + + ws.setWordCount(words.length); + ws.setStopWordCount(stopWords.size()); + ws.setStopWords(stopWords); + return ws; + } + + +} diff --git a/src/main/java/com/jimplush/goose/texthelpers/StringReplacement.java b/src/main/java/com/jimplush/goose/texthelpers/StringReplacement.java new file mode 100644 index 000000000..33c829641 --- /dev/null +++ b/src/main/java/com/jimplush/goose/texthelpers/StringReplacement.java @@ -0,0 +1,49 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose.texthelpers; +/** + * Created by IntelliJ IDEA. + * User: robbie + * Date: 5/13/11 + * Time: 11:38 AM + */ + +import java.util.regex.Pattern; + +public class StringReplacement { + private Pattern pattern; + private String replaceWith; + + private StringReplacement(Pattern pattern, String replaceWith) { + this.pattern = pattern; + this.replaceWith = replaceWith; + } + + public static StringReplacement compile(String pattern, String replaceWith) { + if (string.isNullOrEmpty(pattern)) throw new IllegalArgumentException("Patterns must not be null or empty!"); + Pattern p = Pattern.compile(pattern); + return new StringReplacement(p, replaceWith); + } + + public String replaceAll(String input) { + if (string.isNullOrEmpty(input)) return string.empty; + return pattern.matcher(input).replaceAll(replaceWith); + } +} + + diff --git a/src/main/java/com/jimplush/goose/texthelpers/StringSplitter.java b/src/main/java/com/jimplush/goose/texthelpers/StringSplitter.java new file mode 100644 index 000000000..75eb916fb --- /dev/null +++ b/src/main/java/com/jimplush/goose/texthelpers/StringSplitter.java @@ -0,0 +1,45 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose.texthelpers; +/** + * Created by IntelliJ IDEA. + * User: robbie + * Date: 5/13/11 + * Time: 3:53 PM + */ + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.regex.Pattern; + +public class StringSplitter { + + private Pattern pattern; + + public StringSplitter(String pattern) { + this.pattern = Pattern.compile(pattern); + } + + public String[] split(String input) { + if (string.isNullOrEmpty(input)) return string.emptyArray; + return pattern.split(input); + } +} + + diff --git a/src/main/java/com/jimplush/goose/texthelpers/WordStats.java b/src/main/java/com/jimplush/goose/texthelpers/WordStats.java new file mode 100644 index 000000000..3cfef3bd2 --- /dev/null +++ b/src/main/java/com/jimplush/goose/texthelpers/WordStats.java @@ -0,0 +1,73 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose.texthelpers; + +import java.util.ArrayList; +import java.util.List; + +/** + * User: Jim Plush + * Date: Oct 29, 2010 + * Time: 3:59:44 PM + */ +public class WordStats { + + public static final WordStats EMPTY = new WordStats(); + + /** + * total number of stopwords or good words that we can calculate + */ + private int stopWordCount = 0; + + /** + * total number of words on a node + */ + private int wordCount = 0; + + /** + * holds an actual list of the stop words we found + */ + private List<String> stopWords = new ArrayList<String>(); + + public List<String> getStopWords() { + return stopWords; + } + + public void setStopWords(List<String> stopWords) { + this.stopWords = stopWords; + } + + + public int getStopWordCount() { + return stopWordCount; + } + + public void setStopWordCount(int stopWordCount) { + this.stopWordCount = stopWordCount; + } + + public int getWordCount() { + return wordCount; + } + + public void setWordCount(int wordCount) { + this.wordCount = wordCount; + } + + +} diff --git a/src/main/java/com/jimplush/goose/texthelpers/string.java b/src/main/java/com/jimplush/goose/texthelpers/string.java new file mode 100644 index 000000000..3f41f03b1 --- /dev/null +++ b/src/main/java/com/jimplush/goose/texthelpers/string.java @@ -0,0 +1,45 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose.texthelpers; +/** + * Created by IntelliJ IDEA. + * User: robbie + * Date: 5/13/11 + * Time: 12:11 AM + */ + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class string { + + private string(){} + + public static final String empty = ""; + public static final String[] emptyArray = new String[] {empty}; + + public static boolean isNullOrEmpty(String input) { + if (input == null) return true; + if (input.length() == 0) return true; + return false; + } + + public static StringSplitter SPACE_SPLITTER = new StringSplitter(" "); +} + + diff --git a/src/main/java/com/pshken/geese/GeeseContentExtractor.java b/src/main/java/com/pshken/geese/GeeseContentExtractor.java new file mode 100644 index 000000000..f5114ec9b --- /dev/null +++ b/src/main/java/com/pshken/geese/GeeseContentExtractor.java @@ -0,0 +1,844 @@ +package com.pshken.geese; + +import com.jimplush.goose.Article; +import com.jimplush.goose.Configuration; +import com.jimplush.goose.cleaners.DefaultDocumentCleaner; +import com.jimplush.goose.cleaners.DocumentCleaner; +import com.jimplush.goose.images.BestImageGuesser; +import com.jimplush.goose.images.ImageExtractor; +import com.jimplush.goose.network.*; +import com.jimplush.goose.outputformatters.DefaultOutputFormatter; +import com.jimplush.goose.outputformatters.OutputFormatter; +import com.jimplush.goose.texthelpers.*; +import org.apache.commons.lang.StringEscapeUtils; +import org.apache.http.client.HttpClient; +import org.jsoup.nodes.*; +import org.jsoup.select.Elements; +import org.jsoup.select.Selector; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.*; + + +public class GeeseContentExtractor { + + + // PRIVATE PROPERTIES BELOW + private static final StringReplacement MOTLEY_REPLACEMENT = StringReplacement.compile("�", string.empty); + + private static final StringReplacement ESCAPED_FRAGMENT_REPLACEMENT = StringReplacement.compile("#!", "?_escaped_fragment_="); + + private static final ReplaceSequence TITLE_REPLACEMENTS = ReplaceSequence.create("»").append("»"); + private static final StringSplitter PIPE_SPLITTER = new StringSplitter("\\|"); + private static final StringSplitter DASH_SPLITTER = new StringSplitter(" - "); + private static final StringSplitter ARROWS_SPLITTER = new StringSplitter("»"); + private static final StringSplitter COLON_SPLITTER = new StringSplitter(":"); + private static final StringSplitter SPACE_SPLITTER = new StringSplitter(" "); + + private static final Set<String> NO_STRINGS = new HashSet<String>(0); + private static final String A_REL_TAG_SELECTOR = "a[rel=tag], a[href*=/tag/]"; + + + /** + * holds the configuration settings we want to use + */ + private Configuration config; + + // sets the default cleaner class to prep the HTML for parsing + private DocumentCleaner documentCleaner; + // the MD5 of the URL we're currently parsing, used to references the images we download to the url so we + // can more easily clean up resources when we're done with the page. + private String linkhash; + // once we have our topNode then we want to format that guy for output to the user + private OutputFormatter outputFormatter; + private ImageExtractor imageExtractor; + + + /** + * you can optionally pass in a configuration object here that will allow you to override the settings + * that goose comes default with + */ + public GeeseContentExtractor() { + this.config = new Configuration(); + } + + /** + * overloaded to accept a custom configuration object + * + * @param config + */ + public GeeseContentExtractor(Configuration config) { + this.config = config; + } + + + public Article extractContent(String html){ + return performExtraction(html); + } + + + public Article performExtraction(String html){ + + ParseWrapperGeese parseWrapper = new ParseWrapperGeese(); + Article article = null; + try { + + Document doc = parseWrapper.parse(html); + + article = new Article(); + + // before we cleanse, provide consumers with an opportunity to extract the publish date + article.setPublishDate(config.getPublishDateExtractor().extract(doc)); + + // now allow for any additional data to be extracted + article.setAdditionalData(config.getAdditionalDataExtractor().extract(doc)); + + // now perform a nice deep cleansing + DocumentCleaner documentCleaner = getDocCleaner(); + doc = documentCleaner.clean(doc); + + article.setTitle(getTitle(doc)); + article.setMetaDescription(getMetaDescription(doc)); + article.setMetaKeywords(getMetaKeywords(doc)); + + // grab the text nodes of any <a ... rel="tag">Tag Name</a> elements + article.setTags(extractTags(doc)); + //article.setDomain(article.getCanonicalLink()); + + + // extract the content of the article + article.setTopNode(calculateBestNodeBasedOnClustering(doc)); + + if (article.getTopNode() != null) { + + // extract any movie embeds out from our main article content + article.setMovies(extractVideos(article.getTopNode())); + + + //if (config.isEnableImageFetching()) { + //HttpClient httpClient = HtmlFetcher.getHttpClient(); + //imageExtractor = getImageExtractor(httpClient); + //article.setTopImage(imageExtractor.getBestImage(doc, article.getTopNode())); + + //} + + // grab siblings and remove high link density elements + cleanupNode(article.getTopNode()); + + + outputFormatter = getOutputFormatter(); + outputFormatter.getFormattedElement(article.getTopNode()); + + + article.setCleanedArticleText(outputFormatter.getFormattedText()); + + //if (config.isEnableImageFetching()) { + + //} + + } + + // cleans up all the temp images that we've downloaded + releaseResources(); + + } catch (Exception e) { + //logger.error("General Exception occured on url: " + urlToCrawl + " " + e.toString()); + // throw new RuntimeException(e); + } + + + return article; + + } + + private Set<String> extractTags(Element node) { + if (node.children().size() == 0) return NO_STRINGS; + + Elements elements = Selector.select(A_REL_TAG_SELECTOR, node); + if (elements.size() == 0) return NO_STRINGS; + + Set<String> tags = new HashSet<String>(elements.size()); + for (Element el : elements) { + String tag = el.text(); + if (!string.isNullOrEmpty(tag)) tags.add(tag); + } + + return tags; + } + + // used for gawker type ajax sites with pound sites + private String getUrlToCrawl(String urlToCrawl) { + String finalURL; + if (urlToCrawl.contains("#!")) { + finalURL = ESCAPED_FRAGMENT_REPLACEMENT.replaceAll(urlToCrawl); + } else { + finalURL = urlToCrawl; + } + + return finalURL; + } + + + // todo create a setter for this for people to override output formatter + private OutputFormatter getOutputFormatter() { + if (outputFormatter == null) { + return new DefaultOutputFormatter(); + } else { + return outputFormatter; + } + + } + + + private ImageExtractor getImageExtractor(HttpClient httpClient, String urlToCrawl) { + + if (imageExtractor == null) { + BestImageGuesser bestImageGuesser = new BestImageGuesser(this.config, httpClient, urlToCrawl); + return bestImageGuesser; + } else { + return imageExtractor; + } + + } + + /** + * todo allow for setter to override the default documentCleaner in case user wants more flexibility + * + * @return + */ + private DocumentCleaner getDocCleaner() { + if (this.documentCleaner == null) { + this.documentCleaner = new DefaultDocumentCleaner(); + } + return this.documentCleaner; + } + + /** + * attemps to grab titles from the html pages, lots of sites use different delimiters + * for titles so we'll try and do our best guess. + * + * + * @param doc + * @return + */ + private String getTitle(Document doc) { + String title = string.empty; + + try { + + Elements titleElem = doc.getElementsByTag("title"); + if (titleElem == null || titleElem.isEmpty()) return string.empty; + + String titleText = titleElem.first().text(); + + if (string.isNullOrEmpty(titleText)) return string.empty; + + boolean usedDelimeter = false; + + if (titleText.contains("|")) { + titleText = doTitleSplits(titleText, PIPE_SPLITTER); + usedDelimeter = true; + } + + if (!usedDelimeter && titleText.contains("-")) { + titleText = doTitleSplits(titleText, DASH_SPLITTER); + usedDelimeter = true; + } + if (!usedDelimeter && titleText.contains("»")) { + titleText = doTitleSplits(titleText, ARROWS_SPLITTER); + usedDelimeter = true; + } + + if (!usedDelimeter && titleText.contains(":")) { + titleText = doTitleSplits(titleText, COLON_SPLITTER); + } + + // encode unicode charz + title = StringEscapeUtils.escapeHtml(titleText); + + // todo this is a hack until I can fix this.. weird motely crue error with + // http://money.cnn.com/2010/10/25/news/companies/motley_crue_bp.fortune/index.htm?section=money_latest + title = MOTLEY_REPLACEMENT.replaceAll(title); + + } catch (NullPointerException e) { + //logger.error(e.toString()); + } + return title; + + } + + /** + * based on a delimeter in the title take the longest piece or do some custom logic based on the site + * + * @param title + * @param splitter + * @return + */ + private String doTitleSplits(String title, StringSplitter splitter) { + int largetTextLen = 0; + int largeTextIndex = 0; + + String[] titlePieces = splitter.split(title); + + // take the largest split + for (int i = 0; i < titlePieces.length; i++) { + String current = titlePieces[i]; + if (current.length() > largetTextLen) { + largetTextLen = current.length(); + largeTextIndex = i; + } + } + + return TITLE_REPLACEMENTS.replaceAll(titlePieces[largeTextIndex]).trim(); + } + + private String getMetaContent(Document doc, String metaName) { + Elements meta = doc.select(metaName); + if (meta.size() > 0) { + String content = meta.first().attr("content"); + return string.isNullOrEmpty(content) ? string.empty : content.trim(); + } + return string.empty; + } + + + /** + * if the article has meta description set in the source, use that + */ + private String getMetaDescription(Document doc) { + return getMetaContent(doc, "meta[name=description]"); + } + + /** + * if the article has meta keywords set in the source, use that + */ + private String getMetaKeywords(Document doc) { + return getMetaContent(doc, "meta[name=keywords]"); + } + + /** + * if the article has meta canonical link set in the url + */ + private String getCanonicalLink(Document doc, String baseUrl) { + Elements meta = doc.select("link[rel=canonical]"); + if (meta.size() > 0) { + String href = meta.first().attr("href"); + return string.isNullOrEmpty(href) ? string.empty : href.trim(); + } else { + return baseUrl; + } + + } + + private String getDomain(String canonicalLink) { + try { + return new URL(canonicalLink).getHost(); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + } + + /** + * we're going to start looking for where the clusters of paragraphs are. We'll score a cluster based on the number of stopwords + * and the number of consecutive paragraphs together, which should form the cluster of text that this node is around + * also store on how high up the paragraphs are, comments are usually at the bottom and should get a lower score + * + * @return + */ + private Element calculateBestNodeBasedOnClustering(Document doc) { + Element topNode = null; + + // grab all the paragraph elements on the page to start to inspect the likely hood of them being good peeps + ArrayList<Element> nodesToCheck = getNodesToCheck(doc); + + double startingBoost = 1.0; + int cnt = 0; + int i = 0; + + // holds all the parents of the nodes we're checking + Set<Element> parentNodes = new HashSet<Element>(); + + + ArrayList<Element> nodesWithText = new ArrayList<Element>(); + + + for (Element node : nodesToCheck) { + + String nodeText = node.text(); + WordStats wordStats = StopWords.getStopWordCount(nodeText); + boolean highLinkDensity = isHighLinkDensity(node); + + + if (wordStats.getStopWordCount() > 2 && !highLinkDensity) { + + nodesWithText.add(node); + } + + } + + int numberOfNodes = nodesWithText.size(); + int negativeScoring = 0; // we shouldn't give more negatives than positives + // we want to give the last 20% of nodes negative scores in case they're comments + double bottomNodesForNegativeScore = (float) numberOfNodes * 0.25; + + for (Element node : nodesWithText) { + + // add parents and grandparents to scoring + // only add boost to the middle paragraphs, top and bottom is usually jankz city + // so basically what we're doing is giving boost scores to paragraphs that appear higher up in the dom + // and giving lower, even negative scores to those who appear lower which could be commenty stuff + + float boostScore = 0; + + if (isOkToBoost(node)) { + if (cnt >= 0) { + boostScore = (float) ((1.0 / startingBoost) * 50); + startingBoost++; + } + } + + + // check for negative node values + if (numberOfNodes > 15) { + if ((numberOfNodes - i) <= bottomNodesForNegativeScore) { + float booster = (float) bottomNodesForNegativeScore - (float) (numberOfNodes - i); + boostScore = -(float) Math.pow(booster, (float) 2); + + // we don't want to score too highly on the negative side. + float negscore = Math.abs(boostScore) + negativeScoring; + if (negscore > 40) { + boostScore = 5; + } + } + } + + String nodeText = node.text(); + WordStats wordStats = StopWords.getStopWordCount(nodeText); + int upscore = (int) (wordStats.getStopWordCount() + boostScore); + updateScore(node.parent(), upscore); + updateScore(node.parent().parent(), upscore / 2); + updateNodeCount(node.parent(), 1); + updateNodeCount(node.parent().parent(), 1); + + if (!parentNodes.contains(node.parent())) { + parentNodes.add(node.parent()); + } + + if (!parentNodes.contains(node.parent().parent())) { + parentNodes.add(node.parent().parent()); + } + + cnt++; + i++; + } + + + // now let's find the parent node who scored the highest + + int topNodeScore = 0; + for (Element e : parentNodes) { + //int score = Integer.parseInt(e.attr("gravityScore")) * Integer.parseInt(e.attr("gravityNodes")); + int score = getScore(e); + if (score > topNodeScore) { + topNode = e; + topNodeScore = score; + } + + if (topNode == null) { + topNode = e; + } + } + + return topNode; + + + } + + /** + * returns a list of nodes we want to search on like paragraphs and tables + * + * @return + */ + private ArrayList<Element> getNodesToCheck(Document doc) { + ArrayList<Element> nodesToCheck = new ArrayList<Element>(); + + nodesToCheck.addAll(doc.getElementsByTag("p")); + nodesToCheck.addAll(doc.getElementsByTag("pre")); + nodesToCheck.addAll(doc.getElementsByTag("td")); + return nodesToCheck; + + } + + /** + * checks the density of links within a node, is there not much text and most of it contains linky shit? + * if so it's no good + * + * @param e + * @return + */ + private static boolean isHighLinkDensity(Element e) { + + Elements links = e.getElementsByTag("a"); + + if (links.size() == 0) { + return false; + } + + String text = e.text().trim(); + String[] words = SPACE_SPLITTER.split(text); + float numberOfWords = words.length; + + + // let's loop through all the links and calculate the number of words that make up the links + StringBuilder sb = new StringBuilder(); + for (Element link : links) { + sb.append(link.text()); + } + String linkText = sb.toString(); + String[] linkWords = SPACE_SPLITTER.split(linkText); + float numberOfLinkWords = linkWords.length; + + float numberOfLinks = links.size(); + + float linkDivisor = numberOfLinkWords / numberOfWords; + float score = linkDivisor * numberOfLinks; + + if (score > 1) { + return true; + } + + return false; + } + + /** + * alot of times the first paragraph might be the caption under an image so we'll want to make sure if we're going to + * boost a parent node that it should be connected to other paragraphs, at least for the first n paragraphs + * so we'll want to make sure that the next sibling is a paragraph and has at least some substatial weight to it + * + * + * @param node + * @return + */ + private boolean isOkToBoost(Element node) { + + int stepsAway = 0; + + Element sibling = node.nextElementSibling(); + while (sibling != null) { + + if (sibling.tagName().equals("p")) { + if (stepsAway >= 3) { + return false; + } + + String paraText = sibling.text(); + WordStats wordStats = StopWords.getStopWordCount(paraText); + if (wordStats.getStopWordCount() > 5) { + return true; + } + + } + + // increase how far away the next paragraph is from this node + stepsAway++; + + sibling = sibling.nextElementSibling(); + } + + + return false; + } + + + /** + * adds a score to the gravityScore Attribute we put on divs + * we'll get the current score then add the score we're passing in to the current + * + * @param node + * @param addToScore - the score to add to the node + */ + private void updateScore(Element node, int addToScore) { + int currentScore; + try { + String scoreString = node.attr("gravityScore"); + currentScore = string.isNullOrEmpty(scoreString) ? 0 : Integer.parseInt(scoreString); + } catch (NumberFormatException e) { + currentScore = 0; + } + int newScore = currentScore + addToScore; + node.attr("gravityScore", Integer.toString(newScore)); + + } + + /** + * stores how many decent nodes are under a parent node + * + * @param node + * @param addToCount + */ + private void updateNodeCount(Element node, int addToCount) { + int currentScore; + try { + String countString = node.attr("gravityNodes"); + currentScore = string.isNullOrEmpty(countString) ? 0 : Integer.parseInt(countString); + } catch (NumberFormatException e) { + currentScore = 0; + } + int newScore = currentScore + addToCount; + node.attr("gravityNodes", Integer.toString(newScore)); + + } + + + /** + * returns the gravityScore as an integer from this node + * + * @param node + * @return + */ + private int getScore(Element node) { + if (node == null) return 0; + try { + String grvScoreString = node.attr("gravityScore"); + if (string.isNullOrEmpty(grvScoreString)) return 0; + return Integer.parseInt(grvScoreString); + } catch (NumberFormatException e) { + return 0; + } + } + + + /** + * pulls out videos we like + * + * @return + */ + private ArrayList<Element> extractVideos(Element node) { + ArrayList<Element> candidates = new ArrayList<Element>(); + ArrayList<Element> goodMovies = new ArrayList<Element>(); + try { + + + Elements embeds = node.parent().getElementsByTag("embed"); + for (Element el : embeds) { + candidates.add(el); + } + Elements objects = node.parent().getElementsByTag("object"); + for (Element el : objects) { + candidates.add(el); + } + + for (Element el : candidates) { + + Attributes attrs = el.attributes(); + + for (Attribute a : attrs) { + try { + if ((a.getValue().contains("youtube") || a.getValue().contains("vimeo")) && a.getKey().equals("src")) { + goodMovies.add(el); + + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + } + } catch (Exception e) { + e.printStackTrace(); + } + return goodMovies; + } + + + /** + * remove any divs that looks like non-content, clusters of links, or paras with no gusto + * + * @param node + * @return + */ + private Element cleanupNode(Element node) { + + node = addSiblings(node); + + Elements nodes = node.children(); + for (Element e : nodes) { + if (e.tagName().equals("p")) { + continue; + } + boolean highLinkDensity = isHighLinkDensity(e); + if (highLinkDensity) { + e.remove(); + continue; + } + // now check for word density + // grab all the paragraphs in the children and remove ones that are too small to matter + Elements subParagraphs = e.getElementsByTag("p"); + + + for (Element p : subParagraphs) { + if (p.text().length() < 25) { + p.remove(); + } + } + + // now that we've removed shorty paragraphs let's make sure to exclude any first paragraphs that don't have paras as + // their next siblings to avoid getting img bylines + // first let's remove any element that now doesn't have any p tags at all + Elements subParagraphs2 = e.getElementsByTag("p"); + if (subParagraphs2.size() == 0 && !e.tagName().equals("td")) { + e.remove(); + continue; + } + + //if this node has a decent enough gravityScore we should keep it as well, might be content + int topNodeScore = getScore(node); + int currentNodeScore = getScore(e); + float thresholdScore = (float) (topNodeScore * .08); + if (currentNodeScore < thresholdScore) { + if (!e.tagName().equals("td")) { + e.remove(); + } + + continue; + } + + } + + return node; + + } + + + /** + * adds any siblings that may have a decent score to this node + * + * @param node + * @return + */ + private Element addSiblings(Element node) { + int baselineScoreForSiblingParagraphs = getBaselineScoreForSiblings(node); + + Element currentSibling = node.previousElementSibling(); + while (currentSibling != null) { + + if (currentSibling.tagName().equals("p")) { + + node.child(0).before(currentSibling.outerHtml()); + currentSibling = currentSibling.previousElementSibling(); + continue; + } + + // check for a paraph embedded in a containing element + int insertedSiblings = 0; + Elements potentialParagraphs = currentSibling.getElementsByTag("p"); + if (potentialParagraphs.first() == null) { + currentSibling = currentSibling.previousElementSibling(); + continue; + } + for (Element firstParagraph : potentialParagraphs) { + WordStats wordStats = StopWords.getStopWordCount(firstParagraph.text()); + + int paragraphScore = wordStats.getStopWordCount(); + + if ((float) (baselineScoreForSiblingParagraphs * .30) < paragraphScore) { + node.child(insertedSiblings).before("<p>" + firstParagraph.text() + "<p>"); + insertedSiblings++; + } + + } + + currentSibling = currentSibling.previousElementSibling(); + } + return node; + + + } + + /** + * we could have long articles that have tons of paragraphs so if we tried to calculate the base score against + * the total text score of those paragraphs it would be unfair. So we need to normalize the score based on the average scoring + * of the paragraphs within the top node. For example if our total score of 10 paragraphs was 1000 but each had an average value of + * 100 then 100 should be our base. + * + * @param topNode + * @return + */ + private int getBaselineScoreForSiblings(Element topNode) { + + int base = 100000; + + int numberOfParagraphs = 0; + int scoreOfParagraphs = 0; + + Elements nodesToCheck = topNode.getElementsByTag("p"); + + for (Element node : nodesToCheck) { + + String nodeText = node.text(); + WordStats wordStats = StopWords.getStopWordCount(nodeText); + boolean highLinkDensity = isHighLinkDensity(node); + + + if (wordStats.getStopWordCount() > 2 && !highLinkDensity) { + + numberOfParagraphs++; + scoreOfParagraphs += wordStats.getStopWordCount(); + } + + } + + if (numberOfParagraphs > 0) { + base = scoreOfParagraphs / numberOfParagraphs; + } + + return base; + + + } + + private String debugNode(Element e) { + + StringBuilder sb = new StringBuilder(); + sb.append("GravityScore: '"); + sb.append(e.attr("gravityScore")); + sb.append("' paraNodeCount: '"); + sb.append(e.attr("gravityNodes")); + sb.append("' nodeId: '"); + sb.append(e.id()); + sb.append("' className: '"); + sb.append(e.attr("class")); + return sb.toString(); + + } + + /** + * cleans up any temp shit we have laying around like temp images + * removes any image in the temp dir that starts with the linkhash of the url we just parsed + */ + public void releaseResources() { + File dir = new File(config.getLocalStoragePath()); + String[] children = dir.list(); + + if (children == null) { + //logger.debug("No Temp images found for linkhash: " + this.linkhash); + } else { + for (int i = 0; i < children.length; i++) { + // Get filename of file or directory + String filename = children[i]; + + if (filename.startsWith(this.linkhash)) { + + File f = new File(dir.getAbsolutePath() + "/" + filename); + } + } + } + + } + + +} diff --git a/src/main/java/com/pshken/geese/GeeseFolder.java b/src/main/java/com/pshken/geese/GeeseFolder.java new file mode 100644 index 000000000..7e31062db --- /dev/null +++ b/src/main/java/com/pshken/geese/GeeseFolder.java @@ -0,0 +1,51 @@ +package com.pshken.geese; + +import java.io.File; +import java.util.Collection; +import java.util.Iterator; +import org.apache.commons.io.FileUtils; + + +public class GeeseFolder { + + private String folderDir; + private final String[] EXT = {"html", "htm"}; + private FileUtils fUtils; + private Collection collection; + private File file; + + public GeeseFolder(){ + fUtils = new FileUtils(); + } + + public GeeseFolder(String folderDir){ + this.folderDir = folderDir; + fUtils = new FileUtils(); + file = new File(folderDir); + } + + public String[] listAllFile() throws Exception{ + String[] res; + if(file == null){ + throw new Exception("Please enter a directory"); + }else if(!this.isFolder()){ + throw new Exception("Invaild directory"); + }else{ + collection = fUtils.listFiles(file, EXT, true); + res = new String[collection.size()]; + Iterator iter = collection.iterator(); + for(int i = 0; i < res.length; i++){ + res[i] = iter.next().toString(); + } + return res; + } + } + + public void setFolderDir(String folderDir){ + this.folderDir = folderDir; + } + + private boolean isFolder(){ + return file.isDirectory(); + } +} diff --git a/src/main/java/com/pshken/geese/GeeseRipper.java b/src/main/java/com/pshken/geese/GeeseRipper.java new file mode 100644 index 000000000..4feb6f876 --- /dev/null +++ b/src/main/java/com/pshken/geese/GeeseRipper.java @@ -0,0 +1,94 @@ +package com.pshken.geese; + +import com.jimplush.goose.Article; +import com.jimplush.goose.Configuration; +import java.io.File; +import java.util.Scanner; + +/** + * + * @author shaohong + */ +public class GeeseRipper{ + + private File file; + private String html; + private Scanner scanner; + private boolean folder; + + private GeeseFolder folderDir; + private Configuration config; + private GeeseContentExtractor contentExtractor; + private Article article; + + public GeeseRipper(String dir, boolean folder){ + html = ""; + config = new Configuration(); + this.folder = folder; + if(folder == true){ + folderDir = new GeeseFolder(dir); + }else{ + file = new File(dir); + } + } + + public GeeseRipper(){ + html = ""; + config = new Configuration(); + } + + + /** + * This is a rouge method, where it allows you to directly input html and + * it will return you plain text. (This method is NOT RECOMMENDED to use) + * + * @param html + * @return + */ + public String extractText(String html){ + contentExtractor = new GeeseContentExtractor(config); + Article article = contentExtractor.extractContent(html); + return article.getCleanedArticleText().trim(); + } + + public String extractText() throws Exception{ + if(folder == true){ + throw new Exception("Invaild file."); + }else{ + readFile(); + contentExtractor = new GeeseContentExtractor(config); + Article article = contentExtractor.extractContent(html); + return article.getCleanedArticleText().trim(); + } + } + + public String[] extractTexts() throws Exception{ + if(folder == true){ + String[] listOfFiles = folderDir.listAllFile(); + String[] listOfPlainText = new String[listOfFiles.length]; + for(int i = 0; i < listOfFiles.length; i++){ + file = new File(listOfFiles[i]); + readFile(); + contentExtractor = new GeeseContentExtractor(config); + Article article = contentExtractor.extractContent(html); + listOfPlainText[i] = article.getCleanedArticleText().trim(); + } + return listOfPlainText; + }else{ + throw new Exception("Invaild Folder"); + } + + } + + public void setFileDirectory(String fileDir){ + file = new File(fileDir); + } + + private void readFile() throws Exception{ + scanner = new Scanner(file); + while(scanner.hasNextLine()){ + html += scanner.nextLine(); + } + } + +} \ No newline at end of file diff --git a/src/main/java/com/pshken/geese/ParseWrapperGeese.java b/src/main/java/com/pshken/geese/ParseWrapperGeese.java new file mode 100644 index 000000000..ea3a89bd7 --- /dev/null +++ b/src/main/java/com/pshken/geese/ParseWrapperGeese.java @@ -0,0 +1,40 @@ +package com.pshken.geese; + +import com.jimplush.goose.ParseWrapper; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; + +import java.text.SimpleDateFormat; +import java.util.Calendar; + +/** + * + * @author shaohong + */ +public class ParseWrapperGeese extends ParseWrapper{ + private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + public String status = "notStarted"; + + public String startTime; + + public Document parse(String html) { + this.status = "Started"; + this.startTime = now(); + Document doc; + try { + doc = Jsoup.parse(html); + } catch (Exception e) { + throw new RuntimeException(e); + } + this.status = "Done"; + return doc; + } + + + public static String now() { + Calendar cal = Calendar.getInstance(); + return DATE_FORMAT.format(cal.getTime()); + + } +} diff --git a/src/main/java/com/pshken/geese/TalkToMeGeese.java b/src/main/java/com/pshken/geese/TalkToMeGeese.java new file mode 100644 index 000000000..6e9fadb07 --- /dev/null +++ b/src/main/java/com/pshken/geese/TalkToMeGeese.java @@ -0,0 +1,39 @@ +package com.pshken.geese; + +import com.jimplush.goose.Article; +import com.jimplush.goose.Configuration; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.Scanner; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * + * @author shaohong + */ +public class TalkToMeGeese{ + + public void main(String[] args){ + try { + File file = new File(args[0]); + String html = ""; + Scanner scanner = new Scanner(file); + + while(scanner.hasNextLine()){ + html += scanner.nextLine(); + } + + Configuration config = new Configuration(); + config.setEnableImageFetching(false); + GeeseContentExtractor contentExtractor = new GeeseContentExtractor(config); + Article article = contentExtractor.extractContent(html); + System.out.println(article.getCleanedArticleText().trim()); + } catch (FileNotFoundException ex) { + Logger.getLogger(TalkToMeGeese.class.getName()).log(Level.SEVERE, null, ex); + } + + } + +} diff --git a/src/main/resources/com/jimplush/goose/statichtmlassets/scribd.txt b/src/main/resources/com/jimplush/goose/statichtmlassets/scribd.txt new file mode 100644 index 000000000..b808a760c --- /dev/null +++ b/src/main/resources/com/jimplush/goose/statichtmlassets/scribd.txt @@ -0,0 +1,5106 @@ +<!-- /doc/52584146/Microfinance-and-Poverty-Reduction?in_collection=2987942 --> + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" + + xmlns:media="http://search.yahoo.com/searchmonkey/media/" xmlns:dc="http://purl.org/dc/terms/" + + xmlns:og="http://opengraphprotocol.org/schema/" + xmlns:fb="http://www.facebook.com/2008/fbml" + > + +<HEAD> +<base href="http://www.smart-it-consulting.com/internet/google/googlebot-spoofer/"> + + + <title>Microfinance and Poverty Reduction + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+ +
+ + + + + + + + + + + + + +
+ + + +
+
+ + + + + + + + + + +
+
+ + 1301918457 + + +
+
From: Oxfamgb
+ + + + + + + + + +
+ +
+ +
+ + +
+ +
+
+ +

+ Microfinance and Poverty Reduction +

+
+ + +
+ +
+ + + +
+ +
+
+ + + + + + + + + + + + + + + + + +
+ +
+ + + + + + + + + + + + + +
+ + +
+ +
+ + +
+
+ + +
+ + +
+ + + + + +
+
+ + + + +
+ +
+ + +
+ + + +
+ + + + +
+ + + + + + + +
+ +
+ + +
+
+
+ +
+
+

Recent Activity

+
+ + + +

Share & Embed

+ + + + + + +
+ + + + + +
+ +38ea + +
+

More from this user

+ +
+ + + +
+
+ + + +43 + +
+ + + + + + + + +
+ + + +
+ + +
+ + Microfinance and Poverty Reduction +Susan Johnson and Ben Rogaly + +Oxfam +(UK and Ireland) + + First published by Oxfam (UK and Ireland) and ACTIONAID in 1997 Reprinted by Oxfam GB 1997, 1999 © Oxfam (UK and Ireland) and ACTIONAID 1997 Oxfam GB, 274 Banbury Road, Oxford OX2 7DZ ACTIONAID, Hamlyn House, Macdonald Road, Archway, London N19 5PG ISBN 0 85598 369 8 A catalogue record for this publication is available from the British Library. All rights reserved. Reproduction, copy, transmission, or translation of any part of this publication may be made only under the following conditions: • • • • With the prior written permission of the publisher; or With a licence from the Copyright Licensing Agency Ltd., 90 Tottenham Court Road, London W1P 9HE, UK, or from another national licensing agency; or For quotation in a review of the work; or Under the terms set out below. + +This publication is copyright, but may be reproduced by any method without fee for teaching purposes, but not for resale. Formal permission is required for all such uses, but normally will be granted immediately. For copying in any other circumstances, or for re-use in other publications, or for translation or adaptation, prior written permission must be obtained from the publisher, and a fee may be payable. Available from the following agents: USA: Stylus Publishing LLC, PO Box 605, Herndon, VA 20172-0605, USA tel: +1 (0)703 661 1581; fax: + 1(0)703 661 1547; email: styluspub@aol.com Canada. Fernwood Books Ltd, PO Box 9409, Stn. 'A', Halifax, N.S. B3K 5S3, Canada tel: +1 (0)902 422 3302; fax: +1 (0)902 422 3179; e-mail: fernwood@istar.ca India: Maya Publishers Pvt Ltd, 113-B, Shapur Jat, New Delhi-110049, India tel: +91 (0)11 649 4850; fax: +91 (0)11 649 1039; email: surit@del2.vsnl.net.in K Krishnamurthy, 23 Thanikachalan Road, Madras 600017, India tel: +91 (0)44 434 4519; fax: +91 (0)44 434 2009; email: ksm@md2.vsnl.net.in South Africa, Zimbabwe, Botswana, Lesotho, Namibia, Swaziland: David Philip Publishers, PO Box 23408, Claremont 7735, South Africa tel: +27 (0)21 64 4136; fax: +27(0)21 64 3358; email: dppsales@iafrica.com Tanzania: Mkuki na Nyota Publishers, PO Box 4246, Dar es Salaam, Tanzania tel/fax: +255 (0)51 180479, email: mkuki@ud.co.tz Australia: Bush Books, PO Box 1958, Gosford, NSW 2250, Australia tel: +61 (0)2 043 233 274; fax: +61 (0)2 092 122 468, email: bushbook@ozemail.com.au Rest of the world: contact Oxfam Publishing, 274 Banbury Road, Oxford OX2 7DZ, UK. tel. +44 (0)1865 311 311: fax +44 (0)1865 313 925; email publish@oxfam.org.uk Designed and printed by Oxfam GB, 274 Banbury Road, Oxford OX2 7DZ, UK Printed by Litho and Digital Impressions Ltd. OX410/RB/96 Oxfam GB is a registered charity, no. 202 918, and is a member of Oxfam International. + +This book converted to digital file in 2010 + + Contents +Acknowledgements vii Introduction 1 1 Current debates in microfinance 5 1.1 Subsidised credit provision 5 1.2 The move to market-based solutions 5 1.3 Making use of social collateral 7 1.4 Savings 8 1.5 Can microfinance interventions reduce poverty? 10 1.51 Poverty as powerlessness 10 1.5-2 Credit for micro-enterprises 11 1.53 Reaching the poorest 12 1.6 Financial interventions and social change 13 1.7 Treading carefully in microfinance interventions 14 2 Informal financial services 16 2.1 Introduction 16 2.2 User-owned informal financial services 17 2.2.1 Some examples of user-owned financial services 18 2.3 Informal financial services for profit 19 2.31 Some examples of informalfinancial services providedfor profit 20 2.4 Turning the informal into the formal 22 2.5 What can be learned from informal finance? 23 2.6 Deciding when and how to intervene 25 2.6.1 Research questions on existing informal financial services 27 2.7 Filling the gaps 29 2.7.1 Some examples of innovative services 29 +in + + 2.8 Promotion: an alternative strategy for NGOs 30 2.8.1 Formation of savings groups and development of internal credit facilities 30 2.8.2 Promotion of small-scale formalised approaches 31 2.8.3 Linking groups to the formal system 32 2.8.4 Linking with specialised financial service NGOs 33 2.8.5 Advocacy 33 2.9 Summary and conclusions 34 3 The design of savings and credit schemes for poor people 35 3.1 Introduction 35 3.2 Targeting savings and credit to poor people 35 3.3 Women as users of financial services 38 3.4 Lending through groups 38 3-4.1 Functions of the group in microfinance schemes 39 3.4.2 Including the poorest 41 3-4.3 Other examples ofgroup-based schemes 42 3.5 Savings 43 331 The value of a savings facility 44 3-5.2 Compulsory or voluntary savings? 45 3-5-3 Linking savings to credit 46 3.6 Forms of loan 47 3.6.1 Credit in cash or kind? 47 3-6.2 Directed or undirected credit? 48 3.7 Loan disbursement and repayment schedules 50 3.8 Interest rates 51 3.9 Integrating financial services with other activities 52 3-9.1 Savings and credit for group formation and institution-building 53 3-9.2 Social development programmes 54 3-9.3 Economic development activities 54 3.10 Summary and conclusions 56 4 Financial performance and sustainability 58 4.1 Introduction 58 4.2 Managing and assessing financial performance 58 4.2.1 The repayment rate 59 4.2.2 Arrears and default 59 + +IV + + 4.3 Financial sustainability 60 4.3-1 The pros and cons of 'scaling up 6l 4.3-2 Issues in sustainability: the experience of 'village banking' 62 4.3-3 Sustainability through extending coverage 63 4.3-4 Measuring financial sustainability 64 4.4 Managerial and organisational sustainability 68 4.4.1 The role of staff in microfinance interventions 68 4.4.2 Organisational sustainability and change 69 4.5 Summary and conclusions 71 5 Assessing impact 72 5.1 Introduction 72 5.2 The difficulties of assessing impact 72 5-2.1 Establishing loan use 14 5-2.2 Measuring change-, controls and baselines 74 5-2.3 Proving causality 75 5.3 Innovations in impact assessment 76 5-3-1 Researching usefulness.- a case study 11 5-3-2 Assessing impact on social relationships 78 5-3-3 Impact assessment as a dynamic process 79 5-3-4 Validating qualitative data 80 5-3-5 Using quantitative data in impact assessment 81 5.4 Learning and adaptability 82 5.5 Summary and conclusions 84 6 Case studies 85 6.1 Introducing the case studies 85 6.2 Union Regional de Apoyo Campesino (URAC), Mexico 89 6.2.1 Background 89 6.2.2 Design 90 6.2.3 Financial performance and sustainability 92 6.2.4 Impact assessment 93 6.2.5 Conclusions 96 6.3 SUNGI Development Foundation, Pakistan 96 63-1 Background % 6.3.2 Design 97 6.3-3 Financial performance and sustainability 98 6.3-4 Impact assessment 98 6.3-5 Conclusions 101 + + 6.4 Ladywood Credit Union, UK 101 6.4.1 Background 101 6.4.2 Design 102 6.4.3 Financial performance and sustainability 104 6.4.4 Impact assessment 104 6.4.5 Conclusions 107 6.5 ACTIONAID in The Gambia 107 6.5.1 Background 107 6.5.2 Design 108 6.5-3 Financial performance and sustainability 109 6.5.4 Impact assessment 110 6.5-5 Conclusions 113 6.6 Casa Campesina Cayambe, Ecuador 113 6.6.1 Background 113 6.6.2 Design 114 d. 6.3 Financial performance and sustainability 115 6.6.4 Impact assessment 116 6.6.5 Conclusions 117 7 Conclusions 118 Annex 1 Table 1 Six microfinance institutions 125 Annex 2 Repayment rate and arrears rate 126 References 128 + +VI + + Acknowledgements +The authors wish to acknowledge the major inputs of Farah Batool (Pakistan case study), Martha Romero, Stephen Fogarty and Ofelia Guttierez (Mexico case study),Helen Derbyshire and Aggie Kent (UK case study), Ousman Cham and the staff of ACTIONAID The Gambia (The Gambia case study), Juan Serrano, Emilia Ferraro and Javier Herran (Ecuador case study). Stuart Rutherford provided a major and much appreciated contribution in the form of a background paper, A Critical Typology ofFinancial Servicesfor the Poor, as well as making comments on the text. Thanks are also due to the following: Shahin Yaqub, for a background paper, Macroeconomic Conditionsfor Successful Financial Servicesfor Poor People, Alfonso Castillo, and Md. Mumtaz Tanoli for additional assistance in planning and undertaking the case studies as well as commenting on the text; David Norman, Barbara Thomas and Helen Yanacopulos for research assistance. The following read and made valuable comments on the full text: Audrey Bronstein, James Copestake, Ros David, Helen Derbyshire, Heather Grady, Dot McCall, Amitava Mukherjee, Ravi Narayanan, Chris Roche, William Smith, Ines Smyth, and Ton van Zutphen. The authors are also grateful for the help and encouragement of Kirat Randhawa, Simran Rogaly, Deborah Eade, Pat Conaty, Carlos Ling, Michael Semple, Ceci Lopez, Pauline Wilson, and Nigel Twose. Any errors or omissions remain the responsibility of the authors. Susan Johnson and Ben Rogaly + +vu + + Introduction +During the 1990s, the provision of financial services dealing with very small deposits and loans — microfinance — and particularly the provision of microcredit, have been increasingly acclaimed as effective means of poverty reduction. There is continuing and quite rapid improvement in understanding how financial services for poor people can best be provided. This book sets out to draw together some of the most important lessons learned to date, as a useful resource for those considering financial interventions as well as those already involved. However, rather than setting out a single model of 'good practice', the book recommends an overall approach. In doing this, and in order to counteract the idea that credit alone can be a panacea for eradicating poverty, it reports on continuing debates about and different approaches to the provision of financial services to poor people. Private sector non-profit organisations (referred to in this book as nongovernmental organisations — NGOs) aiming to bring about reductions in poverty have become increasingly involved in providing financial services. Of those NGOs, most have experience of savings and credit, often linked to programmes of income generation. Very small deposits and loans are referred to together as 'microfinance'. This book focuses on microfinance and only briefly discusses its relationship to other development activities. The book does not cover financial service provision during complex emergencies or natural disasters, or for particular marginal or vulnerable groups, such as pastoralists or people with AIDS/HIV. Before going further, the term 'financial services' needs explanation. Financial services are about enabling people to amass usefully large sums of cash (Rutherford, 1996). They can be divided into two main types: first, those that build up cash reserves through forgoing income. Saving does this by making deposits out of income now and so forgoing its current use in order to draw a sum from these savings in the future. Insurance performs a similar + + Microfinance and Poverty Reduction function: it allows the client to buy access to a future lump sum. Loans work in a similar way, but in reverse: they are lump sums which are given now in return for income forgone in the future. The second main type of financial service allows assets to be converted into and out of lump sums of cash. Mortgages and pawns are the main examples of such services. A further type of service which poor people may need, but which is rarely discussed, is cash-handling, especially to allow the transmission of cash from one place to another. This is essential for long-term migrants, for example, wishing to send cash back to their relatives. + +The elements of an effective approach to microfinance +The approach to microfinance proposed here has five main points. First, that NGOs should investigate existing financial services; who uses them and to what effect. Second, that before intervening directly, NGOs should assess whether they have the specialist knowledge and skills required to provide financial services themselves. Third, in order to design services which are relevant and useful to poor people, NGOs should understand local social and economic structures, and also macro-level trends. Fourth, NGOs should consider how the provision of services can be sustained in the long term. Lastly, the impact on poverty reduction should be continually assessed rather than taken for granted, which tends to happen if a microfinance intervention is covering its costs and has many low-income users. + +The structure of this book +The book begins by setting out the main debates surrounding interventions to provide financial services, to provide a background to the rest of the book. Much of the discussion in this initial chapter is based on Rogaly (1996a). In any situation there is likely to be an array of informal financial services which people are making use of. An overview of these is given in Chapter 2. There is now much greater understanding of the characteristics of such services and how they operate. The first task for an NGO proposing to intervene is to find out which services are already available to people and which additional ones they would find most useful. To do this the NGO must understand for whom, under what circumstances, and to what degree these services support or undermine livelihood strategies. This background information allows the design of financial services to be connected to an analysis of poverty and well-being, and at the same time establishes which existing services poor people may wish to retain, and which should therefore + + Introduction not be undermined by any new intervention. This chapter draws heavily on a background paper commissioned for the book: A Critical Typology of Financial Services/or the Poor, by Stuart Rutherford, November 1996. The next step suggested for an NGO is to critically and honestly assess whether it is best placed to become a provider of financial services. In the past NGOs have not always achieved success in this area, and have failed to appreciate that specific skills are required. Alternative approaches which enable the NGO to utilise its skills in mobilising, training, and working with poor people to promote rather than to provide services should be seriously considered. Another possible role for NGOs is in advocacy with governments, to persuade them to make the necessary legislative changes, and with national banking systems to encourage bankers to work with poor people. Recent microfinance interventions have made use of a range of design features, which are discussed in Chapter 3- They have focused on reaching the poor by keeping loan sizes small, targeting women, adopting groupbased lending systems, and mobilising small and frequent savings deposits, and have tended to set interest rates at higher levels than in the past. Such interventions have demonstrated that poor people can and do repay loans, that they have the ability to save, and that they can pay higher interest rates. The discussion in Chapter 3 explores the assumptions behind these design elements of microfinance schemes, and the ways that they operate in practice. It emphasises the fact that different combinations of design features suit particular macro-economic, socio-economic, and political circumstances. This suggests that interveners must continuously and critically assess the effects that elements of the design of their programme are having in practice. To do this, it is advisable to start slowly in order that growing understanding of people's uses for microfinance can lead to adaptations in design. The fourth element of the approach set out in this book is a focus on sustainability, and this is discussed in Chapter 4. Microfinance initiatives have increasingly reported high repayment rates and the ability to cover part of the costs of providing the service. This has raised the possibility that organisations providing these services may be able to become self-sustaining, and so ensure the long-term provision of financial services to their users. NGOs involved in (or seeking to start) the provision of financial services need to take the issue of financial sustainability seriously, and ways of measuring financial self-sustainability are discussed in the chapter. However, financial sustainability is only one necessary condition for NGOs to be able to continue to provide services in the long term. The organisational structure, management, and staffing of the NGO are equally vital components. In discussing the forms of organisation that might be sustainable, some have argued that NGOs should turn themselves into banks. There is unlikely to be a single answer: + + Microfinance and Poverty Reduction some NGOs may prefer instead to put groups in touch with existing banks so that they are no longer needed. The final element — the assessment of impact — is explored in Chapter 5. This is an area in which there are many methodological difficulties. However, for those interested in poverty reduction, changes in users' livelihoods as a result of microfinance provision are of central importance. The approach proposed is one in which organisations continuously investigate and assess the usefulness and relevance of their services, and adapt their ways of working in response to the results they find. It is suggested that NGOs involved in microfinance should be modest and honest about their aims. Qualitative data gathering which involves users as well as the staff of the microfinance institution can help to clarify how different groups of people — poor, poorest, men, women — are able to make use of the services and with what effect. This information is a vital adjunct to quantitative information on performance, such as numbers of users reached and number and amount of deposits, or volume and size of loans dispersed. The book makes use of five case studies of financial service schemes connected to or funded by ACTIONAID or Oxfam. In Chapter 6 these schemes are described and used to illustrate issues discussed in earlier chapters in a practical context. Chapter 7 then draws overall conclusions. + + 1 +Current debates in microfinance +1.1 Subsidised credit provision +From the 1950s, governments and international aid donors subsidised credit delivery to small farmers in rural areas of many developing countries. It was assumed that poor people found great difficulty in obtaining adequate volumes of credit and were charged high rates of interest by monopolistic money-lenders. Development finance institutions, such as Agricultural Development Banks, were responsible for the delivery of cheap credit to poor farmers. These institutions attempted to supervise the uses to which loans were put, and repayment schedules were based on the expected income flow from the investment. Returns were often overestimated. For example, calculations would be based on agricultural yields for good years (Adams and Von Pischke, 1992). As a result, loans were often not repaid. The credibility and financial viability of these subsidised credit schemes were further weakened by the use of public money to waive outstanding and overdue loans at election time (Adams and Von Pischke, 1992; Lipton, 1996; Wiggins and Rogaly, 1989)- A dependence on the fluctuating whims of governments and donors, together with poor investment decisions and low repayment rates made many of these development finance institutions unable to sustain their lending programmes. Credit provision for poor people was transitory and limited. + +1.2 The move to market-based solutions +This model of subsidised credit was subjected to steady criticism from the mid-1970s as donors and other resource allocators switched attention from state intervention to market-based solutions. Policy-makers were reminded + + Microfinance and Poverty Reduction that credit could also be described as debt and that the over-supply of subsidised credit without realistic assessment of people's ability to repay could result in impoverishment for borrowers. At the same time the concept of 'transaction costs', and the notion that full information about borrowers was not available to lenders, were used by the opponents of subsidised credit to justify the high interest-rates charged by money-lenders. Lending money carries with it the risk of non-repayment. In order to know who is creditworthy and who is not, and so reduce this risk, the lender screens potential borrowers. This involves gathering information on the circumstances of individuals, which may not be easy to obtain. Then enforcement costs are incurred to ensure repayment. Through this process risks are reduced, though not eliminated. Where a loan is disbursed on condition that it is used for a particular purpose, supervision costs also arise. Using these tools of analysis it was argued that private money-lenders charged interest rates which were higher than formal bank-rates because of the high costs they faced in terms of risk, particularly when lending without physical collateral. At the same time, it was argued that money-lenders were an efficient source of credit because their greater knowledge of the people to whom they were lending lowered screening costs. Moreover, potential borrowers faced high transaction costs when they sought loans from formal-sector finance institutions. These costs included the time, travel, and paperwork involved in obtaining credit, and were often prohibitive for poor clients, especially those most geographically isolated. On the basis of this analysis, a group of economists based at Ohio State University (USA), notably Dale Adams and J D Von Pischke, put forward the view that the provision of credit should be left almost entirely to the private sector. In concentrating on the problems of publicly subsidised credit, these economists ignored the social ties, power relations, and coercion associated with the activities of money-lenders. However, detailed micro-level research has demonstrated the widespread use of 'interlocked' contracts to force exchange to the disadvantage of poor people (Bhaduri, 1981). Powerful local people, including landlords, employers, and traders, are able to influence the terms of loans made to tenants, workers, and small producers via conditions set in transactions involving land, labour, or crops. For example, traders frequently lend working capital to small farmers on condition that their crops are sold to that trader at a pre-determined price. Similarly, loans are made to workers against the promise of labour to be provided at below the going rate at a set future date (Rogaly, 1996b). Against the background of these debates, recent developments in the design of microfinance schemes have generated an understandably high degree of excitement. This is because innovative features in design have + + Current debates in microfinance reduced the costs and risks of making loans to poor and isolated people, and made financial services available to people who were previously excluded. + +1.3 Making use of social collateral +There was little knowledge among formal-sector financial intermediaries of alternatives to physical collateral, until the 1970s, when the Grameen Bank in Bangladesh began using 'peer-group monitoring' to reduce lending risk. The model for credit delivery in the Grameen Bank is as follows: • Groups of five self-select themselves; men's and women's group are kept separate but the members of a single group should have a similar economic background. • Membership is restricted to those with assets worth less than half an acre of land. • Activities begin with savings ofTaka 1 per week per person and these savings remain compulsory throughout membership. • Loans are made to two members at a time and must be repaid in equal instalments over 50 weeks. • Each time a loan is taken the borrower must pay 5 per cent of the loan amount into a group fund. • The group is ultimately responsible for repayment if the individual defaults. • Between five and eight groups form a 'development centre' led by a chairperson and secretary and assisted by a. Grameen Bank staff member. • Attendance at weekly group and centre meetings is compulsory. • All transactions are openly conducted at centre meetings. • Each member may purchase a share in the Bank worth Taka 100 Through this system the Grameen Bank has provided credit to over 2 million people in Bangladesh (94 per cent women) with a very low default rate. (Source: Khandker, Khalily and Khan, 1995.) However, peer-group monitoring has not proved necessary to other institutions seeking to do away with physical collateral. In Indonesia, governmentsponsored banks have successfully used character references and locallyrecruited lending agents (Chaves and Gonzales Vega, 1996). The peer-group + + Microfinance and Poverty Reduction method of Grameen and the individual-user approach of the Bank Rakyat Indonesia (see 1.4) can both be seen as attempts to lower screening costs by using local 'insider' information about the creditworthiness of borrowers. The degree to which Grameen Bank employees themselves implement peer-group monitoring has recently been questioned. It is argued that the reason for the Grameen Bank's high repayment rates is the practice of weekly public meetings at which attendance is compulsory, for the payment of loan instalments and the collection of savings. The meetings reinforce a culture of discipline, routine payments, and staff accountability (Jain, 1996). Another means of improving loan recovery is to insist on regularity of repayment. This is likely to reflect the actual income-flow of the borrower much better than a lump-sum demand at the end of the loan period. Borrowers can make repayments out of their normal income rather than relying on the returns from a new—often untested —mini-business. Nevertheless, where seasonal agriculture is the main source of income, and borrowers face seasonal hardship, regular repayment scheduling may cause problems. Microfinance specialists have argued that the prospects for scheme's stability are improved by innovations such as social collateral and regular repayments instalments. Indeed, financial sustainability has become an important goal in itself. To achieve sustainability, microfinance institutions, be they NGOs, government agencies, or commercial banks, need to ensure that the costs of providing the service are kept low and are covered by income earned through interest and fees on loans (see Havers, 1996). As microfinance deals, by definition, with small loans, the income generated through interest payments is also small in comparison with administration costs. To generate profits, therefore, it is necessary to increase scale — in other words, to lend to a large number of people (Otero and Rhyne, 1994). + +1.4 Savings +The regular repayments on loans required by large non-governmental microfinance institutions in Bangladesh (including BRAC, ASA and Grameen) provide evidence that poor people can save in cash (Rutherford, 1995a). These intensive repayment regimes are very similar to those of rotating savings and credit associations: steady weekly payments, enforced by social collateral, in return for a lump sum. Loans made are, in reality, advances against this stream of savings. By insisting on regular savings, microfinance institutions can screen out some potential defaulters, build up the financial security of individuals, increase funds available for lending, and develop among members a degree of identification with the financial health of the institution. People involved in + + Current debates in microfinance such schemes may previously have been unable to reach formal-sector banks, complete their procedures, qualify for loans or open savings accounts. 'A savings facility is an extremely valuable service in its own right, which often attracts many more clients than a credit programme, particularly from among the poorest' (Hulme and Mosley, 1996, pl47). This evidence that poor people can save in cash has opened up further debate. A distinction is made between schemes in which borrowers must save small and regular amounts in order to obtain loans (termed 'compulsory' saving) and those which offer flexible savings facilities. In the latter case people can deposit and withdraw cash in whatever amounts, and as often, as they wish. This distinction is made especially strongly by Robinson (1995) in her account of the Bank Rakyat Indonesia. The BRI local banking system has about six times as many deposit accounts as loans. On 31 December 1993, BRI's local banking system had $2.1 billion in deposits. These were all voluntary savings. By 31 December 1995, there were 14.5 million savings accounts. Savers with BRI have access to savings whenever they want. BRI deals with individuals rather than groups. Its savings programme was designed specifically to meet local demand for security, convenience of location, and choice of savings instruments offering different mixtures of liquidity and returns. BRI's local banking system has a loan limit of about $11,000. The idea is that good borrowers should not be forced to leave until they can qualify for the loans provided by ordinary commercial banks. In addition, BRI has a system which gives its borrowers an incentive to repay on time. An additional 25 per cent of the interest rate is added to the monthly payment. This amount is paid back to borrowers at the end of the loan period if they have made every payment in full and on time. There is a corresponding in-built penalty for those who have not. (Source: Robinson, 1994.) Robinson argues that there is an enormous unmet demand for flexible savings services. However, she also warns that managing a savings system of this type is much more complex than running a simple credit programme. Schemes which operate under these 'new' savings and credit technologies are an improvement on the old model of subsidised agricultural and microenterprise finance. The story of how they have succeeded in reaching poor people is now the subject of a large literaaire (for example, Rutherford, 1995b; Hulme and Mosley, 1996; Mansell-Carstens, 1995). That many more poor people can now obtain financial services is a major achievement of these + + Microfinance and Poverty Reduction schemes. However, the questions of which poor people have been reached, and of whether poverty has been reduced, still remain. + +1.5 Can microfinance interventions reduce poverty? +If poverty is understood as low levels of annual income per household, reducing poverty is about raising average income levels. If a particular level of annual income per head is used as a poverty line, poverty reduction could be measured by counting the number or proportion of people who cross that line — who are promoted out of poverty. Providers of financial services who aim to enable people to cross such a poverty line have focused on credit, in particular credit for small enterprises, including agricultural production. However, attention to annual income can obscure fluctuations in that income during any given year. Poverty can also be understood as vulnerability to downward fluctuations in income. Such fluctuations can be relatively predictable, such as the seasonal decline in employment for agricultural workers, or a shortage of income and trading opportunities in the dry season or before harvest. Alternatively, fluctuations in income may result from unexpected shocks such as crop failure, illness, funeral expenses or loss of an asset such as livestock through theft or death, or a natural disaster such as a cyclone (Montgomery, 1996). Vulnerability can be heightened by the lack of saleable or pawnable assets and by debt obligations. Interventions which reduce such vulnerability and protect livelihoods also reduce poverty. 1.5.1 Poverty as powerlessness A further dimension of poverty which is often the focus of NGO interventions is powerlessness, whether in an absolute sense or in relation to others. Economic inequality between and within households is likely to be associated with concentrations of political and social power. Inequality can increase whenever better-off people are able to improve their incomes faster than others. Even if the absolute level of material well-being of the worst-off people does not change, relative poverty (Beck, 1994) may increase, and with it a sense of powerlessness among very poor people. Power relations are partly determined by norms of expected behaviour. Neither the relations nor the norms are static; they are contested and change over time. Powerlessness can be experienced in a variety of situations: within the household, as a result of differences in gender and age; and within the community, between socio-economic groups, as a result of caste, ethnicity, and wealth. Defining poverty in terms of power relations implies that assessment of the impact of microfinance interventions should focus on their + +10 + + Current debates in microfinance influence on social relations and the circumstances which reproduce them. Even in a similar geographical and historical context, it is important to distinguish between the ways in which specific groups of poor people (women and men, landed and landless, particular ethnic groups) are able to benefit from financial services or are excluded from doing so. 1.5.2 Credit for micro-enterprises While there are methodological difficulties involved in measuring increases in incomes brought about by the provision of credit (see further discussion in Chapter 5), studies have demonstrated that the availability of credit for microenterprises can have positive effects. A recent survey collected data from government, NGOs, and banks involved in providing financial services for poor people. Twelve programmes were selected from seven countries (six of these are included in Table 1, Annex 1). Households which had received credit were compared with households which had not. The results demonstrated that credit provision can enable household incomes to rise. However, taking the analysis further, Hulme and Mosley demonstrated that the better-off the borrower, the greater the increase in income from a microenterprise loan. Borrowers who already have assets and skills are able to make better use of credit. The poorest are less able to take risks or use credit to increase their income. Indeed, some of the poorest borrowers interviewed became worse off as a result of micro-enterprise credit, which exposed these vulnerable people to high risks. For them, business failure was more likely to provoke a livelihood crisis than it was for borrowers with a more secure asset base. Specific crises included bankruptcy, forced seizure of assets, and unofficial pledging of assets to other members of a borrowing group. There have even been reports of suicide following peer-group pressure to repay failed loans (Hulme and Mosley, 1996, ppl20-122). A much smaller survey comparing micro-enterprise programmes in El Salvador and Vanuatu found that the development of successful enterprises and the improvement of the incomes of very poor people were conflicting rather than complementary objectives. By selecting those most likely to be successful for credit and training, the programmes inevitably moved away from working with the poorest people (Tomlinson, 1995). Reviews of Oxfam's experiences with income-generating projects for women raised serious questions about the profitability of such activities. Full input costings, which would have revealed many income-generating projects as lossmaking, were not carried out. Omissions included depreciation on capital, the opportunity cost of labour (the earnings participants could have had through spending the time on other activities), and subsidisation of income- + +11 + + Microfinance and Poverty Reduction generating projects with income from other sources. Market research and training in other business skills had often been inadequate (Piza Lopez and March, 1990; Mukhopadhyay and March, 1992). + +1.5.3 Reaching the poorest +Whether income promotion is based on loans for individual micro-enterprises or on group-based income generation projects, its appropriateness as a strategy for poverty reduction in the case of the poorest people is questionable. Other evidence suggests that self-selected groups for peer-monitoring have not been inclusive of the poorest people (Montgomery, 1995). People select those with whom they want to form a group on the basis of their own knowledge of the likelihood that these people will make timely payment of loan and savings instalments: X will only have Y in her group if she believes Y is capable of making regular repayments and has much to lose from the social ostracism associated with default. This system might well be expected to lead to the exclusion of the poorest (Montgomery, op.cit.). Even the low asset and land-holding ceiling which the big microfinance institutions in Bangladesh have successfully used to target loans away from better-off people has not necessarily meant that the poorest, who are often landless, are included (Osmani, 1989). So while the innovations referred to earlier appear to have made loans more available to poor people, there is still debate over the design of appropriate financial services for the poorest. Hulme and Mosley's study strongly suggests that providing credit for micro-enterprises is unlikely to help the poorest people to increase their incomes. However, detailed research with users has found that some design features of savings and credit schemes are able to meet the needs of very poor people. For example, it was found that easy access to savings and the provision of emergency loans by SANASA (see 3.4.2) enabled poor people to cope better with seasonal income fluctuations (Montgomery, 1996). Microfinance specialists increasingly, therefore, view improvements in economic security — income protection rather than promotion (Dreze and Sen, 1989) — as the first step in poverty reduction, '...from the perspective of poverty reduction, access to reliable, monetized savings facilities can help the poor smooth consumption over periods of cyclical or unexpected crises, thus greatly improving their economic security.' It is only when people have some economic security that 'access to credit can help them move out of poverty by improving the productivity of their enterprises or creating new sources of livelihood' (Bennet and Cuevas, 1996, authors' emphasis). + +12 + + Current debates in microfinance + +1.6 Financial interventions and social change +Interventions have an impact on social relations partly through their economic effects. In many instances implementors of credit schemes have claimed that the work will lead to progressive social change, for example by empowering women and changing gender relations in the household and in the community (Ackerly, 1995). In five out of the six schemes summarised in Table 1 (Annex 1), over half of the borrowers were women. Much of the work that has been done in assessing the impact of credit programmes on women has been in Bangladesh. One approach was to look at the control women retained over loans extended to them by four different credit programmes: the Grameen Bank, BRAC, a large government scheme (the Rural Poor Programme RD-12), and a small NGO (Thangemara Mahila Senbuj Sengstha) (Goetz and Sen Gupta, 1996). Results suggested that women retained significant control over the use to which the loan was put in 37 per cent of cases; 63 per cent fell into the categories of partial, limited or no control over loan use. Goetz and Sen Gupta found single, divorced, and widowed women more likely to retain control than others. Control was also retained more often when loan sizes were small and when loan use was based on activities which did not challenge notions of appropriate work for women and men. The question of whether women were empowered is not answered: even when they did not control loans, they may have used the fact that the loan had been disbursed to them as women to increase their status and strengthen their position in the household. However, in some cases women reported an increase in domestic violence because of disputes over cash for repayment instalments. A second major piece of research has assessed the effect of Grameen and BRAC programmes on eight indicators of women's empowerment: mobility, economic security, ability to make small purchases, ability to make larger purchases, involvement in major household decisions, relative freedom from domination by the family, political and legal awareness, and participation in public protests and political campaigning (Hashemi et al, 1996). The study concludes that, on balance, access to credit has enabled women to negotiate within the household to improve their position. However, unlike the Goetz and Sen Gupta study, which is based on 275 detailed loan-use histories, Hashemi et al attempted to compare villages where Grameen or BRAC were present with villages where they were not. Because of difficulties inherent in finding perfect control villages (which the authors acknowledge), the conclusions of the study do not signify the end of the debate. It has also been argued that focusing on women is much more to do with financial objectives than with the aim of empowerment. According to + +13 + + Microfinance and Poverty Reduction Rutherford (1995b) the real reasons for targeting women in Bangladesh are that they are seen as accessible (being at home during working hours); more likely to repay on time; more pliable and patient than men; and cheaper to service (as mainly female staff can be hired). Thus the process of loan supervision and recovery may be deliberately internalised inside the household (Goetz and Sen Gupta, op. cit.). Goetz and Sen Gupta do not use this as an argument against the provision of finance for women in Bangladesh, but rather suggest that to avoid aggravating genderbased conflict, loans should be given to men directly as well as to women and, at the same time, that efforts should be made to change men's attitudes to women's worth. + +1.7 Treading carefully in microfinance interventions +This brief summary of evidence and argument suggests that microfinance interventions may increase incomes, contribute to individual and household livelihood security, and change social relations for the better. But that they can not always be assumed to be doing so. Financial services are not always the most appropriate intervention. The poorest, in particular, often face pressing needs in terms of primary health care, education, and employment opportunities. Lipton has recently argued for anti-poverty resources to be allocated across sectors on the basis that a concentration on a single intervention mechanism, say credit, is much less effective in poverty reduction than simultaneous credit, primary health, and education work, even if this entails narrowing geographical focus (op. cit.). The particular combinations which will be most effective will depend on the nature of poverty in a specific context. Although microfinance provision appears to be evolving towards greater sustainability, relevance, and usefulness, there are few certainties and the search for better practice continues. Decisions on whether and how to intervene in local financial markets should not be taken without prior knowledge of the working of those markets. If the intervention is intended to reduce poverty, it is especially important to know the degree to which poor people use existing services and on what terms. Only then can an intervening agency or bank make an informed decision on whether their work is likely to augment or displace existing 'pro-poor' financial services. If the terms of informal financial transactions are likely to work against the interests of poor people (cases in which the stereotype of 'the wicked money-lender' corresponds to reality) the intervention may attempt to compete with and possibly replace part of the informal system. However, making such an informed assessment is not straightforward, as one study of the power relations between informal financial + +14 + + Current debates in microfinance service providers and agricultural producers in Tamil Nadu demonstrated. Grain merchants based in the market town of Dindigul were found to dictate the terms of product sale when lending working capital to very small-scale farmers, but to be much the weaker party when lending to larger-scale farmers (Rogaly, 1985). The structure of a credit market can change, partly under the influence of outside intervention. Rutherford has studied the changing market in financial services for poor people in Bangladesh. Competition between NGOs is leading to users being less subservient to NGO staff and protesting about unpopular financial obligations, such as the 5 per cent deducted from loans by Grameen for a 'group fund'. Private individuals have set up offices imitating the Grameen style but charging higher interest rates on loans than the big NGOs, and also offering higher rates on savings deposits. Private urban finance companies have expanded. Despite the tendency for NGOs to become more like banks, other formal-sector lenders are still reluctant to lend to poor people (see also McGregor, 1994). The expansion of NGO credit in Bangladesh has been made possible by the flood of donor money to that country. One study of BRAC showed that loan disbursal and recovery had become more important than group formation (Montgomery, 1996). In 1992, Grameen Bank and BRAC employees were found to be offering 'immediate loans' to women in villages where smaller NGOs had been attempting longer-term group-based finance (Ebdon, 1995). Ebdon attributed this behaviour to fairly strict targets for loan disbursal in the case of BRAC, and in both cases to an imperative for job security for staff and a desire on the part of the organisations to expand their influence and strengthen their reputations (p52). This anxiety to increase the number of users can undercut the very basis of the new model: the creation of sustainable financial institutions. Studies of credit schemes have consistently demonstrated that unless borrowers and savers believed they would benefit from the long-term survival of the institution, and have a sense of ownership, repayment rates would decline (Rogaly, 1991; Copestake, 1996a). The sense of ownership is weakened by attempts by large microfinance institutions in Bangladesh to claim territory by encroachment. In India, in the absence of equivalent flows of external finance, thrift and credit co-operatives based much more on borrowers' requirements have emerged (Rutherford, 1995b, pl36). An understanding of the way in which the institutions themselves change and respond to incentives is therefore necessary for the design of relevant anti-poverty interventions, including financial services. + +15 + + 2 +Informal financial services +2.1 Introduction +In recent years research into informal financial services and systems has significantly deepened understanding of the way they operate and their strengths and weaknesses. A simplistic belief that local money-lenders charged extortionate interest rates lay behind the provision of subsidised finance in the past. More thorough investigation has highlighted a range of savings, credit, and insurance facilities accessible to poor people. The apparently usurious interest charges reportedly made by private money-lenders may be explainable in terms of transaction costs, lack of information, and high risk. Informal financial services may be well-equipped, because of local 'insider' knowledge, and lower overheads, to respond to the requirements of poor people; they may also be exploitative. This chapter starts with a brief overview of the types of informal services that have been found to exist in a wide variety of countries and social contexts.1 Some of the broad characteristics of these services are identified, and lessons drawn for the design of NGO or semi-formal systems. In describing informal financial services it is useful to distinguish between those which are owned by their users and those which are offered by an individual, usually on a profit-making basis. The distinction can be a helpful one in analysing the ways in which financial services enable or exploit poor people. NGOs considering microfinance interventions need first to find out what informal financial services are available, and how they operate. Such services are capable of supporting poor people's livelihoods as well as perpetuating l This chapter draws heavily on a background paper commissioned for the purposes +of this book: A Critical Typology ofFinancial Servicesfor the Poor, Stuart Rutherford, November 1996. Examples are drawn from Rutherford's own experience unless otherwise stated. + +16 + + Informal financial services structures which undermine them. It is necessary, therefore, to understand under what circumstances and to what degree these services are enabling or exploitative for poor people. On the whole, user-owned services are likely to be more enabling than services provided for profit. Investigating the scope and nature of existing services is an essential preliminary before considering whether an intervention is necessary. However, NGOs themselves may not have the right skills to become direct providers of financial services. Furthermore, financial services are needed by poor people on a permanent basis to enable them to plan and manage their finances; NGO programmes which might be here today and gone tomorrow may be an inappropriate means through which to provide them. Therefore NGOs should seriously consider whether direct intervention is in fact the best response for them to make. The chapter closes by discussing alternative strategies NGOs might employ. + +2.2 User-owned informal financial services +Systems which facilitate financial transactions and are owned by their users are many and varied, and range from simple reciprocal arrangements between neighbours, savings clubs and rotating savings and credit associations (ROSCAs), to forms of insurance, building societies, and systems of cooperative business finance. An example of each of these types is described below. All of these systems can be found in a variety of country settings. Rotating savings and credit associations (ROSCAs) in particular, are an extremely common phenomenon. They exist in almost every country (for example, 'partners' in Jamaica and Britain, hui in Vietnam, and njangi in Cameroon). (See Bouman, 1995; Ardener and Burman, 1995 for detailed and extensive surveys of ROSCA operations in a range of settings.) The principle is very simple: a number of people agree to save a fixed amount of money at regular intervals; at each meeting, for example weekly, each member contributes an agreed amount, resulting in a single lump sum becoming available, which is then allocated to one of the members. There are three basic variations in the way in which this lump sum or 'prize' is allocated. First, it can be allocated on the basis of strict rotation between members of the group; second, on the basis of a lottery of members; third, it may be auctioned to the member who is willing to accept the biggest discount. The group will usually meet (but does not always need to) and undertake this transaction on as many occasions as there are members of the group, thus ensuring that each member gets the 'prize' once. The ROSCA demonstrates the basic principle of financial intermediation: collecting many small savings from many people, turning this into a lump sum for one person, and repeating this procedure over time. + +17 + + Microfinance and Poverty Reduction ROSCA finance is used for many purposes. Some ROSCAs operate to enable an asset to be purchased, such as a rickshaw or fishing equipment for each member, and may have been set up specifically for the purpose. 'Merrygo-rounds', as ROSCAs are called among Kikuyu women in Kenya, are sometimes used by women as a means of accumulating enough money to buy new household utensils or clothes. The technology of the ROSCA is not unique to poor communities but is also used by salaried professionals to purchase major consumption items or assets such as refrigerators or cars. A further example of a user-owned device is the insurance fund which makes pay-outs conditional on certain circumstances occurring. These are intended to cover large expenses such as those connected with marriage or death. + +2.2.1 Some examples of user-owned financial services Neighbourhood reciprocity in Southern India +Reciprocal lending may be extended to involve several or even all the members of a community. Among Moslems in Kerala State in southern India kuri kalyanam are invitations to a feast to which the guest is expected to bring a cash gift. When the host in his turn is invited to a feast by one of the guests he is expected to return double the amount (less if he is perceived as poor). In Vietnam one kind o/hui (a generic name for various financial devices) involves a similar pooling of resources for one person on one occasion to be reciprocated later by others, at different times. + +Rickshaw ROSCAs in Bangladesh +Very poor men driven by poverty from their home villages to the Bangladesh capital, Dhaka, often earn a living there by driving hired rickshaws. In the last ten years they have begun to run ROSCAs. A group of drivers forms, and each driver saves a set amount from his daily takings. When the fund is large enough (this usually takes about 15 days) a rickshaw is bought and distributed by lottery to one of the members. In between prizes' the cash is held by a trustworthy outsider, usually a local shopkeeperfrom whom the members buy their tea or cigarettes. In a further adaptation, those who have already received their rickshaw double their daily contribution. This progressively reduces the time-gap between prizes, and is seen as a fair way of rewarding those members who win the lottery late in the cycle, because their gross contribution is smaller than earlier winners. The extra payment made by the winners is roughly equivalent to what they save by no longer having to hire a rickshaw. + +18 + + Informal financial services + +An accumulating savings club in Mexico +In towns and villages in Mexico neighbours place frequent but irregular savings with trusted shopkeepers, fust before Christmas, the cash is returned to the saver. No interest is paid, but the saver has a lump sum to spend, and the shopkeeper has had the use of 'themoney over the year and can now look forward to a good sales season. + +Building societies for the middle classes in Bangladesh +In a lower-middle-class area of Dhaka, 165 employees in the Public Works Department belong to their own 'building society' which was started over 16 years ago. Each saves 200 taka ($5) a month out of his wages. As the cash accumulates it is lent out to members, who buy land and building materials. Interest rates are high and interest on the outstanding balance has to be paid each month, to encourage modest loans and rapid repayment. But loan sizes are generous and such workers would have few or no alternative sources for loans of this kind. + +Popular insurance: funeral funds (id&ir) in Ethiopia +Originally burial societies, iddir have extended to provide a wide range of insurance services in urban Ethiopia. Aredo (1993), studying these in Addis Ababa, estimated that 50per cent of urban households were members of some kind q/"iddir. Groups of people come together on the basis of location, occupation, friendship or family ties. Each iddir sets its own rules and regulations but usually pays outfor funeral expenses orfinancial assistance to families of the deceased, and sometimes to cover other costs, such as medical expenses and losses due to fire or theft. + +2.3 Informal financial services for profit +Those offering informal financial services for profit fall into two groups: deposit takers (often also called money-guards) and lenders. What is most interesting about the situation of deposit takers is that, as in the Nigerian example below, savers usually pay for the service by obtaining a negative interest rate on their funds. This demonstrates the pressing need that people have for places to put their savings which are safe and secure not only from physical risks such as theft, fire or flood, but also from the demands of their family. For women, in particular, the ability to save small amounts in places to which their husbands and families cannot gain access (although they might know about them) has been shown to be particularly important. It may enable them to meet obligations in the family or household, such as the payment of children's school fees, for which they have particular responsibility. + +19 + + Microfinance and Poverty Reduction Forms of lending also operate in a variety of ways, such as money-lenders; pawnbrokers, who take collateral in the form of physical assets; and forms of trade credit and hire purchase. The term 'money-lender' can cause confusion because it conjures up the image of a class of people whose main source of income is usury. In reality, many small farmers, for example, obtain credit from employers, landlords, traders, relatives, and other people who combine a number of economic activities. In some places money-lenders may be a more professionalised class, such as the 'Tamilians' in Cochin described below, but even in this case it is not necessarily their main source of income. Lending money can be exploitative oft, as well as enablingfor, poor people. People facing seasonal shortages may have only one source of credit, for example, an employer. The employer may agree to provide a loan, but only if the borrower promises to work when required at below the going wage-rate. As described below for Indonesia, crop traders may provide producers with seasonal credit on the understanding that the crop is sold through the same trader at low post-harvest prices. Tied credit of this type, whether in cash or kind, may be the only means of survival for poor people. But arrangements such as these can maintain and even exacerbate inequalities in power and position. In contrast, user-owned devices are likely to be more supportive and enabling, because the profits made are pooled, and shared or fed back into the system, and ownership and control of the funds are in the hands of the users. Such devices are unlikely to be exploitative of those involved, although they may widen inequalities between users and non-users. The comparison with services for profit is clear. However, loans from private lenders after harvest may enable small traders to make the most of the increased liquidity in the local economy. This emphasises the need for interveners to understand the workings of real markets and to question untested assumptions. It is essential to find out for which groups of poor people — women, men, landless labourers, subsistence farmers, migrant workers — and under what circumstances these arrangements may be no more than a means of survival, while supporting wealth creation for others. + +2.3-1 Some examples of informal financial services provided for profit Deposit takers: a mobile alajo in Nigeria +One consequence of Nigeria's current political difficulties is a drop in public confidence informal banks, according to Gemini News. This has allowed an old tradition to flourish again — alajos, or peripatetic deposit takers. Idowu Alakpere uses a bicycle to go + +20 + + Informalfinancial services door-to-door round the outer suburb of Lagos where he lives. He has 500 customers who each save about 10 or 15 naira with him (about 50 to 75 cents US) at each daily visit. Customers withdraw money whenever they like, and Idowu charges them one day's savings per month, which he deducts from the withdrawal. Since deposits are made evenly over the month, the negative interest rate for one-month deposits is 1/15, or 6.6per cent a month, an Annual Percentage Rate (APR) of 80per cent. Some alajos, including Idowu, store the cash in a reliable bank, others use it to make loans. The Gemini News reporter was told by many local people that they trusted these alajos more than banks. When it was pointed out that some alajos are dishonest, they retorted that so are many banks. + +Professional money-lenders in Cochin, India +'Tamilians'provide a money-lending service to poor slum dwellers on a daily basis. They have set terms, which are well-known all over Cochin. For each 100 rupees lent, 3 rupees are deducted at source as a fee. Thereafter, 12.50 rupees per week must be repaid for ten weeks. This works out at an APR of 300per cent (28 rupees paid on an average size loan of 48.50 rupees [97/2]for 10/52 of a year). Most non-poor observers regard this rate as outrageously exploitative. However, poor users of the service tend to take a favourable view of it. The 'Tamilians' do not needlessly harass their clients over repayment but take an 'understanding' view which includes a willingness to accept loan losses. These money-lenders know their clients well and (out of self-interest) will not lend more than they think the client can repay out of normal income over the next ten weeks. + +Lending against collateral-pawnbrokers in Western India +Residents of the slums of Vijayawada use their local pawnbroker when they need money quickly. He is reliably available at his goldsmithing shop and he charges 3 per cent a month for loans pledged against gold, 5 per centfor silver and 9 per centfor brass. The inclusion of brass means that even the very poor can get a small advance by pawning kitchen pots and pans. He lends up to two-thirds the value of the pawn. He gives a receipt, and because the borrower can be sure ofgetting her pawn back when she repays the loan, she can risk pawning objects of sentimental value. Unlike those who lend without collateral the broker does not need to know his clients well: the unambiguous collateral provided by the pawn means that the broker can lend to more or less anyone at any time. + +21 + + Microfinance and Poverty Reduction + +Advance crop sales in Indonesia +A practice common in many countries is known as ijon in some areas of Indonesia. Farmers often need cash to get them through the 'hungry' season when their main crop is in the ground and there is not much else to do except sit and wait. They are forced to make an advance sale of the crop, usually to a grain buyer or his agent. Ijon transactions of this sort, if seen as loans, show an interest rate of anything from 10 to 40 per cent a month. +(Source: Bouman and Moll in Adams and Fitchett, 1992.) + +Two examples of trade credit +In many markets it is common to see poor people squatting on the ground with a small amount of fertiliser spread out on a mat. The fertiliser doesn't necessarily belong to the man or woman (or, often, child). Lacking capital themselves to buy stock, such people obtain the fertiliser on credit from a nearby shop. At the close of the market they return the money from sales and any balance of the stock to the shopkeeper, retaining a small proportion of the money. The system allows people to trade (safely if not profitably) without capital, and gives the shopkeeper a cheap extra outlet. Tfredadon credit system used to finance prawn cultivation in Bangladesh is an example of a trading system in which credit is passed on through a chain of intermediaries between the prawn farmer and exporters to Europe. The prawn market is a highly competitive business in which everyone in the chain is short of capital. The 'commission agent' at the port buys prawns on behalf of the exporters in the capital. To ensure their share of the market they provide credit early in the season which finds its way through a number of intermediaries before reaching the hands of the farmer. The intermediaries are 'depot' owners, then farias', or merchants, and finally local traders, who in turn lend to the farmers. In accepting the credit the farmer commits himself to selling exclusively to this particular trader. + +2.4 Turning the informal into the formal +In some countries such informal systems have evolved into formal systems which have had a major impact on their users. In the UK, for example, 'mutual' or friendly societies which began as small thrift groups in the nineteenth century turned into building societies in the first half of the twentieth, and have been the main source of housing finance for 50 years. + +22 + + Informal financial services There are further examples of such informal systems becoming increasingly formalised. Aredo (1993) reports that the iddir'm Addis Ababa run by the Ethiopia Teachers' Association is of the scale of a medium-size insurance business. In Cameroon some of the traditional ROSCAs known as njangi have evolved into small banks offering finance for small businesses which have difficulty using formal banks (Haggblade, 1978). ROSCAs may thus be a transitional phenomenon. Chit funds in India are a formalised version of a ROSCA, for which government legislation exists. In contrast to the ROSCA, members of the chit fund do not normally know each other and are merely customers of the chit companies. The company advertises for and selects members, makes arrangements for collection of subscriptions, and holds auctions for the prizes. However, such funds are of limited use to poor people, who lack both the income to pay subscriptions and the social position to gain the confidence of the company. The transition to formalised services is not inevitable. Informal and formal arrangements continue to exist side-by-side even in industrialised countries. In Oxford, UK,ROSCAs have enabled people with very limited capital of their own to increase their chances of obtaining a small business loan (Srinivasan, 1995). A detailed comparative study of credit use among low-income Pakistani, Bangladeshi, and Carribean immigrants in the UK revealed enormous differences in their use of financial services. In all cases sources of credit were classified into high-street credit, local commercial credit, mail order, social fund, community-based credit, and 'miscellaneous' (including friends, family, and employer). Unlike the Bangladeshis, the Pakistani and Carribean respondents reported community-based, ROSCA-like arrangements. Bangladeshi respondents made much more use of formal bank credit than the others, although they had at least as high a proportion of applications rejected, apparently on racial grounds (Herbert and Kempson, 1996). Abugre (1994) points out that transition and change can be rapid, discontinuous, and turbulent rather than smooth and linear. There is therefore likely to be a multiplicity of arrangements, some of which become formalised, while others die out, and yet others are initiated. The implication for those interested in providing financial services is that such a role must be carefully thought through, and beflexibleand responsive to changing circumstances. + +2.5 What can be learned from informal finance? +Having briefly explored the range of financial services which may exist, it is clear that informal finance is a regular feature of poor people's lives. What can be learned from this? The continuation of a large number of different forms suggest the following points (partly adapted from Adams, 1992). + +23 + + Microfinance and Poverty Reduction + +There is clearly a demand for financial services +The range of informal financial services available partly reflects the varied requirements which people, both rich and poor, have for financial services. They may also be explained in terms of the actions of people with excess cash seeking to earn income from lending. In some cases, especially where there is a monopoly, or collusion among providers, this can be exploitative for the borrower. Informal services available include savings facilities, provision of credit for consumption, and funding for predictable but expensive events such as marriages and funerals. This is in significant contrast to the services that NGOs have generally offered, which have usually been limited to the provision of credit for production. + +Transaction costs are low. +Transaction costs are the costs, other than interest payments, which are incurred in making a deposit or taking a loan. They include travel, time away from other activities, related 'gifts' which might have to be offered to bank or government officials, costs in obtaining documentation required, such as land certificates, and so on. Compared to formal services, local informal services generally require very little form-filling or travel. However, the advantage to the borrower of low transaction costs may be more than counterbalanced by their lack of power in setting the terms of a loan, which may be exploitative. + +Informal services impose their own discipline +The flow of information locally and the small number of providers of informal finance often act as powerful incentives to users to repay loans or save in a disciplined way. A ROSCA member failing to pay their instalment risks social ostracism from neighbours, friends, and relatives; they may be less likely to receive help from these people in times of severe difficulty in future. + +Poor people are capable of saving +The evidence of informal systems disproves the assumption that poor people cannot save. Saving 'in kind' has long been a recognised part of people's livelihood management: saving in cash is a necessity of interaction with the cash economy. Indeed it is often the poorest, who are landless or for other reasons dependent on casual, poorly-paid jobs, who gain a large proportion of their incomes in cash and therefore have most need of savings facilities. The evidence shows that poor people are not only willing to save but at present often pay highly for savings facilities. + +24 + + Informal financial services Informal systems are adaptable. The variety of forms and functions of informal finance demonstrates the adaptability of these systems to different economic conditions and changing circumstances. This contrasts with formal systems which often have to be based on a uniform delivery model. There is thus much to be learned from informal financial systems. Indeed aspects of these systems have found their way into the design of NGO and semi-formal financial services programmes. In particular, both group-based and individual-based schemes have made use of the 'insider knowledge' of other local people: individual-based schemes, such as BRI, through personal references from local representatives, and groupbased schemes, such as Grameen, through self-selecting groups of borrowers (see Chapter 1). This brief overview has not identified for whom these services exist — women and men, poor or poorest. The poorest people may find it difficult to save the amount that a ROSCA requires and hence find participation a burden or are excluded. Even if there are a number of people in similar situations, they are often marginalised or isolated and lack the social networks to create their own ROSCA with a lower fee. Indebtedness may also make it difficult for the poorest to save and build up a small asset base — a situation that will be illustrated in the case of low-income and unemployed members of the Ladywood Credit Union in the UK, a case-study scheme described in Chapter 6. There are therefore limitations to the extent to which savings-based userowned facilities can be of use to very poor people. However, systems that allow flexible amounts to be deposited are more likely to be appropriate. + +2.6 Deciding when and how to intervene +Before going on to discuss ways of intervening which are useful and relevant to poor people (see Chapter 3), it is necessary to issue some warnings. Several commentators, among them NGO practitioners, have questioned the appropriateness of NGOs acting as providers of financial services. Abugre (1992) identifies a range of dangers, and points to the dire consequences of the job being done badly: • NGOs remain averse to charging positive real interest rates and may, consciously or otherwise, undermine traditional financial systems. • NGOs do not submit themselves to the discipline required for the provision of sustainable financial services. + +25 + + Microfinance and Poverty Reduction • Schemes are managed by entirely unprofessional and untrained staff and are often carelessly conceived, designed, and implemented. • There are cases where NGOs have flooded the market with credit, resulting in indebtedness on the part of borrowers, and potentially regressive effects on income and wealth distribution. By extending loans which poor people are unable to pay due to factors beyond their control, or which may have simply been inappropriate in the first place, NGOs can cause a level of indebtedness which may result in the borrower having to liquidate assets in order to repay. Abugre therefore warns against the hasty introduction of new financial services by NGOs and concludes that they should concentrate on what they do well, such as providing social services and acting as confidence brokers in communities. Direct provision may be a risky and problematic strategy for an NGO, particularly as the NGO may not have the range of skills required to develop microfinance interventions, nor experience of the financial skills and responsibility required to ensure funds are properly safeguarded and accounted for. A further range of managerial skills are also necessary in managing a portfolio of financial assets such as loans and deposits. NGOs with experience of welfare and relief have more experience of channelling funds than managing them (Bouman, 1995). An NGO must ask itself whether it has the skills to become a banker. An organisation lacking the relevant skills may consider acquiring them either through recruitment or staff development. Such a strategy itself has important consequences. These skills may be in short supply and recruitment prove difficult; they take time to develop and are acquired through experience as well as training. There is often a strong impetus to start work even if the skills of staff are still weak. This can endanger the intervention itself since it is at this early stage that users gain an impression of the nature of the operation, and inexperienced staff are likely to make mistakes. Embarking on direct intervention also raises questions about the long-term sustainability of the service on offer. Financial services should not be provided on a transient or temporary basis. There needs to be a degree of permanence to enable people to plan for their future financial needs. Consideration of the long-term future for a system of financial service provision is therefore important at the outset. Direct provision by an NGO which expects to move away from the area would seldom be appropriate. + +26 + + Informal financial services There is a further range of issues at the level of the macro-economy which should also be considered when deciding whether to intervene. Macroeconomic stability is an important pre-requisite for getting a scheme off the ground.2 Hyper-inflation and economic instability do not encourage individuals to save, and loans under such circumstances are difficult to manage. (However, in Mexico, while formal-sector banks were reeling from massive default caused by the high interest rates and high inflation of 1995, URAC, one of the case-study institutions discussed in Chapter 6, continued to thrive.) Political stability is also needed, since without it there is unlikely to be much confidence in the long-term future of new financial institutions. Before considering scheme design an NGO must also investigate the formal legal regulatory requirements for organisations involved in financial service provision, especially for savings (see Chapter 3). + +2.6.1 Research questions on existing informal financial services +In carrying out research into the services available, and how they are used, an intervener should try to find answers to a wide range of questions, such as: + +How do people manage their savings deposits? +Are there savings banks, or deposit takers, insurance salesmen, or savings clubs? Do poor people have access to them? If not, how do they save (for example, gold, livestock). Who among the poor uses them (men, women, landless labourers, subsistence farmers etc)? (Extensive use of expensive deposit takers might indicate that the NGO should look first at the reasons why alternatives are not in place: and second at whether there is any possibility for the NGO to get involved, either as promoter or as provider, in savings collection.) + +How do people temporarily realise the value of assets they hold? +Are there pawnbrokers or are there schemes that allow them to pawn land or other major assets (eg jewellery) safely? Who uses these services? (If such devices exist, are they exploitative or enabling? If they are clearly exploitative, there might be a case for an NGO to try to provide or promote an alternative.) + +How do people get access to the current value of future savings? +Are there money-lenders willing to advance small loans against future savings? Are there ROSCAs or managed or commercial chits, or co-operative +2 In a background paper commissioned for the purposes of this book, Shahin Yaqub examined the 'Macroeconomic Conditions for Successful Microfinance for Poor People'. The paper is available from the Policy Department, Oxfam (UK and Ireland). + +27 + + Microfinance and Poverty Reduction banks? Do poor people have access? Which poor people use them? (If money-lenders appear to be exploiting users, for example by imposing very high interest rates or linking loans to disadvantageous deals over land, labour or commodities, then there might be a case for the NGO to introduce ROSCAs or annual savings clubs, or work as a promoter of self-help groups or credit unions.) + +How do people make provision for known life-cycle expenses? +Do they provide for daughters' marriages, their own old age and funeral, for their heirs? Are there clubs that satisfy these needs, or general savings services or insurance companies that will do as well? Are there government or employer-run schemes? Are there particular expenses for which women have responsibility? + +How do people cope with emergencies? +What happens when a breadwinner is ill, or when a flood or drought occurs? Does the government have schemes that reach poor people in these circumstances? If not, what local provision do people make? + +How do small-scale entrepreneurs get access to business finance? +If so, in what amounts and at what cost? Do women entrepreneurs have access? During the exploratory work done to answer these questions another set of information will come to light — the absolute quantities of cash involved in local financial intermediation. This can be of immense value to scheme designers in cases where a decision is made to intervene. For example, information about amounts repaid regularly to money-lenders will be useful in setting loan sizes and repayment schedules for loan schemes. (Source: Rutherford, 1996.) Much can be learned from the way in which people are already managing their finances. A further aspect is the social relations involved — the groups of people who get together to form ROSCAs, those from whom loans are taken, and those with whom deposits are lodged. Tierney's work on the Oxfamfunded Youth Employment Groups in Tabora Region of Tanzania demonstrates that the design of the intervention, which was based around groups of people with the same occupational background, did not correspond to the pattern of existing financial intermediation, which was organised around small kin-based groups, each including diverse enterprises. Tierney argues that 'the formation of development groups can, ironically, divert people's energy away from improving their lives, because forming the kind of groups which are eligible for financial assistance is a time-consuming activity involving skill + +28 + + Informal financial services in manipulating and maintaining public relations' (Tierneyforthcoming).This illustrates the value of understanding how indigenous financial systems operate, before designing a new microfinance initiative. + +2.7 Filling the gaps +As well as alerting people to the potential pitfalls of intervention, research to answer the kind of questions suggested above is likely to identify gaps in existing services. There are many ways in which such gaps can be filled and below are some examples of financial service interventions in insurance and hire purchase which can be of use to poor people. For those agencies whose motivation is poverty reduction it is important to link the identification of gaps with a poverty analysis to determine who is excluded from existing services and how such exclusion perpetuates poverty. + +2.7.1 Some examples of innovative services Hire-then-purchase for the poor in Bangladesh +ACTIONAID found, through the experience of running a groupbased lending programme similar to that of the Grameen Bank, that many very poor people were nervous of taking a large loan — the 5,000 taka ($125) needed to buy a rickshaw, for example— in case they were not able to repay it. AA therefore devised a hire-thenpurchase scheme for such people. AA bought its own rickshaws and hired them out to group members. A rickshaw driver could hire a rickshaw from AA instead of hiring one from a local 'mohajan'. If he then decided to convert his contract with AAfrom hiring to buying, a proportion of the total hiring fees he had already paid was denoted as his down-payment, and he took a regular (smaller) AA loan to pay off the rest. + +Door-step insurance agents, Cuttack, Orissa +In Cuttack, insurance agents from the Peerless company visit households in low-income areas. They offer simple endowment schemes, which from the point of view of the customers are like accumulating fixed deposit schemes: the customer puts in a fixed amount regularly and then on maturity gets it back plus profits. Life insurance cover is included in the contract. + +'Bankassurance': group-based insurance for the rural poor +In Bangladesh, one insurance company is pioneering an attempt to match, in the field of insurance, Grameen Bank's success in lending. + +29 + + Microfinance and Poverty Reduction Delta Life Insurance has been experimenting since 1988 with cutprice basic life-insurance for rural people. Customers are arranged in groups, there is no medical examination and no age-bar, and premiums are tiny and collected weekly. Agents are also involved in Grameen-Bank-style lending and earn an extra commission for the insurance work. In fact the insurance premiums are invested directly in lending (on which healthy interest may be earned). In 1996 Delta was looking for a big NGO partner which could offer the two services — lending and insurance — side by side. Experience so far has shown that demand for such a service is high. Delta is exploring how it can extend this initiative beyond life insurance. + +2.8 Promotion: an alternative strategy for NGOs +Having identified the gaps in existing financial service provision, an NGO might involve itself in promotion rather than provision. The main alternatives to direct provision of financial services are ones which involve the NGO in a transitional or support role whereby activities such as mobilisation, training, and making links to other organisations are provided. A range of possible approaches are outlined. + +2.8.1 Formation of savings groups and development of internal credit facilities +Where ROSCAs do not exist or have limited coverage, the NGO might act as a facilitator of their formation or enable them to develop slightly more sophisticated systems of internal on-lending which allows savings and loans to take on more flexible formats. This approach has been used by Friends of Women's World Banking in India. In this case the NGO is mainly involved in training and organising the groups. Self-help groups (SHGs) are NGO-led attempts to promote savings clubs, or simple forms of credit union. Those initiated by Friends of Women's World Banking in India are aimed at poor rural women. FWWB (or its partner NGOs) persuades women from the same neighbourhood and from similar backgrounds to form small groups of 12 to 15 members. NGO workers encourage the women to meet regularly and frequently and during these meetings the women discuss their financial problems and ways of solving them. The solution they are steered towards involves regular small savings and the immediate conversion of those savings into small loans taken by one or two members at each meeting. Care is taken to + +30 + + Informal financial services involve all group members in the discussion and formulation of rules (how often to meet, the interest to be charged on loans, and repayment arrangements) and then to ensure that every member experiences for herself the activities of saving and of taking and repaying a loan. The group is asked to choose leaders who are trained to manage the group's affairs: if illiteracy or very poor educational levels are a problem then rules are kept deliberately simple (fixed equal savings, and annual dividends rather than monthly interest on savings, for example). These preparations are intended to equip the group for independent survival after the NGO stops sending workers regularly to the meetings. Groups which perform well over several months are able to obtain small bulk loans made by FWWB to the group as a collective. Where there are a number ofgroups in an area, FWWB may help them form a federation' ('apex body') to help with liquidity problems: groups with excess savings deposit them with the federation which on-lends to groups with a strong demand for loans. (Source: WWB, 1993.) However, although this type of intervention can succeed with agency help, it has yet to be proved whether savings and credit groups which are promoted by outsiders can achieve long-term independence (Rutherford, 1996). A range of questions remain: can they save sufficient funds among themselves to satisfy their own demand for loans? Can external funds be introduced into these groups without destroying their independence? + +2.8.2 Promotion of small-scale formalised approaches +National legislation may allow for credit unions (the World Council of Credit Unions has national and regional affiliates all over the world) or thrift and credit co-operatives (as in Sri Lanka, see 3.4.2). Another approach an NGO might adopt could be the linking up of people interested in establishing such services for themselves with other credit unions or umbrella and apex bodies that are able to promote and advise on particular financial services. Oxfam Hyderabad worked with the Federation of Thrift and Credit Associations in Andhra Pradesh, encouraging exposure visits to flourishing thrift and credit societies by potential members from other areas. The members now have a source of consumption credit based on their own savings. Oxfam Hyderabad saw its support for linking potential groups with an existing thrift and credit structure as a move away from direct funding q/NGOs to provide credit. +(Source: Oxfam (India) Trust, 1993-) + +31 + + Microfinance and Poverty Reduction + +2.8.3 Linking groups to the formal system +Existing savings groups or ROSCAs may already have bank savings accounts but are unable to take loans because the bank does not understand their operations or believe them to be creditworthy. The NGO might work with groups to encourage them to build up savings and deposit them in formal institutions. The NGO may then be able to work with a local bank to encourage it to extend its services to groups. In Ghana, rural banking legislation was designed to create semiautonomous local banks which would serve people cut off from financial services. However, the banks have experienced a range of problems which led to only 23 out of a total of 123 being classified as operating satisfactorily in 1992 (Onumah, 1995). In 1991 the Garu Bank, a small rural bank set up in 1983 in Ghana, was near to collapse as a result of embezzlement and bad loans. The people of Garu persuaded a member of their own community who was working in Accra to come back to the area and become themanager. The Bank is a unit bank and operates relatively autonomously. Share capital of the Bank is owned by the local community, the Catholic Mission, the local Agricultural Station and a Disabled Rehabilitation Centre. Helped by an additional capital injection of $30,000 received from overseas donors via the Catholic Mission the manager transformed the situation, and expected to report a profit for the first time. The bank has a range of clients, including local salaried workers such as teachers and government employees. These people are good customers because they take loans which are easily recoverable in the form of deductions made from their salaries at source. Alongside these customers, the Bank provides services to some 300 farmers' groups. Some of these groups were originally formed by the local Agricultural Station and the Catholic Mission and bought shares in the Bank when it was first set up. The manager went to meet the groups to discuss their needs with them. He has developed his own approach to the groups, and stresses that they should be concerned with working together rather than just obtaining credit. He has set up his own criteria for lending to the groups-, savings balances of at least 10 per cent of the loan amount; regularity of savings as an indicator ofgroup cohesion; and that the group should have been operating for at least six months. Repayment of the loan on time results in almost automatic qualification for a new loan the following year (although he had refused loans to a number of groups the previous year due to poor performance). (Source: Abugre, Johnson et al, 1995) + +32 + + Informal financial services This bank manager may be exceptional. However, NGOs could provide an important bridge between these banks and savings groups and help to negotiate facilities and services for the groups by, for example, helping to gain access to funds which are used as a line of credit by the bank itself to such groups. In some cases as in the example below, such business turns out to be more profitable than the bank's existing portfolio! In Northern Bangladesh, the International Fund for Agricultural Development has since 1989 been financing the German Technical Assistance Agency, GTZ, to bring an NGO (RDRS: Rangpur Dinajpur Rural Services) into partnership with four banks including a government owned one (RAKUB). The NGO promotes and trains groups to the point where the groups go to the banks for loans. The banks bear all the lending risk. So far some 1,800 groups, of 10 to 20 members, have been trained. Repayment is good, and has probably been influenced by the ethos of the Grameen Bank and its imitators, so numerous in rural Bangladesh. The banks claim they are making a profit (of something like six per cent on each taka loaned) whereas they make a loss on most of their normal business. About US$1.8 million had been lent up to mid-1995- (Source: Chauduri, 1994.) A further example is a formal-sector bank in Sri Lanka, which has developed a concept of 'barefoot banking'. Its staff take their services to people in their homes, and the bank works with NGOs to make links to groups of microentrepreneurs, relying on NGOs to address the social needs of the entrepreneurs (Wijesundera, 1996). + +2.8.4 Linking with specialised financial service NGOs +If an NGO decides that direct provision of financial services is the best way forward, it may still not be necessary for that NGO to provide the services. A number of NGOs, local and international, have developed skills and experience in financial service provision and may be interested in starting work in a new area. It may prove more effective for these specialised NGOs to manage such an intervention separately from the existing NGO's activities. + +2.8.5 Advocacy +Another strategy for NGOs experienced in advocacy may be to persuade banks to extend financial services to hitherto unserved areas and to poor people in general (WWB, 1994). + +33 + + Microfinance and Poverty Reduction + +2.9 Summary and conclusions +While the overview of informal financial services given here has been brief, there is ample evidence to demonstrate that there is usually a range of such services in existence which poor people are already using. This is the background against whichany plan to provide financial services should be considered. Exploring the array of existing informal services available to different groups in an area can provide a wealth of information. Talking to users and assessing how existing financial intermediation interacts with other local markets and social and economic structures can help to establish the degree to which it is enabling or exploitative, and for whom. Where an NGO is considering intervention, an understanding of existing informal services may provide useful indicators for design, in terms of size, timing, and volume of savings and loans. However it cannot be assumed that NGOs should intervene directly. Indeed, experience suggests that NGOs may lack the ability to manage funds (rather than simply channel them). NGOs may inadvertently damage existing satisfactory financial services by charging interest rates that are too low (and therefore artificially divert demand) or may create indebtedness. There are alternatives to direct provision by NGOs which might involve promotion of services rather than provision. For example, an NGO might make use of its strengths in community mobilisation and training to link up with existing or potential suppliers of financial services in more sustainable ways. • The NGO should investigate the nature and characteristics of financial services already available in order to establish how, for whom, and under what circumstances these services enable or exploit the livelihoods of poor people; understand the services which people value and how they use them, in order to avoid undermining those aspects they find beneficial and would wish to retain; collect information on loan and deposit sizes, types, terms and conditions, which can contribute to the design of new services; and, where poverty reduction is the aim, relate proposals to an analysis of how poverty would be reduced by the intervention. • The NGO should carefully consider whether its staff have the appropriate skills and experience to provide financial services before embarking on a path of direct provision. • The NGO should consider alternatives to direct provision of financial services and explore the range of options that might exist, such as building relations with banks, developing internal credit facilities within groups, or linking groups to the formal sector. + +34 + + 3 +The design of savings and credit schemes for poor people +3.1 Introduction +In the preceding chapter, the role of informal financial services, and how this can be taken into account when deciding whether and how to intervene, has been discussed. This chapter and the two subsequent ones discuss the design, performance, sustainability, and impact of interventions to provide financial services. In the recent past, the best-known microfinance institutions (such as Grameen Bank, Bangladesh, Bank Rakyat Indonesia, and Banco Sol, Bolivia) have achieved high repayment rates, yet most of the people who use them would not have been able to make use of the financial services provided by the formal sector. The design of such schemes has increasingly involved the use of innovative forms of loan collateral, and higher interest rates on loans. Little attention has been given to monitoring the uses to which loans are put, and much more attention has been paid to savings, including their use as a form of collateral. Table 31 summarises the rationale behind some of these design features, which are discussed in more detail below. However, a particular combination of design features will have different outcomes under different circumstances. As a result implementors need to look critically at this combination in understanding the results they see in practice. + +3.2 Targeting savings and credit to poor people +A major concern of NGOs involved in credit provision has always been how to reach poor people, and in the late 1980s and 1990s the rhetoric that NGOs are able 'to reach the poorest' has remained powerful. Some organisations target the poor by defining the criteria which users have to meet in order to be eligible for loans; but 'self-targeting' is increasingly becoming a feature of the design 35 + + Microfinance and Poverty Reduction +Table 3.1 Design features for ensuring high repayment rates on loans and enabling poor people to access credit +Design Feature Intended Effect + +Access methods + +(Means of ensuring that relatively well-off people do not crowd out others' access to loans) + +Maximum Direct exclusion of better-off through eg land-holding ceiling income/assets Small loan size Loans are small enough that better-off are not interested in them Regular meetings Indirect exclusion of better-off through eg compulsory attendance at weekly meetings or contributions of physical labour to which the wealthy will not agree (Mechanisms for screening out bad borrowers and projects) + +Screening + +techniques +Market interest rates Self-selected Encourages loan taking on basis of prospective returns not to capture subsidies Prospective members are asked to form groups themselves and hence screen in favour of those they believe will repay, they also screen proposed loan use Alternatively local officials or power structures may be used to approve loan applications + +Character reference + +B +Incentives to repay +Intensive supervision Peer group monitoring Borrower incentives Agency staff incentives Progressive lending Compulsory Savings + +(Mechanisms for giving borrowers who have no collateral incentives to repay, or failing this, forcing them to repay) Regular meetings with extension staff in or near the homes of borrowers Repayment is made in public in front of the group with consequent loss of face if payment is not made For example, rebates of interest on loans repaid early Agency staff may receive financial bonuses directly related to the repayment performance of their clients Borrowers are able to gain repeated access to loans if they repay and these may also increase in size A small amount contributed regularly into a group savings fund provides insurance or collateral for the loans of all group members (Source: Adapted from Hulme and Mosley, 1996.) + +36 + + The design of savings and credit schemes for poor people of interventions, with members choosing to join the scheme as a result of the services on offer rather than the implementors of the scheme choosing them. NGOs have often implemented a first stage of targeting when they decide the geographical area in which to work, since they may have selected this on the basis of a range of poverty indicators. But geographical targeting alone may be imprecise. There are degrees of poverty in all communities. The next step may be to exclude those with whom the NGO does not wish to work. This can be done in various ways, for example, by defining an asset or landholding ceiling for members; many of the well-known schemes in Bangladesh impose a land-holding ceiling of half an acre. However, while it may act as a guide when field staff are recruiting new members, Rutherford (1995b) points out that NGO workers do not usually seek proof of the size of land-holding, and it is easy to disguise or conceal the amount held; as a result the rule is not strictly enforced. In a number of ACTIONAID programmes, direct exclusion is practised through the use of wealth-ranking exercises (see Pretty etal, 1995). On the basis of the results, project staff identify those in the lower part of the ranking whom it wishes to target; staff may approach these individuals directly to form groups as a basis for a range of development activities, including savings and credit. An alternative to directly targeting a particular group is to use design features which result in the better-off excluding themselves. Two such design features have been used by many schemes: small loan sizes and the holding of compulsory regular meetings to qualify for loans and to make repayments. Richer people are less likely to be interested in very small loans or in attending regular meetings, whereas repayment at weekly or fortnightly meetings may be attractive to poorer people who feel able to manage small, regular cash repayments out of their normal income. In practice, schemes often combine several methods of targeting. For example, having initially selected a relatively poor area to work in, the design of the scheme may include maximum loan sizes and regular meetings with a group who may have been selected using wealth-ranking techniques. Some organisations have assessed the proportion of 'non-target' households in their membership. Figures from BRAC's 1995 impact study (Mustafa et al, 1996) indicate that 10 per cent of members were from 'nontarget' households. Targeting is rarely an exact science and can be a timeconsuming, and therefore costly, activity. Indirect mechanisms which promote 'self-selection' are able to lower these costs. However, as the scale of operations increases, so these mechanisms are less easy to monitor and there is likely to be an increase in the proportion of non-target households involved. Some organisations regard this as an inevitable but acceptable trade-off. + +37 + + Microfinance and Poverty Reduction + +3 3 Women as users of financial services +Making women the beneficiaries of NGO credit schemes is also a targeting technique. Women — whether poor or not — suffer discrimination in the market (Kabeer, 1996). It is thus important to ensure that women can obtain loans provided by intervention agencies. It was pointed out in Chapter 1 that women can be targeted for reasons of efficiency in implementation rather than because of a concern for women's empowerment. This emphasises the need for clarity as to the reason for targeting women, the means of doing it, and the likely outcome in terms of gender relations. Microfinance interventions may lead to empowerment for women by increasing their incomes and their control over that income, enhancing their knowledge and skills in production and trade, and increasing their participation in household decision-making. As a result, social attitudes and perceptions may change, and women's status in the household and community may be enhanced. A useful distinction to be made is between receiving a loan and using it. The investigation carried out in Bangladesh by Goetz and Sen Gupta, demonstrated that, even when it was women who received the loans, gender relations within the household affected how loans were used, and the degree of control the woman borrower retained over their use. It is therefore important to understand what happens to a loan beyond its disbursement to a female borrower. In addition, attendance at regular meetings can involve a heavy cost in terms of time for women, especially for poorer women, who in many socioeconomic environments have heavier workloads than better-off women or men. There may, on the other hand, be circumstances in which the group approach and regular meetings have empowering outcomes for women (Hashemi etal, 1996; Osmani, 1996). One rationale for using groups is that where programmes are intended to reach women, group-based activities mean that women are able to defend their attendance as a social role and obligation. In addition, where women are socially isolated, for example as a result of purdah restrictions on their mobility, meeting other women at the home of a friend or neighbour may be of intrinsic value. The role of the group meeting is thus likely to vary in different social contexts; women borrowers themselves should be involved in determining the role and organisation of group meetings. + +3.4 Lending through groups +The well-known microfinance schemes in Bangladesh, such as those of BRAC and the Grameen Bank, tend to work through groups. Indeed, such + +38 + + The design of savings and credit schemes for poor people schemes are often referred to as 'group-based finance' or 'solidarity-group lending' schemes. Because group members are jointly liable for each individual's loans, this represents a form of'social collateral'. This contrasts to the physical collateral of land or assets which formal-sector services usually require and which poor people are unable to offer. The rationale of groupbased lending is that if a member is having difficulty with repayments, others in the group will put pressure on that member to repay. Further, that if this pressure fails and the member defaults on the loan, the whole group will repay the loan on behalf of the member. Despite the popularity of group-based lending as a design feature, the function which groups play in the scheme can vary: as we have seen, women may find meetings time-wasting, or an important social event, depending on their circumstances. Recent research into the way in which group solidarity operates in practice is illuminating in this respect. First, it is worth clarifying what is meant by 'groups'. Some microfinance schemes have small groups of five or six members, called 'solidarity groups'. A number of these small groups may then come together as 'development centres' or village organisations. Alternatively, a group of some 20 or so people may operate without subgroups. Weekly meetings for saving and loan repayment are usually organised at the level of the larger group. Staff of the scheme are thus able to meet more clients at one time and hence reduce the costs of providing the service. The ratio of costs to loan size is very high when loans are for small amounts. Of course, NGOs often have other motives for working with groups: they use them to implement other activities, such as literacy classes and health education; they may also see them as a means for further organisationbuilding in the area. 3.4.1 Functions of the group in microfinance schemes The role which groups play in the operation of microfinance schemes can be analysed as follows: Targeting: regular compulsory group meetings may serve to discourage better-off people from taking part, increasing the funds available for lending to poor people. Transparency: the openness and accountability which meetings can bring to the process of taking and repaying credit can also prevent certain members of the group colluding with field workers or bank staff over the allocation of credit. Screening of potential borrowers: where groups are formed through self-selection, the individual members effectively screen each other, + +39 + + Microfinance and Poverty Reduction initially selecting those of their neighbours and friends whom they believe to be capable of repaying the loans. This is especially true in the case of small 'solidarity groups'. Incentives to repay: if repayments are made at group meetings it is immediately obvious to everyone involved if someone is falling behind with their repayments. Social pressure may then be exerted on these members to repay by other members and by staff of the scheme. Viewed negatively this is a form of public humiliation for those who start to fall behind with repayments. The social pressure is then expected to act as an incentive to them to either work harder or obtain the repayments from another source. Enforcing repayment: the group as a whole may be penalised by being refused further loans if a member defaults or falls behind with repayments. The policy may then be that the group's savings balances will be used to repay the loan if necessary. Two recent studies have looked at what happens in practice when members fall behind with repayments. Jain (1996) reports that, in the case of Grameen Bank, the concept of joint responsibility was much discussed, but when members fell behind with repayments they were in fact followed up on an individual basis by bank staff in household visits. Moreover, other group members were not penalised by having to make payments on behalf of defaulting members or through forfeiting further loans. Jain goes on to point out that the functioning of the Grameen Bank's development centres as autonomous groups is relatively limited. The leaders of the group have a minor role in credit management and it tends to be Bank staff who actually develop relationships with group members. Jain judges the importance of group meetings to lie in the fact that all transactions are open and staff are thus accountable to group members. This has the important effect of limiting the ability of staff to undermine the system by favouring particular individuals or using their position to further their own objectives. The routine of regular meetings also serves to enforce repayment discipline. In the case of BRAC, it was found that in the early stages of a borrower finding difficulty with repayment, she would first approach relatives and close friends for assistance (Montgomery, 1996). If the situation continued, it was the village-level group that was approached by the BRAC fieldworker rather than the five or six-member solidarity group. The most forceful sanction was the withdrawal of further loans from the larger village group as a whole, and it appears that the effect of this sanction was for the defaulting member to drop out of the scheme. The evidence from BRAC also 40 + + The design of savings and credit schemes for poor people demonstrates that, while groups can be a source of social pressure on borrowing members to repay, it does not appear to be the case that group members always pay for an individual borrower's loans in the event of default. + +3-4.2 Including the poorest +A major concern in connection with the use of self-selecting solidarity groups for financial service provision is that, given the way in which members screen each other, it is the poorest who are least likely to be able to join the scheme. This concern appears to be supported by Montgomery's research on BRAC which showed that those who dropped out after repayment difficulties tended to be the poorer members. However, by contrast SANASA in Sri Lanka demonstrates how people with different levels of relative wealth can be included by operating a range of financial services which respond to the circumstances which poorer households face: SANASA has a three-tier structure of primary societies, district unions, and a national federation which accommodates 8,000 village-level thrift and credit co-operatives with 800,000 members. Village-level groups are highly heterogeneous and vary in size from 20 to 700 members, with the larger ones having turned themselves into small-scale banks. The second and third tiers of this pyramidal structure provide financial and technical support to the village-level co-operatives. SANASA has a strong ideology of self-reliance, savings mobilisation, and the profitable provision of financial services to its members. In practice the upper levels of the structure are strongly dependent on donor funds. Village-level co-operatives have an open and participatory structure with monthly meetings of the general membership, and are run by a small elected management committee. The financial statements of the co-operative and member's business are discussed at the monthly meetings. Financial information is in some cases also written on the wall of the book-keeping room. Such transparency at meetings reduces the likelihood of malpractice and take-over by elites, which has caused failure of co-operatives in Sri Lanka in the past. The financial services offered by the co-operatives are varied and flexible. A village group is autonomous and decides its own range of loan types and savings facilities, which evolve in relation to members' needs and local economic circumstances. A society of 60 members may have as many as ten different types of credit facility. SANASA has attempted to convince primary societies of the viability + +41 + + Microfinance and Poverty Reduction of bringing poorer members into the co-operatives, and providing services which will meet their needs. One way of making it possible for poor people to join is to allow the member's share to be purchased in monthly instalments rather than as a single payment. Of particular interest to poorer members are 'instant loans', and facilities with interest rates varying according to type of access and length of deposit. Instant loans, even at high interest-rates but with overnight access, enable those facing a crisis to respond to it without further endangering their livelihoods. Such facilities act as protection mechanisms reducing the vulnerability of households to shocks and enhancing their coping strategies. Data from SANASA shows that poorer people tend to take smaller loans, because they do not wish to expose themselves to the additional risks that a debt burden represents. SANASA has come to understand the importance of 'hot' money. This is money generated from savings and member's shares, and default on loans from these funds constitutes 'stealing 'from other members. This is a further factor for enhancing peer pressure, and shows the importance of limiting the amount of 'cold' money (i.e. funds supplied by banks and external donors) in the system, which may encourage members not to repay. +(Sources: Montgomery, 1996; Hulme and Montgomery, 1994.) + +3.4.3 Other examples of group-based schemes +The dynamics of groups, once in place, need to be carefully observed to ensure that the results are as intended. The case studies examined in Chapter 6 further demonstrate the different ways in which the group concept can be employed in practice. In three cases the groups involve more or less everyone in the locality and are therefore very large, upwards of 30-40 people and sometimes as many as 100. The sanction of refusing new loans if there is nonpayment is the main mechanism used to enforce repayment. In two of the schemes studied, Casa Campesina Cayambe (CCC) and ACTIONAID in the Gambia, groups are closely related to local institutional structures, which can present dilemmas for implementors. Groups of this nature tend to cut across socio-economic divisions and there is the potential for relatively better-off members to abuse the scheme by ensuring that they themselves get loans. They might also justify not allocating loans to poorer members by arguing that they are not creditworthy and will not repay. The use of joint liability and social collateral mechanisms can improve repayment performance. There are other ways of building a sense of identity + +42 + + The design of savings and credit schemes for poor people with the scheme and encouraging reliable repayment. Participation in the operation and decision-making structures of the scheme is likely to promote a sense of ownership on the part of users. In three of the case studies in Chapter 6, URAC, Ladywood Credit Union, and CCC, members are involved in committees which review performance, allocate new credit, and advise on policies and practice. Repayment is likely to be enhanced by the use of 'hot' rather than 'cold' money, as explained in the account of SANASA above. There is supporting evidence for this from India in the case of MYRADA, Community Development Fund, and ASSEFA (Bennett, Goldberg and Hunte, 1996, Copestake, 1996a). Members' sense of ownership of the scheme is less when loan funds are from external sources than when they are from members' savings. This has been compounded by the prevalence of cheap externallyprovided credit in the past, coupled with a lack of concern about repayment. While many schemes use groups, Hulme and Mosley concluded from their study of 12 microfinance institutions (1996) that groups are not always a crucial feature of scheme design. There are examples of institutions successfully providing financial services to poor people by dealing directly with individuals. Bank Rakyat Indonesia (BRI) (see Chapter 1) and BAAC in Thailand are two such examples. BRI makes use of the local knowledge of village-based agents in deciding whether to approve loans to new borrowers. The case study of Ladywood Credit Union in Chapter 6 provides another example of lending on an individual basis; in fact, credit union legislation in the UK stipulates that the privacy of the individual must be preserved. + +3.5 Savings +Poor people hold savings in many forms, including assets such as animals, grain or jewellery. The account of informal services presented in Chapter 2 demonstrates that, given the opportunity, people will save in cash. In discussing the design of a savings component, the purposes for which people save, and the characteristics that savings services need to have in order to meet their requirements, must first be clarified. Saving in the form of assets has limitations. Grain can deteriorate in storage or be lost to pests; animals require looking after and can die; moreover, when they are held as insurance against crises such as drought, they are often sold at a loss if the crisis occurs, because of deteriorating terms of trade or the need for a quick sale. Holding a visible and available form of savings, such as grain or assets, can make it hard to resist demands and claims from other relatives. Jewellery is relatively illiquid as an asset unless it can easily be pawned at times of need. When people save in cash, they often keep it in their homes, + +43 + + Microfinance and Poverty Reduction where it is at risk of theft and loss in case of fire. Small amounts of accessible cash are always needed for emergencies, ranging in scope from unexpected guests to death or illness in the family. The purposes of saving can be summarised as follows: • daily financial management: the need to keep cash safely in order to manage and deal with day-to-day expenses and occurrences, including emergencies; • consumption smoothing: dealing with seasonality or unemployment by holding over income from one time period to another; • accumulation: building up savings balances in order to undertake future large expenditures, such as the purchase of housing materials or agricultural implements, or payment of school fees; • insurance: building up savings balances to deal with irregular events such as illness, marriages, and funerals. + +3.5.1 The value of a savings facility +People are well aware of the risks involved in saving and as a result value safe places to keep their cash. They may look for a range of attributes in a savings facility, including: • safety: will their savings be held safely by the bank or other depositor? • ease of withdrawal: can they get quick access to their money when they need it? • proximity to home or workplace: ease of access in terms of distance and time; • prizes or bonuses for good saving; • high interest rates: worthwhile monetary return on saving; • informality of procedures and polite treatment when making deposits or withdrawals. The above list is the result of a ranking exercise undertaken with BRI customers (BRI, no date). It is notable that safety and ease of access come very near the top of this list and that monetary returns in the form of interest rates and prizes are lower priorities. It is also likely that women and men will rank these attributes differently, since they may have different purposes in saving. + +44 + + The design of savings and credit schemes for poor people Until recently, savings services have been a relatively neglected component of microfinance debate and practice. Definitions of poverty based on the inadequacy of income focus on the shortage of capital available for investment, and many financial interventions attempt to alleviate this constraint by using external funds to make capital available. However, studies of informal financial services (see Chapter 2) show that poor people value a savings facility as a contribution to economic security. For NGOs and other donors, part of the emphasis on credit may have resulted from the fact that delivery of credit utilises donor funds whereas mobilising savings does not. + +3.5.2 Compulsory or voluntary savings? +A distinction is often made between 'compulsory' and 'voluntary' savings. In a compulsory system, saving is either required as a condition of membership or in order to receive loans. In contrast, voluntary savings schemes allow members to make deposits whenever they wish. Compulsory and voluntary savings are characteristic of two fundamentally different philosophies (Robinson, 1995). Compulsory savings schemes 'assume that the poor must be taught to save, and that they need to learn financial discipline. [Voluntary savings schemes] assume that the working poor already save, and that what is needed are institutions and services appropriate for their needs.'(p.6) It appears that people always need savings accounts but that loans are needed only occasionally. The fact that BRI has 14.5 million deposit accounts and only 2.3 million loan accounts supports such an argument. When compulsory savings schemes are tied to borrowing, very poor people may decide not to participate, because they are reluctant to take on debts; or they may be excluded by existing members who fear such people will be unable to repay the loans out of regular income. Rutherford (1995a) argues that savings facilities that are flexible and voluntary, and which allow people to build savings balances independently of debt, are an unmet demand of poor people in many of these schemes. It is this kind of service which can effectively reduce poverty by enabling people to protect their incomes. There is now, therefore, growing appreciation of the demand for flexible savings facilities for poor people. Saving small amounts regularly, and feeling a sense of obligation to do this, are positive features for many people, for whom the discipline involved is important. This realisation is resulting in new designs for savings accounts. Buro Tangail, for example, a financial services NGO in Bangladesh, is introducing a range of accounts allowing users to choose one which meets their needs. These include a fully flexible savings account, and accounts which involve a fixed weekly deposit over a number of years. + +45 + + Microfinance and Poverty Reduction Drawing on the successful experience of BRI in mobilising savings, Robinson has suggested some of the conditions which need to be in place in order to launch voluntary savings services. Thefirstof these is an enabling macroeconomic environment, with relatively low and stable levels of inflation, and an appropriate legal and regulatory environment, together with political stability and suitable demographic conditions. As she points out 'Beginning savings mobilization in the midst of hyperinflation, civil war or in a sparsely populated desert are not recommended!' (1995, p.2). However, few economic environments are as 'enabling' as Robinson would like. Indeed, in this context the meaning of the word is unclear (Yaqub, 1996). Moreover, the work of URAC in Mexico (one of the case studies) shows that voluntary savings schemes can work well even in the presence of high inflation. The second condition concerns government supervision arrangements for institutions taking deposits. In order to protect users, deposit-taking institutions must be regulated. Existing legislation in many countries is a constraint on NGOs' mobilising savings and taking deposits themselves. Organisations which are not formally registered as banks may face restrictions on their ability to take deposits. If the NGO facilitates the opening of savings accounts in local banks on behalf of its depositors, it cannot use funds from this source for on-lending to other members. There are good reasons for such regulations; NGOs are not necessarily suitable institutions to hold deposits. Third, Robinson stresses the history, capability, and performance of the institution. She emphasises the responsibility that taking savings entails (it is easier to learn to manage your own funds through credit first) and the complexity of operating a savings scheme properly. + +3.5-3 Linking savings to credit +Whether savings are compulsory or voluntary, there is often a link between the savings component and access to credit. The link can be formed in a variety of ways: • The amount of the loan may be a fixed multiple of the amount deposited (savings flow) over a given period. By making savings deposits of a certain level, the client demonstrates his or her ability to repay a loan with similar repayments out of regular income. • The amount of the loan may be a fixed multiple of the amount saved (savings stock). • Once a loan has been taken, the savings in the account may be retained as collateral for the loan, and withdrawals taking the balance below a certain level not permitted. + +46 + + The design of savings and credit schemes for poor people In these ways savings can act as part of the lender's screening process. By observing the savings behaviour of borrowers, the lender can judge whether borrowers are good risks, and their capacity to manage debt. This also helps to prevent the lender indebting a borrower by being over-optimistic about the borrower's ability to repay. The case studies in Chapter 6 illustrate the way in which these mechanisms have been applied in practice. In the case of SUNGI in Pakistan, compulsory minimum monthly savings are a criterion for receiving a loan, although the loan amount is assessed in relation to the purpose proposed. In Mexico, URAC operates a system by which an applicant for a loan must be making regular savings with the scheme, and the maximum loan amount is five times the savings balance. In the case of Ladywood Credit Union in the UK, loan size is a maximum of twice the savings balance, and the repayment plan is drawn up in discussion with the borrower and in relation to their savings record. In this way the scheme attempts to set instalment levels just below the amounts previously deposited in order to ensure that the savings balance continues to rise so that the borrower's financial security is not being eroded by taking the loan. + +3.6 Forms of loan +Some microfinance institutions make loans in kind as well as in cash; many require applicants to specify what they are going to use the loan for, with cash credit being 'directed' to particular uses, because lenders often prefer loans to be used for production rather than consumption. This sub-section considers the advantages and disadvantages of loans 'in kind' and directed credit. (Loans which are both given in kind and repaid in kind are not discussed here; see Fall (1991), Strachan and Peters (forthcoming) for accounts of cereal banks and similar schemes.) + +3.6.1 Credit in cash or kind? +Credit is sometimes provided 'in kind' by schemes, in the form of seeds, tools, fertilisers, larger agricultural tools such as ploughs and weeders, or as inputs for construction and home improvement. The main arguments given for such provision usually relate to the local unavailability of the goods supplied. The NGO may supply the goods directly or provide vouchers for redemption against specified items in particular retail outlets. Of our case studies, URAC provides vouchers for the purchase of building material through local suppliers under the terms of its construction loans. + +47 + + Microfinance and Poverty Reduction Direct supply by an NGO lender can lead to a range of problems: • It makes the borrower dependent on the NGO for inputs and the NGO will tend to be blamed if the tool or other input is in some way faulty or does not arrive on time. • It can prevent the development of a local market for the inputs if they are supplied from outside the area, making it unviable for suppliers to set up locally. An alternative is for the NGO to ensure that inputs are obtained from local suppliers. • The NGO is likely to incur large costs which are not usually included in the amount of the loan. In effect borrowers receive an additional grant in the form of transport costs, and they may not be able to afford to pay these costs when the NGO stops supplying. Most NGOs prefer to issue loans in cash rather than kind. The borrower is then able to use the credit as he or she sees fit and to purchase any materials required. The borrower then takes full responsibility for the result so cannot allege sub-standard and inappropriate inputs as an excuse for not repaying the loan. Furthermore, the costs of transporting cash tend to be lower than those of transporting seed, fertiliser or machinery, thus reducing the operating costs of the NGO. Local suppliers are likely to respond to the local demand generated and this in the longer run will reduce transport costs for everyone. Nevertheless, if the lending institution has proven integrity in supplying goods of high quality, it may work to the advantage of the borrower. An example in the case of URAC is the vet who provides animals instead of cash loans and with them a short-term guarantee of the animal's health. + +3.6.2 Directed or undirected credit? +In schemes where cash loans are given, credit may be 'directed' to certain purposes. It is often specified that loans should be for productive purposes, because lenders fear that if the loan were used for other purposes it would be less likely to be repaid. It is assumed that repayments need to come out of additional'income, accruing from productive investment. An alternative view is that the household economy has a range of production and consumption activities which are related in complex ways, so that a distinction between them is artificial. The borrower should be allowed to make use of the cash credit as she or he sees fit. Attempting to direct the credit to a particular purpose is inefficient, because it is very difficult for the lender to monitor the exact use to which loans are put. If loans are specified as + +48 + + The design of savings and credit schemes for poor people being for productive purposes only, the household may state such a purpose in the loan application but may not use the money in this way in practice. Evidence suggests that loans are likely to be split up and used to cover a range of household needs and expenditure. Therefore the lender should not be concerned with what the loan is used for as long as it is repaid. Demonstration of the interconnectedness of consumption and production activities can be illustrated using the case of pre-harvest loans in seasonal agriculture. In land-abundant areas, loans to make food for consumption available at this time can also be viewed as production loans, as they might enable farmers to continue to work on their fields and hence represent an investment in productive capacity. Farmers may no longer need to spend time undertaking casual labour on other people's farms to earn money to buy food; or loans may simply ensure that nutritional requirements are met so that farmers are able to carry out work on their own farm. Clearly these arguments do not necessarily apply where a scheme is lending to micro- or small-scale enterprises. Loans for such purposes tend to be larger in size and usually involve a more direct relationship between the lender and borrower. In the course of this relationship it is likely that the lender will undertake an appraisal of the investment with the borrower before approving the loan. (This is not an area examined in detail in this book; see Barrow and Barrow, 1992.) However, once undirected cash loans are in place, loan facilities directed to specific purposes have a role. In two of the case studies, URAC and Casa Campesina Cayambe (CCC), there are a range of loan facilities available. The 'normal' cash loans can be used for any purpose and carry no restrictions. But larger loans are available for specific purposes, such as house-building, constructing bathrooms, or for productive enterprises. The advantage of such directed loans are that the repayment schedules can be tailored to suit the type of investment being made. Housing loans, for example, tend to have longer repayment terms than other loans. Schemes which offer emergency loans are usually concerned to protect their members from the potentially impoverishing effects of events such as illness or death in the family. A loan which is easily available at short notice in response to such events might prevent the borrower having to sell valued assets such as livestock or jewellery. Of the case studies, CCC has this kind of loan facility, which provides special credit in the case of illness or domestic emergency. Loan approval in such cases by-passes the usual process but requires a doctor's certificate in the case of illness or endorsement by a member of the Community Committee in the case of other domestic emergencies. Similar procedures to enable quick disbursement of loans in emergencies are also available to members of URAC and Ladywood Credit Union. + +49 + + Microfinance and Poverty Reduction + +3.7 Loan disbursement and repayment schedules +The model of loan scheme that has become dominant in Bangladesh involves members holding loans on a more or less continuous basis. For example, in the Association for Social Advancement, disbursement follows a very strict schedule: once the member has saved for a certain number of weeks, usually 12, she or he is eligible for a loan which is repaid in fixed amounts over the following 50 weeks. As soon as this loan is repaid the borrower becomes eligible for another one. While this system can be seen as helpful in terms of its simple and mechanical rules, it has been criticised for its lack of flexibility; members take on loans when they are available rather than when the borrowers want them. It is a system which requires people to go into debt in order to make use of their capacity to save: the loan is a lump sum to be received now and repaid by saving over the next 50 weeks. Such a system can force people to adopt complicated strategies to manage the funds until they actually need them, if they do not wish to miss their turn to obtain a loan. This helps to explain the myriad of on-lending arrangements that usually exist between group members (Rutherford, 1995a). This problem is not encountered in systems where members can take loans at times appropriate to them. The case study scheme in Pakistan, run by SUNGI, which is most closely modelled on the Bangladesh schemes, also operates a system of loan applications to be made via the village organisations' credit committees, but there is no pressure to take a loan once a member is eligible. Flexibility in amounts and timing of disbursement seem to be significant factors in providing a credit mechanism which poor people can manage in relation to their livelihood strategies. An approach based on small cash-loans with simple and easily verifiable criteria, such as attendance at meetings, and appropriate savings deposits or balances, enables greater decentralisation in decision-making over loan applications. This, in turn, means that the lead time between application and disbursement is likely to be reduced, which is more convenient to the borrower. The timeliness of loan disbursement is crucial when loans are being used for seasonal activities such as agriculture. If a programme of seasonal loans is in place which farmers utilise to buy inputs or prepare land then complicated appraisal and approval procedures which might delay disbursement are unhelpful. Fanners will not be able to undertake farming activities when they would wish to, and the usefulness of the credit to them is much reduced. This can in turn worsen the prospects of repayment if they are highly dependent on agriculture for income. Repayment schedules involving small and frequent instalments are one of the principal features of the 'new' design of credit. As mentioned above, it has + +50 + + The design of savings and credit schemes for poor people been demonstrated that in a variety of circumstances, borrowers are able to repay loans out of regular income and need not rely on the income generated from a specific and identifiable investment. In the past, repayment schedules linked to income streams on investments have often been over-optimistic in their expectations and hence borrowers have not been able to keep up repayments. Loans for micro-enterprises are rather different in nature, but 'little and often' may also be a good rule of thumb for loan repayment instalments in these cases. However, in some areas where seasonality is a highly significant factor and cash is virtually unavailable at certain times of year, there is also a need for flexibility in repayment schedules. In these circumstances, lower levels of repayment could be arranged during particularly difficult months and higher ones at times when market activity and incomes revive. Even here, the principle of repayment of loans out of regular income can be retained. + +3.8 Interest rates +Interest rates are an issue over which there has been much debate among microfinance practitioners (see Chapter 1). Along with the diagnosis of the problem as a shortage of investment capital available to poor households goes the assumption that credit obtainable from local informal sources carries too high an interest rate. Before continuing this discussion it is important to understand what an interest rate is. Put simply, the interest rate is the price of money. As a price it is made up of a number of components as far as the lender is concerned. It is the means through which the lender: • pays for the cost of the funds that are being lent (cost of capital); if these are from savers then the savers are likely to expect a return which will at least cover inflation and so maintain the value of their savings; • recovers the costs of providing the service (costs of administration): the costs of the staff employed to give and recover loans, and the costs of the offices, vehicles and stationery that are necessary to provide that service; • covers losses as a result of those who default on their loans (costs of default). The interest rate which is charged to borrowers is usually called the 'nominal' interest rate. This may be different from the 'real' interest rate, which is roughly calculated as the nominal interest rate minus the rate of inflation in the country (this approximation works best at low rates of inflation). The rate of inflation indicates the degree to which money is + +51 + + Microfinance and Poverty Reduction declining in value over time. If the nominal interest rate is higher than the rate of inflation, then the real interest rate is positive. For borrowers, a positive real interest rate means that they have actually paid something for the benefit of using the money that they have borrowed; and for savers, that the money they receive back will buy more than their original deposit would have done. In recent years many NGOs have accepted the need to charge interest rates which cover inflation and make a contribution to costs. This means interest rates which are positive in real terms and comparable to those charged by formal-sector banks (sometimes termed 'market' interest rates). As discussed in Chapter 1, this differs from earlier practice when the provision of credit by NGOs and state banks was usually at subsidised rates. This 'cheap' credit was attractive to borrowers outside the target group, and was diverted away from its intended purposes; and loans were often not repaid. This combination of 'cheap' credit and widespread default resulted in the rapid erosion of loan funds. The importance of charging a rate of interest which covers the costs of inflation, administration, and default is that the loan fund is able to revolve and maintain its value. In the past, revolving funds have often dwindled as a result of these costs. Where the loan fund is generated out of members' savings rather than given as a grant by donors, it is even more essential to ensure that its value is maintained. However, the ability to cover all of the administrative costs through the interest charged to borrowers is only likely to develop over a period of time, as the system of lending becomes more efficient and a greater number of borrowers are receiving loans. Attempting to recover costs in the early stages of a scheme is likely to result in interest rates which are excessively high. When comparing interest rates with those of formal-sector banks it is also important to recognise the hidden costs that poor borrowers face when they approach banks. They may be charged loan fees, have to organise 'gifts' for bank staff, and incur transport costs to get there. Worse, they may be treated with disdain and even contempt — not a monetary cost, but a cost all the same. The actual price that the borrower is paying for loans from these sources is therefore higher than the interest rate alone; and the attitude of bank staff can make the transaction even more burdensome. This is why loans which carry interest rates comparable to the formal sector are still likely to be positively regarded by clients. + +3.9 Integrating financial services with other activities +Few NGOs provide savings and credit services without getting involved in related development activities. For ACTIONAID and Oxfam an integrated approach is usually seen as essential in addressing the causes of poverty + +52 + + The design of savings and credit schemes for poor people identified in a particular area or by a particular group of people; it is rarely the case that savings and credit activities alone will reduce poverty. A range of other constraints are likely to exist, especially in making use of credit for production purposes. For example, numeracy may be a need for women who want to embark on petty trading and keep records to find out if they are actually making money; preventive health programmes may be the best way to reduce the need for credit to meet health-care expenses. NGOs may have a number of objectives in integrating savings and credit into their other activities, and a range of ways of doing so. Here we will distinguish between three approaches: first, where the NGO's objective is to form groups which will function as social organisations in their own right rather than being solely for the purposes of providing credit; second, where groups are an effective means of delivering related development activities, such as literacy and health education; third, where savings and credit activities overlap with other services, such as business and skills training, to promote economic activities. An integrated approach does not necessarily mean that staff are involved in delivering all aspects of the programme and are therefore generalists. Interventions may be operationally distinct, involving several specialist staff. We have argued for the need for strong staff skills in Chapter 2, and will suggest in Chapter 4 the benefits of keeping programme accounts entirely separate. + +3.9-1 Savings and credit for group formation and institutionbuilding +In some cases, forming groups is not simply a means of delivering savings and credit services but of building up group skills as part of a wider strategy of 'empowerment'. An analysis of poverty which holds that powerlessness rather than low income is the main problem may lead to the view that collective action has an important role in bringing about change. The NGO is likely to work with the group to enable it to develop its own analysis of the situation, and plan and implement solutions to problems, which might range from building a water supply to campaigning for land rights. In this context, savings and credit is sometimes used as an early intervention to create a sense of identity and shared interest among group members. The analysis of poverty may result in a design for savings and credit provision which concentrates on developing the group's own resources, in terms both of capital, through savings and management, and of group control of the rules and regulations governing the savings and credit systems. As in the case of SANASA (see 3.4.2), the internal services provided by the group to its members can be quite extensive. This approach promotes + +53 + + Microfinance and Poverty Reduction internal control over savings and loan funds and is likely to bring about stronger identification with the scheme. Among the case studies discussed in Chapter 6, URAC in Mexico and ACTIONAID in The Gambia have made institution-building a core component of their approach. URAC is a peasant union whose agenda is economic self-sufficiency in order to reduce the dependency and exploitation which members have experienced in economic relationships. In the course of achieving this the involvement of members in the decision-making structures of the union is vital. ACTIONAID in the Gambia, on the other hand, sees its credit activities as a means of building up financial resources which village development groups (VDGs) can use to further their own development agenda. Alongside the credit programme there is a programme of training for groups to develop their management and organisation skills. + +3.9.2 Social development programmes +Even where the focus is not on enabling groups to manage their own development projects, savings and credit schemes often run alongside programmes of health and literacy. The need for transparency and accountability in financial transactions in such schemes is crucial, but not possible unless members can ensure that records are being properly kept. Sometimes training in literacy and numeracy are a necessary adjunct for a savings and credit programme if there are not enough group members who can fill in their own pass books or keep records. But many literacy programmes in the past have only added numeracy as an afterthought, and failed to provide adequate skills to enable participants to maintain records and ensure accountability. This is part of a wider failure of literacy programmes in general terms. Some new approaches to literacy have succeeded in shifting the balance to more relevant and practical numeracy and literacy skills (Archer and Cottingham, 1996). + +3.93 Economic development activities +In the past, NGOs have often used savings and credit as part of incomegeneration programmes. Such interventions have seldom been particularly successful (Mukhopadhyay and March, 1992; Piza Lopez and March, 1990; Riddell and Robinson, 1995). Like savings and credit programmes, this aspect of development work has also been undergoing some re-examination. Income-generation activities promoted by NGOs have usually concentrated on activities carried out by groups. Problems often resulted from difficulties of organisation and management within the group, as well as from + +54 + + The design of savings and credit schemes for poor people over-optimistic expectations of the income to be generated from the enterprise. This is not to say that there are no successful examples: rather, that these serve to underline the need for internal group cohesion and strong leadership and management, which not all groups possess. People coming together with a common interest of securing a service, such as savings and credit, or working on a common agenda of collective action, can still encounter problems but these are significantly different from the demands of time and energy, often with low returns, arising from a group economic project. The provision of savings and credit to individuals rather than groups has been one of the consequences of this past experience. The support given to micro-enterprises in terms of business and skills training is often referred to as 'non-financial services'. An argument is now being put forward that such services should be demand-led and selfsustaining (Tanburn, 1996). The rationale behind this contention is that services provided in the past by NGOs (and other providers) have not been particularly useful or appropriate to those trying to set up in business. Therefore if users are not willing to pay for the service, this indicates it is of little real benefit to them. We argued above that financial management is not necessarily a strong point of NGOs. Likewise, business management is not in general an area in which NGO staff have much direct experience. Therefore it may be more effective for an NGO to encourage entrepreneurs to choose their own training programmes, which the NGO then pays for (with loans if necessary), than to supply a service that is sub-standard. This strategy would appear to make sense where small businesses are welldeveloped and have fairly specific needs, and where training opportunities are available, for example, in urban environments. The strategy may encounter greater difficulties where people want to exploit skills or start businesses which do not exist in the area, and they may need additional support to make contacts and visit places where such businesses operate. In such circumstances the role of promoter rather than provider of support services may be more appropriate for the NGO. Further considerations for income-generation schemes relate to the economic opportunities already existing in the area. Credit supplied in quantity, where knowledge of what to produce and trading opportunities are limited, can quickly result in market saturation. Supporting moves to experiment and invest in new productive activities may therefore be important. There may also be good arguments for sharing risks with people as they go about experimenting with new activities. In one of our case studies, CCC in Ecuador, this has been done in the case of a trout-rearing project, an enterprise not known in the area and one which would be far too risky for + +55 + + Microfinance and Poverty Reduction individuals to take on. However, there is obviously a need to distinguish between supporting experimentation and wasting money, particularly if enterprises are clearly not thriving and individuals have lost interest. Business skills and experience are of great value in making such judgements and NGOs often have a lot to learn from others. + +3.10 Summary and conclusions +This chapter has explained and discussed a number of central features in the design of microfinance for poverty reduction. The discussion has sought to illuminate the principles which underlie these features and point out that they need to be combined in different ways in different schemes. Poverty targeting: many schemes now practise 'self-selection' through keeping loan sizes small, and demanding regular attendance at meetings which better-off people would find time- consuming or socially difficult to attend. However, some schemes still use measures to directly target poor people, such as wealth ranking. 'Self-selection' lowers costs but cannot be assumed to exclude the better-off entirely, especially if loan sizes start to rise as the scheme progresses. Loan size as a feature of targeting can create a dilemma if it prevents poor people ever taking on larger loans. Women as scheme users: many schemes are designed to provide women with credit. However, it cannot be assumed that disbursing loans to women means either that they use them or that they are empowered. Scheme implementors need to be clear about the gender-related objectives of their intervention and to understand the implications that delivering financial services have for relations between men and women. They should also find ways of supporting women's own strategies for enhancing their position. Lending through groups: groups have been a common component of methodologies for lending to the poor but repayment does not solely depend on peer pressure; groups take different forms in different contexts and it is important to analyse the mix of circumstances which ensure repayment. This mix goes beyond peer pressure to include supervision, management, transparency, and accountability of the systems. Savings: voluntary and flexible savings facilities have so far been a largely unmet need of poor people. Interveners should consider developing flexible + +56 + + The design of savings and credit schemes for poor people savings mechanisms. However, to operate a savings facility is to take responsibility for other people's money, and should not be undertaken lightly. Interest rates: there is now widespread acceptance of the need to charge interest rates which cover inflation and make a contribution to the cost of providing the service. This reassessment has recognised that it is often the availability rather than the cost of credit to poor people which is the constraining factor. Long-term availability requires that the loan fund does not become eroded through inflation, and that a degree of cost-recovery ensures sustainability (see Chapter 4 for further discussion). • NGOs should understand the design features they incorporate in a scheme in the light of local social and economic circumstances and the objectives of the scheme; there is now a continuously evolving set of design features that can be used in microfinance schemes but no single blueprint for use in all circumstances. • NGOs should continuously and critically assess design features in the light of the results they produce in practice. This is an important part of impact assessment, as will be discussed in Chapter 5. + +57 + + 4 +Financial performance and sustainability +4.1 Introduction +As with any programme intervention, performance monitoring of microfinance schemes is essential. In the context of managing money the need for timely and accurate information about what is happening cannot be stressed too highly. This chapter does not provide guidelines for financial analysis but emphasises the importance of financial management — an area in which NGOs have tended to be weak. Financial sustainability, which will also be discussed in this chapter, is unlikely to be a feasible objective if financial management is poor. The ability of some of the best-known institutions which have been operating in this area to gain consistently high repayment rates of 90 per cent and above, and to extend their coverage to relatively large numbers of individuals (see Table 1, Annex 1) has raised expectations that such microfinance institutions may be able to become sustainable in the long term. + +4.2 Managing and assessing financial performance +Managers of a microfinance intervention need to know how well it is performing in financial terms. The first essential is to produce financial statements at the right time. Information that is produced late cannot give an accurate picture of the organisation's financial position. Next, the financial statements must be analysed to produce information about the performance of the scheme which can be used to improve that performance. The crucial question here is whether the portfolio of loans and savings that the scheme is holding is being effectively managed. We briefly discuss the repayment rate in order to highlight the importance of a proper understanding and appreciation of the intricacies involved in financial management. 58 + + Financial performance and sustainability (For more comprehensive guidance on financial management and analysis reference should be made to SEEP, 1995; IADB, 1994; Christen, 1990; and Stearns, 1991.) 4.2.1 The repayment rate The repayment rate is the indicator most often used as a measure of the performance of a credit scheme (see Annex 2 for an explanation of how it can be calculated). Despite its universality, the way in which the repayment rate is calculated and monitored is not entirely standardised as it must relate to the design of a particular scheme. This means that comparisons across schemes must be undertaken with an awareness of how repayment rates have been calculated. One of the mistakes that is often made in calculating the repayment rate on loans is that the rate is not clearly defined in relation to a given time period. The figure may therefore include loans which have been made and fully repaid, or it may include repayments which were made after they were due. The amount repaid might include early repayment of their loans made by some borrowers (called 'prepayments'), and these should be excluded from the calculation. Since the repayment rate should precisely measure the ratio of payments made to payments scheduled as due at a particular time, it can also be referred to as the 'on-time' repayment rate. The different methods used in calculation are well illustrated by the case study schemes set out in Table 6.2, page 88. ACTIONAID in The Gambia calculates its repayment rate as a historical figure reflecting the total amount that has been repaid out of the total ever disbursed. This is a relatively common method but is not standard banking practice and does not indicate the current status of outstanding loans. 4.2.2 Arrears and default Other indicators, such as default and arrears rates, are also useful financial management information. These indicators monitor the lending portfolio at different points. The arrears rate can capture loans that are past their scheduled time for repayment, i.e. are overdue, and need to be followed up. The default rate includes only those loans which require special action if they are to be recovered. An age analysis of loans outstanding is a standard technique of banking practice. This involves classifying loans in terms of the length of time they are overdue. Default is a subject that tends to make fieldworkers nervous. They feel that once a borrower knows that a loan is regarded as in default, then he or she will not bother to repay. This reflects the 'soft' approach to repayment in which there are few consequences for non-payment. The classification of a + +59 + + Microfinance and Poverty Reduction loan as in default should precipitate action on the part of staff of the scheme. At the same time it is vital that the financial health of the scheme is monitored and the intervener knows what proportion of the capital is at risk. Action to recover loans can also be looked at in the context of other local financial systems. Borrowers who are falling behind with repayments may be indebted to other lenders as well, hence they may set about a rational calculation of which loan it is best for them to default on, based on their own view of the relative merits of different lenders and with which it is most important to retain a good credit record. This is when external schemes, such as those run by NGOs, are likely to encounter problems. The borrower may decide that the NGO is likely to leave the area at some future date, and hence is not likely to be a reliable long-term source of loans. Default on an NGO loan is likely to have less effect on the borrower's local creditworthiness (except in group-based lending systems, where non-payment is public knowledge). The borrower may also think that the NGO has welfare-related objectives and therefore is likely to be more 'understanding'. It is the syndrome of the 'understanding' NGO, with 'soft' repayment enforcement, which is most likely to lead to the failure of any credit scheme. While the group system of social collateral can provide an added incentive for individual borrowers to repay, there is evidence to suggest that much repayment enforcement is actually carried out by scheme staff. The problem is different if the whole group decides that repayment is not in their interests. This is most likely to occur at the outset of a scheme, when the NGO (if an external one) and the borrowers may not know much about each other. It is because NGOs and other institutions, including governments, have not enforced repayment in the past that the community may collectively decide not to repay. In such cases, if the NGO is serious about the scheme being credit rather than grants, then it must demonstrate this either by taking action to recover loans (for example, asset seizure) or suspending all further loans until existing loans are repaid. + +4.3 Financial sustainability +High repayment rates have been reported in schemes where interest rates are high enough to partly cover the costs of providing the services. The circumstances in which long-term financial sustainability might be possible have become a subject for research. A recent study of 11 large established microfinance institutions (Christen, Rhyne and Vogel, 1994) identifies three levels of financial sustainability: + +60 + + Financial performance and sustainability Level 1 Subsidy dependent: the costs of the organisation are funded through grants and subsidies from donors. Level 2 Operational efficiency: the non-financial costs of operation (salaries and other administrative costs) are covered out of programme revenues (interest on loans and fees). Level 3 Fully self-sufficient or profitable: the institution is generating positive (inflation adjusted) returns on assets. The financial costs of operation are also covered: capital for on-lending is raised through commercial loans and income is enough to cover the costs of these loans. Ten of the eleven organisations studied had reached level 2, operational efficiency, and five had reached level 3- The study therefore concluded that 'it is consistently possible for competent microfinance programs to achieve operational efficiency within a reasonable timeframe' (p.5). However, they are a little more cautious about the potential for full financial selfsustainability, suggesting that 'it remains an open question whether full selfsufficiency is consistently possible in a variety of settings' (p.5; authors' emphasis). It is with studies of this type in mind that Otero and Rhyne (1994) propose that 'it is incumbent upon governments and donors that currently support micro-enterprise programmes to demand movement toward viability' (p21). Discussions of the potential for sustainability sometimes suggest that a microfinance institution can become financially sustainable between seven and ten years after starting operations. Branches of the Grameen Bank can become operationally self-sustaining in the space of five years (Khandker, Khalily and Khan, 1995). Branches of the ASA network in Bangladesh appear to be able to reach this level within eight months of commencing their operations (Rutherford, 1995b). This is achieved by the rapid mobilisation of group ('samity') members and their savings; and the issuing of the first wave of loans within three months of mobilisation. As the ASA branch receives the groups' weekly savings and interest payments it is able to utilise the savings and interest to make more loans, and the interest rates charged allow the salaries of workers to be covered. 4.3-1 The pros and cons of 'scaling up' Ways of achieving financial sustainability are currently the subject of debate among practitioners. Much emphasis has been put on microfinance operations reaching a sufficiently large number of users so that economies of scale can be made, and the cost of servicing numerous small transactions starts to + +61 + + Microfinance and Poverty Reduction fall. This emphasis is a cause for concern, as increasing the scale of the operation may become an objective in itself. There are major organisational and management problems to be faced as operations scale up. For many organisations, scaling up may not be appropriate. Two of the schemes described in Chapter 6, URAC in Mexico and Ladywood Credit Union, partly derive their strength from their relatively small scale. For URAC it is the objective of building a peasant union that is important, and the financial services component is one aspect of its work which is contributing to this end; extending its financial services more widely might undermine the core objective. In the case of Ladywood Credit Union, it is the closeness of the service to members, and the time which can be given to helping them address their financial difficulties, which are significant features of the service, and these benefits would be compromised if scaling up was an objective. A further problem that can arise in the pursuit of financial self-sustainability is that of retaining a focus on the poor. Some organisations find that their users who do well need larger loans over time. This is termed 'graduation', as the users can be seen to be 'graduating' out of the target group which the scheme initially defined. The organisation is then under pressure to increase the size of its loans and continue to work with these people. Although costs per loan fall when loan sizes increase, the disadvantage is that better-off users are likely to be attracted to the services. The potential for fully self-sufficient microfinance institutions in all settings is questioned in a study of nine interventions in West Africa (Webster and Fidler, 1995). Their findings lead them to believe that while every attempt to move to full cost-recovery should be made, 'the costs of reaching very poor people in remote, rural areas of this region will always exceed possible revenues and [that] subsidies will always be needed to fill the shortfall if the institution is to remain in operation.' A similar conclusion is reached for remote and mountainous areas of Nepal and Pakistan in comparison to more densely populated areas of Bangladesh, Sri Lanka, and India (Bennett, Goldberg and Hunte, 1996). However, Bennett etalsuggest that it is not only geographical inaccessibility that raises costs but also female seclusion, illiteracy, and poverty. 4.3.2 Issues in sustainability: the experience of 'village banking' The 'village banking' model illustrates some of the issues in sustainability outlined above. It is a model of financial service delivery set up by the Foundation for International Community Assistance (FINCA), and is employed by a range of NGOs, including Catholic Relief Services, Freedom From Hunger, and Care, in a number of countries. + +62 + + Financial performance and sustainability The original model is one in which a sponsoring agency lends 'seed capital' to a village bank. Village banks ideally consist of between 20 and 50 members. The loan agreement is signed by all members and first loans are for approximately US$50. They are payed back on a weekly basis and the member is also expected to save approximately 20 per cent of the loan during each loan cycle. Loan amounts for clients increase after each one is repaid. Through this process, the village bank is expected to build up its internal capital, pay back the seed capital to the organisation, including interest, and reach internal sustainability within three years. Experience has been varied but there have been few cases where individual members have been able to 'graduate' to become clients of the formal financial system; nor are there many examples of the village bank itself being able to graduate away from the support of the sponsoring agency to reliance on formal banks alone for loan capital. One of the problems encountered is that members all tend to participate in similar productive activities and hence the demand for loans peaks at a particular time. The need for an external source of capital is therefore crucial and without this the scheme is likely to revert to a rotating savings and credit association. While financial sustainability has been an objective it has not been vigorously pursued. Interest rates have not always been set to cover costs and the detailed accounts which might enable this to happen have not been kept. The experience suggests there is need for a certain degree of scale and dispersion of loans and savings for financial intermediation to function effectively, and this is unlikely to be found within one village. The theory and the practice have therefore diverged quite significantly, and adjustments and adaptations have been made in implementing the system. While the methodology has demonstrated an ability to reach poor people, and especially women, on whom the programmes have often focused, the vision of financial sustainability is yet to +become reality. (Source: Holt, 1994.) + +4.3.3 Sustainability through extending coverage +One of the issues raised by this example is the need to operate on a scale larger than village level, since the demand for loans may be simultaneous among a group of people with similar livelihood strategies. Extension of coverage could include wider geographical regions and diverse social groups, which could spread the demand for loans more evenly throughout the year. Ladywood Credit Union is an example of a scheme where better-off + +63 + + Microfinance and Poverty Reduction members, through taking and repaying loans, support the sustainability of the scheme. The same is true of Casa Campesina Cayambe, where the taking and repaying of loans by relatively wealthier members has enabled the scheme to survive. The difference between LCU and CCC is that the former has made loans only for consumption. Providing bigger loans for productive investment to the relatively wealthier can increase inequality, further skew power relations, and increase relative poverty. Moreover, research for the CCC case-study showed that wealthy households were often the worst repayers. The example of Garu Rural Bank (see 2.8.3) also demonstrates how offering services to local salaried workers such as teachers and civil servants provides the bank with a secure source of income. It is interesting to consider the sustainability of the informal financial systems described in Chapter 2. Mechanisms such as ROSCAs are financially sustainable since their managerial inputs are voluntary. However, in the course of making procedures more formal, additional costs may arise, such as a salary for a paid manager. Informal schemes also differ in the ways they make use of existing informal structures which may in some cases involve voluntary inputs. A scheme for financial service provision that works with pre-existing ROSCAs may find its costs much lower than one which sets out to establish new groups. Whether or not financial sustainability is an achievable objective is still the cause of much debate and enquiry, as these experiences illustrate. However, one of the emerging points of consensus is that, even in cases where the scheme is not able to operate in a way that will make it financially sustainable, any subsidy provided by an NGO should be to the operational costs of the scheme rather than in the form of low interest-rates and lax repayment policies. Providing public or donor money to maintain the institution can be viewed as building financial infrastructure. There are some dangers even with this approach, in that access to donor money can lead to a lack of financial discipline on the part of the institution, which may undermine the objective of building up such institutions to survive in the longer term. 4.3.4 Measuring financial sustainability While the debates described in the previous section continue, NGOs are increasingly being challenged by donors to examine the financial sustainability of their programmes. Exercises of this type can be important in stimulating critical thinking about a programme's direction. Calculating sustainability can be a complex matter but here we will consider two relatively simple measures that can be used to assess where a programme stands financially: the sustainability index and the break-even interest rate. + +64 + + Financial performance and sustainability Sustainability index A straightforward way to look at the financial sustainability of the savings and credit operation is to look at its income compared to its costs (Havers, 1996). +Sustainability Index (SI) = Percentage of total costs covered by income _ total income earned from credit programme duringthe period total credit programme costs during period xlOO + +The income received includes interest and fees on loans. Programme costs include all staff, office, and other costs necessary to run the programme. It is suggested that even costs which are not directly incurred should be included for the purposes of this calculation. For example, if office space is free because of a special arrangement, a figure for notional rent should be included, so that the programme can be evaluated as if it had to cover all its costs out of income. However, in schemes where inputs are voluntary and likely to continue into the future, there is a case to be made for not including these costs in the calculation of financial sustainability. In Chapter 6 we discuss the example of the Ladywood Credit Union in the UK in which volunteers provide much of the labour. This is a characteristic of the project and it would therefore be inappropriate to suggest that the project was not financially sustainable as a credit union because of this free labour. It must be stressed that the loan fund and savings deposits are not part of this calculation. However, if the loan fund has been received from donors as a grant, the calculation should include an imputed cost for this (i.e. the interest that it would be necessary to pay if the funds were to be raised from another source). The interest rate charged by banks in the formal sector is often used to calculate this cost. The purpose of including such a cost is to make clear the dependence of the scheme on donors or other sources of subsidised capital. Attempting such a calculation demonstrates the benefits of keeping savings and credit scheme accounts separate from those of other activities. In cases where staff are shared between programme activities it is necessary to make an estimate of staff time and resources spent on the savings and credit component. Overleaf is an example of the calculation for one of the casestudy schemes, URAC in Mexico. + +65 + + Microfinance and Poverty Reduction The calculation is presented for URAC on the basis of 1995 figures. It is an illustration only and is not intended actually to portray the sustainability of URAC. +Costs 75% of salary costs of 4 development workers' Operational costs2 Computers — estimated depreciation Main office utilities Main office maintenance Vehicle — petrol Vehicle — maintenance Vehicle — depreciation Interest paid on savings Total costs N$ 248,850 96,060 6,500 1,756 4,000 18,000 14,000 15,400 163,996 568,562 + +Income +Interest received on loans and bank interest on deposits Total income 268,395 268,395 + +Calculation of SI: Income Costs x 100-47% + +Notes: +1 These figures are based on estimates of the proportion of vehicle use and development workers' time devoted to the savings and credit part of URAC's work. It is estimated that the development workers spend 75 per cent of their time on the savings and credit programme and the remainder on their other activities. 2 Operational costs include: clerical salaries, stationery and other consumables, bank commission, free gifts, transport to committee meetings (for cashiers) and the costs of the mobile office. + +66 + + Financial performance and sustainability In the case of URAC it has not been necessary to estimate a cost for the loan fund because it is generated from savings and hence is being paid for by paying interest on savings. This calculation of the sustainability index demonstrates that URAC is covering 47 per cent of the costs incurred in running the scheme out of income generated through its own operations. This means that in order to continue its operations if donor funds were withdrawn it would have to either double its income or halve its costs or both. The strategies for raising income would include raising the interest rate on loans and charging fees for certain services or transactions. The major element of cost is clearly salaries of the development workers and currently these staff are essential to the integrity of the programme. The break-even interest rate An alternative approach to looking at financial sustainability is to calculate the interest rate that the scheme would have to charge its borrowers if it had no source of income other than interest income and fees. This is referred to as the break-even interest rate. If the rate turns out to be extremely high compared to the formal sector and local informal rates, it is likely that the demand for the scheme's loans would collapse and it would have to adjust its operations to survive. Below is an example of the calculation for URAC. Total costs incurred in 1995 were N$568,562. The loan volume in 1995 was N$749,000. For the purposes of this calculation we will assume that this figure represents an average volume of loans outstanding at any point during the year. The interest paid by URAC on savings is included in the costs (see previous calculation). On the basis of these figures, URAC would have to charge an interest rate of 76 per cent on the N$749,000 of loans it has outstanding in order to bring in income of N$568,562; 76 per cent is therefore the breakeven interest rate. This compares with the current interest rate charged of 30 per cent. In the economic situation in Mexico in 1995 formal bank interest rates ranged from 50 to 70 per cent. The break-even rate for URAC would appear to compare quite well with such rates. However, those rates in the commercial sector caused massive rates of default on the part of middle-class households; and whether URAC's clients could cope with such levels is open to question. However, separating the costs of fieldworkers and management time between savings and credit activities and other programmes as in this calculation does not necessarily mean that the organisational form which this implies would be viable. Since at present programme activities are integrated + +67 + + Microfinance and Poverty Reduction and costs shared, the removal of funded components might mean that the way in which groups and service delivery are organised would not be sustainable. + +4.4 Managerial and organisational sustainability +Even if it was clear that the organisation was able to cover its operating costs, this would be only one factor in moving a savings and credit scheme towards an independent future. The structure and management of the organisation are equally important considerations. NGOs do not necessarily possess the most appropriate skills for managing financial services. As well as carrying out regular and efficient financial monitoring, the management of the scheme must demonstrate integrity and accountability in dealing with other people's money. (It is only necessary to consider what type of organisation you, the reader, would trust with your own money to understand some of the qualities needed.) 4.4.1 The role of staff in microfinance interventions One of the critical issues is staffing. Not only is it important that staff feel motivated to undertake the intensive supervision that most financial services programmes entail, but the honesty and integrity of the institution and its staff in dealing with the funds must be apparent. Without this, the credibility of the organisation in the eyes of its users will soon suffer and demand for services will decline. Jain (1996) describes how, in the case of Grameen, group meetings promote the transparency and accountability of staff as well as members. Members can see that funds are not being mishandled and claims from individuals to their entitlements under the scheme are not being denied. Experience in Casa Campesina Cayambe revealed that when procedures for loan application only required the approval of the Credit Delegate, a very small number of cases occurred in which he would require 'fees' for nonexistent administration or a percentage of the loan. As a result the policy was changed to involve three members of the community in supporting loan applications. The transparency which village meetings can promote benefits the users by helping to control the behaviour of scheme staff or volunteers. It is also necessary to prevent staff colluding with scheme users to abuse the scheme. In the case of Ladywood Credit Union, interlocking committees made up of staff and members check on each other. One of the most important debates in this context is how to structure staff remuneration and incentives. Some schemes offer incentives for loan + +68 + + Financial performance and sustainability collection related to the performance of the groups with which a staff member works. There is a danger that quantitative performance targets of this kind may lead to a neglect of institution-building among members (Montgomery, 1995), which is fundamental to sustainability. In the case of URAC, group cashiers at first worked on an entirely voluntary basis. They were offered an incentive in the form of a points system related to the supply of basic goods, which was another element of the programme. This has resulted in co-operation among them to improve the quality of the recordkeeping on behalf of the group. As such it is an example of an incentive that has been structured in a way which improves the capacity of the cashiers and hence the institution-building objectives of the project as a whole, as well as contributing to the efficient running of the scheme. For NGO workers who interact daily with users, often on a wide range of issues, becoming debt-collectors on behalf of a savings and credit scheme can put them in a difficult position, and it is this tension that has so often in the past led to a 'soft' approach by NGOs interested in poverty alleviation. Staff may find themselves in an ambiguous relationship with users which impairs performance. 4.4.2 Organisational sustainability and change Effective management also requires continuous adaptation and change on the part of those in control. Circumstances are continually changing: macroeconomic conditions, legal requirements, the needs of users, and the availability of other financial services in the area. All of these changes mean that the scheme must continually adapt its operations as new information comes to light and experience is built up. Flexibility is essential. (See Chapter 5 for a discussion of adaptability as an indicator of impact.) In Chapter 2 we argued that financial services are not something which should be here today and gone tomorrow. If providing them is to make a significant contribution to the alleviation of poverty, a long-term approach is needed. The organisational framework which will enable this future sustainability must be considered. Throughout this book we have discussed a range of different organisational forms: ROSCAs, village banks, credit unions (SANASA and Ladywood), schemes run and managed by NGOs itself (AATG, URAC, SUNGI and CCC), and organisations which have the status of banks (BRI and Grameen Bank). These projects offer a rich and diverse range of experience from which to draw in considering what forms of organisation might be most appropriate and enduring. The most obvious organisational form for sustained financial service provision is a bank, and we have given two examples of organisations that + +69 + + Microfinance and Poverty Reduction started out as banks: BRI (a state-owned bank) on a very large scale in Indonesia and Gam Rural Bank on a much smaller scale in Northern Ghana. Two organisations, BancoSol in Bolivia and Grameen in Bangladesh, started out as NGOs and have been able to convert themselves into banks, which might suggest that this is a course of action many more schemes should follow. However, the feasibility of this approach for other organisations in other circumstances is in question. Grameen had to gain unique governmental dispensation to convert itself into a bank, whereas BRAC has so far been unsuccessful in obtaining a similar concession. Apart from legal difficulties of this type, some commentators do not agree that such a process should be an objective of NGOs, believing 'that the competitive advantage of NGOs is in their capacity to reach the poorest and engage in activities which help people change, but which cannot necessarily be financially supported by the recipient of the assistance' (Dichter, 1996). Dichter concluded that NGOs should concentrate on what they do best rather than trying to become banks. Such debates are unlikely to be easily resolved. Meanwhile, NGOs with microfinance interventions are considering how they might establish organisations that are able to survive. Legal status is clearly one of the main concerns, and we have argued above the need for government regulation of organisations taking deposits (see Chapter 3). The major legally-recognised alternative to banks is the credit union. Credit unions, in being owned by their members and savings-based, present two characteristics for survival that the above discussions have shown to be particularly important, and which NGOs may feel to be strongly convergent with their own values. However, there is still much to be learned in this area, and many countries have no legislation or regulations to deal with credit unions. An alternative strategy for NGOs is to persuade national banks and private financial institutions to extend their services to poor people. Groups with whom the NGO has developed a relationship can then be encouraged to transfer their custom to a sympathetic bank, so removing the need for the NGO to provide long-term support. Another role for NGOs is to engage with governments in discussing how the financial needs of the poor can best be addressed. Organisations such as Women's World Banking, for example, have worked to raise the issue with governments and policy makers (WWB,1994). + +70 + + Financial performance and sustainability 4.5 Summary and conclusions This chapter has emphasised the critical importance of continuous monitoring of financial performance. Financial sustainability should be explored, using some relatively simple calculations which, even if not entirely accurate, can give an impetus to debate about the future of the programme. However, financial sustainability should not be seen solely within the context of this narrow financial calculation, in which, for example, voluntary inputs such as labour are costed. Some organisations are fully capable of sustaining the flow of such voluntary inputs, which can be integral to the achievement of their objectives. Even within the context of debates about financial self- sustainability there are questions about whether it is achievable, especially where there is low population density, or where physical constraints, such as poor infrastructure and communication, and social constraints, such as illiteracy and female seclusion, increase the costs of delivering services. These factors reduce the likelihood of being able to recover costs through charging appropriate interest rates. Financial sustainability is only one component of ensuring that schemes are able to provide services in the long term; aspects of management and organisational structure are equally critical. The organisational form may be the most significant design element in relation to long-term sustainability. Some NGOs have turned themselves into banks, but this is not likely to be an option for most NGOs. Pressures for financial self-sustainability are likely to produce dilemmas for the organisation. An institution which increases loan size may lose its focus on poor people; the strategy of deliberately including better-off people in order to subsidise lending to the very poor requires a clear organisational vision if it is to succeed. • The monitoring and management of financial information is a specialist area and should be recognised as such by building the necessary skills among NGO staff or using outside specialists. • Considerations of sustainability in both organisational and financial terms need to be made from the outset; but even when a project is already underway prospects for financial and organisational sustainability should be addressed. • In order to develop a sustainable organisation within the national regulatory framework it may be necessary to undertake advocacy work to change existing government policies. • The progress of the institution towards financial and organisational sustainability is not the sole indicator of achievement. For organisations with an agenda for poverty reduction, assessing the impact of the services on users is crucial. This is the subject of the next chapter. + +71 + + 5 +Assessing impact +5.1 Introduction +As we have seen in the last two chapters, microfinance technology can take many forms, and interventions with microfinance components have been designed in varied ways. This chapter is concerned with understanding how the consequences of microfinance interventions can be measured and attributed. If financial service provision has had poverty reduction as a goal, it is particularly important to know whether, by how much, and for whom poverty has reduced (or increased) and the extent to which these changes have occurred as a result of the intervention. The chapter begins by discussing conventional approaches to measuring impact and explores some of their methodological and practical problems. NGOs have made substantial progress in promoting alternative methods of collecting information. The third section draws on this new body of work in examining ways of overcoming some of the problems associated with conventional impact assessment. A crucial source of information is users' own accounts of the usefulness and relevance of the services in supporting their livelihoods. In the fourth section, it is suggested that rather than addressing impact as a question to be answered only once, usually after an intervention has been made, the relevance and usefulness of services should be continually assessed. Through this learning process, the organisation can adapt its services to better meet the needs of users. + +5-2 The difficulties of assessing impact +Development project managers and their funders have long engaged in linear thinking about the consequences of their actions. Inputs, in terms of people, resources and activities, lead to outputs which themselves have outcomes. These outcomes have an impact on people, often a targeted group. In order to + +72 + + Assessing impact + +demonstrate to themselves, their donors, and supporters that their work is proceeding as planned, organisations endeavour to assess the impact of their activities. It is particularly important for organisations like Oxfam and ACTIONAID to understand the impact of their work. They each rely on support from large numbers of voluntary donors, who give money on the basis that it will be used to further the organisation's mission. Oxfam's Mission Statement refers to 'working with poor people....in their struggle against hunger, disease, exploitation and poverty'. Such a commitment to poor people implies that Oxfam should also be accountable to them for its actions. Indeed, for NGOs in general, it has been argued that impact assessment is important in enabling them to remain true to their mission; and that poor quality impact assessment is likely to leave them more vulnerable to co-option by others (Edwards and Hulme, 1995). Yet poor people 'are not static "targets" waiting to be "impacted" upon by credit programs' (Abdullah, Rutherford and Hossain, 1995). People's actions, ducking and weaving through staictural constraints and opportunities, have their own consequences. These actions, whether freely chosen or not, can combine with the processes and outcomes of planned intervention to enhance or diminish well-being. Interventions, generally less nimble, continue, and outcomes and impact over time are very difficult to predict. How, then, should NGOs measure the impact of their work? In Chapter 1 we outlined three ways of defining poverty: lack of income, vulnerability to income fluctuations, and powerlessness. Interventions could attempt to reduce poverty by raising incomes (income promotion); increasing income and livelihood security (protection); or empowering people who lack control and choice in their lives. Impact assessment of NGO-funded financial services has usually focused on the first of these: income promotion. Emphasis has been placed on measuring changes in income levels following credit programmes, especially those where loans have been directed to specific uses. This approach raises a number of methodological problems especially where the impact of directed credit is being assessed: • respondents may give false information if loans have been used for a purpose other than the stipulated one; • establishing a causal relationship to the actual loan in question involves knowledge of all the beneficiary's sources and uses of funds; • it is difficult to establish what would have happened if the loan had not been made (Mansell-Carstens, 1995). + +73 + + Microfinance and Poverty Reduction 5.2.1 Establishing loan use The first of these dilemmas has at its heart the 'fungibility' of cash, that is, the potential for funds to be used for purposes other than those stated. Microfinance interveners may or may not insist that loans be used in certain ways. If they do impose conditions for loan use, they may find themselves wasting resources trying to discover if these have been fulfilled. As ACTIONAID Vietnam (AAV) lament in the proposal for an impact evaluation methodology for their Son La Programme, 'in practice it is very difficult to determine the use to which fungible loans are put. It would be interesting to know whether the microfinance activities have enabled households to improve food security or to invest in a profitable activity, but AAV does not consider that a loan use survey is likely to generate conclusive information on this' (1996). For these reasons, the village-level research for the case study of SUNGI in Pakistan (see Chapter 6), focused much more on asking respondents to compare streams of income with the size of repayment instalments than on attempting to determine whether loan use was as stated on the application form. However, similar problems arise when poverty is defined in broader terms, and when credit is not directed to specific uses. Investigators carrying out . one-off impact assessments rarely have the time to talk to people for long enough to find out the complexity of their livelihood strategies and the details of how they manage their finances. (This was also true of the assessments attempted for this book which could not by their very nature involve longterm engagement.) In addition, respondents themselves have little incentive to discuss their personal finances openly. People may disguise the real purpose to which loans were put for fear of offending project staff; or because they believe that action may be taken against them; or because they calculate a possible advantage in doing so; or simply because to do so can be quite amusing in the course of a boring interview. 5.2.2 Measuring change: controls and baselines A related and more general difficulty is that of establishing from respondent recall the changes that have occurred over time as the result of an intervention. One of the major problems here is the relationship of both researcher and respondent to the microfinance institution itself. Both have interests in the outcome of the impact assessment. For example, a respondent might want a further loan and think that a positive story about the way a previous loan had improved her or his life might help to get that loan. Similarly, an investigator hoping for re-employment might not wish to offend the agency hiring her. It is very difficult to establish what would have happened in the absence of a loan. For quantitative analysis a control is + +74 + + Assessing impact + +required: a sample of people, similar in every other way, who have not received a loan, compared with a sample who have. As well as being costly and time-consuming, to establish a perfect control is virtually impossible (Copestake, 1996b). An alternative to using a control group is to use a baseline against which to assess change. Unfortunately, good baseline data rarely exist. Experience with quantitative baseline surveys of household income and assets has shown that it is costly and difficult to collect adequate data. Such surveys often raise as many questions as they answer, and staff who originally collected the data may no longer be available to explain the intricacies of the data when it comes to using them to answer questions about impact. Moreover, if project objectives have changed in the course of time, the original baseline data will give an inappropriate or irrelevant picture of the pre-project situation; for this reason, some information can only be collected at the end of a project (Newens and Roche, 1996). Capturing the unintended impacts of interventions is also problematic. We have argued in Chapter 2 for the importance of looking at an intervention in the context of other locally available services. If 'enabling' aspects of these existing services have actually been undermined by an intervention, then this information also needs to be part of the assessment of impact. A further unplanned impact may occur if the provision of credit to one group allows them to invest in a particular market opportunity, with the result that established producers or traders are displaced. The concepts of 'controls' and 'baselines' also raise moral questions for interveners. What do people gain from spending time monitoring or being monitored for the impact on them of notbeing beneficiaries of a project? One possible solution to this problem is to include new users as the 'control' group, and to use recall to make comparisons with how things were before the intervention. + +5-2.3 Proving causality +A final and major obstacle is the difficulty in being able to attribute any change that is found to the intervention. Other events and changes occur while the intervention is taking place, and this may make it virtually impossible to separate out the impact of a savings and credit programme. Further, even if apparently successful in terms of raising incomes, reducing vulnerability or challenging unequal power relations, an intervention may make very little difference to people's overall well-being. The positive changes may be dwarfed or negated by other factors in the local context or by macroeconomic or political changes, and therefore be marginal. This points to the + +75 + + Microfinance and Poverty Reduction need to frame objectives of what can be achieved by providing financial services, in more modest terms. + +5.3 Innovations in impact assessment +The response of many microfinance specialists to the methodological and practical difficulties of impact assessment has been to argue that it should not be attempted at all. Rather, the financial health of the microfinance institution should be taken as a proxy indicator of positive change. They argue that the very popularity of the services among poor people is enough to demonstrate that they find the services of benefit. It has been suggested, therefore, that impact studies should be replaced by indicators of scale and institutional sustainability (Rhyne, 1994). If the institution is increasing the outreach of its services to a growing number of people, and indicators of financial sustainability are improving, the impact of the institution is viewed as positive. However, while the fact that increasing numbers of people are using the services is in itself a positive indication, it does not tell enough of the story. Aside from the fact that increasing scale brings its own problems, and can even undermine the sustainability of the institution itself, as discussed earlier in this book, it is necessary to investigate further to find out who is using the services. Users should be differentiated by wealth, gender, and location; and information should be gathered on how various groups are using the services to support their livelihood activities. Understanding how people use the services in practice makes it possible to analyse what makes them relevant and usefuho poor people. Answers to the question of whether relatively better-off or poorer people are using the services can be found by undertaking wealth-ranking exercises with members and non-members (Pretty etal, 1996). Discussions with them in 'focus groups' can reveal their views on why others do not join the scheme or why they may have dropped out. Following up users who may have dropped out or become inactive is particularly helpful in understanding why the scheme may not be able to meet these users' needs, as are interviews with non-members. It may be that a member has dropped out because her income-earning husband has died, or her son has stopped sending back remittances from outside the area. This would raise the question of how financial services can support her in dealing with this situation. Or perhaps discussions with non-users might uncover difficulties for in-migrants to an area in being accepted in groups which rely on social collateral. We have earlier emphasised the distinction between access to and use of scheme services. When considering who is using services, it again becomes important to understand women's roles, particularly in relation to loans. + +76 + + Assessing impact + +Female members may be able to describe the process of decision making before and after taking the loan, their role in it, and how they felt about it. How repayments are made, and how women who may not have direct access to income develop strategies for ensuring repayment, are essential aspects of appreciating the relevance of the services to them. For example, women in Bangladesh often find the money to make weekly compulsory savings deposits required for group membership by taking a handful of rice from the daily household allocation and saving this up to sell (White, 1991). To assess how services are relevant and useful to users and to what extent requires answers to a range of questions: how users see them in the context of other locally available services; how the amounts and timing of loans and ease of withdrawals from savings accounts relate to their priorities in meeting consumption needs and production opportunities (across seasons); how repayment schedules and any compulsory savings deposits relate to flows of income available to individuals and the household as a whole. The views of a range of users can be elicited via semi-structured interviews (Pretty etal, 1995). However, questions need to be carefully framed, so that respondents are encouraged to share their experience of using the services, and how the services relate to their circumstances. For example, asking 'Why did you withdraw savings at this time?' or 'Why did you take a loan at this time?' might result in more useful responses than questions such as 'What did you use your savings for?' or 'How did you use this loan?' (ACTIONAID Vietnam, 1996). + +5.3.1 Researching usefulness: a case study +The following account of research into the usefulness of locally available financial services in The Gambia can illustrate many of the points raised: During case study field work in The Gambia, preference ranking was used to understand better how AATG's credit programme related to other sources of credit available to the villagers. AsAATG knew little about how villagers saved, a discussion of the advantages and disadvantages of various types of savings proved illuminating. Research was carried out sometimes with women only, but usually with both women and men. As the researchers movedfrom village to village, they became more adept at ensuring the women's participation in a mixed group discussion. The discussions took about two hours and were facilitated by two field workers, who began by asking about the different sources of credit available to people. Since villagers often emphasisedformal sources and failed to mention their own group systems it was usually necessary to ask probing + +77 + + Microfinance and Poverty Reduction questions to find out about the latter. Then advantages and disadvantages of these sources were discussed. For example, in the village ofjiffarong, sources of credit included The Gambia Co-operative Union Ltd, Village Savings and Credit Association (VJSACA), Freedom From Hunger Campaign (FFHC), Co-operative consumer shop, and the Department of Community Development (DCD), as well as the AATG Group Revolving Fund. The Co-operative had provided three carts to its members to carry farm produce, people, and goods to and from the village. The Cooperative Society used to provide cash credit for subsistence purposes but no longer did so. Only registered members who sell their produce (usually groundnuts) to the Society could obtain credit and the majority of members are men. The Co-op applied strict measures in their credit-recovery programmes, and this discouraged farmers from applying for credit. Some time ago FFHC also supplied three carts on credit to some community members and provided some production inputs on a small scale. The VISACA has been newly introduced and provides cash credit, but also with stringent loan-recovery measures. A village bank has been built through VISACA where registered members and the VDG are able to deposit savings and gain interest. The DCD also provided one cart to the village some years ago but no longer provides credit in kind. Funds from the Group Revolving Fund had been used for the purchase of basic commodities such as rice, sugar, and oil which were supplied to members during the time of food shortage. The group members also borrowed cash from the GRF to buy seeds for planting, to be repaid during the course of the trading season. Part of the GRF was also used to set up a village bakery to generate income. The consumer shop set up by the group also provides some savings and credit facilities to its members. The group has saved the sum ofD2300 ($230)which yielded an interest ofD232 ($23) over a one-year period. + +5.3.2 Assessing impact on social relationships +There are other questions which might be asked about the dynamics that the intervention itself can catalyse: • Is social differentiation (inequality) and thus relative poverty increasing as a direct or indirect result of the intervention? + +78 + + Assessing impact • Do gains in financial security and material well-being by relatively betteroff people among the poor increase practices of exploitation and exclusion of even poorer people? • Can the impact of an intervention inside poor households be identified? • If services are not used by the poorest people are there other resources and services which should be made available for them? Who is using the service and what happens as a result is a function of social relations which can themselves change as a result of financial services interventions. Yaqub (1995) has shown convincingly how attempting to use peergroup pressure to screen borrowers and enforce repayment can have unintended consequences if the lending organisation is unaware of changes within social institutions. Referring to the experience of BRAC in Bangladesh, Yaqub argues that the very empowerment which repeated borrowing can bring to an individual may turn a good repayer into a defaulter. Over time, wealth differences emerge within the group and the social sanctions imposed on a defaulting group member may become less threatening: the member has less to lose by letting down the group if she has built up her own resource base. Yaqub uses this to support the case for a permanent subsidy for institutionbuilding at the group level. If the intervention is enabling empowerment of its members, it will become more difficult for the groups on which its success is based to function, and work will be needed to maintain group solidarity. 5.3.3 Impact assessment as a dynamic process It is clear that the usefulness of financial services varies over time, as well as between different groups of people, as can be seen in the varying use made of those services. The example given in Chapter 2 of a study of low-income people from diverse ethnic backgrounds in the UK illustrates this point. Each group mixed formal and informal financial services in different ways. The financial institutions to which people already had access seemed to affect the demand for new financial services. The implications of this are that it is necessary to engage in continuing dialogue with a representative cross-section of scheme members, who are likely to have different needs and uses for the services (women and men, landed and landless, different ethnic groups, and so on). Such a process should be designed to ensure that all relevant views are gathered. It should allow the 'facts' to be cross-checked and thus overcome the problem of respondents giving false information. Also, by collecting multiple views of performance the chances of establishing causality are increased. The way in + +79 + + Microfinance and Poverty Reduction which this monitoring process is designed should enable conflicts of interest between different users to emerge and less powerful as well as more powerful people to speak freely. Then rather than looking in a linear way at intentions versus outcomes, performance standards can be set according to 'the criteria or factors which relevant people are likely to use when making a judgement' (Fowler, 1995). 5.3.4 Validating qualitative data A process approach such as this, which relies heavily on qualitative information collected through methods such as semi-structured interviews and focus group discussions with users, can appear arbitrary and is often criticised for this reason. However, it can be made more rigorous by paying attention to the process involved and being able to evaluate the validity of the information. Pretty (1994) has suggested criteria and characteristics for judging the trustworthiness of data generated through qualitative enquiry, which include: • prolonged engagement: with users so that trust can build up over time; • observation: both of users' behaviour in relation to the services and of the context in which this happens; • cross-checking: (triangulation) of information by using multiple sources of information, multiple ways of finding out that information, and a number of investigators; • analysis of difference: allowing a wide range of perspectives to be brought into the analysis and not necessarily seeking consensus; • making use of negative findings: allowing findings which do not meet with expectations to revise the results and reformulate the expectations, rather than dismissing such findings as exceptions; • peer checking: exposing analysis to colleagues not involved in the enquiry at an early stage and continuing to do so in order to expose biases or assumptions which might remain implicit; • checking the data with users: after collecting information using participatory approaches, checking the interpretation with those from whom the information was collected and so establishing its credibility as representing users' actual views; • giving reports: explaining hypotheses about impact and the context in which they have been developed, and using direct quotations of people's personal experiences and detailed descriptions of context to substantiate these reports; 80 + + Assessing impact • keeping reflexive journals: recognising the central role played by investigators themselves, they use these journals to record information about themselves, their feelings, and decisions; journals need not be shared with others but can be used at a later stage to remember the immediate reasons for methodological decisions and interpretation of data; • conducting an inquiry audit: this should be carried out by someone unconnected to the inquiry who looks at the process followed and the results to confirm that the findings are supported by the data and are internally coherent. Our suggested approach to impact assessment focuses on understanding who uses the services on offer, and in what ways those services are relevant and useful to poor people in supporting their livelihoods. 'Relevance' and 'usefulness' are highly subjective, so criteria such as those proposed by Pretty can be important in adding credibility and legitimacy to findings. Nevertheless, as White has argued 'sharing through participation does not necessarily mean sharing in power' (1996, p6). The relationship between the interests of the donor agency or implementing organisation in establishing whether it is reaching its overall goals, and the interests of its users in addressing the same question, is an unequal one. Information from impact assessment exercises can be ignored if inconvenient, or can be used for political purposes inside an organisation. On the other hand, for an organisation which is based on attracting savings, users have ownership rights in a very real sense, and the organisation should pay great attention to users' assessments. + +5.3.5 Using quantitative data in impact assessment +The ways in which members use services can be explored and cross-checked using quantitative as well as qualitative data. Computerised managementinformation systems are important for the efficient and timely generation of quantitative data. It should be possible to analyse the following information: • savings behaviour: size, frequency and timing of deposits and withdrawals; • savings balances: size of balance held by different categories of people: women, men, better-off, poorer, etc; • loan sizes and types taken, when and by whom; • repayment performance of different categories of people. + +81 + + Microfinance and Poverty Reduction This information can be analysed in relation to aspects of the local economy and livelihood systems to further establish how useful and relevant the services are to particular groups of people. For example, the timing of savings and loan activities could be analysed in relation to local events such as agricultural seasonality, festivals, and so on. A good database should enable creative use of the data to be made in answering a range of questions. If records are kept at the level of the individual borrower then it is possible to examine the number of loans that have been taken by each borrower. This allows the extent to which people are making repeated use of the service to be analysed. For example, finding out whether loan sizes are rising or falling with second or third loans can provide insight into borrowers' confidence, or lack of it, in taking larger or smaller loans. Analysing the timing of savings withdrawals in relation to loan disbursement may indicate whether savings are only being made in order to obtain loans. + +5.4 Learning and adaptability +To develop a package of services which responds to a specific context requires a willingness to learn and to change. It requires a good information flow between all those 'stakeholders' involved: users, staff, management, and funders. Assessment must be continuous because people, their circumstances, and their aspirations change. The extent to which an organisation learns from experience and adapts accordingly can itself be used as a measure of success. Indicators could be, for example, how well an organisation listens both to users and funders; how efficiently it learns and adapts as a result; and the degree to which it rewards learning and innovation (Roche, 1995). Changing organisational practice to encourage learning and adaptation has obvious advantages in that it increases the likelihood that mistakes will be admitted and corrective action taken. However, any process approach of this nature can be used to support changes which are more to do with satisfying the interests of particular, already powerful, people — whether management, staff or particular groups of users—than with a focus on successful poverty reduction. Moreover, learning, adaptability, and understanding must take into account the wider environment in which the institution operates and not be confined to the organisation's own services. Microfinance institutions, userowned or otherwise, need good sources of information on the nature of and changes in other financial services institutions locally. As Howes has concluded for membership organisations in general; ... successful outcomes nearly always seem to rest, in the first instance, on a sound understanding of existing institutions. 82 + + Assessing impact A capacity to identify and utilise present sources of social capital1 can often give new initiatives a head start. Conversely, where the institutions which are in place constitute part of the problem to be addressed, a thorough knowledge of how they operate is indispensable as a means of anticipating and managing the conflicts which will inevitably arise (Howes, 1996). Perhaps because of the inherent difficulties of gathering so much information and keeping in touch with changes; ... NGOs should start slowly, pilot-testing new ideas carefully with small groups ofpeople ... Institutional development is a long-term undertaking, and strategy must be harnessed to a process approach to ensure flexibility in the light of evolving external circumstances (Howes, op. cit.). + +1 'Social capital' refers to the networks, relationships and mutual obligations which lie behind collective action and exchange. + +83 + + Microfinance and Poverty Reduction + +5.5 Summary and conclusions +We have discussed the failings of conventional approaches to impact assessment which have taken a linear view of the relationship between an intervention and its consequences. These approaches encounter methodological and practical problems when put into practice. Problems include the difficulties of getting accurate data, and whether the consequences observed can in fact be attributed to the intervention in question. In recent years substantial progress has been made in developing methodologies which involve users more deeply, in order to capture the diversity of experience which exists among them. Such approaches to impact assessment do not necessarily assume that services will have a measurable impact, but instead seek to increase understanding of the ways in which the services are relevant and useful in supporting users' livelihood strategies. Approaches which involve continuing engagement with users in a more dynamic dialogue make it possible to meet their needs more effectively. At the same time, if done well, they have the potential to enhance users' identification with the institution, and are therefore in the interests of that institution and its funders. Impact assessment becomes a process of continuous feedback rather than a one-off exercise. • NGOs interested in poverty reduction should be concerned with the impact of financial services, and especially loans, on poor people's livelihoods. • In addressing the question of impact, NGOs need to go beyond quantitative information detailing the numbers of users, and volumes and sizes of loans disbursed, to an understanding of how and for whom these services support livelihoods. • In using qualitative methods to understand the usefulness and relevance of services to poor people, NGOs should develop ways of increasing the trustworthiness of data, by involving a wide range of both users and staff in the process. • An NGO which is modest and honest in setting its initial objectives, and which is prepared to admit its mistakes and learn from them, is more likely to provide services which are useful and relevant to a wide range of users and so have a more significant impact in supporting their livelihoods. + +84 + + 6 +Case studies +6.1 Introducing the case studies +The purpose of this chapter is to explore further the concepts and approaches already laid out in earlier chapters through discussion of five case studies of microfinance interventions. Each case study is presented thematically in terms of its background, design, performance and sustainability, and impact assessment to correspond to the four preceding chapters. Tables 6.1 and 6.2 present information in summary form on the background, design and performance of all five microfinance interventions. Each case study is then discussed in detail. Information on impact was gathered using brief one-off studies. While an attempt was made in each case to assess the usefulness and relevance of the financial services, it was not possible to use all the methodologies for impact assessment advocated in Chapter 5. This was because the approach to learning and adaptation set out in that chapter requires long-term processes involving users, staff, and volunteers. The five examples discussed are connected with ACTIONAID and Oxfam (UK and Ireland). The Union Regional de Apoyo Campesino in Mexico has received modest financial support from the Mexico programme of Oxfam (UK and Ireland) for a number of years. SUNGI in Pakistan has worked with Oxfam Pakistan, although not in microfinance activities. The study of Ladywood Credit Union in Birmingham UK has been done jointly for the purposes of this book and as a preliminary study for Oxfam's recently established UK programme. ACTIONAID has been working in The Gambia since 1979, and this provides an example of a long-term project where an international NGO has been directly operational. Casa Campesina Cayambe in Ecuador has been a partner project of ACTIONAID and Ayuda en Accion since 1988. + +85 + + Microfinance and Poverty Reduction +Table 6.1 Summary of Information about Case Study Schemes + +Mexico +Union Regional de Apoyo Campesino(URAC) National GDP per capita (US$1993) Location Definition of intended users/size Scheme membership Savings facilities 3,610 Rural Rural households in 26 communities + +Pakistan +SUNGI Development +(SUNGI) + +430 + +Rural 47 villages + +4591 active members (1995) Voluntary savings: savings balance must be 20% of loan size General purpose 'normal' loan max N$700 (US$ 100) over 7 months; also loans for housing, family purposes and small-scale agricultural production 18 (note 1) 30 (note 1) 20-70 members organised for savings purposes with one cashier; loans signed by 5-10 other members + +1260 saving; 137 borrowing Compulsory: Rs30 per month minimum Max Rs 5000 (US$150) for productive purposes for 6-24 months + +Loan facilities + +Interest rates (%): +Savings: Loans: nominal real nominal real + +profit-loss share 18 (service charge) 8 Village Organisations, men and women separately, size variable. Has credit +management committee + +Way of working (through individuals or groups) + +1 Inflation rates in Mexico have fluctuated significantly in the last two years resulting in both positive and negative rates in real terms, currently rates have become significantly positive again but were not at the time which the study was undertaken + +86 + + Case studies + +UK Ladywood Credit Union (LCU) 18,060 Urban Unemployed / lowincome and other families on innercity housing estates 270 adults 400 junior savers Voluntary: loan size 2 x savings balance Max 2 x savings balance+£300; max loan size £5,000 (US$7,500) over 2 years + +Gambia +ACTIONAID The Gambia(AATG) +350 + +Ecuador +Casa Campesina Cayambe (CCC) 1,200 Rural Small farmers / rural householdsof 2 cantons with a population of 3,150 families + +Rural Small farmers / airal households in 523 villages + +Approx. 11,000 households Individual coverage have received credit figures not available to date None None + +Inputs for agricultural production in kind: range from seed to carts, ploughs etc. Max term 5 years + +'Ordinary' loan max. lm.sucres (US$400) over 15 months. Other types of loan available + +1% dividend in 1995 +-2% 12% + +n/a + +n/a 52 (note 2) approx. 27 Indigenous community committee structures and credit delegate represent communityinterests with CCC. + +9 Credit Union as a whole defined by 'common bond'of residence: financial services provided to individuals + +0 approx-10 Village level groups administer credit; AATG provides training. Group level responsibility for repayment + +2 52% calculated as an annual percentage rate; 43% calculated on the declining balance basis + +87 + + Microfinance and Poverty Reduction +Table 6.2 Performance indicators of all Case Study Schemes in 1995 +(All figures in US$) + +S 2 +0) + +375,741 + +941 bor + +Approx + +ccc Ecuad + +0 + +2 + +350 + +n/a + +n/a + +! + +m +Ml + +CN + +X + +00 + +!5 TheG +AATG + +(4 + +o + +V > + +8 + +x: "5 + +Appro; househ + +60% (1; + +107,10( + +n/a + +n/a + +177(2) + +i + +itol ans +0 + +i + +x: + +»n + +\r\ + +3s + +00 + +ir\ + +i +z'-S +M + +0 + +in + +•8 + +CO + +5; +l-H + +668 + +(N + +•3 + +r-» m + +NO + +O O + +ro + +5Z + +WN - / + +Si + +XI + +i/i V + +> + +evertakien and r pai +C D + +-a + +1 + +10% + +270 + +194 + +I + +g .2 + +0 +0 IA CN" + +0 + +0 in in >n + +not a vail + +0 0 + +iwe + +•a + +« +CTS + + Case studies + +6.2 Union Regional de Apoyo Campesino (URAC), Meaco +6.2.1 Background +The Union Regional de Apoyo Campesino (URAC) is based in Tequisquiapan in the Mexican state of Queretaro. It was started in 1989 by Union de Esfuerzos para el Campo, (UDEC), a four-person NGO which began working around Tequisquiapan in 1984. URAC has a broad vision of building an alternative peasant economy in the region by encouraging the production of goods which campesinos (peasants) consume and the consumption of what the peasant union produces. Much of the work involves training villagebased volunteer workers, and encouraging the organisational capacity of campesinos in the region. It is clear about its identity as a peasant organisation, rather than a savings and credit scheme, although the backbone of the work is currently the provision of financial services. Mexico underwent radical economic reforms following the 1982 debt crisis. Low inflation, high capital in-flows from outside the country, and moderate economic growth masked a growing divide between rich and poor. This divide was expressed through a peasant uprising in the Southern state of Chiapas in January 1994. A series of events, including the assassination of the ruling party's presidential candidate, caused investor confidence to decline. This resulted in a new economic crisis in late 1994 when investors began to withdraw funds from short-term bonds and precipitated a run on the government's reserves of foreign exchange. Since then rescue packages have been organised by the IMF and World Bank to maintain Mexico's debt repayment obligations and secure the banking system. These efforts have not prevented inflation rates in the region of 50 per cent and similarly high interest rates. These in turn have resulted in defaults by middle-class borrowers on mortgages, car loans, and credit cards. The four municipalities around Tequisquiapan in which URAC works have seen significant social and economic change in recent years. Rapid industrialisation in nearby towns had improved employment opportunities in the area although wages were poor, but these industries have suffered in the recent economic crisis. Agricultural employment is still provided on local estates and large farms, while some households have land-use rights under the terms of the land reforms of the 1930s, and others cultivate their own small plots. Male out-migration is high, both on a short-term basis to nearby towns and for longer-term work in the US. Remittances are therefore a major source of income. + +89 + + Microfinance and Poverty Reduction 6.2.2 Design URAC is active in three main areas: financial services, agricultural and livestock production, and a programme to supply basic goods. The programme puts strong emphasis on organisation building and encouraging the involvement of members in monthly meetings at village level. The programme had some 5,000 members in 27 villages in 1995- There has been constant and steady growth, with a 60 per cent increase in membership between 1993 and 1996, reflecting the popularity of the programme in the villages in which it operates. With its philosophy of self-sufficiency, URAC started with a savings-based approach. Members pay a membership fee and can save as much or as little as they wish. Members are organised into groups of between 20 and 70 people, and there may be two or three groups within a village. There is a monthly village meeting to give an update on the position of each group, including overdue loan instalments; information about the basic goods supply; news about URAC and about events in the region; followed by discussion of a broader issue, often a national or international theme, as well as technical discussions about agricultural production. The function of the smaller groups is for saving. There is one cashier per group whose task it is to collect the savings and take them to the URAC office on a weekly basis. The savings facility is subject to a minimum deposit of 1 peso (US$0.15 in March 1996). The cashier decides when during the week she is willing to accept deposits, and the fact that this facility is available within the village makes it very convenient: members have been known to move between groups on the basis of the efficiency of the group's cashier. Withdrawals can be made on demand, but require more effort as they can only be made at the URAC office or mobile unit. However, the facility is wellused, and there is constant activity at the URAC office. Although this is not encouraged by staff, members sometimes ask the cashier to make withdrawals for them. The savings facilities have also been adapted to suit local needs over time. URAC's 'optional' savings accounts are an interesting example of this. Members faced particularly high expenditures around periods of childbirth and school leaving. (It is customary for parties to take place in school and at home to celebrate school leaving. In almost every household there is a celebratory lunch involving the extended family.) The optional savings accounts were designed to meet these needs. Savings are regular but withdrawals can only be made three times a year when school semesters end, or at the time a baby is due. URAC has also established children's savings schemes. Children's groups are subsidiary to the adult ones and use the same cashiers. Loan sizes are linked to savings balances. There is a requirement that 20 per + +90 + + Case studies + +cent of the loan is on deposit, which allows loans of five times the savings balance to be taken, up to a maximum for normal loans of N$700 (US$100; exchange rate N$6.6 = US$1 in March 1996). There is no restriction on what these loans can be used for. Quick-access loans in emergencies are also available under certain circumstances. Additional criteria for loan eligibility are attendance at meetings (a member must have attended the last three monthly meetings) and savings record (members must save at least N$l per week). A range of loan facilities are available, the main one being 'normal' loans described above; these are repayable over seven months. Loans for housing up to N$900 and 'responsible' loans of N$1000 are also available, on condition that members have demonstrated their ability to repay a normal loan and have 25 per cent of the loan amount in their savings account. A 'family' loan of up to N$4,000 for investment in a micro-enterprise requires applications to be made directly to URAC's Board. This loan also requires physical collateral or guarantees for half the value of the loan from other members. A further range of small-scale loans has recently been introduced for homestead production of small livestock and vegetables. These loans are administered through the savings and credit programme, partly because URAC finds them easier to monitor than loans issued through the agricultural production programme. The group-based mechanism operates fairly loosely in terms of peer monitoring. Loan applications have to be endorsed by other members of the group (a group can in practice have up to 70 members) but this endorsement does not require that they take responsibility for repaying the loan in the event of default. However, if a member defaults, the group is denied access to further loans; individual defaulters lose access to their savings, which are used as collateral. Repayments are not made in public at group meetings but are taken by the individual borrower to URAC's office or to the mobile unit. The groups are not the only way in which members participate in the Union. For example, group cashiers are involved in monthly decisionmaking meetings with URAC. They were involved in the recent decisions to tighten up the repayment policy and to allow loan instalments to be made in the villages as well as at head office. Interest rates on savings and loans facilities differ depending on the service. In March 1996 the rate on 'normal' savings was 18 percent per annum and on 'normal' loans was 30 per cent p.a. With inflation at rates of 50 per cent and above in Mexico since the peso crisis at the end of 1994, both savings and loan rates have been negative in real terms (see section 3-7 for an explanation of nominal and real interest rates). However, these interest rates were set by URAC before inflation rose so sharply and were initially highly positive in real + +91 + + Microfinance and Poverty Reduction terms. Now that inflation has again declined, URAC's real saving and borrowing rates are positive once more. The project employs four full-time development workers (promotores) who undertake the main work of mobilisation at community level. They are assisted in this by two technicians — one agronomist and one vet (volunteer). Additionally, the URAC office has two clerical staff dedicated to the savings and credit programme and is open five days a week for members to transact their business. A mobile unit staffed by the development workers is open twice a week in Cadayreta, the part of the region furthest from Tequisquiapan. But the scheme depends heavily on the work of the group cashiers. Their role is to collect weekly savings and take them to the URAC office at least once a week, as well as to represent their groups in URAC meetings. In 1995 an incentive system was introduced to motivate the cashiers. It consisted of a points system for accurate record-keeping, with the points redeemable through the basic goods supply programme or as savings instalments or loan repayments. Performance has improved dramatically. Loan disbursement is carried out from the URAC office and until recently repayments could only be made at the office or mobile unit. Now, the development workers also collect loan instalments at the monthly village meeting, which reduces transport costs for borrowers. Interlinked with the savings and credit scheme is the basic goods supply scheme which members qualify to use if they attend meetings and save regularly. Through a volunteer from the village, orders are placed fortnightly from a printed list of about 300 items and delivered to the village. Payment is made after two weeks at the time of making the next order. If an individual fails to pay on time the whole group is disqualified from using the facility. + +6.2.3 Financial performance and sustainability +URAC collects a wide range of financial information which can be used to calculate either arrears, default rates or both, and reported a healthy repayment rate of 95 per cent in March 1996. Arrears are defined as loans for which full repayment has not been received seven days after the final due date. The number of loans in arrears has fallen consistently over the three years to 1995, as has the total volume outstanding. Arrears in 1995 represented some 14 per cent of the level of 1995 loan disbursement. The relationship between the arrears and defaults is especially interesting. The proportion of loans in arrears which eventually became defaults (defined as loans due for repayment in a particular year which are still not paid) rose from 8 per cent in 1994 to 27 per cent in 1995. This suggests that recent macro-economic contraction beginning in late 1994 has had a knock-on effect on URAC's loan + +92 + + Case studies + +performance by making repayment more difficult for members. Loan numbers declined in 1995, especially loans for housing construction; savings deposits remained steady in nominal terms, but this represented a fall in real terms. From the start, URAC's philosophy has been one of self-sufficiency. This led to initial emphasis on savings mobilisation, and the core loan fund has never been dependent on donor capital, although loans in the separate agricultural production fund (not part of URAC's savings and credit component) have utilised donor money. As the calculations shown in Chapter 4 demonstrated, URAC reported a financial sustainability index of 47 per cent and a break-even interest rate of 76 per cent. This suggests that URAC is half-way towards achieving financial self-sustainability in its microfinance operations. The questions arising for URAC is how it might move towards full financial sustainability, and what the implications of this might be for the form and sustainability of the organisation. As was pointed out in Chapter 4, one of the main elements of URAC's operating costs is the salaries of the four development workers. At present these workers are essential to the integrity of URAC's operations. In organisational terms, the challenge for URAC is therefore to find a strategy which enables costs to be covered without undermining this integrity. + +6.2.4 Impact assessment +To understand the relevance and usefulness of the work of URAC, one of the 27 communities where the Union works was selected. The criteria for its selection included the programme having been in operation for at least three years, its being a village of average size, and one where URAC felt confident about the work it had done there. The focus of the research carried out was the savings programme. The village of La Laja is adjacent to a deer-hunting ground, and includes a large working commercial dairy farm {hacienda). Campesinoscultivate land in privately owned smallholdings and use communal lands for grazing. However, there is extensive migration out of the area to find work. La Laja lies on the main road between Tequisquiapan and Queretaro. According to URAC, the village is not ethnically differentiated. All the inhabitants are mestizo by race and most are Roman Catholics. Most of the residents support the ruling Partido Revolutionario Institutional (PRI). There are four URAC groups in the village, two each for adults and children with each of the two cashiers working for one adult and one children's group. Given the large size of the groups, up to 70 members, it was decided that the study would select a sample of households from just one group. Group + +93 + + Microfinance and Poverty Reduction membership involved more than one member of the same household, with 39 members covering a total of 26 households. A wealth ranking exercise1 offered insights into perceptions of what it meant to be relatively wealthy or relatively poor in La Laja. Respondents placed households into three categories: the wealthiest were referred to as those who 'tienen el modd (translated as 'those who have got it'); the middle group 'losamoladotf (the ground-down) and the poorest group' losfregados" (literally, the buggered). Indicators they used included: • size of house, its condition, kitchen equipment (most importantly whether gas or wood was used for cooking) and bathroom; • regularity of income and whether this is in the form of remittances from the USA; • family size and ratio of workers to dependents. Of the 19 respondents only one was male, a boy of 13; and in this case, most of the answers were provided by his mother. The main sources of income were remittances from male family members temporarily working in the USA; male workers in the construction industry (skilled and unskilled); and agricultural production (male and female), whether as paid workers on the local hacienda or as crop producers in their own right. Women were involved in petty trade, including the buying and selling of snacks and cheap jewellery in the village, small-scale food preparation, and domestic employment. One other woman traded on behalf of a company as an abonero, collecting payment instalments towards purchase of consumer durables selected from a catalogue. The incomes of people in La Laja have been squeezed drastically by reduced opportunities for industrial employment (an estimated drop of 35-40 per cent between 1994 and 1996: Alfonso Castillo, personal communication) and escalating prices, especially for health care and education. In early 1996 the national inflation rate was running at approximately 50 per cent. The URAC services have helped members to survive in times of difficulty and cope with unemployment following the 1994 crisis. Members used URAC to maintain economic security, despite savings deposits losing purchasing power through the operation of a negative real rate of interest. Its savings and loans components offer ways of saving that work out cheaper than alternatives such as abonero and less embarrassing than borrowing from relatives. Most of the households operate more than one savings account. Often l The wealth-ranking and semi-staictured interviewing in La Laja was carried out by Martha Romero. + +94 + + Case studies + +women have accounts for themselves and for each of their children to which they contribute regularly. Most save weekly, although the amount may vary. Savings have been withdrawn for medical expenditure (including urgent treatment), survival in hard times (including sporadic unemployment), utility bills, raw materials for making household adornments, consumer durables (fridge, cupboard), clothes, shoes, school fees, and registration of a truck. Of those currently saving, half have taken loans for purposes such as house building and repair, school fees and uniforms, consumer durables (refrigerators), organisation of festivals (each year two villagers have to take this role), onlending to non-members (including relatives outside the village), truck repairs, and credit instalments. Because the biggest category of loans are those for which no purpose needs to be specified, this data on loan use is likely to be reasonably reliable. The advantages of the URAC services referred to by members included not having to save a fixed amount weekly (unlike ROSCAs); easy access to loans ,with minimal regulations and red tape; easy access to savings (including for urgent requirements); and the fact that individuals can safeguard cash without informing other household members. Members adapt their use of the services to their preferences. Thus some people like to save and withdraw but would never consider borrowing; others take loans because they like the additional incentive to keep up payments. People who are very indebted cannot normally save and are thus unable to join the scheme; heavily indebted people who are already members become inactive. One respondent, a non-member, had previously saved in a co-operative bank (caja). However, faced with a serious illness in the family, she has had to live on withdrawn savings and has been unable to make new deposits. It is important to understand how individuals make use of several financial services simultaneously; in particular how they borrow or withdraw from one source in order to meet commitments to another. One household reported paying school fees under a credit arrangement with monthly instalments. If these instalments are paid late, they increase by 10 per cent. A loan from URAC was used to ensure payments did not fall behind. Credit taken from local shops for groceries (a regular weekly practice for many members) was repaid from URAC savings. Half of the members interviewed had been actively involved in tandas (ROSCAs). In La Laja, one tanda was run by the hacienda owners; workers could opt to have 50 pesos per week deducted from their salary to be put into the group fund. Savings were also used for tanda instalments. In more than one case, members had also used cooperative banks based in Tequisquiapan for savings and loans. But this was common only among those who had relatively large amounts to save. + +95 + + Microfinance and Poverty Reduction Members also used formal bank services on a one-off fee basis to receive remittances transferred from the USA. 6.2.5 Conclusions URAC's savings and credit programme demonstrates the feasibility of operating a savings-based scheme from the outset. This savings base has limited the dependence of the programme on external funds to running costs alone. URAC's flexible savings facilities are clearly appreciated by its members and used by them to support a wide range of livelihood needs, including food purchases, emergency health care, and insurance for periods of unemployment. In this way the services have demonstrated their usefulness and relevance to members and enabled them both to protect and improve their livelihoods. The development of URAC's savings accounts to meet special needs, and those developed for children, demonstrates URAC's practice of continuously learning and adapting. URAC has achieved a high level of internally generated funds. Much of this success has been due to the hard work and commitment of the staff, whose salaries, in effect, have been funded from external sources. + +6.3 SUNGI Development Foundation, Pakistan +6.3.1 Background SUNGI Development Foundation (SUNGI) is an NGO formed in 1989 and operating in Hazara Division of the North-West Frontier Province (NWFP) of Pakistan. The Hazara Community Support Programme (HCSP), which SUNGI runs, grew out of a response to floods which hit the area in 1992. The HCSP began in 1994 and by December 1995 was working in 120 villages spread over four Districts. Apart from the small enterprise development component of the programme it includes work in health and sanitation, small-scale infrastructure, and forest management. Compared to Pakistan as a whole, NWFP has fewer people below the income poverty line. While approximately half of all agricultural households in Pakistan rely on income from wage labour, in NWFP the proportion is less than one-third. Moreover, although agriculture is an important part of the regional economy, there is a relatively high reliance on non-agricultural income (Gazdar etal, 1996, p29). The position of women in the society and economy of NWFP is particularly constrained in relation to enterprise development. Cultural norms limit their mobility outside of the homestead to engage in economic activities such as production and trade. + +96 + + Case studies + +6.3.2 Design +SUNGI works with village organisations (VOs). These are set up for men and women separately. SUNGI will not work in a village unless there is both a men's and a women's organisation. The small enterprise development component is a savings and credit scheme. The VO elects a Credit Management Committee of at least four members. SUNGI works with this group to develop the credit policy of the village organisation, so detailed rules of operation vary from village to village. A membership fee is levied as a contribution to the VO. Of the five case studies, SUNGFs way of working most closely resembles the Grameen model, in which members are organised into 'solidarity groups' of five and offer guarantees in case of non-repayment by group members. However, while this is organisational policy, the operation of this mechanism varies significantly in practice between villages, as will be seen below. Savings are compulsory for all members at 30 Rupees (about 90 US cents) per month. Members' savings are deposited by the village organisation into a bank account, in which they earn a 'profit and loss share'. (Islamic law prohibits interest being charged on loans or paid on deposits.) In theory savings are retrievable from this account, but policies guiding the terms and conditions of access had not been worked out with the VOs by the time of the case-study research. Loans are available to individuals up to a limit of Rs5,000 (about US$150). All loans are subject to an annual service charge of 18 per cent in the context of an annual inflation rate of 10 per cent. The interest rate income is divided as follows: 14 per cent to SUNGFs loan fund, 2 per cent for SUNGI's operational costs, and 2 per cent for the Village Organisation. All loans are intended for productive income-generating purposes and vary in term from six to 24 months. Repayment schedules are designed to reflect the income stream of the investment. Physical collateral is not required, but guarantees must be sought from other members of the five-member groups into which people are organised. The co-guarantors of the loan must keep a minimum of 15 per cent of the loan value in their savings accounts. SUNGI's village-level workers are called Field Coordinators. It is the Coordinator's job to undertake a feasibility study to investigate whether the economic activity proposed is viable. The application for credit is submitted by the Credit Management Committee through the Field Coordinator to the SUNGI monthly management meeting, where a decision is made. In one village, it was found that, due to the dynamic leadership of the village organisation by a local teacher, the operation of the scheme was largely conducted by him on a house-to-house basis, and those taking loans were not necessarily even aware of who the other four members who had signed their loan applications were. 97 + + Microfinance and Poverty Reduction 6.3.3 Financial performance and sustainability SUNGI started disbursing loans in 1995 and to date has not had any problems with repayment. It is difficult to discuss its performance so far given the small number of loans that have been made. In particular it is too early to judge financial sustainability. Organisational sustainability for NGOs working in this area may require a more enabling legal framework, especially with regard to the collection of savings deposits. 6.3.4 Impact assessment It is also too early to attempt detailed investigations of the role loans have played in relation to members' livelihoods. The case study therefore concentrated on understanding the way in which SUNGI's model was working out in practice: the relationship of the scheme to other informal financial services; and the way in which different groups within the community were participating in it. The experiences of women in obtaining and using loans were of particular interest given the system of purdah (female seclusion) predominant in the area. The case study was confined to two villages selected by SUNGI. Livelihood activities in this part of NWFP include manual work (male) on the railways; livestock-rearing and dairying (female and male); and wheat cultivation (male). Casual work for men is available in the enormous Jepsum quarry adjacent to one of the villages. In Barilla, a large village consisting of a number of separate hamlets, with a total population of 10,000, the male VO had existed prior to involvement with SUNGI. It started in 1991 in one hamlet to carry out infrastructural work and repairs, and by 1995 had 119 members across the village as a whole. The driving force behind this organisation is a local teacher. The executive council of 15 members is selected rather than elected, with some based outside the area; two members of the Credit Management Committee were based in Islamabad for most of the week. The Women's Organisation is also led by a local teacher. Its formation is more recent but its success in mobilising savings has already drawn the attention of other (larger) financial services providers. One of these is the First Women's Bank of Pakistan, which has visited Barilla to study SUNGI's methods. In the other village, Karach, the male VO had been formed in 1994 as a result of SUNGI's work and its parallel women's organisation started soon afterwards. A total of 17 semi-structured interviews were carried out, with male and female members, some of whom had already taken loans, and with two nonmembers. A relatively high proportion of those interviewed had access to regular salaries or were relatively well-remunerated from self-employment. + +98 + + Case studies + +Only one household relied on income from agriculture, and the majority had multiple income sources. The researchers were immediately conscious of obvious wealth differences on entering the villages; and the sensitivity about wealth and poverty made a wealth-ranking exercise inappropriate. As a result, respondents could not be selected to represent all social ranks and wealth groups. However, because of the small number of loans, it was possible to meet a large proportion of borrowers. On the savings side all members were making the minimum compulsory contribution of Rs30 per month. However, understanding of the profit share and withdrawal options was confused. The SUNGI system operates savings as a relatively inflexible component. It is one thing to have to save but quite another to have to save a fixed amount and not to have automatic withdrawal rights. The fact that none of the respondents saved more than the required Rs30 per month suggests that for most of them at least the compulsory savings are part of the price they have to pay for their loans. Sources of informal finance in Barilla and Karach included loans from neighbours and ROSCAs known locally as kamitis. Loans from neighbours were considered very pressurising because of the degree of shame involved if the loans were not repaid on time. There was very little evidence of highinterest private informal lending, and only one woman was reported to be an interest-charging money lender in Barilla. (VO leaders attached importance to not charging interest as it was forbidden in Islam.) Kamitis were used in general by better-off respondents and were more common in the wealthiest part of Barilla. The kamitis in Barilla involved groups of between 9 and 25 people and equal monthly instalments ranging from Rs30 to Rs2000 per month and pay-offs of Rs300 to Rs32,000. Some households were involved simultaneously in more than one kamiti. The uses to which kamiti pay-outs were put included house building, deposit into a formal-bank savings account, payment for sons in higher education, and marriage of daughters. None of these purposes would have qualified for a loan under the SUNGI scheme as none of them fell into the five possible categories of productive loan. This indicates that for households involved in kamitis the SUNGI intervention is to an extent complementary. The stated purpose for loans taken by interviewees included livestock rearing and small businesses such as shops, sewing, and rope making. However, without fairly expensive monitoring and follow-up systems on SUNGI's part, which do not currently exist because responsibility is taken by the VO's credit management committee, there can be no assurance that loans are being used for the purposes stated. While it did appear that loans were being used for income augmentation rather than 'protection' alone, it was also clear that those on the lowest incomes tended not to take part. The + +99 + + Microfinance and Poverty Reduction situation of two non-members reinforces this view. They were unable to make the necessary savings to join the scheme, and were dependent on private loans to cover their needs or were paying-off earlier loans. Almost all of those interviewed were paying their instalments on time. This is probably due, in Barilla at least, to the personal involvement of the organisation's office-holders in repayment enforcement. Thus the operation of the model in practice differs significantly between the villages. Within the household, loans are managed in different ways. Intrahousehold loan management and control was discussed with six borrowers — five women and one man. Below, the experiences of three women borrowers are given, to illustrate terms of control of the asset purchased and associated tensions within the households. The first woman, who is 22 years old, and lives in Barilla village with her husband and three small children, described their main sources of cash income as the clerical salary her husband earns (Rs2000per month) and her own occasional embroidery (Rs20-40 per month). Her husband went to market to purchase the two goats she bought with her loan ofRs4500. She carries out most of the tasks associated with the goats' upkeep and her husband provides loan repayment instalments from his salary. Sometimes there are arguments with her husband when she needs cash. The goats themselves do not provide an income stream; in fact, one of them died. However, the remaining one is a source of milk for the children, and she hopes to earn some cash when she sells the animal. Although she very much values the savings component of the women's organisation's work, she has had to oppose her brothers who advised her to deposit money in the bank to gain more interest. Another woman borrower, much better-off and living with her husband and three salaried sons, was the mother of one of the leading members of the Barilla village organisation. Her monthly income is over Rs4000. She received Rs5000for rope-making (for string cots) and travelled to Faisalabad herself to purchase the raw material. The income she makes, which was not revealed, is controlled by her alone. She attends monthly meetings regularly and plans to apply for a loan for a bigger business. A third woman, 35 years old and an office-holder in the Karach women's organisation, took a two-year loan ofRsSOOO to start a shop. She lives with herfive children. Her husband is employed as + +100 + + Case studies a daily labourer in Islamabad. He brings back Rs1300-1500per month and she earns Rs320per month for stitching clothes. Once her brothers-in-law came to know about her loan, they took over the management of the shop, and gave her Rsl50-200per month income (her loan instalments are Rs250per month). She has been subjected to violence by her husband who used to beat her during arguments about money, even before she took out the loan. Recently, although pregnant, she says she was badly beaten as her husband wrongly thought she had received a high per diem for taking part in a SUNGI training exercise. Once this loan is repaid she plans to take another loan for livestock rearing. She is more confident that she will be allowed to manage the work involved herself. + +6.3.5 Conclusions +SUNGI's small enterprise development programme started in 1994. Using a model based on micro-enterprise loans, compulsory savings, and small lending groups, with guarantees on loans provided by other members within the group, SUNGI's approach resembles that of the Grameen Bank. Short visits of a few days to each of two villages revealed differences in the ways VOs disbursed loans and collected savings. Early indications suggested that in those villages repayments were being made on time. In one case actual repayment enforcement was carried out by VO office-holders rather than the members of the small borrowing groups. The few women borrowers interviewed reported diverse experiences. While in one case, the borrower retained control over the whole small enterprise (including purchasing inputs from Faisalabad), in another, the enterprise was taken over by male relatives. + +6.4 Ladywood Credit Union, UK +6.4.1 Background +Ladywood is an inner-city area of Birmingham, UK. The Ladywood Project has set up a range of initiatives, including a drop-in centre for parents and small children, a women's group, a domestic violence forum, and a furniture exchange, where poor families can obtain second-hand donated furniture. The Project operates from a Community and Health Centre. It was workers on the Ladywood Project who began the Ladywood Credit Union (LCU) in 1987 with the support of the Birmingham Credit Union Development Agency. Registered unemployment in the area is 29 per cent for men and 20 per cent for women, compared with 10 and 5 per cent respectively in the UK as a + +101 + + Microfinance and Poverty Reduction whole (1991, Census of Population). The result is a high dependence on state welfare benefits. Earlier experience of the Ladywood Project had revealed the high extent of indebtedness and personal financial difficulties in the area. LCU is not a commercial organisation and its activities are closely defined by the restrictive framework of the 1979 UK Credit Union Act. This requires that members must have a 'common bond' defined by either workplace, location or faith. Workplace or employee credit unions are quite distinct from community credit unions, as members of the former have regular incomes and assets can therefore be built up rapidly. However, the maximum savings that an individual can hold in a credit union is ±5000. Savings are held in the form of shares and the maximum dividend payment allowed on them, by law, is 8 per cent p.a. As part of the Ladywood Project, the role of LCU goes beyond financial service provision, although many members use it solely for that purpose. Activist members, including the former and current development workers, and the staff of the Ladywood Project, see its role as more broadly supportive of members in financial difficulties. The informal and flexible way of working which has been developed at LCU, together with a friendly and open attitude towards new members, makes it more than just a service provider. Also the history of the LCU, which has relied on voluntary labour, sharing office space with the Ladywood Project, and calling on members to share skills which would have been prohibitively expensive on the market (such as book-keeping and accountancy), distinguishes it from commercial providers of financial services. Its core members also explicitly set out to provide (through both voluntary work and financial security) a means of building self-esteem, of being in control of one's own life, of being valued and able to contribute and develop personal skills2. 6.4.2 Design The LCU is staffed by one full-time development worker who has been funded by Birmingham City Council since 1991, and a number of volunteers who are either from the community or are associated with the Ladywood Project in some way. Volunteers are vital to the project and LCU could not survive if it had to pay them salaries. LCU operates through a series of committees which are part of the structure prescribed by law. These committees involve community members as well as staff of the project. Their role is to monitor each other. There is a Board of Directors, a Loans Committee, a 2 Much of this analysis of the impact of LCU's work was written by (and almost all the semi-structured interviewing was carried out by) Helen Derbyshire. + +102 + + Case studies + +Credit Control Committee, and a Supervisory Committee which carries out regular checks on the operation of the other committees. LCU offers a voluntary savings facility. Members can deposit as little as they like. Withdrawals of up to £10 (about US$17) can be made at the main office (open four afternoons a week) or at one of the various satellite collection points which operate on a part-time basis. Larger amounts may take longer, but for those who suffer mobility problems, these rules are implemented very flexibly. LCU has only been able to pay a dividend on savings for the first time in 1995 at a rate of 1 per cent. Up to this point, it had used its income from loan interest to build reserves against bad debt. Members of LCU conduct their activities entirely independently. Security for loans is provided by savings balances and the 'common bond' of local residence, rather than group collateral. While loan size can be a maximum of twice the savings balance plus £300, (US$500), subject to a legally prescribed ceiling, a crucial component of judging applications is examining past savings deposits and attempting to set the loan instalments to levels just below the amount, and at the intervals at which, the borrower usually saves. This is done in order to try and ensure that savings balances continue to rise. Quick-access loans in emergencies are also available. Interest rates on loans stand at 12 per cent p.a, resulting in a real rate of around 9 per cent. However, credit of the type LCU offers to its members (much of which is used for consumption) would only be available at rates of interest of at least 20 per cent from the formal sector in the UK. LCU members would also face many other barriers in trying to obtain such loans. Members automatically qualify for life insurance cover, which LCU purchases in bulk via the Association of British Credit Unions. This would pay off any outstanding loans and provide twice the value of savings to a previously named beneficiary in the event of death. LCU is involved in two important innovations. The first is the Junior Savers Scheme. Three of the four satellite collection points are in schools, and there are now 400 child members, some of whom get involved in keeping computerised records for the scheme. LCU has also been involved in a scheme run by Birmingham Credit Union Development Agency to connect up three inner-city credit unions by using modem links between computers, enabling members to use the offices of any of the three to undertake transactions. In addition, LCU took part in research to establish the business potential for a bill-paying service. Bills for utilities (gas, electricity, water) are major expenses for poor people. Not only do they often find it difficult to organise their payments on a regular basis but they also incur high transport costs and fees in paying bills. The business plan suggests that a service could be provided more cheaply than the one the Post + +103 + + Microfinance and Poverty Reduction Office currently provides, and that it would be commercially viable in the long run. The capital funding for the project has not yet been raised. + +6.4.3 Financial performance and sustainability +Ladywood Credit Union has experienced some difficulties with the timing of repayments. In about one-third to one-half of all loans there are gaps of three weeks or more in repayment instalments, which are usually weekly. However, part of Ladywood's service is that it investigates non-payers and is flexible in repayment schedules. Such a situation is only possible because of the small number of members, and the close supervision available. Some 58 per cent of borrowers can be in arrears at any one time but at present serious default cases run at approximately 10 per cent of the loan fund and involve some 25 per cent of those with loans outstanding. This suggests that it is those with small loans who find it difficult to repay, and this is likely to be explained by the earlier observation that the scheme also has members who have salaries and take out loans for relatively large consumer items such as cars. This profile of membership and lending, in which better-off members are able to take larger loans which involve lower risks for LCU, suggests that to some extent these users are helping to ensure the availability of LCU's services to its poorer members. LCU's accounts show a healthy situation in which profits were made in the second half of 1995- However, this calculation does not include staff costs. At present the work is carried out by volunteers and a full-time development worker whose salary is paid by Birmingham City Council. Office space is free as part of the wider Ladywood Project. A sustainability index calculated on the basis of costing all inputs would probably indicate that Ladywood was not financially sustainable. However, LCU has demonstrated an ability to mobilise the voluntary work and other inputs required to sustain the union, and UK credit union law does not allow it to operate at a financial loss. Indeed, the voluntary work of the staff and their commitment are integral to the project in supporting an element of social interaction which is central to the project's way of working. This demonstrates the limitations of evaluating financial sustainability on the basis of a narrow financial calculation, especially in cases where it is possible to sustain voluntary inputs in the long term. + +6.4.4 Impact assessment +In order to understand the role LCU plays for its members, semi-structured interviews were carried out with 19 individuals. The respondents were selected by the current and former LCU development workers to reflect the + +104 + + Case studies + +range of members' socioeconomic backgrounds in terms of income, race, gender, age, and location. It was emphasised that interviews with poorer members and ex-members were of particular interest. Overall, members could be divided into two groups: • Those living on government benefits and/or very low employment income, often single parents, who used the Credit Union to control domestic finances. If they took loans, these members would tend to use them to pay domestic bills, cover the costs associated with Christmas or other festivals, and the purchase and repair of items of household equipment such as cookers and washing machines. • People with more regular incomes, including professionals employed in the Ladywood Project, for whom the main attraction was low-cost loans for larger items such as holidays, weddings, and cars. However, the credit union membership did not generally include the very poorest Ladywood residents, i.e. people living in debt. Kempson, in a wider study of those excluded from the banking system in the UK (HMSO report, 1994), classifies credit unions as 'mid-market'. As Kempson explains, creditunion members need to save in order to access loans. Most people without current accounts in high-street banks are not in a position to build up savings. In a separate study among poor people of Bangladeshi, Pakistani and Carribean origin in the UK, Herbert and Kempson (1996) found that, despite differences in credit use between these groups, all of them relied either on informal rotating savings and credit associations or friends, relatives, and the private informal sector (including pawn-brokers and foreign exchange agents) rather than credit unions. The interviews demonstrated that some members see LCU as a preventive measure to keep themselves out of a downward spiral of indebtedness to private credit-companies. The savings facilities of LCU, like those of URAC, are extremely useful to such people. It is those who are already heavily indebted who find it hard to manage a regular savings commitment as any income is already committed to existing creditors. In Ladywood indebtedness to private loan companies is common and mostly affects those people whose income is derived from benefits and various forms of casual labour. They borrow to meet consumption needs, such as clothes and household items, by obtaining them through mail-order catalogues or with high-interest loans taken from private credit-companies. A government-run Social Fund provides loans for items of essential domestic expenditure, such as cookers and beds, with repayments being deducted at source in fixed amounts from benefits. Private credit-company loans are + +105 + + Microfinance and Poverty Reduction provided in the form of vouchers for particular shops, or immediate unsecured cash loans to be repaid at very high rates of interest. There are increasing numbers of private credit-companies offering cash loans and shopping vouchers to people living in Ladywood. Their services are advertised in local shops and through leafleting door-to-door. Creditcompany agents, who are paid on a commission basis, visit people at home to provide loans and to collect repayments. Interest rates on loans are high: in most cases more than 50 per cent per annum. The credit-companies are providing a service which is extremely widely known and widely used, and to which, for those not in a position to save, there is often no alternative. Respondents described how the private credit-companies often tried to persuade people to take on more loans, even when they knew they were already heavily indebted. They therefore saw the purpose of the credit union as useful for the thrifty, preventing indebtedness through savings, and providing a means of building security against uneven cash needs. One of the clear advantages of the private credit-companies was the immediate nature of their loans, given without collateral. There is thus a philosophical difference between the credit union and the private loan-companies. While the former promote an ethic of thrift, providing people with a means of being in control of their own finances, and living within their income, the latter tempt people to spend, live beyond their means, and count the cost tomorrow. LCU users who live on benefits or very low incomes tend to save in irregular small amounts. They reported using loans to help to pay for items such as TV licences, utility bills, and life insurance. Such members felt they could not use banks due to embarrassment at the small amounts they deposited. They also make extensive use of the other sources of credit described above. Some who had tried to save in the credit union, found themselves unable to keep up with their initial expectations of their own savings capacity. Those people on benefits who use the credit union are very positive about it, stressing in particular the understanding approach of staff, the flexibility, the chance it provides to save in small amounts, the low rate of interest on loans, and the greater sense of control it offers them in difficult circumstances. The majority of LCU members fall into the second category: they are people who have a regular income, including some professionals. All of these people have bank or building-society accounts into which their salaries are paid, and make contributions to LCU by means of automatic transfers. A minority of people in this category save with a building society as well as with LCU, as a way of diversifying assets. Some people in African-Caribbean communities combine LCU savings with revolving savings and loans ('partner' arrangements). One of the advantages of such arrangements is the + +106 + + Case studies + +discipline in savings required which is enforced through strong social sanctions. But for those who find it impossible to meet the fixed weekly commitment, LCU offers a flexible alternative. 6.4.5 Conclusions The case of LCU illustrates a number of points of relevance to the themes of this book. First, the difficulties of reaching those who are already highly indebted and unable to make even small but regular savings which might eventually qualify them for a loan. Second, the combination of a financial service with a strong social support structure which encourages people to take control of their finances. Third, the role that other members of the local community can and do make in providing the service. These better-off people contribute by investing their capital and hence providing the funds for on-lending, taking and repaying loans so providing LCU an income. Some can also be counted among the volunteers from all income groups who give their time to assist in the running of the credit union. + +6.5 ACTIONAID in The Gambia +6.5.1 Background +ACTIONAID has been working in the small West African state of The Gambia since 1981. With a population of approximately 1 million, The Gambia has a GDP per capita of US$350 (1993). The bulk of the population is rural and dependent on agriculture. There is a single rainy season and only limited irrigation facilities along the Gambia river, and food security is a major concern. Agricultural development activities have always been central to the ACTIONAID The Gambia (AATG) programme. AATG works in over onesixth of the villages of The Gambia (591 villages in all). It is largely funded through child sponsorship in the UK, and in the early 1980s operated by giving grants to individuals and organisations. Many grants were given in kind in the form of seasonal inputs of seed and fertiliser as well as agricultural implements, such as ploughs, sinehoes, and weeders. By 1987, this was changed to a 'half grant: half credit' approach in which the credit repayments were used to finance further input supply. This approach moved to a 'full credit' system in which the full value of the credit was repaid; and since 1992 the strategy has been to locate this credit system within the village organisations and groups with which AATG works. These Village Development Groups (VDGs) have in many cases grown out of existing village institutions, including local savings and credit groups (kafosand osusus). AATG disburses interest-free loans to the VDG. The VDG + +107 + + Microfinance and Poverty Reduction allocates loans among members and may charge interest to members if it wishes. Repaid credit is kept in a Trust Account for each particular village. Since 1992, if the original loan capital has been repaid in full, AATG has made it available once more to the VDG to use for its own purposes ('recycling'). This can include on-lending to individuals. Thus AATG is attempting to use financial capital to build the resource bases of existing village institutions. 6.5.2 Design AATG has done little to stimulate saving by groups. However, groups are helped to open bank accounts in up-country branches of commercial banks into which they deposit membership fees. When AATG returns their Trust Account funds to them, this is done by a transfer to their bank account. Loans available from AATG have generally been provided in kind. They have covered seasonal inputs, such as seeds and fertiliser, which are repayable within a year; medium-term loans for agricultural implements, such as seeders and sinehoes, for between one and three years; and long-term loans of animal carts and oxen. Repayments are usually scheduled annually on the anniversary of the loan. The AATG fieldworker receives applications from the group for loans, and these are passed on to the project's credit committees for vetting against a range of criteria, including whether the community has overdue loans. If it has, it should receive no further loans. This rule was introduced in 1992 after loans had been issued to many communities and not repaid. However, repayment is often related to the strength and attitude of the village group, some groups being better organised and more interested in development activities than others. The 'recycling' of money to communities has acted as an incentive for some groups to pay-off outstanding loans in order to gain access to their Trust Funds. Others believe that what they have received should be treated as a grant, a clear hangover from AATG's past programming approach. AATG undertakes a range of activities including work in education and health. It has also worked with the groups and village organisations to expand their organisational and management skills. Training is provided to group executive committees, which are encouraged to extend their membership to all households in the village. Many of the organisations are almost entirely composed of women. In its early days, AATG worked mainly with group enterprises and farms and, since women's groups were common, tended to work with them. However, the degree of women's representation currently varies from village to village. Some of the groups have only a very small number of male members. + +108 + + Case studies AATG has never charged interest on loans. It takes the view that the loans are made to the village groups who can on-lend them with interest if they want to. However, in practice there is no evidence that this occurs for loans given directly by AATG. Where AATG has returned repaid loan funds to the group to utilise in their own way, evidence suggests that they are being lent out by the group at interest. These rates are difficult to calculate because the groups undertake a range of activities, such as purchase of food or seed which is stocked locally (very similar to the basic goods supply scheme in URAC), which may be offered in kind and repaid in cash. Groups tend to offer a range of terms on the type and nature of the loans. 6.5.3 Financial performance and sustainability In AATG, the repayment rate of 75 per cent is calculated as a historical figure taking account of the whole period of the scheme; the 'on-time' repayment rate is likely to be lower. The method of calculation is related to the programme's policy of 'recycling' funds to the VDGs once they have repaid their loans. This shift of policy has improved recovery rates in a number of villages since villagers have realised that they can receive more resources if they put pressure on those who have not repaid. There is evidence that groups have seized assets from non-payers as a result. AATG takes a very different approach to the issue of organisational and financial sustainability. It argues that it has never been and does not intend to be a microfinance institution. Rather its objective is to develop the institutional mechanisms that exist in the villages in which it works. Its change of strategy in 1992 from service delivery to institutional development underlines this approach. While it continues to offer credit to villagers, the way in which repayments are paid into Trust Funds for those villages means that the village is building its own capital fund through repaying. Against certain criteria of organisational development, the village is then allowed to apply for the return of those funds to be operated under its own management. This is an example of how this is now operating in one village: The VDG in Demfaye Njaga has 58 women and five men, representing a total of 29 households. It is well-organised and operates by dividing into small cells within which D5per month is collected. This money is deposited in the village safe and is used for emergencies. The village safe is not allowed to 'go dry'. If loans are neededfor an emergency, a small number of members of the loans committee are able to decide and report to the next executive meeting. Emergency loans are interest-free if repaid quickly (within a month). + +109 + + Microfinance and Poverty Reduction The group has received D28,253 back from AATG ($2,500) via its group bank deposit account. It withdrew D8,000, of which D7,000 was given out to members as cash credit at 15per cent interest over four months, to be repaid at the end of the dry season. D1000 was given out as loans for small business operations, which made D1280 profit. A further Dl 1,000 was then withdrawn and distributed as cash loans, some of which were used to buy food, others for trading. There have been no problems with repayment so far. None of the loans are given directly to men because the women feel that they have no authority over them to ensure repayment. This group has also taken a loan from the Gambia Village Development Trust which was offered at a rate of interest of 18 per cent over one year. It was used for buying carts which were given as loans to men and for ram-fattening activities. The profit made on this loan was D570. AATG is now building on the experience of recycling funds by looking at how it can support the continued development of financial services through training and support. Not all village groups are as well-organised as the group in Demfaye Njaga, and some have had problems with repayment. AATG's approach is still being refined. Among the 591 villages in which AATG works, not all will want to run, or be capable of running, their own financial institution. Some VDGs may invest in development projects and not revolve the capital fund. Some are likely to be development organisations with financial resources at their disposal, rather than village banks. 6.5-4 Impact assessment For the AATG case study semi-structured interviews were carried out with a sample of 42 individuals in eight villages. This was one part of a research initiative which included establishing information on coverage and other sources of credit. The individuals selected included men and women, those with short- and long-term loans, and non-borrowers. Seasonal loans had been received by upwards of 70 per cent of VDG members. However, this had sometimes meant very small amounts of seed or fertiliser (such as a quarter of a bag of fertiliser) as the VDG would decide to distribute the inputs it received equally to all members. The extent of coverage of long-term loans for agricultural implements was much more varied, ranging from 5 to 67 per cent of VDG members. The differences in coverage between villages often reflected the fact that villages which had not repaid had not been given further loans. + +110 + + Case studies Five individuals interviewed reported non-repayment of more than one loan. This can be related to AATG's relatively 'soft' policy on loan repayment, especially prior to 1991. In three of these cases the village had received no new loans since 1991 as a result of this non-payment. In the remaining two cases further new loans had been received by the village in spite of the policy change. Of the 30 respondents who summarised what a loan had meant to them, only one mentioned a negative impact. (The loan was for a donkey which had had to be sold following non-repayment due to a bad harvest.) The remaining 29 reported increased production, improved yield, more food, less need to borrow from elsewhere, and reduced length of the 'hungry season'. One respondent, the President of one of the VDGs, had taken three longterm, fixed-capital loans for a sinehoe, seeder, and cart, and claimed he was unable to repay any of them due to poor harvests. In this case, the use of social position to obtain a relatively high number of long-term loans was combined with non-repayment. (It is interesting to contrast this with the example of one village in the Casa Campesina Cayambe project (Ecuador), in which relatively wealthy office-holders took more loans than others, but repaid them; and with the Ladywood Credit Union in Birmingham which relies on larger loans taken out by relatively well-off people to generate income for the organisation from interest payments.) The evidence suggested that seasonal working-capital loans had expanded the supply of relatively scarce inputs. Although yields have improved as a result of fertiliser use, it appeared the increases had not reduced the length of the hungry season and there was no evidence that they had enabled processes of accumulation and expansion of agricultural production to take place over subsequent seasons either. The impression of researchers was that women borrowers and poorer borrowers were more likely to repay, but also that the poorest exclude themselves from larger loans, not wanting to jeopardise their access to future credit through gaining a reputation for being uncreditworthy. Indebtedness has increased in some of the AATG villages, however, partly because of the inter-annual variation in rainfall: most loans are agriculture-related and agricultural production is rainfall dependent. However, non-payment is also due to the 'soft' line on repayment taken by AATG. A tougher stance might have led to higher repayment but also to more self-exclusion by potential users. Of the eight villages where the study took place, six had received recycled funds. The main use of these funds, which are allocated entirely by the VDG, has been to provide hungry season consumption loans, often through setting up small retail shops within the village. (This indicates a similar need to that addressed by URAC, for the convenient supply of basic consumer items.) There had been a limited supply of loans for consumption purposes + +111 + + Microfinance and Poverty Reduction previously, with capital available to groups only from pre-existing group savings. Because most kafo groups already have experience of providing small cash loans out of their own savings, the recycling of funds was taking advantage of an indigenous system, which was already working well. Loans made out of recycled funds carry relatively high interest rates, but also achieve high repayment rates. Recycled funds have also been used to provide agricultural implements, such as sinehoes and seeders, on credit to members. The seasonal loans made by AATG and the consumption loans made out of group revolving funds have enabled many women to cope with immediate needs. However, assets received in women's names as long-term loans are owned and controlled by the male household head. In one group, women reported that men were habitual non-repayers and that they did not have the means to enforce repayment from menTherefore they did not give loans to men. AATG's main objective since 1992 has been the establishment of village institutions and it now sees credit as a means through which group organisation and management can be strengthened as well as provided with financial resources. The need for 100 per cent repayment before further loans are sanctioned, and the system of recycled funds, has introduced incentives for group cohesion and management which did not exist prior to 1992. While earlier policies had resulted in poor loan repayment in many villages, there was no evidence that this had resulted in non-payment of kafo loans. This contrasts with the findings of research which suggests that 'soft' policies might 'contaminate' indigenous lending practices (Nagarajan, Meyer and Graham, 1995). In one village, Sinchu Tamsir, where the AATG scheme is not performing well in terms of loan repayments, indigenous group activities continue to be effective. Non-payment in the AATG system in this case had been a result of the abuse of the system by the village head, an option that was clearly not open to him in the indigenous system. The apparent success of recycling funds raises questions about the necessity of the continued existence of the AATG credit work. An alternative approach would be to make capital grants into pre-existing group revolving funds (where such funds can be seen to be working well) to expand their capital base. However, with declining profitability on marketed groundnuts, reduced remittances from urban migrants due to increasing unemployment, and the shrinkage in the tourist trade, rural livelihoods are under pressure. AATG's credit-cum-grants and the recycled funds make a small contribution to the capitalisation of village institutions and to the coping mechanisms of poor households. Seasonal loans in particular have enabled poor households to protect their livelihoods, through the use of otherwise inaccessible agricultural inputs which result in greater yields. 112 + + Case studies + +In some cases better-off households are able to use the capital to accumulate wealth without respecting the repayment requirements. There is insufficient evidence to judge whether this increases socio-economic differentiation. The recycling of repaid loans to village groups has meshed well with existing systems for group investment and allocation of loans. There is also no evidence to suggest that the soft line on repayment enforcement in the AATG credit scheme negatively influences the working of indigenous kafos. However, it is possible that this experience will complicate the efforts of other external agencies aiming at sustainable microfinance initiatives. + +6.5.5 Conclusions +AATG is the largest operational NGO in The Gambia where it has been working since the early 1980s. Its size and history influence current performance both in terms of users' attitudes to the project as well as the organisational constraints in deciding and implementing major changes in policy and approach. Changes are often piloted with smaller numbers of villages before being extended as general policy. Such constraints mean that change takes time to agree, experiment with, and then implement throughout the agency. The understanding of fieldworkers and community members is key and it is often more difficult to communicate changes in policy during a programme than when starting up in new areas. AATG has decided that its main aim is to build strong rural institutions rather than to become a sustainable financial intermediary itself. The shift to community-based management systems which was introduced in 1992 was brought about as a result of lessons learned from its own work and a desire to move its own practice forward. This major shift in policy has taken time to implement, but interesting results are beginning to show, with groups demonstrating their ability to manage recycled funds. The strength of local communities' existing skills in management of osusus and kafos have contributed to the success of this policy. In turn this indicates what can be learned from an exploration of indigenous systems of financial services. + +6.6 Casa Campesina Cayambe, Ecuador +6.6.1 Background +Casa Campesina Cayambe (CCC) was set up by a Salesian priest in 1987 as an extension of work that Salesian fathers had been undertaking for several decades. It works with indigenous Quichua Indians in four parishes, 80km north of Quito, at an altitude of some 2,800 metres in the Andes. + +113 + + Microfinance and Poverty Reduction The villages depend on agriculture and livestock. They farm land regained after the collapse of a co-operative system, which had taken over land from large estates after land reform legislation. The land-holdings of poorer households are typically as small as two hectares and necessitate seasonal migration of family members for agricultural labour or to the cities. Annual family incomes are approximately US$300 compared with a national per capita average of US$1200 (1993 figures). While literacy is high, at 87 percent, child malnutrition is also high, at 50 per cent. CCC's financial services are an example of NGO credit-provision in a closely defined geographical area. Loans were initially allocated through the Centros Infantiles Campesinos, the creches for children aged three to six. Loans were available to the children's parents, funds coming directly from Ayuda en Accion. At the same time, Foderuma (the government programme for which the charismatic CCC leader had worked as promoter) was allocating loans through village-level organisations. Foderuma loans were given in kind in the form of agricultural inputs. Foderuma was dissolved in 1994. 6.6.2 Design The project operates in the three sectors of production, education, and health. The credit programme exists as part of the production programme but is not exclusively credit for production. There is no savings component. CCC does not operate a group mechanism of its own, rather it operates through the Quichua's indigenous system of Community Committees, which exist independently of CCC. The loan application must be approved by the Community Committee and be signed by the Credit Delegate and Community Directorate before being passed to the Inter-Community Credit Committee (CIC). This committee, which consists of a delegate from each of the villages, meets monthly. It approves applications for loans and decides on the allocation of credit between communities. The sanction of no further loans to the community is applied when an individual defaults. Continued nonpayment results in legal proceedings being brought against the borrower by the CIC. Credit is provided in a number of categories. 'Ordinary' credit is the main type of loan with a maximum amount of 1 million sucres (Approx. US$400 in 1995) which can be used for any purpose. This amount has been raised over the years as inflation has been high, but the project has attempted to retain this limit at a level which would ensure a degree of coverage for poorer members, and to correspond to the debt-carrying capacities of households. Other loans available are: 'special' loans in cases of illness or domestic emergency; loans for the installation of bathrooms — a total of 600 have been + +114 + + Case studies + +installed to date; credit for housing construction, involving a group of about ten people who apply together, and the provision of building materials in kind through a supplier; and credit for new productive activities — these are micro-enterprise ventures usually in fish production or cheese making in which the project also carries some of the risk of failure and provides a large degree of training and technical support. Further categories of credit available are for grassland and seed improvement. CCC charges 52 per cent (APR) on ordinary loans or 43 per cent if calculated on the basis of declining balance. (APR is Annual Percentage Rate. For example, CCC charges 325,000 sucres for a loan of 1,000,000 which is repaid in five equal three-monthly instalments; 325,000 interest is therefore paid on an average loan balance of 500,000, representing 65 per cent over 15 months or 52 per cent over 12 months.) This is in the context of an inflation rate that varied between 45 and 55 per cent p.a. in the period 1990-1993. Since mid1995 the inflation rate has virtually halved, to 24 per cent, so CCC interest rates have become strongly positive in real terms. Other types of loan carry interest rates of 32.5 per cent, also presenting a positive but lower real interest rate. There is no rule against applying for more than one loan: for example a borrower of an ordinary loan can access another loan for a different purpose. However, as CCC became more aware of the need to try to avoid the concentration of loans in a particular family, it instituted a new rule whereby any new applicants had priority over those who were applying for further loans. 6.6.3 Financial performance and sustainability CCC measures the numbers of loans (rather than loan volumes) for which payments are on time and records non-payment after the loan term is complete. Out of 1,333 loans issued since 1990 and on which loan terms have been completed, 13 per cent have been paid late and only in 2 per cent of cases has legal action been taken. In cases of default the CIC has initiated legal action to seize the possessions of the borrower. Any community with four unpaid repayment instalments forfeits the right to further loans. The system is then intended to involve pressure both from within the household and within the community for timely loan repayment. The number of overdue instalments needed to invoke the bar on further loans was increased after borrowers were found to be unable rather than unwilling to repay. In the case of CCC, movement towards financial sustainability has been strong. At the end of 1994 interest rates were raised in the context of high inflation which then fell in 1995 leaving real interest rates positive, at approximately 27 per cent on ordinary loans and 10 per cent on other types of + +115 + + Microfinance and Poverty Reduction loan. In 1995, the costs of operating the scheme were 4 per cent of the loan fund implying that interest rates a little above this level were needed to break even. (In fact, interest rates would need to be slightly higher, since a proportion of the capital is inactive, having been repaid and awaiting further applications.) Expansion of staff and new capital equipment in 1996 will result in increased costs but these still stand at only 10 per cent of the loan fund. However, the loan fund is partly sourced from a Canadian-Ecuadorian fund on which 32 per cent annual interest is paid. Even when this fund has been repaid and removed from the current loan fund the costs of operation in 1996 would represent approximately 10 per cent of the loan fund and hence suggests that CCC is very near full financial sustainability. However, in terms of organisational sustainability, the fund may not be sustainable without the supporting framework of CCC. The scenario presented here allows the scheme to cover costs of administration and follow-up and suggests a situation in which the credit fund can continue to operate as a cost-covering arm of the project. It is less clear what framework the credit scheme could operate within if the whole structure of CCC did not exist. Proposals for the CIC to take over the loan fund encountered resistance. This was related to the recent history of co-operatives in the project area, when management groups had used their position to take advantage of the co-operative's benefits, which has made people wary of management by such organisations, fearing that conflicts of interest might arise. 6.6.4 Impact assessment A study was carried out in the community of Turucucho. Most of the land in the community is irrigated, with average holdings per family of nine hectares, making it a community of moderate wealth by local standards. Main crops are barley, beans, potatoes, and grass (for dairy herds). Through loans specifically for grassland management many members have improved milk output and raised incomes. Turucucho has benefited from several externally funded projects, including the opening of a bridle path, the construction of a community building, and provision of CCC credit. The programme has encountered particular difficulties in this community. Its directorate has recently disbanded and been replaced. There has been a repayment problem, which has meant that access to new loans has been delayed until all past loans have been paid; and some members have only repaid under the threat of legal action. The distribution of loans to families in this community has produced substantial coverage but has at the same time been highly skewed. While the majority of families had received at least one loan, investigation revealed that + +116 + + Case studies + +three families had received 46 loans out of a total of 104. These three extended families are headed respectively by the President, Vice-President, and Credit Representative, who are the wealthiest individuals in the community. Of the nine families who had not applied for a loan, five were those least involved in agricultural production, and included single mothers, and young families from which adult male members migrate to the city in search of employment. Since loans in Cayambe were often used for economic investment, in particular to purchase cows, there is a danger that economic differentiation within the community could increase, as the better-off are able to increase their incomes by much more than poorer people. This widening gap could increase relative poverty. 6.6.5 Conclusions The case of CCC presents an example in which there has been good movement towards financial sustainability. In this context the institutional arrangement preferred by the project (making the Inter Community Credit Committee the managing body) was rejected by the members themselves and left CCC in search of a new organisational form. CCC has developed a variety of credit services catering to a range of local needs including the specific need to protect a family's asset base in the face of medical emergencies. This case study again illustrates the difficulty of designing credit for very poor people, who prefer not to take on the risks of indebtedness. As in CCC, working with existing community structures may be a deliberate choice to respect the local social context, and take advantage of their inherent strengths. At the same time, agencies have to be aware of the intragroup and intra-communal struggles which inevitably occur, and find ways of counterbalancing these, as CCC has done by instituting rules to avoid loan concentration. + +117 + + 7 +Conclusions +In focusing on microfinance, emphasis has been laid on the need that poor people have for a wide range of financial services. These needs are evidenced by the uses made of financial services that already exist but which are usually informal in nature. This shift in emphasis away from the provision of credit solely for income generation towards a range of financial services is consistent with an understanding of poverty which looks beyond low incomes to vulnerability and powerlessness. Providing microfinance can give poor people the means to protect their livelihoods against shocks as well as to build up and diversify — also a means of protecting — their livelihood activities by investing loan capital. The role of credit in promoting incomes has been the rationale for NGO programmes in this sector in the past. However, obtaining one or two loans has rarely resulted in sustained improvements in income for poor people. Moreover, even if very poor people are able to invest successfully, unexpected shocks can undo any gains very quickly. Thus, the poorest are likely to need to build up a degree of security before investment and growth become possible. In any place at any time, the needs of poor people for financial services are many and varied depending on individual circumstances: some will be saving for the future, while others will be facing a crisis, and still others wish to obtain a loan to invest. A programme of flexible services which can be adapted to meet these different needs is more likely to be relevant and useful to poor people. Many informal financial services are a response to the saving requirements of poor people, and we have described how developments in the technology of lending to poor people have been based on the demonstrated ability and willingness of poor people to save. However, the further establishment of flexible savings facilities requires appropriate regulatory environments. There is still relatively limited experience on the part of NGOs in insurance, hire purchase, and related financial services. Thinking in terms of microfinance rather than credit therefore encourages NGOs to develop and try out a wider range of services to support poor people's livelihoods. + +118 + + Conclusions We have proposed an overall approach that NGOs should adopt to microfinance for poverty reduction. The first point is the need to consider any proposal for intervention within the context of existing informal financial services. Extensive study and documentation of informal financial services has taken place all over the world. This work has demonstrated that diverse facilities already exist; some are highly exploitative but others provide for needs ranging from buying household items and clothes to trade credit. Research has demonstrated that these informal facilities are enduring features of the local economy. We have categorised them into those which are owned by their users and those which are provided 'for profit'. While demonstrating the flexibility and diversity of the myriad of informal ways in which people's financial needs are dealt with, we have argued that these services can harm as well as enable poor people. Financial relationships, especially those of debt, are one way in which the powerlessness of groups of poor people is entrenched. The analysis suggests therefore that intervention in local financial markets is an area that should be approached with great care. It is necessary to understand for whom, in what ways, and under what circumstances the array of local services adds to the options they have for maintaining and developing their livelihoods, or contributes to their further impoverishment. To assist in making this assessment we have suggested that services which are owned by their users are less likely to contain an exploitative dimension for those users than those which are offered on a 'for profit' basis. This approach to understanding pre-existing services should be followed by a consideration of whether or not the NGO in question should intervene. There is evidence that NGOs do not necessarily possess the right range of skills and experience to effectively implement and manage the provision of financial services. When NGOs do this they in effect set themselves up as bankers: a role few would be likely to contemplate if expressed in this way. Consequently we have suggested that the NGO should carefully and honestly assess whether it has the appropriate skills and resources before beginning work. Acquiring or developing the specialist skills is a long-term commitment which itself requires substantial investment of funds. Poor people's needs for financial services are enduring and long-term. An NGO considering whether to provide services must understand the need for a commitment to do so for a considerable length of time: the 30 years or more of a bank's existence, rather than the three to five years of donor funding arrangements. There are alternatives to becoming a direct provider of services. An NGO can play a useful role in promoting financial services. This can make use of an NGO's skills in mobilisation, training, and management in establishing + +119 + + Microfinance and Poverty Reduction groups who undertake internal savings and credit; promoting user-owned small-scale initiatives such as thrift co-operatives and credit unions; linking groups to banks; bringing in an NGO which has special expertise in financial services (of whom there are a growing number); or undertaking advocacy within the country to involve the formal banking system in microfinance. If a decision to intervene is made, we have argued that it is necessary to understand the rationales for different combinations of recently developed design features including small loan sizes, regular repayment, group lending, higher interest rates, and savings. Cutting out the need for physical collateral (whether through peer-group lending or locally based loan-officers providing character references for individuals) is based on a process of screening borrowers which uses local 'inside' information. The local loan-officer or the other members of the loan group will probably know better than a bank does who is likely to repay a loan, and the appropriate size of that loan. This understanding can enable designers of microfinance schemes to more effectively adapt their technology to local circumstances. Features such as small loan sizes, regular repayment, and regular meetings have been used as low-cost means of discouraging better-off people from joining schemes. Small loan sizes and regular repayment may also be useful in preventing indebtedness among poorer borrowers. Meetings can be a means of bringing together women in contexts where they are otherwise unable to leave their homesteads. The effectiveness of these design features will also depend on the particular situation: the appropriateness of the loan size in relation to local circumstances, the cost of time lost to users attending regular meetings, and the regularity of their income streams in relation to loan repayments. A focus on lending to women has become common for microfinance schemes. Some commentators suggest that this is the result of practical considerations about the efficiency of operation. Evidence has shown that it cannot be assumed that loans received by women are necessarily empowering. Gender-related objectives need therefore to be made clear when embarking on scheme design, and steps taken to ensure that women are supported in developing their own uses for financial services. In discussing financial services we have emphasised the role of savings. Schemes involving a 'compulsory' savings component have demonstrated the ability of users to save on a regular basis from regular income. However, in these schemes savings are not usually accessible and therefore the need remains for voluntary savings facilities — safe places to store money to meet planned as well as unexpected, immediate as well as long-term expenditures. However, while highlighting the advantages of voluntary savings facilities, + +120 + + Conclusions we have also emphasised the heavy responsibility that operating any savings programme entails. The provision of credit at interest rates below those in the formal private sector has in the past resulted in the failure of many development finance institutions to reach their target groups and provide an effective service. Subsidising interest rates tended to attract unsuccessful projects and at the same time prevented the institution from covering its costs. More recent experience has suggested that poor people can take and repay loans at interest rates which contribute to costs, especially if repayments are organised in ways that relate to their flow of income. It has therefore become more acceptable for interest rates to be set at levels which cover inflation and make a contribution to the costs of administration and default. In the initial stages of a microfinance programme, however, costs will inevitably be high, and setting interest rates to cover them is likely to price the organisation out of the market. Interest rates will remain a sensitive political issue in many countries and environments, and NGOs surely would not wish to become the 'new exploiters' (Rutherford, 1995b, pl51). Setting realistic interest rates should not be a license for high costs and inefficiency. Poor people need financial services on a long-term basis and sustainability is thus important. In the past NGOs which have provided credit as part of a short-term package of inputs have not been able to meet the repeated demand for credit and savings facilities. In this context, there are two main aspects of sustainability: financial sustainability and organisational sustainability. The financial sustainability of microfinance schemes can be enhanced by charging interest rates which make a contribution to costs, and by reducing default rates. An emphasis on measuring financial sustainability for an operational programme can enable important debates about the direction of the programme to have a financial basis. However, financial sustainability does not guarantee organisational sustainability. Organisational sustainability will depend on a range of factors such as management, staffing, and organisational structure. The incentives used to motivate staff to avoid collusion with scheme users is critical, as is their integrity in handling money. Organisational structure is an area of some controversy. Some have argued that the role of NGOs is not to convert themselves into banks but to retain anNemphasis on innovative work with the poorest which others will not undertake^eg Dichter, 1996). While there are notable examples of NGOs turning themselves into banks, this course of action is only one of many in the provision of financial services to poor people in the long term. We have already discussed the alternatives to direct provision which involve NGOs in a more promotional role — examples such as village banks, credit unions, and thrift co-operatives are models which are + +121 + + Microfinance and Poverty Reduction being tried out. Credit unions have a good record of success in a number of countries. It is in considering the potential for these long-term structures at the outset that an NGO might be convinced that a promotional role rather than one of direct provision is more appropriate. While we have argued that the potential for sustainability is important, NGOs aiming for poverty reduction will need to assess the impact of their services on users' livelihoods. Conventional approaches to impact assessment have focused on a set of causal linkages from the intervention to reduced poverty. This type of impact assessment has proved extremely difficult, and costly, since there are many methodological pitfalls. In the past ten years 'participatory' approaches to research have become widely used. These methodologies applied to microfinance can enable institutions to capture more of the diversity of their impact. However, even from among those most closely associated with development of 'participatory' approaches, warnings about their limitations have emerged (Guijt and Cornwall, 1995). Involving a representative cross-section of users in impact assessment is essential in order to explore the ways in which financial services are able to support livelihoods; protect them through savings, and consumption or emergency loans; and promote them through savings accumulation and loans for investing in livelihood activities. Approaching impact in this way leads to a concern with the usefulness of services to poor people in securing livelihoods rather than in meeting NGO's expectations of what financial services can achieve. The diversity of users' socio-economic circumstances even within what might appear to outsiders to be an homogeneous environment will affect demand for financial services. Even poor women will differ significantly in their socio-economic status, life-cycle effects being a particular feature: the needs of young unmarried women will differ from those of young married women with growing families; and from the needs of older women with grown-up sons or those who are widows. Putting this into practice means understanding the diversity of users' situations through, for example, wealth ranking and focus group discussions. A process of dialogue with users can be structured in ways which increase the weight that can be given to the findings. Thus obtaining multiple accounts and cross-checking them, and exposing findings to critical review by users themselves as well as other staff and peers are means of ensuring that qualitative information is not misinterpreted. Channelling this information into a structured and continuous process of feedback enables the organisation, if it is willing, to learn useful lessons and to adapt its services to meet the needs of users more effectively. + +122 + + Conclusions In the course of this book, we have demonstrated the ways in which poor people use financial services to support their livelihoods. Developing a microfinance intervention which can respond to these demands, and which is able to meet the varied needs of people within the same location at the same time, is a challenge for NGOs. This challenge involves understanding what exists, deciding on an appropriate role, designing in relation to local circumstances, focusing on sustainability, and being willing to learn from experience. Responding to this challenge offers the prospect that microfinance interventions will play an important role in reducing poverty. + +123 + + BancoSol Bolivia BRAC Bangladesh SANASA Sri Lanka K-REP Kenya + +BRI Unit Grameen Bank Desa Indonesia Bangladesh 1.4m 650,000 1,177 51 267 310 75 107 143 540 220 50 700,000 + +No. of borrowers (1992) + +50,000 + +1.8m + +% women borrowers + +74 150 220 + +24 + +94 + +Average borrower income level (US$) 360 + +296 + +GNP per capita US$(I992) + +680 + +670 +n/a 68 approx. 173 + +Average borrower income as a % of poverty line before 1 st loan 80 + +480 + +195 + +n/a + +Average loan size (1992, US$) + +i +75 15 +Compulsory savings, Tk 2/week, 5% of loan to 'savings fund' 4% to VO fund, 1% life insurance Weekly at group meetings + +322 + +600 + +50 +11 + +347 9 +Compulsory 20% Voluntary savings available deposit plus and compulsory voluntary savings savings for borrowers Monthly at cooperative HQ Weekly at group meetings +X' n" + +Real interest rate % (1992) 15 Compulsory savings, Tkl/week, 5% of loan to 'group fund' and 5% to 'emergency fund' Weekly at group meetings + +45 + +6 + +Savings/Insurance arrangements + +Compulsory Voluntary 10% deposit plus savings voluntary savings + +3 + +1 +4.0 8.9 + +Loan collection method + +Fortnightly or monthly at bank branch +4.5 + +Monthly at bank branch + +6 month arrears rate % (1992) + +0.6 + +3.0 + +3.0 + +Source: Adapted from Hulme and Mosley (1996) + + Annex 2 +Repayment rates +The repayment rate can be defined as: repayments made repayment rate = repayments due Since the repayment rate should precisely measure those payments which have been made among those which are scheduled as due at a particular time, it can be referred to as the 'on-time' repayment rate. The on-time repayment rate needs to be calculated regularly in relation to a time period of relevance to the programme. If the majority of loan repayments are made on a monthly basis then the repayment rate should be calculated on a monthly basis. This figure will be independent of the rate for the previous month and the month before that. When monitoring the performance of a scheme it will be important also to look at the trend in repayment rates. Rates of repayment might fluctuate over the year, if borrowers have difficulty in making instalments at certain times, such as during the dry season before harvests are due. + +Arrears rate +Loans which are not being repaid can be shown by the arrears rate, which also needs to be defined in a manner appropriate to programme policies. If, for example, experience showed that loans tended to be repaid within three months of their due date then a figure of particular interest might be loans outstanding after three months: value of loans outstanding on which repayments are more than 3 months overdue arrears rate = total value of loans outstanding This shows the proportion of the total loan portfolio which is at risk of turning into default at any given time. The classification of a loan as in arrears may prompt certain types of action on the part of the project, such as intensive follow-up of the individual lender, or the withdrawal of further loans from a group of co-guarantors. These actions would be designed to prevent the loan moving from being in arrears to being in default. + +126 + + Default rate +The default rate needs to be defined in relation to the programme's default policy. The point at which a loan is defined as being in default will vary. For example, some schemes may classify loans as being in default if repayments are overdue one month after the loan term is complete; others define default as two loan instalments not being received according to the repayment schedule. When a loan is regarded as in default it should be monitored. For financial purposes it must be entered into a loan loss provision. In definition a default rate is virtually the same as an arrears rate: default rate = value of loans which are defined as in default total value of loans outstanding While the arrears rate indicates the proportion of the loan portfolio which might be at risk, the default rate shows the proportion of the loan fund which has gone a stage further towards being lost. However, this does not necessarily mean that the loan will never be recovered. It might be at this stage that any savings balances or loan guarantees from other members of the community are called in. + +127 + + References +Abdullah, T, Rutherford, S and Hossain, I (1995) 'Mid Term Review of BURO Tangail's Rural Savings and Credit Program', Mimeo. Abugre, C, Johnson, S, Abimbilla B and Dunn, M (1995) 'A Review of Credit Activities in Bawku Development Area', ACTIONAID Ghana. Mimeo. ACTIONAID Vietnam, (1996) 'The Son La RDA: Using Quantitative Data and Qualitative Research in Impact Evaluation 1992-2000', (Draft). Ackerly, B (1995) 'Testing the tools of development: credit programmes, loan involvement and women's empowerment', IDS Bulletin, 26 (3): 56-68. Abugre, C (1994) 'When credit is not due' in Bouman and Hospes (eds) Financial Landscapes Reconstructed: The Fine Art of Mapping Development, Boulder, Colorado: Westview Press. Adams, D (1992) 'Taking a fresh look at informal finance', in Adams and Fitchett, Informal Finance in Low-Income Countries: 5-25 Adams, D and Fitchett, D A (eds) (1992) Informal Finance in Low-Income Countries, Boulder, Colorado: Westview Press. Adams, D and Von Pischke, J D (1992) 'Microenterprise credit programs: dejavu, World Development, 20(10): 1463-1470. Archer, D and Cottingham, S (1996) Action Research Report on REFLECT: Experiences of Three REFLECTPilot Projects in Uganda, Bangladesh, and El Salvador, Overseas Development Administration Education Paper 17. Ardener, S and Burman, S (eds) (1995) Money-Go-Rounds: The Importance ofRotating Savings and Credit Associationsfor Women, Oxford: Berg. Aredo, D (1993) 'The iddir. a study of an indigenous informal financial institution in Ethiopia', Savings and Development 1:17 + +128 + + References + +Barrow P and Barrow C (1992) Business Plan Workbook, Kogan Page Beck, T (1994) The Experience of Poverty: Fightingfor Respect and Resources in Village India, London: Intermediate Technology Publications. Bennett, L (1995) 'Donor Approaches to Finance Against Poverty: Hydrology or Intermediation?', Paper to the Conference on Finance Against Poverty, University of Reading, March. Bennett, L and Cuevas, C E (1996) 'Sustainable banking with the poor', foumal of International Development, Special Issue: Sustainable Banking with thePoor, 8 (2): 145-153. Bennett, L, Goldberg, M and Hunte, P (1996) 'Ownership and sustainability: lessons on group-based financial services from South Asia', Journal of International Development, Special Issue, Sustainable Banking with the Poor, 8 (2) pp 271-289. Bhaduri, A (1981) 'Class relations and the pattern of accumulation in an agrarian economy', Cambridge Journal of Economics: 33-46. Bouman, F (1995) 'Rotating and accumulating savings and credit associations: a development perspective', World Development, 23 (3): 371-384. Bouman, F and Moll, H (1992) 'Informal finance in Indonesia' in Adams and Fitchett (eds) op. cit. BRI (no date), 'BRI Village Units: The Rural Financial Intermediary', BRI Indonesia. Chauduri, S A (1994) 'A case for Bankassurance in Rural Bangladesh', Daily Star, Dhaka, January. Chaves, R and Gonzalez-Vega, C (1996) The design of successful financial intermediaries: evidence from Indonesia', World Development, 24 (1): 65-78. Christen, R (1990) Financial Management of Micro-Credit Programs: A Guidebook for NGOs, ACCION Publications, 733 15th Street NW, Suite 700, Washington DC 20005, USA. Christen, R, Rhyne, E and Vogel, R (1994) 'Maximizing The Outreach of Microenterprise Finance: The Emerging Lessons of Successful Programs.A Summary of Findings and Recommendations', paper presented to the Conference on Finance Against Poverty, Reading University, March 1995. Copestake, J G (1996a) 'Gandhian and neoclassical insights into group lending: a case study from the Tamilnadu countryside', Journal of Rural Development, 15 (1). + +129 + + Microfinance and Poverty Reduction Copestake, J G (1996b) 'Poverty-oriented financial servicee programmes: room for improvement?', Savings and Development, 19 (4). Dichter, T W(1996) 'Questioning the future of NGOs in microfinance, Journal of International Development, Special Issue-. Sustainable Banking with thePoor, March 1996, 5 (3) : 259-271. Dreze, J and Sen. A (1989) Hunger and Public Action, Oxford Clarendon Press. Ebdon, R (1995) 'NGO experience and the fight to reach the poor: gender implications of NGO scaling-up in Bangladesh', IDS Bulletin, 26 (3): 49-53Edwards, M, and Hulme, D (eds) (1995) Non-Governmental Organisations Performance and Accountability: Beyond the Magic Bullet, Earthscan. Fall, A (1991) Cereal Banks at Your Service, Oxfam. Fowler, A (1995) 'Assessing NGO performance: difficulties, dilemmas and a way ahead' in Edwards and Hulme (eds) op. cit. Gazdar, H, Howes, S and Zaidi, S (1996) 'A Profile of Poverty in Pakistan: Some Insights from Pakistan Integrated Household Survey 1991', STICERD, LSE, mimeo. Goetz, A and Sen Gupta, R (1996) 'Who takes the credit? Gender, power and control over loan use in rural credit programmes in Bangladesh, World Development, 24 (1): 45-63. Guijt, I and Cornwall, A (1995) Critical Reflections on the Practice ofPRA, PLA Notes 24, London: International Institute for Environment and Development. Haggblade, S, (1978) 'Africanization from below: the evolution of Cameroonian savings societies into Western-style banks', RuralAfricana, Vol2. Hashemi, S M, Schuler, S R and Riley, A (1996) 'Rural credit programs and women's empowerment in Bangladesh', World Development, 24 (4). Havers, M (1996) 'Financial sustainability in savings and credit programmes', Development in Practice 6(2). Herbert, A and Kempson, E (19960 Credit Use Among Ethnic Minorities, London: Policy Studies Institute. Holt, S L (1994) 'The Village Bank methodology: performance and prospects' in Otero and Rhyne (eds), The New World of Microenterprise Finance, London: Intermediate Technology Publications. + +130 + + References Howes, M (1996) NGOs and the Development of Membership Organisations, Development Insights, IDS Sussex, 18 March. Hulme, D (1995) 'Solving Agrarian Questions Through Finance? Financial Innovations, Rural Poverty and Vulnerability', Paper presented at the Agrarian Questions Congress, Wageningen, May Hulme, D and Montgomery, R (1994) 'Cooperatives, credit and the poor: private interest, public choice and collective action in Sri Lanka', Savings and Development, 18(3) Hulme, D and Mosley, P (1996) Finance Against Poverty, 2 Volumes, London: Routledge. IADB (1994) Technical Guideforthe Analysis ofMicroenterprise Finance Institutions, Inter-American Development Bank, Microenterprise Division, June 1994 Jain, P (1996) 'Managing credit for the rural poor: lessons from the Grameen Bank', World Development, 24(1): 79-89Kabeer, N (1996) 'Agency, well-being and inequality: reflections on the gender dimensions of poverty', IDS Bulletin, 27 (1), ppll-21. Kempson, E (1994) Outside the Banking System: A Review ofHouseholds Without a Current Account, Social Security Advisory Committee Research Paper 6, London: HMSO. Khandker, S R, Khalily, B and Khan, Z (1995) Grameen Bank: Performance andSustainability, World Bank Discussion Paper 306. Lipton, M (1996) Successes in Antipoverty, Geneva: International Institute of Labour Studies Mansell-Carstens, C (1995) Las Finanzas Populares En Mexico, Mexico City: Centra de Estudios Monetarios Latino Americanos; Editorial Milenio; ITAM. McGregor, A (1994) The Growing Gap Between the Banking System and the Poor in Rural Bangladesh: Problems ofFinancial Liberalisation and the RiseofNGOs, University of Bath, Centre for Development Studies, Occasional Paper 3- + +131 + + Microfinance and Poverty Reduction Montgomery, R (1996) 'Disciplining or protecting the poor? Avoiding the social costs of peer pressure in micro-credit schemes', Journal of International Development, Speciallssue, Sustainable Banking with the Poor, March 1996,8 (2). Mukhopadhyay, M, and March, C (1992) 'Income Generating Projects: A View from the Grassroots', Oxfam Gender and Development Unit. Mustafa, S et al (1996) Beacon of Hope: An Impact Assessment ofBRAC's Rural Development Programme, Dhaka: BRAC Evaluation Division. Nagarajan, G, Meyer, R L and Graham, D H (1995) 'Effects of NGO financial intermediation on indigenous self-help village groups in The Gambia', Development Policy Review 13. Newens, M and Roche, C (1996) 'Evaluating Social Development: Initiatives and Experience in Oxfam', Paper presented at International Workshop on Evaluation of Social Development, November, Netherlands. Onumah, G E (1995) 'Challenges of Rural Financial Intermediation: The Experience of Rural Banks in Ghana', paper presented to the Conference on Finance Against Poverty, Reading University, March. Osmani, L N K (1996) 'The Grameen Bank Experiment: Empowerment of Women Through Credit', paper to the DSA Women and Development Study Group, May. Osmani, S (1989) 'Limits to the alleviation of poverty through non-farm credits', Journal ofthe Bangladesh Institute of Development Studies, 18 (4). Otero, M and Rhyne, E (eds) (1994) TheNew World of Microenterprise Finance, London: Intermediate Technology Publications. Oxfam (India) Trust (1993) Paper to the India Policy Forum. Piza Lopez, E, and March, C (1990) Gender Considerations in Economic Enterprises, Oxfam Working Paper, Oxford: Oxfam. Pretty, J (1994) 'Alternative systems of inquiry for a sustainable agriculture', IDS Bulletin, 25(2). Pretty, J, Guijt, I, Thompson, J and Scoones, I (1995) Participatory Learning and Action -A Trainer's Guide, London: International Institute for Environment and Development, 3 Endsleigh Street, London WC1H ODD.. Remenyi, J (199D Where Credit is Due: Income-Generating Programmes for the Poor in Developing Countries, London: Intermediate Technology. + +132 + + References Riddell, R, and Robinson, M (1995) Non Governmental Organisations and Rural Poverty Alleviation, Oxford University Press. Rhyne, E (1995) 'A new view of finance program evaluation', in Otero and Rhyne (eds) op. cit. Robinson, M (1994) 'Savings mobilisation and microenterprise finance: the Indonesian experience' in Otero and Rhyne (eds) op. cit. Robinson, M (1995) 'Introducing Savings Mobilisation in Microfinance Programs: When and How?' Paper to the Microfinance Network, Phillipines, November. Roche, C (1995) 'Impact Assesment Workshop Report', Oxfam Southern Africa Regional Forum, July. Rogaly, B (1985) A Study ofCommission Agents in Dindigul With Special Reference to Producer Credit, Reading University and Tamil Nadu Agricultural University, Credit for Rural Development in Southern Tamil Nadu Research Project, Research Report 5. Rogaly, B (1991) 'Lathur Rural Development Project Evaluation Report', London: Friends of Assefa, mimeo. Rogaly, B (1996a) 'Microfinance evangelism, 'destitute women' and the hard selling of a new anti-poverty formula', Development in Practice, 6 (2). Rogaly, B (1996b) 'Agricultural growth and the structure of 'casual' labourhiring in rural West Bengal1\ Journaloj"Peasant Studies, 23 (4). Rutherford, S (1995a) The Savings ofthe Poor: Improving Financial Services in Bangladesh, Dhaka, Binimoy. Rutherford, S (1995b) ASA: The Biography ofan NGO, Empowerment and Credit in Rural Bangladesh, Dhaka: Association for Social Advancement. Rutherford, S (1996) A Critical Typology of Financial Services for the Poor, ACTIONAID Working Paper. SEEP (1995) Financial Ratio Analysis of Micro-Finance Institutions, SEEP Network, CALMEADOW.Pact Publications, 777 United Nations Plaza, New York, NY 10017, USA. Srinivasan, S (1995) 'ROSCAs among South Asians in Oxford', in Ardener and Burman (eds) op. cit. + +133 + + Microfinance and Poverty Reduction Stearns, K (199D The Hidden Beast: Delinquency in Microenterprise Credit Programs, ACCION Publications, 733 15th Street NW, Suite 700, Washington DC 20005, USA. Strachan, P, and Peters, C (forthcoming) 'Empowering Communities: A Casebookfrom Western Sudan, Development Casebook Series, Oxford: Oxfam. Tanburn, J (1996) 'Towards success: impact and sustainability in the FIT provramme', Journal ofSmall Enterprise Developmentl (1). Tierney, A (forthcoming) 'Local Concepts of Development in Western Tanzania', PhD thesis, London School of Economics. Tomlinson, P (1995) 'The Role of Small-scale Enterprise Promotion in Economic and Social Development', Unpublished MSc thesis, University of Bristol (UK). Webster, L and Fidler, P (1995) The Informal Sector and Micro-Finance Institutions in Western Africa, Private Sector Development Department, World Bank. White, S (1991) Evaluating the Impact ofNGOs in Rural Poverty Alleviation: Bangladesh Country Study, London: Overseas Development Institute. White, S (1996) 'Depoliticising development: the uses and abuses of participation', Development in Practice 6 (1). Wiggins, S and Rogaly, B (1989) 'Providing rural credit in Southern India', Public Administration and Development, 9: 215-232. Wijesundera, D (1996) 'Small and micro enterprise in Sri Lanka: bring the bankers to the people', Development in Practice 6 (2). WWB (1993) Organising Savings and Creditfor Poor Women: A Field Manual, Ahmedabad: Friends of Women's World Banking. WWB (1994) 'Achieving policy impact', Women's World Banking Newsletter 4 (5) December. WWB, 8 West 40th Street, New York, NY 10018, USA. Yaron, J (1992) Assessing Development Finance Institutions: A Public Interest Analysis, World Bank Discussion Paper 174. Yaqub, S (1995) 'Empowered to default? Evidence from BRAC's micro-credit programmes', Journal ofSmall Enterprise Development, 6 (4). Yaqub, S (1996) 'Macroeconomic Conditions for Successful Microfinance for Poor People'. Paper commissioned by Policy Department, Oxfam, April. + +134 + + +
+ + +
+ + +
+ + +
+ + +
+
+
    +
  • +

    Reads:

    + + 706 +
  • + + + +
  • +
    +

    Rated:

    +
    +
    + +
  • + +
  • +

    Published:

    + 04 / 08 / 2011 +
  • + +
  • +

    Category:

    +
    + + +
    + + + +
    + + + +
    + +
  • + +
+ + + + Report this document + + + + +
+

Description:

+

The potential of savings, credit and other financial services to support the livelihoods of poor people is increasingly being recognised. Microfinance interventions can raise incomes, contribute to...

+
+ + + + +
+
+ + + + + +
+
+ + + + +
+ + + + + +
+
+ + + +
+ + + + +
+ + + + + +
+ + + +
+ + +
+
+
+ + + + + +
+ + + + + + +
+ + + + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + +
+Spider Spoofer Info:
+ +
+ +
+ +
+ + diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties new file mode 100644 index 000000000..dff8ddadc --- /dev/null +++ b/src/main/resources/log4j.properties @@ -0,0 +1,22 @@ +# ***** Set root logger level to WARN and its two appenders to stdout and R. +log4j.rootLogger=trace, stdout + +# ***** stdout is set to be a ConsoleAppender. +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.trace.encoding=UTF-8 +# ***** stdout uses PatternLayout. +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +# ***** Pattern to output the caller's file name and line number. +log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n + + + +#set httpclient debug levels +log4j.logger.org.apache.component=ERROR,stdout +log4j.logger.org.apache.http.wire=ERROR,stdout +log4j.logger.org.apache.commons.httpclient=ERROR,stdout +log4j.logger.org.apache.http.client.protocol=ERROR,stdout +log4j.logger.org.apache.http=ERROR,stdout + + +log4j.logger.net.sf.jmimemagic=WARN diff --git a/src/test/java/GeeseTest.java b/src/test/java/GeeseTest.java new file mode 100644 index 000000000..40c4add0f --- /dev/null +++ b/src/test/java/GeeseTest.java @@ -0,0 +1,12 @@ +import com.pshken.geese.GeeseRipper; +import org.junit.Test; + + +public class GeeseTest { + + @Test + public void testGeese() throws Exception{ + + } + +} From fb163311d76bc467fb3dbdfe9ff0897a385110f8 Mon Sep 17 00:00:00 2001 From: pshken Date: Thu, 14 Jul 2011 23:59:03 -0700 Subject: [PATCH 025/347] Edited README via GitHub --- README | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README b/README index df7c1fd65..a259f7bff 100644 --- a/README +++ b/README @@ -1 +1,3 @@ -This is a test README for now. +This project is a fork version from Goose. The reason why this project is created is because for Goose, it only takes in URL and clean but in some case which I encountered, I have only HTML source, so I written Geese ontop of Goose, so that it allows users to directly input HTML string for extraction. + +You can contact me at shaohong86@gmail.com \ No newline at end of file From 21ae1dc1c97b7a9e16faf0414063617f422f0de7 Mon Sep 17 00:00:00 2001 From: pshken Date: Fri, 15 Jul 2011 00:06:11 -0700 Subject: [PATCH 026/347] Edited pom.xml via GitHub --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 95da51f65..202a64ea8 100644 --- a/pom.xml +++ b/pom.xml @@ -104,5 +104,5 @@ geese geese - com.knx.lum + com.shaohong From e783fe42f88950ff5abe577c4123fb9ff45da325 Mon Sep 17 00:00:00 2001 From: pshken Date: Fri, 15 Jul 2011 00:07:30 -0700 Subject: [PATCH 027/347] Edited pom.xml via GitHub --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 202a64ea8..8d378443c 100644 --- a/pom.xml +++ b/pom.xml @@ -104,5 +104,5 @@ geese geese - com.shaohong + com.pshken From b5ce59ab4a6a65274958c20edc1e52997d5c7bb5 Mon Sep 17 00:00:00 2001 From: Andrew Lin Date: Thu, 28 Jul 2011 12:47:43 -0400 Subject: [PATCH 028/347] basic urlendpoint working --- .gitignore | 1 + c | 2 + pom.xml | 42 ++++++++++++++++- r | 2 + src/main/java/andrewlin12/URLEndpoint.java | 54 ++++++++++++++++++++++ 5 files changed, 100 insertions(+), 1 deletion(-) create mode 100755 c create mode 100755 r create mode 100644 src/main/java/andrewlin12/URLEndpoint.java diff --git a/.gitignore b/.gitignore index 615c5c5c9..9e01876c0 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ target/ /goose.iml /goose.ipr /goose.iws +.project diff --git a/c b/c new file mode 100755 index 000000000..f4ad2b199 --- /dev/null +++ b/c @@ -0,0 +1,2 @@ +#!/bin/sh +JAVA_HOME=/usr/lib/jvm/java-6-sun-1.6.0.26/ mvn compile diff --git a/pom.xml b/pom.xml index 1ab62173f..0c950b87d 100644 --- a/pom.xml +++ b/pom.xml @@ -14,6 +14,21 @@ UTF-8 + + + maven2-repository.java.net + Java.net Repository for Maven + http://download.java.net/maven/2/ + default + + + maven-repository.java.net + Java.net Maven 1 Repository (legacy) + http://download.java.net/maven/1 + legacy + + + junit @@ -55,13 +70,38 @@ commons-lang 2.6 - + + net.sf.json-lib + json-lib + 2.4 + jdk15 + + + com.sun.jersey + jersey-server + 1.8 + + + org.simpleframework + simple + 4.1.21 + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.6 + 1.6 + + org.apache.maven.plugins maven-source-plugin diff --git a/r b/r new file mode 100755 index 000000000..61f18b035 --- /dev/null +++ b/r @@ -0,0 +1,2 @@ +#!/bin/sh +MAVEN_OPTS="-Xms256m -Xmx2000m" mvn exec:java -Dexec.mainClass=URLEndpoint -e diff --git a/src/main/java/andrewlin12/URLEndpoint.java b/src/main/java/andrewlin12/URLEndpoint.java new file mode 100644 index 000000000..9f003ea81 --- /dev/null +++ b/src/main/java/andrewlin12/URLEndpoint.java @@ -0,0 +1,54 @@ +import com.jimplush.goose.*; +import org.simpleframework.http.core.Container; +import org.simpleframework.transport.connect.Connection; +import org.simpleframework.transport.connect.SocketConnection; +import org.simpleframework.http.Response; +import org.simpleframework.http.Request; + +import java.net.InetSocketAddress; +import java.net.SocketAddress; +import java.io.PrintStream; +import java.util.*; + +import net.sf.json.*; + +public class URLEndpoint implements Container { + public static void main(String[] args) throws Exception{ + Container container = new URLEndpoint(); + Connection connection = new SocketConnection(container); + SocketAddress address = new InetSocketAddress(8890); + + connection.connect(address); + } + + public void handle(Request request, Response response) { + try { + Configuration config = new Configuration(); + config.setImagemagickConvertPath("/usr/bin/convert"); + config.setImagemagickIdentifyPath("/usr/bin/identify"); + config.setLocalStoragePath("./storage"); + + ContentExtractor contentExtractor = new ContentExtractor(config); + String url = "http://techcrunch.com/2010/08/13/gantto-takes-on-microsoft-project-with-web-based-project-management-application/"; + Article article = contentExtractor.extractContent(url); + + Map map = new HashMap(); + map.put("title", article.getTitle()); + map.put("image", article.getTopImage().getImageSrc()); + map.put("text", article.getCleanedArticleText()); + + PrintStream body = response.getPrintStream(); + long time = System.currentTimeMillis(); + + response.set("Content-Type", "application/json"); + response.setDate("Date", time); + response.setDate("Last-Modified", time); + + body.println(JSONObject.fromObject(map).toString()); + body.close(); + } + catch (Exception e) { + System.err.println(e); + } + } +} \ No newline at end of file From c197fe041ef9c2ea98506edfdfae7be22058fd8c Mon Sep 17 00:00:00 2001 From: Andrew Lin Date: Thu, 28 Jul 2011 12:58:03 -0400 Subject: [PATCH 029/347] take url param --- src/main/java/andrewlin12/URLEndpoint.java | 45 ++++++++++++++-------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/src/main/java/andrewlin12/URLEndpoint.java b/src/main/java/andrewlin12/URLEndpoint.java index 9f003ea81..4143590d9 100644 --- a/src/main/java/andrewlin12/URLEndpoint.java +++ b/src/main/java/andrewlin12/URLEndpoint.java @@ -1,4 +1,5 @@ import com.jimplush.goose.*; +import com.jimplush.goose.images.Image; import org.simpleframework.http.core.Container; import org.simpleframework.transport.connect.Connection; import org.simpleframework.transport.connect.SocketConnection; @@ -23,32 +24,44 @@ public static void main(String[] args) throws Exception{ public void handle(Request request, Response response) { try { - Configuration config = new Configuration(); - config.setImagemagickConvertPath("/usr/bin/convert"); - config.setImagemagickIdentifyPath("/usr/bin/identify"); - config.setLocalStoragePath("./storage"); + PrintStream body = response.getPrintStream(); + Map map = new HashMap(); - ContentExtractor contentExtractor = new ContentExtractor(config); - String url = "http://techcrunch.com/2010/08/13/gantto-takes-on-microsoft-project-with-web-based-project-management-application/"; - Article article = contentExtractor.extractContent(url); + String url = request.getQuery().get("url"); + if (url == null || url.length() == 0) { + map.put("error", true); + map.put("message", "No URL specified"); + } + else { + Configuration config = new Configuration(); + config.setImagemagickConvertPath("/usr/bin/convert"); + config.setImagemagickIdentifyPath("/usr/bin/identify"); + config.setLocalStoragePath("./storage"); - Map map = new HashMap(); - map.put("title", article.getTitle()); - map.put("image", article.getTopImage().getImageSrc()); - map.put("text", article.getCleanedArticleText()); + ContentExtractor contentExtractor = new ContentExtractor(config); + Article article = contentExtractor.extractContent(url); - PrintStream body = response.getPrintStream(); - long time = System.currentTimeMillis(); + map.put("success", true); + map.put("title", article.getTitle()); + Image image = article.getTopImage(); + if (image != null) { + map.put("image", article.getTopImage().getImageSrc()); + } + map.put("link", article.getCanonicalLink()); + map.put("text", article.getCleanedArticleText()); + } + + body.println(JSONObject.fromObject(map).toString()); response.set("Content-Type", "application/json"); + + long time = System.currentTimeMillis(); response.setDate("Date", time); response.setDate("Last-Modified", time); - - body.println(JSONObject.fromObject(map).toString()); body.close(); } catch (Exception e) { - System.err.println(e); + e.printStackTrace(); } } } \ No newline at end of file From 4341df991248da3ced16890f0ab6b62a770f54b0 Mon Sep 17 00:00:00 2001 From: Andrew Lin Date: Thu, 28 Jul 2011 13:31:25 -0400 Subject: [PATCH 030/347] remove unneeded repositories --- pom.xml | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/pom.xml b/pom.xml index 0c950b87d..53b6ec294 100644 --- a/pom.xml +++ b/pom.xml @@ -14,21 +14,6 @@ UTF-8 - - - maven2-repository.java.net - Java.net Repository for Maven - http://download.java.net/maven/2/ - default - - - maven-repository.java.net - Java.net Maven 1 Repository (legacy) - http://download.java.net/maven/1 - legacy - - - junit From 4eee54c5d621558aca17c20c60f60d86fe3f6cbd Mon Sep 17 00:00:00 2001 From: Andrew Lin Date: Thu, 28 Jul 2011 16:25:45 -0400 Subject: [PATCH 031/347] remove unused dependency --- pom.xml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/pom.xml b/pom.xml index 53b6ec294..f47a22568 100644 --- a/pom.xml +++ b/pom.xml @@ -61,11 +61,6 @@ 2.4 jdk15 - - com.sun.jersey - jersey-server - 1.8 - org.simpleframework simple From 192bc4545a644a23baadfb8d53146b807779a813 Mon Sep 17 00:00:00 2001 From: Andrew Lin Date: Thu, 28 Jul 2011 18:52:02 -0400 Subject: [PATCH 032/347] HTML encode strings --- src/main/java/andrewlin12/URLEndpoint.java | 23 ++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/java/andrewlin12/URLEndpoint.java b/src/main/java/andrewlin12/URLEndpoint.java index 4143590d9..c26df4eb9 100644 --- a/src/main/java/andrewlin12/URLEndpoint.java +++ b/src/main/java/andrewlin12/URLEndpoint.java @@ -22,6 +22,25 @@ public static void main(String[] args) throws Exception{ connection.connect(address); } + public static String encodeHTML(String s) + { + StringBuffer out = new StringBuffer(); + for(int i=0; i 127 || c=='"' || c=='<' || c=='>') + { + out.append("&#"+(int)c+";"); + } + else + { + out.append(c); + } + } + return out.toString(); + } + + public void handle(Request request, Response response) { try { PrintStream body = response.getPrintStream(); @@ -42,13 +61,13 @@ public void handle(Request request, Response response) { Article article = contentExtractor.extractContent(url); map.put("success", true); - map.put("title", article.getTitle()); + map.put("title", encodeHTML(article.getTitle())); Image image = article.getTopImage(); if (image != null) { map.put("image", article.getTopImage().getImageSrc()); } map.put("link", article.getCanonicalLink()); - map.put("text", article.getCleanedArticleText()); + map.put("text", encodeHTML(article.getCleanedArticleText())); } body.println(JSONObject.fromObject(map).toString()); From 0b4cc0ae84aaa524ec659b2a4825783cc4c5c3dd Mon Sep 17 00:00:00 2001 From: Andrew Lin Date: Thu, 28 Jul 2011 19:19:34 -0400 Subject: [PATCH 033/347] put images candidates from BestImageGuesser into Article --- src/main/java/andrewlin12/URLEndpoint.java | 1 + .../java/com/jimplush/goose/ContentExtractor.java | 11 +++++++++-- .../com/jimplush/goose/images/BestImageGuesser.java | 6 ++++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/andrewlin12/URLEndpoint.java b/src/main/java/andrewlin12/URLEndpoint.java index c26df4eb9..a421be64e 100644 --- a/src/main/java/andrewlin12/URLEndpoint.java +++ b/src/main/java/andrewlin12/URLEndpoint.java @@ -66,6 +66,7 @@ public void handle(Request request, Response response) { if (image != null) { map.put("image", article.getTopImage().getImageSrc()); } + map.put("images", article.getImageCandidates()); map.put("link", article.getCanonicalLink()); map.put("text", encodeHTML(article.getCleanedArticleText())); } diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java index 7c3b61bc1..ea530d5dc 100644 --- a/src/main/java/com/jimplush/goose/ContentExtractor.java +++ b/src/main/java/com/jimplush/goose/ContentExtractor.java @@ -28,6 +28,7 @@ import org.apache.commons.lang.StringEscapeUtils; import org.apache.http.client.HttpClient; import org.jsoup.nodes.*; +import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.jsoup.select.Selector; import org.slf4j.Logger; @@ -70,7 +71,7 @@ public class ContentExtractor { private static final StringSplitter ARROWS_SPLITTER = new StringSplitter("»"); private static final StringSplitter COLON_SPLITTER = new StringSplitter(":"); private static final StringSplitter SPACE_SPLITTER = new StringSplitter(" "); - + private static final Set NO_STRINGS = new HashSet(0); private static final String A_REL_TAG_SELECTOR = "a[rel=tag], a[href*=/tag/]"; @@ -79,7 +80,7 @@ public class ContentExtractor { * holds the configuration settings we want to use */ private Configuration config; - + // sets the default cleaner class to prep the HTML for parsing private DocumentCleaner documentCleaner; // the MD5 of the URL we're currently parsing, used to references the images we download to the url so we @@ -189,7 +190,13 @@ public Article performExtraction(String urlToCrawl, String rawHtml) { HttpClient httpClient = HtmlFetcher.getHttpClient(); imageExtractor = getImageExtractor(httpClient, urlToCrawl); article.setTopImage(imageExtractor.getBestImage(doc, article.getTopNode())); + ArrayList imageCandidates = new ArrayList(); + Iterator iter = imageExtractor.getAllImages().iterator(); + while (iter.hasNext()) { + imageCandidates.add(iter.next().attr("src")); + } + article.setImageCandidates(imageCandidates); } // grab siblings and remove high link density elements diff --git a/src/main/java/com/jimplush/goose/images/BestImageGuesser.java b/src/main/java/com/jimplush/goose/images/BestImageGuesser.java index a18882a84..0bd732678 100644 --- a/src/main/java/com/jimplush/goose/images/BestImageGuesser.java +++ b/src/main/java/com/jimplush/goose/images/BestImageGuesser.java @@ -120,6 +120,8 @@ public class BestImageGuesser implements ImageExtractor { */ Configuration config; + ArrayList filteredImages; + public BestImageGuesser(Configuration config, HttpClient httpClient, String targetUrl) { this.httpClient = httpClient; @@ -233,7 +235,7 @@ private boolean checkForLinkTag() { } public ArrayList getAllImages() { - return null; //To change body of implemented methods use File | Settings | File Templates. + return this.filteredImages; } @@ -253,7 +255,6 @@ private void checkForLargeImages(Element node, int parentDepth, int siblingDepth Elements images = node.select("img"); - String nodeId = this.getNodeIds(node); if (logger.isDebugEnabled()) { logger.debug("checkForLargeImages: Checking for large images, found: " + images.size() + " - parent depth: " + parentDepth + " sibling depth: " + siblingDepth + " for node: " + nodeId); @@ -275,6 +276,7 @@ private void checkForLargeImages(Element node, int parentDepth, int siblingDepth HashMap imageResults = downloadImagesAndGetResults(goodImages, parentDepth); + this.filteredImages = goodImages; // pick out image with high score Element highScoreImage = null; From 3e948941ccc4dd29867ee070296a86a9e8b1d755 Mon Sep 17 00:00:00 2001 From: Andrew Lin Date: Fri, 29 Jul 2011 14:20:15 -0400 Subject: [PATCH 034/347] add web service instructions --- README | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README b/README index e5c73f1ac..8a65dca68 100644 --- a/README +++ b/README @@ -15,3 +15,9 @@ To use goose from the command line: cd into the goose directory mvn compile MAVEN_OPTS="-Xms256m -Xmx2000m" mvn exec:java -Dexec.mainClass=com.jimplush.goose.TalkToMeGoose -Dexec.args="http://techcrunch.com/2011/05/13/native-apps-or-web-apps-particle-code-wants-you-to-do-both/" -e -q > ~/Desktop/gooseresult.txt + +To run the web service: + +MAVEN_OPTS="-Xms256m -Xmx2000m" mvn exec:java -Dexec.mainClass=URLEndpoint -e -q + +Hit http://localhost:8890/url?=http://techcrunch.com/2011/05/13/native-apps-or-web-apps-particle-code-wants-you-to-do-both/ From 06d68f3796c2174650c8e9296d9da479e617afca Mon Sep 17 00:00:00 2001 From: Andrew Lin Date: Wed, 17 Aug 2011 15:39:02 -0400 Subject: [PATCH 035/347] minor fixes --- src/main/java/andrewlin12/URLEndpoint.java | 4 ++++ src/main/java/com/jimplush/goose/ContentExtractor.java | 7 ++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/andrewlin12/URLEndpoint.java b/src/main/java/andrewlin12/URLEndpoint.java index a421be64e..76e98ced3 100644 --- a/src/main/java/andrewlin12/URLEndpoint.java +++ b/src/main/java/andrewlin12/URLEndpoint.java @@ -24,6 +24,10 @@ public static void main(String[] args) throws Exception{ public static String encodeHTML(String s) { + if (s == null) { + return ""; + } + StringBuffer out = new StringBuffer(); for(int i=0; i imageCandidates = new ArrayList(); Iterator iter = imageExtractor.getAllImages().iterator(); while (iter.hasNext()) { - imageCandidates.add(iter.next().attr("src")); + String src = iter.next().attr("src"); + if (!src.startsWith("http:")) { + URL url = new URL(urlToCrawl); + src = "http://" + url.getHost() + new File(new File(url.getPath()), src).getPath(); + } + imageCandidates.add(src); } article.setImageCandidates(imageCandidates); From 1a7220312890460f4a162763ff50dead8ba012e3 Mon Sep 17 00:00:00 2001 From: Cory Hacking Date: Fri, 19 Aug 2011 12:46:44 -0600 Subject: [PATCH 036/347] prevent spans inside of td's or p's from being converted to divs; also reparse cleaned html to prevent duplicate paragraphs parsing http://www.fbi.gov/news/stories/2011/july/atm_071411/atm_071411 --- .../com/jimplush/goose/ContentExtractor.java | 1895 ++++++++--------- .../cleaners/DefaultDocumentCleaner.java | 606 +++--- 2 files changed, 1239 insertions(+), 1262 deletions(-) diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java index 7c3b61bc1..332547b4a 100644 --- a/src/main/java/com/jimplush/goose/ContentExtractor.java +++ b/src/main/java/com/jimplush/goose/ContentExtractor.java @@ -21,13 +21,24 @@ import com.jimplush.goose.cleaners.DocumentCleaner; import com.jimplush.goose.images.BestImageGuesser; import com.jimplush.goose.images.ImageExtractor; -import com.jimplush.goose.network.*; +import com.jimplush.goose.network.HtmlFetcher; +import com.jimplush.goose.network.MaxBytesException; +import com.jimplush.goose.network.NotHtmlException; import com.jimplush.goose.outputformatters.DefaultOutputFormatter; import com.jimplush.goose.outputformatters.OutputFormatter; -import com.jimplush.goose.texthelpers.*; +import com.jimplush.goose.texthelpers.HashUtils; +import com.jimplush.goose.texthelpers.ReplaceSequence; +import com.jimplush.goose.texthelpers.StopWords; +import com.jimplush.goose.texthelpers.StringReplacement; +import com.jimplush.goose.texthelpers.StringSplitter; +import com.jimplush.goose.texthelpers.WordStats; +import com.jimplush.goose.texthelpers.string; import org.apache.commons.lang.StringEscapeUtils; import org.apache.http.client.HttpClient; -import org.jsoup.nodes.*; +import org.jsoup.nodes.Attribute; +import org.jsoup.nodes.Attributes; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.jsoup.select.Selector; import org.slf4j.Logger; @@ -36,7 +47,9 @@ import java.io.File; import java.net.MalformedURLException; import java.net.URL; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; /** * User: jim plush @@ -47,374 +60,364 @@ * Gravity was doing 30+ million links per day with this codebase across a series of crawling servers for a project * and it held up well. Our current port is slightly different than this one but I'm working to align them so the goose * project gets the love as we continue to move forward. - * + *

* Cougar: God dammit, Mustang! This is Ghost Rider 117. This bogey is all over me. He's got missile lock on me. Do I have permission to fire? * Stinger: Do not fire until fired upon... */ - public class ContentExtractor { + // PRIVATE PROPERTIES BELOW - // PRIVATE PROPERTIES BELOW - - private static final Logger logger = LoggerFactory.getLogger(ContentExtractor.class); - - private static final StringReplacement MOTLEY_REPLACEMENT = StringReplacement.compile("�", string.empty); - - private static final StringReplacement ESCAPED_FRAGMENT_REPLACEMENT = StringReplacement.compile("#!", "?_escaped_fragment_="); - - private static final ReplaceSequence TITLE_REPLACEMENTS = ReplaceSequence.create("»").append("»"); - private static final StringSplitter PIPE_SPLITTER = new StringSplitter("\\|"); - private static final StringSplitter DASH_SPLITTER = new StringSplitter(" - "); - private static final StringSplitter ARROWS_SPLITTER = new StringSplitter("»"); - private static final StringSplitter COLON_SPLITTER = new StringSplitter(":"); - private static final StringSplitter SPACE_SPLITTER = new StringSplitter(" "); - - private static final Set NO_STRINGS = new HashSet(0); - private static final String A_REL_TAG_SELECTOR = "a[rel=tag], a[href*=/tag/]"; - - - /** - * holds the configuration settings we want to use - */ - private Configuration config; - - // sets the default cleaner class to prep the HTML for parsing - private DocumentCleaner documentCleaner; - // the MD5 of the URL we're currently parsing, used to references the images we download to the url so we - // can more easily clean up resources when we're done with the page. - private String linkhash; - // once we have our topNode then we want to format that guy for output to the user - private OutputFormatter outputFormatter; - private ImageExtractor imageExtractor; - - - /** - * you can optionally pass in a configuration object here that will allow you to override the settings - * that goose comes default with - */ - public ContentExtractor() { - this.config = new Configuration(); - } - - /** - * overloaded to accept a custom configuration object - * - * @param config - */ - public ContentExtractor(Configuration config) { - this.config = config; - } - - - /** - * @param urlToCrawl - The url you want to extract the text from - * @param html - if you already have the raw html handy you can pass it here to avoid a network call - * @return - */ - public Article extractContent(String urlToCrawl, String html) { - - return performExtraction(urlToCrawl, html); - - - } - - /** - * @param urlToCrawl - The url you want to extract the text from, makes a network call - * @return - */ - public Article extractContent(String urlToCrawl) { - String html = null; - return performExtraction(urlToCrawl, html); - } - - - public Article performExtraction(String urlToCrawl, String rawHtml) { - - urlToCrawl = getUrlToCrawl(urlToCrawl); - try { - new URL(urlToCrawl); - - this.linkhash = HashUtils.md5(urlToCrawl); - } catch (MalformedURLException e) { - throw new IllegalArgumentException("Invalid URL Passed in: " + urlToCrawl, e); - } - - ParseWrapper parseWrapper = new ParseWrapper(); - Article article = null; - try { - - if (rawHtml == null) { - rawHtml = HtmlFetcher.getHtml(urlToCrawl); - } - - article = new Article(); - - article.setRawHtml(rawHtml); - - Document doc = parseWrapper.parse(rawHtml, urlToCrawl); - - - // before we cleanse, provide consumers with an opportunity to extract the publish date - article.setPublishDate(config.getPublishDateExtractor().extract(doc)); - - // now allow for any additional data to be extracted - article.setAdditionalData(config.getAdditionalDataExtractor().extract(doc)); - - // grab the text nodes of any elements - article.setTags(extractTags(doc)); - - // now perform a nice deep cleansing - DocumentCleaner documentCleaner = getDocCleaner(); - doc = documentCleaner.clean(doc); - - article.setTitle(getTitle(doc)); - article.setMetaDescription(getMetaDescription(doc)); - article.setMetaKeywords(getMetaKeywords(doc)); - article.setCanonicalLink(getCanonicalLink(doc, urlToCrawl)); - article.setDomain(article.getCanonicalLink()); - - - // extract the content of the article - article.setTopNode(calculateBestNodeBasedOnClustering(doc)); - - if (article.getTopNode() != null) { + private static final Logger logger = LoggerFactory.getLogger(ContentExtractor.class); - // extract any movie embeds out from our main article content - article.setMovies(extractVideos(article.getTopNode())); + private static final StringReplacement MOTLEY_REPLACEMENT = StringReplacement.compile("�", string.empty); + private static final StringReplacement ESCAPED_FRAGMENT_REPLACEMENT = StringReplacement.compile("#!", "?_escaped_fragment_="); - if (config.isEnableImageFetching()) { - HttpClient httpClient = HtmlFetcher.getHttpClient(); - imageExtractor = getImageExtractor(httpClient, urlToCrawl); - article.setTopImage(imageExtractor.getBestImage(doc, article.getTopNode())); + private static final ReplaceSequence TITLE_REPLACEMENTS = ReplaceSequence.create("»").append("»"); + private static final StringSplitter PIPE_SPLITTER = new StringSplitter("\\|"); + private static final StringSplitter DASH_SPLITTER = new StringSplitter(" - "); + private static final StringSplitter ARROWS_SPLITTER = new StringSplitter("»"); + private static final StringSplitter COLON_SPLITTER = new StringSplitter(":"); + private static final StringSplitter SPACE_SPLITTER = new StringSplitter(" "); - } + private static final Set NO_STRINGS = new HashSet(0); + private static final String A_REL_TAG_SELECTOR = "a[rel=tag], a[href*=/tag/]"; - // grab siblings and remove high link density elements - cleanupNode(article.getTopNode()); + /** + * holds the configuration settings we want to use + */ + private Configuration config; + // sets the default cleaner class to prep the HTML for parsing + private DocumentCleaner documentCleaner; + // the MD5 of the URL we're currently parsing, used to references the images we download to the url so we + // can more easily clean up resources when we're done with the page. + private String linkhash; + // once we have our topNode then we want to format that guy for output to the user + private OutputFormatter outputFormatter; + private ImageExtractor imageExtractor; - outputFormatter = getOutputFormatter(); + /** + * you can optionally pass in a configuration object here that will allow you to override the settings + * that goose comes default with + */ + public ContentExtractor() { + this.config = new Configuration(); + } + /** + * overloaded to accept a custom configuration object + */ + public ContentExtractor(Configuration config) { + this.config = config; + } - article.setCleanedArticleText(outputFormatter.getFormattedText(article.getTopNode())); + /** + * @param urlToCrawl - The url you want to extract the text from + * @param html - if you already have the raw html handy you can pass it here to avoid a network call + * @return + */ + public Article extractContent(String urlToCrawl, String html) { + return performExtraction(urlToCrawl, html); - if (logger.isDebugEnabled()) { - logger.debug("FINAL EXTRACTION TEXT: \n" + article.getCleanedArticleText()); - } + } - if (config.isEnableImageFetching()) { - if (logger.isDebugEnabled()) { - logger.debug("\n\nFINAL EXTRACTION IMAGE: \n" + article.getTopImage().getImageSrc()); - } - } + /** + * @param urlToCrawl - The url you want to extract the text from, makes a network call + */ + public Article extractContent(String urlToCrawl) { + String html = null; + return performExtraction(urlToCrawl, html); + } - } + public Article performExtraction(String urlToCrawl, String rawHtml) { - // cleans up all the temp images that we've downloaded - releaseResources(); + urlToCrawl = getUrlToCrawl(urlToCrawl); + try { + new URL(urlToCrawl); + this.linkhash = HashUtils.md5(urlToCrawl); + } catch (MalformedURLException e) { + throw new IllegalArgumentException("Invalid URL Passed in: " + urlToCrawl, e); + } - } catch (MaxBytesException e) { - logger.error(e.toString(), e); - } catch (NotHtmlException e) { - logger.error("URL: " + urlToCrawl + " did not contain valid HTML to parse, exiting. " + e.toString()); - } catch (Exception e) { - logger.error("General Exception occured on url: " + urlToCrawl + " " + e.toString()); -// throw new RuntimeException(e); - } - - - return article; - } - - private Set extractTags(Element node) { - if (node.children().size() == 0) return NO_STRINGS; - - Elements elements = Selector.select(A_REL_TAG_SELECTOR, node); - if (elements.size() == 0) return NO_STRINGS; - - Set tags = new HashSet(elements.size()); - for (Element el : elements) { - String tag = el.text(); - if (!string.isNullOrEmpty(tag)) tags.add(tag); - } - - return tags; - } - - // used for gawker type ajax sites with pound sites - private String getUrlToCrawl(String urlToCrawl) { - String finalURL; - if (urlToCrawl.contains("#!")) { - finalURL = ESCAPED_FRAGMENT_REPLACEMENT.replaceAll(urlToCrawl); - } else { - finalURL = urlToCrawl; - } - - if (logger.isDebugEnabled()) { - logger.debug("Goose Extraction: " + finalURL); - } - - return finalURL; - } - - - // todo create a setter for this for people to override output formatter - private OutputFormatter getOutputFormatter() { - if (outputFormatter == null) { - return new DefaultOutputFormatter(); - } else { - return outputFormatter; - } - - } - - - private ImageExtractor getImageExtractor(HttpClient httpClient, String urlToCrawl) { - - if (imageExtractor == null) { - BestImageGuesser bestImageGuesser = new BestImageGuesser(this.config, httpClient, urlToCrawl); - return bestImageGuesser; - } else { - return imageExtractor; - } - - } - - /** - * todo allow for setter to override the default documentCleaner in case user wants more flexibility - * - * @return - */ - private DocumentCleaner getDocCleaner() { - if (this.documentCleaner == null) { - this.documentCleaner = new DefaultDocumentCleaner(); - } - return this.documentCleaner; - } - - /** - * attemps to grab titles from the html pages, lots of sites use different delimiters - * for titles so we'll try and do our best guess. - * - * - * @param doc - * @return - */ - private String getTitle(Document doc) { - String title = string.empty; + ParseWrapper parseWrapper = new ParseWrapper(); + Article article = null; + try { - try { + if (rawHtml == null) { + rawHtml = HtmlFetcher.getHtml(urlToCrawl); + } - Elements titleElem = doc.getElementsByTag("title"); - if (titleElem == null || titleElem.isEmpty()) return string.empty; + article = new Article(); - String titleText = titleElem.first().text(); + article.setRawHtml(rawHtml); - if (string.isNullOrEmpty(titleText)) return string.empty; + Document doc = parseWrapper.parse(rawHtml, urlToCrawl); - boolean usedDelimeter = false; + // before we cleanse, provide consumers with an opportunity to extract the publish date + article.setPublishDate(config.getPublishDateExtractor().extract(doc)); - if (titleText.contains("|")) { - titleText = doTitleSplits(titleText, PIPE_SPLITTER); - usedDelimeter = true; - } + // now allow for any additional data to be extracted + article.setAdditionalData(config.getAdditionalDataExtractor().extract(doc)); - if (!usedDelimeter && titleText.contains("-")) { - titleText = doTitleSplits(titleText, DASH_SPLITTER); - usedDelimeter = true; - } - if (!usedDelimeter && titleText.contains("»")) { - titleText = doTitleSplits(titleText, ARROWS_SPLITTER); - usedDelimeter = true; - } - - if (!usedDelimeter && titleText.contains(":")) { - titleText = doTitleSplits(titleText, COLON_SPLITTER); - } - - // encode unicode charz - title = StringEscapeUtils.escapeHtml(titleText); + // grab the text nodes of any elements + article.setTags(extractTags(doc)); - // todo this is a hack until I can fix this.. weird motely crue error with - // http://money.cnn.com/2010/10/25/news/companies/motley_crue_bp.fortune/index.htm?section=money_latest - title = MOTLEY_REPLACEMENT.replaceAll(title); - - if (logger.isDebugEnabled()) { - logger.debug("Page title is: " + title); - } - - } catch (NullPointerException e) { - logger.error(e.toString()); - } - return title; - - } - - /** - * based on a delimeter in the title take the longest piece or do some custom logic based on the site - * - * @param title - * @param splitter - * @return - */ - private String doTitleSplits(String title, StringSplitter splitter) { - int largetTextLen = 0; - int largeTextIndex = 0; - - String[] titlePieces = splitter.split(title); - - // take the largest split - for (int i = 0; i < titlePieces.length; i++) { - String current = titlePieces[i]; - if (current.length() > largetTextLen) { - largetTextLen = current.length(); - largeTextIndex = i; - } - } - - return TITLE_REPLACEMENTS.replaceAll(titlePieces[largeTextIndex]).trim(); - } - - private String getMetaContent(Document doc, String metaName) { - Elements meta = doc.select(metaName); - if (meta.size() > 0) { - String content = meta.first().attr("content"); - return string.isNullOrEmpty(content) ? string.empty : content.trim(); - } - return string.empty; - } - - - /** - * if the article has meta description set in the source, use that - */ - private String getMetaDescription(Document doc) { - return getMetaContent(doc, "meta[name=description]"); - } - - /** - * if the article has meta keywords set in the source, use that - */ - private String getMetaKeywords(Document doc) { - return getMetaContent(doc, "meta[name=keywords]"); - } - - /** - * if the article has meta canonical link set in the url - */ - private String getCanonicalLink(Document doc, String baseUrl) { - Elements meta = doc.select("link[rel=canonical]"); - if (meta.size() > 0) { - String href = meta.first().attr("href"); - return string.isNullOrEmpty(href) ? string.empty : href.trim(); - } else { - return baseUrl; - } + // now perform a nice deep cleansing + DocumentCleaner documentCleaner = getDocCleaner(); + + // reparse the document to tidy up any cleansing artifacts + doc = parseWrapper.parse(documentCleaner.clean(doc).outerHtml(), urlToCrawl); + + article.setTitle(getTitle(doc)); + article.setMetaDescription(getMetaDescription(doc)); + article.setMetaKeywords(getMetaKeywords(doc)); + article.setCanonicalLink(getCanonicalLink(doc, urlToCrawl)); + article.setDomain(article.getCanonicalLink()); + + // extract the content of the article + article.setTopNode(calculateBestNodeBasedOnClustering(doc)); + + if (article.getTopNode() != null) { + + // extract any movie embeds out from our main article content + article.setMovies(extractVideos(article.getTopNode())); + + if (config.isEnableImageFetching()) { + HttpClient httpClient = HtmlFetcher.getHttpClient(); + imageExtractor = getImageExtractor(httpClient, urlToCrawl); + article.setTopImage(imageExtractor.getBestImage(doc, article.getTopNode())); + + } + + // grab siblings and remove high link density elements + cleanupNode(article.getTopNode()); + + outputFormatter = getOutputFormatter(); + + article.setCleanedArticleText(outputFormatter.getFormattedText(article.getTopNode())); + + if (logger.isDebugEnabled()) { + logger.debug("FINAL EXTRACTION TEXT: \n" + article.getCleanedArticleText()); + } + + if (config.isEnableImageFetching()) { + if (logger.isDebugEnabled()) { + logger.debug("\n\nFINAL EXTRACTION IMAGE: \n" + article.getTopImage().getImageSrc()); + } + } + + } + + // cleans up all the temp images that we've downloaded + releaseResources(); + + } catch (MaxBytesException e) { + logger.error(e.toString(), e); + } catch (NotHtmlException e) { + logger.error("URL: " + urlToCrawl + " did not contain valid HTML to parse, exiting. " + e.toString()); + } catch (Exception e) { + logger.error("General Exception occured on url: " + urlToCrawl + " " + e.toString()); +// throw new RuntimeException(e); + } + + return article; + } + + private Set extractTags(Element node) { + if (node.children().size() == 0) { + return NO_STRINGS; + } + + Elements elements = Selector.select(A_REL_TAG_SELECTOR, node); + if (elements.size() == 0) { + return NO_STRINGS; + } + + Set tags = new HashSet(elements.size()); + for (Element el : elements) { + String tag = el.text(); + if (!string.isNullOrEmpty(tag)) { + tags.add(tag); + } + } + + return tags; + } + + // used for gawker type ajax sites with pound sites + private String getUrlToCrawl(String urlToCrawl) { + String finalURL; + if (urlToCrawl.contains("#!")) { + finalURL = ESCAPED_FRAGMENT_REPLACEMENT.replaceAll(urlToCrawl); + } else { + finalURL = urlToCrawl; + } + + if (logger.isDebugEnabled()) { + logger.debug("Goose Extraction: " + finalURL); + } + + return finalURL; + } + + // todo create a setter for this for people to override output formatter + private OutputFormatter getOutputFormatter() { + if (outputFormatter == null) { + return new DefaultOutputFormatter(); + } else { + return outputFormatter; + } + + } + + private ImageExtractor getImageExtractor(HttpClient httpClient, String urlToCrawl) { + + if (imageExtractor == null) { + BestImageGuesser bestImageGuesser = new BestImageGuesser(this.config, httpClient, urlToCrawl); + return bestImageGuesser; + } else { + return imageExtractor; + } + + } + + /** + * todo allow for setter to override the default documentCleaner in case user wants more flexibility + * + * @return + */ + private DocumentCleaner getDocCleaner() { + if (this.documentCleaner == null) { + this.documentCleaner = new DefaultDocumentCleaner(); + } + return this.documentCleaner; + } + + /** + * attemps to grab titles from the html pages, lots of sites use different delimiters + * for titles so we'll try and do our best guess. + * + * @param doc + * @return + */ + private String getTitle(Document doc) { + String title = string.empty; + + try { + + Elements titleElem = doc.getElementsByTag("title"); + if (titleElem == null || titleElem.isEmpty()) { + return string.empty; + } + + String titleText = titleElem.first().text(); + + if (string.isNullOrEmpty(titleText)) { + return string.empty; + } + + boolean usedDelimeter = false; + + if (titleText.contains("|")) { + titleText = doTitleSplits(titleText, PIPE_SPLITTER); + usedDelimeter = true; + } + + if (!usedDelimeter && titleText.contains("-")) { + titleText = doTitleSplits(titleText, DASH_SPLITTER); + usedDelimeter = true; + } + if (!usedDelimeter && titleText.contains("»")) { + titleText = doTitleSplits(titleText, ARROWS_SPLITTER); + usedDelimeter = true; + } + + if (!usedDelimeter && titleText.contains(":")) { + titleText = doTitleSplits(titleText, COLON_SPLITTER); + } + + // encode unicode charz + title = StringEscapeUtils.escapeHtml(titleText); + + // todo this is a hack until I can fix this.. weird motely crue error with + // http://money.cnn.com/2010/10/25/news/companies/motley_crue_bp.fortune/index.htm?section=money_latest + title = MOTLEY_REPLACEMENT.replaceAll(title); + + if (logger.isDebugEnabled()) { + logger.debug("Page title is: " + title); + } + + } catch (NullPointerException e) { + logger.error(e.toString()); + } + return title; + + } + + /** + * based on a delimeter in the title take the longest piece or do some custom logic based on the site + * + * @param title + * @param splitter + * @return + */ + private String doTitleSplits(String title, StringSplitter splitter) { + int largetTextLen = 0; + int largeTextIndex = 0; + + String[] titlePieces = splitter.split(title); + + // take the largest split + for (int i = 0; i < titlePieces.length; i++) { + String current = titlePieces[i]; + if (current.length() > largetTextLen) { + largetTextLen = current.length(); + largeTextIndex = i; + } + } + + return TITLE_REPLACEMENTS.replaceAll(titlePieces[largeTextIndex]).trim(); + } + + private String getMetaContent(Document doc, String metaName) { + Elements meta = doc.select(metaName); + if (meta.size() > 0) { + String content = meta.first().attr("content"); + return string.isNullOrEmpty(content) ? string.empty : content.trim(); + } + return string.empty; + } + + /** + * if the article has meta description set in the source, use that + */ + private String getMetaDescription(Document doc) { + return getMetaContent(doc, "meta[name=description]"); + } + + /** + * if the article has meta keywords set in the source, use that + */ + private String getMetaKeywords(Document doc) { + return getMetaContent(doc, "meta[name=keywords]"); + } + + /** + * if the article has meta canonical link set in the url + */ + private String getCanonicalLink(Document doc, String baseUrl) { + Elements meta = doc.select("link[rel=canonical]"); + if (meta.size() > 0) { + String href = meta.first().attr("href"); + return string.isNullOrEmpty(href) ? string.empty : href.trim(); + } else { + return baseUrl; + } /* Not sure what this is for // set domain based on canonicalUrl @@ -435,619 +438,599 @@ private String getCanonicalLink(Document doc, String baseUrl) { } catch (MalformedURLException e) { logger.error(e.toString(), e); }*/ - } - - private String getDomain(String canonicalLink) { - try { - return new URL(canonicalLink).getHost(); - } catch (MalformedURLException e) { - throw new RuntimeException(e); - } - } - - /** - * we're going to start looking for where the clusters of paragraphs are. We'll score a cluster based on the number of stopwords - * and the number of consecutive paragraphs together, which should form the cluster of text that this node is around - * also store on how high up the paragraphs are, comments are usually at the bottom and should get a lower score - * - * @return - */ - private Element calculateBestNodeBasedOnClustering(Document doc) { - Element topNode = null; - - // grab all the paragraph elements on the page to start to inspect the likely hood of them being good peeps - ArrayList nodesToCheck = getNodesToCheck(doc); - - double startingBoost = 1.0; - int cnt = 0; - int i = 0; - - // holds all the parents of the nodes we're checking - Set parentNodes = new HashSet(); - - - ArrayList nodesWithText = new ArrayList(); - - - for (Element node : nodesToCheck) { - - String nodeText = node.text(); - WordStats wordStats = StopWords.getStopWordCount(nodeText); - boolean highLinkDensity = isHighLinkDensity(node); - - - if (wordStats.getStopWordCount() > 2 && !highLinkDensity) { - - nodesWithText.add(node); - } - - } - - int numberOfNodes = nodesWithText.size(); - int negativeScoring = 0; // we shouldn't give more negatives than positives - // we want to give the last 20% of nodes negative scores in case they're comments - double bottomNodesForNegativeScore = (float) numberOfNodes * 0.25; - - if (logger.isDebugEnabled()) { - logger.debug("About to inspect num of nodes with text: " + numberOfNodes); - } - - for (Element node : nodesWithText) { - - // add parents and grandparents to scoring - // only add boost to the middle paragraphs, top and bottom is usually jankz city - // so basically what we're doing is giving boost scores to paragraphs that appear higher up in the dom - // and giving lower, even negative scores to those who appear lower which could be commenty stuff - - float boostScore = 0; - - if (isOkToBoost(node)) { - if (cnt >= 0) { - boostScore = (float) ((1.0 / startingBoost) * 50); - startingBoost++; - } - } - - - // check for negative node values - if (numberOfNodes > 15) { - if ((numberOfNodes - i) <= bottomNodesForNegativeScore) { - float booster = (float) bottomNodesForNegativeScore - (float) (numberOfNodes - i); - boostScore = -(float) Math.pow(booster, (float) 2); - - // we don't want to score too highly on the negative side. - float negscore = Math.abs(boostScore) + negativeScoring; - if (negscore > 40) { - boostScore = 5; - } - } - } - - if (logger.isDebugEnabled()) { - logger.debug("Location Boost Score: " + boostScore + " on interation: " + i + "' id='" + node.parent().id() + "' class='" + node.parent().attr("class")); - } - String nodeText = node.text(); - WordStats wordStats = StopWords.getStopWordCount(nodeText); - int upscore = (int) (wordStats.getStopWordCount() + boostScore); - updateScore(node.parent(), upscore); - updateScore(node.parent().parent(), upscore / 2); - updateNodeCount(node.parent(), 1); - updateNodeCount(node.parent().parent(), 1); - - if (!parentNodes.contains(node.parent())) { - parentNodes.add(node.parent()); - } - - if (!parentNodes.contains(node.parent().parent())) { - parentNodes.add(node.parent().parent()); - } - - cnt++; - i++; - } - - - // now let's find the parent node who scored the highest - - int topNodeScore = 0; - for (Element e : parentNodes) { - - if (logger.isDebugEnabled()) { - logger.debug("ParentNode: score='" + e.attr("gravityScore") + "' nodeCount='" + e.attr("gravityNodes") + "' id='" + e.id() + "' class='" + e.attr("class") + "' "); - } - //int score = Integer.parseInt(e.attr("gravityScore")) * Integer.parseInt(e.attr("gravityNodes")); - int score = getScore(e); - if (score > topNodeScore) { - topNode = e; - topNodeScore = score; - } - - if (topNode == null) { - topNode = e; - } - } - - if (logger.isDebugEnabled()) { - if (topNode == null) { - logger.debug("ARTICLE NOT ABLE TO BE EXTRACTED!, WE HAZ FAILED YOU LORD VADAR"); - } else { - String logText; - String targetText = ""; - Element topPara = topNode.getElementsByTag("p").first(); - if (topPara == null) { - topNode.text(); - } else { - topPara.text(); - } - - if (targetText.length() >= 51) { - logText = targetText.substring(0, 50); - } else { - logText = targetText; - } - logger.debug("TOPNODE TEXT: " + logText.trim()); - logger.debug("Our TOPNODE: score='" + topNode.attr("gravityScore") + "' nodeCount='" + topNode.attr("gravityNodes") + "' id='" + topNode.id() + "' class='" + topNode.attr("class") + "' "); - } - } - - - return topNode; - - - } - - /** - * returns a list of nodes we want to search on like paragraphs and tables - * - * @return - */ - private ArrayList getNodesToCheck(Document doc) { - ArrayList nodesToCheck = new ArrayList(); - - nodesToCheck.addAll(doc.getElementsByTag("p")); - nodesToCheck.addAll(doc.getElementsByTag("pre")); - nodesToCheck.addAll(doc.getElementsByTag("td")); - return nodesToCheck; - - } - - /** - * checks the density of links within a node, is there not much text and most of it contains linky shit? - * if so it's no good - * - * @param e - * @return - */ - private static boolean isHighLinkDensity(Element e) { - - Elements links = e.getElementsByTag("a"); - - if (links.size() == 0) { - return false; - } - - String text = e.text().trim(); - String[] words = SPACE_SPLITTER.split(text); - float numberOfWords = words.length; - - - // let's loop through all the links and calculate the number of words that make up the links - StringBuilder sb = new StringBuilder(); - for (Element link : links) { - sb.append(link.text()); - } - String linkText = sb.toString(); - String[] linkWords = SPACE_SPLITTER.split(linkText); - float numberOfLinkWords = linkWords.length; - - float numberOfLinks = links.size(); - - float linkDivisor = numberOfLinkWords / numberOfWords; - float score = linkDivisor * numberOfLinks; - - if (logger.isDebugEnabled()) { - String logText; - if (e.text().length() >= 51) { - logText = e.text().substring(0, 50); - } else { - logText = e.text(); - } - logger.debug("Calulated link density score as: " + score + " for node: " + logText); - } - if (score > 1) { - return true; - } - - return false; - } - - /** - * alot of times the first paragraph might be the caption under an image so we'll want to make sure if we're going to - * boost a parent node that it should be connected to other paragraphs, at least for the first n paragraphs - * so we'll want to make sure that the next sibling is a paragraph and has at least some substatial weight to it - * - * - * @param node - * @return - */ - private boolean isOkToBoost(Element node) { - - int stepsAway = 0; - - Element sibling = node.nextElementSibling(); - while (sibling != null) { - - if (sibling.tagName().equals("p")) { - if (stepsAway >= 3) { - if (logger.isDebugEnabled()) { - logger.debug("Next paragraph is too far away, not boosting"); - } - return false; - } - - String paraText = sibling.text(); - WordStats wordStats = StopWords.getStopWordCount(paraText); - if (wordStats.getStopWordCount() > 5) { - if (logger.isDebugEnabled()) { - logger.debug("We're gonna boost this node, seems contenty"); - } - return true; - } - - } - - // increase how far away the next paragraph is from this node - stepsAway++; - - sibling = sibling.nextElementSibling(); - } - - - return false; - } - - - /** - * adds a score to the gravityScore Attribute we put on divs - * we'll get the current score then add the score we're passing in to the current - * - * @param node - * @param addToScore - the score to add to the node - */ - private void updateScore(Element node, int addToScore) { - int currentScore; - try { - String scoreString = node.attr("gravityScore"); - currentScore = string.isNullOrEmpty(scoreString) ? 0 : Integer.parseInt(scoreString); - } catch (NumberFormatException e) { - currentScore = 0; - } - int newScore = currentScore + addToScore; - node.attr("gravityScore", Integer.toString(newScore)); - - } - - /** - * stores how many decent nodes are under a parent node - * - * @param node - * @param addToCount - */ - private void updateNodeCount(Element node, int addToCount) { - int currentScore; - try { - String countString = node.attr("gravityNodes"); - currentScore = string.isNullOrEmpty(countString) ? 0 : Integer.parseInt(countString); - } catch (NumberFormatException e) { - currentScore = 0; - } - int newScore = currentScore + addToCount; - node.attr("gravityNodes", Integer.toString(newScore)); - - } - - - /** - * returns the gravityScore as an integer from this node - * - * @param node - * @return - */ - private int getScore(Element node) { - if (node == null) return 0; - try { - String grvScoreString = node.attr("gravityScore"); - if (string.isNullOrEmpty(grvScoreString)) return 0; - return Integer.parseInt(grvScoreString); - } catch (NumberFormatException e) { - return 0; - } - } - - - /** - * pulls out videos we like - * - * @return - */ - private ArrayList extractVideos(Element node) { - ArrayList candidates = new ArrayList(); - ArrayList goodMovies = new ArrayList(); - try { - - - Elements embeds = node.parent().getElementsByTag("embed"); - for (Element el : embeds) { - candidates.add(el); - } - Elements objects = node.parent().getElementsByTag("object"); - for (Element el : objects) { - candidates.add(el); - } - if (logger.isDebugEnabled()) { - logger.debug("extractVideos: Starting to extract videos. Found: " + candidates.size()); - } - - for (Element el : candidates) { - - Attributes attrs = el.attributes(); - - for (Attribute a : attrs) { - try { - if (logger.isDebugEnabled()) { - logger.debug(a.getKey() + " : " + a.getValue()); - } - if ((a.getValue().contains("youtube") || a.getValue().contains("vimeo")) && a.getKey().equals("src")) { - if (logger.isDebugEnabled()) { - logger.debug("Found video... setting"); - logger.debug("This page has a video!: " + a.getValue()); - } - goodMovies.add(el); - - } - } catch (Exception e) { - logger.error(e.toString()); - e.printStackTrace(); - } - } - - } - } catch (NullPointerException e) { - logger.error(e.toString(), e); - } catch (Exception e) { - logger.error(e.toString(), e); - } - if (logger.isDebugEnabled()) { - logger.debug("extractVideos: done looking videos"); - } - return goodMovies; - } - - - /** - * remove any divs that looks like non-content, clusters of links, or paras with no gusto - * - * @param node - * @return - */ - private Element cleanupNode(Element node) { - if (logger.isDebugEnabled()) { - logger.debug("Starting cleanup Node"); - } - - node = addSiblings(node); - - Elements nodes = node.children(); - for (Element e : nodes) { - if (e.tagName().equals("p")) { - continue; - } - if (logger.isDebugEnabled()) { - logger.debug("CLEANUP NODE: " + e.id() + " class: " + e.attr("class")); - } - boolean highLinkDensity = isHighLinkDensity(e); - if (highLinkDensity) { - if (logger.isDebugEnabled()) { - logger.debug("REMOVING NODE FOR LINK DENSITY: " + e.id() + " class: " + e.attr("class")); - } - e.remove(); - continue; - } - // now check for word density - // grab all the paragraphs in the children and remove ones that are too small to matter - Elements subParagraphs = e.getElementsByTag("p"); - - - for (Element p : subParagraphs) { - if (p.text().length() < 25) { - p.remove(); - } - } - - // now that we've removed shorty paragraphs let's make sure to exclude any first paragraphs that don't have paras as - // their next siblings to avoid getting img bylines - // first let's remove any element that now doesn't have any p tags at all - Elements subParagraphs2 = e.getElementsByTag("p"); - if (subParagraphs2.size() == 0 && !e.tagName().equals("td")) { - if (logger.isDebugEnabled()) { - logger.debug("Removing node because it doesn't have any paragraphs"); - } - e.remove(); - continue; - } - - //if this node has a decent enough gravityScore we should keep it as well, might be content - int topNodeScore = getScore(node); - int currentNodeScore = getScore(e); - float thresholdScore = (float) (topNodeScore * .08); - if (logger.isDebugEnabled()) { - logger.debug("topNodeScore: " + topNodeScore + " currentNodeScore: " + currentNodeScore + " threshold: " + thresholdScore); - } - if (currentNodeScore < thresholdScore) { - if (!e.tagName().equals("td")) { - if (logger.isDebugEnabled()) { - logger.debug("Removing node due to low threshold score"); - } - e.remove(); - } else { - if (logger.isDebugEnabled()) { - logger.debug("Not removing TD node"); - } - } - - continue; - } - - } - - return node; - - } - - - /** - * adds any siblings that may have a decent score to this node - * - * @param node - * @return - */ - private Element addSiblings(Element node) { - if (logger.isDebugEnabled()) { - logger.debug("Starting to add siblings"); - } - int baselineScoreForSiblingParagraphs = getBaselineScoreForSiblings(node); - - Element currentSibling = node.previousElementSibling(); - while (currentSibling != null) { - if (logger.isDebugEnabled()) { - logger.debug("SIBLINGCHECK: " + debugNode(currentSibling)); - } - - if (currentSibling.tagName().equals("p")) { - - node.child(0).before(currentSibling.outerHtml()); - currentSibling = currentSibling.previousElementSibling(); - continue; - } - - // check for a paraph embedded in a containing element - int insertedSiblings = 0; - Elements potentialParagraphs = currentSibling.getElementsByTag("p"); - if (potentialParagraphs.first() == null) { - currentSibling = currentSibling.previousElementSibling(); - continue; - } - for (Element firstParagraph : potentialParagraphs) { - WordStats wordStats = StopWords.getStopWordCount(firstParagraph.text()); - - int paragraphScore = wordStats.getStopWordCount(); - - if ((float) (baselineScoreForSiblingParagraphs * .30) < paragraphScore) { - if (logger.isDebugEnabled()) { - logger.debug("This node looks like a good sibling, adding it"); - } - node.child(insertedSiblings).before("

" + firstParagraph.text() + "

"); - insertedSiblings++; - } - - } - - currentSibling = currentSibling.previousElementSibling(); - } - return node; - - - } - - /** - * we could have long articles that have tons of paragraphs so if we tried to calculate the base score against - * the total text score of those paragraphs it would be unfair. So we need to normalize the score based on the average scoring - * of the paragraphs within the top node. For example if our total score of 10 paragraphs was 1000 but each had an average value of - * 100 then 100 should be our base. - * - * @param topNode - * @return - */ - private int getBaselineScoreForSiblings(Element topNode) { - - int base = 100000; - - int numberOfParagraphs = 0; - int scoreOfParagraphs = 0; - - Elements nodesToCheck = topNode.getElementsByTag("p"); - - for (Element node : nodesToCheck) { - - String nodeText = node.text(); - WordStats wordStats = StopWords.getStopWordCount(nodeText); - boolean highLinkDensity = isHighLinkDensity(node); - - - if (wordStats.getStopWordCount() > 2 && !highLinkDensity) { - - numberOfParagraphs++; - scoreOfParagraphs += wordStats.getStopWordCount(); - } - - } - - if (numberOfParagraphs > 0) { - base = scoreOfParagraphs / numberOfParagraphs; - if (logger.isDebugEnabled()) { - logger.debug("The base score for siblings to beat is: " + base + " NumOfParas: " + numberOfParagraphs + " scoreOfAll: " + scoreOfParagraphs); - } - } - - return base; - - - } - - private String debugNode(Element e) { - - StringBuilder sb = new StringBuilder(); - sb.append("GravityScore: '"); - sb.append(e.attr("gravityScore")); - sb.append("' paraNodeCount: '"); - sb.append(e.attr("gravityNodes")); - sb.append("' nodeId: '"); - sb.append(e.id()); - sb.append("' className: '"); - sb.append(e.attr("class")); - return sb.toString(); - - } - - /** - * cleans up any temp shit we have laying around like temp images - * removes any image in the temp dir that starts with the linkhash of the url we just parsed - */ - public void releaseResources() { - if (logger.isDebugEnabled()) { - logger.debug("STARTING TO RELEASE ALL RESOURCES"); - } - File dir = new File(config.getLocalStoragePath()); - String[] children = dir.list(); - - if (children == null) { - logger.debug("No Temp images found for linkhash: " + this.linkhash); - } else { - for (int i = 0; i < children.length; i++) { - // Get filename of file or directory - String filename = children[i]; - - if (filename.startsWith(this.linkhash)) { - - File f = new File(dir.getAbsolutePath() + "/" + filename); - if (!f.delete()) { - logger.error("Unable to remove temp file: " + filename); - } - } - } - } - - } - - + } + + private String getDomain(String canonicalLink) { + try { + return new URL(canonicalLink).getHost(); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + } + + /** + * we're going to start looking for where the clusters of paragraphs are. We'll score a cluster based on the number of stopwords + * and the number of consecutive paragraphs together, which should form the cluster of text that this node is around + * also store on how high up the paragraphs are, comments are usually at the bottom and should get a lower score + * + * @return + */ + private Element calculateBestNodeBasedOnClustering(Document doc) { + Element topNode = null; + + // grab all the paragraph elements on the page to start to inspect the likely hood of them being good peeps + ArrayList nodesToCheck = getNodesToCheck(doc); + + double startingBoost = 1.0; + int cnt = 0; + int i = 0; + + // holds all the parents of the nodes we're checking + Set parentNodes = new HashSet(); + + ArrayList nodesWithText = new ArrayList(); + + for (Element node : nodesToCheck) { + + String nodeText = node.text(); + WordStats wordStats = StopWords.getStopWordCount(nodeText); + boolean highLinkDensity = isHighLinkDensity(node); + + if (wordStats.getStopWordCount() > 2 && !highLinkDensity) { + + nodesWithText.add(node); + } + + } + + int numberOfNodes = nodesWithText.size(); + int negativeScoring = 0; // we shouldn't give more negatives than positives + // we want to give the last 20% of nodes negative scores in case they're comments + double bottomNodesForNegativeScore = (float) numberOfNodes * 0.25; + + if (logger.isDebugEnabled()) { + logger.debug("About to inspect num of nodes with text: " + numberOfNodes); + } + + for (Element node : nodesWithText) { + + // add parents and grandparents to scoring + // only add boost to the middle paragraphs, top and bottom is usually jankz city + // so basically what we're doing is giving boost scores to paragraphs that appear higher up in the dom + // and giving lower, even negative scores to those who appear lower which could be commenty stuff + + float boostScore = 0; + + if (isOkToBoost(node)) { + if (cnt >= 0) { + boostScore = (float) ((1.0 / startingBoost) * 50); + startingBoost++; + } + } + + // check for negative node values + if (numberOfNodes > 15) { + if ((numberOfNodes - i) <= bottomNodesForNegativeScore) { + float booster = (float) bottomNodesForNegativeScore - (float) (numberOfNodes - i); + boostScore = -(float) Math.pow(booster, (float) 2); + + // we don't want to score too highly on the negative side. + float negscore = Math.abs(boostScore) + negativeScoring; + if (negscore > 40) { + boostScore = 5; + } + } + } + + if (logger.isDebugEnabled()) { + logger.debug("Location Boost Score: " + boostScore + " on interation: " + i + "' id='" + node.parent().id() + "' class='" + node.parent().attr("class")); + } + String nodeText = node.text(); + WordStats wordStats = StopWords.getStopWordCount(nodeText); + int upscore = (int) (wordStats.getStopWordCount() + boostScore); + updateScore(node.parent(), upscore); + updateScore(node.parent().parent(), upscore / 2); + updateNodeCount(node.parent(), 1); + updateNodeCount(node.parent().parent(), 1); + + if (!parentNodes.contains(node.parent())) { + parentNodes.add(node.parent()); + } + + if (!parentNodes.contains(node.parent().parent())) { + parentNodes.add(node.parent().parent()); + } + + cnt++; + i++; + } + + // now let's find the parent node who scored the highest + + int topNodeScore = 0; + for (Element e : parentNodes) { + + if (logger.isDebugEnabled()) { + logger.debug("ParentNode: score='" + e.attr("gravityScore") + "' nodeCount='" + e.attr("gravityNodes") + "' id='" + e.id() + "' class='" + e.attr("class") + "' "); + } + //int score = Integer.parseInt(e.attr("gravityScore")) * Integer.parseInt(e.attr("gravityNodes")); + int score = getScore(e); + if (score > topNodeScore) { + topNode = e; + topNodeScore = score; + } + + if (topNode == null) { + topNode = e; + } + } + + if (logger.isDebugEnabled()) { + if (topNode == null) { + logger.debug("ARTICLE NOT ABLE TO BE EXTRACTED!, WE HAZ FAILED YOU LORD VADAR"); + } else { + String logText; + String targetText = ""; + Element topPara = topNode.getElementsByTag("p").first(); + if (topPara == null) { + topNode.text(); + } else { + topPara.text(); + } + + if (targetText.length() >= 51) { + logText = targetText.substring(0, 50); + } else { + logText = targetText; + } + logger.debug("TOPNODE TEXT: " + logText.trim()); + logger.debug("Our TOPNODE: score='" + topNode.attr("gravityScore") + "' nodeCount='" + topNode.attr("gravityNodes") + "' id='" + topNode.id() + "' class='" + topNode.attr("class") + "' "); + } + } + + return topNode; + + } + + /** + * returns a list of nodes we want to search on like paragraphs and tables + * + * @return + */ + private ArrayList getNodesToCheck(Document doc) { + ArrayList nodesToCheck = new ArrayList(); + + nodesToCheck.addAll(doc.getElementsByTag("p")); + nodesToCheck.addAll(doc.getElementsByTag("pre")); + nodesToCheck.addAll(doc.getElementsByTag("td")); + return nodesToCheck; + + } + + /** + * checks the density of links within a node, is there not much text and most of it contains linky shit? + * if so it's no good + * + * @param e + * @return + */ + private static boolean isHighLinkDensity(Element e) { + + Elements links = e.getElementsByTag("a"); + + if (links.size() == 0) { + return false; + } + + String text = e.text().trim(); + String[] words = SPACE_SPLITTER.split(text); + float numberOfWords = words.length; + + // let's loop through all the links and calculate the number of words that make up the links + StringBuilder sb = new StringBuilder(); + for (Element link : links) { + sb.append(link.text()); + } + String linkText = sb.toString(); + String[] linkWords = SPACE_SPLITTER.split(linkText); + float numberOfLinkWords = linkWords.length; + + float numberOfLinks = links.size(); + + float linkDivisor = numberOfLinkWords / numberOfWords; + float score = linkDivisor * numberOfLinks; + + if (logger.isDebugEnabled()) { + String logText; + if (e.text().length() >= 51) { + logText = e.text().substring(0, 50); + } else { + logText = e.text(); + } + logger.debug("Calulated link density score as: " + score + " for node: " + logText); + } + if (score > 1) { + return true; + } + + return false; + } + + /** + * alot of times the first paragraph might be the caption under an image so we'll want to make sure if we're going to + * boost a parent node that it should be connected to other paragraphs, at least for the first n paragraphs + * so we'll want to make sure that the next sibling is a paragraph and has at least some substatial weight to it + * + * @param node + * @return + */ + private boolean isOkToBoost(Element node) { + + int stepsAway = 0; + + Element sibling = node.nextElementSibling(); + while (sibling != null) { + + if (sibling.tagName().equals("p")) { + if (stepsAway >= 3) { + if (logger.isDebugEnabled()) { + logger.debug("Next paragraph is too far away, not boosting"); + } + return false; + } + + String paraText = sibling.text(); + WordStats wordStats = StopWords.getStopWordCount(paraText); + if (wordStats.getStopWordCount() > 5) { + if (logger.isDebugEnabled()) { + logger.debug("We're gonna boost this node, seems contenty"); + } + return true; + } + + } + + // increase how far away the next paragraph is from this node + stepsAway++; + + sibling = sibling.nextElementSibling(); + } + + return false; + } + + /** + * adds a score to the gravityScore Attribute we put on divs + * we'll get the current score then add the score we're passing in to the current + * + * @param node + * @param addToScore - the score to add to the node + */ + private void updateScore(Element node, int addToScore) { + int currentScore; + try { + String scoreString = node.attr("gravityScore"); + currentScore = string.isNullOrEmpty(scoreString) ? 0 : Integer.parseInt(scoreString); + } catch (NumberFormatException e) { + currentScore = 0; + } + int newScore = currentScore + addToScore; + node.attr("gravityScore", Integer.toString(newScore)); + + } + + /** + * stores how many decent nodes are under a parent node + * + * @param node + * @param addToCount + */ + private void updateNodeCount(Element node, int addToCount) { + int currentScore; + try { + String countString = node.attr("gravityNodes"); + currentScore = string.isNullOrEmpty(countString) ? 0 : Integer.parseInt(countString); + } catch (NumberFormatException e) { + currentScore = 0; + } + int newScore = currentScore + addToCount; + node.attr("gravityNodes", Integer.toString(newScore)); + + } + + /** + * returns the gravityScore as an integer from this node + * + * @param node + * @return + */ + private int getScore(Element node) { + if (node == null) { + return 0; + } + try { + String grvScoreString = node.attr("gravityScore"); + if (string.isNullOrEmpty(grvScoreString)) { + return 0; + } + return Integer.parseInt(grvScoreString); + } catch (NumberFormatException e) { + return 0; + } + } + + /** + * pulls out videos we like + * + * @return + */ + private ArrayList extractVideos(Element node) { + ArrayList candidates = new ArrayList(); + ArrayList goodMovies = new ArrayList(); + try { + + Elements embeds = node.parent().getElementsByTag("embed"); + for (Element el : embeds) { + candidates.add(el); + } + Elements objects = node.parent().getElementsByTag("object"); + for (Element el : objects) { + candidates.add(el); + } + if (logger.isDebugEnabled()) { + logger.debug("extractVideos: Starting to extract videos. Found: " + candidates.size()); + } + + for (Element el : candidates) { + + Attributes attrs = el.attributes(); + + for (Attribute a : attrs) { + try { + if (logger.isDebugEnabled()) { + logger.debug(a.getKey() + " : " + a.getValue()); + } + if ((a.getValue().contains("youtube") || a.getValue().contains("vimeo")) && a.getKey().equals("src")) { + if (logger.isDebugEnabled()) { + logger.debug("Found video... setting"); + logger.debug("This page has a video!: " + a.getValue()); + } + goodMovies.add(el); + + } + } catch (Exception e) { + logger.error(e.toString()); + e.printStackTrace(); + } + } + + } + } catch (NullPointerException e) { + logger.error(e.toString(), e); + } catch (Exception e) { + logger.error(e.toString(), e); + } + if (logger.isDebugEnabled()) { + logger.debug("extractVideos: done looking videos"); + } + return goodMovies; + } + + /** + * remove any divs that looks like non-content, clusters of links, or paras with no gusto + * + * @param node + * @return + */ + private Element cleanupNode(Element node) { + if (logger.isDebugEnabled()) { + logger.debug("Starting cleanup Node"); + } + + node = addSiblings(node); + + Elements nodes = node.children(); + for (Element e : nodes) { + if (e.tagName().equals("p")) { + continue; + } + if (logger.isDebugEnabled()) { + logger.debug("CLEANUP NODE: " + e.id() + " class: " + e.attr("class")); + } + boolean highLinkDensity = isHighLinkDensity(e); + if (highLinkDensity) { + if (logger.isDebugEnabled()) { + logger.debug("REMOVING NODE FOR LINK DENSITY: " + e.id() + " class: " + e.attr("class")); + } + e.remove(); + continue; + } + // now check for word density + // grab all the paragraphs in the children and remove ones that are too small to matter + Elements subParagraphs = e.getElementsByTag("p"); + + for (Element p : subParagraphs) { + if (p.text().length() < 25) { + p.remove(); + } + } + + // now that we've removed shorty paragraphs let's make sure to exclude any first paragraphs that don't have paras as + // their next siblings to avoid getting img bylines + // first let's remove any element that now doesn't have any p tags at all + Elements subParagraphs2 = e.getElementsByTag("p"); + if (subParagraphs2.size() == 0 && !e.tagName().equals("td")) { + if (logger.isDebugEnabled()) { + logger.debug("Removing node because it doesn't have any paragraphs"); + } + e.remove(); + continue; + } + + //if this node has a decent enough gravityScore we should keep it as well, might be content + int topNodeScore = getScore(node); + int currentNodeScore = getScore(e); + float thresholdScore = (float) (topNodeScore * .08); + if (logger.isDebugEnabled()) { + logger.debug("topNodeScore: " + topNodeScore + " currentNodeScore: " + currentNodeScore + " threshold: " + thresholdScore); + } + if (currentNodeScore < thresholdScore) { + if (!e.tagName().equals("td")) { + if (logger.isDebugEnabled()) { + logger.debug("Removing node due to low threshold score"); + } + e.remove(); + } else { + if (logger.isDebugEnabled()) { + logger.debug("Not removing TD node"); + } + } + + continue; + } + + } + + return node; + + } + + /** + * adds any siblings that may have a decent score to this node + * + * @param node + * @return + */ + private Element addSiblings(Element node) { + if (logger.isDebugEnabled()) { + logger.debug("Starting to add siblings"); + } + int baselineScoreForSiblingParagraphs = getBaselineScoreForSiblings(node); + + Element currentSibling = node.previousElementSibling(); + while (currentSibling != null) { + if (logger.isDebugEnabled()) { + logger.debug("SIBLINGCHECK: " + debugNode(currentSibling)); + } + + if (currentSibling.tagName().equals("p")) { + + node.child(0).before(currentSibling.outerHtml()); + currentSibling = currentSibling.previousElementSibling(); + continue; + } + + // check for a paraph embedded in a containing element + int insertedSiblings = 0; + Elements potentialParagraphs = currentSibling.getElementsByTag("p"); + if (potentialParagraphs.first() == null) { + currentSibling = currentSibling.previousElementSibling(); + continue; + } + for (Element firstParagraph : potentialParagraphs) { + WordStats wordStats = StopWords.getStopWordCount(firstParagraph.text()); + + int paragraphScore = wordStats.getStopWordCount(); + + if ((float) (baselineScoreForSiblingParagraphs * .30) < paragraphScore) { + if (logger.isDebugEnabled()) { + logger.debug("This node looks like a good sibling, adding it"); + } + node.child(insertedSiblings).before("

" + firstParagraph.text() + "

"); + insertedSiblings++; + } + + } + + currentSibling = currentSibling.previousElementSibling(); + } + return node; + + } + + /** + * we could have long articles that have tons of paragraphs so if we tried to calculate the base score against + * the total text score of those paragraphs it would be unfair. So we need to normalize the score based on the average scoring + * of the paragraphs within the top node. For example if our total score of 10 paragraphs was 1000 but each had an average value of + * 100 then 100 should be our base. + * + * @param topNode + * @return + */ + private int getBaselineScoreForSiblings(Element topNode) { + + int base = 100000; + + int numberOfParagraphs = 0; + int scoreOfParagraphs = 0; + + Elements nodesToCheck = topNode.getElementsByTag("p"); + + for (Element node : nodesToCheck) { + + String nodeText = node.text(); + WordStats wordStats = StopWords.getStopWordCount(nodeText); + boolean highLinkDensity = isHighLinkDensity(node); + + if (wordStats.getStopWordCount() > 2 && !highLinkDensity) { + + numberOfParagraphs++; + scoreOfParagraphs += wordStats.getStopWordCount(); + } + } + + if (numberOfParagraphs > 0) { + base = scoreOfParagraphs / numberOfParagraphs; + if (logger.isDebugEnabled()) { + logger.debug("The base score for siblings to beat is: " + base + " NumOfParas: " + numberOfParagraphs + " scoreOfAll: " + scoreOfParagraphs); + } + } + + return base; + } + + private String debugNode(Element e) { + + StringBuilder sb = new StringBuilder(); + sb.append("GravityScore: '"); + sb.append(e.attr("gravityScore")); + sb.append("' paraNodeCount: '"); + sb.append(e.attr("gravityNodes")); + sb.append("' nodeId: '"); + sb.append(e.id()); + sb.append("' className: '"); + sb.append(e.attr("class")); + return sb.toString(); + + } + + /** + * cleans up any temp shit we have laying around like temp images + * removes any image in the temp dir that starts with the linkhash of the url we just parsed + */ + public void releaseResources() { + if (logger.isDebugEnabled()) { + logger.debug("STARTING TO RELEASE ALL RESOURCES"); + } + File dir = new File(config.getLocalStoragePath()); + String[] children = dir.list(); + + if (children == null) { + logger.debug("No Temp images found for linkhash: " + this.linkhash); + } else { + for (int i = 0; i < children.length; i++) { + // Get filename of file or directory + String filename = children[i]; + + if (filename.startsWith(this.linkhash)) { + + File f = new File(dir.getAbsolutePath() + "/" + filename); + if (!f.delete()) { + logger.error("Unable to remove temp file: " + filename); + } + } + } + } + + } } diff --git a/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java b/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java index 06c768bb2..3d40c4dd5 100644 --- a/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java +++ b/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java @@ -15,7 +15,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - package com.jimplush.goose.cleaners; import com.jimplush.goose.texthelpers.ReplaceSequence; @@ -43,334 +42,329 @@ public class DefaultDocumentCleaner implements DocumentCleaner { - private static final Logger logger = LoggerFactory.getLogger(DefaultDocumentCleaner.class); - - /** - * this regex is used to remove undesirable nodes from our doc - * indicate that something maybe isn't content but more of a comment, footer or some other undesirable node - */ - private static final String regExRemoveNodes; - private static final String queryNaughtyIDs; - private static final String queryNaughtyClasses; - private static final String queryNaughtyNames; - - /** - * regex to detect if there are block level elements inside of a div element - */ - private static final Pattern divToPElementsPattern = Pattern.compile("<(a|blockquote|dl|div|img|ol|p|pre|table|ul)"); - - private static final ReplaceSequence tabsAndNewLinesReplcesments; - private static final Pattern captionPattern = Pattern.compile("^caption$"); - private static final Pattern googlePattern = Pattern.compile(" google "); - private static final Pattern entriesPattern = Pattern.compile("^[^entry-]more.*$"); - private static final Pattern facebookPattern = Pattern.compile("[^-]facebook"); - private static final Pattern twitterPattern = Pattern.compile("[^-]twitter"); - - static { - - StringBuilder sb = new StringBuilder(); - // create negative elements - sb.append("^side$|combx|retweet|menucontainer|navbar|comment|PopularQuestions|contact|foot|footer|Footer|footnote|cnn_strycaptiontxt|links|meta$|scroll|shoutbox|sponsor"); - sb.append("|tags|socialnetworking|socialNetworking|cnnStryHghLght|cnn_stryspcvbx|^inset$|pagetools|post-attributes|welcome_form|contentTools2|the_answers"); - sb.append("|communitypromo|subscribe|vcard|articleheadings|date|print|popup|author-dropdown|tools|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text"); - regExRemoveNodes = sb.toString(); - queryNaughtyIDs = "[id~=(" + regExRemoveNodes + ")]"; - queryNaughtyClasses = "[class~=(" + regExRemoveNodes + ")]"; - queryNaughtyNames = "[name~=(" + regExRemoveNodes + ")]"; - - tabsAndNewLinesReplcesments = ReplaceSequence.create("\n", "\n\n").append("\t").append("^\\s+$"); - } - - - public Document clean(Document doc) { - - if (logger.isDebugEnabled()) { - logger.debug("Starting cleaning phase with DefaultDocumentCleaner"); - } - Document docToClean = doc; - docToClean = cleanEmTags(docToClean); - docToClean = removeDropCaps(docToClean); - docToClean = removeScriptsAndStyles(docToClean); - docToClean = cleanBadTags(docToClean); - docToClean = removeNodesViaRegEx(docToClean, captionPattern); - docToClean = removeNodesViaRegEx(docToClean, googlePattern); - docToClean = removeNodesViaRegEx(docToClean, entriesPattern); - - // remove twitter and facebook nodes, mashable has f'd up class names for this - docToClean = removeNodesViaRegEx(docToClean, facebookPattern); - docToClean = removeNodesViaRegEx(docToClean, twitterPattern); - - // turn any divs that aren't used as true layout items with block level elements inside them into paragraph tags - docToClean = convertDivsToParagraphs(docToClean, "div"); - docToClean = convertDivsToParagraphs(docToClean, "span"); - - - return docToClean; - } - - private Document convertDivsToParagraphs(Document doc, String domType) { - - if (logger.isDebugEnabled()) { - logger.debug("Starting to replace bad divs..."); - } - int badDivs = 0; - int convertedTextNodes = 0; - Elements divs = doc.getElementsByTag(domType); - for (Element div : divs) { - - try { - - Matcher divToPElementsMatcher = divToPElementsPattern.matcher(div.html().toLowerCase()); - if (divToPElementsMatcher.find() == false) { - Document newDoc = new Document(doc.baseUri()); - Element newNode = newDoc.createElement("p"); - - newNode.append(div.html()); - div.replaceWith(newNode); - badDivs++; - - } else { - // Try to convert any div with just text inside it to a paragraph so it can be counted as text, otherwise it would be ignored - // example

This is some text in a div
should be

this is some text in a div

- //db(div.childNodes().size() + " childnodes"); - - //create a master text node to hold all the child node texts so that links that were replaced with text notes - //don't become their own paragraphs - - StringBuilder replacementText = new StringBuilder(); - - ArrayList nodesToRemove = new ArrayList(); + private static final Logger logger = LoggerFactory.getLogger(DefaultDocumentCleaner.class); - //cleanTags(div); + /** + * this regex is used to remove undesirable nodes from our doc + * indicate that something maybe isn't content but more of a comment, footer or some other undesirable node + */ + private static final String regExRemoveNodes; + private static final String queryNaughtyIDs; + private static final String queryNaughtyClasses; + private static final String queryNaughtyNames; + /** + * regex to detect if there are block level elements inside of a div element + */ + private static final Pattern divToPElementsPattern = Pattern.compile("<(a|blockquote|dl|div|img|ol|p|pre|table|ul)"); + private static final Pattern ignoreSpanToPConversionPattern = Pattern.compile("p|td"); - for (Node kid : div.childNodes()) { + private static final ReplaceSequence tabsAndNewLinesReplcesments; + private static final Pattern captionPattern = Pattern.compile("^caption$"); + private static final Pattern googlePattern = Pattern.compile(" google "); + private static final Pattern entriesPattern = Pattern.compile("^[^entry-]more.*$"); + private static final Pattern facebookPattern = Pattern.compile("[^-]facebook"); + private static final Pattern twitterPattern = Pattern.compile("[^-]twitter"); - if (kid.nodeName().equals("#text")) { + static { - TextNode txtNode = (TextNode) kid; - String text = txtNode.attr("text"); - if (string.isNullOrEmpty(text)) continue; - - //clean up text from tabs and newlines - text = tabsAndNewLinesReplcesments.replaceAll(text); + StringBuilder sb = new StringBuilder(); + // create negative elements + sb.append("^side$|combx|retweet|menucontainer|navbar|comment|PopularQuestions|contact|foot|footer|Footer|footnote|cnn_strycaptiontxt|links|meta$|scroll|shoutbox|sponsor"); + sb.append("|tags|socialnetworking|socialNetworking|cnnStryHghLght|cnn_stryspcvbx|^inset$|pagetools|post-attributes|welcome_form|contentTools2|the_answers"); + sb.append("|communitypromo|subscribe|vcard|articleheadings|date|print|popup|author-dropdown|tools|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text"); + regExRemoveNodes = sb.toString(); - if (text.length() > 1) { + queryNaughtyIDs = "[id~=(" + regExRemoveNodes + ")]"; + queryNaughtyClasses = "[class~=(" + regExRemoveNodes + ")]"; + queryNaughtyNames = "[name~=(" + regExRemoveNodes + ")]"; - // check for siblings that might be links that we want to include in our new node - Node previousSib = kid.previousSibling(); + tabsAndNewLinesReplcesments = ReplaceSequence.create("\n", "\n\n").append("\t").append("^\\s+$"); + } - if (logger.isDebugEnabled()) { - logger.debug("PARENT CLASS: " + div.className() + " NODENAME: " + kid.nodeName()); - logger.debug("TEXTREPLACE: '" + text.replace("\n", "").replace("
", "") + "'"); - } + public Document clean(Document doc) { - if (previousSib != null) { - if (previousSib.nodeName().equals("a")) { - replacementText.append(previousSib.outerHtml()); - if (logger.isDebugEnabled()) { - logger.debug("SIBLING NODENAME ADDITION: " + previousSib.nodeName() + " TEXT: " + previousSib.outerHtml()); - } - } - } + if (logger.isDebugEnabled()) { + logger.debug("Starting cleaning phase with DefaultDocumentCleaner"); + } + Document docToClean = doc; + docToClean = cleanEmTags(docToClean); + docToClean = removeDropCaps(docToClean); + docToClean = removeScriptsAndStyles(docToClean); + docToClean = cleanBadTags(docToClean); + docToClean = removeNodesViaRegEx(docToClean, captionPattern); + docToClean = removeNodesViaRegEx(docToClean, googlePattern); + docToClean = removeNodesViaRegEx(docToClean, entriesPattern); - replacementText.append(text); - nodesToRemove.add(kid); + // remove twitter and facebook nodes, mashable has f'd up class names for this + docToClean = removeNodesViaRegEx(docToClean, facebookPattern); + docToClean = removeNodesViaRegEx(docToClean, twitterPattern); - convertedTextNodes++; - } + // turn any divs that aren't used as true layout items with block level elements inside them into paragraph tags + docToClean = convertDivsToParagraphs(docToClean, "div"); + docToClean = convertDivsToParagraphs(docToClean, "span"); - } + return docToClean; + } - } + private Document convertDivsToParagraphs(Document doc, String domType) { - // replace div's text with the new master replacement text node that containts the sum of all the little text nodes - //div.appendChild(replacementTextNode); + if (logger.isDebugEnabled()) { + logger.debug("Starting to replace bad divs..."); + } + int badDivs = 0; + int convertedTextNodes = 0; + Elements divs = doc.getElementsByTag(domType); + for (Element div : divs) { - Document newDoc = new Document(doc.baseUri()); - Element newPara = newDoc.createElement("p"); - newPara.html(replacementText.toString()); + try { + if (div.nodeName().equals("span") && ignoreSpanToPConversionPattern.matcher(div.parent().nodeName()).find()) { + continue; + } - div.childNode(0).before(newPara.outerHtml()); + Matcher divToPElementsMatcher = divToPElementsPattern.matcher(div.html().toLowerCase()); + if (divToPElementsMatcher.find() == false) { - newDoc = null; + Document newDoc = new Document(doc.baseUri()); + Element newNode = newDoc.createElement("p"); + newNode.append(div.html()); + div.replaceWith(newNode); + badDivs++; - for (Node n : nodesToRemove) { - n.remove(); - } + } else { + // Try to convert any div with just text inside it to a paragraph so it can be counted as text, otherwise it would be ignored + // example
This is some text in a div
should be

this is some text in a div

+ //db(div.childNodes().size() + " childnodes"); + //create a master text node to hold all the child node texts so that links that were replaced with text notes + //don't become their own paragraphs - } - } catch (NullPointerException e) { - logger.error(e.toString()); - } + StringBuilder replacementText = new StringBuilder(); - } - - if (logger.isDebugEnabled()) { - logger.debug("Found " + divs.size() + " total divs with " + badDivs + " bad divs replaced and " + convertedTextNodes + " textnodes converted inside divs"); - } - - - - - return doc; - } - - private Document removeScriptsAndStyles(Document doc) { - - if (logger.isDebugEnabled()) { - logger.debug("Starting to remove script tags"); - } - Elements scripts = doc.getElementsByTag("script"); - for (Element item : scripts) { - item.remove(); - } - if (logger.isDebugEnabled()) { - logger.debug("Removed: " + scripts.size() + " script tags"); - } - - if (logger.isDebugEnabled()) { - logger.debug("Removing Style Tags"); - } - Elements styles = doc.getElementsByTag("style"); - for (Element style : styles) { - style.remove(); - } - - return doc; - - - } - - /** - * replaces tags with textnodes - */ - private Document cleanEmTags(Document doc) { - Elements ems = doc.getElementsByTag("em"); - if (logger.isDebugEnabled()) { - logger.debug("Cleaning " + ems.size() + " EM tags"); - } - for (Element node : ems) { - // replace the node with a div node - Elements images = node.getElementsByTag("img"); - if (images.size() != 0) { - continue; - } - TextNode tn = new TextNode(node.text(), doc.baseUri()); - node.replaceWith(tn); - } - return doc; - } - - - /** - * remove those css drop caps where they put the first letter in big text in the 1st paragraph - */ - private Document removeDropCaps(Document doc) { - Elements items = doc.select("span[class~=(dropcap|drop_cap)]"); - if (logger.isDebugEnabled()) { - logger.debug("Cleaning " + items.size() + " dropcap tags"); - } - for (Element item : items) { - TextNode tn = new TextNode(item.text(), doc.baseUri()); - item.replaceWith(tn); - } - return doc; - } - - - private Document cleanBadTags(Document doc) { - // only select elements WITHIN the body to avoid removing the body itself - Elements children = doc.body().children(); - - - Elements naughtyList = children.select(queryNaughtyIDs); - if (logger.isDebugEnabled()) { - logger.debug(naughtyList.size() + " naughty ID elements found"); - } - for (Element node : naughtyList) { - if (logger.isDebugEnabled()) { - logger.debug("Cleaning: Removing node with id: " + node.id()); - } - removeNode(node); - } - if (logger.isDebugEnabled()) { - Elements naughtyList2 = children.select(queryNaughtyIDs); - logger.debug(naughtyList2.size() + " naughty ID elements found after removal"); - } - - Elements naughtyList3 = children.select(queryNaughtyClasses); - if (logger.isDebugEnabled()) { - logger.debug(naughtyList3.size() + " naughty CLASS elements found"); - } - for (Element node : naughtyList3) { - if (logger.isDebugEnabled()) { - logger.debug("clean: Removing node with class: " + node.className()); - } - removeNode(node); - } - if (logger.isDebugEnabled()) { - Elements naughtyList4 = children.select(queryNaughtyClasses); - logger.debug(naughtyList4.size() + " naughty CLASS elements found after removal"); - } - - // starmagazine puts shit on name tags instead of class or id - Elements naughtyList5 = children.select(queryNaughtyNames); - if (logger.isDebugEnabled()) { - logger.debug(naughtyList5.size() + " naughty Name elements found"); - } - for (Element node : naughtyList5) { - if (logger.isDebugEnabled()) { - logger.debug("clean: Removing node with class: " + node.attr("class") + " id: " + node.id() + " name: " + node.attr("name")); - } - removeNode(node); - } - - return doc; - - } - - /** - * Apparently jsoup expects the node's parent to not be null and throws if it is. Let's be safe. - * @param node the node to remove from the doc - */ - private void removeNode(Element node) { - if (node == null || node.parent() == null) return; - node.remove(); - } - - /** - * removes nodes that may have a certain pattern that matches against a class or id tag - * - * @param pattern - */ - private Document removeNodesViaRegEx(Document doc, Pattern pattern) { - try { - - Elements naughtyList = doc.getElementsByAttributeValueMatching("id", pattern); - if (logger.isDebugEnabled()) { - logger.debug("regExRemoveNodes: " + naughtyList.size() + " ID elements found against pattern: " + pattern); - } - for (Element node : naughtyList) { - removeNode(node); - } - - Elements naughtyList3 = doc.getElementsByAttributeValueMatching("class", pattern); - if (logger.isDebugEnabled()) { - logger.debug("regExRemoveNodes: " + naughtyList3.size() + " CLASS elements found against pattern: " + pattern); - } - for (Element node : naughtyList3) { - removeNode(node); - } - } catch (IllegalArgumentException e) { - e.printStackTrace(); - logger.error(e.toString()); - } - return doc; - } + ArrayList nodesToRemove = new ArrayList(); + + //cleanTags(div); + + for (Node kid : div.childNodes()) { + + if (kid.nodeName().equals("#text")) { + + TextNode txtNode = (TextNode) kid; + String text = txtNode.attr("text"); + if (string.isNullOrEmpty(text)) { + continue; + } + + //clean up text from tabs and newlines + text = tabsAndNewLinesReplcesments.replaceAll(text); + + if (text.length() > 1) { + + // check for siblings that might be links that we want to include in our new node + Node previousSib = kid.previousSibling(); + + if (logger.isDebugEnabled()) { + logger.debug("PARENT CLASS: " + div.className() + " NODENAME: " + kid.nodeName()); + logger.debug("TEXTREPLACE: '" + text.replace("\n", "").replace("
", "") + "'"); + } + + if (previousSib != null) { + if (previousSib.nodeName().equals("a")) { + replacementText.append(previousSib.outerHtml()); + if (logger.isDebugEnabled()) { + logger.debug("SIBLING NODENAME ADDITION: " + previousSib.nodeName() + " TEXT: " + previousSib.outerHtml()); + } + } + } + + replacementText.append(text); + nodesToRemove.add(kid); + + convertedTextNodes++; + } + + } + } + + // replace div's text with the new master replacement text node that containts the sum of all the little text nodes + //div.appendChild(replacementTextNode); + + Document newDoc = new Document(doc.baseUri()); + Element newPara = newDoc.createElement("p"); + newPara.html(replacementText.toString()); + + div.childNode(0).before(newPara.outerHtml()); + + newDoc = null; + + for (Node n : nodesToRemove) { + n.remove(); + } + + } + } catch (NullPointerException e) { + logger.error(e.toString()); + } + + } + + if (logger.isDebugEnabled()) { + logger.debug("Found " + divs.size() + " total divs with " + badDivs + " bad divs replaced and " + convertedTextNodes + " textnodes converted inside divs"); + } + + return doc; + } + + private Document removeScriptsAndStyles(Document doc) { + + if (logger.isDebugEnabled()) { + logger.debug("Starting to remove script tags"); + } + Elements scripts = doc.getElementsByTag("script"); + for (Element item : scripts) { + item.remove(); + } + if (logger.isDebugEnabled()) { + logger.debug("Removed: " + scripts.size() + " script tags"); + } + + if (logger.isDebugEnabled()) { + logger.debug("Removing Style Tags"); + } + Elements styles = doc.getElementsByTag("style"); + for (Element style : styles) { + style.remove(); + } + + return doc; + } + + /** + * replaces tags with textnodes + */ + private Document cleanEmTags(Document doc) { + Elements ems = doc.getElementsByTag("em"); + if (logger.isDebugEnabled()) { + logger.debug("Cleaning " + ems.size() + " EM tags"); + } + for (Element node : ems) { + // replace the node with a div node + Elements images = node.getElementsByTag("img"); + if (images.size() != 0) { + continue; + } + TextNode tn = new TextNode(node.text(), doc.baseUri()); + node.replaceWith(tn); + } + return doc; + } + + /** + * remove those css drop caps where they put the first letter in big text in the 1st paragraph + */ + private Document removeDropCaps(Document doc) { + Elements items = doc.select("span[class~=(dropcap|drop_cap)]"); + if (logger.isDebugEnabled()) { + logger.debug("Cleaning " + items.size() + " dropcap tags"); + } + for (Element item : items) { + TextNode tn = new TextNode(item.text(), doc.baseUri()); + item.replaceWith(tn); + } + return doc; + } + + private Document cleanBadTags(Document doc) { + // only select elements WITHIN the body to avoid removing the body itself + Elements children = doc.body().children(); + + Elements naughtyList = children.select(queryNaughtyIDs); + if (logger.isDebugEnabled()) { + logger.debug(naughtyList.size() + " naughty ID elements found"); + } + for (Element node : naughtyList) { + if (logger.isDebugEnabled()) { + logger.debug("Cleaning: Removing node with id: " + node.id()); + } + removeNode(node); + } + if (logger.isDebugEnabled()) { + Elements naughtyList2 = children.select(queryNaughtyIDs); + logger.debug(naughtyList2.size() + " naughty ID elements found after removal"); + } + + Elements naughtyList3 = children.select(queryNaughtyClasses); + if (logger.isDebugEnabled()) { + logger.debug(naughtyList3.size() + " naughty CLASS elements found"); + } + for (Element node : naughtyList3) { + if (logger.isDebugEnabled()) { + logger.debug("clean: Removing node with class: " + node.className()); + } + removeNode(node); + } + if (logger.isDebugEnabled()) { + Elements naughtyList4 = children.select(queryNaughtyClasses); + logger.debug(naughtyList4.size() + " naughty CLASS elements found after removal"); + } + + // starmagazine puts shit on name tags instead of class or id + Elements naughtyList5 = children.select(queryNaughtyNames); + if (logger.isDebugEnabled()) { + logger.debug(naughtyList5.size() + " naughty Name elements found"); + } + for (Element node : naughtyList5) { + if (logger.isDebugEnabled()) { + logger.debug("clean: Removing node with class: " + node.attr("class") + " id: " + node.id() + " name: " + node.attr("name")); + } + removeNode(node); + } + + return doc; + + } + + /** + * Apparently jsoup expects the node's parent to not be null and throws if it is. Let's be safe. + * + * @param node the node to remove from the doc + */ + private void removeNode(Element node) { + if (node == null || node.parent() == null) { + return; + } + node.remove(); + } + + /** + * removes nodes that may have a certain pattern that matches against a class or id tag + */ + private Document removeNodesViaRegEx(Document doc, Pattern pattern) { + try { + + Elements naughtyList = doc.getElementsByAttributeValueMatching("id", pattern); + if (logger.isDebugEnabled()) { + logger.debug("regExRemoveNodes: " + naughtyList.size() + " ID elements found against pattern: " + pattern); + } + for (Element node : naughtyList) { + removeNode(node); + } + + Elements naughtyList3 = doc.getElementsByAttributeValueMatching("class", pattern); + if (logger.isDebugEnabled()) { + logger.debug("regExRemoveNodes: " + naughtyList3.size() + " CLASS elements found against pattern: " + pattern); + } + for (Element node : naughtyList3) { + removeNode(node); + } + } catch (IllegalArgumentException e) { + e.printStackTrace(); + logger.error(e.toString()); + } + return doc; + } } From 9e5dc7354b8e64887709c345b9d351b97239cd11 Mon Sep 17 00:00:00 2001 From: nator Date: Fri, 19 Aug 2011 14:18:02 -0500 Subject: [PATCH 037/347] catchup --- pom.xml | 14 +++++++++++- .../com/jimplush/goose/Configuration.java | 4 ++-- .../com/jimplush/goose/ContentExtractor.java | 22 ++++++++++++++++++- src/main/resources/log4j.properties | 2 +- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 5cc4d1c4d..e17920143 100644 --- a/pom.xml +++ b/pom.xml @@ -58,5 +58,17 @@
- + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.0.2 + + 1.5 + 1.5 + + + + diff --git a/src/main/java/com/jimplush/goose/Configuration.java b/src/main/java/com/jimplush/goose/Configuration.java index fcd1ad05c..053f38d11 100644 --- a/src/main/java/com/jimplush/goose/Configuration.java +++ b/src/main/java/com/jimplush/goose/Configuration.java @@ -53,13 +53,13 @@ public class Configuration { /** * path to your imagemagick convert executable, on the mac using mac ports this is the default listed */ - private String imagemagickConvertPath = "/opt/local/bin/convert"; + private String imagemagickConvertPath = "/usr/local/bin/convert"; /** * path to your imagemagick identify executable */ - private String imagemagickIdentifyPath= "/opt/local/bin/identify"; + private String imagemagickIdentifyPath= "/usr/local/bin/identify"; public String getLocalStoragePath() { return localStoragePath; diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java index 95cf4ffcc..cd2a31921 100644 --- a/src/main/java/com/jimplush/goose/ContentExtractor.java +++ b/src/main/java/com/jimplush/goose/ContentExtractor.java @@ -45,6 +45,7 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.Set; +import java.util.regex.*; /** * User: jim plush @@ -118,6 +119,7 @@ public Article extractContent(String urlToCrawl) { Article article = null; try { String rawHtml = HtmlFetcher.getHtml(urlToCrawl); + rawHtml = fixRawHtml(rawHtml); Document doc = parseWrapper.parse(rawHtml, urlToCrawl); DocumentCleaner documentCleaner = getDocCleaner(); @@ -202,7 +204,21 @@ private String getUrlToCrawl(String urlToCrawl) { return finalURL; } - + // There's a bug in JSoup that can't deal with internal spaces in tags like this. It's a hack. + private String fixRawHtml(String html) { + html = html.replaceAll(" "," "); + html = html.replaceAll(" "," "); + html = html.replaceAll(" "," "); + html = html.replaceAll(" "," "); + html = html.replaceAll(" "," "); + html = html.replaceAll(" "," "); + html = html.replaceAll(" "," "); + html = html.replaceAll(" "," "); + + html = html.replaceAll(" "," "); + return html; + } + // todo create a setter for this for people to override output formatter private OutputFormatter getOutputFormatter() { if (outputFormatter == null) { @@ -269,6 +285,10 @@ private String getTitle(Document doc, Article article) { titleText = doTitleSplits(titleText, "»"); usedDelimeter = true; } + if (titleText.contains("»") && !usedDelimeter) { + titleText = doTitleSplits(titleText, "»"); + usedDelimeter = true; + } if (titleText.contains(":") && !usedDelimeter) { titleText = doTitleSplits(titleText, ":"); diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties index b930dd5d4..0121a0310 100644 --- a/src/main/resources/log4j.properties +++ b/src/main/resources/log4j.properties @@ -1,5 +1,5 @@ # ***** Set root logger level to WARN and its two appenders to stdout and R. -log4j.rootLogger=info, stdout +log4j.rootLogger=debug, stdout # ***** stdout is set to be a ConsoleAppender. log4j.appender.stdout=org.apache.log4j.ConsoleAppender From e6307c81f54d37e584e04fe2819a7876c0b931b8 Mon Sep 17 00:00:00 2001 From: Cory Hacking Date: Fri, 19 Aug 2011 13:30:09 -0600 Subject: [PATCH 038/347] added to .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 615c5c5c9..07d7d4236 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ target/ /goose.iml /goose.ipr /goose.iws +.idea/ +*.iml From 3a8cb8d943e05f8a7592520422c9fc2c53726f14 Mon Sep 17 00:00:00 2001 From: nator Date: Fri, 19 Aug 2011 15:54:50 -0500 Subject: [PATCH 039/347] a few tweaks to use new jsoup and eventually use domain to change how we process stuff --- pom.xml | 24 ++++++++----------- .../com/jimplush/goose/ContentExtractor.java | 17 +++++++++---- .../DefaultOutputFormatter.java | 8 +++++-- 3 files changed, 29 insertions(+), 20 deletions(-) diff --git a/pom.xml b/pom.xml index 2c2d7fdc1..74d75ff8b 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ org.jsoup jsoup - 1.5.2 + 1.6.1 commons-io @@ -57,24 +57,20 @@ -<<<<<<< HEAD:pom.xml -======= - - org.apache.maven.plugins - maven-compiler-plugin - 2.0.2 - - 1.5 - 1.5 - - - - + + org.apache.maven.plugins + maven-compiler-plugin + 2.0.2 + + 1.5 + 1.5 + + org.apache.maven.plugins maven-surefire-plugin diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java index b391dfcd5..501600d7c 100644 --- a/src/main/java/com/jimplush/goose/ContentExtractor.java +++ b/src/main/java/com/jimplush/goose/ContentExtractor.java @@ -85,6 +85,8 @@ public class ContentExtractor { // the MD5 of the URL we're currently parsing, used to references the images we download to the url so we // can more easily clean up resources when we're done with the page. private String linkhash; + // also store the actual link we're crawling so we can do a few things customized per-site + private String link; // once we have our topNode then we want to format that guy for output to the user private OutputFormatter outputFormatter; private ImageExtractor imageExtractor; @@ -136,6 +138,7 @@ public Article performExtraction(String urlToCrawl, String rawHtml) { try { new URL(urlToCrawl); + this.link = urlToCrawl; this.linkhash = HashUtils.md5(urlToCrawl); } catch (MalformedURLException e) { throw new IllegalArgumentException("Invalid URL Passed in: " + urlToCrawl, e); @@ -147,6 +150,7 @@ public Article performExtraction(String urlToCrawl, String rawHtml) { if (rawHtml == null) { rawHtml = HtmlFetcher.getHtml(urlToCrawl); } + //rawHtml = fixRawHtml(rawHtml); article = new Article(); @@ -345,10 +349,10 @@ private String getTitle(Document doc) { titleText = doTitleSplits(titleText, ARROWS_SPLITTER); usedDelimeter = true; } - if (titleText.contains("»") && !usedDelimeter) { - titleText = doTitleSplits(titleText, "»"); - usedDelimeter = true; - } +// if (titleText.contains("»") && !usedDelimeter) { +// titleText = doTitleSplits(titleText, "»"); +// usedDelimeter = true; +// } if (!usedDelimeter && titleText.contains(":")) { titleText = doTitleSplits(titleText, COLON_SPLITTER); @@ -384,6 +388,11 @@ private String doTitleSplits(String title, StringSplitter splitter) { int largeTextIndex = 0; String[] titlePieces = splitter.split(title); + + if (this.link.contains("blogs.walkerart.org")) { + // it's always the second one!! + return TITLE_REPLACEMENTS.replaceAll(titlePieces[1]).trim(); + } // take the largest split for (int i = 0; i < titlePieces.length; i++) { diff --git a/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java b/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java index 0ae194c44..f85ff611a 100644 --- a/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java +++ b/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java @@ -140,7 +140,11 @@ private void removeNodesWithNegativeScores() { */ private void replaceTagsWithText() { - Elements strongs = topNode.getElementsByTag("strong"); + topNode.select("strong").unwrap(); + topNode.select("b").unwrap(); + topNode.select("i").unwrap(); + +/* Elements strongs = topNode.getElementsByTag("strong"); for (Element item : strongs) { TextNode tn = new TextNode(item.text(), topNode.baseUri()); item.replaceWith(tn); @@ -156,7 +160,7 @@ private void replaceTagsWithText() { for (Element item : italics) { TextNode tn = new TextNode(item.text(), topNode.baseUri()); item.replaceWith(tn); - } + }*/ } /** From 2db797eb9c77dfa46730f68fee146bc75954077f Mon Sep 17 00:00:00 2001 From: Cory Hacking Date: Sat, 20 Aug 2011 18:12:08 -0600 Subject: [PATCH 040/347] update to jsoup 1.6.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a72e21075..fcc514948 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ org.jsoup jsoup - 1.5.2 + 1.6.1 commons-io From 851c8d4c81c0e62f18e5e7ef711577e8d8788c7b Mon Sep 17 00:00:00 2001 From: Cory Hacking Date: Sat, 20 Aug 2011 18:22:33 -0600 Subject: [PATCH 041/347] convert tags strong, b, i, strike, del, ins to textNodes so they aren't left out (e.g. http://www.engadget.com/2011/08/19/was-webos-tested-on-an-ipad-done-in-by-its-slower-hardware/) --- .../goose/cleaners/DefaultDocumentCleaner.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java b/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java index 3d40c4dd5..397d19deb 100644 --- a/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java +++ b/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java @@ -88,7 +88,7 @@ public Document clean(Document doc) { logger.debug("Starting cleaning phase with DefaultDocumentCleaner"); } Document docToClean = doc; - docToClean = cleanEmTags(docToClean); + docToClean = cleanTextTags(docToClean); docToClean = removeDropCaps(docToClean); docToClean = removeScriptsAndStyles(docToClean); docToClean = cleanBadTags(docToClean); @@ -243,10 +243,17 @@ private Document removeScriptsAndStyles(Document doc) { } /** - * replaces tags with textnodes + * replaces various tags with textnodes */ - private Document cleanEmTags(Document doc) { + private Document cleanTextTags(Document doc) { Elements ems = doc.getElementsByTag("em"); + ems.addAll(doc.getElementsByTag("strong")); + ems.addAll(doc.getElementsByTag("b")); + ems.addAll(doc.getElementsByTag("i")); + ems.addAll(doc.getElementsByTag("strike")); + ems.addAll(doc.getElementsByTag("del")); + ems.addAll(doc.getElementsByTag("ins")); + if (logger.isDebugEnabled()) { logger.debug("Cleaning " + ems.size() + " EM tags"); } From 90574385c7f9b0dfe55b2db5f742ad5965597087 Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Mon, 22 Aug 2011 15:49:41 +0200 Subject: [PATCH 042/347] =?UTF-8?q?Implemented=20multilanguage=20support?= =?UTF-8?q?=20(en,de)=20with=20tests=20for=20some=20German=20sites=20-=20a?= =?UTF-8?q?lthough=20it=20became=20obsolete=20immediately=20due=20to=20the?= =?UTF-8?q?=20port=20to=20Scala=20:=C2=B4(=20*=20Changed=20the=20way=20div?= =?UTF-8?q?s=20are=20converted=20to=20paragraphs=20*=20Implemented=20basic?= =?UTF-8?q?=20language=20support=20*=20Some=20people=20apparently=20think?= =?UTF-8?q?=20it's=20a=20good=20idea=20to=20have=20new=20lines=20in=20thei?= =?UTF-8?q?r=20title=20tags=20*=20Cannot=20use=20"links"=20for=20naughty?= =?UTF-8?q?=20class=20detection,=20it=20means=20"left"=20in=20German=20and?= =?UTF-8?q?=20might=20mark=20a=20left=20column=20*=20Tests=20for=20some=20?= =?UTF-8?q?German=20sites=20*=20Changed=20POM=20to=20create=20test=20JAR?= =?UTF-8?q?=20as=20well=20*=20Ignoring=20bin=20directory?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + pom.xml | 13 +- .../com/jimplush/goose/Configuration.java | 15 ++ .../com/jimplush/goose/ContentExtractor.java | 29 +-- .../cleaners/DefaultDocumentCleaner.java | 29 +-- .../DefaultOutputFormatter.java | 15 +- .../jimplush/goose/texthelpers/StopWords.java | 143 ++++++------ .../jimplush/goose/GermanGoldSitesTest.java | 205 ++++++++++++++++++ 8 files changed, 341 insertions(+), 109 deletions(-) create mode 100644 src/test/java/com/jimplush/goose/GermanGoldSitesTest.java diff --git a/.gitignore b/.gitignore index 615c5c5c9..c45778287 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ target/ /goose.iml /goose.ipr /goose.iws +bin/ diff --git a/pom.xml b/pom.xml index 1ab62173f..8249da181 100644 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,7 @@ @@ -86,6 +86,17 @@ + + org.apache.maven.plugins + maven-jar-plugin + + + + test-jar + + + + diff --git a/src/main/java/com/jimplush/goose/Configuration.java b/src/main/java/com/jimplush/goose/Configuration.java index 0115f3a01..319d9a148 100644 --- a/src/main/java/com/jimplush/goose/Configuration.java +++ b/src/main/java/com/jimplush/goose/Configuration.java @@ -20,6 +20,8 @@ import com.jimplush.goose.extractors.AdditionalDataExtractor; import com.jimplush.goose.extractors.PublishDateExtractor; +import com.jimplush.goose.texthelpers.StopWords; + import org.jsoup.nodes.Element; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -67,6 +69,8 @@ public class Configuration { */ private String imagemagickIdentifyPath= "/opt/local/bin/identify"; + private StopWords stopWords; + private PublishDateExtractor publishDateExtractor = new PublishDateExtractor() { @Override public Date extract(Element rootElement) { @@ -147,4 +151,15 @@ public String getImagemagickIdentifyPath() { public void setImagemagickIdentifyPath(String imagemagickIdentifyPath) { this.imagemagickIdentifyPath = imagemagickIdentifyPath; } + + public void setStopWords(StopWords stopWords) { + this.stopWords = stopWords; + } + + public StopWords getStopWords() { + if (stopWords == null) { + return StopWords.EN; + } + return stopWords; + } } diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java index 7c3b61bc1..4c78c12cf 100644 --- a/src/main/java/com/jimplush/goose/ContentExtractor.java +++ b/src/main/java/com/jimplush/goose/ContentExtractor.java @@ -71,6 +71,8 @@ public class ContentExtractor { private static final StringSplitter COLON_SPLITTER = new StringSplitter(":"); private static final StringSplitter SPACE_SPLITTER = new StringSplitter(" "); + + private static final Set NO_STRINGS = new HashSet(0); private static final String A_REL_TAG_SELECTOR = "a[rel=tag], a[href*=/tag/]"; @@ -88,8 +90,6 @@ public class ContentExtractor { // once we have our topNode then we want to format that guy for output to the user private OutputFormatter outputFormatter; private ImageExtractor imageExtractor; - - /** * you can optionally pass in a configuration object here that will allow you to override the settings * that goose comes default with @@ -105,6 +105,7 @@ public ContentExtractor() { */ public ContentExtractor(Configuration config) { this.config = config; + } @@ -266,7 +267,7 @@ private String getUrlToCrawl(String urlToCrawl) { // todo create a setter for this for people to override output formatter private OutputFormatter getOutputFormatter() { if (outputFormatter == null) { - return new DefaultOutputFormatter(); + return new DefaultOutputFormatter(config.getStopWords()); } else { return outputFormatter; } @@ -313,8 +314,8 @@ private String getTitle(Document doc) { Elements titleElem = doc.getElementsByTag("title"); if (titleElem == null || titleElem.isEmpty()) return string.empty; - String titleText = titleElem.first().text(); - + String titleText = titleElem.first().text().replaceAll("\r?\n\r?", " "); + if (string.isNullOrEmpty(titleText)) return string.empty; boolean usedDelimeter = false; @@ -437,14 +438,6 @@ private String getCanonicalLink(Document doc, String baseUrl) { }*/ } - private String getDomain(String canonicalLink) { - try { - return new URL(canonicalLink).getHost(); - } catch (MalformedURLException e) { - throw new RuntimeException(e); - } - } - /** * we're going to start looking for where the clusters of paragraphs are. We'll score a cluster based on the number of stopwords * and the number of consecutive paragraphs together, which should form the cluster of text that this node is around @@ -472,7 +465,7 @@ private Element calculateBestNodeBasedOnClustering(Document doc) { for (Element node : nodesToCheck) { String nodeText = node.text(); - WordStats wordStats = StopWords.getStopWordCount(nodeText); + WordStats wordStats = config.getStopWords().getStopWordCount(nodeText); boolean highLinkDensity = isHighLinkDensity(node); @@ -527,7 +520,7 @@ private Element calculateBestNodeBasedOnClustering(Document doc) { logger.debug("Location Boost Score: " + boostScore + " on interation: " + i + "' id='" + node.parent().id() + "' class='" + node.parent().attr("class")); } String nodeText = node.text(); - WordStats wordStats = StopWords.getStopWordCount(nodeText); + WordStats wordStats = config.getStopWords().getStopWordCount(nodeText); int upscore = (int) (wordStats.getStopWordCount() + boostScore); updateScore(node.parent(), upscore); updateScore(node.parent().parent(), upscore / 2); @@ -686,7 +679,7 @@ private boolean isOkToBoost(Element node) { } String paraText = sibling.text(); - WordStats wordStats = StopWords.getStopWordCount(paraText); + WordStats wordStats = config.getStopWords().getStopWordCount(paraText); if (wordStats.getStopWordCount() > 5) { if (logger.isDebugEnabled()) { logger.debug("We're gonna boost this node, seems contenty"); @@ -938,7 +931,7 @@ private Element addSiblings(Element node) { continue; } for (Element firstParagraph : potentialParagraphs) { - WordStats wordStats = StopWords.getStopWordCount(firstParagraph.text()); + WordStats wordStats = config.getStopWords().getStopWordCount(firstParagraph.text()); int paragraphScore = wordStats.getStopWordCount(); @@ -980,7 +973,7 @@ private int getBaselineScoreForSiblings(Element topNode) { for (Element node : nodesToCheck) { String nodeText = node.text(); - WordStats wordStats = StopWords.getStopWordCount(nodeText); + WordStats wordStats = config.getStopWords().getStopWordCount(nodeText); boolean highLinkDensity = isHighLinkDensity(node); diff --git a/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java b/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java index 06c768bb2..bff7b8118 100644 --- a/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java +++ b/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java @@ -28,7 +28,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -70,7 +69,7 @@ public class DefaultDocumentCleaner implements DocumentCleaner { StringBuilder sb = new StringBuilder(); // create negative elements - sb.append("^side$|combx|retweet|menucontainer|navbar|comment|PopularQuestions|contact|foot|footer|Footer|footnote|cnn_strycaptiontxt|links|meta$|scroll|shoutbox|sponsor"); + sb.append("^side$|combx|retweet|menucontainer|navbar|comment|PopularQuestions|contact|foot|footer|Footer|footnote|cnn_strycaptiontxt|meta$|scroll|shoutbox|sponsor"); sb.append("|tags|socialnetworking|socialNetworking|cnnStryHghLght|cnn_stryspcvbx|^inset$|pagetools|post-attributes|welcome_form|contentTools2|the_answers"); sb.append("|communitypromo|subscribe|vcard|articleheadings|date|print|popup|author-dropdown|tools|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text"); regExRemoveNodes = sb.toString(); @@ -139,9 +138,8 @@ private Document convertDivsToParagraphs(Document doc, String domType) { StringBuilder replacementText = new StringBuilder(); - ArrayList nodesToRemove = new ArrayList(); - //cleanTags(div); + Document newDoc = new Document(doc.baseUri()); for (Node kid : div.childNodes()) { @@ -173,10 +171,10 @@ private Document convertDivsToParagraphs(Document doc, String domType) { } } } + Element newPara = newDoc.createElement("p"); - replacementText.append(text); - nodesToRemove.add(kid); - + newPara.text(text); + kid.replaceWith(newPara); convertedTextNodes++; } @@ -185,23 +183,6 @@ private Document convertDivsToParagraphs(Document doc, String domType) { } - // replace div's text with the new master replacement text node that containts the sum of all the little text nodes - //div.appendChild(replacementTextNode); - - Document newDoc = new Document(doc.baseUri()); - Element newPara = newDoc.createElement("p"); - newPara.html(replacementText.toString()); - - - div.childNode(0).before(newPara.outerHtml()); - - newDoc = null; - - - for (Node n : nodesToRemove) { - n.remove(); - } - } } catch (NullPointerException e) { diff --git a/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java b/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java index 0ae194c44..712de906c 100644 --- a/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java +++ b/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java @@ -37,7 +37,12 @@ public class DefaultOutputFormatter implements OutputFormatter { private static final Logger logger = LoggerFactory.getLogger(DefaultOutputFormatter.class); private Element topNode; - + private StopWords stopWords; + + public DefaultOutputFormatter(StopWords stopWords) { + this.stopWords = stopWords; + } + /** * Depricated use {@link #getFormattedText(Element)} * @param topNode the top most node to format @@ -115,6 +120,10 @@ private void convertLinksToText() { for (Element item : links) { if (item.getElementsByTag("img").size() == 0) { TextNode tn = new TextNode(item.text(), topNode.baseUri()); + // the link might be wrapped in multiple tags. Remove these as well + while (item != topNode && item.parent().text().trim().equals(tn.text())) { + item = item.parent(); + } item.replaceWith(tn); } } @@ -173,9 +182,9 @@ private void removeParagraphsWithFewWords() { try { // get stop words that appear in each node - WordStats stopWords = StopWords.getStopWordCount(el.text()); + WordStats wordStats = stopWords.getStopWordCount(el.text()); - if (stopWords.getStopWordCount() < 5 && el.getElementsByTag("object").size() == 0 && el.getElementsByTag("embed").size() == 0) { + if (wordStats.getStopWordCount() < 5 && el.getElementsByTag("object").size() == 0 && el.getElementsByTag("embed").size() == 0) { el.remove(); } } catch (IllegalArgumentException e) { diff --git a/src/main/java/com/jimplush/goose/texthelpers/StopWords.java b/src/main/java/com/jimplush/goose/texthelpers/StopWords.java index 35db66354..951be71cc 100644 --- a/src/main/java/com/jimplush/goose/texthelpers/StopWords.java +++ b/src/main/java/com/jimplush/goose/texthelpers/StopWords.java @@ -20,76 +20,93 @@ import java.util.*; -public class StopWords { - private static final Set STOP_WORDS; +public enum StopWords { + EN(new String[]{ + "a's", "able", "about", "above", "according", "accordingly", "across", "actually", + "after", "afterwards", "again", "against", "ain't", "all", "allow", "allows", "almost", "alone", + "along", "already", "also", "although", "always", "am", "among", "amongst", "an", "and", "another", + "any", "anybody", "anyhow", "anyone", "anything", "anyway", "anyways", "anywhere", "apart", "appear", + "appreciate", "appropriate", "are", "aren't", "around", "as", "aside", "ask", "asking", "associated", + "at", "available", "away", "awfully", "be", "became", "because", "become", "becomes", "becoming", + "been", "before", "beforehand", "behind", "being", "believe", "below", "beside", "besides", "best", + "better", "between", "beyond", "both", "brief", "but", "by", "c", "c'mon", "c's", "came", "campaign", "can", + "can't", "cannot", "cant", "cause", "causes", "certain", "certainly", "changes", "clearly", "co", + "com", "come", "comes", "concerning", "consequently", "consider", "considering", "contain", + "containing", "contains", "corresponding", "could", "couldn't", "course", "currently", + "definitely", "described", "despite", "did", "didn't", "different", "do", "does", "doesn't", "doing", + "don't", "done", "down", "downwards", "during", "each", "edu", "eight", "either", "else", + "elsewhere", "enough", "endorsed", "entirely", "especially", "et", "etc", "even", "ever", "every", "everybody", + "everyone", "everything", "everywhere", "ex", "exactly", "example", "except", "far", "few", + "fifth", "first", "financial", "five", "followed", "following", "follows", "for", "former", "formerly", "forth", + "four", "from", "further", "furthermore", "get", "gets", "getting", "given", "gives", "go", + "goes", "going", "gone", "got", "gotten", "greetings", "had", "hadn't", "happens", "hardly", + "has", "hasn't", "have", "haven't", "having", "he", "he's", "hello", "help", "hence", "her", "here", + "here's", "hereafter", "hereby", "herein", "hereupon", "hers", "herself", "hi", "him", "himself", + "his", "hither", "hopefully", "how", "howbeit", "however", "i'd", "i'll", "i'm", "i've", "ie", + "if", "ignored", "immediate", "in", "inasmuch", "inc", "indeed", "indicate", "indicated", "indicates", + "inner", "insofar", "instead", "into", "inward", "is", "isn't", "it", "it'd", "it'll", "it's", "its", + "itself", "just", "keep", "keeps", "kept", "know", "knows", "known", "last", "lately", + "later", "latter", "latterly", "least", "less", "lest", "let", "let's", "like", "liked", "likely", + "little", "look", "looking", "looks", "ltd", "mainly", "many", "may", "maybe", "me", "mean", + "meanwhile", "merely", "might", "more", "moreover", "most", "mostly", "much", "must", "my", "myself", + "name", "namely", "nd", "near", "nearly", "necessary", "need", "needs", "neither", "never", + "nevertheless", "new", "next", "nine", "no", "nobody", "non", "none", "noone", "nor", "normally", + "not", "nothing", "novel", "now", "nowhere", "obviously", "of", "off", "often", "oh", "ok", + "okay", "old", "on", "once", "one", "ones", "only", "onto", "or", "other", "others", "otherwise", + "ought", "our", "ours", "ourselves", "out", "outside", "over", "overall", "own", "particular", + "particularly", "per", "perhaps", "placed", "please", "plus", "possible", "presumably", "probably", + "provides", "quite", "quote", "quarterly", "rather", "really", "reasonably", "regarding", + "regardless", "regards", "relatively", "respectively", "right", "said", "same", "saw", "say", + "saying", "says", "second", "secondly", "see", "seeing", "seem", "seemed", "seeming", "seems", "seen", + "self", "selves", "sensible", "sent", "serious", "seriously", "seven", "several", "shall", "she", + "should", "shouldn't", "since", "six", "so", "some", "somebody", "somehow", "someone", "something", + "sometime", "sometimes", "somewhat", "somewhere", "soon", "sorry", "specified", "specify", + "specifying", "still", "sub", "such", "sup", "sure", "t's", "take", "taken", "tell", "tends", + "than", "thank", "thanks", "thanx", "that", "that's", "thats", "the", "their", "theirs", "them", + "themselves", "then", "thence", "there", "there's", "thereafter", "thereby", "therefore", "therein", + "theres", "thereupon", "these", "they", "they'd", "they'll", "they're", "they've", "think", "third", + "this", "thorough", "thoroughly", "those", "though", "three", "through", "throughout", "thru", "thus", + "to", "together", "too", "took", "toward", "towards", "tried", "tries", "truly", "try", "trying", + "twice", "two", "under", "unfortunately", "unless", "unlikely", "until", "unto", "up", + "upon", "us", "use", "used", "useful", "uses", "using", "usually", "uucp", "value", "various", + "very", "via", "viz", "vs", "want", "wants", "was", "wasn't", "way", "we", "we'd", "we'll", + "we're", "we've", "welcome", "well", "went", "were", "weren't", "what", "what's", "whatever", "when", + "whence", "whenever", "where", "where's", "whereafter", "whereas", "whereby", "wherein", "whereupon", + "wherever", "whether", "which", "while", "whither", "who", "who's", "whoever", "whole", "whom", + "whose", "why", "will", "willing", "wish", "with", "within", "without", "won't", "wonder", "would", + "would", "wouldn't", "yes", "yet", "you", "you'd", "you'll", "you're", "you've", "your", + "yours", "yourself", "yourselves", "zero", "official", "sharply", "criticized"}), + DE(new String[]{ + "aber", "als", "am", "an", "auch", "auf", "aus", "bei", "bin", "bis", "bist", "da", + "dadurch", "daher", "darum", "das", "daß", "dass", "dein", "deine", "dem", "den", "der", "des", "dessen", + "deshalb", "die", "dies", "dieser", "dieses", "doch", "dort", "du", "durch", "ein", "eine", "einem", "einen", + "einer", "eines", "er", "es", "euer", "eure", "für", "hatte", "hatten", "hattest", "hattet", "hier hinter", + "ich", "ihr", "ihre", "im", "in", "ist", "ja", "jede", "jedem", "jeden", "jeder", "jedes", "jener", "jenes", + "jetzt", "kann", "kannst", "können", "könnt", "machen", "mein", "meine", "mit", "muß", "mußt", "musst", "müssen", + "müßt", "nach", "nachdem", "nein", "nicht", "nun", "oder", "seid", "sein", "seine", "sich", "sie", "sind", + "soll", "sollen", "sollst", "sollt", "sonst", "soweit", "sowie", "und", "unser unsere", "unter", "vom", + "von", "vor", "wann", "warum", "was", "weiter", "weitere", "wenn", "wer", "werde", "werden", "werdet", + "weshalb", "wie", "wieder", "wieso", "wir", "wird", "wirst", "wo", "woher", "wohin", "zu", "zum", "zur", "über"}); + + private final Set STOP_WORDS; + private static final StringReplacement PUNCTUATION = StringReplacement.compile("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\p{Pc}\\s]", string.empty); - static { - String elements[] = {"a's", "able", "about", "above", "according", "accordingly", "across", "actually", - "after", "afterwards", "again", "against", "ain't", "all", "allow", "allows", "almost", "alone", - "along", "already", "also", "although", "always", "am", "among", "amongst", "an", "and", "another", - "any", "anybody", "anyhow", "anyone", "anything", "anyway", "anyways", "anywhere", "apart", "appear", - "appreciate", "appropriate", "are", "aren't", "around", "as", "aside", "ask", "asking", "associated", - "at", "available", "away", "awfully", "be", "became", "because", "become", "becomes", "becoming", - "been", "before", "beforehand", "behind", "being", "believe", "below", "beside", "besides", "best", - "better", "between", "beyond", "both", "brief", "but", "by", "c", "c'mon", "c's", "came", "campaign", "can", - "can't", "cannot", "cant", "cause", "causes", "certain", "certainly", "changes", "clearly", "co", - "com", "come", "comes", "concerning", "consequently", "consider", "considering", "contain", - "containing", "contains", "corresponding", "could", "couldn't", "course", "currently", - "definitely", "described", "despite", "did", "didn't", "different", "do", "does", "doesn't", "doing", - "don't", "done", "down", "downwards", "during", "each", "edu", "eight", "either", "else", - "elsewhere", "enough", "endorsed", "entirely", "especially", "et", "etc", "even", "ever", "every", "everybody", - "everyone", "everything", "everywhere", "ex", "exactly", "example", "except", "far", "few", - "fifth", "first", "financial", "five", "followed", "following", "follows", "for", "former", "formerly", "forth", - "four", "from", "further", "furthermore", "get", "gets", "getting", "given", "gives", "go", - "goes", "going", "gone", "got", "gotten", "greetings", "had", "hadn't", "happens", "hardly", - "has", "hasn't", "have", "haven't", "having", "he", "he's", "hello", "help", "hence", "her", "here", - "here's", "hereafter", "hereby", "herein", "hereupon", "hers", "herself", "hi", "him", "himself", - "his", "hither", "hopefully", "how", "howbeit", "however", "i'd", "i'll", "i'm", "i've", "ie", - "if", "ignored", "immediate", "in", "inasmuch", "inc", "indeed", "indicate", "indicated", "indicates", - "inner", "insofar", "instead", "into", "inward", "is", "isn't", "it", "it'd", "it'll", "it's", "its", - "itself", "just", "keep", "keeps", "kept", "know", "knows", "known", "last", "lately", - "later", "latter", "latterly", "least", "less", "lest", "let", "let's", "like", "liked", "likely", - "little", "look", "looking", "looks", "ltd", "mainly", "many", "may", "maybe", "me", "mean", - "meanwhile", "merely", "might", "more", "moreover", "most", "mostly", "much", "must", "my", "myself", - "name", "namely", "nd", "near", "nearly", "necessary", "need", "needs", "neither", "never", - "nevertheless", "new", "next", "nine", "no", "nobody", "non", "none", "noone", "nor", "normally", - "not", "nothing", "novel", "now", "nowhere", "obviously", "of", "off", "often", "oh", "ok", - "okay", "old", "on", "once", "one", "ones", "only", "onto", "or", "other", "others", "otherwise", - "ought", "our", "ours", "ourselves", "out", "outside", "over", "overall", "own", "particular", - "particularly", "per", "perhaps", "placed", "please", "plus", "possible", "presumably", "probably", - "provides", "quite", "quote", "quarterly", "rather", "really", "reasonably", "regarding", - "regardless", "regards", "relatively", "respectively", "right", "said", "same", "saw", "say", - "saying", "says", "second", "secondly", "see", "seeing", "seem", "seemed", "seeming", "seems", "seen", - "self", "selves", "sensible", "sent", "serious", "seriously", "seven", "several", "shall", "she", - "should", "shouldn't", "since", "six", "so", "some", "somebody", "somehow", "someone", "something", - "sometime", "sometimes", "somewhat", "somewhere", "soon", "sorry", "specified", "specify", - "specifying", "still", "sub", "such", "sup", "sure", "t's", "take", "taken", "tell", "tends", - "than", "thank", "thanks", "thanx", "that", "that's", "thats", "the", "their", "theirs", "them", - "themselves", "then", "thence", "there", "there's", "thereafter", "thereby", "therefore", "therein", - "theres", "thereupon", "these", "they", "they'd", "they'll", "they're", "they've", "think", "third", - "this", "thorough", "thoroughly", "those", "though", "three", "through", "throughout", "thru", "thus", - "to", "together", "too", "took", "toward", "towards", "tried", "tries", "truly", "try", "trying", - "twice", "two", "under", "unfortunately", "unless", "unlikely", "until", "unto", "up", - "upon", "us", "use", "used", "useful", "uses", "using", "usually", "uucp", "value", "various", - "very", "via", "viz", "vs", "want", "wants", "was", "wasn't", "way", "we", "we'd", "we'll", - "we're", "we've", "welcome", "well", "went", "were", "weren't", "what", "what's", "whatever", "when", - "whence", "whenever", "where", "where's", "whereafter", "whereas", "whereby", "wherein", "whereupon", - "wherever", "whether", "which", "while", "whither", "who", "who's", "whoever", "whole", "whom", - "whose", "why", "will", "willing", "wish", "with", "within", "without", "won't", "wonder", "would", - "would", "wouldn't", "yes", "yet", "you", "you'd", "you'll", "you're", "you've", "your", - "yours", "yourself", "yourselves", "zero", "official", "sharply", "criticized"}; - STOP_WORDS = Collections.unmodifiableSet(new HashSet(Arrays.asList(elements))); - } + StopWords(String[] stopWords) { + this.STOP_WORDS = Collections.unmodifiableSet(new HashSet(Arrays.asList(stopWords))); + } + // the confusing pattern below is basically just match any non-word character excluding white-space. - private static final StringReplacement PUNCTUATION = StringReplacement.compile("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\p{Pc}\\s]", string.empty); public static String removePunctuation(String str) { return PUNCTUATION.replaceAll(str); } - - public static WordStats getStopWordCount(String content) { + public WordStats getStopWordCount(String content) { + return getStopWordCount(content, STOP_WORDS); + } + + public WordStats getStopWordCount(String content, Set wordset) { if (string.isNullOrEmpty(content)) return WordStats.EMPTY; WordStats ws = new WordStats(); @@ -103,7 +120,7 @@ public static WordStats getStopWordCount(String content) { String word = words[i]; if (string.isNullOrEmpty(word)) continue; String wordLower = word.toLowerCase(); - if (STOP_WORDS.contains(wordLower)) + if (wordset.contains(wordLower)) stopWords.add(wordLower); } diff --git a/src/test/java/com/jimplush/goose/GermanGoldSitesTest.java b/src/test/java/com/jimplush/goose/GermanGoldSitesTest.java new file mode 100644 index 000000000..864d038c9 --- /dev/null +++ b/src/test/java/com/jimplush/goose/GermanGoldSitesTest.java @@ -0,0 +1,205 @@ +package com.jimplush.goose; + +import junit.framework.TestCase; + +import com.jimplush.goose.images.Image; +import com.jimplush.goose.texthelpers.StopWords; + + +public class GermanGoldSitesTest extends TestCase { + private static final Configuration DEFAULT_CONFIG = new Configuration(); + private static final Configuration NO_IMAGE_CONFIG = new Configuration(); + + static { + NO_IMAGE_CONFIG.setEnableImageFetching(false); + NO_IMAGE_CONFIG.setStopWords(StopWords.DE); + DEFAULT_CONFIG.setStopWords(StopWords.DE); + } + + protected enum Site { + SPIEGEL_ONLINE( + "http://www.spiegel.de/netzwelt/web/0,1518,778965,00.html", + "Nordkoreas Netz-Kriminelle: Die Hacker vom Büro 39", + "Sie sollen über Jahre hinweg Multiplayer-Rollenspiele manipuliert und Millionen Dollar erbeutet haben", + "Für Nordkoreas Atomprogramm jedenfalls wären die Gelder der Gaming-Hacker wohl nicht mehr als ein Almosen.", + "http://www.spiegel.de/images/image-64859-thumb-fxjx.jpg"), + HEISE( + "http://www.heise.de/newsticker/meldung/HP-Chef-Wir-erleben-einen-entscheidenden-Moment-in-unserer-Geschichte-1327391.html", + "HP-Chef: "Wir erleben einen entscheidenden Moment in unserer Geschichte"", + "Nach dem drastischen Kurseinbruch der Aktie von Hewlett-Packard will Konzernchef Léo Apotheker bei Investoren für seinen radikalen Umbauplan werben.", + "Im vorbörslichen Handel in New York stieg der HP-Kurs um 1,44 Prozent.", + null), + WELT( + "http://www.welt.de/kultur/kino/article13552679/Wenn-der-Dude-zum-kollektiven-Ommm-ruft.html", + ""The Big Lebowski": Wenn der Dude zum kollektiven "Ommm!" ruft", + "Den Kulftfilm \"The Big Lebowski\" gibt es nun auch auf Blue-ray. Die Schauspieler samt Hauptdarsteller Jeff Bridges feierten den Termin als eine Art Klassentreffen.", + "Darauf der Saal, begeistert und meditativ: „Ommm!“ Damit war alles gesagt.", + null), + BILD( + "http://www.bild.de/geld/wirtschaft/rentner/660000-rentner-brauchen-neben-job-von-wegen-ruhestand-19522242.bild.html", + "Von wegen Ruhestand: 660 000 Rentner brauchen Neben-Job", + "Eine wachsende Zahl von Rentnern muss einem Zeitungsbericht zufolge zusätzlich arbeiten oder die staatliche Grundsicherung beantragen, um über die Runden zu kommen.", + "teilte das Sozialministerium dem Bericht zufolge mit.", + "http://bilder.bild.de/fotos/rentner-22430705-mfbq-19522260/Bild/2.bild.jpg"), + SZ("http://www.sueddeutsche.de/sport/-fc-koeln-am-tabellenende-fussball-revolution-am-niederrhein-1.1133417", + "Fußball-Revolution am Niederrhein", + "Ein Wochenende genügt, um die Machtverhältnisse am Niederrhein zu erschüttern", + "Und wenn's nur für einen einzigen Freitagabend ist.", // last space is non breaking + null), + TAGESSCHAU( + "http://www.tagesschau.de/ausland/libyen1238.html", + "Rebellen erreichen das Zentrum von Tripolis", + "Die 42-jährige Herrschaft von Libyens Machthaber Muammar al Gaddafi steht offenbar kurz vor dem Zusammenbruch", + "Südafrika dementierte die Berichte jedoch und teilte mit, Gaddafi habe nicht um Asyl gebeten.", + null); + + private final String url, title, start, end, image; + + private Site(String url, String title, String start, String end) { + this(url, title, start, end, null); + } + private Site(String url, String title, String start, String end, String image) { + this.url = url; + this.title = title; + this.start = start; + this.end = end; + this.image = image; + } + + public String getUrl() { + return url; + } + + public String getTitle() { + return title; + } + + public String getStart() { + return start; + } + + public String getEnd() { + return end; + } + + public String getImage() { + return image; + } + } + + public void testSpiegelOnline() { + Article article = getArticle(Site.SPIEGEL_ONLINE, true); + + runArticleAssertions(Site.SPIEGEL_ONLINE, article); + } + + public void testHeise() { + Article article = getArticle(Site.HEISE, false); + + runArticleAssertions(Site.HEISE, article); + } + + public void testWelt() { + Article article = getArticle(Site.WELT, false); + + runArticleAssertions(Site.WELT, article); + } + + public void testBild() { + Article article = getArticle(Site.BILD, true); + + runArticleAssertions(Site.BILD, article); + } + + public void testSZ() { + Article article = getArticle(Site.SZ, false); + + runArticleAssertions(Site.SZ, article); + } + + public void testTagesschau() { + Article article = getArticle(Site.TAGESSCHAU, false); + + + runArticleAssertions(Site.TAGESSCHAU, article); + } + + private Article getArticle(Site site, boolean fetchImages) { + return getArticle(site, fetchImages ? DEFAULT_CONFIG : NO_IMAGE_CONFIG); + } + + protected Article getArticle(Site site, Configuration config) { + ContentExtractor extractor = new ContentExtractor(config); + return extractor.extractContent(site.getUrl()); + } + + private static final char NL = '\n'; + private static final char TAB = '\t'; + private static StringBuilder tagReport = new StringBuilder("=======================::. TAG REPORT .::======================\n"); + + private void runArticleAssertions(Site site, Article article) { + assertNotNull("Resulting article was NULL!", article); + + if (article.getTags().size() > 0) { + tagReport.append("BEGIN URL:").append(TAB).append(article.getCanonicalLink()).append(NL).append(TAB); + tagReport.append("Extracted: ").append(article.getTags().size()).append(" TAGs").append(NL); + int i = 0; + for (String tag : article.getTags()) { + tagReport.append(TAB).append(TAB).append("# ").append(++i).append(": ").append(tag).append(NL); + } + tagReport.append("END URL:").append(TAB).append(article.getCanonicalLink()).append(NL); + } + + String expectedTitle = site.getTitle(); + if (expectedTitle != null) { + String title = article.getTitle(); + assertNotNull("Title was NULL!", title); + assertEquals("Expected title was not returned!", expectedTitle, title); + } + + String expectedStart = site.getStart(); + if (expectedStart != null) { + String articleText = article.getCleanedArticleText(); + assertNotNull("Resulting article text was NULL!", articleText); + assertTrue("Article text was not as long as expected beginning!", expectedStart.length() <= articleText.length()); + String actual = articleText.substring(0, expectedStart.length()); + assertEquals("The beginning of the article text was not as expected!", expectedStart, actual); + } + + String expectedImage = site.getImage(); + if (expectedImage != null) { + Image image = article.getTopImage(); + assertNotNull("Top image was NULL!", image); + String src = image.getImageSrc(); + assertNotNull("Image src was NULL!", src); + assertEquals("Image src was not as expected!", expectedImage, src); + } + +// if (expectedDescription != null) { +// String description = article.getMetaDescription(); +// assertNotNull("Meta Description was NULL!", description); +// assertEquals("Meta Description was not as expected!", expectedDescription, description); +// } +// +// if (expectedKeywords != null) { +// String keywords = article.getMetaKeywords(); +// assertNotNull("Meta Keywords was NULL!", keywords); +// assertEquals("Meta Keywords was not as expected!", expectedKeywords, keywords); +// } + + String expectedEnd = site.getEnd(); + if (expectedEnd != null) { + String articleText = article.getCleanedArticleText(); + assertNotNull("Resulting article text was NULL!", articleText); + assertTrue("Article text was not as long as expected ending!", expectedEnd.length() <= articleText.length()); + assertTrue(articleText.length() - expectedEnd.length() > 0); + String actual = articleText.substring(articleText.length() - expectedEnd.length() - 2, articleText.length()).trim(); + assertEquals("The ending of the article text was not as expected!", expectedEnd, actual); + } + } + + protected static void printReport() { + System.out.print(tagReport); + } +} + From af4a4bd1ec78c373c9c94b9ccf360271443de2a8 Mon Sep 17 00:00:00 2001 From: Andrew Lin Date: Wed, 24 Aug 2011 16:40:08 -0400 Subject: [PATCH 043/347] grab more images in goose --- src/main/java/com/jimplush/goose/ContentExtractor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java index 2be660140..7b1ed6379 100644 --- a/src/main/java/com/jimplush/goose/ContentExtractor.java +++ b/src/main/java/com/jimplush/goose/ContentExtractor.java @@ -189,7 +189,7 @@ public Article performExtraction(String urlToCrawl, String rawHtml) { if (config.isEnableImageFetching()) { HttpClient httpClient = HtmlFetcher.getHttpClient(); imageExtractor = getImageExtractor(httpClient, urlToCrawl); - article.setTopImage(imageExtractor.getBestImage(doc, article.getTopNode())); + article.setTopImage(imageExtractor.getBestImage(doc, doc.body())); ArrayList imageCandidates = new ArrayList(); Iterator iter = imageExtractor.getAllImages().iterator(); while (iter.hasNext()) { From c4187fd6e7d4f91caa98123c3dc7b28573c819e1 Mon Sep 17 00:00:00 2001 From: nator Date: Tue, 6 Sep 2011 13:38:13 -0500 Subject: [PATCH 044/347] allow main content to not use p tags (fix for our archive with bad html) --- .../goose/outputformatters/DefaultOutputFormatter.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java b/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java index f85ff611a..de3dfd068 100644 --- a/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java +++ b/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java @@ -77,7 +77,12 @@ public String getFormattedText(Element topNode) { removeParagraphsWithFewWords(); - return getFormattedText(); + String out = getFormattedText(); + // NS - some archive content doesn't have p tags... + if (out.equals("")) { + out = StringEscapeUtils.unescapeHtml(this.topNode.text()).trim(); + } + return out; } /** From 4dfd41f05e8c13bd2532c6979d9ab1f183670c4f Mon Sep 17 00:00:00 2001 From: nator Date: Wed, 7 Sep 2011 13:13:42 -0500 Subject: [PATCH 045/347] another special case for our terrible content --- src/main/java/com/jimplush/goose/ContentExtractor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java index 501600d7c..c8f1c6aa2 100644 --- a/src/main/java/com/jimplush/goose/ContentExtractor.java +++ b/src/main/java/com/jimplush/goose/ContentExtractor.java @@ -894,7 +894,8 @@ private Element cleanupNode(Element node) { // their next siblings to avoid getting img bylines // first let's remove any element that now doesn't have any p tags at all Elements subParagraphs2 = e.getElementsByTag("p"); - if (subParagraphs2.size() == 0 && !e.tagName().equals("td")) { + //if (subParagraphs2.size() == 0 && !e.tagName().equals("td")) { + if (!this.link.startsWith("http://www.walkerart.org/archive/") && subParagraphs2.size() == 0 && !e.tagName().equals("td")) { if (logger.isDebugEnabled()) { logger.debug("Removing node because it doesn't have any paragraphs"); } From f7b7427c89351a7822a88b7698427884f58b6633 Mon Sep 17 00:00:00 2001 From: nator Date: Tue, 13 Sep 2011 14:40:08 -0500 Subject: [PATCH 046/347] image fix and safety check in titles --- src/main/java/com/jimplush/goose/ContentExtractor.java | 2 +- src/main/java/com/jimplush/goose/images/BestImageGuesser.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java index c8f1c6aa2..c85904fb5 100644 --- a/src/main/java/com/jimplush/goose/ContentExtractor.java +++ b/src/main/java/com/jimplush/goose/ContentExtractor.java @@ -389,7 +389,7 @@ private String doTitleSplits(String title, StringSplitter splitter) { String[] titlePieces = splitter.split(title); - if (this.link.contains("blogs.walkerart.org")) { + if (this.link.contains("blogs.walkerart.org") && titlePieces.length > 1) { // it's always the second one!! return TITLE_REPLACEMENTS.replaceAll(titlePieces[1]).trim(); } diff --git a/src/main/java/com/jimplush/goose/images/BestImageGuesser.java b/src/main/java/com/jimplush/goose/images/BestImageGuesser.java index a18882a84..74045d85c 100644 --- a/src/main/java/com/jimplush/goose/images/BestImageGuesser.java +++ b/src/main/java/com/jimplush/goose/images/BestImageGuesser.java @@ -309,7 +309,9 @@ private void checkForLargeImages(Element node, int parentDepth, int siblingDepth if (logger.isDebugEnabled()) { logger.debug("unable to find a large image, going to fall back modez. depth: " + parentDepth); } - if (parentDepth < 2) { + //if (parentDepth < 2) { + // try harder on our archive + if (parentDepth < 2 || (this.targetUrl.startsWith("http://www.walkerart.org/archive") && (this.image.getImageSrc() == null) && parentDepth<4)) { // we start at the top node then recursively go up to siblings/parent/grandparent to find something good From 5a710e4865da909648ee0104bd7274d76d70ba72 Mon Sep 17 00:00:00 2001 From: nator Date: Wed, 14 Sep 2011 10:01:34 -0500 Subject: [PATCH 047/347] bad hacky code to get a date I need --- .../com/jimplush/goose/Configuration.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/main/java/com/jimplush/goose/Configuration.java b/src/main/java/com/jimplush/goose/Configuration.java index 94972bfdc..85f6a69f5 100644 --- a/src/main/java/com/jimplush/goose/Configuration.java +++ b/src/main/java/com/jimplush/goose/Configuration.java @@ -24,7 +24,13 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.jsoup.nodes.*; +import org.jsoup.select.Elements; +import org.jsoup.select.Selector; +import com.jimplush.goose.texthelpers.*; + import java.util.Date; +import java.text.SimpleDateFormat; import java.util.Map; /** @@ -70,6 +76,23 @@ public class Configuration { private PublishDateExtractor publishDateExtractor = new PublishDateExtractor() { @Override public Date extract(Element rootElement) { + // this belongs in a separate class as a proper Date Extractor. But... + // for now this knows how to pull dates out of mnartists articles + Elements body = rootElement.select("div[class=articleBody]"); + try { + if (body.size() > 0) { + Elements ems = body.first().select("em"); + if (ems.size() > 0) { + String em = ems.first().text(); + String date_str = string.isNullOrEmpty(em) ? string.empty : em.trim(); + logger.error(date_str); + Date date = new SimpleDateFormat("MMM dd, yyyy").parse(date_str); + return date; + } + } + } catch (java.text.ParseException e) { + // ignore it + } return null; } }; From 6c919fb1e545e5f3b19f95d98d81419f597b51bb Mon Sep 17 00:00:00 2001 From: nator Date: Fri, 30 Sep 2011 17:09:49 -0500 Subject: [PATCH 048/347] hacky hack for getting multiple images in order --- .../com/jimplush/goose/ContentExtractor.java | 20 ++++++- .../goose/images/BestImageGuesser.java | 59 +++++++++++++++---- .../jimplush/goose/images/ImageExtractor.java | 2 +- 3 files changed, 69 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java index c85904fb5..4f80d3284 100644 --- a/src/main/java/com/jimplush/goose/ContentExtractor.java +++ b/src/main/java/com/jimplush/goose/ContentExtractor.java @@ -192,6 +192,7 @@ public Article performExtraction(String urlToCrawl, String rawHtml) { HttpClient httpClient = HtmlFetcher.getHttpClient(); imageExtractor = getImageExtractor(httpClient, urlToCrawl); article.setTopImage(imageExtractor.getBestImage(doc, article.getTopNode())); + article.setImageCandidates(imageExtractor.getAllImages()); } @@ -393,6 +394,10 @@ private String doTitleSplits(String title, StringSplitter splitter) { // it's always the second one!! return TITLE_REPLACEMENTS.replaceAll(titlePieces[1]).trim(); } + if (this.link.contains("mnartists.org") && titlePieces.length > 1) { + // it's always the second one!! + return TITLE_REPLACEMENTS.replaceAll(titlePieces[1]).trim(); + } // take the largest split for (int i = 0; i < titlePieces.length; i++) { @@ -436,7 +441,20 @@ private String getMetaKeywords(Document doc) { private String getCanonicalLink(Document doc, String baseUrl) { Elements meta = doc.select("link[rel=canonical]"); if (meta.size() > 0) { - String href = meta.first().attr("href"); + String canonicalUrl = meta.first().attr("href"); + URL url = null; + String href = string.empty; + try { + if (!canonicalUrl.startsWith("http://")) { + url = new URL(new URL("http://"+getDomain(baseUrl)), canonicalUrl); + } else { + url = new URL(canonicalUrl); + } + href = url.toString(); + } catch (MalformedURLException e) { + logger.error(e.toString(), e); + } + return string.isNullOrEmpty(href) ? string.empty : href.trim(); } else { return baseUrl; diff --git a/src/main/java/com/jimplush/goose/images/BestImageGuesser.java b/src/main/java/com/jimplush/goose/images/BestImageGuesser.java index 74045d85c..7cfbf9372 100644 --- a/src/main/java/com/jimplush/goose/images/BestImageGuesser.java +++ b/src/main/java/com/jimplush/goose/images/BestImageGuesser.java @@ -40,6 +40,11 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Iterator; +import java.util.Collections; +import java.util.LinkedHashMap; import java.util.HashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -90,6 +95,8 @@ public class BestImageGuesser implements ImageExtractor { * holds the result of our image extraction */ Image image; + + ArrayList images; /** @@ -232,10 +239,41 @@ private boolean checkForLinkTag() { } } - public ArrayList getAllImages() { - return null; //To change body of implemented methods use File | Settings | File Templates. + public ArrayList getAllImages() { + return this.images; //To change body of implemented methods use File | Settings | File Templates. } + + public LinkedHashMap sortHashMapByValuesD(HashMap passedMap) { + List mapKeys = new ArrayList(passedMap.keySet()); + List mapValues = new ArrayList(passedMap.values()); + Collections.sort(mapValues, Collections.reverseOrder()); + //Collections.sort(mapKeys); + + LinkedHashMap sortedMap = + new LinkedHashMap(); + + Iterator valueIt = mapValues.iterator(); + while (valueIt.hasNext()) { + Object val = valueIt.next(); + Iterator keyIt = mapKeys.iterator(); + + while (keyIt.hasNext()) { + Object key = keyIt.next(); + Object comp1 = passedMap.get(key); + Object comp2 = val; + + if (comp1.equals(comp2)){ + //passedMap.remove(key); + mapKeys.remove(key); + sortedMap.put(key, (Float)val); + break; + } + + } + } + return sortedMap; + } /** * although slow the best way to determine the best image is to download them and check the actual dimensions of the image when on disk @@ -274,19 +312,20 @@ private void checkForLargeImages(Element node, int parentDepth, int siblingDepth } HashMap imageResults = downloadImagesAndGetResults(goodImages, parentDepth); - - + + LinkedHashMap sortedImages = sortHashMapByValuesD(imageResults); + // pick out image with high score Element highScoreImage = null; - for (Element image : imageResults.keySet()) { + int i = 0; + this.images = new ArrayList(); + for (Object obj : sortedImages.keySet()) { + Element image = (Element)obj; + //logger.error(image.attr("src")); if (highScoreImage == null) { highScoreImage = image; - } else { - - if (imageResults.get(image) > imageResults.get(highScoreImage)) { - highScoreImage = image; - } } + this.images.add(image.attr("src")); } if (highScoreImage != null) { diff --git a/src/main/java/com/jimplush/goose/images/ImageExtractor.java b/src/main/java/com/jimplush/goose/images/ImageExtractor.java index cb58bc908..b8adc5880 100644 --- a/src/main/java/com/jimplush/goose/images/ImageExtractor.java +++ b/src/main/java/com/jimplush/goose/images/ImageExtractor.java @@ -42,6 +42,6 @@ public interface ImageExtractor { * return all the image candidates we think we have * @return */ - public ArrayList getAllImages(); + public ArrayList getAllImages(); } From 3abbe3eb648cf107d8110948d7caec418de1841b Mon Sep 17 00:00:00 2001 From: nator Date: Fri, 30 Sep 2011 20:34:50 -0500 Subject: [PATCH 049/347] fix our teen blogs -- different special case --- src/main/java/com/jimplush/goose/ContentExtractor.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java index 4f80d3284..eb8b36991 100644 --- a/src/main/java/com/jimplush/goose/ContentExtractor.java +++ b/src/main/java/com/jimplush/goose/ContentExtractor.java @@ -390,6 +390,10 @@ private String doTitleSplits(String title, StringSplitter splitter) { String[] titlePieces = splitter.split(title); + if (this.link.contains("blogs.walkerart.org/teens/") && titlePieces.length > 2) { + // it's always the third one!! + return TITLE_REPLACEMENTS.replaceAll(titlePieces[2]).trim(); + } if (this.link.contains("blogs.walkerart.org") && titlePieces.length > 1) { // it's always the second one!! return TITLE_REPLACEMENTS.replaceAll(titlePieces[1]).trim(); From c4c01ba6b473ba93ad476160bbe0687c163a6252 Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Mon, 21 Nov 2011 10:41:41 +0100 Subject: [PATCH 050/347] Added class to dropcap selector --- .../com/jimplush/goose/cleaners/DefaultDocumentCleaner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java b/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java index bff7b8118..fb365531f 100644 --- a/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java +++ b/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java @@ -252,7 +252,7 @@ private Document cleanEmTags(Document doc) { * remove those css drop caps where they put the first letter in big text in the 1st paragraph */ private Document removeDropCaps(Document doc) { - Elements items = doc.select("span[class~=(dropcap|drop_cap)]"); + Elements items = doc.select("span[class~=(dropcap|drop_cap|firstLetter)]"); if (logger.isDebugEnabled()) { logger.debug("Cleaning " + items.size() + " dropcap tags"); } From 23af9fb424e9cc4278b4ea8d50c8e9ab0548f699 Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Mon, 21 Nov 2011 10:42:12 +0100 Subject: [PATCH 051/347] Added some test cases, disabled image fetching --- .../jimplush/goose/GermanGoldSitesTest.java | 50 +++++++++++++++++-- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git a/src/test/java/com/jimplush/goose/GermanGoldSitesTest.java b/src/test/java/com/jimplush/goose/GermanGoldSitesTest.java index 864d038c9..4a9a52ab9 100644 --- a/src/test/java/com/jimplush/goose/GermanGoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GermanGoldSitesTest.java @@ -22,7 +22,7 @@ protected enum Site { "Nordkoreas Netz-Kriminelle: Die Hacker vom Büro 39", "Sie sollen über Jahre hinweg Multiplayer-Rollenspiele manipuliert und Millionen Dollar erbeutet haben", "Für Nordkoreas Atomprogramm jedenfalls wären die Gelder der Gaming-Hacker wohl nicht mehr als ein Almosen.", - "http://www.spiegel.de/images/image-64859-thumb-fxjx.jpg"), + null), HEISE( "http://www.heise.de/newsticker/meldung/HP-Chef-Wir-erleben-einen-entscheidenden-Moment-in-unserer-Geschichte-1327391.html", "HP-Chef: "Wir erleben einen entscheidenden Moment in unserer Geschichte"", @@ -40,7 +40,7 @@ protected enum Site { "Von wegen Ruhestand: 660 000 Rentner brauchen Neben-Job", "Eine wachsende Zahl von Rentnern muss einem Zeitungsbericht zufolge zusätzlich arbeiten oder die staatliche Grundsicherung beantragen, um über die Runden zu kommen.", "teilte das Sozialministerium dem Bericht zufolge mit.", - "http://bilder.bild.de/fotos/rentner-22430705-mfbq-19522260/Bild/2.bild.jpg"), + null), SZ("http://www.sueddeutsche.de/sport/-fc-koeln-am-tabellenende-fussball-revolution-am-niederrhein-1.1133417", "Fußball-Revolution am Niederrhein", "Ein Wochenende genügt, um die Machtverhältnisse am Niederrhein zu erschüttern", @@ -51,8 +51,33 @@ protected enum Site { "Rebellen erreichen das Zentrum von Tripolis", "Die 42-jährige Herrschaft von Libyens Machthaber Muammar al Gaddafi steht offenbar kurz vor dem Zusammenbruch", "Südafrika dementierte die Berichte jedoch und teilte mit, Gaddafi habe nicht um Asyl gebeten.", + null), + STERN1( + "http://www.stern.de/tv/sterntv/stern-tv-test-die-verkaufstricks-der-supermaerkte-1719541.html", + "stern TV-Test: Die Verkaufstricks der Supermärkte - Stern TV", + "Was liegt wo? Wie wird es beleuchtet? Und wie kann man teure Markenware am besten unter die Kunden bringen?", + "6. Günstige Produkte stehen im Supermarktregal unten, teure in Blickhöhe.", + null), + STERN2( + "http://www.stern.de/tv/sterntv/fairer-preis-fuers-mobiliar-wohnungsaufloeser-im-test-1719558.html", + "Fairer Preis fürs Mobiliar?: Wohnungsauflöser im Test - Stern TV", + "Eine neue Liebe, ein besserer Job oder einfach nur mehr Platz", + "Nur das Angebot eines Unternehmens war mit 3500 Euro halbwegs angemessen.", + null), + STERN3( + "http://www.stern.de/tv/sterntv/tageloehner-und-multijobber-ich-will-kein-sozialschmarotzer-sein-1719551.html", + "Tagelöhner und Multijobber: "Ich will kein Sozialschmarotzer sein!" - Stern TV", + "Arbeiten um jeden Preis, wenn es sein muss rund um die Uhr, sechs Tage die Woche: Für Manuela Kopp ist das der Alltag.", + "und einfach zu Hause bleiben\", erzählt er bei stern TV.", + null), + T3N( + "http://t3n.de/news/android-verdoppelt-marktanteil-liegt-ios-343437/", + "Android verdoppelt Marktanteil und liegt vor iOS", + "Android liegt jetzt weltweit vor iOS.", + "iOS folgt auf dem dritten Platz mit 15 Prozent noch nach Symbian mit 16,9 Prozent.", null); + private final String url, title, start, end, image; private Site(String url, String title, String start, String end) { @@ -88,7 +113,7 @@ public String getImage() { } public void testSpiegelOnline() { - Article article = getArticle(Site.SPIEGEL_ONLINE, true); + Article article = getArticle(Site.SPIEGEL_ONLINE, false); runArticleAssertions(Site.SPIEGEL_ONLINE, article); } @@ -106,7 +131,7 @@ public void testWelt() { } public void testBild() { - Article article = getArticle(Site.BILD, true); + Article article = getArticle(Site.BILD, false); runArticleAssertions(Site.BILD, article); } @@ -120,10 +145,25 @@ public void testSZ() { public void testTagesschau() { Article article = getArticle(Site.TAGESSCHAU, false); - runArticleAssertions(Site.TAGESSCHAU, article); } + public void testStern() { + Article article = getArticle(Site.STERN1, false); + runArticleAssertions(Site.STERN1, article); + + Article article2 = getArticle(Site.STERN2, false); + runArticleAssertions(Site.STERN2, article2); + + Article article3 = getArticle(Site.STERN3, false); + runArticleAssertions(Site.STERN3, article3); + } + + public void testT3n() { + Article article = getArticle(Site.T3N, false); + runArticleAssertions(Site.T3N, article); + } + private Article getArticle(Site site, boolean fetchImages) { return getArticle(site, fetchImages ? DEFAULT_CONFIG : NO_IMAGE_CONFIG); } From d3ddc6f76cdcbcf19aaa6c27fe172696d56ccc05 Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Mon, 21 Nov 2011 13:31:28 +0100 Subject: [PATCH 052/347] Added whitelist to prevent important nodes from being removed --- .../cleaners/DefaultDocumentCleaner.java | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java b/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java index fb365531f..c75d9ad0f 100644 --- a/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java +++ b/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java @@ -28,6 +28,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.HashSet; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -65,13 +67,23 @@ public class DefaultDocumentCleaner implements DocumentCleaner { private static final Pattern facebookPattern = Pattern.compile("[^-]facebook"); private static final Pattern twitterPattern = Pattern.compile("[^-]twitter"); + private static final Set tagWhitelist = new HashSet() { + + private static final long serialVersionUID = 1L; + + { + add("body"); + add("article"); + } + }; + static { StringBuilder sb = new StringBuilder(); // create negative elements sb.append("^side$|combx|retweet|menucontainer|navbar|comment|PopularQuestions|contact|foot|footer|Footer|footnote|cnn_strycaptiontxt|meta$|scroll|shoutbox|sponsor"); sb.append("|tags|socialnetworking|socialNetworking|cnnStryHghLght|cnn_stryspcvbx|^inset$|pagetools|post-attributes|welcome_form|contentTools2|the_answers"); - sb.append("|communitypromo|subscribe|vcard|articleheadings|date|print|popup|author-dropdown|tools|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text"); + sb.append("|communitypromo|subscribe|vcard|articleheadings|date|print|popup|author-dropdown|tools|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text|.*next.*"); regExRemoveNodes = sb.toString(); queryNaughtyIDs = "[id~=(" + regExRemoveNodes + ")]"; queryNaughtyClasses = "[class~=(" + regExRemoveNodes + ")]"; @@ -277,7 +289,7 @@ private Document cleanBadTags(Document doc) { if (logger.isDebugEnabled()) { logger.debug("Cleaning: Removing node with id: " + node.id()); } - removeNode(node); + safelyRemoveNode(node); } if (logger.isDebugEnabled()) { Elements naughtyList2 = children.select(queryNaughtyIDs); @@ -292,7 +304,7 @@ private Document cleanBadTags(Document doc) { if (logger.isDebugEnabled()) { logger.debug("clean: Removing node with class: " + node.className()); } - removeNode(node); + safelyRemoveNode(node); } if (logger.isDebugEnabled()) { Elements naughtyList4 = children.select(queryNaughtyClasses); @@ -308,7 +320,7 @@ private Document cleanBadTags(Document doc) { if (logger.isDebugEnabled()) { logger.debug("clean: Removing node with class: " + node.attr("class") + " id: " + node.id() + " name: " + node.attr("name")); } - removeNode(node); + safelyRemoveNode(node); } return doc; @@ -324,6 +336,15 @@ private void removeNode(Element node) { node.remove(); } + /** + * Removes nodes but makes sure not to remove to much. + * @param node + */ + private void safelyRemoveNode(Element node) { + if (tagWhitelist.contains(node.tagName())) return; + + node.remove(); + } /** * removes nodes that may have a certain pattern that matches against a class or id tag * @@ -337,7 +358,7 @@ private Document removeNodesViaRegEx(Document doc, Pattern pattern) { logger.debug("regExRemoveNodes: " + naughtyList.size() + " ID elements found against pattern: " + pattern); } for (Element node : naughtyList) { - removeNode(node); + safelyRemoveNode(node); } Elements naughtyList3 = doc.getElementsByAttributeValueMatching("class", pattern); @@ -345,7 +366,7 @@ private Document removeNodesViaRegEx(Document doc, Pattern pattern) { logger.debug("regExRemoveNodes: " + naughtyList3.size() + " CLASS elements found against pattern: " + pattern); } for (Element node : naughtyList3) { - removeNode(node); + safelyRemoveNode(node); } } catch (IllegalArgumentException e) { e.printStackTrace(); From 8d85978749eddf235d2b2e93f05d9df8b8ddace6 Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Mon, 21 Nov 2011 13:37:52 +0100 Subject: [PATCH 053/347] Removed testESPN2, page changed --- src/test/java/com/jimplush/goose/GoldSitesTest.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/test/java/com/jimplush/goose/GoldSitesTest.java b/src/test/java/com/jimplush/goose/GoldSitesTest.java index 3fc83ab7e..dc8feddbb 100644 --- a/src/test/java/com/jimplush/goose/GoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GoldSitesTest.java @@ -145,14 +145,6 @@ public void testESPN() { runArticleAssertions(article, "If you believe what college football coaches have said about sports", "http://a.espncdn.com/photo/2010/0813/ncf_i_mpouncey1_300.jpg"); } - public void testESPN2() { - - String url = "http://sports.espn.go.com/golf/pgachampionship10/news/story?id=5463456"; - Article article = getArticle(url); - - runArticleAssertions(article, "SHEBOYGAN, Wis. -- The only number that matters at the PGA Championship", "http://a.espncdn.com/media/motion/2010/0813/dm_100814_pga_rinaldi.jpg"); - } - public void testWashingtonPost() { String url = "http://www.washingtonpost.com/wp-dyn/content/article/2010/12/08/AR2010120803185.html"; From ec250ff27d4d684e68377e5b6af8316640c0bb6b Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Mon, 21 Nov 2011 13:38:40 +0100 Subject: [PATCH 054/347] Fixed testYahooNews Replaced article, was no longer available --- src/test/java/com/jimplush/goose/GoldSitesTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/com/jimplush/goose/GoldSitesTest.java b/src/test/java/com/jimplush/goose/GoldSitesTest.java index dc8feddbb..f238c8646 100644 --- a/src/test/java/com/jimplush/goose/GoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GoldSitesTest.java @@ -283,10 +283,10 @@ public void testCnet() { public void testYahooNews() { - String url = "http://news.yahoo.com/s/ap/20110319/ap_on_re_af/af_libya"; + String url = "http://news.yahoo.com/winners-losers-deficit-supercommittee-deadlock-110000379.html"; Article article = getArticle(url); - runArticleAssertions(article, "BENGHAZI, Libya – The U.S. and European nations pounded Libya", "http://d.yimg.com/a/p/ap/20110319/capt.1e039fdbcbe544ba84c6de6cb3e39d83-1e039fdbcbe544ba84c6de6cb3e39d83-0.jpg?x=213&y=160&xc=1&yc=1&wc=409&hc=307&q=85&sig=NPqjSiOj_KpSiJFh3BU_Qg--"); + runArticleAssertions(article, "With the deficit supercommittee charged with finding $1.2 trillion in savings teetering on the brink of failure", "http://l.yimg.com/bt/api/res/1.2/hWA73epNP1wC3uFj7OAGuQ--/YXBwaWQ9eW5ld3M7Zmk9ZmlsbDtoPTE1MDtweG9mZj01MDtweW9mZj0wO3c9MTUw/http://l.yimg.com/os/mit/media/p/common/images/y-bang-90323.png"); } public void testPolitico() { From 516e914d10635e3ac5e091a347c6a55f4cd3000b Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Mon, 21 Nov 2011 13:39:21 +0100 Subject: [PATCH 055/347] Fixed testNewsweek, image url changed. --- src/test/java/com/jimplush/goose/GoldSitesTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/jimplush/goose/GoldSitesTest.java b/src/test/java/com/jimplush/goose/GoldSitesTest.java index f238c8646..c20284066 100644 --- a/src/test/java/com/jimplush/goose/GoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GoldSitesTest.java @@ -302,7 +302,7 @@ public void testNewsweek() { String url = "http://www.newsweek.com/2010/10/09/how-moscow-s-war-on-islamist-rebels-is-backfiring.html"; Article article = getArticle(url); - runArticleAssertions(article, "The video shows a gun barrel jutting from the rear", "http://www.newsweek.com/content/newsweek/2010/10/09/how-moscow-s-war-on-islamist-rebels-is-backfiring/_jcr_content/body/mainimage.img.jpg/1286654107500.jpg"); + runArticleAssertions(article, "The video shows a gun barrel jutting from the rear", "http://www.thedailybeast.com/content/newsweek/2010/10/09/how-moscow-s-war-on-islamist-rebels-is-backfiring/_jcr_content/body/mainimage.img.jpg/1286654107500.jpg"); } public void testLifeHacker() { From bd65a32ab51606485dd70d60d594bf029e886668 Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Mon, 21 Nov 2011 13:39:56 +0100 Subject: [PATCH 056/347] Fixed testBloomber, image changed --- src/test/java/com/jimplush/goose/GoldSitesTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/jimplush/goose/GoldSitesTest.java b/src/test/java/com/jimplush/goose/GoldSitesTest.java index c20284066..5051ac260 100644 --- a/src/test/java/com/jimplush/goose/GoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GoldSitesTest.java @@ -370,7 +370,7 @@ public void testBloomberg() { String url = "http://www.bloomberg.com/news/2010-11-01/china-becomes-boss-in-peru-on-50-billion-mountain-bought-for-810-million.html"; Article article = getArticle(url); - runArticleAssertions(article, "The Chinese entrepreneur and the Peruvian shopkeeper", "http://www.bloomberg.com/apps/data?pid=avimage&iid=iimODmqjtcQU"); + runArticleAssertions(article, "The Chinese entrepreneur and the Peruvian shopkeeper", "http://www.bloomberg.com/image/i88bsAgSGvSY.jpg"); } public void testScientificDaily() { From 8c0c64ff256856dd1e31597cf03aa05850c072ed Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Mon, 21 Nov 2011 13:40:55 +0100 Subject: [PATCH 057/347] Fixed testLiveStrong, image changed --- src/test/java/com/jimplush/goose/GoldSitesTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/jimplush/goose/GoldSitesTest.java b/src/test/java/com/jimplush/goose/GoldSitesTest.java index 5051ac260..abfc9c67c 100644 --- a/src/test/java/com/jimplush/goose/GoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GoldSitesTest.java @@ -537,7 +537,7 @@ public void testLiveStrong() { runArticleAssertions( article, "Childhood obesity increases a young person", - "http://photos.demandstudios.com/getty/article/184/46/87576279_XS.jpg"); + "http://photos2.demandstudios.com/DM-Resize/photos.demandstudios.com/getty/article/184/46/87576279_XS.jpg?h=10000&w=267&keep_ratio=1"); } public void testLiveStrong2() { From cf296b243d824ddb6aaed1980d55c322f5ba4eba Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Mon, 21 Nov 2011 13:41:27 +0100 Subject: [PATCH 058/347] Fixed testLiveStrong2, image changed --- src/test/java/com/jimplush/goose/GoldSitesTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/jimplush/goose/GoldSitesTest.java b/src/test/java/com/jimplush/goose/GoldSitesTest.java index abfc9c67c..6904c6997 100644 --- a/src/test/java/com/jimplush/goose/GoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GoldSitesTest.java @@ -547,7 +547,7 @@ public void testLiveStrong2() { runArticleAssertions( article, "Resistance bands or tubes are named because", - "http://photos.demandstudios.com/getty/article/142/66/86504893_XS.jpg"); + "http://photos2.demandstudios.com/DM-Resize/photos.demandstudios.com/getty/article/142/66/86504893_XS.jpg?h=10000&w=267&keep_ratio=1"); } public void testCracked() { From b88d34009b461ae5b4c6a8aaa35aa0f80a6166e7 Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Mon, 21 Nov 2011 13:41:48 +0100 Subject: [PATCH 059/347] Fixed testCracked, image changed --- src/test/java/com/jimplush/goose/GoldSitesTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/jimplush/goose/GoldSitesTest.java b/src/test/java/com/jimplush/goose/GoldSitesTest.java index 6904c6997..94e73f676 100644 --- a/src/test/java/com/jimplush/goose/GoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GoldSitesTest.java @@ -557,7 +557,7 @@ public void testCracked() { runArticleAssertions( article, "Social networking is here to stay", - "http://i-beta.crackedcdn.com/phpimages/article/2/1/5/45215.jpg?v=1"); + "http://i.crackedcdn.com/phpimages/article/2/1/5/45215.jpg?v=1"); } public void testTrailsCom() { From 273edc119c8033cbf9ebf7c9d1fa07a9cbf2d4ab Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Mon, 21 Nov 2011 13:42:29 +0100 Subject: [PATCH 060/347] Fixed testTheSuperFicial, image changed --- src/test/java/com/jimplush/goose/GoldSitesTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/jimplush/goose/GoldSitesTest.java b/src/test/java/com/jimplush/goose/GoldSitesTest.java index 94e73f676..6ae004148 100644 --- a/src/test/java/com/jimplush/goose/GoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GoldSitesTest.java @@ -640,7 +640,7 @@ public void testTheSuperFicial() { runArticleAssertions( article, "Christ, did they all get implants?", - "http://cdn03.cdn.thesuperficial.com/wp-content/uploads/2011/04/0418-teen-mom-leah-messer-divorce-14-480x720.jpg"); + "http://cdn03.cdn.thesuperficial.com/wp-content/uploads/2011/04/0418-teen-mom-leah-messer-divorce-14-400x470.jpg"); } public void testScribd() { From cbe903212e5112a04fec3dfe4981a09d103b6fa4 Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Mon, 21 Nov 2011 13:43:25 +0100 Subject: [PATCH 061/347] Fixed testCatster, image changed --- src/test/java/com/jimplush/goose/GoldSitesTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/com/jimplush/goose/GoldSitesTest.java b/src/test/java/com/jimplush/goose/GoldSitesTest.java index 6ae004148..9036f119e 100644 --- a/src/test/java/com/jimplush/goose/GoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GoldSitesTest.java @@ -671,7 +671,6 @@ public void testDogster() { "http://www.theotherendoftheleash.com/theotherendoftheleash/uploads/2010/02/monkey-hugs-dog.jpg"); } - // todo we're mssing the first actual paragraph public void testCatster() { String url = "http://blogs.catster.com/kitty-news-network/2011/05/03/survey-cat-owners-prefer-the-adoption-option/"; Article article = getArticle(url); @@ -679,7 +678,7 @@ public void testCatster() { runArticleAssertions( article, "There’s good news in the air for shelter cats", - "http://b1.cdnsters.com/kitty-news-network/files/2011/05/thomas-and-dahlia-300x225.jpg"); + "http://blogs.catster.com/kitty-news-network/files/2011/05/thomas-and-dahlia-300x225.jpg"); } public void testScribd3() { From 88f324d22255abf66f9ea0aae5ed5ae157c81bba Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Mon, 21 Nov 2011 14:07:56 +0100 Subject: [PATCH 062/347] Fixed testLifeHacker, url has changed. They did away with hash-fragments and their redirect is based on JS. --- src/test/java/com/jimplush/goose/GoldSitesTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/jimplush/goose/GoldSitesTest.java b/src/test/java/com/jimplush/goose/GoldSitesTest.java index 9036f119e..9737c2236 100644 --- a/src/test/java/com/jimplush/goose/GoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GoldSitesTest.java @@ -307,7 +307,7 @@ public void testNewsweek() { public void testLifeHacker() { - String url = "http://lifehacker.com/#!5659837/build-a-rocket-stove-to-heat-your-home-with-wood-scraps"; + String url = "http://lifehacker.com/5659837/build-a-rocket-stove-to-heat-your-home-with-wood-scraps"; Article article = getArticle(url); runArticleAssertions(article, "If you find yourself with lots of leftover wood", "http://cache.gawker.com/assets/images/lifehacker/2010/10/rocket-stove-finished.jpeg"); From 8e525698fb6b477d2329b3efa4ebb46cbddc1776 Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Mon, 21 Nov 2011 14:09:16 +0100 Subject: [PATCH 063/347] Removed testStarMagazine, content is not available in Germany. --- src/test/java/com/jimplush/goose/GoldSitesTest.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/test/java/com/jimplush/goose/GoldSitesTest.java b/src/test/java/com/jimplush/goose/GoldSitesTest.java index 9737c2236..ee13ea786 100644 --- a/src/test/java/com/jimplush/goose/GoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GoldSitesTest.java @@ -348,15 +348,6 @@ public void testSportsIllustrated() { runArticleAssertions(article, "Many of you have written or tweeted to ask whether I'll be covering more", "http://i2.cdn.turner.com/si/2011/writers/peter_king/05/08/mmqb/jake-locker.jpg"); } - public void testStarMagazine() { - - String url = "http://www.starmagazine.com/news/17510?cid=RSS"; - Article article = getArticle(url); - - runArticleAssertions(article, "The Real Reason Rihanna Skipped Katy's Wedding: No Cell Phone Reception!", "Rihanna has admitted the real reason she was a no show at her", "http://www.starmagazine.com/sites/starmagazine.com/files/imagecache/node_page_image/article_images/Rihanna_1010_230.jpg"); - - } - public void testDailyBeast() { String url = "http://www.thedailybeast.com/blogs-and-stories/2010-11-01/ted-sorensen-speechwriter-behind-jfks-best-jokes/?cid=topic:featured1"; From 6a9c7b12dfa03a2fabe133fcc628fe9e38d61c2c Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Mon, 21 Nov 2011 14:12:55 +0100 Subject: [PATCH 064/347] Fixed testDailyBeast. Changed expected article beginning, skipping the teaser is fine. --- src/test/java/com/jimplush/goose/GoldSitesTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/jimplush/goose/GoldSitesTest.java b/src/test/java/com/jimplush/goose/GoldSitesTest.java index ee13ea786..8846fab09 100644 --- a/src/test/java/com/jimplush/goose/GoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GoldSitesTest.java @@ -353,7 +353,7 @@ public void testDailyBeast() { String url = "http://www.thedailybeast.com/blogs-and-stories/2010-11-01/ted-sorensen-speechwriter-behind-jfks-best-jokes/?cid=topic:featured1"; Article article = getArticle(url); - runArticleAssertions(article, "Legendary Kennedy speechwriter Ted Sorensen passed", "http://www.tdbimg.com/files/2010/11/01/img-article---katz-ted-sorensen_163531624950.jpg"); + runArticleAssertions(article, "Today, as wordsmiths, politicos and Kennedyophiles", "http://www.tdbimg.com/files/2010/11/01/img-article---katz-ted-sorensen_163531624950.jpg"); } public void testBloomberg() { From 9ab1a900bb59a4bd19a5c88fe266792a65d594ac Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Mon, 21 Nov 2011 14:19:03 +0100 Subject: [PATCH 065/347] Fixed testThe Frisky, image changed --- src/test/java/com/jimplush/goose/GoldSitesTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/jimplush/goose/GoldSitesTest.java b/src/test/java/com/jimplush/goose/GoldSitesTest.java index 8846fab09..faf7c9cf1 100644 --- a/src/test/java/com/jimplush/goose/GoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GoldSitesTest.java @@ -385,7 +385,7 @@ public void testTheFrisky() { String url = "http://www.thefrisky.com/post/246-rachel-dratch-met-her-baby-daddy-in-a-bar/?eref=RSS"; Article article = getArticle(url); - runArticleAssertions(article, "Rachel Dratch Met Her Baby Daddy At A Bar", "Rachel Dratch had been keeping the identity of her baby daddy ", "http://cdn.thefrisky.com/images/uploads/rachel_dratch_102810_m.jpg"); + runArticleAssertions(article, "Rachel Dratch Met Her Baby Daddy At A Bar", "Rachel Dratch had been keeping the identity of her baby daddy ", "http://cdn04.cdnwp.thefrisky.com/wp-content/uploads/2010/10/28/rachel_dratch_102810_m-200x300.jpg"); } public void testUniverseToday() { From ad887aff2a67d01cc4c8c09721c36f5fa784b6ee Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Mon, 21 Nov 2011 14:20:17 +0100 Subject: [PATCH 066/347] Fixed testDailyBeast, image changed. --- src/test/java/com/jimplush/goose/GoldSitesTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/jimplush/goose/GoldSitesTest.java b/src/test/java/com/jimplush/goose/GoldSitesTest.java index faf7c9cf1..a4eb2aa38 100644 --- a/src/test/java/com/jimplush/goose/GoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GoldSitesTest.java @@ -353,7 +353,7 @@ public void testDailyBeast() { String url = "http://www.thedailybeast.com/blogs-and-stories/2010-11-01/ted-sorensen-speechwriter-behind-jfks-best-jokes/?cid=topic:featured1"; Article article = getArticle(url); - runArticleAssertions(article, "Today, as wordsmiths, politicos and Kennedyophiles", "http://www.tdbimg.com/files/2010/11/01/img-article---katz-ted-sorensen_163531624950.jpg"); + runArticleAssertions(article, "Today, as wordsmiths, politicos and Kennedyophiles", "http://www.thedailybeast.com/content/dailybeast/articles/2010/11/01/ted-sorensen-speechwriter-behind-jfks-best-jokes/_jcr_content/body/image_0.img.jpg/1302761778490.jpg"); } public void testBloomberg() { From e2f51fe3cdf9a91bb67ef454c0adf1a26b061008 Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Mon, 21 Nov 2011 14:24:50 +0100 Subject: [PATCH 067/347] Fixed testMSBNC, replaced article. --- src/test/java/com/jimplush/goose/GoldSitesTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/java/com/jimplush/goose/GoldSitesTest.java b/src/test/java/com/jimplush/goose/GoldSitesTest.java index a4eb2aa38..9c8d875ba 100644 --- a/src/test/java/com/jimplush/goose/GoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GoldSitesTest.java @@ -439,14 +439,14 @@ public void testFoxSports() { public void testMSNBC() { - String url = "http://www.msnbc.msn.com/id/43085992/ns/business-stocks_and_economy/"; + String url = "http://www.msnbc.msn.com/id/45357269/ns/business-forbes_com/#.TspQjPHTRQI"; Article article = getArticle(url); runArticleAssertions( article, - "LinkedIn share price soars in market debut", - "There was an unmistakable echo of the dot-com boom Thursday", - "http://msnbcmedia1.msn.com/j/MSNBC/Components/Photo/_new/110519_linkedin_hmed_0755p.grid-6x2.jpg"); + "The Smart Fortwo and other car flops of 2011", + "John McElroy, the loquacious host of the Autoline Detroit TV and radio shows, is optimistic about the auto industry.", + "http://msnbcmedia1.msn.com/j/MSNBC/Components/Photo/_new/car flops-1.grid-6x2.jpg"); } From cc86016529a1c3004772e9e911383a02d8b59e2d Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Mon, 21 Nov 2011 14:26:18 +0100 Subject: [PATCH 068/347] Fixed testGawker, changed URL. They did away with hash-fragments and their redirect is based on JS. --- src/test/java/com/jimplush/goose/GoldSitesTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/jimplush/goose/GoldSitesTest.java b/src/test/java/com/jimplush/goose/GoldSitesTest.java index 9c8d875ba..8cc49a475 100644 --- a/src/test/java/com/jimplush/goose/GoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GoldSitesTest.java @@ -476,7 +476,7 @@ public void testTheAtlantic() { public void testGawker() { - String url = "http://gawker.com/#!5777023/charlie-sheen-is-going-to-haiti-with-sean-penn"; + String url = "http://gawker.com/5777023/charlie-sheen-is-going-to-haiti-with-sean-penn"; Article article = getArticle(url); runArticleAssertions( From 45718be98df419b9807cfd275ec8e938915cca4c Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Mon, 21 Nov 2011 15:42:09 +0100 Subject: [PATCH 069/347] Fixed safe removal of nodes --- .../com/jimplush/goose/cleaners/DefaultDocumentCleaner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java b/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java index c75d9ad0f..854ffc2e1 100644 --- a/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java +++ b/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java @@ -343,7 +343,7 @@ private void removeNode(Element node) { private void safelyRemoveNode(Element node) { if (tagWhitelist.contains(node.tagName())) return; - node.remove(); + removeNode(node); } /** * removes nodes that may have a certain pattern that matches against a class or id tag From f834c24d92b5d911bbdb233a99383a1bb410df76 Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Tue, 22 Nov 2011 09:50:32 +0100 Subject: [PATCH 070/347] fixed testYahooNews, removed image check. Yahoo has changing API keys in image URL. --- src/test/java/com/jimplush/goose/GoldSitesTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/com/jimplush/goose/GoldSitesTest.java b/src/test/java/com/jimplush/goose/GoldSitesTest.java index 8cc49a475..35380a069 100644 --- a/src/test/java/com/jimplush/goose/GoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GoldSitesTest.java @@ -286,7 +286,7 @@ public void testYahooNews() { String url = "http://news.yahoo.com/winners-losers-deficit-supercommittee-deadlock-110000379.html"; Article article = getArticle(url); - runArticleAssertions(article, "With the deficit supercommittee charged with finding $1.2 trillion in savings teetering on the brink of failure", "http://l.yimg.com/bt/api/res/1.2/hWA73epNP1wC3uFj7OAGuQ--/YXBwaWQ9eW5ld3M7Zmk9ZmlsbDtoPTE1MDtweG9mZj01MDtweW9mZj0wO3c9MTUw/http://l.yimg.com/os/mit/media/p/common/images/y-bang-90323.png"); + runArticleAssertions(article, "With the deficit supercommittee charged with finding $1.2 trillion in savings teetering on the brink of failure"); } public void testPolitico() { From a9728f33e3d256e4b3c45eed4a28e9fba7bf8bf7 Mon Sep 17 00:00:00 2001 From: Daniel Hepper Date: Thu, 8 Dec 2011 11:16:10 +0100 Subject: [PATCH 071/347] Made it language agnostic --- pom.xml | 4 +- .../com/jimplush/goose/ContentExtractor.java | 91 ++++++++++++------- .../cleaners/DefaultDocumentCleaner.java | 52 +++++------ .../jimplush/goose/network/HtmlFetcher.java | 1 + .../DefaultOutputFormatter.java | 41 ++++----- .../goose/texthelpers/TextScorer.java | 25 +++++ .../com/jimplush/goose/util/JsoupUtils.java | 15 +++ .../jimplush/goose/GermanGoldSitesTest.java | 6 +- .../com/jimplush/goose/GoldSitesTest.java | 86 +++++++++--------- 9 files changed, 188 insertions(+), 133 deletions(-) create mode 100644 src/main/java/com/jimplush/goose/texthelpers/TextScorer.java create mode 100644 src/main/java/com/jimplush/goose/util/JsoupUtils.java diff --git a/pom.xml b/pom.xml index 8249da181..79d03b11a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.jimplush goose - 1.4.1 + 1.4.1.1 jar goose @@ -37,7 +37,7 @@ org.jsoup jsoup - 1.5.2 + 1.6.1 commons-io diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java index 4c78c12cf..2f55921b4 100644 --- a/src/main/java/com/jimplush/goose/ContentExtractor.java +++ b/src/main/java/com/jimplush/goose/ContentExtractor.java @@ -25,6 +25,8 @@ import com.jimplush.goose.outputformatters.DefaultOutputFormatter; import com.jimplush.goose.outputformatters.OutputFormatter; import com.jimplush.goose.texthelpers.*; +import com.jimplush.goose.util.JsoupUtils; + import org.apache.commons.lang.StringEscapeUtils; import org.apache.http.client.HttpClient; import org.jsoup.nodes.*; @@ -202,7 +204,6 @@ public Article performExtraction(String urlToCrawl, String rawHtml) { article.setCleanedArticleText(outputFormatter.getFormattedText(article.getTopNode())); - if (logger.isDebugEnabled()) { logger.debug("FINAL EXTRACTION TEXT: \n" + article.getCleanedArticleText()); } @@ -225,7 +226,7 @@ public Article performExtraction(String urlToCrawl, String rawHtml) { logger.error("URL: " + urlToCrawl + " did not contain valid HTML to parse, exiting. " + e.toString()); } catch (Exception e) { logger.error("General Exception occured on url: " + urlToCrawl + " " + e.toString()); -// throw new RuntimeException(e); + throw new RuntimeException(e); } @@ -463,13 +464,7 @@ private Element calculateBestNodeBasedOnClustering(Document doc) { for (Element node : nodesToCheck) { - - String nodeText = node.text(); - WordStats wordStats = config.getStopWords().getStopWordCount(nodeText); - boolean highLinkDensity = isHighLinkDensity(node); - - - if (wordStats.getStopWordCount() > 2 && !highLinkDensity) { + if (!isHighLinkDensity(node)) { nodesWithText.add(node); } @@ -519,11 +514,10 @@ private Element calculateBestNodeBasedOnClustering(Document doc) { if (logger.isDebugEnabled()) { logger.debug("Location Boost Score: " + boostScore + " on interation: " + i + "' id='" + node.parent().id() + "' class='" + node.parent().attr("class")); } - String nodeText = node.text(); - WordStats wordStats = config.getStopWords().getStopWordCount(nodeText); - int upscore = (int) (wordStats.getStopWordCount() + boostScore); + int upscore = (int) (TextScorer.score(node.text()) + boostScore); + updateScore(node.parent(), upscore); - updateScore(node.parent().parent(), upscore / 2); + updateScore(node.parent().parent(), Math.max(0, upscore / 2 - 1)); updateNodeCount(node.parent(), 1); updateNodeCount(node.parent().parent(), 1); @@ -585,8 +579,6 @@ private Element calculateBestNodeBasedOnClustering(Document doc) { return topNode; - - } /** @@ -601,7 +593,6 @@ private ArrayList getNodesToCheck(Document doc) { nodesToCheck.addAll(doc.getElementsByTag("pre")); nodesToCheck.addAll(doc.getElementsByTag("td")); return nodesToCheck; - } /** @@ -653,6 +644,14 @@ private static boolean isHighLinkDensity(Element e) { return false; } + + private static float textQuality(String s) { + if (s == null || s.length() == 0) { + return 0; + } + + return 0; + } /** * alot of times the first paragraph might be the caption under an image so we'll want to make sure if we're going to @@ -679,8 +678,8 @@ private boolean isOkToBoost(Element node) { } String paraText = sibling.text(); - WordStats wordStats = config.getStopWords().getStopWordCount(paraText); - if (wordStats.getStopWordCount() > 5) { + int paraScore = TextScorer.score(paraText); + if (paraScore > 2) { if (logger.isDebugEnabled()) { logger.debug("We're gonna boost this node, seems contenty"); } @@ -830,15 +829,28 @@ private Element cleanupNode(Element node) { node = addSiblings(node); + // remove all nodes before a h1 + for (Element h1 : node.getElementsByTag("h1")) { + Element previous = h1.previousElementSibling(); + while(previous != null) { + JsoupUtils.removeNode(previous); + previous = h1.previousElementSibling(); + } + JsoupUtils.removeNode(h1); + continue; + } + Elements nodes = node.children(); for (Element e : nodes) { - if (e.tagName().equals("p")) { - continue; + boolean highLinkDensity = isHighLinkDensity(e); + if (e.tagName().equals("p") && !highLinkDensity && e.text().length() > 25) { + if (TextScorer.score(e.text()) > 0) { + continue; + } } if (logger.isDebugEnabled()) { logger.debug("CLEANUP NODE: " + e.id() + " class: " + e.attr("class")); } - boolean highLinkDensity = isHighLinkDensity(e); if (highLinkDensity) { if (logger.isDebugEnabled()) { logger.debug("REMOVING NODE FOR LINK DENSITY: " + e.id() + " class: " + e.attr("class")); @@ -865,7 +877,7 @@ private Element cleanupNode(Element node) { if (logger.isDebugEnabled()) { logger.debug("Removing node because it doesn't have any paragraphs"); } - e.remove(); + JsoupUtils.removeNode(e); continue; } @@ -881,7 +893,7 @@ private Element cleanupNode(Element node) { if (logger.isDebugEnabled()) { logger.debug("Removing node due to low threshold score"); } - e.remove(); + JsoupUtils.removeNode(e); } else { if (logger.isDebugEnabled()) { logger.debug("Not removing TD node"); @@ -910,14 +922,27 @@ private Element addSiblings(Element node) { } int baselineScoreForSiblingParagraphs = getBaselineScoreForSiblings(node); + // A h1 element is a good indicator that we already have more than the article body + if (node.getElementsByTag("h1").size() > 0) { + return node; + } + Element currentSibling = node.previousElementSibling(); while (currentSibling != null) { if (logger.isDebugEnabled()) { logger.debug("SIBLINGCHECK: " + debugNode(currentSibling)); } + if ( currentSibling.tagName().equals("header")) { + break; + } + + if (currentSibling.className().matches(".*meta.*|.*info.*")) { + currentSibling = currentSibling.previousElementSibling(); + continue; + } + if (currentSibling.tagName().equals("p")) { - node.child(0).before(currentSibling.outerHtml()); currentSibling = currentSibling.previousElementSibling(); continue; @@ -931,11 +956,10 @@ private Element addSiblings(Element node) { continue; } for (Element firstParagraph : potentialParagraphs) { - WordStats wordStats = config.getStopWords().getStopWordCount(firstParagraph.text()); - - int paragraphScore = wordStats.getStopWordCount(); + int paragraphScore = TextScorer.score(firstParagraph.text()); - if ((float) (baselineScoreForSiblingParagraphs * .30) < paragraphScore) { + double tagPenalty = Math.pow(1.1, firstParagraph.getAllElements().size()); + if ((float) (baselineScoreForSiblingParagraphs * 0.3 * tagPenalty) < paragraphScore) { if (logger.isDebugEnabled()) { logger.debug("This node looks like a good sibling, adding it"); } @@ -971,16 +995,13 @@ private int getBaselineScoreForSiblings(Element topNode) { Elements nodesToCheck = topNode.getElementsByTag("p"); for (Element node : nodesToCheck) { - String nodeText = node.text(); - WordStats wordStats = config.getStopWords().getStopWordCount(nodeText); + int textScore = TextScorer.score(nodeText); boolean highLinkDensity = isHighLinkDensity(node); - - - if (wordStats.getStopWordCount() > 2 && !highLinkDensity) { - + + if (textScore > 2 && !highLinkDensity) { numberOfParagraphs++; - scoreOfParagraphs += wordStats.getStopWordCount(); + scoreOfParagraphs += textScore; } } diff --git a/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java b/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java index 854ffc2e1..a1325690b 100644 --- a/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java +++ b/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java @@ -20,6 +20,8 @@ import com.jimplush.goose.texthelpers.ReplaceSequence; import com.jimplush.goose.texthelpers.string; +import com.jimplush.goose.util.JsoupUtils; + import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.nodes.Node; @@ -58,7 +60,7 @@ public class DefaultDocumentCleaner implements DocumentCleaner { /** * regex to detect if there are block level elements inside of a div element */ - private static final Pattern divToPElementsPattern = Pattern.compile("<(a|blockquote|dl|div|img|ol|p|pre|table|ul)"); + private static final Pattern divToPElementsPattern = Pattern.compile("<(a|blockquote|dl|div|img|ol|p|pre|table|ul|h1|h2|h3|h4|h5|h6)"); private static final ReplaceSequence tabsAndNewLinesReplcesments; private static final Pattern captionPattern = Pattern.compile("^caption$"); @@ -83,7 +85,7 @@ public class DefaultDocumentCleaner implements DocumentCleaner { // create negative elements sb.append("^side$|combx|retweet|menucontainer|navbar|comment|PopularQuestions|contact|foot|footer|Footer|footnote|cnn_strycaptiontxt|meta$|scroll|shoutbox|sponsor"); sb.append("|tags|socialnetworking|socialNetworking|cnnStryHghLght|cnn_stryspcvbx|^inset$|pagetools|post-attributes|welcome_form|contentTools2|the_answers"); - sb.append("|communitypromo|subscribe|vcard|articleheadings|date|print|popup|author-dropdown|tools|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text|.*next.*"); + sb.append("|communitypromo|subscribe|vcard|articleheadings|date|print|popup|author-dropdown|tools|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text|.*next.*|sidebar^$"); regExRemoveNodes = sb.toString(); queryNaughtyIDs = "[id~=(" + regExRemoveNodes + ")]"; queryNaughtyClasses = "[class~=(" + regExRemoveNodes + ")]"; @@ -113,9 +115,28 @@ public Document clean(Document doc) { // turn any divs that aren't used as true layout items with block level elements inside them into paragraph tags docToClean = convertDivsToParagraphs(docToClean, "div"); - docToClean = convertDivsToParagraphs(docToClean, "span"); + docToClean = unwrapElementsWithTag(docToClean, "span"); + removeEmptyElements(docToClean, "p"); + removeEmptyElements(docToClean, "a"); + + return docToClean; + } + private void removeEmptyElements(Document docToClean, String tagName) { + Elements paragraphs = docToClean.getElementsByTag(tagName); + for (Element p : paragraphs) { + if (p.text().trim().length() == 0 && p.children().size() == 0) { + JsoupUtils.removeNode(p); + } + } + } + + private Document unwrapElementsWithTag(Document docToClean, String tagName) { + Elements tagItems = docToClean.getElementsByTag(tagName); + for (Element item : tagItems) { + item.unwrap(); + } return docToClean; } @@ -150,10 +171,8 @@ private Document convertDivsToParagraphs(Document doc, String domType) { StringBuilder replacementText = new StringBuilder(); - //cleanTags(div); Document newDoc = new Document(doc.baseUri()); - for (Node kid : div.childNodes()) { if (kid.nodeName().equals("#text")) { @@ -189,27 +208,16 @@ private Document convertDivsToParagraphs(Document doc, String domType) { kid.replaceWith(newPara); convertedTextNodes++; } - } - - } - - } } catch (NullPointerException e) { logger.error(e.toString()); } - } - if (logger.isDebugEnabled()) { logger.debug("Found " + divs.size() + " total divs with " + badDivs + " bad divs replaced and " + convertedTextNodes + " textnodes converted inside divs"); } - - - - return doc; } @@ -327,15 +335,6 @@ private Document cleanBadTags(Document doc) { } - /** - * Apparently jsoup expects the node's parent to not be null and throws if it is. Let's be safe. - * @param node the node to remove from the doc - */ - private void removeNode(Element node) { - if (node == null || node.parent() == null) return; - node.remove(); - } - /** * Removes nodes but makes sure not to remove to much. * @param node @@ -343,8 +342,9 @@ private void removeNode(Element node) { private void safelyRemoveNode(Element node) { if (tagWhitelist.contains(node.tagName())) return; - removeNode(node); + JsoupUtils.removeNode(node); } + /** * removes nodes that may have a certain pattern that matches against a class or id tag * diff --git a/src/main/java/com/jimplush/goose/network/HtmlFetcher.java b/src/main/java/com/jimplush/goose/network/HtmlFetcher.java index 45cf83990..0e061ee23 100644 --- a/src/main/java/com/jimplush/goose/network/HtmlFetcher.java +++ b/src/main/java/com/jimplush/goose/network/HtmlFetcher.java @@ -186,6 +186,7 @@ public static String getHtml(String url) throws MaxBytesException, NotHtmlExcept } throw new NotHtmlException(); } + logger.debug(htmlResult); InputStream is; diff --git a/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java b/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java index 712de906c..4c34db73b 100644 --- a/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java +++ b/src/main/java/com/jimplush/goose/outputformatters/DefaultOutputFormatter.java @@ -21,6 +21,7 @@ */ import com.jimplush.goose.texthelpers.StopWords; +import com.jimplush.goose.texthelpers.TextScorer; import com.jimplush.goose.texthelpers.WordStats; import org.apache.commons.lang.StringEscapeUtils; import org.jsoup.nodes.Element; @@ -106,7 +107,7 @@ public String getFormattedText() { } } - return sb.toString(); + return sb.toString().replace("\u00a0", " ").trim(); } /** @@ -137,7 +138,7 @@ private void removeNodesWithNegativeScores() { Elements gravityItems = this.topNode.select("*[gravityScore]"); for (Element item : gravityItems) { int score = Integer.parseInt(item.attr("gravityScore")); - if (score < 1) { + if (score < 0) { item.remove(); } } @@ -148,23 +149,14 @@ private void removeNodesWithNegativeScores() { * so replace
, , , etc.... with whatever text is inside them */ private void replaceTagsWithText() { - - Elements strongs = topNode.getElementsByTag("strong"); - for (Element item : strongs) { - TextNode tn = new TextNode(item.text(), topNode.baseUri()); - item.replaceWith(tn); - } - - Elements bolds = topNode.getElementsByTag("b"); - for (Element item : bolds) { - TextNode tn = new TextNode(item.text(), topNode.baseUri()); - item.replaceWith(tn); - } - - Elements italics = topNode.getElementsByTag("i"); - for (Element item : italics) { - TextNode tn = new TextNode(item.text(), topNode.baseUri()); - item.replaceWith(tn); + String[] tagNames = {"strong", "b", "i", "span" }; + + for (String tagName : tagNames) { + Elements tagItems = topNode.getElementsByTag(tagName); + for (Element item : tagItems) { + TextNode tn = new TextNode(item.text(), topNode.baseUri()); + item.replaceWith(tn); + } } } @@ -178,13 +170,12 @@ private void removeParagraphsWithFewWords() { Elements allNodes = this.topNode.getAllElements(); for (Element el : allNodes) { - + if (el.getElementsByTag("a").size() == 0) { + continue; + } try { - // get stop words that appear in each node - - WordStats wordStats = stopWords.getStopWordCount(el.text()); - - if (wordStats.getStopWordCount() < 5 && el.getElementsByTag("object").size() == 0 && el.getElementsByTag("embed").size() == 0) { + int score = TextScorer.score(el.text()); + if (score < 3 && el.getElementsByTag("object").size() == 0 && el.getElementsByTag("embed").size() == 0) { el.remove(); } } catch (IllegalArgumentException e) { diff --git a/src/main/java/com/jimplush/goose/texthelpers/TextScorer.java b/src/main/java/com/jimplush/goose/texthelpers/TextScorer.java new file mode 100644 index 000000000..a08551970 --- /dev/null +++ b/src/main/java/com/jimplush/goose/texthelpers/TextScorer.java @@ -0,0 +1,25 @@ +package com.jimplush.goose.texthelpers; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class TextScorer { + + private static StringSplitter WHITESPACE_SPLITTER = new StringSplitter("\\s+"); + private static Pattern PUNCTUATION_PATTERN = Pattern.compile("[\\.,\\:;_\\(\\)\\[\\]\\?]"); + + public static int score(String text) { + String[] words = WHITESPACE_SPLITTER.split(text); + int wordCount = words.length; + + Matcher matcher = PUNCTUATION_PATTERN.matcher(text); + int punctuation = 0; + while (matcher.find()) { + punctuation++; + } + int sentenceEstimate = wordCount / 7; + int punctuationPenalty = Math.min(20, Math.max(0, punctuation - wordCount / 3)); + return sentenceEstimate - punctuationPenalty; + } + +} diff --git a/src/main/java/com/jimplush/goose/util/JsoupUtils.java b/src/main/java/com/jimplush/goose/util/JsoupUtils.java new file mode 100644 index 000000000..2fb24a4f2 --- /dev/null +++ b/src/main/java/com/jimplush/goose/util/JsoupUtils.java @@ -0,0 +1,15 @@ +package com.jimplush.goose.util; + +import org.jsoup.nodes.Element; + +public class JsoupUtils { + + /** + * Apparently jsoup expects the node's parent to not be null and throws if it is. Let's be safe. + * @param node the node to remove from the doc + */ + public static void removeNode(Element node) { + if (node == null || node.parent() == null) return; + node.remove(); + } +} diff --git a/src/test/java/com/jimplush/goose/GermanGoldSitesTest.java b/src/test/java/com/jimplush/goose/GermanGoldSitesTest.java index 4a9a52ab9..ae834f3d6 100644 --- a/src/test/java/com/jimplush/goose/GermanGoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GermanGoldSitesTest.java @@ -44,7 +44,7 @@ protected enum Site { SZ("http://www.sueddeutsche.de/sport/-fc-koeln-am-tabellenende-fussball-revolution-am-niederrhein-1.1133417", "Fußball-Revolution am Niederrhein", "Ein Wochenende genügt, um die Machtverhältnisse am Niederrhein zu erschüttern", - "Und wenn's nur für einen einzigen Freitagabend ist.", // last space is non breaking + "Und wenn's nur für einen einzigen Freitagabend ist.", null), TAGESSCHAU( "http://www.tagesschau.de/ausland/libyen1238.html", @@ -56,7 +56,7 @@ protected enum Site { "http://www.stern.de/tv/sterntv/stern-tv-test-die-verkaufstricks-der-supermaerkte-1719541.html", "stern TV-Test: Die Verkaufstricks der Supermärkte - Stern TV", "Was liegt wo? Wie wird es beleuchtet? Und wie kann man teure Markenware am besten unter die Kunden bringen?", - "6. Günstige Produkte stehen im Supermarktregal unten, teure in Blickhöhe.", + "und noch zwei Produkte ungeplant gekauft.", null), STERN2( "http://www.stern.de/tv/sterntv/fairer-preis-fuers-mobiliar-wohnungsaufloeser-im-test-1719558.html", @@ -233,7 +233,7 @@ private void runArticleAssertions(Site site, Article article) { assertNotNull("Resulting article text was NULL!", articleText); assertTrue("Article text was not as long as expected ending!", expectedEnd.length() <= articleText.length()); assertTrue(articleText.length() - expectedEnd.length() > 0); - String actual = articleText.substring(articleText.length() - expectedEnd.length() - 2, articleText.length()).trim(); + String actual = articleText.substring(articleText.length() - expectedEnd.length(), articleText.length()).trim(); assertEquals("The ending of the article text was not as expected!", expectedEnd, actual); } } diff --git a/src/test/java/com/jimplush/goose/GoldSitesTest.java b/src/test/java/com/jimplush/goose/GoldSitesTest.java index 35380a069..c7d5ee27d 100644 --- a/src/test/java/com/jimplush/goose/GoldSitesTest.java +++ b/src/test/java/com/jimplush/goose/GoldSitesTest.java @@ -97,13 +97,14 @@ public void testBusinessWeek2() { runArticleAssertions(article, "There's discord on Wall Street: Strategists at major American investment banks see a", "http://images.businessweek.com/mz/covers/current_120x160.jpg"); } - public void testFoxNews() { - - String url = "http://www.foxnews.com/politics/2010/08/14/russias-nuclear-help-iran-stirs-questions-improved-relations/"; - Article article = getArticle(url); - - runArticleAssertions(article, "Russia's announcement that it will help Iran get nuclear fuel is raising questions", "http://a57.foxnews.com/static/managed/img/Politics/396/223/startsign.jpg"); - } +// TODO Access Denied +// public void testFoxNews() { +// +// String url = "http://www.foxnews.com/politics/2010/08/14/russias-nuclear-help-iran-stirs-questions-improved-relations/"; +// Article article = getArticle(url); +// +// runArticleAssertions(article, "Russia's announcement that it will help Iran get nuclear fuel is raising questions", "http://a57.foxnews.com/static/managed/img/Politics/396/223/startsign.jpg"); +// } public void testAOLNews() { @@ -153,13 +154,14 @@ public void testWashingtonPost() { runArticleAssertions(article, "The Supreme Court sounded ", "http://media3.washingtonpost.com/wp-dyn/content/photo/2010/10/09/PH2010100904575.jpg"); } - public void testGizmodo() { - - String url = "http://gizmodo.com/#!5616256/xbox-kinect-gets-its-fight-club"; - Article article = getArticle(url); - - runArticleAssertions(article, "You love to punch your arms through the air", "http://cache.gawkerassets.com/assets/images/9/2010/08/500x_fighters_uncaged__screenshot_3b__jawbreaker.jpg"); - } +// Gizmodo does an incredibly stupid language redirect +// public void testGizmodo() { +// +// String url = "http://gizmodo.com/#!5616256/xbox-kinect-gets-its-fight-club"; +// Article article = getArticle(url); +// +// runArticleAssertions(article, "You love to punch your arms through the air", "http://cache.gawkerassets.com/assets/images/9/2010/08/500x_fighters_uncaged__screenshot_3b__jawbreaker.jpg"); +// } public void testEngadget() { @@ -302,7 +304,7 @@ public void testNewsweek() { String url = "http://www.newsweek.com/2010/10/09/how-moscow-s-war-on-islamist-rebels-is-backfiring.html"; Article article = getArticle(url); - runArticleAssertions(article, "The video shows a gun barrel jutting from the rear", "http://www.thedailybeast.com/content/newsweek/2010/10/09/how-moscow-s-war-on-islamist-rebels-is-backfiring/_jcr_content/body/mainimage.img.jpg/1286654107500.jpg"); + runArticleAssertions(article, "The video shows a gun barrel jutting from the rear", "http://www.thedailybeast.com/newsweek/2010/10/09/how-moscow-s-war-on-islamist-rebels-is-backfiring.img.200.jpg"); } public void testLifeHacker() { @@ -571,16 +573,16 @@ public void testTrailsCom2() { "http://cdn-www.trails.com/imagecache/articles/295x195/history-alpine-skis-295x195.png"); } - public void testEhow() { - String url = "http://www.ehow.com/how_7734109_make-white-spaghetti.html"; - Article article = getArticle(url, false); - - runArticleAssertions( - article, - "How to Make White Spaghetti", - "For a filling and tasty dinner that doesn't require", - null); - } +// public void testEhow() { +// String url = "http://www.ehow.com/how_7734109_make-white-spaghetti.html"; +// Article article = getArticle(url, false); +// +// runArticleAssertions( +// article, +// "How to Make White Spaghetti", +// "For a filling and tasty dinner that doesn't require", +// null); +// } public void testGolfLink() { @@ -634,23 +636,23 @@ public void testTheSuperFicial() { "http://cdn03.cdn.thesuperficial.com/wp-content/uploads/2011/04/0418-teen-mom-leah-messer-divorce-14-400x470.jpg"); } - public void testScribd() { - String url = "http://www.scribd.com/doc/49951733/CNBC-Warren-Buffett-Transcript-March-2-2011"; - Article article = getArticle(url, false); - - runArticleAssertions( - article, - "This is a transcript of his"); - } - - public void testScribd2() { - String url = "http://www.scribd.com/doc/23433951/10-Trends-to-Watch-2010"; - Article article = getArticle(url, false); - - runArticleAssertions( - article, - "t is hard to believe another year has come"); - } +// public void testScribd() { +// String url = "http://www.scribd.com/doc/49951733/CNBC-Warren-Buffett-Transcript-March-2-2011"; +// Article article = getArticle(url, false); +// +// runArticleAssertions( +// article, +// "This is a transcript of his"); +// } +// +// public void testScribd2() { +// String url = "http://www.scribd.com/doc/23433951/10-Trends-to-Watch-2010"; +// Article article = getArticle(url, false); +// +// runArticleAssertions( +// article, +// "t is hard to believe another year has come"); +// } public void testDogster() { String url = "http://blogs.dogster.com/dog-training/dogs-understand-intimacy/2011/05/"; From 5a9902e9cf6cb90ad7a412958212f61a998b1e4c Mon Sep 17 00:00:00 2001 From: nator Date: Thu, 8 Dec 2011 19:41:08 -0600 Subject: [PATCH 072/347] adjust for new Walker blogs titles --- .../java/com/jimplush/goose/ContentExtractor.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java index eb8b36991..de5529a12 100644 --- a/src/main/java/com/jimplush/goose/ContentExtractor.java +++ b/src/main/java/com/jimplush/goose/ContentExtractor.java @@ -66,6 +66,7 @@ public class ContentExtractor { private static final ReplaceSequence TITLE_REPLACEMENTS = ReplaceSequence.create("»").append("»"); private static final StringSplitter PIPE_SPLITTER = new StringSplitter("\\|"); + private static final StringSplitter EMDASH_SPLITTER = new StringSplitter("—"); private static final StringSplitter DASH_SPLITTER = new StringSplitter(" - "); private static final StringSplitter ARROWS_SPLITTER = new StringSplitter("»"); private static final StringSplitter COLON_SPLITTER = new StringSplitter(":"); @@ -336,7 +337,11 @@ private String getTitle(Document doc) { if (string.isNullOrEmpty(titleText)) return string.empty; boolean usedDelimeter = false; - + + if (titleText.contains("—")) { + titleText = doTitleSplits(titleText, EMDASH_SPLITTER); + usedDelimeter = true; + } if (titleText.contains("|")) { titleText = doTitleSplits(titleText, PIPE_SPLITTER); usedDelimeter = true; @@ -395,8 +400,8 @@ private String doTitleSplits(String title, StringSplitter splitter) { return TITLE_REPLACEMENTS.replaceAll(titlePieces[2]).trim(); } if (this.link.contains("blogs.walkerart.org") && titlePieces.length > 1) { - // it's always the second one!! - return TITLE_REPLACEMENTS.replaceAll(titlePieces[1]).trim(); + // it's always the first one!! + return TITLE_REPLACEMENTS.replaceAll(titlePieces[0]).trim(); } if (this.link.contains("mnartists.org") && titlePieces.length > 1) { // it's always the second one!! From 9a91391f9d35722aa7e0c038cffbaa7f5b8116a7 Mon Sep 17 00:00:00 2001 From: nator Date: Wed, 14 Dec 2011 10:12:10 -0600 Subject: [PATCH 073/347] Allow "tools" in class name since NMI blogs use it. --- .../com/jimplush/goose/cleaners/DefaultDocumentCleaner.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java b/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java index 06c768bb2..832f4587b 100644 --- a/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java +++ b/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java @@ -72,7 +72,7 @@ public class DefaultDocumentCleaner implements DocumentCleaner { // create negative elements sb.append("^side$|combx|retweet|menucontainer|navbar|comment|PopularQuestions|contact|foot|footer|Footer|footnote|cnn_strycaptiontxt|links|meta$|scroll|shoutbox|sponsor"); sb.append("|tags|socialnetworking|socialNetworking|cnnStryHghLght|cnn_stryspcvbx|^inset$|pagetools|post-attributes|welcome_form|contentTools2|the_answers"); - sb.append("|communitypromo|subscribe|vcard|articleheadings|date|print|popup|author-dropdown|tools|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text"); + sb.append("|communitypromo|subscribe|vcard|articleheadings|date|print|popup|author-dropdown|(^|\\s)tools($|\\s)|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text"); regExRemoveNodes = sb.toString(); queryNaughtyIDs = "[id~=(" + regExRemoveNodes + ")]"; queryNaughtyClasses = "[class~=(" + regExRemoveNodes + ")]"; From 02d48f5fb85e04adbfae1f1ab1fe9847768b1cef Mon Sep 17 00:00:00 2001 From: John Slade Date: Tue, 3 Jan 2012 11:48:15 -0500 Subject: [PATCH 074/347] Script to compile and skip tests as they are currently broken --- compile.sh | 2 ++ 1 file changed, 2 insertions(+) create mode 100755 compile.sh diff --git a/compile.sh b/compile.sh new file mode 100755 index 000000000..54c1ce9d8 --- /dev/null +++ b/compile.sh @@ -0,0 +1,2 @@ +#!/bin/bash +mvn package -DskipTests From dc11fcb4130c68e210755b8e6ea64d25ee9a58e9 Mon Sep 17 00:00:00 2001 From: Robert Blumen Date: Mon, 23 Jan 2012 11:13:50 -0800 Subject: [PATCH 075/347] image handling using java libraries with no process forking --- .../com/gravity/goose/images/ImageUtils.scala | 37 ++++++------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/src/main/scala/com/gravity/goose/images/ImageUtils.scala b/src/main/scala/com/gravity/goose/images/ImageUtils.scala index 5f3e619b5..55e696e02 100644 --- a/src/main/scala/com/gravity/goose/images/ImageUtils.scala +++ b/src/main/scala/com/gravity/goose/images/ImageUtils.scala @@ -23,6 +23,7 @@ package com.gravity.goose.images * Date: 8/18/11 */ +import javax.activation.MimetypesFileTypeMap import javax.imageio.ImageIO import java.awt.color.CMMException import java.awt.image.BufferedImage @@ -50,27 +51,15 @@ object ImageUtils extends Logging { * @return */ def getImageDimensions(identifyProgram: String, filePath: String): ImageDetails = { - val command: ArrayList[String] = new ArrayList[String](10) - command.add(identifyProgram) - command.add(filePath) - val imageInfo: String = execToString(command.toArray(new Array[String](1)).asInstanceOf[Array[String]]) + + val (mimeType, width, height) = getImageDimensionsJava(filePath) val imageDetails: ImageDetails = new ImageDetails - if (imageInfo == null || imageInfo.contains("no decode delegate for this image format")) { - throw new IOException("Unable to get Image Information (no decode delegate) for: " + filePath) - } - try { - val infoParts: Array[String] = imageInfo.split(" ") - imageDetails.setMimeType(infoParts(1)) - val dimensions: Array[String] = infoParts(2).split("x") - imageDetails.setWidth(Integer.parseInt(dimensions(0))) - imageDetails.setHeight(Integer.parseInt(dimensions(1))) - imageDetails - } - catch { - case e: NullPointerException => { - throw new IOException("Unable to get Image Information for: " + filePath) - } - } + + imageDetails.setMimeType(mimeType) + imageDetails.setWidth(width) + imageDetails.setHeight(height) + + imageDetails } /** @@ -79,15 +68,13 @@ object ImageUtils extends Logging { * @param filePath * @return */ - def getImageDimensionsJava(filePath: String): HashMap[String, Integer] = { + def getImageDimensionsJava(filePath: String): (String, Integer,Integer) = { var image: BufferedImage = null try { val f: File = new File(filePath) image = ImageIO.read(f) - val results: HashMap[String, Integer] = new HashMap[String, Integer] - results.put("height", image.getHeight) - results.put("width", image.getWidth) - results + val mimeType : String = new MimetypesFileTypeMap().getContentType(f) + (mimeType, image.getWidth, image.getHeight) } catch { case e: CMMException => { From 219498aa62db4b387421832aa403c09ef4b3b943 Mon Sep 17 00:00:00 2001 From: Robert Blumen Date: Tue, 24 Jan 2012 12:12:39 -0800 Subject: [PATCH 076/347] updated version to 2.1.10j --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c5f99eddf..7021e1a25 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.gravity goose - 2.1.10 + 2.1.10j jar goose http://maven.apache.org From 691a7b4158a17493e5da29e60356232b8ecc1724 Mon Sep 17 00:00:00 2001 From: Manuel Giesa Date: Thu, 26 Jan 2012 16:24:59 +0100 Subject: [PATCH 077/347] Fixed DefaultDocumentCleaner to work with frame sets, bumped version to 1.4.1.2 --- pom.xml | 10 +++++++++- .../goose/cleaners/DefaultDocumentCleaner.java | 4 ++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 79d03b11a..057560772 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.jimplush goose - 1.4.1.1 + 1.4.1.2 jar goose @@ -62,6 +62,14 @@ --> + + org.apache.maven.plugins + maven-compiler-plugin + + 1.5 + 1.5 + + org.apache.maven.plugins maven-source-plugin diff --git a/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java b/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java index a1325690b..b35d6f009 100644 --- a/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java +++ b/src/main/java/com/jimplush/goose/cleaners/DefaultDocumentCleaner.java @@ -285,6 +285,10 @@ private Document removeDropCaps(Document doc) { private Document cleanBadTags(Document doc) { + // Framesets do not have a body tag! + if(doc.body() == null) { + return doc; + } // only select elements WITHIN the body to avoid removing the body itself Elements children = doc.body().children(); From 70b4a4cd3b3ba5bd1eccbc8ed953beeb62d5e2de Mon Sep 17 00:00:00 2001 From: Mark Needham Date: Sat, 4 Feb 2012 14:27:32 +0000 Subject: [PATCH 078/347] mark: scala-ising some of the code here --- .../com/gravity/goose/text/StopWords.scala | 30 +++++++++---------- .../com/gravity/goose/text/WordStats.scala | 1 - .../gravity/goose/text/StopWordsTest.scala | 26 ++++++++++++++++ 3 files changed, 40 insertions(+), 17 deletions(-) create mode 100644 src/test/scala/com/gravity/goose/text/StopWordsTest.scala diff --git a/src/main/scala/com/gravity/goose/text/StopWords.scala b/src/main/scala/com/gravity/goose/text/StopWords.scala index 9f8669e8b..523e30fd8 100644 --- a/src/main/scala/com/gravity/goose/text/StopWords.scala +++ b/src/main/scala/com/gravity/goose/text/StopWords.scala @@ -26,35 +26,33 @@ package com.gravity.goose.text import java.util._ import com.gravity.goose.utils.FileHelper +import scala.collection.JavaConversions._ object StopWords { - // the confusing pattern below is basically just match any non-word character excluding white-space. private val PUNCTUATION: StringReplacement = StringReplacement.compile("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\p{Pc}\\s]", string.empty) val STOP_WORDS = FileHelper.loadResourceFile("stopwords-en.txt", StopWords.getClass).split("\n").toSet - - def removePunctuation(str: String): String = { - PUNCTUATION.replaceAll(str) - } - def getStopWordCount(content: String): WordStats = { - if (string.isNullOrEmpty(content)) return WordStats.EMPTY - val ws: WordStats = new WordStats - val strippedInput: String = removePunctuation(content) - val candidateWords: Array[String] = string.SPACE_SPLITTER.split(strippedInput) + val candidateWords = extractCandidateWords(content) + val stopWordsInContent = seqAsJavaList(candidateWords.filter(w => STOP_WORDS.contains(w.toLowerCase)).map(_.toLowerCase)) + + wordStats(candidateWords, stopWordsInContent) + } - val overlappingStopWords: List[String] = new ArrayList[String] + private def extractCandidateWords(content: String): Array[String] = { + val strippedContent = PUNCTUATION.replaceAll(content) + string.SPACE_SPLITTER.split(strippedContent) + } - candidateWords.foreach(w => { - if (STOP_WORDS.contains(w.toLowerCase)) overlappingStopWords.add(w.toLowerCase) - }) + private def wordStats(candidateWords: Array[String], stopWordsInContent: List[String]): WordStats = { + val ws = new WordStats ws.setWordCount(candidateWords.length) - ws.setStopWordCount(overlappingStopWords.size) - ws.setStopWords(overlappingStopWords) + ws.setStopWordCount(stopWordsInContent.size) + ws.setStopWords(stopWordsInContent) ws } diff --git a/src/main/scala/com/gravity/goose/text/WordStats.scala b/src/main/scala/com/gravity/goose/text/WordStats.scala index d6b6006c4..85be43596 100644 --- a/src/main/scala/com/gravity/goose/text/WordStats.scala +++ b/src/main/scala/com/gravity/goose/text/WordStats.scala @@ -32,7 +32,6 @@ object WordStats { class WordStats { - import WordStats._ /** diff --git a/src/test/scala/com/gravity/goose/text/StopWordsTest.scala b/src/test/scala/com/gravity/goose/text/StopWordsTest.scala new file mode 100644 index 000000000..4919ce8d9 --- /dev/null +++ b/src/test/scala/com/gravity/goose/text/StopWordsTest.scala @@ -0,0 +1,26 @@ +package com.gravity.goose.text + +import org.junit.Test +import org.junit.Assert._ +import scala.collection.JavaConversions._ + +/** + * Created by Jim Plush + * User: jim + * Date: 8/14/11 + */ + +class StopWordsTest { + + @Test + def findsHowManyStopWordsWeHave() { + assertEquals(0, StopWords.getStopWordCount("blah blah blah").getStopWordCount) + assertEquals(1, StopWords.getStopWordCount("although blah de blah").getStopWordCount) + } + + @Test + def determinesWhichWordsAreStopWords() { + assertEquals(seqAsJavaList(List("although")), StopWords.getStopWordCount("although blah de blah").getStopWords) + assertEquals(seqAsJavaList(List()), StopWords.getStopWordCount("blah de blah").getStopWords) + } +} \ No newline at end of file From 94da6fffc30db17a0a7e2060a46fc3317420a83e Mon Sep 17 00:00:00 2001 From: Mark Needham Date: Sat, 4 Feb 2012 14:35:07 +0000 Subject: [PATCH 079/347] mark: add WordStats constructor so we can set it up with all it needs --- .../scala/com/gravity/goose/text/StopWords.scala | 12 +----------- .../scala/com/gravity/goose/text/WordStats.scala | 13 +++++++------ 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/src/main/scala/com/gravity/goose/text/StopWords.scala b/src/main/scala/com/gravity/goose/text/StopWords.scala index 523e30fd8..d49d586b9 100644 --- a/src/main/scala/com/gravity/goose/text/StopWords.scala +++ b/src/main/scala/com/gravity/goose/text/StopWords.scala @@ -40,21 +40,11 @@ object StopWords { val candidateWords = extractCandidateWords(content) val stopWordsInContent = seqAsJavaList(candidateWords.filter(w => STOP_WORDS.contains(w.toLowerCase)).map(_.toLowerCase)) - wordStats(candidateWords, stopWordsInContent) + new WordStats(stopWordsInContent, candidateWords.length) } private def extractCandidateWords(content: String): Array[String] = { val strippedContent = PUNCTUATION.replaceAll(content) string.SPACE_SPLITTER.split(strippedContent) } - - private def wordStats(candidateWords: Array[String], stopWordsInContent: List[String]): WordStats = { - val ws = new WordStats - ws.setWordCount(candidateWords.length) - ws.setStopWordCount(stopWordsInContent.size) - ws.setStopWords(stopWordsInContent) - ws - } - - } diff --git a/src/main/scala/com/gravity/goose/text/WordStats.scala b/src/main/scala/com/gravity/goose/text/WordStats.scala index 85be43596..6b846e9b7 100644 --- a/src/main/scala/com/gravity/goose/text/WordStats.scala +++ b/src/main/scala/com/gravity/goose/text/WordStats.scala @@ -30,22 +30,23 @@ object WordStats { var EMPTY: WordStats = new WordStats } -class WordStats { - +class WordStats(_stopWords:List[String], _wordCount:Int) { import WordStats._ - + def this() = this(new ArrayList(), 0) /** * total number of stopwords or good words that we can calculate */ - var stopWordCount: Int = 0 + var stopWordCount : Int = _stopWords.size() + /** * total number of words on a node */ - var wordCount: Int = 0 + var wordCount: Int = _wordCount + /** * holds an actual list of the stop words we found */ - var stopWords: List[String] = new ArrayList[String] + var stopWords: List[String] = _stopWords def getStopWords: List[String] = { stopWords From 3d2ca3d69f48a1defee9883a6fe2afde36b32a0f Mon Sep 17 00:00:00 2001 From: Mark Needham Date: Sat, 4 Feb 2012 14:38:03 +0000 Subject: [PATCH 080/347] mark: punctuation stuff only used by one method so push them together --- .../scala/com/gravity/goose/text/StopWords.scala | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/scala/com/gravity/goose/text/StopWords.scala b/src/main/scala/com/gravity/goose/text/StopWords.scala index d49d586b9..601f44cb8 100644 --- a/src/main/scala/com/gravity/goose/text/StopWords.scala +++ b/src/main/scala/com/gravity/goose/text/StopWords.scala @@ -26,12 +26,9 @@ package com.gravity.goose.text import java.util._ import com.gravity.goose.utils.FileHelper -import scala.collection.JavaConversions._ +import scala.collection.JavaConversions._ object StopWords { - // the confusing pattern below is basically just match any non-word character excluding white-space. - private val PUNCTUATION: StringReplacement = StringReplacement.compile("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\p{Pc}\\s]", string.empty) - val STOP_WORDS = FileHelper.loadResourceFile("stopwords-en.txt", StopWords.getClass).split("\n").toSet def getStopWordCount(content: String): WordStats = { @@ -43,8 +40,10 @@ object StopWords { new WordStats(stopWordsInContent, candidateWords.length) } - private def extractCandidateWords(content: String): Array[String] = { - val strippedContent = PUNCTUATION.replaceAll(content) - string.SPACE_SPLITTER.split(strippedContent) + private def extractCandidateWords(content: String): Array[String] = string.SPACE_SPLITTER.split(stripPunctuation(content)) + + private def stripPunctuation(content: String) = { + val nonWordCharactersExcludingWhiteSpace = StringReplacement.compile("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\p{Pc}\\s]", string.empty) + nonWordCharactersExcludingWhiteSpace.replaceAll(content) } } From 023db5b97543d41c456a6156dd3ce2a1f7186ca7 Mon Sep 17 00:00:00 2001 From: Manuel Giesa Date: Tue, 7 Feb 2012 17:46:44 +0100 Subject: [PATCH 081/347] Removed log4j.properties. Man, you never check those in if you are a library. *sigh* --- src/main/resources/log4j.properties | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 src/main/resources/log4j.properties diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties deleted file mode 100644 index dff8ddadc..000000000 --- a/src/main/resources/log4j.properties +++ /dev/null @@ -1,22 +0,0 @@ -# ***** Set root logger level to WARN and its two appenders to stdout and R. -log4j.rootLogger=trace, stdout - -# ***** stdout is set to be a ConsoleAppender. -log4j.appender.stdout=org.apache.log4j.ConsoleAppender -log4j.appender.stdout.trace.encoding=UTF-8 -# ***** stdout uses PatternLayout. -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -# ***** Pattern to output the caller's file name and line number. -log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n - - - -#set httpclient debug levels -log4j.logger.org.apache.component=ERROR,stdout -log4j.logger.org.apache.http.wire=ERROR,stdout -log4j.logger.org.apache.commons.httpclient=ERROR,stdout -log4j.logger.org.apache.http.client.protocol=ERROR,stdout -log4j.logger.org.apache.http=ERROR,stdout - - -log4j.logger.net.sf.jmimemagic=WARN From a1794e6b2cbfe709b757623bce1d76e9ee6f1173 Mon Sep 17 00:00:00 2001 From: Manuel Giesa Date: Tue, 7 Feb 2012 18:02:30 +0100 Subject: [PATCH 082/347] Bumped version to reflect the last commit. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 057560772..fc7c378c7 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.jimplush goose - 1.4.1.2 + 1.4.1.3 jar goose From b73646a8c3383302a3cd49a1de21c6bb2d476b43 Mon Sep 17 00:00:00 2001 From: Jesus Lanchas Date: Wed, 29 Feb 2012 14:18:54 +0100 Subject: [PATCH 083/347] Automatic detection of the char encoding using the juniversalchardet library. Moreover, the system now is prepared to use a language detection previously to count the stop words in each fragment. --- .../resources/com/gravity/goose/text/all.txt | 1549 +++++++++++++++++ .../resources/com/gravity/goose/text/ca.txt | 219 +++ .../resources/com/gravity/goose/text/de.txt | 231 +++ .../resources/com/gravity/goose/text/en.txt | 546 ++++++ .../resources/com/gravity/goose/text/es.txt | 308 ++++ .../resources/com/gravity/goose/text/fr.txt | 163 ++ .../resources/com/gravity/goose/text/it.txt | 279 +++ .../resources/com/gravity/goose/text/pt.txt | 203 +++ 8 files changed, 3498 insertions(+) create mode 100644 src/main/resources/com/gravity/goose/text/all.txt create mode 100644 src/main/resources/com/gravity/goose/text/ca.txt create mode 100644 src/main/resources/com/gravity/goose/text/de.txt create mode 100644 src/main/resources/com/gravity/goose/text/en.txt create mode 100644 src/main/resources/com/gravity/goose/text/es.txt create mode 100644 src/main/resources/com/gravity/goose/text/fr.txt create mode 100644 src/main/resources/com/gravity/goose/text/it.txt create mode 100644 src/main/resources/com/gravity/goose/text/pt.txt diff --git a/src/main/resources/com/gravity/goose/text/all.txt b/src/main/resources/com/gravity/goose/text/all.txt new file mode 100644 index 000000000..c7f995fa5 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/all.txt @@ -0,0 +1,1549 @@ +a +è +über +êtes +abans +abbia +abbiamo +abbiano +abbiate +aber +about +above +ací +across +ad +after +afterwards +again +against +agl +agli +ah +ai +aie +aient +aies +ait +així +això +al +él +aleshores +algo +algun +alguna +algunas +algunes +algunos +alguns +alhora +all +alla +allí +allò +allà +alle +allem +allen +aller +alles +allo +almost +alone +along +already +als +also +although +altra +altre +altres +always +am +amb +ambdós +ambdues +among +amongst +amoungst +amount +an +anche +and +ander +andere +anderem +anderen +anderer +anderes +anderm +andern +anderr +anders +another +ante +antes +any +anyhow +anyone +anything +anyway +anywhere +ao +aos +apa +aquí +aquela +aquelas +aquele +aqueles +aquell +aquella +aquelles +aquells +aquest +aquesta +aquestes +aquests +aquilo +éramos +are +érem +éreu +around +as +és +at +até +été +étée +étées +étaient +étais +était +étant +étés +étiez +étions +au +auch +auf +aura +aurai +auraient +aurais +aurait +auras +aurez +auriez +aurions +aurons +auront +aus +aux +avaient +avais +avait +avec +avemmo +avendo +avesse +avessero +avessi +avessimo +aveste +avesti +avete +aveva +avevamo +avevano +avevate +avevi +avevo +avez +aviez +avions +avons +avrò +avrai +avranno +avrà +avrebbe +avrebbero +avrei +avremmo +avremo +avreste +avresti +avrete +avuta +avute +avuti +avuto +ayant +ayez +ayons +à +às +back +baix +be +became +because +become +becomes +becoming +been +before +beforehand +behind +bei +being +below +beside +besides +between +beyond +bill +bin +bis +bist +both +bottom +but +by +c +cada +cadascú +cadascuna +cadascunes +cadascuns +call +can +cannot +cant +ce +ceci +celà +ces +cet +cette +che +chi +ci +co +coi +col +com +come +como +computer +con +contra +contro +could +couldnt +cry +cual +cuando +cui +d +da +daß +dagl +dagli +dai +dal +dall +dalla +dalle +dallo +dalt +damit +dann +dans +das +dasselbe +dazu +de +degl +degli +dei +dein +deine +deinem +deinen +deiner +deines +del +dela +delas +dele +deles +dell +della +delle +dello +dels +dem +demselben +den +denn +denselben +depois +der +derer +derselbe +derselben +des +describe +desde +després +desselben +dessen +detail +di +dich +die +dies +diese +dieselbe +dieselben +diesem +diesen +dieser +dieses +dins +dintre +dir +do +doch +donat +doncs +donde +done +dort +dos +dov +dove +down +du +due +d'un +d'una +d'unes +d'uns +durant +durante +durch +during +e +each +eûmes +eût +eûtes +ebbe +ebbero +ebbi +ed +eg +eh +eight +ein +eine +einem +einen +einer +eines +einig +einige +einigem +einigen +einiger +einiges +einmal +either +el +ela +elas +ele +eles +eleven +ella +ellas +elle +ellos +els +else +elsewhere +em +empty +en +encara +enough +ens +entre +er +era +erais +eram +eran +erano +eras +eravamo +eravate +eren +eres +eri +ero +es +esa +esas +ese +eso +esos +essa +essas +esse +essendo +esses +est +esta +está +esté +estaba +estabais +estábamos +estaban +estabas +estad +estada +estadas +estado +estados +estáis +estéis +estamos +están +estén +estando +estão +estar +estará +estaré +estaría +estaríais +estaríamos +estarían +estarías +estaréis +estarán +estarás +estaremos +estas +estás +estés +estava +estavam +estávamos +estaven +està +estàvem +estàveu +este +esteja +estejam +estejamos +estemos +estes +esteu +esteve +estivéramos +estivéssemos +estive +estivemos +estiver +estivera +estiveram +estiverem +estivermos +estivesse +estivessem +esto +estos +estou +estoy +estuve +estuviéramos +estuviésemos +estuviera +estuvierais +estuvieran +estuvieras +estuvieron +estuviese +estuvieseis +estuviesen +estuvieses +estuvimos +estuviste +estuvisteis +estuvo +et +etc +ets +etwas +eu +euch +eue +euer +eues +eure +eurem +euren +eurent +eurer +eures +eus +eusse +eussent +eusses +eussiez +eussions +eut +eux +even +ever +every +everyone +everything +everywhere +except +für +faccia +facciamo +facciano +facciate +faccio +facemmo +facendo +facesse +facessero +facessi +facessimo +faceste +facesti +faceva +facevamo +facevano +facevate +facevi +facevo +fai +fûmes +fanno +farò +farai +fôramos +faranno +farà +farebbe +farebbero +farei +faremmo +faremo +fareste +faresti +farete +fôssemos +fût +fûtes +fece +fecero +feci +few +fifteen +fify +fill +find +fins +fire +first +five +foi +fomos +for +fora +foram +forem +former +formerly +formos +forty +fosse +fossem +fossero +fossi +fossimo +foste +fosti +found +four +from +front +fu +fuéramos +fuésemos +fue +fuera +fuerais +fueran +fueras +fueron +fuese +fueseis +fuesen +fueses +fui +fuimos +fuiste +fuisteis +full +fummo +furent +furono +further +fus +fusse +fussent +fusses +fussiez +fussions +fut +gairebé +gegen +get +gewesen +give +gli +go +ha +há +hab +había +habíais +habíamos +habían +habías +habéis +habe +haben +habida +habidas +habido +habidos +habiendo +habrá +habré +habría +habríais +habríamos +habrían +habrías +habréis +habrán +habrás +habremos +had +hai +haja +hajam +hajamos +han +hanno +hão +has +hasnt +hasta +hat +hatte +hatten +have +havemos +havia +hay +haya +hayáis +hayamos +hayan +hayas +he +hei +hem +hemos +hence +her +here +hereafter +hereby +herein +hereupon +hers +herself +heu +hi +hier +him +himself +hin +hinter +his +ho +houvéramos +houvéssemos +houve +houvemos +houver +houvera +houverá +houveríamos +houveram +houverão +houverei +houverem +houveremos +houveria +houveriam +houvermos +houvesse +houvessem +how +however +hube +hubiéramos +hubiésemos +hubiera +hubierais +hubieran +hubieras +hubieron +hubiese +hubieseis +hubiesen +hubieses +hubimos +hubiste +hubisteis +hubo +hundred +i +ich +ici +ie +if +igual +iguals +ihm +ihn +ihnen +ihr +ihre +ihrem +ihren +ihrer +ihres +il +ils +im +in +inc +indeed +indem +ins +interest +into +io +is +isso +ist +isto +it +its +itself +j +ja +já +je +jede +jedem +jeden +jeder +jedes +jene +jenem +jenen +jener +jenes +jetzt +kann +können +könnte +keep +kein +keine +keinem +keinen +keiner +keines +l +la +las +last +latter +latterly +le +least +lei +les +less +leur +leurs +lhe +lhes +l'hi +li +li'n +llavors +lo +loro +los +ltd +lui +m +ma +mí +mía +même +mías +machen +made +mais +mal +malgrat +man +manche +manchem +manchen +mancher +manches +many +mío +míos +mas +más +més +mateix +mateixa +mateixes +mateixos +may +me +meanwhile +mein +meine +meinem +meinen +meiner +meines +mentre +mes +mesmo +meu +meus +meva +meves +m'he +mi +mia +mich +mie +miei +might +mill +mine +minha +minhas +mio +mir +mis +mit +moi +molt +molta +moltes +molts +mon +mons +more +moreover +most +mostly +move +much +mucho +muchos +muito +muss +musste +must +muy +my +myself +n +na +nós +nach +nada +name +namely +não +nas +ne +negl +negli +nei +neither +nel +nell +nella +nelle +nello +nem +never +nevertheless +next +n'he +n'hi +ni +nicht +nichts +nine +no +nobody +noch +nogensmenys +noi +només +non +none +noone +nor +nos +nosaltres +nosotras +nosotros +nossa +nossas +nosso +nossos +nostra +nostre +nostres +nostri +nostro +not +nothing +notre +nous +now +nowhere +nuestra +nuestras +nuestro +nuestros +num +numa +nun +nur +o +ob +oder +of +off +often +oh +ohne +oi +on +once +one +only +ont +onto +or +os +other +others +otherwise +otra +otras +otro +otros +ou +our +ours +ourselves +out +over +own +par +para +part +pas +pel +pela +pelas +pelo +pelos +pels +per +però +perché +perhaps +pero +perquè +più +please +poc +poca +poco +pocs +poques +por +porque +potser +pour +propi +put +qu +què +qué +qual +quale +quals +quan +quando +quant +quanta +quante +quanti +quanto +que +quel +quelcom +quella +quelle +quelles +quelli +quello +quels +quem +questa +queste +questi +questo +qui +quien +quienes +quin +quina +quines +quins +rather +re +s +sa +sí +só +sóc +són +same +sans +são +sarò +sarai +saranno +sarà +sarebbe +sarebbero +sarei +saremmo +saremo +sareste +saresti +sarete +se +sea +seáis +seamos +sean +seas +see +seem +seemed +seeming +seems +sehr +sei +sein +seine +seinem +seinen +seiner +seines +seja +sejam +sejamos +selbst +sem +semblant +semblants +sera +será +seré +sería +seríais +seríamos +serían +serías +serai +seraient +serais +seréis +serait +serán +serão +seras +serás +serei +seremos +serez +seria +seriam +seriez +serions +serious +serons +seront +ses +seu +seu +seus +seva +several +seves +s'ha +s'han +she +should +show +si +sia +siamo +siano +siate +sich +side +sido +sie +siendo +siete +sin +since +sincere +sind +six +sixty +so +sobre +sobretot +soi +soient +sois +soit +solament +solche +solchem +solchen +solcher +solches +soll +sollte +sols +some +somehow +someone +something +sometime +sometimes +somewhere +sommes +somos +son +son +sondern +sono +sons +sonst +sont +sota +sou +soy +soyez +soyons +sta +stai +stando +stanno +starò +starai +staranno +starà +starebbe +starebbero +starei +staremmo +staremo +stareste +staresti +starete +stava +stavamo +stavano +stavate +stavi +stavo +stemmo +stesse +stessero +stessi +stessimo +steste +stesti +stette +stettero +stetti +stia +stiamo +stiano +stiate +still +sto +su +sua +suas +such +sue +sugl +sugli +sui +suis +sul +sull +sulla +sulle +sullo +suo +suoi +sur +sus +suya +suyas +suyo +suyos +system +t +ta +take +tal +tém +també +também +también +tampoc +tan +tínhamos +tant +tanta +tantes +tanto +tú +te +tem +temos +ten +tenía +teníais +teníamos +tenían +tenías +tenéis +tendrá +tendré +tendría +tendríais +tendríamos +tendrían +tendrías +tendréis +tendrán +tendrás +tendremos +tened +tenemos +tenga +tengáis +tengamos +tengan +tengas +tengo +tenha +tenham +tenhamos +tenho +tenida +tenidas +tenido +tenidos +teniendo +terá +teríamos +terão +terei +teremos +teria +teriam +tes +teu +teus +teva +teve +teves +t'ha +than +t'han +that +the +t'he +their +them +themselves +then +thence +there +thereafter +thereby +therefore +therein +thereupon +these +they +thick +thin +third +this +those +though +three +through +throughout +thru +thus +ti +tiene +tienen +tienes +tinha +tinham +tivéramos +tivéssemos +tive +tivemos +tiver +tivera +tiveram +tiverem +tivermos +tivesse +tivessem +to +todo +todos +together +toi +ton +tons +too +top +tot +tota +totes +tots +toward +towards +tra +tu +tua +tuas +tue +tuo +tuoi +tus +tutti +tutto +tuve +tuviéramos +tuviésemos +tuviera +tuvierais +tuvieran +tuvieras +tuvieron +tuviese +tuvieseis +tuviesen +tuvieses +tuvimos +tuviste +tuvisteis +tuvo +tuya +tuyas +tuyo +tuyos +twelve +twenty +two +um +uma +un +una +und +under +une +unes +uno +unos +uns +unse +unsem +unsen +unser +unses +unter +until +up +upon +us +va +vaig +vam +van +vas +very +veu +vi +via +viel +você +vocês +voi +vom +von +vor +vos +vosaltres +vosotras +vosotros +vostra +vostre +vostres +vostri +vostro +votre +vous +vuestra +vuestras +vuestro +vuestros +würde +würden +während +war +waren +warst +was +we +weg +weil +weiter +welche +welchem +welchen +welcher +welches +well +wenn +werde +werden +were +what +whatever +when +whence +whenever +where +whereafter +whereas +whereby +wherein +whereupon +wherever +whether +which +while +whither +who +whoever +whole +whom +whose +why +wie +wieder +will +wir +wird +wirst +with +within +without +wo +wollen +wollte +would +y +ya +yet +yo +you +your +yours +yourself +yourselvesa +zu +zum +zur +zwar +zwischen diff --git a/src/main/resources/com/gravity/goose/text/ca.txt b/src/main/resources/com/gravity/goose/text/ca.txt new file mode 100644 index 000000000..458ecf212 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/ca.txt @@ -0,0 +1,219 @@ +a +abans +ací +ah +així +això +al +als +aleshores +algun +alguna +algunes +alguns +alhora +allà +allí +allò +altra +altre +altres +amb +ambdós +ambdues +apa +aquell +aquella +aquelles +aquells +aquest +aquesta +aquestes +aquests +aquí +baix +cada +cadascú +cadascuna +cadascunes +cadascuns +com +contra +d'un +d'una +d'unes +d'uns +dalt +de +del +dels +des +després +dins +dintre +donat +doncs +durant +e +eh +el +els +em +en +encara +ens +entre +érem +eren +éreu +es +és +esta +està +estàvem +estaven +estàveu +esteu +et +etc +ets +fins +fora +gairebé +ha +han +has +havia +he +hem +heu +hi +ho +i +igual +iguals +ja +l'hi +la +les +li +li'n +llavors +m'he +ma +mal +malgrat +mateix +mateixa +mateixes +mateixos +me +mentre +més +meu +meus +meva +meves +molt +molta +moltes +molts +mon +mons +n'he +n'hi +ne +ni +no +nogensmenys +només +nosaltres +nostra +nostre +nostres +o +oh +oi +on +pas +pel +pels +per +però +perquè +poc +poca +pocs +poques +potser +propi +qual +quals +quan +quant +que +què +quelcom +qui +quin +quina +quines +quins +s'ha +s'han +sa +semblant +semblants +ses +seu +seus +seva +seva +seves +si +sobre +sobretot +sóc +solament +sols +son +són +sons +sota +sou +t'ha +t'han +t'he +ta +tal +també +tampoc +tan +tant +tanta +tantes +teu +teus +teva +teves +ton +tons +tot +tota +totes +tots +un +una +unes +uns +us +va +vaig +vam +van +vas +veu +vosaltres +vostra +vostre +vostres diff --git a/src/main/resources/com/gravity/goose/text/de.txt b/src/main/resources/com/gravity/goose/text/de.txt new file mode 100644 index 000000000..721d5ca68 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/de.txt @@ -0,0 +1,231 @@ +über +aber +alle +allem +allen +aller +alles +als +also +am +an +ander +andere +anderem +anderen +anderer +anderes +anderm +andern +anderr +anders +auch +auf +aus +bei +bin +bis +bist +da +daß +damit +dann +das +dasselbe +dazu +dein +deine +deinem +deinen +deiner +deines +dem +demselben +den +denn +denselben +der +derer +derselbe +derselben +des +desselben +dessen +dich +die +dies +diese +dieselbe +dieselben +diesem +diesen +dieser +dieses +dir +doch +dort +du +durch +ein +eine +einem +einen +einer +eines +einig +einige +einigem +einigen +einiger +einiges +einmal +er +es +etwas +euch +euer +eure +eurem +euren +eurer +eures +für +gegen +gewesen +hab +habe +haben +hat +hatte +hatten +hier +hin +hinter +ich +ihm +ihn +ihnen +ihr +ihre +ihrem +ihren +ihrer +ihres +im +in +indem +ins +ist +jede +jedem +jeden +jeder +jedes +jene +jenem +jenen +jener +jenes +jetzt +kann +können +könnte +kein +keine +keinem +keinen +keiner +keines +machen +man +manche +manchem +manchen +mancher +manches +mein +meine +meinem +meinen +meiner +meines +mich +mir +mit +muss +musste +nach +nicht +nichts +noch +nun +nur +ob +oder +ohne +sehr +sein +seine +seinem +seinen +seiner +seines +selbst +sich +sie +sind +so +solche +solchem +solchen +solcher +solches +soll +sollte +sondern +sonst +um +und +uns +unse +unsem +unsen +unser +unses +unter +viel +vom +von +vor +würde +würden +während +war +waren +warst +was +weg +weil +weiter +welche +welchem +welchen +welcher +welches +wenn +werde +werden +wie +wieder +will +wir +wird +wirst +wo +wollen +wollte +zu +zum +zur +zwar +zwischen diff --git a/src/main/resources/com/gravity/goose/text/en.txt b/src/main/resources/com/gravity/goose/text/en.txt new file mode 100644 index 000000000..d3a39543f --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/en.txt @@ -0,0 +1,546 @@ +a's +able +about +above +according +accordingly +across +actually +after +afterwards +again +against +ain't +all +allow +allows +almost +alone +along +already +also +although +always +am +among +amongst +an +and +another +any +anybody +anyhow +anyone +anything +anyway +anyways +anywhere +apart +appear +appreciate +appropriate +are +aren't +around +as +aside +ask +asking +associated +at +available +away +awfully +be +became +because +become +becomes +becoming +been +before +beforehand +behind +being +believe +below +beside +besides +best +better +between +beyond +both +brief +but +by +c +c'mon +c's +came +campaign +can +can't +cannot +cant +cause +causes +certain +certainly +changes +clearly +co +com +come +comes +concerning +consequently +consider +considering +contain +containing +contains +corresponding +could +couldn't +course +currently +definitely +described +despite +did +didn't +different +do +does +doesn't +doing +don't +done +down +downwards +during +each +edu +eight +either +else +elsewhere +enough +endorsed +entirely +especially +et +etc +even +ever +every +everybody +everyone +everything +everywhere +ex +exactly +example +except +far +few +fifth +first +financial +five +followed +following +follows +for +former +formerly +forth +four +from +further +furthermore +get +gets +getting +given +gives +go +goes +going +gone +got +gotten +greetings +had +hadn't +happens +hardly +has +hasn't +have +haven't +having +he +he's +hello +help +hence +her +here +here's +hereafter +hereby +herein +hereupon +hers +herself +hi +him +himself +his +hither +hopefully +how +howbeit +however +i'd +i'll +i'm +i've +if +ignored +immediate +in +inasmuch +inc +indeed +indicate +indicated +indicates +inner +insofar +instead +into +inward +is +isn't +it +it'd +it'll +it's +its +itself +just +keep +keeps +kept +know +knows +known +last +lately +later +latter +latterly +least +less +lest +let +let's +like +liked +likely +little +look +looking +looks +ltd +mainly +many +may +maybe +me +mean +meanwhile +merely +might +more +moreover +most +mostly +much +must +my +myself +name +namely +nd +near +nearly +necessary +need +needs +neither +never +nevertheless +new +next +nine +no +nobody +non +none +noone +nor +normally +not +nothing +novel +now +nowhere +obviously +of +off +often +oh +ok +okay +old +on +once +one +ones +only +onto +or +other +others +otherwise +ought +our +ours +ourselves +out +outside +over +overall +own +particular +particularly +per +perhaps +placed +please +plus +possible +presumably +probably +provides +quite +quote +quarterly +rather +really +reasonably +regarding +regardless +regards +relatively +respectively +right +said +same +saw +say +saying +says +second +secondly +see +seeing +seem +seemed +seeming +seems +seen +self +selves +sensible +sent +serious +seriously +seven +several +shall +she +should +shouldn't +since +six +so +some +somebody +somehow +someone +something +sometime +sometimes +somewhat +somewhere +soon +sorry +specified +specify +specifying +still +sub +such +sup +sure +t's +take +taken +tell +tends +than +thank +thanks +thanx +that +that's +thats +the +their +theirs +them +themselves +then +thence +there +there's +thereafter +thereby +therefore +therein +theres +thereupon +these +they +they'd +they'll +they're +they've +think +third +this +thorough +thoroughly +those +though +three +through +throughout +thru +thus +to +together +too +took +toward +towards +tried +tries +truly +try +trying +twice +two +under +unfortunately +unless +unlikely +until +unto +up +upon +us +use +used +useful +uses +using +usually +uucp +value +various +very +via +viz +vs +want +wants +was +wasn't +way +we +we'd +we'll +we're +we've +welcome +well +went +were +weren't +what +what's +whatever +when +whence +whenever +where +where's +whereafter +whereas +whereby +wherein +whereupon +wherever +whether +which +while +whither +who +who's +whoever +whole +whom +whose +why +will +willing +wish +with +within +without +won't +wonder +would +would +wouldn't +yes +yet +you +you'd +you'll +you're +you've +your +yours +yourself +yourselves +zero +official +sharply +criticized \ No newline at end of file diff --git a/src/main/resources/com/gravity/goose/text/es.txt b/src/main/resources/com/gravity/goose/text/es.txt new file mode 100644 index 000000000..be3901a04 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/es.txt @@ -0,0 +1,308 @@ +a +al +él +algo +algunas +algunos +ante +antes +éramos +como +con +contra +cual +cuando +de +del +desde +donde +durante +e +el +ella +ellas +ellos +en +entre +era +erais +eran +eras +eres +es +esa +esas +ese +eso +esos +esta +está +esté +estaba +estabais +estábamos +estaban +estabas +estad +estada +estadas +estado +estados +estáis +estéis +estamos +están +estén +estando +estar +estará +estaré +estaría +estaríais +estaríamos +estarían +estarías +estaréis +estarán +estarás +estaremos +estas +estás +estés +este +estemos +esto +estos +estoy +estuve +estuviéramos +estuviésemos +estuviera +estuvierais +estuvieran +estuvieras +estuvieron +estuviese +estuvieseis +estuviesen +estuvieses +estuvimos +estuviste +estuvisteis +estuvo +fuéramos +fuésemos +fue +fuera +fuerais +fueran +fueras +fueron +fuese +fueseis +fuesen +fueses +fui +fuimos +fuiste +fuisteis +ha +había +habíais +habíamos +habían +habías +habéis +habida +habidas +habido +habidos +habiendo +habrá +habré +habría +habríais +habríamos +habrían +habrías +habréis +habrán +habrás +habremos +han +has +hasta +hay +haya +hayáis +hayamos +hayan +hayas +he +hemos +hube +hubiéramos +hubiésemos +hubiera +hubierais +hubieran +hubieras +hubieron +hubiese +hubieseis +hubiesen +hubieses +hubimos +hubiste +hubisteis +hubo +la +las +le +les +lo +los +mí +mía +mías +mío +míos +más +me +mi +mis +mucho +muchos +muy +nada +ni +no +nos +nosotras +nosotros +nuestra +nuestras +nuestro +nuestros +o +os +otra +otras +otro +otros +para +pero +poco +por +porque +qué +que +quien +quienes +sí +se +sea +seáis +seamos +sean +seas +será +seré +sería +seríais +seríamos +serían +serías +seréis +serán +serás +seremos +sido +siendo +sin +sobre +sois +somos +son +soy +su +sus +suya +suyas +suyo +suyos +también +tanto +tú +te +tenía +teníais +teníamos +tenían +tenías +tenéis +tendrá +tendré +tendría +tendríais +tendríamos +tendrían +tendrías +tendréis +tendrán +tendrás +tendremos +tened +tenemos +tenga +tengáis +tengamos +tengan +tengas +tengo +tenida +tenidas +tenido +tenidos +teniendo +ti +tiene +tienen +tienes +todo +todos +tu +tus +tuve +tuviéramos +tuviésemos +tuviera +tuvierais +tuvieran +tuvieras +tuvieron +tuviese +tuvieseis +tuviesen +tuvieses +tuvimos +tuviste +tuvisteis +tuvo +tuya +tuyas +tuyo +tuyos +un +una +uno +unos +vosotras +vosotros +vuestra +vuestras +vuestro +vuestros +y +ya +yo diff --git a/src/main/resources/com/gravity/goose/text/fr.txt b/src/main/resources/com/gravity/goose/text/fr.txt new file mode 100644 index 000000000..9a0bda2a2 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/fr.txt @@ -0,0 +1,163 @@ +êtes +ai +aie +aient +aies +ait +as +été +étée +étées +étaient +étais +était +étant +étés +étiez +étions +au +aura +aurai +auraient +aurais +aurait +auras +aurez +auriez +aurions +aurons +auront +aux +avaient +avais +avait +avec +avez +aviez +avions +avons +ayant +ayez +ayons +à +c +ce +ceci +celà +ces +cet +cette +d +dans +de +des +du +eûmes +eût +eûtes +elle +en +es +est +et +eu +eue +eues +eurent +eus +eusse +eussent +eusses +eussiez +eussions +eut +eux +fûmes +fût +fûtes +furent +fus +fusse +fussent +fusses +fussiez +fussions +fut +ici +il +ils +j +je +l +la +le +les +leur +leurs +lui +m +ma +même +mais +me +mes +moi +mon +n +ne +nos +notre +nous +on +ont +ou +par +pas +pour +qu +que +quel +quelle +quelles +quels +qui +s +sa +sans +se +sera +serai +seraient +serais +serait +seras +serez +seriez +serions +serons +seront +ses +soi +soient +sois +soit +sommes +son +sont +soyez +soyons +suis +sur +t +ta +te +tes +toi +ton +tu +un +une +vos +votre +vous +y diff --git a/src/main/resources/com/gravity/goose/text/it.txt b/src/main/resources/com/gravity/goose/text/it.txt new file mode 100644 index 000000000..52fdd78a1 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/it.txt @@ -0,0 +1,279 @@ +a +è +abbia +abbiamo +abbiano +abbiate +ad +agl +agli +ai +al +all +alla +alle +allo +anche +avemmo +avendo +avesse +avessero +avessi +avessimo +aveste +avesti +avete +aveva +avevamo +avevano +avevate +avevi +avevo +avrò +avrai +avranno +avrà +avrebbe +avrebbero +avrei +avremmo +avremo +avreste +avresti +avrete +avuta +avute +avuti +avuto +c +che +chi +ci +coi +col +come +con +contro +cui +da +dagl +dagli +dai +dal +dall +dalla +dalle +dallo +degl +degli +dei +del +dell +della +delle +dello +di +dov +dove +e +ebbe +ebbero +ebbi +ed +era +erano +eravamo +eravate +eri +ero +essendo +faccia +facciamo +facciano +facciate +faccio +facemmo +facendo +facesse +facessero +facessi +facessimo +faceste +facesti +faceva +facevamo +facevano +facevate +facevi +facevo +fai +fanno +farò +farai +faranno +farà +farebbe +farebbero +farei +faremmo +faremo +fareste +faresti +farete +fece +fecero +feci +fosse +fossero +fossi +fossimo +foste +fosti +fu +fui +fummo +furono +gli +ha +hai +hanno +ho +i +il +in +io +l +la +le +lei +li +lo +loro +lui +ma +mi +mia +mie +miei +mio +ne +negl +negli +nei +nel +nell +nella +nelle +nello +noi +non +nostra +nostre +nostri +nostro +o +per +perché +più +quale +quanta +quante +quanti +quanto +quella +quelle +quelli +quello +questa +queste +questi +questo +sarò +sarai +saranno +sarà +sarebbe +sarebbero +sarei +saremmo +saremo +sareste +saresti +sarete +se +sei +si +sia +siamo +siano +siate +siete +sono +sta +stai +stando +stanno +starò +starai +staranno +starà +starebbe +starebbero +starei +staremmo +staremo +stareste +staresti +starete +stava +stavamo +stavano +stavate +stavi +stavo +stemmo +stesse +stessero +stessi +stessimo +steste +stesti +stette +stettero +stetti +stia +stiamo +stiano +stiate +sto +su +sua +sue +sugl +sugli +sui +sul +sull +sulla +sulle +sullo +suo +suoi +ti +tra +tu +tua +tue +tuo +tuoi +tutti +tutto +un +una +uno +vi +voi +vostra +vostre +vostri +vostro diff --git a/src/main/resources/com/gravity/goose/text/pt.txt b/src/main/resources/com/gravity/goose/text/pt.txt new file mode 100644 index 000000000..9723b3798 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/pt.txt @@ -0,0 +1,203 @@ +a +ao +aos +aquela +aquelas +aquele +aqueles +aquilo +éramos +as +até +à +às +com +como +da +das +de +dela +delas +dele +deles +depois +do +dos +e +ela +elas +ele +eles +em +entre +era +eram +essa +essas +esse +esses +esta +está +estamos +estão +estas +estava +estavam +estávamos +este +esteja +estejam +estejamos +estes +esteve +estivéramos +estivéssemos +estive +estivemos +estiver +estivera +estiveram +estiverem +estivermos +estivesse +estivessem +estou +eu +fôramos +fôssemos +foi +fomos +for +fora +foram +forem +formos +fosse +fossem +fui +há +haja +hajam +hajamos +hão +havemos +hei +houvéramos +houvéssemos +houve +houvemos +houver +houvera +houverá +houveríamos +houveram +houverão +houverei +houverem +houveremos +houveria +houveriam +houvermos +houvesse +houvessem +isso +isto +já +lhe +lhes +mais +mas +me +mesmo +meu +meus +minha +minhas +muito +na +nós +não +nas +nem +no +nos +nossa +nossas +nosso +nossos +num +numa +o +os +ou +para +pela +pelas +pelo +pelos +por +qual +quando +que +quem +só +são +se +seja +sejam +sejamos +sem +será +seríamos +serão +serei +seremos +seria +seriam +seu +seus +somos +sou +sua +suas +tém +também +tínhamos +te +tem +temos +tenha +tenham +tenhamos +tenho +terá +teríamos +terão +terei +teremos +teria +teriam +teu +teus +teve +tinha +tinham +tivéramos +tivéssemos +tive +tivemos +tiver +tivera +tiveram +tiverem +tivermos +tivesse +tivessem +tu +tua +tuas +um +uma +você +vocês +vos From c6ccc8adde01b8832324aab2e54d0e605cb65488 Mon Sep 17 00:00:00 2001 From: Jesus Lanchas Date: Wed, 29 Feb 2012 14:22:45 +0100 Subject: [PATCH 084/347] Complement to the previous commit. --- pom.xml | 11 +- .../com/gravity/goose/text/stopwords-en.txt | 546 ------------------ .../gravity/goose/network/HtmlFetcher.scala | 56 +- .../com/gravity/goose/text/StopWords.scala | 28 +- 4 files changed, 56 insertions(+), 585 deletions(-) delete mode 100644 src/main/resources/com/gravity/goose/text/stopwords-en.txt diff --git a/pom.xml b/pom.xml index 9be4d60bf..b0607836d 100644 --- a/pom.xml +++ b/pom.xml @@ -105,6 +105,15 @@
+ + + + com.googlecode.juniversalchardet + juniversalchardet + 1.0.3 + compile + + + + maven-assembly-plugin + + + jar-with-dependencies + + + + fully.qualified.MainClass + + + + org.apache.maven.plugins maven-surefire-plugin - 2.6 + 2.8 false true @@ -190,4 +208,4 @@ - \ No newline at end of file + diff --git a/src/main/scala/com/gravity/goose/Article.scala b/src/main/scala/com/gravity/goose/Article.scala index 40b4dadcd..77db32393 100644 --- a/src/main/scala/com/gravity/goose/Article.scala +++ b/src/main/scala/com/gravity/goose/Article.scala @@ -72,6 +72,10 @@ class Article { */ var topImage: Image = new Image + /** + * holds all cadidate images from article + */ + var allImages: List[Image] = Nil /** * holds a set of tags that may have been in the artcle, these are not meta keywords @@ -122,4 +126,4 @@ class Article { * @return a {@link Map Map<String,String>} of property name to property vaue (represented as a {@link String}. */ var additionalData: Map[String, String] = Map.empty -} \ No newline at end of file +} diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index b0a8bfa4f..b076a66c5 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -51,15 +51,21 @@ class Configuration { @BeanProperty var enableImageFetching: Boolean = true /** + * set this guy to false if you don't care about getting All images, otherwise you can either use the default + * image extractor to implement the ImageExtractor interface to build your own + */ + @BeanProperty + var enableAllImagesFetching: Boolean = true + /** * path to your imagemagick convert executable, on the mac using mac ports this is the default listed */ @BeanProperty - var imagemagickConvertPath: String = "/opt/local/bin/convert" + var imagemagickConvertPath: String = "/usr/local/bin/convert" /** * path to your imagemagick identify executable */ @BeanProperty - var imagemagickIdentifyPath: String = "/opt/local/bin/identify" + var imagemagickIdentifyPath: String = "/usr/local/bin/identify" /** * used as the user agent that is sent with your web requests to extract an article @@ -109,4 +115,4 @@ class Configuration { } -} \ No newline at end of file +} diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index f29c9f8e0..cf55aa343 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -28,6 +28,7 @@ import org.jsoup.Jsoup import java.io.File import utils.{ParsingCandidate, URLHelper, Logging} import com.gravity.goose.outputformatters.{StandardOutputFormatter, OutputFormatter} +import scala.collection.JavaConversions._ /** * Created by Jim Plush @@ -83,6 +84,9 @@ class Crawler(config: Configuration) { val imageExtractor = getImageExtractor(article) try { article.topImage = imageExtractor.getBestImage(article.rawDoc, article.topNode) + if (config.enableAllImagesFetching) { + article.allImages = imageExtractor.getAllImages(article.topNode) + } } catch { case e: Exception => { warn(e, e.toString) @@ -172,4 +176,4 @@ class Crawler(config: Configuration) { object Crawler extends Logging { val logPrefix = "crawler: " -} \ No newline at end of file +} diff --git a/src/main/scala/com/gravity/goose/images/ImageExtractor.scala b/src/main/scala/com/gravity/goose/images/ImageExtractor.scala index c73c8a4e0..68d4d10ae 100644 --- a/src/main/scala/com/gravity/goose/images/ImageExtractor.scala +++ b/src/main/scala/com/gravity/goose/images/ImageExtractor.scala @@ -19,6 +19,7 @@ package com.gravity.goose.images import org.jsoup.nodes.{Element, Document} import com.gravity.goose.utils.{Logging, CanLog} +import java.util.ArrayList /** * Created by Jim Plush @@ -33,6 +34,8 @@ trait ImageExtractor extends CanLog { def getBestImage(doc: Document, topNode: Element): Image + def getAllImages(topNode: Element, parentDepthLevel: Int = 0, siblingDepthLevel: Int = 0): List[Image] + def logPrefix: String = ImageExtractor.loggingPrefix def critical(msg: String, refs: Any*) { diff --git a/src/main/scala/com/gravity/goose/images/StandardImageExtractor.scala b/src/main/scala/com/gravity/goose/images/StandardImageExtractor.scala index d19eeef58..7130cf949 100644 --- a/src/main/scala/com/gravity/goose/images/StandardImageExtractor.scala +++ b/src/main/scala/com/gravity/goose/images/StandardImageExtractor.scala @@ -112,6 +112,8 @@ class StandardImageExtractor(httpClient: HttpClient, article: Article, config: C image } + def getAllImages(topNode: Element, parentDepthLevel: Int = 0, siblingDepthLevel: Int = 0): List[Image] = List[Image]() + private def checkForMetaTag: Boolean = { if (this.checkForLinkTag) { return true @@ -666,4 +668,4 @@ class StandardImageExtractor(httpClient: HttpClient, article: Article, config: C } -} \ No newline at end of file +} diff --git a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala index bf0c7428a..18a836a8b 100644 --- a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala +++ b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala @@ -45,6 +45,7 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: val NODE_ID_FORMAT: String = "tag: %s class: %s ID: %s" + var imageCandidates: ArrayList[Element] = new ArrayList var sb: StringBuilder = new StringBuilder // create negative elements @@ -118,6 +119,8 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: mainImage.imageSrc = highScoreImage._1.imgSrc mainImage.imageExtractionType = "bigimage" mainImage.bytes = highScoreImage._1.bytes + mainImage.width = highScoreImage._1.width + mainImage.height = highScoreImage._1.height mainImage.confidenceScore = if (scoredImages.size > 0) (100 / scoredImages.size) else 0 trace("IMAGE COMPLETE: High Score Image is: " + mainImage.imageSrc + " Score is: " + highScoreImage._2) return Some(mainImage) @@ -226,8 +229,33 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: imageResults } - def getAllImages: ArrayList[Element] = { - null + def getAllImages(topNode: Element, parentDepthLevel: Int = 0, siblingDepthLevel: Int = 0): List[Image] = { + trace("getting All Images") + var images: ListBuffer[Image] = new ListBuffer() + getImageCandidates(topNode) match { + case Some(candidateImages) => { + for { + cadidateImg <- candidateImages + locallyStoredImg <- getLocallyStoredImage(buildImagePath(cadidateImg.attr("src"))) + } { + var img = new Image + img.imageSrc = locallyStoredImg.imgSrc + img.width = locallyStoredImg.width + img.height = locallyStoredImg.height + img.bytes = locallyStoredImg.bytes + images += img + } + return images.toList + } + case None => { + getDepthLevel(topNode, parentDepthLevel, siblingDepthLevel) match { + case Some(depthObj) => { + return getAllImages(depthObj.node, depthObj.parentDepth, depthObj.siblingDepth) + } + case None => return images.toList + } + } + } } /** @@ -313,7 +341,8 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: filteredImages <- filterBadNames(images) goodImages <- findImagesThatPassByteSizeTest(filteredImages) } { - return Some(filteredImages) + //return Some(filteredImages) + return Some(goodImages) } None @@ -578,4 +607,4 @@ object UpgradedImageIExtractor { } } -} \ No newline at end of file +} diff --git a/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala b/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala index a86a2252b..f3234053b 100644 --- a/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala +++ b/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala @@ -80,7 +80,8 @@ trait OutputFormatter { case null => "" case node => { (node.children().map((e: Element) => { - StringEscapeUtils.unescapeHtml(e.text).trim + var text = StringEscapeUtils.unescapeHtml(e.text).trim + text })).toList.mkString("\n\n") } @@ -208,4 +209,4 @@ trait OutputFormatter { } } } -} \ No newline at end of file +} diff --git a/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala b/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala index fbf6628cc..94242cdff 100644 --- a/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala +++ b/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala @@ -13,6 +13,32 @@ import com.gravity.goose.extractors.{VoicesContentExtractor, AdditionalDataExtra */ class GoldSitesTestIT { + @Test + def ego() { + implicit val config = TestUtils.DEFAULT_CONFIG + // implicit val config = TestUtils.NO_IMAGE_CONFIG + val url = "http://ego.globo.com/famosos/noticia/2012/02/jaque-khury-vai-praia-no-rio.html" + val content = "Jaque Khury foi à praia da Barra da Tijuca, na Zona Oeste do Rio" + val image = "http://s.glbimg.com/jo/eg/f/620x0/2012/02/28/5_2.jpg" + val title = "Amores brutos: Jaque Khury brinca de luta em praia com o namorado" + val article = TestUtils.getArticle(url) + TestUtils.runArticleAssertions(article = article, expectedTitle = title, expectedImage = image) + TestUtils.printReport() + } + +// @Test +// def folha() { +// implicit val config = TestUtils.DEFAULT_CONFIG +// // implicit val config = TestUtils.NO_IMAGE_CONFIG +// val url = "http://www1.folha.uol.com.br/cotidiano/1056128-problema-em-check-in-da-tam-afeta-aeroportos-em-todo-o-pais.shtml" +// val content = "Uma falha do sistema de check-in da TAM provoca transtornos para quem tenta embarcar nos aviões da companhia na manhã desta sexta-feira." +// val image = "http://f.i.uol.com.br/folha/cotidiano/images/12062207.jpeg" +// val title = "Problema em check-in da TAM afeta aeroportos em todo o país" +// val article = TestUtils.getArticle(url) +// TestUtils.runArticleAssertions(article = article, expectedTitle = title, expectedImage = image) +// TestUtils.printReport() +// } + @Test def techCrunch() { implicit val config = TestUtils.DEFAULT_CONFIG diff --git a/src/test/scala/com/gravity/goose/TestUtils.scala b/src/test/scala/com/gravity/goose/TestUtils.scala index 58fc1cb87..e5a4e6706 100644 --- a/src/test/scala/com/gravity/goose/TestUtils.scala +++ b/src/test/scala/com/gravity/goose/TestUtils.scala @@ -48,6 +48,7 @@ object TestUtils { articleReport.append("URL: ").append(TAB).append(article.finalUrl).append(NL) articleReport.append("TITLE: ").append(TAB).append(article.title).append(NL) articleReport.append("IMAGE: ").append(TAB).append(article.topImage.getImageSrc).append(NL) + articleReport.append("All_IMGS: ").append(TAB).append(article.allImages).append(NL) articleReport.append("IMGKIND: ").append(TAB).append(article.topImage.imageExtractionType).append(NL) articleReport.append("CONTENT: ").append(TAB).append(article.cleanedArticleText.replace("\n", " ")).append(NL) articleReport.append("METAKW: ").append(TAB).append(article.metaKeywords).append(NL) @@ -93,4 +94,4 @@ object TestUtils { def printReport() { println(articleReport) } -} \ No newline at end of file +} From befa7ab70dc44d7f3df876c661a62b26905d5a40 Mon Sep 17 00:00:00 2001 From: Marco Singer Date: Mon, 2 Apr 2012 16:26:54 -0300 Subject: [PATCH 088/347] migrate from Maven to SBT --- build.sbt | 17 +++++ pom.xml | 211 ------------------------------------------------------ 2 files changed, 17 insertions(+), 211 deletions(-) create mode 100644 build.sbt delete mode 100644 pom.xml diff --git a/build.sbt b/build.sbt new file mode 100644 index 000000000..e7bcbbf6c --- /dev/null +++ b/build.sbt @@ -0,0 +1,17 @@ +name := "goose" + +version := "2.1.13" + +scalaVersion := "2.9.1" + +libraryDependencies += "org.jsoup" % "jsoup" % "1.5.2" + +libraryDependencies += "org.slf4j" % "slf4j-api" % "1.6.1" + +libraryDependencies += "commons-io" % "commons-io" % "2.0.1" + +libraryDependencies += "commons-lang" % "commons-lang" % "2.6" + +libraryDependencies += "org.apache.httpcomponents" % "httpclient" % "4.1.2" + +libraryDependencies += "com.novocode" % "junit-interface" % "0.8" % "test" diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 5900ae47c..000000000 --- a/pom.xml +++ /dev/null @@ -1,211 +0,0 @@ - - 4.0.0 - - com.gravity - goose - 2.1.12 - jar - goose - http://maven.apache.org - - UTF-8 - - - - akka.repository - Akka Maven Repository - http://akka.io/repository - - - - - - junit - junit - 4.8.1 - test - - - org.slf4j - slf4j-api - 1.6.1 - jar - compile - - - org.slf4j - slf4j-log4j12 - 1.6.1 - test - - - org.jsoup - jsoup - 1.5.2 - - - com.googlecode.juniversalchardet - juniversalchardet - 1.0.3 - - - commons-io - commons-io - 2.0.1 - - - - org.scala-lang - scala-compiler - 2.9.0-1 - compile - - - - org.scala-lang - scala-library - 2.9.0-1 - - - - org.apache.httpcomponents - httpclient - 4.1.2 - - - commons-lang - commons-lang - 2.6 - - - se.scalablesolutions.akka - akka-actor - 1.1.3 - - - ch.qos.logback - logback-core - - - ch.qos.logback - logback-classic - - - - - - se.scalablesolutions.akka - akka-typed-actor - 1.1.3 - - - ch.qos.logback - logback-core - - - ch.qos.logback - logback-classic - - - - - - - - - - - maven-assembly-plugin - - - jar-with-dependencies - - - - fully.qualified.MainClass - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.8 - - false - true - - **/*Test.* - - - **/*IT.* - - - - - org.scala-tools - maven-scala-plugin - 2.14.3 - - UTF-8 - - -Xmx1024m - - - - - compile - - compile - - compile - - - test-compile - - testCompile - - test-compile - - - process-resources - - compile - - - - - - - org.apache.maven.plugins - maven-source-plugin - 2.1.2 - - - attach-sources - - jar - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.8 - - - attach-javadocs - - jar - - - - - - - - From fec6987c8779792e76a4be5be5b20fa07b1e5dcd Mon Sep 17 00:00:00 2001 From: Marco Singer Date: Mon, 2 Apr 2012 16:30:43 -0300 Subject: [PATCH 089/347] removing println because of the noise into test suite --- src/test/java/com/jimplush/goose/GooseTest.java | 3 --- src/test/scala/com/gravity/goose/TextExtractions.scala | 8 +------- .../scala/com/gravity/goose/images/ImageUtilsIT.scala | 3 +-- .../scala/com/gravity/goose/utils/FileHelperTest.scala | 3 +-- 4 files changed, 3 insertions(+), 14 deletions(-) diff --git a/src/test/java/com/jimplush/goose/GooseTest.java b/src/test/java/com/jimplush/goose/GooseTest.java index bc6979108..a84f9112e 100644 --- a/src/test/java/com/jimplush/goose/GooseTest.java +++ b/src/test/java/com/jimplush/goose/GooseTest.java @@ -25,9 +25,6 @@ public void gooseFromJavaTest() { String url = "http://www.cnn.com/2010/POLITICS/08/13/democrats.social.security/index.html"; Goose goose = new Goose(configuration); Article article = goose.extractContent(url); - System.out.println(article.cleanedArticleText()); - - } } diff --git a/src/test/scala/com/gravity/goose/TextExtractions.scala b/src/test/scala/com/gravity/goose/TextExtractions.scala index 4840dfd99..07eb17598 100644 --- a/src/test/scala/com/gravity/goose/TextExtractions.scala +++ b/src/test/scala/com/gravity/goose/TextExtractions.scala @@ -41,7 +41,6 @@ class TextExtractions { TestUtils.runArticleAssertions(article = article, expectedStart = "At Home Depot, we first realized we needed to have a real conversation with", expectedImage = null) - TestUtils.printReport() } @Test @@ -53,7 +52,6 @@ class TextExtractions { TestUtils.runArticleAssertions(article = article, expectedStart = "Get ready, America, because by Christmas 2012 you will have an Apple TV in your living room", expectedImage = null) - TestUtils.printReport() } @Test @@ -205,8 +203,6 @@ class TextExtractions { val expectedDateString = "2010-08-18"; assertNotNull("publishDate should not be null!", article.publishDate); assertEquals("Publish date should equal: \"2010-08-18\"", expectedDateString, fmt.format(article.publishDate)); - System.out.println("Publish Date Extracted: " + fmt.format(article.publishDate)); - } @Test @@ -313,8 +309,6 @@ class TextExtractions { val article = TestUtils.getArticle(url, html) TestUtils.runArticleAssertions(article = article, expectedStart = "As everyone in the world was transfixed on the Fed") - - println(article.cleanedArticleText) } @Test @@ -389,4 +383,4 @@ class TextExtractions { } -} \ No newline at end of file +} diff --git a/src/test/scala/com/gravity/goose/images/ImageUtilsIT.scala b/src/test/scala/com/gravity/goose/images/ImageUtilsIT.scala index 4d5c203b1..f668636b2 100644 --- a/src/test/scala/com/gravity/goose/images/ImageUtilsIT.scala +++ b/src/test/scala/com/gravity/goose/images/ImageUtilsIT.scala @@ -18,7 +18,6 @@ class ImageUtilsIT { def storeImageLocally() { val httpClient: HttpClient = HtmlFetcher.getHttpClient val imgSrc = "http://tctechcrunch2011.files.wordpress.com/2011/09/aaaaa.png?w=288m" - println(ImageUtils.storeImageToLocalFile(httpClient, "abc", imgSrc, new Configuration)) } @@ -27,4 +26,4 @@ class ImageUtilsIT { val tmpFile = "/tmp/goose/abc_5dd5d54ec1e9742a09cbe9fdf7c8a4ef" // println(ImageUtils.getFileExtensionName(tmpFile, new Configuration)) } -} \ No newline at end of file +} diff --git a/src/test/scala/com/gravity/goose/utils/FileHelperTest.scala b/src/test/scala/com/gravity/goose/utils/FileHelperTest.scala index 7cf13d88b..47d8b7cd2 100644 --- a/src/test/scala/com/gravity/goose/utils/FileHelperTest.scala +++ b/src/test/scala/com/gravity/goose/utils/FileHelperTest.scala @@ -14,9 +14,8 @@ class FileHelperTest { @Test def loadFileContents() { - println("loading test") val txt = FileHelper.loadResourceFile("stopwords-en.txt", StopWords.getClass) assertTrue(txt.startsWith("a's")) } -} \ No newline at end of file +} From 2ad2d68cff06f8550fe64154a5153dd5c9de7e2e Mon Sep 17 00:00:00 2001 From: Marco Singer Date: Mon, 2 Apr 2012 16:31:36 -0300 Subject: [PATCH 090/347] fix tests in GoldSitesTest --- .../com/gravity/goose/GoldSitesTestIT.scala | 155 ++++-------------- 1 file changed, 32 insertions(+), 123 deletions(-) diff --git a/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala b/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala index 94242cdff..1d504dcff 100644 --- a/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala +++ b/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala @@ -16,28 +16,29 @@ class GoldSitesTestIT { @Test def ego() { implicit val config = TestUtils.DEFAULT_CONFIG - // implicit val config = TestUtils.NO_IMAGE_CONFIG + val url = "http://ego.globo.com/famosos/noticia/2012/02/jaque-khury-vai-praia-no-rio.html" val content = "Jaque Khury foi à praia da Barra da Tijuca, na Zona Oeste do Rio" val image = "http://s.glbimg.com/jo/eg/f/620x0/2012/02/28/5_2.jpg" val title = "Amores brutos: Jaque Khury brinca de luta em praia com o namorado" val article = TestUtils.getArticle(url) TestUtils.runArticleAssertions(article = article, expectedTitle = title, expectedImage = image) - TestUtils.printReport() } -// @Test -// def folha() { -// implicit val config = TestUtils.DEFAULT_CONFIG -// // implicit val config = TestUtils.NO_IMAGE_CONFIG -// val url = "http://www1.folha.uol.com.br/cotidiano/1056128-problema-em-check-in-da-tam-afeta-aeroportos-em-todo-o-pais.shtml" -// val content = "Uma falha do sistema de check-in da TAM provoca transtornos para quem tenta embarcar nos aviões da companhia na manhã desta sexta-feira." -// val image = "http://f.i.uol.com.br/folha/cotidiano/images/12062207.jpeg" -// val title = "Problema em check-in da TAM afeta aeroportos em todo o país" -// val article = TestUtils.getArticle(url) -// TestUtils.runArticleAssertions(article = article, expectedTitle = title, expectedImage = image) -// TestUtils.printReport() -// } + @Test + def folha() { + implicit val config = TestUtils.DEFAULT_CONFIG + + val url = "http://www1.folha.uol.com.br/cotidiano/1056128-problema-em-check-in-da-tam-afeta-aeroportos-em-todo-o-pais.shtml" + val content = "Uma falha do sistema de check-in da TAM provoca transtornos para quem tenta embarcar nos aviões da companhia na manhã desta sexta-feira." + val image = "http://f.i.uol.com.br/folha/cotidiano/images/12062207.jpeg" + val title = "Problema em check-in da TAM afeta aeroportos em todo o país" + val article = TestUtils.getArticle(url) + TestUtils.runArticleAssertions(article = article, + expectedStart = content, + expectedTitle = title, + expectedImage = image) + } @Test def techCrunch() { @@ -45,11 +46,10 @@ class GoldSitesTestIT { // implicit val config = TestUtils.NO_IMAGE_CONFIG val url = "http://techcrunch.com/2011/08/13/2005-zuckerberg-didnt-want-to-take-over-the-world/" val content = "The Huffington Post has come across this fascinating five-minute interview" - val image = "http://tctechcrunch2011.files.wordpress.com/2011/08/screen-shot-2011-08-13-at-4-55-35-pm.png?w=150" + val image = "http://tctechcrunch2011.files.wordpress.com/2011/08/screen-shot-2011-08-13-at-4-55-35-pm.png?w=288" val title = "2005 Zuckerberg Didn’t Want To Take Over The World" val article = TestUtils.getArticle(url) TestUtils.runArticleAssertions(article = article, expectedTitle = title, expectedImage = image, expectedStart = content) - TestUtils.printReport() } @@ -62,7 +62,6 @@ class GoldSitesTestIT { val content = "Washington (CNN) -- Democrats pledged " val image = "http://i.cdn.turner.com/cnn/2010/POLITICS/08/13/democrats.social.security/story.kaine.gi.jpg" TestUtils.runArticleAssertions(article = article, expectedTitle = title, expectedStart = content, expectedImage = image) - TestUtils.printReport() } @Test @@ -73,7 +72,6 @@ class GoldSitesTestIT { TestUtils.runArticleAssertions(article = article, expectedStart = "Washington (CNN) -- Wall Street should have seen it coming. After all, market forces were at work.", expectedImage = "http://i.cdn.turner.com/cnn/2011/POLITICS/10/06/tea.party.left/t1larg.occupydc2.jpg") - TestUtils.printReport() } @Test @@ -108,7 +106,6 @@ class GoldSitesTestIT { val content = "Not everyone's a fan of Ben & Jerry's new \"Schweddy Balls\" -- the Saturday Night Live-inspired flavor it rolled out a few weeks ago" val image = "http://static7.businessinsider.com/image/4e68c8c36bb3f7d80a000016/conservative-moms-are-now-calling-for-a-boycott-of-ben-and-jerrys-schweddy-balls-flavor.jpg" TestUtils.runArticleAssertions(article = article, expectedStart = content, expectedImage = image) - } @Test @@ -118,7 +115,6 @@ class GoldSitesTestIT { val article = TestUtils.getArticle(url) val content = "Utah isn't known nationally for producing top basketball talent" TestUtils.runArticleAssertions(article, expectedStart = content) - } @Test @@ -142,27 +138,13 @@ class GoldSitesTestIT { TestUtils.runArticleAssertions(article = article, expectedStart = content, expectedImage = image) } - @Test - def msnbc() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://bottomline.msnbc.msn.com/_news/2011/10/06/8190264-even-without-jobs-apple-still-shines-analysts-say" - val article = TestUtils.getArticle(url) - val content = "The death of technology titan Steve Jobs, co-founder and former CEO of Apple" - val image = "http://msnbcmedia.msn.com/j/MSNBC/Components/Photo/_new/tz-biz-11106-applefuture-108p.nv_auth_landscape.jpg" - TestUtils.runArticleAssertions(article = article, expectedStart = content, expectedImage = image) - } - - @Test def laTimes() { implicit val config = TestUtils.DEFAULT_CONFIG val url: String = "http://www.latimes.com/business/la-fi-jobs-legacy-hiltzik-20111006,0,5186643.column" val article = TestUtils.getArticle(url) val content = "Everyone knows Steve Jobs pulled off one of the outstanding corporate turnarounds in U.S. history" - val image = "http://www.latimes.com/media/photo/2011-10/65235661.jpg" - TestUtils.runArticleAssertions(article = article, expectedStart = content, expectedImage = image) - TestUtils.printReport() - + TestUtils.runArticleAssertions(article = article, expectedStart = content) } @Test @@ -181,7 +163,7 @@ class GoldSitesTestIT { val url: String = "http://online.wsj.com/article/SB10001424052748704532204575397061414483040.html" val article = TestUtils.getArticle(url) val content = "The Obama administration has paid out less than a third of the nearly $230 billion" - val image = "http://s.wsj.net/public/resources/images/OB-JO759_0814st_A_20100814143158.jpg" + val image = "http://si.wsj.net/public/resources/images/OB-JO747_stimul_G_20100814113803.jpg" TestUtils.runArticleAssertions(article = article, expectedStart = content, expectedImage = image) } @@ -213,7 +195,6 @@ class GoldSitesTestIT { TestUtils.runArticleAssertions(article = article, expectedStart = "Timothy McIntosh, a Tampa financial planner, has always been able to soothe his customers after a rough patch in the stock market. Until now.", expectedImage = "http://i.usatoday.net/money/_photos/2011/10/05/many-quit-stocks-is-it-time-to-buy-blen936-x.jpg") - TestUtils.printReport() } @@ -224,7 +205,7 @@ class GoldSitesTestIT { val article = TestUtils.getArticle(url) TestUtils.runArticleAssertions(article = article, expectedStart = "If you believe what college football coaches have said about sports", - expectedImage = "http://a.espncdn.com/photo/2010/0813/pg2_g_bush3x_300.jpg") + expectedImage = "http://a.espncdn.com/photo/2010/0813/ncf_i_mpouncey1_300.jpg") } @Test @@ -237,16 +218,6 @@ class GoldSitesTestIT { expectedImage = "http://media3.washingtonpost.com/wp-dyn/content/photo/2010/10/09/PH2010100904575.jpg") } - @Test - def gizmodo() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://gizmodo.com/5833746/what-if-the-earthquake-had-hit-manhattan" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "Today's 5.9 magnitude earthquake was felt throughout the Mid-Atlantic", - expectedImage = "http://cache.gizmodo.com/assets/images/4/2011/08/fb_aftershock-earthquake-in-new-york-original.jpg") - } - @Test def engadget() { implicit val config = TestUtils.DEFAULT_CONFIG @@ -274,7 +245,7 @@ class GoldSitesTestIT { val article = TestUtils.getArticle(url) TestUtils.runArticleAssertions(article = article, expectedStart = "Despite what the jeers of jaded Californians might suggest", - expectedImage = "http://timenewsfeed.files.wordpress.com/2011/08/newsfeed_0824.jpg?w=150") + expectedImage = "http://timenewsfeed.files.wordpress.com/2011/08/newsfeed_0824.jpg?w=460&h=300&crop=1") } @Test @@ -304,7 +275,7 @@ class GoldSitesTestIT { val article = TestUtils.getArticle(url) TestUtils.runArticleAssertions(article = article, expectedStart = "The phone company is adding bells and whistles to", - expectedImage = "http://i.i.com.com/cnwk.1d/i/tim//2010/08/18/Verizon_iPad_and_live_TV_610x458.JPG") + expectedImage = "http://asset1.cbsistatic.com/cnwk.1d/i/tim//2010/08/18/Verizon_iPad_and_live_TV_610x458.JPG") } @Test @@ -320,34 +291,11 @@ class GoldSitesTestIT { @Test def msn() { implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://lifestyle.msn.com/your-life/your-money-today/article.aspx?cp-documentid=31244150" + val url: String = "http://living.msn.com/life-inspired/how-to-save-money-on-groceries-3" val article = TestUtils.getArticle(url) TestUtils.runArticleAssertions(article = article, - expectedStart = "\"Head to the supermarket an hour before closing time. Some stores mark down ", + expectedStart = "\"Head to the supermarket an hour ", expectedImage = "http://blu.stb.s-msn.com/i/6D/1235D306AF18A532BCDC8EB1CC42.jpg") - TestUtils.printReport() - } - - @Test - def ap() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://hosted2.ap.org/APDEFAULT/bbd825583c8542898e6fa7d440b9febc/Article_2011-10-06-Kids-Concussions/id-6cb44517aaec4303936fa07d5490dce6" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "(AP) — The number of athletic children going to hospitals with concussions is up 60 percent in the past decade", - expectedImage = null) - TestUtils.printReport() - } - - - @Test - def yahoo() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://news.yahoo.com/apple-says-steve-jobs-resigning-ceo-224628633.html" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "SAN FRANCISCO (AP) — Steve Jobs, the mind behind the iPhone", - expectedImage = "http://l1.yimg.com/bt/api/res/1.2/rQjGYdY_uYh6LpCnzkGFvQ--/YXBwaWQ9eW5ld3M7Zmk9ZmlsbDtoPTc1O3E9ODU7dz0xMDA-/http://media.zenfs.com/en_us/News/ap_webfeeds/89854c5c8090bd15df0e6a706700dfbc.jpg") } @Test @@ -357,7 +305,7 @@ class GoldSitesTestIT { val article = TestUtils.getArticle(url) TestUtils.runArticleAssertions(article = article, expectedStart = "Steve Jobs was just 30 years old, wildly successful, fabulously wealthy and a global celebrity. And then it all came crashing down.", - expectedImage = "http://a.abcnews.go.com/images/Technology/gty_steve_jobs_port_4_dm_111006_me.jpg") + expectedImage = "http://a.abcnews.com/images/Technology/gty_steve_jobs_port_4_dm_111006_wg.jpg") } @Test @@ -367,20 +315,9 @@ class GoldSitesTestIT { val article = TestUtils.getArticle(url) TestUtils.runArticleAssertions(article = article, expectedStart = "And now we're looking at two down days in a", - expectedImage = "http://static7.businessinsider.com/image/4df5d311ccd1d5591f190000/major-rally-collapses-ahead-of-huge-day-heres-what-you-need-to-know.jpg") - TestUtils.printReport() + expectedImage = "http://static5.businessinsider.com/image/4df5d311ccd1d5591f190000-336-251/china-dive.jpg") } - @Test - def financialTimes() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://www.ft.com/intl/cms/s/2/4e268022-e472-11e0-92a3-00144feabdc0.htm" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "Hewlett-Packard shares jumped nearly 7 per", - expectedImage = null) - TestUtils.printReport() - } @Test def huffpoBusiness() { @@ -390,7 +327,6 @@ class GoldSitesTestIT { TestUtils.runArticleAssertions(article = article, expectedStart = "For men and women who plan on entering the job", expectedImage = null) - TestUtils.printReport() } @Test @@ -400,8 +336,7 @@ class GoldSitesTestIT { val article = TestUtils.getArticle(url) TestUtils.runArticleAssertions(article = article, expectedStart = "MONTGOMERY, Ala. -- Alabama's strict new immigration law may be backfiring.", - expectedImage = "http://i.huffpost.com/gen/369284/thumbs/s-ALABAMA-WORKERS-IMMIGRATION-LAW-large.jpg") - TestUtils.printReport() + expectedImage = "http://i.huffpost.com/gen/369284/thumbs/r-ALABAMA-WORKERS-IMMIGRATION-LAW-large570.jpg") } @@ -413,7 +348,6 @@ class GoldSitesTestIT { TestUtils.runArticleAssertions(article = article, expectedStart = "WASHINGTON (Reuters) - The government is continuing an aggressive drive to hold accountable", expectedImage = null) - TestUtils.printReport() } @Test @@ -425,7 +359,6 @@ class GoldSitesTestIT { TestUtils.runArticleAssertions(article = article, expectedStart = "Please. Someone, everyone, do something to save the American Folk Art Museum from dissolution and dispersa", expectedImage = "http://graphics8.nytimes.com/images/2011/09/20/arts/20folkart-web/20folkart-web-articleLarge.jpg") - TestUtils.printReport() } @Test @@ -437,7 +370,6 @@ class GoldSitesTestIT { TestUtils.runArticleAssertions(article = article, expectedStart = "Healthy men should no longer receive a P.S.A. blood test to screen for prostate cancer because the test does not save lives", expectedImage = null) - TestUtils.printReport() } @@ -447,8 +379,6 @@ class GoldSitesTestIT { config.setBrowserUserAgent("grvGoose") val url: String = "http://jimplush.com/public/uploads/goosetest.php" val article = TestUtils.getArticle(url) - println(article.rawHtml) - } @@ -461,20 +391,6 @@ class GoldSitesTestIT { TestUtils.runArticleAssertions(article = article, expectedStart = "Some traders found Wednesday's Fed statement to be a bit gloomier than expected.") - TestUtils.printReport() - } - - @Test - def cnbc3() { - implicit val config = TestUtils.DEFAULT_CONFIG - - val url: String = "http://www.cnbc.com//id/44608735" - val article = TestUtils.getArticle(url) - - TestUtils.runArticleAssertions(article = article, - expectedStart = "Existing home sales rose more than expected in August to the fastest annual", - expectedImage = "http://media.cnbc.com/i/CNBC/Sections/News_And_Analysis/__Story_Inserts/graphics/__REAL_ESTATE/home_sales13.jpg") - TestUtils.printReport() } @@ -488,7 +404,7 @@ class GoldSitesTestIT { // TestUtils.runArticleAssertions(article = article, // expectedStart = "Some traders found Wednesday's Fed statement to be a bit gloomier than expected.", // expectedImage = "http://media.cnbc.com/i/CNBC/Sections/News_And_Analysis/__Story_Inserts/graphics/__FEDERAL_RESERVE/FED_RESERVE3.jpg") - // TestUtils.printReport() + // // } @Test @@ -497,9 +413,7 @@ class GoldSitesTestIT { implicit val config = TestUtils.DEFAULT_CONFIG val article = TestUtils.getArticle(url) TestUtils.runArticleAssertions(article = article, - expectedStart = "SAN FRANCISCO (AP) -- As trial balloons go", - expectedImage = "http://chart.finance.yahoo.com/instrument/1.0/HPQ/chart;range=1d/image;size=239x110?lang=en-US®ion=US") - TestUtils.printReport() + expectedStart = "SAN FRANCISCO (AP) -- As trial balloons go") } @@ -511,7 +425,6 @@ class GoldSitesTestIT { TestUtils.runArticleAssertions(article = article, expectedStart = "The hemline could no longer be held. With wartime controls on", expectedImage = null) - TestUtils.printReport() } @@ -521,9 +434,7 @@ class GoldSitesTestIT { implicit val config = TestUtils.DEFAULT_CONFIG val article = TestUtils.getArticle(url) TestUtils.runArticleAssertions(article = article, - expectedStart = "NEW YORK (AP) -- The Federal Reserve did what investors", - expectedImage = "http://l.yimg.com/a/p/fi/41/20/44.jpg") - TestUtils.printReport() + expectedStart = "NEW YORK (AP) -- The Federal Reserve did what investors") } @Test @@ -533,8 +444,7 @@ class GoldSitesTestIT { val article = TestUtils.getArticle(url) TestUtils.runArticleAssertions(article = article, expectedStart = "As everyone in the world was transfixed on the Fed", - expectedImage = "http://static5.businessinsider.com/image/4e77323e69beddba4c00001c/meanwhile-developments-in-greece.jpg") - TestUtils.printReport() + expectedImage = "http://static6.businessinsider.com/image/4e77323e69beddba4c00001c-400-300/greece-flag-water.jpg") } @Test @@ -545,8 +455,7 @@ class GoldSitesTestIT { TestUtils.runArticleAssertions(article = article, expectedStart = "From Goldman on the FOMC operation twist announcement", - expectedImage = "http://static8.businessinsider.com/image/4e7a0dd26bb3f7da4800003d/goldman-4-key-points-on-the-fomc-announcement.jpg") - TestUtils.printReport() + expectedImage = "http://static8.businessinsider.com/image/4e7a0dd26bb3f7da4800003d/twist.jpg") } @@ -600,7 +509,7 @@ class GoldSitesTestIT { } val url: String = "http://voices.yahoo.com/article/9330101/lovess-demise-10882501.html" val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, expectedTitle = "Loves's Demise", + TestUtils.runArticleAssertions(article = article, expectedTitle = "Love's Demise", expectedStart = "Do we not love like lovers in demise? We both know our love has faded away;") } } From 600bb2cc1c9eea9b1c9821df1b5dcfe2edfd785d Mon Sep 17 00:00:00 2001 From: Marco Singer Date: Tue, 3 Apr 2012 14:25:46 -0300 Subject: [PATCH 091/347] remove filter of image extension Gif --- src/main/scala/com/gravity/goose/images/ImageUtils.scala | 2 +- .../com/gravity/goose/images/StandardImageExtractor.scala | 2 +- .../com/gravity/goose/images/UpgradedImageIExtractor.scala | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/scala/com/gravity/goose/images/ImageUtils.scala b/src/main/scala/com/gravity/goose/images/ImageUtils.scala index 5f3e619b5..c99092c0a 100644 --- a/src/main/scala/com/gravity/goose/images/ImageUtils.scala +++ b/src/main/scala/com/gravity/goose/images/ImageUtils.scala @@ -198,7 +198,7 @@ object ImageUtils extends Logging { case "png" => ".png" case "jpg" => ".jpg" case "jpeg" => ".jpg" - case ".gif" => ".gif" + case "gif" => ".gif" case _ => "NA" } mimeType diff --git a/src/main/scala/com/gravity/goose/images/StandardImageExtractor.scala b/src/main/scala/com/gravity/goose/images/StandardImageExtractor.scala index 7130cf949..237a9cae6 100644 --- a/src/main/scala/com/gravity/goose/images/StandardImageExtractor.scala +++ b/src/main/scala/com/gravity/goose/images/StandardImageExtractor.scala @@ -77,7 +77,7 @@ class StandardImageExtractor(httpClient: HttpClient, article: Article, config: C var sb: StringBuilder = new StringBuilder // create negative elements - sb.append(".html|.gif|.ico|button|twitter.jpg|facebook.jpg|ap_buy_photo|digg.jpg|digg.png|delicious.png|facebook.png|reddit.jpg|doubleclick|diggthis|diggThis|adserver|/ads/|ec.atdmt.com") + sb.append(".html|.ico|button|twitter.jpg|facebook.jpg|ap_buy_photo|digg.jpg|digg.png|delicious.png|facebook.png|reddit.jpg|doubleclick|diggthis|diggThis|adserver|/ads/|ec.atdmt.com") sb.append("|mediaplex.com|adsatt|view.atdmt") matchBadImageNames = Pattern.compile(sb.toString()).matcher(string.empty) diff --git a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala index 18a836a8b..89c02b48a 100644 --- a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala +++ b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala @@ -49,7 +49,7 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: var sb: StringBuilder = new StringBuilder // create negative elements - sb.append(".html|.gif|.ico|button|twitter.jpg|facebook.jpg|ap_buy_photo|digg.jpg|digg.png|delicious.png|facebook.png|reddit.jpg|doubleclick|diggthis|diggThis|adserver|/ads/|ec.atdmt.com") + sb.append(".html|.ico|button|twitter.jpg|facebook.jpg|ap_buy_photo|digg.jpg|digg.png|delicious.png|facebook.png|reddit.jpg|doubleclick|diggthis|diggThis|adserver|/ads/|ec.atdmt.com") sb.append("|mediaplex.com|adsatt|view.atdmt") matchBadImageNames = Pattern.compile(sb.toString()).matcher(string.empty) @@ -199,7 +199,7 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: height = locallyStoredImage.height imageSrc = locallyStoredImage.imgSrc fileExtension = locallyStoredImage.fileExtension - if (fileExtension != ".gif" && fileExtension != "NA") + if (fileExtension != "NA") if ((depthLevel >= 1 && locallyStoredImage.width > 300) || depthLevel < 1) if (!isBannerDimensions(width, height)) if (width > MIN_WIDTH) From 40e76fa6ff54ada40101872a27d37829c372b42e Mon Sep 17 00:00:00 2001 From: Marco Singer Date: Tue, 3 Apr 2012 14:26:24 -0300 Subject: [PATCH 092/347] removing old tests and added tests for soccer websites --- .../com/gravity/goose/GoldSitesTestIT.scala | 505 +----------------- 1 file changed, 12 insertions(+), 493 deletions(-) diff --git a/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala b/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala index 1d504dcff..8dd3da578 100644 --- a/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala +++ b/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala @@ -11,506 +11,25 @@ import com.gravity.goose.extractors.{VoicesContentExtractor, AdditionalDataExtra * Date: 8/16/11 * This class hits live websites and is only run manually, not part of the tests lifecycle */ + +/** + * Updated by Marco Singer + * User: marcosinger + * Date: 4/3/12 + * This list is now just of soccer websites + */ class GoldSitesTestIT { @Test - def ego() { + def espn_brazil() { implicit val config = TestUtils.DEFAULT_CONFIG - val url = "http://ego.globo.com/famosos/noticia/2012/02/jaque-khury-vai-praia-no-rio.html" - val content = "Jaque Khury foi à praia da Barra da Tijuca, na Zona Oeste do Rio" - val image = "http://s.glbimg.com/jo/eg/f/620x0/2012/02/28/5_2.jpg" - val title = "Amores brutos: Jaque Khury brinca de luta em praia com o namorado" + val url = "http://espn.estadao.com.br/saopaulo/noticia/248648_UM+ANO+APOS+APRESENTACAO+PARA+45+MIL+LUIS+FABIANO+ACUMULA+TRES+LESOES+E+14+GOLS" + val content = "Há exatamente um ano, cerca de 45 mil pessoas faziam festa no Morumbi" + val image = "http://contenti1.espn.com.br/foto/pequena/1d5b0d8f-1d44-3ade-a582-5c9d8700773c.gif" + val title = "Um ano após apresentação para 45 mil, Luis Fabiano acumula três lesões e 14 gols" val article = TestUtils.getArticle(url) TestUtils.runArticleAssertions(article = article, expectedTitle = title, expectedImage = image) } - - @Test - def folha() { - implicit val config = TestUtils.DEFAULT_CONFIG - - val url = "http://www1.folha.uol.com.br/cotidiano/1056128-problema-em-check-in-da-tam-afeta-aeroportos-em-todo-o-pais.shtml" - val content = "Uma falha do sistema de check-in da TAM provoca transtornos para quem tenta embarcar nos aviões da companhia na manhã desta sexta-feira." - val image = "http://f.i.uol.com.br/folha/cotidiano/images/12062207.jpeg" - val title = "Problema em check-in da TAM afeta aeroportos em todo o país" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = content, - expectedTitle = title, - expectedImage = image) - } - - @Test - def techCrunch() { - implicit val config = TestUtils.DEFAULT_CONFIG - // implicit val config = TestUtils.NO_IMAGE_CONFIG - val url = "http://techcrunch.com/2011/08/13/2005-zuckerberg-didnt-want-to-take-over-the-world/" - val content = "The Huffington Post has come across this fascinating five-minute interview" - val image = "http://tctechcrunch2011.files.wordpress.com/2011/08/screen-shot-2011-08-13-at-4-55-35-pm.png?w=288" - val title = "2005 Zuckerberg Didn’t Want To Take Over The World" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, expectedTitle = title, expectedImage = image, expectedStart = content) - } - - - @Test - def cnn() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url = "http://www.cnn.com/2010/POLITICS/08/13/democrats.social.security/index.html" - val article = TestUtils.getArticle(url) - val title = "Democrats to use Social Security against GOP this fall" - val content = "Washington (CNN) -- Democrats pledged " - val image = "http://i.cdn.turner.com/cnn/2010/POLITICS/08/13/democrats.social.security/story.kaine.gi.jpg" - TestUtils.runArticleAssertions(article = article, expectedTitle = title, expectedStart = content, expectedImage = image) - } - - @Test - def cnn2() { - val url = "http://www.cnn.com/2011/POLITICS/10/06/tea.party.left/index.html?hpt=hp_t1" - implicit val config = TestUtils.DEFAULT_CONFIG - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "Washington (CNN) -- Wall Street should have seen it coming. After all, market forces were at work.", - expectedImage = "http://i.cdn.turner.com/cnn/2011/POLITICS/10/06/tea.party.left/t1larg.occupydc2.jpg") - } - - @Test - def businessWeek() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://www.businessweek.com/magazine/content/10_34/b4192066630779.htm" - val article: Article = TestUtils.getArticle(url) - val title = "Olivia Munn: Queen of the Uncool" - val content = "Six years ago, Olivia Munn arrived in Hollywood with fading ambitions of making it as a sports reporter and set about deploying" - val image = "http://images.businessweek.com/mz/10/34/370/1034_mz_66popmunnessa.jpg" - TestUtils.runArticleAssertions(article = article, expectedTitle = title, expectedStart = content, expectedImage = image) - } - - - @Test - def businessWeek2() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://www.businessweek.com/magazine/content/10_34/b4192048613870.htm" - val article: Article = TestUtils.getArticle(url) - val content = "There's discord on Wall Street: Strategists at major American investment banks see a" - val image = "http://images.businessweek.com/mz/covers/current_120x160.jpg" - TestUtils.runArticleAssertions(article = article, expectedStart = content, expectedImage = image) - - } - - @Test - def businessWeek3() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://www.businessinsider.com/ben-and-jerrys-schweddy-balls-one-million-moms-american-family-association-boycott-2011-9" - val article: Article = TestUtils.getArticle(url) - // if (article == null) println("NULL ARTICLE!") else println("TEXT: \n" + article.cleanedArticleText) - val content = "Not everyone's a fan of Ben & Jerry's new \"Schweddy Balls\" -- the Saturday Night Live-inspired flavor it rolled out a few weeks ago" - val image = "http://static7.businessinsider.com/image/4e68c8c36bb3f7d80a000016/conservative-moms-are-now-calling-for-a-boycott-of-ben-and-jerrys-schweddy-balls-flavor.jpg" - TestUtils.runArticleAssertions(article = article, expectedStart = content, expectedImage = image) - } - - @Test - def desertNews() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url = "http://www.deseretnews.com/article/705388385/High-school-basketball-Top-Utah-prospects-representing-well.html" - val article = TestUtils.getArticle(url) - val content = "Utah isn't known nationally for producing top basketball talent" - TestUtils.runArticleAssertions(article, expectedStart = content) - } - - @Test - def foxNews() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://www.foxnews.com/politics/2010/08/14/russias-nuclear-help-iran-stirs-questions-improved-relations/" - val article = TestUtils.getArticle(url) - val content = "Russia's announcement that it will help Iran get nuclear fuel is raising questions" - val image = "http://a57.foxnews.com/static/managed/img/Politics/396/223/startsign.jpg" - TestUtils.runArticleAssertions(article = article, expectedStart = content, expectedImage = image) - - } - - @Test - def foxNews2() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://www.foxnews.com/politics/2011/10/06/obama-defends-528-million-federal-loan-to-bankrupt-solyndra/" - val article = TestUtils.getArticle(url) - val content = "The director of the controversial loan program that cleared the way for a $535" - val image = "http://a57.foxnews.com/static/managed/img/Politics/396/223/silver_jonathan.jpg" - TestUtils.runArticleAssertions(article = article, expectedStart = content, expectedImage = image) - } - - @Test - def laTimes() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://www.latimes.com/business/la-fi-jobs-legacy-hiltzik-20111006,0,5186643.column" - val article = TestUtils.getArticle(url) - val content = "Everyone knows Steve Jobs pulled off one of the outstanding corporate turnarounds in U.S. history" - TestUtils.runArticleAssertions(article = article, expectedStart = content) - } - - @Test - def aolNews() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://www.aolnews.com/nation/article/the-few-the-proud-the-marines-getting-a-makeover/19592478" - val article = TestUtils.getArticle(url) - val content = "WASHINGTON (Aug. 13) -- Declaring \"the maritime soul of the Marine Corps\" is" - val image = "http://o.aolcdn.com/photo-hub/news_gallery/6/8/680919/1281734929876.JPEG" - TestUtils.runArticleAssertions(article = article, expectedStart = content, expectedImage = image) - } - - @Test - def wallStreetJournal() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://online.wsj.com/article/SB10001424052748704532204575397061414483040.html" - val article = TestUtils.getArticle(url) - val content = "The Obama administration has paid out less than a third of the nearly $230 billion" - val image = "http://si.wsj.net/public/resources/images/OB-JO747_stimul_G_20100814113803.jpg" - TestUtils.runArticleAssertions(article = article, expectedStart = content, expectedImage = image) - } - - @Test - def usaToday() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://content.usatoday.com/communities/thehuddle/post/2010/08/brett-favre-practices-set-to-speak-about-return-to-minnesota-vikings/1" - val article = TestUtils.getArticle(url) - val content = "Brett Favre couldn't get away from the" - val image = "http://i.usatoday.net/communitymanager/_photos/the-huddle/2010/08/18/favrespeaksx-inset-community.jpg" - TestUtils.runArticleAssertions(article = article, expectedStart = content, expectedImage = image) - } - - @Test - def usaToday2() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://content.usatoday.com/communities/driveon/post/2010/08/gm-finally-files-for-ipo/1" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "General Motors just filed with the Securities and Exchange ", - expectedImage = "http://i.usatoday.net/communitymanager/_photos/drive-on/2010/08/18/cruzex-wide-community.jpg") - } - - @Test - def usaToday3() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://www.usatoday.com/money/perfi/funds/story/2011-10-05/3q-mutual-fund-report/50674776/1" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "Timothy McIntosh, a Tampa financial planner, has always been able to soothe his customers after a rough patch in the stock market. Until now.", - expectedImage = "http://i.usatoday.net/money/_photos/2011/10/05/many-quit-stocks-is-it-time-to-buy-blen936-x.jpg") - } - - - @Test - def espn() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://sports.espn.go.com/espn/commentary/news/story?id=5461430" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "If you believe what college football coaches have said about sports", - expectedImage = "http://a.espncdn.com/photo/2010/0813/ncf_i_mpouncey1_300.jpg") - } - - @Test - def washingtonpost() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://www.washingtonpost.com/wp-dyn/content/article/2010/12/08/AR2010120803185.html" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "The Supreme Court sounded ", - expectedImage = "http://media3.washingtonpost.com/wp-dyn/content/photo/2010/10/09/PH2010100904575.jpg") - } - - @Test - def engadget() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://www.engadget.com/2010/08/18/verizon-fios-set-top-boxes-getting-a-new-hd-guide-external-stor/" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "Streaming and downloading TV content to mobiles is nice", - expectedImage = "http://www.blogcdn.com/www.engadget.com/media/2010/08/44ni600.jpg") - } - - @Test - def time() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://www.time.com/time/health/article/0,8599,2011497,00.html" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "This month, the federal government released", - expectedImage = "http://img.timeinc.net/time/daily/2010/1008/bp_oil_spill_0817.jpg") - } - - @Test - def time2() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://newsfeed.time.com/2011/08/24/washington-monument-closes-to-repair-earthquake-induced-crack/" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "Despite what the jeers of jaded Californians might suggest", - expectedImage = "http://timenewsfeed.files.wordpress.com/2011/08/newsfeed_0824.jpg?w=460&h=300&crop=1") - } - - @Test - def time404() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://newsfeed.time.com/2011/08/24/washington-monument-closes-to-repair-earthquake-induced-FOO-BAR/" - val article = TestUtils.getArticle(url) - - assertNull("Article title should be null for a 404 url!", article.title) - } - - @Test - def tulsaWorld() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://www.tulsaworld.com/site/articlepath.aspx?articleid=20111118_61_A16_Opposi344152&rss_lnk=7" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "Opposition to a proposal to remove certain personal data") - - } - - - @Test - def cnet() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://news.cnet.com/8301-30686_3-20014053-266.html?tag=topStories1" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "The phone company is adding bells and whistles to", - expectedImage = "http://asset1.cbsistatic.com/cnwk.1d/i/tim//2010/08/18/Verizon_iPad_and_live_TV_610x458.JPG") - } - - @Test - def wired() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://www.wired.com/epicenter/2011/10/steve-jobs-disability/" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "When I heard that Steve Jobs had passed away, I was boarding a train from New York to Philadelphia to visit my son.", - expectedImage = "http://www.wired.com/images_blogs/epicenter/2011/10/Apple-Siri-Blind-660x375.jpg") - } - - @Test - def msn() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://living.msn.com/life-inspired/how-to-save-money-on-groceries-3" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "\"Head to the supermarket an hour ", - expectedImage = "http://blu.stb.s-msn.com/i/6D/1235D306AF18A532BCDC8EB1CC42.jpg") - } - - @Test - def abcnews() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://abcnews.go.com/Technology/steve-jobs-fire-company/story?id=14683754" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "Steve Jobs was just 30 years old, wildly successful, fabulously wealthy and a global celebrity. And then it all came crashing down.", - expectedImage = "http://a.abcnews.com/images/Technology/gty_steve_jobs_port_4_dm_111006_wg.jpg") - } - - @Test - def businessInsider() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://www.businessinsider.com/closing-bell-september-20-2011-9" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "And now we're looking at two down days in a", - expectedImage = "http://static5.businessinsider.com/image/4df5d311ccd1d5591f190000-336-251/china-dive.jpg") - } - - - @Test - def huffpoBusiness() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://www.huffingtonpost.com/david-macaray/labor-union-membership_b_973038.html" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "For men and women who plan on entering the job", - expectedImage = null) - } - - @Test - def huffpo() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://www.huffingtonpost.com/2011/10/06/alabama-workers-immigration-law_n_997793.html" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "MONTGOMERY, Ala. -- Alabama's strict new immigration law may be backfiring.", - expectedImage = "http://i.huffpost.com/gen/369284/thumbs/r-ALABAMA-WORKERS-IMMIGRATION-LAW-large570.jpg") - } - - - @Test - def huffpoBusiness2() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://www.huffingtonpost.com/2011/09/21/us-sees-challenges-in-s_n_974724.html" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "WASHINGTON (Reuters) - The government is continuing an aggressive drive to hold accountable", - expectedImage = null) - } - - @Test - def nyTimes1() { - implicit val config = TestUtils.DEFAULT_CONFIG - config.setBrowserUserAgent("grvGoose") - val url: String = "http://www.nytimes.com/2011/09/20/arts/design/preserving-the-american-folk-art-museums-place-in-new-york.html?_r=1&ref=arts" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "Please. Someone, everyone, do something to save the American Folk Art Museum from dissolution and dispersa", - expectedImage = "http://graphics8.nytimes.com/images/2011/09/20/arts/20folkart-web/20folkart-web-articleLarge.jpg") - } - - @Test - def nyTimes2() { - implicit val config = TestUtils.DEFAULT_CONFIG - config.setBrowserUserAgent("grvGoose") - val url: String = "http://www.nytimes.com/2011/10/07/health/07prostate.html?_r=1&hp" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "Healthy men should no longer receive a P.S.A. blood test to screen for prostate cancer because the test does not save lives", - expectedImage = null) - } - - - @Test - def gooseRequestParameters() { - implicit val config = TestUtils.DEFAULT_CONFIG - config.setBrowserUserAgent("grvGoose") - val url: String = "http://jimplush.com/public/uploads/goosetest.php" - val article = TestUtils.getArticle(url) - } - - - @Test - def cnbc() { - implicit val config = TestUtils.NO_IMAGE_CONFIG - - val url: String = "http://www.cnbc.com/id/44613978" - val article = TestUtils.getArticle(url) - - TestUtils.runArticleAssertions(article = article, - expectedStart = "Some traders found Wednesday's Fed statement to be a bit gloomier than expected.") - } - - - // @Test - // def cnbc2() { - // // commented out while this issue is resolve: https://github.com/jhy/jsoup/issues/130 - // implicit val config = TestUtils.DEFAULT_CONFIG - // val url: String = "http://www.cnbc.com/id/44614459" - // val article = TestUtils.getArticle(url) - // println(article.cleanedArticleText) - // TestUtils.runArticleAssertions(article = article, - // expectedStart = "Some traders found Wednesday's Fed statement to be a bit gloomier than expected.", - // expectedImage = "http://media.cnbc.com/i/CNBC/Sections/News_And_Analysis/__Story_Inserts/graphics/__FEDERAL_RESERVE/FED_RESERVE3.jpg") - // - // } - - @Test - def yahooFinance() { - val url = "http://finance.yahoo.com/news/Mulling-Meg-Whitman-HP-apf-4116866737.html?x=0" - implicit val config = TestUtils.DEFAULT_CONFIG - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "SAN FRANCISCO (AP) -- As trial balloons go") - } - - - @Test - def time3() { - val url = "http://www.time.com/time/magazine/article/0,9171,804054,00.html" - implicit val config = TestUtils.DEFAULT_CONFIG - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "The hemline could no longer be held. With wartime controls on", - expectedImage = null) - } - - - @Test - def yahooFinance2() { - val url = "http://finance.yahoo.com/news/Stocks-plunge-after-Fed-apf-3386772167.html?x=0" - implicit val config = TestUtils.DEFAULT_CONFIG - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "NEW YORK (AP) -- The Federal Reserve did what investors") - } - - @Test - def businessinsider() { - val url = "http://www.businessinsider.com/meanwhile-developments-in-greece-2011-9" - implicit val config = TestUtils.DEFAULT_CONFIG - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "As everyone in the world was transfixed on the Fed", - expectedImage = "http://static6.businessinsider.com/image/4e77323e69beddba4c00001c-400-300/greece-flag-water.jpg") - } - - @Test - def businessinsider2() { - val url = "http://www.businessinsider.com/goldman-on-the-fed-announcement-2011-9" - implicit val config = TestUtils.DEFAULT_CONFIG - val article = TestUtils.getArticle(url) - - TestUtils.runArticleAssertions(article = article, - expectedStart = "From Goldman on the FOMC operation twist announcement", - expectedImage = "http://static8.businessinsider.com/image/4e7a0dd26bb3f7da4800003d/twist.jpg") - } - - - @Test - def politico() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://www.politico.com/news/stories/1010/43352.html" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "If the newest Census Bureau estimates stay close to form", - expectedImage = "http://images.politico.com/global/news/100927_obama22_ap_328.jpg") - } - - @Test - def buzznetImages() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://newageamazon.buzznet.com/user/journal/17025056/doubt-gives-hope-new-album/" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "We've had so many false hopes with the new No Doubt CD.", - expectedImage = "http://img.buzznet.com/assets/imgx/2/0/8/2/2/2/1/3/orig-20822213.jpg") - } - - @Test - def timeImages() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://swampland.time.com/2012/01/09/hecklers-and-hostile-crowds-stymie-santorum-in-new-hampshire/" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "It was a scene fit for a front-runner: an overflow crowd spilling out the doors of a Rockwellian", - expectedImage = "http://timeswampland.files.wordpress.com/2012/01/sl_santprotest_0109_blog.jpg?w=600&h=400&crop=1") - } - - @Test - def cnnMoneyImages() { - implicit val config = TestUtils.DEFAULT_CONFIG - val url: String = "http://money.cnn.com/2012/01/09/pf/suze_orman_prepaid_card/index.htm?iid=HP_LN" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, - expectedStart = "NEW YORK (CNNMoney) -- CNBC's outspoken financial adviser, Suze", - expectedImage = "http://i2.cdn.turner.com/money/2012/01/09/pf/suze_orman_prepaid_card/suze-orman.top.jpg") - } - - @Test - def yahooVoices() { - implicit val config = { - val myConfig = new Configuration - myConfig.enableImageFetching = false - myConfig.setContentExtractor(new VoicesContentExtractor) - myConfig - } - val url: String = "http://voices.yahoo.com/article/9330101/lovess-demise-10882501.html" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, expectedTitle = "Love's Demise", - expectedStart = "Do we not love like lovers in demise? We both know our love has faded away;") - } } From 26fe08f74294e11f0053039f097ba868db4bc79c Mon Sep 17 00:00:00 2001 From: Marco Singer Date: Tue, 3 Apr 2012 22:59:03 -0300 Subject: [PATCH 093/347] scala like: set correct encoding --- src/main/scala/com/gravity/goose/network/HtmlFetcher.scala | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index 0691706ea..203b6c444 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -93,6 +93,7 @@ object HtmlFetcher extends Logging { var htmlResult: String = null var entity: HttpEntity = null var instream: InputStream = null + var encodingType: String = null // Identified the the apache http client does not drop URL fragments before opening the request to the host // more info: http://stackoverflow.com/questions/4251841/400-error-with-httpclient-for-a-link-with-an-anchor @@ -116,12 +117,8 @@ object HtmlFetcher extends Logging { entity = response.getEntity if (entity != null) { instream = entity.getContent - var encodingType: String = "UTF-8" try { - encodingType = EntityUtils.getContentCharSet(entity) - if (encodingType == null) { - encodingType = "UTF-8" - } + encodingType = Option(EntityUtils.getContentCharSet(entity)) getOrElse "ISO-8859-1" } catch { case e: Exception => { From 5e2cbd978eb834da1f9e6dc7214e0b618fdf3691 Mon Sep 17 00:00:00 2001 From: Marco Singer Date: Tue, 3 Apr 2012 23:00:12 -0300 Subject: [PATCH 094/347] added more two feeds in GoldSitesTest: folha and lancenet --- .../com/gravity/goose/GoldSitesTestIT.scala | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala b/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala index 8dd3da578..bc1f826a5 100644 --- a/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala +++ b/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala @@ -31,5 +31,38 @@ class GoldSitesTestIT { val article = TestUtils.getArticle(url) TestUtils.runArticleAssertions(article = article, expectedTitle = title, expectedImage = image) } + + @Test + def folha() { + implicit val config = TestUtils.DEFAULT_CONFIG + + val url = "http://www1.folha.uol.com.br/esporte/1070420-leao-critica-regulamento-do-paulista-e-poe-culpa-na-tv.shtml" + val content = "Após retomar a liderança do Campeonato Paulista, com a vitória do São Paulo de virada por 4 a 2 sobre o Ituano" + val image = "http://f.i.uol.com.br/folha/esporte/images/12084302.jpeg" + val title = "Leão critica regulamento do Paulista e põe culpa na TV" + val article = TestUtils.getArticle(url) + + TestUtils.runArticleAssertions(article = article, + expectedStart = content, + expectedTitle = title, + expectedImage = image) + } + + + @Test + def lancenet() { + implicit val config = TestUtils.DEFAULT_CONFIG + + val url = "http://www.lancenet.com.br/sao-paulo/Leao-Arena-Barueri-casa-Tricolor_0_675532605.html" + val content = "No próximo sábado, o São Paulo jogará, como mandante, na Arena Barueri diante do Mogi Mirim" + val image = "http://www.lancenet.com.br/futebol-general/Paulo-Catanduvense-Campeonato-Paulista-Fernandinho_LANIMA20120329_0148_25.jpg" + val title = "Para Leão, Arena Barueri não é casa do Tricolor" + val article = TestUtils.getArticle(url) + + TestUtils.runArticleAssertions(article = article, + expectedStart = content, + expectedTitle = title, + expectedImage = image) + } } From 283b28ada499a8145bc6668596b00d5878995277 Mon Sep 17 00:00:00 2001 From: Marco Singer Date: Wed, 4 Apr 2012 01:57:16 -0300 Subject: [PATCH 095/347] removing warnings --- .../com/gravity/goose/extractors/ContentExtractor.scala | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index 064096c75..4050d935d 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -26,7 +26,7 @@ import collection.JavaConversions._ import org.jsoup.nodes.{Attributes, Element, Document} import org.jsoup.select.{Selector, Elements} import collection.mutable.{Buffer, ListBuffer, HashSet} - +import scala.math._ /** * Created by Jim Plush * User: jim @@ -222,8 +222,8 @@ trait ContentExtractor { if (numberOfNodes > 15) { if ((numberOfNodes - i) <= bottomNodesForNegativeScore) { val booster: Float = bottomNodesForNegativeScore.asInstanceOf[Float] - (numberOfNodes - i).asInstanceOf[Float] - boostScore = -Math.pow(booster, 2.asInstanceOf[Float]).asInstanceOf[Float] - val negscore: Float = Math.abs(boostScore) + negativeScoring + boostScore = -pow(booster, 2.asInstanceOf[Float]).asInstanceOf[Float] + val negscore: Float = abs(boostScore) + negativeScoring if (negscore > 40) { boostScore = 5 } @@ -647,4 +647,4 @@ trait ContentExtractor { sb.append(e.attr("class")) sb.toString() } -} \ No newline at end of file +} From 6c98e310a76e1b83c39f99da44ccd03860028456 Mon Sep 17 00:00:00 2001 From: Marco Singer Date: Wed, 4 Apr 2012 01:58:22 -0300 Subject: [PATCH 096/347] when run tests show the deprecations warnings --- build.sbt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index e7bcbbf6c..c42fe8008 100644 --- a/build.sbt +++ b/build.sbt @@ -4,6 +4,8 @@ version := "2.1.13" scalaVersion := "2.9.1" +scalacOptions ++= Seq("-unchecked", "-deprecation") + libraryDependencies += "org.jsoup" % "jsoup" % "1.5.2" libraryDependencies += "org.slf4j" % "slf4j-api" % "1.6.1" @@ -12,6 +14,6 @@ libraryDependencies += "commons-io" % "commons-io" % "2.0.1" libraryDependencies += "commons-lang" % "commons-lang" % "2.6" -libraryDependencies += "org.apache.httpcomponents" % "httpclient" % "4.1.2" +libraryDependencies += "org.apache.httpcomponents" % "httpclient" % "4.1.3" libraryDependencies += "com.novocode" % "junit-interface" % "0.8" % "test" From 254ce0a9742bf66d80f962b5ddd0ee5b72f22bdf Mon Sep 17 00:00:00 2001 From: Marco Singer Date: Wed, 4 Apr 2012 02:01:10 -0300 Subject: [PATCH 097/347] added method resolveCharSet with a feeds whitelist --- .../scala/com/gravity/goose/Configuration.scala | 15 +++++++++++++-- .../com/gravity/goose/network/HtmlFetcher.scala | 14 +------------- .../com/gravity/goose/GoldSitesTestIT.scala | 16 ++++++++++++++++ 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index b076a66c5..29dd5716d 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -22,8 +22,9 @@ import org.jsoup.nodes.Element import java.util.Date import reflect.BeanProperty import com.gravity.goose.extractors.{StandardContentExtractor, ContentExtractor, AdditionalDataExtractor, PublishDateExtractor} - - +import java.net.URL +import org.apache.http.util.EntityUtils +import org.apache.http.HttpEntity /** * Created by Jim Plush * User: jim @@ -33,6 +34,16 @@ import com.gravity.goose.extractors.{StandardContentExtractor, ContentExtractor, class Configuration { + // Refactory this in a YML file (like Ruby) + def resolveCharSet(url: String, entity: HttpEntity): String = { + var host = new URL(url).getHost() + + host match { + case "www1.folha.uol.com.br" => return "ISO-8859-1" + case "espn.estadao.com.br" => return "ISO-8859-1" + case _ => return Option(EntityUtils.getContentCharSet(entity)) getOrElse "UTF-8" + } + } /** * this is the local storage path used to place images to inspect them, should be writable */ diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index 203b6c444..95087c26d 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -43,7 +43,6 @@ import org.apache.http.params.HttpParams import org.apache.http.params.HttpProtocolParams import org.apache.http.protocol.BasicHttpContext import org.apache.http.protocol.HttpContext -import org.apache.http.util.EntityUtils import java.io._ import java.net.SocketException import java.net.SocketTimeoutException @@ -93,7 +92,6 @@ object HtmlFetcher extends Logging { var htmlResult: String = null var entity: HttpEntity = null var instream: InputStream = null - var encodingType: String = null // Identified the the apache http client does not drop URL fragments before opening the request to the host // more info: http://stackoverflow.com/questions/4251841/400-error-with-httpclient-for-a-link-with-an-anchor @@ -117,17 +115,7 @@ object HtmlFetcher extends Logging { entity = response.getEntity if (entity != null) { instream = entity.getContent - try { - encodingType = Option(EntityUtils.getContentCharSet(entity)) getOrElse "ISO-8859-1" - } - catch { - case e: Exception => { - if (logger.isDebugEnabled) { - trace("Unable to get charset for: " + cleanUrl) - trace("Encoding Type is: " + encodingType) - } - } - } + val encodingType: String = config.resolveCharSet(url, entity) try { htmlResult = HtmlFetcher.convertStreamToString(instream, 15728640, encodingType).trim } diff --git a/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala b/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala index bc1f826a5..632f6ce52 100644 --- a/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala +++ b/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala @@ -64,5 +64,21 @@ class GoldSitesTestIT { expectedTitle = title, expectedImage = image) } + + @Test + def globoesporte() { + implicit val config = TestUtils.DEFAULT_CONFIG + + val url = "http://globoesporte.globo.com/futebol/times/sao-paulo/noticia/2012/04/filho-do-gramado-leao-administra-o-sao-paulo-na-base-da-conversa.html" + val content = "Emerson Leão não foi ao campo na manhã desta terça-feira no centro de treinamento do São Paulo" + val image = "http://s2.glbimg.com/DKjyTG2ZACkmIUmt2NcSIuR8k48J3DLeS8Txhob9fJz2lXAYXrrJq_ZurQ44i4Jn/s.glbimg.com/es/ge/f/original/2012/03/25/leao_ae_marioangelo.jpg" + val title = "'Filho do gramado', Leão administra o São Paulo na base da conversa" + val article = TestUtils.getArticle(url) + + TestUtils.runArticleAssertions(article = article, + expectedStart = content, + expectedTitle = title, + expectedImage = image) + } } From 91a01edea118e37fb1a17c4cbc92d9cdcfb29024 Mon Sep 17 00:00:00 2001 From: Amir Moulavi Date: Wed, 11 Apr 2012 21:08:19 +0200 Subject: [PATCH 098/347] Source level 1.5 is added along with maven compiler plugin in order to have support for annotations --- pom.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pom.xml b/pom.xml index 8a5772687..9222859dc 100644 --- a/pom.xml +++ b/pom.xml @@ -122,6 +122,14 @@
+ + org.apache.maven.plugins + maven-compiler-plugin + + 1.5 + 1.5 + + org.apache.maven.plugins maven-source-plugin From 078029e54e3a3f5bf45f43e36081913eaad53012 Mon Sep 17 00:00:00 2001 From: Manuel Giesa Date: Thu, 3 May 2012 14:09:28 +0200 Subject: [PATCH 099/347] Fixed article extraction for articles with a relative declaration. --- src/main/java/com/jimplush/goose/ContentExtractor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java index 2f55921b4..21ed56568 100644 --- a/src/main/java/com/jimplush/goose/ContentExtractor.java +++ b/src/main/java/com/jimplush/goose/ContentExtractor.java @@ -412,12 +412,12 @@ private String getMetaKeywords(Document doc) { private String getCanonicalLink(Document doc, String baseUrl) { Elements meta = doc.select("link[rel=canonical]"); if (meta.size() > 0) { - String href = meta.first().attr("href"); + String href = meta.first().attr("abs:href"); return string.isNullOrEmpty(href) ? string.empty : href.trim(); } else { return baseUrl; } - + /* Not sure what this is for // set domain based on canonicalUrl URL url = null; From 5bda9119a020cdd65a36ad6425a609f6937c2129 Mon Sep 17 00:00:00 2001 From: Manuel Giesa Date: Thu, 3 May 2012 14:44:29 +0200 Subject: [PATCH 100/347] It seems that goose fiddles around with the JSoup document so that the "abs:" prefix does not work in every case. This commit resolves relative canonical URIs correctly. --- pom.xml | 2 +- .../com/jimplush/goose/ContentExtractor.java | 57 ++++++++++--------- 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/pom.xml b/pom.xml index fc7c378c7..2c2f3373a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.jimplush goose - 1.4.1.3 + 1.4.1.4 jar goose diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java index 21ed56568..ed454731c 100644 --- a/src/main/java/com/jimplush/goose/ContentExtractor.java +++ b/src/main/java/com/jimplush/goose/ContentExtractor.java @@ -37,6 +37,8 @@ import java.io.File; import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; import java.util.*; @@ -409,34 +411,33 @@ private String getMetaKeywords(Document doc) { /** * if the article has meta canonical link set in the url */ - private String getCanonicalLink(Document doc, String baseUrl) { - Elements meta = doc.select("link[rel=canonical]"); - if (meta.size() > 0) { - String href = meta.first().attr("abs:href"); - return string.isNullOrEmpty(href) ? string.empty : href.trim(); - } else { - return baseUrl; - } - -/* Not sure what this is for - // set domain based on canonicalUrl - URL url = null; - try { - - if (canonicalUrl != null) { - if (!canonicalUrl.startsWith("http://")) { - url = new URL(new URL(baseUrl), canonicalUrl); - } else { - url = new URL(canonicalUrl); - } - - } else { - url = new URL(baseUrl); - } - - } catch (MalformedURLException e) { - logger.error(e.toString(), e); - }*/ + private String getCanonicalLink(Document document, String baseUrl) { + Elements canonicalLinkElements = document.select("link[rel=canonical][href]"); + + if(canonicalLinkElements.size() == 0) { + return baseUrl; + } + + try { + // We could use JSoups "abs:" prefix here to get an absolute URI. Sadly, Goose does not + // setup the document properly to allow this. + String canonicalUriString = canonicalLinkElements.first().attr("href").trim(); + if(canonicalUriString.length() == 0) { + return baseUrl; + } + + URI canonicalUri = new URI(canonicalUriString); + if(canonicalUri.isAbsolute()) { + return canonicalUriString; + } + + // The canonical URI is relative and must be resolved against the base URI. + return new URI(baseUrl).resolve(canonicalUri).toString(); + + } catch (URISyntaxException e) { + logger.warn("URISyntaxException while resolving canonical link: {}!", e.getMessage(), e); + return baseUrl; + } } /** From f13284a570b0716ad5952bb0a29fe23898f49085 Mon Sep 17 00:00:00 2001 From: Meghana Date: Tue, 10 Jul 2012 15:06:37 +0530 Subject: [PATCH 101/347] Use line.separator from sys.props for newline Windows converts new lines to \n\r, but the split() is done on "\n" so all stopwords have a carraige return at the end. --- .../com/gravity/goose/text/StopWords.scala | 124 +++++++++--------- 1 file changed, 62 insertions(+), 62 deletions(-) diff --git a/src/main/scala/com/gravity/goose/text/StopWords.scala b/src/main/scala/com/gravity/goose/text/StopWords.scala index 9f8669e8b..1053902ae 100644 --- a/src/main/scala/com/gravity/goose/text/StopWords.scala +++ b/src/main/scala/com/gravity/goose/text/StopWords.scala @@ -1,62 +1,62 @@ -/** - * Licensed to Gravity.com under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. Gravity.com licenses this file - * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.gravity.goose.text - -/** - * Created by Jim Plush - * User: jim - * Date: 8/16/11 - */ - -import java.util._ -import com.gravity.goose.utils.FileHelper - -object StopWords { - - // the confusing pattern below is basically just match any non-word character excluding white-space. - private val PUNCTUATION: StringReplacement = StringReplacement.compile("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\p{Pc}\\s]", string.empty) - - val STOP_WORDS = FileHelper.loadResourceFile("stopwords-en.txt", StopWords.getClass).split("\n").toSet - - - def removePunctuation(str: String): String = { - PUNCTUATION.replaceAll(str) - } - - def getStopWordCount(content: String): WordStats = { - - if (string.isNullOrEmpty(content)) return WordStats.EMPTY - val ws: WordStats = new WordStats - val strippedInput: String = removePunctuation(content) - - val candidateWords: Array[String] = string.SPACE_SPLITTER.split(strippedInput) - - val overlappingStopWords: List[String] = new ArrayList[String] - - candidateWords.foreach(w => { - if (STOP_WORDS.contains(w.toLowerCase)) overlappingStopWords.add(w.toLowerCase) - }) - ws.setWordCount(candidateWords.length) - ws.setStopWordCount(overlappingStopWords.size) - ws.setStopWords(overlappingStopWords) - ws - } - - -} +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gravity.goose.text + +/** + * Created by Jim Plush + * User: jim + * Date: 8/16/11 + */ + +import java.util._ +import com.gravity.goose.utils.FileHelper + +object StopWords { + + // the confusing pattern below is basically just match any non-word character excluding white-space. + private val PUNCTUATION: StringReplacement = StringReplacement.compile("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\p{Pc}\\s]", string.empty) + + val STOP_WORDS = FileHelper.loadResourceFile("stopwords-en.txt", StopWords.getClass).split(sys.props("line.separator")).toSet + + + def removePunctuation(str: String): String = { + PUNCTUATION.replaceAll(str) + } + + def getStopWordCount(content: String): WordStats = { + + if (string.isNullOrEmpty(content)) return WordStats.EMPTY + val ws: WordStats = new WordStats + val strippedInput: String = removePunctuation(content) + + val candidateWords: Array[String] = string.SPACE_SPLITTER.split(strippedInput) + + val overlappingStopWords: List[String] = new ArrayList[String] + + candidateWords.foreach(w => { + if (STOP_WORDS.contains(w.toLowerCase)) overlappingStopWords.add(w.toLowerCase) + }) + ws.setWordCount(candidateWords.length) + ws.setStopWordCount(overlappingStopWords.size) + ws.setStopWords(overlappingStopWords) + ws + } + + +} From 6f6802bcef98d92a75b7be0f4eab0705c0222249 Mon Sep 17 00:00:00 2001 From: Meghana Date: Tue, 10 Jul 2012 15:41:03 +0530 Subject: [PATCH 102/347] Revert "Use line.separator from sys.props for newline" This reverts commit f13284a570b0716ad5952bb0a29fe23898f49085. --- .../com/gravity/goose/text/StopWords.scala | 124 +++++++++--------- 1 file changed, 62 insertions(+), 62 deletions(-) diff --git a/src/main/scala/com/gravity/goose/text/StopWords.scala b/src/main/scala/com/gravity/goose/text/StopWords.scala index 1053902ae..9f8669e8b 100644 --- a/src/main/scala/com/gravity/goose/text/StopWords.scala +++ b/src/main/scala/com/gravity/goose/text/StopWords.scala @@ -1,62 +1,62 @@ -/** - * Licensed to Gravity.com under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. Gravity.com licenses this file - * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.gravity.goose.text - -/** - * Created by Jim Plush - * User: jim - * Date: 8/16/11 - */ - -import java.util._ -import com.gravity.goose.utils.FileHelper - -object StopWords { - - // the confusing pattern below is basically just match any non-word character excluding white-space. - private val PUNCTUATION: StringReplacement = StringReplacement.compile("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\p{Pc}\\s]", string.empty) - - val STOP_WORDS = FileHelper.loadResourceFile("stopwords-en.txt", StopWords.getClass).split(sys.props("line.separator")).toSet - - - def removePunctuation(str: String): String = { - PUNCTUATION.replaceAll(str) - } - - def getStopWordCount(content: String): WordStats = { - - if (string.isNullOrEmpty(content)) return WordStats.EMPTY - val ws: WordStats = new WordStats - val strippedInput: String = removePunctuation(content) - - val candidateWords: Array[String] = string.SPACE_SPLITTER.split(strippedInput) - - val overlappingStopWords: List[String] = new ArrayList[String] - - candidateWords.foreach(w => { - if (STOP_WORDS.contains(w.toLowerCase)) overlappingStopWords.add(w.toLowerCase) - }) - ws.setWordCount(candidateWords.length) - ws.setStopWordCount(overlappingStopWords.size) - ws.setStopWords(overlappingStopWords) - ws - } - - -} +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.gravity.goose.text + +/** + * Created by Jim Plush + * User: jim + * Date: 8/16/11 + */ + +import java.util._ +import com.gravity.goose.utils.FileHelper + +object StopWords { + + // the confusing pattern below is basically just match any non-word character excluding white-space. + private val PUNCTUATION: StringReplacement = StringReplacement.compile("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\p{Pc}\\s]", string.empty) + + val STOP_WORDS = FileHelper.loadResourceFile("stopwords-en.txt", StopWords.getClass).split("\n").toSet + + + def removePunctuation(str: String): String = { + PUNCTUATION.replaceAll(str) + } + + def getStopWordCount(content: String): WordStats = { + + if (string.isNullOrEmpty(content)) return WordStats.EMPTY + val ws: WordStats = new WordStats + val strippedInput: String = removePunctuation(content) + + val candidateWords: Array[String] = string.SPACE_SPLITTER.split(strippedInput) + + val overlappingStopWords: List[String] = new ArrayList[String] + + candidateWords.foreach(w => { + if (STOP_WORDS.contains(w.toLowerCase)) overlappingStopWords.add(w.toLowerCase) + }) + ws.setWordCount(candidateWords.length) + ws.setStopWordCount(overlappingStopWords.size) + ws.setStopWords(overlappingStopWords) + ws + } + + +} From f174397dc64203a1feae121b9da2f303f490c102 Mon Sep 17 00:00:00 2001 From: Meghana Date: Tue, 10 Jul 2012 15:45:00 +0530 Subject: [PATCH 103/347] Adding .project, .cache, .classpath, .settings to git ignore --- .gitignore | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 615c5c5c9..491cd0f9e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,8 @@ -target/ -/goose.iml -/goose.ipr -/goose.iws +target/ +/goose.iml +/goose.ipr +/goose.iws +.project +.cache +.classpath +.settings/ \ No newline at end of file From d307fe2d3ec857e30459592ea83085b7a03af3be Mon Sep 17 00:00:00 2001 From: Meghana Date: Tue, 10 Jul 2012 15:54:32 +0530 Subject: [PATCH 104/347] Use line.separator from sys.props for newline Windows converts new lines to \n\r, but the split() is done on "\n" so all stopwords have a carraige return at the end and all tests fail since none of the words are matched. --- src/main/scala/com/gravity/goose/text/StopWords.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/text/StopWords.scala b/src/main/scala/com/gravity/goose/text/StopWords.scala index 9f8669e8b..f1b7ea94d 100644 --- a/src/main/scala/com/gravity/goose/text/StopWords.scala +++ b/src/main/scala/com/gravity/goose/text/StopWords.scala @@ -32,7 +32,7 @@ object StopWords { // the confusing pattern below is basically just match any non-word character excluding white-space. private val PUNCTUATION: StringReplacement = StringReplacement.compile("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\p{Pc}\\s]", string.empty) - val STOP_WORDS = FileHelper.loadResourceFile("stopwords-en.txt", StopWords.getClass).split("\n").toSet + val STOP_WORDS = FileHelper.loadResourceFile("stopwords-en.txt", StopWords.getClass).split(sys.props("line.separator")).toSet def removePunctuation(str: String): String = { From 1c1787d212e219638bc37588401df9774fe157a6 Mon Sep 17 00:00:00 2001 From: Marco Singer Date: Sat, 14 Jul 2012 11:32:33 -0300 Subject: [PATCH 105/347] bug fix warning: added log4j dependencies --- build.sbt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build.sbt b/build.sbt index c42fe8008..ec95d5d84 100644 --- a/build.sbt +++ b/build.sbt @@ -8,6 +8,10 @@ scalacOptions ++= Seq("-unchecked", "-deprecation") libraryDependencies += "org.jsoup" % "jsoup" % "1.5.2" +libraryDependencies += "log4j" % "log4j" % "1.2.16" + +libraryDependencies += "org.slf4j" % "slf4j-log4j12" % "1.6.6" + libraryDependencies += "org.slf4j" % "slf4j-api" % "1.6.1" libraryDependencies += "commons-io" % "commons-io" % "2.0.1" From b4a16ba1893def2164d7bed775398f66be1b6930 Mon Sep 17 00:00:00 2001 From: Marco Singer Date: Sat, 14 Jul 2012 11:32:57 -0300 Subject: [PATCH 106/347] removing support for ESPN website --- .../scala/com/gravity/goose/GoldSitesTestIT.scala | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala b/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala index 632f6ce52..cea59e881 100644 --- a/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala +++ b/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala @@ -16,22 +16,10 @@ import com.gravity.goose.extractors.{VoicesContentExtractor, AdditionalDataExtra * Updated by Marco Singer * User: marcosinger * Date: 4/3/12 - * This list is now just of soccer websites + * This list now just soccer websites */ class GoldSitesTestIT { - @Test - def espn_brazil() { - implicit val config = TestUtils.DEFAULT_CONFIG - - val url = "http://espn.estadao.com.br/saopaulo/noticia/248648_UM+ANO+APOS+APRESENTACAO+PARA+45+MIL+LUIS+FABIANO+ACUMULA+TRES+LESOES+E+14+GOLS" - val content = "Há exatamente um ano, cerca de 45 mil pessoas faziam festa no Morumbi" - val image = "http://contenti1.espn.com.br/foto/pequena/1d5b0d8f-1d44-3ade-a582-5c9d8700773c.gif" - val title = "Um ano após apresentação para 45 mil, Luis Fabiano acumula três lesões e 14 gols" - val article = TestUtils.getArticle(url) - TestUtils.runArticleAssertions(article = article, expectedTitle = title, expectedImage = image) - } - @Test def folha() { implicit val config = TestUtils.DEFAULT_CONFIG From 1cc3ed074252a72e12edfb6ad95ed33e1483faa4 Mon Sep 17 00:00:00 2001 From: Marco Singer Date: Sat, 14 Jul 2012 11:56:40 -0300 Subject: [PATCH 107/347] resolving some side effects --- src/main/scala/com/gravity/goose/Crawler.scala | 2 +- .../com/gravity/goose/cleaners/DocumentCleaner.scala | 4 +--- .../gravity/goose/extractors/ContentExtractor.scala | 2 +- .../goose/outputformatters/OutputFormatter.scala | 12 +++++++----- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index cf55aa343..a372d1194 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -59,7 +59,7 @@ class Crawler(config: Configuration) { article.linkhash = parseCandidate.linkhash article.rawHtml = rawHtml article.doc = doc - article.rawDoc = doc.clone() + article.rawDoc = doc.clone article.title = extractor.getTitle(article) article.publishDate = config.publishDateExtractor.extract(doc) diff --git a/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala b/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala index bafcb1cab..37b747355 100644 --- a/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala +++ b/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala @@ -44,7 +44,7 @@ trait DocumentCleaner { trace("Starting cleaning phase with DefaultDocumentCleaner") - var docToClean: Document = article.doc + var docToClean: Document = article.doc.clone docToClean = cleanEmTags(docToClean) docToClean = removeDropCaps(docToClean) docToClean = removeScriptsAndStyles(docToClean) @@ -57,8 +57,6 @@ trait DocumentCleaner { docToClean = cleanUpSpanTagsInParagraphs(docToClean) docToClean = convertDivsToParagraphs(docToClean, "div") docToClean = convertDivsToParagraphs(docToClean, "span") - - // docToClean = convertDivsToParagraphs(docToClean, "span") docToClean } diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index 4050d935d..02bc3d53a 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -189,7 +189,7 @@ trait ContentExtractor { def calculateBestNodeBasedOnClustering(article: Article): Option[Element] = { trace(logPrefix + "Starting to calculate TopNode") - val doc = article.doc + val doc = article.doc.clone var topNode: Element = null val nodesToCheck: ArrayList[Element] = getNodesToCheck(doc) var startingBoost: Double = 1.0 diff --git a/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala b/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala index f3234053b..1e641cff1 100644 --- a/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala +++ b/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala @@ -63,11 +63,13 @@ trait OutputFormatter { * @return a formatted string with all HTML removed */ def getFormattedText(topNode: Element): String = { - removeNodesWithNegativeScores(topNode) - convertLinksToText(topNode) - replaceTagsWithText(topNode) - removeParagraphsWithFewWords(topNode) - convertToText(topNode) + var node = topNode.clone + + removeNodesWithNegativeScores(node) + convertLinksToText(node) + replaceTagsWithText(node) + removeParagraphsWithFewWords(node) + convertToText(node) } /** From b01b50303c5ab533ea75b028965a679ae735cec3 Mon Sep 17 00:00:00 2001 From: Marco Singer Date: Sat, 14 Jul 2012 15:21:48 -0300 Subject: [PATCH 108/347] creating a html version of the topNode. Use htmlArticle instead of cleanedArticleText. --- .../scala/com/gravity/goose/Article.scala | 6 + .../scala/com/gravity/goose/Crawler.scala | 17 +- .../outputformatters/OutputFormatter.scala | 27 +- .../com/jimplush/goose/GoldSitesTestIT.java | 508 ------------------ .../com/gravity/goose/GoldSitesTestIT.scala | 41 +- .../scala/com/gravity/goose/TestUtils.scala | 34 +- 6 files changed, 83 insertions(+), 550 deletions(-) delete mode 100644 src/test/java/com/jimplush/goose/GoldSitesTestIT.java diff --git a/src/main/scala/com/gravity/goose/Article.scala b/src/main/scala/com/gravity/goose/Article.scala index 77db32393..7f4ab5597 100644 --- a/src/main/scala/com/gravity/goose/Article.scala +++ b/src/main/scala/com/gravity/goose/Article.scala @@ -42,6 +42,12 @@ class Article { */ var cleanedArticleText: String = "" + + /** + * article with the originals HTML tags (

, , ..) + */ + var htmlArticle: String = "" + /** * meta description field in HTML source */ diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index a372d1194..44f56c53e 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -72,20 +72,17 @@ class Crawler(config: Configuration) { // before we do any calcs on the body itself let's clean up the document article.doc = docCleaner.clean(article) - - extractor.calculateBestNodeBasedOnClustering(article) match { case Some(node: Element) => { - article.topNode = node - article.movies = extractor.extractVideos(article.topNode) + article.movies = extractor.extractVideos(node) if (config.enableImageFetching) { trace(logPrefix + "Image fetching enabled...") val imageExtractor = getImageExtractor(article) try { - article.topImage = imageExtractor.getBestImage(article.rawDoc, article.topNode) + article.topImage = imageExtractor.getBestImage(article.rawDoc, node) if (config.enableAllImagesFetching) { - article.allImages = imageExtractor.getAllImages(article.topNode) + article.allImages = imageExtractor.getAllImages(node) } } catch { case e: Exception => { @@ -93,17 +90,13 @@ class Crawler(config: Configuration) { } } } - article.topNode = extractor.postExtractionCleanup(article.topNode) - - - - + article.topNode = extractor.postExtractionCleanup(node) + article.htmlArticle = outputFormatter.cleanupHtml(article.topNode) article.cleanedArticleText = outputFormatter.getFormattedText(article.topNode) } case _ => trace("NO ARTICLE FOUND"); } releaseResources(article) - // self.reply(article) article } diff --git a/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala b/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala index 1e641cff1..df70e5721 100644 --- a/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala +++ b/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala @@ -89,6 +89,29 @@ trait OutputFormatter { } +/** + * Scape the node content and return the html + * @param topNode the top most node to format + * @return a formatted string with all HTML + */ + def cleanupHtml(topNode: Element): String = { + val node = topNode.clone + removeParagraphsWithFewWords(node) + convertToHtml(node) + } + + private def convertToHtml(topNode: Element): String = topNode match { + case null => "" + case node => { + StringEscapeUtils.unescapeHtml(node.html).trim + + (node.children().map((e: Element) => { + // FIXTHIS - Use some jsoup class to do this + "

" + StringEscapeUtils.unescapeHtml(e.html).trim + "

" + })).mkString + } + } + /** * cleans up and converts any nodes that should be considered text into text */ @@ -182,9 +205,9 @@ trait OutputFormatter { logger.debug("removeParagraphsWithFewWords starting...") } - val allNodes = topNode.getAllElements + val paragraphs = topNode.getElementsByTag("p") - for (el <- allNodes) { + for (el <- paragraphs) { try { val stopWords = StopWords.getStopWordCount(el.text) if (stopWords.getStopWordCount < 3 && el.getElementsByTag("object").size == 0 && el.getElementsByTag("embed").size == 0) { diff --git a/src/test/java/com/jimplush/goose/GoldSitesTestIT.java b/src/test/java/com/jimplush/goose/GoldSitesTestIT.java deleted file mode 100644 index 8d662e987..000000000 --- a/src/test/java/com/jimplush/goose/GoldSitesTestIT.java +++ /dev/null @@ -1,508 +0,0 @@ - -// NO_IMAGE_CONFIG.setEnableImageFetching(false); -// } -// - -// -// public void testTechCrunch() { -// String url = "http://techcrunch.com/2010/08/13/gantto-takes-on-microsoft-project-with-web-based-project-management-application/"; -// Article article = getArticle(url); -// String expectedTitle = "Gantto Takes On Microsoft Project With Web-Based Project Management Application"; -// String expectedStart = "Y Combinator-backed Gantto is launching"; -// String expectedImage = "http://tctechcrunch.files.wordpress.com/2010/08/tour.jpg?w=640"; -// -// runArticleAssertions(article, expectedTitle, expectedStart, expectedImage); -// -// } -// -// -// public void testBusinessWeek2() { -// -// String url = "http://www.businessweek.com/magazine/content/10_34/b4192048613870.htm"; -// Article article = getArticle(url); -// -// runArticleAssertions(article, "There's discord on Wall Street: Strategists at major American investment banks see a", "http://images.businessweek.com/mz/covers/current_120x160.jpg"); -// } -// - -// - - -// -// public void testESPN2() { -// -// String url = "http://sports.espn.go.com/golf/pgachampionship10/news/story?id=5463456"; -// Article article = getArticle(url); -// -// runArticleAssertions(article, "SHEBOYGAN, Wis. -- The only number that matters at the PGA Championship", "http://a.espncdn.com/photo/2010/0814/pga_g_watney12_200.jpg"); -// } -// - - - -// -// public void testBoingBoing() { -// -// String url = "http://www.boingboing.net/2010/08/18/dr-laura-criticism-o.html"; -// Article article = getArticle(url); -// -// runArticleAssertions(article, "Dr. Laura Schlessinger is leaving radio to regain", "http://www.boingboing.net/images/drlaura.jpg"); -// } -// -// -// public void testGigaOhm() { -// -// String url = "http://gigaom.com/apple/apples-next-macbook-an-800-mac-for-the-masses/"; -// Article article = getArticle(url); -// -// runArticleAssertions(article, "The MacBook Air is a bold move forward ", "http://gigapple.files.wordpress.com/2010/10/macbook-feature.png?w=300&h=200"); -// } -// -// public void testMashable() { -// -// String url = "http://mashable.com/2010/08/18/how-tonot-to-ask-someone-out-online/"; -// -// Configuration config = new Configuration(); -// config.setAdditionalDataExtractor(new AdditionalDataExtractor() { -// @Override -// public Map extract(Element rootElement) { -// Elements elements = Selector.select("span.author > a", rootElement); -// if (elements.size() == 0) return null; -// String author = elements.get(0).text(); -// Map result = new HashMap(1); -// result.put("author", author); -// return result; -// } -// }); -// Article article = getArticle(url, config); -// -// runArticleAssertions(article, "Imagine, if you will, a crowded dance floor", "http://9.mshcdn.com/wp-content/uploads/2010/07/love.jpg"); -// -// assertNotNull("additionalData should not be null!", article.getAdditionalData()); -// assertEquals("additionalData.get(\"author\") should be as expected!", "Brenna Ehrlich", article.getAdditionalData().get("author")); -// } -// -// public void testReadWriteWeb() { -// -// String url = "http://www.readwriteweb.com/start/2010/08/pagely-headline.php"; -// Article article = getArticle(url); -// -// runArticleAssertions(article, "In the heart of downtown Chandler, Arizona", "http://rww.readwriteweb.netdna-cdn.com/start/images/pagelyscreen_aug10.jpg"); -// } -// -// public void testVentureBeat() { -// -// String url = "http://social.venturebeat.com/2010/08/18/facebook-reveals-the-details-behind-places/"; -// Article article = getArticle(url); -// -// runArticleAssertions(article, "Facebook just confirmed the rumors", "http://venturebeat.files.wordpress.com/2010/08/mark-zuckerberg-facebook-places.jpg?w=300&h=219"); -// } -// - - - -// -// public void testNewsweek() { -// -// String url = "http://www.newsweek.com/2010/10/09/how-moscow-s-war-on-islamist-rebels-is-backfiring.html"; -// Article article = getArticle(url); -// -// runArticleAssertions(article, "The video shows a gun barrel jutting from the rear", "http://www.newsweek.com/content/newsweek/2010/10/09/how-moscow-s-war-on-islamist-rebels-is-backfiring/_jcr_content/body/mainimage.img.jpg/1286654107500.jpg"); -// } -// -// public void testLifeHacker() { -// -// String url = "http://lifehacker.com/#!5659837/build-a-rocket-stove-to-heat-your-home-with-wood-scraps"; -// Article article = getArticle(url); -// -// runArticleAssertions(article, "If you find yourself with lots of leftover wood", "http://cache.gawker.com/assets/images/lifehacker/2010/10/rocket-stove-finished.jpeg"); -// } -// -// public void testNinjaBlog() { -// -// String url = "http://www.ninjatraderblog.com/im/2010/10/seo-marketing-facts-about-google-instant-and-ranking-your-website/"; -// Article article = getArticle(url, false); -// -// runArticleAssertions(article, "Many users around the world Google their queries"); -// } -// -// public void testNaturalHomeBlog() { -// -// String url = "http://www.naturalhomeandgarden.com/remodeling/small-steps-to-a-green-remodel.aspx"; -// Article article = getArticle(url); -// -// runArticleAssertions( -// article, -// "Though green remodeling sometimes involves big-ticket items like solar panels", -// "http://www.naturalhomeandgarden.com/uploadedImages/articles/issues/2011-05-01/NH-MA11-front-home_resized400X266.jpg"); -// } -// -// public void testSFGate() { -// -// String url = "http://www.sfgate.com/cgi-bin/article.cgi?f=/c/a/2010/10/27/BUD61G2DBL.DTL"; -// Article article = getArticle(url); -// -// runArticleAssertions(article, "Fewer homes in California and", "http://imgs.sfgate.com/c/pictures/2010/10/26/ba-foreclosures2_SFCG1288130091.jpg"); -// } -// -// public void testSportsIllustrated() { -// -// String url = "http://sportsillustrated.cnn.com/2011/writers/peter_king/05/08/mmqb/index.html?sct=nfl_t11_a0"; -// Article article = getArticle(url); -// -// runArticleAssertions(article, "Many of you have written or tweeted to ask whether I'll be covering more", "http://i2.cdn.turner.com/si/2011/writers/peter_king/05/08/mmqb/jake-locker.jpg"); -// } -// -// public void testStarMagazine() { -// -// String url = "http://www.starmagazine.com/news/17510?cid=RSS"; -// Article article = getArticle(url); -// -// runArticleAssertions(article, "The Real Reason Rihanna Skipped Katy's Wedding: No Cell Phone Reception!", "Rihanna has admitted the real reason she was a no show at her", "http://www.starmagazine.com/sites/starmagazine.com/files/imagecache/node_page_image/article_images/Rihanna_1010_230.jpg"); -// -// } -// -// public void testDailyBeast() { -// -// String url = "http://www.thedailybeast.com/blogs-and-stories/2010-11-01/ted-sorensen-speechwriter-behind-jfks-best-jokes/?cid=topic:featured1"; -// Article article = getArticle(url); -// -// runArticleAssertions(article, "Legendary Kennedy speechwriter Ted Sorensen passed", "http://www.tdbimg.com/files/2010/11/01/img-article---katz-ted-sorensen_163531624950.jpg"); -// } -// -// public void testBloomberg() { -// -// String url = "http://www.bloomberg.com/news/2010-11-01/china-becomes-boss-in-peru-on-50-billion-mountain-bought-for-810-million.html"; -// Article article = getArticle(url); -// -// runArticleAssertions(article, "The Chinese entrepreneur and the Peruvian shopkeeper", "http://www.bloomberg.com/apps/data?pid=avimage&iid=iimODmqjtcQU"); -// } -// -// public void testScientificDaily() { -// -// String url = "http://www.scientificamerican.com/article.cfm?id=bpa-semen-quality"; -// Article article = getArticle(url); -// -// runArticleAssertions(article, "Everyday BPA Exposure Decreases Human Semen Quality", "The common industrial chemical bisphenol A (BPA) ", "http://www.scientificamerican.com/media/inline/bpa-semen-quality_1.jpg"); -// } -// -// public void testSlamMagazine() { -// -// String url = "http://www.slamonline.com/online/nba/2010/10/nba-schoolyard-rankings/"; -// Article article = getArticle(url); -// -// runArticleAssertions(article, "NBA Schoolyard Rankings", "There are literally dozens of ways to predetermine", "http://www.slamonline.com/online/wp-content/uploads/2010/10/celtics.jpg"); -// } -// -// public void testTheFrisky() { -// -// String url = "http://www.thefrisky.com/post/246-rachel-dratch-met-her-baby-daddy-in-a-bar/?eref=RSS"; -// Article article = getArticle(url); -// -// runArticleAssertions(article, "Rachel Dratch Met Her Baby Daddy At A Bar", "Rachel Dratch had been keeping the identity of her baby daddy ", "http://cdn.thefrisky.com/images/uploads/rachel_dratch_102810_m.jpg"); -// } -// -// public void testUniverseToday() { -// -// String url = "http://www.universetoday.com/76881/podcast-more-from-tony-colaprete-on-lcross/"; -// Article article = getArticle(url); -// -// runArticleAssertions(article, "More From Tony Colaprete on LCROSS", "I had the chance to interview LCROSS", "http://www.universetoday.com/wp-content/uploads/2009/10/lcross-impact_01_01.jpg"); -// -// } -// -// -// public void testCNBC() { -// -// String url = "http://www.cnbc.com/id/40491584"; -// Article article = getArticle(url); -// -// runArticleAssertions(article, "Chinese Art Expert 'Skeptical' of Record-Setting Vase", "A prominent expert on Chinese works ", "http://media.cnbc.com/i/CNBC/Sections/News_And_Analysis/__Story_Inserts/graphics/__ART/chinese_vase_150.jpg"); -// -// } -// -// public void testEspnWithFlashVideo() { -// -// String url = "http://sports.espn.go.com/nfl/news/story?id=5971053"; -// Article article = getArticle(url); -// -// runArticleAssertions(article, "Michael Vick of Philadelphia Eagles misses practice, unlikely to play vs. Dallas Cowboys", "PHILADELPHIA -- Michael Vick missed practice Thursday", "http://a.espncdn.com/i/espn/espn_logos/espn_red.png"); -// -// } -// -// public void testSportingNews() { -// -// String url = "http://www.sportingnews.com/nfl/feed/2011-01/nfl-coaches/story/raiders-cut-ties-with-cable"; -// Article article = getArticle(url); -// -// runArticleAssertions(article, "Raiders cut ties with Cable", "ALAMEDA, Calif. — The Oakland Raiders informed coach Tom Cable", "http://dy.snimg.com/story-image/0/69/174475/14072-650-366.jpg"); -// -// } -// -// public void testFoxSports() { -// -// String url = "http://msn.foxsports.com/nfl/story/Tom-Cable-fired-contract-option-Oakland-Raiders-coach-010411"; -// Article article = getArticle(url, false); -// -// runArticleAssertions( -// article, -// "Oakland Raiders won't bring Tom Cable back as coach - NFL News", -// "The Oakland Raiders informed coach Tom Cable", -// null); -// } -// -// public void testMSNBC() { -// -// String url = "http://www.msnbc.msn.com/id/43085992/ns/business-stocks_and_economy/"; -// Article article = getArticle(url); -// -// runArticleAssertions( -// article, -// "LinkedIn share price soars in market debut", -// "There was an unmistakable echo of the dot-com boom Thursday", -// "http://msnbcmedia1.msn.com/j/MSNBC/Components/Photo/_new/110519_linkedin_hmed_0755p.grid-6x2.jpg"); -// -// } -// -// public void testEconomist() { -// -// String url = "http://www.economist.com/node/18802932"; -// Article article = getArticle(url); -// -// runArticleAssertions( -// article, -// "READERS who were paying attention in their maths classes may recall", -// "http://media.economist.com/images/images-magazine/2011/06/11/st/20110611_stp003.jpg"); -// -// } -// -// -// public void testTheAtlantic() { -// -// String url = "http://www.theatlantic.com/culture/archive/2011/01/how-to-stop-james-bond-from-getting-old/69695/"; -// Article article = getArticle(url); -// -// runArticleAssertions( -// article, -// "If James Bond could age, he'd be well into his 90s right now", -// "http://cdn.theatlantic.com/static/mt/assets/culture_test/James%20Bond_post.jpg"); -// } -// -// public void testGawker() { -// -// String url = "http://gawker.com/#!5777023/charlie-sheen-is-going-to-haiti-with-sean-penn"; -// Article article = getArticle(url); -// -// runArticleAssertions( -// article, -// "With a backlash brewing against the incessant media", -// "http://cache.gawkerassets.com/assets/images/7/2011/03/medium_0304_pennsheen.jpg"); -// } -// -// public void testNyTimes() { -// -// String url = "http://www.nytimes.com/2011/06/13/business/media/13link.html"; -// Article article = getArticle(url); -// -// runArticleAssertions( -// article, -// "The potential presidential candidate Sarah Palin has been criticized", -// "http://graphics8.nytimes.com/images/2011/06/13/business/link1/link1-articleInline.jpg"); -// } -// -// public void testTheVacationGals() { -// -// String url = "http://thevacationgals.com/vacation-rental-homes-are-a-family-reunion-necessity/"; -// Article article = getArticle(url); -// -// runArticleAssertions( -// article, -// "Editors’ Note: We are huge proponents", -// "http://thevacationgals.com/wp-content/uploads/2010/11/Gemmel-Family-Reunion-at-a-Vacation-Rental-Home1-300x225.jpg"); -// } -// -// -// public void testShockYa() { -// -// String url = "http://www.shockya.com/news/2011/01/30/daily-shock-jonathan-knight-of-new-kids-on-the-block-publicly-reveals-hes-gay/"; -// Article article = getArticle(url); -// -// runArticleAssertions( -// article, -// "New Kids On The Block singer Jonathan Knight has publicly", -// "http://www.shockya.com/news/wp-content/uploads/jonathan_knight_new_kids_gay.jpg"); -// } -// -// -// public void testLiveStrong() { -// -// String url = "http://www.livestrong.com/article/395538-how-to-decrease-the-rates-of-obesity-in-children/"; -// Article article = getArticle(url); -// -// runArticleAssertions( -// article, -// "Childhood obesity increases a young person", -// "http://photos.demandstudios.com/getty/article/184/46/87576279_XS.jpg"); -// } -// -// public void testLiveStrong2() { -// String url = "http://www.livestrong.com/article/396152-do-resistance-bands-work-for-strength-training/"; -// Article article = getArticle(url); -// -// runArticleAssertions( -// article, -// "Resistance bands or tubes are named because", -// "http://photos.demandstudios.com/getty/article/142/66/86504893_XS.jpg"); -// } -// -// public void testCracked() { -// String url = "http://www.cracked.com/article_19029_6-things-social-networking-sites-need-to-stop-doing.html"; -// Article article = getArticle(url); -// -// runArticleAssertions( -// article, -// "Social networking is here to stay", -// "http://i-beta.crackedcdn.com/phpimages/article/2/1/5/45215.jpg?v=1"); -// } -// -// public void testTrailsCom() { -// String url = "http://www.trails.com/facts_41596_hot-spots-citrus-county-florida.html"; -// Article article = getArticle(url); -// -// runArticleAssertions( -// article, -// "Snorkel and view artificial reefs or chase", -// "http://cdn-www.trails.com/imagecache/articles/295x195/hot-spots-citrus-county-florida-295x195.png"); -// } -// -// public void testTrailsCom2() { -// String url = "http://www.trails.com/facts_12408_history-alpine-skis.html"; -// Article article = getArticle(url); -// -// runArticleAssertions( -// article, -// "Derived from the old Norse word", -// "http://cdn-www.trails.com/imagecache/articles/295x195/history-alpine-skis-295x195.png"); -// } -// -// public void testEhow() { -// String url = "http://www.ehow.com/how_7734109_make-white-spaghetti.html"; -// Article article = getArticle(url, false); -// -// runArticleAssertions( -// article, -// "How to Make White Spaghetti", -// "For a filling and tasty dinner that doesn't require", -// null); -// } -// -// -// public void testGolfLink() { -// String url = "http://www.golflink.com/how_1496_eat-cheap-las-vegas.html"; -// Article article = getArticle(url); -// -// runArticleAssertions( -// article, -// "Las Vegas, while noted for its glitz", -// "http://cdn-www.golflink.com/Cms/images/GlobalPhoto/Articles/2011/2/17/1496/fotolia4152707XS-main_Full.jpg"); -// } -// -// public void testTimeMagazine2() { -// String url = "http://www.time.com/time/specials/packages/article/0,28804,2065531_2065534,00.html"; -// Article article = getArticle(url); -// -// runArticleAssertions( -// article, -// "The traditional Passover song", -// "http://img.timeinc.net/time/photoessays/2011/top10_passover/scallions.jpg"); -// } -// -// public void testWSJ2() { -// String url = "http://online.wsj.com/article/SB10001424052748704004004576270433180029082.html?mod=WSJ_hp_LEFTTopStories"; -// Article article = getArticle(url); -// -// runArticleAssertions( -// article, -// "Stocks recorded their biggest decline in more than a month", -// "http://m.wsj.net/video/20110418/041811hubpmmarkets2/041811hubpmmarkets2_512x288.jpg"); -// } -// -// public void testBuzznet() { -// String url = "http://wevegotyoucovered.buzznet.com/user/journal/8048821/buzznet-talks-bamboozle-festival-founder/"; -// Article article = getArticle(url); -// -// runArticleAssertions( -// article, -// "Bamboozle approaches! The three day music megafest", -// "http://cdn.buzznet.com/assets/imgx/1/4/0/6/1/1/9/1/orig-14061191.jpg"); -// } -// -// -// public void testTheSuperFicial() { -// String url = "http://www.thesuperficial.com/teen-mom-leah-divorce-corey-04-2011"; -// Article article = getArticle(url); -// -// runArticleAssertions( -// article, -// "Christ, did they all get implants?", -// "http://cdn03.cdn.thesuperficial.com/wp-content/uploads/2011/04/0418-teen-mom-leah-messer-divorce-14-480x720.jpg"); -// } -// -// public void testScribd() { -// String url = "http://www.scribd.com/doc/49951733/CNBC-Warren-Buffett-Transcript-March-2-2011"; -// Article article = getArticle(url, false); -// -// runArticleAssertions( -// article, -// "This is a transcript of his"); -// } -// -// public void testScribd2() { -// String url = "http://www.scribd.com/doc/23433951/10-Trends-to-Watch-2010"; -// Article article = getArticle(url, false); -// -// runArticleAssertions( -// article, -// "t is hard to believe another year has come"); -// } -// -// public void testDogster() { -// String url = "http://blogs.dogster.com/dog-training/dogs-understand-intimacy/2011/05/"; -// Article article = getArticle(url); -// -// runArticleAssertions( -// article, -// "Children and the elderly are the two populations", -// "http://www.theotherendoftheleash.com/theotherendoftheleash/uploads/2010/02/monkey-hugs-dog.jpg"); -// } -// -// -// public void testCatster() { -// String url = "http://blogs.catster.com/kitty-news-network/2011/05/03/survey-cat-owners-prefer-the-adoption-option/"; -// Article article = getArticle(url); -// -// runArticleAssertions( -// article, -// "There’s good news in the air for shelter cats", -// "http://b1.cdnsters.com/kitty-news-network/files/2011/05/thomas-and-dahlia-300x225.jpg"); -// } -// -// public void testScribd3() { -// String url = "http://www.scribd.com/doc/21795768/1-What-is-NLS-NLS-Stands-for-National-Language"; -// Article article = getArticle(url, false); -// -// runArticleAssertions( -// article, -// "Oracle Applications, it basically means the ability to run"); -// } -// -// public void testScribd4() { -// String url = "http://www.scribd.com/doc/52584146/Microfinance-and-Poverty-Reduction?in_collection=2987942"; -// Article article = getArticle(url, false); -// runArticleAssertions(article, "Microfinance and Poverty Reduction Susan Johnson and Ben Rogaly"); -// } -// - -//} -// - diff --git a/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala b/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala index cea59e881..8dc80849d 100644 --- a/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala +++ b/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala @@ -24,14 +24,18 @@ class GoldSitesTestIT { def folha() { implicit val config = TestUtils.DEFAULT_CONFIG - val url = "http://www1.folha.uol.com.br/esporte/1070420-leao-critica-regulamento-do-paulista-e-poe-culpa-na-tv.shtml" - val content = "Após retomar a liderança do Campeonato Paulista, com a vitória do São Paulo de virada por 4 a 2 sobre o Ituano" - val image = "http://f.i.uol.com.br/folha/esporte/images/12084302.jpeg" - val title = "Leão critica regulamento do Paulista e põe culpa na TV" - val article = TestUtils.getArticle(url) + val url = "http://www1.folha.uol.com.br/esporte/1070420-leao-critica-regulamento-do-paulista-e-poe-culpa-na-tv.shtml" + val content = "Após retomar a liderança do Campeonato Paulista, com a vitória do São Paulo de virada por 4 a 2 sobre o Ituano" + val image = "http://f.i.uol.com.br/folha/esporte/images/12084302.jpeg" + val title = "Leão critica regulamento do Paulista e põe culpa na TV" + val htmlContent = "

Após retomar a liderança do Campeonato Paulista, com a vitória do São Paulo de virada por 4 a 2 sobre o Ituano, o técnico Emerson Leão voltou a criticar a fórmula de disputa da competição e a FPF (Federação Paulista de Futebol), apontado a culpa para a emissora de televisão dona dos direitos de transmissão.

" + val article = TestUtils.getArticle(url) + + println(article.htmlArticle) TestUtils.runArticleAssertions(article = article, expectedStart = content, + expectedHtmlStart = htmlContent, expectedTitle = title, expectedImage = image) } @@ -41,14 +45,19 @@ class GoldSitesTestIT { def lancenet() { implicit val config = TestUtils.DEFAULT_CONFIG - val url = "http://www.lancenet.com.br/sao-paulo/Leao-Arena-Barueri-casa-Tricolor_0_675532605.html" - val content = "No próximo sábado, o São Paulo jogará, como mandante, na Arena Barueri diante do Mogi Mirim" - val image = "http://www.lancenet.com.br/futebol-general/Paulo-Catanduvense-Campeonato-Paulista-Fernandinho_LANIMA20120329_0148_25.jpg" - val title = "Para Leão, Arena Barueri não é casa do Tricolor" - val article = TestUtils.getArticle(url) + val url = "http://www.lancenet.com.br/sao-paulo/Leao-Arena-Barueri-casa-Tricolor_0_675532605.html" + val content = "No próximo sábado, o São Paulo jogará, como mandante, na Arena Barueri diante do Mogi Mirim" + val image = "http://www.lancenet.com.br/futebol-general/Paulo-Catanduvense-Campeonato-Paulista-Fernandinho_LANIMA20120329_0148_25.jpg" + val title = "Para Leão, Arena Barueri não é casa do Tricolor" + val htmlContent = "

No próximo sábado, o São Paulo jogará, como mandante, na Arena Barueri diante do Mogi Mirim. Isso porque no estádio do Morumbi haverá, nesta terça-feira à noite, mais um show do ex-baixista do Pink Floyd, Roger Waters. Show que prejudicará o gramado, tornando-o quase que impraticável até o fim de semana.

" + val article = TestUtils.getArticle(url) + + + println(article.htmlArticle) TestUtils.runArticleAssertions(article = article, expectedStart = content, + expectedHtmlStart = htmlContent, expectedTitle = title, expectedImage = image) } @@ -57,14 +66,16 @@ class GoldSitesTestIT { def globoesporte() { implicit val config = TestUtils.DEFAULT_CONFIG - val url = "http://globoesporte.globo.com/futebol/times/sao-paulo/noticia/2012/04/filho-do-gramado-leao-administra-o-sao-paulo-na-base-da-conversa.html" - val content = "Emerson Leão não foi ao campo na manhã desta terça-feira no centro de treinamento do São Paulo" - val image = "http://s2.glbimg.com/DKjyTG2ZACkmIUmt2NcSIuR8k48J3DLeS8Txhob9fJz2lXAYXrrJq_ZurQ44i4Jn/s.glbimg.com/es/ge/f/original/2012/03/25/leao_ae_marioangelo.jpg" - val title = "'Filho do gramado', Leão administra o São Paulo na base da conversa" - val article = TestUtils.getArticle(url) + val url = "http://globoesporte.globo.com/futebol/times/sao-paulo/noticia/2012/04/filho-do-gramado-leao-administra-o-sao-paulo-na-base-da-conversa.html" + val content = "Emerson Leão não foi ao campo na manhã desta terça-feira no centro de treinamento do São Paulo" + val image = "http://s2.glbimg.com/DKjyTG2ZACkmIUmt2NcSIuR8k48J3DLeS8Txhob9fJz2lXAYXrrJq_ZurQ44i4Jn/s.glbimg.com/es/ge/f/original/2012/03/25/leao_ae_marioangelo.jpg" + val title = "'Filho do gramado', Leão administra o São Paulo na base da conversa" + val htmlContent = "

Emerson Leão não foi ao campo na manhã desta terça-feira no centro de treinamento do São Paulo. Bem humorado e com roupa casual, preferiu acompanhar de longe o trabalho físico que seus comandados fizeram na academia e no gramado. Sem a urgência de fazer qualquer ajuste, o comandante optou por trabalhar nos bastidores.

" + val article = TestUtils.getArticle(url) TestUtils.runArticleAssertions(article = article, expectedStart = content, + expectedHtmlStart = htmlContent, expectedTitle = title, expectedImage = image) } diff --git a/src/test/scala/com/gravity/goose/TestUtils.scala b/src/test/scala/com/gravity/goose/TestUtils.scala index e5a4e6706..5069151ff 100644 --- a/src/test/scala/com/gravity/goose/TestUtils.scala +++ b/src/test/scala/com/gravity/goose/TestUtils.scala @@ -44,19 +44,20 @@ object TestUtils { article } - def runArticleAssertions(article: Article, expectedTitle: String = null, expectedStart: String = null, expectedImage: String = null, expectedDescription: String = null, expectedKeywords: String = null): Unit = { - articleReport.append("URL: ").append(TAB).append(article.finalUrl).append(NL) - articleReport.append("TITLE: ").append(TAB).append(article.title).append(NL) - articleReport.append("IMAGE: ").append(TAB).append(article.topImage.getImageSrc).append(NL) - articleReport.append("All_IMGS: ").append(TAB).append(article.allImages).append(NL) - articleReport.append("IMGKIND: ").append(TAB).append(article.topImage.imageExtractionType).append(NL) - articleReport.append("CONTENT: ").append(TAB).append(article.cleanedArticleText.replace("\n", " ")).append(NL) - articleReport.append("METAKW: ").append(TAB).append(article.metaKeywords).append(NL) - articleReport.append("METADESC: ").append(TAB).append(article.metaDescription).append(NL) - articleReport.append("DOMAIN: ").append(TAB).append(article.domain).append(NL) - articleReport.append("LINKHASH: ").append(TAB).append(article.linkhash).append(NL) - articleReport.append("MOVIES: ").append(TAB).append(article.movies).append(NL) - articleReport.append("TAGS: ").append(TAB).append(article.tags).append(NL) + def runArticleAssertions(article: Article, expectedTitle: String = null, expectedStart: String = null, expectedHtmlStart: String = null, expectedImage: String = null, expectedDescription: String = null, expectedKeywords: String = null): Unit = { + articleReport.append("URL: ").append(TAB).append(article.finalUrl).append(NL) + articleReport.append("TITLE: ").append(TAB).append(article.title).append(NL) + articleReport.append("IMAGE: ").append(TAB).append(article.topImage.getImageSrc).append(NL) + articleReport.append("All_IMGS: ").append(TAB).append(article.allImages).append(NL) + articleReport.append("IMGKIND: ").append(TAB).append(article.topImage.imageExtractionType).append(NL) + articleReport.append("CONTENT: ").append(TAB).append(article.cleanedArticleText.replace("\n", " ")).append(NL) + articleReport.append("HTML CONTENT: ").append(TAB).append(article.htmlArticle).append(NL) + articleReport.append("METAKW: ").append(TAB).append(article.metaKeywords).append(NL) + articleReport.append("METADESC: ").append(TAB).append(article.metaDescription).append(NL) + articleReport.append("DOMAIN: ").append(TAB).append(article.domain).append(NL) + articleReport.append("LINKHASH: ").append(TAB).append(article.linkhash).append(NL) + articleReport.append("MOVIES: ").append(TAB).append(article.movies).append(NL) + articleReport.append("TAGS: ").append(TAB).append(article.tags).append(NL) assertNotNull("Resulting article was NULL!", article) @@ -72,6 +73,13 @@ object TestUtils { val actual: String = articleText.substring(0, expectedStart.length) assertEquals("The beginning of the article text was not as expected!", expectedStart, actual) } + if (expectedHtmlStart != null) { + val articleHtml: String = article.htmlArticle + assertNotNull("Resulting article html was NULL!", articleHtml) + assertTrue("Article html was not as long as expected beginning!", expectedHtmlStart.length <= articleHtml.length) + val actual: String = articleHtml.substring(0, expectedHtmlStart.length) + assertEquals("The beginning of the article html was not as expected!", expectedHtmlStart, actual) + } if (expectedImage != null) { val image: Image = article.topImage assertNotNull("Top image was NULL!", image) From 1bbfc65bbf1a8068dae5d52a9bb7b4f80cc5c4a1 Mon Sep 17 00:00:00 2001 From: Marco Singer Date: Sat, 14 Jul 2012 15:23:48 -0300 Subject: [PATCH 109/347] bumping to 2.1.14 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index ec95d5d84..e6b2d331c 100644 --- a/build.sbt +++ b/build.sbt @@ -1,6 +1,6 @@ name := "goose" -version := "2.1.13" +version := "2.1.14" scalaVersion := "2.9.1" From c8c9a07484311e07e76a7cf912b1d851c82d1d7e Mon Sep 17 00:00:00 2001 From: FaKod Date: Mon, 30 Jul 2012 06:08:08 +0200 Subject: [PATCH 110/347] bumped scala version --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 2d9e8aa5b..02bcc7808 100644 --- a/pom.xml +++ b/pom.xml @@ -46,14 +46,14 @@ org.scala-lang scala-compiler - 2.9.0-1 + 2.9.1 compile org.scala-lang scala-library - 2.9.0-1 + 2.9.1 From 9fc7ba1b7b10e8a99e6b8e106bdacecc0c9d9d7f Mon Sep 17 00:00:00 2001 From: Joshua Eckroth Date: Mon, 13 Aug 2012 22:16:04 -0400 Subject: [PATCH 111/347] Added log4j and created batch crawler in FetchMany. --- pom.xml | 13 +++-- .../scala/com/gravity/goose/FetchMany.scala | 49 +++++++++++++++++++ .../com/gravity/goose/TalkToMeGoose.scala | 8 ++- 3 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 src/main/scala/com/gravity/goose/FetchMany.scala diff --git a/pom.xml b/pom.xml index 2d9e8aa5b..b3b11f4ad 100644 --- a/pom.xml +++ b/pom.xml @@ -27,11 +27,15 @@ compile - org.slf4j - slf4j-log4j12 - 1.6.1 - test + org.slf4j + slf4j-log4j12 + 1.6.1 + + log4j + log4j + 1.2.14 + org.jsoup jsoup @@ -67,7 +71,6 @@ 2.6 - diff --git a/src/main/scala/com/gravity/goose/FetchMany.scala b/src/main/scala/com/gravity/goose/FetchMany.scala new file mode 100644 index 000000000..0b893e4f4 --- /dev/null +++ b/src/main/scala/com/gravity/goose/FetchMany.scala @@ -0,0 +1,49 @@ +package com.gravity.goose + +import scala.io.Source +import sys.process._ + +object FetchMany { + def main(args: Array[String]) { + try { + val config: Configuration = new Configuration + config.enableImageFetching = true + config.imagemagickConvertPath = "/usr/bin/convert" + config.imagemagickIdentifyPath = "/usr/bin/identify" + config.localStoragePath = "/tmp/goose" + config.minBytesForImages = 4500 + val goose = new Goose(config) + + var i = 0 + for(line <- Source.fromFile(args(0) + "urllist.txt").getLines()) { + val out = new java.io.FileWriter(args(0) + i) + val url: String = line + println("FETCH: Goose is fetching into " + i + ": " + url) + var done: Boolean = false + for(attempt <- 1 to 5) { + try { + if(!done) { + println("FETCH: -- Attempt " + attempt) + val article = goose.extractContent(url) + println("FETCH: -- Got: " + article.title) + out.write(article.cleanedArticleText + "\n" + article.topImage.imageSrc + "\n" + article.title) + done = true + } + } + catch { + case e: Exception => { println(e) } + } + } + out.close + i = i + 1 + } + } + catch { + case e: Exception => { + System.out.println(e.toString) + } + } + } +} + + diff --git a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala index fba111b88..5329e97c1 100644 --- a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala +++ b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala @@ -26,10 +26,16 @@ object TalkToMeGoose { try { val url: String = args(0) val config: Configuration = new Configuration - config.enableImageFetching = false + config.enableImageFetching = true + config.imagemagickConvertPath = "/usr/bin/convert" + config.imagemagickIdentifyPath = "/usr/bin/identify" + config.localStoragePath = "/tmp/goose" + config.minBytesForImages = 4500 val goose = new Goose(config) val article = goose.extractContent(url) println(article.cleanedArticleText) + println(article.topImage.imageSrc) + println(article.title) } catch { case e: Exception => { From 2773edce57b9fb047b17dccce67b2920cef4c26b Mon Sep 17 00:00:00 2001 From: Anton Malinovskiy Date: Mon, 24 Sep 2012 19:00:24 +0200 Subject: [PATCH 112/347] Prepared goose for execution within GAE --- pom.xml | 326 ++++++------ .../goose/network/GAEClientConnection.java | 277 +++++++++++ .../goose/network/GAEConnectionManager.java | 94 ++++ .../com/gravity/goose/TalkToMeGoose.scala | 72 +-- .../gravity/goose/network/HtmlFetcher.scala | 462 +++++++++--------- 5 files changed, 825 insertions(+), 406 deletions(-) create mode 100644 src/main/java/com/gravity/goose/network/GAEClientConnection.java create mode 100644 src/main/java/com/gravity/goose/network/GAEConnectionManager.java diff --git a/pom.xml b/pom.xml index 2d9e8aa5b..bfc6b95e8 100644 --- a/pom.xml +++ b/pom.xml @@ -1,154 +1,194 @@ - 4.0.0 + 4.0.0 - com.gravity - goose - 2.1.19 - jar - goose - http://maven.apache.org - - UTF-8 - + com.gravity + goose + 2.1.19 + jar + goose + http://maven.apache.org + + UTF-8 + 3.1.2.RELEASE + 1.7.1 + ${appengine.sdk.root} + - - - junit - junit - 4.8.1 - test - - - org.slf4j - slf4j-api - 1.6.1 - jar - compile - - - org.slf4j - slf4j-log4j12 - 1.6.1 - test - - - org.jsoup - jsoup - 1.5.2 - - - commons-io - commons-io - 2.0.1 - + + + junit + junit + 4.8.1 + test + + + org.slf4j + slf4j-api + 1.6.1 + jar + compile + + + org.slf4j + slf4j-log4j12 + 1.6.1 + test + + + org.jsoup + jsoup + 1.5.2 + + + commons-io + commons-io + 2.0.1 + - - org.scala-lang - scala-compiler - 2.9.0-1 - compile - + + org.scala-lang + scala-compiler + 2.9.0-1 + compile + - - org.scala-lang - scala-library - 2.9.0-1 - + + org.scala-lang + scala-library + 2.9.0-1 + - - org.apache.httpcomponents - httpclient - 4.1.2 - - - commons-lang - commons-lang - 2.6 - - + + org.apache.httpcomponents + httpclient + 4.2.1 + - - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.6 - - false - true - - **/*Test.* - - - **/*IT.* - - - - - org.scala-tools - maven-scala-plugin - 2.14.3 - - UTF-8 - - -Xmx1024m - - - - - compile - - compile - - compile - - - test-compile - - testCompile - - test-compile - - - process-resources - - compile - - + + commons-lang + commons-lang + 2.6 + - - - - org.apache.maven.plugins - maven-source-plugin - 2.1.2 - - - attach-sources - - jar - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.8 - - - attach-javadocs - - jar - - - - - - + + com.google.appengine + appengine-api-labs + ${gae.version} + + + + com.google.appengine + appengine-api-stubs + ${gae.version} + + + + com.google.appengine + appengine-testing + ${gae.version} + + + + com.google.appengine + appengine-api-1.0-sdk + ${gae.version} + compile + + + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.6 + + false + true + + **/*Test.* + + + **/*IT.* + + + + + org.scala-tools + maven-scala-plugin + 2.14.3 + + UTF-8 + + -Xmx1024m + + + + + compile + + compile + + compile + + + test-compile + + testCompile + + test-compile + + + process-resources + + compile + + + + + + + org.apache.maven.plugins + maven-source-plugin + 2.1.2 + + + attach-sources + + jar + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.8 + + + attach-javadocs + + jar + + + + + + + maven-compiler-plugin + 2.5.1 + + 1.6 + 1.6 + + + + \ No newline at end of file diff --git a/src/main/java/com/gravity/goose/network/GAEClientConnection.java b/src/main/java/com/gravity/goose/network/GAEClientConnection.java new file mode 100644 index 000000000..bd0fc1abb --- /dev/null +++ b/src/main/java/com/gravity/goose/network/GAEClientConnection.java @@ -0,0 +1,277 @@ +package com.gravity.goose.network; + +import org.apache.http.*; +import org.apache.http.conn.ClientConnectionManager; +import org.apache.http.conn.ManagedClientConnection; +import org.apache.http.conn.routing.HttpRoute; +import org.apache.http.entity.ByteArrayEntity; +import org.apache.http.message.BasicHttpResponse; +import org.apache.http.params.HttpParams; +import org.apache.http.protocol.HttpContext; + +import com.google.appengine.api.urlfetch.*; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.net.InetAddress; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.concurrent.TimeUnit; + +/** + * HttpClient ManagedClientConnection implementation which works around the lack + * of threads in GAE + * + * from - http://esxx.blogspot.com/2009/06/using-apaches-httpclient-on-google-app.html + * + * @author Martin Blom (martin@blom.org) + */ +class GAEClientConnection implements ManagedClientConnection { + + public GAEClientConnection(ClientConnectionManager cm, HttpRoute route, Object state) { + this.connManager = cm; + this.route = route; + this.state = state; + this.closed = true; + } + + // From interface ManagedClientConnection + + @Override + public boolean isSecure() { + return route.isSecure(); + } + + @Override + public HttpRoute getRoute() { + return route; + } + + @Override + public javax.net.ssl.SSLSession getSSLSession() { + return null; + } + + @Override + public void open(HttpRoute route, HttpContext context, HttpParams params) + throws IOException { + close(); + this.route = route; + } + + @Override + public void tunnelTarget(boolean secure, HttpParams params) + throws IOException { + throw new IOException("tunnelTarget() not supported"); + } + + @Override + public void tunnelProxy(HttpHost next, boolean secure, HttpParams params) + throws IOException { + throw new IOException("tunnelProxy() not supported"); + } + + @Override + public void layerProtocol(HttpContext context, HttpParams params) + throws IOException { + throw new IOException("layerProtocol() not supported"); + } + + @Override + public void markReusable() { + reusable = true; + } + + @Override + public void unmarkReusable() { + reusable = false; + } + + @Override + public boolean isMarkedReusable() { + return reusable; + } + + @Override + public void setState(Object state) { + this.state = state; + } + + @Override + public Object getState() { + return state; + } + + @Override + public void setIdleDuration(long duration, TimeUnit unit) { + // Do nothing + } + + // From interface HttpClientConnection + @Override + public boolean isResponseAvailable(int timeout) throws IOException { + return response != null; + } + + @Override + public void sendRequestHeader(HttpRequest request) throws HttpException, IOException { + try { + HttpHost host = route.getTargetHost(); + + URI uri = new URI(host.getSchemeName() + "://" + host.getHostName() + + ((host.getPort() == -1) ? "" : (":" + host.getPort())) + + request.getRequestLine().getUri()); + + this.request = new HTTPRequest(uri.toURL(), + HTTPMethod.valueOf(request.getRequestLine().getMethod()), + FetchOptions.Builder.disallowTruncate()); + } catch (URISyntaxException ex) { + throw new IOException("Malformed request URI: " + ex.getMessage(), ex); + } catch (IllegalArgumentException ex) { + throw new IOException( + "Unsupported HTTP method: " + ex.getMessage(), ex); + } + + for (Header h : request.getAllHeaders()) { + this.request.addHeader(new HTTPHeader(h.getName(), h.getValue())); + } + } + + @Override + public void sendRequestEntity(HttpEntityEnclosingRequest request) throws HttpException, IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + if (request.getEntity() != null) { + request.getEntity().writeTo(baos); + } + this.request.setPayload(baos.toByteArray()); + } + + @Override + public HttpResponse receiveResponseHeader() throws HttpException, + IOException { + if (this.response == null) { + flush(); + } + + HttpResponse response = new BasicHttpResponse(new ProtocolVersion("HTTP", 1, 1), this.response.getResponseCode(), null); + + for (HTTPHeader h : this.response.getHeaders()) { + response.addHeader(h.getName(), h.getValue()); + } + + return response; + } + + @Override + public void receiveResponseEntity(HttpResponse response) throws HttpException, IOException { + if (this.response == null) { + throw new IOException("receiveResponseEntity() called on closed connection"); + } + + ByteArrayEntity bae = new ByteArrayEntity(this.response.getContent()); + bae.setContentType(response.getFirstHeader("Content-Type")); + response.setEntity(bae); + + response = null; + } + + @Override + public void flush() throws IOException { + if (request != null) { + try { + // System.err.println("----"); + response = urlFS.fetch(request); + request = null; + } catch (IOException ex) { + ex.printStackTrace(); + throw ex; + } + } else { + response = null; + } + } + + // From interface HttpConnection + @Override + public void close() throws IOException { + request = null; + response = null; + closed = true; + } + + @Override + public boolean isOpen() { + return request != null || response != null; + } + + @Override + public boolean isStale() { + return !isOpen() && !closed; + } + + @Override + public void setSocketTimeout(int timeout) { + } + + @Override + public int getSocketTimeout() { + return -1; + } + + @Override + public void shutdown() throws IOException { + close(); + } + + @Override + public HttpConnectionMetrics getMetrics() { + return null; + } + + // From interface HttpInetConnection + @Override + public InetAddress getLocalAddress() { + return null; + } + + @Override + public int getLocalPort() { + return 0; + } + + @Override + public InetAddress getRemoteAddress() { + return null; + } + + @Override + public int getRemotePort() { + HttpHost host = route.getTargetHost(); + return connManager.getSchemeRegistry().getScheme(host).resolvePort(host.getPort()); + } + + // From interface ConnectionReleaseTrigger + + @Override + public void releaseConnection() throws IOException { + connManager.releaseConnection(this, Long.MAX_VALUE, + TimeUnit.MILLISECONDS); + } + + @Override + public void abortConnection() throws IOException { + unmarkReusable(); + shutdown(); + } + + private ClientConnectionManager connManager; + private HttpRoute route; + private Object state; + private boolean reusable; + + private HTTPRequest request; + private HTTPResponse response; + private boolean closed; + + private static URLFetchService urlFS = URLFetchServiceFactory.getURLFetchService(); +} \ No newline at end of file diff --git a/src/main/java/com/gravity/goose/network/GAEConnectionManager.java b/src/main/java/com/gravity/goose/network/GAEConnectionManager.java new file mode 100644 index 000000000..c2f72361d --- /dev/null +++ b/src/main/java/com/gravity/goose/network/GAEConnectionManager.java @@ -0,0 +1,94 @@ +package com.gravity.goose.network; + +import org.apache.http.conn.ClientConnectionManager; +import org.apache.http.conn.ClientConnectionRequest; +import org.apache.http.conn.ConnectTimeoutException; +import org.apache.http.conn.ManagedClientConnection; +import org.apache.http.conn.routing.HttpRoute; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.conn.scheme.SchemeSocketFactory; +import org.apache.http.params.HttpParams; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.UnknownHostException; +import java.util.concurrent.TimeUnit; + +/** + * HttpClient ClientConnectionManager implementation which works around the lack + * of threads in GAE + * + * from - http://esxx.blogspot.com/2009/06/using-apaches-httpclient-on-google-app.html + * + * @author Martin Blom (martin@blom.org) + */ +public class GAEConnectionManager implements ClientConnectionManager { + + public GAEConnectionManager() { + SchemeSocketFactory no_socket_factory = new SchemeSocketFactory() { + @Override + public boolean isSecure(Socket sock) + throws IllegalArgumentException { + return false; + } + @Override + public Socket createSocket(HttpParams params) throws IOException { + return null; + } + @Override + public Socket connectSocket(Socket sock, + InetSocketAddress remoteAddress, + InetSocketAddress localAddress, HttpParams params) + throws IOException, UnknownHostException, + ConnectTimeoutException { + return null; + } + }; + + schemeRegistry = new SchemeRegistry(); + schemeRegistry.register(new Scheme("http", 80, no_socket_factory)); + schemeRegistry.register(new Scheme("https", 443, no_socket_factory)); + } + + @Override + public SchemeRegistry getSchemeRegistry() { + return schemeRegistry; + } + + @Override + public ClientConnectionRequest requestConnection(final HttpRoute route, final Object state) { + return new ClientConnectionRequest() { + public void abortRequest() { + // Nothing to do + } + + public ManagedClientConnection getConnection(long timeout, TimeUnit tunit) { + return GAEConnectionManager.this.getConnection(route, state); + } + }; + } + + @Override + public void releaseConnection(ManagedClientConnection conn, long validDuration, TimeUnit timeUnit) { + } + + @Override + public void closeIdleConnections(long idletime, TimeUnit tunit) { + } + + @Override + public void closeExpiredConnections() { + } + + @Override + public void shutdown() { + } + + private ManagedClientConnection getConnection(HttpRoute route, Object state) { + return new GAEClientConnection(this, route, state); + } + + private SchemeRegistry schemeRegistry; +} \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala index fba111b88..27b173544 100644 --- a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala +++ b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala @@ -1,42 +1,54 @@ package com.gravity.goose +import com.google.appengine.tools.development.testing.{LocalServiceTestHelper, LocalURLFetchServiceTestConfig} + /** * Created by Jim Plush * User: jim * Date: 5/13/11 */ object TalkToMeGoose { - /** - * you can use this method if you want to run goose from the command line to extract html from a bashscript - * or to just test it's functionality - * you can run it like so - * cd into the goose root - * mvn compile - * MAVEN_OPTS="-Xms256m -Xmx2000m"; mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="http://techcrunch.com/2011/05/13/native-apps-or-web-apps-particle-code-wants-you-to-do-both/" -e -q > ~/Desktop/gooseresult.txt - * - * Some top gun love: - * Officer: [in the midst of the MIG battle] Both Catapults are broken, sir. - * Stinger: How long will it take? - * Officer: It'll take ten minutes. - * Stinger: Bullshit ten minutes! This thing will be over in two minutes! Get on it! - * - * @param args - */ - def main(args: Array[String]) { - try { - val url: String = args(0) - val config: Configuration = new Configuration - config.enableImageFetching = false - val goose = new Goose(config) - val article = goose.extractContent(url) - println(article.cleanedArticleText) - } - catch { - case e: Exception => { - System.out.println("Make sure you pass in a valid URL: " + e.toString) - } + + val URLConfig : LocalURLFetchServiceTestConfig = new LocalURLFetchServiceTestConfig() + val Helper : LocalServiceTestHelper = new LocalServiceTestHelper(URLConfig) + + /** + * you can use this method if you want to run goose from the command line to extract html from a bashscript + * or to just test it's functionality + * you can run it like so + * cd into the goose root + * mvn compile + * MAVEN_OPTS="-Xms256m -Xmx2000m"; mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="http://techcrunch.com/2011/05/13/native-apps-or-web-apps-particle-code-wants-you-to-do-both/" -e -q > ~/Desktop/gooseresult.txt + * + * Some top gun love: + * Officer: [in the midst of the MIG battle] Both Catapults are broken, sir. + * Stinger: How long will it take? + * Officer: It'll take ten minutes. + * Stinger: Bullshit ten minutes! This thing will be over in two minutes! Get on it! + * + * @param args + */ + def main(args: Array[String]) { + try { + Helper.setUp() + println("URL to extract article from:") + val url: String = readLine() + + val config: Configuration = new Configuration + config.enableImageFetching = false + + val goose = new Goose(config) + val article = goose.extractContent(url) + + println(article.cleanedArticleText) + } catch { + case e: Exception => { + System.out.println("Make sure you pass in a valid URL: " + e.toString) + } + } finally { + Helper.tearDown() + } } - } } diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index 17c15bbb2..010d29135 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -60,276 +60,272 @@ import org.apache.http.impl.client.{DefaultHttpRequestRetryHandler, AbstractHttp * to try and pull back before we say screw it. */ object HtmlFetcher extends Logging { - /** - * holds a reference to our override cookie store, we don't want to store - * cookies for head requests, only slows shit down - */ - var emptyCookieStore: CookieStore = null - /** - * holds the HttpClient object for making requests - */ - private var httpClient: HttpClient = null - initClient() + /** + * holds a reference to our override cookie store, we don't want to store + * cookies for head requests, only slows shit down + */ + var emptyCookieStore: CookieStore = null + /** + * holds the HttpClient object for making requests + */ + private var httpClient: HttpClient = null + initClient() - def getHttpClient: HttpClient = { - httpClient - } + def getHttpClient: HttpClient = { + httpClient + } - /** - * Makes an http fetch to go retrieve the HTML from a url, store it to disk and pass it off - * @param config Goose Configuration - * @param url The web address to fetch - * @return If all goes well, a `Some[String]` otherwise `None` - * @throws NotFoundException(String) - * @throws BadRequestException(String) - * @throws NotAuthorizedException(String, Int) - * @throws ServerErrorException(String, Int) - * @throws UnhandledStatusCodeException(String, Int) - * @throws MaxBytesException() - */ - def getHtml(config: Configuration, url: String): Option[String] = { - var httpget: HttpGet = null - var htmlResult: String = null - var entity: HttpEntity = null - var instream: InputStream = null + /** + * Makes an http fetch to go retrieve the HTML from a url, store it to disk and pass it off + * @param config Goose Configuration + * @param url The web address to fetch + * @return If all goes well, a `Some[String]` otherwise `None` + * @throws NotFoundException(String) + * @throws BadRequestException(String) + * @throws NotAuthorizedException(String, Int) + * @throws ServerErrorException(String, Int) + * @throws UnhandledStatusCodeException(String, Int) + * @throws MaxBytesException() + */ + def getHtml(config: Configuration, url: String): Option[String] = { + var httpget: HttpGet = null + var htmlResult: String = null + var entity: HttpEntity = null + var instream: InputStream = null - // Identified the the apache http client does not drop URL fragments before opening the request to the host - // more info: http://stackoverflow.com/questions/4251841/400-error-with-httpclient-for-a-link-with-an-anchor - val cleanUrl = { - val foundAt = url.indexOf("#") - if (foundAt >= 0) url.substring(0, foundAt) else url - } + // Identified the the apache http client does not drop URL fragments before opening the request to the host + // more info: http://stackoverflow.com/questions/4251841/400-error-with-httpclient-for-a-link-with-an-anchor + val cleanUrl = { + val foundAt = url.indexOf("#") + if (foundAt >= 0) url.substring(0, foundAt) else url + } - try { - val localContext: HttpContext = new BasicHttpContext - localContext.setAttribute(ClientContext.COOKIE_STORE, HtmlFetcher.emptyCookieStore) - httpget = new HttpGet(cleanUrl) - HttpProtocolParams.setUserAgent(httpClient.getParams, config.getBrowserUserAgent()); + try { + val localContext: HttpContext = new BasicHttpContext + localContext.setAttribute(ClientContext.COOKIE_STORE, HtmlFetcher.emptyCookieStore) + httpget = new HttpGet(cleanUrl) + HttpProtocolParams.setUserAgent(httpClient.getParams, config.getBrowserUserAgent()); - val params = httpClient.getParams - HttpConnectionParams.setConnectionTimeout(params, config.getConnectionTimeout()) - HttpConnectionParams.setSoTimeout(params, config.getSocketTimeout()) + val params = httpClient.getParams + HttpConnectionParams.setConnectionTimeout(params, config.getConnectionTimeout()) + HttpConnectionParams.setSoTimeout(params, config.getSocketTimeout()) - trace("Setting UserAgent To: " + HttpProtocolParams.getUserAgent(httpClient.getParams)) - val response: HttpResponse = httpClient.execute(httpget, localContext) + trace("Setting UserAgent To: " + HttpProtocolParams.getUserAgent(httpClient.getParams)) + val response: HttpResponse = httpClient.execute(httpget, localContext) - HttpStatusValidator.validate(cleanUrl, response.getStatusLine.getStatusCode) match { - case Left(ex) => throw ex - case _ => - } + HttpStatusValidator.validate(cleanUrl, response.getStatusLine.getStatusCode) match { + case Left(ex) => throw ex + case _ => + } - entity = response.getEntity - if (entity != null) { - instream = entity.getContent - var encodingType: String = "UTF-8" - try { - encodingType = EntityUtils.getContentCharSet(entity) - if (encodingType == null) { - encodingType = "UTF-8" - } + entity = response.getEntity + if (entity != null) { + instream = entity.getContent + var encodingType: String = "UTF-8" + try { + encodingType = EntityUtils.getContentCharSet(entity) + if (encodingType == null) { + encodingType = "UTF-8" + } + } + catch { + case e: Exception => { + if (logger.isDebugEnabled) { + trace("Unable to get charset for: " + cleanUrl) + trace("Encoding Type is: " + encodingType) + } + } + } + try { + htmlResult = HtmlFetcher.convertStreamToString(instream, 15728640, encodingType).trim + } + finally { + EntityUtils.consume(entity) + } + } + else { + trace("Unable to fetch URL Properly: " + cleanUrl) + } } catch { - case e: Exception => { - if (logger.isDebugEnabled) { - trace("Unable to get charset for: " + cleanUrl) - trace("Encoding Type is: " + encodingType) + case e: NullPointerException => { + logger.warn(e.toString + " " + e.getMessage + " Caught for URL: " + cleanUrl) + } + case e: MaxBytesException => { + trace("GRVBIGFAIL: " + cleanUrl + " Reached max bytes size") + throw e + } + case e: SocketException => { + logger.warn(e.getMessage + " Caught for URL: " + cleanUrl) + } + case e: SocketTimeoutException => { + trace(e.toString) + } + case e: LoggableException => { + logger.warn(e.getMessage) + return None + } + case e: Exception => { + trace("FAILURE FOR LINK: " + cleanUrl + " " + e.toString) + return None } - } - } - try { - htmlResult = HtmlFetcher.convertStreamToString(instream, 15728640, encodingType).trim } finally { - EntityUtils.consume(entity) + if (instream != null) { + try { + instream.close() + } + catch { + case e: Exception => { + logger.warn(e.getMessage + " Caught for URL: " + cleanUrl) + } + } + } + if (httpget != null) { + try { + httpget.abort() + entity = null + } + catch { + case e: Exception => { + } + } + } } - } - else { - trace("Unable to fetch URL Properly: " + cleanUrl) - } - } - catch { - case e: NullPointerException => { - logger.warn(e.toString + " " + e.getMessage + " Caught for URL: " + cleanUrl) - } - case e: MaxBytesException => { - trace("GRVBIGFAIL: " + cleanUrl + " Reached max bytes size") - throw e - } - case e: SocketException => { - logger.warn(e.getMessage + " Caught for URL: " + cleanUrl) - } - case e: SocketTimeoutException => { - trace(e.toString) - } - case e: LoggableException => { - logger.warn(e.getMessage) - return None - } - case e: Exception => { - trace("FAILURE FOR LINK: " + cleanUrl + " " + e.toString) - return None - } - } - finally { - if (instream != null) { - try { - instream.close() + if (logger.isDebugEnabled) { + logger.debug("starting...") } - catch { - case e: Exception => { - logger.warn(e.getMessage + " Caught for URL: " + cleanUrl) - } + if (htmlResult == null || htmlResult.length < 1) { + if (logger.isDebugEnabled) { + logger.debug("HTMLRESULT is empty or null") + } + throw new NotHtmlException(cleanUrl) } - } - if (httpget != null) { + var is: InputStream = null + var mimeType: String = null try { - httpget.abort() - entity = null + is = new ByteArrayInputStream(htmlResult.getBytes("UTF-8")) + mimeType = URLConnection.guessContentTypeFromStream(is) + if (mimeType != null) { + if ((mimeType == "text/html") == true || (mimeType == "application/xml") == true) { + return Some(htmlResult) + } + else { + if (htmlResult.contains("") == true && htmlResult.contains("<p>") == true) { + return Some(htmlResult) + } + trace("GRVBIGFAIL: " + mimeType + " - " + cleanUrl) + throw new NotHtmlException(cleanUrl) + } + } + else { + throw new NotHtmlException(cleanUrl) + } } catch { - case e: Exception => { - } - } - } - } - if (logger.isDebugEnabled) { - logger.debug("starting...") - } - if (htmlResult == null || htmlResult.length < 1) { - if (logger.isDebugEnabled) { - logger.debug("HTMLRESULT is empty or null") - } - throw new NotHtmlException(cleanUrl) - } - var is: InputStream = null - var mimeType: String = null - try { - is = new ByteArrayInputStream(htmlResult.getBytes("UTF-8")) - mimeType = URLConnection.guessContentTypeFromStream(is) - if (mimeType != null) { - if ((mimeType == "text/html") == true || (mimeType == "application/xml") == true) { - return Some(htmlResult) - } - else { - if (htmlResult.contains("<title>") == true && htmlResult.contains("<p>") == true) { - return Some(htmlResult) - } - trace("GRVBIGFAIL: " + mimeType + " - " + cleanUrl) - throw new NotHtmlException(cleanUrl) + case e: UnsupportedEncodingException => { + logger.warn(e.getMessage + " Caught for URL: " + cleanUrl) + } + case e: IOException => { + logger.warn(e.getMessage + " Caught for URL: " + cleanUrl) + } } - } - else { - throw new NotHtmlException(cleanUrl) - } - } - catch { - case e: UnsupportedEncodingException => { - logger.warn(e.getMessage + " Caught for URL: " + cleanUrl) - } - case e: IOException => { - logger.warn(e.getMessage + " Caught for URL: " + cleanUrl) - } + None } - None - } - - private def initClient() { - trace("Initializing HttpClient") + private def initClient() { - val httpParams: HttpParams = new BasicHttpParams - HttpConnectionParams.setConnectionTimeout(httpParams, 10 * 1000) - HttpConnectionParams.setSoTimeout(httpParams, 10 * 1000) - HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1) - emptyCookieStore = new CookieStore { - def addCookie(cookie: Cookie) { - } + trace("Initializing HttpClient") - def getCookies: List[Cookie] = { - emptyList - } + val httpParams: HttpParams = new BasicHttpParams + HttpConnectionParams.setConnectionTimeout(httpParams, 10 * 1000) + HttpConnectionParams.setSoTimeout(httpParams, 10 * 1000) + HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1) + emptyCookieStore = new CookieStore { + def addCookie(cookie: Cookie) { + } - def clearExpired(date: Date): Boolean = { - false - } + def getCookies: List[Cookie] = { + emptyList + } - def clear() { - } + def clearExpired(date: Date): Boolean = { + false + } - private[network] var emptyList: ArrayList[Cookie] = new ArrayList[Cookie] - } - httpParams.setParameter("http.protocol.cookie-policy", CookiePolicy.BROWSER_COMPATIBILITY) - httpParams.setParameter("http.User-Agent", "Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8") - httpParams.setParameter("http.language.Accept-Language", "en-us") - httpParams.setParameter("http.protocol.content-charset", "UTF-8") - httpParams.setParameter("Accept", "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5") - httpParams.setParameter("Cache-Control", "max-age=0") - httpParams.setParameter("http.connection.stalecheck", false) - val schemeRegistry: SchemeRegistry = new SchemeRegistry - schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory)) - schemeRegistry.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory)) - val cm = new ThreadSafeClientConnManager(schemeRegistry) - cm.setMaxTotal(20000) - cm.setDefaultMaxPerRoute(500) - httpClient = new DefaultHttpClient(cm, httpParams) - httpClient.asInstanceOf[AbstractHttpClient].setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(0, false)) - httpClient.getParams.setParameter("http.conn-manager.timeout", 120000L) - httpClient.getParams.setParameter("http.protocol.wait-for-continue", 10000L) - httpClient.getParams.setParameter("http.tcp.nodelay", true) - } + def clear() { + } - /** - * reads bytes off the string and returns a string - * - * @param is the source stream from the response - * @param maxBytes The max bytes that we want to read from the input stream - * @return String - */ - def convertStreamToString(is: InputStream, maxBytes: Int, encodingType: String): String = { - val buf: Array[Char] = new Array[Char](2048) - var r: Reader = null - val s = new StringBuilder - try { - r = new InputStreamReader(is, encodingType) - var bytesRead: Int = 2048 - var inLoop = true - while (inLoop) { - if (bytesRead >= maxBytes) { - throw new MaxBytesException + private[network] var emptyList: ArrayList[Cookie] = new ArrayList[Cookie] } - var n: Int = r.read(buf) - bytesRead += 2048 + httpParams.setParameter("http.protocol.cookie-policy", CookiePolicy.BROWSER_COMPATIBILITY) + httpParams.setParameter("http.User-Agent", "Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8") + httpParams.setParameter("http.language.Accept-Language", "en-us") + httpParams.setParameter("http.protocol.content-charset", "UTF-8") + httpParams.setParameter("Accept", "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5") + httpParams.setParameter("Cache-Control", "max-age=0") + httpParams.setParameter("http.connection.stalecheck", false) + val cm = new GAEConnectionManager() - if (n < 0) inLoop = false - if (inLoop) s.appendAll(buf, 0, n) - } - return s.toString() - } - catch { - case e: SocketTimeoutException => { - logger.warn(e.toString + " " + e.getMessage) - } - case e: UnsupportedEncodingException => { - logger.warn(e.toString + " Encoding: " + encodingType) - } - case e: IOException => { - logger.warn(e.toString + " " + e.getMessage) - } + httpClient = new DefaultHttpClient(cm, httpParams) + httpClient.asInstanceOf[AbstractHttpClient].setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(0, false)) + httpClient.getParams.setParameter("http.conn-manager.timeout", 120000L) + httpClient.getParams.setParameter("http.protocol.wait-for-continue", 10000L) + httpClient.getParams.setParameter("http.tcp.nodelay", true) } - finally { - if (r != null) { + + /** + * reads bytes off the string and returns a string + * + * @param is the source stream from the response + * @param maxBytes The max bytes that we want to read from the input stream + * @return String + */ + def convertStreamToString(is: InputStream, maxBytes: Int, encodingType: String): String = { + val buf: Array[Char] = new Array[Char](2048) + var r: Reader = null + val s = new StringBuilder try { - r.close() + r = new InputStreamReader(is, encodingType) + var bytesRead: Int = 2048 + var inLoop = true + while (inLoop) { + if (bytesRead >= maxBytes) { + throw new MaxBytesException + } + var n: Int = r.read(buf) + bytesRead += 2048 + + if (n < 0) inLoop = false + if (inLoop) s.appendAll(buf, 0, n) + } + return s.toString() } catch { - case e: Exception => { - } + case e: SocketTimeoutException => { + logger.warn(e.toString + " " + e.getMessage) + } + case e: UnsupportedEncodingException => { + logger.warn(e.toString + " Encoding: " + encodingType) + } + case e: IOException => { + logger.warn(e.toString + " " + e.getMessage) + } + } + finally { + if (r != null) { + try { + r.close() + } + catch { + case e: Exception => { + } + } + } } - } + null } - null - } } From 730142b7ae9bbbff97ae4dd27c14102cf3454f67 Mon Sep 17 00:00:00 2001 From: Anton Malinovskiy <tos@mail333.com> Date: Tue, 25 Sep 2012 13:08:08 +0200 Subject: [PATCH 113/347] changed the code formatting to have tab based identation --- .../scala/com/gravity/goose/Article.scala | 192 +-- .../com/gravity/goose/Configuration.scala | 160 +-- .../scala/com/gravity/goose/Crawler.scala | 230 ++-- src/main/scala/com/gravity/goose/Goose.scala | 89 +- .../com/gravity/goose/TalkToMeGoose.scala | 4 +- .../goose/cleaners/DocumentCleaner.scala | 632 ++++----- .../cleaners/StandardDocumentCleaner.scala | 2 +- .../extractors/AdditionalDataExtractor.scala | 12 +- .../goose/extractors/ContentExtractor.scala | 1103 ++++++++-------- .../gravity/goose/extractors/Extractor.scala | 32 +- .../extractors/PublishDateExtractor.scala | 22 +- .../extractors/StandardContentExtractor.scala | 2 +- .../goose/extractors/TagsEvaluator.scala | 4 +- .../com/gravity/goose/images/Image.scala | 64 +- .../gravity/goose/images/ImageDetails.scala | 70 +- .../gravity/goose/images/ImageExtractor.scala | 78 +- .../com/gravity/goose/images/ImageSaver.scala | 303 ++--- .../com/gravity/goose/images/ImageUtils.scala | 422 +++---- .../goose/images/SecretGifException.scala | 2 +- .../goose/images/StandardImageExtractor.scala | 1124 ++++++++--------- .../images/UpgradedImageIExtractor.scala | 972 +++++++------- .../gravity/goose/network/HtmlFetcher.scala | 2 +- .../goose/network/HttpExceptions.scala | 36 +- .../goose/network/NotHtmlException.scala | 4 +- .../outputformatters/OutputFormatter.scala | 334 ++--- .../StandardOutputFormatter.scala | 2 +- .../com/gravity/goose/text/HashUtils.scala | 26 +- .../gravity/goose/text/ReplaceSequence.scala | 162 +-- .../com/gravity/goose/text/StopWords.scala | 42 +- .../goose/text/StringReplacement.scala | 48 +- .../gravity/goose/text/StringSplitter.scala | 30 +- .../com/gravity/goose/text/WordStats.scala | 88 +- .../scala/com/gravity/goose/text/string.scala | 28 +- .../com/gravity/goose/utils/FileHelper.scala | 22 +- .../com/gravity/goose/utils/Logging.scala | 92 +- .../com/gravity/goose/utils/URLHelper.scala | 54 +- 36 files changed, 3256 insertions(+), 3233 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Article.scala b/src/main/scala/com/gravity/goose/Article.scala index 40b4dadcd..6d76b631f 100644 --- a/src/main/scala/com/gravity/goose/Article.scala +++ b/src/main/scala/com/gravity/goose/Article.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -24,102 +24,102 @@ import java.util.Date import scala.collection._ /** -* Created by Jim Plush -* User: jim -* Date: 8/14/11 -*/ + * Created by Jim Plush + * User: jim + * Date: 8/14/11 + */ class Article { - /** - * title of the article - */ - var title: String = null - - /** - * stores the lovely, pure text from the article, stripped of html, formatting, etc... - * just raw text with paragraphs separated by newlines. This is probably what you want to use. - */ - var cleanedArticleText: String = "" - - /** - * meta description field in HTML source - */ - var metaDescription: String = "" - - /** - * meta keywords field in the HTML source - */ - var metaKeywords: String = "" - - /** - * The canonical link of this article if found in the meta data - */ - var canonicalLink: String = "" - - /** - * holds the domain of this article we're parsing - */ - var domain: String = "" - - /** - * holds the top Element we think is a candidate for the main body of the article - */ - var topNode: Element = null - - /** - * holds the top Image object that we think represents this article - */ - var topImage: Image = new Image - - - /** - * holds a set of tags that may have been in the artcle, these are not meta keywords - */ - var tags: Set[String] = null - - /** - * holds a list of any movies we found on the page like youtube, vimeo - */ - var movies: List[Element] = Nil - - /** - * stores the final URL that we're going to try and fetch content against, this would be expanded if any - * escaped fragments were found in the starting url - */ - var finalUrl: String = ""; - - /** - * stores the MD5 hash of the url to use for various identification tasks - */ - var linkhash: String = ""; - - /** - * stores the RAW HTML straight from the network connection - */ - var rawHtml: String = "" - - /** - * the JSoup Document object - */ - var doc: Document = null - - /** - * this is the original JSoup document that contains a pure object from the original HTML without any cleaning - * options done on it - */ - var rawDoc: Document = null - - /** - * Sometimes useful to try and know when the publish date of an article was - */ - var publishDate: Date = null - - /** - * A property bucket for consumers of goose to store custom data extractions. - * This is populated by an implementation of {@link com.gravity.goose.extractors.AdditionalDataExtractor} - * which is executed before document cleansing within {@link com.gravity.goose.CrawlingActor#crawl} - * @return a {@link Map Map<String,String>} of property name to property vaue (represented as a {@link String}. - */ - var additionalData: Map[String, String] = Map.empty + /** + * title of the article + */ + var title: String = null + + /** + * stores the lovely, pure text from the article, stripped of html, formatting, etc... + * just raw text with paragraphs separated by newlines. This is probably what you want to use. + */ + var cleanedArticleText: String = "" + + /** + * meta description field in HTML source + */ + var metaDescription: String = "" + + /** + * meta keywords field in the HTML source + */ + var metaKeywords: String = "" + + /** + * The canonical link of this article if found in the meta data + */ + var canonicalLink: String = "" + + /** + * holds the domain of this article we're parsing + */ + var domain: String = "" + + /** + * holds the top Element we think is a candidate for the main body of the article + */ + var topNode: Element = null + + /** + * holds the top Image object that we think represents this article + */ + var topImage: Image = new Image + + + /** + * holds a set of tags that may have been in the artcle, these are not meta keywords + */ + var tags: Set[String] = null + + /** + * holds a list of any movies we found on the page like youtube, vimeo + */ + var movies: List[Element] = Nil + + /** + * stores the final URL that we're going to try and fetch content against, this would be expanded if any + * escaped fragments were found in the starting url + */ + var finalUrl: String = ""; + + /** + * stores the MD5 hash of the url to use for various identification tasks + */ + var linkhash: String = ""; + + /** + * stores the RAW HTML straight from the network connection + */ + var rawHtml: String = "" + + /** + * the JSoup Document object + */ + var doc: Document = null + + /** + * this is the original JSoup document that contains a pure object from the original HTML without any cleaning + * options done on it + */ + var rawDoc: Document = null + + /** + * Sometimes useful to try and know when the publish date of an article was + */ + var publishDate: Date = null + + /** + * A property bucket for consumers of goose to store custom data extractions. + * This is populated by an implementation of {@link com.gravity.goose.extractors.AdditionalDataExtractor} + * which is executed before document cleansing within {@link com.gravity.goose.CrawlingActor#crawl} + * @return a { @link Map Map<String,String>} of property name to property vaue (represented as a { @link String}. + */ + var additionalData: Map[String, String] = Map.empty } \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index 61f47c250..54b97a8ad 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -33,86 +33,86 @@ import com.gravity.goose.extractors.{StandardContentExtractor, ContentExtractor, class Configuration { - /** - * this is the local storage path used to place images to inspect them, should be writable - */ - @BeanProperty - var localStoragePath: String = "/tmp/goose" - /** - * What's the minimum bytes for an image we'd accept is, alot of times we want to filter out the author's little images - * in the beginning of the article - */ - @BeanProperty - var minBytesForImages: Int = 4500 - /** - * set this guy to false if you don't care about getting images, otherwise you can either use the default - * image extractor to implement the ImageExtractor interface to build your own - */ - @BeanProperty - var enableImageFetching: Boolean = true - /** - * path to your imagemagick convert executable, on the mac using mac ports this is the default listed - */ - @BeanProperty - var imagemagickConvertPath: String = "/opt/local/bin/convert" - /** - * path to your imagemagick identify executable - */ - @BeanProperty - var imagemagickIdentifyPath: String = "/opt/local/bin/identify" - - @BeanProperty - var connectionTimeout: Int = 10000 - - @BeanProperty - var socketTimeout: Int = 10000 - - /** - * used as the user agent that is sent with your web requests to extract an article - */ - @BeanProperty - var browserUserAgent: String = "Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8" - - var contentExtractor: ContentExtractor = StandardContentExtractor - - var publishDateExtractor: PublishDateExtractor = new PublishDateExtractor { - def extract(rootElement: Element): Date = { - null + /** + * this is the local storage path used to place images to inspect them, should be writable + */ + @BeanProperty + var localStoragePath: String = "/tmp/goose" + /** + * What's the minimum bytes for an image we'd accept is, alot of times we want to filter out the author's little images + * in the beginning of the article + */ + @BeanProperty + var minBytesForImages: Int = 4500 + /** + * set this guy to false if you don't care about getting images, otherwise you can either use the default + * image extractor to implement the ImageExtractor interface to build your own + */ + @BeanProperty + var enableImageFetching: Boolean = true + /** + * path to your imagemagick convert executable, on the mac using mac ports this is the default listed + */ + @BeanProperty + var imagemagickConvertPath: String = "/opt/local/bin/convert" + /** + * path to your imagemagick identify executable + */ + @BeanProperty + var imagemagickIdentifyPath: String = "/opt/local/bin/identify" + + @BeanProperty + var connectionTimeout: Int = 10000 + + @BeanProperty + var socketTimeout: Int = 10000 + + /** + * used as the user agent that is sent with your web requests to extract an article + */ + @BeanProperty + var browserUserAgent: String = "Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8" + + var contentExtractor: ContentExtractor = StandardContentExtractor + + var publishDateExtractor: PublishDateExtractor = new PublishDateExtractor { + def extract(rootElement: Element): Date = { + null + } + } + var additionalDataExtractor: AdditionalDataExtractor = new AdditionalDataExtractor + + def getPublishDateExtractor: PublishDateExtractor = { + publishDateExtractor + } + + def setContentExtractor(extractor: ContentExtractor) { + if (extractor == null) throw new IllegalArgumentException("extractor must not be null!") + contentExtractor = extractor + } + + /** + * Pass in to extract article publish dates. + * @param extractor a concrete instance of { @link PublishDateExtractor} + * @throws IllegalArgumentException if the instance passed in is <code>null</code> + */ + def setPublishDateExtractor(extractor: PublishDateExtractor) { + if (extractor == null) throw new IllegalArgumentException("extractor must not be null!") + this.publishDateExtractor = extractor + } + + def getAdditionalDataExtractor: AdditionalDataExtractor = { + additionalDataExtractor + } + + /** + * Pass in to extract any additional data not defined within {@link Article} + * @param extractor a concrete instance of { @link AdditionalDataExtractor} + * @throws IllegalArgumentException if the instance passed in is <code>null</code> + */ + def setAdditionalDataExtractor(extractor: AdditionalDataExtractor) { + this.additionalDataExtractor = extractor } - } - var additionalDataExtractor: AdditionalDataExtractor = new AdditionalDataExtractor - - def getPublishDateExtractor: PublishDateExtractor = { - publishDateExtractor - } - - def setContentExtractor(extractor: ContentExtractor) { - if (extractor == null) throw new IllegalArgumentException("extractor must not be null!") - contentExtractor = extractor - } - - /** - * Pass in to extract article publish dates. - * @param extractor a concrete instance of {@link PublishDateExtractor} - * @throws IllegalArgumentException if the instance passed in is <code>null</code> - */ - def setPublishDateExtractor(extractor: PublishDateExtractor) { - if (extractor == null) throw new IllegalArgumentException("extractor must not be null!") - this.publishDateExtractor = extractor - } - - def getAdditionalDataExtractor: AdditionalDataExtractor = { - additionalDataExtractor - } - - /** - * Pass in to extract any additional data not defined within {@link Article} - * @param extractor a concrete instance of {@link AdditionalDataExtractor} - * @throws IllegalArgumentException if the instance passed in is <code>null</code> - */ - def setAdditionalDataExtractor(extractor: AdditionalDataExtractor) { - this.additionalDataExtractor = extractor - } } \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index f29c9f8e0..7c11a566a 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -39,137 +39,137 @@ case class CrawlCandidate(config: Configuration, url: String, rawHTML: String = class Crawler(config: Configuration) { - import Crawler._ - - def crawl(crawlCandidate: CrawlCandidate): Article = { - val article = new Article() - for { - parseCandidate <- URLHelper.getCleanedUrl(crawlCandidate.url) - rawHtml <- getHTML(crawlCandidate, parseCandidate) - doc <- getDocument(parseCandidate.url.toString, rawHtml) - } { - trace("Crawling url: %s".format(parseCandidate.url)) - - val extractor = getExtractor - val docCleaner = getDocCleaner - val outputFormatter = getOutputFormatter - - article.finalUrl = parseCandidate.url.toString - article.linkhash = parseCandidate.linkhash - article.rawHtml = rawHtml - article.doc = doc - article.rawDoc = doc.clone() - - article.title = extractor.getTitle(article) - article.publishDate = config.publishDateExtractor.extract(doc) - article.additionalData = config.getAdditionalDataExtractor.extract(doc) - article.metaDescription = extractor.getMetaDescription(article) - article.metaKeywords = extractor.getMetaKeywords(article) - article.canonicalLink = extractor.getCanonicalLink(article) - article.domain = extractor.getDomain(article.finalUrl) - article.tags = extractor.extractTags(article) - // before we do any calcs on the body itself let's clean up the document - article.doc = docCleaner.clean(article) - - - - extractor.calculateBestNodeBasedOnClustering(article) match { - case Some(node: Element) => { - article.topNode = node - article.movies = extractor.extractVideos(article.topNode) - - if (config.enableImageFetching) { - trace(logPrefix + "Image fetching enabled...") - val imageExtractor = getImageExtractor(article) - try { - article.topImage = imageExtractor.getBestImage(article.rawDoc, article.topNode) - } catch { - case e: Exception => { - warn(e, e.toString) - } + import Crawler._ + + def crawl(crawlCandidate: CrawlCandidate): Article = { + val article = new Article() + for { + parseCandidate <- URLHelper.getCleanedUrl(crawlCandidate.url) + rawHtml <- getHTML(crawlCandidate, parseCandidate) + doc <- getDocument(parseCandidate.url.toString, rawHtml) + } { + trace("Crawling url: %s".format(parseCandidate.url)) + + val extractor = getExtractor + val docCleaner = getDocCleaner + val outputFormatter = getOutputFormatter + + article.finalUrl = parseCandidate.url.toString + article.linkhash = parseCandidate.linkhash + article.rawHtml = rawHtml + article.doc = doc + article.rawDoc = doc.clone() + + article.title = extractor.getTitle(article) + article.publishDate = config.publishDateExtractor.extract(doc) + article.additionalData = config.getAdditionalDataExtractor.extract(doc) + article.metaDescription = extractor.getMetaDescription(article) + article.metaKeywords = extractor.getMetaKeywords(article) + article.canonicalLink = extractor.getCanonicalLink(article) + article.domain = extractor.getDomain(article.finalUrl) + article.tags = extractor.extractTags(article) + // before we do any calcs on the body itself let's clean up the document + article.doc = docCleaner.clean(article) + + + + extractor.calculateBestNodeBasedOnClustering(article) match { + case Some(node: Element) => { + article.topNode = node + article.movies = extractor.extractVideos(article.topNode) + + if (config.enableImageFetching) { + trace(logPrefix + "Image fetching enabled...") + val imageExtractor = getImageExtractor(article) + try { + article.topImage = imageExtractor.getBestImage(article.rawDoc, article.topNode) + } catch { + case e: Exception => { + warn(e, e.toString) + } + } + } + article.topNode = extractor.postExtractionCleanup(article.topNode) + + + + + article.cleanedArticleText = outputFormatter.getFormattedText(article.topNode) + } + case _ => trace("NO ARTICLE FOUND"); } - } - article.topNode = extractor.postExtractionCleanup(article.topNode) - - + releaseResources(article) + // self.reply(article) + article + } + article + } - article.cleanedArticleText = outputFormatter.getFormattedText(article.topNode) + def getHTML(crawlCandidate: CrawlCandidate, parsingCandidate: ParsingCandidate): Option[String] = { + if (crawlCandidate.rawHTML != null) { + Some(crawlCandidate.rawHTML) + } else { + HtmlFetcher.getHtml(config, parsingCandidate.url.toString) match { + case Some(html) => { + Some(html) + } + case _ => None + } } - case _ => trace("NO ARTICLE FOUND"); - } - releaseResources(article) - // self.reply(article) - article } - article - } - def getHTML(crawlCandidate: CrawlCandidate, parsingCandidate: ParsingCandidate): Option[String] = { - if (crawlCandidate.rawHTML != null) { - Some(crawlCandidate.rawHTML) - } else { - HtmlFetcher.getHtml(config, parsingCandidate.url.toString) match { - case Some(html) => { - Some(html) - } - case _ => None - } + def getImageExtractor(article: Article): ImageExtractor = { + val httpClient: HttpClient = HtmlFetcher.getHttpClient + new UpgradedImageIExtractor(httpClient, article, config) } - } + def getOutputFormatter: OutputFormatter = { + StandardOutputFormatter + } - def getImageExtractor(article: Article): ImageExtractor = { - val httpClient: HttpClient = HtmlFetcher.getHttpClient - new UpgradedImageIExtractor(httpClient, article, config) - } + def getDocCleaner: DocumentCleaner = { + new StandardDocumentCleaner + } - def getOutputFormatter: OutputFormatter = { - StandardOutputFormatter - } + def getDocument(url: String, rawlHtml: String): Option[Document] = { - def getDocCleaner: DocumentCleaner = { - new StandardDocumentCleaner - } + try { + Some(Jsoup.parse(rawlHtml)) + } catch { + case e: Exception => { + trace("Unable to parse %s properly into JSoup Doc".format(url)) + None + } + } + } - def getDocument(url: String, rawlHtml: String): Option[Document] = { + def getExtractor: ContentExtractor = { + config.contentExtractor + } - try { - Some(Jsoup.parse(rawlHtml)) - } catch { - case e: Exception => { - trace("Unable to parse %s properly into JSoup Doc".format(url)) - None - } + /** + * cleans up any temp files we have laying around like temp images + * removes any image in the temp dir that starts with the linkhash of the url we just parsed + */ + def releaseResources(article: Article) = { + trace(logPrefix + "STARTING TO RELEASE ALL RESOURCES") + + val dir: File = new File(config.localStoragePath) + + dir.list.foreach(filename => { + if (filename.startsWith(article.linkhash)) { + val f: File = new File(dir.getAbsolutePath + "/" + filename) + if (!f.delete) { + warn("Unable to remove temp file: " + filename) + } + } + }) } - } - - def getExtractor: ContentExtractor = { - config.contentExtractor - } - - /** - * cleans up any temp files we have laying around like temp images - * removes any image in the temp dir that starts with the linkhash of the url we just parsed - */ - def releaseResources(article: Article) = { - trace(logPrefix + "STARTING TO RELEASE ALL RESOURCES") - - val dir: File = new File(config.localStoragePath) - - dir.list.foreach(filename => { - if (filename.startsWith(article.linkhash)) { - val f: File = new File(dir.getAbsolutePath + "/" + filename) - if (!f.delete) { - warn("Unable to remove temp file: " + filename) - } - } - }) - } } object Crawler extends Logging { - val logPrefix = "crawler: " + val logPrefix = "crawler: " } \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/Goose.scala b/src/main/scala/com/gravity/goose/Goose.scala index 23f724bdb..97c59ddf2 100644 --- a/src/main/scala/com/gravity/goose/Goose.scala +++ b/src/main/scala/com/gravity/goose/Goose.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -28,62 +28,57 @@ import java.io.File class Goose(config: Configuration = new Configuration) { - initializeEnvironment() - - /** - * Main method to extract an article object from a URL, pass in a url and get back a Article - * @url The url that you want to extract - */ - def extractContent(url: String, rawHTML: String): Article = { - val cc = new CrawlCandidate(config, url, rawHTML) - sendToActor(cc) - } - - def extractContent(url: String): Article = { - val cc = new CrawlCandidate(config, url, null) - sendToActor(cc) - } - - def shutdownNetwork() { - HtmlFetcher.getHttpClient.getConnectionManager.shutdown() - } - - def sendToActor(crawlCandidate: CrawlCandidate) = { - val crawler = new Crawler(config) - val article = crawler.crawl(crawlCandidate) - article - } - - def initializeEnvironment() { - - val f = new File(config.localStoragePath) - try { - if (!f.isDirectory) { - f.mkdirs() - } - } catch { - case e: Exception => + initializeEnvironment() + + /** + * Main method to extract an article object from a URL, pass in a url and get back a Article + * @url The url that you want to extract + */ + def extractContent(url: String, rawHTML: String): Article = { + val cc = new CrawlCandidate(config, url, rawHTML) + sendToActor(cc) + } + + def extractContent(url: String): Article = { + val cc = new CrawlCandidate(config, url, null) + sendToActor(cc) } - if (!f.isDirectory) { - throw new Exception(config.localStoragePath + " directory does not seem to exist, you need to set this for image processing downloads") + + def shutdownNetwork() { + HtmlFetcher.getHttpClient.getConnectionManager.shutdown() } - if (!f.canWrite) { - throw new Exception(config.localStoragePath + " directory is not writeble, you need to set this for image processing downloads") + + def sendToActor(crawlCandidate: CrawlCandidate) = { + val crawler = new Crawler(config) + val article = crawler.crawl(crawlCandidate) + article } - // todo cleanup any jank that may be in the tmp folder currently - } + def initializeEnvironment() { + + val f = new File(config.localStoragePath) + if (!f.isDirectory) { + f.mkdirs() + } + if (!f.isDirectory) { + throw new Exception(config.localStoragePath + " directory does not seem to exist, you need to set this for image processing downloads") + } + if (!f.canWrite) { + throw new Exception(config.localStoragePath + " directory is not writeble, you need to set this for image processing downloads") + } + // todo cleanup any jank that may be in the tmp folder currently + } } object Goose { - implicit val config = new Configuration + implicit val config = new Configuration - val logPrefix = "goose: " + val logPrefix = "goose: " - // create the crawling actor that will accept bulk crawls -// val crawlingActor = Actor.actorOf[CrawlingActor] -// crawlingActor.start() + // create the crawling actor that will accept bulk crawls + // val crawlingActor = Actor.actorOf[CrawlingActor] + // crawlingActor.start() } \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala index 27b173544..f7b58b584 100644 --- a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala +++ b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala @@ -9,8 +9,8 @@ import com.google.appengine.tools.development.testing.{LocalServiceTestHelper, L */ object TalkToMeGoose { - val URLConfig : LocalURLFetchServiceTestConfig = new LocalURLFetchServiceTestConfig() - val Helper : LocalServiceTestHelper = new LocalServiceTestHelper(URLConfig) + val URLConfig: LocalURLFetchServiceTestConfig = new LocalURLFetchServiceTestConfig() + val Helper: LocalServiceTestHelper = new LocalServiceTestHelper(URLConfig) /** * you can use this method if you want to run goose from the command line to extract html from a bashscript diff --git a/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala b/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala index 27c541d2d..2edc22e13 100644 --- a/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala +++ b/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -28,385 +28,385 @@ import org.jsoup.select.{TagsEvaluator, Collector, Elements} trait DocumentCleaner { - /** - * User: Jim Plush - * Date: 12/18/10 - * This class is used to pre clean documents(webpages) - * We go through 3 phases of parsing a website cleaning -> extraction -> output formatter - * This is the cleaning phase that will try to remove comments, known ad junk, social networking divs - * other things that are known to not be content related. - */ - - import DocumentCleaner._ - - - def clean(article: Article): Document = { - - trace("Starting cleaning phase with DefaultDocumentCleaner") - - var docToClean: Document = article.doc - docToClean = cleanEmTags(docToClean) - docToClean = removeDropCaps(docToClean) - docToClean = removeScriptsAndStyles(docToClean) - docToClean = cleanBadTags(docToClean) - docToClean = removeNodesViaRegEx(docToClean, captionPattern) - docToClean = removeNodesViaRegEx(docToClean, googlePattern) - docToClean = removeNodesViaRegEx(docToClean, entriesPattern) - docToClean = removeNodesViaRegEx(docToClean, facebookPattern) - docToClean = removeNodesViaRegEx(docToClean, twitterPattern) - docToClean = cleanUpSpanTagsInParagraphs(docToClean) - docToClean = convertWantedTagsToParagraphs(docToClean, articleRootTags) -// docToClean = convertDivsToParagraphs(docToClean, "div") -// docToClean = convertDivsToParagraphs(docToClean, "span") - - // docToClean = convertDivsToParagraphs(docToClean, "span") - docToClean - } - - /** - * replaces <em> tags with textnodes - */ - private def cleanEmTags(doc: Document): Document = { - val ems: Elements = doc.getElementsByTag("em") - - for { - node <- ems - images: Elements = node.getElementsByTag("img") - if (images.size == 0) - } { - val tn: TextNode = new TextNode(node.text, doc.baseUri) - node.replaceWith(tn) + /** + * User: Jim Plush + * Date: 12/18/10 + * This class is used to pre clean documents(webpages) + * We go through 3 phases of parsing a website cleaning -> extraction -> output formatter + * This is the cleaning phase that will try to remove comments, known ad junk, social networking divs + * other things that are known to not be content related. + */ + + import DocumentCleaner._ + + + def clean(article: Article): Document = { + + trace("Starting cleaning phase with DefaultDocumentCleaner") + + var docToClean: Document = article.doc + docToClean = cleanEmTags(docToClean) + docToClean = removeDropCaps(docToClean) + docToClean = removeScriptsAndStyles(docToClean) + docToClean = cleanBadTags(docToClean) + docToClean = removeNodesViaRegEx(docToClean, captionPattern) + docToClean = removeNodesViaRegEx(docToClean, googlePattern) + docToClean = removeNodesViaRegEx(docToClean, entriesPattern) + docToClean = removeNodesViaRegEx(docToClean, facebookPattern) + docToClean = removeNodesViaRegEx(docToClean, twitterPattern) + docToClean = cleanUpSpanTagsInParagraphs(docToClean) + docToClean = convertWantedTagsToParagraphs(docToClean, articleRootTags) + // docToClean = convertDivsToParagraphs(docToClean, "div") + // docToClean = convertDivsToParagraphs(docToClean, "span") + + // docToClean = convertDivsToParagraphs(docToClean, "span") + docToClean } - trace(ems.size + " EM tags modified") - doc - } - - /** - * takes care of the situation where you have a span tag nested in a paragraph tag - * e.g. businessweek2.txt - */ - private def cleanUpSpanTagsInParagraphs(doc: Document) = { - val spans: Elements = doc.getElementsByTag("span") - for (item <- spans) { - if (item.parent().nodeName() == "p") { - val tn: TextNode = new TextNode(item.text, doc.baseUri) - item.replaceWith(tn) - trace("Replacing nested span with TextNode: " + item.text()) - } + + /** + * replaces <em> tags with textnodes + */ + private def cleanEmTags(doc: Document): Document = { + val ems: Elements = doc.getElementsByTag("em") + + for { + node <- ems + images: Elements = node.getElementsByTag("img") + if (images.size == 0) + } { + val tn: TextNode = new TextNode(node.text, doc.baseUri) + node.replaceWith(tn) + } + trace(ems.size + " EM tags modified") + doc } - doc - } - - /** - * remove those css drop caps where they put the first letter in big text in the 1st paragraph - */ - private def removeDropCaps(doc: Document): Document = { - val items: Elements = doc.select("span[class~=(dropcap|drop_cap)]") - trace(items.size + " dropcap tags removed") - for (item <- items) { - val tn: TextNode = new TextNode(item.text, doc.baseUri) - item.replaceWith(tn) + + /** + * takes care of the situation where you have a span tag nested in a paragraph tag + * e.g. businessweek2.txt + */ + private def cleanUpSpanTagsInParagraphs(doc: Document) = { + val spans: Elements = doc.getElementsByTag("span") + for (item <- spans) { + if (item.parent().nodeName() == "p") { + val tn: TextNode = new TextNode(item.text, doc.baseUri) + item.replaceWith(tn) + trace("Replacing nested span with TextNode: " + item.text()) + } + } + doc } - doc - } + /** + * remove those css drop caps where they put the first letter in big text in the 1st paragraph + */ + private def removeDropCaps(doc: Document): Document = { + val items: Elements = doc.select("span[class~=(dropcap|drop_cap)]") + trace(items.size + " dropcap tags removed") + for (item <- items) { + val tn: TextNode = new TextNode(item.text, doc.baseUri) + item.replaceWith(tn) + } + doc + } - private def removeScriptsAndStyles(doc: Document): Document = { - val scripts: Elements = doc.getElementsByTag("script") - for (item <- scripts) { - item.remove() - } - trace(scripts.size + " script tags removed") + private def removeScriptsAndStyles(doc: Document): Document = { - val styles: Elements = doc.getElementsByTag("style") - import scala.collection.JavaConversions._ - for (style <- styles) { - style.remove() - } - trace(styles.size + " style tags removed") - doc - } - - private def cleanBadTags(doc: Document): Document = { - val children: Elements = doc.body.children - val naughtyList: Elements = children.select(queryNaughtyIDs) - trace(naughtyList.size + " naughty ID elements found") - - import scala.collection.JavaConversions._ - for (node <- naughtyList) { - trace("Removing node with id: " + node.id) - removeNode(node) + val scripts: Elements = doc.getElementsByTag("script") + for (item <- scripts) { + item.remove() + } + trace(scripts.size + " script tags removed") + + val styles: Elements = doc.getElementsByTag("style") + import scala.collection.JavaConversions._ + for (style <- styles) { + style.remove() + } + trace(styles.size + " style tags removed") + doc } - val naughtyList2: Elements = children.select(queryNaughtyIDs) - trace(naughtyList2.size + " naughty ID elements found after removal") + private def cleanBadTags(doc: Document): Document = { + val children: Elements = doc.body.children + val naughtyList: Elements = children.select(queryNaughtyIDs) + trace(naughtyList.size + " naughty ID elements found") - val naughtyClasses: Elements = children.select(queryNaughtyClasses) + import scala.collection.JavaConversions._ + for (node <- naughtyList) { + trace("Removing node with id: " + node.id) + removeNode(node) + } - trace(naughtyClasses.size + " naughty CLASS elements found") + val naughtyList2: Elements = children.select(queryNaughtyIDs) + trace(naughtyList2.size + " naughty ID elements found after removal") - for (node <- naughtyClasses) { - trace("Removing node with class: " + node.className) - removeNode(node) - } + val naughtyClasses: Elements = children.select(queryNaughtyClasses) - val naughtyClasses2: Elements = children.select(queryNaughtyClasses) - trace(naughtyClasses2.size + " naughty CLASS elements found after removal") + trace(naughtyClasses.size + " naughty CLASS elements found") - val naughtyList5: Elements = children.select(queryNaughtyNames) + for (node <- naughtyClasses) { + trace("Removing node with class: " + node.className) + removeNode(node) + } - trace(naughtyList5.size + " naughty Name elements found") + val naughtyClasses2: Elements = children.select(queryNaughtyClasses) + trace(naughtyClasses2.size + " naughty CLASS elements found after removal") - for (node <- naughtyList5) { + val naughtyList5: Elements = children.select(queryNaughtyNames) - trace("Removing node with class: " + node.attr("class") + " id: " + node.id + " name: " + node.attr("name")) + trace(naughtyList5.size + " naughty Name elements found") - removeNode(node) - } - doc - } - - - /** - * removes nodes that may have a certain pattern that matches against a class or id tag - * - * @param pattern - */ - private def removeNodesViaRegEx(doc: Document, pattern: Pattern): Document = { - try { - val naughtyList: Elements = doc.getElementsByAttributeValueMatching("id", pattern) - - trace(naughtyList.size + " ID elements found against pattern: " + pattern) - - for (node <- naughtyList) { - removeNode(node) - } - val naughtyList3: Elements = doc.getElementsByAttributeValueMatching("class", pattern) - trace(naughtyList3.size + " CLASS elements found against pattern: " + pattern) - - for (node <- naughtyList3) { - removeNode(node) - } + for (node <- naughtyList5) { + + trace("Removing node with class: " + node.attr("class") + " id: " + node.id + " name: " + node.attr("name")) + + removeNode(node) + } + doc } - catch { - case e: IllegalArgumentException => { - warn(e, e.toString) - } + + + /** + * removes nodes that may have a certain pattern that matches against a class or id tag + * + * @param pattern + */ + private def removeNodesViaRegEx(doc: Document, pattern: Pattern): Document = { + try { + val naughtyList: Elements = doc.getElementsByAttributeValueMatching("id", pattern) + + trace(naughtyList.size + " ID elements found against pattern: " + pattern) + + for (node <- naughtyList) { + removeNode(node) + } + val naughtyList3: Elements = doc.getElementsByAttributeValueMatching("class", pattern) + trace(naughtyList3.size + " CLASS elements found against pattern: " + pattern) + + for (node <- naughtyList3) { + removeNode(node) + } + } + catch { + case e: IllegalArgumentException => { + warn(e, e.toString) + } + } + doc } - doc - } - - /** - * Apparently jsoup expects the node's parent to not be null and throws if it is. Let's be safe. - * @param node the node to remove from the doc - */ - private def removeNode(node: Element) { - if (node == null || node.parent == null) return - node.remove() - } - - - def replaceElementsWithPara(doc: Document, div: Element) { - val newDoc: Document = new Document(doc.baseUri) - val newNode: Element = newDoc.createElement("p") - newNode.append(div.html) - div.replaceWith(newNode) - } - - private def convertWantedTagsToParagraphs(doc: Document, wantedTags: TagsEvaluator): Document = { - - val selected = Collector.collect(wantedTags, doc) - - for (elem <- selected) { - if (Collector.collect(blockElemementTags, elem).isEmpty) { - replaceElementsWithPara(doc, elem) - } else { - val replacements = getReplacementNodes(doc, elem) - elem.children().foreach(_.remove()) - replacements.foreach(n => { - try { - elem.appendChild(n) - } catch { - case ex: Exception => info(ex, "Failed to append cleaned child!") - } - }) - } + + /** + * Apparently jsoup expects the node's parent to not be null and throws if it is. Let's be safe. + * @param node the node to remove from the doc + */ + private def removeNode(node: Element) { + if (node == null || node.parent == null) return + node.remove() } - doc - } + def replaceElementsWithPara(doc: Document, div: Element) { + val newDoc: Document = new Document(doc.baseUri) + val newNode: Element = newDoc.createElement("p") + newNode.append(div.html) + div.replaceWith(newNode) + } - private def convertDivsToParagraphs(doc: Document, domType: String): Document = { - trace("Starting to replace bad divs...") - var badDivs: Int = 0 - var convertedTextNodes: Int = 0 - val divs: Elements = doc.getElementsByTag(domType) - var divIndex = 0 + private def convertWantedTagsToParagraphs(doc: Document, wantedTags: TagsEvaluator): Document = { + + val selected = Collector.collect(wantedTags, doc) + + for (elem <- selected) { + if (Collector.collect(blockElemementTags, elem).isEmpty) { + replaceElementsWithPara(doc, elem) + } else { + val replacements = getReplacementNodes(doc, elem) + elem.children().foreach(_.remove()) + replacements.foreach(n => { + try { + elem.appendChild(n) + } catch { + case ex: Exception => info(ex, "Failed to append cleaned child!") + } + }) + } + } + doc + } - for (div <- divs) { - try { - val divToPElementsMatcher: Matcher = divToPElementsPattern.matcher(div.html.toLowerCase) - if (divToPElementsMatcher.find == false) { - replaceElementsWithPara(doc, div) - badDivs += 1; - } - else { - val replaceNodes = getReplacementNodes(doc, div) - div.children().foreach(_.remove()) - replaceNodes.foreach(node => { + private def convertDivsToParagraphs(doc: Document, domType: String): Document = { + trace("Starting to replace bad divs...") + var badDivs: Int = 0 + var convertedTextNodes: Int = 0 + val divs: Elements = doc.getElementsByTag(domType) + var divIndex = 0 + + for (div <- divs) { try { - div.appendChild(node) - } catch { - case e: Exception => info(e, e.toString) + val divToPElementsMatcher: Matcher = divToPElementsPattern.matcher(div.html.toLowerCase) + if (divToPElementsMatcher.find == false) { + replaceElementsWithPara(doc, div) + badDivs += 1; + } + else { + val replaceNodes = getReplacementNodes(doc, div) + + div.children().foreach(_.remove()) + replaceNodes.foreach(node => { + + try { + div.appendChild(node) + } catch { + case e: Exception => info(e, e.toString) + } + + }) + } } - - }) - } - } - catch { - case e: NullPointerException => { - logger.error(e.toString) + catch { + case e: NullPointerException => { + logger.error(e.toString) + } + } + divIndex += 1 } - } - divIndex += 1 - } - trace("Found %d total %s with %d bad ones replaced and %d textnodes converted inside %s" - .format(divs.size, domType, badDivs, convertedTextNodes, domType)) + trace("Found %d total %s with %d bad ones replaced and %d textnodes converted inside %s" + .format(divs.size, domType, badDivs, convertedTextNodes, domType)) - doc - } + doc + } - /** - * go through all the div's nodes and clean up dangling text nodes and get rid of obvious jank - */ - def getFlushedBuffer(replacementText: scala.StringBuilder, doc: Document) = { - val bufferedText = replacementText.toString() - trace("Flushing TextNode Buffer: " + bufferedText.trim()) - val newDoc: Document = new Document(doc.baseUri) - val newPara: Element = newDoc.createElement("p") - newPara.html(replacementText.toString()) - newPara - } + /** + * go through all the div's nodes and clean up dangling text nodes and get rid of obvious jank + */ + def getFlushedBuffer(replacementText: scala.StringBuilder, doc: Document) = { + val bufferedText = replacementText.toString() + trace("Flushing TextNode Buffer: " + bufferedText.trim()) + val newDoc: Document = new Document(doc.baseUri) + val newPara: Element = newDoc.createElement("p") + newPara.html(replacementText.toString()) + newPara + } - def getReplacementNodes(doc: Document, div: Element) = { + def getReplacementNodes(doc: Document, div: Element) = { - val replacementText: StringBuilder = new StringBuilder - val nodesToReturn = new ListBuffer[Node]() + val replacementText: StringBuilder = new StringBuilder + val nodesToReturn = new ListBuffer[Node]() - val nodesToRemove = new ListBuffer[Node]() + val nodesToRemove = new ListBuffer[Node]() - for { + for { - kid <- div.childNodes() - } { + kid <- div.childNodes() + } { - if (kid.nodeName() == "p" && replacementText.size > 0) { + if (kid.nodeName() == "p" && replacementText.size > 0) { - // flush the buffer of text - val newNode = getFlushedBuffer(replacementText, doc) - nodesToReturn += newNode - replacementText.clear() + // flush the buffer of text + val newNode = getFlushedBuffer(replacementText, doc) + nodesToReturn += newNode + replacementText.clear() - if (kid.isInstanceOf[Element]) { - val kidElem = kid.asInstanceOf[Element] - nodesToReturn += kidElem - } + if (kid.isInstanceOf[Element]) { + val kidElem = kid.asInstanceOf[Element] + nodesToReturn += kidElem + } - } else if (kid.nodeName == "#text") { + } else if (kid.nodeName == "#text") { - val kidTextNode = kid.asInstanceOf[TextNode] - val kidText = kidTextNode.attr("text") - val replaceText = tabsAndNewLinesReplacements.replaceAll(kidText) - if (replaceText.trim().length > 1) { + val kidTextNode = kid.asInstanceOf[TextNode] + val kidText = kidTextNode.attr("text") + val replaceText = tabsAndNewLinesReplacements.replaceAll(kidText) + if (replaceText.trim().length > 1) { - var prevSibNode = kidTextNode.previousSibling() - while (prevSibNode != null && prevSibNode.nodeName() == "a" && prevSibNode.attr("grv-usedalready") != "yes") { - replacementText.append(" " + prevSibNode.outerHtml() + " ") - nodesToRemove += prevSibNode - prevSibNode.attr("grv-usedalready", "yes") - prevSibNode = if (prevSibNode.previousSibling() == null) null else prevSibNode.previousSibling() - } - // add the text of the node - replacementText.append(replaceText) + var prevSibNode = kidTextNode.previousSibling() + while (prevSibNode != null && prevSibNode.nodeName() == "a" && prevSibNode.attr("grv-usedalready") != "yes") { + replacementText.append(" " + prevSibNode.outerHtml() + " ") + nodesToRemove += prevSibNode + prevSibNode.attr("grv-usedalready", "yes") + prevSibNode = if (prevSibNode.previousSibling() == null) null else prevSibNode.previousSibling() + } + // add the text of the node + replacementText.append(replaceText) - // check the next set of links that might be after text (see businessinsider2.txt) - var nextSibNode = kidTextNode.nextSibling() - while (nextSibNode != null && nextSibNode.nodeName() == "a" && nextSibNode.attr("grv-usedalready") != "yes") { - replacementText.append(" " + nextSibNode.outerHtml() + " ") - nodesToRemove += nextSibNode - nextSibNode.attr("grv-usedalready", "yes") - nextSibNode = if (nextSibNode.nextSibling() == null) null else nextSibNode.nextSibling() - } + // check the next set of links that might be after text (see businessinsider2.txt) + var nextSibNode = kidTextNode.nextSibling() + while (nextSibNode != null && nextSibNode.nodeName() == "a" && nextSibNode.attr("grv-usedalready") != "yes") { + replacementText.append(" " + nextSibNode.outerHtml() + " ") + nodesToRemove += nextSibNode + nextSibNode.attr("grv-usedalready", "yes") + nextSibNode = if (nextSibNode.nextSibling() == null) null else nextSibNode.nextSibling() + } - } - nodesToRemove += kid + } + nodesToRemove += kid - } else { - nodesToReturn += kid - } + } else { + nodesToReturn += kid + } - } - // flush out anything still remaining - if (replacementText.size > 0) { - val newNode = getFlushedBuffer(replacementText, doc) - nodesToReturn += newNode - replacementText.clear() - } + } + // flush out anything still remaining + if (replacementText.size > 0) { + val newNode = getFlushedBuffer(replacementText, doc) + nodesToReturn += newNode + replacementText.clear() + } - nodesToRemove.foreach(_.remove()) - nodesToReturn + nodesToRemove.foreach(_.remove()) + nodesToReturn - } + } } object DocumentCleaner extends Logging { - var sb: StringBuilder = new StringBuilder - - // create negative elements - sb.append("^side$|combx|retweet|mediaarticlerelated|menucontainer|navbar|comment|PopularQuestions|contact|foot|footer|Footer|footnote|cnn_strycaptiontxt|links|meta$|scroll|shoutbox|sponsor") - sb.append("|tags|socialnetworking|socialNetworking|cnnStryHghLght|cnn_stryspcvbx|^inset$|pagetools|post-attributes|welcome_form|contentTools2|the_answers|remember-tool-tip") - sb.append("|communitypromo|runaroundLeft|subscribe|vcard|articleheadings|date|^print$|popup|author-dropdown|tools|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text") - - /** - * this regex is used to remove undesirable nodes from our doc - * indicate that something maybe isn't content but more of a comment, footer or some other undesirable node - */ - val regExRemoveNodes = sb.toString() - val queryNaughtyIDs = "[id~=(" + regExRemoveNodes + ")]" - val queryNaughtyClasses = "[class~=(" + regExRemoveNodes + ")]" - val queryNaughtyNames = "[name~=(" + regExRemoveNodes + ")]" - val tabsAndNewLinesReplacements = ReplaceSequence.create("\n", "\n\n").append("\t").append("^\\s+$") - /** - * regex to detect if there are block level elements inside of a div element - */ - val divToPElementsPattern: Pattern = Pattern.compile("<(a|blockquote|dl|div|img|ol|p|pre|table|ul)") - - val blockElemementTags = TagsEvaluator("a", "blockquote", "dl", "div", "img", "ol", "p", "pre", "table", "ul") - val articleRootTags = TagsEvaluator("div", "span", "article") - - val captionPattern: Pattern = Pattern.compile("^caption$") - val googlePattern: Pattern = Pattern.compile(" google ") - val entriesPattern: Pattern = Pattern.compile("^[^entry-]more.*$") - val facebookPattern: Pattern = Pattern.compile("[^-]facebook") - val twitterPattern: Pattern = Pattern.compile("[^-]twitter") - - val logPrefix = "Cleaner: " + var sb: StringBuilder = new StringBuilder + + // create negative elements + sb.append("^side$|combx|retweet|mediaarticlerelated|menucontainer|navbar|comment|PopularQuestions|contact|foot|footer|Footer|footnote|cnn_strycaptiontxt|links|meta$|scroll|shoutbox|sponsor") + sb.append("|tags|socialnetworking|socialNetworking|cnnStryHghLght|cnn_stryspcvbx|^inset$|pagetools|post-attributes|welcome_form|contentTools2|the_answers|remember-tool-tip") + sb.append("|communitypromo|runaroundLeft|subscribe|vcard|articleheadings|date|^print$|popup|author-dropdown|tools|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text") + + /** + * this regex is used to remove undesirable nodes from our doc + * indicate that something maybe isn't content but more of a comment, footer or some other undesirable node + */ + val regExRemoveNodes = sb.toString() + val queryNaughtyIDs = "[id~=(" + regExRemoveNodes + ")]" + val queryNaughtyClasses = "[class~=(" + regExRemoveNodes + ")]" + val queryNaughtyNames = "[name~=(" + regExRemoveNodes + ")]" + val tabsAndNewLinesReplacements = ReplaceSequence.create("\n", "\n\n").append("\t").append("^\\s+$") + /** + * regex to detect if there are block level elements inside of a div element + */ + val divToPElementsPattern: Pattern = Pattern.compile("<(a|blockquote|dl|div|img|ol|p|pre|table|ul)") + + val blockElemementTags = TagsEvaluator("a", "blockquote", "dl", "div", "img", "ol", "p", "pre", "table", "ul") + val articleRootTags = TagsEvaluator("div", "span", "article") + + val captionPattern: Pattern = Pattern.compile("^caption$") + val googlePattern: Pattern = Pattern.compile(" google ") + val entriesPattern: Pattern = Pattern.compile("^[^entry-]more.*$") + val facebookPattern: Pattern = Pattern.compile("[^-]facebook") + val twitterPattern: Pattern = Pattern.compile("[^-]twitter") + + val logPrefix = "Cleaner: " } diff --git a/src/main/scala/com/gravity/goose/cleaners/StandardDocumentCleaner.scala b/src/main/scala/com/gravity/goose/cleaners/StandardDocumentCleaner.scala index b67d133e8..f03356028 100644 --- a/src/main/scala/com/gravity/goose/cleaners/StandardDocumentCleaner.scala +++ b/src/main/scala/com/gravity/goose/cleaners/StandardDocumentCleaner.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/main/scala/com/gravity/goose/extractors/AdditionalDataExtractor.scala b/src/main/scala/com/gravity/goose/extractors/AdditionalDataExtractor.scala index 8f053165a..271b31889 100644 --- a/src/main/scala/com/gravity/goose/extractors/AdditionalDataExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/AdditionalDataExtractor.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -20,12 +20,12 @@ package com.gravity.goose.extractors import org.jsoup.nodes.Element /** -* Implement this abstract class to extract anything not currently contained within the {@link com.jimplush.goose.Article} class -*/ + * Implement this abstract class to extract anything not currently contained within the {@link com.jimplush.goose.Article} class + */ class AdditionalDataExtractor extends Extractor[Map[String, String]] { - def extract(rootElement: Element): Map[String, String] = { - Map.empty - } + def extract(rootElement: Element): Map[String, String] = { + Map.empty + } } diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index 51838e335..1410f0987 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -28,611 +28,612 @@ import org.jsoup.nodes.{Attributes, Element, Document} import org.jsoup.select._ /** -* Created by Jim Plush -* User: jim -* Date: 8/15/11 -*/ + * Created by Jim Plush + * User: jim + * Date: 8/15/11 + */ object ContentExtractor extends Logging { - val logPrefix = "ContentExtractor: " + val logPrefix = "ContentExtractor: " } trait ContentExtractor { - import ContentExtractor._ - - def getLogger() = logger - - // PRIVATE PROPERTIES BELOW - - val MOTLEY_REPLACEMENT: StringReplacement = StringReplacement.compile("�", string.empty) - val ESCAPED_FRAGMENT_REPLACEMENT: StringReplacement = StringReplacement.compile("#!", "?_escaped_fragment_=") - val TITLE_REPLACEMENTS: ReplaceSequence = ReplaceSequence.create("»").append("»") - val PIPE_SPLITTER: StringSplitter = new StringSplitter("\\|") - val DASH_SPLITTER: StringSplitter = new StringSplitter(" - ") - val ARROWS_SPLITTER: StringSplitter = new StringSplitter("»") - val COLON_SPLITTER: StringSplitter = new StringSplitter(":") - val SPACE_SPLITTER: StringSplitter = new StringSplitter(" ") - val NO_STRINGS = Set.empty[String] - val A_REL_TAG_SELECTOR: String = "a[rel=tag], a[href*=/tag/]" - val TOP_NODE_TAGS = new TagsEvaluator(Set("p", "td", "pre")) - - def getTitle(article: Article): String = { - var title: String = string.empty - - val doc = article.doc - - try { - val titleElem: Elements = doc.getElementsByTag("title") - if (titleElem == null || titleElem.isEmpty) return string.empty - var titleText: String = titleElem.first.text - if (string.isNullOrEmpty(titleText)) return string.empty - var usedDelimeter: Boolean = false - if (titleText.contains("|")) { - titleText = doTitleSplits(titleText, PIPE_SPLITTER) - usedDelimeter = true - } - if (!usedDelimeter && titleText.contains("-")) { - titleText = doTitleSplits(titleText, DASH_SPLITTER) - usedDelimeter = true - } - if (!usedDelimeter && titleText.contains("»")) { - titleText = doTitleSplits(titleText, ARROWS_SPLITTER) - usedDelimeter = true - } - if (!usedDelimeter && titleText.contains(":")) { - titleText = doTitleSplits(titleText, COLON_SPLITTER) - } - // todo do we still need this? thinking not, make it an output formatter config - // title = StringEscapeUtils.escapeHtml(titleText) - title = MOTLEY_REPLACEMENT.replaceAll(titleText) - - trace(logPrefix + "Page title is: " + title) - - title + + import ContentExtractor._ + + def getLogger() = logger + + // PRIVATE PROPERTIES BELOW + + val MOTLEY_REPLACEMENT: StringReplacement = StringReplacement.compile("�", string.empty) + val ESCAPED_FRAGMENT_REPLACEMENT: StringReplacement = StringReplacement.compile("#!", "?_escaped_fragment_=") + val TITLE_REPLACEMENTS: ReplaceSequence = ReplaceSequence.create("»").append("»") + val PIPE_SPLITTER: StringSplitter = new StringSplitter("\\|") + val DASH_SPLITTER: StringSplitter = new StringSplitter(" - ") + val ARROWS_SPLITTER: StringSplitter = new StringSplitter("»") + val COLON_SPLITTER: StringSplitter = new StringSplitter(":") + val SPACE_SPLITTER: StringSplitter = new StringSplitter(" ") + val NO_STRINGS = Set.empty[String] + val A_REL_TAG_SELECTOR: String = "a[rel=tag], a[href*=/tag/]" + val TOP_NODE_TAGS = new TagsEvaluator(Set("p", "td", "pre")) + + def getTitle(article: Article): String = { + var title: String = string.empty + + val doc = article.doc + + try { + val titleElem: Elements = doc.getElementsByTag("title") + if (titleElem == null || titleElem.isEmpty) return string.empty + var titleText: String = titleElem.first.text + if (string.isNullOrEmpty(titleText)) return string.empty + var usedDelimeter: Boolean = false + if (titleText.contains("|")) { + titleText = doTitleSplits(titleText, PIPE_SPLITTER) + usedDelimeter = true + } + if (!usedDelimeter && titleText.contains("-")) { + titleText = doTitleSplits(titleText, DASH_SPLITTER) + usedDelimeter = true + } + if (!usedDelimeter && titleText.contains("»")) { + titleText = doTitleSplits(titleText, ARROWS_SPLITTER) + usedDelimeter = true + } + if (!usedDelimeter && titleText.contains(":")) { + titleText = doTitleSplits(titleText, COLON_SPLITTER) + } + // todo do we still need this? thinking not, make it an output formatter config + // title = StringEscapeUtils.escapeHtml(titleText) + title = MOTLEY_REPLACEMENT.replaceAll(titleText) + + trace(logPrefix + "Page title is: " + title) + + title + + } + catch { + case e: NullPointerException => { + warn(e.toString) + string.empty + } + } } - catch { - case e: NullPointerException => { - warn(e.toString) - string.empty - } + + /** + * based on a delimeter in the title take the longest piece or do some custom logic based on the site + * + * @param title + * @param splitter + * @return + */ + def doTitleSplits(title: String, splitter: StringSplitter): String = { + var largetTextLen: Int = 0 + var largeTextIndex: Int = 0 + val titlePieces: Array[String] = splitter.split(title) + var i: Int = 0 + while (i < titlePieces.length) { + + val current: String = titlePieces(i) + if (current.length > largetTextLen) { + largetTextLen = current.length + largeTextIndex = i + } + i += 1 + + } + TITLE_REPLACEMENTS.replaceAll(titlePieces(largeTextIndex)).trim } - } - - /** - * based on a delimeter in the title take the longest piece or do some custom logic based on the site - * - * @param title - * @param splitter - * @return - */ - def doTitleSplits(title: String, splitter: StringSplitter): String = { - var largetTextLen: Int = 0 - var largeTextIndex: Int = 0 - val titlePieces: Array[String] = splitter.split(title) - var i: Int = 0 - while (i < titlePieces.length) { - - val current: String = titlePieces(i) - if (current.length > largetTextLen) { - largetTextLen = current.length - largeTextIndex = i - } - i += 1 + private def getMetaContent(doc: Document, metaName: String): String = { + val meta: Elements = doc.select(metaName) + var content: String = null + if (meta.size > 0) { + content = meta.first.attr("content") + } + if (string.isNullOrEmpty(content)) string.empty else content.trim + } + /** + * if the article has meta description set in the source, use that + */ + def getMetaDescription(article: Article): String = { + getMetaContent(article.doc, "meta[name=description]") } - TITLE_REPLACEMENTS.replaceAll(titlePieces(largeTextIndex)).trim - } - - private def getMetaContent(doc: Document, metaName: String): String = { - val meta: Elements = doc.select(metaName) - var content: String = null - if (meta.size > 0) { - content = meta.first.attr("content") + + /** + * if the article has meta keywords set in the source, use that + */ + def getMetaKeywords(article: Article): String = { + getMetaContent(article.doc, "meta[name=keywords]") } - if (string.isNullOrEmpty(content)) string.empty else content.trim - } - - /** - * if the article has meta description set in the source, use that - */ - def getMetaDescription(article: Article): String = { - getMetaContent(article.doc, "meta[name=description]") - } - - /** - * if the article has meta keywords set in the source, use that - */ - def getMetaKeywords(article: Article): String = { - getMetaContent(article.doc, "meta[name=keywords]") - } - - - /** - * if the article has meta canonical link set in the url - */ - def getCanonicalLink(article: Article): String = { - val meta = article.doc.select("link[rel=canonical]") - if (meta.size() > 0) { - val href = Option(meta.first().attr("href")).getOrElse("").trim - if (href.nonEmpty) href else article.finalUrl - } else { - article.finalUrl + + + /** + * if the article has meta canonical link set in the url + */ + def getCanonicalLink(article: Article): String = { + val meta = article.doc.select("link[rel=canonical]") + if (meta.size() > 0) { + val href = Option(meta.first().attr("href")).getOrElse("").trim + if (href.nonEmpty) href else article.finalUrl + } else { + article.finalUrl + } } - } - - def getDomain(url: String): String = { - new URL(url).getHost - } - - def extractTags(article: Article): Set[String] = { - val node = article.doc - if (node.children.size == 0) return NO_STRINGS - val elements: Elements = Selector.select(A_REL_TAG_SELECTOR, node) - if (elements.size == 0) return NO_STRINGS - val tags = mutable.HashSet[String]() - - for (el <- elements) { - var tag: String = el.text - if (!string.isNullOrEmpty(tag)) tags += tag + + def getDomain(url: String): String = { + new URL(url).getHost } - tags.toSet - } - - /** - * we're going to start looking for where the clusters of paragraphs are. We'll score a cluster based on the number of stopwords - * and the number of consecutive paragraphs together, which should form the cluster of text that this node is around - * also store on how high up the paragraphs are, comments are usually at the bottom and should get a lower score - * - * // todo refactor this long method - * @return - */ - - def calculateBestNodeBasedOnClustering(article: Article): Option[Element] = { - trace(logPrefix + "Starting to calculate TopNode") - val doc = article.doc - var topNode: Element = null - val nodesToCheck = Collector.collect(TOP_NODE_TAGS, doc) - var startingBoost: Double = 1.0 - var cnt: Int = 0 - var i: Int = 0 - val parentNodes = mutable.HashSet[Element]() - val nodesWithText = mutable.Buffer[Element]() - for (node <- nodesToCheck) { - val nodeText: String = node.text - val wordStats: WordStats = StopWords.getStopWordCount(nodeText) - val highLinkDensity: Boolean = isHighLinkDensity(node) - if (wordStats.getStopWordCount > 2 && !highLinkDensity) { - nodesWithText.add(node) - } + + def extractTags(article: Article): Set[String] = { + val node = article.doc + if (node.children.size == 0) return NO_STRINGS + val elements: Elements = Selector.select(A_REL_TAG_SELECTOR, node) + if (elements.size == 0) return NO_STRINGS + val tags = mutable.HashSet[String]() + + for (el <- elements) { + var tag: String = el.text + if (!string.isNullOrEmpty(tag)) tags += tag + } + tags.toSet } - val numberOfNodes: Int = nodesWithText.size - val negativeScoring: Int = 0 - val bottomNodesForNegativeScore: Double = numberOfNodes * 0.25 - - trace(logPrefix + "About to inspect num of nodes with text: " + numberOfNodes) - - for (node <- nodesWithText) { - var boostScore: Float = 0 - if (isOkToBoost(node)) { - if (cnt >= 0) { - boostScore = ((1.0 / startingBoost) * 50).asInstanceOf[Float] - startingBoost += 1 + + /** + * we're going to start looking for where the clusters of paragraphs are. We'll score a cluster based on the number of stopwords + * and the number of consecutive paragraphs together, which should form the cluster of text that this node is around + * also store on how high up the paragraphs are, comments are usually at the bottom and should get a lower score + * + * // todo refactor this long method + * @return + */ + + def calculateBestNodeBasedOnClustering(article: Article): Option[Element] = { + trace(logPrefix + "Starting to calculate TopNode") + val doc = article.doc + var topNode: Element = null + val nodesToCheck = Collector.collect(TOP_NODE_TAGS, doc) + var startingBoost: Double = 1.0 + var cnt: Int = 0 + var i: Int = 0 + val parentNodes = mutable.HashSet[Element]() + val nodesWithText = mutable.Buffer[Element]() + for (node <- nodesToCheck) { + val nodeText: String = node.text + val wordStats: WordStats = StopWords.getStopWordCount(nodeText) + val highLinkDensity: Boolean = isHighLinkDensity(node) + if (wordStats.getStopWordCount > 2 && !highLinkDensity) { + nodesWithText.add(node) + } } - } - if (numberOfNodes > 15) { - if ((numberOfNodes - i) <= bottomNodesForNegativeScore) { - val booster: Float = bottomNodesForNegativeScore.asInstanceOf[Float] - (numberOfNodes - i).asInstanceOf[Float] - boostScore = -math.pow(booster, 2.asInstanceOf[Float]).asInstanceOf[Float] - val negscore: Float = math.abs(boostScore) + negativeScoring - if (negscore > 40) { - boostScore = 5 - } + val numberOfNodes: Int = nodesWithText.size + val negativeScoring: Int = 0 + val bottomNodesForNegativeScore: Double = numberOfNodes * 0.25 + + trace(logPrefix + "About to inspect num of nodes with text: " + numberOfNodes) + + for (node <- nodesWithText) { + var boostScore: Float = 0 + if (isOkToBoost(node)) { + if (cnt >= 0) { + boostScore = ((1.0 / startingBoost) * 50).asInstanceOf[Float] + startingBoost += 1 + } + } + if (numberOfNodes > 15) { + if ((numberOfNodes - i) <= bottomNodesForNegativeScore) { + val booster: Float = bottomNodesForNegativeScore.asInstanceOf[Float] - (numberOfNodes - i).asInstanceOf[Float] + boostScore = -math.pow(booster, 2.asInstanceOf[Float]).asInstanceOf[Float] + val negscore: Float = math.abs(boostScore) + negativeScoring + if (negscore > 40) { + boostScore = 5 + } + } + } + + trace(logPrefix + "Location Boost Score: " + boostScore + " on interation: " + i + "' id='" + node.parent.id + "' class='" + node.parent.attr("class")) + + val nodeText: String = node.text + val wordStats: WordStats = StopWords.getStopWordCount(nodeText) + val upscore: Int = (wordStats.getStopWordCount + boostScore).asInstanceOf[Int] + updateScore(node.parent, upscore) + updateScore(node.parent.parent, upscore / 2) + updateNodeCount(node.parent, 1) + updateNodeCount(node.parent.parent, 1) + if (!parentNodes.contains(node.parent)) { + parentNodes.add(node.parent) + } + if (!parentNodes.contains(node.parent.parent)) { + parentNodes.add(node.parent.parent) + } + + cnt += 1 + i += 1 } - } - - trace(logPrefix + "Location Boost Score: " + boostScore + " on interation: " + i + "' id='" + node.parent.id + "' class='" + node.parent.attr("class")) - - val nodeText: String = node.text - val wordStats: WordStats = StopWords.getStopWordCount(nodeText) - val upscore: Int = (wordStats.getStopWordCount + boostScore).asInstanceOf[Int] - updateScore(node.parent, upscore) - updateScore(node.parent.parent, upscore / 2) - updateNodeCount(node.parent, 1) - updateNodeCount(node.parent.parent, 1) - if (!parentNodes.contains(node.parent)) { - parentNodes.add(node.parent) - } - if (!parentNodes.contains(node.parent.parent)) { - parentNodes.add(node.parent.parent) - } - - cnt += 1 - i += 1 - } - var topNodeScore: Int = 0 - for (e <- parentNodes) { - - trace(logPrefix + "ParentNode: score='" + e.attr("gravityScore") + "' nodeCount='" + e.attr("gravityNodes") + "' id='" + e.id + "' class='" + e.attr("class") + "' ") - - val score: Int = getScore(e) - if (score > topNodeScore) { - topNode = e - topNodeScore = score - } - if (topNode == null) { - topNode = e - } - } - printTraceLog(topNode) - if (topNode == null) None else Some(topNode) - } - - def printTraceLog(topNode: Element) { - try { - if (topNode != null) { - trace(logPrefix + "Our TOPNODE: score='" + topNode.attr("gravityScore") + "' nodeCount='" + topNode.attr("gravityNodes") + "' id='" + topNode.id + "' class='" + topNode.attr("class") + "' ") - val text = if (topNode.text.trim.length > 100) topNode.text.trim.substring(0, 100) + "..." else topNode.text.trim - trace(logPrefix + "Text - " + text) - } - } catch { - case e: NullPointerException => warn("printTraceLog: " + e.toString) + var topNodeScore: Int = 0 + for (e <- parentNodes) { + + trace(logPrefix + "ParentNode: score='" + e.attr("gravityScore") + "' nodeCount='" + e.attr("gravityNodes") + "' id='" + e.id + "' class='" + e.attr("class") + "' ") + + val score: Int = getScore(e) + if (score > topNodeScore) { + topNode = e + topNodeScore = score + } + if (topNode == null) { + topNode = e + } + } + printTraceLog(topNode) + if (topNode == null) None else Some(topNode) } - } - - /** - * alot of times the first paragraph might be the caption under an image so we'll want to make sure if we're going to - * boost a parent node that it should be connected to other paragraphs, at least for the first n paragraphs - * so we'll want to make sure that the next sibling is a paragraph and has at least some substatial weight to it - * - * - * @param node - * @return - */ - private def isOkToBoost(node: Element): Boolean = { - val para = "p" - var stepsAway: Int = 0 - val minimumStopWordCount = 5 - val maxStepsAwayFromNode = 3 - - walkSiblings(node) { - currentNode => { - if (currentNode.tagName == para) { - if (stepsAway >= maxStepsAwayFromNode) { - trace(logPrefix + "Next paragraph is too far away, not boosting") - return false - } - val paraText: String = currentNode.text - val wordStats: WordStats = StopWords.getStopWordCount(paraText) - if (wordStats.getStopWordCount > minimumStopWordCount) { - trace(logPrefix + "We're gonna boost this node, seems contenty") - return true - } - stepsAway += 1 + + def printTraceLog(topNode: Element) { + try { + if (topNode != null) { + trace(logPrefix + "Our TOPNODE: score='" + topNode.attr("gravityScore") + "' nodeCount='" + topNode.attr("gravityNodes") + "' id='" + topNode.id + "' class='" + topNode.attr("class") + "' ") + val text = if (topNode.text.trim.length > 100) topNode.text.trim.substring(0, 100) + "..." else topNode.text.trim + trace(logPrefix + "Text - " + text) + } + } catch { + case e: NullPointerException => warn("printTraceLog: " + e.toString) } - } } - false - } - - def getShortText(e: String, max: Int): String = { - if (e.length > max) e.substring(0, max) + "..." else e - } - - /** - * checks the density of links within a node, is there not much text and most of it contains linky shit? - * if so it's no good - * - * @param e - * @return - */ - private def isHighLinkDensity(e: Element): Boolean = { - val links: Elements = e.getElementsByTag("a") - if (links.size == 0) { - return false + + /** + * alot of times the first paragraph might be the caption under an image so we'll want to make sure if we're going to + * boost a parent node that it should be connected to other paragraphs, at least for the first n paragraphs + * so we'll want to make sure that the next sibling is a paragraph and has at least some substatial weight to it + * + * + * @param node + * @return + */ + private def isOkToBoost(node: Element): Boolean = { + val para = "p" + var stepsAway: Int = 0 + val minimumStopWordCount = 5 + val maxStepsAwayFromNode = 3 + + walkSiblings(node) { + currentNode => { + if (currentNode.tagName == para) { + if (stepsAway >= maxStepsAwayFromNode) { + trace(logPrefix + "Next paragraph is too far away, not boosting") + return false + } + val paraText: String = currentNode.text + val wordStats: WordStats = StopWords.getStopWordCount(paraText) + if (wordStats.getStopWordCount > minimumStopWordCount) { + trace(logPrefix + "We're gonna boost this node, seems contenty") + return true + } + stepsAway += 1 + } + } + } + false } - val text: String = e.text.trim - val words: Array[String] = SPACE_SPLITTER.split(text) - val numberOfWords: Float = words.length - val sb: StringBuilder = new StringBuilder - for (link <- links) { - sb.append(link.text) + + def getShortText(e: String, max: Int): String = { + if (e.length > max) e.substring(0, max) + "..." else e } - val linkText: String = sb.toString() - val linkWords: Array[String] = SPACE_SPLITTER.split(linkText) - val numberOfLinkWords: Float = linkWords.length - val numberOfLinks: Float = links.size - val linkDivisor: Float = numberOfLinkWords / numberOfWords - val score: Float = linkDivisor * numberOfLinks - trace(logPrefix + "Calulated link density score as: " + score + " for node: " + getShortText(e.text, 50)) + /** + * checks the density of links within a node, is there not much text and most of it contains linky shit? + * if so it's no good + * + * @param e + * @return + */ + private def isHighLinkDensity(e: Element): Boolean = { + val links: Elements = e.getElementsByTag("a") + if (links.size == 0) { + return false + } + val text: String = e.text.trim + val words: Array[String] = SPACE_SPLITTER.split(text) + val numberOfWords: Float = words.length + val sb: StringBuilder = new StringBuilder + for (link <- links) { + sb.append(link.text) + } + val linkText: String = sb.toString() + val linkWords: Array[String] = SPACE_SPLITTER.split(linkText) + val numberOfLinkWords: Float = linkWords.length + val numberOfLinks: Float = links.size + val linkDivisor: Float = numberOfLinkWords / numberOfWords + val score: Float = linkDivisor * numberOfLinks - if (score > 1) { - return true - } - false - } - - /** - * returns the gravityScore as an integer from this node - * - * @param node - * @return - */ - private def getScore(node: Element): Int = { - getGravityScoreFromNode(node) match { - case Some(score) => score - case None => 0 - } - } - - private def getGravityScoreFromNode(node: Element): Option[Int] = { - try { - val grvScoreString: String = node.attr("gravityScore") - if (string.isNullOrEmpty(grvScoreString)) return None - Some(Integer.parseInt(grvScoreString)) - } catch { - case e: Exception => None + trace(logPrefix + "Calulated link density score as: " + score + " for node: " + getShortText(e.text, 50)) + + if (score > 1) { + return true + } + false } - } - - /** - * adds a score to the gravityScore Attribute we put on divs - * we'll get the current score then add the score we're passing in to the current - * - * @param node - * @param addToScore - the score to add to the node - */ - private def updateScore(node: Element, addToScore: Int) { - var currentScore: Int = 0 - try { - val scoreString: String = node.attr("gravityScore") - currentScore = if (string.isNullOrEmpty(scoreString)) 0 else Integer.parseInt(scoreString) + + /** + * returns the gravityScore as an integer from this node + * + * @param node + * @return + */ + private def getScore(node: Element): Int = { + getGravityScoreFromNode(node) match { + case Some(score) => score + case None => 0 + } } - catch { - case e: NumberFormatException => { - currentScore = 0 - } + + private def getGravityScoreFromNode(node: Element): Option[Int] = { + try { + val grvScoreString: String = node.attr("gravityScore") + if (string.isNullOrEmpty(grvScoreString)) return None + Some(Integer.parseInt(grvScoreString)) + } catch { + case e: Exception => None + } } - val newScore: Int = currentScore + addToScore - node.attr("gravityScore", Integer.toString(newScore)) - } - - /** - * stores how many decent nodes are under a parent node - * - * @param node - * @param addToCount - */ - private def updateNodeCount(node: Element, addToCount: Int) { - var currentScore: Int = 0 - try { - val countString: String = node.attr("gravityNodes") - currentScore = if (string.isNullOrEmpty(countString)) 0 else Integer.parseInt(countString) + + /** + * adds a score to the gravityScore Attribute we put on divs + * we'll get the current score then add the score we're passing in to the current + * + * @param node + * @param addToScore - the score to add to the node + */ + private def updateScore(node: Element, addToScore: Int) { + var currentScore: Int = 0 + try { + val scoreString: String = node.attr("gravityScore") + currentScore = if (string.isNullOrEmpty(scoreString)) 0 else Integer.parseInt(scoreString) + } + catch { + case e: NumberFormatException => { + currentScore = 0 + } + } + val newScore: Int = currentScore + addToScore + node.attr("gravityScore", Integer.toString(newScore)) } - catch { - case e: NumberFormatException => { - currentScore = 0 - } + + /** + * stores how many decent nodes are under a parent node + * + * @param node + * @param addToCount + */ + private def updateNodeCount(node: Element, addToCount: Int) { + var currentScore: Int = 0 + try { + val countString: String = node.attr("gravityNodes") + currentScore = if (string.isNullOrEmpty(countString)) 0 else Integer.parseInt(countString) + } + catch { + case e: NumberFormatException => { + currentScore = 0 + } + } + val newScore: Int = currentScore + addToCount + node.attr("gravityNodes", Integer.toString(newScore)) } - val newScore: Int = currentScore + addToCount - node.attr("gravityNodes", Integer.toString(newScore)) - } - - /** - * pulls out videos we like - * - * @return - */ - def extractVideos(node: Element): List[Element] = { - val candidates: ArrayList[Element] = new ArrayList[Element] - val goodMovies = mutable.Buffer[Element]() - val youtubeStr = "youtube" - val vimdeoStr = "vimeo" - try { - node.parent.getElementsByTag("embed").foreach(candidates.add(_)) - node.parent.getElementsByTag("object").foreach(candidates.add(_)) - - trace(logPrefix + "extractVideos: Starting to extract videos. Found: " + candidates.size) - - for (el <- candidates) { - val attrs: Attributes = el.attributes() - for (a <- attrs) { - try { - if ((a.getValue.contains(youtubeStr) || a.getValue.contains(vimdeoStr)) && (a.getKey == "src")) { - trace(logPrefix + "This page has a video!: " + a.getValue) - goodMovies += el + + /** + * pulls out videos we like + * + * @return + */ + def extractVideos(node: Element): List[Element] = { + val candidates: ArrayList[Element] = new ArrayList[Element] + val goodMovies = mutable.Buffer[Element]() + val youtubeStr = "youtube" + val vimdeoStr = "vimeo" + try { + node.parent.getElementsByTag("embed").foreach(candidates.add(_)) + node.parent.getElementsByTag("object").foreach(candidates.add(_)) + + trace(logPrefix + "extractVideos: Starting to extract videos. Found: " + candidates.size) + + for (el <- candidates) { + val attrs: Attributes = el.attributes() + for (a <- attrs) { + try { + if ((a.getValue.contains(youtubeStr) || a.getValue.contains(vimdeoStr)) && (a.getKey == "src")) { + trace(logPrefix + "This page has a video!: " + a.getValue) + goodMovies += el + } + } + catch { + case e: Exception => { + info(logPrefix + "Error extracting movies: " + e.toString) + } + } + } + } + } + catch { + case e: NullPointerException => { + warn(e.toString, e) } - } - catch { case e: Exception => { - info(logPrefix + "Error extracting movies: " + e.toString) + warn(e.toString, e) } - } } - } - } - catch { - case e: NullPointerException => { - warn(e.toString, e) - } - case e: Exception => { - warn(e.toString, e) - } + trace(logPrefix + "extractVideos: done looking videos") + goodMovies.toList } - trace(logPrefix + "extractVideos: done looking videos") - goodMovies.toList - } - def isTableTagAndNoParagraphsExist(e: Element): Boolean = { + def isTableTagAndNoParagraphsExist(e: Element): Boolean = { - val subParagraphs: Elements = e.getElementsByTag("p") - for (p <- subParagraphs) { - if (p.text.length < 25) { - p.remove() - } - } - val subParagraphs2: Elements = e.getElementsByTag("p") - if (subParagraphs2.size == 0 && !(e.tagName == "td")) { - trace("Removing node because it doesn't have any paragraphs") - true - } else { - false - } - } - - - /** - * remove any divs that looks like non-content, clusters of links, or paras with no gusto - * - * @param targetNode - * @return - */ - def postExtractionCleanup(targetNode: Element): Element = { - - trace(logPrefix + "Starting cleanup Node") - val node = addSiblings(targetNode) - for { - e <- node.children - if (e.tagName != "p") - } { - trace(logPrefix + "CLEANUP NODE: " + e.id + " class: " + e.attr("class")) - if (isHighLinkDensity(e) || isTableTagAndNoParagraphsExist(e) || !isNodeScoreThreshholdMet(node, e)) { - try { - e.remove() - } catch { - case ex: IllegalArgumentException => trace("Cannot remove node: " + ex.toString) + val subParagraphs: Elements = e.getElementsByTag("p") + for (p <- subParagraphs) { + if (p.text.length < 25) { + p.remove() + } + } + val subParagraphs2: Elements = e.getElementsByTag("p") + if (subParagraphs2.size == 0 && !(e.tagName == "td")) { + trace("Removing node because it doesn't have any paragraphs") + true + } else { + false } - } } - node - } - def isNodeScoreThreshholdMet(node: Element, e: Element): Boolean = { - val topNodeScore: Int = getScore(node) - val currentNodeScore: Int = getScore(e) - val thresholdScore: Float = (topNodeScore * .08).asInstanceOf[Float] + /** + * remove any divs that looks like non-content, clusters of links, or paras with no gusto + * + * @param targetNode + * @return + */ + def postExtractionCleanup(targetNode: Element): Element = { + + trace(logPrefix + "Starting cleanup Node") + val node = addSiblings(targetNode) + for { + e <- node.children + if (e.tagName != "p") + } { + trace(logPrefix + "CLEANUP NODE: " + e.id + " class: " + e.attr("class")) + if (isHighLinkDensity(e) || isTableTagAndNoParagraphsExist(e) || !isNodeScoreThreshholdMet(node, e)) { + try { + e.remove() + } catch { + case ex: IllegalArgumentException => trace("Cannot remove node: " + ex.toString) + } + } + } + node + } - trace(logPrefix + "topNodeScore: " + topNodeScore + " currentNodeScore: " + currentNodeScore + " threshold: " + thresholdScore) - if ((currentNodeScore < thresholdScore) && e.tagName != "td") { - trace(logPrefix + "Removing node due to low threshold score") - false - } else { - trace(logPrefix + "Not removing TD node") - true - } - } + def isNodeScoreThreshholdMet(node: Element, e: Element): Boolean = { + val topNodeScore: Int = getScore(node) + val currentNodeScore: Int = getScore(e) + val thresholdScore: Float = (topNodeScore * .08).asInstanceOf[Float] - /** - * adds any siblings that may have a decent score to this node - * - * @param currentSibling - * @return - */ - def getSiblingContent(currentSibling: Element, baselineScoreForSiblingParagraphs: Int): Option[String] = { + trace(logPrefix + "topNodeScore: " + topNodeScore + " currentNodeScore: " + currentNodeScore + " threshold: " + thresholdScore) - if (currentSibling.tagName == "p" && currentSibling.text.length() > 0) { - Some(currentSibling.outerHtml) + if ((currentNodeScore < thresholdScore) && e.tagName != "td") { + trace(logPrefix + "Removing node due to low threshold score") + false + } else { + trace(logPrefix + "Not removing TD node") + true + } + } - } else { + /** + * adds any siblings that may have a decent score to this node + * + * @param currentSibling + * @return + */ + def getSiblingContent(currentSibling: Element, baselineScoreForSiblingParagraphs: Int): Option[String] = { + + if (currentSibling.tagName == "p" && currentSibling.text.length() > 0) { + Some(currentSibling.outerHtml) + + } else { + + val potentialParagraphs: Elements = currentSibling.getElementsByTag("p") + if (potentialParagraphs.first == null) { + None + } else { + + Some((for { + firstParagraph <- potentialParagraphs + if (firstParagraph.text.length() > 0) + wordStats: WordStats = StopWords.getStopWordCount(firstParagraph.text) + paragraphScore: Int = wordStats.getStopWordCount + siblingBaseLineScore: Double = .30 + if ((baselineScoreForSiblingParagraphs * siblingBaseLineScore).toDouble < paragraphScore) + } yield { + + trace(logPrefix + "This node looks like a good sibling, adding it") + "<p>" + firstParagraph.text + "<p>" + + }).mkString) + } - val potentialParagraphs: Elements = currentSibling.getElementsByTag("p") - if (potentialParagraphs.first == null) { - None - } else { + } + } - Some((for { - firstParagraph <- potentialParagraphs - if (firstParagraph.text.length() > 0) - wordStats: WordStats = StopWords.getStopWordCount(firstParagraph.text) - paragraphScore: Int = wordStats.getStopWordCount - siblingBaseLineScore: Double = .30 - if ((baselineScoreForSiblingParagraphs * siblingBaseLineScore).toDouble < paragraphScore) - } yield { + def walkSiblings[T](node: Element)(work: (Element) => T): Seq[T] = { + var currentSibling: Element = node.previousElementSibling + val b = mutable.Buffer[T]() - trace(logPrefix + "This node looks like a good sibling, adding it") - "<p>" + firstParagraph.text + "<p>" + while (currentSibling != null) { - }).mkString) - } + trace(logPrefix + "SIBLINGCHECK: " + debugNode(currentSibling)) + b += work(currentSibling) + currentSibling = if (currentSibling != null) currentSibling.previousElementSibling else null + } + b } - } - def walkSiblings[T](node: Element)(work: (Element) => T): Seq[T] = { - var currentSibling: Element = node.previousElementSibling - val b = mutable.Buffer[T]() + private def addSiblings(topNode: Element): Element = { - while (currentSibling != null) { + trace(logPrefix + "Starting to add siblings") - trace(logPrefix + "SIBLINGCHECK: " + debugNode(currentSibling)) - b += work(currentSibling) + val baselineScoreForSiblingParagraphs: Int = getBaselineScoreForSiblings(topNode) + val results = walkSiblings(topNode) { + currentNode => { + getSiblingContent(currentNode, baselineScoreForSiblingParagraphs) - currentSibling = if (currentSibling != null) currentSibling.previousElementSibling else null + } + }.reverse.flatMap(itm => itm) + topNode.child(0).before(results.mkString) + topNode } - b - } - - private def addSiblings(topNode: Element): Element = { - - trace(logPrefix + "Starting to add siblings") - - val baselineScoreForSiblingParagraphs: Int = getBaselineScoreForSiblings(topNode) - val results = walkSiblings(topNode) { - currentNode => { - getSiblingContent(currentNode, baselineScoreForSiblingParagraphs) - - } - }.reverse.flatMap(itm => itm) - topNode.child(0).before(results.mkString) - topNode - } - - /** - * we could have long articles that have tons of paragraphs so if we tried to calculate the base score against - * the total text score of those paragraphs it would be unfair. So we need to normalize the score based on the average scoring - * of the paragraphs within the top node. For example if our total score of 10 paragraphs was 1000 but each had an average value of - * 100 then 100 should be our base. - * - * @param topNode - * @return - */ - private def getBaselineScoreForSiblings(topNode: Element): Int = { - var base: Int = 100000 - var numberOfParagraphs: Int = 0 - var scoreOfParagraphs: Int = 0 - val nodesToCheck: Elements = topNode.getElementsByTag("p") - - for (node <- nodesToCheck) { - val nodeText: String = node.text - val wordStats: WordStats = StopWords.getStopWordCount(nodeText) - val highLinkDensity: Boolean = isHighLinkDensity(node) - if (wordStats.getStopWordCount > 2 && !highLinkDensity) { - numberOfParagraphs += 1; - scoreOfParagraphs += wordStats.getStopWordCount - } + + /** + * we could have long articles that have tons of paragraphs so if we tried to calculate the base score against + * the total text score of those paragraphs it would be unfair. So we need to normalize the score based on the average scoring + * of the paragraphs within the top node. For example if our total score of 10 paragraphs was 1000 but each had an average value of + * 100 then 100 should be our base. + * + * @param topNode + * @return + */ + private def getBaselineScoreForSiblings(topNode: Element): Int = { + var base: Int = 100000 + var numberOfParagraphs: Int = 0 + var scoreOfParagraphs: Int = 0 + val nodesToCheck: Elements = topNode.getElementsByTag("p") + + for (node <- nodesToCheck) { + val nodeText: String = node.text + val wordStats: WordStats = StopWords.getStopWordCount(nodeText) + val highLinkDensity: Boolean = isHighLinkDensity(node) + if (wordStats.getStopWordCount > 2 && !highLinkDensity) { + numberOfParagraphs += 1; + scoreOfParagraphs += wordStats.getStopWordCount + } + } + if (numberOfParagraphs > 0) { + base = scoreOfParagraphs / numberOfParagraphs + if (logger.isDebugEnabled) { + logger.debug("The base score for siblings to beat is: " + base + " NumOfParas: " + numberOfParagraphs + " scoreOfAll: " + scoreOfParagraphs) + } + } + base } - if (numberOfParagraphs > 0) { - base = scoreOfParagraphs / numberOfParagraphs - if (logger.isDebugEnabled) { - logger.debug("The base score for siblings to beat is: " + base + " NumOfParas: " + numberOfParagraphs + " scoreOfAll: " + scoreOfParagraphs) - } + + private def debugNode(e: Element): String = { + val sb: StringBuilder = new StringBuilder + sb.append("GravityScore: '") + sb.append(e.attr("gravityScore")) + sb.append("' paraNodeCount: '") + sb.append(e.attr("gravityNodes")) + sb.append("' nodeId: '") + sb.append(e.id) + sb.append("' className: '") + sb.append(e.attr("class")) + sb.toString() } - base - } - - private def debugNode(e: Element): String = { - val sb: StringBuilder = new StringBuilder - sb.append("GravityScore: '") - sb.append(e.attr("gravityScore")) - sb.append("' paraNodeCount: '") - sb.append(e.attr("gravityNodes")) - sb.append("' nodeId: '") - sb.append(e.id) - sb.append("' className: '") - sb.append(e.attr("class")) - sb.toString() - } } \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/extractors/Extractor.scala b/src/main/scala/com/gravity/goose/extractors/Extractor.scala index 33c60bd5b..f1bb6a4ec 100644 --- a/src/main/scala/com/gravity/goose/extractors/Extractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/Extractor.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -20,21 +20,21 @@ package com.gravity.goose.extractors import org.jsoup.nodes.Element /** -* Created by IntelliJ IDEA. -* User: robbie -* Date: 5/19/11 -* Time: 2:45 PM -*/ + * Created by IntelliJ IDEA. + * User: robbie + * Date: 5/19/11 + * Time: 2:45 PM + */ /** -* Encapsulates the process of extracting some type <code>T</code> from an article -* @param <T> the type of {@link Object} the implementing class will return -*/ + * Encapsulates the process of extracting some type <code>T</code> from an article + * @param <T> the type of { @link Object} the implementing class will return + */ trait Extractor[T] { - /** - * Given the specified {@link Element}, extract @param <T> - * - * @param rootElement passed in from the {@link com.jimplush.goose.ContentExtractor} after the article has been parsed - * @return an instance of type <code>T</code> - */ - def extract(rootElement: Element): T + /** + * Given the specified {@link Element}, extract @param <T> + * + * @param rootElement passed in from the { @link com.jimplush.goose.ContentExtractor} after the article has been parsed + * @return an instance of type <code>T</code> + */ + def extract(rootElement: Element): T } \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/extractors/PublishDateExtractor.scala b/src/main/scala/com/gravity/goose/extractors/PublishDateExtractor.scala index aa8e1ae04..02ed691c0 100644 --- a/src/main/scala/com/gravity/goose/extractors/PublishDateExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/PublishDateExtractor.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -21,8 +21,8 @@ import org.jsoup.nodes.Element import java.util.Date /** -* Implement this class to extract the {@link Date} of when this article was published. -*/ + * Implement this class to extract the {@link Date} of when this article was published. + */ /** * Created by IntelliJ IDEA. * User: robbie @@ -30,14 +30,14 @@ import java.util.Date * Time: 2:50 PM */ abstract class PublishDateExtractor extends Extractor[Date] { - /** - * Intended to search the DOM and identify the {@link Date} of when this article was published. - * <p>This will be called by the {@link com.jimplush.goose.ContentExtractor#extractContent(String)} method and will be passed to {@link com.jimplush.goose.Article#setPublishDate(java.util.Date)}</p> - * - * @param rootElement passed in from the {@link com.jimplush.goose.ContentExtractor} after the article has been parsed - * @return {@link Date} of when this particular article was published or <code>null</code> if no date could be found. - */ - def extract(rootElement: Element): Date + /** + * Intended to search the DOM and identify the {@link Date} of when this article was published. + * <p>This will be called by the {@link com.jimplush.goose.ContentExtractor#extractContent(String)} method and will be passed to {@link com.jimplush.goose.Article#setPublishDate(java.util.Date)}</p> + * + * @param rootElement passed in from the { @link com.jimplush.goose.ContentExtractor} after the article has been parsed + * @return { @link Date} of when this particular article was published or <code>null</code> if no date could be found. + */ + def extract(rootElement: Element): Date } diff --git a/src/main/scala/com/gravity/goose/extractors/StandardContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/StandardContentExtractor.scala index f14105675..64d74aaf0 100644 --- a/src/main/scala/com/gravity/goose/extractors/StandardContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/StandardContentExtractor.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/main/scala/com/gravity/goose/extractors/TagsEvaluator.scala b/src/main/scala/com/gravity/goose/extractors/TagsEvaluator.scala index 604930232..a696bca69 100644 --- a/src/main/scala/com/gravity/goose/extractors/TagsEvaluator.scala +++ b/src/main/scala/com/gravity/goose/extractors/TagsEvaluator.scala @@ -10,9 +10,9 @@ import org.jsoup.nodes.Element */ class TagsEvaluator(tags: scala.collection.Set[String]) extends Evaluator { - def matches(root: Element, element: Element) = tags.contains(element.tagName()) + def matches(root: Element, element: Element) = tags.contains(element.tagName()) } object TagsEvaluator { - def apply(tags: String*): TagsEvaluator = new TagsEvaluator(tags.toSet) + def apply(tags: String*): TagsEvaluator = new TagsEvaluator(tags.toSet) } diff --git a/src/main/scala/com/gravity/goose/images/Image.scala b/src/main/scala/com/gravity/goose/images/Image.scala index 0b2d425e5..a886f077d 100644 --- a/src/main/scala/com/gravity/goose/images/Image.scala +++ b/src/main/scala/com/gravity/goose/images/Image.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -28,44 +28,44 @@ import org.jsoup.nodes.Element class Image { - /** - * holds the Element node of the image we think is top dog - */ - var topImageNode: Element = null + /** + * holds the Element node of the image we think is top dog + */ + var topImageNode: Element = null - /** - * holds the src of the image - */ - var imageSrc: String = ""; + /** + * holds the src of the image + */ + var imageSrc: String = ""; - /** - * how confident are we in this image extraction? the most images generally the less confident - */ - var confidenceScore: Double = 0.0; + /** + * how confident are we in this image extraction? the most images generally the less confident + */ + var confidenceScore: Double = 0.0; - /** - * Height of the image in pixels - */ - var height: Int = 0 + /** + * Height of the image in pixels + */ + var height: Int = 0 - /** - * width of the image in pixels - */ - var width: Int = 0 + /** + * width of the image in pixels + */ + var width: Int = 0 - /** - * what kind of image extraction was used for this? bestGuess, linkTag, openGraph tags? - */ - var imageExtractionType: String = "NA"; + /** + * what kind of image extraction was used for this? bestGuess, linkTag, openGraph tags? + */ + var imageExtractionType: String = "NA"; - /** - * stores how many bytes this image is. - */ - var bytes: Long = 0; + /** + * stores how many bytes this image is. + */ + var bytes: Long = 0; - def getImageSrc = { - imageSrc - } + def getImageSrc = { + imageSrc + } } \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/images/ImageDetails.scala b/src/main/scala/com/gravity/goose/images/ImageDetails.scala index 8fa0cbb3b..ac678c620 100644 --- a/src/main/scala/com/gravity/goose/images/ImageDetails.scala +++ b/src/main/scala/com/gravity/goose/images/ImageDetails.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -24,45 +24,45 @@ package com.gravity.goose.images */ /** -* holds the details of the result of inspecting an image -* @author Jim Plush -* -*/ + * holds the details of the result of inspecting an image + * @author Jim Plush + * + */ class ImageDetails { - def getWidth: Int = { - return width - } + def getWidth: Int = { + return width + } - def setWidth(width: Int): Unit = { - this.width = width - } + def setWidth(width: Int): Unit = { + this.width = width + } - def getHeight: Int = { - return height - } + def getHeight: Int = { + return height + } - def setHeight(height: Int): Unit = { - this.height = height - } + def setHeight(height: Int): Unit = { + this.height = height + } - def getMimeType: String = { - return mimeType - } + def getMimeType: String = { + return mimeType + } - def setMimeType(mimeType: String): Unit = { - this.mimeType = mimeType - } + def setMimeType(mimeType: String): Unit = { + this.mimeType = mimeType + } - /** - * the width of the image - */ - private var width: Int = 0 - /** - * height of the image - */ - private var height: Int = 0 - /** - * the mimeType of the image JPEG / PNG - */ - private var mimeType: String = null + /** + * the width of the image + */ + private var width: Int = 0 + /** + * height of the image + */ + private var height: Int = 0 + /** + * the mimeType of the image JPEG / PNG + */ + private var mimeType: String = null } \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/images/ImageExtractor.scala b/src/main/scala/com/gravity/goose/images/ImageExtractor.scala index c73c8a4e0..9bb32498a 100644 --- a/src/main/scala/com/gravity/goose/images/ImageExtractor.scala +++ b/src/main/scala/com/gravity/goose/images/ImageExtractor.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -21,64 +21,64 @@ import org.jsoup.nodes.{Element, Document} import com.gravity.goose.utils.{Logging, CanLog} /** -* Created by Jim Plush -* User: jim -* Date: 8/18/11 -*/ + * Created by Jim Plush + * User: jim + * Date: 8/18/11 + */ // represents a file stored on disk that we've downloaded case class LocallyStoredImage(imgSrc: String, localFileName: String, linkhash: String, bytes: Long, fileExtension: String = "", height: Int = 0, width: Int = 0) trait ImageExtractor extends CanLog { - def getBestImage(doc: Document, topNode: Element): Image + def getBestImage(doc: Document, topNode: Element): Image - def logPrefix: String = ImageExtractor.loggingPrefix + def logPrefix: String = ImageExtractor.loggingPrefix - def critical(msg: String, refs: Any*) { - ImageExtractor.critical(msg, refs: _*) - } + def critical(msg: String, refs: Any*) { + ImageExtractor.critical(msg, refs: _*) + } - def critical(t: Throwable, msg: String, refs: Any*) { - ImageExtractor.critical(t, msg, refs: _*) - } + def critical(t: Throwable, msg: String, refs: Any*) { + ImageExtractor.critical(t, msg, refs: _*) + } - def debug(msg: String, refs: Any*) { - ImageExtractor.debug(msg, refs: _*) - } + def debug(msg: String, refs: Any*) { + ImageExtractor.debug(msg, refs: _*) + } - def debug(t: Throwable, msg: String, refs: Any*) { - ImageExtractor.debug(t, msg, refs: _*) - } + def debug(t: Throwable, msg: String, refs: Any*) { + ImageExtractor.debug(t, msg, refs: _*) + } - def info(msg: String, refs: Any*) { - ImageExtractor.info(msg, refs: _*) - } + def info(msg: String, refs: Any*) { + ImageExtractor.info(msg, refs: _*) + } - def info(t: Throwable, msg: String, refs: Any*) { - ImageExtractor.info(t, msg, refs: _*) - } + def info(t: Throwable, msg: String, refs: Any*) { + ImageExtractor.info(t, msg, refs: _*) + } - def logger = ImageExtractor.logger + def logger = ImageExtractor.logger - def trace(msg: String, refs: Any*) { - ImageExtractor.trace(msg, refs: _*) - } + def trace(msg: String, refs: Any*) { + ImageExtractor.trace(msg, refs: _*) + } - def trace(t: Throwable, msg: String, refs: Any*) { - ImageExtractor.trace(t, msg, refs: _*) - } + def trace(t: Throwable, msg: String, refs: Any*) { + ImageExtractor.trace(t, msg, refs: _*) + } - def warn(msg: String, refs: Any*) { - ImageExtractor.warn(msg, refs: _*) - } + def warn(msg: String, refs: Any*) { + ImageExtractor.warn(msg, refs: _*) + } - def warn(t: Throwable, msg: String, refs: Any*) { - ImageExtractor.warn(t, msg, refs: _*) - } + def warn(t: Throwable, msg: String, refs: Any*) { + ImageExtractor.warn(t, msg, refs: _*) + } } object ImageExtractor extends Logging { - val loggingPrefix = "images: " + val loggingPrefix = "images: " } diff --git a/src/main/scala/com/gravity/goose/images/ImageSaver.scala b/src/main/scala/com/gravity/goose/images/ImageSaver.scala index bb1c80a4e..8621a0de0 100644 --- a/src/main/scala/com/gravity/goose/images/ImageSaver.scala +++ b/src/main/scala/com/gravity/goose/images/ImageSaver.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -40,173 +40,174 @@ import com.gravity.goose.Configuration import com.gravity.goose.network.HtmlFetcher /** -* This class will be responsible for storing images to disk -* -* @author Jim Plush -*/ + * This class will be responsible for storing images to disk + * + * @author Jim Plush + */ object ImageSaver extends Logging { - private def getFileExtension(config: Configuration, fileName: String): String = { - var fileExtension: String = "" - var mimeType: String = null - try { - val imageDims: ImageDetails = ImageUtils.getImageDimensions(config.imagemagickIdentifyPath, fileName) - mimeType = imageDims.getMimeType - if (mimeType == "GIF") { - if (logger.isDebugEnabled) { - logger.debug("SNEAKY GIF! " + fileName) + private def getFileExtension(config: Configuration, fileName: String): String = { + var fileExtension: String = "" + var mimeType: String = null + try { + val imageDims: ImageDetails = ImageUtils.getImageDimensions(config.imagemagickIdentifyPath, fileName) + mimeType = imageDims.getMimeType + if (mimeType == "GIF") { + if (logger.isDebugEnabled) { + logger.debug("SNEAKY GIF! " + fileName) + } + throw new SecretGifException + } + if (mimeType == "JPEG") { + fileExtension = ".jpg" + } + else if (mimeType == "PNG") { + fileExtension = ".png" + } + else { + throw new IOException("BAD MIME TYPE: " + mimeType + " FILENAME:" + fileName) + } } - throw new SecretGifException - } - if (mimeType == "JPEG") { - fileExtension = ".jpg" - } - else if (mimeType == "PNG") { - fileExtension = ".png" - } - else { - throw new IOException("BAD MIME TYPE: " + mimeType + " FILENAME:" + fileName) - } - } - catch { - case e: SecretGifException => { - throw e - } - case e: FileNotFoundException => { - logger.error(e.getMessage) - } - case e: IOException => { - logger.error(e.getMessage) - throw e - } - } - finally { - } - fileExtension - } - - def fetchEntity(httpClient: HttpClient, imageSrc: String): Option[HttpEntity] = { - - val localContext: HttpContext = new BasicHttpContext - localContext.setAttribute(ClientContext.COOKIE_STORE, HtmlFetcher.emptyCookieStore) - val httpget = new HttpGet(imageSrc) - val response = httpClient.execute(httpget, localContext) - val respStatus: String = response.getStatusLine.toString - if (!respStatus.contains("200")) { - None - } else { - try { - Some(response.getEntity) - } catch { - case e: Exception => warn(e, e.toString); None - } finally { - httpget.abort() - } - } - } - - - def copyInputStreamToLocalImage(entity: HttpEntity, linkhash: String, config: Configuration): String = { - val generator: Random = new Random - val randInt: Int = generator.nextInt - val localSrcPath = config.localStoragePath + "/" + linkhash + "_" + randInt - val instream: InputStream = entity.getContent - val outstream: OutputStream = new FileOutputStream(localSrcPath) - try { - trace("Storing image locally: " + localSrcPath) - IOUtils.copy(instream, outstream) - val fileExtension = ImageSaver.getFileExtension(config, localSrcPath) - if (fileExtension == "" || fileExtension == null) { - trace("EMPTY FILE EXTENSION: " + localSrcPath) - return null - } - val f: File = new File(localSrcPath) - if (f.length < config.minBytesForImages) { - if (logger.isDebugEnabled) { - logger.debug("TOO SMALL AN IMAGE: " + localSrcPath + " bytes: " + f.length) + catch { + case e: SecretGifException => { + throw e + } + case e: FileNotFoundException => { + logger.error(e.getMessage) + } + case e: IOException => { + logger.error(e.getMessage) + throw e + } } - return null - } - val newFilename = localSrcPath + fileExtension - val newFile: File = new File(newFilename) - f.renameTo(newFile) - // localSrcPath = localSrcPath + fileExtension - trace("Image successfully Written to Disk") - newFilename - } - catch { - case e: Exception => { - throw e - } - } - finally { - // entity.consumeContent - instream.close() - outstream.close() + finally { + } + fileExtension } - } - - /** - * stores an image to disk and returns the path where the file was written - * - * @param imageSrc - * @return - */ - def storeTempImage(httpClient: HttpClient, linkhash: String, imageSrcMaster: String, config: Configuration): String = { - var imageSrc = imageSrcMaster + def fetchEntity(httpClient: HttpClient, imageSrc: String): Option[HttpEntity] = { - try { - imageSrc = imageSrc.replace(" ", "%20") - trace("Starting to download image: " + imageSrc) + val localContext: HttpContext = new BasicHttpContext + localContext.setAttribute(ClientContext.COOKIE_STORE, HtmlFetcher.emptyCookieStore) + val httpget = new HttpGet(imageSrc) + val response = httpClient.execute(httpget, localContext) + val respStatus: String = response.getStatusLine.toString + if (!respStatus.contains("200")) { + None + } else { + try { + Some(response.getEntity) + } catch { + case e: Exception => warn(e, e.toString); None + } finally { + httpget.abort() + } + } + } - fetchEntity(httpClient, imageSrc) match { - case Some(entity) => { - try { - return copyInputStreamToLocalImage(entity, linkhash, config) + def copyInputStreamToLocalImage(entity: HttpEntity, linkhash: String, config: Configuration): String = { + val generator: Random = new Random + val randInt: Int = generator.nextInt + val localSrcPath = config.localStoragePath + "/" + linkhash + "_" + randInt + val instream: InputStream = entity.getContent + val outstream: OutputStream = new FileOutputStream(localSrcPath) + try { + trace("Storing image locally: " + localSrcPath) + IOUtils.copy(instream, outstream) + val fileExtension = ImageSaver.getFileExtension(config, localSrcPath) + if (fileExtension == "" || fileExtension == null) { + trace("EMPTY FILE EXTENSION: " + localSrcPath) + return null } - catch { - case e: SecretGifException => { + val f: File = new File(localSrcPath) + if (f.length < config.minBytesForImages) { + if (logger.isDebugEnabled) { + logger.debug("TOO SMALL AN IMAGE: " + localSrcPath + " bytes: " + f.length) + } + return null + } + val newFilename = localSrcPath + fileExtension + val newFile: File = new File(newFilename) + f.renameTo(newFile) + // localSrcPath = localSrcPath + fileExtension + trace("Image successfully Written to Disk") + newFilename + } + catch { + case e: Exception => { throw e - } - case e: Exception => { - logger.error(e.getMessage); null - } + } + } + finally { + // entity.consumeContent + instream.close() + outstream.close() + } + } + + /** + * stores an image to disk and returns the path where the file was written + * + * @param imageSrc + * @return + */ + def storeTempImage(httpClient: HttpClient, linkhash: String, imageSrcMaster: String, config: Configuration): String = { + var imageSrc = imageSrcMaster + + + try { + imageSrc = imageSrc.replace(" ", "%20") + trace("Starting to download image: " + imageSrc) + + fetchEntity(httpClient, imageSrc) match { + case Some(entity) => { + + try { + return copyInputStreamToLocalImage(entity, linkhash, config) + } + catch { + case e: SecretGifException => { + throw e + } + case e: Exception => { + logger.error(e.getMessage); + null + } + } + + } + case None => trace("Unable to get entity for: " + imageSrc); null } } - case None => trace("Unable to get entity for: " + imageSrc); null - } + catch { + case e: IllegalArgumentException => { + logger.warn(e.getMessage) + } + case e: SecretGifException => { + raise(e) + } + case e: ClientProtocolException => { + logger.error(e.toString) + } + case e: IOException => { + logger.error(e.toString) + } + case e: Exception => { + e.printStackTrace() + logger.error(e.toString) + e.printStackTrace() + } + } + finally { - } - catch { - case e: IllegalArgumentException => { - logger.warn(e.getMessage) - } - case e: SecretGifException => { - raise(e) - } - case e: ClientProtocolException => { - logger.error(e.toString) - } - case e: IOException => { - logger.error(e.toString) - } - case e: Exception => { - e.printStackTrace() - logger.error(e.toString) - e.printStackTrace() - } - } - finally { + } + null } - null - } - - private def raise(e: SecretGifException): Unit = { - } + private def raise(e: SecretGifException): Unit = { + } } diff --git a/src/main/scala/com/gravity/goose/images/ImageUtils.scala b/src/main/scala/com/gravity/goose/images/ImageUtils.scala index 22adf2915..af2c7805e 100644 --- a/src/main/scala/com/gravity/goose/images/ImageUtils.scala +++ b/src/main/scala/com/gravity/goose/images/ImageUtils.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -41,254 +41,254 @@ import org.apache.commons.io.IOUtils import com.gravity.goose.network.{ImageFetchException, HtmlFetcher} object ImageUtils extends Logging { - /** - * User: Jim Plush - * gets the image dimensions for an image file, pass in the path to the image who's dimensions you want to get - * this will use imageMagick since the Java IO and imaging shit SUCKS for getting mime types and file info for jpg and png files - * - * @param filePath - * @return - */ - def getImageDimensions(identifyProgram: String, filePath: String): ImageDetails = { - val command: ArrayList[String] = new ArrayList[String](10) - command.add(identifyProgram) - command.add(filePath) - val imageInfo: String = execToString(command.toArray(new Array[String](1)).asInstanceOf[Array[String]]) - val imageDetails: ImageDetails = new ImageDetails - if (imageInfo == null || imageInfo.contains("no decode delegate for this image format")) { - throw new IOException("Unable to get Image Information (no decode delegate) for: " + filePath) - } - try { - val infoParts: Array[String] = imageInfo.split(" ") - imageDetails.setMimeType(infoParts(1)) - val dimensions: Array[String] = infoParts(2).split("x") - imageDetails.setWidth(Integer.parseInt(dimensions(0))) - imageDetails.setHeight(Integer.parseInt(dimensions(1))) - imageDetails - } - catch { - case e: NullPointerException => { - throw new IOException("Unable to get Image Information for: " + filePath) - } + /** + * User: Jim Plush + * gets the image dimensions for an image file, pass in the path to the image who's dimensions you want to get + * this will use imageMagick since the Java IO and imaging shit SUCKS for getting mime types and file info for jpg and png files + * + * @param filePath + * @return + */ + def getImageDimensions(identifyProgram: String, filePath: String): ImageDetails = { + val command: ArrayList[String] = new ArrayList[String](10) + command.add(identifyProgram) + command.add(filePath) + val imageInfo: String = execToString(command.toArray(new Array[String](1)).asInstanceOf[Array[String]]) + val imageDetails: ImageDetails = new ImageDetails + if (imageInfo == null || imageInfo.contains("no decode delegate for this image format")) { + throw new IOException("Unable to get Image Information (no decode delegate) for: " + filePath) + } + try { + val infoParts: Array[String] = imageInfo.split(" ") + imageDetails.setMimeType(infoParts(1)) + val dimensions: Array[String] = infoParts(2).split("x") + imageDetails.setWidth(Integer.parseInt(dimensions(0))) + imageDetails.setHeight(Integer.parseInt(dimensions(1))) + imageDetails + } + catch { + case e: NullPointerException => { + throw new IOException("Unable to get Image Information for: " + filePath) + } + } } - } - /** - * gets the image dimensions for an image file, pass in the path to the image who's dimensions you want to get, uses the built in java commands - * - * @param filePath - * @return - */ - def getImageDimensionsJava(filePath: String): HashMap[String, Integer] = { - var image: BufferedImage = null - try { - val f: File = new File(filePath) - image = ImageIO.read(f) - val results: HashMap[String, Integer] = new HashMap[String, Integer] - results.put("height", image.getHeight) - results.put("width", image.getWidth) - results - } - catch { - case e: CMMException => { - logger.error("ERROR READING FILE: " + filePath + " \n", e) - throw new IOException("Unable to read file: " + filePath) - } - } - finally { - if (image != null) { + /** + * gets the image dimensions for an image file, pass in the path to the image who's dimensions you want to get, uses the built in java commands + * + * @param filePath + * @return + */ + def getImageDimensionsJava(filePath: String): HashMap[String, Integer] = { + var image: BufferedImage = null try { - image.flush + val f: File = new File(filePath) + image = ImageIO.read(f) + val results: HashMap[String, Integer] = new HashMap[String, Integer] + results.put("height", image.getHeight) + results.put("width", image.getWidth) + results } catch { - case e: Exception => { - } + case e: CMMException => { + logger.error("ERROR READING FILE: " + filePath + " \n", e) + throw new IOException("Unable to read file: " + filePath) + } + } + finally { + if (image != null) { + try { + image.flush + } + catch { + case e: Exception => { + } + } + } } - } } - } - /** - * Tries to exec the command, waits for it to finish, logs errors if exit - * status is nonzero, and returns true if exit status is 0 (success). - * - * @param command Description of the Parameter - * @return Description of the Return Value - */ - private def execToString(command: Array[String]): String = { - var p: Process = null - var in: BufferedReader = null - try { - p = Runtime.getRuntime.exec(command) - in = new BufferedReader(new InputStreamReader(p.getInputStream)) - var line: String = null - line = in.readLine - p.waitFor - return line - } - catch { - case e: IOException => { - logger.error(e.toString, e) - } - case e: InterruptedException => { - logger.error(e.toString, e) - throw new RuntimeException(e) - } - } - finally { - if (in != null) { + /** + * Tries to exec the command, waits for it to finish, logs errors if exit + * status is nonzero, and returns true if exit status is 0 (success). + * + * @param command Description of the Parameter + * @return Description of the Return Value + */ + private def execToString(command: Array[String]): String = { + var p: Process = null + var in: BufferedReader = null try { - in.close() + p = Runtime.getRuntime.exec(command) + in = new BufferedReader(new InputStreamReader(p.getInputStream)) + var line: String = null + line = in.readLine + p.waitFor + return line } catch { - case e: IOException => { - } + case e: IOException => { + logger.error(e.toString, e) + } + case e: InterruptedException => { + logger.error(e.toString, e) + throw new RuntimeException(e) + } } - } - if (p != null) { - p.destroy() - } + finally { + if (in != null) { + try { + in.close() + } + catch { + case e: IOException => { + } + } + } + if (p != null) { + p.destroy() + } + } + null } - null - } - /** - * Writes an image src http string to disk as a temporary file and returns the LocallyStoredImage object that has the info you should need - * on the image - */ - def storeImageToLocalFile(httpClient: HttpClient, linkhash: String, imageSrc: String, config: Configuration): Option[LocallyStoredImage] = { + /** + * Writes an image src http string to disk as a temporary file and returns the LocallyStoredImage object that has the info you should need + * on the image + */ + def storeImageToLocalFile(httpClient: HttpClient, linkhash: String, imageSrc: String, config: Configuration): Option[LocallyStoredImage] = { - try { - // check for a cache hit already on disk - readExistingFileInfo(linkhash, imageSrc, config) match { - case Some(locallyStoredImage) => { - trace("Image already cached on disk: " + imageSrc) - return Some(locallyStoredImage) - } - case None => - } + try { + // check for a cache hit already on disk + readExistingFileInfo(linkhash, imageSrc, config) match { + case Some(locallyStoredImage) => { + trace("Image already cached on disk: " + imageSrc) + return Some(locallyStoredImage) + } + case None => + } - trace("Not found locally...starting to download image: " + imageSrc) - fetchEntity(httpClient, imageSrc) match { - case Some(entity) => { - trace("Got entity for %s".format(imageSrc)) - writeEntityContentsToDisk(entity, linkhash, imageSrc, config) match { - case Some(locallyStoredImage) => trace("Img Write successfull to disk"); Some(locallyStoredImage) - case None => trace("Unable to write contents to disk: %s".format(imageSrc)); None - } + trace("Not found locally...starting to download image: " + imageSrc) + fetchEntity(httpClient, imageSrc) match { + case Some(entity) => { + trace("Got entity for %s".format(imageSrc)) + writeEntityContentsToDisk(entity, linkhash, imageSrc, config) match { + case Some(locallyStoredImage) => trace("Img Write successfull to disk"); Some(locallyStoredImage) + case None => trace("Unable to write contents to disk: %s".format(imageSrc)); None + } + } + case None => trace("Unable to fetch entity for: " + imageSrc); None + } + } catch { + case e: Exception => { + info(e, e.toString) + None + } } - case None => trace("Unable to fetch entity for: " + imageSrc); None - } - } catch { - case e: Exception => { - info(e, e.toString) - None - } - } - } - - /** - * returns what filename we think this file should be, lots of time you get sneaky gifs that pretend to be jpg's - * or even have .jpg extensions, so we use ImageMagick to tell us the truth - */ - private def getFileExtensionName(imageDetails: ImageDetails) = { - val mimeType = imageDetails.getMimeType.toLowerCase match { - case "png" => ".png" - case "jpg" => ".jpg" - case "jpeg" => ".jpg" - case ".gif" => ".gif" - case _ => "NA" } - mimeType - } - def readExistingFileInfo(linkhash: String, imageSrc: String, config: Configuration): Option[LocallyStoredImage] = { - val localImageName = getLocalFileName(linkhash, imageSrc, config) - val imageFile = new File(localImageName) - if (imageFile.exists()) { - try { - trace("Reading image from disk: %s".format(localImageName)) - val imageDetails = getImageDimensions(config.imagemagickIdentifyPath, localImageName) - val fileExtension = getFileExtensionName(imageDetails) - Some(LocallyStoredImage(imageSrc, localImageName, linkhash, imageFile.length(), fileExtension, imageDetails.getHeight, imageDetails.getWidth)) - } catch { - case e: Exception => None - } - } else { - None + /** + * returns what filename we think this file should be, lots of time you get sneaky gifs that pretend to be jpg's + * or even have .jpg extensions, so we use ImageMagick to tell us the truth + */ + private def getFileExtensionName(imageDetails: ImageDetails) = { + val mimeType = imageDetails.getMimeType.toLowerCase match { + case "png" => ".png" + case "jpg" => ".jpg" + case "jpeg" => ".jpg" + case ".gif" => ".gif" + case _ => "NA" + } + mimeType } - } - - def writeEntityContentsToDisk(entity: HttpEntity, linkhash: String, imageSrc: String, config: Configuration): Option[LocallyStoredImage] = { + def readExistingFileInfo(linkhash: String, imageSrc: String, config: Configuration): Option[LocallyStoredImage] = { + val localImageName = getLocalFileName(linkhash, imageSrc, config) + val imageFile = new File(localImageName) + if (imageFile.exists()) { + try { + trace("Reading image from disk: %s".format(localImageName)) + val imageDetails = getImageDimensions(config.imagemagickIdentifyPath, localImageName) + val fileExtension = getFileExtensionName(imageDetails) + Some(LocallyStoredImage(imageSrc, localImageName, linkhash, imageFile.length(), fileExtension, imageDetails.getHeight, imageDetails.getWidth)) + } catch { + case e: Exception => None + } + } else { + None + } - val localSrcPath = getLocalFileName(linkhash, imageSrc, config) - val outstream: OutputStream = new FileOutputStream(localSrcPath) - val instream: InputStream = entity.getContent - trace("Content Length: " + entity.getContentLength) - try { - val fileCopyBytes = IOUtils.copy(instream, outstream) - trace("%d bytes copied to disk".format(fileCopyBytes)) - } catch { - case e: Exception => info(e, e.toString) - } finally { - try { - outstream.flush() - outstream.close() - instream.close() - } catch { - case e: Exception => info(e, e.toString) - } } - // entity.writeTo(outstream) - EntityUtils.consume(entity) - trace("Content Length: " + entity.getContentLength) - readExistingFileInfo(linkhash, imageSrc, config) - } + def writeEntityContentsToDisk(entity: HttpEntity, linkhash: String, imageSrc: String, config: Configuration): Option[LocallyStoredImage] = { - def getLocalFileName(linkhash: String, imageSrc: String, config: Configuration) = { - val imageHash = HashUtils.md5(imageSrc) - config.localStoragePath + "/" + linkhash + "_" + imageHash - } + val localSrcPath = getLocalFileName(linkhash, imageSrc, config) + val outstream: OutputStream = new FileOutputStream(localSrcPath) + val instream: InputStream = entity.getContent + trace("Content Length: " + entity.getContentLength) + try { + val fileCopyBytes = IOUtils.copy(instream, outstream) + trace("%d bytes copied to disk".format(fileCopyBytes)) + } catch { + case e: Exception => info(e, e.toString) + } finally { + try { + outstream.flush() + outstream.close() + instream.close() + } catch { + case e: Exception => info(e, e.toString) + } + } + // entity.writeTo(outstream) + EntityUtils.consume(entity) + trace("Content Length: " + entity.getContentLength) + readExistingFileInfo(linkhash, imageSrc, config) + } - def cleanImageSrcString(imgSrc: String): String = { - imgSrc.replace(" ", "%20") - } + def getLocalFileName(linkhash: String, imageSrc: String, config: Configuration) = { + val imageHash = HashUtils.md5(imageSrc) + config.localStoragePath + "/" + linkhash + "_" + imageHash + } - def fetchEntity(httpClient: HttpClient, imageSrc: String): Option[HttpEntity] = { - val localContext: HttpContext = new BasicHttpContext - localContext.setAttribute(ClientContext.COOKIE_STORE, HtmlFetcher.emptyCookieStore) - val httpget = new HttpGet(imageSrc) - val response = try { - HtmlFetcher.getHttpClient.execute(httpget, localContext) - } - catch { - case ex: Exception => throw new ImageFetchException(imageSrc, ex) + def cleanImageSrcString(imgSrc: String): String = { + imgSrc.replace(" ", "%20") } - val respStatus = response.getStatusLine.getStatusCode + def fetchEntity(httpClient: HttpClient, imageSrc: String): Option[HttpEntity] = { + + val localContext: HttpContext = new BasicHttpContext + localContext.setAttribute(ClientContext.COOKIE_STORE, HtmlFetcher.emptyCookieStore) + val httpget = new HttpGet(imageSrc) + val response = try { + HtmlFetcher.getHttpClient.execute(httpget, localContext) + } + catch { + case ex: Exception => throw new ImageFetchException(imageSrc, ex) + } + + val respStatus = response.getStatusLine.getStatusCode - if (respStatus != 200) { - None - } else { - try { - val entity = response.getEntity - if (entity != null) { - Some(entity) + if (respStatus != 200) { + None } else { - None + try { + val entity = response.getEntity + if (entity != null) { + Some(entity) + } else { + None + } + } catch { + case e: Exception => warn(e, e.toString); httpget.abort(); None + } } - } catch { - case e: Exception => warn(e, e.toString); httpget.abort(); None - } } - } } diff --git a/src/main/scala/com/gravity/goose/images/SecretGifException.scala b/src/main/scala/com/gravity/goose/images/SecretGifException.scala index bd659b854..b53ee56df 100644 --- a/src/main/scala/com/gravity/goose/images/SecretGifException.scala +++ b/src/main/scala/com/gravity/goose/images/SecretGifException.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/main/scala/com/gravity/goose/images/StandardImageExtractor.scala b/src/main/scala/com/gravity/goose/images/StandardImageExtractor.scala index d19eeef58..629fa4744 100644 --- a/src/main/scala/com/gravity/goose/images/StandardImageExtractor.scala +++ b/src/main/scala/com/gravity/goose/images/StandardImageExtractor.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -35,635 +35,635 @@ import java.util.regex.{Pattern, Matcher} import org.apache.http.client.methods.HttpGet /** -* Created by Jim Plush -* User: jim -* Date: 8/18/11 -*/ + * Created by Jim Plush + * User: jim + * Date: 8/18/11 + */ case class DepthTraversal(node: Element, parentDepth: Int, siblingDepth: Int) /** -* This image extractor will attempt to find the best image nearest the article. -* Unfortunately this is a slow process since we're actually downloading the image itself -* to inspect it's actual height/width and area metrics since most of the time these aren't -* in the image tags themselves or can be falsified. -* We'll weight the images in descending order depending on how high up they are compared to the top node content -* -* //todo this is a straight java to scala conversion, need to add the nicities of scala, all these null checks make me dizzy -*/ + * This image extractor will attempt to find the best image nearest the article. + * Unfortunately this is a slow process since we're actually downloading the image itself + * to inspect it's actual height/width and area metrics since most of the time these aren't + * in the image tags themselves or can be falsified. + * We'll weight the images in descending order depending on how high up they are compared to the top node content + * + * //todo this is a straight java to scala conversion, need to add the nicities of scala, all these null checks make me dizzy + */ class StandardImageExtractor(httpClient: HttpClient, article: Article, config: Configuration) extends ImageExtractor { - /** - * holds the document that we're extracting the image from - */ - private var doc: Document = null - - /** - * What's the minimum bytes for an image we'd accept is - */ - private var minBytesForImages: Int = 0 - /** - * location to store temporary image files if need be - */ - private var tempStoragePath: String = null - - /** - * this lists all the known bad button names that we have - */ - var matchBadImageNames: Matcher = null - val NODE_ID_FORMAT: String = "tag: %s class: %s ID: %s" - val KNOWN_IMG_DOM_NAMES = "yn-story-related-media" :: "cnn_strylccimg300cntr" :: "big_photo" :: "ap-smallphoto-a" :: Nil - - var sb: StringBuilder = new StringBuilder - // create negative elements - sb.append(".html|.gif|.ico|button|twitter.jpg|facebook.jpg|ap_buy_photo|digg.jpg|digg.png|delicious.png|facebook.png|reddit.jpg|doubleclick|diggthis|diggThis|adserver|/ads/|ec.atdmt.com") - sb.append("|mediaplex.com|adsatt|view.atdmt") - matchBadImageNames = Pattern.compile(sb.toString()).matcher(string.empty) - - /** - * holds the result of our image extraction - */ - val image = new Image - /** - * the webpage url that we're extracting content from - */ - val targetUrl = article.finalUrl - /** - * stores a hash of our url for reference and image processing - */ - val linkhash = article.linkhash - - - override def getBestImage(doc: Document, topNode: Element): Image = { - this.doc = doc - if (logger.isDebugEnabled) { - logger.debug("Starting to Look for the Most Relavent Image") - } - if (image.getImageSrc == "") { - this.checkForKnownElements() - } - if (image.getImageSrc == "") { - this.checkForLargeImages(topNode, 0, 0) - } - if (image.getImageSrc == "") { - this.checkForMetaTag + /** + * holds the document that we're extracting the image from + */ + private var doc: Document = null + + /** + * What's the minimum bytes for an image we'd accept is + */ + private var minBytesForImages: Int = 0 + /** + * location to store temporary image files if need be + */ + private var tempStoragePath: String = null + + /** + * this lists all the known bad button names that we have + */ + var matchBadImageNames: Matcher = null + val NODE_ID_FORMAT: String = "tag: %s class: %s ID: %s" + val KNOWN_IMG_DOM_NAMES = "yn-story-related-media" :: "cnn_strylccimg300cntr" :: "big_photo" :: "ap-smallphoto-a" :: Nil + + var sb: StringBuilder = new StringBuilder + // create negative elements + sb.append(".html|.gif|.ico|button|twitter.jpg|facebook.jpg|ap_buy_photo|digg.jpg|digg.png|delicious.png|facebook.png|reddit.jpg|doubleclick|diggthis|diggThis|adserver|/ads/|ec.atdmt.com") + sb.append("|mediaplex.com|adsatt|view.atdmt") + matchBadImageNames = Pattern.compile(sb.toString()).matcher(string.empty) + + /** + * holds the result of our image extraction + */ + val image = new Image + /** + * the webpage url that we're extracting content from + */ + val targetUrl = article.finalUrl + /** + * stores a hash of our url for reference and image processing + */ + val linkhash = article.linkhash + + + override def getBestImage(doc: Document, topNode: Element): Image = { + this.doc = doc + if (logger.isDebugEnabled) { + logger.debug("Starting to Look for the Most Relavent Image") + } + if (image.getImageSrc == "") { + this.checkForKnownElements() + } + if (image.getImageSrc == "") { + this.checkForLargeImages(topNode, 0, 0) + } + if (image.getImageSrc == "") { + this.checkForMetaTag + } + image } - image - } - private def checkForMetaTag: Boolean = { - if (this.checkForLinkTag) { - return true - } - if (this.checkForOpenGraphTag) { - return true - } - if (logger.isDebugEnabled) { - logger.debug("unable to find meta image") - } - false - } - - /** - * checks to see if we were able to find open graph tags on this page - * - * @return - */ - private def checkForOpenGraphTag: Boolean = { - try { - val meta: Elements = doc.select("meta[property~=og:image]") - import scala.collection.JavaConversions._ - for (item <- meta) { - if (item.attr("content").length < 1) { - return false + private def checkForMetaTag: Boolean = { + if (this.checkForLinkTag) { + return true } - val imagePath: String = this.buildImagePath(item.attr("content")) - this.image.imageSrc = imagePath - this.image.imageExtractionType = "opengraph" - this.image.confidenceScore = 100 - this.image.bytes = this.getBytesForImage(imagePath) - trace(logPrefix + "open graph tag found, using it") - - return true - } - false - } - catch { - case e: Exception => { - e.printStackTrace() - return false - } + if (this.checkForOpenGraphTag) { + return true + } + if (logger.isDebugEnabled) { + logger.debug("unable to find meta image") + } + false } - } - - /** - * checks to see if we were able to find open graph tags on this page - * - * @return - */ - private def checkForLinkTag: Boolean = { - try { - val meta: Elements = doc.select("link[rel~=image_src]") - import scala.collection.JavaConversions._ - for (item <- meta) { - if (item.attr("href").length < 1) { - return false + + /** + * checks to see if we were able to find open graph tags on this page + * + * @return + */ + private def checkForOpenGraphTag: Boolean = { + try { + val meta: Elements = doc.select("meta[property~=og:image]") + import scala.collection.JavaConversions._ + for (item <- meta) { + if (item.attr("content").length < 1) { + return false + } + val imagePath: String = this.buildImagePath(item.attr("content")) + this.image.imageSrc = imagePath + this.image.imageExtractionType = "opengraph" + this.image.confidenceScore = 100 + this.image.bytes = this.getBytesForImage(imagePath) + trace(logPrefix + "open graph tag found, using it") + + return true + } + false + } + catch { + case e: Exception => { + e.printStackTrace() + return false + } } - this.image.imageSrc = this.buildImagePath(item.attr("href")) - this.image.imageExtractionType = "linktag" - this.image.confidenceScore = 100 - this.image.bytes = getBytesForImage(buildImagePath(item.attr("href"))) - trace(logPrefix + "link tag found, using it") - - return true - } - false } - catch { - case e: Exception => { - logger.error(e.toString, e) - false - } + + /** + * checks to see if we were able to find open graph tags on this page + * + * @return + */ + private def checkForLinkTag: Boolean = { + try { + val meta: Elements = doc.select("link[rel~=image_src]") + import scala.collection.JavaConversions._ + for (item <- meta) { + if (item.attr("href").length < 1) { + return false + } + this.image.imageSrc = this.buildImagePath(item.attr("href")) + this.image.imageExtractionType = "linktag" + this.image.confidenceScore = 100 + this.image.bytes = getBytesForImage(buildImagePath(item.attr("href"))) + trace(logPrefix + "link tag found, using it") + + return true + } + false + } + catch { + case e: Exception => { + logger.error(e.toString, e) + false + } + } } - } - def getAllImages: ArrayList[Element] = { - null - } + def getAllImages: ArrayList[Element] = { + null + } - def getImagesFromNode(node: Element): Option[Elements] = { - val images: Elements = node.select("img") + def getImagesFromNode(node: Element): Option[Elements] = { + val images: Elements = node.select("img") - if (images == null || images.size < 1) { - None - } else { - Some(images) + if (images == null || images.size < 1) { + None + } else { + Some(images) + } } - } - def getImageCandidates(node: Element): Option[ArrayList[Element]] = { + def getImageCandidates(node: Element): Option[ArrayList[Element]] = { + + for { + n <- getNode(node) + images <- getImagesFromNode(node) + filteredImages <- filterBadNames(images) + goodImages <- findImagesThatPassByteSizeTest(filteredImages) + } { + return Some(goodImages) + } + None - for { - n <- getNode(node) - images <- getImagesFromNode(node) - filteredImages <- filterBadNames(images) - goodImages <- findImagesThatPassByteSizeTest(filteredImages) - } { - return Some(goodImages) } - None - - } - - def getDepthLevel(node: Element, parentDepth: Int, siblingDepth: Int): Option[DepthTraversal] = { - val MAX_PARENT_DEPTH = 2 - if (parentDepth > MAX_PARENT_DEPTH) { - trace(logPrefix + "ParentDepth is greater than %d, aborting depth traversal".format(MAX_PARENT_DEPTH)) - None - } else { - try { - val siblingNode = node.previousElementSibling() - if (siblingNode == null) throw new NullPointerException - Some(DepthTraversal(siblingNode, parentDepth, siblingDepth + 1)) - } catch { - case e: NullPointerException => { - if (node != null) { - Some(DepthTraversal(node.parent, parentDepth + 1, 0)) - } else { + + def getDepthLevel(node: Element, parentDepth: Int, siblingDepth: Int): Option[DepthTraversal] = { + val MAX_PARENT_DEPTH = 2 + if (parentDepth > MAX_PARENT_DEPTH) { + trace(logPrefix + "ParentDepth is greater than %d, aborting depth traversal".format(MAX_PARENT_DEPTH)) None - } + } else { + try { + val siblingNode = node.previousElementSibling() + if (siblingNode == null) throw new NullPointerException + Some(DepthTraversal(siblingNode, parentDepth, siblingDepth + 1)) + } catch { + case e: NullPointerException => { + if (node != null) { + Some(DepthTraversal(node.parent, parentDepth + 1, 0)) + } else { + None + } + } + } } - } } - } - - /** - * although slow the best way to determine the best image is to download them and check the actual dimensions of the image when on disk - * so we'll go through a phased approach... - * 1. get a list of ALL images from the parent node - * 2. filter out any bad image names that we know of (gifs, ads, etc..) - * 3. do a head request on each file to make sure it meets our bare requirements - * 4. any images left over let's do a full GET request, download em to disk and check their dimensions - * 5. Score images based on different factors like height/width and possibly things like color density - * - * @param node - */ - private def checkForLargeImages(node: Element, parentDepthLevel: Int, siblingDepthLevel: Int) { - trace(logPrefix + "Checking for large images - parent depth %d sibling depth: %d".format(parentDepthLevel, siblingDepthLevel)) - - - getImageCandidates(node) match { - case Some(goodImages) => { - trace(logPrefix + "checkForLargeImages: After findImagesThatPassByteSizeTest we have: " + goodImages.size + " at parent depth: " + parentDepthLevel) - val scoredImages = downloadImagesAndGetResults(goodImages, parentDepthLevel) - var highScoreImage: Element = null - scoredImages.foreach { - case (key, value) => { - if (highScoreImage == null) { - highScoreImage = key - } else { - if (value > scoredImages.get(highScoreImage).get) { - highScoreImage = key - } + + /** + * although slow the best way to determine the best image is to download them and check the actual dimensions of the image when on disk + * so we'll go through a phased approach... + * 1. get a list of ALL images from the parent node + * 2. filter out any bad image names that we know of (gifs, ads, etc..) + * 3. do a head request on each file to make sure it meets our bare requirements + * 4. any images left over let's do a full GET request, download em to disk and check their dimensions + * 5. Score images based on different factors like height/width and possibly things like color density + * + * @param node + */ + private def checkForLargeImages(node: Element, parentDepthLevel: Int, siblingDepthLevel: Int) { + trace(logPrefix + "Checking for large images - parent depth %d sibling depth: %d".format(parentDepthLevel, siblingDepthLevel)) + + + getImageCandidates(node) match { + case Some(goodImages) => { + trace(logPrefix + "checkForLargeImages: After findImagesThatPassByteSizeTest we have: " + goodImages.size + " at parent depth: " + parentDepthLevel) + val scoredImages = downloadImagesAndGetResults(goodImages, parentDepthLevel) + var highScoreImage: Element = null + scoredImages.foreach { + case (key, value) => { + if (highScoreImage == null) { + highScoreImage = key + } else { + if (value > scoredImages.get(highScoreImage).get) { + highScoreImage = key + } + } + } + } + + if (highScoreImage != null) { + val f: File = new File(highScoreImage.attr("tempImagePath")) + this.image.topImageNode = highScoreImage + this.image.imageSrc = buildImagePath(highScoreImage.attr("src")) + this.image.imageExtractionType = "bigimage" + this.image.bytes = f.length.asInstanceOf[Int] + if (scoredImages.size > 0) { + this.image.confidenceScore = (100 / scoredImages.size) + } + else { + this.image.confidenceScore = 0 + } + trace(logPrefix + "High Score Image is: " + buildImagePath(highScoreImage.attr("src"))) + } else { + getDepthLevel(node, parentDepthLevel, siblingDepthLevel) match { + case Some(depthObj) => { + checkForLargeImages(depthObj.node, depthObj.parentDepth, depthObj.siblingDepth) + } + case None => trace("Image iteration is over!") + } + } } - } - } + case None => { - if (highScoreImage != null) { - val f: File = new File(highScoreImage.attr("tempImagePath")) - this.image.topImageNode = highScoreImage - this.image.imageSrc = buildImagePath(highScoreImage.attr("src")) - this.image.imageExtractionType = "bigimage" - this.image.bytes = f.length.asInstanceOf[Int] - if (scoredImages.size > 0) { - this.image.confidenceScore = (100 / scoredImages.size) - } - else { - this.image.confidenceScore = 0 - } - trace(logPrefix + "High Score Image is: " + buildImagePath(highScoreImage.attr("src"))) - } else { - getDepthLevel(node, parentDepthLevel, siblingDepthLevel) match { - case Some(depthObj) => { - checkForLargeImages(depthObj.node, depthObj.parentDepth, depthObj.siblingDepth) + getDepthLevel(node, parentDepthLevel, siblingDepthLevel) match { + case Some(depthObj) => { + checkForLargeImages(depthObj.node, depthObj.parentDepth, depthObj.siblingDepth) + } + case None => trace("Image iteration is over!") + } } - case None => trace("Image iteration is over!") - } - } - } - case None => { - - getDepthLevel(node, parentDepthLevel, siblingDepthLevel) match { - case Some(depthObj) => { - checkForLargeImages(depthObj.node, depthObj.parentDepth, depthObj.siblingDepth) - } - case None => trace("Image iteration is over!") } - } } - } - - def getNode(node: Element): Option[Element] = { - if (node == null) None else Some(node) - } - - /** - * loop through all the images and find the ones that have the best bytez to even make them a candidate - * - * @param images - * @return - */ - private def findImagesThatPassByteSizeTest(images: ArrayList[Element]): Option[ArrayList[Element]] = { - var cnt: Int = 0 - val goodImages: ArrayList[Element] = new ArrayList[Element] - - images.foreach(image => { - try { - if (cnt > 30) { - trace(logPrefix + "Abort! they have over 30 images near the top node: " + this.doc.baseUri) - return Some(goodImages) + + def getNode(node: Element): Option[Element] = { + if (node == null) None else Some(node) + } + + /** + * loop through all the images and find the ones that have the best bytez to even make them a candidate + * + * @param images + * @return + */ + private def findImagesThatPassByteSizeTest(images: ArrayList[Element]): Option[ArrayList[Element]] = { + var cnt: Int = 0 + val goodImages: ArrayList[Element] = new ArrayList[Element] + + images.foreach(image => { + try { + if (cnt > 30) { + trace(logPrefix + "Abort! they have over 30 images near the top node: " + this.doc.baseUri) + return Some(goodImages) + } + val bytes: Int = getBytesForImage(image.attr("src")) + + val MAX_BYTES_SIZE: Int = 15728640 + if ((bytes == 0 || bytes > minBytesForImages) && bytes < MAX_BYTES_SIZE) { + trace(logPrefix + "findImagesThatPassByteSizeTest: Found potential image - size: " + bytes + " src: " + image.attr("src")) + goodImages.add(image) + } + else { + trace(logPrefix + " Removing image: " + image.attr("src")) + image.remove() + } + } catch { + case e: Exception => warn(e, e.toString) + } + cnt += 1 + }) + + trace(logPrefix + " Now leaving findImagesThatPassByteSizeTest") + if (goodImages != null && goodImages.size > 0) Some(goodImages) else None + } + + /** + * takes a list of image elements and filters out the ones with bad names + * + * @param images + * @return + */ + private def filterBadNames(images: Elements): Option[ArrayList[Element]] = { + val goodImages: ArrayList[Element] = new ArrayList[Element] + for (image <- images) { + if (this.isOkImageFileName(image)) { + goodImages.add(image) + } + else { + image.remove() + } } - val bytes: Int = getBytesForImage(image.attr("src")) + if (goodImages != null && goodImages.size > 0) Some(goodImages) else None + } - val MAX_BYTES_SIZE: Int = 15728640 - if ((bytes == 0 || bytes > minBytesForImages) && bytes < MAX_BYTES_SIZE) { - trace(logPrefix + "findImagesThatPassByteSizeTest: Found potential image - size: " + bytes + " src: " + image.attr("src")) - goodImages.add(image) + /** + * will check the image src against a list of bad image files we know of like buttons, etc... + * + * @return + */ + private def isOkImageFileName(imageNode: Element): Boolean = { + var imgSrc: String = imageNode.attr("src") + if (string.isNullOrEmpty(imgSrc)) { + return false } - else { - trace(logPrefix + " Removing image: " + image.attr("src")) - image.remove() + matchBadImageNames.reset(imgSrc) + if (matchBadImageNames.find) { + if (logger.isDebugEnabled) { + logger.debug("Found bad filename for image: " + imgSrc) + } + return false } - } catch { - case e: Exception => warn(e, e.toString) - } - cnt += 1 - }) - - trace(logPrefix + " Now leaving findImagesThatPassByteSizeTest") - if (goodImages != null && goodImages.size > 0) Some(goodImages) else None - } - - /** - * takes a list of image elements and filters out the ones with bad names - * - * @param images - * @return - */ - private def filterBadNames(images: Elements): Option[ArrayList[Element]] = { - val goodImages: ArrayList[Element] = new ArrayList[Element] - for (image <- images) { - if (this.isOkImageFileName(image)) { - goodImages.add(image) - } - else { - image.remove() - } - } - if (goodImages != null && goodImages.size > 0) Some(goodImages) else None - } - - /** - * will check the image src against a list of bad image files we know of like buttons, etc... - * - * @return - */ - private def isOkImageFileName(imageNode: Element): Boolean = { - var imgSrc: String = imageNode.attr("src") - if (string.isNullOrEmpty(imgSrc)) { - return false - } - matchBadImageNames.reset(imgSrc) - if (matchBadImageNames.find) { - if (logger.isDebugEnabled) { - logger.debug("Found bad filename for image: " + imgSrc) - } - return false + true } - true - } - /** - * in here we check for known image contains from sites we've checked out like yahoo, techcrunch, etc... that have - * known places to look for good images. - * //todo enable this to use a series of settings files so people can define what the image ids/classes are on specific sites - */ - def checkForKnownElements() { + /** + * in here we check for known image contains from sites we've checked out like yahoo, techcrunch, etc... that have + * known places to look for good images. + * //todo enable this to use a series of settings files so people can define what the image ids/classes are on specific sites + */ + def checkForKnownElements() { - var knownImage: Element = null - trace(logPrefix + "Checking for known images from large sites") + var knownImage: Element = null + trace(logPrefix + "Checking for known images from large sites") - for (knownName <- KNOWN_IMG_DOM_NAMES) { + for (knownName <- KNOWN_IMG_DOM_NAMES) { - try { - var known: Element = article.rawDoc.getElementById(knownName) - if (known == null) { - known = article.rawDoc.getElementsByClass(knownName).first + try { + var known: Element = article.rawDoc.getElementById(knownName) + if (known == null) { + known = article.rawDoc.getElementsByClass(knownName).first + } + if (known != null) { + val mainImage: Element = known.getElementsByTag("img").first + if (mainImage != null) { + knownImage = mainImage + if (logger.isDebugEnabled) { + logger.debug("Got Image: " + mainImage.attr("src")) + } + } + } + + } + catch { + case e: NullPointerException => { + if (logger.isDebugEnabled) { + logger.debug(e.toString, e) + } + } + } } - if (known != null) { - val mainImage: Element = known.getElementsByTag("img").first - if (mainImage != null) { - knownImage = mainImage + if (knownImage != null) { + val knownImgSrc: String = knownImage.attr("src") + this.image.imageSrc = this.buildImagePath(knownImgSrc) + this.image.imageExtractionType = "known" + this.image.confidenceScore = 90 + this.image.bytes = this.getBytesForImage(knownImgSrc) + } + else { if (logger.isDebugEnabled) { - logger.debug("Got Image: " + mainImage.attr("src")) + logger.debug("No known images found") } - } } - } - catch { - case e: NullPointerException => { - if (logger.isDebugEnabled) { - logger.debug(e.toString, e) - } - } - } - } - if (knownImage != null) { - val knownImgSrc: String = knownImage.attr("src") - this.image.imageSrc = this.buildImagePath(knownImgSrc) - this.image.imageExtractionType = "known" - this.image.confidenceScore = 90 - this.image.bytes = this.getBytesForImage(knownImgSrc) - } - else { - if (logger.isDebugEnabled) { - logger.debug("No known images found") - } } - } - - /** - * This method will take an image path and build out the absolute path to that image - * using the initial url we crawled so we can find a link to the image if they use relative urls like ../myimage.jpg - * - * @param image - * @return - */ - private def buildImagePath(image: String): String = { - var pageURL: URL = null - var newImage: String = image.replace(" ", "%20") - try { - pageURL = new URL(this.targetUrl) - var imageURL: URL = new URL(pageURL, image) - newImage = imageURL.toString - } - catch { - case e: MalformedURLException => { - logger.error("Unable to get Image Path: " + image) - } - } - newImage - } - - /** - * does the HTTP HEAD request to get the image bytes for this images - * - * @param src - * @return - */ - private def getBytesForImage(src: String): Int = { - var bytes: Int = 0 - var httpget: HttpGet = null - try { - var link: String = this.buildImagePath(src) - link = link.replace(" ", "%20") - val localContext: HttpContext = new BasicHttpContext - localContext.setAttribute(ClientContext.COOKIE_STORE, HtmlFetcher.emptyCookieStore) - httpget = new HttpGet(link) - var response: HttpResponse = null - response = httpClient.execute(httpget, localContext) - val entity: HttpEntity = response.getEntity - bytes = this.minBytesForImages + 1 - try { - val currentBytes: Int = entity.getContentLength.asInstanceOf[Int] - val contentType: Header = entity.getContentType - if (contentType.getValue.contains("image")) { - bytes = currentBytes + /** + * This method will take an image path and build out the absolute path to that image + * using the initial url we crawled so we can find a link to the image if they use relative urls like ../myimage.jpg + * + * @param image + * @return + */ + private def buildImagePath(image: String): String = { + var pageURL: URL = null + var newImage: String = image.replace(" ", "%20") + try { + pageURL = new URL(this.targetUrl) + var imageURL: URL = new URL(pageURL, image) + newImage = imageURL.toString } - } - catch { - case e: NullPointerException => { - warn(e, "SRC: " + src + " " + e.toString) - + catch { + case e: MalformedURLException => { + logger.error("Unable to get Image Path: " + image) + } } - } + newImage } - catch { - case e: Exception => { - warn(e, "BIG SRC: " + src + " " + e.toString) - } - } - finally { - try { - httpget.abort() - } - catch { - case e: NullPointerException => { - logger.error("HttpGet is null, can't abortz") - } - } - } - bytes - } - - /** - * download the images to temp disk and set their dimensions - * <p/> - * we're going to score the images in the order in which they appear so images higher up will have more importance, - * we'll count the area of the 1st image as a score of 1 and then calculate how much larger or small each image after it is - * we'll also make sure to try and weed out banner type ad blocks that have big widths and small heights or vice versa - * so if the image is 3rd found in the dom it's sequence score would be 1 / 3 = .33 * diff in area from the first image - * - * @param images - * @return - */ - - private def downloadImagesAndGetResults(images: ArrayList[Element], depthLevel: Int): HashMap[Element, Float] = { - val imageResults: HashMap[Element, Float] = new HashMap[Element, Float] - var cnt: Int = 1 - var initialArea: Float = 0 - - for (image <- images) { - var continueVar = true // major haxor during java to scala conversion -> this whole section needs a rewrite - if (cnt > 30) { - if (logger.isDebugEnabled) { - logger.debug("over 30 images attempted, that's enough for now") - } - return imageResults - } - try { - val imageSource: String = this.buildImagePath(image.attr("src")) - val localSrcPath: String = ImageSaver.storeTempImage(this.httpClient, this.linkhash, imageSource, config) - if (localSrcPath == null) { - if (logger.isDebugEnabled) { - logger.debug("unable to store this image locally: IMGSRC: " + image.attr("src") + " BUILD SRC: " + imageSource) - } - continueVar = false - } - if (logger.isDebugEnabled) { - logger.debug("Starting image: " + localSrcPath) - } - var width: Int = 0 - var height: Int = 0 - if (continueVar) { - image.attr("tempImagePath", localSrcPath) - try { - var imageDims: ImageDetails = ImageUtils.getImageDimensions(config.imagemagickIdentifyPath, localSrcPath) - width = imageDims.getWidth - height = imageDims.getHeight - if (depthLevel > 1) { - if (width < 300) { - if (logger.isDebugEnabled) { - logger.debug("going depthlevel: " + depthLevel + " and img was only: " + width + " wide: " + localSrcPath) + /** + * does the HTTP HEAD request to get the image bytes for this images + * + * @param src + * @return + */ + private def getBytesForImage(src: String): Int = { + var bytes: Int = 0 + var httpget: HttpGet = null + try { + var link: String = this.buildImagePath(src) + link = link.replace(" ", "%20") + val localContext: HttpContext = new BasicHttpContext + localContext.setAttribute(ClientContext.COOKIE_STORE, HtmlFetcher.emptyCookieStore) + httpget = new HttpGet(link) + var response: HttpResponse = null + response = httpClient.execute(httpget, localContext) + val entity: HttpEntity = response.getEntity + bytes = this.minBytesForImages + 1 + try { + val currentBytes: Int = entity.getContentLength.asInstanceOf[Int] + val contentType: Header = entity.getContentType + if (contentType.getValue.contains("image")) { + bytes = currentBytes } - continueVar = false - } } - } - catch { - case e: IOException => { - throw e + catch { + case e: NullPointerException => { + warn(e, "SRC: " + src + " " + e.toString) + + } } - } } - if (continueVar) { - if (this.isBannerDimensions(width, height)) { - if (logger.isDebugEnabled) { - logger.debug(image.attr("src") + " seems like a fishy image dimension wise, skipping it") + catch { + case e: Exception => { + warn(e, "BIG SRC: " + src + " " + e.toString) + } - image.remove() - continueVar = false - } } - if (continueVar) { - if (width < 50) { - if (logger.isDebugEnabled) { - logger.debug(image.attr("src") + " is too small width: " + width + " removing..") + finally { + try { + httpget.abort() + } + catch { + case e: NullPointerException => { + logger.error("HttpGet is null, can't abortz") + } } - image.remove() - continueVar = false - } - } - if (continueVar) { - val sequenceScore: Float = (1).asInstanceOf[Float] / cnt - val area: Int = width * height - var totalScore: Float = 0 - if (initialArea == 0) { - // give the initial image a little area boost as well - initialArea = area * 1.48.asInstanceOf[Float] - totalScore = 1 - } - else { - val areaDifference: Float = area.asInstanceOf[Float] / initialArea - totalScore = sequenceScore.asInstanceOf[Float] * areaDifference - } - trace(logPrefix + imageSource + " Area is: " + area + " sequence score: " + sequenceScore + " totalScore: " + totalScore) - cnt += 1; - - imageResults.put(image, totalScore) } - } - catch { - case e: SecretGifException => { + bytes + } - } - case e: Exception => { - warn(e, e.toString) + /** + * download the images to temp disk and set their dimensions + * <p/> + * we're going to score the images in the order in which they appear so images higher up will have more importance, + * we'll count the area of the 1st image as a score of 1 and then calculate how much larger or small each image after it is + * we'll also make sure to try and weed out banner type ad blocks that have big widths and small heights or vice versa + * so if the image is 3rd found in the dom it's sequence score would be 1 / 3 = .33 * diff in area from the first image + * + * @param images + * @return + */ + + private def downloadImagesAndGetResults(images: ArrayList[Element], depthLevel: Int): HashMap[Element, Float] = { + val imageResults: HashMap[Element, Float] = new HashMap[Element, Float] + var cnt: Int = 1 + var initialArea: Float = 0 + + for (image <- images) { + var continueVar = true // major haxor during java to scala conversion -> this whole section needs a rewrite + if (cnt > 30) { + if (logger.isDebugEnabled) { + logger.debug("over 30 images attempted, that's enough for now") + } + return imageResults + } + try { + val imageSource: String = this.buildImagePath(image.attr("src")) + val localSrcPath: String = ImageSaver.storeTempImage(this.httpClient, this.linkhash, imageSource, config) + if (localSrcPath == null) { + if (logger.isDebugEnabled) { + logger.debug("unable to store this image locally: IMGSRC: " + image.attr("src") + " BUILD SRC: " + imageSource) + } + continueVar = false + } + if (logger.isDebugEnabled) { + logger.debug("Starting image: " + localSrcPath) + } + var width: Int = 0 + var height: Int = 0 + if (continueVar) { + image.attr("tempImagePath", localSrcPath) + try { + var imageDims: ImageDetails = ImageUtils.getImageDimensions(config.imagemagickIdentifyPath, localSrcPath) + width = imageDims.getWidth + height = imageDims.getHeight + if (depthLevel > 1) { + if (width < 300) { + if (logger.isDebugEnabled) { + logger.debug("going depthlevel: " + depthLevel + " and img was only: " + width + " wide: " + localSrcPath) + } + continueVar = false + } + } + } + catch { + case e: IOException => { + throw e + } + } + } + if (continueVar) { + if (this.isBannerDimensions(width, height)) { + if (logger.isDebugEnabled) { + logger.debug(image.attr("src") + " seems like a fishy image dimension wise, skipping it") + } + image.remove() + continueVar = false + } + } + if (continueVar) { + if (width < 50) { + if (logger.isDebugEnabled) { + logger.debug(image.attr("src") + " is too small width: " + width + " removing..") + } + image.remove() + continueVar = false + } + } + if (continueVar) { + val sequenceScore: Float = (1).asInstanceOf[Float] / cnt + val area: Int = width * height + var totalScore: Float = 0 + if (initialArea == 0) { + // give the initial image a little area boost as well + initialArea = area * 1.48.asInstanceOf[Float] + totalScore = 1 + } + else { + val areaDifference: Float = area.asInstanceOf[Float] / initialArea + totalScore = sequenceScore.asInstanceOf[Float] * areaDifference + } + trace(logPrefix + imageSource + " Area is: " + area + " sequence score: " + sequenceScore + " totalScore: " + totalScore) + cnt += 1; + + imageResults.put(image, totalScore) + } + } + catch { + case e: SecretGifException => { + + } + case e: Exception => { + warn(e, e.toString) + } + } } - } - } - imageResults - } - - - /** - * returns true if we think this is kind of a bannery dimension - * like 600 / 100 = 6 may be a fishy dimension for a good image - * - * @param width - * @param height - */ - private def isBannerDimensions(width: Int, height: Int): Boolean = { - if (width == height) { - return false - } - if (width > height) { - val diff: Float = (width.asInstanceOf[Float] / height.asInstanceOf[Float]) - if (diff > 5) { - return true - } + imageResults } - if (height > width) { - val diff: Float = height.asInstanceOf[Float] / width.asInstanceOf[Float] - if (diff > 5) { - return true - } + + + /** + * returns true if we think this is kind of a bannery dimension + * like 600 / 100 = 6 may be a fishy dimension for a good image + * + * @param width + * @param height + */ + private def isBannerDimensions(width: Int, height: Int): Boolean = { + if (width == height) { + return false + } + if (width > height) { + val diff: Float = (width.asInstanceOf[Float] / height.asInstanceOf[Float]) + if (diff > 5) { + return true + } + } + if (height > width) { + val diff: Float = height.asInstanceOf[Float] / width.asInstanceOf[Float] + if (diff > 5) { + return true + } + } + false } - false - } - def getMinBytesForImages: Int = { - minBytesForImages - } + def getMinBytesForImages: Int = { + minBytesForImages + } - def setMinBytesForImages(minBytesForImages: Int) { - this.minBytesForImages = minBytesForImages - } + def setMinBytesForImages(minBytesForImages: Int) { + this.minBytesForImages = minBytesForImages + } - def getTempStoragePath: String = { - tempStoragePath - } + def getTempStoragePath: String = { + tempStoragePath + } - def setTempStoragePath(tempStoragePath: String) { - this.tempStoragePath = tempStoragePath - } + def setTempStoragePath(tempStoragePath: String) { + this.tempStoragePath = tempStoragePath + } } \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala index bf0c7428a..80a223cd9 100644 --- a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala +++ b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala @@ -13,569 +13,569 @@ import collection.mutable.{ListBuffer, HashMap} import com.gravity.goose.utils.FileHelper /** -* Created by Jim Plush -* User: jim -* Date: 9/22/11 -*/ + * Created by Jim Plush + * User: jim + * Date: 9/22/11 + */ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: Configuration) extends ImageExtractor { - import UpgradedImageIExtractor._ + import UpgradedImageIExtractor._ - loadCustomSiteMapping() + loadCustomSiteMapping() - /** - * What's the minimum bytes for an image we'd accept is - */ - private val minBytesForImages: Int = 4000 + /** + * What's the minimum bytes for an image we'd accept is + */ + private val minBytesForImages: Int = 4000 - /** - * the webpage url that we're extracting content from - */ - val targetUrl = article.finalUrl - /** - * stores a hash of our url for reference and image processing - */ - val linkhash = article.linkhash + /** + * the webpage url that we're extracting content from + */ + val targetUrl = article.finalUrl + /** + * stores a hash of our url for reference and image processing + */ + val linkhash = article.linkhash - /** - * this lists all the known bad button names that we have - */ - var matchBadImageNames: Matcher = null + /** + * this lists all the known bad button names that we have + */ + var matchBadImageNames: Matcher = null - val NODE_ID_FORMAT: String = "tag: %s class: %s ID: %s" + val NODE_ID_FORMAT: String = "tag: %s class: %s ID: %s" - var sb: StringBuilder = new StringBuilder - // create negative elements - sb.append(".html|.gif|.ico|button|twitter.jpg|facebook.jpg|ap_buy_photo|digg.jpg|digg.png|delicious.png|facebook.png|reddit.jpg|doubleclick|diggthis|diggThis|adserver|/ads/|ec.atdmt.com") - sb.append("|mediaplex.com|adsatt|view.atdmt") - matchBadImageNames = Pattern.compile(sb.toString()).matcher(string.empty) + var sb: StringBuilder = new StringBuilder + // create negative elements + sb.append(".html|.gif|.ico|button|twitter.jpg|facebook.jpg|ap_buy_photo|digg.jpg|digg.png|delicious.png|facebook.png|reddit.jpg|doubleclick|diggthis|diggThis|adserver|/ads/|ec.atdmt.com") + sb.append("|mediaplex.com|adsatt|view.atdmt") + matchBadImageNames = Pattern.compile(sb.toString()).matcher(string.empty) - def getBestImage(doc: Document, topNode: Element): Image = { - trace("Starting to Look for the Most Relavent Image") - checkForKnownElements() match { - case Some(image) => return image - case None => { - trace("No known images found") - } - } + def getBestImage(doc: Document, topNode: Element): Image = { + trace("Starting to Look for the Most Relavent Image") + checkForKnownElements() match { + case Some(image) => return image + case None => { + trace("No known images found") + } + } - checkForLargeImages(topNode, 0, 0) match { - case Some(image) => return image - case None => { - trace("No big images found") - } - } + checkForLargeImages(topNode, 0, 0) match { + case Some(image) => return image + case None => { + trace("No big images found") + } + } - checkForMetaTag match { - case Some(image) => return image - case None => trace("No Meta Tag Images found") + checkForMetaTag match { + case Some(image) => return image + case None => trace("No Meta Tag Images found") + } + + new Image } - new Image - } + private def checkForMetaTag: Option[Image] = { + checkForLinkTag match { + case Some(image) => return Some(image) + case None => trace("No known images found") + } - private def checkForMetaTag: Option[Image] = { - checkForLinkTag match { - case Some(image) => return Some(image) - case None => trace("No known images found") - } + checkForOpenGraphTag match { + case Some(image) => return Some(image) + case None => trace("No known images found") + } - checkForOpenGraphTag match { - case Some(image) => return Some(image) - case None => trace("No known images found") + None } - None - } - - - /** - * although slow the best way to determine the best image is to download them and check the actual dimensions of the image when on disk - * so we'll go through a phased approach... - * 1. get a list of ALL images from the parent node - * 2. filter out any bad image names that we know of (gifs, ads, etc..) - * 3. do a head request on each file to make sure it meets our bare requirements - * 4. any images left over let's do a full GET request, download em to disk and check their dimensions - * 5. Score images based on different factors like height/width and possibly things like color density - * - * @param node - */ - private def checkForLargeImages(node: Element, parentDepthLevel: Int, siblingDepthLevel: Int): Option[Image] = { - trace("Checking for large images - parent depth %d sibling depth: %d".format(parentDepthLevel, siblingDepthLevel)) - - getImageCandidates(node) match { - case Some(goodImages) => { - trace("checkForLargeImages: After findImagesThatPassByteSizeTest we have: " + goodImages.size + " at parent depth: " + parentDepthLevel) - val scoredImages = downloadImagesAndGetResults(goodImages, parentDepthLevel) - // get the high score image in a tuple - scoredImages.sortBy((res: (LocallyStoredImage, Float)) => res._2).reverse.take(1).headOption match { - case Some(highScoreImage) => { - val mainImage = new Image - // mainImage.topImageNode = highScoreImage - mainImage.imageSrc = highScoreImage._1.imgSrc - mainImage.imageExtractionType = "bigimage" - mainImage.bytes = highScoreImage._1.bytes - mainImage.confidenceScore = if (scoredImages.size > 0) (100 / scoredImages.size) else 0 - trace("IMAGE COMPLETE: High Score Image is: " + mainImage.imageSrc + " Score is: " + highScoreImage._2) - return Some(mainImage) - } - case None => { - trace("No good images found after filtering") - getDepthLevel(node, parentDepthLevel, siblingDepthLevel) match { - case Some(depthObj) => { - return checkForLargeImages(depthObj.node, depthObj.parentDepth, depthObj.siblingDepth) - } - case None => trace("Image iteration is over!") - } - } - } + /** + * although slow the best way to determine the best image is to download them and check the actual dimensions of the image when on disk + * so we'll go through a phased approach... + * 1. get a list of ALL images from the parent node + * 2. filter out any bad image names that we know of (gifs, ads, etc..) + * 3. do a head request on each file to make sure it meets our bare requirements + * 4. any images left over let's do a full GET request, download em to disk and check their dimensions + * 5. Score images based on different factors like height/width and possibly things like color density + * + * @param node + */ + private def checkForLargeImages(node: Element, parentDepthLevel: Int, siblingDepthLevel: Int): Option[Image] = { + trace("Checking for large images - parent depth %d sibling depth: %d".format(parentDepthLevel, siblingDepthLevel)) + + getImageCandidates(node) match { + case Some(goodImages) => { + trace("checkForLargeImages: After findImagesThatPassByteSizeTest we have: " + goodImages.size + " at parent depth: " + parentDepthLevel) + val scoredImages = downloadImagesAndGetResults(goodImages, parentDepthLevel) + // get the high score image in a tuple + scoredImages.sortBy((res: (LocallyStoredImage, Float)) => res._2).reverse.take(1).headOption match { + case Some(highScoreImage) => { + val mainImage = new Image + // mainImage.topImageNode = highScoreImage + mainImage.imageSrc = highScoreImage._1.imgSrc + mainImage.imageExtractionType = "bigimage" + mainImage.bytes = highScoreImage._1.bytes + mainImage.confidenceScore = if (scoredImages.size > 0) (100 / scoredImages.size) else 0 + trace("IMAGE COMPLETE: High Score Image is: " + mainImage.imageSrc + " Score is: " + highScoreImage._2) + return Some(mainImage) + } + case None => { + trace("No good images found after filtering") + getDepthLevel(node, parentDepthLevel, siblingDepthLevel) match { + case Some(depthObj) => { + return checkForLargeImages(depthObj.node, depthObj.parentDepth, depthObj.siblingDepth) + } + case None => trace("Image iteration is over!") + } + } + } - } - case None => { - getDepthLevel(node, parentDepthLevel, siblingDepthLevel) match { - case Some(depthObj) => { - return checkForLargeImages(depthObj.node, depthObj.parentDepth, depthObj.siblingDepth) - } - case None => trace("Image iteration is over!") + + } + case None => { + getDepthLevel(node, parentDepthLevel, siblingDepthLevel) match { + case Some(depthObj) => { + return checkForLargeImages(depthObj.node, depthObj.parentDepth, depthObj.siblingDepth) + } + case None => trace("Image iteration is over!") + } + } } - } + + None } - None - } - - def getDepthLevel(node: Element, parentDepth: Int, siblingDepth: Int): Option[DepthTraversal] = { - val MAX_PARENT_DEPTH = 2 - if (parentDepth > MAX_PARENT_DEPTH) { - trace("ParentDepth is greater than %d, aborting depth traversal".format(MAX_PARENT_DEPTH)) - None - } else { - try { - val siblingNode = node.previousElementSibling() - if (siblingNode == null) throw new NullPointerException - Some(DepthTraversal(siblingNode, parentDepth, siblingDepth + 1)) - } catch { - case e: NullPointerException => { - if (node != null) { - Some(DepthTraversal(node.parent, parentDepth + 1, 0)) - } else { + def getDepthLevel(node: Element, parentDepth: Int, siblingDepth: Int): Option[DepthTraversal] = { + val MAX_PARENT_DEPTH = 2 + if (parentDepth > MAX_PARENT_DEPTH) { + trace("ParentDepth is greater than %d, aborting depth traversal".format(MAX_PARENT_DEPTH)) None - } - + } else { + try { + val siblingNode = node.previousElementSibling() + if (siblingNode == null) throw new NullPointerException + Some(DepthTraversal(siblingNode, parentDepth, siblingDepth + 1)) + } catch { + case e: NullPointerException => { + if (node != null) { + Some(DepthTraversal(node.parent, parentDepth + 1, 0)) + } else { + None + } + + } + } } - } } - } - - /** - * download the images to temp disk and set their dimensions - * <p/> - * we're going to score the images in the order in which they appear so images higher up will have more importance, - * we'll count the area of the 1st image as a score of 1 and then calculate how much larger or small each image after it is - * we'll also make sure to try and weed out banner type ad blocks that have big widths and small heights or vice versa - * so if the image is 3rd found in the dom it's sequence score would be 1 / 3 = .33 * diff in area from the first image - * - * @param images - * @return - */ - - private def downloadImagesAndGetResults(images: ArrayList[Element], depthLevel: Int): ListBuffer[(LocallyStoredImage, Float)] = { - val imageResults = new ListBuffer[(LocallyStoredImage, Float)]() - var initialArea: Float = 0 - var cnt = 1.0f - val MIN_WIDTH = 50 - - images.take(30).foreach((image: Element) => { - for { - locallyStoredImage <- getLocallyStoredImage(buildImagePath(image.attr("src"))) - width = locallyStoredImage.width - height = locallyStoredImage.height - imageSrc = locallyStoredImage.imgSrc - fileExtension = locallyStoredImage.fileExtension - if (fileExtension != ".gif" && fileExtension != "NA") - if ((depthLevel >= 1 && locallyStoredImage.width > 300) || depthLevel < 1) - if (!isBannerDimensions(width, height)) - if (width > MIN_WIDTH) - } { - val sequenceScore: Float = 1.0f / cnt - val area: Float = width * height - var totalScore: Float = 0 - if (initialArea == 0) { - // give the initial image a little area boost as well - initialArea = area * 1.48f - totalScore = 1 - } - else { - val areaDifference: Float = area / initialArea - totalScore = sequenceScore.asInstanceOf[Float] * areaDifference - } - trace("IMG: " + imageSrc + " Area is: " + area + " sequence score: " + sequenceScore + " totalScore: " + totalScore) - cnt += 1; - - imageResults += Tuple2(locallyStoredImage, totalScore) - cnt += 1 - } - }) - + /** + * download the images to temp disk and set their dimensions + * <p/> + * we're going to score the images in the order in which they appear so images higher up will have more importance, + * we'll count the area of the 1st image as a score of 1 and then calculate how much larger or small each image after it is + * we'll also make sure to try and weed out banner type ad blocks that have big widths and small heights or vice versa + * so if the image is 3rd found in the dom it's sequence score would be 1 / 3 = .33 * diff in area from the first image + * + * @param images + * @return + */ + + private def downloadImagesAndGetResults(images: ArrayList[Element], depthLevel: Int): ListBuffer[(LocallyStoredImage, Float)] = { + val imageResults = new ListBuffer[(LocallyStoredImage, Float)]() + var initialArea: Float = 0 + var cnt = 1.0f + val MIN_WIDTH = 50 + + images.take(30).foreach((image: Element) => { + for { + locallyStoredImage <- getLocallyStoredImage(buildImagePath(image.attr("src"))) + width = locallyStoredImage.width + height = locallyStoredImage.height + imageSrc = locallyStoredImage.imgSrc + fileExtension = locallyStoredImage.fileExtension + if (fileExtension != ".gif" && fileExtension != "NA") + if ((depthLevel >= 1 && locallyStoredImage.width > 300) || depthLevel < 1) + if (!isBannerDimensions(width, height)) + if (width > MIN_WIDTH) + } { + val sequenceScore: Float = 1.0f / cnt + val area: Float = width * height + var totalScore: Float = 0 + if (initialArea == 0) { + // give the initial image a little area boost as well + initialArea = area * 1.48f + totalScore = 1 + } + else { + val areaDifference: Float = area / initialArea + totalScore = sequenceScore.asInstanceOf[Float] * areaDifference + } + trace("IMG: " + imageSrc + " Area is: " + area + " sequence score: " + sequenceScore + " totalScore: " + totalScore) + cnt += 1; + + imageResults += Tuple2(locallyStoredImage, totalScore) + cnt += 1 + } + }) - imageResults - } - def getAllImages: ArrayList[Element] = { - null - } - /** - * returns true if we think this is kind of a bannery dimension - * like 600 / 100 = 6 may be a fishy dimension for a good image - * - * @param width - * @param height - */ - private def isBannerDimensions(width: Int, height: Int): Boolean = { - if (width == height) { - return false + imageResults } - if (width > height) { - val diff: Float = (width.asInstanceOf[Float] / height.asInstanceOf[Float]) - if (diff > 5) { - return true - } + + def getAllImages: ArrayList[Element] = { + null } - if (height > width) { - val diff: Float = height.asInstanceOf[Float] / width.asInstanceOf[Float] - if (diff > 5) { - return true - } + + /** + * returns true if we think this is kind of a bannery dimension + * like 600 / 100 = 6 may be a fishy dimension for a good image + * + * @param width + * @param height + */ + private def isBannerDimensions(width: Int, height: Int): Boolean = { + if (width == height) { + return false + } + if (width > height) { + val diff: Float = (width.asInstanceOf[Float] / height.asInstanceOf[Float]) + if (diff > 5) { + return true + } + } + if (height > width) { + val diff: Float = height.asInstanceOf[Float] / width.asInstanceOf[Float] + if (diff > 5) { + return true + } + } + false } - false - } - def getImagesFromNode(node: Element): Option[Elements] = { - val images: Elements = node.select("img") + def getImagesFromNode(node: Element): Option[Elements] = { + val images: Elements = node.select("img") - if (images == null || images.size < 1) { - None - } else { - Some(images) - } - } - - /** - * takes a list of image elements and filters out the ones with bad names - * - * @param images - * @return - */ - private def filterBadNames(images: Elements): Option[ArrayList[Element]] = { - val goodImages: ArrayList[Element] = new ArrayList[Element] - for (image <- images) { - if (this.isOkImageFileName(image)) { - goodImages.add(image) - } - else { - image.remove() - } - } - if (goodImages != null && goodImages.size > 0) Some(goodImages) else None - } - - /** - * will check the image src against a list of bad image files we know of like buttons, etc... - * - * @return - */ - private def isOkImageFileName(imageNode: Element): Boolean = { - val imgSrc: String = imageNode.attr("src") - if (string.isNullOrEmpty(imgSrc)) { - return false - } - matchBadImageNames.reset(imgSrc) - if (matchBadImageNames.find) { - if (logger.isDebugEnabled) { - logger.debug("Found bad filename for image: " + imgSrc) - } - return false - } - true - } - - def getImageCandidates(node: Element): Option[ArrayList[Element]] = { - - for { - n <- getNode(node) - images <- getImagesFromNode(node) - filteredImages <- filterBadNames(images) - goodImages <- findImagesThatPassByteSizeTest(filteredImages) - } { - return Some(filteredImages) - } - None - - } - - /** - * loop through all the images and find the ones that have the best bytez to even make them a candidate - * - * @param images - * @return - */ - private def findImagesThatPassByteSizeTest(images: ArrayList[Element]): Option[ArrayList[Element]] = { - var cnt: Int = 0 - val MAX_BYTES_SIZE: Int = 15728640 - val goodImages: ArrayList[Element] = new ArrayList[Element] - images.foreach(image => { - try { - if (cnt > 30) { - trace("Abort! they have over 30 images near the top node: ") - return Some(goodImages) + if (images == null || images.size < 1) { + None + } else { + Some(images) } - val imageSrc = image.attr("src") - getLocallyStoredImage(buildImagePath(imageSrc)) match { - case Some(locallyStoredImage) => { - - val bytes = locallyStoredImage.bytes - if ((bytes == 0 || bytes > minBytesForImages) && bytes < MAX_BYTES_SIZE) { - trace("findImagesThatPassByteSizeTest: Found potential image - size: " + bytes + " src: " + image.attr("src")) - goodImages.add(image) - } else { - trace("Removing image: " + image.attr("src")) - image.remove() - } + } - } - case None => trace(imageSrc + " unable to fetch") + /** + * takes a list of image elements and filters out the ones with bad names + * + * @param images + * @return + */ + private def filterBadNames(images: Elements): Option[ArrayList[Element]] = { + val goodImages: ArrayList[Element] = new ArrayList[Element] + for (image <- images) { + if (this.isOkImageFileName(image)) { + goodImages.add(image) + } + else { + image.remove() + } } + if (goodImages != null && goodImages.size > 0) Some(goodImages) else None + } - } catch { - case e: Exception => warn(e, e.toString) - } - cnt += 1 - }) - - - trace(" Now leaving findImagesThatPassByteSizeTest") - if (goodImages != null && goodImages.size > 0) Some(goodImages) else None - - } - - def getNode(node: Element): Option[Element] = { - if (node == null) None else Some(node) - } - - /** - * checks to see if we were able to find open graph tags on this page - * - * @return - */ - private def checkForLinkTag: Option[Image] = { - try { - val meta: Elements = article.rawDoc.select("link[rel~=image_src]") - for (item <- meta) { - if (item.attr("href").length < 1) { - return None + /** + * will check the image src against a list of bad image files we know of like buttons, etc... + * + * @return + */ + private def isOkImageFileName(imageNode: Element): Boolean = { + val imgSrc: String = imageNode.attr("src") + if (string.isNullOrEmpty(imgSrc)) { + return false } - val mainImage = new Image - mainImage.imageSrc = this.buildImagePath(item.attr("href")) - mainImage.imageExtractionType = "linktag" - mainImage.confidenceScore = 100 - - getLocallyStoredImage(mainImage.imageSrc) match { - case Some(locallyStoredImage) => { - mainImage.bytes = locallyStoredImage.bytes - mainImage.height = locallyStoredImage.height - mainImage.width = locallyStoredImage.width - } - case None => + matchBadImageNames.reset(imgSrc) + if (matchBadImageNames.find) { + if (logger.isDebugEnabled) { + logger.debug("Found bad filename for image: " + imgSrc) + } + return false } - trace("link tag found, using it") - - return Some(mainImage) - } - None + true } - catch { - case e: Exception => { - logger.error(e.toString, e) + + def getImageCandidates(node: Element): Option[ArrayList[Element]] = { + + for { + n <- getNode(node) + images <- getImagesFromNode(node) + filteredImages <- filterBadNames(images) + goodImages <- findImagesThatPassByteSizeTest(filteredImages) + } { + return Some(filteredImages) + } None - } + } - } + /** + * loop through all the images and find the ones that have the best bytez to even make them a candidate + * + * @param images + * @return + */ + private def findImagesThatPassByteSizeTest(images: ArrayList[Element]): Option[ArrayList[Element]] = { + var cnt: Int = 0 + val MAX_BYTES_SIZE: Int = 15728640 + val goodImages: ArrayList[Element] = new ArrayList[Element] + images.foreach(image => { + try { + if (cnt > 30) { + trace("Abort! they have over 30 images near the top node: ") + return Some(goodImages) + } + val imageSrc = image.attr("src") + getLocallyStoredImage(buildImagePath(imageSrc)) match { + case Some(locallyStoredImage) => { + + val bytes = locallyStoredImage.bytes + if ((bytes == 0 || bytes > minBytesForImages) && bytes < MAX_BYTES_SIZE) { + trace("findImagesThatPassByteSizeTest: Found potential image - size: " + bytes + " src: " + image.attr("src")) + goodImages.add(image) + } else { + trace("Removing image: " + image.attr("src")) + image.remove() + } + + } + case None => trace(imageSrc + " unable to fetch") + } + + } catch { + case e: Exception => warn(e, e.toString) + } + cnt += 1 + }) - /** - * checks to see if we were able to find open graph tags on this page - * - * @return - */ - private def checkForOpenGraphTag: Option[Image] = { - try { - val meta: Elements = article.rawDoc.select("meta[property~=og:image]") - for (item <- meta) { - if (item.attr("content").length < 1) { - return None - } - val imagePath: String = this.buildImagePath(item.attr("content")) - val mainImage = new Image - mainImage.imageSrc = imagePath - mainImage.imageExtractionType = "opengraph" - mainImage.confidenceScore = 100 - getLocallyStoredImage(mainImage.imageSrc) match { - case Some(locallyStoredImage) => { - mainImage.bytes = locallyStoredImage.bytes - mainImage.height = locallyStoredImage.height - mainImage.width = locallyStoredImage.width - } - case None => - } - trace("open graph tag found, using it: %s".format(imagePath)) + trace(" Now leaving findImagesThatPassByteSizeTest") + if (goodImages != null && goodImages.size > 0) Some(goodImages) else None - return Some(mainImage) - } - None - } - catch { - case e: Exception => { - warn(e, e.toString) - None - } - } - } - - - /** - * returns the bytes of the image file on disk - */ - def getLocallyStoredImage(imageSrc: String): Option[LocallyStoredImage] = { - ImageUtils.storeImageToLocalFile(httpClient, linkhash, imageSrc, config) match { - case Some(locallyStoredImage) => { - Some(locallyStoredImage) - } - case None => None - } - } - - - def getCleanDomain = { - // just grab the very end of the domain - article.domain.split("\\.").reverse.take(2).reverse.mkString(".") - } - - /** - * in here we check for known image contains from sites we've checked out like yahoo, techcrunch, etc... that have - * known places to look for good images. - * //todo enable this to use a series of settings files so people can define what the image ids/classes are on specific sites - */ - def checkForKnownElements(): Option[Image] = { - - val domain = getCleanDomain - if (customSiteMapping.contains(domain)) { - for (className <- customSiteMapping(domain).split("\\|")) { - KNOWN_IMG_DOM_NAMES += className - } } - var knownImage: Element = null - trace("Checking for known images from large sites") - - for (knownName <- KNOWN_IMG_DOM_NAMES) { + def getNode(node: Element): Option[Element] = { + if (node == null) None else Some(node) + } - try { - var known: Element = article.rawDoc.getElementById(knownName) - if (known == null) { - known = article.rawDoc.getElementsByClass(knownName).first + /** + * checks to see if we were able to find open graph tags on this page + * + * @return + */ + private def checkForLinkTag: Option[Image] = { + try { + val meta: Elements = article.rawDoc.select("link[rel~=image_src]") + for (item <- meta) { + if (item.attr("href").length < 1) { + return None + } + val mainImage = new Image + mainImage.imageSrc = this.buildImagePath(item.attr("href")) + mainImage.imageExtractionType = "linktag" + mainImage.confidenceScore = 100 + + getLocallyStoredImage(mainImage.imageSrc) match { + case Some(locallyStoredImage) => { + mainImage.bytes = locallyStoredImage.bytes + mainImage.height = locallyStoredImage.height + mainImage.width = locallyStoredImage.width + } + case None => + } + trace("link tag found, using it") + + return Some(mainImage) + } + None } - if (known != null) { - val mainImage: Element = known.getElementsByTag("img").first - if (mainImage != null) { - knownImage = mainImage - trace("Got Known Image: " + mainImage.attr("src")) - } + catch { + case e: Exception => { + logger.error(e.toString, e) + None + } } - } - catch { - case e: NullPointerException => { - warn(e, e.toString) + } + + /** + * checks to see if we were able to find open graph tags on this page + * + * @return + */ + private def checkForOpenGraphTag: Option[Image] = { + try { + val meta: Elements = article.rawDoc.select("meta[property~=og:image]") + + for (item <- meta) { + if (item.attr("content").length < 1) { + return None + } + val imagePath: String = this.buildImagePath(item.attr("content")) + val mainImage = new Image + mainImage.imageSrc = imagePath + mainImage.imageExtractionType = "opengraph" + mainImage.confidenceScore = 100 + getLocallyStoredImage(mainImage.imageSrc) match { + case Some(locallyStoredImage) => { + mainImage.bytes = locallyStoredImage.bytes + mainImage.height = locallyStoredImage.height + mainImage.width = locallyStoredImage.width + } + case None => + } + trace("open graph tag found, using it: %s".format(imagePath)) + + return Some(mainImage) + } + None + } + catch { + case e: Exception => { + warn(e, e.toString) + None + } } - } } - if (knownImage != null) { - val knownImgSrc: String = knownImage.attr("src") - val mainImage = new Image - mainImage.imageSrc = buildImagePath(knownImgSrc) - mainImage.imageExtractionType = "known" - mainImage.confidenceScore = 90 - getLocallyStoredImage(buildImagePath(mainImage.imageSrc)) match { - case Some(locallyStoredImage) => { - mainImage.bytes = locallyStoredImage.bytes - mainImage.height = locallyStoredImage.height - mainImage.width = locallyStoredImage.width + + + /** + * returns the bytes of the image file on disk + */ + def getLocallyStoredImage(imageSrc: String): Option[LocallyStoredImage] = { + ImageUtils.storeImageToLocalFile(httpClient, linkhash, imageSrc, config) match { + case Some(locallyStoredImage) => { + Some(locallyStoredImage) + } + case None => None } - case None => - } - Some(mainImage) } - else { - None + + def getCleanDomain = { + // just grab the very end of the domain + article.domain.split("\\.").reverse.take(2).reverse.mkString(".") } - } + /** + * in here we check for known image contains from sites we've checked out like yahoo, techcrunch, etc... that have + * known places to look for good images. + * //todo enable this to use a series of settings files so people can define what the image ids/classes are on specific sites + */ + def checkForKnownElements(): Option[Image] = { + + val domain = getCleanDomain + if (customSiteMapping.contains(domain)) { + for (className <- customSiteMapping(domain).split("\\|")) { + KNOWN_IMG_DOM_NAMES += className + } + } + + var knownImage: Element = null + trace("Checking for known images from large sites") - /** - * This method will take an image path and build out the absolute path to that image - * using the initial url we crawled so we can find a link to the image if they use relative urls like ../myimage.jpg - * - * @param imageSrc - * @return - */ - private def buildImagePath(imageSrc: String): String = { + for (knownName <- KNOWN_IMG_DOM_NAMES) { - var newImage: String = ImageUtils.cleanImageSrcString(imageSrc) - try { - val pageURL = new URL(this.targetUrl) - val imageURL: URL = new URL(pageURL, newImage) - newImage = imageURL.toString + try { + var known: Element = article.rawDoc.getElementById(knownName) + if (known == null) { + known = article.rawDoc.getElementsByClass(knownName).first + } + if (known != null) { + val mainImage: Element = known.getElementsByTag("img").first + if (mainImage != null) { + knownImage = mainImage + trace("Got Known Image: " + mainImage.attr("src")) + } + } + + } + catch { + case e: NullPointerException => { + warn(e, e.toString) + } + } + } + if (knownImage != null) { + val knownImgSrc: String = knownImage.attr("src") + val mainImage = new Image + mainImage.imageSrc = buildImagePath(knownImgSrc) + mainImage.imageExtractionType = "known" + mainImage.confidenceScore = 90 + getLocallyStoredImage(buildImagePath(mainImage.imageSrc)) match { + case Some(locallyStoredImage) => { + mainImage.bytes = locallyStoredImage.bytes + mainImage.height = locallyStoredImage.height + mainImage.width = locallyStoredImage.width + } + case None => + } + Some(mainImage) + } + else { + + None + } } - catch { - case e: MalformedURLException => { - logger.error("Unable to get Image Path: " + imageSrc) - } + + /** + * This method will take an image path and build out the absolute path to that image + * using the initial url we crawled so we can find a link to the image if they use relative urls like ../myimage.jpg + * + * @param imageSrc + * @return + */ + private def buildImagePath(imageSrc: String): String = { + + var newImage: String = ImageUtils.cleanImageSrcString(imageSrc) + try { + val pageURL = new URL(this.targetUrl) + val imageURL: URL = new URL(pageURL, newImage) + newImage = imageURL.toString + + } + catch { + case e: MalformedURLException => { + logger.error("Unable to get Image Path: " + imageSrc) + } + } + newImage } - newImage - } } object UpgradedImageIExtractor { - // custom site mapping is for major sites that we know what they generally - // place images into, allows for higher accuracy of image extraction - val customSiteMapping = new HashMap[String, String]() + // custom site mapping is for major sites that we know what they generally + // place images into, allows for higher accuracy of image extraction + val customSiteMapping = new HashMap[String, String]() - val KNOWN_IMG_DOM_NAMES = new ListBuffer[String]() - KNOWN_IMG_DOM_NAMES += "yn-story-related-media" - KNOWN_IMG_DOM_NAMES += "cnn_strylccimg300cntr" - KNOWN_IMG_DOM_NAMES += "big_photo" - KNOWN_IMG_DOM_NAMES += "ap-smallphoto-a" + val KNOWN_IMG_DOM_NAMES = new ListBuffer[String]() + KNOWN_IMG_DOM_NAMES += "yn-story-related-media" + KNOWN_IMG_DOM_NAMES += "cnn_strylccimg300cntr" + KNOWN_IMG_DOM_NAMES += "big_photo" + KNOWN_IMG_DOM_NAMES += "ap-smallphoto-a" - def loadCustomSiteMapping() { - val dataFile = FileHelper.loadResourceFile("/com/gravity/goose/images/known-image-css.txt", UpgradedImageIExtractor.getClass) - val lines = dataFile.split("\n") - for (line <- lines) { - val Array(domain, css) = line.split("\\^") - customSiteMapping += domain -> css + def loadCustomSiteMapping() { + val dataFile = FileHelper.loadResourceFile("/com/gravity/goose/images/known-image-css.txt", UpgradedImageIExtractor.getClass) + val lines = dataFile.split("\n") + for (line <- lines) { + val Array(domain, css) = line.split("\\^") + customSiteMapping += domain -> css + } } - } } \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index 010d29135..a385353c6 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/main/scala/com/gravity/goose/network/HttpExceptions.scala b/src/main/scala/com/gravity/goose/network/HttpExceptions.scala index 52a4ded54..9ceb44f8f 100644 --- a/src/main/scala/com/gravity/goose/network/HttpExceptions.scala +++ b/src/main/scala/com/gravity/goose/network/HttpExceptions.scala @@ -8,31 +8,35 @@ package com.gravity.goose.network */ class LoggableException(msg: String, innerEx: Exception = null) extends Exception(msg, innerEx) { - override lazy val getMessage = { - val innerMessage = if (innerEx != null) { - "%n\tand inner Exception of type %s:%n\t\tmessage: %s".format(innerEx.getClass.getName, innerEx.getMessage) - } else { - "" + override lazy val getMessage = { + val innerMessage = if (innerEx != null) { + "%n\tand inner Exception of type %s:%n\t\tmessage: %s".format(innerEx.getClass.getName, innerEx.getMessage) + } else { + "" + } + getClass.getName + " ==> " + msg + innerMessage } - getClass.getName + " ==> " + msg + innerMessage - } } class NotFoundException(url: String) extends LoggableException("SERVER RETURNED 404 FOR LINK: " + url) + class BadRequestException(url: String) extends LoggableException("Bad Request for URL: " + url) + class NotAuthorizedException(url: String, statusCode: Int = 403) extends LoggableException("Not authorized (statusCode: %d) to access URL: %s".format(statusCode, url)) + class ServerErrorException(url: String, statusCode: Int = 500) extends LoggableException("Server Error! Status code returned: %d for URL: %s".format(statusCode, url)) -class UnhandledStatusCodeException(url: String, statusCode: Int) extends LoggableException("Received HTTP statusCode: %d from URL: %s and did not know how to handle it!".format(statusCode, url)) + +class UnhandledStatusCodeException(url: String, statusCode: Int) extends LoggableException("Received HTTP statusCode: %d from URL: %s and did not know how to handle it!".format(statusCode, url)) object HttpStatusValidator { - def validate(url: String, statusCode: Int): Either[Exception, String] = statusCode match { - case 200 => Right("OK") - case 400 => Left(new BadRequestException(url)) - case 404 => Left(new NotFoundException(url)) - case auth if (auth > 400 && auth < 500) => Left(new NotAuthorizedException(url, auth)) - case error if (error > 499) => Left(new ServerErrorException(url, error)) - case unk => Left(new UnhandledStatusCodeException(url, statusCode)) - } + def validate(url: String, statusCode: Int): Either[Exception, String] = statusCode match { + case 200 => Right("OK") + case 400 => Left(new BadRequestException(url)) + case 404 => Left(new NotFoundException(url)) + case auth if (auth > 400 && auth < 500) => Left(new NotAuthorizedException(url, auth)) + case error if (error > 499) => Left(new ServerErrorException(url, error)) + case unk => Left(new UnhandledStatusCodeException(url, statusCode)) + } } class ImageFetchException(imgSrc: String, ex: Exception = null) extends LoggableException("Failed to fetch image file from imgSrc: " + imgSrc, ex) \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/network/NotHtmlException.scala b/src/main/scala/com/gravity/goose/network/NotHtmlException.scala index 62ca47dcf..24b94c283 100644 --- a/src/main/scala/com/gravity/goose/network/NotHtmlException.scala +++ b/src/main/scala/com/gravity/goose/network/NotHtmlException.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -25,5 +25,5 @@ package com.gravity.goose.network */ class NotHtmlException(url: String) extends Exception { - override val getMessage = "No HTML returned for url: " + url + override val getMessage = "No HTML returned for url: " + url } \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala b/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala index a86a2252b..af9760c44 100644 --- a/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala +++ b/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -26,186 +26,186 @@ import scala.collection.JavaConversions._ import org.slf4j.Logger /** -* Created by Jim Plush -* User: jim -* Date: 8/17/11 -*/ + * Created by Jim Plush + * User: jim + * Date: 8/17/11 + */ trait OutputFormatter { - val logPrefix = "outformat: " - - // used to remove tags within tags - val tagReplace = "<[^>]+>".r - - def logger: Logger - - private def selectElements(query: String, topNode: Element): Elements = topNode match { - case null => new Elements(List.empty[Element]) - case n => n.select(query) - } - - /** - * Depricated use {@link #getFormattedText(Element)} - * @param topNode the top most node to format - * @return the prepared Element - */ - @Deprecated def getFormattedElement(topNode: Element): Element = { - removeNodesWithNegativeScores(topNode) - convertLinksToText(topNode) - replaceTagsWithText(topNode) - removeParagraphsWithFewWords(topNode) - topNode - } - - /** - * Removes all unnecessarry elements and formats the selected text nodes - * @param topNode the top most node to format - * @return a formatted string with all HTML removed - */ - def getFormattedText(topNode: Element): String = { - removeNodesWithNegativeScores(topNode) - convertLinksToText(topNode) - replaceTagsWithText(topNode) - removeParagraphsWithFewWords(topNode) - convertToText(topNode) - } - - /** - * Depricated use {@link #getFormattedText(Element)} - * takes an element and turns the P tags into \n\n - * - * @return - */ - def convertToText(topNode: Element): String = topNode match { - case null => "" - case node => { - (node.children().map((e: Element) => { - StringEscapeUtils.unescapeHtml(e.text).trim - })).toList.mkString("\n\n") + val logPrefix = "outformat: " + + // used to remove tags within tags + val tagReplace = "<[^>]+>".r + + def logger: Logger + + private def selectElements(query: String, topNode: Element): Elements = topNode match { + case null => new Elements(List.empty[Element]) + case n => n.select(query) } - } - - /** - * cleans up and converts any nodes that should be considered text into text - */ - private def convertLinksToText(topNode: Element) { - if (topNode != null) { - logger.trace(logPrefix + "Turning links to text") - val baseUri = topNode.baseUri() - - val links = topNode.getElementsByTag("a") - for (item <- links) { - if (item.getElementsByTag("img").isEmpty) { - val tn = new TextNode(item.text, baseUri) - item.replaceWith(tn) - } - } + /** + * Depricated use {@link #getFormattedText(Element)} + * @param topNode the top most node to format + * @return the prepared Element + */ + @Deprecated def getFormattedElement(topNode: Element): Element = { + removeNodesWithNegativeScores(topNode) + convertLinksToText(topNode) + replaceTagsWithText(topNode) + removeParagraphsWithFewWords(topNode) + topNode } - } - - /** - * if there are elements inside our top node that have a negative gravity score, let's - * give em the boot - */ - private def removeNodesWithNegativeScores(topNode: Element) { - def tryInt(text: String): Int = try { - Integer.parseInt(text) - } catch { - case _: Exception => 0 + /** + * Removes all unnecessarry elements and formats the selected text nodes + * @param topNode the top most node to format + * @return a formatted string with all HTML removed + */ + def getFormattedText(topNode: Element): String = { + removeNodesWithNegativeScores(topNode) + convertLinksToText(topNode) + replaceTagsWithText(topNode) + removeParagraphsWithFewWords(topNode) + convertToText(topNode) } - val gravityItems = selectElements("*[gravityScore]", topNode) - for (item <- gravityItems) { - val score = tryInt(item.attr("gravityScore")) - if (score < 1) { - item.remove() - } + /** + * Depricated use {@link #getFormattedText(Element)} + * takes an element and turns the P tags into \n\n + * + * @return + */ + def convertToText(topNode: Element): String = topNode match { + case null => "" + case node => { + (node.children().map((e: Element) => { + StringEscapeUtils.unescapeHtml(e.text).trim + })).toList.mkString("\n\n") + } + } - } - - /** - * replace common tags with just text so we don't have any crazy formatting issues - * so replace <br>, <i>, <strong>, etc.... with whatever text is inside them - */ - private def replaceTagsWithText(topNode: Element) { - if (topNode != null) { - val baseUri = topNode.baseUri() - val bolds = topNode.getElementsByTag("b") - for (item <- bolds) { - val tn = new TextNode(getTagCleanedText(item), baseUri) - item.replaceWith(tn) - } - - val strongs = topNode.getElementsByTag("strong") - for (item <- strongs) { - val tn = new TextNode(getTagCleanedText(item), baseUri) - item.replaceWith(tn) - } - - val italics = topNode.getElementsByTag("i") - for (item <- italics) { - val tn = new TextNode(getTagCleanedText(item), baseUri) - item.replaceWith(tn) - - } + + /** + * cleans up and converts any nodes that should be considered text into text + */ + private def convertLinksToText(topNode: Element) { + if (topNode != null) { + logger.trace(logPrefix + "Turning links to text") + val baseUri = topNode.baseUri() + + val links = topNode.getElementsByTag("a") + for (item <- links) { + if (item.getElementsByTag("img").isEmpty) { + val tn = new TextNode(item.text, baseUri) + item.replaceWith(tn) + } + } + } + } - } - - private def getTagCleanedText(item: Node): String = { - val sb = new StringBuilder() - - item.childNodes().foreach { - case childText: TextNode => { - sb.append(childText.getWholeText) - } - case childElement: Element => { - sb.append(childElement.outerHtml()) - } - case _ => + + /** + * if there are elements inside our top node that have a negative gravity score, let's + * give em the boot + */ + private def removeNodesWithNegativeScores(topNode: Element) { + def tryInt(text: String): Int = try { + Integer.parseInt(text) + } catch { + case _: Exception => 0 + } + + val gravityItems = selectElements("*[gravityScore]", topNode) + for (item <- gravityItems) { + val score = tryInt(item.attr("gravityScore")) + if (score < 1) { + item.remove() + } + } } - val text = tagReplace replaceAllIn(sb.toString(), "") - text - } - - /** - * remove paragraphs that have less than x number of words, would indicate that it's some sort of link - */ - private def removeParagraphsWithFewWords(topNode: Element) { - if (topNode != null) { - if (logger.isDebugEnabled) { - logger.debug("removeParagraphsWithFewWords starting...") - } - - val allNodes = topNode.getAllElements - - for (el <- allNodes) { - try { - val stopWords = StopWords.getStopWordCount(el.text) - if (stopWords.getStopWordCount < 3 && el.getElementsByTag("object").size == 0 && el.getElementsByTag("embed").size == 0) { - logger.debug("removeParagraphsWithFewWords - swcnt: %d removing text: %s".format(stopWords.getStopWordCount, el.text())) - el.remove() - } + /** + * replace common tags with just text so we don't have any crazy formatting issues + * so replace <br>, <i>, <strong>, etc.... with whatever text is inside them + */ + private def replaceTagsWithText(topNode: Element) { + if (topNode != null) { + val baseUri = topNode.baseUri() + val bolds = topNode.getElementsByTag("b") + for (item <- bolds) { + val tn = new TextNode(getTagCleanedText(item), baseUri) + item.replaceWith(tn) + } + + val strongs = topNode.getElementsByTag("strong") + for (item <- strongs) { + val tn = new TextNode(getTagCleanedText(item), baseUri) + item.replaceWith(tn) + } + + val italics = topNode.getElementsByTag("i") + for (item <- italics) { + val tn = new TextNode(getTagCleanedText(item), baseUri) + item.replaceWith(tn) + + } } - catch { - case e: IllegalArgumentException => { - logger.error(e.getMessage) - } + } + + private def getTagCleanedText(item: Node): String = { + val sb = new StringBuilder() + + item.childNodes().foreach { + case childText: TextNode => { + sb.append(childText.getWholeText) + } + case childElement: Element => { + sb.append(childElement.outerHtml()) + } + case _ => } - } - - Option(topNode.getElementsByTag("p").first()).foreach { - case firstModdedNode: Element => { - // check for open parens as the first paragraph, e.g. businessweek4.txt (IT) - val trimmed = firstModdedNode.text().trim() - if (trimmed.startsWith("(") && trimmed.endsWith(")")) { - logger.trace("Removing parenthesis paragraph that is first paragraph") - firstModdedNode.remove() - } + + val text = tagReplace replaceAllIn(sb.toString(), "") + text + } + + /** + * remove paragraphs that have less than x number of words, would indicate that it's some sort of link + */ + private def removeParagraphsWithFewWords(topNode: Element) { + if (topNode != null) { + if (logger.isDebugEnabled) { + logger.debug("removeParagraphsWithFewWords starting...") + } + + val allNodes = topNode.getAllElements + + for (el <- allNodes) { + try { + val stopWords = StopWords.getStopWordCount(el.text) + if (stopWords.getStopWordCount < 3 && el.getElementsByTag("object").size == 0 && el.getElementsByTag("embed").size == 0) { + logger.debug("removeParagraphsWithFewWords - swcnt: %d removing text: %s".format(stopWords.getStopWordCount, el.text())) + el.remove() + } + } + catch { + case e: IllegalArgumentException => { + logger.error(e.getMessage) + } + } + } + + Option(topNode.getElementsByTag("p").first()).foreach { + case firstModdedNode: Element => { + // check for open parens as the first paragraph, e.g. businessweek4.txt (IT) + val trimmed = firstModdedNode.text().trim() + if (trimmed.startsWith("(") && trimmed.endsWith(")")) { + logger.trace("Removing parenthesis paragraph that is first paragraph") + firstModdedNode.remove() + } + } + } } - } } - } } \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/outputformatters/StandardOutputFormatter.scala b/src/main/scala/com/gravity/goose/outputformatters/StandardOutputFormatter.scala index 47c13dfee..8d97b912b 100644 --- a/src/main/scala/com/gravity/goose/outputformatters/StandardOutputFormatter.scala +++ b/src/main/scala/com/gravity/goose/outputformatters/StandardOutputFormatter.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/main/scala/com/gravity/goose/text/HashUtils.scala b/src/main/scala/com/gravity/goose/text/HashUtils.scala index 477afd3c5..313b90dfd 100644 --- a/src/main/scala/com/gravity/goose/text/HashUtils.scala +++ b/src/main/scala/com/gravity/goose/text/HashUtils.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -21,22 +21,24 @@ package com.gravity.goose.text import java.security.MessageDigest /** -* Created by Jim Plush -* User: jim -* Date: 8/14/11 -*/ + * Created by Jim Plush + * User: jim + * Date: 8/14/11 + */ object HashUtils { - def md5(s: String): String = { - val md5 = MessageDigest.getInstance("MD5") + def md5(s: String): String = { + val md5 = MessageDigest.getInstance("MD5") - md5.reset() - md5.update(s.getBytes) + md5.reset() + md5.update(s.getBytes) - val result = md5.digest().map(0xFF & _).map { "%02x".format(_) }.mkString + val result = md5.digest().map(0xFF & _).map { + "%02x".format(_) + }.mkString - result - } + result + } } \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/text/ReplaceSequence.scala b/src/main/scala/com/gravity/goose/text/ReplaceSequence.scala index 79e6d960c..0208310fc 100644 --- a/src/main/scala/com/gravity/goose/text/ReplaceSequence.scala +++ b/src/main/scala/com/gravity/goose/text/ReplaceSequence.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -32,96 +32,96 @@ import java.util.regex.Pattern * Time: 12:03 AM */ /** -* Wraps the usage of making multiple string replacements in an ordered sequence. -* For Example... instead of doing this over and over:</p> -* <blockquote> -* <pre> -* String text = " Some example text "; -* text = text.{@link String#replaceAll(String, String) replaceAll}("e", "E"); -* text = text.{@link String#replaceAll(String, String) replaceAll}(" ", "_"); -* text = text.{@link String#replaceAll(String, String) replaceAll}("^\\s+$", ""); -* </pre> -* </blockquote> -* You can use a <code>ReplaceSequence</code> like this:</p> -* <blockquote> -* <pre> -* static final betterReplacements = ReplaceSequence.{@link #create(String, String) create}("e", "E").{@link #append(String, String) append}(" ", "_").{@link #append(String) append}("^\\s+$"); -* -* void fixMyString(String text) { -* return betterReplacements.{@link #replaceAll(String) replaceAll}(text); -* } -* </pre> -* </blockquote> -* -* Internally, an ordered list of {@link Matcher}s and its associated replacement is built as the {@link #append} method is called.<br/> -* Each matcher is {@link Matcher#reset(CharSequence) reset} with the input specified in the {@link #replaceAll(String)} method.</p> -* Use of this class can improve performance if the sequence of replacements is intended to be used repeatedly throughout the life of an application.<br/> -* This is due to the fact that each {@link Pattern} is only compiled once and each {@link Matcher} is only generated once. -*/ + * Wraps the usage of making multiple string replacements in an ordered sequence. + * For Example... instead of doing this over and over:</p> + * <blockquote> + * <pre> + * String text = " Some example text "; + * text = text.{@link String#replaceAll(String, String) replaceAll}("e", "E"); + * text = text.{@link String#replaceAll(String, String) replaceAll}(" ", "_"); + * text = text.{@link String#replaceAll(String, String) replaceAll}("^\\s+$", ""); + * </pre> + * </blockquote> + * You can use a <code>ReplaceSequence</code> like this:</p> + * <blockquote> + * <pre> + * static final betterReplacements = ReplaceSequence.{@link #create(String, String) create}("e", "E").{@link #append(String, String) append}(" ", "_").{@link #append(String) append}("^\\s+$"); + * + * void fixMyString(String text) { + * return betterReplacements.{@link #replaceAll(String) replaceAll}(text); + * } + * </pre> + * </blockquote> + * + * Internally, an ordered list of {@link Matcher}s and its associated replacement is built as the {@link #append} method is called.<br/> + * Each matcher is {@link Matcher#reset(CharSequence) reset} with the input specified in the {@link #replaceAll(String)} method.</p> + * Use of this class can improve performance if the sequence of replacements is intended to be used repeatedly throughout the life of an application.<br/> + * This is due to the fact that each {@link Pattern} is only compiled once and each {@link Matcher} is only generated once. + */ object ReplaceSequence { - /** - * Creates a new <code>ReplaceSequence</code> with the first pattern to be replaced with an empty <code>String</code> - * @param firstPattern The regex {@link Pattern pattern} string for the first replacement - * @return a new instance - */ - def create(firstPattern: String): ReplaceSequence = { - create(firstPattern, string.empty) - } + /** + * Creates a new <code>ReplaceSequence</code> with the first pattern to be replaced with an empty <code>String</code> + * @param firstPattern The regex { @link Pattern pattern} string for the first replacement + * @return a new instance + */ + def create(firstPattern: String): ReplaceSequence = { + create(firstPattern, string.empty) + } - /** - * Creates a new <code>ReplaceSequence</code> with the first pattern to be replaced with the specified <code>replaceWith</code> parameter. - * @param firstPattern The regex {@link Pattern pattern} {@link String} for the first replacement - * @param replaceWith The {@link String} to replace matches of the specified pattern - * @return a new instance - */ - def create(firstPattern: String, replaceWith: String): ReplaceSequence = { - val result: ReplaceSequence = new ReplaceSequence(StringReplacement.compile(firstPattern, replaceWith)) - result - } + /** + * Creates a new <code>ReplaceSequence</code> with the first pattern to be replaced with the specified <code>replaceWith</code> parameter. + * @param firstPattern The regex { @link Pattern pattern} { @link String} for the first replacement + * @param replaceWith The { @link String} to replace matches of the specified pattern + * @return a new instance + */ + def create(firstPattern: String, replaceWith: String): ReplaceSequence = { + val result: ReplaceSequence = new ReplaceSequence(StringReplacement.compile(firstPattern, replaceWith)) + result + } } class ReplaceSequence { - /** - * Appends a new pattern to this instance in a builder pattern - * @param pattern The regex {@link Pattern pattern} {@link String} for this replacement - * @return this instance of itself for use in a builder pattern - */ - def append(pattern: String): ReplaceSequence = { - append(pattern, string.empty) - } + /** + * Appends a new pattern to this instance in a builder pattern + * @param pattern The regex { @link Pattern pattern} { @link String} for this replacement + * @return this instance of itself for use in a builder pattern + */ + def append(pattern: String): ReplaceSequence = { + append(pattern, string.empty) + } - /** - * Appends a new pattern to this instance in a builder pattern - * @param pattern The regex {@link Pattern pattern} {@link String} for this replacement - * @param replaceWith The {@link String} to replace matches of the specified pattern - * @return this instance of itself for use in a builder pattern - */ - def append(pattern: String, replaceWith: String): ReplaceSequence = { - replacements.add(StringReplacement.compile(pattern, replaceWith)) - this - } + /** + * Appends a new pattern to this instance in a builder pattern + * @param pattern The regex { @link Pattern pattern} { @link String} for this replacement + * @param replaceWith The { @link String} to replace matches of the specified pattern + * @return this instance of itself for use in a builder pattern + */ + def append(pattern: String, replaceWith: String): ReplaceSequence = { + replacements.add(StringReplacement.compile(pattern, replaceWith)) + this + } - /** - * Applies each of the replacements specified via the initial {@link #create(String)} and/or any additional via {@link #append(String)} - * @param input the {@link String} to apply all of the replacements to - * @return the resulting {@link String} after all replacements have been applied - */ - def replaceAll(input: String): String = { - if (string.isNullOrEmpty(input)) return string.empty - var mutatedString = input - import scala.collection.JavaConversions._ - for (rp <- replacements) { - mutatedString = rp.replaceAll(mutatedString) + /** + * Applies each of the replacements specified via the initial {@link #create(String)} and/or any additional via {@link #append(String)} + * @param input the { @link String} to apply all of the replacements to + * @return the resulting { @link String} after all replacements have been applied + */ + def replaceAll(input: String): String = { + if (string.isNullOrEmpty(input)) return string.empty + var mutatedString = input + import scala.collection.JavaConversions._ + for (rp <- replacements) { + mutatedString = rp.replaceAll(mutatedString) + } + mutatedString } - mutatedString - } - private def this(pair: StringReplacement) { - this () - replacements.add(pair) - } + private def this(pair: StringReplacement) { + this() + replacements.add(pair) + } - var replacements: List[StringReplacement] = new ArrayList[StringReplacement] + var replacements: List[StringReplacement] = new ArrayList[StringReplacement] } diff --git a/src/main/scala/com/gravity/goose/text/StopWords.scala b/src/main/scala/com/gravity/goose/text/StopWords.scala index 9f8669e8b..ea979154d 100644 --- a/src/main/scala/com/gravity/goose/text/StopWords.scala +++ b/src/main/scala/com/gravity/goose/text/StopWords.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -29,34 +29,34 @@ import com.gravity.goose.utils.FileHelper object StopWords { - // the confusing pattern below is basically just match any non-word character excluding white-space. - private val PUNCTUATION: StringReplacement = StringReplacement.compile("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\p{Pc}\\s]", string.empty) + // the confusing pattern below is basically just match any non-word character excluding white-space. + private val PUNCTUATION: StringReplacement = StringReplacement.compile("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\p{Pc}\\s]", string.empty) - val STOP_WORDS = FileHelper.loadResourceFile("stopwords-en.txt", StopWords.getClass).split("\n").toSet + val STOP_WORDS = FileHelper.loadResourceFile("stopwords-en.txt", StopWords.getClass).split("\n").toSet - def removePunctuation(str: String): String = { - PUNCTUATION.replaceAll(str) - } + def removePunctuation(str: String): String = { + PUNCTUATION.replaceAll(str) + } - def getStopWordCount(content: String): WordStats = { + def getStopWordCount(content: String): WordStats = { - if (string.isNullOrEmpty(content)) return WordStats.EMPTY - val ws: WordStats = new WordStats - val strippedInput: String = removePunctuation(content) + if (string.isNullOrEmpty(content)) return WordStats.EMPTY + val ws: WordStats = new WordStats + val strippedInput: String = removePunctuation(content) - val candidateWords: Array[String] = string.SPACE_SPLITTER.split(strippedInput) + val candidateWords: Array[String] = string.SPACE_SPLITTER.split(strippedInput) - val overlappingStopWords: List[String] = new ArrayList[String] + val overlappingStopWords: List[String] = new ArrayList[String] - candidateWords.foreach(w => { - if (STOP_WORDS.contains(w.toLowerCase)) overlappingStopWords.add(w.toLowerCase) - }) - ws.setWordCount(candidateWords.length) - ws.setStopWordCount(overlappingStopWords.size) - ws.setStopWords(overlappingStopWords) - ws - } + candidateWords.foreach(w => { + if (STOP_WORDS.contains(w.toLowerCase)) overlappingStopWords.add(w.toLowerCase) + }) + ws.setWordCount(candidateWords.length) + ws.setStopWordCount(overlappingStopWords.size) + ws.setStopWords(overlappingStopWords) + ws + } } diff --git a/src/main/scala/com/gravity/goose/text/StringReplacement.scala b/src/main/scala/com/gravity/goose/text/StringReplacement.scala index d542d14ad..f51b4a292 100644 --- a/src/main/scala/com/gravity/goose/text/StringReplacement.scala +++ b/src/main/scala/com/gravity/goose/text/StringReplacement.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -19,36 +19,36 @@ package com.gravity.goose.text /** -* Created by IntelliJ IDEA. -* User: robbie -* Date: 5/13/11 -* Time: 11:38 AM -*/ + * Created by IntelliJ IDEA. + * User: robbie + * Date: 5/13/11 + * Time: 11:38 AM + */ import java.util.regex.Pattern object StringReplacement { - def compile(pattern: String, replaceWith: String): StringReplacement = { - if (string.isNullOrEmpty(pattern)) throw new IllegalArgumentException("Patterns must not be null or empty!") - var p: Pattern = Pattern.compile(pattern) - return new StringReplacement(p, replaceWith) - } + def compile(pattern: String, replaceWith: String): StringReplacement = { + if (string.isNullOrEmpty(pattern)) throw new IllegalArgumentException("Patterns must not be null or empty!") + var p: Pattern = Pattern.compile(pattern) + return new StringReplacement(p, replaceWith) + } } class StringReplacement { - private def this(pattern: Pattern, replaceWith: String) { - this () - this.pattern = pattern - this.replaceWith = replaceWith - } - - def replaceAll(input: String): String = { - if (string.isNullOrEmpty(input)) return string.empty - return pattern.matcher(input).replaceAll(replaceWith) - } - - private var pattern: Pattern = null - private var replaceWith: String = null + private def this(pattern: Pattern, replaceWith: String) { + this() + this.pattern = pattern + this.replaceWith = replaceWith + } + + def replaceAll(input: String): String = { + if (string.isNullOrEmpty(input)) return string.empty + return pattern.matcher(input).replaceAll(replaceWith) + } + + private var pattern: Pattern = null + private var replaceWith: String = null } diff --git a/src/main/scala/com/gravity/goose/text/StringSplitter.scala b/src/main/scala/com/gravity/goose/text/StringSplitter.scala index 0efbb5fc1..c3d8592ea 100644 --- a/src/main/scala/com/gravity/goose/text/StringSplitter.scala +++ b/src/main/scala/com/gravity/goose/text/StringSplitter.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -19,26 +19,26 @@ package com.gravity.goose.text /** -* Created by IntelliJ IDEA. -* User: robbie -* Date: 5/13/11 -* Time: 3:53 PM -*/ + * Created by IntelliJ IDEA. + * User: robbie + * Date: 5/13/11 + * Time: 3:53 PM + */ import java.util.regex.Pattern class StringSplitter { - def this(pattern: String) { - this () - this.pattern = Pattern.compile(pattern) - } + def this(pattern: String) { + this() + this.pattern = Pattern.compile(pattern) + } - def split(input: String): Array[String] = { - if (string.isNullOrEmpty(input)) return string.emptyArray - pattern.split(input) - } + def split(input: String): Array[String] = { + if (string.isNullOrEmpty(input)) return string.emptyArray + pattern.split(input) + } - private var pattern: Pattern = null + private var pattern: Pattern = null } diff --git a/src/main/scala/com/gravity/goose/text/WordStats.scala b/src/main/scala/com/gravity/goose/text/WordStats.scala index d6b6006c4..6ea031fae 100644 --- a/src/main/scala/com/gravity/goose/text/WordStats.scala +++ b/src/main/scala/com/gravity/goose/text/WordStats.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -22,55 +22,55 @@ import java.util.ArrayList import java.util.List /** -* User: Jim Plush -* Date: Oct 29, 2010 -* Time: 3:59:44 PM -*/ + * User: Jim Plush + * Date: Oct 29, 2010 + * Time: 3:59:44 PM + */ object WordStats { - var EMPTY: WordStats = new WordStats + var EMPTY: WordStats = new WordStats } class WordStats { - import WordStats._ - - /** - * total number of stopwords or good words that we can calculate - */ - var stopWordCount: Int = 0 - /** - * total number of words on a node - */ - var wordCount: Int = 0 - /** - * holds an actual list of the stop words we found - */ - var stopWords: List[String] = new ArrayList[String] - - def getStopWords: List[String] = { - stopWords - } - - def setStopWords(words: List[String]) { - stopWords = words - } - - def getStopWordCount: Int = { - stopWordCount - } - - def setStopWordCount(wordcount: Int) { - stopWordCount = wordcount - } - - def getWordCount: Int = { - wordCount - } - - def setWordCount(cnt: Int) { - wordCount = cnt - } + import WordStats._ + + /** + * total number of stopwords or good words that we can calculate + */ + var stopWordCount: Int = 0 + /** + * total number of words on a node + */ + var wordCount: Int = 0 + /** + * holds an actual list of the stop words we found + */ + var stopWords: List[String] = new ArrayList[String] + + def getStopWords: List[String] = { + stopWords + } + + def setStopWords(words: List[String]) { + stopWords = words + } + + def getStopWordCount: Int = { + stopWordCount + } + + def setStopWordCount(wordcount: Int) { + stopWordCount = wordcount + } + + def getWordCount: Int = { + wordCount + } + + def setWordCount(cnt: Int) { + wordCount = cnt + } } diff --git a/src/main/scala/com/gravity/goose/text/string.scala b/src/main/scala/com/gravity/goose/text/string.scala index d21594986..ae39b9a4e 100644 --- a/src/main/scala/com/gravity/goose/text/string.scala +++ b/src/main/scala/com/gravity/goose/text/string.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -19,22 +19,22 @@ package com.gravity.goose.text /** -* Created by IntelliJ IDEA. -* User: robbie -* Date: 5/13/11 -* Time: 12:11 AM -*/ + * Created by IntelliJ IDEA. + * User: robbie + * Date: 5/13/11 + * Time: 12:11 AM + */ object string { - def isNullOrEmpty(input: String): Boolean = { - if (input == null) return true - if (input.length == 0) return true - false - } + def isNullOrEmpty(input: String): Boolean = { + if (input == null) return true + if (input.length == 0) return true + false + } - val empty: String = "" - val emptyArray: Array[String] = Array[String](empty) - var SPACE_SPLITTER: StringSplitter = new StringSplitter(" ") + val empty: String = "" + val emptyArray: Array[String] = Array[String](empty) + var SPACE_SPLITTER: StringSplitter = new StringSplitter(" ") } diff --git a/src/main/scala/com/gravity/goose/utils/FileHelper.scala b/src/main/scala/com/gravity/goose/utils/FileHelper.scala index 2fb434832..63c6f5869 100644 --- a/src/main/scala/com/gravity/goose/utils/FileHelper.scala +++ b/src/main/scala/com/gravity/goose/utils/FileHelper.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -30,15 +30,15 @@ import java.io.{IOException, InputStream} object FileHelper extends Logging { - def loadResourceFile[A](filename: String, cls: Class[A]): String = { - var filedata: String = "" - val is: InputStream = cls.getResourceAsStream(filename) - try { - filedata = IOUtils.toString(is, "UTF-8") + def loadResourceFile[A](filename: String, cls: Class[A]): String = { + var filedata: String = "" + val is: InputStream = cls.getResourceAsStream(filename) + try { + filedata = IOUtils.toString(is, "UTF-8") + } + catch { + case e: IOException => warn(e, e.toString) + } + filedata } - catch { - case e: IOException => warn(e, e.toString) - } - filedata - } } \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/utils/Logging.scala b/src/main/scala/com/gravity/goose/utils/Logging.scala index d3762c552..c47599922 100644 --- a/src/main/scala/com/gravity/goose/utils/Logging.scala +++ b/src/main/scala/com/gravity/goose/utils/Logging.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -37,34 +37,54 @@ import java.text.MessageFormat */ trait Logging extends CanLog { - val logger: Logger = Logging.getLogger(this) + val logger: Logger = Logging.getLogger(this) - private def formatmsg(msg: String, refs: Seq[Any]): String = { - new MessageFormat(msg).format(refs.toArray) - } + private def formatmsg(msg: String, refs: Seq[Any]): String = { + new MessageFormat(msg).format(refs.toArray) + } - private def checkFormat(msg: String, refs: Seq[Any]): String = - if (refs.size > 0) formatmsg(msg, refs) else msg + private def checkFormat(msg: String, refs: Seq[Any]): String = + if (refs.size > 0) formatmsg(msg, refs) else msg - def trace(msg: String, refs: Any*) { logger trace checkFormat(msg, refs) } + def trace(msg: String, refs: Any*) { + logger trace checkFormat(msg, refs) + } - def trace(t: Throwable, msg: String, refs: Any*) { logger trace(checkFormat(msg, refs), t) } + def trace(t: Throwable, msg: String, refs: Any*) { + logger trace(checkFormat(msg, refs), t) + } - def info(msg: String, refs: Any*) { logger info checkFormat(msg, refs) } + def info(msg: String, refs: Any*) { + logger info checkFormat(msg, refs) + } - def info(t: Throwable, msg: String, refs: Any*) { logger info (checkFormat(msg, refs), t) } + def info(t: Throwable, msg: String, refs: Any*) { + logger info(checkFormat(msg, refs), t) + } - def warn(msg: String, refs: Any*) { logger warn checkFormat(msg, refs) } + def warn(msg: String, refs: Any*) { + logger warn checkFormat(msg, refs) + } - def warn(t: Throwable, msg: String, refs: Any*) { logger warn (checkFormat(msg, refs), t) } + def warn(t: Throwable, msg: String, refs: Any*) { + logger warn(checkFormat(msg, refs), t) + } - def critical(msg: String, refs: Any*) { logger error checkFormat(msg, refs) } + def critical(msg: String, refs: Any*) { + logger error checkFormat(msg, refs) + } - def critical(t: Throwable, msg: String, refs: Any*) { logger error (checkFormat(msg, refs), t) } + def critical(t: Throwable, msg: String, refs: Any*) { + logger error(checkFormat(msg, refs), t) + } - def debug(msg: String, refs: Any*) { logger debug checkFormat(msg, refs) } + def debug(msg: String, refs: Any*) { + logger debug checkFormat(msg, refs) + } - def debug(t: Throwable, msg: String, refs: Any*) { logger debug (checkFormat(msg, refs), t) } + def debug(t: Throwable, msg: String, refs: Any*) { + logger debug(checkFormat(msg, refs), t) + } } @@ -73,38 +93,38 @@ trait Logging extends CanLog { */ object Logging { - def loggerNameForClass(className: String) = { - if (className endsWith "$") { - className.substring(0, className.length - 1) - } - else { - className + def loggerNameForClass(className: String) = { + if (className endsWith "$") { + className.substring(0, className.length - 1) + } + else { + className + } } - } - def getLogger(logging: AnyRef) = LoggerFactory.getLogger(loggerNameForClass(logging.getClass.getName)) + def getLogger(logging: AnyRef) = LoggerFactory.getLogger(loggerNameForClass(logging.getClass.getName)) } trait CanLog { - def logger: Logger + def logger: Logger - def trace(msg: String, refs: Any*) + def trace(msg: String, refs: Any*) - def trace(t: Throwable, msg: String, refs: Any*) + def trace(t: Throwable, msg: String, refs: Any*) - def info(msg: String, refs: Any*) + def info(msg: String, refs: Any*) - def info(t: Throwable, msg: String, refs: Any*) + def info(t: Throwable, msg: String, refs: Any*) - def warn(msg: String, refs: Any*) + def warn(msg: String, refs: Any*) - def warn(t: Throwable, msg: String, refs: Any*) + def warn(t: Throwable, msg: String, refs: Any*) - def critical(msg: String, refs: Any*) + def critical(msg: String, refs: Any*) - def critical(t: Throwable, msg: String, refs: Any*) + def critical(t: Throwable, msg: String, refs: Any*) - def debug(msg: String, refs: Any*) + def debug(msg: String, refs: Any*) - def debug(t: Throwable, msg: String, refs: Any*) + def debug(t: Throwable, msg: String, refs: Any*) } \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/utils/URLHelper.scala b/src/main/scala/com/gravity/goose/utils/URLHelper.scala index ac0219faf..e1601cbe2 100644 --- a/src/main/scala/com/gravity/goose/utils/URLHelper.scala +++ b/src/main/scala/com/gravity/goose/utils/URLHelper.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -31,35 +31,35 @@ case class ParsingCandidate(urlString: String, linkhash: String, url: URL) object URLHelper extends Logging { - private val ESCAPED_FRAGMENT_REPLACEMENT: StringReplacement = StringReplacement.compile("#!", "?_escaped_fragment_=") + private val ESCAPED_FRAGMENT_REPLACEMENT: StringReplacement = StringReplacement.compile("#!", "?_escaped_fragment_=") - /** - * returns a ParseCandidate object that is a valid URL - */ - def getCleanedUrl(urlToCrawl: String): Option[ParsingCandidate] = { + /** + * returns a ParseCandidate object that is a valid URL + */ + def getCleanedUrl(urlToCrawl: String): Option[ParsingCandidate] = { - val finalURL = - if (urlToCrawl.contains("#!")) ESCAPED_FRAGMENT_REPLACEMENT.replaceAll(urlToCrawl) else urlToCrawl + val finalURL = + if (urlToCrawl.contains("#!")) ESCAPED_FRAGMENT_REPLACEMENT.replaceAll(urlToCrawl) else urlToCrawl - try { - val url = new URL(finalURL) - val linkhash = HashUtils.md5(finalURL) - Some(ParsingCandidate(finalURL, linkhash, url)) - } - catch { - case e: MalformedURLException => { - warn("{0} - is a malformed URL and cannot be processed", urlToCrawl) - None - } - case unknown: Exception => { - critical("Unable to process URL: {0} due to an unexpected exception:\n\tException Type: {1}\n\tException Message: {2}\n\tException Stack:\n{3}", - urlToCrawl, - unknown.getClass.getCanonicalName, - unknown.getMessage, - unknown.getStackTraceString) + try { + val url = new URL(finalURL) + val linkhash = HashUtils.md5(finalURL) + Some(ParsingCandidate(finalURL, linkhash, url)) + } + catch { + case e: MalformedURLException => { + warn("{0} - is a malformed URL and cannot be processed", urlToCrawl) + None + } + case unknown: Exception => { + critical("Unable to process URL: {0} due to an unexpected exception:\n\tException Type: {1}\n\tException Message: {2}\n\tException Stack:\n{3}", + urlToCrawl, + unknown.getClass.getCanonicalName, + unknown.getMessage, + unknown.getStackTraceString) - None - } + None + } + } } - } } \ No newline at end of file From 50ed8559db7cd2dece546166363a2e0305380327 Mon Sep 17 00:00:00 2001 From: Anton Malinovskiy <tos@mail333.com> Date: Wed, 26 Sep 2012 10:17:27 +0200 Subject: [PATCH 114/347] Added log4j support in console mode --- pom.xml | 1 - src/main/resources/log4j.properties | 15 +++++++++++++++ .../scala/com/gravity/goose/TalkToMeGoose.scala | 6 ++++-- 3 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/log4j.properties diff --git a/pom.xml b/pom.xml index bfc6b95e8..e3541817b 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,6 @@ <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.1</version> - <scope>test</scope> </dependency> <dependency> <groupId>org.jsoup</groupId> diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties new file mode 100644 index 000000000..551271ae7 --- /dev/null +++ b/src/main/resources/log4j.properties @@ -0,0 +1,15 @@ +# A default log4j configuration for log4j users. +# +# To use this configuration, deploy it into your application's WEB-INF/classes +# directory. You are also encouraged to edit it as you like. + +# Configure the console as our one appender +log4j.appender.A1=org.apache.log4j.ConsoleAppender +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%c] - %m%n + +log4j.logger.com.google.appengine.repackaged.org.apache.http=WARN, A1 +log4j.logger.org.apache.http.wire=WARN, A1 + + +log4j.logger.com.gravity.goose=TRACE, A1 \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala index f7b58b584..b21a26d4c 100644 --- a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala +++ b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala @@ -1,6 +1,7 @@ package com.gravity.goose import com.google.appengine.tools.development.testing.{LocalServiceTestHelper, LocalURLFetchServiceTestConfig} +import org.apache.log4j.BasicConfigurator /** * Created by Jim Plush @@ -31,15 +32,16 @@ object TalkToMeGoose { def main(args: Array[String]) { try { Helper.setUp() + BasicConfigurator.configure(); + println("URL to extract article from:") - val url: String = readLine() + val url: String = args(0) val config: Configuration = new Configuration config.enableImageFetching = false val goose = new Goose(config) val article = goose.extractContent(url) - println(article.cleanedArticleText) } catch { case e: Exception => { From d39e95a69e88fa78ae0b2db60e2446032a80cc62 Mon Sep 17 00:00:00 2001 From: Anton Malinovskiy <tos@mail333.com> Date: Thu, 27 Sep 2012 00:38:55 +0200 Subject: [PATCH 115/347] Made goose a little but more Spring friendly taking configuration as a setter --- pom.xml | 2 +- src/main/scala/com/gravity/goose/Goose.scala | 9 +++++++-- src/main/scala/com/gravity/goose/TalkToMeGoose.scala | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index e3541817b..71371e408 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ <groupId>com.gravity</groupId> <artifactId>goose</artifactId> - <version>2.1.19</version> + <version>2.1.20</version> <packaging>jar</packaging> <name>goose</name> <url>http://maven.apache.org</url> diff --git a/src/main/scala/com/gravity/goose/Goose.scala b/src/main/scala/com/gravity/goose/Goose.scala index 97c59ddf2..fe2477598 100644 --- a/src/main/scala/com/gravity/goose/Goose.scala +++ b/src/main/scala/com/gravity/goose/Goose.scala @@ -20,15 +20,20 @@ package com.gravity.goose import network.HtmlFetcher import java.io.File +import org.apache.commons.lang.NotImplementedException /** * Created by Jim Plush - Gravity.com * Date: 8/14/11 */ -class Goose(config: Configuration = new Configuration) { +class Goose() { + def config : Configuration - initializeEnvironment() + def setConfig(config: Configuration) = { + this.config = config + if (config.getEnableImageFetching) throw new NotImplementedException("image fetching should be rewritten before it can be used in GAE") + } /** * Main method to extract an article object from a URL, pass in a url and get back a Article diff --git a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala index b21a26d4c..bd87d4dc0 100644 --- a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala +++ b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala @@ -35,7 +35,7 @@ object TalkToMeGoose { BasicConfigurator.configure(); println("URL to extract article from:") - val url: String = args(0) + val url: String = if (args.isEmpty) readLine() else args(0) val config: Configuration = new Configuration config.enableImageFetching = false From 431878ec1f8e2e6c1dfbec8bdb2b326dcda0ae45 Mon Sep 17 00:00:00 2001 From: Anton Malinovskiy <tos@mail333.com> Date: Thu, 27 Sep 2012 01:08:16 +0200 Subject: [PATCH 116/347] returning tags as a java set --- src/main/scala/com/gravity/goose/Article.scala | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/scala/com/gravity/goose/Article.scala b/src/main/scala/com/gravity/goose/Article.scala index 6d76b631f..44d8a609b 100644 --- a/src/main/scala/com/gravity/goose/Article.scala +++ b/src/main/scala/com/gravity/goose/Article.scala @@ -122,4 +122,8 @@ class Article { * @return a { @link Map Map<String,String>} of property name to property vaue (represented as a { @link String}. */ var additionalData: Map[String, String] = Map.empty + + def getTagsSet: java.util.Set[String] = { + JavaConversions.setAsJavaSet(tags) + } } \ No newline at end of file From 2b2d1528b601ac05fc2c57d634e638f7c7ade805 Mon Sep 17 00:00:00 2001 From: Anton Malinovskiy <tos@mail333.com> Date: Thu, 27 Sep 2012 09:13:04 +0200 Subject: [PATCH 117/347] Started returning tags as java.util.Set --- pom.xml | 2 +- src/main/scala/com/gravity/goose/Article.scala | 6 +++--- src/main/scala/com/gravity/goose/Crawler.scala | 1 + src/main/scala/com/gravity/goose/Goose.scala | 8 ++++---- src/main/scala/com/gravity/goose/TalkToMeGoose.scala | 5 ++++- 5 files changed, 13 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index 71371e408..3d263745f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ <groupId>com.gravity</groupId> <artifactId>goose</artifactId> - <version>2.1.20</version> + <version>2.1.20-SNAPSHOT</version> <packaging>jar</packaging> <name>goose</name> <url>http://maven.apache.org</url> diff --git a/src/main/scala/com/gravity/goose/Article.scala b/src/main/scala/com/gravity/goose/Article.scala index 44d8a609b..9c1b292d7 100644 --- a/src/main/scala/com/gravity/goose/Article.scala +++ b/src/main/scala/com/gravity/goose/Article.scala @@ -78,6 +78,9 @@ class Article { */ var tags: Set[String] = null + def getTagsSet(): java.util.Set[String] = { + JavaConversions.setAsJavaSet(tags) + } /** * holds a list of any movies we found on the page like youtube, vimeo */ @@ -123,7 +126,4 @@ class Article { */ var additionalData: Map[String, String] = Map.empty - def getTagsSet: java.util.Set[String] = { - JavaConversions.setAsJavaSet(tags) - } } \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index 7c11a566a..ddf398d37 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -28,6 +28,7 @@ import org.jsoup.Jsoup import java.io.File import utils.{ParsingCandidate, URLHelper, Logging} import com.gravity.goose.outputformatters.{StandardOutputFormatter, OutputFormatter} +import concurrent.JavaConversions /** * Created by Jim Plush diff --git a/src/main/scala/com/gravity/goose/Goose.scala b/src/main/scala/com/gravity/goose/Goose.scala index fe2477598..a3fad9c89 100644 --- a/src/main/scala/com/gravity/goose/Goose.scala +++ b/src/main/scala/com/gravity/goose/Goose.scala @@ -28,11 +28,11 @@ import org.apache.commons.lang.NotImplementedException */ class Goose() { - def config : Configuration + var config : Configuration = new Configuration() - def setConfig(config: Configuration) = { - this.config = config - if (config.getEnableImageFetching) throw new NotImplementedException("image fetching should be rewritten before it can be used in GAE") + def setConfig(configuration: Configuration) = { + config = configuration + if (configuration.getEnableImageFetching) throw new NotImplementedException("image fetching should be rewritten before it can be used in GAE") } /** diff --git a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala index bd87d4dc0..32e2f22fc 100644 --- a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala +++ b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala @@ -40,8 +40,11 @@ object TalkToMeGoose { val config: Configuration = new Configuration config.enableImageFetching = false - val goose = new Goose(config) + val goose = new Goose() + goose.setConfig(config) + val article = goose.extractContent(url) + println("Tags: " + article.getTagsSet()) println(article.cleanedArticleText) } catch { case e: Exception => { From e5c13515c32b3d9c00b9226d7cf0038b4eeeb7dd Mon Sep 17 00:00:00 2001 From: Anton Malinovskiy <tos@mail333.com> Date: Thu, 27 Sep 2012 17:10:01 +0200 Subject: [PATCH 118/347] Commented out local files operations in case images are not enabled, local file operations do not work anyways --- .../scala/com/gravity/goose/Crawler.scala | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index ddf398d37..416b20cfc 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -157,16 +157,18 @@ class Crawler(config: Configuration) { def releaseResources(article: Article) = { trace(logPrefix + "STARTING TO RELEASE ALL RESOURCES") - val dir: File = new File(config.localStoragePath) - - dir.list.foreach(filename => { - if (filename.startsWith(article.linkhash)) { - val f: File = new File(dir.getAbsolutePath + "/" + filename) - if (!f.delete) { - warn("Unable to remove temp file: " + filename) + if (config.getEnableImageFetching) { + val dir: File = new File(config.localStoragePath) + + dir.list.foreach(filename => { + if (filename.startsWith(article.linkhash)) { + val f: File = new File(dir.getAbsolutePath + "/" + filename) + if (!f.delete) { + warn("Unable to remove temp file: " + filename) + } } - } - }) + }) + } } } From 496adef0a635216874ac95438d606ce66eaadddc Mon Sep 17 00:00:00 2001 From: Jay Taylor <outtatime@gmail.com> Date: Mon, 8 Oct 2012 20:30:56 -0700 Subject: [PATCH 119/347] Maven -> SBT. --- pom.xml | 154 --------------------------------------- project/GooseBuild.scala | 96 ++++++++++++++++++++++++ project/build.properties | 1 + project/plugins.sbt | 9 +++ 4 files changed, 106 insertions(+), 154 deletions(-) delete mode 100644 pom.xml create mode 100644 project/GooseBuild.scala create mode 100644 project/build.properties create mode 100644 project/plugins.sbt diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 2d9e8aa5b..000000000 --- a/pom.xml +++ /dev/null @@ -1,154 +0,0 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - - <groupId>com.gravity</groupId> - <artifactId>goose</artifactId> - <version>2.1.19</version> - <packaging>jar</packaging> - <name>goose</name> - <url>http://maven.apache.org</url> - <properties> - <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - </properties> - - <dependencies> - <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - <version>4.8.1</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - <version>1.6.1</version> - <type>jar</type> - <scope>compile</scope> - </dependency> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-log4j12</artifactId> - <version>1.6.1</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.jsoup</groupId> - <artifactId>jsoup</artifactId> - <version>1.5.2</version> - </dependency> - <dependency> - <groupId>commons-io</groupId> - <artifactId>commons-io</artifactId> - <version>2.0.1</version> - </dependency> - - <dependency> - <groupId>org.scala-lang</groupId> - <artifactId>scala-compiler</artifactId> - <version>2.9.0-1</version> - <scope>compile</scope> - </dependency> - - <dependency> - <groupId>org.scala-lang</groupId> - <artifactId>scala-library</artifactId> - <version>2.9.0-1</version> - </dependency> - - <dependency> - <groupId>org.apache.httpcomponents</groupId> - <artifactId>httpclient</artifactId> - <version>4.1.2</version> - </dependency> - <dependency> - <groupId>commons-lang</groupId> - <artifactId>commons-lang</artifactId> - <version>2.6</version> - </dependency> - </dependencies> - - <!-- - Hey... since we're open source, let's compile the source and javadocs into jars as well - --> - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <version>2.6</version> - <configuration> - <useFile>false</useFile> - <disableXmlReport>true</disableXmlReport> - <includes> - <include>**/*Test.*</include> - </includes> - <excludes> - <exclude>**/*IT.*</exclude> - </excludes> - </configuration> - </plugin> - <plugin> - <groupId>org.scala-tools</groupId> - <artifactId>maven-scala-plugin</artifactId> - <version>2.14.3</version> - <configuration> - <charset>UTF-8</charset> - <jvmArgs> - <jvmArg>-Xmx1024m</jvmArg> - </jvmArgs> - </configuration> - <executions> - <execution> - <id>compile</id> - <goals> - <goal>compile</goal> - </goals> - <phase>compile</phase> - </execution> - <execution> - <id>test-compile</id> - <goals> - <goal>testCompile</goal> - </goals> - <phase>test-compile</phase> - </execution> - <execution> - <phase>process-resources</phase> - <goals> - <goal>compile</goal> - </goals> - </execution> - - </executions> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-source-plugin</artifactId> - <version>2.1.2</version> - <executions> - <execution> - <id>attach-sources</id> - <goals> - <goal>jar</goal> - </goals> - </execution> - </executions> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-javadoc-plugin</artifactId> - <version>2.8</version> - <executions> - <execution> - <id>attach-javadocs</id> - <goals> - <goal>jar</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - -</project> \ No newline at end of file diff --git a/project/GooseBuild.scala b/project/GooseBuild.scala new file mode 100644 index 000000000..15f3b39e7 --- /dev/null +++ b/project/GooseBuild.scala @@ -0,0 +1,96 @@ +import sbt._ +import Keys._ + + +object GooseBuild extends Build { + + lazy val goose = Project( + id = "goose", + base = file("."), + settings = Project.defaultSettings ++ Seq( + description := "Html Content / Article Extractor in Scala", + organization := "com.gravity", + version := "2.1.21-SNAPSHOT", + version <<= version { v => //only release *if* -Drelease=true is passed to JVM + val release = Option(System.getProperty("release")) == Some("true") + if (release) { + v + } else { + val suffix = Option(System.getProperty("suffix")) + val i = (v.indexOf('-'), v.length) match { + case (x, l) if x < 0 => l + case (x, l) if v substring (x + 1) matches """\d+""" => l //patch level, not RCx + case (x, _) => x + } + v.substring(0, i) + "-" + (suffix getOrElse "SNAPSHOT") + } + }, + parallelExecution := false, + publishMavenStyle := true, + scalaVersion := "2.9.2", + crossScalaVersions := Seq("2.9.2", "2.9.1", "2.9.0"), + licenses := Seq("Apache 2" -> url("http://www.apache.org/licenses/LICENSE-2.0.txt")), + homepage := Some(url("http://github.com/jaytaylor/goose")), + pomExtra := ( + <scm> + <url>git@github.com:jaytaylor/goose.git</url> + <connection>scm:git:git@github.com:jaytaylor/goose.git</connection> + </scm> + <developers> + <developer> + <id>jaytaylor</id> + <name>Jay Taylor</name> + <url>https://github.com/jaytaylor</url> + </developer> + </developers> + ), + publishTo <<= version { v => //add credentials to ~/.sbt/sonatype.sbt + /*val nexus = "https://oss.sonatype.org/" + if (v.trim.endsWith("SNAPSHOT")) + Some("snapshots" at nexus + "content/repositories/snapshots") + else + Some("releases" at nexus + "service/local/staging/deploy/maven2")*/ + Some(Resolver.sftp( + "Scala.sh Repository", + "scala.sh", + "/var/www/scala.sh/public_html/repositories/" + ( + if (v.trim.endsWith("SNAPSHOT")) { "snapshots" } else { "releases" } + ) + )) + }, + publishArtifact in Test := false, + pomIncludeRepository := { _ => false }, + resolvers ++= Seq( + "Sonatype Releases" at "http://oss.sonatype.org/content/repositories/releases", + "JBoss Repository" at "http://repository.jboss.org/nexus/content/groups/public", + "CodaHale Repository" at "http://repo.codahale.com", + "Scala.sh Releases" at "http://scala.sh/repositories/releases", + "Scala.sh Snapshots" at "http://scala.sh/repositories/snapshots", + "Maven1" at "http://repo1.maven.org/maven2", + "Typesafe Artifactory" at "http://typesafe.artifactoryonline.com/typesafe/repo", + "Typesafe Releases" at "http://repo.typesafe.com/typesafe/releases", + "iBiblio Maven2" at "http://mirrors.ibiblio.org/maven2" + ), + libraryDependencies ++= Seq( + "junit" % "junit" % "4.8.1", + "org.slf4j" % "slf4j-api" % "1.6.1", + "org.slf4j" % "slf4j-log4j12" % "1.6.1", + "org.jsoup" % "jsoup" % "1.5.2", + "commons-io" % "commons-io" % "2.0.1", + "org.apache.httpcomponents" % "httpclient" % "4.1.2", + "commons-lang" % "commons-lang" % "2.6" + ), + libraryDependencies <++= scalaVersion { sv => + Seq( + "org.scala-lang" % "scalap" % sv, + if (sv startsWith "2.9") { + "org.scalatest" % "scalatest_2.9.1" % "1.6.1" % "test" + } else { + "org.scalatest" % "scalatest_2.8.2" % "1.5.1" % "test" + } + ) + } + ) + ) +} + diff --git a/project/build.properties b/project/build.properties new file mode 100644 index 000000000..390c1af8c --- /dev/null +++ b/project/build.properties @@ -0,0 +1 @@ +sbt.version=0.11.3 \ No newline at end of file diff --git a/project/plugins.sbt b/project/plugins.sbt new file mode 100644 index 000000000..c0c3a6618 --- /dev/null +++ b/project/plugins.sbt @@ -0,0 +1,9 @@ +// Comment to get more information during initialization +logLevel := Level.Warn + +// The Typesafe repository +resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/" + +// Use the Play sbt plugin for Play projects +//addSbtPlugin("play" % "sbt-plugin" % "2.1-SNAPSHOT") +addSbtPlugin("play" % "sbt-plugin" % "2.1-07132012") From 16d3508cf19efbbb0b9beb8dfbfa8ae837a79f80 Mon Sep 17 00:00:00 2001 From: Jay Taylor <outtatime@gmail.com> Date: Mon, 8 Oct 2012 20:33:01 -0700 Subject: [PATCH 120/347] Consider <code> tags. Support more video sites. --- .../goose/extractors/ContentExtractor.scala | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index 51838e335..55c9127a0 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -53,7 +53,7 @@ trait ContentExtractor { val SPACE_SPLITTER: StringSplitter = new StringSplitter(" ") val NO_STRINGS = Set.empty[String] val A_REL_TAG_SELECTOR: String = "a[rel=tag], a[href*=/tag/]" - val TOP_NODE_TAGS = new TagsEvaluator(Set("p", "td", "pre")) + val TOP_NODE_TAGS = new TagsEvaluator(Set("p", "td", "pre", "code")) def getTitle(article: Article): String = { var title: String = string.empty @@ -427,8 +427,14 @@ trait ContentExtractor { def extractVideos(node: Element): List[Element] = { val candidates: ArrayList[Element] = new ArrayList[Element] val goodMovies = mutable.Buffer[Element]() + val youtubeStr = "youtube" val vimdeoStr = "vimeo" + val bliptvStr = "blip" + val flickrStr = "flickr" + val veohStr = "veoh" + val dailymotionStr = "dailymotion" + try { node.parent.getElementsByTag("embed").foreach(candidates.add(_)) node.parent.getElementsByTag("object").foreach(candidates.add(_)) @@ -439,7 +445,14 @@ trait ContentExtractor { val attrs: Attributes = el.attributes() for (a <- attrs) { try { - if ((a.getValue.contains(youtubeStr) || a.getValue.contains(vimdeoStr)) && (a.getKey == "src")) { + if (( + a.getValue.contains(youtubeStr) || + a.getValue.contains(bliptvStr) || + a.getValue.contains(flickrStr) || + a.getValue.contains(veohStr) || + a.getValue.contains(dailymotionStr) || + a.getValue.contains(vimdeoStr) + ) && (a.getKey == "src")) { trace(logPrefix + "This page has a video!: " + a.getValue) goodMovies += el } @@ -635,4 +648,4 @@ trait ContentExtractor { sb.append(e.attr("class")) sb.toString() } -} \ No newline at end of file +} From 304cb96f9b86a7a1aff7d0bf9a91c00d830484f7 Mon Sep 17 00:00:00 2001 From: Anton Malinovskiy <tos@mail333.com> Date: Sat, 20 Oct 2012 01:52:42 +0200 Subject: [PATCH 121/347] fixed compildation errors for some tests --- src/test/scala/com/gravity/goose/GooseTest.scala | 3 ++- src/test/scala/com/gravity/goose/PerformanceTester.scala | 3 ++- src/test/scala/com/gravity/goose/TestUtils.scala | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/test/scala/com/gravity/goose/GooseTest.scala b/src/test/scala/com/gravity/goose/GooseTest.scala index 7235a34ef..ff41fdfe3 100644 --- a/src/test/scala/com/gravity/goose/GooseTest.scala +++ b/src/test/scala/com/gravity/goose/GooseTest.scala @@ -39,7 +39,8 @@ class GooseTest { def badlink() { implicit val config = new Configuration val url = "http://nolove888.com/2011/08/13/LINKNOTEXISTS" - val goose = new Goose(config) + val goose = new Goose() + goose.setConfig(config) val article = goose.extractContent(url) assertNull(article.topNode) } diff --git a/src/test/scala/com/gravity/goose/PerformanceTester.scala b/src/test/scala/com/gravity/goose/PerformanceTester.scala index 475aab502..e9bc4d944 100644 --- a/src/test/scala/com/gravity/goose/PerformanceTester.scala +++ b/src/test/scala/com/gravity/goose/PerformanceTester.scala @@ -24,7 +24,8 @@ object PerformanceTester { System.out.println("testing performance of general goose extraction algos") implicit val config = TestUtils.NO_IMAGE_CONFIG - val goose = new Goose(config) + val goose = new Goose() + goose.setConfig(config) val html = FileHelper.loadResourceFile(TestUtils.staticHtmlDir + "scribd1.txt", Goose.getClass) val url = "http://www.scribd.com/doc/52584146/Microfinance-and-Poverty-Reduction?in_collection=2987942" diff --git a/src/test/scala/com/gravity/goose/TestUtils.scala b/src/test/scala/com/gravity/goose/TestUtils.scala index 58fc1cb87..538120025 100644 --- a/src/test/scala/com/gravity/goose/TestUtils.scala +++ b/src/test/scala/com/gravity/goose/TestUtils.scala @@ -38,7 +38,8 @@ object TestUtils { * returns an article object from a crawl */ def getArticle(url: String, rawHTML: String = null)(implicit config: Configuration): Article = { - val goose = new Goose(config) + val goose = new Goose() + goose.setConfig(config) val article = goose.extractContent(url, rawHTML) // goose.shutdownNetwork() article From e01ff0291a50e6ba644c04af21d0186256c1027a Mon Sep 17 00:00:00 2001 From: Jason Bennett <jbennett@unfold.com> Date: Fri, 9 Nov 2012 16:24:46 -0800 Subject: [PATCH 122/347] Ignore eclipse files --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index 615c5c5c9..b815230d9 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,8 @@ target/ /goose.iml /goose.ipr /goose.iws +.cache +.classpath +.project +.settings/ + From fb4158f4f347561c705aa873e9595f75b3a4ce14 Mon Sep 17 00:00:00 2001 From: Jason Bennett <jbennett@unfold.com> Date: Fri, 9 Nov 2012 16:25:28 -0800 Subject: [PATCH 123/347] Remove CNN css element, as it gives bogus images --- src/main/resources/com/gravity/goose/images/known-image-css.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/com/gravity/goose/images/known-image-css.txt b/src/main/resources/com/gravity/goose/images/known-image-css.txt index d9ffd3526..e8e444ca9 100644 --- a/src/main/resources/com/gravity/goose/images/known-image-css.txt +++ b/src/main/resources/com/gravity/goose/images/known-image-css.txt @@ -1,5 +1,5 @@ latimes.com^thumbnail -cnn.com^storytext|cnn_strycntntlft +cnn.com^storytext foxnews.com^entry-content msn.com^articleText go.com^mediaimage From 5136fedf3222b857dde7ce89071d32d573e6f278 Mon Sep 17 00:00:00 2001 From: Jason Bennett <jbennett@unfold.com> Date: Fri, 9 Nov 2012 16:26:56 -0800 Subject: [PATCH 124/347] Check for meta tag images before divining large images --- .../gravity/goose/images/UpgradedImageIExtractor.scala | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala index 787e9c0c1..050f38319 100644 --- a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala +++ b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala @@ -57,6 +57,11 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } } + checkForMetaTag match { + case Some(image) => return image + case None => trace("No Meta Tag Images found") + } + checkForLargeImages(topNode, 0, 0) match { case Some(image) => return image case None => { @@ -64,11 +69,6 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } } - checkForMetaTag match { - case Some(image) => return image - case None => trace("No Meta Tag Images found") - } - new Image } From dea3300e06ddf598eb45b979a648d99280f848cb Mon Sep 17 00:00:00 2001 From: Jason Bennett <jbennett@unfold.com> Date: Fri, 9 Nov 2012 16:29:38 -0800 Subject: [PATCH 125/347] Look for twitter:image links --- .../images/UpgradedImageIExtractor.scala | 53 +++++++++++++++++-- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala index 050f38319..343723855 100644 --- a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala +++ b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala @@ -72,20 +72,29 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: new Image } + /** + * Prefer Twitter images (as they tend to have the right size for us), then Open Graph images + * (which seem to be smaller), and finally linked images. + */ private def checkForMetaTag: Option[Image] = { - checkForLinkTag match { + + checkForTwitterTag match { case Some(image) => return Some(image) - case None => trace("No known images found") + case None => trace("No twitter image found") } checkForOpenGraphTag match { case Some(image) => return Some(image) - case None => trace("No known images found") + case None => trace("No open graph images found") } - None + checkForLinkTag match { + case Some(image) => return Some(image) + case None => trace("No link tag images found") } + None + } /** * although slow the best way to determine the best image is to download them and check the actual dimensions of the image when on disk @@ -441,6 +450,42 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } } + private def checkForTwitterTag: Option[Image] = { + try { + val meta: Elements = article.rawDoc.select("meta[property~=twitter:image]") + + for (item <- meta) { + if (item.attr("content").length < 1) { + return None + } + val imagePath: String = this.buildImagePath(item.attr("content")) + val mainImage = new Image + mainImage.imageSrc = imagePath + mainImage.imageExtractionType = "twitter" + mainImage.confidenceScore = 100 + getLocallyStoredImage(mainImage.imageSrc) match { + case Some(locallyStoredImage) => { + mainImage.bytes = locallyStoredImage.bytes + mainImage.height = locallyStoredImage.height + mainImage.width = locallyStoredImage.width + } + case None => + } + trace("twitter image tag found, using it: %s".format(imagePath)) + + return Some(mainImage) + } + None + + } + catch { + case e: Exception => { + warn(e, e.toString) + None + } + } + } + /** * returns the bytes of the image file on disk From 33883419e4d4abd18e2996ba234a4e4386058109 Mon Sep 17 00:00:00 2001 From: Jason Bennett <jbennett@unfold.com> Date: Fri, 9 Nov 2012 16:29:52 -0800 Subject: [PATCH 126/347] Minor log spelling fix --- .../com/gravity/goose/images/UpgradedImageIExtractor.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala index 343723855..e69b17a8d 100644 --- a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala +++ b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala @@ -49,7 +49,7 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } def getBestImage(doc: Document, topNode: Element): Image = { - trace("Starting to Look for the Most Relavent Image") + trace("Starting to Look for the Most Relevant Image") checkForKnownElements() match { case Some(image) => return image case None => { From 18084124b105fd0b24c71b3f879531fff4920239 Mon Sep 17 00:00:00 2001 From: Jason Bennett <jbennett@unfold.com> Date: Fri, 9 Nov 2012 16:30:32 -0800 Subject: [PATCH 127/347] Make image score available for large images --- src/main/scala/com/gravity/goose/images/Image.scala | 3 +++ .../goose/images/UpgradedImageIExtractor.scala | 13 +++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/scala/com/gravity/goose/images/Image.scala b/src/main/scala/com/gravity/goose/images/Image.scala index 0b2d425e5..eb9d15cc4 100644 --- a/src/main/scala/com/gravity/goose/images/Image.scala +++ b/src/main/scala/com/gravity/goose/images/Image.scala @@ -37,6 +37,9 @@ class Image { * holds the src of the image */ var imageSrc: String = ""; + + /** Raw score of image. */ + var imageScore: Float = 0; /** * how confident are we in this image extraction? the most images generally the less confident diff --git a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala index e69b17a8d..ae3db347c 100644 --- a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala +++ b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala @@ -56,7 +56,7 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: trace("No known images found") } } - + checkForMetaTag match { case Some(image) => return image case None => trace("No Meta Tag Images found") @@ -82,17 +82,17 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: case Some(image) => return Some(image) case None => trace("No twitter image found") } - + checkForOpenGraphTag match { case Some(image) => return Some(image) case None => trace("No open graph images found") } - + checkForLinkTag match { case Some(image) => return Some(image) case None => trace("No link tag images found") - } - + } + None } @@ -123,6 +123,7 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: mainImage.imageExtractionType = "bigimage" mainImage.bytes = highScoreImage._1.bytes mainImage.confidenceScore = if (scoredImages.size > 0) (100 / scoredImages.size) else 0 + mainImage.imageScore = highScoreImage._2 trace("IMAGE COMPLETE: High Score Image is: " + mainImage.imageSrc + " Score is: " + highScoreImage._2) return Some(mainImage) } @@ -449,7 +450,7 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } } } - + private def checkForTwitterTag: Option[Image] = { try { val meta: Elements = article.rawDoc.select("meta[property~=twitter:image]") From f5c0a078612665a4a9dcdec13fc170034c11b90d Mon Sep 17 00:00:00 2001 From: Jason Bennett <jbennett@unfold.com> Date: Fri, 9 Nov 2012 16:31:36 -0800 Subject: [PATCH 128/347] Personalize versioning --- pom.xml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 9fef84cba..6f323cae8 100644 --- a/pom.xml +++ b/pom.xml @@ -2,12 +2,14 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> - <groupId>com.gravity</groupId> - <artifactId>goose</artifactId> - <version>2.1.22</version> + <groupId>com.unfold</groupId> + <artifactId>goose-fork</artifactId> + <version>2.1.22-unfold</version> + <packaging>jar</packaging> - <name>goose</name> - <url>http://maven.apache.org</url> + + <name>Goose - Unfold Fork</name> + <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> From d2bbf0ab1882c583006d54270d9b20b901d614d7 Mon Sep 17 00:00:00 2001 From: Jason Bennett <jbennett@unfold.com> Date: Fri, 9 Nov 2012 18:03:49 -0800 Subject: [PATCH 129/347] Change version to snapshot and add repo --- pom.xml | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6f323cae8..de3c4d003 100644 --- a/pom.xml +++ b/pom.xml @@ -4,12 +4,25 @@ <groupId>com.unfold</groupId> <artifactId>goose-fork</artifactId> - <version>2.1.22-unfold</version> + <version>2.1.23-SNAPSHOT</version> <packaging>jar</packaging> <name>Goose - Unfold Fork</name> + <distributionManagement> + <repository> + <id>unfold-release</id> + <name>Unfold Nexus Release Repository</name> + <url>http://git.tacenda.com:8081/nexus/content/repositories/releases</url> + </repository> + <snapshotRepository> + <id>unfold-snapshot</id> + <name>Unfold Nexus Snapshot Repository</name> + <url>http://git.tacenda.com:8081/nexus/content/repositories/snapshots</url> + </snapshotRepository> + </distributionManagement> + <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> From 361c69cd57401feb9586336123f051bc636b7fe3 Mon Sep 17 00:00:00 2001 From: Jason Bennett <jbennett@unfold.com> Date: Tue, 20 Nov 2012 16:14:49 -0800 Subject: [PATCH 130/347] Add minimum image size to remove images that upscale badly --- .../com/gravity/goose/Configuration.scala | 10 +++++++ .../images/UpgradedImageIExtractor.scala | 27 +++++++++++-------- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index 20ce4653a..385e027fa 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -45,6 +45,16 @@ class Configuration { */ @BeanProperty var minBytesForImages: Int = 4500 + /** + * Minimum legal height for an image - smaller than this considered unusable/undesirable + */ + @BeanProperty + var minWidth: Int = 120 + /** + * Minimum legal width for an image - smaller than this considered unusable/undesirable + */ + @BeanProperty + var minHeight: Int = 120 /** * set this guy to false if you don't care about getting images, otherwise you can either use the default * image extractor to implement the ImageExtractor interface to build your own diff --git a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala index ae3db347c..876966468 100644 --- a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala +++ b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala @@ -398,11 +398,10 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } trace("link tag found, using it") - return Some(mainImage) + return ensureMinimumImageSize(mainImage) } None - } - catch { + } catch { case e: Exception => { warn("Unexpected exception caught in checkForLinkTag. Handled by returning None.", e) None @@ -439,11 +438,10 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } trace("open graph tag found, using it: %s".format(imagePath)) - return Some(mainImage) + return ensureMinimumImageSize(mainImage) } None - } - catch { + } catch { case e: Exception => { warn(e, e.toString) None @@ -474,12 +472,11 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } trace("twitter image tag found, using it: %s".format(imagePath)) - return Some(mainImage) + return ensureMinimumImageSize(mainImage) } None - } - catch { + } catch { case e: Exception => { warn(e, e.toString) None @@ -487,13 +484,21 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } } + private def ensureMinimumImageSize(mainImage: Image): Option[Image] = { + trace("Checking image %s for proper size".format(mainImage.getImageSrc)) + if (mainImage.width >= config.minWidth && mainImage.height >= config.minHeight) { + trace("Image accepted") + return Some(mainImage) + } + trace("Image rejected as too small") + None + } /** * returns the bytes of the image file on disk */ def getLocallyStoredImage(imageSrc: String): Option[LocallyStoredImage] = ImageUtils.storeImageToLocalFile(httpClient, linkhash, imageSrc, config) - def getCleanDomain = { // just grab the very end of the domain dotRegex.split(article.domain).takeRight(2).mkString(".") @@ -543,7 +548,7 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: mainImage.width = locallyStoredImage.width }) - Some(mainImage) + ensureMinimumImageSize(mainImage) } /** From d0ae83351c41015ff08104e59c15faed010c81ce Mon Sep 17 00:00:00 2001 From: Jason Bennett <jbennett@unfold.com> Date: Tue, 20 Nov 2012 16:14:59 -0800 Subject: [PATCH 131/347] Formatting changes --- .../images/UpgradedImageIExtractor.scala | 190 +++++++++--------- 1 file changed, 91 insertions(+), 99 deletions(-) diff --git a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala index 876966468..1cb3a0ccf 100644 --- a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala +++ b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala @@ -1,45 +1,45 @@ package com.gravity.goose.images import org.apache.http.client.HttpClient -import com.gravity.goose.{Configuration, Article} -import org.jsoup.nodes.{Element, Document} -import java.util.regex.{Pattern, Matcher} +import com.gravity.goose.{ Configuration, Article } +import org.jsoup.nodes.{ Element, Document } +import java.util.regex.{ Pattern, Matcher } import com.gravity.goose.text.string -import java.net.{MalformedURLException, URL} +import java.net.{ MalformedURLException, URL } import org.jsoup.select.Elements import scala.collection.JavaConversions._ import java.util.ArrayList -import collection.mutable.{ListBuffer, HashMap} +import collection.mutable.{ ListBuffer, HashMap } import com.gravity.goose.utils.FileHelper import io.Source /** -* Created by Jim Plush -* User: jim -* Date: 9/22/11 -*/ + * Created by Jim Plush + * User: jim + * Date: 9/22/11 + */ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: Configuration) extends ImageExtractor { import UpgradedImageIExtractor._ /** - * What's the minimum bytes for an image we'd accept is - */ + * What's the minimum bytes for an image we'd accept is + */ private val minBytesForImages: Int = 4000 /** - * the webpage url that we're extracting content from - */ + * the webpage url that we're extracting content from + */ val targetUrl = article.finalUrl /** - * stores a hash of our url for reference and image processing - */ + * stores a hash of our url for reference and image processing + */ val linkhash = article.linkhash /** - * this lists all the known bad button names that we have - */ + * this lists all the known bad button names that we have + */ val matchBadImageNames: Matcher = { val sb = new StringBuilder // create negative elements @@ -56,7 +56,7 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: trace("No known images found") } } - + checkForMetaTag match { case Some(image) => return image case None => trace("No Meta Tag Images found") @@ -73,40 +73,40 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } /** - * Prefer Twitter images (as they tend to have the right size for us), then Open Graph images + * Prefer Twitter images (as they tend to have the right size for us), then Open Graph images * (which seem to be smaller), and finally linked images. */ private def checkForMetaTag: Option[Image] = { - + checkForTwitterTag match { case Some(image) => return Some(image) case None => trace("No twitter image found") } - + checkForOpenGraphTag match { case Some(image) => return Some(image) case None => trace("No open graph images found") } - + checkForLinkTag match { case Some(image) => return Some(image) case None => trace("No link tag images found") } - + None } /** - * although slow the best way to determine the best image is to download them and check the actual dimensions of the image when on disk - * so we'll go through a phased approach... - * 1. get a list of ALL images from the parent node - * 2. filter out any bad image names that we know of (gifs, ads, etc..) - * 3. do a head request on each file to make sure it meets our bare requirements - * 4. any images left over let's do a full GET request, download em to disk and check their dimensions - * 5. Score images based on different factors like height/width and possibly things like color density - * - * @param node - */ + * although slow the best way to determine the best image is to download them and check the actual dimensions of the image when on disk + * so we'll go through a phased approach... + * 1. get a list of ALL images from the parent node + * 2. filter out any bad image names that we know of (gifs, ads, etc..) + * 3. do a head request on each file to make sure it meets our bare requirements + * 4. any images left over let's do a full GET request, download em to disk and check their dimensions + * 5. Score images based on different factors like height/width and possibly things like color density + * + * @param node + */ private def checkForLargeImages(node: Element, parentDepthLevel: Int, siblingDepthLevel: Int): Option[Image] = { trace("Checking for large images - parent depth " + parentDepthLevel + " sibling depth: " + siblingDepthLevel) @@ -138,7 +138,6 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } } - } case None => { getDepthLevel(node, parentDepthLevel, siblingDepthLevel) match { @@ -171,16 +170,16 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } /** - * download the images to temp disk and set their dimensions - * <p/> - * we're going to score the images in the order in which they appear so images higher up will have more importance, - * we'll count the area of the 1st image as a score of 1 and then calculate how much larger or small each image after it is - * we'll also make sure to try and weed out banner type ad blocks that have big widths and small heights or vice versa - * so if the image is 3rd found in the dom it's sequence score would be 1 / 3 = .33 * diff in area from the first image - * - * @param images - * @return - */ + * download the images to temp disk and set their dimensions + * <p/> + * we're going to score the images in the order in which they appear so images higher up will have more importance, + * we'll count the area of the 1st image as a score of 1 and then calculate how much larger or small each image after it is + * we'll also make sure to try and weed out banner type ad blocks that have big widths and small heights or vice versa + * so if the image is 3rd found in the dom it's sequence score would be 1 / 3 = .33 * diff in area from the first image + * + * @param images + * @return + */ private def downloadImagesAndGetResults(images: ArrayList[Element], depthLevel: Int): ListBuffer[(LocallyStoredImage, Float)] = { val imageResults = new ListBuffer[(LocallyStoredImage, Float)]() var initialArea: Float = 0 @@ -208,8 +207,7 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: // give the initial image a little area boost as well initialArea = area * 1.48f totalScore = 1 - } - else { + } else { val areaDifference: Float = area / initialArea totalScore = sequenceScore * areaDifference } @@ -221,8 +219,6 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } }) - - imageResults } @@ -231,12 +227,12 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } /** - * returns true if we think this is kind of a bannery dimension - * like 600 / 100 = 6 may be a fishy dimension for a good image - * - * @param width - * @param height - */ + * returns true if we think this is kind of a bannery dimension + * like 600 / 100 = 6 may be a fishy dimension for a good image + * + * @param width + * @param height + */ private def isBannerDimensions(width: Int, height: Int): Boolean = { if (width == height) { return false @@ -267,18 +263,17 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } /** - * takes a list of image elements and filters out the ones with bad names - * - * @param images - * @return - */ + * takes a list of image elements and filters out the ones with bad names + * + * @param images + * @return + */ private def filterBadNames(images: Elements): Option[ArrayList[Element]] = { val goodImages: ArrayList[Element] = new ArrayList[Element] for (image <- images) { if (this.isOkImageFileName(image)) { goodImages.add(image) - } - else { + } else { image.remove() } } @@ -286,10 +281,10 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } /** - * will check the image src against a list of bad image files we know of like buttons, etc... - * - * @return - */ + * will check the image src against a list of bad image files we know of like buttons, etc... + * + * @return + */ private def isOkImageFileName(imageNode: Element): Boolean = { val imgSrc: String = imageNode.attr("src") if (string.isNullOrEmpty(imgSrc)) { @@ -320,11 +315,11 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } /** - * loop through all the images and find the ones that have the best bytez to even make them a candidate - * - * @param images - * @return - */ + * loop through all the images and find the ones that have the best bytez to even make them a candidate + * + * @param images + * @return + */ private def findImagesThatPassByteSizeTest(images: ArrayList[Element]): Option[ArrayList[Element]] = { var cnt: Int = 0 val MAX_BYTES_SIZE: Int = 15728640 @@ -358,7 +353,6 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: cnt += 1 }) - trace(" Now leaving findImagesThatPassByteSizeTest") if (goodImages == null || goodImages.isEmpty) None else Some(goodImages) @@ -369,10 +363,10 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } /** - * checks to see if we were able to find open graph tags on this page - * - * @return - */ + * checks to see if we were able to find open graph tags on this page + * + * @return + */ private def checkForLinkTag: Option[Image] = { if (article.rawDoc == null) return None @@ -411,10 +405,10 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } /** - * checks to see if we were able to find open graph tags on this page - * - * @return - */ + * checks to see if we were able to find open graph tags on this page + * + * @return + */ private def checkForOpenGraphTag: Option[Image] = { try { val meta: Elements = article.rawDoc.select("meta[property~=og:image]") @@ -448,11 +442,11 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } } } - + private def checkForTwitterTag: Option[Image] = { try { val meta: Elements = article.rawDoc.select("meta[property~=twitter:image]") - + for (item <- meta) { if (item.attr("content").length < 1) { return None @@ -475,11 +469,11 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: return ensureMinimumImageSize(mainImage) } None - + } catch { case e: Exception => { - warn(e, e.toString) - None + warn(e, e.toString) + None } } } @@ -495,8 +489,8 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } /** - * returns the bytes of the image file on disk - */ + * returns the bytes of the image file on disk + */ def getLocallyStoredImage(imageSrc: String): Option[LocallyStoredImage] = ImageUtils.storeImageToLocalFile(httpClient, linkhash, imageSrc, config) def getCleanDomain = { @@ -505,10 +499,10 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } /** - * in here we check for known image contains from sites we've checked out like yahoo, techcrunch, etc... that have - * known places to look for good images. - * //todo enable this to use a series of settings files so people can define what the image ids/classes are on specific sites - */ + * in here we check for known image contains from sites we've checked out like yahoo, techcrunch, etc... that have + * known places to look for good images. + * //todo enable this to use a series of settings files so people can define what the image ids/classes are on specific sites + */ def checkForKnownElements(): Option[Image] = { if (article.rawDoc == null) return None @@ -552,19 +546,18 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: } /** - * This method will take an image path and build out the absolute path to that image - * using the initial url we crawled so we can find a link to the image if they use relative urls like ../myimage.jpg - * - * @param imageSrc - * @return - */ + * This method will take an image path and build out the absolute path to that image + * using the initial url we crawled so we can find a link to the image if they use relative urls like ../myimage.jpg + * + * @param imageSrc + * @return + */ private def buildImagePath(imageSrc: String): String = { try { val pageURL = new URL(this.targetUrl) return new URL(pageURL, ImageUtils.cleanImageSrcString(imageSrc)).toString - } - catch { + } catch { case e: MalformedURLException => { warn("Unable to get Image Path: " + imageSrc) } @@ -573,7 +566,6 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: imageSrc } - } object UpgradedImageIExtractor { From 0b275ffde033751e5da9fe8bfa79c082a4a3e984 Mon Sep 17 00:00:00 2001 From: Andres March <andres.march@gmail.com> Date: Sat, 24 Nov 2012 12:05:52 -0600 Subject: [PATCH 132/347] upgrade to scala 2.10.0-RC2. changed maven scala plugin --- pom.xml | 83 +++++++++++++++++++++++++++++++-------------------------- 1 file changed, 45 insertions(+), 38 deletions(-) diff --git a/pom.xml b/pom.xml index 9fef84cba..fb8b11591 100644 --- a/pom.xml +++ b/pom.xml @@ -4,14 +4,21 @@ <groupId>com.gravity</groupId> <artifactId>goose</artifactId> - <version>2.1.22</version> + <version>2.2-SNAPSHOT</version> <packaging>jar</packaging> <name>goose</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <scala.version>2.10.0-RC2</scala.version> </properties> - + <pluginRepositories> + <pluginRepository> + <id>scala-tools.org</id> + <name>Scala-tools Maven2 Repository</name> + <url>http://scala-tools.org/repo-releases</url> + </pluginRepository> + </pluginRepositories> <dependencies> <dependency> <groupId>junit</groupId> @@ -46,14 +53,29 @@ <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-compiler</artifactId> - <version>2.9.0-1</version> + <version>${scala.version}</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> - <version>2.9.0-1</version> + <version>${scala.version}</version> + <scope>runtime</scope> + </dependency> + + <dependency> + <groupId>org.scala-lang</groupId> + <artifactId>scala-actors</artifactId> + <version>${scala.version}</version> + <scope>runtime</scope> + </dependency> + + <dependency> + <groupId>org.scala-lang</groupId> + <artifactId>scala-reflect</artifactId> + <version>${scala.version}</version> + <scope>runtime</scope> </dependency> <dependency> @@ -72,7 +94,25 @@ Hey... since we're open source, let's compile the source and javadocs into jars as well --> <build> + <sourceDirectory>src/main/scala</sourceDirectory> + <testSourceDirectory>src/test/scala</testSourceDirectory> <plugins> + <plugin> + <groupId>net.alchim31.maven</groupId> + <artifactId>scala-maven-plugin</artifactId> + <version>3.1.0</version> + <executions> + <execution> + <goals> + <goal>compile</goal> + <goal>testCompile</goal> + </goals> + </execution> + </executions> + <configuration> + <scalaVersion>${scala.version}</scalaVersion> + </configuration> + </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> @@ -88,40 +128,7 @@ </excludes> </configuration> </plugin> - <plugin> - <groupId>org.scala-tools</groupId> - <artifactId>maven-scala-plugin</artifactId> - <version>2.14.3</version> - <configuration> - <charset>UTF-8</charset> - <jvmArgs> - <jvmArg>-Xmx1024m</jvmArg> - </jvmArgs> - </configuration> - <executions> - <execution> - <id>compile</id> - <goals> - <goal>compile</goal> - </goals> - <phase>compile</phase> - </execution> - <execution> - <id>test-compile</id> - <goals> - <goal>testCompile</goal> - </goals> - <phase>test-compile</phase> - </execution> - <execution> - <phase>process-resources</phase> - <goals> - <goal>compile</goal> - </goals> - </execution> - - </executions> - </plugin> + <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-source-plugin</artifactId> From eb646224cbc4fbb2748826f307af0c0e1e59e522 Mon Sep 17 00:00:00 2001 From: Jason Bennett <jbennett@unfold.com> Date: Mon, 26 Nov 2012 17:10:52 -0800 Subject: [PATCH 133/347] Upgrade http client to latest version to try and cut down on connection errors --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index de3c4d003..479205941 100644 --- a/pom.xml +++ b/pom.xml @@ -74,7 +74,7 @@ <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> - <version>4.1.2</version> + <version>4.2.2</version> </dependency> <dependency> <groupId>commons-lang</groupId> From 13a8e73f20e0699256d76b019086167a81424803 Mon Sep 17 00:00:00 2001 From: Jason Bennett <jbennett@unfold.com> Date: Mon, 26 Nov 2012 17:11:05 -0800 Subject: [PATCH 134/347] Log size of rejected images --- .../com/gravity/goose/images/UpgradedImageIExtractor.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala index 1cb3a0ccf..b531e7f18 100644 --- a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala +++ b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala @@ -484,7 +484,7 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: trace("Image accepted") return Some(mainImage) } - trace("Image rejected as too small") + trace("Image rejected as too small - actual size is %1$s wide by %2$s tall".format(mainImage.width, mainImage.height)) None } From ba7dddfc17f7661c7af5c91fd756d6c3a87eb615 Mon Sep 17 00:00:00 2001 From: Matt Haynes <matt@matthaynes.net> Date: Tue, 27 Nov 2012 10:54:43 +0000 Subject: [PATCH 135/347] Update to scala-maven-plugin - new version of deprecated maven-scala-plugin --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 9fef84cba..32f886e27 100644 --- a/pom.xml +++ b/pom.xml @@ -89,9 +89,9 @@ </configuration> </plugin> <plugin> - <groupId>org.scala-tools</groupId> - <artifactId>maven-scala-plugin</artifactId> - <version>2.14.3</version> + <groupId>net.alchim31.maven</groupId> + <artifactId>scala-maven-plugin</artifactId> + <version>3.1.0</version> <configuration> <charset>UTF-8</charset> <jvmArgs> @@ -151,4 +151,4 @@ </plugins> </build> -</project> \ No newline at end of file +</project> From e39a316f1f72be7340f764066d25fbecf41387c7 Mon Sep 17 00:00:00 2001 From: Matt Haynes <matt@matthaynes.net> Date: Tue, 27 Nov 2012 11:16:40 +0000 Subject: [PATCH 136/347] Add sonatype maven configuration --- pom.xml | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 32f886e27..5aae58499 100644 --- a/pom.xml +++ b/pom.xml @@ -1,13 +1,35 @@ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.sonatype.oss</groupId> + <artifactId>oss-parent</artifactId> + <version>7</version> + </parent> + + <modelVersion>4.0.0</modelVersion> <groupId>com.gravity</groupId> <artifactId>goose</artifactId> - <version>2.1.22</version> + <version>2.1.22-SNAPSHOT</version> <packaging>jar</packaging> <name>goose</name> - <url>http://maven.apache.org</url> + <description>Goose was originally an article extractor written in Java that has most recently (aug2011) converted to a scala project. It's mission is to take any news article or article type web page and not only extract what is the main body of the article but also all meta data and most probable image candidate.</description> + <url>https://github.com/jiminoc/goose</url> + + <licenses> + <license> + <name>The Apache Software License, Version 2.0</name> + <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url> + <distribution>repo</distribution> + </license> + </licenses> + + <scm> + <connection>scm:git:git@github.com:jiminoc/goose.git</connection> + <developerConnection>scm:git:git@github.com:jiminoc/goose.git</developerConnection> + <url>git@github.com:jiminoc/goose.git</url> + </scm> + <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> From 363529cc048dadb7f610616c2f8ea4e946f8d3d1 Mon Sep 17 00:00:00 2001 From: Matt Haynes <matt@matthaynes.net> Date: Tue, 27 Nov 2012 13:18:15 +0000 Subject: [PATCH 137/347] Update repo --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 5aae58499..6861aef0e 100644 --- a/pom.xml +++ b/pom.xml @@ -25,9 +25,9 @@ </licenses> <scm> - <connection>scm:git:git@github.com:jiminoc/goose.git</connection> - <developerConnection>scm:git:git@github.com:jiminoc/goose.git</developerConnection> - <url>git@github.com:jiminoc/goose.git</url> + <connection>scm:git:git@github.com:matth/goose.git</connection> + <developerConnection>scm:git:git@github.com:matth/goose.git</developerConnection> + <url>git@github.com:matth/goose.git</url> </scm> <properties> From 0adfadb56b5878a7741f63e56359547211869eef Mon Sep 17 00:00:00 2001 From: Matt Haynes <matt@matthaynes.net> Date: Tue, 27 Nov 2012 13:54:29 +0000 Subject: [PATCH 138/347] Replace javadoc plugin with scaladoc plugin --- pom.xml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 6861aef0e..c8fde8b38 100644 --- a/pom.xml +++ b/pom.xml @@ -1,5 +1,4 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <groupId>org.sonatype.oss</groupId> @@ -158,14 +157,14 @@ </executions> </plugin> <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-javadoc-plugin</artifactId> - <version>2.8</version> + <groupId>net.alchim31.maven</groupId> + <artifactId>scala-maven-plugin</artifactId> + <version>3.1.0</version> <executions> <execution> <id>attach-javadocs</id> <goals> - <goal>jar</goal> + <goal>doc-jar</goal> </goals> </execution> </executions> From facfba2d957e86d4be50b8cf6b6f9a2cd1ebbda9 Mon Sep 17 00:00:00 2001 From: Matt Haynes <matt@matthaynes.net> Date: Tue, 27 Nov 2012 13:57:26 +0000 Subject: [PATCH 139/347] [maven-release-plugin] prepare release goose-2.1.22 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c8fde8b38..24d5d09c1 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>com.gravity</groupId> <artifactId>goose</artifactId> - <version>2.1.22-SNAPSHOT</version> + <version>2.1.22</version> <packaging>jar</packaging> <name>goose</name> <description>Goose was originally an article extractor written in Java that has most recently (aug2011) converted to a scala project. It's mission is to take any news article or article type web page and not only extract what is the main body of the article but also all meta data and most probable image candidate.</description> From 0bf25bf923b5642cbd4064244f9626d203933470 Mon Sep 17 00:00:00 2001 From: Matt Haynes <matt@matthaynes.net> Date: Tue, 27 Nov 2012 13:57:31 +0000 Subject: [PATCH 140/347] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 24d5d09c1..3a38f6796 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>com.gravity</groupId> <artifactId>goose</artifactId> - <version>2.1.22</version> + <version>2.1.23-SNAPSHOT</version> <packaging>jar</packaging> <name>goose</name> <description>Goose was originally an article extractor written in Java that has most recently (aug2011) converted to a scala project. It's mission is to take any news article or article type web page and not only extract what is the main body of the article but also all meta data and most probable image candidate.</description> From 3208c51964e4a1056852773d29a386b0d3d7a789 Mon Sep 17 00:00:00 2001 From: Matt Haynes <matt@matthaynes.net> Date: Tue, 27 Nov 2012 14:08:32 +0000 Subject: [PATCH 141/347] Change repo back --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 3a38f6796..2dea0d5fb 100644 --- a/pom.xml +++ b/pom.xml @@ -24,9 +24,9 @@ </licenses> <scm> - <connection>scm:git:git@github.com:matth/goose.git</connection> - <developerConnection>scm:git:git@github.com:matth/goose.git</developerConnection> - <url>git@github.com:matth/goose.git</url> + <connection>scm:git:git@github.com:jiminoc/goose.git</connection> + <developerConnection>scm:git:git@github.com:jiminoc/goose.git</developerConnection> + <url>git@github.com:jiminoc/goose.git</url> </scm> <properties> From 8de1855ead3f678afb6b903142af4c75c5c917ef Mon Sep 17 00:00:00 2001 From: Matt Haynes <matt@matthaynes.net> Date: Tue, 27 Nov 2012 14:33:13 +0000 Subject: [PATCH 142/347] Add notes about maven repo availability to README --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 47af399be..e6e3eb646 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,15 @@ To use goose from the command line: mvn compile MAVEN_OPTS="-Xms256m -Xmx2000m"; mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="http://techcrunch.com/2011/05/13/native-apps-or-web-apps-particle-code-wants-you-to-do-both/" -e -q > ~/Desktop/gooseresult.txt +##Usage as a maven dependency + +Goose is hosted on Sonatype's OSS repository, https://oss.sonatype.org/content/repositories/releases/com/gravity/goose/ + + <dependency> + <groupId>com.gravity</groupId> + <artifactId>goose</artifactId> + <version>2.1.22</version> + </dependency> ##Regarding the port from JAVA to Scala @@ -55,4 +64,4 @@ Here are some of the reasons for the port to Scala: ##Issues It was a pretty fast Java to Scala port so lots of the nicities of the Scala language aren't in the codebase yet, but those will come over the coming months as we re-write alot of the internal methods to be more Scalesque. -We made sure it was still nice and operable from Java as well so if you're using goose from java you still should be able to use it with a few changes to the method signatures. \ No newline at end of file +We made sure it was still nice and operable from Java as well so if you're using goose from java you still should be able to use it with a few changes to the method signatures. From 4b8191cbf139bb0797a4f2f9d32967c54ff3a3f0 Mon Sep 17 00:00:00 2001 From: Matt Haynes <matt@matthaynes.net> Date: Tue, 27 Nov 2012 17:46:41 +0000 Subject: [PATCH 143/347] Add http proxy support from java prop or environment variable --- .../com/gravity/goose/network/HtmlFetcher.scala | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index 34ebf44a7..78eb0ed8a 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -19,6 +19,7 @@ package com.gravity.goose.network import org.apache.http.HttpEntity +import org.apache.http.HttpHost import org.apache.http.HttpResponse import org.apache.http.HttpVersion import org.apache.http.client.CookieStore @@ -26,6 +27,7 @@ import org.apache.http.client.HttpClient import org.apache.http.client.methods.HttpGet import org.apache.http.client.params.CookiePolicy import org.apache.http.client.protocol.ClientContext +import org.apache.http.conn.params.ConnRoutePNames import org.apache.http.conn.scheme.PlainSocketFactory import org.apache.http.conn.ssl.SSLSocketFactory import org.apache.http.conn.scheme.Scheme @@ -42,6 +44,7 @@ import org.apache.http.util.EntityUtils import java.io._ import java.net.SocketException import java.net.SocketTimeoutException +import java.net.URL import java.net.URLConnection import java.util.ArrayList import java.util.Date @@ -278,6 +281,19 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { httpClient.getParams.setParameter("http.conn-manager.timeout", 120000L) httpClient.getParams.setParameter("http.protocol.wait-for-continue", 10000L) httpClient.getParams.setParameter("http.tcp.nodelay", true) + + // First check proxy configured from java properties, otherwise use env var if set + if (scala.sys.props.isDefinedAt("http.proxyHost")) { + val host = scala.sys.props.getOrElse("http.proxyHost", "") + val port = scala.sys.props.getOrElse("http.proxyPort", "80").toInt + httpClient.getParams.setParameter(ConnRoutePNames.DEFAULT_PROXY, new HttpHost(host, port)) + } else if (sys.env.isDefinedAt("http_proxy")) { + val url = new URL(sys.env.getOrElse("http_proxy", "")) + val host = url.getHost + val port = url.getPort + httpClient.getParams.setParameter(ConnRoutePNames.DEFAULT_PROXY, new HttpHost(host, port)) + } + } /** From c18ffb3ab1d74f053beb2b01b6c67ae8a19cd30f Mon Sep 17 00:00:00 2001 From: Anuj Dutta <anuj@andhapp.com> Date: Sun, 16 Dec 2012 22:45:52 +0000 Subject: [PATCH 144/347] Add code for determining encoding using juniversalchardet. --- pom.xml | 12 ++++++- .../gravity/goose/network/HtmlFetcher.scala | 35 +++++++++++++++++-- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 9fef84cba..956da8bc0 100644 --- a/pom.xml +++ b/pom.xml @@ -66,6 +66,16 @@ <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>2.4</version> + </dependency> + <dependency> + <groupId>com.googlecode.juniversalchardet</groupId> + <artifactId>juniversalchardet</artifactId> + <version>1.0.3</version> + </dependency> </dependencies> <!-- @@ -151,4 +161,4 @@ </plugins> </build> -</project> \ No newline at end of file +</project> diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index 34ebf44a7..e309ab3aa 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -48,6 +48,9 @@ import java.util.Date import java.util.List import com.gravity.goose.utils.Logging import com.gravity.goose.Configuration +import org.mozilla.universalchardet.UniversalDetector +import org.apache.commons.io.IOUtils +import java.util.Arrays import org.apache.http.impl.client.{DefaultHttpRequestRetryHandler, AbstractHttpClient, DefaultHttpClient} @@ -94,6 +97,8 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { var htmlResult: String = null var entity: HttpEntity = null var instream: InputStream = null + var responseBytes: Array[Byte] = null + var detector: UniversalDetector = null // Identified the the apache http client does not drop URL fragments before opening the request to the host // more info: http://stackoverflow.com/questions/4251841/400-error-with-httpclient-for-a-link-with-an-anchor @@ -121,24 +126,48 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { } entity = response.getEntity + if (entity != null) { - instream = entity.getContent + responseBytes = IOUtils.toByteArray(entity.getContent) + var encodingType: String = "UTF-8" try { encodingType = EntityUtils.getContentCharSet(entity) + if (encodingType == null) { - encodingType = "UTF-8" + + val buf: Array[Byte] = new Array[Byte](2048) + var instream2: InputStream = new ByteArrayInputStream(responseBytes) + var bytesRead: Int = 2048 + var inLoop = true + + detector = new UniversalDetector(null); + + while (inLoop) { + var n: Int = instream2.read(buf) + bytesRead += 2048 + + if (n < 0) inLoop = false + if (inLoop && !detector.isDone()) { + detector.handleData(buf, 0, n) + } + } + + detector.dataEnd() + encodingType = detector.getDetectedCharset() + println("The encoding: " + encodingType) + detector.reset() } } catch { case e: Exception => { if (logger.isDebugEnabled) { trace("Unable to get charset for: " + cleanUrl) - trace("Encoding Type is: " + encodingType) } } } try { + instream = new ByteArrayInputStream(responseBytes) htmlResult = HtmlFetcher.convertStreamToString(instream, 15728640, encodingType).trim } finally { From 819607cb828c60c5384ff45080ee4ea0f086a590 Mon Sep 17 00:00:00 2001 From: Kunal Modi <kunalm@gmail.com> Date: Tue, 25 Dec 2012 00:26:35 -0800 Subject: [PATCH 145/347] deal with gzipped http responses --- .../gravity/goose/network/HtmlFetcher.scala | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index 34ebf44a7..9ce1470e7 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -18,10 +18,13 @@ package com.gravity.goose.network +import org.apache.http.Header; +import org.apache.http.HeaderElement; import org.apache.http.HttpEntity import org.apache.http.HttpResponse import org.apache.http.HttpVersion import org.apache.http.client.CookieStore +import org.apache.http.client.entity.GzipDecompressingEntity import org.apache.http.client.HttpClient import org.apache.http.client.methods.HttpGet import org.apache.http.client.params.CookiePolicy @@ -121,6 +124,25 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { } entity = response.getEntity + // via http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientGZipContentCompression.java + if (entity != null) { + try { + val ceheader: Header = entity.getContentEncoding(); + if (ceheader != null) { + val codecs: Array[HeaderElement] = ceheader.getElements(); + for(i <- 0 until codecs.length) { + if (codecs(i).getName().equalsIgnoreCase("gzip")) { + entity = new GzipDecompressingEntity(response.getEntity()) + } + } + } + } catch { + case e: Exception => { + trace("Unable to get header elements: " + cleanUrl) + } + } + } + if (entity != null) { instream = entity.getContent var encodingType: String = "UTF-8" From 53e46d7b963fa214bc2b949a8c7f540d4f54afea Mon Sep 17 00:00:00 2001 From: Kunal Modi <kunalm@gmail.com> Date: Tue, 25 Dec 2012 00:28:13 -0800 Subject: [PATCH 146/347] remove scroll from naughty list so it deal with responsive html templates, like mashable --- src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala b/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala index 27c541d2d..1f0664c65 100644 --- a/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala +++ b/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala @@ -379,7 +379,7 @@ object DocumentCleaner extends Logging { var sb: StringBuilder = new StringBuilder // create negative elements - sb.append("^side$|combx|retweet|mediaarticlerelated|menucontainer|navbar|comment|PopularQuestions|contact|foot|footer|Footer|footnote|cnn_strycaptiontxt|links|meta$|scroll|shoutbox|sponsor") + sb.append("^side$|combx|retweet|mediaarticlerelated|menucontainer|navbar|comment|PopularQuestions|contact|foot|footer|Footer|footnote|cnn_strycaptiontxt|links|meta$|shoutbox|sponsor") sb.append("|tags|socialnetworking|socialNetworking|cnnStryHghLght|cnn_stryspcvbx|^inset$|pagetools|post-attributes|welcome_form|contentTools2|the_answers|remember-tool-tip") sb.append("|communitypromo|runaroundLeft|subscribe|vcard|articleheadings|date|^print$|popup|author-dropdown|tools|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text") From 1ea7af812bf424cfdb7998a10d268d304704baf1 Mon Sep 17 00:00:00 2001 From: Jason Bennett <jbennett@unfold.com> Date: Wed, 9 Jan 2013 11:15:46 -0800 Subject: [PATCH 147/347] Make Article a bean --- .../scala/com/gravity/goose/Article.scala | 99 +++++++++++-------- 1 file changed, 58 insertions(+), 41 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Article.scala b/src/main/scala/com/gravity/goose/Article.scala index 40b4dadcd..376644587 100644 --- a/src/main/scala/com/gravity/goose/Article.scala +++ b/src/main/scala/com/gravity/goose/Article.scala @@ -19,100 +19,116 @@ package com.gravity.goose import images.Image -import org.jsoup.nodes.{Element, Document} +import org.jsoup.nodes.{ Element, Document } import java.util.Date import scala.collection._ +import scala.reflect.BeanProperty /** -* Created by Jim Plush -* User: jim -* Date: 8/14/11 -*/ + * Created by Jim Plush + * User: jim + * Date: 8/14/11 + */ class Article { /** - * title of the article - */ + * title of the article + */ + @BeanProperty var title: String = null /** - * stores the lovely, pure text from the article, stripped of html, formatting, etc... - * just raw text with paragraphs separated by newlines. This is probably what you want to use. - */ + * stores the lovely, pure text from the article, stripped of html, formatting, etc... + * just raw text with paragraphs separated by newlines. This is probably what you want to use. + */ + @BeanProperty var cleanedArticleText: String = "" /** - * meta description field in HTML source - */ + * meta description field in HTML source + */ + @BeanProperty var metaDescription: String = "" /** - * meta keywords field in the HTML source - */ + * meta keywords field in the HTML source + */ + @BeanProperty var metaKeywords: String = "" /** - * The canonical link of this article if found in the meta data - */ + * The canonical link of this article if found in the meta data + */ + @BeanProperty var canonicalLink: String = "" /** - * holds the domain of this article we're parsing - */ + * holds the domain of this article we're parsing + */ + @BeanProperty var domain: String = "" /** - * holds the top Element we think is a candidate for the main body of the article - */ + * holds the top Element we think is a candidate for the main body of the article + */ + @BeanProperty var topNode: Element = null /** - * holds the top Image object that we think represents this article - */ + * holds the top Image object that we think represents this article + */ + @BeanProperty var topImage: Image = new Image - /** - * holds a set of tags that may have been in the artcle, these are not meta keywords - */ + * holds a set of tags that may have been in the artcle, these are not meta keywords + */ + @BeanProperty var tags: Set[String] = null /** - * holds a list of any movies we found on the page like youtube, vimeo - */ + * holds a list of any movies we found on the page like youtube, vimeo + */ + @BeanProperty var movies: List[Element] = Nil /** - * stores the final URL that we're going to try and fetch content against, this would be expanded if any - * escaped fragments were found in the starting url - */ + * stores the final URL that we're going to try and fetch content against, this would be expanded if any + * escaped fragments were found in the starting url + */ + @BeanProperty var finalUrl: String = ""; /** - * stores the MD5 hash of the url to use for various identification tasks - */ + * stores the MD5 hash of the url to use for various identification tasks + */ + @BeanProperty var linkhash: String = ""; /** - * stores the RAW HTML straight from the network connection - */ + * stores the RAW HTML straight from the network connection + */ + @BeanProperty var rawHtml: String = "" /** - * the JSoup Document object - */ + * the JSoup Document object + */ + @BeanProperty var doc: Document = null /** - * this is the original JSoup document that contains a pure object from the original HTML without any cleaning - * options done on it - */ + * this is the original JSoup document that contains a pure object from the original HTML without any cleaning + * options done on it + */ + @BeanProperty var rawDoc: Document = null /** - * Sometimes useful to try and know when the publish date of an article was - */ + * Sometimes useful to try and know when the publish date of an article was + */ + @BeanProperty var publishDate: Date = null /** @@ -121,5 +137,6 @@ class Article { * which is executed before document cleansing within {@link com.gravity.goose.CrawlingActor#crawl} * @return a {@link Map Map<String,String>} of property name to property vaue (represented as a {@link String}. */ + @BeanProperty var additionalData: Map[String, String] = Map.empty } \ No newline at end of file From 67b903eaa53639aad29a4a798159df705ba7f92b Mon Sep 17 00:00:00 2001 From: Devender Gollapally <devender.gollapally@gmail.com> Date: Sat, 12 Jan 2013 15:32:00 -0800 Subject: [PATCH 148/347] mvn eclipse:eclipse will now add src/main/scala --- pom.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/pom.xml b/pom.xml index 9fef84cba..f3729cfcf 100644 --- a/pom.xml +++ b/pom.xml @@ -135,6 +135,24 @@ </execution> </executions> </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>build-helper-maven-plugin</artifactId> + <executions> + <execution> + <id>add-source</id> + <phase>generate-sources</phase> + <goals> + <goal>add-source</goal> + </goals> + <configuration> + <sources> + <source>src/main/scala</source> + </sources> + </configuration> + </execution> + </executions> + </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> From 1cbce165c76f5d135c2313a1847bbb6fc4a77cad Mon Sep 17 00:00:00 2001 From: Devender Gollapally <devender.gollapally@gmail.com> Date: Sat, 12 Jan 2013 16:06:05 -0800 Subject: [PATCH 149/347] correctly adding scala nature and test classes when mvn eclipse:eclipse is used --- pom.xml | 367 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 205 insertions(+), 162 deletions(-) diff --git a/pom.xml b/pom.xml index f3729cfcf..37fba90e0 100644 --- a/pom.xml +++ b/pom.xml @@ -1,172 +1,215 @@ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> - <groupId>com.gravity</groupId> - <artifactId>goose</artifactId> - <version>2.1.22</version> - <packaging>jar</packaging> - <name>goose</name> - <url>http://maven.apache.org</url> - <properties> - <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - </properties> + <groupId>com.gravity</groupId> + <artifactId>goose</artifactId> + <version>2.1.22</version> + <packaging>jar</packaging> + <name>goose</name> + <url>http://maven.apache.org</url> + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + </properties> - <dependencies> - <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - <version>4.8.1</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - <version>1.6.1</version> - <type>jar</type> - <scope>compile</scope> - </dependency> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-log4j12</artifactId> - <version>1.6.1</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.jsoup</groupId> - <artifactId>jsoup</artifactId> - <version>1.5.2</version> - </dependency> - <dependency> - <groupId>commons-io</groupId> - <artifactId>commons-io</artifactId> - <version>2.0.1</version> - </dependency> + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.8.1</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <version>1.6.1</version> + <type>jar</type> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + <version>1.6.1</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.jsoup</groupId> + <artifactId>jsoup</artifactId> + <version>1.5.2</version> + </dependency> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>2.0.1</version> + </dependency> - <dependency> - <groupId>org.scala-lang</groupId> - <artifactId>scala-compiler</artifactId> - <version>2.9.0-1</version> - <scope>compile</scope> - </dependency> + <dependency> + <groupId>org.scala-lang</groupId> + <artifactId>scala-compiler</artifactId> + <version>2.9.0-1</version> + <scope>compile</scope> + </dependency> - <dependency> - <groupId>org.scala-lang</groupId> - <artifactId>scala-library</artifactId> - <version>2.9.0-1</version> - </dependency> + <dependency> + <groupId>org.scala-lang</groupId> + <artifactId>scala-library</artifactId> + <version>2.9.0-1</version> + </dependency> - <dependency> - <groupId>org.apache.httpcomponents</groupId> - <artifactId>httpclient</artifactId> - <version>4.1.2</version> - </dependency> - <dependency> - <groupId>commons-lang</groupId> - <artifactId>commons-lang</artifactId> - <version>2.6</version> - </dependency> - </dependencies> + <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpclient</artifactId> + <version>4.1.2</version> + </dependency> + <dependency> + <groupId>commons-lang</groupId> + <artifactId>commons-lang</artifactId> + <version>2.6</version> + </dependency> + </dependencies> - <!-- - Hey... since we're open source, let's compile the source and javadocs into jars as well - --> - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <version>2.6</version> - <configuration> - <useFile>false</useFile> - <disableXmlReport>true</disableXmlReport> - <includes> - <include>**/*Test.*</include> - </includes> - <excludes> - <exclude>**/*IT.*</exclude> - </excludes> - </configuration> - </plugin> - <plugin> - <groupId>org.scala-tools</groupId> - <artifactId>maven-scala-plugin</artifactId> - <version>2.14.3</version> - <configuration> - <charset>UTF-8</charset> - <jvmArgs> - <jvmArg>-Xmx1024m</jvmArg> - </jvmArgs> - </configuration> - <executions> - <execution> - <id>compile</id> - <goals> - <goal>compile</goal> - </goals> - <phase>compile</phase> - </execution> - <execution> - <id>test-compile</id> - <goals> - <goal>testCompile</goal> - </goals> - <phase>test-compile</phase> - </execution> - <execution> - <phase>process-resources</phase> - <goals> - <goal>compile</goal> - </goals> - </execution> + <!-- Hey... since we're open source, let's compile the source and javadocs + into jars as well --> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>2.6</version> + <configuration> + <useFile>false</useFile> + <disableXmlReport>true</disableXmlReport> + <includes> + <include>**/*Test.*</include> + </includes> + <excludes> + <exclude>**/*IT.*</exclude> + </excludes> + </configuration> + </plugin> + <plugin> + <groupId>org.scala-tools</groupId> + <artifactId>maven-scala-plugin</artifactId> + <version>2.14.3</version> + <configuration> + <charset>UTF-8</charset> + <jvmArgs> + <jvmArg>-Xmx1024m</jvmArg> + </jvmArgs> + </configuration> + <executions> + <execution> + <id>compile</id> + <goals> + <goal>compile</goal> + </goals> + <phase>compile</phase> + </execution> + <execution> + <id>test-compile</id> + <goals> + <goal>testCompile</goal> + </goals> + <phase>test-compile</phase> + </execution> + <execution> + <phase>process-resources</phase> + <goals> + <goal>compile</goal> + </goals> + </execution> - </executions> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-source-plugin</artifactId> - <version>2.1.2</version> - <executions> - <execution> - <id>attach-sources</id> - <goals> - <goal>jar</goal> - </goals> - </execution> - </executions> - </plugin> - <plugin> - <groupId>org.codehaus.mojo</groupId> - <artifactId>build-helper-maven-plugin</artifactId> - <executions> - <execution> - <id>add-source</id> - <phase>generate-sources</phase> - <goals> - <goal>add-source</goal> - </goals> - <configuration> - <sources> - <source>src/main/scala</source> - </sources> - </configuration> - </execution> - </executions> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-javadoc-plugin</artifactId> - <version>2.8</version> - <executions> - <execution> - <id>attach-javadocs</id> - <goals> - <goal>jar</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-source-plugin</artifactId> + <version>2.1.2</version> + <executions> + <execution> + <id>attach-sources</id> + <goals> + <goal>jar</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>build-helper-maven-plugin</artifactId> + <executions> + <execution> + <id>add-source</id> + <phase>generate-sources</phase> + <goals> + <goal>add-source</goal> + </goals> + <configuration> + <sources> + <source>src/main/scala</source> + </sources> + </configuration> + </execution> + + <!-- Add src/test/scala to test source path of Eclipse --> + <execution> + <id>add-test-source</id> + <phase>generate-sources</phase> + <goals> + <goal>add-test-source</goal> + </goals> + <configuration> + <sources> + <source>src/test/scala</source> + </sources> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-eclipse-plugin</artifactId> + <version>2.8</version> + <configuration> + <downloadSources>false</downloadSources> + <downloadJavadocs>false</downloadJavadocs> + <projectnatures> + <projectnature>org.scala-ide.sdt.core.scalanature</projectnature> + <projectnature>org.eclipse.jdt.core.javanature</projectnature> + </projectnatures> + <buildcommands> + <buildcommand>org.scala-ide.sdt.core.scalabuilder</buildcommand> + </buildcommands> + <classpathContainers> + <classpathContainer>org.scala-ide.sdt.launching.SCALA_CONTAINER</classpathContainer> + <classpathContainer>org.eclipse.jdt.launching.JRE_CONTAINER</classpathContainer> + </classpathContainers> + <excludes> + <!-- in Eclipse, use scala-library, scala-compiler + from the SCALA_CONTAINER rather than POM <dependency> --> + <exclude>org.scala-lang:scala-library</exclude> + <exclude>org.scala-lang:scala-compiler</exclude> + </excludes> + <sourceIncludes> + <sourceInclude>**/*.scala</sourceInclude> + <sourceInclude>**/*.java</sourceInclude> + </sourceIncludes> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + <version>2.8</version> + <executions> + <execution> + <id>attach-javadocs</id> + <goals> + <goal>jar</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> </project> \ No newline at end of file From 7464d423544d7e27162678057895e43fefa21402 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Krenski?= <sakulk@gmail.com> Date: Fri, 29 Mar 2013 15:24:48 +0100 Subject: [PATCH 150/347] polish stopwords + Scala 2.10.1 --- pom.xml | 4 +- .../com/gravity/goose/text/stopwords-pl.txt | 272 ++++++++++++++++++ .../com/gravity/goose/TalkToMeGoose.scala | 22 +- .../com/gravity/goose/text/StopWords.scala | 2 +- .../scala/com/gravity/goose/GooseTest.scala | 2 - 5 files changed, 289 insertions(+), 13 deletions(-) create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-pl.txt diff --git a/pom.xml b/pom.xml index 9fef84cba..28bd7bce3 100644 --- a/pom.xml +++ b/pom.xml @@ -46,14 +46,14 @@ <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-compiler</artifactId> - <version>2.9.0-1</version> + <version>2.10.1</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> - <version>2.9.0-1</version> + <version>2.10.1</version> </dependency> <dependency> diff --git a/src/main/resources/com/gravity/goose/text/stopwords-pl.txt b/src/main/resources/com/gravity/goose/text/stopwords-pl.txt new file mode 100644 index 000000000..62b76714d --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-pl.txt @@ -0,0 +1,272 @@ +a +aby +ach +acz +aczkolwiek +aj +albo +ale +alez +az +bardziej +bardzo +bez +bo +bowiem +by +byli +bynajmniej +byc +byl +byla +bylo +byly +bedzie +beda +cali +cala +caly +ci +cie +ciebie +co +cokolwiek +cos +czasami +czasem +czemu +czy +czyli +daleko +dla +dlaczego +dlatego +do +dobrze +dokad +dosc +duzo +dwa +dwaj +dwie +dwoje +dzis +dzisiaj +gdy +gdyby +gdyz +gdzie +gdziekolwiek +gdzies +go +i +ich +ile +im +inna +inne +inny +innych +iz +ja +ja +jak +jakas +jakby +jaki +jakichs +jakie +jakis +jakiz +jakkolwiek +jako +jakos +je +jeden +jedna +jedno +jednak +jednakze +jego +jej +jemu +jest +jestem +jeszcze +jesli +jezeli +juz +ja +kazdy +kiedy +kilka +kims +kto +ktokolwiek +ktos +ktora +ktore +ktorego +ktorej +ktory +ktorych +ktorym +ktorzy +ku +lat +lecz +lub +ma +maja +mi +mimo +miedzy +mna +mnie +moga +moi +moim +moja +moje +moze +mozliwe +mozna +moj +mu +musi +my +na +nad +nam +nami +nas +nasi +nasz +nasze +naszego +naszych +natomiast +natychmiast +nawet +nia +nic +nich +niego +niej +niemu +nigdy +nim +nimi +niz +no +o +obok +od +okolo +on +ona +one +oni +ono +oraz +oto +owszem +pan +pana +pani +po +pod +podczas +pomimo +ponad +poniewaz +powinien +powinna +powinni +powinno +poza +prawie +przeciez +przed +przede +przedtem +przez +przy +roku +rowniez +sam +sama +sa +sie +skad +sobie +soba +sposob +swoje +sa +ta +tak +taka +taki +takie +takze +tam +te +tego +tej +ten +teraz +tez +to +toba +tobie +totez +trzeba +tu +tutaj +twoi +twoim +twoja +twoje +twym +twoj +ty +tych +tylko +tym +u +w +wam +wami +was +wasz +wasza +wasze +we +wedlug +wiele +wielu +wiec +wiecej +#wszyscy +#wszystkich +#wszystkie +#wszystkim +#wszystko - np "mecz o wszystko" +wtedy +wy +wlasnie +z +za +zapewne +zawsze +ze +znowu +znow +zostal +zaden +zadna +zadne +zadnych +ze +zeby \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala index fba111b88..84e17b05c 100644 --- a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala +++ b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala @@ -24,19 +24,25 @@ object TalkToMeGoose { */ def main(args: Array[String]) { try { - val url: String = args(0) - val config: Configuration = new Configuration - config.enableImageFetching = false - val goose = new Goose(config) - val article = goose.extractContent(url) - println(article.cleanedArticleText) - } - catch { + talk(args(0)) + } catch { case e: Exception => { System.out.println("Make sure you pass in a valid URL: " + e.toString) + e.printStackTrace() } } } + + def talk(url: String) { + val config: Configuration = new Configuration + config.enableImageFetching = false + val goose = new Goose(config) + val article = goose.extractContent(url) + println("TITLE: " + article.title) + println("DATE: " + article.publishDate) + println("TAGS: " + article.tags) + println("TEXT: " + article.cleanedArticleText) + } } diff --git a/src/main/scala/com/gravity/goose/text/StopWords.scala b/src/main/scala/com/gravity/goose/text/StopWords.scala index f1b7ea94d..5a00965be 100644 --- a/src/main/scala/com/gravity/goose/text/StopWords.scala +++ b/src/main/scala/com/gravity/goose/text/StopWords.scala @@ -32,7 +32,7 @@ object StopWords { // the confusing pattern below is basically just match any non-word character excluding white-space. private val PUNCTUATION: StringReplacement = StringReplacement.compile("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\p{Pc}\\s]", string.empty) - val STOP_WORDS = FileHelper.loadResourceFile("stopwords-en.txt", StopWords.getClass).split(sys.props("line.separator")).toSet + val STOP_WORDS = FileHelper.loadResourceFile("stopwords-pl.txt", StopWords.getClass).split(sys.props("line.separator")).toSet def removePunctuation(str: String): String = { diff --git a/src/test/scala/com/gravity/goose/GooseTest.scala b/src/test/scala/com/gravity/goose/GooseTest.scala index 7235a34ef..42f0a3807 100644 --- a/src/test/scala/com/gravity/goose/GooseTest.scala +++ b/src/test/scala/com/gravity/goose/GooseTest.scala @@ -2,8 +2,6 @@ package com.gravity.goose import org.junit.Test import org.junit.Assert._ -import scala.actors.Future -import scala.actors.Futures._ /** * Created by Jim Plush From 764af343a66d4f73ed86ce6cd015f60962f8bc73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Krenski?= <sakulk@gmail.com> Date: Wed, 3 Apr 2013 12:23:59 +0200 Subject: [PATCH 151/347] back to Scala 2.9.3 because of problems with calling methods from Java --- pom.xml | 15 ++++++++++----- .../goose/extractors/ContentExtractor.scala | 7 +++++-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 28bd7bce3..8c1bfa22a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,14 +4,19 @@ <groupId>com.gravity</groupId> <artifactId>goose</artifactId> - <version>2.1.22</version> + <version>2.1.23</version> <packaging>jar</packaging> <name>goose</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> - + <distributionManagement> + <repository> + <id>chimeo_dep</id> + <url>http://nexus.senti1.com/content/repositories/chimeo_dep</url> + </repository> + </distributionManagement> <dependencies> <dependency> <groupId>junit</groupId> @@ -46,14 +51,14 @@ <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-compiler</artifactId> - <version>2.10.1</version> + <version>2.9.3</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> - <version>2.10.1</version> + <version>2.9.3</version> </dependency> <dependency> @@ -91,7 +96,7 @@ <plugin> <groupId>org.scala-tools</groupId> <artifactId>maven-scala-plugin</artifactId> - <version>2.14.3</version> + <version>2.15.2</version> <configuration> <charset>UTF-8</charset> <jvmArgs> diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index 51838e335..3f0539ccc 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -179,6 +179,10 @@ trait ContentExtractor { tags.toSet } + def calculateBestNodeBasedOnClustering(article: Article): Option[Element] = { + calculateBestNodeBasedOnClustering(article.doc) + } + /** * we're going to start looking for where the clusters of paragraphs are. We'll score a cluster based on the number of stopwords * and the number of consecutive paragraphs together, which should form the cluster of text that this node is around @@ -188,9 +192,8 @@ trait ContentExtractor { * @return */ - def calculateBestNodeBasedOnClustering(article: Article): Option[Element] = { + def calculateBestNodeBasedOnClustering(doc: Document): Option[Element] = { trace(logPrefix + "Starting to calculate TopNode") - val doc = article.doc var topNode: Element = null val nodesToCheck = Collector.collect(TOP_NODE_TAGS, doc) var startingBoost: Double = 1.0 From 44ea24a255dda4d082453318fe940ec21e87012e Mon Sep 17 00:00:00 2001 From: Bartosz Bazinski <baza@baza.(none)> Date: Fri, 5 Apr 2013 14:35:06 +0200 Subject: [PATCH 152/347] Limited false positives on lists of articles --- .gitignore | 1 + pom.xml | 2 +- .../goose/extractors/ContentExtractor.scala | 53 ++++++++++++------- .../com/gravity/goose/text/WordStats.scala | 28 +++++----- 4 files changed, 51 insertions(+), 33 deletions(-) diff --git a/.gitignore b/.gitignore index 615c5c5c9..068ff5c55 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ target/ /goose.iml /goose.ipr /goose.iws +.idea/ diff --git a/pom.xml b/pom.xml index 8c1bfa22a..ad58eaa99 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ <groupId>com.gravity</groupId> <artifactId>goose</artifactId> - <version>2.1.23</version> + <version>2.1.24-SENTIONE</version> <packaging>jar</packaging> <name>goose</name> <url>http://maven.apache.org</url> diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index 3f0539ccc..6464c74d9 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -53,7 +53,7 @@ trait ContentExtractor { val SPACE_SPLITTER: StringSplitter = new StringSplitter(" ") val NO_STRINGS = Set.empty[String] val A_REL_TAG_SELECTOR: String = "a[rel=tag], a[href*=/tag/]" - val TOP_NODE_TAGS = new TagsEvaluator(Set("p", "td", "pre")) + val TOP_NODE_TAGS = new TagsEvaluator(Set("p", "td", "pre", "strong")) def getTitle(article: Article): String = { var title: String = string.empty @@ -205,6 +205,7 @@ trait ContentExtractor { val nodeText: String = node.text val wordStats: WordStats = StopWords.getStopWordCount(nodeText) val highLinkDensity: Boolean = isHighLinkDensity(node) + trace("Candidate: " + node.tagName() + " score: " + wordStats + " d:" + highLinkDensity + " text:" + nodeText) if (wordStats.getStopWordCount > 2 && !highLinkDensity) { nodesWithText.add(node) } @@ -234,7 +235,7 @@ trait ContentExtractor { } } - trace(logPrefix + "Location Boost Score: " + boostScore + " on interation: " + i + "' id='" + node.parent.id + "' class='" + node.parent.attr("class")) + debug(logPrefix + "Location Boost Score: " + boostScore + " on interation: " + i + "' id='" + node.parent.id + "' class='" + node.parent.attr("class")) val nodeText: String = node.text val wordStats: WordStats = StopWords.getStopWordCount(nodeText) @@ -268,6 +269,11 @@ trait ContentExtractor { } } printTraceLog(topNode) + if(topNode != null && getScore(topNode) < 20) + { + debug("TopNode score is too small!") + return None + } if (topNode == null) None else Some(topNode) } @@ -300,7 +306,7 @@ trait ContentExtractor { walkSiblings(node) { currentNode => { - if (currentNode.tagName == para) { + if (currentNode.tagName == para || currentNode.tagName == "strong") { if (stepsAway >= maxStepsAwayFromNode) { trace(logPrefix + "Next paragraph is too far away, not boosting") return false @@ -308,7 +314,7 @@ trait ContentExtractor { val paraText: String = currentNode.text val wordStats: WordStats = StopWords.getStopWordCount(paraText) if (wordStats.getStopWordCount > minimumStopWordCount) { - trace(logPrefix + "We're gonna boost this node, seems contenty") + trace(logPrefix + "We're gonna boost this node, seems contenty " + debugNode(node)) return true } stepsAway += 1 @@ -329,8 +335,9 @@ trait ContentExtractor { * @param e * @return */ - private def isHighLinkDensity(e: Element): Boolean = { + private def isHighLinkDensity(e: Element, limit: Double = 0.1): Boolean = { val links: Elements = e.getElementsByTag("a") + links.addAll(e.getElementsByAttribute("onclick")) if (links.size == 0) { return false } @@ -350,7 +357,7 @@ trait ContentExtractor { trace(logPrefix + "Calulated link density score as: " + score + " for node: " + getShortText(e.text, 50)) - if (score > 1) { + if (score > limit) { return true } false @@ -469,15 +476,15 @@ trait ContentExtractor { def isTableTagAndNoParagraphsExist(e: Element): Boolean = { - val subParagraphs: Elements = e.getElementsByTag("p") + val subParagraphs: Elements = getChildParagraphs(e) for (p <- subParagraphs) { if (p.text.length < 25) { p.remove() } } - val subParagraphs2: Elements = e.getElementsByTag("p") + val subParagraphs2: Elements = getChildParagraphs(e) if (subParagraphs2.size == 0 && !(e.tagName == "td")) { - trace("Removing node because it doesn't have any paragraphs") + trace("Removing node because it doesn't have any paragraphs " + debugNode(e)) true } else { false @@ -497,7 +504,7 @@ trait ContentExtractor { val node = addSiblings(targetNode) for { e <- node.children - if (e.tagName != "p") + if (e.tagName != "p" && e.tagName != "strong") } { trace(logPrefix + "CLEANUP NODE: " + e.id + " class: " + e.attr("class")) if (isHighLinkDensity(e) || isTableTagAndNoParagraphsExist(e) || !isNodeScoreThreshholdMet(node, e)) { @@ -520,7 +527,7 @@ trait ContentExtractor { trace(logPrefix + "topNodeScore: " + topNodeScore + " currentNodeScore: " + currentNodeScore + " threshold: " + thresholdScore) if ((currentNodeScore < thresholdScore) && e.tagName != "td") { - trace(logPrefix + "Removing node due to low threshold score") + trace(logPrefix + "Removing node due to low threshold score " + debugNode(e)) false } else { trace(logPrefix + "Not removing TD node") @@ -528,6 +535,13 @@ trait ContentExtractor { } } + def getChildParagraphs(e: Element): Elements = + { + val potentialParagraphs: Elements = e.getElementsByTag("p") + potentialParagraphs.addAll(e.getElementsByTag("strong")) + potentialParagraphs + } + /** * adds any siblings that may have a decent score to this node * @@ -536,12 +550,12 @@ trait ContentExtractor { */ def getSiblingContent(currentSibling: Element, baselineScoreForSiblingParagraphs: Int): Option[String] = { - if (currentSibling.tagName == "p" && currentSibling.text.length() > 0) { + if ((currentSibling.tagName == "p" || currentSibling.tagName == "strong") && currentSibling.text.length() > 0) { Some(currentSibling.outerHtml) } else { - val potentialParagraphs: Elements = currentSibling.getElementsByTag("p") + val potentialParagraphs: Elements = getChildParagraphs(currentSibling) if (potentialParagraphs.first == null) { None } else { @@ -606,7 +620,7 @@ trait ContentExtractor { var base: Int = 100000 var numberOfParagraphs: Int = 0 var scoreOfParagraphs: Int = 0 - val nodesToCheck: Elements = topNode.getElementsByTag("p") + val nodesToCheck: Elements = getChildParagraphs(topNode) for (node <- nodesToCheck) { val nodeText: String = node.text @@ -628,14 +642,17 @@ trait ContentExtractor { private def debugNode(e: Element): String = { val sb: StringBuilder = new StringBuilder - sb.append("GravityScore: '") - sb.append(e.attr("gravityScore")) - sb.append("' paraNodeCount: '") - sb.append(e.attr("gravityNodes")) + sb.append("tag '") + sb.append(e.tagName) sb.append("' nodeId: '") sb.append(e.id) sb.append("' className: '") sb.append(e.attr("class")) + sb.append("' GravityScore: '") + sb.append(e.attr("gravityScore")) + sb.append("' paraNodeCount: '") + sb.append(e.attr("gravityNodes")) + sb.append("'") sb.toString() } } \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/text/WordStats.scala b/src/main/scala/com/gravity/goose/text/WordStats.scala index d6b6006c4..b99d957e6 100644 --- a/src/main/scala/com/gravity/goose/text/WordStats.scala +++ b/src/main/scala/com/gravity/goose/text/WordStats.scala @@ -7,7 +7,7 @@ * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -22,10 +22,10 @@ import java.util.ArrayList import java.util.List /** -* User: Jim Plush -* Date: Oct 29, 2010 -* Time: 3:59:44 PM -*/ + * User: Jim Plush + * Date: Oct 29, 2010 + * Time: 3:59:44 PM + */ object WordStats { var EMPTY: WordStats = new WordStats } @@ -33,19 +33,17 @@ object WordStats { class WordStats { - import WordStats._ - /** - * total number of stopwords or good words that we can calculate - */ + * total number of stopwords or good words that we can calculate + */ var stopWordCount: Int = 0 /** - * total number of words on a node - */ + * total number of words on a node + */ var wordCount: Int = 0 /** - * holds an actual list of the stop words we found - */ + * holds an actual list of the stop words we found + */ var stopWords: List[String] = new ArrayList[String] def getStopWords: List[String] = { @@ -72,6 +70,8 @@ class WordStats { wordCount = cnt } - + override def toString: String = { + "" + this.stopWordCount + "/" + wordCount + } } From d4f05be4b0a4c3deb0a2a74cb5b9c28c5dbd50ba Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Wed, 17 Apr 2013 12:30:36 -0700 Subject: [PATCH 153/347] some versioning changes --- pom.xml | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/pom.xml b/pom.xml index 479205941..b96c95b6a 100644 --- a/pom.xml +++ b/pom.xml @@ -2,26 +2,13 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> - <groupId>com.unfold</groupId> + <groupId>com.skyshard</groupId> <artifactId>goose-fork</artifactId> <version>2.1.23-SNAPSHOT</version> <packaging>jar</packaging> - <name>Goose - Unfold Fork</name> - - <distributionManagement> - <repository> - <id>unfold-release</id> - <name>Unfold Nexus Release Repository</name> - <url>http://git.tacenda.com:8081/nexus/content/repositories/releases</url> - </repository> - <snapshotRepository> - <id>unfold-snapshot</id> - <name>Unfold Nexus Snapshot Repository</name> - <url>http://git.tacenda.com:8081/nexus/content/repositories/snapshots</url> - </snapshotRepository> - </distributionManagement> + <name>Goose - Fork</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> @@ -61,14 +48,14 @@ <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-compiler</artifactId> - <version>2.9.0-1</version> + <version>2.9.2</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> - <version>2.9.0-1</version> + <version>2.9.2</version> </dependency> <dependency> From 4774ebd5abedf0b32ffd4cc0c47495a11ddcba64 Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Wed, 17 Apr 2013 14:06:44 -0700 Subject: [PATCH 154/347] upgrade httpclient for bugfixes --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b96c95b6a..d0737d753 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> - <version>4.2.2</version> + <version>4.2.4</version> </dependency> <dependency> <groupId>commons-lang</groupId> From 1e83e8a49ad4616a605d20a0fdd01d8cd8611035 Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Wed, 17 Apr 2013 14:06:55 -0700 Subject: [PATCH 155/347] sbt stuff? --- project/build.sbt | 1 + 1 file changed, 1 insertion(+) create mode 100644 project/build.sbt diff --git a/project/build.sbt b/project/build.sbt new file mode 100644 index 000000000..cb98949ac --- /dev/null +++ b/project/build.sbt @@ -0,0 +1 @@ +externalPom(baseDirectory(_ / "../pom.xml")) \ No newline at end of file From 9baa3b51c68cc56286a159be1d9e92948754d38b Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Thu, 18 Apr 2013 19:08:29 -0700 Subject: [PATCH 156/347] make buildable with sbt --- pom.xml | 156 ------------------ project/Build.scala | 22 +++ project/build.properties | 1 + project/build.sbt | 2 +- .../com/gravity/goose/Configuration.scala | 4 +- 5 files changed, 26 insertions(+), 159 deletions(-) delete mode 100644 pom.xml create mode 100644 project/Build.scala create mode 100644 project/build.properties diff --git a/pom.xml b/pom.xml deleted file mode 100644 index d0737d753..000000000 --- a/pom.xml +++ /dev/null @@ -1,156 +0,0 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - - <groupId>com.skyshard</groupId> - <artifactId>goose-fork</artifactId> - <version>2.1.23-SNAPSHOT</version> - - <packaging>jar</packaging> - - <name>Goose - Fork</name> - - <properties> - <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - </properties> - - <dependencies> - <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - <version>4.8.1</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - <version>1.6.1</version> - <type>jar</type> - <scope>compile</scope> - </dependency> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-log4j12</artifactId> - <version>1.6.1</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.jsoup</groupId> - <artifactId>jsoup</artifactId> - <version>1.5.2</version> - </dependency> - <dependency> - <groupId>commons-io</groupId> - <artifactId>commons-io</artifactId> - <version>2.0.1</version> - </dependency> - - <dependency> - <groupId>org.scala-lang</groupId> - <artifactId>scala-compiler</artifactId> - <version>2.9.2</version> - <scope>compile</scope> - </dependency> - - <dependency> - <groupId>org.scala-lang</groupId> - <artifactId>scala-library</artifactId> - <version>2.9.2</version> - </dependency> - - <dependency> - <groupId>org.apache.httpcomponents</groupId> - <artifactId>httpclient</artifactId> - <version>4.2.4</version> - </dependency> - <dependency> - <groupId>commons-lang</groupId> - <artifactId>commons-lang</artifactId> - <version>2.6</version> - </dependency> - </dependencies> - - <!-- - Hey... since we're open source, let's compile the source and javadocs into jars as well - --> - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <version>2.6</version> - <configuration> - <useFile>false</useFile> - <disableXmlReport>true</disableXmlReport> - <includes> - <include>**/*Test.*</include> - </includes> - <excludes> - <exclude>**/*IT.*</exclude> - </excludes> - </configuration> - </plugin> - <plugin> - <groupId>org.scala-tools</groupId> - <artifactId>maven-scala-plugin</artifactId> - <version>2.14.3</version> - <configuration> - <charset>UTF-8</charset> - <jvmArgs> - <jvmArg>-Xmx1024m</jvmArg> - </jvmArgs> - </configuration> - <executions> - <execution> - <id>compile</id> - <goals> - <goal>compile</goal> - </goals> - <phase>compile</phase> - </execution> - <execution> - <id>test-compile</id> - <goals> - <goal>testCompile</goal> - </goals> - <phase>test-compile</phase> - </execution> - <execution> - <phase>process-resources</phase> - <goals> - <goal>compile</goal> - </goals> - </execution> - - </executions> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-source-plugin</artifactId> - <version>2.1.2</version> - <executions> - <execution> - <id>attach-sources</id> - <goals> - <goal>jar</goal> - </goals> - </execution> - </executions> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-javadoc-plugin</artifactId> - <version>2.8</version> - <executions> - <execution> - <id>attach-javadocs</id> - <goals> - <goal>jar</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - -</project> \ No newline at end of file diff --git a/project/Build.scala b/project/Build.scala new file mode 100644 index 000000000..c16d6c3b3 --- /dev/null +++ b/project/Build.scala @@ -0,0 +1,22 @@ +import sbt._ +import Keys._ + +object Dependencies { + val Junit = "junit" % "junit" % "4.8.1" + val Slf4jApi = "org.slf4j" % "slf4j-api" % "1.6.6" + val Slf4jLog4j12 = "org.slf4j" % "slf4j-log4j12" % "1.6.6" + val Jsoup = "org.jsoup" % "jsoup" % "1.7.2" + val CommonsIo = "commons-io" % "commons-io" % "2.0.1" + val ScalaCompiler = "org.scala-lang" % "scala-compiler" % "2.9.2" + val ScalaLibrary = "org.scala-lang" % "scala-library" % "2.9.2" + val Httpclient = "org.apache.httpcomponents" % "httpclient" % "4.2.4" + val CommonsLang = "commons-lang" % "commons-lang" % "2.6" +} + +object GooseBuild extends Build { + import Dependencies._ + + lazy val root = Project("goose", file("."), + settings = Defaults.defaultSettings ++ + Seq(libraryDependencies ++= Seq(Junit, Slf4jApi, Slf4jLog4j12, Jsoup, CommonsIo, ScalaCompiler, ScalaLibrary, Httpclient, CommonsLang))) +} \ No newline at end of file diff --git a/project/build.properties b/project/build.properties new file mode 100644 index 000000000..21e2c5d75 --- /dev/null +++ b/project/build.properties @@ -0,0 +1 @@ +sbt.version=0.12.2 \ No newline at end of file diff --git a/project/build.sbt b/project/build.sbt index cb98949ac..a0ed83a0b 100644 --- a/project/build.sbt +++ b/project/build.sbt @@ -1 +1 @@ -externalPom(baseDirectory(_ / "../pom.xml")) \ No newline at end of file +resolvers += Classpaths.typesafeResolver \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index 385e027fa..dd9e637d1 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -65,12 +65,12 @@ class Configuration { * path to your imagemagick convert executable, on the mac using mac ports this is the default listed */ @BeanProperty - var imagemagickConvertPath: String = "/opt/local/bin/convert" + var imagemagickConvertPath: String = "convert" /** * path to your imagemagick identify executable */ @BeanProperty - var imagemagickIdentifyPath: String = "/opt/local/bin/identify" + var imagemagickIdentifyPath: String = "identify" @BeanProperty var connectionTimeout: Int = 10000 From d5ec76cf7d7b5e28d8e7a4e6eb27ef5e42ae4ad0 Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Thu, 18 Apr 2013 20:07:09 -0700 Subject: [PATCH 157/347] put pom back for future reference, add build.sbt --- build.sbt | 5 ++ pom.xml | 156 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+) create mode 100644 build.sbt create mode 100644 pom.xml diff --git a/build.sbt b/build.sbt new file mode 100644 index 000000000..496e5128b --- /dev/null +++ b/build.sbt @@ -0,0 +1,5 @@ +name := "goose-fork" + +version := "2.1.23-SNAPSHOT" + +scalaVersion := "2.9.2" \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 000000000..d0737d753 --- /dev/null +++ b/pom.xml @@ -0,0 +1,156 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>com.skyshard</groupId> + <artifactId>goose-fork</artifactId> + <version>2.1.23-SNAPSHOT</version> + + <packaging>jar</packaging> + + <name>Goose - Fork</name> + + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + </properties> + + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.8.1</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <version>1.6.1</version> + <type>jar</type> + <scope>compile</scope> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + <version>1.6.1</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.jsoup</groupId> + <artifactId>jsoup</artifactId> + <version>1.5.2</version> + </dependency> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>2.0.1</version> + </dependency> + + <dependency> + <groupId>org.scala-lang</groupId> + <artifactId>scala-compiler</artifactId> + <version>2.9.2</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>org.scala-lang</groupId> + <artifactId>scala-library</artifactId> + <version>2.9.2</version> + </dependency> + + <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpclient</artifactId> + <version>4.2.4</version> + </dependency> + <dependency> + <groupId>commons-lang</groupId> + <artifactId>commons-lang</artifactId> + <version>2.6</version> + </dependency> + </dependencies> + + <!-- + Hey... since we're open source, let's compile the source and javadocs into jars as well + --> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>2.6</version> + <configuration> + <useFile>false</useFile> + <disableXmlReport>true</disableXmlReport> + <includes> + <include>**/*Test.*</include> + </includes> + <excludes> + <exclude>**/*IT.*</exclude> + </excludes> + </configuration> + </plugin> + <plugin> + <groupId>org.scala-tools</groupId> + <artifactId>maven-scala-plugin</artifactId> + <version>2.14.3</version> + <configuration> + <charset>UTF-8</charset> + <jvmArgs> + <jvmArg>-Xmx1024m</jvmArg> + </jvmArgs> + </configuration> + <executions> + <execution> + <id>compile</id> + <goals> + <goal>compile</goal> + </goals> + <phase>compile</phase> + </execution> + <execution> + <id>test-compile</id> + <goals> + <goal>testCompile</goal> + </goals> + <phase>test-compile</phase> + </execution> + <execution> + <phase>process-resources</phase> + <goals> + <goal>compile</goal> + </goals> + </execution> + + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-source-plugin</artifactId> + <version>2.1.2</version> + <executions> + <execution> + <id>attach-sources</id> + <goals> + <goal>jar</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + <version>2.8</version> + <executions> + <execution> + <id>attach-javadocs</id> + <goals> + <goal>jar</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> + +</project> \ No newline at end of file From bf9bb666b37e6d1db16ef4cdcbc8ffa8f108c7e3 Mon Sep 17 00:00:00 2001 From: Jay Taylor <outtatime@gmail.com> Date: Sun, 21 Apr 2013 12:04:28 -0700 Subject: [PATCH 158/347] Version bumped to 2.1.22. --- project/GooseBuild.scala | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/project/GooseBuild.scala b/project/GooseBuild.scala index 15f3b39e7..8535483fd 100644 --- a/project/GooseBuild.scala +++ b/project/GooseBuild.scala @@ -10,7 +10,7 @@ object GooseBuild extends Build { settings = Project.defaultSettings ++ Seq( description := "Html Content / Article Extractor in Scala", organization := "com.gravity", - version := "2.1.21-SNAPSHOT", + version := "2.1.22-SNAPSHOT", version <<= version { v => //only release *if* -Drelease=true is passed to JVM val release = Option(System.getProperty("release")) == Some("true") if (release) { @@ -44,12 +44,7 @@ object GooseBuild extends Build { </developer> </developers> ), - publishTo <<= version { v => //add credentials to ~/.sbt/sonatype.sbt - /*val nexus = "https://oss.sonatype.org/" - if (v.trim.endsWith("SNAPSHOT")) - Some("snapshots" at nexus + "content/repositories/snapshots") - else - Some("releases" at nexus + "service/local/staging/deploy/maven2")*/ + publishTo <<= version { v => Some(Resolver.sftp( "Scala.sh Repository", "scala.sh", From f1fa73f00e814fd13c160425f4eb5bef9e435892 Mon Sep 17 00:00:00 2001 From: Toby Thain <toby@telegraphics.com.au> Date: Sun, 28 Apr 2013 13:26:55 -0400 Subject: [PATCH 159/347] Fix typos, wrap lines. --- README.md | 47 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 47af399be..b7c6c9e78 100644 --- a/README.md +++ b/README.md @@ -1,41 +1,51 @@ #Goose - Article Extractor -##Intro +##Intro -Goose was originally an article extractor written in Java that has most recently (aug2011) converted to a scala project. It's mission is to take any news article or article type web page and not only extract what is the main body of the article but also all meta data and most probable image candidate. +Goose was originally an article extractor written in Java that has been +converted to a scala project. Its mission is to take a news article +or article-type web page and extract the main body of the article, all +metadata, and most probable image candidate. -The extraction goal is to try and get the purest extraction from the beginning of the article for servicing flipboard/pulse type applications that need to show the first snippet of a web article along with an image. +The extraction goal is the purest extraction from the beginning of the +article for servicing flipboard/pulse type applications that need to +show the first snippet of a web article along with an image. Goose will try to extract the following information: - Main text of an article - Main image of article - - Any Youtube/Vimeo movies embedded in article + - Any YouTube/Vimeo movies embedded in article - Meta Description - Meta tags - Publish Date -The wiki has the full details on how to use Goose [https://github.com/jiminoc/goose/wiki](https://github.com/jiminoc/goose/wiki) +The wiki has the full details on how to use Goose +[https://github.com/jiminoc/goose/wiki](https://github.com/jiminoc/goose/wiki) Goose was open sourced by Gravity.com in 2011 Lead Programmer: Jim Plush (Gravity.com) -Contributers: Robbie Coleman (Gravity.com) +Contributors: Robbie Coleman (Gravity.com) -Try it out online! -http://jimplush.com/blog/goose +[Try it out online!](http://jimplush.com/blog/goose) ##Licensing -If you find Goose useful or have issues please drop me a line, I'd love to hear how you're using it or what features should be improved -Goose is licensed by Gravity.com under the Apache 2.0 license, see the LICENSE file for more details +If you find Goose useful or have issues, please drop me a line, I'd love +to hear how you're using it or what features should be improved. + +Goose is licensed by Gravity.com under the Apache 2.0 license, see the +LICENSE file for more details. + ##Take it for a spin + To use goose from the command line: cd into the goose directory @@ -47,12 +57,21 @@ To use goose from the command line: Here are some of the reasons for the port to Scala: - - Gravity has moved more towards Scala development internally so maintenance started to become an issue + - Gravity has moved more towards Scala development internally so + maintenance started to become an issue - There wasn't enough contribution to warrant keeping it in Java - - The packages were all namespaced under a person's name and not the company's name + - The packages were all namespaced under a person's name and not the + company's name - Scala is more fun ##Issues -It was a pretty fast Java to Scala port so lots of the nicities of the Scala language aren't in the codebase yet, but those will come over the coming months as we re-write alot of the internal methods to be more Scalesque. -We made sure it was still nice and operable from Java as well so if you're using goose from java you still should be able to use it with a few changes to the method signatures. \ No newline at end of file + +The Java to Scala port was done quickly, so many niceties of the +Scala language aren't in the codebase yet, but those will come over the +coming months as we re-write alot of the internal methods to be more +Scala-esque. + +We made sure it was still nice and operable from Java as well, so you +should still be able to use goose from java with a few changes to the +method signatures. From b1aad5708ad783104199e1da7e32c179e7f322c1 Mon Sep 17 00:00:00 2001 From: Toby Thain <toby@telegraphics.com.au> Date: Sun, 28 Apr 2013 13:47:05 -0400 Subject: [PATCH 160/347] Minor typos. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b7c6c9e78..08a92d4c6 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ##Intro Goose was originally an article extractor written in Java that has been -converted to a scala project. Its mission is to take a news article +converted to a Scala project. Its mission is to take a news article or article-type web page and extract the main body of the article, all metadata, and most probable image candidate. @@ -53,7 +53,7 @@ To use goose from the command line: MAVEN_OPTS="-Xms256m -Xmx2000m"; mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="http://techcrunch.com/2011/05/13/native-apps-or-web-apps-particle-code-wants-you-to-do-both/" -e -q > ~/Desktop/gooseresult.txt -##Regarding the port from JAVA to Scala +##Regarding the port from Java to Scala Here are some of the reasons for the port to Scala: From c889f7b1dc008e6f775763ece1d4c658c0eefb33 Mon Sep 17 00:00:00 2001 From: Toby Thain <toby@telegraphics.com.au> Date: Sun, 28 Apr 2013 14:52:29 -0400 Subject: [PATCH 161/347] Add basic SBT build configuration. --- build.sbt | 26 ++++++++++++++ .../com/gravity/goose/TalkToMeGoose.scala | 36 +++++++++++-------- 2 files changed, 47 insertions(+), 15 deletions(-) create mode 100644 build.sbt diff --git a/build.sbt b/build.sbt new file mode 100644 index 000000000..0e1bdf902 --- /dev/null +++ b/build.sbt @@ -0,0 +1,26 @@ +name := "Goose" + +version := "2.1.22" + +organization := "GravityLabs" + +organizationHomepage := Some(url("http://gravity.com/")) + +homepage := Some(url("https://github.com/GravityLabs/goose")) + +description := "Extracts text, metadata, and key image from web articles." + +licenses += "Apache2" -> url("http://www.apache.org/licenses/") + +// scalacOptions ++= Seq("-unchecked", "-deprecation") + +libraryDependencies ++= Seq( + "junit" % "junit" % "4.8.1" % "test", + "org.slf4j" % "slf4j-api" % "1.6.1" % "compile", + "org.slf4j" % "slf4j-log4j12" % "1.6.1" % "test", + "org.slf4j" % "slf4j-simple" % "1.6.1", + "org.jsoup" % "jsoup" % "1.5.2", + "commons-io" % "commons-io" % "2.0.1", + "org.apache.httpcomponents" % "httpclient" % "4.1.2", + "commons-lang" % "commons-lang" % "2.6" +) diff --git a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala index fba111b88..e4351c99c 100644 --- a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala +++ b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala @@ -7,21 +7,27 @@ package com.gravity.goose */ object TalkToMeGoose { /** - * you can use this method if you want to run goose from the command line to extract html from a bashscript - * or to just test it's functionality - * you can run it like so - * cd into the goose root - * mvn compile - * MAVEN_OPTS="-Xms256m -Xmx2000m"; mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="http://techcrunch.com/2011/05/13/native-apps-or-web-apps-particle-code-wants-you-to-do-both/" -e -q > ~/Desktop/gooseresult.txt - * - * Some top gun love: - * Officer: [in the midst of the MIG battle] Both Catapults are broken, sir. - * Stinger: How long will it take? - * Officer: It'll take ten minutes. - * Stinger: Bullshit ten minutes! This thing will be over in two minutes! Get on it! - * - * @param args - */ + * You can use this method to run goose from the command line + * to extract html from a bash script, or to just test its functionality: + * + * cd into the goose root + * mvn compile + * MAVEN_OPTS="-Xms256m -Xmx2000m"; mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="http://techcrunch.com/2011/05/13/native-apps-or-web-apps-particle-code-wants-you-to-do-both/" -e -q > ~/Desktop/gooseresult.txt + * + * or if using sbt: + * + * cd into the goose root + * sbt + * > run http://www.thestar.com/news/insight/2013/04/26/spotting_tiny_gnatcatcher_can_put_a_spring_in_your_step.html + * + * Some top gun love: + * Officer: [in the midst of the MIG battle] Both Catapults are broken, sir. + * Stinger: How long will it take? + * Officer: It'll take ten minutes. + * Stinger: Bullshit ten minutes! This thing will be over in two minutes! Get on it! + * + * @param args + */ def main(args: Array[String]) { try { val url: String = args(0) From ceb5af118bfb2e0c455a83e8b6cb2b76cfe1259e Mon Sep 17 00:00:00 2001 From: Toby Thain <toby@telegraphics.com.au> Date: Sun, 28 Apr 2013 14:52:29 -0400 Subject: [PATCH 162/347] Add basic SBT build configuration. --- build.sbt | 26 ++++++++++++++ .../com/gravity/goose/TalkToMeGoose.scala | 36 +++++++++++-------- 2 files changed, 47 insertions(+), 15 deletions(-) create mode 100644 build.sbt diff --git a/build.sbt b/build.sbt new file mode 100644 index 000000000..0e1bdf902 --- /dev/null +++ b/build.sbt @@ -0,0 +1,26 @@ +name := "Goose" + +version := "2.1.22" + +organization := "GravityLabs" + +organizationHomepage := Some(url("http://gravity.com/")) + +homepage := Some(url("https://github.com/GravityLabs/goose")) + +description := "Extracts text, metadata, and key image from web articles." + +licenses += "Apache2" -> url("http://www.apache.org/licenses/") + +// scalacOptions ++= Seq("-unchecked", "-deprecation") + +libraryDependencies ++= Seq( + "junit" % "junit" % "4.8.1" % "test", + "org.slf4j" % "slf4j-api" % "1.6.1" % "compile", + "org.slf4j" % "slf4j-log4j12" % "1.6.1" % "test", + "org.slf4j" % "slf4j-simple" % "1.6.1", + "org.jsoup" % "jsoup" % "1.5.2", + "commons-io" % "commons-io" % "2.0.1", + "org.apache.httpcomponents" % "httpclient" % "4.1.2", + "commons-lang" % "commons-lang" % "2.6" +) diff --git a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala index fba111b88..e4351c99c 100644 --- a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala +++ b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala @@ -7,21 +7,27 @@ package com.gravity.goose */ object TalkToMeGoose { /** - * you can use this method if you want to run goose from the command line to extract html from a bashscript - * or to just test it's functionality - * you can run it like so - * cd into the goose root - * mvn compile - * MAVEN_OPTS="-Xms256m -Xmx2000m"; mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="http://techcrunch.com/2011/05/13/native-apps-or-web-apps-particle-code-wants-you-to-do-both/" -e -q > ~/Desktop/gooseresult.txt - * - * Some top gun love: - * Officer: [in the midst of the MIG battle] Both Catapults are broken, sir. - * Stinger: How long will it take? - * Officer: It'll take ten minutes. - * Stinger: Bullshit ten minutes! This thing will be over in two minutes! Get on it! - * - * @param args - */ + * You can use this method to run goose from the command line + * to extract html from a bash script, or to just test its functionality: + * + * cd into the goose root + * mvn compile + * MAVEN_OPTS="-Xms256m -Xmx2000m"; mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="http://techcrunch.com/2011/05/13/native-apps-or-web-apps-particle-code-wants-you-to-do-both/" -e -q > ~/Desktop/gooseresult.txt + * + * or if using sbt: + * + * cd into the goose root + * sbt + * > run http://www.thestar.com/news/insight/2013/04/26/spotting_tiny_gnatcatcher_can_put_a_spring_in_your_step.html + * + * Some top gun love: + * Officer: [in the midst of the MIG battle] Both Catapults are broken, sir. + * Stinger: How long will it take? + * Officer: It'll take ten minutes. + * Stinger: Bullshit ten minutes! This thing will be over in two minutes! Get on it! + * + * @param args + */ def main(args: Array[String]) { try { val url: String = args(0) From 042a3b00e8d6b6d7797bb0f476ae04e5176c8d78 Mon Sep 17 00:00:00 2001 From: Patrick Liang <skyshard@gmail.com> Date: Fri, 17 May 2013 18:00:20 -0700 Subject: [PATCH 163/347] attempt fixes for blank content timeouts --- project/build.sbt | 2 + .../com/gravity/goose/Configuration.scala | 4 +- .../gravity/goose/network/HtmlFetcher.scala | 25 +++++++---- .../network/IdleConnectionMonitorThread.java | 41 +++++++++++++++++++ src/test/resources/log4j.properties | 2 +- 5 files changed, 63 insertions(+), 11 deletions(-) create mode 100644 src/main/scala/com/gravity/goose/network/IdleConnectionMonitorThread.java diff --git a/project/build.sbt b/project/build.sbt index a0ed83a0b..53bd52a94 100644 --- a/project/build.sbt +++ b/project/build.sbt @@ -1 +1,3 @@ +scalacOptions += "-deprecation" + resolvers += Classpaths.typesafeResolver \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index dd9e637d1..3c427b4a8 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -73,10 +73,10 @@ class Configuration { var imagemagickIdentifyPath: String = "identify" @BeanProperty - var connectionTimeout: Int = 10000 + var connectionTimeout: Int = 10000 // 10 seconds @BeanProperty - var socketTimeout: Int = 10000 + var socketTimeout: Int = 10000 // 10 seconds /** * used as the user agent that is sent with your web requests to extract an article diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index 34ebf44a7..a4cf02ebe 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -31,7 +31,7 @@ import org.apache.http.conn.ssl.SSLSocketFactory import org.apache.http.conn.scheme.Scheme import org.apache.http.conn.scheme.SchemeRegistry import org.apache.http.cookie.Cookie -import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager +import org.apache.http.impl.conn.PoolingClientConnectionManager import org.apache.http.params.BasicHttpParams import org.apache.http.params.HttpConnectionParams import org.apache.http.params.HttpParams @@ -72,6 +72,7 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { private var httpClient: HttpClient = null initClient() + private var connectionMonitorThread: IdleConnectionMonitorThread = null def getHttpClient: HttpClient = { httpClient @@ -106,9 +107,10 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { val localContext: HttpContext = new BasicHttpContext localContext.setAttribute(ClientContext.COOKIE_STORE, HtmlFetcher.emptyCookieStore) httpget = new HttpGet(cleanUrl) - HttpProtocolParams.setUserAgent(httpClient.getParams, config.getBrowserUserAgent()); val params = httpClient.getParams + HttpProtocolParams.setUserAgent(params, config.getBrowserUserAgent()); + HttpConnectionParams.setConnectionTimeout(params, config.getConnectionTimeout()) HttpConnectionParams.setSoTimeout(params, config.getSocketTimeout()) @@ -186,6 +188,7 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { if (httpget != null) { try { httpget.abort() + httpget.releaseConnection() entity = null } catch { @@ -240,8 +243,8 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { trace("Initializing HttpClient") val httpParams: HttpParams = new BasicHttpParams - HttpConnectionParams.setConnectionTimeout(httpParams, 10 * 1000) - HttpConnectionParams.setSoTimeout(httpParams, 10 * 1000) + HttpConnectionParams.setConnectionTimeout(httpParams, 10 * 1000) // 10 seconds + HttpConnectionParams.setSoTimeout(httpParams, 10 * 1000) // 10 seconds HttpProtocolParams.setVersion(httpParams, HttpVersion.HTTP_1_1) emptyCookieStore = new CookieStore { def addCookie(cookie: Cookie) { @@ -270,14 +273,20 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { val schemeRegistry: SchemeRegistry = new SchemeRegistry schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory)) schemeRegistry.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory)) - val cm = new ThreadSafeClientConnManager(schemeRegistry) - cm.setMaxTotal(20000) - cm.setDefaultMaxPerRoute(500) + val cm = new PoolingClientConnectionManager(schemeRegistry) + cm.setMaxTotal(4000) + cm.setDefaultMaxPerRoute(20) + httpClient = new DefaultHttpClient(cm, httpParams) httpClient.asInstanceOf[AbstractHttpClient].setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(0, false)) - httpClient.getParams.setParameter("http.conn-manager.timeout", 120000L) + httpClient.getParams.setParameter("http.connection-manager.timeout", 30000L) httpClient.getParams.setParameter("http.protocol.wait-for-continue", 10000L) httpClient.getParams.setParameter("http.tcp.nodelay", true) + + if (connectionMonitorThread == null) { + connectionMonitorThread = new IdleConnectionMonitorThread(cm); + } + connectionMonitorThread.start(); } /** diff --git a/src/main/scala/com/gravity/goose/network/IdleConnectionMonitorThread.java b/src/main/scala/com/gravity/goose/network/IdleConnectionMonitorThread.java new file mode 100644 index 000000000..d637a7926 --- /dev/null +++ b/src/main/scala/com/gravity/goose/network/IdleConnectionMonitorThread.java @@ -0,0 +1,41 @@ +package com.gravity.goose.network; + +import java.util.concurrent.TimeUnit; +import org.apache.http.impl.conn.PoolingClientConnectionManager; + +public class IdleConnectionMonitorThread extends Thread { + + private final PoolingClientConnectionManager connMgr; + private volatile boolean shutdown; + + public IdleConnectionMonitorThread(PoolingClientConnectionManager connMgr) { + super(); + this.connMgr = connMgr; + } + + @Override + public void run() { + try { + while (!shutdown) { + synchronized (this) { + wait(5000); + // Close expired connections + connMgr.closeExpiredConnections(); + // Optionally, close connections + // that have been idle longer than 30 sec + connMgr.closeIdleConnections(30, TimeUnit.SECONDS); + } + } + } catch (InterruptedException ex) { + // terminate + } + } + + public void shutdown() { + shutdown = true; + synchronized (this) { + notifyAll(); + } + } + +} \ No newline at end of file diff --git a/src/test/resources/log4j.properties b/src/test/resources/log4j.properties index 38435e33f..9aa24284a 100644 --- a/src/test/resources/log4j.properties +++ b/src/test/resources/log4j.properties @@ -23,6 +23,6 @@ log4j.logger.org.apache.http.wire=ERROR,stdout log4j.logger.org.apache.commons.httpclient=ERROR,stdout log4j.logger.org.apache.http.client.protocol=ERROR,stdout log4j.logger.org.apache.http=ERROR,stdout - +log4j.logger.org.apache.http.impl.conn=DEBUG,stdout log4j.logger.net.sf.jmimemagic=WARN From 40b80b91c7e147d0272ffde5f43c0a255b0d0988 Mon Sep 17 00:00:00 2001 From: Patrick Liang <skyshard@gmail.com> Date: Fri, 17 May 2013 18:31:10 -0700 Subject: [PATCH 164/347] less logging --- src/test/resources/log4j.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/resources/log4j.properties b/src/test/resources/log4j.properties index 9aa24284a..56adc487e 100644 --- a/src/test/resources/log4j.properties +++ b/src/test/resources/log4j.properties @@ -23,6 +23,6 @@ log4j.logger.org.apache.http.wire=ERROR,stdout log4j.logger.org.apache.commons.httpclient=ERROR,stdout log4j.logger.org.apache.http.client.protocol=ERROR,stdout log4j.logger.org.apache.http=ERROR,stdout -log4j.logger.org.apache.http.impl.conn=DEBUG,stdout +log4j.logger.org.apache.http.impl.conn=ERROR,stdout log4j.logger.net.sf.jmimemagic=WARN From 7636f6b337524076d7342ed028ada25e2cd9011a Mon Sep 17 00:00:00 2001 From: Patrick Liang <skyshard@gmail.com> Date: Fri, 17 May 2013 18:32:33 -0700 Subject: [PATCH 165/347] remove root build.sbt to try to get project compile to work --- build.sbt | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 build.sbt diff --git a/build.sbt b/build.sbt deleted file mode 100644 index 496e5128b..000000000 --- a/build.sbt +++ /dev/null @@ -1,5 +0,0 @@ -name := "goose-fork" - -version := "2.1.23-SNAPSHOT" - -scalaVersion := "2.9.2" \ No newline at end of file From 1bb28e9abbd171b701d3db6f7689a40d393c593a Mon Sep 17 00:00:00 2001 From: Patrick Liang <skyshard@gmail.com> Date: Fri, 17 May 2013 18:46:09 -0700 Subject: [PATCH 166/347] Revert "remove root build.sbt to try to get project compile to work" This reverts commit 7636f6b337524076d7342ed028ada25e2cd9011a. --- build.sbt | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 build.sbt diff --git a/build.sbt b/build.sbt new file mode 100644 index 000000000..496e5128b --- /dev/null +++ b/build.sbt @@ -0,0 +1,5 @@ +name := "goose-fork" + +version := "2.1.23-SNAPSHOT" + +scalaVersion := "2.9.2" \ No newline at end of file From a4416bd10439ee35fee3a18a10dd11ba2da758de Mon Sep 17 00:00:00 2001 From: eldilibra <writeme@ldlibra.com> Date: Wed, 22 May 2013 09:45:27 -0400 Subject: [PATCH 167/347] fix spelling error and mission quote (cherry picked from commit 6c7f98523a0cee3e08d506f656850c8e29974602) --- .../gravity/goose/extractors/ContentExtractor.scala | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index 51838e335..932e06fcb 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -107,15 +107,15 @@ trait ContentExtractor { * @return */ def doTitleSplits(title: String, splitter: StringSplitter): String = { - var largetTextLen: Int = 0 + var largestTextLen: Int = 0 var largeTextIndex: Int = 0 val titlePieces: Array[String] = splitter.split(title) var i: Int = 0 while (i < titlePieces.length) { val current: String = titlePieces(i) - if (current.length > largetTextLen) { - largetTextLen = current.length + if (current.length > largestTextLen) { + largestTextLen = current.length largeTextIndex = i } i += 1 @@ -625,7 +625,7 @@ trait ContentExtractor { private def debugNode(e: Element): String = { val sb: StringBuilder = new StringBuilder - sb.append("GravityScore: '") + sb.append("'GravityScore: '") sb.append(e.attr("gravityScore")) sb.append("' paraNodeCount: '") sb.append(e.attr("gravityNodes")) @@ -635,4 +635,4 @@ trait ContentExtractor { sb.append(e.attr("class")) sb.toString() } -} \ No newline at end of file +} From 975b91fd96bc151914c3822b521280eef4c3649f Mon Sep 17 00:00:00 2001 From: Matt Haynes <matt@matthaynes.net> Date: Thu, 23 May 2013 20:32:31 +0100 Subject: [PATCH 168/347] Add image width and height --- .../com/gravity/goose/images/UpgradedImageIExtractor.scala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala index 787e9c0c1..384dbff99 100644 --- a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala +++ b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala @@ -113,6 +113,8 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: mainImage.imageSrc = highScoreImage._1.imgSrc mainImage.imageExtractionType = "bigimage" mainImage.bytes = highScoreImage._1.bytes + mainImage.width = highScoreImage._1.width + mainImage.height = highScoreImage._1.height mainImage.confidenceScore = if (scoredImages.size > 0) (100 / scoredImages.size) else 0 trace("IMAGE COMPLETE: High Score Image is: " + mainImage.imageSrc + " Score is: " + highScoreImage._2) return Some(mainImage) @@ -542,4 +544,4 @@ object UpgradedImageIExtractor { val KNOWN_IMG_DOM_NAMES = ListBuffer("yn-story-related-media", "cnn_strylccimg300cntr", "big_photo", "ap-smallphoto-a") -} \ No newline at end of file +} From 047f2aa01544538def8616a0e6ba844b3959ecf3 Mon Sep 17 00:00:00 2001 From: Jason Bennett <jbennett@unfold.com> Date: Thu, 30 May 2013 11:35:54 -0700 Subject: [PATCH 169/347] Change repository location --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 479205941..15c869ede 100644 --- a/pom.xml +++ b/pom.xml @@ -19,7 +19,7 @@ <snapshotRepository> <id>unfold-snapshot</id> <name>Unfold Nexus Snapshot Repository</name> - <url>http://git.tacenda.com:8081/nexus/content/repositories/snapshots</url> + <url>http://nexus.unfold.com:8081/nexus/content/repositories/snapshots</url> </snapshotRepository> </distributionManagement> @@ -166,4 +166,4 @@ </plugins> </build> -</project> \ No newline at end of file +</project> From 4992f865a44be72347bf7cd9c6abe74ae74a209d Mon Sep 17 00:00:00 2001 From: Jason Bennett <jbennett@unfold.com> Date: Tue, 25 Jun 2013 12:09:35 -0700 Subject: [PATCH 170/347] Commit version 2.1.23 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 15c869ede..3ae37a94b 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ <groupId>com.unfold</groupId> <artifactId>goose-fork</artifactId> - <version>2.1.23-SNAPSHOT</version> + <version>2.1.23</version> <packaging>jar</packaging> From cc22a4991323d483139e6f093396e7244f3ce897 Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Tue, 16 Jul 2013 18:23:40 -0700 Subject: [PATCH 171/347] Revert "Added the Acceso Maven repository. Using the Lingpipe language identifier." 15875dc95058dbe024dc3501776c26f800fdbbb7 --- pom.xml | 21 ++++++------------- .../com/gravity/goose/text/StopWords.scala | 19 +++++------------ src/test/resources/log4j.properties | 10 ++++----- 3 files changed, 16 insertions(+), 34 deletions(-) diff --git a/pom.xml b/pom.xml index 567d3bb24..fb8dac172 100644 --- a/pom.xml +++ b/pom.xml @@ -22,11 +22,6 @@ <name>Akka Maven Repository</name> <url>http://akka.io/repository</url> </repository> - <repository> - <id>acceso</id> - <name>Acceso Maven Repository</name> - <url>http://artifactory.acceso.int/repo</url> - </repository> </repositories> <dependencies> @@ -117,18 +112,14 @@ </exclusions> </dependency> + <dependency> - <groupId>com.acceso</groupId> - <artifactId>language-identifier</artifactId> - <version>0.1-SNAPSHOT</version> - <scope>compile</scope> - </dependency> - <dependency> - <groupId>com.googlecode.juniversalchardet</groupId> - <artifactId>juniversalchardet</artifactId> - <version>1.0.3</version> - <scope>compile</scope> + <groupId>com.googlecode.juniversalchardet</groupId> + <artifactId>juniversalchardet</artifactId> + <version>1.0.3</version> + <scope>compile</scope> </dependency> + </dependencies> <!-- diff --git a/src/main/scala/com/gravity/goose/text/StopWords.scala b/src/main/scala/com/gravity/goose/text/StopWords.scala index 813b4321e..b4af78de6 100644 --- a/src/main/scala/com/gravity/goose/text/StopWords.scala +++ b/src/main/scala/com/gravity/goose/text/StopWords.scala @@ -26,8 +26,8 @@ package com.gravity.goose.text import java.util._ import com.gravity.goose.utils.FileHelper + import scala.collection.immutable.Map -import com.acceso.languageidentification.LingpipeLanguageIdentifier object StopWords { @@ -57,7 +57,7 @@ object StopWords { val overlappingStopWords: List[String] = new ArrayList[String] - val languageCode : String = getLanguageCode(content) + val languageCode : String = detectLanguage(content) val stopWords = STOP_WORDS(languageCode) candidateWords.foreach(w => { @@ -71,19 +71,10 @@ object StopWords { /** * This method returns the code of the language identified in the content - * passed as parameter, or 'all' if no language is identified. + * passed as parameter. */ - def getLanguageCode(content: String): String = { - var l = LingpipeLanguageIdentifier.getInstance() - var language : Locale = l.identify(content, 0.8) - - if(language != null && STOP_WORDS.contains(language.getLanguage())) { - // We have detected a language - return language.getLanguage() - } else { - // We have not detected a language or we have detected a no supported language - return "all" - } + def detectLanguage(content: String): String = { + return "en" // TODO Fixme using some automatic language detector library } diff --git a/src/test/resources/log4j.properties b/src/test/resources/log4j.properties index 56adc487e..3c922bb5e 100644 --- a/src/test/resources/log4j.properties +++ b/src/test/resources/log4j.properties @@ -1,5 +1,5 @@ # ***** Set root logger level to WARN and its two appenders to stdout and R. -log4j.rootLogger=trace, stdout +log4j.rootLogger=TRACE, stdout # ***** stdout is set to be a ConsoleAppender. log4j.appender.stdout=org.apache.log4j.ConsoleAppender @@ -19,10 +19,10 @@ log4j.appender.stdout.layout.ConversionPattern=%p %c - %m%n #set httpclient debug levels log4j.logger.org.apache.component=ERROR,stdout -log4j.logger.org.apache.http.wire=ERROR,stdout log4j.logger.org.apache.commons.httpclient=ERROR,stdout -log4j.logger.org.apache.http.client.protocol=ERROR,stdout -log4j.logger.org.apache.http=ERROR,stdout -log4j.logger.org.apache.http.impl.conn=ERROR,stdout +#log4j.logger.org.apache.http=ERROR,stdout +#log4j.logger.org.apache.http.wire=ERROR,stdout +#log4j.logger.org.apache.http.client.protocol=ERROR,stdout +#log4j.logger.org.apache.http.impl.conn=ERROR,stdout log4j.logger.net.sf.jmimemagic=WARN From 40f3a9e1ce9460f93180a9850cb0f8fe0c39f0a8 Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Tue, 16 Jul 2013 21:55:10 -0700 Subject: [PATCH 172/347] handling gzipped responses, content type detection failure --- project/Build.scala | 4 +- .../gravity/goose/network/HtmlFetcher.scala | 58 +++++++++++++++++-- 2 files changed, 55 insertions(+), 7 deletions(-) diff --git a/project/Build.scala b/project/Build.scala index c16d6c3b3..a19211d9b 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -11,6 +11,8 @@ object Dependencies { val ScalaLibrary = "org.scala-lang" % "scala-library" % "2.9.2" val Httpclient = "org.apache.httpcomponents" % "httpclient" % "4.2.4" val CommonsLang = "commons-lang" % "commons-lang" % "2.6" + val Juniversalchardet = "com.googlecode.juniversalchardet" % "juniversalchardet" % "1.0.3" + } object GooseBuild extends Build { @@ -18,5 +20,5 @@ object GooseBuild extends Build { lazy val root = Project("goose", file("."), settings = Defaults.defaultSettings ++ - Seq(libraryDependencies ++= Seq(Junit, Slf4jApi, Slf4jLog4j12, Jsoup, CommonsIo, ScalaCompiler, ScalaLibrary, Httpclient, CommonsLang))) + Seq(libraryDependencies ++= Seq(Junit, Slf4jApi, Slf4jLog4j12, Jsoup, CommonsIo, ScalaCompiler, ScalaLibrary, Httpclient, CommonsLang, Juniversalchardet))) } \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index 195bc6eec..bcf4232e4 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -18,9 +18,15 @@ package com.gravity.goose.network +import org.apache.http.Header +import org.apache.http.HeaderElement import org.apache.http.HttpEntity +import org.apache.http.HttpRequest import org.apache.http.HttpResponse import org.apache.http.HttpVersion +import org.apache.http.HttpRequestInterceptor +import org.apache.http.HttpResponseInterceptor +import org.apache.http.client.entity.GzipDecompressingEntity import org.apache.http.client.CookieStore import org.apache.http.client.HttpClient import org.apache.http.client.methods.HttpGet @@ -39,6 +45,7 @@ import org.apache.http.params.HttpProtocolParams import org.apache.http.protocol.BasicHttpContext import org.apache.http.protocol.HttpContext import org.apache.http.util.EntityUtils +import org.apache.http.entity.ContentType import java.io._ import java.net.SocketException import java.net.SocketTimeoutException @@ -96,7 +103,8 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { var htmlResult: String = null var entity: HttpEntity = null var instream: InputStream = null - + var contentType: ContentType = null + // Identified the the apache http client does not drop URL fragments before opening the request to the host // more info: http://stackoverflow.com/questions/4251841/400-error-with-httpclient-for-a-link-with-an-anchor val cleanUrl = { @@ -127,10 +135,14 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { if (entity != null) { instream = entity.getContent var encodingType: String = "UTF-8" + try { - encodingType = EntityUtils.getContentCharSet(entity) - if (encodingType == null) { + contentType = ContentType.get(entity) + trace("Got contentType: " + contentType) + if (contentType == null) { encodingType = "UTF-8" + } else { + encodingType = contentType.getCharset().name } } catch { @@ -212,8 +224,13 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { try { is = new ByteArrayInputStream(htmlResult.getBytes("UTF-8")) mimeType = URLConnection.guessContentTypeFromStream(is) - if (mimeType != null) { - if ((mimeType == "text/html") == true || (mimeType == "application/xml") == true) { + if (mimeType != null || contentType != null) { + if(mimeType == null) { + mimeType = contentType.getMimeType() + trace("no guessed mimetype? using contentType: " + mimeType + " - " + cleanUrl) + } + + if ((mimeType == "text/html") || (mimeType == "application/xml") || (mimeType == "application/xhtml+xml") || (mimeType == "text/xml") ) { return Some(htmlResult) } else { @@ -223,8 +240,9 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { trace("GRVBIGFAIL: " + mimeType + " - " + cleanUrl) throw new NotHtmlException(cleanUrl) } - } + } else { + trace("no mimetype?: " + mimeType + " - " + cleanUrl) throw new NotHtmlException(cleanUrl) } } @@ -284,6 +302,34 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { httpClient.getParams.setParameter("http.protocol.wait-for-continue", 10000L) httpClient.getParams.setParameter("http.tcp.nodelay", true) + // http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientGZipContentCompression.java + httpClient.asInstanceOf[AbstractHttpClient].addRequestInterceptor(new HttpRequestInterceptor() { + def process( request: HttpRequest, context: HttpContext) { + if (!request.containsHeader("Accept-Encoding")) { + request.addHeader("Accept-Encoding", "gzip") + } + } + }) + + httpClient.asInstanceOf[AbstractHttpClient].addResponseInterceptor(new HttpResponseInterceptor() { + def process( response: HttpResponse, context: HttpContext) { + val entity: HttpEntity = response.getEntity() + if (entity != null) { + val ceheader: Header = entity.getContentEncoding() + if (ceheader != null) { + val codecs = ceheader.getElements() + for ( c <- codecs) { + if (c.getName().equalsIgnoreCase("gzip")) { + response.setEntity( + new GzipDecompressingEntity(response.getEntity())) + return + } + } + } + } + } + }) + if (connectionMonitorThread == null) { connectionMonitorThread = new IdleConnectionMonitorThread(cm); } From 15e4921f61c6af34df9a7db89abeda43bfa1fe38 Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Tue, 16 Jul 2013 22:45:03 -0700 Subject: [PATCH 173/347] fixing gizmodo, mashable --- src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala b/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala index 27c541d2d..d63b64c0a 100644 --- a/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala +++ b/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala @@ -379,7 +379,7 @@ object DocumentCleaner extends Logging { var sb: StringBuilder = new StringBuilder // create negative elements - sb.append("^side$|combx|retweet|mediaarticlerelated|menucontainer|navbar|comment|PopularQuestions|contact|foot|footer|Footer|footnote|cnn_strycaptiontxt|links|meta$|scroll|shoutbox|sponsor") + sb.append("^side$|combx|retweet|mediaarticlerelated|menucontainer|navbar|comment(?!ed)|PopularQuestions|contact|foot|footer|Footer|footnote|cnn_strycaptiontxt|links|meta$|shoutbox|sponsor") sb.append("|tags|socialnetworking|socialNetworking|cnnStryHghLght|cnn_stryspcvbx|^inset$|pagetools|post-attributes|welcome_form|contentTools2|the_answers|remember-tool-tip") sb.append("|communitypromo|runaroundLeft|subscribe|vcard|articleheadings|date|^print$|popup|author-dropdown|tools|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text") From b9d7a2026bcccb4a51875aba7273b804c436572a Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Thu, 18 Jul 2013 00:45:14 -0700 Subject: [PATCH 174/347] getting tests running (and failing) --- build.sbt | 6 +++++- project/Build.scala | 1 - 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index 496e5128b..abf3727a8 100644 --- a/build.sbt +++ b/build.sbt @@ -2,4 +2,8 @@ name := "goose-fork" version := "2.1.23-SNAPSHOT" -scalaVersion := "2.9.2" \ No newline at end of file +scalaVersion := "2.9.2" + +libraryDependencies += "com.novocode" % "junit-interface" % "0.10-M4" % "test" + +resolvers += "Sonatype Release" at "http://oss.sonatype.org/content/repositories/releases" \ No newline at end of file diff --git a/project/Build.scala b/project/Build.scala index a19211d9b..2fa0681db 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -2,7 +2,6 @@ import sbt._ import Keys._ object Dependencies { - val Junit = "junit" % "junit" % "4.8.1" val Slf4jApi = "org.slf4j" % "slf4j-api" % "1.6.6" val Slf4jLog4j12 = "org.slf4j" % "slf4j-log4j12" % "1.6.6" val Jsoup = "org.jsoup" % "jsoup" % "1.7.2" From f4882a676c530b472459fa6f448bae00c4520de9 Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Thu, 18 Jul 2013 00:46:23 -0700 Subject: [PATCH 175/347] link extraction from content node --- .../scala/com/gravity/goose/Article.scala | 6 +++ .../scala/com/gravity/goose/Crawler.scala | 3 +- .../goose/extractors/ContentExtractor.scala | 43 +++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/Article.scala b/src/main/scala/com/gravity/goose/Article.scala index 376644587..71a9ee03d 100644 --- a/src/main/scala/com/gravity/goose/Article.scala +++ b/src/main/scala/com/gravity/goose/Article.scala @@ -87,6 +87,12 @@ class Article { @BeanProperty var tags: Set[String] = null + /** + * holds a set of any links in the article + */ + @BeanProperty + var links: Set[String] = null + /** * holds a list of any movies we found on the page like youtube, vimeo */ diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index 4f3b32344..aed31856f 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -59,7 +59,7 @@ class Crawler(config: Configuration) { article.rawHtml = rawHtml article.doc = doc article.rawDoc = doc.clone() - + article.title = extractor.getTitle(article) article.publishDate = config.publishDateExtractor.extract(doc) article.additionalData = config.getAdditionalDataExtractor.extract(doc) @@ -76,6 +76,7 @@ class Crawler(config: Configuration) { case Some(node: Element) => { article.topNode = node article.movies = extractor.extractVideos(article.topNode) + article.links = extractor.extractLinks(article.topNode) if (config.enableImageFetching) { trace(logPrefix + "Image fetching enabled...") diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index 51838e335..d3c33ec94 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -464,6 +464,49 @@ trait ContentExtractor { goodMovies.toList } + /** + * pulls out links we like + * + * @return + */ + def extractLinks(node: Element): Set[String] = { + val candidates: ArrayList[Element] = new ArrayList[Element] + val goodLinks = mutable.HashSet[String]() + + try { + node.parent.getElementsByTag("a").foreach(candidates.add(_)) + + trace(logPrefix + "extractLinks: Starting to extract links. Found: " + candidates.size) + + for (el <- candidates) { + val attrs: Attributes = el.attributes() + for (a <- attrs) { + try { + if ((a.getKey == "href")) { + trace(logPrefix + "This page has a link!: " + a.getValue) + goodLinks += a.getValue + } + } + catch { + case e: Exception => { + info(logPrefix + "Error extracting links: " + e.toString) + } + } + } + } + } + catch { + case e: NullPointerException => { + warn(e.toString, e) + } + case e: Exception => { + warn(e.toString, e) + } + } + trace(logPrefix + "extractLinks: done looking at links") + goodLinks.toSet + } + def isTableTagAndNoParagraphsExist(e: Element): Boolean = { val subParagraphs: Elements = e.getElementsByTag("p") From 4b91e2fa0bae5b1f19cce5963d293d09ae8eb7f2 Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Thu, 18 Jul 2013 00:47:17 -0700 Subject: [PATCH 176/347] =?UTF-8?q?stricter=20small=20paragraph=20removal?= =?UTF-8?q?=E2=80=A6=20monitor=20how=20well=20this=20does?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gravity/goose/outputformatters/OutputFormatter.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala b/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala index a86a2252b..5fc49ed2f 100644 --- a/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala +++ b/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala @@ -184,7 +184,7 @@ trait OutputFormatter { for (el <- allNodes) { try { val stopWords = StopWords.getStopWordCount(el.text) - if (stopWords.getStopWordCount < 3 && el.getElementsByTag("object").size == 0 && el.getElementsByTag("embed").size == 0) { + if (el.text.size < 8 && stopWords.getStopWordCount < 3 && el.getElementsByTag("object").size == 0 && el.getElementsByTag("embed").size == 0) { logger.debug("removeParagraphsWithFewWords - swcnt: %d removing text: %s".format(stopWords.getStopWordCount, el.text())) el.remove() } From aa514fd0cd289591437869eacaf04d496da82dbc Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Thu, 18 Jul 2013 00:48:06 -0700 Subject: [PATCH 177/347] referer and cookie support for html fetching --- .../com/gravity/goose/Configuration.scala | 6 ++++++ .../gravity/goose/network/HtmlFetcher.scala | 21 ++++++++----------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index 3c427b4a8..cd82a53d0 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -84,6 +84,12 @@ class Configuration { @BeanProperty var browserUserAgent: String = "Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8" + /** + * sent as the referer header + */ + @BeanProperty + var browserReferer: String = "https://www.google.com" + var contentExtractor: ContentExtractor = StandardContentExtractor var publishDateExtractor: PublishDateExtractor = new PublishDateExtractor { diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index bcf4232e4..965782abd 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -21,27 +21,21 @@ package com.gravity.goose.network import org.apache.http.Header import org.apache.http.HeaderElement import org.apache.http.HttpEntity -import org.apache.http.HttpRequest -import org.apache.http.HttpResponse import org.apache.http.HttpVersion -import org.apache.http.HttpRequestInterceptor -import org.apache.http.HttpResponseInterceptor +import org.apache.http.{HttpRequest, HttpRequestInterceptor, HttpResponse, HttpResponseInterceptor} import org.apache.http.client.entity.GzipDecompressingEntity import org.apache.http.client.CookieStore +import org.apache.http.impl.client.BasicCookieStore import org.apache.http.client.HttpClient import org.apache.http.client.methods.HttpGet import org.apache.http.client.params.CookiePolicy import org.apache.http.client.protocol.ClientContext import org.apache.http.conn.scheme.PlainSocketFactory import org.apache.http.conn.ssl.SSLSocketFactory -import org.apache.http.conn.scheme.Scheme -import org.apache.http.conn.scheme.SchemeRegistry +import org.apache.http.conn.scheme.{Scheme, SchemeRegistry} import org.apache.http.cookie.Cookie import org.apache.http.impl.conn.PoolingClientConnectionManager -import org.apache.http.params.BasicHttpParams -import org.apache.http.params.HttpConnectionParams -import org.apache.http.params.HttpParams -import org.apache.http.params.HttpProtocolParams +import org.apache.http.params.{HttpParams, BasicHttpParams, HttpConnectionParams, HttpProtocolParams} import org.apache.http.protocol.BasicHttpContext import org.apache.http.protocol.HttpContext import org.apache.http.util.EntityUtils @@ -74,6 +68,7 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { * cookies for head requests, only slows shit down */ var emptyCookieStore: CookieStore = null + /** * holds the HttpClient object for making requests */ @@ -114,11 +109,12 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { try { val localContext: HttpContext = new BasicHttpContext - localContext.setAttribute(ClientContext.COOKIE_STORE, HtmlFetcher.emptyCookieStore) + localContext.setAttribute(ClientContext.COOKIE_STORE, new BasicCookieStore) httpget = new HttpGet(cleanUrl) + httpget.setHeader("referer", config.getBrowserReferer()) val params = httpClient.getParams - HttpProtocolParams.setUserAgent(params, config.getBrowserUserAgent()); + HttpProtocolParams.setUserAgent(params, config.getBrowserUserAgent()) HttpConnectionParams.setConnectionTimeout(params, config.getConnectionTimeout()) HttpConnectionParams.setSoTimeout(params, config.getSocketTimeout()) @@ -282,6 +278,7 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { private[network] var emptyList: ArrayList[Cookie] = new ArrayList[Cookie] } + httpParams.setParameter("http.protocol.cookie-policy", CookiePolicy.BROWSER_COMPATIBILITY) httpParams.setParameter("http.User-Agent", "Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8") httpParams.setParameter("http.language.Accept-Language", "en-us") From 6cd9fc21eb8eac559914caf854880456db003ecf Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Thu, 18 Jul 2013 00:48:41 -0700 Subject: [PATCH 178/347] add document in trace for easier debug --- .../com/gravity/goose/cleaners/DocumentCleaner.scala | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala b/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala index d63b64c0a..be297fb7f 100644 --- a/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala +++ b/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala @@ -43,8 +43,11 @@ trait DocumentCleaner { def clean(article: Article): Document = { trace("Starting cleaning phase with DefaultDocumentCleaner") - var docToClean: Document = article.doc + trace("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% BEFORE CLEAN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") + trace(docToClean.html) + trace("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% BEFORE CLEAN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") + docToClean = cleanEmTags(docToClean) docToClean = removeDropCaps(docToClean) docToClean = removeScriptsAndStyles(docToClean) @@ -60,6 +63,10 @@ trait DocumentCleaner { // docToClean = convertDivsToParagraphs(docToClean, "span") // docToClean = convertDivsToParagraphs(docToClean, "span") + + trace("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% AFTER CLEAN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") + trace(docToClean.html) + trace("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% AFTER CLEAN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") docToClean } @@ -164,6 +171,7 @@ trait DocumentCleaner { removeNode(node) } + doc } From 0849a97500084189c46f853a011147f3feca59aa Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Thu, 18 Jul 2013 00:49:21 -0700 Subject: [PATCH 179/347] stricter non-removal of .scrollable class --- src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala b/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala index be297fb7f..ffa3d68e3 100644 --- a/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala +++ b/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala @@ -387,7 +387,7 @@ object DocumentCleaner extends Logging { var sb: StringBuilder = new StringBuilder // create negative elements - sb.append("^side$|combx|retweet|mediaarticlerelated|menucontainer|navbar|comment(?!ed)|PopularQuestions|contact|foot|footer|Footer|footnote|cnn_strycaptiontxt|links|meta$|shoutbox|sponsor") + sb.append("^side$|combx|retweet|mediaarticlerelated|menucontainer|navbar|comment(?!ed)|PopularQuestions|contact|foot|footer|Footer|footnote|cnn_strycaptiontxt|links|meta$|scroll(?!able)|shoutbox|sponsor") sb.append("|tags|socialnetworking|socialNetworking|cnnStryHghLght|cnn_stryspcvbx|^inset$|pagetools|post-attributes|welcome_form|contentTools2|the_answers|remember-tool-tip") sb.append("|communitypromo|runaroundLeft|subscribe|vcard|articleheadings|date|^print$|popup|author-dropdown|tools|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text") From 6b9814a3816a4bacb55aa6e3bf1c0a06988ef175 Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Thu, 18 Jul 2013 00:50:46 -0700 Subject: [PATCH 180/347] better description, canonical link extractors --- .../goose/extractors/ContentExtractor.scala | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index d3c33ec94..7bad6eae4 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -137,7 +137,19 @@ trait ContentExtractor { * if the article has meta description set in the source, use that */ def getMetaDescription(article: Article): String = { - getMetaContent(article.doc, "meta[name=description]") + var desc = article.doc.select("meta[name=description]").attr("content") + if (desc.isEmpty) { + desc = article.doc.select("meta[property=og:description]").attr("content") + if (desc.isEmpty) { + desc = article.doc.select("meta[name=twitter:description]").attr("content") + } + } + + if (desc.nonEmpty) { + desc.trim + } else { + string.empty + } } /** @@ -152,9 +164,15 @@ trait ContentExtractor { * if the article has meta canonical link set in the url */ def getCanonicalLink(article: Article): String = { - val meta = article.doc.select("link[rel=canonical]") - if (meta.size() > 0) { - val href = Option(meta.first().attr("href")).getOrElse("").trim + var url = article.doc.select("link[rel=canonical]").attr("href") + if (url.isEmpty) { + url = article.doc.select("meta[property=og:url]").attr("content") + if (url.isEmpty) { + url = article.doc.select("meta[name=twitter:url]").attr("content") + } + } + if (url.nonEmpty) { + val href = url.trim if (href.nonEmpty) href else article.finalUrl } else { article.finalUrl From 39d9032936a0d07387e811129ff203210584db23 Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Thu, 18 Jul 2013 00:51:55 -0700 Subject: [PATCH 181/347] guess date from url if the extractor fails, logic from snacktory: https://github.com/karussell/snacktory/blob/master/src/main/java/de/jetwick/snacktory/SHelper.java --- .../scala/com/gravity/goose/Crawler.scala | 4 +- .../goose/extractors/ContentExtractor.scala | 64 +++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index aed31856f..33d096e30 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -70,7 +70,9 @@ class Crawler(config: Configuration) { // before we do any calcs on the body itself let's clean up the document article.doc = docCleaner.clean(article) - + if (article.publishDate == null) { + article.publishDate = extractor.getDateFromURL(article.canonicalLink) + } extractor.calculateBestNodeBasedOnClustering(article) match { case Some(node: Element) => { diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index 7bad6eae4..d06866f89 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -22,6 +22,7 @@ import com.gravity.goose.text._ import com.gravity.goose.utils.Logging import java.net.URL import java.util.ArrayList +import java.util.Date import scala.collection.mutable import scala.collection.JavaConversions._ import org.jsoup.nodes.{Attributes, Element, Document} @@ -197,6 +198,69 @@ trait ContentExtractor { tags.toSet } + def getDateFromURL(url: String): Date = { + val path = new URL(url).getPath + + var year: Integer = -1; + var yearCounter: Integer = -1; + var month: Integer = -1; + var monthCounter: Integer = -1; + var day: Integer = -1; + var done: Boolean = false + val strs = path.split("/"); + for ((str, counter) <- strs.zipWithIndex) { + if (!done) { + if (str.length() == 4 && yearCounter < 0) { + try { + year = Integer.parseInt(str); + if (year < 1970 || year > 3000) { + year = -1; + } else { + trace(logPrefix + " found year: " + year) + yearCounter = counter; + } + } catch { + case _ : java.lang.NumberFormatException => None + } + } else if (str.length() == 2) { + if (monthCounter < 0 && counter == yearCounter + 1) { + try { + month = Integer.parseInt(str); + if (month < 1 || month > 12) { + month = -1; + } else { + trace(logPrefix + " found month: " + month) + monthCounter = counter; + } + } catch { + case _ : java.lang.NumberFormatException => None + } + } else if (counter == monthCounter + 1) { + try { + day = Integer.parseInt(str); + if (day < 1 || day > 31) { + day = -1; + } else { + trace(logPrefix + " found day: " + day) + done = true + } + } catch { + case _ : java.lang.NumberFormatException => None + } + } + } + } + } + + // should be converted to use jodatime or something, because java's date is terrible + if (year < 0) return null; + year = year - 1900 // date constructor takes year - 1900 + if (month < 1) return new Date(year, 0, 1) + month = month - 1 // date constructor dates month in 0 - 11 + if (day < 1) return new Date(year, month, 1) + return new Date(year, month, day) + } + /** * we're going to start looking for where the clusters of paragraphs are. We'll score a cluster based on the number of stopwords * and the number of consecutive paragraphs together, which should form the cluster of text that this node is around From 8b544bd5bc9f5b745dd98711f861cc1ea4487d58 Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Thu, 18 Jul 2013 00:53:03 -0700 Subject: [PATCH 182/347] =?UTF-8?q?langid=20stuff=20todo=20later=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/Build.scala | 4 ++-- src/main/scala/com/gravity/goose/text/StopWords.scala | 9 +++++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/project/Build.scala b/project/Build.scala index 2fa0681db..032697058 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -11,7 +11,7 @@ object Dependencies { val Httpclient = "org.apache.httpcomponents" % "httpclient" % "4.2.4" val CommonsLang = "commons-lang" % "commons-lang" % "2.6" val Juniversalchardet = "com.googlecode.juniversalchardet" % "juniversalchardet" % "1.0.3" - + val LangidJava = "com.carrotsearch" % "langid-java" % "1.0.0" } object GooseBuild extends Build { @@ -19,5 +19,5 @@ object GooseBuild extends Build { lazy val root = Project("goose", file("."), settings = Defaults.defaultSettings ++ - Seq(libraryDependencies ++= Seq(Junit, Slf4jApi, Slf4jLog4j12, Jsoup, CommonsIo, ScalaCompiler, ScalaLibrary, Httpclient, CommonsLang, Juniversalchardet))) + Seq(libraryDependencies ++= Seq(Slf4jApi, Slf4jLog4j12, Jsoup, CommonsIo, ScalaCompiler, ScalaLibrary, Httpclient, CommonsLang, Juniversalchardet, LangidJava))) } \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/text/StopWords.scala b/src/main/scala/com/gravity/goose/text/StopWords.scala index b4af78de6..dc7092fb5 100644 --- a/src/main/scala/com/gravity/goose/text/StopWords.scala +++ b/src/main/scala/com/gravity/goose/text/StopWords.scala @@ -26,11 +26,14 @@ package com.gravity.goose.text import java.util._ import com.gravity.goose.utils.FileHelper +// import com.carrotsearch.labs.langid.LangIdV3 +import com.gravity.goose.utils.Logging import scala.collection.immutable.Map -object StopWords { - +object StopWords extends Logging { + val logPrefix = "stopwords: " + // the confusing pattern below is basically just match any non-word character excluding white-space. private val PUNCTUATION: StringReplacement = StringReplacement.compile("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\p{Pc}\\s]", string.empty) @@ -74,6 +77,8 @@ object StopWords { * passed as parameter. */ def detectLanguage(content: String): String = { + // val identifier = new LangIdV3 // this needs a per thread factory, initializing it every time is too slow + // trace("language!: " + identifier.classify(content, false)) return "en" // TODO Fixme using some automatic language detector library } From 802551dc900d85e3309cd5c9e4c949564df20f1c Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Thu, 18 Jul 2013 00:59:19 -0700 Subject: [PATCH 183/347] remove junit dep --- project/Build.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/Build.scala b/project/Build.scala index 2fa0681db..558cfab9c 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -19,5 +19,5 @@ object GooseBuild extends Build { lazy val root = Project("goose", file("."), settings = Defaults.defaultSettings ++ - Seq(libraryDependencies ++= Seq(Junit, Slf4jApi, Slf4jLog4j12, Jsoup, CommonsIo, ScalaCompiler, ScalaLibrary, Httpclient, CommonsLang, Juniversalchardet))) + Seq(libraryDependencies ++= Seq(Slf4jApi, Slf4jLog4j12, Jsoup, CommonsIo, ScalaCompiler, ScalaLibrary, Httpclient, CommonsLang, Juniversalchardet))) } \ No newline at end of file From 407893ab77e496ec55b81263e35ac0a2c2b31d94 Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Thu, 18 Jul 2013 01:02:15 -0700 Subject: [PATCH 184/347] ignore # href --- .../scala/com/gravity/goose/extractors/ContentExtractor.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index d06866f89..49323f1d9 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -564,7 +564,7 @@ trait ContentExtractor { val attrs: Attributes = el.attributes() for (a <- attrs) { try { - if ((a.getKey == "href")) { + if ((a.getKey == "href") && (a.getValue != "#")) { trace(logPrefix + "This page has a link!: " + a.getValue) goodLinks += a.getValue } From 91cbc82bdfb03fe25599a39e062d62aaa0698007 Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Thu, 18 Jul 2013 22:05:41 -0700 Subject: [PATCH 185/347] don't drop all lists in content immediately, score them first (and check if they look like lists of links) --- .../goose/extractors/ContentExtractor.scala | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index 49323f1d9..e2fd7d083 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -54,7 +54,7 @@ trait ContentExtractor { val SPACE_SPLITTER: StringSplitter = new StringSplitter(" ") val NO_STRINGS = Set.empty[String] val A_REL_TAG_SELECTOR: String = "a[rel=tag], a[href*=/tag/]" - val TOP_NODE_TAGS = new TagsEvaluator(Set("p", "td", "pre")) + val TOP_NODE_TAGS = new TagsEvaluator(Set("p", "td", "pre", "li")) def getTitle(article: Article): String = { var title: String = string.empty @@ -313,7 +313,7 @@ trait ContentExtractor { } } - trace(logPrefix + "Location Boost Score: " + boostScore + " on interation: " + i + "' id='" + node.parent.id + "' class='" + node.parent.attr("class")) + trace(logPrefix + "Location Boost Score: " + boostScore + " on interation: " + i + " tag='"+ node.tagName +"' id='" + node.parent.id + "' class='" + node.parent.attr("class")) val nodeText: String = node.text val wordStats: WordStats = StopWords.getStopWordCount(nodeText) @@ -597,12 +597,21 @@ trait ContentExtractor { p.remove() } } + val subParagraphs2: Elements = e.getElementsByTag("p") - if (subParagraphs2.size == 0 && !(e.tagName == "td")) { - trace("Removing node because it doesn't have any paragraphs") - true + if (subParagraphs2.size == 0 && e.tagName != "td") { + if (e.tagName == "ul" || e.tagName == "ol") { + val linkTextLength = e.getElementsByTag("a").map(_.text.length).sum + val elementTextLength = e.text.length + if (elementTextLength > 0 && (linkTextLength.toFloat / elementTextLength) < 0.5) { + return false // less than half of the list is links, so keep this + } + trace("List failed link density test: " + linkTextLength + " " + elementTextLength + " " + getShortText(e.text, 50)) + } + trace("Removing node because it doesn't have any paragraphs " + e.tagName + " " + e.attr("class")) + return true } else { - false + return false } } From 2567920ee67b10a8a2d02efc9be0ba4ece5557e8 Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Sat, 20 Jul 2013 00:26:38 -0700 Subject: [PATCH 186/347] =?UTF-8?q?throw=20more=20errors=20(couldn't=20get?= =?UTF-8?q?=20it=20to=20throw=20parsing=20errors=20or=20content=20not=20fo?= =?UTF-8?q?und=20properly=20inside=20the=20for()=20for=20crawler=E2=80=A6?= =?UTF-8?q?=20leaving=20for=20later)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/scala/com/gravity/goose/Crawler.scala | 3 --- src/main/scala/com/gravity/goose/network/HtmlFetcher.scala | 5 +++-- .../scala/com/gravity/goose/network/HttpExceptions.scala | 3 +++ 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index 33d096e30..94fe51ade 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -97,9 +97,6 @@ class Crawler(config: Configuration) { } article.topNode = extractor.postExtractionCleanup(article.topNode) - - - article.cleanedArticleText = outputFormatter.getFormattedText(article.topNode) } case _ => trace("NO ARTICLE FOUND") diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index 965782abd..f170ac2cf 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -173,14 +173,15 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { } case e: SocketTimeoutException => { trace(e.toString) + throw new GatewayTimeoutException(e.toString + " " + e.getMessage) } case e: LoggableException => { logger.warn(e.getMessage) - return None + throw e } case e: Exception => { trace("FAILURE FOR LINK: " + cleanUrl + " " + e.toString) - return None + throw e } } finally { diff --git a/src/main/scala/com/gravity/goose/network/HttpExceptions.scala b/src/main/scala/com/gravity/goose/network/HttpExceptions.scala index 52a4ded54..444d46d30 100644 --- a/src/main/scala/com/gravity/goose/network/HttpExceptions.scala +++ b/src/main/scala/com/gravity/goose/network/HttpExceptions.scala @@ -18,10 +18,13 @@ class LoggableException(msg: String, innerEx: Exception = null) extends Exceptio } } +class NoArticleException(url: String) extends LoggableException("Couldn't find article for url: " + url) +class ArticleParseException(url: String) extends LoggableException("Couldn't parse article for url: " + url) class NotFoundException(url: String) extends LoggableException("SERVER RETURNED 404 FOR LINK: " + url) class BadRequestException(url: String) extends LoggableException("Bad Request for URL: " + url) class NotAuthorizedException(url: String, statusCode: Int = 403) extends LoggableException("Not authorized (statusCode: %d) to access URL: %s".format(statusCode, url)) class ServerErrorException(url: String, statusCode: Int = 500) extends LoggableException("Server Error! Status code returned: %d for URL: %s".format(statusCode, url)) +class GatewayTimeoutException(url: String) extends LoggableException("Server Error! Timeout reading URL: %s".format(url)) class UnhandledStatusCodeException(url: String, statusCode: Int) extends LoggableException("Received HTTP statusCode: %d from URL: %s and did not know how to handle it!".format(statusCode, url)) object HttpStatusValidator { From bc163be3f9980bc86961b516dff4e56a242480c5 Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Mon, 22 Jul 2013 22:49:01 -0700 Subject: [PATCH 187/347] changed link extraction to give url -> text map --- .../scala/com/gravity/goose/Article.scala | 4 +- .../goose/extractors/ContentExtractor.scala | 38 +++---------------- 2 files changed, 7 insertions(+), 35 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Article.scala b/src/main/scala/com/gravity/goose/Article.scala index 71a9ee03d..a42899492 100644 --- a/src/main/scala/com/gravity/goose/Article.scala +++ b/src/main/scala/com/gravity/goose/Article.scala @@ -88,10 +88,10 @@ class Article { var tags: Set[String] = null /** - * holds a set of any links in the article + * holds a map of any links -> link text in the article */ @BeanProperty - var links: Set[String] = null + var links: Map[String, String] = null /** * holds a list of any movies we found on the page like youtube, vimeo diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index e2fd7d083..94eb0f473 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -551,42 +551,14 @@ trait ContentExtractor { * * @return */ - def extractLinks(node: Element): Set[String] = { - val candidates: ArrayList[Element] = new ArrayList[Element] - val goodLinks = mutable.HashSet[String]() + def extractLinks(node: Element): Map[String, String] = { + val goodLinks = mutable.Map[String, String]() - try { - node.parent.getElementsByTag("a").foreach(candidates.add(_)) + val candidates = node.parent.select("a[href]").filter(el => el.attr("href") != "" && el.attr("href") != "#").map(el => goodLinks += el.attr("abs:href") -> el.text) - trace(logPrefix + "extractLinks: Starting to extract links. Found: " + candidates.size) + trace(logPrefix + "extractLinks: Extracted links. Found: " + candidates.size) - for (el <- candidates) { - val attrs: Attributes = el.attributes() - for (a <- attrs) { - try { - if ((a.getKey == "href") && (a.getValue != "#")) { - trace(logPrefix + "This page has a link!: " + a.getValue) - goodLinks += a.getValue - } - } - catch { - case e: Exception => { - info(logPrefix + "Error extracting links: " + e.toString) - } - } - } - } - } - catch { - case e: NullPointerException => { - warn(e.toString, e) - } - case e: Exception => { - warn(e.toString, e) - } - } - trace(logPrefix + "extractLinks: done looking at links") - goodLinks.toSet + goodLinks.toMap } def isTableTagAndNoParagraphsExist(e: Element): Boolean = { From 435ab831eedddc8209d4e0aabb1e155cd3c27be9 Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Wed, 24 Jul 2013 21:32:46 -0700 Subject: [PATCH 188/347] don't crash on documents without body (eg. a page with just frame set?) doesn't actually do extraction in this case... --- .../goose/cleaners/DocumentCleaner.scala | 49 ++++++++++--------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala b/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala index ffa3d68e3..08eebabab 100644 --- a/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala +++ b/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala @@ -136,42 +136,43 @@ trait DocumentCleaner { } private def cleanBadTags(doc: Document): Document = { - val children: Elements = doc.body.children - val naughtyList: Elements = children.select(queryNaughtyIDs) - trace(naughtyList.size + " naughty ID elements found") + if (doc.body != null) { + val children: Elements = doc.body.children + val naughtyList: Elements = children.select(queryNaughtyIDs) + trace(naughtyList.size + " naughty ID elements found") - import scala.collection.JavaConversions._ - for (node <- naughtyList) { - trace("Removing node with id: " + node.id) - removeNode(node) - } + import scala.collection.JavaConversions._ + for (node <- naughtyList) { + trace("Removing node with id: " + node.id) + removeNode(node) + } - val naughtyList2: Elements = children.select(queryNaughtyIDs) - trace(naughtyList2.size + " naughty ID elements found after removal") + val naughtyList2: Elements = children.select(queryNaughtyIDs) + trace(naughtyList2.size + " naughty ID elements found after removal") - val naughtyClasses: Elements = children.select(queryNaughtyClasses) + val naughtyClasses: Elements = children.select(queryNaughtyClasses) - trace(naughtyClasses.size + " naughty CLASS elements found") + trace(naughtyClasses.size + " naughty CLASS elements found") - for (node <- naughtyClasses) { - trace("Removing node with class: " + node.className) - removeNode(node) - } + for (node <- naughtyClasses) { + trace("Removing node with class: " + node.className) + removeNode(node) + } - val naughtyClasses2: Elements = children.select(queryNaughtyClasses) - trace(naughtyClasses2.size + " naughty CLASS elements found after removal") + val naughtyClasses2: Elements = children.select(queryNaughtyClasses) + trace(naughtyClasses2.size + " naughty CLASS elements found after removal") - val naughtyList5: Elements = children.select(queryNaughtyNames) + val naughtyList5: Elements = children.select(queryNaughtyNames) - trace(naughtyList5.size + " naughty Name elements found") + trace(naughtyList5.size + " naughty Name elements found") - for (node <- naughtyList5) { + for (node <- naughtyList5) { - trace("Removing node with class: " + node.attr("class") + " id: " + node.id + " name: " + node.attr("name")) + trace("Removing node with class: " + node.attr("class") + " id: " + node.id + " name: " + node.attr("name")) - removeNode(node) + removeNode(node) + } } - doc } From a5c9d28559790aca2c5260a9c9fffebdda1cb6c6 Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Wed, 24 Jul 2013 21:33:28 -0700 Subject: [PATCH 189/347] don't keep alive forever if value isn't specified, just leave the connection open for 10 seconds --- .../gravity/goose/network/HtmlFetcher.scala | 30 +++++++++++++++++-- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index f170ac2cf..c742d3391 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -22,7 +22,7 @@ import org.apache.http.Header import org.apache.http.HeaderElement import org.apache.http.HttpEntity import org.apache.http.HttpVersion -import org.apache.http.{HttpRequest, HttpRequestInterceptor, HttpResponse, HttpResponseInterceptor} +import org.apache.http.{HttpRequest, HttpRequestInterceptor, HttpResponse, HttpResponseInterceptor, HeaderElementIterator} import org.apache.http.client.entity.GzipDecompressingEntity import org.apache.http.client.CookieStore import org.apache.http.impl.client.BasicCookieStore @@ -30,14 +30,15 @@ import org.apache.http.client.HttpClient import org.apache.http.client.methods.HttpGet import org.apache.http.client.params.CookiePolicy import org.apache.http.client.protocol.ClientContext +import org.apache.http.conn.ConnectionKeepAliveStrategy import org.apache.http.conn.scheme.PlainSocketFactory import org.apache.http.conn.ssl.SSLSocketFactory import org.apache.http.conn.scheme.{Scheme, SchemeRegistry} import org.apache.http.cookie.Cookie import org.apache.http.impl.conn.PoolingClientConnectionManager +import org.apache.http.message.BasicHeaderElementIterator import org.apache.http.params.{HttpParams, BasicHttpParams, HttpConnectionParams, HttpProtocolParams} -import org.apache.http.protocol.BasicHttpContext -import org.apache.http.protocol.HttpContext +import org.apache.http.protocol.{HTTP, BasicHttpContext, HttpContext} import org.apache.http.util.EntityUtils import org.apache.http.entity.ContentType import java.io._ @@ -328,6 +329,29 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { } }) + httpClient.asInstanceOf[AbstractHttpClient].setKeepAliveStrategy(new ConnectionKeepAliveStrategy() { + def getKeepAliveDuration( response: HttpResponse, context: HttpContext): Long = { + // Honor 'keep-alive' header + val it: HeaderElementIterator = new BasicHeaderElementIterator(response.headerIterator(HTTP.CONN_KEEP_ALIVE)) + + while (it.hasNext()) { + val he: HeaderElement = it.nextElement() + val param: String = he.getName() + val value: String = he.getValue() + if (value != null && param.equalsIgnoreCase("timeout")) { + try { + return value.toLong * 1000 + } catch { + case e: NumberFormatException => {} // ignore numberformat errors + } + } + } + + // otherwise keep alive for 10 seconds + return 10 * 1000 + } + }) + if (connectionMonitorThread == null) { connectionMonitorThread = new IdleConnectionMonitorThread(cm); } From c7a22dafaa30f7e12caa2cf108a5444a40a0be09 Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Wed, 24 Jul 2013 21:40:35 -0700 Subject: [PATCH 190/347] remove paragraphs that are completely links as well --- .../com/gravity/goose/extractors/ContentExtractor.scala | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index 94eb0f473..b62426ddf 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -427,9 +427,9 @@ trait ContentExtractor { val linkDivisor: Float = numberOfLinkWords / numberOfWords val score: Float = linkDivisor * numberOfLinks - trace(logPrefix + "Calulated link density score as: " + score + " for node: " + getShortText(e.text, 50)) + trace(logPrefix + "Calculated link density score as: " + score + " for node: " + getShortText(e.text, 50)) - if (score > 1) { + if (score >= 1) { return true } false @@ -600,7 +600,7 @@ trait ContentExtractor { val node = addSiblings(targetNode) for { e <- node.children - if (e.tagName != "p") + if (e.tagName != "p" || isHighLinkDensity(e)) } { trace(logPrefix + "CLEANUP NODE: " + e.id + " class: " + e.attr("class")) if (isHighLinkDensity(e) || isTableTagAndNoParagraphsExist(e) || !isNodeScoreThreshholdMet(node, e)) { @@ -611,6 +611,7 @@ trait ContentExtractor { } } } + trace(logPrefix + "Finished cleanup Node") node } From 070d5283a8a7695d4201987b26fa7cbaae1f11b7 Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Wed, 24 Jul 2013 21:41:04 -0700 Subject: [PATCH 191/347] fix canonical urls to get the absolute href --- .../scala/com/gravity/goose/extractors/ContentExtractor.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index b62426ddf..00397d760 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -165,7 +165,7 @@ trait ContentExtractor { * if the article has meta canonical link set in the url */ def getCanonicalLink(article: Article): String = { - var url = article.doc.select("link[rel=canonical]").attr("href") + var url = article.doc.select("link[rel=canonical]").attr("abs:href") if (url.isEmpty) { url = article.doc.select("meta[property=og:url]").attr("content") if (url.isEmpty) { From ff8613f175f7ff7b93956eb28bb132f927148def Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Thu, 25 Jul 2013 13:06:06 -0700 Subject: [PATCH 192/347] fix other canonical link types to get the abs href, set the base uri when parsing --- src/main/scala/com/gravity/goose/Crawler.scala | 2 +- .../gravity/goose/extractors/ContentExtractor.scala | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index 94fe51ade..799ce6283 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -138,7 +138,7 @@ class Crawler(config: Configuration) { def getDocument(url: String, rawlHtml: String): Option[Document] = { try { - Some(Jsoup.parse(rawlHtml)) + Some(Jsoup.parse(rawlHtml, url)) } catch { case e: Exception => { trace("Unable to parse " + url + " properly into JSoup Doc") diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index 00397d760..e98d1868b 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -166,10 +166,17 @@ trait ContentExtractor { */ def getCanonicalLink(article: Article): String = { var url = article.doc.select("link[rel=canonical]").attr("abs:href") + trace(logPrefix + " base uri: " + article.doc.baseUri) + trace(logPrefix + " canonical link: " + url) + if (url.isEmpty) { - url = article.doc.select("meta[property=og:url]").attr("content") + url = article.doc.select("meta[property=og:url]").attr("abs:content") + + trace(logPrefix + " canonical link meta og: " + url) if (url.isEmpty) { - url = article.doc.select("meta[name=twitter:url]").attr("content") + url = article.doc.select("meta[name=twitter:url]").attr("abs:content") + + trace(logPrefix + " canonical link meta twitter: " + url) } } if (url.nonEmpty) { From 5fc462d3ab0482eadced1d7ef2dcba2e90c10adb Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Thu, 25 Jul 2013 20:12:38 -0700 Subject: [PATCH 193/347] shorter connection timeout for images --- src/main/scala/com/gravity/goose/Configuration.scala | 6 ++++++ src/main/scala/com/gravity/goose/images/ImageUtils.scala | 9 ++++++++- .../scala/com/gravity/goose/network/HtmlFetcher.scala | 6 +++--- .../goose/network/IdleConnectionMonitorThread.java | 4 ++-- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index cd82a53d0..05a07b84a 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -78,6 +78,12 @@ class Configuration { @BeanProperty var socketTimeout: Int = 10000 // 10 seconds + @BeanProperty + var imageConnectionTimeout: Int = 2000 // 2 seconds + + @BeanProperty + var imageSocketTimeout: Int = 5000 // 5 seconds + /** * used as the user agent that is sent with your web requests to extract an article */ diff --git a/src/main/scala/com/gravity/goose/images/ImageUtils.scala b/src/main/scala/com/gravity/goose/images/ImageUtils.scala index f4099b9e0..de93e2e8e 100644 --- a/src/main/scala/com/gravity/goose/images/ImageUtils.scala +++ b/src/main/scala/com/gravity/goose/images/ImageUtils.scala @@ -28,6 +28,7 @@ import java.awt.color.CMMException import java.awt.image.BufferedImage import com.gravity.goose.utils.{URLHelper, Logging} import org.apache.http.client.HttpClient +import org.apache.http.params.HttpConnectionParams import org.apache.http.HttpEntity import org.apache.http.protocol.{BasicHttpContext, HttpContext} import org.apache.http.client.protocol.ClientContext @@ -274,7 +275,13 @@ object ImageUtils extends Logging { val localContext: HttpContext = new BasicHttpContext localContext.setAttribute(ClientContext.COOKIE_STORE, HtmlFetcher.emptyCookieStore) val response = try { - config.getHtmlFetcher.getHttpClient.execute(httpget, localContext) + val httpClient = config.getHtmlFetcher.getHttpClient // this doesn't use the passed in httpClient, I'm not sure why... + val params = httpClient.getParams + + HttpConnectionParams.setConnectionTimeout(params, config.getImageConnectionTimeout()) + HttpConnectionParams.setSoTimeout(params, config.getImageSocketTimeout()) + + httpClient.execute(httpget, localContext) } catch { case ex: Exception => throw new ImageFetchException(imageSrc, ex) diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index c742d3391..d7c2265e3 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -116,11 +116,11 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { val params = httpClient.getParams HttpProtocolParams.setUserAgent(params, config.getBrowserUserAgent()) + trace("Setting UserAgent To: " + HttpProtocolParams.getUserAgent(httpClient.getParams)) HttpConnectionParams.setConnectionTimeout(params, config.getConnectionTimeout()) HttpConnectionParams.setSoTimeout(params, config.getSocketTimeout()) - trace("Setting UserAgent To: " + HttpProtocolParams.getUserAgent(httpClient.getParams)) val response: HttpResponse = httpClient.execute(httpget, localContext) HttpStatusValidator.validate(cleanUrl, response.getStatusLine.getStatusCode) match { @@ -297,8 +297,8 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { httpClient = new DefaultHttpClient(cm, httpParams) httpClient.asInstanceOf[AbstractHttpClient].setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(0, false)) - httpClient.getParams.setParameter("http.connection-manager.timeout", 30000L) - httpClient.getParams.setParameter("http.protocol.wait-for-continue", 10000L) + httpClient.getParams.setParameter("http.connection-manager.timeout", 20000L) // timeout for retrieving a connection from the pool + httpClient.getParams.setParameter("http.protocol.wait-for-continue", 5000L) // timeout for how long the client waits for 100-continue before sending request body httpClient.getParams.setParameter("http.tcp.nodelay", true) // http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientGZipContentCompression.java diff --git a/src/main/scala/com/gravity/goose/network/IdleConnectionMonitorThread.java b/src/main/scala/com/gravity/goose/network/IdleConnectionMonitorThread.java index d637a7926..33303b2d0 100644 --- a/src/main/scala/com/gravity/goose/network/IdleConnectionMonitorThread.java +++ b/src/main/scala/com/gravity/goose/network/IdleConnectionMonitorThread.java @@ -22,8 +22,8 @@ public void run() { // Close expired connections connMgr.closeExpiredConnections(); // Optionally, close connections - // that have been idle longer than 30 sec - connMgr.closeIdleConnections(30, TimeUnit.SECONDS); + // that have been idle longer than 15 sec + connMgr.closeIdleConnections(15, TimeUnit.SECONDS); } } } catch (InterruptedException ex) { From ed41e379b84dde6576607da6c5784856f1727424 Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Thu, 25 Jul 2013 23:45:39 -0700 Subject: [PATCH 194/347] ignore javascript links --- .../scala/com/gravity/goose/extractors/ContentExtractor.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index e98d1868b..69b93e327 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -561,7 +561,7 @@ trait ContentExtractor { def extractLinks(node: Element): Map[String, String] = { val goodLinks = mutable.Map[String, String]() - val candidates = node.parent.select("a[href]").filter(el => el.attr("href") != "" && el.attr("href") != "#").map(el => goodLinks += el.attr("abs:href") -> el.text) + val candidates = node.parent.select("a[href]").filter(el => el.attr("href") != "#" && !el.attr("abs:href").trim.isEmpty).map(el => goodLinks += el.attr("abs:href") -> el.text) trace(logPrefix + "extractLinks: Extracted links. Found: " + candidates.size) From a505e331f52da703987cc858324ea8488c17eae6 Mon Sep 17 00:00:00 2001 From: Patrick Liang <patrick@airpr.com> Date: Wed, 31 Jul 2013 16:20:12 -0700 Subject: [PATCH 195/347] ignore huffingtonpost related slideshow --- src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala b/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala index 08eebabab..74a4855ef 100644 --- a/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala +++ b/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala @@ -390,7 +390,7 @@ object DocumentCleaner extends Logging { // create negative elements sb.append("^side$|combx|retweet|mediaarticlerelated|menucontainer|navbar|comment(?!ed)|PopularQuestions|contact|foot|footer|Footer|footnote|cnn_strycaptiontxt|links|meta$|scroll(?!able)|shoutbox|sponsor") sb.append("|tags|socialnetworking|socialNetworking|cnnStryHghLght|cnn_stryspcvbx|^inset$|pagetools|post-attributes|welcome_form|contentTools2|the_answers|remember-tool-tip") - sb.append("|communitypromo|runaroundLeft|subscribe|vcard|articleheadings|date|^print$|popup|author-dropdown|tools|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text") + sb.append("|communitypromo|promo_holder|runaroundLeft|subscribe|vcard|articleheadings|date|^print$|popup|author-dropdown|tools|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text") /** * this regex is used to remove undesirable nodes from our doc From 2b020f2dda2acd110aec40059bd64190d2dfb593 Mon Sep 17 00:00:00 2001 From: Anuj Dutta <anuj@andhapp.com> Date: Sat, 3 Aug 2013 15:31:13 +0100 Subject: [PATCH 196/347] Add .idea to ignore whitelist. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 615c5c5c9..068ff5c55 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ target/ /goose.iml /goose.ipr /goose.iws +.idea/ From 68cbf29db1d9fb246b734863ecc2c3f8e2a47449 Mon Sep 17 00:00:00 2001 From: Anuj Dutta <anuj@andhapp.com> Date: Sat, 3 Aug 2013 15:31:47 +0100 Subject: [PATCH 197/347] Updated pom.xml --- pom.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9fef84cba..807d68434 100644 --- a/pom.xml +++ b/pom.xml @@ -19,7 +19,12 @@ <version>4.8.1</version> <scope>test</scope> </dependency> - <dependency> + <dependency> + <groupId>antlr</groupId> + <artifactId>antlr</artifactId> + <version>2.7.7</version> + </dependency> + <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.6.1</version> From 270b33eac3332923e9ce7f4d78a3021e9455b5d0 Mon Sep 17 00:00:00 2001 From: Anuj Dutta <anuj@andhapp.com> Date: Sat, 3 Aug 2013 15:32:10 +0100 Subject: [PATCH 198/347] We do want stalecheck to make sure the connection is always fresh. --- src/main/scala/com/gravity/goose/network/HtmlFetcher.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index 34ebf44a7..72eb89ef2 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -266,7 +266,7 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { httpParams.setParameter("http.protocol.content-charset", "UTF-8") httpParams.setParameter("Accept", "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5") httpParams.setParameter("Cache-Control", "max-age=0") - httpParams.setParameter("http.connection.stalecheck", false) + httpParams.setParameter("http.connection.stalecheck", true) val schemeRegistry: SchemeRegistry = new SchemeRegistry schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory)) schemeRegistry.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory)) From b3cc655455f56d69dcc565e493f2b253f16a86cc Mon Sep 17 00:00:00 2001 From: Sravan Bhamidipati <bsravanin@gmail.com> Date: Tue, 22 Oct 2013 22:27:56 -0400 Subject: [PATCH 199/347] Modifying the CLI interface to work on a file containing a list of URLs, instead of a single URL. --- .../com/gravity/goose/TalkToMeGoose.scala | 66 ++++++++----------- 1 file changed, 29 insertions(+), 37 deletions(-) diff --git a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala index fba111b88..b7a0ee2af 100644 --- a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala +++ b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala @@ -1,42 +1,34 @@ package com.gravity.goose -/** - * Created by Jim Plush - * User: jim - * Date: 5/13/11 - */ +import java.io._ +import scala.io.Source + object TalkToMeGoose { - /** - * you can use this method if you want to run goose from the command line to extract html from a bashscript - * or to just test it's functionality - * you can run it like so - * cd into the goose root - * mvn compile - * MAVEN_OPTS="-Xms256m -Xmx2000m"; mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="http://techcrunch.com/2011/05/13/native-apps-or-web-apps-particle-code-wants-you-to-do-both/" -e -q > ~/Desktop/gooseresult.txt - * - * Some top gun love: - * Officer: [in the midst of the MIG battle] Both Catapults are broken, sir. - * Stinger: How long will it take? - * Officer: It'll take ten minutes. - * Stinger: Bullshit ten minutes! This thing will be over in two minutes! Get on it! - * - * @param args - */ - def main(args: Array[String]) { - try { - val url: String = args(0) - val config: Configuration = new Configuration - config.enableImageFetching = false - val goose = new Goose(config) - val article = goose.extractContent(url) - println(article.cleanedArticleText) - } - catch { - case e: Exception => { - System.out.println("Make sure you pass in a valid URL: " + e.toString) - } - } - } -} + /** + * Run Goose on a file containing a list of URLs. + * mvn compile + * mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="path_to_url_file path_to_extract_to_dir" + */ + def main(args: Array[String]) { + val url_file: String = args(0) + val extracted: String = args(1) + val config: Configuration = new Configuration + config.enableImageFetching = false + val goose = new Goose(config) + for (url <- Source.fromFile(url_file).getLines()) { + try { + val article = goose.extractContent(url) + val filename = extracted + "/" + url.replace("http://", "").replace("https://", "").replace("/", "_") + "_" + System.currentTimeMillis + val writer = new PrintWriter(new File(filename)) + writer.write(article.cleanedArticleText) + writer.close() + } catch { + case e: Exception => { + System.out.println(url + " is not a valid URL: " + e.toString) + } + } + } + } +} From 74f1e4d137f123255f44b35ba0aa5d69c68d24b1 Mon Sep 17 00:00:00 2001 From: Sravan Bhamidipati <bsravanin@gmail.com> Date: Tue, 22 Oct 2013 22:31:31 -0400 Subject: [PATCH 200/347] Changing the CLI interface to process a file containing a list of URLs, instead of a single URL. --- .../com/gravity/goose/TalkToMeGoose.scala | 66 ++++++++----------- 1 file changed, 29 insertions(+), 37 deletions(-) diff --git a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala index fba111b88..b7a0ee2af 100644 --- a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala +++ b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala @@ -1,42 +1,34 @@ package com.gravity.goose -/** - * Created by Jim Plush - * User: jim - * Date: 5/13/11 - */ +import java.io._ +import scala.io.Source + object TalkToMeGoose { - /** - * you can use this method if you want to run goose from the command line to extract html from a bashscript - * or to just test it's functionality - * you can run it like so - * cd into the goose root - * mvn compile - * MAVEN_OPTS="-Xms256m -Xmx2000m"; mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="http://techcrunch.com/2011/05/13/native-apps-or-web-apps-particle-code-wants-you-to-do-both/" -e -q > ~/Desktop/gooseresult.txt - * - * Some top gun love: - * Officer: [in the midst of the MIG battle] Both Catapults are broken, sir. - * Stinger: How long will it take? - * Officer: It'll take ten minutes. - * Stinger: Bullshit ten minutes! This thing will be over in two minutes! Get on it! - * - * @param args - */ - def main(args: Array[String]) { - try { - val url: String = args(0) - val config: Configuration = new Configuration - config.enableImageFetching = false - val goose = new Goose(config) - val article = goose.extractContent(url) - println(article.cleanedArticleText) - } - catch { - case e: Exception => { - System.out.println("Make sure you pass in a valid URL: " + e.toString) - } - } - } -} + /** + * Run Goose on a file containing a list of URLs. + * mvn compile + * mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="path_to_url_file path_to_extract_to_dir" + */ + def main(args: Array[String]) { + val url_file: String = args(0) + val extracted: String = args(1) + val config: Configuration = new Configuration + config.enableImageFetching = false + val goose = new Goose(config) + for (url <- Source.fromFile(url_file).getLines()) { + try { + val article = goose.extractContent(url) + val filename = extracted + "/" + url.replace("http://", "").replace("https://", "").replace("/", "_") + "_" + System.currentTimeMillis + val writer = new PrintWriter(new File(filename)) + writer.write(article.cleanedArticleText) + writer.close() + } catch { + case e: Exception => { + System.out.println(url + " is not a valid URL: " + e.toString) + } + } + } + } +} From bcf6dcb8096bc815fbd3e7416dec4f5d19066895 Mon Sep 17 00:00:00 2001 From: Jason Bennett <jbennett@unfold.com> Date: Thu, 31 Oct 2013 17:29:13 -0700 Subject: [PATCH 201/347] Fix versions for deployment --- pom.xml | 56 ++++++++++++++++++++++++-------------------------------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/pom.xml b/pom.xml index dbc02b031..a53aa813e 100644 --- a/pom.xml +++ b/pom.xml @@ -1,42 +1,34 @@ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.unfold</groupId> <artifactId>goose-fork</artifactId> - <version>2.1.23-SNAPSHOT</version> - + <version>2.1.24-SNAPSHOT</version> + <packaging>jar</packaging> - + <name>Goose - Unfold Fork</name> - + <distributionManagement> <repository> - <id>unfold-release</id> - <name>Unfold Nexus Release Repository</name> - <url>http://git.tacenda.com:8081/nexus/content/repositories/releases</url> + <id>unfold-release</id> + <name>Unfold Nexus Release Repository</name> + <url>http://nexus.unfold.com:8081/nexus/content/repositories/releases</url> </repository> <snapshotRepository> - <id>unfold-snapshot</id> - <name>Unfold Nexus Snapshot Repository</name> - <url>http://nexus.unfold.com:8081/nexus/content/repositories/snapshots</url> + <id>unfold-snapshot</id> + <name>Unfold Nexus Snapshot Repository</name> + <url>http://nexus.unfold.com:8081/nexus/content/repositories/snapshots</url> </snapshotRepository> </distributionManagement> - + <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.5</maven.compiler.source> <maven.compiler.target>1.5</maven.compiler.target> </properties> - <repositories> - <repository> - <id>akka.repository</id> - <name>Akka Maven Repository</name> - <url>http://akka.io/repository</url> - </repository> - </repositories> - <dependencies> <dependency> <groupId>junit</groupId> @@ -44,24 +36,26 @@ <version>4.8.1</version> <scope>test</scope> </dependency> + <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> - <version>1.6.1</version> - <type>jar</type> - <scope>compile</scope> + <version>1.7.5</version> </dependency> + <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> - <version>1.6.1</version> + <version>1.7.5</version> <scope>test</scope> </dependency> + <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.5.2</version> </dependency> + <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> @@ -86,6 +80,7 @@ <artifactId>httpclient</artifactId> <version>4.2.4</version> </dependency> + <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> @@ -124,20 +119,17 @@ </exclusions> </dependency> - + <dependency> - <groupId>com.googlecode.juniversalchardet</groupId> - <artifactId>juniversalchardet</artifactId> - <version>1.0.3</version> - <scope>compile</scope> + <groupId>com.googlecode.juniversalchardet</groupId> + <artifactId>juniversalchardet</artifactId> + <version>1.0.3</version> </dependency> </dependencies> - <!-- - Hey... since we're open source, let's compile the source and javadocs into jars as well - --> + <!-- Hey... since we're open source, let's compile the source and javadocs into jars as well --> <build> <plugins> <plugin> From bec521ab177fc260c7fd809b672ce2296a7e7d2a Mon Sep 17 00:00:00 2001 From: Jason Bennett <jbennett@unfold.com> Date: Fri, 1 Nov 2013 11:42:11 -0700 Subject: [PATCH 202/347] Remove idle connection monitor - clojure AOT hangs when the thread is thrown during compile time --- .../gravity/goose/network/HtmlFetcher.scala | 6 --- .../network/IdleConnectionMonitorThread.java | 41 ------------------- 2 files changed, 47 deletions(-) delete mode 100644 src/main/scala/com/gravity/goose/network/IdleConnectionMonitorThread.java diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index d7c2265e3..ac1658acd 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -76,8 +76,6 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { private var httpClient: HttpClient = null initClient() - private var connectionMonitorThread: IdleConnectionMonitorThread = null - def getHttpClient: HttpClient = { httpClient } @@ -352,10 +350,6 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { } }) - if (connectionMonitorThread == null) { - connectionMonitorThread = new IdleConnectionMonitorThread(cm); - } - connectionMonitorThread.start(); } /** diff --git a/src/main/scala/com/gravity/goose/network/IdleConnectionMonitorThread.java b/src/main/scala/com/gravity/goose/network/IdleConnectionMonitorThread.java deleted file mode 100644 index 33303b2d0..000000000 --- a/src/main/scala/com/gravity/goose/network/IdleConnectionMonitorThread.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.gravity.goose.network; - -import java.util.concurrent.TimeUnit; -import org.apache.http.impl.conn.PoolingClientConnectionManager; - -public class IdleConnectionMonitorThread extends Thread { - - private final PoolingClientConnectionManager connMgr; - private volatile boolean shutdown; - - public IdleConnectionMonitorThread(PoolingClientConnectionManager connMgr) { - super(); - this.connMgr = connMgr; - } - - @Override - public void run() { - try { - while (!shutdown) { - synchronized (this) { - wait(5000); - // Close expired connections - connMgr.closeExpiredConnections(); - // Optionally, close connections - // that have been idle longer than 15 sec - connMgr.closeIdleConnections(15, TimeUnit.SECONDS); - } - } - } catch (InterruptedException ex) { - // terminate - } - } - - public void shutdown() { - shutdown = true; - synchronized (this) { - notifyAll(); - } - } - -} \ No newline at end of file From 977648c947435aa85162ba719753207c55e8a453 Mon Sep 17 00:00:00 2001 From: Jason Bennett <jbennett@unfold.com> Date: Fri, 1 Nov 2013 11:42:57 -0700 Subject: [PATCH 203/347] Upgrade versions, remove unnecessary dependencies, and issue new release --- pom.xml | 43 ++++--------------------------------------- 1 file changed, 4 insertions(+), 39 deletions(-) diff --git a/pom.xml b/pom.xml index a53aa813e..c7c427669 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ <groupId>com.unfold</groupId> <artifactId>goose-fork</artifactId> - <version>2.1.24-SNAPSHOT</version> + <version>2.1.25</version> <packaging>jar</packaging> @@ -53,20 +53,19 @@ <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> - <version>1.5.2</version> + <version>1.7.2</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> - <version>2.0.1</version> + <version>2.2</version> </dependency> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-compiler</artifactId> <version>2.9.2</version> - <scope>compile</scope> </dependency> <dependency> @@ -78,7 +77,7 @@ <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> - <version>4.2.4</version> + <version>4.3.1</version> </dependency> <dependency> @@ -87,40 +86,6 @@ <version>2.6</version> </dependency> - <dependency> - <groupId>se.scalablesolutions.akka</groupId> - <artifactId>akka-actor</artifactId> - <version>1.1.3</version> - <exclusions> - <exclusion> - <groupId>ch.qos.logback</groupId> - <artifactId>logback-core</artifactId> - </exclusion> - <exclusion> - <groupId>ch.qos.logback</groupId> - <artifactId>logback-classic</artifactId> - </exclusion> - - </exclusions> - </dependency> - <dependency> - <groupId>se.scalablesolutions.akka</groupId> - <artifactId>akka-typed-actor</artifactId> - <version>1.1.3</version> - <exclusions> - <exclusion> - <groupId>ch.qos.logback</groupId> - <artifactId>logback-core</artifactId> - </exclusion> - <exclusion> - <groupId>ch.qos.logback</groupId> - <artifactId>logback-classic</artifactId> - </exclusion> - - </exclusions> - </dependency> - - <dependency> <groupId>com.googlecode.juniversalchardet</groupId> <artifactId>juniversalchardet</artifactId> From e70f4f202c2e316582c6a86f0e16dbe54b503b3a Mon Sep 17 00:00:00 2001 From: Sravan Bhamidipati <bsravanin@gmail.com> Date: Thu, 7 Nov 2013 20:43:55 -0500 Subject: [PATCH 204/347] Cassandra persistence. Modifying the CLI interface to store the extracted articles into a Cassandra (keyspace, column_family). Versions. --- pom.xml | 16 ++++++ .../com/gravity/goose/TalkToMeGoose.scala | 55 ++++++++++++++++--- 2 files changed, 62 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index 9fef84cba..d80e24ca5 100644 --- a/pom.xml +++ b/pom.xml @@ -66,6 +66,22 @@ <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> + + <dependency> + <groupId>com.netflix.astyanax</groupId> + <artifactId>astyanax-core</artifactId> + <version>1.56.43</version> + </dependency> + <dependency> + <groupId>com.netflix.astyanax</groupId> + <artifactId>astyanax-thrift</artifactId> + <version>1.56.43</version> + </dependency> + <dependency> + <groupId>com.netflix.astyanax</groupId> + <artifactId>astyanax-cassandra</artifactId> + <version>1.56.43</version> + </dependency> </dependencies> <!-- diff --git a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala index b7a0ee2af..9d0ce27e9 100644 --- a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala +++ b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala @@ -2,28 +2,65 @@ package com.gravity.goose import java.io._ import scala.io.Source +import com.netflix.astyanax.AstyanaxContext; +import com.netflix.astyanax.Keyspace; +import com.netflix.astyanax.MutationBatch; +import com.netflix.astyanax.connectionpool.NodeDiscoveryType; +import com.netflix.astyanax.connectionpool.OperationResult; +import com.netflix.astyanax.connectionpool.impl.ConnectionPoolConfigurationImpl; +import com.netflix.astyanax.connectionpool.impl.CountingConnectionPoolMonitor; +import com.netflix.astyanax.impl.AstyanaxConfigurationImpl; +import com.netflix.astyanax.model.ColumnFamily; +import com.netflix.astyanax.serializers.StringSerializer; +import com.netflix.astyanax.serializers.StringSerializer; +import com.netflix.astyanax.thrift.ThriftFamilyFactory; object TalkToMeGoose { /** - * Run Goose on a file containing a list of URLs. + * Run Goose on a file containing a list of URLs, and store it in a Cassandra keyspace column_family. * mvn compile - * mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="path_to_url_file path_to_extract_to_dir" + * mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="keyspace column_family path_to_url_file" */ def main(args: Array[String]) { - val url_file: String = args(0) - val extracted: String = args(1) + val keyspace_name: String = args(0) + val column_family_name: String = args(1) + val url_file: String = args(2) + val context = new AstyanaxContext.Builder() + .forCluster("Cluster") + .forKeyspace(keyspace_name) + .withAstyanaxConfiguration(new AstyanaxConfigurationImpl() + .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE) + .setTargetCassandraVersion("1.2") + ) + .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool") + .setPort(9160) + .setMaxConnsPerHost(1) + .setSeeds("127.0.0.1:9160") + ) + .withConnectionPoolMonitor(new CountingConnectionPoolMonitor()) + .buildKeyspace(ThriftFamilyFactory.getInstance()) + + context.start() + + val keyspace = context.getEntity() + val column_family = ColumnFamily.newColumnFamily( + column_family_name, + StringSerializer.get(), + StringSerializer.get()) + val mutation_batch = keyspace.prepareMutationBatch() + val config: Configuration = new Configuration config.enableImageFetching = false val goose = new Goose(config) for (url <- Source.fromFile(url_file).getLines()) { try { - val article = goose.extractContent(url) - val filename = extracted + "/" + url.replace("http://", "").replace("https://", "").replace("/", "_") + "_" + System.currentTimeMillis - val writer = new PrintWriter(new File(filename)) - writer.write(article.cleanedArticleText) - writer.close() + val article = goose.extractContent(url).cleanedArticleText + val timestamp = System.currentTimeMillis.toString + mutation_batch.withRow(column_family, url) + .putColumn(timestamp, article) + mutation_batch.execute(); } catch { case e: Exception => { System.out.println(url + " is not a valid URL: " + e.toString) From 145d5e7f9e4daffdfb02089e972d1d0d857c12a1 Mon Sep 17 00:00:00 2001 From: Sravan Bhamidipati <bsravanin@gmail.com> Date: Fri, 22 Nov 2013 01:50:36 -0500 Subject: [PATCH 205/347] Further simplifying the CLI interface. The keyspace and columnfamily are used to both get a list of URLs, and update their extracted content. --- .../com/gravity/goose/TalkToMeGoose.scala | 48 ++++++++++++------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala index 9d0ce27e9..a71a8c69c 100644 --- a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala +++ b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala @@ -1,31 +1,37 @@ package com.gravity.goose import java.io._ +import scala.collection.JavaConversions._ import scala.io.Source -import com.netflix.astyanax.AstyanaxContext; -import com.netflix.astyanax.Keyspace; -import com.netflix.astyanax.MutationBatch; -import com.netflix.astyanax.connectionpool.NodeDiscoveryType; -import com.netflix.astyanax.connectionpool.OperationResult; -import com.netflix.astyanax.connectionpool.impl.ConnectionPoolConfigurationImpl; -import com.netflix.astyanax.connectionpool.impl.CountingConnectionPoolMonitor; -import com.netflix.astyanax.impl.AstyanaxConfigurationImpl; -import com.netflix.astyanax.model.ColumnFamily; -import com.netflix.astyanax.serializers.StringSerializer; -import com.netflix.astyanax.serializers.StringSerializer; -import com.netflix.astyanax.thrift.ThriftFamilyFactory; +import com.netflix.astyanax.AstyanaxContext +import com.netflix.astyanax.Keyspace +import com.netflix.astyanax.MutationBatch +import com.netflix.astyanax.connectionpool.NodeDiscoveryType +import com.netflix.astyanax.connectionpool.OperationResult +import com.netflix.astyanax.connectionpool.impl.ConnectionPoolConfigurationImpl +import com.netflix.astyanax.connectionpool.impl.CountingConnectionPoolMonitor +import com.netflix.astyanax.impl.AstyanaxConfigurationImpl +import com.netflix.astyanax.model.ColumnFamily +import com.netflix.astyanax.model.Row +import com.netflix.astyanax.serializers.StringSerializer +import com.netflix.astyanax.serializers.StringSerializer +import com.netflix.astyanax.thrift.ThriftFamilyFactory +import com.netflix.astyanax.util.RangeBuilder + object TalkToMeGoose { /** - * Run Goose on a file containing a list of URLs, and store it in a Cassandra keyspace column_family. + * Run Goose on a Cassandra keyspace column_family. Iterates over each key + * in the keyspace's column_family, uses that key as a URL to extract + * content from, and updates the row corresponding to that key with the + * content. * mvn compile - * mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="keyspace column_family path_to_url_file" + * mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="keyspace column_family" */ def main(args: Array[String]) { val keyspace_name: String = args(0) val column_family_name: String = args(1) - val url_file: String = args(2) val context = new AstyanaxContext.Builder() .forCluster("Cluster") .forKeyspace(keyspace_name) @@ -48,19 +54,27 @@ object TalkToMeGoose { column_family_name, StringSerializer.get(), StringSerializer.get()) + + val url_list = keyspace.prepareQuery(column_family) + .getAllRows() + .withColumnRange(new RangeBuilder().setLimit(0).build()) + .execute().getResult() val mutation_batch = keyspace.prepareMutationBatch() val config: Configuration = new Configuration config.enableImageFetching = false val goose = new Goose(config) - for (url <- Source.fromFile(url_file).getLines()) { + for (url_row <- url_list) { + val url = url_row.getKey() + try { val article = goose.extractContent(url).cleanedArticleText val timestamp = System.currentTimeMillis.toString mutation_batch.withRow(column_family, url) .putColumn(timestamp, article) - mutation_batch.execute(); + mutation_batch.execute() + System.out.println("Extracted content from " + url) } catch { case e: Exception => { System.out.println(url + " is not a valid URL: " + e.toString) From f2f30cf5c1ba196c4346cb828e0fd6f8c93db154 Mon Sep 17 00:00:00 2001 From: Matt Haynes <matt@matthaynes.net> Date: Mon, 25 Nov 2013 23:01:05 +0000 Subject: [PATCH 206/347] [maven-release-plugin] prepare release goose-2.1.23 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2dea0d5fb..b42870913 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>com.gravity</groupId> <artifactId>goose</artifactId> - <version>2.1.23-SNAPSHOT</version> + <version>2.1.23</version> <packaging>jar</packaging> <name>goose</name> <description>Goose was originally an article extractor written in Java that has most recently (aug2011) converted to a scala project. It's mission is to take any news article or article type web page and not only extract what is the main body of the article but also all meta data and most probable image candidate.</description> From d90bc2b6422f82c6455bedc3544c188b2e684ca6 Mon Sep 17 00:00:00 2001 From: Matt Haynes <matt@matthaynes.net> Date: Mon, 25 Nov 2013 23:01:45 +0000 Subject: [PATCH 207/347] [maven-release-plugin] prepare release goose-2.1.23 --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index b42870913..24c37988e 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ <packaging>jar</packaging> <name>goose</name> <description>Goose was originally an article extractor written in Java that has most recently (aug2011) converted to a scala project. It's mission is to take any news article or article type web page and not only extract what is the main body of the article but also all meta data and most probable image candidate.</description> - <url>https://github.com/jiminoc/goose</url> + <url>https://github.com/matth/goose</url> <licenses> <license> @@ -24,9 +24,9 @@ </licenses> <scm> - <connection>scm:git:git@github.com:jiminoc/goose.git</connection> - <developerConnection>scm:git:git@github.com:jiminoc/goose.git</developerConnection> - <url>git@github.com:jiminoc/goose.git</url> + <connection>scm:git:git@github.com:matth/goose.git</connection> + <developerConnection>scm:git:git@github.com:matth/goose.git</developerConnection> + <url>git@github.com:matth/goose.git</url> </scm> <properties> From f2bd9dba4625abc1d946d6b9e8225fb032011f0f Mon Sep 17 00:00:00 2001 From: Matt Haynes <matt@matthaynes.net> Date: Mon, 25 Nov 2013 23:03:13 +0000 Subject: [PATCH 208/347] Revert "[maven-release-plugin] prepare release goose-2.1.23" This reverts commit d90bc2b6422f82c6455bedc3544c188b2e684ca6. --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 24c37988e..b42870913 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ <packaging>jar</packaging> <name>goose</name> <description>Goose was originally an article extractor written in Java that has most recently (aug2011) converted to a scala project. It's mission is to take any news article or article type web page and not only extract what is the main body of the article but also all meta data and most probable image candidate.</description> - <url>https://github.com/matth/goose</url> + <url>https://github.com/jiminoc/goose</url> <licenses> <license> @@ -24,9 +24,9 @@ </licenses> <scm> - <connection>scm:git:git@github.com:matth/goose.git</connection> - <developerConnection>scm:git:git@github.com:matth/goose.git</developerConnection> - <url>git@github.com:matth/goose.git</url> + <connection>scm:git:git@github.com:jiminoc/goose.git</connection> + <developerConnection>scm:git:git@github.com:jiminoc/goose.git</developerConnection> + <url>git@github.com:jiminoc/goose.git</url> </scm> <properties> From cb48ccf8ce8f5d05ae43ae0296fe0a44ec3e374d Mon Sep 17 00:00:00 2001 From: Matt Haynes <matt@matthaynes.net> Date: Mon, 25 Nov 2013 23:03:22 +0000 Subject: [PATCH 209/347] Revert "[maven-release-plugin] prepare release goose-2.1.23" This reverts commit f2f30cf5c1ba196c4346cb828e0fd6f8c93db154. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b42870913..2dea0d5fb 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>com.gravity</groupId> <artifactId>goose</artifactId> - <version>2.1.23</version> + <version>2.1.23-SNAPSHOT</version> <packaging>jar</packaging> <name>goose</name> <description>Goose was originally an article extractor written in Java that has most recently (aug2011) converted to a scala project. It's mission is to take any news article or article type web page and not only extract what is the main body of the article but also all meta data and most probable image candidate.</description> From 567983711a46249dd2fb35d4612be8ace0a94781 Mon Sep 17 00:00:00 2001 From: Matt Haynes <matt@matthaynes.net> Date: Mon, 25 Nov 2013 23:03:54 +0000 Subject: [PATCH 210/347] Update scm --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 2dea0d5fb..0fdf7c39f 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ <packaging>jar</packaging> <name>goose</name> <description>Goose was originally an article extractor written in Java that has most recently (aug2011) converted to a scala project. It's mission is to take any news article or article type web page and not only extract what is the main body of the article but also all meta data and most probable image candidate.</description> - <url>https://github.com/jiminoc/goose</url> + <url>https://github.com/matth/goose</url> <licenses> <license> @@ -24,9 +24,9 @@ </licenses> <scm> - <connection>scm:git:git@github.com:jiminoc/goose.git</connection> - <developerConnection>scm:git:git@github.com:jiminoc/goose.git</developerConnection> - <url>git@github.com:jiminoc/goose.git</url> + <connection>scm:git:git@github.com:matth/goose.git</connection> + <developerConnection>scm:git:git@github.com:matth/goose.git</developerConnection> + <url>git@github.com:matth/goose.git</url> </scm> <properties> From dcaed2f693db9d31b2f28fd7ced92fb9de3fa9c9 Mon Sep 17 00:00:00 2001 From: Matt Haynes <matt@matthaynes.net> Date: Mon, 25 Nov 2013 23:04:51 +0000 Subject: [PATCH 211/347] [maven-release-plugin] prepare release goose-2.1.23 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0fdf7c39f..24c37988e 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>com.gravity</groupId> <artifactId>goose</artifactId> - <version>2.1.23-SNAPSHOT</version> + <version>2.1.23</version> <packaging>jar</packaging> <name>goose</name> <description>Goose was originally an article extractor written in Java that has most recently (aug2011) converted to a scala project. It's mission is to take any news article or article type web page and not only extract what is the main body of the article but also all meta data and most probable image candidate.</description> From 08e0b39ea70264eec29a19deba5cda847e3dbeaa Mon Sep 17 00:00:00 2001 From: Matt Haynes <matt@matthaynes.net> Date: Mon, 25 Nov 2013 23:04:57 +0000 Subject: [PATCH 212/347] [maven-release-plugin] prepare for next development iteration --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 24c37988e..4ebfa5793 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>com.gravity</groupId> <artifactId>goose</artifactId> - <version>2.1.23</version> + <version>2.1.24-SNAPSHOT</version> <packaging>jar</packaging> <name>goose</name> <description>Goose was originally an article extractor written in Java that has most recently (aug2011) converted to a scala project. It's mission is to take any news article or article type web page and not only extract what is the main body of the article but also all meta data and most probable image candidate.</description> From 2b7e0a17b8fe2be640192ce9494ecdbf1556cb52 Mon Sep 17 00:00:00 2001 From: Sravan Bhamidipati <bsravanin@gmail.com> Date: Mon, 25 Nov 2013 22:30:34 -0500 Subject: [PATCH 213/347] After modifications to the url_versions schema. --- .../com/gravity/goose/TalkToMeGoose.scala | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala index a71a8c69c..344c57da4 100644 --- a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala +++ b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala @@ -57,22 +57,46 @@ object TalkToMeGoose { val url_list = keyspace.prepareQuery(column_family) .getAllRows() - .withColumnRange(new RangeBuilder().setLimit(0).build()) + .withColumnSlice(List("lastc", "lastv")) .execute().getResult() val mutation_batch = keyspace.prepareMutationBatch() + var url = "" + var lastc = "" + var lastv = "" + var article = "" + var timestamp = "" + val config: Configuration = new Configuration config.enableImageFetching = false val goose = new Goose(config) for (url_row <- url_list) { - val url = url_row.getKey() + url = url_row.getKey() + lastc = url_row.getColumns().getStringValue("lastc", "") + lastv = url_row.getColumns().getStringValue("lastv", "") try { - val article = goose.extractContent(url).cleanedArticleText - val timestamp = System.currentTimeMillis.toString - mutation_batch.withRow(column_family, url) - .putColumn(timestamp, article) + val gec = goose.extractContent(url) + article = gec.cleanedArticleText + timestamp = System.currentTimeMillis.toString + + if (article == "") { + article = gec.rawHtml + } + + if (article == lastc) { + mutation_batch.withRow(column_family, url) + .putColumn(timestamp, lastv) + } else { + lastv = "v" + (lastv.replace("v", "").toInt + 1) + mutation_batch.withRow(column_family, url) + .putColumn("lastc", article) + .putColumn("lastv", lastv) + .putColumn(lastv, article) + .putColumn(timestamp, lastv) + } + mutation_batch.execute() System.out.println("Extracted content from " + url) } catch { From 67bde0c8dd049426ca8d270373f7d06b804a038a Mon Sep 17 00:00:00 2001 From: Mark Hatton <mark@zeebox.com> Date: Wed, 8 Jan 2014 11:53:55 +0000 Subject: [PATCH 214/347] bump to Scala 2.10.0 --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 9fef84cba..1981d3d45 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>com.gravity</groupId> - <artifactId>goose</artifactId> + <artifactId>goose-2.10</artifactId> <version>2.1.22</version> <packaging>jar</packaging> <name>goose</name> @@ -46,14 +46,14 @@ <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-compiler</artifactId> - <version>2.9.0-1</version> + <version>2.10.0</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> - <version>2.9.0-1</version> + <version>2.10.0</version> </dependency> <dependency> @@ -151,4 +151,4 @@ </plugins> </build> -</project> \ No newline at end of file +</project> From fe175340ecfbc86e33af4fe8dc10d357098ca169 Mon Sep 17 00:00:00 2001 From: Mark Hatton <mark@zeebox.com> Date: Wed, 8 Jan 2014 11:55:26 +0000 Subject: [PATCH 215/347] scala.actors.Future* no longer in Scala 2.10 --- src/test/scala/com/gravity/goose/GooseTest.scala | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/test/scala/com/gravity/goose/GooseTest.scala b/src/test/scala/com/gravity/goose/GooseTest.scala index 7235a34ef..41bb98077 100644 --- a/src/test/scala/com/gravity/goose/GooseTest.scala +++ b/src/test/scala/com/gravity/goose/GooseTest.scala @@ -2,8 +2,6 @@ package com.gravity.goose import org.junit.Test import org.junit.Assert._ -import scala.actors.Future -import scala.actors.Futures._ /** * Created by Jim Plush @@ -45,4 +43,4 @@ class GooseTest { } -} \ No newline at end of file +} From 870b3ce6aa70e4ae96d226ecbd6bdd9cfbc153a5 Mon Sep 17 00:00:00 2001 From: Mark Hatton <mark@zeebox.com> Date: Wed, 8 Jan 2014 11:58:50 +0000 Subject: [PATCH 216/347] add zeebox Nexus config --- pom.xml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/pom.xml b/pom.xml index 1981d3d45..86d9aab92 100644 --- a/pom.xml +++ b/pom.xml @@ -151,4 +151,31 @@ </plugins> </build> + <repositories> + <repository> + <id>zeebox-nexus</id> + <url>http://nexus.zeebox.com:8080/nexus/content/groups/public</url> + <releases> + <enabled>true</enabled> + </releases> + <snapshots> + <enabled>true</enabled> + </snapshots> + </repository> + </repositories> + + <distributionManagement> + <repository> + <id>zeebox-nexus</id> + <name>zeebox-nexus</name> + <url>http://nexus.zeebox.com:8080/nexus/content/repositories/releases</url> + </repository> + + <snapshotRepository> + <id>zeebox-nexus-snapshots</id> + <name>zeebox-nexus-snapshots</name> + <url>http://nexus.zeebox.com:8080/nexus/content/repositories/snapshots</url> + </snapshotRepository> + </distributionManagement> + </project> From d5a97b6b4b8e369f580579a8e9473bb66e0bbb2f Mon Sep 17 00:00:00 2001 From: Vinicius Miana <vinicius@miana.com.br> Date: Fri, 24 Jan 2014 10:22:48 -0200 Subject: [PATCH 217/347] Changes to compile on 2.10.3 --- pom.xml | 4 ++-- src/test/scala/com/gravity/goose/GooseTest.scala | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 4ebfa5793..1e48efbd5 100644 --- a/pom.xml +++ b/pom.xml @@ -67,14 +67,14 @@ <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-compiler</artifactId> - <version>2.9.0-1</version> + <version>2.10.3</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> - <version>2.9.0-1</version> + <version>2.10.3</version> </dependency> <dependency> diff --git a/src/test/scala/com/gravity/goose/GooseTest.scala b/src/test/scala/com/gravity/goose/GooseTest.scala index 7235a34ef..41bb98077 100644 --- a/src/test/scala/com/gravity/goose/GooseTest.scala +++ b/src/test/scala/com/gravity/goose/GooseTest.scala @@ -2,8 +2,6 @@ package com.gravity.goose import org.junit.Test import org.junit.Assert._ -import scala.actors.Future -import scala.actors.Futures._ /** * Created by Jim Plush @@ -45,4 +43,4 @@ class GooseTest { } -} \ No newline at end of file +} From 5ca6941e42ca04fc31899628ec3c74b1cf2f3a87 Mon Sep 17 00:00:00 2001 From: Yakov Bezrukov <y.bezrukov@cogia.de> Date: Mon, 3 Feb 2014 01:43:29 +0700 Subject: [PATCH 218/347] Added java class --- pom.xml | 4 ++-- .../goose/extractors/ContentExtractorJava.java | 13 +++++++++++++ .../com/gravity/goose/extractors/Extractor.scala | 2 +- .../goose/extractors/PublishDateExtractor.scala | 4 ++-- 4 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java diff --git a/pom.xml b/pom.xml index 9fef84cba..cfa37b748 100644 --- a/pom.xml +++ b/pom.xml @@ -46,14 +46,14 @@ <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-compiler</artifactId> - <version>2.9.0-1</version> + <version>2.10.3</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> - <version>2.9.0-1</version> + <version>2.10.3</version> </dependency> <dependency> diff --git a/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java b/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java new file mode 100644 index 000000000..b408677b5 --- /dev/null +++ b/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java @@ -0,0 +1,13 @@ +package com.gravity.goose.extractors; + +/** + * Created with IntelliJ IDEA. + * User: jim + * Date: 03.02.14 + * Time: 1:41 + * To change this template use File | Settings | File Templates. + */ +public class ContentExtractorJava +{ + +} diff --git a/src/main/scala/com/gravity/goose/extractors/Extractor.scala b/src/main/scala/com/gravity/goose/extractors/Extractor.scala index 33c60bd5b..c33031fd5 100644 --- a/src/main/scala/com/gravity/goose/extractors/Extractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/Extractor.scala @@ -33,7 +33,7 @@ trait Extractor[T] { /** * Given the specified {@link Element}, extract @param <T> * - * @param rootElement passed in from the {@link com.jimplush.goose.ContentExtractor} after the article has been parsed + * @param rootElement passed in from the {@link com.jimplush.goose.ContentExtractorJava} after the article has been parsed * @return an instance of type <code>T</code> */ def extract(rootElement: Element): T diff --git a/src/main/scala/com/gravity/goose/extractors/PublishDateExtractor.scala b/src/main/scala/com/gravity/goose/extractors/PublishDateExtractor.scala index aa8e1ae04..9b565e605 100644 --- a/src/main/scala/com/gravity/goose/extractors/PublishDateExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/PublishDateExtractor.scala @@ -32,9 +32,9 @@ import java.util.Date abstract class PublishDateExtractor extends Extractor[Date] { /** * Intended to search the DOM and identify the {@link Date} of when this article was published. - * <p>This will be called by the {@link com.jimplush.goose.ContentExtractor#extractContent(String)} method and will be passed to {@link com.jimplush.goose.Article#setPublishDate(java.util.Date)}</p> + * <p>This will be called by the {@link com.jimplush.goose.ContentExtractorJava#extractContent(String)} method and will be passed to {@link com.jimplush.goose.Article#setPublishDate(java.util.Date)}</p> * - * @param rootElement passed in from the {@link com.jimplush.goose.ContentExtractor} after the article has been parsed + * @param rootElement passed in from the {@link com.jimplush.goose.ContentExtractorJava} after the article has been parsed * @return {@link Date} of when this particular article was published or <code>null</code> if no date could be found. */ def extract(rootElement: Element): Date From 34256e26ba99546bef3d14f54363d620114d5f86 Mon Sep 17 00:00:00 2001 From: Yakov Bezrukov <y.bezrukov@cogia.de> Date: Mon, 3 Feb 2014 02:36:45 +0700 Subject: [PATCH 219/347] Added functions for ContentExtractor class --- .../extractors/ContentExtractorJava.java | 257 +++++++++++++++++- 1 file changed, 256 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java b/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java index b408677b5..c28d0a4a9 100644 --- a/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java +++ b/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java @@ -1,13 +1,268 @@ package com.gravity.goose.extractors; +import com.gravity.goose.Article; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; + +import java.util.HashSet; +import java.util.List; + /** * Created with IntelliJ IDEA. * User: jim * Date: 03.02.14 * Time: 1:41 - * To change this template use File | Settings | File Templates. */ public class ContentExtractorJava { + /** + * fixme stub + * @param article + * @return + */ + String getTitle(Article article) + { + return ""; + } + + /** + * fixme stub + * @param doc + * @param metaName + * @return + */ + + String getMetaContent(Document doc, String metaName) + { + return ""; + } + + /** + * fixme stub + * @param article + * @return + */ + + String getMetaDescription(Article article) + { + return ""; + } + + /** + * fixme stub + * @param article + * @return + */ + + String getMetaKeywords(Article article) + { + return ""; + } + + /** + * fixme stub + * @param article + * @return + */ + + String getCanonicalLink(Article article) + { + return ""; + } + + /** + * fixme stub + * @param url + * @return + */ + + String getDomain(String url) + { + return ""; + } + + /** + * fixme stub + * @param article + * @return + */ + + HashSet<String> extractTags(Article article) + { + return null; + } + + /** + * todo return type should be changed + * @param article + * @return + */ + String calculateBestNodeBasedOnClustering(Article article) + { + return ""; + } + + /** + * fixme stub + * @param topNode + */ + + void printTraceLog (Element topNode) + { + + } + + /** + * fixme stub + * @param node + * @return + */ + + boolean isOkToBoost(Element node) + { + return true; + } + + /** + * fixme stub + * @param e + * @return + */ + + private boolean isHighLinkDensity (Element e) + { + return true; + } + + /** + * fixme stub + * @param node + * @return + */ + + private int getScore(Element node) + { + return 0; + } + + /** + * todo return type should be changed + * @param node + */ + void getGravityScoreFromNode(Element node) + { + + } + + /** + * fixme stub + * @param node + * @param addToScore + */ + + private void updateScore(Element node, int addToScore) + { + + } + + /** + * fixme stub + * @param node + * @param addToCount + */ + + private void updateNodeCount(Element node, int addToCount) + { + + } + + /** + * fixme stub + * @param node + * @return + */ + + List<Element> extractVideos(Element node) + { + return null; + } + + /** + * fixme stub + * @param e + * @return + */ + + boolean isTableTagAndNoParagraphsExist(Element e) + { + return true; + } + + Element postExtractionCleanup(Element targetNode) + { + return null; + } + + /** + * fixme return type + * fixme stub + * @param currentSibling + * @param baselineScoreForSiblingParagraphs + */ + void getSiblingContent(Element currentSibling, int baselineScoreForSiblingParagraphs) + { + + } + + /** + * fixme return type + * fixme stub + * @param node + */ + void walkSiblings(Element node) + { + + } + + /** + * fixme stub + * @param topNode + * @return + */ + + private Element addSiblings(Element topNode) + { + return null; + } + + /** + * fixme stub + * @param topNode + * @return + */ + + private int getBaselineScoreForSiblings(Element topNode) + { + return 0; + } + /** + * fixme stub + * fixme element ID + * @param e + * @return + */ + String debugNode(Element e) + { + StringBuilder sb = new StringBuilder(); + sb.append("GravityScore: '"); + sb.append(e.attr("gravityScore")); + sb.append("' paraNodeCount: '"); + sb.append(e.attr("gravityNodes")); + sb.append("' nodeId: '"); + //sb.append(e.); + sb.append("' className: '"); + sb.append(e.attr("class")); + return sb.toString(); + } } From 52d3b0a7232c81e2d722363162889c7b75694e54 Mon Sep 17 00:00:00 2001 From: Yakov Bezrukov <y.bezrukov@cogia.de> Date: Mon, 3 Feb 2014 14:49:07 +0700 Subject: [PATCH 220/347] Added support classes --- .../java/com/gravity/goose/ArticleJava.java | 38 ++++++ .../extractors/ContentExtractorJava.java | 108 ++++++++++++++++-- .../com/gravity/goose/images/ImageJava.java | 26 +++++ 3 files changed, 165 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/gravity/goose/ArticleJava.java create mode 100644 src/main/java/com/gravity/goose/images/ImageJava.java diff --git a/src/main/java/com/gravity/goose/ArticleJava.java b/src/main/java/com/gravity/goose/ArticleJava.java new file mode 100644 index 000000000..da8a71f3f --- /dev/null +++ b/src/main/java/com/gravity/goose/ArticleJava.java @@ -0,0 +1,38 @@ +package com.gravity.goose; + +import com.gravity.goose.images.ImageJava; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Created with IntelliJ IDEA. + * User: jim + * Date: 03.02.14 + * Time: 14:39 + * To change this template use File | Settings | File Templates. + */ +public class ArticleJava +{ + String title = null; + String cleanedArticleText = ""; + String metaDescription = ""; + String metaKeywords = ""; + String canonicalLink = ""; + String domain = ""; + Element topNode = null; + ImageJava topImage = new ImageJava(); + Set<String> tags = null; + List<String> movies = null; + String finalUrl = ""; + String linkHash = ""; + String rawHtml = ""; + Document doc = null; + Document rawDoc = null; + Date publishDate = null; + Map<String, String > additionalData = null; +} diff --git a/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java b/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java index c28d0a4a9..eed1bf336 100644 --- a/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java +++ b/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java @@ -1,8 +1,12 @@ package com.gravity.goose.extractors; import com.gravity.goose.Article; +import com.gravity.goose.text.ReplaceSequence; +import com.gravity.goose.text.StringReplacement; +import com.gravity.goose.text.StringSplitter; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; import java.util.HashSet; import java.util.List; @@ -15,14 +19,90 @@ */ public class ContentExtractorJava { + private StringSplitter PIPE_SPLITTER = new StringSplitter("\\|"); + private StringSplitter ARROWS_SPLITTER = new StringSplitter("»"); + private StringSplitter DASH_SPLITTER = new StringSplitter(" - "); + private StringSplitter COLON_SPLITTER = new StringSplitter(":"); + private StringReplacement MOTLEY_REPLACEMENT = new StringReplacement.compile("�", ""); + private ReplaceSequence TITLE_REPLACEMENT = ReplaceSequence.create("»").append("»"); + + /** - * fixme stub + * fixme replace scala calls * @param article * @return */ String getTitle(Article article) { - return ""; + String title = ""; + Document doc = article.doc(); + try { + Elements titleElem = doc.getElementsByTag("title"); + if(titleElem == null || titleElem.isEmpty()) + { + return ""; + } + + String titleText = titleElem.first().text(); + + if(titleText == null || titleElem.isEmpty()) + { + return ""; + } + boolean usedDelimeter = false; + + if(titleText.contains("|")) + { + titleText = doTitleSplits(titleText, PIPE_SPLITTER); + usedDelimeter = true; + } + if(!usedDelimeter && titleText.contains("-")) + { + titleText = doTitleSplits(titleText, DASH_SPLITTER); + usedDelimeter = true; + } + if(!usedDelimeter && titleText.contains("»")) + { + titleText = doTitleSplits(titleText, ARROWS_SPLITTER); + usedDelimeter = true; + } + if(!usedDelimeter && titleText.contains(":")) + { + titleText = doTitleSplits(titleText, COLON_SPLITTER); + } + title = MOTLEY_REPLACEMENT.replaceAll(titleText); + } + catch(NullPointerException e) { + + } + return title; + } + + /** + * fixme replace scala calls + * @param title + * @param splitter + * @return + */ + + String doTitleSplits(String title, StringSplitter splitter) + { + int largestTextLen = 0; + int largeTextIndex = 0; + String[] titlePieces = splitter.split(title); + + int i = 0; + while(i < titlePieces.length) + { + String current = titlePieces[i]; + if(current.length() > largestTextLen) + { + largestTextLen = current.length(); + largeTextIndex = i; + } + i++; + } + return TITLE_REPLACEMENT.replaceAll(titlePieces[largeTextIndex].trim()); } /** @@ -34,29 +114,43 @@ String getTitle(Article article) String getMetaContent(Document doc, String metaName) { - return ""; + Elements meta = doc.select(metaName); + String content = null; + + if(meta.size() > 0) + { + content = meta.first().attr("content"); + } + if(content.isEmpty() || content == null) + { + return ""; + } + else + { + return content.trim(); + } } /** - * fixme stub + * fixme replace scala call * @param article * @return */ String getMetaDescription(Article article) { - return ""; + return getMetaContent(article.doc(), "meta[name=description]"); } /** - * fixme stub + * fixme replace scala call * @param article * @return */ String getMetaKeywords(Article article) { - return ""; + return getMetaContent(article.doc(), "meta[name=keywords]"); } /** diff --git a/src/main/java/com/gravity/goose/images/ImageJava.java b/src/main/java/com/gravity/goose/images/ImageJava.java new file mode 100644 index 000000000..93bc123a1 --- /dev/null +++ b/src/main/java/com/gravity/goose/images/ImageJava.java @@ -0,0 +1,26 @@ +package com.gravity.goose.images; + +import org.jsoup.nodes.Element; + +/** + * Created with IntelliJ IDEA. + * User: jim + * Date: 03.02.14 + * Time: 14:42 + * To change this template use File | Settings | File Templates. + */ +public class ImageJava +{ + Element topImageNode = null; + String imageSrc = ""; + double confidenceScore = 0.0; + int height = 0; + int width = 0; + String imageExtractionType = "NA"; + long bytes = 0; + + public String getImageSrc() + { + return imageSrc; + } +} From 47b3d457a66901a2f94527dfe679f0e73e4844ff Mon Sep 17 00:00:00 2001 From: Yakov Bezrukov <y.bezrukov@cogia.de> Date: Mon, 3 Feb 2014 19:20:13 +0700 Subject: [PATCH 221/347] Added support classes Main functions implemented --- .../java/com/gravity/goose/ArticleJava.java | 170 +++++++ .../extractors/ContentExtractorJava.java | 415 +++++++++++++++--- .../com/gravity/goose/images/ImageJava.java | 65 +++ .../com/gravity/goose/text/StringUtil.java | 24 + 4 files changed, 613 insertions(+), 61 deletions(-) create mode 100644 src/main/java/com/gravity/goose/text/StringUtil.java diff --git a/src/main/java/com/gravity/goose/ArticleJava.java b/src/main/java/com/gravity/goose/ArticleJava.java index da8a71f3f..d4eabb9e8 100644 --- a/src/main/java/com/gravity/goose/ArticleJava.java +++ b/src/main/java/com/gravity/goose/ArticleJava.java @@ -35,4 +35,174 @@ public class ArticleJava Document rawDoc = null; Date publishDate = null; Map<String, String > additionalData = null; + + public String getTitle() + { + return title; + } + + public void setTitle(String title) + { + this.title = title; + } + + public String getCleanedArticleText() + { + return cleanedArticleText; + } + + public void setCleanedArticleText(String cleanedArticleText) + { + this.cleanedArticleText = cleanedArticleText; + } + + public String getMetaDescription() + { + return metaDescription; + } + + public void setMetaDescription(String metaDescription) + { + this.metaDescription = metaDescription; + } + + public String getMetaKeywords() + { + return metaKeywords; + } + + public void setMetaKeywords(String metaKeywords) + { + this.metaKeywords = metaKeywords; + } + + public String getCanonicalLink() + { + return canonicalLink; + } + + public void setCanonicalLink(String canonicalLink) + { + this.canonicalLink = canonicalLink; + } + + public String getDomain() + { + return domain; + } + + public void setDomain(String domain) + { + this.domain = domain; + } + + public Element getTopNode() + { + return topNode; + } + + public void setTopNode(Element topNode) + { + this.topNode = topNode; + } + + public ImageJava getTopImage() + { + return topImage; + } + + public void setTopImage(ImageJava topImage) + { + this.topImage = topImage; + } + + public Set<String> getTags() + { + return tags; + } + + public void setTags(Set<String> tags) + { + this.tags = tags; + } + + public List<String> getMovies() + { + return movies; + } + + public void setMovies(List<String> movies) + { + this.movies = movies; + } + + public String getFinalUrl() + { + return finalUrl; + } + + public void setFinalUrl(String finalUrl) + { + this.finalUrl = finalUrl; + } + + public String getLinkHash() + { + return linkHash; + } + + public void setLinkHash(String linkHash) + { + this.linkHash = linkHash; + } + + public String getRawHtml() + { + return rawHtml; + } + + public void setRawHtml(String rawHtml) + { + this.rawHtml = rawHtml; + } + + public Document getDoc() + { + return doc; + } + + public void setDoc(Document doc) + { + this.doc = doc; + } + + public Document getRawDoc() + { + return rawDoc; + } + + public void setRawDoc(Document rawDoc) + { + this.rawDoc = rawDoc; + } + + public Date getPublishDate() + { + return publishDate; + } + + public void setPublishDate(Date publishDate) + { + this.publishDate = publishDate; + } + + public Map<String, String> getAdditionalData() + { + return additionalData; + } + + public void setAdditionalData(Map<String, String> additionalData) + { + this.additionalData = additionalData; + } } diff --git a/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java b/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java index eed1bf336..91581218c 100644 --- a/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java +++ b/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java @@ -1,15 +1,17 @@ package com.gravity.goose.extractors; -import com.gravity.goose.Article; -import com.gravity.goose.text.ReplaceSequence; -import com.gravity.goose.text.StringReplacement; -import com.gravity.goose.text.StringSplitter; +import com.gravity.goose.ArticleJava; +import com.gravity.goose.text.*; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; +import org.jsoup.select.Collector; import org.jsoup.select.Elements; +import org.jsoup.select.Selector; +import org.jsoup.select.TagsEvaluator; -import java.util.HashSet; -import java.util.List; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.*; /** * Created with IntelliJ IDEA. @@ -23,19 +25,27 @@ public class ContentExtractorJava private StringSplitter ARROWS_SPLITTER = new StringSplitter("»"); private StringSplitter DASH_SPLITTER = new StringSplitter(" - "); private StringSplitter COLON_SPLITTER = new StringSplitter(":"); + private StringSplitter SPACE_SPLITTER = new StringSplitter(" "); + private StringReplacement MOTLEY_REPLACEMENT = new StringReplacement.compile("�", ""); private ReplaceSequence TITLE_REPLACEMENT = ReplaceSequence.create("»").append("»"); + private Set<String> NO_STRINGS = new HashSet<>(); + private String A_REL_TAG_SELECTOR = "a[rel=tag], a[href*=/tag/]"; + private String logPrefix = "ContentExtractor: "; + + TagsEvaluator TOP_NODE_TAGS = new TagsEvaluator(new HashSet("p", "td", "pre")); /** + * Gets title string from article * fixme replace scala calls - * @param article - * @return + * @param article article to process + * @return title string */ - String getTitle(Article article) + String getTitle(ArticleJava article) { String title = ""; - Document doc = article.doc(); + Document doc = article.getDoc(); try { Elements titleElem = doc.getElementsByTag("title"); if(titleElem == null || titleElem.isEmpty()) @@ -53,36 +63,43 @@ String getTitle(Article article) if(titleText.contains("|")) { + // fixme titleText = doTitleSplits(titleText, PIPE_SPLITTER); usedDelimeter = true; } if(!usedDelimeter && titleText.contains("-")) { + // fixme titleText = doTitleSplits(titleText, DASH_SPLITTER); usedDelimeter = true; } if(!usedDelimeter && titleText.contains("»")) { + // fixme titleText = doTitleSplits(titleText, ARROWS_SPLITTER); usedDelimeter = true; } if(!usedDelimeter && titleText.contains(":")) { + // fixme titleText = doTitleSplits(titleText, COLON_SPLITTER); } + // fixme title = MOTLEY_REPLACEMENT.replaceAll(titleText); } catch(NullPointerException e) { - + // fixme } return title; } /** + * based on a delimeter in the title take the longest piece or do some custom logic based on the site * fixme replace scala calls - * @param title - * @param splitter - * @return + * + * @param title title string + * @param splitter desired splitter + * @return splitted title */ String doTitleSplits(String title, StringSplitter splitter) @@ -102,14 +119,15 @@ String doTitleSplits(String title, StringSplitter splitter) } i++; } + // fixme return TITLE_REPLACEMENT.replaceAll(titlePieces[largeTextIndex].trim()); } /** - * fixme stub - * @param doc - * @param metaName - * @return + * Returns metadata information from html document + * @param doc document to process + * @param metaName metatag name + * @return metadata info */ String getMetaContent(Document doc, String metaName) @@ -121,7 +139,7 @@ String getMetaContent(Document doc, String metaName) { content = meta.first().attr("content"); } - if(content.isEmpty() || content == null) + if(StringUtil.isNullOrEmpty(content)) { return ""; } @@ -132,77 +150,252 @@ String getMetaContent(Document doc, String metaName) } /** - * fixme replace scala call - * @param article - * @return + * if the article has meta description set in the source, use that + * @param article article to process + * @return resulting metadata */ - String getMetaDescription(Article article) + String getMetaDescription(ArticleJava article) { - return getMetaContent(article.doc(), "meta[name=description]"); + return getMetaContent(article.getDoc(), "meta[name=description]"); } /** - * fixme replace scala call - * @param article - * @return + * if the article has meta keywords set in the source, use that + * @param article article to process + * @return keywords */ - String getMetaKeywords(Article article) + String getMetaKeywords(ArticleJava article) { - return getMetaContent(article.doc(), "meta[name=keywords]"); + return getMetaContent(article.getDoc(), "meta[name=keywords]"); } /** - * fixme stub - * @param article - * @return + * if the article has meta canonical link set in the url + * fixme check logic against original code + * @param article article to process + * @return canonical link */ - String getCanonicalLink(Article article) + String getCanonicalLink(ArticleJava article) { + Elements meta = article.getDoc().select("link[rel=canonical]"); + if(meta.size() > 0) + { + // fixme check logic here + String href = meta.first().attr("href").trim(); + if(!href.isEmpty()) + { + return href; + } + else + { + article.getFinalUrl(); + } + } + else + { + article.getFinalUrl(); + } + return ""; } /** - * fixme stub - * @param url - * @return + * returns domain from the url string + * @param url url to process + * @return domain name */ String getDomain(String url) { - return ""; + String host = ""; + try + { + host = new URL(url).getHost(); + } + catch (MalformedURLException e) + { + e.printStackTrace(); //fixme to logger + } + return host; } /** - * fixme stub - * @param article - * @return + * excract possible tags from article + * fixme check logic against scala code + * @param article article to process + * @return set of tags */ - HashSet<String> extractTags(Article article) + Set<String> extractTags(ArticleJava article) { - return null; + Document node = article.getDoc(); + if (node.children().size() == 0) + { + return NO_STRINGS; + } + Elements elements = Selector.select(A_REL_TAG_SELECTOR, node); + if(elements.size() == 0) + { + return NO_STRINGS; + } + + HashSet<String> tags = new HashSet<>(); + for(Element el : elements) + { + String tag = el.text(); + if(StringUtil.isNullOrEmpty(tag)) + { + tags.add(tag); + } + } + return tags; } /** + * we're going to start looking for where the clusters of paragraphs are. We'll score a cluster based on the number of stopwords + * and the number of consecutive paragraphs together, which should form the cluster of text that this node is around + * also store on how high up the paragraphs are, comments are usually at the bottom and should get a lower score * todo return type should be changed - * @param article - * @return + * @param article article to process + * @return best score element */ - String calculateBestNodeBasedOnClustering(Article article) + Element calculateBestNodeBasedOnClustering(ArticleJava article) { - return ""; + // fixme change to logger + System.out.println(logPrefix + "Starting to calculate TopNode"); + Document doc = article.getDoc(); + Element topNode = null; + + Elements nodesToCheck = Collector.collect(TOP_NODE_TAGS, doc); + double startingBoost = 1.0; + int cnt = 0; + int i = 0; + HashSet<Element> parentNodes = new HashSet<>(); + ArrayList<Element> nodesWithText = new ArrayList<>(); + for(Element node : nodesToCheck) + { + String nodeText = node.text(); + //fixme remove scala code call + WordStats wordStats = StopWords.getStopWordCount(nodeText); + boolean highLinkDensity = isHighLinkDensity(node); + if(wordStats.getStopWordCount() > 2 && !highLinkDensity) + { + nodesWithText.add(node); + } + } + int numberOfNodes = nodesWithText.size(); + int negativeScoring = 0; + double bottomNodesForNegativeScore = numberOfNodes * 0.25; + // fixme change to logger + System.out.println(logPrefix + "About to inspect num of nodes with text: " + numberOfNodes); + for(Element node : nodesWithText) + { + float boostScore = 0; + if(isOkToBoost(node)) + { + if(cnt >= 0) + { + boostScore = (float)((1.0 / startingBoost) * 50); + startingBoost++; + } + } + if(numberOfNodes > 15) + { + if((numberOfNodes - i) <= bottomNodesForNegativeScore) + { + float booster = (float)bottomNodesForNegativeScore; + boostScore = -(float)Math.pow(booster, 2.0); + float netScore = Math.abs(boostScore) + negativeScoring; + if(negativeScoring > 40) + { + boostScore = 5; + } + } + } + + // fixme change to logger + System.out.println(logPrefix + "Location Boost Score: " + boostScore + " on interation: " + i + "' id='" + node.parent().id() + "' class='" + node.parent().attr("class")); + String nodeText = node.text(); + WordStats wordStats = StopWords.getStopWordCount(nodeText); + int upScore = (int)(wordStats.getStopWordCount() + boostScore); + updateScore(node.parent(), upScore); + updateScore(node.parent().parent(), upScore / 2); + updateNodeCount(node.parent(), 1); + updateNodeCount(node.parent().parent(), 1); + if(!parentNodes.contains(node.parent())) + { + parentNodes.add(node.parent()); + } + if(!parentNodes.contains(node.parent().parent())) + { + parentNodes.add(node.parent().parent()); + } + cnt++; + i++; + } + + int topNodeScore = 0; + for(Element e : parentNodes) + { + // fixme change to logger + System.out.println(logPrefix + "ParentNode: score='" + e.attr("gravityScore") + "' nodeCount='" + e.attr("gravityNodes") + "' id='" + e.id() + "' class='" + e.attr("class") + "' "); + int score = getScore(e); + if(score > topNodeScore) + { + topNode = e; + topNodeScore = score; + } + if(topNode == null) + { + topNode = e; + } + + } + + printTraceLog(topNode); + if(topNode == null) + { + return null; + } + else + { + return topNode; + } } /** - * fixme stub * @param topNode */ void printTraceLog (Element topNode) { + try + { + if(topNode != null) + { + // fixme change to logger + System.out.println(logPrefix + "Our TOPNODE: score='" + topNode.attr("gravityScore") + "' nodeCount='" + topNode.attr("gravityNodes") + "' id='" + topNode.id + "' class='" + topNode.attr("class") + "' "); + String text; + + if(topNode.text().trim().length() > 100) + { + text = topNode.text().trim().substring(0, 100) + "..."; + } + else + { + text = topNode.text().trim(); + } + // fixme change to logger + System.out.println(logPrefix + "Text - " + text); + } + } + catch (NullPointerException e) + { + e.printStackTrace(); // fixme change to logger + } } @@ -212,51 +405,141 @@ void printTraceLog (Element topNode) * @return */ - boolean isOkToBoost(Element node) + private boolean isOkToBoost(Element node) { - return true; + String para = "p"; + int stepsAway = 0; + int minimumStopWordCount = 5; + int maxStepsAwayFromNode = 3; + + for (Element currentNode: walkSiblings(node)) + { + if(currentNode.tagName() == para) + { + if(stepsAway >= maxStepsAwayFromNode) + { + // fixme change to logger + System.out.println(logPrefix + "Next paragraph is too far away, not boosting"); + return false; + } + String paraText = currentNode.text(); + // fixme replace scala code + WordStats wordStats = StopWords.getStopWordCount(paraText); + if(wordStats.getStopWordCount() > minimumStopWordCount) + { + System.out.println(logPrefix + "We're gonna boost this node, seems contenty"); + return true; + } + stepsAway++; + } + } + return false; } /** - * fixme stub + * + * @param e + * @param max + * @return + */ + + String getShortText(String e, int max) + { + if(e.length() > max) + { + return e.substring(0, max) + "..."; + } + else + { + return e; + } + } + + /** + * fixme remove scala code * @param e * @return */ private boolean isHighLinkDensity (Element e) { - return true; + Elements links = e.getElementsByTag("a"); + if(links.size() == 0) + { + return false; + } + String text = e.text().trim(); + String[] words = SPACE_SPLITTER.split(text); + float numberOfWords = words.length; + StringBuilder sb = new StringBuilder(); + for(Element link : links) + { + sb.append(link.text()); + } + String linkText = sb.toString(); + String[] linkWords = SPACE_SPLITTER.split(linkText); + float numberOfLinkWords = linkWords.length; + float numberOfLinks = links.size(); + float linkDivisor = numberOfLinkWords / numberOfWords; + float score = linkDivisor * numberOfLinks; + //fixme change to logger + System.out.println(logPrefix + "Calulated link density score as: " + score + " for node: " + getShortText(e.text, 50)); + if(score > 1) + { + return true; + } + return false; } /** - * fixme stub * @param node * @return */ private int getScore(Element node) { - return 0; + return getGravityScoreFromNode(node); } /** - * todo return type should be changed * @param node */ - void getGravityScoreFromNode(Element node) + int getGravityScoreFromNode(Element node) { - + String grvScoreString = node.attr("gravityScore"); + if(StringUtil.isNullOrEmpty(grvScoreString)) + { + return 0; + } + return Integer.parseInt(grvScoreString); } /** - * fixme stub * @param node * @param addToScore */ private void updateScore(Element node, int addToScore) { - + int currentScore = 0; + try + { + String scoreString = node.attr("gravityScore"); + if(StringUtil.isNullOrEmpty(scoreString)) + { + currentScore = 0; + } + else + { + currentScore = Integer.parseInt(scoreString); + } + } + catch (NumberFormatException e) + { + currentScore = 0; + } + int newScore = currentScore + addToScore; + node.attr("gravityScore", Integer.toString(newScore)); } /** @@ -309,13 +592,23 @@ void getSiblingContent(Element currentSibling, int baselineScoreForSiblingParagr } /** - * fixme return type - * fixme stub + * fixme check logic * @param node */ - void walkSiblings(Element node) + List<Element> walkSiblings(Element node) { + Element currentSibling = node.previousElementSibling(); + List<Element> b = new LinkedList<>(); + while(currentSibling != null) + { + // fixme check logic + b.add(currentSibling); + // fixme change to logger + System.out.println(logPrefix + "SIBLINGCHECK: " + debugNode(currentSibling)); + currentSibling = currentSibling != null ? currentSibling.previousElementSibling() : null; + } + return b; } /** diff --git a/src/main/java/com/gravity/goose/images/ImageJava.java b/src/main/java/com/gravity/goose/images/ImageJava.java index 93bc123a1..693f305d4 100644 --- a/src/main/java/com/gravity/goose/images/ImageJava.java +++ b/src/main/java/com/gravity/goose/images/ImageJava.java @@ -19,6 +19,71 @@ public class ImageJava String imageExtractionType = "NA"; long bytes = 0; + public Element getTopImageNode() + { + return topImageNode; + } + + public void setTopImageNode(Element topImageNode) + { + this.topImageNode = topImageNode; + } + + public void setImageSrc(String imageSrc) + { + this.imageSrc = imageSrc; + } + + public double getConfidenceScore() + { + return confidenceScore; + } + + public void setConfidenceScore(double confidenceScore) + { + this.confidenceScore = confidenceScore; + } + + public int getHeight() + { + return height; + } + + public void setHeight(int height) + { + this.height = height; + } + + public int getWidth() + { + return width; + } + + public void setWidth(int width) + { + this.width = width; + } + + public String getImageExtractionType() + { + return imageExtractionType; + } + + public void setImageExtractionType(String imageExtractionType) + { + this.imageExtractionType = imageExtractionType; + } + + public long getBytes() + { + return bytes; + } + + public void setBytes(long bytes) + { + this.bytes = bytes; + } + public String getImageSrc() { return imageSrc; diff --git a/src/main/java/com/gravity/goose/text/StringUtil.java b/src/main/java/com/gravity/goose/text/StringUtil.java new file mode 100644 index 000000000..352640b60 --- /dev/null +++ b/src/main/java/com/gravity/goose/text/StringUtil.java @@ -0,0 +1,24 @@ +package com.gravity.goose.text; + +/** + * Created with IntelliJ IDEA. + * User: jim + * Date: 03.02.14 + * Time: 18:35 + * To change this template use File | Settings | File Templates. + */ +public class StringUtil +{ + public static boolean isNullOrEmpty(String input) + { + if(input == null) + { + return true; + } + if(input.length() == 0) + { + return true; + } + return false; + } +} From a9e2b776e0e4e27b3da06491f329c8eb87815521 Mon Sep 17 00:00:00 2001 From: nebm51 <nebulam51@binarylife.ru> Date: Mon, 3 Feb 2014 23:53:37 +0700 Subject: [PATCH 222/347] Main functions implemented --- .../extractors/ContentExtractorJava.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java b/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java index 91581218c..02fde8aaf 100644 --- a/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java +++ b/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java @@ -469,6 +469,7 @@ private boolean isHighLinkDensity (Element e) return false; } String text = e.text().trim(); + // fixme String[] words = SPACE_SPLITTER.split(text); float numberOfWords = words.length; StringBuilder sb = new StringBuilder(); @@ -477,6 +478,7 @@ private boolean isHighLinkDensity (Element e) sb.append(link.text()); } String linkText = sb.toString(); + // fixme String[] linkWords = SPACE_SPLITTER.split(linkText); float numberOfLinkWords = linkWords.length; float numberOfLinks = links.size(); @@ -550,7 +552,25 @@ private void updateScore(Element node, int addToScore) private void updateNodeCount(Element node, int addToCount) { - + int currentScore = 0; + try + { + String countString = node.attr("gravityNodes"); + if(StringUtil.isNullOrEmpty(countString)) + { + currentScore = 0; + } + else + { + currentScore = Integer.parseInt(countString); + } + } + catch (NumberFormatException e) + { + currentScore = 0; + } + int newScore = currentScore + addToCount; + node.attr("gravityNodes", Integer.toString(newScore)); } /** From be3c478243c8a5dd1d8b83fc0093106b08636d2e Mon Sep 17 00:00:00 2001 From: nebm51 <nebulam51@binarylife.ru> Date: Fri, 7 Feb 2014 01:18:05 +0700 Subject: [PATCH 223/347] Added statistics functions --- .../extractors/ContentExtractorJava.java | 223 ++++++++++++++++-- .../com/gravity/goose/text/StopWordsJava.java | 51 ++++ .../com/gravity/goose/text/StringUtil.java | 1 + .../com/gravity/goose/text/WordStatsJava.java | 53 +++++ .../gravity/goose/utils/FileHelperJava.java | 20 ++ 5 files changed, 334 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/gravity/goose/text/StopWordsJava.java create mode 100644 src/main/java/com/gravity/goose/text/WordStatsJava.java create mode 100644 src/main/java/com/gravity/goose/utils/FileHelperJava.java diff --git a/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java b/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java index 02fde8aaf..dee70dd0d 100644 --- a/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java +++ b/src/main/java/com/gravity/goose/extractors/ContentExtractorJava.java @@ -2,6 +2,7 @@ import com.gravity.goose.ArticleJava; import com.gravity.goose.text.*; +import org.jsoup.nodes.Attribute; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Collector; @@ -12,6 +13,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.*; +import org.jsoup.nodes.Attributes; /** * Created with IntelliJ IDEA. @@ -279,7 +281,7 @@ Element calculateBestNodeBasedOnClustering(ArticleJava article) { String nodeText = node.text(); //fixme remove scala code call - WordStats wordStats = StopWords.getStopWordCount(nodeText); + WordStatsJava wordStats = StopWordsJava.getStopWordCount(nodeText); boolean highLinkDensity = isHighLinkDensity(node); if(wordStats.getStopWordCount() > 2 && !highLinkDensity) { @@ -319,7 +321,7 @@ Element calculateBestNodeBasedOnClustering(ArticleJava article) // fixme change to logger System.out.println(logPrefix + "Location Boost Score: " + boostScore + " on interation: " + i + "' id='" + node.parent().id() + "' class='" + node.parent().attr("class")); String nodeText = node.text(); - WordStats wordStats = StopWords.getStopWordCount(nodeText); + WordStatsJava wordStats = StopWordsJava.getStopWordCount(nodeText); int upScore = (int)(wordStats.getStopWordCount() + boostScore); updateScore(node.parent(), upScore); updateScore(node.parent().parent(), upScore / 2); @@ -424,7 +426,7 @@ private boolean isOkToBoost(Element node) } String paraText = currentNode.text(); // fixme replace scala code - WordStats wordStats = StopWords.getStopWordCount(paraText); + WordStatsJava wordStats = StopWordsJava.getStopWordCount(paraText); if(wordStats.getStopWordCount() > minimumStopWordCount) { System.out.println(logPrefix + "We're gonna boost this node, seems contenty"); @@ -574,41 +576,198 @@ private void updateNodeCount(Element node, int addToCount) } /** - * fixme stub + * pulls out videos we like * @param node * @return */ List<Element> extractVideos(Element node) { - return null; + ArrayList<Element> candidates = new ArrayList<>(); + ArrayList<Element> goodMovies = new ArrayList<>(); + + String youtubeStr = "youtube"; + String vimeoStr = "vimeo"; + + try + { + for(Element item: node.parent().getAllElements("embed")) + { + candidates.add(item); + } + + for(Element item : node.parent().getAllElements("object")) + { + candidates.add(item); + } + + // fixme change to logger + + System.out.println(logPrefix + "extractVideos: Starting to extract videos. Found: " + candidates.size()); + + for(Element el : candidates) + { + Attributes attrs = el.attributes(); + for(Attribute a : attrs) + { + try + { + if(a.getValue().contains(youtubeStr) || a.getValue().contains(vimeoStr)) + { + // fixme change to logger + System.out.println(logPrefix + "This page has a video!: " + a.getValue()); + goodMovies.add(el); + } + } + catch (Exception e) + { + // fixme change to logger + System.out.println(logPrefix + "Error extracting movies: " + e.toString()); + + } + } + } + } + catch(NullPointerException e) + { + // fixme change to logger + System.out.println(e.toString()); + } + catch (Exception e) + { + // fixme change to logger + System.out.println(e.toString()); + } + return goodMovies; } /** - * fixme stub * @param e * @return */ boolean isTableTagAndNoParagraphsExist(Element e) { - return true; + Elements subParagraphs = e.getElementsByTag("p"); + for(Element p : subParagraphs) + { + if(p.text().length() < 25) + { + p.remove(); + } + } + + Elements subParagraphs2 = e.getElementsByTag("p"); + if(subParagraphs2.size() == 0 && !(e.tagName() == "td")) + { + // fixme change to logger + System.out.println("Removing node because it doesn't have any paragraphs"); + return true; + } + else + { + return false; + } } + /** + * remove any divs that looks like non-content, clusters of links, or paras with no gusto + * @param targetNode + * @return + */ + Element postExtractionCleanup(Element targetNode) { - return null; + // fixme change to logger + System.out.println(logPrefix + "Starting cleanup Node"); + + Element node = addSiblings(targetNode); + for(Element e : node.children()) + { + if(e.tagName() != "p") + { + // fixme change to logger + System.out.println(logPrefix + "CLEANUP NODE: " + e.id() + " class: " + e.attr("class")); + if(isHighLinkDensity(e) || isTableTagAndNoParagraphsExist(e) ||!isNodeScoreThreshholdMet(node, e)) + { + try + { + e.remove(); + } + catch (IllegalArgumentException ex) + { + // fixme change to logger + System.out.println("Cannot remove node: " + ex.toString()); + } + } + } + } + + return node; + } + + boolean isNodeScoreThreshholdMet(Element node, Element e) + { + int topNodeScore = getScore(node); + int currentNodeScore = getScore(e); + float thresholdScore = (float)(topNodeScore * 0.08); + // fixme change to logger + System.out.println(logPrefix + "topNodeScore: " + topNodeScore + " currentNodeScore: " + currentNodeScore + " threshold: " + thresholdScore); + if((currentNodeScore < thresholdScore) && e.tagName() != "td") + { + // fixme change to logger + System.out.println(logPrefix + "Removing node due to low threshold score"); + return false; + } + else + { + // fixme change to logger + System.out.println(logPrefix + "Not removing TD node"); + return true; + } } /** - * fixme return type - * fixme stub + * adds any siblings that may have a decent score to this node + * fixme check logic against scala + * fixme replace scala calls * @param currentSibling * @param baselineScoreForSiblingParagraphs */ - void getSiblingContent(Element currentSibling, int baselineScoreForSiblingParagraphs) + String getSiblingContent(Element currentSibling, int baselineScoreForSiblingParagraphs) { - + if(currentSibling.tagName() == "p" && currentSibling.text().length() > 0) + { + return currentSibling.outerHtml(); + } + else + { + Elements potentialParagraphs = currentSibling.getElementsByTag("p"); + String paragraph = ""; + if(potentialParagraphs.first() == null) + { + return ""; + } + else + { + // fixme check here + for(Element firstParagraph : potentialParagraphs) + { + if(firstParagraph.text().length() > 0) + { + // fixme replace here + WordStatsJava wordStats = StopWordsJava.getStopWordCount(firstParagraph.text()); + int paragraphScore = wordStats.getStopWordCount(); + double siblingBaseLineScore = 0.30; + if((baselineScoreForSiblingParagraphs * siblingBaseLineScore) < paragraphScore) + { + paragraph += "<p>" + firstParagraph + "<p>"; + } + } + } + } + return paragraph; + } } /** @@ -633,16 +792,32 @@ List<Element> walkSiblings(Element node) /** * fixme stub + * fixme check logic against scala * @param topNode * @return */ private Element addSiblings(Element topNode) { - return null; + // fixme change to logger + System.out.println(logPrefix + "Starting to add siblings"); + int baselineScoreForSiblingParagraphs = getBaselineScoreForSiblings(topNode); + + ArrayList<String> results = new ArrayList<>(); + for (Element currentNode: walkSiblings(topNode)) + { + results.add(getSiblingContent(currentNode, baselineScoreForSiblingParagraphs)); + } + Collections.reverse(results); + return topNode.child(0).before(results.toString()); + } /** + * we could have long articles that have tons of paragraphs so if we tried to calculate the base score against + * the total text score of those paragraphs it would be unfair. So we need to normalize the score based on the average scoring + * of the paragraphs within the top node. For example if our total score of 10 paragraphs was 1000 but each had an average value of + * 100 then 100 should be our base. * fixme stub * @param topNode * @return @@ -650,6 +825,26 @@ private Element addSiblings(Element topNode) private int getBaselineScoreForSiblings(Element topNode) { + int base = 100000; + int numberOfParagraphs = 0; + int scoreOfParagraphs = 0; + + Elements nodesToCheck = topNode.getElementsByTag("p"); + for(Element node : nodesToCheck) + { + String nodeText = node.text(); + WordStatsJava wordStats = StopWordsJava.getStopWordCount(nodeText); + boolean highLinkDensity = isHighLinkDensity(node); + if(wordStats.getStopWordCount() > 2 && !highLinkDensity) + { + numberOfParagraphs++; + scoreOfParagraphs += wordStats.getStopWordCount(); + } + } + if (numberOfParagraphs > 0) + { + base = scoreOfParagraphs / numberOfParagraphs; + } return 0; } @@ -667,7 +862,7 @@ String debugNode(Element e) sb.append("' paraNodeCount: '"); sb.append(e.attr("gravityNodes")); sb.append("' nodeId: '"); - //sb.append(e.); + sb.append(e.id()); sb.append("' className: '"); sb.append(e.attr("class")); return sb.toString(); diff --git a/src/main/java/com/gravity/goose/text/StopWordsJava.java b/src/main/java/com/gravity/goose/text/StopWordsJava.java new file mode 100644 index 000000000..ad5252d6f --- /dev/null +++ b/src/main/java/com/gravity/goose/text/StopWordsJava.java @@ -0,0 +1,51 @@ +package com.gravity.goose.text; + +import com.gravity.goose.utils.FileHelper; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created with IntelliJ IDEA. + * User: jim + * Date: 04.02.14 + * Time: 13:21 + * To change this template use File | Settings | File Templates. + */ +public class StopWordsJava +{ + // fixme replace scala calls + private StringReplacement PUNCTUATION = StringReplacement.compile("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\p{Pc}\\s]", ""); + String STOP_WORDS = FileHelper.loadResourceFile("stopwords-en.txt", StopWords.class()).split(sys.props("line.separator")); + + // fixme replace scala calls + String removePunctuation(String str) + { + return PUNCTUATION.replaceAll(str); + } + + // fixme replace scala calls + public static WordStatsJava getStopWordCount(String content) + { + if(StringUtil.isNullOrEmpty(content)) + { + return WordStatsJava.EMPTY(); + } + WordStatsJava ws = new WordStatsJava(); + String strippedInput = removePunctuation(content); + String[] candidateWords = StringUtil.SPACE_SPLITTER.split(strippedInput); + List<String> overlappingStopWords = new ArrayList<String>(); + for(String w : candidateWords) + { + if(STOP_WORDS.contains(w.toLowerCase())) + { + overlappingStopWords.add(w.toLowerCase()); + } + } + ws.setWordCount(candidateWords.length); + ws.setStopWordCount(overlappingStopWords.size()); + ws.setStopWords(overlappingStopWords); + return ws; + } + +} diff --git a/src/main/java/com/gravity/goose/text/StringUtil.java b/src/main/java/com/gravity/goose/text/StringUtil.java index 352640b60..958d61d5d 100644 --- a/src/main/java/com/gravity/goose/text/StringUtil.java +++ b/src/main/java/com/gravity/goose/text/StringUtil.java @@ -9,6 +9,7 @@ */ public class StringUtil { + static StringSplitter SPACE_SPLITTER = new StringSplitter(" "); public static boolean isNullOrEmpty(String input) { if(input == null) diff --git a/src/main/java/com/gravity/goose/text/WordStatsJava.java b/src/main/java/com/gravity/goose/text/WordStatsJava.java new file mode 100644 index 000000000..fe8d94e8f --- /dev/null +++ b/src/main/java/com/gravity/goose/text/WordStatsJava.java @@ -0,0 +1,53 @@ +package com.gravity.goose.text; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created with IntelliJ IDEA. + * User: jim + * Date: 04.02.14 + * Time: 13:18 + * To change this template use File | Settings | File Templates. + */ +public class WordStatsJava +{ + int stopWordCount = 0; + int wordCount = 0; + + public static WordStatsJava EMPTY() + { + return new WordStatsJava(); + } + List<String> stopWords = new ArrayList<>(); + + public int getStopWordCount() + { + return stopWordCount; + } + + public void setStopWordCount(int stopWordCount) + { + this.stopWordCount = stopWordCount; + } + + public int getWordCount() + { + return wordCount; + } + + public void setWordCount(int wordCount) + { + this.wordCount = wordCount; + } + + public List<String> getStopWords() + { + return stopWords; + } + + public void setStopWords(List<String> stopWords) + { + this.stopWords = stopWords; + } +} diff --git a/src/main/java/com/gravity/goose/utils/FileHelperJava.java b/src/main/java/com/gravity/goose/utils/FileHelperJava.java new file mode 100644 index 000000000..d5e88a7a1 --- /dev/null +++ b/src/main/java/com/gravity/goose/utils/FileHelperJava.java @@ -0,0 +1,20 @@ +package com.gravity.goose.utils; + +import java.io.InputStream; + +/** + * Created with IntelliJ IDEA. + * User: jim + * Date: 04.02.14 + * Time: 13:32 + * To change this template use File | Settings | File Templates. + */ +public class FileHelperJava +{ + String loadResourceFile(String fileName, cls) + { + String fileData = ""; + InputStream is = cls.get + + } +} From ad729def439d7ddb6dd6e36f6702fdde9342fc6e Mon Sep 17 00:00:00 2001 From: Andrea Scarpino <me@andreascarpino.it> Date: Fri, 21 Feb 2014 13:10:00 +0100 Subject: [PATCH 224/347] Do not use absolute path for ImageMagick tools I guess the default configuration should not use absolute path to convert and identify. People can overwrite that by using setImagemagickConvertPath/setImagemagickIdentifyPath methods. --- src/main/scala/com/gravity/goose/Configuration.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index 20ce4653a..ef8a30a98 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -55,12 +55,12 @@ class Configuration { * path to your imagemagick convert executable, on the mac using mac ports this is the default listed */ @BeanProperty - var imagemagickConvertPath: String = "/opt/local/bin/convert" + var imagemagickConvertPath: String = "convert" /** * path to your imagemagick identify executable */ @BeanProperty - var imagemagickIdentifyPath: String = "/opt/local/bin/identify" + var imagemagickIdentifyPath: String = "identify" @BeanProperty var connectionTimeout: Int = 10000 @@ -124,4 +124,4 @@ class Configuration { def getHtmlFetcher: AbstractHtmlFetcher = htmlFetcher -} \ No newline at end of file +} From 7037baf0a17965475ec491797a3c7ba739fa4924 Mon Sep 17 00:00:00 2001 From: fabiofumarola <fabiofumarola@gmail.com> Date: Tue, 11 Mar 2014 17:17:45 +0100 Subject: [PATCH 225/347] Escalate exception in Image extraction In the method crawl, when there is an exception during the extraction of the main image, it is probably better to throw the original exception outside. Basing on this approach it is possible to wrap the exception in a Try block and then handle it outside the library. --- src/main/scala/com/gravity/goose/Crawler.scala | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index 4f3b32344..2dbce1a1d 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -88,7 +88,8 @@ class Crawler(config: Configuration) { } } catch { case e: Exception => { - warn(e, e.toString) + warn(e, e.getMessage) + throw e } } } @@ -174,4 +175,4 @@ class Crawler(config: Configuration) { object Crawler extends Logging { val logPrefix = "crawler: " -} \ No newline at end of file +} From ac33778e08003be660ab54155f9c8508ddab24ee Mon Sep 17 00:00:00 2001 From: jasongoodwin <jay.michael.goodwin@gmail.com> Date: Thu, 13 Mar 2014 12:36:46 -0400 Subject: [PATCH 226/347] Migrate project on to sbt. Remove maven files. Upgrade to scala 2.10. --- .gitignore | 2 + README.md | 19 ++- build.sbt | 18 ++ pom.xml | 154 ------------------ .../scala/com/gravity/goose/GooseTest.scala | 2 - 5 files changed, 37 insertions(+), 158 deletions(-) create mode 100644 build.sbt delete mode 100644 pom.xml diff --git a/.gitignore b/.gitignore index 615c5c5c9..94031e024 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ target/ /goose.iml /goose.ipr /goose.iws +.idea/ +.idea_modules/ diff --git a/README.md b/README.md index 47af399be..2b1aaee18 100644 --- a/README.md +++ b/README.md @@ -35,13 +35,28 @@ If you find Goose useful or have issues please drop me a line, I'd love to hear Goose is licensed by Gravity.com under the Apache 2.0 license, see the LICENSE file for more details +##Environment Prerequisites + +You will need to have ImageMagick installed for Goose to work correctly. + +On osx, you can install with brew: + $ brew install imagemagick + +Update Configuration.scala with the location of identify and convert (eg /usr/local/bin) + ##Take it for a spin To use goose from the command line: cd into the goose directory - mvn compile - MAVEN_OPTS="-Xms256m -Xmx2000m"; mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="http://techcrunch.com/2011/05/13/native-apps-or-web-apps-particle-code-wants-you-to-do-both/" -e -q > ~/Desktop/gooseresult.txt + sbt "run-main com.gravity.goose.TalkToMeGoose http://techcrunch.com/2011/05/13/native-apps-or-web-apps-particle-code-wants-you-to-do-both/" + +##Testing + +To run the junit tests, kick off the sbt test target: + + sbt test +Note that there are currently problems in the tests. ##Regarding the port from JAVA to Scala diff --git a/build.sbt b/build.sbt new file mode 100644 index 000000000..1bcdb2b81 --- /dev/null +++ b/build.sbt @@ -0,0 +1,18 @@ +name := "goose" + +version := "2.2.0-SNAPSHOT" + +scalaVersion := "2.10.2" + +libraryDependencies ++= Seq( + "org.slf4j" % "slf4j-api" % "1.7.6", + "org.slf4j" % "slf4j-log4j12" % "1.7.6", + //"org.clapper" % "grizzled-slf4j_2.10" % "1.0.1" + "org.jsoup" % "jsoup" % "1.5.2", + "org.apache.httpcomponents" % "httpclient" % "4.1.2", + "commons-io" % "commons-io" % "2.0.1", + "commons-lang" % "commons-lang" % "2.6", + "org.scalatest" %% "scalatest" % "2.1.0" % "test", + "junit" % "junit" % "4.8.1" % "test", + "com.novocode" % "junit-interface" % "0.10" % "test" +) diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 9fef84cba..000000000 --- a/pom.xml +++ /dev/null @@ -1,154 +0,0 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - - <groupId>com.gravity</groupId> - <artifactId>goose</artifactId> - <version>2.1.22</version> - <packaging>jar</packaging> - <name>goose</name> - <url>http://maven.apache.org</url> - <properties> - <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - </properties> - - <dependencies> - <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - <version>4.8.1</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - <version>1.6.1</version> - <type>jar</type> - <scope>compile</scope> - </dependency> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-log4j12</artifactId> - <version>1.6.1</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.jsoup</groupId> - <artifactId>jsoup</artifactId> - <version>1.5.2</version> - </dependency> - <dependency> - <groupId>commons-io</groupId> - <artifactId>commons-io</artifactId> - <version>2.0.1</version> - </dependency> - - <dependency> - <groupId>org.scala-lang</groupId> - <artifactId>scala-compiler</artifactId> - <version>2.9.0-1</version> - <scope>compile</scope> - </dependency> - - <dependency> - <groupId>org.scala-lang</groupId> - <artifactId>scala-library</artifactId> - <version>2.9.0-1</version> - </dependency> - - <dependency> - <groupId>org.apache.httpcomponents</groupId> - <artifactId>httpclient</artifactId> - <version>4.1.2</version> - </dependency> - <dependency> - <groupId>commons-lang</groupId> - <artifactId>commons-lang</artifactId> - <version>2.6</version> - </dependency> - </dependencies> - - <!-- - Hey... since we're open source, let's compile the source and javadocs into jars as well - --> - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <version>2.6</version> - <configuration> - <useFile>false</useFile> - <disableXmlReport>true</disableXmlReport> - <includes> - <include>**/*Test.*</include> - </includes> - <excludes> - <exclude>**/*IT.*</exclude> - </excludes> - </configuration> - </plugin> - <plugin> - <groupId>org.scala-tools</groupId> - <artifactId>maven-scala-plugin</artifactId> - <version>2.14.3</version> - <configuration> - <charset>UTF-8</charset> - <jvmArgs> - <jvmArg>-Xmx1024m</jvmArg> - </jvmArgs> - </configuration> - <executions> - <execution> - <id>compile</id> - <goals> - <goal>compile</goal> - </goals> - <phase>compile</phase> - </execution> - <execution> - <id>test-compile</id> - <goals> - <goal>testCompile</goal> - </goals> - <phase>test-compile</phase> - </execution> - <execution> - <phase>process-resources</phase> - <goals> - <goal>compile</goal> - </goals> - </execution> - - </executions> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-source-plugin</artifactId> - <version>2.1.2</version> - <executions> - <execution> - <id>attach-sources</id> - <goals> - <goal>jar</goal> - </goals> - </execution> - </executions> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-javadoc-plugin</artifactId> - <version>2.8</version> - <executions> - <execution> - <id>attach-javadocs</id> - <goals> - <goal>jar</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - -</project> \ No newline at end of file diff --git a/src/test/scala/com/gravity/goose/GooseTest.scala b/src/test/scala/com/gravity/goose/GooseTest.scala index 7235a34ef..42f0a3807 100644 --- a/src/test/scala/com/gravity/goose/GooseTest.scala +++ b/src/test/scala/com/gravity/goose/GooseTest.scala @@ -2,8 +2,6 @@ package com.gravity.goose import org.junit.Test import org.junit.Assert._ -import scala.actors.Future -import scala.actors.Futures._ /** * Created by Jim Plush From 79d21934a01238c491503346cd169576459293eb Mon Sep 17 00:00:00 2001 From: darthbear <francois.dangngoc@gmail.com> Date: Sun, 16 Mar 2014 00:58:11 -0400 Subject: [PATCH 227/347] updated to use scala 2.10.3 --- pom.xml | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 9fef84cba..f33bb8fe5 100644 --- a/pom.xml +++ b/pom.xml @@ -3,13 +3,15 @@ <modelVersion>4.0.0</modelVersion> <groupId>com.gravity</groupId> - <artifactId>goose</artifactId> + <artifactId>goose_2.10</artifactId> <version>2.1.22</version> <packaging>jar</packaging> <name>goose</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <scala.major>2.10</scala.major> + <scala.version>${scala.major}.3</scala.version> </properties> <dependencies> @@ -46,14 +48,23 @@ <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-compiler</artifactId> - <version>2.9.0-1</version> + <version>${scala.version}</version> <scope>compile</scope> </dependency> + <dependency> + <groupId>org.scala-lang</groupId> + <artifactId>scala-actors</artifactId> + <version>${scala.version}</version> + <scope>compile</scope> + </dependency> + + + <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> - <version>2.9.0-1</version> + <version>${scala.version}</version> </dependency> <dependency> @@ -151,4 +162,4 @@ </plugins> </build> -</project> \ No newline at end of file +</project> From 2502b898443478abb90692927d110e60af9df3a2 Mon Sep 17 00:00:00 2001 From: CharlesGuillot <charles.guillot@gmail.com> Date: Wed, 19 Mar 2014 13:22:32 +0100 Subject: [PATCH 228/347] Remove PSD --- misc/PSD/graphics.psd | Bin 1474376 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 misc/PSD/graphics.psd diff --git a/misc/PSD/graphics.psd b/misc/PSD/graphics.psd deleted file mode 100644 index fc061d893424f1905509c4076634c3b8d6261a61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1474376 zcmeEP2SAfY`@gV3z`a-8)&dC|+=!r5Q54+T8j=8!kYEx7w2IbNzgDZQZQZl(QLT0F z)oN|s3l$kImf}P<dH>Jdn>T}@(69Zzul--(UAOPK=kA`n``vRs{X#+!53xUUgn0P~ znSY9G5WM5x%#VHg1qEAlA|Lh0-RMT_I${Igr9Jy3#EQhxQVl;`8YxrsYXAJmiS~S% zq*wb<p25Q4Sbu4hY~WOtG<52aF!9uAv9F|kpWb#o6S^nF#KuT9B7Q=QT%qos(5t;j zq70XIhj(l&XwN53G||1<`(X?I=-?2(zfvXTd$_ndi-qo9d=D=dH*YU*H=z?hSgGI# zO2hfCzI->K(3|h(*4@>;yN5ep_iNwV4&HjIBoW<*_Yc&?317Y1M`<*%-35a9_;{Ci zcNe89QsC<A>njkt3EbSA!G*IrQK1nfI4jg0*g&{&`b*Vfl`K{xgQ#)1qHtxLrdRv+ zI3oRz&74H6k0&-xB`2{+!~&^Y8Y5L`)B;x*SAjlo@Y_=&?jE63#fUV$MX|ARnOKBl z5lm4?TnLd|VxyEAr8-I(+f!h0s*AX%0H?+%btLOJ)C%VBN_B!LR-bHzS{Jie86yA- zNV3p0$za&sUnLc3l&UbLQr?>_v=A<#eE(2)ey~U^Q{aU6#9^2?H&Cso-b&hEq>=V^ z6S@kWUEQ2reZz36x^;IGItzWe3x!63ur4cv5v-KRA`(r)a1(~Px^{PW>n?OR4#UW0 z#V~*sB_fTeMxhwH{R;{sIQZ?w5ff9XM1q66_g9MJFqZ}O?;RH>lXUlV_i^?0^6>Hq z5cUrcy1M!a{oMmR`@6Zjd3n0Kda+bB^=C>GunSVCH6n#rst?nzW?>rn`?Kkzkwq9P zvkA9io678pO}h_O$$&DXa`krYDX3&-lyPD=dbm`rl*i%9*c+N1_z7I`UFX%<x}w)H zZ})0!UD2z-=Lm&N)7woKTLt5azJ@@yrbzqCBBg5Z<LTw(=IITW4_v-ZZeDIqZr&bn zftinolc&27E?0O5b02pnH(xI&ccH73yQ>dezD}NQaJjpI8HD34gbUny<8M!}hs)i= z-K|GJK%lRmTcB^CPd``J{yx6mz5#)5?g6g8Zh>C@{k=VP2{%cZF4=!tqa{s{Rl^6^ zrZOL3)9xX%1gU&<e;L#hH7;9UT%=Xn7*W|^KgQtG)6}PtO+}ynO1V-M3SFlZvmOb| z$f%-g6Pmeu`FMFac?f;Igyat8<n8Ll-ra}^dv^zOPgmBBhZFYYP3};pP+njHcQEnr z@f4CflqbAHX~G@K-`gFy1K+_t+<o!g2VBA($K?*Zg6}vMci<s>2fuJ9eu0BLTs^=R z-yyYdXHC4xyAQtmLOS72-1vIJySE!Q_Xci*JMg53t1pC!@7S-e5BBTpgWdT0U^l+L z#Eq{jdB>solF)p8ag4qsOkbQ5=tR7nfN!0E*PXnayq$cUe4T(auC7k5ZceW5POctK zz{lXo)!PY}9%KqPs0vUMpptk(eF1idngI;o!(HeubPM$J4D=2Z3O!uieEJ1=diD44 zaO)rF8t4_+Pgj^GCH7}?xxW9ex<}AkSLS!URd>Q|(DO-qyZ01SWo*QQ2J0Yy{}7cj zLME5?Ru3Q0j~^7^?*;vdm$RD-uyK{{stjkKObwDkqChX4R4KKv%>qblATbK`A|vNV zFJ=8DFNS3QCBd_S(nxAWTuLrVu3Ax`R*ormQF7Ia0=05Xxr>skRurg}W6E8WT(zP= ztsGPCqU5R-1#0D(au+36tte0{$CSG$xoSm$S~;fNMafkw3e?Im<t|FDT2Y`@jwyFh za@C3gwQ@|ki;}BW6sVPB%3YLPwW2_+98>P1<f;_~YUP-67bRD%C{QcMl)EUoYDIxs zIi}o2$yF-~)XFjCE=sOiQJ_|iDR)tF)rtbOa!k34lB-q}sFmZla+jT96Q)!FJ1^s5 zizVKpX`YMsXg1@6b&Q-pMXJKPTY9yJy?gEXQiT}y$0;IvwI2}{=<Gu_Wwz@-)IV%Y zNB|%99I7?^kP-a`2l?~cI|~GUunkcv5cCi0&kq?K6dK0I`~L(1L)!C=H&Eiuic%N6 zMGzdS1+Y;dR;tn@4u-&-!GnuLBY|y>J=xGrk^`m^nOM`?&bDW?G_f}X;lc(MtAZVa zE+L{wX&~7U=@Jq=P^pqlRl>e4Ic$OIDZuW*o6dXH{xveZL)Ash?oZ_W*!EOwAoxh5 z=q4${S+_j}Iy*btw+1QGNMrm|Dp8^#P!axwB!NdRQPqU;?rh;eAklKzZU%cH@Cy$2 ztto=7c^YY;TokEK5x55;N+YGJ-mtHUdnE}Ja4GC5;F1knN^4pYM*HWu$n;sRvK;>o z<xoYYFvU5t!7dl>^?#`-Ld7CEu<}2r7%F5)UlD-*|8w<VB(!p{N&BDG9#xSkeIfi$ zwnkinD{#)=zeTDhWBStgAE^@RxbQHxpN$nkzyFa;5uyBu>rJcbr9*;4Li&ebxBjpV zafm2J$~9j`J!ftDk(zesZ|y%T_vp4gxxNvToa-_1JI>Wxa)F)b#E8LCjYg_6mMS>^ z6=fY=A6Zp5Zs>(7^y9YrP8(v>_vA*Vx|D{=l#wDr@xL#%tI2~Atra3?`Tqd9D;BJY zwC5+86sOimCD?GdRIK?sa{eF7ATB7Q`UGE`JXMjY-)_Z<#qJ))@&NcC#-83@CdNi} z;y+*QYDgw%2LIuVP%(#<Ie`?Ov#XCu;pxh>8e?zosyV>d)cAjl1Ar7k&^^Lv_HW%9 zS7z<EW$f?JL>tmSLLvG`w$U}pVdbj%|E`g)noeN)&uOJ=mc`1v@c*uvj*XT4bDQew zGH29Wj|k=eFAQKRb~n1Al3z#=43Y8Nwn2*44ZDOw7dH?qYc`jwNsKibf$IEJjFa@& zxbJ4ix<+B^$6#+8vQ|zjH$tqK)VGCVoKntz<%Du`<`q-QB^31a;CcSuc4Vy}53d!V zdT1crdGM!u5?zm-iJc?4lUtve2oW0x@@WD01oGWn|J{a!`kH*(k~`dZtS>wA4f-ds zn=Y(=NjtqhN*?j~hPWAs1Q8KnBZs?{&KGO4ZrO6Zi5m%eEZjLap2Wo2U_!zyf^URk z5n`(RnP+3`Dy^7*#}3DhNd!ML<Uqd6$X6?JujWSF35lg6&*VpJaNcl!u@+B9Vq!x~ zFg3x<tS@`%%E=2%5!wQm&K`d%;^cC85Pu_8YK2^>h=gyV7gVYcg@=P8N9@j45f{@> z3K}V;MlNi?&@TceHH^$qXsp;c6uTIiVkqc1lW7ult}uVt#fTD2O>z05esV>y&XqOE zk2^Ls!-T7xX2L-g(rg={f;ps6jWl*>_#`oSBN@?W6O$b0M5@9{Ds?e60>e5IsX_@U zH5i+X#%@V)!(lZ=qKpgg+Z&A7pM?fA#nn6t?5Ub4Y$S1z7-+a^99q-Z>O-@OSE{0e z6k&f>>gwR|hQ?`X72w+vhz9#BG&;g#s??2?E5k+dFcm0}#fyX^<%8AO9DcS@B6YA5 zlZG%M;Rg?56A1Up{6Okc1%7Cxj*?1A>S1X_I+UntRdaEW5ZjOtN!29ZE%3Kl0o-t% zs2mH{j%yPxQj^Kbuz=BF@NJ1kAT^RA6}&@z1TC-%iQ2S0hl@3?U`OH!Q^xX*NPq@Q zBaBIc`e~FgtUcDri_q}MD4jj%=Y{aqpbl2b<$`Atk0r4KM-AYzCLclljpDM7R4L<P zO^mEyEfuu(N}*bSANzn%96GFkff;-|h~hNL0a697F;WQ_pfKnnb&l;=$Jhkh1jR)1 z;qh1J-yHPk>IiRCyG>1k)sa#Y6DyHi6DEo@F>@44<?=9Tf+k2kFf4d5<}w_h4QFiP z*fvV3n(8N)MRJs?%Vr*yqFH0`X)TdPh~nfLc(t7Z3qn;m#}oO)*wlHQ@JOPJ&xpA7 z+3@=f&|82PG(@Suw6@hKW1(8ArN)e7CkIBVWNII-)Br<OGOq(g996+NsR3PaJjfm{ zUY{4_o$ayf661kjHE^&@p)`ZK5u?zkunNG@W5)8WFG0^{3%wEWxk#*z4Gs;&bpwHV zKt9$J$c9AjK;?p4Y}0(*d0+^iZ)8`K*ZSgE6%d&h0*>7!poAITam|p&YhtlEPIaU3 zX#7t4jz%g-AiOuj=8^2X6LG`7_r>p$7zOaR8BTMoBu0YYe}?yeO^L&NZ$22_=S-1F z<Kg`Vymyqx#mL|t%M*=aq#|gwEHKSFYNX;Qco)LEy((<DKfLz@rm~MTdJi{x*8l^8 zTjZ~dO(aFa?<#%|v{?K4@CQoc@hrA;2sDl&l>~HO$Ha;hi3qWI#=cO4N;(*cF?)Nf zrIEY0z2dTE?OzWgWyWiA!C+?aX)sfM4-yB+ZsuPZ%)*x;bl@{UqTDr@bzBSW|ECD; zzigDBCYWE0G;+(NVi!zM{qLO)^e(G^F^bOx$EVj{$?wnBU_Rz*G3aNFQ}NYULo468 zA`|~%k4DKdN{7>MX@pb-kQ^z0Bybrl<U?^QBr@Fp@ns4VEt^Im{6TL<A>db*ui>TP z1}$pzkqfGKxe+qYyMQbj)<NduSAz{tUv7hKM<QJFMzzgi`5xZEp4?4tW((odOf4h5 z0`eao#uvw_rm#*d@WT?>p}MFMYL42V4yY?~MsCO(^+0`50Qvw8MPX<R`Vfgx6pDeq zH6DG8W}!J~9{LJ>hnAx?Xam}ccA}rq0dy3dLTAzM=nA@tQcwnZjGmwur~s9M&}_|f z;5Fnm=e6Z^;=Rvv<N5G<^8$E-dBb^QcoTV%JOwX~_c3oaZys+EZ#i!rZ!2#%?-1`4 z?>z4+?+))iFNgPvS7K&vW^dNWthHHZGl7|pnV;DpvoNy>W|3x-&8C`tYPP^^soD2t zJIwZ*oih8~?50_U*%Pxj=E%H`c@y(?=Fa9m=KkhG&BvNYn5)cZn15lu*!+9*o#uzl z&zWC0&oF;#UTk4y(a?f#;cU^vVxYwc3$evyiy0R4EtXqsvDk0%v&D6b`xY-Ow3ZH* ztt{WS>~0xkIodMPGTw5I<zmZCmisJ!vAk*d*s{RN%BqP~7b|b8fmUOzCRt6hns2qr zYM0eXtE*NIt=?E$TQ|3U-@2FeP-~I3#(IwRGV2}IC#<hoKejHisbkaD#?2<sW~`0E z<`bL6Hrs5D+g!8BvMIH#XWPlPyX{b0iEX0oLfZ|thixz0KDI5jt8drEu9sby-6XqN zc1!Jc+Wlg8&+c`dI(6FD@vSqgj;zkiI!o*PSm)O|_v;kfH?Z$!?{7ceKF)rD{bu`< z_IK=GJ2*IWcIfLc)<NU2z+tPy8HY57BFBb~E{;Kt62~OR6^{EIuQ@)eYg@NdUB9{? z)}2~+aos(2FV}rq&$eFYdj9o9^=8ytQSVT_<a%%FH>~eke`x)f`t$2=tAD<Jb_44M zof`x+kTm$T!TJVg8a!-h-mpVM|Ayj*vm0(`_)EjbjjS4VX%y6GQloi|erR;5(Tm0n z8hbPz**Kx`ipIwpXEZTy(z!`c6M2(`O@3-}t4T@I)=mAIN}GP(bZ66RO$(c~Y}U7# zwAmNUb~U@%tfV==c|h~%=3h5I&^)z;MT>4NhP8-qvAV@CEuOY))UroQamz1S{?zhr zE3;PJS`BYCt=0Ng7h1h(-KO<`*0HUZwLa7OX`3c(`nH+W=G!*M+vK!u*tU0DS=(>h zo@krPZ_M}O%lS+BKl5L-Yt?RGySR4i+Ffc_+P+Ks5$!)|zpH&}2fGeF9U?k>+u?MF z7aiMn4DR@G$L$^OcCzi{(<!Rcl1}G36?X2@c~s}Qoey-*?$WGFP?xD)ws*PL)uC&j zu9Lfd-}T0OR`2<|7yaI<_pWp^>*m=ls@sZgm)|#g-|KzZ`>Wo+>SPJJkrhtgJ0&~Y zJNr3Lao+BH-=&GmV3$u^4!ArMbQFvgd@VR9&<Z_;a^VJHifaSc4_rTSJ?#3*t(%+J zZH3zncL(=C_ayg&?k_#w_mFz5_PFiY&@<R`uIFjbaxZT$mDf(M9Pf_a6TMe@C;K$= z3Gtcl^Q*6=Z$IB8-=n_8-MzYNy8qPuc@O6v(LJ{H$nM#tr?lsWo)3Gq?<MNBu2)8H ze(#CB*Y?in)2@%G&-Z;E^zG1B(sxteEWh{sCi(5~d)80bPt|W<ze4}+{?q+W_BZc8 zp#K;BF9kFR7!j~MAT6+cU}WI-z!w8N2TU7qa-ikFK?A=Ym>kqPNF1~^=*0)#A58z? z=Rx*^LI*7$^k8te!K%TBgUy0J2>vGc-jGg16hjUSMMHyzels*Rq)W);kR!vahJ_4U zF)VYq>+p|<p9^gm`cde%(1NgjVGF}jMsyt!H{$fjx+BMr+&Z#wRR2+nMrDi^jGjLF z_c1NT$i^HTYdv=4*iB>Kj0+g|-MGi&J;%=(e``XQ2?-O<f7s$f`G?0os{4`XqdgNX zCytu9ZDN^dsOWpqoA99UmEkYM{^BL#Cz8IBZzVa>UeZO<tcYF_iz2ckdqsW|nG@9~ zYH`$4nZIng?B%3^lh#Zsj2;@jIhv7=lJAPKiJ2I4NYOwMt@v5lMwy_z8vB0ioY;)X z-6wxH`GsnbYLl9$o}fOcX#~R5g}AP9pT*su(tFB^DMj%k<M$-gPf#RWNbHvQd1BVo zz^NOjSxgg8JN<FHk7s>+f4blFbu)M~!e^XL>X7tl(&L!}W^S2fH!FJ9#ZQEvEczsW z_Ndv1KW+W#%ugSFHsG`Ea~$WW<|NPUF?Y?sEdC|?*QL+hKVSB__6x}uzs(cQTRg99 zzIgs`U%Gy|^h;(z#DYr;y%w(i%IYh{SGT_I^YxZR^%qTD^zfVDZ}xx7|MrV-^S}G( zyYq`Z7Oz=iw<K;!#?rw{4=(Gt?5kyE%cGXxT+wgEu9dA;e!jABm1Nbm)qPj*T+@2Z zyfr0jWovJ*8?bKw_np6Ayxwa4l=Yb#Ms7H_(P!h<O)WOf+f=?;u{mSQ@GU=Y_1?O5 zTdQpgx0`K`+n%#y{EjO>^#9@DPUoHLb~V{G???1w+>g1tC+@!W)1aSD@A28Qb8n}; zEB7_r_r-qR{>1$+4n!TuI5_6u)k7Z~I(@ju;eAJ3j%+^K?&ykRjgKunZg>3C<IIVv zC*GWlJ^A!h<f(_JKRTUqX7rgGKM(u)(l3L4`Sonz*)!+-&Yk$R*RMy<cRzpVH=o}Q z{O<Mp{tKQL_FeS6xbKqJrTv$^FCV<(d*$%eo>z}w>vQeY_5Rn--Uzz!`^_OYuihGQ z>vr<^<c!;r+u3*IcV6C|a<?>P<~_@MU!>McU7Xe`?fdli(syNeWgNTT|Neysp$}3X ziXT3Cq<&QP_|r^>%*9!4v$kftWgpE6%(;>~F8A@1*e9h==j7GTTluW(v%SyzKELo{ z^oz$YRWF%W^ItcAy*b|_|MZ)XH)#bi1*L^w6g4l}QtVTFu4Gh6R%v{hb=lJL_sS1z z2WjsyF$_b-8jXlFfQ5m&<Qq%SsQv@EVR>RLTw~xh1EEcD)jx}xAs%y^$w2i!2n-5D zJTnAylrSP;@{m0_ZR8{WU~usaIg&3VnTfzVlY%})_BJ*)wl?;*w)XYw*wv}uxURi@ z-NwxtHf-FmVYB-7<fnVE9~JLBhdOl}93AR8I@W9C=;+u8-y9pUUh3B*0OlmBZv)v` zYtCzr%<A*Z>+_gYm=LgIe&+RoR9dq0dyruKGl$GsSXx=z*xJ>BsaR7>9x^lMEbAej z1<%~f!pzdz%Er>%-W@FKn_IMN;A-hNOw_Rb<XLW3jlN#DyI+TnjfbBKclS_za@F6u z)1uH9_g{+Do=v|0X?ExS--Jm5POsN^HN7_Cf%Mg$PtRPBd-yuA%eNao+xy+mHy-70 z-1p1P$8SbPOqsKI)Bdx!G7G#1jEan(yJYi$bIDnS^^utwq}GC@$=b@&lO&;?YXb{N z!Q}Q0E!}2)-3X`P)bOh>+&hNfSADX`KeVw}?eVgc6;6P4XV25uAQ9`EN&-fBX`~PI zNvJ*rT?|QJ?jn105@&tX2j!1ny?M#PX}7z_72axfHaVu#f_oqK@!d6D@xu>ES><&v z?+O1rcS1k&71wq-r;W~Ba-~g+7Re<?rYnOlPMfzaB4yYP-+t%vcAoS2YHa4QS-V@$ zK9*P5S@heqc@sw5v@KCgSG1bmdEbI*`=9k~+1Kln1-q6%iQcCD?wg=PSCVIk-o91% zQ{n#SSCc~1pEBsv@&-5j@>lh_G^Qx&QRvhupF8inmh`c8-PhyxXty@n9Atj|$7Q=; zb$IQkEHB&K_`rp-Ya<S|p73nflP&{y@9^?nT71b~>C*1tIdSCcl|MM{lSf}yN1k;3 zYNA<oc~=H)&cErh)w5ihV>#<m!ulR!i=Zj@CbT@dZ^hoS!rf!13>Y8nU*6Ow+Ntq~ z<5n{jy#`#r_k6>m6-CRsbpBel>9>ww=iIxJoKu|Q7k_QQn80U;ewyxncpw@vzOVJY zjHwH=rcIf~pq-maOMc$#wcc{=!IHS8nx;wj3bfBIzxe#UYe5n74xhc_Ic;W-xtl-S z9QEazU8PBbN*VMr>Bae}<r7}+UqAlP^}~lRIQ$T&KG3Id)t);Hnw8|UXjR9><J`L6 z_#}6*=b702CzdByO?NN#OYu5T-d_39&Pl-&XIk(EbzF91;j1O(!#{`{J|<ARKY8!+ zLAM`v`f}Uav2`<jpXK%mKC!xBd&Kb#edm9%Vtdf?@tT(L2TBHHO<NQy>lAkL#{HLH z4_*?Sv`%Ans-VxCg-Mx^lfWe#Z)6M!=yAYo;Kr+a+p7DP4#=AE>Vue$+YayCFlhgy z8$4vY@vP%d&vV+|9RB^$f`d~FZ;H_kx6Q6UpX>2u!GWBlQyVrjSMs~uI3;G#2=(k$ zN7O-|OvqoTwS5*E(fOp;gWXqxTCNUiIVV|l`RTeoo0>lA{UEQ+gNb&9{&SLJ(uXnV zRD-1c+ppS7&n3vB(taB>c=3sQmj}H5@M7A}T?<ESD(%YO`{3r@^H)|4Ea|hN`1~c` zPUoKPYw#@Y(GUjRD}VDr+Ptr%`%;EQ-+4CeiEPHpBiS+HaXFB)hxI0uwplSDS1OjA z^lZ{A-(%+Wyy%tbL8W)|QWm-PdVYRn&KGyaEzc5r?u<UR>BQuQ+WP4iHz(b7N?4v3 zt#NI%_>(?Ah@TESb$s6L71`Ynj2h-SYtZt7{a$&BOkZu@7eCjvh+cPdNZnx*TPJM{ zaM@74!gt*dGhcayCwWEfiO<Z_PC2lB=7(cP2lkz~<VWpp_nyAm-McSn2kg<_9dUTO zJpNXjMZYabX}xfDGrtr^=U?u|KRponru_Y+2e)Qz-tpD+j0U&%&iL-=t3n3#ElGM( z((&7wB?ZmQ3hwM(d~p7pJt6VWqLtbatJjoE{chg#I+iZ8k3W9)KwgjI-xTg!vuVcV z$g9fo{X3?w*|B8oYl+YPZc&Gh_^Fp?C8Z@DxGtWOd?cAcSHBq0cKeqpF^k6D+Ph-h z`5rrx@~!3Sq!p3RlZ(GQ*2!~q%1QM~L5s!iqTf2!OZ{@jsmamXAvxLUFD3;X`tt73 zEib0zIg}3UpgfXZqI`THspO+;?aNo}XmQtJb3$6H=@Er(*UxzV<MdwXEB1){+z*{U zW5)!?J-6%F#2yWDPC4qk-tu@dRE$2_y9~1WcGhhEkXz|F^_(qA9;dy2syxwQ+Vno5 z`T26~=GU?n1#`b{U(hS<+`#h=*RRiYkGY)Bpdf9-^0wuZM@xH&zT_YExwK+u3x{3G z4rqpYS^kO34EkW(x!jVei%;EX;1YfO+tL$jN2cCPnvK~lbhLN-%fVkK@I61v${TDk zt7L#|M&5$mY3EM7?(^fOg0!6YoS8i?U2*e+ltqurJ1XC|qR$0w^z{Mx-H)Fs88|KF z*}Ucc<9jdMlr=HwQwG^SEl8TZb;!{V*S;DT_k8P-7UoZO@0uLjW0ljM2Kx`>Or4fe zyat+v9oN6h{V8B`qD)igE^pD<q`A(~y^id>cca%b=a|JkZY?^qzxR!ai*EIai}^MF zNcy4GOUe&D9qV%XSM|I(ad}qL*M^#X+@;l#lyb>}#*ZJTD}F`G9L$!Y8Byid&>&12 z=Km_j`Nu~iulVnad$Vfo^ww#+#XC~>#FtN&-5kAj*33gE;}c!FFDn^R$Zz%j=U*>N zxOvuk<CzogsX+zF#sB*Ds#G~`)%3-4e|9Zxx4V!3^_>SwPb|*=mO;$b{K)I#r<0u= z8*Vt)qVC50<?9Nj#Vwu`9@lC?nN~H@E9S@kmo_Av3;#acc4lOX`G?3Q>-7|E$p;(e zZ@P6Sw?$#Scr<VUgH|4TUZ(8+{>5EpxvA0f_8nVy@m|*W0@u^?yxec>PG5Z>sD&Bd zC&)aj?UT~aPkBCZ=rOoCx{$Q}&LRFlzov)V%)2T)?C80)XyY?Qz?{M*CvNnZ9lbs0 z>Gs#7clK~^y<u+CPaLn8c(0n_9NuQ)7rF79ep`8M!oDkG9Wy80E`L1i+i>eMDgMn} z9Al$9BA+(t@z)C1Zyq=DSc~$Bx26^jexup`^qBvRd#Mi<7baXEb>t?4=8ar2V2H(m zJbTA2O?$S8uCH}G;#K0WNKISOXZncq>usioXFvTVN;)NUWt-^5&7FU7oa-*Wo7a0q zldCzmAE60TKK*L?v<(fsUgv6aZPm>`zc$o6WNi9~AKHA@*UaDPh%%c&TcNqU_Fng$ z%O=F^{C#Q5L*JAfo7mm&VA8BRyD#ou&7ceA3>qezZ)a_F=kA!^`!<~FaeT?v{1b5u zTKfH^RbP&tvts6=JjLGJ`+F~>lzsbcR*$+He>&3QiOeB#?|~~@=G43M>)rIBW$w)i z$1W=>7xvs;cw<~h;jO6cQF7NK<EQtDp5k@l60`x)!w!0Qu3MMf*ZqfE-&}gW;feQ@ zATT*~(aWaeOy{3EE_&_s#;eD@N8jG)^LqNNJ7c6)XCiZ^&(tm&{CrA!R;aN2LyIxv zWNp53bc}9~9L_3!P+m>Rx%GqlX7R`tEn->@?2vzJb%)@Xk~Zn<@*A}7(Q33)>g3oP z!G-m;vICPohz?7e>C}E(PISf+bn)<@v3U=buWm0+n-%7Lecey3!{qfHTJG4DUEX@z z)tsV7R?qggbS;U7raifV!qP!KzO`o0=OEedy{>@PET)rZ%a3k8@ZP@-#mZ8DM1c?Y zyiU5dX>!T_X3^7J@BZ4j$zs%Q&;B3A6(5IeZ;#12m=_y6{n5X&+Q0Hh&OV%X?3!}O zx#$DdAGseH_pJR4tMroh-b1_ANyeWo2^$lul{axXv!pcMJ0*X_g^%SQPbznsni4Dy zIg74pqeD_>Ey!H_jl5x>%i}K0WzdH5%&k}Fjr5(o<LL9x)5T987ET{^BC?=CD03}; z6ob0=jq3Q#)`{J7(kIQy?s4}@UFQOi`VHHzC_NH(@5%I0^2E<Gddf=AM6X`8WB2Ll z6Fc^wI@iB&!^Y|B+uPooXf|MP^ttjOj~?7R&?7pi^Wd{rQM0nl4K2kBU*|2G-K5RK ze+?A=TKCtMaW3VZPaMfx^SI-t=AT>+SiQsdtYi$D-g(B8Tn26LCmx?Q<Y|OYeP{LO zj{@^PIp>*@_B<m0<82pX#A6*U-MsQ3s7u_8JR1gmzx|6J6v@+<w%)zYC86!|tfy-( zrsM?$%eM!g7&En9rv>Us7aj9c5A8Y7^8AU+?Kj?(wOsz7`J&|AJEv`*;dwFEzUAd> z+m(mbTuj;st^AfZR=d}X>F&LG--heU$B#xWXS<F&GHJ}1UPG^WUSA@1a<;yiKQ`}2 z|9Q(#1<&7oNx3KdW4`o8-9Ar4r=Hl++U55N{vRo~o$a1HGV0h)`>0Nr?v{)zJ$^ZV zO~$pPk8*y9w!in_<w1{OQ!-MYZC2mOQS3@PSKeo{)<MLe%TD7P#Foq%@$ACc&PUQN zjB0Y|%<Ig<XL?;M|7HDv@xIOSe%)GNm)@hLG;q7)^}X6Tw>&RCy!-jtzCQ&d4${79 z(sIp#!!vGm7tCul?xSp%B{5FXm(mBRTO^OsHjOMA)Mt6&4~;*Wn$~wu#P8vK({~?< zdw#fnpGlIUHAkQhw>$NqPvg;37L7i$^>G8VtovjJZMj+2a>u@1ZyX;a_kDP>%}Ks^ zLcf^3i-J0D4eGe)gW+&n!(4y<N_lSU^SETUO><*hrhm8B?0Iyv_!H`QMd)mcW)_oO zB0&~&jPO04Y-43x@4oX5@0_ST!jb`@r;hgMu;o!?SZ0%jBU4i*Z1CM%ZvAZTw5M97 z_TYy5pM890UZHaMm(zMknl|fb%U3umzKV=3eD9|p+gwvjG>fq547*)N`u=b+F;;v} z)8@$p>(?{p$0%-mG&HrIO{;*z2aD=P1#c<ZJ}R`^wr8H6m(?euf1NgPk)QI}fk{x} zjeGAtl;U*rm$H9-{xrSu&>bl^yPY~6Kj>`fhkl3hru$!Cd@KI&@8b#<UR8*fpG`_` znEzzzipldz7W<q#a&yMn#W#`yEoZEnd$nLs&M~v8b+jLL>(K9uv(O&<O!eLIP2<S9 z4bY7P_0FcN4n{Q<HXZp<-kdd}_A?fzJ}cOEsNIRz->g5hGx~)8N}Fi^iHpN~C^E}C zZC$u9c(3a%_sI=-->kKo)+k{^hjl-Ee52>e(iyunzmLy4eE8|^%<)<K<J&lvuiHB8 zUuBa5d+eCvw>`E=+Vla-3cXV!Uk$mr&DHf>=8(0yK@T5{=(#Tbu9Jhf)tUM(&R1sT zrQ{r|-*Zp?vgWgX^jOtmnp^zB#OPKnQa5<`#cEZ}#bZ-fOuqmkev^%%3Xk7kwQ-7{ zFMAn1zC69)!P0G~>Iby1GjQ(L+mlu>$h`QQrz7ScNK|y1adP6^K6BQL%bvcZyi2CG zWPF42n_gqvSY7@4P*&l-`n{GN?4ezLE$5q`&fj>}AaHi}fmzSSE9#DV;(N2C=$OqC zkHycY1UEi7B;~{OA-6{6tvFU%uyb>6d3nE*T~lV%z1^mbdGjYfm7j^8Ub@x%df|*o z!#`ag?muVmjgo^W4$tCGIk7|1TCym}wHt8Z@I^r#u?%n{fAN*%-e;uKj=j2eKP7s` z7Yl~?=KIS;qI<TtuMD-Ap*p&#&xYP#Om6*IqKvnBa>nvIZQs-pc-P(K_9A!T=6QQ< zb~RoyI@uxRSxRnbiSwF(Z=auM&?gh7elYAz^6cE%2R_=Y{p7Lee!8Mf54RoOWA-Pv z3?9%X-lzMIC7mv9zy0|A7st8?Z=E}Ou=S$`L)NS~Qao<;-fP1KsY@GQ-}T`2p@2&z zzg+bbFAea$Xs@v;c<^$s_uYN6h~N=kdxqrg*^=<(2kUQ~csb%~(gSr;=WZ#3Hs5rf zaHnl{-QqmIJuN%`-ikqky~O=8hODt%yJ$*}2l+R*UMy`g;Msxa{(Ck*?sZzWF;96_ zF!}2~gMt@~J^$X&Lm6MTiR_b`DZO9ZC^=xd-~5!%zdn&VCiTdjlDd)m3TH6r^}KQ4 zi?hTT`;V{9C|g(dc;>TvNz<l)FqzxrlORc9uXVqSm<rD7zDc^-b;Q<=i$+}Auqde0 zdmR@A4Q1|-*`9V}s$&G)$?8#E<cB0kiNXO&!G|TLD0tVvr6zB&;H=?0T=0=U3Pl(+ zq(hmt$1(6+f`d^vc(Fm&yawcaV~lP?ycVzm#l{`ZYpH*q#Otba1Jg@9S6J0Xus(&5 ziswe&@toCHb7cg}fz!PKt}Do{Y$ig0W79p~diE{C2imgd*z&o<Xkp4{Ezgj)wPsxS z=AW)L=iXU72*hW_gT*Cy@?gE)C?C8whJ5fk8|TA}rw_x$OdmFc!2Vzk4O4_g{Nb{x zyB1qmb&FBrRdiik*a%P#aACLP&LQRCYdAK+-`L9NN8EDe7Tim9PwWwgKrc!I$^-vD zdBC{w*a9E*;9^@G$1ss9QmP3BR16>_FjA19K!Y_Je-j*>9eeibusD$f+~AfHu%&zs zbw^sL0V;*b_i%}+J%9ycI7k>8CfCDPaWhv(B#{K`&idxu*oDjERDLml{nKEuD2`J1 zt1FEOmr4xBrV=<K*xBJTR9T%S9H1^xZ-V`P5E3u|9`*`lun6`J6CfDpxlXJ~8L5)0 z)o{c!XJ!vNQKS;cv>ed3CiJi!i)}Dw9m2!QEw<t)kwPJrvrs@?W9%S}i3QN5Y^oHa z;<!-j=}kw%E>)#U%~@DR$d!5&Ey0M@T?auU<QxOQG<X`y%|eGW#-(VjL+a~ciKM^z z9(zPKF=`J$SV2GAxItG`KOJz*#GKr4?*|A-QkosQVUB=1^v)f+;Sdy{90q2ou*(-Z zKV6~vKv}>0vg-#3D-4YU2pA4a9;X0o7pyj6{_2NBfI*2yk$^!_qBx{L65>Xo#&}PQ z@JI#wohZY+hKWni>tcDh9Dn01WB0HZK0#+szM~b<Tw$<rs$(N`_Ld}ku^fkQ0~h&W zvxo#07K1QdEB<^~1KtCOz8ivW7MyJYGhWA~Kq+1a0Z@wPG9QP+Qi=qetqZ2cl(HTy zN|dVjt|Wylm9RWyjRpgi5(x&Dj}d^xUPmFhC{abe4HPoN-~R@M*zn&%p_Ai&PTsvB zcX(fn+hc$2;eojci-(t43R%q~R#BvNiNd^uqHxMs3gM=u<5A)Q0XnG$e1zS!^p{IT z3cfN<!=DtVh~|qF5<rs0z`^1gH4Zy0F*FKzcD?~!sf$7X;82%+onnHw?(^EzcfeA$ zqv%3+Kt~zZDHN747;^|nfPl(P(C~G5)m9(`%b_Ghz^Qz~u^M<zBAgoyZ`fP{PchiV zz@HSpH6Uc;pFKt+4p7M?ST7U@2{tyvj&vAQG*ksDg;>}ydB=7GRZ}r+82KqQew>}3 zLV;TYF!RUhwZ)A~kU}C&(6s<OFtiI$U=VVD5vVSbXhaCLTVZF{v!|V{KxY98i9p2@ z7=Q_&;*=_QBcHYc93H=`midGEc6bkh>W#H32|`3FQKU)~8#O#mVF+J`2?R5oJTTWq zY~(%^!_2V_XJsqU`3i-OLrSdqLgD~?u}ZOIQZ;M9W<!?-{X@X&2OxZ78nR!4OwAvM z^>6WoaN*|!UC^V)fCV<h7i&mz#^%pf0D17kx~cf%um@elhHU>S*{~IS0D28%5ugr- zfERVywiN`*RB8=Cho!ji6&jpIHrcj<P>o1Mc*4{;KmmPLCAS!l$?iol2?86F-6+PU zegIz|m>3%cds#G6euPM_mU40GjU}U$DoH5xdVC+wE<`0|t@-YHBc)nX(F_opYN<F* z1AQ=SrRKYF?s1RHclR>nk;DRt#L&)hd>0>5aIP-y?p*2F3fLWXp?XJLNg7HMm~?;~ z@?&s=i=Vr6Y+x(E*&Zwv;aUuq`ZVc`Fv^_cMq9x^5w3cXro`z7yHeDmNRdirYCcG& zP%ES3hN>jc3+Rh40MPEB<4pk~N=&R$4OT{!W*Jb&fsiz^rTR~0Ym#lu+k>TwNKKTE z!})GLEM)~j>JOB#w<laK<-0=huyvhO%o^5nLnS7q%T-ulTds0*ErY&Narv!5^)rN0 z^U$F-f&M!~3E(fn!md6BjtdmUCG=CuCB~%z9>FvSROiXWrsl>xqfy1_>j}q4Zmup~ z9CI5K@L^R;KvqMfc!vYlgjLCc?D4^jre_-*;~=R@fenpg<jnLA`@w!2yn!b)N)}<# zZs2VDi(=J=FtG{e++aEaS`ifv!8FUEp!^TC0!D%47a3)0HCPrY(!_y)ZIZJ724f=* zw-s<P_Lr$ZM#hkB%xL&02vfs;Gvg+SV?44A1lI#Yn=u%wVjQT0F(iD5vL9@<jy6pj zj1uHzFrbTr<3}7DuG(DOwt|r&c^qWH&{=RT3fEHTDkt~^S}3F0F~*-6EKVy{MQB1s zHZEdpLPp{k_Y$W09b+gyE^7kV&w|TyluV+D;=2gF+&pwGwMlcse$=9Uz)dCbB*0P- z9x#CcOJCMRJyc;xoFFtx8IK(r8R1Wpnn?WVE0G&pQ;4Cy47rZjsPqg)#}yfV>ic>& zW5z+7FvTAZkT4}~$p=dD_Mk8&&JHdpwLXh1c|gFEfn$-HaGPL+S{ev@_%Q2><fMlp zC8MuBg5jW+6!ter4CK@e16ghbN`e+JA`o$DAEkoL4~j@bm13I%fq#@tE`gmAtPH~m zF~Gn$1mms^3tF&I4(|%*DwF_ct%BHPE2t(Ws1$~{xK5fSJhoCQqh-2AQkP^f4T(}} zl<FvDY~?ysDSg;E^h>0<swB4IrUSPsx^VQ_#O76m1T|kJQmA2rZVU-iXjJF9x(+@~ z9l7da)pHeYuqrxot14+66}VoGd+N+djN~2P@CD_shRrl$X@4U@UMEbzYz`?)mWl$b zmyC$>l~(`;AsGx-)G%;~hT+UW7|N)S1dH#sf+0#GLt>9Yp3sc3XB>s4ObezZ)0W{0 z%K%Z|oZp(U6*gviF%yKg!a70+VO?Q;VYyH%TqRsBv=sUY{e=O-0m2}mSU6kwnQ*Rf zfpDF0y>O#&vv8~MjPRlGu`o;cO!!7vAY36_2~fj!X#9I<0-BDTkPGULdbBfdXN$gP zEcrq%O(4MH6!Dw!TQN4mMobT8oX|#SC$twj3hSZqUC}r+jd{#ip!EzNZ5B3Q%vqm< zq|#X8u`$0BYr;usy8J<ePS}DFxweE01p-DO4VTEb5bj+><AQi=K3PY#%M#`wL9lX? zY!Ga-tH2;ZFzi%8GxHWk@j}6n$4S60gMd+D;28?zTn%!qNV9(<EVn-~EcZV#EDwEH zgot5L(ji!HvfLnMlGae5x6qGz4a3w5L&6FLpeOtgAhHU`D}o6JJ}dwYK>cv!)ee3u z41KwlzN+zJwWGx<$BHmZP;sOvz(b^p<3!fbbd*R2OZvf}K~53q%?txXRse=<aKl4( zXa()KesHKWsbXlzjxGhJ14F^PhJ`g46ux^%Sml5aLM9_bqdv2W!JweZp`f6OfuP_m z!$5s!U`v?Nz>BqJErVBX%*C-084<ApA{iaAQkYKQV#hrdMnhGPg-nR0AD3{{(u?wf z>IOlAs)s<h^A$%M20$blZm463hBMJgJKV^^bm&9!XEg93-<(sOup=-?%?2SGi}_U! zc|bC%G~f|bIozpYu%qL7)1eMT1*2m;<Ait38x3>>6^1#`cUK(bK<zgk;^<1)ba-Qs zkg@z?EF}~1gA++`j!gzO|5jj?hcmkHD-32x2FQe$QG-%x9Ai3)fo$N$vqDuNBl~J3 zq`}a!4S+US0|*HjOy~wfC#RE#Ld7astZryYxWh2E5QHWwG*MC*r4vr6QiKSG$$S-r zDT1lu5VG*$4DGuV7D3{mtp~Y_ZRd5dkaQbjVLxjSivjNu1ajRJh)<0IAwMu7{fEM5 z+m<*`YNjUHCoO=Brw<+)3PKI$&|I?{t6}y{XBS?j51nac_t2lpq5iQEc<W@`{z@^7 z^%WXU)`fuvVK%O@tgfx2f-VE{ITduNpbLvQl`BJa!aNmpad!a?8x?f*t6e6t8@KYo ziEdQTHJ$V~A(lY`<>o3uq+%J23cB2^J{5GyxkCE6U}${|bM^)fqJl04D!`;9H<kI1 z5_Eg_CU_YmbXUBH;F2(!+7`c)k)IC!VK4w&8*IzzFvIU;fvO^24qJqP3?GZv(xwpI zi{O|0HL74e6vi^D3PIRmH^Y_q94rong3&5C2o9mb1&5ymoy4M<Kvx%P`3I3CCa5P^ zp{R%pBe<@=6!qj{oGbF)0U%(0@CKMH-fb53WEntgMv_t-Nl;HCO;Jx>F{TUuYK(en zHb5l`=R-;G#d3VAg^I6?;A7wr1Y$rvb$(g{)RTsVxAh%JQh;iRdTI^>VHFHa!(k#4 z4~Ov<0x=9#<6uasfiD$&<5_QPD@6%#$G`sy-U-9ZD&d_v@oJBEs%?%b(#dqHn@BhM z>7d#JwkXnxj6X~#w4vL3*OWFmp-3kKCc|j?Rqze~ADP*#0_o&QkxqXbq?2JX9_oSV zY(E%qllZ3d{a`_%PPnn*T5BMPVM3d<LKNzRyE7eq*tM4`;JlSr&-8wDJjOv~SdKG6 zGC}xc#jL_An$DDB3JD)px4;Hes$z)^OsiaE19Pq=FaV(R;5XBSHgH?rQX7txVhZK# zLYzs%TWN{{NcAUR3SIeb9+mrIJZ(gl*$7~dq6#UhP={cos6zeBJv5%Air_|+d(l00 z4<h`McYMPaMHNz1VQqkt1Rp?Ag?|J&Nf%qmY!O{-HS9sCdYc(tY^A6|{Wi<0hCEdd zc&Zrg(8X4|*vigA7=Rl!!7l!z7F%I{fT9ZN_8FKcrh+c24hcxN&s0>mK)286rdDdO z(nz<@kcn%$eTG#sK)273k*;pijc%VY5<$rVOie^kx_t&OO2yS?`^-NYRp<ebuV%GH zs1a16PKR0*XhJJ&|5u_3F+i@u572~W(O?ET)XZDxbf`5UZo&zgFr1(X!z-W(`MOYQ zj3#Umrb^^%lzh;|#exdMrJxf;76YnLjM0SoH9!;29!(;zC7Q4$oIR<6EpQkusDwM# z{b!0T#7c@WvXBp(*6;@CNchIT{|cfIt3<4fD736SqVSL8nxYCRs*vhW`zPv8^RA3! zz!DIV4E2x`FknGPg6j1o8c;_>wB$fsMkpn2FFzNUehruvL)m*Z>I?r!=&Vrp55hW` zfLkc4klnckLTF{(0$^yWUBJL|U`0`dx`Cf@#iOV~s;SUOfd^C*iYf%PhW{~5g@7vb zs@xY-R3Ye<p}Go*NCj1r>MGPwU4>LvVYLb#S&c$NlvGzCG#3Ac-b1?BN*7x}VRuz3 z?CD}F%m*8(!8FWFaPu47NQy4D(#2Myvyg0R;5Iza#a6o5N_7=drQC1VW=@rI$5x93 zq)NFFRm!c~I6#$h1FnxM<<==Nq)NF7%CkC60TpNTt5`UzuxzGZ#Wh|sqe{8qBuuK5 z+gP<Y*>r29eEUDDl=~lzD#T~Lw)i7RwRa#3t^W(iLdXm6eYoKKTC>qCvan$Z<d4@` z4ah=Xr*ZiFTH!`hWFaa77x-6WWTCz8{8~7YH8v4E5=yX|A6vnveT8#u*;7(uQKB)$ zsyNTq{I8~1-^kQ&yZC&OY;>M2P|R!;5GaS7icC)YZF&Ln!0Yx3Q|!HMm|~uFDp0Hp zT;N}gDduQQF}|BI#rP18V|5gRnJ~9^P|e~mr`n92zcpMLAUC2~4<Hae0r)9UEuQ7G z#H;X)Y=6WER=9(DM%y0^RI>p)*-Y#Lel@0A+cA7N3o{%}orI%mox|ba52=JdK%~$B zsufOemE-W)lYpZvYJg%@3rX~SLuQg^&2(Z~K0;%l6#N0f8UuPU@zGf#f@f7BXZU7M zwT1&Dz|8>o!lwYUXjgm;1D_o8fKR&?lfxwxfN;fFSA0@1AF!?>cpC7rSj#5XxET-k za9!xw1cx09*jaoQlN3V2cv*~=#VNsvS?=^<d@6A){K+8(F}!QwiI0Kc@VA^s&sfms z8Lo51+DX85BAkZBNBto@HTa7Je{9TbZZzN`8ceYMPaI+}i36tzA0!6nV4=>CLN%HU zVJlG&cyp*>nmPaR5Q7S0aDvcHDH#DFiir+VoHi~6SUag4;=m<>smf9hr-83K1S1YY z#I%@7(#@UNj46r3VNYzXOj$K4E1Y+HNC$T50(o&TNfS<^2rf)(OgS!1@sLtDOih<c ztS7ZIxG+#95?r$!g4@I>_)-DooGQ?c4{q>rBy6a15<bp}98BX$*op8K2li~)h)Irc zdE@e_$SIZc!-vw3BjMvvG5s;0;*-5F?TqQDfiD#)@2Wz<lxI_5N>c;pVcPM5cKBct zHf2&$HaPV-E|y;GdD=L?n5LMUC4{@!1F<lVg~NrpSxkJfXKu$5S|(QFmx_GI2kz9J zI1eGS{DCQtYZaS%wl1;U!crS^2unxI1!DNZZZXHnAcU&8pRYUM#ZW`5q8P`6hO)<0 zz;wh^3W0Ruy00Q{EOj}mar|mbTTDNkChS`cZ`e2Xg=>RxYT2A%^gZTgLyVZxxYSuc zY*~$hFYMQ}4pydV)h!LK7aVWm7RXTQT>AN>Y;j6(JH}Ew0#b%sS1#4nwPS2O90Gph z!L2c$a&h6-81pP!TX4O^`wC(qbX?E4@YymnttXf&T<PG}5Vv=jbGVcR!`XKg%NXYt zhm7ko&JkAwjcJd|1XIBf66OoM4?+XaC{jPdNGamf;r;;EhT666hFTn<O9igAY+ETI zabb>dfY8}9>#>;<sDe|)_Dx(*fkVRO&(<ouGXvMTXwm|)Z4#~tIBa|xAP$YKQEYq2 zhR)_5Qxo@=TzEKlxShdukv;4Vmq+#O25zHp`Qf^b+dUPj=h!!Ha|~q_L+qrwHrh{@ z!-_nJ>B;t9xZY19yrY3Uuzi4`M!c=g8n}Y%Q(67k5jrl$br0tq)5Wy*V4lY%!qrW# zl{3^mj*oD=htq(08~4IECKm`T09s8pt;W1<+Dqd2aUW5U8*ywb6>(pMTT+($WF$<? z7gz>i^?P%55OXKnE@7W4T@7OS8&eCHzlg+#O9GqVc8iUj{brBTVl{@d?R5;{HB-ri z>sza;T{zX4YM9$_nX_#LZn<%MN|Jh9_uP;W?wB8O{G7yN+&Zv59LJY9<toArIFDR- zoXjHw4rSBG@)>SBaKDPb@IhX3QXU+inU(-6@nL!^NEo=TU>~gJbXIQUsLs{{mX9%? z<8r|<;c~#`gXK6@{=$7VP92uV*w)(tT;ujrL~L*@nDZ*P(YVdQEj+HBn5%GFFbCki z-cW;Z*tm^kP1#z?QV(<9P@o6PKe#M#D~>}m&36QZiu*`hE^Jxjv}1a4?TT^x_h(DD zI94@K0=K3dH}-=R;k4pB<GkUX1ONUj`^s>{mG+g5on8BVWn&<J{=g-49D@0mjzg5B zF5>ovjzj1;gdK%flu_B1A4@8R@vNckr{fSh4x!@^Iu5~d8ar=*rG0jcPRAi^+d#)5 zbR1HXS@xQaL#U<)s_B7hdiXnQdf>JnP(G%7O!-)<X7|o=NH%(&AAtzc^ZcYNUzljZ z0B!e@NpQ3&)`P(E4aYVDzXX7E{Gs#wXnQOLgp5=|PK=aImGXVK-RvPM>A=L;D5-*v zH^dOWG{ST1&HR-LwNxC3j|pa-tNASY8<5YGk0~E>yaSuQgA@{|x_HwaXBZkQ5=;9@ zBa|v>C1bw`e2B4;V?R&<!?GAKtkD7Jz-W47%Eys1*cxo2i>hCoN~9J=ic~UF^FcC& zS{WTTR3*W5=87a>id2<|b$S4LE>@`qE2F?@dn}-QEF{}zp<;4pr`f(+e>c=oTzv;i zMH0-Pt}gmMLT6++U;=s?!9X}Nk@B%dM&)BFSJ3vD6+S~XB9*4H2tnIp+8*OB;~nR= z({Uah=TW&LM5T<Cs;FE+=PTZ}E4_m1XFBhu9~{&93YZbZM8JbHcD~gW#)0@^)hN+% zUTBn5sv(mp`q^onT6TjjGH$j-K-*&hoj+!WH+0^O&;brDqT@U~o*69F!2GwNt;O?g z+@)`82gqrA%t<Tk+%z5M(QzIf=TW(W$`!iql*$!Uu5foZ49}=s@rQ6iMC8K9Uk#Qj zA~jKdDwQY^kAOYB_^v`XzAL=>@LfH;;Q|x*f;U&z+>`I+L5$$j6Th)x1*tz!f_9p4 zxs?CUKhw(y#t|rrOX#PRON?;^pmZ2agES&J=q)qC8<?&dYgBPMJPj6)*_C8BR~Ii1 zx-d|wl1)`AAe2zC2$R(SG^twmAc)yvD$opsXEXG3Jb0a&JHE>#DV(9+Wj_(CLOV1{ z7GVNw!Mer$MX_o_pxA_SZZI7IfEbk=uok9y4%Mh+(Nay6N*Na!Wok887AexisibPY zF){iZj7?I^#n@k_l8QAlrGju8ZVv@v>bMwF%#9{dE(QMflf#)V^r#_`T&?Fdd|26E zaMTbtR58p8nNAxS%sJilM(3mni2iy#E8;Jr*3b2CTGNc#nN~D?xzfY)psgBXXeY_} z-?;r68mGYx=O~#(6UBECdbxS%5UC~*HTI*rz8kt@VHGEA(o?<Ysa^_0CrwZFqNjRo zq^Ek(Q@ud<mkbR8Z9!OHR4CC>L=QWlhaKp)y9kUn$LNkfsA6f8-Ca{*V~l`ozR|C$ zyTC*OSyb0g+tgq&=-m+PDgoHsINAt)T?P1BP~{c^K@}Sa-Ucfn!Wg+>fz0UW@ldIT zKMsu80g+&c2u7w|wM_M_Re5B@jitz_h!qma2#FmNx#=bX$SgyJxreG}9!!X(ADeL0 z((g(UR5#@ysCvSo;&cOvh8yk}qTx)~VSs=e#+%MFko+0VGLUc1sZM+m7$j%I!~j0y zs>=BVfngfKkd`Xv7W7Fn%q-}5-gI7pE#xX@73g6H?5tnKk&JH2szOyEqx)(q$zbS= z1`zdsSbd}zlq-YE4fdqXP_arDt6|$G!X1WlA_Sp{3Qd$$V|+|N#p)LfsvWW7Nv!rV z1m2XOR(d#u9tm9_RtBgtiG}d0Ar|(t2C?`-=vYawlqmY00`aL)AW_h!`9tBeZA%=$ z9MvTI|Ixz^Yz6(5VwhM{XogGG$~cu6Z{Q$w<r>TC+PV<XK!|lXVx8FdEfypVtXBu? zpNs~A55xrL3U-K+fFy7uDdY*w7<<N1Sjx0uS~6`Jp0JGH_+1B73H^lr!T{j_VUSQP zoGtuJI9IqpxK6lUNCjOX6?CbfTPta#8hBp?a33e3d;mMx>G8D$K1u~$D(I>dhQ&9% zR7nM0vP72{%L$3L^i(f6<%SBn#^U;aRnYxMpX&7~DBbS!Up~2qJ>^NERzX@UR8ob6 zoaB@!li+W-Z2$6;n?{|4Xb?Kte<pt5pMZfMoZgfLmos~EQ=_$D&a<?^=Uthf#phjF zc$l8tgtD<$_|^F2CTsS*EB5Rv_GGX|;NRNhoGUlo$zeJQRdFJi-Cs?ilM{BtG)Nid z)_1^6oIm_)0#_ZlI>Yq|OCgI?ct@xoKHCcJaJCidXG)<i_pk%_)tEx{hN@(sA3-GN zkCKLmh$5xn8HdT9XVv*a4bHQ|DTH5NznSD&v-7M_ebDKTrvxI&*c6`$z(=EC=pGIe z1nhZIIJEzYrhF@ixRR#)jxTGkDgRwLq&hgM?n0`&@b9c+s5(4I6<CmeJ~GqC0FwN3 zk(sXCste3<SGP<8R#h*QfCWWnVxT4vf~<B`v4#RxgF#PH9Q6MNv<d}`0a^ZCz!*1I zXIN+aGmx2o)0(DV3IxKME=+;}x87(vV*?g=$;xPPQfI<BH}Gp!3zXovx+O}ms$!86 zOsia`1amG%!$PGVLTI{FNg|~XXpKr4Ee({5D)jGv5d^xro|y0IRe6^L#br`lCdFln z6lzeH8WRG0hbS(SE?3j#YJ9Re#bwqUJV%$SDK67Qt#bvinPJdV9ad=wV3OE#nDPAY zaDbon(?PZH9zvo3iQBQpjie|plieyxahYT!O<0bMxbSepUny6rOh?!Tq$0Q)DU!#* zj#tCJZBsosTwr93f=4d;5i1@>Rvyj>41*bi%SuxQraR0iE|cOiDK3*!%dW$n!qM1H zxZx)ikZtJ=;Qe<2T0@}|i9kAx?^^+_?*g;3ea{djXoALwSbj5pE5=6Hi0Q$M6WR#v zg!V#5VLjH-AgMH#xM|Gq#G1S<O9WvNtehkp6c;0_&>03PKsy(#!0I<ERL-v#V6m$b zPF*X~?B58BZa}Jjmk1Sfsh~>*T~k#k6<5{h1|&`*ue@+Z<itNoHf06TKPfOO=+X^H zc<>Y>lFMO@josnoZHMKse>5($BS5_By$gYcad7hLag%laa#WxzhQOKpngc}A2TTBS z$D6{U0?kGc7a;@{7(!5iAr(-8KkCA$F)Gk5AVCA#tgxOZV>IC28lVByGf8B9`?1d& zq5<om0F(fG)>MG~6T?#m;;w=O^j|>$Vpwct1mNS^BLJ()6-E6~)E`CtRX_z)sTKfw zrYaNzfa!l(6KQo=ga4QM82_eNB!dzI%w;eEW7s?f1{~Ihf{_Sr5Dya!BMwfz2C*`p zUI)UxV}hO2u+D-JO=s-?q+lx#X&_lu&fbH$VgBBPA1Y1ZgVWlmiR0F)3=3eUYZ3-? zZgtBj^91l_fVB~g4fr@^*S~2^)31yG5otxE`WTJ%q5iuSt-78VG$~WmA6ETD2*fUH z3Wz>ld>->asVp)|6Q&%Xl1VT?Q?1twOk4{56dD;g7O9DnU%?2qG*CAh6v@dsAw*ZE zUU9HsIBY7Es-zNV<aBE{0L549l>`eyqeQXn`LkTZI7%hcK!<C9((3dR88jqTXfSaI zMw+E;u}TC`i9#aLRVje;Dk`6HTTM*R78&AVsbuJzK;yqMTBcLlt4lI?2#Hc^l<FvD zEJ+)eSJDfT92%z&JIA;>EJ(m|v*|K3?)|WZE*u@va6r&gRm>?igbfTvSUsW9`ZXzE z)~Bf>S6!@nCaB7hTUAM8xdohaFS@7hVc;lifG;S2RzppHnHbKiA_U_E_X=xWZ&~A_ zN@_SIJajRXE{0aK;On7Z@Ws_o5EdmJ0tjBvQm=<g5y8=5VLH{qTAG?wS3|3XX3@n^ zx)@3qL+N5@m1jIu+(#&&i=jlXJVpIc)E`Cty$vF#8#&f^gg{Y$+z3=aQGX)2sZdJ= zUETRsf`M?XYlU+>*;B4y21UwRQnlkMn7-1@xW8>}k<5UQ8yS5W23@rtLm9ks3jo~A z7~S4Nx3`e#LUv}4a2uW$B->96YjE7Gq`-Ln?Om&HTws-#$f{l-Gg=<gFXB|zh+(=i zMg`r!wV?ZtM*TIzu&%0*X751y+5go@zrK@C60loea>qB`dvNuD%NMRZ7U^f@Nvy*O z(l4AK{lZO=eqCGX0;n<4uX(UYrr-y~V9h`AQhuyV94(dbm2sNxCVBv0)CBp*!VLSW zC$fnEy^4UbgygfIVF`n=21=}44}~RY_+bH~!{D_A%yf!~4nRJr?T^vv{^O%~&;`f` z-Szk&f@pY`z?TxV*J}`@41WI=T%aXHTnQK0$-MTsz}n}Tq6SSReAD&8YUZS&<D}=8 z)AP&8(&zswYS66;{X|q(VAW?SL4C$&Dsv|`>xEJ<=gg?CKp+NHVTP;xyM{vsgo6$U zXtLuU{8Q8*SF8T>HO)9iiW;P-!T$(q(9M&g2K9h3cD9J32JtR9-Q+Oz2^2L*bp=vg zfmByuRq9x%3KgnCg)XMj#Z(Oda>XJ!Y}w*Yi>~@;0;)oVt1T5yAE2l~vcrbsA0mm9 z8^Ilr9f9-=XAs6QB@DZ6syd091!~YUoLe)t)yr)34Cg8izoxnZV^MW_2dSV-1zoP| z4pFK#rZ_^nJ%(<NsUZJWIDw1m3gpnHbbAcl9s`=rrU1@KjRJ|*Go2#iP_arDt6}-% ze_hc1N23O@zP;vu1f}*4RAJq}9#!}PBjr%v$wKmEZ@ex5$;*e!iA5FKp2g;H2b><< z;Z$MUv!<xRKYZ@8JE1^z=PtXy^W0^JznVfuWYN9y{DCswaAhE5HbIBG#M&Z}JO)!} zGSRT8PWzK6L{7MtS4Sa_cT&jluclC6<;#aI3pUN~tE!W!3iA9MXi$&-Q3_BB{L?8g zi<!lI4HtV))xXhiOchEGjx#7fP=28Gfwl*<J)r$1l^3{LK-&Y35>!5*@&T0(XnR20 z11cX-`GBhhv_0S`LFEG~A5i&#wg<F5pz;Bg54c)D+XIdgR6d~c0hJGEd+>K_4=7UR zpN^2A`J)uT6!^QfOf<c8q(w(sTrHrI6-Nm=(xM|RI?|%;0c{Vcd_d&`t`^YtfTIMJ z52$=V<pbIt(Ds1J2UI@bY5{EzI7(3YfXW9{KA`OZZ4an?K;;9j7SQ&9qXd-?sC-bB zd_a*h6h}cR@c)4Vv?rjFA(afdT0kX3juKQdq>^D(k|E^}+F#KAf~y6zzu+iA`wQA% z(Eft92edt)@&T0(xLQEl1CA0@KA`del@DlpK-&W<A5i&#s|B<@;3z@m11cX-`GB?u zf4BAkkTN#(k5YhA;LoJMtQWIh+<t+M;nv_bgD&Wv=joHsgVKTJ3rYt{2i!hTKA?O+ z`GD2~+78fmfVKm)9iZ(1+YVful{YKzb{;wcvlLe3uP1UvEz!Twb#xmgqhshCDngsl zOt@B}@6i(U8M*<cYtU766HZufNd9E#G5A=C)*&@o0QZAv2Do{Qgy=hTl4rxS=2@ZV zycS4;hQi-RC<;02{+gmDa7z0M<c->a&kN`-y34D}YmMSj5?X{tqfzKX<cYi>=AXa? z{)<Et!Dc6q$7{`N!E3;?hR~wWWJq5rdW8y65zh>L3gO&?_;b(;^aMhUg!F7jyU<Rw z1I<MWNXO6U1QNra427f5Q8dJA&9j5hTB9v!1KI^&jd}Iqs*9E)DcXiEp<9sOtB}7B z(IQ?wUK0{`Ba{fa`4ZiSm@%c~@D&8tKop9)L98#qT_bSW9?gST*MX}OXfN7_oKO#- z7sIpSS)xpohg4vDgvaN#K`AI7QZoT<<JCv$koG*V?}vQQ7<3Vppj1eQ1gJ6}!Z-kb ziD(*9A`$s>g)qmURXj(YBjoxyq+&4G7oc)<9gaZPA~)0#&E;7_oHkGz{-`~gicUhg z=Ri6T(x3=51oeT`iy?*|psXNW;O;{xuYaNSC<RiQ0aP6ee{)bVq~#XyM<{$r&@3<+ zg<^pYACbS#s5cr8f8U@opxGt(a|LRQM_)h*{f>@9iY7u#N$3^N7HHEHeGGBVLx*{G zC=1F@3n7V60&v+WbQxU%YK(#$4~9Pxm_0%ax&w4fhMeU>8gtNTNL4wc?H=U%CE5xU zd;})RQ0m{JP3SDx+(&PS-AlM<fRFo-@*6<UGm!sdke=&sU4;7?i0=~NYb{Vd1!(vH zLRbQHz5*%BfLOLduJ3`12aw84@Rf$jfuhz>R>#197KHs2a_|CTVBndJp3T}lYj^T) zJSUM17rqxUyz=7w5~N+uoML!acb4r(`<}v8vfpgq{(a@}RsdJoe%?NKl<&9Lw}1b> zeZ~8EJ93{e#f(`|*26cC%pT{KufX2VA1S+tE<CzucH!cMm+)3XE(V@vmwtNugehUn zO0!B|GrZS1#QpvJGt6^_m-!r9@d|TZF}&h*Eo1ib-m7wWeVxx(6qho^rCP@Fg_e0! z^rDn8d-d=QID1oC#F%AeloT=+g_*fIT5w+SqMR{jUfp|Dz*xR4V@k41Z!s3>&t5+* zE@P~oYD-?1mlkUogq@a^l)=jbh}$Y7k9m`sn_HG?o}HWdsu<E?RhYy4wqy5^G6-^~ zmg!b>pJ7s$Y`RqRnkl_<nt4^qyeZ2_)4ncen8V*POK+9F((cVHzmu_-d97udmoC}& zsJNi;dTD7PQ(Rc~iYb3{>t$gPldlEKlPfl5mlT#2FvUe+nY(4tiIUe0^CE3m0pu`! z@umx<Z_2d|-arfm2k(_1U$(XQ6~nw@%HE_g=J(TbO0;iU6h6zk_3FiolE=BvpJb&! zdz?}DG$ZH5{oJQ_-#mo;)XR8Yc>VFOhwf*jr>6h*OXjt_639{lWGQ8N{FMiX3bJ<I zPW&mI!I|1{g<)<jxVq!Z)2CN#e6aA)hP4ORzky7}-=B2phwrZMn0NTsyT?z?|D9oq z=bnH1?aI@$Z*5(g`Q^nm3(suZ_3PRBDarGXFigq9B1Zew{!L3$*L;8PyRV<VIm+yr zpL~49jW55-V3^ihE->092YyW3_sbW%9xnQA+h?cuuHN`y(e>?{iZ_0jo6fYm|0pBp z;j5>w9wy((DQ2|UxoIg`5ALTudiFZwPU_{%hYy~y`FfdtPkU+C^0Pml*t_%V%h@-$ zd@+|-G1De3|773eDYK?Cg%IbuYtQ$eU-SL0+~bR%Z2fWm>9coluE=JXU)IfDy<<=A zvJ?4RH{Uq?`MTd2rf6PT_Kxd&et$G;=bdfLkIxrxVGdkccW&+ClaS|m+TVWPdw=?# zgP-m{f8ylrSBFYJ-hOr|le_;{ph)YDzcWP}m?bw?p16H{!*9&Kl%v~stUS5l)cIAn zX6$;D&N!yOD9$e})s|(azbP$a7;Tw(skXda%UG9}X~Ce3uwT85msxj8?rqt8V(Fc; z2hU!7l!~*}v*ZcGoL|gL{_14HwI`pRm676lw0P+cTNdxw_|1j$D;7Uq^4qOV7rsnq znBOm-IB|K$vg`Z5J9GBl@2A$LYMEx=Z29F}`h{J0w(rO}#;ja^{y1~)*2aU$E3Rsp zR=+G?aQV05&AYO`KbUg$^235(n0=dajxGD`@~u0Nt*j-h&m3pA&fR`B^S66TPX3y8 z>FDB(>lg3(ZPBA`JM+^S-hHTpP=9{MymtQu^C08Fqs)hoA3c7M^(d{ZgkhNOMUOHw zvmT^mWnI{ld2G(%qe&-rpWm2u|5jG!leAlz4^kf8PsusIV&jv0shMeMso9yCkF%dX z&bogm=fUmr%r@C~GP1z?-TM#-gnc{v$)lYqPjhl}vr=>O(jI7Yn?Adj{v`KFc4}^B zT6Qj2<m5iNm-Qs&aanHbXAf^b%FWGA&&kQn$;-&Vb{RQ2X^-wd$jiQ$ot|rU^U-Ul zlCMi%p_g}FF)zzsy?ABy`cB%D+y@!j`_>uv@n6<UoDJTy$J&Ahg+&DgCFKQBTxCqD zwuC7tEYcQO6c!a07L^y8J$qcFEkp&{!qNh(La>7Wa`@8fF3UF=X{q<p%hD{<)6&w@ zQnhJJI+JFZ3h!y@<!RQbX{l)$<dsP^OG{73_GNIDr`e~&C-wvP)HE&l)TT0N3_Q!= zX_X3egMV$BS;qbQr5U{Yka#VAl-@6g?xi%N!Tk)dfz06ikW6KO6ASXLz0YJYx{LTk z5OG1eS=zPiQU>z<JZ~RkS#bSn?vq??4$9W%lxLUcXyJ+9QFa-5GVspJ2IF%4D2Fez z?40b<946Z)2VSzDJbm&+3t!E1^5FaFvnODdgD?E|6yI~TPt0?{>`gY4lb?-pinA@T zadu7td@v9)$|;4b3@$Em2ArDZT})<^`E(y+lb==wtnuV^S#ha(Noi@>>rw=-s6<;@ z1aDe+D}!f2X~VK-+0V1#qqMB}F?0tnl3$jWm6bAOb;00KF_`D&KFcg9D}{elRu2C1 z;3_ILD=950EM?&R6<lvhEx^ycJI3+9x^p)pBeS@?2o)E@1-(*n89dA2Sze@tH+&Vs zRaDfpxTv`N@U*D4MK8;>&vOzUGQW$I2bos|+Tw<#`DNNyj}kJ=i^}%KE54hd-F{YE zQe+N3AOHq}{y)av1G=r_*c%6ns^t<VesSX1$>);#UV3>hNgO+l6FYY7*omvGV)a7x zLWz__QKBSLq6)<#_TGE%z4u<h0)PNXkVGTVfxF*t?gc41-}#^OKi~y!*}FS4J2N{o zJG<O~3UEaqp;l-94BsXW^$S-71GUS{&i2va2f@@1j4n;d%u4`-9#a)drgf--uaTgp z1I7T3pPEg!x>NSZ%?0spt;cqUo=j&;*WLZ<V>-R|=M-)$JhD5)Zno!p+csC;k=RYZ zmE$Wk;cbIyJ=I8H;yyt~O>#VZL?fb$vwiGA5>9G*XJ!VbELOhYTK;8|*}`AZ3j{I2 zOV!isM$^w(lL!09`GAkLrlXnr_7pSY&Y`=>o~4Il5APqc9ZmnzVrIpcS@xSjOdy)c z4#21$SH5-*Sc9}C;4I=FP$Sd?LC6<+ka~~nC)M3Uot<KffEM9q02~6r1j17VOSs3G zeopnGguT^=yS=Bte_vBTi)Z<^lLa?a*?-^N9$4U$y1gKv=@k04{3f^XUL#nQaH4MG zVIstdlc+J`CxVQbolMlp4}!IRdE7KJEtjiNa)rWF+A44jo$C1G2WI1v**rdPolxry zOH4Ve(i=?*wQ<?7Y@J-t8<x?WVaa6C&!D)#AOhLZF76Obh<}Mb#9a>nVPos87Kok2 zY}I2-u$r06bas_>hB5S$%d*%8ITTqeU=JJd8qXIzHZDX%tH}u%;-SEG#CalgJ4_?f zkMV1^f`iN!oLOu{P_#lH{NS6Xu?fGpa8!+R&QTeNMbPqGhg&>h&G-?}A+9G_gy%fz zow>0UX#q}`fBVNjzwyW4T+lP;;H`Gpj<#ES&bV!Bg$a=Yqf<X_6_}G)fVyAc9#96* zaHcf^qMYdwp%n+(0!NeVQMYnJUoYU2@jwf-B>;)FfB;oWJWHKGg&<Z0Grp)pIMXIN zb=(+T5hnm&84~vEpGAgLphG-=Yh~+vPQ$>g{L}axV}SsEdEBPQ`-FhbA(ZF^jnF1% zg7i_PXr1RpGhbvGg^2?QBzl<>#E7qCmCm@L=c_^itOP1KbE}%j%$z>?2gjbMI(7z@ zr#1PI_ZYkQdi_Z+DI5KV!Oqr&RLCZ>Z!WZQY~zqr+#i4Tnu>8PcD5$$ZnmfQw2f^5 zQ#lAqWL$Qjz|a<GM$~omJqgqro?txK1eTt<hNmKr1L-E>4I&1iO&_5@1x?^6%$cZ& z&>Pg*Ajy3x<k&OTd9%ebJZQ1Zbx)0VFIpyhq$6Fr>Gm;c&!BmB%3^s&IV96Ajp{9y ziFx_J;?hK;wXZ=lV=(n+kI#2iSnO73<Dz96U2MZaT}_ZtqjpDk2&^NFD5PRI0ZGT; zz^gRe<vWa21rttr?F)?X93KNuDGd}UGYc}es%$Jg%i32ZfMZUkabL5SdCI)Tva|#N z=LECB&O}zaKL&4GxV7;A@0OMQiL-m1;kb^?JHGs~pDX!r*GGQVI5!*D@sWgEx^p8f z(!G@{i{m(3_~q;*->&o;j$2H$jfIuuMd})A?RIm-jNQJ@Fl*(7Ku|>_AKI^i1NV|! zT;!O`Y(zZ##fL_3l`y8A=a^|05U*?Vk6d6(uY)7TCHRPK#w7z(m5O82*Mqcd34+2c zSiy#na7R0W)bY&W;DY;1PJ%$3!4pytRbmi3PicBYdRZ8-1e<{F2^}Q7%JUuS7KEL2 zD?J4Rli)b&#n5MVMS-bFj&snwfK;oM=UgMHP>vTmVhc{VWEgXWp;8z@NW(rTwW};b zV+0M}1U#La9m)$Q#C<FBZYO0!VAAKlG#5Y>ifsh)M&T*{y^L$B3tT0<U|SJ8s?_FS zN5}ZfD@mbd{+lSllXJ;Y&S=_*Hu*nZD-l>kWT6)X)^|w#gMvvGEHoWJCc!6g9HZiW z4M#U0TZNmNpbvGCFdp+@2vSHjtZD;(93x<<S<?8_LsX6kL11Zl`6Y@AK=KtCNtE%< zswxEW03dP4gQ}f}QoxR?vzllypvp<@lDZ<6n&+PgtR^rLfkI<FO5<BFw#Zu2gP0FC z=}OuY0IsNML9N?OL<<209$0G3&Krk3=>>|@z|5;AKqaUYf>7gN_7$s*U<AAJa6%;$ zbMpL5761*5tCk;n$QjT$Y#t)J<CMs`B0Tg<!z1A*++*hTJWSMA1hHUPlfon>Cz??2 z2^1rE1->Ro1!amppxPWIiB>C+6MlgFL2^B$A1BL$+9E^*D46+C+~83prlC`Zoq-C- zu0ctlY%@K<KczB`(!vShLEX+5wG%pyx`eT3#YDBDkex@s&Rf(}jhWEJH-;o07}DdY zhG4sIQma5%qZq*_k;#U`h=Vh(Cx4YbCKIkTIL!RP@xN5gZgizG{5xhN!#N!ylLd$H zoXR-ko=|R?f3|@t#h-0N@X0ij%?t1!H4Cn@P0dYBTr+E8&7vlIvvX5(GuN~c_nL9m zhHtLfmCl>2&Ck-UrZ&3Z&u~G1jxYSQv^E)=*YVemN*|)9sD<i7z4m5%lQW9xn_ci8 zE*XC?{Bq6fSL-D}Sd$Hhg#f}cJHT^pDV30?<gAfumekG~wZ^6vX*f00IIA@plbX{Q z)N3^A$wf6znc4*f@YGeKR?km!Iu7B4HA_0(l5WYa6X9S>B8d%WR-G%|#$%Dhu6qp6 z`9CU%k8X+6xh(1C<y4f@t>bGz5strn2$xz3z2UfJ*162fmry(2p;v{f4Jd5ZIio&K zhae$+FEPFXwzNUFw7ksM%ERQWn^6hwpsJZUjafAapiat}XjsD#2pyhbP8u05M^wy7 zD;;16^Jo`@@{5S}a25n-4ID~YU=B0eT87bvjhhV!9h(qMU7mu?V1)!a!8*qmf?R9H zFj`r`Nlp;`m8%6bGmZKzfONeEkxgz4g|yW8FapD)s!cknoY`7Ssw&lNe%{VpH9<bX z<rvS$?`0zZ<D}+++Mr%!Q%PfKqqh=m2#ZdiMkLm?BY_Lh1B_ui0J>X@RxWkh*rtXi zX4s=-6J}<=+72v+z3pu6vV@6G_)h`U#B6-UG;(aMm}A8UJ!TLMAHM;U-*LIfHfW|< z$0?SVSD;*C56N~FjWJHljG<>^5XII`Pq6hck3bb|y!dHlc^Q-D2fnzYj@8}HkTWKG z`Srvb92<C9^p6@d;1b~XR4*{~>4@FwH};;G%0Jirxo=6+*?z`Kw$*$#?&shC*O+w1 zW<NV=iuNuXI`P-qusb=&3L0B0+}>FrM26q@)dydws`0tg;?w0($$(A6hn>S-X*1_i zhCEABcVC;jc}`w*qAeml$Hc^J;qx)8%FlBq{a9P)`8(BDKA66gV8{LW&&AeB->Axy z6-^DrZ2_m68jck9`kYoWjhq$#p!LJBjOnNwZI`lA+=og$6`dywBR@!gU5pnw)%$6& z+U(@>cPB1i9!&F`Wjr19-~c1jHTOQ<)>FnNvZU|lRI<pkz3AuZKkP2^;aGC`Pg)C= zU!eo@*t+LL#rdnz`I{5`TUp)qQg|!x-Q9jSH9Fiwh8T79;eR$Ajy-vyz$0hR;GU6F zeu+mrw<^JW%<uTW+Kx1zx?JFM@AlyXmzZ9{TK-ztectU_G;`m5DIzX<dr;ZYv%@Ds zUd?4}jLG(~mg{#4Po5riJK4G?{q_g<_MBYCed&HypT1vlVDyxK%Jt|Im4^<Gow(t9 zx|pHoOOJlICG}FyQC5Ab>qPJQ$o)en22N*Qmz`jCF=OF@?BbC;_xJ-InU`}C-!I1- z6PTz_=@#@1(qMk7l#On?^RJu|R{4i7IvG=J+j+;2u_3?bUaa~mJFs}qAouo|sKEVO z0|M@{p)Cg)D?ZQdDfBqed@?nU8GHt#J$-6UMICvoz}tS=(?2Zz+L5=_Y|ygkE%v{% z^J0kq@iT?j!*=Iz%VJi4oW*{+H}+sj@|Wq62RstboJjS(7!cueW`PZI7SAi&V~%-d zUGlsW?eTf(^$#j{hnwiW$Cd37H<-`G8#!NW&fD)9diR`nbfHfHQ%$kFq?<AEms*b} z=Y}tz^onWuI62Jga@|e+mQhR~DSq$M)cVfyrJjS)XFtyR?4uZ_o&p(c1~Vo#hz#Gh zGx-;vZt-nmtiKQjxOHk=tOQf+4QN0dd{rn^j2U%?C9_tyBpaR8f^j=xo*Nd~+(PvP zo0*(tG?^k-85eB5W5z{hXw@6^%iYtAwVTY#%+z(f%Mu7bLB)E;nQe&~=h@QGq-AuB z4U8=hh}l#x)3sZcY%@ltg%WEUU=xE((`xBIa(YSi0UPb(=)SdeNUvgsc0C)E^qlGE ztZiE3vdX|LdbX?wfQwAoqtUYYPEOuux3z0*DmJ-*7cG;$)8$cY(X3Q>?wpp5%`waJ zFpoaRTxZ5+rtM2i1QWucSbwP<mdfO+W%a_WTroR0qnMS>EGuwpMy4DQ&r1;rmC0tL z^4Xc`8Tq_Yu8=C`Ir+~N%30ZT-{iDhCYN?7r#mNRrWMo5S*dJVI*rnEv-p!KXQ|k% zQbw<QV`f?^mrCWzIoa$S?#O#mdZ!itmd(xKri||Mb<6RVxN~lLdR`%y&&Z{S=gZLu zz?ne-*^F{pp`4a071Ijo95pUeDizJ6i22WqrnM;M<`go3AeGsrOy)#Ct}<N7tWpuq zg@eN{al?AtpH<ERJ(F~;Op4F6jFWOQXXyw(M15U7k6DuP6Unhs3=sUECdbM)+2<8@ zyIyBBTJ<`c-R=xt;kbva20N!WbC_5W8}0TrP{o*)>%suU?29<-!$ET{J$7nZVs}#U zBgiYzz^v|_%GUjzrP;QIG(%bbVyZEwb|z+$Ehv~t12fX1Ht39)1=7I3w^?mQ&Zx#+ zj)~3H>=NIx5)54TtGgG#*zvC9*DL?&J@?YR=~Gucrf$43&gK;iE|E=V*23_H^J!pq z9sILp{gT$GQ5)IV|3`J@?=|)x%=_$b@#(L&g#M+@&Fkt+&%1tXUJf2K>9m;4)S)^! zzz`RW34^`bpkB7{)rG<fo`4sO`BWowp#VFN{EDPO;5hbd-ucW1NkUw8PV{VI%3}4x zwes#eLk#n<%%q2nY(eyyV_!4rO;!T}6Ly2aZZTMy%u>xl*%MhF6`0uS@n6Q=rH!d9 zwx#@@tIO1i2pr&$X#8BJ!r|Tvk-ZV^2aXgZTvSC|Z#x|wHE{R}Y*zEq{Qpzf9CgI6 z?sDVx#<LYia!#{JPm_0>?+6t(S{^98$k$xs9hP<6XYllyvWngLG1u#(S<tYDKNZ$c z%|hqE9_0%gp<ncNl4AqrI5CL@=CTSfV<v93FkrrnsbLuLW(zu47_pi9t9NyLw>#@v zI(@n-yIeck+uPdg?IQkA<Ckk^ZPxa+ZFIlA&DJjJr~0%U9+~in@kK;!mUdS>ZdQ|} z<)WP!9<mIIhKz%3NI$rCXmDs~aB#?uJDA2EV)*4AI4row4Z2V%9Zqfhi)-kOp+N)P zAH-{-Av6D~Gm6obP>Oz?`V}UvNN2&p;V|Qv*ShGm+9d+iM9&tq&KjA3r&c`aqp#At z%4J&Vv|Yxg^)k`)EPgFA%n9KIy$v@w94eWsRBoJu(FlWDJErhqRm?@Dm{7E-L|Q6o zkf~gTH9~>4D1g~*nzfhDtM#zXmNhf%X*F&t!P}UGqX{VlkuhtJFpW;fI3+ab+PN8n ziVZE;nDhKJj4xLee3gYIreW*3VWmXIn962n&h`bG=+~H**&1%v#?)#AcFYLjE-I$X zZ7V%2V=hv)0L`~}Xe=^#hu4pX_`(k1VCx$4!Wr}joFBMVRg^wpva<gJYcl#+(ZHeW z#t3g#vp>+vY9sC5CaYa_xuKTL?q5VO^Kk$jd-zI2Vf*&-dZ?i^w+pa|*Jh2grc(@Q z3r>KJgHgK{<xJKF$m>(BJMz9nz$$GSSTda_;!ze>gs}|22>!sKWH8$1>^B05Hmy5= zi+sxPATAR19N%M}+A&z4W;k&jZg%e8J`aiSx$$ea(t?vQ?&cg#&TL35d8M7%Q;%h* zv_|)x4Mz3ZSNyuXdpb@s_mNX#R<tE$d*6jiy*^cSsrx>i@DIo?t8Qm=J5+2m^XA@! zw`Q4Uhm1`{*5&68`h9t#?QjIg%vuOm)p57MH+(Nv<i%E$m|3vT<ogMcU5R&gCBG$M zTxhRb9%#Df$epsoC29TF-D3JY&kQhDcDO#v?UPQAkHX@Qbp`F(OPEOrGpKDRvlYE0 z(X3!527AD+V9m!FyPI(2-p9TH#}MGY4Hh{hKYlvjqwfO8mJcZopDKY4fd;ShQF{zu ztcMmjG<~d_6>mx1bF(DwmVaF6$zHd*tGk=FpI>H*y(~Y@w=R0(B4g^^_VV~ksiAk{ z&NQDrvk&PF{UHU&DhR)H{*A4-Dvp1-HIcEz1KpQK&X!(mh>%{u7<0P!Y=ng^A0659 z#ks_5b;nAMU#oYoU|iZ>zf%JTZpB4=?DPpe+qrAC&mP2VRa~s>g=J6A_`3}ktIl2T zIu()=bsE_d(We8mx9^@i)XHojr^A!C9_a|+*xOt7HZ-30)5rb0v+UFz6Dz%Aac?^3 z-WZUT9lC!<%E9d;r!oN7-81`A!<v#7_aH4I{PdoZ<C}A0>MnfgQRbEgZlaK4diAZ$ zH!j?i`(_^P1#^5@bTiZEi(Bo9vg>%=XXMI012Y~zdo#_wFsS)fuUEzCfAulDyW6#( zgWGD4ei9pavC(_yQOF!v5ssQY^F$tk!U$cs*jb(wLDy#YM)bkm7LKi7%4$tTsz__S zWu<3P6qD*A<PEqOZUik`(a{bTChcKi&vTMF3&lZXHnRf53k*U|Zey^oks1VJkYn=( zJEZbi<GhZ|8kk0<XDA2H6EUAfH9}}M+pL~j)Xd+|+Sz*9JQ9B_Ok?EOBl0=6q{fAD z&cu}S9Gb>dFebjIEtoe(?08|3M%o3G=k<@-NshO^ub<`E3<f;2-7G!lslkx4xNMt4 z!)neZGn$lWn}m{Mze@Y8b!hr_cityz#_|)EndMMu;Y3sHfFym3ot-$hcVMbdT9D-{ zzWA4hhOwLiOL~eFJn=20J1r%2L>?QA8dm3Je%{bD(<I5t(hh8{{3>zex$vWPLl_yH z&En++Xj!4zOF3-hSj_&IU4SJ1%_3$$l;KmpBW$nTryTal$9{Lyy^GJ~Uq2MNH9qRv zq0M)$oC<L?+w@v(%!QEy$1C2c`+VSV`^g~hgUvl281z?#4{2En6Wbt-&253sG8I(e z8K+xFk0UMbKs#l3%C@5^ZiTz`Z1ID4LmBf<Jy*Ij>7dRZI?(OvC*FrXsXCSIeIW2} zk%8ALwq3Y#APVh2X|^!s{&%ykUHSO)1b?=tZ=dIZV87!{`PJYIiCXE95V69_p3%po z^<D`qW-RD**y#jAQPdLa{-~;CJUTA9L>*R1*<%Za9Dd*dN$l*G*;g7TuC*KE6wH#G z3})=hZyo)&@2IT|TD0bNy&^DO**ewV>z_A1*ek6a_k6vchseYv0gVfpHAzX`y{xRG z`fgp|mTcBDL=ZW&5iu!bRvWT8_f}{bV@aWDmyaiXzO#l+9&hu>Ja;De{O#>-VA_FQ z$5gp1R8nGsrD2x2n&Pq%Dj@}ja7;It=s)Z2`gCj9jesJ?3Vp(}yplHG8D#T^iY{lw z2Uhw-ZAr@SW<%%v4Sc;q?{66D=^26I@0Jf>iIGq@uRK=>I3~BU=a#D*M<fzhdb);D z<>=B#;SA$C1}5j^l7&%oZT)}((b8-lSOszN<3)S7Rj5Z74rF*RhLDm~Ie-+B2WuBp z^ZoIjC;MZ`;kHBXC3@vuW-K)-p!{Q>sRv)WFXnRINLZYvzWQ2BpypMdlvA1KFxPth zWOc-5=~tRseM>TG6eAr*ynb9Pe8k+iD^A7Z7O`ktjRR4daVvi9{5k!yaVPP(S?ofk z%(y}*1EoacHZktoh5JTFX{u$BFSAmE%h2K^L0Fb!yLX}@rYRmtf%|v&1#X=Mgf{9% z8<E-p;To+}JSG-%V;jU{_~j2y?2J>}*u!|j-w^I|V;ssk<EDK~go7`JZ}S-AU*K@p zg2RSuSH3O)J!TiLrE^q7_u1H5suF*8z9uXG&L;jI!9mT@J=2)WuxgS<*832z^0HXw zW2>?u(#RVX_Y15Nebt`(j{>VTI10eTGCtVEiit(~gF4%FQ8BS-;9!X}9BcIkgC2)P zk4!4ZJ!f3gxk%3$*2B%m$Dl`?d#%}sqI$i}VE>P|Ilar+f55RuH9aq$K;F|vsYD`` z(w{`Cmx!dC<FHE}#@&^VRHC8=7Wi^@sg*Cpq??5IBogt2{yw84zG${gF=xZDMGKn{ z0=#6Nhe4VpM>?zCh)Aae$)L{GF+IYYi((C1tCAw8K{?4ukh2AtC<n`F3h7!83#nR^ znnlM-c9s<hU7|(uWfrFFl(~hE9dE4>irFM<C+Cp=FuP)*D-Z)+_~P&XIE#eX8IH+J z7DQb?e)kXW9fIXL_&>5G<{I<*J6o5`Y<<N`JuLC1nd5m2&_RFsUG+F#ZTrjH`&EdA z-i$$rLIKbp3B1FO=U9)&x-mJ^zdZu$dEv|H!7bLD>o8ms|D<8-R5G}SougCSq-e@K zA)2&Iu*t;<*GWoS<0eF)rjvQjhzGifb(7*Yqro)0YUyz7RqL<c9-Hi&zjUCMrAO~8 z>V3we>&drN!~2dPqGK3N`)2J#)#3A+;TIH9qo$iXhFH-)m_021p|XjW|Gf|tzDtHd zHc51l{YE4Xs%I&ilRNHt$Q!m@)><R>=dt>2=MAxIFQ+|n3<F{2yMvFPkM~Q^dvC90 zzlzP{;`h|Eu|tP@UU+c=cF_x3r!Bo7v;@^Wbw&NA|4GVC_)&DIXlQTR&|W`V(oa1+ zFgN^|N@_BgdsTA?Stzs=&8J|!1u=Ig-IAUU#Zw3#JZyF`>vfm_pvb;(m=NLDbR$D> zg#cm&$G)v_szb7iJn8r=>~BBb_RRS6!IGaGm;L0j+lyq;^!!N6D$;)uD*f-{o6To_ zd+a6olLuPujBR@vR@%>NMMr;j4g`q*#h>$E+9>;<khpI}w4dMLQ~sTp_jlE92<RVp zCiH_XWsk>Kefu7$R`{#)&t*UQX4U3*VxJlO-u}ypKll2<!1wnQjJ@<3+~U!nCj9gb zztGqp4nG~QfAQmYKH%6l4(~qyobQgFAG!Y`yyzR3p1-kBUReVN<l#jr;sd?Pq27Vf zp?NKbsS;tjM3^#R>a{dK!cUPfei8*~qBN1B=gbeAm+^#uszwPr9xzO)Y{Z3H1>!uw z%OH+Q6wiD<?EHB98|>YHx+l2b_p-lK_N-?;-^0ZIv+X}z;Jo*}7^V33!?)QdzjQxr zy!ZF_5NJO3LpTLLYu;$Nyn|!Ug}eXt(c9mU{7>lazcY5`*DU9kEcFNTNB?vx;%S!r z;`GlH3%`Mdx~bqd5hJ?wJ?y0v_T$)1$9(rZd+t!qI?&~#FpfROz52Dx-~N{*^m*>L za`w73{7n$2V#7xf8~06oWA~oSj91vf?c>*O1|Z7wuu5h&nEU1i+NIJyrPj*NAlcOq z0o#=is6|sp8nsR1O7}pQZ<?0`q6mZ&N>Uk4y<VeM^%(9`W(-pPEsv+Jz4BV%&)ps! ze(P4=TI-8nsNegy^p$O!Ux(HDZ1cAkZ9m)h^AG!82wGQk@4Mm26Omq`amK{o-+B9q z&|Z=5_*QUDfM?t*Bch3C0&>27vF6AR+1Pizf9Eca{p`hoAD;Tlu9>Gs)IU58<0$n# zIGmz-=Jw*n=j9I{x>)@!|Cr(5yd6Hb^VMmNJ$h8M@aCh;{|U=a_Rs!)-0xM~T3EMz zQgq$?zyFGDN!fVqo5@S;8>A)7eah~Bc~6%T81vZMu^_~%S--*zYO}_L&g~i}HRK18 zA%3pyDZV(p;5fmLS_6vcAJ8N=_RW%u*PG^Vr-$@a4Nu1*$Ui%BT{-6)2#fz4^QlHw z;hz^K&*ZWSS^kw|U4(zNoo$f&dKa>V2uoWN$T8H$%uC@*X??8XYIR2z%(ZLx*sTAp zF*bB9#%4&>u<{!);wCE)p^ltomY8d8iiiJxo|Rt>F)jGs(MfKM0QaeM)?Up9l3Dfj znNnSUnVmgc*k@0lWec}_`(?>~$vQBIAU&NOZ4Iq+S`Jh&f+J{75xDat;52J-K^WsH zXn{o#RLlm-KxBw+Gz+=P7^@2PDs$4k<Mg-w8sb9a4fM@VkBP@8Rd~sU7a0E{>adc8 z5*cyEQIl%0;9Bz%kr+4D@QvdY$Sf|=LnN9H=&dWXki=F^;~BJn?>wgRv<z?oYN`Qe z3_8KSf)lk&2T8jF9XpQ!-Ns}q%5&<C1d-5=V>laA%wZT^j;1gY7FyJ^wTn`uGoU#K zU_!l4M79moGT%C?5&<nzJVYdF53IzuO`68RVk=}`>@k9mRvSbVD)YdeP7K!p?g%RN z9^4m!fTq(O%%O>p6ts5fWDZjwDIS68gvgWSL?!%Z<~seG>AXY}bA^t*TieebT_oD~ z&J#d9B{_aZnXu=<#7#Wn1lh+gQJK0HkZu6e^Dj})5OqkS+B9ob0Mqy&m``jy@xg1l zv|HnBAw1H;Qo>BEC-HNL^}8{zC2opnEpA|`x0EcZjMd+rVcM|J$=~lpxLdj5d6po$ zvT!e2XRB`voj1k@N!eUbNi);lEMt=9tjgiwIW}->l=XC_3`zfZ9!9`J1)^7&rM@a? zj%#dqI%q*E8mr7={eBhN_}j|GcRbW_Evy8qJi6N=+r}|M3dm~(?13xw1I?n_1g67% z8+wCS1T*SD7HDteS&yd`9#OYF%0Hqzg!*a^iJ|+RIQZ$yVe-fWFIr!JCCz&Jt-tRW zdeY}tyEwKv>8+G+M*i2Y(+|FO<k!lb!FjLj|BL*^w{Eq6?`=f9W`FmchF$A!ciwyb zEce}4p5HDH-1blX>mP3Yq3%xyzF!dX^-mx9*OQmJ|M$c%=iPq%{_op1ZN^Aq`z-YP zwYFzp`|W$GU;gWvU%o0?FAeZ1d*)zff7IviD89d0wLj<ji)a3O*zG%SKc$@jf08jo z{3!@12iyf=wK#C)aRbBJ@I;UVoxmKN+5!UctW2E^VS9ilpV)Wg%%@#Pw>)FK`_f+N z4_^IzbJWYs7oGjBv>%@?n{ggszbIz^Cu?`$CqFs*PVz>CyZ({Lv7bvnb$fcp|N7Ls zy?K;-w(azr;zOUmGx>}@|Ct`q{+Hu#{EziVJvWYAeDc&E2HgV3UzmBR2E$<Yqi3J^ z((;4hp&tyqsd}d2dtDo)w=VAaD`Pze{`KGNqja_{;b&*qx9=R@H@a?df^Fn6?gOi9 z_>Qwdp^Jd?I$jj{PIoXp-B24z7Il2zuZX@dK62`HQ0f24<J;WMJ$B%mS03%EOciBq z{Y_C>#-qVM`2rms@i}8sQ9t|J=7gt5cif5iR$5u-H_p{--`R<P(BxaK&Q-rY`^A<I zUYmcmXZK(Iet-PA!C!8B^M~`#94zhi{GtAtzO%b39uF;<-5%ZZ%)-yy5K`WGx+7*| z+YkH>{BiN+d(Z6r(YR>p+S$-2G6wcNf99Ku|J<VeJZa|}Mc=8}d7?w4!gN1Bo<YKS zwc=oG@bZdoCXLEt$q(?D;UN{SC6?z%g$o7~(>#P?8h$AIYImpX*itRse&cx6jRRiB zCHI||&EETblYw_*Bw}p4r`gn@Z8_|{tDMi5XAF&>p43%t8A8bEj(L#tE-u?~ZP&;p zMe^OD9ap~WD*NL7r&!OIyNXJ@trw;X;#lNXH+fQ%{JcHuiy>z5hk<jx=!JK-b{YS7 z=QG>emUb<cW!i6VP3+%t`*2^)miDAJ!`Ux0SagnTFP5J@3fl&TAMhr~0lSq~P#B1) zd-34}JBPn=kN_%w1$~l=)!`mxA9lP)=FKVv#EKE-vhdc=o3YyM`sc3&OV~QopZkIL z=L=QrAtL;WYIV?37}ZvCb?BF=HxM-ZADZFyC}7xR);Vs{6T9Ydf>`)dYZkkS`&LKN z5$0?gottKla8r|066w@HMbo@YiuE&-PGU7y2dd!^%A^twvz8lY>`1@RF6)fbnoThJ z;W$i=j*gQXKKj_$=*YMUQ%uuptxl=cDv@^jkd0i~Wh2ux*4EqWM73O<b8XGIm3_mZ zK1fmoauRTM-kK(4IARz9G5RJo$@oEp_{+tt6>^j8j^P`K^NNNaJHDboMI6RA&eYAm zZX21OQAm_it;-{AHA<CwX?_Z!tS8m~`qSTE`{Uo<dGpVI{?luJdZU94O_kU826Z%j zKP0Eg!c-GhrZTH^m{Y}{O`%}Mez!X;=^neAv4qJQgAMT_M0CgI^>ZpcEe%*U8Vr?~ z=HKWT90dB)pg_F?8yFZP{)KZJSv5SC!kD<iI=s|8=vD|?2EAr5-gn61Y%lq!b<8Eu zJ;K@x{Kgl~{&R0>kFR;4BE4&*t7v|D2KdQ-zUx<SUfZ93<)hEs_U`|6nN6ekMNayM zm(IQNZZ3LjajO32yKQmd!vn3o-T93Qg>6|IaZvnj$k1zPh=ejdH+?=8Q_LfalNWB~ z*R<5NtMhsdWv~d=3q1%6S1_W`O*EYGMm|vGjeZ_wk_6teryl0@;zqO9(YKU)=FpD3 zdim<$Pfp`g>dzLIZ(W>=Iz1ZTp4ok>im{V1d&azjRDQ<>hk^FQ!sdU3r}p@>+V~Kk zP7k*xC84c&;mVay6ZhoCgomd^20d44&?wylmTqkKer0oDznQ7}O1}GSZB6o_qesu4 zI-NNsQ`wdEhfe%+$LYVHz)D&~X#yfVF@G~CX+7_A;fUMOi^_YovxPK!<xqz_ri2bZ z29Ui<UFtBk1X~iOB~TW6)r`kvC6ZpWJFHB-X=UC}Ky<6E@1yf+|2&m>BKvfa+ZA|l zpWabi+>v~(?gAk?KEL||ujJk{;=-7l=Nb-$Ps|Xa@@Ieg%g3Jn_2;j@_wSEBd;6(! zHnMQtFXa56{a(59k2W(~?5Mt0GB-HX)YjBm-`>$TZMJmox;UEdH4z$!b-h6JR@;qX zgoyix(rdbJhun&p?in7>LVgzw@MPHuh;fcV9a@kK*mcCX^s)0w5uJ_9L1e<BW2s98 zafQyIGW<7mj^RO_gN|K#|5DDeYXe6vHTZOUoZfZ7!Y+2Z-`KjV{OIWd!gpjgJtVA6 z5*$*|+*4Os5jrL#dDZ>pneV;u{IgGg_nGfJ{hjapxRbTj1clvu?}qoc-@jLeWyFmw zovn3^jgEZEIyLeHm+e;e6lpt?x%kl8SrePe$SBCo%F4^i&&bY9tHQJ=bS+uiU}gYp z2UdcF3P!iU)GMrN(@+}fCa56dW<s2F5l<gFg<~KL?hf_J2R^vjVU4=aygZ=B%(G@f zZU@h67A11)?AQ?dIwzT$TTo6*=I8kg6vdo$T!Xn`t=y=12<yz5QHz{YtS)ipj4)B1 zOvo8>#gcF2BqF|y0EvCAOoypo*k22xMazQ7YNbJ&_Z|eLLo!A>gbqOw5j*m35#T4? z35<}zjsk=?-?`Lt4qR4!Pa&AOiQ+;$tpwC*pciW8*#K7p<KyH3&kk2aH)qgog|=iq z5vMqOy9Y)^A2yHtm#C`?s$@)H+q2JRFCyk><VOwO+aSuX9=xlCnjC(Wa36i>$Xtcf zg@!2`f#+3HH&phq72YHV`#-EPC!55`)+k4qv=PhlH!U>IvF-^bkuYu3QU+jq!908` zXzGJb#tL@z^bg*dkfdj3H%zDJ7Bm==Iutos^3QAP(xE?}Sg{#b8WVtXm`V_)`<+1A zfj<B&4R8Qa(4kiP#d{95L1OfPz5F#vkVa#i=f;QOo=LOpnubRB;p*{%k-7@yKshV# zsNyo2l0C1x(8_N1!fVUKv{dfdTW5Cqc_yDZe9PnR$H$Y89j!RnyYnhme)2(1gfAe) zwiO3*g?DHG`<fum#P|;G7l_My^MWLBz+{tvD7l=g;F3eLp(?$zak^}{x^f&oXAP&x z>Os=#SbLMEf85e+FSXTKGI;{O=QXF=kz!*d+w0p8r=IaE_wG0sm4Chc{N2yeA~SCk zpKLF9qs_{XvVxIBtWL2xKKjP@Fu5jHvO(#lps4InQN%j-)$vL2%W#A7f_vXK8^hr9 z{9<xfc1d?mPfH_0N`_p$vA@y?vwJ9GX`rV@F<)XWo2an!09&)-hhzzP&@vT4jpHHW z30aS_TP*2Ub}na@jZ6*9wKSFHV7?cAy~A&Euq#hR>TS}iaDREqV!MNtUWdq#KS>xk zYy!AX>(q!Id{v)5H#@_|hAUdl^$Ex#ohnmImd=fJFg8*#V6E-u1}e0(Wr_?|B|w0P zCW#&?cis_Wh)8X6bSk<Qe*(eip?M7;z%#+sBPJkf3HI54hz`=P%uSt?6RkH!qAek0 z4kMZzV?vQeKW@d!bKG%+3wegp*b$o%MB7eb5`m5IZQ}<`o}E?=S0A)+-%7??n3h<T zacYZXooOC<Kv(dc50b9NBzPEj7mnJ3%K8dMq`hf*G{b`F`v<L~ro)1z({$g4+%URc zITwC~GPEHAJ*PTW$_sTN2>|cYVl%>FHHbp=5frK5PE*(O79sT)J#^A&!Nw+{jKc-t zdk08zBzE`+3hhDT0$ER>AawwlAS>r9zYpG{bK!dBm-pW_B-Fwkvhr5W@7DlEflKXR zZlMFI&uw@~=m(4{1Sgrgq<|@iZpX?z2M1Ck#8<r2^cAfkOtHZm1Bv?P`8r5s><&{} zU@Nk}XfUC}VS_oTK_(12s{oL4;E2hIM&trL;3yC$A<_?r5B@zp7s3`oMBl+38pxdx zE#zUvkcS4GO(dK`T#xX4jNTRg{=?IwCV1l!HkBY-r0pGs6yYNbh7<(j!=nzXn#4}% zZaNdjSs{#xf{+}vMykNH;ur{H^osE&^c6o4+DXu@H2WZchc|62Lp`LOCl!%MsFNoF zag-3MgxsxCi#h~rD7v_6d(E2Kn(CVBDqD>m7p&S+!&Ni<3WvE`gzYyrk-^Nnv1r%P z89YB*SL_56P$w<{nAB%Zv;^gTbk#9Z3qbQe(0$L92jtf+BGF46`{s%e5lx6JD?fss z6S%_)jNmT|*imE7CQ>cD%_F>ETj3BP>h2h6Ne^sLl(7~hz_gr8MA}SWB_^2+m<FAp zRTeEUP1p4x@nzytpb4AxNK}|JoNdx$nFeOfvB{3p2vYQH?D0Q}T%4VpoL#WtlMBwA zMItAgv)ze_a1%ey9G!5u-r$7i^b!3Ti9{=M#nWkp4S07$7&&-?3g!Yy9MAg?8Tqc} ziGh0}u&)p-SmfsuR&5B5y`cU$<|0z(-YTe8gpO*<3#w~Mc4leQX6v)(Te22*W~jpl zwIz)RxK4QG7;9@;ePv4Tu(d>D%)Fsw%6F6Mr;>Y2P015q<{tH5h!}%AF<k>wV<d4T zZ%L|BNOH!^DPsvy(!ROYEaPxGQnNaXZcdjYqtWS)BD=F5*aA}!Mg-(VoYUjZP9hf& z2Y>hyiSW>g!@W0<UM0**&O>$t=>+O}_1B2E?sq#~QIr`SyarUj6AMaz<11zOVCz?G zlaob17bAu78e@m<9tqm~$?@%Zd)@DxY5wPdyTyOa+L3qm&i>%H+9mZ;nO|&4;fYfJ zk(@&vxd(ld^TOs?^FF2+JN;SL-?!h~T5%}geBkZ{R#@p)i<zj*-eW~E?dd_G{xRtb zkvFrmx-N!gTur}+x!v5z;zLRZ(;uy(hd2GtNA5vsnGu&i`<}?z*$hSzIk|G+6Y#`O zx8mz>e>dX+@xw!o=n0SVN(2%}6HSQG`M?w3`=tIzX+Y!Xphk=&{G@3GgF?{FUyYj3 zl$(?GGmagpdAD_BTiyZh_{+725>5vA?XNtQzjycB!DmYk<+@!8X5#YEsqorc*U!b? zlPB-0i$B?Ls~QpY$#?6voc;9eoQnw;PITM~JC?s$!P47PFCg_h?9Tbr@R0CWdBp9y z#q7z__@;bu?3IEj#_qMG%y_2T*o(gx{m<`S-+8y9vmrO)PGERi+ZSMf=lnC1)86@_ zx%H&$8o&Kl8vHl>My$v^{=Q~7_Y=|YA}WLaTO@iNxuy<P^FUaLhO8Bb1gE?T1U+cD zAXQ@&$iurN!stQdgLMTFS&g-j-Rf-2Lssn5xo47x&y|jKH%yg_Z{AjxN~%YzG6Hk! z@`pU@Mmy~6-Q~DAd0O;DPTas;i7L54=3jtm#b(ct_Rza6O})+4#oZAjUWj3gO=KW( zOVwW*)l%=@J)rKNxm7p0FgY|Mo|jb~Md-78HmxIi5(N2!C}N_gIOfW^Yavmwv2o$I zKHMOBW~lI*F6zT}Z(nYUlVsLyuj=w!Gd)+nJZvcTef1+<j#tg>YebM$-Af{Xey1^* zKA;4x`y+#y$U`_&e3s`Je1lUS5yXbSNnd0%2(PRY!iV?Ao7>E}CUL<G?S{_#uOI#G z(!KQLJMO!;Y}tC~X7n?nk7w75{4*YTO5{A~=QQpo5`}h(N+U#~hvj=jUsK)|iCha> zUH=3fCrlM0yiP+p4TA!-Xq@Z~f|QJem7&&&pd{hu@em9>%sBB9!QVoV{lPhQ$Efu> zC;H8=f{y*`@9%!_(Z4_V=f8fu$yN00nH?{V#)%$t4_fqg9`_Q7ZVWh=$BIN>pF1pi z#rR8+tLQWKgI6%&Nm2*H8P)R*0U{c*02B=|f;PtKV?0c&h4?W|WF*)f<GMh00YkDj zS4UQ{Vi=1FvA_U3yXlz-Y2HrUat{dm%U4CB=U#f_y^r5}^?!f!>)-zF_3uI_ijJ8_ zW1oDg>BduaKB94Nk?3acnwn^UJ-=7<g5?WN<Z?y*_1|OMx<3GOJfmB9jbK%OLx54R z2MB1w3sl8qjewW~KhhOUFa#)yvkES0iggG=z^gG?kW#~SW62QW#d=t}h)&>+)iM)? zMDj-_qm2yd?pSh+u!ZUlk_?bkj=fS$tc76)N59;K-3q>ILL7AoyH1(0bsVxSsTNw3 zj|I`l&s)OcBZ0+4FK>S1S3mvfZ-4o-U;X-5zk21R$3;$gNso&}e`BvcDG7c`enlj@ zJ?fk}@`v}I9m;<B-3-;vSKO_aM6Y3w4M#|eP$ixcLIJ!b%6H*PbVTrFNnaX35$H<l zU-E>AaNt5gVXoNM<R~6B23(#?3~qHFNtEX>)2@PWuXbj+H=3M!TXWT4$GSU1yVF8$ zPVBre2qb2XpB+lOIOX2daiXTw>kJfxhu`3V`fE3)iibSYdOQoa4lpk8!tKlQkccU- zv+C%exoek)6V6GlxL>>>K9|?&9#XM&jwi<-U`DJFJ@We>Klk$&U;Fc`zj^+*-w}PI z-rO1g#v^(C!8Jpll^ha@&J>GY?w2-v^P};J*e7mJOp3j*{UlixWSNn{OCy5dp%GW| za}5sDbcMfZ9KmW|^TP(7^?6nSZ3G(fQ_||Mc%)=79hv+*t~2TS(B<xwGtEdR7ke)U zFq3ER&07D0oe5YHdgh{6xLaITYF}bcaN~5kBqZ<L=$*U^SBg9|;E|l+f`qd2jNZfq zztd?xDi(n}&)~+eqQca$#)`7qboZRb%GiBDJxRIg)wfR-<yXgc6vN44qCat>U%0qJ zY#({!7eDyHPhNiOVbR*0n!mpnvHbel=QeG8dhORYIXgZ4xRdCSAAoKC>-mR7q9<SY zI!0Qs$Rh$xlq(2wYMo>1ii87yLZA<iA;sX34F*R^qQ&Zj7jI;0{vU#D)L)HgK5(w= zLcuU*_I8Bj1zo6QcE7!0O($Be#6b`)SDusmhDlC(_i}bl>FJku;Y3a7-SP`vQD-kO zR&+R^w`K0)<<ant^VK!()&4!qoZgw<5_kMkX<tjW`{|}Y_txNGNp)3iO^ZiKV{gIe zB?WQG#y^N)Jds7U#?>x*$m#JlqDN&=7|$Ax+HjXQF|a&CFg09YfsyS6Gvg^ibCALl z{#N@QHv}C`9)m-z-8Z7aC(Z^MWLD-k)UZ8CbYRyDb5E<rCn7?oIU97Ol66)fo!+!$ zK{DTZlhUeFF+CQ>(Q*;}tX%_J@pqa9%6CV~xpLV)i!8UwN&~RdF60NZc@3LgG9WZ# zwIjuNL2b6%>?)l);^u;B2D=b$upv3#4h^Eg;%pmx?)M^BS7#SjvNB!PIDrH(J-?i2 ztQ;@+j>y^7#nnaR<if$^d=!sR(h2q_EOi$$K>0in%nJ%SU(k&tHG)kgtd~bH1x_Pz zh8nbR(etR2VEq?SlBcGFq`aYV-=V=KMn+pFEf`0>rA)8H%-on}9uUJ$);O<s5<UOr zvA?VpIhmYAE;bx`z=e(?6^~RsbQId4c4$NwJUyW?vT4wT^bs6l6ai#w_53Zz)TV%u z;3HsMdN2uwceH*1N9%Wj7Udl}v?e5VQIZYQJS^ZQe3P<VjapDs>%kBL&ZJIF{H&#l zpA%Shv6h*0hhz-iltu=>N;08mYq4;Nl`AH&?q1S~9kygKY2-7Q#kkQuxkPly4$=g( z5K%A}<QyClA`f;7%0(aX{!$<Mh!hk*L%o6=*%8!T!Y{c6xL(GfrxzHS@jgCaU3mcx zFeRm7tHTGwuJ6>9FK1_4nj>clx_Z@7ll8UTUV~H9;c{hS100{Tv-zdisM4qLW+tn` zGT?=bVoa${hXhZD4i8Eq7g_sxWo8Yl@UHC0olq=-<)6t6tG+Umsh%oO_A3+W^#$4X zx@uN@tc#7iD~gIRG*+!lxj|uD!C^vJg~7EUP|1lUyhs=Yo)ZicidgV$LB+`vK=kcD z;wyIcPMJrmUu@y+oGVq0389rs#pj!Ydh4#1`sLgVSF?#b`Jsu8tShMRc5wb-9}O#s ziVP~wsgKQ#jOxwwYDGFuXj)uiLTpM^>xs0asD5CRUc&AkJDQnvMVTL2?%(4TpL*a% zQcQRklin;2PN^kqXo8d`*eQF4qii98J!p1RhzAIvSv=!A5VI5LCTBhA6(PnecrPS* z#O`asO%Emxa_q3;xMy)>N<ng!e@RVbaDCT_^Yu~P6_=~LD+hAtm@+gsDyfc*N3?g; zWE{%2vWkqvm|&0k_^PPTu9S0~IyM=doSbwoEIGmdRNJMC3zJ9?yj6S0>)Pn};k<(I zlIy+Y-O&egvqEmQGF5P4SZd`eS~RNiV+4t!?W@Q+!bvNV=%f+25B*0IFw~cVI$1&L zegK^;jl;&&tiqF7djD{&gr1lSZp_RWE*Y4g2pm(+PZ^oLK$4Y#4TSTClu~VZzKxZi zDmNu1XevYH<MY#_p%P}volYsR#HCJ`Ck`jpNa3bWMWrmyCyM)0XJr$<-t*GAh1z0u zN+QxFiY9Z@uoVXSN-%wa6fuwhBaL?^GK&P2Bix304s_O`m#8<P1o*yNVNQy%lTm)( zbh0v6Y-3;>8-;{x6wIm1sAJ9(v7>WnbQ76t&}za6YXlvs4Iu=F6B<xxDhVV;lWUfV z&3WD+ies8Wcn#nG5z*xXajV&ND-@@QCa<u_D0B#tpw}D&9om2*r(1#xLTZdp<pJBR zss=IEVmTSLIxMTQGlPkC*pfIi!`w2a?UuW+a;aKv!=5G16T`@(cGC1q*pn;PIWMLJ z^a|iBVID%803vqh?-3-+C`g>Yl32!Hkl4WW|4NXI46%)dCX?DYR0Z=I(PmdH%Qk5_ z_P%?L@znSLTd)}{CM|7CqF*wd&Fk*F$7l*1aU>)<s;sj^*yF{vI7utZ4Mv02vWOkV zELLy_(&sTdwrs*YvX<GkY-9``Cw53%WU(Kn7h;cO?3TEQA$bYfiM^10HFyTgzl}?# zmbp$lBK3^BkwVoh(ppcOmgz7$!wqo7GIl-OhzIj01U+u%$v{-+nU1=dH$K#QsPE+! z^-V+|$~?MCNq*}2KFe|Jl;rc_nA<~Xaic!I7B+IuZ|bb)IAbS#tN$@j5#`%|tTEK5 z=UU<7HShAB@q5Io3~%g{aL*$n)4TY5;$U6TvCg=FsH4kl!t27#P{rxSio?;$3sv=( z0!Pn>_8jqaFDgAY6z-XK%a>!94ymti&pdeY>>B~)C+pXjM0_}L?r`wtTO9kD@i?d) zcX80mqjOiv-oZN_gUt9vevo%p%C+*!qMjSM60hLqqYB1q&x8#fxq=1UD>-*oAv_8M zg|TcUb}T4DVU~cOGX$qNLoNibnWzPoN*^)@z7ho_E;+RvuZ_Le_i<^_{#Yvu>x@my z>_ns@(bL_p>GoMBNovm+yPg$RR$YHLNm__aC@vz<7qT24r?|8bm!5p&Zl*u$u3)UA zG`KaiIw-%OKda$dNaTEEz_GNZ((smolm2}H<H4QCZ%X(uVb9con*}w2&F_Bv&dUuK zUn}}@`pa!zNGdfRV#UR|mr85O+f!6^oq1h%8M{^ItH0*OT2rGMG9$u{q=>z+leO3U z)%?<`eo)0>rIJ1pM3)4VkMt9=4sjy(AY+Z!zPJt2fM*;Emw1YF6nQ~>avoIFs)-89 zSZ}4A^e(Tu+w7Z+$-lE#M(YOKvB;vPFs`#G=1P6plD}tX+&QW5#qM<FrD@iB3}%a$ zdtUQgokvtxW`XZSq)(l%mJPHe4dmZB6I3%*6?G!0+V{f9rM#i`yq?AaukkE-b~~2z z#=Vw#duvu=>A=U5eWm+fmi_CK@Ec3TU&N0lFqZ9gG|l@=>Oj-@&BlP<+n!iQ94ZYw z*Ou&A>$9Ub$)nFFcj9ajW7Y0~!|km|vf^W<6nYnCl!Qn(WXCLMI!Ya;2_r%2;0JQ# z$}d?Uc_Shs7QvHD(4edHZqNi!@o@X?oB@i&1sgNK+jl|lAx8FfDrVF|M?j3B0}NPk zinN8VC1NI@W15AV&1})eE!wf~J8nD*#erp}%(iS9yq?LHQPLHcDl=R$4q*T-s(`}5 z0%sK8h%LIXVLH<;&9&jVYKiF)RY0u3Y_uD7Xajl#G5AHh0o(GJq0TJGh<AY=LtgU+ zA$^+$la+~e!SP?QB37*peiVR6fg0;pGL%=Q<ZLUGiIl#LP{<0Gh!w3!nug78okbq^ zl4Oci@e2WjSv}C0sLT^uP}(aKe8h4z0ts;iJ~<4{ZY1sQc!i&VS$TPdJ@1<YD=8U{ zITrpU!ibNZQM1&6G;9jtJ2IVsHYv=d6_zKNSxsN3iRG`1XGl2F7r_g|LOHCT9Kx1Z z<`JxQ*0)T}U<8x(Vke0y>^2|*iJeC~$s(6x<+D?XvW;z^@tfF>6b^5PA_1DWha5&J zjoz?%h|thdJnZ+U@ff%dfff_uunxxKm6YLPv~o0cF>NHaK+`r7+_xN;V`Gx>0Yyfi zI#w~5)t8}Ss&Qlez;OCv->kSjX)b$UxIBEi69%3st4Wzq&hmZgu`y3ri#$>uKOjwB z?#!~3$15%rGp-^`(U>a^nHrUKW^v`IA)(kQGgH$SU3V$%F|Ik6E4i34s+f$KENali zOS*Z@V`4*#9Cjh&mP9)2!K1S*t)+d;@Mm@GPi9#X8Od<fp$wICq3zI2OAk>Qopyk` z-<f3JoibjHkMKHDRT-0guR1X~DkH4qvWn&BMU@<G3pkc}uO{P+nl1UICRYSso$_ss z=s4F_RoXbbyX%z4C^N;~DGCb7Oeus95>S3GE-~t`fBZS=NzbkeDQWQoY{|Dg-nZVX zIWi~f%&Fu6c_N&YLa)(lQ=NggAFDobsUW5(BBDOCAnxe-`UB(Lw6el7+maCzpO6rr z5Fc+(SdSm!V^3i5j6b;eM{$cU!2iZ4j6sjo#p50qFG{e*bNF?}BMvXDi;qq2zi+1V zU8;*2jq|)G%}>e*tq(7qD2__HpkdX1ZoScdw=VWYtE5LT+C*-XW(~VlcwD=E(L2Aa zxXe9Cc{Ezhn)Y8y@63t|imYKQtRS>dl6tyHdMw*LN*X?zj#b;sHwzN8moJq@737{w zXuRH?k;5^`$%tF+RdvOW*B(o#^N)+Vb2%Y9@o?ed#YpK)FI$8EzEGFgq^@K2798_+ zA_b&nkgF5b&(^J}57VutL-E~Z5vymWGG}K~FSVM+724_905|NKl#w}C(7%)|o-~hT z!o*n^uqpcU^;Pkbs_dTGS#fTOYA|Do&1V+(tEJ1?S<rBI?u@9^mZF}qT-|WS;-q$F zxQXdcr!2~C)6s)borBrN`cw&)*o<aqhGU16vd8tkSxed3%Jx|4l)k2FCQ~*cC*Y;5 zp=o|r;i^*3EY4UJq8U!%tkNjW3Ub0l3p(6cR;-yz*Q|zd#R_t-5s-DBO&e%uqA~1= zXU6E^EKh@#RwdL~r=aDb8p%_#j8<9B$ilp2W&!{8KqAcuZJ%9KOwS?P6b-nlv2zlZ zo4U}-Q#0N$N!G~Iw5#^9Fqyw*QN|kT6gJ1IR4Qked`GJI&56oadh${fRq=hh(r3m$ zao^l~uWcYVrN3qoO0h;<n>;K-y%LmOLk&o%`sq}lvZ^7-xTost>l8W(!<tqm{q{%i zZ~JrD!Gqx+AMJlTWp4cAV<!%r-Rtw&mSd;K;WxO){^Q(;Y>q0@K0p(y2$^mKC$)qW zXgk0(0L%%uy&oL&^76S7_ou==#k1mf3nxCy*x`BAWB<N>XfpRpUygz<{Bl~G#F>Y7 zJu2YgT#a?`aDvlNy%Kd!Ms+kLw)>pz4LaTv5hWiFnViemm3#XiUR}PUplVb^%&3gW zrE=iAYMco50L)rB{UZbu4&&6fXJztP*_=`~yC|KVnUu^)re+ow^GY?cIcy%WMl~~w z#kEEhHRG^Pt&yc_R(nVoP>7G}TUGr^=Q)*%Q}P3bYFfEwA>%<}L)p)%X5sLdF)Y}Z zF)MDJvLIHE=#7y!d{M!wXV~P%j%|vuIa&wbGYxe!Hn}tQako!1`ju&>M3dSnJ_aM7 z#W{y1zbOD{)!e}5iuRO?_ly?oi>;L|V(~s2=CDL*jh)qZSP?1{VLSE>c9<Vb9*I3Z z$njvsm-H+QtNCdylPfp2JOu;d5o<N9PYh(-9CppQfk}H8&Nhk%&UhL7cSIoDavf^V zXw6|Xn%k*vWcIjB=nz=Mh8ft01<=6Xk&#V7RBBF$x5kKK%`t1EvK#B`>g(+F>+p>a zoj!~c;hb(E%VI+Z?(+}vl-1elMRk_?wRH_Kx(9jymdvC((p7IH^tuOEx`mt)U%n3W zX8Y3ZRD{JnVw<`Oe6z-?6|DAD_R#SF6YJ=Y8q5tlKM|gkb0(nWGIl!1Jym%g6WKMB zem)bi!83jy13QwpiJA6tQqGP<<<*9|>%J!~3|l*ldi%)l-m2RyW~N||@uZiIHe}wD z=c$>>uROb@u=-SLR!72U=J^?BN}112xY(C45zn|2vDuz=2oHFUx|fDuoQnx7+~0LI z5eu-v(Jg`HR&0u9l|CdJj%dd|ryVWWwA6x)M_JQaO3THcz1gLuwHf4a?Wa4mZK`W4 z&agizJ-`m9RC-NIER^l4$bc#%o-C&;)wi@hyRl-VKes=w5`L6CBpBYAGAgsF<ZjlP zKnpvg@hT|Eldzd{=dRr@?efi@_f$vrc#Sd3sU@$(62!Ih>Pw4qgWB>-TN6|;n2W+# zQC)WH?Y#8CjtU!lq`D;Cx1rGw>mmnlif<*o)SZ)5aw*i#Chw$XwdS4Hc;EFtAJBCk z_IK1d-`K_Tmqxwe(@eRWZkcRHnI>HPc}QzkaBFYq@kr1F+NkAjzm7d*j%{t~$V;ed zZE0%eT3GYfTbk+9)Y8)0(bUr1+*(o90-8KgTHS^{V4GW78cUj5nn0J<*6Pw$j;9J} za$lR$==o>kwcBp7XWVndW&OTQ!L8SPx`1KH?(-^k_gr*K=`oLv!{ykh<NV$3u1YL4 zKUH>W^2Wu=GV_&l0i#Ds85eRsKEDD}+vB&r;*NP0bu<p$XuLhar0yw|BQ*gB?_^95 z_?C7<cADCYYp#2@T^(Z@pK}$JFHMvuEPR33X2#y@$=&4%7lJykBu2?j=3=A6Pp5+} zmIfTUiajk-!Y-%SS=jZaa_xoadbbPJ!R6<QER^yFs`MaRQa>dzvFDd#TRZOUI+of{ z-quiFU*23-SyR(iS=U@uRT9x!S=&}~J-P$aEl&pLme;peRy3D2cxN}Yl{B`MH78u@ zXrOI%UBN9Y_Bc&VzHAwuv&-g|ZDwxPFl(2o)YaHmN`_5#;#v%L+nh`rLO}?z$!>*a zVYKVcybK%CFHabkBydA4V>S!o5l<T;eC4xpJqoF{6wXk}Og4+2RH=Qwb_C9fWs`}` zOtX0edo+{G{F2RLG(_tmzp`1pg$6kMM+f~B+L(-BnsKI|KrN;@3qsw@D%K$?Gi6rD zO><WHjD@`jozhB#dHHgB<xte(fM#T7jxEQwwQtWHEZ(&(=k&H+d*csobK94(XMfs9 z2Yla4Ik+eFz_#QL48PAMRi8SU@oDgde}$g;_qD*yXXE#riuClV26K_%J;*y_3Zzs+ zhl!A->}1E@BF>in`F=Q4PIetOb1+!P*o%u&NOKS4w*2!z_K|yDSN;F#*TsXfIejGX zLYUW?=sodQef)fVPJVDP=6d**ps;`V9E}Z)=0V9$^W1tNaQO8z!Pl#ge^S2Zi=qo> z{^-+9QjWi`iZ+d6gg9{ox3A^9aR;)`WxTTOGb>ta?Fiqz_s)SYGW?RyCkF=J4Z4-Q z?{a!XT*UswgO_4I+n&)*h>t{m_GQ?oSI-^FIJ@~);Af{}zdRIk<9N1X%VZ$F8gmpY zFv%jv-nLHC0idn~YdbY8VAi338g`JZ6K96%K_;rkFu~T;p^voqa^i-&*>`!S9mJkr ztVP*;b6#IH1ubZe?`rR^EpKnC>*m^>JKC`s-ecX3)!68+v%amVy0fmSy&W#jx4Jv( zn>y<2I;)yns@uD(+Pi9+Iy>82+S@y9?XC|<HSzAA?##uZs=2he@#(Q@Bugb?16y^a zR+80ly@CzZvR41pY1M4hWK*BHNREGC=3lFxofG?rnZ2&9GfiB{>R{Px1DA`Hft5pz z2&j$E&2}}j@^MZ1WDT@Hc=n`DI#W7bUJb9huMPhLEGT)xUaELfpL1bUB^eLb6fcid z+L^ssRoGH@$52^6%$@`Gts$AMt^I9%oxQ`I9sS+?t*v$b$%%<c$@oi3#K)d!=Z`gs zxK2cnWlee#g6PTCq;*1(q(m;snz%MTKmMzF?3CeBO47B$E4k5y1s9KG-|UG=;aI^L z$@S(=zbg$M9_9Cvq9PkI3et|Bsogb>S)q`7p@q4{{tCurc{S$-gm&KytY*5{dj}&U znmiCK8NE}Hcs{>kPk3fX{jLdYo>c1J7m^;-b{?zj%*RU0f~EpO0*dy<ek&zAB&0F0 zBkAsew3~sj4q_|4qLZU45`r5?pu8cC!6mv;=dr2rsR?rAL{svKwc?1l2RRCEn?9%| zHgowxcX(dr(d5e8@|-e`$vwmUrA^gk6^E0n?iGdw2FK<`yA`OeMqumXg7omni}fiQ zCO&nkFsJimY*c(6(}rKY++WbsaA1Z_c;C#bI2UoEKBvdzivcdV-9Oo@uvc7H0}H13 zbYz+`R34M$-t?{D`oOTHBOTFRH^l93Q_L3B&|aI7pIaD>mD^;Xv;+>oEjP>9nxvQq z6(nFb9SxL?Sw{RjQybf2v<0C<NWdBhn{L0=AsbaS#;PL2C#tUx4lU;APe);%KoXd< z9C1%w+Q(Gk35^pCNxIZX>_pfz6E)CRT#9`MY^gU!it}{I4WqNO;gtWE-|b&9Iir%` zUk=*Sa+kxidel8jQElHE@GqVTiJ2deMh@2{VuR3*>FFt1>RfERjYv*5L=V9{jmh7{ zSXf36n1W8G9&$~>wRa(fWN$!OK2UbmUbydRpfcL0O);p#hKVL@f(F$*t3al@0smhQ zNtySXSv55<5n(YwO>o%j#>tAUcbR^Uxfl(4vOJe)IXwR51eAi_-p13om74gO{F5N@ zqLS$sC`SU@ve|4J4bva&zcVyxO1ZPhOxWKQyDhTJ?db+=tE;z}H(@I_%oyOmX<-I@ zM$4nCU5$5)Ve<ZaMhq2{BV!-~)Mm5vTMTS*XkLt!TlgOV%mm}rbtVi(H)cI)7ex!D z%ec%9qIy7VBU|}#Dq2<x-Od^8Qp{rEU$!A%7Q4$aOe@;zTe|FK?0U+wU^n9RjrQIQ zJTb7r<qj;^VMY}G8hlzbZ-)VF!6GYy1eP`a-x+ZjdH~o<-Y)Jtd#d%st*CuFPFzj- zBDUmnL?QCu%APrPy<pqUj;lwLa*q4x5c};c+_$^in?g{Vb_Un%x>59HK;fR4&54@- z%h!8=wVIvhqOkX#8PCLaa&mHWQm#+#v7KV)#6CHB>?D)K$GLfu6UQYUJ8_vlvu9@a zM(@4%B7}rM6g5DAgoGp{5U3yt)BqJEp^A_I0ip;Yipsj*FW79hPoDeCW<-(xf35Ye z^_BN~zwbk@&@nss+SC4Wv^8(83(rlT!w>9L_c;oh7T#Z>cJuF94P#jn$+IDG8Pt({ z%Tqh|xEB&Ns|$=3!?Zk>(lojtESA%peX`tb6cSGfrkUB}+HxLq1Y#eAf%c*V3N<mH z7GOzZm8Pr6()L6#V=0(+XD{-0k-Ah^_qE=|jAAz>SMpFitI3)nkfSKlf?uv8+o~&C z$j-D1H;L*ft)A2>tQU&_stYnf-9K0upm1t3&k3wzS<#1SL!@rVTtB~kAb<8?fLvUc z=ezgB^~8qy?(CBLbDJt*5e~l~O)F39Nx#>H?~WE1A01+=0Gr@yGeVJ*Q1@PUZ}3yx z^azprh$$c8%0=6ZYzu#rK?vuLFR|y#!47$AtzJAovX9(McW>X$+vLes{CsD7qP);n zYAgXl5wRq@yXmZeWncc^@L)E(3Dba5dvHKQB^b*W8}AHs4cX@zHCiOa3HdvSw?NqX z8l`>C*h1SX5F>i73XL@$AX6!74h*zQI#ooiijQXyWz!5zNqGcYg``ObtKcg~JH^?{ z9cXNxyh57H<d2Kv=yz}@oF}D}nVxC#UB2vD^9d4sM5M|Il6F{x@D~it`n>-6j3JIB z+?*Z0T!ib!fA(2c*^Ky@R%e^aF_aFPWHM7bH7`e9saFgXjmllq`V2W3xa(~?n=phn zA6G3*ownhEJ%r71X3_XiTCO8o2$Hj-TQphRukbGqw+7Mty~?r1IGVf<fYXo@x58`f zHkIXQ$CUZ3n%pkY9+H^!WnXXB6xUjbMdCpjSCq$@e6og)Du|Pn%?d5mII@)6HvG7f zyUYvL({1wY=i&eiE9^8vQ0*pI5Lok7IKC<4V2h$#;0{B%VU%*VpWN`*L{<X*{c%qK zb5J)TAgvCz<8aOn!@)!7JCZnqP66@Q5eP8&{26=;3T7Y(Z;tulYVml~mq=`$fTasY z?Ke@(hvh3H$mmM!2C-7Wu^l*9QD~%rPB#(<J1~fy;OSNfPBbvnH-G&ILH)<$4HP+y z!gqU+%<*3$8}TjRSe(bBW_}3XeFD^)kxkbMO!7iTgB%3!8;qy~OfVH25V+;o%t3TQ zUsvdw1fVbwa==E8hc9ILOOu6G2`gA@%}E3%3HHJ8=JQL#GVPbP&h|qp<H7w9@^&B_ zDAZqDYe5JKjv;sMlR4=9<r#F0uC_4}*sX3MdR{3UgV);USYTf-%wOCQ)b!O!!pzL8 zUHVPkyB_sNnGQ*zdGh{G!pQUyG7F5QZK~VZs<eVQ%3-<g@alo>u$SF)huLty2D{1c zq8z&5V|CG7y_mJtLJ+B@vQ$znXT81;m`bmJuDXJvFe~n+tC<#qwb-46<q?R%yqtkH zT`3|c06M=3aJfzv1mw*D@7P$yNY{42+1(0cbgsg3rCRziKGf(a2;S6l%U*J4C8f+a z6TEk+g$=m-8BJ;04?@U%AIUl@757;goh<}_N}sw>T2AvFIOO>s-N~LV#9fTMP<Ha+ z!)Nsk!V+2`qPJ&Qv+B9UOZPfJUtntX=%q*VFqmz0heu4oQMs;ur1gkBvpcmmd4x89 zZkXkrKsLCG;)pOa_64^6VJ9CHTOGsa96E7ybwf^M>n<G}m>sT6;BpRyR|nkg{nf)k zr<&bmjyV8&7r8iL19@#{EWlKt$;R2$#Kvm_`(mt8WyQA_T1FBI<^H0Zd4l-gjlaiP zI-;y-<v!|0U^3z+2TGc%<;YvsO`cenO+*$>Icq00LzNO*AY<|;sfafjAGT5l@O4?! zh0p%=7+L?RkJLR__>Qo3qJdHuMU=Gq+HPSwAjbU#xExL2$i@2PJ}MaOdBm*~mdxE_ z^-`-V+8OV^?e2MN{bGGyh9a_8s*(S&w^Gzbly-?nriU6eh+GRLK(i*=*h3BaPI|{E zncGHrS}kdi+y(Qqj@)g_8SNEQ0d8R8*&RN_CuY%!w*2{C{Ai1@X0Nry$fFWO6oeWC zWsd~Jv8oB$AftsmG&bBRrL`=`?q_WyOVhV4%{X3Km2PaXCkiEjhwn&-n<%@*a-0O$ zQxojq*LQO8CgguYX4KCP(5dY42LmK#pv7{rJ{PL`SYeOs?H``Z`wlfw5A58k^B$U? zrXB2tcEeEj4lOETp`+~xLg9m>LojBr_4yqX&|6SUXWt8NBhTXQ@u4bmzUYZ8xuDw# zrm&vN>Le;2cxFiJt}f!*1oHz+0wJeGgH|5Qqj0?pKQUa4Yn^gWHcnKNGbCzFq@o|- zoAvJ2Qhc+RgpiWcK80ID6Xps#p}t~_@0x7rDq@sZE{qSWegu{n@gT3&Gdx$%-(Zfm z)zcWvng&|yvhe=I8S)Xoy)>_6JsvanOTo;UrQGfoP-@1u2%)BhDogqVNnSI$IATJc zXQvka;=nL@d?Zsz<m^$CtCMs;fpHg>?*_oO!6pqxGgu@qo#~$$JI9=ZW5zxAA;-nr zr9*jVH9d&VHL(fmnXuEmw&z_ZO+?sI=*r8m!Hzz#%Bl17csLOIY+pBQI`@tyxGJW~ z-FrTByUb4Gde&BLP0**<7<JRUUF|Oa!3kM()<3k%@7S=nyTkyOM7iHKZLJ^7vUly6 z_*?hwuX=2|J>Zquads1J-_+@K1+{W?s6o39#HN_rBMi-M$C4U57Z+|k<S-nGu=W#s z;8?xNuXh5H!3U6b7v$1SA%t0B!l4wK|NoHF5b}o3F)6Ft$b?c^au7ry{lVgmqi=}b zT-lqOiY=9Wgb?eg;QrVX#nX|XmwjXs!jqzX*MB~u@i7+tYtGGyZJ`bB5PZY3LG=eD zlGEwA1YC-K&GCH>JwLyC>1TD~2M?K#a1Riwnnh(*kIf%sG^KyUxZe)lFS0-G>8e;u z@A-(*-^s6@eM<*d_rK0Aqm&Ud?sI=M7W~z136ggk;J9tjMyGoayNvF^V(dfF&D8TS zXtKB;+Fjg;`2jM9`tDxX2QdUv_ym~vsnLBX5*dzRkT!S>sQ^Sh*YjZb8lSK}!u2*b zXAs_n?4f+!r=m<<?L^vLD2fe>Aj=y1ERV4JkpA9i{#|~itu`OV>3d@^S6I+Gnkypx zWDi=hV_wcR@f%0~B^pLYkq$7(F;EHXH*Oz*=wb8_xUomjO#K+0uZ+N!ISdbbp=vXV zAL+NCFc}J%5<tm8in7Ka)MrM&0lx~1Dw@Iv@qi8bahL$t`dz5T5{Ux6{`eGXBfv#n z4#-&3ZJUq7uS3@l0J`CppvphDNCW5Y6hY$!^lE6A0VE(OT>smNWvE7g&S4-4U0@XI zQ6C{q<P^+|%WVb=VqZtHDeHoBx)BaXj8d<Q(KLFScBM-z2gPjOMpMQP*<!_yeFH?F z%GsrX1=)LJeWl54wJD4c&i&N|!C=ncIVlm_^W-hrEOW-Jw6u22G`KV(%2;UWOQ3hS zm5zc6C$(@GNGVyG+Q(8ujtAfScnAk|gxqt3PXNf}_Eb^|2Zq!w*1jCdLM4G-K2}Jy zFLdPyD{(;7EUY#^lvUNJGOdzy6D6P3S+i24OdHi0s{f|S-u!H(5KKpr9=Ak%RKG?n zS}Q65>PvU`{*!z|SJ4oUA(qW5%L+CKr6P3xh}Cs}ayG*#a^BTqtCCbo7L+;(juVt? zI7@-*?%1}!k}Am<=y@--#f<RwzP3_f$5DTiwno?gxKYb#29Co}m5QpwQT9jR7_1<Q zZFss=*NN!6?B-)+X0ldbmb_eZ$4S*-QCUN7*_hD7E%H<a>iGQb6{Y}2Dlkn^h1%OR zbM16d{UYApv9zo!6pZc*x{PmfJB14h3h4~#(~IhPd{OT`k`drsC{bT$A6g+a2MRih z3plgG680E<6_iuo0n@_DZCLElUE=*o-}m*HcNuKVeeW7@0aDE{#cNZ2;nF3idPb^P z%pGO<CKmH`^c<WdE6v8|R<H7McG1qG!XfDrJY^2#MC4A*c&Ey;X=7-RHkJ`YcK)14 zm_Q;S5*HG;%cLF4Wm4r9Uy5Y8ZB_}#Gc$t+IQe0lSrx1pT&o`v7hBo>vE?RWI)gDh zr>%aoTEAe>QHr1#QK7uiEmtgckk+IYpc3)Zbh1?`AzMqCs&uL*m!?;H3qk79h9zz} zzj&3s0?fJO_Qrg?-|+o{XtW=?CG9MTE=JYA3|*frrY)}QO^lHOEnc9<1o+-i`wa|m zjNx{3_Y7LOKre6TS_vNf0r=Oyeh`NLLuC)J#>0o;?k5tj!{0Dk4cd(ZgFggZ7<dOz zXW(pp2~Ma&3OyOn={_)+Q4l<hL?R5mjG?~=3Z+6brbOyK5I0fcCOQkou@8P8U=MhW z1>v&Tr9Kx&<8=UK#*Pw+R}l2&O#l{f<<0-b+P`qU<ymqjX`=nZ@#aTAk365`b4=z1 zDWe}u_{0_hOMYW}_k|Vq8}1*f)j1zg+6cqHD5E~my?6Bd5=pK40_M0B`<PO>Sl?=- zds<8%=P22^ioVYtffjzTnO=ghpn;nast<4YAo{oJb$C3Q0~FF=lplNppu9H{oPFSw z+bz(m??xgH*7Zef7>q<fe`5*v<#jKn1QyH{@DNA8FYWfLIj$~GsBbDbWS^P~an@Zd zY~8o$+ywe<<&czpHZG42F4H<!t!iS>++*_5K`Q>8c`y$@IlYjlDWiZ=EthT{i?|^H z)t}4H-IybX#A_TE#FZF_Gvo~iUagZaoKjU5rY~o~6zZ8fxiLBfJLGGQovjs`etpdV z5ehDUt#{i_S_DzfrX8^sv?Ip?ZDh#1PSHt<!r((*==a6ztMsxt_U+@^DN4PpTtV!b z?U?GGx!XRK>7|!~Fz%JslD+7>y05;M@T7|Hw1y>7u}D251UZqHgU#l&q`sOlH$`?= zQsz)J2kq{NGbQ-Wg(g#vv5VD>7N3C~Va{Ht5_U4#Rg((?bXw4mrD?QJ^-R=>Z&dZ0 zU^WYl)Dl%^odmav<|{T_CG25R?>RDdFj*zKyZPKF3g#mgo!lxXLmI)=7ECz?9e5mr zuW0z<d+hZbeolcPHq_+2{Cgt#o*Q9|+InHFT|0l-k(NmsJ6t*4N#-<7E-&8^Y*lu< z9zj+vUa1n>&`ICIz--4e5hGJ37t5)$7B+qy?|mv<0S;TmQ0|aYMq3dWX5cvrYMX0w z2h}otn{8l`IMj#s%JC>xp2ltwbcrUL1d47(-)c#ksKdk~k5tZlb5<<{$s5gRrwdy< zJ07@@rfjvQm^fnxoYd0A9Onf;VQe!hsJZ%4D|xvK!vZic6Z2m-p$d2~lEj)%_u%_j z<c(t(4;TqA2nrWep&U9igz@z_b{fk(+h|7SVR~1_4gq-G4s3wFc5FNR2eXpM<if7l zzqS$FRTK@lMz@u4F~_Dk7&w@-Yy<;fU{D9WQ*8atW=Lg``4x;~<R5}fDq$;%=|NWW z%0a+!Iy^05>vY<UFjW<~>EAUG66jAFmqY!U)1eWNS0etxsKR%!7Dtv0J~Zeva5pCP zrz1w+fiuJnT}%#~*OxXa=!MHih0O-CI)EnNquU@91u&Ko-C70687N}#SOLI{uABoe zCAjH)E{P!>1Oy!TlTe@IEG3qTK;ETdFevnF#G?MtH|Hg@>bZ59H1pvEZ&#f0_4!11 zUTcGE(8+=|F$^Fah~yhvMbK2^;;J`L4d%y(8y}Hi7&S%!f~%o2P|_*58an{3k=-Lm zR7~B%>}w;&_TB|U3R+V_`8<fHX)wWa0ab&|=KD%#Pv?i*OK&ZAK~D-CV-wB3ulS|4 zh0Ipz;I#ZY`yVH_a%ZgBy7eNip(+=mTPd@@tr*qh!mb_52=56C4K+G?rQ<=#2qv<x zgM}FA@K2{A=4$vbau`8-2a8^k2ZMl(8See_9jG9`cLe%k$<AAh0Ph>D%N=yGjbdBp zYK0yJ508T9l5GP5R64Y`d^zX~m)iOC@q4?BJE9*<sNc%@k;rq5=6=}zLC@_x=G`jT zLD47A?%94ZDf^|$l#w=2n>`PM7XCI48Qz^pAaXZUmVQQP8U43sqxtI3fU@~3NJ#?y zbGSKgXu(v(EhibW#ig`SqIq}=aUQ6P1eNuh#W_VaXQ%<kdeps`#)jen+182@At${< zH9uh}km+-EpGp=KMXk2<@-4$l!(Od6{%C>m)4_Cf_RE>?*(SEoOfI@3yw`g4?x3EJ zbPdkO{IZ9($7O_{JZKkHEW@z*zdeE0vp$KTmG|-dqBLpE?7dpm!>W>Ka;>jBg9-FK zYlE91l*pwIIRrTpZ_;#G#2C`i)r%uu;v|dD5$qwZb8=;(rdW((6D3OWcGG0Ao;6Qy zSw!rTMcN_1*4xVAD>VrtHf}81gz3O<o^7MOZN)m)zG?e>JMM$@+3myza%&HY4>bY= zgxjEZF}SY_9hseh@DB9HP4V7xqJ1s2{{F(I)On^^55{)X!F4V0V6oMH>8O40xFVCc zpwsPD4BOIJ(^PKw8HC1-9Fu*uxY<7^S4l!h(JA%Fv_%q-ae3725+y5}VOScs<T1+g z$9g8`wRx?M1(Tec9QMW5_QNsoArRpgN9WQ|xH5;Zy_p(21zQF>l7R~W`Mpf2*$*)k za4rGk`ZZ|gjAEw|fPJJ6*qW!GgFej=poS8J7_NAJu|Ss)&&~KS=^XB$+0_M2gODwd zyr(S%P|Z}!^j`AlU)O;kIuc+<+=|035;K=uBq?mar2k-X&Eno#VbAYNhEJCU!w$i~ z!@!j8NG7!~K?Q!XWBj48C9P-vaCmwClWk1cEPj4RI-wLInOxCr<N#QWNt){heO2-f zSnLfR=9dnND<+6kK}P#W<c!>`5^{TC!+1LDo%`eOD)Tdd*Yic$olhR{a`HcOReUPC z9R`dxh4p#)M`?LaM&G|{jC@*rd=VMB3SnQywlKUaxm%75KdCFpn9AorBsJk47mn8y zIX7}f{*63ZfuujB&4XS3_k(}2T(ta2|A+5N9w%=w{P`(7b*i%e?Vb%Z`90a?4PMCO z<P5I1W1xc>93*c7m?iq8Cp6O$PzTTHp79}@7R_|)^TE8F*%2Kpx5VZFri<aiW?=jL z+M?O5+!yriB5vPq@&?zR$h8|l0|%&3ZZ`pKEV>QNC9sb})3ukR?5{}gTYJzY6a4WT z+ve~dgahZ`bS6I+Oo6t(mxBMwoO|hUd~@ZgvGLq_8a)Ps83-4}#o56?XnP~t?ScLl zC+<)mpf;L2<ptp99#f4GsDG6*a<eb$iEmw8_@$$C>r{iBC(EF?j0%wbE@-8hvIO5a zP5?I8@j+e;lzs`o20qY%W;q>(R7PZb9T|f{Mgj##RPfe4FLZ2625K=#rS2!Tp{ynj zvrm;>et_~iAK;&maxw)!65u}^FVA)VXbhl4Hp;6R9hiQbR)zV__?v^BAFwY6cWsYA z`Ld($>KK~}>-v!^97J2&p2JyJgn#Ifc_d)_`9_12wi7Wh0RDAJist3q-nGNEW1ii} z?zAPmaexF=V)??kM1<60v?Qz5LvyVe8pRtH9_jXGEHDqY-zVH-c{W!!r;&YPg0wG! zY?VF1*2drR+;Kr8KycO;s!g<0V>818p8Cu+?Gr%3Mv)Rwu(l7Pzo1rtO)lyvpPktg z8g^FpglAjh#wze2Uo6MUWAxaa(MGP4WrBbCl(btfX7-KYD;@7uPKa(Vlz^Gi&>MSJ zim#B?uJEwsklbwjsAd8J3D>1w((&A{s_7a_FKwsijIN<kAyIgD8UL7r6ZRGYoK!e_ z*jr}E@9+R*lOrr!;V?+*`fXB$g-^%HI}>Plp{TsNf4-%M(Az&!sV!VViCR@}Bfb0K z^w2Vdgi!S$8BcF#c8kXw9x_|B<7Dk;umHPNY~tVIaok~&7wwi04=z3v*LziIen|bC zYagLk>r1ODI>Kl?i~WJVec%*L74)_D4v%!Orb&-^b+h&|s0NWViIaHSW)~7YBU>Ll zT<HRvi?D-6mUh#Ne7I3=zLfJ&+dTk*qs+`cZ^j)Poyf%yv6h>&+@fi0HTtg$s04aD z(5LxF`qL@ZLtG~K7~NS`60W@7+!Jx9%g}LFfLB+fmCKCiu%x&f7tl_Tdkb0hCAx8n z;Rj&X_RB@%l4%)hs$zuKK|yU003e$<9&T05YLA8kAQOJEXKcS-P2!E@_NeMN<gCN0 zKA?(aQhNW++tV@K<3hf|nHGG}<j878juEK`)GHIRW~ophoY+I`u21oE{wzD1s7D+- zT|uCT8k&}?>_PGYM7NTV3T_#TGwlLk2eB{+rD1kfQf>g>G@iJa?@I^u?PEO>?2YjD zC94qj4B`pvlm#Ezx_q`s+JtBkUOqsvdfhuH+TXV@G_W>etY_QFRGV|zUjnA#ve#jC zIn)maBTV9+7EQwj)=#YNI@XAG)20RHn_p*jhkVVFX|AOwAaAoUSIGuIhPy^If49H9 z(KHMeEUQ(=CoPCnj9xYJE&I0i@!ZI&-C;dJE56OeCE{ol+04kgeSqW0SYCoxSLYd* z;Ia88tpW%kMxdiE%rqr}S)5S*6RgxLS$PddwQnea;ba1P)aTtoDSGgJL&S|k1bO9n zEWJ7kEZ3`G$*nl$VFl#n-B{TlhH{E)1tpNWQ~i*xX@{!=CoTnOx=HnRMN7CQiZS)} zRnx}@Esf*LleW@HU2VPg&5@x%DPuW@91h;~B1TCljqo6E`Q+kaiRWVdQZ_p_)*)F4 z3vdC|JT>eD9&r@%0B?nM_VyroGW85FSr-`k$Iy)xuvkc*Ne&#-dVi?MLsRLc(@pxE z^nr#9aq((VA0FlE3Y`pq9Xsi$v824F5v!4k&En$5FBFgixD_|SxBzGS^U#3~YLh_g zyi*%k2k6&!JemazX4$l2f5!S>f)q!;mcR`m$RPn^7r27x*UvDA0}4JPQv^lU1|W#~ zIZacghy?;3g1m27LKyyXrsra)%d4<UF%k!gzlOa)v=m&FKZX!4Tnql~I{=u0!6e7y z7B8JZ*^@K0a%hM_&=}e(znJtN1s}A&&n<Yrz3r2S1a65UZMb6ov9P}|f1Bn23+{G% z8kf{xO$93Ui&_7Q@%Piy&U_20IRRF*zMe9YX%dw$+*aWmP7vp*Jgv%CO|@$&wK24m zM;=}zIGCjs02TjINa|-~FG<p>pjpsyrNo)5Aknp@i=T?fEvuhZt;f+H*r!ltriquP zM$t#3iUL<P&q|tre9zW$T>Vbt$m+KWszP|Wud>cVs#z~7EbFr6%VfEf@jHjeRkGBV zJGS_&c}Y6$sfP4E&6AONXL;R5Rle=`Lj2)CH~wyDz7yv+hYnV~!Q<fBhIb!19r5J= z+5pt+b3P>$oe%AA!pdFD{n7xvk^-0x_^GX7t$_{)zSM;X!S}jm1TFJQ@x9J4T9O*2 z!mei{^6?Q6W;I@1TSamGgq#H$t-;B(kpt!88Qh#4opg*gIZ*SlB71Jo0$Gv0;u)B{ zO&ISrus_AmfN0#CY|(eoSN>m!zXrP}hlVB80qM7-6DmsS$jW%%{m!MKVct}2;S59F zg{4dCtEWkOH6m+2WuA^7M++4S#sRNOKE|NyCt>m!xRdmouXZs;bG<q~z~Tzk7R=6q za-1rZPM+f13>k$2qNJJ{L#{fBS)wi)T^7oqC&X+)ovTpPVlYpEzt-*)9^p%bI^Bq7 z9-R`)m3b4xCryvoL~av)X;LSa!rpaAq5_AszY)Yeg^^t_K32BW2W>X?#%03Up7ffj zZ&~DnS%u2B+@<<Hw^X2-k>)Bz_7Pjz0cv~FRb4_=6}0K+M;FWcYo7HEjEQw6C59Qx z+~u4w(E&Z#qBo({^ks3)i(;D5WKm5hnh8ib(2SBLGO^c0EHw&8>B4oq^1XrEf9yxt zAAWxWRAp@a^k56>B_BXV1+)u<1r!WmpG~0u4eZWyC<+2Uz(E6P682$N1uj?IA3+<i zprM^`By_e8%nGcN8G_G7fzkljBA~3H&7%NpvJ=QQgp`2Tjm_Zcx8hN-Rs;C<qa%M5 zE)+#D0N{1N&?13DswJ)#hY^^idz<0F{wZ94dk?$d#ePoO?O58~%Oy3jl)Pj?E{taw z!jkqb>X%{fdjry~F%0Mhz<g2C>c;8H5!TlXW))j|E-3(Kx!Nz+0+=sBt=Hd!?WxN( z#ad3LZp}d+`>bFGrAjctyaoa)H6Z~4gK!ptU=d(!-!K?Gz_8eY^WoM)$F$U-2W;6T zu*Or>r{Hs9aSu#P-#QedWk?lGfpxoOk?Pjq_2y<11LWn+t$qQl^7YgDf>fDg!73!S zeitu3Hwsl=-chM%Vtl=%X?54TEp%w+&nH~~v5aMHu^f{cKuH1Jn6T`ywMf_i$+<3K zgMVyi$au!#M^WJInGOH;;^_VwU0-Tm-5YR)Sh5qIbw;>4g3~1&AdTP9X~j(|>-OQ9 zN!y<q&w!K>nVCTIob5uldIlC=t}#fWGLBdrFt5_rjt8rPLPwC}nE=uE`s#RCKX$N9 zZNnyxd1ct<{-*EivpBCrv1{?V3K>@35^Hg~V?ptmcrjr{kvn4*1Pf;iO=Uio+t$}T zBd)D$TI%`v#unkuRK9kkzrj}D$41AQqKBE*;pQm@b8d*+png`Z`os!}Z{tmh+#Pxw z6xaY>Afaoly={WQ(4%O%kT}v$9POTLBuda;CVy~zy0o8Ernc9brLCNrsj6;QH%TrQ zj*a4Hh@kn-GNzRMiqY03!z0e0vL?DhXr;D=-aFFOth}G*Ku5*X*-v%lwY7bk$*xWo zZoGT+Q7^w;ea8ulu#%-I>F=jZ^(GhL()azQ=cjkdnD0NO69&ig*?A2sm7nk^B=(*8 zN4@=M?Fn+G-EDvzv!Cbjs@eTbpZTCBUkZ?ceigX`DYubbBp9@$(L072C|;xalr1i3 zmI}C}l8Kr1d#pWN1LX7Y%T!8ZE{-tVzKSHz+J?-7Jv53MLdD`b=_YZin@^?ApyS%5 z))HQi7gu8Oby}wCq@}Z3Sx;6wq>M<!rtf*M121^8I4YyG*fn?h|9bDe2|&!I<fQ%y zV(<K?khZtiw{dsK#h;jhB2<%}iOQ)iTDojnd0I&ZPcBxQ!RcNjwo38OH$&1zw^p$K zcI2IYL2jnFnVatu{PY7dxmBF*8~En{3f-2r*JJ|)il38S|1_<C@#idvFkh|1Ra_$J z#6;*rDz|>{NYDfEoQ0^A>!J-ic}^1K|Dh@N1{JK%H3Dbbzcave_TBR$Pd`f^wC?vZ zAQr8_&-)J!x@3;WK=3?QpRox(%YkDBzb0JV^tbDS8ym|Mmci=|@a#2lnj0n9!u>Jp z_G0Jqj_j{?azStGxIMd*-H{pN92<Nl15ym{xLs==zumLv_H+u5nR4IeHpS5eCzDT` zvK~0Bt%}nZXX1DF6lf;Iqi&3lH;p_+$kRWpvMg<g^jzRS{HC?B?^p=|4`1g{aG2=O z^lV~4KT3v6Lsx`I`-Tw!S=vktvJ`?)lKs}E4IN^9si+pBtow0@`(t=i$1;$3<$+x= ztS&BbjiT~G3?^0U^><t<R*ZU^dJcs$UW2e%EV6rs8KZuW4Rk>Sr2vqc8ik<SjqnO+ z7Wm6vZ1MSBL96Y@_dsC7SK{*Z`S)<6eW=cG?JsX6LwDDOI`)u1IMI1Hu$916OoXB{ zg7YI=*V>|S7mM7TYT|&Op~E~KG&_%;B%>dp`0gSYiV(PuM_@P*=m!tsBzm-X9!jiR z{9dTd0r~UTzj*s0s5Th%Z|$R#lkF}j+<_pa9wj>av0S|`g%dW|ho?s<0RTae1{gN< z@Wjf7ASlEa1?>Gf=46P&Wa69g*Rjj}>iDxgAE-*7S;(ckkW@yQy4L`0pq-o?BFhd; zzxNgOwN7OD`9f8*FMo!RS)R8&fEV6|`XAN#+G-jtT~*EY7mO@IWcVW&o<`4IG4|)E zIFI?v2AFqQLHDqmhvHDBqq%8mNLD)L%!VlD`Rx&M>C(u5&1clM#E~K2+Eyr4mNY^} zPi1KfZlSQ>k*?|}3%f4#QU}B#u0QlEYa)Rj9Z~nkwL=fd>%b-=3d}SCzu(+7bKdoA z2}K4K19mFf?Hr!e&<ThtA<L!AOdB9Fe#S;m|Ngr@^YngNI)75k&`kSC<x9#{8fCkH zW15gvLcSp3h=eaNqJuQVP)i!=^{9Gc796oQMfpiL{=Zr~r{O)bfC{YQS|ZR#&^|Ia zGnnli8DcMg(sckMzsQdPwHZ|{1Gf}5KR9;VO7KNe?U)M{T?NMpf+Rc8Iy?n-%B{6k zrxSjcy0HcIXp+q8YZJ{ruNN;Ew4JR7P`b8yFt^bu8L_iDLLHE8q75_kr7O^F%~M`& zWg@XgpdQc5)j~>H@JYpj_`JK-#V$7$O=uQ{_C{)MnW|o=CKZZgZi)OE$e+eivFa`u zP=p3)UAdMcETAkey8yN)ISEB`6MwKiCh1AUD>J*td>nQrE{fJ>CN#XM;tsPgRNL=k zyI<_GZyco+cSbgMuzbs?_n6m)*1<3}-7U@AKRrDg*+19`cQ0jz;=moX;>4qKFmd01 zf=w&TdN7s-MZ)|iD%Dxw7;LVWBQ`*=If+1Q{TyoVCJsaAP-zp`vWe)iMwUQtM$R$5 zEJRI!iw#Ex8vmd}2t3Bn4h{PS+BpM%`4GbPSn->~NEA-T*)F^<5r)Hc>vR{XR0;Hd zCAQ-sAm$)&wi8|z;La$v4NoQU8g?2_q5eoB@tZp^8?3Jo)XaeqpvZ3Y_+s`+X!;uq z>Cj02X_m4uoku7x813iXZUobvhKg#38Di2>)+50`FzfnxG+=>!|4AHZjH$=(rK~~( zKtw{fKWUu1Q!_r(_yE@7!hwGg-v&4PBmp*C0<yePPXXAxj89>9%Qy6Q&zhf2Qqt>< z_p_GnGI|QKi3oKNP;pILJ)~v*s9sZSFR=X^5Gk$i-8KNZH1*_eN;~+`d^~!hcwF<C z)H;}}1E&=O;GSDD&q0GrtMD7=?P)oxrxl*Y`wNWQ59C~RE(6$0S<l{?$^KZ~<7}+< zlrg%{M{<Om)RmecxJmea3d9^guN*~qbCaQ<k1g(lC{%K0*J2D8uyT@001iGF#USed z^_S#~gP;PN^Ts}Z4ob#gA`b;ffTaNKE%iJGmTdyK+81`mb4&Pn3Q5ufgNQ^jz<3B5 zA(+2%BWdzqd>mYO2s-Xw4(9*-crvDg0WDQ$@M$UJL%tI7m=qfjflFnR;eTyDY!t8q zZhDS}eHRzH9%*_GU|(zt;|IaRse&nTO`xyFgU=qO>;ULMDMPwEDf#=N*{lMNVbovo z<IcHUK)OD(!=*#nUo?nw7e8!c`N$b&R#_L6bb9GXJbyfZG$r?dA_t-Rj`<&E6W=Z# zd#1SCk^y^w(STG>b2ROfv>s8Du%x?|+VJTE0z#i{!Yw?eFQSoO&>Pe>ltN8jLEn2& zo#k@dT}d4fQgMi^r>=RRYKVI?f^KMoSpK*x4o-yz9D`Q?BuB>@tg2&*5#DV)1b1Q& z<lN0Oo^&5NIUj%x0+U(?F4ZMQ3>!9hw~k#S3%uJbf7B?yQ(Eo+4gjyrA2YK)c%pwe zFf!as_~297gP*n6Kbt}5oi-TkR{0kVxBtBvN2->l7Y)>^Kia(*><ixttNHxzOF!8@ zQdp6;PJ#9h&$bs#XPY|^K6TCRPwyT{LG8q?3l`(aj9<3oh$?p=RwoGuSj~QWAhfr> zwBG7BX_ib#xpuaoH?<#XK(o#tE-XMq$hC}=CIZKYRNK*+Qb%aZOE{i8T~~o{u`EQt zV^$#lC>ge>GT$j(Q<3-Q0Fv0}9Ue(6aQ6;fw**;1&WfILCc}|E;0tUW8I43k^-Rcc zU{nHxb*ZM~=r@j(rXZvuX^(ext67VYr3Q=uXg2vQo>LnX%yb+YeaOBXI@1CU=d)nD zQ1``cztwl>+)4O#iC|<a_A6Tj^GTkP(pZ!A6`BsHeCKMKuAt%j=%Zq^l`Gw;?vmzr z0BOFgrm1?pg{&!_<~*#2&NKz=ZYsebASsy@{p*E>g6di-_hG55vT>qH{V^;hO_|*S zbgB%2vccTh+#<Qx#~x_!o+IcOJ@<y%S|CM#E^X;MIc>Z?Iu#6bVx_yUOw_dBibIL| zUL3EmBZRDlrm8AQPQf<RG|}{q^ji>zojchjtY0i@r^s~WC5x~!7c`?obPGbOfkR*r zB?Z89pX18bPVy@@?~mp7xT<rVOFl+<`epJ*i2IoO#ECjZO2*5M<b5iukO)x^Bt) z3Vc4iiC#cxGqo@C+xmMn8Ma{;gEJw=Ws0TCQ}Vt@BOu@eg=`LcbcNmHVUoX(mNQ3K z>>`ZiX#0xlEsN=H6s{`}e}`%zw434GBq52`UThG|=e5RSdDh}7tZreTcU7(#el!wB z%E5)Dyz&?_yw_YLo8YezyadslaCZJ;n&5>3I&w6Lbb@2Z2%`-IE@;glXf90ZYhn`| ztko4X$=hDotnGw-N*{={^@oV1KptQb1f2sGA0)7c^k$=3*4A%W8+DN+!1Hfo4%g1i z&htvtqV5oVVcBf9ZVd>X-W6ZBu^ZqorQ7a+WoA(K+ZhYH^ZWR@rSjpmrq)fZv%@GO zLd`isC;vMJziqM{1pRtL*CK&np(t9r50R!+<6SoafI?Yt**7>)KiaAF1p4@3$Z{Rx z%~kQVc2{k6uULW6dSw}XRrscT0v8<FbWHX<-kydbN`5X6jGK3utL(cDmuthqaj>C! z(d9FTRbadXr+{!)2cR3`CgDJi@!95%ulQ_n^oJ#PYQ*I7Uo<tA52w5Sc@&|!f8_Oj z^uS#Fn42ZR_f0(MEdSsM7Ka3qXKFOL#+c7>1=U>$@k@@+9~qvGe}p4tr%jcaT<M4H zzYL=3J14!L&^w_YW}!OcAuIQw?PEHI_Fuc)b(99wM(_}@nR5uKr$%ESM$e&y8G;iG zwtMPX0wDd9L!kFULt&`z2U2$%Vw1OGQ7ED1dwvWO=#Lyeq?ob!NlNwh$)IhB7e`(h z3J<dMj8PZGH%#=-9~}<xpcMDDabSyf<tV}WCq_yMr(h-BJlZ$_igl`n4@0v0v4uVY zu;<X>0~8(<G4}PEc-D$3U%<Yhd<RNsp~w17Tg4c7%c(8^&Qm~7-xyHyK}R0p%b1vv z^~%;hSg^o#xwW+_8J&gq0BQu)I(9&RrU1ZyDead2e}?$62Nc?A<DfB*h}F|@Ry7`> zGtyJqtW~C~6gtUS%M-<5fUK07(RpVjvBg<ISuJ4Kwdxni>CTZ70Ya*raqAN=I>tQ| zEh)+Z6V*_jV6}_y$aBpE+RMDOr;tbfpX9l&@xAHEVkb3g_7Q7pRcwE=+&rWnV(pA0 zQ9DT3BDo}u*Hu+QFy>ODXx2hAk1WlO%%V80-kPz{)V|j|-czV6odqnv)Ox|kgkyX) zvm`R|k|PUML9E4S!T?1vq%7sM)yOqc#K_d@>g(50gl3VHvNTZSZ-%OT<q~wz#iwyf zvMHrS12bFVQI?Y0vkv;ZAXvubK&=ppp2t&_ER-YJc;7+~)m6Ai8=q7)u@#drHD#8Q zRXX^rW}c#F4;&JgyO!RpmJTmW_SUNqYXFTI3Ei9p9^WGKk@ibAkfJ2Jb7VpeQ`^i$ zmJ!*VP6Mq^VJ|I&bE7GnyPO&ZjX+V$|Il5Af_*@JN<F^vn4#b%yfHNh`ARR@E=f@x zsm49(&&_4qMaDW6L0wz6j&^eM#>n@`3jgffv~#kzrW)#NKPI4qF)3HXEf7o>$R&dk zj$&EX3(e0FqpW2SsKBn=Op(ZuKi<_OF8^?O=$Wg8&NMcZPfN|p>3y{Dn6dQ!9;x0f zbWW3|>5rOP-+W9O)<~Cs35CLP+Or7R6$00cq)RY7Sp&&HTaWqWR=$!gMJH7xrD{EU zjP;~yriWduMv2lV-LMGHQBq?ZBd~xG`5$=Hn8N+_Gt)-Yy%CC?Cj4Q4%(In1f4=34 z9ypHAVrP)Nd#)}Ug3!AMYU7-o0Wh%PM{9v|KR8L}vFUQyPH_uhDPSx4*3Qolo$*t1 z#P5rFf+zMf0Kb9u5IqMgE$Veau<68hbQV233PkKj2d{cIBj;zDQJ|&moAx8lz%jr8 zzT?f94R|YG0!$zVwfDeg3)>*%wCz20`%e5(2UtQu&ldKKlUV4>+xHrY(Xru#7^MkB zmlLX8fy_8QS0<%77|dX*N0kumz3JI-f%JJDa*Y!^kR|7Y^53b)aPn^)%|TVD)aWi) z`C%vu1bgCoc<;HiO@h$>Eu2;Mz;L>C);7oixIPgBtr0IataNaq{?8_WwG?qd5$&0h z$aV<Wtj&XP-QZ7OSw^KLv3*Ev#qf>ij*NW+Kq3F483gN^A3~&VA5@MwgE9GoV4V3= z79fKf3RN2{hky%N0*>d11FXF|1C5mC-6Qod@r!ppnC$zoA0jKYW0U0R%%5=@Zj0*D zd%-fuYkZswZef^;?T6A=RglaPqJirOqqv^S7)M!F{^^u)WsvKgvM%E$k#ZUt6{fk3 zYOi_?t$Sx7^HXnjCN@@8mg;?lJ*rSBjnHz2%kHxsigx<AU~76!+=!obs+&Z{1rNs? z9^X8acxQb4{*W-_SAdhG*GA`+>Xm)&j%}$E$OXcXRr3|7vK00lZ7taJOui2#=CvnM zhysMi)~9G}NMaEBLLzwZ$-RByP~Jm*1qJ*^9kim^Dn`}4QabF9f6v;^suosszSG#3 zwf0#YT=vqr`$4q+XbpR))vqofU0Gryv2*E@J!d8*G0@H2`H{g67GLP=ZC%6@y2)*` z)l<q0ZP5m+d1j#Ii5BhLQ;`(JqF!s+)IHpCOLj*Sm|ncmI#Qr?h{%KL5sHcqR)y5q zK^SRQx6s-;xp*25>L86%x*m_W5Ta=HZmqPTlvux6#*(SvIl1%1xlDxqn`A7VUz6FY z;!eSoImOaX-4JW0)ebV)^&R9#wbRXz4R9H=1EG1|l9_Ms)wQ!l-TDy`Q<y6N^SgEQ zgdl(Nsd}JLOTG(ocfPaF+89DpKc0b^?|k}dT^RR?kP^R~`IP~Y6my>3U4oL-!<`<j z#LZ0dD|jPAg59cICGn6YcxySI2rvnw-1>u6ZQ4@L#1n~L)1fB;?P7uN9;asaaFt-R ziMVb`!S+0z*FK4e%N-TAh90}3uw2Qnt1~Y>v_k{!36-Q**H5UTOv<_;%_WN^d-CNS zwEK3~Bi<8{Y77dFtmT*3TDl+|MN>9ABQP;53+AS6-sE|QqYGO36vJaNVg_jZBu)2% zQ2X30dSS<4!YxbC<-oH7Cby}JY9{m@)4Ri#@Ia4>XRwCG(IR0J9raD`7Di|22UO?K z?1p#V2LYbd5zCHkjx?zUjk4;nZoB8(*2joDE2yl}<f_#;0;^r4mO&TUD((diF^BDO z>DJA&1eVpi1Zm);G0xDJA?ZQ9E{-uK{8oDi9T5A)z3?|roottG3>Y`4a@W?iNu{2h zZv%1wh)^6swS?4DOk&3pDIit>5lD)O7yN9jvv=yovJItZZAo<H(zC`;fNG2z3@oQN zsw`-#xUjW7p#>h;O(=1TwIqt|rBL9CvlO`5OUUYTIN~zC^vA{zgNOP|vb!P8#>^+W zN?5_N-oj_|g;VC-A6n7LY{B7uMZdHZWcSUrUl<^wm?~O$Wz1W{oPs7zNpR-*p|Wp) z2#!H;6Zo0K$<ba~segju0NJXFmi%T?7UN;w{nqw&L}ulDQd=MeC=(fKp+9G5;4=~g zRd39{qkwyaJ+EXN${uk^m-l!fH$h}WcW}sp2a^ssIx+NHu|w!!5kHR~JA-D7`~db~ zJjT6Tu4EAH8+&)_#ySf!N6B=2wc$bk1M19O-e@KM4!7yiPe9)4tI*N+ImZpZ6td7h z^J6UxK(2hHhV<ckB*>$`FcYo}aL7bB?PxRC^f+s)+Il>>rA1=`>xe72#yTe{^iI^x z-Cod(@@91T-RgYDwPD23pM{mC=#oDM%|L>ufrNDhIV>lRQ===g=mZAGX%K?V(bL6k z0|%XHE!e(T3%;@!w%8#+d^w6M5CleHD@1MUjP@y#tV=USo|$UYS1&RZ?A|Jr7;96@ zH`#e7-F;GutVH{K6mY7bBoPFwlV(Efxx4z38UCk76(oLjgM6N`IJBZ*>*S34`OdjT zA$PQ5I<06Luapj!4oVFZhO%+VChz)VzIi;z*oAP(DjW7n0xhZ`C<~`I6?8BX`@nUe zL+m=K1z+r#IQsgrHwMY5(X-fjEDHak>(FQ!`dP+3$HC3hy>KkyIfZchu`eDvPu>o5 zy^{*T`LwEScX(^B-|FvP-x3H#>UG}iq&+n3-I?N@&ps-24EY;dwE9)@?wUYwF_Jd| z|3r+dIUCzO-}7LDxt3`4f)0CedH2U3t7<+jFQND|8HKp?+m*R31$SyIYu_soJj^6M zX{<DUMrb3CcIMN|YqLJWz^gcVgYoDi$0vpLmADVQ7jwPF8%f#{n5mW=y)CPSl$XuR zWbLN$a_U4Cx`H}ErL3a(9(!n*Sdd$pQ~pu$KtH1;f1;p5buW4O<2TY+586w4S;f6S za6iv_z4D+gOqEOO_c!*`$2@1R+}CDwG@5KK^`>gkt?@4G^v>E>mz?ajc@>>yWt$w! zjjm;%1d|xR4KN~)Q0r1V+xx-EyExk~U;ctd0+!gtYW`}7^(EN?$J4d|0?q`Sh8w3^ zIIg#LqQP@0X><M4|KS5jT3cURy)(Sj7ji*l6RgeokG5@x@!-yh;H|SY;Gwk56{*`i z&cuoDcmst0<s~sh;u=xm#Us7AqU&RU<cAK@`^)!k_jY7_>MqVw{(@VQc7OU`7oaY7 z*}Jua!uN$$ncTOgUb^D7+CiA%@cF1ceztyy^&hlJ0MAcdKZjlKgmN~i#weh!afuxH z1;7nK+c&K~-%bEbxztlP;PvZZ;F-@hlBzw4=6*fl{2{r{oB6Y`!m0aD^-s8uZqw^e z?`ht3rb8s!{dcY3Qs6&q&9m)i)nHET#i~D_<TY849sXYqem02$m`g!lvweMA71Nxr zx{=W;n1;k0`EKa&*y-}x_m|>Z^FfM*twxZGOcVw}ipT+Uo<t!TloC2zHzS)HooOm( zdq^xO7G!W6_pFNpBDw2Wa&)Q(3eWCw;8b@I)+T(`Z6nC6KU;GkEf_DMZey=19spq; zbC~U(i1Hw^I5xKx*X{{L3Dh&O5mtncv>@S<$QgD3zP?^jWU3ZqWz&bW<nB9VqGyGJ z6R6{}%9Z>!h#l40O1G*Dpzgb`vL4jJOIzk;3Tk%vKC`M!SPqs{P7fhl+SxVC(x=x- ziZq@5=)96S#o<pCEawZ`?n+zBM~W4aS`jsf2-Wq0Tqd;y;PS?f7Q#wne$jlc0ftWy zjKv!v?p&LJ>zUJz$|fX39XMfe{RzVB8%1|~4NqlNGZh_>)%|A=C9{ME7utQgTvIe# zmu5%nr6nyjTV>4Yw%Kxl;C_8~Zyb@UtAmBqk-W%NL>b##cF<oShJjs^nz+JvE+1&p zINj;H)6{m(hLJqdhe?~Q>(#^j`@F&7xKxY6=`kf0$EBf;llz@^mWSKBH!1m)f>4jI zhu%c8Wt-4>uD5*hgXvGkbYLZitK<j$MjUWQE#(fPaDGrSI@-NiG;U+>Bb+GPU&DOV zYw1GjEDwtR8LJj&A<m(*u1$eu^f3jxK~D_N(P&LHVL<Z}6`^2O0;|;L?Hz3CaOLPO zCxyeng^S7jM|`>Lklbz-O;&-uHIz6LC&r6bh@1Vi-75Mr_$re%%grS#3M7uJTAfRq zMiI{#!tw!SfjMr&fV|O<&}{zves^NH&jqGuu&CugUIKsDud_GgM#ntlgzJiBmUV3e zEf+PrnzZvBE@?v0yo=8Mtefhq?g6?Lb;j&+irRKjU{Ph!PSo}4_8jJ6bLXtJKZfSE z6oN+bT%#M?o=FSqS7&n#;|!u33+*vKz+%&h=}RL6&hphKu+#aHz`zP5lCU>ki2kcL zUM$oLThER$rV@ZjL7?em5BRc}Ap>+|2v-9ZkJZ9Yfiy-ic|e*ZAczFABo1iSjl?!& z{ak=oD_0kXQ82DiwUgKOyWrZ+&4w8Z;Ar4~rUoG&@U^|LAI`6z4qE!K5kSD#lmMbi zi<^K3ck_Jb6nbu?#x-zX10?a^3{XQ*5DZ|mt*8x4N*n3BC>Fgy<atdu%_fui$b|JX zOSPNgrWEt8>2>&>v6uEDB7*rJ|MQ$6UNbOD)XLIv`}Dsq8}#{(=~{1hf$jDj6w@ja zno4Jz8lANYea;xZYSlc^>7vBZccpJ@ZB@i@$1@c~zah{`9B@^)Y3~d?TEo>IqS%bK z62dz6Dl>}r6)!E?N+gB~8w7D%?EO{5`Kryn;jc{P2-j=%SwqH=ZH=;a9-VzK$}abC zaS`OIv2e=7oI^ou9c%l9<~qA@v5wbp9k}GbGh9kX0*5+MaEavCt>ka9-z0D;K)Fh# z;o`U(@a6>kBGD0rKOlI071u{Nx@G~u)KBU;D?Lrd5&9fnq%7ZIL7#`25)o6NB134f zZL_5)(m?Xm=MD;lT!z^snkqNJllg95Nh5cbz@C!NqOEK+w=z*a%^OjVdX%ymE)zw& z6@~B&&6QIq+$tNIEtR4o0RLjsB|56oR9LBP+57UKWY}0U!`PGbRrj{#vJq;Ql<)RJ zjTdCC5w~gZ>?Woc-P&7^`Xqj3ifUJxgw3?dZTKOf{G3Xul&fD9Tu*wDQA+wEucMO5 zb5N&Ll|df0TAH8Ht6ErY)<B%2kwR@Dj#GIB^NJNQtH;22oXurvTu^%^P~PGgROFW` zf#uZos3$LzX%d-gHF!-^`7+GKp2mTXKfnWaVdc(_lq#u(7PNOSV|Z+Kpts!9d-7$` z>SXnU?g7E9?V(Jb0V1Kr+|WEZ1Sh8Xe&>L9VC(zv1aI!GpPcKTOQkh%jIJI;a`Z7% z;QUOSD?UCyIz9=;j?cA$HOtn?$$0?eO}jF3syU3>V<!LU+3|@z60zF?kw6G*ObOU@ zC~jH>N8?OwJG0t%&%!bHzWda^3OIBqXoNp(t+=5f#o5tu!n}622xh&*x)C{YpXecn z|I5c`k?j@Ffja{1o`ex@22>v1IdB`%&Wigm8uCyQUaU3mc|fbzCI3t4fOM}*(Z_VR zl0V0EH}pDPLLb$A4qo-x7nI0MHRuw$*RVHWpE`s0$Ki9YV?S$Gu0J{u92VmaN;zPl zHDJp_fpcgKjpp#9Og8Iu>=tVb{)>*KB){VDiv5l`%*1R&4l}`geV926|CsRqC=(4M z=GpMA4k-I{<se~(D0W2!XHmnTS?RCP=upKJfWy>9?dP-_tyTj+YR<JOny40OV%k@9 zlo#>=Q+}zZI@pW4bL0V@Mrz0p(r4QW<W$(>_7ylLDlkqpCx9abZlKUA{M8!(+v^BQ zAg0<bXQO0kW(N<gp;rzEXXod!d#hD3C<l#|guaE<j)h9UNR<LVzj{$b_G<JA^yzWs z%<=B@Nn~=LKYpn9;hi3XNu97wodl=sNVOG{<{l$Oo8~yUANDNm7`DW_G5JwYd$t4y zlC4&b>_)V#3C#p|kGGE0hdXkR<N8^Kc*d^-`tC;>lVjD2ED)Iff=`bY^#S>DM_|FD ztN+%rpM5Sr0DUcooN6yp;UJ*tF>J5+l@4{xAv$8OFFOG);vQk#Yk$}mo(t_Nph_Av zXhGP7*(>N4dv;!RG2NR`t2a5{L~@>~^Qst387q?gQuSx-Fno4WMj{dEJ-D7`GLuu{ zEwGiz#1B`hItZif9m5ZL`}>L`XrZ>fe|%D$&i0J<m2s&LSnY(3PeES0$~&ngX_Ive zdljQyOC6kt+XWA%00|$4;7Bncj<)VDR&lc{b&pB_ZvH~i@KUwTm8GKZFp5;g->T)$ z_1~ug5v`6vt81I-?y#d+CU<SRrKPA*SBGztO{P^JqizPSuQP<|jWvS%f#P&%hz>1@ zk#bBs!$OBGbzq35gn*vHnt%XsjSST2IcTX{ELaK*uUMFexyR>IRr4`e0(eQNK9AK8 zhvmU4`o7q>5WYOZ+iRQFOA1ztXXgERVpgF0ptWdj%v>W_?W-tMRO+gakX$f@r?e=< zCG%vVYpSAV*^p*q)SMzKLs$ENHQIm7tfS+2S^g^OJsNCTf*R!6d^(i-t8-3U?s8S1 zaDpHb<oRUAac{1WDrwA^ll~=xCabIlxhc-;r#k!FB}|aaQ`!3Qffbx$hGnf1Q=jr; zXhKuwXxoO;Ug=w<!w;!$KTsaN4NqUe(!f$U{$94#HyrGmko={3!MePJo9pIB+P+Hy zZbjEy#!~Tqvl927uLA<i*wR3T1MG$yunuuJ6t82IoiF~y;TNyWzZBAhl}Yq9xaUeO zrc$McrfzX@6bs?LHhE2ho02zuKu{Q}yJN`P(6^7TbaUuF&B~_L)nO9j-IQ^tIo#H< z$Ll@p=@z%p^_Bgrt>$^sIuJ?Mh{uTEd4NttJEqtm6?)QXV6bDPJyP#*+o;CU(W7eo zOWL;8jn_dIR8zlfd%;^x1XdNJ-)~;<NgS^F8mncK!i2m}+H&PIfDWZ(SF1%uTAP5* z0pG?p37iWS@_dUt^t1PsEkBfgW-1u(F0F3=@n;Psh203<&g*-^f57}lDYMG<Jpi*= zGpgjuypa?V$pwLJlLBAKWl0vCzLFJy%ET8Tt?Qf*!Gype#$S&wI<MW=`ma&NTW$US z_JgT+7e9NqqiSjTpF4@qeuzitgH@E>`pA&}w&>yd<G(q^p2$4*L@=Qghv$;qrr2#? zfo%$7NhIsoU#YMQrp>p(q*QX2WE>QO?V{yvN)@~EEdzT8%9hMcoldbKgaRhe0o@zo zIAfA^HmE3$ObhrHION(CZ9;PlQaGl)2?7~@cvbtdB!)8-#Ck13HM7tG)P+ht-2fmH zb8NAU>KjlS5(39@tnU(r`+;8{0aoj|Be^40IL1JiM5dNX)H<bBqtGZ8^a|yiM5~?C z>J<{nf=r^&tLF47nMSFfmq@z$X-urm7@dAfPoV|ruTTl$tJz{Q>ea+pN$YN@4tzlf zN~d6PTxn^;4!{aGqwA3^IP@gg23Q~$3m3n3v=Lfai<u%Y&JhxH^h(_YI255<KJbUI z!N<FR7n`EStXt1I`U0k|W^5L#!DuuX4GH5b$#0Aa_%>z$5)phw4WBa_;MZ1*#R?-m zSy@S4u_RVfl3y`+jV8ZdwX6<ak08O(fvE9B-p?RWq`$$@Kwg@WE!U28jvmx9L6;q; zLEMXscU4y}eL}tC>?nmQ?f)+2Hty8-8q4$(xG;*->l{r)e|s%~7$_=Vg#hV&x8$x! zZ>qp;*OWl2{3nbtB0o!Q%xTD1pcNBig-^lxJ}rj_kG{N}QMk&k-Kdh=3zhR_nF$C8 zH@P!a?M)lgYc(8a;lziFKIoagj^@cdgM&i}_6_d%c!G!cDHBmX;@z0wO(e$uGkcti z)#1iUbi)gLF&N2*#h@d`O{`vbf_@|Uf5brao7h|8@RwJqVEA8A_mW1Jr5LG7>Ve0T zgNW9#Le?m+`>2gE_LKrEahQ(edO?|3z|jnE%*{{A$Y2Jp@$r;S)R-?8)b3(2;9euA zjZNcq>$vK>PpIOlz489&WVvo&bU-l+_Oofo+IdhY<+ja=P_Uw?hVZ0ok!lz)f2C_~ zi|!%`i&h#Zt4qg=w{dYaq36@aq%;$q)|@d=w~o5j(H~*t*!HE9!{Er^a8qYjURw4i z_Y2b=Ke&JQaYkWfK}A2Qdz4rQRZUaEu+<ZAU@_;N_EKOE9{6!Ru5Pgk6nPn$+fX}O z__0J78_!zEo^VbA2eRb}xgc}MIBTiVwCfw8!#8SPd{oRTVT|YM)b|!4%G<+lteKr< z%?+E%8U;mkON~|BDV-g!EY*t*3WRVb{$Y1Db$NbJGXvE*xfzZMk~h0XarV{F$xc!0 zP~kIaUoEFlN2th2py|9;^_;J)*3c)<oe`DH)f;^1oAAIFIu`c=^Z$0|{lC8b$^ZP5 zum0&*zxkX0`44{ojW2!qYhV4X|MC4Fe*D3Y-vZkdDl$Pu5-0!-n0^%az#tMJ%LT<Q zY9m}HZ~(k_x)eZ%3G|gi>zNaxJFc^ngeQQ!8%{C!vL<(QZEgSjG`@Mbaq4$Nn#fUn z-FdQOkFM@+dlKlcjx1*`AA+`?5jPFO?yi_Ge0Bi+nIW6=1S-G+dpv?d=GggJ1h^gu zt27<7ov(vI1lv3TuRhP7b00Z&PpzO`XP7%6B{rOrCgk!XYaqDmONwQf^<hx)&ZGPP z^ep@P-}&=@`CotimB0ATn}7b_|Ht2c?aObzc{k(shi`AdtOH0>@Sv?(<LDWF2!z-h zfq|-DOHjnk^Xa*E+JiI&B#>TbtJ^ntU~`<95bz8m0C%R^pnM{xec*QCJx#^C|LdPW z`0(3b|C?`r`H%kMAHMr1zxR88{FiV3{ZD`VH~;kWU;YcW$N_Y|`u=fxeq%<-Z3o<L z_xK+^KmIf7`?U0&f&9+7AD>`#4_?}2n2n7||AmgFNNDu-kN@hO@BjHX|NA$7>kohD z|Neh|?>B$<xBlk;W9%)!+qkm+;gK=aP%-5;ZMVGL_U&%B-R|}+rELmn)082cLYO(R z<1i;?#}p?{oH%A?wwP%ImdwnSEDL7-zdLdgxBGt2^F7i?qaodM&$;IwzVqfSTKxV0 zyuJMAZxA|#KVZ9lWp^%Jzbj;MEB>I1{oiRPKDxH-#-jNhd(z#XBLe6Tj&Ea|5(*S; zMUfR=;~0t&@KN2-m7h7(O8(ain0;8Z_?tDsUo8CWANS39a@yk$-~Hs>v)}yW(=Qi& z^Ztt;{O9ioHe_I^ZU2Scktf-H@T*+>ZwLG3RA%?36<1HB9@@8Pb?5+bPEByQ6F=St zU4@$OC^0%}tKF3*wxZgjlXxT*d;we8K3Hl{oE~9&iuxLJnr-=_rd+8_T+><79aW`t z)YP)dd^=W;V@K;-I|tiGvszE30{ZTvK8pZ(bw93)78Q6*>5kScXZuxaVa=E-Pf|Rp zPH%FL_ogsZ?r{ulT6%8#M=QU0=$RMpy6=Ihv!1?d_LHx_`TG1tufDkOn|C3$5U7wg z(r0t@4{FSS%E5L`VfsdTMh2MH0j=q#WqyJ=Z{ujl>7&O?vFAmHkG3T3uZs^W+Ot-= z_dv*n^xv;!96Mcp*v_`^FE|%}vi#Vw+}axj$K}m?icVG*7oR;-x&K`8E;yToYs~So zq=?w=gW+M&efH)ah-KK0_kSwNey?QBx`9=n9$%ecJw3m8;nHuv%ll@>j|8Y^F|P?i z<*fA5(QRuN&Yd-P(ZY}Z`N-5+GiKfS(A?+d-v8|fFE87>XFbFOrjsx<0E5~6rh$1} z&LNz8^H5T4N+H(fC{<LX9NCtUo0PWtx+yQGtR!LwKT~y4k?dwuwqA=>9ILHNOsT$n zF}62hYgUpT^TwrXxrV&b_3(@yi@kW|)R9_Sc<XtHa9fjwD0tBPZOF1!A4L_vm%V83 zjjw6>m!F02Pq}dP@^1w{*7h+RUbrMMHtC&JYnOii@0Z{F`rEHQ|Mwej|K}esfBeeB zvu3>d)SKUY^yBYdDt9Ly9OZA0QHQ0%80phoU+>e{CxN~F&o!?$JERSAlQ8m<qSYk7 zaM={S$y$1;gVveo&I>h$c12Ho4_gtDaU@7A+Md~KlJ{SY%ZbVmX6pyyVh6OHbm}!X zYYkV*4i>kb6v_G^x0gp=%S%L6u_GaZgcB*5ds+nt>Z^BEpAO5bkc%qoKH0<1K{Dyh z!6Ro+J$))EJTfLGV$s6ye_FPD`OlwzUcbaQaQ5qe`{0egzxxImJe{n1zEU>7TpqRQ z3n{>9Y~JRxKyt9%>(IR=9GTh%Sl_|;Vyvj^htO1OM=6y094Gf*r0ZmC*sL#Ct=X|> z^WtxotlhF_@1_+C-~IkSe$>qOUj6H1ufF@XmjjI+{53KNX!&>vbS58t=V70Jei1>s z4*rze-dB$AVEn^H#>Px~>G1_}bMel&vp>D|ueVQ^XC!TTYce(UxmW-8_!~ce0&@&N z7?!@j_v->#bjUIx9^2Hg+b936LmWmX>ip!f_kf+jkjf_A^Pks$#>y2XLw!3Qn|n73 zoIF_c&J^m-H{W{e*(culr?+SNLod69hp*`xX*nKiE|>cBTb1KIbIVxk6_TGNlRBQ8 zHuI4g?>Dj?*_~Y{KHIjpqNl67WYJV=`jd~n{N(em{f&Dr#sK0ZeO!pK`;*)J=Ce5W z9a}hi{)cOH&h}WLXtlrZlvLz5)vUaOntsn64?g+K^UpVqkEcI9>yIJ*e<foR*r|Q^ z{jY;BT)2{a?ef_p>%T2P(YCV1lYM7BJmb#4zWCzf7OorFx(!!gp{-E#c$+uLUd)<H zt?W=8j2;!uD9_8`X@X0Lf^Xd4g|!w?INc4Qo$N7g#5=lNZYID37KSWlI|9ZS4}}FC zAk1KY6r0_Ha0I6Zr4F&{<Mtri*$>$zZnp#LHINI)4RF9?A90{=VuSY1L}FI<$Xx%& z|MHh7fBHD+%$KXSojbNSIB0PoHDm6Khu{4ClX+f>u&nMrntlCzUwUO1V39W>$L05i zi&=E(nxxj_E$W?!o!C`*?Fa(22ux$QeZ>rWe=lt|8Z1_0gTZ7nT4=My*wA1$SucIH ze4S@)z`EZunv7<{sF`OlI?O&MgUMm`HJHpMr<rHM5uVAwm?@LX>|-!BkUfvt*M#h* zG2DQoQ%q*F(P%c~3ukc1VP=h^W?$Ms4~&h^dLpOsvFHBhuTSoN?)CrKu#}<#Uzj=b z?stEjOwD}!?nmGI?9KPQgGsoTt=e$lQcguOnI8nv?A>hT;nSKEJA}EL*In7dU*~3n zi-J;$2#kMHwD0dxp<s$g0K>Ulq1BYjR613SSTA^I;n!bzzMlHs$DiqS8u_@I5};Jc zp|2=CDnES5)ovB5^i`?lN{5Q4l#i)=)JnONoKwjajB2u1sZq*R$}tsB4&8>ro&IX2 zLaoA%FHXxmDx_rN46AT+XMN>r6;j5DkwF+H^fW#7!HRe1zWmVJKfJ!+?gt-w>dl4E zzw(hEHEZtObKiOW*|)qHZdsmnC@Wc<S#psmN(uv@ANx-MeQNWCR8(o%6}#EP?##+p zqaZaGnsSSik%?xG`t<gg*tMraYOW^7oIJ7ZOiXaXp&WDFrz@7Zmj^6eJio9+q;#rT z0-DmH_Ejo0sxh^%LZwzY)jSmr@l=XYHBUiKsuXJV81_};M=6|Pm5dt79B$F5IlwTY z!^OrMbG{5(zv1K07r+0~hkjJRLoY3O<JmX;sXHFHZ|0NF|81Nfv&IV|wt1kdrv*L^ z9}8Fpd#8GEq)U3GZ6v*^BM#u}J39xFk2M~1bIVcy+EpAn8FpZE=+4@t#Ly#&M<UOy z4Ufz>)_%Hl@iNcSdzUQ!C^IEVuhEj1R-@6X)ZC6o>#J62H6AUcfv%}y@HvHCf`jBz zk2X+4_HYlQ3Gm*8OZ;&PcTFCDmR6;4kmqP{3Tfk7o)R~b9aen@c?!8-gVUr#h{zy} zEML22X5h20zVqd#$V+ht*1a+J>4#?D`{e7sRN$-!rat-F>;LnAvCG8U#s7&J_x^5? zLMoLj6k4TNs#HnjGNnYSp!x58|MSnxPl1b<eEXSMc}45c_-K`Ce5#e$_fx7h8nsK~ zr&4m?JhjrP@xw7-TjQ%na=@5|M=tkOD>drzeHQ)VOYXxLj`og`W#3srOwQE*JU?wJ zLp?qDp1J@0;KwCje6#B1CtiKkkKzSRpZU^9Uo2|(GS`ZHw*9KhDX@(*Y#(Wi26@3w z1Y`d>cnT##y3kYOoljb)ouNOv;LC-JzFf56^ZDnj{EIq9&1xvL#Yd}9yEQCvjH#5P z8cONX_^XLS3_DXubCqzI;kO46sXVyFqXEeh2m`rZ-~a+mdv8VEbPWNNT!zO0PGAd5 z>#``1bmzk_KJm9F{C!;1<AJm8e)x%J{{EB?<r_Hdt~b_gTmx|x6R}&mCoTT`728%L z0*f%iRm|C$CvPcahw7W0LOCmGVQUOY^}T$y=@OLVKd>c&Oy6#R?9xB1)9ZCAgVm_j z=?uDNlUk)W7hTHAF4+-L#TiC)jGm{_I`ll9+M}mvw~?neIE}srBdvEEkyU8q8FXaF zW8~>*modO#G#d0q;~2Tlfs-_YlP)8Li&$LE(oTH)>D78261S!kXrqhfKKR6APe0`E z!?RN}eFJ<bzsZ5qUi^I3+8zQZ5EPn`%!aV3IxjX)%_(6=w*;kJ+<v5DYjDMqvl*M^ zK{t*suReVm0yM$z?Q#(uq&+&F)<Hj@(-_k7t>y-?woua0pp)j;ceO+v4X$sXX}y!? z>GTddP_LyiJ4i$xA+Jurh!`OwV);&yuTUhccZht%e1S_8AQXv&e6ffp61zk&?ujU| zTjV3)iyb0fy%2@p1im6%5A&N)q|woOz&VYG2GJ$YJ^9Mt-+Xb>h#%|A`rQ{edCHwr zdD9<4*a^_-2+py`Dvx_2!~~sgHe$}{KFwyup%gkQOI;GSswgtwl_&iry8N6XbR5cC zrWh}jz#u9W=^m8CCWc*)IZ?g)c*ONXSBkHtpTFSJ?k_Xw^|W5^p?O*W8bAQmS7V`3 zzv`OWnp$Vg)au&Wnwly^1M}<a955imO$Z~UFR_?1aJ5kUQO@l^)j7F?bxi#|Sfi4d zGHa`A>&e}<wbd0eBL^=L(ZXbHEghYmJ*~Yh{%x(zO;%J*nueU&P5U|pn>2mvlMwv^ zy0y&-*_wXiH>0ezMq!n;oV?z)HnsFhZE)M+ofWr+>jb{**9~+U#^?uiv@9ZF%dxdP z1Q9#W2QR;>4*m2;*vL+Vw*WK`&Fb&d0%G#g<A7FgsFOgpFhkHVG3GJT6tZuz>QpL) zl2Nd7N&(ZaoR#^?l?nx;^i_b-c@!R{3qO1mn35GdrNXV8EmtV<!d(iD$!N9``GPU~ zX)E+J5Ir8+uHXXlfW`k3JIR#j*Q3?y3=B=7mG|p)hEjn-SRvFZMDm&%1;n7*z1pO+ zdV`(;n$U7utMhQz5~LYQRYo^{jnS-$XTSq|Ey9EQT?eLz1Rn?qIdm{M<UnxH{-FKN zAWx9*{-B^>d<6#u2fKr){i8uturr9=?^j`_jd~aDXRMSO(C9ljyMxl++Ksx0400%a z#&lzdLnV<448jJG<v4T;AUNjw5b4UZbITN69KKb6fe@izj}DMI=s7w=gAsz5(O@#t z<_3eFHZ)YNjcBvBHhNm9W~POQ#hS6>X$feuwzO0zO>P54I}MMT_)?__cN!au!fVni zDvB#g3$Wy8MOk@y6%mLOE;&yj_W^2La({(f4kWpOIj7u@{J=h|@Yh5pTlEGv={$3V zfB-myOdg@yme4&hacsKPj`*X;-TQa7A^d_J>{N}7uqj<^%a#L5n8LAGJ60{gLP}$( z1>ggx<Xte9*^Up4uw7~-MGYZ}3gH|`wC4o$o5Cys{;6)v1)xo>j^N3t*68#aokp$I z(HgxDFTK_%y%8N1=Zf)*hIcO76T?O`G5*n!7sAiWMidV#wP%i9h`Mk(>L@=q^u+c( zTh{O0zA<X|(Vd&OZ{BAz+G!I#Nl%-a;x09T_j2Hs*OJjTgEI;!*uiV;0sRrdN;6D$ z&J~r;Gt0%NcPMHEi<MbjtmfA<dC9*TP%v*zXw%ls`@+Pf7=Aah3h!E+Shr>AKzQ_x zCDrtmrG>?dFJ~c-p1?OTmIX6L7vxE|=6*;bxe_!)rJ)U4y+SGx>*Z#nUTX-S)JFNe zQeIwG#+3S&m6nw<Wsj6sUO2jc^V#T-b=jBBo!I^JH|xLq^7qp}tzNhBryqCewdzrg zTSIBd)}fh<F0;fY0XhSS(^OWa!^F=42j#T)3S0I|RrBT=5BvB?$jKYVuU4~kOx2;h z+)kEWuuAsLxeFKA;F^NV7p`5ZOlSgZFnr%7$X?SJu1@+*U0i=XYG7HWBE5P8qGiZz zc#C_IA?e!*>T+x5s11b&j$TbEIFeePT8uchgv*!Cq-AERTQ&?+6wiarMfvlne^gYK zdP=BbcgZ8gCFN!1MR}#AWrdaT=TpvIiAxBNOS&AB7?E-+G@CYgjI7CR95woxj7AfF zK}o?88@7O!giB_O3<7I;mF|{Mu0Sm<*6~$G)7opX?W`wpNA~%(MTZVlW*l4<S<;Jm z3w~(mNz1_l#p@5NGl~l9(>nodZe9I7hKjh~*Oji?#1GCEC#<_%WiF{%UX_9%A#P6m zgH-->7d#(CRMDsnx#yCP9Nw{K`_6M=8?=cbk^46NzW=DGV;#lg`S5(kc$k;Tj)%wi z_)@Qxm%Gc@a!1(%<rP45MMcWKu=A(So;h>&>`C%{_RP76s0dFu73L0i;*-HPg3TVz zh6RL2@6R^USXz=pE&-TRnX$Mlm<(1eXk&{IREgSASn$h@<Uku%=|x5kiqbe*8G9?+ zHGo`wyvW4SH^kh7WWhE&(>>%IaIoAmXr7^Nwxnwu;0b1fapGk(4}iop5}B?#zdSdu zFsG_W&oAZ|6qb}0>KfOyQojEvD<g<4WlDTYONvW8r4(q{ucET>VwfkwFEl(dEYcIf zhWUnbp+Qur2hl@p7@~*p+l_rY!i8L1L=h9}AD@E}G67mHU@TOD$$<a>js4FNW86HB zQ3i1m;-+?*8gmz>Z7>iWBz?nVTBo)~&7Lu9=1kXYW+pX*nK^s*teG>WPM$JlYQXCi zl_e#mC8cFdNnk0rS6b#O<&~GZirEqmHnzy8xUhn$VymethHO<-HTmVKno?a=Mc!m{ z;)tutx0bdVMsMM1GGU+?gti1=Do})4ei2(oNOqIH494*`l9j2YRdPKnVmD#CX>*)l z!SL&bMxt|Q{Z%@>8v2cn=quAW(Oa!ET|9d9#0lm&b;5I;ckCo{>XDPjkA-HYrCm=? zjl+FvXf#Atr3ohmht)wa_0?!|vzTlu$Bm82o}81NomQ+PGB}ag#}Ke)QwMTH&K;sO z9<>kDkP$NAYV<eh52mEzw{(`1mtB#+*RyS3bP2vS#@4l+i*a3CTbLPYznEL}TZ|-r zm^H_&-BDbyud$98?`*B^KSxG#jKnK!vif_pbw+E0xk0Tp!#F`3EM|@M`UeXZFrTvv z{61gs`GN)R&z{2P`!QXO4NVP2YT95h%c9aGLREULQXrCv<RZDap076u%tIz$v!>ka zGWgI&!x&~t%$7z5i_aS9QSKLGB+`Tfa8=YBZ`w8h*WT49GE(;CrKeT1Owq2|^TVOB z`ANZf$wgUZLGm!gHsO_vJF%4CrsMmgE&Hw~Gy|^Qtw$)wc&+4HEQ2G=ZY>d`@6}n; zPiF|OR8=OFN^5Fr^UHIt&>cHI`^CPJTH#*#<ci<ES=wmU(Yid1Nv}6m9*7Cu6&bSi zRBF)aGf8I>4u&1AGuA_V^8sx`dNC-<j4r(oa5|!AX-4k{{L(bhG#EWRu$bq@;i@wZ z-n7|h8`i0oA2%iB?><<~I%;=bJ9_1(Ln*4{qU~oxS8h))>REOCy!^{bR0WFJ5Py92 zi4r7?`g9+-NV$;VOgR6|S(_j%kRXf*iEjE{t>s$U-ZlHemToJ&wlys3VDQGEhW4Ec zmfDthma<EpSoYnbw4~|=eXhbl(?&_XvgB$}^5wj&YdP0)ujgMYzbr8dj6()rqq@TA zA^_53XuTcVC^i>1BFAx9sxuL2h=DXr-8;n6I$MkVdO4Dhvx=N`>cUFPaH}J;xThlD z(8G$;I@QJSm$h`7hv;l^m(xAQbKK+|e}IMRVRTM<4kSinMQr)?+^g|7gw<Elvnr1z zX3?$N7Ofmu@x<~~-!3+mW;W>a2o!pQ3G$iQ+|XdcCk$oyHtK5zRlaI*sp-FgAiw|s zV@16QWJaW2VW{>tL*t@UZ`*-M|B^QGh=O&G4slWqR@4PE(<ZZ_p+Rae(=DgpU_NH& zvmf*3f9#q+{p0x`&;R_bz5TMnW^<8(kT^}mU|-CV=sT8^h>g`HWu>K~W&WjQWySnI zb+m(qQ2ggcLKlh3P>3mFYNf^E7IA<u?oSbFe%)Y0^qBsBuv(7681RK7I-?H4t0wyB zv6Cm5lhi5CN#1enOh0vO?bf1#xMZa;T~31)p<A3Zv|)S$&kc-)GTSV^&@YH_65Z-G zO>%k(WpbM#yPLT)^v%Ya%Ik~}<pR;8^;a*1A>uRuQ%ZPbRKzIaP6H#Nq9Y@tq9Sdf zlo3#5g@(3-2AoZWJANW9a}t_E^DxXquqUZuaMHlQLTe$LL6>iAv@|z2Ha1zA#`~JB z*5;<>7Dc*j{qrx+TQF}KU&!Z+F$zfExzULNrjn`{t@5udm+7i1nJN#~Q(~*`sI00G znT^n(4BF~S?jVJelW<rF@x};>@ik&>jNO_!?k6)xWDewX6&j>c>5Q_PN|BjH%fOAN z!i-s6Tv%LMR#K;OgI{Co1AG>>x<wtJio<H!6QjBO$=s+>J7HQ<;PbC)JwH_-sTYcc zwPGP(kX<R##1^Z>(ztkuP+Fc-Txt32rxnW<f4^2F6^rY&MjH*Igol3EP+U`AS6y9S zS5s35FsiD{N~9%xJ~UtQs(*nm5Y*S^i?cIx3-t100hC-JU&zG|3F_<e#MxQ-d1?$E z16@;F&F3a~$ZwEU$uubpRSk9al4;UYzhlMs+pl)Rc;#vxivDfg;e%TjB0y@w3^}pR z#LdYcA~vxI@f0wc{Y|Yh2zTrXP7L35<j|f22lg*NzM~@K*TWl*?%Z;8^{y*h6XI6> zYuS=zOMhGk5G8y$W<HRioA!bJ#n6u$Xq~7wKc`NYQ!7)}YYE%ZRLUiJg}L?Vx!Kj3 z1uy1S7Zudj7A0NIyr@)33yV?Gt0u25Ge55;zo@#dB=J&uyvPJlHB|#0#WYbGiCm7U z^H~CGm~5b>-A#%y^d4F`|D#Xed1?N>1`_5D6{&6HYJN*uNbsgO8;K$URuN}#%L_BX z70FSpM-xCSX)p_pY5u07rE%Azk}pOj9*zmWdg??{xG3k$<*>xabLS79yLK^4aO|CB zOP4SIX}w4WpjCP$2H#%{$`X+Y)jUjkQQ6sZH*N$UKN@wg)ChG<S*a?GI1v$*d~Sc_ z)zIg|uAYras;yM2$|@9^irD?g>PWp1b0su3<y=&JO}SKAP$Dvd<ERT74LReK4CLPD zwP_5uBSjNo6A52`_vQQldF$<`KTsp^lOap`#_g(2Kbn|Pge6w~3*HI7V*)R1pKoAj z0%W|PBPuajXmmzVEfM$hGz=U%1MC)RosrfUG-l)HA1?fI;is!aVxh2JXH*e*jfzvL z$+0Q10+T>fcD<%DDJd@fYON8*4t1qme4{8gJ304K?v>&fu1hM?E2=BB>WV6bN}QgX zRwU)u<X$SgA*sqJsVSE$3(Let9jG}oJ0pLBxJob#BaW@J3;HtKv;4#N-hOk@f!HHe z&h{+Sq(hoZ{<3F|UOXEbnufIpZ$kVhxsOn_Ka?vd8y;9td1}Q?@>Y5@fl!yhq!b`` zLh|>@VI_x<q0!%1w|>p0HQPiIu|TfZDMxAc#;mxjr?*!&R7j*MrBtR62vkx=JY7;( zDiiAAGf^w`DuwEK6|4ZV!rJSZIcXXNUjs)7_=Q5HB*q+hLEZJt?CT271O)zWW(+JW zel&fHqKQl7CcM(O{`Tq%uPse3$MWYv4@MDqTej`ml2VWtnSx}fTkwv{@PEk14#aGt z0s0`nOyj<>OZ0z;tVE{qf$<YljaqM_VHz>$EzQ=37E6K3sM4tFYwHnB?G&+fb8G8r z%Y~AH%$&&cIXPL`p!=N6?5vDZK}6)0+^p1`i2UlT=S!>0E6VB(a2bJ460TO(<mSa+ zttrm0uE6nHnmewmtFKp>jT#YSARaR!{c@Ad1Dp>?HUb2*3|sr^yx`B?_<irM%P-rm z{*;1vp2o@r?{C_-W%UMAWAAN%34$l&!;m?C5+_5^oDfB6fGslPLwGRgxgYoFE6ZUX zBX(h-NSCiNsEi7}L=1bWTk@z>ERxEk@kwVcMaKsP$3&hiQOacea|e!x9Y2$O{aVt& zfD@_BKpE{Z+-X!C&I!AICM)g6rL*V4bVOpo;d@N#qanu<&n8ElyciQ5nhJX^kxw9C zP2z^EbfgQ#_8w|~=ZDLoTVukPEDy;Nu8%<=<kq<lJ@U^Fo_Kd1-SQ{+COAF_eEvP4 zN+PZ@hDjKYg!99$ZD4hTf?(CAc^cYbco24;WBU(B94f8f8xealDw-Gx>x2?9;`JpG zkC>7$Vjt|f#rMZtIC0?esi0$L&c@~{#1dijiPPIoUQ3I-dgQoINTOwoo?%p-NRCfD zQ+V-e=)v$qD$J<&7_^ZmB9aeYIC~*H{$j`#fN3h{!1S_W=}>of$)%*&uutY)PC6cT zG3sda&pYCyr0j6`f>)mT+ZWHi`DsGsf3c?9wIgl{Yg2$n9XJ$T<E}>7N8x=$>?D*Y zsZDv8EF)!q-0q^ZHAiC49to4nbc#9=;6tfoF~GxzM9cuz2PCyM;yOuPy`WAYl7Olu zwfuU-jVkzZ6=rZ^C%nU;l<R0YEro)o)fntFqnk`)8qg_;hR0DVCun+Ek#wl1=lcg9 zd-UnIJ~(#t?73sdb{v23hZ~`lZ1wL)_Wk_!!oR=s$q7~ee^crN6*Lf-gl?iyz#{=q zL;#F3pi4L}o-p7G+PaZ^;}eEUBG1q!SV|Rob-n_`E9Z{^i6i1WL<FN^iBt?vfLO!; zawKSo1qPGKWME;>A%Z>&H%A~Ij%OOULvD~N(b!zv2&~}r87`C|Ow!-oyW;U@{xbLN z15sPo?+n_$JMo@(B9ENuDSBf~$caPe*Z+Inxrzyx^Nzq<<_&_lJD{BD3>v8!D~%!7 z8ZLY{MXH&*{88y;Yz(t6<-q1dq^xtwm}As2Hs-=21rCoh&@Iwfz^g<yfsaribPEFT zN&FWc{3c$EX+i;?nE4g7PDRr^Vy~hgh*Jg#yqsb)E^ZU10-fMl&X_Fe>+1XUub=&8 z?yC_AYZrd|^RFSh&;Rn}yp_dO=YzJMjW|~n8M!m+|B?$P;Odc1xYM*szG<wZuFWyj zHZ;=GY#$lHy7yhf!|lT(SO5>J^xCoT-za0}*@jWyYIxevux(_-Hqu$8HtRXDd=xq+ zFaUe0!D4B!TG9KnO^uCKi%D<L;`t_>5tAQ12!H?xq(jQkM}(YeVjmdCPhV%xnn#~~ z>E)La;y3@a;N1_tc{{!I=kM0WT~EzDfA;LTWOMy*kzA<spM;zVz|7@DS6LP9tj{b+ zO-L?I%P8)-B+9N!%+AWZ+&4TlJTx@y8KQ;}mOac4xrS%kMuta5hKFo1J7^P`KEQRx zpb4o|TBhL<quwMrcl_v~a8R7NAUOEI-e|o+qc<upoj;eVhu8-&ZkuliPK05SuC~r! z?|b6KCtpa2+`sYHA0C?f;yVY<1x2LBr^cQ+v*)L8zup%@WHmQ3lW)ptw<BB__F;ga z(n`yXZt?Y^$cq_?(buX5Vs50D6lGk@%<Ug>5BrV`505azyb<66Rfk7r43h&R<*`~5 z{4dac9Q0HA8y6B|t|nHQjKcj}4xc(JfVVp5Q1HRMk#H;P>d(FQ?|*(RHDQo?0VuB~ zg0+{!N!nUXA3pNp3r{?9_+0SLwZA+$>!HV9+!=r3RCw~~BVRo_^N#8BuU2845CFVl z$RD($hd2~S%8ia*Lw{FSdvixu??_8uOZQ+y^+4x<3kyg($s&?A#y)17YPUJWs@u)B zWJR103ExuLK<le=Q!4Zdm0YH7R7liDiCU-5JG+*z6)Lm}N<V~#cVe@XX}0>7q#Q18 zY8HR+%wv!LW%j}o+t>cE^6#@Am~-DhLgM3MqK|)n*YsJl=Im_{fO*|+{H@aaWPm@} zr9^~)w9Mof8ME0*Q0=JQh8jzDJAOGp^Q5b7Lx_||&+|rXWXC-`#Wq~8GU;yiy+Nx~ ziqtYpUbNX<fBl-qpw_DC+H9##O{2^Cr^_G~(P~O3@rwCe&qI3-7h8-Q{`&mf2Oqod zrIS0Ct=jhf-H%PXcTPxa-r3WeUYd2+-S<AQJ|O`S)c;?kGo=f2p+;J!Y;S5}nkj6a z7N(ikgfCt*ez8rX*jSu#HBW15Y-ui2!68j3W|Z~^ONPqn!BjiPtWy#l#sDQ!hf%FJ z7#k$1YIyY2etH}=!Zv2KbG9*Z7lu7!4CJP3FgRj$_L|u_78NeG=KS^XXC8m-p-1oE zaq3X;-tX^!dh(t3y?^Q8+AltMVd~UrGw=KONFlP2ZXx84NdS|HjHi=VYkInvZlA7> zE=M;ONbKfyb&hs3U1Qx-yE?l%D+w3Ez;%EiZ1nvG8j3T18fcS=d_u-o8T2x#R4Ab2 zF8CmA*j$P!a)m}ARl*IahLiz|7?cq=X?+ceTjD}M!-dA}_doR5Bahtu$efiYLv|nB zFz4PG(`G;M{>#rj`{{>wPM?1F%x51vhN9#*TmPq^q`S#HXi(Pa`nzEVXl`t3B3}d( zh~S(=cJXd%93wbs^x%_VXHrvRQ)3AM3HB_*5PdgMR0tg8g;ruuWt7!<1dPBVWCeCi zAs*o@LA{`+7W#B;U7ef*-pFBslR&w7JzQM%!sIE_?wAzFn>26#mUYWMyo2IVl;49C zb^lu*&h`tKMm_TK;c;00FPkedF-@Trwc0^iP29U<CLc5TWR1R<!p)4y7oHcR6Gl`M z`4wO`7APAaf^$I3#58YID&<4~(HQj__<o_6&>}HO!^9#<BsCMCB>B=8ds0R+TP%@@ zFyBiR626$2D-j9-y%;hlH~(>3le{4TuDtl@nDCekVNLn9_}GZ3sL;sd$f&fuyrc`U zap70h=Dt4;n2DC08Jt87kOuU<sHEcZc$|pSb53@lavLK55WCN~r@Nd^7vk?dPUo1z zi6B7C?Zmd=?+_}0qhU~t8G{8gpR^uxxKhE$*~%HhD!v>+JW92=Ua62Fbx7<dmBWX} zK!SS+-$YQu7d99;6%v_3R4<fhR7Q&h6F%(AoZK>AWY^469k)sB50yU{_8np`rj@nY ze!6>f)Y5GMM;&VD9U2_~#~Nv-yPVA$V~=&PZ@@NeY#OuKMu&PVqqfn((LuY-X1DPP z5F;2gf?Bg#-9U^GRax;7*NFLFmwzKRJYUafCs`UB1lc7(%!|l)l2+x_%B3<QnqiYk zWg?i+0gnuLD^SQYYGg8zRM*(m*JB|VgT&&sViLVi(SR&`#7y62VH1mV0-PQ#P_3-h z4bWYq?yQ3JlI*Okq?{Y&nR-ojO=?tfXGL*QPD+nBxvDenVsVPfQd5^u+h8rtPi+Cm zwm}0U;LI?@UQJIplU#4cn9*O2PGbyrLdaBHj4EuPjpoxQ1UZLeVbyq1BoT^I52Q$l z<SY|H62o`BKvr8N76LiK(z4=AzC<WgtGfnmwnh$|3eKuLj++VKaC6~p?nS1PdGJ+p z+^b*LH9A&*xgb6JQb~47dHM~xCbXs?t;i^9R9{LPs7|lwNvlY?NNXzVO0O9V1=ov> z&Jp_vhn(>l-EiSr#QsyeGpr^<ao&}<>tF+VZAtd!m?FSvLeg05XZwMP7X&$#n$sV| z$@wB-ZGkweR3s7zg@P(UMlD|`5%B5Cd@;yWqLj4s4-PhQOrnN(@5k#b5P&97+n*TP zJR+QEB$cW@U8ln_+&$Fa(cjtKKG>Amj6}Ykj^5$^(czwMdw*}gt-W`sWoWc@s9V-& zYwYVCvX6{Y+f9J@b@F;)HKrPqxaML+DgnsIFNupPG-IbpLzf<igSGU9+HZq%6Zc)0 z@I`!4b!M)J56QVsSbnWgR42rb;!6dEh!hgkSF3vZ`x^;BUenn)Ko~t((w)TULoUB1 zaoyws#BlNtVmQ%yfg0;=7;dzVwb~r6;pYBPyB!r4M{N!pc7{>Uab#?;)!nIYvozCo zJF2`+8@WkyH{~u&qA>8o5NxQ*&%RL%pbWaa^o-;Z%wt-uvZ3_URWODZCAGCxnWu7< zgeeG0Ya|j3D5*%y7eP%IDXK5k%WsrPWioMjw!8tW-`zF{zDksB_?()=9qyuLw#zj% z)WZ%qtnxv&UDDE_92+awvh6YpTdl#$^foL`G&<ZSgH7Jof#uBqB(D+Z|4u|6pj6$b z>v9+8Dbp+Zu9oq8ic<1Q>Xnk(ysC=f;+pb|s+^qSoIz9eu%#%qlwa86U~E$e0~z5) zoW6_pgZyANx#?N3Eh%MkxlAV4$oO)=C%IRuAiRMvbNm8SM6tsjm_3Y3GO0w4BT|uE zDO2li3J?&AUgg}@D(5Gst5$FSNxZi?JNI9@NYN(;ep3G!EMC8QZRfc!MVt3m?OMO0 z=%hNgXjw#M+Ui}a0BZN<p9aQ<<3!Q=?@)ChA62URb)8sEs7O`XnVVZ~%}vd^oS{w6 zzLs^pBQ-NItmHy+S(4c<GFKN@mgHC4p#N~7dYOyfO3#8d5tcTsPA)U(gd9*TW-L-^ z0Lh{F9+CM0of0X7P$z$p(x4&%3dC=5lQucfLRDk0C+7UdUf#8{B`f{KWykBjWKZn= zaaYIh8@93RPvT!r)GlBJKknD$7A|}3Sk^CHg#fK<`wyhZAy=+xg5vWJuhh+fHa1}C z>u7XzT3g2&o7$UOIv`}UwG0)uv{=*lZ5`G@EZ^2jw>4YLBX+ynHf8iSpCL*n@uE3l zZy`39si0oWys~<*5Wyq?r=to4LYKg&x~$Ao&X!HBKp;waS!u1XrmUPP^Dn9w)e6xU zJh5sVTCkQ^y$1WSH;c=^cb^aWMHzK*+tJ769}n$0yYTYR?>`*s|2>2KF<!G^D0B7h z?5pY9lJ8AjZcGETEx)fI3l0BQu;Hs+2wc|6sz9`zqoZR)Hixc_!HU-?KE|+SA$AAs z*tgpt$8*P^blh=!($hnjvJ+PY#6}KiqLgA&c;qAU=M{o{#6iKoLo75ZHR7HS!Jv@A z(g_V6mPI3mbF~V*tE`%a3QIr~gsB`m?e1eM*Y}hy->5x5veoeOFGq)W{CYLAX-nb4 z4f<0SHhtM@tNh0et!MjA7Y8pr4iGyU57z%_Sdyt@8fR+2ygop8J3xUHw-L>Wf#$^6 z0-=}?Sb#vHOpz^MoWBzHm=?}!o8bkcNhWeThAZWLy`BA?efmL%OU9QtMu&?vHeEw^ zOM7kis7os~!p1c|NplehD6vH9W_eJu+zn64IPWB_{6jXK*X<Zcq>ll8mxHu|sCQ#r zYka^O-L`wYtwcMCuz~mZ6iwQwpl$RE1`WTwr$<;Ixo|8ZF7@CAOJ{dYT~$YC!=(!; z;bGC?;kz_l-Qw{U!r17o*rQP1Y86Kw6LR4QPa~r09Ehq!iU9BCUicubAaAcdBY^O3 z{AO%E`1YW&lgO2PIV6bN%~Muo(ppJ!Mr=gZrR&i*lv;gWX}(@3zmy!El$cqV94DrY zl@fFyL^h}mUR$Vw6{qyGzWStoJyNI(3(z9;q3;MuA7T9%QFTT4f3K1a^Ad^c8<*wK zY^TkaG|&O-iwEuF5X^NX))@k_NB+>#Nd~$;HajyXJBP`8EH@`VFDo-MxjqikQ+7^n zeijboXJ_YLl_OBl+ft5VLp5#RmCG*lO8V@Y;wzo@ZYPbTtikW|8g@$AMmcLTbfOHq z)Qx=7%B2FgWDx6x`}R1DiW#g?ID!(l$Ks97KBrAXV>LQbFY^zk0D^{T1}_bRT)Dm` z^y_O!*E0agNobZ}VZ>>hPC6g+Nv+0AB1vIap$yH~oU{jX3sHR-!=w1BE-tMoL!e>> zOz(J?3h0`$it@^`+}yn4@(QMWN?9EyU2~Dh)DQa{VYI?9)zGHQieFlSu4EsJ2|iuB zTeAw8fsQ>%J>Lf3`0dBaeI*Bjlj&bdjU%k(cYeipDFuMCRkJeKH+B2*O4KGUZ;44? zT@`!&kkY&6$$x>V4Wt!yoXpxskY)$6KvW#40FI2_F<YR0w4|yDu_`tTW$m$04Q^~M zY>b6%m<6L5UKWehimkc1y{F67!Rzc`I`3#F;k_MQolT9c%^jUg$K=j-@N>;|y$P$! zdnXdavhBEbL%1{Px=~+nHe;D8t{SeCVXO$J3to6loWq7UN2dIm1os1D-nL_N9byuF zn`M{8zT3~1fH)`T>BUP9ZHlc+zVc`I$Y`2AF7%OU(=iSX#yM~X>~UyCF%`hdVDz*0 zNg!NlNPJ9W^w<U8*b5h8nG0;J-vzSg#-2a77wg0>bHO(uKH<Xb*tj^TYWR$ei;s=H z5EFlFgJ+}9rj46C8>vmq#(+&5H*VUv9(z9PH*R1y25#82@vZ0I`FGAOt~(rZ!gA*F z?z6?MohNG6ZnJ*5rwQfeLo_uO@uhH+#JzHhGI>vW{UB@D9n-kKlm_(eP4#+TS@L%| zfL_ru7%EI22??^1WpgHkV-nzJaxw!a9&x}!tFrlVKy!QpxMl5Ayp+rFI4`H3Y9AfG z9=?Bj@WF!zLL3KqAqN}>eL}e110l|X{)dh(*|2!;tV3J3AKtTd>xSQVZrE}(IOxF9 zzZfVg>Sn};0;MDRYf#AAQ-Y<3JrH2wA@pTaPIlc|3w=Vs_SBnLf*c3ojF6wl=1*vm z>@dWD%Ml{MmB%)RfI!|DiFS2MeW^eyg|<zkG>?=g5jn_*TS}2%@H(K5Qh-#ZIkJ7r zu{(Di-gS1(IsVZj$9C=rIUFn3&O^wi&t#qtq8IVv`M7wjpMQWaIpFs3^Y!6T7YIlg zh@`MMMHWkNp@6w>Z_^0smfr-7$D%qM>Ha^kkeg6J;poDO@B|*Ty4Cgo0Ss*)QS~Tm z<vJa4XyQfQ8nqj>C46*R6{GVdhZx;-gtc+!;r&PpjtaReI5i^lSduwDIpWx{bEhxU zmid$q+U-N}d`5WzzW$T_e0+U8NRseHFeYifms={`KXxb%B2todj9|55#BHOd2R^r` ziQ|&hU0_+kw!>LiVhE}RiyDcbG^|O1+0+~AbsIK9S_C$wSMu(3U|Bgk#m($kK8{cr zWHZe21YQCsnE>t}$3|4$@@km|-drci-9gS7>?kD60}fa&PX^xzX$VlObXr(SXDOj~ zs1-`2I3YturPMWk;w7<hfyMJm@u8(HyK7?3D?bt(J7oDOdlL$S(Tl=+_x#=w^LsqY zuC=latAA<B-_?6)1HTvmNmgsm^VX+x$huw0fMXP$3WU2#Dm74diOJLh2!Js{V`P|2 zCb%2n=ng58fYnK4Pj$DvhJ(kUA$e$A&<S>xDkn+TLB5Xm5t3)6gT$@S5Cm(*vZQ%$ zz5Vt(?_hiT_1FLT8uL%;b<aQj{`Jxu@6Q{1-|xM5-+e33%NoJ@N28VmpONp2$U1DP z&HmxM;BxOeWQ7Oq{;nkB+LfgCD3)E(&6+P~6qWs?IH(M|2ncoZu)REeC<o!~3SC4h zn?uZzdd^_f%?TD>dL*<+2EJDggBZb$Ivd9iDVxhac|_BztcPDm4atH<1Rkq@5+-3H zff9?JPQ&fNv5O!mEk5uQ!Hils@9s3wdJV}b(dx-X3atA%|2<~jl=tU-FmGpmZcbKC zwmT;<J10Zc0B;Lp@mPHkV#ZAjkmN#DBgq$2V<VQG$XHGvE7^U?P&0hw6w`mSKWewA zRJ?Z6C6>Lm=3r_?eaZG^`B%+Xxrsqve44lRJb`|K_RkS4XD%C;Nr~J!E|voJ@p+s> zE6d3(Baj@?0n_Xw+Fq4FWk3)+4ZVV=*CKjMuN|eQ6MH!VFd9nJV5T)I9yM5CnlV|L zR7h-UY>-|bTJyp8-+ukgH{X7}@I6_Z)nIm+0*s~x67~-l4I;=O4n9d#3)DsBhGg47 zM<?6m=xK4gT}@b@5lOql7=B&N7>(1Kj6*Q+b#)CpJ&1Qi?vJOCx24z%<sZTdI6J3- z!*SOrN5yWiOE29LW=e)88I^>Z@phsYh#6o++XpZa!lMU#It_6m!6V@2&^;ZE1*k^Z zh02)I@zGmnN1fMPJQ;mFE;QnNY-G&U%PF5Pb}yT>eCdjh(#3M(vPH5X@r0AO2_$jR zMDXQ2enjxa!VA9OI-Qi21X})~TqOj}Zbmzq$Xxw;(t091l9`$~@OUFY56_N)=Zp5D z+4lklj#j-WBC#=q1Znskc{-rU-|J3d=vg=j$&_GA6PFTq`gqWuyG|cgoY@<H@cglm z^9O<=;wo4FYw6Nu%+g5+8Tv4xAVEWb(7~#XC%S<xni$oma9Warm2L_3pgNNFcrmKh zWelSxkq!V6ZrN9OCe48oMauFLW{^O4o5OHg5hP^oxJ2oIXOiUryG?u)cqfAyns6R4 z94}4`fQtz99)wEhG%%$Q5VanJzRp7Pyl~NGl@Li5as{gj)Z9Rn3#~?UbD%=r(7J3P z$-A7k_~)PAu5U@>!Z`_A@klpDGJy=(;pEIv^}wp;_NLvXj*C$}S85GbNzdi;Q5WrD zI(<YR8xykIaH=7GUx6dGR%GXkhfc@CVeG3&586NL%0;#HLfCpcyCeQejD~gJTs865 zTu6o=A<RH{6Ns`k>KvcpXL#w5qeVia=m4(<2E`sU$qhY3OpuTYVv9ltz_aX2Y=;a4 zYQ+B<rjPdkeDP5BO~%<q_~VHWMTf{417eIDBR_U7y7SYG7F~#;y``lYZxbE_df=W4 zncRzAVwysnsu{+M;L@$NJ1<^dQjt(`Lb(6b=__H&t|i1d*@PdDZ~rCrLdvfG^V<_r zBg*10o|d5x_=2xOXPeI*$&V5zd)U26Df&{Dja#qd^7C(}$8ep{#i%D~Wz}Sk8Ra~Q z1k+^ZB(&fny@Gu*yWBZGNXgh#bt~%RT1W|uj?#K`0nqC~NDvcz@uhNUCy`$&HD(vL z)(?_{PU{Q(9_R0;RcgdYfE8<u3dH_#W-OEL;9n0OKgJxNd^B2v>>4$uC8y38ca0l6 zz<39L&Z;;Vxj}*`p`?A6xBa3lNG~mj|D_fyWU~>w)@|A#kGI5LU$w2`AKe)#M|Nt_ z3w5P?*x5IhZ7&owofu=c#wC~XS$F(C>*%-v<fhG%41_zmU@wTJL?-8u4>};C9Xl?a zdTcW}a_~+?=mWe+A3<;;{n3R<mxP3QB?k@S<GgvpB;<2kqEKrTH?wO=4BcZ~+@RJh zl^_xq7>8fYtW%L_W|Pi(^0lu%o<E=YIN;M)Pgyl2e~HV=MIJe^jf|(CG{mL##;cqy z{mmts!Hbo)j`psO(F{drKT4-ul8mLBnn#+NGwOQvY^y7+h>Q(Ov4x%0n89xx7|pS> z+9tzQcn(IO{&KqJt)NwoGmIN?iABi4^@PW(&jW5Eet<`C{egOG9B+Uy<?V-RnU>2p zCYi^a0CF=!TEQg^yGh1062>(T>J-W6uO_DC#7Xnwk`u06xtNfinv|<)*!ATvD^_?` zPX6_a&9t2BMh4J(Q>p<yw;oBD7JM5Sr|>Qj8|=h@RMPmHQZCncLeDI4HEo<Zqxsyh z<~TP;;2Z#mT;K?sNP}91H_M1o`*0E=>3mjAAp@EO6rnX76dDbSqYoPRJ9i!V_C(l{ z+Q<z@*X<A5x^B;!{YSM8dp}>cc(G^6<Yk{P$&4r^GMAf3VBUOxQkYZ_nFXV6r;L*K z$tbLu>Dvk;uN@}NL0NzlLBxNUMQ7YpM~EzlhN8`0`G^y0IdTM+$RT3nzzjupS^FJ? zGzm($Om4Irsp8{etrC4oAOT3;G<MCSAX}B5A6{2fR9sV{yO<%b5DIFl>XFH)wrv0O z*Oe<g%kTQ-<1L-V`FfIk&QUN4RRmgQVmhtA8XFyraPNqS@W|+BCW?(_qbPg_Mn;53 zL?RHJiKe1PLMZ_dSHp0z;5RN0-pXhr>}cjqFo_`&a1hO(1UQTv0sJ_c8<&E~Iih>9 z_PhQFB{vAiWnaW^av*wRH91=3u!fW#BKXi+;va)x0hWuYT4hT5*9Y@HaL>E*t>liR z3}RidG?;Z5)?O&*5^q6dM&|Xjw2a(xVMSJUURGL0T0uc-+KsfV!rI!3Ql$1|`sOPX z(oqG~20&XFMT;UpHZgRckSOE|b)XJ>mndRh#BuT;#5}L11KK6Wf`MO-+kj|Yw!7^k z>Rx4?0@0=Leh?;$H!4p+J=3UBoI&T&`s-90@Li|Y2L%~e?Q`CXxZ(@|6u&eoM9m^h zL1(Va&4QH&Qg2nWY~GsG<jYL*q!gIo3BLyC<-&-fO5Xi(<&lIOe%*J^Kk@R3?F&9x zv~c0#?P1r;Bzs@qbZFyu@4oOc>h8lMG+{VSkTS+6TI~!PZu>#6`H-Vl0v)kw-c;1Q z<~WFg7^<^4CWBErq9H;cCPX3xdL>;FD$Zq8a3T~W2Y-k}2v>E}Q-Db#6a$fnBA=tx z7*)0A2DwgcFgLceHk(_mR^`{P{pX{3%=?o+`1eu-HF)RQH;E(|S(MZ$Xl*gpB+mP4 z=c1s3(C9Ts+O#c$J^IQela{oVW~9bkBMI+aEo`r;tEp1y9_bx)ny=fTu=0A4@ABW~ zx@lbeB`4lvYW13#$*3geW)^}X*}og`axx?Nf>y&ptA%Jq#48AmZVp(UUPF!`!$GTa zKoCY2Jd122mi#6P5OIav2e);?wes{3VQ55tUQtor`68vI^s}$O{>8mw(z5vyiwS)L znej~`RYVq_PQP&_^IBr){D1wpJaNOapWX{8EGVid$h^M(*9Af6LN8?05NIXK;6XXH zVe`s_^&92s-yB<QL$)-^i=11~?G+|(mt+Fhy{XPXREGY|*aN+2B+~^2$(gbbjr$8Y zF^b^NE6&5VKtl5f#6*#~4J2`#aEbq{?omy6^{M6C1n2hztvM7FvVUhqbLkhKFIu^D z*)qt<AE&@hOH&XWIb=o^?#tNt+P?E=PtW^g@m}lBpJVoKzEP0z)jyA2UbSIU(8o*O z`qxSVp7Z-_iD5zO>YJ9V`oXZam|Z9cWIatsM9!{Nx0WrQ;1nVP<LsN(`Ej%n{CQCd zpB7Nap%X$QYxgD46VVALyofbukmrQ_ZXIDZE@%OyngK_!L{%Vk>jrXhk{w4jdW9sM z0l8XDL-F;Dlw5UfSw(7fO<wkOabxj<Z-Ct8la_rf(p*NC1P48k8&$L?<kO8`o-e!f zKQDc|K6}N2+^BWe$`1edPH_FQcQ+=yb0X}GzY^%#q$kADdsn5Vu3LJzZ+B$#C&o#v zEA6{eeU0B@g^d5EXD<4N1gs3`yGH>WffpYP6e41%gpCZtnHX05@y)?LgLJ_yx`xI| zbQtz#5*@(TBT)f*xE{R$zzy6PP&wplt_N6cAnGPr8c86P`98vo4JPTrx87Uu$)}%w z^2xj38+9oNMj~(%z8qDwY0cYT|9tkymH)l_{ioh|`-7w3{}z6A!|z{h$k_hfnq{w? z%lZ6k4(|57?$XSJReL%Ue~IhZ{d+FVPFNm~z4k+)7wp?+CBms^ayANi4d*%HfM&c} zAK_enI4}an%yN9}ZgLvH6Y~UL$srYdR_D>9yp5jh;e%KwkVC4UO@6B}`*=@4?A2>| zdR)uue2`}9(M={7Ycz;oMF4())?mOaguOd;)|%J8J8|gnkwXWMi7l$D;C&pk1`~@e z{9)Jf#Y@he+4;nMZ_b+X(Ca_Ex8!K_k@aiBZY+J}k*8i-_TroC&;xz{<+i^qG{Kuo zrrvQ&1P2)`ognCOC&NUEm`qrls;>5mzeJ+o3d$gl3-cw+W{@_Bkm1qHM5P!=7kCk& z0cW+7G^jCvqEav`s$U@DmI}vVky6r_tH@iW(c@a3diC3%F8XTGqOZRCWV=Cr$vY2o z5m=E$+m3CR|M`M1KK|SD4+Z%9JoD*Wo8n?qmcKV|+5G1wO`H446A%9|5n4|9LyT4c z_xcz0H|hcE2&JTu-9VL6)d=32Pkl)JLan4WQ@>H4QHSvP1GSF|r5>X0<X#)8aO!pH zKh!7GbJYJ*|E7Yee^MK$T<Rq%nyTPU!Yh#K=iN`OpuWIs3H2-WBKLZpx|g~Kca>8T z>M=?{DJTPF;LYaEr4nJ`ol1#t#y}NOvD6l-3|ElXDrzzQSw;=<?&10K=J2Lb%h0xU zR2(%(jZs5X4>e3}#hn_;iX+`r2cEDBZBL|9sVms_P`^`4sS2tJ?O05GPJIJ-LMaXJ z4&Fn&2YAz|Na`$goi~Ly4bPv7r;|JKDIq1LAn4-BUs6W^55=2_b1bz6PdQID<6oO8 zF?A3v`3_H91SnVFQ-JI4;@!`ClsbTajix+!P61xeqqh!I9$p|X04?lCzpkZ9c#rZP zp-j{Wp7}F%gEtH9@1gpr7V2H<HR>n)zmqZp?iG0carA9Ip0fjYt^qXU^$Pm@8!C=B zgExb+p&yo_Uw2Xt%1x<ZZ}w0xQ%_O{cma3?0vqp9bE#eEg)*v}#{-5pp@%*N20uh^ zE~ip~s}8CU*DVIVk5CsVBhMf0F#x*n(O(Yqv<~#K2)~w7A%Nv;YCUxdSCiLMpn!#V zokfe4Xtxw}@GP#}g+6!TA601E_h@@3&yP19t=$2b!g1D3b>g`!p0tG8PHAzq9IxL2 z)i>0~crBx%s4m`}xTBV`0ylxU)<vaLZD>y`)lM~nVlud1Yehe6KsCwePczj^4WK^; zaFqiTF^KCe9AycqI?!AtRZmq@HRxFxTB`zF8a%ff_YI&u34n@VzX{JB1BSKS@g~Yn zjpE)8bR7d~xC=1qsV-o$9mhwoIdR5FwFYGdW$H46*dVZX?<dxE@r;c)DJGh&WO<4- zcOI47gUy-elbe_8!JZwPJCB!(FHfFdZeCt)?pPi#wX2&&U2I2tv#rIawaXJjZWk1j zNRSqZ5AqiVvFGGA7T-S7tk!OL27FxY2;JrlcXHP^j#RV#$nftcr+A}SFoQQ{!J>XW zW~`3Ij*PH(pgIa_#jqaKYJ!%5+A;ktW4H<n!m>WiO{mF@)t|e%QE%8Wh|1n<uf<NR z23Qnfw1d&I{+2#_zZ3a`0V9la*yAG3ef;8K?Ktc-;lBf{y{xURyUX3?+tJkq`!Q;< zjdrqS>1j21=nz)UeAa>TjLOJlo!!Qc6$lyp&oFCf_YA|+aV3p82=AB!+50AWH6%y& zzW!6C-Hy=#1><nCqhnZe(Ph`dSjxf&J|`#P>HtDC#z+Ym`&d)lX#wO9W<Zzfz{IAB zxTYPmdzjfH3_IMP)5~N;-oS#EC>S&5XkZ^}Z0d0hboSc%x|=#W2c4~5{oU;ieXZ8f z9&6`7V^@#C)(miFTKnzF*3!ymi^XiIu4z~HIswskK%_pjLr<4@j9J<pdF?D<Vq#H~ zO&D%WJ|@YF%+j1Ji%7eC1J=m2;HIVOi!p{X=c;59e!(#lD&iiJH62eV-)D-CZ#pE4 zKdFu>7FVBd7aoR9rz;W#<Ij}h%=y%YlQ9mI2)i2El5$0LFdBu#9*VcHj#DK?+WOS9 z#rjjS#DlWb*fi}4YhvN>g=m|Feaza{+G}cU?r%Y8864{ffH1Z<H8!;L4O?lmtgX2T zrc(mfpvA<L6ov~j3v#a>wX~~m!o_A^8C|#fN>G*M*S%rvsFiicbXp6ll9G#cITw2` zM}}4jI;s*-_oMdG@x-_qeN6Vir9x3rNTLC4Khk6>krvb{_owNK`b*jqFR?|+MCsWG zEFaJr#g<o8s`lijhZKsc3K|;=NB3m%!&!477PMj>ifv>EE{!DDXC*gYPqea`y1JB% z#Okw}^6UJ)X~PzFx@BO@=5{i!?q>TKah17!U8stQf&d;jL$YW%>H}Eqv{ROLwKCFN zQ&y>NF%z)9aiYNPjl|*Q@kRTr*3)(S*in$6Hs)MzY*cRC8EtuVqBc?`%Hp5Fs1PY@ zOO+QRjqy=JnMzq0i^8_UCvVhg^s<D8#OxO7$hk;OJ}b~i)kwpQsEt~fcwD5g$7Z!f zme2}*S4TB_{d#}u6_Hfh0CX9mE{aOn%LgjTy36&a`GRJ3c0^kInc~Xxo$+ZN3#vO0 zK#g*{L<A>|gKU$vsim!{rM0EGy@f28%(8DdTH4y$n~d%46@_hSM=LXr)MeG*Xm8ZE zw{;t}?N(!p#oSdHk=;c%w3^M9j<&Yej-J*|i>b>>cQ9=ax9ghP$^A`jt?do1R=TrW zpJDCk?CNSYclVf@nXY?#X=^viewllkEQo>cB7yM6&MsrSyX(O|s}9_twUHd|ZD_=~ zPD@u?V~e$=x7F0p<)djCb|V4CIYbT8L+qeuXkaK{m~QCqLiMmlUu$FgAOV5bhjK8p zN%DgmIY6u%UQLe^)^!JC_ruXqhi5bZwX8-RP!>mB_GzQ`QM_?E`Gf@?`9hPhYeRhw zv&G%uZ)qUL38sOyunqo@jm;K|ry&q^5pcKxyR6x#!D8{A_rqaw+Sh_ZIA!s{WsI3^ z@L*%{kTHBuMnMH~yS1^=W#z&B)yR-9SEI*D;mGVpE6!NSr}rCsOrsyS&or`D1mSbr zB<{2YRT)S$h6jJ8#JUK8zrQz^4X~^GdU|_$^xci!o*q{>)ys7I;y{<Z8<h@l$hW(z zyW7@9bvv;QjDLIghq`_Gq{Op<NA={glSZs;Z+AD6AQ^^Y8_-&h9n07;%p}+}8LU+1 zVn-Pt_ppay0ui%jL-4svg)5zmmGNOM^n?dlMrec8+U_28QSKpZHdmADPLH}MPwg2) z*!n=tDBDn2*~mKFuGt7=AM2}icw8<;QArh_Rd#utxTPPP3tOLS5T8h9L#12R?SnO! zCj5_eSYsHrw%{U|ORx=NnR3eA!~J>zw|i6qr=+A=UfWhstcEjfxV*luMcQ0e+^nj! z78L1G@Kz!lD{SUF+#|RNtC_mTTvnG4Yn}*=bx7IXrf&3*OU7J2sE*5Ek2H>PA;JMr zKErCI!x^=ra`$k#v8bS%9n2Z7FqG3(^|ht;kqWxZ<7Q>>D`jh0k1GJTl6S-SL+tqO z!GHb{vO&2{D#cptI7y%*|A;@vXFL9lRyb?wtwMgQw585eA~e;y<OLNCsDmc0vdWrj z(Nii7+mkuK_2e*jtG8Pi4!S@5lf~WH+TK3sHgFvcB#+H;j}44E2a#kj<{9pDAV+Y- z;lzaK8W?53D*c^fF87#Qh}1y@OOVdGi4rnfqbi)6f)NpG-i@)oEg9u5RO5sg;5*X5 zf^sM{$=ic0sDe-iCRum4YbJp6z5yf$DdYAdJ3u_o+u;m%V>@>fh1>^%a)-;8bY<@! zTM?+Mtf{ZBsnFS2ACs7IvjOfizwBJQL<p{%0*M4oX~XRVgQG6S`v^j+o!A<&5t8l2 zMgVl;Km5sm0A~DjOe7AJcj#=eR90FWIsve{66@|A+CI#(W&dl2IUvmYPXx+l7npI| z&F7HE6EHfkk+X!Z2=%s2gaT!igd&E$yIY}#nB-}e>xWrwO^*sN89zhuxxmQMW=qED z9$Yg;*JM&(+I6&#Mam899}}9f=RgY<R0fy>cr1Zz(1lJU)I&DX<GutS(ufvpdRI4h zcmfR~(a-g{?<=o7{q!rZyzta>&p!3nSDt<9xo4hw>G>z0dG0Syzw+1|=PM7-o$<i4 z&&_`Em6z{*;^FB}J^$cKE8l$SyDt_m{r3YOeD(U%%RMW7mVUd^xtv<jyPR4x7-5N^ zE;<BQoduf*8-vY-tzUq8DI9XGzy|4ZRG>z4hq(^BJucvkb$ob?3W7vU&F*~J|CQ&T zd*zk+jF%N6a_2j8&PY)Ydk^*e|2yPn-*$^dmy*QdlIYmj=rVC$WL(r0EWIoemqu2J zs}_I1^Y?j?;-eeIV&QLJ?A`or+|E;Cao#(T+y3#@f;Ubt{W&Ts?DYelD4%l&qgo@V zQ-jNS%U8I(K*PXKeJgvJnyZ`GE)ooY_#(Tt34-p_Av37bi36C#Aa{sP#StMI0Z4P0 z%ZE(vQB+mH!W<s9<wW=(I}GY#dJs84kV_b2tBX)2*$5jU*zNVwGwDczeR7!Wk8&MM zZgF!Lbao2-#hGbhv2wh(a=B*`CTqtA@gJAExUot2D&<yS>vwf=M=>DWxAEe=lfkv* z|1BJsB716VgtkdDNE66@FE}Ql`rD+2N$e)2l7V68{+QfOD3j2x7ZSoWu&|}u2ZTWe z3lgHn&yP%a7^bnCqnkX!?xOKYrV`R_&7YYcxs;57ewQAfUUoqKhx8fwMH)=_4Cyr& z*RK8v!+*Tt%{WP#;^r<Ow~#SSju5z8z1V1Tkv6wZ9N@WZApRb=p}%mB{3p3)kn28z z2F5jooJ4!PUtaW*YYAv5(8=+qfm`#5cL>?Ne~7N~?vU#VA0xf!A_MEz+}4M_8Z~3h zQOY%htq0oxwtj3<Y#rEakf<n^16#k-hcS9(g#in{2eQXNk55Ovpp8$72Ka7#y7+zq zK5FK;_`c*DtI`Q=d`e))#_$70I77}d_<$C0)M2$(^ADL--!$_E|p5UC@tTF20YT zsFBR|J_Ahy!~H%3{R8fPYJlly2YmVm1|0p&fW6;;px@Hlk6pIk7Z>2H-#~wVcMF3Y zSoe@WNvHNERC^##QdT!ot6f8W<S<SnrxCx$hJ0|%*pTn=P<Jc2fWbz@Px9>=;te+T z4f%AplIw>ZIQ;+EdJp(Ej$?luRI}V9OR_D=YIf`-P8>V2otI~)zn3_1USh|NY{yNu zZ1pZt5{uYLv5Hmfy@|c|-h1z00oVW#tRRU(qTl|%dk3oI_y3Rw9QO9^c4lX1XJ%(- zR@g_g^%d+s?Z@yiY|&PrGEr_)%r0{R%5p0)6X@Yzy*4>RcyP4F>^L$@%vQztIf|4r za?uchs4izM;y@@XvFiv=GmGr68q8YTG0v&y(6|=)w)HwF#42ReF{4?!%&?!Ien26G zwm@`9i^gipreBD1y$WH5r;{UPBhu<H0z`C`(|1ph?bG>rg>qtCRzIbaD~VBvAnR)c zzDHz>A|*Vf1)OQFv=ssighC3*<0~@KQPf(AtQeS6#`|rNLAI=19*mYSqhLfvn*o$F zCy{RDsftl#bJCCrEs@`pz*JBiPIdZe(rFn4o2r>dA3of{aJC5<l6cWs4XZ|L6sBkV zOt|QxmXXI-C8W}oMAR2(mE_6Z)3sBC5t4<V^ChrG$R%ifLD;=(gG4hRJEWSJAd8*- zxutw0)`bCr%zg1~VJt(2JukSm031{M?N*k^sKfP}nLbyYm(ra2{}EnQYdwyXf_4R0 zryQdiev?vyB&+}Dp}Kpkz2(~9T0IleuD2DB<em9eO983>Q@resMMsWZWNuiKZ7TsZ zIhXnUHsw=RwOzK2UY9(lJ-lT})<YgS#S9UWk$=ytC3ar2IGgbbr_l1CqXIiTUr2^O zUr_hi7i62ami6bgdzufGTC_E|BfsG43`zXu#5+aFOa76~u4&=7reeI-O0HFUe-V0g z0XG_^{;w!vF)!XZqsRKrM4Z<;Veya_SmV`3!tGoR*}L?U`4)NYa6eHkYGII>`^vsK zj3FT(I(H<&4Dt{j4Bwys)~UqLxh(19@|#kUc@9|_GER6|xK{>b*g=CQ9u~)%F9kbT zww*}7Fmh?+>YY5R-qRW~t|69IXRB`(+um%r860})rWeIS@z;%wm#uGClPlLfTnnAg z6vkWI_SyS<0CR(YG+ie3&bgr$-W}%GS})~?A9cCxfqZ_X=?bZfupK=$e8aiYA;mrU zg3ai4zsMVWf}YQ}`0A@dmsDF4>zV6P<?d-Ycxuc%Ii$@6R7x19G;+nf+$!DbV%eG6 z=r0Ah1N4x8$@<D5*};SH?Lae`NolPbK&~yxyc%``8{2y^gbaM;6;$&mJrJizw~(^D z(1b6JCfbycu1}D;CNXj8R;IOW|C#J+B5@q`aSY6JxO?M+>;SE;-QByDw%1PR2;VU1 zHtyhl?pC6;lTAv*UGoy66q4*f;{31k@zz}tmkT^?uBSL#6k59^`no#7CxltK>HTe@ z&DDGt`&fUA?<&HMrd>!i5<XeJ>HU3h^4eAVh?rBS^RJjE`MCIpH#j2M)D%fgaSF|F zX*-`En=U$MlUMjbk+Z#jUX<YUJnVs8f4n=I{H4~R?^f9L_tKAlR*E}-hjlDKV+2w> zys%7UNr`DCFrC1-0qH?1nnv<0S$gd#xXOKUK*B}Ux<b9CT3w$KE@IJkwg;?2p)f2h zl_JmA<Pup|5Uq4|ZAINHUI*LlfQGQt18Job$#uzEnH`_l7B6d*`tE6J|5AYok4)<Z zq)gwWqF+o#1!TUPS=LP(2<$p*tyowUkhvbxaNb!XKS~Biv6F+A3zZ5Y>o8~sX6jr= zh_X|wT&L!+HKJ5Q-dQ5zA+V{b0fO|Z%65%fLB>_Mac#U;7F$S`v@*f9bBmLsFij$M zB-BwJmQ<IeG8tkY(6oUj{%R*55s9S>OY^fcuw=|r+sE9>42q<Z`O)zO3EsIVU7nkr zgFRzayE-EkEh!|@<#_~%kPJ*BaQV!5-@K#~=8hT3!YqR3iBLs4KR2^5D_NM6F3gGN z=S8y%5<FZinh}Yl3-erwxGiH;BHb@um=lQ*{v74f8PV*b1a}Sh&WmRjnVEO7VL~z^ zn!!tE5RYOGC-d`?xdpU$1`F-;67h^k0?SI{glJYWJDA=#Ge0jCqX~$dfDQRHfP!cX zHtLJTdJ&>&n+^uw6diOQzjRiL8#JPA*wK%+iy7?k-y|9}%~Z&?xMR3!4DM_Ma|!-e z1bVW^xF|L1<8IX#E2E;daDFtTSXV+^9jGP5XA&BTQK*KlhZ8fx^uRtqj57R0{##sP zNS~3ud)jEW%uXV|1rsKtMIur4icn;jnnor$+3@<{;_~PkS(1{#?^*_n+TRKLzJ`#5 z&zt)P=J~y~OJV=TuPO)c)YcML_(L#QYub#|#;XsWSTjyYt*k3!DvdvvG%0Cp>QR-K zsmP*~oaiRww_5(y_8Dx1m#fIMMV(Vtj6>kj#D5>{BLeP;tMrLGAARCb#r#6;SaHVW zP{u-MzM!U_ua;yElEoR~?G$y@a`4>R2|O{vBIS~u-G#IutMLDc`oL#`ePRTx<^ss= zW(rKXTZ}V`+50cxW>OXj%xLG7bd^6W84;`wPRM8EopYi-j2xKhqg|U?7i*0bz_2m# zcEf;Y#l(QXD_T(;Hc!O5S`tZ~XTqGiAWBxntYHGjzd=8jU2|K?@HQb1uxMj!V~D%5 zwH<=j!iFN7&2M$y^<MD{Z?q0gXuf!z)_!X3|E;~|ZGET3y*9BRFxxT5iqyL(tt$QV zXzc@_GZWu{pu#@eSZEg?bJ@G!%CW2HY_or4WwJJ)3;SPCdyfjWxn5#xN06Q14b<$8 z@C{IBm{l4&UN=nZ9-^(@sEbykqXo2EUO~5TSR*TJX+JG}9i<Ak`!^}ty4`xJd$u4* zK}QF|YO%)(z8Pen)^~0*C8RcV@>1F7F}S3`CBjzWAyM@fL~Uwap(4(c@(Jq5Lt_vR z@r^@I(5=v>UmB!e*(m4n^+N_e8DjX`Ocmg_Mz1oalq~FBnjuURIJBrohRpaw%+PLB z!t);f$7M_c?89j>t-1-d)`uSBUN<P!$axAK4hDx7$D(|*LN0Hiz`RDUEy*{nidkH2 zmkY<?Z3kZoy$W8YaCbMVcsRDM(I7}Dq(7*C^%{aBt--lkr82I;^$Rx`Rc3Vm7d#Et z4EQEoHB+e$H!`MDMn$*h(C0Gr79*-}=N^w+8Pz77!?juU7}pN^ChlJBVw@4nMG~W! zNY=zWZ1yD*otRh5_ND;^2m~Wp7H<*F-1l1>o1uBbHZRXiNIRCfn(v60H;-Uhg?839 zxd0wBt+iN35-+c)Az*^{C=>+xCl3lVT{zkVtEG`V%MdJnkvUF?o&#gkYH3>A$25zG zu%n$tWx^b!{7$-{ROpA01^`8Ka8Y2GMLkhqT}01prDY6zY{IvmJdPlb{M9ie&_wLG zC-7s5)*#E+`-Iox+(>rmk*-8WA4k@}_LgR*v>gOdw$XFH6_d@P6%LU7EFiPDM~K4O zGWt#*EC2?=tS1)3PDXeDY?G`O0zMDsn)kG1J>+6T{k0ISM;ytz8V9khbkPfo5JUE5 z!=&eH3@p6dNQ^$${HmHu&Q|q+4~JZK0Sw0ERdUZ7i-5HCNdE;z0a5@(+PbC&==f#f z`Lt7QM3q7GFhWc_1IIdoaEA~aV4lF3g{@t1POEn)rbWf}5F{j1>kk7oy~6Ece~tyH zzOahqS`xj>Stp6hZGlxB6MIrcbaB^<61x-f|96t8!*7<ycPDjR%E1Hg2HB2SE@k-X zE(y&QB+)X$y2r}D$tAZx^7P43r?{}joN?0sy^b`M*j@AcMnQz%tdaKI+?IRex4&?& zx>5jyts+51ww2Ssd$+uc%l#@#7`>Z+|6g)a8VVdQ2Yj<Y6cMebo6yN;tg})sHzka? z+$^oJvxOLwe{mr3!uf8SPqPDWjrksTp<OjiAuFd{^}pz<=~WIgI~KB@7CuRFCB(7F zJmQr59Y2!(Rx~nUo|E3ZS$(U|8Z*@uk-25HOQsWop%w)xFG($DIzzSR7p~5edlu0) zj_tvrp5B=jz27%FUab4VOHbM_lI-C4l)NgWj^>{t1!3U<`A(_cdABZGhZ52pf|(#7 z>$dfKUwKxX`|Nlj(FfZIorj##qti0$gU}JSJ!i8SBC_v4{*i6EYpZpkt8L3QA<;&B z9cnvv&ATel?pxn*-$ol$oniZ|kV5u%4l;H$agZ^q3|X>vNeURWZL#rdzZRbwZ#hNO zcdV0RPFji2LGZe5ofYz(dwB{3wy!LD3a$hh-HweVU5zr5)cjem3JdqTz^HnUb2noy zUzzz73c$Lj-Gzj#oRa<<%S0Psd#3c-*A4!imfr+qn?p@vU<oGC9lrVRU5=PFuK<3G zY5(rFF10(BSy0>pq^@|5SUF-aUb4M+*A_PhwFl>1I|{q{nUi;YE?8Au`8L<dyTRs^ zFZvAB2%S|QZP|dqf|MLs!OOy2^H}k%AwtSR2N|+`vM#TYtVFl>L%rruKsWl~hfas2 z56<zhifrDX;w^H)4Aue3S>4o<9)@eBm{HAZvAT<KAz=&)YJw~v1i{gD3tHI67-nrw zMP_tlS*9jpj5?hjZJ5Jyu+FHS)9RL#f;%*@CNsTEW9_kwf`}K%>MHExax96@fR8*z z2O3rBpIMP&M-av;fme}YZEcC#ZL|#Yx^^A<G+`7lrc30oNgH&77VaofuB>V1G-Ppw zs6|@k0!lc1ydCge*XW@CRPZ%yG|I?=2>wZC-b_v8)M)4pNJO_T49)Zn*ZHLP-T1n` zr#rb!ot&`%%<Sj=oh-!kIo|Gz5lM36jt=%ohDMT$mb*V4dk96_+2KH$;tKe!9$UsK z<D0`d63(tu#)qxVJcN;=EE%~{P;HA!2&ixwga%S%$lE76$k5q)=3Wj4q6zyQRQj*V z?P|X8xvsNC?)CFuL^{>j7Y0N|U5maLQE<`xTW{a<<r%brpOEbL``tpjzjev^uIg+4 z)k+sDuP>*ny<rf$KVCP}KExm-j}K*K2tc#?NQktXjq*|C=3~&gbf(x$k*>!H+Qb3? zg9cbH#97Q3%mEx|IsM%D<9@Lv5N?rf(R3LK2YWvZBeXt!=yt9a#RUF&rh}e8hMP=% zv_Ifh#98yq%TW$GGWg!_U?w<Me69RqwDnvBL!Lk7aq5=Mu|kjFpz}fB2c}#0eqrzV zbzKs}+sFHoOdYd}472>=Qp`Q_wcyM1x117=kHrZ=%+o6i?6}?{7t)-C%n`B_QP>*j z+f58scU+w_G%1;SQv4Ny07u4$HOz;$g7{=hS_&zPFseZ@Sk9yK7zKrvQ{kRYsgwXs z*a4lRa61JECoEL#Ii9hFma+HHZ$f8KTA6#8fg+p!GSZ2ZUg5}fzu}%|&xpscEKNz| ziT6MOHDw(wpM}mYHv$#qfqmotMKk^U={leKp^3Kns?jU|GipM`Xkgz|R(Wc1?-)rR zs|f19X;n&^F%a$(!zK^|LtetWX1tD<MF#c~CZNE}`&{yO=SE3~OKFt9>nU#s--}m3 z64l?@!KDS$I)#h<rvyUVPLc2=PT6Aa8V`j}P#8>=Il+Vera0V8uV^+1g}o0d3`ZNL zJ9NyG^lSqS3&d=(a}L^TRFx6Hneo1a^{`ou9L*c^5KGtej@Pn3{xTuN8>&cjn0wQi z)Ney1L|~o~cDKx_#wFrXM!_VhzaC0E4F3kU@w8RoCT!~<tgzn{DDHq*z&4Tn2^E^X zlip3cihd*R7&~gXGKvpM$+!TqirK|>BhKd*X0ckOTU0EM5MC68;RHL`a76htj&A_w zrJANO@r0aVW*ddeLz><aIisr|k%$%qi$Zl}%kVOTh-NgPHhl;E<PMfHfkIFr2OE|4 z=vX#29^;R;ml7-eM>TpYC&S^yNGX<UGvL`tE74=)&q(`>-e({$K!5|A0(J&+izI7` z)w)sOTB}nVl`B((7eXOB_mF@<X^i3t`^8~%;IXy`FdVKqEO)1`rL!KT0m>dJ+S%bm z^VD$dG=YJ^hZ?A5!ndiIQX4zA*e0^nMQM}XN?T38P3&hg70`_2nP#D?EMM3rfRV3X z*glat_(;o5Lfcl_Cy?^kX7Qjr@Yr)B<pFS#xc^q8ig}#Ahqetpyutk7r%d4jR7Nc- z8<_0?j8>yu(2VjBjvr94;W34TgJRmYT@6BMM*C<p#cEG~)qG2(cKTtoni{uBJ~gTq z5TOnUlh$$Q5v54ZW)ftCYW&s+HX*j(I{S%qghE8?HKLeiTH=i<O*hR5HuIMz=}QMC zy4E%kUxFDyT2{T#QK!dCy=Y&W)4sfq5fL6LWZ1aC2pK5Q3wZ*ykf0sd-%H<tYcNQ% zZ-r$YuQZ?rgA)2`a{pY9G9!L(Veev4ZseYTXP6=V94-;TPWFK`$}k>G|L7gq<H-Hu zir6Z&`X)Sy0>}t9k1S78QPrKc-s%xb6pGypHHOWLoW%E_!hM_yq@02!WktdV6->e| zXql@ZlTNAe3LE;0+jzx>;<8E3rA^)<lTOIi>E;W%w{aWmq`nTvZR*F&m2E;9J*WF0 z5qN|Ct*_l+;4thAM|S9(@Na+gZbV-Z{6{;sA~>sX0<JMnh>*7e(I@HG+BD*anhxXi z(=;Zf=}$C$p1#16t!EVJ*-Aw86nEeBv~XhWLC`I%xvcA_;I1gZ0+E?f2ZpQAFOp5u z*{g7PRO+yhqJb>ANh2^|`9vy0X8UE4PNQ9zq|Q9lGl%ox(ZQpKfwvAbwV8VB&{HzC zg<hu4KIf>V!*a?<eV1s#v#ie#>*zykPtGHB<Hqhup%e=-!aslXL8O{&krFb2_|03J zj{f}*A3K4u75!O_ARtE9KmDH_{1dlF{8~a>KUq0fxrDku{e9;+?oI#mUo5rY)kd=u zH86ipL5bUOHIsbYxnO<oI+-C8Z(}GtHuSl%@E8fo2H$r%w@RK|7Q;WXTgc*;x+hTx zj4TwqX#;RirVOUvfNE;`Yf2MNTt(KiiJls!o}kwzIuX!nBVh;ignvu%!;@m6V9NYz zKS_u`+gW<>PUDWNnzoZJSj}GLd;hF&I`^Efw(z&BLGud7n={753yILJ{h#j`dG*3f z=$)I$82`2{FI<1{nK^I1Cj7g?x(H`g{`Yq^D!&W$r0}~S<TZ@F`(!Bii^IR$pNx+6 zC|kBT+fUy1?$F;k(@&Z&T6OL@23x?be@S@0g%|4Xr5^~J{>j~IQ;<J?*mRRO`&nnp znK;JzuU0--ciOcq(yVLx<qOzKJcliFAleBKHFlMqVt9}7{8`e4;~3p6M~k;9`{75n z0Wsa7wZG$eF;T0h(m#2Ry!pY=_q+EMcJGMn-W&bV$FNIe{fUsOq&-D-zdwCh|M{n% ze?9o5Cvwt0@xdiRZvVWFXSF{Hx%=Gy`}547zcKTR3Y(v%_FmoPn{p)mEtgncs<3qL zy<gd+Y^#ZQ25zrUdHuK5n-!0J((<RXz6a)C{9Ts)@2>u+f0tL$z_a!c#H)UE_tnp? z75V(DeqXKRz{S@cur>EDm%n+@^ZSlh+>SK(|IqvC?CFZ?7B$%`6KU48154NmH#RI& z(REWc8a2DbN!Vr4ZKe{v;t8CwYpV+7NlM#(rl8ey!IUnX68zpK@1u0US?j<tfR)kh zjl|+s_Gce|Kz>`B_Pe#8DAlh@3%8P_T}bDb_D93|x7U79(fa(>67u@ru6t=L|MD$X zaX$YWA!mPC|0?;&6A2sb{a-nl_{PjzdH;aEeg0cw|2{eYzVytSF|IF@>%ZmiAnk7$ zfs}XdNyZP!G%t+Fb~Zirr;NY7amy<92<FING++aY{LS43uN+u&{b=c@Wag)O3kZID z;<lag*>=1B@f#;P+|H2Sc(-}@VgNp~EY_|ADMOti(ZCXr0@xU(8rYzRQDMMuGm3)E zJYTy03%uM%oI&w8ey#Q)$iW5@=wR4yIJrOg7uQey>C}GVuZqHdx%P~W?5EfJUUho! zERc}+OESC5@yPY!-vmF?W&5MJ!oiqJFJl98!(MCG1GyCk$scZGEL@Fr`g`XKl2=Ls z_WQJ*{x_-F=lO<z$G!jhrr{;8w*%UFnxQ?uu+><9j)l$LQ~HnJyZMId=|5yd{vbSl z;Na<a#jn4HfokWUpHd$D9kKq4Y@6TcVdd#_DB|;cYIv1PKRy#b;{1ZgQ?*L+EM*MZ z0a@SROkdB^Mz=%0QEaEMvIoO0v@3y{Z7j_waAv0Xj8aB4PU$N9Mo@Dzx@Hc<D1jJg zuB@&?CmaLW8|&oD7x|TijFird6_bj)>y39-Cp_aI2R<t-Vn{(qaqMIfxz~Wz!IH(h zzC%zU23&7<5m6Q?#hUWl9Ri}8&tA`wkSvd`_68u$BZmxn1<#Upk8Cm*t0Sp?kQ%#d zU|xWlq44(_7eD=C63O?7B?6BKrrT!{DCjC9Wj&;;lH^4!WJ6p4_ta&~$Psx;;N?9% zlzt~qflQ(pE1G^;PZy#IE+XW%QSlht^FWAN@hlxCz|6)7VSj!~8D=!2+)S_Osk6aG zpm*R=&JxLeTzJ5L_pfFjPSjEQqnv1YRyZ*+EvJv9^v8`a_7QrZR*N|CW{Qm$AUEkF zonyoegd2<xu_$-KTdP5yDGm-;c46IRZzOn>sk3OO!Bqla&?nHR(qRo}3GP*T4rUGz zdX?5^2mSr15CZ8uCQ&u4l~@{)GmTI+5#kr{00cCjLc?*3tsJtb$AwPu42w!!X2%jf z|4Iod6L8Yj(AKeyr1x%H?L+j_2g3_C;oyrl<Cv<?g+QAtyLdK@ZhpAb4VfG(<J&|R zYRLG-p;2rAfzQIir9K#S$d;b>*4;|zk_|Cj9vMU<Ii#}~*~GSzHtQ)<v)Fc_3prj# z`xEWk%FCp!Wl)d6Qv`Ks?}G!bJ%kJ+dG0NbcfVPUjhrWvkW`|NO(di`_8k|7e0cRA zAv=p(iw2FcA#04sAjt|*5J_<S$eV89;+?z?i7PK>$|p;wY^aZ2lLf`d$W(A;FOm2( z6MkD<duN1_)cVYlj-GgN$FD;XQ07S=-oJ^wp*(7Bt)=2nn6CYxJh6c^-)UWph+CWd zv&Wjx6iN19AZ?wIBjfD+4?>f%z-a*osDOgV(Ei5H2e{_}+HJfHmbf=OWmtgetrXz< z-9aUp=l<v9FUorTzWl=Q)?W(^pM3SdcWd^!9RwpkX8mcz%NbAqru5$*fB)OHKUDer z>C3-Q965WpX3J$5j5^+Wb@aVGIc>o|xjVc6=wYvk;P;NpetPl!k7s^n@$-I%y&pdH z&5qQ(|GM~^=Dpv%eXRHi7mRE5NB(<fCtmpKm9yd(jvYR5uKx$?XQCp0aI2y^@Nd^g zc3Z5y*LwE7v%i%7^X)(W-hc&j^fF6|ED;jG$S91;Ei3{|<C8J*bJ~}bR(bC+yzRUU zmhEvPQEQ?Kg`AZDOmm%p0{#b=Z*I0;{`>EV{qHQt4}bot-HorwQD^XfyEp7RhxV?@ z_RdZ0=y<pI-FMD@9{yvPs9x)4$S)c$AA8y1e^c+>___P+&*situfO>I=bf8K$p4jX zzxkVLn}08CUim!m%;6iqU;JHh*`FugnT7<Af8g3KpXpy16aK5`b#gf2g|3&?-*|rl zD_`}6KmLon(@);bcs-vS$^JB^{-*$Z8w>aV*2n2weIHcX*DOoHqCW;RrGR%C-WFaN zK&P%x226A)rA*)nAW8ZEL))%jy#2-hoOw}L9m#9@{ol%~d=B{T0c{_<aF&p^=Vhul zZU(%x@J{))*9xjCpA2u2z3PhTz544sUe|v`yl(ZIuSb3?{r8Q}j(-1U@2;!A{!I9! zTQUF2R}(zh`#ur-(n{pNsLuTD%#XpswSN!o^g7sdB=+M^rhkxk_#a2RpHqM8WA~%d z(SLmO*_-P>uvz<g+56wc9^n5qw%`YV80qvdhxN+<A$9dKfvhwAplpjmOfRwQ4PbAj zU~`;C4mJn={2$}k_vAMNttWg>ce!5lV5Tph_BLEGcP<00=?GahWuqW{$4;~xU&+(k zopNEajyW3Rzn>svEY>)r^XN}Gb@w9QRUVh$bRzh~SnBEj`#Y)l_H=E2^3oYqcqtR` z{dKwLNS`kW`EHRc`7lIfUU2a9?<d9&T|IneQDkF?s?ge>C@(wdcWOTMyD3lM%+=$i zB%pQBg_)p9t|^C=QDy}QkO+kx#T<X;#w#}&)BXgcX1p?v5Ws@zA6JD186xd{;cb*` z7QFZR=p>k=%@@DVn<kG5|A}!r`ZrPojfjq<fn@`WLLEya95Sf@#4-v6D=*>MzoM+X z3UAq%FerO50{c(0Z>Q}1{wyVsj*?BfVY!4n#YpLHm6?&cffa<9oY@R-2?bOf1tVo< z$s9BLq;!!X@@dS(>tfYTtqM&u$`%%v7MGT=`@y*IGypMbm#`H?p<Y*FnG1Q!l-rTk zVQq|tl+q2G@v)_XGJXIe0~ugarhhE$GaSKl_+b%b<VFgei+Qh6;je}ANFKyNjpAwC zM{oUqSRoGqqp*jsm+Uc2%HTL6n;2Rj>#b3(D3r1ptT*mc*xj(RGPk&8asB!=^J~|K z$?#N3S8MQ4)o+6<T69=SG+?-@)FvB@94>r)ck4)cBZ(Qn-WQ^RO$pl<jI#>Oib_MB zM%8fIAA%#_4pxd7Sf&tAn6R&g1%vkW26<4%N5{9B0sxuuS}0Ml(=Eyv3KV-Y`e*%q zs&^{QZW4JLY4mbTwniW8j6MJ-UiQ7{)YKfKAE-|gOm{S`QYzXvcf$3KfArn5L|4y{ zfZz*l`qln7+Cx6{vHk65&G0T;lL_l%r|PSv5}|0iYfK?GYFF}8CT_LyE%+>O%%FWW z(Ho?yx#axzfzcs>s$){q58$5M=rjr(N4=Cwv8;^pEfW~HL}?NwT!$%ffnotJq7)}o zNQF4@2vegf%K^bfvT)mf$;VybZ&Ooc*-dmeqV2|SB`?|8Nk>>{EzW0_w8oSA5}(B0 z+pu6$Xcvxue<3&8tu#G5Ge14y^DgD;%&`LH@pHDn{W5(BYq`>qz(66tB`!Wb<z7<9 z%CeeS><aR83A^K%1vgLZd~!&=xoFgjmjuZfDbbP9sfx0pm2N<bM4IeaWBZY%PxK4h zH53MPBEX@8i%NamAY%vGtCXd+)2ce4fZ~TrD5%X+=|<2A7GR+{$^OzK^>e$ND=`j* z--jbF@D~Mx=GUTA5&~F&W%ieXiduZd<wY*>Eslj!YE0R;@aZR)&wu#U_2ZYWTrofO zVFwwNT~6@4@o~^^&!6elk~PUhi%>N?H$Ewt7@HE!t{RwD?;LSyfhfC?1$f<Jz(Q;^ zA`*Dh;6y=5e)ZC%SlR|dES;vQV8YEkR1RZ%mWo*qIuICOIIrG=R6*yneTu43SXuNK z=y;|I$3wgYeJlFRJLS^do{K(pZY7Ra&bkquL;pqFFHTolUTUPEPA!(DrVmUcrnmO> zwRKnLNM;wX{;#_7@zIa|_3;P){LuKp6JLywjylgYx1+(fPk$6wp(na=A#zWSjj`6f zZGy3NqCqSJ@&arwM7<vMy~~P<S!`?R>S$|23Wt`q*5*O|BTSp^LQZ4akT|){ro_BK z-;hcVQNF`hDA(CyO50q2vm)_*IBA!@V3ZE4=7$X{LzE3KOv5K&mCP@Rq(<@NFxkV* z&d64l=jK+H*<E^zGN~B6b+3wLpJ1SiV52a=sO6Yf;0&;dtYb?p59uE^(^VsC?1ow0 zsGnX#Z^2sx9fQ_^#>^1U5b>tzbTqKciA!{hvGa@)JRg!Xt@g;gLm@Pypqatf1`JgX zY9-32SyJ7QE=_6@XM%i&HPwJ+a~+K@I+?H}LZurd0%NbR1i{ih>k_WqOWz>m1_}30 zw!s@r09ynfOnq)-kvyde3Rn|mVOr70+EvS-OsF>~6QI#Iamo=~7I97mN%~u>;O(F< zV!g^KAY8Z7%8#-7@BOz>iP20gQIoCWNix>1feB-#S#Io*65%YFZ_{R>4L_6%u4eRq z3crQu%LDw*utk1aNzRZUvm|?HDQ<isuYCB!p7LTW@R+8tWy<W>gSH2AC99j5)HD;m z&>*yMGfzULBHD0DN8H(?ypT3<*FdO#S-oW7k7E&Ou!51*!rAXBS$}OuTdA_6fvN0l z$RZ2m<ynUbVhdxNc?(fp&vx~8I~U*;<aqjy<L&RAL+sAfof$qBtuqN_=(+pa64zBG zl0e7ZpJmzZq=W_XXAz3M<&?c~ERO2loZJ9L1VxiIHSIQ*X7a11%Q_n?fiPVQna`TS zT+z#~(seH=+Ek62Y8I!9ABHZAkHR95Xwg(-mFn!#;?U{hpKn)V>vF!pJNsJeMM2`P zuyo9dkd%%ej6zl%HtC{t7ByXYoC?kJXujdTHHeZg<+^leKA<c*eZD+h&|X;7meVj$ zgJv$4YE-Rl*cngSOSMg-l?qXru2N9THdL9NC>oA0!H6pe?dC@<jLh~d^pA-9q<yQY zjl<%Om5R>1QY?WZ5E>`LfD(bX4cUDsHv;fUM+E*@eo2Q5<S{xpX~(On>b)^w{zDW) zTPK&v*l<~ovN8pp!~ClG;Yvl@IF^=bCf6%QNKds!Shbo(AP=&Z#C}%6pbVSS+Bd%8 z><eNv@_6tJU^|wx4DB&dB*rn?@JN3OqzE6Ns2_sAgxRVt25)$podsb=Kvmqp$?vA= z4?>t>g8`Tb2LdmBo$^T&?DQ^BIUS@_(0xSYbi?DH+IT!$-_%TYn}}&()4{!i!xVi# zJr?kaZAMm{KmkXr)DnPR|9^xEy3q$4E*?6-DIu?M8+vHDLC>(iH_o|lt`6N1Nw3pq z(2YG0p2KbQ!B$z8T-jNZHiQm+ViI(KD=OJ>qR@st7d;?B^LNk*)kM&AqM-*JTx|Ov zmJ#s46$7@~7*~xrHqJM`A1<Tk-0zKVdLK6Nu%+D92j>r-V79sfuN{t**|~!<)`!>t zWue@ZN1I9U%t630SeEW->-CSQ6(;t;EpB0AV&#haq8~RhfSnC)NuP_Ehb0z{DuE=k z9k{-MH<O(NRxi$&d7uAKB0}r6Fr2cj-)JOlC@YVlWvq#X;jE~XiUk;nd%59Cn{H6- zdg#s6KzM($;AXxJtxLsL<|ZK8fmHv}VG`w|u?Jb?Y)nnmlx3tC!8aXX_cIG}4}6N1 zw4f!hFtcNb*5|ZEiVRNDV7V|J4$oa&Ly!+@Dx%dWX#Z)CbAyN9lS7S2r{3Js+>9@# zl{BxnkXBs_k3G~aW{rGUT}@&w-c51Ay_Y`l0fOkDVolDb<{?fh0Ax*{ER<YJIW-a# z3v}JLr_xqD|MzXXcJJPaV;4Q1!T+w^I5X@byO~{^P|DzY3wxE>W!$}a*Y2(V#6~3( znV^rk?qJ`=8gVI|uzV97$7CMsGV(V65Y0ES3@W5@^DSrNeb_Vx*Cd3#qx;*&+u#|s zWeWaeV_0&W?!vaITBw8DdT>qJHVCD0Tn_1Ax*5@C^<`KPRKv+&7@;YM*(c93hqoR% zeCY6z!^T5f4!`)~;Umo9%|{N?uRTXldico0$KgZz!)ALv-xyhxf6_kW4z^!Gm#oYT zST{<I0Mks-f)0Oeog*H$15m^8A9PPAv>&b%_F)IvMBc>YDqpD@pPpLis+dp>sHP{@ zr>7LfGm0UVVtfe(&pz{NZFLtZY!C08T+5a%#rf;WVzyvXHYU?dPplMASB}d05V(58 zl_M|+#tv30rso%ibLVAAQ;vB{1B*?$OnVNtS$8DGPnE1wZ0s=}CWm$$Jh1=3p~DCE z9e9z#ewaB#4wC~6t~_=4z=6X@_PucE(BbC~9%2q}J8}@$_k2OwCA;89761DjP=iyQ zVh>A=lq@;Aq_6`Qn_k<Xd6p?@?yqP(G)Rraq8IUCN!>7vTz%DDWyN)MebqJHwPX23 ze16t=vADXsvNLaaq+x!@J)|xtAk%v)?#9&JYr%enp?cEaNK~_xRpNrO{vv5{e|2At zfuyHkQImA1v^$nZmKJ$N2YQyv9D`Hqn!SCC0#lL^xi_vL-Ws@g_mgK29Xj~J!2^e0 z`q67|zV-T#Uj{WC*|&So?q~Py-uJ@p0|%ddb`QSx{O^sYpWkup>nC0~^4#v{_v}5q z8`v-z2$xwZ=H@caEXrEPz+SMNz@Y_1vcU_1xmF`@%WK@=WjQjgJ`g+TBy!&}%!<47 zSkt-2FI$|coGNXeY?d~(x3+hd^O32kG;6e0S|KcL9V7ka;(@3vZ<pYZxW(}Ad)&Rc zoSFlSWTtSYyeYqA6lssDSE>g~CoA+Msw3zwAzcBUcd~uGGeaf*4*dDZvE+)%me#b$ z9GK;NiW<kRAY9P9pYD3;r6WIh<ISJ{?DaR_dh^X+{Nl)=BYS@xUYcES{8D$H;|ni^ zS%h|m9sbMoVwv-|DnZ4SC;pz=6!ZIM>Co9=yL5Z0X*mQ`gVi7Wv7?4gKEM%V4HMNU zm6hOBZ?oLug^fbf7@~L4)t|NdMipu_H(Q&)_IqZybz-h<ZgE*67cX@6D<_v`W+g)d z;&IVj%lra1x9?gC%M`~ai;{}@lT~x~28aBxKj+=aR!D_I*pRd&5KG3St#B9};U}~q zQciz%e1BQMMDI$!AZTE4kv}~xo|0u*AlpFKbY6SH0x)xQ_nYs$_4?1=`SRA?gtXM8 zNVm^le*UeAs=&3h@B0ISm`nR-7wvDX27J4~zkA(5QycuR<Ljk<ZHxbU9ArahRBCzT z6bL#MaSA$}88BBrf)j<Z95{KGWis5D<K_>rA6E3+aL^D+1IVU=>~$@;9lGt%fnPgB z7G}rzI@{Yjdc<V>>Zwz+2Y3->ul$Vn+-UIgqM)tY?+xy%Pu;Zp<wZ;0kCwuper9i3 z@19R-<Ji@08K)o8rcpAcQpJXJY9eH`i}$X^)L>eJGH?SY1wFiwOXrk#Ki++C=U<~- zt?m6IBBP_D;y&Jg`1$u1%>N?HeCmg8Nz1<b#ojyjgpKWM%zWmBpDfuv_D|j4b{~HF zEcwkx)aw%H!on(WK$ll2`{kNM6=IMFw=EecETb)=+}KDh@J5&zDa+=>vil=S2xF9) zMg=a2q+;-fTf%-|<9Z)$<R`lhy?@OmGBL!(-sQIY9rq8O-+%bo+Xivw&wkn+@k)#T z9+B71-QlBqThh1f{K>L4@4xg{AKUYIfa2AooE*t6l5A|6rkzCzpHq1s$OaI=veC}> z?$3N&HIx4Rh<HQ?Khf_1W)Tmax~&=85wQpHyi|m4UWGMbi-sA^$N7%ING%c>(;W!V ziROJ7@*{Yg!3d#8RA)H-D-|7hfKiM1O>ixP9SPF~9)zG_jQ(*W{ECRiI4gu%f+e1P zXA^E;vb+-$7Z%{>AD$Zc=e>ujvR->~^D*+zAJ4?RHXHEFuBfTqWfSk8{_pXUKYv@W zYW|*!(eE*gd1_)@r*>i5F{~bg{-HgxK_^tgW|<=`%>W+$O0RPEaITz+)sN#YmJM#m z(saT!mwWli1LA8O$1{ZaM0T_~)OLt0$M<ChCM-Ed=t=3I_e7Fk(BLtrX_$A%PTZbI ziWs;#)L`D1YwJ!(kwrw8U9+qAWJ|4id68q`(J7*HcDWNc?~~hU=b`Y5<2wcmJ@1UU zT6>2MSe4dYO3S#SWD$ZH;=sY(zY2Hz_NJ@1kB9Ze+n?<IQIlaP_2|ph!lXvw<vP3F z&w4aG`_br3*X!q}#96OKizQQD2cMxsozgB{#x+r?Y5AL?$E37V(T7S76dRlW%9c}v za0Ek<ftiEVD>kGwYN)!_cp`o<&Zf^+7-m0?_$htCe19@`tIjVoCgnmh0vFtJzwLiD zrn{yxwJCUDw4gC8GjznQ+QO?aROJN~UKAM5Pj5+1ue#!weS@g6r&k_O7E@anoSfGZ zRiEG%FkT*eA+fI3w=T}fp|HHIuo^NJ9macJI<)`5OE2$!+uQp1*XO;0-`;beqV3r6 z6!pi?zVq^nZy)~g%Lfm={NuyV|M1;cUU=?j@4mDbAFn=pfQk+#^D~>e9YBGbVECGB zP*j@dR{Zfrhqq}l893ScSIYS*xd2Tj5t?EQ!@Bn&eUxJ5iDk#AN(-whtM2kM3_0ms z>TTUd)K^ZW72fE##k9uUtg)JMNgT6x9mlqc@#{Xh*PYv36H09O{<c6t!p*RT$uV0O zK~aHgUy5s|)g)2gtIz6;zU-YjmLGS^rsl3guUkrAUqWA6y?t%RSXH;5!bBm5kG%BK zffo)Qd~x5id-osu`HTBrk@{`l{!5MR&V2_C>^-<2;?%+YM~)oW`@-Ra`}Q3?bZGx` z`wp`*#4b*thh2`&iY%-g-{Qng4QHF+z~@C{#2nq2EHsK8EDrJUA65YPd#L6NGS%u5 zDR0Jt1KhIU#`2hI$skjZ)di3x+)i;~ltEs8k6B(JvgNgTBax~#^WYN&jWojGk~}e& z%&W+(8oP@Lawr@1vK1|(XBHK+KB3z6MLjJd^Ku5(_7!Z%GLRQPd-mYLBZm({mOcoH z^3XwiK6iPhyHQg4`U^)6LHuTpJi!XvtR#L2Qs@zKc+;U>U>zGC7J!C>oK+-P4o_7o zlOn;2Qwjye!>5$HZp=Hh3O7AsusmYDMz|pj(~U5Uu=klwYLTo&GqO(iY;FGJSt|W+ zq0;{m<6$1opM36DSL{DMypL4{3@9?7f$N9OcB6e%@#4(uEOVo?H0B@LU)a$7U~z=? z+F@xMByFZdL$`g#^{lB2LCI7fH?lrYkEmZ%xx}>e{w8L}rky)>uI<?N^kbWNTb_J+ zZ3l0s8i!$rnb`**bC#!2ec7ZxZ76|8mT%CJWMBstOD>;L)Nl$dJ9-S<5*6-!WUW>x zRgq2kQW12jnK}4&wuq5HZmE(mts*25HWN%>x6nvzKIq*{0aLwMlSoM$TNa~DBndhk z1{|9c6B2R4OJH!&Z*8JkOa-06O{O-JVoI@wR&I3O2IHrA;n*S17ae?(v%WmUGEJ)! z|6v;Z&{)(VPbt>bN38~q3MOM_i~4IF`{qWXmZuZD32Cuh%%~@%#52RYmJ|#SBD&Wu zS{RwIPMOadnCXvOC*}4_NgX8HYoNJea%B?hqldzhvOFf!G=n7z{gd&7E4f9atlN-j zB_N$Q7qV)!Fj{b?W30BYjRXyFf<NtK&VENlTZ(#&RzD6HPJZINjA%J0z-^e%=@j>& zA=A9oFEleIBRRga*uF!NY}Fi6T^?TIn;II)kghv9X&xh_GO{T2PVyCdhNL6}I=6ZE z+{wOI+F0b!uO~IZ$+_N<nJI(S?wP4k*voM^ypC92u`Ub>o{9~rO|HHh4FA!be7{lB z?@^F^XFx|m;lxquYQ!~}rD0ZrqCG?-xo}#$5`b(vNokjzl_>K;j~Ps+BWiiMFJ)0^ zuJ$;cZODmC&nQWWXv?=7u5`NC5m8nUQR`kjnQ0)CJ{jq*!=yX1VEA6Fc`*V+76y66 zUh4HPO)jX(bs18V{*d^5FR#>uLR;5S^MF;@eS^Y^eXhqyI<J&OhE~Q_4OXOFEKbSt z946vBIVm1}6dGhE;@17pItmb#IOsQLVqgtk9HXH0XGTHVev-~a6c!^lq)jlP<dGpl zVY(vAC@8#LKJOa0%AcPbi|x!Q7|$DA>5G_|ULMENPv%TwDHe^g2W5O^K1>klHm&l6 z998x`nOH1q55rEiOlfq3IyQGcCr#=$EX3qJ8kb3g>5}%mxrrg0h?#{cWnt+;L?L3c zW=fKg{p=xHqtr!diZhi^O5@~n&ijmZ42F;sI?0@42^_20;EnW~(%ib{fmnqdX^YtR zDH?<AL?tC=-9Xc(zG!%()sV+oVGe2vjrqgPz7&ZY52cz4yEa9KGCZ7lTg-t*&^2rB z-$TziyyEkb`H3^4aaKPn8Er^^rWi!r5PBg007yrOM&@{o=6*kNW}=5JeK2{i$Q5KO zgk?moRFW;@vt$+17g6_+P1<S9PfD_BOn^zlY<6t=f#sSu^FB<R37F~_6vdqCL)X0( zN;`~Ub1KVot>u_GfoBAT?STo66+`6pniYL<t&Xf>wf|SkI;;ai__)$PZjO+mGDc-o zs*rY&$kmdol_QO@Mp$r(ZiT>aeu+$q@DknfDBLuEuGA_GYJ>w&5DkrBpht*O0y7?R zp%Fw&>cx0~M*(d8?Ny^<Nb=+{1ObCU&p;vg5fkGVzOoE=0j;80)I$)3gcxqrX%SmV zrpM&2Rndnn8?Ye{`>vH#so>_fWsWUV0TjL=fR<7mHQVvbp@%wx#2%OyIdbGY9w;8D za(>^G$Pml!qocuzEpa*BH^Pjh`&KaD-U{!(5|RIbuq800`%;s$``Gnnfm>+a_i;C- zm65(icy-&CB!v~)B=Nh$ta?3Td~PBf<V`o%BL2;>DC^9zYt7ltxy|P3brw$c)fv~v z{4AQS6N$09d9AT(ys)#XxJ_6i*e>X)SSxAnF2P3epG!QTLq$e6*m<;k9eruY(_2bp z|AZvh9~)B8ls05h-(jAbWsj{`rIu-JH{7u>wBhzeVaINHmfcZTFFJkzGVrj;kq!wu z&C+Ecmd?3V^ZWdd(t+h-<YGW{<9qxN`&5R6E#JM@SRy3qZ0Fl9-Ql-MPhD<xV{TMN z=vbalJRci@OPuG4Az;ZVecg7=rZ(sM<OE+*U5)*H#l9UmmG&J$f{=<k!GSBe)*ksq zoi6Q>mje5fNAgNniLtA?yJn%WeW7P$EIYk;`*cIzOsTT8vIFpoJV{nrQvAJ+NPhen zq}j40Ah|JO_(~8dEDjusPIGe2Z*!a^8b7^5R(B?%JZu<lxCIc}|E%eb_BIu{)RY2P z!AA*HYym1L<AggiiwGmoMQ>r3ZNX{oFC_pUYqqIZJ&KAW>u-ZIb~=P~3^quJy0W|> zVxTGLZgc;vlZP<Emv86Qo*?#>lggVD#CX-Qu*Q&Md9SxFB6PwtqVl$ZbTq~fRJmFt zWJ=QS-ij!3iD<gr)Ho8?Q<>%^tevbcPAA5}{K<x@ss6?B+PRw1w%<sLiibN0zj~6N zPnZNx^Gr*x1VNU>rpdF<$q^wE{N~+ldP7{RZk?Wtxzps*)On?oFvYe>Ey4-~UD0H1 zp4|LMWpg_JakdB00A&`GFYvB_E?hW8g*EoE2%#LBUG;cKRiSGA;~E{pO+bQDK_B0; ziqQ*J@pJG2BeeWwc%-kbkyWVa7~cfjEb)sNV^=W7$?}ZX1a=8ym1qqT?GBxiZYwh= zbgho{M1gZ`uw`WMYTb_gLew5$#1c96=-rI%))?-a)%vM+cxo>qXb>VEVah@Z3FR6? zc42p-oQ7&pBG49?<+?@*`vTT4=@vX}<zd%Ksp_FY-%`eoKaLAh2u*7=)Bt`GoYI$$ z8%`qPEJE;L-yj8{v>i^xbUP7pJen<wr!duU%x6HhVJzWHIvZLrEu|&_Zm7}c`*B3J zq5sfJv`y>`$0^H?tS~*kA>mM=jLJ0hiR@y`!!GwG-GV~J!ocx9dIN=!3a9k>kFgsS z9<p9z)8T3XOp!~?I9r@T+&Y;A@myz1XBIHm^h*)7WqbwusKKZ=_4T65i2xO|S3Af~ zZh~b6c^0J_yo<Gp>S*h@WfRW*<2xhou>cP1;KuA=1IWz7&Pn%qFUxzDFQurOvL}m% zBU|SAt+C>{$SN#|NQT6z<FkqKmXe-KEfI<2wW98_+41R_+M>z0$$^qsSxp%f!=zzR zM6)5q3Y&hKBF4s2C5e*Zd`(TcIyXsrvy14m6PK$i`5|+I^JOK*v?8~7ta9gQs?y3W z%AR4$s*GvwwL{a>0h3An(!_;c*50Wh{1qBRWit(hLgTEkkx&pDg)N{lP>iZ4*f1$H z=*rq>nDJxrE$70l7*yL7gNBDaOTkW-9a2Kg9ZFgv3*B2vUGK%kH@d8o_~O8%D<dA4 z8a%tgTy<nREIPK&?_O6%Sxt?_Kz2z>hegXZ^98aTaHlvlBPKg>f)JNVuY}sW*E1u- zd#_sb+)k;Am?!hjc@e?A&h_4nS(jWRg67~pNTR$3Y$Y{8LC<8H+oxpbr$ts3r+eS< zPO)6<r39>7=qpTPGI<%g%<UPOraw*Q&Wy~=40_OioMbSWn=&$g2hMqg7Bl!w50XJL zcWhKm%N>0nO0(TLA2ASUo;Fw&pYPF{A0tdiF0|8<bo=uoo}qVcj|Z;xorR`jYv0-2 zdbY&h`kv*j%8Ziy6J<jelhmZ(hE?@Qd04_7!0J`vm7@-E8W^~cel1y0(pPa$L>9fW z!b&vu`F<_Am+}g{1(8MQ&a3e*gGCKlyR)xmrA0(%yE&94`B^oHFO~D<{j@_#M<p_t zA;`~G#N@$=7GZg`eBKa)L&x7ti*Wi6j8!i#5D;6W$5kW?!=<gmS&t?JwNwjavqQym z3sGK!Ycs;t=_yY)1Chm-i?b(X$s(b?FCPp|BvdXnm8y#~W{L~@Bn!jo@TbYs5K(Tm zP%c@`L~cRi94VU7DsqM0g&M3GNo7mj2=II*e^o?=<Hq8r+RN2tRU;S-1NrOiIl{%M z-Rms{%8a7b>coW!MQOJnQ`WKCPqSPzU1Per^(PR|f}xSn5fdHx3Sme<qFCO?04zy~ z92INpM7>p8`EY7WXvgDlQP?z|BI+b;{K|Fs0c{$}F|LBuJ%xlpo%}Vq99~*-ge*d+ zBFNE*Qe>1LR4kWHEmR;DwL+&y+;F+9AblDZ+jTvhS^s9_J(sUQ{slSx<L;)P+|7)9 z>srOb*@N8hD(I+q)jH&JIhY;}Gx|a>YxzOd!cU{J|FT+8y<S&7{B@^x{99XFVdCsq zX{osXk4D~8u1k%T%iN3P3d2St=~K3<Dpv2W7;lL3?0e9ZHM~TRr_X+I>AMeOEw5$& zF<|&l9oorb<}R09Z0#<7WbgYkBkzef%6}Kj0wHH1*T|osaLCunA4VgE0E-b!7k`~a z6r6_Tn@~@S=TA9&@x?Xg5XaQOe++yhR0}^DnEa;fw9UOs*DVf#Q~o^soKA%&(tuDa zEM^`O%;<Bsf`GgDYkFL#xY5dw;K9ndoT2_SfkWU_kk?{BrFJGsvzC3a-T7NTp&g#O z{d6XFuFz&P|M^hPQG${TdUjpDc~vf7)yWU7qOnLbr!wkQdV|8Sz6#vPwG7GUBYDPe zVHv8|=x9~+{wkWODhFa8nYS?QGM!_{ON;>g2yV2#4Vng}M5B5ujnKc2Vn&U8Uns;W z!kVJmuR)nrNO1>ZMP#J)$GKbRC#?!nUDZ6WB*TI;3%%NG-GFIJuf*#5I(WVotLu0N zyv89GV_OmgfKBTfO&85v%yf0jluMfymlh^xd2ird#gf^rbEW^0GEy7v9*ZFW@nR8i z`{0d(g%&s`Z!wU(S;Uvz43R~@&N@SHHIj*FSQp8Y29g@g82lmd5LDTsA6cD*Otiz0 zyF{?DjWE&$1h&)|=;kB!2(BP>0ez640(*2}fh?|v*E0<a3#o_)yX58(gldK81A%_4 z9<i#ZqC|VBr=(a@usy$k{^ivTPWAJCh`A=KzrSy`f9pV=;-M~pP}C8CfIyx##dgW* z7v0?k9pe!O>U*gR<kzTM`K2={!6~yvN>Xy8y7fjlLyE`liZTKMr(G*kEaJ<&G{lf% z*>o|37)$w1p_0(_Q5Wy-&tr}+5Q$}O(uMp9dwyP!4eaq<M$&E_K4uqQd32Vj{G2A^ zetmf;EOIePPbM82tLo}2EHW#Kvm2A#R>@N4Y>uzXX!>v#S^p+8-MWJq6I_NI>jT4< zL(&p%Hd_~C7xc22=}T?a%<|y%|G0E^B6}3+yv7i)jSMaiA&cM8k1+of@CT8)5pmZ> zwTP%TGN>Ke%FhQ=zE6UHzc!g<cgAD|_Xc-VRgC*B2lPNp9rgAl#COp-cP!&h>5X6_ z_glBkZcA2^0ms|EPQ8_P;>9u2h&rbQA`X$+r^0LHfRC`SIX1GQJbEx{DvOZVQj*e@ z*==8tC~W1!?LMzE$!aJsBLT`zS*vf}ubXS5Q*Wojck*_0Lt{>$+Sc>d<;XIZSz-*f zvCkd}wMU>+62^C#b0l+iWT>?J#Jz!-sOmvSk7Pg(w%3;`P>@%21;}YvQP_jbXEa|W z_c6>zmdcT_LHga&OEK|WSTE9@p~7%qEqj8LcpWVxG;t@x;^YyU`17)B(Dlgce$kS9 zL(avK<xaj$6$qAp$w5P$ZpYQsp0nxyZj9&?Zzog>3)Dn&vFyf>^X=NKbsMLou1mdS zJ@j@?<|vGe&3A7nU2xCp&z!PubXp|+<~b!(rJ)xi(&ihZD<?tv<y|@XuHM7u^JLb` zrMmvtLv1nhAB+<cchR$|r9S0$a!EvZZO>V(ST~;$ySepRo(UzyKkKet4$*r1S9UGh zq?Mj=D-OzXZq?C!Yrx6~(N;2p3mUR>y<kKTbk(t@s{>h6dfNC*=dSLtmH~c8Pj!-@ zwSTP5qhaK*k@viFebeAbbN4`dt9j?}P{Yt@<7k49a6mt_ZIGX@yf4*LrRF#5!-!$J zux3;nXEn3TxI&1nrD_Ql;KTd%I)ijpoQU0L2oRt%XfSxS*sm{{#e(I+v~F1f%|$tm zG#5b3qR-t`>8uh#))r|zDI%W1!lhznd7aTN7GodR4n%b#qD3-C*E%IcyG5^4F9kE? zMb(T<jb{sxCqrjk5#t^0C1g=VmZwouDO-nyZpZo<)=A-OJ%c71MF^kzE|>yEjQXwQ zsP5K;mF}fs2?DwnjCEga7gt_5Uw8BP*|Q}lE?jZV`NlEr_zmAra=x>@cm8<G$bKVl zZ)E!g*PN57_NQ}CoJxrJ&M)e?XR1}m0N=pk=K(hnNF~@v3jU;B6M~!eC<ehC&2;Ms zo1icV$h*kOOB=EF*(WDsFMGRK-Z>FGP1f_rIxn}+_+<t7`p0<2#JPJ0CtN%o7?vI! z6XkO}>}<Jz9c=_je%9&Ajk^B#y^?P?-Lx7weXPSd=)Y6Ob^ke_>C{KT?ZumxFIOH2 zzn177_s1_UVllX2WGwvjjYRWH6$weviRq!iaraU##HJL-XPwKw7!!NqRQoUmx7+*V z`KV)IPIi?S&ZS12^o>60mUG9dbp)AxDeu@Y{|Kd6b`h^467?7&p__?8&1TiBSX=0t zg>)oDQXn%$C7<vRCz}vnCsmy4P-YnJB`>nPOGua+QnQ+US1oGp8H9pcBpe;@Y#ZzC z7a}v~u95M+USzNw>l^Fu7Iq_V<!(@Fi=cZ@(A7WIF+A8M9BmhjcMgvUM~0E;G5_Iy zV8}URL*ZIat0Z-Gc&VeARMm!LAmUM#uD7_#p$*$SNo7DSGV=I|N+%RWFps6U4a_Z1 z4?4^vUDjA@(?A0$24PFR7Ymj=dpkQ|@12=lXzekU&d*kgOIL{gPKi)CAugRQflBy9 zGhd$}a7tfP6)E=3C5Mm7$N0fBMY>)*Lf0~%-&+v0p4Br#en`h>Mn(UCaA2H2F*P(I z6pZ%wcg2^Ll$4g0l$M(QnbPg-8A?l-(k*4BB_&USgJqVMmEymIewN^qtF0^9R@6}V z0C-lFkljj%^KWv`3TP_4YM<!A_sJv3Xg_Y%TkqyuVqujRmz)`1Q<xEQ)idcDeACk+ z{M}mp>h0u26K&I1b3Lyq&a0Qq1-smc3+}m+58e}+9d)T8`&33!e8EM`^^VmpqyEVW zr9R$kWaW5URP?-aWO&Sl$o+8z>0X0wgQ1Q$vu@<T!V#L~9g&ofa?fvSl+CT(m)^KG z#hXOtpBd4VnD;b<3qAs2inKWN;%(E}1rHM#6u_ms)&3<~+g7)h%<~1AK}&Jfu%=tY zy3JM8<)vKCPE5_pxZ_`#;$dAka|2fS)QS+dl&gLI8q(r?rM|VoGOaSCnauj$h#E<o z&$U=3oz_leS?*z0oyo%smcU9#ms5&c?R?c(HjJ}ru6N2;{3Id1Zms*>+mrm#t`7NK zyC*8YrXVV>qKV?dyy)7{F+jqOFF`lq?F0Y_)xEVi5AA-~4z_YO7EUN_-u%pw$}D+m zZdW$UVKGY;as49xa(VJnc*0z^_tfBAS|dLK?0(3<YB4l%JxxSJv8jFH!fa(sx{;`Q z1@TiYbp<dztObXTWmGC6+eVgz(G%#A^2R%jBE{tVu$rioY8FEqx|e(Bqk8xC-f0mA zq^=AOB~BJ*AqiB6U{NrYv=CY}!isiaKxp=6G+R4^P)o&h*gRy<HB<FLjTwm32Z4=H z37V~M;7Pc;_XP)&G|bMzBd|E>M0^Cb-L6_9h-{A_ermEwIW~#)V$+?<ho)C7L1?t# z9Y#I8IduqgZ>CzGM_vOpSSJrS#GV@L-ZNWgI#@)b1&~Mjjz`TS_x#%YnoJ?n8E1%A zrX-T9LoU)OLukelQ6fqq^&gGAR;WRUez}476pbcmAQGctX-&2yHvzlBz35!_5<(Lq zMwJE=82!*2R!0#sRys8yfnbcVgNWt?(1v5-I77A}5FzF=NcNk>ql7wGu0v$r1!Ym2 z)nJ6>ZjI2)B?#d|_QEFziH#8Cv$vb5bviBMO=m)~wv#kv7zpzDb!&Q&gA4hi;B8Bz z1tEYGta*@o*;5+nYW^Y6yS{F2v~Xy>5_tE@Wvi&D?@H264iOUme$C{W*o0%JMxAd~ z#NG(hlc2N0=#ythEYY`HpSqZv`(0x8iKy6%F(1}(z@rZy>ggY>**kWGq^8>r-zk}L zNFKNnQGH72b1%xFy(ivzDDGBat{2+$ahH49<#bHXmTm)X#Zg|leJy#7vDQ7wV@VmV zDk3S%Zm5WLXwL}Bjx9Hm755CMAap;1qmobuZ}$<OzzN?o{bfzpd%CSB!WdHOo@4cs ztkzR^L_uDSUv#uKS+)A$=_~fJbvH8yt-M^zx~#osJqr3Q!%|1`<{!es?v8H;-Am%{ zUShl|Z5wUBcFGSZ#`f{~FPO9ww?Yc70)2WfT$sJ6ApTB@JEi8q9>Bt5PnWq~c1XT_ zE6TB2cHIpIL5|=z1}bHhKUjzqcx0)LM|a;#4!)V(R9RlrCX90$;<xxFEjkDBBWj)D zR`GGSYe8QILk991{fni?lB=zP+gw8AA=ceC)wdzu1UlIT`|F(omaF~(-D)hzt$h-L zttS)<pVr%bLFY5WD@(e<Z-_~ST`$m(-0P%zH8Q2G*rs&YHHqX{2}wlAIw^}L7OKeP z65r;+lIiTEDBs$exLSvhIXV!j_yTh24<jSj-FkybVsGSNT&`tP8ie)zazA6l1*iC) zfR4M@+B2^v8cF*3=(qvz4!WZC_|qLp)z&#Rmbv#vrtO?qEEGL7Te1_z%6a$lN@G}n zILW5nA$Op!p)Wkx<`x#FYXWVmQ$=Yl=Di4iG7#7>QOc0f^PaU0YR@pWXZcu0xKo?o zDbM!veHeSmj%{(biqcd~F+pllWbTv`3yyr%MN8uPf(L8dlR9m$45bv>*V*4lxrY!Y zW5o_XO=z>YGw5m8?$rqetSSqONAs4knNA5U_0c`mMYjS|Zn%{6rYp`hmk%z`F+mv; z4d(=pJ}nm0He<*m)h5EBgP+_5v^z1>^xLSGh@g0gPsMS#hdA^9tb{KSSmh-eWU0b# zXzJLaSy<J|;9Mt#+nip$h~*%Rbp#fN88=}Sl{Hdmr$z=*PPKD7Ih+UH!cU?>L{BK9 z81ec=<r=K$x+UnTxD6KnIe6QEKg=ssi^w5Hm0ihB4g6@x$~>a@8_3-1B4VTOmCunG zXpr!-scpqhNCnONmY{DG0aT8)A}$9mLcF5s7wN(QxTXwQMhtY%!2!rs@aLm7aKV76 z*4vmO$m<*09bL@E9&0|X=}M868U8WgtIXQ$#!LWte9|(yBp(~4CT}sMCxLWe-QdYi zblW6YQO`9Cc-BAGS<+VB>s~pHHy++XBJ3Pzp_qFQ<l^Dgqx7AaMD9<1oVCa_bAWGW zeY;q8)_Ez{Ns@8mG()QGNJC?TQ%L=3=e|$Fh~~St<}=xj?gldAc>QLE_f;$Ul6~Y_ zbC7kN-H>Bf%JS{>y#ACMy~RVhQ@4s~cx(E$2aF6+z<PW$Rm5xv{AUxB)C<|O$bf}n zLou+nI)Lmk-J{r}Xg08dDW_{3M*Ky@rQHfEecSW|gxAJwuylE1DHcr4)coa#_^u}Q zLcE`Q{4v`w+m7=_QtL*tVy&Al6+8K5d-M|JF@y4qW#p+Tf;1xEI2Ze3p^SHUKe3t{ z`Rs&6oO`QFLNE#Qz0qyyRA<xsWiq;mw*ArGv7E3GOe|+jO=k^Oct*!4QhNpU{7Nku z{^xj6rE+?9wkKn0G09GzHZzkuUb;XGH#3(9@{QeYxzG?p7vco4mS(i%Ec6v=J2RzI zvg!E@X<>ug)Y>q7Vj2hYG#yck!jk!fK4X?6e@eVOk|HmL&wQQhuX4Sr5hrMNl%LO# z*l(CWH1L<=C+pfqV&sByV|Tjj+ZZQ4>2>kDm%Wfxz1||vk}W3oIE-S~1t%1sYey13 z@y`#<x^cVe=C!j7Y5MeDU`B}Lw-r(F)`%xeh_ge2Z}(X=(LUmKa7nHO@bmh9a@FBR zg{xJSQ;SpM<*K0c8xC>7r_M;+KgBj$;0I#V2KBOhsX7<o$nT~HMf+BTC6y$U_y~z> zsDVseEs6<^%cw569hH>w|IzgwaE)D8-Y_$c<C5atP1|IX*vW1ZC$YE0PU1~AePe%d zx*a<ncTY7_7#Mo*z4zV`h$f*5>J@|<2=xj`G)WXugbLFA&ZEtY{e8a~21ZElz5Cw1 z=brOF|MNeL%JSIiu@Q2z3x!iUdlZ?>(s42nAO~w`=?AE{F208@y`{@&>Fic^uM`p4 z;<5%Bcz!9Yn~CK1k=_bQFQv3{xP7dV&{nM>U9a3nqRQu)H6{4y^f^w;WEk<|NpErK zMdO<ZqHJ1US)Hwl)|kqvTt(`eO<lD^UCqqSmYYot!lhE@(fv8L)z5AS9Q&RP-`2Ei zRSLZG1C4xnf9hJQcXNB!1$QMpqd*(p6^NESdt3WE9szcLzKB+&X5^JDxWOgT>D_^q z>Cmoxd1nUnG+}Yy2VG%{J3*JFj&8_osb6lAcTm_Z>;eOlTr(hN9=Ef;r#@@A)7;&_ zDK5y7lGfMa0WqksRuvTXl#ByBLmevPBzaN4G+o!96UXT^^t4vjwPbcu`R$W`4Z_Cd zz6_f@x2Mt5%P-FxucIVnc9iLd?y$m0U;F&z>|j?kWsX7sM~OXpyN*iEWiJnJWs2IA z(S&+tZK0*hg%n94nVN*}n(U~_mKIA^JE588i3taao?E!Pjv`dpsL#C1Gyf!n{x;n} z*Y;2q9`)9ciR^3uzn?z>B6E_%{?QPzc|p5jQ`ZYO@yf*mW49gDAGWl#{yA<V+*vze zu~rGTdsXVT5C_Bt_kyBkPSG=ISv9e1p_{BSJU47DX<XO&T}={C`-rEjZEL#0LE?e9 z$k6jDm)1j}xR)&804}a>Yi&y_&2lS}H>}PK`FQmkQZIKNIp@&Y+F|ebY}sb-ysgr} z*TT?_<9o0p%j_U}Obu+*!+~liT!;X6E3*g`4E-#q5QPyx8DTx~zR#w+X=MOK8bCQa z(r<AhHHz$?2V-=+3xv=!4L@FAX0wnu>K4Q-X=Bmt*^>#BgL#@)Ite~#=8OAV-FoA& z-n=}&I<`gVg>!uGktJjIri~#!pv-Mzljngw{{$gFnX0?-mqwcJd_asZj6>+E30+Um zoVgL-^8UrKO8~a5#k|AJZ-b~Su4SS?l*jmUI~@M0M@C}W3$hb0Q~xYDKKwl&-?RdS z@W3*S3~#_Daj*$FQZMYOk%yoa4hoX6Wd)!R9{V>4zlWyMP^S!%9S{gW5<Kz%FzR!_ zVF$U!FtjT;2i&e>Sog>U`sazH{u{ZIH|tUhK18Uro*O+_z-b!D{!2A47QoDbthVU5 zaoerFn4aS6Q}K?3x8Pd8{%F^2N>&d4ZAtE*pmop59&+XsU@p5CZFvg;3g1B?J3z7_ zWhc;<p?VN~64(+TI_zVLKo@VzKJ0-uLBP&YYy%|}Ikb>zK^I8rbsl)zXR$#HWHlUY z!rX&MVir8dF9Eq=F9h71y&$xk09L{L8Yl+HAv5gxTmb6;0>X)qF9!3;IzZ5I+Xq~M zheNw+8qkNpoA`V{32o=lKAbBgwwFPJvc0e}fHh}6nQdT)r?wD_xxlrLRR|&CZmV3{ z9+*?9jlxz9AAAP>0h&}-DtQT4?JfOIp|znNZpgEbI=Q8G*%DjR$ONLngEs^-ykB(P zQgGwdiK#4ZjBq@yr^C`R*WHyUNrPSgVtc7Rx@@8R4j1?=ak8Qtn#p)~*5DOt#v~*a z8QoFvdS6RoOAcX_R?X>+7vkz_x>5*9{R%^F1}_%;eR_PYEJcvfEzDdQiPbg43NyQ> z?+UJRCS^JQ-KNS)SI0w#f<9%nuJ(GPHM2~U84t}o^G40_@wV#B0aiJKC=te&*@_G2 zkmq$uY7&nSs}d{Yq46q~y?|+gm4DE|O(erufA>-Aa<sARmlKlQsLWWGTryhWBj)O| zRi#(D6m6i3w~oIhqlp^^ja(GW@C1hBG{$vJIU?<~wFb~s3u%@DJn~FcA<C;siLQw$ z;n#1s=bLMSnPZab`5pm)Ndwl#4h`)lQCrN4s+`5?36pE&EIP~ERN#7{yKHi7x@zDM zv14*e*g{_YZ5)?NH=^)B{S2GmM$x6@#wU(53B18dhKz$y&1T(v!|f_1naMu_{V@j^ z$|e04)gIKyuPtoBy4qJR-8a^wg??g5kH)%FS<gu2;}%9)*^1Wq;nC<+^H@iNtux(^ zv`Mk_IoVVps1qRSU53cOD7r=MN3E3pbRSX;i;aL_jZUHd_#s0%ZDcBY4!?_6AbMK& z)a;;XVjM8Ff#?RYX*r#uOD2vK7`Y2vW_w=ZPzQThocuzic$%$ftOz1=HnG9163g<3 zlqvzV1s_fk%}Hjf)3r5{oOKRMNmjNbz#}giBbw;=0uxURG*6h|$JXhyv+s16O<t9( zK<c$4@7P~JO8+BI_GBqzqkSl}34ti^X+G`t9sLM<8IWbRAeeo47m7up3kj^N&p=5K z{N(ikBW4dkOOR?t@IKJS1~?3&{_k%=a1P&*`}iBIW}w+)>vZ1(sk5*P4ipaU`#k|n z5O?zv03?JDq5lwk7|UI4W7^i}5f7XsjJ!ba!xX|l8|*3sKOnFV|2sYa_CSv!8cb>N zBG($9%cNC{i{7K=N4*PAlnAr;4=1ztKITUk*7R@<>A*5BLL;fO;PA83cQoYdS9=Gl z$Zr(4$4$M8-KRb{#v9l%uvu{mew;Yzr|8XR=9{7WN6G+aK--%pslA*D=f3y32aqkm zZbEYqc7@R5#y)yPwx)EOqye;Gf`s2<O%?Q6$0Cx*-EJUavN36lbK!kM2*Z+&PX=Ac zg4X+v{!#qt`QUi(CZB0&aM@dAOGEZ?)%x(}904@jg-hKNU<9cnlXTzE{C>Zw9A`2! zaR>aaCEXxA#-Eb-?{o}K^OO0d{ZQ?cKDWF_<+;ab=G!Alo8&PlwjGA8SVY(-wQtSW zYDa|X?M9u5YKxMoH|yuNBL_kJ_dD`E$6UQ}aYY3tzK?D0_ox~TFb8_byQ3=M#6HR3 z?sMszb%Rwv<;3PEfb2>X(GB<bt<&dp>b_$B+4Jr!LQ|b0hnrh1!gutKU27uW-L5Eu zAhBkwu?D(7r8SogH{EKli^0`Or^bt$+nYGl%5vBgf4Y@kn%KwY)X&#dEr9ePT6Yqv z#u^G0InyoNzCi+_0l@_cuSyDt)q@kwIN@XoahG>_HcO4eaSKT28md5~<~!u}@+4tX zIXBONh&Ai#tf|%(u)d=D7F@mLYAH8XQ+8{(zjcs63BhnqXCh=UfRJ+tUl@f4`x*Nl zfbS8NFwo1VzYib1=dnHLG7dz#k0cd;xKTV-PxGf!a_eaw-6nPvYdM}EyQW9MVu}fr zW40RT-NL$fK}(vlT`U|TPq(!U5$7(=>B8tIZ_sZ^NHcXa@<|gq$P%R1q?NZTdkopi zCU$!p5iQ3Lq0Qp=$z7ujqmv!oTxuC{w)kyHo~#Sc%qKppp_pv24Zc2F#%!+3zv@KP z3QJ1%5Y-GY_H<io&$RvWsH?81GEX&OAu>ouBR@e`RzaD2!y8eBjdBxyKJ-2ckR*D* zbHX0$4>xa*ZZ0BStJ9oOZ`}->lR)j0~Wk-m$d+AfaK!y1GrB*(GQf*v=*BZ%2=1 zDTtd8TmQtcF}Jt4H=%bspgeD-cVwAJncc8>>6VF262P^Vp*0j@k_5%0dku{?C~@7! zO|wY`&YWYjQ{#Tt?SQ3<4olWn+szwoH0WxJXYog*b|Ai>=~(X83YwZ&88K`@1Gw!a z*9108kHa;XrP#iI{r@#fBfZcn<D9<J0ZA*ys80<kd@#}0Eii}=VRmnSegkrF7Hq;} zn-35O0QEqJW^^<kZeZP6!PWDDReK1GEWj?lk2w^_-sXv^`?Rq%JT?{6uTQKlS!rMI zhxnUK+p7b}SeXehYD58CXyUm*0(gv%Z>8LZ85>LjbY%gOuMavZm`?7wo%KENuALCR zp9?5~N*1x?LFd*yAleie@JNqQ>=Q3n_092ytPi&s*L6i5KPNZ$?;(5={e~@nc*rz~ zwFhbV#jGlBo}ILy&JYO;N`R3b@!y}56GSO$NV(>C*9n<(iMHCh`FGOUK$paV)w4on z3{L*?4hd&D1SIJYIX%-WI5$>=$x3i;1tGx+GQZ&HP1(w!|04iM|GWu)q!Ze11^Pr< zw6?#w>z!Pghd%6R+cS53(Z?J8v(lJ1-`%NACA}$}{6oUa(uE)*zFQJoex<NGx&%D` z&C9ooIj;-*-kBFgm$oz~y#g2ggU@v#?t5$qaVg06#@+g&k-sO5CJW+@F8TrVB#d6% zC`lSoiqnXx?b0-H42j-kY1>1MNra-|f^Kux-J&uSitQ{<?B(8~fxCCtn3%#HygNh` ziy846YNGUY9$%EwDoe;XP(5(j;s)WXqUOu}Wyt>5nU@`7UNq3=Nf^7*w(&BbJ%vWw zbRV*#QWO`fv);R1DbBihbgzX-_ZB27#aEh0=_#B{@duTHx3i#c$H`+qiw?u+B@R{D z$|FfS62=Nv5n+$SkHLizgMv4f_{vA7D#i6!1!RM@A*qmu_DNAff+dT-4-|2F;%bO+ zRp0DrYw_jb<%G4+{L$`oGB=;~ZlH}t!P)`zF>?l;A>iDDXAhycYB>`Tr;rnB=B)Bv zhw{LsHaWe{IJoYp3(LqU1;71MHokp-dc}>Fr5>vsc)1S-U6|>3X+1t;az>!C<&Y$| znFKQD;B`INaVBd;5ZA6(52^>j-)bFOCJ3{p(N5vrq0C%)eZmAwF5;z+6vy!LC)m=I zZmE&4Vjf-hF)+N0&I7{-Oj!hmpB0=e^7}$d@DY6glLAo)iUlA$vEKu#8G8_<L1yDI z2)Ce0czwc;XdtTih&K?xdWu6b9X=Hf9^al53wdt8qaQoEct_$D1G_W=OEz4C&vUR4 z@MtqXi>hGBLYuqu7;MS9e`@^8$Yt$<Mdy?g4Xcwh#2@yl=ylOfverGJkdK4g_313~ zpQS}HLps-hVKi<RIM)&HKkl4l@~1;IB?&)00l4pjGvX9<JaHKRW$9+iAikb=t0ks6 zHzg&tqUB0YXA16vTkY>E-z)%6@6%&fU%kzZ%Su^{iR+K`UxzdN{&D7wn4-jvzg=3{ zx>yf{F?e>E=W{ma9t@b>l3y3)U7Jdx$F#H;-^}VPPw+`IdoK6ZccYP4=m0)wU!Xp3 zNSTeTdgans+R+(ae4NzZFqK{XYL^EMyfA+@hO--XbcSOa3sIf1n!MK3y>hi;ejsY- zV4!tV;M;0<;K$~5Xnc@U3$Qn9bJ8bV70h<xErV`s40j*5X_a=-Hg0JDu)iO8dLMlx z_npB9jxtz?*+r-W^lo`j#Jg~S4(!=t!#;Il&Tj0nF**;8ydb%MZbb*hDv_2Mm;i6U z$0{PAA?V4uK61ZKp2)N8TwzVnbm;ea1G|pHP(ntbcg44~wbi^0F8$7e3pAh+{c1+} zu5Wj{b$REHaMWL(o7e~H$VbNj;r7lPG6d()Ih~CQzNQJTC4vb*Sb^mpx#|KXP@rT3 zOFnX4>O<#T{eU_>CSOL1EgS@H_I@?I)oF*m5yzYmxYdWZ|Grq4(2659Ox-H+hT^N^ z3liJn5=k#ga^DljRO^2!MJP&!E)}q=x&LS4+JC~u{pdU~=b~Wk`0DPPC1Lc<#g~>E zopj6k=BnF^RyP;7CRaBm{A!7r4NE~saMPDO6CeunN4^{}q}>Gj&hj>Gc~YFc7&HNw zWsN5m8uqBuh%Q1RVZI6Za``!w?KOs1xxoU*Mn>8;@!a?|t3%I5QU<PlgATj1owj57 z$=Le-a1m??(u(1E!9u~RSPnMuwuR#uw}ym#@hr51$lm$i=CY+Qu<+9OtS!8CS?^#X zBSlmJ)c_|BAYe_Cafg>2am7tB%nu=h`yqZK##+WJZOAnIxspHjrZ^ThvRKy6wSwW) z`B+!WH{f=>alY;k1>BR{abKzzAWC~#W@p2lyz0_B4Ib3Wtm=-kmR_IA7L^u5L%XDD zcXcnLxEQ<)!fj%mxs}>F+wQFB=SeH8`JD*0Q!Any8bxI_RW0>`_}Lsg3dGB@YCFoW zPqGAg&~-Aguc47yK2kJ2aW|<iYqq0*BnIMdOYC^VPpXJ@!&P2nsp%XQX9!BRNLThz ze^p;c{dlFIJhl$x0)~^Rf167IzkevDwG>}7SU)*ja$}@YCa!?|?#c9k+cDpTdZS6w z%Xc&l;EL29qUKe@-SpKwaa*>e=c>9G;0{y5U54sT+*;Kr?n!Lwo|m>}D^6#}X|m!d z7B{g7uUDo|_oZaR4%J?L+nnE(R&J|2l-<;$#mu$AoEDmKY!g{Zqbl)kva-3eY%r&d zCaM$t9v*Y;$b9i^mx$DxLKzruLLhsNO0_N4mgHK?IAa>Dc&VglJe(oR5R<NrOcuDv zW2><Ybl7*RiT=|CQuZ`J+ww+Ab#XD9pe=uI4bh1sOEt5_q}eK29c=Dh@x^ndOPi>> z36VF8<W1wa<W_#svUb$73K^5*01lS?p&Olpd4Z*=kGYrU!iT?uQIjDZ6~q?oM`7w8 zZ<^7>dY@=jtk!~KS%5ROXe_lhSwIM;5Yg)St-~6p7CH&`bk8-78fo$(&TR9D&Y_%3 z52F{9hL!2%IbPKG9tgkAps_iK#2Ir=oxaIzu`Ylkdb8fDN17rTT`KC|B=ybX=bEgL z<7g%6e(E;r%OSrLY;M)yI#e_TuEU5-TJ82y5pTmTb<BVojKd|JE+>bfCloU5*((Ip zQEk&IqjHJJX~PD6<QG7K5&HN=h5>eq48z<we*n_L;He&s`r|IO7;K{f&`aww6u%tG zAP9Ce?s^c^D0&(I?~gnH00N8JA$kOB=C8V0>x0VcfNlj6agWZ%lm?J9`PL+N5YF&3 zxUa0!Gn{TlXIA;xul*)1$`e~lnBhngB($t5!Oy9~%Slv0G|p>|+D8TToA1|Oy$foZ z5kN<dfNHEGi+YwqGq2boPX@(9k$$Y-&&Cq4gncl^3!5A6EhuV?^!oOZ6`kJ$p=dzV zAkT?~6aZ?0yj4#zYDlW4cZ#m&7qnjDC#v%+hS9r*8(Vd7XXE)OHWws(0mpsd%=eiG zpa27>0wYyCegMP>=(Oq!dvuUhMUO2n;^09CpjHz5HP-bN%ke%IO5p>N0-u2lF7z&e zzynwlLH}VGC};<oNgxA%j#XGiV1WAqZwk-t!N5>JEQieL!=MKNIb4K(05A@uEx`4G zcY#Rs(OZG02&L3OBnIyY&d4PhLP2nZ(Cn5BV}gVs5IPB^VBCw*HGk#axrEPrFQr5r zHS;09eDd~GVRGhfGa$(P=(4;KLUmK${p0@VlKAUxMY^f32c~lTTq&_9du61Y^Nu8= zIe?my24ZV1>4OG!Q#-iA30)*so46yR3VLAvo>xF<%C`~YDpPD|Elwqf)8$PvQ>We) zl{C!1U$PfMU*j4!lkPbB(-+XrYZH@s%h_U8KLozp83iTnYq>n$b7{5PSp;Qzhb6l~ zpP5nIFN>e1+@iFk_>nYOUmeTf-E9@nrRq4=bei%anPW?>v*yRU_wSj*FKviR1{Mwb zPJ?6Pz#X(ZwvpEEmwBL(G2CP8Ou)CZy$wA$BmNy`oAPw(-g79z=&yW=qGa?C`O|!R z{qDCqrK9=ENql@q5b;Ihiq@ip{u$PQ4+SfI1x4vM8fs^;J|$V!R?&#Dgu<yDmmp96 zM8Xcr_l~CuxcnNVA~Ccuc8=ab<gzZcLxK|uC^PJ}MA^?^OSLx+4Npv!k$Rs~)K0gQ zRIHKfVtQDDTybl1E|aJvF!ktA97h>&CzITL9Sn9ZAMtO`v}`o=F1K_sX&M;&u@!(A z`ui{@)#(blw;aRh6<29CmkD!iFqO^rmo&(tQkcc8OfZS^!ciMelt!KtPQv7(WjD!- z$403OoiL`th2f37G%;5;z?emzvRXp6xMwRdmR!%uYEsS2a2R3qHG$C~lB(-!05~k} zi%Dd+6li*z_R$KSLKoHDtQmN20pFOE$*9biXAq^Drujj7hE!mk6xRj(l{Y%7atOnz zZG0x5pFURlA)#y>ugWbGD+Q*rLBTTv%}kKcguk$+f@cz%n3QJtFak<BBA}q{5MGDH zaU`|*D6CHaMecJGvFP_aFdHD={pTf+kMKJJZr8!);Rb-IA%J21Xx#-Y27s-@OMZA4 z5FTJre;xb9CU7p`$gqeZ^|cIKiS0G7$Ghu*>w!ve^tE6J_!Qxw9oFFf_LggB1(q#< zyJ2V^dkB7)@3~OmaMfeW?+9-@gFreCBD)7Z5^{ymuG=-dfT#*@7)IvW*m3Xe13tL| znifHT8Sdd-A5-7NlsBPZdpqK37`zy|0Uzmh9xHP`x`|nX2U!-Fq{q2kwcm|x49K^D zSqjWF!-T=S0V_6Pj&9e9b9@HBp1cVt*b$3IZ+d`80h^5t<k2ICB`y?6g~FmpHI`2E zLBcO`Kn0)&loq0MQpGB8FdX0tXcW-TEOLDbb}K5l=Z8x0@lPS%3#$S&13?|upZ2^& zHVp;q=L{uOxNd6)6tPE~T>=K=ola~lV7+!oQ_M2e6Nm=Rv*QmMf%Jf^$2aM>O|J1( zmU@=}j{6!eeT`_P8UkYzP|Y>EZ12~G#xj5nH&<V8p}Kl39y}9RQGXV%F1SQPKF#n{ z>ioiT$C`6^#xuG)LR@TZGX*qY-NRhirqyoAIAu)zT`e;B(Kd;P$c&{}2OoBnAYIRs z955Jc`O3Ve*X{02_7PScV~YfM*q@Y69tej0=Bf@D^(kHI+1Y0_C0i8Ls>x`&#!yi; z!zO&cfc2(O>ocSEi`3Ww`NS?7Nc%vsV0NoWw#QE&1Qy9Yco*<@RP0ooyrYJPoKcJq zOC9yigM>0wDWh!Sb{6~UG77cOODT<OHO>9QX&cCy-!xK*Z^zfKAXg=+sduuPoKLST zlOkI*iO|Q+ZXd}|EApl&ZIqJHs=D?3HqOvg(|9EdXi<-Cy(bx=h{iK?Q<tURZN`CJ zoXV?hYV91$<XtOrBWEJ@MmneFZgaH)*IYGOO)KfR**w-c6bsnICk0oeS#9(}8f-rI z;v40kuVyyAcB>E9#E#;<-7}w*J~mcEet#;en}qmx&_wLpT|P8?F~7I7mi<Bc>O*iB zfYbWXNDzGa*_>;9t}uFJtZf2$Go{xj$afmYnAN>;46gVl)s@;09w;xLvdFt#-$cyY zL}PbzSY}!|sd5E53Mb1b!D4O(k5W5@+<A(M6eiW!m0`0~h=$rEIb`d2Pkbq*Pl%fm zyu57z|8gLmCE(+8mUwTB|H$$e$WI9v^x}bmiBj%|6fhNSs;ks#MY*DFs+nbAX0mhZ z(xy4qwHW$p0Bu!#K%(o1bJ=b8PX<9%<4cXN;Re&Ms!}=8;oA4Fw+<Cf-Pp-~;{YvO zok?$s2b<iJ9bKGunZtg0^5L`FfF;h)mM+`|7j9&Bg*AGB9|V_07@{(DJ);Jav0-A_ zhQ_Ij-4;-#tl=+hTe`-Kbx}J=(@W8BSyo%|;988e&RY*1)w7CpfYZEFzTTEqo68|- zUma1d8f(o<8`jxgy4K{d(xv&R81l||(JI-x&F<GbSU++Cga`aovlEX$95GMQAgerw z=yb>GER^YL7o98fjSNrU)XI*b(@_C@X3~IY(dC$_frd|KYvN1GvM_VIkLYOa+~zPu zhswVGDT~yNH#YSFzff5=7UY73Gu4ya-K{H>ZZ|N`k7omLm+pf*=h1m*_jDLa8<t&* z=)BE}fR7uwsnP+zDzt%}4ucFJUBudTpV6crjOEYFAoflrP=zCaqjnNKoWTeXtnY34 z(8D`e&v7><`VnbeGeF8S00uDZgoxko23Ok+2`KQ;L)(gbBaPUC{NK@6_~bkGf9z*C z)fRf-H;-<>v-wyS<Km7KD|rIv6BF*3oC&Qgmf18j5dQ*GL>xYV&n(|E16kSc3wfcG zWeeHCEyl9?fdgpt3FU8)x8D!0>cO)%FY4T&$N?`yg*oySU~L1yEB&V}=x<@GgB}D& z`hTG`Iw*gHL04H07JVP$3<!-)!(bJBez*+mT|hVlEdG>*1x-I9B0{U7N3cElqgj{) z`QKSF>4wUjJ+zrOI`V$KN?mK9z28Mt@zC5WlEU0I#QU2xr)=pauP&}UYYXH6<Dgr6 ze2$`!)S9Ku6wD_Og*SQ$(Uz>?vTEUMZGpBXiPZ*?YbYwSgE~Kf4oWH{$#v@Xp?IMn z6;u{Hf2KF4sXM+JL%$6Itjt79UXpGg5#nZBe15?YFS%QNQ=C!Zvtm0Fw)@S3TYviC zAA}FX=%%Z~NTk)>X!IambpdCka$u%LNoo(5W-g%3jtRyX87<WI&$bWacgF@tdpX^i zS}2n;4#~?X8*lY$+lLC$##z%8j!My3I%@~(Y|L$$@1qq!bNJe|oW}HJq|ZYomSKEl zUa+}a0x?;hxXN5Q^i|z>>n`#!Zt?(*&GtfxnsT6pLyh-jQpAKi-3M^-kSl`-2vQDv zB0bE*6=;`pZb=FmkaHnR2tuhnFklzF+hLa)1XZB3GP+>0nl13+QNaw%aac>IE-|*t zChR9qNH~(R2B6Kx<`6O)<cdD6s8T+Z0=%&#eomSLEwz|a^7OoIK3z!ePD!4E%EN_g zMSMY^s=?k|B*|bX^qjfIs#KtU(ZwYxQzI4<0|>{5soB%Rad4D^QbtylW~e`v#Wc=> z?I~X_P8JKkw!j5xqW!{Ky#kY<C7}%vDmq@mBPP}B=Iogy{gmzAdU|H<z1&u`w1?cQ z$ZOy4!iRxKiG-IkOLl$x`-6wBt@RFJ)-J|k5p<2P#;~C;JOPVkB<ki+(mF&~0fye| z^m}2E-#=3^@9_)!J^&NEkQoVWd;PHbLy$rDAJ8Bl_`?3-4yLUGJY6q@Yw$Y!v=4&y zAo2x_8g%Fi!23b;4i2yr-1G*)0o~h#@Gu1O3g`mV7mz?B=5qlM1n@#49x6=3rg>P< z$hUz)Ujtz~SdRO97}fs};BWXXgoy~`U%`Rg4*2dL|6m5#@90!XYN9Ydy<lLh_Z=J{ zVO(^jaH3vP16^T8UmUBf6E!R&$?vjJDUAQo4<exG?NiOT&<9aC^1DDzj7|eo@Wc+D z8M##maDkp10t7I^zltDRe(J$IGnNo2y{*cQ9-v3Z3zGVJujD{JEQ#WeE*;1brVYJa zCQO<yQoP(6M&h@k>;V5qe)?(zz!{G>_U$LKv+gDj7PF(FQtQ~Rp87PW2*L@h|IB`I zOqw`4Zy_&1Tl@D!CXbp7L8CS4$`y7@w7$_^P-0CR?DJm)v_&?~D=CJveBn|A3C==b zdYhHq!ldCoSp(<~ee}T|1I|ZV0iY&eE+J^Y5JtpAU=c<JAzDA@9Mggt4dzoLO&2(# zz%q{fDprGk2J)Y>^-oJqP7oQOe`8R}9@LNo!RtQ<AON_xM<0i{KEm%hxtNcAJUoYC z7v}@zH>$v;9%aM2cRHrDHeh8(7C_O>xxET()jkOm;Jne(2brLgQJp=mqfwov%b%IJ zyt9GJo~~$GFR!(gWih)v;KWt+BVmHP=zXf_Vl_caSjza{AyS4FZC?eJXXMx8KBXVe zoqwr!XuULTsX3wls4(Hac<S`=oS^5=^b{eKFgpJCwDP|ujASxW@?!@<5R`~$Z`Tsr z1}4j7DZJczTyE9dcZZSZ77z?0pKyLU&~=fYsZQ&uCBp3a5ZG!bv+gY40CsBMgasK+ zkS~#JLR$%+ZuMXdL342wA%<r$4-aWuf-O2QXz<SrEUQQpRN0*0q);G_^spQ1;B)}D z9`RU?!Kh~zu2&OtEc&-<nHL+_*E9NMFT<wQc&Y#LD{0KQMqX7{;RlJd+b{Q~Cd<*@ z8!>RLpDX>e^xZeQ(r}r=gxJCSxht>(J~)vu8R%EZe+;j49f((BLd$yxu1V{`h7&eN zm0*Ljv&l9?cp#H2jUL`syJ6vg1;4Qgk*RN3zp}EmX`I(KIOQ^s&=$CM#AaUiwiH6s zscjKdPkdqCh#0n9@|K^!zfEqk?%9o1o7}J&vi0Yrn&3}mV$2(YEt{Rb$X}%pU0ld) zEmM3OEGy(sYALk}B!jber!{iDn|o+!-?67u)z4RR_Gi2j<q^_{IXKXP-YqnMo3Wq> zE~?~7njjSx?Uy_%^|F4+r(ZwVv~2@nP^0thNx()e_Q0KaX8P0H3%Zr{1vj$IA=kkg z2-Q63mSda8ox_R*eotvRy|s1$iTZoe+UoiT+oq5%LFCAs9Lj~NS$lkbNxLJRJeD$3 ze+zcw*_$Ix-QyfVJ+Ci$e6C2ElA4bre%RMjnm^jYiGf^rGdZVV5AD1o9w=YTt!f^) z-qP3CUolstZY+o%jvItqLx`IFpSW6naVuaPqutpHHC?>}D`_ogr>eDOFt-5+jj8P1 zTx#sy1JqtYtza~)q4v>iW<NVmn^M6XoK4O(0b$_S3jj$sFwe;DT}Bbu0{O|2BY5Nw zoGm)oB<C~xOBxrNDg=E-Kz%DpXFD3p(<Mk;zTZ+bNM0BQP28SADx))Ltn+PkQk4w( zdhX;kD@K{(;+D~gbmfGBIUr`&rp<I&nxqq(*~5UTj2j5B4Ga|*@(wB-btSo?eEmQL z>8_^yW{;H>=Rx+G%Yy%5&30E$5n;(Gt2>L@S+n${qVRf+A&aswa)>M~0_j-uZGf3c zG`#LoXBcwt1(`E!;xf@V+A5`v%a6u+JO?g7zJ;XN2Zy-}w-5B^2S$6Ab~|zjM0P}H zI7N&3?EsS3^4E*V8#yITh%?)WwZrr4vmvx0RcZ{hD%^}^T-T&Tp|M&Du26xub!W_t z_iy*jnPnF3T9ZV!E?VlIs|Gk#pkAH@&B4y`<uaDoEq2t-%w#cjc@6FvMXQ<64*q3J z1Mhz<3kyTJ@b0;sk*Vq)^$@SN*N<5FIxTk2-Nva!*($Ctgy!cJo?OUuIwoWiyM0`& zTbZ9;(x?DMJ%Lt2=$j2MY*oO6+169C5?$l)X8f&b=g6Y9f3Yo1zo>RjGi<|)kW#pJ z8-S*E-)#V)!Vv!e8Xu|~g92c@MTR*pY;(kJCg8BU@t23%Nq63BORlfV6aNgjip0P3 zO5V*@T~F`GCk|JMU&m!$iiP8|U{d|^W0UIC%%1Fm|4L68xREz{DU%noGL^ZJ`Hmm; z=lL@45R2ZqIabKXx*@uYGGd3|a6l`K{N3r{?kjzP9mKT@n~ERM?8ra}L^lEe+n|F8 zuxL<x0}Pk_U0A}<mdOh(31MtbpbDelIlnIeHKfOD0fsfbjks)wu~8}B-RRM@bAWL_ zht|93qCPU*x$ZuvAiUZ!`LXLbjZv}L^H88QuN`w_&Tp=)0oW7C2WTcz3q?-Q`3If1 z9_YamMF5a~jzYIV7AFJ=FD!zPgdh_!1-&}~cQOKC7XdGxYosXvsdts+QNZ<j$iBS* zbd~_Ru%u%W;o30KtH>n}piTg;pFA6I>mRsBXYn(3ZSTt}KyagkKaoB-bR$1so81G1 zgv!_fmRwG(;+dOb7Wy*jfTL$P&~9#VWtSm?HJc`g?wOaBWiK`6%OS3~%bCdlqDJu@ zhMrTk)n84YC0g>tqRch=LQ#XgGR+1|@bO$L-c9Svv9{lxdV@mNa%3;0FSSe%ChROU zI0~7cY;AWMKeyoK2tREyj7D@_hEWw`l!g3NRdZQ01tYFPc5WpLwkgEU1W@5*R>RPS z;PL<Y^zonh@mPBAeJ&1-E89ow6}6zHVXkynD-e59QQkg5XtXnVBmAD`g(?&j-JC%y zwRjvmJ)M}6H`%_+!4FbPNAzU0Q?Z{m3Ttl+QoGQ|f>DKr*|nNt;&jGBW2K5x)=ve` z=?P-GwYz%oaua))$8T`u&D1Ghh!J;CrP-M#)G0+oSq;5fh9jA~*7AZWJBX5**)Yjr zkFk)V7%`=zw+FT5#Nnl@)npVDMk(*xz0py4d>SU-3!kA&Q40+Em9wb%@aT;nkD8Ax z*G6tbOjB%StG!#DLusYw6u6KvE{j-pc>=f16$q8Ww!%8JUvPOCt@e>fd_t;_kfCZH z7mxEelWo})(A6ktX8{FGnvg*iC~r~9>L|(YEp}uWZ%%gebMn}<DFNM!DA6R|2YcDg zTF#szmsfeSzW#-)1O0S8<qkaC^s?-tgvMSgiPGLm?ar<bp!vJqrCJ`F%txE4t#pev zfzfrnda$Rt)PVN#E)(D;oUXt5Pz2OZME?E%6;)%g%4haeF27}U_i+Ev?sbF=0Lp&B zW)Hcoes9R{2cFGDE~JE=cGy?EVc&~r!HLXUQ0U|H9UP9NLI(6e7XUI23Y%90fekC# z()kuvf|lKF3jhXC7vlB%A^Zp|E&-8l*X;ENf*YGVX5Ypq>>CHZ;3Uk|e|OIBc`VNT z;DK*t*Xe`QDdZyq!GPcA15bLx0IWsF%HG1VcR6VCVEP$g0q(6#p!P<-aXft=@Hs6| zq@o9#rLj&ybQHN07GrZBbL%jtSPW8y=WOdXKY9fCP=~7!3mAbp1ih)ikhz7`aM1T$ z=L5(COr!@r&5xMbC)cj!+*#OP4(3h}1KaCZ8711k;}kSbqNPhZsEG6cLE(}9mV<Q| z)>OeS;J|;q_|SUbMvs5XdEywJ#xYo-$vN9JM2V47sJ()wfuO*_0z7DG3+T}nyACpn zVC{@*aDOAUUh}<&{GEX;R9JB1U1BZ0PICR4to&Uj)I4=H30sMA7lkR;r*rPofZSf0 z7n2JIxBe2Y;%f9mj&N^>V-ULvY@a#}Eim^qUdr?i+ol_+n~dd=Y6)V<kU};yXU<%Z z+L2Qyg509WXg{>*=Y%yL&gvdl&W9ETHH;F%>N0h!8Y(yD7nKyG9}jV-kwl{<c~<c| zt2{f!)lG6U{5mOw+G2x`CF3owOzbM;;E)>Fe%UNSPnx}YuY>29niz%L3d^)R30sb9 z$k|UGX|x6=Hdi?N_Iu-gW-J+H73NZMD+pPW^{sV(F9lPpf3b8iEme@#`f6iKsWcI4 zFG}L*9{`Ez4wO+xUXOXmj)t3ptEYGW6uCGeG^ms1HGTE;9_D6AFR8J*v9FF-G)w(Z z9%mhHp*3efHJb5lRk^4oby8S2a;1N=JifgOg|gWtwGGyop*mnKjFHQVXc;0#d(&vL zC8MXj7(dY3zLed7BUWDHB|x}4eYISeol!q%y(8|IO+ZR5iV+Rpp6nlwgHqyRC7TQb z?@XaZZJ<EoU}+1Zw+PpCYoxyW02}xTv+oISX?&Trd#Y=I*Dj$F`90};aKGbcTpiRa z*Nx=`%DQN{mI+*&5`r!K+kb(9|NV`J>b=QP4ARL1e_$6&kd(Nylug4OOj2AYo`Xy0 zwd0tp<?qjz*_r)sNpEy*0L)Z3^LsZlW_G;uu7o_BZz==FTG8aFugUDD84&947b^w} zoH#PBZUB`jvU0R-tqWawrBi~mGQiNCXyO`ONUNS9*4>?GmQawl^(vK+^3*P}yw-5D zJDx3>9P=Yt{ta6a8A{N#*<{tEg`Al`*Sx-jEq83?!mbP|#85AQZTwi&3(y_V3i4re ziKjc***wOKTYPVashq#2v?&_!(kkL!P5-XW)6=f*Q(K*6#BJR`?iQ&o84ZnW^e(lC zOb(t4K(}dvd{fSBVhS0MhEgvqI4RX@&0TI;_)djQQEb+3NSepyNX8lq6%xCFKEjf5 zX2~$#OqM%LC`4+bjE+AA_$|XM-0PlLv1$&Hy|s_q4pG&7iONbay7Y_f^Ku|LpBOQ) zPQF8UC_bQez+YJSJ|GQ8CLTsW4jKhNK2HHKwrY*wK1vKn=*mf84IseHDgY1`p@`-& zf1Dc)rKc7*p~-mwE7ntsbFpI@BA`MxvIl>3(EIG=DI9U)i++m^Fn}nYs4dELbU=nZ znX{TQ@?H@qWtMaEB{vW*vo<d2YNRPpV|ZTlSNmN!^e_1j(KT5U9X-d_dp{xwR`~D$ zo>c&U0tOvXMUHTQXkBbmQ6Vu7pM3dxbqN8L2rtK0T%WqS4((4WQR}t#<qvS!<}!X6 z=pK>z+=oi!330u>r{}n5IS<j}K8)Icm9k_1U?2KN_dHNA{Aj~s2i^tjD)2W%y8o6v zvv|E`xHcypKh!duH=9y%okEO})YTP5v(oPTb_4oKR3ZBdTG!o+WG-45c;&Zn4Syv+ z)L8t%&6;DoiQU4JpboPi-`N3e-#EM>sicrLo06YLVj38;$wf8}F3;81K)pO|8A}xK zZ;uFy*6zEG5c<AbWC+N%e4g!Hpdo~2tw_DJWAV%FdrI(U5r~nXHMA@BusCQ}V#9E; zsLh9V-1-G4(5@fcpD>^0JM0FOxZQ>uuM&_c;!JS|l!7q@<D8;&w9`{M!_qL*chbhE ziK0BieU}01M&J=g+<>FkoUNwQ(P4-Et~03vpVKzQZj&*%y85~C!7EiWI+hsU&@d5| z&M4u`HKpPtMus$Ya$=Km{H%{-oAd78VN9%@NruVJu>qn54A01VAi0wPs5*C8x&P6! zJ#6(py#-zLKr<MyvEU&9V$ekQ5c@H>c;H<3xk0kThPBJ|ETiq<(dkZoo@ZtflgI5t zyY|jieb<(S%%vMlW89&Yb-dHTWCy9QRVYW-?sRgkioSgvRdns>S{_wDOFj^edTeFC z-9EaSk1vnYQ0*D{dr|t>4;oTw)`Z@o@{Fq`1<7e|##ZLMU(lIwqbWPFR`h0H8mYEF zqoXD(>-MY1$1ex1)^~5UrL@25IT`JJ-gZ8AyH4}l&xkS#yRH<_V#T(2Qd*%nL!Oqw z$)uDdB~t5#Q*#P#<tM#UTT3lz%NokhR^9+<&&Y1aqqhiG%j;V*lDd9#@Azkc!_o22 zP`+iAYfRfJH`F;4HFlMKdSzO+IBixr+C*B5Xc1ShrQ*2?qH<MG?~<(v{shPGvpuSX za>#j&YPNbTh+Y5vg?Xpu<H!<0OaVOF$iAaF^k4*hGRk8wEK;R_Y{LO`bcozh1F{r` z?k*uvdA{${4+87QV>mHU-(g=FpXu2(Z-zD<Xn*XzJ%cx}zO~!?VaN&<YT1$-hVrE) zw6o%00yQ^`+ZIVaoz(a3d=DN{^oG3u^`){qbJso`Prmt~Ev|y`_GHe@tkH{LyxX#W zRZS<nCcReP@q2&{{y&Grtia=5J=$4a9RyHrR){G{E`(N4gb~)365@S7Re_8wr~!7k z=Iu@wxQvkSGhnSCSHJ<CJ6yqbdF&3sIu6QT>TXsizE3VD#N8A{jogXr>0M6}-qBvE zhRUZGntvqE{Y!t$j`>FQM=$6;*ddJW+J3iNkyc1`q5Zg~2JN~{f<%XNPBdd31QcUc z43a_znibQ+`Ydutwi+}zBZ4Zz{K;L{Owb8{4_XuK?Hq1etVp$v_5_u}))Efr+{hLc zyGnUARkPq01-BJI>VX#0-kAfJ3Yiw{K!NzaemTSg=EQ2fuuO%lCfEX0M$PJ$^k75X z%~=n~w)<hbEg^4jN_?9#EYW(p0=_ewl{uG1N{z*h3q~t17Y?N);RM0_t8FtkI^Z-# zw*1wk*v_`FGNI|?BfrleC#+qgB^BUucab-~rap#~U&-%hMCa4XRJjbakv!fZtev@S zxXntr!>LT2xG_zs<Tv<HZc(EpNt6N5qNl2+s(r2~Icx3~ga~`J<bk~*NUP_>S5DyP zTDWXtTMNFfun?H5^3t}r_1qhpSWyBH;a0x?=3G}*g$J3hPNif6+Om$c@tGw(OLzHo z1C%t$P}E=+BqfRqs~1yvc~#-F95ak2s5zn-MhfoD*AtZc$VIggKdh<pHZ-EW>!uZ| zx^8};y(NZTH4_?HMV6dUJ29Exf$;8&cqMIKT;(E6y-J0GA4hd(*@P$_ggon@MCdC0 z3PAzdmCi(!xnr6Lc&|KNM`%*ivnh3rt9f<yDo`aJi!rB;f7ofQM3iKx{`r1eefDAv zpcqwpGQTCNZx<;>TLt9a<jLkB{rB@F1<F>4a%=20-DRYixaE@(;jpAAws)V5=044b zqtUF-&KoEL*;;5sg0>XFjzUMFy=mB<LK1=SeQ%+%sAz#7k{ps+&GR-}A49nr0|~Cl zb#7nj7^MQTWaC*zLwl&BeGy^~YjTHgun1P2*g{xRaF=+RIn6}UJl{Eq5F@5@w!pwF zUuK3!8okK#{W`KPlK_rFHCH`n8ExD}OH!Urg)7Ff57aYwZIzNg2++(rcd&GrUbcZv z%_G<Q!O=Vb?}01}ts4?wtDvrlCB07H|Koe3e}H=dt>(im_sl*V83=iis?(=_-wKAb zMhK`*AV$062?4eSnRbxm0=7T^GEkBGJ}7vA%=(dxPzdr!;2mQqR=|ykLSyFAe0FRI zA!zscEG8(?iZsA_xu9B0oz?+}1|+P=b%?khcJ3L$0W$PJro>zd{}<>08PBePQ2+da za|Zyj$N*3WB7;EPI&WfbfWrlu6h~klD6o;$Aj@(TY!7p1O%dP1Y_G{-`h<Z%z8?++ z;UQ0fT(!`Yr=`V<Wg~yl%EXy=Qj4X$T=y3hq**d$lZmo~CPn%jFP@fJp>lNe8e2o? z=fkfri!z4YMJX0!%?9p5{e&d1m-&8m!a`98XrE0^lmaR_m1jr3@*<5=9WNK;LR8+{ zq9?@=CW_W8MxUbIot`UDzei9EdH4cAhqwR09LQP*rZ|%3E%c^N(>93Up2HKD;YVf% zBEAA6C>?MNd;&)ryyw_r^Y=fuQh2=X;pri~kk~HDu+<fZ4#(?>_|92aLE)ms#H{V+ zmc{7Op&=frPtR72N9)_d=oh|(td0ReUF{r5N-EkBSKZgw%Bz|ioRW3wyO?ONa<mW{ zCdh6Jk-LP`&d4>O>zNYdr9`RdRO5$v()!J(I{AdzSYFEpX|SjzEu92P!~80BbvuON zin|k?Q^d9^))FRr9$b|u6iVg30vOwhN0ivl3izXh4rB0j9(y66h*W+Nh6o$e(ThkK zQap_P0{$q%@UaMZ=R>l&dkXJIz?io-m&>cq9phQ(ozn%j-j*8n&Fr>mf-wQ=|C1`a zYAeRO2igkNGz+W0Lx4}b&h3$JBG%wiNsYOKkd<vkJGos^O?OJ0t!<`MRvoh_#|9== z_Pz{xi{8f}SDUJrJ(Q`aDqKMN_$w6tAf>dzO4@sB+)S#tG*~u4Tl$;1KOJ_kEK^P{ zWnvroO0P6cnkH4h3oZdvY(MaWI3REVBNq{ndOo7X?^kVk1H)Ofpmyy!*b40L&1{$< zZ?zi)nbuH|@^DA$+qDK&F0X%o$L#g$Z5w+aLJR7vn;QX7XwC+~#ID48ptfuTwhv7^ z=Aa5Th|tcm4u0V<u0qDwzvDertnJI8+lkTY^lz?gD|YrnPwx7?D~7f8rG2!4{7MLP z+-PMER5c(CXI$P3?8$l-(S;3rz@;*(Bj!W!b*PR2CDTZTdiUss^BT2!KA?VR-gN&1 zfd#KL0)Z*Kjf2rf?(8o@TbLyzA7nEQIT36>e0eyC9ft3RoKLVh943SDPjJ)$#yJL) zdB{M_Fe8%52s07<c%H#zz-t$9An<gyn_|AwXTUX)^UXRMg+`-N;cu80rXJEFs0TCz zKS#jVC*frZO>fYH9A>1<0L4vuWQfp*4Ttb`4qgu%9@ZO-AdPuH@)EfxTS6B=lfZ<D z#%#JE%wIOR(FF^z&kSH}=$M$52&hY@gLBBPhF_b2I2-8#fyPK-a1m?RhU6TBg6iBw zdt18~s0xh+yMSqpA0(uMAdKug6Gy&pOi;PxzAHo)26EB%dPOd|x!wh$%BqlhGH7Qz zL!#YXR@xyV7aKgDb)VkgFxiB@T~T0ZE+B>7PL`%Xaw8JzT!OvjgJq8}ump+Le~^yR z$Wul@v&^q)l*=Gzp|pn3r;HlJH`*kJxh~Essrv_NIet$FprDJtyUtn<aZ0uTqB2?> z#wmj=q?_=S?oF?uaM$EE9d^96{k3g=U`f7*^>#rD7${4NF0kYp4X`{Tr`3B$gTvIH zkH12oZhPNWd$eA+;u@MtTZda(YpMnHC8jh-^c*EiU0zNtZf+jDGSJtP6+*Q9%5q-a z><xjAkzGV;zrsx!mcIwKSeaJc5t})ft699uDKZw}<6W^yupu-z_8c5U18+ooRgg7& zH&b>!7vgN+6$U-WD7&I+a98EgtDdW%(K{}|9&Aq->c}1KZY%Pj-FJmEv*~3SjkA@N zg#OW6IiQF#Slv+;M!Cwu#<bPs+Y9?x$Ez^*Oqpo8qymV*k%zm$HYwzzU|XpIHm-fB zXt=<Hd+<rP2Q!*TjXD6sKY*{0=25jqqt<A#4f<>XL(<h*ElaG^m(^P{D0Xc;i?mbi z&aD(sq+QLX=Dh5wN<%h0Y<5q^NP>lsEgS3B<1<Um!nnoCR@fSbC`mDs4WquE1X=+- z$(AsD4R91x3}!P-P6U>0@f?eFi$=RnhTcnIa$Y%gyYm{ad7vy~T=jfkFCnWK?iew? zW^#d&t!#k)Si`wYaf7IChC^0%bk@XAz#b*cGA4#m3O?49K)l}Tg7U=Y0koEL^l~Oh zlFh6(Fjq?0BfnFK<XTpXqK>yw^aC2&xl(&gnl|q!n~P6fD4hYfMWIn2MnHQDxD{Ub zI)o*F9+Xx-ni0P0s@3trwW(aSk}Rrq;O9l2>LyNl*+ycP(pje9=0IXen>(~xQMTSW z>X?_<HO3MHwaZk`24hvwzS%$OtR@jFNBHS@Rn_8TJIr97t}hfC>GY!=x_#c?Ipk{_ zo9;&;9B!?OFjU2qNNQWTh0l*U)TUy{9dN2}O6R<$0HkRAonx@J%mRxhy?9x)(gIHD z)Sx62Mng{;m6bafwW~lCe;)jq<0&Eg4YBIgXl3F>YV=G|-{{rmqBpOmw!A||-glBa zuQ5LC`-7sOkM}Y#ZIAB;%#JYJhJCmle$6A;?10H}773c6f82#FJ>=;q(3Ne?gK^Kd zwU(pvDUR+w|7y7JmG;U%zDj>za{1lyyUyOfw-%?oKt`Uow$b&vD9tNZn@eo(T!y-B zIdmC;yMJ^>Y&o9C&KAPHso~t9LVn-MJWeM(4{?v2Z<%AGJtIO~)*?f^#dC`%cFc!} z#qo|$0EGxHZmq|;I=sFkh6W>$#+x&!p@Gvw1~9HcL-@qVMu6Bf(uWKWJ!oKIp@28% z+;PINJP>Q{0;r1NVG*E99(k|=?Gu3TiJ*1DArw_dhA|O>aKL;t`4l)h2|puO%}6zx zS)E#;QK+?wIhj<ek!yAG87b6u%<7d&y;3o+)X&Y#;KwPDQatw<mFlNPP{Jo)*v}#A zLzIENGtdK@f}aSq<#uewTCv>h7CJwYTe*ihm`mH3-d2tP1Xduy`-!cUl_kr83NE#h z2$yPQV3&Hq1OW_|+4a}J)%s?^J_IfH<Becu(YBy9AzP$%4ld<WR;%6m&=U1tw-L;B z`=YE0wWqzdjSk9dW)tuV5ldb|tK}?a0~73`BO4N1jU&>WCc&Hax2?tXyJ+Pl#bC>3 z&e(LisvoR@zq)chsc$*6qKsh9&Rs6Wci%J!U*#xtDP4;N8T)AG&y>btT(*UuT$`yz zTtlOMys_2rb}rCS&{MYe3YP}j%o($)6dfxq2bN7@r!GrcTIrA|k_Dnv@}EuM=7ag0 zC60!vVa_M{Jf2V_6pI955fUTOqe9S~<Z-zi9v}AK2%4XIo<cpj?UW!D!EJw-LZxDV zDF@U~kcc3ueGe;zv2zB|SR<Twssg32be9gb;6}X_l#0Z57`wg>vE+l@UHn>g-`o^# zeuRJy)7-c++yIKsW)4;yV2Rh9r5=2LGnF!_<lczs<ubIQy8Yqm^=ce_6t?VaOQo`P zEsw;_p-mt|es+0Tbd7?->5+V+Vb(GvY9ZCnXNpp@2o2lCke<=icg+yk_yN}4qW*Zl zztWEW4GW%dps%twh954gtBb!K_rdj)=o{CsUb%HQIXgMCxv6!esR&eIB4A61ScQlD zIoMy&Ll`J^|3DMm`He-20+{+qUAV#q&Xucl!C`v}D~V+mgS*&tqy0`%i>cd|$SW7- zWt-7qp5js}HG|roJ<pC>LK`XV_`;fLQV*ZO%_(Ka56))KC^H50$&ym;EE5)Co~3iE zD2L2eH3>KfU8jAhOY1RZ=PP~R-0|D)miI-c%L?nplIF|u03#SkuVfmv8Ch!jV3wk- zOc`f$pl44oMZe}^)O$aC>y4+s@%3*%`MuA6=F6Xd_$y!k=2QRp-CzCsjn`j#3CPGG zk_0qT3{E<<!g#-m)%sza>xj^qTEWRqhhe7|c2v;%D~!Ie4u01LGCP3OZQMfUwRy<q z`seLI>(X{`KWyK#ADV&G`IzU>ws5e#<kxSkKo^1^x%7tyH#8CQA50Nfkll8;v>$Z3 z{2{|;2xD#oHFXd2fS?Dx2gRNsAnipfrr-iZSunXnwnb!H+%)cowcA^Ia9#)m59m$X zmI(vMv=P>CuX-GqVLigQ0<-T%-~9Ep>py$$>0kZmxvxI^!t>vM`sp8j`|Hm?_vYo- z{`v<vB5+*I44Pzm+pe9XGhpPOSIj(y<O?%Plk9ydo$1DOaUU#U0vmpCs7Ao=!#d7I zsyvt_!_KD*2h;^`{roqtzxutW{_Eer^3*dw`{}=a@e5!3_aFV__b)&9vseE1A|{-& zj)E4NkENQD3B;I%{n9r1u?4Dutr4@9m?jP7ScexHNu1qo%rnMJIDmFgO?CNCKYabg z?>+sk@BYJ6pZns!eBp^N{p0h$_}TAX|Jx6Kb>-6A;P1l;&<co12$>2Ye-=*gq@VDZ za@@o<j1z<GHP`sZg??4&yk&O94=hF#3@QYIPUro4Q*aqO@9_jeA=Ue@UC;W{pML-R z=Rg1CBVYUHC!YF;&;IzgzkT_SfBVfdFaF|3VD8~YqGdMXy38^Wn+)gu);{Ag#5Zs? zYK4N$WEekwUg%*Tk_zR@UFM31H-A7~#=y&IO+Y*?F+dBcb;<&(-H#TSUISrsgEA`_ z()(F+R_<2elsr742+Jpe3h;Th`7X!yx@Xi;HwuZ21=fLD25I~WlF8u+ITykki)hol zv)~LYFRm>IR%}2wx_3K~KmPs7#FsAp>C6B2ozH&p%a1+r?SJ~mZ~XATpa0Dt|NXmv z{@ZVk=Lb53vW7z-3~Y#DSl<gDJPI=tw8}%f2OB#d$J)avYBQm%u+?7FKU$vYE-M`A z>!RFF<(1y4t?s(sJCxry3J!_x)?`V0*?4m`nZ_T?H>z&%QpA0nwh~5h-t-3|gvM_z zmq?nbaU0o{Byf{%k&*xzbdn|<^CL@ynQh9bl4aPKB3j476Xz`yo)8<=)5jnZh!iwt zB)<LK&wumPzrOUsH$MIOfBM1~p8VE-{OcF~^7E(POiH>55LS2{?3xNj^L+>>u?hYF zY6Fn&dJ7rP>qzXunY&twvKmCa{kP~MWtp<AFjvMflUVF<pyy`qh$@?^=<X%4Yx_4k zu20k%>IuTe9*JmnG$nvm()&t#i_5gTBer1_=#IkE<2TSMgU6$fn)L+Zs8l_<t0xYt z<QkJ$BQ#9fARmc6nIm8ek>AcvkN)tbAN}g>ci(;EH@|rCH$VUJD?k0t=RWlxUwiIP zzqxn~U|*Q%e#LCqB-A@*%pw@e)2o(q-VN7@48~dfhdBaw_oRB2jaNT7?Nmsbdktmj zt}&9$E_TQqjS}0s*52<8Pc%`=ON^swlPemdyNy6<;!R8_Jar>$R)7X6VWg|KaP#E4 zym`G7dX><di9~!5?aSpW%2~5c?z709X8D3rzOcOJUa%3RPA!ye9xWiu5~2E^^^J54 z_Vsjs@Xpoi*FKE8^4c5n>z{h;AAa<`Uq1I=zy1lffYy<L;Ib0!D}2H5FpTFvJR|3L z2F*uhJ<KcH=-hIR7{XTwowPm{gyX;}#!htv?4!DG7uJ@gCdA*od?hwLD?8!p8-Kd= z@@FGH{qtwO^_3s|`d7zBXpb%C&jFS>!orN+v%ZOQBUJP0t^0`WIk5p<|0xo)ND~DK zxY`eX@xQ;V<`DZ+fA>Vh!%u$a+h6(N-;XvC5bR#*6HGXqJm~~Bg#X%}IJeZJJrX*& z56wJtOMzdmLjymMtERYtv4N$PtY@G9x1m4)@&5Fgh|m7uxgY=A*M9n65D3Gq*;1NA zi*noA-a7D&&i#1Baqe(^<Kwpmvz1RDW21=lOz!PcQh;4Y;ngK{c5ww=q|tXi8}azp zzWm*%zW4mIN4Ff70cNXycf1VlPY4}f<I^W&XZ~A%Yfn2DB-(o8KKYq{8TT8E+&fQ1 zJo?0=UwG=<-~0am=UAttm*WK1vsmI~P=lub`D%J&M@?nxKxadF@&}XK+dKT|CoX*I zi;sWi>2H1etJb6OhDOt<kpAA`8L;uf^?h<3NS)kuqyjQyBpsSY9Ix7YrvPj}><vNX ze+aZDLZBrCRlk_PBGeJUJ`-MsFJB1ub|~sP4|N;BN<7+B2GwZ(OFww=e_x4x>(a{^ z<(Fd8@sz>#+B=_#c<f&u`}}|Y`j<aFo}2R2&BW=J`n6G64P4NFc+ls(@y-g-0^z+O zbH(mdk_B{M1ii(OiGPrfjxE1Wx^*U_*<v;uLgp`-EM}t_`^VP%+T~j}u|GFPY$k)w z=rcs>^ghD{y$*WW1PvFA*!O@TQm;EOMCigtkw^r%4iON6oY(7&20!)zzu^-`9sK9$ zBRajoU<^Wx5{doyA;5!729N)Ee}<7-zVgGkzg^^C{@JH~e)Ey@k#`z92kNdq7V-F( zKmCOt|MCa_gZV-0&;}TdRp;aWFJtckAH{L~f$vE|bc4ZmVz3=2j-A9UPMo;KB`$y+ zW5AA$E4Hbw7}IQe?;QaGH9&w0>RqUJT|Zs#(y8}euHWwe`}QOZ{^kGw{6BYlw>vvK zJ8#~bH*em&_olSy+BQJ?cqw-`mvH&AI{Z-Pl`X3i&sMGGxQ+4QXZ8M=RksHzzqeCW zS*;O?3|fs+ty7mOYxJ6OiC+5pyC1S2Oj`WG;{Pnf=37dwhE+rRrVdc5amH#mwLqn0 zH6Hbycub>F`wz8>PFYQ$TC1+{YQ|BjM(I^^$RDIpD>W#C#nm*Vs&NaCsWn=)QtPGL z8VyS1)D!52MunnSI;Ui{61J`27M$w3hHH6j{ui$=KD_kh$AA0o-{1P}^2!>;g^#B) zQ)f@P=b5J-d69-dtS+t1-dIv9ym8|StOEj`Zbp;zJ#JJ+ZrFe6;5OBn%Ud~a-4$tp zb`<%yO~Pi?9N!cj`Ax_{VSN1MqlbSw7q;ixq0HLq|14d$+_!A<ie(E6iewthVYND+ zc7jf=fo264tZs@%jZ>P|;z#Y&2J5tx4Y{W3v?@v-z2(JYln42B9A@G7)0LW1D2q;~ zL1uq;oes%vZIDibl6>0nl&;ok;HS<DI@h)JnfEU}xn<9%i(Y->**Oy?j$2k^tqpy9 z5;OUpX%p}N<D<{`nGvVBY;<?_bau9ep*dbc6di7+(beBye!aanrla->Cd1a&-cH2T z8?~OeMM*SEy7zF{t~KYki7s6Z-5a?t^5l0B5jQN=^Or9B(z`VH%eT`Lt{OB>tw4<* z(1ljx(h5{K2TFO(Y@mw&3jju4+CYtJG=m%GT8#>VsfMKoNVV%j0WKs2s&s0=$jb*w z!Zn+w-|_4#FaP6(B|EmQSpJU(zsfE(o_~1)6Fhb1_y?bU=I=a=V2lLYsxij+3z^gG z_Ai|hr9xh#RO*ycxl%1xDU`Arl~Mf0$6qY@{PQKBFMWSuoiY|ptJQe?wHIih^~7eU z+Ht_JR)eYq<IfLKz$grAQab|%t(M~}FVLy&+5k1FqjBm0FdprAWYDU#YMz22bf*?h z`uCI5rUx-hK=90m|MA|!_r5u@a^s2@$1{S!2@@ZE?#~ZGaSjUhW>#|6WNuLAIR~)5 zfu(k33|vJpbpEfs1}1iDG|=x6)v!9Cz@wY3H65P+{`((%u=w2tZ=SIUujl~;5P?I7 zYH^xioD;l0Ji#Dk5}rj0YOB?;xIYD_phgs{)e>rfIi1d{C3U-+)lTF|6(p=e8m9|D zp)8uqtDVl1Ds=&Tbzms~d@2n}DMd4X|MZ`q`rWudmU&o!ZEU9A{otd2|JO^Cn80z9 zesk9h0fPl`0Pd_jUK+MLyJKSuVs!%WlzVp<n~X(VcWKA42tF|VY*B5frLhJsWpIVN zop%$e1G})Ht<S(2!GVqUXbm<i_60N<8x3lW!I~eFnN_msT$#@R6+G?-Vy8g-O*R;f z*iO)BAa=|e1Hhk&CkL5~dZS-KZ!((nq^svyxgOblreNeXAdyu1jKPcN?lhT+%NxPP z!QIWcXL8||$2i_(HW@Sq9n|w^3s#j}_Q>!5^oPeE9FMkO0$j{}!BYa5z=;#5P7(wP z{LR2Q_GgB$*SJs%Vtb+)LhfzkI`(hL2>UTUa{H$APxmJs)343h`f2XTQ!pCl?N4q_ z!KfL6y7d@jT&CG(gDxe{X04NH3Y0dhvF3)jtL6NmT|z7BiLr{tBhEMua9T_XpCmvk z6thxR!bt-qVv&TEG7_IOKq8cQrQ;-0iByEU6D3ldNyQ?mBmik%X^;qi$U7c?lqzvc zrwb+iT$E9a?37K1M(lTSQ%Gb^uK4Sp{_*T9PfZvJ;sR#}1O-i)G<n(`!4rb5JQeh; zEN>2x#C!HAVa^z^i9303YHxW=*}lTstkbshdw<N|YxbllKaRe3NeBg%pKFatfjkuu z`2GbJpJ|p+6nQlyG2&?D&mj@l4__}#P7jIl8g`Y`8VznEqi2nb$&EHJ84cwXzACmd zpsKQxtr}NZRaIGmOF?xdTg_HEp=#o)eO1BLRaMnh)zuu*CgTJjT;cFlA)-jtB>pz3 zr>bzpRWm3dr~)O@f2qPuR6v^utFG%?TiQE1yIXpixt74@mS)&HPQhj}-=DBw-`-XK zT_S800ea`XJ2zIxY-&=sDvR0*8;+&xzRAzb&plMXcMFV4{FuL0s~_BDFzC%jUI+S& z(PWTZxV-Mj4?inT?>M(}RlGKI!RJ<%J8{kilBci12(;jYzreY<T3%P{voe+;>$qAg zf@_$Zh^xh!Ss44eO#u*bNTuo`S;Y)mC+hK-W|&QIg0`A*;2EpF*q{fLqjst)KI|(X z`5$Zf@MZy~^k&r7Yr02gC=%C*%OrZaTv<`6v{-GGTg|a2fk!j-!$8oF!DpI6^+ne- znTvI1bVP<KVHKEBLZJF$c!ci)7sg$fbUyUL`3vXIo;!aolsy*|dhT54IRTvphvE!h zM`!?k*--AB2L~G(bY5yPp$znEYpL8oeU(>Ym<QTAI^nxaj;Q?>a;9-X$>SY>twHzj z;7!=D{MNzZXT&wC5xE&qf#{LxW(|QP^Pw4yvrIZuoz()F(rB@o%ymGPsiE|T3++vf z%|2|F$2JM-8=crO&(_pfqOp3-AW!pbt4OZKo`Q&rCXA~tkjq6fag_ubXEDC4TA<Oo zH2Cpog21>nT2{lTM<9ve)T0Sjn__O%QGXAz7K@A+TBq^zggV{P{SndJ+2LVWPCV4N z_pqHn8*H#T?SpY1PV@co7O1M+BM861dEE$lijb%QyE*PIDBy>7+6TDCI(@qrUf@`` z8;0`v|8nEtP7DKJtv+lRZZ&B1de#sGd>f3cehM~q)#<E?q=*Y)5s}^qF7nQ>@QBFB z2>(x5#Dx%<#;anK9@X#E`qM|E!Y`f<KUP+r8g(+{$ia|fhf_~RpE-8w;9;xL=rCD; zH$y{0o)yFpWGSlD6Of~GbA723J}AknvA5AfovSqi`}bOR?^UbH*BX;OT-ExWdAl|! zzquq?b<Dc@$M2(x{|+GkR-Ag*XXzDde;Qa9ar)<C)%h)&uy2y$cX)mcBuy6rJ0P+` zcF{bnljV!iEtFbF^;V@+Au`rjOeT%({FBc;_w2LJJ^ws?pJSiraInvD&yRcVZy!s9 zRbDU&U-j>V)xzkL2R5I-bmXV38wp_{8-Lip`m6o%>-HZwxNhAcv)-<=>L#GgY)N^w zCUnLiOL4gl<0~yg)0|yZz+G4<6|RRr?;qNK+FT}GvWt`Dq@Aiv1(<VwEPMCr?u*=3 z+s+hh+fsDtV}Q9JBjGOf)f3JmRS}!D=F}sxts72j&J=F!Brt!iJr3+pX&@-fvLqfl znvi(oKw@F?jb!=7D_5eAr)Q+=>({^d?#LqMUHhWIg>SBu4N2}73&oXXLZPTqo|9B~ zy(lXuF+IOH^+sy(mADeC)oWpJaQL<3aNrmLn+a}7%C(`lV>)FiDcA9mt{*yG8Q1i& zQ~pIsl!F^Mvn7AaTJhEsm8D;=xsvbY#NnA|wnl2cznZ;jyP+}-Q4T%_c&}^o@2M+3 z_sy|O->xY=o?dz2yMk-=ab?StP{9(h-m>yUczmcsr6vgvB9JBie9Yk^TeofcIqc+5 zhUi0QcCA^z<G9+k<z;r^xCILrE?BV8yMS59E(ln-V4-h8(8B+$l1khnM(l-$2Pa{q ztaz40R&+KlE+#HEJ}xFUHU>Y}<KSr<7aJSL#<Fo-Y%rbT>x-SlpZR~hu}qvhc4Ay? zOv2gHTCh553Lu)AVw9lCp4-C>wX=!XxUjj4>+a+n2tGK}j_p@SE$*_z)254SL5LBr z&+COnZ@|G3-#xg|?Bd!7T(H|1Y=L>bcc9x{Zs(igHf;wYof1hy_`^pp(yGgEl;&jJ z$SW;0R2K=e^9qUzv<(}cU*ua5NG;)8FuXAEt(7vVTf&Gv5}%kAal*-x{IvA6G*Cub zMw%~uTt+%hQ`t0cDwD>hc~ZS;Txvi{D*l-iJ}q@}T54)qYEotu4N9Zb4WLJTw=jyp zN;)9)<|uM=(#DVXM4MjieGpe6fSQdoG#O10xwQOXp|M<i=HIWfulZhOUh}+q$7`>? z`uZy`KL4+Oz4(uh#UhN-aEGc292>B?s)^MYzN^d2%gW1q<xH8UoU525l8D9lLc$TV zVn)J>1yYGq3@J$hfH_G3Zn8)n2MNenYj*HB)1vw?I^s3q^;cjvCaL4>#}E0)9u0gM z#%2gmI<CT2)}Zaf7;y`Hw?|-uIEQs%jozi3rB~}s*a=&wH|h-<Em$cwzSdb|4j(># zoIS=I_Z{O7b4R8gJ$CFUw#`aTOi7GV=xKCNv${LAdR}U$NhAu;Xfo40>46#P85t~( zp2QnEpPE%+6C*W;Urt5;44*O{9YaM2CiA$(=!OZtiZPm`{fJ{;8IT>gF>+!{9j92^ zoA`|}#ArO2;y$-Uk(AtjL6Pu7axrYZ3i9Xgi?2S?RroS+d9uSx%3Nr%ZsL-<;Y8S+ z=t+X6(Q=$wua=l=S?e^NfyPRc$yRHwkDa?{A-jlK=vnmm!gm)fTDWl0qB-I1_15}^ zB8}B-vMRz-WD<31rAj1GNNaEig$A>@7W~F*^;yQ%YD;R(W-lZfACxaXGiMraHeqze z52<l*0?C;%LbYQlsWL$l@GmQvxD9Kg!xQ#|l_$ZbD|TCXYTNcxNmuqq+{h7U><}N7 zT`q_@cL1SIzCQ6ow0ckFg?9kt;gx594I~k4a5wfV=XF58F<as<q*lgOlw2uSRFsuv z7iT3{nl`_)ie14hr^B^k^70ic-&@vfgMfNN#hQLoTedIq-1e{oKc7t6b@J5JQ<wLL z9uZo_mO*o%MN?|=kYSOj2M|CHWwhUf#0cS=R(_Q64HY5ctw$_pBM$Dja=k@sbI)A- zV*7Pf#HBqaE-yngipGsc<H|pPD84v#WySaFFQ>wUJ>clBv|mF)=$b_6B4qK>&2P<D zGq--X_sr*;%Hublxv*!?ngeys+ZQfdy3DhbS>|2(=P#EoUAAoT2gz5<YmGNFR<yOe zN>v!27Za0{aXs^TRzglfNsQbgMi*kt(3=4us~;dj2?28(P}L>^ig$IW#lD6H%Sh8m ze3gsqOAy&hbon)nLru=4vaY;hV<(q&qeoc`1!LQw*(uLbb`nsR;ZFHKXpommNg9Nq zf$8poD@6%8F_Fp2l9<$tlA{-M4b7Y1{fb@XUCFKztX##ee0asmuRdC8DoU$0=4wdH zGh@5!y4u>hIxBt=9SHvxW95J*P%A4M1?N}zF_%;mrST@JaaM4<4^g{#ei@gyQN0=3 zgJ_3Z+yowZx8A~+Z?l;oP1e;ZEp^7G)6cVS3ErINdy|{Ty(xGLCzIZJaeGhAjRtGJ z#=@EdFiqu!X%e0}oCX^$6@|q`MULWeMa9JhqEQ0+AMI@}5mI~e*1U;DDlJ3ZI8>`` z)&{F@HD~2nGA81Br|~|6&Of&xj)h5?(QHEJ)<+&ba_rdgW1i#O(L0YHJAVAgj~i~} zM#a>KQ&gCX&_vq}{EzBT>sT98J7Np0wc4zn+5pTkytRQK9TNU=3gN$&PdEKS?0jQR z0`INKPrZIUKK{BVJ}5CcIVs*3=Z&9qJt2WElE5K7@m!oQp7|R9`8gi<7`nm{7#ANO z$Kuoz9~@JB%O>1o5}(GQy-x{Qf%GOMGyqx>X!XYWdU#mX+Zx#VdmEbSZH*0$P3jcc z+Q<Jkcfs5hB8f;OL(Pehy(WQK%$6~wUJNq6@^NJ)HHPvsw%k`HC@<s6r<RqMN^339 zM4R;$Wk}_ajV%vEvcv~*$%D>eGFeF8^@|4tt}3wv)zRyHh6z@iN>rg}t_RnfYBuUr zYH?X{DTXwe83Nb80dItbw?j_Nyw&mtk#|SOem_`HUO_?kcM=8k;zXfBB!<8$7mKTN zO61yzVwF^W`LaSJFUcw{wY|G!<(FT4vPL48N~?925op5EgC8&#R0^vrDumUQmDPZw zyrQ^JQ795si-i2=36WSVtjd*VW#r_Ulm%k3NGK6Wgd&kpC>B=dN;5OEv$Z^PuB@sM zS$+|F?;&s#^h%-J*4)<7HPD{=*;_9z32k!2`K`97;?Rd5ty#Bf&MEA|%*+9_x&FTN zD?x`BYDsp75>lgbX`j;Rt2b`J{+>Gy?%%Taz@C*SHdXKb{=oX9+kQIs&5rnuao1M8 zuypyCOFtthWx^Vr&WYJ+orN_$2px~4DmSazkX2Qq7Gh3ovgpc`@|?VEVQO|}Mf!~= zvn%p%R8<vRi_5sG)+q7{awX}NIo0X8IhDEj71f2&v1ym2#1VDn2nx@y4~$}#U)H&< zR#u8^E$v+c#&4hf>r>A>e(%4&)o|Evit{xUR~`*5j9RmH={Y;Vg@-{v#Vvx;&82zl zMa3f*$ixR^tA@(%X%d>G;R)gK(czc&hlM7dI({`&o*HsB^lEs>xxHr-uiTIwd2Q+P zrOTK6$OEl5snI+CWL6hSiRoC4lH$`L$;o?;9uC`Igb>^Yb(yB<{IT<4u_3!I#Gifq zT>R;Xt5szheR-KmR~ohJXym1&$cVVJQP)GlE>{*Q^d-d-P_kKjqrsfzCuc3DHNW+1 z{53*pQ)f@V{m?Tnzxd>1fBN&ZKMAn|V^@`C$BO7<E4Lm^B%7CCLwt*i2#;Y0^wUu0 z{=*M96oPu4NmOk$7&T@b2F$>XMxDWA(3!L*%YWZ||G)3g|C*FqLcK*puv%0nl47H- zM~ST>U2$S%*|n<|Q{$^FkTJDoN?CG#c4jQL8jUM>B2iwNT3S)6H&#_BHL}#~lzfG# zGW%Lyvb;R4sH(8WSY9e7SWW4fX}Px$^K8-!Uf1Zviq_r%d;R>sKJ~=I&wjAt{RBsA zay?n3<R5)w#y9&uS-B$g*BHLVGmrT0xDG6uz`_m`Jzk^aRk%0}(5Y2E?VmM}8g*JF zm=<B5zQ{|brqtCxu3h`xW~p2%sxcVUF4NscQ*!df_>-H;>Plq_jas2liNzWPE4xEp zU8Im0u`Z)k8#O8o7Il<=uF0!P%*aa7sYG}YDbgX2tCT90GOrrxi7N1HD3c7vT9%|O z$O@or3RyCn7J;v83=&0q|B$ch(OLKX_Q6-yY~Ntywg$mFf3mk|(c=H?i#)LXbnYPV z{0t~t?5FJ8J?=<s1p75X_hkU{o1z0k=@hC4QaX&s$U|ydEi}J+uYuG5)&Rx|1#TTU zb#p_J%7TTc>WXTJ^KS9Oq^zqf7Rho_GtY-)WTs|ZkIu-zY$ml(7<xW7D?KUmd~QX? z<3$xErNu%s7OQk--KF@l%Ius=@s$O+6{Se8GHcapo!L+=6sl@1Iw@-wSTUY~SMw63 zA8xHls^}bYa3z0u=*>U<?zKg)zH)3R^ig<mOxDLe|KxkCzW!*rsUCY=kS|OCR?lyW zD!24#()8+0KFBH1kC}A-Av2hC-e>}!=?}bqkC)G&3^b`L3M)uAZ8Qtz#(b4oYf)B9 z?a=o=B$ER761hTg>FTMgVHbDpj<|5VP^C}^PwhE+?#PLZ#DuH+gO4ROL7sugJkz2& zkaaHcR7OhjwbLQz3?zmi`5vqG@V+BgPRE8GzY-CCHVN{&1%eG^2CQ-e(OQ#Cj;RjU z@YLTHFM4CiN6);nBDP@B9@ye6yX&{Ved3=FzVNBG`BwnnZq0<C*4+m5Q$WX>(5N~z zY5*_^x-ta&rFf(W^ppSr{{fR(Z&e=Oe)z({veKRB!q1$$pumDml~^j3$?)|_85y+P zGLLk&EF%2ao~y@qA3k|1GE*s)iNlVb_~}@D%7yqtM+5dn+gzq;7R|BPOVOwDuEd|+ zA9_GzahdKh>n|KTAG1I5RAlI-EBoRI;Nnq$`5tYMDH6lN&mVpM;ZK*m`~GJiFZgc3 z+OShXu4mVC56=G6OAkKzQdIfC|H1Gre*1_C(*@ZH0PFpeFa`d6>T#Hk)hJbN^&d2< z8d`V7{0yDBMk7g!-5b5LIR4uMQD^s_QL7B9Dv?(j2=oG2P8I;5z0%1Q<&r9CRkc`z zhVaQIVT7&}S1LtH4c2mKWqYbwtu&aFCI#4qUT3zOSi?jUxQ0QE4h8uPbj*ub7@7F~ zD_72+F>Ce%e|>cEqK`hFKmU!@cl|f+WFA-W*|N8vdGe(vpMPnmvL8_X5p-<4NyoR@ zyi6dKJ(fvSkXHm|3u|R@Ou*8+1sY{5&KVrRbP7^qEi=tfpc*ao1O^TbRH-%90L&{B zNM$bRIGI!~m&tvI)G=K~s}&L%E+s;<74t(5vpibJA+`2+3si?@i<wXInmo|8diZX7 zE7fWYa^;8j{r>k4yzs@!dGp@>&nxqfO@BFL?^av(UtXL4-=+J%fANEjMZ}&S0C-rA zyxC1}5!z>BnuN;AtuPmHI}uC9>GmLm4C7#30d9}e;|O#*5CX;#fIk>MxTZQ?9v1@6 z$TXPt>7{mY05l6OaezoHf|dcl5Sx6W$ykzsprk@8m`o(Fqx(ZMc>5%&xQb?ekCHa~ zx>_%-`Q*=YA9~=?Z@+r!spnpJ`J?4K7cY2o&X#lEy!-x!Bd2bh{(j*}SUvv=l-n@% zU<Z~w_3A3CtF@}dG0-wF)ZA<z8W|k!=@=Sl9ULASWQV+iQ-%hIh6ZsA<2&LV#`R!l zg{GFoe-kEgESmg2bG^-0Ur!2fD<tN|db61p4zYAbwiNY%rI#qJg0#60@(e_+mDGGb z>yI!0>yO`j`O5Qud-SQ7pE)1#@7LaV|C>$WzLVpkEy>UCMikQjuj=!<EnQ8Sm6c}X zr(TIGOwB0jiIHWCu4ZRu#0}VoQRCrZc8I~j4F^&E2fahn36f!Z#1>N>Bn8Z3%q}oo zjYiMb{SH<e(y()<Pll_^#@gb8M^7BMWHM=uwd%OA@HC9|1_0vM2$8xLh(MQ7Yb5ed zXZ-%zM;~7O`I~RN`tO;u9(!TkcmMfl)%VBFpE$8;$%h|oUb4ptNbUwrfj{yzg`xfz z0~(fl09r4NPEls@Dw6WUuB1nYCzkhxC#MwVr$?t{_o4oQgahADz##oHgB~0N)WqUQ z9f1KvI8BcjlOv-e;xCn1YNdNN9XWMYqETvdPVC)wI8p(Pku>q0x8{6a1Kq<fPyijH zBB@GJ`O>UMA9-NbH_P9C>-7bHm~!{*M?ZP*&(E$1IlBLY`zMc|^zUQoB%n<L6fk%E zUp<4MP-_*XW@n$Nx3jaYvAv^vu&KAHv%jvqx4nPFI}|v~*FTtm0T$R%cqR?I<(k@? zVAwLwpV=3>p#)Q=itPAOvsNjStLrWvsnSYxW>rDP@fxF8rB^W^HU<oBY}UkcumqJ% zlK0BP_uc=;J3rX-@thZzJUjWW8F&BngN0wNKYj3{J10(=cK3RD5%KBU0l5tw4|hN! z(kV(U4!hItbi!QNX&=Iw!#?7$+lPloh_FV6e8b!j98|HY!VI~GCyfkM0|<=QJT9Q_ zQcJZ8Qi0Z5s}ip3jA|_Ag>4Z+Ck{R(2`|&BO=b;akoy53dZLbzpb}Rvg*Dc1@4x%+ zr?xLyy5-Gj_fMGl+n+18f4Ot*<5Q;3xM%ivhfa{_`2PXGBtIrfYML9d2sN&uvAL<K z+1tc5I<P9$)ik-WiS%oj(4(#nQ!o|>Yq35^&K3byJrq+jjiy>*9&XaNUXrZ07|l9p z7tCO=7O&Zd!wUrj@m<d11Dn0sEr_6qKP9LnSO56HBM;nv?*p^8o<4SX?`QWsIBxRH z7ehXO>4n$-GCp|1)O+69&r5>AASifO5kWy&dQ*W&5-=n|EIO&mbzPloS3qZbr@Je# zyQ`xEabr7~4o4T;>Fv6sv#YDKqpP!Ai?&D0I#HJqXhQ@hOyxK%<y)~p%0r?z8Q}OS z77LWB0VSt$Drcx+KBBIvQP!v-gpi)u1YIIjg_X2u$Q!LBD8=92J$u&d*)wL}^>xUh zU57Tzo-r|a+V7tI!(I2kJ!jg)iFe-d=)DKPr@RQlH`*s|W3hMhtD@Q}V_#=eV^b4U z2=oV}z?-otkWR5s*nrK|o4k!o6N~?ejrC29MLL3pVClzFEu=!Tz=UR=002#DvjPj! zLV;K`AY?>N;Z#hrF~Jc@B;sl%Ex<Acnp^wTP?%d2O{M;6TyXG&z(6Ko?!m3=zWeWV zFLTFChPmhExpy#v3Cz8B{p7wChF^?sNJ&C#o_Crwm4<$kmc&D-!Dtr1)<OsC*V(Yp z>vA||LO(`YGWuHUta<7>KtcMSLDO`M{uZ@bNm7W;0xgD$3|vek$+%>JB*S@RjMOFL zq<2W9HBzaH)<xwo!$2$CBBRi1yZ&O>`G}|sVQ0hAWYuLUS1+DBe<39F+PSdg?Cj|9 zh^WwOl{$o>zKN3bU!0o>oav;oH3A%PDX)w5`rNDs9tWP;UboxhK|Ds6*XQ#`WN~Ac z5|7&jdq!9-Vs{mvJJ=;r5o(|}x7I>L^g-jSK=X^$Dpq-CS*fI4q=bvHN+%O3A*jeX z`D2h^a0;;nCnU|_SEf)Yq%t|y6-#PV6=m`oi43a(MkBu#=ttbBqkS#Mv}0GOAq4nG z^!U+EavO!c!K-a~>~uSw_1*OjyKBhSJLDX&JDkJK=59~3-rCbJ*oOhp(&V<=9Ya0! zU}l5PK`=9iU96&!d<1Zat7>bt(14hO%F-{Lzs?$`>vj35k)gSy@Uu2pE7OZu#S=8W zD9I=Va8jAF46+yjCM%3DRY(<bb?(CGv;`?Dg``Grt*f{36XV+es)Gv_g2plZfN0vy zK68u58q2-Wt;ZO}L)7K;W#*?9Wo2ew%StKDFzK@@lEdRV%L=iJXpcO$qVwX_!USD? zr7*hM)=-?A+~OvPl!T!X(<A1n_>{}1Vyj^yBdkm~mxPI;*-%z_`9fYDRv^yqiiz19 z37PUQ06`hIGg*#BAyMjqOH~pX)`z5**Cxm$GPr@AfBlWaO0iUAP+Hgq#`;U=;)4Oi z8~@)xx<zQ5hvjn}IGMiR(CKuGV)9b6t`%h^l%}O9_2(+{QVK2723<_*Kt(FH!!Av{ zYSxzvixVxDyre>_2ZIg|(%8rnnQ(sBiEZh1Ce4Zc*TPcGSSOM1I&mc|9|UQQITd|w z;ckUQ@}xLBuky&7VG1mGm7e-}XC{CXOK<Gkc(4qnJQ8X3OHWrRL^7FHsHtzLxA<2l zD~R)rF4PfNM0>Ym>NeV&$1k)hO0>O(PM32CaaB9|ySm#4n=+d1or66ceZ&3E;ht`L ze{a9Ny?3Z(2%!*rlzsNbzTP1Rfkl033@lN#QYfi_<Yf}(C7e$ISSDj($>q?zT9d^H zU$>&Ymt`W!6P2I-a5U_2k_1XcN$L-w_=gIzI&Mc|b+x!kT>0haOFt~bJz-IWrJ;dG zmS3ql3KcpOc6?`=L4LDuA-`MnOwR%+jTS)l=sVrLb;FGf?l!y2JKWswv^!jg5DDLT zhr>1Oa=Ay`gRN|*sm<18b~xOubIQmV`T2nwZ?x1xpI-~sJ-ae1H7OrJna#OLNwI}c zFzdByYr(N=3c37Fc~xa;@{#l!sX{8RN-hGAU}g8p6_qt$6*a1)HD%&;F=|Zd3$9ga zFjD=plKjt6oAaJlrxU*SL#*8adBoG*jty4YM*2HhSK}ZDS>D^!kG*0YF6^1$>~Ayq zn85qmU1KBGZG-MJB#RRGy@oDdVU8xPtp9q6xTi27w@9Q>ROeQd4HZ=ur<G@B6=o0C zW)0WpCl!hEdR(l163<UW)cXvbVA>ccEMC)8DAYBu*u*%iQwSA4Spe)e*_sIo04WC} ztYN|TeX@IMz)`>@<r<|z0|f?{qpC*hUqANS5B!r~G`HAO#0@tpZnPJ8B$lLMd2?z} zUT=!9Dd&c;Lz3E_Evzjq%|>7!Lqm3Loj$8H3ZUMTUoy5pd7GREP+_jCDAj>{y%ibx z+TxC!oYMN7<jmMKLt18HW>R}{#+7r0QE?^LY8|q=%EI!Z+zPv63{*e))|>9cIxK7~ z^#-NVY(Uq-XvWDo9A1D1@Z=5!Blju-WpV|DoRF%`8WWZ;X<1}Uc=ZEk9!WJzs<{eb zfk$MyS}JZV#`dG>%AV{(A?M6!&CnUrIc;I}u%SLTMWWB;@(8%fG2m_=wL!+bG)};| z2kQDd8eN?Yt?tIA_U4xM=H{lhmcjhymWEVGTSvp7z1Q7pZf~xy17%}J^;>%8*g~Cu z6^AoV1`9QqEQ%`V{6!q>1IGK+|3VQf3@9rs^c8W1h{aHJM`5M7yr`(KsHC7;S|x$k zlt8BO!%M5_|KwNG%_C{es#0HxJY%R*CoG9?&2#2zQ|tROGWEmxEskWXEzP4SFK$!T zRw^S*S&lfs`@8IFc1+T`)l%@E5ZX2Rno?aKSggb4aJmqc)r|umCw?$XhwqeYz=3nf z_0*G*=J464`iDWDY{7EI0H)PREK31L0)xt@#HU7}tnn#>g*njI!0lT7duVPnpzC~L zE`FhdHyN}Bg9WQc6<9l@*)D{701BHPGc<EvQHjv0DU^2T?Ug-+B{lA%N|U^=%5X#2 zDfF<a;&P|0pmMOrBW^4&MPT{BhX>0MDenI+t54w-5b8?9fT`Q%aN8OFVC^jEG8l6d z0>^_?9}bUw0`*5ShlS?JYaTH_VSzo9$2nA{>;-@B>@^KIJvAb^(=k+_8#dH+HMdoD zIXrrW#bg~Dw+R3WQVH8K#)o+5Fcc#nF6N0b{&}m@Aa>H=^_Zw%zp2Y*cl7a92>@qw z+XGNHpM$ec<D1-J7xE)D>ZUS{n4U1}L?zu_k{j~KBj+zB?T@r|bXHcEw|CTCjl3Ru zE<7}JtFE(4Hd-@&^%6CUGpc`8o7?9QlSf-i--p_;_B;ITgC_D<0gFngPcZRqB(bA4 z^xCITKAx3P)A_5XE>Ab<<*{i|=QFM)h9|>-Bc~|WXi#2@jkp$_kr#VWX0nvYp@%}l zp?VWWS#wb?T);(Xz0KJ3-kXYDg(;Fc^G|GL!Uef2s>=p>N7q}XJ|v`0g^&s*Z>7G^ zNR8;W2T}#0MgUsD#z*Vvvrq5~J2&fS5=LdFWo2d~hDml-ZVrrfVucqoGcq!>bMmr~ zkeivA9k1k(OS&X~H?*mK5|$@+$lU$9jLbe)uUoBvBf<JI6Cz_<%$%{MLB!d_m~C+> zyOl19D;L!Hq*JSzhVASSDzsu>D&$J1ySyHo-1!6O-6Hx-|Aid7L7jXnLs<rZ(CBa+ z;;GkbXGVyUec(MKRXR*fso9}7f)yaGulg{p38Xn1Yno&%FDfbKKPA56X(fdsV+B^b zO9}yTK}iW)Jh7+>&(;=5X&K(nSFP=93a{@rf146@`sCTe!p+iU>r1$vpHgf~_7#4y zt8|U(yX{F8@0HnHobo$W?1xu>qV6YNdN?q5#~Kmlp(&2DA*-$)-nzeibo-Q>BPQW$ zGQVJ<t~B-=yPUm*DF@#H2}ZkpgauqYPepQ3c_S<c9JV0%_SMz(+5+lqv?gBXvyH<U z5*b`h#c6$AT`i?FHnokk2DY^{wRl^Dn(7-H+q|t4S{j?0LHJfe;HV{8!?y+HMc<#f zR;N;Kja{zHyM6(iI)0yCpg#6NW>ErnLcJ|?Qx;Yjz2bG>?i3ydd=JWsrGa~{Uakgw z*PPK`tvk6%6{-0(d^8Qe151sN2+C+Aag7251~ZB<qDT&iWC1hhm;hR>*?&3We1t19 zFe)-K$`?5<Dw0mTkzCX`{w&Ik)8NSPh|8CvqqwMhBBL%|qVJ`s2+DYD`>tI(ckbHd z*(unyo81+>bJxz@ySH!m?&5Zi-?e-9!dE|juV9R?);4U7Fdd8A9$na}3r$}ZVpxV9 z?K*azvZ&4a(961N*ZW)5XE!G!npgEtDZ0Hy@WBZDr%k5|)SX^Th^?^KM^)xGua835 zvHxrII(<w&fFwwO1A+FSUl;{2%Q=F1&N0GMF>AjQQ?8`*yEpINw}0=x{rl<5?icLa z>%-4}-#%uqldjl(llWWv4lez1*{-|xuitoZ=lY-5tlqqF{lPtZ4;*>+_m4g5dW?D0 z`PleJAA9KG#~yq1QT8$J(Q%JIKX2|!nY?WYvE)Hc(4<AoY<oTeO2C_tc^f9It}EyG z;NHA0<reoJK?fYVf)ypY9zF3vaAM$X9C5i(#ysM*3mgFH9!jBZI)Wcvi?~oE$23ST z^U0?{I+ICA9nTADGKmjDj!!O-;0KE@@*vHDO&gER+`51B>9wb&2M!<Ixp~i_%WCZ> zufF4(?|CP9{yXo?$KjhF_}c3W7VrtM_<A$P#Z4m37eYgl)g!{{I!6FVXWIz&lN*Ce zz<FB#$5=QD6(l%7<+1xlc!)+Iq5E*ae;)v0d><LH5374r6)MQwK0Vx9^ud^KW0_I! z)lJnH$l!x4KJ-{XXY~_sVlXBhxUgsDo}_c9kH*wrycT}q_^FV1i*?D|_j(s`?{agP zMeIUmk#`}tAYjp3xh@KL00^w@E4-;EVOxxSs|*}s1A91vY4CGw76Z`ah!&K({cP$b z799prV!3pX<J-u?xLbY&9QC`&{1QJ<=I?i$BLIMa=0<`+icm#j`#N;H5dpDL2Ea~6 z>ae=IrVP>vym%(isxV2WDwbTd$ohlf-LyDu09Jb)_|++ALT**5RXVIDt8^-j)>!xX zGjI9kv2z7;@WalVG<V+Ix%1||^wOL+=6K%V<^;Ym=U?e#<3?@IbMj^1sFs%Ry;A&k z)wdT^8`8I9QAqe+n)Ul_EyvduaRb{1IPtri`_8Rz-?YZO1mHgLZSx_)hDt)_uSs+o zO}wCX1-xA@8lPDQgYhAdIv#bkiA0w~m3F%q#LJ@3O>~ZEx@*dnTCK{>`{|Ke8hNDg zo?Wn-*TODh9G1J(dV@!I2OODTQUm<Tr7<7=_kG{u;154qOl0YLCvf3w^FMWc%zYC0 z(I@W`f8lMhtzB1s*tMf<cXY^Qb<ycHQ907qwPhT;{=o8r<k-Vm)?BU!i@egS*E5s9 zSA;80e*g&oT^N=ikY4nYD`fIpmUx*iR(FR{jajy_8>2e$6ATS}xAV(uKKpp;d({1) zkOTPGkA#LqU9Y-Y0|!on%LsL#)(0J*&nPhH+{W=(42P`}?<Qh}2P^DkIm6>dXqmB4 zj>Sf!Ng0-QX8s#*%$+mmjW=HVIV&v{#=2yoo0giETvLbHDGN1TpxI`Dzv@4EPYG*l z;f3r2JHI}D?OV&{j5YZc)&^`yWC$M&KPt*B`r*fNj*HlEET^FO+IP!ul<M+ee;4>> zrR1bw{q@mKdQ(fl(=pb0^?rR$w+kaZkt<KK{*jR&CouWJk_1<eeWGJT+ouu2`W`+# z9C>ok*smuS5%RzVST55Y=%h$BnG4b^wWd1N3_~67yHck%*=$y;Jb7^ST=t{MAAa=V zhwsg+X|WkeW64?rYwO@C1}TD`HJWrr@??6LpN$w1<dJg@H}<vka_!!>P7iCZ#}0IE z&NYnilWi@Kf2Y*dI^aps-Zp}b(bfa(&)jURV3&?3=UW0V`NaY~W=bRnLo6Uc$7`R! zGgZQ_&pr+M5C6xHZ)Cvu0a72)^=YaBIu@s>iayLgbObqc2(W}en*T%hfnJL&sv;uf z>V==~3J=v^JQi{EVkl(g=u_!euP<7%Y^iry@bb5kp^Y;-O`M*0PUeh(S{~|AjR@rD zy?_L+iH%J2O+IuB)zXARZ{`)IT~0tiBR@&af)RirZ~%FMG&IuaM-+|2k3F<5eDbh( zZ=8WeC%+{y-|9RNKGSr{00@m1^~Jczlc%<AzdPip>d4lMht3?|b!PYBQ!yn!yzu4n zFTZ4$j$gKX-sRlOI%qyPc;P`bCfH$B%wrI8-b9}N8oAt^*E+a>>ir1sD~N_qIAT0< z3_R}w-_HxVfjJC|k)>FeQ#LThZ*PT@6vKcMQw3~dir^c7(#w<O=;+P?I?loKTh4I@ z;Rz%PvkXEL@Dv1V29i*H#sE;LfAxVpop2M?RY~+3rCfD4%<mG^1|`<u;peH;+FF*q z_vPnbu%Ay}^7(5OjmcPwKz`V(^0t#O4fIo}U(TzoTi4TS+A8Zmcd0K%V`x=%L|(d7 z*mbgAdcw_}-g2()WbgK^vi1X2+Wunk@V?|z0Q`mcm>qYP9<XRnK@8#6Zb=A*Z)W!h zzro=xlMd>rr05@SQdiN;%{fE^Cyz~HNMO4x8pAL2d8vbrK~JO!1IRHN<#^x`sS9wJ zb@1|<03E*7Y&KfVGhnaEJEFlU9}7uVQ~iZ^ydQ9j?_9XCPP5;HHLAwOrbaZCLGSf1 zb)ap@{|rhl46gN+h}(8b_I=f!xSW-Wi#1W@k!!A;+`s&C6t+4GS$ux$%CZ9q+naZ9 zJ(Ut0omjf<O91~??xxE#tUFF8#$}ekdwy?jiHUO@Sl7%)G5D1QA=3#%E4{K@--qGH z#j~g}4vgJp`570>vnrkdW>A|rMljq~LaKm6lmU+25Gyd`Vt`?FoIU^|hL`vAfn0(6 zUL6QTt=9zr^FBS;xZbA=hS*_N%A~AfBD8xJ!=b+&JOTUv@kgUjj8<##ku(DTDve&l zw*ywz;%ghf%`Od1SX)z3CO)+7+V=HTHT&eDr+*UXAz;GZEkFFc!EoAkdf%Ge*XQ(y z<Xrn1{y~BB(yntewyoJ-)?6Bo=r_BvuQYJZGl#mU9c~Ri!SgK=J9KgqJ4jN5z>5#b z_}r-Q3zZ3t!hYKD&*F$SraQ3b4vobSE+B2dLXTt+avG;A5<bWs86o>L<6%)nZpBCp zf`OS<^B`}<rnAUvtO&=TH-J2BT3tOU5RJBD&;NJ+e|&G<_4Yqb*XzfeSx}_T?~Oe+ z1JXv6bVS?iUA?xH#@5T?{$6Wu{ZNXk2VQNp*9=23bq&My)}*QyEnDYG5bs8#EE08b zcN&u_+Uz~~KF(5GbIHSDd!U<JpWeb6X7Fu7qL|S?69D*_eET~H+5(yvzK`$|Ka$aq z!Z~JxM4TgN6q3mJMxkosAm=2+96-aUb<{d=N+<7h$Z9@n5hVH$Oh6ue`r75h%qz;& zOV?uKqGPWnCtb}n*fzhva>a^e?DF8R7OpqckhcuAY7oh9P^|d_I$Oci4`N2J3EK)H zHu5c$K89gZ@$!NtRg}jpfbpM0{YS{<B`uoO(OiM<%p{5@9Q(oH4NrkW@=1Z)JRvs_ z;SnHy!A2366UjysSVj;8PW!AzYpC3`Y2V^wp<jv4tUtJZ*N&fm+_HMtVWVyPd$34d zwruIrmG3T34lP2DK#QQA5R_kg6QaaowSid;q<sy!#tyIW0Yk9vR)c4Pi)>;?;UcBU z2x`qhSK=3`00ckbA!>FY-A6heKgGgi5dQY4GKB^pg7w2AP{a5Vp7JUv7X2xKggH(# z4y;>vu9_{lr@T}bl`SuqR#ui*!<<`NziA<m18<MuujX%U&&xHyV3Q^ld=Lc!=1&l? zV9B1G0;BcBgzHHuI7v=UNlHo~GxkK7vnP@@drI<f9J3Gz{D_Tfj`Q2C->U4y%oKf8 zQA%qRPJS*x+CE-OM1&c{_fOV7na~Jm`L0S`c(R`wL3e=EdlO#7KR_?UhY$8aXhQ@K zNYMZsK?qpwoiI0rMh2^<Dh$~OPhh~nK2BSE^_4kueRJ-fJLi?yrpu`f{)JySB%wVi z?!zC5ZzmSs$jr{pEfT7P1qH=<xi@l3OS7`Ga`H>%a$#kWFE6mfXw*B5%qoDpjx{zL zgY`h{O$m|^%d=*K625a_Nlu<M(}c%Qm<WMP^hqKmX&L=$&xwv<O^>Pyj$;~D=hh2! z8W&iuPUF>chKYKb?$9*A!0LkxdQ1QV^ah@1^KmV~Z*k)htW@jGIv8zO%5yTIPrH$w zT~R0d&+6;fVy?wpjj4hAmRe6CJnkkilPg~RY{kJ#8D#|@J@UK1?E3E2dF*?4ezECn zLP7bK=YQC-eE#zf%|+mSEIlET33Kq5emTlzX#AbojmZfK$^*RSl*V0>t~d<4r1|5e zEZ`XMA{C<$VRRA=#3G0x5Qh<##;8Xy8>5ztM@aw)B=N&9g9VXMv=OGIB&z(87rY>8 z;0u+t3M;>Alg46eXliM)wlvr@A3p!@d6@o9ocqcOxHjudGz`B)lY^wPa8o5L#Z!*F z{`%*yt-reM_}6=CRhH)3%D4|FEHPgXJAXKu!awv6a)aH&-Syq4{`&Y+PoIJ-E8OG; zdPg_vy-j~Mh1U=QY!W+wMN(w@Ck4cH21Z96Oy(UEhPAzrxj-)j6HNvLBrA|_kH83v zS&GAqG;%H<ohcY0jg2EPfl||hyle&2V%_D0!la{;6H$3NH*zx0=IiQ<=YRO&sue5Q z6%&@dBZHYQ@Av)^X>gM&_FRfRcPaGP-Z@Xq{qXY2kKcP~>$Q~F>sKPemVPj2%iiN* z=~V=<q1;<ts>&(LwB(d^s0+#~5yTMDNqxon1T&1BZ-#Z?SupQ5Mlv<@yMA#RBM9G7 z33#IMK~h%Jbf8xw0_K2U^74U+4n%44^&#xhoCroCB!S{S@AHl{lQ9TsB!W^*1X#6^ zNNF+{Rp+aYt=K6!ynV}0NA~X8v$d+ZWYOZq%Y92He)+}x_>3&HD<(sPW@U2O`j{V| z+;I5d(N~{&bG7ZK&%$?n8<l=_!P7e<mVCTo_uI=~eC<0v%10Jl4r=lT>+*9;`;&XQ z_<`|IJQnt{twm#CkHy0#u<yAA)!@)P#Kezj2FS0fVeSB!kwoYom9%}}V>F{cE6}8e zkLbaR+E@lPlE{tl7dk}eAYUk4lE=~CkdI&V!2H6Xw-ltLCEU=IloqB{RAgqQDjSO5 zS^UvgD_1OExpMhC674m(V)B3!y303gd*h>5k7Pyu_5Ob^&tCancKFv(+1ua#>*l=0 z|5$Z-PUzVepC-V$>TCTlEN_-pXK9={)}9pm1kR&Q*Ldr5vE#@8UA4Ivkdsk^zMm!+ z)UijQcZ`tUbc}cT9OGy%MIC$wPYsUYv6(Q<B8b+5Y0iW%7Sn)gf}R3$kb5z}H;?rJ zbO+-!A_B^4Fx1xD>g!Bw-DI=H3ca$)QuFSMud(k;etZ5quYYFL#gDcC5qxs_>TjNT z`L!K8Fa2xEGY`G^`a8$JT6y%!vUgwjGG@)Z&sP2`GULDR@-5II<V^MQa*0b;Ue{Mq z)&d>ZxLS@?6t@1a2AED-a-+H&W;dg{4=;cu(hmZlBfR#Qu1H}=lC`#vR36Z6xG~xb z^jenzp|^C1_JZk#VZ0V5A^;1QfqF1M&HxTh_p~@*;tckn=L~-Uiv|@y=|}B=_OGjW z;gcf=4(va;f4`&_mPAI1;lUd~CYOHl^SiIj*|BBm@1{I?=k$A@TmSKrU16IR&Odtn zqd(4i^j~XVo3{!;_l_-@-!?o=_Unmxc?vUqzk-8g44ORx7Qa~K*BsOEgn^kL)bP@> z77+*d;6fxSkq|<nR1iNLlSn0?`y?`BRK>uopN44xWFsiNZ~+k-k|L)G(o!l#Uh-&z z^qTMgy}<Xuqz@Ory~V7I#bAsviZ_l-Dqpu@(O>`m@{7+u@t3;-#s@yU;)B(p=P%9u z%j-+$J~CzcpO(MzIAL}SNWa+>BVdC0&x_38nAyxxM$16^#1t|@1pf(RUSjfb4u>}8 z22+Cc8m5;SWbR{T@}KRDhskDg7zuNUDL}q3CXZ1u%b2H_vrLg-JU+opmtYq274sfG zOPQ~kCz;3j<2TGbj2-XN<M|rKOdr9Wf`<hU2__4IP==V%F+#k%hWU~CJ^%TN`I1@7 zR0<{v?ibu6xC>@&E0}MXbxa)NMUCu?n_-y)jEIpjZMYs`+L=mbC9|E0XA+qt9EX@S z%(qMhpjeKYe2Zfj6UrC`cL-*owAsjajmZ&=!}%S8*@79&NoGBBol!7gviPiHzF^J> zrsB=B1oz?YR$L!uEO=8p(}SyznN_IGmw4kd%==8e;9it-zu-aUAoBwg&iK$mH}H9! zc>yUtyk#8I&kW-Y>zI7OgM!~NR$TpnG7|+enR=!hW!5vVG0!ne7&+s_T?I;B4D4hx zxhQ8d^AocgZ(D}X-<ju`kC=;sX@Y5tix~o3@8G@@t)dkKpiQ1;9%l9kg7E=9n7PbD zsBI}z47><{;dQ9@0_GLwO|;5#CPi>B;2A`|&zXgQFPgESruD$iC(NhJK9uT0TUeP7 zaJ7Qj4_H1#2`5mKFH!eLP|knxIRjkiP-6w?;1NKO$8-XsVzk!JxO<4{Mmx?D+|6u5 zi$yW(QOgdL%K_6%nN29aoKfQQ9iaM%nUBv3rW*CQlNrEokYF++LcPtvDg4_3Zv)y2 zdLRaCYoI3;X!HzonV`Vo!mksbUgT0CM+@$1ahOpT3+h+TXmBWyg3v-togffTv@w0i zpTisj^(m068`y*I6!2wdy6{FVlf^&T3kviyNvKOFf8B%fHON7&W!s&;JKd1Jo7>G9 zaL_Npfcsp-AkuKI3>#*pcoAB>8;3h5AUg*^#+ht84sVVi8-Ko>plphQ?aC1(b#`$s zF2LE=G}0W<(&>w!$Hj$SEXg#>1FfHOCLaQF{UWVCc)X(GVWMjKuab@2HchATLP zAaCuXTLMQrmX=&LEK#)8yATRz$Ue+Xwfi^(7UjHs919a@gfsVbx6+QS><D&m_1Rh> zrv~=7b@U>V^9b?=a&0!3gB$1VMM#-W9XH+9iv<~Sa^!kg*O1SH!VoVKVV|+x0RzKV z1hlR1;YM1!+r6!U?H#RH{6QEyN2f18Es3I_H)B`E-#FovQ5hcJ3|A|AuGTZiazmUJ zQJXRMJ1evAwqw(vm|?fAO60);%WrEhl)z%ETZc%_oZaml;oJiTA423{d1;nA{z@9z zx_A-r2D|y{qt5COGsiQisB*I0eZsK#MyHcwS=e`T1D)|B+|@Hx(3v5G&WN{;`+a@; zkhia`skPH?Xl@^Hw{-S(wbk{u)H}NCJNg?syUp0nwU3)#-)Gmf<VqWDw%YnCNt+7s zI^5hQM<=V;bhe?Unp58pZY><(0G0hL0`?Sz+b*5bq+Ae}pDaIG6jg{NqYIJJA2m_Y z%?Hm5)zZrJQ;0vS4>7BcU&}vY3Qg9A$V1PYPnF0ELx=K@Vd+J86<XXAB~jN+XL8hs z5tzEt6CK`uIZd+nDq;!Wf7Z@*94;sms;`E~MCXhlA^NMQt3}6KPKjGDT=CifSLeWR zeUq`Fp~tKrMr`iRI!jw)LtS(4P`#<PrnRXNigJQ$z-IMjWnU@HyOEW8vacEO7YQy% zMd1qDSF2NYC=?sErE`vYM9J`|CHavF+M2|amcoNqgr$z`I0tq!x_BWrTvwTWqdB5n zmb51h!C`d~9hJ&rk)q^KZl$)qLYJ5YW1vXQo@m5c)<kioWy1V}c@d`yg^Gd!V^#g` zRN-Y#E-q=|ocEuybGCx|)ElJ<4as3{ce1V|CNZY!h%GfY{ZP8k#@%7-^Ekb3);-+q za3Rh&>kafERw-Q2d|notynA{216XY)x9ECCS}b;ZtZZpObX$PsM%>~vV)JKlnLD~< z5t)}b2N7Y|xr#HPdEw`+H%=E;U1}_<D8As}d?KTwu;yZPYuF{ZLZe8F$Bs>nXETeN zq?Sl?B%o?NblD_vSDMZ#i=%-`Z``FwrMf$!#1bwx)kz)oGSAi2!RTaptsJ2o?~{Zj z$~2Cs{mRm=O37J?utAv;mU!h<b>8L1$Re0$HuPgo<?~7jB@O*tV|`<5OEcn+HMKR> zVa0;uHaVMHTiY5fZEe}&*65Qp(WgbZr3Gyb`nJ|Cqq)si+gw}Uo`15U!_?4RYiVe2 zZEfl3Z0WFK3u#M7OKV%Rp}DQK&1P+GZE34(tFv}=)ugp_cXW0(+j=_9t(~yFH#T*4 z^fcIdYz>{A9i1H=U9Hxxw%T@Y=Y73aOIv4mQzMc)yRFT*-Co}fKZLs0-iErm&H!EW zkY^B{6NAiv2{wwp!T!NXL#Dc}&c^!shK72!A+WxoZGgZK^tQ0}8JHB=eUK1=6VC1P zcwr6$!OF=%Qy*;a=yXGB_Cbmy%blCTwbMVbAVu9sJ#5o$-nu`Modt|5YU{`Z1HZNW zA3{6e+<yy3?!j~y32Yq}jB0J}ItGsh@i~39u-CwW)ucLS?Ih&Fx3&&-_S6fg-Yorj z8hrH(Qf4*q(9kbIMIZX-&)Ej99)1A)F^<1&V{17ZS4YP<8>*vj2eo4Bj-G68yj|bh z-{05Q>+4~9*`9#jp5EcHvmV6O?cs3E_D<;O?cu+@o*qH(0Namv@whd90I36meZ8)p z@x48Lbk*zY5A5ykMGDjF>|wg;-`5k=-P6<E>&3Ole~yPaT#evx<2(R``+5Z`gTG?k zsMs)=H;Tgo6ZWI(9~waLB7q0ap#j|uKoCxS+;~_5!)wUPN&%Xn!FcoGNyCj!quExE zJ%Kou4Zy*ods0ro%?db-5CL?D{|&?$=VKYpO*wJKaraUZ%Xt%i+Fk)0eQrp-&BG<H z*;dCnz1&PB49j=nWzLulM-N}+Xzxm}ca$7RWr7D_=<(u|SOB&SK^hhBW2ew<`p^$f z1#|;{wqI&KVYtDrGY{2c+QW|Hv!RSh{zvF(9CStHP(kDUcj%>b%S$EWcnlC;C>T7x zuI}i5>1S)RzG>kaeh3TEMGH54T6<<k;peNx$Z=fUv0S+u@cO9Y^gO|jxaEKbMUTD$ z@8=s3Q2C)i^YOQE<Mz5w9&Q{_x3y{;{e>~eH<9w<62Cq+h`*rr<(r&kQG5RG&2%(~ zi~SuJR%LwWaMaJ7W=q_*9|kz>GRNx5UGZmjod1ebZoha2c5Ela-2SE2^c<DVV{^0# zg8gs9onU`0aYh)x7qdXZ2Dls5hG6B9a7*jY7;YR^8WeKdSjoskD4cM!C@O~YV+IBm zqs2J<kkCD<%mcC2{Xb)e<P-9<H!dfCcjU$i?(p(snK>u&4jm{8%e;iDMap5%022*h zjLN3h`Hu;>plgnAY_Ff9+(fd}+Wxom%|=&5W4EJV{BS+n)z;oI>_O#N|I-MY%|Gb5 zN!|=mBBjxnKO^ENXb89mFm&0QyzW-F8$k_Q8?lputJ?*S6&TCFE7b!EgzE~2m-~yL zh9vSMQYH#vaZqJl{JFoCC>3-|u<=h3f&D`EUT(a{=_IFD+NaU$c42eGv=UDnIxOVZ zVH>&{PlFH-{Uwa!3*pP7Q+#~XM1*Jm`}mGHMsaSwL;APJp)Axn;h{rhK<M&!H2gu) z;4jzfXA!thrFq7hkpSg81OMXNs(<jMc?%cLduiVY7ZA1*@z;XAr@r3u!%_)G<Ld+h zVl+_WQvH1X4ov6%FBin$p}tE^$5W=icD|cE<YwJaUwG`$gOuHa%Kbv{^fa)88-zyG zcC>uJK}78Dz4VyBzYy{9O~5yn|J4{3ZgvM?r6l6wzh91yC;?V>zKj562R1?UD1NmT zBH1}77cg9pf^S7D_E5oVM$6-A)?W(`JI!BVzHWRCN7)-yhhQEf8=g1t=1n}cQoZeC z1rk*LgPs{9YdBG{ci;y9@wdw_bqL^Yf`g!HUwp!Hcb9J3g`EQ2i5m`CxczTcZa&z+ znHOSeG5$hPlP&FJw-hm}42@RpwXKJHIaZ7aY!PSEw(o8BaubJbs4ZWK(T+*g!$5*m z9t-#%r9?_XFZu<4h%3cX-{zmkkNqapL{<FA!#_(8qT$9k8fH8Ml8>Gp1&~hs+>1IL z5h&l!>A_o|h4=5^yuhcQo_XifPyb=ktlv!f)6@4(o;`EYWA{(Ed-jy+fB*fx?x!Dk zXxi*YADi*lr~mewKR$5BBah$r)T)=B`sBSYm%Tju&BZVLd4+G4VA;pbs{+<sxZn*7 zxDXb`USPu*{Bj7O%7slw3je)uAq-y}?y!Iue;5IH*|X$j4<|0TDoo`6=^Ux>V31Cx zQ~y_H_K!Y1R2cE7iNN4*0TxiA&rkxjA8z}2W<}!^8s{c{!BASCJ;Ln9T$-8D{&dh2 zk3Ib~Oc!}M2Ltjabj!jp5BQU4pX>i0NnY+XuT1ja1u|LG-(Ps)*(<UmkH7fDXQFkl zNn{tFOp%p;`RSJL=3S5-UMG`DzI|`UhEFbTIWCjszJB57XBRK}*U4pHgoT}ZVXrSN zFysI=-&8c1zsdNfV=wrS$ebKlWn0C3Qu8$PN5idE1jTlD!Lp=1Iu3HrWOHZ%%^F$G z*#_9hOHW)xr1lX^R_|qF4p_Yo_)&A-UPK5!7K%Ls(NWoM56Bvw)ZcOhIDgz^X*UUn z?hs!bqh`wC=XTWgJXR=!|G<_=KmlF4f9d=@V*H($@aOT5{5Zq+7rBbK0Vd~cH!BSQ zak!*GJQc7YiE*;bWSLA&6%_PA{tHBB<6kmXXTD!hdH&Ii-a^dW&;PLl1Xar~;f?Y; z+~jlkM+5@Lhdw!091V~(N_lT%B?JLAhMy4m3*t3&P%=qI)HYM;6glbh3k8zUYU9)J z9)G!`;}BJw!LtNA?%c`<s05zR(}Q$#lzS4xq&N7#cpDTK$m(S$``^H)<MwZ;0Q!#Q z<<F4fAF2GDb>>(O%Ibe|tlwY`5IjmE{(`8djb-xlGk-IVN)yxlw<(9eEaV2m@;^(w z&^-nLHJFc^F;*O3sy`bq7t-VO^&<sP`wOALfSBo6c7AZg6_F0L>L_MLh0@zNK=$Z} z1PY?Us7TbtM}i=g&X@lSzr+oyuAdGF#ds^9k%mxS;u<Xkn<gWjSUrm6<#oE@CkkFt z@L$^TM<5fS4f)%Ee`c(qLDK>J0OEg=-gT2k=*={&k5&?H!zkY`jq$a@ZOZFUA(<Z! zQ(gQt?<a67mPZ7YOg)28PfyV`KZ^J-D3R((-3N4x^U)VmeW;cF1rs1+Ri}9(-yM<F zU$dKZJ@z7M5PBii%%8<SVxeplI68>YYe!kUkL2Fbw-X%v6<-rSkjO?wx$y9mn;9v; zf1*Q=QkV2&5FCLoiz-8XnrLRM?r3(1UmgHU0^nFanxWB<4F1SJi&O0D%{K(yf+CYD zKAMTjrUK{=rFl8(1a$wGU()K)eSbc{>wld7p@Ks)<;IRSzsOg;pa+MI^<WDda4-B% zBi#{B@!|ieKo)zMv%U$G0f}@cfWOP)Dayt1{~!RIJNWbQd^%qO;P6fH7e@~x3q8jA zX3)7mVYFPjAONUvpomgg)<u^nf^G!itj<3<@3)D%p*raAp3+WEvIr4Gv1Sl;#x0sU zdX0Sm=))r5F^e0FXaau&dje4GUvUuSM|2uad>@|?F$4K0kccl|8crz3Wcrg)G7eVc zLsB4R_M%KyeD~<nqxVN2#SMY~J)DTaBODG^gt!K*c>L%CC?*JRDrg{uK|p_F|4?5* ze_y}1kLkz8n*9NN{r%29w%^`2uD{RL(}z>8FAy1UHwe0tuI83OroMmBJIFM&4GOwi zS_cIK4ZS#Pt{n_O7#QzhAL6JC4+>g)=?#LuUJ<rn_Vh!CZEN8eV?QQOjIj;di#FlX zgk9<e8g-lvf4qkiS{HLv4<=s%)`eUwl#3HU_hd+1i>MGBhIM{Q!EZ?F_CZddelpGi z5<`d}zw&$Z3VVX|H-jkM1K4tjDBc2M#Ga=8O?6z5@VgajTQRNY?(~+YW@q)FKM<KZ zrDf7O=tkgBjVko<b(+}M!{v*zs$@H{?R0=e7J|80f~xisq%H@nFak!lwjsTLBQ)Pr z(%U%YagM8Vacx^ip!iSB1`i%?;PSRzbfT_DI;eZ?gh(^a%6cN#oI;IL;}JOD%DN-g zobKi(^fz;H7r7(i<Uww7?vIidj<s@@knhA;7Z_-+<0kz4+}lhp;PBq(!4{8oamW7h z{tXVQSd8xd5mD+YmTPGoOhw%9(aLY{>*h*AR&0$vw(ewiRET^|d{Npy%whJPjNGK( zcs1*-WHGkaop-I{$T~~@cV9^NWL({9N@}>YWD5^P((6T*!yEONx5Y*$=j^a>0Oj~j zOVtjg`sbSBt-8%WovPh=zW2;#{jTy7j<a%wUkx~nTcUbG_O!<Ax)LArU&(d}r5AiP z=qTM;5wXdXWKNVG+0_!iNt1W*yqD{5;r7j|eX=mUZP&G;UHJzOcApRTME@jNyJPP% zJ05f^-p{_?oEyEnxOm&y`ZHl3&fg4kk3FBtMV&r7_0+j;&UD#2CpMF;${{NbM5bCx zSuSIB;WO{w)(k`MZT#SDbodYD;h#u0y17&9VBL9S-R7-3l-sWF?7?((%bMj?Kb;8q zS-JN5X6ZJ`&i%<d%C-~Td4Blr=d6>L4{ngGITyKPV-hvP*_Ac<-=5f{cYm@zc3ah& zrIly4h7|1G^da=_7B1lcm$|9>(Dw8Bo7a|oeLb4{?%fNN9)Ez#J{ls~F50<MzB~F- z_|_dY+xA^q0pp%#E@AVh%Q6myoZ@!HUc7oO{NO(MM)meH1?f?o56!Sv=32VDU|saO zA0?m3LO$ri6QG8Z4?p#A1vibsa@?#sPPg#D+$+ggav4F_8%#?RS0M__{C~Yua9cBQ z%M&&fN9XUjwDiN=)he#&y=+iJk#cABmhIAS6RJ4PaqH&&*RGvEu;J^(YkgaG#vd;E z`m3#2CGo*fY2A^vKcuhTv+Gj)jvdw9kd-?T!~M8)^V!{&eVfZS?fdcaj@>u@AGY2D zK9Az)AAjTyn39AS0t6Bu1zf;@8!ZXROJ34L2_+Qc2JW`pB+HUzHA`}l)n!|<dhfkI z>b>`_N7B=K)g$St`~U9UBiZEl|L8g0-QM2q&g|^W?Ck99IrmI|zpHjKVxK*E?fZCd zw@O#9JfEZA=caue>|Bd<GJEpsv7mazS(ntC$1Y@^IbY`ClN8*1R7TXZB(?lzSXLnS zVEN7d-gC~iDeu)@c8iT}Y(Bk!DZTtZ+!Eb5ulKHT4RQS{ecxBuyK@$3nD1=qN9Utx zcuGU~|NQfx&(>fd4gO7RTD1x@PV?!N;*}2Vp}`cIc1df|FDMsy<7!Ob&5WP}sf{MJ zyhurS(<(BLFho+leqP%vo!1drAJNzZeV9V%GV7LzF6Y{W`Fx9EesQ5&N-$@qH4yn2 z-`u0N^oW)Hax#F(Ktn`h#k_`&5KW7K42a3>Fe%!5%ee5dr3c%S(ezfK&PXIZL_a9c z4dxMLuU(7jIXWk%w-TK}O(w9Im`se3VLa@_E|r!Eq!aB#uO_^Ys2A0(-+LP;c?M#h z$A+SS9`au>!k@9qmig)Xx-qOz*DfejA_=xs5lKaSl}?B?kRqXMf+rKr8x;z%S}c`f zK0>#o5{dX~jX;7439&#pI3pGb#G`{U>{Tx&qSxhOtdhip2wx(TisT}ZTq2Q61ac`~ zDi?@_*rG$k=Zoc1p$u`V<bsC0S&`^dA%a%%MFONt@S+srLoOK@m13R`Gaz(V4-p@; zD=1tblZu4`nT-A<__$Cg6A187F6XymjiylCojE3w$!ORm__W&)*2jsS)=&?3fd!F% zY>vZDqy7LD8;~wVXd|IuiN6jZf@nTF!UV12k28|#CmID}(IlL$h@(^j>43IvvXGzH z6k?k(+NYa4e>2xY5Rg9MGL}9()YXTnIP6htvrR2RQNRTh&R(jp*;Ke4g2Dh1g8P1| z3UcObPHIMYyaWDAZX9l@`AibsXv?fyOzatK;)e*k6Bme5LOic@j+R#bU;3ArlDq2O zG2Sg3Y3maN|5Z`i1h#3aBYt$1I6OvH&p~kA`{LeSvhWrE!XMgR&uQ4&P#AF_MgGZ= z1)`8xzf>59-0Q#Z`3yAnEzdN5rY$fv%j52Ww68zolS%fATKdIDfA~e;)19qfrT_2m z`dwe0+4r}Ups&mIIZu=mg_vBp6X5CA<6+(_reY)Xl8c{TT*BFe&lCO=sbs!*2b1O4 z#TP?%%@SF&BvY$a3ScEDg9LM=S6%Hy(4D56MH4q`r$>i<rjmnH1QX=?+rdN4@>Y@q z<J7|48{>`Pox{_8*K>{eae5*!*O6%Q#FB5o1U5uW$y_8B4d%@4rYUYll5`mmwj9Vj zKbm>rSe7BCC!_G}rJ+ml;!DXDXA%lZjvcpiR&gH2#H2$sGP&=N|IuF#@~sHUEK1Ib z2~NI35|bvbXQ$txU;Y_TwESfi^X0`v&*IR-aW$v?#xu_Lc_idD2@`8wPtY$vPQT1H z5wsYZ`!Ty#N8nP5*>HksH*Aap<z;b#e)-uI<TJHED^JqoU#=8LG=8-02WaY6r0SWr zU#0JWM-x`z4GdVZjg5`nK5&q3J@_Ef5bTovkd8g)=)Qz@M>gBQdgc)x+Xmo;3<q;I z%R2fNe%R2!@h$qu&g7w4@ep@p@G&MATLN1Q-Ry7`QfVFNyJYaEY~f4|nC$e!h_^z+ zXwrZroK6iBy@Mby)jHNJhM<(3bOvx5vt$Xj5W-~Pbeg-?z)aQ#Eet!j>nCftTzfU) zK2Xi&R#!7WE5c$B9Cq$%nrP>)Lb}b7Na!8jScR+>q^)6Iv2!`qCLDIIt$H;V+3AI4 z`F)!HC{11d;Tq5FT&HS$=|Or&AK^d!;!3d(v1xc#!84e29K9Kb9S6Nu=vM1>x>gF| z<|W)Kb*r=jrX?RR43;3sG7SI^k2|>D;bg}GM4TR?sr1LX<5BOthiL}-`>!`>`f^TO zz)26Q8119hG1KTO+#~cY{A_HatMKa5D0bhp<Ka)1Kjb(wAE0lNu?K0P^pp6b)mb+> z$?cn`TQ3ozQNRI@CqlD;Q_2vf6$y46YQY-5$g!FF!-jzdom`<;DikWrVA`<(i(LUu zXjNb(6b`Fml~N(MD4v%q)M|xNqg1F=3Z<H6S1MHsxg2w$O1V;v2y_<3dX+|vxl^su zrdUlc?TR%jr9!PTE7su!xl*AtE7r;tG+docv0jOgNc3A)g%kb9Q5zILq939kmn&3i zg{Eh4PTUDUBU=020`=-KExQ2VF~dNeT3MK(kSRsIQxjsD)F#^?pXAG>GHgO-lR2q0 zR@n#ihEB&z2B*}r5rsk`R7gjZQW@s+A+zK&lanF^e;iZtGAS}DWPKCUbNqU-Mk<xd z`$zGncwDNOo&sP}BI8KyGAB9yaimsUXzj9}%K44F#&Lykj85yz_+tvZC>@1IfKB#O zS~hM4<1+b}5Rc`&X}PLvP-yBz=nD!CHuqf3*RbHc%z!ia#|r(>>9dg@{YsTss+LIo zt2GD(FBhm}GF4B7T&lz+yl&<1i&R5?2O94lxGOlBt-Wy|RinO9-*9zaFrR)ib9g@Q ztc(x*$tCi+ODBW#n?ueNv@7LezZ1T5N;yAPVz?eQFH}mU*fd;*73MP4`y#mvD3?i5 z)>Hw2*9M)B*xRNbj8!8{j;8!FqNIpLcV-k4g_6P|ofE6HB^R{f(=AG=S{o6r1!RJS z`yrdtu%SIY3<LFQeef@R?EY64gr|-KwVw=ZJCzi0CswKu_#Vj)X}lHo2~W-QJenU` z7ngUiL@k;>8S316KoA@|ezf5`sn*T?l3VeSn@Qo(9sXatH=a!NYmS+mPdld5r|0bp zICWg1FWj%zXBOP95AVA0$(^Lb`C92LC_x^6+OPWkW8tyozJ*zO-ig}<?<FVYW*_i7 zb4sZ0iAg`$rqXctI_KUz!HsTkJ6?A8jO(mYbo*4d|2J->CqBt@_vpCrNu*BIHNZet zN!#oXXtO!(J;*egq%%1tuMna*oqgJO&oz%268LV8L0jY8cG#uta$%reS8%cB@WrCQ z$m?pEJo@&;vC(~!^rTVef&C)wMNiN3r#dhAMS3P(tU8x_)FtlINR2+hMH}Ih>(>;W zqSxgd*WL0@zFgvVD=Io*pG%}(o)cK3R-8>fe)9eOei>i<XD`<<>*CXVxh^0o%fBHu zUZ-kuDcPH?)|7je9Qf!$f@|*iP>-WkUrcHy0=@}%sl4D;dfDYupMc=FU_i#USuus| zuPkKDI*hZRMvY89D_6CjxEy<>(Y^FUMA5O#kVw}l)%5w3DOdIdG#wk)jyj*ryu3Fe zK3A*i{pdnN*ntR<^N~USgRvU5cSY5e#AE&`F@fB3d$0H%Jl+4dezju4_1vl8;^5Y7 zS8USle(p&6;k|Xf+@oJ6hM&n-%k0v%GI>CyYs&kF?u>kswojtu-Q3f1DDUJq<ssMs zU88EdQga|stEt~}I?dCq%(pl+DKu>VKZV+^{rhe@@9~Y<|8@4!(7Xd*#IcaUjAx9x zI0OqAW@T4dmkMD#OZS~6mh6~0Y>GVGT{uQ~xy@5p9?N0?_AvMh(PK5wqrhfCQ{PX- z;4A2cvt5%S312laD4RsLo)gKG{6QsuOdy*S$dog~%DGXINDPj{8|KUUW#Wl(k+>h+ z0Uk&K#ehI663AvoM1nCvb%<IfQ;NHJBC${+8J9|xlAcNV7!S(%__$OyFpa{%lcYkt z_x|{hR3sD1q>{lI<rIH<5~?-&rA#869-?`sMirvI8R*|4S@HMRm2%nC#N6z#P&PcR zm>!T$jEQATQ`^ZKZhk%d_9*!UKa4d~xrB&6C@qwf-<FME^d;H@hkd%GJ^h^?E%p0d zYe%~>dR4JSdf?_M&R+>HVd8K^XRMM}eDmYsG2V1{VwIx)FCdo{Bt3|p4$eudEw?Fu zrjRKRSP9BJ1q4hTG6Eb{Dpe?D3MDv?^lvh79B{Yg6U8r$VTv?lf`m}=;8g_{3h6^X zg3R<9jEeeL;h&OW_Ov*eT>2=UC~!tTT;Of+X|Q1;-$%2dNcsV$fXPlUX(YgJi++R2 zuarp{6cJ+mLS}3}9v5&CV}EtP-xNgkQJs6)L64jBXQzpN-)EU;I^A*;f)Y*#`vjLC z@jT^z>(jn0ilR@*^^a#xW;OgPDfB|-f!2VGgaeVE>67m=bmU+eYbZ06*`&Wz%rBIr zg$<|_JbCE!ykcG_gQHnPC1On*)Jmfok^}X_h*0VzgTR3!C_QncCfO=Hf&`F0D5vOP zkj>n0pwfo^F?R$x)-d;02rfI5X2;pW2r-+KBeP2J27O&YJKieCdp6ncnNKo255ubq zA%3S_lKn#??WFXR_lJn}>uTpxm%xbebd1FhdL2FMb29Uef7AhQw}1lY&i$_8e;7@% zbAHPC59$5zZeYUU4}F5`WqbRM9*8@U`K2-v`ZTCT&hVHuhQWFbivG2-JE$Th=t7r9 z{7uk#&(yhyG?_khPd>La==P2JuB*)|seEKiBDc%dvhdktYiJ#%<`rDnnJXJ$GXri4 z3))?}z`THW=*?;htX;a1p6J2+x62-6pk?nUwkh707#ytyJ%I0{%NV1B=Q@IwGg&qw zNlTa{q@b#^;`7@&F``3R3nF;EkxjhOZgJ*~uKw9pX=C^PKPwzK=)BDz$SO&#=@VPy zW(&f3d;RK3(>%q2gB)IE$N|NxS}vSQ4!_i`QJgP5>womtzJ0@nlz{kTSO2|N{m<<6 z)yXw+Uj->Z5wtx)1E3)r;IYfr0~Q7dJ03j5T(S4iQ5YIv5J0Jh;%Awfr1*{lC6qi^ z-DVw&7Ti-ZvB@5zUvqq(#fBVCYeQ19X6{y(9WXj^{-Y(F2ID<|R#O&Wmu{6A0>1n< zG}yIEt@FI&R(~*dZ}7CP<V;ljrE0elA5Z7B#Bp85=>+siT80(SP|R~s^pebpR&FgG zplsWHHMXNl6ne5k;q;mw6f*nDGkVRYgA(vX`jnEulPoZ*ZU{Y0)bxyW!Fs41oe_)? zP7DQRKO+HI>fA~7F<LoAe?d`Of5)6$(N)?p)hMdS<|}9N+eSJj+Q)ilGOHVB<N}F` z!8@%o?PLs+X$@Gc+tF(s{g|yfB~U9WMH|SG|6z)H24V*1Hnzt@i=`;oKr7Bvp5X)( zCOeWXvZtjEU<?VLcuvmB>dyqn!uM}cXCLR!BHjZ9>hOIE%WIU}m~vDGJsc<HQmI;} zQE25lgB;uNXuza3P`wRWjRGnlZ5wnbiafT%S!u1L3~?;56=dmTrQ4xm92xrtZ77Co zv2DYs&a~pojD|8Z3cFplfmVp&y*BdLg_)7h{!?%%68_tv)j=iODt`cmLm00!4AiK^ z5{XUhBoUh>YsC_H_ex;xl5oU!92UtMBuSWSn`9NPOiZd>ybj6qi4FIds1PsUY{uDw zvz5uSp3OkN`zUisv(tA_hF!7_H}sO0Vnc~*C5n!I0eo?ObaE!`-JoRG5a9n(%%PD( zhs|^MH-Mw&>-Cc*RTY&L74}LF4tvEaTrX6vuBfc6urf(b6-c#LK1egs9}Y|923+C~ zKYPVP^pd&8f0~uxO?uD|u3vtD&zLKS;~59}2wMpAW#&^fr@e9wJ>k3xXFEQ!x?pyW zf)g{RKI2^*TTnqr{>K-GoIPO_<y@uobehtW1Dw@5gmGJ%UJXZKo}F<8=J2#QTW~Dm zuua>MzKS=^GvUsRV;+YEsjJ{EOy96hTc-(+;ELwg;Sf)+nVQhd(4mAsEzk8n`dy`) z5?ry?T30JXvp>w>sL(3ir1%P{C9Boq|H|NCxGNb{;@L$Magi3`iz1fCVJL$6!WxyB zr$SUI1V6!nz=$+>)`HoHP(+S2EV5><If!$x!HAduG|yQ()`)o{s}bw6ZU6PQ-MD)4 zzv{78EmR;tw0-VD{@ffNTdUENaSnSXI}Y32!$@8J<If$T1-LNzY<vroiSReF?;*}F z&v<V?1x%tXV2VyQi`g@?jYeJ6TNPy0a4B|l=GdL|R!p_c(*Rt?X*;rD#RiSlh`l`I zGqZClcx~I^k!{7Ho8=s4ie;R(4M^F@`f$(45L0w{UF#Gk=GJum_T#@+V+9O6A!iYU zq2%K~z4vh{>}SFMHjuT8E`Rw`7@~r0aQ@dKIqWQQo>h`Hz0ZF*A%NG|mH&G`1aZz5 zoWAK@f+ZH=_H17?8UHC93JgzyfNJ;yy!)!ZBGKoFe+NGJ)padduNEvBmwI_3J68PA zVDcOqMV@bhwOGKn;L0di%b1YAwsTf<d<1-0L6B=b4L46M%ha&EZmw%_;RnH~UY~p1 zMKUbxb9NCfM&CU=9sFEI;ZLsGiuQ$JHd8V3{qIMF$%o^t!T-{RElMwVYAm;oR>1@B z?61Z;{wHBD*3%naFE9Qtr(VMOqbyLS_uk)8660e{J&;MH{zpcvar;tjhaS$q{A4~H z1wM1j-B=QPxm9@DRcwF5YewaHN<m8Ygx5dr0ulA8Pb;S^*sGxY^7DnwZ$w<g{KxPw z1%LUO@=t<_?{dl4|8`Bb8R)iR2xC4tuM%O^!XkW9saq=jnJ|%Wa>AA?SdC`EfptAd z;(TZ4tmlNXxo9%YWm;NqTI|P)<K-w_bQ%6r$(t?2Xc;Q_{W;^42j96^yt%uIQ(FFf z)(&?Yc_H8nVy}*VW-{h~58W~CJhk;q5hr#8V)a#Uz~lc;`tkXVWx&I?+m0o@{Q1<5 zi7)?@JNn7i+gCSdy_gcXwn%zsOV)1^uRq=4^$;QxZQT3!Z-1Y^@w=v%1JAvo-SueQ zXaD-@uhmb-)U<P=U`mX8%lo<Wd-@JtN!~WtvF_rt@t9EF;q}K~haRtZ;ffRQ$S&{I zEtA#NJ&V}koWEo=4Qj>)h9<_e2n<I<#L<pxU+K7P&^RoiSV<uZ=*kD}oQF9fY%ga! zGuwNy8k>G$9>}?m(t(`vCxqnN%#g3&bz9oZ_dLt{fK0Bj2ER)J{{-ateM*%7JoU4= z<i{VLv~a#U8mB$>y8t_}zH^?CzaNeLH+eeNPG0yn?ulJ7pG@uU`b{1o|BNCZd_s2Z zpZoH);^TYB-ZNG2l7we%WaGDg&e2!Ajb;88tg+nqc+u{+&s=bS52Uze3PJoQ9^aPq z<F~B)1A6{N>bH@9g(G~znGNoTA4rK@@9_<P&kgcGW_94ToJG1tIzj;tYDT;G{2>ip zT5Y5u<$#C>8Ro@8Z85H)2m|**@C*hmk8^@4XJgRFUeLEJ#tjR``GNbeLf5rFwfN^> z-+4Z9*WdoNb@KV~Q%A)QhtE1i)joY=TL`e?{uk22@qZ*N`~#0CC%)Q|Sko2%;a@Np zlk;Qm)6evW{FOWy4U+jg_w(~<f1G@I{LHUIJO6%zB)%N<>zvx;A6?A)#m$$>GB%Ms z7z4@1k9-kCaGS~S_Tg{-w)Bff>rcHLpV;`s`DFQnE{Hp5f9YK<=LGru(!_>T?pE?{ z5LU)jb82sKM14<Ph?V{49gpWG4A`s<48$~~9T*bz_p0fVdk26NT*S3m2G?jpv<W;! zm@ngJbk-n_#<pROCw_<*8ekEt@0PpKBzWSJmfPMT!jYibThsaa&Q_8gV=Im(oq-uv z@_27Gv85*#<qUJl?M@PPwQ25p@GKmr+kCG~li_NT3=fGHxo}jNsx;*5t+%fBHx3a} z8Bj|)u0?A}WncxF!VG#0<t264Pfbv0CW>pJ;_-)9aY-6hdNd;nMNK%|!5-x{k(3eA z&_j~aM8%|R7!1~sJU<t2BmIFv>Xx*CE<Je|ti-r9sO{@UsA@IVXH(h6!NPnqqALP= zdI?cTI~08YR5)?sXbv0gLZBp?g<@ufHkgqf6}kb$sp*eShjjHQL_qnKPRg5|5zONy z8lKVu%z~!SIhoH}@D*U(_^G1=Duc-iWuh!RN9)jDc^}I{8TR>F@(=^XfR15tG&Uq7 zz42vC>Y&rx7_w(>Sm91Px&s!Q@u6i(r}e<9DcU)f3t}g801PH-=gr_kWR*#8Zz8`^ z@lD310UfY{x0XMEJNl#lm<xsnVYvX#6h)j5C?VydI<yuHxD>?<ouSI}1B)P|l@c*U zY;rs1FN2)^OD61EF~^S7V7066&=iCv)~2rOIyyl*j?2ag2Mc~yO`I3OiHoes`_}Hk z#q6Gy7?1FV$a)n;{eTXPkrqmI8HNSW+XwE|7QwC<D41XjXdWjc>bjPbOQEx&mFT-P z1}BJtR`UlzOrFp_6aC@|d2q6xjD-{tO%%2%El&6m><54U)8R`$>uSs8E!<8ci@qXz za=e`kUn}d_5epul%yA{3b4CVkVDhr5BGon*nz}%GZ`F;Hp_`+mr!9TBDc4Mj!xrqF zor&s_t+3@i<je^q^2V|pyQ(Yq*$k5O2Xd#M6kea2xsh$F|9#5hHPzzX+Y6+*{kCA5 zJmw%fM<bzK?8dch`&e1J14LA3qp?Ks0I&k;2hl>zHLyb;5#ytdTgZg_n}`a`Cv-2L z{B=iH_~zrfm%gty{$bzlirX)HKNthpKRR>%)ubQ&U-ci3ezaHj^uXSa{^r*H!r9~^ zP5@v}dvW*F_FoKCMgFFy?MGidQ{EZ9J81ApudTiVn@;YQeZBd^N59-qdG(#WA1^-r zf16zHt^?jS&VC&FODp%s-#zKyzH!g9Pv6e{fc&+}YnxYlUBu6>)%`S5_4dTapMUj7 z_0~VVdUTp>K*O^X%C<bhFaj9bSIx$a%K$NF1fwu=-lyFz$4(m=x8?;a+x=;4qrcrp zluzh>6ZP9`)u&$l)OzSoULB7f{cGmVv*dZS_ER6dePufLP13=^$YWw-)z&}%=c{vn z!$yf~fv9cquK#=~`2FtSb3ZR_-L~-e^qf=M{R&?p&b}c}x%_eRKVjX^TVII&WZRK9 z<<CzBf7AauJcKsh+<NALlE&@i*zc;hlV^QC%=>`+Htm&6Lefvac*gW6gMM4lvqI^w zx^^^2{b!my$Ur=(qy3M<Y6Z1YKDB<C%n`kvrFoiQe2aF*YNo?eqCg7bec^03t_Mf| ze`);gJOB9Io)6!etMTEqZaYxjyLW3SC(2H~em|6u#J33l>AR<Q%OC3c)9#AelqWMf zW;jW3H;B3r@<iwMvQ@q>UaHwV|GSi5fBV7Ts~_`tDWKsex60=}46FH-`LTqv&lHzR zUl4hHHvUYGjcDG=?mqlp#f$knFE&42{Oo4G%y-E4{5|hgk8U~n?uYuHM<`$H-tHc- zN%&H0z{hB3MxX&|z>L-2#s?g2ixUl6$TC$xiPhUoa4ZV96Q_zMK<qQEjdi4W6@fVb zJ(XoYZ11Hr2Tsja90)zs>vlAO^d0!VM6uWHWD_8dsDmrUbt`H8_Q;%?(;+|eT_6em zHqaJ$)<{TW*3yjbiXimVO}B1;Q)qYofvCf?!DrrbCu!dvos6%a^s%06UGzEVqVd+1 zM%ynQGLp$)tQkI<_V_;6#fryHKYP;Lb(35hRe$$geeS{F!-lZKBJcVBZ}xW+uNiL4 zG?>0%nFmwhzz)<XEG!MLuyxwB6kM?Ud$5yxq8=^&Fhv@`r`pX5^i$$-vYPw*50o=x zjbh)w-)+b2e)WeKJk@=P@g`+1O#h;6gZWz?CDJoXNR(@$J(gR9&A{138=!WX<Dhh! z?MKMQ{;24o)VCr>$KjJbViLkZS*OK>_4=81@si%4#R69+^`eOwZSaOC8vcTQ-Y8gj zz+`~)i=7r}HQMLx#*Ofovgj=4B`gqLvY=BbtIEpDN?I%yI%m72<jh;h<I6qAfd;lJ zwq;cs$faS`C}W_q1Gf~JRA3l4(_vNz8=Dz1=GYf$U}jJocn8&s9K2&njIpQ9+y}=U z)x1uto|h<1LgBc1era)DW3Z41Y=$L7Loyl{=Rw34+t^IuaMkVcl8q6~tyqi>3k9~B z#Kx0|7D1lwP8lO5)Al?Gbp>roLQLPRY&jkFm@GD%&FZAITgi_c+@C=|tu{M$XCMKC zqb=lMa=1iwohUF)oDMt09qk#*aI!4K&<{R%Z=ekynm))G>TA7Pd&#A^pZvtGnJ-Vs zo$TqiOigr%)#JPcEl~SYt5UGob4NccSeV!A=2eReI_}Qd3;&8b{m#CzX>1{|C>d{% z5A>*2VugHCXvX>rO?k^y7;hk4N`Y(4_x<2nMbXrPWqxc*f(aFkS)sSe0pCMxqiIo5 z+A@^rDc57<IIdQtJZ&pGRnHihD3A|wI+&Me3hnufXlK~R4~07waL;g0k};1&<(1$e z|I>pxF0({@BG7NhwMKB^hJK8JIy<RnxNpeTHId&vnOCkdFi`6YPJHygs*X1PWP4|e z)U49Z{H;^|*_o5Ce^EJtRU&$EOQV!OQdU-4T~Rr1TC@<=KuLO3QBq_V19j5xj{G$* zuSttw;^X6p-afX7Ep;W1R)xOGDqbwPB8U|FH)VBDXn+d_PF9hzJ4o^++OpknOJ)=x zP$wl}dVtlVv#rD@V<4_^Ay>cgPu}a9=yCOC#^*&ucJR}V#*<e=>aJC=5ErD>4D~cC z+r~57hYN<#tV}!4oVhxtZfM7j_03JvCF{8I!$Q9!d&1w@bEOXu>y$#JMW@4*pIod^ z!U$t;$?TR?bcu^5D8w~4-@5iebewR}pcN^#(=${2d7U0xEMe^}+L>x_%k;RyI4q3p zT2Dcyf9&X%q1<Qf2xT))Q`z4NRvZ^bLqFy6D;x&R-2U;c+lP`nkB1c|Ctdk|-(4d1 zt8;ew?o7G+IUazvsSHEyogzVV_k?J6M9|-_)1uFAu&bp?1Ln9D7Wo5aduN?Tf!oK4 zCm#8tu);#Da*0$T5{so0*m5LmWmpGFBT7F_R|t)S{_&NMZ^ju+5_n~Z;PEIy>;|C% zo1(KkUCY!Q`+YD<C(CbWgV9E2_>O~aA>jb)8qPRcor*se2Q2@$L-4cG%mF8D+@~$V z@r5}ak&PKJmKF2WaP}e!)vVY)B^?Dd>$C_ls5d|k>fsx2oY!ekWxC>E(Mq}OqRujJ z27_2-pT{y%j%9v{10PVj>SBXYJ*~y&n(zrV(G?aD%MebKPAPw<y^Qja<zW-muoz1P zL#>ow0t_e47*$v(IWvt)+t0Q<ELefz3S`el*8am{$wAAoS*$ekGTDQxEpuv0J)9@0 z$}_{1KzltcjpEiZbh}URT_FmxQG6}lG61EU7;j(hQNcZb@g6O*9K}&2Gn&Ge93v-3 zHC9*<n&S})o%EhXhUQ&v)%6Q3HLmEGF!kvrh@UepAp?C@m_w#o7Z=+!_Axb??Xl;e zYQL0DeAZCA7kaeM^?~WSyV}0Y$}B;Da!C?j5HB9dtZ(~ry0FSj{^y=tTc&(kWrrfP zJop5jY0W6@;6PPZbEGthv5FuQO=c_u7<=BY8^LDYnqXBKwWeX%E=g-Uk(KkXEYv1% z?rG_&HrI{Jb6W;-h@8AQ>Z`Q7!|!ze9GP@U3BDBgo!@OYpFNi&Jq}#EeEIvDBSZhj zFrG1Png+EX7lcovHKi0!wKzH|wJtnDlN`MoS1eMQ@go($6r(m)wO=qA?pI(b;s1EC zAbX;28e3$SEy9pAKzKPy$dKlV8cUN|GCkKn-$XI{tI@xw>jpm=BP1}Owa_Ig#JAqN z{Kl2Wz_QSbE>+%b`&*CCg?t2OKSUj;b^~xF262?YsTgIe!P*a&yCb%5L>EQeZRBKe zy28RJ<@~=xj2HW>Ym2$9+?uf}bf~FDi@t6MYc%ZDjh33}O6zcsx@oABsjW0CP1>8# z3L9kRovGF&-H>EZIEH_MDOpPUh^$>#)}6~mZ(K)>gsANbjXHQHi!-Py3|gtNpOyUB zn3Y4-0}6t}o`@a`e)2=j43?V7MKU^6IVmsCglf{$pzUd1Y?5QInR>aZl5cHou?^QP z<e<wkH9*@^s%KPmhQk401ePXjo`*lCb#Y;4n4S&8Z>G6fu1C2D#TMP^g6gS17@sVX zRq`g71)Q|jSd_&Y$ssZ9ARNLBdGU2hL-%Z>^Z~0AP*i|&Fvox|GmXR;2bpr{7=jvI zm_fmcxS%WujC#5K>FW&lVcuWX1u5g92Sc><W9*><YS+;`te!$^$c)b@{0<w)eSC=e z@xYhDYPs*gk|QfU%-EHbrdus`=6?B_J+pZb2!eS|zp<R3{T4ia@V*%eF@=Pcuc!k> zl7j>o=4f#YCTKg+XHE-J8|NpFP-qx{&=!uSgQiWd=m-jJbAQBQc$sRfSe9ke+Hfpi zFQ4yEqu1>H@|nJe1z$`m`}E%Ry)QUvu~2EFgT`4@Q_8lY%4{>B!nB^tKjs-nf@r*t zQ1b@`j5QB1ZT$n%qHPT`GGo45h7~WcS~TrWRH(57O~+u9l7o{GXaXx;sQ?|8F)A6} zSV#Hjed7XJ1g!WbSn;V^NB?N8*l9NhaV((wVRS)pPJ04a%?t?XN!mvtUKj`%+Q$13 znZ_Ru<7ffv9Q4Y5m$Gz+;zVCy#UM?jV%jmcN0BvV<E(j>R%oT}Z2eFP3@?#^)gD)d zI7~^5zBZ_%%D6)Y+US7Dvdq${u(2+Scq58{4#Om|pJWg~!DP*lpr#dE(V0#x5gPBb zciVd&?CZwnMA(n0r@Kqj&FRr}J9SQg4DNMIe2F$Ks}5m5JhuISBGxWK=orC>4Kbab zMOE)vOzp<U98luKjC<~BicI<6{KCHZ;jLRXZQi_P%jV6mY}&FF`!%iEviaqgH`(ZU z%hoOSO=~u9+4S-z%Vwuv?7OdzQKT`05w<N+E}^(#c^nlRc839j)}Rkf{42_W*Z~Ta zir|#=$$yP3u`s!J#M+9HZr;U46Iqjk9i}T0)NfjXm3^JCjyl<3uUOUShQ)fT5Ck6@ z#x!q%tXXIzR;&O-z(1_oCQjdNvG2t0bUPn-^Q~PwcD}WH`_A3Aot#~^on$wm|95QM z_14=vckSM_b2l>Vu<mr)as)vRmirw$kf(z!mUP)Ooj^bmW9CNHX_s&^cGx%%ZFV#V zFoGW|6%6-}nCa}wuUbAyzH2A9zvXrf-_p#L)D+KL_AL{ZNb3rW*i-f6$>Cdu*?deH z{G-{gX|Zga<o1=0iBtuPb9b&2QvHvL){#V!qPC*{ljhGmhi_r^WUr_eGqo+PZ7q7f zL@}6Sm`fM9m#7D|+<H=5t|yCq5&2WqSf<FJ<KgYQ-hOlE>#yy6bLX3{zYcVe?c@!z z{mD0W?%MIj_U*52-~Hyc*LUpNxfK^XckBf6Se!5lDkKo?Q4}x0fe~m~(NA!ThD3uh zxL5^TVDr|6#~D=6enpYu5IZZK%SO(h{Uh4=`zE6O_J*tX@qeE8^FRN2NO<gLAJqnb zQ2qCoy*GSaj*5nxb*)iBZ80&~w}r9p3cs`Y*9u{y^N%KTZ69CD*!S_BfAs#l_~eZv zm{!R?Cm^JwtJ1R}zOXnjI?uO7?tV9~zApG`T3l)e(U;t;^NzqE?9K1C?A*C)`}SA2 zZ2rxQ&p-RqO`A6F+PQPvrY)PdZhPsK*EYSeee0GjZ*1AQ=_BtKU;WkbqtEZy{mSNT zn_t~YDdb6q8p^gbrC&<K_$?1_n4Za`P+TpK;IR~gvt~2RM^mi~i(nZ#GfcmaD}bKM z5Lewf@YF#4*SSahN-uCPc_kk7yBd{q&i!wHE;-ipP4@XCjikF;)moZx(>>~Tt}5Jl z)-|Hfy&;g0+;6JCIr_n|gyf^Qj|h$z9L?Q>jx^y1hn)5dZ=Z_me!1nmv`aI>q{*bJ zs?L%-S!wM=SCr7(bsU=nt^e+&t(#u{%`cy^KlREp&p!9_pFR1j*LQ9Eds1C#jq`=U zksGh?!ury|r0t&y)%8Kgj8pYqFMeIrnfl?DSC1ja)G}9IX6`K0TpqswK@8&repr;% zfLU!v52C831$~CH50+&+#(K*Z8tR$g#A`={8FRRMbFIfr=TzfNTl?i$QQN>+LvzsW z-lVoVcR?)=O8i_z`Q+VfL3F)fqH8um*cgGexo>7%EXoT>>lv*ai|Z_DsPLG=D%+vh zNkSx}$*H4Rp|d=tpgU@ML@_)&D;$-loE{>ksgbhA41|Dt^YE{K^W1Y!{`C2GKHm4; zQRid(|MU0Pw*8skcz3bj#7JzS)nl7n8R%h%KBbt9_P$|mj@@^3ksH&i+WSkOgyrAp zI<ya<<yr1cl|S~1b|RKtQiJXCuiD0W<Sq7w?K`YYq_04O1rvu#veJ=4$!beR5xg=` z)%~x({>#@t-+%V}p|AIR{lym_AGq+=CKu6bKZ&c^{l8Cdn!LM7a`zW6<c@9bD0*hg zn`-YT-qj?&u<4cB;g=7=otn<NQK5|rvCPh4D8xNGnxaz+r~_JzvUyZ;Eh_0CXxehD z!G`JVjM*JVw)@DM3Y#|%Zhd>l@4o-)i!TnHJ#*%q%f)|e-TB&ol$XDlD*E+%Az9kU z&622Bwk7gj>n!=r_IFiRUii-P&E_|Lb)NilKW0E_$D;!(V1_{_BahksMEew-Z$w=m zV~J}ylhIfOnfw;5yJNP91%`5Uc4}ayj#J_>%nO>pEb$2}hu347xOu6c*8BTyTmSj( z!PBm1jvjaM^!D)nc*nLKuZG%$#sBx-K-%t(=*^OdO)n?TZ0;<2Zp-hq{y+P()$_S6 zzl@%L_j^b)rdxmpXzNk&$I>~d9>dYcS!gI48JHOC<)g;$Gv-<P%9Hc~`*WOrpmNbE z>c<ca0^xT+tyojJFlaL`!K)jAY++Ddvq);Xuq5}9&Ke7ux6yEdOT;!-U?;D`uD=9D zSUQQuBL?ND4R2#BVHzqHhD*A97yHN{a2b~S(;SQTX@oBTG7i1|%AQMyzdCs>Aucj3 zJp6WI<iEG=YAX8O3qL<bzIj`c@~%8)(@QDBmm22&?egat?k6Y9^_RW~w%z{uQMlPS z^eGB0r7Lz=L5JmZd`8uBiWe$ZX>;a)XMR9YL-oz&Ar8eDV~@Vi)JLW3Y5tX4I{(t- z$o{H<b~65LN2n*3URJlZUag(<1pCYHiW*DxNpEltGysZ@LxF;b>~244q3dv}OE#jW zIcJt#YxjyA8YwzIka{iiu$m|@xm~&=zgXLFE?(hRS9d9L)+1%W%lmp>jcZHMsq!cf z#9gDrv1P~h9b5kredT0ub``fQ&g<&F&2Khart<f0Z{g*&@-DUnzPu^C{gwR_!oJ_S z@Wmx>ry(S1*tSi_(d!s#LKy@lVXC<=_dO7yL#?H)&OU*1n``52_+XhHC@C-N%(VCY zU_?s|1<vuO61(H>R0fEAd=O`XThmY%OL}q&s^c@RyQL9Q@9h=hb|JfJx}>QpO3*!& zhn-BP{A&+KrY5NJ3CYx43*#j!B9pKwV%bF^sDW2lMpk)APf$WpZ({SUf{UWe_!A{1 z&Hnv~--lM^3|5v7GbD0!>-HVHckbBr@<%0UH@(BSjsJM*wT9jkC-Ro|ZTZ{o?SJ0! z&Re^7?S6arwzvPfYx`^O{bk3tSKj;k?_S+W#mFNLlrUWZjcqsTp~usK07L$`XF4){ zzyX0g@PQ*E#TOl{&~#vhH3qNPMJYB;Pk0rjy7^U}lf*)wGF`8~={ZVdmkzeX`?X)L z#NzOa4cCX<xy_e?wOCW!;})8AGN9ePApPd}^$W#>#JXh`Nqf9Q+FQ~CXYSnS3Q!SY zV|iyy{JC3YGo=wOp@la*#yv`#`=ciEv;Bs+yoRPws9sj`Yv>z0w(r`#`>l80ePi3! zO>chq+t=Qf+<Ea=|F`7x()Jy@-q^8Y=gzlwyk_6^=o>rV-nsqtH+F5`_Ug7ByEY$& zF_)F9l<l#<<;Dlt45%!)D|0y*2{CwzgTDO<wbH;az`RPQL>>A$25mnW7s6u&(NN_E zjfUinU=l=c(yCzu)2_A3mxuzx(G9d!)mp2}U?cC_6b7Qw8ekX^TjsHuGMrJYSb{B6 zg|!o@$tE@<oG(V|Sj4S@ebs7F=y*XfM5nRZ%;+%E1<dK#HBiG4(Bt6d-Mei&UfaHN z`x|fUczegI+uwZERWjTzZFq0@P9$#MwF_!Hbh91Xp|9=Oxog+XU2pB)v11ePvX1c* zp;jO&do0ZG2l!ykv&?9SY8A9sFz7G>AFDsbHSJ-`13-3Y#Gv)RtRk=jFLuK-!ve3% zS(}`!GEBnvlF_4e7(uMx@_~Ec!R>FnDPmP*%Hv^nKqEQ6PY0f?8HL3?wO`Yk;Eysl zT2BsYwC+<T346Rc1Od%WGqE%E_t}Y2^q0@7Ut06x&!2n#*MgUvp54PT)8*+C*58Zz z;1Fh8vz1OkhmB09popSnZurbWNDTYMBh!kH%sqqXlz5)3s+dKfZzsMAVPsmB*jQN7 zPPDyz6=Y+t7QxcH?v~M!g_?(iZp321bzQnPdqY-sPF`Mac2<@s+bO*PEwy5=qx{|> zrfH+m37mUFcn)l3jFmA2;_u*!Rgpmzut{H_*HkzBFE56FEai>JQtQlRImTOqioq0R z-c(NXpt37tX((+5?kge6#4bWolGCsDE#>eK5hQkKT0Js(wt!bWtZ2%&k+f)e?8s8u zWm#qO)Dll;C(lMUMWu`uP|M%QaNLw6r_EY8Wk?Cskn$i^a=QsOh<lvd0;3;WI|>4= zDdP>r&acv~3lE|(mM86K1GB)eg6@ZtbX1Q0V<GNFSw>7rRC0A%Rg>q4COWjbjGGr* znj9P-iMgfB%t}u&Dd1+@xqI_;5Fzo|H!h9%4F#s$ZK+PZIZa4Welqv!wSwEyoWR_q zSVRbTE>>wcdB&^bT;X(FV0m$7?6tU4*AuH^)ubUUyTWVE3~(M?W-|;4Gu;Mch?`~e z0_#$Px-+(H*3k(qwdx={S;M4K!05pk*p2=F<y?5G(ATH1I;k`{n;TzJ=P{Lp-Ak%U z(_>1b6Zo-+jh>TM?<piL)p@*3e|MOH^J>Gd#2+1r%#N-vi4R4@;`V~XrU0*^kh=3e zv-|P{G@f}y)}7<2YVNt_JJ$<xb9gC{7n(!MBUEHGE2GwH_CCO%e$hr?ZSePjw=z1R zv_-onWsxie;u3qgGXPOKWh@*2%{lGlBtN4#^=dQkY~JG7tgb7$E324SHm+-o(O@5S ztUxOg-fh7$y|M|-getQej#7am;yWetDLHB(PtA>6Ad*u4oqknpi8MV|?xW~M@RF|B zO466B;&K(U?Pt=a)uY<nc1cvNg=h;!aWILXwHO)680;CKXiuUF6dhMG6ZVwLu|o{n z9=P(han_$@J3fG9T8rwUtZ{=H@fKF*O(zkvWzC$4C`A(p9%h#yYS^G1wwCrZr3__n zWK_5TEz4mR@ikg9Wp9*m0a5H&j)M}{o?%j1OPrPN3d`off0o~_jAB?@8*4UX2ShA$ zaPTf#O?t314zxV>o))tDEI!AWcA2VB$QjvxzwZakLfUx)SqFD(yUA#tM-azROcm<p zq3~OJiIb!O$}w4G8==1T(}FoicVGr?_#U;PFISzF9ju*|R*6y!lje!4oIzD6Au)D( ziVl{0G5x^+9RENac~IJKQj@|?Gtpww_yq(snTMvWIj(EEgiR(iKsmzDV222eWyGa% zy0jhUWAd0ugGoudk__og2C|?X!DQ7I1VFF>Iz-trBG4DUgS{>E7CqwA5R=Z{f|xfJ zC0W#x!zc2F;EA=~jOkm1&p|x%SC&G9k`@q|MQ@P}%?=?v548THgGK`}X%M1~%rD?u z1Pl@JR<Pg{3u`H#U<~ZQ2dluFn3kbvci8^083iMa&w`J8JEkdsJ}UJn$t^o%-m|My zuIEyEa@s4WEw-`AxfHf8pS)%d-$f!jTo8GxZ`eP%$*a-p=HU6EHqVswBcWbGgLeuB zC7y1LLAm)C3Oc3(uZ~^L@Qos*_O!=Y%<l`YUu@`dpNjI}Ry((6T=Kip7U4a1{rtdz zDx&`+Sa|%i;@?L7%O$GxO2&p-mlJb)1Fn8pZ6~j^;S0KJdEB#cCFdf1I=vzdWaQJH zAnyU+gp!{8ewV&F=cf2*6K1Hq8wxLmV`C3TN2D~*5+^IrmM74tTwqxU1)okv7_r^* zDsM`$47%>?vFkC>_XArxurl2;84_9lC!wz&mstI*VYmBZ6l5;LJ@i&hbOI@vi5<RM z9bD}tO-)a39wfHpP$N;~&UqzjBTOz8#oy*7CX#xHz>0=DZRIu2J-4Rg%ER&l1x4qA z+U^ee42SMdZZ2-`Ou$C&XI;Z0i_ZEBuMGOU_os6kYR|q~_v!r3b6IxsYV!?J(h-rG zJ&@Gb(bpd~mEK46L1k?XN25queaJ*;q3iXQ+A9hozHYg8XEKaV(K)0E)yP>ULk$N^ zH(@%A!=Hs^T8?>i;05I3z}9kBmMhbNI%QA}cEQk#<a+Xj(1z^z8gGO;D|bt)oygY` zVH>w2wW;4XvRX3i7Qnlf(&Qf7l{s|NN^;%No!q>d@~r9ZMO7o$<7PZl%I*@<*;hDF zbNzf-kucZia(23FMzzmq!Ni?0Zg}))Tklv*HJSJQxZ}tdt)b$W;L0PBfp2p^{i4vF zTtCF^s31!>{QPsBgYssJrh-~-v|S1_5JRjmz;__vcIDAig5Wr=_ejOrSz=0Ytt=L1 z0yFEEjj1d1cMOWyX)0<#1(|R_9CZGPvK;2*3{BCGy<HyeF&U{>9BV&cVJy@f@Bla* zECA@$SRJ$mnmmn&`3gEQP9`uBf<0-V)N3&d3$91+h^82vk=WH^fd;FVEa`196~GCf zEH2O(w`RSm-m8;fZ#nu2D;Nj<FA%%R1SbkyQ^Uf8WPS<Eg(w#$Fmdq+1`hMEN7!MM zFcKX;@*`Xt2|^O;&6qa>Ys0ptFy*6mH2UQOtTs=Dio@`+JXO!iffen8fg9uCgW$Ho z$Za<MltBW6on<b~7)X|>WlG!$zj90zI_Xt#{8q|lA;cbEW@D5|JFvXWx|v=IGNt|2 zF_*l2wO~ZK4~8ta3mt&b!6<&T)#!Nr|3|L<gy{^dEOC^^76n*XQMN3tsh|WyKpC81 zmRT+<$;|MMT0IycvLZHtLE!*3j@IL9PKD5o0vTf2^J|6k*!rkShuBDCkQ1x=Fjyn& zy1~nB^_EWZ03*Vg2|7mqVG%&5{^+zE$d0lz%D8}peNY_205Hu%rv|Ze2_Ca*>-`g> zF4LDXEfv*+IfLOtQ^Lwb-9$9BopIR&KVLbXX{@enFM;MQ6V*%VT3}>V<=0Q7@<wwr z^+lM?ktNQJ-5xR~ox~EUnn+1|*<7l&t=d%7qRYwQ9pe#wTAHDtxAT^&*O1?0NvQFz zhL%)lD=4b)ZhXw1*Rhc3F*H3pmoH45ohq8|WBh0r?Zdi7>^@0%p}c?7XY96$4OUiT zv%b%O=XfYXNPs^jyHzJ$ATemUHxOcY&7^-;+L6%OvV@9&@=mYJw8+*(8;R>p$-6Xj z;dF!lpnC!sNoMk$-V2pE)ltI*C&qK@`MLgO$Gr7mib<*QdGX~pm1OB!#f_UiSDmZ< za;lF6)<i~kT{V)i@YJZ_-stihwFQUn#3agN#)&mJx;;Qz5S9H{%88KBlH~lXVs69L z)7h~>3w@NenpNXf`S#+~Ma9KMmg03q#mt|z_$ivOeBhGau(!Xb+8=XQRAeu<;~+(( z_>twj1!c4MOtsWf;xb;_op`LUGdr&=xU?yGIytuJmK}RXUF3V*^|&*WXKy$nA@=VR zD>^FAWZXKH?sKLsv!UjAZ}s6a8wtOBy=b;PBI6>Ij_9I@IO|panP%sN;}uOkmHju= zWHK>1rcf1;8(v#-v??o#pVA9|o0Ay<W0fP-KTbMPb1U^mxsPjI<@HMg!{2ueFAk8k zYJqLAoo}1r%-UyG&(6%?L~w9sX_5)o#Bo?=oM!2M!y)tmJ*><@GjEv1vdC(~(!Kdl zz^RugbZs?qVSMDALeA5Qhuk3(gb8iaxvH5QiO|-}g?(cjtEsuo#=Jstan+PiIh<d= zSW|B!qd9dvy-1P9g)7{(B-Ip=XY!kCEVYd?rO?=bAphPK1|Dfo9gQ~Bwk+kg4|HM< zrp(MO6KF+0UaV@-q*u=8W~jv4g2~=uV<+H*aIg*Y?PinJjCFnHRVFk3!vJf30EP&} zU^OAZYF-DUEU{vFARalHKLWJrHsrT4`OWk{BDC7gYi;ei`)u3rZ^b}w)nKZ!8)j|z z$~kG^qUY37qX9bv`?U?vm}%c<B`{bMRpfuRq~K}<EoK@|4dHpsi;Dar1(XGZ=rfuB z0-`E{>mz;3q4VQysu8a>wdqzIKiCz$Sh~WNKvh7hGn*EEW*z%gUHHFDSskXz&h9UH z_V#ZN-5Af-Pgb;xX8!=wZ-}P3VQFQiodXWEcBvH~zRxUDi;cnswxJo5h0!f-3okf0 z)#ztuzS$SybvWm(g0?@**gL;C9pdaA;(F=ZD+!xyoQL17{A&>fm-(UAKgMhHO(w-? zYP+{@GrOF4ErTFzBhQ*~kdZ1j(BP~9qdWHB$6PPuovgU>(cm7Pz3p?+z|s5*E=5N@ z+@67$+8uY6;*S{?&@)z`&~ou-G_~H}M05~DNqu+*1#wUx>gNA56R%}*EN|Q;X(sTl z+PB*>RYDe0+@?-{mpXOv7x?^lMMV}WtnTyJUe-R>-v52J9Vj3`7uBmA4qOZ*bU^jY zlEsX@#n8|&_7gZf+90NgHD88(`QCw{wb6zIrs5{n_XyY2ql#&h6_Lb@<Y*y$>yp*P zSyJNAnw*H$ZsNQRTCJH!g5I>&(heN2v?K!h+QbGa;TXi2!AH>EHQ0^GzNA3{4KJ+L zVk17=JoG0_Yb?PsM_YY(YC$*8G0bQ=+wfhkP`g&&qF<p7%D5lZ-tfzZjS6arR3%Uo z>@$OX#<0xUN}`O|US>6Yghk6RORny(qdn{)8wt)MicE-01jxpo00Ipk-?3TlSP_I0 z;&W!6=mTK9T#q2SLZ~~?hgOrN9DJ16)-IOTKuyQGZF-=xYpgsP%o4t(7P8htL^5<6 zv@qW`($T)q!fCd*tZEt%nFTazCcCJau6kxxIAejcK=2Zpw+fH6NHq)A@kI@QZw1pR zJ&TZsXS@b7E^s6KFUB`tEP@?&AJ4Ok*u&4&C#u8lq^a_3=1i~Qf{R#aQ_vqjmFpKT zac#eQt|2ZK5fbD4yFYIxhPDQeTXNs>K9@x9@mtOdWW=rQnp^##=UjZ)$#k+fMF{tF z-mqJ8)`@w@vq(YkTOK31X^JAO|MKjptgkBcE9lGb<R&DT$V~A};nnMdb=_S=@oht* z+c;T_y4~s1bt7HlQxbl??m~~5I%(O)s{3e!IJw-ec#NJD3PG(5(M{!I?EFU8gA0Xr z(P|+=BH2V79IK@w5zw)w4l$DOWEG+(nM4EuQaM74Xsx*6{tgReGrEe@^<CxO8oAre zE0(y;hpI4+X%EdJ3yIRpiBoAFMczeZB0_il_8`0oO8h*c&Q51%Wwho^*CmH9lIFD8 zo8iz>pE)N;8jK3#Hl*}4k5my7z#|cTF)i2XQspIDD|sZlrRb9QdRZGL2L{U{bKa^d zs=Mo6MeNN%S#>Q@u?Fu@Z`X?aAU#>QdGktBX;6M;DKV9IWRC@su5eP(RC*$5A}X|H z<ZMu_nW5=1?wp=HYHmWnipF|A;=|Ht6(XDXF}PLJ_2Dvlmh=lLE}lq1G%7K?vL&+v zjtj~7loZ%`fZ|Qk_(Nj(-?<CdLnBVyP8Vf$#^$7?`zCk5Fm>G}jF<y_i?YkldJcbv z&CVmd%CZE>m>PE}4{Gra?=6#gUTWc<k`hJG<+=#q<k{RH&$Kf^6=V71H(D<nNzKKI z%-OU+mn80DPDufJ-6M4qH942B4hI-XzyFoy%D1{|s;9ot6YCY%klL2g*vr*-Q~gFO zkMgi`?&91fuP*-sTw;r;jP$A@YX4gW1A+@hIj3({M5X$TIf#WjL$nQ~U%y0tx!5R` zhPe8Vj`O6viRo$a<kZ-VY(yX&6SUOHNBGha_ZczR;uAN<h6K`qIUcXycSbfhB$f;) za;hm&F~|`&815TR+Q{>|F~hu2zGz!AOBZFfsil65D(B}^WFdXhzGM+9M{^N9Tt97J zvSQfs@B#vo&1x`xDiK&^atyLmGvJ`W&FqaxEN(Dbmu%8SDY(mw%w#ob`PiO$K~bdy zZp^Tu@C-x(cV~f=EUmGaOjC(S*Uza<W~*V!ZUgU-$&gakLqrI|B7`fdTCbT!igp?y zrX}JffeMa`vj#JH6Rcz$xS8435II#`q#2XWNao36ld|)?+)&|irTgL`caOU7jvR_9 z*_)Pl%<r0O$-emX(+Bxt$fYOq`%dP@9;xv@+w#S!;yY*ZVh%-?2d7GfR?#}4<UUR_ zDHdS>1)1-(1Xi$0H@GwehU&Cn#u^}lZIZmH;@ih)E&lQGh1(Z=!#vL(3ukK4eoAh1 z?+d+^6_F8|lN^$ted<in&4w!_t)3^cPYrnSXf2*7&-aNxAa45XW_48KvB0^LN2gCE z{kB746KwzyiyQCn*HpAnkjJWL$nd4qH=_J+BwXJAFDxWqY?4Z&oC7nQFEy3Mm&I0= zB~%p@oa82S-YxenIazV%=t+Tyf;{Pa_)7G#0>6OnBd04P4rSav7*-c|V@_-r5#c(f zw0lDuY(d4t*vV-O=CO67*!9oei4{vugE00x^=oh?9U6ru)r;l2#5@Ru@IkGJlHW&u z&hR$@(YF$=Atl^CJl2Nz<kl91H5;2$ObHZA(pAdoIh*u>898rGJ|&UKegaI4NT=tN z6C%;LbdIMMk1G|3YpE0=To2+p-Pf0y5y>LA%+x$Kp1IJs*w9Z(+rpaQTU|q%YpO$f zN&Seu#CHrqp>q@^QdvFb?$bi21iIO-00WsX<`>L#k64NZ2^p)JtrTCLY8fU(rVwdb z=H|=vGu8Ym=p9$vgj(@bji6){qyL(@d2Ga*Gp{H$|8zP$MW~<aX&C3)I`N)*aJG0h zCEt)SHAbGJVAr-zP75YQJh5zQjxU&*m>enTY;W)E?C9vUcKlC!M|(T2m{Vs5O+>;* zD!uKU53~23G&_@<v_D9*w+%P_kde7eUbz$R-*GE7qPFt;@U+m$kZxiNiX6H;QskeS zf8tt9((R&*vZ}`L;~6p6;B%gw6y!DJ-w?P&^r7K3{U_S8^Mhx|bn$ujvMU`2Fwsz4 zlU;ghJp5Qzbbgr60$I4;6xJIT+Zb~Tlr?#1Fg!=*b&KnHKIN(F`I(W!VM9fyy&6v8 zJyCVo?U3}Em@IGoIC)HkzF6CXtw*s;hWUZ0#2opIg!2dh92X(@P%X&$9)V%_F_l{w zUZ}j?7+9Bov^qIalZ_dJj<cyZ<<%p#caPVEmfk73;a^>S<#O-%35*`H+QWS^j*mr} zNk+icg4tZJ+igK(WFqru3NKt68)zZraUP?0g8i-!7i%U?_7Ho<pzrOlViGUJ+SbLe zh=2}h{$%ON=#Hnnno`3P-G|Z-Wy&)z+K8a&t|+#lE2!07GtMX|V_bd@;XI0pBS!w( zR*2VSa|%O#Q?994bx<8T0ylw5-Cb@=Eg=ob`t0-x`LrgxN)nZ#jtK@4Bo4JDC;?JX z&+N_g#Y7bujLqzqr8cO-VGK~s^(3px+p;l5sEACQN$3~Fj_?+{6BMxjb`%HnPTB_4 zFd-=8y9HrgQ*!=z9RH{FHwOCsOH{(v3{h$wOjlEV>cR06{*A^lhxnX9wO6CsP!87F zTPPP>@pMNQRq`>R+n8q$2PdJLHrQ4Vv2ujS+kBr2;ZT*KV<H0-yrsD@#M~jeb<}1~ z=8SOB*Nr2p1N&x6BfG;q!U-Vw5cJnYOk~ofNKPi~H0oqPOuJQj?9mJ+3RbcTb~3P1 z>tY9kXs~ZP`DNLm6s>Tc7!*s&dDscW*#FQ-23&ZdG6C_a(G!i7m|^K(?{m3nNsZZe zD`%sUSS7?JwwqK-QUtsP0N@eJ#6_)uzp$E!%>sQMIww|%nC#LijMAnQ6LJVIh%O8O z$m-@s3@^z#GaX)9VZK|9H>r#5BDB{ZV~9hR%J>jtFjI}d!N@{GOPQcCW7*eIO5X^^ zCrj1^ge+Nwm8*}EdIa_{Tg(GGJh0iZLFtdpa4-S`p*zxGS7BV5prCRP-i<234Ct?B z@9Qc)eYt5*O5mB3r!&L$)!aG_$2^};Cpx|_4L$5S>UO^6=E)dB&biJ;p7Izxg|=P0 z@d!6&Z%NFaGJp4^F9%rQ(FXUm^z&l3%YA;_6yKQ(9i46!4QEnwk4^j6_(XSghFlQ` zySGHe*~o_#<?*iY`xrWVt=F?9GAf^6S=S$SxvPArAuiEE#>>+?sv^8*Zr!cPY=lDO zU3$C-T-LpV*lxP|_|9HQobh)XX|HshEq4{%1(Us+=lXJ4&G+Gx{$VY9`g>|UI=#5C zCS0m0bt&yQ>wT`L)GbbWxuxM$My@c=$RdFuupeh0m^?pl^{NlKP~l$ey2ro5vlC13 zdykP@--lkWJs)zX_KXYvdqPe{%wMWM7aRs8Y}j}=;A^kUFTG37jn5vvNs-V(Dd4{0 z!3*P69lqJp@3FOZp^I-}L2q$=+jvxdjkfkm{zz)ncuH0%26!J<7RL-?Fwojp6j(KI zIHB1iu_rQh#5c7yz4(Tn$OAq7Zbr!yB8-_Iq7Ss+ibZ@V(ioaUj0u&gwUMXOV`qyy z3tf%&$`eDtLi)JZ!b_LR`6;Jc8?tf@>3)mWYnfIO-Ar5;Jd0~@HMS-wVvC~Fs@qG; zyt1ThH>^e{_;F=CX*wR#l0okFB(!FwxpyQW^{Lr-`_*%SaYG>^UhWfjjum3k*EuD6 zB)AVoan6Gq3-fX=w&u8VZ>xrm2QidzpXS1tvZh@F8;VUK;o@6C6_?s;dDR1<VJ@K+ zS#_0xR|c~M1(oNg;Of*+l{<q|n@dP-gU&D3da8e@_Nse(<iX6cQ$j+n)m)so?%kDb zY)($Mky{snQY)~*fNKO<sBWsM>+;HLcJmsk%kru7JyVr|;gTxJZBug7#i(xYYtvqB z^#yJ%@&0BqdNDKMVq$M^Zg+3Yg`~)fLCsT@^I!1_`EuGJs1ik^*J8kHvLP%8x*#2( z!g<dLd$B^{3IxQD!WjoWmYRU<Fs3_roTJexZ+>sK5L1L?QDl;sh*U>c+-Mf%S~FOW zR!%pZR_PEejIOA`6Vg|Oc|)R?V7zN3dKsCQS+R`(dCG!M7$w;I3Xw-p1*riui)2v> z9$>frkA<ieL~6h@@q$)Ew>`mVS@5XcDlrnJn&^x+A~MLJCllrW*o9Q1wc4`#%@!$4 z{}%l%QY{C(EOVthSiwbz4$HxHs2h=!6$5h)c*QEKWe5O2LwB))j)khwhxT~}W|;Br zgBd%xj?n#!%83y1Q!v?UL2y8nKrssCyz^`ZHPUTp4~KQRm{cI5@I%EI4^N@y_0Aq( z<m)RtN?W@xx6Yx!=N>c#Uxud#u>_7{gzJ<mphbeau86=XD8w9l5^=~7O1!ULJEx03 z9;8aRuDJ6B)Q0G*q<lE%azg&$YlDBtB8o3WX|DNK&^@?xSD>q>eQ7~IHGDnp8B*jo z;o6ri@hB;r2=m}&PUOv9Y@u7o(cXNIrNKZ_dzFj%>K;5?wRCG1_Plm164UeodAuP^ z(pQg<LE6;70m!LK0-E7NR;_K}k!HRST5J(!2v!Lb>VakToSNak402x8-|!B*eKzK^ zbGLmfQ1RFZ5}xQ>|9$3l*V0QOGJAkb>~~E)Y9xk_&i*?*{uZVKIL|$0I6!Lme{m|y zyTLCchXmZXS?%lD?LD}s0AnC3N`KfqF0Fw)z9?HUn$FKih$vJiPWLr+)uS!GmS(l8 z#53xK+{Kw&vC1s%Xw`THXvjZnp|zScT|^%XFBaT|@;sH%kZ!22vDW4*r)A=qT-}|v zRG9%Yn>B4cRp#1^g`Qeb%A7Il+_ZFdv9VBJ1UHJ@*qu26-Ijvs30YeMA>P+DzwMkA zC5gEGeW^=*HKe{!^?ACxh*ZX3ttphJbt}dsIg8_|oo<qadtB+&_FIQ<R=O8`7gBxj zAn=p&MTT#Q|B3zinf{e7#bn73u7Q5NC(tqWWH@u<EB63DTc0w18Q@&!?9=Mr=wIsG zb}iTKe9o0)9-<RpV~H9|OUvZTu&6toM9KH835t&`DUWWyUKufOx|9Zve5s@`IJhFV z$s;i*raJ4&nX=HPXeg*E&p7zIw}vEF5t2|9Q|^sTQbOD#2CDW?T}(`juFIZw=}hZN zjmYdFix(;m`8VE7uk^2ptcyVC?yTCJBF~AGqmZbj#XIvOVj`SFYKFZAi9O3B&6!(q zqlI_1{c3jnwe<d*xrNS+eg;zQ8y8oQkQ2~Q>+YK5**E43uK-4QVhCT*DAyaLR&j@6 zx(lkFVX#+ZD%}%o&?$@}w2%4!<Lf=Z8$GUbVUoKmX|<MQ$B|>pv1L1U65Fzzt6bZO zuAMl!Ni4^4RdFO)Wp}l`aJjqez4zWpuy+CkD+qu9h~7v51c*ui1V9uPkYEK!qRu@Z z$mMdS{QvWi1c)-<%zQIv&Uw#!&Jn24`aY~ja16S<TW%&cKVJ@6XC25TT3g>=M{?6f zzyfH|-1@c%xC@_^Xz}zMVL9%>VEanjESn(A=T+_?YP1tA)Kln{^{o$?y~g%RW_NnY zLi6FmT@G3yX?nBL@#URxT2pDwf)oIFW_v|LrMGAL7usq{I-BlO+IhUX81O<8ZI_00 z&6AUDyA`6c3~KI3Q`%Uz8J7sih>Y@Ml5V&tUO<sHgV-Az%EOJ07t7{p%emt%oVc;t z@yT>sxf_u?(b!hoL>`;{pk9%vvs3|Y8<ysDGw=rOBL5l`6v0M~X_=sro}iwXk`_m8 zm=X8TRJ*!mvS!LwuRuZS1W+y2o;Jo|f5)oMWtG;dSHV-}m-THTk7>h57}Sn;*bve( zb#(?H<gP3@EW<-8<A#+}x5(<{Xjj(oL!fCH5P!lH+q<U;nrbu-9A&eu?~u{E)(>`s zbL^P~*Mf^MV{?Mx`n|=SO-Ng=ua#TTbhC>IKBXRy$TzWstTwdh-f5Z^P%S+UWs_sl z215fo2P6jw7^4_M{AWS)_q5=^jVzYJ!KG9j02l(VVI%%V#15u~W1{oXayKmZ!-v50 z9J#mXL~0Q0U3QR0a2S9#2z->hU;B*|He!5Si$duQ%~@5|{V9w9pR+H42=HLcM`*cw zSu(6QI@L?#8zXqQ$oJ3h2nP?f6SMAN?dH+dPGO{ZkAyUK5d6@7_m86NxU1ut8BJ*a zV|VbQ#OBf1JIx<o8vl4QfK+$hk*1E$Jgm#F;$`rPdfpkt#&CWrp|0sc(%q4_72)PN zkClDHGIrEpCF^_`MFw-ZZi9v#dAJF3`T)!01y#-AAoJKkEJnHmR<Hx$V^Adu6VkiD z_KAe*QgEoP!<Pb{!?08iYsD{hRhP!6NpCb2q}8B6(!fY|N84aue$G1$Q;C3X);4Fw zKb)PtU0d8xbcvT_yozxrzV_@`YF}Zh{F3@X0u&VtA0VgZJ&67aF1Wce2weayPBIDZ zev#PkM&KPq5Pgc^`UhQ5bm@zm+Kzpo4j|u#%nN~B$Y}RN0=lRA@_T(iEW(%sdw|8a z=MM(9(EN^X&o70$50R`;wG?;&pca6ee=jt<?Qwf#9tqky4>1W~2Y?L#Uw&p->%#&I zJYYgR?R7J#U^&2?eaS7u*iUY_+@Z``3rdN{tp-Ok;O0l`4YECOd}xZXOmlWuYruGH zsN1p)%r6McQ|&q-%n1t}(iGK(q1(BOwS%hyRbwa2$q&!(O_n=(%XD=eAG>>Srk+g6 zk)QM7;&{3`HhG~pQPvzgh&K!>*cAopG}t8Gst!?Xt-a_rScrr9(xgPoaPC@c_cc~3 z2nYFWSv<Hc+XnI)vZ?IJacXa@uC}Flu#}j^WNA{fWuE{hOt{}gDG(%&Pv&gaWoWBn z<u^&}Y{4ZZgO>V#2#VNhQLGvTI@leu>Ia?XxWSpU>;vS<pwGnS>MJS-Rh4ogcRIRP zo1N)E)=Pr>S<=P~`5ZfK6`Pc>X$tWwPMDR52^i|Hj>XG~&VY^Y-L-s53Uc=-M?Y*I zEO(8T&zGv&E)VEyLHp75l#^xT_9=!4ZKWXxo;fm>GvBvQ@>M`)LjkEzH~}@+aWgsl zO}LEMj{7BZ4SQ7`%JN`w8<!xZQQ?LRZI)MA+TzJ`c~gJt6pYP^yLX2wXBdH&_`TO# z`&bkF0tP}|X<2onYI6NU>d0)%8al*v(?mms5`J-3R;sXvDrMyJ#~=b_as#KSy41yI z4uOLJJ6*#2;QYQ(1^DOky6FJ6$d2B6daS4Pqwu|4&K?}j;`0_}Ix6(#52>A(%k=z; zHd}cWLbRleQ8QDT5(^pdd()@5a$;5jo#z9VZ-pPpSTrRcvRE#o>a-a)u8YOUG!pml z8>lCdJSh>V<Q;IsJL3n*Hhl_nE`GYMet|!)>gr3(pf<@yCsJPTmB`q#;%*Ru^}XW) z^RzOJ&en~(&|zB%Q%#vI%rxf-b6td416NXW%Zvi$EV5y$wqZd?hrIyn`$$cFfpo3k zvgqT@B`@tRqn(zApBn5F3-`-@U`n_k><7-(0Bp;^7HG%*E#D?=v8T5|C5Mv0poYJ& z;e}`JJ=kmq9@yjHg+s6nqkts{SsyllmII#;ZlGZ3Wdyh;qU+!lwCx5~Prwx}R=p1e z`wqaA-*^gi{1CJcI&<g@?DakPCgh9(WE*&bdwY<g2`l2d+g=35#Xfk2j~c-4Wf-sp zCmP|RP!)|EW#rE$Toa^U&4Tfb!ovMc7=1YfUKp1<z+<)orIDiiOZyw))c}w$v@meR z)O9ztX(XTc`}($AMjW)z11-Gw*%rcbA3IgT-=lY-mc+DPLHlBLfu!)0wkN*#1hxg} zjYq!&UPfd%^q}+79r3mX_PJyUu#)*A8~{6!>-|8eVJiWbkKA4iA{Cedu16aZD*pOS zr#kg%0P4qXeBT~vPS)sFH_RLGD+IH7=zs@m+_pm71z6Yq_}~!JGho{ou;)x^R)$9X zlkMx$X_(EQbqKF9Tjpp*6UCqvucqnk+e5O|F2QW}K*4SweS3V70J4)o*&XTh@>-S& z9P>(pg~6IjQ7>3=R!3wnCy4%b=Fq69cPu)!0pxC*mk|$nosdG`j$>@%%~LZwgf(;D zuDsb?(}5ky;bVRdMPPFDgGV#`_#6+RAL%Rm>dWL!l>9vQQ0sVoOg$mT{QwW@1+}iX z05p@_;_5!!-R_!bQk{;>&hKt+B#3hdg6L-pg(Vrxes=$KTaF8fa1c7u(m2}CAn0KZ z;R$Uj)SC%onMz@G4vbY!^^HyPirM?*<e7FwKMwGRsIDwfqyM&LvMh&H*sf^aN6n+V zqBwnFD_oo0Thr9ayj#k;ZH-A8YiXNm=Z3AFP*|QoP&!nY48X77ee@iA1fHxX0*Lw% zS023&<STgXf*aBzp(CB`6s!_&?CfnG*{mBYEFS41EVrae4Yy|)cQ(=LSgWl8Arozw zKiQNbt;#kuOU9T}qPoTg5$mc!1>5g;w0F$S@)nA^(}|YvbMty1l;gGiitgD?e0QS; zX>SXWJ}rfaA0#)B34~Er36qnNAnuy&YNpq8ylQH(F2eNwN|ZNQ)LEPCN3DaJlvq}u zmWU8@q_IV+ygjj=(-7CVFm7NCOk)E-hA>xvAmG{uS_}+w6P^bkIwd?dOo*Pcq<><} zoZK}cahF?~&}!Lp56^3dw^&RNA9e$P+-T2XS+nmF)LZ>a8lGd-zTzCcImcpdzzO_Q z)!zJ}es6MN3zC;0ecP0Eh^pQ)?NO|gTX@h2mBbx%FgZpooH$79aoMfTwXQkJh=pcY zvEeMXSGN~M0G#X;`V6==TPqKglr9c!bk4E~mK-g2c6|lWnKt~gjbO8Htymf1v0;J} zR%jiJ>c+|OcWN||+gRma`QZ8@IuoQ!`BmubHsGcPFz(SgKw;4~W-_nrFFumOz&pS^ z`2iyeuZP=_0mv8?aR?{{NYKcj|L`+9#F2t|EW)1`^aRGI?$d;+bydzr2L<rdVVM;N zDjvJi4f*h)p9zuHd?=dgNVz`^m(K+m%5C~|tA=Gz9e20E+ZpM1!BdYER%paBWPo>W zW95y#d$Y%CZFo`taP$ZC#-w6TV}d>n|FizikpRjs>b$SboElss18n2Z`{k-I)lSOU z;$+NE<>OMI8~^;GoWf2vAr#lOzuJ+nPFgK#V_%M+14i=^kbE+WAT~C~INIQ5a2+tv zUG^d#Xh$J5n7y|Z1ha0-1Fo>3Xtin?g@76K(gx6Mf%oMM_3$ic<zU0JA#~`1ko|5G zB56-RchJQr?*Be{Gqt4k;@sfx9{xcEEQ|8n$%#o<${M2^;LaGXz1vN`tZ2Dunz~Y5 z*b)6J==6_Xq@aPDu#Ilaqs8AQ4HXVtO6<uWPCM@ODZ?s+-Y^!W^Z2YxeEcXeQ+k;) z(YZM2N9j#n)g9Snd0I+w7dpI4%SxW=djOi+P>wP?ZJ{icNn*^8rY#W)r|-`4$+_go zlp?6nc)HsV)^t-`lv3M-WWQrxazYj9{7Fqx$F;Gg|1u0Mpk^xnHv137tbcERcr~L` z5c6($u2pFEEzm-SqFcuA7BMr0SL;c)<9q(6ZvV1HCLSkJw5f%Z2LaT!MW)^YfSSnb zvnG0*hG+9NV7HTZ8Z1qhaT4Sl06L<gqkp55K$=eVZT9A>d3s!Ru(WBRb{{H4LccL7 zjvaw$_Xo&j=I!imA-~hN;RkoJYxmF@np;#BqYe!eVL?ul%xjtt*tNFx{Z$NRzj+n{ z93>Dx^qiLK+MIDhiQc*01qBoZ4=d77$c<lW6LV)6qD4`bgp{OcB6D{>gq25^(l&>Z zC{k6639!}Pv593evDkzxX=(k*MV5qA35%tmWZ|=tM3p=aHJ(IU8k?hs`+cMUI?x&C zCJF)zC?5Kge|!j?C_<P49eLmn0O1)-2h7!BCjy&i53{QPBfS7h3G(`Me7}zX-k0<4 zpcg1?@ETYtu$PbK=U6^QIqOEDc`tuY>|x`f5iEG&Iy6Mof7+-tEN{XoZ$nU_9wY_h zcy%1@#NtG~Wm)f%4%=)Lc4(C56HS*Du8%I+s5;IxeB2+;eS=#bJz_WG?RB|<+i;N^ z7aTMuU9(SI>=3aS$B6F9Qhv-n3!`;^skl1aI8nyBTc1^0nUGnW)Bi5Hthn<1lJa}9 z-*iBfchl`Z-l5z}&DGwhtS=7UfcD?M&>ed{H>>LXd%H_-4nAuCv7_io3wfFHZb8-+ zLCi>2Nl#8fLrHBC!dDjDB^9tx%O5y!0I>cK{?`j>)Q5Q=rwmkuFYw#XwG#{3*}0c{ zk+<&6^{^x26bApumv+1me<-Zr*=q-MAJke(?veL9I<{D7sb{H+Cb94LOpZcS#};j! z>k*oGqMjjrzZV-q;^(vmiB-JOJ^_aU9vo|*UVlg0URYrPBYFqa^_eYLe&801_!z$5 z_UVOlYF4q$aR!ibCltL1Sq(u@tLNeNzXx9{h=4Nb$Co;BEgj4IBgfzmdmGrqeIrzw z_4v0}(E82T3eT#~?6Efcww!2l$<_#ZOm|#dr^oAAtKW0|4qE+5lwxyb<x#sQVixO# z9+~ARO0cK}gg0OY8$Qy<gQa@71dxHn14V671oppu398{)x`2p%L9`v5bAf9GY5Nxe z*<FUB+hKh>jCO2ajM>PE>2BaviQn%=&bxUz@%b$Y1%%&9<F6{Nb_o96iVi<o-TbIX zTt59v_J0G#FXAU>=y9JIR*!mj;;P2n3SZ&B?HF@WEUwipn;+RBuO(-1i4~AYbdX@< zJuz#I>{=u1unnOJ4y!9z_U+ZR$*p#N&zjGId~>UGDRbF1tU#m6Ad_0Wjy4Nr85Hj# zb64e}!;vf)JDii-2X>TuG7(~P+bF9XFh>@t``WXk?v4J85c=QjGKokwU$DVc18b?k z$X*^=-)GFQ;S9SmYWQtUEoicBT}3k9#^9Q9Wr2-E)8txklN`?nU`x0bM~vw~=14Ln z6$lUSQFm``C2Nw0N@spmE^myJC4;cIsx{xp8jH~<ddj{7)A65Y8vjtJ3{S_Y6&*G< zC1nNFikSMLirQWuP{I3pGprf6gsH;&{jh-YRgU!O&N_gL13iUJjn>@h(wTNg3TtR~ zuxf$<46uQk`|Z8dy3)#?0&XI&cn59f=~9~e6B4O>61ei#Gh1=_!p6a}Y3|LU;e1Uq zzoi76ZpwIC%}>kOl|!Ihb6eZxlUe*ccYmrMRpJ{5^G3Vr6|rsgXumPH=e|4x5bu`K zj!I@ZzF0_qkUE&59IFMMBQ_l%t6(~q3}5wK?$p(sIq33wBly+4q6f9>$;#p~Ra5j* zGThAB_*ez|X8d;Mbj`P6I^H;=smL>9(-DUBj`u`(I+(i3^nyH9S<W3m4O+XiEvcRN zJ55C34T6GSv)UCq(rvE~B3@xZCS|utUDQ^Kj~(yfFuOhhrs;T(CS$RiCum6G6j4|^ zeUM1E$Jk|Ryxy;(j)C>H);C?z=c%2`qSLNSj8|`x<+{5vv|pOtLI0VKmL>-Ln}{D7 z%*he;i;9xnh`=3O%b3TF%k%WjXm_l+yxc6md59Vqp+SF!EK5N71V5GU<c{oM9+D#@ z1-3lI+hIh|D2R>2eAIAef`cq76u>kO7!+oa!oW|hgD?|fX>Cuq+@>)orFOVMMPwz; zA#JxW1jqzXVg_5Ma3uMrB!uj3UFurCgvlwAa+@a=RtuvJ7KdKB%34=XCb2dvNn6Gc z-U`9HVwKY%?zWor(B67d^QsI9OO-ti%J6RY$Q)JBwt+$uIEwLSD|T@u8P2l0&V|-4 z?eJV@n-gi4)ceX(t<BDL%8+ki-8siAgXjvy7E&Trp@clo?cN^gv=JwPy?$)q1t8EJ z#7h7O=8=%74Nf&5@&h~>5gv9}seZyl5CD9;42tQZ8)9j8!Gjj1>;#EChoY>lm~OfY zK+TEOab~A5x*G)Rj!{GMqi4By8o)Y=kC`Ph-~#^)^U4Tc0Os`3d2~uLV>0a9jXB$w zx~I5OdaSNLv2pnK490v6Yb<)&%ejHjUGmb!n!7mwp+;cBi+kMLQ-`Mw!&)&VAqX+- zj#Y?{@qhww*0r_1wGU1)NKTDRfYQ1_%a081AKOdVk?`%pew2}j>m8!L*B#$?hhD*{ zh!gDJFy7uPGDFfT6Z#~pH68%(Qx`t9GQy>lKrab_)$lpMLa<QE1GH(tcoP?_8@+Ij zdXX9eG-08E8G;!X7xrTSipRLh;q~`<_%=9Df$s0t1A&9Cg!TBP5H-E7pBlsf7r47# zkO)El*cz<Xr@_Y>0=ftKd(g!XvGgs_3jDwyK+k;00IEAsJTPLn7ttq8$m{n7{JJeU zMgxIJ&=YUYcjWgfu5z!vKOFr|Veb6h*@u0&uKP2&Nd=HT0rb~|+@>~KQC}}Or%xvQ z(>vl#M`_hkHWLN#1*$9_u5`DdVIq1qVIqX`8r!0Yv&mBuYc3T9$XR$kjmE(xfYqmX zdp?<3Qo7ZgQJKGibV*C3G<^b#T*kgUmpjV5R|U85<vyqOLFQU({tmK#DDNp*iqp}D zCxMKUlAbbXj+amTD4yU*myuJtjENI78Tp0u$z;XgJzjPx_;@q*HF4Vh<WVkZULGr9 z<;`9eaOIiA`OKVs&tr-Bl~q<6)ok2f*4tf&>jBu=A^D0&vX7Qw@}JhqLT>lg)(VXM z?_jab9qSY)S}-OC-)xsNYP&&|&P0p-#;Z-Lp?D3aAsNQbb@ZxxqVvbdG7z+zg~7b4 z?1v)_8rTn8#fJV7I(NK{+dxqvYc?wxZMJxas%B>i6hxjS0IvRW-^v`7IDD&q8SPKH zM(-`>u!i3PMMX*MVvwZSqrE>;w}@*<NzTEVcq)E2O@+H$KaH0&i8gdVDJ0Pxtu5Ov z6Qj%m$g`d+VK`gL4;q>Ttu`3@5%>r;^bcT6^T)gK<lx7~^p-X+R|ML-uQ{JebLX|N z<5NX>v{W9bg6(6r;n8%-v=VR^Ur!owvZ0YPY3qeCHJHiP^g`p%%m7CZ1en2|0s&|F zb~>YhmC?;I(B^>h_43e)Qb<#mV_1K6UrM~Bq)E`;5<+^xn3UFdzhm@Aw&9Y5Mtou6 zToPwWTV@<-E78#n0#Ym5Nlol3%$1j=4GT$pcG_rKEUlJ3!pvx9s76-9gE~^ro`#g7 zz;l2f*i-)F45LSnp+LkdFk(5zgTOL}VvnJ~vw$lBdHa-;05dVpfaL=g?^k_G0GaGL z{LU?}D+tBbkk91<V`zCd5P%K*1K$#a2mnM1FNI@e(E0`fwlA#RLq{-Vg<#0d)x#~H zYZZtWhu~0o8Ox0VEDIa#`JKJ>t=(ndL4b2681MxG9_Oz2N07&9Wm}Wq11VVi!NZ_G zXxj%mhu;O7t<yBThPw2SQpJy!ced9KcEH$yYNybX@QOZylp{WqY7|Q|8r%wPM?erv zgdlXB$n+=;>9d<4A3imDENfTP<^mv`XEEt<V0k3mVaa?GnlOD<<{l~IU{}#GZ076m zp`}M3dQ47&(?+q1CF5>cSVs{vpz5+f+(m9Gfm-KnvVv$^1tnLZhcqNlnczQ_9RUg1 z4roXO9YU8jXF$)#_#I*O-KankfN3zk%+%a8)Mt%?s<Y5<MVk~}ezFHAihKxNKN!=I zbrNY{6buI0f7@w>ZGydZP`9gJC9ab!YvX`qo0?jeDCVKnt$s0}A44u<ugybv2&$=| zbV|mzx38}CgZ9n-K(%h&V2vR0B&|y8Sm<|~hK$Z37gc1a>sdK8f_Oiq>T8M01I83n zCjUN^tqvmRkQfof^SK)|9RR<hMw)t;#HAWdCh@S>+*Ywo+%}NS46s$7;c-07QKTs7 z#5{z@2I~)p|L<by){w<!H!gf2nqjL5E9GOH$(u9QZ8Ms`#JIv1Px(=4{57RRwKqdk zVI<o}_u=HU#Wa}f2dyQ{`G>5rks44E5=eKdHnN-hn7M|6aa{YonzrN}pv_W8a0FXs z9i9SwT5A@ey>`5HG~a_%4McjOuxYYzq_4_~L}{bbz2x#bQlXyJ#~;Q~I%`|X?U}=~ zlXTo<<uD6o!FWSi$D+`449wf|?>7zghR{S|PkV0}v2EgZxgTlM2sc_L>SKFa=V-;% z;{e{~#`bhGTZ%z3d4`(ADXS3`5aINBY~xJ+`dW4I`zbA><=jjBHz#Lr6}FK|h}YT4 z&0N%5h?--skb<cC!%_gL<rixWPr)nzq4j@o1diwBjOa-TZBsQeWUr#dun38b6P&!R zSiZd@PPi1q0~MV;(CHjaDDPqv9HOf18j_h(L`!v}nVPY&w!=Dc_Bf}>jPwnx%H;7G z;XtWLHO}s7;?}i0T55Azxx=&pW!KexuvZQ$8+&HQNJVz?74bjJ{2mkvmU6muyp&EH zxlf0D`h3Q1E?JSS@0b}MmE&vJwaI0wAunLVAYqKz>4Oq3HESGqycn<@@Xdj)v}^fS ziA|{&^)bAMDEpHK)uS2g`|ew}LulrfB(5zUvIUhCUo9!RvM}=V>8Bq}L-_DMt;d_Y zhZO5X)?Vu<Kt^-^LGFAHLqk?nO|QB<15!;d;6%bI)q-cfo3T)s?MK2+ihk2-YJwvU z;aitfNL{lyo(s0erfRFU$L?6#BDb%N=$w+8745cG)J0!fw5g{VEukWCU-irzD8~H} z;?fE?(v%OCn(b>#&Q_9_=pX{Ochedm3e2lwmuA&$SY8n{%q@2>EC$2_s}=jmP3RM@ zE^SkqHK+E(SM&>e+>JJxwZ3nEY+8s|{S#u#%zB?ae;Qa|yb{JCkf5HG)lRRr4r~tg z?Or&U24L_$l1+wXB|2m7G(e7xNTYuVol&o&EzlLMX7IL#0Ncd2AXreqxbia~1mY1% z`bkXUSdYbw3rq|KA|imAc5FVJh#;`o-2n1F4TQUc{p|w)d7~gL$pR>;evAXS4bG;0 zcpq88-3I?}$sS!B)W$6UWW&Fq<45d&>^WR&3uwy6|6z~Mf}ilSUX0hAI{q+(rC=K8 z4jQxuP1-SoWfndfMC&R9QWUA8*LOj2h2oP?iDf6Gb3h8){R61`;DZbpUId&ccW`mh zyNi@A)gHV7+B76sLCXVhx_uei^#K+fnrC5jL-0kS!<ZQ_eBya`ND9ZC8>~DJ#8mWv zSOCIw5W#`!fzJUJ|47Eo2VpP(GM~pz<<Ge8Ne>t|t5n(5hiEyS*>#U7nWfFqFXK70 zazwo=%_-VK-O;l2dQB>)D5I>-nMcj53L)LYd}%tbzC;(Jor+_T?v3G64e8uiqCiwo z>d4Lz=M!LEMrSnhXXaqT_iz(iR2*EQd?E|RWqwOiovvy8`a{ljaA%C=>hcm-n&VpG z?0A@#K$%V$7G!hc2ZN?ZHl-Z6oF_N_2_q_m?ktL>bb5A7_aPEAv`y}Hc2Co2!oIzn z(j8<L;%yClBx~*6Den|G2;Gc+ZUd3!Ku9`EE1(#!wVO-Gw<>5uY6?|5Q$?ZqCIIRl zXi*RKG#(-cX(6L9&x0sED9e>k?=D}h7}NlL<DiVf6cv)bKF8|vqn+Ub3XMxDS!n|# zVX9R~s0kzyY>f#MSnrP<wtzvoxE5H4W-Lrthh-T!#4x4}GZ;{N2flS+_(Z;d5IPso zn;{Sj-ZDep7z`UY&5(g0hvgF19EX)T1euSM%Dd9X*?bO9onx#33wX7No0qqVl*5XQ z8nJSDdSrI0KE9IH9zt^u%Xv&sG0tAnO3G0%E$o^4;^gMBNg6Y|NISMj9ZvP2&CD!A zO%vR(?7Fd}8V$E5fzPn9)ev=VE6x<~Ue?O$sK}m@+@%n!@{>R>RY*qV+|jgN?#g_M zkfSg^UTR;^T`wHOO5Uz+pk2pdKHa+lnAh-wgqD5Z{yG7z?P`ZciuVxU$U~zz@c=gV zr7s*pB<`i$))dID;0TS{fjqk(o`A<B6HI^ni(MaBY;JHm1vdA=umCL)+f{u)=zo1T zxCz<~*cTfRcMFwC;AhJnfbF4S?88Pp*Z>Iw%sF@q?fHOe3;FkUcCiMwKwUb!w}tSQ z5PA`u<j^egt;1Io%h(Ry+lD`(FMvovdpnTL6CFaL4eSb`&@)c#df?;t9gQDk8E|?^ zno+1Twu~R2ER0R8Y@$|v$VS0Sru`2~1eKCH@s*s84+rbB1(2_5__xg{561t@!w6{e zxqPMR@-0%^M<Y1-y;8`V8U}|>NGKq<A&VYB836-4t{~>)DSx%P%9#;uiF-)tdzeK? zYU+DC8^Qo@&bjXAjl^-&>ppHHS5G%k-WUeM^K$fBG+gqzYY{TAs59i6tgf7kDHCa| zyC6|O^8OD9LRj*`z&5g?Yv?hphJ-w0-hUR1$~rJ^&s^fgH1f^+x~9dn26Z-JV)bp9 zs40GLRUusE#hVd8gZf;%!PG|`oJi!f%4>m+{G`tC2-Oa&pip`P#3mTqFvZ=8a?oS3 z8y;orabUJRY#bg5^ibdyM}8ghd4y{@hiB=8Q2eO1Fh&j==@4v)NDq)O;Iq)IKLY+9 ze;;dc{b<Pl)7P<kd1kLTx)bn@P9;DwR@daB0Wgoq90_#EQD=l+d=u72lzy9lwR0ND zJMIRy|HEsdDb2IlT{u(NZOiV{m1i?M)~N`^(9mRt;Z7D={EN0B?f7Eye+qlDSCRH( z1+@INjOR=pmC~OM6P>xG%S~yF-Q%u4@-cr3-+8qF0RP+KmMdwwA0_vc5=!D@K(xk+ z(ZC0j4a{<GrZ!1bQbtd2`v?>x-E~al{JHnJoyNC$DY{G?p{3?wcSiUUPl#8T@l6Qy ziCj2<{3jAO08s083k01+dTkinPJ=;RKy-;*HDY@#(qV=_ngEy;dMB6=woxAB&3$^= zhg?<^fE;os+UBd0n@tnRTf8ex;~%vRUryu^-i5o9e821BpX$3Sie<?|sn;v;58t9b z%mfYpw`tJZ7u%m>fA|sUE+LPT5>L((q<wZmfCSp}F<Pdt`=?6W$ac8BL3VEMfa4ko zRSu5V!2<B+U`EQfIGG1+hShBrthEIpQkDx8TN_)uD!rg}L#Pxvy*$r4%RwM-irvU9 z-{6`-4$NBp6k`Kre~%qp>F8SbtSXpx0n#qOTLR<3&qOk$DxiTmIZ?mNUhiZ%S>UfQ zFhh10NFCPTc<llbz_C+O(IN@0cmvCxja{j-T7={6OWZtcbse45kbv0EGlN=VP=pNH zsVp68CxP^IDRfq?-ECa=ty-PREx*DLbb+N8Fn7bmydrsS*J#+ZLWr%_01^)T#^HT@ z%DD&WYuzdFnp!YKT1z|#&%ouimkbCyR}iOAt-C*8Q3fZ-TvBrGfcZ9UFxyxVLkGJo zo>*Qh9%A>=`fu{-mCWMUntsA{N=r#&BdIq5BB^M&^6U^YUsJT<9GRulMfdy4I(wUx zwW`U4WNtJUSn|Eu%zw(Mm@TQCM!}YzR(r-|ImMDlLQB={qZMV1fYG*1WH<Ci=YsEd zfK<e9_XH~2N=Eznsq(@C*$^wa4&>r7uDpxRf#U{Q0}wI5g<=2nNDai6>xmi&N90sl zW!c0MDSZym5ch}p0&P~uP{tY>Anr9KvfJ!9IJ(&Vv*Z2o<4qSAqMHn8tD>-=lOpKn zRF$&`m7*!Gx=h_)nWOBsbx_nx2@ps<-fF9dT+em&`SUx(MbhmiVTQ7|mYAmMyE?c! zoaRT8vfR;sQq%EGV`SvZ(f0HujSc8q3%ZfKNm|os1HDGcrl}@!;u(+}S%{Zi0<^6+ zIkS;G*RAFAxvk<kG9*Aa9wz|D1|b@^ctBt77=d_=2ykDW9`O^=bueP)HX=)$T4i1* z99)@;3t1d{UOl9{tM2WuA<wRhAi7d7HLJ-rl==B7d4m~wyK3kih5Fjn@|=Z!@<xZu zF>O;gs+6+zS<TRFjTw2=Vkh{bT#f9-LV;%0Fkinol_iuU^*R@s9k!0K5VF=aa{g&q zwboQ>fX$W3pjQsfjFPK|QHYpt7q4R$e#e|+Zm9*<k<235fuMJ!<*^qut{#zDZxSyp zX@KW@EDnO`+j;-xOP8xh-7->E#X3=sP*KL5ZP=yicjPwdSJayVhG}RWJPVI+e3<@y z;`0N(u$Kc?1-FL-WVgtD*y$&_?{{o>|0t-KzV&hEC-|I3`tKA7m46~gc)wcmUULB+ zN6Qy}G=BHP256lD%j#dl%jz`S?2({7CQ^Q<v!*;QW9s7)dK~JhcU->#A$ASktBLgZ zw+b5x-PsrUap+109hw6!Y2>dSt<sYt21B%?Le70SRt^E0h68RD`?C$9C_bQ6MTVfB zSX5{iD9~q7=wKgk>?p4jvKyZD0ejF7A*4rc7BC=qe#BsI&Na=8gJ!&<9uDJKJu)_n z8J&~533JnclZy;3!q0T%^maMBTai7C`LdkbE0BH+y2HX;ronlzOCrDmIb%LhLgXQq zSL|upj0roI;nQc~0m7wG6r@^$(#ydm(1IdDXVKwQFMRu~72HSA)H(aU1(0$dI=f)( z<^Xbo`Gl~qVgOzQfa`FFFmMf&`^Pi&WT+0L;20V}$ds+bCo$^^lH0|}079%3C({@r zb$b)vQj%?J&W9UH$=gPb%<N3OHcckZlwBvwl&LjKr5R@ACuVAfs}Im(ZiZM%Y~Cqq zW9X>*Y!$U}U8G9ybz~O0fb!hlrK3A2xLR9z4(Bp|T*c+Sp1U+n?32zbQ8};)h1vGX zOnCzC8h12Vj(kIs(fKibH`|Ez3h~pWvK+Q0MU>D#o(aJO69te?09N+#(D1Mbet)#4 zPMxe69DJ#nfw;<|>3U_0WN~6SdAE84wa8~WJ4dMv%cFuJQt_~Q3LQ{0jY!qsK_O*i zP9)`sdfcN^!&8~$X&G9q-YIPWg|NcH9HUOwj8vfxQH>^-%_uh0(#?JNehRqDzR-bN zu4y1#?qLs-CK--GK_l<=oEg@DC@*gnrLVZeqRiRqIXuVJxtzLN6GY9~8Msk-FUx?2 z38-D)5I?NVCXyB}HO`@ZN;>2{Iyu83@g11Nr_JM|=TMoc83z5<iR~N+fAGY1KEe6J zUO#g}d1cL=rat@NY#Y9}HxIxVeo7uU?IIt)Jt1au7_He;XeHr38|it&v$XN#`GHJJ z6@|(cvM1^v&Y|79obi4@@F!D?r>6w>rZW48cWygM>cn^0tnuvHS%!!$2%+BmX=40N zVwaLG5LL=Dt~chr9y`Jwu-2A9ykc@*SNi>4qLDI6shF<H9|!VhSp$Ko7=Zh0O6wh1 z5hw7QqdU6?s;X9yEiML<IGt=lWiSFegWo-6Tb~*q(1tfvJ3E$DPvF4o@GJ*)V9$Tc zxDr}6LjdrB_wdk9Oa&EU*|LlL-UG-{rQZrHxOdh<-k%+K29jVo?dULHA_^|7`@BvY z+Atj&orlK#b!+Gl8C;<Q-#%DF9@7f!(oORrzzeH;8;jnxr_5X4{Q#DN{O@eqL+8@^ zf#199+}_+@z_ef}dVA>G$08q>O|TgkojaC|y)~}^&{zkS4de071X6J1dq*<t)VX6^ zUIabQ1ku<5)rt^+?T9UYcwvAA1ma^&2%Mp)MW@M&&L6mt&j#aA1I!V*1s9953mc%( zkJo`2?DBk;5fBEwF>NRe$7$~5By8`lg%X)0|E3Fzt3)fe4##^~A>~`^>sx38Hq!aB zkprk`6r!X-9<9hXu0gK#57`Gh&SRbYkweq~&eo_!^$e)1vRyD9c2*$7kqZu3>jChi zEeoKg!Ut3~A$YG9hR3(~yTvW&UPat>PQhf)WXx?@#wDOlBu?dXI@)6X$hr4GlKgN6 z%IMT3T){!pf;XTKSMQ%Y2-Hj|Cr<isd{SY;KaMHgCOCx?T^ppGo|=WwxDE+4Je{O& zX=e4nC6@r8!!$SpOR|OG{%!i6Yf3?1M~9V?{D~do^jaYtj*1l_7tL^jWEEnX=El6n z5ucf5rMjvlR!%@B2NRLGyi1!Quj%Q&c}RYO=D9urEVFM~+&0fL-8Cu!Q-7aoUuS^D zY#HCGp6(c2+oc~GxdGebalcwy9lW1k)zh3eSkT>_QS<vE5QOZ1ADPK`D7{hrc3ovN zr5d5!qKuJfC^nn`gxJU%G3O3Z{e)*78~5oGI?QaCF4vd$mxySD)r7&p#<H^B25G8= zkj1W7HTE%T9wayr|E{i*ioYrzB-G!=PZY;DL5`mSWmW@TnaC}$01J*(l20t1?{078 z#G7(j%gVbTG;c9&s*0I?XF8q=aU#)WjO@f>`rIWcfuaONCV_Mf&c$!m^dwW_Vw>pl zE|}fgx;h9Caa9ku=JRpogr=M9;;|q$@JH5~D>t@7ji*g?GWuzprrFAT9e8_hEG_in zuir4F*Qm3Tj1Y~{J1D9Js>d}TCPu#b-nlW?z4R&i@eO}cCmrf{rO7jxlRe`}9Ydm; zcoB|H(iEo4ClsXShoVcv5T}_jI(XSl$YP1J3N$2Hxn>MN;Ki0@TzNiy2sSvGAfh+m zoE6OWvC&|UFr`dTPIA}gj!a5#x33PT?4gDP9)G4wI?@`=?iiONXK|Xat^8X7#J*Qq zl$$FZm$pFJj-mq1eK}e#o3C!w4KIyml^9xgt=MMAtW?;<UQj=L;GDuJ8xfH8I06GF z65!us^45tC6PDZuO@qn;*@|8zZkiI8u-7W++p4wJ)`bC`X_1FU@dwD<sN+=yyBKz& zu|>6L6R*J9oo2~5<wTr-4vWd4v1pzBE%us8m(r6`yFo9p>krAzR53@=W*r&}B3B37 zVV$$-M_UAng%xx-fTQ<wz6D7xm>T(7i`=jbji{RYnH^48frS?7q}FLL*Dua_!lS~7 z>Y&ja0NwU!kd^=|go2>71iio>j!XzdfQvHH8~E%}1=v_=(*vTsuz)a><v70rfC2Y9 z0Z1@{Jif4e&x^W}a>3}PIw0klHm)|@s5}Dvv602nPdEAqmI%*u2>ne{+P;hYkTp|W zWW{B0m`Q4V68Sfc)RcwcEARTyUNK?mq9s?JAO;Ac`?B*c^!JzabNtz)+5DMs(@y|{ zpj%_<bPoN4;qD$^<5jRf4sR~RR@OWmdC(evF{U|HjM8T=##KC!d;+u4KtY8ulXIUi z;dJq}$NvLdBcE`tgL|W-eD={b9*fQ()Ncj0G8{x8?coR1(ia2Bx&#D?L*!i2uVe4Q zJO0r4@thq2AJQ9*W4YN?ZIkIkCDhdX7=Bx#Cc7mkk(nC(4xB{wBqVu#%XB@Fs6dLA ztC;M3zxP~s@<+)9lA}&M4)Vlg$ahyWNc1?8EG{R0mXTgk$Q)C$IjN1txyGvPiq8Hd zzNIf-IuS!3EBBo0M-aW_;MqL0`)>Ef-j-+6D_IWBt+^}*lC`ZlX!QliUJfZhHYK}5 zQsfjYCqOr%x6bXY>g*eb$G7s-sSe#}W1>V)#ss~AE$Ey}oo{aB_Y5fN#Vv)%-j$({ zG6_9vDMST{p1b_08xTID32VR+Kvj*bKGF!E2w@GO?`u;A+tY9|>5yc0L|>{OZ@fB4 zF%L@EMJ*$7S-jG587^~V+C&q?aQR-+>6?AV(mnyXP9i4()Pr-C0Tyut@I52zP?Vbt zRz}oL7g&+U7}bf@6hz;1u7=FuMfV2a=O7SpJFtwG{*cG!UEMrf-$#2^1i;zW8rlto zFZjs#c$JX+F;_bg)OGDidfnOy9?3B`!X<2(3A;v;z(@SUICtE6lSXlI2nXtM^(W!J zJj?xi#pX2Lr^>waKlJ9&!4JC@z{ar;Vzi%p&>6>{OTg7+WM9dux|4M!vGd-Cgv_Mt z4V4cjNpF*H35)tNYFpxS9{lF0{gi7(tSeWEi7j^?wSRKkPTWXG{`^-5^Wp~nSV6w6 zmc<cDa@d(u*=aMyW3|_EMOngYS@pNuZob=<EzE4q>aNM)Uw#wX?^HaSHgK_YsI(@& z?Wq4x8Y@Tr2VsFJF0UHQM%HYLWwvpf(YPVC&01taheU5&z{%$v9BXT<X=rd(NE2_3 zw{OijSXlpibmuK-cG@s&=2Stz$*0lZaPvn;6j)5as*UV<yogS2>CvZ-ML-lJmI9b= zLkZGh-2@<0zzNZ9E?|tE`uY<TjpKW8G)Ld<h^9>s?dshD*9zLIySHWVdslZh%SwF) zNJ^GEe_7rO6vl0b*95*TjO7+Nanz$HFqz{fkMz0k;x8GBu3FMES<yGh@z*oeH{1H| z3@3krYr6tqdr9Gc<TJajC~x9gKD0d1Bw(v2M=B-<E^IAAehdS_jr?K>$ap`NEGVD= z^wAFtt#dns1tjHR?0UzlS>pn&5!Af3B@o^w&~76G21od`53jWE`Y0c@<7eV74b)Y} z=1;`+-%hHb&*TkN2(OcX4f#(MzmjJBX)FfKecbv)mri@pu=DVz+>4=yrOE7FWG<<s zC|$aFuPi9t3G!?>6C8Dljf3?=#j4I>*CL~Gz0FX$3IzcUo7so9xsY8SLO(G}clZ6< z>NUS?3$0O$X3LAgu-%+Bi9L#$37lcwE<$TF+mI@Je`iM-v>1`bW(M>n@QU1Z09Qr2 zeqMzRX(7nxK%tjztVn_m^|-;gKj-e$AYTh(-ysXG=)mg=d-!PNQz><`>BQ750t1w- zPg+|tihI?&_dglqUZ+5;a-ODsDfwYfD`MY-NV6yJ?<ry+AW)LKq<h`XtzNWPT-#Q_ zC@x}idZU|KtMvEe$dJXZm6!5kWSPtd*)us=W2x%4N;wV%({raKF}hf|(o%JE-2k^V zDO+?G)cfTMI$Hy7@A|Yj$P%NV_s_6O>iETlt>~adHdI?{Nsm@Wv#!w~a`=^N#>Se` zAQI;C;;SYer0yV2d|U=ebw!#tPR^b0yh%=l++sP|R7H$BY4kY!5wlPt{6Lifw=~AR zi{w7qMyF&23`#H_)6(SzSC%2mAy#k)#=H5MnY`phRCkEj&4Efv98YMQHh(xKncz>6 zHrjaqtwSEX1>csUq$GQgxI@ucn9^~dIs>d0bDVj$e+&jSI@=@QwMZws_<hy-?v|A% z$muy&t4!^`fd`eZr|1yv{Gg;W%a#ZM7*rXPS9E*aiv;{G=@=oF(T4ipx1^Wofu8Ec zFX20qrHq6f2$%#I1!N8gh5w(?ELc<vOkAlIt@4o3cu-Mh95Pl3)ajB@4)Qlvi_*&A z3|9ntdrWg$WB07U5)YYiBrCFpQfglt&>y?9)+FTp#?d7(BW4l@4(rQ3a03iNjh<ss z@E5Fo`8M7L3x&qx$joxvP@7$G(AgJ2_8*k<Magt<oi)trl!jJ<A1yBM7v=q>RPLcp zN>&z|#z`nJyCQ2YnH+5PV&R{UkdsrRc|t}(oLL{RT_cTh+Oetus~JZBkB{%=6Vl?8 zNQ6%TJ1=tn(H%bpk%K2A2(%~2XY1Mzf?*f{Juct}-hdC3VW?#Y2xAC*SMUdOd;qEi zYBKOdBRyN;q}m`cttYL6EfF?;PH<^xTme}h&#DZWGBAoG{Tm>U)`4*L^o9@8JRrFU zB-dOs{67g%MQv$a0H2+4@9pe@Xxmc5RiRK5WLr~1ygJZ?oqh=HjtXT7=CRUUK^;r7 z6tbeFDC-hDMueY3>f5CtJcmRHOOaN1cxK7EWQ7k{A=_!>6!u!k`aJd;yaYet2e0+% zB@3H>+T{wh4Q=@bfu*X_I+UQ1Hbfib_~MPuL1RXT_@W&hR;B5N(iG8TR*sF3$&DKp zuGLPc_(AmZri*TJ0$-mM=SCc`l2%G)nW<B~sRiY_jNt%sN{IcS{V|HS(0YEUMJ!8S z9D#J^{$>J~{V}`0cBO*)t^RZ^zf^fy%o^UM(eljT1)9g@ue1Oh$S$_FW{5c}94l53 zE2v_!>28LP9%3LmVnopQ7*Ej|3_6|hG7Pnqehz!epa<byA0vv+fX_w1?^ARk{jql) zJ5ydWCo71h95$zi&FCi$>1r~NySJ7$(mw-m{YJ;aojOzD)Y{cbUag>ozSE@`C{+s} zNz}^Sc;Wz$l({&ti3mhAqpuum6XK+E41K<>(Sq!gT>!@Wm>D{>(8?rr<awR%RjSbj zv1od(TlGO5tAF=fRjfW?ws3N<rN6Q7N;wO83Mo^p@&QQxz|N%%(0QfBDl3+V-?ygF zXtY|NCQ7T(9%>@A!Q<auO{DfKFj|Htbo>hTZU~}aQTX?qYT<EK`mph~p4m>IHf8f@ z8qNS^T-RUJO}&vxn43@)!ik<=hA++=?Pr#kTe=sA2@GOWViJ!9B)EZTWx<$<)>e?@ zM)tU-eB8~N9&3-Hak6!=xC&~9kf~RfkTX7pfs8B(8Q)VTNp0Lh^ti-9Z8<%mLq*&F zW{<ur>j9}=(rtcoC%@bZ>3p?i`4bS|xtS0TToEPdCJ==-Z3l;teGvGDk&rqCK;tK? z2>i2qes9;^mSKm~=er)a_h5T&d%>`A==Lw}0_9hYfV02uI8f~D`rIz-o?E@R>#+ga z1P0}f&*Png=Pz!Em$$X%EvUy~++7UJfdT2?H-X~zRf`(Prk(?j=Wup&3$~q4V{ipl z*Volhb>&MtUXM+^VPD$?CXPoA^noq3sDnfu=;<Z(%KpJ2eR2sn@mN^_zdphcI{w|& zpE2n52Cx1s_JF<o5{!(cx9QI<oGKS!00b(^FIob+l;7QlmcaK4tf>ni5LMH1+5Egh zG4EGI%!d@u%q!*<a`+dXN5S(Dyc$%Xd8CMv!+)}fFG2GZSxEMjR3^oK;3a857Lp>_ znWKNtQXXgTKhlh$(tJ>@-dGU{MIxb46ck2?yzm=<-;fZAknnlzW%v;Z1>%*})#u?7 z`c?lbTG?BTSn;i%TR$bFvF#MOVSziR1w~>XRIU{dU<+0k$ajpwFtY*ppr5b|WL2*U zJ}QM=j!Sy@gcQ8}kq$^-5+Sl+6~u$;`Bf9o2^B#$J!iRQhy6LYtk#a~kyz?#$Ulsw zXNDh0YmMMHoapwHQHAy6ilJ11R6MlAcGqegGG*<yd_iIiNJPlU+;<CtYs6NdAmJ>V zdn>*<yUwW=qScv@PUDq==ay5WLSh@5wpjUxYo3jDA<}68ZdJ6g$Lwkt8~@^x$R%1w zqBSs(6^n>r)k}8<UF^-e;s0&pQ`W^nP-wUZw&}fndMeOJq*jenCzQ_xWddL20dE`m zTNJC*Lj>g@H(}9gb?&3e1u*Iv4LUnxb~uhk909`(L4NKKHgZ3fv>TqDdos5$jMbD` z)m&NKkL&D7lNPtiQmuD%-6e|rGD$`QuIW}^dk5fOL*?Z~vJ%+`YL+yiidJ@uo=D~1 z2j4WSptSimuD{HpyvnRo<BDr6v579UJ()9cxN>nCq;(QIuk~K-WOObhP+q&qA1b$T z9w@16d84@IAJuV5mDhm$yAV&Q&t<f9WCqdFRRu+ymXTgRpI5=hH{7d5{sKx<Q$5<j zNr<Iwy2QI+i9lKBpjxqN5+hA<-3}aghX+7>DKw+)s&XA1n>(1#NDR~P4BYqy$2qvw zaJ#WY<{|hEgdgEFcRX!B%5Z#q<YG5Ieqnt2LGN^0o4TfTN07+Duahkq6?`&<+N>^) zuj7{LU^2#)jp<|eR$Hnl+<sk8Osiu&(~&y_H(uELFp*oua(6wPEFCIVB#qnwKx=cN z-2l1}kXCiLS!q*}s6LUk3($Q>MX6}HB9lk$E9l4Re%wMCypOYiURBUeF;X+tIiO3` z;|7^j^7NE&Y?=&}Q$a5!331vq$P(VyG?&zKi@3GCkA4itIjnfI7<GR<XR47I@@Fcq zE9A4Lsa9!~(w_6W4jHZ{KjdcHbtS3~YIJ3oHfD0z0}+vs>K(Sgv)KF`?}?)=5yG-D zpMvhg(to48VY9t-Ycj_MM<Z^vePO{`+Dg5H+k05DsI4(jGeK3I$)=lfs@EEsx<!dy zFK#ds2%0LeNOXDlO&rrv#3WX;C*r60jT=M2ruL{rkjAoW7`$^ri(#XI>uTcA$I)IJ z$yP+|tmGN!mHm?iKjvB&X6hU$G+c>SI*bC0v$EO9lpC~4oofDO<CbW#PK*$ZKAoq9 zJYgwZTBDQLYoEksCcI8yX7F#&lHZC|TzS}4Lu#s>yfha5$NWV6pESt)`;5Nm@zlmY znI5oP{{T><I6N~5RtmC5I6$d8%7TCJC~x^`lX4B6wHqM%o`fP@yE_;|enq!<bX9CG zqW1eJ_r2kiUtAf;pk02Gddr)0X(To0U$toA6YtiIs!aJWYxBC5zc0eBy6gyG998>S zxD$3*qapjBA1zz#e@tFIkrVt#{Qek>G7!I330hl3zVX>b3fINmnWF9KkdHJASs$Q! zG-gH)92)VP4zY0zgww2b%?1_F&aJIMR)95dBd?*=^J}ZCYiq06-@xiqYtAQxG9UmD zet;YYP8g*dtYOzCh-iR8L*PA%+yQq=qz{YRfCorn0~s4Y)eZWM;bp0r67i;#I)hSU zG3u90+C{C|qA{p6mPPH7S*=v-l}f!uv#_LHfVXu@C6y<jLFYav6g(vq2!uj`FenHJ zksu^IBY+oz@boOzePVK9%krt+s*EvHD)0u+`r9&E0b)F}yRijyyr{!?C2)Q>wv9H2 zM~-=%v)IsA9)x*8UljuA>+%HjbzKhvWPinmog5*JW^H9n<2bXny0QQrd46TZwsH>U z<K&W<jQH}<Aj(aM^P!zQq9~puQnM9#+}wFtIyZ#g7lC_YqlCpt8X?A)=4ms!eMtHT zQ+3~33X77Xs~!QXrf6_BVa%9XkiwCqH=7H`E6eA}m*s-FOqwdE!iTKCljczx3bqJY zbp>`brR+9Olne`Eun1K2E!nk_l_sLD#KF#79F6M(7v_TzZizgn$)Mq+=tz0^tLt{G zx>iufXTl85$>qv<rCOubYScl{_cQ_Z1tlm2N|jK+=L-b^K1?n@f{IN#pC8G`{t@{2 z=i$xcp8)@90hh~v93qHK`j>GWR8>C;*=8qD%2sBxv}<%^C!HNrfQK0%w<Er`p3p09 zos$T)rIvObau%$1rFV+af7h~Wd;Ms52&KESC&n7+oB;#zR!WD^N~O~_8%hppnt8S0 zx5_owvwFbsF3e-{&~#C9LsEPvT{X#J{Z-?VLOj|v(5TB1-zx2D+W>ZA|8i-Ss@K}s z$&0R-NI?#&4gED{;m}Q9_eOV9OGb9~t*f{H^l{A9PcDA&r^{Dw$3{QMFDPoriGze0 z5#ZE|Sb^cc2n7MqIgF717{7+&V5y*{k_FCPT{^xcr-mLEJI#h#68)JfDddbyuF2`V zS>A6R&{R&>PUKdAVNyRGlRlNqEUK~&$GVX*y}u*3TqefP@`uvv$tf&B7iFeg+CN-? zo6z<{SX0H);Bsc+e7~|zEJi!g^z_*{8ZWnOW&hi|{<(~b&Rf}YsXeV_>f%g1a2s>m z3AUM{A_2cG-&9pAD{$G-55sf_)83ZoKi~SVZ~y#fU;4u5|KbZ@jfl8#F5<%HKL7c% zfAO7fy!Oi1z6NA8*y>(C<ckLFX%WWzH7w&SX0S#8O(aaNJi*E^((GBM`~WMp@S4@+ zR~-cPPOsO$;6eIr33v+K^Ui&feK+6<*!HcV1&}I1x7W1nGc6zL_Lg8)|G{nysNDgt z$Lk#j<8*P^YxDS*w-5d5T_46Z54j<~&$0=!(CvYT7ph;n(UQZfUx5{lzU77dD<=E8 zA$XwOUta+4@)*Yh-PSu=Sb>E-uf}aZu!n`LZrbGD;r;$k@Bgn~{pPzb|M?I9_B+qL z^sSd)dg&|Q`SPEA`>Q|sKi~VC?_lG0qT!f(ZTTL;Sa~7=M*c!u;{{Z}sioXVTFs4p zxPs+m0Mhg+vmWHRJETI8X96P5fY)+}Niz%{HF<VL@xS_Cul>`%eDw?8`1%Wf{<ZJ_ z^%pOkfBxm~eD5EA^!0E5`1Mx-M+>c?gN|a)zjeM_`A(?>uJ>jB&n}Q(?|-);={LN$ zb#V{EIUwMAkJlLnHej+GE^x4q|KmS>_l>{*`paMY#`(Ya-1E<$fBFm0eCL(#|M=%W z{n{(P`SmYA<$?<!Vgq_3{TFrbWndThrsBsJ%6~-osN>(>_y5s5`N`3M9?LAl@;r(% zD#6<w88QLQavLV~jFZ5DBMz<`9@yf+KL5RcdHdc!|NQ6QeeS}S&VKRv^M8K+nQy=P z+K*oQ>1$to?fc(4nn*O<h<>|ST>ZfVNP!*o*Rvm9KyMFz+(o?8{^tF60A@U1M<>8C z)O`1fcpSBhyt_s*Z&O{nQ1^gi^04Q)D?79U8);<#*0rAHRgUi4CoP;|V}QJ{z;l*q z6o=$RA732c!G+gY+qP}jGD+V+0T+~><&&y`G4uX!xZ@xk*hs=fvLOfF=oYZVa`!9= z*2>XzE-*}?pzGFurCxje5C8JQOJ6<r!t;^mzkK1DFaGtb-}&B8UjFhw{`7m`9)|US zAQ*YgzrDMzpun(R@j9PHPS3jA>seiyvmd8&eBuPSZ%9th?_7=}_LkMG=1f%dH<Pco zkSZRuw&y<}wiS)H^h2;f>~uYDtgfSxHNqXNw25PRMe}$9zG1X9n|%{hqK?d^5^;6) zw5=F(kxSx8H$Z=){rlSsdH*%@_uZ=B{9@oklJ5G)qwl^G_b1}z>&@7xz88k_O-MId zlXm~Tzxn)EfBn1v`0>lneev^O_~O^U{rzvg@YC;o=|4Vv|2Ke&ht@!@0be)j2asUw z=)Ro5ub2dXsG}2vr2eFCqP4pzw>L|G>%GsPn9p8pk8V_tni#_Zv{#lhI413FSG1A` z=?#<1B^m5t6Rtr~*EUDg)K>+OE_NcXHNSG%NRtWBZfWK;KF^EBqc29k`G&CU{}O*% z+41pu-S2-@Ta!KYNqcNn+AK&L?9N~wa}yeVC$=a#_N{;Y<<&d4uKeK-|NZ;_{I@^- z+xP$MslUAN@;|=vufGF>4;H#J2NxW;N99(E*)W!GERv$U^AJWJc5|HCurQu=!@OmI z1?)(dg3&On$j#X6;_B>-HHEfWuUj)122haDG@etnQJyKaD-7$^Q2K6WLNvczGGzmu zq>T%zQRB)`jz(NGZ?Y_*0HKkBhb)VW2}LuRRm_UIgU(!AOEJ5ofFfcn3=>|@Sr|PU zPj~~FQSEEx6T_^@vC)SQQc^SX^D<)Yn`2*i`q^)N`IWDK<F)T&8)yxcU$%67Fsr&; z`MVZurLF#1R2gpO)7eOj%fRc?H_IUC^H2v%gAVZ@5J`#c)iBur)xA<a&|a2bl$)MW zTHVxMlb>)S>75rMo_*z|FP{Ia*Z$5LzLfE;YOIv+#dk7B;8I`Tc_ZrA?`j@R-KS(v zcnB8M_{%N7<X--z6nsbQZ{B{lN5U8_dH0KvXTR{}FFpHL|Mqv-W?4g4@=tR<;b|{6 zeNuxBVgBQ&na|0O+I=iTAM2-Z45OBRIYe`J*>?u*D@lLxwHFCqcR+IK^AYF2@r}R! z;&XrVRZvl(U0D$g;q%$N13D&K{zlA+LhQBAP7Nk2zZaf|MKt<Ts5(?9`=o*<$ouE_ z@6!eC#Oc`2M?C%fg_l16m2bTio^sd*KopGn)v0Z8ES`?~_`M^+ju@}W7Ud~fA11dG zlg>Z)GR33TiF3Xh`OMR2p8Ncl{_-pTA8kF3TEqJF!|>8J2DmTZOl+t0cHoElx*BqB z^ZahFGV8^&=P#Uj>cua<c-|NuudnSs=6AJ^T7d0`_3xQQ0g?-#Xp;yK9WNUgokz?3 z@iidi1j}Ura0d!KkFZpc;U9R|-}if;25=NhM1TcL2P4489ub5CJP64M;1PQs6@(hF zP#5CSb8q-r1XM<jfXwec><9|!rVW1SU%v6)<tk!h?C(liuf>&)jS%`qa-NNN>O#ab zFMa>J-#l8$Bb95n=Bm4wS~QUUE$YX9^x|^%c9GcCagQ&lJD^no?W$7O+zS5xCrLe+ z@cC*e0P)n2J;Cqu`uzTVKLm-xe?ehxeP?H|>uH<<@?jkKgWkZ|1BknZDDo)ZA^4i3 zfPi)wfckXs2k2;lr~~jj2hR8p0|76*jJ@ag9={j<_Z(Cb-N&Li!l&G{A++$)&vPG^ z+6LZw@y!P>e*T3wfAx#srY8SC_TD=@uIlO+J~Qer*s^J+CWaRh2&6a=QePmV<Rt_W z;)KwvG0orta={G)wsCK=iY3{WWfj{hR<(Msqc*+IsP{Ib=`&}4zja2EW%Ay8pXc8D z{c|5IpP6&coU+$mYp=G~T6+N(92yY(gZuBi%MaTA4z~A5Vti{#`3`{gV?Dcp9f>I^ zIe#ht!p9%QCe|Kf*7ysjzvvb~yGC(90XCnzr`utf^f6k@&t-PFcn{Wu8afOK<{e*P zI1c};4L}286wC^=Igo?y^M<>Tl8&@<Ay*y~2)MxK4aEs8TY}7apEuCwwt1;WzbD9R zclkWXT@S_++~_)&cQHbI>0Z3i<Fuo<kV+qjA8hyz#SwlJu3(;EFLM68lp;^8L{qA^ zc0Kr)m;UfgW74Y+-}TBXU#@t3%dU4nS~ZUgnI{VS!L3XG!$0I}_FP_nNtx4dreq5` z<d+lZ5Y?~73R3nR$Xp-Ocqk?wGc~EL=cYSkuHu0XQKua(%=qe3!boXtR&v7rjLfKN zSOn(NAXY5wbhO<t;_`ZZzECO_0Bn145a@NIteD#u03yI4^NM{=r_(2LI~=}1rwc^x z!EY`fs*H&c|Lj9oP$+_z_d%ici9EOrwLNg)^9Au9JBZ9h6hOq?e)`r=;=hjFy7tdc zJoa4p4GaIUZg1o}D?_=!Kykozi<jPEK(nA<RmFEtPV|p=kHi4r-`fDNTZSbUvJ36T ztf{tSM1FMjjdwfz6foB%0DxO!Q?vK)&O)7>stZYZak*!=6<;>6ZupG=aL~!d+6o`m zcnNem0EWjKj0jFYjsx6C^~CrEiUqWL3G2cr5IcZ!jF12q$ia=%P8TW<c!NB2D|!rf zVgMsH34Sk^7*O-x5Ulxth2Sy3{7OSb>wE7n2>-(qe|+dyD>r@l$?8Y$eDt3Ye|hPd zd7L;PRJ7#wJ8luUFt{Z_ylR?T&RIx+4BsF5EH*1LO&z?$Vs)a-w%sv4>0rGFEgm<b zNZsD?XotPp13SY*jdWvf%zFo1<S4Y@!8j*6qz|G<bOA^oyFQF<012>}HxQ&vXM%iQ z7byD{{489IVNSOJA~$-A9zhfipaGwEF?EJO<ODIu2ApgOG4<-|kcaPGut3al0YQuJ zd6<7L_>GN!`qMw32;#XL#R0c0Uv{H^xZBRQvX)%d-^Pvt^!KrhP+<bx38Fq2GNjO6 zm1<-dEyl{LJkkWImw7J*<NJI!cne}<PA8o`6MOPNAwO7z)pw|oymz4wWyt+)^I(1e z6Le^40AUSZ;DJCm(YhPZBT>y0K=6Bke~-)V_PB5*4Gm8iz;rs?C>i7Ch3kP^T#p`e z2B3d%BgVDW5BVZMuBonBbklu5{LyXVK(WZjEe~9H)7`)L)l<I@;6!3^NJuEh=>#et zE!^3#b4RUWpZy>K&c`h~nBOC9V|``Tv8qA7$~jeF`gTySU@f~ls4M0c<{)x_@Nqf$ z5G=L_Q3SEX7P&?yZBA)HO_TO;W{(FBOq9@JkTO0hS&ZOiG?~MyMi4;$&1;8wMMZIh zv;6c~d<XHw34qCk0zCD1Tz~7$ciboz*|^(67l=4fpoj~=haV0$wxc}PT+Fh^NEE&A z+_a2m$WE#~y1s1xmY4%?#3TCh?c8@FQ@3x2^GC2zW{odBYJD;|vX*&W&Ki2$sHFqt z)tzICZWNuq|L?s*K_53Qf`UpUU`2M!Jb1=@{egYv-hlxGfDMScJAM5jeFOaigMFR- zaG>>Lx2tCW(cJ?9y`BC2Vw~^|Ea}I&LHcc=zpuNikG}bVfPP%T56q*Zfr0LBeDeLQ zPdsc#)+l9AEFhhty6Ns)@44^icZW;`V$vh<=Ahu<uz7(&L4Hl5>m8ZwL`J^zR6jy5 z#Tz|amPy9X=I6!b8;WCkPXB9n-RtAF__Am64kTwHIZ_bEvrZ0wVhQ91yT$7s$Sh8& z&%C7Hfy%duHOiX$ga;q`=?i9|aFIt0B%=%jv<c9^TPg82bB&H>*2Fi5v@|!iG)pAS z4xDsL#MpI7ShEv*P0cQesJY1}nb#tbv`Cuknk6lbzGfx~Y8k*-Aoxg^D>J~oIWREP zJJuuarb!A4vs~a~ZL6bPhc?>UKB*;1ypeS-+x%tg@$EyBZh6&Ub?aC1$_>iInz+-Q z+qWS(ep=C(_2vV!fa_M?HGDDu>*VdxeP>RkMQyE_%y{ch5C80;dov&-fLLfvRJvq7 ztv73u8I1<~`3!;hG#Yp#hb;ifNBy2IS7)HHv#+PyjW+hcQ_J;wX|LA}AF;iM>-P2p zcA3nkZr&&|>3Ktl5nj%AFacU}mTY@dhfsnRU|hAxW-Vn*ZSii<;Vrz=tr-{}G7foA zC94x_-|&3*vnzfY1&I$&iHop+8GoM}og*{qeL7C-(lMi0uhsGT5Vff&H!nN;vM-y@ z3c8$~m7AaA$`)s3XN$5gPh~Tl=dy$om-*~@S=pJHSp^!MUZ?fxf(;sV;~18;W(x&J zgn4{$U>G9<FB1)SqIei05f}=cW6}vx4OB{(;J{e$(fo_uE7<;6n_)&-y-HVN-hnkY zG0edXC`MS^^{+S>s0xwM;L``_^m+rYzr$c`YLgocI%AhfR@_pr(<!uS_>Hw%wMH*( zZ?$*0I=FT>w$Y9-Sx1{Xr$ukj>3Lm<)}T|@AphHiqzUTe?v|ZjMHR9{D78Gh%d{N< zKyK!pQjOT%R2#Z#+qZUvy*eCJ>BmX6x;_IWUoy57-qoHIx0R^|WmNtFiNaJO!9Q58 zX3wI21@HjP1MHtxOA5A-D8j00-bE-jM5TjJ$j#DnCAX;1RU|4X<cqi~-lC8z1w}<^ zQnkV-=VTuFoeJ&o1E)_V9y@ioS|-WQzMPhlcj2Ncr#3Gm`$C*fYjS8^T2AA}X2<5z zhU&CRb4k12sO5E`z_eapixr~)vS4qRSZU+PPD%RNV^H_+lD=&;tpB!ib4+7j#!kZ- zI7*HmkbV-ad^@}G-IE<_H*LzxLH#W8uXRyN-z&~v8#nxU(I*ERWjnU??Oao}8;LXm zf1LGpkh&f~AbY(_QG`N;)i%hg0OsvusNV-}7~<he{{HIguf6JcjlJ%DjlH_?wbx%> z`F>MtQ)2`Dc^dC%PCmA8TWr#Styk)+FXx~5Hs$d4bBZIWX~~C=$Ew>E4wYUNCYN<+ zils)KR^!zL>CJV0$ZeSgu&9z9e#cn!*?^BNmwxb8L&=sDcDX%chb$2@VjmvMd?EXr zE9{{6gQTXfo02mTrzrkgL)7&hUmtc|sy&ibI$E(ONqX*}>P+0XNG*mS`;M145V5RI z=pDBrDl8$rwq9{YqHR&OjpY_s7pJzh%dlMaTVHrKvn~8)ev5Z=$d=8Uw`~4m^ESTK z)h=pl=i6>?X=|=;X>Dt4ZI-B-bZrVrtGcUI)vB*(k{eYjAExxZT82-PcD`C~=&g{N zReC)Uupd<5(yx%4SVbLcc#UPf-GnO4eFs0i{OMlBx_!lUZ+@183C5D9n8dYdl2y6+ zpYN+yM#(QVz7ANQG^O2O$UgF3#=%v4bK)!O*YA*}nKSd&DWj*2uWPV*H}8S{M4A<# z&8kd@KYH}w!OLf(TvyIqirRMIDC*e9uG-?;%x~g0`!<O-Z}M&q+q8Mp=FOjfvbn9p z+vaQcw(;$pj7Q|a^^yx^6=fCWm6hdXmF1P?73D?w`GwwmF3*?m&JWDX&(F(q=d(PP zFV4%)qx0Bu_`IOBcC%V*5HMZaN2Kic3Yn%W@QqElil8ubPO!mAHremx$Hu5o3Y2?~ zWrU54V^SMp2o~dNfWO=2y}`#jdOhC32{$TKjgKIp+%symV9A<kkuYoVPZKlmy^qwT z37g%hG|4;EI+GFgmwOc|gF(-;V{dKVxN+0QO`C+zjhpz5Y}1m+jgcESMt;6_YlpP0 ztrh=UTllu%R{Cy1e=KWl@4#BAp!fR5#@a^gG$QN)M-BCS18WpDARL0L_cd^hK7>Vh zg#7@-MKpRF=2Lh?V{M&AXVj}bL=or`5I;gLslXPb27<E1QL|EG7MsLl1E9CSHV8n^ zpa>eIvk+?!m6L+f%3gfey-M`%D$l!1-&wW#tyQnT^TsQ0y}Y&!%fU7`OPcvcPQo__ z3;Ruw<Km`<TE0e9Tf^gv$IOtZwuzUp7F>nREfKZ0cyP!|IDDf<15V@T)}_rFlTHV= z1WAHFb8U|xSP^<eLXXLEVCGd|A;Vo~A&o`Vz=cRD!>nTYVBwGiT>2XD=2#rWdf@LM zGun4EY#GK2#*WYDuzSFLVJNVQ<YYcAAT=#5l}`&lPv7Ym(k?f*N*dZ)FSjds)qJ%| ztJA9WI*k^LMH{BmYt;FdbMtcZe7P)-&kfDX&CM*;sZ?r@%A;axmx@!5sshz2wN}IH zIK4*~tTz!af~GJ-qDP+bR&HzU-ubDWUHo$D+nt)dJ+0fTMt6VMbF651zwXQi$tBE; zoi6_S<@m~ITN={K#0N(NkuL-!&x(A=P3ZODt`1ATmj%OZjiu_*AA!gXKUu(I2w~9V z^Lc!JU~xfiT#c9AE>#-!dQ(SCMoY8oa=olc($Uh<(%#b8q}4U(v{qe!US47H=*2pN z-m4EVfW_GLoX(+NKw=jE4LS`v!l?@~)j@y|Or&0yc8$IAabZ+y_PV-Ls0O$Tvzoe{ zm(M0;Zz)dFpI+T?Bqyh+>Vs6Cb#FTGX-(rg_0GQmrtSYaEtFKcW^xpR)a68_OmFpt zrk*OJzN~Y!)6l6<Hz7eSK{Lvh_r+o9Qs!%s>vcL)&DW<+d=ayI<B^PAM~|LAc6N94 zzD8pMuL;mnEAb_*FnV-iP?lXM25Hg09y(7j_DKw)sEM9I10sOxuL7hl8A?yh`QoxM zf7{W`Hr99LmCUs5pB^sL7wkT;^W2(sWmWZGe%qRjc@p+i@$>B;eOPdcM8>WyCEo>z zRsz7Zwu9Y@RpSrsI+6VOVN=<+=^4>Sx1?h}u2XQo!Mb6-`vq?t>Vyn`TUla6aH>?R z*BM&tWo79lDJg}y7xFLWUo5;(nbKxx)KO@ctWp3?uX711Tmbq*>jA}q>a=d?av~iR zyC8x1z#i`t!mqmwsPWKi8yQPSclMu?TWe%Fl3~nLWHbyGG<A=%%rZ+IoQk1c4zsJg zMAb)Nokl?Ick~zmEDs!vH#nr_s)mk=Vu?jp(%h~;U!d@^q^?nR*GTM?1`97q<e(u` z7t%qoHJQyud}715L0hM^$O7b&vS|#t2v2$^TJO*W5HBFOoVq|0m>E{U6;$AoE-<ry zqD`0{nF)9O?r;$EQy3KUq5m@^2>4juY2s5&zGhz&-?*@$v86pT8|$+n{8a(PQKSPo z;B|Vub)KQNth}tOyd3}CWdY?SO$I;lxaKxUq({FBz3nDCGWj(rAwRjiu|v;2hUUfT z^*#Dv?cAtVvUkB`;bY{*Fl0UKda_%g`(ebwQCWN`BP%QWat?oaS$0lVW>!{acILsO z?d`dxgMHNsfdlD)RzG^7wgTH`#L$`@U4fllW>crzBsQ8%UQ?(MWB@LzGkQ%7c7)Mw z0wLH15+PNgmt-aNrBYJG1InP%%IfOMQcnqA8U#69QC01$3aThAE-5MXl?0TQl>7?d zd|gt)=%BRNR}x%|lcmL_d<hB{l(5p!lG36!%<j*qxPrb1w-X$OK~9@j@U(<Mvqd-_ zSQ9_Y!Y69`Vm|xgSmKFe?Hz3`9cV8#&#Svp-&9#$RYm`+h5uER?V9S!D!!Uki7TtB z7{0?QTTCW{-e^$Qc&oTdUlmu)R|Quz8x7!15Pb%n4r;w$Er1k3CNO#J%9|8&g__sQ z*Xm5&il(}bepq3?PV|*pE^lk7t>x=5)g^>7d%L*D0dZnyCqt}q_|;ftVGj|@J_>3! zS6mb8jhYgIhU;;|mn`^~e#U$F-ult;krC@aKfby(ofdm;r+s`JO9TvAy46OV`-ly) z*4+l#qH9;{Z90(_4PRDVQ(s$MU0+vIQwP|qYRb#nOB)*Mpa=NsA0VZm_DWk`c5b0o zTG9Xwp$UH!I@wrXlh=`xT~MIJ<Mg_^y4ptS55Mejv76BinsW8IlL@7`wq4sA^~d{e z`@;@YB}N3HMPGg9)Rw<I@vqna{>T9zyem(j2MYdeg!w60(BxrV!<SBwGS3QT+;i-F z*~OUCv4_u`KC<c3anpfaC%-*+^4rAiiPeW1N+WlGy)k#I3LLjxrc{xP_ktap4ZQ9L z5Ug0JBezbKTiYf@T)#%6S5<ek<zLCG&&<oI&Mtf~uezwPw!S1OHRr5U(N<Vo(3D-1 zUzc5wUsF(2Ra<c;CHJfZM6XxXOb(UlVBlbE=!t1S1ERSZO@;F8(de><=5}@Iv$rm} z{<fv!AH7h45?mg8PkrL4P1~Zkzxwt+k0Ah%G8x3xbJV11N5HHJ<0G#qc@&-aV4fec zzRPu`wMAEo5-#UAo=vGP8n4SL$|^5RyKpKW3l$F~?)I@Tz5^K6w<|Srm+oG@q7(!S zKB#RjJ96~Wr7!pGjrqD%r&MYb)r#_y`%lK4Ke{72_4rRtq#lV&s;^cWTk2%0%2PY` zol3lTDlX-CeA>~N#M;VMU0r1}xT+p&PU`dBS9QLd$s1CkOgbJ@*(z5VKD_CU+piB_ zxR6_#gYZeOrKkDK`PI*FU-QDdYvQrY<-b8ZSI<S2Td4Vj>e~fW18y(YBga6-sAeMw z+JGm{10N<iPLRGw#y$)89F+C<_H>pjHEMO6Mkm)mDBY`<9?nQfNKb4wG$_h0)Kn%V zC1j@5>eOnjqFUN=u_!O+d|pysO7R01S}HP8UQS_buW3`XWaeiSwKmk`ox5_Wr7EkW zt^%^Jx(QakUYC=1`HDc`#L}iQtu9w4pNOl05?=qar8h1OyXj}Yf8g86-ZZ_Z&)6RQ z!Gj_H_0m(%J+a$)E!?o>W+#G)#KVYr5v=5Y4ME^Ga7{ktB~J3KlB|Xc9o|(h+3(() zF|ok#D>N^8Vp8I{q^Ned8x&fV)Ty~%dnqF^_0XnDV}+zmE^BL-Ha5tRowcyOyuC>y zZ<i}Nl!#&D<h=BTj^g@@Ir*7NS))oWQ_7W!4jF>2`Hn@!4LE;MYBa%{q}OOoJQS7? zaCp*^0rzz@4O5QAz~k%G+MWxG`GA|lZvDfbA1`E|ai6kYlm7H0zx~C_@2-A-^F=G* zei#&vP{&y{WtPI>KJvMtc?H663Y0=rp^7~DTd1Nuf_@-@L!FeA0xpg&m=8UzO=(oB zRZUH8KA3W1M2Y!YekiGLmz5V>iH|P4Qc!p)xv;39upqCx_0*}0R|+z7qYCSCe^Ops zSykDnSIFeB+Rvm{*A-kjlUh?$Pz~u*R<Bpeab62XCo>sPvRfYpbo<9MX)yw{isa~1 z^*Zxl^85w&EeyH+KYn=UC*$8P{?H+<Jh$)OWxsst*(d+fY#al$$hr|rr^ho@cb|oJ zT5}cySc>Z-?<Eqn;mrwkcqa_{Za8Ro&%EAIH>_`^LD2@60te2*v_Ab0bq1|QZ_uP? z#AcjN-?u+CIi>+RwIcpN)aer^axYvs|IO_OGkSq9L1i|`_T-(sbTlt3<NVR%C)H-0 z_v&vnD))V}FX>on^r58qQ&AaasIt(f(H3E1x?GuZGFCD$Y;C&v`d{3C*Drr^{qjE@ zx%j(JsuIsU6uMyEO+Q$C|L?22N3R9&+BKVj9%yGA6d`y8;f>;Obi17&I1`nadA3V) zJR|>7#@P;yO4_8P(S)W#$!EITVe6!(#U9R%J#ZpEKCQ~6(`iy;;=YQ#d^tL8-vRMA zNu4g;B7@>k>glAT#plwa_MF_KFuEYR)v*VnQ+6jDi;q5g?wd3-VNCEa3A5uEm(g+i z_UziZae3IUAAazGU;g4p&;IuHZ@!E<m-gn}^A_HC-*rE@YgZu!(#^pbO%}{J14-Xp z=t6CL_>M4pWJmsm(;j4<vfFJ~2~A|PIP5o0So@kPPZq?P%C?*;ybyP;MXBuobUuBM z0gAL94%NHJgn=rh)=E1xQmsNRm#MYz5vp|xwNj>OQ`Ae9DzQ=nC3K-)E=AO-t{riY zYL(uOiQh1t3TztuObx>hTIn_5#U%VZWd6Lx%NG3nzF+?0$3MR3rFs8(V&|dct$%*z z-rK_O{lSCxzg0!xVG$0odUp8DvK<011bJD^*{M?S>JTNuD;0>c<YmaSka?9%5vWw4 zxgG@)YY>LHSf-Gx+gsaPq;2_4keCXok4zqo+NWV!UK6A>=wSd6z20ClYE&96<Rb_V z4ryJxK`%Gxv2r>H+NWa%rVlZY%7mVwQ(hfhs?=Xz*by_Tw?LF-iu2L&zYD+Vh9y7x z?XQ+EzxVFje!4aA!LK&F6TRt{d+)vPm+!vu&|@!N!phQ=KO;sMo4{je)Xh=QnP(B> z#{h~}DOW&1Xf+C6wNR;2E2ZEEfLJDz+hj~}H=R-{lp2*>t;v=HL;4QC(`5Ry6@C+P zBEg+>V{2Q7RNf{*psGyL)Y{hGrqChjPY2DOAR;3idNb5}PS7)_EsANANL{W-J|6q~ zTYq`Ojmw{W<o3nOZn@)k&%W`*W50Ri#Wj!q<QLDs_esLG7a#f(amjPRnp<Opl!G6l zY`fd*98zc+(;77L+74M|g+eN8mo+!Ym5p*av`=2S071002TUsEGG6YJT_-1`wp>=~ z!B9Y$4k$%%AL;Id^<yA?v)ce`+tA%(HW}1<RfkNaZda+*I^B?<<6zX11CY~Ckod3Z z;RP`W@n5bub2Rp`g*W{6*UKLN*`2rCxa7tk|0HtjefQu0ho}FvZp|m3to^d+z_RsN ze&~M;6BZlxLi*eLJ9L?+lA`w?O^J?8RvgSr$ljk2AAeA$BwWb>0}_K|KB-I2WD6B? z-QM*o4cwDRH-hzck5-{jnaw7n-fUKb#dUNUVA9I;Cauh*Q0UECrA*xe4g)$Bz#!`e zSR!l@<}eD$U=g%<!Fny1CmcWZ$FN%-x&NlefBxg;%kNpR>_@+N<uAW@^qD`t``O2z zzVgK5kG=Wm=LFUbpg;uWO-s2sT!d$LKv8%49KCJYtmEf)9Xz$~>!@_qS5eWa$#MH* zPe~Ep93YnhFp|m&5#fm`76WCVPF3n*B`A?FMVg#8GvRD}`sr$ux;y7WX-$>7RV8ha zq@6A=Zd0ffZ8DisDTljcavB;Nz9B^fNXb4CoI);km!O!-6OJ9e|K@w|x^>B){&4?) z-1V#57A(Ev-oHJ$Z29j#{NSD6E#$d?pL}?l^tDBR3|<Gp9-rekAtJn;e9%5;e}}TQ zxTCeDv9?*#Dz9y;kw`0&rIHR_K93k4jWAFh55#$81mktWs8e5&Lb)LB=+XTc@}M&} z=EUyk&#HTsii*qU%hau{$_`z}b3e~eD>RyxQdw?eYh9~aCJZY*=8!;xexy03K@)^E zDc|zA!~1{r!<(1gIsfrDAHL@YPdyO4==!DiJ^jmH|M}Ao9u*^aVBQ-U8KjzA3)(eE zTZZxF@>#pvl?tswsRCP2fp);Om0%x>phD5mk`rXaCcW?~$YdCC*U5o3g*;CN=N*CO z)ZL?p!PlZ{Q=83Th7Ff4>dYFs+VJX+D|AY=R&SOaO>LH$v<i_1EZ<L+gfpVX@mafK zS`SfI$YM@Bd+*)1Tz}KTdm>-`<I`{aI_!qv@EhMv{Kq4&{Nt8@kl^{@uSD)9yJ9YA z&^E71H7HWRn#(uU-%81Ke0xYoJ2LF>-_?Et674#q?Fhi9Zz-Lo%`06<J8d~K4Y=Yo zRIq+c2BS^`)kJ5~NcCD3SV~2jfkvWE)zfxCflHN~wpT9(`8wwMhKOm9pSVIAxBUlq zEWhREr8h2K_1U_$AN<#KHwVnWVa4XhmfiN?Eh3RPFzk1mE)$|qgI|o9#91A3)@FdQ z<3k}2M?Z2iI(f6mVDg#gb(%ZD15Ehp^q4uL&&=Z|hF|zjW)3q!ER}R<;mU^(06gOk ztxf}n0F5#5M6J1t+>TmEUaeNz3YT*z#wPF#I)-cndc9ckU>O}_Q%XA&9W+u^M!i;R zH0iV$aDnDp!Q~+Yz5>R-FTLUBn{Qlj{el-ZtXaM0)y4DX1ueSs=hp`>`qhd+P824- zb@47RdoPC-pUCHR%@~7H<q2ZW0Zm`0PlH5P_=A~-scC8^8102T!&DmwKLa-HVx2~< z0k<yb(1EguBN8PMZ*%LGp&|#6Coph8i{Eq#1B?MsFH?F|B<z(+pNfHo-Kr%@xk@Fc z-;^CvjozdOEqfrF;Zz1C&L<~%h4iasVsT)Qj|+bI{Wo5I>G?1(7j!+x1^?)$UM^t4 zq77h*S3#N^jzS=XF-M=KzfA(!<dcgON?s8LIRz7hBrvZCL^snnr}Tg~Qp0dra9$fB zO>j68&-UpS8;k~nLM|nJNoCNgWO7~=qSUskpucP3g7WH-hKfJvV}6Kz`lUd#zO&2F zX@EOW*<tDgF`##@svQ(?rLBvNj*2;TGWvLQdPPZ5#)Z>SQ74a`NIHHz<<f<?6H(De z5^EIWSK+(1dbyW90=>%7r|xa*w^{5qyVYu=EL$tWkg(&jTkTFdoU%<#(ase1?A9q9 z+AKb6NJA@h6bvG}E)etttw<N#-Y98qhFp+_S64}D8l@PXaussrI!Q0o+^^M}$VIM! zr%9MH09lxN3^>&4+geQK`ZhD>rCX{SnmZI40gHkf>91~RHZX1gy1Et18lYtUjQF~$ zK>1h%=J=VtPu<hjW3lM_^pg|TQQhFEWn^N~I&M<-*-ag)0sZLE@Z`A4Xq&KDM*FoE zi*?jGGC46ZIa%8ZVlzOp{s=waTyHWdJB?^*WA5qLG@9VhS6)ttE`)}x?CjS!RJ22F zWcr_gqg1pRX}(-ntuoT!)c2)ruk6ujjfU!%FBQI6(WzFdtGB)S_!DVnIGtwZ2BvE^ z8j&?H2(Tsq)}rZgbxpP`87q$gNvfXK9*Z+0_d;Q2M&{|P^pZ<*X;wvQ)Y;zB!u+gr z{S9Z!dt(v`&$sI;s!mnv^hLQTCM%$-X$4&o<&bn;q)$xGK6^B^!K_!MpHGj^;z4Ik z2^r_&i_N&`c;uRcyUs)VTt*6L#*RD{XkB{XKR#_ET}-8XCv?A-SA<J7aS=}+QDf*S z%h#>^=^b%BfXh5R=kY&=>)QDlGM1V9kG#DXko8*aHD~fJWSuU|N-n;b)+{|zk(*wi zYA|%1xiC_mUNUf@Bqc%7QC3xSUa87UEl>h`e#i`95hS`2F2sC!_=~JQv*ekllM-^l z`@4#N_43)%#o%<hi-*4Y>Y1-(ZLJSB7vyGs`%I!t($-$~Lf}Iep$oLOralt#Trox2 z$eSK{pt`-IxlLC3#pnO{Z9*qVTJV<9WX^PbNkSOW;ar4W!w7lylwWLhD|^~{r)-n` zW5Yeez5P9-#!JS@zOjLxq48ns*g(H!Xkd7<dvFYC&YffZlA%e%;NTb*M)m^+1_&F3 zn8!W(rg~|kq!s}w>XNL?=t}_3sLL!#iYYSb)cQ_oSJj^L9a6<_B=5ZO=luur6m8OW zMeI!*l<ghuQkm-8$ImKYFsK^edUw@J^-8E-Ij^o;`>zz3q2RFq4=$ps;9-;@=8)?F zIo|s3Y@X&sABK~YpXyQewD;OabmIoSt!r}1F>V^RPELX`SSP0@Ef(7ZxX6TUwA0lq z@79@A7RwZGT`)0e!6<_eBhl>9T~9DVHbc&VjhLJBGIGjbit2)kGBZ=lRBG@@jk)Al zw%%lVP%o3#p<+JFG4P7)dLxu&Al9txBuUntzph;tncu6^sVhF)cH&^A*^jthVXE{Y z^7@sS-TD?+{}rr-%El(GY}BDeEkZ-fgh9)Oaz|Nbi)AtoMSd`AJ;Ele=60Qr3%FH= z#X!F!>BtNAu%L2H^?-8woLBN%FP09UE2<eNNY1%Z-P%}rxwK@Wu(Birs}2=pjjFQ7 zwFMW7>k0>^_{n*eN%Vm*Cc!UhqC{^+bdb?#hDU_gg#%Ntjo{sqY1$>kEw#7kNC1GX zfJ?&M0Y`$!hYe~1$H9Qsm<)z4JjH-26jI1ino=dN9|d1Mgp^BlX@B#d&*i_m@tyYd zY<t>s6NmGk-}s9B`K0nU-n-Da?M-z=bmg1tBIIivaTU)<)6$>Z@jL*Z|H*bg;NMZm z9u_Fu)=fj!QJz)MUetT}a<Tq$TGrW1vh>W9jFg_VjD(|CqLYeGYb^De^1`w!x#g26 z%`o3G>1RfS{2l@ID43zZ)UZa{q1UvlO(wm-qCB8@Sb9d@zzLhr#2Xgk*k~}BRVtlQ zZ^r2`>Nuj@X)rMrK2Y=9@*UCawY_WDnzWm@9!`6QJs10MeCvxJpJArwRlm(Tyq<mW z<vY&UvfupmaMJ7SU4S`n<DO|jGFR*aztdpS0Je?lhk6XwUVW#{VCXiPyCH|W%%gc` zv;IO&cej3Ya?oa0beXj3af^2{%s+eyNaDCaF_1;O<WJBqA;PB(=7i25Z<Q<MQbaz> zJu*>Cy|*EdA{H8ajp8<W3xzcVRy9iMCBC+KtqR;?nx6T8h>W7rfvP{~_J8ep<K#cA z?<DPe;xCt9nfUYh#}qBky;P%q-O&Aq=A?i5K0WkO@9u)_U)+@Wq7~KB0<L>8?kZMi z<M?=Xn?TOC9#wB!FWg3xRvQNL6m1asHh$^`+a#pEb$AjdAX6<<Q}}PQI46Ur2Qwxk zfi+=@#y<x~{sf;+z>+~uRu!l4VDrMvk`%#vtAdPy{&pwax$@HHA{buS(`u9&jRC;{ zwF>=J8YUI4w6}c+8(+WbsO{@FW9xGD-?TpaR@&eTpPo)oZBP8uKFx0C+PUg8YwD|8 z`=T8?>Rx&W)dB;S^}ml~T_LXa8aGQAbRK8Frmwx%;-26pv05B9HtF^6gH(MJ0ni7= zJviZ+2(9bTL(9R~>j#h?Ad%_j0UH7ufl8bH0fVta;&ECk+s8%*CWgl}R;Q=Esm1BA z7RhWX!$@y`-H6+#ZiBku55}2}S44g&`H;PX@ITTw!gP^Q#yv2@b?2rq`VbgLfpt*T z(CmQ;ZrnNDZ1+Uy_{2ChQfK6aHj*vv()lg32lT4O%8`+#!j@Cto=m*7C&4^8RM${F zFlbDQOF4EdHY#e1a&)xyJ8dg5Nw00o97mO&B6>+H?x&`J<x~GrSGmxK3=P9tq&P=C zh*M$Ik#+6VgFFH#IQ<Yd^2)%KhEM9wpU7)-HOiLrS@9<?Cto_1DOaisD+<)A_T*%E zS+lR4PiWN}s?kD&f2uo_xOu6W<u;D9fYPe|$w?-*rEAcGC`8Xaj0p%9XhS7xw~%)` zr{&~FB;2DD3HQ{2;}c?VCC5ZKKJhm(-IH3QRy&O5`A0B^*+-l10ll^<Atx(0CpSMY zFF&uKASXLJwJ{;*^5xvzjLgj3{QQF4-261DAIor7(=b(+3}^0>T`C)B@Q$=4)lE1i z9TLo~m+t7OIHzRtKA&_%+sO3oD1F8b#%XPhd=3cr=k^xEBG#<*F<bfif+4$O(pf%& zl>-0W;BtrfNutj}6g-KIC>oSZYapWg=S_}R%k?Uflv+0&p78p0>w?LOgr5w;M+;nB z2NMLMM6atYE32xksBl%@R@SVmEw8MoF3ZZwEh(?4sI06&%&68}Gb%*2_{B<}>=nu0 zc;$O_dyi~RI@6j~v2}YVGrd;QwBf6oclK4TmT%Z}rSwBRGCs23GH!b_8<C&^4-~B3 zA5gh>y8#nParVrU$Fufr+lWO<zdJ~Y+@WOHL1S&bmN5ZKcK@ifO)yL7l?t-~!N6T+ zZ)cFX(`f8OX)V~zot)W&Z?c_H|K1!7o2d)4i8qq%1Ou!Sp%vy%ld-$2d#JB}aKJkl zgt`p<y(rXh!_Z)-5#iwj{RlJf@9FGP=2`_<@242h5;K#&n4?Mj>e6Lfp)vaMu`>Ck zdd3@HOjeX0e>b<{%0y1}&LexV=t{6V=dHiQwCn_|_vL8v7awbkS0S+O5Ige8`zc$D zpNt5w&LK+DCKm8WsqvCF0bqeW1`Z@(5!hst+yoXN7RD8*l!$b4eA3puBkt6><g@4a zB=0#6IbA&V*g2Lo?`+b!bMzmZ2WNuuotBcGa$`z*dh)sSb1COi&s|7KNj`V($k*TO z-m}}YCt&xUy?fnz#JhKW$?xHI^Ls+}?%Dg=i<>{gA_X8}47EPlXJ^}EVz(r<IxEj- zzMWeB4vM1bH=dB1Bt836H0?ug?K14xnFr5(;o2)@U#kuP_}{g4H7z!Ovl=NNK9rNq zy&{*scNS}R{(HdSA`-P;l0EHx;3g9m`=r={B5RYJ#WNX#J?Kjl7Wd>L>`Yj!W64Lp zIUE<C5O<1?pATniLPC68EItyv@j<6zaU9Plu=pVSj(t8pI3Yf9?e@>(mL%*wlyL0W zk=<XM`1)A<sf4rVp8K8eDeh_7yic*GZ+Pm-r=EWLKj8v?>Zzyc|I`2cXx+PIGqL4H zRGO3ZVVS%kWG_&{BlisARmM(cI)z&4-wAg>tUG2y?E*+p`2fzO&%%Unw<X9bC_*j^ zBD*1Lt|OJW)gU!a*kIDwtiGv07~7K*-YHDrK>AKPrbOtCsSvAe%6@A9fz+QII&mm< zZ&qJoT>8=InA4SZ+ve39*RNl<e%-pYpM1K0!-n<rxBj!wH>`Sl{b&5zuyt$KZ&(+( zWz(8U7n>(&!X`||QoRDK77Zh;Ph@jK^h^UKVxGQ#<20BY=P7Aw3VL5#-xLr5A!!W- zawaCGtkx-?HJE_1SfS$w!bxBieh(KgHf3q;GQbJO+YwWW_xi+GT+f9WRF4BQih)>~ z8k31Epe8Xt@wT|ii{~#^vAoKH^T}DsO^j{(WYfki6dn7;wr%`oZi{<!@TLzx*tT`k zX784uFSdNK<<qKZDlO@2k7P$uJd|-TtY?@lLc$YX*Z+ZoUhB<OB4%*Y{-P$V6^1|? zFUtaz{uhQO=bbL3J*y+okOT^^!t0sDQhyU-i`D9}K(0aLSvV_g-bs&T5mDu2t64XM zgtI9pB3pb&FhXjfo%e-d;u{m;F09H;8F)Cbp{OsyY=d!j%I>w@=0uJm3jbqn*=l!9 zK^@rf$|s+$1uEBmy5?hkjrS9_X33{(-h6G%M<0Il@y8$G^P`W~ybZea56%A8XJyZy zY+SF{)|m2c&8mumZ!<Q*wV(cMOVc|i%^P1=FvC`aHNUvudE$8YrqB8j92RhYq-nQk zmw~V>802&G!0TvopRkOvNLY4GiYya$a3BvxBad%v(E1iwCR$9|Atabhxv(Ixmw5uc zPArN7*b(6aFr41&>_TD|`T?dTas}`3Ar68^w<9kV`U5{cR09A3(?=hEyk_<4_xRQG z-&?(U)qAVoe`(d0jgh|1AqWsgJn(wrLP8jRf5*v>51cL9*R=b5NA0!^C8zY#kJ^~) zjjd}-OUkz7*FcL#o<UiDLF3t&+Je&P&jIQm&+e=gRW}F(J;$d)d1ecFgg-g^)qNfP z)AT$Mf{`fjSI>lR(us{Und|7>c#By->g0JOX}EX<EIN4+lFN8h_eOvR#RxNYJE#qr z!@O?_VGkZQl~sS~qqQ3_C^u~Q;JBpGRUe2+`&xM70sua4ct}VC>2GO^FH89F)6<8y zYqw{7)O@jD_U=Vin=*blRace2<^v6L9orgHA+Jw+b>n4eWz(ww>Q6b<Cq$pM`SEwv zY$3fY4CF7s)F)^+&;h3P01ohQ<5Lq0CdVaa-6-0NmHvd_1vr;z8XQSSPIetdsUY`` z*P>{zn@u4f3jncsNI?P8Mr&A7y>~EVU`UVbW9FqgM1Yj>L6pOV5SMA1G-25JJQLlc zolaQO-4kve_3W7wRWj{JjO|5HHs;fIyAd?f*Jt;-y@)Xnc*W(273~=CBMKED=Y%2< zOw$^hpjA#nKn6l_BkhtCbaVpKM;vG3x^V$lS^&sXKr=;WAdFC8H(obdDL@DW4Q1;u zrxauyWZ8>t*-1Icxfe4sGfL027Z)GE#X)KHD5gTy>7gw$J{VbPgxXmT5R_x&O9dd6 z(ZCJOa*x?IqY^zYG+INtI(lBPChS6M{VK9wRc4d(fsOApmZD4od`Rs?@Cv5%fdKbp zPHlct@}WaZ&m>L69W6L>{>-rpClcf9OdBJeU~QooRTm3nMOHKzrK0>T_Bs45Mt~nA zxXG8gK7Eh{m+S)<^pvAei3^!}9Mbs${(j|9C8pPLm%XVmPdZ6lfz*>Z(9BpKeeHdM z<w3&&3d*>3V*WVz0G3~!+u1}-i2X-jgS8X=c*jOv)`?N9v%J*R1P<z&f_-U201Aum z!>_zAgm)+Qu*Na!@b5I=uW1fcd=2;5{_fsG8H1-fCH>N#sFc_a-JzkXSd`4)bx3)9 z^uRWw>1b`&XhZA3!R9@H>&Zh|tHRq34>X-zcY=+d+La!M^4OyYZW1(*IlP{%nGj*r z09j-MIzURH0v{l4%QqQJ`yeb{&_W6L`4cUjx-mdUG={HPkVQ^#xiCbT18@>SNPPo$ zya^}4`!IwmPNbesOG$y>HOXs<!pePgYtRg?{BEkz*m^8rBt4XUDzWet?Ux-<c}Z_& zM86i9b_!)oj=p<l&AUYh&Sx2RChtuwPKxR{iWua8zs7%+xJ0?NGO;bHg^i#2iq>8j zjodIQlsF*9H#-R>NODZ6IeJO6CVh((EfmhQfVo3Q;h>fTK*ABX$0h>U7U&=R<YGa< z6W<?p^4=*Il0%S3jx=K=jw99)qd5de{!C&@Ecf9b5_EYNNSWfoyll9yj~@s@8lumg z^z21Gm*s?JmVkCB_lYDlvXUV~FySVMwvztlO$BB9&L1vNXKFX>KfLveD;*yyPrd)G zIvr$k;P9?b4jXgyc^f`W-LYyUCNXvIKhO^=kJhmzAFWNe#NzXT^sRXbV{ClyL3FfW zJI(e3O$dkkD36^qn$}*D0DyT~%2`~3#0wNOPw3w0l0{H%CR&V|K_r7%T|N|KgU}PB z7Ms&6hIFUgaIZJmM#U8T)dAedlm@~*AwC`}loD5Efna>dieZ68XA})hzP8X7tfYdd zGNE%QDR~O_&PY2Gt4nM(CJc;D4wx>DX-_ML$EA}!0~dSxK~^2-dwVnc2CXBlmm2$x z-mb|rvh9HWZ*5a-anq%`KEA7*dAih<Sf$V{7*|4B^w|;3vn4|Cq5yl3UmdkTtaAe3 z4gl{0(AS|$NX`??J}j3EMaF|dkWOy^3Ll^vK%mW^OwK$31T62p1&hE|W|tMUc2rME zt13%cDoRV6n=6$(OTogk!KM_4)$K$#QH=%96ru#dXa&jM4StG*M{XlBAXrfS9C{@@ z!9GB!1?&S%f1s^?%Jh+C059|OAt4TQET|_uDE4M*`{Z=nZHUMuwBXf{*#f4-Xfa9z z00KH2h){h3-~rT0+<z?UgVfZodsB`i?u<XS=bNLuW74pK4KfjkpYlw<w=vt`qWTfg zT4!-KkKib8f@9ERavFUmpOKk@=*Vc~O#wKGbIce>Cq4zDKEjz0?Bl%A#N%4p7-G>w zjaZ<d=34H%gz_OVM*{9EkSW3J5=<nU@Ckf@K$&IXWQ!TN67*~U3r!3%1pOUGVX3HJ zfT4v-2FTXL9)=p=N8l>Xv7yWXrP^TbcjRctyGDAEIo;dc1*92W?0V@rrtU!glb53K z(M8kw|2JVuT-huHqgR%fmsKES5y9Bim6d$ejTMy@WrE89q3V^Tr6m*(kN*gWe-WU+ zjnMfC#Kzl8f{WS#=}e&<(z#({fSJGyp0)&sfl;DHyI>?uNI;6fA4VIRg8CaUNI;Bk zLGQ%i6KWe!Bx(TFHlVSGv_mKzKDGphJUBA69(;LN>;7|R`SUC}DCIy0D{jDIsOSe9 zh9-EqKf<uSyr`t4yrxalT2ozHi4?qsdYmY&Y>>-aCAIK|RMweH28W4KtGLg3Q;#Xw zfSC7d_=^AyZ^N`5ykrm{;}9*RsgSE|=6gnCF=>X7jxInZFjW@{b)fnLaR!es5Y;J2 zOp?t&g(#TsMo=r@LHYnV5p)znG*9Za?>c6dcc31jN+IuLqc3gc>lZZEH8hMs^9FaB z1+c2|(U(_!laO6@<=tQY_`&tBKk}b{`RiX_k361wrFeV9+AS|W`rz%4F*c5AAox+? z6PV2=ndTuh3q%eYasmQ8i%$@Zey88KeL_4AgLfKC`u6x0GYNEsYZNm<*MX>ju0wVp za_pcTQ#~CZ>L#qSh!fDIG16%HMJtk;t?nrZ63TL3Iv#Z*CcglI@I~k1LDNvsXo~Ll zq*YfmoK!c<+RD#tUHR-w|Ftc4?bq+_R4bIaww$Pc-Tij!sc*mDc!H{sz^L!hjw{Rh z58wYE53cyIm}o=P)i>f77PBe>SqsxDkl-^Wzae?qMka0oo0(A*1jTv;;7u#mPyz(S z+UtT^6G)mIS-Ch8pbLfA6NnOW;U<sER$8yByU?Fptn5&zS~FE{rpW3?R(Kenh`f7* z9Fy|-dy4L@X!_#R#jp2&xp~81AAfFD-nutmcx+Q_R_w8TU+sSFjlX@f>u^GDHNkf1 z=;)!<*?&9qROt(+Okb}1=a(S;Ks|H4eta6d*$NHh6(tP_sO;<LwUWna7|>ZJVAzs2 zZ6b3)fC@Cn2TX(IyA~``f)GpVLZt9Ak83nrllXaTUwq7={jn$aN5%FrO|e!ET@Y^y zJzd(`3e#ACh_F@Jur_(igCA|(_SK)BeBtxHUGJa$>iy`v=s*2z-Qm~X*%1Bm+P|*+ zoFG!Za{BDLw12WAA4F_6Kf$`6aG}jj8@gD=Ndk%DVQ17F!q~0T?sD?<Lbj7CH;XM0 zX9y0ajR;a^$qVd*bp&}QfIDkEKz|{9mV%!JBnl)7MnW0)F0T{FbNloSl6tMvY|^xt zyCfa07N*G`#Jb9%=X$JVs4w7$6au2M@$;R3`PZXgU5I()7teoO8~ILA{OY(X8~=3Q znyeR}-jwyqg|p8+Ns#hyKQ{SR%AdPG+xJxQ@KcRNfA@s4fxRzW<P*MekNQFV4sn9d z`Q7n?0t@04%s%?|0G(o>kqA~$U1uzgIrg7FyjvhsC>MS*^+V_cgkn-?gfYkAHP`ba zM^2?QR#(?lR_4b#9W^#^ooV6(fa}-&{?SLbes%Ug?|AHyS6_Pb=trv$q`dX#pTB<o zgJ)KM@y`o+AG}2XvckPAs%66m`yA`n<V)XvTMgn2s$o-W-fAQGt_>^l4?f;+0$TkO zHM}qYeG{T_07dLH0Jsz;A^3?K;lr1hbTkwRivnAO9)!d)k<aDe17YJ5U!nR&{6Z4x z7=m!i;0rwV$B>maFL6{DraqL>1n@k-?)=M|i^<6;=Tb5|q2x@_wInM*zEutH?)m2* zpW3?h?YqN&w)}ygKE3tjH}@xh@#n`6U4HWyKYQ}UumADRM!-BaJ<T|mNO=^yf#=6Z zv#D)@?{m^JC1^4MAXz~vC*|BZc?%J+#7IKIi;9_oBu5jW7I~n*1PNLd1m9v5c!D>E zR2pn_mMRDPLR};@Aqycmf8-MKnE^VIetjt2gveY76YIH?=P1K2E&X&dZ?ClC0sibD zbw%UGEie4^*N;B-o1fmZG;HbO``5hqX+q+eCze0?!87;WeD7~JzWCItS@2NHM<7g2 z#9hzb#{Gc1pSy?qlFQ~Ub6MOaE{Ds-_8b>Re@;#u9<e;16Rn6abE1e9KCXiEa={TR zI4*)kHga6}I43G*_>G}taRtXXQFsh^*w_l;XOU!V;+o&*bKw$Z*t2IW0>8_!+GC`P z6QxV$Uev^imq$jpxd1Mm#qeBUI6VrN7PG!NkHS?rjjNWkv2ZUJiUTwzB4RmezD01$ zJ)C$&#Bv9HM%d}LVJ;XaIIfsY;rS7GJ}wLAxghLw)OOUJ#(g|}uJCdpcoaa42uC#9 zazKki;lcRnIyxrkh4*osIFjx0a0}?fim@>XTLlm?P$VoOl3@acTj@rhq@!fU*b2N| zxHA%`BR$+g9173Dw{UIfO1dK4K!9<pFykO$#W-U?rSIi*EXFa);oy0AgP2=^&&85( zT!BSgDH&G6aSW?|FWQ6SJ=D|1ECz2tD@1!Z<eD!Z8#5GBgYoiZ^k&0YINrP>hQ&mz z8lwiMb1PZ8n_Id^I5QSL-QWl`DZ<0ud`*LeYpKD2+0ESqM68TR7aAPN?O~BK$JF58 z7vp7-xG)m$Adn&fWI7OxzGo{|FyWYsp}xl@%n**2;;=XpjpLTj>Eabk5)rYIMUEMG zE-aE-3^cJ~bTOS-5Xn|ew;1nmaW`GlUg1idk729u6D|b;$EY!WoCwF%zYJ7El;{7v zwU{lZOQ><H00o-QA^3)l#~2^6)KENwLi%3CidTXpRxpEy3&M#AJTMZJT8!pK%xx~6 zA)5JLH`l;cx~K;tK%2$$t~OUV7FvtPptZv1t+<XJN&SKoLTjgwnZXyiWEGvHX9(Y` z3``OpKwZLf*M%>~xfQ?)7rvY`e7AqYiBy2rm2(?>Ej`TiFGj%%(8H?lbTD-u7k*6# zFQ;C(Rl)=^`)`^&Hik}GF*`=kK1A)J<Ck;G$CxBC(m-4UR24zk0P#jd3Pe0j65+xb z5K|1>gHBlmI9=Q_w0}7>tXu`BAia@#2&Yz|BRt$q;bUW~aOo^j;5c&S^q?aej)=s? zk)ZN)y6L~`We`4*iO{{cgueGgg3wohGcGSiofv^L`iCz1BOOCq;1ohjT<BpiPXqW3 zhIU{KVamk?(yK7~mw<uHX)=uuwE0GmA;$S^ley_*KcB!G#auW(Z!IQ1@!vL?nA3IX z;d7e|21Oi0;FKV~6~qU@HN(e99DoNBbDbi#3c3Sp1Y?d^VWkf@_$Xb7^UEWa_X?jD z@Ni<irF26*gv8vPJ;iheqA2ix^|uq({hx0C558v^1o++DBluebA-<p6%kAQJb9=aN zxZe*DMkcv{6(Fu565&!HE;6FWkJuHE+^iTs6ItNrVkYAPB0x($B*h~@fFi@n$^YgW z5cBdLC<iMcWFjGIR$AyH8y6B0xm=(z;b9iwJ~E=0o(l@XF5ZMsE+8CZRA8=qX6_@R zo^1r~10~Mfhh5x9qzMif;{^kO_5pI_R*)_dh!GGG;p9U6PY90?5#<Fyq=!2o$OEW3 zju}}_OcF05>IG>+bHJ^T_d@%wst=Cox1|%;4US}xsvH!Wc@SNYtr%*C6&}b77+J+) zh}|&o4UBh#fmog(mW5$9GnV`U*T)vj%3?eZf>g8;Vp<%-VPJB_9*E}ard0><A@B@I zID~aEai<l&;u}^$H&_XVC5ZqlLMw<3G29gjxfBC=7s-VQ;ueA_eay|>OJ|5r&GJpZ z5G8R+LQIgbY*oZ^FSh{gBbgluK@hnLyo9cq)(ODt_W&y5GLg5CpypN-7mqPC268i< zVLTI%EFGwXg!IhdfaB)jJa833vY9vqLn+N0=d{KzBI#z5pMfMlV_e+4X?biw!(Cu% zB#Qi^o&$rYchViCYk9da30omB!eT}=fL4(F!<jj)AmNKv_#!#LNfdQ$BRE0y(IZJL z29Q{s5wgT?sSUH@djVjNVdx5>383Gx6+E{TT8f_=$ISKxgc&rnxqShdk5+)sF9)ag zcSYFMuJCc8KnOL01YMvY=+G0>f>JW4C;UPggq99*CN$$t9E|M|1fIVcpqiB{fkx0r zI;mmqYcaBX%&<IMGKOZ{JtN0v<)B|cQ9G_mFSLV%p+Ipn7@3i@&~8Y!`UwEE4E-|L z0JR4g;PHvkLL|rx7%h_UIqjg{;8x=7n4lAb_=AW{Nwx)$Y=d;%BRrHOQlKD_oM2mc zeBd6xC?uQ+vU4FRkiZMUf>VCo+%6a^7>5xnCO8iUJ5E3rq2~qloh%t*MG?y<Nq~_s z!>9FsA$+7<4EMjY{m(_s|IQQXp8wyTdOdeDcL(<i?#JAA?hO7CxszNh{!Vg#<L=~c zs}Q;t(ja2R7=1W665BMc1POt2tk}Vgf<Nmy53HH`fBOx+y@#zZK;H^9u;SuXIEK71 z2-n%Tpj8+ota$o4usZRZ8)JG5S3nv?!hWLxK6^Ql&D_iJo6LV9;oT}+>}U55n0PBA zptTT<Fp>aZ`b0-C<D6Wm|3Q!#P;g)?I;Uj{jzBYXsoxUB^QY!mg18iNWZ?>WFgPIz z9JGhp$#cQQ5E{i~j))BmSCOy~7n7|fqR~Lq4rxOA8a`)CMZb|o`Wy`dfC~8#3UtRX z$r#-=e_HkkCT1wup&(iCWD*}iXq{mAh4>9W5?FyGDrN+iUqH<?a6Ys};?Aou)?z%| zd_jy%n`R#Fb`1NK5#ai0ATFCR4I}*49Sp}Mf-wlQ4O;sO;#J`WSd5H?`E5HAAF#u~ zpkcWQkM?l)2o1by=*`G7@T`akycu=?$*wsKM5l(25eEbn5O{ur42NLmcqgnW7_vCz zIO=E!4}p#19)la|u0R|DKZ0zF05=3rAV~$(2vTJ}EJ(i?!j10f=AjAGcHNA0ivb8= zlC#om8o|&QAa=mkNp4Z&Kumu5gT~>I>@+bN2i=0~8_*iAz**eq<`&FpTru;)&==9& z&@^BqlB@`WnMr1u(6Yt&#M1<ejo2%_Ie?5tLGDe<w`-aO?Fwth2+b0#D+na0O!ELR z^(gfjns-f?F?8ADIjw?v2U!od3^hI&qLxfTQ8*kcL4uVvx5MZ*G;2l#?je?p-k277 zGx!AHLeIoF1x%q0f(hjz5d#$x>_BMNq8SSgN+?-f=$pBygkvIn#TeuoNKKG%f;gIw zHu>e3&|!W`yV_whQW4}!s%qqn7`)nNXc_SB^baDkltjfCZ(%FoblD>`%*TaITWNS0 z1{{z+7l|}pMG|O#^QQ$K<P&2+68!+VB{b{1c%<K!kdTDeWh@5YeyPa8H-#|?@dP2| zf<jHGUruB;E60|D5rUc7hzVoqI;i$!Yk>>(2%q3rLg&NyCichE6ERGB36U|861K9O zQ*j|+9(y9k#_$T8@WLK02u3oxsEku`K`SuDVgM)npUWCD*Y-mS{GV+9kGx?X_x<1Z zJ@9=G{NL<>uF{E}6R{KU6-|}0oh%k!W^Q77ukrgm?)yGq-}eDV#rJgZeIF2a{GJZJ z?}P8@z^^HMKNh|p3*V20@5jRT_QLm^@Ow`9JtzFX!3k%)5G|akbadxv>?l_Z?`5#? z_gn7g+%g1R$lzO5;(R^l;!-h>mdeF*Nn8{{G34-LByt_NVi~to_*=~l;Es6iG`F5R zi21ex#I}@jJ>1W5eWfT=6f6qj#zf1ww-Jf?9QQi6ntM?AdjRuvH*wEmX6|7GejI>T zM9XPKi$u3`pL5%|Biui^e{ipIzvLd`&LX1o2g2Vf+<%12z=DCdiI$1NMZtL5YVK1m znR9cKoSk!sMBLYSj-Kn~2Du4tm}}-%aa*}`E`z&>&u_SoxVN}EwC`>FeT?6Zpw()$ za*^nI(Ve&^mAfno!Tw@wivZKdc()W!R0HzOxIPxY+$g$5v_y0Rw}X3+JBl~ixk|ie z1CIWR?RoBH%szg^S#aI;xbiOU7$8dH99%V5$X!9d{E<6^wGP8Xp$Jx)#C@M}6{5RD zKjciDlUv8V!(9@EV}BTvkbT^LagPG#4g@20q8;yH|FH0sE8G`=>vIAA)!eVS$GJDS z)1rl<h1@v)-r@cZEO^lyD!eIx`wjOK?pweWOdIzM_apRh6?$P<Bo+m7TL9%hxF^x_ z54aDx3!+=_-VtE!ZJgcDodZ?^(H<@LCjRzehT6wz(8Dj`=tK1AUhJ($Kdut~9^jtf z{)N9NOqr<B?hb_W{2YCL5V4c3pa%{xJc+;_n`nXPc2LEa-22=it`zMa<XmWPBp})b z>Z`(?QuM}afcS6tTa7k;jAyEVRR!h(2GH;Q9L)iEIU}b7%oD(!8fP{5y$S6};%Ybp z+HK{=ggzO=b^SP2;>k_GSUHEZAncdms2xXG5{YXAUHgC)9iC>!6OJQ-xE0Ur#3XzQ zo~y%^UAUr;E5p+~=-Xh?VvLh^Tr+_C9C(u%EwWP&mSpeDj>#^;n2llnPa86rT~lt3 zSF>GA)R938XpLZV3(INwuxA&R)S|_;eACNqx$;F9hla6yo!HsmZR-*D4*4{6cVn>^ zE$(R%V;ROtTFyz>7{0}=mwShqgNZ%;9#oL94hq+IV!c37-#Gmsatxxpgv*5K*-5>{ zhh6IwvJE`6{s{}7z@pO53FI@0E!{R;XQOcaels#+0v&xrgNR-ixhLpXJxXW?AywNw z;88M>X-sUz%D*glgm+s}VgvI_bSc8xvD40i&7;iLH#Fq!3m6#cvmld)1v>^=)5Yv! zT9PM&XFqnLO10tS`Bo>^ENZV}77w#|QF_aY?3|+GEL!QY@VR|HjX4)38F{3AoXqQS z*&Q+u>ZxNLT?_J)l#>o8n?i{FvWmF#1IS&n)9OVo$586gax4YNCXAU_;4a7%bzb7Z znyyO_+itTL>V0J~X;=giO9*;xMkeYsiU!@h?H0#azY_H(+`Xut*KZo@H9JPkgA<)Y zBU)PrTWlV8$a)*Dpu~&8)KuFi9YxkS`wc+S#YVPwU9tCPs5f0Up@cZr6>4Wpd9dT+ zfvT#w<gP<k&Ydny!eS#uk)0p3UOFMWxUZ-|TUPP%{$`|(?`|A9eyVDhGA+9AKuhAG z>h#Qpy8SxUe#~UK4<Xs^aQ^vdL*iNei6bMn5|*=HRTd{daM;XPs)X?;3$l!PwcloT zA8ktix+*szx$CIx!g*Kni6Ilf>bcWA*liiHbgMLjNIw`DGV1!fI*mPJR<p*?h9ykL z2&_qyo^Q>Jt;;IU%{bCFAfEw?wZ*e7AH;r{*ZcX-t;~Tpo{^5{HzuCV94d<%PRrU~ zRi{<N4KP-FW>><+oS~TVsk9V%(cYKOG$9#(pK;)#ET_3=XND%7WsOIrvVzt#^{1mM z0P;S*sX4cEYfj-;Sf!&vZMow4;zC_C8_I7$ha@*M=Q(y#ajINhcCLx#=}InKJXLY7 zvN2w{Ewcw;nI;yX00dG-224n)Lplj6LQu93*3?9O2;}8~_yASE#;s3HDUa6F71p)% z7zC)?!;CdXv9*UQHcE%Ts(W8RR!>y)rPQd4$;Tv(aZ$Y|o0R7z2TY7Lx0RQ-U5t_C zpQx_WH&=>IBbMjpW2v?ECP}8|!o|T-b}F{9jMXcX3srGgUH3P&u?O3lTq&9TXA5;5 zZQb@-mUn)zG^VLdsX>vDlL^&jEN%CNj=m=S$%=;l){>~?q^QiMqdn;vQ-rJuq=tFj zSJ+~#nb&3R>gnt5?dk36?=gCjUCMsr?CI<4@6z@6OLF>3zbPu&UY^~U+~29}?;AEM z`?_>Jow~usxa48Iq0eYE4D|K&4xlVpr)IEA?d#(PZr7Omalf_`Pr<|01H(NTx{<-5 zp?<^AsIiM5x@k;r8Xg)RFbwq>2Zr#&;LxzXe^}S+9lCw2Tir7>G+-JW92y)oo9Q?6 z;GhvTj7A6a1EwL7q6d{qEJ&WSaFZJ3c#l|uts3L-P!|d%g_x-VacBP|fgu{}<?Txx zPP^UhL+%Wv>LSg>?r`#UEEJD)OP@nL*6ZXQoE@bw?7>)Uz={7p2zut=agMein;A=S zn7qay6S7;4Sl^W)w>8LseIpWMLr{kawGL^Q8E8=^`rV7oXIx;yA>D&dD*wl0W4MYp zdhty)66rs0<WT6zV-|Iy`6#2@iIPt~Glw%vI#Jz;z#)hPu*|q5fcAZz3^(~V+`)Hp zc&{CcLP-aZPs2pxqt(pHg6y)9q2VEZkV8c%-+*tB$2aYBC>2HD44Y^Gr+xJ0!;yGk zaKMA}p@Y~N7#<lOrmJoq9L4d-*f7ow(nfzH^vMnJ!vRA$X&YdJQv=+fYaocu4-DGz zG#)2B*u2<g-pz2Kc(g_3Z|4ZLGjz)61$7Kty;#E<6(77-530vu$!Z(EX{l>3zU`i+ z-m!u40UUU|u3m_O3DqQJ0W(^r$JK*EG@g*rp)u6p@ZdidbH|ON*qk1*+e43XTd>(s z+r`85nrmNg(P+))K4islE*Cb4BqYOeln{q}IS#pj98y?0m(zKZ3zd+HwyZwwob>VI zgB!b9^P8U(GK-ye%|jA6Z|T|C=W}{Pb0gQB*v4O|<K4~x+(Oxfcybt?fFt^&NAgaw zu!m14j~Dols0oY`^ju<}R()+dCly+&x!YyM&2#}h#Oe&eLxg8ivuVSMdD!l9Ila}9 zzJyov&aG)$|6c6p7nybcrhPSMT6cb!o&RS3+V`S;u6e%PUEWvAj&{--@n{4+5lh^- z?9NbnB(+rNiOJdKQXf&jh<&<iJJB>D?eABZvAPOD7A)M1Mc#!Yx`h+=>EU#{!}&v2 z{{?$)`>_`%o$E3_SY5~*@2ZZcZY}!s?57{9yz4H$?RH(q3cqGqPen0*w_*7fJ09b6 z1_}>H!Y*~L6EJha5A+TKfSM>=bZ!4Fv6;r(RjsXhT6})G%j{^1zssoe3HMf<;hjIC z=i-d7=^OsY>b!#=)E{fyTJq-Sc?ZU_{`{WgMBX>)Z{;1Uk94_0_>x2X$n$lmkws7u z=7dHO;Pku+Z2m4`E|HV4d~K^jrwq>ip5ESZym5vk=z5QzaA?;eY(I24tS*;f*kc?= z(P}oN9<w=|edCTP`;^BtVzW=VTtQB|)#<kN<9a`d`1_suh5Cd@nEHq4YfdYuTnf_W zkh<rA21%)M0X<peo*{<VZJ;V(N{>uy3>~B#0(GD^fiUnS<_e&W^bq0VH$T}C=@F`- z8aaP}Zx@wAbGfmH#g6G}?BWk!_;iL*FFUb=qv=OupPzmj`it5tj1!y^de$ZMrca=H z0gwJsL_II&bu;4yFn#^-e?~m<pAYS@G4aVakY*k1J-mAJnm3z<39d9Koi+p3)1;>p z2@v}I^n>T1HM}2-UgvcJyuyb-5p)ZUJ;LquMdMUk2Vhed_<NVWiL?L!J(Q@Hh@R1? zqAtS+A%u4>pxx;c+L`f$#+OCM{qm;?(WOAh)`zix_ct4%UzR;)7@@|WK;x$jUK^f3 zt+5D=r{|6PUnz_}dMaKj(4tGYV#+DP+x|bs-UF<yBi$Pp;F_LnvdP};X787>^=_}( zB%5rq+3com>ZaLo?>6qnV2UXQ8*Gf}z4zXGNA%vCD3Xu>feHe3>CFE(=SbMe{eRE% zJwiyDGw00AJMX-G-a$3mC3-W%EhP3Kn{Z~YY%U3miGz_nvq_5##O{lKGvtYe^DdA) zO_`^?r-|1a{7ar9GWBn*g=~+k6VDdjUhP8Kv2l@LB=yP-1h99a=UZb!3*EdIkk|=0 zMFD{>QaEl{N5DaqLf1O;bXK>r0Ao8%yQSHjdA+q~cnrl23Jg#k_QlO7M+>%c;H8zh zx!_j%JqrNmgqT(gM&rbo(YQP?KQkaV&JBtt`_&6Q)1tvK!_vIb__%CbytY22F&bxA zB%|{6**4Q~t7_+>RzFfWv(jIO4XO4zxp4t=jBHrwCq)6ecr9$F=uo*HaHO4LI6Fqn z4@EYXqT!RSBn~Bs4FPF)O|$}DS{6{qP-Nh-*tSV&jCu@HZ`s6ugxcw6It-qMWW!eD z`Z|_3&DR6Dz=9;Lv^>s0leE&J)&I956ZsQk@pNIB-rWZe92jA$J~{kZfGNe%%=CUH zWY&Xk<-|L8F*PYj%@BL7FvGt;w~1lo>E`K}s+}eA>egn9#Sph>v252aApr`;!cii+ zI129V4c&Jymm|=9DJ~Vd;{8)WRRml3kv3on9p2s@7{5x0MvcvzOq#F2tiu@<#Ec-| zg_}FW*T_1S3A2hM8QZbCt<7+2jztVB4p2PcP@KY=;spyxx=cB0VqxJ-FLCRIPA8?B z^hR3Bt#|G_i*>llEp=LpUd7~c^UXflg4x=F3iEReV}&{ud_Y>UZ5z+i(WS|z8^Fz! z3$s7h*cQ1(VPfZ-w#cChC9uSbE)>lu^QQf$-wiA>0K{}{(E-rKZlSb>_L9EtE@s*d zdyT+M`+OgFo&Ar)?5)q@Fwab%NpGjmG+WWp%6}P3B)Lbk|0yKcVXs^3>Gb!Z0{e## z3PcXT+&pjtvaWiNs!jgL39+DbXqHYF9h;Rc-X(D+{iD{#(FNKDebG6hcj&l&P!QAS zn{0z%I9@}0OUo(2r&C1hQ9#gsQHh8C=K9DEN5@GuoBd;jS4xS$P21T{a`-?Wr^1^) zicSNiRdh-=K#6U9hijJWBIWfPcyoA2>u4~BZ#KDwQct#nHYBE;oxZszv7P1SoXUnQ zR5*ZhScB`34Xty-b&wL7yFwf7B*-oWkC8(~7M&^k=g5qeQ?V0dkKR~i9tw8rR|-zs z`r*hL1urME(oyZ$oGaRAPPnGTkMdBC;@Mz!mz2`3a^#faAxGmWPTcJ{9Us=&H^Ftk zW`;^093X7HAclugz>SfG5Qj8$CaF+^eqhLE{SzGYD8RV7+!s2s&8ilTMFDd+du0<* zkynbIImm*A3e@yD2CP#`^4SvzSvrme>FU2LQ7hP0sT08V#M7Jc*5S?Qc2J#_zVv$h zR^e@6-wgXn>sfSLXdTqWc0QC6{GxB3-iS9>gVx&4J_!{!*h@R<Q}Jh><kT|NT*oSS z1+%)ox@8GR($h2Ptq0QEBc(gjejmzkMr}todtN=#yyIo;_&@Y)+HU%tUbFqNpKM8I zSG%rbyS1Es=5|^O4`CnA;JkZFyM0Gzm!<<}-M8Z>Vc!IwOvg_84DMm{f*EgP2fBkx z7Ie<Ovl<y@U^rBXRO?E6WVkcKXv-*(=oHBn^~fNiRc=!$=j6y-L{voSfEu{G1(}Ri z78o@HlLAuNs@K))7Gy$2e%p1P(2Q>;^%h!;%RHe){RpnJf3zZAYUE9ISXZw|XjMkN zoqYnTa2ZwU&ov=_!uH1&8PpCdl65>C_t0CpM{9AfL2ZxcQL_fp)}cOq8d=|o6to-c zGua;5s}~iVLa68<cGKYLFu-c&B(R0A;JrxfRAT&?WRRB8ZcS8zf5?=_@_pEQXa*TO zErVJ#$0;#yBj7b;2BuU<bQUBswcD77++e~I#7Xn?AIw}^ry+2ffJt^V!;kgXDjHhA z6Ojs&>`=k9$xNdX+Ej@r$it>7g<6DTn7XPO>Xl?=1*zgx;l2^I;OR3_g|Nav=AgaW zsg#rXjOm=Ipmdx-DqOe>Q|y-BG$urYUQ8f`o?U1q8u1x0llxoSiT0?B%o>R0I*ie{ z?rkC4HiSfQF%a3<?9vPIFR2aoWdTDfPq{84cjU}12>sTda<WskKzf}>NlBS(o$M4J zu9zl_fFMohl_UUhZDE%D2=D}8)=~ws+8QD%4SVrm3u(ENC&AgsFTIg|iy@;g@&4Up zK*zWNysBI!%FA&_a&H~GIA7{Mu*<)y{mKX-Rr{L0nh6LT`DaotAxmFf(kFVCk6-*} zb4+m2`LedII>+}`=}0C%^zhe2Ty1Fb4es>qcdaKFPU|Oq6P`JX?pfn*RoO>w%-?pG zR9x(i%PrCq0a@KOZBhidE#{u@?(+z4^jq*rv!Hlom%udVpHP3PuD!LgJH)BI^=$c& z?`0WLNl4|7yFQ7@TS&Oo?NgBDJYMA{?YmSS|8edc0^G<b9{n&Ud95(hBXsuKwXqzx zCBni%0~F8^b;nTmU=5iq5PeuwPvWl(VV)QMdZfmeA(^p1?<$vl0}jM>@6n5O9@i5~ zcc%q*k(T|{&{sYP-5;8r80#vAl{)dvN9|{lFI_EjEjl`ObkZpx{aoK(8PJaeT=4j` z`)r5PwKCtRJ7-S%5RH&@{<D0*!|_HUaX#V`my)<Yyyo1MiHni16%#T|#K%eJ&EWD& zm!}*rbsf#U6Ls{`28u-|2tW6P^yHLNVAjpVi}k0^Okcd^f4P!i=Bv+rvM1Z8=p1Qu z>c2ST5r1O*;^^i4o8pVaA|NF8(J<n5w!}I0q-*}QqVx}Iamy^(s#2(t-`s3?x|&Sw z3;wjIiq!x0>po<d-ghWCfROQk=U#01CN_{%w{Yj4q=c{&dqYA($@rdANDkz|94&Xf z*l{VlglK)o65V{8oD$ByUFL1M<`x)}d*kdoN-}1YdkZ`Q{SJ9W23~L}zZr9+h}jSj z{sof!<+0>bRhb8J<4?M#yIjon_X>&gby+22jM2?+f6{rk0w1^FMAu!_H|vkY>S?j7 z-~PB;#MkRq(bv06PPj#fx_c*<`<4;KJSoYzos{a+bs@7jcH@#~Qs?KHF`n02Zfo{T zk#Qn@<x$`EuJ<;422Ukk`Mlt(&yt989#AlA4e)B14akQm`TEN}{_TW}ltTtL&Cdvs zn|a|_NGt5%n@a-Qs&s1Yx&hg<#Zyabz}h}Y=vp~hUTvHui*rka`cfnc-Ku$LS|>-E zR*hD(F|dFwuzJG=@zD2Q=r@KzQ&5n>8Dd^1x)riMK4+YoCZp3EqXIHNMASXTb@QSQ zRF0UtN6G9MQFR$d&R$+ukSQdBMX{-CT%#b`9t{~24!Vpmrfwu2M~+sbhHPliK{=5P zs@BL#A0rvIn0r)a1({pLjmEi0hZbrRh}<BPx*b{&PcIYW#so%>ElP{iiwhQ{ONSU^ zrK`VPn-Ga5iVfxJl0=F;`_d)R;)WDOi(=WNU_}H&s93xxk}NGQEJ{{n5~)bK!bo;X zWlQ3P;kgBg_yvimSGLeMySN}-kS&SC3!(*7UtYqWShhs#Ey=|6p8qT^h$JGBM7Atm zT1JUvFlz`#`{iYniD@zWYzb}>^erzetVku2MTrO|eThVjui`~i5HHFWq_PExOu8Ty zEu$RA20Sj4c1*$Uzc`iCDP3NciqQp;*diigJNmIjj9+4th==doo582qumhz_vL%d8 zFWQFV2hejdBVxq%qDhuPeMh+hA4%=S%w(iW1_QyLs>nnhu&hWe7M$O!GilVw251jV zVVL`oNSV<X7`RmgI^+ce*8%Y-{rCj$zzMiC#T<3H3?lWo&|;@xxyQ>OzNF>7`mPgw z)rIEP9BoahJX@F4yqGjcR;5I*f`DjLYSl<eYfwSCM`}nNqf??3SuZi2o}>-aDg@8E z`?#nOLN4@YzES^?_wrw&7M%QC=Wo3^gG{dk>W~>}Dj{@3`P34NTEDK}&>)+=3RwlG z|1XcL{h)2+RLNKWO3i((Gx{Gbj-J;S2j34MD-s}}UcClCrW%ja<EiR(l^&d4sZ}B~ zDfc)5^x#?O!SJT)hy%5+v%Tdw4^|sPo-OgnZxyDcG!`W;rDw?-S8vn~1dkK=V2NG> zg$C&nG1f=*8odeG%aL>w`Kpn$UJNzb6V(5S0@phDwFUz>Fga$TFq+p(2d{6K4LnT0 zbvfgsg{vIvy&69h*K_i0S(=w3?q>Jp#Dvi^einn>`pW-LZ9~G@fR<}*H`}h%oh`ad z=G^q&-TsrPtux+J8|nkwktXk$f(yQ5mtAV=j+7?d<R_Bw3D-c>R?%m3^TWC{*xEW! z7!C4yYY1||5;(GeT`;{Hc+5SO*>1N}A2IA4m}CxYL`hq`r&!I-y}i1#kKgavzqP-& z2gm(cdU)(xiBG17benp%b<^^mZgUTB1P@$ea7B+R$U%V`yl!L97F_L6QmMvaZFXYZ zIK~^-jgfK9*ftyrg_ESmEhvE>dz|2t8M7N7<G%1vm7u_ZR#W4vnZ0uhy#;rpcnr7k z#trPP_NYaFah2$&-H4PXx;5fWGaMt+uX<(80XbFI(N8_Sw2FLrVs4mgf;qm%Q?o@P zUK1@?#AHDu<}EDY(<tUGp}xk9-wfUg@fMMU&1DLCdTm<D2h<!C(phP@0%`XQJgr#a zFrlKkP9b68I(*wI3vrOFD3P4jZbP+59#o=G2JA*AMYyCMCNLpmmB3P?Rue`B61r`9 zQL7;1t7u_m0g~4i1vHga5z>E8$b@3-u|#H2d&??y@~iY4WGk~|CQ2n*F~AAzAeYV? zx~<bICJrJc*O~9JoiU2_M1S)_q(5X329mC}B$j}DK=C2=x(0NEhwSZ-K$J{8Uom?6 zrY_E#G@S@DJwlq}E#7*QMRBdQnJk@<!<P9N`kZ{mueH2qe=Q$mD97<C1mbN4Go;;# zp1F>c@<<1bB!5_QrdBN1r@Ic89Dv0tX9Hs-YB$)UjHCjL44*Llz*a#Zuq|6|g;CIS z9i(HC%xmu%i%>~Vj5U*2*QOzP8lb@SI$D^h<E}z~_n8|(IT4xQx<%(Q^IOxaUhW~5 z?DK_LU5Ue2BJlV^zkq)4!QM;6dD2PXK`QoS?H|7CGvwRQl70Nk*}#y(n#LZod=P9h z|Ms!8x0i_OpqR|Zx0Du-1su58eI^dNz#3Ln!v)7Nf3Lcd<hm*YiSV8KFfG16J@|0u z+ejQ7J>*ydm>xYFTyv%>XXK`1(y*J$DAK%~;TJf5(dYVEOzQdm@WaR^kC6%K$YA;7 znJ`O2m2G4KU<ZR&#|1({)6PbH?jLd<=IuK`kkgV2mrGrTuQFugwDgQq6(|Tuc#E&n zb;64;zeY|koFDKYm3y*}-mXds3QUQ<H00QF{Yd+Mj}0O{MoLrsTM}n+a)R=Rr8d<k zJ32JQrQ?draRfJvM3y0{AlAoYZ&2NZ1AEg6Nk2K@GkK-jt2It^6)fiR&=urf-8eV7 z=WF-$8!hLnF5KWd*AXV?Sb)>$$)J=(*F(P1SNaa$owIvJ#x4fBSWM)F4L7&c&{nSo z_nZArkwpoY5j&B1IjnI1k>%4}#2k4!HgoUU-Vla7xaU}F+vNaF%76N5oPzZpq&nE> z-0tq&7E(|ced1u&sr{2qdFWWE%kk`(_6+$^ghj+&K3a8QcTrNy)dQ|IjyXUl%sa_# z49dTHTjHO8ZV1TnNyY7a->-vu(#1D%x9_CiaV^oExpF(lxjeihXvnkf@~6YZ;_P@M z{M5eYb6+Hfd9`^TI)`B)3I(#BgC+lB39Q1fTmZjIkUV*NhjSYyA+!_87S;>8vJoiK z#Wz}K7B%5k=OJ>yL3=BF18HGxC``d&B+oO#Wh1qMKyZ*6;9EqOC1wKA8gW4o1;OUE z$iGS+)UBw=l9s3x8iIO{L+ymcN3MjK%xqrLFmlz(tu>qvAYMV#kCCW!$i^jEChJQ4 z&>>T_Yz4VKksjJWv<pUhcn7(ERZdy$Dyp;8$6zPHP0wnU7_ta{XRsJV?ru0>TO;2v zFQZ{4V;1Z5GJ|!38S=ZFue!z;?hKTCp(La<ZG#w3N0-mGCyxqq_gKh9_hX~;!=kbR ze}UIOT3e@!%8a>LBH+YRCbFK^8-IQ*VM1AwzpJ%<v0YeDur|88{+qy&@QD&yv^tO2 z8w4AxHu(R}r-)3RPdbrw7(GdStAbcg=lRwij5%iUt%ZQ{c|d5cccpvj&C~IFQxk5S z-W}}c6v?&P{(5uL)yb0=>fUSFHF~D!Qn>f2jzL#2{mr$9kSwX5>=Y#zcY<W;%NlTv zQLiE+I7mFDL>P3|k*s~^vK-5gXo&pd_oE5%&UUXplyOQO2ny(U{R{8YUo<!sdY=sY zSA5uwx_wvuP9~uFCyhjQ;{AdfexL733nWK}kGq|W2)NK*+6cT5DrMI7A;9{0Mw65? z<QG;+NciQL%W2w*gmp6TSwq!KVoGL}GNzsej;(5yEYm@cEabO^er>ZidUPpLV$940 zCJvW&P5sAz%3K2)+H{964a=2v&5sNPmduRd@X#5zH~6$edLj&ITg`9E$QT$RHNB0Y zEn#~K$sp1Z-vbVI!LCK_E)I%D5L8BV&b12}yACyxxeMLC`R*<e9(VRT0%J!HpI4}C zFp|N$(z=8s&nbmS=M3VeB6b5npl?66|I58Gw?ZliDff*n@XXj9JVsVdS6s_W4XgJ} z*ppE@K*rqzwd`ZLmA7+zaBvbte?T%iaWCDpL2p`OBF}9!woM9!kn+^6Q?jY`$?`?Q z^p4IgON6UahGzb#6jo9N+f^x@&c`Z_?W<Ext)9$tMaF5h+9VsrfnxuQDBtDtEXW_p zj5VMBAl<X%8qy>sgw%fSJAcnTRu+YOfWj1U7U(oRniQsb%{R*_-yIIto0l5nc8l(9 zX!9oFlum#!7{QJi0rwIxGh6UgFk=+(W|Z{Qasf`voH5~-1#gD^Br|q`8H2!q)-&LK zh_LJxt`=LYvsR{$k+W574{#Wl&(R*%6q%zg)+M#4A{Ow(k>RktOX#5)Q)s6A$=buM zYa$$oC}6nr9=Ved8G${D%+n9rj!MJ<b8H<3_3TkdkN?9#fYWS6{5MP!_7;>0xO4Xi z&cvp7VK~zk?mMnv7&ze+&%z%)D0CW!2+}(qV9RJfXgjn_KkYD~n4=7Jv%^+~ibXBv zn?21iF0!J;=JidGZ_04ryuNwA^*Y2V-968@iB*(n(0Se>m(I$yIQC3S@ZP4;YBhKp zHHe?Gmf7Ps{m#=c+8t2r@zUZL3By*LwvEa-c;;I-Ga85KZ}noUVqrxvi=d|aL_(oR zME`^$jgW^k@wm4|_#jGcFOg7z=dZHWEFu$Ihln2FZW9Uxvl>q7;CQp0!8lLswG+lQ zNP$?k>xLBwpal}pVT}%UO(SAI?M>4f7&GMp71^c`A%sCT#|Z5ag+&kIBSO1*1ZX|T z1!vJ<Ec)iI5caq}o*b&nDq^&@(7-J=R%<I)%PibBw~Sy1n%J94)-><@mesG{{r43_ zzb+yzJ+j7co&Nm&zkYBUqUzW$#PH1}z44yi-gN`nQTLZYlKz*)3ni-{JpcGp;|%WY z{>M8f6tH~WPJ&HBimpEt7ECS_nJy$d5(&|~GYLoN>Vbu^J*J|Y5Tw)prb1p#F*L%y zsd;9OH*c8b%^7FOoSZw%VGhA)048r)hjR7o_BlbfPOGP9=Wu!eLtZrf{+;Q$;T4~g z%_KMRc*W2&uKiEFt(Z7|76u&cM9!1VvkhlFR1+^q6Q=aH4~~<H<B)Sm>ispd+g|$5 zYIy8nF++}I@J^9G@C4y}lC?XtH_BDgy6@VWDegoG;qUX%CU3iz^U!&)zWn#c9`i^I zNYi-lZzjnlOzKfSnLd4H@P!v=AqTy%X18bP<IeD=r~Q;~1zw_|2tQ4X=8YfA89x?a z&iJLPE9~x%C`5X#VMwtI8-;X@n(nD(9><@p+o{(ztlgcp%tHXN$5GEF*6vPi@4R(A ztof<|#01*LPtSDtFR5J%B3mRG7hWd+`q{o`W}c4_{``XY=hqxxgaq^S;7`{`UG8t9 zMgMbQx54F)=l>#k>LgBRBl}(=WLwd%n|bGc<<5{#Qh)RJ(!bm%{zYWU_u_gycKX(S zKk386%{xOzMxTlPcu&n^sSW=X1*nz(&f~elhu>=0{a*4jV<)bq|Jw7%qdz)YHvN~c zpaM_*GVPad21F<SWa0;@nioHR?_-8Me&&eBbN&Yhf9m|3*owz}p1-wPTi*nQ<3YIy z27w{j_|WLo_{tgszX<0W;rt_n`bFrGK&-cfdQ2ddP_K!`Vt8PKJ?a4$>C3`iV^sIy zhf)F9+=I!0je?g-d_U>?eE*x|{g9R?m{*3#Kk5f}kiq|kBme21pR6+8$6rj4{?~(d z$QQqLKBJ3z_XF6J&;JCl3H?>aea34C8S-4L^FJTH^SJOA(MR4T#O3#-=(i;M$1CUl z<`nk>lKJAoucWJgfI#}avOmO4s&@>Mzhsf0C7<^{`mFouqU`|7XE8|i%)It!{vW?9 zjDDW^qlCO6ihT>PsoVKk+<nJqA3t(5KksF7YX8iQ+aa*(Jg5*Gw1(m3(H@a#ScaVI z)LUdx-ftZ-9W{VOy+kS{4(g)60haHsvj9UOy-o}1hY|qXp;9UawRZtSbN7GG_30Zg zzaI8$$A>504l3DZdhu)J2mcYhyl?j#kWruR_@3PStK+}^WcY>f?G;f!jLn>l_e6p% zBKXmvJKLU!9^$Dl>}AN`Lflebp5)Cw6H@dYucos<A=5wf{*$vH`KuR4f8z9y!;4Q( zDt~er(opsX&@Xv>;`pN1^ODnEjo%AQn)t&zvCD^ETR_OfIo|4950k(rj6XlI^vX=Y zYbaXXzJHE))9~j{lRLBSyYXb^I(eK@2*a>!U_>(5FSCveCz8?Z`#77I8?Mrza-iR7 z(t0c&yLC9&i1KN+Hid-s3tJfg(cD8taDr5o*Uk2oJGqg=4HF9~Fy=2!-jpr-he5i3 zd?i~)>H<q*B>7B1IVttaRL2E2f*MNvy|<N<)i`5!JD@S%O$_U?>p8=u?s{Wy0pznA zQDiAFXqt@QNHS})RiyS7q_(*_Sfk^Yh%xC#xAa{PQhPm8zv>^X7T%h~(C2eWPa_%4 zB#k#0tJNblI7P2~*pj<MR)hRU#F+t^YM=+VbozR`Tf3IogHCk72kJb;&{+sDs%`i| zM~q`o018kKfXWQG0FNltC}1|xVw0BgNh@(szxS_^CW?c4t$uiA0jHkNDR38#OvOs0 zcj6%?x;$9~Gob)YDuIAo=@Bfn#jR}HxC3~LpO_!IF7KgPe8Ptf(cDN`83_N-3Ve2J z1RX=K=_BxsfFM|GW1=n7H(l%8a4dK(R|>Bxsx!*_Xot9Vtek9Gx(o)oF-w|Ywp_RH z$u_wNkqc<e+A;0{b`)wmX~P_bP*P+<Lk!ylZO(3;ZJD6JieEM$%LjG9qRsYT3Ccft zv=4kb#2MD3p;O1>sN*sio-!Wdf9%&U6*&;)*~&?XOW<C{i}hNvW#JDCCFwZ&0>m}6 zd4xPHr+^<?q1|EO$gqxMI&`*^D8wa(TlV;*Fs2iWe(qT3?oqM*rx0XtX`2F_WX}xX z7^a0hvG?M~ud8!{X2@!6ypd$Z=yBZDE-dIDCcU2iKwMX4E6EO$k%St;4_zc{G0}6c z9D-q6w)6R4k~E&*YE+`y%x{Zc(WQoq$Z~j92U)vaLxdd#^%D`xWHe}s4EAS@i(d5r z^Z#iX?`2}-H-s-UZLQ&}BHna;0T~IXTT8tolfUPxOz9+5*vm1{9p60z&d7~@jT=0M zN+*F*KQo7LC^us+D0*yV>tNJ7xs!kB>~UD}Fnfi<j*fhDdZ=LY#HlY|ijl;he9`pA z%Q>dYZ@+tR{3+kx9mdEr-p+b5{=2`=J@xw8-^&g~l)QZ6ACec}4(j>ucVO9C`qTG! zwI1Gnr!VS_E6fjHety3sY~M$kH$K_>6ZPLt{-`YSJ6}HZ=~F%ff4=zJ6~~`__)7N! zyTL=uUq%0@+5GJ5fBZo4+fRS{nsA3G#JA>|Q~4tayWW%jXt&}-(ajfK{%6AR`|mux zHVfROA`rz*ZgDagI=4`b)}aCtL<wXy;|jY7)Es6oIC#WNFJSp#z*uMZ;Nug=&$@is ze{Rn+y3oHI6aDzLUAq%rBL0}_@8$gLa?PUsDEUn#`9B3m!oK+Vx%V>fgH`L_=@2$W zUpoHc2M7P`%XfV19P@1V<+lW<cfB|FjHdLNLEed%Qg8jj^wYsxXT6?s`s<iu*vt!y ze`#XK&j%j9^27n-k0-`|Jo=WR^}qY?69su4{U?r6JNfDVkk4|-zO-MtkpBukb9`#M ze3snD4tN-N&dr;dp4x;lY^V553(Yo+rv*wKmZ6%RcuETBqUYEmquj3g-w3|X(fyH= zPx?LFU!Tn@*!zcyn!JZ2e*QJ4Ic^srBHjr3*Y30*OdSl4`(92>-{bE5wf7Fe>@)Xv z*Dm{p-(UH9&&RK?JUe*gp8>C2cy8>s``-G=$}^{`hunUmd1m;^;kw77tCsdB4nDK` zD@WLk4_)p}y081k0ViLTzZ7-or!&0y8&{&A$QwQWyvvjFkM^wX$~g39#rK;IUF_v4 zX2}kgk70GQ6vc|wKwTSErlgb|CCk_0$N}x9hst2`L3TMQiQr5~3LwhDzB$=h2lq6J z_TReDaO<R}Zr%CNHG}tY|4a<KEgr_}BMW5y^u8kU!F9&>fQz>6%S-C|J>!JPgAKdJ z81KrOgEtOO`baZF#}E1)=&$+u!>7sMfx{J5-lnSyWho?nucIWRUE*OW_<Ece10mOV zRJ`!s-hSPm5AE+>KP<1wx7^vAKC<V|nc=2AJsI8FD+lsOVv+b5HkdsOi3ZXhhE02p zzMEL$1P(+e7cYjBZrEQ|2!PaEM^9J8CX+|i2d%eJp=J{R0_h}iSbh7~9RL<_xVh`~ z2qD?7|N96AzH7CC+)n{-Bdb<ma_r0&j>8F=J85^=KQu&9jdtRGwY7|1u&5rRJ?8$D zD)|7VuA3}$5{LOrEi0joKE%w=%?m~Iqjl{oVjPjq%-IQ)MzT!_El?~HGH^~lxrp=p zglijW-Ga)1jfccEH#IdwmF}rWrl%%n^l&0ADA&}owKW-{OYb*R<rOC_s@j_QmKI(! z(_-J;G=md^ti*#Z6b_!WcNSKLrh{Q9#&83p|2fu4<wlBM_G^@#Q0~j|ZH$|xGA!Tt z2KD6O3`;vkKaIhC$2_^RC>6@)yEZ1fn`8>*`pP`4Xs;?i{oA{*zxuED-unCB|MvRd z-s~mg^R@h;@ZR>wqIM%u%$kV8piskcia)bdN^~QR!6YM!gyyZoX{I&9Gz7ct^onL# zp`qdb8#=AF9<KcRtek=N8AnNBG<0?_1pJ1j3*XIDo?%DH@k1-_u&d@?U4o-Am^H2L zt_}{8x9+P{6NfP8IMWO}zM0i4A04Y6^f!#w<@QhZSFF%uAwL!W`ta}Gx^W`c@3XHQ zkDd5^jaeoAO;PSAKJM=qW47e;{M+w$r^HT-b`1@bwn?StjkUN_g7+iGU(bQTlW3R) zk8JpnC*^ZjgG!q^TY8iwL)se10z0@Fgk;N!Pnagk%vjkTLuF-scF1%suo69;VRrs@ zvPY-VX=X_#OB`A1@=eB1HN~fuU#)Hgc`YYgo(gf!A8=|Q<WkbnY431F!1*yTJM7uj z-T#iw9t<SSsgb^Yu8!?8I&A3+etuu3A1zLbjm?P<f39Auk~xR0-`elJJ8Z;26vI_N ze73nM^YpoMSDY^A&x;in8UOUfj}Bgb_aZ&lSVKbM+~B1d6Lxv{UOnr0&Px{6yi`to zR914xj+73EWdT%DrBiB^vN$Oc$cYiMvx=jAS?Q3{MT=Fu)Ub!GaRv-J(7op2&pdKI za>~D0c)7yS4{F<&!BVe-nKxRlas!=NIr6b*=8%h^Jn6Q3>*?6pMLJN)v%mc9BR}~4 zt~WmT&u3q~^K>nlT)i0(>GAgfzkhcdh`hJ)M%D7zczbty7r&=>c)?)oJM1-;>p2@8 zhP}HOXi)d937CRM#&eqn?nDM9EeuY~6d-_$vUe)gaRXzlEFEN!imux!;?kFerHYtr z1P59SIMSF-DYsfdb7&RzKWGl6{F^if<6ZyIr|A5R(X&3Sz5}k851%v=uL0*<dk@#1 zyIjVNcXBB=GNxM?5n0zU*iv5?JuSw1{hj(B&;0ib&p-QvA3pQ_AAJA&KkFmiP2n+7 zAKdc(FscSSh1)v&x?0-WtU-<~O2iCqSWM(;G>zc%%F|bt^khCSudKMBproKQuP{HS z0nSa(S}JD)nbBhlM#ZgAPTb~@+J>t*3>YK5pB@v(!T|p%enYsU1)M~4cc`qjgIStT zDTfUkqe{4zRkIQcsI*Ehl$e&LMHGb@;r#NdY(coP!p50Mmqjxwc!1X=I_X2$NltWY zh%3bw5=IB{)J~7Mpe@+djkrT<ONQ@fn^+A8FQl(kp4_-f4`c(=X7vV+=uo+Y5)u05 z2oc3cRv$vIDe=UJtmndUQ%fh#I+RV7lQUjEKutj`r08(zOmpHcyW&yA5(9esHxxSj zqENG2+XO5Xo#@?GmF^y<$R~LSaY?wos>p<o+ERF>P!1!bj%69FnnB^d`DPU?Jjtp~ zapjmmYhWtGF0_kS0~SvyccfJxp&jHN^1mc8JF`$nw#p`ns13XBA6RW$CIhoXC?sp` z>nrHm3x<iH@cEDX2q`-}I5HMIE6mL=Y+cALE^F0h^h%2gB)ghgazQ(vu!)Pd#<(V} zViFe8-3g$IBl|{Q!Q9Y8j(nQvCvLNnjBg1~j|#(8D%}b*GXeLdsKBCXZG-NuoGF`Z zsgsS?lG@$|W|icU=hauc$n7C0Yx!_I6<-N*ITYZQ>2fB>HT3ffndi^dof<lH9f#Pn zHceP8u!7Atwb6z)ly^N!Ax8gL;L&d^XjuiGTLcWo@c=hWs%PFasTQ)cA-At>p=P47 zeg=wW6Qe2^G?NFWd)ieaGsX@}wYkN(%7XU;&t=8IEHkOv&+j>t?GjMy-RquEdb7tP z^sAis{9BcmddlAHHnIGb6OSm8Q(GKsZDZ$`sw5^Ve$qmYM8TiQez)-@P8q{R^1pNt zhCDCN>@TbuC>rc+g9%AntkI3s>mY8A=dF(pHc3~iOf|E07Ph;lg4A(wS_!C2U3l9} zq+nJ&C>sz6M`V2)`8AXCqsyJ`)kW~;LX)>@OIA!}i3go(N>8ElvS39b1M8Hdzt-Mc zMFHqc+m)~u+@&q_9OUPg7RmHPU6+BMhUn1w8tGj1@-&VFpR5}-H4iYOb!$sC(iJ!z z*!E$)q-&0nbXNN!us=OuolkCRIbcy~3hi@jjN{*&DT5QrzO`l$zhP+aqoK|kc%(e7 zwsDBgR28P<qdbqXiFVc!t7(u$B^7Oqn;zIiIQ+qXGs`GhJlbR&)PHhUFs3Mo8*K(y z+7kDmhq%SfJqq9H?BA75tSTFA2~_GEqoMSgZhEGNL*ISV?a}mY#D-|I$sUe$di*6V zp|$9D?vtxU^BmAJ`V@M{-6z4jkKc3`86Cr>&4faSWubr*g*L@nRtlt(MK9vObqjW6 z(BW9s4t5!0U<_Svbn4hqaN#@DBZ5&t*`|s&<z^g;*--7<W%N2%$M$*mKJFS_*WbPd z9Knf!R;)&M*v`<t+hzeW0_`Q0Z7J}ntsInCZ$&=Z1jQ*<Px=P2;GAgCzW|`&74{i) ztyrwGGlx=C;G&?SZ>!KnkNu<@K{h);X#zv>n?i^xJ@=>v6pvughl&S%o?hpy6x4=B zIE9|xX1uFlu&V(L*z2jD&zbNjwmm}c<^Jwb?zUhG2x&81#}U7*#0Wu(TUwONTcsyD zCfa`vfmvgyRg|XOlbdk*jbquI(GvZ`%0Y{i66iT~;2Vuur8Wv!D-*QPwQi!`2Ckd9 z+ic_V5a3vlQBZNuWkEslinC7MHAis~Y6e3GsVBUCrqR;0wYjOWsj<P_WWf*8Xl!B{ zVYsxu@!h~Q@{nZX0V*-GdMw(vP7aIRCJJ3zhO?8|a)5x&p&i|3a@VeEW!GHiSuKc@ zBfrt1-}mv*9*_4IhCFFoS`<zcRJIR}^l?~Y!U&-_bEBn=+UqI7Arvs&4Q3nWaCUdr zLiI2^tp-C4=|sFsr+YdMs~@h1iwV&Oc8hdFMJGhm?Slw&ne_?NBQFoUs>E)oU4tzd z@RcK@j@=}7JU#X*&%xf#&fWo;mK^ZS9)};8?JagVCc=(>*yHpLJ9`GdciQ2)!Qfy| zk9FB$TWu_~Y>2^X9ULQJ!OC$sx(?YDaleiOGCL}Ya5&4E4qYW@{R!;2e$EE`84RB% zc_B{j?XpH`^we5ySz}Yxp@OxXC4S*bXTj>BJZ0?IT2&i7L$jVmy5?rWug@BqFjWb4 z`LEoP5!w40{Q1m5eS7BYf#P$4t8vp%D;Am{cTA>FmaK~uQen}wA!|A<K{UMFRiK;5 zMI2UN#qEV!L@(OC%Cp#OFkE{Fdq9SV(eoI)C++Qc4uB5+@DB%FQdrpA^WH=(73Y#% z0hV)%7Gu{aAGOUMH|z8lwKQXXw*m~9ZX;?xZk=H(X52&nU$xF}#jgbjSiC{V>Cm&` zyT7=wzvP&6uuI2BCqpa$S#YrAO7Mw@w|j(qkvJf^s{CSg;AGM1-r`gKnI*5ptdNf5 zL^^%>tNwTQ-`-nyI>aOF$SNtXcWj0)Du3vFMN&_0cywS=?rQw)!h(LUn7r$`QE=@R z$5)<~Aq&&1IH&c2Uwq~qo|7MU?W_Oh+1nd{D?Ga`KyC-1#V_~b-@o3)@v#O600mfa zKc|SVuxM_xMq=bP$(Xf6u{c0UBPAxFL~4*19bJ5s-f>bAN4M{_q3p1t#oAX0XKH%C zYjR)7N$=Ea&8O2Yg#?_acPc%0<ei8s)u)RceIkgUc4|JhIq0T)a+D<Va7*f?)}Y2$ zU|gSjzh%#rFW)KhO1pZoHz?+O>24{>?a981fbW=KkL=jU*knoEofdiFTy<)DsUX>} zEP;@y&a6eZTr+v`72YrY^v0pky1v%pxZtqZobIoI2hRoOXXd>3bw}5wEn5Rl__YS^ z{DVMReBndYMDZ8AKgAgg|HI?Gf%sA@;kn05M46aPL%~;;Fj6T8%!Cpi9S0y*N#S@4 zr4|sosNIqywmYpTqANix><@}vGAG=trw3Z+YX!IO$f|{nQw@1x#Vw`dZY@*27V^kO zN{S>WakeOBbh%2A*(wfvr3~)H4!6jj=+Msgp^nDNfw)OeST&|+^ANG67^zO^<OdFn zDn}NBTIN>g#uo)E;`(zih7K&{^d`;$B!A__%??&3`MKYSOh`^ni4FQ>C-0f@@*C=e zPkOxlnLT#GCC6imYi}<O`W-l<t@MBGGj)-{u=F|w$tEqPYXNi5QafM)U;&nf0?MAa zkyDE;i#7NUY<Y-VKity66)IA2w`}JOiX3>hS;5mm`iOl~`sxOq!teg{Up`T}nZeFS z_Uzev`gY<oyw8_*@B;H5dYWfH7GO6Mz~e>t@v7r^yay#md5_BOVDoiZ*OtG5;&F~c znA|Dbr*a<GV|0M>H`-e&NZ8o19qlPy=~l$13>q#dc4e?du)N>(w||3yyutAP@VoHy zpT7J4$DjS@<BvZ5*#ld6zh6A~;#3On5$ABZxBZMKk9TX-zBZZ1`_A$i-pjh*qL*Kh zAHNJ2C|!Y&t<eMrG?w#Ha8j1T(Pw;pgzeX6C6?FmbhQ6g-p_%b8zrSmR(Zt+Qvvo8 zVv7M1yJ?9XL7=xCv(ZCde2vF@?k{hC@c9R?{rL~S|Kp$D_#x;d@4R6u`KhPdZ#~`O z%bW4$@oo=oZAwJXSB~*sFn*1m`zgQk3PX0@<;@I>^+uLJn3Rum-K2oz(0~pNz(tG_ z?JcD)><1+sgp(DhiO1UGhpdDH77D07dLv?Nm;vk=f-r=gU|0Y!S8OpE7h@1h{=i(K zjv(M2n~q`Auu}wszvxW}^Tw|1PGoB%nvH(!wfLbPR@Qaoo-!bJ96~PXV~`>UA?gUW zwyY0ZbQIHgFYSKwcfb7QAAkF+-~Ik~zkB&FkMZnEG9Kgc{zYDUN*M99#E-|jGi9GY z`PUDh9WQ+8{XE4X?11*+y^b@|tb!9AE=4WQRKN<Y>@3<WC!DrR$)}dWhBJ17j<DB( zj2!*s1aZWkLkct)Lar^RM|3$)rb~*5{%~2WXAdz(O=V`^QC$yIlYzeIft<+OvxlyZ zAwX#H!j<tHuX*S8-iuAufA(|%v2YC-JITLsYrb;aEoacJeD5e>!mi%ACW(xj_q?J^ z3}3!+Z6eKG=;!QpOW<D8=NwtL7n@x`CmbBM@*aBSXV3lm#n=D-+8>_(<M(-w^9_Be zZ$4Bq645mNRn=)8&!v+0(uk<_$<JnHlb^UVYcP0jqjZ8Z?o!d1@&`_jqj<@>A*=!{ z#R8j#hpoPb2eo%s8bHH=ko8k5?@?QAEOu8)U&hVxYXey>9SA2EcyELdz1z_3=D@N; zY1j|y;^i6Zn9`p;oIV)Qwva1~EODO-F1hMg;rb^PFr;XrEUl(CZzw%2;Bt<yg2VyL z5p6LQ<=HW9bv4bo&P8qY$;ZP7Gm3K??>JSIHYWF0Y6<Ue4DUA%^yJ@%-u%svfBf^8 z-hPm`t*GhU58^i7*!J85_x)hocOI~}d+;$k-a|hI(tP*%`+2;lu*sZ95#%A3%?`^b zG2!To+UnKXETA?(7ATax?$laqQc!IA!dR(Obq_oqu@cPdaUCb!Yp#|}z~}e#n3C|T z^~4fzET;Wpr(X&d!L@pKiGPgnlJ^i}VPtLrC08#tMTgd2?N9jgm8*nQoCz7~T=u#) z72E64*yP+8I7ke+eYu?}7ksLRI}4pJw}&}*MMMZ28=9LsU8~xL%BFmzI&$A%d62NE zh_!W#g?GQ*V_SI-i$N`()t)n>l$AKJshR!U0V%{_fFuTy<7tj;P=d$(ZO%LjI66%= z3M*N=D^vqZ?6s8H*c=~9NTZyUVH@X_V#U!%tm{U<YzC2(k-j=a)9crbi0#{<mzmTG zqQS;Ex?M!GWKltSykE6S<J}Q*F59sDd<j8s^@vlzCgj!92(qFgOY2%#Z%h_!#a>k! zEM|*Bt&F?9s$WDB!kuOW$6H|VR$;g9bFc8WY_WIPLd8ypt#$wbWYGh&ZS^x{-{;wH zaoFO(vvXkV82g8D2{r8?yaOl>R3c>~L*OywXg)_6Im-n1orQ*hDwh;7lz@eU245&+ zV^rUzkYu501t}|Xd{fbZ@}M&hVH+QIjAKW)SR;eyZdxU!!n4YLhaK<v1Lyy-jc2E~ z=Q)`1HrQiJI_4J>M(I2P_%LDC_NZLLX@p#(RLY^)ix;OrLkK_*w`tfStMii^8K*sf zKiT4AZ2XDU41Z%)#QwyQR95jrt6b0*4Z|U-2f49w|0(6%v~|!XcK|^+7*N`(XH^vi z>pfs`!`2v*H}wjqp>e6i(7lAS(6F$TiPYLjXTcqXeaN^aPRgO0g+YLVfjI@SD-2gf zkVswx6K)?78Mzz*@I=^!7h~#J#cCK+N2wO;(YB41iWqbjxlgJ-;P(a?p@zeA!kP%s zW!nwVn`!VGQXq0s4K^mwQoB)DXzYkzEbAXqCd~1h2Rz5-7h)x{^j2s{SC&evk-yTn z?RGwCz~121yh^xW7a}7Tq930a6UNI)kB2P3iPU-5_ZH7e<yZ>O<i|AnE#@od%VZ<6 zG`^;+(9+UKD$n<m8E0ul1=9qYXtcTMK*>!o_Sx)XMz*_D-=$-tn8~3dN71QQmBkcV zowGh{yT?Rh8&QpGS3q+4og%-6wzTN_^-7P9@S&FL)d5AfW0hn!xHLMwjr4~P--#$a z<EtW73Gv~TMf~LA_=LxY@;$o{!4sX6lAe~F)zEb@CnI45Bg(BJq36%#XZXoV<7)#4 zJyWw!-pWXd?I)t!l@VFZ+=!@Sm3roB$PL4acO1e%e&NgroM{)=*olN+1Jh-%p=5_M zX>y7VWo&d6Yy)!H0u5~=yWmzCpH-IG5Lnd|AHnax=)q4IsJqtST|Zj9Ok~l;2^lS9 zCa$NqDerWliPYt#Cq=mOQyUVZ|Ja}9-lryWiJ6%hQ8Afmfll2%UaNBmC=6;2_PjAQ zbEc#$w(90k?LgwG;)2MaE~1DikIAmTXJoK>VPGs#phhk#zHW|>jWnSJ+#0o0afpa% zq~05ffgHiHjmu_%w~Z^ip!`ySCNLHorDvBT+Vb-zszz64!=_~`^EzTF6Bgtly>Q96 zOte;8Y9_T#wfc-SReiK%=8r22Q_(_VEMCYeGp1xO)TU3QH;JIy&nIMUtfUKuvzNrP z{@yF1<<;g&WmY;uEh^@UbBxw;aq=<7MY#jlP0ADXQ~~4YA6E=H9wXY0xnhZf)w5tj zQ);QF(mN+yJ!oYT5D<mLJUxX)j|@QwK=0S7iT!NyR3VH14^X)dl#gS^I#ylatZaZI zYeKPUduVy<1`2JOvza<PxZCjm9xH*31a%O9wu!qzdbT;B)>4+JQ7O{8!Z_MzWsYbI z#Ge*%stYA`Y+Mj<(MmULt$^I?*3`&CY9U%ZP0S^<CtB>1fvl|G=*O0)Mx_Gdoj^3U zooWQ3Us&`{*~EIlk&b|cCJR%W(THjtv}1HFuw}GI8>mQ^g)LN#{Xy3hObGWF-fSXE zyI!dqZ-7(|d-fJ=>DI5oAK_f2bD9|?t7ffHzecl}Xx8;tN(P3b2=%MODuuAgUnopV z<H!wTmd_2tf2q}JO-4D=lNn9G8wBFR@3x_bcY2Lj*2v^E!j6$$O-_<O$t_26Wnz+p znXki*L0%}l9<hk6<GOWy=W?F~z5v49%A!w^(`};WHKGPzhxV`q8QYK>@f$%I9I-dB zV4%=vagi=LR&b%=p}Y+nji*4Mka>6$lB`4fn_~X1iKIK@IVn@V{zfwC9x#8!4bG#B z{*C`0txND9Io}rTJ9wj9e#5)=Q0h^EBF`HM7NT79^1Unn;gLSpQgOa7B_!e82ATD| zdOKQrxvlO@qU>q|-zRL!BYN<xn{!3=`SDn{k|2ME_?%YW+@F8y(v>$uYA^At;y#&m zKNGP#h#|kyT>z9*yv96T`wnLv8w++FBf76k!@c{nZq(LS4BjdhdPa1dgI3b)5;JZv zVBfbbjL*cGTroh7;n{4{9F^q!5Ue*6m|~B0!fD+UTCCVh7t?m-JvK#~pr5*y95wuT zb;XHf6N%|d&dKkCwIkilIiUT{6(Y>&$(z1e5L46056uvjBYTAxtcH;ru_;m?=hc+l z%(J2Sfn=bLklyNuuIR?_(z20))*F%WEAb)cbK0w8JIgKw4u{M{^dV|0?US^l^CxeY zHHCG&|M`2ZUawaiSU9lH6H%(V)1<Pp*r&RwwkJ!`(pS<SN=Q(PzvhM~>B>%M&5w&Y zn<en<BE)m$da1!M0;pIeTuP?6B}^A8>rKFV0)1ltQ}m$19ZQ!{4A1~)tfZLY6eV3$ ze_|v4K)F~E#zu{UvMzboHiUNgXTr01#c!%*tOvU_n#xo9Dw6#8HS2+HeJSoDf3JaD zna=|0IuG&2)48N$xy9Kvp+CROe>UE?#ea>Ac4v&12D^ke%{L@m3~%(mI_Xm~-cvHz zR^~ZVASvv@cHorP^Y82}NUt9KTzI_tg!t1hVsEWiew{j%Mo6LOxg2ko?9uj_+if93 zcigZAIa(Cv-ks^z?0ax1!*$rVc=k#KA&t&q6UduNy~Jz)0QK&%=)jH<YsbJ*JQ|5i zT~Zv;!3WmS7IymsU2hbKuwk$u<0vZY+1tX>a!UDOF0e3K5E2I@b%2$?0ka1~+jnUA zhHecc0_Fga04?^aA{Jt6IwAyM0adNu?jUkABex)7JW3u0;lLJEV%{*0-OMK&sJaC| z6$Yqr49o{>cm@a#Hb+B^K-w-OS|@Ak%iXxFSSK1-BVb}M=qx%l_L_r^z@9I+Xpzjv z0CHwTeEk;CF-lK%Qu`F5Ay~p`GrUt#(I#VT$|5W~z?uR$w%dZ9ZC*dK%IdGA;ovZ$ zeAATHhe&Kh2@%s0g2UH^87zgTy9+q~Az)3R%>tYw-gH`Qjuy(1I0Gjed4|^Sqg38{ z3+v^v-E2cso6ulmKsGjakL}R<c$=?;olwpcfC*;hEErBG0bRE(0lJ1be-uDN{n(p) zZoAFq4u#I#0P3Y4M{X^{Bz8?}I_DS7Fag<#hme$F9;pj>G&p^#5896io2c!oWLWle z8txizHa%!sEJHIVoO1zp5RoYGLAuz{-}N67pd`#TdYE`wY_w4>uSD5YwmfGtxlGkP z88N((Qe-B=nNexpurgUXRxq50!?b5~{LzVA`S6mUCu6yAbfPwPp|9|L*t`nbWofmf z)R&JuKQWz>cuDH0D08E)z*w6qy;@0_x)^C&u^@7OO59h#)MiIUBll*$YB;gQCx_`M zW~#jMrlfO8a}}+sR3Y8V%J~uXWL(Z5uNkw>QzNO5+PJ>Wnn}%M&3I;9r{SO2g@rn_ zo&!y<reD9GR#UHyGPc>Z5uxj;ah_)z>XQni8q+fq@?xs4DM)EaLe-h>kn{ObO?fU# zvL29~Sr>7A-oGoZ*S));x^3b}zmx0xQ$(K<ToE3bpH&VGCZskhB|YIxV5+<5l3V}P zten(QvhH7->d*J=h%YK|amoylq(j9i_nf*h-xqeL@uE*zQbk-GKff&HoCp8p3^zz@ z;xI0C<|U=3rKP5&rdrZ=;DdWv(nu;{-%RSmC}JzHpQ&lnATlkfC}UE2Y35W0pZ2)K z;D+s~$(bW}1$^q4H5ihnQrx0Mr5SnA{MhQ*%7l!oD$*F>IFuL=<TaeA5S;}pir*(H zm~gCfy>Z9OyR@dV#yLZFF7X2;X+Lozx33^2JRZVrOj&ffF#B@5=zO7bf+%(>7yH3C zZkMGOZunFuloek}Yr8p+SHuwErMRG;hL+0a^Jy)CDG9;X(hAehl*_&1MT_8fnB1)j zF=<I}M`jhi5$}~2o)pVxjA`NVms+;+W7O6#EZejRl#BEEOH0{4UHTd6+QL$ZBl0oj z<u8|wtQQLA4Ac3LfmTP&(veb4L#nW$aByi!P+X-L%llxRtmIdYC`B8E1t5XJ!IKK5 zv0`w#SUr&^pIcj;XeXM>S#pVaA#p6BZ>&(q&lX}!&s3gjB6(aU)(jP_7Z%ETl11~H zriR6Q@vOu)01;_zUs;lFQOFkMizX>=k&)UfR5F8<YW2KTHA*(5TbFZH-!f}MhZn-& zYrm8;It8(gHw{glG8%hHjvkDM1rDCwBBh&BRl=vmd0pb7$<-C%;wsKp5Q_4mdzR$V zg=K`hqM<EHBxu4OR|mS?)qp$n!mW~=wN0U#v&h<L+E%%kKG|&D5=-k_gx?oQ|8TMX z<-w9HX+!Gp;oQZUFPwJ|MRkuBXN@#rSL%IDg67N#F`h3(?X9#SA#G+M8$)9$$hS!+ zZHC_>RSOAr))LWwefHtLzsH<975n+Qk$19|XFflF@#K|bzF+M*e|ZK<h;#D4-6zG% z^nq*Nf|ae`h{B`&rY$2j+k$Ru(d}8sV;`UQ^z`*h`CIwX$|b@3<+ESq9dx_ydgAy9 zD4(;>fhoX?-P~&y+Oxgifd{bt{)TbI)(pi;G$X^a=Ms9`(|dfc42549j7yNrM9wYe z9WK7}Z_j@JDL_3TE@?_k!Kkpp!TP*!ftz-_SwatH(BrL}|F0#nWJ$a%6EDd{ON(>D zW#RmyTwYSG5-($)%vQzX688S;P}P99WqzwTTeUfp+)BRNRT1HLDMn=W%L)Y}W4VuF zLAG@@&o(JG&mCD-EJ3F-EFyZ6w*e2nY2FAI0<1_nq@uA?fZN+`Sdc&&8QaD<{A00X z(JZk?hIz{Zp`T*aJa2Aoo;3wYmhhdK-zv;P?^p!5->RHuc}3~q{lHduInoQj7{y>y z)m97P_nKhB;~`T#e!!w9afn9(5_q*uq|!%2VvulvZok^XOmECXqIt;F2u26q$SfnL z&n?6lI56fZT-e6m9fugv?Ra`#R}n$5k)4G;8_`J)vuYSU365H!*-f@Vp%SxF%T`Q7 zM_Q^WiI;3h+Lln*#&6-bSoquVA20g#L44u9(;@_k?CeE3dl6Sji<!@BG4i*yv?i&o z^YNsWjXNXE_Ey@Eb40ykq?6#<O-NABuiwdr$=)@&y}!)AV7gICnw<*AFNEkx??}Q} zag4`oY(|mG<&e&6$i`6YRPO=Dd(&Ki?`(3!Vu0)D!OVREvUV+_=wQ0+dTYx~|4T-K z<P%fgzLL<OmfZrPk8qvIIM<pVB`Hx7ML=y~XL+Mjc0q62RKCX|(Pym`rg;sg&88CO zVsfEd3rrJkQ_j_~Udu@_<tO^77)SBEGpyExgl#6#{o;wZ9%Nwc?L>A~BXXjW_H8tr z7=M-yht94JfMd%DEur~bw{+2Ls+M+o0V!Q+?X8{3AlK{yutCL*6!mBOSMv+o>Ly2u zM^fqm6-i_S6hK)*etT7DflHW?xTrkKs!D`p(cS&Vo$7x7!WB2=eer{y)5Pes?wMW% zyL$=0x}rF|yR^D1O##|i5ko3k3cK!<<c{^$naRHzt8)EY+XAqWbL_StC}W@~qsk}R zLgs?A3%W`!tGq+KJwp0DAmS&u`zOmie5SmiHO)KggY@QeL=`L871>n~(KQs!!URa) z89JgS_ZyPC+IvgV8oD~$JCK0B<2#)l^wr+k+11<L+0oHe*U$-=JW<`)-9fK(wpF!v zwgWC*U5(XU3=0*HW{;?<2ij>#_0MS_|U|MrNk8@~M*VAT;11qpRe?5sZT+IyxJ znM6E72m0%=E8eNbY3`O+eT~7-{l1W?v(<!&^hhnOgAab@j%Uhw&x+o*@mp<oW{Jo- ztA4U6<Wz9p!l-}s07L%O-c#9h)4TinG*S7w*VWI~rmcPr6KmeFo0$W(X;;Jh{L&M| zmx_^u@yms9uj-J~*O7Q5E9P33g~Z%!uU)&E$alQj7*R{1g19|EWf0Mxnt7p~Jin3L z)f;vAe0FPXcWW)bwxgxKsj0iZrK6#tDz2-(xx49RVlSLQPel~h@_Xv*I%-<I3){P^ z+PZ5x()@Z`JK9YhTYxR!R1A$1%NFr6lCd#M+9iuvp=?CjD=~5arF3d7=4J6(BsFvh z^cE9n3!zDYR>Vk_zcFjCTNgsrF;1I}Fnatz8|N=sl4wv%xkha!GO^xl)KJoDS!tex zLS%ePPZk%*3am=1IV9{h>a>X(EMV~xZbAbLPMgroqm8*ZqM9L^Sv*9)Y=qgJm;`EA ze&!8QiGCSpQy9sMASzuHGA~`rtshU2kE$jYm&rzQchCO(vC6~yiZ1Uvd@S|UKF8yE zM^EH@cGCZYtW!s`Pwva?1=oHqqtWS7-j@+qKaF<z&yBF%S5l8U#k+Yn0=wwSyNf(F zpFQ$UKo#I2%-YVPlR<2-H;$|f;)fd9C$uIY4DFI!gk?QQm^~kzEIb?Kc|Gu>fPS`1 zyK^VQuEuz}Bpyw@?i=9md+B4Zq?@sR;W7XAJ(nDv$abkP$8GP`u!%QZB5pQb_@egc z*A-V?UiBTI%N>7r*Z8-YJp}|s5$1U34^vJSy63&T?<*5p?dpx)eJuFo*LeY%9+_cb zq2WQ9$FJqarNo^`KjoAB)&9I53W&-0uMWg~dENbV-j&@!VP9QNK5#ne)`dcv-5C@J zfUufBZLLBdk{}hYooE!GkOAH8T2~=ajVvH09EwvPzH1xD2oL##wzgp2*6`1cnc$@D zAF|jCCf7hZWgWLyG!640kEYcAo`L4tp7xdjrpLaw2g&&!8E9)nZoWQ#cY9-BOM6cb zG^y_m^zz$#`7M179i5Fm0}Va>P3?VsJ)J#0z2=@R_bhi#1{lbfk2fsmEYB=VHzMpS z9Z7eU^=ra{)|+)?yqR<bW-lm~66V^64HXg`yB652Tv`_R3W()bE!}-Nf_l;d?O`o! zqf!=DKaN0m&CK#re+Q|ZQPs{hVZLJv=hULb>V?`ySRseIadcUD=B%Y!swuiUr4Y`< zswy`o>yZSrLs8z@60EJ~3t1d_4j|}?%<t+N=^pMIn&|5t85rs6Y6;9tPtVB2Uq(7! zmUIjI-kOfz>9F!_&CP&?Khu=4ovV_O&SaR<x22Y*ew)hqWM$ka_bW~;FY`KEczZA@ ziy>t$!kZm^0e-EnuC-Aa3GuCYWjPmInh(#weH9rMU0z%nC?(8i1)d$nA<+Z3!y1V? zIqFn=T)QjmHB-TL=^mwZM`QCN`G;qb`>8r`I5Ic9+XI^i4d<(C!skOGLn@9ZXB9?9 zwuSX(gr3Z~9R}GUx!yA|Godamq7Au3Da*s!=!&RPPuWk;&&<!V8yDv#v)cr5DK-?d z5$f>H<ou1R1F<Ff=Q8W>NQ!D0B5{ii6ty?j)Sby}h$@c>i%2d`bSzU`k3-t#vfS8s zFMgJa2tIT2DKF}~l$?-SLe^rhUmGbKY(2S1X1#A0)Var9<QEO<{lNn>djc~(%ZCIl zO%QS_FURM|q9sWg&g~KWu$YXqy@{T;1U-)P#2nt*)0|gYT%K5I9RgiwVWWM-Y!H*J z8A;zJqvyiJ)5gibzU;Q{q_wi>am162#w_#%^@^tyZOMxG*xAOLW8?DD(uD+gGK678 z8*x#}>S3bzEH<rewlzbY9gk#+gNq5H!<E&@r(n*$HCb7r&TO4pT8gD%jim#Db#sdf zAx=%S<P>kj77Qu}*Au!&11lFJlU7DW@e?iS$a31durM#qUQSLm+dxmHjX~P)1vs(O zlOaQ~QsZ{3)Hq0$pV+k_tABw?C!nnN)Zf$!z9n8$mK`=oQ_o4qkY{U$9(mnB&zIop zchKU<K+C;Nena9%E-s@U$K)``=woL>LSdp=CJs8Sh6=6gkR|Qle@B471ye+^hZ1|* z(yt_6gbU;{qCuuH*!qanY*wj==F~{=_?$i~SWfg9GZIOX{QbFF<O|lA4G$p691_#v zoG>`|7uQ$_tXWMjKe0J=bYL_z_(w|xShLwUV$>4(_=*4<))41Q^pJhGEXF`=r!p`e zZ=`WRcFSXSXaW5;Q(^ltTDPVdwme2_5y1&(L7H6hEOO@fhLo&6RAlDd)th@H6K zGL(l4S~9lLi&F$}bRBGeP^!_q1p>4Yd&_7~AebZd!zK(uDGY?~R1RNp>be+|aQxuK z>senXSM7pDr1b5=#q&4I_8scIelDZvg0C6|>b~;hM+UqRE3<wmqUrFhiUT3#N0WA^ zt6<5bk~E72HW=J-;YWv;oacupEBq1#u7RCjkEO<zADbA;ztq@xHmlAHc{0B<e}nIs zfGw(iuERdrX)XnABYB-isytfKW)hp7Wkg+9Q&F4aRMg{LmXiw)O=NP2J44igFe2t& zz2(~-?LHoSy0w1XwRX;_zigFsc~<!+^k49pOL1;IS=Z2gsXj8^M6^NSgTC>Tem+6* zGv|EfVp0X3ew96~6L;YNeusUqbMJO0rxahmXpAiIXm;OwE-NM$+xCqIR4r#uB*%OB zyDS_#J$rhRBpz9fPjU{thN!}|rgPrs;?5t74v#f?c&x8cKmZw7-291ErHEC;Cddzk z*5*c)oXTm*EorHiWjKwOFJ?q;I2R2Rc6dXS`HnE4t|M1T=5po|5?8*Aue=l95pg7h z@phZ^9KMQ(si><?v4IBHg6YAxFgJ^_k+m?V&xc0A+c50if9ptcbk=l7#`PZ36k1ij zLdrTLmr_Fb!$E0Fu5~2cxt-+SQjrl)a(g*Bq%opBs;9j?JR_>PHlzEhx7G#-RyG76 z7QD%dhtpsf$?u3Ci>bU=UQ}lxPlf7=PkW}+$JNFkEpI-1TSqGPMWwbxHiiHW8$-AI zT#`C2WED4V+;-Zq!oe0nz^S^Iyz1*TY5tQnmxnwvN1B^QLQ-8WcU|jiO?J;~nXT=+ z&;mhO9Narur6!AxzMVDt;81y7<YLj$9QUHEbIt;%D$v)k*y>7;q*lpb_8mFtICd@n zmW5Ovhy5#SCUmUqPV9)+<(~YuD+Sk`qpKC9aiq`dcDKiki75BF%;u76m*UFPLbC1? zRe9}pYftKM?tpV}w&S&u!7_P3`eX|P$-C46@)=#4@BunN@SsP`VlDHE*eu}CuaQ}q z;IJ(g^{oWWX5ETgrpm5V3mT@9S+MBVHsotK0ERK(Km?0<9b^sn8}JpZC|QomW(l5# zW06b?46~?%)C>XnRbpPCo3;t|wlS-6n(^4Yf+c3cnIS|kWmGHZ#fn_Nq{jM2p4`QC zf=rhhDbcQ(@J)gJEl+BtmZf#X8d^-F<!V&cA%-Y-adyl)P>$fjIuCUoG?Kv}?P#Z< z=hM-HpyCKy<W5E$4x*1Baa%Sxif<h-=lEcdml)@WYDqevh5I%j-m@&)O3t?^J?}Im zVOOW>xSEK<$Rs%M{lXwZkZ+C5IiKd^sI&P@LEcnw1~N5oHIj4}PppaUA^ZXe?42E4 zn_%nTAo+JKCswrmRqw9(u6-8;jc%ir$3NO2Bm2l`#js~^`vIr+|BtcvfNL~6??#82 zS+Biz;u0q}apDxW&vw47W9PbL9mkFx`*XZr+w1k(yWTQ0JF`2LDfHfZF9HOjtI;I{ zl8}Tz1xcU=NCHWyAcO=6B#ID4sGR$}5}KLa^}WCQ8yG-{_dVyl=RD>AJkS40$O@q} zn)N2L5>h#KQ#)=BR^2HJ`9F7t(kSeA<T*2yeA-qWo-5;}$b?G9dSy36R-OUXc8-WW zcP`kiwd5eIihBYUip___oGEBdc7Y43WfodmUR+U$JOBrp;Vm005cxhZK~!K>g0z+u zSh+ZT50(fvJPblP?o1Er;e4}2#LqXv%r{BdRk%AzH3`ZqUbJ)viJFQfcW6m1b$GyY zAFiT=wA!0+`ZKTHOr6ZeMTVa(I=Oo9QDqe;kDQGtjY)=-%CX#q+fATOFx7ncft{JE zUG)v=Ji}sD<xu@0eag*Sn>a+9f6z=bPoPHLN;Dr2Chf6}djl30Xub-n!_t3ZZfi&1 zLd<$M1>B>ZF%jEp>G!SluCDH_9Q0Y_^tPp-8NviyE5oPhT-zCO4NA~N_4G=3<Hx;w zd?}Ps6wTEQg(cFx`PIP_#QIU_Eyltjaak#LkTzTs$E%&LyqZ!mvKO>>j<1WxkLOMq zYbRt)3H<33cmvZ^o7AiIq~7L=l*#Nzzdk~SpLG-3`?BBQ)Q?vYD*}j^P+8v2Nd#cK zCkvOR=pKqJQF?q<Uq}2{1t)LjHm!?PTGU8=`;V&~FRw?JD28>!%*9gVJm@OsHna-c z_(PNZ)e6*E4iu;<;|=uwDs>B`X}EK&f%vdgP$jqp25d!VyD@FJi%&vnh&|X$Z*m}3 zYYL^+m^s_kJY1(O+pVwDGD&zY5uqw}K|H&4q-31jN3HAZ9~o#7lI!L~cT%>IzD8e* zV<wcSM*2Dez=%9>Q#epVbmxk30$fL#r-@bB!f4hZ=Yvja<#aEFL?6A|OBi(3>7OhS z*jTVcM-tQV?%u)4tm8ld6lrG$mHlApVZy%K>-GT=Aexs1y@%V!2>JF855VXFN9YW> z)Or+DnRb2K$TsgjI*=Wo&D)L_tkCNP(`PX`9yQk<X%gB?bH<G9+1>><hf$|M%Xepy zuTs=JK9Gy6=dDgukC%2P3FM07q8@;V*4yjzn``+5SRg5*k%wDD<4Z**d}YxH%Q{ij zmP0Kpo*NyI{R)h>*8Pln+rUgEYh!S@p^{7;EUO~dFLLgT`;nt{VOC1JKeEXF05 zc)guXEF0Ovdu!%O^oipHaoO<vkPg`%o$6Why#t-2L&?%s#xCjc0!6%9NICS0-7YYK zFtG+^H`py72u)~PMl5|J+TGOyhL!22i~&D4#e>ci!EutG)3UU-YhNdfAJc`<otO%4 zsCM5VCe6+^FQU(*J-VYEHs9)w!n49BiC1?WON}BEdCa!9Vyp?HKWGE1WP4kq)wzGt z$@Ta2yID;erba8DeTD*Kx~=v7X}a5l3B`5C-ipoW?wBzk6V9X~@9A3XR*zDQ4iw03 zMs(s*<1tm?Zd#DXjz|<Lz!<N%SRamE@Y6oRssxv8n+2e-8${J54n&QiNW^P&zE6h7 zAc<MvibT*w=fVmf#nHs)(g`#K7|J2^Jokm=-5FkRq2L-qw1@0FBM&4Ghdg%rp^gI& zj{GC%*^t6Pop-KTHpjO)!1DibkA8#XbO{8flQZF6Oqj+tQq1>%T7pM!lK)->|L(oP zc-&otN~Tdk$^E4(Ni~VrsCOED=rr}6j<%w;#Exsko)%W=^vf!UWjN^t#DdnOJ7d2Z z@jSg*W3vLSy$$yMHt4R?T}Uws?855o0Xb>hnGf_{$O(-=E(V<dSjYK~AWG|luw>lH zKBoDgk0$(xLF(XmT=YgIQOs}9KA>I0bye3U;opQ(t4!6q++<bxc)~3p42R_qrS!j- zfp_1dyfvJ8i<N9F&xG}G^rdsM>W9<0gx~J&z3&nH{ke7t_|V~T6PWWDpoKMJH}ygk zG;jcU!-vpi{s^5d4}n#G;2W?5qcsX0s<$v>-lcmk3^_+gQc&#y@@n)cc+JNxs`2fI zTt?_sq61Lvi$G#?480K1(J4?$z*VhgsP9v4FCF=y9}3{?a7$49ADt(I&v=TUD+T(9 z*G+{aC*bt|tMDRFIG{5aNLb|>2CnWyr11N}F2UUJh|Bg3(>fCI40D#rYB(`LVx=lb zR;Z22<u;`ll=#v%;%S>i^F_aL^tL)=mNo?}$nN@b&62?=(L!YUg9{Qh8T0t23~^m5 zZ7FG5m|s4k>suJ&Ce77#12{NVY|bjOkg^9L=_W-{eqX3bvo&|!@5cfA(&|il-vdCA z$2y9M*}eVpIzx9FajqCoDICdeHO;l9af)$}t(slBbWc=LCQCL55_QB(T1(k-jx=Fd zp(!mf)jnFz26L0E#x1nQSFW|@tmR}uq_Dkx??I-fEvKJJ<%_1J1z8*Td@eeRr?uUg zm`>7i{eC63C=tU)kK!i4?TT?MV+Y`|sEJOmi&VFSnoZpe`JAT1o*HGDs^@;Sl2Hpe z9Q`FSk`zbW8-jzdjEKg8$$V7{qPXd`M`&p<jkXNaWTr1Qos{(D6jY@bjBspYIkpm4 z1&h_bJjjNjvUNNXM|qvRR6dzgIp1t*T3A$NvxoQCZQ8LG&YXlu@FR6%P9>AY?Yd3S z0+tNy{S~JEWqhqGt0^~&F+Culk5E=XZ*}hv>S^g!^H7?G`OXoM07=<F`y$w+d-gTR zY=~O|ZvUsI8uJEYT9r^VpFT`;jL&DPC}}uBN`jF!R=UDWbEBR3?0(?_JY@#dilp<V z?7V_h@(Ai9k0g1JiIp~E<Af2HgZSC4+Xcd=#R8#pizP&&^ag`~VVjz21~B_x!;;KX z)VEgI&(Af`og<4it%+3Xz>KoAR6VCr5p#gSDO+5<DwZrX5!QryNR?tGs6;D5e5#Vj zE4Iic7A9A^vLTU)JRn#VvvODHk*Q+48`G+va=g~6H65%98fg#!4ai^jK0R4Xg+xr# zShxhb-yA^BP8jVShrwXSGWagJ{m|tGnw&#tY4HE|G4Fie2mb>d3Rv&H1CY1j@N?K7 zVR=Ky9Rdm_FXZ~bTOc(E&gMVB36%(;Uj;hdgFJ2o{a@jiKIrirfVX*%;D@+9Xzqr> zmyq8R!v5|PfS$nDpa-ssUFoACG+F_0Y49){eg?Ur%i*~J8ZjL{wf2iKdtr)rkTBkO zb+k7A567`d#$cXke#sN@Z3VMG4BBF28-psMTO%S3KDGLiT%LA~*nl5+t$=h__10nR zQW2FKgG-)VsUrIKn6`<ocPUam%%zMnr1W%2_j~c6s-JAG$4FUB$b&xDLez7^afCj$ zVmI4tihbl&K;&?*xoQLCdzi83Ll;eY=xcZ}95T&3z8MS_#C<TldVcljL_tqQkc=;! zi)CTEQ_irq*}UC6Prr#b<7KQ{Y1q@)qKt*nUrGCgbpNP0(6>l#Sux04Jxd)r2L)v1 zkCyr}nkOdbG86?w(7lDi%_HuZmrZh}v(h(aI=%cgh803x)Pt$c4Rf<xC7wGa$@GJc zv^kx(W9DSIANI}H%sX4lWcB)*2Arxf)>_xLi7*f1olZWa%_)bD*vjL6`#Mo2$N?JL zsMi&d$n#IHS4{E#$N7ZHdBjRlp`^8Kx{235b*qt=Y^UUdl<pFiciPceX?JB8{y_=; zVHr&zqY*lW@Zwfx8aAQRyvkDQ46k#wm^gz1X~@09PZl({%+=^Rv~9F@H2(-Jj-}MO z5>Cq?y<}ppmqPYvQWVuDUdMO^zobV86Pl|g<;hwq1h^G6TeM-#qYn_e&XBfgkd~*q zl{xl6G8j*zbk>VIp@1&tAVoICg(J|9M?v@u_@duqU(ev@2xaKW`LDx~w_NmLX}wYN zE^;<wf~anSO!pN}wsbOTCKeZOvbT!ct??oNqNOsv5uJ3;^-ecE;!=}EV!oI(t*1AS zHrpR^mIEjr74@h0OGV^mwq^>RCcC`0JiSjYQa2cT=Ue-`(QaWg3Kk~N>)37Fi5j+~ zo!Y&Um%we(F*}Efr>5mX5Xyn1Mhd6CrRlB}DGFA~a$BcNfXwRK21l8m8`N!T5h-0g zZ0KBU!#cz~Eo?V|Ox<%Ffw@n2;rrn6b4LL<>k*}LKEbGYo<@OAI*tzWPIZB88%>F9 zgZAZ-1Au$CT^pdz&D&<@{<PqDV$RKXu5EbSlAK=a@U}F7{tKBmmprch8U2RG1qKMI z&(5Q(cQ(B;y~rt{9wBExY*ztYl1uT>YM1w2=F@>m0bQk1Zum&DW2ak(52LSEFM4|v zr~N}9&$z6)VTogZErj$*ENE+}8QYjppAKmq`xfsQ*7PbSGH{FU+peHHA~TBN$!17q za8Qh9bP*u305YP>D}Z+gz}^F~6Iecjgd5N1#*^KTTZHNv5QN~BVkG$&g9yZ89EP<* z&r2*b0s0PMu=Tmr{*V-k2EgECZx{Jl>de;FjQT2TpM?hNt?5NLkl+`$a-cm4cJWI= zR0cGsmweUn1lVt7T0ovlfq*IES43tJ%cVfa?n9{ejN8KObFB;D05{lO$Q!qZuqdFn z;qiJzcKhEszSz>ya&>#*<;6DW@PVUlqUpCKuN&$*=`t0ZqfgR*I<b{LWk^-6=ZtAe z(joZve@#n<73r{-N0NNIoNP^*ic)O8n>Pe#am0;#f0Xu=JGkOII6gQ=yZiHYf(?V5 zwMnacXFEX7zk3K8X2HaqKZaCzut#?gL@9$?XL5-ect;KnJ!gV#4FV+GyNiE3?x-PX zd3gUVH}xj>m*eu6(|*OZ9if?*8n1L*<Q_0^2I^;L&a4YZIc^WxAw<-tyF07&ixp zG;fZFQD-|)cR#|{4gc=ZaHjk{$YXs9f{B4^wHf_$x}32>f+m%pPabYv8rVXNyYd`% zaph)iT27fCRpDsy?ehtApl3)m6y<RkiA}QEam}A+iPY(;cLj5joO)wo;TB-0u?-jr z1+0{6e>F#ar7scrU!VFP<M<YuN=G+2x9bnz>{GLls>*VoRdCOEzX1Q+yN%qUMHo11 z9IdC^2%_b;n^`#t!m{bx<+6Jvd4b4+f6%e4TBULXV&OdoUX1vgWK~LQ5UD8g`5}Aj z1dYXD@1ilw#PWDqE*}NQ^Q4{IH4~mn+H7atC+878Z=QU>D!11&SW-o}?eSiZY?W{L zx6$slWF6~?wSBf7azH`yc6bA=D)(~_6l?@X&10YU?5VtmOBR=J2WYRJv0Kod68fqC z*{0CqSFC%2J95vu5)y>575{+4UzE(8Q>k`~28;=`Nz$0_5ybPg44r8ux7Il$mI=H_ z(jv5plsN*Be;K6IJSi=es#zG-e=>twm^sohF{{j|H_z$BW9I{p285gt)NvrFsKd_D zh2Xi7aegRc+zr7~u!Eq>8@L}(Gd&2c5g>>IPAWiXA3p{W5<EQyNJ(ghO?vv#&?(lo z7Dyj41oJGmO6Mr#rO*K33~r)ut30|ssO83P8)pOzHBLXd8<7YxJsGnrz+Vi5<#8G8 zu^^m|b0Z~Y|9)P5WqwV+y0uK7-4hI)F7)}#?B07Wp6XB})DMEX{PU*Kdz`w2j@g5O z#n~I%aJxU7-w}>WIY=ayv}+jvlVfry<`w)&IfU)Z&+q3Jjkl86NsZS!lhRZ2IvcaA zMiXgo+!=jSnwbO{N`Ef8dE+iKE%QBV(YxI1J^+aSj3&O8knv#n?OWR8cXN-T0h-65 z_YZ{KU_wy@@=){Jio7IVChH!d26sPuv@FN6kv8<Z&fy{?e1$v<w*G(h{o7*B;*FlG zZwl^5?lZt^Ch>}U{@AgBCjLisexIoLj;-QjHy;bxMldQ@)1arXa}zK$?u`!bRFg~Y zIiuJ{`;AI8)vnG2%XMmpdnDcBFZB*usa9-0#<lsSRp}nP+l|J$-I4oz@M(SEKF~}9 z7~@SkNQ?_?L%s!E<pQ+3drC6@$pyy-czG8Zm4fGgaeK)J#YxT?IMCSN$9bT!^114W zSco5*VkD#sSNO*ALv8h$<uq^v2Kwe1%FRvnxV+mNfp!~o9ywX{b^~;zxLKG5e)SPa zd%OoZSwr0cTWBkK{qqwTgPj$~a<T}-<yt_0VQ*WZtLcRWP$T9O04jDIfH@mo@cO<A zRMY7IRFER$$B@>;p@xxXNCt1*wZk5cNV|x22zXA#Z;kyaHH^V-S!&@v%4oUU{D6>_ z%>EU-`RZt4`s%Mn0NSLZjI!b0$v=`yz+J!G+}Co2em=hQt@QPCgYriz>ZZi7erWZ1 z(AKu?VA^`jI<Sds0x&8a!=4G_2_MoLKD{7Bv*NL?wS%=Irb$b0F@`f>T&isuUp#jv z;37F6Er`n1(CTc8OtkwrhpOEv!0(K7r-QRgvu&<yP9oFzIAM<q+J2Y4wZU8sv8w?N zG}Mud+?_Jx5<GF<d)7$@8+bLjQo!OGt^{5q6#)#-Z7Q6e+U00=mUlV+Ex*46oK`Fh z3`z@DWBES1znaw0St3dXm-ZpSUCAHp9%(K%zg0ZWy*`%*hEG*j@KJtqk+6K3iLHj9 z{#x1i=KIBE)T=KkYa2<-Z=|FRuc2X1E9cf?^L+-6)0GVnR`&EkSAiz8$p#ov8mC~H zK_$p5w+Tgh76m8HXbGc%xtzk%p4qw%d{@s<u`+uZh0A4K)s*&oll_Yjx<aLWoz0ZS z!FK*=)xE(w<!Gn!Jy-yD3B9!$H#R`9BX{9I-~1zfrCpZbMEt^;#vw|nI=`f-$%jT$ z=vUN@y{Cwm)!o=NFw{hwB;03K`27XI%W)nPhsD@zL)=H5hP(Hc+rWy$@1UUtcVdnM zH$0XpWZYA>_d;wdIl0@Obkj&_9Rn2Za^3V;&Lp-NJuzVxGq<}HKczh6$?oBj!F_2@ zF%WQtl}jDRtBE3Xl;UDm<S4}=Ejq}{ZO6Hkyw0v{T4kPUl&JaTKZ3Q~Bj%0@CPg$} z(GatVh#DXw(WztD#!AXoIur~5RGa5JM)oS@1m;kBhpci#Ogkv)hRnERVwb(6X|ltL z9NANK%{dc8D@AEqB=40kkBe%B95!cs7t!0^ZJu$an9z77VwflrJds;fvsmKyckV;@ zErQ|T7O^Op8vsIx)<LijR0YJ({Fpung`?B`fT~m@_U;gKPp|^fSx+;5ojB*{G%Wh( z37ZheY8Lkr4ffR?6zJ)m>+f9~(pJ(<og|}W(V6#;U|cTR%?7Jkey{I%uyt37CSm)k z$5-6uwN{gEQxDV4tT3#49kqhVF@1+i+@K#^>C^x`-8Q7yTimD_0Be|5uVNAAxH4*& z961&pTYJr8$15hY;RG!^Hs=>whrxVaLWb>q979C2<LxTHe^k(nO*bN&0WCd-6n2>C zg=5G=I0lYZFmoSE&ZiLEs0xuo_LdH8T8DiLU4XKdi{93aDHPWX=M6y)LI4tbqq(V= zPz@396+yA%#pS&Lpub$p%7c2S(t8v|BisU#053phazq`T=TiJh>5QqvFX`Udud5zi zoG|83sLCsqFAVj&@~Mkyoj%VkJEG=!6YzI47EhuV4aX$@xx9`ZQFt1W7#vhw#`!EE zv;#T<N-ZyYcXoH7Mm5gw(|`wY1g&xb3<egM$A%)N9lk8dK)l5K$r^Q9VsBLvKX)ak zyBVdcvMp4AK3gcLI<K&-8e_M`W)&SkOjmvUJSPBhIDjGseZmh+G4K!i5gWn8Kp)?+ zDdsS+XVZZF8tYIBcn>TKt{<EP7{^6;e+Yfjk9jn}){S(>=y<Icg1;YC)D&}RAowA> z<T<?;!-4$jF%13r6l`8B6$JvC@IOR&!3FwX5PF6S!pEK&@F5sXWIU_<g%cp9@uTGf zO%Q_J*uCC2^{;sD*1tWL^>$;!jeGd9JW0Yp(d>OrPj==u*$g(}^~QuTLQg3PveKW- z{X^ztOQxPs8wT54T}d2D)^Q8xuFIOMP7vdvIHAN*N-`;l<w3NN(K#@WHxK3)0cQO= zhtNY!{hI|rLJ72ZIw}@e(j^3nGJpPEZfD)fdnM~3^s0%6l9P4J1UU-C4@<JFrAz~1 z9BOOp3vrb@)k7;;CEjL=qqxFGC|l3VE@(4mibUze(VGXznzzuMJ~IEPc0o94D}_o* z#e<<)OJT)ENhXA$V`>vj7ii++oo&H6m%RHccF&Q=zhU1)7ISFPg*E_#`=~<-oddjk zo3Mh>`JdagkA*~Z_f@S`QD6t=TM^##R@)T2ZdS^_-Qq(FLamU~_Gm~vIs}rg%#Ld) z%B>t1(?Ho(Sq6=ruD>bdPvK_7=%i`5#*Au@B&jofdZ<F};!nW>7&)OX4gKBbDG;2y z6Lsn~%JPrFUhuR}^bZI~y+Yx*jF>;PJlcJyWubq7$t%yEqRQK_;#76%Bw@FVYv>`) zQkqB6T#<yj&ukNqP$}w(^96_^q2Q)J-qTpxZ{$$LM16VI^fV|>Ubb-Jw7Ef(l+A7x zl#+tTS|L~x$a97lIihWd++|f*v$=JeB_23~jTX*fb6z4xr5aMqqSMwwX~y`#NliSx zb*!d&VM4_h!ag<&0&KIery3Ljk(!z{I#RIE4b4(^M@5|Jj>IyaUfh?GEp13&sO(-9 zvSm}kbSc*~WGvW64G-E%^GLF+2KDUld|^-7qpsc&zA7(IGo_z-YF?O7xd5#~FF|+k zbGFkM>nZjX*iijZ&Qy&16mqEGmAC+$tf+JPJ}3XkiLl@N?FJ~+;QHzQ7I0th1K9;~ zL*@nYxUfG4L&yO!7oc&0A7FcdknuUbja?V`*+b4_v;oWN-SHiJ{p*k;g7u<9@W%m2 z%m9EB&|mN7p$oR#36yz4r9|+1n;uA|1{>Ga+<18C48U~)2nGNNDloQV*8xc%lJk8C zjM&{xpKI?FF2B7Sx!&W=9kKtTg`ZDTrefuf5kfVL1>TEQ1V<U@u=hL%mF^h+^aMtU zxfN4jgf1Uq4eH?fL3rj7!!zP!JiUP)M_xZ9>7y|4)9=MLTV$c1iwRJ)H3PZB(`*pk z0!)mrfgp<u3m_$fGYv7jW5{m5sL|S>XY>}FpH-y;Kq4Dh!V8#1FOQ=8=YG%S13p@W z%H0dFnwRxL)f#-gv{^$1v3hB%hYf50^l5&QUK*XRL}2W(GD9=Nz}NGJOg<H4sRcDF zZu>UJte8EUumZ$0lCniJPbdJt1!!elze86dP8AeO|BJP?$~m&ruk|xn0p$AQ)P{3= zet2(<qRwAh+3mG@X`&ORVT!Xdgj0phAh*AxQu1q-*G&Uc6Gp8c(oBx0#?dTeJ9||= z1rI~4&<Fw|2A}U*TA{2R^_6%yW)H(Q4&w2-l~JF1WPh8~5R2hN(Hh6sr*U?H#I3hm zv#AE=0&RY>X-@JUe?Gi~j&F_>;q{Cy#7n*}Hm<MRhOAhF@R&x6o&M-D@G_M{Jypia zZaO+j=H5#-4Ak<dgEReORq{urvKs~{HXN;yr0-A~fDr}qAn|P@jSb^es`_~pDCD#b z^|TJRPgJ)G&~7rTZ*(%hhfp9ll`jeF8D+eZc56F9%;$^@H&3;O(RckxJZX<)xPCzs z&!COBdC_ut9i?lityX#`!Hf=bCsQA)3d_s86%%bOG~8(WaC{f5QGOE?{d3DHioBj4 zBCjhJ`iL%r?UkDagKs~i;QK~1=^0ha#W$El0{!M}d{+-zdw?tnx2pEh^dB;qrSzVf z_Z&dBxE^x^Bik}215<O@efk7S(*PBP$`tR?`B}9>_81{=d}{qRZ5LMs)laMfnN*vO z!w)pBAi<-C{-wSSGEtre;cb3}aI=-y&LWYf&{6q9eIB#Jj?2?KTJ*dMVg9sI)REE% z6*dCC?tg5UBw#<79~KeoOp2R5yKjvHUdIy?dd6G3X5Sq?M7!M^xB9KDaURf#P1weZ zd2QrG(WLaWxYO=K!SW<V`&w(gu=(+Bh&bkkBKm&}z0t!?Pv+N-WjffeT<Pqr=O;RP zf9^uw>%zveRLE3kr6pEAOz4^a0}U!e&X?glViH>hO22GX-FL|DfcVo~KsaV44_KHM z0+d@K9({uZM(Y}$vF+UH9kg`cwj)~)P3<x4bx|R7o+4?Ub?)!CiOlyQpY=@cr{f*^ zee-hj8fSjf*{JqxY%CIK8vCk?X(|hmS5cVG*&8uz&$le@h<4IJsqC!U+!O7`Q`#9i zcw8DJ8Q591uGyR>+wQ8Zg>y70c5H4F&24ZpS!AAJ-)yLtJYEJ&7yQkx1WkFFq>Z7@ zO)XR6we<|h^a~qY^%x{^e8y1SeI$iojH9LBGtg>QbZkPYpFQdb#xm5RM?w#<FnKBn zUAIB@00aN!O(QzM^1uR0hz;+BFl#LuG=uC1purNm++d4gmwKFY^QS~3$m;p0-WSoq zA3Jx%Ax3|So`tYq@YwCgELo?`jX)`%0(%_bx^V%B8ea4*11SU)3c{Iua(_^Pd!bzr z?C=>r{~G%qQXb#;`g4)k;}g*zd+aJ31NIhJnPG2WihXuyY+IYxy0O^fsUid*9y-WS zK_~mbNhC(&4Y}vRzJ$z!(3g)PqX04$!09*%9L}G4!|Qsd9oSQV;Q;#xH6DNx1kL%a zJ#=!i-3HVu2v`qLxTOb3Qh-s>2>bH%5QPD6@Q?vjhjy(Pu?qr*#lU%FAck^jLePLb z^fByuAD+P#S^gt^XTBSX@`$|KRnX+y!boeSnI@3qZAoRh1?m4VS5oW9oWds;W^DI1 zbFKqNOKGOE6p{a!C@ZBqvxep&ynW5uOs1qSYkSgUjQgy?DwujfR{Ovz6NP|ErM70F zUz9&$Nrh1C+4Z5${Dq-RYI$7<X)+BB*+OYvHB>|u=hxxpvU|*lvZewbSc}+`isltO z{qWC)PjtVL_C}Tc_d3@hSE`l0L}s&kmfEJy+8!;S<335RiG<uO0}~1g9+3o{V&P!2 z5ilMnb)%!_-}c_@n5FcP6Il~{s$$YXC|r=Pkcrz_4Bfb>cpYlh4hhX!TC|^lsB%Fy zr4p5nPlwQ#8YG1$?ahXkNqEaNAPp<Hx?^Y^X&UOA>Pxi`_0tz`wC$gdJsMQOsyStg zkX8!^0^G%IDR>xhCd?NLtbqRop`0D)4-b{2YbzEDyb`yu1>8ZA<ns4TwUR%lQMT0Y z16y%vUwXAgFl3@LI4VdR3RF#1<}X8^JzHU^VG!{ZZ24$Lx)SR0JP(TI_-~!H*IVg@ zx}0&vJjYZ`N-vOAs^o-hu4q*teguN4I-f7Q1qK(sN?1{-WN@;Gi;GqWB@it5oSE_U z5kW^dRGi#C;$YB|aRIb8HLhUta+{Vo-try?z+<r^6|tzEKTODNIo{mCDpv#cBW43y z2ZL63D?elJ^wdAJx4+|SUr6?bAZylu;}6dS{hx8b?&YN19Z3M%H|L2==64-ImF<&o zQY=^K<QUQf&VX_`eBeC;GF8YF4hN1DBCKxi49gV;z#8(=;p{-?Cv*UD(jeL)V=ti3 z?fAhDKY$zrjHu|~H~<I5?}j&qeQ?Y!pSqDu2Bbyd?T{Cej1V~SVY>_<a0IqoIQ%Sj zEKh+eCLI3E4$KB?ECuvNFan5h1&*GqK%~Ip`ME@d#1B)X*@;YiZq{%Q^LjPd{bZC= zK0xIY7E<EbKN+m(VUi)!?ZpQn$k@Di^wtW*CAb81{YLf7&9c#{>btNOQD`6<n2*7( zVEdhfomjSV7+ImjBLq1=PfN7t)wle$k0ywTmD)Qg3%95pS*fiEHQ`ZiSwkgMw*9J7 zk!#8_{ti+{4R2l7Kt}DwlUt48mb04C1Ihie`-J+wbQPG8SWM)D$q!GW0ntZ&)|ikc zdst+vzB5O?epfsuPp3j^R?4F{rc&RLcUY=RZ3WaebPWpBETrYKez=$K4g^d;Ast4| zOEsFTZaTjkf@S9sfyi!;&GQMe9m$UXWCkp2kcI$63DQPEl7XdqagQ|vyg!&wL@ojV zI9RUV87LoEooJjPW<r1Xs*x-gh@eEmqz6zzgLy$0BYs3QQ4(N~Gr+;3V|%}ndos3j zbRWZcO8jsUArzoK<F)A|8xTT_qj$o84Gyp$0fM+>I~;ICuNRAweP~o5Frqt1d&P6W z%i?vGxw^}2&8Y*#9l$w=1xS@4?0k_sosz}S3_FW{(=w9|pxaeb$p0yCs)nCFf3<<; z=uBFo6|@0Y*Hb6xLpt^Gog`@pRW{AOl-l~o+>u9;TXjjWU8q$^_ApJ+I6>~<)^PIL z%Sl!5-o+#I-X`41rb9!oQL5x+#B4=IR`**#zjMA(BM&eZ#R@_GK-`)Q@(WitkI_Y? z2P@&X0_Sg>0(^~U0JcX*3W!kvomiaq0OHxZARRCHnZiA2`MnP|4K%v-gYS6`SclQ` zo?8|4GLh@eT5)`}_-1~o^FILv9{kN<%9RJ|d%Z&gwfHOVithftvGUOrLT@y{P`3&- z*I%v05lV%LIlblbYwqY!WA0l_hcEng`%q#)$_feEJMeGM>HM2J5DT_W?@hW7g`lxQ zhB>|VWXdU8FbAZNtGF%jxoEXc)8DzgyXy<<^-i5)L5HMk{yDX-@jwBJdG=s#E{xu^ zE+VN8&u}2wc3>*s?A@~Ck7iESWgwCCbAcrZat?RG?v-X*gln?Sy&1qj_Lv8U0zKTl zN!2bu1`yBOhl~l|@h;jt-a6E3TQ#LqzyhX~0(KSw8ZnIKQ-@NW2THk=M{d<h%KY&{ z6_|9sC7nZWJ2e88s`)_cK&C~nU%3ueoF10uOttMaI1Vg3VW%qWIo=AsZ@<I>&x8cp zL}ihp30M!UHIqf;=5ER`A8n-zcS_rYnN3hvP*7G=x?b0*$em=|tAw6LS@d=iUc>$_ zK{{B}v!1QVDlI3C-OCphSC5y--+{FxOH=D0pDc+jty*fStrOhtruR0s&)`+mj@$hW zb<pB?CSf71f!R$Vfw|vWyxLvBt=X%`p>Smvj+x!$MTTr$Nr@mWYa5tp6kS6-dc>fo zPqc9==W`nUepO-KJgiLApFTjBK{&e(oDtc8Wj|wE^+}>$)QGq<lHRdO8m1455Gqga zouO6|YWT>Kanx5`GrI^8kF7y2i`HGyE_hqgoC$BDWZ@fhjf<?ThMo>Zl5xOFWsHk) z$$a4=PuzW64R}0WBAUS-U3UAZkKpVkr_JE!+wdc4%I=&>{e0po@>OK<NqT(a61<tf zA&?t$HSF1p`d~1_kjuk3D_vbHV#PrGkPk`w<`yyvgGlpMZH{Q1wT8F*{WF~D+2|}I z!JNy76G+8ALYG|RURNyDJ8Gbx2bW_{bQw)Bx92v?TVRt?dXF1=ysi0=2SLNLTYB{l z;12Mrm$XZwh91q@u$3TymRSvh1LafGvsuhMIk(+QnOj_1GHms7EcRtbyS5$BHtDL# z4695f?KM*8+_QVlGYf?SYc=(oN=uVg)C!b>_!gGNX`CnoMX+AgHjl^aiIV#E1Ek1T z*w=Lc(-7yZrVR$Lid&R6S2qjH+c7hLbA>;tbo>3Q%Ld5ijmQCPuYZa2f@vJ*8QL^Y zbll&bgdqz4Aa;!|?F_EaZ<(#u4L!q52QI3p7>7lmeh9AtuR!jCCYqc0eLRYr0c#_s zLnEvC<-D6^{LaGHYN`td60JWUMrh`z%<gM<mvZlqr3jk4#~-v5UU`58NJAjofr0`g zEuh^IujIp$_B?g;E1HL+*KmZ?1YUv8nt0Iox(7|(Jn6bYX@P#K+47`&wDkRkcPOCC zpSo&He?2Bb@f?5~a|Q_lae*Kd-+*2L%LJ4jcmZ+#Fhm+o4xoSLMPPCS>AMXv)62mC zkfni>d2UQcqS0S5JCJ0`=p;zx+b4a-er5>SMab7jQ&WenM8`m@efIF6mkE6BPsV~R zVq}J~<es5?{3)1Omku}fA>BMq!Gb{<oY=Y_g4=fhx4^y!9}7O8<xd+hEe#Mn#-0*Z zLax^(W6{Vd;8|8bJX}!dy>b>P&%@?|LCi>dW@``3U`XS+ytN`2o`%Z+CUptI7NA%! zh9CQ`xW$D(HOAO(2jzBJ-KWiH#i&gzCDn(>Pk2b4Hi%Tk97|`);&?6?EX(;z=&Yr< zwa!vRT*;zW)T`$^znW+n%3~uWOB*#ju%jc~J??^}z%^b9R1qs}EOUl+%GFq4CqIPp z{a=dHt)sh>6S)>r%5*%9x576SF7?a%X*;8c+X(VDM=VHSww2`Jwdte)n%0w-h8CuW zrcsDoX-Jx@Y22+H?Z{T;PeV8%I<ZKIHa4+{%zEq{$8=UM8rJ|liI66pG-$`PL_X5h zTf2KyM9vadNL=X6an=F@W1#@;x3S2Kyi{U-PVdwff0*`FDXC)}ba|GiV2lB*Ekrew zDa)HHM558|xek&wd!9TxA*-QF00#f1G{r*8?|W1>OH|W)4_X)77D|N!a}!;aGDPb| zBU*erV~)wviyVZ#ybUDDOKlk%7sJdplaYQ%bhAZ6?v|MHv*83m?mXuAN6apG*pL0~ z_xs(z&In0e7*TW74+oM}@XO;or?5qy_ye)0TZ)VCNl&MnxY`OCUS3|Xj&{;BMmleI zN}SU(la`6DvQnU7zmG@zBf>H6SQdLSODyOUFeGV<qONkx&MByymxHQJPv&yXnWJqr z{KBh?{g149ltFD(;iPa$I=P4D?o$`u-X&D7ax9aCNlJW8{e8lKLb&*P7&+1!Q}C%p zZ0nSujXf|?21Qd__gRGomXt0;CnW@_Y&~^^_Ml{{gPto#;rz%NU>+@oJZVFbB%reo zIp(nn!#~$;1Xee^!PBtQ=M37mAPl!<4eXnb{6RldL7&MB`XMF21}sG<et;M@oM_E; z<^(6}<7dIiLfB0qJ-{?!^liu5+1Y_5bh>oxbOddl6O$hRcSy+yoPos_uv;OY^u&1R z5BLvV$EL%5+vf3^Uoi~%c6++LV~gtu00qa<X3z*}H=hS|AqYH+V7>W_5cAr$pRPJi zoB=afMV`l}vgz@uj4Ip@a$>DP_!Q&4MR68`2(p{b=FbIi#GVGjJ|Km7^d;Md6-3a- z!Y&lvfzm<?kj2LxVdwvF1~|Q*2|zZt4@jD#()ZkZh=!XUTj((a<ez*g1$Q;4TmFVV z1_TVkLC`3nT+MP5Bj9{*9CEUbt&rV6m3O@Dg>2s1KH%Q+yt0V$^MZRWxB-U6pNsdX z$pGb>&iSQ70QH;@%3TGdUFXMmJv?B!IWNpX{p`9%e*j>V-sOBOdn35(^YSD#l%H{% z&@tFNfAh*j_thQ<@|2HEbWSG!o>6t3TanlWhC@d6{dDj&eI%e)Kg*Xvp^KLcz9<YO zRumeO1P0bAPrKYVX6G3eaT7>7iL?^k%tonQzJ}KA(@;pOUb2KYR%H6pJ&7qGkw~@B zyl9Nxea(2l-RT|!Q`D{-J9g4eRTD@%XJgoXqnif;`;>##<K=jr67a9o%D}8tzPvZK zV_ax~R0xjO0J-K)pY3pK&Zr(_IZ$|3c_IYZ$v3jjBh#VAgX8dWcikVDyZScj&dOrN zH<5FuOQ<Ec^C_@xUQO9fDdiNkyiwhqvi4pGpn&|DJ07$izXo#;l+GblL3ks)6E)o) zn={b|ojyC%*F<A+99{ME&G`1thUrqCG)bAWL93nWEqkCuJGW&7No!7*p@4TAw^*0j zR0GBtbGYIf!Ij_N$^`xnNl_E6NT_YX4>ii`$PF!H&14+VRE-kb?vK{t18C(|xv(m~ zwQ{q7CX&IkTFv064}#G#lE^Acu9uDRVAhOW;k&C42q%~KQR$UUo$=+9wLohVRl4Ug z@6%^>$(g1uRU@6-t{&nJa?;sgq}LCh;KdK#mG@>VJ8ywJo^9ziRC^KcH&ZbAop&pI zxEmZ|=zQ{zA?N5OOn2j@gpRSv;bPp>1gnTS)X#R8q)S^5XzZ64Gg|?Fp%xl`xuQ&1 z=oo(>P%E0$1jrPbW365tC8c(ZNx`_|j;#{2wr45K#tGEA*i>Y!>M%*N3#F`zilv2n zCg{yRE)#UAdhjL02~j%~1EtVJ4|b6Ik8SbH2VB_*5WlQt<{9hSpk_x=Fg?ZA4Hjq3 zOd3HPMCARs^M2tJgMhJw5-<iLdCJjL;&bCEX6D2MJG;%?Ompd0b#0_2eD@Kh-KY2U zcF33-gLf3o<2TV^_oO>JFh$uXS^B3p?6VGtEUgUbcdi;|2oq{hH!Eht_UdfI`bg`} zGAbz6S<4k>*Gk*4zR%ie;CJn#FoSNhs@9jL@ic>d0gCJiBaD8iQ{k`kgVb@S!Q@5z ztv&oM_?4|f<fdp{+6|J}y7hsH#re;+0f7L>DTIKRBJLD29xn#NAawyyh)9kP%03GK zd{9H=Mi-P|`kyPsh}Vyy2&GtlG^A-gSE5I}-0b?suo80FE&=T^#9uB3cZqP}X(HV6 zDIoVlFhUeFg_H;FRnLJsxpTED!8n-NYR#j03c9i%&1UnK(qA&5lj*F3JCYt@K8X5D zYp-b_;Q1_fZp2<T$b%+e5di4@S&hKc6od$DT<~-YJ%NHEWB)3KBc#fT>N0ByDb#xz zcj_A(Q70|!MtPPHP*kKThvu*?uJ;H4TV0%eLjt$**-|wH@neMZTSet-Ec*`<KOh+c zOn68?0#xs_!2@WI5;_YVSv*Tv;szLzA%MYSqlg$x01@oosu*d>N*?Z{G?!}b_S_{+ z-C_<GH{TqqiT^D~W_1ZVe35Zf^*V=!_6FZk!YIVjGQ!oj2tZ#DH83Jl{u}2J*QSQ0 zvJOjmNkfM%JwIoJZ5Xnqml<XR+4k{@nd@_EZpM@<vt6EP{=i5==wEzNU0}f(-1F{x zPF-QcGBWE=%%@uG@w^3+P)@-hcLz@Aw>1ppSL$KYJiF%E_32Fz(LNtYM4x@*JjRiY z8rG?eJc6iAG1583t5%oJ4@&4=B`7@7AQx}aGfvvOg+x)F^67zqsShkt5MYlc8=w2W z=T`hT&#zoWV3k&hXQ}i3%M!XuOudt7nVIK|4Hr!&<V-e8g?;&bLe03QU{nBH3$f)s zcWEvi^-<jr#95)k1`4BjIYf=mbH(@$@INRJa*ycF=r)So^2i>9g5Lmemjwgx5m<+A z-;iYxvK@IgPj`L6u<aDm1dbdb;L45N5_9LVIMwr(hb0Z}fvw#hgR^~oi_PK6*O}83 zChvfKhsQjdj?XstJFDxI>XlCS8k-HH`9ui0e%2b2Gd8w6{>O$5=yC1ZhYk){3(>o* zzVnW(?480qqBEJAjZ3^<oL-l8v%I+ctvvR<<kkn(#oG7q4V}X+nUuovlxu*B!Ck2F z*UUGvD~oYg?9pkTr@(y3Ba9u-=Zz_Kgp5>XGR>X9Osn7)sj@2A#iF9z+w}f{)~xj6 zw8Cq-y*<>r%<-%u+3m<(juL2h8}pedxm~|pjTIQb&oFsn`J7{u&+p2Qn3gWFqd{w~ z))}qxP1*da!aldtHEmj1u+ST3WfYo$t}`!ITNfPy5Hp_$?Q4;ZqqNE`jXmH(MkT?Y zzDqPm23!?bX)M+F|A$<HBW;`mQK^HJjf<yBIO3Og0-iHqB6{i~|DVq&Vm^Ou<>tUb zx7P|$S}<>CuWcI-LY|!y_RIb?uq+#9a^wv*OZdcbv;nm$(JMzB^_Uy`ryhRv!q#`# zf|tyMw-;|;?`leVcQrRf`r24t!kx)q&jI;*!JFlMoVPh8$zw0`p1$y7ROvJ4!oviS z;sdN<rcnTKh`9ALI4Kq&B#P65420U>kU)%_Y{-N`+m{Ru$BqrO$0~U9>tIJN0m(|t zc!+rHUk_Ve>a4IQ|9&K!cjuw{!C3rtO6BQo#haEy2(YjIp#IyE=BxD?#=Vp>&^_;; zZbXvARO=7TtW*LKz@Mz{TGRTrET}kJSw&g{dlJf@#BT4wk;Q5^?Jb11W<5kbU5=n6 zyp`kfO70%-L$_4q6#*sG!TJ(1t|Gspc)Ei?1Ij1Os&>~f-^&$Sj|7LOYDimhAGuCd z`#xpZVc6D!#9K2XC0Iz_c5Rm|<N}QlG%uNK$I|`d`H`8ekaCy94Wo|n4WGn!sD#jM zboS@x@$2hFIl5AIN-Cva+1Y-xfcq%BZyYtfSG=6r0O79+WByiY7IYYJ6j#F9KD~`T zn45cNu%v)f2o_sf2R>EU(l$U-CzcCx6fHgItay;eVDYjRGdT^ng!P3(xe`G+m*heC z(n?qQ-9b_w5ZF{V)!~<`GjnFsH82G{dn8m1A@%YkT*r)ZSTru^Z^ChMD^F0fx|(~_ zQT0$%GF8+RM8121X?&FxxgRc;<xE#3n9zEDUR~K%!Qf=WbRnC4r?R~(ggQ%0J=vt8 zjN|j^N5v7g$xNUML5@cf(PD7Z`D2aR!QD4&8qVl2mUy*~uvx!eI>5Ta>>CIPmB^PE zl#*~`WYlzWr^Q6Gjdkr#2;L<k)Zyr$)Z8T)Q+4Pp-Cj6xW%9;|3Jh{ziFm(9i-XKs zeWAIPGutN^9&X>v88y=P5RRMbEE|mP(zhXbiVcNm<v4xo4Dz>avh~CFiO|`6d|-x5 zt|4<=ir>ocS<?bor*3;!UtN<mP4(2gBEZdgV%<3=`@RW@O-tN~5-{uf!+w5vG-tVW zvxn?1p)7)PG*Px#o3|`M{E)2PvaqS;GPPc;3RC2o8LPV6E3O8YYdUjwuRT1_Z3QdW zlT)`Z&Vx6o*XbK#t$7w|^i{bc{krlPE#}l(Ym~E1R$-W3>qh=|lB2W(vdl<ROI8cF z!Hrz=GQD!VqD!@FUK&_xnKtwU(ae^FUEMiTy&Bu6k+=;=!KWwmxYRCctOF`H*BEpH zLN^JhR!oydgmml=u_yajjKtIiMw@Ajy+5itV()*ybN$$Kg773HbwTRuE~FP@mJ(!e z19=+kR{&n1Bf|x#Ck3kt0@7iyHsL#{H4JZu&F9uA22U)<ZUIB0K2C6datEgs?qJ!h zn$knc?*<myhRV!mcYRJc;!X-U@CVg^Q9dgLz*m@C1Bro`&UQ|r`%7F%0r%Db+rlLm z$$JD09a{n89+;Fv-5@h!2vIB3uDi6P(=8q9u(o^`OhMg+CAaQl@RGKR9E;w3@7#jH z^Vc+kd2(s~sA=-oiyC#Nd9vKzo@Kl~1B_`o99{l&O|_+5qD~uWE?HR`Z?O_#e8N8} zuNg~PeNB&K5aNeGZfmc#v_W~ZH+~IQet?2g%3=sXnM#&Ws5^II-k2xQ6d55(U1#bk zX`L<E>>l8yan{S#DgD}^ZH2Ua7WuCX(+h25xMO53(=!VAj01Ks>H$KtAvDv{h6^@5 zi)+F~KK!@~O<^2rx_}EuJ}*aJ#a;>HE?@~~<RI=Myf+L#hnoWMI)bks!FA&g&#j8@ zooks&#&SoEc8D_5%#{}I(4gzcR33MbE$f8m-LP4gb6iERRi^i`Ib+l%9hX<A!=6q? zUiH<nX*``Lo<>`#Xl8l5aFRJBAGS$FQ)7cD&@Rb_2f0+tL%w=Z|8%|(<p4SvoXk^^ zq`K^4W!-L{U_e_oMcoy2mv%LzL#{xrpwQg~Y(2<O#&1wG(`yE!p3>#r^?*a*lwOdz zr4ejT>4NXW(vQldQnCCA$$#{a5EJK_O~r#uGl?fF_Ap7M!px*D+1z5S0wOcjL{eSr zD2bUhD_Q2#IyBV#sbe&S6?lYPg;(p$eUi+4DWrL|#dl;R59+wOaz(SErf?CaV@hDa z-`{NpIK?nFJ(MpcW$V%I?WBQ`>E5nFTh|G9Wuo+MdoO$1cuyow0+CU-R8>3C567qW zPD`)7ck4w@bUK%I*H6x%y+`Dr+rTk<oaY>!fX;R1=cn_J&JK@GJi((grE5*Ub#iis zp+Jq&<5R^!0CuzU)PHnhIzBcTUB@mj)?{`6>h_s8q+0>k#xFPe4JNnW7hK(2JvFTW zT<-N~;TK!WtI#CHe|QvLTJz6?2VpjB93QTpsDXIl$bY=OY};QwhHR#=7H$Rrs_G09 zJkieb>OsJ3BLaYe9WZD;edbcCRgr&T74-a7T~G&Amm@z1RTtGNRahNReH6Z`u}@%5 zy`TxHp2dET{gEHu9)dsn81}PrIrac!))bgGdhHInu<t}fs59__DF!!%F6d~cd3cac zI~}=98-ag;kqeQ}5PZd68ypw}%ku&wH2ATB!2$Rfg#QDBXaEiR2QD`Or`Ngt`F?y4 zyRd{Yub`3*lxN5k;JXFH^SODYQUM?Elj2NyK@m_QMNs*SiWrj|vHm40JG!hoLpDfI ziSt4dGDym81LW|+-Zw47`H}5Hjll`PU0`FbfZVdXV0wo@gc)aiYGP8FV!H3Z;C<$x zZ+dnX?teiZ08(*`Sp0H?0yqE!;}_uPk3<=WBNK^%cg0gj?#Ywmi9Ocnf!fh*v1xSj zu#tD-;hB(ZD=17qLXrl>k!R0mTiDTT@!di3p-1Uo0BQL(W4Rcav}jS`o$|PkwhrY7 zJ7SRb>S-!}%Bg~c=W7a`dBuSA5Muv{LyhLuF7Z*5YtE*sTy)aU#QUJ?#ZdchM>5<p zz#N+GWvA3E51P4$^z}thmyEGPEMwj2bNFVwZV4pgVh<C#2_bCG^ksCJK0Pag89yV( zsMaG>4o9XMH!BOmtTDFr_tA()4@m)m&`RmRb<}naGV<(M#sU%l-f~G3ez>t|;BHq> zckVHoD{t%>o!}?ZZNuFKW2C#ZM*PORAke>VEo>p>B}`Pz?G_EUEi^IiZD-x(0g^ue zv7KCe2yNY(FBwZMR>kK5UjCDufrV0)HAP0*q2|bP%ULr$cSw+uS3xCLG)%QOnNTo! zY;CfxE~i>m(cB=KNGLr*?NnTMix*XD%h-2ZxrvY#gv}aS=^*Kda*Boy>MFpXz2JrX z92#VxlFLNk>Yf3I>17(M27oA+FbeF@Y@BR12&({J!m>|bOwh1G7#VbQC&xBGv#Gph zJuhn|cWTy|!Kb;}_v>?JMwZIhE8Ruel44cqAriBB&BQthKX0~^W91c<Eou^s)Uvcw zWT2|b@6v{Qjs`0zIA)5ogmjw>dlxSUX*Zh)oR1ZjN&T%c*$svVq=h)MlX}#Z&LIh^ zlV*fevZ%Neq$)q7hh*t#6byps=B27fdzW#NDVm{#PkP7<qH#rmxnUbf+!D9)2kwzp zozWgj-+?V4p($W7%>O0Y>K^d4jSIdjpEE2j;AYxc#|=LsK(0vJ%i4VYUab`OmZJ$` z=GfvukqGRGi?9?SI2|9uc*3I}A$Z}L*~f9(n6uJdwK|ip*X2uXWO<#HA(``aH;Bus zR*4yt`*?|_v^|LIRo#2d#j6a8L$SPRur}%V&8x)GG+?T3Xxe3V9dxww>nQ5to|XEg zS;9IHn5?xPAy&&iI^pi<f_<cu0h$6vJ3`ncbPY5NEA&krvTE|SVYOKWWo9)!qU||* zX)ENGQG1+Aa}I&oT3Ke$ZxRQg&X&AbJPEKzey6owFC(mtLs1j#l<#0W1<nTz*}mP` z|NFP4buS6u(`Aje=a)AA=Dn)C>~@5%XLLVc-5va?aInPqKY+l~rev@<=e-CbO9Ff6 z0(?dmCPG~PKKTbc5Fv<}ES}lX62wGY@Ly;iyqfpj-tg;y<mHB*-~E#J=KOnaHkB+) z{=B92(M!z;U0Fe?_3@g-KXUJ_-~av*_H1S$1rhETg69+2vDnR@fgKCaDjaE#@c)8l zd<RTYDPuvzKtb3+O6I0e;uddd=sQ3{Gs8RO(LwEi;j~Y&dl{CXV4V*7j3H72^mgGi ztPCrTKtKnTmq1p-4<AuJ5z?QCRXupZXx|MacHVs;{)#&V@e5%P%x%UB-!B4RC`80V zKpza)BtQt@J6$*f{TEpYOtMjX+XN!HP#{-Hl?sVMGN+bEX9P;+j8ZKT2<AiriCQ+J zmWdQn^{hb9)<YhIq4|y}7swvUGbFt4eBPfpw>C%e>fQM&a55p-egO+l3-haX0K>Qx zSU=tZK|p|wfq~p0As`O^?BRxYc`c|rhLH{tuoPrB5d?(;yew?+p*F}Iz97f!V#ry> z#{6fPLYp$`4H~Uhqt%49&qTh_hT+?w29l-VGobmXRs$~^^m+q~^(4G}K_B}J!uNs5 z=STD_eX$a}n6ODh;~BqqpkPmxxvFzvO0-x$)H1wZJ_x$*C;>uxoz2$L(uEtOo0g`0 zXaw-8aIAW#vP)Z_{*Q5-4}~Zd=9*S#V>!Onl~cF^vEMtZf?Hg*t_ZhXmIt&3H>e}6 ztQ5I6ttwN3mUYx+77^!o7vuW<!gf;j3cY-zL~P2I&K4v?^fSL^HCfhJvoX0=#;|0M zU&Ra>Sb&eh>6z{9=<Dkb(=U#Vj)s|tbzwZfLd=Wf%<=H(U(iR#Fh+Nb>>a+qCzT3M z?4v&H8;tlpOt~2OA5jtI684S|1yMgj0>9xroiQd{a*-^r5;B(3P^)1in>NgBKWw0m zJcQ?i4ib@A%`V`x8H$08nb`?ZCzy|GtY%^hs?OwJW0$+J2zQs3(Lg6N+f`%oTMtNl z-tK5mV4_gfJKQUo2IE`TZ)n-i7LGMcbCIVgrwsp~ZJwm*U22=zqF4!>oaO3?()`if zZCnVAt6Ag`Az4Qu*CzE=tfRK*X7~ygE^k~oIq(ei4b-%>WhA8DxRaf5|L&bz_mi@V zvx<5M?Zd4VKza)s7WP}vzlNS6KaN$#CR&NBm@ffcU(h*LRX&~lj(`&!O_@s_w@g4{ zXx)R(tmJ;}w7yKysIJZjhr4z@K9`n99ZgrgBfmWlVeAf8b=mYZZDv4MP|ePv=*tZJ z7UA@0alV?bksyTAu@2fxNsF_6iYXv!9ZND75$vgD62JFkC#SwY`;oA_oRO`<7o~;K zWJbMw#!*nN=@zF?ar0&>HPNU34S4EvP4m01+27rK``@qM_|{jy^v_@V#%KQGAO7~a z&wt@-U;6C7zWCBRSAO#{oa^uw0!Eq0aX$?}Dd}a*DhWopEMm}JEJNjV!G$2Z_lpMx zzXjq{R{u%Z=0f%j3m@EK-D+TMZSU+fw0W>`>Rg5B?_p@&a<XFzthnR0ZBTf0sP|hP z2)frEuaY6Pz#4S;{QJ<U+_DLEXkd>YLcqtn6g=}EW6VVuExE^dwr&ZbFND`E$YI;H z>>;!J)BsbQ8r%VSv0)L^AgdD@TpnO8jtOg+_kl<9M*N+hJxYD?Kfn2lAO8Cn|Ls3t z_~!rq*Z=t17hZVbR?_vWe+0=6L2yOZ-G*9)xntlSqzwPLtG6Uf<k!w7rkluj6C@ZZ z^JD!Pv&LtE_b~44L<qHE7$3aR9TSX^)%NWwir)O;&#zql&ey;HoiBXl-+uC=uYT@x z|LeOi{MReL`To!T@cJ*X)pnt?mA8))Gpm#GuA4*tPr8qOGWvVc+vLQw-prPn-<)8q z6puIDliNn&4NN!8H7y)_hp+$UdvCn>&2Rkg=Rf=9zy7;_{M={$=Cj}bKmX^|t8e_@ zKfZD0HOL)<`=IUHDC3=nnMGHfaG!1TUsb;txIX;qi(A>W;LDKp^u8#6)Q((6mv)Ud zpv<|r<_ARe!Ytqk0rseO=;^gRK2%(NExzElul)MEfBiRK{=^sl{x84$m!J8;OTYTv ztFQg+`JeyrJCJf21}|mv7D{KS(u#l2gtgs5zYAxP-tDUzD#?BI9&R6lwV%qsiQZi= z(9NDsnocF+pwNs2;*eeyQVC|~kZ|*Wzp_~CLvHTw+W7hrTVZFakCZd6$(>e_=5*$J z5~N`tuc!fxkvUxln<ors%@8cY4tIBT4$2tcdeEkr2$^Z8PR7}0pN%u)*RoW+6CKSC za0;f^U|Hq3h0v)t@tuaWU%dC*&wuS-KKs{y`|(eI^|PP(@(VwB;l)?K{roGh{Wlmp z*u(&Y*gZPkJ6N&+rN}AT4)6NhzWuOsf7u)hAiNKFE2=H8Fn2U6O3NL@JZV=GH~YRi zr?9A<c9%-8sGTl7Mw@vP4PDjK6%|a$@I>XpdN#LO$m7+2uTGfPz{`Y?x;);}HBW5m z*ePyq0`Dn@S=bRqTR(f7JNDDb_y_wpe^q&}+gAG`@0E96|0C<Q^tYnZ`Z}n-IotwL zlgd-?zw*UTfAQ5<e(~@B@bOQ7^3#9u`7i$S7eDv<&%bp&C;K7T6JhA39L??nc^3)i zocmPK2Sb$fbD%K{e^Jn1mP%(5NA3-pS>scaE$OqP+TKM<5cQ`FbSzd#ggyOYa&L#H zJB2|sfL3{dG{9V8@gG9yx1yt$T2m%DYIZh)>6b#00}sXe>qXaZ{-Txl)3H}`hW}t( z_}#CY^ZMJ%$#*8+l0f-X^wC5jk%;({oA=*&<3GRkgFn3f`<MUo`#=8Scfa+^fBXAS zfAZU3`N3<yc<XL-#|L|gPiB({x~3sO6P{U@$<}sN8`yb@g^XhYTy0%2%kiW|r+J~B zY;H@m@kv`oz1iq$pIO;lba%OtpoLzRuT-Rsddv%ZeVya2borQJzw?ET{biSNXdsAe z&6@dQp0ippzY9kHG=6~910-@~MRVO%{iE5=xk8yZQ(W7`5-cc$(wDMl$2ZR>6cNk| zsOGCR#AZB!(DLdlZ@hi|#*Hh#dRcbu(zBm=;hR7I{&)WS``96JA>E6b`4^`bS`&Y( zh6$~$r~XD&ycrD%eZYG3p-Tr{Jm?^O8FF=Pkm#obuwYzxer~ZfoJUQc{@u;^^z5Xo zuU)&JoSl>S?koTO#t$!F_|#9o{f&S6_J994DxFS>Z{zdf3H|aKI9|^fT&4g1+ZJpM zF}}oei#fU}VsSCdI)@k^B7F2;zwny{3ooOy{_XGm$B%2L>BQt8eeA-=|M}bB{KEII zyadP(Oz2Skvz$Ln%(oR?m&4WV)-3jqN+M4vh9ty5+St|qDsnUz5%I5n_`(%vn=<L$ zP5-Aa{v~kI{2liv&t3S7AN=S?U;oli{yn-}dpL4XUOJ#(GcLf@Ez|1%hq1SgkLx=6 zhwn<VWjnUxBu&FfgKe;B^0W;!PxDI}XhRM+Y<9rRY)fV)u`IG|$+BcIGi#aYE{mlV zOS`MZd*AQ5D>-)i{PBKv&tATJ=FFTqGjrz5jM$V@&2`;&e6zXZsi6NHo4eqlTi<SH z`-=MQCqCM`r+&~rQ2qHW)cnUEe&O+FUiuUFdUTN~@6?;;<o@%GgheaZire4&=W3m| zH%Ta3H6wIR4px&jub4;8|Lwf{AAj<hXWFMa-A!-&zZXUPk#u9AujRqFzl^+aAv5FZ z<+DfDeN~Q7ezl8chu-$!t#|zKx#u2%o=TX0>-tRCBkL7|h>h#RL{b%NuCcM>t+27w zce<t!$?>P4S6r*-$P@<@M2lJ3LyyjQ<oCaS{QLJK&V06V>$zilA|n=sQ@1{P>w~X- z{J}dxBwAMu94*Q|Kb+TKM^-O+JInlHxmZZotWNJf-lg6F2alZ%SC7EAj8KgyI8}Yq zpK)D4<TXD0^#A<v@m){9@;~dBP*nJ{3l`k@kMCwv3m&=icW-_4+FL<-6z*Xg*YCen zT%Q4Ud$%9~_V2@|H7B+UOE#^|+{|C=XCo^kvMPfy$EL6x0@Z?H?;TVjER0A1Bez_k z)zryUI#sh+FL?9QFTV(UdCS-Df27xG<WpL~Or=T=^*|X=QOZ!2Qm*!^SnR0fO1Fxq zlzUVmYNgz(3WJs)S1_vCK_x;dS1COzo*cRaY<j90YNbN0!cHhI%K|E_9mf?`;peV~ z%GD|?cPFa8Fj^Ssc;emV|9JF;2j2Mhm4$cS|G*QkefrFc{|cjSd-Tpn-+bk%*Mm*n zwXE<^VTQP%`XUsQyA@FNJby2zPi?x8gIF{>lQsp|9ff6Tg#Ny9#wQ5=J?hij5|h@P zKG1w6Bk|;kt!EM=Qx6rJTR&XB)W2-zl11-TREv~eHA^5<demX4yGG?vhbmNRl~>JE zDc$%{OsaW`U-wi~=O~<Km5dsy6CTj0Ij}(YF=FGjdp?U;xBmT)7rp)bKf|b*4?Mr{ z)u&#YLCw4G?gfuO^QS4k#u_h(*v?V=U>9a1cvgg%ze7FduuC(09C;mm$$(wo-#><h zVN*SgV>}_yUx8J{p_9@3H%0AeNl%M9l6EBS+?trUGGoh!OBO8+EV*m(qJI@+rRz0X z^3iHET9umHVYFddwMwfAXekX;I~9Z9IpiLkB=-ii;Tp1shZxPw;8VEeR$RhU+$(TN zrEzOR)hZ3HU}?LSr^It)hgHwxZo=alTqf;7247)Z-I~n{!k_x{o1blryOg|t?W>Re z;ep%ldi<48D*U$lZh8ErSN`X}IZN7fx`iot2Sf^~RIX5Hm13z<C6UXN5~+gbzxB-z zKQP~iFIxQ7M`mTF)~yNAD%BnhW_gr22ve#x8nsUorc!cSo?7YEgyEc0>DKVnib)Mm zsdj5Z)k+N>;`UjzNho;=8=M{TuyaU1O)S3U@6XJ=g`xg1`?rt2{O)&)Kl%5{7asfb zpTj6#`1}RW|Lc>_dxMOpzKrd?;`0ieU}-bJd8CONxHoy>&V3`h4ASN-J6dU~-AUE7 zx9X2B{Or@uKl^;)$M2o9@h|EaHLIael@P5$?booFt_nfVn$%EApJs-d%v)h+4ympZ z(^@zV018zA&tL~+s|n{?fCC4#9DI<)O9`0dCcFet0#V4e%p&;H9S=VD*q<Jo5#pmB z3BT>m2OoR#FHeL}q2Y6X^Xl3St0DD)xB8{Kb5qV|I=2|%UUa{Yt=~~9@2X(O+d8~L zIV<U6n+@r0LwvU55;V{ol!qW9Lk9q`Pye7!uh*#zHltRjGw3=^YL(txd8x3ddV6dm zXMfN!dY(q>(TC`D>VTf2{YIYN;5CLCjI`cwqzsIaXV8(IfRU%8ea0|@(P+?5lDpiv zL^HVLGg7#P#l0-;#WqZ@*6XkgY(9ZCq4LrDAA9%@56lSRxu^x9GefAb+2M1a`*`IV zD9H>$z|D%v&tMO*IXYkxV4kXGCpSlAUEFr0eoJKi;<Ndi<Pq17FKaq|8bT<+?Q}4U zDL4mpI<1?&Pp2{Dmf6e}v9>~DvFM~_ZT7DCqmgYEn$~-1o=)$fXVH2sO&e&5C?Mpu z3K$V1WJE0AD+(2ggl%q7h?p<%iDn5!A|ap5KKMkir->-BUlbzXi`^n#o6s#{1)(C` z4qKN{q|woOfH{|pm<iQSKmOuhUVCnqBa97Y!|o2BJ?D;Fc=I2C{|IpDjx2U1DUSzY z#RQjrHum(eW|QJj79C%xu8v+=8CT{jmHwDecTN#C1>}^mV;V@H58;+{_e+w}qO%iE zH0?Sbn|&y=>T2Hk3qI|>T7zCs>-7Perv;qh9Gv<lq>K$~YHn$6@iyPm)Y8)2+z8)c zep{;>wp&c$!7dm|OqCv(4JSFPKh^5xPPH;^zeTQ5VmoYUYH1_SwzM?W%ZwbfM23l$ z^>p?1_YZatb<ODM?(DE3@)KOB#y0Nl7i`oFuS<tJ5pd}|uqE%>&qi5yv%)6pI+@+G zCZ{H|C9>!64usbGZ)O`d09+b8^!++o7Mr^H*qZHv*d6C1mt9duefS-WkSAigfXx8S z>St>KFZt-{`G8h$Xq8yZCbP+8G%;q6X%5-9+H@+FLdhstIi-NLRnE#n<w}KuQSuaW zpCX|2VK+p9L0G|4D*VdZ<q9P}ct)Wy8O=7M*^HNkY3ubgkUSL=Oflt**D+mvPPPfM znXo~vR%c*n3RS#UuQSvL6vBF;Rw0r%H!Dm=Ys(&O`dPg}&(JgVfP>cR0=Sn6;>%E@ zGWv1op;;5pfH#C%g$MWf_Rl{Mx&Od{LkA-d?2nAt7qQP35xOrTA~FyW8W|B8>5riH zO-4|W-UxPISiPAx>V0&Wu|aA;jpuRNyVBJ?fMAXcR$_*DbRKx7A_FqZU`iirCC8_r zfo)+J4zN5ImmBKh#8fu0An}C_>HwCTzDH-U7_r3NXfPRRv&EpN4VK0=u|2l#_COca z$#n6Mo15DS@9MC1b=50Pegj2&4Zkz-rAiYXHMUpAH0RaVSJl^)BWY`WZCza>WEQ!? zCl6D|G3fZ@Gssr1@B?Musgr&=tC*pQ%dqJUe$sO0dI16NRx(^fX}h9!CnmFbHWwU+ z9`Wzn*#qYYcC26Jaj;o-wrlf#B}~mokb%Sx$X?|^5Q@7nBMAGG^Z2NPwX3nrX&iDZ zye+W8Kd6jOp_B~&PYi(hgDAB+unvP!t<mW<I*nSZqcwURK6<TDdMzP7*_RlWfJw20 zKq8yKCeBPuh`SJTUgl6dsMMZ0b|L=4>G-4klBg5gc5hy{XWNGOT}O9p+O}!0$*7=b z>1k6(@}&-NTMoFo7ShRX<#cHUJ9d@buRkJKVTKjVyS%}BW|{c(c15#bk+RUvYJNIX zn(>nX5dc?5b!^$RH(FeS_`cT)D;A}-ZeB7PlW=Wu6P>xFqH59QLM+}V&`oQmL4pmn zLvZwK?uF1%B0)V=8rq=ME2I*!UT!w(wT75k1C*Z%d$F#rww9?0t*xo8VQL?$Yq)T9 z-=?z(2i6u{I(K5%5C2~G^=H4F{(jZk4c~vaQ?FHzYbdQBrB5>(4Q5SB2XF?^rKz@2 zhjE^R4Jyk}CR_VsW9O!37~C8OPF^#9v5KV=8xNJ1^t1HBm9l@IyKsSxY%afi;p(M^ z)DD0KbF!dlb$g6D{bzMmTXy{D(gH<Z(|Y)@km2t-$0X8tXg>(cuenEUsMvq>N>=%i zoVuJUIG?3nzH}zHpg`TVeuAQS0ThN}s2M!!uk{TzfoiJCU;R*3bzN;;Wob=KZAC-M z`K)u9$*D2P>6a7JVzW*~715@Eku{AQ!%Rk_3Huax?8Ld5U8$GM=oJLix<=h~;ah>Y zU#$C!zK%6llX}@e+V-OJYbp=zZ^%EmGOl_E?hpK^sFT)%`>WO+R_9k%wB_|9!BI(T zo1s4Wm$fx3H}WHk#Hnj9H=3)Pmo;X=bB7xRr!?{)CjVf^gaVOEG-^Z1xr`%+x9{Gz z<6QK5ZQ6mjy&HeocU083mg4b3cp)Ah24b?q@Bn*ADD_fZoxhf?bJyNiR}VDT*JtgG zK7ab`nKNh4o+R6|XU@gO#|C1kXeSDT;y`i5u+cMP6804tX(asQP)p$DbVuaj1$RNt zhaR>P{*Z`eg<v55F2uw`f@Lh*L5Li8H{<GN?W2eSKthTE-r;cuiwk>P%)q#J6j>ff z*15p=09$RJg7><zMfxR2xs2vM(3eIc(>0aVm6TQ#H&*KTRs8ab>Y55&`)WH#H}tQy zwFIp-Om%2Ybyansh5{jn)i+dJj1I(xMa9HL#|2{9=+GF>S%-=W5Fejt@`bw(73G5e zj*s*3VWMWF6r+FK04*2WBuarH0RT{e;E?cZ51XzhBu9vr+PP{BR~V<kI&_fe4YO&T z+7^HNt+y>$;Jck!K;6nL2)q5Z1-ITZZ}yxyx6FK{zM;Chrn;t<sSdB<_G)T<HN3hS zUlm&&Kw&FGsw(Q4Mz)D+WSRnvR1?_`G|p*iY$RV&yg1`)3~ixphRN$lnoSrd`kylu zXbKl0_F(K52U+~2uf;gfLl$vrX_Z`$5O6`jrj2wr4s`=iJ9KXC43$o=h7O}6O37SK z##ZZ07mpr2ae_Hcod_J~9XrXK3OjlHSX2R<dv|tTPBI=;LvJB+DNQ&iII9jqXsAY8 zQpglh#eNi~Xm)W?QEruv2-`$9_dp_ds>3+~=T1?YfI0-)hJ*CAX8knnAqRBT>pJVn z%f7f@+Sr~??1Hb1Nv%ES5`7ofR1`$HE|ygOoG3||V9kkZwpW$!ZEuC8E5zCDzd7pR z6nhMcmaP7_+E$~@Vz#KYW`oH>8?0uHE&JVt3z?7Eg<&5r{CMF)|3}y^d^_=Bd%LB> zQmLj52D2<aS0Ys9wI~H5nMf{@i`)2mgTOp)3N>r$%svB;Ho7rBVvIC0NC|A9C%GfW zNF)e1;HqykjuHi)jB^Th&#DvoS$j+Ka+_GDa%ao=iKwKq^vKeT%EH<Rd9-4yF!SOL zq)ps-d|!ffZ+2=Y{1}F|9C1$tf4<HwII0}b5}Elfoh|Qlz96%)A+<)@+}u)DSDZ=r zZU5*;*9vO6e?{o>pZ~q&;dZl*)|F~ZdcCP(e`3_mxC2{G<wTr5lYS=kVD!;eV;khP z5KuM*7K5VJ=+jfWaXm{j`Y>RZrin_y;G7S`+Z0r-#<3}=qP3Q_s%6Jbsb#wkHnHxO z9aoQLet#%Sl~K9vY}ATvd6k1JkDr%+2D4&h;`)^1t4>s7acStl{)<R9&T;&pu_uVF zaDpu&68h=8wAQP+dsgp_Ub3~~>XzvEgOM8|EWJAxE^#gnEMXUiEdBcPhjY`LEcz0K zfu@a;Hf8md%8bjUg;$HOmSmS*t-CBS3XJ21P@}ru=tI3HQCw47a!lkl4nwUb0t+!3 zMyrR$Sz71pa%I<Hm2zRFw^d!yV4di87gP<_ml+0Gac;l53e!$q{pNAHNNo4|F@-+m z0(u=iWbC2_8J(BD2Lht8KB+Fd<VwmlVN+&aVZ*VsLb`kF=PO2+hb~+B)uP`SYYHs- zQUZhCV1h_yHd`zv{F<<1vKaNvW2#WKxW@FKAP`VcePex_2?WL^M~c!;voZ8`lGpjh zrX>~P5jE<!IyfX*YzR$ercGvp#UeGB>8{hSGVinRvG4QVd*Aoo%=h1W|Gkf2-xEF} ztLQXWDhO@UMCJ{}$cTnxIq}!nR9#zBGg&*Mrna_<e^VQ~X^6l7SwpBC@%aid1v4W> zcZg>Sldn62O$n(3U_P`*e=oQz$5jm2;Ec|wgP^KOIC|{l3FahqDsYl_96MpBj;+~J zIlDYLLn+LY(_lbo5-$yP7h5!!g|Sj*r!^E>gvn<PMT43G*l^khW%8RLqnmLd#6(Y5 z)l}DNgy0sA-r9EMLNt6nXJQPAiHnb&gy&~?Y<xmoTzq_-Gm0_-hQf}hnP+n_rF~;F zbAy^&^C0X#uoJ0aNz$kl8d?iM461s2yS1~ky}iT6w9o0Z**ZHqyA*k{b@QHi;hlx= zEaeONd@+chG@KtTC}0|>`pL!_4RtbIV*}F|Xb3dUYiO(&nT^nq4BDm!oMIa(T$+W` zLdY^k&`GEf{lRm6sJNH#p15KN<SNuhrP3K?%?%<mjf#Q)-U8cXQ&mM(O>K3nin#cq z3<Ef8hkB+e89B{^o>D;s&48>43y2qn6$O4DQS13R0!f=tENl@A`GTSbktV51C6*?q zNQBb5;;IJgM{~blzI4$yYeZ79xJ_$x(l9v$==Tj(&26nsO>M2s&8>i<v8lFNTFvJ} zu_Yh4XbIX{%EUzlCFOc~l>kbtkS`>@TWx~2)>3g%VOgmf9mYU6w>0s&!5pF*q*5{} z3Zqox{X=9_476=u{>`>41F%Z@y2lfKUVHf9mQUe$bbUblH73QBh8`59IeU--mas?F zDuZzQ&d9WwoktGs-oJm}vg6z95Bzj^{m~tpkFMI8xg|Au#oy*FUA%P3cWVKlgfGWH z2m15VA<(iI`Xd9a6Sb5Tx9W;pWXd)z;ZvFhxumqBq%E(csHvd5q^YvJrKK|ca=}HV zN?K8cm|@MOtp#PJ&1IEMt<`Cl@=`<~Sc9f<w6BULdLfa&F;G55AdQxdcJ=y6poXDC zpT76658r(Ly}cIVYYs)I$8n{stM)+T#$-5nPp?_HSzG5sYyxsXGn1IdVCnN{9#PTK z<m~v2i}7iP6JxHNI*}eDDn4^LIxX(p`Ge=KUMv(GdvpHMCCiq5zfL3r$SS=OeeN@Z zvRY(9+z*ppRD1T^wQG^bkH#OYF+%53HmGW1PsGM&oZA<7B`W&L*~Ijg2BoUDUZJT^ z+J_|<ITsQ$qmr`D#iumaNtNZ*A|sfLy1d;`JVnDm?A<|o#Y8VwWx|O*^~<k6d;9ON zzww86)d6-M{CvjP<ee>fN7M2vkyhqEpuIs8B%Kq+%xBOe0Wdz$0+mqXH9DiHg@|=} z8nz3a0VWBx&PZzv8nf}^`TzX%vrj)<DH02XZ91b0(0*=IoXW{a%1RQL1e)6H=7#k2 z<h&~_Mi?^G4RZ0d%95gtl1n9-RoRmIy!xhkt-8KZp%Ukn<W@@g%_WyAu1Om6tDEcO z%8FXCQ3pCMD9SIpK`15Ig?Yx=Z-+w64leuWTW`Gf`TnFMjo#iuguG+e&a$OX9=&)r zDk>NG8H4cthk!>!gc;DEpil&06NUX2+8i--DwF|DIMiWqCIybkx!H2qydh0!^w;LC zUAKDU>a8M)SRmKyl#?`j?Y87Ar?)j&>LpT@QYupj1S%;bepS+1BNOT|0isswRp2bp z_+=F>*#*V98U<g2ISud$g-QvoqmY-kW)~D?D>%~*Sh|@puyi<@{W>j^*^OyvrLX_# z&(FTJB%>~GfQ`66o<Q5Rb?4@+^3u30EL6G)yVLPrri2F!9~z(za>`t8i(R7KLog+> zO9<?l9{p^!-bBOhVbEI_blNOk)^e3mrBSuDw82>D6|t=gTUuM{gp%@t;<)q0#f3#6 z`Qn12!u%RRY+PnZVNP*uSyN$6Q(b*+n*ozQppn!o4b3H`DOZ}S%9`qNzJ=z_>ss5| z6lSAF#29!cj7gAjxzXi5ZZb#a0CHJ|ZTa&%ksrPK%buT>U3OmiK8qx%ZdmyC#=V<Y ztv9s~O@m92dwo$#5ZYOss1%fyC=C!rMt2`LkDfaS*EiI`=w&p_*BgZ*U75<DGAj5I zF-)L-$?v6NkyIv4Nk4NbAtfR*G45owQYPb{+kZUz_?e>YtLX<%<a7dEbii<jQE|99 zI{Qpv?zKy2&qeEqWP;PbHK~stIF@!cBlhIQ#Du6ESZIkP0zqmP*HxtsJHq!p(EH}M zm!q~M#w=cTpisCj5nhB_9(~}Um*0KtA8YBZo1nX43WM;a8H1olB9JnMS?Gs^*TYP0 zV0DCcV5Fvb8rlu@OQS!w?{Ms)nzq~b#3r4LPau}RR-r@;w|I#pAf_aYI0U<X@dJq$ zPVB#YD&p9gvq>ciu|$|~;`G*&S99a8965d<&FZ0VHL6Zzq@<mxxOgS%V9X&EM$q3H zv~ee5GY(!jdm$#};(<&6X{zIZ46<M8_`pE*rSzoe58k<)emweO{LzFTwx`5P*@>8i zFFyIFPo8@1!_<cVU`W$}BZ5dILfIVPPzSz*&(v%o?46iEgu5Y>BdJpvF3Zo_m%OVo zckb#VNoS8l%Vj!6s|e7|0XhL3ek5WBkUl7BX%@FiTH6Gz0+9stENS7l!P`>7mlI77 z=D&FcrCdkLX(^7i8iR{wbZA4hTBjr$97m&^I2mL>((%E;Z|-~ecYk>O-D5}3o;!AI z`|<m~y%yELHvMvB?+<T$`j<C9IH4N(Pa3^J!wd%&p?PQ&m|Vc5!c16OK#`b*xZ8jY z^l&5D;uqFPBD>Hg`WB;Jp;wnF40@xS?*RfG;&~#1O|e8OhE-oIV#H+GgH$Xqm{cYP zh8iNuvzW06$IJ0f19!>~A|?8mkL!8$oW8=%+(%1B28NbD^5pLyePe(8mUTNKw(Uy$ z?VE8&&J0$*y86J0L+981@7i<q*RdAtc{fSY^PqX@3>v8!3DvM<8vdt#iUd>l&G0}S z@W79Ra-(?RT<V?UaZkEE9v^ZhxC7pBzer;RhY~pjAwq%BFPMp6G7}NNF`18;BNXt7 z$zDP0R78>>z>zJa+UxoY(OJMrAoM@Q8HXjq_TiuY_|fkl{c~*Unoqy_;im(;&j0w? zJ1eRh&qr)I8+)!YE^bHse+vOOpy{E0Oo(Zfe3PfIwZ}c)Gw$f>bU7Sjjv@QRMDK(H zN&k?z*oAzDlZ=b!oIsqbiI8yw`*nmn9sP}Jvz`;ZC!sx}^<e@vSgjVD4K2UG)ZT8h zn)C)O{=lR&8g(Op2J$V0K*}&o#F-|d_fKJFxPNf<@1A=8h38XKHhsVFAMgJAjl7y4 zzFw1@ol|oD?Adb}=C+^XINxG4FY|v{?;qs^R9PeKZ7V3xNzJIr&954~Br0l6D=I9w zJUlTzF+M&K7^f!S#XP}|`zAu2jtR$n$HcfZaXW1y;{{la2YQZ5rDZG+8ucd0x#LF< z#i&dMb9rRs{yhnLgGO&uTsnU)2T%csUu`l39l~gdy{G@DyB~Y*@n=)x_HFp-+Xo(f z?#=z@B4Tq=a+1!R+5P=jU+z6XWHRC>8kEO^E*wFI@F0=Lw9-1GUz}YTcQHRL;cDY( z;<dc$%KVE3B_qfZ9qO2va4-`*2he~J#tz;Du)#WJ*ClC9m_&hg<EEd`U%QZ&cqOgT zWEAe(eE8H^0j8RZ4@Dl_6NforUE8^r{`ciCr6%;vVEyZwi1Zv}YLcFA(?1`2?%Bs4 zI(#m2$C@7>zwLpCpWBgg;#5q==_6nKZo$0y?_Fs`_wajc#29_E_VWPO{*pSQd&n?i zxA%7T*@qlm!(9VomZs7EQ6Dm9dP&wyC*#5lhVvGe(=AqAulDb)g|X)k#B6S`(E7%b zta`mdC6}q&6%w^kqSmQP&#vKXg$k`gKaP6$qqs;{Xu2*B$A~*R#qU1(@FTy!{nHcM z)_l9-FSp%y&)t7LkdmC3aQvI!%)jlnd-hlaU|7?2pNj1tZ2HITN=)oaYfWy4$LS&- zr;{!xf-JdQIC483Ae4y-=Qte7(e6BllkBh)%)}h$M4QT_n`-*s8?;KLNG-!~MVrlS z*;h3NwN_2H6iIbz8ZFL0T?-M2R_i2$_&KeGBmNk%)wuqT&pdkn!*@S_a>vq@Ti?F( z;kkF+bD+EQ?CFiq-}ak3@49bYYAQU8|8KgPW5>v+k=81EJ35$73MJ6Rbn-f|;dSDO z?U+PiamC*`ud}1QtFu;x>10AKlk^O*VW^Y=46P5EbxNY97@#ET(3|xJqeYUV#+;m5 zkCR3Z3|%hH*hL;fZ)c3*+~^FhMoh>-lR3wjV#K!MKR)v0BM(3DyL-2vIuyC*n|uE- z`;NQczI1TSC+|Lc%Pn&k-2MKM3asFn!p5|pd{7sgO@uj}yh$@?X9hy-eRlT%(moFG z?ERAijNLmhcfj6n?{6Ty2R+seVsO&;8EB}*I5f~E6ZwTCuQKRmQmIgY$wF4{MDZ!+ z$Q2reREb$cHAD)SxS((NN!^=ij;X><5hFBiyZ3>IAA0D{hwfQ%^1!Zx>+iYi*15Mo z_Vx=;KlR~1@0dUT&IM0Bd<-k(gLS{|^Bbh3JISzTP`2tu2B6`0ws&-p4Z#BZ7iW=O zd^_3^alMmjhshb3p*m*+D;@3C1Rz+d4CC~jL>VDakPj+}J(W?`>J<cptiXjKBOts@ z&?abZfv()r+A8M&H*!ee<V<c1j}bRMJA2ODd9%WKv)<XadF|4F&ZBq~6?Q*G-TV4K zZx5R}mwM=h!yF(}?C2(IMo>Ocv}ng@HJO<8m_p3tmo<iBxHdDUP)wf~y|9Lw$k9x* zv0Q0^n9TvO07JS_sgx5@Lu1ryFl(!srKUw<ZcU?)EOW#nN3xPJ6nj!ea=Ta}6JcbR zDkOX{u{^?k0V*#9OK!B|lp?t$6;p9335hX@`NHP9t0_sb@$pe{8FBHsrKRZ?l9FSt zsLjJSc9R>eGq-X=GvFE34<Yu6FA(q|0gHFG4`JKAn8ZLHNB?}E*Xx5zdcf=TxV=8a z5n{c>WH7@mQ~)^>pcFHD2!=Un8-{D8f|0Wg^Ms9jIec!EYH^!VA@hmDq;gEbF_6+8 zz?KMO*r32psgTGNqBfyKqcU2p7}{YZ=ERe!AiHLk>YFC4|FGe`Ol-civPC;W4@^#4 z2dv<q<CdZE$x*N<M<;Ffc4~}+wz1(+=Y+At<8)4r4_YUklVg)(vt3T7%gHAYIOux~ zf)=w`Z6T(G#=?}?tHgw_E4!8yQ>JIMf3>z-1Vz<E#zL(dOIzep84<rwWKx+3MsPqQ z1IEe~^899*OeEE{+lL3O1Xqwug62q~(kT!do45&2v#ej$HKLuqJg5bVl`Xna+CJ$o zEYGVhDlAMdzE)SD*AzA9#Ao!^S5+2g4T>`w`;#wLWvQ&qt*I>*TTNNc>@IL<C$uX9 z%&mr`D|xABGTO}OC;BT1xs2fr2$G76@f8-@Xg+;HP<%KErV5cnD9YKNg{?>=6GGg= zwoM>wX%q{A7-3CqRRLcj6spzsF{iVg1E!uc4Nu|aIxyV0_bay|>dMQQV&=Hjh|WIg zX}esWS9GbmD61~-np_jrT%KEL6t$}_<&HMx)eq*@XI-Q<4Xrg-4TkdUs(D7Q!{y)* z6CAuhGhDbDyYJMle4EKoRhpTcjgGI^Ru^4PtOSH6tfWf%XdloZC~nZ4em7ap7YSR+ z#f3FEBNPf61^F#}p+vx^8_L8WPl-~}H8M8V!SRJ=GUv|Ccm;8DozDJ)fxS$m5RIfk zHLUA*yC(+5NBTzk2YSak3Ob$rV}pG|6C;xog9EOSp%G{A(0JGQWcT=hY}na8JT!0I z<(Q(gX>j<h@-|@;h82^z`C@Di0msO%PL8iIW2Zwy*X&P*-LvJZ$da_Z*%H2pFKQ|% z5%D1!w+id7R)|`KIH<Z*UICvTL0gk*aAc&NfD^QYO@V`6gH-m@4(U^dt{Y50FB4mc zHVBeu$THDx^K?7izKPC}NtX+;6epc-Cw3;>ZjZw=*6r`t_gFh=mkU?sO**EjEeO)* zdJLB^(8Ho@Xe=wbRt1m@y3)M-jA{&8TCLJjbLtAXfuyCSvEWpRlCT0nO|wLTjwBU{ z`64LaB1O}sHu<$$sZ1uWE0SA~g6~)B-k*sMjp?Eeai71klePQC5yx)SZIh3&y^^jz zrN>jJWqV~-wn@Vdxt&OPG&#{DgIztutsD&o*tyQeNmu&|5p94^^{~$FuPRmM)em2( z<quY7l~%VYB`u|m^%GUib@`3O#Z|>)rlJXJWljyhV$jVv=Mc8x;Ch<gPQz~u>c5|U z64oN6OfHwn<Qf@Y4)EY#NH_vv-Z%hEL}eqV1JFz7%cK%H&PYXarA)1x78D?I{+XL= zR(U@--MDJo_u@UBMJ0dJ#fd)H|GoOVNb$N=Yx>W9Cfc;Gap$__l_%9Dl}lqAa#!tK zNhXjseLu>j*c-d<=R!K-U!clB4r)-3==zb7s8UtaUs6(ME6FLmoUhF*x>}gsms5}y zU40>=Hr?zJnVYH_s>_<3&~G?MgFHoVqwj!m5T-M&PA)U(guxLDBNSPsPl2mbQim)I z$dpJK_$18`DGe&(Qb492rs<LcElTBiC9U{p_VUghU4?niEj`})8GB;acRTxjS-+KK zzZd^_qGcf~_->!3q+;ny#|nS6R{%8owr|I$vj^UwrIAjlBuE5ko>A*?U%R{C*6nHU z=<V$4gFw;KHD1xxWy|IF^x4LcBd(k7>9m?15MP~uZt_<aL#7wVWSAF*6k<%74dTUE zD{B)989_LwfeHjdpCF{Ewl+}5*4|PN*O9u~nigSmZ5>lPqq0rZB1B{G#L!VWaKTmn z95lUqUaPA6#()06kIMLqTaP{>e}8=U*-tNz|MKmjkzexJ?@}}i#|u{ND!P)lHRG<F zWyV~9+x5$Gk{<cLoC5!BhgY#y)(E2QpPcj%86284`YJw?`0*f5B6dez*mpT0uXE?1 zTg>})sMAAma*;U)2#6faMD0XTjLM%;2+H8Kgh?7=c~Pn1vjn#Tg$$NUXy33E8qt-T zRNz{*O*B+g0-zvT<=)})A6v0*uy)x7?Rm!*!w)|mo!I`<mAH=06`!uxpR%%fOIO+C z->vUHJAAq-a>;Q3*w=orEr`$Sosy91T+WPu!F-e+aDxCTt`PNzfqKL^!=Zi<NL+qS zW8%4h#+g&BmCSHy=~2V8Mw3kBcTY6Phllz{`iJ#nZl8=VaZgTEX`DLCKv!?ez@$$r zHNtQ;H82w>6bNHPB2)zsrQDAR5u|LOkRF)W7^hZj{A!*GC-TOq-tG>d8bpEfaMcL` zPxL$I2CIll66s<#%G9t-D%e6lYtZoP1_y=Zk_*RTlXDJUu=Wo$w>I|mTP|J5iiu8$ ziP@>K4~VC#2jk&XEPdsTjQskVub^T;MACa`1t&IuWpf|=kSdUG&`>dxaBLhi&Jb(^ zAc|n!_;QF0({)oe7SLKrMt)Lk;ic?^Yf7!Yw5Ck2lV8e6NKY%M$Ve8`#s&$R4&oUU zgP>tk!HTm+*ie1?h#m`xE6UM|B;kbv_Mb3D)Koukb4KrAJI*8CcT;j3>g;uflG-7~ zDJn)P2efic$hbH$&2d9DXBp_Wq@sf2qGG1>;gaIA(!zp*jJ9NmN=3ybWra9VR#a4S zMGkMiU^O{9jneddT_?LRBpG&Tsxtds16~>{j>f(zwd|0x?Q+&+=x=roO8r<!*|0?5 zmy98|`5l99qk=UG9f(zXEXC*@_Bu7RBWR<ziEs%9<{E;83mWB`nGkKL3$4xoAa4*L zr_<qef^0z~7(-e#W++-T>?M?;69u|Er`Rxt-$8C`s;a54g)3n_4CwgQ2<Yb8`nrbN zl9JM@x_YK=PHig&S#zbxGy;1Y;jO}G)%eDO`X9R@GK-ESMxJijrCEt}Z|>dcgI`5n z`}w<uz10UJGw2^{j1JcN3%~yBta1c+?AEM^%-MFl0V_@Gx)SqNH71=uqzooMx!IBd zAhqGNqLq_QhY7-5KoqEn0~DZ<4(msk40ladH+I0W#A&5$gI3DoNAaOBR@QPG>|pp< ztu`A<XJ_xA-PgzK?_>Js^%CFPK6`&hdv|AFKhrn6zZX1QldU(6PmPNZ0EV|;y(Zj| zo^8~ZpUq#YN^Zh@$OQ7p=^{V9DlTSYI^(i_O2;e$W8S)bQ!6|N!#ib{#M{nRgDz*6 z>cxu>ZA@y-$ox+LiA*qmO2#9@iF*njbZ?*x)W~5q0Qw}X2$mYxEKsfVKuTg<g6BeL z(uE62%mp?n>;l>IV{Znxm*mARbK$qCDXCDzl2P!Rl$?^3bRjY2*!sYRkc}HQ1~yO| znGG{HZrHGK!#eDRtlO}j*$}>d<A&FtdGmjZuQS?-11GF!F7G;9)!l!hdCgYaXS+KP zM*e`N*($yiW0Lq+Y*uFM&TAWE4Z9NC_tnsVy|<%HFU$D47_ck4#-fB7jsp=+l11kR zmq`Np0!~Qa#32rJC{NC?DMAK@fm+rzhie0F^h6^N^1j72IguT+Z(HQSgZmG-5AqJ| zcOMKn!0qlo;5~TPp`(k}FWPfx%eKS2w`^Je%Z~M%k48r9Kl*zEMa54$Xeh80c%&H- zsRPwWcMM;7D3)wU)=B&I^y@b)Te)Q#Ly+1aiV@liIA;(-Bs&bT$8uCi@WfppRlWoD z#~tdfwi<y{3T>K5WdSKqB65=-zmy_Jm_0zup?jq=&5>=JkL^6X^X%$#{G&&X?bv?c zaFSg64!kNuX7fVeVTcbe#K&X9X3PvFC;TB{p&>l#0)YsfkmQ1(kOTo~jN#BX)Zsul z@@cpz1X?3)e-rbV1`4W$9VzGuIN%Q5gio-pyHIt9YEaoC*XhWFBtGP;QTq{FAw;KD zF}hH4iqSm^_cQJ~W-)Rj;}1mU#6}%UH>YI89y@mK^kv%m9u<OWhfutbN#4xR8MDJe zLPG*rxDX0&NmBbDn^gM0>r)(rGb8JEAQ3Wrsu9rwznj%8<{eqx1(p?TJzR){Lhy}e z5qc0wxDm#Ucs6nZ%XQEQSrO1U0gY%)$U5gj2z}5ElFJe50x1z@0dNVMB>0=poph)M z<V`XSCS$#1Ee%$GVS1MMW?=r5TepHOd=c(et8`k}K9$fg)Cwh58zBXVN~vrAAV^<R z;z{7eszXb<b~PuSSN=<I?2z^QqK&PH{qcFs(C%OQ5`Rfy*)=xSvg*g4vYkVR*7K`i z){v~yo?n;8p=x^VesH9n->-l_s-!^!rIuJh0{{T{BJ@R|A|opH$*-S-2dtmSnd$*~ zGY1b=4UyS);wyq(rOK;$98duOn1i%Bh}Q}YL9bRUOMmC}H{N*jO_VoYdFADon3t(n z0xyUC?fF;Ve#i56*jxYj$Lpm*o(QHt8NWF4jC^lw;bCh_(YNOXmxtD3wR6O-udDN~ zW~TSXv+VK#)_gg?vi5t$L1n~6K&X>P@6ktb5KhOi3XaS75F?|WGY1WDvP6&?(SN2o z7BN-NA_U6ejW9wU#2(jdhh|9GrlMiSMOZ+1%CY*FVdN#!Cb87%G~6CMdEm9A#SaeQ za;U`=9DI#5WSxgrPwr75OXz!VG4ITI`<-{+*-=(fTv%M>FAgs%&R1D5al%*wwov$j zaRUP6wkVY&<6=%y?9vnY%jjd(yDk};CytzAMvjie?-JFB*KEARvR79h%&Bjy-nO*t ziuno#gc+Uss?%%E6X0)9@;P$lY++OKCy_CyL{Nav$s>R|$YqGI;((Y4h7-VG?$8dY z1S$iZ%xS0)JiQjqUV7~${YPQ}hx3G`CKtw6v%+A7^~GfEQ0a}vc8fH7eD%BEeD&qO z|NYgMpS~sQu^G%h(@dkuLVWTu;R25@$bXL$Edn8ixenPg+Skw8-Gg0zzpn$?8xh=l z0-ev^N!F=!7{_70v)d=U0k|c4!u)}X%~e4trvkM9D#Fe&a45D<azyNR-h&><u^nKQ z^g+@mxnrl(i%!cr=Mp}o9R`?iz0m_corcT_!N%|B(ETuK3s8-+3k`{<QxdkspVwSG znQ%NgD)xL*T;i3>SsyR*FP*h)$?|{YiREP873==UWHxbnz_KcuNV?qIodS|BvM7Xs z=k(i%Kjif=k5jcDV6?M|s5PP|wI>oI8KDU(cn+Y4C<U%i)E3Ai<HK(_S`A`|xU~=p zq%niY(*a8}g406`riW;(Tj7wUNzO_>eLQ0K>BEXMdr}UbKX%~!{)pJ*hE;!CvScZ< zWEMPq{+U{ysv$7wU@FH8{XiB?Eah`JjYz>tH%A2!8c2J*3USf%Cm;yx01sGY=y1iE zTsNZgDC??`5QoebU3VwrG$4q@+9^TO4JN{Jfc;8*oPdR~nJ^ykn;=FE0E<ZQ0k}Ho zG_aWv2(@q&(BFsZ1;L`tDj}9Y5RW&_HTb8{YB(T=E992$rJs@|kaHLP@ckQYUAdgs zCBZ4)h^(X>V89J0UPh@$S9bPx?5c5Jj33NwG1w%7m(RyvbVcj*vBPZQfnA1EmXy8a z?xYrxi!UBOoq~DaI~92m`!X-8Z5N`~x!CO~nTZ<KKb=SMrm=#^(BYUOAez;rcWP|E zHAsa7ha6+&G(QhPG8iielIwSHc_2O!#N-6{F+&_m%!3SOGT@|ZczCJ-Frf~mp3JJ# zm=Q6WbntpHzzeuN?tSm)cYL_Psykrl?ds~p*M#?g7`T^05)a~*SfGSaS~IK^ku_Ud zc3ix?xIVT1gmB-f)0xprucjt@+0^fjZ~HOlLe|ca^V?E$Vrx?_o|XkXzvT<Qh%%o$ zQWh^pkjp*kS$f2INnWSpmXY7=S5Mg)^(?KdiHt9k+`J$`GZ{1qA^1q6V4v`yFs^@+ z@sh{~1BzC;7V-h3qqG6tOla^RBM1ng*r<HkS>#Bi#>nC)`{W{q8%BFCty06u0bE#P zRKQ!0Ggp~(2mg5R_%Y`A?4t=9EPGL7MDprF@z9h_159`9hr;@UaqA^;@JZi$dFzkL z^1PbzlpkA=O`DC~xpw1vd5SeDd*#;pzYgSQ9oeBpBed4+X0I*XRw3v(;bFHVXVman zf689l<dm7?#wm$AI47;3S;x(x9#lX?I(AAX4LBDNcE$B<PIf?JFleUxu_eu6$8bx0 zxq>nS1P8cYk#)Re+?|po)EdRqI@ia8u5Y+mYnDpjGYfoUp3JOM!LVmG>1-!o`r`ff z-ecaM`Qe{W*)(Kj5%CZURjA3j*Pyvh!CI1Yhf-ADu941a&Dg~TXJ4<qZ!%xek9gUg zmn5D%Q>UY&Grx66&vyHAD@n(&R$1Bhe17}rWU-6Yb{MW;R=|No#8ZaaDXEuZ3R8w! zV)k)!4Z#h;T+0x_1MGoo4#XMbMyzS7utSQ{aw~ty8emTHm|m)^;MVW@(IQH%Uvs}s zk#YV?T2^tgv@|&*H8b;KYF<uyiN><?vmci)53HE|(<hr~IoF5`fDbNh2JkaDTcs8p z8_Pc_Kg=aJ`j3*TPs_Gk)d?-LK-Ao6)Dap+kLFl5N8DWXgYx>65U5oI*Z(l;5Ka&z zO^<cVSc**CflwJg9QokC$Exo)@OSJy^3{px#Vv8`kFMPpv1RS<)%%WWEqgv*x@b{g z@$97^FD{6!A(ED#tXmE)xF?Z11#yKi+xE*S`LK*aT1;NI+yNWrm~5sL?!GsTowrUa zAVdHJsc{u1W*|<GCGZeRB{C8xB5=w+0ec=HN`eh;J$10sQ=+UA?a6_mRJk>eagB`C z?|ObrYh`6sbG7bbzPw&2Xl`u7%0jhu+lN1`SRPpRn;+lb++S6uCkwziKULyf2#hSi z7}|CvDIozq*|D)PaR~`bJeKaoQ`m;b#m2<O!CRY2pyC}-lmIwuZimD6wac&=-=JkJ zm<E!V86oHpHJ^AXOlkaK9I;IazT_Imq44{gn}Otd-;}ruk4qqGdTBX<l5|dVOl|=p zttInbkR`xrF+8hG>3@6oop=53-0^xwUwS^VBv>tG9i9jR`6!tSh|4d?&dtp)sT0;0 z7L^v}=I54|=j2|?Ev#s1sjtDBn}X0Xg+e;1pn3pjSG!`S>_+E$LY&k9hCm&-Em6FJ zSmQ)KNOnYWfbi!CGG4|x8*G+PE&5!*d8f;v9#Xa{;0+4No$ywC5%mH3m`07z2)clF zhEAmcyY(VQLO}a;@D?sG0>C8PR|OYW_!{WU4JCyz=s?bG?3BH;Iw#{YlQAm`26n=v z!EZT7i1_M%e7E9AYB9g{>t`N&;l#FuAAJ7lr;D~lXV*&hyt47ohOhte?E45|kGY=f z-S7snf(W+6baN|>>Gv_3kS!Ta3CCoe#AZ3Imj#V(ko|Ba1lQ-2yIc+p5&AF)5}_|B z*%FU#Zn*;|GeKCG0U-$PrG9!2&`5+}U=hyV_h>anRg2jo*QpKW_O9+ubGOZ={PLy0 z|LYy*?b+}C?-IBs1jp9D5z#NMGQC~U-DPY}d*_QCpGTBOC9FQuqwN|S)Hf`iwYaAy zKPT}jS#)miVuwujjs~UQF*N2iXS)z4cMuCvIL3KhqzFn=Kn-WC#e6F8Np#Pks}1Rs zE^eQbtpGEaCI@X$qR>K^A_5hpL_Y^CPp=_oum(Y^;~FA>H9#ymBI*vA<+vMvm3p-< z?|?8Wwyd<Wvh;kV(pvM;mtX$qUp{N;dlIV&Edv?xH6lmERh`bemRWE$E$Y3$eYY%a z{nGE>I#5wwSzlg|z3!)l5$B>V<Tn#oB}*|ma%%mi6{+hs$n*YvY?TwKh7s7~+`@sN z@HpLXIc7VpzCbjFw#~T0fkEy|z;>fda7e`|PH-aV3rg=WBoL=M0x;2AI2gmAhH&bP z7MN#szthAtom#e4aDI2h>O&C+_U)+etoh{Q&sQv2x)gHp`&qEY(i9}cw+JfZEB5AZ zcxmtXv!~zrV9_4ijvo^DZMs&T|HaG4F0Wj_G2;Ejum5cY0nhu*)wJk{wQU`XSAJ_) zQ^kHNU;`aTL|*&K>luk}nC>AG;_cJ6chVaPf#QeAL)>f?s1=7eNmR2?a*YT}n8wls z^)n6DA7Q1nj<6XYeH#ZLN3BFLAVdrF{)%U`2w4FJ%xX23s_gu%5_L;$eNIzzX;HSg zy=vjVf!SrVmcB32T*f*Efc`eI!NynaKJej&&(7Cg`k&{&T357uVM+YjtF?!}do!|a z=|484zIh`0)jtx@+4RT6342!N<g8tCcz9P_=LbgCm;3dp;r6ePgy+9WnRB3ljUUqS zz$6DZ$BiKMIEW4oT?ajxn9gTl%K=W^Owv$J2^!hyRc!!XkJSXwx%Fs^nb5&Ww?zX$ znC1wb)rK2PW@|ffgEHSuc(B1F{q*&>7Jl&IhaY_Kk8g~+EI1PZ?7tCq9ACL{^&4OQ zaP~;%|GV?;CtiKy-J{?99CKy;FJG+B-}d$Dr7xZ<{`gA{?A|^8nu64oyZh6AOzzwD z3sQW}P(Vljwjv1i&8D#hoHat;%uNUpr~xP^EfAhXL|_MJiX}&|Lfpa0g2WKPS8^By zgVhD}2r8o|d-x%C2rTN<|Ari^G3W#@K+1(8h+A1*2$p>YbhF958Vy`d;VC~;YcOE! z!QLG@Tk}g_pEz{*$f1MB#8%Z6Fg=b*gX9w`zTLTO(c*Jwc06|XYq!mL;FWLRT6{F& z$hy_h*Ot8a&=b!ueeSijXaL2ue0Kv~2Zbce(30_X%H+Vo1#>1yd1?~jM)4PIFr|{K zgR(9WBDgp%SYm}i60$C&A|h7=uvT0Hp@V$50hhCuK^uU!pkma|66s2Xi!eMXX^c?h ztJ3Ikt4_V@jSoNn;`7hH_~L_Y2KlAn*vq+4#Z_)Sw*I}37k={opPqSO=8TXhKYV>- za#Gf^x87O$-qW+@KKj994}SYAtQ<>*i`7i-^D6Zx>K^JarKF&%P*qeDe6QZ4-l0}f z%c;%OPt=FhLF#Af2Wl^MmU@7?gZpftVyRcCzvI5AssBg)FBL((O0A_zspqLgs)09) z7tWhW4fF1ymQkPLvjorok^4ML-A&y^eL&SxV(NF4kWx?v%D}sw_b8RZ3+3HHNvJx? zNR{I)n{dzXxX%jw_jyW6jq&c}h4JpjT}x4`HPi)alyXyJ)BrV3ZJ|VzhO%)-eRwC< zl~SoxHkCnLrFP=(B~&9-Pc5bvQJ+)aQm3c{O3Rzidx-Y{ZvoyDO<m*7;oXAw&*9Cb zimCnhZwczA!#j85{xg7x;w|9KMayi$+v2ER{C6)Ur%qDq@a{#_chuL^Y7`;v`wj12 z-ow;!Y9n=#$3wlV@p+zlgF40I;r+9z5!81pTDF1rDDM%}*^PIupz?UPVSkVsrn;&3 zsn^kR3M?ycr&QFBfd4ewq=KrXcHv1<1M+zlcl|)60gm~U1CXx-Y>`v|b=31_!m9iV z^(=K5HJ`<sjeq@!dJ-5UtuTyM45N0SzF$ypQwxEcU#P3RdjZc7u(lj$Pf$s~N*HBD zOD+a{Cr}eV_DyJuCAj-2bqug>q|V_#$>&+>EgXMMMIpk02K81@e+5k~ruI=SIMV>C zA{f|>_lKhu@4)$0z`$<Q6j2{g)2)DUFQuoNK!ZwZ1EBhW`UIb!f#o%zj(JowWdVM| zsQ~4ra;Pq9lIlb|*+2`qlo@a7q6BEE1S%azMjQ_VKf{y@pAmezaF!1&@KK*Ov_LEB z)C39?adp+;Ne0iDIh-Z|bH#X@jk4fh2vr$zzLSDqInMS`m^nb}{s#1+#nBMe!~Khk zaswKg>Z~q^D2OkpW+T{mtehvmNFg2YIJ^|2XZN!_MXtY;Dj7uamWGs+mIScpLh(-> zg_V?+mXvr(c{%n0@RtyGZ>O^>q}v{#$<u-=;@Z(A3Bgi>G3<G{!eSdDE$kj(k=EJQ z3x{jo1d>+c{&q(J7TS-H3%p6>kKlQ%$f`F;l1s4;2Rk3pNf4-o4In@gv<l2Egp71~ za2pc2vLT%vh&hd<&GrF=opz7m;*ixvtOG~~FxkgwS)O$`)HUM8(!QAv#yb)4k?DFI z@sO_#J92iWZHRUD4A}iWp?&rqScviTWItP*m)ne2jw7q(lWqhIRK{iKz&<_YLS`%g zKXF5EU;;B4nYqkCOntdiCRmfaiGj_9y?f+T&47DyRKd8t?4$=tX?!j%45F+fz}{1w zdSw(27x)(+>+*CYpB6yqU`BO0ZY<T q~UTmj~G2g6Q`6b~`^ao3P)67gC*ZaB@g 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%0An4 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 Wlgc!C)&?iDd0~VQb=QmhM6Y`@wb_Z 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 From ff5f52c745cf35f32c0b7e8795b9bb9974e6433b Mon Sep 17 00:00:00 2001 From: vanduynslagerp <pierre.denis.vanduynslager@gmail.com> Date: Fri, 21 Mar 2014 22:42:53 -0400 Subject: [PATCH 229/347] Updated pom.xml --- build.sbt | 9 - misc/PSD/graphics.psd | Bin 1474376 -> 0 bytes pom.xml | 414 ++++++++++++++++++++++----------------- project/Build.scala | 23 --- project/build.properties | 1 - project/build.sbt | 3 - 6 files changed, 238 insertions(+), 212 deletions(-) delete mode 100644 build.sbt delete mode 100644 misc/PSD/graphics.psd delete mode 100644 project/Build.scala delete mode 100644 project/build.properties delete mode 100644 project/build.sbt diff --git a/build.sbt b/build.sbt deleted file mode 100644 index abf3727a8..000000000 --- a/build.sbt +++ /dev/null @@ -1,9 +0,0 @@ -name := "goose-fork" - -version := "2.1.23-SNAPSHOT" - -scalaVersion := "2.9.2" - -libraryDependencies += "com.novocode" % "junit-interface" % "0.10-M4" % "test" - -resolvers += "Sonatype Release" at "http://oss.sonatype.org/content/repositories/releases" \ No newline at end of file diff --git a/misc/PSD/graphics.psd b/misc/PSD/graphics.psd deleted file mode 100644 index fc061d893424f1905509c4076634c3b8d6261a61..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1474376 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 q~UTmj~G2g6Q`6b~`^ao3P)67gC*ZaB@g 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%0An4 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 Wlgc!C)&?iDd0~VQb=QmhM6Y`@wb_Z zsjgLACAl>kbyRmR78;XTr`C{qEfzVAfz%qbXeXUsZ_0S%&3E1ozD2(odTYa*Z@ux> zTd%Z9$Ck(Mk)7Uq`as%|)Q>O9j^^#z`PSPXzWes>6CZx@(LesN^%If|<B=P%h&fs^ z>?T8qOg6U54WQSIp9;(sR8N&xb1giC8#Q3H-_dFGb@iAl`VljhLvl<wIHnd_K_m^e z$rD6UO8#*F3h#UULzVew4(3(nA1>)XT>k0qH+FpZx3>-*d*`zq``*}cP@}^FuG4PN zX!VwsbStPPU}%#uYepOf%%G|r<KF;7l3T3-FGTCUtJNt|kEZ37XB}#)s;(#>yO>pR z?s!gFvBFhA5HU8L#9}9f@j<hRB-lV$8<N;J6^-=s`arp85UzW91A{|D1A~J@g9F_M zJ4%}x8*6Ku8tWSBt6K`odvzE@K9Vqi8W`p<oa}AqO#0weP;#PbWpoY7%e6sFOVQwF z?$Jxrd$Z0S+J9*0p|Zng>>1~Bj_&&O=n28(MS@_nSs^yTT4i6yVzY@Gibe(o`Um>^ zqXW@?YJlorKQP#L^6-hHN2w#%9XoRP_>rSWjvYCgdNMU~Tz8y4w(j_e{nZw|Ini)T z=dDe^Zy4zba479vdaYV!mJJI=_yYpon2;P7B1w%vIH<E-a1%+_7Yu>!Qw$;J5&co# zw+06L+sn%;;4f8LQBhV|j<Zs#j3|ke`b&wj2zCnlaw%1kQro9C8rFbedNBb^V*;3q zmkSvTFd;3Wr?g3WOzxQeW{p9mGa5*PUSsL|w{PEm$L)7ece3xe^Ulca>+ZPoj@xhh z)=kvSn{K+ZWVD}$ZJ?jxh5Ko=P!iK#;qIiK?(Uv&H@mZcILfDngM4~;j-Nct=OY0s zKWSKNGp>HsZE^cjae38ZHBsZJW{%7rs!l1byxa(zJfYEO4KdwD%oDITI-_12)hFxp zYK9x#2<FM&nVxp`+_})%TQbgPo<D!?Z2E<6g!FZC%lM?4(y>8UDDq|_X~186BaH^b z2&W^~PIQFYsgC59PJ@o&Y;{^NTwm=`9r$(a(v|bEq^g#~*iw^VN9DwtBTcd9>p9Kw zt*No8vZxr2Y^<W<Xi>C?C=Oz$irB@>|I8Ut94bo5ue}^Oh6)p)t#^S7(3>T4$dOi) z)?h(QBx$tSbQZxgPsRR{^vqxW@=WY6u|I$NFF1Sj^pwlua19I0Ae6R_ygo{HbMv@* zT&k3)L@J4BRAZ57EsN$P3(3QR$ug3wM&heIie&=Ju3?o->QFI6`8#n@oKt@S6Cyh+ zEi3Khsgozu&!4}LaXvdOaB|(*-1D-PMQ;FkQ&XH*c&Bcd1knb6MS_gpVKA!FFN*q` z#e@0Maq-9)%1T%1C-WbB&;R$$+uwWRMYCORF!M%il;I9*?z!{l_vIb>BCGMhxs0mx z%9H2LG}}c=EH)8Clw@oB$f$v3(61VZ_#QJ5xIv)UDII5*60n;AdqQh8@RuJv^3czJ zeG~iP4KZR}%J+Z#hi^apr&VIztq<K;LWgJLTFbf16y^!$jK!=jw2=nrq@<$agU{1b z-`^+8I(YHov7<Y8nJ4p}*h;-ayd8Rn+Va3VTi$tl%bQQv*7jP={X-@LX*Bg}20O}H zON!c?%9_jDN;^uqmEAV68Vw#HqhLe(feniUsNlilTn^LZ@$)zti#I=m!rgH)-`RBX z#Noq7zub57$lkp>cOE^FmVV;QnZx@Jg!kV3<>3>DB&gs^2b<gMBAOqxJ($xS7><lA z>Z0_ZjPAE}m&)l_-=deCzR*l*EPj=|L`q3YTvsjm2?m8>N+}?%)8^FFR#jifsn9eQ zRW@`V&aTjVE<E+_%2r}aZ0onTZQcI*3t~Z~*)qV#T5K?Ycd<mxDMpJ4%RYq@vq_{R z7YuA|FHlX!%wo8j1eOe@i5-LNYb;x)1S0~$h;R(+rljP2TUReC+ksmZQRwiSAYS?z zG;5wF+qXsj#{0{IwQptreduTH85I4()ARRNJyUH$B*30D?n@Q#pFLTuI`GAwr^rV* z-mB1L=2T*!Fzlm-B5$)>EmrVe7PHY}6X-3ZtMcI&UwGm9r5CPy@rA$r=`A<eXt56R zP3R{BGc}e;wpr3W-^=bEFn!gDmr(k;GuKeNH{OA5`ntaUfgv7ekT0y>yL->hoxApZ z{Kd}Cj|_}Z{BI5Mhp@7F80_4y9OwP?v)`P0`9YfVzvs6+_xA>x{^W_XzpH)x3phpw ze{n|g7%hD6Sh;TB-v9Y1boxc}RoEqY^g3ODq;)JKfW5^4$%q8^V6Yg#43nqd|L9}t zlcbM7`2-)gfA}$T^6}emwdn*kHv2H&j6MPtWN?TA(Fh67+Dw}W%c^+;(>~}~vzZNM znlgj$HZ!sbGg?hC^ExnwxM_--Ay>uwHUP@lp=LVwdvOZVu5N5-;<U82@%nokGjejX z(@yU?bMD;P{O<n#*uc$PUT=$oX@GgnBZuFmpKE;VX4#I^;X8}(ve5LdFP{41!jl46 zNAK9yvhaK1;awMZ*BsmR<;w=|8wajxfW!hy=)<~uv}!%0aZ!_6okpWKXbq64v^tv= z-E6hk9hBuxtJ7k!T5V2wSzr2Ze(}`1TVChL$3+qy$#gU`JTMiQc37vAO0daRrAb;+ zE{RInQi&ui-Jk=?5H1Yzm^7LB0<Og+Ofw_6fm@C<A#rvsA!N0pNMhabL$7UrXCHTT zWPr!*s;lqfwAPlL-1fH@UVZ!J^4vqB8KxD4yDL<6bg`d%^T(;HbLVa6pgU+KwOmog z&N{S0gNo*Ve89H=(YoE)(2#c0`VFl>K(9hG$|wj-4{7wmL6ZTd2aE==g357{6tw|F zbqgPTE*%}|pMB%$*I)bVU!QMQio|1L<1!GBlGmAqt=yj8?rv^ZS9f=`YhycC-QL&B z>*ewOmDk$~0kfCO>ln}o1fwFOx~;Dd7jccb!R_U>^E3kZC1Q-MGb#i^F(ckw;vEz6 zHYX<En)bwZH{bhjZxl7QOBB{sn{%<NM{5y0`^XP|^5`!I8cr+*&>-JnT4Fjnfg+=K zi)m@i{icC~X?a!U=W{Z%bI%s-K9$L7`XuK<cGf=+mZe^-JW^R(^ryGBQrkAZ-lCF7 z#3H>8+6By$DES@GDzR+Ds7D=3hMHj>==v2hu}r8Djy*8092ZEWO690>xUJwqb%91L zlPDw_xm>9fkF4Ej&A(8Ur@+#=&e(5s^Hi8Xlrbs6Ca<AN5B>YA-{17TpZxqEZ@>NK zsS7>xr7bgi-pt4!&Hem8|NXOV&YV=#SO0&a%4ns+aU_QiW$Z7`-ko`P@6n@Y-pu%- zY<Tzn-TO`)+rRg%{WS+`nqU9rJ8x54HoeACiY4MPjY<u=OBudrwpu{pB=U^HOhHjv zK}BVb+@J%WG@u+QIh#>kk^7TV+0_MECHc8|twP@Tn4nXs6_%%+t}Mu}D5xyRsm;sD zZ64(cg+r|}6Xr(>Z*p-!zSg4*Q~T36rQ<}DTi$$X$AQ9zhI-*Zf0tNU!i7I=|Aj7# zhM!em?JqbSN0Xk;ZG`(fd5!W5-3rwyqgZ4#s%mvm`%}GAEEf%riuff`fpm08JSNqP zMRM`j$bdiyn}x_`c;S_;+qZ3d1N|x$iA@G|V(Q*+Qf4%c^a@607Lm5S?7~QH#>vyg zX`>|Y)(ogdOY`fq%gTP9l~z+!Sus$a-!;N_NqdA!&1gkVe%2^wq_DiGx^AF6w_Px3 z8*d$yf%PR#9PV(95+VmPk{P_?Q#+3n8~=|7o_hY}tmCik-TGE~MOk4*)&7Q>?DIwS zW5SlK?Z+z%{Y>}LBRk2U!Wo%e`j*eF@yQ}Hl8O1{xdn+kqMDo`ugWqDUIgs{T_d!S zj5_uIXp|7%^q9g1odNu=0iq?4(UW>LI7H@->G&g$Klb?Je{7V(w_Rl-HKvg9R%>}< zPUhK9i(O)sUL!L}#j<{h6#A!)+5sh${xYpt@^ghsE>fvTolHI0#~T`KQK=*<Ed*yB zsga44@f!o&-u}KuIT#$$C>!RFT|S=^1dc-sZcV=T`#<@YjT;{L#lQdPmOFp)<GYBv z{`*(Ixc82SA9?I|KmO4#wkLXD^y(o0Vjj12<lD6edU8%JpD#=0jF#$akB`5rJ-gG2 zT<llr%b*iwh<cJ<r`A&X2u`54jOsR^5y0!?5Y~N1Ns?M92ef*U-`CkcP}xta<w~_w zELB6<uDVgv#cl6vE9@fqoX)O}E-uweb8qPB?&;`g>6Eqg^zr(J_;mlx!-C=A0p4Ku zkOIE21Ei+Amm0o(kk`u}85!pD`UiUk6kXh&0Rz-ZCR5Cw4DP{fi7|qJg1j^waye1K zeYbAfxOu}JKYi$@4?J|+UC%uC(C_~9H-CEL=|}Eo6W4wF?vzJ-3}K@M$CoZ>>+=em zzFmAFOzvsVbe(SOOY1G%*Iu&vc8T+vhDfMFurwRl=<opaL`-jBol1s+lp$!hYe}=7 zR9S6iv)gHRxQ9oqIxWP<(ZKk9V-k=AsZ=~Z#uqjp%kShgG@V7c)5-yKrZ^)tqq+H9 z_jTE&Lv6)88QRQXvQm~CjfS&jox><OoYUJ|(J9nWs#|fxVzn6c5Hz{`aei&zXs?(L zns8~!PYi};ivQCe-ul4Lestf#j?scY{{GD)=U#fNpuVJ{Jpc3Ow!ZxK%in(*S(woV z8V+qsubN5Q^X-9-;LveP;eo^C?(;(@GuwOU#<EGK4X&_aBu|2JK^?>fXA@aNoSE@a za=n&m4gAH(+jRzcNkPL9Pp;>Vbd-%W4I8yO!<bYWk`Q2jv4TrulDnibbxXsU<A+Q3 z{d4b`qp4kLnM{(Odf@P<sjZu;TQhg>{dB+q9b%Nc(WE)bIhA#ys-^3~?lU_|9h8ZA z;Y}vpu`dr6e0u))=`)$Br*=rq6q(c+=X)-Z{r+D)@WA7LehUetXxq!jM)b0(TqsyW zLm@ikLORARPppxBgk$?Eu8Cw`7gv2j4`gIR$sL4B+W@t<jtm%YGLW*gV>{1$+$7wN zu<3LAhA0(FD43DlA@9#=E<|bVlFEwuwm})XytcIBLSb9q`r`VQ(#8szDM24^G?LYg zUHw)4T~)mWtyKe-AbFF~&{oUouj#1ntZVD*sM2C&t#Pt(eDXL{-|wIL<4fCj<fI?G z*!uG4t>u+v4NAqBqEXMUN^2#D_PznLaR_A+k`^O=WcOq0CO|vNctl=lc-_b-M6uRt zWU`o?EtM&P%uz<kqcXN!EDg!-lFOvZ(V?#Vwp<=Jqp-BRG@Gx624YkymCQ-m5}ATh zuE!#*kjWJ?O1xgGP^gqDiF%z?XS7+Z7#fUDDA{5HlSi48EjCQl2+4+cMv>QBZJ4zd zGlnrfFkIG<{8?fVqj(Sf=2yS|<HLXW*#p0N{;$t`^!A%CKKhTBpZM!5hmSq;yC+_H z=)RZcg3QQWJ$<Y!AAb7q&dssF4RoY^@*2tod1IYXuU1Y@O;T_)p{Iz+Fg{sR_@E{O zQ@2e{PtSVc0N|Zn@XyZ8D}*)-;PLSp5qn%T9u=({9~&DV7m33n)~GJYtYt<%!<!|T z^w1@lcTHwzIPSISM-N?p!)@Qb<+eNTxa+pte|Y~r5B%hT@7?o*`|rE={+~X0|DCsg zYuz7waU@z&Avb-|72({}7cOZzKO`_-bi+fWsQvUPlf&hTsdujjq}HgF>BC`oGsBrN z8jgnX7Y)bY+89HodUz7AhFAy~58Mc^rqxyWG{r0;yGc)KW71U#EsbJNmdoUF%tDqF z{Y}d@fSneL#>eG`B)y7Jl3$V!<47@68fYf;5tr5(-ln9Dn{T-OmK)X+(9E$}Nt^He z!N1(GX+808e`KXxcRle)d=%382**n8NpIY9)A8DpaN6r`!5#zya0`xiWL=e?hN8dc zR%z5)<(MWg+bLd{CG9gFg=cAUe!_2bPEP5NQYnIL$bl8a9WC9k98bx#>Kqi<7#WL# zc`3x0m@I^ug8ku66V%@rT~OQ`!FidP4+9n^t3l7U84Wh{-Yh8BWgG+?tMqB7jvYR7 z>_kS!+4Epwb57*(N5>iq@{gV@KX~xyiNnRH;DJFW**>UGH=XR?c~kq)Db1-}jgDRL z-0V1?t2r0P>1y@ncXf(kRgmNil;vdg=QWp`rN#ZN+<Z=LO~t~}VrYrIxU?8qA{J3f zVEH=aj#`ZLy*XfK1chZXMIsf$ib9chnhHPP`RPXmz{Fhi?tAZVPu1cZX63~%K1<re zvl?fBkt2=~qf@*!F^v|d1Hr)35}eus!4<S0wRHEw{5;$@R+bjxsjTKFmKls_LAk`V zXo!h#5=8j|)1u6X@LGDxY@Ih>(@P9P^c|giP!qOS^l^$hn=f!U4pTu_JAb&Pl*{!a zQ&ytvR|KE2<&8@LW8<)m!DfZL&)krE;cQ`M9kdlS`%+5^o0J-jq9Y&TXr)Z2(v6oq z_WQr2JW*o9!Xo|(ncG%PjH-P_+k2tMtg7V=iCf9Z$*HO6Br&xzne;W&e#J~-;QX#m zHmC_KPRy;$&d<#G{YwkprKyEwvup)5Vd8b4gRAV7Ri+N~%KC_T%(@1qtuL=2we-tc zJ4woiI5i>|q2&ra>V~UKQjI~&FW$j%rRZc@wR#Oqh7Vn9^Pr%wqe5+N>+F*E8R73q zc{jjC%<G+-nVyPFZ=8w`A==t0iqc4NWD39;H!Mal+EonKy^Qu=CmYZNmIABG42UbM z%PRo@8$Tv0I4>_H!5?QaxU@c?9gEu)7`Zt>eqXDX>($Vxk|vvuU%~|&s@E9#Z3;b@ z6Vjk5Eg@4FyNC+hCG-7DLSaHx&=Sdf_1#xGTzsK~FBcDijTMbahNW^I-##0jz9E5u z`J<M;s5?ygZkhJ^=o!#X7~?4a)JpzR0Qp`vtvonDAtPg0b1cB%c1720U~tpQ1|^eN zm0ZaVr^|_e;f**toNkxf?TWzxDCk@V#~%l-g`FGiPR|$=s_`j7!_drVJ79PuZ!=n; zay9@dlT-kI10%RXqq%-G1#_QNn<k8#5;jQ24jEsM5_*M8_$G*1OKk6tfAZt=b261# zsW&LJDuWCjFb1teZbzR@$N%EJR)QGRmh?LL?pr=TaZ>on-lLiNoT8!KdxoD?rq%-I z-koQh?;cjPryW34$yKZEjUM=n7?c9}-0aNE?CkV(aF#tY6+ceTz#D0rm<i2poSB~S zO5+xyDe`uv`=AeEbV4RGbA;JVqc^HjWOB*4Smjo3Qb0nGt5qtcnvr&47BDbkQHO%W zBDCf$y6m8Ao83-mg-DCSf)`V>)C@g)`;-UkA@er@)Mn_)OgeTVe7v*jdyRe2qBjmz zT-;IF($w0MPB))frlX&oc$u3wo^x^j%(dNlW8AW;9#i_~CMPC5Zg;@La!*7&@S|W( z0v>82?Ae4Hp2=~c4NS5dJ_X<cfEmLItj9PtsSG-VG_uCW=En)q3PPVZ^9AF=krCmj z4Bv~z#oP`xqYz&+14hDBbVGO<1w9uQW)>nrA`n9;X*hTTCKS%RA0O}RJl!De_+IB& zZF^_8s9KfH8H6~Ts%YPhg1QCE%_rK$9aRTTUOV*|4drH|YE&`rl0vhp*9YO?5m?i9 zQ&=K#EoJ};#(q9C>83G<z>OLxC6uH(jn-t)su%|wHK`m=l7pcQNonlsWD<!?DwRd0 zH%nx45ySwQLN+Esx57{m#QGZNTGvcd22{gvub}h^9YfGfEOsXqr33RgqeB4%veF1y zLXu{Rj{4(CnJ-IBOwl(@LMA1ZfZu9|2WS`(x51=PI2eiqZ$}svJ|kh|mI=j!st{!r zK;UdNNQ7d+bzxFq0Y+c|z>+0HKgDqJ>y3JaQY}{~WAf{TVyLGS(7!0uGJ!NnDVK@C zPsnH~A)&y})6%=4g=1tK2|i^|f5@bAwPaKz)~NMR^1^_+#^}ZIWb)(9BlhZ=By3C< z+(I&4V6z8T{c!LH#EUblRPYC@aL}HcS`7Ma6Mp~P(sC&1n_dnx-rN4U&?>6E1yK%j zeNZ1q1ZuRKv~sf*@)8V8^5)v2d>%>ZZcsK<m*jTBkxOHAn$&~0@<nniv|_1DFbwSE zQi)g&Bq-Tk5)u9rGyNtX8`3H}N2Oqm_2!A$87E^-OsLP-ykqI|PkTfGgp|b=QPH&> z{@LM0cwKJReo!ce@_6pE3~5aq)5{rz$6%!~7}W_(!#YmCU_d(1+1$@lc1{__<gJAb zGs=e1mR_m1o9i7ZY?t@Ul5&2v-aR!U>Tm^DR@N|GChxP9m-cb<+Ce8_02#elFl0gZ zSx8yY#cnH3dh+F>3qL<S00f|694|iEfitmKEt23<A|4mY!~+r$8bK;*6?8X@qW2VP z_rh{uIzd(9mV!&{Uux6N(LjIC(etKR-84sO>I(@4)9}8Po>o^&7dVqg3iS>CnZ|y5 zqoGF-Xl-NnbR)*$M(+936*Jb_ffEI%3XFA}n4ei1E^iKWyzch~rBLCw+CpJ-c`c`` zvZ%eWw5_S$GMvV1sccayh4$i7z58ODR#DY?zRJ}v@93$rXt<@#a^#};x;e~+Ef)?P zI+pGrZQ}mUvVwjz2h>hI6}jE8-q}mu>!{!Pv+X>ESR#@tWcyxkRfr_w(LO1+7Xug# zAyDvpB#>7{BHb`oG%g;O>g3M(`Q_=j6M&MTMVDIR$eyPBmUE8mj!H#t-^a$|yGHhR z1P}(M$Ua$guJ_Z~%pTXix-$NuqLY5^7osn6*=JMX&wj(e+vSBl$26LE^7t2)PM*I; z&SqGcKj>t`GM~j73iwF9N8{93b%u%Yl8I^Mq)Ba?n({6hbY8#KIgNWp^|DjzF!g%< za*KT`uzaa8;+z+kGu+r!-)$zX>cQ^(f&r#A$f2H+f*xjS*mY{jfuHT{8WYM(pKa_( z{h(DM921TX^tB8_k2NL`@!RV9Mg`+yzHFqbeN@6^ZWz`2d<&CbyCcL~16AhsDe26* z9B&o3v2kZ_=IY0V6GI<QA%a?ZD#w^Uak!S#Q@=AScjQRnfa~xVt;PMf_2o(t!qI(( zu5LNxRD6Lb?eUK%XBXzLUPI&Up_TEaXpi9PVgR+#gG|h0Y-S2ovXG%58VMls5w*Aw z2g=aB(EM^>bzuqu5u_kwZ(SQ4Xpfr>W=IECn*}~WDsEd*;gE$QZ_so#mgaSmn2~0s zQJwj(>4OTXf|uXfUUH&WC6!C1<1Jjd6eJykVt5b+38_TcS2!|O$){xNMT4z6_p~cM zS=!_N8HwT1Ob^XRM;7Z_^v#|N6?OqFtFd)-so~z|85y4*Q&m`O&D`ofGJUtqGFMzL zkehEaNp+{Av`J1Yor*l!7}CjfWb<o!;tg`SgTQ|!m_$A^Kq3<@W>JHO>{CrI^$#k{ zq}gean^XaV!Y(t3jY^d*JfNi|o!tYYTvXdc>6VT01~G%)8)jf)k*U;hE<h{jgkssK z82U)1QmvEp-#P$dD3xoZ5`OO($T`R%s6NR3oj_j>+QF=A0)bp66heI<5si$ibYFXa ztgUCLalMK%>1<6Y<En*_&KbCqBM06!DE->4R%>*!I7*bfwvR8AS@Qcu>gJlN@=k4Q zYdNQEhTB@5(bkkzSKS^`iAhyoU;mh3c{RF*5VL?`O^(I&L)WX}2c%T0)C!qFBa)^l zWdI+7Z?a4dutU&dh+#B}Nm76XP@^O%Vwq8;!Fqg&N4(@@<2QN{hcYpZv<Bd~k-UvW zJRQqtB9MQMH8JI32J7X0^GhJ2!eEW}jaMLa3av9EeA`T~P{bFShDJxm2fWR_g5Ivu z5wTPloVNLUMB;I-ID9!8HZqCP(J*EWt&%jUM=9xoWTP0MV}-?Egt2?cB=V><WlTn@ zG>p%s34M48_#Y+YK>FZ;F|0&PymPFsm-%2~8fcY6>oDqRCLS6NmEJG24x#iBQav1d z^SVlW32whotkBgR*WkuX#G4Yh*@A&p2$z9XEW3f*umIy<)N&03?Mva1S&IcKfaHCv z#3B_SmcuI>zM6!KP%;G86b&#?gUd6B*if_t$LR6MSPGIJboX$>-Rt18(#aEcP~Eq3 zyF2)Tfg$967#ZQq8Q!GrGTR=9KGL+%kt&y`*Ue`Cv#+>rcJER3XzK9c!@Ez859I9T zOV1u#rRy%zXYy0`!*%fV(VIJjCwnI{`Um%^OW*H-c5r;2S)Q*DRW?t+!P=k_$eHzs zT461Nx%f6h<r05^_(upwq#jvKf@p?ONUvVeg-e&=8G^YB3NVJFq`^Y|h*a}@UZ2Md zksP5E^V4&_nV~U2F=uzrd%g2Z3)8c6z6m}=ouqap;{$hz#2zZtW-gpP<j+i#boEvj zX)`THE-dAq)i&z;3o}GHXJ!x0(dFgzg@Z-iNQ`#!(9L;gf``b;jB=i^bpTfsI|{Gi zxi(KS4w7mi!*hj9(6p>x)>{g49xCq#RfEfmz8<bpG$a>G21XD7A{du0FHV<tTX<~} zuCS&rxG*=uaQ2;7unQ-qB6(SDjd@vvNA~pfemJ(Hpsz8juDzhOq`SC8UD9&#{UzGD z<HDDH4P4O0BYSU7ueex|cj#b|*s^~|7ea%}QKIXr2}Vp(`t@-({Ttv_!%dk4%>Q9j zjdwVm`nvJT&(5E&PTSu!;jnQ>2Hj3WWmZ;t*4g57yE%v=8(@ah<uEtVb76WxABq|L zG-+M6PTCLK=vDnn%(miKTtG1iTV^`uhezPUDzuCcKJ|@(kZyI^?D7X_ivet4<f;UM z3BQ*0Yh3NuEgUk$Syctes1#QLv1Y7BDV1{@x@-G*t)1<|3c0kYzg4XeH=|5+3vYzi zF{oBbyP-n?#LTFO)7Xm~aMDXlh~5-Oml(U=@)hKW;i#`_EqZxfP$y)_r5$fZ-V*XU zBdIQ_s;;g_Zi#wir?|JSy1J}oyr8DGwxPDJv8Dz$>Z@zZ!7>=hgg6#=6Dus{hlYuf z$S_MV7LK1Jjmd-~D>!AY2iJCLn2jt~F{Hcdx?+-D(UVKapdE;hzO@k;QjS4zAWfj> zA!zn!;}031V*C#UA5>#dh?y)}#tbZ1D3sU~&`8U{QbRkvP9Yc;iXgZsHYuS3u#jy= z>k2{};y{<xXU$~OIWyUgY$7L=o!nCURRXbiSLxQrWhk31wDc7?mq5~1YrthMLE#v{ zJ_DeVneKp~n!<cC%86vN6=6urcET33r#S2uBqgVCy1{0)+8U~4(&e>&D=1w-%uiH} zm;-zUvEx%2iGLz;Xe}aWod(My{-U@NQKty5@bqHH@%pu;<_ciL0GwL64p~&a7muG$ zJ$WWA?euCIaVD4+!%mzDq}`cuHX}WqIh;*T%Ydie*^G?zGiUcc_xua1&k@f@pJPA& z+_SOgS<gKid2Zc{kKKOHeGf=34LFo)ArSYDp|*5IciwQ>5*~s&aOSJ#y8)@{!m`rr z1IN##r=3nu52vy58BHV7V`(&?VV_P*kEF3O&foUs+aG^;^5iGSPVYXjYxnzyKlvj4 z#PKtkPm=^|{YZ#T#8Wq;sPjBBf&{_oMFPu<u^5;@WS?LoAT~;GX7rj4109rMc5bxF zP`4rCqk~A4a5Wu4>utK!dRKsZJ-`iuN9-R}s1!04tR1j#fSFLrqDV<YDU(!kg(|3A zCxhJsS1A=i-rfG$&J%l&?mKnxqgug{GpS#GaWFMgVco@IB_|~(C&k#&B!V4D+K`;G zE``NTPGX0X*u-XGi2fn7Qp1-QvaNd>>8}E-krf{zaDvdAINXlKAfv>E?uDYRV>Gsd zTiR_~_P^yQ*!a%H)(`0J|B8rq#xc7>n2KX2jk6$EcEoiIW@g94uvlx*q1GAOpi?se zE86%WjQADf9itf;IeYVJ3QuP>*|M8+PN!#O73iFM2)N=VL*dV6QBeHHfJ5@8^+|!` zq$FY!QZ4*Toa1Pwm&H?4)ALk}3e7Lg&xfJ`gVW=%%q}oB6qc63q$kk$uaV4m>Cg83 zX``C9JRLgqbi4SC{|_3=myM?c8g>_71TSeNV!z@(3mPR8(8WYWF+oFWnC)3=?QI4% zQVAiPN2^h2V8ce}6r!M<`@#glS|C^~_7cHbhoKek2gITH&U&CbK@OE=pLcoLx47J@ zc4`K^ZfMNhws{JQnD_vb{_cZ!=?{<mapNd$dS3a$)-3~D82GQ451U;oxDS96^h1oh zl9n(NA_#9$zDNxOv^plf39(Q~8a3j$;JTf{IAW;d5p5K1X>ZW0;0F#ZlMepLTBR<g zPthrry)Qf*{hy>q{^ybZq<%sCJo*dzm+OB1tN(cDx4-?L@NZKd`R#u{{CjmM5itzJ z5Vndr1Km$d^ijr2EEWat62>PIWFQd@gVf-jk4ztK+cHzP`7gVwcjgUyKd60T$M98| zisK|wyPgr%=fN6XiB`N{EKavTs)NW4l^N7%@PSFu!2`?yXHi<W8NR--D={9wa1@4< zKRg(%#v2(ADfn|i0E2J}-+jt(3z=V0`Q~F!JoVI*Pd@eJiv`W_YoU-1X+wQOLu2KL z$zltc8QRN;<ME(qpy=25{VM_Rv~<O9w_@5Od5|v}SC`SqRTE7Ny`TqtFY=So$@9}l zNW&D#4EclCU<s}WUbL!FC6sAbVHxi{t7`%Qye1N!wh5!|dIRER7|mvkgsnJ8ZpQkG z|DdB*H)|fS8?9D@(_*sOZBC~KF&ZuhlK$uX=EWCZc>aawUwrX@KJh?RWx?Wxh!5J# z)*4NSpu*D`yJ8~fyP2Nm`X*-<mr&}xd&fRGg;b@yCNJXfkR%USfIO_ZYh6JL7;Y)C zpnZ);XeC}Rbamx2RE&t2FoIDvXagjz50IO*Yv7l)G~Q8K+?kP4fz;kbRk^Lj)nyGe z)h*@YJ6_rz-9~SxUx!nOQ4jMt^V?+D8kkObXpJEFJD`2`24d8l)S#Y>S?Yw4KCGSz z@0@pPX3{e~JriaKTi6Jq$99cD_<(qb5SdxqH8SEAyv(&DFOcXHAOiO?1LKW}XasbF z9xNWT;KgnE51iR^a@&c|N=J@;n)%No2X-Cbz2j^K_k)LC*@|$|EnBv3`QH~>%bUSu zV1tV(^NeHz0)l`}f&<4G<01j~N)YzfDev4WE%?n*wOl4rh_#;iS+8#v79XY~Xwm=f zwJ_QU`nE$%%_4-4Q(;t$gEj=^_*UtWLI$}jsKqtNF-A|O6zpnzPpnB8baHr=>ej|w z5+W=ivaaEYd1W#{gV8CvLpnIb6Y!P%60uaE7#$S}g`-0@%l_xK$F^?Vwtf4nZ%)YT z;>u@m{?M_f;E{1G6NaE>dg_7$qRCP)xM-hp&&Bi^h5p%T@65y^%*@EK1q8>=<YXL? z6`wWT_RKKn!gOBc!anIB*^xHH+jVX>w|unt|Bqk-F$O_q7zQk^i7^H_3`4~KFd>4B z8#|zjk49JqnO-zn&DPsZ26&QM;cWxv%4#rS*4T{XM8(6@lf+Zhlea(p@R8}U5{DhZ z-*$MN;%CgvWK0h0pma|l`rWnB8Jt~3N|#6|vWoHsOHiyMXA=IX+dvm%@hy(+_*PY2 z-$3VB+ij<8uVrcKFZfdXs<}tQ#|pV6lJ-N~vTquzx;T~egMLhY)s2ajD?uR*TDZ@H zJhCxkf(8~sM-2!a4I4l{Za2Vj7WM{EN|^mMT7*V`EE-H5R1H;!Tz}1a_t9qu`(nHe zy`xrqM@xdbu1lO?uqKr3%}7j&3@uEUKeKKTNMpv3d0{Ty!grlNZMyA<?|AuS-}{D= z6IEmRx#i8H)ulW4S5{t&OM=f#=p(Pjg;|Bwh%!dBZahR+h1C~vyG&rOQWHij6p3JJ zc#FXZuh&@|h^MpL9I(tEc=&gZQ-7i!PkE%+f+abG2tj6L{wk<Cw+T`205^!beyjAP zgTBp2FOe(G$&eAs|5amX1&U6)`x{hA3|qWOmtcROhxi7*VK~0*#$%6_iLm2jCFAJF zEWJcL_Bf)wTdxr|@W%Nfp;|sPCKQUeqaykE2rO^UzwzGIt+DOv-hK9ckJ+GPV#n#P zqLSD2US=duyF`vJ*A69MOK69_i8WhmO+W>PAORZU@c}7J(J}448m*=G;GVNv&gXCG zZ`ieW&nKySKRmqa;O-uy;+5C8y!Cc;%cj4+)>b{Ni92#euZ1cFEjpivXzA-r(1k=e zNQBZzlXi?0nTRQydnHM_ibGz(F#cLZyE)EFCICi6dct!Q4)B_Iz&Tn)O`~PNge3-p z3h>jK@0i>7m1G{xuRbX)In-ECR9%){cc%PYuTk;0H?~H$Y~J?LTQW`!qWIun$$$?R zLzvjVYE))Gw4_f)M@_VT{2rZ)9A7@ZK!<<L>FjqH3<s4#OK8%GglpoO7MQ>oe6Cmv zufm4{K0fRTLUf6##Ng0t;~k*7#7}}VLp(j4os$?W<GBMcR5W)RMu*LaImFZ)5nJ>+ zGaN!OQ!$QT{PSzCz7qS}t*`#>Q_olvyx|d*uVzNr6$mkT9e|MQ^O63dJl>)4d+LUi zUkqd}(t)F&7uIB)YT8#{|6xPUg|hDbbsg_@#SyxqT;1llu2C9Sj9)`!;yt5JOiTuy z#KdIA5^xD?Hv(+6mSHDNFpPmm#uSCOfW}n&#@la4-`ViiKltA4gKn#ZvTd~54PZyV zVRBNAPt(+OXV232)V5b0sXV)Yx{;&5EqK31l)L(R*2@hA*1Ur&yodWidafE<n;E<K zHw)Scro=fRl<DDAY9M2AHWBU%Ap_!BVB!oSx<yZh3~abJgbXQ6hykgm46t1q?$p4h zfd~K->9(5<X0VB7v)#q{!+(GJ5%uAwk3Kj6{UP4VIE-E~sK(Mb6X$DJa?9`OQ{?3~ zw6D^uZS+|cw_>W$TByjH>rAsZF3bDNy$m8(C|EW#j)J6WEN-&AoGA&e+z6S6kt7qW z;@YYW_RyfCV7JF2htCaIpRhK8OJUSNOq4yM>ahH6X82@;4S)$Vzzyg-28~Hu!*`AL z>3if_i_KvewVABSXP$WMrRSfcp5OS=uTFbRU<STY3o+#L|3QM{8lg3P-vWleH$DXb z>?KeyMS&x<m{~j-cVjjH1Xraqgc(&Pi`1<$TrSpT<Bv(5t-gM+^kDk<XJ;!e7MBzr zE|pqEe|`1Ye{2J*vF*L*_ZXE>W;0AwqRBDr0U0=OaO#AYK*k2vOaR%RVk@B)@aA(X z*CZj_JjpDB39~R1XmRE>v=X1NRwu)U17f(Pt{ruH#v6i(xL_j5VkDc?LF1eZJQyB; zY2+Vi?VRH3Pv6f~oH&1AM^@^o)Gv8X(O>`i%=UM{1ith4=RO*$fb+~(Am;((^_Z!$ zaui?#&_#q5%xY0*S(M%|cl^cUaBVABUITTUqq~~*zKqsf!LDi(j<hTWXduFXt<{4c zXOmi{;kAf{i9@b2kv+mefy@Apf+3YkC>T^(#V@_`%(l1Re&?OHwmp5+KiGO1<d;@a zK_)F%6=aN7+|x2Pk*Sz3+1`>rc0Q9a2c$+#rxlg$eRKH(6Q{_p#y7zt)?vGgxSRM6 zag?Yhtl0R35c|Inzb2j`9>?}4;tAqW;y1)^i9Zuth}Vg?h&Qosjep)p+)3Pl-`-8! zPyB%RF3x{J{5yWr$=V#>k_nnH68{x{&MU+=;sN4cu|Gg;#&!#?-iF`oC#nb?p(hqu z*AvaeAW=uO;VqvNJ8^uF_=NZoar;->cW_-u2#9fFj2IyX@V;B{#Fy|p&f4|>ahNzl zWDqEIfISPaeV=%NcomQ%xDJqf7r#g+R5&KKKM;Q;_7M_7flWq~5Pt=B+wgobHX-pM z@pIx8;x*#b+V&It>bJzpgnVuLG5-G(;IAcGh(`SCb>cDNN#beZ55(`#BF_TaFpI_d z9_vSV=Z8c&D+SN&Bsz$8;)j6c7;7E2^?1{E;yFOk!rH*vKxl|5!0;?_mS`d-2`lS% z*3D>x?*cDB&TnPiL8t-IqiDBUq5*xji#U$=K8NjD;QBp4SAZuPi74xC*4@M&;vMuO z#k!Mq5B|S{_$ToY@d2?y1c)HE-=d!n62$};+X~)u4DJ09p7Jcd^8p~}V*M-O#FI9n z6`mvB$6Y<^L3~e-UVe%=Nfa{5BH%Pjyn(iQ1J61P{69i#y%yi@13cfw_6Dwr2n$+B zK-@?C1Tc-@+)nt2Md11hagLRYXD$%Sga_aJf=FW}<B9`!w*dO5(0BbrH*lIH4xk-B zCU&5OUnD-o2<Ru21P{<p5+RJW1;RvJAkGt|L^h5Y=>K9&Wah10Vg^ss0Phenffimu zTc@CJQt(s<?x_evyvK`(VZiAo%oq*57-iF}8(G(5zY(o22E_17#Pue?n2wRUA8#4L zbsOf58P6HS(@fY5gcRQ@z&sLR6A+_BKKi|z;2)w7foDn_k#RV>6e1#dG?!*;D>>q3 zPcxfSEm~k|I<I(~E691}S;}Ybs(KV+`GlO+KMGC=B^{?2H<ZcM0^DP{eIgnagO+T} zE!I2=1F<HNu8ci1i_~B&KN68AV`-+KKv)-?p{dnnlu%{|=T`B(Rd`deS0<NN>Es~N z>O+8F#ip6egGtnk7g>N(W}tKR1vPZCb0##8kfQZS;l7G|{PE(F5jWnu-e*AyTrX-~ z%_PrxQN#!u_=Pzn^UyIq+iE1yT|eok>7M2eKb}6S#Kk#iXOfqX`N>RxGzp89S;q%R z_0>oO!m=UHFPkzVqgT>oMXMN)xk^tBGmr&2amYGbI+u`TyM2+?ovmNd(m!xHX2MHz zbE`}9latf43jwEpX@1JRI5QENv-_53y-N=7EC9V3fZFwDE(+&5Y{;PNQ2E33Zvm=2 z^_XnQOhq)aC)$u84A6QD;ZrZ{ogd8C={mX>`<1+WBL{hg0!PP$8H?@1o{P;EomyaT zM_Twh>y-gsl_r-v%{Ayb%GSoI<}sC(<5=uc;$|xn-H150ZiBzmWUTC_rrT+Kx7W%s zmHeO<9yL?NuuRs<^;T17lYFs3*;FOg*7dr&B-724zD}KmzR&G+En1y6?~KK5w8!X` zi7C?Pwjk-q%#uxOk(gX&XT%%F&K8gboDF@Pu@00ytDbX+6WGypwRFzm;mQL0sbdFL z80_2?w0*)@+pEwBI~JP;Dmzv3sY>K?Td6JU;0!oKyx!^7Ud2#twTz;FSvNG_NDj67 z+iUvyI{m1zyDrj0*4hS(d!dhN1c%;b=9TcfN`*s`p4o|3I<Hw%wL(|@z`;Sj+bZ~l z3{42tW0kI!VGZ3x_Q^`xT%!#W)vlh>L15>c3HVo6!@)(zR1hNt)>V|34Tm6;M+1@7 zl_(M|qUHh9cebE>WufYPZcQq`v%O0@DFb#(J{YiTBkxy??VY5LOAjF@>;g?y4pj5& zYItpx$`M|*txjd*Og0Xn4DmqgSgV2CtE(KA3@U{D4yNyF`DCw)&y%W}OruV7bFa3Y z?s0Xt+iP^VsVm_(4NmLpOv(nc(A?+sw9xIm89vY1{sV6dy!1-@RO7Pc`pR+6e7m*5 z+BMlPt#0hDsh;HU$a<p%c`Y$}*s;Z^n!&(trQIfv)#b9-JXX8MNy2hL1Y`5R^*H9| z8ygmCPw~6<59f`abIhCE^9z##)wEtWp;OEm8ylANdY{g!nx3EcxxGI7JmSpNTCaQ3 z<5fDT`CnROM)$0H3iWO+lXKz*<GgEOVnQ{!q%$rc#h-f2>6u&5S?6_D&&-5x&b2tB zobbu*Zq}TOTD)gcsCG{+X?0UhpKD2Fa?edn%dIn7BWk=ZXe|rYMYh3?z953CRnO|W zfJd{q;IhVSEW4GmvF)=c5XZ8+scHB-qp-uTr~T8@{+VgN7l+xI>1nUuH|v8L+&`z2 zdS-odGdPETEL@6bagM*ZHf`4LrKazk^RM|*`)1v4(&%wcINUCe+v%C09Cte5%<6VJ znSbF!jI#-c%j0rQy4@@%?%$2ZaJw8Hk88r|b~0aeyCx@G9{8oY@BphL$!T>>+op)= zCG4>&&s6fX+v;>Ky9g9*V!5KN@R86UNudoKcemAwNP{KpF^k)>WM#tvhxt;d6_qe% z;epDE(e8L+bQ9<jql#t-6NM{`*Cs`U=qa3gVe}*54io>~2G5M&432&_>W&c5MVTVs z!YoE`3p9n4afOae8eI4(5~b2N<5Iwg%#^WdgwDIef!XLZe&da3A_QJ_>2b4qqu1ey zTJWf!ct=EjpChzr^pB`#-8|RSyxlXq;Pu-b5x;4wAN7`_^NPW#!I=pYt-k6xGb;BY z=}tU{M(8Df*fM5a9hL}2^~jit&`g^`J2LDNxO{ygDNJxK5p9sF7ot}^XV#;h)G6&T z2A&6KsUgs#@eEBz_?}_Spl?}aSmw*68d72$nx7wb3SrE%3F&2yG^V-|oLMgnyb32C zLxjzd2VzbS<x<T~$!07*)2e>lGU1766>iUz-S3u9TfJ7KZ1!4XG3_LE#e>#QOvM<n zEM$%tBiExX8J!>eU1IQup{N^}te?=9VT)g*A}Q#`2u&%!1}2K~RsPsK8~VaktVc^L zVdUuV{^u704{kV+0&rpq1p#34i-fI_;}JTH_2W|iFqQkHT#A>}#~s5W%8rhxBLA1O z_keG!Iva=WID}PRAPJC!3@EgemerQGZ~L}Tpp>>iDYQ^V*aQLu$c~dZi4*U=_nwlM zB-^sQC0Snblw@0bT3fdE-uHaZby!L0|NH*mFS)XG$2reA_nc=BbiMiDNpj13@nI8+ zojU|H4jK@JqcBbn93|g99YHs_?RNI0-41&TAcfL^C<53MfZY^5SOTBHf0cly4=6Dd zo(Z7MvtK}VSzrn_8Vo^Wncp=AUQG+r7`oFi&z6EmgK?hC_hC~@3O2`q=Kl$+_6A{> zeUR}sZ$ylto7>ENgGq-z)1m+oW^BvCm+dD%$_I1n<)&TGv;d9(95df_fuVgNDAb3| zLqCR5sb*pkGmQwf6Vv`#x<tcbqw=H>+Gltsem)eRZbaPYv~Rqx@n)VtnP*no)SmfY zHrh2W(Z1>A5|k4IpW$z&5*qifZZwXf(~y$fJZR=XqH(9t!v@N#rlXWxXx#WD#8f4{ z(}0dYC46<<WsrQh`l?TmU~x>m1Ushu%r}igW$Zj?-Txi%A<%TsPa{8bhR5TK$fx8` z?jbtKM@UOYRTm>@w{vXuEm$pyXR5^cPqZ9hb+UV3&HM_5f$5q53fPs3Q<06e5R!#A z!M>h==EuI@{BFGY07GO2XCK$37#zDzzNr<ca!8LZ{R8;3JG$RD?FWm&`HKVP!w>d+ zRZEG~yiWWO6uJ@N<d@Jv`RU8h8=z%(xE(&FSGGR~Dcu(!-~?(B2*&)Fh~b&W+aL8| zU*%wEkL#sT%j?iV<}r)9`)A~Lxf2o2Yb$R-p$^8OIlO~17y<r*z0kBSoDH9Wun6i+ zgmJ_M*d~OYz!upUa!pRmG9}2z9%nOj*fel2I;Iafjva2Sc%uMm--bSxUo0Uef2KVG z^QSt9re7;Be{E^y2=q~v@XaeALi_S7+J`0TgF<R?0j0<WNp{035wMGp#}S2aRs9X) zi5H>XPDlsew=aKDV6z8|&{GhoxAMYCDe^%)N~~?|a`Tcf)JI3qL&|qk1UP$RV+7%} z1&)Sr1U}tx09O45pI*M@QrHBiVVUD-_-lN>@$99rBzzsR&#)os^mpgQaPuX=FIzBO zVMBL5lq9%JA~qf=hl>{cA|h5dmXQGDjf<P%VmKrTE8(&RjwwKw*GFA>4TNSAl#;mI zfDXqDI95=>(Tm@K7EfMkq7}g^zkG*r9qzakRzN+F@N!XKaZYZ|1{n)Ljm4-Cy99ZL zkUthkQz!<86025Bt7CLFbu3U$_~KCq)Ug_!L5=XAdcQhm6-rJ+Vk4OvX=2n-IPi`_ z(-6WGwxd{s1;mS}%mbFK*nk2MplKaWU{c5<Z!{}FoY?>i?v{q&ZaowTjg3H6T)5jW zhr5ky_~Q_LA8S}wK(1n^%?S%1h#inkJiRm|^Yqx(%u!&7(2d$4a)*PFkiiVHjM4`I zt{8Y1`tWLkkUTur3@p`;bRh)QAdmzQnj461tlAIx#q|&{s?|ZCb|ah$sbE<^nh3N> zfoC{{A9!h}Eq)pFD}$0<HyWW%l^dcdjXoE;*^k$TjEW%>v>yCeH^6*gwX7y(6gYH4 z(696$>m<}|G9xJ23rhwoc`v;R@`>A<F7yJ~fXxd~cd)8PCsV6Icv#0qmeVy*m;i+! zr860sqDrbAI>5f_Mn13?IEtEswh(wg_qu$2NgLzvd^7>662lRPEqYqv2D}fWA*7Ak zbP;4-N7f)c4f0dN8@71NM<J7VM1n$D`2?@qiZD|I?YCP(@uC1k^}+aDmr6T)E+^Ev z3<n^Z!W=+$2l7I|CW0Z8526$zV=b)pdL2<y7^-+9uLTg@*jNM;Blp0`0(fnZm=XEb z{C=2bguk%|7P6RGwFoKY2A$A~L>lD~?0&x)4^_b~zBE+_NFgOYp&QcsUY-g@-jQTN z!=a<f@zZl(mPm!4!aRmQsyx)zlio;vV_+Qkit}d!7fzQ#vFWbTgpr(dX{I>qQU*e@ zFq)1}_nnBZ89j1hCVf0N!-NbLRB}!zN$FZj9A+mqF+Vv$Z^-E4q~)%hZCyqYDVjV8 z>{wRnGBKl(zd!xLXezG?N^J+^sOJPiGanAOr?n5Yw-22^TOi0v7oR_q4R3WF5ucxX zr>;m)QZf5kYkPX5@Jr@eZu;c0lG4K-@IyoPk5^K7l%^9W`1u+6#{6QKK3M7xOrPnj zECEC(7RVR$NHC!u6Y-J96oB;{z4T9dx(vBreZPU#`OQ?=-p=_1jOoSwv@a-m3&@^a z9z>zfrn0I|nNE^&kOyIf8E;LTA4{!jXd$F85Zj6MmpW3}uqu?{NOI0wa|!&DggRnr ze)&h0YGkmYk|fPUN=haTWgc&(6$~CbyLRmSOhwBlAKOtxhGq_6rKQ!QsmIMHlJ<92 z^<?zDTRwvV3e<N5%j--H99})sP*+MiBRrkf*I5}qb2N%iMMui}MfGWvuaNpH?@{Fm zQD*&6-eh*wGOY=LpF%i|f?7Xjw6&BJU1DBb&i(A`sgR#NcY*?N3XFP=4b741Ozsj2 z8KEXNiV~AZcpWjqmqm48@xQz((8<Y5^kHi2Kx#@&PchQvo`V4C#9%MEBdN}Gs*8oz z8|(x5MVunei6i}0B5iu6B2#ewWEl|JsIt{bEIpb^rhb{WQnZj;W<uI^R5yxB(vqjo z(H2wMCK6H?no@gKQu9SQwY4ZBM4{X>2N&~GMV+Yx(f$kjM~WmBMLY!l0^X#A!vl4w zJ-J<Q{21d%N|QW2Ly{p%i6Xrbb&s?T5er47#pBtClG3tTaKV(H#;scvp0|MkQ2tu# z;Od)x(oj7k?@)SY@|iWHGvO%B>vDmL<t9yQ1En7%X)FwAA};8KV$CRyKdpfhc=#NE ze?$bFQ6R88>i79DS2SpWc(y1W-7V9BZ0`!dH*h0>fNumY@9-V=Iuy8fN1{<)0BSHH zW0Ds2*MdC{h1Nj_gFhJ!dBCaCfjrg-AT$hUrwhtBB40ELSP>arC;&9ej#>AYCaA(# z)a--80U&c2yZ{AqV94zcC(596=m~-?HrfO(8Hj(>64<ySWQ9Vi5bG2{?hv#Y^4r|A zZSXT3ASVn(-Qa5!3@M^`#Ro7xN3TcV%NE!$ujA6pCisYgx(J~g)C#p)t2by3A<bs3 zTCLY&>fb<2sD4SI)tSw3!EDlL;e^q$4soGslU}ViYvF{Jr-ID!npM79BN4+Fh$w{$ ztD5Z)J*rjX*R^m4|BwH`v&-KCPlNb(`K(5MABzvwxgZP`Pe6}fz#~!d=QQe-Rrm`3 z)f&9T7<hUwe(Brmc)QT-#)AL~UkZ0@QP0eRQbsFLyMR&x4F#G7uNPYt*`z@rKPHGd zym{4!{9O&Q`9N<Qkg!esx*i~8GwaCJ3UY-!GQOb%MCeJN8;Cn?axfjMTFj&jt|<c& zpHUjrfG`Ne?@Y>qmNfk=@i+;J@4Py)q*xIt$g6_<PkbZ5{YpdMZwDK+A~fbyjhM$) zg7lTplyu5&?+5#@!sq_G)u}$ocu#VGiBSDXr0yuFYE7Y?Xg%G2@KYzy(eJl|W@jC4 zrfPCntLt6YP}imeQ{E7t7DNhf^z*8e<TKNshmJ8Ief2-5UTZpiv^kOVapRYb`w38U z7uqQV8N~^b3JSo;P#hS0z|Mux&+vf;c?$-$T_iOqgdUmDzv@#8og!dV)Lx{|N}3x{ z_eQ3mYQ)xo#0q0srGT!X<@LEc8X=%FJdTP`oU?&!0YctGhMcv)n})IL5H_pGg(9Ib zm<l=p)+iP3yG{4$qOCzf89I?;Xs`72m+@}SBR2EWQd_N!?L6kUcNU^s<tMu{7m5ek zzy-R9ACIgzAGMT@XYemopD9(lzr7KfG|`erFI_4d%E;lcKA$WhEZ&@oN+z;uiUpS_ zlat@S)3>aK>XA<0st&1D$SbtnY(sXRRpCTN*}CQ1J8>m24l$Pc^-_pcD^s-tQ2s#8 zfrYpN+{LC<-eMTiso*J9JaE|Hh{6$qLk9<b&IbnsX2K^1hZ_zv9BXjEohu7MC~XYv zuS%Y#8`5poD^{@p$1n7QlQf)_xbcD$aejpbvKE=Z0oy5ylL|l;jBeCJnaijKuW*ce z)&Za!s*M=nw(w03I1SFhA7HCsgX3TEjehwQ_=Ey$2&XO|_-Q{xB?DT6Z+KuUe&DJ; z{5QT(u7euU3WJ#g=yj9a3BBKj_l`!Y0~lJTukaOsP0^+?92j7tp+4*#7*vfx=E)$Y z)?%JXD7oU$U`nXfv1MK*4kP7C0Nv^zpIjG5M|m4CDMmz4tRn<&l3E@Hf;!HM1<?)I z$jSmEifJ?e1Qx61z|Ir`KE%g|4{jTVRLhV&0bs$9bq+%wg>n5mC{J%dDJ)q=s;|hi zHF+y&eI@FdQXJP9;C>Y+ta0kN`F0SSW}Ie=-l1NGRnCl86c;pOnN_H!pa?@#`RKes z!;Pj5jRa*`b^1BCBDn6x{O4;Ja{9!(j6B%A(?@9Y2Agi3>Q@w$hI!zeii7u}U&3+w zxNe<W>xMnCx~R{V>YO^(`}70-pm63`W?&@Dcy7eD6zSKhxJJb10xb4vBa&p-_!d83 zRVb0VAsGspUNNfk_^84(_B3kB1aoKnF<x2%y`)KTCR>b<GNp`|F`L!*sTGBDYl^F= z#S=$LVKP^f7m^I8&`3q#^xEllH1lTBd$Z}~l(OEusq~B%#l_})YLgA|K1BgZCiN@M zdomEGdyuzyICnC8CM~DF{Y)X0BAo@xz>A8H6I+^26D!FdbxtDRp%%@%bII(So}-+P zU?I14WM{#!rawz<C_Y8cT{x1QGnspd3gH=*$%|>(#G2ZZeHW7FlgqPya9Eg}V@9K& zS%Q__xs;D;=Z@;of%k#a8&78^CHJ10Nr82FM4ph>e4cR@SZ&ownI#bzvF`j((#!=9 zVx4mxZ_Av?EFfnR3hQgy&!nxqMgu*;`>Le2^ywV`ap2l3vR2Ml63<MebYu}LFC`5? zKKCJTJAP4go|S$oZ-(~qsn7K&+IL8BMw>uMoX+>3g7x0evT$$~A!auH+`%gD#p!t7 z`P#<3UXahzj@FkqSDs~`D*Kd7y)+0+A^x`T(okT!!NbL4pvW>5z61>f{6MR40n9lY zn<yTCk$@wC@vZ^Cl39{;xMX=cW1)Sd8GPNEid5Zc^_D^y{aDVJC?!wW3dDnXIK$qb z$O#uEnddGHBec?vYW1x}ie7eyIwx(st*YK|2+Dt=q4O7KNrKL3)f7~V$T`=@OD+@> zHTh|yvf@6_SG}kuEcY!JvsQ~1Dqz>NW!oB=gtRsR*;@yTg*h^u1{6V*RkAu>%4rid zDO%JSZ!zIQSt&0+b!t2%Pu*O<T9!t-JX$bC(bFqIKM-pIk`iYMj;lc_ps%d=A$?9g zWUahO%55D&)=bGHsD<DzyilAT>}QPpDbR^+Ovd#alK}_`m?J<SP=^x^D2W4z1%?BE zA$C#N51Ssp21Yc{_#q6qrVXqG6(r1c)i%H~II6;50EQkFytHC*Hx#S)gDl`~s0MlT zwW?N5Yf^_#^tJ`fzV*dmm#BNHub^w_!e`Uu@yz>j-A&nG5pg$F0wEmE5xrG0lgAe( z*SyFeNjevElV$eetZ%@L!@&(<8>PQ+_yC<kswW&<0vfi#u~CW>b~Cmaz5=rb7kzL# z1cw)tk}=2#hYQ;h#m9l;;TRNv1B3g&hM)EUnru#ME;+@9Sth?MM%d>|muLqm`+YsY z(sTY1KXGjQY*#^L$rm#xdh!ZW?>n9!Pdy3uQeK9Qm~+&4ctLnLbND^&hnB<B$6Ak; zq(#y|V81-w8}LV<;~P!oy#p}gR(TDM|Kl7k@e+>5F$7c}t#1J7h0k?7ssqRbPAV=F zoA7s_n%=1Td((x~p5%HAO?>ok5GBtL6Z(!-9`<$uk(_z!tKy@l4|nAjmVKUfkdjqE z`tiBSBc~DoaenmgVT7^&PD*J${_)B7JoMiD*@XRF$5RQ`PFNlr3u6P)DE0udv`{n` z>cLz^`-E{MU%FZcI>wx228&f%Q%koskHPM8Y1Uv)V}NCjK^i!`7`zt`e8DFh|Lgi1 z<|ukZ(>fI3jA2^P%sE*zO286qk^W%wDq4aS=<Xl!^M@oxm1<4cFED{E=*MD9?fy#W zg2h&V#ca^4pIMq(TveiFp}K#m@6+*+1Lo}tkbj13q|Z2MP3<ty4C&eG#?*v7glc-I zgrbJyZP`^P(_k&z(-Zg`u<|h+NdDIVf&!WyU4x0<G&1DHD<kru7U1{i<7a5-#G!#p zHO-)#ILXNEtFB9=M^Se{YfBk3b1I8+s&|ZythH5o;K44B9cVSYyBMUx*1leF7MweS zwFk8Rn^kvHz~KfPFz8*}KKZxg{_EB9kd?itl50TC7oC%-Olm)igJJF&sE1&dTjk+} zDTxvV0=V`b|Bo+sd`a`*z)RGw!J&u4^KEC_?A&2-&=XPcxIk}05lEBa#Pr|xdc!v; z0q2D_@Bzrr&;Y)Nq#Mg|9oxLol^o8P;lQx#@t*Mw6h&KY45XO=liZRV;w`lc28QT+ zjc?M6T^qcWPyWr#Q!J@;i3gC(D_HBxlfmyGxlX4PD-}wxHYtN}I2D-E3x6GOgcO_L zN<e{UK~%smq>RJAMBoyp2y9%0lvqmP#y3CQCedv4=U^k#v`i%t0spYdWUTS&{_pyW z)f!SIEQni$Y#m~=VIA1DFl4mZ4Capzru%k+fIl>*c?Lak78t{KY|kdW^zzUG%BxO0 zFOT>?o&G+D2aSAlH_m$sWt%qGPW*HkxJ0;cw$vvNxH&GNYZF*;aBfxV1S&U>UA_eM zKJ~2~J;Ywz9^yK>;6ib_iUMu`3MTXczc#ky$Xqw0IO~x^Hh5ySn>Y_LHrgc33j#)8 zx*n}SMFMF)*c4((XThIgoq;T4Xl)s8QGIE0piR*6qIc!%KEVnc`Sju3Y;r^;i6DnZ z@5BnuSvn6JkVgQl$X)Whf8Tte)*;d%^H2N0cPuIbleA?8Sgo755673@-yXGiw1A&~ zqKbJ8)5pBw$pmd4AKaPO0!Ruf%!n9}gFzHUiT94QeF^5k8<OujeK+0aGNPY&1R$E_ z0z(V;g~e*?r`@on)Bk`y{YUJzkz!5hS$oRwtUv&7Ti&g2jB({8;dgR=GOq&HkgG?r zX>s!k=+70W-~1Atdh*%7=pWxc`R?^?^5_2cBnNB|J&*d)z_Dk$e7_t#MGk%b@^gme zXFnT+L45ESLZ|OD|LXMz(_s*bM|X%D_8eIMUp?c|7kdkT@!Imyr+-(DKHQ&-x_<lY z2ev165D#prgF&P`tKVMs&)=OC{O(ULJRzQWCRF&+p9bA8{Qf*W?nO|Ki1#i1>8EpV znx2_@@^)_N-nV}Wd`R>+b?Mg)9$ct<{^?Q0eXs91f9)W4_1$4X3|54B`mX4K=asvb zPrQNho<LvyclaMK!ywuphEk|~Pre=g?NbNQ$n9BsE627K!%Mp9`F|tS`d`{Rd(!?F zL-)&`d-v0$AH8STD|q^oXf)xGwUIlt&3jFczbQm}@_o0AW<P_<e+zc8yxacrx%<)6 z?$2(2I`Wr8%m?+io_T72%T8z1^OHU(Y#02^(W8GjlHj>_>CCGr=RxIvSHk>$`tM^e zee%Bio+E#LQ}pAR)_a^KCk~Uq)OXdI+O>KE0sZ@<`adV_K_4E+_AQ<GCo23O^x5yw z>o4E~dB}?XdF-Wk!~gT_<F>Jz@`mKm$;aM?ft<hFi~jYD^<G8gAMk<vr7z}8##@Ga z_)i`JqWCfzzSBy++onIcOR=vU-8z!<466Dy3?%i}Aj15LfIhzcFX-ii%!l;1e9^yL zd^h;<+z(ob+m3D_AH8lc_~Vr`FQN3O(Nm=`j)5(o(ylw^+x5`^kNZ;{WrszwI1e_@ zE5{K<J8ORY@q?Gz9zMKt<clN0d%1)A282J$6aV&&|DME$@rV`efBv;c#lIbS>y_{a z&wRz~Kl=Ph7>4<kzkcv5f$hiQvOmJ2lKs*2<wDL|hJEVZd*10yd>Q%nKlj_L(4j+r z)HnU|<$rjR{)B`-PsSJ3ldxYNZ$yHvzuy0A$;?lJdB6Uu&hWcGCwPzjMh@Gc^+(!@ zTTSl!xg+~Va-T*|mqSV#<E`bUE$t}(vBUK%_r3G;gsT@-1l^?@;kj|0w$X0Gz<dB6 z^BNJd&VX8dyVn3=JiK+G+ZYVWQG`41bj}MR=*IBum<vIEG?xjmNEi%I_c*|=A3_@T zngiGRFNhE(nstIY8!`sjL6*>hJ4vhqZj3X4c66&{W_>l`*Py_efnt*L0xSq(9l9-G zz`O<&-GBj#rkY%kL<TeXFkE#apMiXqa_~OA@)e{3eceR-Y?g7&`N6BstU)3=fgku| zx19>w!_6iYG6w<4IhU`x5p*lwclUq6fv#LX0h|$+`s%B>pw?>5@B?2BCKT~=P<-j7 zW-+j(Fh`rLFEvN-22=ly4laW+8nP%Bm0sKEU5@`6e(ED%St=Kqt5a7I^(-5$XJ%{% zAE}rB_$Bpr2C;20T6=aH4c4QT^T5@RP7QQy%?Cz(D&}$28FRr^oGwB`v;rEMxYXoB zL&+_@NN|COWQ3+FQRWoVrB-65+Wt%@VMlfpUEjLn@kq3*@8W$7)Z3fehR#2aQk7U; z{G2{7TkCk_DGjL;jh=2nx;9d-MSjg3+~wT&*QccRt~0+6$3NV^PJJllVeNZQW!?-E z^77wbJM!?vt*_7%ewVvblK2nfL+KANTXyBKx^Ha_Lshfi{(Rx+<L9lU6MsN&{_N1b zs}nsBwefdk|M@TWN0T0-QExbV#~c56!uRCq-<R@Zj^Cf(duJ1@?dbbs4>7PuUik37 zyZtZx`qW+gjF-@k$#Xw1;VLNa><|9(CGR^2XYVd}xRia%7eBxBL-6h{eLqEe@y!S9 zW50Y)8^8PXlVd*_M0dmV?t1yr9Hn-L9Nk}m9;`}zgB5f7_r%xU2U@rn$keZxubp`O z>_=y{7yf-Odh=v>*FyK%9~ZamLHW<KZanf#L*K8^uiIyTBZ~R#xeV@Ikz)sWkAVDh z!^}@E-1`>xI2GNub?(Jf^gvbqOXwczuXBJII{UXjpchlnJBN~=Ko_54{@j1$jURy5 zaZCGKPb55EutOwY+<t+)bzs5#r?;zOco=&7566K*Y!#u`US@BdN_|y%dmhJ-uy<xv zysH<O$C1B{$Mk)eaO$b-ZH|AQa^2B)Pw}r#F5Xf6>^}@!GdUW<qv+@D%!k%~{1rzr z@n6wT-dF9S0UP(pg^|j;W}mn~yzeH%%Wu-R(vzP>w=>@QU!MNWzn}hT`1OAVU;n7* zuDNGUFz)w$^sg)7l{kUWdp~~tqXqeEDQ^z69ylhAroQ&EY3y$oKL9r3?Td{-!XYqN zbKvzN1W1(f(%a+yBmXXoX1@<8U?nLu<S!<yypgn@S=!<|AS?Xv{3pJGV=umpdR~5; zK7R@wpB5ZPv#-A0CI28=U4oK6_9J&9C=(8m|M=2t_tl~oo_IScN=!i?iVW|+**E@b z#=k_1uS}PfMpIw^!pT4Eugt#^Ua3=rHWmF(3D_kZiANryuA;cmA3*j*vCn6YUbWIi zD0XaG16ExlwszyXVYqbE30VZ!v9(we<Q0yAY)e=eihzf=fczGoGejQ<VO%+efn5NS z(^)Jw$b4zpC{JvGm<e#9i9n88;L-yiuf|5aQO^zDD5i&u2~x;igI5rgxj>h91vTtP z+iWVc!(q3mwJwoh!nU?<HW^hRbi?xb^T`*^oj-RDJAcEugbNEuAr~(^Aes`(C&%W% zCBOm2iNV4NiJ<WRVgDKm1!u=S7~KK?L6F=GQNqBn2XFOiosbk25~D&!6OYp&ycz_6 z)imV<cT>WEn~S#DP0IX?62;_TK+GjN)=Wx=O%p=fI}hgM<Ytz4mt9E8%E&rGMta}5 z%4Zaxo?7~#&?p9B%c&6c+8|ev*Y0qc<N*`%hb8%X`FW@Gf(@5zA;B$Of}%md?K5Pa z)@akaTw+H6)LvK42!`&Si$~Gn3AEJbnk3Gwb$~F+Jbh+xrFAVpq6+}RHU6vTs%F_E z0p>*0khHID#fd{me)rHxR(S=D(%RhH)b%bkV6%U5;+eJfr>mdJHSuvLU2b8PXqnkT zXzlDE_PC9q02U^XH<XSy6p3&N&W$<>Aj~0bQ~St}#G|pLe#S&m+PT+4xO?F|Vtt-C zf8^xgnc`E1n$JO*`Q{<3<Wy^GWBQa32T|~DLGA4HNMvw4rCXm%6XGD=Kzix*i%D<B zmz=}$ZzxE6r8~OnuKwy7e)qEl9WQi&X2GWCbg|tk#Wa+*fa(uceK_bJXdh){^)u7v za80y3k}E7(L_wF#I!0M!RFSJ@t;>4D{11RQ|Iu>yM<nrq8e#nWnflZ3xX?&qR!7d! z?B@EfL6oOt6^OVM^pV*?#ypFr!a=-=`t<Y9KlP`lpM3I(C$J~CJkx`OOIe4vH~i+c z(&t~J&A@vGuR%Rni3|pPRQI4thx}2U2(%fH@ipwhUvr?gC{Y#)dLa{mRJ=URn}+O& zkkaJ`Aha}8i^sZbB7%6zFvahon$YUfdLLt8$W5YSFo_Nsn4iEzrNS*|Py<;C!LA{6 zqrDe0wUD9a6$v9>PwF<JH7Hqoi<rA2<?#8S6N#9#I-hp44)Q&Ldv^@%#hapjWAlU` zJRo!sLKP>0*pa9>R`LUzF$Qx4V*_D5h+tQ)$~5p{z0MEZ4Hg7Z$!i3Mkt=V2$e1Xk ztp)`Y#Jd49fF&OStl=Z!4=z^Jqc(6|+dX%ooQFUy1?EG@Zwc;icp@s$#;fPB2=2pn z1#SSJZ{?sLZLtnJUA$S)bp1#;wzf9PM~kyaF)D{Gh<<`C9YT|5f$92WBJ8VAo2Dh4 z$tqn=IFoxx-;g8ENN6X#Ejm4Pb;~d%*kX@U?UMVJ=YTJ}jt6N|*`P@Mky6BQar~}X zH0z(nDA2=CP5C+`1x<P2Jpoc3SDz{AI6neD3so(7?eFDJofy49FAtq*0zZ%|frl>K zQ2lqwz95jx#n8oy6-lN6bKc_R1t%k1r<a3fu!-nKAL(zjqPn*Li%<@hPUdHJH`23s zNsPMAfs&cDO5R0IlI-wu!57|Z`?z1QqG!&|(e;Z{pj_|`i@ip=UjvSg!;3EI{5&S_ z4K8sw_)KlFudbpsy&KSrTHy9;z>VJ>as|9TKO}ONx#2r9*%h8^XX<`nP909IB_d&f z(#Wqh`_zueJop*u)b23Ywan^JK<*`9vtmGA2q}%gHAd>LxrXZsuAVMDODRM@LZ(s# zfAQ}>bo`&LU49;a4m3Ld7f*))`CSbSa-MWJosbL)|8zlOZTxfN$N%f+#;x$cH&6fH zJ%F5l`agB_|FLm+XIGBs+8O`<dj?DlQ3YPf4v*f)X*$sMhzu_Q9F&4$_cEP_zjzG? zOcpBvQ})%MKogz^?!tC$-m!DnuAR|cn|JQoxnpN!S7c|*uHa6z3){JQ*G{;E?ZkG) zz!7`vD_1uH+GU6}1pf*Y!daE;z{ZFIP8+B;!FeKf3bteH0-)nfmbEZQJ!%Kw65llF z@~!hIDu=YXu^Mol-Q;;_cVu7O-hKD%!}iAQ*>}%9Zv5B2z2SW^dxLO9_o2P9+h4o3 z^Pd{0Equ@hGFB9r!;d^ppDRq)2OR2<%Z=IHVNmqiLQ%Inie4;U@VVqcq+F}8x-fMp zDl39?9t&)-3;cWiPQRJ&S@wp&^ASlbCXf~F<xY9X6LJOhYUGj&3)KOEdrgU4N>Cju zIB^8`8aO*{0l@d}+Y3-{+OvB%w&(i0_uP9Az`YmScLRQY;~%!~mOb!g#~!$F*X2?D z;8^0Zi2>j@SEfPEoSQL^uviSk_{5ZkCmUs06ij2cPBP0eQsg102g|9eH&oEa8blTK ztIVn)W=EDCIUyTvM9y%|uqH(`Q;%VO4w#L8RwfsCv|4=ygQV<WU#y&O91&h9XARBd z<gO6f%MlvwjJwE7TaKV@8-v-mXYcM^cklbjLytXl|K7d#VEbZsZNqNAXV;y#-+t%5 zJ=^cR<F>7P_TKT<eYfqp<INx6x_jTwZCmf$vv1oq?*?A9iiM%0($Oelt<4CgREsOJ zaVt|aCloA5_<h>(Aj3K-8Al4jaIn;0GEE>9uc5Q&f>||FMV=}%@>1PgF`s6b*0W@D zk#RG_If|h+9+enD_UeV!7NWR<)w5Vrg;Xs(5`{4|-PU9TGf+?OW(w+R0|fsE&%?X+ z?7n-?Pk-^qV~;-ai=RLE@S_jkeeb?IAN}n3m+`;+OF{mh?%ezSUtTHtYR{c#EXju- zieF1Q{;OLbJCgX%T|2K`YcL+eGKThr*(`wpG6{1H61kQ;BUs}rRbn}ty}BgRPKzzv z2zs%$Zjw^pxLi6%9b$-EmM05JLFFl9jLO+FiY3dUecZ927O=r%WpuHN5JhfkSA7#Z zzjS4MX{NVzX;j2y&d<#+j~17L8kMuTZGqGVewu%9|6=#!|NZM<KKk%)o_*_BQrg91 z?>w<@-<>ZhB}PO|Ff6MbFYJ)657Ppr&uc*8aRzq2@DFbq^->4vr?+17c6=a=fcFu| z78p3j1Dyh6JxI-<%f&sPHa>xC*vM#sJBQ*bc-#yZ16I8_xCvZ9V}QBXG~K`jE(Ae* z5X|;NyMFewhoAc}r*p8crK-FV%IF-u>yE+k9goTnJonKpd)M=Cm$3J3$@D#X-u~F` z-D%dxwm<D_y>HL!uBscZfiD+$P;htJXm$7P?=UG<7f&Um<Q8V7fAz1Y?!I%h_xioM zvLD_2#5qUqR%zXB+Yexm#XBC^aeI>O;Ttm?zqoVnjYX~pUcMS%2tkwrgcJqWgP15A zZ{Gdj-S^!4)W;_Z8yc$%Ap2S6ncKJSyYp4`tXTE?T@~XemAPAGO<T8qjQuj+{>aYT zldO;2Sg>~gj(dKTf*$|J)y;zx=Nf_bM=f3y+ZzNm@hX2~3=i+P=Rz-~CFSJ#%(BX= z+KQYHAKSC@zvsFRKXUU~_rtM*%$sD5cqfm=2OizJBgymFb?>7KTW|f9hIQ+!S9cOc z4+>U;Q>(sN(<)MeZy&)w1)6D_*=!Sv(Gs{O8{IO$Udy+X3_yAu)cl;>HD&bA*gOjX z*K`WF^-j<FctTi&I-P}!nI<Pv!Cj3%DVPZ^2%_9+k9;n=HYtlPt=k}Hvkc={Y|~5X zG}AXP<GHu~_o)(6ZC28S^9g4&+NvJB^#ym;ix1v-6ct_y&b*;+-?r^D^qc1+69Y+q z3y)Ki3lOWrtbg|Ae_uTi48@DG%UpwbGimGPTqy3*(oLgRyU{eAF_ghu%BYQ?h3-pz zt+hF`W&QO&nKIN!DK?NAr_<NT>C7HhP7uu(v{5o-jpKyLf%*z&4R<!hhdh^B^XgaF zS>lVWqw>5l(n$Sic`LOpt*e4w+&WNF&(4Mfb+E2}v3uWLTem;<$zT5`xf1Gjmu0^D z%-;K|*5oQ}#-4Meqo<nxe)jzxJD$mZ^se{X8(z5M{r2X+ZvU{ElK%J|+ka>%?DO=+ z=1Z26vE`59r3_9HR23F9)77xZDx;==M{eL4@hesuMO34$vW<-S8l_D=ExERezLL77 z>eXyNTA;EU+EB5nibYH5Udi+5D!^u0F6tWZYRevP5w;E&wzdjd+VZBTi%qKP=7Jg8 zeD6dHw2QCd-9U8i*?Z@<```b^Zyx*Yi>F_^<F>CNf4g;8D*DS!+qQ4rde^o)_wL<w z+n&AKx7~i{-fi2q-nDz%?OSi(b<eeE4nsc=_ObYc?uib`dLkI*6g_GJ3ydi>tzz1+ zw|fGxM30>0UhLMATcuI-*Rh5fUMFdpAl7uL=Ih#{Xz^UXdKxXZh{h*`6w`duYMT}L z$8-zgc_N8Dr=1;WXRj1i+iC12)zsRUmAtT`STxcUFp{5o9^SoY@4ff#-h0pP9Xod3 zefN%?yZ3E>CvfV2e_!r-dM8dzaq_u0wC}&}*}G@&J^OHq3TL)ngFayYY33I|Y{A7n zW3wI9u8Ty89s0N#`q*d%cnzS^XoFJkItvn>;Da4eU^V=3xcB`4f$j%fX~dBSzJ7pX zx!b;P%igU&`Sa8FY{#Fm{?Id!$Jh%(Tx`_iLDz-72=fB!*#w_zxDfH<4Y}{VEwnvm zTX_48+qQ4twr%@uH{X0awk@(f4*!X5N84Q6V{drz>doUpo4UE6vWT;z$p~;!5ho1P zX(f2j7EKolQN$uZ)^@-}UETnSTTIM_$fww8KSc48H7M!`LC>)f&dhx5EQmx`vV|CW z#Z8^pclNmGEjr>H-`zbYq!<$h<|1P>_hbw36!TxKGX{f5_u0awPLp;3Ol_<t0pH4# zCU&k81aeJ_8d*OTFOeO(wmdzJ!*eZz>Tcg~|9XmLNMoUxW<8@M<vfAw?_YIO6E%qc znQ5E`a_Zo<kOapv=oDIa6{m~H?Cu!yYIDcyRi(W4xsI~I79grsOVq(B<jB)!4Y$|l zjzM@0zqDT6v{XLdOlDE41yHCdS6Q>t)G4gBFe<t!1n6cTeH7*9RuPxeEmi%rfr0YD z7D{?&AGdZDX-fqpCgX=7Ik8xh+S}7N(l9;HG(zg3=vq^0&HQ413!{@LZvdoQ3{1!z z3g$@aM6GpAYJ?SW>f3tLmWrmxZ465N1VqH<N~)&`&12<56&d;?LnbRkV^>X75Gr`i z;{K|U&ep*es9{*Z?HtWkAzMDbt#9H7Az2%pZ!1}_WDYr$I(cAZadDh4<qEKQmPg{i zEqE-;>?G{c8L`Z&v5tZpTxO49y=TTb%yKC8x^)VWh<TM{#G~%!>R4l*JUbt3fjUZ` z$IlY$N7e=2;S`R{Df5nt%`_(1CMMPvSfKN{`t3lt2>94}S0rG8;KCXYaY1+I8=8n% zuetSF5eJs6!|Fm?K<j|Qfsh+r7X;JqsvkB?80u$j0zSirHknN!5E}H#)oT_;tP@O4 zv6I8lgzjLFk)hH<69Z$?P=^|tur5VlmkBWygu(>DTgk>UIP55{ucTH3TSn%U0B^I& zUtzws-FW&THIX$-nlKLy1W}~B)zDMSgmAalIgN=TWq;>lIe)0$M(YbQ>y$}tCk8C; zmI;vetIMIno~&tfZC2SKmDG(LfL+pC(p)Z|sdlzhvNR1VtMx6W(V^9*(zbdhZCF!X zzItQ~VFFH2F}t=fEbF^Pq7`d(YaF#_T(04Q81hTUMPMN41Z`!t>_Y1?rnDN2d9sgI zy9xI3#>GXxY=r7!(2Py9z^?T-YWquQxPRsqdK;jy;<iwK1^a`Qr6kBjEg-9EYZn_a zw3eIMSjX%tL6c-LMM@=+q;1AFf}$A^btSOt<`R8Lm92iQVS=1r-B)NspfN(l3&k^J zc{V3YQf6+iY1a~|sm+Y`9(qfAPW5CHgWd{U#O(Y!!v>KUR`xA!)(DgDoM%}ET>aC4 zV}7}oj#g#D!hx!(QIfITU1w<kKc4cHzUBH##HWt4X<bVf8~Byrs-tQ(Rn;xj0Z)0& zaJ2cX%pz(baj9s)kJf8RLj-wa6sfxk2Wv;^B@@Gp^+qCl;o?$T2dib3FolAHz}(o< z`?{M$1KstaE^4ii)UL@<Ayg}AS|Su@_m;0$bQTwlw&!z72ImI`xJ{FV^!fe?X3GMK zs(Ms2T%KgfH}Z^okVn&TnGEd|nw&K&1qdr37IzgEHj=mu3afshudBs_T!p4O;&kI6 zw<KkXmo!~YGk0f%kiC}DPf*msioRwzQQ5j!Ve*+gdI9VMjVNM<B1I@@3x?L5{<UQ& z_oNesl}gBa9kzsQt0*LdoodS#LqeYr-#{M>^GzYnx*nuesBYx7tE9U1(7IWuF|?Ki zj6zVBc-JEuiOb>gSTqP*Uxz5YaKH=U;XZfJ74e#F5UCK<d$_Q|y;DnWr4%x}xtuDS z#=i{6DPlycQe<6l%LJZPIa(7q_~7QS#lR1n1Lmt1o5VQ_d4_Z_#>k`xsI6h#tOGrE zYy_LRYS`D}0@%nl8HiVY5qt|mlK)Ln14t%u294PdhGM@2r<TSbkUSLOgHk~Xy0ch* zaQ3Q(LDm%2xlzbtsgAh(-sK47?hJyr3W@-%&M*cAmRwO#wSolT;b2|}0*Qw0k@0@1 z*#XgOu-7nq5J87gaV@aTV50?19EjsiEaXFB2R17KRU2fg@Pq(c@qCbc!|$92JLD$F zF@3YcRsvKI?snCzV$m&SE>9S_1Dp*AUEUa<;(MMf@zVHm(O?U&la*T~og@{OJDRHd z!O*Jjo+z?Ul_=^uhbrvIL(+E+h_mIR(g8K0mpw8epdL~5ga2c=uX-iBKs!<i45BHc zoLxbiui{f$9D_BoitL$!>Ifngv`%IT+ZttbQCHV$?NCl381gc86L(belM7kWnlW*G z!O+YkpRh#i=jEw6c&4a;FW}|*M37zp7?ce+A3z?0Hcr#UPIebn)Za&~me;a+#Ne7& zr>>HfEvHxTDjf16*h%E#A>w+)G)2@b?60KLyR;K*<;8j<a!+1j_Ds^M{dG~KA{a{= z5kSkS<RmvP){DBSpeC)iHaAX5dz78M?WsMTeP{qQ73LC7_8nnVq;0G%?r*Ynce48D zNi{iSP5B}RFH03NlLrR}EQ2uvra|%GW-1*L`+W<rgtj=`LzZ;Y@`%ELR$YUswV(@9 zQxq1<b0<fdRjqbmE;w2W&sf?FH684%lEK_^>cq(CA*zu;b|6_^Vf(}syS1nWJOwTg zCpr+LNz6@MB9mkkN&hrR>U9;Ak$HDrqm0CB?q4k%VS>p~Q`O75tBOm|5rvgYjN&48 z=>>ilr+!>rI>;07E@$By_3<2H$7V}EWJvr5*dIqjpmqm0S^5yf5kc?{My~*>5wrxn z;M}_oS*ShMD0&(4xCGau(RF{s?(~Pleup(0fPg_{hvIbMXkZPT5_FLM6aJW?Y5+tv zLz$@%l>9**3n7rwJ&xr@zjqzEEfF{u0Gsh$P{;|g#+Y5$I+T)gz*naY><M1qWmvUL zzr`8jh&ng>g3f?9?7ZIP1r2H-;EOuL&P^VlL+#vb9r|`4K44^V)P~87b3nTx5;E2e z{l@AnZeRoO9Awa<$$6J=pf%LNf^;J8Xwatjx=m#jOW}wQVkmF+hCGN~5ygDosNZl! z<2bJPx`{RC4p->n|7d?-IiJB+=Z*Bf0BL{Uh(ErZIkR$WJ`_X}kvkKFd2C+#pwDIc zPpx1uG@Em$!xboe<HCWw&j&uGzB0l5z~z;{m@ssRa;)aR4rHAEWa?AOCB?Z@Ew9Ku z#{bk34o@&E@6Ei_BaL53PQAx_LmLpiydL<X`b^U;N7D*EzVIIDOx}S{N>idi=rja} z|39?_)8m<ws<=FUtx(u7>F!+d8HZe6ex1DMmVcA2^ai?kdWPIPGvoP>(_?hp3FT%W zS#AVMF8ZBekHZC#tq{A$`w<fY(IP>p(Gw2&{d!o1-@UwV=XX3T^T+st{#YLbT}%9% z-NWC$V9@V`G*DzP))0gk;;<HcOXL~|z=h=m#hqgVau0a7$NCH*aDIoBBl8<COgCh4 zm}Az~pgdjJAU14P4}5Q%Zgv&alR=pj7ZAF|z~40)pkaFjD38r`7R2udfhEHCfrC%% z7^EY*E&_EPoK<jg1<*2drE12z>X?K?K(Rs(JTHK#WW3mbzMIkG>fO{c#@8;3mp3o= zeXq~khwFhzw#<x|5d@!fA6grz(?-z;i<PS=QeVn$(+#x`ug+@GT3x@o4#GX61JX7X zlh9|(=dr4aWz|4oRW)O*lNQkE@M=5NbsTPKlk8*aCm>9bI)*aKoc%4%(t$%v6o$-2 zbGdC65<&6d3PMlM)hy4I*DK40T!WxluI5oDsN$OO34Xh9x{e1<!=jamHi~gfIgNr} z4$Rlh!%d}}mOe>~QdlWJNnL7}U#_H}C-rJwy6fd#kjfkCq6Y*qd>14t6^SB{Vp1%E zoaRFD#s}0<=h41Da!NOvGY-_(EmSBP_3fH&HAEi#5>sX~k-xxRNYrw(M=Bdbh$0?r zCyb3CM9s==s8SAhR(Tri)sh0xEwvijhPxq!LAY|QMol7+C+cLimP*i4m!h$L($dm7 zS$?DuDD6!oCZ%?Eb^!3F@98RUC1I>>qP?vSjJ3K-B5jJ)=xnTSIz`}=!zeW+T_vl1 zJ>(TKP!wH>w<v-tR4Ct{Q!=70XV%&;)el2?NBpgJ(VggqNDrjlg#z3{yI>RK=*0wa zqA50{kc|`a#%DtKpHWd5{wy(IYOb7s=hWwExt+x&W$FrJmZ(_KLYSNdgjtc=iGt}= za@#^i7U%o`$VAOV`T%<v-0shI<t()lCYr;=gnUB|4XplcgxO9I93vD$S$lS6tEfSn zEzUI|M**{Mu8&%r%&JG#a}WuIZtCMfNs)R<o)Sf3+A;DI{Eo2>@d2pw)0A1!K290v zA}%C!r~6wAVKFCB<~!=eIfdX9QZq^DZp9#`lwXTF8>Ce^M8X8ISq34D8&fa}=-q|% zezeEmBbJelCljDT8RU7~NZ}5ti}4@QX_^!h#VKo=B$!~QJnyq+NNWtKM8%S+bE=J7 zgwokWIX`&C{6x{8wQQYBwrT{Xa@C>sn8a8o>}{<=j{<pozbznFT3SG4j7kh4hX+_3 zzr_XBS`1+`GOVmyMZh?Pg}|Lg(caY>f>owA`z;ZzO$Tk51Xi!ZEmyBuk=Z~58_`V; zpDnCWAUzl`Z*=p0PM_Uv=fliCZjx&(9%q2>zzl))ARm}1tQ`t|=#X3r&O27ER{(@F zybOWYA(7cA*Sa)*fhDw&C|utOv(vQSn}`H@pV{fM0vFdK5g+f-OG}eST2CilAT-7& zC3KEtch{fEsd!_$qGCF(=!*s!CfFs<&Rg!eG)zh8uPtO8NbDWD*f5oqGk&p-E)HEW zO%^bp0_z#k0|JWbq!1Lyb{j#7>;lRgYjHs3t*BOV8JsQvr{&4gOT8B^_GY9c*Md;h zBjF#Rn;2=6i6!+(tp&-1vmFKT=S$LC(;F(upJ(Ty*1h#o0bd}`j%P70W?fvIdN+-5 zar{yWJ3XPNw)Txn@+)5&j<@j~>3Y1c+K&BiCk>=_AO85|5_mg3VtL8oI#NnrWqDg} zS6*g!T6a#xg}!WBM%(GZ(~a$M7mnBALziVylnEzO3bXp-s|LO(s;$k*YRpce9KX;b zy>jTFOLM^Di<Mho?CVP4y>)7^PGc*OQYUs@0ppiLQNmcc`Mb+-P8a2V4I&*-%F0}l z>{3yvx+|LjEKV;Jf1|X|PW3^tuo=$m43`ad6dG%m$6g*>9;dCu4fHLFFySuI3`acH zKfxi-&QceKXe-OTGvXn-V0K|b91?C``aYI>7K23zJi7(cD}ejKEQUUir~;62!A@pE z;bBNIOYaF`p|N2wLk3`NVkIib>=ZT(fZK!BzevHX(XbWVV7oYek98>I1&a+H)Exv) z+>fAA2&_U!uOD2nLXMCFmhzU3wn@xAUpL;3H$L=D;~c-+<?0QEY{JWvKpF&D%ndv? z_&-4vFR#O~MqHSk<8l`kxKI!g{%w5BLCvu_sD?SW$eG*3;m${9?|_<-PyufqDnW7P zIh;8tp*aVCumuE}HzTu~Ip3dzhgE46GX+d$<Dh7AqMi>0?>}8b;rwxZC8Hy`-bAW5 zv=>qd=8nbw(MEB_FovGXDyC4?z05;vC_<~48yctyk{iJM*f&mXW1i&XEdh=nTw&CW zxa!)K7dgd~pmF<TZh%j(>mwFahETX*+)zpHOxjy-B42LY0*%ufMU{X?F)Aa!aQ4&H z-fEucGJU3WvRvb_EQV$*c8uvCi(#7Kh>l&?PagUn!HVbi$jh5hQM8=ZdyzN+$r<Y4 zT~I0AgQ#n{t1q>^Z%o)zwgx7H#17F&3uII*36<8WYnDJZaZg-g4G1bY&4D~HeG)H{ zX1b$I{ShRfOb*jK7>VS$7DVa*mbbx3m?t%dnuU$_jkX6+*U~;{yzQID+rDYMo;1-n z)w<T;Xu`x_6C?%?Nucx-=?bXDiEV5W>Tm2{>ZcRbz4fwu6ABI$i7JMBB_w$ZRau%p z+EQ4vGTPsz8_fo6R@5}e%FEIh8;~NusGYTx&L=m3qJ3z(t6N{g>#7MOb7l^Uo~x-I zUFi+?7J-zI$1hDCqWUSyc1TS*jJHjd?ES9sYP@kR-Z<9Q&mH6!D#+E~1AUo_LJ%$h zZMy>KpGsRj2=<B9+9bpvLy0*A+F}gYI*&aBnmNA(xgF7v6><>7tp{=ExotixhFJsP zTm^zL@avH805_T65QZuRQJ)9yL_c!5BhZ4^4k-hzKoPfjA(0741hCn_glGc;jXfN_ zDg15Y;Hwm8-e??!x4=D6?g4hqe}*|W1nxJnzSZKdWdp#0*Np5Nz80=Q+~P_vFAPRb zPVYP@y(b|2I95#s?YKIwSD*&F!xeJ^dQ6cUG>9v>w}MRpczprXD{%`t5jZ7n8n@sK zC=1t2g~ZtGH&8~=&l2k^)7=ccl`3~Ifx9`?BH_`z?jF8t)K+_ufvxn1+*J8u;wmUm zVw!JFI?|BhVHnqFGBm|RoH;0BcIAt?FC-I(b*i8&>X2gVx`<&VK$tU$LM<G=#~?)} zp(7ynf@>v~uTz0u;;)Y7HNVtuHaNmQg~A8r%zgHN0*I_RV#Mr5DblM55U_)S0?R}P zIAh`=FCn=?rA4b&q{><0N2NL|KUB4f9*rnWYZ6pGW<zqlvD73Aiw!ne1QZ)QzaG~C z8AOrw6}yw~^9l@h5IIcWpM(|Pdj+TROy%b$-kd||<VDHyQBq;6Df?t?bK=?BjOOaX z_Dl4GrJ%owX}#_9qS3taleueUC(Zi@1xHSc*RPocNlL>&<~*ffp_;VTT)@jLV-*a^ zOXvmDopVG2H@&fmnGfFiFJpCm`FUVYZ>X!L<%-H0dRTO7UoW|zw$jZ^0X+k4>^!@v zgTPCfBIUx%3HB9t7l6P#mgGW$q~eNtc2U<nDQl%;v`(xmV1xDIQEkEufxszksa|Sr zqn}lE4>ZckyC8o?_25!lGe4&~vvRJyrCDD|8_ccm8S7SjZx(Jo-9tE^eRjCx+@W3w zm)LW7%#(GvAd&7nnZ&BBFU-yu%}AU)Pkr;G3StSXZp%TuOQ{LN?PuTjw13j~e!K3P zS%?>Oiz{1EVv|6aH=ac15rjQt<x~x!-%98jlC>AxO4jnY5s1jE?3(K5fWg<)(m1<% zY(SRPC}^nhHnz`It`b2FVmwSZMH`m37oqld!8=h+PM!en!P<Y;h?dB#>E5cevG(N- zPD>dFO;z-OG2}5-^J<rhROPB9t}sch0Yb?N;^eI%doG$BS?;Y?G%fZLtc~=VhCx0- zmQ){(z&gInl|bPpT6%@eQcq(y6Q)OC8oJl8_Vyk{(X6V5zEDN<(kj<i%f@x1jKM@N zn!b&Lw8Q#_{+Z@hA(0TIHb7dLtF}bE_)Mp02rYETrz(si-EyX!z1Y*$&^O5#Qg_!I z$o3vVm3Ul-u)cBrv>e!?e8&88xSJMinOC#stCz%u)shyF!NQfoY7eE}(1j)@x&laC z**MeaM{Cu!OGr7+<+CJR<MN7Z)qtvEs<)mDzMzkp2E#qIhR#}+wXxIQx;!Q+pBw{0 z6%AF(DGjE6&8Tp;sG3c$>0&B}-6fL?qu)*gAH{%Y`ZZ`bc6G!D#zb(*!^|jlSPRGq zQ^4VY<8nB(4ZcB@L5vE%RdKYS&hTxMpeMxwpqvGTWo!tvjGHj<t^)4UcNHRolNfZ5 z4S|mU9*!OpfdZr7yqp`_a$E2l1b#1y<78ycLoe#0UhoKs!#u<O%~51bj40s^bbUwS z02KxR2gZVy0n`9dK&4UKxeHh*(6Gip?prts78CGu1#N8<l-1w%_E2KsVS7{U^1ql3 z(rRTwdtGvA6nPGCxSw}Vb_fcy9Ekpo+Fe{|Vx-R1Xg9Z1$xd!`eg&zD!}=@9z;@z< z1jV+kfm*^!SqD&9QUFEC1Vw=fI87|Fjy5rudI20Jo;U*#H3EmBSP?w1WuAii=Y*j1 zzJa+2!?)+xyWrA1{(-xMd<*d2^tURx@8!&%b)V*)SUg~j?>*u|w*7wZ!MvV~iO<;} z$n+m6XdFmC>h_$HZzjJpclKI<;}^5+E-PK9rE^s0n2AmiBRK1wmVndGdG`e0tz9=Q z4X<KTnS2S~Ga(c&U`U)c=3AUWGCcm7k?NV^!dsqV%uRclA|GqauC{B9qZaa1xd;<M zu7wdjM{6EqM%X;dkRdvm#Z}u3PMS`=@B}0lxG<AFqzX=%6$TC{JO^LJJ|;;$(+diw z9a@EiqBC>W)1#NPNLA9=KA{maqCAga1#!pw3V~Dpb{-zO$T~R~U#Co%%1!uqF#(<7 z9tY03{8CEo;PDUGr@<B>BpsuqWij(Bco%y%AN`Dc`UmELL_;<wxwWCKP@Kgn)DlPg zk>#uaA$G<12yvJ?H<C)LSsZNXDX$*OG-NWM(aiRlm7Li&dK*L?)vyOz<Vcs&T3Ih= z7A<DC43I=!wnj2_x}};;1SYRxsJywanK*e-*)~n+Vbu<I@+lpY`s~stq$rXh&7jo` z6toRZWq~qg;W#auO6_UV*A5Mh61a&%UN?2La52w;v}fAMWdh>ROe3?RV7g{?xCxa0 z-_3(5Y_hE{y4G}#6`kLRj6S@qS!8iO8Wt*jMqr@UCv`|Ehaj@`b?;`G%4ovy-E+kP zj-Smml@8RGS7^%BrRq9m$6^NxQ}d%}rE6@qV~9xXE4G%7jJLF<4bOF;g>z1{LYX5F z3(1XhO$Z5ytVu{zt!Z2w9w67|4-ZWA5~;+2n(D6cI`Icmc*pZ&*;B)eA$l>YS2R}5 z*NoOuI-105r)jqU;V)MgSj*Z=xZPv*7<y=eaEwguCU&`7jeT>Sg3;2kk<o!hQ;iQP zGtumbhA_`)8BQIZYIMw!A$P&o^KcE96-B3dYJd<7j9I7sRMntqs?&n()F}wV;rhE7 zAu>Ta<(jd#beQIcRZECY3nA08nn&whVblYia#7Z(BM{6x59y?MB-(;Rt{!V#o~I6R zRI|2Az+g%gp^>@a+(9o3DTpF-bElcoF4fm7mIs~y1juGjyV$Ot6`>LWi;+UAkT0*8 z$;<_-w}<YeO$Gb=J?!wX96|`ust`?dx@(N=A>UxPwa@kKkO1H5gF%xMazeSG>JfNj z_}IGO2EzUx=4*wx6u^+NLX{1HNoS!y0!8G%L8T8}%+geZ_&#cv-e>Y!LOfeYraU4x zEl*p;3Zz~(L#%L>+$2<CD>CGWn{^u%S7GWanAL|e->Ir-JK36>-P8PKb4OD_9{V5k z^XW_dt<@)wP9<j+A=LPlHv8;R3GI+Dd2<IR@r>vyL=EWBfqS{Rf%%SghCy-<;~35j z1~dfp22YWUAUzkPdVqWz$Op`>D+KfbUUaM*Qk6j-6DUjZ?eOwgf6F+TKGxW7dpYf& zi)WS-I}^}XuZVhTi$_xnGh6Zi#WtNvpG|5jKhXB&X2gA?MSj)N2Y8ym0vAieE%pQx zz+)x>JiSUFb!PZtSOHbA^<2INJY#y#K;o%b6@I7N1*QZ$Fu5^~O+K+2K%D_lyP(E> z>>Lo9IJb9D0MMEt*zr4Pi4Icxa_;C-wmWSh**%xuBdtSqgH_Do9&Y1u-uo3OLQH37 z#@9-+3+R;1IWn-&Uj;3gy&P?_wH9uE`Lef9;OfenTv5qe6|7lHhZxi=RHly58sL^! z0|KB7wH5V%OO(Bt_N9=z2x?B=1g`DWRFS&}2Gyczk#L#nrj9m^lt>86N;#u?r46co z2fFH&%pN0EBPKZ{eU`B*VO^oDQ&#>=#fpa4Vwr9pwGe@uoiq+wYIE9yykW~g4eW3$ zakZs*AVMAyC>Toayt1J)FyA^34uF}|JW6nU!X)4|S%C~*esyYeldnA&9>Xxy$PZu3 zgv9HTRF#5A)@&mszoB=T(%n19>}$`f<z~Y};hAJ+T{ojy0S2zwh9F_ERzI04C^pyH zG9U<wOQ^*0h~eY_Wr9g+NvrJ4EM=#gThcj1MKg(!H&e%=VaSpzE-zO%=g>wf^!Wwj zWlU1<q@7$n`V4opvr9%UoG#|4gB(IGOYdmzB(u_MnWdv7gj7lD=Fx_}aYkk5>6V_h z;fCJ+HbD(=>mx(`b^QfJ)4jwY5GTJL<|>GSmn$(}g>Bs}wOurQxxR8Nf4-YiI#6BA z?CQ&7*c-|r>t#_gi8(S-*$3Z6MbcIgp%*Ono#7%qRGCAZCZe(~g4F*HVebLmSazNX z7OT2i-EC=P^{m6%ve#P4>(t(JcC<e09oy?;k7SR%_N-@o?6GCZmRjmo=iFU67mHQQ zIf4K|5=71<01`P90FeU`h)jUUIj6fns=8ZMY_;Z8fh6!A-n;j{d;j}~@BjV@bU>$C zhc_?jr|FR~1R{$eCb0J~u>~UzAjo41BEC&uut)Fiu8@y5JR~uPx;QTTvt0q3D&)^4 zCo}V~kDK16+}6nXib?Jv!3q0W5r-%HHiQhi<{JG24_+h@3P>#Ioq@!1;T5Ao6O-cl z#P1Do=Ye*$TRT(jJn@1|r`ofSF9O_!P$L~YTj<mY{V$w@Bd~Z*Z9>19Q^o3HZ?NX? z>JG~yL-9b8jnrJGloC9=MYYwHP87TXe-Hf^y&+VJ#5ER3tg?CaFeUQgNIBT&2tz%C z3HdUvW?Gf>p>PouWyhIBpyqFAn<#%*TMD)tx<F7>O(~O+QlxD1YHgW6Gez?eSv64i z$Ca=jmAuJNCKWHm)yZf9CP7-6h?GKgofX;3)=n^)JSo`6nSe?#1dD;D+mMMzi;oS< zxmF3npXD>3`}*le+F*D-F(6m~9k|oTg3jti<;*8@>N6YNV-or^$G~CG25iyUP7yT7 z=Nc^_Yy|&EHw=jFa}9qCbov2b5mfnT0q7v1%nB&vpNgw<rc}iVbvZyF6IomjBt$-| zBN&_vKu;3j^K%Y{1MGok5Dok=dSpogcBz9L5oqY+lO4(;fies9Ll4(_pELOj@F)B) zLT!dKJrI=@OT_{*7S4iJJ*QQ$HXNjcsk91~!};peCJpL50Qwv9tpMSGwjvL&1iJl~ zx@f})A?bcuLvv9JtV?i(z9|9X_iVe@=_jVbUjQQqWxQnTJ-#bme8)Ro5F}UU_WqmX zs#0+fwDy4WOXImW;gP;6{jm*zdQ-0yt#afOH8WpjeJ_H7Z?|qJwEVW08@eix7!4d( zSG*k$Gf!Z*e!ROq^oPe2%TA2Yh*iaLSkr_>y_Q>-7MH=YPs;_<B%qLAp2aT21dIZY zqkGw{7tP{wq$TqX4f^p%3F7h%p49%jbYcw51r<nu0#U4;!FpfXekCeg@nvg^I+&j% zu6+g@!Oz%9T5Wh)V_o#Tzq9*vm9!Pznvi$V@3NCJ$?Cq<rHG<7krE~-EpxMwPRE|& z=%>6Ker(=xylF6u6AxYwJw7axZ{A*<`EYe^Mg30b-WGQMZ}~lR8?@NFZ`sCh=)o#N zWB)cDdgqex!iC-0uM*#iqT_!Y`3HmU<^7>MnYZ-Ily}DN@FwrE=B{TxJ1h?B;o@p@ zrm?i@XR)x2n+t9-ySM_JNs)ED8CONsNi#sDuMwq}w)P243eLDrR%-V4HXxDkKi*m& z+2R<N>Wemr4vN;1HY#4)++XwIviLMHy^5O4qAn^*hD16Qk(eTHO1UdmbTq0W<!7JP z@_pDf>m~rxC9|~o<~r3v^CI^m%J48dLK<wEix~`F<+woh%^7jiOpcVTWMqG`3SJnt z|J~hNgWAm%%k|O~{DS8%D3E{msyBHZ8)tmrdlmG_!MV$_?~@OHxa_$8Rm#6bkpDGw zlRES=(fU2{;KAI+Wy59C$Tha>dz{Y<%Kz=YPutr<6guf(bDU2^OSEIfofrq06e8;s z|5^oAF)pS;u(T7N-U&~+nd^bIgUu=F!8NzEhyLR<d4(Y{uc|hVz+6t>V2&`Sr<XkV z<I%%uKXFrxYTH9iq!}3@t&oh<WDQZu)GQw?4{<it3x5#BkYr>ZRR=qH{$)Rl!rGs_ z9fXLXh%!4xH!)yXmWX7wDK#!kY|bCdnRq6ac_H@LWchVz)gX`Kl#$ItQGL(6ueH%3 zPh)FnPdq}X(jLGL`<ytrYgDa;O&FK^t202*nPnr9gF+KYR^kSp+OiwwCq}+2QY{C6 z%DBuQcM7QCtrqCBK(|x!mO`oK5tw(aLa_;1THSo3RBaTFTKS`9B3CXn^L634FMiwx zn#SiU5X-1Gim_r7fW0qd4q~<NaT>mLQb?8yN5DgI1PXdRkl@l2*#%!45G2SSOGMIz zc>WJS&xYLAvIK0{!deR&(Dgx34W)gB@NvElLK5K=Ww1h1!LqM}{E14v)IKSGIxZFj zq(bQ}8U$!giG_h`7W@Nw9c)Txo5p|@Jyitfb_x(-AO&G7tz^I{knA2knt4=F0>l?c zUI5yhuhzkn32#7V7a(~!{N$w{6aS#DjsxcOS!gi-fTOcbZo#*A2ZwgAgMR@yH0#)P z&vgKaq2MY16*!NNJrKVg2*lvexCS6E1MVb{dpKi2k~a|OnttNW?xGhGA71IsjLN5m zbn6aWbY(U3fY?TY+4qMi%dg)t&ZVgk+nQZ!ymfi4FpK|617*L*YrS@rm>Zit9-n{j zZD2rpVsN_XuZm2TyOpgMtEiYZ9Pp*!-ABDSZ6ycv`@KRI=+=>0%M=z63>ttK>fKBh zRZhAadLUuRmr@;W(Aa}5vX*Q*K4~cxM8a=u-uaH{Bhxf%jCE`O&eo6bAKh7Qq4Z0G zZ_M+i$3%lyl@J}k5zxE4mp5M-|9S8gMPFlF*u9FOla}B0;HjsEsfYeLxi-U;>WB8p z_{gFJKg;J(0zA~YES%&Buwu*PJ?vBm5y!a0GeOb{Xg+kDZhX-`H?O2BMYaWlYut2w zkDOj3*p|lGkF~UizE+%a5e9E3q?dju9lr39`J;`%=0AaT_9FXj3V&-+Df}0RZ#;v+ zqYvyCP48`dC4+LDYlN$|EBklut1s8YAJ$F{DzsIsF%no}iE)t0;vtb$rY1pQ4TMWf zlreR}wv6sr0^g=iU?<b=ZIw|%a8GPB5TL}+x`YGb(=slj7UtEw@bcEt#;0wif!g=) zA?(<Vr&`DJZwK<=7mqt~hcU>sOgEvrRxw}Q21$SlPorcbiK33LfJtEnw>+S@z@wk+ zc0H$`KalxGCntCIG|CEI5TEC|Huny-H=wE%F}~K7ElEv!o}W-d9^8(f?k8;5k#TZy zbBydA#@cq&e9xQ=KfMh|-z<LJ$`0}rUe_m6fF^?M;)W>=D=P%{<ta}mG_v~TetDNZ zZ#Dd{wR<Y?bNyWZ6QJn>y#fBA->O1<36PrbzS>eqnneOY<>8Y`r3IYUkSh=TI6%2r zZ#{O`zQUn|5jkg1Tc9xbKpuR3=X2RorV1F&Q>_3qvet>Br=WmFw<i5b%VAJ@*VjT7 zOLJo9vMY7ijXJZoAOPf+f7r-5P9VsS<k-zo)t)<8)YpnG=Q)%!`aj=z@1fuCt-c#r z{D8BxcUOJ;qVnBY>dWAD%8k8YAilD9^KCCWxq9cV1;Ib;jx5g8-+b>W-Pp<--Bb4G zW5TAd)&1V;JFkzbCwVux-@#cvI!<4i0N>!1JGWP9-hWtwt>wozKl;#gv-(EhgH`<E zQ^bps*M8;&f4{kYf8Q`6=NxQ=+0)jIy!8QWw%aGoC8DZLm;;`=EisqlCm`;9jYhP6 z&dPe{wa@Rd1)W2RG0D$5;Vf#mK;k~Gz&+8!0T8z}$cOoy7bF(L8vkiWAJ!^);<^wH zYr@HZJ2-os4S}RC)w1Xe#I6R4jlPoueBB^vYmk&bkb!jgfv~%Zeh$)RO5H>VME^0U z*8|x$<mo&zpkc>omAaKP<<3ui0l2vW|9;BRbLC3qw4nitw(ZAVe7OUOhyC1xPTz}t zwh2THunB<$00u2;RgLiWJh*O18n8eA7XZJ2Y7L)*JO;fxYk_x$^5jF^-jxE%NAwHu zRZ!O3=r9SVqE^ff{_j3dDR_RshmZWAll`J>r`>BBn{Ya6PNv{II0L#1>|$4_otHIB zI}H^6a15BT;DD}QR^wbN?1RgEJPe;Pc)&pt{EnFFq6@{A4Wk#O_5yMayUnDghINEp zxH63pq3pWmCO`#nFF157y0@irpE|H?XY4OCN^Bt3)U8ji&8Amp<c<}&XOjMA4Aowd z4$TY0>qet{c^e$HV|d4eQHXPy+)`?iNngJdoCkg3KQ*9Q_0(KeI)eepLLA-ItT|qD z=;jhA@{)N>%frNW7p7LkkgIS#@_qFbKsEwP)YUmVcO|=byiG4`a0oZcKdWc|pPRlo zik)Cku@~23C_;2FgjD18b@M`xN^7CxX;cs{?CoqDQ7^oVTSg5+lxk;2i4?Y$#GF-v zGnzqE@@S^{%H&LQld+QpWYafR%44DB)tT*W)e`77Jo6roTv{q&1niq6-ZHZB%X8pS z`SYsgwv;L10YVOp61j!rnpRNI;cW|Q%^xp?m~kS(vS5W{l(FfVOz2h`1uxp=JU2VY z$1@+Sa~TlK`qU=^6!!=8ut5TzGKmRrlWhSf4&Zs1MCXu^>VTL?Z@(CQa#6xlb?qJf zSih*WU*CQJY}pScSo)jpS%G__C%p^%{@e~{dXl*h0md$Vc$KmlSv^=9=HTa+sM^hV zpI}MA+}5fXwqZI)K%}XK)iE&h7d4B?)%`^~R|$OkNH|9lZnv>ysaSz$g_Z>7=@TqG z$Zy$4hsjEb60@`d@RF%n(##YeZ&(=QqvmvEy}G_`pnBFl8(<S~2}JGgcmf@*qJ2qr z9T!-$Eb;=gLMzq=?1`V6)i2z+b(^$Q*ohs}y=X_YbW_mr3hFv`7UkZU9Bl7;Gdr|m zisH+26?Zn#^XS&>tC?MCmlhSvx>iZY%mg^sDarC2Y;HLeJMQFKK-TreSfmOyDl(y3 zxfcdV^{*9trQ>*^4&VutJ<e1;)m$MNtQ8{3QoR%eSl=I3D}cW(muGyfHc)$1P#oYz zg+vjY27z?74qG7-Q?rm)PzuD>;^m`O;iw)f`2i&IY%7vX*K5tZ7xu^hD-y0IqNQ9e z0kv3q1%N1ILp{jkXoB)qZlQAC3Hl6VOo61!gu~0#4A8&^ItiQViNSf1!QPnuU@SFt zefxe4bMu1y>ic`|PXWgEM?X?A-x(FYI<Yv!y}|qM&dWR)oO}N^)f4>CeMkO%Y3QwY zwO6KVrv^s_q7|4I&ZGb$T<AkHPCON~j|Tj}mv;sNhCg{MSLfee!ri+rU%mVmZY({= z80Ef(alHo_1lc#2rm^qv#do(BZpg1t@1lF$-t*|j%4N~D7o}Hi#2+1ee?6r6d*i7) zYeBD<f3lzVmC+Z(6AFhZxgpcgn6WLM)}=hL<DDW1)m8;{(lMPU`TkZRfHB6T$j0bC zkHmSQh|V}rdI;Mc?YdjAo;!61VB|7ZV86&Fp`Mb(0WjrA5PFnUD2;|TWVakau)vMZ z`Hzm<01gb+KebZ)@J<X0)syoG7G^FB`gafgO(IuKc2k{7ti9vv_H75T17j?qOg$E? zCE#s7+lKOA&0+#%M)_tsSE@n+Ho&W4hBcr>SiF%gCCYIokXR|Gz=QjXCu<k>=MEvY z2ekJL31I6eSKw)38#-4$DJA|0C2}y|y2S))#o;cs4wOMFp;WVz&J<~&ZpDjTfOuD8 z4S~Sj$*0Qkw#a0y)=p6U1kf-aKSE$>1y;fSW(1C-FLW!_z8VKs(>W0OK!E;quTp~8 zaP%CQ7BFb2`xz1Qk0%(Sbyx^q(J9LuOE;%Dp3&TANLR%OjT3Rxivb+TtX;!4AhV0i zmCXtT_m;pR9DBobQ%l9UDD!uh0V#{6WHEfj9iM1f{gG=<thzk~?2unQCZp+ba&(ab ze6FuXc}vH)U5aHuxOE=PjL-bBM>-L|Juh?57)5xjV;vH0?qV0+s|?N1g6TaU>I$YU zV+#kEMb553=vq<+=VY@a#xZe2zdnKMJ{B1MHOB`#h`5T(w;`syH?rgSsL7k@Z^BcC zfB*rT$<y+C+o~hp)u#-8*$nKZPjRIPD34)Rf4GOk<7gHQfSWueUY?SwZCG%;{FgN+ zn(xleD4bZp=?&o^pOq6_i(yE^9K{|U1gcWz!Yqys3+EDx@E{iAYsakQ7SX-xh745w ziX4OXcWR2e2RjEuBo~SgU|_s>v=Sh*ZtVaACa%F7IU(*y{{^DZjX5tt_s84nk%MLb zrgLR;GrP4l%onIgo;B<^Z%@7_2gR@`y(Qg)r&1=9c^uL%I$WU$BkL+sX^!B>fs}bT zF&?hGoqq};;dOLZb2WrE=aafWk==Sr3|_w1U*h8xgL~VmNgWqpu@^lY{=1W39ero- z<;y;V=C+V~c-Q|Sn>02PUR+HNvXy^%^qJAQkXhYwFkwa=j;U!a>$;sXw<+Q1HsJDV zIxR(rtjP^3Hi*7Fb|b#18$RAhfv3HNkJDP@6)%`HM-13hr`=mr#eQ^Q!m{F7;A(Yh z?JhjHARW;noG@Mt<)CKOlk)~DLBG8Ls9utvXZmB_?7}W9%pxr?_7`SCn=*}=8zLRy z)S3gC3lgD&(+kAmP5&fDt(FRcOMLPiQO2g8(6A<MgbsOjpRSwV8@mZnZFD7k+tn@7 z#}2N)eE%N6N_*q0f4_A3=z`#_cV7qXf&8Wm%U)6aDw}E;nFkAhk&T=WZfZVEyl%OQ ze`O?a2j{o~7kylphCyipKRt-3YNOA@)95yUj0fO({WpDoEwtj{Vc-LVZNDE3`da^E zn1cOZFaQ8B=>j_r)QRaqz7RwVP#4M){pzEmt^WH~tJ#7r3%&$z`k$Xe&AvMMe|G8} z7gh-7*`t#oxf~9{B0!CfmDlVN;fcWgn$-@R4UK^SBb@lDGy!pa@a`?N^xX*W(xi^* zS(#7~$CyK6&|!y)FRiYR%oP7S>+b+#uz^Q-_LAhQrpp{Wo(2No)y>;iF9^qb_bz{6 zx(FevfAzoaJ~e6Xfp=pd2Q^}!0xvbH2S0ffaMP?LgCc=)&rztRQ}#xq(rx7=4lvVD zwcLUVu$g9`HKPQ%e?TVmRTRuY>0Xe*Zg(mgE9ZNXt1~F+E_jnr5AD=V3t(MzVLNPt z`F#dz90)$Ss|5j{b<o@dr|07j5B5sC103jX8GK<tAA&tb4_PS#d=RE*i+m{IJy5rT z{?-$F`uZDGfP(}`0qjYR{+`t1gJByqKNkHwo0mol0OXNp?3vSBPY=COH^wE>v=v3H zU`Pz_RUF-rr8at)tfzD4vM<%?hpM~INrO8Su%omg3X<1UO+c|E=cEe;#C$(xDFj{J zs3wPy^ub9rRX);p@&^BK$ce1cme0`kJDN*};YkCa4gqZwI@-tj!;Sw*?_bG=vR!cf zWc4BB@@Ix}aX%1x2O*cE9W(hXHFv^$&?_p2d(L9fl6JzEpDh`(MWYXe)*u_`<7EVT zR__Wv96s=(z(M!eu{~M}LRdcbnk>e(4CNw+K-2x?07Iu6JCh34Dm{neh@jI_;-t=V z-*nxC^E1f!{iS8gEtp^i`ttTYzkSe+-JSu;mWkcPWrm6~;|5bkFw2~?Z_re8G;9w^ zX15(g_5Ee#vc`Mav0<lBWMi{N+if?Avk%xlGY@vf<{h1KRwbeSAKTI4bsJ7AhIsuv zPR7{OUiC~bf^+DW0=Fbx#NWrLxxDci=ayhnIYZ{H8gB=o*F^%BJ&m<d*7=Y1`qz7F zZ%1z4dQWzDhH?Ma>TAiDNRS(NZ7g<G@}lY5+a4(R1l@iNuK>EdmpCX;9FEB70W35i zaEs{TjY*fXD|#&5C%Y#su5cjX)WRS$5Myj_@n{xxB;y+-KON&D*in5ku|T#uxJK$$ zX0C&*I}**blwl!{^&0ahi+hJ0qCm$H-qdbV4NDc;2W9Y^_0%)!T_bPmPcyx@hnt(% zz#bqRk(MpHQf%;jUKVv{8rR6qH805^pfN-W@l0}ReM-Zzbk`vG1fECi7{|t@Z|`#+ z?{~M2xqRo~+RU(O=&sdvt4sZ19Ca#h&s?xyH~$kp@~GcWVr<-4vcRoeD{K=Wo+(P% z>3%XnB-e_jM7m&up$Ke1bRISu{eBm}r7}#+0!V$6A&sd5OZ_r=@@2B_s7WVB$1sqZ z70|{o^PYXLRgFEN7-R+f?vcT*rx0Xv?U6#SokR;Q)a27nXj-f1=_R9Fb+A9tLw}$= zmWHX6Cc!7(hRQFzmW}F@M^$c%R%f*yiRZ`}(t$CQT!)MX*s^hyy^tnCm@z)y@8-s^ z{^pg927WR`^Vf%MgwZ^TPfa`5N>gUWeCRX%wgL|m8C3tXO<@~IW{n=?1<FZKUBOQ` zaNO5vA9*xDMa73arx%G8a;{qfIR8vf^2wQ>G5X<ZppQcS3wS8t2VkSyDM<Hhf<I%R z15m^>nKN~ealJ;*_{lZk#CEw`g-GmAeSz-;B2wt596bk>2Ktf7$3-P<I^DKa1H}an z6{u%6OI&G~Hv_#I$WWFWygQ8^_<Eqk+qpW@1HNZqCkZWc?Lm_dd1v6PGms;Aw##Zf z**tJORX*?4Z{ANo3J}Q8H19pt4f&{`<<bB?Q3~iacFC?`2KYDhnd2m~yqnQTfzaZ| zVXL5Ql{f^ud+z8?YJv<Z3zwId>QdsGL)Nw%%1T=1KJQSFy)Cg+bbD<z`zS7ewX`{> zhqSFa>I#*4uE)-Zv(gDJ1Y!o}m%pCf_T>b8_uGJcRVnjQdNocSZ$KkBN<mvMtQw?g zY4Yfkhw_;R+e7bJFb6B^drSAh5Yye(;Pz-_1((NMx6z4F<eRZEcC@H@=WtESTCi?0 zhxn_RH40S&1k(#V;&^O+QnSqU&y4BD7($#gI={0X!V6hq(Vz$`odextO^#U<Zq<<v zo5q_7a_W|a$$MBuh_d^2vIVz0N7@|&y}^7-HBOUl*cKWncb7R&-locTrrg*i;?HXN zg#Z?y6+0vBJPKiMafnJ5LBindVLO-Bx+pmhcY=JCv19B$l~AF$Fh|R*r6mD;WFsgD zTj)M1=)SJJ&$m;}9QpxedW#Xj@>w$8OnNqP5Bi7GW4*5eyhe*lV{98D!n&Q#mba3i zk?;Q|$-XKOi}~|4l)&9&a`oHuW{4=JSL|#tk)~j7w3k<HCxyT#qYl%u%2@X{(RsIz zr^5G5CUc~ug6*PA@LB-^6KJAm(f*pm?>(ONw_#!*m?3Q6LVVjP6$3<jL*R^hGftQm zg&pbsj<9SCd%Q_e5vv1VAU~lHf{CaFJ0Rz19HuN;tC6n_$a=_jLzcFoh#+DRG%VuS z;fX(}Qu9r&14~K8tLiIe_crYRCYl)yLJ+XSl_%NutS7`c2}k@}K#?E&%{1G25(vhi z=3A8~(HzA>?oDN%mp|zZ#P|7mdn+sOTBDzK8r<RCyJOCzhAg2)j!4mc-6(bIglva` zJ}k!v4Yn-(zDAU1ylhbN;_@cY$bCceLqk9>AAFyD#b^fA@xnV@Gvv4FXt^Qm%xxaz zP}JoN@V-1D7{Dagw2uKq=JJ9LtOvnVD|LUOc|jv;-%S=H7iM0aSc=}Bp=`~_JM5Ri z{+W5@%H^%Kan2xZd133yf$o*v%VZk3>!xRspMqN;?A(cf)?*#~k@Md0Md@84W{A6T z?}Gfo`;s>>eS_|C>GXt0`}e!o=f{V}ltX(Hvlp(ct&d1i<o$bq0^Ey!xVAA#ze<`P zS$=c-#)|^VKO_+Py7DF25AoPlzVT)REYW4$DBx*ta_>?wOVpX2A^t0Chi`*I^m+G# zpnDE8WzmJTexr)LbKum6krfZS*S<e5sgQTevO{AO!w9oE2jcM_`a0Sh=eTTEZ=Ipk zqt-rZ2;?DoUP&kf+3F)z*1GAD6hHrNkmjcZv2#kzdZPPJbz%NN#O67eO{Fks{pB1e z{%0FWFq6*|&NYhg4?R^YRP(S5&cp9Qp>HXD?r{FE?TLWc0siP3=n3F7&kv8x<?i4* zNPCN31fv?f<FF@v!FFTb05s!wpH&SW%KJ`<e!ax=_Q?yx8vOCBdHf=GNDTH1m?xii zFR%^vez1^Vo=&reLKFAW2y?%BVf>#(2(jLFN?%iQhh4HE1?s-O+iY?M{e!<Dzq7x^ zxN<$eJT?c$k?y^Q{@!u}brc`9rrx=oUmpV&>nHAIgDn>P|By!Z2<G3fyWJ<^dQ^QI zGE93ApJ>%T%_Zre-}`~t{I637{8x4_7!aCRL^oIO!0P0_Vj~ZgzB9^u?G6cbUIdry z_G{eH-%#9>PEK##p<b}O4?VSCK^I-ujiBCMN8|Jxtbd!_Kh+*EA|evlK)qH#>}U8u z37OIc`ffZ+3rvrQ77jHfu*u{g6B{;Cvk$(oTLG&>lmjGEQNlTb>Wv*o7r9)hY=MhE zQZu00H(a@ktIBsT;sznnB=F|shewxTIxrUyeGLtdnDBSOvB7<Lk@NngmEq@<_hd6m z!uy(g7e9iKob?J~-X8=LLl4bX-ZkG^IQ&er|B3i7t&}E=+*lE+#d^ueK|4{0Xdtq< zV}{0wJ^<1KFl(lk)qAp(Ev8*?$ODECjTDN<>WRE1Kk1BW{rXP9)(z@YWKPKfH?*f5 z5S;v#jJcW6=_gGn=jdhjmSgqf=t|RC&mA<-w@^}7N@}9WH3N^MW*mwfq$KP412C1^ z#%S{p1{hIxHrPJo2D3soxxJkQKA%)A)CwGmHpN&=*<R5DX!X;9dalq!1y4C~k}ZHi z{qHltpapr<2uh&?yrJRF_Iyy;<mr$#pNeOS&%w$mmFvY8=h8aNZ7A`Mg5VT>wh8Es zdZAZ#1FPF(^UVXtE>xx;Xf`pcR_eM06<7E1M2>_IUT!19f-f>7$6!H)t=__qVI1mV z-z`>rX&%J06`+s|#;#^5vdO}g@0q7pCl^fkDbqa)j>J<u0B`CBXL{NXS_w8gXEY41 zYp7!i_BL@fvgjwU7I~DF7Wy_inPaT25OwUO1JJQ|$Kp&pd$r7a07^EKA|9WEd5Px` z@Y9BcsTNYqO4gYo9ny1e3pVMjHPHk{MN*9}9z!=D%_$3n?#}vLP#5d59`;@07xaT` zllbr&;5h|g(%g`egVZ&{Xcz5l_t-0>&Cn{)GA(#$N(O!8;Ky633+x#1tq!g+EtFmL zoPIfa-${sW+Sqc@4XSS<KPNR5CnS(OMAPg*69Xfn*`Af9XN-~#Z~?-KW$*|;xn_wB zdeFCfikTIvkG`?b)S@mXvM40Zh@=6+^){k<7$l(*uEIBO#8z1M1RZ3DN^L7cRaAeU z@Ro)mlc;1O_J(?&;rz6RfZ98%fDg8=u)+TCffY932D;g^rkwz&vpLwoPf1<qyEKJZ zyrkp=hXMbE<6c*^mewrw-F7Q77L}_=NP(kB7~OYiH-OhhV?AIbQG-O3F_yGDHtvGN zw3(DkHGu=W*UAX<i=q(Iy#~);s&gMeAXv9~EGL+Z?n4(P22n3729uG6DJ~;0`}_wa zCNQNjbrib@OU<-G)R4A34ATbj1jX@^Ba71s3Iki3+0AoA0HoDB0y{8czfAFvVyZZO z-(@u_z3zQjupd8N==*h-XbUaea|5EJ^{*@F2v)c41~@f|7x(N|eLJ%6Ywo*1&AXJ7 z$4(6d?D-DYAvznu)zkpx9FQjfsPSmpz=ba!3OA7Ihk)7p4f(w{^KaiCR1MzUM7<xu z9;tX!cKgPM3D)c8Tk|(^vlmZYSPiyKPxTXJ0yc;nyv<EtRsAnU$a@`HdWn2PdkZ_& zk49dbD@8`%zz->|2_O6$<r3$z@YaiG8r~<TYv0BKX6!mt3O-Xmgw5+*rw*mY;Zwjg z^%{*fc+5X(_zSL~nE;74%A>kbdKWo2C~it*<N>I!C%5kkFspQ?i)NZzRId%vm5Xy{ zASv|J$~f1d&Qkyo1$Gu}D-5WMFkmSq(YX?`<p8hBI`H)a7=AE|RJXy&0(6wno(N|L zuwUmYYqNZK*KYJ}yQiG)T?v#X1QJWAE%3>DJT+E5^pbWQ!U@}cFH7lrPw-LR#4Uq) z!@p}d_Ggr0Q(R609Ru{~G}{fHT#AelNeN2{aq5D?9Tu>PUM7gtmOxVxfQg>v-8DwM zdvzzv6A5I@s*=bFWy0xcA4>wf{j}|psdX5Ul=Kw$!rGq!6geZ*ht?_TIPi1Rx0;<0 zJ85K?Ro5u@D+-u^c@LzzYMm4o+`-EBbA29lOQtw_^VqfzkqfyLGMyiGi~89_;vRaL zwu53t&IXP>?U`~eM#vh7L9h?jNos+0&_z^F)4A)85pWPvra^2lMtHQPN%7*8bRx#s z9cM8p2TMJq67aZVC#c6T;TS3^J~p3F3wKQ`{P^8NIhST(t*|G+qWlu`hMk~b%r1*& zw<)CkKV!K!qMF-BTXfkvJ&YEu;BdsV$3?TYH95<=y{kaEjp;cSR>OqMgX~07Jr@~V z@R{$MW_%-au<e>IXFl#%A5rxC?J`)^6@VuEkAIdc)o)ZQP^RU7aPDV84j0UKkEYlw z^YfAU$W&lCKvFVc2`gvWw8?|XE<wsNQSllWEXnl!HrjNoy9iU8-igh?LXgI#n}{SC z43?6&%>YDfZ&N)(6NYb!Fk#)sq|tFb%$*l<sYd2XXg&hnqfnEgm$MIOzBPz$DF1AC z`@RHo(}3SR8J~oN-#N!TZ3#1-n+#x03=@|phZLxZyA-yZ%+LX~W<<JMy25wOJy0)u z?(oYfhPmQ>Y_QI?fk_G67N7h2=|}qB^CuQz7yX4~L+umF^#w~)5>=#4J0(btV(ex4 ztc<a981<b*Jd3j+Ecx;ZI!rm!?&MxLxfgLC_yXRO$l(M;y_>t5JZuv$L>Xd#)WNSf z7$>{Tq+Xfabwp!fR??lfM_^)mh}xtAg?A&aoab2nXBoOEDv-O}uJ$IZxejZ~ViTzh zHB)mpAt@=upr{=B%*Vc{#|J)13;QsL9Mbr%<Y+%?7lT)3R|?cKpSRYJU{_*B69AfL zC-tBio`vi|)#sl5m~{Y!L$pLS(W~zJ<dM@0Ukz<pV5bWM^86VUY~Y$u75V~Na2qzg zwUblmzy=V&WwKxgG}0iB+N~%An*o77&}}%u!l-AV$SDxwLLqLDY^{v<lO}=OzPcK` zq9w-}+z*KgwPtg_y-fz|?#gU7wW&uEl3wH|`hX4-UHgG&Jo6QLWO>jKR)%em22>=; zKGGOZLI0p3E-DoqGXX*!oy(m>y|4*|8}N6yxd?FT^QkQC!Urh;ogM>?so4gWB{XeE zLux_7ZTmP*dAxBqFCGqRFPZ-F;G$-I<KpaX&iEYcD7H6thIej}ubu47#D@oYOAsyl z;L`l~S1v4Lu<8e|-lvbSZ}0ts>*_16Q;qBU2sU{ky!?<zO0u^jS68E^)v#mPN>y_% z`h|w{!2vA~sCA7bqgN9{?};45Di6Pov!Tw1oaqH&l3-nd<(bne7P-|`*~yync-~A| zwE3`>qj~3!Q1NzjN0wU!DV`*`TyvXPZE!VgFv6P6{0>3oT~DKm+#&Yrm@b|YsJglW zYHA%6f*OhIcuO%h9Xh0B>5N+Bv8QuE*uAKHPy0R^+{LWk(OzfVyoHCDH0{m1+qcM< zgY4<W58frsAT;9q=NqHX-&Rw`s(-ckmxm*aJKLAh`!5o@r^5Cy0tynEPY}VEmC}ux zHhi;$#1@@b;g8t_PR15xXM7Tf*=JO;HMV*>PV|qAyQW-&HY|93PNp2wdG4G7Q0Gzn zntFpIL>oaC1>2g4PcG#*XpENO9w2{j;*K7`4BEQKW${<k8*wauQwo|_>34R<Ez@b# z+8Q4tkI&L}RhuvZ=4<Y82v*AF+AT&5m=f>LYewRbg7=fnUUh<0F~x}-9qw9Ox|k}t z@UJ_lw~O^>2?ivhx$MU6y#u&}q3Y4)pQmV2^a`x+Mq<m7Qy^7fr}fzp@Jv`}ymbwM zq`yBZoY>}5IXtdeJu<Av=p~#hsd-8YwZyjzZ>SRY`4sI6F)^K*ioh(xt7p@5toae; zIwTHYA)!mM;M!$U_zd)5k4ocH_EfI<oB9RI19@^CvM0n77Os}!*u;%)u1N^sbpP#< z`-f293~`1Q!3Ahz$#E?dp1gTLhNN%jI#q?;r&w95#Lxs(F8X)?vVc<Huxg3ZDlV8p z&JXIQcq5Uj*bYzZ_HO2&23T~fFYij{D?yZks<SOys5etfnd-?<(O8Hzj~j8w$MwZq z@s!n9bU+b-lVmN?ws@PSST$9DV6ImTxl+Dva}^KEekj-g22IBv&J<IXRK$LC0$kxJ z_sdql7kqChpGxIB=4iHGGqPp(`K*BU`J&T<g5h*ITQQ|$-A_9K5iiJ}&($-aPMmAz zYaj*&YIzV=?Q^JA&w(ZeB#sD*C?OD8y%s$E$9*1daA61GM=N;rxWf5Auh@~u{}JRq zf%CVBoP&o(tKa2SkM+wseOa`FX54bC2cUz{<*l)2;=-GJ?;E9EFuR|)`V%tvg{x{b zYreufaNZ}U=2z|aCG^W9SFXutmG}B4)EkVKwYW=nJQrcl?6%&0Mt;k2P4%tqkrz*0 z6Z`}@s8TdgE>ItD@e4Ps==%Qa-!I?$XxX{)hH8wlxv1F?TF2gnHH{b_?Y$v>u&7F3 z0BBr$OZZIfLh_32&JXY3I(7AaLQ>xW5A2t~wgL>%ZGbHPLapaXbSs@oH>MB!!9kB8 zCef*HKXLy%AChkAZcZ;Nu5j>|-{(xTx3(t)ccqK8n>z^6@aU3cQZVEl`k;&SfBE2< z_|}DW6LEg~_Nn^=4So&?Jh9xs{h6gL_xvbs*}Si_Y>WvHtW-vdMipJu+6*{>ePk{? zrGK&o<zTebDgzC63{ryA<!ZgwIcdkMK>7|dvtI3$nw4I>1UVU~7WX|<Z+n|<c)F#} zwm{56Qx!6YE|RkZ+uQmLu3}HV>ZWY3uc6Z3v{vZaTWn(3e36d0^H>XhijV(=_^3p@ zNwn@L4P232;362u?`f$4=8gi#Ro|ad<3uVUfudDP_ID<HdfwyXdDbgAhWN^{7k>DG z0qi`KMMu%(xl|$#$-8IE0;sqB#9Zs5-^(O>C&1;|Y&DwAM!VKaWZU(=rBgX>q%+N2 zxz&pSwy9Z<*J{NlZuY|9*qZ@a1euh{?0(hRiL2CgZNXPLtVEAx1=s-iE(Lg2gtts} zBv||M!uX!a0u{_%u@6Iuf(#17Khcs;XZ=Hj%B@S|(fMntp&`upd)#pzZFL><A!cRu z#SQVbG0@6JNpId6ghZ^HvvCx?^5q-v&2N8rSN`Eu^@sN|o3DjF@6vsOp%*TY5&QZp zgt76Z*Jf;{zY=g4uH6=y{(9tZ^V)v{gY6#vvhD+*sH2RC5&Hg@@4tI<=SQsV?-4C8 z{;S{r7UpMOni@i~<rT~LciE;{eP<$OmLJV?YqO5|E@K=5He40WONO;SiLW3;{jy<4 z+QhCW=*upSn4=w4fBvOGRVffwGlA10_tP<>iGZR6l4VZWd5<0c%sl&9$9f=4P(RbL zF9TZz(D^!03w@vpSc|j0lP;(*?KE)pgFo!)dMlMJ)*zk-T3jg$DKc;zl)OX>Cfes( zpI>yog{aGtCGcOYUZsJpn>O_UFa8eDzL%p%fF3&A!L-s)vwUT>KpYAJsir+n+Ey9c zS&$>=DpB(`+^MtDcS?g30^!r2+)ezjpQR__%ufgZYj9+eu-`-f2`8E$bKGmHlqNz7 zd6o@tYr*fcrS%>h;Y3`@5yQ2=M3KH_!HILKUhn>-{s`wk*Z|8of|IL~dNa{$Sb{y} ze_K`Zy<DKan8D-ZhA{A0C<}B_aeYM({+Oi9flYfh6FU_BH#gFt1Q3e*{e*Dko2pyb zw3b#zb=)#>EyH1F=X7{^z(EPT21@_@u=Hfz>c*x%4gk}+mV_s9-b3AcoNO(4e{_w| zoB_!{JMWpv&1W~|_>~#%au#7~5Oqe9{cY7)eJ-&y&mhV+mCR$tCSHoVW6tH1b-Hp1 zbl|NBg-oO`4DXQ?@RU_XCnpW?D<N}3Nyl2q9Qnq!!oV1}gG!4%#u{cq6XV+Xi0PYC zu+J(Mf-4#D<sVU8<Q@9h6tFdntJZh)#?gc6?&SyFTMO#>1}MJPr6hCBJav+J$Rl@5 z*`c(lXDC&8#XtUCry@#;dY;VZJl;7MV|W*5W8z>iq6kxGaJL);KE_9-#4vVLo|3CE zw^W$UT7GZQLUj=gGj`6wn@~}D{&*ETyXb{dr=WYSCEk}PW*s!}7n$GJrq>tXQ;CFa zrL9^v84}z9V3HT3fLz97hhk&fWPETn75?V^J%BO~3CJu?51mXX#k=AadJbh)tsF6F zbd<k|MrTbpVt4_9e=8B(`s{dcX!qe`YGrvMi`XrGim!gWBh_4^mOM1Vj+bcm65R$A zZrEvA(sf-X3AS+jpkjAc61`-r>xg8lsfIg~^?)wcJ833ku3*Ft=3dhhN0COy9?O8F zNbBs~kPbdA6ta~}vXaUc5<Q>03z`-jG(}UEdd&(I+fKgOSAwFBR@Mx+hRqkKqSNqa zJ5k9NvM%olc(=>PRZA`nvMA9=CS6A{D*%Mg^$EpIokQRSf{4dMI`J%UYpAPzi>)Ar z{pBe*qgpU$53^@VpPbT{AHeY4PHwVU>@@cbrwXq+_Y5n|I>XGfo}%uwKB3PB`H_aG z{`o>FX^3<o{?`FV`9Kr`WdrR#4`n_GuG8QFz+eYX`WS_31|k|2AEdAMPX%9cVZUm9 zc(Y^nk;mpx4eSF~>QnZgPzHC=H|q^Y4j>G`_#O$bnf2X9xn1n_s_h*3ln{Wgf$!a8 z=*OiRwYsomZ4}WiB-?(~_V<v50&v28Dg<K37{+=TP%AyJ#qI*I9oV_X7GUl`n*%uA zGu3A55EWZpfX6*uX+(%N7kVBBtO{jIQMuU=mLU!dw}iOJmiQrC2e4I^0CrLZU|lDS zp6Sa&w#UnoI*kK#?U_T*6Qrep(L26>B=wOX5BCA>KygLMjVuY1I3;5mXZ{gz*-g$0 z4HyaO)-j21n4CIz*(r>#ij;~j`hS==_VxF$8TvGIViHU}*PL@<Zku&?ekQ!O1v@cM zHyH*TFl8N9{2<=EuUrTymSGaeW-aW+8QX8K$rbam>CuFE{_sb30XfOn<3J?cp(xix zh6iC_n_O{@PV1S`-A_B=VV9ji#-u!R7z1wO+UbrI7j!H-Be=n|uqh&DahbA*Lag<r zz<dCjP@Ahy%yc)ljiLuEftaUWuVX@#Wi`m7KdoGx9of;b7<)nJ$%LmW@vJeYPnNCw zQV-892OW3WvuFa-Rd^Hfpj2EYW4776vEo2Y;~g=V@5cT1H1O4!d3$QpwIf_(O)|Z^ zG{*<`)8RsQktKykrMV?#sAPnRNEm(b(c|y{`&1*5$$_v+!9+;|u75zQI&)Zj*sn8= zF8pqv>fePFp0sTt&u$41cUUrJZq+j_X3Q@xCot*zaJ5@Rkp$0mEe2NQ3cbKOZKpCP zmIM-29m)4{ix?N%v^d3pnAx2b0(KFH$>M`cx~)ST9%SsgcL9#*#)gwfZ02*tdy7H# zW(?&f$2WNg1jBDF8+SbxwTwUaKsRfnB;HNwmqFA~e1c7uN(20#V-qB~+N`=1LcjP) z_p)eWPypL=J&#;!pn2?mwcdd;D{by|um|708tj0GDb|%91lV!Z@A>Iz`RC0<yV;X3 z8iAM`szw77S}xPd6lwr`%tOp#G12QLAd3{`)6I6XTPn92nNqEvl?>~oQHA29g%qr$ zFDF9HTBcZsuV-Kz&q6rp*BjLnSe%_S1esf)VuGew@5EsX$w5|gFWdXAQ~^+~tyVi% zfOL#z--H169{{X&6Yw#JxJ<FsZnYJf&?DYfw#UQCqIZV;tdAtFE6nkK)y?kGR$mm| z9}PWt`x^K*-}=G!)MeZHhpz8Vs9u7tzu((3Jm16<&ll7eZv-%&-2w^uK&xr}<noY} z^8Q`dcdk;@moHIqo=b#f;2{0GN#Z5xB|rrKvsH9mena?U+s%Wc9|JW`|MGFTeD#UT zul55K8IYb2Ie{Ow`H~(jUlHE^@LlOUj+cHwoRTKqnY6z4(p`i|^C)@sqEzx-+QzWy zoohe2Xy>QQ%YhSf7(JzdTmd6kust8-!3-4k0axqkBL6<9SjVykgfuJ=0zIFFh?%MY zCpcmthZ}%*8EDFaj~c~tyP1$h)P~(8(@5uf=~h0|szc67uv6?OH9#>z1a(8QfbdI~ zBJc>+iZiaL<BYxGc*^`Z$L)WE)O!TQf7;%fg5Qkf=*CJY>8sU)5ft|}yP;+`Fq}e1 zlSl1hv)l}p+<91-<p|0~IzX+65@X(OEsSdJayW({4ZRZR=Hn20wadAFdEF1KSP*0* z)o{BPhRoAv(-CwM%6pp(!?UqyXu;E&OXMML^}pwQ&61~pB1^D=SAuzG&3_UsHA3Oa z7z)9h+Lm=8x`Jx8O7r9dMF2qDe=;W<d;wD=Qz~Q%wNj~4Dd3+<p;X9~YPm|Kl*trI znOv!Yw+c9<R>)-A+&KRXugX8qW3xZq`+DeA&+Sz)19%n5?2RSI&G6_hXWF~L*_~T( z3~ub`MkE^Ay(|je!g1&xfoL+lBX}_BXO8&BrGeXrU@hES+h#B6i0q7d*uUmyP>7|K zKKzlg4oqmQIass9{Ang{PV5+ELb8ARp31)fz<Ght{71$~1;l380-IxSerReBH%Yfr z$3W@cSU+L$M~9ag!nt`1#ykh!z}YPk6?o-UDzW6g#WO~#Jlw91_hSCwk<*6)9{>43 zSn#-(<6!v4$@x`G4a3qkF+yfy$Lb?vxDM&|S_wZtqh8A_C6SjLnxmLE6Vo~dT_KR) z*$ioCvqV@MF<ff)CQUzz8apF8jCspDqx*n;0xrEBKpO-mpyQ;_Y;|(cKp2t3_Suu+ zm|SFC-q=(8iDsO_O3*R-tJFB^0-*%?h`H)v!?tiZttWAHpq;WU%5Ch%qzFtd2e!PB zLozYh%A-(+L@mJ5Kde5$pzJpHkQj;13dQ2K=!;^JNc`}hP$U+2h4nqp-g)+uFx~JN zF|@aQWLcI4Hr*TIgKcF%hFhnMlT(*B9YMTPJ2zEA@o}P``C!jIzps#56hQ?gD8l&( z@MQ9n1ouAqSb}lPuWGi&c6CdUZ4f7jeYjRc#(u&iAJPz9cvlo}*@Ie0eB3c^o3%og z=>B9A!@%G|?92`mYK<^f2)wZHaBkcW@@x4(thS4fMBAgpBrT4IVB7)KisSZBaBS92 zrzY3+CLMs%`da}_41VxZy;JMtO7(8zD;20u0)+4NTD{T8XSz^MqTV+jE06WLgZ|wk zOAuCg50b<BIR#(pA-N6GIr|479@h_&g81n5qjEqp0~;um*#(OXq;m_H9N-K63|iC! zEPM}Oa~%M)_aN=PpAUNmP6bd6TxFo$>+{s~-+&ZS0lKW8@d|0T@X@nyBalPAPOn#c zq(K47tOqmV>yWH)=uX8`PVaFv5;_SThLhIdQO4(wM;w-PIuEuNG-v?Q+0hr^b_g!l zf8PPm+!Kz61f(56v)Y>|*gtyoXnxSdsMkCLwO5{otp>KW4v-ypo^H2*hP=}+QPllX zC!Wuug5FZ{XYJ<0U#dqEu2eZz&_Vd2d8jo90oa?h*i)zO1|4jb0qNVU*!n+!Ius(g zk7}HDOdsF6-$59T-T;hmZ=eN#0sR~N3CYLMk1r-6<1r>t2lXLI&i+e!i%%*D*~CWx zx9T;7@hm^F7Zvz{#N&xxf~73Ms1PfhLg#F&cqlg5A7A)cWgkb;7kVfH`k)zf-Ln;T zJP!!mGXiLrEDkC-2a;a~qDTG6H+a1s&LvS19$x|dyJjr`jY)9%O?_C=J9$oS^_q=b z8?TxJG|01xTzUJDAKQZ($WJx~@(FBX$<dulpqm~GOAdWIRE<Q`NnN_4hdAYT$~VHP zs@_%J*Ou-oZ$+|FSSQ8{Cje&D*-H9yQVVuYPM8iV+aZZVRt`(t$aun^k9zNz+;xko z?GnMmH(WZ_#Ow#itFWk`N;^2Fj-%$>*?BhD9bcznTxC_Hp-I+sm5S;vq=&0jRg0}4 z&76dChIUG>xsi{e=O1+z#tHIndg-GRUlsJHv&~Kio(a63hgZ|I8!TnevCd`EhD1j3 zb1{osR~48Xaxuioo|R<sQlt#?U7)!<@jze<7(0kLGf_pg8H<6=P_9Kba6Ii`iagGP zF>uTR559U@IF2!mSU~3&lUm3zSYTk(xG;HQn}q@T)>XNez?aVv?-7Mq4vssz#UmJY z?|ZhC<ej~V4T$F2##B=p22(#r9$u3oJAIHr!i;HtcWHN}=Jhp6^ttfPiheN88QR-c zjFpjnj7}f+tgF_wJ8O%gRg?8L*nq#(9|Wk{(5pJZ`JRZUlZRfQ0SE3ZFc>?X=i$|^ zHTv_QS?Oj=&3rWX9IDnUJ;>vaN5J#_Y_Z)bqEagx&3$GJF6gE*<HAj_Z6_*9zKXx1 zSlo(N=9mlE!*U&^uO>Hm#HlT@=wLN5lfectb#TS_7iSr)#>|Q{a?goc)5pF|CmVZ& zb5Mz1>dLTIB`}Crl6dZ}W|QK9oh`I!kXVF@9fF&@zm3`#Hs6sxpm}~56Isqn<rSih z$lM&sVj0Uz7OZcyh#b@dU_hCTEvdGLXs+>GY6emxAC5u4d_yv>Kd2Wf%|;^=1H3$} z-A8yp(5+GhFk4SK;2^}@W6taq)jjl<1|Qv{fLNCw6vA7s7%jvF4OBU|<)Se~Zf8t! zps>5vT>z)hgtizFk}OO=G*ZAMaA5+ft@QqhCTdw;)>hfNIP>sGzOT=4xJg|M{2Li< z$ll|y%9_~0kpql9AG_dSMbB~x;2Qh7c1`1?G3;dL3EgMIkz2@lc_*qtc7k0iK4Ko* z@L^i=C;h9&Te*PGU$0ebjifi`0$#Cx|DFf2)62%<@Qgv9?|>Zu38avlU#q0@Kpp&e zXaubLRLP146qQ2+C4Zs@5HZ<}j1T?0higfiGG*%ZRz6#YOwIaPf3OL4v0A?XA{NyA zhD{!TrDPB3g5KJJ6g_PWHeLJXlT)|odmeuI;ngJhJn-tl2KJC%uU;<$D@0#Rc6!gl z1_F)li^}l6NNq10_Hs|hRiUs}4s|4-Xfc40O7Mt*yw3v{e(vFg#Rx82gOabcUj1w% z0e;CZ!sA6Xrg7UIRZ0v`_xRF=$_tjk6PF4=5DA<fXV*Qz;dnOFRRR1mybT}t9q9yI z{O2DoC2_Cc+(-YraCu+3-2VAa(<$xC5u{1$kB_QV-4}XJ1G31hr}>Q_T$-iOxxyU7 zmLM~W(!Gv~Y|ro#W(te$P3|NuYevD1B1+Mm-c4a{dn3E#I?Ryl2b`1F_w`+_xVVRp zTlr9QK&TG{-6;drKHAS!J)#_&p-L>0s&sirx@J4>`NAmZ$RCCqhgQF>;j>1d0}oXv znz+}go`osWtNsf7Y`PrfVzE#x=Anck{45poN7g`pG4v<TsS$$KJEq9gjgVkPvcBfB z4@nqW#?lgNZEr-hzBb8U<B>(+{w*`+I0`anZJ)EI*v6Wg-dncW_>5ss%$(;5ND!rM zj_fOxd;GbQe`ZGj&v}tSBZHnH75d70Rg#ws2{k@>t>zLYga>M6c+a;7Su<aH^lW<{ z4}Q0HzCU?#C+)tT)1Tt-6Mm&(c7AptUvN<5YC3sphN<Op*6-{P>8wqxYr~Cot!?0Z zTOOi%qlrWlqckB+ye^V0$~YvEfAxlX&O2qJbJ%nn!+qU_I+}YD;;3-`&_O$3p)TbC z&UphAInjYsFBO(GvSWcaD#>_dyMEn~(|9EF%R^@}yN`SoFzzsG`nBEaPs8j47A%0D zo-M`N4fI^A(igy`1Udno>3nNn7>t2zdd49Q9cuDbIr!4f7L;L7KB9qBuorkD`M^mc z?3eF*Q;}nhGNv7pRAl}@-kT2=rQu-SU(u9NSZ2cE4g(|dh9?oO@Lf91k;COdDnliZ z3)$3A?m}a!NkkR5ARY!g3^`Or!#>QXs56%dMbo}CiXJsij<TU}1}YL|3VY5%>P&9; z(UPEvyTFZEt<?K8nC;pZ4il)8^q+uic)r!{)V*>KkXb4Jr1_v+=;#l=VH+XStdOn+ zN+$p6miWi?=v~4^Ga$czd^H0#>R<&{NsLq71Q4BE49?D{j(~^3w~NjI+Wq4N*}r?O zZju#S{fcb0XR0Uuyl+1T``g0}zSC&-1)u9blUCJp^zj?tp#7Le+p#Va{HO=a*sa%; zma9lK2DZkH8TZ<f2e;&1y#NKco{$WEne~;Aryo2!k0J<Sum;lQ*+$X5Zw%(jP_5>n ztbHhGj9U-h8NNcK>%I}h%L$9!cRz%wdC81w?|7Y;kzfLD_MIu?OL)p__%(q6%&8|* z3i~(v^-phBuS9jSM<TM`$cjP7Yu0O^xc7y6C+&|y-^_gfzZl1N4b$H+6I3*kVPnb( zThpsEvUgSwr-nZ8!lokJq%IHwGepOo4|je_-#)$_BqqbgaTJBVHQ+AIur=OpHej~| z0-J6>wZ0Xy`9aD-bta%e1JbT%AYj}A_U;bo3C|>gl@f57`En4pZ*@A2Dika}>E%+O zy?<sfUwGI*Y0~402h5(sXu^N!@+VIGR+q~L#hLtWzbl^h`CO4q&R_WKdhQR=e|UHa znM<MeTBOoFo6juS(|g=*kwD6qO5_%ibl2%MNqI)kp{1Bbei>qcq3{%lHC+zW;>FX{ zp7)R(o?sLG%A=tNSX!k5@)2NsFt-7q*WXop)nESPvpRtG!eBxur+SwIJK@sq*P<78 z><Kx$7G^nfLWrDZze#Hf+#aqcQ1CVkj;_!LPV~n&TNtx+AQ%dTL*ZaId@d9W2YTVB zBjM07{mna_`_BwL5Jf{Fe=yVt!d44E2mGOW|3@=;HWUoh;nP6>7+j+n90>Vq!886w z@TpMnC=}`i&jh+~njcOZ2*C04p+GPahK%)(O#naoVg~^8`hT8!IlVf)_rcdruIVu1 zH?SLXyeYwZV9H|$-}1cfm}M+3I_CwK?pa>)^qc>fec405dh9S8Tn@9>?sU2i4=pyR zmgg{8Jv)E+|NiaY^#1nQzxms5e@o}Go2|Bn6@Xdr^Ngu(9k7|;t<7p~TA#An%@#Yn zGg)lS{(+B=BHLM${nJk@=7#k=oNu*(f%9?mkI>Hn4o5kKZjmQ0rEh(WJL{bn%-Dy= z48xh51XOyT@G53CJ1$#V6<nsh#>p;@d}i=}%ZwYMvF|KxYUGsdt+nA9DxORpv4pn1 z{qjpM{iy%{mA@2Poi<0qIpDC@oC7vj-<#ZVK5cV49S$e>mIoZRo)f`G12%gdet@g_ ztiuVV0&Nc+&;8FIe%soEFSeX#Y;cmp-f=z)C&2}54hIA;KJJkZJ=a5iIogxq35KPw zd9?!Vp**6qT$=DKSx^k%N<?i>^x^8!D7M5D`0(=2bm-UE7cNa-`R9q3cQ=<8FWtU$ zclOmcwnoh%(qH`W2j7432fY{1zx1v7tyOCensOFyUWW$toV`!_(f{LVhYcF$bo880 zIh?kBf4&57t#;_{!_OW4uC?Gar^5=b4s?FN2^Z-*+RyhtbVBYVvNxSi+a2~Ny7w@v zK)&jNV0dqD<+yZuDg2I?D;Do;%XZBMu7t0V?5SA7U8y;^_2;j?{L;(tL|%UR&sDxP zgU#V=I?h;Xjx*2?<ZL_6*qV-W&_HY5(SHgKWNSFiI;`;5$48ttI2m5&pgs1M<0)vD z9ftj30D&gzG+-l2fD&=O6i+0AeL&GkBAcqBr!x@{v4!M70Gv)|z~z3v&#BOY2-m4a zd?wyIM4q2JbUR%hx91Sb1A2R&=bdilxBm3o-~Nkl|L4E{t3UmY`)K{(;k}`q&MvrG zJJ9|PjNiHbfVbfxKzAOFB61)*f<ZiIgFf}g_bd#5>(MxOA3Ya%GLO!MZ`mGA$*204 zfz$gB=FzY}>YhA;HCzf`qC@xgU;p0vNCOJVJFZZ~Tqt(v0_!Ap0|TAZ(Fg8T0i2%r zbBF|-p9y`SWdi8)R5zbKcGw**r?clmPUJf8u)Ey-dGfqhid|pdAS~RvbDP0q;Vmwg zv*UW&>2liP<nF`2;7=E{7+z=L<A-aY{;)^TPoQOh_2slR`YQ*HeZkfL9&`gH)T2LP z-Sh{*b>8U!IRhf#q34|{ZOm={S0?VG+j`E)Hh9iR=;CE*asfc=n(J-J>kl%7nZWw$ z8?f$O7b^8lx|aI;gLx7@{r@xe9&l})SO54Gc-GBqX4{M=-F?&Xw$0nOY15H3tBLIl zx7khN#A)IrP8{!n4K`qGh7H)5WiWd$vk{0Xg!Y!MCPHEe4L}U-dw<_6aJ<s@|NmTF z>FSQ>p7V@z&U2nK4s$NlKt<L0TB~lqtiI4scT~M`x}x};D!s~l;)tywshFO*#sFc} zghr#*`N{9<kor-sGZ>6oozZ5sj!$%TsMUkp{w+eYYyBjl_K~y}Sd!5?J*lP0D6L8x zB-i4iRz;H9Fs??CYK@P%fP0zCK5`WbC2`yBT2hGv+!y&ElO%I?74Bh*BD9ol6^X6| z^p|-jn@&D*?D(aNHSCm=BCz|S;PK(Y^Izse+tz)wwyZX<NSAqP`l1qxosxt3`;vQV zA4%@}cQW^AFsl%f*Y@Kdcb3Y(I5tgBy_Wk~ead9kXm)u<XWl7W+;!+jGw3rAgqRvI zRGn!ROM4rKPxKA*+uJ&aU1ZEa*D-~T)CM9LE#J9D%Zvqef2f<q?xea2cBngw-PIZH zrhC>vPs{G;?DDZ$%vV%*XP1{vbS|-39gzbso9<$Dvjg3$Ib!78{Hnd#boq|DFGURv zLv61EfxZjAH06b^xE_kuHOE$T)HS5%T*{uSDTH#m^=SLiroO62j+^$^$Wp1c?Gv;x zRUez!IvoSec<@EuKjf!9t$AtP<?QOLw68_jOMXYAFYb>0EN5Ff=ga-4l0K>!$b9GB zUW#hkrzc52)6QCg3~1M=NmAV_QG?biF^mJtKhfy&<h*W)oF+p$4;p?giQa>OtEQCe zFj5tLLLGxzWJ(Fm#Nsq831(&&2I0H&(1HsoshyP8K+*Q0iN(2@B^%PfhZaewp}8j7 zr1s1{GDX{z9tWi!g`BZK&y3B{RypMLDZec=9SkWZeeU`Bk@$=Bwem*vB-pf<yjQKS zIahV2@Nl)H@Iu3>_%<Uu<#?grmzA#bku0r>X~O`yT21OlxW+l%2E9(F$42U;?5-s? z9Z|cpyMtW|T|}q1E6n!cH`qn9*K~0-dYx7u*3sl@gR&>mU02u}yk5o^^t6#)FXRTU z1B;=c1YUiwT0^Rh%*(WTgN`(iTGO~SCFk5(GwIW<CQ;KmGN@Zis&$4Tu0cCb-e)u! z^ai8Bpx2jNs4Oih#iyjW_+n9UQAx>#f<U3akSL(ATME})EJ|-OF=J|tR!_F6nA%?f z?FQp2L_lCVeUKS;<SGC~>cSX`XlM<Ewp^z(r4~5HEMqpml{Gr%v#uR8jg9jLjpTyv z0aH_Fzf{T<%hbBEp~@anA7`YOBjoY9{oKJ`NNp5EGs+wq4Pp<OgDbylCfMaBSVe@% zwWwyYS<ZmR*k>TC9u=0~IG>HSfx(7U-vM7X=oq>TlA_Y6;Dmr(sZ=XTV+QpR>*G)S z+lh~twy*hk`}VDkQhrFl;tMD~C3rxR5|a{_7N4~9oTRim{nVbl#}4jJzYu#S;YiHB zgUEXv)TlIT)hbg*r9p$HiM}LOfoZOffYcN2D03=r1ZuTat^in+^1BMPq`FQ{>J)>Z z0(w1nuy0U4Xw;DkQ|Zqh5C56^3-M<kcK=`KKfybSyEyzHZ@BtmMq*+0#gpZ{i*<=< zdrlnNz9+w6Uvg5$&I4&$wK@m{X|NMxSCx^BKqR^XQ8!)o#mLt{6wN>sRDPEnj6aop zp)B)AZE<B`B{%0>!RffX;zH%<x!-TzL~Raj3T-AfhHyk}TJ^$njbh%y$SNLRAQ++e zwBQb2KCivMudkckJJ{RP#~!M09oCTnof2JftgGCt*Mj;-U%DEcpaR_e#tLG<kq4FE zAqP`A=^4k49^QYr;$XV@^x4x1yY?SDDKh6iws~?>^ycRq#q-EGO7Xru!si#9%g@ct z%fFD9mye&^f`Yu9?3|q3Tq-9jHzy~Q8^j*U3F7xw{Lf|fyqpV}tw!B4TtcRr{*SKC zR8dIzfI=ma=tl;*1O04nFPEno9>MC=;BdckH2asEHg0@jW+T06&BjfeHllih{HPKB zNQfUE3Gr^@@`t-RJ3-Oeon2k{>FlJsR<S$VJ36R#sy);Z#2#u7;&($wJI*qDOP3Jj z6RdEh+LpoVTpo$lR}!INBraFkZRq1lIT#>`e70JRLak6y+O=x%%$}$I^aS<f>L;Fj z;)y4p4C3$`fBWm>k3IIsKmOsdT0wXyiaX5p4iVho&}!}=r>Cbo+(UGGdx)VRFN!xZ z66O)ZVIDo=#jhVbh2tPEnyWPE7B2%AQJXb3x5!$_*42$|S1+RyHcH9TK+IW--l<k7 zb=t7{cEAV8h51%%)TWM<<g_z^(@|-slf$W0+BY&=TAG_$+Ael$m6YOcr2==UG<X=F z$fi-Ldh0IDHAUB5QYpf6N*+=K<Y7ffzFL9KgWil2w47EDY7ZIRELMY1ESn}FkX&z= z6V=P<4fhef6eqfu!|C<+t?TXU?cuaGG&Fh}0x<5Puun9ssjum}8j;lu!DD#%y*jm8 zq%eZ0>eQrBtH)R~n{=bSFFg0c;znW<wecq}Y~1+7sR@h0Y#U~VG-+ziW{bo~9IW68 zqyiaVCK%x=i~^O>5Y`8=M;Xa(3L-HDRu~||x)8aVp>aB0kYwpd3X&C}WhAHQ78wa- zZdoQVHA!bO&YwG*dM+(|YVGOFjI6ZubE*DQ>rS3Z&&`x9&AXw7Sz0}QO<w^Yfn0Tu zj^v#w80xCya|&c5y#ArK-p)#$HRs7~)CcR{|KNRmFu4nT@MHYEy2Ui6*Xnxvb?8{; zob-&0nB2I1nRQ3boGwo*O-fH`um}`-k1krT=>gy@Qo9u4jSOQTBFD^sFPKBK^a}8z z7asc4FMsp9TcaLZ7bez3KlI}#?)?4VmWVZX{_^GmI^c+?C$E(;84kEa-rrwZ`Qh#} z$G07mXB<9{+;3kVG+6VWdH>z_-g}qXg74Aq-t^wqt?$0^d}T$K!O%Nsq{w^por>N| zMU4gdmufH87dI8P6n2!hnFVs4M;lG5yZ>*nTjUJb_eJV_ur}#LT-@=4hm&Ft9zJj& zHvVKvV)Dtjn8SfXw;hZ-5i3OESvri=G!A+y<atD6gCU@uiP4G(sT1=y<RPHO1KwG$ z)<U~Iez!~Sq@8-ia=k{H{sBY~HF^!|8y}rkoK;;`R+*k&sjki~t!X`erb=zge)_}k z2lV?7qM?|n_%{5at=@c@KUks%(gujc;Nd!>F>F|^GwQ+pDIDnad>P5$tm?XgGt)em zccz(^@qI9YFK2RSaA;_d%TsD}>aG^v2%k4H%o7OZfGniF71NLz24hp#taXU$onSv= z8qf?)HH~4Frl-qaV`Q6P%dQY9Y(0iym0a%@3q_r?t)noox&~unk^-UowoZe=1YnJ3 z6A6&vC95%O$147J^NTNrHq)EDn>W1j<U3>98ojZ1zyM);xr;53Q3hfAY*$n}NB>p- zyNuA~zPF6j0}-V9R8?#ar?0!Aw|}s?vZ}nSxU9aYqP)DcZy?l9_1(;wU~pRKl}$AA zTNIo}XiJ}ZuzLt{<VdHo&D<%3ElsFN0XJxSx708r7Ps=kiXNn7ycQ>nv;g@4S`dv1 z*&i(e{4kRt4SJ1Mr%U<xlg~ceu_N#q@k#KrTi^RvlWMTSWbOxI826-h5!eMum}ePi z{i0!=o{Wfa21ArVho&U3M>Aa{OcMIAVGU$KJ!&juh{Ck$TAU+O!J0m4O-*$}<E3U! zcUx0wRZVqSML~IWRYi3d2gHwqjC<@$W(IBlOskYjcaOH;<{XhvRp`pmfC53MP}6CL zwc9;|7Jr*vBG3v=QlXGD>+MHiifhnbWdi|L`!S7`E5ew&gUnOP+ccQ1s-Yp#pk+;? zMuT~bGTv(*GZ;-q^O&r-BlWT0JhyG@n~jnYz5q0K8TnOekx(RD6s;1fNQp2ciV_Kh z0TH1N>7z)kB#iUS^?+!#8WOJF5R6PJ_1?>Z*fQe1qnzA=!-rq{*IS?0_x7~4wII=8 zeRXN!`Gaq7d1=cVTTUO^IbvrJw+oGKGp+ZJ-!?1@`Bd{N%=*V>XT}{$K2{X&LEfAx zp4b<Vi5JHfM$HQO_3a&z>{JRrv@6lf^o3IXN}*B@_iD9DFfA3SCS?kqRyWwH)9B=v z`p_3d!$V#6cb|XzwJlp-tOw@90^I^yJw$%fz-{X6=xT58Y-?+854Ejt?o>3hySib> z^ONqbE=&%)I=fqXltbKMzD{uohCN+qzsQBouI`p@#SoXvL)TcNlMZnOB-qD_46!^f z?xw_BcK!Z48@}`4AC8?Z9v+rVh(u&rtyo?EhhKdA$G`ts_Msg!UR24~tP!nZBq5a# zI1<n?{YuM@Ih9*poSB)PnU#LwKypS))t6__pU>ETq&Pme>{v~0{xffH+xq_dZ#PN> z0zMClA1@dhF#HY(kw84C(;&?v=86oNQ};-bQl6{i@_srZ8yOOcWU^t|Ky!X}#Ra88 zER+hB5{XPE7>rzy_c!HcmFGzH6p-xE*}CPRXKOGZmPO1JJj0v^{&4r2J0AT0?|%MY z|FipGQqR#7HE+BWmt3)H(<49l=ii$@+dZ@N^>{`^s(^Ae6imREQvMI4-cxEgF{wu{ zo;{p?^k7`V>3^l~F6%jX@X(QyNrz+Jj;oAmXnE_mZ*K)BdZR%CbcdC41*)FXK4>r* zAu9+aY55sL7gF*{O3z6kt!oq<*<j)6wDOYdpPoEho|jpeo1N3d?H&>E+GHwjamuOE zyxfw!(!6t(Ip?w)hC8_Yp-V!2m|WdG>ETGOwCb-SRINKG-2BWRU;f7@@d>*R9XgYd zel|WwqSG~ed89D=%zOLedOmv#E0#=0&#r}$IC;JDYGoe4sMewsO0@CAk`a+$kUPRD zkPJu$21j@jsYoCa4-NNl!4srHqjt-y+o<=~qj80T5x!ol@RQ%y%hGBGyM~6vM!u@K zC~Gh~E$LK2$}kCZl^pr-#oX$%MMXc&OsTj~TEZ#LZ5!;j$$N&S%Hfi8xtYTagZaf5 z%BwiV*{$53QCVld5JJ%!eM9F!g-ridFJ2zl-Ql5!AAJ0ekMI2Cr4OHaX5X3A6Pf3B zq-UOpjZ3_kdt%osUmQD(9t?a3_mDp6SkN*5Ew@eS76+$=<FgB{IiW2mpPVMI3xbLm z$u_y1>Ecn5@3nFS^ML%R3~LAlrHMi(pw!<19cRu$+onJH$7h~>=5K$i6AW{?GCir% z`*jbSN@~w#oZeYr705M8v0f|`_XtHArkATYGKoSdRtbbZmC7Z2xtvss6}{}9fq^Eu zLMT^BRS+qaV!mwoLPuABU!6G8$;AWxysJj?N*#pyZ(-eY-@^|?vmW^2kA8H^JwN;5 z-K^Vw_48kS=bqpF_79If@X&v~i<KeN0sr;h{_{DV7YFaCJkoLQ<U)E;V#Dx7O=ZH! zzg4IAm=GxZS}IPALvgC{Gx|kH-q74cq5T5TJgQV0P&Lr^dqLH-8c5=5T`#CncSR4@ zHKcM8UxY=8n-y&xm%5trTgkrq*4CERVCVYww)U3h#ujl?2gPRf_0v7K4Z!M@)7{(N zCvEHK;E>ApE^6TJ-tI0~p$_zS_w=@NA{Vq!C+hX#(N!jBGK?XRGKmJWwUr8>2JXCh z-P+aBx7>TrJ$F5L(`_%j@#CN0^YEi@KL0-tM-!{Rac}gW+>r_xN|?`5Rp;c_-BFMg zAP+QWSWnfmQ@ZjGHy19wTR3(@1wf;zRzZiwXcS2@sHI63)RHTI{o1>sh0&>0CX-G# zW;HXK4TD;#<qZynhY4;7dzgQ}K*%5F_6^m?=d{*W*QRCH)|GVk_i;y36H;sI)7rmz z_F~_qf^ID0D71PLWxPeFJzdl~fJC_Gy1GhQxk^fYCoX_P>NG{AFbf^&t7H#%3Hlj@ z%ZiY8c_j4x;^B37-+%Y*A6N98`sGg^-xc@UN543ooR$>x;h&%U%jPF;eqy;2lnt~w zwQM@&z#W_xUtfYT|41CUKfNz0qq&2wEt>rLN`M|AN~Hm{iPEVU^38nRtu}B=&o}mW zOXZydjb(%N{mg*i3WSRSLKqZ$TPTt@)+8sy798Gv=+v=<R=G$d$W1&Fw=<#P8|6(I z`w#8pSoC_3>|6B8;|(V>Pn0#bW$jP?;-ZDp6F7ahULAk%Xx`5Bgj2~Gi6_4h8Nef! zMYyj>`{O^k<)QEY<{ev@<~^}>@A=a^5O|CpO&SXtD(WV=e|kKEvKMxmEO*HbzN}31 zs-dw8>Cmx(Axn)~r9o_HU9=kVR|u1?yVRz^bhv4L-pu*%%d*7O100!BJ~Y602<{Pg zpRLU+Xg^n2QdHT5<bVQEMPc!|yr!<T1=WogYfHo+R=4QL^4hkZvYxiGuDqr)j?qWn zt<zqrZ0M<IDQ~U1#BM25F%sN$Xg&4BumAY;3txP;?NH{^Z|&cG@K8z<%(2f2J2O8y z)=}`r%MqG}Ilm`3gFtgk2!H4_8MDRf1~6tzlr~B!7E_`qu~6s}M@a;tfOxe?A`yrs zK`|w{Qy>}Ov=p@E_O+hOy;xe1KB$KBo;xRaKqwGIJ|eM1DiuqmGO1Jo(k~Q>B{&?B zuQ91H<27M+N<hk3WrWafq718yW{gngT!_5MWX52{6xoE`h<d%;V}HHOtHPZBe)MOL z{O?bH_3-^a{_`_WzWega&;QS>fB)-quP2{)=68=h{lo9Rw9KoPPQ@4H!XO?dwC9X4 z*Boq~{5nimlNz~f${xgI%a0v%FFP@{h~GP>9Zt8?ZJ(Z-ak%GX!=tEi-Y`Ej62wmM zgV@6(G%uRbV=+1onop0ghE&l8kTqWf6Q(<U-Tdgz6-4@O-f-*fH{E>u?RR|Zj_*Ho zKlOwA?)&xw4?TF_4}Sae`|kPHt!w`3_AvywF%dq!``UsHx3U9;jp=<uy7M*|cU)*b zHGExE5qOP^gSn6zk;;c?OpN(}-yih(0@#>;2y?zfdxJ}a7xuzlgnog6mDfjkH!LoN z%{&w47D}NgBn)CFL_Xmfkr0i^7luXALXn71jj+V(XtkW_^jFaOYQ`YbVyb)DjDxd* zShH^Z+Hb5~#R?Mlue$fU_usm9E%DetSgY5qCzi(-oeMXn#E#V31Ggqr76ww@vJD-8 zDSl^OLQCcicztgS%Ze)bkkaR96?hz^WqLw3IX^WwF{`&uOsPGKupn4YqUxdMSqqE7 zh4r2#Yww_0kLsXwgx;s4jA1>cThB}z%m!$|^^}P=uZM;k3L*^*B%(}O?eJx3cZE9o zv?=j%aYtiflTMyWPC1j27MIb+?kPH#6_;8O6B8SM^a9dIpoxUrdNrx~q@F#uHus%W zp4?k&*$d;!mh^1pnHx}fAR-4#2b4kMrM}YabDX@UQiHgVa|uJes-k3mX=Wh|RKoMr z!ut6j`)!ar46a4;VXaUk0Nh#)sVj&%a%f*ZG^56n&vxzk>=cyJYLogxOiXlKzfs4# zjKzu}pvR6bfGmfwKSAWAd29>R>{`$K{Nnr!QeQ0GGCRJ&U_lQR3-umtSa9o5sDDWB z5$oW|NlzI}vxfhGg}7htA1h%uTxhGyYHS?U<+e5V4Kx;ZbhsC1<_XWzJX(RQ={K)n zV5rH?I-Q?Uq0<{HW0EdjXjDif($=EX6M2;am0CXB`QFA?SG`!GS7}Esqj1-f9$NaI zB}IK=18E+Vi?zd+>B*_7&?H9bWb}WK!6S976!$5X7T_i7n6W!&W<0Zw`Kj4?y=cMZ zSqv|*<|9=cnrC?ysCk59m|q(*j+mgIW9r(>&dE!>c(B~4HOTrJD)?HtR3uVsG86ih z0;Ntl(4N_2TdfkQ6v!xi8Pw%r-Luq}AA3@48<B|&O0(PHqMYkoPKVR!nzl~`?dzu^ z9fmfw@<TMD>gc_&jtvOlv2`64e$Xn%s<Wg|xwPnAMBs%bd>E4%7|Jjw(1?+a9>z}y z$N(cM(qk69s$r8J`q6pvdn%1Yt%Rmjt1~Hk3p(@~IrIo;V+5G!Ye}QBqD;M74B7H3 z9F|o#J^sw+o_?Xl+Rqd9$OL`J*U9Gz2Sk$Y{!vH3e)BR4hR+(=AzOfQ-)?ui>1n3} zwqpy_%+zA;ycaP>zOncShe8y<fHEG=QP&~2ju`_=N#BSS?8i!vd95r9R(j~Mu$34K zVqdbZw^+xa0VN?SE`YVJV$>9v5K-g?gMwjx8qzq_rK7ZKfQwOA$tS=mq7@j}VSOmF z`}NFI%s>z8<}SBUWL#Hsf`@<d$WPK;BAH&H)Pgl@#WICVs}f2^(Ma~lC(=xX@W^aT zt&;4&eb<R3?&pV&XK2n{=-Yo_V6!Z-5;%74Ngn%moU}RR2pl@D!||30D4n&kL5agY zJ?(JVk)41wHSKdmP1~ovjwqb;Io8>y-C`~}on{g%gCJCxTVWO3V1o9Yk@+=RQcjDb z1UvyH3rj=TgEGH#gAANi4*n{UYsoNVs^}Jp2E=!HMXP7tLYX&MEofxYAT{C5l!Kb4 z9d}PnOioQQpK;(eO_yfS;S+&`*0Kj{*@b15wS6V$zbI|2YwAd)>ysDg(3dA(?aUcD zcYZec#`a?rsvC65Vfl<}a(rUKX7f(4Y~w3m)VObAoo!;8KWqkKHZlrga1gD7rFv2) zCsjkMp?u&D^A;lVF3k-f#`A_@K9qy}5#EplN^31k!>su%Ypj>C>JA2|(7M0^az@V1 zP0s~=1pIW6@zi%S1`v*%I}%!3Pt}N89&F`RHn+C(%jIVqptKPrN}Km1XKUU<{fTBl zOWBd68;2T$&03v;E1MY;<K=|LiM8hi>|X6U4Qb%?GYvFFLcY{eGAJ&w(yZ6Qeg_j6 z1u5gLVz{IrAY=)!@<$5^0VQO9Y3!8XCcZ$-7f6LX!HAI5pcaS-W)Z#c%BqnTxfX1T zNUTAJ;p-9(-wUI1?<|gJzZZ_3H2j1R0+^yhGuMawrRZB3VUz^uvnETJ;qU><zd8V3 z?+=9icQgDy5N5nY{Q<}T%s;;mw&avQDssb`kZ#Bb+~&zu7+lOU>{^{hDudOSEG)T+ zi`52!6zUVHQamjD4fL-<u?Ql8i1~&@2dNInjBF>8LPvu-5DSE2sfa6-2>4Kafb(KS z;<EJi)e_k(yq<1|^L1BbfkX*B%$9(6&OHO))xf;NOZgu{@D;DyzTlr7otT{kzY6$g zrWb>Lug^E@4tRaufFIJ#TE8}e324Q)RT2Zt^da`^#kJ)HIo(hosHAn}1=+1Iky)h~ zGf2Bv_3_0bF(v$&ppP>QWB~fGP{?PH67V{@fQ(42$bD;|>CHwNFx2P_W;2BFYt~S@ z>EfLod@p>t!XD%dZH7U2zytfo4XRJ_1r`_%e3>SyU=Y2=sE_GuPcVHAi28%-Mh>@E z+}qZ`>5;eDNxt;bg<6NacDRWxc6D^QhAy;7JDoboK!tXEYDmy(^Dix3MiflSSbUM) znS(4%q*g5*$j$0Cp$#<>VgC7c9GTczZ7u1)IoTr|fr>>a%uZ|*VOep6lTkS`BH%+? z+Iut!M*_ZJ_}y1G?G=p(xk|atVi_|t`l02)w;~78iFJF1y*(Yr)AbIuy+NjD`?*7Q z*ujcUDau824U@<6H8nHSwLPP?+KwS_)1|16b~qW_(wTm$WZG28IgxiVPgm6tp1Gb# zqB_)1kn$n)-_bzOP*T-cR9?_hSJYfzV;V^9ZYpb%%ZDw6McRq%X0@!mEu-AVfeU-N zN!3-<APrqp9fthItRt}rX=bhA(viG^>^>tZq5nu`VNSb|)Q*<DpPKpQuRrJ#^U=_P zk^OH#Zz>S<r|mmX1tAyhUU1-0CDV)flJ1{AEf<f7gj#{zY#C)5zFEphx0h?<*nzs- z#xs_)Ev3?I_6}Xb-ocm_uM5!!&n8_s)3wu)(P2GYRn#AQA!(*_AAetV)agX%fp6x# zTb$n!uT;L5)1Nh;lzzjU`RNs|D0Umo0iRn(PAaXcQ4Kl4zlaE6QwGJT-R_zvHO^VJ z)iHtC`N~C`dd$Ff%}PxcyAR$5%pic3DEfw>vtgjNt-3?6)$z+OUCir8W$2_8ZACd9 zSaZ~31}!@J>wR5<A@Rk{C$kcE*YgL5hqyIgp6D3@ZRQSE9g1m$DtKsQ=#%H3Oym#p zxWoO!rm->8SBuJ*E90<?&Zs))EbFYT-P4t^v?G7KZ^sn8k3}cX=~BnzDjPbg_he=d z9?R!g<MuTb^xVbH7Qv^YJ((_Vj2)BigNO6Tj!DPd?Dc))X{#(EB#7MxbHMBIh31!# zehIFI4m;c?Lm-fFw}JUH<J%X8$5kLOx9IbF?0zrkoewtiSE?gg3%fGP^j(7%MiQNM z1<Tc;X{!ZMfFwa`lqN;`uah|vfwViPsyy#R8)m!$aqsC8k$|BILRoW{6k|v%&3L}E z_}MzCSR_O|OpU>CLv{4ch6X*=jhgz2tdh|oT3lgnX;Z+0Zeno6&XboI&Gnt-Y%+Df z*yt*#9+DXD(u>rmLbP5&%f_TRVjd!zw4Cj)=(wReet%W(2#+@!1+|m9ZpHKhrw<X{ zOjeWBpzx8hQL!F+eZ^?7S51rBI(m6sbG{{{on3#WIvnJ;bZUu24jUTu2`!f=92P*F zpkz@BKKt%29#9r5WYWIQVNBeipO8ox28T$$k~?upAQrLvq|$B<_<?8ydBhZ0e!Irb z09guIOUS|<rM$=(O~IFPnnLsv_reV*{q8E1XlZ5lz_7%W#}OzRD$7gSG?y-wG!{F$ zE>)ymsyka<(GpMybqY3{!y8(}JoYMt>|{8i`ngE~^Gumcu8@kgsuAHTv4GD9+^fV` z9T511Q5fYR;Rc|<7YHR-gOZ9U!D_yUl&f^i%Fk66CTw~}=Y&JZxE(P7<~@k+IZwjf zi{;i62yn(4pPIP7vpxz`<dA5Yu^Vy?4O@pzj-i232b(Jx;2QdQL;PM>Ll>9bRx~6O z5BsM_XFH+f>k<a8M#M};V|E7_ca2UZBlYqjfDD;};QIutK%w}eB^-wZH=#Z7S195E zb|u7HmL9Bo1%V$eD;MaaM|g~HFl_n4Rb9*v{sd{cMP<=x;O@&f8Lx33%#1~T9mJc7 z|JOH5aTDxwp)aA!TW-Mbjw?+y>i5BcVaewO<MrJI77QJNZz<sOTjqlSqZ&NQ$2e~g z^OTQRyavB{NI%{c-9ZR42L|2<YnV4XyoTG{+Sc0M5oo)oy|t~SYv@v2TWd#0Ti+0; zZ-_gD*a8x0vR5#?On8pf&9x*-B&k)7v%A>^RgOc)6~l=GadG>TMmXp8_lr))FVR)! z>EztR7_7gZI(}OVH>qnpt*7^};^OuWnl_Kj-oT!39fwe-l@Cg1z>hHHT7+zIM`ZHF zc%=9uM*)08hVrh3%Yv7gmLZ|{)vb6nmR=I8(^^^+*8Yf8u%S+xFwA=35$2h-V?x-+ z0|-vb#GKPPJ3nW4xZLCY44%zWMx4KlXKcPIWA1e9Oh$^Zt*iWkD#LgzYd-t5s#epJ zpT<9z?1**I#l>{i(F^T}yOk7sTTZesmMl#x?&daea7Ow?{tfaLvueIp$H-eIOF+Lw zz_)1K3WZQ>q%bBS(4!bb!=EuULMQKC@VGlVW&A#gK*$+f@XQU3h!#Bd;&x;AC1EGG zg6;FT2ALVyvP$wY=qILvIhmJgb25969bk8T%KIXZU7K0eoYz#?UQnngY&^exo*w%m z>ma+P6D0E3q1#eR&X?rG9=#wi#(dER7u{kcgSu{B^_8^#^`Os^ztG7?TE@mSRU@Te zrk^TLiK!d6m^%l1ZDZQfjI(K(rwh*PZ-7r1hY@+N7IWCND?ra_{9)}3O`4WWlcRBF zdP%bwHZNK{b4XcW&Pc@onHX{hJ&Ox)tW(_L^{bZ_3|6dp8nqAwgG`vZ8|1yUD+2nJ ziVlzwX;n%x&?<QqGLfXSroEEg-PGDV0EKB?Pm@9_sBdp*Y3d&AZs}FXMC~xiAX_3z zwq;Se2ZHq6JX~w}h{}T{xy5VN(j&EW!+ZT2E+g+V@BJn?VPRQ$c}-1iZFMzO^FUR3 z`NhVOyo!p->dNZ6%F61R+N$!(Vn$rhwL~l?BbHkA4Z<Z6A*4hsv3y<>CD%yjMP8in zVGm&sWA}?z_t#x*W_AS{i1+i6?#6Vvm2MZ1^OzZyUWXZ%ZmnKN0@VmbV+@%nSO>xD zWkIqEstP%D&#S~-tSkm3>$G~Efo#<oy@<5O5WOaLMWB+Xps<IrFJfQ99;^)F`|?@l zN(g(nGP<I&0*9+B`r59F+_7N-OH^9LvOszxr0Q~|L93ky#U)2|>i{2PxeHZdMAJYr z6L>w#Ji2Hi%sx}J-awjzrgcV>$xwb#Eb^?tS=UG!b+C2v;_=m@YfP**e8oi|@?87& zZ(w-3vJ*2Blaf=YWN!+Q>`w_L`y#(|^4+Ovr%$J)rKaFJH7zaqOiBvAQ)AwtKA^S* zv9E`%598_a;nw#;u+&<+?cZ<y_n-dul;X1OVvn9CJdsuVg=_lJ%}_(Zb`g9H5Wxj- zI?`y-Xgsff=_dRHB}G}W38zw$PXU;y$T#a0;KNq{UupLqcxT6slZl@kOFnRT-`-DS zckNC-aUwNy%Y(oAx#t(eOm{`oI{`lDa`Jot;XkNn~{Pd)$avq&U)SA>bNktcX@ zdCH23{*njtRzw;=xCcy-H!%82NEBfg_}cn;7ozS!3lQ?(kg1nJV3{#rjR3K@u=I^Z zzu7#>8J0*T;(&COOe&L!ebQ(dRw{f_mRRDK5}NxOckWG$IkrD3_Vdc&xa6eR{V^xb zDGWz`zxjn1HogFxR{uug1!`mTGk@8%F}R7|xO&rzn>KDz`RO07V6b3!Oxh9hX~`4t zE=&jLC6i@r%r-jb^J3}>#R^4zlTp1+4vftYiu)JH^@G~6VcOPAF=;EWr+ijQ@eQS< z_i|f=m%@wTCGR5qs;MO(4&gns^iBBF`Sg~FUI7f2l|jaIQq34l!fj+V+{lzljZggz zW*wGUf5igUy#uE+&K$}u%{`gfXvwU}Njq~UtAHGh{o|Gw{hR3*iOs<m>CN;@tDgPq z=FOV|u;8UP6KX&GgBAQ{`k^nIMZ^dH+=2%}z>>x8ni`#+V<PU)F9gCX=r!BbT$(TJ zSU*F1y2A1<tF!+<peO#StNkD7joLVT__Hv+NbrhczU7S1k0Pvu&l}7w!tk3?-UBZI zg&YPn=m4;oP|MWt-O-H3|NL3%8P>DU1fQm!`Nq@FV0-$RXa4%w)1jw`zXhM7pCm9Q zBCUt84%10+AZFs5c%9C9uY1}nMFuW`(+VY;%{)s%MHA_V&bDDLJuK;1KTXedyLtu( zCI@f8Zi5wqsY=`@nYm$T--BV~H(G4H0+@Hh#|yRrjL8U&;cs;#UhqazYBZE;9b?go zW5)Yutz6vs?u##Pc_qAM^*=T~``q83qyD}Q-+zDZ`6vIfg?gEIiF%oOg?O2IiD|rL zgG4qRLMU5=E%W-rnv9CYFy>QOErO~j#AG{XFq;(e=7t9cyygvTp;4fn@(r6iN2aa| zlZ$9I<A4BClWf*FdL7xiIf9#YVn7Vzd8HN$i|b&B4+97shqSA3tWv|x1HZ8Ff|wMg zGm#sxngPRh=%`_gOsNUz<ko5O%8K88=9y>FcHeq>a~7Btcoz)sDk{n=ihA`}Ph?zp zw0g$g@{X0hIji<~mb{o5Qrx(-St^WBHV8}t*_R?9^hU;A2%)i<*v#~*08%bO$req8 z{h=EW+z?SuEvwnS9>K{W39R&Bf98iGSM4Qf4c5Dvm0?)p>ZOg!Z(9rov)XLbk6N(4 zsW6Vg^Hf{nJp0(oFQHM^Z+`jDJI9R%%*#WDwXkB;V{R5v$AJT4ehQ?P?GM?squb+x z_sLS&IgoNjM$fzKPAd}yhshm=)RG`3Ut@c<VG=|AvNRBitp7oOdJP}GZMmVA@lY|! zXRO7-TZKV|hRhzo^1TL5R=TKymZ~3?6t|?Mma!#y1?4#n1?9!n4SDUwBVWA8SZr;5 zf9nUYzl{lu3VtOltrCWz@OEJIC(Hf~Y<jlCN_ifJDCHa)HBVAYVv*f7<967bF6Y$r z<b>T0LW$lN(7|yq%F4s61hYrDxH!x=Od+pG77%2w<(Mm7Zv`Xmm6lodJb^U=T1TtX z=eM4{C-rdR2Z?*i`i|^OKNxrH%fvm0PGq<5_~k!72)?`a{nuV;ENakc8Rs3e>?+0w z5y&jdxNO?f??!kie<<vqocH-?^|lJD#bP#T4EEV+r`v(0AEr@g{+ox4h>sJZ?}}ye z<-o<83Lsk<6eZAKEYXAcUyqtDB8vPc)CSS%7{hYt>ojOH|CP2<qxGV7qV~aiu~N?- z98~t^@kK+DkwF2EJ2W(EIK1h@t>O1KZ2jP$Z;y$p82fCPj7DjhwOz(%jzRFN9(Q4K ze%=Gz<}D7po0<{z&bVE(GcF*DfLB0`mwYbmn7H7y{;o{}4O#Y_(z(N;Ua}>nuY2zq zM|SaW!GA(+dHV7H*=m}v#*>B_Pw)UW8}5eHCd>r%8l4FSoQ#F5(O}ZqO8yY|`<fU2 z5I-?kXbzcJW&?F?qb;w|v1z}H(Sry5L9Di7H4sB5938?aibOR4jfmhi^1d9_zOB4V zcbzo9k*TcCawoFOJC6tA^E(TL&9R+DUx$~PA%s$9ZZe7SMPaN3BIE29W_%ee;{zfr z$f>X<2dgkG9J7$yG8!~c>({IW*<-vf)HtjC0rLkN+85*!v@>!^L$;KcS5{S3R#nz( zt;b)62jIG{5v=y1L~STiU^K`m8gE72j);)R)5MT+ZZ_T6Z%sd?zw4Mgp?H$LU0Zmf zjF+2TTt8fXaZgNX=?%y*!YCv9NoJsqWRO`F*cqYEZy2@p^1-F#jEgXg9HSs51|n=Y z;wQ}TVz_Ro!J2;rKUOVz6wuLXN6n;Vl<~wj>W}{6ug^UT&inK;e=am!DJUBJ`wIB* zLkH+S528KMlNS0eH$6`-j!pV?^9%kZogaae7DsJgqgWysNhu<=0(3}7%Tg<Y0mLIf zZwB-Xe}%s?!)_xIgaQE?*FcT{>jlqcsc`W=m9(##Eg0gDsQG=vaJ=XcjEMLHa;@~m zH$QlPYxuo2A3XnwO|QYNYggFz6=xs=LYRFWExs1E%M$e!*qEASU<)hPM#KPs2ZK7e zS<!I1ULA23XX;h~x8BGFN_n5I_2Ax9|H{byXrN^O{zG5J9sD9@SKPiXqvX}MVNx1? z_s$Qtyk1w@&v=<b!T`b%3FB%|SEHI|bKuDQO+9oa!3KmZsinzLgnJe9nZ&Kv%xNJ~ zqhnkV)R@}6($Se3_UV`V2jh;#7{USvMwE%TlFL!g@JJ3Sf2q<n9V$pao>!JC$w{cX zP*i;Jbj8V%(`>!;)qjDBFwP{~{;^F|SI(G#LlumE#+aBAR|C%UkH*x=(6FA?jNGrb zk|PTVb9CT$4Xr&Et@fzQXY@~wArzXRqHz?_R<Dz&mod41cC#`qUFqeF8~C!E837-u zJJ1@T6+tt|pb}8tp&1^~D@n%Hs2c${NG<rC4x-B%<(9wyW6LYAP+M+#^-sHPLv>8m zWBX5-Sa%KfT*&E;9l5`%PqvSf;i0|9cjZ^4ovb@tUHxgzxvZl0n5veK+it`pGILy> zr;P?2%N!mJab359xOlnCGwtEMf`uA>{@;O=3~`bHP=iKeL{Vr|m1<q(yYIe7ZKdD4 z^PP`5lbJ^?j8CXhZ-OV}wNVI`hbv{-nWCsVeVV?%vbpS7>1l*F%Nl+>Z+itld+Dvr zS8MW2IY$?}AL~I}!|R#@%v=p+2{ZZrT8?KLn;4WZ<Wr*wV3}N_^ur$o#M7%~VOoPT zO30K57oc5(`iD3MY4f`X9H7;j3>tttW;T*Ar#2f9!K41E$3Oq%GwRdzA0NSrGeeLs zQ=Mw|G8(*;hVk^u#q8qy+0vZsn&u^X=@NZf-dQr0Z_1Zux>{34YZoLv#m*bh_)1!w z!y4b$a5s|`G6_1#inPdxSm1Dsk!ZwFk}(<!lfMS(XLN52XV$9q@``>7kE8C8YYZl{ zdf2QtDmFd!^viH>dFiEB{x^9-2OjYi3N=9CKM<eGOWjNj&%y}I9qA(1h)RGA{t%2b zy9@~cg9Rr9atcBqT<o<_;i6_~<{U(*Z>vmYb=`UKncPp$7Uf>Z&puu#8x_3##!K7Y z{{SZ5AHH}{D`nWz<@#L#4sthC(8#uqpb4yLB)nZ0Ui2?QICotioe_6k4fV3N@>Yh9 z8?BR!1QhXxhrAO7C-6u;E(>_k5P4T1W|rM?5*U0hBH5x+)u!5#@*Q8~OAepeACsMw za5ARfB7Ei5m)?Ij{NDQaH}Bw-bVAa&8tAnkHR56<`vO202oprp3#~;VdYvobl>`{B z70Yf2;P?MSIE}!M+F7n~bOqElzEn(KAXPX7cSTh{0xZ!H&`sIH9G*zSmkI`CQn-_< zjG~vfy!bv`*xr5bgBOmwdYfPsb~V%tfgH-9CGxzq;gb6sdE*(<*}`p&xxDlYW<?+| zq(3DsZDzZ2IpZhEuevh9BGzF0HgO;E9pX4qO_;Ft5nQ5!_yKVT@i_4ewx@|_iT@&g zNBo}HNc@v{i+GKAoA?*;D)A=q2A=vBaSw4Xp1&WZd>6;RC4NpkNz}78M7Ah`B8+&F zDd#of1LCK|Pq6=#*nsVJJbO3sJ>oPWCp6eRtlL;WCRzbSA+d${g!q)$N<2Y4N_-!8 zUEaP!>;iN{#0bG71_=({cRNblLevutE89<T$6+FkC?blnX9B|S5ib+3qpbI_{~j>j zPNd?Ex36q}B%UG?2r(hWCdL#00B#?kd;vB-@gebRViUeku53TUQ;!38$;$R){C}D# zBPsxOEuMM{r9DSH54iu18hjD3_*pF0_gFu|J3l3gS!;<NVAw)56F&qj@vJr2*5Xau zaPMKFk+qJsj!+U)fMGN0rH+^+Of1;z6F&mnal{Oc?_}LWC{XiH5-~(2QG@sH1^jQ} zc_?v!>w|zU4<+h|5bHkHeZ&FcJzzkw?q%JN|Mw8PiC>~_7YQ%n!}d6!JW3Q0o!A!f zo_OMO;xm-88TWhw2-;XbA;wVBdbHk)#CBZOupYsE8np7?i6kPQ6~&4|i#X6HUcr78 zP(FteP69$^dl>M17u(x7$JD40t@beS2w)mSD{2Wh;Q_9%5ocM^D02>QO%OW(;{{eU zYZYNZ2-bH2%X7rX=#kBY9yN0aaD4_ip1}L+&<YstL_TW7M1-(;amNL`J(kEJ&Y?Av ziE<(XPuAkshI{42H0vf}9B*;6)}x26BK!nmssMg7;E|*5Yl(imXN;J~JxW0AV%?5@ z`7PGBB2P~e3pihoyY>@VL>o%ZB?fT+C}3Bir#Ao#3+~jSPB_FxqL&b18%573j<i;9 zEFBBsX89Wde?#+rBA7#W(ow3?20{HqeN;m^a>647?c&7PqBUx4Vm_C-D({dAB;yiR z&oHDOqz;^7j8P_+@^Fo1bMt9rrkOW0msqn%K*O3u_^_yH2SRnRW)RDJ6?ia($YX1K z(=@fTfK<IvKGzcNTY@q*YH@O5iC*PHz<DUTSYbO8%{ZExcEX5w^)#aVy5Y>VYRn#5 z#B%)Fr3HEkk?NTs#bKneAE(#4jR-{RL~f<&RW2uz<seZFB88dMYQ`E{fl#(<CueB7 zqrPPZr4P$+(lrsHS1rWPkQo4J5=&PGbw5C=E=Oz*mKl+DqbMD;{n3*pO#(n>y?Anf zfy~zsfvmN$bshn%n?1DpboHW&e#koR2`oaRVE2z3ryL&d*v$Owl+80e?stv47aY!c zi_-x>Zv&vC8bc=%v|7xgJklbc3DA!NR7qmIcpmZDm5vja5V8x<I`c7~;&#pU=Bm{# z?VcW4cdo7hfquNldE7Kl^T5RUdZSt~G}?^F>i1U5yxnEW>`r^9R?{GBs-3Fm$xRIw zPn!%En-Eoo-(YUn&a~=vrR|ixnbx#BO%3|Ohbm!LGgW}~$x4aFq;IX0cxq&IWdc=I zm$gl3ub*_cs*Uu+*6~@N&7w9K99HRQm|h&8B6T(+1f1!4v&tycTMc7DghB>(X0O;g zR>N-KwIID#xzi$8#*VJ4q|e0-l;(||j6br-U}r0#N5^%QT~Z~t#Z$*AZIw%=N)c*p zv9hS8fn(u!ciEe|q<xj;Vv2sWs&BTI>}#57uITAkYle00RlyFj(%f6ng~@a+r13UG zcVU0qMQ)$4!!h1O=hQ397U{BwEDdnAD1&)O-#AynE44NbDCs(qEiSxd9j+NKw{~3Y z1$JZhz=C%%xVY$YEup8-OIUjd1)yYs$})&Rgs^l&nt%v)KFQ)-S$cLwVt;FMn`%-F z?B?BA!>$Z&FX0`Uq!UE3aG;)}sZvgPe^o{IrBc~oce%MrZf=;Y<sjWHr-|33?d(#Q z4hVat-2N7(?JE1pE^B|cNM5HO9y8Q;sha5yYisjpg&G&th5dECc1@LDR%75A*v^SY zy19G0zk96tA!j4(^)9mIBjSbX(vgPQW>bx+ZL&vHUfW(#KH1PsR_lz2GYS0`YcZ@~ z5STI1HvNRjYBicCOrsNHBo-D4UwHQM3CrwkZOvTe$^N#Oft-;umRY@Rc5ZS=Zr7;C z)l!$Pwq{<VajQ*o`|PaS=5&wFDvdJ=mD4sk;gpS0vyU3ZI-A2bg|w>1Ntd8TH*1|6 zAD2(gt95f8&w_$CHsP96n`YIfiRp2-%j%hyjk_hIHkJ$8x%(%%3ft7YN<B5^w$97- zHrKdaVnRG|q!OJ|8Rtx%DD7y(l|a5Uv9!iJq4dmI5fhI!YN8Mr&jHt8)~F5s6w`=w z>-wF2#%`aPw$C{6<(Rg^9^373V>x`rr4~&%+^%UH!$cNV#10(e6H%NwW}KA$Uf0Zu z{WLU$Hc~e+X0zC=6E@2PQWoAbF=?}njZN6_u~~6svsfprxN2jK*(l3>s0*9bGBJTm zcmTKBtdrx`iE-P66;Bu~Q6{ThFf}o?%5KBL%%YVwhO|K}Yp97{<y4u+#;8$)xf4ji zWrZ-hP2*50je5)kBqx^D-$X|vCn^G->m#&#<=nb)m&bsBf==2<8L8DY)z?rr5~SBu zpi>Gi_ASykdzgeqw5-0dr7yIgrZJm`Li)<nE{)D<nZ(n2>Su}_F*<!`V5;2sNv3q* zEjHiW&XZd;=Jrm?T+V;93X#Oksav6_8mhRV9H-poA;%--JV>9Z_HX~B;Xs4yqvN0N zzJM%J@3kFhP0il1owJjpf9+@@sBw1;U6gRnc0)N+ib*vzl?*%&(uu|MFJ|$!Nxc8& zeR6)Qek#3a`lC|`S!MARA6iDY_v`}UZvK*X{yv_TUx$`kh7~p&ia{<m6vQ4uh8?*$ zN#1Cz_7ohdAL3EDDScc)hjHMPq)B@T1*w{7I!ADALDAz53LYy&$bg_17%7wo`vRl6 zXX=!OM&xo`GU4&{LRc?}gzE4Ta#m_a1BhndzI)%$1TrXD7&{&$STev`m!R9Oc`p3g zEqB~>^S5sKvmeiSAN?>$uXTL5yRPJ4dxKLni@zO=Xxu?-s4#FzxcbQrlujgl{09<| z7NRwtLO=2T>LX^N6BYh26W{)qGZD!jxgL=~#Ye9i`2+!3!L}o%1yEYjmD0dSH~pNV z@2Y?HFR>U+mtOem4qN!qx6}T*MNSJ|0^eJwu9<1?c~jb@rRWV6j^_5b?H^fbUpZsh zBmA^-_trG5lP(t>d!<;4e!w$~$=3^yAcy5W$1ncupLE+TdrE%snCs8C9WVa=W7PS$ z0R6zkU-t?EdlM&V$y3%>-x*s>+C?YrS5#OQ1i!jCGq$niO2H05jeWWQqHt#&kbeFV zI`rFJa41<dxOpSu-5xUiZWGdI+%%t<g2E>shyPOCTZQzOe^$TJ@0lRq8+~O-b<jCG zun|p|wf{=tUo|EI3Zl%(dw%!&tDA4l`1vt3Zs5PSBjwnwbNNR@^mpfaM_<Q#kL=IU zrv0(x{l4nqrdN_aqk|AZ1fM~8IKL-EqwCOc0g6JRfB^vAd!<hN^mkAl&O4!f;qnbX z-OFTqpZuQ>X*&B>mvR$?r8^tmnR)}N`ol-tvO0g#_*s5^DDR);?_s$pq#pbf<!9|% z26_So&r_B7)?HKlvp=QjjZgXMw*MXf?BOYT??YpcZlme*H;vPuB~$c$o{enhKT&?t zPN${e$8~Q@214R3ir0~{qGvmwDgPYczo9Ap^dDaNEi!xj;unAVZY(|dhoAiZ-ctGx zpP*LmouFrT?znjV)zh@~O_VEtKC}GTN7m1kkSac;xm&Wbw#XEpquiW>m&+{&%!aFB zUS~6-HC!3HM-Xv#;oNQrEM`bSGkPpEt?NH>6!~HTHjKMF<e!{&&-f<s8b4U4DQ35h zUV;M%%WYpSo1|dYepL@_TEWDRH#)HwUU}=~OR;eDfGS{_$X>>q1Tpo%O#losLVPcu z*HLSb-mkDB6{$0>x{wtqp1D|&d+}T?z`N>V4=xUYpsl4B(+bLpYmqZy`KpZ>*Rhc+ zlHIXIE$Qg0%U32{kt;@OJxwXnTQZVUk|Vsrhs1bcb>tb^%feU>5Ex!8i;-&~Y;Fq+ zYzYSo7M}$yX~IHB{(3FMD6$4yjTS@_A0sSb?97V-T(|@UXK2=h6Owxv@m)YFd`1wg zscD>`bO@S0=`doZ5CIE!>jJoY9626YAzkEduK{;Y+L_1Uq0X9^HX<zVlxZU11*Kes zJijnE&yY(PQ^0b<>Zj*}{!n1T0g=RnHPBU*hlv3W3d!W&a6r!grY%4t)d5Xn!EPQ; zu`FJM(Z*m}vf2RM%p^_)&{tUSd_^>OCdeoLFiD5jc=dRX9{HlyPul6Fd8C({T=LKx zyiEGPu$B%&h{bdz0^-PTe|P6GAAOHGYtJXU4ah113P)3%{8q$?r$aW)1l~>`2Dnvy zIqbpsTnOXSRF^z)YzD@}0fa2Bqo=~AOEV~$`mBLog6e%Xz1Z&#z_7T<v(y|HL11C) z0HOf~L$mJiKI1&dD$poPV7qN0+BHqP{M`wNzl>&u)7TdXl^r7Kz{#|-#d!qZnF`Tw zAk))cjSo(7K+F?+wra^Uha86Ru=FoEeDusLy$GLq8o1VdNFOinu?MY-i?iXWAhIvh zi%vS{Xm4)_>YVwu-KWu3h&@Oz*}Y!WFU{1!k7^z{{=-)>jQr4T1?f&<*3Wi#(4i$P z5Ykj*x_)qq4m7xo@3n!_MXI7F_48w8h1<U{_3z_<nyFL&n+>+JHG6wSW8%fSSKInQ zc@H1(#q2waB*8Uj4|XLd>XNi4V^7dDf+chJCNAyTo5%iq7ca3t<-`;dXDIWKnmk@3 zJJLBESH#)2tGn<-jW{7iaiA0#)phjXhhf@wGG1PO;-d16#29wGGzTe?eFnM_q@MR) zXJtZVM`dNl;RB~tClj@Y_n*Q%W|}U4j{nw$bXDg0k&j9%6ECVi<=9ga2X|(k-LXLH zKu<nU9GBJ??b@YGJCQb-mVxR+|Nc?U4?lnT4Uiw-f_H9_Zp-R<uBnwqDq^PNUdq(8 z+UfAeJHEUt?{ZbR-%Q??-Bgg#+VV+#s*s*JmgT1d9}S(%*)z4fHkpQmaOTA81BZL# za|%n!5{2cJ<pr@-@x$m9reNq;^6UJA%H3rb%Fm`{ZOyjO6D~S4ZfxNA@uU_y>C4iV z)9pJC*moZ0oiEw;!3-VJ)4cbovuAVJ@n1T2#l2CT(|Dr!?JOScGt$kUQ>oSQz8$0c z3oo3l-LKx4&|ICpm-j`Osfw!O@1z$b)PF`>K3n|4v`dpz(2+WLDo5T@1ja-M6YA;G z4|*y}GSg!@N98FWtyG2Ne;<7`1+j9GI1{tz@{ON7eF4$&7d)7^hlS0OK{yVzJhnLn znP``L1-*MPw!8CEX<Pj9yv7XLmU75P`;YjW>Z;-{Ozo-Zqo)gJ+S1a+>Ed0Vx8`W9 ziAlyJ)#2Uez$(M0(z)`pU&Pm4`ZPh2E=)N$MO&xo3v4<w;TZQ&i|Ba8z`=N7QGBB! zK24LHpHGL>bRcE_hoZE2O?7;k=8c#)y3)z>=~5ax?Zvo*JK8SLmB%VoU+(Pr{CJTe z@dSB7b39CsPtpxtr5)vGG-osVPto<qOGZz}Or<4AE{N2J-L#rEY>96lea&0jQP7jR zJ+b=OemiZOGSboXqI=d$e?#)hi|_0Q|A7Do77Sk?R7I3=7#7=14S2DP3#lBLSHg^O zt|#nw!bL0`2nR!Yxco1A;2I6);tL?q`odBO#~A5IOFoYUV5tw8&*{lHE8UupH846b z4UGo#WH_*}$k>}LxI&;~6ciUQ=L^zH;V_6HJ?Wu+^XSWz>y5Jq%^+P41d;c_pkxAB zP{Q;qMbCSKNA!3(-V}nl22*C34#6}f?DR$M2)K}a6aGUXdOm<M;qx><Qh~ogU){lu z@H}jE`~hQ_QFQpiYv{!V-y(2=1rn2Wm@)q#C<gNN7Nf;tb2ulQw&2(*t7U8&v!F*2 zOmkdjwAvig;}h2DDWrt5j7>W1V`CP})VO7Q+KLlaso8?lqe{ydsl|b1%o+k~x&!8F zRts|-g+)HhA9!tAZo<=;PA#7uGd$d<v@s7cXCoI-I`a=7#V8K(v5YY#BDuiW{miAW zt~2FYEU=njzO7?Q9qw3T;f>hFtX9(Eu~2Xb1>*#>0-+36W{7fJ;5%$&58W_|C5-wK zgV5JfjdqAq7d3-}@uz7|MTlk@Lj5Zfv&X?V=$LJNs+ZN(Eun$3nZa^rj=d*urs-0U zHZ4&xC&adT-g8y^>S<d0dbix9)S4PbH5uEzJz|>H1+Fe9{AUSG|3g>t4DTN&W;UJj zyq~*OrFsl$28>G!FT3Z)_V<3E`v|1B_#i!2o0(s6qJ4km;hIlBodW~Cx*YnmPc@@2 zSH1H@bL)R|n|?F6HSN7|&#C{Np^b~-9r-5`V|Y6PdwXeG{MzsvrHA*F9jo77y0hfn zN*Md1oHLkF%rSNgh&d0tA1s}~HixEv%pmHH-Oa93W#o32q+1Fz?9~$`XS5lGLE5s2 z3~Y(Q?y;5-7daSi?>wG2m6NC8SliQE=W9ygB^m6e)9L8B!a657cw-$R+F&vfWG1mA z#uTKZBq%dp0(mGN_uXpyx5!;c)_3emo~X=TXgw$0kXl|WO^7dbU96OHzPj@aeT!jt zLy|C~4YtLV>B_ydYr_}Lv;8NOvAO%tTIRpH5k*e59An4Ep6fV~EbjYwFtbdwA)d}0 zIGLBBime|Uy!y^1xdjOg=axoow8cy>s@)sh^vsgWI7d(Fr=4Hj$tYDBh^hF?b99R- z-qvPgSuJ98Ma38@&mtZgOdM(-iW-z^L@<@aDf>u6Um~Z2v#PgwkoJkaYA=&eV~xE} zH9s>ycXFm<X4RajZx#`Hrr>%qr;paDpev;}*!yL!DgJ~L8jd;2?YFb$rkCu*^t}BJ z$1E(hW~c2g*OX%xst$+C?w+RXYiC{V=_&Wjl;6I7dT!R?p7zYxaX!jD=ceqdr)Q?8 zTr*y~!@dp|X6NivE?3ANg(SyeJIn1@u&=?hcKe)zvag$R&e|Ph|FlC43L0gY13dRK z@XX}?dt%zHsp}sQEZALh(@xKHlMRKx=Emy~;$jBSIOkw{g~Qothp}1g*0$KDB~sUD zi_tl4luiq+vvbZa(eT8AsDI7_O^wSj<+3)nXou}}9N=Yl3u=buoHG*x;|tPW_nb3e ze|~y)&f%DIK+WSsZOq`R3+3Bu``PtVE~#|Z<FGrWJ&O*!dB`|7=d$A!s1=Xfz9{aS znQJx7&DiI4oep5+n7)G1VFn{l&Dydh$-j%b&&2bbn*OQLR^g{owbSkr_e@AlN=|~o z;WV`ywWPuz>9@EPjh~B?;<MbbX$xl(lBQ={5*BtVWE@9Kb?vw`HbdKK7LIGo&hg!6 z8u@iCuh++moiptpS9YuQ3T^3_JmI9H*Wj>2OJ$#a-a6bfI>s@}%`!8In(mgzjmS-^ zOK;S_UFmXn^%yz~&e_J#2PgHtQ<X9?N97#g=p7Dyo6;?fJ2TnyzE~`DDbF5sIll%i z*UNXFq|O};1hYQ>q&Mcv`jc70opD^3OLQnX_ekf_@~sBf)baGBw6dg2ADtR=c*F<U z2bDW!Yg27I)jKtF9a~Pm(Ginelw5keHRkAf;r{apWoPyCocCt!yd!1*?s=W>p50sG zwI|iYx5Ty|K9-rkGjZ0T>FAwsKQDY|@A<4Ra?&ooeW7L6_Q83{>zxNX;z~a5`PYzp zF7HBYtjRgszV*=Aq#bp~*&iQ_YdwCTY|g1pJ=k+NF856Oj`BSR*#}Z$zZNY=Yo2(% zcB^qZwd8ow+v!~&%N*~#!E?<tA89{upk!zJA*a*)v0&HntlbS?Dra5d9ei?M`+>#c zc>96QJ(jtq-D98T#kL<!C_0*xn0Y3DXUxEh6&{!DP0{|mBW=g5pO{^9sj>aLQ*(AU zAG#2mle%wzwcRPNZW(t!&)wa0WXEw%#XFyWpq!a5-!`~Y_GQuDws`C3W6rs==lkF7 zoSkimtKaqB>HdAKJ9>AgpFLjcnQ4gmI5Q<H?aQ_u$?uhw@2}eLj<gn&u?b5fjAJ%| z^uEaJ2%Q2mOBuxlESE$^T%>>6UDK}V$uoQMD>^QY)F$<}9_`Mn&2l(w=aNLlhcmT_ zJh!_su915%ekhxC%`|*;RA0HL$DVY6?A%l9au4LY(iJ%;gr#lyl4CK=d1)ESZCa<@ zUA<>tXW>x6^yyZ&({OC}S<b-|++1lwOdUU|d~(`3H#6;gUY65W)}PcWIl)eGI7jp1 z^yeCLV)6zrS~4t-na0|>!@L<c_vlGc^C?aq_naVGa`Yb!bMD6EQ=IritxboHOR~<1 zlMfd<BN$`3r#mql=CQ0Pu$ky7e?JlftsBoSSfa<13+xDhpp%q#(5@tM5NVQe7iKNQ zIM%3o(uSbbid4w=nE?yU?*HTLKj7P{&Ocz>jstCJDTNLwZGkchgoKctuu6c^mQtER znSn9_Ng$9(_IBcU?<p@?ww7%T+p;BZ*_O9#S+=GnS<Bjc%bMqX6jtKU-~a!<pX5ri zbnm(6oO{l*pYH?z-C*{$g9+FMMWn1Qrvtun0#$IjtWGc#JJ!ID?gWW6+da;NK^UmU z)i<~dYL!9I;nk~M4yVI6LIwi%JD^_<XwRIWU{;sq>h<uq+X18|Y`(>M^&+4!4tL!A ztPO5sbvofY3*5s57G|f-1cVQowZWNy4l-X{AhSaxDm3AOhJj>R;gd5#RIQdcS}S^0 zVDr`$Yj&1^B3xGmTJal|1Rf!^DIj^zh9=(qqLU(N8EG$|be;Qbls1(4K(4nw8{8e< zdJJ&o?i|Ux72|nA@ulil`l<8H)47-A&f=_Z=P4yIPhoSi#SCB#<`iHL0JVW^Nf2J2 zWQoAx1a1J(6c$SijOq!dVmAX+k;Mpy2iSl%0WkrLBgwJ^N8G&f+g^8kgoYcgG?W}0 zgM<m%4k?O%K6|la4}E8#6{H>Bzm9Vb51pbEU`oCi|Ee{wFztaO`NtVY;avI-;DkAc zj0dK~2Qs@qSp3*_VDvEIP|20(6)+Zj{dBMPI%>Yx;`E7f35{;c;=*L1$8L8!%vObF zd@xb`3<_Go^Ic)F+hou)nRx+T0bt1zyy_fC4DP$Wn%=JbXZ^Xf)=Stp;_P}8)Y+4y z)9r^b2mH;zsK?*kUwr7q0ZMLR+2>dG(6b7t_n*NWJa!tP(OqwLqxjfAsh1m$e0sDo z4}HKrb$Tb|NE*@J49oHALcH45nE7Grd<C9=yaeNMkv?qs{K^EcxX<B8Jw<P0WEU3E zW#z4Ai&Z%*wyL3<BJ%{idcNsk3_Y$TbS?1);(%C-+=JsvDB(3G(eG(cqgf|BXJ$`O z*fnodsmx-g$OPV;`=z#;ofyy+2FDh_<<;rekI#-wtCeU@tYOZ!?;Q%eW|#Hv5v#23 zlfHB1)gCA7{KS!hva?^MIlV=ALREU{7uBix`_C>qtPAIla2)OCu5UU9M(HtF6_9G% z(*-k|yeNdSde;v65m)p6Pa97am3tlI`&%y)^NUZknY;~GFcmp17nv6u4m7oPy5vRq z0$XCGS*|{uB#X+NSbK)6>kdFmyx%>iTkL=~1WVeaQ5hBA2^-%}a3|oJ@#kz7Q_tkI zXl9YoXR@ifxB}ihSH?B;F~_IuI-Sv$SiLql_;7%885VbvMe^M}ekr=}w@RmWiI{c) z3lj){7!E~DfBns(=7($`Isj!b0d;Y}wzooJrP+Fw0KhJ`Ld87*@UmJap=pa*0<T8% zkKjgE_eKoeG50!R{I`?{NMT@*?l{@^dRgS!TMP;yO*6@EhhrQLr_B$qd^nbDE1mK| zs|A{veI0%JUQKOAY8^sHi907UcDb%;!o;O@OS+P}+q#zEb*L+)WfC?px<j%L4SiPE zgejpRM1SM;(frrJg7>Y|mb_?4lXOZ_#8$lpR!6`CC3RQ&;~?+rzB^}ye%^G&*Xc{K zDU8>MM=SI)PojKR%93)~*Y2xdLsH}QXMg*(;TowC8u|8X8%Vff`HHK;ZQ|=Ph)nP# z+7Bp}ygZNCv%&`|Ef{oVZeWJ2?DAO)x>-+XY9+OSa<am6XvzalvWkM4B?$g+pF?P1 z)|F|oq7?hVeGa%n-9qAma*kHW@<O0M&;AGr1V}8)R|C(Xo`SFfOFyy=AoCoYqWaS0 zg4s|kP5TAk+!LI!(Y<SOvuRP)d=$BSdUw3wjIH^A0r^Crbl<7Sd-JE~YFrW>vi_+Z z0-<6OaKhOH0IGe<%$nn+4>rbZzD2MpJ)}x{BCbz*+m{JOKp_Mao0pIbOrB9GY;l7m zhR*-7hx{dg$^H1!ohN?R=kOTOLp~8`bh)5D!g&#?#=f@&On>Q5$G87E{zgx+w)B+q z@-{p0$Y0F;UXM%i<fJCf<UPbyL4?NgQLLC=DF93Q!ijgjM8}?e@vr)gzZ(AUkI0Ib z{{AcvybrBwgNSwbMM_{@=P_FN^Bpf4=3e})69)0o69}Dnz`FjeN5O&j(8Aigq;-Gz z#PX!Rf9)%6g^#^4cWC>za`f@eONg@d#g81%+(r82=2{rU<rnq8Dtm3)QPH*+{_%`- z{P}R<t1onV|MAq>zLZzM-!Hv)_Ju!9zGHfR<k{P2O7D5^Phh5tZLUqfsdLX%?aSMH z7an-)4`**2#NF+`wxRyPDEq{nu}@xB-aYr#+bHiDw0~3NUprtBjccG7a{IIIMYcY- z2ld>Zbq{9Xm&NdqZh84lga|)h{7vhXC*$Zr`Ah%ZduZ1OhI>TYcgJF<A2;{>da>ai z)5dqi=nwgUTYIygN99|=`IYyJzkcprd&2wK?c1Y&-N$}Zf7{9DcH)2Qj`<#HkE7c| zn-3j&`rv8bA7@Yg2jx7f+=PMo-TUU@S9gD?xbNU!-jUotPPorq^3?$<IP;dRsk_xb zCZacYVgHi)2lVlg_`S1Vy@m?6pwG6UxBihB$Z9)!?eMGrjcj>wqhsKfye>s-_=)#m zAZLH)N3TC`|KkGY>BK<(+MaYW<6Xmj!e_xzb#e#l{*9gXJBR-0-3#}YquY9No=24% zU?6E5z<{@&h(5jjuV}{}_G<mDUohv2f477J54Oh8FAm*IJ9JZL=zhV;S5f+Q^js;7 zgLU)Xj++h#?%u`X&-_V8zsoj1%>{qv_2Y=4-&WuM>7y6PYYzOj=Zk}(KhAXC%Mw45 zC*At?rs2de9=D^NFTb%?y0z!se@8xgem|Re=;fm@4C}xD_R)Hg<9=z`pJ7qS|7`kl zD(79py_&ZB-fug<0|j=zv^6WdZ{MHw_3L*0%a{5B60f?HSX9r#e%XjaqB}P1+%P}> zP$+N1{#wJfznu0T-mHLaK=|2W#cd|<gEKw%_T+9y+sgqT#&}z~>E=e1|HJ{T;DPs7 zonF4EqUcUt58sO<TBXtHh=aQU!qc@9WFH4>{IC25$eiI@#9m`4q(IRbuG`HOMbS?p z69XP_8H7D1pdt})McwDJ!k<Vx1}Qn<ESQp@xMTuSBjf<z;{<E}B1Cm0yWqqW12~uN zu#H>Pr#FDzXB=uQaz*hFAC~DamJD&Ixfr|J2dE`#@&KYs+z^N-EG~+1W7wpC0MP3n z!4+_XtRQ_h(SO7Doy)#40|=Zb2qLuC$pEwCN|Op%LqO!*bIVQylZ^krJHOz;tvn9_ z%}7c6&wp~k8b-(f_l_Q1F4C89$o6W36!a6AqZRg78={E@)80gT=D_0&c!fo!H#T~w z>*w9i?Fy8o%^+)4ni?@qjY0Bb#;+h$X~&<xWZd3QB6r4WPK}~YEE1e;gb1Hwtfo8i z!KpTqv=KEYo%0l@OHfxwK?mYotPh~BOZYY<I!8isVtu6~a|G$qFmY22Gt*7HD?5gM zM7V2XG)8H^@IXImYs)30voE7GWxV$Iq&_cu(e?OqT52=uJ%L9$GBwwxxM2?Nbl>~8 z=VVUG$)_U6*Dx)N)tA>Se(+r8PhmoK{PT^2YdE+4yYKY2+~3Zh|Ce!f`onDe-Fbs8 zw-LZX&e^(Z>d?lscIsD8qjw(J_eV9Sbv0RdSN322>Rg-pL<i%?r+)qRzn%#^d*Z25 zVbYNY^V@y{HKTqU`*2`&fBf-(eEh)gg8$fX>`r0EtAJ;JW>v||0{#7+p>?nN-`_Lw zyMi^PW4C^>>f#Ue_xGhAUS7QL&cn`ubssDq|NV()2OjD~zk}($d&k-w<>Flm^k4;g zv@-4O!K4#Uk>2<ac;P+3rq;9H_-f;+U8fe$z4=G<&e6!-Q!S_NFUJ1?<-a`mlY`IK zwXa7T8YebOl0JJWW9H82;XVAvK~wqh_(SLZ_-=e713hrZ<SS|D;mZ71(S3{!IRFN6 z>hDjZS1zOX_g#7hU3iYYDtPeiALy^^*2Z_AIlZyqE{S6LSLbMVu%@gpyjPjTkE8dV zJ^~!#4hec=$JiYsY5!5)p2stszGqx5y}J!`;hw(_CAEKi`q*>XzjVEJ%=7E^`-;~e zo&I(4i~lm*k;&5%*P>O8?A7M`_wyDwKacJHP<3|)RBzpVt_O4H#53ne58Ptd@lM|z zeV1NDxA(vMBwzo|KTrHA^44piw|2GOIr;oo{SW$gy?%Xv=iR{Q{hz+IYfACP<#$+w zPY%msX>WXL8u<H#k3fug?*a~3_%6T}{N$}71Vohn>U%@MgKw6_vOfe8AV>{&1&fJ- zw^MhrOYwnE<b@xf-5n@6{K^j0y5qe*?lE*^RCEMQ{O3K2;-gqq2}=Dmh`i^)bGVQ8 z=U3l&pa%WpnfFp-q|4}IiQ&U{+K2v=@w#OC-=k%vv9!0oa0?FvG5Oc`SLT+W6-8T0 zz%A=MxBsy=HA)FT4O${femS#u*-Dq7<bhEw5HU~8d$WsEI~w)@P-U{m4}sco@P8n% zJETM=4Y7yA@fk%t4xR)QgF?Xo5DDNUU;l?ipGa(r#KGABQFG`g{;348)1(i1{f=ZO zsO;AhEhhS9!0rRM6Q9!?F&g9nj~DPh02$*~5dfYHM<DYGlDnZEaR@=e>eOwL5vgK$ zU=rLh!65Viyc;O~^N0_{qN3RVn)1b`e2Keq>l&$0i$s7t@laAY8d|v&f;#cbZ=NtU zjJP4flgRSUKu0{5&bDrgTo5&CCxRZgHQ<NX%wPGSej<M+ps)o24s*%niR%JqFb^;6 zJvRGMp-~DQ2^sZMKCv(azz$1JLlmmgMKxrLuF|iqbVFzE9H!7tm$DesF&{F>%pSmw z4TW4w5pZ^2KNnDhb@Dihb#u^cyJwg*Zf=@Fh<)N@r+{EyqV|arJ=9lFhgAwuR4N-0 znP(?-!K*!V<WpaHConQ=)rthOhJeT6{Nk&J&5hfup35}}p@)7or&p)svwOP-`g?{$ zUa%!a2l(yOnT{sa)gIFJ?)WRVgK6}K<thM8l!y#|wL1u|<mEm5{nS}B`1yJ6!K0lg zi;o$qKaZo4clO!mj}ZvC^bv8Qi-wx+VWk3+j${m;t8><n=pypoL3rttaa%8kKiV_Y zrT53w-m3i%3tL_+X!-{QH2<JWE7pW9Cde<B2xW4=7ra(uz1%7M=rm3Q!u_3txR*0` zTx=X#as{+<lU5*~Gx%*DkKqTp$lW#9vWqJHq*{EOdlGx%eGlq6pVgFeD7yjsO&87W ztR91gEfy;UV%7Yt?dmKBj7ovct(PsTA#qw^@FLM{)`4HvZGNNl<u^LUp^Nr}O$aPC z?wIQ~C&V{L;ubZy;bO=MK#1thiQK<ExBf)_46;}OfYq!s>mmBkZ2F-|wAEEf2Ph5+ zQ95E65w<c+NIh$5?`L&+seN&n#2}ceK)-a@6DB7xG+FF+2du;xKmi2+dl)tw>==Ne zG{bb=DxDF?ctRnVEaFb9HDFn31861Ks!1?yKMBtCX5z-Ve&mhWR>A-rfDoH(|AB3o z6n90FBcSsx7Z$ES+~`d~kYwT^P>cLV2qd|FQ9vR}EF6#d!4LXV0LDO2KN>=`QGlAb zaJmAE$PkP6`^j_Vd<0Gc@G%0oWF!U=-4MAELYhe^VGjnL>!e}`vsQKn(arX5w}(Fg zR?nY_2h8SPA)1~*3%v>&wER$fb{`r(1p?M?P9%W6GTL$aWLD|i>65t^^>sOljMI(8 z_arB}mbVNNXMDQVt??)VbCV#0-NXm5(lOW%KT}G09$wHh0rkU1<8-*gpG^5WB)bGo zuMb2>bwqQrr0HxAgf&#+^BO<MANi{HTwi(kWIaUQUEg`Qg_qUGpLI@&6bguzyGdY2 z^P@m4Z}sy-!_gVHpNGcdoY>WSq`yr-weJEIq3<aj&d+SY^=0u>`)iw7CF55x{0qEP z`GL8DFZ?&&<3W)?&z_j<(@&4cVY0iWeq&!y8w2t&?U8Z0aYb8b77BU6IBs^T)yS;( z0(sGhyg@BQ&U?ci0PqWXV?MbTJ|h!UmcMbP9t1(u<zBQ!=lj9j6I`?gG_EKY;sA7j zy#=l>t0ugp@Y8NsF`yfSl}3;dqqR5umaq#fpRVXqQV4PkLoqnM{+#%G`SE}K_Vx9N zYhc~qaOL;EE^jrm1S0cwD-Zab`=|>bv%r)HuO7F{m3Y1S$N$gQtEa*R-(LOy?gHd~ z;s3hP|DTP+GrN97H_rI~*Ka`ZkEvtIxC+XfD;8o(qzb|j1Nfo%H%AEGBg*6juw5+g z1h_2xe_k73|FcaS)^Aw9Zo`Ik8`rJd6a<MfW&OG**2UKUY{UBX8{n69iJzYcuTOsD z)8(xIJu|uxc!rU8D1jvun~XqJG6&crA-E!WB!QU+5&&Ak8}@;6qj3Ql35-JVV>=hc z6aZ(Ntc5Vx75*1C#<%=z^Oh}}w>`aW%cgA*@DkjzV(Yf8;VnPkymi}C+qP`ox@9YT zy=ilFOY)k%H}>LB1D{P5#E|AcS@@X5f)-^)h4<gxb}7xPR7J#Ue;R~Ydm?H`lz63h zD&SFskkVXX_rx{fn7jx=zD|Bot`sYgRc@Lp&}8U60vOS}%>=rkv)ru+`@)`(UV}Ue zaiIq4JDHWpqXdKR0xyN=HA9%=uVDnx{Y_h+gg$QA{N$5QZCbZ&>z4TDKWy5(X%qai zb!*~%(<T_iT6o#CcFR*R$gQy-9?kK{$J>=)d*6!?{_y^Zf4sNz_5Sxi*xi1y?q9D@ z6W<zK+le`JZeR^Q?DoZTYO#ijzJWSP1y;?j>|!@%IgxCe4+R@ummYX`SNYS!PxKxC zDjy-{VCD=&5!L7``l-sMu?rY3u19>Xe6VXgCs#mhEJvufIpqTX%3KsZ4a0#M-?Vk} zh9_1(^2nq2KDvI@MtA}nR<C+=)%rD$Jo5OKO^>Zz^XOw+Hm~|@%OmSof4=#Vty|Zx zUcGknmeqTfKOK1H%{$}hP|d3m^#0hFMW0a4<X}JGzgd2?q~Jt#-qXwvo&TBHRq<b> zBzA{NgC(OxVzC*WIupvO9x3uwLW<62O=?BKQ~i6pcjAsNeK7f^?A0hD^BJTla#l?d z@FZ!)VC!^sB~sz}RC<5cD7oGUE}GW1m2^ZQ1DQ|uZ;!9rvi9*+_uX^P@9zH1uYdE0 zyB>Ue+m^>)IFWiL{iV07D&JVM`S4pG*PY+^*d=G)xo0m~vo5~;=t~!JKYn7}+8b6I zwAY^=NB8=_{BJ@3m#LD}{%U;t`TYeW`Atpb4PSgoO|N5phT&d}qE~8ahv`_{T<IjE zt6z$r8!jjXBWK+kuj0SlPrfpBO8BAVWNXnr5dM3oDa07^GAP*kvHViO(Cl~{VYXMo zW&>8`TyJqH7*2UB$x~D^1S3D~e`(dK`|kV0Z|}VC@jw6V-|xQh%2S)xZhGQF&4L;A zTro)v?hl?&Sq8d8weRUbib+?4oc^!97L(H5@#JG59bQid0ub*3uv#JD4PYJsK><aU z&}|8&0U|$O7hHV>=^;50WR(OG#Y&J=0XYbYwnqSOCLuY%N7%%pbu%E1AV|$YPy4oS zeB{1|*FE>%(bGrvfBxy-JqOd@er)}~@Vf1)gKr*wbfdZQVdd1O-<Jko%<{ajVPlc& z`A1&&H*eXz*IR$z4f74LZ(u53f*|DW+n!nT^7$is-hA!7PvW1i{^+&8{AK<6q4o#Y zFV;Nz$UoCOr4Ok|Yt|o){WZh)!n((DozMLV<KDhz(;ut7PwiShZZSw>K%HU`5}Ono zgXW+1Kfht)v(LWr)`649j~@K;z~M6o9(!W*x=-~p^2HtN36mEz6_2W$);xX${Uz1? z=k=>|oiF~W#`^S{O%LazzunM0Xl|Y!XusFyN6Bp=Fb%7PS8wvtw$%qR(@yQ)dm^J4 zQ-i6<{^GA2HvW^}e(HtCGQ7{<B`LlSZt~b+v^_Pl{m~7%ffw%m5@kK|*xz(x58W^` zG4!ZN9U4&wCQNDs1cOKnj(|1VVYNEMQUu8s$mo>^^@~DV2@6nYP{T_K&xkQN?(j`5 zc}6co=<n!6fG>6qxpX?)Ox!fgNrTun;jm~tG$o47jQSLlG4rrIHfwPJX0klavpGg* zHCIem2lC>k4gYxU*}s=k>I-uV3JbDwh_%l>y3<|%!L#?CLRGn8?rvS{V~-v~fB$c6 zv^W2)$XIV)1sY@64X;0N!y=5M<C5$$PiNlv6-)UH3CLbcM_-i}jrR3-W$<S+YNBYW z<zhRbCTF6Ii4Dk=VH~~KK*f!wTWIO**1?<*;uetU8FJhZahQdzU{}vfTn-@LMM54{ zFqS2~K<HKE4N!Zqz2yW(?G;KzUonAIf*s3tTph|^)&pl*|HA%%{ewKoo1Er#9NV#R z3(l<8=!@28cbq%l{K4e|PdxDk<}d5Mq!Zs+eXzCZoz;gatdhU3S-Wrfx`LsMo$Z@$ zxM(XGnEMnSO6LesRbfNpl)CA`GREb>2wFN!+CO-OE~#Fubo2}aaI*SVe6FLSy`*-w zN}U}<Q;e}XGAcGz4t88_5#;%F72s_wmr#Z%<m@55n9yBFAc*kfyb;E9y{f9AV7!Cd z#=%3o=nwvvHg4PmjA-2xFQy%R@0C{%G@e=g@Y(3jRqOK6oA<}p{O<8}Yo2)Wsr7%_ zyzTL|kFI}m?V3j(-@N*fRjW2Vc_X2VqgA2yK_Rh)(==~64=UqAtA;oT4wPzww4>YK z!T~DLs-SwOTNY^qSq%Mcpl+PsOr0Z2wG<V%wlRjL&oDKkXc{jW;)v-cZoQgpN5KId z0Be(|W0Q*$ti~}xVU@FEY*sa59<bA<1Pjx~js+OWD*yJ4+qP^>aQ&_8)~?&IZtaH6 z+n)GxDQ(BU>%9Noylu;qTQ)zrZPS(~fi1<i{ru@ITi`_CSRg)Zer)&hhXQ+0%bfxh zW*WqHV}ldSt<$7=C*0?!{^vKsg_{%Xd2@WzUC`#nE!&>Bq|)i<4?OYI=FQL^$R%5V zRsUksX1D`<1a`h{>*md?Z`hAaAdtocO-U@PgjD0&@{=dGtlIY0>zh_@+ot;=W)Jwn ze(*Ua$9z6?Q^b$rejrFI;8g=ZM1xn`*|sXYCTVqK&Cgb^S+jce<7*yW^*Fri)+FEm z;qrm{(2ABBNTp42qTwirS5Y?%*lj2J(9K#33ey2}4JA2&E>XaQlrnujcMd*}1|gZ2 zrbRJVIB~z2knfs}0}$fe9K7jflX;5ew~3>Fdl_7PbE~HhuOm$gy)Bbsy74q?GCI)V z9ma!!gZqW0zcYk%pG{qCHZ8Ki?KW61659E)^UZ3aNTJ1RkbSRomgdrt^Yk4&zGn{1 zc=vWQEthRwS{vOo;p?R;xx|?uQ|)D(*COF(rlAhdV>_3zFX%~VAfu1o(Nf8ykk~Cv zUH-+~A*`yD-#FP+)`<rrf8{Kra|F5a^jY1F*xUigvJsYIHTARQ+y>epy$Zk@mvWWW zg8F80jjg|;g-(Rq+}qcSa&s$5bLqB9W(SK^-ifEDH@DB!sL^7nh|2E&p`Ls-U6R(; z+TK$)%Bt_7w$gQkw2lU0u@K+iOj3Y**jNnW$s`Kp%-2c?we=blFXCazZC7TCMrh=I zI+g=Ts=4!3qr`@R@~(;u{lPAi9TKD~ITgeTzPp%N+0#tu#48)91vAaP*(&777n0jK zKiCs<FPB_0Wy|bxDRqjap6Tf!p=?GJ=MMVjT?udAplxCpcJH`UZr9p-4Je-3YOu79 zySoQnO1;iP2iCz=&G+~;Ei<~o0bia|2!25wz1<fal<IpdB7gT~p4=_>4@s>ZZ17WX z%u|CPA1r@5;J4O-4@EE!-iR4k<>48y?FG6xQTq+2-lzh>@^#rg=w`4=fJ_1)w>O2r z4Xh5rmWc$W&<cPraiA4eQy4T0y;6O{!bo<*x=kMLh9-1-Lj4&kJv6}@kcFEx(1d+9 z3j0hPS3wF*2!fjg@AU%gZ%TVfjTW|#+&>R8&x&A$^~QFO_wCb=1}CT-YZohoqAdhN zYcU%k>svhBd5MzQJY6pA!a6$IL+n~*D)}px&5P%NJ)o*w&`Ocl_nIe^O|tpgflpwU zw3RfJE5@tbc+8--PN2r(O}$;}`cg91-O;VBDpwyIK(T^z9@4?l<A1B$c54j_)4>`$ zN7wzgq3!%!9IbO*0KuY<xQMBepCcS*%c{V!C*P%RAv%X})6+tE55v>nVXU73F^-8_ zWR`S5B*FFKAFwMaIn1mW`$#aG3OLasnyRK|8W%_ATqw}Qrj(#znv^bMP^mJqkxX1@ z00NHbjUj7^zNFHDHP>-y`Bm+O4g?k@R6JEYPE%y_vgXUIjn$2dBt}|8e`9MOzA>k2 zxW2!S;6<^+$0q+Hc&99XcHgb4cmMfjp8VMRyzPoVe+K^9b>?)WmWvBnl_R}WW4X81 zR%Zt6AVK>a7K4P0p|K9i?1efZ27+%?1XE@0R4vGwHw<Sne=xI%QAnCCVg-?<hT26` z;6O8^6n571_LXqD`z<)q*wlqta?>DQO&md?P7rz=>Fq5IVO9%PLSfX1sg2qk6+$)h z^|Qp{?6z`CMRRdcZ(}~Mq?5~H&D0MU_HmgUHhv04n%7hJUrepKVtnO!^^2FD?7Z;y zf7*AWPYw?)icq|OR7@!>#8GGZ>4Vs*b_(8yJcXuO(kQNTrsVPnKXtUc!`hM&M$Q^K zlekcOgAov(PE2l*E|>x)pI!v}Kr4w_gH}ipa)iQWchEcsRhM+)h*Ak))Dc_Qp+;db z>{Lg#G-Qp1g@(S)h|m<~S@fXELe(L^Qzg?`!WOGoYao;@8O2~s@mr$Wd5_EEvuROu zavYfk{8k;B*=kU`<V!lP&<KR4XJHOjxPN5U3mAJ2a0jRy+Ta`zr>GIBWyn6|m5Y38 z1u~0VLI`=d*&vKqm#oVc+q`=MP>FQ#$fCnO;J}6<xDOzVMdRbkp5l$P05-Bi4vJS$ z0-r(vzrP}808?d(L2C_y(->gZfnOR!!2VEF2$lyK*w&JTp^0S;gBB{O^`fxPRu%OG z{c}+-7`PyE1=2+#$Q^-1;;1L)0Yhj6`FL?ZWRk=p&gc+RW_5Yv2_Zi23?aB-Oj-lt zH27=5QU|UecRU<G5m$U-9!zmyTlYcj8pH<}G&qF|KFJln5c;XhQ36~L&h}KR<FT8| zJiZ9>F7dAR(Bn@EEL;=Sa$I)2T+)f>HxK4k%7&?h<*xcFCOBR7Eu13fNXbHNb615E z`KbD4mNZ+@D`RPhZDTzg5#!(jv&w-Y?Nx&8g2f&T2#%(V^0A5zZl#cpcXd|FE3(H6 zs-lQmKp4&vlX3Ds35BAr>B=btr(ULx^Xn?%rNTj3^?(#x&^10RB+inU{5%a0tpuA~ zAUNZf06+{#C|4tXV0DVfy!s2xV-$vj+0Lj^)C{&t0o$QgQz<W-ORwNpxD-XOk!ZzT zBum98UD6<CV*2_hi<~j#1*{QyhcB{QhdZi*wK1e38cT2pI?KcGF5#xJk`@M7QL*+0 z+=#4I+1%Ec*4o^TSYX1imhiHF9YIBlxSC>Sy`!ahkjbT1=g_p})4T-kVc6a`${&%A ztQ?wvDj?r=b-rV|yOlQI(ve3Jvk1C66QO_tFcF2tirnFz1{J|6&V>j`@ktxmP~9|^ zRnnPT&fxU)?qe8<G#8TR6*h84#t22#5H4_z#A!nP_0pNNSsGPNpJ$GO@?Kj(@8NoD zadIlZfvGO*VT0dMTiG^vXXOl0M-pRZ`-_XlO3w)?JnWFBw39F5U+t`ZBEt7e{VP43 zYdU*B)H8`iAe^?Z3$l<P^(Wp}0qi1VTk=~`+yc1KK6?!908EvTB^I*;qfU1)5(&EO zu_bVBASZYUBe5kjL?-9}d=uWRfZvZorcfgJ2n<(EQ(;iseXcniU?U>0EehW)f#dj2 zGe9<nkku2nKq)sDd~`d&(clk!-B-g@#0Gd_u>hon1fYw79|5>!AQ*#Ora&aHA{6m! z0xP|v;C=jh)&n5JCTLn*Zkz<B4Ox`QUbt_v&gKRFpLkTzqA74^q??RrBd`krjmBdR zFWE6wFj}x6qMrf~EE=r3`bX4oUE>KN@l6xvz+FLfX{+(+YJN6XU&v;@qKGZLd+Mk- zXG(foVV<N}-bOnsE98nYdm};9|7ryw4E>J4Z=vKv@w*rH6nxSB8S}L<&aPlY{m*l~ z``eCSfBtFKsl5~X7?-r?PLf_zhm8NLrK|nPEqu2y<1k^r^7u!hca2f`YtGpI+S7zv zzse}yeet7~GljeNR9rzJxM>0)H2A;Tg6RoOD|G^qv`#K-7+<1E!?wO)cpj(fxb^K; z&p^Y#!sJvdb80H|Kc{Eu>N88+<4!<M2|?Bwihx53R+c}A0^rF&!dp2BClREOC1_#H z|38}I#pL0nP$--niYKFxEW9%K{j&z!Pgo1}{*nzL$UlxOf-y;<MS!mg+z5i@mlWWH z1>-NI@utK93WR(0*%>GNE?=_8x#)7ak{~X7rETPzU9i$qfTe-ODP>9Qm4c90Z-ADa z6<}tz*4mJe2^vgP7=VbM<N<&Qx+w}37~GZcr2uF%+)LGvxL4CK0Q4k_6Xs_Tq%}jO zfUt=(JK`B#F(S|}E=m_ys;=F6w|8TKQ{u;m%7~)fE&I%@+Qk_9Xd0tNQEcfLS=ZIr zt)5s!=31tvHcyRWEE!qFCbk>%`Gb|k@+x4ns_KEkqc$-2@N1eiwY-_qdike}-Jo4j zo4PW~+)TW?l(mnIB9KcznM<}&i3=YK5ZXRjJvUj7RhD&mI>Gc@#iw%^(&{0Ouu(i( z%ZCVOiGV|<8wZr5DD)+ZTg!!$N_qJ9dAw4LQ5<E=HY%V3VPbFtgKpE0wEbqi-e@u` z>63IG{R+L&7}c*Zn2aHPvH{?b;3cSEskv_8^cFN}WMONkDi(11Ms16x0VJ}xGMkNp z1<pd!;!JiA1{X$jX=fvGpa%dcvU2MxmEFyizB*^sd;!><2nKR@3!oW9Fy?9vl}O{% z%4=*Gh>j{n15E1d>=}7}6bIb)7Al)wGcmyeQX1G^>BkTU$ec!U?Kn^?45?#;igV+z z^~Z?3au}qxgi@kzZ>0$!P_|ZA;xCG#3Khx^=9Kg-ma}V|7qQ*njGN7MqaR0yjC!+Z zLT+&CSC}C8QJ-QIiVW~(P|r%ji8rn(0&f~FOwIKZ@RH_iM{aX*Ntvd?m?bG*z!Qfj zfOb}-HKR~EgGQdp$l{%4fnL-=>SK*{L+Jb|O3o~S$Z3ca6Y~u@9S|8nCQdYi@))HP z%NnyW1WDauwlvp-Tm|g*$#zEZr9mvJnj8j2>6Ugr)ce5B=P6M%sWDD_M%XmaB>e<- zWqoEv;}D%iAx)ibNe>bVVJ)Z9xlLGUP9fNdtA~j#gg7Lp3Tsevovbp4MC6bf<d6xO zc=YT^p!6Q352E{)hD^5ZQ#lNW!DKR;jV5#A1%PhMMvG|33S}TuoFu9xuK%sQ;vj9& zWHKA{CbQtOD{+p=Xpv^vbfN1eD2D#BIHvQ+)kcsk)h><CB#k%2=3ZRTqoq7y(6OXY z+VG$^#^w!Smk;Eepv?nyR16U-G6*bo2}n;7F^H%!bdS24XqRiOL0fdup@TL|BD>$^ zRY2(gWHpciFg>n-BcfeEdhl}o#48NA15U3~2vfV!q|n-Y?j@lsZdkH}gdkDH8)ZnQ zLkby0^Vk>tBH%rdIY{6RORPr4qDLDPf%hH2y1$;D`knssNTd%~-5xtA{zGQt>3+YZ zE_b5sVn%u!<$TU1)<j8PQ)+p``=a^=VM_I3iZ!mk+g^&%_GgXtT;?=ZaX-)KAIqQ! zOG^0}ja*asx@oe39UbJ)s2&JVOeaGt)MH*FSeQM)$C7O>D2)|cod3Q%_-9Kmww=4s zmT~z~jXlvF-3h2vRUpWyZO(43%x=5HtURAqThLla!FL}jDMPLIG+FgJy}k7O%v5G^ zhC=vBL0cw2D_2}_xu4wlewO|EhnC=x-wnN{Y3F;XthAN`pYA9Db`J{#dyL$bTS2IA zFYBr(>MiIi!>13H4i$D>7`;I0NV#&lF)?&oNssf=+1#oU&UwPfk(x$wc`>y#yYJMM ze#`Yk2P2ycR$sCLqI!}oN)W(x8gOC91%MZqY*~QuE1+axvI0PNzWo`#)5T`K?;=Am znJT|f6sl^@?gw#)V>TLlIwZouMX5rfltR*hQlcN4k*dVnQSHpoV#@H~f-!Em+bCHu z&v51zdZdy8#VALsWlPLsT)jj-X9^ouYOf`8FUDa}g5Yk8>lZ*0irWnBAZ9E9a)Xn` z4kU1<1AVRGczB>Y;zmobHsd8K5N{#|7Q{x_gVXf5Jr=P;Tr7nb^x3<@esJg{(!)a_ zjt3Ex8-P{lY70X0dDsO2tDp;AZJWye!#9n$BpUDfwsBt2>+!UO!w&J+lQ1ym^#%d_ z0m7P~&}C%F>$P<Qz`0hlpwuXo3-C_~u;)sJ=IT3uQ>hgxYR!TyF8_^8xgb+%R10vb zdO@vLz&Ubwiz`<^iJGYVdN#L4b){mwfX&8rN`^UDA=H`QYetd$Aw8zQ=@QmN#Tpt5 z8ANN-G_w~ct>})Um$HiK3{4w*pBY6vDki&F)gfBlC_?Q+3^MyDFK-see5atlw#QT3 zsJy@{9tOkP?n#!gueP03fB~mc!H@yd*PMC})<pZdaT_$=hm&A{lExYR`GpgE)ooRL z$=4iusCUXUojf(Eol2hK%BOA`9vr(yFgPx3Rg~AGqFDK0+XWH_;2mn=DKO|Qorp3= zX-{ix9}u^enZc8AzDd%92dT0oTw0^4o(0{+%egqn5>@aTmh!+SO1eNDZ;912qew&_ z?(S>qKTn&)BWe=}zI8?-m)a0+5aXOz+h!rk?7h%9`P;_H-!_h=a@t1-<~mn>T>3Q+ zW^?&y9zG6S*K6r{@)#8{am-m}A5qhWmFJsKsH;d)(cLyrRp1%Q()?b0VYQ%_NzwIY z105@>?;Om_(ia=hLVi)>;B2~(RtNU?u2D*hzM4;|jv#Ah&R}1zwyIaq7HKO2i7roA zn%2b#(v^(>7TKL>n=yaS_l;L28edE_9w#$rI)#M`v?>UPzA8AdC$DzeeO;&jBqR91 zCy4C!dT|^uPOM=t9LGVT^Ety{m<!sF*A)xf0mmT45^{hH3BiN$IOOL;y$0kCKv`-R z3OgVqH3F3aVgVnViGJqsMxh126T%Vgzzl!s2PhQK3t*dp4C(;CjWZIvCGuV45XzKd zz1ld6+zjXVmm;uV{&$~~!ywZp2h_#iXb8X;Zy4FP+5`LsS&o7>egvStcx_yWsNg^# zL$ZbehH_0xn@9uhh?}mR6EI^+ykI~Sz#dL^EC5BH0_#f3luiP|^NJx`Li8L=7^cF~ z_{6upjG;%)V=?L8e!ZQcaIrzKIfkF-clf=nLQk)w=0bm5zzlmCis|!eu%9F~+?IN< z?y|4nXzq}s5jNsYLSeCMI}t|@gyqtRP8E{JT(Y=D7c~f$h?6Es7|#>>3^HUAyOyMW zh!&6M>r`Nt_?v6a9F#e&23I7oun-Uiq0amgIE;}sYK%LLGNe}#A$JFbAY-{Hg5rtn zm#|_%wTRSqq{<NpV=|px7_L;Kwb2EWc^;JyIFLebEHz0YQiDSddV_}_)F(_p21(Q+ zaJq#7zsTSW`hBKrCqWSSpx{`Zsr(G*9S~NIUYMUdL@gwkvX9m@oIh2Q(NI;`c(HF! zDVT4P2*3Ees5h_tXs)^JsC8$j=->${l%ZcX3-g!jSeaaU!BiF1+)%*JEE_E7Qk3)+ zj5be_h%@Q9dUiep>hFlxw&&+*!1rET)sZVHt7{$XW3;!?m>q%^_GLK$s0^GPt8XIm zFON`j;o*eZi(3jnZ5~MVAW>>@1$L~6!lh;jntE%cx`HuqUaVa_Jx(O@O7T^*1ajXg zRSOFzFQ>#%xT<rO+#t-U%EU~T;~Vstj?P?c>p;uGHM8*36RpIv*{8aj&g^Tu1oHBM z0bkaEg7bZWqp5=!Y+-grZ^rrIvy69+svtSA@)tRXe=+TJcjKuKeT}=@KWx<9Fbl^; zEm8~tov#;(^M+Dse4@COrW~mzGVMf4m%OpqQDV-U0hfIoLm6T6zz=M~<0jOHS@JBL zsIJ<NYn;TWNni{y9v~j;=$17Wp~nA0@S=uxiPH;PpLxoNW@&??ZIxFB8t0mL_%a?E zsb~dX$P=mtHAO|O^k7H=HkGhMED<1Ho*6lF(QwaPTh&7SbQ{r*>#MHo6cXjB*hm!C z@z<glluqhMuW;C~9b*l|(H@wF7IVC@v2~$nLRH;2RY~%9U@YpgAzg2OC%}`A{(^@V zyY+R<@dkpJL<}+N0GMXkVmK~6*(~WoQ%#DI3S&=;f~^>vZl%<<5BGOzTCfJ1vsF|n z9nztA`;c%{0ruVee(qePr6YvrY6iJgv(mz<c|2%e5sbLXN5>i{h{K^QAt?qojte4l zRn06?4$TM$=P5&qifk22RWZ_rr9r6Z6Q<5cYmK3~X3&mnb`s_W=F5i%Kt)AeRSJ5Y ziK*=sPZU*+^;J{Y%5HDT@Ko=2(;!4i5Tp*g;`()+tnLYbGcf_#Wkt!|iwWqB1vq?g zgyD#Q>mw-+)&JrQ0Q*kq2<Z&pH3??Y_!8J=!Csjh1|#E&I7DE9+!<I#$lyyTsE`!z zg3y6P0((*vs(ya^aDGhA#V1Y>1^p<6myyYZyJ(8qAh<gv?&}V&j3MLssPg)511Ver z8kh{V)xZJ}O9ZDS0>D6c0;56_pwYsY;4lIFLon9Hz*ha;-BzD3Jm9RanR}gGC#zDP zZmhjj8biKMcr%~33^$1ivs|d}eT}!c(A1wcS-rRtUnxJj{N|7f6K7&*AaEua2}&lL z!6IR&Tc9h0GU$qu4JHCp9}FpKK`Yp^ZO|RIHU#l4E5ZmOiIOF7!OdJcVor(y;pfNf zX&AmUAM1gixQUlUq{w$2z9;=%%*+Ql6Q{f<_+L$bVn5z?(1RR1gZ@2vtr?up$3TT) z9xTAI(hqrk#}q4R?@yk(vBSrwvz#7#pKh^_r#izv@0Rq3Cj6uG5Dj$J%Mp43sb{uZ z9UsXQ&I^4Uv2-eqq*n$4)8j~v1wp1i%{MXwPkE$&a@5b31O^A38t0<1*G3yDmp~B& zWbV=P7Oey9=osJDWrz)D&1f73cZW_h^$e7^IX9l&r3#H$7YsZwdv^XO{wY=F8=YEU zJE7Gv2^ycYpXj}~h*TxbjU27CKgRco1ZZZcy%1#N@8)6kg~6kp$7_|RM{-YpI(-_Q zoH+tAbNR)~HJwL38an~52r>0A{Yn-)zk+|Eb>*SYXeWMP9;hA2;ieJl$c54@Ug09C zmx*krL<o&l4E2z@8IwI}9o5sF_}22OflNbYKQx-zI4;PUAor0W0jYY7g;yZmWda7P zU>8ki<5^S*#et(SM)6f+BoOlIy2=~c8%V<!l;lxj>tIcHvyk32tj{ieMuwspvW$*u zRsp$dBn!+iQ%5?o8I0C?eN9(aFLCC)nBT(aEu7ACp~aJpv@#K?YaGX}C>X6)ch`f> z|ND6`MNAIMw8yM-33NdtG6n$38bznMv4~h1FoFPO8P*}C0`kc$7XM1Q%4mu&+dW`S zpU5<ovasb9+Hy^)rdHWB-Gm~H{1_5Y1}2)iNTl{+duh)Qo_wWyvI$L{aU%hJl1M6~ z;U*z}SwtEf2Iy!lZn~RAtI6+XaoR`>605q3GE^)5NCwZCJCHrn-QU$$jIay1N^W&; z4ZW#eYCh3%D=_|YO@Y0vv1F!Y02@cEImE*>S__HdB^cW$n?=2)13kSgoT)m1l$mIv zM@!`P<Ga(kM{uqQ8W<A4nTH#stQb1hS`CbVHDDhNGE|+Wk!BlmGQiYpm<hJ@hiOFF zh-ci1Z!&SaRkNtCBaBRQ8h%HcpdSl-%0o9ZdLXZt3y@TNYRA;PLNkDy<1)H<stLzM z5HRN#!abASxt;z&v_O(r8=9^3MwuSFFvofZ2;kV*sAtU6DiA9n#~3Zh78G*=D~&y6 z_qX=BJ4QlGrf)3Lt$=Joq!uGiv$xtf))nY%vA27^8xqhveJEsdqm|=cC_x0_5rHvX zXgR?qK-vmW$Yim~fxx3P#f(C6_ist*>I+%gim))ipy&f8zb(vngyqVEQq$b1UAllY zb5=+ju2h)Bs<=RoTqzS?<H9mZeVwqnI`jR?3i44xZgy+Kmkmwz1$krt>N}f0%Oq4C zJv4GDvj`#F{>AK5hvqx>i7%~e;+;P!S+>-G9J&(0Z(b0-lid-}*&_)G=LP>60)CSK z8AAZ^m8i4{b{s%<Pxgcp*$Y5Ry#TWX$S070^xg3C2LGOMG<^Wq=-6@Pwds>{=bKNX z{r{G<))e=q6=ve|fW+1xOP@$3mw!V3awVF18?U&rKlQ-Uk~<O(d!h;YW2HiW+LXZR ztnk4A;kYUGGx=HwjcGdxP+N(@UeFg0I24>9<R-aR1f&}1>Ns?j0>$T(CxOwVc>SFs z=&cp<9>4D`$wh6P%k7=b_FkE~<ef}!mDQr!&PsN7>kMu#@52fdC8e`7kJrp+7xd9r z=E%W8zpS^gQC(!Y89$R>KId;2c_>-K0+oWWFgRgrl7iWb!PXH8OEcvOuLZq}T+|AY zQqG2sFU5>$uyFD@2}7s0lGeiN)JR4p;yH$w(OchBGEbaSD*CGgWGKnKM8PWAtwx4c zN_EY*+XgDdwT1F#dHM4d0xchJ8*S*dkwBUqHg?)-avDSYZX2r_cDS9S#uu}qv>wqy zzjB7FtZQE45{4iyFq4r-4-IilB7Qy8OZ{dtH0YK<V=i14k0YEgvV2X$Fm<Uaj3}Bl zfurZwwaw96+9uiUjd?XQ*>F*0{1UsirN3bT+*}iNA!28ZemG53Y^`x*K#tT55tE=J zhNCPxhfT#_!8B)<j-^}i={(Xx1GPVIymqi7j%>No@^Vc>PDf9LKEGh7j7@DDcG9YP zpP%V%rpRf9qs78>&_ift=}isIw88Wmc4;paAyulTp|`Gms2|gO0^dsRu4`kGMb#j! z_jEC9nFU3oZKN(xC%+k{8dSlk_XkGj#n(_e^yPZYKt8vHUdpN}W>ebp`ki&<;1DUg zL}mB%VA|ocq)0}P5Zl0E-yA8@L;W|zt0yUIqezpFrl`%cS@@HaMO1Ar0+L1RBeZr` z>&vIH5SyGkM8ZX=<$}e_T~&>WhIw*dTXRL;!1k`r*5)2osky*b27H`%pec29kTq1m zkPt+`&)isCqr9PqMjbs%{c0Z9+uzekZh_Hp$t_~sP)-kz-X#9k<UI+yAOillBtH~& zyyieq-0>%nP6GIckO>GjEp*L~-=3H#;tQK+ndJG9V^|;Tlc@p=u?dN{m+PMDw`&7p zo`nOpUH1q8qnKQ>&V@L7b&{+0Xbq!$l@86xCSgf9HCnGKj{FNK&gCJwO&qcgo8?I3 zM(zQf&7=%0ERBVb^YWNS6<L~4s)qd*j#=x`dU>+3Ioo#LqEkEIR|Xdh9N<SDnOSYK z7(9j%^P&qDft6#@dep&*StRhzMgf|{=n~}7At-^Xaw|hpuFbIMzGhld!k$E`WYYgU ze)yLND4y3%NG-%1NUeyER!sJKZQrh`8yMX+6#9nWz+ez@IU(x74HD!nONn}<U>}KT zAe1|0X+aM%eX=}J$a~QRkdjdN1O)Q$$W;o@;u8TjI}l`23u9g!K|h%wa78o-swBYo zDMFeM^no8E3fN&L5#J1<OHm}$LPxLFC!k0X2(y4Ud3CQR0cPZn;3NEZL$!pYIFL#o z-^T|U3ui&EZW$YDX%Lc4JWma14mbG=@f4`M072o9js*b@hzNlq&=Sb@x5iMzbi!2| zi=!F$804fv3kg*M$nT0sJPPAUe1eQn5XL=o@oTx_iG#8tSEsqAwEMOGGn}C*)odK~ zel|LPC4Zj%C40{t#OW38b<YkWd2h(}`<C~$NOd55erSvpkulU~5)d<O;#gn1K|?nJ zx4w3`akN#JUn#2YnXVl+U~75#{E<3GJ=+af^2j>aSwxN@C`(^kuJ5F|m~9igrIWoS zSO*z1(?Nl8JY^zPo@cTJ``G!ppe_sp1#pr2#)@lYpSJH^?5UF50~HgnKFJJ0ajh0t zEFh1KX(~r&E9Q@MblvPH6Bmj3gE6$K)jZH&Gd?SZLdOwOlZL?ImzF@bU29?6WTC8$ zr7sie@LX;lX=<PP+G#2HGPR=kXiaI=$U*fLV(s`pS#gvKQtajZbGcZQS%XmS2YKp) zCwq<`?<)B{Y5yY9y_x+6cVhQ=`X$@`$;zgKxtEv)S6WKX*>0Q`VY8&7CRDtHsaa@g zsa?8IE^TaeR}I9FwjMWw^&@}53`9_$C9zKu#|fb(>~wu2XSBP!0rCu=yjY)2Y@5ae zE9Ss4*jtar7W**x@j5xyj<b@iH7Hcs8$<5?^xlbK63NntXEUm1ks@c9>@2x?j3uwF zo5e%CdVdL}EL7jjr^t}B0@;|=9X%9aniaNc+_3O?qr7w)TSRYTw{mFq?{~rKEWwV; z7t_Y@Rs3_F)41~amzp3w?=zYCT&;ojmHac1C(}w#4Sd)*wX0Hi?)Oa}Xwkyw=t6V) zZqn@geQ8sr4X3!L$k}IG#qYP>Fe%%l8I*1!YNC>-@Odl}!ccTWm-KD9OE4)-3w1u^ zuNKpXIx!uZq7F@=lwPl_o5B~er_M^*ar9(SV->A`re?T70qU~#JUyFURD_ww>2f4R z3nY9W3bdz(&}eoxxr#hp)Hq6F(?=_(D%0EWBjuYGtH}e6^5zNP<j&m-Eln-s1*s}< z7WOuk6jFIKm=+AFv6W}Z>oMWWrb>BCUdv3m{+h*d58KZjG+;SeyrehSJu^NwM}>4l zVtRL9Ho;HH1P*&kpSf##xK6{X7E6C$jB_J<E9w<CQF{BU3|!_2ze~e1Wxv-uT&enj zc`4IHU1&+>cTr0KdB-F3s4XD{sCQwPI|P|rG3OE_qPrAfry^u>cwHf9uqRJ$0N`1; zug~v=I^=G>I|OmPt8G*I0Kn41RYsTD>rwzDg#rZhpwh&kn(XEBhzE+kE$9Kn%w=$H z0y#VG3VHiMhjrD3p#w2FxYHmx%capdgFqw^cE}4_s72+Kd(eW(7xYAo?(gP>j{slD zN~C~mW*J#X_Cp%`3g-kcr4<lVF^g8Z!MJUKfH0tfz)F2KFbbGsif>n*3CI^vUI@3j z$sYtuCj0?3+ZFLawApn{Uqk*uT+M@!)1N?xSyOEja|J}Wx+^Wc>m1k@5ajLF*3X|y z<X@|n*{{HOteXedZL(4i9}SS|kCLTk!1)mA0a7nn8RLC#&W@qgrlY50#W{n8=@a!r z>|#}oEt3>Moh3)on=1ERnl80AgIB8rv$X$IovQ?Q`x3Ih&kTQlhUCaC(dCsLJ^)}y z*Nq^C{_du?NW=C7+_u}wono=Ux{u<eV?IaN9ErQ^fYgp=#^^mR1d|5g3&EJpj(o;g z!zAFbI6amqLp2=-78x*ygx~d)8$<WuFTKk<#w%*cZMispiMS_2aj7zlte>WRQN}FF z?M*ww0q+2ofDUz?!tc%d1=xxfKc^k<I#W$0S00+jH7}c{IC|M!S4?M5rjIw`v=#lh z5>{K2l8K_HdJ5V)Yy0>GS85BRh?L97DprxJK=PqtC-N!;rDdFEPVZbfSDeQ?*WGBX zBg|p)TCeG89R1N<C?=$(n%F0Iv9pdJn>p5?#J>&N*~hI1npngNPR~y8Z~V9#hrSY= z;2mzb-G&@(X9;KKPLE&87&#T_I~rIvsnFNH(P=_UU;lI(y@iQ-X9q^eP*ek9P5IvH zAfbJLD#U<obD~qwNV!7vB2(v;zG*H2s{YjXw*mR&=M6Nw%0`%)N}{6S`@VwM_e*d% z#tfFQuIzx)33hRV&>_)7Hl{TM1(V!Pe>+eD<hmJ|m&|BUcsr;RGhmj7ST3;Wn`5#0 z<<B4BfENo2I=V+WK3u1vj3LH%OUBMaohOo^E;fK+^Cp=KgaDeyb}UdA2<<^MT~L9~ zZIorz&UK8i=1T`~MePviYsb~kwyKyzGVymy05En|Eb*+cv(%tpF0*t(C;hhpj5nZK z1BA8*1tRfbuyg%1@eLqFfZPE8(8K;jHGl*qiTlGt{UJAC6$A7&^7+Dmi|vP>01P`G z4~DO~YeL}Qz>K5_tb98tu1>J^-Q=))Y<>vgT-FOvBLmSzv@(>4iei7?bC{I)xjMCv zAIk4ICALUniz54+3c}<ncP%-DMsV+=!CHLIaJN+Do(#Cfq7>wqUijb2dmOEa*Bnw- zeAR~OzC4n8f^(>(c{f;{9Jya`Nqf659FQU7nM?c2JKyNat|+5^d3fbSZq*mDW%}ne z#3mutJyvsYU(QGY^E~5SEdQ9!dO9C$gQqX0)=*?`)B$VRbK%%g-Ua^`%CBm06)Q<6 z`al0a8(b5r&lu<C54KG;Xj+SA8=SM5z--%%Aq;6aLMR1z1!5ngZGnIo8Ka}U?J2V@ z2S5McBj%$NG?d%_f1R)bg3*BDUMs*|H^O8fw*g3q`5y-g#9@#B(67lqpxvy5iavgb zI9Q>xtASE`0(O)HzN=*SQo_gqwr-%b0m#`;wn4UhvPSAhKZOh$Ps{|F!!aF**U5H( zHu*+82aXZ;#C%EK=nozc+w6mXKk#dc*XLWVXn>$Sw<m`4Mj;<Dk$MnKSg}`x0LKBC z5NH6P&_cZ4H2irJm~P0Upnu*AVJ{$B!}masLGHHm;V-VY;Hqpdwg4Ii`ZZh%!g>Tr zpkM-=s270!8=L`&qJLn+M++d6{brye5)Vy>;B*u!u)uk61`HQ~#!fd!caLH^mXPLX zE`Vmi4-)}klqq429GdxN8g5W{z;d8^x35`D?djt;Ov{j^TRGU)8lg8^vL*;!&@zRf zZR!%2=7R_zEf-EyO&nkk%14xy0@`>b&C?1<nG^LzbtTrC;z426;Cun~OFatgWv7?* zXzHh@rIqbqsLjO*^QU{TVxE-UY^GD|PpZm5UU*@tg)Av7wX=(>fwGWtx<>1Sp9?2S zO-TFcOzs%7THjS(Sk(uq3g@&Rjub+$h7!|UQz~Fo*}HY^R98bA;ez-78ri?3)QX(i zd|Gqui8?*fl7zIL=IL|wGv)DSN*L*ikgKP>yQ6&?#Wj`KO0+~+Y!=WLNlmR|WO@k) zjL|d_he_d;`3j0dcv^=YVwxVT^5&{5Yl_?3hZ8ul%$aU%qX*-u?rgn4W>%s(mbVlv zD$n~zQ`z)>CIrWUQZmSI6Bi9NAxSD9h0AmpHQhiW@XKf6x2D{pVw?J+6{$`L2AR@U z6$?kttY^@`nf0Ab1VHkqs2XlRSjzf&5HT6)Y%@UYJS?IVG~Fx&pGbV%y?Fhmgr_R* zR_vLq;0VsOXU35yGrwi>g0!Sl+7M@72EJd~(N<JI9|s3x43|~YgxA(gVY1qArI_Y1 zydi<L)Jbn28>Y==QQJC6l#w2PE~xnxqZQ_w@d^QhLx5G+Q%de>kJL7@`-X5WYE0)$ zk+BvY<corwtVT{hry5fQVI_qn<l;gWj$59_LZKpUy}!Pm+dN-C-vBxRgFqVV$}=HF z4I1ya*JG7+{0gSBq-VBv4uBNDQ>#~Bx|mAFxH|MYstk4XVlH$>Wu3u^Ry%ThQIHnt zlG!>aZcCHg$r!qXM|Yr$C7;>4*fGjt-#~1(KRQE)K(6a37D&9n+#E=+i#o!9+x0WO z)(=%KY-*@psDZ%hKe*%`oxv4^;0a{c+5GcR$il1&xU^<Z(4&HgzO8<rFBtH8i{;@6 zAb$WZ5d;>wOl~k5D6Re=utL<=Y=^W0k5XS}@G8PCMNscqfFO~dgtcZX#0)uQz#q40 zHGb2g$KfzRHJ7*xLKN)kxHsepf$-)HBd=2g@(d(Q0j0BPG?jjvDsEOrO>@K7P0q)( z)`p_5axI1D+B5Xk7mg2}InsTk5Ta{8`DB=WFsJ9U{EBqOdFET9Q%sngD<2fbJ9kMh z4SvX0?>{tlx+t)0a)yDly1<obf#_gYA~eG|??dA#c>$pFlE7j3{bM;(b^wFD^8XO_ z9`KD_*PSpqoEeQA+losZCoU=WrrNtn<ZQk#Wxa9QdJ`w{I*z+z%U16iNz;2FXV`lK z3HAa4AXq?vMDIlJy%AsoK(K>E$KC(qNb(dZ`y&Ao?>)SC&%NiKUM|ae&c8yh-DqXk z%)CHzy@3pZ&6hiydSBy-ZjQ8HkzJU$Np8=SK2EN5pBG+wN^;RQ`g6li2A0&{GCuTV z4di;+FZemcW>LM|VTun*)y&D&kvWY^v2O2o3gN0f;HSq{Saaf^jO>JH##ITiv5Oxk zqHTeY#WpCs!?Oj=fQLV@_0SVgoXeO3zu1hU4U@%z0Oe>H5XI#Rqdt%1mH?au9#Rnu ztRUpNJe+<{O9|qW2m;lEc!Z6)wF&vVME)tZbr3Hm3aQmR*Hxr+2a$tj+#|{KYWOgQ zkK3F1Tqd90je%zDU)|W+J3wAGBCCO6nHWkHW;XU>`)iZgy_kFgC1*di-gjoP)qOxV zA-yNZQtP{9YiCXaHdL{{z8Cuo659g46?f5NXbn#}ENpHd`7V(ypnf(J;?~-35z*bL z)eN8SDQqY9*YZM>_26)wq}LG*^Ue~YU@Hm?Qp^a3qsNLV6s-j-fzAY?kCN#pOQ}8h zhL<a#T42&h@eva9@9VTt>s<k?qK%eTj<!|4(yXpxOL|0v)Q!@cIzsd@v!<^%gT$`! z8EK1vf4dU~;nkN+S2YuK7o+WF7lLGa8Jjeo{DxoHrFz@dDpFo=M4`yfu8fnWy7A=> z21>g=zdYBua@{5GLS$RvPIF!JUwS3=YuDSPo@S%4zt=H<Je!-n9iASxy0YE$hMyGq zO_thr1Fd6vo-c59D#ESOmNE9q=%8+(o?g7qG5k5ln_M#5L(JFVQ(ma%I^NFCHB(Hu zQ6J(HR6IE;yFIH6%w0UL4@#TCOOMY;NCDjV1dLKg=DCXOuAb_!d%r-0%OomWFAOjL z+~*{1#g=BdvlsDsm2{-DPKWzeX=8V%<qQ2Fs0yiz)=_g;&>HK&LbR{-t#INaqn;iQ z5>R#BG8$Rr9?EYTxQ0<86Nn6$7+*i>4vllJaZwDDo|&s&ALUAZ055c=)i<pD%UM;m zp({A#>>e8092vRG<15F!eZ6&a3$g_n1jAj)HOT^2Wq*8pZhCB<xVssG=zwx;uXQ*` z2bKB7-sXOHi3l!}o9c^8WT-8!{VVCUS46P#z4$b*Uw&(0R@tDPLE`^e?=<iAhR@c# zw(!h(KOwCn#B+B(_}0`|ZF8ifXXDnC;vWK!%+8r)&xm6Z80D^2F>}@dJEL_-JgptX z?NuyhVmR6-(<`Sy`nG!q*E+O!R|XTXwCDQQn7Q$8A5@wE8%(vyGcqAxTyC$obbH%p zG+LEr9t#&{5oUBc(l0_osTNg3n|@+gH#>-U-m&1E=`ZJ6+UGeD&R9EpvAua|NUAo^ zER6-|Dz!oCLLPLuseSbBP_TifQc3vXPTqLysB~&#o!M)eiL%hb=e>RNhqYJX)g~7r z*ImV3R;}UkGgY?{P+F?%`Bvxoz#0B4ufGWCVf<xR?^L()GgA}#>NaTj9aF@4=c@Xx z*o&5n{m)g0ZqOYUaMSxy2a}R5r|hrg2Pm!d_+h4qQvL|BJNiJ`YcYzW)7cE9P8@(9 zOdSRaQhzW32rwz`<2IRW30Xt%7?2`b8-3>9*&Ovbm&@kBvhXE*ppI9dhZ)4luN2Y+ zSFZr-*}aRAXO5HD1SC_i&Si_ESP?ugdr-jDh?Rwd5f{EkO+c;<uU{jbKa9?uYtT-5 zyX%#swUd=1$gq{WPxlN|H}8Ij^RI|880;tgQ=Q_^n$A!6_cK8No*%k?@r<CZbo>09 zrn7KS{W$od=OLuI4eLhv7TWzChn1S7!|yHy9=a(`l4xkZ<k&gbNZ2!(R57<Dc0f%d z2m3i6IA@kBrm=_AztryGXGwSq-E={NJ)Xq!>i%{~e6g9tJv+WQI;uVN&>d(OMX<v> z)bBDhk>bDmR0~0A>##Wsqv!pL2VQA+z<}<N;tS=vCGZ#>@=?lpAg0H5d1wb#p0+}M zD~Y_6{FVq(`Hy_?BnQQlN<1jGVe@_7&tuz?<sAg_$ddNt!>p%7UP>F+#F7mwiCUpZ z++9dHic6Nm8h1Rsv1Q)(Ckm9Sy69}sdzM0WvY}rF<ux6|78AtT;KGEMs}h!-u&cPN z-XcVDXZ;|tAJ7%H^})MKPGVio`StmrBireYH0Tj^h-jOoz+!JOlKG@A*uA;5S%m3l zQ@2E1!DQvuS`f9p!>(;-e%0i+9C~6tLuprjx8&U2wQM-?<;VB*o4ZCoS?WU`&^y}* za#ra=e<Wh?k&vOd;+U=33&SnH`hs+I#!|Tzb)#bUgA)v(Gu#HbvWK-rpB4gW$!LSt zTV=Xzq6gXI{fnJlmTN#TJ*#W>cF=yy(>vRYN-p*D9bIhYbh8Jl48LWv)jr5nwlaH5 zMBFm#7*$nuDZ13Y^Nv9~gCVVLG1{(s#-<k$+h?8wSIpkfDq57{i9eoQzB^!}YeewZ zx6!5SA<ac^QwNMg*W~n0Nk@MbO*J!D*X$hOHz=CN=X#9S!+?5sxOb|l*Txv&-3RsO zOMS0KuU>mYdb62bb*<-x_|s#^5WG~odQtq8>C&s-y+^@5;~Txjm%FQ_tWYlo5V|(% znyZy`Zg%T>S$^ql!EX07@=Y!5aW-MsE_4K1NI_gTI2L5lT*G#f?ufOITOBjTiIHS$ zfmpd>b(4f`8Lus6+SWT3+|#3c?X=*kW@tj+nPR@V54%}O)vTH~&NY5DS$g$ucIXoH zf#JYdmt|hk8$La^Ns7&xOXJQy-<Y1yWDDh@=6K^kqk7s>?1S?OmdD=OY1<TQc5(WC zxQlt(`5T5y&3BcRH?6j7#fhJ-kwWU#<}>!o=I{1L-w$q2?>OJ1=-ZhchCfr7u(N{W z!$O%x*eKM7Gi-Ti5Z-w(8r@>Ce?+OTZ$WVS5L>dU40Uz_KV@Cx+CY{yzFbQ~QdUT_ zN^A2j`mCznb%tKL(?1{3dvuIpsZ0})>og6d9qEfa<~mbj^`7iB%9Mu1`V#q5#fl^{ z!N?B#MYB6d%+J{-{IX@G$D+|%tpQQ%cyi2OT#659XQ1}!=!}IWb#%Ddct70P!MnPv z7X~x^4NJ^m`mSxbW*aR~o1A@njb?V+(j#zNQJ!fWqW`h1Adh;pMlbQDq0E;XVW%r! zp=8>7(Hsy_`<J{AV~Z6j*Ev3}FDr@Pz48&IA9sU1ip&>SDDZ~Z=zIc6pIO*5$_ofZ zEK8Q9LF3T8+4$}~aAAJGcmPlA`@Ud1fk%qG&)Ev9{wzeM`$;93PBCv)qtAd_PD*C8 z*tG$?DK8y@hH^Zx?qo`^^`OCNMVjak-&4+wV`Q!c4B0(bhO5eu9eAwB$vikb7@kre z^rD9M{$~*a`N;6zP+pPM@N+IT;u9r^UYpvpt0zOeE4t)LoLF8@swD{Od^Td`?_0$V z{``VxnVYB|hsZKBw=K~oM28M(-mc$QFq2htZvN(Vu_dKl$g8FTYkcgbp;nzE>r9iP zK(RgJwX@ea8?hNUV#?dPzOXs#-{SK;uOjkQso0jV4%Wu&G8n|Pf}ht34)l@@Nj&iG zqCB#&CGv)aX6PPR=&XVwroFDFFEGdDGjo#zHrD7e@i*JpTn)+IaQA6A?beaWN?uR0 zk1?S}t?Bl;(Yn>P26fj=u(?)S%NEd`%Wd3&rG5cNB)lc;m9#?k=#$Yp1S4sp?cL}% z56dP-ER%CbJ%<?cUl_O0=Ub7Z1i8U{O<Bj34%*r?Wb5W++xYB+jN9nx?Hv8jMt&yL zi_i*g_0%?5qFtLFRd9yI?CFKx!nwX8iMQcN$Wy6Z>0O){PBC1xKo_U8laE8TVfpX~ zsTvD=E-R{d_6hSe%fM(FVTXEo9O+#1Moa8A;G^q$k2?Kn=o>WKpm2D=&YF^;X%CrR z{4Znn9==G#Yda({`qjx9-E5l~9>tAr`;=&uDW4q7clFrTcS7&ZI?(cfJ>Y|h+T)*7 z_ERd8Il89=yVxK0SrGyg%96*)VxKtZTWJaAf!GE!-1a%bvppnYz)X|jJC}V)C(vSt zD_P_U_H7ZbFD~5e)xs9Yi^&C05jD^Qwj3FE!m?>K@-!i7iP)}4H*6%zkLvjui)huo z9t<m0Jd?{{*;CFP=u&3SEcm~PX(qSe1T4(R;#2lb?-F}G5)F=^TK?*P*_d*!hr+9h z2sxM&s{^Y`o*@NQqCf5ntu6Al?YT|9&$|2`&@hJ=Z`L~F>TxkM8W>w%)YeRltdHAK z`H<syGczUKIIR|Lv!Br`=GJ6cRG0gr`e*u(PIl|`_ywaGqT`v@ie{#eXqj7;z0KF> zkVBD{v0;6AfG|KMSLas{MCS5A2G)Tv9qtu>A$egChd+$(M$a@qU*EZWy_qr6EGtYs z1O2D@xeMn<`s$`{F}vDFE*P}W&7U7<!d%zXLV^r>`!M%L6jG1%*3X@{@1B+19Hmvx zbl*NBJ9Aq65{**m?x#)<ShT-fyxdk-S*xgAsBbxQp>LpCLZYW{BMNX~`K`Xe2G+%~ zw(72zXRkcPXM8(G$QKk(OMlki+ru+njY1RcqSqjv_Ug<{2CZ|VnOn(wuFw4{1fmam z9-Qu5v_^|Iq6r$6Q(S{n7a`VuaIeMSwm3CDzb|zgmuc+C)U-iVhrAN9P&e(eS$%1? zLPv6FYRi``$+i{4JK-r+K)Goh@``sq_-RP+Q-JI|BxXGT{_!I44<4Hj0h`d=6UxOF z1pi~1IMn2_or=sZeo${>=U^M#-~|5e>`<E02Ttd2=j%fv2kg;@kP~1u-@aSjx^;tI zAew6|l!T_N<KRh;*{-zd(|L09apf(yj510PYLV;>XGRb4&*SF0von<<=r2%DKImD{ z4HkadzTMTdF;%%#e|v+_st(T7eNRXT=T)cV1;xx=m$Xt&iZ9M*v(vYNw|-N0V{wFi z;qrD@Z7Y-`?Hd{0?XC<d$luO2zIJ_kpf(EM@cnSvz+z$lM;h6^Fn@HKLwFD3X#ibW z3Av>u_$PAd_i{-J<PU#pHvhQMz<X}~jGmDC4sx~U26pGnbGGryz3<n|y>MfU6rO@f zcJ_stn%|V)mNYbt+?Y6HISokd7sy%HWh2Df%cPEVh4UW`iw}(lN<>r)2I{jSVn4}4 zt;mEXM49m{=q6qs)!<ZC3?{RMBy2EJvmalWPeJPtZXptBS3DiaA}8BXBrX@(x8UaY z#0(7kifij^kK*;S^jk<Y3BBC#R^U9)VX~dD`pDgCQ~ymEHfEmbm_B{3`|gJnx24UU zf-3dxvv0#CXT3lst8PKX&|%n$o91in?nj3G-O(T966y%?^a{!0YAGH?oryHOfyClj z)o0dqAy5y*teJ9F-+Jff?uHAeyik0YV@qqR>DabqyTQ4v3F-<vwqjV97@yv=;DPpp z1J21`Pnxqat**gDwj8D8Lf2|~Ww|?RO>Y@8<Znq_yBAk46IU~q<Iq?cH6+9X+Xkpg zdE;`{jR__U?%<T4c%W8D8)j!WQO+lExReXIg+roV%f3COL(uAb6ZN5;EZOny$JRG@ zpiqAzi2_>4peE>|j_`(zXS3vwA;)ydx}8`{?tTb6XKz2fo0~p20Nh4rcoK$D`0*^F zH_|($eGdw}-G^^poI8_hx}zSV^;jnc#ALT;v43=0JRIrD6Mefs+AO2>LWDiI)?Z6= zsP6i&an?H9K%T7#g=Dkm)t%8H4t@W&xv8h2-PGS`y3L@E&B^b;nmRb$)D(nN(!1Ge z)ZZFVPt?k%W=DIX9l>Ev#~h<ONB)kix3c@XN3~O(2FTd+wQH08Q$720cOYa>GDLN) zz{~#W;r=Fldt;8sTf_sCLM_qFT;~t5IDNu;nsQ88)3E|D@8OgMuDfG?S83&b2q}~J z8QrbEhW<z&;yL+HX|71d!xMe_nj+!OmZrMLhL(Czm8sp!RIpjqhG$0-XQozBi1k+A zq=hlBYSncuS2>55hip?a;gt!0{dOzr4AhH}Jj7IUF~m@{u%%?>=-4%526||?+j1+= z-_U1?-tv;aE6JO?C;Y6z#Yqh*(xM%L(Pp6}G<-QvCcNx1fdY5onFm+9Ik))*VxN|3 zx+@Pz`t<NCYKBy-lnSQ?Rf}xrdk`XOFOY%_HZ8Y-|9i2+$~`CocFe>LL7d$J2Y-m_ z0(MD)aOUFTbvh093&-uEux~@%Ntx}srJRWwc}#*5MS|r;mu3*vZPZo+J5DlVqf&OK zhHIN?7n_FSGKo55u=}j+2ya)oH0kNX`b)GP102EHp%vM%$>?#r7_0DlS!uMSG{SHh zQQ7BDh-i3HvZ`9{?Z8$ub&smYM!am(;OIJ8>lX(sPA3G0DM@mEds>J<TAd@r1;#$X z@Q$r2*I0`#t5M<eEMmjHv$}x&vP(EZ+HZRhQIh*{Hwj>O+pfT<IeK=%Zq?<Zi~j7Q z3u4~6E!pZr69Jy@aJk8`DE&}{P|k8$41pT&#;-qi)-4z$%AX--?>A+)U*3N8`Yq+H zn?t1ZbMQ#{%hKyt-imQvG+%4Gvek0-p&P59+mw{Q5GKGNuFMS$`43b-Fe2}@vh(Tj zE1GM)jg&X?QtMu{=B55h`6a=f|6rV(J}<cTR9VLNAi7dy9@VqcMFS~IyTQCF3Td<} z$5F&Il`@$;EavYH{7bIN=Fk|kW^TemHs*<Qkl|rOtM5R3UB7;lPwQb#x|pWc4prYR zmZGDz3`wE)?R{!zR1_xK7zl`ho&~nTP5`ScdvQ{+M{HY&SLGP|lmjCOwMcm#Mi$hg z#CW39T*Q7=r21NT_>|93y4`W7XI_k+gQ#MO)&uYE$A{*sM4r~v!JRN0^l=paH~4RF zn`ZW*-tcbfSAt1}$h0OKgN%W2^^GYHEV&FRJDL#e#YBlSa!-WM+4W6=q~`eQ6dx-3 z=G;wV)VGj!a=g({(yZJQI?-yJwc+Q8QP!V1yJyO|qvAas!_(gP*9b*U3Uo^Y4AojZ zL|7x)!qQaS$Tll4F{)B>AmFwasjeC)gM%knr-CznuPP^%2VP#WEy8mllOWUigTZ=+ z$tA11(}VP>CU2v&BRZ~z4`RwNFs9;LZ@ETQO{|##M>PzDj3$r`cJ&;yvq99+D5+m% z&)0F-3`1v$DEV_Uwd<tBHqqJ2iT>5Lm`X5j>gKK8bjxO#7Ebq6Jv7RXOkS}M%h@em z!j@Ua*y3MvJcG;X>wyuLbbu8h9ab0|`={!JEw(-x$2vPNCtHI}t(;!<Br*>+>*K1{ z=&g3Yxysb+uWkj~HJwks2N%TP{64hm6hagJ-|zdWgD)PW_Wz&PJ{sh3#(Xo-IMv<O z7Hx|*hPpyyib-r?MavYk0R`NLB^=X4zZ#PzZmP<YA;*AgxN*o=KNM;YGiO+)(J?6| zOEEXgMnr6BNY%^~M6L>H5$#}u(Q!F4(<YdiFiv(awM79QV<IkmX7diy-v{r8;;-jt ztHiXc`u?Hyx&|ctwmRCFowTN{hET7GZJL>rAqA@bCSyuA&eo!`W>hl2cY)_>y`$># z-r((%RoVsLeUnv@PaPh@Z1I7w_di2f&mY)?Me_IJL6u)1)9qNY;$``UiMxm7DE7i8 zkCQYO+{^y;sJEj9#F8gV5qHA5;fXIq;tNra!5{LiN8R=CdS~a=+h7x4T4sxa%MM=3 z!Cs%AjO!HfdB^f<gcJ8{+oM2i@2Dm&Cz1K6Ys<SL`|Bi2xXhQiJg)o@_FRE8VzCL8 z`a@H8J|^Ciiy)}D{pJ<_veyrrq-Dw-CJxEkyg0D9Y!|^QGcQ5anGf0&0dS?s<rsqI zr{X$DhR2XSsQkdI@6!&@S41<a8uh6tn>=y)@YSUe3piZ_k>{tBVBqSd1Hb|)I1i@R zxBgIcV1_()nB0UOkU@(e7^IfrY(@lnc`@UJhLPSZAt<L}dq0WP+45Y{_wJBDw=edD zFKEWs*fVd9%2n#2#r*6zw7Ux}n~5PE5s&GF!BIb|VUkNf_0}an#)@{`(nk~#8`6Mw z$E0tojSq$XVIZ!F2^eNV!)a2nwZ7~F6N+T;e<a(1aOx9@O>kjD0zs!MsA6iiL9@ir zxazSS5^nP=YmEB`clE6Mmgb!4-wkKg1A}K<u20vsf}_}8;@;(68^5&9ZC<;3YpxUC zvNzAQ)qU(t7p+%y=lLpD_0;u+Z@Vr&=Xz*xl#O6$ZmD199vzEM%|<WwESq{FjxOtj zYWi$Ypx-bUnA?b2SBsN6)#%b2LdWRAT>k*wMhb6DH?<4m!`5zW&n=C-W9Fboy56T) zX)`lAZ2n$Lpv}n@$X{LNO1FAI#p7cxSL;x(CfpOz8?k4Tzdx+>4Q!B<%pvk=CtY(2 z6zMARClUh?2oA?)9Iwc0o0i;+O&0qwdf)1t5fslV-q4&Tx8`X*H#C>oSFiQMC(V5M z=Ipic^WmwcjyGQ)YbK=H`MoPOAHS|*)E<1j;~(7B>>IP^$?2ztix0W&F$3~3(iR(q zEi0j|F%9}#hGQeFxfHL~#&@zu7~HxB)N5~6O8cf%O>3jU>N;1W>z1t-R-g4oN7MF9 zs~l11%l&<-!7%|D409O0x%#z+&h0@aJEy;m$lt5<z#U-F$n6;puUj>^*2^1`K=RuA zeQuqlX@lfO>T1X9TA1_7A<TgJlBW*NN|{VE!d^wC#Hu!R^%_#}e!=XO>qNOKUzZX0 zyv3zmRmR(Y%q6Ay-r(l2o(P#PyK#2GfLrJfyxQ%LGt>!I3i~?~8?kK3i892^Jvsy4 zdJA)IKs`LBtEv&y&+;aw=Vr{R>bp9cPCR`f(Z)!Soap+_OUhUkkD=)vjWs12qrkF$ zRm(;zr>$BsfW(1bBy@?}UGtL+9-G`*m|*f43rbhpRb9K~jx0Wa><Ll5Wk$nr4AE<b z`ozO9y8m8vl^d<j$aG}~On^3yjGiNrhO35gBz-#vCX~I43@fK+bg3SVjoz7nO++b7 za}Hw<i?~pQoNuO0YnfOgWpl6F?Zu?w5V7c1|F&ymI~67gG@#AdmP*Zs2~#@0v}@d1 z&8}qDkdNzM%dI7>{#^%p3#`WvV|j}&Yg#=>r0<y1DgD;ocG~9Jb?*l~Ni!6hf<2Pl zO{5Z0dte>q!^zgCtwA4bZ)7`>*e;ltH>viKIlJF)MYPX{on8`-Z0v8QOdG4k_ke)M z3;FX~=_JI7itP3w$UynwHi%Weg5=U$ki<~Rk)X#C0m&-mu=@Ag20Sofhw+vR2ksX* zf34e2gu%Cw`vl|fE^*#+8?8Z?PgP45^m{_cCCwh0)r-(UfIL!rYE5vJ=X+^y9%}ak zcYlBef9ax%w3shU8k|+*iMAelm6&zD`obkyi{dt=LcPR(MngY$!+RDyvzUARl<b=0 zlJak7tDk!4p0E>ap@~uX{?5exBmUAAE4jS*;!pN(zuo2Reo0x&9_mmJ3aquSV^0(I z+Y2v=?sO<O&LA`{KO#7FcqV>9dgEtR*B-h%m5@Xk;86n;)mBg-I**XWUpXv!W5rY< zRb16Yf-uk%_#_JH*$19~<E^o4+N(`n@(a`b=TA>JO^wXf^KVKzm{+-kF#E|laRa~7 zSNUd<=>Fl(skM<a1E$fo+3OEIAJy@<P{y-&CWJ-~Bc8SzdY5@oYZ<H+7_1ZQ1am@o zR%6rC`S$A8NTcq-5$uPT_j3EFg1w5A;EjD$W-P4d*A7ti9hjLuDD7oarL{feWRSx( z|EYA|hl)_7xcBG?L>$tX8lPqfWgPzOtZr~dz98%IFlGn($lgMeM&MfL$kL{GLhUH` zz7f2SjsHt)HDb}wsFkbG&j@9F*RZkfwq_zU$(7S*R8@^Cx=<+?W@r@RMQ*)cH+TPh z9`lJ;;9pts;Vp>TUnkJ#oGiyH60vP0?;hLdm(X?WeoQWsKTO6;>j%YjHkZj}Gx@_( zY%`yxG@aB+W+R#1+Rv3%5!;kauN@xlKJc(F-Ku>#B#jc2BEGqJ;4G{uRcXzRKjls> zuSj>m0C+ArEGvR*rZnOAJ<(pbV6vb^xoh>UrPz)%`cN622eJOzxw_@HOUlYhTHPBn zb#u&~0oq%%?w+RxMVD$JmDP;BeB%}pv97kPk>v|dTzR8y_N|+;w=SyQx}6+)Vd+1; z^_g)pb@{pB+Pcmcnr)`9^Jm>^E}Ecl9^6HU9yH?RNip?VE%QFsem_{N#zM*ROJa z&YAtusO7022ZOKB{?l7eED>o}x25ifQ>GSOp?=jY3$)D~wm8~~>^eAXW|U0dIQD)+ ze~OTaC-huNws#=L>T*qsrZqLH556@-m7U?9Wawd%d*7U)L<y2*9@6vfJO2ot{b%P& zASQ&$bfjotZU-`7A&u0@1H@V!E3FqH!sItlu@CmJlj&SybN3MbJV<eSX!}Q<hmeO- zeDCs$N1jX(<yXi=m$(!5i=K;2=(-ywD&QqpK-KsC<p83GjumLR4YV)s?%5fw4Cly6 z``Xy7(wN@_9jQnyn`iN)LN{fUh7p4FqhtF$?sTu%SL%VfStrBa3|BV{FP6yP(1rEm z)1E$MLLD7j@^<N8)xhpEqVX95bm0smz;-QmG9<59=%OuUsZ`aV3($jxL1@NNx=b0@ znMZy4PVki9=~3`}Gbnx0+)tP3BdBAc*kO(B4s`2akBLhiy&K-47?+`Ya&QAe!0_%O zl@P9YS$VB@L&MxBX?oXaUvheCvsK$K3pp5}7a;Vv-Ic5lSUtUo<h`nEQpJWf=}n#p zix=;&wid3c=^M^AgY>twd7HP|Hiu;W-OV#yn}l`<w=)qh&MIrut+CEF_Na77F}cDX z>X(pWt+Q)=fTie!5IhoPjE}O~?=FnVvCK-Nb9w{uSAxkw1*_LGJ}n!ZmFwAccF457 zE4}*WrTRKeTh#PqBN(l`J=~pyF+ad?jdNMGjVRYpryStwj5UU);`uwpYwfDG3?yG` zXMD2H+_?S@C}OSHD)CBAi1o7jL2<F~&eLs^bilq$XleG$h+~*X^G`5VX?C*TC{xj{ zDQShi?S&4@glkyeY@ar~j9$`hD?Pm}9lpzO$P1Z$vD0FCi-QUCkomM`W1t;J#o{R| zv&S;T7Sjy~LGD=Y27>ffuGY?u_lJ8DkteGb5V>5*ALmS$$a=j(G%xCAZINV;by_r5 zQ^Ok~H7zFkXrvv!zV0Y}prtNcIiIAeZfCcZ8C{vytMllNtIYSqa<G*-jJu8Caj|SE zR?MJN12<>cNNbaEXuoTQl--$%mEyUgBf5Ez$as>QUPxc1^=y3A6^`1W;AJgqB$_GM zSCgO(8(MpDNsFU9JDaIwJeAnoiIx1GB4jI^G%Y7A=|gKWo?m~G5_^^%xlJ=34R(tX z(Hr<TA4_fSY`T2wuxIbD99XtCKz(AFc-$3OwIU?=sDgOjoO9*i;y9`wzKLQQssl<z z+Yy1GP!}BRn77<pW&7`5LJ^F|U{KoNDP)QbWtrjtue7pEUM5T8wJkp`mZQn*z59V= zY`~F!VrMU|j~3zbE5J5hz6{@3d7dgdxgCbJG;BcRYxz1AmT-`S6C>qE#yWK=%*Q*6 z2iBv<#Z;I>hpXJX?ui{=k-s<VMe<}i<Jdyf0&2WRBYkFFF|(iFEtL-PTQDOL#9O1n zyH`)SqEIefuxHKel6mCUe%AIaB%UCGaB%{@*IKqQy^lbZlFwpyA-)c(tuco%I|y)y zpgVPtO}NQ!u84@Zlc`K})aD`|2Z$&LiKe01j9?$GUpx}7kP*>Qfew_W+(V?v0b=P2 z5ps$$z$xPirOxRp7kbOqy$@6<MOfZSRY2k&L+b4vra^u|F%#_+#OVrl6W#oCl&@=O z5$I{+v1==1Jbgo>;Tfl3tw*Sk7s>yayt1gf-J4`J0f+`@cdk}vd+RLcW?OTlZv@PD zPTLSc=r3acd;C_vc~Q|Gl6L_Mq%D@Ij%M5M^~vOI(x#f2sLlOzJAXXR)6qeNZZH&m zLj9cx3QKl7YnpVE%k%F65m%<1DBSFNA0T$ywHy{ZJUD5YVhAU9yBG^(i8Ig{Y761< zhpp-Q=HlS2QFw>L7tN^#(zGQ;mkQM9tEsas)m$xyy$}Wz_1*)qw{Nm(z00~N@y>Z< z5NW%-9VTe1f~!b-QqD}WTe8_J-42p9-Vn|3JoMjdLU|hV+=9w<DL~KkiJRs-TY0cH zx!a2!90`_5eNDnvN{8#C5%S@COA%M1)le+C1uB~Wl58N1zuX3xc2S)<@zCO&N%W7+ zTE<&O1a2-zI=R*3Z4$BDI=W)CjjANcTpJaN`)6Dop&prB$G0}wCnoDV`C?_7$QHIb zXs#(!M<W}qu^ZjPy&ZJgW`DR-JL0DIgOU#T+Hpo(dpAx*X5Nfwp(8vsv`V%b>W1bF z!}{OtGR}J~Dk-n^j<&_dh`pZBb%De&{QMz~QjPMSwe@2%m05XiiG1o^uy#oOEk3w# zdYiaZsODJwY`TDED*2hqQ2SoL7)Ix1vYS?T2|~mP1@XhE__b^-pDoEcj9Gjymqo#| ztz<5_bBOrHZMY^nVx?jX$)aR?Bb(0__x5v{<lZ5be2l%3IY7PmodkBz6S1Z2VRAQ( zuP4E+H(}fUeCA*s8?vwgUvdtTBm~NIVGWF83(3o+&C>5Cb`Z>(%jLIrkadxzGzAp- zL0oDvhQpw1$=$ttE-zOv-7CzhjK`Hb<h9Bm=WVg;!erf#wJr0^o~MLWHA{D1y#y2H zD?goWJZ~F#%k{&0<<sEs6tw$T-`E4|3n|4HMJQ)+XN>qEyyPCZ{pp*o?_Xr7&Yzp0 zd(RDbq15QVHjJK=oI~L6_pHLpvMYjTZC4F}XHfx%y8Rk%fAGNVdnkWI5;T)4`n#?; z8uK|F>AE1e{?_Y~*Bnp(bhJ?td#%Cx!qYbi8EYf)i)SU`A2J8;nqIr~i<=g3<NO0R z1|3~DN62wCQUZ)nR7-xOyOi%NB7D|cB*8^UQY+F7JQo&tI!|oEF{a$X1&&qF-VDN8 z%Cpk&dlM<&CddLI(PTQYRocj5#nU;m7cT6^u|8Cn4Ri-dB9Je!7r|v#=RHW@Z&3dS zS@r~Ne)7IUIWHUCVi{9QasOdD97SL6Y;h@D4BbtTKtmwEo88Zb_dMI!l>1S#87-iS zB8k=diiZ($=-H2~5@ejGLd9(~O8tagHWQSkgBVRae=~Xz$(JHXGJSj_O4gUQeOb2t z@zv#}c5k6Iwhb56f8FwD_q;nK+6m^J3U50PgX`hF%u*y(OO}9Fv(h3QDdg}lm0e#a zQN#*UtCQfWHR45s$!IWIOeVA0h##{NAI%n{*<vynjCh&M29w2TG@Gaca`~FNOqEg} zmrLGbc_s3^_j-?rjS7n6Q-ht3tC5=d=_cRc^n7c(<JKToTP;>IZ*P+DHTpEm%NI6m zaQSx{f|J$$I!Wld8+yUjzS*fx?dViebvM`-WHUzhx~V`%#sF%baayr$@A8@^=UPRM znn@%%<!>v4?Ff<Q3(S9EY>>kX+ZP(D#q~>#3-kt-b)pvH_29rdhgWmAi!Eqvv(U_~ zu=}-)2q#cHUa1s`t1RByvD6WlTGwu&EV*-y#JuY#VjK6@{y*bj`|HNHduWF=jy6jZ zOvboY|2S>NA(`#l>u+mT^(8yw#5caw$}kVbnzU?|oG-gEw4`a-9L4rnr6*dhGIcd1 z!>!iR%p<;L?VD5UFy3(yR}iWP;A2ZI2Mrzi;c6MUW=Tq)oFUe(!3FtWsp}Y=7>lO6 zII%{GC>=2#nC$URfg`w^bYnAGh@n#!#cc0jgAmG<qj$f3i%3P|);Y#Rr7(x6`J)a4 zGLa^`Nc2Q^Osm)DbsyI2bm-)XAFWQWFKW|^-o+EL2NZ@gk=oIvg|2|5OBx#T42lf1 zijb5(z^EHfoF8(8`<<HB#yzrDHyWJ0v*2l4luIn~u$&PV(u2cTneB#Q&*J!snC58f zQIFKlYdfQ}NM|Ec?!H}Oq*5b!NH}oyyO#Sc3ut=8qp#3sIo;!8?OzSi*fjdmRFXT1 z-XiSo;kk&w-C7rfoYG|wsqCVFaJFVN&Rpw<+s!axrO%W|xVFX4nurhROj?AWQQSa+ z%DJE0O`}upHmd$Y_BlxBGFzz~{GU#5Z<bOxL}`i#l3$cWE|8DjQ~E%tOUMJG(g!|L zA~G8?H>neFy;1&9kdPAPfI~eQFwX)Sf<ZsTFN!wc3skZ!DIx5=ga|oQsVS9^;ZCK# zmf=#w&)_cQ`4Ux<hWY?Xq(mSYmE4L9TO4{E4+4=X6-uSUdy*51=$C*JUqD`h#~WWs zc)V*%E8*CxFS_Ok2R8!I)u_w9wXqE~3&SgiN=hC>v^@e_vv^{88ZzJm){Yo53~)L> zM8crX(3g)8M4~U1vSnzt0vPfY=(~|CQSjxDqu6+X>PA%jNMUUoZOY%c5gImCUu*f* z#FV0GF(h!maY;vZnqRucq>&!W^&0g<j{}6ceMI$UQ#R@iWkTV#z1QZnV0!1-6og2; zJ9?GpP*M5b2S80e97k%S@ZX+hyutdGt@>AAzux!lzhU3`<{<2Ng^h2B%wLoJui3vH zT6^fBP>IDfCE-L8q{7zIj|PL(?Be}kYGs)`Rw7YIfo4d!$5K;k+X%HS<6}_LH3;6* z$Z{!P4p1&`n758l2^E>|1w3IobJU{aMb+o{X!bCM(aHbpZ+708{Bc3_q3_?KU%l|( zE5EvCokx_*j~q*X-ul&rulMafG&*Dw*lOc7+;b37R|I<wU4H2x8db%$8z~(;l;7XK z5=k8BT>Fcfy_<?_(M<{Vjq%Jn!Wgx-J>7m>1AS*pun|_|m&6X~enjjc#&urXvhRk; zleU=hE+KG1e{My+YBvy{+@eJLc9^7Amd#to+NPj>d|`s-+E+$1>iD5Hl~UeBVz^3q zV6p8;lIu%b`g}sBzOucH<eYm=3Q9#3GdPh&RczE%DwSv7S)h;OL(U?J?1I6++IsoL z$!}cw=C3Z??0jSOZ?4q-@SB%0Pv0^*zeAqle60<w1Rp>`OaYrqCY$RI$YHZZ&tfb3 zqJ#7~&8@_E-5jRC(Sp+VswP1l%~WlH<S!b_5y!0^Hcds3jMvX{XsFxTBl8XOWUZsO zM+Lpp^qHEGxncc$m3Krj&RwV<gd5jZt87%WCv~mkcl#v7&bq}Oqt&YapmV<a(C5#N zv05YCZr!c5>B@y!dF?*2*Roi5y#vYt4Y#jD*kiI@hc5W5_lOCWoGMNTxh<DEpy0l5 z4vOg<g`_*toF%mF<k>$&RuYk7a+yeGP&@l^|G}Z31a~cS_DAO6jJ7dZCm4c?Tc1+! zl)P?v$H-c$b+WzJy`Lr<7vqC-qm3gXp`j<%oa_zL(y+k<J6hPBOmnw0dfQ2IO)LH( z=TvWi?wA<$O?2PYDEWF(cf5aQUOmL{g3&Dv>BSa-oIC6pUz{cRGefUQ?l8T7K#O*5 zOJu20+vwy_^=2=-tJBi!uh}Jz2?I)>w5)b2XDgYmx~)Vraw6}|0qi>2><;RpgAA7P z8KmeR#eq;;0n%1t2g>V1mN)p8OOwqDyQ&g-Mcu!=zyOt(8FnHgu2tsJ3}jM8>xhdv zDfBp3<p#OkHQ+)Vg?ed(9UYTKSZ*T&N`i|PQjTmauB(?VU0s@kDec;%J0M%sC8uZN z+ErLOlA0xZX_~XIUNr<9Q2G2*I}XnBv6*4m#J-^EQ#+Y#`?zzR<+sttbHsU`yR0Vm zVY@~Ym|U^-N0{+nz=yQQJbFb@B|b{ogY+(las@~b2>vIisvo7TwRNoX8d{5NWwsND za?6m|@}d)UgYUN{L(fm_SxLD(<tFI#v#bZ%*&Iyz$w%*@Qf@B~I*+1jcrT$QM6Os? zC=@@At(9}CBYR0wGx_RxZ|uT%$;q=5Tdgl&l|A$T$_DYFd-uX(P=kG(ddDU$W-&~B zCZEJ;F>v@hG2rP}{^gn4(A!_PpA<dCntt*7NNIXtzz9Iv!z!b2pBHyN($*z<Kuz5X zoDO6;w?#gT1tzgCU;Oi$xu5>q+b0YE^E;bA>)CtgP9gY@VEi~X;6?eyW67ctk(ZHK z92lwB$8hg=I1R#Ik72Nd(r>1~qVo6s7P2k{MNdl4YfsM)tggNGSgGMHa{Wh@`G*P| z!C$(`V9f}&*tXdC<gR3)pd7a+=VE3ChvkcN<CZ=n|H>{&FrB_3!Pe~HW~a-Y9J3py z*I!)J6=y`d3;k<W9=Z+)bfK^(p`WnVP|2zR#)=tTV#&9ke%(={P28O?^l?h#b*@&< zcFV1iJ6rTyGxvd!!O9hjze+aayL-F%-PzyW*+b{Tz3rf5X=gJHMqXBWXo@g!N8|X! z;1a)EJkaN|SBlvhc4sH2Z=qT^(AU80n;RFx^t;b)otBSJ_bpEM$!B{_S>H8V%UZL3 zK{VMm#~*`-He0<YS1j;a_kzt_KGwN|%^U}3`t~>a!>50y`KpTfzn|~_Q9Rc2kMeJv zfA*)-U+@1q`Zzr}|3yeC=;?7(ix2p6^m}Y$8{>XtAD?kBWGdEpWAmhDW_sWTca+5$ z>U9lzdR={kbpMEVR5h3-!ulGffGHXfN;{;}W5Qt16;-RR(Z-sdV%gZ9%Pvw--xiP7 z2-@5Zrh!9>j5~Da6^M2Ja`D@zzw?iw=f5}qx82-t8)@JDyOB4B8ZQogZ|H}tGQ<3P zqo%}x;yoE555MKHeELWnqqKm1iVyF_$U64aiQJ+fyb2-XltZ%QR&O83U{O1^qliEf zSq?oE?}Fvn4z0%`LD`}&5nWL$RyCF4lr$LH_HBoEC6VxUFs0rn5vhqzcZaHF8E-6- z;<>cyfWze_N_{G{wPaJF&xP7@C>EwX{Iv+QGU8Ag^^3rxxfZ*DHK*&>k-4Ew$)J%n zZ88L$M(@`fJ&R@b`Fr*lY&L4|=21b2q6DY%XjM_n9%kO53fZtS0IHz)tL&Zqor2Er zMO*ba(~3kb$eg^3Bcf+n%QuJ5ni2E;?8W3EJdpSuV?P8Z!slcn%IFzD1qS~-DT9d4 zCm(r-xq)QZ6=?$hZyvsk)DDE4LWyGU#cYlud9MF8)}v}=)m`}_^I0a7Ywa2ik`fAH z=Uz})E)roa6pt&-p1w{mz0=oo1}(Q9pf41?`sH`oC@BW8!*S<g>2Y%CTuP-W5_XS? z9MKr#$eq{jUKnL*zZmY94R;h@e+!6t&P)zp^EuBGem$P`{YK-{{frm-`}lgOR*yXE zGw(r#(gA8Dd{DECj^ztBN|460J`O}GBtt8J%*+e^z*sl0Z~CHnSjimI4>mf%mY#2x zzSiSztbEglB@_%zv=4`xM;$lb;=a$*-qAK-^noiq6vLyAIL4ZDgVGZq_kR*g3+-Up zxr9|jFD8^eL!quya1!TGvAaN(@QQ^~d#GRL--1^tS14o-(4%<0w3WcOAA#;mN6;De zld<g1QX+ns--)m7<gz=f@%VCbeSLE+xth*zpipVCgr$3AFH?*0Cr7t1E_=K?D>j=Y zzPoHQMz*)MY$li9VRx@t9Hx!kWrty9XDbY19F!6cG=}3KXWA`D$Q=)t^Mo;m;z9_? zFClS)!0H9<<DI|M|5Voi{Kfmd9s&=Z#R;JDC+;m8e6DCyiZ>LC%}|X!v!6?6Ga0lW zdgmDUOB8B|qOo*7#EtCD|JL#uu01B3I*f3fTLO4mH=kr?`5y0#H?-r+=p99Y9~Sug z`7;9M(I6>TC{pIOOeUK@%%VF|0qrA;i+B19<EI#-ZsdQXkXNQ~JPo597}PPi^D~7C z)VIhN3dixvX3_;DA(qfapjbGWFJy3xx~`DT9i5=waE3Ztp3CABf&vPsa1q+o9H5BO zyP8Fie7Jysd)@aMpV{bXT6puf)-P#kqL+FHTjv`2Z@@s%d+QbNi;fm{M~AbGf9|&B zY40Q8KxNzos({=8_dX2ECiph8>0Na;Z{Byx)EF-n4l(dzp_o5@K*5SFkUs|dKH$q9 zp!{pGaGb)rLu$N`<%-AP_{KTJgWQ81D^NHF=Qt)QUvWs8DFGc?N>R`q%c9XI?su}7 zg<+Fw!SjyJ6hN;`P_0ICZM^>6#<ky?Y4Nr3o9%aN^>>q3hsoaQ;pb^Rn|0F89{zde z3)7n&)sF!7>9Dk4r5zB6lR=F^Hb2ZX&g;~p86uyBirZ~PeVQDGgl?b54|8}g6e|k( z!(66#0%OARmWohx5e`g|)qJrW_*6WOngP^_WBA&!LME36te6q%7Fa=GL=k}DAi{`? z#Sh^Cw0KyM^FYvd!19w1l}J!V7Nq^d`p)0-Y4{qqEULAftM_(V$ST62Ml~hjTRnlA z-n~h_zhCw!RI~MMjGHfxycOc}CYn1MT9~g@$^exTA<ZXyCM5iQw5q`DgZ=|wD)KN! zV)~D!`3Un4flYt~xS7ScDVzfwh4KsrdJI7)S!!+YFK`u>h$0G%6%o1c?(mPY5@bCt zIMYiD-79+!Z;ekUT}vUGd)1%W@<jsiB~*nExkHCUhQ1?@4TcFq8mNw)6=`rQJR18Q z2ty4MW5fzTU_=GHLPfDa4W}ZFPDup{p$cj0V+N~KESxF<t~7QV&K-xH;Rx5Luj5j9 z+w+-Hj+*ZySA|4hz(*2W$1Lul5nvejRk0r1OdODt$tcM9PP{w>8yA{@0zx2u4t}%; zb~{vdiX>BIeabOT^2s8MMYD4PK5s#=z-iwj3o%$XvW1TwVnC2YG3lj3>PRFl<jXT? zeMT_12c<mhI@mPnbUJ_H01@!HqmKue@Dm{9M<nDFHb(Xkbe-BJg**&Q)D3d^Q#g`I z74Cz|9O>1ci=1Nts>K(7G*F#EUwX#{hG+(T6J1bxR<F<io0e66`vAf2v9H19aH4tX zP0b{NNFRU>{Go)o1(p{-L(wK`x{G8@El_E-{2n@8=W$3-+Y_qV(H6lRKUOFe4vuI+ z35`&o(!vG=KgS6egkZeNmMSRo736c2)}U-M#nK7rB}ZDt$0(J6I*PwXqFA0}O89cR zbOJ>;aN^yrhQ@U3&^IUPZ(r9<ug}6nH%88$m&Dt}MWVi(7r%HXIouo?=y?hI-E}6F z9%5-GzI<zYtbgN@q?ZZix$wO?-#P1KUzW@>e$X&B*ye0vgsZNsaPADEZuc*&byOGz zs4Z$%7Y~qvge{Hb{gB(dwX^!2A8x_^hNL}AEJYMgVa&+127VNd_I4hW0Vcd7%1|nv zz_es2Y7g2*At8mY)RwA%j!WSy4uPytRN@F<)6|u~S{yh<8PXuEVT#B-zN{xTS8m*# z>1PUS?;0UV4CHTW`Z`YcU>u^WtPvJ%z}Hfp=y$-AYQE5OwnohQa*gb{8uitDdmrSv z7jM3>Fl>AMMuNn?*Zs<5?RxuC=V<c+t$OA9`@;U~aI=lN6I%g?uWKo~W_P-xB>T#L z`^wv?5(Pex7lWg0ilq$J@X%)|n#%RMtf|6mGU!UCGIPm9%*QNxL)v^?XE2*gdGj%o z-jFd@7<EQV&V1Zx&>D<cGxa6&35!{;GnosfQ%18hhWIZEY|3>&_4yoqm3`XC;i!1u z2N<&6OueI5a9vy?zS(PI^K4F2*G%Uwvk!*wxvTuE(=x`FZ-&k>t#u{di)+MC=f74t zm$(coeEyq@|88s8o1@i>MuijY^^by`L*&_KfE(7v%89EpwyQ1lp392h_~{@0$&*ih z`2tp(GB_4c+lf-B9X40NUFIs`l{@-NJQWUiz?JeI_jr9i@W%t+F+Yq!Xh@j#mHG2N z;yvZ_dK^xV*Xb&{PkJ1B6e`3$?+LIva*#mi!uC!|iS(e~PHm$1b+Y6Mlt^5)cCfpB zxPnIWg#$0_-|7$vx%PIx93v}^y^WF!`AMjBwH@6h%Qmp;Sazk5$QSJEnXUbO?XCVt zmKW`_DLB<^DSNJMG0qpOhx*+G?{LkZ{`V)J>?IIE-dSJ71wk8HGlheDfe!`!{$L;& zborx>g1y3Ou~<u%lU9q-ioOncN4dj(=qN+hV41yuSIK<B8S#gL{$hXxPxzcRp!<8A z0{JzoDHyKE;|6u^k<n4B@KG4UAns9S3{=aZB!|a3pL}u{y9~0(5$?fk{1~VQ2`>hN z`~J^|mqNi%7(Ywm$@$q?E_Zg0JByz=E{{LMnap!s95Q`^GsDmZ19?9QobaGH!F@w| zB#4S40n|u7orSzZ$@r9I77al_p0L{oCP{IfRIHgp!BpV$OS3|y)uypHoB@SHU|V)O z!cJ#26!yCV0iEBQ3%Y`jhl1XyN)Zfs14aL1-k{el2aC<#i@=cRN=4hFnlU(77IISI z^LTigN=SkX1gQbKRIvmfGHTM#RaM@ps><FuURibLPF3;F<9F{=-L9&>GVijc%)jAi zyxw@T`A+rQJ#LkP%W7#G>22aK4sscN^zK@pCzyA;+>d+Qj(}1f4kG%+|CrAo2*?hp z^}lDIH5BJZl8#45cEp79h0hjK8Z)9$_9_1W{A<h6I9jYzR8jZMXJ5!aU-n!9uhP-q zlg~Z>>@z=@vF_`C!@wD7uO8-%)H5w&#pra?$VhdaOw%^Wm};aAxy|;x$K`q4>9Bj1 z>Sb@hi{%Pd+&?Nk8F^j%KBGFCFYuqwB2>F;WPDaRM%PLg=Z(v3j%c)FUM$U!g&$tn zKVNa~{P}aa^C!+-ewA-C?OTpn?Y5GY*gj>jOQKG66ZQLi(TFePiRhjFklR)C5Hy)8 zc=GqXe#z}|`vTEL<%-J}d}M@%oZVXZfDvXe!r#EA8VfLndz(6|+ZA=Z;uvSV=Xz^9 zV}~sK#|4b8aK7y5l|Fys%$v{gT$X)v$wDy73bSK|S>Szy&zqa$^LTUfbJLTYDGI$G zXR%?Y(MEh83c;xv1N!_zHuFBr-H+C=Q21=VkliPVNFuW0kFB7Wa5BCTURj6flFWVg z{K46>Go`bSojH5<?K5~Qy<PF*f)ixAWXze48BL~wxeQd`WAN#k;Mz4Dd3Q}Fi^Wtl z5>v@kFy`?pnDY4h%edSKr?1g!G=xIFu*Y}bwB3_{7ms$~j`$ahm}=@sZGuAK1Z1cJ zB`tvA0@=`g5F+8J0$F<cr_Vg|?6U{YeB|fPKL7LQe)6-Ye)!X$eQ(~B*PqmBDG#Ks zs3!*MRlX?OmzHG5q#8p(UovEH2(8(1>M?^+=K^&LWHE2Yr3bK|g78tyN1;|()n4@p zxmNvNTog4V*e*&1i2kMGuc5*id}EN7!NMUvQ%oKMbB!~YS=KQoYof&Z=meX?nzJ|^ zW`{?pbh%5OC%kT;7^tZasOI+te5C;KA5%?nQ*$Nm@oApVgNy8*V?M7hO$~`cehleo zPbwFUb{i1kn9XV{+Do?MRvZ3H+fUjowne#Ik(TEWEEbWUkQje4X2@M2Wfj>>90gxb z!WM%f0U%`1VWN%GhcjflICGpoJKc@k+|Nafp&%OS&UFdls-Mz3bw-=fZm^pSi_Wm# zzUx00@QCt(@__#^Q1;#{A2<>8d%^b7{u2R32J|vV?%7I=tm>wg&i1y3_J*38+M34J z*3QP}HZ(Oq*-UG-qz|^!X>a;O{Ju4RSNQr=etl$a#iv^f2)7ffp;d3dqD6!OLIoe+ zYRys=4FdW=$^YpHt*N>BGVR9scFy&drt!wn>X!QHsNUw=^H%tr;y}S)?)M$~%N}@T zzyprIGteiF<P85m{`Ob@+gJYVmyi9$sbbm5ir@a-uYLUg``g2^lb`&fkJ3qQ<H*{v z_mGU3gN*p;f`49ov39WSDs6+=z+twxUhYNLauqef8N7a<veE3_70Mx)`4+uCa8aRC zJ~uSmPv>%mriNz+c>{vc`H0csrv~hLp8*3e1Au`VbA=p|<+~z-jd`c)`t_R^F5S6) zu5{_KYd7xHRMpm8%Ut}}h3i$<4Cq2jGLth)IwH@6zud-8EAq-cSAj@PL>%V#n@Lfy zoAk!pCrggtw$0pUEE)QiA7RIou<)t;8fQ@?mocX`2kI$>#@aKk$pOYBIkn%q96>s^ zUsv)IUq#R#2p2*p0^wjN7%btRU=Rt_d!7ofQ~1FP@eWYGd9)73HI-7OQmPjnZhyd} z^*Wq3iv=j}_IbSp&o8^2&TR^?v48T+KArz}(LaBA{6AWsl|4CIUn1Z7r=2g3{PU<E zq4DQx7yfPN#fB=n?ef|4|J(CbPV#*LJC-?s0{dYQ7TCE_`;Vx)!o^S~Tnc?85Q;?A zJtU)rPHq5+FGJ($GGEGH5i%`^N`kbI2r7hpS?~kV>m8^*cLbH$$q-7UauG)=R|pka zloOv9aE0^pyo~$_sbr0UXyv=NMSpzyFYkWm%Y^g8rk{QDSr#F$eZAqY$N%9hA`LTt zTBHAaqW;%ggRV;#zxqnH`dfiVAfnK*94b916zV}yv=YXsDP+j?(o211^kQFGPpS74 zG<tt+rD-RG#=Sv9C;*o4_Z<K<fQTg{!GqATpg)`sm4|}aP({G+_Z4xb7&;yd1wz3b zb@pg0W&9_C0of5c-jmeLW)^FLGsT^eiFiEjf<!dMo#ylBxO|~lDwWCPeBr`$n1XcM z@jtFVOTNkayN?-PuT=aR{nvwpoH_fCXWPH7f>-m?PfzXswfg#*j&ozT&s_MfC;8(m z4?qgKRm?+IhUEedE=Xm?Pa>kA2-ysB5d<{QV;DE7xCZ=^PvHo<Z}Du*m!7%M(^)CD zA^6DiF2pB1AaW*C$y{c+_j=sq_P@i$3Z^H_IBE8T!a;!Uvzp9B(-R0#qPQL2J(M&Y z%KIw<L4S~99Tn08N_4t68K#KfZuKiKed~MQ{uzCmGsYYlYVR57YH6xI{oQ~4#=n01 zU*G!q%MkxD8R~PxHU{b4UijE6w+}a)!i^a8wAZzutACq;$za-u{M9R4yU<c+qfBN^ zRp^n)fI$R$BMdjW!U@z+Ux`9!{xE90U^4cyo6w8gxKGMS6;R*XT=$R`>(<8l+M>zl z@j9%56qdf=|4c|TwXh)I@fY|!K7M&T{+!Us6{01VNc0tvKp+xQZ(NysQKi-gTsVWz zLZLt?#+yJiE%7Q<8XdS9_^54h(dd6y3ZbUt9m8@_|FwVnjbAGJ$P>T)!uhHNF4w|g zOf_^%<Q;$X#b5dK?|$Z`|ML@+PR`yVwfC#z)QaB&5`{SnU(6G0%cxK-nBg#(+?grF zFxiE-nUk~3*5-vip`y>InZ5#Scsyhc1cDy3#{;fZ9-x2>>aBW{(&t8ZMQ|&R*X#F4 zZ5F*r?NBfNf!3;38H`q|#-`$SwU2f?TxNsC;4qu5R=x7*gjvb!>KyN}1xx;u0jYmg z>;O$W2`soLoxTHQPW0hluPA%$<G=io^0Hrf;f<%S|LFTK{?D(TK6Cb;|NQeG|C2AD z|GS?c>*IZ)gh)mie+lflUx5(eXdWIGG1?~D>U)L;UYTmu*c%(_+Xsg08s8pNcH1ql zy@Gr%<T_h0<sOp@+DF!3^8IFLDI5+34CeZtW>s%3ZD_d7>~Xm~PMKZZ*HAw?)cJ>Z zTSsXvechd1(~Dxg)x2PHYX)kohiTnIv|(D?cvoBJq*kOh>E}#AFxV54cuHoye>wm7 zh@=^Eia+~<-+%H;fBC&1{N<ng|37@=>3@6b)f;UCH~#6bzVq+j`@KK^x9b1#HMA!L zhQ~Wuh!KB(0Tf`u3I^{#wXB<oeIVv;M6$hlxU{yB%%pbE#bPZHSX)c1@5A?0jRcv; zBR0q<9&6C+%=*6=v^P$wMaV@9>z%U$?aI#jJJo%)8ZQ8L%N*MN?unLx{;#yuj`j`@ zN(Q@m@WKW3I;(4OsI9w2!%_AO_Kq?ngPpUBvL%l~We7qJ3{DGG4Ez03{k<)%FG+vp z6Myty|L|*n|L1@Ed;j%E*RH*G{^B>j|I?rR=m+0@`L%!f#$SB*>1Wm<muwK_+un>N zn%~&}#MX*q%al(TR(DdHyM~p#Z9U<AsO~8xhUL>4kTYa4!bW%k7R)1>MYTdWSwi?b z%xaV|4vr=2_$RQ9XPSnGhDVzu4vW?73V0m;obQX?&>*X=x#2W@8Q?igev{rP(iz;q za-U0TGus^|r@{CYv&~|#JA7`lLoO0)7N>1alig)?2HakUNoTcrT_(F+AXKY3W@;t^ z7L`)>&Q6A0{2p=Bmn4ssee730_wll_U;g}Wedd=w@jIXUXxXX%@;iU<sgHf>zy0y= zeeTzO<J$@Nk>Py!zEs}Pwa~Bp<oK2Ow!5jOfl7|1-#va?`<%1k?GP%2Ke*2;5d8sL zIs_-MWVksfh)MAzHa{fmQoi_WKqR0%>@US7ufrFTDFaR$Hmb?$$~wQ`7KnI~x&DQq zYKA}0n-@vMpilVa^JnL+T!BO)Rw_Orl&Canl}svMP}mj(0-4_hcCPwWxkM;aDioL% z>Ac)Fj}yK?2trITdVC4Sh5yUmd&kFdUH7B2C?qISl%Ph*b`+bkV#$dt+lX5d`)9w0 z*l{d5c4E595{n3tVy|HD1i%J@1PKy_0EpfRkRSk}_qw~-Hak0QcTotiqU~Y<Y?=9e z?<^>hl;U4r-ajwzLoR1$G4-5t&pr2h&Mn6Vc=N!(&km6AH9j{lK%(9V3Z64>?lW_O zfAX7`{_2_MU;o!1edCK16&Ug?^$*Ct0vWVLIWEwJNta4qNW0)>ca_HvoG7k6RdZ=? zdAe&^djDfGP~r}x9ful_XcJZiKmZh>+G#TCj&yV(Wejv-u)B}32wJsqihj*xA;rux zCZk4I5t~_m<9fx#jH(+Y9qJyv>Eh{&6_w|!7o5M`a{Y1x+z^@*?UL=A0(Um6s;%^D z!G)UI?8*+>U@+o@&2AIetlVrYkI+(B-&Ln+C4lvjX1>SU@bxcJ^PZg_^z-PftuH<Q zg`a=${0pe_@BQ1ae*UE|eEF@fP(K+V22M7W%C^{?JEwNN&~SaaDN4Mw{}8+LY}2v$ z@*8q-#_)f}IQkjTgMgj|@IM3o7h#oTTV1(Y<R>O9eZ9^7ZEYf)Z!J42O2R8*e_hqZ z_|wJ54#p&&IoH~U#<(E<MC`sZ*PqJ0c7FH1txW@>2s8bRXpXviGU0gMwHt}MW4B}u zNFs&9i$qKG-b1Nd&&8aIJ%8-vmR>9HkRM~unsaaMcfLf;oBzy@D)hp|w|*G*v+(bH z{iAaicK`6g)#zXU+riZ@|08-ri8;sY-;u1xrmdoDQ^Md)6dbw=NTHGrOLQtMa>-m? z@~N!jW@cw}OM3392D8Q3p%KI}!N<KU^kmi+l(c6Rm6cUBs;y{KD@)3<3hJBZUM?!n zypp2>+;~Rd^RL`!%xk=nSC?9z*JPXK7YW?;!mEu1mHAag*Xt|u7=rB{;l)$;zrOqW z*S`MdyZ;*ghgEO?<Yzzr#c!5JAl&fbxq}~t|8)JIzx$5TG+}Jggl7~!B3YszI!8t; zK3q>p)EgaFsHT|PdN<(C&70CK&+s$1ZVunReQWp@zHZ;Tc?<KQUK+f`nR`k)uL|84 ziz=&1@|ujWR=xa)_(e3poM^S$Z1#SeAlU6B=py#p`}_LMmN_=F*oQ*|bo=-qn~19< zYmluE6_FhC@-N!^P$z9xs4I5Bs1FzoQ<|n8U*k95dhPW$Ui|Va&wc6ZZ+-n=e)`Yf z``Z8d$M60yeC@jLyz$2OUS9AE6c|+0b>e77GKRsUKRrRjFwNHT;m28hULtcOrUb@d zqG=OqiP50fOYp#h@Y6&i6l#EXGHsMiFVc*KV|a#U5x}xG)d61#nDjJ8%dEtx;P{)L zvv4d!o6O*yXBiSD?qvf7M2)8vu82Z@>ZU&A?#;G8zUBoX^XCW8d20UCPe1j_%g=w| zi(h>HxtCvA^!%bXUVkxk;Zp%WystF4Wzm?yyQ9)m`fRN`z3gmL8+UOK13FU6Pjo!C zh6o7^d=XQzXxd-_fPjl-Va+tiH?s_5Vhjea(Px@6dQ7r$p@}gYO?+)jAA|6v!EhfD zvqgHH^3j{jdabTkZ$P7?(e@hHK#S4O)Wd$a!jRu#nD0jr-r6}7rE*e%!SfdcOO)!H z?|P|czN^$HIk^z4MBa!k-t}x$e!BbAp9kA^VeEZ%O4Rjpk1;`fYy^qCt`VB;O(|t` zwJkmEr5(mjeLIFHcI#?P5IIeo5$<HrOi(5t9cnV7Fio_P=`2FS&x!&+DM&U+lo76e zxo_y^(C{GK9Ns!~XK1LO7g?hjWvLGkIIc@+2+)o90O_lz%rX0S@7cX`&%pynVxo_p zI<Y4vJuCa%iBr3eXYby%XaA0i=v#xbsUsShSpHc3_GinRj+>507WYMB6y^1^iKa83 z;poc}0lco;I!i-xLF}PJMbXKp+bWOcU&@J2J|BOArV;v)jR8<WufeCM3~u8yCZoY* z6!VtUiqJa{I>o=nX?r!mz?>)y85zddtGS6v$EXdouG40uxqfs+&;j-VLE))M@m~Cc zCDe{PQ@)uAm)kYzoOVt~js;G~=;+9VV`9=VhPnIBXT~uP9z4lynQDH*;_G>~&D-3@ zPiQ&BXXIOgbximSPk*g|_$lzzdNMot*yW1{lM*|d52s!#EKWX=k)}8MNZA-k`AlP5 zU_w=6nvxo<7M2$#`PZx^$%$vv&ga|d{;rJTww7LlhC$RZC84=NW3m{#j3%>5HU)?l zu7{M7AC!N|#iJ8RJ#HvIP{<DU@Rk8h|1i3Hhlk1k$>BhkV!S_tPG^a|qo)n+TC>*B zqt*8s^gVbBU025R8qmuTgut5t^<&!LHA#jLy`{O?3YUVA+E<^FdMtBK{xEOWHeSi? zGOLYrZ(r*V|E>r%i#0WBE3134F0EN*64am4`l3=RG!u2FR`2b;W#G(1+|7ym_oaIw z_wU`kcklk4+qXQo=iO42Nw!vWdu6Pt!^2?+aQDDSJz}FJ85|&T>bTi!Hlc2tX*2#q zL@07p1=?&fdLeGfFK*+kxJ^u5vz3GTIQXwHtRDIy_E`lx({j1C&&rrs{x@Omyczms z7jw^c25YSX`v?dA5RTe?{wF{9+0}uT4o#iDy8*d6yF1k_n%=r*`(5|#g?<Kv^<}l* zLANyW-0hJO`Odw&7(M2cMsH0fJEpL{$WxPVHAq+i&}}-38B>q3wve#qb>7kH^+t3= z^}2L&uTMwm(Tk#!@QvTSKE2l<>*v8J-Du$%6bpKsghg=VMZv<u01H;LnbZ`PuPZ^U ziVNmxyI9f|jM~D{;sAo1Qv&+$NYst!(x>%ZGqvaIZ@n3RU!xQBW{VD%Qwu6Aw7M5# zrj*9-wx7dvOwNRN+Pm|)tue>iH|{wS&m^Qa?cCM!D}8i6IIP)zvVYYfUHPf~fC!Ip zh$R4hGc%Iwwz<!1ldZDNYnN>ScB^&9P9ZiW+h*+kqmpgDXtTGq2&{!il^^3N;0K9+ z0oWZiUEu9~sQv=STNp+#&FxiptF@?AJ`_9p>pa-an4Y7}dIN2MKA^DC4J6nEgn|&c zLk9vPjW78v^#o~q2l{!|!ihTZ?p?I|(jEEkqFX~sJsKXq39Y;%XUEIF7<W`f&X<d8 z({u8Ro3bu$$}TIpdLvf8a?&Y#x5WIuI;kt+;@HW@3zc*wqepA{j^$=Q{A-z$2`?hz z;wT}HI2UXvv4t6tU;>}`G#Y)d*wQRm2<uon1Vu`K01uZH9a+3+;y7I(Outd0y)Z3a zvzMMRKZmBk3{GMD;q7o>SOCl*+$w=AGXEO$dprp5hq#?cE;%-SXWTPQp<^DYQKuK8 zuHo0c4N(;pCyF%Jzg*FoUtUqwoohH>+E`!N6Rj)XiR7*+&MPtHJ=b&gAA7u3`Y;WM zaCw`#$+Qv8MYoO*xi14S?M>1n2&E51i;9CYdaurl6LN2e{zfCO@OT#z0czzW<FgjV zVrE2+F_{>~Li0wwYz<OSkXH;*#6)6KKHiJ#pBH#>pik_Bo`{UzO3;@0faQleKrP7D zFgS_S92jQ<@5=WI>FyjO0kxSa%o)X)2aM5|Fv?*R@cc1leT87$Dey#du5ps@ZvxBZ zO*$sfTu6>*v4A~U^#x1lP2dbx+>;y>jt7&A91h<^$fUUyumerjBp(F$&I{;?6j*~1 zC1mvJpGJp=T4T^@4F+1@X<E>SN(<lw1O<hVu)4oWMAYN2$T4BCpJTy3XW(ph9c|}W ztd^-mu#Z7k(}U3Y>|iUBg@nQq7>}{?HadO5ig}Rc9OHLy-@b>O@}on@uMVCjCvFdp zIPVC3ckbRE8Ff1D+#Gc|rHPO`w<bx$=p2{E<~mI+=(Q1GY@UU%?Qp07YfWW&=_z%* zWLd~u%fFmlh1y8-xBE<8-!bz5!6+(=Mav?(s%S0B3r%*v?(!AE#_=|xV70C~0;mfX z=G>M){pJi0l=yh(MUR}h`9?PeLb`nuNIqJQ(c$h1L{{e0YcKU6dVGJ&X-(c|nEfeG zJYjag#7<1=i>sSzx@xZ$R^QNE9W=G}lqBX2Y4Tc%E4yx$SKMk$EbXZnrhDo$jrPID z_A;wuY|LqFhJh5&;Dy?<GwW+pD%!z<v8EyQQj=Zc7wYO-GE#2Xc|ojBJah5v^XGaj z1X~KmjN{E54V+y1vx5>No4-WgEPwT91~e=dvu@>kzdLAQ%q-m#`5)hY=|kHi-1>pA zT8=K+-Z52w<H%Y5uK9MU9%<9t+iqict>%O=S2JEZeE1SmG<v7F-d=3E(KdDUTELAe zL{pxrK6@hTjy1m_CgpevS5WF3eZ2U8suce%^Pq`yx-4ngMX4D{=$gG!kjpk4yHR|( zSfgnXk}nzU=dS408CPR7Y}M+r>lv)B;!;7k>tTt!W=*@6c<^xasX?1H?v4E!m)mSS z-<SEV53|y%Z9HeqTlMkgkG~VqY{DE^U3c5wKVLU#^@gV31b;Qzr0><~n%2GeTD%$q zX0%-6YvFnw-D5CzL~s3F*apEb5#rdPm+gT>4(}>SE<4kA{(819v33I&71_G)`qX`_ zW_bQs>Y19&cjIpi>@CP>KA3uJw0cMPj>LetXe*|fH7v`#bmOSWv^=T#g5%iP$9!^0 z{+WW=oI~`Wk(+efH5>bNHXUa$^|ht+-P8;)z5L+dtr3&q)*Zd|X1~sA?j5u0MW*uB z-5yj&$Jn@{BdFX2ztvuCyK<wr%4X$ik6g)4YJo)hdrlN)U#hY37IwgB&>nhWU!zWA z%31Q^doeq17<w=#IQHpxT78-?X-$c5{J2PG)awnM>)#DOh8e_KL(}@LTYj^LBLX44 zq)Nx_1A*+-%kc#X_j0O>i?`RryEa_9*|Y)iNLh0{fs4I)D8KYZ;r4Tht%ol)3>?~V zHLd=o+C&WoFI1hBbIT6)>vmu&b=QXByW?Yz>Ig)F7}X4t&e4M=e$qMSm>L;(V!*3w zW@r!-K@o+Yo^l{Zq1!d>o|&F>VN~(GF~`LHLFWY497U~pSR@=gU^{$S)FQs7G(Cfe zL}070W+Ydkbz?cBjXwWUf(FA{x^r?aUXE=S0a(PA$W)QzecTu9Rqg#&UK9rte%)F4 zPTe5l*{u;P4{T3RYRzLJ>5-epysZ<3Wz3bK3t9FyS(|6OUTMTIx}nyt+nt6i(RQUe zx0a3FsTJ?16}I&XFYy}l39roe%KCm?lC~4;rd&VYoOk0hBKZdeY7&tcx#|8ZY+GJG zU8TJ_T3xHQ(5#j1VYCjD#@fSnG8!%Ks?mEp%PZ^JZ`{MI7HNFmry{w>hd>f~jHJQ9 zCw?K@+0)ylF_;WSgt*kLf2{^`6U4s$0bM7J&T}*YXwK03qmN4HM+iaULdABqXzl7n zzZPStuV`x3ie#9<1Lc@C{z%a5LXPhM(`7PV3gi3kNLVNZQ+OXQ>+e6rn5QTAMniKq zd!f3$w=gRs?W(b)B&{fQxbjN&$<m@TIhm!C+74P<RbAWOGB)9Tn629YEX28gnr48r z5H&F9IJ1@s0`(lwOt6UYHyjuy-MrX&0eqelI1C^X`p~x|GA7Z&+pWrgi3glKm_Rwo z-9vEc=54G%;Fv(L(7^&<s782-gwJl?8hV_g?>@xQ)Gc@{&D>C9JwH_0++N>oscUI$ ztGQiR(NuNqQe#I~v-2i@7nAqfDmvT`^JC)!NkdDzK^P-1GP(dDDG3AIJe&_LG6A7p zR_3201w*=o&^Ysg(ZCtaq7MVffK*7IiBes^=Es-vf&HCmugGL)UqKDo;SY~&=%f2M zhJ<|4r8no^?sEr`%Lj7;j()Hp8y8{7E<!hQ?)A^Gxc~!DkuIB5QV#itok8P(9zY$h zqNyhEWE_kC3L}$~jLtbe;TXr+iBTLLeS}R1qA^pm5g9MA36xJ4fYB{JbQk)1y`;;q zR;p7qG)nbft*fs`e7T{vMO{;0U)NY)-P+#N($U$`-rlMwW!U(rbvj%!em%OkH@4vJ z`E9jn1$Xxxfpu>=bZF<Xu7-r2&6>EQF1g^Md@?zDA4d0`I1+lj{aDS-)AfyejhENl zkY!uf*kjE(@R_ubfR|eYhdIYEXKX?m51tsquZijLr=0lZoWvib$_3&qcGTFcnzjgj zr|(mK$(RF~r7RQN+q}7c^d7R5jREC2oD+9PM(?(C<Nf#T1LODaLy~vzjgAesl4xTS zhVFmTDD}t(FVXSiaR*1^PpK<wa#QJe@$dylVjNw})L%N?opAE*!TWM%rhMT*Y896I zI(9HL>E!f5Hv4pDUHjDr9MNsM^ca^ujFF!O&}QDrk5Qw}v5*N<o4^tPY2e2|_FJZA z=fud3YF$^8R@2+qJ~=Vo(W7xr+{w5u)Rw8M+jDE(&e3*ab06-$R?9KBJW1!S6(^l* zJiM#6W?ko|l-lBR1?4GM)2q_bjp=0<*Er<<O&5087FEM)9^Mlgn{_cO>EMCX9&z8M zN=ypQMBb^#0OkLQ+_wc&Pvt;AQ_z*Y<?PA)(+5h2`s}ss&4c}xoU><6oQX?2v$OQh zfUOAz;t_JY<@*>r$;|jHqcUrCS%>Y1Y_f})^w}o+P{`90w)j|7kD;~^53nhQHyEFp znlZba!ocX1ELwmSJ&!GjM`Wv@U*_hlY$wO&jZV<55H5@?5$@Z9xw}BG>8&oR%CD_2 zuc~O%_i9TUuNrkdrBwyRMYXMU<xRA)x0(!X@(b5*a@DY}zA=X!aJv)3%@A#IJu;N$ z@fW+so*EsSFrrwAb7$ba=w(OkllZ?UJACMjoZQ@^qT=F$B8+=0%*(lattUAzFSj@^ zGb=N<u&B5wzc8yt1QpFw#LH2Jb2T-ZUCK~hm4$aO0em0lV5V?j8XMWqFu~fUPY0h7 zc>o~8SsR2r9MCn_C))yy)75s^pmo5%yc^@UR2VQKs5m$;vhX}$J<1CMsn9wLRz}}z zH0s?3+4wY)&7j8$kve^IW1E`9D(1oE5d|zdgc0z5GTXFu?s}?D!sf#^iOq%0Q}4m| zgQMikRDEDweO;ZmKDf^K>4G94+c)i&{7%eg$)40_8F;}8gN;@OUJ;Ol;1xZ}CZm;- zL@#NDLPQMS<=}{*QH8G!rvwAMz$%(77lIK!dvKqfxA3gbCfP#>qow6{?_#QiG84I} z37`fMd~Du6pPlOS+MRtWyG`n&?4CXkzU_U%^h3*Ipihg8>F@$*4!~d!D{>AT1z4IH z3mF}E+&XtKF7Bd~F!y{y!i5Xiqy+iAbis{pRl)^Nf{X*yd2fR1LPEgB#3U)@snnE< zDVHuJCL~`>my&}oCLUe0al^=Fc~kJZk2h`JyvetD?xroPfBMH&5hM|nzYP*F$!uI1 z=k>610wnvJ%waRsU=rr@4(z6DJa7#2a%aXDV(02gK7S@NH$M+L>CFqu&&$inp2}0@ z<WA+ux$ZnU|CQJc2ae^YAG(|tpBi_1ck0oL85!u^S^tm!_Rhq+^WS;*op*ov%b)%D zoqzk~JHB`2Uk3kr)walWpvxZ*#0qP7F;`?}+Km~tm_trx1z>uu1P6USiNN+*<Y_G` z_&lo?sSG?L@-)_0c*F{U1%#8QeXe2iO<G~WH|_&MnVwLQ#$X0Ny%X~I0<hv_8PRed zQxvfLR1jvzO**Eg1114)r&UhOf5N=9S2RasFJDZE$~t$Vt1l@vFaE;0wCmHJw57YZ z`?kqj1Ga45I=ww4a!2I4Wt$_nZT4-QyM61nUArSU@iX$@_`@r*^X@&k))THNr)S!E z-zzz-P>6o(IMz?WfAp703rKLeae29I#lEHeDf5<Jyt-Dd`Ug+<_Rq5B!^A$Mj#l8f z(zsC*K8G}}8XKQ>1dS`D<nWIB9M6%aZ`|RsSnLB3mlw+%A-aJX8CW+Lc|}RU4Fl6r zb1=00mA;&-R}!z)l&4?sl}oxRa&pTG8!+tq!#$C{T|ql{@7=%GwQJ7KjS+kH?cU|v z?b{Q$cjq=?Mt*&k!TU`&Z{HasUDghl!-YvxLwD}q8@w|{5)L?=7`5c*?+2~%tK==a zem2i2i|@=Ff2X|X&;J>Jes@FR&x>}Qa5oW1xSO6Wy=U-y(qgvu;k9ne^TL2s%<1xB z>Kz8E`h0<8$dv!5f2JPBuS%~>J21%xgTxTq@_44*Ak~F#znuTrxIx++yk+yIjq5k~ zHc}g;jq-*$n>Kv(-uew|rS+<H>wW72H>_L5ep;fpqxy+ggxM}5BU3XIV_wVs$y@sI zK?K<cZDSGyt>~)uCu>&8>kj{PUc1cyyZ%2uT+y)NGYroMIaA(Ae}Oubx<=|7H8wfE z2%Z9Cw%V{##Eir1^UtY5WLBA8hzWxp%;lV&-iFDM9!x{Rh}<udfnYu|OT{ZovU8N% zyKeouwd>ZcS+joi%9)6el@TAUdhd^0w`}xokqOfqH*7{pzC2r!9<0{j!E$YGpE3F} z(9I+X1>((Q))!%^ap!t|-O3er3g*8XnY%ry<=)!-pKok^Y!zVAWlzQoleix(OuEN? zsCJ|X$CL^<J%+^)aYP<lK-e2_fK(SkZ(b=78icv3$N+#Z6cGY&uVef_IxI<y4s1EG z^GM$Ey1E^!HmqO2Zrz48>q?s&8qiwIZD?$)637HJpX>=HQ|ll#`PEszM)X*`2on<} zxq8)J^!1V{;&?1xAWIZ5wxXcZLqOhG*Gvu?yNyM0NZ!er(doySBj9{40=Eikc(j## z8W!B4aD+!=bPIaJaWQ6dVw?w=L=}kUl^C;eJ;r<>!ylPrf!Lt@tWS1V%e9vQJMiI! zQq1ll-R8up3Bo*QG6dE?uChnIRW&v;HtBTv?$jPWuJgJk?u`$5AT_)x5W&mOjwX8) z=6J^_#O)}Q$ivOMLOA*d`mtt?*ELHx+<8JcSz+lZKjB_ag|>B3O;t}`e!Xz_>W${| z&Z>sS2F(?w#&%Ie!!njM>cAXbc$m|82pPJLp&ckVxBSi7au}@|L}=9Q_1^BV_1*T3 zm|8|0lVc-;_eSpBx-&d<`?h}|jhn+f#ejiMU<CN7uv2$!k2$M^Ergp%81^%0<@4Bq zVm!`{+f%A9c_lM8X-7g-2N!#+AU^)W;k4+pXDgXKzqXS~j46I2XWAQjzy;<b&$8s1 zou)QBE=HbcAA>1<0|QuwoikVn?PT-doqM<MaMnAcckYecMOPLn7rFbrJt9WXd*zo7 zlI%a2ye_$sdkrBPECb_`TQ7YMgP+3F&r!75@<LVdD;lO?KPWHaP|iWE^4+rBS~O}C zEOyapyKx6Ov4^a~g9G*<*_FcpCEib!M_Mt`2Fuf<N+<>PfIENJR*!ry;|{z<$Mp0> z-@SVdnJyEjMn=ZQMrJU`11oxgvCfkTrw?n>;`o>Tt)=wB?WFASy_!b$`l+V6$TN2n zGdt2ghp|t6nnxJ}&O{Aj#C|7HM7O^JeacrL$rnsQ^D0txVDZRuQkeSbk=xJKR!g-Z zHMI@N#qyw%L>s*tpU=_^8hp3MgX!ucPKOI2EJz9?(ePg)i^t%j@YVI90fU$;I<LKS z-1et)rosy&(Y3kNN8Cp*Ri~@V4_0S<9$zqeunaWs9EJsl$2s9vEIMheoD5?fz-&S< z7ITHTktrNT4%03r%&o)`4`zyDl!+7o`y=_D#*k*%F-2hvEzRDxxvf2J`TTML5r+^4 zvsENFnNTGKq2_yG9%dsw4oD2#C<~{#6ocKKD3>)4oISz6ba*5xbGUYmB|RpmGdVHy zN=NSH?fbH`ALBxSrqk2j$szNgk#+jO!o5!#B|jUqU?0aY*9lC)$2?AmZ5lJIl?Hd( z`xKeKi|S3}N#-iMG0_u~F%(-$Y#*i%qw`NHJD!rB?aQ5$8Pf`bKJE6-#SJr)XlOoR z1+(6vT+_&g=aPr}<d;Td2Rqq6Ji|GhGcFFzlylOK{)x|!zYxe8^H@o6jzzFz7QT`u z^&#qgZYSRBr=F}20_w?-#963->G)_{!N?cUj^5O;x9{A)?;E{!8>_Z)ckeq!hi2r_ z3s~|ughQ97MCM!jW*LB;e~1Cq=a^%HuOBAx0lp>#5^(Kg6!H2zPL!ipBJ-Zf(g<Yw zI@&Kki5^fcdtRSiZUM4o;^R}dUA-FBUw`3z^x4#tM-pOF;%)N%OqUF04v~jr)vY&Y zFm2j9PnnO6^@JZGG#HW|OTr}T1w6tpo>HvBQY^D}tYxe1{!9{DKe(PG;F^2jAAG9m zgojBBE!wc=6VY^xc*RV12veDW^~p?j72pe|1``p>y0f*}$v0}Rj27f{U8}FJ%x}+W zDe9B&W<jrC96EDL(+p<-MiNSero@Gr`e;yQ72dBUWwFEF4qj%uUNsM}UCyX++5P>} ziuyi_<$!)#oEh%N`ffdWWp)g&`y5XJfwRY)orekojGz>-k`-C40yPd;4TwZ35iDte zYO5?8fbw}2X@>`pv;sxr70Cp8c^X6XVceyOM8hzasvdgjR#lcf)ZqpfxSjwSFoQyQ zjG2M0t@Wu%bqBj%Eojp3Xo#PXr;cpBly~}g$=<@kbwvpmGOG3!T>rT8bC@AcrH?q3 zez#{v@!AwHNdV=iHNZNGMLHa)sIa1BR{jje!jK<W2ngnc0#AWtc?-<snXL*w@0UR~ zDli$VOAra-lPF!(SCopZKYig`Vv;ZM#iZME!D&<n#RB=r@+;oY@+b9eK4mP3i<4i? zFV8ug9XE~~jU7KqS(DeD==$@y-xsA=lMYPQ{bN0vrAG>jIQsCo6-WQ^_{1}$-7wQ) zAFw3J#03(9U~JGg0aFeOOPs7(3rj%dLLb}&FZ9TZ;_<prgRmwf39Z6AfXyY7`RUbv zNX@#Om6eg1i^YT8sDvca_lVYYo+`b0Hh(fP^VM2iQesiLOUB%?I74;TtxMKRx^wp{ zPT7l{z4e**9%ICdw4FdMcbGw%cRbwwO^(T<3mmjrP;eMXNBc$~q~fqiio@oghYxIo zwgMnRdIjqn5f6^6a!HEEGub{U-R^T*99TwKHGK<<=G>2Ksk8Q>*QKv73+r0}Q$EVd z=UFKQUHLoifv(2J<na*&Fg}8;2*y(oE*ZZ|CJ$q#GH52m`3Lfn;jAxX2xwyuQ+lb~ zdiYw+wThaOOUN<SUwBuK8Ge?mi3t>`f)GCuE$Bf>;7Q0UKaJr2ohdZqzDejPI(8=? zTlw!%LP>zsHTDRR56}@>+XqAv;Qc6(Z(=!}_L>`qqHFHNmz<0*Og@`_X+Rz-9l}a| zile|?FxO*Q{YMF%3#+NkL@G0ono3#m$kd7q%+kCc^_wV+-OJQ}KCS;{$O_ltGc->_ zqyauG^dY~ACF(rlpzZbqR>Hp9KQZ2Sa{#O8We;jm@u1w^-m9{xf%PTu`xD`kHnlBY z?lq*G?#Ozztn+5PZY({bEV=V+Jn4am_VOom+2ytOlN)XxXFt(fN<}?QeUbVh^<yfG zT19Q5;3QLP@J;qVr4~^y=qOcq*i9-RG<>l@`N%%ZMNy$-8>Lio4Nis2kpd-Cs<0Yp zrWiRx1uT&xr>TG#Ic$tv;vqjHBr0IB9ER^OxxlU5<e{+W*hoS6EovSWHX^HIYGgTv zoElkzyCX*yKe#(wF2H>eatyvB<%kD&!<~yvl;!Z-RAA@`c|l;9D2Mapm2OHN!Nmo# z8sBO;^wV2p@}R`q<UxsELI!y>nDSD=i<gAs2QCc_4+p1V;bA`ivlb-EODJkYmKRft z$@Ox0NEk(d?Zx3>2pw<K+;F)DN5U6-si(upV-{1?;_&cLiqH`5p%!3GS6Lj9BXJWI z0mo2{>m%iGkcr2tDJl^&Bh)xYNME!>P9#s4Bd7>$p}1B#AOgbGgyMY^jwgm9t#ObV zkHD=@ky|5VQ5*@Q0&2($->kt4<(Tj=JSTKyWJ!49gBQwSp*3<?gscu<;(y@`^^b^` z#)zSE0aYM}Qi*tG7@-t*6%dkSMaqeCVtB-e93GB4!*S<g!g0X}VQ`5D7X^Spi3-O1 zBIHPkdRd%h5LbcG0?3Z=1O{iQg#~h$IuS3U@Jh&43V%whAt$NO5s`vvtXV>h;9<|< z#zYySUMxqVxWdEnH_EL5Wd$nmDF6F#6s1t}v|ph9_tnTgD(J!MB4p4=WCm%1N?&AP zL^!!8ND-2k6f*w6q1n6eE?*?Icvh?CEEaJ$x#TOL5vonde1y5ghnb^7VXr|lN(aS1 z0ySI^rf^P$Ld@`T6gd&rVjyU8CXzgIaVToy66iu?;s{FnllMWhV<N=|h397u%r99Y zD%_!>)F>*fCf}hkI0*5Fqs;uJi`OlJ#KI$$k{gMPfetPn5f_K5M?z6$!=Y2E5fqmq zf|p4dpbp6~kG>Cc=jGs<2k(Pk`s*R?3dPjEpn^~kggv2J_E0YsVCh|=n9!DyMBKFm zDn7D=7>}^<aOZ4YSu7_y6ss~pzC)Et7>WwHnA9O0Sv*O8<M>=fJg5ky-brXW=BVYw zNVUAAf||Q{WF#hXWMuIS4hM(A7K}ueQ^8@dBVzb8Mr2a~fBAEq`pcjHk31oSdKO0d zdFm~g=^s)5gby*;KcZfw6-(@a79rjgDJmv+ih{jG<&|ovh-pd{83BofM=qvdPiIfn zI7xBeBPKB1;lJ8{2=m1ueqy*#p~Hi44>2WyFo%nMR4|1->{&RfdE~ssVGuhE3$gig zQ2a2%Fl#VjHLzD`Hp6ka2DhW|5p7d616rVhr30zo!eLoWY9nkG%!M2gzSwVVYAB*+ zk&9vQB5*g#ch&|4`^^^Kj^-pVMwSy{9`LeoQdfwjBy}<j^_F^;ycOH*K~%Y5f32Cl zm%L7*o>J~by~CBnc;IBDkDB+%y*L<1tiwb1dZ{mjji^Opj~?7i%=2enjQWRz#6Ep` zGeq{S@KD?f>A`{%x)n1r5&@f|FdYuI{e(lR5&p_Mdp{A`Gm*p;<C22eyCrH~I3!B$ z4n-L}_26#QUkE$~G|t{VL>h3Y1S*q@)WA?5iX4g^^q+mYaQ^@4_CMfx3#l(tU#GrF zy-w|<vZ)*@gSvn%8{3~ywVvytZV*8M(}af&5Hv&VkSaWM3T4@c+(lIA45>8=<{6*@ z(Ii3F2+*0LRO%5JF_fs2YEi17`=Kj?P}C#DyrKMXX@UBoOHn01z4Q*Lt6qu}q@q<Q z+o9Q~g0k5+<083+Tm)N(x&&P&00&5AiWG1dpclx1YA97z!5@JX&U&f&esBXeP??<+ zMPLrBF*E`PW~e#%CVJ^VipmZffInyal^?4|K+UKnk!Yf7&^Ron)CEX(PLRhuf+0{* zh*gj&ptom;X4lA2O<Y1~Bv%2aD6j`t*8u9Fb%^j#&na~`9EgKb%Zn3b^@tic?JEi* z62laI1}el2<Q{nhKu5WRz$ZXDkg6iK<te4DRO&IRK_C&{t7wK6%Q1`Ph=+lWpU6;{ zluw9^M2#evCp_Y%Svd3wR1!x*K>_Lwz!HH(Xcu9UunQG|US;|9NEjFe1mKqN&<GHT zCx?;7mt69|oO!54pV~0L86qYxOg*yr)ll5879&Rpr=P$hg-TR(3>|tPN=T42rgCJ# zyjh%q-zZ}d_6|@CDhMiJi9%(7Cln48EgTP2G)tmFYUIUu0j!~qdQn!ZK_fU;uJBt( zVo-rb6hj7M=_e9<AlYy^hNxH~D2yb~XaSh}Tmp&ZLb;=;6x4-3XKiW?a8$UPnlGwx zOb!QZs*$~sgfwsvqR>S^osSBUMR^1eu?Fj}tNgdaW+@L^fLA_D)~f^%grdR0D`P%^ zUVn+M#204;_W-=X1wl;!Y<MP822O=h4~I}78Pp(DFpvg~RH##=Rs*ygI(vaq!gxKT zwultA-_m~~H2}FV>Qx2V6^I150@u!hwZBARI22HUbf3UI1=-7x-Lu5EK?$HLEs+aC z!$yd6Bfnk%`1nBoBEpIOK}`}LTmq#e0FV&*Npm8~5de*g$(4(N2ImmPrXt`|1p=1> z;XO^7-oHd7D%tE+4=`dFY3kwX%>nj+AkeOoOH^uDmoE@^hlmYgR4}DdkKxP2kW1#N zfr<Ui7nFfCSwU#B!cd>*5s2=m5J;IgZi?p_2*b4)U{LY1V0#s-2ji>?g$G8#z~Qp6 zX(|Y}lD#U-Z`yDI_8d?W?H(Q%PLT(qgnB60yjdK{ks_~C4$Wdn)_>$LHERCGvxhp0 z`~Lge|1aJEZG7_Yi3FZV;E4pDNZ^SCo=D({1fEFXf0_i~r$71kL;_DF@I(SnB=AH6 zPbBa}0#79HL;_DF@I(SnB=AH6PbBa}0#79HL;_DF@I(SnB=AH6PbBa}0#79HL;_DF z@I(SnB=GqXP*EXIKL1S#*t<uu+TJMT=#~%4@iH~~WdB4CPxRnPJ@_AP2c~A}@9H)m zG{>7U{yPd&5YJO5sKd(VER~=fNvAGSm#H+&Cu*Y-F~ppqu24mos&o;bIO+)IDqY5v zXQ)%uZK@EzC#e)Fnaad>3a%=rhN=715OtUGQd874<)ZFTR(u+$YO02+q#CJcs*JjX zYcJ#KA}Srzpt3O?>Li|!hG!;Fxl}E6jT%-xt(vczhwWK>=Ba|I5vrR~Q=K?lOLc(q zXzCa~F|#xu!%+AH>JT<UTRP6B<C8^I;FE=CXDi>A6^aw_?sO`jD!{wSs8akY#o1EO zex8cQ=M0ska8reQuYvAr@LYpmm6(xl#+g%pMHc9HV$IvBnNi1#bHX`=#k26^p36Ns zj`b;=bFqrGEDX7)u_nWG0GV>{44lL&)?=<fCswnba0OsR|8bWJ>*2ewG~lGe6*T2? zIh|uJm2(oyV3XaLOUB<pPAq>t<sb(pa1luZFz)g>102XeY+8tAFp-?W!s(41jf@Nu zJ>SF{dl<oN!1C`%*f5vv`0%y2{yF?-o}UK)?5F>{qK6MQ(+p#v$Cv;EZ5d}&$gRXs zhH)m)Vm6w`8QC<(1Y)IVi<@!d7=AghLyiOo6NDxA$<@j&Dg!Q_YbN=ejF?M7FS0Ni zBW*-dBO^l_kp>AlA{evY#7XqiW*YgN%x31@zxm@ImMn4qHuw*JT=M$w#9&-y)*Hvn z$Q@3Pn^k(_ggKBl>r4)F5E88DX#B|-^b9#=m^ROtk*SAvkW0u-K{^v-rk&;>Mvs?a zk2`6c4x!Dxc$sNb{+h^{uGDn%VqLvx22G-wVOg8C`I^96kpF-$?_x|A&09-XNz2_U z<PQTQ{`5^lFpZU^b^0+=fYv~dn^YR(*zA|q=rGB2psp7$F$K^%-L%O~_WE&r_v$Ce z$zDB8PdvC)i(BVtz@lkH{@c>+DZjkja6D@1fyzBiV%7HS!fhqT4(^ILd+yx9ihYTH zIxo<c-mqmKE?c&Ixo1W2vJaO1;qSR%yI@0>98jPmWb{7t1=94oaZ@0z*V8km8T_SO zW+24q$WP^Ba@(BVSrYbSt&cjJdGe2&($@SwZfHkk>yd(w4<6r|xcO@Q2k)gAc2`<x zrZ;Tqhs&0KxWc_WXz8-|-iVnKdm_5c1iheDdea!K(mnKrV+Q>=9cVTfkPvDHe;ILw z-Z)MNkOG>$nA|o81*1qIHu7ZTiMZ7(cElWCUp8>|XzHoG`!6OPJh-oP<wx6hrtV5& z4UG0%?=Syg*@r7U%Y#=eU-91Cb-^tir?Oeom{|p_g(^Js1<f!T#-SxfBQpa9Q5luX zOylMNWEy*LF}ZCHN=6|;Uu>?a)nBXWuGW|8Eym&&O;K-8PuGoRJ+cXv)pgb)bC>p; zOP9a@0SaPS@CWZN|MRyE!Ce3491C~~(3#8=U>Q3H*ravj4<scYr-RJ~J$^ayx1Qut zggo>HzbG8^925bPn3*OXlHdcOyoJh&q*^?Ov}Xc{6p&>G`ACe&A%>hA0y3P@G-Les zuh*^q_+$K+R?k_rdiDBWeuoZb>}d*7fxWN+4!pScQ>r9r0ABasrfLq79qEzJW`+(y z?LxjIliuh-sv|EQES&iAx4!kZ=Nt03g2TS^_g_7454QBB=Mw2Cgn-9hzm_=Y|F={G z<ISLAoSxHbMCK(LB)niUaHVI?#hyBQ_RN{H#}6Jpdf;*ok|^oovXugY3}y=m<eJ^2 zkn~C+(K=E{M#F3&eX6vikPMI?DJ0}zgVX}_^aG85P)c)<8j^-p^s%yKnw_hsktqeG zCRt>5E@QUXhllNb(%`(CVpM)XUVcVKT=1`wFZD3Y7#nC}EEWeFfMjl7d@~j|mUvg0 z*$FO?wV2p(E{HMXVGd3<%dDGo<1p+L{=`L$gPVh8-)X!Ymz$9I&WYmz_<M?z@oL#J z$ACmG?3gUE&_j-Mu!}7Qvw&q_Ib`f*El68rwQ;N&>09iA=Gd^!hNMgp!T-8_&~75M z(H3$~AcseLSu9xWMuI@AMYK7sfygUpnXt+><V=_FcYuxMrmaX^js1i*&}L=%F>8Q@ zw~;@P@5n)pSwxq00oFW5QW@y4pDvjmXBRViy02`{(T=_WuJ6|M`r)#pntomwwr1+J z(IC~z{5C3he9LkhXI2EpS|(VPA}>+jI@1)`SkutxY?2!T8mb#-ny5w}eg`+z)iyOX zI-2BKRa2w8X{Je4S3lOIs;$SN#-OGe<jbCDQq?p}HqCEr!l$+Y-%X94CaGawYp?Jr zfo2tp0$R)%E&XvBxl!#GO{tg8W%MtLEIX6b8JDx8OLwxL9y0wQ+8N@S*s==QR~THc zA_AO8$^@D3ny;2mS5VhSvAHYelwYf;yneM@s#H~6pQ@axqAERAQsqo#Kt*Mhqf)Mt zE5<5S*YOo_y|T)U1HQ_6H>xTtD$1*FlwY5&m{(p_hfM99g_J84n417~G-pq|%17>a zFXh5-4`mHRZ&|x{W66O(9qyvH=l^i|FJq=$Ay_7N^Kvsw)J>sIWwJmo#I{Oq#wJ@; zqSavwwA!pzw+)$~kO)%j?{iq)qKrJ{5-vc|<0DyBHmetheB>UR)q~v}<%}JNC|v1- zR`~Zg?Xx{=#iOkFvSaOTe&D8Hov}S-7sc8e;w%e6W*S=Tgl-~T-q{Q3N4M`tjQmYx z#?YDFYjO|AZ29fZF0nlA?|%N{BoFcv2hSY%4Pyn*3J)Pf!Yot9@Kabwe-xXWoy&>H z=PB5%PAs+U=Dd6W$BTr65QR<=$(cN0K(+-#6-7S_!Q_<HhSj<s;vm?Hv_V!s4|XId z7p#I=u$Yn63~!OSd8|b!Gr%&Fa*)jwH_m<qNhxdgU9>bLv?rV|Z?-m+6|`Nu8jm~{ zY@g6I)b;Bm_gshT=zAKh`#sCST*86SeN}KN45%zfxbzfw671H_jN`|mq-YA86h%c( zMa?}L6%`$I<OmMjil$;L*ruWvL`6qOrFHR~nMaNzH#;9WF)d<!z33+lcu1-E9MBE2 zda!+c!l136wG4<>yTv+Wvm@OYV`KYz-btP}b?A3U-^d|<kkc>Txki#fQ(dSK=V0d| z%Y+5i1|)`9kjbpz!>t>)Oz(Pn=dPW*cJ1D?XD>cGcS?JLcO&8Hu3hrZK<svUcTw0p zJ3Tl+Hszoj2c=!Uoidhs#>G2*_}jn9JLg5NDinE!6IqK3?`$tc%0I=1(PkF*D40VI zP>%6gUM7^nkRUZL5hBCk1EXo}`t7{`cu&Xo(ntjQfRhlyiKVSTun<LYvacbv3G!QE zy>%Et!N}T@57`HJv%zQt7BnK2H-H}S^3wp3dWN?m4=PDxCL@g*Sua=cA%Td8mjor3 zi09Me<QQ3<J^<Hvv0gpz6BgnpbceI<NI()QmY;!Lme{#MM}erY#mO|q&cJYg4W*7G z9t`R>Dk+1Eaux;z!hp~WC!pEKTJVC|+}}EHD}Bo@4BWceH{cu$wDt`SI0gd-to_np zpr%;lkXC|Iv7C#4TkPFpzR=T-44j%CYqxG-AnAbV<oXk3S4z)imt0AXODVZhjP?Dm zTuLh~O}fsZSS3rjWr0%2+s?6sTF#AQXvM^iJVl{o0=f-=Q*SaBB#c4MPNTtML}Q2K zm$cacWR1OnU=p-@FgCyj+}z=Ytn}23?5v5)ftS+K(;b(eN>53<d^zo8I;Yo98z{ZY z@NK=RX~pHk1<?s-_eUPg-g21b;v!rAaBOAFhdY0@cJ=0M@9oK3y*lark5<0F=lAP= zyQ`n)SRaT*sy1XY+kQqwN=3_zpH`tW2WmVjOSEiI(Iz(yTJ;t*KZ35;tRqRBiBr(4 z)0-^3!62CR78dQK4z7`o4LbgOU_hWRz@Z|W6c7?PM@4P#sIIQNSO3k%!W|d?{o=L_ zN77<q*Z*l#Q|o~pZL6>E{oT)hzdCx$FIT+3FK6kxjoU7)jQn`T?j<P#WA>UVkk%C` zX^^jMYaEg?Ayp4Ybh<Mexw){q6deFuI77dQlr>^=Y$_xu7&xZh!W)qbl{GOfO?+*o zUTD-4Wneg+!K8XE&`injch@%8H8$RF2y1L9Khd-`VdH^w1xZP%+mCm2MDNvn5V<t! zR~xo2`|U5^fB!(*swF!=Si5%bx_4KujN(XAR*9~lWz*9Hxp7<LP_Qg&)+2O5as=MJ zp`!<);!efXH&(P;Qnnj<O!e3K$~LZYgMHH_rgm*>g|X)fTq;(l`a%Gs3JC~Q1#jwT zY;L$;8&=oQ(A?P4T;JH#Kw8#@rsgBtTaIoyopboag_8%P;?JH>Ie0Yl(2<11<G+bb z%SF0C6D^sqn-{_ZHJkbEX909kr5~e9KTDT+;P}yFM?X5TXYcWiAD>Ey+i|jV<u;>r zZ|UKbr1c-4`+Zc@#uS>iY64!SC<_P+4hY`dT2otppCo>0@YerLLw$X1<MBP(nwG}8 zmgdGLBqndEuW4zoYi<G*z{1{o#WqOnHFg0^g)Q=eK$EP(pF<Bc3>b0X@bRjK{pYT1 z{<v_%!K0f`^(Opzzs{cVtD>Z>sZp!mKe#i0uYt98Qj3gKkZNOVZT;N_NBzqUwT&t3 zPsg5wWsi=EK6*6fSk%$z<Iz!3zUVneqhgMoIC;W%{Q7bE*!&a6PsXk)u)zo5xXFig zNG39I(=zilgP7f9Rj1b;Oex)cAu+P-cvN$2rp3~^spm@Rv8a+0WvTnG(wwPN^(B>w z3J%=TiL$w0H&H*gwXwG3=(>;Ade(%jUbS}Jn$>I9ua(vWul;z<nziet4f6Vcb?ev5 z>w?!~UHA1^n%=wKvrbv1URvk*^f)=@Tj#&nyH2$pmn~ek7LVGt=X|%7rjeBG^9V=v z)L8@rEt-vRX)G2v;ARtVK^|3$RcnTkw!r%V%(dvd0{<!`0JV}*O$5kTLJN5m@mmU* zR?P|8&|H0^rdF!)U{lrBNVQmRq1I8aYHE<`1DfhuJWV0c!4_ntZ*BH8dFun}Y8#}+ zipHlK>KmHsbt1AdU=e8GkcVogY@pyTEJm0C(Gyy4HX9g{#gj9dShe0_LV&;o=Ms$% zt@=l5CLka%Aix(m4?C4AK!pgJq$0<BDk@N-ysDspz%@<vGqt`tN3E~kT|1|)wyv(J zrS)#h+~$_%W{_4d)wz+7#DPt$lj_}dRK2eufabXoLRA+0EXAtnRSd|I^%DIh;;|TE zh7sj4m{^SgKgq{rGSG|=T>jJV|KNMymww>;zV8RB@Bcvhe!vgD{{zoIy!eCffBy&H z|L*s```z!6?fc((>!7Zyy=A(YYH>9CTBe!<TT3&uhOz^)idv**Hx7}*VzbmT(;SSN zqUE^z4+w%0V`L*Ci1`X6K}-rsEePXJ;}46@NDiTCK(1><WP<y+?(ViusmIYB(5}{c zH7}~WySjUfeQ5Du?%;?t7xxJaKwFSF(2s?uNzNCgLF17oD!^KNW$5ahvhq|DmaMPf z=MXdkG@uZZjeMPu4v<&?Dk;E<nL(qC^eJBM1$Z2|5N23$dw^ifW_BR>+CRPhjkmrr z_IAKq-}r{_ZTXw>+d<!W`|X&1NeD9|xeVKwCn8XW{93%IE4<1LSO-L#pziPI2JH5J zWKS3Rt>S>#Z|g@6NxlKVQL+O9+a+7D9U144PaQxPY1M6mrM)0m=7LDxOyqij&*bGj zXt<Q09-Ij#XUHjJWW{kG_CX}E7k(k{o^sR+*f0Uu#dqc+*%xw%vOyg15WxJ42oDIA zl`Kj1#|pegqvv@vz7jW2W8^J%uq|@(KLspXv0`+2z|s$v`aXDJ*>VJuR{Y1SrTrX_ z@F2s~=h=9V<*R+Ehhr}mwrBNr9642ch0QFlFEkZZX|o%(mwNK53aTN+TJw-)4kH$8 zAj=tx%#1y>%~%3~7)V~SPe}E9c`6g!Jem1&fB8oT<8E0DsesO1F$I0Rj^|A_uHGPs zm)k6CUw80Z5i39ZaK+e%Gb>*BaK(z1A8q{GxIQzZClQdQf<7znv%JpO)7PJlKYo5q z^y##H8zL`WuGzHq^4_enZCB5yAJ|#CH4~|b{}Po`1ie2(Ae?5%5{@Ws9w<q)ZOz>o z_s8mkyVG}N4`-~q5x=W&WBla}2j0!Ja{WE3zk6R=8n|rfvZcOd-lftqc`1dE-2b&4 z2bQl`^S2j<MZi{$v()E^s03&@*nvyQLst{iH(frHxM%B$tV>nf_FX-<zv9S+#KeQg zI${o@;OlS)D`A;+ls@n+^p{|4;s$W6wWJp^CB=<Da8$)XqdmAf2*{8_Iyf1SA3yLP zfBPQ;T~nUn!|6a45e7JVIQ<yYfxrU9d8C=XD@pckAFtVeto6k24{c7nSGYc5n^>|x zabM<{-*)qyt&@7|?s92`v|L`{TmI~dHE+Kc8*?}Tp#!!l4+h)IepP5~wRbksNnM?1 z>&vsaOJ()xy_YIG6I%2MUA3CT8aR7(mYZy_wM2`%2nHT|Y<r;GevO&+Yt6L1YUP2< zyfq~|;?}N?JCJjycxm$S$h3s)V@pqNPq(wyu7Gc>ST?kjsPxih%Rc`4X<o102XM$W z=L;b0b!5E-&bD%cqA-9IIH<eUe*8k+<p)KP9{|W@>)9c04sS2+{V$NF=n4s1z%*D} zn+1D2uQ&A?kOo(<bn<i?uOG-dW;3cePHb2G-O9mb)N*O*GaxKsNVG&F&6h%$k9`qd zn!m`1wvf_;+7Rb25QiC<F`(`czEX!=#X7xy3~7sHU9dU#zal-wG|(K0T38III1B+Y zB&QcLfFdLV6eCzfy%tH_k^Dm+@U3@Ok9|Z%Onwx)GGf(=FXi`hOf+$hhybV9IWU@_ z4xudy;zZ&>@(Y?ej}t5NiwcX13Jb@Ie1&t03X07CCGja*H_m<uP8KQ%_~tm`Rl}6? z=yHHFhx)_%ILa27{<mNM`n@;huS?jTfAfuRe(P&H2m1TO7-AS(^C3zf7fj4Qt2qAf zp9M*r1D{?%jLBi03+JBvhe(OKO)6CT)y|3f&cat9DmYFWGQUZMqeG*1IV_7=G+q`s zHSjMvqZNDNV!{StoqQlu;*zn!wvNimYZYTv0oN*SxT~JOo^U3yy1uTi^5`J4a&;C6 z;0$&gF+D$dlXw?Ol~EG@vB8i%>Z9)gY51j_wjkIv#i|(8RHedxLSYVyfVBOA20e-9 zE@n(XBNk-s)R`HrfKDDW4Ul4BO$L_MbMRVCreKu2U}k5KW_?BofIsOKUgd192XnG= z-~Ylh3*UVA7r*%VkD@j09qk<*UBDQh$nhz`YJ~^|vU6C25%)kP@mf73>L-d$D=|_s zC`PQpV<kz<lxq>(3lN2erJDT-UQtjKLg46m0bxd(HUJSA(V?J6SPgK6c#Xh&+8;3{ zfEgnVkJktVMo$fV0>o7TzX-5EK~xvq9?E$Aoh3{D9T~me{YkX0yQ{OatD_ZHqyCIR zNvGH#;aYlDrj!+&nU#f9bzb!ExwGVqxuv`%Hv`AyEGpZV6^K(fH$NNu?2Ixba<`%h z4+PjW_;80eD+rfnXS%W$Uap2Hlonm7s9tCckcAcA+@oMoPuL7F>-3X!h#6Q&-xJH* zBreb*qG`8MX4(2pR6V}87X3@Kc~3*X*={ipT#l=Qh2;eMjokj~OzX{MKUlwPMMT7h zD_8#hq_Nkho~vy!5c>{oCCoj|Uu#2wb#|cGkor>U2qXzGy&ZCUNM|N%yxP;<-6i$N z-EZ^&Sao;xboUU1)urz4&a`ODu2)o+U+ds`%{6sTPq&&}+#_`_>Ovm}F6zeB-EH}{ z_A-Pb%dcs94=VgzLwWi2@+$LV$oLaxo%C}kFq1m++`h83y-l%kSB_uYS^DkdQ-x6( z2TuI9BRWUS{rB8cT^Z-w4y}%i$jLoecJ5gAsl>v(es;}|SAPIp0x+`VxKZm<2Wgs( z0<fi0id+ps)qq5nKn?=*AqhF_w#;L>0*kT1Y8CAN!ZBhWC)!XLHr8$v#D3&&webaF zQF8f(vrU<qc23*eCx~{$1Fbi$;vjFcaeblyyk_O?bYWjg#+7r4o#(Dt-E4@^ST#I2 zT-qx9Cq)V_fv@SF-K!El+}n|w6umNGPsaOUC*%K^kn(=S(bPX|>}c5cyAKa7S-0lW ziEZiI&PMz?s=MG{&o*t@|JGN+S1l!6t^k(?O^>9WqiyL%3VH*HSGw5eYnY}zx(l&- zPM=cQt}z<)4MvN{EHiWSErxpTe0<x#oGR6vJDpq-Q(ki>wkZFYrtnN}bgob!6kf<l zyPTh#ZsWDh^y!rL__D^*<7N8Y`jXQp%TwaaiK*>JOWET7<V%^U8F^=mZEkj+wYCds z7^)jZn8b%%9TJEjJt62&nN)Z+_w3kNx@phF)R>(+iuN4Y5q9Ljy8Nw6*KW&Llb~%r zx^aKbM<-7n+Ouu<#<i=K?nz5Ia-h8->(}4=zgK;*bhbnlUgv6BdKnX~0V02jv!dZ8 ztsDna_!3vkUSD<fTtXRr^rPfchtgAzMOMPXdd(pg6me5aLVENsB1%fms*jyHlzg$I zasQc|)RaAW#fNo;e2KwsHJL5>BCqWz&pN+n>y@;^Et#zmO{Z^^?oG`tJ$B;K)dQv? zTMm$b(cDptERuNTJd03WdwbwcX~Uz%{3!3Jxkh7Cqo%b!LtlEeOS9#o?%UN@Tf1wr z8!9wKHD;!zy+q$sVk|9d%&e;}X|2fb*3@=z?CsS*{`mdbay~({d5)$H+HC2a06@!+ zz1(U?uo(eoiF>}rWREG0zffL#E-N8^-KB%2`|<_%1HR8ECI6x){y<y&_47w!5;|g< zPG_gn(K&^O^@T!-zTbSIkj=M(?`zrd`-=|6@L9?CPUR#woT^RCscMZ&x^~c5WX~3a z)^k_7N^EFWk-W!RSvDvP<<^LgX!k>GyXfbM#nKr_Ysv~VykY(d`V~dNgoXp2xnM@; zy-}pCtjUI85zX2W9E7JwGZy>DZ>?SV(dyM7ty=Y`Q>I?8Cb-3j5(e9g`NofHi;7R5 zPv}l8hAUQM=97BPoifr1`;y|07iC{LR{DVLdLb^Z_7@51xjCClvre8Xk2~Cu5vA6p z^c>C+^MxyhK1<OJHV<q!(=mx{acRZ&(vrc<-0QnfHlL4WTe4gBmskqzxjfgCU)NP) zhf4#9BG#VDzMOdynRh=&)rp~YA`12_+9d=m$!G)8$nX~3LNq=M@?ql$ylAuDOaC=m zAuU=ebatX?#m3zDyEni4t#AE(*x!e}c}UydDz(jR=_If~3q4=VS&kSk#ATnlc;ur< zngiPi-J-Qe<WZox+;+jpnZ3+Y2#*$^f+MhOeZ?%m-!xe*RuOHt2z!TsvB>8Og&jU~ zs5TpXH`#gK%AjY1fHz54M6)o8$kfeRO+|g_It+v`)j-WjX~Ut@Yc(1J0N`u|_s2pJ zXjXclbp~`#2bs*+Ptrbg$Qs7zuW1o2$8ZgV-b^&Y8;wyhNA@886ty{l?$v0u>Rtrh zSw<%~xWznuM3<C&BjfV<Z3#%MdIK-l!D{IY5Tss#AqJpT!&7>LA(u5(qxPe(Rl;Zl zgi0jiT-szH3AzoE@wqIvKJIM%x%jy2BB!m!c?0b;sthKdQ8r;G8AB0}*W~qGjg3Ex zs~SZ#gd`j-bAiNTme@IfQN*z!Z8Bo2N_@m38^<gGXp<b4K!!EaP7A@(WO#t(89jn$ zBnFEB1^I~5;C#OC=FNewLUb81T1gk&jYv#~c3ksft-7hPy}7xwxUyHP%TG?dly*5a zBi)-Sr#+vMnwoYgHT4p<<c!{)tkjIm^w89_w5;O%l7f=L!h)ibg2McKsbFDVF+4J* z=n1YU#F3%`a`sC8m4d>;lENZ)!B=uB5zr$LTluzgc61mJSj<|<aiC4a;K3abAVb`K zxT<hJ&?#$%?}i-%<pvg`(ckzthz$yMv$dZgkXit^ra98NOE=^pJZ>@|r*B(ZXGiB) zM^JZXXHSRJrBZiG9lq`tw6WV_+IzaXTRWR;;tDm*n$DJ<E?@VYj-LD-u?g3nZR^ln zOTC%8KOW(@$}&4^^C2%ex@AD1gkpG}KOK{4HQDU7W#Wk=IsLRX*TDGDEkcstLiLGj zyNEL$F&(QctrksI1An=dVR#UPwChUQ%_49_ZwPM)OOK-?o3Ms1P6XM;*w+{n*Wb`( zDy_DOc6grscFtxunQXS^0u-Ie$Z}on+98cft@UUYskOSOmb86om(Cna-*fzrr?NL? z9o}4SQ2R8&^wBekA0V9iOx(vG@JE`jq-I9%*%5ch#803_vTQ8qh}&3{v+|7TB!9Z# z_}L9<yOOOF>?`P^)4X?m#f7;1^M|VT<ZV2EB=y3UjGV3YHd5b+13}zYnUHScLAr?s z1L&c2g8o3{WJgiGj#|myyqHqBr~Z0v%?&t@8M+(Ar=s+^l{q|OokmXR?$l^R^$Wex zy1X^#V)qvpZQUPzVE5Inafyj0uR2&;mVR`1PUz{Cd-7ukj_Pa96|Idr^YPY3>o~i} zvN5UYa9(t5MS?#5-kFT^>(b*^?`3)T5sNtWme^g<C(_nMX2c|&Jyn(!c_nJghSdJg zP)=wLP(-g#?qdTK!ewr8ujN)s#ICJJKfb(vWzBHjvdsrdPaQjXW>X%k(P2DPM@yGh zP`{vy+I8Ss<fgONj;}wqJ0@d8N@{whK~l>-!TOW~Cr%s;-L^TZ{Gc&r=aGi}+fJW8 z9%X`9Ugo(yvAJ<&skv)Y**!6drCax&zq~We%HiB1UUTYHY{G@|Gl$Ffow=BFASJOP zA#-b!@G$A{MQArhCy;(Gh7u-_#@cKV+`N~YLqcfK{|WA^&=BrcN=?t!eS2=KJkVx8 z`oV`Wt!Gai%UGLd)pT2o+NP#XEw6sQtESV?)~?ocH+FY)X&ZZcG-{2vCs?hk>(F*R z+tS{pZO|g!x!KffF`0DmH(o?ET@5#u)v%ntgB36mh3TacuZ5Xn7IG#X-@~wGy_sbg zR^xd@S4hms#|BwAlcvY54$yRVjjIDS9bFoa+S4QT1gP6P$9lfnsnHsW8k&>SQ#($_ zb!yKZDmu3(=S=ZVjHyxU2$t&Z&}yt|S%X0?NX4#|G;_5Ytp?a$EolM?rkB)IucVoe z7D3(42%;I`L5ZVy7koGm`#jQjLw8|JSrQ(A!0>Ylr)CgkT8QJs5|Q8}`F@ywiJead z%#q%{PBfc7^E`k12@enbrZZ+4ha}j24}FJz4W64BJy<rF44ai<`Uc@L;>EV+JeXrV zh3o3*6~MP!L#d^1xrb6uYJi_wVZls#Xyv2PqK6|zGCF5y8UbC}+}<}cJ>#2JArs$} zOm@-~(r-@rrae>AG#P9vO$ARQ`SCP<sHSn8n(|IlxZ`Q0wIazGkr#Pp+J%c3TCdvC zESp(g-_qID*)`fpbvdv}oq@#Ll$4)xhmY*L<t|lcm#<Uq4C!j^LV5fj2!^_vU%;3f zBi%NL7rOi(*W{E7*;`%G)B+b7(1}esi5y@q3L`p^(8?)Il2M@^*9()_P2uBm^4Bnu z0(7#RPU=*3bWU{0odF%4oio^nVBbZ^1#wab)#)a5N}X~CAz$tY=~R=Vr43vTX<cUR zuUR&Q0s-iC&4W{}$?2&XkT*3WO}&g1%hOKKH0hcKdCtkH>B*THj97Jfryy<D80hm% zx<R9#evkFKT@ZM)WI+TUo%TfI*eQgvDZ$5w5MATY#v#-lXhmy>9k3Jm3)sN$6v^G* zt4G|+?5B-H_R;@uk_~UsCcU<&eqeI)-uc)<=ftqH-g^I*v&T^8c8(4^$A_Jxx7%;s zA9iWAt_g?3>-0G($0#<p^Cbs{<l?_;l6+6~b#-6vBj&+l2|)Wy8XdI1(<EHONkRw` zwhLC$^h#`~8L%DkGc?BN#^rU0ht2!nynO|HTj#yD%nml~y0xR*wOhBWxYE75cX!3D z>$bM(wlW2p21-d9W{zVAoH#KvbL^NIWHB?N9gbOG;nDZJM^55&P1n1-`~74|M>>-H zKQI3Ad2|MghOdNM#865a?|NWH@i5kL3BPN|=@>k6u9#JxT)DBSaX+`DJ121ENcx3} zJ>1H}Nz!9UEl1KElM|BxN6^8T9CJiWI{Z!$BsxQrx4SOxd_Q9dfq&!?VQOIa9LFBJ zKxZ`5^APeG<VB~`(x}v^EUp1d;q8k26Q`1sPo$h^Mh=8QhOf*vX_{+V&NMO+)}_0b zgqw*H_$Wz3R0>(07p7c8DWSHKJsFvKX72u~obJNF<@6ju<^^r8Bzqu#D62u}bxdBD zkTL0X#L_M3a8i!jCLQi8dq04f7|D<mwiN?g&EqC+kvgMAGXMt<qGU*4=zaUemtK7C z`R889#zJD$8(FXY`+q#~oBw#?$?ZD1Rx2~=)pG`pzWC@bfBw^l@}csUht;@nX#7DU zt3p6zbzj(<k!DIi#>p>DJajg%H$OO9wUb$Vw7*oFD@Z!k)RP^Y(b;3p+tANLQfaYm zrhMc2U!|PcpPRZNJ!5-jAH0kjZ9_?EReLwHy<a9(DkTywx38(QtF584Un0|L1O|2c zyyCU@{r(TX|J@6@NJ!BcDrd?^w`Ev9$Am$4&UaBca^7OITpYT5&gF!8J)#^xKYBrv zVRVid92j<>Lw7NpWAyztr^`9zGdDtanc0GK47SQ`<wrJcFIvBD3#I=lMnFwkMw$Q$ zjX@z-$&_-DX;32-NMMwS#2TGg!7rJgTDmyV3}+x)s+5S7hN_uDh7`yxQ1AyjFHTK5 zygm=OXECEaU{9Tza=1KR7gEwOm9MD%V4$Zkhbb4sJxW#@_k;^VBKKT>7D8gLy57wX z8%*qEW<mLW>505_JMms4WNT~Kwx6dE$`N@KDP>Yq_kg&%&ma{^HHdO4B=d`oepEha zHcJrVHNZpp6(MJ#r}+b27d=jg!x?fRs~wA6&>8D+dC4K=@;fPKgbQ;y(&2PXIOpQg z=`@^0%nR`?iXMOC*a~0~8Psre!<xd>4H^Cov1H-VL?JGKct(}*f427<5unr=OeW}+ z^Nsu?30k8Fda{PB+&76ehaP}vyCK)usCSGp8W{79Q)8j=(5Mfje}U29XlP`dzTY-H zGCDD#fjkEIE~i^+0`nFLno!{ldavR8Fs%(*W}hnTKPGegY<?%)*E)O*Ymi~S!KT?& zB2vJyP46N%$r4h`#oEXpXqO|&3kw#B6X5>@^*(Z)&^3HmU<0spqOe%fLAeN>c2aj6 zdd;98sKS?Es$Z9jcyMEh8wT+JKfXvAex!%V35x-mjLD|bBlQAG4KYf!8l%k=Qq8q9 zYZO?3;CMstN#IN;!GQBKhMIN`e772fh}UHu8y%sBgCn7<<G3?MT_d59sNs>T!{Z|n z<YC^G;gR8CMIAbiEOJ*MzlZkD(*ZARN?77>fp-`n58946UD2$#Y@=a5>ITq#7>p`~ zTrAfs;SfZUm)Qh|s-8m76srt0KPcj)bzt=)7f45T527cK6j&IuJ+{%&5#Mm=O2qKh zNjy1+L&H&5hp${6AC9^L>g>tkd3d^VRelD06GoTrG8Q-Ds)Irdg$uz15_TY+L?R*c zkVT}^a0f_cL0>OR!43^9VDtE}965X*i^*bh1th9NL5qPfa8S^xY$$pN%VHhDz`?+Z z7#<lP3ym<wU1OoKsL`>J(ebgUk<qcy$+3CEcp6dHTTOIx5otyc4Meu2futdl?kC$P znFGezD5)?C*iin&;t>%;?1RZO2}SUB9$&~|4)8=GE}O$)bA$teAi@)rk#3@LbOdRl z+sG_1s3f8u>&V!p{s9F2Bl?-+<iR;`<9K{vUO!1#s4c}zBRv>ypg71Nl__Kp<aYD} z>{Hm;s68S1%X(uhBr~u@lAsuLAyDqTcy@^+At&@x$mtXRfG?IyxE!Ha3`0~T!6S<d zbuw*8I3JBi8(EYdc}uWnC8BQY$he8)42*`xyraRf;ArI7C?2UXKiJ(uV-cfcKD_Xa zMvaV(;k*m?cy&EuUWRFz9q2zw|0BeqL<+4?td>bMVwq58P^zUW312Bys70z+#Hn;V zp_Gy^AZZYiGSH&oD<G0n(A*_5N^+M}A{0pwf|2lf94HPDoQzs6T=p{!#09jr8Ww)c zB*tPq?2bU$4z1^nx>4){Z7&v&F1PtCVh7in*P;K3k>nJ>g$;vCDUqqfa8ttntx-#r zDv3}c)yiU^dNA4IpfpM%5TS`Z;uweo=Z#MsE0K!HF@<*ji9{rni~2YUxkMrm%GL6L zKB0(%bU2ybj66rINHawy`YPhf(-ND-ATEybxm`Y=D-v6XADbCAH8)YPDOZFi5D$W7 z>?AH1*t|n{)9;EQ+NuXCBZFwLZga!*Rb4^jJM{OO1Z5R)iIkN|<T7}qBnoa(erZi* zVF_0%R)|z`p?scRCl|BCQkhsH<%@(tek8GNBq33ZR3t{DBiaEQlM+QsL?Wq>;xmMl zIE44^k%;kH&Xrh&Y`u)5V)La!5f5FXHVuJ~-i$=9nLYCqno@s#Sc!2JF1K;iX>|Al zZcosA@$!{m5FF)xr^n;<O<uilaWv?fIwx4jAGCOfEmN)wpr&<BUAQz%x$zArSeCC` z9>!N)?x5Eb47kuvv)wM^SpzapG5&_3apJ-#xJZ5pWiz}M3+o#zGtx71k?se7kk%}# zt*_3`%FGb!HAFg{c^=~EHmoiE0+9@JoD#kyl1PLsHXCh&VJH%bc_Nuy$P<f1GO<`H z7V)7n$fP2^P$U%z#5^shRA`hdN~)v+xkMyk8<eICSFVnY4%>-~^x6~)=}BW;>-2F9 zQ}m&C7xU`Y34PC`z4P*sCMm!1lCe(c8MG^{`i{hk(=1o8yk?<9wRyZdDd=X)T7>?Q zgH<Q{-HQJ4sj+6eJTJ#GZuE?{DlWA4!EA8Na$j$YEBYVoIgoDPs!}@ya(bml9*doq znw4LQxFp%fXIb=SSq?mIB2zd*uAC<~Sk3Jl*X|v_<w;=R{!zpg_wL-Zqgy7ENHDa; zVhwLVA;tK|3yglARK#XB%0w6x5|KhCR&<mJjAaEPJ~k4ufTNdKCdMZ`Zr6}bhfK&D zO);M=iZjLq<@)JVMxElcIw7^_cv^mbLv`}m;@Y;vki06Rf?HltQ<AF;RTVE3+4o86 z3jD5`lZ~lYU77W{Ri#HyG=`dLY>j1S%Xr+-+5Vb>;#{5Yrlz>6|AA`P`OK=5M?TL= z-c7a{XfR5dB&WEzM1>7!j@B?FR7*?q3i3!(gp3i&Kg|1OGPA0)JhQluFJy6f6zdNI z{cL7YW@aOc$KmifEUrQ-hHr_-V)Hp{E~}5phZWT-<#GnNT(&?k(9b#B!OZLF@8xlL zEQEq(*2(cPs9i${7hG!y{4aF~6%7(0z3hs8Xa{FWRZ%hPxV$G(Ca-EQuh6A7Up(!< zayqThSW$hJQ^yZg@E1;5a|&z9{O*cOQ}#JuS#x)PVy;*fELHjH>!iJjR|BP&+foIM zGXG8OFs%QPLAlFzy71Jtr0V45D(oc|Q%hfaQ*l{-4t5gS{lI6oG}h+k<%`LnK<4z` zcRs6bEh=36*L5NU#^s2O8{mBIeeaDGT%}x!*9z&GR+;!rnN&fhg+eCRqABF;N{Lb| zht(-TX7eQ;i>Jh5C>1FX{uk*c#zq{Ij&su+B{~F_DDsL!nprXdx5IpO)FAQ&UH5fz zT6?cHmgxG5WZext?WS%{>S>>+zOC;<UsI!^PaEtpK0uxCZ{m0QT-}YfrpunjMxlV$ zSgsG4(qvp_hvvB7rz>a`%KA-Ef+<)0^z^u<-A?L%XwdIFkk_~8SoVqiyJgU5&DOp% z<?U%j1-TlGj60A$S6+R#pfE2_Oe=B*ll>he1u80@{?GSX``NuL7W2f0EcHO$i~s(Y z1~$8w$?of8b#?HWRb5QDy8HXsy?sLdna;kVQa17>Su9aU4@=jdU(+-o?CV3SD2FBD zimr}8Q5hd1?QtWEIi$D^)o$0@gOsvTQ?op7ufyY;gt0+Q-QjMn=6IZ76{j5tm}gV& zd3f-`nc&7Fb_{Cj`>;wTy)F+76OXG$?Sn}?MLzFzeNBUm>wjQW8IjuqwTSqqkf;Y& zvmm3WxD?3%7_PcmcCB8LS6W;oF=Kpa^=8XEQi)tAXl`$3@emRh%ijLp%C@ZL-o~^2 zd@)}rhO<oG)pVv_E)eo1LM)dY1jXw!>)}r0B3>@$adndP;(=PG0XvOAAm*@y%%RIy zp{5Oz<?}{+{Fqn{Guy)%2*B8)$j0e*P6b_Y{>jT8m^iS$qTrDrJ3ibw*eb|g>bl+S z^7`;@z&{oAyM0dVMKH^-eTLx5_`0D%l1wQ0BB7Jgi6tl!<W<yHre~z(sNl6*AS*A* z&&WwV#W$*T$c{6c-;v7o*4nk7?O~AxQY!9k?Cq=U-un6G9=S{+#R4jl4^&lj%b_x0 z^^{3OVwO<U&F5o-!BQ%e%g!Fl6Kng^@?~P7R3sM-aPq~Lq0y01yY{Ar2+2d5U)^X3 zx7*R%GCpKzWKX$y<6iHS%jXeWM!m!u#c1(iJWNfwywM&X{BQy9Puw0TNKT(l=kZ*r z>vVK?IeP2hxj<Wm+Y3$d)p<e`bw91wQMy?MX%Cad85m&Ut=n~qmd;*IcXO9OsD{#n zddRos8jGd3tn>^|N~;o5IYt4my0nUe?E|eM67q!DUZIU*H-)AO#Yun%9&#$Mpo-+u z)_Sf&B<*bE^06ID(MDBg`i00``AV*YBBY+#2>$+B?s!K@p2~N5gQT`{#AnFg!|JMJ zS+kA(gFWm*ZF|K<ALpLD`U|y1*19wyr&8BaeaSnxrzI5Pi0X10+Z#LhrPLHXBxYX! zRa`r%*F)YDMQWe)bCFYpyd?zN$m&N)Bb3s4P;R+A1nQ(vSS8XRbcm324s-#i3{qSo z^l_x+66Feq61bBYxc?Zc74%1(6$&K^?4f80sgx@>AXf*v%=I`Usc693IP+><RB3LV zqD`!>KIbm3mhzgZTx<E+!j!%$ojcc@Uz?)NEjkyfxJS^|+_^JH*qf4Al$TL*-s2Ya zjYu39YHL-}R)4MB_w`qM4&ADkpukls6-%XZiAo}qiIF%b<+I@nCl@0M;2sUhMWRV! zdI(+O2nm$qNTNQ8BE&FAW{HGi2}fp-D`ev{XYp6B#MjR4&6IKn%j}-KGyUzoREaq4 zOe_CHKL2v@K#IOPL!Dh8s=lYS`BY_UE~_acPbybrHU|Qd?(?jH46C52ttWo~tKHZ3 z+o1k76-t8<0mYVuokt}S$C71@BY@EnArg9V5u_7>kXh)#b&$Y{TNEM0RfG^fAaBH@ zkJvJ^TqS`m_?0m@V<H+wSXUiw9oo^sN}0#YG`6)mJeO)(_2LHJr829%h9$2tuo^Ce z%I`_wpKoZF)g*Cb75ZLmTAo3JKO`=1w0Ct6mN$su4<^gf%rQtjfn*Mn%rzHc2t<2B z3{Nf9(6L&MKtf5qut?kz*iB-u%q^ubFk=wAz>M?BLeg0rg;l9RVz3FW;z&d%{MY(q z3_t=;(S_7xMX?NzkPCq-8NeP9^tzmWuRjP|BS_)d?+$r9LBBWX3s4?E_g)L-r9#6s z&BMW<HxR&*I|av*pYnU~ZHjyuJJ2^>3b`CQ%7kk%$oj8x7~CmNL`Un@woq%_0EfeE zYi~oLW_(*yE051)_VPVElD8iuvX{_!10nStsD;-~Zwo|rDAjJt`8}-r#LpJ~!!d9k zh=-pd=91Ipi<u%HfQ7Zd0hNqC#>e5rc41#&V2k`mV*BZAM}&wCiXl<7P?}%c8R%fN zk9T~pJ)a}ZtMBS)@92Q^?Y;f|J-t1oS~jYuiYS}(jy4@rSIyBQOeUa}Kam&4UD!<r zQKnq65SKXCiSIB7CnrEGh=w16#}2O}i8eqE!zSRZ1`BE70K#VQMj^8hiOUY;d{M}U z4<e#hJwj0dMvw~42?PT{{NaHL1p_|_vHPqwj-cNMyo*r4=kW(UK3~A^r$Ro;9~I)U z%=BfHA)7N?9B|#1C1%ZKG@fIISC%y847(&SJ(d-EJ4SIxf49M0H8?pwJ~3XE#CDH3 zC&pZ3<IYKaubUdbcZ$<(tGPHiI_5l|m3G<TkO>@)(MgAe*)@f4xJ67N$qj899w1nv z(@u>4fg~3F(*}j6)G|Ig;%qCnwe%k8I&w^Pvb_FibG~~7Z}xWC%7#X-j<`Bg+Rt=1 zRjfHvb@+H{%c0Fvqaz~@PXEnf%rNf%M-5^_gFLO~X^Rx+hwPWj8YY!pyY`<hK2SBZ z=D^9kD?@{WSK8aGCAxEigBO%%vyv+^vfI-4x91k@I+iy!I5c><_p5@aQMh`|sdJ0= zaGK5{aztDrH+qH^M8%h8vk{5Za1!_Bocv;MRzdOJtdqOTvn|Ms)z_WT=1H__wXP-M zc**X~g_~2-T1tx!q$i@zNMma4qlXB;0wy@AG7WtTLExMDJ3*}aXAE#3WiS=cmK6MU zxugf)3I&TL?S*|RmPu9Bb-Gl(9M-3#r&~S1kuqVCL%oplr6ktX*h}{ew*r>`w~{01 zivJohEXXZZs*aU4QuQ$nO-&7rEy0Ed8}Za|w!WdRzUesAaHy)Wv7zB?b5ngwQ&UTQ zLt|3|xivI4Hm7o7N+J3s_?A-4BWsvj-Sl^@;Xtw-aVA3@)nO-^WopmNA^9@7Io`ae zd^`v8;?t{*iiRBI(olJG^V3h|<)oa>!mGUeKwe}{4R(!L2A#RT3U2AJa}w1GVLN<u z%q;OCoWgL9PfuV#;b6HT_mFG0N7jPyBJEj69=U!DcQfu&h9LHm+u&M388`A+G!`QY z$)PvjiD)0}OGLRX2wIx$$RoAe2mN-&pw}LYR1@o<eUP%x9UQX5XhaOqhB|7WonZ?Y z;`NsL286IjgBUj&tdJ_Wm#w2@CK1or*GV_eqpVOMOhEkp_@85BaYiFC;LDw&g)<W2 z3`hb~)54*am$*PksyhU?m<RQ<by}gsC{vK;rJ&e`w6lrxKAVM<C=49kJk)||m11F+ zWn|2FD?#RC-8Sc^%8+A(wlbMVO-SCx5yR{=O_>%Tw+snrI0360e@0`FJ`)26;ozWk z1c}l<6wp%u2Z(}Uj@0jvdA8NAP1@PX>g&Bov_SbBC}p%oh^_9Ht#O-YxP9%RlSd9D zBqSy#B_$?~B{32wll-`c5<N-2q|nibq@z?~C~3jbBRG%0BS#XGjvh%odW1>}CdM5( z{^eV5z5VXn<8M)Kd*7P(_FHeh`PRE{zWvTyZ@l@|+djNG>&=H^=iPDpf(3=sy6FtN zoorEL%plY>eMEXJ=$h{yJdto<+sZH2ZrHSG^QH}xo1!;w+O&S-#HOf?8#Zm6+!WgA z*%aIq+8n!O&FU>{zSu-<`N5a#w`|_HW!r`?)@)s~;>)d{Z`ihJ^X3if*KgeLT{a^k zDuQA}WPLjczC-2|x~HxEOi^M=YGzJ$PIksvPDEz*L{3Cj=6FshD<U`BmqX<&#Dpqc z@!#byuFO19l=<<|jJ(tP))X9gv-0hYS!u7ING-@s&dJQoN&8`xnSuJ($e3t|!HD!R z=AurQfy%_FC`MGyx07l<+2i5XWeuIzwDhw@K`BEpCXL`r9MX_1N+guYCZ&;Lq1-E_ zqz@n!(0FRenYWUY*ClRE_`Klgx{d1;(si{vPA6^oAZ=4}@|QVEiIV^GI0nNSIV(Cg zG8R?V5Xgh7PP7%6vFWyw&(WxE7>{4yTLD-6)WC&NTMtj92x=qb8X!>-Xek0#r34z4 zLg~>`+6Of%y*+d1icM)Jm#r^2@kZ;?&v&0TnoHiUOn<-Pz-McBY_8pHR2gKyoW)?o z_#&<{P*sX5-I&Pum{CS3GKvvFH`BKhX#Ui|`C)4}S0F<&3_=NjkWrDx5b%&l)~QEL zsUK9ywdUg7&vMe%f00;OR+N&tt$L$GFIXzdJGJ$*vMtqFE0G+kll~G-6yZZ5=_oBy zY(#A2ygAX4RCGjCG!+$y4n>8c8Ic%Vnc+$IZ5r&`$hT0XKozH)R53`j3LtwK1qLaK zIkiZYmCJP!wN|82D)r*~<E9|kMMhL~WPJ3Muo&|QG|)fpx0}U~(al62Y1}A)MA7Xu zAC)ZxV}K;xs!%?HVpF7&-bo;q5Te8%Dqm4I`Xpn{?Ag9pMm!Z4ie<z(VyM{J(J`^J zqh`fLMa9IpqT^$tW8&iDX61zlEE-_3!i&=|+;`ruU#hVTOtCHuTYI=d8B&`NdxvN$ z=_HVVXd47oI3Zd@N_97!Ju+m?0!0j{5lW<n5j##M*P))BQqNZDEVc`c|8ehqKm93n zABDT`C)7QzpM>s>`{|wE{lVRLegFHeyW_uq_g#12^}RcbLX>76l6f^U5wFuSJPI@6 zR^r7&yb)WUKrE-Ufc2vB&;V{Wp$RF*ac5|~8cOqHn3FmpZ#cDAgX}Mr8UpI&NGMQi zgPPffuFSmrs)B^1q+?Vvbv$$|I{A27N^<ac<k4fv&f{^XKCk33QEKAmQ0&-V*1$kN z)^}P<(yOFG5-GgpZU+rzihXI!-Y=4>5aR}51OYAr))9b;$c9O(up9;;lwc#n8w|s* zuni->*@*BiLWV{Q_9ng3rqQD^+oD!l3CahwG<!nonYy$G?!5hu+iwpnxb5~kzH{e) zRy0A!X@oA*&=6=0Hq2^lsBc4tk=bT*SYT0Lcbi0jbN-Cz+pRb0Yhp9S5+XLhMQAi8 zB6WzMk02a?3!%jh;<VQED}!lJ09jGV1dYXFB2jDdA$TS&DuofHPG+l4H<Zjhcj2`s z7cW`z;fKKw;yzrm_`?quetaQli$o@?*E*MgjNk^eC0wLKAFDzHI~*(~4Rk{_zV&z@ zZ9OeC5W>ch^NggN7&?@LQYDga7|^4@No{^aJ6OG8mzJcC+0E?ELDY$v?Iydy0x%IS z(~efR*{xRlk%2+Ye=J+Rbh+=NdCQkATlvmYDDX0v&<#j#Rp1|l@ueo{@jwR$!ZF!f zDIH&F*sqmQrJk1YVS{*sp}%}*`R4Zg?Q7SxZ)>piuTMO6H2>gf_Kq_J3Hf!$3Jdo1 zBqMF-85G}om(BZV>5`A%`RzH_9%d9Ze?`Q9w)06lGL#cHnvu><4o<hDiMQ2eIi0fo z)BQE?eo?x1_0~&u$I@S^`{a|2JHFWc*{27#tXNmEr6xP!4|m<SeAyBJ=g~sG_i)Oo z6GwSSXn>I9AH>pdQxoA4ide^u&c0@$-cWGKx^%6hiQ8L=J`U+_?rO-WhW(DdR+%5s zSq~)dJ5imsCu94^TaP90D8AVE+3_#gyAO12Kbf46*tvS&{)P?5t+IWeJh61ylI39; zSG@CUK2LJG%tAM$YKDx6zuz1i{5lcC^Zv#J!gcCyZbT%6P7C<3-fU_R1OK5zB<WXh zRlO2x-42urO8T@05ny2qV!2Y(uhe0LKC^7uQtz_)A1zz@@q53qn$MM&o8kKhl9HM< zf*}^GhCx5wj4-eNXU&M@XY9B$Cd|xMd>F82L>)%fn9XEFU8zAY<^j*gY}1)FfI`wi zX}23tLt)fE_3EnSo)w|xvp;#^8LM%q3duKQFwShl@L;6-dD>j~hmAPh&tDyibT^Ys zyIDvOM7AG_I8Z!%FJKRV7G%*PArLDn@^X-R1WW@gt4706!jB(&{Bi2Bz~i&=d~e>M z$#^W=<iSctD$D8R4kn;pIkPR16(S{BAvYGyuWHQ!vRz&rwKGK$gy;0g%pvWmgl`z& zcqDdBuRtobNAIIoA}0pzkM$O)NO}t*-LQvHBxA6(mzI$d&C;^+@)D|acAs5yLGk@f zqvtMM@LvpFh#Vpy36c15dd`F`c6glUz^x|ab(m-DmtP~Fdw^``JRwob2#%;aN~I>a zf550DwQo>46dtuNTmv_$zFQ{+peTIjM8%-XgA9W<)WTY<6pieFC9~o4yMDXugT=lj zvlcHujXWeZP!Y!no+a(@Bd+i{&<unK6VA{x{$8+oM9;8wbA<p8)o5g6YQ_zrq6uCk zfC{I@a;q0WcC`VCCa6!M@l~M?&4Zu>f)Q1+5LZp9V)VWDKlaLt)botz{Ljz%-P7MY z1nfvSRn;i`iATl=G$|TM1e(UoIMuB*?3*>UYYOcQ{K&9YOJt;LiXJo%X$ut=Y=An{ zi)pP^t&R8rOwD3!AE-#Pno$5`Pk8k6)vH&n^sJiw`K!;Fv}imUp_0f)%CSf+;h&U` zR5wAv16Jd8gv*;G^r;z2O1;q7e!TK<OHzA7f~2%aX>2&up3{+C-PxbbPH*XM>1@cY zP%9O-L;tyoMtNB3TQ+<7o4*@Ea78OqV)Xof5%dxCsdjL0^5^@{e7<aJL(Myj8wR%> zU%fW@qjwJ+{(SofYxb{Qf8g_D2wvL~e!X%Tum%`Q{mbSoS@y<LRplj>G8&5XUm$7N zhPicvK1wRI2M-=uzjyDu?`|zEeRECs(4NCzBo)4wkh&#t+k2V&SG-lTW2r!?uqXU_ z6~G#(CH|#z7B74K$%@kI&2?IWP5MuW3EOYl)S@)dfy2n6Go+jex9U}gP*(PUZO__{ z{>szMjYq}R1#0`o9qrxfoOWJsJ1>jb+gvNiu0kD}{m`#hECsqp#FE9-k~xc)EdJ=P z&)Urw3Tku|fjlMk3~H6ie;vE_TMyNLByco|5lqi_g%SrL<%1|Ds^pmgJO~sj0Kuuv z)naTnNP{$MQIv`NQnlF#BmmpNN51%!`Xu7hPkgKAeg5*(CXFqx7Nv}sYe6h^STF+r zdU<bdU<Q!Iz7Oaof@h2IfFw<o-U<&aWB^c-oI+IynRy{)oWA$rN1p!g-~QI~-?M-7 z<0PxjoKb~^jZy_+E30QTY)E|@Sply{O^`A7^?tvwxi(_!xo&m?W0)*e(WpsOtDIzc zhq*Srj!uz^MD+sHKoVdlWJm+=fvohD>PK3F^#r>;45FkmH?LZ;a`}o?D_5>sxoQQq za#p%oXY2j(t_xN>_5pje4LCrgVXv*Jx{wN*aM=AedQ10PScw}M>=#I|&*}ivF-ej* zfo81(V%-F45>zUW&PSe6zZe5cSEp1{x=1APPT@_IMq>M%4<91l0C3gNxpU^hbJWo7 z=LUy{;9WOZWodV=%uGv9O%0~Sq^IVvt-wo+CDpxj4I#0E$d>-i&PrOy%h=MzQhG~= z9Ym7Wh>jFRjEYIJkxy^vDvcL5TpY3<k#G#;M5NY1^*~CB5x)BGD&V;_4h|wa0ZvAp z#ST0c7!j0y0doGKk?76BXMX<kUp)NqLk|WXSn$xp3m<5(V#B~TPw(&~F_qN#(CQrR zT)l<wH*8;w5FJE`co)n~lvjmS5z?yH#iffU0c;qS7kVO8rr9J>TB9`~%^zOX2OzOY zlU-@B4>8;MR&I@{7X}@m1Z+H>-HeZ%+xy`9mtX(lQ=l$Wt3s<|KK<<9|8fpj1Wi7y zl@Kj?rqyP+Da=H)rI|{+3fdAhWSDFkH3DI1R4<fTz}=#*(?=j-^l)8=Gz<0T4&)|w z_6Uw{sJOIqUu%>0tcKTS5bP^pu`om~Y<vET7hYYlY{`<P)Uw-whqL09S1uBJbcSAh zb28gkrJAX?N9gG~Q<%SyjTQ?Sr(PnMMoZcfY3BN8P@}0|XSgihyL!jY>I*wQ{vzSj zdkLG?oY=W#_b2JFWH0P^=CkKtTlEp(rhw~&$Ca=CLBZomk%)3#RlnJs_^L=ZH59SM zG5Fv~n3jpuE7CGeH`ciR*TA>2e$jI#?clPtTPrT7?aV*A@w1~xO4lbBB%as+{G9XK zp8k}Gv~<}=AB9DF?Kfrl#k-j#iR^~;Fe4cCjUv%HF6p7K?LBm1NVU*p>)4#svi)#Y zLDyhiQDb%Ym-V&HO<8*@4jscFIluLp&t7;1`^{qPIJYlevh?FWFS=^GlG#iOkRTA9 z@jP=Z{X=5`GbcRs72$TeY3S2sp2*Ig&_AqD8)1Bz?Uo^<$%<SU+MI!gYZ*cg2?`X> zZ+d3^OV@jkS~h?6pI<t!A53q<<eZj_6aoGZ>@3WC*wdJca7z#ui4&RZFaZ$#AZ9^$ zV5zkZ{f{v`09B12SEBY-tG6JP59=hsgG5{jYszeU$-lkz$3MRJ*6VM)Nxc<%^R~C% z{L$8P`k{<AtS8sI5&z<wg_}9xiCuy88S<Y=J=jev9F~l0?KX)-E4kXDHRzN^Kmr+1 zdV^4jL8A(4?*urI5z-oLNB?8)11~)P+;h*r@WS)dbMv3wh%`0GHr;M04TTSmL}>(F z#HjivCm$O|6`Xtuvid6szk)*JM8!*lN=fOQU|qoPXnb0)_D=X}p_UM^SW>ir1Ncp` z$vp*d9VF4yMH49MfYXoQhyrj4GZ3yoSgg<yfsU&OULO{0o$*TVoqNSxKks%R%!n@9 z0AHSp!ZQ3K@-GOb1bne!=Pt=%xV1A1&Pn)A1=66JLDL^Z!h`CBegO9_1&)L$IdUO< zAW3)?Bo)LUgDnR6<&Z)Fbpb$zNL_@ErGcASCxaOVGy#oXCNpRuJ3xYfxP=`X$o>Et zB;HN@#LCAOKK|sBo~PzN_8Nl0mXt=oAcpBD=0mFrOa09*)v%${!wY-vzv7anu~EE$ z?*A>Z3*}OcP9i`po|fd8;y<AUk+q|R?xPlo032lmCW1~Qh6#aICh6NcwNW4euqCCP zLl7I)*5mgqS^3e@Ab{0^%jW%TnN?*z1(ESvB+&&TLvQ)V4NaWXBQPFmkyY13cBo@u zi=tf!@IQ<^BK9kQxiFQV*2zV^8mU>V%;?c*1S*u3orK|KMlmtJ#~`gM*Yh;y>SW82 zUYWwE(5XcRsUfXUua^ShOo^&EwSE25pAxjY;L`5^a&5`dRj>TPsy3%IKxGOWl_3ST zzU!esKMHEyAs5(6T*!%^J{os3TtWA&DGzb56WN0rh8+9}H`{F2b<3CK3YD>T`|5So z83#94tvmHr_PNaWl8V<R|D|d3;o{Y$*7nnDHn07%XnBdf`mKG3@>ix8tl7JBciSgB zzg&D0Saxf(cJ6{p-M;zhl~`SaOXdNk1zXXom;VgOPc;Hni<q0F&2OlhqXy1oU?hZc zrO>c*1jS7B(f9~sI4}}F)^mQ?LgWrx9p6A@@MjELOWm5ir;o2%yyb&4ruE(DP8{2{ zt7X%U>~}X*eR0B4yYpbqrqlZycN)%|+Ph|3^}eN@8;@>JNvi*^%CseG)@;ptb4|Zi zGq?q!!?2tCF;EeguYUFAnSv8X!`y34K74^Wzz(t^2UzS$Rs?&%!3we%17obvz&QOT z#fl%`4PTv>K0*z519&^W&Sd%%k_1hidruc;?%tPFvF6l{taEvV$*G^@udUmd+Pr%I zVDquO;-d)}tBcJ|OE#nwd~!N}%_k>5&-&otmfF1BtyxK|t;fVL3b#J9a<PBuyk+3) z_-Og6zZX5EiI)qxU1pSAjrq{NGh3XziX0tAo5zh_8MbtBgfJqe4LxGt)AS;UtO2Lh z3*G+DaN(#_Mila$&d>-<Jh4ikQ_H1FHUd@>k)A8XVgWT@p<wB?N-1Bb<>^W`99N2& zTNQAh7*GnJmkaQL!Hv&;y2Q8mJJ^wzE?fD^OE$F?Q}dcv0(F5Xa3%4X(W_T|!x2}n zj1PydI){V95u}JL^2*h#6XY;}cVkAZom>%CJS>0LtkY?sBM~MeLSxhc#FZ>yeKMlY zQ<~cVKLd0l)a+uuL1dKD-w(eY4iNCdD#>rfS)~}X34m6`_XxJC+IsB1k5>gh4z0Ko z2%13h`{b942i5kRRvlSUh%;pt5nC?g1NYX`9nsM_(H+^<(dq0Ck{9FMksV!K6FBS& zc89v=_JCA@FT?_jz!x2vyWZNgqYRc5O<@wib?LMo3?Z<YV7{s}0rgxB7HzC|$YMmA ztrwg_O0`b;-n|PSdhnqKsfR)j-u}?T5C7tMCd$E<X2NL}mX4&<$IC@Lq@H)QG*Qi= zrnu&_4b4rsQB8ilj0wN=;~b-jYKjfN#L0-}rXYE%Ir3~{bD$~I9NE;|93;>6O?ZxL z?&#@<Z%su8j+~B?!BIe|-I`e7`;eA*fICL%(SRUEp$rlNA>c9~au-E<VNwH@5nL9! zU@qO(q@NH)1H!><c&xDKceZu5bObv?9aQK1ZtVXT8yJTX@}X;(^|Q$*)N-)^@VdUf z$o|gm3G&$E><jfp_4al4jQ2%#_V)Kq_C<8`2K(ZB`&e9o7-TRgErdQ933Unjt`1w{ z<TT!^FKiijk(%bm8N_s^jRYE)5!o#Gj+Ou(0x8XCMid7WAAZXMl#ZD!J@2wt^gw?K zt4DJUDufy|DAq-B2;0w!V)yoA&4^_8^gCG;d1g+qqS@U{Hd#r!2Lh}(HcuduVrW7- z`ItUJ4(&1oT`n5Rk&#y6fOSIb!s(|-AfFITN}(l?5{8f|+Ni^}=?6B`+zSU7DOSU@ zlNnISd5qJb_c{f-u7kK`fnKZ_kEx&z%LFM{F=GhlvO&yM0g|s`hJn!lYOWFxljSjL zK|)pw8Zz?v^LVcYbX@uPY#AuKh8W`@7#n5yK{e)M1Q}x>B^zZh8EuRnP<F9E@l_4l zvV4$s72%tN2CNLPGC=v2hX0p^=MK<%U5dC3L}T-D`%c6ixXs1yNbp~|3@M`<|M>`L z#*%PL1g%&qO<I=2NXAhXey;_;&<2SbaVKPAwV+F@Vw}NsRO6Fp@v0iX(TTIoIIhR1 z`|zD6-12ZMz`YosEd#OH0M4)>b03adL2_0J@-!BsZr+req_YAK!htF~ph(PfBV*J_ zvPO|aKZV+hc(-E;Y-4!k^F&YiDYrA$MZQEz4H?dWJA~Z(NPK>bu#b^Me1K+PgAS99 zxttR?>B4r+z`H*Bn9!8DrluzGZ30i>!WS5>3BpkZ`mrgz6L7~m@jEUbb(<1d)rgHl z4I&<DjXI!;Q_56ep;9X-)f_mnm3q#{_doLD?_c!(KI)|vJRnenl#xhRpHP5gYx>cl z2q_to2}KlYbmUG&j1uKNQk;uIN`lg-@ZkiGCKM4;nL`n)RNzxer9%;^l*q}K@XDcx z$9KWs13I#WMAd`<MBfAs2l3=#SAc#`Uf=+A;!3sYZwudhhkD)nM%3%~ziEsm9xSO` zHK8PES$L37C?nMp`cUCe#^8cvYL!EYRbJ*%`p7dr5v7vIRZb<KuRs?@&Z^0mBc%$( zgfdowtbD~-=s}%X*}&qN%+38~qgnwyo%n++y=_*4Dq}D;@sUs<edPU>Ktl#9a@2}< zA6G&eEM0_mi!e^%5kQ&9M$j;%^kz;DffK61d-PUAHW^xZrKyjU^hcwx#*p(``~X?e z2`N*o48{A3k<ia8wq-7=?L2ny?WD&2EK}F|%K9y5_a4}|Ix{78Yxkb)57JC(z4Y<- zsAUmhBCh2hzxQ9J7^}&KRvlMiX;48fLUpD_r%XSRtPVhcK@ay5LNc&{sR*$f`4E_} zR74R0O&MV%105LYr3cqltUOSVd;INH^~;y0pWjx`PpJ89!?7<iww+CV>*GAt?lx?X z(#PLkwiJ#I@3N?m-+v@2Ciz$*2+0W1Sa`F&!81nZm5f7Eh=i{0C%e}z2+5|yLfEk( z!~^@b?O&gf@X3dtrSIO*YE9WzaBRo!gq$rq57vJC?yg<MdvXmbz2wPvmM>qn)B_pb zdAuuz$val6BP45Ip=Bd&LDRCuko*&+(*F&_Y_N|o5T%qV68*7IRI6(5lQgt*dc<et z8bu{xCF2O#t!zb0v#ha~->m^t-4pMBw47STfGrUVj<)6RKBbP=S@KKa;e>BJ%=pHT z`LXf&RDijimd%0sW+1j<S~zd8#X&JazkobWsdlPjkk*2+LfGx_rRk1}MTABL$sU3I zi#bGMI$9%U5JAT!u1ZjrU}ph%0Nj`w<&&>`vI@>qxXOa7qE~<N$A8zyYs~p&1Y(aE zf*2}Fw+dq#|44=4m0KMLe=p`JT%a&x@F6MOw;>fB%TeJl25LG^`hi_X9L_Y88s3A) z8H^S4$QQ$WYUCFX>cL0I{~$W<wO^%FacVNma0#(+^x}GzUezqJ2H+1r6jU+PepQV1 z_>UiY^jCpL<A3$U6OTRi@O`I2W@arcC!I^k%rLPTXw7KyCD|0@0cf?1*aDd6GbC1q zCB8Q72=7~LSX$N8b?!GeE|BmC(sI%YIiexcB4TwRDq;X1@Z*jz6TJ-ohoKDOLQHkX zfR1;XIu(EV*n#~Ab{C2Hu_Eb-5-n&GRgs9Pg|7zXn`A1YHC*@+GD#WI$#C~$zTLX} z>9#~Sk!QO5$7eJimMGx!!e28Rz-MraVnx-$IdLZj0rF_AHn^kD(WGb9#ib|XU&+em z(;)mH@gYtLEh^37$xv$jI=40gE14EfdL;10LVH5?3y#nzv~vRh^5a?r_3-;nEyBw9 zXf&wI2<rg&CY@S>fI*T`v~-sLHL^1TgKrtM0ihh8CM3Jq00WBU9XM1VJA>o?yy4^c zm(~nf0neo;4l}}chT`9lE(Vc&jA=O8O&)WE*5oip8{rT$O_+fXJ#Ge?pxNXzd(8-$ zTPDoFS_eRo%N%VnYr%MiXB_~yC(RK$yg3J_5KO-&8qIfR)Tqs8b{-ZIzO#!h-Gj}C zRhP~Bi?&jwJkbWoe)ZoD$4{(TVS_`4$OVo#J!)w}x;b!vVsp^zEea0P*B=QT-O*3= zMRbDxEE*gu-CYy?(afIinS^KEJz>JLE);e+`Xia0eS`(A542~@KGX^!FduHS&@|5( zWV0t!l_mCOtFw!aRN3Fz)qbjobF_YgRC@f9`jYZ*hrMx5$A;wu)nQT>O+-UG`E+*? z!Qj-#N?>9(G`F<0lE2p0W~zm14dNbXnFI9U@U6WKZ^X4Ull=2$aH9E}BXQ_y@q!_3 zyd|==8IKW7%@ZwAtxYYh-j+Ma?=`nHw>Gu4H8-}BpT_UaYHsL8!j+bQLtP_6!!WcT z>(y-iY)M|q2kRQnZ`}UnmhIJBR&J9kHrGA9V$sonGk)9!`H>KzcjzJ^KLM2V;10Gn zbh>e%#Q+MlnS^LwYlIC2brBY`*BY>ZEY0k(c#-iuVWG_97KU{U#~#akpbT5BfEPAf z>}G@A=0`@C8F<-Utzc=SMZ8XQMua?6n1lFj*82B8t-G*q-@4+X2R~oDUSeu0dGMuY z^Qp182}khY8<<+*HYVkrM8+`RndT<GvygV4T5qu<Nj-cU3?OseKNLA=LwqVU7-hHF z?YEH!8-_giC~#n>V^<+tgdM32bLn$<Am?#{{(>LhjUcb+kIbe|k`Itf_;^GVbO`d1 z(kv8NBCuaaAjj#V1%wEI`-*Ulx$$7Cp*@{*I=fn6X=*;hY^y&}TC3LCY}^anmoxow zPT#>dMJ9rDjzEnQ<_z-v$@nn}8bL?|Kp2#f(QIf0qXQ^;n)YH($wX<WB(k`)ELd_0 zAl^FMr;sKxtGFHG06UI>L`ihBp+cFvyUk&duyB!dIvRMxe0~r%k#T4UF?<tcjW(Lj z*)5bV7S#ghcz?)^rw;v%_?h)aLXihYHI^puF^FoA$^hIKQe1hR0*wH+$C{aYj~q!l z>`x3Fjz~OA9hwCSpM=DOLkABY3MBM^p3R*w>rles?LElE(P=#R3bD%Abrwx{oq~%N z%{5DfSx9a=1nItmRa6VB4tgMY508WFzeT_OzI;%P49RPP%_0t49lHi7R-~nz`g?E* z_~|g88Q^fNjj6W5b2gLNY_ph5R=WjgoZvVhJOEa}$1==8OEZQoRwv83Lv?n{U7Zf~ zqF5*KE38V8;i6m$)MReZ++n68Scq1{dT6*C#|S-Rp(HUml4pcTgKyb-<JYUNp0gqQ z?z{u6WP@Q=GBa4oqD8epkn#cj4N!1X#(NEBNtl;RLwLzRM{H|K*B#%J544<$b|$N? zq&~=;!y4c;Hgj23y}-Q<7#a+-5urF(Zv%`X5tJ|x#2H!Th>F8mdX19|DvB0n{ygGx zC2kSgJE9{|=i8uc5KjYf)k5#r80TK<F38Qw%0~GK%2I;4p*%(|l^2~wFeZX|6kg9I z)hc<UY9;?jmYM+ChU9Syxbw&#r3m7U$5qUaiVjpCPCvb8%f7M=2gREDEX9{4+w!(0 zuh_fmP~y7Ny*qa`Zr-zV)2TIkKH6g^J`qaWqy^d)im(qfSk>47$?yhbFSiuf_i#c& zoq&$4gp#KGg+{Kmn-wzDHIW#)0xCb9V+3yxxd@m}3PjkEeHNX3&(D5#fAD9H`$IpE zxc}#qc#66IXZQbTx9~FaF;?C7oHuf|u0LFSH08@Bn|pZ0nWEjIlb?O~#jfmwA8y=` z*}Gv^!qJ+oN!vG^__)*pWhSTwI~eS+SsH^aq0xfSII7!e5owJnMAUe>+5=7E{+6sl zDRFUVl)Y$NI)_Wk?6LGVNG-i$B*s})GM!Es_wcX(`j@}{^)G)h{x#<H7fz}KysLtz z_#G#?+j2G~WYrfGl<YVy5SOP*K26-1wc=pXrqxT<ZOm%lwK8SPzI`WmFWI>*#YS?y zq4WSD5biMOT?9{<R)Q$J48qAo)IM5&BRV8~jwriO94Mlp;TDA2gX97&GP3o!E-Oim z)1d=qUfH$A|0OI{!^Yf{gT0()p*nXH;8J>9b!`H3!`i|1`O=Qn18piv1NuYXAMwzi ze2apw1s4TgV=VH&7O@D2q1U1oz4qE7>b3Yque|ciQ8@?}h5-~Ahk`E=mjLt&?&k~n z(y~l-@ri0?enn$>Zqb>#rtaK)W<gP7bLkhQ4Gjd+60$dwYgNwHnGc?|Vy<EI&y*Of zw6rndRV{?TTT+f5SaD*<frKwtCKm49o?f(Khfce<;Xr=U))k4X5AI)|V^yiyk&pd( zQQ+0Uq9A>z7Dc>@!_cD0R~Id!UY)h*)t6s+=7<990atl31U{00Mt%p6MBtKilR^nh z9bg1t4oK#S<TCuB&RQs!8Z2a4p|GsX$0}nUyl|+V7MLh`H=6jGz&_P4VQd@Lr*(Dh z&aB(AvhLGesY_3p4=p(?w-o-ZF7wlh{U5H`v$<m5pj^v~_|>2M5E)I3JN0VBB0Pm& zja>BVtJI>nR~P;Dug@P>2(AF((#H$&V<czxre|eR*>ke8F~74iQ9hHIMP<k0MQ%=3 zMlhYqXwH}qRGp0MoNZlzB`4vruanV(0ds$j$U2bMzq_DrciQQlRVl~Yk}I`3)<$V{ z!=VH9N16(^wHp*he#FCnQvD_Rxg#<z_Z*~%<8XzX@)M^{QYmvzrU2pk<cXBiDJSrf zfqU>I<3!+O3w`o<YF0g&U<kYsI3g?qVXI`iUr95OiUJ+6F|gQT>4o9~t4jx`ss%|3 z0GU!@7^4v1%!~NNi~dE7R~@+f&^|#t2NuP@wrJ67&mLC_MP30z=oC2k-{Sxb4AuV< zDSZQ64zQJg9z+q0D^z16GAEZ)vL;fCEzl2HNk)Vg`sWSl=oNt2h;hKkg8PKz&D@1V zBShjLJ=RC!?}1%~v8mQZ{NdifbCJ(J_Z;<n@VU_QG0#1V8`2W*eD2xje~0^X&p!J+ zBBd`p`(z?o&&P=cZYd$RaC3sV&qJBM2zXEA1_%yP>rMgjDS-NY0hi+V@F558W)NZc zI3aEfXP_T=Y-6;rB@l*QQR%P_JPlGg1SN?-46GP;zyXAi7QJYY)<qJKA*Sn%7he3` zi_{++FNS^>_<iWbAO8LiFTMD?7l@3{B9{C7QwIUI#G3x|BF;jwLo7dgF5aPUoQATB ziVNk8x*$6WZ?Gv=kR44<;fTULz@CF+`m^MLg3}eR{WupvUPZ8R6l8_q=A+or94V&z z^rfhja$E}N><K~Xq-GXeX|R51YfCc^F;Ij66vU*$5%xP>ghmlFWD)RLTnE;jNWlOn zfT<A+)Dxc60;O%XiiCRmE6EZV&_)B5SEmWWurk2f3Tmdbk%p=osxJ0S9l6y7&-if< z)rHQ)oXtjzLhI8;;eW$EV*uC~p%<8Zr~}mMM#F;yL6*@F$-L3P{Tm18Fz7i9&~3g4 zeF4>yD3c`CgArN-M!rdJnsxTSpLqONk3CM(lAj1Z9>P89SC2nV4j;pr#~w?v!xaYQ z&}ia-85Y_nZborMz1D8D0~eKVv+BU!Vg(|U0VsKPs5n*vlh|##XpTe4<QXyI?gS%G zPZ-MZL;xdwAUee%`6;6PfK4<K1Kp1^s6HoU=wLU)^E6kO*1#>Nt;;a)ngOa{EG|sh z*#&Hwy9pAyPy(L^vb2Z>izx~8Sff!L`I}!a9zo{lcb6_+0!P(f|E(Up2}r}zLC3<p z0&&)0{(%#jHM}x8@4&I{dP7NbZ;iUPU0T*J%@b9&S9hYQvs(vxD!sMt>*%RG5D`d> z(4ym~MI>rC&9`<R;Bm^oNKCb9<XI-QiJR15hd*8mZiY7SP!{lk5YJ~k8eDd9>78KC zTC(JmU#4CF!7NHs^~?&mae^SvvKOvBnR+z+^Td+{yVq^bEb995^P*j)4VxO%3iob1 zyRigp9zEY69jWP`DH)Akk1=tdL1ii^y09&G%gMKUcJ9pE*>JINL*vOErR$EAe!6#2 zrA=cLM?CTV`H!gOFMhOa@u~;Y&jS-5&1PU#lZ;2wZ}yz5^Jg>i*A|?}*uFlgIHz^P z&a<a>HSbT$$k=n3lduO}(nXYHx`V+Lg>Xrb7%T7u)Djl0So&8;SCh)x=|Mrm59scs zPmy=&FXI6t1L&I5LnDMA!gq)e08ymzgKxe_x^RHdUntB4MMGPbtlN2lyZ4=~8=B6S zY&)`Xs4Ow@NY3&1q)^sH5s!T^yo_3UHwgKbl7ysXi&sAK!SRIsX=F$ZR9OJC`3qf` zTuqf3CRfwv)=!hGF=eT|PElqjdZ7#AT*iR?W`Z>`M6i9#u$PTWQ_ZLQO7qv&>^`yV zlZ1V3LuIQ@Chf>5NKbt)VP^?4f<zIIen6<-sE;C+!MPZ~{rd>zE~E3OmVWY3vR*3Q ziAk*o5I<><nT%`a{uhjE*JYPjh^!J*@EEe0Nxc@m|CGe@9R^N?y$l?dEp<iql# zA6^W}W(XTv_Cs1&2#nTU`q{&&=S<o|*hL{Oj3?^<fQM~{;Gk&4df)*63$!!Tj9>>R zFxTH9iy+d5P$*`U%Rvc+RZt!I#2;6TFQ-28E=N04%j1^(sNAmCB%mHYnikdbFQQ_j z#naJgpwr_toLz}2K}I`fKPWb$L3f7IctaH02u}=qWXVGdFZ?33@XlW>eDu-#x4@BL zO29>6h~g8-r2O9#u@O{vGCXOZj%!S8B>y#_i_^k`Lh_X;?QJkb_2_vR&hRlp;21l< zy}hYzyd$c)wWFQt2(^dWewdY#(b3b@)p~FU4i6A*le8;ROGvJefYbc*WNcw6%ODSd z)1GEyiva;3a*-(Ycd-lWNwgTF6PgiNrePuwI+GYEZ=lN=H%4d-0pmR;y_IvItf1tB zyXVhe`0^kB^wQG_5-uCOUjG^%Hc+;ag>QQGomMJGL+~TRSkRD=i&XAc-9fY-;`0U@ zn~bOru%Lp7Tq!k=!Qe!2i?E=>{SM<3rX~z0140Sp^GGu5tT=bB?B{=e>y5ws`IVPn ze(ta=0G*eqB76HkL&A2)OcFMfK|;~}3JF_OVFzdnEO8+JAd?q+-gOeTnVRYKON>JK zt=g@c3#(tL;~yi~=|;@<DD2CCoBxd&R7P!Z32VhWI2JGt>rJI;9cDdXIBgx}=X#2a z=U4vM=O3^5nEbs%lxF~6iJ8Er#NP8S;9-M*w6&>`2eQ_0;$gF}!PnN((C`%=wp(8> zaqKUU>p1Jvw>0PPVkM<jA33$P={Kj3)+ZF~O@5t|R5_IUR&|mjJDa~_&CaDY<y%`$ zCsZWmHq;F2KYw-wb{|3u`^Hg)5bCy2+^_goaIrOKo*pRqW-c~OwJjT5Y#HEU14G#j zF1A}=say3ODC}}AYvZTMpKTKsolah!wXy8O#}A|~K2`Sq@?*L0t+brovf}++OFrI| zeRNOSt`qNna7a-1`!wP9y${~^0y1Q9sUIzS^Qb})6vm2y0{O3@W2-1Es>&(+W;(VS zdsc2qL1|S=Er{o4(6P<5|E7H`bQDgZnZ8;b>&qQgTefBw?%TJieq+Lx2e<G0vV8mE zPj?i2cHGvucl+j&H3_MEcJ5ra^^?V)?8q<Ny<f^MeeFM=|Cn?vwJZu9i>r+jF$oyX zKS#*+(ya;E>~`eAelsDPrq)t|IEv1|uQmH;va!wV=$kLyMV2YKR?^MnaeIoCwJjXc znsnuFo9g+Z<_cD$u(n4h;BqT9Z7rIrR#x6Xdj+qhTrBJnnRJ&weRdW4m}pgR9t#g? z(SQOxm;VGI+aGUD$Tnoit~1iteM>?%b*-h?Xcgu(i@<^g5|!(8Y`4B{bU9hNz$HV1 zDkMy!R@bQv52CD7D+ewdiY1Zz3KjqzD8&fNjSf`_#FIfv*48}wDJtt$QLAI#Kdu63 z93_fjDq!jT6O?R!yd@=@e9+v`YpMVP->oUxj5X$BgGJfM64j6kpFzkrbFjlFL?^qF zAS1nM&&F<pYDI7f5MLkCL5v#Be7uMB3F67aE=1l3lA#izX|gpT4;XY}KhSkOy70*- zpL+6%#~=UYe$fCiw3%G&`Try<+oQK;Wh2gc+1Jpr-F<_WO<iltN08X0?Lzo~un|DL zndW74hRtN!JwcK;Luy<)DV+?er{Ju_ks3=mS_4NUS9&&J#T8iZNX;h-tc=V<`ws0t zc<{i%_328$9*Tt$OuermXM-EAO?DGG8yp^rFgY6_TD}cATgs_Z|CpRDg*dlvP0mKx zn!=7Pq#=Tx4feG|8wFDt#*<r%ta~*AxFE&_MH{7qPeDm(fF+OEEnL3P_)LR{Ap^1d zoVXU%-a0YR0{H{|{T%V6@Oz?8VP7x1zn@#v0xwoY7JT^yxrO;u?p^TR=M~{4`GXHX zyGSA^&Mhp?za4nN#s5b<ZG<1mz%9chL{Ng{>miB^5;_t)3F^JH`hj?(OGjc|DD0sS zfc!ZLz=8}3tl>mC)sumxB&sT_+N1>|g~^~|u>jaV$&O{Qf#%F(Q{08fCIpWgh}=ZS z)*oUExI88Rgp;d;{X$MZUcpz(7F29Ln%b~{#St~+{vYwSg}ZfHVMlQi;rW4r1+Om3 zO>W|DyAP_nv0Wvp8L-<dHUx<6CaX!Qwc0sY7EEd^O+5B_0%hqJ-76GJ57N|aC-%_P zZ6)i9_Yvwg;s;b6xX#`7;lGHxZHBQ1(Qn1w_EVCmXicsv*~;nY>})q1I?BZz)rU_= zOWP{+fO%0EO?-|~7-nueb$n-SHDPYsc6NPoMurmnVdDDyYs_uO{x!^PH_J^*Q|LIS z6CHpG5GNP`33=Ou{%0tku_bR_zvl4T+%K22?Kz))vhVEvtiwmwR;UGlf|YZbT%o`W z(GPCj)39mn$%aHi-d6BMc5Z%=oDd1e$g+1QCGEL=!@7fwdldf~^0w>JBccer50FWN zkSu73#yU^f$AX}D1ZSqp03LhryXcG)hM$4gV(>I)VBNm`t)K3enYOQZKaqPh>rnRU z3bR<OQ%HbdEfko93%KnZ8H+6x@q1|oH;KRxjYlYyc5%eK1xz+y+#{C!ZwTD3iynei zPk>p7b6g2p0zn+ul!aU#oYVq0*xT4Vr;yMPL~!}z!uvRUp`@~_C#R%Hkdh)0C+(;> zxxGB4W^-=23B@?DoA?|H&0`QH0=8}dAg^HUh>&9Ij)&tL)NRnmDbXC_3uj?l`rnbb zUB3p9tdQs(DWTyb=Z2&<;~_w5MPXbMcQU1op;4CLRrX_%rro~d+Mf~cF9_W%fZVp2 zk<9`xESNw|R%WFYz<b#4cpMQffC22<AfEl;r;EY_7GDL5Ey3jl{w^*hNc-~R1WfoG zzMeMix}<aAYasDvs6lL-Kj@9|cyXKZdqUn=kCz;KDNp<qedzUg{N9i^3U7MGz2714 z;SSOxLVPsk_4>fa;GJV@vVlz%9B(ovH^^u3f`liHAL4llPuc`H(tPww1~<rw<Ps7! z!kI?YiGL*O0w^5Fi9-&Ya^T#Q3+QrwXUrtco#l1T0S%c897o8$1-9!nKUv7ZaMAQe z1oJiEyc5)Ap#K0j6bw|oPA?^N-#iC57QEl&&&!R(>mVlvR4zCb<VJC@MNpss4}#K@ z0^3`h5QZw@b}OfMq;e$5keZ@9k%NX_mW%t(O*tJ?E{_XxcqlN+O}aczr0%+0Nah7E z6z-lWut9;IEChNo2H|#d2c2^um^)xWeg>QwK;kk)Vxt-}ApZ$(0Ko|nelm>-KWl^@ zZ-k7qU@xQR;JAm?jSO%oJD_)yBb8Pr1v-CNyi!DVA)fM4WS=50Qq1c<Kjj)eeXQCs zdC>uUluIs=vccyXyX10Qbd6o%ULK_h-W)C>AE8h4O-6vy%>nV;c7dP}1gb>57_y(v zpmq!C?$v|E-GV!zMJ8DdMv@Uj?r<vWbW(ggUW*NhFGm@0Dcy7>h!K$((nE;KBSIwR zc3$vIoj-P=lv9~fy{V=7Ag`=9H+c0}=EbUg{OY8m^5i3}$1(_CRhW9t=KwLD<1RvL zg-*Y;>%H_Lpva&+fL=M^OP~z*OjEmI9RZJDDKZcUQYMQ?1aDkfY8sV3JMB~(rkfrT z>f_DYmb%WyR<<rIAqf}~34cZBamq!I&^2}8bf}|rUsiU$g?FGjw|AP`?V>hcn#(F6 z+-^Qdbb}r*%$Rm*_xtIC2+$x)0TUl?vYQ#*lyZ!HbI%8_zwy^s7rpxDEF(Z0v<BAu zPe1>=7k~HsGrP4?Ed(?g=E$=D_Vlm+>&ahN*>#4B>$=|vWPFsC5r`;6#!GuMQjKXx z+4&`jhw5{C^8zE4JNv=uR-(<}C#5uYXQR!o^)TsWkj}XVCDI~v?+p=WlDcJd!=Y-> zpDipZZ|&%7V<`#hw}i{*_SELKbu$M<5}iS!m3GbRKKb8&d-b)KUo14EP!gP9*VI!Y z;v-=Z1)PraE~i5;J?Fis7=|C)a$)E)X#GrD=Wv+TE!{AARX^$UO^?B82`Ak?OB2l- zHKP${kh*O`RyT+WYEucRn^<8{BZ4lIa&=Z-+TI#a+;ET%qm=en&To+H&mFQ@bzFkJ zuQXKOBqZ8Vfx-;|2kl5$+>nY7CO72nBd>qT;iPHZoS5I2Req2*(ksw4CPcccoi3-o z0a6-gcJ&Naw=@f;f>CcZ4>s*MB!DXr3?xE17>Dw=ZQ0eR031FE;3?Jf8_V~$4;i$4 z89Zm;1-n_wStOGM3_hH$i!_wAGvETCHI_J^lcsocg4)1I5L*f6rWb1r!|5YyBH^9G zvT1~bNQuYxLl4H8^lm0p>IZfA5ObG%I6;WD7J!p*s*8`UFGBl*X%KVCWSVafq@K`e zS%kZqtlBq=H-}`g5b-+g6NEkr)Na9X-&kOrG3o#b7iiwbD7^OJ*^lSo_-&(OpuW(6 z4v);>={Yi!<c)B?0+xZE$l8HEFd$+DA}|BGj4h2;EXgEHij`-+#-!X?A(5i;nchwQ zPA)8iav{4-q62|u05D2g#8rG~1)As$hBV<f!+#+T-UvOW>20`NtqxGRu#aX)MpBFB zlblxk(`%tH67C}Y1Dv`8#i%G=RiNw_fn<CRPWJgov+AxVy^G8O^r#$bIjJeq!-8QL zF3lK)ly(*&d{bh<v5f|XDb(p*r3v4hU!i-Oe`R=hWK>yiMc|fn=2b|IVs9*NBv}vg zd-Zc@@$`rY)0Y}T^fjcLOO{An4VYZQOm76CK@GzK-d`<1rAYoTT8BX=CxIUuIm5*4 znoVLY2CYokV;}Q;6U*Ctu)GbADC<dg61hM~buH!a8qXVmbs+;;i1mhfK)=+fIm|w0 ze{XLO)5h`*cv%bBEGCmU8v4QX#u{MpP#P7)7$A-vLaIvk-D$uy4J5Jwmz%J?fenu^ zyM;!af5-MVA8c>qV_*`b+1|oZ-IDGto{*~X1_V3-h13oPe;mR72mv24fAIovRDkk{ zAWUN!6buN_jX|h$#PMQ8n1$8|kQGU)@IffqZ5tiA*bk-*Doptni3@Up^DPAWH%9;1 zKrA`OI#ULYJ-QRajrETy-}EdH5JNhK$PE=4%)SDj&<p)IB)Cf`f`$%#7FshNz`Y`1 z)7k>z2g5KR897AIaC-80VOHu<RSY>tO<dR5*f^%*_}IjFBwEWg9t0ob81CbktikbF z8nC>XuXpOVrg=l@T~G+Fg@DK>1ePtd(+D9BW1+diBaXBa=(4yHO87mrI9~{25TOL5 zFyI3baM7T86KeFax}%A&>#d=1;^}qKCH^VTFzAO-l0|`%cyub#J>{90nvX~Kl;tcG zr5R#>9p#&4Cgq!a9-(|=(cBz_#DdV%fe9M6GWr~c;8+j}1LB}0DEf(5C=f~k;0knd zl)>^r0U{D{2-gd=exxHBV0YaR8%qsgeVcA@plt`;QT{2nAN5~eXxDW4HW=T$AXRop zc!TjluOHQAZnqcJWO&o>j=^^1@q#iKnyq{Gl==FVfurOa?OWwH(!Tv0p?w=bvx5r| z>?9=phl~``6(D^RV@yQ}ghDv9qwtm_DEtLHVG?`-l-;0W5f+_nmC6RPPqQVM1wt+| zE`SRHN@6|9vzpO8VcIu(28@lFB)AOslxfUmat4ARKK5O@a+RXIUhucUZty#XFJ2m> z+@ABog@PfgZ^Y_xU-X7R?Q`++NN5V*a7|JEt5-(wRg}H^yj0MQ!nwIqZc_tI`$j^R zqr^nNPW*<@FV+|%ud=2DNozS_;x~;!Qd?V|ffO~G_ziJx{XA@HmcHKp0r*F7^+Dlt z0udL44O}5whFrE-!eSGC8UculaKQpWPi<8r-B@THspQBnKIAA5Ec_f)HsEsM8s)(H zq->F})}|K(>;VL2Jxu(jkzu0I&4F(8?j9K4Heu*>40c^P+AI?^T{hK=yhDR3o4zxt zGL`KPR@5$(s<uq@9HFK-@>Y?5^iXvQb4tma@Qk$#D)Mu!6DIFioAP2?KUjU-bEamr z#_$a4H>5j}eaB+93v+X`3a~i^0n1}Dozvyz<j~A-h(s&r$rJ*9-P$#KS?Fc4loEYc zC{pxn`EpAKv69gQLJ2oJosAQZO37f52&89sZ#zL~iwNTlkTka4`{k*JUT4WsXbXZL z6JKYy4kEMNOeQW_a&9!mwY4!kGB8Io>XoUQ!)e9I=>-LiH76QM&a@|m6xErPyo$ow z(mZ9Tx@4hvaKE&^FyO9DX-XS*XVvFbmmNEaa^zZjQ+Y!<pBHLi))bcH>A@0sQ&Wt5 zh58M<j+S@!%s@e2b}>!;hP>(0rryHbe46?#3LD{~pZ{X>$wLi=sRi9E(7f>m0ME<e zcIRZ~b#pl^78g5GTk4MOCt8qb#$&U9;QLc<?bgl5*;va#QOd_7Yv}_I{H|Wg>ErSG zxH_`{C@{$Sk3^2u^a4z`2C-?0`K^}lrw0b*{;8|9y10a$EbmQ{E2=vxD)nhCmr?^) zQ`3u#l{F2#dO@gCuyD$jTU1*fn5xV)=bZDGxAZWR@+E4jT;)4kFY8Sj4whYMPZKuD zLCSJdYm9z{01jJ%UVC!mrp&_ZoKoz1Ab>NPi#M$~Rs=^cO#p|Pbm;X}r<3;QzW>@f zAsF0f0yvFC-ucd77Wabf67+9!{;6#{wy!@58U}?7MyOm?c5LUi{b^i<TqT#HP+Ov{ zeE5ea%}8oR077NZvV<nm9t;z`qm!{g$YfOnPz3Qu0UI<l!v-;GYJckL;<oh-H<jx9 zi)EnG>M-|k(^7rjvu%AB`<t7T{kmYU=>h6Of3u*==k95=H(&NPHHn1$rV2yAoG#}L zbZV0Wetlu9NX|5Sp(bB%kLxP%S2^G?S#<idNA@=t=H-;o9B>BX!0zPQ;{4n&2OK_N zecPZEiz}Y_&EgIgw`X90nY{7;vGyJCab3mws+N06=#P@{ha@DSh7ce?;3YsHJ@6<2 zLfqn#;@*4jwk*lAEXh`HR<$Lo_ujW^>)onqTe7s;zI)66o4b-@JNAS3e$UpnyLWfz zoO{lknK?7x7nzfh_VUl(%x*xXcXM4`P3fiG+s>9&H`KM%*EPYm$=kJk=Z7)1b@eTc zH4TmRO+|lx`te`q!|bVVtp_VyeS_A3`C>NQy?gaF(L;vWI@KjEL=&(Ac-=mS*Kfxo z@0sl`&ujBK{RqZ@Q$7sj@*ek-ZkN|bi=W3w3y23)p<a*O=khvSAegV~qsRk3>_uSW zeqC}m3ml9!joOS|mbBEAY-HYGkf1P8qSs}lqy$*tU>|FL)Cc)HORK8ddwSYoCjI5} zf7`n*wXUwZwWGV8{yKV+)_xe<gWTtCN_*}AvE;#zGZ0t#YIjE~h~wH;Ji6=bH(sgf zX#uHXS4(S4xm;~FSuElpnNHyqlwS>a<ahK4XyDLVfmTv@XPj#`Yrg?bIIKCePK3Ha zh!;T%5RL#f1q-Zek=y0-<1h!BA{K0_SfB6))>QJE?mI;8<bs3yfgzx8&(2PcJs$%u zI99tzFUv?uJa>MI3=aOX{+lxFTIGGbdRHUZNMJbBl~i9%D&6$K`f^%!X|e4oICdn5 z@BTix-mn0}fRI(^<6JU-x@BEmJ0AP6LwV#I%UVIL*(vR9tBWe{QiCc2Ihc3mRSU{z zMNFDcrVWbD>&k2c`jS?UyTgXKoXhX+HI4f)1Zd#+T^=F~^v&@4F)qAVjvsM*VL&<k zTCLZ6v#6RF;p&U1vOVx0yb1T|lK>@L2+Vj6lp<2H-kTakN;rLAS$Sn+Rml`3930)p zP!FxCO-s4l0uuv&JxFzzfYmdjiA+GUq0k{%W%$n7^aADva{3XO6}lclU&z~A5~CYn zd?lZ%f!%=xr?o95rL3i+7qyA^_QjNUJUw6BY-4_#ttum_&wpc+q~P)`zdm_iOHEFT zIgx4XuWwD&ROXEM+rE}GO$*nSqb<w3?(5%ICJ1dk)3k5`>hJIEga9ubYGw=}C`|N$ zGmU8BP(UKm!XXV@q=iHFH7qDxZ1@a(_d*PW9vSo?=$K)CQM8u!kwuH5hXwI5+x->v z0J6xX2o3;nPewzdvscn0)gnh3{?sSCoD^4i_MYat_{@t1ii+O8yg_$*p0uNszhut7 zni}1Zt94&8CKp7jE~O0$IbZ9l054nuc;SwxC0)oE^16E(#w3m@Ubs9trqX?z`v79N z2uVAL3`Mh%6Um!JX1K0NT)&`BCkWKUtBgLNce(Cau%&uhB*YA7gKhB1)c#a!*vhv0 zcxjt8%j!)kY^<#3GkVV#mUo;@?!1xS9IeZ{ph~<V<bAEYG$tqZV#~D)Nm98YzLev7 zYlm8zFPOVZD(aG(Mev0CUA+5{!-W$$TuVp5r*cAi@?1JSctV>tuCCxt_$dOst+`|+ z<A1Y+nIeX}TW>#0Iblk9KuZCz(&Zs)xN+-cnb+6El$Sd^*YnGDy~Q2Zv&`1~7J0tD zrFa;GeMdWoiYw*$C)#8=y83H3yxx8tEA(cUSZiwgv#<6-xqs@yP)zau+;9}B2ySWb zCtAL4TW@&4Yvp^xKuOru<LjM^LE0j_n-`9~eMKnz`7EUnAez%sX&M`)X28_s5cDU` zO%^0@SXy|&%R-3?P$Vqa!8pO|Z-3Mz_;_I~zZ3*xK8}M1CjM$xU_Bs;6F7Vrru=`~ z5DLOfF~iN(Nw7c$()$A$|A7Jlfi`dHjq;JwphlDopm<d%kGNLWb_Z2lpbBidW`Vfk zZW|bA4gq%X&d*_G5LXMlg6?!7#zzP64o}qKzHkuo;UMo_=)j6XC)0@trV;OGkn`VY zNq{U45d1P+hzaaSdAq_odoSfx-KdyReyOGRQc)F)EX#=cySd_~O4tIS=qYf!zTS4x zTL)FJYc@oIoTBt@Vml?tAT%v;gewwCflK&~&R`c_0gMDq!qb5JIBgf+wu7d}5Ow`D zWgJD4#4W_>y$H|LmLj<0gnxrOj`w>%%^eqL7H#Mwb0Odo2Vy0+;3-~5kJ<rg7UUeC zx{;^LOc8uj$SyG21MG2Mf^YNhvd4`)fITh{4x#LAkv;BzBg+2?ecUH<h*5(7jU4|| z{<xgDg!0%=^T*vG3DLIw3rU>Qd}()Hoc}3-+}^FJ+oJD7AlIIa-xoOs{|!kH>Or7L zjHG=sOiceH202x8o3x46>U$XE^sU*VlR{hT|DsC(!FNA7?nfc_dC;qreu_e_q@;*1 zU04R{xDt^>?oJB1j)1T9FU0^88LZuD3b{M43~FOBiQsy|`Ghk}QCRT-+6i=WV2}%? z5?%h1aB+%JF8usuz5GgopXlUbk}pP!baEGoPA(x2v4oi#rr|O;|0qgKIqy?}&+&1C z#P4J=hY6ODW^@3qkRS^M*KDth*yMnwsS;;2io#K70Lk21zxF9gET@1p^6}^yg^KYC z`x0=>Ahw191O_m;u;XY#rF}R((34qsV!+qjexbk`tk#)0pa#sx-V1%yR9u39yf~nU zSxyWePf&!4qHp(;be30<Ed#S0b|!8jVh^e&$^wB0Kt&EDs91eK9syL5*pXDdLYudQ z;1GmpJWmDMs5hXH6#9!OFXy1>N+Q+E6l88-M^`+^V_%oiU1$SQo=sSYm=-b4DSJDr zO}EDM4-#+=Ts&hk80WCps=F!D&B+;#2@!c-Q8>y3>3Ig3>#$G(wjeOU2EC6qjm@ES z3{MTg49*e^p#-ZyPdH{KAua%F#9-v`34v}#!7x*PXiEwF+J0dn5(Nos2OdWS9Cdxq z13PblcdT;Vk*HG#4<9~u929eR5zz%7KjAyh9p{gQpEwEPIXnpgRUHqCI^jh4F&sN_ zl0O<G9tc0VWeKpt%`3xJtX#T$m3`&xRV#n>ACEo#?eBaum*NHiD>xty;s&(j-47ab zzPtbI(L*~|eZ1zsVW8tT^P8U7yk_N=wI6TYx@qgj>$Yy*x^>Iuk3ZV7?)|kp*R0#J zY4g@in?OVN_0K*2*f&j&&v@*sk3RAE6HmAvpZ&zQzW2-Dqu}?K@ExXw>Jt0t0YZth z6j!jKvM~KbR7@O~5OjVbAtW&_-kuPS0$bG5P9_K!f)c$6e8N-l2??popU?R1iukBY z7yfxXE+PKF%Jf5TXZ>x{h4??6in?_1EJgG#eCyd?{OqU3=R>~xgP-xw3qSQeFZ^Wo zPk;X6D=3<N{a5!$c9X&^_v@~Q1IC26WnfrW(a-{yw70j@*(>x2y`hrcjvjljAVD6E zWU@B|EOp*qzW1r_-d<JYKl9%?6S?uo_I)3w9No6%L$&PV{5>%zb}v4+@ywZxNyt9! zdhS=Rzwz3@>+@cF{q<L0eeD;&dhJ#0d%xy=J>=EbUgO^gfBnt3UMv$9A}tk@m-g#u zh)oH}g4msPO*%<~2(WYP&S0d0;2?|}$jdwDxf_RWS!>#QP`{6i4B(%t-Gn%(l1{3y ziKr0Nc2xxGoYa`jsL140PpW}Ixp&3RQ)gCwn0@$9<?n3Tb<Sc;`Ac@pvfLAEKHjmt zXrD==l|A?3n{S}{mwi)sYZCS7RDu5H3opL)*4uBr>3nPEn{U1O#+z^b=WVG)d-;DN zwX1P()LhvNMl|H!0-j0`(WD4iNZC7ySKxa`zAC_#2%w3QbUEddDg|>f<)hS7Yd7w{ zdNK8E<i6}Ja$Wn9&V-BG*5_=>zPLIUyQ$J2|K{yKyy<(x_xdEtmiafs-gxsDFTBdX z7WAqIH~zJVS6_Smt+!vQnC|a?Uve_u1?RkJ$$^3SZ%d9du{)|EY&Sp-!+TN#<zKCp z$@LPYrc17&JbIPn*_Yn_!&^ScZhuoi<$u^)Z@l%wi~cvgZv+zpz>GKE{KFrn<tCH< zb~xyMgPCA)=R4g~y)4Qqy{ng{)XP+MBzCiigGJp;=TN0MK;foPDybS9|CQh>LCOy@ zq-mQ6kn}Hp>$kuCjqi8iFaP$pFaPfM-0y;3=6=V&Ea1lfZr01c|H&_3ef5>!|Na%< z?|rZEzYF>4HRw=4Vv%b_N^1-Q9ATOJEkK-W9*7u6EmbXDB)9Um+(2uPU`&v70idx6 zQ74PTgGWB|=Wsm`j-bqLLhPanBRojuEUI^q@~kuIt)(yi;Mr&RAF<Dc|M<BdKlkhp zxo1Ou^z4sZ&k8?^c<#yn_w>_GJ^7^bDdFiEPd@eZ(_gzREW~0B4!u5EcWaetY>ZeK z9w72Vgr01vX-BaWx<^V~M4THcjARwqBOHJMC16rJAj#m5(Yrtf1p*f&R3kTAJWuHR zDxj!TO8m(Y`Jl7<l-inviwQaDk&!1)o;uB)5+cE>cP{b-cQWMo$y2VA5vNX`U7gX^ z(&ldATHzknx3sr44)cL9yAC6+1AE2fWIRalh3@8&@&39_DM3U54qvNvi43uKa_fPl z4$0)OCHy*G_Y@@<>#1lmkP84rb!`5_1OnI$GAEF7thOABD=Lb8>T`=0@(*!~gazRX zAAT<5>J`2yIKR+S6m*3v3N0wr>YN6@aRw+28T}_rTjGY%e=9IZjz%W>>!CTwx&eQM z3zkNJ3h)k6J#ZetV8jM6j1rIm8l_YtNomx2BT5`#mB4%<1Q_IwQ$ZK3EYq3pfx)+) zdH0{-)${!`?7e?Jy?U542kVRuAQ*)bV3r#R6T}P_sC%79Ih)fP$q(*d!i5irOW;F* z@4~hrvM=tT)SJ!#MT>OmuWAh$yZ7{&V1hB$mMU;XX&Bfi3^FQAtxZ-VZ<>vKmVq-( z{mLKzbD4Xouw>5izy26@nnou><A8%CN2w@ilfketB`k)acGmx$uqecbr071K<~#b1 zHP-s%gE?E9&h1(AarO4{{@OJsBBL%IjH}smCE;XBc3l3M9g?$M()M5c4XkUvCBou4 zOP2om1uHP37?cKrf8ic+ry2G>al#%nct7b}P{0xY$>iM>d(^Ekqwxj?=y#ZwO(TY* z2|HFsC%*ep`j(aZM{-V{c{}f;H9IzLI<REz!8IQpi`?8Cb>x*Ve*L}W%K!yA4^$I> z{ccp$nG@}>!>MBl*Pl98gkhs?P7t6F_U%+Y!6&}_Cze0wT6lX1P?rUU0Cx}39wfy! z!<3}o)9Clc?mbu>vorI9Ra;NQZqFOaTYYGA{r)438{?vPov!>~*V%&A$;O^TA3pOB zu>y@-ykN;<Nc*RsV2>dt6Ev43E%BDzA?<Yj$bT#BU0sU7j^RoG40n<4p$Zw8jC7O+ z0LEBF7Z#*SWmB`PRb8jFUf!aR>AGqe6xH-L=>V|WTdifZ7X2^&xn${kGysGpGynQL zqwCMiHh}vBq<bVMGOGe}YwG&z{^z}lOik_G)O(-wE9!io#x|D~baqI})R|DDY1A>@ zttL2J&<$#}L8PfhT_<)j)X%-~foJ9X_m{6&{p%MQjWy>oyo396=`{bIIJL&_4CdT9 z06?$`9Z=UP0rD1f0AzF`gDXg3hb9nNH8qHFi;{|+ik+5Fn#??4w1D4*UWR%?ZYLBP zko!P2PXh%f!Ht@swH|xqhtK@b_sm?}Kl6=Lt44hyL9cdGBr$OLkzN<*R;&r4uX?W< zxED{Kbv@*68m2V?HDeG6nh)LTgU;e0vkhrq#KNa`Xd+Nk4dDn9fyKLGc?x06@xb;% zA{e3);t0W=T4St8PfJP5%<yH-$*8xe`=wvpGTJ{h<Q<&ZAMkM%aEj?Sczi7h42P90 zVvtxV<=w57Fc@yHzV`~uxgK_tRc5IIsyh}`fNGNkK=7ntumbv|z>6i50WdRwh@G-0 z2?SHbvb8Hek3$&0aPeR<z-|Dxm%(TTNe^oh%z|mAzK<zg{~!OkVu^RzoTV$zBOM#x zj^A+OD{cdT-kK73$}qdbzPVRi)<s0qqJ0C?W(LUgrllq1PEhvUA#I=~obtA`J`u4B zHV{yT0o_988Vl1W95RD}%B`HKsr%M5um0wxmtOS!D(uA<K7Y&zY*Q)K^U{|Sxs(D) zzGBb9hWb}FBnwlFOvr#K2K>~!Ovw8fV*y(|AT5f|0@8k2p*8iT$g$3wFv*}VO`th3 zBR{D`Zl<l(`AE)G_L&cV{{z6yuUNj^|Nflit6q80s6scR@Qu1TAUrw>K&$_2;R)?) zdQd3;9pS%Eqd{}+Smv>-Cn~O<=*-E`YI06i#8s!{S60MzC6rc{RFx!V!FabEe17$N z&~8h7i)Sxc`iEazkbeb(+4X-SIsl{T0@7Iix5WMqiEZ3@V%7ev5C6HXEOXi7D$_?7 zmaI9wV#)U7%lCn?{KJihKRg9X*?j0HtCue3K_@$B+44U;mz9#5O+<eIXx|6)`5n&b zrvnam4H(EP3NCte65AB+?leLyVcv2||5TZx4~g+4_5P!4_wIP-&)c$--do>l+7P?q z#Km``j_%&G`yc1`Ed5L2j>TPSl6n=t#ItnvvgLpLX--NGvHo$G22(h05k&h)14Rr- zki$V9^#k30kwC;LdUZ6+F-W99l*Vj&Af&Mm6YjeT)82KJ4Y{$U#iu&+($(5E2Wu;o zN!9JuC7lWNHKlpo3E-hqS`R<JYVmtZ!FlY1xPScJkbWR37x;XH9K{17p$|a3B2M+a z;@%Dbe7cXxvAZoUI*s%j01GAe2n;vF3sxLJ?1BAH9EXqUvfBY+3-&)_A0UO4=?dZi zM6glOM;uLhaF+4PSz!PB2<zU8<?s7e%>Cfi|1>I$iTS{uAW;d-_%`72?e6^-K`0s% zAXl97=OAui9uo2%sk<rYVCdf|=-|M>AjzSu1CoDHp#yP`RF1|1eo-k^qdFOrL7|WU zxOgEI@<Kdq&3C`|^XGr|{7-+%J<tDa-cP@BT(8ic%LNcSh69Ulx-I!4)Cu4AL=nwH zF6I5BwxTOKIA)!4MM?h!@RdcE4oK2s=C?w`Wu}FNkfaHij!>4tWkHaE|AEqCbRI-R zZ4{nRnK7C|BBM%G@d!jw=*vG^wfg;4t5?zA%9X2D#p&dR+Ar_40(BG6uz&-G3jn-( z;#(EfH$_STKm4yErDS?G504MjwIj@+0n-O82^Uh!krsQKATS)+_gI1b8bA@@Yq6xG zz7$YgoO&M6k+E`<?Lk@Hta>&MhzZ_!$!X{GG5rIB#{QuJRMc|)pBuEO7|De%th{h8 z_Wb!++{H#GG@GdcOh(j76e|y~1^%l5G^F;ll23}oT(m!MCzc~B@DL8y4QbgTW1z~T zC9W@}$_uLj+3jGf!akdrXib(Wr~M^L{@{`JTk#D>#L10j6q+d!y#{CwtUS1eOwS9C zKl!ciJpI&DaQ&Zp`pKsr|8}v+7)V%nx8wWTfPs(re(!_g`<!d0rv*k+eJA)q2=xX( z=@czzkzuY+Bn?!F5>Jx`LSzD=5p6k<;}AXy2m`51U)OgrOK-6>Rd<=&3e1f#_COkK zZtXAwBS$@W_{oo7{nN)7C;aM}AFN)v>Z9lXIK>z!noWUCy*qpo-CcW&>^=SnnRn!p zhQP*$El&J=<m_wV>`qY!h9Oi%2uD<Hj0#Kbw}7Cg(H}@VP*K$svn%`hrUUh5>MM$t zLUq@My!u9l$ohW%!EfJOzL+?+m%sG}(7^Oy+Y)_I8U>%Eij&2BuXuNPAT$D8TG;jA zUkgysVXsz&GJ=43#PbFVn&cx`T~_-oB<J>SG!1v}T5{-c?(q7*Z#{7G{iEB~oZPeO z%=@u`wjJ8_{70|6{XVdq*d+^rZ~yx5<ZZ3J`a2vt46lE;^F-S?Al@fTg6O?z@rY9; z(0c*tUO@e_ZcTIk`9uHQwm*CH^oQB|SM5I)oxdjXTx{ePHKQ5a_56pgyuBR096-Ea zPApma#?Ld8()ToClmzl>X$~QM^0p6mZ|~jhY|_PbQjNzQq=EuE>W*tm!Um*!61acH z%AF@mb{<U0s2I#SUzL7sU(uC{D+$}K96gJ2%%NRBTlKQocR(5wmM&Pf{EfG6n66*A zhG@!tgCf&A+jl!d(*Y6k*+u!t!Msf{2*`B0=zh%YDXzRQG1wH4aRF6B84dkL?05kU zL2u#>;pEU642X)rnp6*OfBvK2{$T~T{4*f90zAvAH-6u*wwx~`FG|EKn@6MNlm5G( zh<EiN!9`8=;hk)QBJH3?6f;0K2)P5p@Uv(Q{!~!7C?P_S39cGkN>n2N<rM&j1o%A9 zlKGWC{Py>M`maCY@4x<w|MUDmer1~#a+c$2+`iD$S;JyH?0$mYHB|zAc{l6eeLM5^ z1^+w&hQhPN)q{-igCVd&!+;tcA`03^bXpV94~l@5#6b9~Up~JcZM4Rfqk$ylLR<`@ z4OI5FS5uhr!ST_6cC2mhQE=)YIqg#Tu|0v3V5}%|J3STm{?raYFyk9}oWQAks&Fj( zSb%snm>j4>)r8{!or&Lt0C0t|WT8txk3(=c(R0}6KpX|(Rk(rB{k(d<_!E8FoAqDV z*CiIY3hhGcynb_^+8kSosHMo*rV#hjXnQY^bo#(JugH=IQ>GIXCyG9q(xsR|Xd19d z?BIkB*aJ$3A_6RfBFqK{4wqL&qXj<%nFw{0-T`le8b}-j@P*IQBYYhtD1(833=k6q z?&%~M{5pI+07`IHU*C%Fe(M?jS@uVZp8L^{zW;W+T4{(WL3afzOGR!%r5sH_;?jQ` zUBAOu?t^bQg@G(p5K0hs1g5}(rtPqwk@yM;YRDvAh)HXZ%uEq@7%qTb0KAH#ue%G^ zLMK5ZdZg+OIWS~lMi9?frv$#leC#B^*io3GAN||=&};0Hhd`IQbnz3*O$x}5Qev`c zU`>i){pm~aAV$bVVggXp;MlZ1sl2lVcF>GavMg+2u_@DScpbKvib;yq%eouo3Vp9C zwn?q(kgL19qgB0qs;)j&OOsram!a)Z>atE4_qKrLuUoC`2BgG=RK2EKCs*{KfJ|=P z@(Vx#EnUJb1!p0mnJeFZh1eELP%;)Mo?Uo%b|Q<sF}L8Fz|G<2rk+i>gFvRV5XlNn z*fS7qOEO4-GDcSdJ7Cjv8lSd_e=oKpb?4f(c`5t1<!^}jOX|S6e;!Ty@W>y_*PlpS zan(`~y?OITTQ9Ck8A$)*p{*I~qSIC!*t@;zqpjN)N9BGHzv05RgJ_6l`_EQ*5jY07 z?~-M2ypA@+T%)~+fE#jGa&4QPy(NrI;O4l+O+A~q6*R`)nm1lEICeWWfXfg;E*yN+ zdpr@C+SAwJ6_Q_{^zq5FQCr{Lxa^8<N3(Tr;^xC;tB;@i`^HNf;)X7*OFXmr(vGX! z1{32B{&R25##O~zV%BCHN%><+<f>Jh_Qd^pZMQ~Y-v0c`Wh{mgmhh#o-6Q{kJFdZv zA)uacEg{W>d=lK+Y;WO!i90Ud=pf%Rzq$S9R4Z^5q__&iAVXoJ2YM#2QY*9>doEp! zkKB6<Jd%5oO=mBkzWCvVU0IvrvObEmW*@wK@x<Y?tCI$E-raX7ZR5%057x%7PXGIk zLzfdTtxt}u+YklvQOk~>u2=>##)oMrExm6$uoXl)=@uvr$I#`$W8=1|D-ndsKW@x^ zD->^xv$y8l7`4{Ge}&=;ID|p)xG@I;3_N%sXHXOz^r?O7b4h(&dT8Swr2?cpts1GK zQzCEGKy9Jry^=Oe><(-iw`)>2M5!h9J2Br?s#Zipx+EBtmd!t3wFCf@i(sLwc<U8$ z9#f~u$myO-IwYV<$BEWZxH&m0j0vMbW6n`wH00*!&GFHon|{1@O_LkW9>Wf{7`szW zIp3lxx=Z%?=yVE{f!$C7T}p}tkv`fiqhq9E*uHOq{~YJwC0w1(a<o&?qme0T-;%a5 zai;0iqs!jsm$J(qTE1+_vX$R{&m=cpEC<6)K=#=I*}Ge7YU(}JL}y5Mj%uztq!N^S z)j^fx)xi~2T(wX&r=|{cfSrghz?~x{$`UuyZMnflMX>~gIDE?4qUiW_qBsPll^mG& z6gr${1XRw08U-#T;P};nh}R62{BPfQ`rA*jPe1(a@4!9z=1UD~b<5&-T0<~Lzl86? zCB<Gj=m2ZLWP+@z;^J$_th#oMFA<7`l2AIpm&^o{VKKd1;xC?CTyhPkT)S3+w@Ucp zP`oVRuZ3L+oXQo4;5_bH=oK8tCrc}9o7y^hL0r)njz*%BL4kx`CvGARghLSl8I(!~ z?P+4U!WkU=U*b&?w~x{3_)nPn;2TEBBna-YphEPHlpU@HJ>m~Uk1*(g@9piIg~eN~ zuBoantMXMZtSYZiXjDVRLC1iPOxkrmSyiw<)JkbjXKPcvzag}-x~74vcY%(ky3Wxc zG=$dGSJ(0Nz6M`?Xf;YsTzEIQ>JvglU}?hYgzF5a0yUO!WE@(mJ;ky{PA1GH;84S; zqg*<IR#K7G>BlMb20lfeCOjC?(jzkuW(XM|<b|p|s2GM70#DPVCAa-y^4@_Z%~ZeB zx}px@`hZ<GM`TOXsN}?!=xYgWt#1TUx2q+jwXV_8B4+s3H6h8@Co(D4HnlqOw#b?| zbDA{~qJ>f&fGZ&7G<#w=`U$>mz;XtDG~wZR(I!0AiZuhs*HTb3$eRY0A|X<9FuZhn zIm}ZnuU|;UXaD}7v*ziYLy=GM5;zC1f=jR{r~#abHQ)=Z2SZ_$$RHRGRzczy%)tMv zU>8ildGSFfgCcRC3ns=EFb}4Kc`*%-nP4)^z!^#4A#?|gf=_WGNC2CnJ2)uF7Bn0* z1TMt-pjNOPs_<P2_<R9wSHWkP51ztOupOp?>5!gfg5{7{7k$Btg6DxvaZ&JRgFi#O zia{emh9IN~;9Yr;Ea)^C6;I*+NpLErLH=m`eiptZ3*XQj)B)zj5}a8JzQn6|w*=pM z6~C1S31T5*9at4Bao+&OMB;g@z<D*`e9Xq@v(c*axX%%Lp$ROC-8icYyph*~q+oKa z3aXk7>=>WV&+<Hnzj-Xj;*aByLeBAcDzE}42x0nusz`B%I{g9{#Pa?SkB_w>qg;F& z$>RbW;`IZ)B82rL+nintTqx`F(n-DvF2qaU7liNiav^^DXejR4N%4gpXNt!{Sk%*s zXN9s}uOC^=z9(6q;BxyRj~8WB$Z`k#gUjc=<?wq@bn5f_QA_3Xjh=q<FKgHOHu0N7 zPLFwJI^BLGkmLL9{$PiT_wzoFU+{&vJYKs$#OHOQQWeLj5e}ctFSsZCAc*v{_%aSz z(ZO!dgg=zNcG53+aPtMba9W5DY>@uB_(_%}G!fS=7a#8PbI$Qep8YKE^s?wgfknHy z35ORAp>7mra<07xWk!?5<THjbisL7|Gu<4Aswh9p`H+Dh=JK%A?>^i@S+|$9^8$<C zLxXvAJRiy-hsw@}3cS}d!Ow7e=wyyVoA9nTh_&&dxDp)t94Ci)d>qd?@m8>#o#ewf zKkBI5c**k-oD-K3@6YoK&JL?p5G>=ofNvFot!iGFgEu)!z7)n*TkS%KamCG<UJg~; zDA7Pi_&gERCOmrmKHeMVaZfnic3*_oJ>l|r=#2=E*N6JGaj)GM?)Objdi|5Wut__5 zi$@ug-zRuO><+KZC)k4tktoQ^dvM5ScW_>p58r2V(+4~@e3=I)&&EgG<32&~`uN8h z;!Brz^=77QDsE1_$tw=`)E`nr#z*hCR#I@rm~?f0slfV1-XGzGV2|G~gmb)LS%Gd0 z;lTaL`2-&q;r5|@7|&i|26_*dns?wl78MgHdYFkf@GeH)q!5a3=8@*%4dUq-FZcvp z0l#=Cm_8qbjt=LMI?wS=yoIlr#Cahov~c4+PKdxY^kXmxkL_$ckXW0Quwskk{ms?< zv6h>$WoHf~9ZEXYap|4Cjid1f^!SbC<1Qf_zjXbt7b7y$)A}(Q{9ZN)V=Tf!1K97w zOLVBu>G9avaEx8L2y6s~8teB=`X*ViOx?x`u5gSf3}KXdu%SM;+izn-QKIh0r#QNV zhzMc|IK3P`f@(vAlIP<4IhN`UIfqwx>Tq<@>B`d^*6pu7e72v@Jl~UgD)-{G_>)Q9 z>z5=Zm&Vj$V2`~&!C{>7xG;Rk*a{ukwlW)hKAy9)RF1*3g5N{pIx%}4B(4in)Pwf$ zkP}10!A3wvz*w>L2~<Gv&^GuK)CJn%fv__$X7L%$!OkSH(M(cB5ga<giSlxM0c!F| za2yTBb>t#^4$Ks{Pk8Ev)Wr<klrz@{M^!B6>>0h)?H;~$T`}a*svJsY*o>bVeGkPE zm^>aKWPCjmBO<V<;m6&828uvGU~aLjmz#yr;P8<agr*B({oD-J@4|2LUM?aqTM4KK zD$nDFCJT09QsOW=hIF3C1GP4TrZNurxDX6Do{hk$z}HdDO$5&&%L(({fo}+R(MZD4 zx%9mPM*|h(AOD~ReZrT}LVPR!c#@8u;14=x;%}`iCM`Zfe?rTLH)eW->UuZ2(&MB~ z1~LI8a<kzA@1OMYJnQt&@H#~01zkv2W0G_l>SS!tkxm{XheK0&zu*eOA;1~nB0!@- zpF>q*Fye}m;`5^`d|n6I=%0Z?S5`a*rHJ0a7=<qN3AlvtC!tB%1$3C@{Nk5Uv;FKt zS5}@lcIfn(li(3MdGh$t(~GP85WT!=(uL+b*;zmy@X(l`6(Pb8!R?q5e%9*`@j8H+ z6OI=&?)@0VB)i}s(S3M{AEBe-FmyvWuMaZ_1(p!l8xR=Z0Chf-_1avbptzQP5D4Sf zAg6#a8sW#p0QiC6!#EUF6<1OV`HETPrMam|Nf+yeM`k)l^BbH_ER{|cbKl`+#i=?U z>jrumO{Vq&K7k9z^ul#@V+4ev`7}tNzB$1ig12$SIZ{KchgL@byU~>LakJ<UAQebu zazTNC!lDE=Fi?U?mj&S)XJLX*x<&Z~KAeNP;?V~YxYU9d{g3bGf(4A4AdVGg`YzSi z)z`LHWzAewR6T|f$P0EJzlhHWUi7yh%wX+4aSUNf1oQq0+<7oBSlkF}PQV<)F+VpU zgrJc&JjGoI7Ee-pGu)VZSo8$wTCdk8gk#YYfC3?W5#LQKlp80ZPkaJ9njyd_5Zr$c z`{G*YcOJSn#2pyYesNfb@HCI1R;U9Zg&V)fyTxAwB2h33V<8Pp2_YCu3(kYC4?IA$ zV3ZaIv@farfJC8C9}x2Etb^rS&t%cL;FGcN<#|p4Im$w-eIg5kQ*iv(BN2c4>PlQn z4yQ-ZT&9%*LP6XRXht3in&l>}df3-$l^lk>PUoQw9)JTNAt+3zLFy&K`!bliIvBH5 zS^&eB0*;{1LsbHT+XV7B17Sb-c(B5QVA4h)lBt#fcgU`V+kqrNIye{MDeE{piOM~( zSHn0IPxE%+>zu<UT&StJEUC5S*5!4&|9VE7QDeE(896bLCD??CKY!)N5kLLySKoI) zVWDF^&@O0ipkwFoq!pkHG!6CjzPgawn%c=ap*E=6UnkVht7)idY^?*<O+y2~6zmN% zfVojuS6|OH_!>g%@yy;3Uf)oQBhCgeZ`QzTaW)9`!L{|C2EK6)aB1tSD;w+TnyPF4 zb#rU$8|v$%wrTl8V6{yMk2-zAMaA`~HHWW7ABdLvcO8y9aJF^--l)mR6HUL{_}2Gc z{Nc=}zxVPtFfIhvPK)@2Fq;e+PB1kYj3%!+$TVpVrJ@qQd8VbGF=<WxYVeUdj3FkY zi8F%S&*U`)8E@fcH~GvXCf+ERW}|F^(Si_R$YAuD=UA*pL#t$ZbbKONLfO^S%_ z?K;vaM4wA2PEFah>$HuR)cy3&FZ}rB=Vm?j^sA5m)q}|ZlOY6i6*CJf|16lZ0`F`F z*{Me_=qB{IeEJCDK^?g<I5;{GVKNVlTpu1B;)i|1p+kd%Lv}b0{Gef27z`Tn4KEl3 zvm^*BttPdR(V4Y6zkaR`nOz!d-6&>WU`qKg+8@QL*K@JZ*<010QQ0}n_afOz)|=JR zjXo9zIrDEG|JBTAUi$i9hM+wBFx;k=370V20||w}TB8m$o)B+bAFM-p$!riJBBU~? zYwqm!cLjCWTO*oVQPtc9+Oy6PFlK3R^K}MyfNW}3TRStT(i^o#omW4{fJ7-ni}JQ~ zUPw2CmKj_%uV{6_f`Y+I))XsT|H;#{-u?QYTu?~RMh;9Y>N>pV5$0lDLNO{oc#YVL zNH)7Z0xU;V$jET|nI_$!Iyo^pA&$Ke9G{57i$p$Qc6=ge%`O58<WeG=P@2Fe&Q6HG zm~;V~0%o1T1L;t)r0r~mbQtxdjz~Hu>@;Xw(i;l}tXTB>P%oqkhF+WTmA_8Fj)#T; z1Oep1Lgf|aVbsCy5?FJYL2D3&bLbypj7VxV81zPykueSF23qqOerPr>;LrfrA4dkQ ze7|6w)jv4UKR9HDW6o+zwEz}_iZBesN(~yM*%*BKxmqxy^l95`riBE~&V(=r1-K-Z zKwSb|L)YF8O*jkP1(~3Qtl@|3XaTa$!bj`-bqvE9I3`%n+%6D$hA~MuX)g4%D>a>x z9&?XMX6&gM$h}Yvg49;E$=u!0Z8VwiXOYMT`s>>m;4@>NrxbXV^RPw1SmJ@C-jB^& z2BT1e%tE!kqgoUaHZtpW!y@_?3W#Z;6((%}BjvETqh1(>5xR<p@rZ85L9G99FlGr% zZFOlm*hmnN3IpCiWi?;ruAWm>T2Wb3pK}=$sH)MvA81-vWE?3x5g&VC`=RVDkqV=< z-h8$xu_iA6P+IEc%h6TW(~~uTkG)VDmAUWCph{;kkjUs(IRA!$OKPLqf)o+zRy`Pp zjop=0-;A*s=7$9a<Kqde$7CDXCk22~LPYqguq?a+?;&pxi<6)A;GX5ful(lMFa7$Z zi5Iz->@V^!&3y4!zy0AslmoYowm#cYyf^us<XxLjW<{Rcv}}KUM^%YFWwPYN_G5{4 zmv@~wRX-LNpHtX-AtyenaA%Q8-lxY_kg`;{0Gyn1iP9Xe?AIZqzfb4U&teRwE|QY; zTnMaS7yCHR$xCYCLBVWujlf_KmnPpJ<1?#VLcc@Q+nh(Rg}?FM?p?cg>vzrEv1$9e z=M=zR814B%Z+&d{o|GLYldffC<m|uLBWozu9>_Ugwl6s=?&Pi`r|Sli_FcJ<l2Vws zD=FrZ5qPx7?8MMSTuUMCvm~kpbx5Ysy6+Y((1CPiANQ~)%5w4;gVZrmkUD0w>5QJf zF`@gY>vYSg@`zRC9`E%)yz8@G{b<XUt@M8@zs0{b6pve2JQcQv;3>O>+ZwTZ-}3lA zAh+L;d`~7($a{cSBbCVzT++1F-fAt84%D?N0b$?W%M3Tx4K}y*soTy<R2^1qMfLIO zQZ;H6baT|qNU~~>Kx|3x-qoRDehgIDjNjs5IvvZ&NZoz;SbFmAQ<tu!pDn+#FWq<R ze9Oh=xN}=#PbXYBSAzj?J>-qG+cn#StuuBnj_U*N#dX<t0gwYSK-|k@Jzd&{(#f&W z>jT$E0C#nBc;x!^(d$DuZ;Xr#4UCuvEev26c}=NiffiMd2FuL^=>QU%b;buthW_;O zr%F_ssG^#fePz+7lMkkPqBj<~*oxI%<=dO1Rzyb~>r91YBO$M^->KO#bL+az|2T*3 zCg}}{APoU&p-&b87}>g*^t>EjK~O$l5LD<cn3128m6dZjhtDp}UXYQRnVFiJbw-Zp zo*FayLA?YwUZ}Ytj8rIMJDVfxvf{ck%N1EYer_P@W@~r)#nwD&&3PSW&0xrD>$X@o zhi=)tc?-9B)|SniHf&pb9`WY^lBOG3q4kBerKpiF7b-%_OUo<$6%iEa1!HwNS6Ny) zue`LfqNt=wVNzNRTD9x$s}_Q*=3&2#m=P4P&ku_orm*0K(M6s=Y-qs_44DW_8cbz= zFy!}ZcaH4{+V0;mXZwy_JGO4yzHR%C9ozYBGq&tplBkwRJiUGtz<DJgYV1*I!JbPH zfXMk(14fa@3(EQp2F?~P+kEWGBWdjVh*4oRqsZcuSpWwt0?H0*goB&<D5QaYV|@@! z@Q^|l$m+%-LTd>NmE#Os@e;D3xRtI|{L0`}E7?^KFJHB8<>D2qmaq8mgO$sduUfhE z&3KI)02Mq|S2vJF2)1rUcLy<2_Hq(onv1g6Cke$Nz@7Pky=TYG08l<(*E~RtbhN1T zs9M4Lt()q^a+cgJ@~GWztRUo3lU7~```*VRQUiP6?{JV$LT(ee8R7c1pydPGmVIgP zVo;lX_T42PEPZb^a{rbsTl~&HmVU7E?emJZ4j-WAIyyV~j-XCAWN>$dc9&hw9m)&N zExuPWV2yWnDv+i$5xB4cnGlMiK0@H?3s@Bp%!0;)f5lUT4eKm$Zpj;l8_K~c2p4?A zL)Jll#6BEs8Dxh)KQKHxGCVf!f&1?nM_kR%lpEDL2CH6}aiHIz$D@Imo}E-wi`6j9 zR8V;J%E;9jS4xulkc1}SeFpzohBf#Z0XIL6q0|=t@q)(}2?ij;-~{m6bB39W0d^cx z4z*K_sKA9LCmenb%m@Tcu<(V7R~*+qOaQV57Uy6Zks&Tl2<uzBe(f4=t!o{>He}7( zwd}eXo42m{c>VG`4t63w#v03!#?R>=XN<DTS9Df`l`%2h{r&oWv$-G8Oa`mTIAFAz ztQK6{ItDhRafYG4P=Z%Ou#RMU0ky&?ZAMA*q<$u2>Z-zWMkZn?ye_g|oZbnQ5`&Q! zKF15=x8S%7lK|!u#<2uqoC32jWO*7?*XKqj#;*?#x2}-mC|osxH&s~mMu_&<K+3^0 zak*_7lJ+BK>aH@GWeo-D!YWx-lPtM6w<^B|SGWed=Ob`qjQLVX<`vCeGJOL#CnUuN z!+m7L{ILm-I{5m-30HXcc&UHFKbWb4YcTF`uzmyB=^MsiF<OJ)wHt-`2a5#14?Zc$ zW~N?yOxK^bHZtZ!?1x9srtaIYEg`*j<C^rnStVPp#ibqCS-d6F2+BycX83`kIbiI3 zTCgy35aBI7YG=#Jozd5#FRxUcI)Ck~k}Z#G&W@`&nOU*p*hf-KdPC?c4BlbxvoxXL z)gCH_VdjQa$s0-yDlM!3#=xb-q2h$p^{G(_yEmWANUGejw<LC7`JuS@gaao!jvZw5 zOs#t8fdabpK^TUg7BNJ$5Fd4TuT*-^e0(%M)^c)7^ii$1?83QYTv5jP`26VIZowlA zgud@Y$O^ta_1nWR&;;)2x|F2zd9a9BrW9=Kto|`$YpWH|^9fy@G4-XH`lRCeR9R9* zXIzUsuB%p(Py@W$Iw+W7;#9of6{ahF_xPLgq8#4Z!wL0Qj&+?Z+;BWI!NArW1m0gx zeQxfixP)fGFAN5+MtAXiFbr@^DvUkhA$TY3(R`cjW+EvELm7N0%n;PQne=)yGh{Lj znypr5&}tsQGvk2SFk~_r22Jo0>XAn^0&aKneaGP^QdUmQlBr&F+HVaH^X?nIF~^X@ z<K$TT@c87Y%jfILaRb5^c6RV;he=rAJ9JIpT&W1e@y0T<20qhg(JS~(++ci@lL8ft zr@THChp-<7+yH&Bp@NqWOT$%}G;Qyl9G?~{440Nh-yDY%!3bPCa+5e=5dzju4-N>< zNm4Q#XA4<ef$$_28A6mnxh$1f2RZ$Y&rUi32IaP{=@k5q6nIyhu^bb|qo09r1BBFZ zn2{{$4tj>p4P#6dxdp>{GxBruHUE~7)N?i=jB_BW;t&?{KJt?gkfJrvj~G-~(~^%# z^EuZE>xH#J>$tTMAFSEDZo|gKshlu7ixiBd!c0kTOgMT9-8c@JFxrj0X@=QkGy)yM zZVomXIa9D1{Yl*hJpx$+I>n(6ft<XkW9(CgL*SzF*edeca1V?hXkzr#0v<6{^dV*{ zPC@u!reNunboEN5GP@$AyGO=J=XT4~J=vML?MQa(#jpz-s<hB5A?QP<M04VYaXqyH z#GKTJi;FFKZ%Qsa6W=Ba!mS5%#H2nH!{ScyuyXjIa{XamL??ZAf4B$1R|+tG5r%>f z@Ji%@+FWEh_{gTf&}YMN-34|WaRra?ko7`COT*5eJ@eh)Z`ib9&EMk`?OlAw44}(l z;7#@3Y><o+u0K84&EY2G80z$_*^3$=2Y?%CJaXjhd(C0!Un2@baSn#;opP38XN!J3 zU^T;X@Y8--2<#l5oy}pxV+?~3{vD5noUo(5KmsFbN**cge&9`7(Gix%8|d(_=$izg zYh{g8(%IhH+?ZB^WPK!rNjs6njHyEL5x4#!V{uA)T1G~Cy7-4D85w+f5N@+^;Hp8F zla`i|&Wp#m^sfg_!nqk~#YV$`6^*u-8Ah3jBlH#cJf9JS+vn&79ZRZ0ml%+7X)&O; zF!&=3#CL!io+*o|A`o4t%?3ATqa6qYYCnT9jr|*QHno`0v0&c`*zo0rua62IE!xTr z$6m)AMf|^|R3*+<LDwnht2yCtq*n+tw8OCAnFw7MN{lfe0<B$OC<ehLm@L|ewW75R zjNL*j+a|Qn?99;jl>n-`g8<8B6BIO17Xh>fgX>G(9bFkZX>n-@QXo1E2FW!7ZzCJ4 z1GeMm34<AD)2oj9?19cJSFe>7mq-nMO!Ek3X=zz$rG~l3#J;1g*aAWfWWM@PS+u$; zx&KmS_vO53#WUFjeVJF{GdA{T_OL}Ou*X(dapTOX#5G-&vBtvu){I7JGe3DWDRA+5 zR@I8-jFexe+Au0!*f6F_#aMWq0PZLBJf{mbX#JYm(2jY!z6PU_F~6)+8!S452`0A* z<k$?X9t5VCJX3z$mDscODM@C7v>B5T!5pJ;5La7oGQs0#OfZe~CVB2qa%w?rLg%?F z7N35mv9WSwaO7&M@xd*1u@CzxM5o+)A|W!>Sf7=#_i}8>nxCiV9>}bIe?wu#w!K{Q z_Cp_@*tYc~&_q)rvsdlOws!u#>Uvbd&!5i|M*_w=nhH&ixzp7Pns;SDdp%sGZrCY3 ze;Q!%iDj)l3c0LKp<z|C5gE?aDeLv;qFY`*Rn!x6CZXVHN!8iYc{#^=a?eVRWEt{| z`LUU)8TpA~bNfywwnks6FFJljwnJ8M=444?r0T+@)<Z?={Gm%1)6*{(oGUW>^s~&h zovf3uZZu&E-R1I93}J%BcC~Y=wSD_8mR(A^+7J^T)pRcQ<S*hbT&Rj(xi_Ka%oU;M z)TL9Uhb|Syoln|*YVX?92~{<*mnY3l%iq2%URaFp>DFqykkF!*Fm^->%~*VCv16bY zKgU#SudTcq6MLoa(29gp`;#vn+ft@i12bSYLf^R5P0i<$kGyhU%0yYdu}CpEVziiY zjRt8)N&2~+8w-<iH>5Sc-*Bd)XxF8zqGKm6UfruG=+Dv{tOipz;nZW8&C(gGYi|yY zUTwJda^G&ggMA45Wc;9d==zwxeX^OkK6a$k@l1zea;&>)Krtq{&fOfi-sP66*#`B{ zl>uq%EoCqKcpJ+J$1Y+%W2qN7bzoS}(DooEqLWSP=P<dEX{}ZhIJ`_2o_V-RVLn<E zeZHhRCOtO#ql^2BcIPm-?6;d9pYY0kSrg^d^da-*Ds!F*O@AP3BAT9|H_0-qdJByp zb3i22Tv0q^9LcFM-80Z{x7^9j<*~OekhX@80w*~X)I-?&L6mxu7rshCYPg7)^{~F+ zQsWWI8rxEwmldM+LwA`vjEs?IW@x)Wu1Kx^x}ovI+JeHf=Pz_86ruvMN~KTeiaDj| zi`^X`c|0$p@OaTDt*$pjMpnN<l!@z#(oe>eL>{P1J=`r#?Ao7c$Tb#8`UmPe&6x(w z?Y^TInj<gen~Mqt(z34YIN5maw6-auX-|Q+pg&V*($#cJ3Ji#VbNX4P+A~>c8K+x} z%-!Q1n|r{Kh1SLv9~K_=VUG6O?1<rE%bRvl#n!RkB<ynd#IT5Pm?giH!(N*U<`qt- z9YtO+FFD9ZJ$yFmY|Pd)g%tRuFcb(cq8HmSU)O04%45%DoQylTVl#l3D^Vvw=~GDP z0`+883$l>F7&RNY=($=&tpQQt@Akp7)F}*VqY=5?Mm_%HC^{goRmCtyc^XE1lZ9bS z8j}g$ofd1woxF(!{V7tV*2L5nAPEa2ekRbj6jF&q30p{<@9?Q<vG#|1olYN;Y}il- z(g1iYU7<h-@;I;*!{Wd`KE3z2o$@~@L`yr%9B;Xto|%-Aot1y)l3Iz7n^b{mrPD|; zyFbtL9g@Z;R;H%JZi)q+RRuT_5gC-rIYlU<mr`EA%LN7aixk<qzA8cldx!vFP>)Mx zc50+o;}tUI9?I0$N5#aPI~P@EW~9|PN2%thtc*jhc`$P76pQd3y_fq-BG1Ld#zZxm zXaRxIEHJ>jGN8#bVCIn}h3QT~QdlQ6YWXk(pE+TY55-O)=fGAf>`@2Y+)xht4wL*` z0ikCYP#EplFosPf1i><yaii2?*6ZZRTkOU1+oQCj5npUX`Am0vdv9?yveXNbQd3gX zQ!~?2Qq$7-)Q2<hh-WyMnw+VSWT$3kr3tAE(y|IKgE=ujKd+!DFF!Yz&zpa_5Rm#1 z6qGhPMwyQz1$p%DmE6M1xw!?odA`e!W>*;LBvP8Vw=z~NX=ojzH`8$gj<JDeP8o~S zZai(<Ve^jnfG!6A_z;huvk8x3(S}(9D+JMYm|B>|>?B6CU@116z#0cCr;aY9!%oP< zkbSRG@X9CDfFmNFP`UElj?+DIsk~d-(GXjt?Cg_vQRXbzZIoB`#3WWM1dMHY%J8K< z(Hh23QEb&)IKvF184@yj9+%~7hO@^r%qokuw%By)aHh4-m?c-^f>FCr>8024&{7yh zhgGOMt~RO6N<&(!R%=j#Bh55@F)JZClnw$YNE8t>Y<zGgVDut*K@G(-v7z(r7{wCD zt)2n29Up-+<g+2XVz~-?0o4*rPq#)l%she~q~E9QqR8IM$1dkwJe7AiX4(0oU4^H2 z*Q3}5<m}d{i|MP+2{8*2*Do_2Y%EO9IJSFx)IpVDQvU@;w?3~UYJEZWifGko!`Zx( zG3!!xUNqB=h+F?fMsJk7Tekc{RPOnMmAfymKYuv+!lv}>&Gi=OV}xF&TLag~1J?*) zHY5XJ1qneg0gq@U+z^}ajd8!=Pin1=F(4sRBlt9}Lz?!K!r>N4F1Wt6eR@-`Ovelw zeEQF7_0fist;q=|D=YS%h(2|+Zr{bsObe?IH`M2yJ#uwX;<{tSF(XH0Rj~yhAC3NS zbEDa&|GaK}V$-3^$0Ez)6z6V5r=MSw8uh^*jLAt{j^0g?JCB`8S+gzucw)?%;!IRU zZCaN+@G1GpwS)W|ym87sLsTo!0Bq``0k>cZ$DccKIN@l~iQU)z1^c&Ll%6lWgun~7 ztF>}jd%J>R2GMC8nqY`Na;pB|?xgzj+s_?|DcqTJIlst6j!3vA_f%Zm=|%hZMAseF z9N%`ZVc(XsXHOngF}M;2W_M&xRB>|7$I1HL#}lq@-g7=}M+!`Qw89`cb0#wGLTU7& z(!J5~iTf`ll*eUkZZh88iWw9D!xp1MKynuH0BEO?qa1|^;s0ScvFZJ$qfzl)hZF72 zqubw4G9{J9UE7<hlPVcSZ)2;%Fu)Mg53Bu}PSxILLOqBM7*`6VzSju!Kdiyn!P6Q$ z`}C@XK$X(9E9IaJP{~jjD2Ge)Sw__fhAq8bqGuExdZP@<xiU3#3w?szTSg@}^k~6a z3=c@Fm-z1*J#)p_6DcnD=*V^M27f)&+CMVFUk@7b3=1Qn{e#y>_~DSD!69~p8wu_o z<c6Ii-?(la9J<l0(G{1KnsW<p3@4tc%8G8dTzb0Vio6prgBra=rXRrS0{@gy4KYs; zo%jqKA_f(gn6k*a#UU*8Ml)}igGi~i*8n_0g$bVtGPrQP{Q8F(iiP52Dpte3C0-b? z5DVA>W*O|h(d?r`;{DyNLO2q;gxJEorPjz~er2cxP7T-VB#>h%ClA5O!pa1hPdXuc zREjDU4eE1%rh*h-pc|p|k7>+MDzVmT4ZTuY3&c=8ulG}Ug{J2WQoK;6JUn*9burY9 zChVTW07HYI@)?uG+Hay0j1k&STs@_nu|e|b5ap+%Fi7{KT$pgbMrQ#K79e$XEIb;A zm_CglfEIuunoug<8rL921Gg{JkO18hD!EZB)MsRx)4}ot(0zldL#7y%gOyZ;lzF!T zH8QG)aE?@plo9bG3ZQ=V5x`bY7$6~)vOC4PS2SLjOWTA<&qL(^_R2VUIAAoe;PNUe zzTuJ9j%`M`*iv2++$-@(1*sqll5#S;G+3q}U<&~}(zNz!7NVd)sgjhZSWKw&(=*0C z9$OCta88t)Zfr#GA~_}769n2EZ2sfOLlT9o2TmqgMv|_U#&*z(%))aSUG_d%R$%=K z=)xb6CdYMmyPc?Jpc*h-S|q<9Z(adI0e{p{sMo+VkP&F;6|2H_9=7y&p#FsdlwHcp z1i2vNr3-;1g8D4ELZ@rU?l;5g;+ZfLMyh_?5XATlV*CY_=5&ZRegV)^xcCM@j?y^5 zM>RUesKoBwY^uSKqTv`^*|)7I*uOu3<%o?P*5P!>kdV{2XX`m5BV$q;rJbt0t5JF& zk@YFs0q>R7A(2|jN>JsAf(^QusF46JTChsZYJ$KH%4@!;riwa+Leo}U8E;`=BVtQI zPsu(QaTI^S8Y&p(06qrkAH%~|AolRuMM`Gy#*N{ju^U#c&R_;Qm<HIQMn#K^X4X{4 z2JD~ji+fNUD0S?p;_K_!&~vij?6#PtsmW`vp2;~f+_(9FEat=Fa~n5TZQGKzc{fV( z{Bm@of^NZbnP2Xe1<6?j`W41dupAf!i?p&2-;Oe=F(PTx9Eu5|@(jFo6ShTWqE}4= zX4Mc9RlYQ=G7OtB-<X@|-=X25>uU1|3REPF(Ky@KkBKX1MuzpwC!H(ClfDO+6tVH~ zG32TAwe1{BJN?0-L&rOd*PK6^b9_*~_t4b?il$?g*!b@`aN&vpo4c$MfFZCuIeCx* z$PH*h5G04x;`4dxzBO+|_v^5TLKK)J6qoyfu_Ij_U#@8ZB!pCH(yDF@71h>MmX?*L zwvYBHFz<EMW%+qmipvs<`a9)})NJgZ)7>ryB~rh75UML@YWz;^#eYW>+Hbc>WomWj zs=d2g_iiaVdV2ku_#@ee2l~z~&pE#7@~MVHS2ygun6XbyfO(i+LFi8(;2MGyK0I>R z@mH!l%c>L1VlC~IuoL?4#S|S%I=}fs{I1xBew{)$)>cq-4Llk>AiC~RDLR{xx{z_I zrmLf=y;EzF>e{>K$<-}dX*X6Rln(2d+`EPSE(wd=L%R$$M2ec?c2jq`yuGoxv8%1S zRim!2(nw2{9rDhqo%LE-Ewq%sFATLm3K;b$j8Xa(L2}%1G)T!Q77&1+t|c4UGX#lu zyMq~P?#`T3TX&^z+OQS&t3s|TICuUW^nt?A-6m5Z18G2=`0FQkbf~ppD~3Z*e06>= z+f!|l%H*}(dTDPTlXth+7#JRCvx!?08TO8$P{G27G9u)HpqK`#4dt0yrCO=!xW*{^ zG=K-j5C}tPMFySbBblMyaFhEKoNNJh=cUrx46J4PyQDU@oo!CdIV6ipK4-O9bU+Zb z4p;0uE>U+$<Z2BdV+N!jd~MN>QzX4W22eA`4)y%{t4A|h+dAq|Hp!?J_e%W`Z345d z(a~NMtcfMCV3SAhaTunoB1Ep#VxVH+Lg9)N3=@yWuos7DJo}WKd@hx$DH}75B&=vv z2Vu^A530h*fcnXRv>OZ57nFup-Ff`D%wjfcQLm~SX#UCUomdv30(C?YHGi-tYHxi{ zD^AcbfEc}}e-~g_AbE6bOeO=0G8Oxv2Fj)ifivbqkus|ZN6ioXH6E*+4=|1_l{Q0> zajFF<Zc=NTvXS-!tuQqPY>@OjSm|lChl&MoGif%RUena5wHO(sU12uKH~c2aYJ@d} z^dV>yVPLNQP+|)#^+ALF(-JNe`_eNpsQ_^`Xt}yN{itl21cP4?J?mtNJ-QQI#JotE z7u3OadO@MLpuMBBt?gQdL5&LQPsF1*_ctgkrPrGXhZ+@EqD^ALhyZgFgYcn}QFm(% zI^G~4Om9^7&WBOgStzxtm3l3V9;N|14P<0MsoWE3;O0{nH|HH6S7-+Y5CGyVAy$)# zwfL;8B?J)Hev984WaTZv0JpZ-t$3g#tYwkWY%!TTbIB-C!+yk7y#)gVseu6?4=t?a zFoe@!&4A$yBLK;HOdz?8$6kj<4KB?-1K5<2JJchCi=fa7%$JB=8SlaG)ZzyF2Az%4 zF0#U0`k4lE7sA@K>mba<rYejE+hm`9Z~)1YVHRu>n0Pb9HU}F`4r@48N<_1Gv)vj> zn=c@GqLx@V^CG-7TDmU7J3%glDESzaEk!&zY>zOo4Cg~Z-~vDdYJlD_52{0_?FJtp z(J^-*GXR+iUdk%$v~~Xn#k9dDgzJpQ9tjDLk={RG)~n!WiBj|M-68dSQEC=aYX|x* z!vpLfw&Df{CI>^T{X@<{VNe(d?jM*K4C?1`aFMltU|>)}T}%vw)Wsy|7`C^N%*6N* zR3OJA6nkKFWesx_D#j!O)fyy#rSH}GaPw=OIxx(EYY`36sL1-Hg1NcfJt&paVHu=> z7U)|TIii#c;J)JNgiWa%7-Y&TE4WIboUQa#v3PV;300vLmE~ZHuvZ0@^LX@Dag~e8 zDk{pWvQzOxcgi}hkDyo^LM)JQ5iBYd%yI^%3qTFfy@t6E+0dnebqjj}*$!SqFazV; zYd{tNG65zHUm;W13~(}wUXPO)Lth7`ff<anGL_M42y}12I-~9t6V61zhh%lPSU4E$ zuy2GL4jvh{lY21?U&B5Ugd4p#fB3pIpG;N=G~K&)ajJY7^S@WA?UAVEQjJ93BWL=M z!Yu6qzJR({HH$!OI^-D6I<FQR5;_9257uDd0LcR=H?;A`>%Ia5l&p4WIgQZ*rPwDy zUZMpG4w^(wBjXMydm)+UQ++-pZ+A@C+!H<<HxXhRpK#a&TkwR9ov<VSIS7yR#-i~F z+k{P52wiu#_>UN@NQMMs6_tQW<thovSk3*IR5H|3!@kza7a=&()YfM(K@6}%Vj5^Y zx?r`&iJ?R(op?ZZaJomxiGl(|BoAqQYP|((v{s_%Zg15XtpjGAIJ)m>14j4laWkao zaBvf$&dCWUHxX`|m_Qkse_}pZJRvm*v+a0vfHlnFoUl12(6R~M7J|cI`=nM++9%=I z+JbPD_&@oHc{Xj)9ZkK3t7O+dYV6LwoSRpWoh^lnC09!OI?_`z^K;WOK?0}jRiTzz z(9fl<ISUf9U|=v>4jvY7_$+h_rZ|Qs#vt?+J>U?h3pJRqMXP@V3f8ES=B9TcAuv5z z3014rN>!~DIho0Ei3M#sXwf^b-m{zs2^RkG38l7wP}b(Sg+}(>m{5<qJd+Nu6S=Zp zFSwiCNCR=YZVg-eZ+dNZbL$f=MxA3sYoD+>eC`RmbzlVb4xY)0NskM8clfAn((81f z@(jeMf^D{@fL2KOH3oRzv>mH}!Z&^kS`y{~2+t+CxfwBuiSY`tZ91#!N?}G^VnVz` zufdc<`tUmgR+G7{TM1Yje2Gz9n5FRMd#DqzV?_(IOpdS8BQsWS08W#!aNq7!Jpyl7 zyRCh?lxLUpnGbyb02Xtlg6Xohomlsmm!A3lFVCr|Lk#Bbs;LOrvshIS*%}{LYODjY zR{JdsfbF%zo5uPoZyCx4j}&#a6b@)|+gwJ2MBi6>C_S>?=1a?dqD#7AwBoRLvZ4EG zoBR5{%u_X!y)~nbn^z3I@o~CQwc|!{Z+~&s1V+VN+oYO01f~W$WK=(U|KSTvhw6NF zw*pbe*#la=>>`R;R1|cbg9dB+b!o{-Nxeqw=V{?Cz0=o~TbR3kYorWO3wR`YooP_n zw*TYZP%t_zL&K%~&wsAA;u-$*DueCj;V*q@nHHNwnAi-|#?G(rxbW;hBnCjYG5WUt z=B<n0_}OD$dE~g!cu!|Q>(ksG$LK(3V7S}tF}b~wvIA!?9gj*#D9AdIpOjN_i0#RY zNpDI^%uc=_5i*mW=rru^%uRILvQHJB9k!jzyO5c3^kgAllx-+X%};G^;`3{=FDAt) zFvITdj4}O}RC|XL@}f_zNsQcstp;R_=Wf_jnVgz=Sw)>A&s}>kD<wNU&>I$$^7VHf z|J$#BmwNtOcDqChc44qeb@#NlCdFkpc7vx$3a7Z>?S%{fcvXh<0>JP~q%C#3zp(JX zYTG3e8JNX7dSo4|9{a{0t2=s?-Q6mcMAvd;)5<^o?AuSBG2Gi5VjzN@n3^k2(g?|! zmy+s__f{V2?#;ZGmaaT|r9aX&1ju4_dRBg8Zi|rK@`O_#cQHHFJ(+$^bKc}iy;4zg z=t7s&pCa|-<#tsa8up|NmYi)Z=yKiL8@KddX8QJ8W7E#<JeeQ4Scwc)jqD!_9zSp? zAtN8V78o8z)%r)i{EzsYv}6el4|SjB^gA0*FMsdkTd!|~ql8$798*ZrS^w@E@3+8Y z=|hrb<BG=?F8aobHW+KPHy~};{nFPy|D7$>5}B;GR{?ZuP3~h4onpGx7F8EuWK?a( zcW-_FjbHpQQhWDYVdsPRkK;UJqjH)nZBE|y|0XLMi>rnUla<w%x+@AQuW2e8&qlf& zc_r1>>Y~ElYK6a2{iN4YQ`A!CvQ-o^MT3sQ!nW4t!ZcvTMRhmTmdcO2UCPAbw(c5@ zV`7}Q&AdHXDB4Y~<$o~xgNKtF_n)~Kb!eB=Y%!>1v48kWNp@ml2IVI`WU}PF^?pJc z=8Oa*9#)un<Q-j4XJ^I>zgSw^+S%OR-g0)!i9H`g{^5nUOFBAGTG8CnRJ7tV55IS< zskONiW>RxoZ{{x-JoL@o6-})`2k7W(Zz=xMlTW;m-C5HpX{+mKQ#5S;VCRO#Z~bSC zdOCZzd@60>YcQeVMBPHCV9vC;Y_>_e({6W6I>#NZTMox0Z+~dAIIGby;lc~Y<Rsp* z*(c}W&N*qHz{!(Nn~k@BanfPG<+M4*Z4QU6Qs$a)V)eoK7<8ZRlnEHGD(FG%Xu+^D z%+qU?mYz24<+S7sHSG$|F<7<jTGQp!)O0CgzM)#iqI;*cQ$HZBZfr!z3jr+6yI=m( z3y&V`XsAO}2Jjd%AR=!6%xAVDJOd0IM8(t^L&?iOI*;fnln4-4RjsR^IuQ5NTa7^O z1%|V#r)kySHf`Uy`p=gr!6~pQCiclA6eB_MtM}Fz`eaa!KC#<<UYi5_Uz0Z1<b<8G zMYwMbI<WSj;4yU4HZeKFHfcjsCpjDTNNtNIZB7@CqSo2to^(yPY&b|uEUb$A4iU-~ z5_ha%29rTB+pNe*PmfASx}-8-gdoQ=Gx<_n!ufMu2DJ{1kUIT43bo0SyKdbv3EUEF z+H}{qT{&}Y`|4fTafaF?V<Ug##ym2%47BRP{4h6HQeF?tLbKk&Y<psx#(3t5_YEWT zwyvjR@n2VL-oI;Qp6Tx1c#acOfjQq;pf}oGlXhE8$*4(H*kGS*9(6kHHkYGAcf*MR zK*I*Th4Eu^J_*7!J8qyUn{?nq6E3CF;TXy-o2aOmsLr$6smlW0cApVKP6DhvL}bIU zKA1F3e0^wJSDTL2KLo$5vZ}hJuB^7Z2lZ|mtyJ?4Ssb<5dF4t(nz4vtr5>;{75QZn zbS#z}>H`yo8<tnRKy%evqsfHT8!jG<Qj0p_d=KK;ndfC@@`^M)s`GmepG!_nXfog3 z8v^^R=yKkkFV0DKO>XOGX>z>GHMkZqx!2vQgq`)}8TI<}>KbEZ!$rll^nOp{*W&XB z@{$etF&&NR%BxueZsX3Y9N*ZUAAhCnN_ktV&n*s+JGIA6bO9O3tVuBX^ow)`1^fuw zDJ7UEkb}tP0cfhTS4X)>@Uj`7PC$+?t*J<Hg@;967MvCY-Jyv5%mTb+K#>Ci_d2A? zAP0__V`QW%6AdRs?xykqruD+T?fn1jeFu0P$C2)k5|ylM`JV6WdtTprci;Kh0u~wY zIWdSzq{&CnmSx#~w*r>Hir_A^yI@eVf<<LY6cwyMDo0Z?l>>uBC5u!fm6@|LiA-XF z-Fbg?PwLs8+1*)EAf=HAV7F(gLv>YkRdscBN9vAS=D+#)vK9Aj=)CQ|*Is(0|EAS< zJv4XLqI=)%yy>G`9+<V_rg<CEcmLp(Cmw(1?3<S@zUJb2H(z)A#_rBn7k#>X$Hu?S zU-`xpslUC|D<9_;jBoYZxOM}_H&)P{!`L={3o0cpMx`5`Fevmf18GT@Z}zVqhB3ja zp)k84tJe0dNw33UEtJt#0(l$Ol9%+5Rd2nw7Pz8!-3Qm(+56-xi?4s}#dUYC?Y{ZJ z#ZN38xP95R4?gztmAAaS^|t3`y?5VrD{h>x-uHvY9=Yb8Yj0Y*;QE_!$LsZv?Ao>b znT^jscirk&a2Vm%=i58wgWI(F2skC-y#9d54aqg%eCtqjckS!%!bb`x$SN{0u`>XL zfxHHYdB#uQ>h#(}K+SyUYe<;@AFTfHjrZ2UKEfN>W5ULEIt4*a%FnA1zdN3MYUO9^ z?s>htXUPYTKenTL%l(hNx9s7Uw%oaT?fuWcasT_zKfEb@*AFiG$Hs@Bc>VsFFT8R0 zdke9?b+3DWXJ*-5e_#9bGwbercv*M$n5cWipR~cygGqo0$Ino(;$dWJzP=J#9++#@ zYFtl&pAHsMPjj+AjRvH6*t+#=R=xiI#&<qk376G6gek-QfG7>xr`G}#h|l2lB|d|@ zgoe}6l}cej>Feoe#})B?_}+(v9DO@GaUKCT8~5R!+wR^Mf4B-~`ujh=|B+An`jFoM zvbhU}&(73N7zN#_T>$Rv%i=WafM`%Dgx+FA2d;hZ722S9d+S@u3*FE4Jg>Z-c}snM z;JJgJe{SJI+y?s6(${t^KO9aX5FNS>mkEU!K+j-HD(M+)CNdrWf;F?9mO{uo{tur! znTggx=GT6B);p{VCg=_<rAO`P;BV8*?d?=ZW{J|CyXXC25HJdUV@u|(%-aJi`rl5$ z%{j1Q|F_@0`;jH-#p<H|#RE$e{2aLGuI2CC`Pg$yGK&vhv~b~~r7ymSqqe(VJmUHJ z?~5bKkiCx}myY&#S8avS+>`D&v=hCe0kos9?fqEU)Q*GNF-lg5l@2BQ<Bg8?G)9;r zl<yddZ?q0th5_YYcVOxiMH4Ups~(Pt)g-(?LtSghVX@!3hj4@B00kl)G?1nM9F>kI z{7*!rq}5km*!WNv_F?)EhlJf2Y#(8_AN&1?;z%E%E`Nn=32s5B$g3q-&=}CCSeU!o z$pYTNe!dO+c}K^G3$T3XMn4agUAcNAW7hAkSwDX>o52S!f4TR|?v5Qj9i6>htC#M| zv>&_k)#o<N|G0Dej_$2D&Dqx3_4cb>UE4dm)-7Gs2mNW+n=e5Q!}2pW{xxqEcc&EA zn{@~;c=yBm*SBx~vis?~Haz*<6^pL8>fJdHJUZ*CJ9cHhJhpr3lFj#R-v0TQJqu?) zIe*b(_ebYHc<HR`pS*ZlU;B<7J+Ho)-4)ZdP*_(s05K<hu>7OD-`To(<EQsN+WF3+ z^DesXuD{IRdgjbIw|}vD)27cCKD+Ur4{^SA+dGf^^{RWW`|A_eU-ZmeI#AcKW$TvD zm%g~pj+Z_P#&O5Xj*k{#%gH`V)R|wt|JsUquTav-S1!Bo*4fbuZod7li*B8B!2@$Q zz${($$bt`VquZxGeDcz(?>sAhYvLO1MoJu+#-$A}ti?w6f$I!Q8$6J+Gut~>$vU%s z^{-&mti1Wf6}TFD<+5j1yt!oA>#wbR<&_mn-+X(;8wksK=#f=7z?FhKpr2dv&XVU| zUA#=YlyU|3u|9laDeuejXJP7d_h#<C>}Z!FW*tJ%-+TX>`yR_I820Gnk0Wnd`cd`q z|MSGtk3aV4qkmuU_%$!Bx#WSz@cEG^pP&$>M;>~VlBhk3pC_Jp>c(ZfCvV7lvQ<Ja z<Wf4MW5r{bA|!fV11Znfj+GEn2azU*e`}!W9R|IZhd0q*tad}!ExaW&FLT>|bLY*Q zo0&Is?rpbcZc}gn{=B*KZk)g7-A8Z1hj}Qx?#k=0yK?r;_=fN4+xDOP5Of7h+=iE* z1L+X5jzC}pQ4!g}Ti#jLvts}(-mWpcickFK2sjJgcpR(N2XuZFOIR12j0kvuQBR%y z2}<8xx9UBdx*|mbr|LgKE_tkT<g}x>1}G*Qwr<(DVavx`H*QLAM)1XE{82Zlo4>tj z<LXr#Hd6uo%o||izx&aefsJtXZ$5I<W*pFh{<eC{LIhb-gc4*E&hA3klJ9ye`rGf+ z-R`&Ud3zmb6&cd8P22_lKU4?S*&m~`h$Hx59l{J(A@uKk-2AlWUFL^_L<7z#q1!4b zldIsF+`9f-*os;8*4yje`w;s8>2>|<4~0V#DZ}snh{6RjM<U9RHV9KY+TS6!+p7*; zIvUpCN4H%226TYUo7b(yw#E7lz3Yczg-5)6$NKb!?d#PIsr8xlKUuqB!`jUo*CUE; z?Z&m6*RMfLD5A6x%Z5O)b=a+12a9dp+7Gb_5AoCveJ%xk4*T>U9fUM*pcK$Z|C&Q_ z4q?MbvoC)QY7z4B4j@HP4-&axy9(w#NKuA2$n}nn?oXbWeBo7>UpD8uIkT^wbM5T( zwS9BcYn3^fYn9nubJExDhak>tyXY&vWabRa`QEj2Zn%EV4L2at@cNtodi|VhuDkKN zIXBFib>mG}{PmXf^#@-!=eld>oHH3G_IAWGiN3g+P~w?ZwPjdqJduc>*&9D-T*)s_ z99KW$NzfsAA#h}T`<H~vcV6usz)IPUpY9Gs=CM!hSR>ONM|7>f;==RJj$bhI(n~JA z?2?(6WG?NwOub~tUoP#w>;M$aM0w|B>db*l)0br~`|%Z*UUK=_Q)ixc@vPaG&%WTY z*%x1S)$G~lUv%a4b7oyQ^V%z~xbkY;qISh)6+iyP&wjRfczVQvzpAeJ<%p3ZNAwLp z^p`*X#m`6ozPWYk)c;<p9tneQ7j~*rJ6I1_%6s^2;1Ska*JF?0fA3B6AAjoEMGK#O zvgcW4Vdh!&nITU;)Aj7Ih0i|y)Uyjav6Z1L?0Yuz?2nf`{p8ZAW1c$oFHb+V;F;(> z3m<xT-sS(eIr_rsvzOeFeB%BmpL%%FqQwiJJZ{3D{&?D!QxE&y?@v4J_rE{+<lml( zzrRbJdgvej^r!zfDL&)u^Uj_0B2EsmZo(J*CGDQLbQ3-8S^^$jzTxxEUflTI-qVB3 zRz2PDS9Evu41vzlGZc0`Qn>Z}cvp8v>hAc`=-=kgnSJxji(b0vs@Yejwq3gH;suXh zaQ?ze?|oqQ^E<mbKRcx{IW@T}F%a)a9NIRuEs^+t{~e7_otii^h40CDyluw0XU&+= zi1RC$?jD>WhaQXR234}@9_UDQ(X@AW4eNrA*AA_yt4nPkfb*cgOMw#sno>um^XRT6 z2%Y$7duJMo&OkTx7M$clAa*)~qcuq3g3M5qGNDs7Qn;xD>W?z&-{$=JulL+{(bN|& zKVwD14Yxd~_CGvh$$eKodCw*1&%J!<{c3;zj^9l=|GeoboKsh)?Kd^qHlyR5gU>w& zJq{(#K4(T|T55WF+JVz&OiNB{dV!6hyO)iD6xw{p@Lj@tS9kZ4bvV_&V+W;QO10x? z?m&M(67t{|QeAZpP?{m6t^(uYVDEvr-*W)Z)6nY>lZwObPd{<#OMkn1&W$S`UOa!^ zJ<Dh98hHONpZ|U7RaY&!YQ^8rc^BjD_}%2Q+gel851cmr>~qgM|NOJsr+sT`G8sC3 z+Ii>UF!zl9vr=adJ9oy}lRXcF95=`41KGYE9nX6p2q4a6evIMtb#L#bgVVeEk>#ti zeV`qQRR(%H(qDA-e3|L_1USxg{Vp<nYBF`!km=JhXQ^i^Gdhv#;9%T8+c0VRxge)L zc1C^JpU*vKvOrgsIgyDGwd<%Qu=!V^<LUl^R0o>@Bw}Fr??Nxs{{0C3odY-y$gz*9 zItYg!kj4#1=rfuB0rJBiQm2uTE`{`5(1V~w4`h1x4~@ZLy;S_bWW06C8O_bH?lTW- zjkTT`kDd94Q_qM_nLN2~N~&d8v?coAOVlI#VZinF_xFAI#R_g1^+V8+u<NpjJ{6+x z=+4D!H?02f%k8Ow6f$ce*U&(Ux=cC7kZlVY-4LVR142RXEuF>-neU}~5Ye2%SkYk> z(U3S?JAg*nkp^&%deExy#8XeHpD>|5GjZtuoiHI?pPn$ZenNd}g8F~IHKBgugb5>m zcH-ERPB@|G<b&uI&(ULsKSnZfpck2F`gUxGIZAqtyzBo2gQo+X$9mts1BcAhsSd=# zLQug98H!Y52&+#I8$gl{gq{x!OZU(R!Zh{#@HEo$5cLDWux$YGPnmQ(LJ6t!!2hbp zpMC1N$8MQB_twnZ%&iCBbn~rq@4e>^(varecH6wvZA0flL%QRD^OkJgwr%s4zHR+m z4p_e#*<?BpL3|hs{Ojs?59ZrD%W&X9fv`#8hXhSeI~i{(38D5OJ7CKpw<f+G&1^f2 z1+lY8xS2sFHJEur)4ee6hV<hM`;b1CKMT2)(rN%^7bS<v5Ur@&VM1Wol+fVzzy0Io zM^5<ZuSRD^WQHF&;)Kz^`st}lm#1G-{*hVUkJya#>jx}b!7?9ovPk<OOuglMv>miB zPUfa;C0DUkcX;RGHQ281Xon@Jrn~zoVHbr<<7gA4V+Os<-~%!&p>%)HftvXi4r*+t zPklR8SdB*$U9(Oj1=&veKxrZlxf|i)=U@BL#!Xwd4s02=am$8x&b@X3b+_Z(DxTv^ zCAEXBL^w$R9TUSO<A8Ra3hFUZiBje#h;-^T!~^d&_OPhel$Mivjgy4mA5fpW;SS{M zLSBpXwsoKua3W9)B&%Dt;8-lI-U0QlRccpkYnQs;8!hM~qR0CwG(L?(Do7(qluro= zEe1r9{mqE|Rd-Sw?A+<j5_Q`}{cE1O`T0v$-+%pOGvA-JI<xXZB;a{!?t=GcubBV9 z;spy|z2W9B@80t1nzKH`)ZxIVI^_KsIL8gP=%7CL%la(t+~-FX296H|!ZJ9<W5w|y z499R7sOhc}b^Tw|opT?Xm6(5j;(`TNOnp#&`nH=|pS@(}l{3%3D{}d~X&2vp-Cwr- zectZ^fB13$31E@e32UOds_Aa*i*M~k<~R%<nSTsqLl9}!8YKX=5Qpw;Fl`T!lr#O5 ztjQ#dlt>u6b`m*Lr@N0;duQXQ;al^sdim@>Uv<-im%Xhny>QOW@7{jrdzat)_+RdO zZ|2O0m$bdP>ysO&MZZ99Tja^Y`QTM;8#aIP@bmpCLN!E_q{rAu1!WuLoU6wwv=d8@ zGbsVh$Ww@e(U@a(*N-7WKR}+>-gkP}Z`i(}>)l@UA9KF!>i>Lws`HcH4eNV9|FU!I z8al(g>+H`o!dP=QxZ}m8bZi_sxNze$G$3Rs0gV{wEvU0L^k!t}#Yq{6YIWd1)J&Mh z07%6A^N!E(m*htZeZX;k{DZ_+d&4gy$=u)Ln3q>y!iGHY9Z%oN`OZoT)YlFsi7n=` zP6`T))1y0=tlhMFH5a;|Uuw~i5xrLWrSyj+*TC+X1E6alY1U3;6+xRQpq!0;X*j>I z#Gscry*|J3(rYfgDl<#H>WC|^xaR7M{`-04nYsPpU082`OO_oBV?^Roq6kbE^82D3 zHgrZkoGl=odbdecl^87p*!^6BV4*dgoj}q7Y3e)Wv>gh5!J<Kl`-bf5+r^SDQWm#i zX|;!x3iU9`jDV)o>N`(9|M)YRh3d2Eg$FKLgDLpz-!JP{kwg>}KY-;D=@eO(5x7B) z0_I^#^}|qMF7JPIJ9Y~S1^LdI@`j}gBTO-cf--+1e{%=2Blolq9MIFNDL@!=KQbrx zGWAH^i6e1XDEbcpo}jFvQ|d0H>r1OEFRuw*a_Qxl^<VO>nU_6HI7Cj@6wc6*c6DHX z7p7-dzur$W`N)_3wrf9^tVKVe_@E_d%L7nbbj1h#MBZIed^BYZn1iZ3!28<U+pi_B zMdIjmZx=KM9PJ{NO~nx~)PrRJ{TqUh8T5Q>^Oa9O{=j_;`X4{yi3PX)>2G~#3ThJG zPxJN;O80kS99s9GsF+*CJxo2w)-?x6Z-Xh1?vwHbRTDU4-Dj%4ptc>LYx;Wkk=X#I z5?hYd)Jw=y0TmMx1r$Mt=7**~=mp;(ae#XNHQ<0lmnM+o3DP`;9^*(R$9Ly0cBql) z!fS^yfm9o#3sKRO_V_1+=JW>-y!_y@``&ry@vW~cPxmihuzKOjC*E7X_R%d*to-QR zHSa$2Dvpk-cg_X=6|g9h{;awnO^X~QOx_(mr#!LX(*k;qle(GUfO^xN7u@~m%=mR5 zK6cT$8`2jpnK9?q=%qK_GxgfGi*CGR*6lOr!w;q2eFx+T$Ob>^w^Hf{%`Yum@{exH zFvuDtLbo8kms1KEyNIxGpcJT=okuOkHZ&s@=;%mjq4gi60zKKP;Un968Yyu>?8qzu zEgX3j)Xe`HP;a^QlG`snvw8N*f15G;vz-?{e!=|tlODa}`q|f<x!}fglFP0;zZ)vg zJ@;V*kTlSszdfM7_lKuncy9I^J1JW@^lWI^knKnc4Nhg0!+Z)54(>h$a?YsTN0F9K z{f9W{?_&M$Lxx|7U6^<*C-nfLrzt1(Fhrf87<wX-j?rHvrA`g}7^E|x-hAn*O-mnI z`Od?emc7%r{p|ZTf7rQb^|n<jw>|Um+7<6?e{wlYAN97ohyy6W^pF+PGU}1fya4R) z>KlO82e}TBg;eawaLf+4GVcw^H&^cs8$uVRfDZxYoi+u02m@>g5V#lubnBg1QF#A> z$pJ|4KGyqm<{w*e6r5HY$oW+7^GJq>4~Q7Y5lliXKBM5i>pRuJ!ZT6u)GH}&mBF@w z)FReJB4gffa+Dz1UOJawjD*Z0i;&SNhX`aS6XpBEydvuwmLa4cY%mZGI=E8-(*HLM zL+~QZf*x=TEt^;x(O07IOiwQ)339SxjEAH$TcQ`<I`5WS?!2Ra-gj=lrSS>m^LXs} z9@K_P`*u=JZRC(k!Jwx-KZqQ1J|ebAcRnI`G~3CnP<UbIQH$1W_~`vFz5oNkkpTQ* zzY2I6itO3llv$d*Az1c@;ye*FOsqIm2EtFJ`u_=OQZN<3TMy+22lh#u012f39cR`d z3^6L4T*n&q;T2cRy7aPHS6@AQ)-_kpntjzGjP`?LukKd0%LY0rT{Tv$427jbgmTxe zqpg)`|2FJekjqCq+A({aT(DMTp!8EZ>Mk6ehRU-GcLxk1awnGS%TPAv6wAImp#B@3 zs)se6p;pP9XPknA_Mib$%!wVht4DV}{=Zrue&U&@pL%-nGfzCTaN#O)JsdbdDU(4w zWN6_~EEFj29CtPikM3B6n4wi2WVvd-GhK;-;gTlva6eL{k;8c>nO}H|s5qncDbO+g z6_ygHntU9XCGsQy>G0#x(vLaGsO7Xt1~r$-5olPT3MAZ5#>35LU3}Thzs$U1=0%rX zIX%3JXiTdMZ3sIND;;(sGCRJ5AWn228GPH}Hp6Ji^#^1_A)}76?hk{l(aW<-<1z+x zkM)0l<ie%onMe?i@4yv!kXfwkly_P^CbP3QrS?4i8iufC{pbCg-c~n|HG$0J+i-so zJ`J09?#|^aXpa=N?$<eQCJLbkVz?Um$vV{{)<G?+EPJM;yIL)BZf=qp!)-74Ea|8= zDnNQU3b3LEF|DL4r?99ai9Hq-)(gt#)vx|XrgxXxbJt7rR<Bt5$ZfBxm*2MTgRa-N zZ(W)CWagWzHX`?gdgFuY>u>gAyi3o8zDj-;eS?fgg6j6TTR+LMVKrW$tQ!3s3d@am z3Ej*91@r`_KGBcb`xABJ?EYP!&T6~m?pHGxpZV9hw_k9>tV{2_p>@IePY+<JzjeO4 zcqvqwR6n$D)N|NB+CKUClP~&Ab3hAN&8M40#nx{2Te^vSZRjP<A9a&q6ZV$Y&ywDq znJ+J2v+$wo&YU&(74@F;mj89y?Kj=M^sL)%eRTd!H1>IaR~NmA8qi4yO!RYk^P)vd z{<?~|j_)_pn32gnpMILQV6JI5ItrF1g#J77Ij26ndET4X&RhJ-T6NjO>z-eJ$4jrh z_wpl`zkT<k(96`h3)JPy=)w%7N?dk6*7rx>Bnim-Xmi2jvRQEpfQC=j&x}EySlvyT zK=_1Dh`L9|@nPf>Q$a)^KRh$OXys7%zwvhU&DVE=!PS?}1tK3?N!+4!i$3OWO5;8X z&G<in5#B&AOEb?rS?VrbRHZ=jeJOfE-mPx*fvyWl!zY0v;(c@?gDj``3)?C41ND_Z zExh;sRTMmi{cwaCzY)KO_tW4Qn|CD_`jA##Kp#9SoNL_BM`%2t7Y;+Rr&Qd~Lms;Q z)l3HzO{~j5q+~J=gnn||xznd7+NMoMTG+GBxxNch_mQ_Dw-`bx76oQ)KZ3kjEK0Y` zIhfu-{!55Z_+g>IV5y|el0~GgSG|ZzAyJQXZzPFOj5RRxPY^(m<fIRfJSW$zy0fPj zT<{Ytyl{rYs-Z&MFoOj6c$F3d<h;bH_9c8ll*9~d&%BLme|XL2jp<F_-m)1<+uO<d zQXhE}%RD*GZ4p9P2xQ*mej35*^&fr2%_-=Z<ZGY{EPy=t=E-Vh>RB%=eVF&S=V;t6 zT%|)F&@Bj1;+UO?k|He!w-Z6zz|I9!EL`M*6$^?EhKK>H1E8Q3E)E*N#6UrUsdxSK z)6YyK+NNfv9i5oc+B$XGM!dV=O;iu1LF+&2LWC0xT8I8?j(p6)N6hX{r?{3Z8v!&m zXaLmn3bZk>vlCv3ZgMBnWe<J8Ii(pw1~sr;M>p306!J-=5n9wv>JQD*|L9MBO8!z@ zBt*-2U;lzL)_sW$%C1cJfn6Qj+dupGFS8&n7C>AeOPw|ZQa5P`n>Vj~Z6|ICKxD6q zAXX>`>{EMJrt>=pV#W^ErZu`zt6N$$3)mIMZVpo}RqUS}!2J3&jMTu1bn}e5^wGY~ zk3Z?^&V1SP^yitbFL7VT=7%yn`cm7|{ad$mbuU}i@u{jlcAt97#_gG1pW$|qzRvdh zmJOt~<F=#in7vfyhPxnYmQF|C|NaKemELzFW_$C>WprOqM>~GHJJrtpC=QvvU}Lkh zQ^7W3ru!)D!Esv)wvBZb(%k!jyONm7d;m68_(Y@zPNorLmRx<!<qMbIe8Y=ZK6>WM z>H~kiXVJ_#vA3>x=;2E~8d!es^;b>1?STv4Q0Gs2_{yiQcyRHwTkn|r_W4&{KK-F( z7d&~{<5%5JWPj_!q$(jhIoJ$h`^EG4JkVH3i6XTh6VHR?-d_3zj*D$;$4~diY20qG zgZ&J}QTNQJM}PLzYMk)WybIQe0Pm3#$7vV?>f&=Ay7%T=+AcbO*_U%aRj*od@hxv9 zAG&SYoCj}Qq%OYj>3hz3?yBWitABg&<{8(lo&M*SFM90KMYqpyT71`qXJ2#k{qf6@ zctySGQ56~(Z6^)+2dz9HC4C4uCyS)GJS2G2YOI{;#X}e2MvTQnmMrR8oL;Of+Ob$& z)V}z;C|vT~bBmwH8Eig`tl1#0b{@tnvtNGd&Zlp=?bRzEx@)<5|EstC{nCeSU3&G? zi>`V)^V-eJAHC&)2QGU$^L+HK`<}Y|wkN0k<(WS}d-kk5U;F#hmoHiH{*_Onzv}GA zXuTrc3(mKU`l>LLqrik1N_toOmv7^|#)fTMa6EG8=8YQ$Hl?<xTQghKP2F46EeC8u zhz4#dNNq`N8oF`Qmdw_^EjUQIaerJsL7^{4;>6Rt+q;mXS+|Teo=?NTp)Iie*-=>R zIPQeP$`~IOK7`r{*x$(XboQqndIeEBpZ7op>}v1o{1o>~ecIi-4VTe$<1U_#?Vn;d zZd)qVw;{D?=Holt*WTKNQ1jHsshtC#QQjH#mIooOU|$S{Is<Ly6<U%XejU0x*=mPF zIMTUh#Dc!FZqsJ;eHf07fx>8rD&lq!m(sK4;4ND}-nx17){j5l+P`H#JjJaW>iS{W z5!$kOb81U^o4Q5acFf1f!?5j>%_}?ldZ3KMjQ~1_f5LPF&~_gMQ)J)<pv?x1mbUvK z$^Qw446QW-sV!aPTEVJ4fHX~*8Du7hoTDWYgZSTcnG^n!Z2R;h)Zf?6Qjw9(K|kH; zCDS%xAMPkj>Zey-Lu>jQ{d}P6z@aoy*zi5;-dO(H8@Pev73{jHukTvE|FTzKedXou z<p)uQ$X8y)Y1$MHNDqDarB^d_TDo`ncmIKekjN6b{Pj1NujzuX4J(6{;}By>9H;KW z>e{<MEhkLu9Rg-%E>xJHpf+6j1Vm%mMK*ROSSTSVLqQ5VClK7^ecjoQmFeGLxa{0{ zWn)|7%s66Zl8I<EIjymETSnb{=EGRJcwp_J<RTc@+0*m+dK_@*|8VGgZ@ig74w!d8 z==*ROj-n%dLC=Q=<96AVZ@h`4usESU<O5_UI1pD~;$ZLlbU6L}^veD43@7e~AqZ>r z$GEo-!K8*zWY>S;3OO1Z<w1n%jK!6$Oi&bH3BnZ&bDexTSavY5@3D0N``TDo2?<aS zFdPs8Y(s1T90S$AKeZMKesCZjM-ASmMv+YI;MWhkl{~E^0@cH?>SAJhx;wu3<de<o zGaJ<P2W~`~N(vau;O-f9{r(@}I)DxRc%-a9X#K{`xUUAk((8vJ6KQJm(2rK(NoM^p z%1gR_LweItoO~VFe89(_eU2;eKsmSv34EX+DHAqDcaok4Q=RlQ=8MNYip(CyU+B5C ziPeV%m+Ut9eQ;3+^F6^23pMkww7U81b?1CwXt#&L-b6J$ogF*2fAMkumi@P`--uKn zjF&Q7hOAlNz2%@S+dkR0b`v-W^5Wy6Yc@b$>;eM~UB7i(`s2es`Rt4KE+pSW*9JOR zFZI0+Tw6#QCG<1w9l+Sd8^DsfKh$yX6K#;fBL;$}`}gRAFFd7mx9D_le>Vzorz5mJ zDChmVNC#5Cb>DX%Mz}b%YbfRl`>%GyiDSoyl1chPpC?XFmMi;}?+BERiZ!%N2}hF? z!iiX0ydj(j{Oo6e($TSKvOb(-pUo$y3E$b5dbk2YQznL*0;MBkv6hK5TEhezC_S+e zl}08-!g2QAuR~M9f&WCu$0!lycqOJJm1cZuP{t}@rSV6B()xyYq%}$Kf$~5p`&$<H z#V@pf)F-_k-r60j%uwQJF{Csq<MAn`9IH$~+f7QF(t^@B`oLNZ?#@<+qqUfFI@&o= zi7HdkenJ_IlBklDwD(79x^!&pjL6AtQz9c{jp2#0ku9M_BCn~?QH+YmhNqk!j`OKx z6^sqFwnm~&iGVhRG!>buOcmZ88DMy37-q#anHpJfU8YV}{9l>>k`@0v^K)78FEhWC z6%Wr0mlco9jFc3s2dM|iivLTM^+Y{QJx%g<;JbnEN{WLA1!Z*y4+$P3d;8Gfp|aw` zgNMtCj|?6uD?TQ8jHEbIovCKU<wO+b?9^szWyL?u{8U!_v&_$A#lOh>LRS2%%&%m{ zBQhgo#iKH#B*p5%>cO(&pR1f8#NnuaRR1V>JMhnef0h&n4-U%e4t^{6E!o?L1rL)I z9}zr4R(w?OC|U7$g5Qx8t4FB3k_usV)IX_zVsDGZ!Qnwp-?rkBK~CSc;^TtH$tpQM zc)YCm#Ndgt;)Y;@toWkfMY7_HgBQz+F9}{EE1ngcB`cmAoGUAy7n~<6z9V>ttoW|r zU9#ePg7?UZ?+e~1D}EsOfUNk%;ES^2&B4vG;;q50vf__}AIplj2e-?LdxE{P;(=gB zRy-^?Oj4{4QHQYNN|D%pp#DHs{4eVFSaFr`cCbI#FDVWj8Q?-md|N$S<sz(FtYm0# zD62#)Ru5IV9IO%F9unmJ7K;Pl32>IG72Xc~d*DA<-D0u2zq&swt`pwIRo|RW#9|mW ze9~;i!&HvgGPb%K(iGQ(-^nVsmoHEj$jSr3Ku}s<9;lR+2bG}0%f&S|I3mbJYMCew zgQJ36rrOI#2S@XIZ10~CJV9E1Qt)(Xd1LS|((;+XnbPu0gI7t*uMW<Um8(apTyB@y zMB1G}4bLJ82k#Ev&Fit1-y6JFT7G}<erfrG!55_EF9o+q%eMu$Ny|S8ekm>A5$uwc zmj}v6O3TkL*XTzaSNYrJobSuT@(QKm6j?nLXI4y=mY-j-R#yIN<+gid<sd^%c@x=O z`Jr+ie_v#1<qk!al?T2b_`bCKUjzSYDQ9{t*WLdJ3nP+fZ3)d76G<d>^;5Goz)pBe z)Osg|PHzbpr0+tVZ)OHX49YcqYE`OXR>YJupl+WG^?nNe)<XqPD#WCMZfvU9=u7GF zwq$H#0_G6Yx7a6};yfZeDHab0jxDJod#90^G^CAcDw^~$v{JXn&`w<*la}iC7}MeM zn3P$!$53kB9z&?RJ;n;*_89Am+hZub+T-DqlCTm*oI=lYdHQqLr+;*NN{Xd(%|yn| zPf7c9c?u=e<tcPgm#5GsU7kWSb$N=_)cGl`<IYcMId^_atGe@3THLj#2Hlr~FZAi8 z&jyeDO9AgfeaW|8(rNO2mlPem%f$^7GmOngg_5D+@pxzk_bar9;)yW-&TZurqmAL| zu#roTYYCI1M7N>GLztBXs!(4kRl%T#v)>c&qy(eafAGe5yo$E@Kh^`%L3q`0cSx!( z2ZXii5k}R)l3)Px2me^bY^CKDQ=QZ;EK4r11W!NC&=oGwxmvC)0#-z(ZNwTv?Z`C8 zT;tNRFlMGh*)dk@0-bBjbw$8J^YlK=Wo|Sgj9E%0&@zi?yBI2g{!>KDu5^-vGs>!q zY1xU!IE65lbYk-gDVtZ=*xZyLG=1)bR}m1WK!hduGREdck91zCa1>jt(Hxvs5fHJE z-7M9@_*BAa6#<dcvY{P2EwWhwfHod01XARXLLfcQjg2=7X;Wkj6SAaCUyigzgP9+q z2m~dHtdSqMZ858qQh8+&R9;yWu~rsEtmt=clmfMk*d;gxd~Tdd;B82SA|=rfs%%It zY`v^<)Dd*Gh5oXESyUHYf>hZ=PoZtQihqq(o!b`Y#MZVc|E2vF=fi}}Z`7jXD->Fk zd?s{0QnxA~ioZgkZ8ET6a5qgu$DQ+xxoa9ZCmil1)NQEQ1$VwUa<j>Rf?IbYx%{TR zEI*nv7I~ZOsFuo(YIoUT@{mMttaj&p4c6$7E;6bEuCw3_=F06gfWway<yG6nzc_a^ z0dBfVwM|zMp>^d<GE!GobsniZkGjCQGN%iisNLi}Ja=|<Y0o1CxHF*E9xPwU3JgMb zWxrg&j?BjZT^0TsDd*MX%Xt#rxh5~p10tlb`5@m3)|Cfyi0_)Bc(5if9(3w=K8)xD zn-@1a0_Ve8j=-+Vok_CNX||aUa;A1{*>$3GwVWrX$-7+yr`1Y1t=7hArai+JUUM*# zHLljiX(BAaJ6Nf;MOiDgHde`Q)@`|}wXsSzv}315J}Cgu#w3M6iX2i1q{tqHK#DT3 z5J-_RvLV@00Jf5>K_EntGxCDA>2Y;Z8m}vY#_PP&cwJF6URM;2*LkJ!I-C8JJqHfV z0Thca+Cm^b(m2}mNaKL?NaKJkg2n+|JdFd<GDioBMFm%!0bLIV^GPH*fIXrTkZuUc zW%L4ET++l|lOT5!<^UJn1=-*Z1Pe%y;vA6pXSK8oY1C%p7X<2kioB9Ljn!>>X>MF( zI)U#7f_K<fblz8F-O8bGV^^ps$}7u_8G~{q%N?4}i5eNaZNURMNri!ZV^pNG9KxX7 zvoI(xP8gIIHznnsg+aMzVE{yX6$SwHxbgwc>(WP{9@jns6@`ImHs!N-LhzzA$PeC5 z^71`GAf$-(&+{%JniX+k<Fs5-sJMMXwC;8NtME+nK(tqq2dGz)2dLNe51?L29-!j% znj}lonJqNz1*uI#H0ea~F5q^8mv0whOhpiUrDqvm+*TucUDUE$>6zdwJrg_-?UmpG z>XqOD>XqOD>XqOD>O}B)$#}p!QM?<xo#f@4x#(IEByZo2H6^v#Gl*-pOCr<Qs%(2R zg~N-OHQ|{U$+c2c6~{PLIT^=Ik+*NGiha)|1~F~97>G5VwMj%1?!-Ulq`A(SBPY1Q z+sRSBKL|=Mf*kETgeFSOp1F~ueXFo=_@c<szG-MSudi(MmobyXl?~M8Qe51~u{x(L zcZc>$j+pSG$Pw^Pg4vw(Y;v}fqkPj0d*Dvw2yF0wtR~K8_DbdZ17*$|1df&Jjg*d$ zha1C_BGGUooqe{EfpAh;KbBj-F@*~Mm;z?N2p*@ix0qN8BrpQat&hzpb?IX>0ABjo zKc*ny+CQdXqckj3@*@rYF$H$iKorcP5vfaNxoh4(rT~E^9P7~a3n$&e?gkX0b75QD z6(|hWrdAXP>_#KPm?axHaIJ}oNr7#PmS%y#qDoUBu&9I<2<&8P61s9tv}4Gi71*#y zY}%6C2MKqN%f^s<hdg^Ai*rC0=YRC<e)Q~p1d4N+k`6n5fD~CI+hTEs6#1hNNRc@T zffPBzgmkkM^f=Ni$76orHY%4p9^vBgOy$Kn4~z31X1TUxIB~JKvs_zw!rPE4cWv1{ zTQ)(M!#U)iQ($(Fp(f~I2lSVz3DQ#zq9fYGcz)2L|H6c3%SX=na#b^OLfd3up^dwq zh}1{#j5nJcEx2`2m=+8!O4NeEMX_2ixU0(HFmW~sAonKPor$)dxkh5zeTi~dLz&T6 z3A+n1Z!lLJ`lk&7m`ibu%p0@ryrmI=WFl>QMftbq%1tiqxsrfMtdflsAjg%7asfMu z?R@lhx#!gGIF)11DIDBYoSB2Mxj!idL5*!ksjzlkXTU)c>74H$H?VsZEY_KHrt)Gi zClaxF{R^9C#|>F4!8^8`C#%WFTnwwp_Y<7A6KtcAI63_D2FULUu|b%k9|v<4DE4R~ z1Ja|33`kK7nzm8y-ik|5A&{a7%!UM0Gc{JS3Zcg$YvcuO)8zc~29P_aVKY`VhO$xV zK&t+EgB;x9pEuCbLFtMMM4KDa=Q3UaF0N_Wq)Id5w6y?mkCYBb(d5r=*nvj?iGS#k zak9T4P>%wgTJ<Q=3Dl!VCs4QPrMYpD=>%T9P>1Ozjj8v~8%!ttK#CjeKe>>oMYooy zb*R%TrTOO#O7j;6S$l*9fqI`J&%yv57KMRnH|4Vj0=lwEgZ$uaIv&KJl;n%q>_eSi z@mbt<9~v%d{qwxxhlahbf8MwJ(5P2~hCsbfk!O-et4<`ZYl?2`AHc=+&!l)4a67@v zxBW1tB4oUO-XMQz3q*TW_yFov;RC2wf(NKqg%6-k1fQ3T2fP!-yTRK@UcM=dt`$M@ z{&@p;qs2{-`R5HJxeP(+MUbO?kI<AyCZk~2z{y{R#+`UPUwDzx&Gwm9mt(^M%@?J( z_~#8+aD<6;bJDWsoJmLa3p<UrD1MtOwb&^BazBb6a?p?B=kervR(uOa{L2Qc^x<DN zVB84c;H7hP59_XB`pXtMOH7ze9h5t{>^?5hw!$pw3XR0a<wx<`_uF-Qlud<X_t}r) zr;}VpL?hFYa*&wKek%}I)b0ud7FD|fft?IE=P}#(RqmmKGsLq`+OvPIIQLv}-Z{_C zInTa1pxC3Q0+1dZ6@c{UrvRi#<fb;POCyIpI6#UNZbG{0(fXz(z(pF*58OuOa<?2D zAfBn*kH&|#Aam~9{XRB<mcv%{qw$IGO`N%DUOJ1|vs)AjEpE%3&}<FKIbY(|M4`|& z8CWp5$iM}Ii*mGJa8Z~R3@%F4g26?xS}?dMR`Ub5iB&%u-|D6nQK&DAPD;Ant0qG0 zCXpmu-Id`qHCF=W&S@@it}NyP=gM0yaIQ?{0_Vz2E^w}Fq`@In&*r?N*ga3t_%;^u zqw4vUf__xJb=kL>ZxS0H=PvSL6vx>1e7MCCI8T<5ciVN{G5O5`Y-1TeI-W%i``P$& z#`23qZd#7|+U#JmBEDUu@N7ukUnyA?{OEW+nG%n0FJ|x2kB)bzaX%Y>c8t5YEM~K= z1Jgr4c4K<o5VvoC=teleiy?G?i)MHs{T3~PLLhBMK|!FReqRu%_bKw~g~ULMk?903 z>Mhyhl`IK1#l??~w=9=-+{iZ$DG=GSj~2jQDb0_L_oL(aR=0&@4O#C;$7ea1V2u{F z{(0VjL&ILzKkO}e+=4@+UiaV#)T>kis7I5AT6I%zG=~GzZe$b>aB=+;-IWgDb{Q|< zhQpYOknw(We6}j$q~Ze6UI`wcUKKuodL?*(dL?*(IuU$6`_4p^P89D3Zzp;ACMmjB z1j+l+@z!mZZ1R_A;>ObLN5}io@xQP-sKDh#DK7SXyu!%wo0yHCiOB5ecw6XavC;8m zesnzKpdTIYN5{t+!-4<IsKKGeEeDdb0)BM--WnZmwXJM2k~UcOWO#herbXr4*(Q|s zTU5_Q;9Tx@`*oKhH1(T)oMLa>1LOs0Y0pK6Lw4J`0xAWznP7!Ni*`dcv@vdZ<DwCl z4es7`(T*z=x+rR~S#yQ9?PSa8lPwvy&6M*JDNnUaYSyh0KU6-itbA}jd30L<QY83n z?cBjv0!WeA3xN~~y%0!ICYq3LE(epEY#xjJz-?qM_tC){;<62sgUtO{c|TTOu(_*j zTkWDShrrZjrsbTWPUTeyyR^E0OjuoKpucS8mqLriexcCfCcO#GIKYpUcSgHSnih&V zn;W=ba8a%n4DLj7Zqsg)t6pN|bI4VDS_*Mk25{D1ojn~z{&2;h(e7u<Zk2lMq_W%H zY}wFEW=O`Gm$EK_v*{f9H|Uzb-fdQFx=H~pimFNhfTE^S0H7Ns7-RGlHtzs!V<#_h z^VXUz;l=vOQe%r2alnRCRCHdbbOLrmr@pQ^3D-RtI-e6|d2yH1sPkhnM`%&CFL1hC z7o?oSc3qEhL%U6PZfLjF$N}2MJzhfStu;%03x0<Aylh!ShkLYT0Vxu^Y2MM)(2s*H z3rKN+C<IazYlT3HM4k<)EBTUmlR=B2&q3sMwk0BaP!3a2XR~-jz+4i(uBa_aKZxF) zJ-&fK^f|~JBFdw{0Hhn+=OT1~i}tz5C%T+-G7<nT8tB>J4*Us7QIjbI62Rz@pJSe_ zK`v4qcyjbm>QgHLx9Ki^6uo7^wByE86n!pf;D^!YFAWeH?o}E9)T4q2IIkKWfqGQ& z2vijIrU{nMeg(lhnKEwhcAA%O%mE=qY*_%>>k3$08Y?th)C%aw(dWM9i%7#O%>&el z=3SOB-Ni&LJCVE#xSitVdvq96F%<6y(&sPbfoZQ&9-v;OJV3n)C4hRRcz`-lyqlCZ zNFMM`B<}`qr+H6-^tm(}Ka$?vaFJ-^#=QEG^o2*#=b}gZj-DxzOjgl%w=GtHF(>w& zy~5!|RyW~U&vR^WgU^f7UF>^&V(V7i$;Y0{f_I~4<Z{X-(HVHwMj;06DA3JGV`!Bo zks^2}(d-7#<RklqF4+>z+X5ftq4cLJA!V}Crc6;{N)$gQ;CmD$tke&l$87t-^M3HW zA3T40OPHn7CjaK}csw+NeXDN`#S>xv{WMl`Vze<l9TtczDXjDTkGe;g{@ORVZ7QJL zw*@DH;C(fH5VT-e7Y)g#r5`*`szWx)2yISIc0YJN8Da#VjW%7ukW!k>b}JNG)Da4W z7S*~!p`GkE7Y?)WuG~jgl#9-@hpspWU2*<7&+a+TSuTL%T#Bv3o){oKdMW_v(NO_N zk<hbk0O#I{L~cU5snNRWgoZ^b&kx*2=5ogzJRrgnWmfINKzhgg;CVlI-VdG!4T#pg zxP<9iq+Ns5nF#4NL?Ku(xX8f;gNuT+U~o~I77Q+m)Pli9xmqx|C|C0Xx5-sMc;4n& z6S1f-BTg#2-LaMpE%$BNvs2^`=gMx>U8e^9;CUT62z!>eIdkNkH&81=+t|quo@WLe z9iR7u=X2Py(t{E<_1-})I0o*!tw&Z0mbdM;9OZ^~Ta6r`ZQSDr&+{uA`~>uxgVDhv zMG(74=-GCkGo(o5*^s)cNwP%v!SjN><Ok2^j)+1Cyl7%%6PyF7`oZ&z*suqy+nP{) zJ>n9OZfu{+$OU*&+wXqxd~QYoj=c(X0(F~StMVa{>I5$8F4;UPSrlx#iyu61L9HD( z@(o4`Q}*t@1+-Ub;OC(CbI|i$SPRV>tBfB!uU-9OU3!b#oP!SJ_4t_Q?K!jw$qvVz zhvQ=a75&QDD}sa8My+}kO91s~)=;bB3h3-OkdZvV#T76waJ!V3@6lmQ#YlNScs_sH z1E#%FJV3otJV3otJV3otJV2c&KA&A_qDm){cZ0XnydOND9k*-0HanYuNh5dKQo*$5 zS}P>lxUqWMw==UFcZbf&K@40rXh#NeqbEzh9a+H*-cFD5{XCF*F*4W>o_ALx+$hSv z(^nWhV%~B|bO(9_q?15*qbGwN0q-Q5-QXELvR_~kFTwN2D>D!>KLx?^NhN_GdOw)n z5-op_k!XBGcv37L4jhZw_k-#EV0u58exDAe2N&yWh%~}kl;qjQnW0Zfp+)UngwEBn zxCRsk>!hDEe{7BuZ+kKgeXcRP#>3^9Dcf>g7{YRf=(x|bZNV?F?P93JrYaQJvMZhB z!nczV$B0Y{Y*U%N1kk%vkRLyvSHeCxopR~64o)^eiV`tfsdk1G>AVm~Q5F^gDN?uz z>845Rns}CPE<bP^mCJo|aDupaNZqO251;qL=Y?<(KlePbtZnVfq2~DE^OpUYf>9@m z)q=rYRR@QOvx!x?yUp%xv-M1>mFVK$?rW37X89lO`6==SbH!l|x{4p>s<ov)pb%es zRtm9E(!dObRT6OO9y_luK9Z5<qn}H_Y}$s{S(oNqwQ@H&QAf$YJyAo+A5PRy@`rOJ z0h3rI8;2ltS0<7I+gQj;$h?kqr#R?*Fz5uE4;GzZT`}n(QFO-NlkxJo@RbioIgL3l zwsHi{hesTNi<#zpO;(BEs&U?Wv{{{U;5=Ez0&HU$FLCk~5|B8F{2cRnnXCu^_h_;L zQY3ZLiqqFg2a^?$BApikDGIYfAVpD@4GDT;YJp@`7_=~XcN+Io%;!bph&%U4<AC%? z<9?KU0_wD`2>}1z-7*07C@ui$#`J!Wyl}Za=Ex(l)AV|uBAeclEtnma5o*<KdNs|( zNv0FHsJCRdELjq4ii;m4Z&@zwxbYMu@4n=LM7>g)A0zL_$UACypevg+Fue_Kdm46< zm+!q%G_&Vz2>^Q~`Qp-7q2ZzqiTNS&c^nc0Wq34ch^UHL|FX8>Op4bHxIETB`8FKJ zR0P5M5%Srph?5coM0+%DXpX!pd;s+-lK|?K-~sAH@NP2NutESYYJ4WeyTRLKyr&5H z9BPf9UEX^@vL7H{cy{?5<Y?csGv$%VDDeI}+E(_>yTaj}7@b*lIW``^<wYqj_I*6F z_bv;gA!Ypd_(_pyxN%~r33{urYbj4IpDRB8_e$7LHjgk2KR!Mj_|J?Q_-EtD!0<`Q za9lhw5cpTOr@@0=pMJ~r>0z!<k8pi@l<U*)xII-5cY7Kf>h@GU)a_|-i1E}QE=bl= z9j)|vq!x#-{!0PxelP!bgZ=rx8#t1^%ha*bi6K8eo^os1L@Wid*j;3%maDl$b+b+i zD=O!O!HSEv4K~N3?Z?O4L+x~BgK1gPxw6@BHiVn8Dso`af-4ZX7&5V0aRs*QWWwb` z+-0I(C~w)&S!{-%+_zVZYtOT1uQ<nEaeh6|ZavS5FMwi?J`O;7ba4Pu<d1A4z`-R0 zNRc@TffOaE32B;L&Q=#17I`B-a2u7&9eQw`cy?g>arJ&&y&qQ(8gLCt%%L9narJ&& zJy%S0N0Z%0mqVE`!Nk=mZ!mFbvVr+=^*B4=$JIM}ggwR8n<QJ5-tNca^CaAUJigt+ zw(NpfV$*f9LsYzI0@!4pX<y5M^O3WTCjnfgZLXF@GoZk37h@v(ar~Ij(~#~fSHdp` z+p*TBBbpYR?hJAS^lBpear~tdEO9!zZ`3)gu}*qzDFVJd8_0efzaPgB-CkdJKuV(Y z&z1rbDz!k1;y*8Fn-d7aM0z(bVx~P)IqDRb)9j8p2sc2wA;gd4_v82rjvlfTyu)SG z&bLvs?S>pq8yJM5HkD2CR1MqUk?4>B&nXEEc*}yNivohrB@1NmcHH=J{Dy4Cc7jLM z4v?b%FPj#e#2;eQJ??*?QLh^y1nN~@15`AA3L2{@>rLw=pFI%jwMg>$!P`k*zSjqY z6tVt!-t9xPB2Gkf=3M`Z+wVi`UP<2bjvpb~E6D@Y<DMV2>XqaH>XqaHDo(FSvLv19 z$3@?xPCHS&3%H%&<=cK3QxOF3$MK7dO4H#a<AG?e1P@TJ1P@TJ1P@TJ1P@Rrg3n9F z1Kx?^-Qevc@5k|H-ACppx+mS)<XSg!GPG=L%{p;{8@!zy<(aoY=|xCj`yQceWUyiU zIDRouoqV`Jd@g<6ZB@p!<&x(N+z2)^$O({6;@pj#tni-6k<lc&WXp4Jvn}Ou{Pw)| ze%wB@8ja9uOEh)xknE^u>ti!)TMBJPgi9auFlnL(>EmOJw)H@7OVg@rguME5SJ*$g zJ@w=E!S6;qy&t#FZZR7kkB4S3HmPq7#S>xvohObtG1?fOj>S*vh;}rHbz_+RvSrPZ z<<Yj{%H3LUAP6pQ(HO%V>QY}CR4qzw5mvXxShu9mqAo5%=W1D$`GvtcY2(cF%;Dqo z<M!=Q1-a+hw!jxQSvHHUK;UA?#L;SFbdrNJ98I>ofJHaDIcClkj3o_C%Esn$S0213 z0-Kwfaqj+jcH|Z3$1Bc_=h=(r*@*`f=Td<kydi)T1*teYG(*miq7W?vQsj+7AVmRc zLgu5eXZi2)1GiDR+<ym8iDxSJ!}g(M$dnJ*`vOu;X~aZFj`gw%=kuTe7<agu&~B=W zZr$1QM3~U|wJnl(q0l0k+n`PPZ&A6-emi>XG<?YvHWS)W{^tcP?qAsYopZiKH$b7# zHW^qjcyY95lcNQ<E(+6v!HXj|cYP!0yt!)}xxw?JIVZJ4?#{D&^K2M3c}QX(*qwQD zSff8W^VoB7<PGM^?S8<&AMkIO!Z!aPze&NJ{Y*-i13NMw19VmR{dj*r-anKKaqlbp ztq1s8d?=D|D?i>}xa}to)7lUB_rv{l-f}U@al}AW1WgN<pxhxvEhHO~Ed`hc$ui=n z?Y9O7*A*3uTIV$gtS;v^s)H*BVelT^M}QP<>};xWZd0^)3W4-U<9@imw)w6bESPpT zrq|sh_T3!|xTrj4&ml=11}@P8(7Na@$Od;H9zcq&f<hp@(mLS05<7u<q;>-JNbUsc zHoY`AE;60KMORWbmL=deZz&?<Wu840yLBxm<@w?M4k^h%qFyP@Pup*aN6Vou0nMI; z0YJS^k!N9mRz;38y;J$@ozQ?qX^<bhT^z{w2!RmM`zneWZXh}B<^$L(K8xEXM8id` zf1WoA(XiL`&-+#(&5=iCk3hXok!O-et4<`Zv$tdcGqf9kJ5js~xSinT+l3fY5d`mt z`-}2{ro%~91fo3}H#A3H2_B$c2_B$c6+VDE5qw@U9`H^S?*?xtdHH58x>f|q+qYv) z0x)}qjV886NE{Ss+zF}q!i$(S+b817sjvFs{v=jSq?t%}oij&HaD%s#qkMl5lwJfm z+II+LBXc81`&MD$@I{fMpSIrvIf7tv%aCkxwv(fL(+qjHoXC-Dzf4mxww&#i%J&D# z;FlFbU@T<jw7bV@Mmx5H2^RkiWbCL&qO~P7V@xEG!~qV%rEyXrsCz<<5*DN)yu&IJ zO4ug6P{M?`P*Rmub9Gip4VADVl%5=kCSsG@>cdH)gZgcmM)#<VUx%i!l=sT7l^Cu- z2>-|uHuURQeKHhJQbv3f|2lSDv{CzfayZ<oeLNu)ZHh#jv~T0%;l{9WHv_{6pE+SX zLc`;gW;C6|PlA1FRZdnS=t=@5la)5*1SO=zl}3k-DL+*H@FV3XN{RAQ<-e3)Dt}bY zRqhNN6Zq%AzXpOo-0z162ZscQ28RU?4t^_mSn!D8QNiy7hX+Rnj|(0jJTcf1yeN2a z@RH!H;4Q&hgL8xPf_DV(3f>dEFZe+4#o*@P*5Jp%?ZKX4Z?Hc&5KIR%>JW99da!z^ zdbs*8>i5(is6SV6BEiIs@`wLaPE*cS?o#dxd^hm@;6cGdf`<kV4;~pjI(Uq_pSr(# zkQz|`OFd293NRgw=<mM={sRRTWKzGW9h8blwM9P3XEPU4>w(-!N)nYDL1LEKChSS@ zM)>L1u;79N+rW>(kTGDd!?m!VGY$DP;(<o?NgDVHMKBkp^~o76;rixqI9a$njVn_i zyjqliGC?_B837g;9S$Yi;^71n%%fw`B$laC`dc44D-5Fx8g=RDP}}qov6jZbq)<yD z%)g(Q47EfW^pfFi$=H~1sFCDuGTw%F^lzk+m!1%dN6tc>p_clFPz$Q1!rzAD$q2q$ ziYCTG4U?%3JRT8Bgj;Z@PJMG^Qj%?#mX2%=;RRfOG9i`>B_pvYFQ&#%4#%T<&qsz@ z6I26@La#;tK5pXpSR%q<1EuxJcw}-o*&L6xH8oow{07Hx;?%mdaNMLx2`pu7Xk#Kx z8Up#au^czV!_+`1jzw92s9|m-x)h$CYzwtyJsRGEfki{faMqJ?Esbo>b!3kwB%pzW zUN9~W#A9mo@AcC{iDv!F#7GhYY0|%<2hlJCA03NNF+o67&>$iWMmLN{<It-q;b_t* z7#(Q>#qcfx&Ew;-))=M|BW@WR21Xl<H%|^lLwduUV2no-+D@OLKhh^@R3y&3hG^l^ ziHSBS0u0BjsR?b-;VqG-D0PLNkHIqE7HYyPfzp#gt)XZbC#iHCYE(_nj*HTzDW`<u zk&(@9dW+iEF___zu{K_zrR?}nD}iby^=+rqi^Hd|H%aD;4>$osDI`@*dvr>qF*Z$u zKxehmaq-sXP&BLfq&8rF5_o~pC6v;MBTxNJ>!{eY=<vof@Qe)^{Xy}V@TBB~NK<oC zd_u*;Cr1LuGS1>J7++6{i~|4BfPNht5f6tZ>sS~aX=xc5Yl+1f^Me_}p(%8ORcU=> zN^47ad?*6U;PjsU#>5$|;9YQTsHF`O1ILBI$23FwkD;)luGnOtR)^f3b&qHXL+zt! z$f}h+!tF>j5j42bEf@{wOWq?^pi41&Argn$%-<k@aZ|(b@o^fq_7VrnDrSVkiG)6$ z6pKI>fhO@8GoNhc5^ih+EIlSNC6WwOlEkCOqrjS?{NQE!AwVoAgyyp2q75+;r=$)O zs&&*dojRw|&sU1^5SLByP;2v^SuI4e#rPODX^?b^5jfPC7aF^@07|>{E6zYRgtarf z9DoY=DP8t`6yysN>7YF8I#X6cQh+Zyj55&!dVa!;*5)t?Qf*$1?~SL#;*D%sgBt?s z34cJc1X4a}euIcigd5tDk*V4%Y&H3PEE*0}RMR{fHKJP)S_jVxH`*G5G(-!N!trpl zAxvAlrL1ubjb!m@ffAU5sH&`_g83%Lgp(i@LIr=UGZg&=MI7IPF_}*}r0!=0w?>;F z;V?LHMlecUeb=a&&;ubtq)M9p#8?v+Kky4@fDvu+P$JX>NvWe#v)iz~;3WcT!+IGC zCz>N;V`oI_n@Ox_Rco&XN~4jMKq);wxot{>Us%P<jstIDMI?zkr8Sm7jT$Iks!ztS zW`n1Rb4P_Ih1yz@DCWGxk*<~UWrx3sm-)XubTG~l6S4SW`J58YOLZC%J}ZK5lBgLE z4#x_3njz|}Gi3eD+c9hy9g{Tfaq$SaLQ`D8=IG0~==e~wdEx}DWnom##5ene5lx6q zJHCy`g7XoCY1@>jwS=*ozIK{xBXyU_Iq=I^l1rc=LMydo^h+nEV=cxTULsh*e)Ca) zd;&fd_$ctHz-I)?E%Hs11-jl@Ix5xxgDjdHclsGH(zw4sFT-k@gc8CFPlz-^`(r8# z^C!@nVi;y-F<C{;P>>U(?irT-*idULSAhsj@&dVal>i(UMwJFEdsJqmV{rn;m8MR> z)j5HYDaHvnm<u@YhaWjZSLK3M_A3H7s5k@X#@Iv7z!j|9T<Q5W913vf815-<aZ;IR zh){WbTWdHDPf4VeJDN(WY7vfPDK#7~(2&`a(<N_fW%hT`VhdDrrs|i#oc>KBTt5X? z$p3ANf!;K2*DL|`>N^our^2|_aCB6x4bB4wN7NPgJ}@z|1<I@a0dC+eB>=9An*iU{ z0qhUV3w@0?p|8o>q^b*Q6IFA7JlX^oO4?NZrdMGbr?L<aiXA7W^DA!?p+Ax~1OL-u zoNS_H<HU`?a@=B~HT~I`PZ)h)d7H5LByAQxpLI^-{Au<$!C{g%_bjhqlU34Y;o~fX zKXC`fSKcN9reuxoS>#fnxMZYzxKX(%+QW^?Wf5JdzUO2vLKg-By$;f7&#q{4akPig zI~ei^;T^I$-LnFzY%nBJxr0R7qf2SIgGAc1jXFrAJ=>^*L~?9&cW9pF4id?+QIZ<8 zLfAFTLewL~<n11oDMVK(caTVXR1B66hD0itOC)EN*NKn{GAHB`Dd@DG20>wVwYfqr zV1mdGD_xU=FzB=Dkjo2ZzQ}ATCZ}ZtU5I{2cB)Km+M`@l;lR3kl%Ol*th;A*wF(E; z-LvSGv+kZ<*DDHT-Q6LME9GqGEH8FTql2-;Ryy$M9%Y$IIiD6zNQJC+m0uB`nwzV- zcbG>akBv2kTiB)|ZFVyM?5T)78;MxYDaz?As5Zm`ZR5(Z_#RRk5MUct8u8BY_!h-8 z3d0TH%>;h8psWq04G7DnfZQhbB*~tI@hqXtKnaIv!?!TLO~dcgwc4qK>TX5&ZcI4? z-x~0CfW^c`0pEm@Dfppw1Nh#G|69;f13oA5m*SE2`jhAb)!&L9ovyvbpEcs`83_Lk zD5LO30&q=$<1O>PCGiH0GoaNtmbF2Bq7Y+5!7BfO9wwACQFjbM#0llFJo~J}PeTiF zwD1$OA!2e8YHUEggbTtc9}|tG1#Re9<<F@P0c9#m6M&$&!H9Ae>o?7fj!CLV$C(|o z2{u<W_BKG%n<W^_VM3p%k0JaJt_gE`pQfR22(xB=Agly{l@@%{vC@RMIfVpRD>ULH zMl9kkfOjaEo7dXH>Zg&kpmZ9mdj>wW;W?k128K79Z$7&srDTsMfZ1<j^;4~cf1=Yc zN(gsWJSOoij@|_DgecgG6{2t&3qcbOO`MvPN4N_BcPFws_**nL)O%`+<7+ZL5e&yE zQF9~SAqu9bPa4hX_#tX;U{DSCHU(`GE@x!Xi-=2Vh3JQPun{$L`e+6$(E{&1#g|6$ z2FEeYCXI&E1yMl*zR|lh{s^80lx*q`DC1dAO%9b|Os7G@C7*lhAK{U(G#>pV-jB0S z9J_9~CHzsJ`25fTfN88Qk}=la@{u&LQ6(4#d5eT;nsxftgmRjzQ}B&oMIOw?sa(<! zU+A<+^G7}7vu^Sm%`M@V<QS*zNepvS@UAYQ<h64?{54>w;aw}8>TQuUCYm*8GQuc@ zxRU5A8!P&J(LCt0L(-7s9Z?QZAN6dkQjg!_9Mfp2X5wWUk<NkER%lKL3uaA37jgD3 zQ32t6BAZ3(9jyn%4V)tLmF^}NPttlpT+3x;BWsH&;xN?CB_Nf>FfY_AzBcJA1=U3J z&$%jrPsDSRnFQi8i8z7ko`NSPM{#+`Yd7bRR!hA;8XZXr;zb_OP4gkrhE;Bmj3Q1X zUMIO1XM9f3`bx)Jo5G%jH5olz8=;*B37>rRBECO^(M}R$;A?=%gKj))QiZ;z67SK7 zI29A`(bzd}i7OaMkvMxoGeMLk@}5pd#2eHHqHS7*sU@P2<FKOfzFKKpY=hdTHNsAf z)EdVktyLsRIrT+YokSO;gV0>lta2XV(wIg<ka5hD4#la8-VCw!Xf%XBl3ToW{+;AC z;fHev@z4}TYocbNudOofqFxi$h}vk*IhILoQhPDhd#b%$3F0@=Bekz<JXYzzS2&$6 zspoM<4Mc%@eY(yQ!F=*Qayp}t6K3dJ1duIkK6E-0XMk&bgzqS;gQ$Zb2%c6^PTw?> zIv;SELv&8_LM_oe(EN}d$Mr8-tEqRSk8$aJ7~UrNNtz|eRa!x^^)G6JaK|+&qAKbO zQ2?#=yk%Mgscu?Lc`4^oUN2GJIMl-FhvtG>BVHHBJqfka8cFk_ug!d2(d7#73zww3 zTf3!JN!KH3s#D_#^oaUOW2UjOl>@#QV^bfI`8;qC5&G<E6YUscThs_QG~Q*A$n0(X zoF8fu&Y*}ftT0OVwy0t)YSjn=Hp7ZxwwqzaFfuJ+#rP%(D~9#^bqXtn(`}y*D`uyL zC_-i5Is-+$MaYYP?&%wK?#Vyf^ff!%^ff)SM7jby5JVd__=jUV(Iz@2Rb{3P@U;c= z5R$Jg>?4Ped~Lx$CC$&o?*pf#eQm+l7WRcB&W_qb&`eh3YYV=%fGi{X){$jjTky37 zUt4Hy(-Nxqc~kVn0mdOqo^E8%<W2de`4;q`P;5{5`w)716W_DodlvR&E;fH30$S-e zF8`YES@1mz`?P1Fs@B&QC~F#SZ}FoRSpHJqvp~kl9?snAYYV=%poLRu8B%$EKtCfZ z3z5spZ@QOeWc{Xj7Ao1*1}s;i?_2QqA^d#^%GmB}3w~~QZ7tuex!rx=g6~_{r+o{R zevBi_$nN_V_RU1=e$;{=wctlB_)!akbKA=|&9~t1L-_j;`|hPIzOLZw3cjx3>k7WE zup6&@b36}G<?loIo`rq*3O8R{@U;bBTky37Ut9Ppw1qPN^rWvX_}ao(eLKA$<LJjY z`Z13C{H^o;K7=LXqo2jmdO5tG#c{8@9NzaV_?`vdv*3Fce9yvH;aRAv@}m~~s0BZ2 zp$(Sqm~g0(F0l8{Lm=OI61P6Jg<8f$nnKC8IIdpT4B_D|$#6UxN`|wZjB9CR7s%^x zj*f>Kl95={038<xda<<YFZj6@5}-Q&^dw<{Z1g>oJIT+>R7xjvM}-p2`V|j<43tis z(Hbs0F4_<yiAVQ2Bm$=ej9gX@IiIU5ePzK{7JOyFR~D=qfv+s+3XOkwa^$JMX&n`t z79HMrMq45|g<l*{I&tKwW5Sb?6CzE`N%09451$+f99u?bkogP7SO4(jK7Dx7*A;wS z!PgahUBTBCTFAmZF&S!!G#JhgUsv#T1?Me}Z(7Jgl^@{f2RQlxj(&inu-D*w7JSbF zHjn}}@K^iVg0C$YS5Nx;5WcqHYYV=%;A;y!QquP=BqNg|4Iv6Q@wJ6EwwX^mD*7c= z^w-$j|EBpCXdi+NzLbS0;Z7-*p&NhocnEtsX!f4;po9?^Q93%T#YGV?9TW>-1B?FF zN6rcd%2*89=uq4A5wVs=U5lshoK^Lb;cdy79(I-#<av2nN%fx2;ZLofjA$;s>mx(0 z3H|ekP$JxdxDoyPxQXLqi3npb3=}~%k;!oG$75|x&DICMi8hA6s`zz|ut5q)<Bb!g zL=wqJgV77a!8;hY3YWo9O0-SEq|tV&PVU27B27`Y7mMRAV?xoUwontB*ONl6p=dY} zHaf2nHO;x7yZ39h{XC*29Bq`}O~4+7<0L3qAl~SfP*XrB@OW%;m=$ONpltbw#1lzf zhEc(|sp0tecmz^Vdy7ZiWfikKB0{Z1VD#~%ScC~5`g}^HG1(j_309X^;wGE15rmnJ ziA;$k1105^bu}oWmne#D+@wi~FvKm9xL&49@?4Q^G(y9Q46>Vp_|iaPF!##f2ySrD z@hz~-il}HbVOE#P^~qR#hPe(6k0vAF<xnC3KL1T3tOwYJT3D+LfeAiu=qUB|w~_EP zHsyGghxoCjE}V$9#T&xN>Wi0vvI(G!a6H^-+_mVkHWJ21#^{!hGS-BFO=+rRr?=(T zK|8%o4cXUdr+4MoK{>rGzYfCj?SjTwP_L!wpq%<4PY2=jc0v7+9tUx#Sso7R@G_&8 zyeCn*9pqGVmDC;N^fsYGR|iRnp}<$_m*vKm@u6gMeYhpukUSm=PV30#5QVZsK$cF7 zhoXr|vG^1QGA<rzf&e?s(6f2HBfuVwR4s`p>kn9MWOJmYaeO@15Kbh>Sb+><MR8o< zmDLZ%wOrMLU?vu(MBKZ*56}vn`!FFk4RP6eC-}D$Augs<*LQnYAlUYnuDD`_h)c(b zsVTD+$$E(7xUnaMDd>$aR->$6IDLTxh9?>*Ozzm)l8W-WI?S)}WK@_xDlaJu*45Q{ zLAOyWk)d9XgbZErULS5^+GFY1P-`n4kRf(4m_l0&s+eqq`hfMzc*Y3j#He1uS57f( zUDW5PaAGyES5;G2Qd3!1S!Kl`tDM*za<C#$SstjZ4%Ai#psLgc1GQCwn({zh87r&{ zln1FCB{h|STKujK)Kn1={sOLwUgYmG;JP55)w1{N*keG|)aljM(!(GFq4%gRw1k3c zeA8<I9E$J^MF7S-6=o;+6V`*;nm{dTM$gOGTa{D;>IV#O8J(@ACscyptgEbN1c`sF zFVsIiT8x~%W$6hjt|M5ySrb6N2thiO{u=s16;ubxsdXrTcptsQFwr{UQbU+AJXDJQ zF-)Q^tw}@?5Cl-nhC~$r4vm%t%J5bltFo5*fbt3qmGB2{U^8h3rY0DHGi8X0WKBtG zi*j9uro0T~&V~JNBMBUnGDQBdCBd3HjKiIDbcL%xuoI(G5ku6--CU;yvfHYyEUBuj zt0=dUX?=63F*c3af(czQHOE$J$a39>!LN455Fs(>2l&A{2NA`a1rO^2Z&W0XC6ZP# z$V$DizBw{UlXs-X(m4~X6q*9Z8-uXf(~Y6i7^`KzFk@BPj2(x?`NZhR3A%;D7W#q& zv93Wd3b5%8(v_jCd=Qrg*0@A7F-UZeuMJ$=cV8QbqrPH&Vt1_$6*a+<x?lw)m1TuB zRtJv~)+)S6f<tC8DOy%X0+PvmaovENBWVYzri*?i-gMc>WiSa|yvNrkT1bqSxpYJU z6U_i6NsUJN*BUOssQ|*5mM%UlE~fEYUl<%li~9H)#sxV^U|q&DiSJDagRZ1Pm<YO} zq`D>;tO=NtQ&y?zQ6wBRi`Njqxj}5gR|KdksR04h1gvfBErK^o78+<91W8z4If#;w zH9n}4kQPFBIam${#y%<sZR?030ln&2&dgm_rExcFvN{J}JH9PpY2)3>66kTHkXmZr zYdL!GG@FX*LF8xF_@MGL_crF@Xiug)k+%K=5pH)JxmxVIOS7q}t|+OhsDtV((`>S} z5T=|!N#N=MGZUFrsw*K-WauLl8Q77`$Yu6f1vAf}dq6L-m}g{oGKB;78?#C^6#`{2 z<zUm*$;~>nUPbLN7~V9r4b~A&qrn?^tQmlKK;Nj>fWSxeo0*WLt1zn;A9RI>suL__ z7tIFsph{K)Lj`q$nWU%;1+0S%3-k^%)(s^L17@SdKp2pd@`Re0E~j@~s+I9U(2HD8 zgC~frY_DP&H1DW&mDgy3*`%C`+8p9J2aH5WTOi;ytEj7lCTnSBuNBh<<_1CWs;nJE zLCqQ;R6)%*dfWwdWf=t;?`{wOS0kt^gC&)9L8vPxvl;pq*n`OtQ#f$3!Gs<cK)PIp zM~#UpCORQE@FMg3L0)su8W*4_W*#<j<uNhFAF{egc0$hJH;hIuzN<-8%dA#suN=2# zNeD7~6T(uLjbzBeG-ZNO6W4~f67Ta4>hc~y1PYUv_ZQ0!USUIG(q6NQAsVTJF8)J2 z1PUacQWD&#kF`Uq8hXrSJM+!z{YMdh2?cEJVyNP>+q)zNQ9DZFiaK2q>!eW?G-*R_ z|GI)m<glfUs*>`$U=^@rX=JaJ!v@|4K@L}wPA8@s`|5UySmT2$hx6Dbs=|iKzAA?+ z%1X*>%A{hL1PFvB6Fv|E{3{m$TvKIIiqt}`3$m>ih%?gdEV>)ymM(7$?T~MGK;$xI z5PGvjxS2u_%K;NtXh#r3nyA+WI!Rt=<C?Zu4avneognH86y<=#(D08fJ0u9jL9xZb zqJ{G}Y)h5}ClID=IpU+h+k_#Em}&01sK;O|NMMVadoPOcL&6Ypl*3hs<7AG=DvdO% zEladi47)-|q_E|E7~?fTEJ4;b_FgHhV{H(maLr(D$gsu-RSM^JL)Mh-vzztICupiV zh8pbE-gV|}ct<#IQ<F8hwig`VmhiOkuI`4k*1p$rw1%lc;Ad=n51v-V8Xr`C=C?_@ zTemf3utfJ!>$V2wMKCDFH5hyitAms#w%*$vX%<z2j7Fv^WE+XlnwYstb}O^aESdwU zRHX43>XX&|$J8gXIJHet=p|gY!Ef|R&_!Te!vEu7M=}+NHxD>;hTD@&Pr~42{b569 zN|M+P`lMCBp_#JCl$$D4%If9SF<dc&->{zvN8X}+2nnc`>8Whw=ru<LS;V@!i6_j8 z=IwYld_nJy3KwWaQ@9MOskQ9kNL8*JFcJZ6LexU|2ZQC9GfOLbt%x=-HwZ$yZZP+X zSmT2#q<Pe~yO6G}-e-4zD+t52<zRP<fnx}1k`Jbkgg_u+hv*Czp2weYJB~>ZdX)(j zZgRr1<2E8QKv6~l4&sY#%W$ij?a45=Bm@shbJWAyqpvLRkJVu528>2s8j?6-wkfwz z@q|@PW~FXZvRb&DM6tdcpmGwoc<5-X(-sh`gaiaLfmv0&H&`HaSYX0L5e<O7hN_FO zOF?mtVzO4>sWIoR&a#Ih6_Yt&Bx2Hls0;>6YC#<VYa@HDlr#`G2vV{vIG8&%y!Anq zlevx4I&k+ss>*(K#%Z1I&8H^Ia3Gl<B5(?RbADaI*2c@ac`DSu*Ru8C*{5aYGz){} z_UEk+DpSMToip^U4yM&U%GOoY)g?6*!E(9sQ>iN>Oc%h)4kZceJ#&OZbAUF%KSB** zssjE(t6?!9P%lUg!E;?vKnd4Xa)yRj6bjKW<w^&)0yTq>Y)DO0fhEn=E~rObjgtBM znJLF@J5ARj;}%Ww(ZKq{F!{~}^e}qHH5vv-^)oFF70?KQA6@Tb>P{teLA+=T83^I( zpw`9g$Rj-9N*~%GyHaLDv(C{2)XQE&0pGzU1C?3J)G^j@5w@v*&LI0_NOc_=Dl0Q~ z1Pr1nE4S#(S*jP#dE^IalhhKpnli+51<R@eLW_H?z=qV|Qfn~uu!_OlBPe6752ncG zr+eMa)v~gRefHEwIrif!YvB{Ku%2PAl2Br{9Yh$3A<JeWlM@ghT&C-W8o3AYo-Rj7 z_^|*G21~*VuQR#C1Rj%CRIe_rv{F<-4KkUGy0{o)RiFnXY}vjiUpO@3il?wWwM|+m zcWej+on^yBb2_sLET%V>>suTKy2>hYZFH370J4cGdpp%7<+WA7gwW95DxwVJ4TglO z9L!yhGS>QFN+_Oy!u7;4G+*CTOg6J4t1et#q5I4kFIHL{*;&d6d&BvC8E+eJ8`h$= zg}s%t%LY;Ps2WU9IZk52RvlEv=IP*b=pN<4eb-#9gwjzNgjFU}K3sPSnNFbDU0hFK zu4iZx+|A525bbP*W<-%DQI57q0f8dHbrI4%bfXKvOamd6ggMJmz@Fi+u8%NK(qv#2 zGD8(l&>6Emf`C!Sf{p0|G$Ll>5e(}iYG7ItRms&BW*^dX^p73<M-|#Gfy~51eO#+z zR;Hl~X*M&VfY*#3vJC`$B@oS^qYkn0;XCgV14OS-$`mhDP9SVZ)Kzxs6_W%29Yd&( z>gKv3VcBa`2`1TD>#Ee9^Hm0+lvU;O&X?talF4QZOm#_JWw07&SgkGXwbI$Z-(V<S z)r0DyXRQyed}bM!a>(Zj1ZM23?mYNOYRl?^a^n!f00Ka>!gRUGq$#9_`;i7Fu>q`a zXYxuQxge3q6~$_1-*h?1r7B5n2qf(>2`Q3YhS28W9dHt|9aUzN@+AV$dTTO)iub8u z=3V5HmD{tdH4<`MfU@5tC7CEhKlt`7Gm053x^85+;Y~8BNnPfzGP#U)P$5PM7$$(J zZ7<;_tgHBiF;d@|p{!ZZm1s$y5)HX*Fh%U5BE6Wiq^{C;S*i?@DMLC4_q~>~Tu?Ge zZGovSsRnVD2ZWaPUP-OvZ!jb^Mdu9Oz6)!8P$hNlU6-;dWXae^<upyMOoR5Sl({fE z*xQWtEvvP(DmRgx-<L7B@wQ<iTU*#`SzE)`Zf0!8FtT5z<64nwIn-h%H0If6wd_)3 zV~yb!mb+_WczQDMpBYsdskA6zC8R`^fD%*MlqCM1fxl5@GComxBmOqv*%bUA#`mO> zP!9W1pcI+DLrw8eKFM6ocg<X_bfr4=05u7j!cW4rxMr$)h$iN~qNGuj8;i1tlf0@= zhT=(U0WfU+THhLK2#*LO5v88$nF@waq8yd1f>H5UE6e5$6WN+$9H)~EX{e><V$V-t z_lbm(VLgAZQP6lwEZ)d+nj<o8d_2q_U==S#+V7<K4R<vq!VPW7$W-l>1Z4&LeGD1I zd5#F9M)WH}cOjk?Zq!n6>5q_v3oT4SD%vQr)0R{PN?GF=8)Y3lEl^UcWhJX%3_d2D z#DEDG{4tGO|It0+=2JbNnU>S69xyFos$ZNEO1h2|*;J#J%9!wn>xU@m?#bbB>%`bT zfAa`NVrHsmyIjR&s%HduLM$FR3)$~OEj)i5VY&3T;W*=0OA!Ll8zvKS@mP{F&d3}& zA*Sb>ql&1v`&e>%op@S6qERr`m`Ia$VSx5zTuUQM%BPc=p3T{kK)x{&#r+=o3-!~G z{96AqF_LVt&?vYs%5(9JMsivcWbaB(4}nlfdU`(v{nso7{Wt99k#b9ZdHpU1rk=Q@ zS7+}@)rh>W9$~(zVg$N>^+?WprTnW$`0X%e3Rv2U@vk147BxdJSc3GCr;Z6vN=~38 z;NlZ19zHn|IF@Nj`~~Cd*G%sFSC7C#rSMnnvJC6OQ1HbgR^TG89kEukr|%hI`JXL; z=SAEzB6fS<yT1X(%x*t}3$=Q0xikT*z~0goSFA|0bTdO%zm1K3DI_xwQvc%m25fm` zU*J%IT%!2j%hVrhR7)MwD*`VSln+wBfWhqs2hLgUdwP3<dR<9|MKcz0frEj)vbu7l z#;>Tr2AMV)x`&8jqv-MmwztOjrC3M+ZLYE1DxQlG(FQDNpKn~TjWA=cjO~G8a}4jZ zttq`~bH&f&N&(>Cahu7c0_ixU9_Sn}5-+p~fzX<gvRd3nV#U_p>V-BCm&*-p5Q8&^ zVv&|Po^54?`=O6l;_x<~4qtOpX@;Mfe9kTKLnrV(jA!JXp2VJpmFXz+J<z4PQ#kB< zpuc_|Xw9d~?@IMO(Au4;;?0J-znJ?PMnw`0@i5)C5{l2rawfz7o5Y?MZlcM0WY`E< zPkawF+~Z+##<e(Hkm`G&zh<6@Z<+_1ox0^}rSE|j_Z0ohuf1<C>URVCmtTkCk&(@9 z<W4xAUu%2{FR5=koeGCfVOQnS9bw`Fz9o(j2XYH)k8pu+Y?=lE?}b)6F5cQ4ie?py zQ48c-7<uY%T1Ulv53~>kqB&lD5445|-2-h|7z+15TYwGil6h+M`vsjhIEmaPefUbR zy=LbIcauBXf(q`YB6pJQO2EDNI$_$i+uau)xH?|_>x5+&J^Suxa%gL}Z1W3+abAsN zh3o0web^n1dlG7cls!S}j%LTy=yU{~FN0T^X9R$U8ZKx3*asDB$JuZ+gPr`~MRnR? zJ8xcSJ>!NX8Gz{@E<?`oU`<&C+~B4+J(m|+2IK05rehM7m1XenT3Xp#ywD`$2k|;v z<QwH?-CpeUo(RYG4Cd61;dfJ(3;cArzR3X|P$CGv4&jZk@AyXeu^x-<JHCC#cOonX z@N>&s*rfJDuYJcisANLh=`-}`a6Pi#49|m7UPySJ@A&o|-z_cUriSC=;}M)n(#|Zv z#Enf3XBCtAg5wz!@JJs|ibbOOXZW;|&Fs`p>DUO4LX3$_i6jF&ZxLP{g(D5(t`{#G z9*>7+z><azOUIPTj*B+L;I3?<V^w5fGu?;m10yQh=HI9x>%n(?<FpNs?mND*ZE75f z85j2*-_dX)Y`E^U1B%45zTE$s$$j7P?YuA)?)bK>DhBs>aC}>;`AQw%<$O^r)jc)E z#9>>;urE5kNgwtd-;>F1h)o+AYvHb}J>gJw-45^_-`S3D##vum$2TsrtE{a<YAB0O zmx)kP>yeEY34_GTSNLtE5??qA*rqH%EJ_=B*;ra3o>0hR0+4c-d!;PiZ`l}hnK}X+ z{*5#iir3Ep<L>>gttcrguS41<3#NSUH!zFqb@RPCbPz+nk7I${6!zT!A9n-+-cjGX z?R&Q^NgI6cw(s5c!@464hG*vFP&A~w8c(DYLFOahyX}YfF*h=)Rr-(N1^$MGb>k-A zebT#K#!mX|+5JjCtlRf)``&FMlZc;Kgar|{w2W>EHEHPv`7S0a(DpUi`VomIjEznz z$lB)gy8DUiyUHt(FwwFBT2fwFhu}W8U0UoOD3$^}q}sYL6ztu$0vF-kwpR0%dbhPu z?A_trwvJ(6^ll?_rtjU3_}*;_QXLnMAe*V?kR;8SM@2aJDd`1^zj3!`8R4Aub@gsn zL%}Vtu7*R}42w3L+jOZVzpI5^Fv7Fp(|saZVtr5X+Q28DPuF;DS-)~PtYsjs{%T~s zudc2Z9s9n!nz^gXbf(*jgSE%PQ5}JcI-s0r1Y-x3X)ISsE1onUV|JKj%jS8sf9gB4 zeP_1s%%0Bul)BfFybpSCwjZi3CcO4@l;~9AJF|Ufw(rc=kAYYF&TRAWs~@WEhiXTg z+CojZ*d<VUQm8fLJF|UfHjCoM-9F^%Enu(H;@#c{o!JQTGIlu&c4k|Fi*ROJtNBWu z+1l85hcnwchJDeQjT@PKXSVOmW?6OiE@w99tgovxyR4?Rq`a&OG0`$_Htt`hWZCRG z?214oqO^tZ>pGSb8;P`W1uVM-oZlJFuZ6|MvOKxA=j*e9`8?d-(h=nFdrM(l9p7cO z)g`r6Rdl7V>Gk(L-#k!TPbae%d%njZF-Zi;N67mfLRRj8atb`%rz_+Alq9;t%1=r1 zHNFiJcBX$DBqi1+i~BdYg*D!S%miXq0zVgbtTl$qJdu68Wo$SZw?t<9LEA>ERzD{z zPuD?L<^DF*(#BGC(EVn5z_t;7QlKM)Z>8<lpgeZ%nk6D{kEbLl6HZL?#Pj>YZIFJ@ zwtpKWozp7lKn~@V^>2gpb8%Z_zj0W{Pf3E+j}|~}1Jt@O6zu1=0vF-uwpR0%`nfB) zkAHXgxvgW^7yaCozMmV0g&(xN7Y1#Ay;G8u)s|FN)FP7F;=eVbwyThG8(B%<!-k8S zdArH&O^)koc)*c(yCP6kMXvCo5|2Q3<>Swm^)#11TL$Cq&n~Y)a_`!pkfO!+XY)vI zecxek@Mq(|0N)P_wfs63pAu?eS3GIi{P>Nd<k%x?eBW~L8E1I4o+Gztf}C?S3O%*0 z{(aoU@v%fici-`KKiM3QwKX+c9~gc;X`%1zYm0{&^$=Re#|Pcn=LbH8CnbmbflnR- zpY|Dlp-q4zn{lWq9%^kCgt+KdCOJq)l__-|W$lB2C%0;8eKHhJS_`m5S-;k|h8n^n z!jocggcdRYDi}Tq`GNWOQDA!}X(4s3=NQULkit(p)IiCYNkq_dV^dH&R&9JY?=3*+ z&iHtkKM0@}2;Zdn4F>`e;fA(kWUBTG6Y{^0MZ<xLYU-g;Bf1r#d@yH)8*PnYM*=NO z3dh6IhHwD)sg<4*i#O6(>1@hrfs$GlXkAuP!BWDF2`4dL^ReidE@fJu`ILOb`VSV{ zdQ{mGruxMh!6;7%MRCY7Ym*RTI5`|{ofvBhC!2w1PM0Iv;-N&S2^Yob=sY<RO~fX* zAu};e27uaN2!+Cl=E&IC8Ik(tSUjR{#cHnxN~4h$94W`+liQ|5CWcOLfsc-r9fz#l zxFHrPxnomWV+qu##R1}_`eY1CDJ%@~Ka2`b3bnN)QOvV+bEIpfd^O;2GJl0qJL1H# zqsJyDD~fWcqNpnV(tqX35ame!|2>X@|D*hy^54qY%3S3t<=r8NE9;aSl)ozXDCa2O zRlctrgZ9gn3gyqr{V3m}^ea1*RXD!)XTX@V^AqJilzGbI%8nsJl-?l+DWBqv20(Lo zdhh$FZG`e$Wt?(?GD`Uke)QVST5^9X2jm^fO7wA+vO(FdyoY;Uf~=26BD|s=t+ps{ zD_<z@;Q!Ui=gQ3}{VrPnvGQv?i7A&OW8Nx7RXPFrq;ft2F^<7=8YBOo`ukhFGZ|qU zlkoR<o_eX*=Ku9Eu=ilV=X0OW_a18Wd$Ol6;Pbi9=X;8_@~rm)^#XM^e)#XT#wY(f zVa3OXP8mKu`1IiOgD($!dEl>?zP_MyfiDkqOnkldgA3v5&L{);y;dCxr(_17w!{6s z34cFh`m;_6>`j!e#Lt)bk-w2v_h;Vow3<<@KPf<Ds0B66$}{Q^1+S2!oxhgG;|zXS zF+HN<&a57!Sv^!2{p?2-*#9U>zvLnB77bJeYChE)=(04OQd6v_G>9&=_#yuGs{^d2 zE_~jBpO0BjsCHFZi0^tmmewrY+KD&p{bqxqchbNSYO%e*pYZNmJ4aQ~us*{N?-<p< zD%1P+2_DgFV!x>WgmM0tPmqRCnx_HQ2i|8(U&Kdgyq4V=)Ity{o5MbQrn%&ZpmJlH zReYqu@}V6-4O(92;2f0I$Uml)6sv(A^O|2^e>rBTm7RR_G-BR;ZB*<Jm1GS{ctX|g zu*^P3FuI0va}Wx;p?|m5pD`GKo@!5clWFx3RtXK0a~f602}OHRe8GUGrf80>MD?Q9 zyjdo8!vOAA57e7AI>a8z(V)FU5A~|EXILLO|J%#nl@TrHH%nJI(-{5W@D>#CK8YjY zsFsdj!-^<t`hea22*<jp(a}#bMwc^GDNTYXWOQcI=b1>32$+A@x@EG!fW{^Cn0hWS zk#%hJS!V(F!3`)cs1Ks5kFqFG?*(s0PJPq~LKH`1&QA5~1nS-=MOmUgj9O`!ZvE1+ zChwaz=~*P<f;O>R;x`Uvr-~QUhk)o0U67|wDG44cIrIZg7e?j)sB9=3I;Syxh<rNJ zj5zc@P|ZsPf75b6{{QyQ?bni`io=^kjJNpaga57xzR1hq9ZZN(V@4;Mhz}%k7?G&> zfQiv$fB^$uxDCq8$eDB7XSeHHzgl(a-Fu%o4#EQ~GrhaJx@y(B*XpY3b^b8DZofYm z%KzvPm!G|8P+q9BRWbTTG!plZx!Yb@|A?9a=xw9t(9Rr;(HPaYyP2NHyv%vnH<DDb z;NMOVvfZTlWm_0`J%&&Ymnc1PDPG8wxsNJS=P1Jre2`z`m$cRnSM}^W72{{D>}A4% z+jaq14z%!m`h55^_oP-td-Ys&WRD*$V`B(X%><%}y?{|zfIpf1XgxJHRXlGMBz{&z zQ$_+>&JmP(F6pz-K{JCQH9nb44E`^ogX03WC!}G;kRMM%7N=M{U?rZDDx#>0$j(h7 z=z$uG0aA8vOd}{3tNihdK$_A4=Vb~@srn#-pmHOyYkI#l&igrYX$}3zi;oq@J5#kr zcpwM6e7LSI_22^P_xjWY<%5$!XQ#taByLC<nt0#ZQU^w^%5Y&1$)_ezDc}~dXB`Z| z4_lzoelka3<6S6+km&J`>!9s_AU8muW75IWxq3UUs>i(z)b^`D*5534lN<wPBU=C` z8%~?k>wA~SJGbYA8BwRnl5#j7#70}-eYbkKH(hLEKQ+K(@D4)bFifeD74=MQ!*8L! z@Kk(_3aiz%=@l!z+6{_hx0QtpJr8!%gD;I9sC#(SBnfT2i!x%!6+y_lT#sZ@3+}=* z)b*Ni^#3`J{iOB7>(qayuh}n5LF)9c@$JV|qE{yB{-f0^^$}95b=B@@e}@r{22u|k zC#q!3<vF)?kUXuLEJn>9cQy5-zz~NiQZeQr+iCCW^mX20_e1ObeM74%Mkp`XO;KEj zVI)yrx~dB*O~33?vge%3sa$SmuS2E9cxp=AcpmBvQjMcGDutC}m}nzBOcdfBpT=5M z5~rSZx6$_@;^%l#+HBjOHfM{3N`vll1kvAx`w0tnVyy!@=}~FqzT{5}j4y7nwg)c! z1t@@>qIU{vI*HC(T{lMYjuQ}K2B*{$em$;RLw`p-m+jT5@<&B#xOQS;LJu@>28)pa zTmEV!!0)g-AOw^`xo{U@vmtV|x?Xi4Tx&(Qu|nfqgbedxe@3{YGN9`v#cJq<haU>n z^o+3w*=y5x7j}?5GD-Zu-m7a=>}V)$^aNCQ&MJsOUH!4U3-92?hr|c*JNU3#-P^|p zN9<SDxd;#ko3taO4Gv%w)9RscDxpFh%NnExW!o7OI)JB!6G^Ri#e<z+#8q_}qNm%v zqOah-KmF9|_HWJ2n+6%^Npq+4!5ECHos4Xy0d$I1t79*}Keu1d>ASdY_kWq*vERpS zc44!+(GB2w#xygn9-j^F?^$g^s0SPHUogl-&Gd3}2J2u)`K>~ghElNuJ<z@J6J<kH z%-}XQ=51E5&LF>MRjM;70vJ!CSvoVm$F^DOIlkLarTbOF0vDrc-ys#3!S$XQq~cx( zssoiF<lS(*w=q5lx7uOJ<pnTy@U3T9Pg$wH1awJ`GMnDcbxpJYfv?Xb$t(69JFd;j zC5z=}w@f1*pVfa*J<j%*@dJ;T1>Z4oVh~tAn)t60;>3E%JDr4HojrSFLcRok=tayI z|Jv@+A0VI;|MYuT#wDPK)0s7AV5Zqn?cM3v@ZmMcixsM#5vy5|S({A{(*`fo)<IBI ztBxUrFLDQ@aI#I{QBUsyTMmn5mBz<+4UUg(vdMF%3d{<^yX}PWfz@L9(5IU8W_09! z<IHA8y|p7bhED$GV&&E@+*GWhC=eLEpv)a^SAQ^8aK-`YY@o=CX(q0WZSEiFq5F1Q z5oB8MB%~x|!qrF>f)FI!LPYfv&kFj-HNdWjQ==mgu$9(Ysi%&)$7s|7_F6R_6(Gy- z?ioF+367t*q7~W#TU5QLPujaoo2Fc3BpvDvM*$6ATkx#t_LMO*P1ivJ9cuKb)#K5A zp!cMQuAFk{Ct4VTY?{sqBwpMtJXmo7f%8{_ittF^WN`cuq+LMXPLM}N#pG)Ncnrw# z2~{Vwco=c*yeMczrq|G_Wa5Yz>NWS0T3{`nMk|ywy(0Pz6L$)85nL&R_mBwy7CZz5 z_qZ<Wua#4*$tX}mwc)RPUn4Q@8;v~EOjP(wu|nm9w!O1FG-p5<AECUExgQwx0Y)F# z!JIYj8<I3>so2Wg@WJ$`6&`io>`kkPLq%t87_d8r83J;+adoS{CUoYDNc-<`WFU3Z z7qITy-BUx%P2Y@lkV_OV)|!AugT3toCj6r!ji~s`f}+7+eWT8u@${~7UOd>WZrfv8 zio3Kt_G<!brh3IO`SfGc|08DsEq>vX8{zGNbHhqsu>;uWlX3OyL$~bfI59!qHE;Yd zLmkk-n03KVxgBkM8wl8Qpe=$0Wout?HVz40afB}aY{z*gIY^`#oISHJz)r?Rn@Z!# ze+&)I9L`L=X6dEa6r;3<C8Yuwp88~#gZNFG*8-V#;BFNjpz-h~){<05qk35-BDi2a zOI3NvQ}AF_?dqEY@4!&O307(Ut<{ltP#wyN5sTIENSa^^KXxTn@Wd?}6D@6?cTj~$ zsR3w)NQH8B2fD3|YrnOEmV_iaD%0^&t;R5VqUN^-TEozx(nA}IcPb=wLS6(uk8~;; zDue1kXLMO{rPrQL<gk}OluATtGmR>1P9mNKP|hPs(h9Md+Po0^m;ulelkB=kHyj+I z!`F%zYu62l)<{^bVrNQauaN6068D2}&V_jSJiIOd!4)mxJP3>;s%UDGHN>7IkA0ye zsG+@VS&YSlmuYNU-Zz}-1gaeW5WM`n<Q5qG&MI<U5!UT}(dHzAQc%BxG#+z=wLI1- z;Km(1K>j^FjHwAdstaw+5pa!k^zMr8qm~g>W3Q)u^WXbJD%jk)EEpnts%8X>2OdLP z0~&P|_R?1b-MA1vaqgw4w<!V}qT3VK#Eorpm~3eR_ph-Ix|qokLY(WHOE^xsFqse@ zuT}|%r`9+q4pouI0|ftjkN1rA28Dk$vAksGKiM&#<=Iu<zpEpaLp$D=?lZtb1m`yl zbYGQqGLK)a#*rPe67)kVbn1deD`3aHDVF#2io$5yLqjq2K6zC13=^R5h#h4VQmA{@ z$FyP(3};wj<Bc1he4NH)F`o8gU*TJ%kianGJkz`7vGrNTO()6q4X)V!6sy>VU6Yfc zCSoBF?+HN4#+bymeF5GEaKt7uHq)1kJiGOOJn<VSW~Im<fF=#kKo5u3cwq?H9VId{ zTDY4)6tMrP>F@SSWZTaK-8GSYh913xv(=})CtJjH%sWF1LI4GEVfBWJtd?$L@B~k; zLFwt~hW++^;;qk%30u#b$<~ELABfn$4UCs{mKS;ps3ao#fa?-!*SQ>w1}qv^`#msl z20fVJPB(UR!ZXYcFI~6#)=L7GX0N>!_R|a}UDQNvvA=UrpKa7Z16x+9SBEaF1an4O z9=d@OY(d?*GG&Ctamz4rT3;W~XgSko4Jd#iYFggj$>aV2y39u)#J<A1@g&0Li=pU2 zn~njr$p3<2VA$)|1ZD&<OtIaubVy6|+WyD57M9~3hiyCQu%@;H5L$>Isoq=@P9nb+ z%j*<68s(w7-Q%O8tQDR&8hWT;Mv6}i2f||gH)3#nXRFUqVs}s{cjfJyf0^7AC0-<k z55%rQnrj0BIZ{t={JaU?YFV-067c9&q-p#RpW>My@?5@CEe5(!KNM<PjG-wYX=0Fa z01LV#G|Iv=$mlKUiOu?H@cWycH4kVP4ed}Rp^Y>|sN|0V&Cyni0c~f&y$<Uu(^m_m zS!Y$I>L;k``z%$W+mKS%a%mlLRQ@Z|BgNBHQgI*}rX|NROq-3!v7mMIrM)8z<x_o! z0|+HeEL^>1wZAtji%GS4`McKsiCNu#d<EWR?-2oOaA5uR4E7TXWt#qwoqMxjh~gG0 zcYTayON-$TE<;ZD_N*r<g0!&2$5m9W7swVps->6Td2na3&t8RMEp_N|=(R(jRPs~! zAD9TH`@8B}Mo2|37xV;ZxF=aLW?ZHl?-Vv)*o!JeFT9nF8Y@`^-$r7}-K>{dTBSF( z60D%?Vg^#5Xqux}yTAzt*z^v#*eP}AdiR<=yJ^RZGaBEpGVoY>_PW9O(X9SutuE`2 zI+grLe&o0C@r}jhNAa|uw4bz}w4d-C=?~H$q(4Z1kp4iPF#Tcr!}N#g57Qr}Kg1K} zc#z}4M>igPh1q0Z;e4&E+GVaQpI-0t`(&;wV@X*T(F!iBo-D?&)YEf{1(>p9j5RgZ z*R*OoZf@wdKd@veNc}zs7C6*gt9I5oodJbyFIutFs?4UW`o;<iYxR!n){2ss(iaCk zRHB9_fX!T2l8N}VE#csw&g}C+j%dZm({9%T437kHwUXMy@lqtwxIDT_EMfvm71hXh zRF+b$+{S7yE8A@TC<|@sSQy5_9A(-mk-4r|e!Pg`nd{1Yj{J|bj}=>#3GWt~$@Axi z_$_l?F$%<{8@XKg=KJC@*A))4+8z!mJY4L{4P9fer45h%FC1;`9}-v9vL!>}L)>_x zy%}r`H#4UqB3Rm-fQo0XtB!MuFc?Z&&~RYa(rDkt$mTTXbc{`PH|Ua2EuWo*WM~7d zkfmUF!zk*jHt}YzD^p-ep|Dv($Xr*bP*X*5C39Up@Vv^C##TNj%v@LI42#KSuB+yx zoh6y;N?|cxr*q5QWt%;yHB_XAnd_=K?{MM-0GG<}1^36zxO)>GiT~GofoarG<WYpz z$xxxt(jN7$()Q&DX!jkXdhGNEg$Lk6%=5&Un7OVN*}ht3uB+Lm=>t=|r5spGIg(<c z(>+?eUilj?AD7L)g51tZRXt&6Ghu;aLKb~D#dO2X8NS<4hl#WR7jH4W8c=Z=T<@8I z5ch(n4pbKJN6T=$x6F0LvR3B0`nVT3GuM?*0BI7)EHfMy%PMW*HFI6fKR&I_IdfgP z%J^rTn)@b7i%?5JW9GUNPx^7T4)ZXpSsEF}GS}7k_Mwn}k$Ke&GuPE~W_GM`XRa$_ z0vR_l*OmDaK7#MQac+^nW?0&$3cVD^qCNGr!kM|QOr83PhcW+-vRG(ID05w*PMPaU zlT_O4G7p8&rG6x9yOQR?Qytofr8t-g!%8#Pl`$c6U6uWrnd_=f4`U#i>#Ds=WUecX z+vZ7eyUa~yt}7ox7@NvlX6CxeTvsv<k8%k#h)KpMC39W*WW8PlGS}6xO;J;QC0fl~ zSDEW7b6v%vR(`wJf>ExLAIXo8?pwyxx3sskx3ss+B@v!5{XzPJ^atq=(jUkZraw%7 znEo*RVfw@Lhj_vq4?aobLFT%${ekUI{%CU%E9QNEpUidDmO{smn=;qce3dwKY1pr= zy=&*w`01KfQiqCTg}VEVO+ArO2j%4OTu*jZ`)xF8<DFlnYSD5>OCAR3-WFIFk6nF% zO6IyUrob@dR5uMsOu<8KHSQi)`HaF{+g|0L7?_v4?;++qr-izj!vhJV6QaEUsl9nw zdWFkeS7j%7sJz6Pxvu(;<=PkON~Wam=`z=q*&}MxIeM9A@c@G(P^HXurTyV8mq=q_ zOZe3CdCfV=ABU|eS=1Eetgd;iU+(yeu0>Q~<w%2%8|;5|sRwo~=bO2%7Wo+L5#M`O z#&w9bvxq2)Dm-eEZmGTEIsR8tC^)FM%ylJ|6*nRZ$Xr(sJg@Pj>0{=)G7s80*35O) zyq0^R%yqT(meUQoT(;SRIu@%)4KvqOgo*9Uh?lvpG@xCQ4>A75n3%b)b_8sh>#Cb= zVfz2Tj4pFs*?Z60oHlRs&3Q)zF5_wro%_snWxAuhWBgU|)#}<zuQJ!w$GyOqxvp$R zBl7m!a6q7efoHBOXGIsU?pTY-Tvx6#nd?d^>K7)V2sarecdo8vt}B~HfJ?*-I~lkb ztCm7|&$>MT4l57~Mr`#<89^)a`THY$@vgtRq(!ZWXe1{&z+Rk`^B2JAB7CLlDjFJ{ z<>7Q{@S$kxD7qgQ^Z`a6*uk7N(<_Rr$QGyA>Y-_MFg<D&j=EUlO{<u>u1wrYG|QrA z=DPBAip+JzYE7M8s{TStLT&GY%xv^AZIK7}9d0~xU9HW$@U7wCY}Ze{&s<lbE3tSe z&5GfIbFXEY>q_={Keon#%aK|0EjwqfD>u2#l)0`l*A*tTdV0EHzx@nT=DLzEHh+uT zC4SCaS02YOHf63WH=Fg8xvpd!_N!5tm}HDnGS`(&<P&zlqRe&Gy--EmR$|)Bb(OiU tGS^isYUQ_cpQLZ+LhAYLaBw2^KlMLz38X(re~`HZ@Ps)Yd^F?1e*t7qem(#I diff --git a/pom.xml b/pom.xml index c7c427669..0e04afef9 100644 --- a/pom.xml +++ b/pom.xml @@ -1,178 +1,240 @@ <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - - <groupId>com.unfold</groupId> - <artifactId>goose-fork</artifactId> - <version>2.1.25</version> - - <packaging>jar</packaging> - - <name>Goose - Unfold Fork</name> - - <distributionManagement> - <repository> - <id>unfold-release</id> - <name>Unfold Nexus Release Repository</name> - <url>http://nexus.unfold.com:8081/nexus/content/repositories/releases</url> - </repository> - <snapshotRepository> - <id>unfold-snapshot</id> - <name>Unfold Nexus Snapshot Repository</name> - <url>http://nexus.unfold.com:8081/nexus/content/repositories/snapshots</url> - </snapshotRepository> - </distributionManagement> - - <properties> - <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - <maven.compiler.source>1.5</maven.compiler.source> - <maven.compiler.target>1.5</maven.compiler.target> - </properties> - - <dependencies> - <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - <version>4.8.1</version> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - <version>1.7.5</version> - </dependency> - - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-log4j12</artifactId> - <version>1.7.5</version> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>org.jsoup</groupId> - <artifactId>jsoup</artifactId> - <version>1.7.2</version> - </dependency> - - <dependency> - <groupId>commons-io</groupId> - <artifactId>commons-io</artifactId> - <version>2.2</version> - </dependency> - - <dependency> - <groupId>org.scala-lang</groupId> - <artifactId>scala-compiler</artifactId> - <version>2.9.2</version> - </dependency> - - <dependency> - <groupId>org.scala-lang</groupId> - <artifactId>scala-library</artifactId> - <version>2.9.2</version> - </dependency> - - <dependency> - <groupId>org.apache.httpcomponents</groupId> - <artifactId>httpclient</artifactId> - <version>4.3.1</version> - </dependency> - - <dependency> - <groupId>commons-lang</groupId> - <artifactId>commons-lang</artifactId> - <version>2.6</version> - </dependency> - - <dependency> - <groupId>com.googlecode.juniversalchardet</groupId> - <artifactId>juniversalchardet</artifactId> - <version>1.0.3</version> - </dependency> - - </dependencies> - - <!-- Hey... since we're open source, let's compile the source and javadocs into jars as well --> - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <version>2.6</version> - <configuration> - <useFile>false</useFile> - <disableXmlReport>false</disableXmlReport> - <includes> - <include>**/*Test.*</include> - </includes> - <excludes> - <exclude>**/*IT.*</exclude> - </excludes> - </configuration> - </plugin> - <plugin> - <groupId>org.scala-tools</groupId> - <artifactId>maven-scala-plugin</artifactId> - <version>2.14.3</version> - <configuration> - <charset>UTF-8</charset> - <jvmArgs> - <jvmArg>-Xmx1024m</jvmArg> - </jvmArgs> - </configuration> - <executions> - <execution> - <id>compile</id> - <goals> - <goal>compile</goal> - </goals> - <phase>compile</phase> - </execution> - <execution> - <id>test-compile</id> - <goals> - <goal>testCompile</goal> - </goals> - <phase>test-compile</phase> - </execution> - <execution> - <phase>process-resources</phase> - <goals> - <goal>compile</goal> - </goals> - </execution> - - </executions> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-source-plugin</artifactId> - <version>2.1.2</version> - <executions> - <execution> - <id>attach-sources</id> - <goals> - <goal>jar</goal> - </goals> - </execution> - </executions> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-javadoc-plugin</artifactId> - <version>2.8</version> - <executions> - <execution> - <id>attach-javadocs</id> - <goals> - <goal>jar</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>com.syncthemall</groupId> + <artifactId>goose</artifactId> + <packaging>jar</packaging> + <version>2.1.25</version> + <name>goose</name> + <inceptionYear>2010</inceptionYear> + <url>https://github.com/vanduynslagerp/goose</url> + <description> + Html Content / Article Extractor in Scala - open sourced from Gravity Labs - http://gravity.com + </description> + <licenses> + <license> + <name>Apache License 2.0</name> + <distribution>repo</distribution> + <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url> + </license> + </licenses> + <scm> + <connection>scm:git:git@github.com:vanduynslagerp/goose.git</connection> + <developerConnection>scm:git:git@github.com:vanduynslagerp/goose.git</developerConnection> + <url>https://github.com/vanduynslagerp/goose</url> + </scm> + <developers> + <developer> + <id>jiminoc</id> + <name>Jim Plush</name> + <organization>Gravity Labs</organization> + <organizationUrl>http://www.gravity.com/GravityLabs</organizationUrl> + <url>http://jimplush.com</url> + </developer> + <developer> + <id>erraggy</id> + <name>Robbie Coleman</name> + <organization>Gravity Labs</organization> + <organizationUrl>http://www.gravity.com/GravityLabs</organizationUrl> + <url>http://robbie.robnrob.com/</url> + </developer> + </developers> + <dependencies> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <version>1.7.6</version> + </dependency> + <dependency> + <groupId>org.jsoup</groupId> + <artifactId>jsoup</artifactId> + <version>1.7.3</version> + </dependency> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>2.4</version> + </dependency> + <dependency> + <groupId>org.scala-lang</groupId> + <artifactId>scala-library</artifactId> + <version>2.10.4</version> + </dependency> + <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpclient</artifactId> + <version>4.3.3</version> + </dependency> + <dependency> + <groupId>commons-lang</groupId> + <artifactId>commons-lang</artifactId> + <version>2.6</version> + </dependency> + <dependency> + <groupId>com.googlecode.juniversalchardet</groupId> + <artifactId>juniversalchardet</artifactId> + <version>1.0.3</version> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>4.11</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + <version>1.7.6</version> + <scope>test</scope> + </dependency> + </dependencies> + <build> + <defaultGoal>package</defaultGoal> + <finalName>${project.artifactId}-${project.version}</finalName> + <sourceDirectory>${basedir}/src/main/scala</sourceDirectory> + <testSourceDirectory>${basedir}/src/test/scala</testSourceDirectory> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <version>2.4</version> + <configuration> + <archive> + <manifest> + <addClasspath>true</addClasspath> + <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries> + <addDefaultImplementationEntries>true</addDefaultImplementationEntries> + </manifest> + </archive> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.1</version> + <configuration> + <encoding>${project.build.sourceEncoding}</encoding> + <source>${source.version}</source> + <target>${source.version}</target> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-resources-plugin</artifactId> + <version>2.6</version> + <configuration> + <encoding>${project.build.sourceEncoding}</encoding> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-source-plugin</artifactId> + <version>2.2.1</version> + <executions> + <execution> + <id>attach-sources</id> + <goals> + <goal>jar</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-release-plugin</artifactId> + <version>2.4.2</version> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-deploy-plugin</artifactId> + <version>2.8.1</version> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-javadoc-plugin</artifactId> + <version>2.9.1</version> + <executions> + <execution> + <id>attach-javadocs</id> + <goals> + <goal>jar</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-gpg-plugin</artifactId> + <version>1.4</version> + <executions> + <execution> + <id>sign-artifacts</id> + <phase>verify</phase> + <goals> + <goal>sign</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <version>2.17</version> + <configuration> + <useFile>false</useFile> + <disableXmlReport>false</disableXmlReport> + <includes> + <include>**/*Test.*</include> + </includes> + <excludes> + <exclude>**/*IT.*</exclude> + </excludes> + </configuration> + </plugin> + <plugin> + <groupId>org.scala-tools</groupId> + <artifactId>maven-scala-plugin</artifactId> + <version>2.15.2</version> + <configuration> + <charset>UTF-8</charset> + <jvmArgs> + <jvmArg>-Xmx1024m</jvmArg> + </jvmArgs> + </configuration> + <executions> + <execution> + <id>compile</id> + <goals> + <goal>compile</goal> + </goals> + <phase>compile</phase> + </execution> + <execution> + <id>test-compile</id> + <goals> + <goal>testCompile</goal> + </goals> + <phase>test-compile</phase> + </execution> + <execution> + <phase>process-resources</phase> + <goals> + <goal>compile</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> + <distributionManagement> + <repository> + <id>nexus-releases</id> + <name>Nexus Release Repository</name> + <url>http://oss.sonatype.org/service/local/staging/deploy/maven2/</url> + </repository> + </distributionManagement> + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <source.version>1.7</source.version> + </properties> </project> diff --git a/project/Build.scala b/project/Build.scala deleted file mode 100644 index 558cfab9c..000000000 --- a/project/Build.scala +++ /dev/null @@ -1,23 +0,0 @@ -import sbt._ -import Keys._ - -object Dependencies { - val Slf4jApi = "org.slf4j" % "slf4j-api" % "1.6.6" - val Slf4jLog4j12 = "org.slf4j" % "slf4j-log4j12" % "1.6.6" - val Jsoup = "org.jsoup" % "jsoup" % "1.7.2" - val CommonsIo = "commons-io" % "commons-io" % "2.0.1" - val ScalaCompiler = "org.scala-lang" % "scala-compiler" % "2.9.2" - val ScalaLibrary = "org.scala-lang" % "scala-library" % "2.9.2" - val Httpclient = "org.apache.httpcomponents" % "httpclient" % "4.2.4" - val CommonsLang = "commons-lang" % "commons-lang" % "2.6" - val Juniversalchardet = "com.googlecode.juniversalchardet" % "juniversalchardet" % "1.0.3" - -} - -object GooseBuild extends Build { - import Dependencies._ - - lazy val root = Project("goose", file("."), - settings = Defaults.defaultSettings ++ - Seq(libraryDependencies ++= Seq(Slf4jApi, Slf4jLog4j12, Jsoup, CommonsIo, ScalaCompiler, ScalaLibrary, Httpclient, CommonsLang, Juniversalchardet))) -} \ No newline at end of file diff --git a/project/build.properties b/project/build.properties deleted file mode 100644 index 21e2c5d75..000000000 --- a/project/build.properties +++ /dev/null @@ -1 +0,0 @@ -sbt.version=0.12.2 \ No newline at end of file diff --git a/project/build.sbt b/project/build.sbt deleted file mode 100644 index 53bd52a94..000000000 --- a/project/build.sbt +++ /dev/null @@ -1,3 +0,0 @@ -scalacOptions += "-deprecation" - -resolvers += Classpaths.typesafeResolver \ No newline at end of file From 9d5635ca53ad7d3a5ac1305fa1d821d1c0b24b3b Mon Sep 17 00:00:00 2001 From: vanduynslagerp <pierre.denis.vanduynslager@gmail.com> Date: Fri, 21 Mar 2014 22:43:31 -0400 Subject: [PATCH 230/347] Updated README --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 47af399be..4c87a9257 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ #Goose - Article Extractor -##Intro +[Goose](https://github.com/GravityLabs/goose) fork published on Maven Central. +##Intro Goose was originally an article extractor written in Java that has most recently (aug2011) converted to a scala project. It's mission is to take any news article or article type web page and not only extract what is the main body of the article but also all meta data and most probable image candidate. From f5c56c70b011ee900a70cc76c3bfa2ac7db34dc3 Mon Sep 17 00:00:00 2001 From: vanduynslagerp <pierre.denis.vanduynslager@gmail.com> Date: Fri, 21 Mar 2014 22:44:04 -0400 Subject: [PATCH 231/347] Fixed badlink JUnit Test --- src/test/scala/com/gravity/goose/GooseTest.scala | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/test/scala/com/gravity/goose/GooseTest.scala b/src/test/scala/com/gravity/goose/GooseTest.scala index 7235a34ef..501ed6713 100644 --- a/src/test/scala/com/gravity/goose/GooseTest.scala +++ b/src/test/scala/com/gravity/goose/GooseTest.scala @@ -2,8 +2,7 @@ package com.gravity.goose import org.junit.Test import org.junit.Assert._ -import scala.actors.Future -import scala.actors.Futures._ +import java.net.UnknownHostException /** * Created by Jim Plush @@ -16,7 +15,6 @@ class GooseTest { @Test def gooseTest() { - // implicit val config = new Configuration // val url = "http://techcrunch.com/2011/08/13/2005-zuckerberg-didnt-want-to-take-over-the-world/" // val goose = new Goose(config) @@ -40,9 +38,12 @@ class GooseTest { implicit val config = new Configuration val url = "http://nolove888.com/2011/08/13/LINKNOTEXISTS" val goose = new Goose(config) - val article = goose.extractContent(url) - assertNull(article.topNode) + try { + val article = goose.extractContent(url) + fail() + } catch { + case e: UnknownHostException => // Expected + } } - } \ No newline at end of file From 82aab5aeef20302e5a45b48fc5ed9f8f5191e16e Mon Sep 17 00:00:00 2001 From: vanduynslagerp <pierre.denis.vanduynslager@gmail.com> Date: Sat, 22 Mar 2014 00:29:08 -0400 Subject: [PATCH 232/347] Fixed a javadoc tag --- src/main/scala/com/gravity/goose/Goose.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/Goose.scala b/src/main/scala/com/gravity/goose/Goose.scala index 23f724bdb..a59e81f60 100644 --- a/src/main/scala/com/gravity/goose/Goose.scala +++ b/src/main/scala/com/gravity/goose/Goose.scala @@ -32,7 +32,7 @@ class Goose(config: Configuration = new Configuration) { /** * Main method to extract an article object from a URL, pass in a url and get back a Article - * @url The url that you want to extract + * @param url you want to extract */ def extractContent(url: String, rawHTML: String): Article = { val cc = new CrawlCandidate(config, url, rawHTML) From 1f0f5f241e1049de93f882e455524002849d5fb6 Mon Sep 17 00:00:00 2001 From: vanduynslagerp <pierre.denis.vanduynslager@gmail.com> Date: Sat, 22 Mar 2014 00:30:15 -0400 Subject: [PATCH 233/347] Moved static html under test/resources --- .../resources/com/gravity/goose/statichtml/aol1.txt | 0 .../resources/com/gravity/goose/statichtml/businessinsider1.txt | 0 .../resources/com/gravity/goose/statichtml/businessinsider2.txt | 0 .../resources/com/gravity/goose/statichtml/businessweek1.txt | 0 .../resources/com/gravity/goose/statichtml/businessweek2.txt | 0 .../resources/com/gravity/goose/statichtml/businessweek3.txt | 0 .../resources/com/gravity/goose/statichtml/cnbc1.txt | 0 .../resources/com/gravity/goose/statichtml/cnet1.txt | 0 .../resources/com/gravity/goose/statichtml/cnn1.txt | 0 .../resources/com/gravity/goose/statichtml/engadget1.txt | 0 .../resources/com/gravity/goose/statichtml/espn1.txt | 0 .../resources/com/gravity/goose/statichtml/foxnews1.txt | 0 .../resources/com/gravity/goose/statichtml/guardian1.txt | 0 .../resources/com/gravity/goose/statichtml/guardian1_result.txt | 0 .../resources/com/gravity/goose/statichtml/huffpo1.txt | 0 .../resources/com/gravity/goose/statichtml/huffpo2.txt | 0 .../resources/com/gravity/goose/statichtml/issue_24.txt | 0 .../resources/com/gravity/goose/statichtml/issue_24_result.txt | 0 .../resources/com/gravity/goose/statichtml/issue_25.txt | 0 .../resources/com/gravity/goose/statichtml/issue_28.txt | 0 .../resources/com/gravity/goose/statichtml/issue_32.txt | 0 .../resources/com/gravity/goose/statichtml/msn1.txt | 0 .../resources/com/gravity/goose/statichtml/msn1_result.txt | 0 .../resources/com/gravity/goose/statichtml/politico1.txt | 0 .../resources/com/gravity/goose/statichtml/scribd1.txt | 0 .../resources/com/gravity/goose/statichtml/techcrunch1.txt | 0 .../resources/com/gravity/goose/statichtml/time1.txt | 0 .../resources/com/gravity/goose/statichtml/time2.txt | 0 .../resources/com/gravity/goose/statichtml/usatoday1.txt | 0 .../resources/com/gravity/goose/statichtml/wired1.txt | 0 .../resources/com/gravity/goose/statichtml/wsj1.txt | 0 .../resources/com/gravity/goose/statichtml/yahoo1.txt | 0 32 files changed, 0 insertions(+), 0 deletions(-) rename src/{main => test}/resources/com/gravity/goose/statichtml/aol1.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/businessinsider1.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/businessinsider2.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/businessweek1.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/businessweek2.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/businessweek3.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/cnbc1.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/cnet1.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/cnn1.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/engadget1.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/espn1.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/foxnews1.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/guardian1.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/guardian1_result.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/huffpo1.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/huffpo2.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/issue_24.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/issue_24_result.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/issue_25.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/issue_28.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/issue_32.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/msn1.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/msn1_result.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/politico1.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/scribd1.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/techcrunch1.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/time1.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/time2.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/usatoday1.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/wired1.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/wsj1.txt (100%) rename src/{main => test}/resources/com/gravity/goose/statichtml/yahoo1.txt (100%) diff --git a/src/main/resources/com/gravity/goose/statichtml/aol1.txt b/src/test/resources/com/gravity/goose/statichtml/aol1.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/aol1.txt rename to src/test/resources/com/gravity/goose/statichtml/aol1.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/businessinsider1.txt b/src/test/resources/com/gravity/goose/statichtml/businessinsider1.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/businessinsider1.txt rename to src/test/resources/com/gravity/goose/statichtml/businessinsider1.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/businessinsider2.txt b/src/test/resources/com/gravity/goose/statichtml/businessinsider2.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/businessinsider2.txt rename to src/test/resources/com/gravity/goose/statichtml/businessinsider2.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/businessweek1.txt b/src/test/resources/com/gravity/goose/statichtml/businessweek1.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/businessweek1.txt rename to src/test/resources/com/gravity/goose/statichtml/businessweek1.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/businessweek2.txt b/src/test/resources/com/gravity/goose/statichtml/businessweek2.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/businessweek2.txt rename to src/test/resources/com/gravity/goose/statichtml/businessweek2.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/businessweek3.txt b/src/test/resources/com/gravity/goose/statichtml/businessweek3.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/businessweek3.txt rename to src/test/resources/com/gravity/goose/statichtml/businessweek3.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/cnbc1.txt b/src/test/resources/com/gravity/goose/statichtml/cnbc1.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/cnbc1.txt rename to src/test/resources/com/gravity/goose/statichtml/cnbc1.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/cnet1.txt b/src/test/resources/com/gravity/goose/statichtml/cnet1.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/cnet1.txt rename to src/test/resources/com/gravity/goose/statichtml/cnet1.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/cnn1.txt b/src/test/resources/com/gravity/goose/statichtml/cnn1.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/cnn1.txt rename to src/test/resources/com/gravity/goose/statichtml/cnn1.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/engadget1.txt b/src/test/resources/com/gravity/goose/statichtml/engadget1.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/engadget1.txt rename to src/test/resources/com/gravity/goose/statichtml/engadget1.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/espn1.txt b/src/test/resources/com/gravity/goose/statichtml/espn1.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/espn1.txt rename to src/test/resources/com/gravity/goose/statichtml/espn1.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/foxnews1.txt b/src/test/resources/com/gravity/goose/statichtml/foxnews1.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/foxnews1.txt rename to src/test/resources/com/gravity/goose/statichtml/foxnews1.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/guardian1.txt b/src/test/resources/com/gravity/goose/statichtml/guardian1.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/guardian1.txt rename to src/test/resources/com/gravity/goose/statichtml/guardian1.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/guardian1_result.txt b/src/test/resources/com/gravity/goose/statichtml/guardian1_result.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/guardian1_result.txt rename to src/test/resources/com/gravity/goose/statichtml/guardian1_result.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/huffpo1.txt b/src/test/resources/com/gravity/goose/statichtml/huffpo1.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/huffpo1.txt rename to src/test/resources/com/gravity/goose/statichtml/huffpo1.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/huffpo2.txt b/src/test/resources/com/gravity/goose/statichtml/huffpo2.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/huffpo2.txt rename to src/test/resources/com/gravity/goose/statichtml/huffpo2.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/issue_24.txt b/src/test/resources/com/gravity/goose/statichtml/issue_24.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/issue_24.txt rename to src/test/resources/com/gravity/goose/statichtml/issue_24.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/issue_24_result.txt b/src/test/resources/com/gravity/goose/statichtml/issue_24_result.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/issue_24_result.txt rename to src/test/resources/com/gravity/goose/statichtml/issue_24_result.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/issue_25.txt b/src/test/resources/com/gravity/goose/statichtml/issue_25.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/issue_25.txt rename to src/test/resources/com/gravity/goose/statichtml/issue_25.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/issue_28.txt b/src/test/resources/com/gravity/goose/statichtml/issue_28.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/issue_28.txt rename to src/test/resources/com/gravity/goose/statichtml/issue_28.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/issue_32.txt b/src/test/resources/com/gravity/goose/statichtml/issue_32.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/issue_32.txt rename to src/test/resources/com/gravity/goose/statichtml/issue_32.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/msn1.txt b/src/test/resources/com/gravity/goose/statichtml/msn1.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/msn1.txt rename to src/test/resources/com/gravity/goose/statichtml/msn1.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/msn1_result.txt b/src/test/resources/com/gravity/goose/statichtml/msn1_result.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/msn1_result.txt rename to src/test/resources/com/gravity/goose/statichtml/msn1_result.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/politico1.txt b/src/test/resources/com/gravity/goose/statichtml/politico1.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/politico1.txt rename to src/test/resources/com/gravity/goose/statichtml/politico1.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/scribd1.txt b/src/test/resources/com/gravity/goose/statichtml/scribd1.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/scribd1.txt rename to src/test/resources/com/gravity/goose/statichtml/scribd1.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/techcrunch1.txt b/src/test/resources/com/gravity/goose/statichtml/techcrunch1.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/techcrunch1.txt rename to src/test/resources/com/gravity/goose/statichtml/techcrunch1.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/time1.txt b/src/test/resources/com/gravity/goose/statichtml/time1.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/time1.txt rename to src/test/resources/com/gravity/goose/statichtml/time1.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/time2.txt b/src/test/resources/com/gravity/goose/statichtml/time2.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/time2.txt rename to src/test/resources/com/gravity/goose/statichtml/time2.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/usatoday1.txt b/src/test/resources/com/gravity/goose/statichtml/usatoday1.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/usatoday1.txt rename to src/test/resources/com/gravity/goose/statichtml/usatoday1.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/wired1.txt b/src/test/resources/com/gravity/goose/statichtml/wired1.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/wired1.txt rename to src/test/resources/com/gravity/goose/statichtml/wired1.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/wsj1.txt b/src/test/resources/com/gravity/goose/statichtml/wsj1.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/wsj1.txt rename to src/test/resources/com/gravity/goose/statichtml/wsj1.txt diff --git a/src/main/resources/com/gravity/goose/statichtml/yahoo1.txt b/src/test/resources/com/gravity/goose/statichtml/yahoo1.txt similarity index 100% rename from src/main/resources/com/gravity/goose/statichtml/yahoo1.txt rename to src/test/resources/com/gravity/goose/statichtml/yahoo1.txt From f9dd1a188a86e759267e5b5650a70625095d6119 Mon Sep 17 00:00:00 2001 From: vanduynslagerp <pierre.denis.vanduynslager@gmail.com> Date: Sat, 22 Mar 2014 00:32:25 -0400 Subject: [PATCH 234/347] pom.xml update to generate javadoc jar --- pom.xml | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/pom.xml b/pom.xml index 0e04afef9..1fb0807f7 100644 --- a/pom.xml +++ b/pom.xml @@ -149,23 +149,10 @@ <artifactId>maven-deploy-plugin</artifactId> <version>2.8.1</version> </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-javadoc-plugin</artifactId> - <version>2.9.1</version> - <executions> - <execution> - <id>attach-javadocs</id> - <goals> - <goal>jar</goal> - </goals> - </execution> - </executions> - </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-gpg-plugin</artifactId> - <version>1.4</version> + <version>1.5</version> <executions> <execution> <id>sign-artifacts</id> @@ -192,16 +179,22 @@ </configuration> </plugin> <plugin> - <groupId>org.scala-tools</groupId> - <artifactId>maven-scala-plugin</artifactId> - <version>2.15.2</version> + <groupId>net.alchim31.maven</groupId> + <artifactId>scala-maven-plugin</artifactId> + <version>3.1.6</version> <configuration> - <charset>UTF-8</charset> <jvmArgs> <jvmArg>-Xmx1024m</jvmArg> </jvmArgs> + <charset>${project.build.sourceEncoding}</charset> </configuration> <executions> + <execution> + <id>attach-javadocs</id> + <goals> + <goal>doc-jar</goal> + </goals> + </execution> <execution> <id>compile</id> <goals> From 0aa93a5d8571743e807ed86a5cc64d2eb2e788c4 Mon Sep 17 00:00:00 2001 From: vanduynslagerp <pierre.denis.vanduynslager@gmail.com> Date: Sat, 22 Mar 2014 00:58:17 -0400 Subject: [PATCH 235/347] Add image width and height --- .../com/gravity/goose/images/UpgradedImageIExtractor.scala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala index b531e7f18..b3f3d9d41 100644 --- a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala +++ b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala @@ -122,6 +122,8 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: mainImage.imageSrc = highScoreImage._1.imgSrc mainImage.imageExtractionType = "bigimage" mainImage.bytes = highScoreImage._1.bytes + mainImage.width = highScoreImage._1.width + mainImage.height = highScoreImage._1.height mainImage.confidenceScore = if (scoredImages.size > 0) (100 / scoredImages.size) else 0 mainImage.imageScore = highScoreImage._2 trace("IMAGE COMPLETE: High Score Image is: " + mainImage.imageSrc + " Score is: " + highScoreImage._2) From 97566a13dc2eb78606ecbbfbb4cce9c6bbfa1df9 Mon Sep 17 00:00:00 2001 From: vanduynslagerp <pierre.denis.vanduynslager@gmail.com> Date: Sat, 22 Mar 2014 00:58:50 -0400 Subject: [PATCH 236/347] Set stalecheck to true --- src/main/scala/com/gravity/goose/network/HtmlFetcher.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index ac1658acd..780657eba 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -285,7 +285,7 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { httpParams.setParameter("http.protocol.content-charset", "UTF-8") httpParams.setParameter("Accept", "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5") httpParams.setParameter("Cache-Control", "max-age=0") - httpParams.setParameter("http.connection.stalecheck", false) + httpParams.setParameter("http.connection.stalecheck", true) val schemeRegistry: SchemeRegistry = new SchemeRegistry schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory)) schemeRegistry.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory)) From 25cd2ecdfecf3b98e3fa56e4b6b75ca052fb579b Mon Sep 17 00:00:00 2001 From: vanduynslagerp <pierre.denis.vanduynslager@gmail.com> Date: Sat, 22 Mar 2014 00:59:06 -0400 Subject: [PATCH 237/347] minot typo --- .../scala/com/gravity/goose/extractors/ContentExtractor.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index 69b93e327..b4e6aeec9 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -739,7 +739,7 @@ trait ContentExtractor { private def debugNode(e: Element): String = { val sb: StringBuilder = new StringBuilder - sb.append("GravityScore: '") + sb.append("'GravityScore: '") sb.append(e.attr("gravityScore")) sb.append("' paraNodeCount: '") sb.append(e.attr("gravityNodes")) From fc61d2e943f190a03397c04c0b9219adb59525c1 Mon Sep 17 00:00:00 2001 From: vanduynslagerp <pierre.denis.vanduynslager@gmail.com> Date: Sat, 22 Mar 2014 01:17:30 -0400 Subject: [PATCH 238/347] Updated Maven build dependencies --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1fb0807f7..79d9ebc43 100644 --- a/pom.xml +++ b/pom.xml @@ -142,7 +142,7 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> - <version>2.4.2</version> + <version>2.5</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> From 7a11532ea32b49ad2528102e9c60f16753ebbf0c Mon Sep 17 00:00:00 2001 From: vanduynslagerp <pierre.denis.vanduynslager@gmail.com> Date: Sat, 22 Mar 2014 13:46:51 -0400 Subject: [PATCH 239/347] Add http proxy support from java prop or environment variable --- .../com/gravity/goose/network/HtmlFetcher.scala | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index 780657eba..fd451280b 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -21,6 +21,7 @@ package com.gravity.goose.network import org.apache.http.Header import org.apache.http.HeaderElement import org.apache.http.HttpEntity +import org.apache.http.HttpHost import org.apache.http.HttpVersion import org.apache.http.{HttpRequest, HttpRequestInterceptor, HttpResponse, HttpResponseInterceptor, HeaderElementIterator} import org.apache.http.client.entity.GzipDecompressingEntity @@ -30,6 +31,7 @@ import org.apache.http.client.HttpClient import org.apache.http.client.methods.HttpGet import org.apache.http.client.params.CookiePolicy import org.apache.http.client.protocol.ClientContext +import org.apache.http.conn.params.ConnRoutePNames import org.apache.http.conn.ConnectionKeepAliveStrategy import org.apache.http.conn.scheme.PlainSocketFactory import org.apache.http.conn.ssl.SSLSocketFactory @@ -44,6 +46,7 @@ import org.apache.http.entity.ContentType import java.io._ import java.net.SocketException import java.net.SocketTimeoutException +import java.net.URL import java.net.URLConnection import java.util.ArrayList import java.util.Date @@ -299,6 +302,18 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { httpClient.getParams.setParameter("http.protocol.wait-for-continue", 5000L) // timeout for how long the client waits for 100-continue before sending request body httpClient.getParams.setParameter("http.tcp.nodelay", true) + // First check proxy configured from java properties, otherwise use env var if set + if (scala.sys.props.isDefinedAt("http.proxyHost")) { + val host = scala.sys.props.getOrElse("http.proxyHost", "") + val port = scala.sys.props.getOrElse("http.proxyPort", "80").toInt + httpClient.getParams.setParameter(ConnRoutePNames.DEFAULT_PROXY, new HttpHost(host, port)) + } else if (sys.env.isDefinedAt("http_proxy")) { + val url = new URL(sys.env.getOrElse("http_proxy", "")) + val host = url.getHost + val port = url.getPort + httpClient.getParams.setParameter(ConnRoutePNames.DEFAULT_PROXY, new HttpHost(host, port)) + } + // http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientGZipContentCompression.java httpClient.asInstanceOf[AbstractHttpClient].addRequestInterceptor(new HttpRequestInterceptor() { def process( request: HttpRequest, context: HttpContext) { From 75ff3082fd4e95e4ea1d4d96e45422e5c31476e6 Mon Sep 17 00:00:00 2001 From: vanduynslagerp <pierre.denis.vanduynslager@gmail.com> Date: Sat, 22 Mar 2014 13:48:52 -0400 Subject: [PATCH 240/347] Minor typos. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4c87a9257..43f6f2d58 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ ##Intro -Goose was originally an article extractor written in Java that has most recently (aug2011) converted to a scala project. It's mission is to take any news article or article type web page and not only extract what is the main body of the article but also all meta data and most probable image candidate. +Goose was originally an article extractor written in Java that has most recently (aug2011) converted to a Scala project. It's mission is to take any news article or article type web page and not only extract what is the main body of the article but also all meta data and most probable image candidate. The extraction goal is to try and get the purest extraction from the beginning of the article for servicing flipboard/pulse type applications that need to show the first snippet of a web article along with an image. @@ -44,7 +44,7 @@ To use goose from the command line: MAVEN_OPTS="-Xms256m -Xmx2000m"; mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="http://techcrunch.com/2011/05/13/native-apps-or-web-apps-particle-code-wants-you-to-do-both/" -e -q > ~/Desktop/gooseresult.txt -##Regarding the port from JAVA to Scala +##Regarding the port from Java to Scala Here are some of the reasons for the port to Scala: From f84b75416312fcd7fedcb662980671c1230d597f Mon Sep 17 00:00:00 2001 From: vanduynslagerp <pierre.denis.vanduynslager@gmail.com> Date: Sat, 22 Mar 2014 13:55:52 -0400 Subject: [PATCH 241/347] Fixed spelling error --- .../gravity/goose/extractors/ContentExtractor.scala | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index b4e6aeec9..8744c4b01 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -108,21 +108,21 @@ trait ContentExtractor { * @return */ def doTitleSplits(title: String, splitter: StringSplitter): String = { - var largetTextLen: Int = 0 - var largeTextIndex: Int = 0 + var largestTextLen: Int = 0 + var largestTextIndex: Int = 0 val titlePieces: Array[String] = splitter.split(title) var i: Int = 0 while (i < titlePieces.length) { val current: String = titlePieces(i) - if (current.length > largetTextLen) { - largetTextLen = current.length - largeTextIndex = i + if (current.length > largestTextLen) { + largestTextLen = current.length + largestTextIndex = i } i += 1 } - TITLE_REPLACEMENTS.replaceAll(titlePieces(largeTextIndex)).trim + TITLE_REPLACEMENTS.replaceAll(titlePieces(largestTextIndex)).trim } private def getMetaContent(doc: Document, metaName: String): String = { From c6c25f6f5af57f260ef1157315abc7c3ceb9bfab Mon Sep 17 00:00:00 2001 From: vanduynslagerp <pierre.denis.vanduynslager@gmail.com> Date: Sat, 22 Mar 2014 14:01:38 -0400 Subject: [PATCH 242/347] Escalate exception in Image extraction + formatting --- .../scala/com/gravity/goose/Crawler.scala | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index 799ce6283..3c35159ac 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -18,15 +18,15 @@ package com.gravity.goose -import cleaners.{StandardDocumentCleaner, DocumentCleaner} +import cleaners.{ StandardDocumentCleaner, DocumentCleaner } import extractors.ContentExtractor -import images.{Image, UpgradedImageIExtractor, ImageExtractor} +import images.{ Image, UpgradedImageIExtractor, ImageExtractor } import org.apache.http.client.HttpClient -import org.jsoup.nodes.{Document, Element} +import org.jsoup.nodes.{ Document, Element } import org.jsoup.Jsoup import java.io.File -import utils.{ParsingCandidate, URLHelper, Logging} -import com.gravity.goose.outputformatters.{StandardOutputFormatter, OutputFormatter} +import utils.{ ParsingCandidate, URLHelper, Logging } +import com.gravity.goose.outputformatters.{ StandardOutputFormatter, OutputFormatter } /** * Created by Jim Plush @@ -91,7 +91,8 @@ class Crawler(config: Configuration) { } } catch { case e: Exception => { - warn(e, e.toString) + warn(e, e.getMessage) + throw e } } } @@ -121,7 +122,6 @@ class Crawler(config: Configuration) { } } - def getImageExtractor(article: Article): ImageExtractor = { val httpClient: HttpClient = config.getHtmlFetcher.getHttpClient new UpgradedImageIExtractor(httpClient, article, config) @@ -152,9 +152,9 @@ class Crawler(config: Configuration) { } /** - * cleans up any temp files we have laying around like temp images - * removes any image in the temp dir that starts with the linkhash of the url we just parsed - */ + * cleans up any temp files we have laying around like temp images + * removes any image in the temp dir that starts with the linkhash of the url we just parsed + */ def releaseResources(article: Article) { trace(logPrefix + "STARTING TO RELEASE ALL RESOURCES") From de60c3c73a0dc3233563ee7dd53c6005ef939656 Mon Sep 17 00:00:00 2001 From: Francois Dang Ngoc <francois.dangngoc@gmail.com> Date: Sat, 22 Mar 2014 16:08:12 -0400 Subject: [PATCH 243/347] Updated README --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 47af399be..fc83669c9 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ +``` +Small fork to use Scala 2.10.3 instead of 2.9.0-1 +``` + #Goose - Article Extractor ##Intro @@ -55,4 +59,4 @@ Here are some of the reasons for the port to Scala: ##Issues It was a pretty fast Java to Scala port so lots of the nicities of the Scala language aren't in the codebase yet, but those will come over the coming months as we re-write alot of the internal methods to be more Scalesque. -We made sure it was still nice and operable from Java as well so if you're using goose from java you still should be able to use it with a few changes to the method signatures. \ No newline at end of file +We made sure it was still nice and operable from Java as well so if you're using goose from java you still should be able to use it with a few changes to the method signatures. From 9fcafc33365560eeefc28eef8c2a930bd307f4b0 Mon Sep 17 00:00:00 2001 From: Robby Pond <robert.w.pond@gmail.com> Date: Wed, 2 Apr 2014 22:08:07 -0400 Subject: [PATCH 244/347] update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 615c5c5c9..a7718a6a8 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ target/ /goose.iml /goose.ipr /goose.iws +.idea \ No newline at end of file From 33169aebbd0c950a9ece57983386291e0fd7e3b0 Mon Sep 17 00:00:00 2001 From: Robby Pond <robert.w.pond@gmail.com> Date: Wed, 2 Apr 2014 22:26:06 -0400 Subject: [PATCH 245/347] add opengraph tags --- .../scala/com/gravity/goose/Article.scala | 6 +++ .../com/gravity/goose/Configuration.scala | 8 ++- .../scala/com/gravity/goose/Crawler.scala | 1 + .../extractors/OpenGraphDataExtractor.scala | 50 +++++++++++++++++++ .../goose/opengraph/OpenGraphData.scala | 29 +++++++++++ .../com/gravity/goose/OpenGraphTest.scala | 32 ++++++++++++ 6 files changed, 125 insertions(+), 1 deletion(-) create mode 100644 src/main/scala/com/gravity/goose/extractors/OpenGraphDataExtractor.scala create mode 100644 src/main/scala/com/gravity/goose/opengraph/OpenGraphData.scala create mode 100644 src/test/scala/com/gravity/goose/OpenGraphTest.scala diff --git a/src/main/scala/com/gravity/goose/Article.scala b/src/main/scala/com/gravity/goose/Article.scala index 40b4dadcd..6e0bddaa2 100644 --- a/src/main/scala/com/gravity/goose/Article.scala +++ b/src/main/scala/com/gravity/goose/Article.scala @@ -22,6 +22,7 @@ import images.Image import org.jsoup.nodes.{Element, Document} import java.util.Date import scala.collection._ +import com.gravity.goose.opengraph.OpenGraphData /** * Created by Jim Plush @@ -122,4 +123,9 @@ class Article { * @return a {@link Map Map<String,String>} of property name to property vaue (represented as a {@link String}. */ var additionalData: Map[String, String] = Map.empty + + /** + * Facebook Open Graph data that that is found in Article Meta tags + */ + var openGraphData: OpenGraphData = null } \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index 20ce4653a..ca64a1b4d 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -22,7 +22,7 @@ import network.{HtmlFetcher, AbstractHtmlFetcher} import org.jsoup.nodes.Element import java.util.Date import reflect.BeanProperty -import com.gravity.goose.extractors.{StandardContentExtractor, ContentExtractor, AdditionalDataExtractor, PublishDateExtractor} +import com.gravity.goose.extractors._ /** @@ -115,6 +115,12 @@ class Configuration { this.additionalDataExtractor = extractor } + var openGraphDataExtractor: OpenGraphDataExtractor = new OpenGraphDataExtractor + + def getOpenGraphDataExtractor: OpenGraphDataExtractor = { + openGraphDataExtractor + } + var htmlFetcher: AbstractHtmlFetcher = HtmlFetcher def setHtmlFetcher(fetcher: AbstractHtmlFetcher) { diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index 4f3b32344..4ac3a9c16 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -67,6 +67,7 @@ class Crawler(config: Configuration) { article.metaKeywords = extractor.getMetaKeywords(article) article.canonicalLink = extractor.getCanonicalLink(article) article.tags = extractor.extractTags(article) + article.openGraphData = config.getOpenGraphDataExtractor.extract(doc) // before we do any calcs on the body itself let's clean up the document article.doc = docCleaner.clean(article) diff --git a/src/main/scala/com/gravity/goose/extractors/OpenGraphDataExtractor.scala b/src/main/scala/com/gravity/goose/extractors/OpenGraphDataExtractor.scala new file mode 100644 index 000000000..77b8dc7e1 --- /dev/null +++ b/src/main/scala/com/gravity/goose/extractors/OpenGraphDataExtractor.scala @@ -0,0 +1,50 @@ +/** +Copyright [2014] Robby Pond + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ +package com.gravity.goose.extractors + +import org.jsoup.nodes.Element + +import scala.collection.JavaConversions._ +import com.gravity.goose.opengraph.OpenGraphData + +class OpenGraphDataExtractor extends Extractor[OpenGraphData] { + + def extract(rootElement: Element): OpenGraphData = { + val openGraphData: OpenGraphData = new OpenGraphData + val elements : scala.collection.mutable.Buffer[Element] = rootElement.select("meta") + for(el <- elements) { + if(el.attr("property") == "og:title") + openGraphData.title = el.attr("content") + if(el.attr("property") == "og:site_name") + openGraphData.siteName = el.attr("content") + if(el.attr("property") == "og:url") + openGraphData.url = el.attr("content") + if(el.attr("property") == "og:description") + openGraphData.description = el.attr("content") + if(el.attr("property") == "og:image") + openGraphData.image = el.attr("content") + if(el.attr("property") == "og:type") + openGraphData.ogType = el.attr("content") + if(el.attr("property") == "og:locale") + openGraphData.locale = el.attr("content") + if(el.attr("property") == "article:author") + openGraphData.author = el.attr("content") + if(el.attr("property") == "article:publisher") + openGraphData.publisher = el.attr("content") + } + openGraphData + } +} \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/opengraph/OpenGraphData.scala b/src/main/scala/com/gravity/goose/opengraph/OpenGraphData.scala new file mode 100644 index 000000000..0e9d8cfe6 --- /dev/null +++ b/src/main/scala/com/gravity/goose/opengraph/OpenGraphData.scala @@ -0,0 +1,29 @@ +/** +Copyright [2014] Robby Pond + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + */ +package com.gravity.goose.opengraph; + +class OpenGraphData { + + var title: String = "" + var siteName: String = "" + var url: String = "" + var description: String = "" + var image: String = "" + var ogType: String = "" + var locale: String = "en_US" + var author: String = "" + var publisher: String = "" +} diff --git a/src/test/scala/com/gravity/goose/OpenGraphTest.scala b/src/test/scala/com/gravity/goose/OpenGraphTest.scala new file mode 100644 index 000000000..9fe20250e --- /dev/null +++ b/src/test/scala/com/gravity/goose/OpenGraphTest.scala @@ -0,0 +1,32 @@ +package com.gravity.goose + +import org.junit.Test +import org.junit.Assert._ + +class OpenGraphTest { + + @Test + def openGraph() { + implicit val config = TestUtils.NO_IMAGE_CONFIG + // og tags for http://www.telegraph.co.uk/foodanddrink/foodanddrinknews/8808120/Worlds-hottest-chilli-contest-leaves-two-in-hospital.html + /* +<meta property="og:title" content="World's hottest chilli contest leaves two in hospital - Telegraph" /> +<meta property="og:url" content="http://www.telegraph.co.uk/foodanddrink/foodanddrinknews/8808120/Worlds-hottest-chilli-contest-leaves-two-in-hospital.html" /> + +<meta property="og:image" content="http://i.telegraph.co.uk/multimedia/archive/02018/Kismot-Killer_2018476a.jpg" /> +<meta property="og:type" content="article" /> + */ + val url: String = "http://www.telegraph.co.uk/foodanddrink/foodanddrinknews/8808120/Worlds-hottest-chilli-contest-leaves-two-in-hospital.html" + val article = TestUtils.getArticle(url) + assertEquals("og:description was not as expected!", article.openGraphData.description, + "A 'world's hottest chilli' competition at a curry restaurant left two people in hospital.") + assertEquals("og:title was not as expected!", article.openGraphData.title, + "World's hottest chilli contest leaves two in hospital - Telegraph") + assertEquals("og:url was not as expected!", article.openGraphData.url, + "http://www.telegraph.co.uk/foodanddrink/foodanddrinknews/8808120/Worlds-hottest-chilli-contest-leaves-two-in-hospital.html") + assertEquals("og:image was not as expected!", article.openGraphData.image, + "http://i.telegraph.co.uk/multimedia/archive/02018/Kismot-Killer_2018476a.jpg") + assertEquals("og:type was not as expected!", article.openGraphData.ogType, + "article") + } +} \ No newline at end of file From 9defe03a5dde04650617f36b1404ba7f718c49e7 Mon Sep 17 00:00:00 2001 From: maojianxin <maojianxin@umeng.com> Date: Fri, 11 Apr 2014 16:07:10 +0800 Subject: [PATCH 246/347] add sbt support --- .gitignore | 29 ++++++++ autorelease | 74 +++++++++++++++++++ build.sbt | 59 +++++++++++++++ gen-idea | 3 + mkrelease | 3 + project/plugins.sbt | 12 +++ .../com/gravity/goose/ArticletSpec.scala | 19 +++++ .../scala/com/gravity/goose/GooseSpec.scala | 30 ++++++++ .../{goose => goose_junit}/ArticleTest.scala | 0 .../GoldSitesTestIT.scala | 0 .../{goose => goose_junit}/GooseTest.scala | 0 .../PerformanceTester.scala | 0 .../{goose => goose_junit}/TestUtils.scala | 0 .../TextExtractions.scala | 0 .../extractors/VoicesContentExtractor.scala | 0 .../images/ImageUtilsIT.scala | 0 .../text/HashUtilsTest.scala | 0 .../utils/FileHelperTest.scala | 0 .../utils/URLHelperTest.scala | 0 19 files changed, 229 insertions(+) create mode 100755 autorelease create mode 100644 build.sbt create mode 100755 gen-idea create mode 100755 mkrelease create mode 100644 project/plugins.sbt create mode 100644 src/test/scala/com/gravity/goose/ArticletSpec.scala create mode 100644 src/test/scala/com/gravity/goose/GooseSpec.scala rename src/test/scala/com/gravity/{goose => goose_junit}/ArticleTest.scala (100%) rename src/test/scala/com/gravity/{goose => goose_junit}/GoldSitesTestIT.scala (100%) rename src/test/scala/com/gravity/{goose => goose_junit}/GooseTest.scala (100%) rename src/test/scala/com/gravity/{goose => goose_junit}/PerformanceTester.scala (100%) rename src/test/scala/com/gravity/{goose => goose_junit}/TestUtils.scala (100%) rename src/test/scala/com/gravity/{goose => goose_junit}/TextExtractions.scala (100%) rename src/test/scala/com/gravity/{goose => goose_junit}/extractors/VoicesContentExtractor.scala (100%) rename src/test/scala/com/gravity/{goose => goose_junit}/images/ImageUtilsIT.scala (100%) rename src/test/scala/com/gravity/{goose => goose_junit}/text/HashUtilsTest.scala (100%) rename src/test/scala/com/gravity/{goose => goose_junit}/utils/FileHelperTest.scala (100%) rename src/test/scala/com/gravity/{goose => goose_junit}/utils/URLHelperTest.scala (100%) diff --git a/.gitignore b/.gitignore index 615c5c5c9..78c9f6336 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,32 @@ target/ /goose.iml /goose.ipr /goose.iws +config/development.scala +config/production.scala +config/test.scala +target/ +log/ +perf/run_ab +dist/ +project/boot/ +project/plugins/project/ +project/plugins/src_managed/ +*.log +*.tmproj +lib_managed/ +*.swp +*.iml +*~ +*# +.#* +.idea +.DS_Store +pmip/ +.history +.cache +.classpath +.project +Capfile.* +geoip-db/ +config/consumer.properties +release/ diff --git a/autorelease b/autorelease new file mode 100755 index 000000000..d0c46e00f --- /dev/null +++ b/autorelease @@ -0,0 +1,74 @@ +#!/bin/bash + +name="Capfile" +deploy_dir="deploy" +group=ad3 +tmp_file="$deploy_dir/$name.tmp" +conf_file="$deploy_dir/$name.conf" + +function createCap(){ + details=`awk -F ":" -v g=$group '$1==g {print $2}' $conf_file` + echo $details + IFS=, + ary=($details) + #count=${#ary[@]} + user=${ary[0]} + adminuser=${ary[1]} + port=${ary[2]} + hosts=${ary[3]} + ahost=${ary[@]:3:100} + IFS= + hosts=`echo $ahost|sed 's/ /,/g'` + + + echo "use group : "$group + echo "user: "$group + echo "admin_runner : "$adminuser + echo "port : "$port + echo "hosts : "$hosts + cp $tmp_file $group_file + sed -i "s/##USER##/$user/g" $group_file + sed -i "s/##ADMIN_RUNNER##/$adminuser/g" $group_file + sed -i "s/##PORT##/$port/g" $group_file + sed -i "s/##HOSTS##/$hosts/g" $group_file +} + +function createRelease(){ + + cd release + git pull origin master + + git rm ./*.jar + git rm config/* + git rm scripts/* + + cd .. + sbt clean update package-dist + cd release + + git status + git add . + git commit -m "make release" + git push origin master + + cd .. +} + + +if [ $# = 0 ] ; then + echo "Usage : ./deploy.sh group1 group2.." +else + for i in "$@" + do + if [ "$i" == "tmp" ] || [ "$i" == "conf" ]; then + echo "Group name can not be tmp or conf" + else + group=$i + #group_file="$deploy_dir/$name.$group" + group_file="$name" + createCap $i + #createRelease $i + cap -f $group_file deploy + fi + done +fi diff --git a/build.sbt b/build.sbt new file mode 100644 index 000000000..3d0420ddd --- /dev/null +++ b/build.sbt @@ -0,0 +1,59 @@ +import com.twitter.sbt._ +import AssemblyKeys._ + +seq(StandardProject.newSettings: _*) + + + +name := "goose" + +version := "2.1.22" + +organization := "com.gravity.goose" + +scalaVersion := "2.10.1" + +testFrameworks += TestFrameworks.ScalaTest + +testOptions in Test += Tests.Argument("-oF") + +seq(assemblySettings: _*) + +resolvers ++= Seq( + "sonatype snapshots" at "https://oss.sonatype.org/content/repositories/snapshots", + "central mvn repo" at "http://repo1.maven.org/", + "Oracle Maven 2 Repository" at "http://download.oracle.com/maven", + "JBoss Maven 2 Repository" at "http://repository.jboss.com/maven2" + ) + +credentials += Credentials(Path.userHome / ".ivy2" / ".credentials") + +libraryDependencies ++= { + Seq( + "net.liftweb" % "lift-json_2.10" % "2.5", + "log4j" % "log4j" % "1.2.14", + "org.slf4j" % "slf4j-nop" % "1.6.4", + "org.scalatest" %% "scalatest" % "1.9.1" % "test", + "com.typesafe" % "config" % "1.0.2", + "org.scala-lang" % "scala-reflect" % "2.10.0", + "com.jsuereth" %% "scala-arm" % "1.2" , + "org.specs2" %% "specs2" % "1.13", + "junit" % "junit" % "4.8.1" % "test", + "org.slf4j" % "slf4j-api" % "1.6.1", + "org.slf4j" % "slf4j-log4j12" % "1.6.1" % "test", + "org.jsoup" % "jsoup" % "1.5.2", + "commons-io" % "commons-io" % "2.0.1", + "org.scala-lang" % "scala-compiler" % "2.9.0-1", + "org.scala-lang" % "scala-library" % "2.9.0-1", + "org.apache.httpcomponents" % "httpclient" % "4.1.2", + "commons-lang" % "commons-lang" % "2.6" + ) +} + + +packageDistDir <<= (baseDirectory, packageDistName) { (b, n) => b / "release" } + +parallelExecution in Test := false + + + diff --git a/gen-idea b/gen-idea new file mode 100755 index 000000000..cfc279e7b --- /dev/null +++ b/gen-idea @@ -0,0 +1,3 @@ +#!/bin/bash + +sbt 'gen-idea no-classifiers' diff --git a/mkrelease b/mkrelease new file mode 100755 index 000000000..db0691fdc --- /dev/null +++ b/mkrelease @@ -0,0 +1,3 @@ +#!/bin/bash +rm release/*.jar +sbt clean update package-dist diff --git a/project/plugins.sbt b/project/plugins.sbt new file mode 100644 index 000000000..ca340cc84 --- /dev/null +++ b/project/plugins.sbt @@ -0,0 +1,12 @@ +resolvers ++= Seq("snapshots" at "http://scala-tools.org/repo-snapshots", + "releases" at "http://scala-tools.org/repo-releases", + "umeng.com snapshots" at "http://122.11.52.227:8088/nexus/content/repositories/snapshots", + "umeng.com releases" at "http://122.11.52.227:8088/nexus/content/repositories/releases", + "Oracle Maven 2 Repository" at "http://download.oracle.com/maven", + "JBoss Maven 2 Repository" at "http://repository.jboss.com/maven2", + "Sonatype snapshots" at "http://oss.sonatype.org/content/repositories/snapshots/" + ) + +addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.9.0") + +addSbtPlugin("com.twitter" % "sbt-package-dist" % "1.1.0-SNAPSHOT") diff --git a/src/test/scala/com/gravity/goose/ArticletSpec.scala b/src/test/scala/com/gravity/goose/ArticletSpec.scala new file mode 100644 index 000000000..f295d0f12 --- /dev/null +++ b/src/test/scala/com/gravity/goose/ArticletSpec.scala @@ -0,0 +1,19 @@ +/** + * Copyright (c) 2013 by Stone Gao + */ +package com.gravity.goose + +import org.scalatest.FunSpec +import org.scalatest.matchers.MustMatchers._ +import java.io.File + +class ArticleSpec extends FunSpec { + + describe("send test") { + it("should be true") { + val a = new Article() + + true must be(a.isInstanceOf[Article]) + } + } +} diff --git a/src/test/scala/com/gravity/goose/GooseSpec.scala b/src/test/scala/com/gravity/goose/GooseSpec.scala new file mode 100644 index 000000000..0a03af8a7 --- /dev/null +++ b/src/test/scala/com/gravity/goose/GooseSpec.scala @@ -0,0 +1,30 @@ +package com.gravity.goose + +import org.scalatest.FunSpec +import org.scalatest.matchers.MustMatchers._ +import java.io.File + + +/** + * Created with IntelliJ IDEA. + * User: maojianxin + * Date: 4/11/14 + * Time: 12:34 PM + * To change this template use File | Settings | File Templates. + */ +class GooseSpec extends FunSpec { + + describe("send test") { + it("should be true") { + implicit val config = new Configuration + //val url = "http://sports.sina.com.cn/l/2014-04-11/10467114164.shtml" + val url = "http://en.wiktionary.org/wiki/goose" + val goose = new Goose(config) + val article = goose.extractContent(url) + println(article.title) + + Thread.sleep(2000) + true must be(true) + } + } +} diff --git a/src/test/scala/com/gravity/goose/ArticleTest.scala b/src/test/scala/com/gravity/goose_junit/ArticleTest.scala similarity index 100% rename from src/test/scala/com/gravity/goose/ArticleTest.scala rename to src/test/scala/com/gravity/goose_junit/ArticleTest.scala diff --git a/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala b/src/test/scala/com/gravity/goose_junit/GoldSitesTestIT.scala similarity index 100% rename from src/test/scala/com/gravity/goose/GoldSitesTestIT.scala rename to src/test/scala/com/gravity/goose_junit/GoldSitesTestIT.scala diff --git a/src/test/scala/com/gravity/goose/GooseTest.scala b/src/test/scala/com/gravity/goose_junit/GooseTest.scala similarity index 100% rename from src/test/scala/com/gravity/goose/GooseTest.scala rename to src/test/scala/com/gravity/goose_junit/GooseTest.scala diff --git a/src/test/scala/com/gravity/goose/PerformanceTester.scala b/src/test/scala/com/gravity/goose_junit/PerformanceTester.scala similarity index 100% rename from src/test/scala/com/gravity/goose/PerformanceTester.scala rename to src/test/scala/com/gravity/goose_junit/PerformanceTester.scala diff --git a/src/test/scala/com/gravity/goose/TestUtils.scala b/src/test/scala/com/gravity/goose_junit/TestUtils.scala similarity index 100% rename from src/test/scala/com/gravity/goose/TestUtils.scala rename to src/test/scala/com/gravity/goose_junit/TestUtils.scala diff --git a/src/test/scala/com/gravity/goose/TextExtractions.scala b/src/test/scala/com/gravity/goose_junit/TextExtractions.scala similarity index 100% rename from src/test/scala/com/gravity/goose/TextExtractions.scala rename to src/test/scala/com/gravity/goose_junit/TextExtractions.scala diff --git a/src/test/scala/com/gravity/goose/extractors/VoicesContentExtractor.scala b/src/test/scala/com/gravity/goose_junit/extractors/VoicesContentExtractor.scala similarity index 100% rename from src/test/scala/com/gravity/goose/extractors/VoicesContentExtractor.scala rename to src/test/scala/com/gravity/goose_junit/extractors/VoicesContentExtractor.scala diff --git a/src/test/scala/com/gravity/goose/images/ImageUtilsIT.scala b/src/test/scala/com/gravity/goose_junit/images/ImageUtilsIT.scala similarity index 100% rename from src/test/scala/com/gravity/goose/images/ImageUtilsIT.scala rename to src/test/scala/com/gravity/goose_junit/images/ImageUtilsIT.scala diff --git a/src/test/scala/com/gravity/goose/text/HashUtilsTest.scala b/src/test/scala/com/gravity/goose_junit/text/HashUtilsTest.scala similarity index 100% rename from src/test/scala/com/gravity/goose/text/HashUtilsTest.scala rename to src/test/scala/com/gravity/goose_junit/text/HashUtilsTest.scala diff --git a/src/test/scala/com/gravity/goose/utils/FileHelperTest.scala b/src/test/scala/com/gravity/goose_junit/utils/FileHelperTest.scala similarity index 100% rename from src/test/scala/com/gravity/goose/utils/FileHelperTest.scala rename to src/test/scala/com/gravity/goose_junit/utils/FileHelperTest.scala diff --git a/src/test/scala/com/gravity/goose/utils/URLHelperTest.scala b/src/test/scala/com/gravity/goose_junit/utils/URLHelperTest.scala similarity index 100% rename from src/test/scala/com/gravity/goose/utils/URLHelperTest.scala rename to src/test/scala/com/gravity/goose_junit/utils/URLHelperTest.scala From 9536f8af6b160991a8085f66856d46792bd98073 Mon Sep 17 00:00:00 2001 From: maojianxin <maojianxin@umeng.com> Date: Mon, 14 Apr 2014 18:49:47 +0800 Subject: [PATCH 247/347] update pom: scala version and junit dir --- .settings/org.eclipse.core.resources.prefs | 6 ++++ .settings/org.eclipse.jdt.core.prefs | 5 ++++ .settings/org.eclipse.m2e.core.prefs | 4 +++ pom.xml | 9 ++++-- project/plugins.sbt | 2 ++ src/main/scala/test-classes/akka.conf | 1 + src/main/scala/test-classes/log4j.properties | 28 +++++++++++++++++ .../scala/com/gravity/goose/AicaiTest.scala | 27 +++++++++++++++++ .../{goose_junit => goose}/ArticleTest.scala | 0 .../com/gravity/goose/ArticletSpec.scala | 19 ------------ .../GoldSitesTestIT.scala | 0 .../scala/com/gravity/goose/GooseSpec.scala | 30 ------------------- .../{goose_junit => goose}/GooseTest.scala | 1 + .../PerformanceTester.scala | 0 .../{goose_junit => goose}/TestUtils.scala | 1 + .../TextExtractions.scala | 0 .../extractors/VoicesContentExtractor.scala | 0 .../images/ImageUtilsIT.scala | 0 .../text/HashUtilsTest.scala | 0 .../utils/FileHelperTest.scala | 0 .../utils/URLHelperTest.scala | 0 21 files changed, 82 insertions(+), 51 deletions(-) create mode 100644 .settings/org.eclipse.core.resources.prefs create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 .settings/org.eclipse.m2e.core.prefs create mode 100644 src/main/scala/test-classes/akka.conf create mode 100644 src/main/scala/test-classes/log4j.properties create mode 100644 src/test/scala/com/gravity/goose/AicaiTest.scala rename src/test/scala/com/gravity/{goose_junit => goose}/ArticleTest.scala (100%) delete mode 100644 src/test/scala/com/gravity/goose/ArticletSpec.scala rename src/test/scala/com/gravity/{goose_junit => goose}/GoldSitesTestIT.scala (100%) delete mode 100644 src/test/scala/com/gravity/goose/GooseSpec.scala rename src/test/scala/com/gravity/{goose_junit => goose}/GooseTest.scala (88%) rename src/test/scala/com/gravity/{goose_junit => goose}/PerformanceTester.scala (100%) rename src/test/scala/com/gravity/{goose_junit => goose}/TestUtils.scala (99%) rename src/test/scala/com/gravity/{goose_junit => goose}/TextExtractions.scala (100%) rename src/test/scala/com/gravity/{goose_junit => goose}/extractors/VoicesContentExtractor.scala (100%) rename src/test/scala/com/gravity/{goose_junit => goose}/images/ImageUtilsIT.scala (100%) rename src/test/scala/com/gravity/{goose_junit => goose}/text/HashUtilsTest.scala (100%) rename src/test/scala/com/gravity/{goose_junit => goose}/utils/FileHelperTest.scala (100%) rename src/test/scala/com/gravity/{goose_junit => goose}/utils/URLHelperTest.scala (100%) diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 000000000..29abf9995 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,6 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding//src/test/java=UTF-8 +encoding//src/test/resources=UTF-8 +encoding/<project>=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 000000000..abec6ca38 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,5 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.5 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 000000000..f897a7f1c --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/pom.xml b/pom.xml index 9fef84cba..345b11191 100644 --- a/pom.xml +++ b/pom.xml @@ -46,14 +46,14 @@ <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-compiler</artifactId> - <version>2.9.0-1</version> + <version>2.10.1</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> - <version>2.9.0-1</version> + <version>2.10.1</version> </dependency> <dependency> @@ -71,7 +71,12 @@ <!-- Hey... since we're open source, let's compile the source and javadocs into jars as well --> + <build> + <directory>${project.basedir}/src/main/scala</directory> + <outputDirectory>${project.basedir}/target/scala-2.10/classes</outputDirectory> + <testOutputDirectory>${project.basedir}/target/scala-2.10/test-classes</testOutputDirectory> + <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> diff --git a/project/plugins.sbt b/project/plugins.sbt index ca340cc84..0ace14d69 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -10,3 +10,5 @@ resolvers ++= Seq("snapshots" at "http://scala-tools.org/repo-snapshots", addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.9.0") addSbtPlugin("com.twitter" % "sbt-package-dist" % "1.1.0-SNAPSHOT") + +addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.1.2") diff --git a/src/main/scala/test-classes/akka.conf b/src/main/scala/test-classes/akka.conf new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/src/main/scala/test-classes/akka.conf @@ -0,0 +1 @@ + diff --git a/src/main/scala/test-classes/log4j.properties b/src/main/scala/test-classes/log4j.properties new file mode 100644 index 000000000..38435e33f --- /dev/null +++ b/src/main/scala/test-classes/log4j.properties @@ -0,0 +1,28 @@ +# ***** Set root logger level to WARN and its two appenders to stdout and R. +log4j.rootLogger=trace, stdout + +# ***** stdout is set to be a ConsoleAppender. +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.trace.encoding=UTF-8 +# ***** stdout uses PatternLayout. +#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +## ***** Pattern to output the caller's file name and line number. +#log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n + +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%p %c - %m%n + +# if you want to see the thread names uncomment this line out +#log4j.appender.stdout.layout.ConversionPattern=%p %t %c - %m%n + + + +#set httpclient debug levels +log4j.logger.org.apache.component=ERROR,stdout +log4j.logger.org.apache.http.wire=ERROR,stdout +log4j.logger.org.apache.commons.httpclient=ERROR,stdout +log4j.logger.org.apache.http.client.protocol=ERROR,stdout +log4j.logger.org.apache.http=ERROR,stdout + + +log4j.logger.net.sf.jmimemagic=WARN diff --git a/src/test/scala/com/gravity/goose/AicaiTest.scala b/src/test/scala/com/gravity/goose/AicaiTest.scala new file mode 100644 index 000000000..bb919b373 --- /dev/null +++ b/src/test/scala/com/gravity/goose/AicaiTest.scala @@ -0,0 +1,27 @@ +package com.gravity.goose + +import org.junit.Test +import org.junit.Assert._ +import com.gravity.goose.extractors.VoicesContentExtractor + +/** + * Created by Jim Plush + * User: jim + * Date: 8/16/11 + * This class hits live websites and is only run manually, not part of the tests lifecycle + */ +class AicaiTest { + + @Test + def testArticleElementedArticle() { // to verify issue #56 is resolved + implicit val config = TestUtils.NO_IMAGE_CONFIG + //val url = "http://www.csdn.net/article/2014-04-14/2819287-what-supercell-did-next" + val url = "http://sports.sina.com.cn/g/laliga/2014-04-14/11447118806.shtml" + + val goose = new Goose(config) + + val article = goose.extractContent(url) + + println(article.cleanedArticleText) + } +} \ No newline at end of file diff --git a/src/test/scala/com/gravity/goose_junit/ArticleTest.scala b/src/test/scala/com/gravity/goose/ArticleTest.scala similarity index 100% rename from src/test/scala/com/gravity/goose_junit/ArticleTest.scala rename to src/test/scala/com/gravity/goose/ArticleTest.scala diff --git a/src/test/scala/com/gravity/goose/ArticletSpec.scala b/src/test/scala/com/gravity/goose/ArticletSpec.scala deleted file mode 100644 index f295d0f12..000000000 --- a/src/test/scala/com/gravity/goose/ArticletSpec.scala +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright (c) 2013 by Stone Gao - */ -package com.gravity.goose - -import org.scalatest.FunSpec -import org.scalatest.matchers.MustMatchers._ -import java.io.File - -class ArticleSpec extends FunSpec { - - describe("send test") { - it("should be true") { - val a = new Article() - - true must be(a.isInstanceOf[Article]) - } - } -} diff --git a/src/test/scala/com/gravity/goose_junit/GoldSitesTestIT.scala b/src/test/scala/com/gravity/goose/GoldSitesTestIT.scala similarity index 100% rename from src/test/scala/com/gravity/goose_junit/GoldSitesTestIT.scala rename to src/test/scala/com/gravity/goose/GoldSitesTestIT.scala diff --git a/src/test/scala/com/gravity/goose/GooseSpec.scala b/src/test/scala/com/gravity/goose/GooseSpec.scala deleted file mode 100644 index 0a03af8a7..000000000 --- a/src/test/scala/com/gravity/goose/GooseSpec.scala +++ /dev/null @@ -1,30 +0,0 @@ -package com.gravity.goose - -import org.scalatest.FunSpec -import org.scalatest.matchers.MustMatchers._ -import java.io.File - - -/** - * Created with IntelliJ IDEA. - * User: maojianxin - * Date: 4/11/14 - * Time: 12:34 PM - * To change this template use File | Settings | File Templates. - */ -class GooseSpec extends FunSpec { - - describe("send test") { - it("should be true") { - implicit val config = new Configuration - //val url = "http://sports.sina.com.cn/l/2014-04-11/10467114164.shtml" - val url = "http://en.wiktionary.org/wiki/goose" - val goose = new Goose(config) - val article = goose.extractContent(url) - println(article.title) - - Thread.sleep(2000) - true must be(true) - } - } -} diff --git a/src/test/scala/com/gravity/goose_junit/GooseTest.scala b/src/test/scala/com/gravity/goose/GooseTest.scala similarity index 88% rename from src/test/scala/com/gravity/goose_junit/GooseTest.scala rename to src/test/scala/com/gravity/goose/GooseTest.scala index 7235a34ef..b98846e37 100644 --- a/src/test/scala/com/gravity/goose_junit/GooseTest.scala +++ b/src/test/scala/com/gravity/goose/GooseTest.scala @@ -39,6 +39,7 @@ class GooseTest { def badlink() { implicit val config = new Configuration val url = "http://nolove888.com/2011/08/13/LINKNOTEXISTS" + //val url = "https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html" val goose = new Goose(config) val article = goose.extractContent(url) assertNull(article.topNode) diff --git a/src/test/scala/com/gravity/goose_junit/PerformanceTester.scala b/src/test/scala/com/gravity/goose/PerformanceTester.scala similarity index 100% rename from src/test/scala/com/gravity/goose_junit/PerformanceTester.scala rename to src/test/scala/com/gravity/goose/PerformanceTester.scala diff --git a/src/test/scala/com/gravity/goose_junit/TestUtils.scala b/src/test/scala/com/gravity/goose/TestUtils.scala similarity index 99% rename from src/test/scala/com/gravity/goose_junit/TestUtils.scala rename to src/test/scala/com/gravity/goose/TestUtils.scala index 58fc1cb87..d2a1c1478 100644 --- a/src/test/scala/com/gravity/goose_junit/TestUtils.scala +++ b/src/test/scala/com/gravity/goose/TestUtils.scala @@ -19,6 +19,7 @@ object TestUtils { val articleReport = new StringBuilder("=======================::. ARTICLE REPORT .::======================\n"); val DEFAULT_CONFIG: Configuration = new Configuration + //DEFAULT_CONFIG. val NO_IMAGE_CONFIG: Configuration = new Configuration NO_IMAGE_CONFIG.enableImageFetching = false diff --git a/src/test/scala/com/gravity/goose_junit/TextExtractions.scala b/src/test/scala/com/gravity/goose/TextExtractions.scala similarity index 100% rename from src/test/scala/com/gravity/goose_junit/TextExtractions.scala rename to src/test/scala/com/gravity/goose/TextExtractions.scala diff --git a/src/test/scala/com/gravity/goose_junit/extractors/VoicesContentExtractor.scala b/src/test/scala/com/gravity/goose/extractors/VoicesContentExtractor.scala similarity index 100% rename from src/test/scala/com/gravity/goose_junit/extractors/VoicesContentExtractor.scala rename to src/test/scala/com/gravity/goose/extractors/VoicesContentExtractor.scala diff --git a/src/test/scala/com/gravity/goose_junit/images/ImageUtilsIT.scala b/src/test/scala/com/gravity/goose/images/ImageUtilsIT.scala similarity index 100% rename from src/test/scala/com/gravity/goose_junit/images/ImageUtilsIT.scala rename to src/test/scala/com/gravity/goose/images/ImageUtilsIT.scala diff --git a/src/test/scala/com/gravity/goose_junit/text/HashUtilsTest.scala b/src/test/scala/com/gravity/goose/text/HashUtilsTest.scala similarity index 100% rename from src/test/scala/com/gravity/goose_junit/text/HashUtilsTest.scala rename to src/test/scala/com/gravity/goose/text/HashUtilsTest.scala diff --git a/src/test/scala/com/gravity/goose_junit/utils/FileHelperTest.scala b/src/test/scala/com/gravity/goose/utils/FileHelperTest.scala similarity index 100% rename from src/test/scala/com/gravity/goose_junit/utils/FileHelperTest.scala rename to src/test/scala/com/gravity/goose/utils/FileHelperTest.scala diff --git a/src/test/scala/com/gravity/goose_junit/utils/URLHelperTest.scala b/src/test/scala/com/gravity/goose/utils/URLHelperTest.scala similarity index 100% rename from src/test/scala/com/gravity/goose_junit/utils/URLHelperTest.scala rename to src/test/scala/com/gravity/goose/utils/URLHelperTest.scala From cd8d323d62cd1b2f4c60e6d5a52588db8aaa9a44 Mon Sep 17 00:00:00 2001 From: maojianxin <maojianxin@umeng.com> Date: Tue, 15 Apr 2014 22:42:17 +0800 Subject: [PATCH 248/347] add chinese support. use mmseg4j --- build.sbt | 3 +- pom.xml | 5 + .../com/gravity/goose/text/stopwords-ar.txt | 162 ++++ .../com/gravity/goose/text/stopwords-da.txt | 101 ++ .../com/gravity/goose/text/stopwords-de.txt | 894 ++++++++++++++++++ .../com/gravity/goose/text/stopwords-es.txt | 310 ++++++ .../com/gravity/goose/text/stopwords-fi.txt | 68 ++ .../com/gravity/goose/text/stopwords-fr.txt | 220 +++++ .../com/gravity/goose/text/stopwords-hu.txt | 403 ++++++++ .../com/gravity/goose/text/stopwords-it.txt | 287 ++++++ .../com/gravity/goose/text/stopwords-ko.txt | 70 ++ .../com/gravity/goose/text/stopwords-nb.txt | 117 +++ .../com/gravity/goose/text/stopwords-nl.txt | 48 + .../com/gravity/goose/text/stopwords-no.txt | 120 +++ .../com/gravity/goose/text/stopwords-pl.txt | 277 ++++++ .../com/gravity/goose/text/stopwords-pt.txt | 147 +++ .../com/gravity/goose/text/stopwords-ru.txt | 421 +++++++++ .../com/gravity/goose/text/stopwords-sv.txt | 547 +++++++++++ .../com/gravity/goose/text/stopwords-zh.txt | 125 +++ .../com/gravity/goose/Configuration.scala | 16 + .../scala/com/gravity/goose/Crawler.scala | 14 +- .../goose/extractors/ContentExtractor.scala | 32 +- .../outputformatters/OutputFormatter.scala | 13 +- .../com/gravity/goose/text/StopWords.scala | 68 +- .../scala/com/gravity/goose/AicaiTest.scala | 34 +- 25 files changed, 4456 insertions(+), 46 deletions(-) create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-ar.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-da.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-de.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-es.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-fi.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-fr.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-hu.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-it.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-ko.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-nb.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-nl.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-no.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-pl.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-pt.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-ru.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-sv.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-zh.txt diff --git a/build.sbt b/build.sbt index 3d0420ddd..81f10287a 100644 --- a/build.sbt +++ b/build.sbt @@ -46,7 +46,8 @@ libraryDependencies ++= { "org.scala-lang" % "scala-compiler" % "2.9.0-1", "org.scala-lang" % "scala-library" % "2.9.0-1", "org.apache.httpcomponents" % "httpclient" % "4.1.2", - "commons-lang" % "commons-lang" % "2.6" + "commons-lang" % "commons-lang" % "2.6", + "com.chenlb.mmseg4j" % "mmseg4j-core" % "1.9.1" ) } diff --git a/pom.xml b/pom.xml index 345b11191..ead55d502 100644 --- a/pom.xml +++ b/pom.xml @@ -66,6 +66,11 @@ <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> + <dependency> + <groupId>com.chenlb.mmseg4j</groupId> + <artifactId>mmseg4j-core</artifactId> + <version>1.9.1</version> + </dependency> </dependencies> <!-- diff --git a/src/main/resources/com/gravity/goose/text/stopwords-ar.txt b/src/main/resources/com/gravity/goose/text/stopwords-ar.txt new file mode 100644 index 000000000..64e0e7160 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-ar.txt @@ -0,0 +1,162 @@ +فى +في +كل +لم +لن +له +من +هو +هي +قوة +كما +لها +منذ +وقد +ولا +نفسه +لقاء +مقابل +هناك +وقال +وكان +نهاية +وقالت +وكانت +للامم +فيه +كلم +لكن +وفي +وقف +ولم +ومن +وهو +وهي +يوم +فيها +منها +مليار +لوكالة +يكون +يمكن +مليون +حيث +اكد +الا +اما +امس +السابق +التى +التي +اكثر +ايار +ايضا +ثلاثة +الذاتي +الاخيرة +الثاني +الثانية +الذى +الذي +الان +امام +ايام +خلال +حوالى +الذين +الاول +الاولى +بين +ذلك +دون +حول +حين +الف +الى +انه +اول +ضمن +انها +جميع +الماضي +الوقت +المقبل +اليوم +ـ +ف +و +و6 +قد +لا +ما +مع +مساء +هذا +واحد +واضاف +واضافت +فان +قبل +قال +كان +لدى +نحو +هذه +وان +واكد +كانت +واوضح +مايو +ب +ا +أ +، +عشر +عدد +عدة +عشرة +عدم +عام +عاما +عن +عند +عندما +على +عليه +عليها +زيارة +سنة +سنوات +تم +ضد +بعد +بعض +اعادة +اعلنت +بسبب +حتى +اذا +احد +اثر +برس +باسم +غدا +شخصا +صباح +اطار +اربعة +اخرى +بان +اجل +غير +بشكل +حاليا +بن +به +ثم +اف +ان +او +اي +بها +صفر \ No newline at end of file diff --git a/src/main/resources/com/gravity/goose/text/stopwords-da.txt b/src/main/resources/com/gravity/goose/text/stopwords-da.txt new file mode 100644 index 000000000..e8522ef06 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-da.txt @@ -0,0 +1,101 @@ +af +alle +andet +andre +at +begge +da +de +den +denne +der +deres +det +dette +dig +din +dog +du +ej +eller +en +end +ene +eneste +enhver +et +fem +fire +flere +fleste +for +fordi +forrige +fra +få +før +god +han +hans +har +hendes +her +hun +hvad +hvem +hver +hvilken +hvis +hvor +hvordan +hvorfor +hvornår +i +ikke +ind +ingen +intet +jeg +jeres +kan +kom +kommer +lav +lidt +lille +man +mand +mange +med +meget +men +mens +mere +mig +ned +ni +nogen +noget +ny +nyt +nær +næste +næsten +og +op +otte +over +på +se +seks +ses +som +stor +store +syv +ti +til +to +tre +ud +var diff --git a/src/main/resources/com/gravity/goose/text/stopwords-de.txt b/src/main/resources/com/gravity/goose/text/stopwords-de.txt new file mode 100644 index 000000000..37e6714d3 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-de.txt @@ -0,0 +1,894 @@ +der +die +und +in +den +von +zu +mit +ist +das +des +im +für +auf +sich +dem +Die +nicht +ein +eine +als +auch +an +es +er +aus +bei +werden +sie +nach +Der +sind +war +wurde +wird +einer +Das +hat +am +wie +um +Sie +zum +oder +einen +über +dass +einem +noch +bis +nur +vor +zur +durch +so +haben +aber +ich +In +man +mehr +wir +daß +kann +sein +vom +Es +unter +Ich +hatte +gegen +Im +Er +wenn +dieser +seine +eines +können +diese +wieder +wurden +dann +was +schon +Jahr +zwei +seiner +Jahre +Jahren +ihre +gibt +zwischen +Ein +immer +waren +Zeit +Uhr +keine +Wir +sei +habe +sehr +hier +alle +Nach +ab +sowie +da +beim +heute +seit +diesem +uns +soll +Und +Deutschland +Mit +anderen +jedoch +ihr +damit +ersten +drei +Auch +doch +ihm +seinen +Stadt +etwa +sagte +ihn +Eine +sondern +bereits +müssen +ohne +Menschen +will +Prozent +ihrer +worden +Bei +selbst +jetzt +of +Als +seinem +neue +muss +allem +neuen +Ende +nun +Von +geht +ihren +SPD +So +Für +weil +wo +mich +mir +Aber +Am +Diese +ganz +dieses +etwas +andere +Geschichte +Frau +liegt +Wenn +ins +gut +einmal +konnte +Euro +du +denn +viele +Auf +machen +Herr +Leben +the +diesen +erst +lassen +Wie +dort +beiden +erste +The +Teil +deutschen +weiter +also +viel +sollte +dabei +Millionen +Was +später +hatten +während +Welt +ISBN +sagt +denen +wollen +steht +Da +kommt +kein +vier +nichts +de +allerdings +Seite +ob +dazu +gab +s +letzten +kam +USA +wegen +dies +zurück +großen +kommen +alles +rund +ja +sollen +deren +dafür +Doch +Kinder +wäre +Frage +weitere +würde +dessen +große +Januar +zwar +darauf +Arbeit + +Beispiel +September +zusammen +einige +Land +allen +fast +Frauen +März +Namen +Unternehmen +ihrem +davon +Mann +Mai +Platz +deutsche +werde +Oktober +muß +Literatur +Art +ihnen +Deutschen +fünf +gilt +sehen +könnte +Dezember +stehen +sogar +seien +Wer +Seit +August +bin +Beifall +Fall +Juni +eigenen +November +mal +Film +finden +sagen +Regierung +April +München +oft +Dies +lange +ebenfalls +bekannt +Präsident +wohl +CDU/CSU +Zu +gehört +Man +weniger +gerade +statt +aller +Juli +möchte +Weg +Entwicklung +zunächst +ging +Mark +Bild +möglich +gar +besonders +hätte +macht +Politik +geben +Tag +Ihnen +Februar +Hier +Gemeinde +wenig +gewesen +Europa +gehen +gemacht +welche +New +gegenüber +heißt +Familie +Union +tun +Jahrhundert +einfach +Frankfurt +deutlich +Dabei +neben +sollten +Kirche +keinen +Artikel +Ihre +Peter +Thema +besteht +vielen +nie +bzw. +Aus +Zeitung +wollte +Kommission +seines +Hamburg +hätten +Geld +meine +Dr +kaum +zweiten +Während +lässt +Anfang +Um +Ort +weiß +findet +Bereich +Haus +anderem +Mal + +deshalb +alten +erhalten +zehn +Zum +bisher +meisten +darüber +würden +hin +Form +An +bleibt +sieht +Gesellschaft +Berliner +Den +vergangenen +bezeichnet +Nr. +Ziel +je +weit +Grund +sechs +darf +Rolle +Deutsche +wissen +jeder +zeigt +Damit +Denn +mehrere +nächsten +Vor +Dann +schließlich +kleinen +Durch +Michael +km +Lage +Gruppe +Band +damals +Spiel +Sohn +Dr. +stark +Universität +Hilfe +besser +hinter +meist +Seine +St. +stellt +Tage +unsere +daher +Nur +wirklich +führt +Dieser +beispielsweise +kurz +Bericht +gleich +weiteren +Straße +bleiben +Wirtschaft +Siehe +Zukunft +eher +Bedeutung +Recht +insbesondere +Bevölkerung +schnell +nehmen +Verlag +CDU +Tod +Alle +solche +neu +Bundesregierung +pro +Frankreich +Jahres +konnten +Ihr +ließ +Du +kleine +Europäischen +Vater +genannt +lang +Titel +Rahmen +Wort +eigentlich +erhielt +einigen +Woche +FC +Musik +dagegen +Sein +allein +Einsatz +genau +begann +innerhalb +unserer +Partei +Polizei +Wasser +bringen +deutscher +natürlich +eigene + +Wochen +insgesamt +Außerdem +Bis +halten +politischen +musste +Parlament +Meter +Hand +Zahl +stellen +gesagt +führen +daran +Erfolg +befindet +Zur +verschiedenen +Probleme +Unter +Abgeordneten +Milliarden +nahm +stand +geworden +c +liegen +erstmals +Sprache +Fragen +nämlich +Ja +Kollegen +Männer +Nicht +Wolfgang +Problem +Mutter +Minuten +Weitere +Mitte +Mitglied +Jahrhunderts +Krieg +Hans +könnten +Thomas +Über +Personen +Friedrich +ca. +ebenso +machte +York +vielleicht +Stelle +derzeit +Ländern +Höhe +verwendet +gute +überhaupt +Länder +Angaben +führte +gegeben +Tel. +klar +Karl +europäischen +sicher +Saison +Programm +erreicht +GRÜNEN +beide +Sonntag +sowohl +Region +alte +Staaten +Paris +Beginn +Buch +zweite +ganze +hinaus +König +Morgen +handelt +fand +Schweiz +jeweils +Weise +DM +fest +per +blieb +Mitglieder +Richtung +Heute +Stunden +leicht +Leute +wobei +gehören +bietet +Wien +politische +Folge +Blick +aufgrund +Entscheidung +Dort +Neben +hält +Gebiet +gemeinsam +erklärt +direkt +könne +Daten +recht +schwer +Bayern +jeden +Name +Schule +GmbH +dürfen +laut +Seiten +Bürger +Eltern +dpa +Meinung +Werke +Jetzt +letzte +Spieler +bald +London +häufig +heutigen +Einwohner +acht +eben +Internet +Markt +dich +Nein +Situation +System +zuvor +Möglichkeit +Freitag +mein +Mannheim +Fenster +Kosten +inzwischen +kamen +John +sieben +bekommen +erreichen +unser +Verfügung +Köln +Dazu +besten +Zusammenhang +Reihe +Kritik +richtig +Liste +Herren +Augen +taz +zeigen +siehe +hohen +spielte +leben +völlig +Neue +ihres +spielt +Sicherheit +weiterhin +hoch +nachdem +gegründet +erneut +sah +z. +wer +Informationen +anders +spielen +Dieses +gleichen +Kultur +größten +eingesetzt +Unterstützung +Beim +erklärte +Allerdings +Firma +Amt +Kopf +trotz +Erst +gebracht +gestellt +läuft +schließen +Bilder +nimmt +Mitarbeiter +BÜNDNIS +Deshalb +verschiedene +zudem +Werk +Ergebnis +Heinrich +Bau +ehemaligen +Preis +Tochter +Stuttgart +Samstag +Bad +Verfahren +Kind +früher +Paul +darin +paar +Punkt +Weblinks +Nun +Maßnahmen +Österreich +Wilhelm +Herrn +z.B. +Noch +Staat +Zusammenarbeit +knapp +Nacht +einzelnen +trat +gestern +Team +Osten +scheint +Mannschaft +Tagen +internationalen +jede +mindestens +teilweise +einzige +Soldaten +setzt +gefunden +Kunst +lediglich +öffentlichen +bedeutet +Raum +gewann +Kampf +Martin +Ist +Begriff +Hause +entwickelt +Wahl +Schon +arbeiten +größte +Donnerstag +Ab +Viele +Quellen +Nachdem +dadurch +Italien +erster +gekommen +dir +Mittwoch +danach +stellte +her +zahlreiche +Landes +Gesetz +Monaten +PDS +Rat +Franz +Verein +sonst +Frankfurter +Meine +Klaus +Karriere +müsse +meiner +anderer +zuletzt +Monate +Alter +hohe +Interesse +Regie +Montag +genommen +lag +Sommer +spricht +Trainer +Liebe +jedem +/DIE +Westen +guten +Kilometer +Johann +gesehen +darunter +solchen +indem +Mittel +oben +Schweizer +wichtig +Hälfte +Regel +obwohl +Bürgermeister +Aufgabe +Spiele +folgenden +Dienstag +version +Sache +sprechen +Gemeinden +electronic +for +Norden +außerdem +Antrag +gleichzeitig +ganzen +Politiker +gehörte +großer +China +Nähe +bereit +setzte +Druck +tatsächlich +Gott +frei +Grünen +zumindest +Opfer +genug +versucht +bevor \ No newline at end of file diff --git a/src/main/resources/com/gravity/goose/text/stopwords-es.txt b/src/main/resources/com/gravity/goose/text/stopwords-es.txt new file mode 100644 index 000000000..f562e4bba --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-es.txt @@ -0,0 +1,310 @@ +de +la +que +el +en +y +a +los +del +se +las +por +un +para +con +no +una +su +al +lo +como +más +pero +sus +le +ya +o +este +sí +porque +esta +entre +cuando +muy +sin +sobre +también +me +hasta +hay +donde +quien +desde +todo +nos +durante +todos +uno +les +ni +contra +otros +ese +eso +ante +ellos +e +esto +mí +antes +algunos +qué +unos +yo +otro +otras +otra +él +tanto +esa +estos +mucho +quienes +nada +muchos +cual +poco +ella +estar +estas +algunas +algo +nosotros +mi +mis +tú +te +ti +tu +tus +ellas +nosotras +vosotros +vosotras +os +mío +mía +míos +mías +tuyo +tuya +tuyos +tuyas +suyo +suya +suyos +suyas +nuestro +nuestra +nuestros +nuestras +vuestro +vuestra +vuestros +vuestras +esos +esas +estoy +estás +está +estamos +estáis +están +esté +estés +estemos +estéis +estén +estaré +estarás +estará +estaremos +estaréis +estarán +estaría +estarías +estaríamos +estaríais +estarían +estaba +estabas +estábamos +estabais +estaban +estuve +estuviste +estuvo +estuvimos +estuvisteis +estuvieron +estuviera +estuvieras +estuviéramos +estuvierais +estuvieran +estuviese +estuvieses +estuviésemos +estuvieseis +estuviesen +estando +estado +estada +estados +estadas +estad +he +has +ha +hemos +habéis +han +haya +hayas +hayamos +hayáis +hayan +habré +habrás +habrá +habremos +habréis +habrán +habría +habrías +habríamos +habríais +habrían +había +habías +habíamos +habíais +habían +hube +hubiste +hubo +hubimos +hubisteis +hubieron +hubiera +hubieras +hubiéramos +hubierais +hubieran +hubiese +hubieses +hubiésemos +hubieseis +hubiesen +habiendo +habido +habida +habidos +habidas + +# forms of ser, to be (not including the infinitive): +soy +eres +es +somos +sois +son +sea +seas +seamos +seáis +sean +seré +serás +será +seremos +seréis +serán +sería +serías +seríamos +seríais +serían +era +eras +éramos +erais +eran +fui +fuiste +fue +fuimos +fuisteis +fueron +fuera +fueras +fuéramos +fuerais +fueran +fuese +fueses +fuésemos +fueseis +fuesen +siendo +sido +tengo +tienes +tiene +tenemos +tenéis +tienen +tenga +tengas +tengamos +tengáis +tengan +tendré +tendrás +tendrá +tendremos +tendréis +tendrán +tendría +tendrías +tendríamos +tendríais +tendrían +tenía +tenías +teníamos +teníais +tenían +tuve +tuviste +tuvo +tuvimos +tuvisteis +tuvieron +tuviera +tuvieras +tuviéramos +tuvierais +tuvieran +tuviese +tuvieses +tuviésemos +tuvieseis +tuviesen +teniendo +tenido +tenida +tenidos +tenidas +tened diff --git a/src/main/resources/com/gravity/goose/text/stopwords-fi.txt b/src/main/resources/com/gravity/goose/text/stopwords-fi.txt new file mode 100644 index 000000000..3b468b32c --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-fi.txt @@ -0,0 +1,68 @@ +alla +ansiosta +ehkä +ei +enemmän +ennen +etessa +f +haikki +he +hitaasti +hoikein +hyvin +hän +ilman +ja +jos +jälkeen +kanssa +kaukana +kenties +keskellä +kesken +koskaan +kuinkan +kukka +kylliksi +kyllä +liian +lla +lla +luona +lähellä +läpi +me +miksi +mikä +milloin +milloinkan +minä +missä +miten +nopeasti +nyt +oikea +oikealla +paljon +siellä +sinä +ssa +sta +suoraan +tai +takana +takia +tarpeeksi +te +tässä +ulkopuolella +vahemmän +vasen +vasenmalla +vastan +vielä +vieressä +vähän +yhdessä +ylös diff --git a/src/main/resources/com/gravity/goose/text/stopwords-fr.txt b/src/main/resources/com/gravity/goose/text/stopwords-fr.txt new file mode 100644 index 000000000..30e06ef28 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-fr.txt @@ -0,0 +1,220 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (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.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#----------------------------------------------------------------------- +# a couple of test stopwords to test that the words are really being +# configured from this file: +stopworda +stopwordb + +#Standard english stop words taken from Lucene's StopAnalyzer +a +an +and +are +as +at +be +but +by +for +if +in +into +is +it +no +not +of +on +or +s +such +t +that +the +their +then +there +these +they +this +to +was +will +with +au +aux +avec +ce +ces +dans +de +des +du +elle +en +et +eux +il +je +la +le +leur +lui +ma +mais +me +même +mes +moi +mon +ne +nos +notre +nous +on +ou +par +pas +pour +qu +que +qui +sa +se +ses +son +sur +ta +te +tes +toi +ton +tu +un +une +vos +votre +vous +c +d +j +l +à +m +n +s +t +y +été +étée +étées +étés +étant +suis +es +est +sommes +êtes +sont +serai +seras +sera +serons +serez +seront +serais +serait +serions +seriez +seraient +étais +était +étions +étiez +étaient +fus +fut +fûmes +fûtes +furent +sois +soit +soyons +soyez +soient +fusse +fusses +fût +fussions +fussiez +fussent +ayant +eu +eue +eues +eus +ai +as +avons +avez +ont +aurai +auras +aura +aurons +aurez +auront +aurais +aurait +aurions +auriez +auraient +avais +avait +avions +aviez +avaient +eut +eûmes +eûtes +eurent +aie +aies +ait +ayons +ayez +aient +eusse +eusses +eût +eussions +eussiez +eussent +ceci +celà +cet +cette +ici +ils +les +leurs +quel +quels +quelle +quelles +sans +soi diff --git a/src/main/resources/com/gravity/goose/text/stopwords-hu.txt b/src/main/resources/com/gravity/goose/text/stopwords-hu.txt new file mode 100644 index 000000000..694feb102 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-hu.txt @@ -0,0 +1,403 @@ +a +á +ahogy +ahol +aki +akik +akkor +alatt +által +általában +amely +amelyek +amelyekben +amelyeket +amelyet +amelynek +ami +amit +amolyan +amp +amíg +amikor +át +abban +ahhoz +annak +arra +arról +az +azok +azon +azt +azzal +azért +aztán +azután +azonban +b +bár +be +belül +benne +c +cikk +cikkek +cikkeket +csak +d +de +e +é +eddig +egész +egy +egyes +egyetlen +egyéb +egyik +egyre +ekkor +el +elég +ellen +elő +először +előtt +első +én +éppen +ebben +ehhez +emilyen +ennek +erre +ez +ezt +ezek +ezen +ezzel +ezért +és +f +fel +felé +g +h +hanem +hiszen +hogy +hogyan +i +í +igen +így +illetve +ill. +ill +ilyen +ilyenkor +is +ison +ismét +itt +j +jó +jól +jobban +k +kell +kellett +keresztül +keressünk +ki +kívül +között +közül +l +legalább +lehet +lehetett +legyen +lenne +lenni +lesz +lett +m +maga +magát +majd +majd +már +más +másik +meg +még +mellett +mert +mely +melyek +mi +mit +míg +miért +milyen +mikor +minden +mindent +mindenki +mindig +mint +mintha +mivel +most +n +nagy +nagyobb +nagyon +ne +néha +nekem +neki +nem +néhány +nélkül +nincs +o +ó +olyan +ott +össze +ö +ő +ők +őket +p +pedig +persze +q +r +rá +s +saját +sem +semmi +sok +sokat +sokkal +sz +számára +szemben +szerint +szinte +t +talán +tehát +teljes +tovább +továbbá +több +u +ú +úgy +ugyanis +új +újabb +újra +után +utána +utolsó +ü +ű +v +vagy +vagyis +valaki +valamely +valami +valamint +való +vagyok +van +vannak +volt +voltam +voltak +voltunk +vissza +vele +viszont +volna +számolnak +szólnak +szól +w +x +y +z +zs +a +ahogy +ahol +aki +akkor +alatt +általában +által +amely +amíg +amikor +ami +amolyan +arra +át +az +azért +azonban +azon +aztán +azt +azután +azzal +bár +be +belül +benne +cikk +csak +de +eddig +egész +egy +egyéb +egyes +egyetlen +egyik +egyre +ekkor +el +elég +ellen +elő +először +előtt +első +emilyen +én +éppen +erre +és +e +ez +ezen +ezért +ezzel +fel +felé +hanem +hiszen +hogy +hogyan +igen +így +ill. +illetve +ill +ilyen +ilyenkor +ismét +ison +itt +jó +jobban +jól +kell +keres +keresztül +ki +kívül +között +közül +legalább +legyen +lehet +lenni +lett +maga +maga +majd +már +más +másik +még +meg +mellett +mely +mert +miért +míg +mikor +milyen +minden +mindenki +mindig +mi +mint +mintha +mivel +most +nagy +nagyobb +nagyon +ne +néha +néhány +neki +nélkül +nem +nincs +ők +olyan +ő +össze +ott +pedig +persze +rá +saját +s +sem +semmi +sokkal +sok +számára +számol +szemben +szerint +szinte +szól +talán +tehát +teljes +továbbá +tovább +úgy +ugyanis +új +újabb +újra +utána +után +utolsó +vagy +vagyis +valaki +valamely +valami +valamint +való +van +vissza +viszont +volt + diff --git a/src/main/resources/com/gravity/goose/text/stopwords-it.txt b/src/main/resources/com/gravity/goose/text/stopwords-it.txt new file mode 100644 index 000000000..98ffee1d6 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-it.txt @@ -0,0 +1,287 @@ +ad +al +allo +ai +agli +all +agl +alla +alle +con +col +coi +da +dal +dallo +dai +dagli +dall +dagl +dalla +dalle +di +del +dello +dei +degli +dell +degl +della +delle +in +nel +nello +nei +negli +nell +negl +nella +nelle +su +sul +sullo +sui +sugli +sull +sugl +sulla +sulle +per +tra +contro +io +tu +lui +lei +noi +voi +loro +mio +mia +miei +mie +tuo +tua +tuoi +tue +suo +sua +suoi +sue +nostro +nostra +nostri +nostre +vostro +vostra +vostri +vostre +mi +ti +ci +vi +lo +la +li +le +gli +ne +il +un +uno +una +ma +ed +se +perchè +perché +perche +anche +come +dov +dove +che +chi +cui +non +più +piu +quale +quanto +quanti +quanta +quante +quello +quelli +quella +quelle +questo +questi +questa +queste +si +tutto +tutti +a +c +e +i +l +o +ho +hai +ha +abbiamo +avete +hanno +abbia +abbiate +abbiano +avrò +avro +avrai +avrà +avra +avremo +avrete +avranno +avrei +avresti +avrebbe +avremmo +avreste +avrebbero +avevo +avevi +aveva +avevamo +avevate +avevano +ebbi +avesti +ebbe +avemmo +aveste +ebbero +avessi +avesse +avessimo +avessero +avendo +avuto +avuta +avuti +avute +sono +sei +è +é +e +siamo +siete +sia +siate +siano +sarà +sarai +sarò +saro +saremo +sarete +saranno +sarei +saresti +sarebbe +saremmo +sareste +sarebbero +ero +eri +era +eravamo +eravate +erano +fui +fosti +fu +fummo +foste +furono +fossi +fosse +fossimo +fossero +essendo +faccio +fai +facciamo +fanno +faccia +facciate +facciano +farà +farai +farò +faremo +farete +faranno +farei +faresti +farebbe +faremmo +fareste +farebbero +facevo +facevi +faceva +facevamo +facevate +facevano +feci +facesti +fece +facemmo +faceste +fecero +facessi +facesse +facessimo +facessero +facendo +sto +stai +sta +stiamo +stanno +stia +stiate +stiano +starà +starai +starò +staremo +starete +staranno +starei +staresti +starebbe +staremmo +stareste +starebbero +stavo +stavi +stava +stavamo +stavate +stavano +stetti +stesti +stette +stemmo +steste +stettero +stessi +stesse +stessimo +stessero +stando diff --git a/src/main/resources/com/gravity/goose/text/stopwords-ko.txt b/src/main/resources/com/gravity/goose/text/stopwords-ko.txt new file mode 100644 index 000000000..a6746f776 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-ko.txt @@ -0,0 +1,70 @@ +을 +의 +에 +이 +를 +으로 +은 +는 +가 +로 +하고 +과 +에서 +도 +와 +이다 +고 +부터 +까지 +께 +에는 +이라고 +만 +라고 +보다 +에도 +다 +토록 +에게 +나 +대로 +에서는 +이나 +이며 +요 +든 +으로써 +같이 +로는 +밖에 +과의 +며 +로부터 +처럼 +아 +라 +여 +으로는 +이고 +에서의 +이라는 +만에 +으로부터 +에서도 +와의 +엔 +만을 +부터는 +만의 +야 +까지의 +과는 +치고 +과를 +으로의 +까지는 +보다는 +만이 +에만 +로의 \ No newline at end of file diff --git a/src/main/resources/com/gravity/goose/text/stopwords-nb.txt b/src/main/resources/com/gravity/goose/text/stopwords-nb.txt new file mode 100644 index 000000000..bb9edb15e --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-nb.txt @@ -0,0 +1,117 @@ +alle +andre +arbeid +av +begge +bort +bra +bruke +da +denne +der +deres +det +din +disse +du +eller +en +ene +eneste +enhver +enn +er +et +folk +for +fordi +forsÛke +fra +fÅ +fÛr +fÛrst +gjorde +gjÛre +god +gÅ +ha +hadde +han +hans +hennes +her +hva +hvem +hver +hvilken +hvis +hvor +hvordan +hvorfor +ikke +inn +innen +kan +kunne +lage +lang +lik +like +makt +mange +med +meg +meget +men +mens +mer +mest +min +mye +mÅ +mÅte +navn +nei +ny +nÅ +nÅr +og +ogsÅ +om +opp +oss +over +part +punkt +pÅ +rett +riktig +samme +sant +si +siden +sist +skulle +slik +slutt +som +start +stille +tid +til +tilbake +tilstand +under +ut +uten +var +ved +verdi +vi +vil +ville +vite +vÅr +vÖre +vÖrt +Å diff --git a/src/main/resources/com/gravity/goose/text/stopwords-nl.txt b/src/main/resources/com/gravity/goose/text/stopwords-nl.txt new file mode 100644 index 000000000..300c36833 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-nl.txt @@ -0,0 +1,48 @@ +aan +af +al +als +bij +dan +dat +die +dit +een +en +er +had +heb +hem +het +hij +hoe +hun +ik +in +is +je +kan +me +men +met +mij +nog +nu +of +ons +ook +te +tot +uit +van +was +wat +we +wel +wij +zal +ze +zei +zij +zo +zou diff --git a/src/main/resources/com/gravity/goose/text/stopwords-no.txt b/src/main/resources/com/gravity/goose/text/stopwords-no.txt new file mode 100644 index 000000000..4b14918b2 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-no.txt @@ -0,0 +1,120 @@ +at +av +de +den +der +det +du +en +er +et +for +fra +før +med +og +om +over +på +som +til +ved +år +alle +bare +ble +bort +bra +da +deg +dem +denne +dere +deres +det +dette +din +disse +dit +ditt +eller +ene +enn +er +et +ett +etter +for +fram +først +få +god +gå +ha +han +hans +har +her +hit +hun +hva +hvem +hver +ikke +inn +ja +jeg +kan +kom +kun +kunne +lage +lang +lik +like +man +mer +min +mot +mye +må +måte +ned +nei +noe +noen +ny +nå +når +også +opp +oss +seg +selv +si +siden +sin +sine +sist +skal +skulle +slik +som +så +sånn +tid +til +under +ut +uten +var +ved +vi +vil +vite +vår +å +dei +di +då +eg \ No newline at end of file diff --git a/src/main/resources/com/gravity/goose/text/stopwords-pl.txt b/src/main/resources/com/gravity/goose/text/stopwords-pl.txt new file mode 100644 index 000000000..93dac8291 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-pl.txt @@ -0,0 +1,277 @@ +a +aby +ach +acz +aczkolwiek +aj +albo +ale +ależ +ani +aż +bardziej +bardzo +bo +bowiem +by +byli +bynajmniej +być +był +była +było +były +będzie +będą +cali +cała +cały +ci +cię +ciebie +co +cokolwiek +coś +czasami +czasem +czemu +czy +czyli +daleko +dla +dlaczego +dlatego +do +dobrze +dokąd +dość +dużo +dwa +dwaj +dwie +dwoje +dziś +dzisiaj +gdy +gdyby +gdyż +gdzie +gdziekolwiek +gdzieś +i +ich +ile +im +inna +inne +inny +innych +iż +ja +ją +jak +jakaś +jakby +jaki +jakichś +jakie +jakiś +jakiż +jakkolwiek +jako +jakoś +je +jeden +jedna +jedno +jednak +jednakże +jego +jej +jemu +jest +jestem +jeszcze +jeśli +jeżeli +już +ją +każdy +kiedy +kilka +kimś +kto +ktokolwiek +ktoś +która +które +którego +której +który +których +którym +którzy +ku +lat +lecz +lub +ma +mają +mało +mam +mi +mimo +między +mną +mnie +mogą +moi +moim +moja +moje +może +możliwe +można +mój +mu +musi +my +na +nad +nam +nami +nas +nasi +nasz +nasza +nasze +naszego +naszych +natomiast +natychmiast +nawet +nią +nic +nich +nie +niech +niego +niej +niemu +nigdy +nim +nimi +niż +no +o +obok +od +około +on +ona +one +oni +ono +oraz +oto +owszem +pan +pana +pani +po +pod +podczas +pomimo +ponad +ponieważ +powinien +powinna +powinni +powinno +poza +prawie +przecież +przed +przede +przedtem +przez +przy +roku +również +sam +sama +są +się +skąd +sobie +sobą +sposób +swoje +ta +tak +taka +taki +takie +także +tam +te +tego +tej +temu +ten +teraz +też +to +tobą +tobie +toteż +trzeba +tu +tutaj +twoi +twoim +twoja +twoje +twym +twój +ty +tych +tylko +tym +u +w +wam +wami +was +wasz +wasza +wasze +we +według +wiele +wielu +więc +więcej +wszyscy +wszystkich +wszystkie +wszystkim +wszystko +wtedy +wy +właśnie +z +za +zapewne +zawsze +ze +zł +znowu +znów +został +żaden +żadna +żadne +żadnych +że +żeby \ No newline at end of file diff --git a/src/main/resources/com/gravity/goose/text/stopwords-pt.txt b/src/main/resources/com/gravity/goose/text/stopwords-pt.txt new file mode 100644 index 000000000..66d557f9c --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-pt.txt @@ -0,0 +1,147 @@ +último +é +acerca +agora +algmas +alguns +ali +ambos +antes +apontar +aquela +aquelas +aquele +aqueles +aqui +atrás +bem +bom +cada +caminho +cima +com +como +comprido +conhecido +corrente +das +debaixo +dentro +desde +desligado +deve +devem +deverá +direita +diz +dizer +dois +dos +e +ela +ele +eles +em +enquanto +então +está +estão +estado +estar +estará +este +estes +esteve +estive +estivemos +estiveram +eu +fará +faz +fazer +fazia +fez +fim +foi +fora +horas +iniciar +inicio +ir +irá +ista +iste +isto +ligado +maioria +maiorias +mais +mas +mesmo +meu +muito +muitos +nós +não +nome +nosso +novo +o +onde +os +ou +outro +para +parte +pegar +pelo +pessoas +pode +poderá +podia +por +porque +povo +promeiro +quê +qual +qualquer +quando +quem +quieto +são +saber +sem +ser +seu +somente +têm +tal +também +tem +tempo +tenho +tentar +tentaram +tente +tentei +teu +teve +tipo +tive +todos +trabalhar +trabalho +tu +um +uma +umas +uns +usa +usar +valor +veja +ver +verdade +verdadeiro +você diff --git a/src/main/resources/com/gravity/goose/text/stopwords-ru.txt b/src/main/resources/com/gravity/goose/text/stopwords-ru.txt new file mode 100644 index 000000000..94984803c --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-ru.txt @@ -0,0 +1,421 @@ +а +е +и +ж +м +о +на +не +ни +об +но +он +мне +мои +мож +она +они +оно +мной +много +многочисленное +многочисленная +многочисленные +многочисленный +мною +мой +мог +могут +можно +может +можхо +мор +моя +моё +мочь +над +нее +оба +нам +нем +нами +ними +мимо +немного +одной +одного +менее +однажды +однако +меня +нему +меньше +ней +наверху +него +ниже +мало +надо +один +одиннадцать +одиннадцатый +назад +наиболее +недавно +миллионов +недалеко +между +низко +меля +нельзя +нибудь +непрерывно +наконец +никогда +никуда +нас +наш +нет +нею +неё +них +мира +наша +наше +наши +ничего +начала +нередко +несколько +обычно +опять +около +мы +ну +нх +от +отовсюду +особенно +нужно +очень +отсюда +в +во +вон +вниз +внизу +вокруг +вот +восемнадцать +восемнадцатый +восемь +восьмой +вверх +вам +вами +важное +важная +важные +важный +вдали +везде +ведь +вас +ваш +ваша +ваше +ваши +впрочем +весь +вдруг +вы +все +второй +всем +всеми +времени +время +всему +всего +всегда +всех +всею +всю +вся +всё +всюду +г +год +говорил +говорит +года +году +где +да +ее +за +из +ли +же +им +до +по +ими +под +иногда +довольно +именно +долго +позже +более +должно +пожалуйста +значит +иметь +больше +пока +ему +имя +пор +пора +потом +потому +после +почему +почти +посреди +ей +два +две +двенадцать +двенадцатый +двадцать +двадцатый +двух +его +дел +или +без +день +занят +занята +занято +заняты +действительно +давно +девятнадцать +девятнадцатый +девять +девятый +даже +алло +жизнь +далеко +близко +здесь +дальше +для +лет +зато +даром +первый +перед +затем +зачем +лишь +десять +десятый +ею +её +их +бы +еще +при +был +про +процентов +против +просто +бывает +бывь +если +люди +была +были +было +будем +будет +будете +будешь +прекрасно +буду +будь +будто +будут +ещё +пятнадцать +пятнадцатый +друго +другое +другой +другие +другая +других +есть +пять +быть +лучше +пятый +к +ком +конечно +кому +кого +когда +которой +которого +которая +которые +который +которых +кем +каждое +каждая +каждые +каждый +кажется +как +какой +какая +кто +кроме +куда +кругом +с +т +у +я +та +те +уж +со +то +том +снова +тому +совсем +того +тогда +тоже +собой +тобой +собою +тобою +сначала +только +уметь +тот +тою +хорошо +хотеть +хочешь +хоть +хотя +свое +свои +твой +своей +своего +своих +свою +твоя +твоё +раз +уже +сам +там +тем +чем +сама +сами +теми +само +рано +самом +самому +самой +самого +семнадцать +семнадцатый +самим +самими +самих +саму +семь +чему +раньше +сейчас +чего +сегодня +себе +тебе +сеаой +человек +разве +теперь +себя +тебя +седьмой +спасибо +слишком +так +такое +такой +такие +также +такая +сих +тех +чаще +четвертый +через +часто +шестой +шестнадцать +шестнадцатый +шесть +четыре +четырнадцать +четырнадцатый +сколько +сказал +сказала +сказать +ту +ты +три +эта +эти +что +это +чтоб +этом +этому +этой +этого +чтобы +этот +стал +туда +этим +этими +рядом +тринадцать +тринадцатый +этих +третий +тут +эту +суть +чуть +тысяч diff --git a/src/main/resources/com/gravity/goose/text/stopwords-sv.txt b/src/main/resources/com/gravity/goose/text/stopwords-sv.txt new file mode 100644 index 000000000..74c0a895f --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-sv.txt @@ -0,0 +1,547 @@ +#----------------------------------------------------------------------- +# translated +#----------------------------------------------------------------------- + +kunna +om +ovan +enligt +i enlighet med detta +över +faktiskt +efter +efteråt +igen +mot +är inte +alla +tillåta +tillåter +nästan +ensam +längs +redan +också +även om +alltid +am +bland +bland +en +och +en annan +någon +någon +hur som helst +någon +något +ändå +ändå +var som helst +isär +visas +uppskatta +lämpligt +är +inte +runt +som +åt sidan +be +frågar +associerad +vid +tillgängliga +bort +väldigt +vara +blev +eftersom +bli +blir +blir +varit +innan +förhand +bakom +vara +tro +nedan +bredvid +förutom +bäst +bättre +mellan +bortom +både +kort +men +genom +c +c'mon +c: s +kom +kampanj +kan +kan inte +kan inte +cant +orsaka +orsaker +viss +säkerligen +förändringar +klart +co +com +komma +kommer +om +följaktligen +överväga +överväger +innehålla +innehållande +innehåller +motsvarande +kunde +kunde inte +kurs +närvarande +definitivt +beskrivits +trots +gjorde +inte +olika +göra +gör +inte +gör +inte +gjort +ned +nedåt +under +varje +edu +åtta +antingen +annars +någon annanstans +tillräckligt +godkändes +helt +speciellt +et +etc +även +någonsin +varje +alla +alla +allt +överallt +ex +exakt +exempel +utom +långt +få +femte +först +finansiella +fem +följt +efter +följer +för +fd +tidigare +framåt +fyra +från +ytterligare +dessutom +få +blir +få +given +ger +gå +går +gå +borta +fick +fått +hälsningar +hade +hade inte +händer +knappast +har +har inte +ha +har inte +med +han +han är +hallå +hjälpa +hence +henne +här +här finns +härefter +härmed +häri +härpå +hennes +själv +hej +honom +själv +hans +hit +förhoppningsvis +hur +howbeit +dock +jag skulle +jag ska +jag är +jag har +om +ignoreras +omedelbar +i +eftersom +inc +indeed +indikera +indikerade +indikerar +inre +mån +istället +in +inåt +är +är inte +den +det skulle +det ska +det är +dess +själv +bara +hålla +håller +hålls +vet +vet +känd +sista +nyligen +senare +senare +latterly +minst +mindre +lest +låt +låt oss +liknande +gillade +sannolikt +lite +ser +ser +ser +ltd +huvudsakligen +många +kan +kanske +mig +betyda +under tiden +endast +kanske +mer +dessutom +mest +mestadels +mycket +måste +min +själv +namn +nämligen +nd +nära +nästan +nödvändigt +behöver +behov +varken +aldrig +ändå +ny +nästa +nio +ingen +ingen +icke +ingen +ingen +eller +normalt +inte +ingenting +roman +nu +ingenstans +uppenbarligen +av +off +ofta +oh +ok +okay +gammal +på +en gång +ett +ettor +endast +på +eller +andra +andra +annars +borde +vår +vårt +oss +ut +utanför +över +övergripande +egen +särskilt +särskilt +per +kanske +placeras +vänligen +plus +möjligt +förmodligen +förmodligen +ger +ganska +citera +kvartalsvis +snarare +verkligen +rimligen +om +oavsett +gäller +relativt +respektive +höger +sa +samma +såg +säga +säger +säger +andra +det andra +se +ser +verkar +verkade +informationsproblem +verkar +sett +själv +själva +förnuftig +skickas +allvarlig +allvarligt +sju +flera +skall +hon +bör +bör inte +eftersom +sex +så +några +någon +på något sätt +någon +något +sometime +ibland +något +någonstans +snart +sorry +specificerade +ange +ange +fortfarande +sub +sådan +sup +säker +t s +ta +tas +berätta +tenderar +än +tacka +tack +thanx +att +det är +brinner +den +deras +deras +dem +själva +sedan +därifrån +där +det finns +därefter +därigenom +därför +däri +theres +därpå +dessa +de +de hade +de kommer +de är +de har +tror +tredje +detta +grundlig +grundligt +de +though +tre +genom +hela +thru +sålunda +till +tillsammans +alltför +tog +mot +mot +försökte +försöker +verkligt +försök +försöker +två gånger +två +enligt +tyvärr +såvida inte +osannolikt +tills +åt +upp +på +oss +använda +används +användbar +använder +användning +vanligtvis +uucp +värde +olika +mycket +via +viz +vs +vill +vill +var +var inte +sätt +vi +vi skulle +vi kommer +vi är +vi har +välkommen +väl +gick +var +var inte +vad +vad är +oavsett +när +varifrån +närhelst +där +var är +varefter +medan +varigenom +vari +varpå +varhelst +huruvida +som +medan +dit +som +vem är +vem +hela +vem +vars +varför +kommer +villig +önskar +med +inom +utan +kommer inte +undrar +skulle +skulle inte +ja +ännu +ni +du skulle +kommer du +du är +du har +din +själv +er +noll +tjänsteman +skarpt +kritiserade diff --git a/src/main/resources/com/gravity/goose/text/stopwords-zh.txt b/src/main/resources/com/gravity/goose/text/stopwords-zh.txt new file mode 100644 index 000000000..955ff2b05 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-zh.txt @@ -0,0 +1,125 @@ +的 +一 +不 +在 +人 +有 +是 +为 +以 +于 +上 +他 +而 +后 +之 +来 +及 +了 +因 +下 +可 +到 +由 +这 +与 +也 +此 +但 +并 +个 +其 +已 +无 +小 +我 +们 +起 +最 +再 +今 +去 +好 +只 +又 +或 +很 +亦 +某 +把 +那 +你 +乃 +它 +吧 +被 +比 +别 +趁 +当 +从 +到 +得 +打 +凡 +儿 +尔 +该 +各 +给 +跟 +和 +何 +还 +即 +几 +既 +看 +据 +距 +靠 +啦 +了 +另 +么 +每 +们 +嘛 +拿 +哪 +那 +您 +凭 +且 +却 +让 +仍 +啥 +如 +若 +使 +谁 +虽 +随 +同 +所 +她 +哇 +嗡 +往 +哪 +些 +向 +沿 +哟 +用 +于 +咱 +则 +怎 +曾 +至 +致 +着 +诸 +自 \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index 20ce4653a..5fad377a7 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -24,6 +24,16 @@ import java.util.Date import reflect.BeanProperty import com.gravity.goose.extractors.{StandardContentExtractor, ContentExtractor, AdditionalDataExtractor, PublishDateExtractor} +object Language extends Enumeration { + type Language = Value + //val Get, Set, Add, Delete, Reset = Value + val English = Value("en") + val Chinese = Value("zh") + val Korean = Value("kr") + val Arabic = Value("ar") +} + +import Language._ /** * Created by Jim Plush @@ -33,6 +43,12 @@ import com.gravity.goose.extractors.{StandardContentExtractor, ContentExtractor, class Configuration { + + /** + * this is the local storage path used to place images to inspect them, should be writable + */ + @BeanProperty + var language: Language = Language.English /** * this is the local storage path used to place images to inspect them, should be writable diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index 4f3b32344..73e97dd63 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -70,9 +70,7 @@ class Crawler(config: Configuration) { // before we do any calcs on the body itself let's clean up the document article.doc = docCleaner.clean(article) - - - extractor.calculateBestNodeBasedOnClustering(article) match { + extractor.calculateBestNodeBasedOnClustering(article, config.language) match { case Some(node: Element) => { article.topNode = node article.movies = extractor.extractVideos(article.topNode) @@ -92,19 +90,14 @@ class Crawler(config: Configuration) { } } } - article.topNode = extractor.postExtractionCleanup(article.topNode) - - - - - article.cleanedArticleText = outputFormatter.getFormattedText(article.topNode) + article.topNode = extractor.postExtractionCleanup(article.topNode, config.language) + article.cleanedArticleText = outputFormatter.getFormattedText(article.topNode, config.language) } case _ => trace("NO ARTICLE FOUND") } releaseResources(article) article } - article } @@ -121,7 +114,6 @@ class Crawler(config: Configuration) { } } - def getImageExtractor(article: Article): ImageExtractor = { val httpClient: HttpClient = config.getHtmlFetcher.getHttpClient new UpgradedImageIExtractor(httpClient, article, config) diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index 51838e335..371c7e2a8 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -26,6 +26,7 @@ import scala.collection.mutable import scala.collection.JavaConversions._ import org.jsoup.nodes.{Attributes, Element, Document} import org.jsoup.select._ +import com.gravity.goose.Language._ /** * Created by Jim Plush @@ -188,7 +189,7 @@ trait ContentExtractor { * @return */ - def calculateBestNodeBasedOnClustering(article: Article): Option[Element] = { + def calculateBestNodeBasedOnClustering(article: Article, language: Language): Option[Element] = { trace(logPrefix + "Starting to calculate TopNode") val doc = article.doc var topNode: Element = null @@ -200,7 +201,7 @@ trait ContentExtractor { val nodesWithText = mutable.Buffer[Element]() for (node <- nodesToCheck) { val nodeText: String = node.text - val wordStats: WordStats = StopWords.getStopWordCount(nodeText) + val wordStats: WordStats = StopWords.getStopWordCount(nodeText, language) val highLinkDensity: Boolean = isHighLinkDensity(node) if (wordStats.getStopWordCount > 2 && !highLinkDensity) { nodesWithText.add(node) @@ -214,7 +215,7 @@ trait ContentExtractor { for (node <- nodesWithText) { var boostScore: Float = 0 - if (isOkToBoost(node)) { + if (isOkToBoost(node, language)) { if (cnt >= 0) { boostScore = ((1.0 / startingBoost) * 50).asInstanceOf[Float] startingBoost += 1 @@ -234,7 +235,7 @@ trait ContentExtractor { trace(logPrefix + "Location Boost Score: " + boostScore + " on interation: " + i + "' id='" + node.parent.id + "' class='" + node.parent.attr("class")) val nodeText: String = node.text - val wordStats: WordStats = StopWords.getStopWordCount(nodeText) + val wordStats: WordStats = StopWords.getStopWordCount(nodeText, language) val upscore: Int = (wordStats.getStopWordCount + boostScore).asInstanceOf[Int] updateScore(node.parent, upscore) updateScore(node.parent.parent, upscore / 2) @@ -256,6 +257,7 @@ trait ContentExtractor { trace(logPrefix + "ParentNode: score='" + e.attr("gravityScore") + "' nodeCount='" + e.attr("gravityNodes") + "' id='" + e.id + "' class='" + e.attr("class") + "' ") val score: Int = getScore(e) + println(score) if (score > topNodeScore) { topNode = e topNodeScore = score @@ -289,7 +291,7 @@ trait ContentExtractor { * @param node * @return */ - private def isOkToBoost(node: Element): Boolean = { + private def isOkToBoost(node: Element, language: Language): Boolean = { val para = "p" var stepsAway: Int = 0 val minimumStopWordCount = 5 @@ -303,7 +305,7 @@ trait ContentExtractor { return false } val paraText: String = currentNode.text - val wordStats: WordStats = StopWords.getStopWordCount(paraText) + val wordStats: WordStats = StopWords.getStopWordCount(paraText, language) if (wordStats.getStopWordCount > minimumStopWordCount) { trace(logPrefix + "We're gonna boost this node, seems contenty") return true @@ -488,10 +490,10 @@ trait ContentExtractor { * @param targetNode * @return */ - def postExtractionCleanup(targetNode: Element): Element = { + def postExtractionCleanup(targetNode: Element, language: Language): Element = { trace(logPrefix + "Starting cleanup Node") - val node = addSiblings(targetNode) + val node = addSiblings(targetNode, language) for { e <- node.children if (e.tagName != "p") @@ -531,7 +533,7 @@ trait ContentExtractor { * @param currentSibling * @return */ - def getSiblingContent(currentSibling: Element, baselineScoreForSiblingParagraphs: Int): Option[String] = { + def getSiblingContent(currentSibling: Element, baselineScoreForSiblingParagraphs: Int, language: Language): Option[String] = { if (currentSibling.tagName == "p" && currentSibling.text.length() > 0) { Some(currentSibling.outerHtml) @@ -546,7 +548,7 @@ trait ContentExtractor { Some((for { firstParagraph <- potentialParagraphs if (firstParagraph.text.length() > 0) - wordStats: WordStats = StopWords.getStopWordCount(firstParagraph.text) + wordStats: WordStats = StopWords.getStopWordCount(firstParagraph.text, language) paragraphScore: Int = wordStats.getStopWordCount siblingBaseLineScore: Double = .30 if ((baselineScoreForSiblingParagraphs * siblingBaseLineScore).toDouble < paragraphScore) @@ -575,14 +577,14 @@ trait ContentExtractor { b } - private def addSiblings(topNode: Element): Element = { + private def addSiblings(topNode: Element, language: Language): Element = { trace(logPrefix + "Starting to add siblings") - val baselineScoreForSiblingParagraphs: Int = getBaselineScoreForSiblings(topNode) + val baselineScoreForSiblingParagraphs: Int = getBaselineScoreForSiblings(topNode, language) val results = walkSiblings(topNode) { currentNode => { - getSiblingContent(currentNode, baselineScoreForSiblingParagraphs) + getSiblingContent(currentNode, baselineScoreForSiblingParagraphs, language) } }.reverse.flatMap(itm => itm) @@ -599,7 +601,7 @@ trait ContentExtractor { * @param topNode * @return */ - private def getBaselineScoreForSiblings(topNode: Element): Int = { + private def getBaselineScoreForSiblings(topNode: Element, language: Language): Int = { var base: Int = 100000 var numberOfParagraphs: Int = 0 var scoreOfParagraphs: Int = 0 @@ -607,7 +609,7 @@ trait ContentExtractor { for (node <- nodesToCheck) { val nodeText: String = node.text - val wordStats: WordStats = StopWords.getStopWordCount(nodeText) + val wordStats: WordStats = StopWords.getStopWordCount(nodeText, language) val highLinkDensity: Boolean = isHighLinkDensity(node) if (wordStats.getStopWordCount > 2 && !highLinkDensity) { numberOfParagraphs += 1; diff --git a/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala b/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala index a86a2252b..febc24f32 100644 --- a/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala +++ b/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala @@ -24,6 +24,7 @@ import org.jsoup.select.Elements import com.gravity.goose.text.StopWords import scala.collection.JavaConversions._ import org.slf4j.Logger +import com.gravity.goose.Language._ /** * Created by Jim Plush @@ -49,11 +50,11 @@ trait OutputFormatter { * @param topNode the top most node to format * @return the prepared Element */ - @Deprecated def getFormattedElement(topNode: Element): Element = { + @Deprecated def getFormattedElement(topNode: Element, language: Language): Element = { removeNodesWithNegativeScores(topNode) convertLinksToText(topNode) replaceTagsWithText(topNode) - removeParagraphsWithFewWords(topNode) + removeParagraphsWithFewWords(topNode, language) topNode } @@ -62,11 +63,11 @@ trait OutputFormatter { * @param topNode the top most node to format * @return a formatted string with all HTML removed */ - def getFormattedText(topNode: Element): String = { + def getFormattedText(topNode: Element, language: Language): String = { removeNodesWithNegativeScores(topNode) convertLinksToText(topNode) replaceTagsWithText(topNode) - removeParagraphsWithFewWords(topNode) + removeParagraphsWithFewWords(topNode, language) convertToText(topNode) } @@ -173,7 +174,7 @@ trait OutputFormatter { /** * remove paragraphs that have less than x number of words, would indicate that it's some sort of link */ - private def removeParagraphsWithFewWords(topNode: Element) { + private def removeParagraphsWithFewWords(topNode: Element, language: Language) { if (topNode != null) { if (logger.isDebugEnabled) { logger.debug("removeParagraphsWithFewWords starting...") @@ -183,7 +184,7 @@ trait OutputFormatter { for (el <- allNodes) { try { - val stopWords = StopWords.getStopWordCount(el.text) + val stopWords = StopWords.getStopWordCount(el.text, language) if (stopWords.getStopWordCount < 3 && el.getElementsByTag("object").size == 0 && el.getElementsByTag("embed").size == 0) { logger.debug("removeParagraphsWithFewWords - swcnt: %d removing text: %s".format(stopWords.getStopWordCount, el.text())) el.remove() diff --git a/src/main/scala/com/gravity/goose/text/StopWords.scala b/src/main/scala/com/gravity/goose/text/StopWords.scala index f1b7ea94d..2ef16272d 100644 --- a/src/main/scala/com/gravity/goose/text/StopWords.scala +++ b/src/main/scala/com/gravity/goose/text/StopWords.scala @@ -24,39 +24,85 @@ package com.gravity.goose.text * Date: 8/16/11 */ -import java.util._ import com.gravity.goose.utils.FileHelper +import com.gravity.goose.Language._ +import com.chenlb.mmseg4j.ComplexSeg; +import com.chenlb.mmseg4j.Dictionary; +import com.chenlb.mmseg4j.MMSeg; +import com.chenlb.mmseg4j.Seg; +import com.chenlb.mmseg4j.Word; +import java.io.StringReader; +import scala.collection.JavaConversions._ +import java.util.HashMap +import scala.collection.Set +import java.util.Map object StopWords { // the confusing pattern below is basically just match any non-word character excluding white-space. private val PUNCTUATION: StringReplacement = StringReplacement.compile("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\p{Pc}\\s]", string.empty) - val STOP_WORDS = FileHelper.loadResourceFile("stopwords-en.txt", StopWords.getClass).split(sys.props("line.separator")).toSet - + //val STOP_WORDS = FileHelper.loadResourceFile("stopwords-en.txt", StopWords.getClass).split(sys.props("line.separator")).toSet + private var stopWordsMap: Map[String, Set[String]] = new HashMap[String, Set[String]]() def removePunctuation(str: String): String = { PUNCTUATION.replaceAll(str) } + + def getStopWords(language: Language): Set[String] = { + val lname = language.toString() + var stopWords = stopWordsMap.get(lname) + if (stopWords == null) { + var stopWordsFile = "stopwords-%s.txt" format lname + stopWords = FileHelper.loadResourceFile(stopWordsFile, StopWords.getClass).split(sys.props("line.separator")).toSet + stopWords = stopWords.map(s=>s.trim) + stopWordsMap.put(lname, stopWords) + } + stopWords + } - def getStopWordCount(content: String): WordStats = { + def getCandidateWords(strippedInput: String, language: Language): Array[String] = { + language match { + case English => string.SPACE_SPLITTER.split(strippedInput) + case Chinese => tokenize(strippedInput).toArray + case _ => string.SPACE_SPLITTER.split(strippedInput) + } + } + + def getStopWordCount(content: String, language: Language): WordStats = { if (string.isNullOrEmpty(content)) return WordStats.EMPTY val ws: WordStats = new WordStats val strippedInput: String = removePunctuation(content) - val candidateWords: Array[String] = string.SPACE_SPLITTER.split(strippedInput) - - val overlappingStopWords: List[String] = new ArrayList[String] + val candidateWords = getCandidateWords(strippedInput, language) + + var overlappingStopWords: List[String] = List[String]() + val STOP_WORDS = getStopWords(language) + candidateWords.foreach(w => { - if (STOP_WORDS.contains(w.toLowerCase)) overlappingStopWords.add(w.toLowerCase) + if (STOP_WORDS.contains(w.toLowerCase)) { + overlappingStopWords = w.toLowerCase :: overlappingStopWords + } }) ws.setWordCount(candidateWords.length) ws.setStopWordCount(overlappingStopWords.size) ws.setStopWords(overlappingStopWords) ws } - - -} + + def tokenize(line: String): List[String] = { + + var seg = new ComplexSeg(Dictionary.getInstance()); + var mmSeg = new MMSeg(new StringReader(line), seg); + var tokens = List[String](); + var word = mmSeg.next() + while (word != null) { + tokens = word.getString() :: tokens ; + word = mmSeg.next(); + } + println(tokens) + return tokens; + } +} \ No newline at end of file diff --git a/src/test/scala/com/gravity/goose/AicaiTest.scala b/src/test/scala/com/gravity/goose/AicaiTest.scala index bb919b373..28c9dc121 100644 --- a/src/test/scala/com/gravity/goose/AicaiTest.scala +++ b/src/test/scala/com/gravity/goose/AicaiTest.scala @@ -2,7 +2,20 @@ package com.gravity.goose import org.junit.Test import org.junit.Assert._ +import scala.io.Source +import java.io.IOException; +import java.io.StringReader; +import java.util.logging.LogManager; + +import com.chenlb.mmseg4j.ComplexSeg; +import com.chenlb.mmseg4j.Dictionary; +import com.chenlb.mmseg4j.MMSeg; +import com.chenlb.mmseg4j.Seg; +import com.chenlb.mmseg4j.Word; + import com.gravity.goose.extractors.VoicesContentExtractor +import com.gravity.goose.text.StopWords + /** * Created by Jim Plush @@ -14,14 +27,31 @@ class AicaiTest { @Test def testArticleElementedArticle() { // to verify issue #56 is resolved - implicit val config = TestUtils.NO_IMAGE_CONFIG + var config = TestUtils.NO_IMAGE_CONFIG + config.language = Language.Chinese //val url = "http://www.csdn.net/article/2014-04-14/2819287-what-supercell-did-next" - val url = "http://sports.sina.com.cn/g/laliga/2014-04-14/11447118806.shtml" + //val url = "http://sports.sina.com.cn/g/laliga/2014-04-14/11447118806.shtml" + val url = "http://luoxiaowei.baijia.baidu.com/article/11833" + + val html = Source.fromURL(url) + println("tt") val goose = new Goose(config) val article = goose.extractContent(url) println(article.cleanedArticleText) } + + def tokenize(line: String): List[String] = { + var seg = new ComplexSeg(Dictionary.getInstance()); + var mmSeg = new MMSeg(new StringReader(line), seg); + var tokens = List[String](); + var word = mmSeg.next() + while (word != null) { + tokens = word.getString() :: tokens ; + word = mmSeg.next(); + } + return tokens; + } } \ No newline at end of file From c9de660871fab4fe8e2e83ddfcfd4b34229b602d Mon Sep 17 00:00:00 2001 From: Patrick Liang <skyshard@gmail.com> Date: Fri, 18 Apr 2014 12:06:23 -0700 Subject: [PATCH 249/347] modifying link structure --- src/main/scala/com/gravity/goose/Article.scala | 4 ++-- .../com/gravity/goose/extractors/ContentExtractor.scala | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Article.scala b/src/main/scala/com/gravity/goose/Article.scala index a42899492..3911b99fc 100644 --- a/src/main/scala/com/gravity/goose/Article.scala +++ b/src/main/scala/com/gravity/goose/Article.scala @@ -88,10 +88,10 @@ class Article { var tags: Set[String] = null /** - * holds a map of any links -> link text in the article + * holds a list of links in the article */ @BeanProperty - var links: Map[String, String] = null + var links: List[Map[String, String]] = null /** * holds a list of any movies we found on the page like youtube, vimeo diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index 69b93e327..2f67f8c22 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -24,6 +24,7 @@ import java.net.URL import java.util.ArrayList import java.util.Date import scala.collection.mutable +import scala.collection.immutable import scala.collection.JavaConversions._ import org.jsoup.nodes.{Attributes, Element, Document} import org.jsoup.select._ @@ -558,14 +559,14 @@ trait ContentExtractor { * * @return */ - def extractLinks(node: Element): Map[String, String] = { - val goodLinks = mutable.Map[String, String]() + def extractLinks(node: Element): List[Map[String, String]] = { + val goodLinks = mutable.MutableList[Map[String, String]]() - val candidates = node.parent.select("a[href]").filter(el => el.attr("href") != "#" && !el.attr("abs:href").trim.isEmpty).map(el => goodLinks += el.attr("abs:href") -> el.text) + val candidates = node.parent.select("a[href]").filter(el => el.attr("href") != "#" && !el.attr("abs:href").trim.isEmpty).map(el => goodLinks += immutable.Map("url" -> el.attr("abs:href"), "text" -> el.text)) trace(logPrefix + "extractLinks: Extracted links. Found: " + candidates.size) - goodLinks.toMap + goodLinks.toList } def isTableTagAndNoParagraphsExist(e: Element): Boolean = { From 17a5298bd59b01fc718a2b83aa00797c238c584c Mon Sep 17 00:00:00 2001 From: maojianxin <maojianxin@umeng.com> Date: Tue, 22 Apr 2014 15:24:15 +0800 Subject: [PATCH 250/347] update imagemagick path --- src/main/scala/com/gravity/goose/Configuration.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index 5fad377a7..02ec5ac14 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -71,12 +71,12 @@ class Configuration { * path to your imagemagick convert executable, on the mac using mac ports this is the default listed */ @BeanProperty - var imagemagickConvertPath: String = "/opt/local/bin/convert" + var imagemagickConvertPath: String = "/usr/bin/convert" /** * path to your imagemagick identify executable */ @BeanProperty - var imagemagickIdentifyPath: String = "/opt/local/bin/identify" + var imagemagickIdentifyPath: String = "/usr/bin/identify" @BeanProperty var connectionTimeout: Int = 10000 From 3801d98dc3d43a91da992c1999aecf6dd8a1094c Mon Sep 17 00:00:00 2001 From: Patrick Liang <skyshard@gmail.com> Date: Thu, 24 Apr 2014 15:50:50 -0700 Subject: [PATCH 251/347] should use Nil for empty lists --- src/main/scala/com/gravity/goose/Article.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/Article.scala b/src/main/scala/com/gravity/goose/Article.scala index 3911b99fc..4f7afa5a0 100644 --- a/src/main/scala/com/gravity/goose/Article.scala +++ b/src/main/scala/com/gravity/goose/Article.scala @@ -91,7 +91,7 @@ class Article { * holds a list of links in the article */ @BeanProperty - var links: List[Map[String, String]] = null + var links: List[Map[String, String]] = Nil /** * holds a list of any movies we found on the page like youtube, vimeo From 1eac43e588c30396f141e15ee8d436f29c597995 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid?= <david@cliqz.com> Date: Thu, 22 May 2014 10:29:40 +0200 Subject: [PATCH 252/347] Moved the bean properties to constructor parameters. --- .../com/gravity/goose/Configuration.scala | 80 +++++++++---------- 1 file changed, 38 insertions(+), 42 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index 20ce4653a..a093e6154 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -31,48 +31,44 @@ import com.gravity.goose.extractors.{StandardContentExtractor, ContentExtractor, * Date: 8/16/11 */ - -class Configuration { - - /** - * this is the local storage path used to place images to inspect them, should be writable - */ - @BeanProperty - var localStoragePath: String = "/tmp/goose" - /** - * What's the minimum bytes for an image we'd accept is, alot of times we want to filter out the author's little images - * in the beginning of the article - */ - @BeanProperty - var minBytesForImages: Int = 4500 - /** - * set this guy to false if you don't care about getting images, otherwise you can either use the default - * image extractor to implement the ImageExtractor interface to build your own - */ - @BeanProperty - var enableImageFetching: Boolean = true - /** - * path to your imagemagick convert executable, on the mac using mac ports this is the default listed - */ - @BeanProperty - var imagemagickConvertPath: String = "/opt/local/bin/convert" - /** - * path to your imagemagick identify executable - */ - @BeanProperty - var imagemagickIdentifyPath: String = "/opt/local/bin/identify" - - @BeanProperty - var connectionTimeout: Int = 10000 - - @BeanProperty - var socketTimeout: Int = 10000 - - /** - * used as the user agent that is sent with your web requests to extract an article - */ - @BeanProperty - var browserUserAgent: String = "Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8" +/** + * @param localStoragePath this is the local storage path used to place images + * to inspect them, should be writable + * @param minBytesForImages What's the minimum bytes for an image we'd accept + * is, alot of times we want to filter out the author's + * little images in the beginning of the article + * @param enableImageFetching set this guy to false if you don't care about + * getting images, otherwise you can either use the + * default image extractor to implement the + * ImageExtractor interface to build your own + * @param imagemagickConvertPath path to your imagemagick convert executable, on + * the mac using mac ports this is the default + * listed (Note: not on Linux...) + * @param imagemagickIdentifyPath path to your imagemagick identify executable + * @param connectionTimeout Connection timeout for the crawler. + * @param socketTimeout Socket timeout for the crawler. + * @param browserUserAgent used as the user agent that is sent with your web + * requests to extract an article + */ +class Configuration( + @BeanProperty + var localStoragePath: String = "/tmp/goose", + @BeanProperty + var minBytesForImages: Int = 4500, + @BeanProperty + var enableImageFetching: Boolean = true, + @BeanProperty + var imagemagickConvertPath: String = "/opt/local/bin/convert", + @BeanProperty + var imagemagickIdentifyPath: String = "/opt/local/bin/identify", + @BeanProperty + var connectionTimeout: Int = 10000, + @BeanProperty + var socketTimeout: Int = 10000, + @BeanProperty + var browserUserAgent: String = + "Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.8) " + + "Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8") { var contentExtractor: ContentExtractor = StandardContentExtractor From 9b3f734f6361119ef2973a869d0420a5747ad34b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid?= <david@cliqz.com> Date: Thu, 22 May 2014 10:41:39 +0200 Subject: [PATCH 253/347] Added the rest of the parameters to the constructor, too. This resolves #2. --- .../com/gravity/goose/Configuration.scala | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index a093e6154..0f13f12e8 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -49,6 +49,9 @@ import com.gravity.goose.extractors.{StandardContentExtractor, ContentExtractor, * @param socketTimeout Socket timeout for the crawler. * @param browserUserAgent used as the user agent that is sent with your web * requests to extract an article + * @param publishDateExtractor Pass in to extract article publish dates. + * @param additionalDataExtractor Pass in to extract any additional data not + * defined within {@link Article}. */ class Configuration( @BeanProperty @@ -68,26 +71,26 @@ class Configuration( @BeanProperty var browserUserAgent: String = "Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.8) " + - "Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8") { + "Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8", + var contentExtractor: ContentExtractor = StandardContentExtractor, + var publishDateExtractor: PublishDateExtractor = new PublishDateExtractor { + def extract(rootElement: Element): Date = { + null + } + }, + var additionalDataExtractor: AdditionalDataExtractor = + new AdditionalDataExtractor, + var htmlFetcher: AbstractHtmlFetcher = HtmlFetcher) { - var contentExtractor: ContentExtractor = StandardContentExtractor - - var publishDateExtractor: PublishDateExtractor = new PublishDateExtractor { - def extract(rootElement: Element): Date = { - null - } + def setContentExtractor(extractor: ContentExtractor) { + if (extractor == null) throw new IllegalArgumentException("extractor must not be null!") + contentExtractor = extractor } - var additionalDataExtractor: AdditionalDataExtractor = new AdditionalDataExtractor def getPublishDateExtractor: PublishDateExtractor = { publishDateExtractor } - def setContentExtractor(extractor: ContentExtractor) { - if (extractor == null) throw new IllegalArgumentException("extractor must not be null!") - contentExtractor = extractor - } - /** * Pass in to extract article publish dates. * @param extractor a concrete instance of {@link PublishDateExtractor} @@ -111,8 +114,6 @@ class Configuration( this.additionalDataExtractor = extractor } - var htmlFetcher: AbstractHtmlFetcher = HtmlFetcher - def setHtmlFetcher(fetcher: AbstractHtmlFetcher) { require(fetcher != null, "fetcher MUST NOT be null!") this.htmlFetcher = fetcher From b2c29f56534cd8dfd99e752dd04ce9f8fc3dac49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid?= <david@cliqz.com> Date: Thu, 22 May 2014 10:46:31 +0200 Subject: [PATCH 254/347] Fixes #1. --- pom.xml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9fef84cba..214347e9e 100644 --- a/pom.xml +++ b/pom.xml @@ -26,6 +26,13 @@ <type>jar</type> <scope>compile</scope> </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-simple</artifactId> + <version>1.6.1</version> + <type>jar</type> + <scope>compile</scope> + </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> @@ -151,4 +158,4 @@ </plugins> </build> -</project> \ No newline at end of file +</project> From b1aeb84f7513dbe9fc7ec1eeca9d64f3d821c7ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid?= <david@cliqz.com> Date: Thu, 22 May 2014 10:55:19 +0200 Subject: [PATCH 255/347] Fixes #3. --- pom.xml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/pom.xml b/pom.xml index 214347e9e..f6e828dac 100644 --- a/pom.xml +++ b/pom.xml @@ -155,6 +155,22 @@ </execution> </executions> </plugin> + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + <executions> + <execution> + <phase>package</phase> + <goals> + <goal>single</goal> + </goals> + </execution> + </executions> + <configuration> + <descriptorRefs> + <descriptorRef>jar-with-dependencies</descriptorRef> + </descriptorRefs> + </configuration> + </plugin> </plugins> </build> From 5e53041af60346ffc567189a3e42f6e3fc581a64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid?= <david@cliqz.com> Date: Thu, 22 May 2014 11:37:13 +0200 Subject: [PATCH 256/347] Fixes #4. --- src/main/scala/com/gravity/goose/Configuration.scala | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index 0f13f12e8..8d4f57495 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -82,6 +82,12 @@ class Configuration( new AdditionalDataExtractor, var htmlFetcher: AbstractHtmlFetcher = HtmlFetcher) { + /** + * Default constructor for Java interoperability. See + * https://issues.scala-lang.org/browse/SI-4278 why it looks like this. :( + */ + def this() = this(minBytesForImages = 4500) + def setContentExtractor(extractor: ContentExtractor) { if (extractor == null) throw new IllegalArgumentException("extractor must not be null!") contentExtractor = extractor @@ -121,4 +127,4 @@ class Configuration( def getHtmlFetcher: AbstractHtmlFetcher = htmlFetcher -} \ No newline at end of file +} From f3b871b4b406997260ab1df4ea655c1541eacc36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid?= <david@cliqz.com> Date: Thu, 22 May 2014 12:17:20 +0200 Subject: [PATCH 257/347] Resolves #5. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f6e828dac..bf8d7879c 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ <groupId>com.gravity</groupId> <artifactId>goose</artifactId> - <version>2.1.22</version> + <version>2.1.23</version> <packaging>jar</packaging> <name>goose</name> <url>http://maven.apache.org</url> From 7397facd3117a6e484e9e5888ae3c28c97e2b451 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid?= <david@cliqz.com> Date: Mon, 26 May 2014 12:20:22 +0200 Subject: [PATCH 258/347] Replaces tabs with spaces. Fixes #7. --- pom.xml | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/pom.xml b/pom.xml index bf8d7879c..5517420f4 100644 --- a/pom.xml +++ b/pom.xml @@ -27,11 +27,11 @@ <scope>compile</scope> </dependency> <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-simple</artifactId> - <version>1.6.1</version> - <type>jar</type> - <scope>compile</scope> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-simple</artifactId> + <version>1.6.1</version> + <type>jar</type> + <scope>compile</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> @@ -156,20 +156,20 @@ </executions> </plugin> <plugin> - <artifactId>maven-assembly-plugin</artifactId> - <executions> - <execution> - <phase>package</phase> - <goals> - <goal>single</goal> - </goals> - </execution> - </executions> - <configuration> - <descriptorRefs> - <descriptorRef>jar-with-dependencies</descriptorRef> - </descriptorRefs> - </configuration> + <artifactId>maven-assembly-plugin</artifactId> + <executions> + <execution> + <phase>package</phase> + <goals> + <goal>single</goal> + </goals> + </execution> + </executions> + <configuration> + <descriptorRefs> + <descriptorRef>jar-with-dependencies</descriptorRef> + </descriptorRefs> + </configuration> </plugin> </plugins> </build> From 09d1618e3ce96c68d4be7e43e3bf034bbcebc1b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid?= <david@cliqz.com> Date: Mon, 26 May 2014 12:22:41 +0200 Subject: [PATCH 259/347] Added the main class attribute. Fixes #6. --- pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pom.xml b/pom.xml index 5517420f4..bf75fb222 100644 --- a/pom.xml +++ b/pom.xml @@ -166,6 +166,11 @@ </execution> </executions> <configuration> + <archive> + <manifest> + <mainClass>com.gravity.goose.TalkToMeGoose</mainClass> + </manifest> + </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> From 5f3bc137ccc95d142f4b482bc0f81435206cc846 Mon Sep 17 00:00:00 2001 From: darthbear <francois.dangngoc@gmail.com> Date: Tue, 10 Jun 2014 23:53:22 -0400 Subject: [PATCH 260/347] use scala 2.10.4 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f33bb8fe5..df6d7f3be 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <scala.major>2.10</scala.major> - <scala.version>${scala.major}.3</scala.version> + <scala.version>${scala.major}.4</scala.version> </properties> <dependencies> From 170d76fe5c7056a32521a93f10c86bbe0c89960b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid?= <david@cliqz.com> Date: Mon, 16 Jun 2014 15:06:59 +0200 Subject: [PATCH 261/347] Added a check to doTitleSplit(); fixes #8. --- .../goose/extractors/ContentExtractor.scala | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index 51838e335..9956c7849 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -110,18 +110,21 @@ trait ContentExtractor { var largetTextLen: Int = 0 var largeTextIndex: Int = 0 val titlePieces: Array[String] = splitter.split(title) - var i: Int = 0 - while (i < titlePieces.length) { + if (titlePieces.length > 0) { + var i: Int = 0 + while (i < titlePieces.length) { + + val current: String = titlePieces(i) + if (current.length > largetTextLen) { + largetTextLen = current.length + largeTextIndex = i + } + i += 1 - val current: String = titlePieces(i) - if (current.length > largetTextLen) { - largetTextLen = current.length - largeTextIndex = i } - i += 1 - + TITLE_REPLACEMENTS.replaceAll(titlePieces(largeTextIndex)).trim } - TITLE_REPLACEMENTS.replaceAll(titlePieces(largeTextIndex)).trim + else null } private def getMetaContent(doc: Document, metaName: String): String = { From 413d7c94e989afa58e2a55811593bcf596d466ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid?= <david@cliqz.com> Date: Mon, 16 Jun 2014 19:36:59 +0200 Subject: [PATCH 262/347] Added the stopword lists from python-goose. Part of #9. --- README.md | 9 +- .../com/gravity/goose/text/stopwords-ar.txt | 162 ++ .../com/gravity/goose/text/stopwords-da.txt | 101 ++ .../com/gravity/goose/text/stopwords-de.txt | 894 +++++++++++ .../com/gravity/goose/text/stopwords-es.txt | 310 ++++ .../com/gravity/goose/text/stopwords-fi.txt | 68 + .../com/gravity/goose/text/stopwords-fr.txt | 220 +++ .../com/gravity/goose/text/stopwords-hu.txt | 403 +++++ .../com/gravity/goose/text/stopwords-id.txt | 1309 +++++++++++++++++ .../com/gravity/goose/text/stopwords-it.txt | 287 ++++ .../com/gravity/goose/text/stopwords-ko.txt | 70 + .../com/gravity/goose/text/stopwords-nb.txt | 117 ++ .../com/gravity/goose/text/stopwords-nl.txt | 48 + .../com/gravity/goose/text/stopwords-no.txt | 120 ++ .../com/gravity/goose/text/stopwords-pl.txt | 277 ++++ .../com/gravity/goose/text/stopwords-pt.txt | 147 ++ .../com/gravity/goose/text/stopwords-ru.txt | 421 ++++++ .../com/gravity/goose/text/stopwords-sv.txt | 547 +++++++ .../com/gravity/goose/text/stopwords-zh.txt | 125 ++ .../scala/com/gravity/goose/Crawler.scala | 5 +- .../goose/extractors/ContentExtractor.scala | 7 + .../com/gravity/goose/text/WordStats.scala | 6 +- 22 files changed, 5650 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-ar.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-da.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-de.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-es.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-fi.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-fr.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-hu.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-id.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-it.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-ko.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-nb.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-nl.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-no.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-pl.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-pt.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-ru.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-sv.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-zh.txt diff --git a/README.md b/README.md index 47af399be..4f36d76c0 100644 --- a/README.md +++ b/README.md @@ -54,5 +54,12 @@ Here are some of the reasons for the port to Scala: ##Issues + It was a pretty fast Java to Scala port so lots of the nicities of the Scala language aren't in the codebase yet, but those will come over the coming months as we re-write alot of the internal methods to be more Scalesque. -We made sure it was still nice and operable from Java as well so if you're using goose from java you still should be able to use it with a few changes to the method signatures. \ No newline at end of file +We made sure it was still nice and operable from Java as well so if you're using goose from java you still should be able to use it with a few changes to the method signatures. + + +##Goose is now language aware + +The stopword lists introduced in the [Python-Goose project](https://github.com/grangier/python-goose) have been incorporated +into Goose. diff --git a/src/main/resources/com/gravity/goose/text/stopwords-ar.txt b/src/main/resources/com/gravity/goose/text/stopwords-ar.txt new file mode 100644 index 000000000..64e0e7160 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-ar.txt @@ -0,0 +1,162 @@ +فى +في +كل +لم +لن +له +من +هو +هي +قوة +كما +لها +منذ +وقد +ولا +نفسه +لقاء +مقابل +هناك +وقال +وكان +نهاية +وقالت +وكانت +للامم +فيه +كلم +لكن +وفي +وقف +ولم +ومن +وهو +وهي +يوم +فيها +منها +مليار +لوكالة +يكون +يمكن +مليون +حيث +اكد +الا +اما +امس +السابق +التى +التي +اكثر +ايار +ايضا +ثلاثة +الذاتي +الاخيرة +الثاني +الثانية +الذى +الذي +الان +امام +ايام +خلال +حوالى +الذين +الاول +الاولى +بين +ذلك +دون +حول +حين +الف +الى +انه +اول +ضمن +انها +جميع +الماضي +الوقت +المقبل +اليوم +ـ +ف +و +و6 +قد +لا +ما +مع +مساء +هذا +واحد +واضاف +واضافت +فان +قبل +قال +كان +لدى +نحو +هذه +وان +واكد +كانت +واوضح +مايو +ب +ا +أ +، +عشر +عدد +عدة +عشرة +عدم +عام +عاما +عن +عند +عندما +على +عليه +عليها +زيارة +سنة +سنوات +تم +ضد +بعد +بعض +اعادة +اعلنت +بسبب +حتى +اذا +احد +اثر +برس +باسم +غدا +شخصا +صباح +اطار +اربعة +اخرى +بان +اجل +غير +بشكل +حاليا +بن +به +ثم +اف +ان +او +اي +بها +صفر \ No newline at end of file diff --git a/src/main/resources/com/gravity/goose/text/stopwords-da.txt b/src/main/resources/com/gravity/goose/text/stopwords-da.txt new file mode 100644 index 000000000..e8522ef06 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-da.txt @@ -0,0 +1,101 @@ +af +alle +andet +andre +at +begge +da +de +den +denne +der +deres +det +dette +dig +din +dog +du +ej +eller +en +end +ene +eneste +enhver +et +fem +fire +flere +fleste +for +fordi +forrige +fra +få +før +god +han +hans +har +hendes +her +hun +hvad +hvem +hver +hvilken +hvis +hvor +hvordan +hvorfor +hvornår +i +ikke +ind +ingen +intet +jeg +jeres +kan +kom +kommer +lav +lidt +lille +man +mand +mange +med +meget +men +mens +mere +mig +ned +ni +nogen +noget +ny +nyt +nær +næste +næsten +og +op +otte +over +på +se +seks +ses +som +stor +store +syv +ti +til +to +tre +ud +var diff --git a/src/main/resources/com/gravity/goose/text/stopwords-de.txt b/src/main/resources/com/gravity/goose/text/stopwords-de.txt new file mode 100644 index 000000000..37e6714d3 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-de.txt @@ -0,0 +1,894 @@ +der +die +und +in +den +von +zu +mit +ist +das +des +im +für +auf +sich +dem +Die +nicht +ein +eine +als +auch +an +es +er +aus +bei +werden +sie +nach +Der +sind +war +wurde +wird +einer +Das +hat +am +wie +um +Sie +zum +oder +einen +über +dass +einem +noch +bis +nur +vor +zur +durch +so +haben +aber +ich +In +man +mehr +wir +daß +kann +sein +vom +Es +unter +Ich +hatte +gegen +Im +Er +wenn +dieser +seine +eines +können +diese +wieder +wurden +dann +was +schon +Jahr +zwei +seiner +Jahre +Jahren +ihre +gibt +zwischen +Ein +immer +waren +Zeit +Uhr +keine +Wir +sei +habe +sehr +hier +alle +Nach +ab +sowie +da +beim +heute +seit +diesem +uns +soll +Und +Deutschland +Mit +anderen +jedoch +ihr +damit +ersten +drei +Auch +doch +ihm +seinen +Stadt +etwa +sagte +ihn +Eine +sondern +bereits +müssen +ohne +Menschen +will +Prozent +ihrer +worden +Bei +selbst +jetzt +of +Als +seinem +neue +muss +allem +neuen +Ende +nun +Von +geht +ihren +SPD +So +Für +weil +wo +mich +mir +Aber +Am +Diese +ganz +dieses +etwas +andere +Geschichte +Frau +liegt +Wenn +ins +gut +einmal +konnte +Euro +du +denn +viele +Auf +machen +Herr +Leben +the +diesen +erst +lassen +Wie +dort +beiden +erste +The +Teil +deutschen +weiter +also +viel +sollte +dabei +Millionen +Was +später +hatten +während +Welt +ISBN +sagt +denen +wollen +steht +Da +kommt +kein +vier +nichts +de +allerdings +Seite +ob +dazu +gab +s +letzten +kam +USA +wegen +dies +zurück +großen +kommen +alles +rund +ja +sollen +deren +dafür +Doch +Kinder +wäre +Frage +weitere +würde +dessen +große +Januar +zwar +darauf +Arbeit + +Beispiel +September +zusammen +einige +Land +allen +fast +Frauen +März +Namen +Unternehmen +ihrem +davon +Mann +Mai +Platz +deutsche +werde +Oktober +muß +Literatur +Art +ihnen +Deutschen +fünf +gilt +sehen +könnte +Dezember +stehen +sogar +seien +Wer +Seit +August +bin +Beifall +Fall +Juni +eigenen +November +mal +Film +finden +sagen +Regierung +April +München +oft +Dies +lange +ebenfalls +bekannt +Präsident +wohl +CDU/CSU +Zu +gehört +Man +weniger +gerade +statt +aller +Juli +möchte +Weg +Entwicklung +zunächst +ging +Mark +Bild +möglich +gar +besonders +hätte +macht +Politik +geben +Tag +Ihnen +Februar +Hier +Gemeinde +wenig +gewesen +Europa +gehen +gemacht +welche +New +gegenüber +heißt +Familie +Union +tun +Jahrhundert +einfach +Frankfurt +deutlich +Dabei +neben +sollten +Kirche +keinen +Artikel +Ihre +Peter +Thema +besteht +vielen +nie +bzw. +Aus +Zeitung +wollte +Kommission +seines +Hamburg +hätten +Geld +meine +Dr +kaum +zweiten +Während +lässt +Anfang +Um +Ort +weiß +findet +Bereich +Haus +anderem +Mal + +deshalb +alten +erhalten +zehn +Zum +bisher +meisten +darüber +würden +hin +Form +An +bleibt +sieht +Gesellschaft +Berliner +Den +vergangenen +bezeichnet +Nr. +Ziel +je +weit +Grund +sechs +darf +Rolle +Deutsche +wissen +jeder +zeigt +Damit +Denn +mehrere +nächsten +Vor +Dann +schließlich +kleinen +Durch +Michael +km +Lage +Gruppe +Band +damals +Spiel +Sohn +Dr. +stark +Universität +Hilfe +besser +hinter +meist +Seine +St. +stellt +Tage +unsere +daher +Nur +wirklich +führt +Dieser +beispielsweise +kurz +Bericht +gleich +weiteren +Straße +bleiben +Wirtschaft +Siehe +Zukunft +eher +Bedeutung +Recht +insbesondere +Bevölkerung +schnell +nehmen +Verlag +CDU +Tod +Alle +solche +neu +Bundesregierung +pro +Frankreich +Jahres +konnten +Ihr +ließ +Du +kleine +Europäischen +Vater +genannt +lang +Titel +Rahmen +Wort +eigentlich +erhielt +einigen +Woche +FC +Musik +dagegen +Sein +allein +Einsatz +genau +begann +innerhalb +unserer +Partei +Polizei +Wasser +bringen +deutscher +natürlich +eigene + +Wochen +insgesamt +Außerdem +Bis +halten +politischen +musste +Parlament +Meter +Hand +Zahl +stellen +gesagt +führen +daran +Erfolg +befindet +Zur +verschiedenen +Probleme +Unter +Abgeordneten +Milliarden +nahm +stand +geworden +c +liegen +erstmals +Sprache +Fragen +nämlich +Ja +Kollegen +Männer +Nicht +Wolfgang +Problem +Mutter +Minuten +Weitere +Mitte +Mitglied +Jahrhunderts +Krieg +Hans +könnten +Thomas +Über +Personen +Friedrich +ca. +ebenso +machte +York +vielleicht +Stelle +derzeit +Ländern +Höhe +verwendet +gute +überhaupt +Länder +Angaben +führte +gegeben +Tel. +klar +Karl +europäischen +sicher +Saison +Programm +erreicht +GRÜNEN +beide +Sonntag +sowohl +Region +alte +Staaten +Paris +Beginn +Buch +zweite +ganze +hinaus +König +Morgen +handelt +fand +Schweiz +jeweils +Weise +DM +fest +per +blieb +Mitglieder +Richtung +Heute +Stunden +leicht +Leute +wobei +gehören +bietet +Wien +politische +Folge +Blick +aufgrund +Entscheidung +Dort +Neben +hält +Gebiet +gemeinsam +erklärt +direkt +könne +Daten +recht +schwer +Bayern +jeden +Name +Schule +GmbH +dürfen +laut +Seiten +Bürger +Eltern +dpa +Meinung +Werke +Jetzt +letzte +Spieler +bald +London +häufig +heutigen +Einwohner +acht +eben +Internet +Markt +dich +Nein +Situation +System +zuvor +Möglichkeit +Freitag +mein +Mannheim +Fenster +Kosten +inzwischen +kamen +John +sieben +bekommen +erreichen +unser +Verfügung +Köln +Dazu +besten +Zusammenhang +Reihe +Kritik +richtig +Liste +Herren +Augen +taz +zeigen +siehe +hohen +spielte +leben +völlig +Neue +ihres +spielt +Sicherheit +weiterhin +hoch +nachdem +gegründet +erneut +sah +z. +wer +Informationen +anders +spielen +Dieses +gleichen +Kultur +größten +eingesetzt +Unterstützung +Beim +erklärte +Allerdings +Firma +Amt +Kopf +trotz +Erst +gebracht +gestellt +läuft +schließen +Bilder +nimmt +Mitarbeiter +BÜNDNIS +Deshalb +verschiedene +zudem +Werk +Ergebnis +Heinrich +Bau +ehemaligen +Preis +Tochter +Stuttgart +Samstag +Bad +Verfahren +Kind +früher +Paul +darin +paar +Punkt +Weblinks +Nun +Maßnahmen +Österreich +Wilhelm +Herrn +z.B. +Noch +Staat +Zusammenarbeit +knapp +Nacht +einzelnen +trat +gestern +Team +Osten +scheint +Mannschaft +Tagen +internationalen +jede +mindestens +teilweise +einzige +Soldaten +setzt +gefunden +Kunst +lediglich +öffentlichen +bedeutet +Raum +gewann +Kampf +Martin +Ist +Begriff +Hause +entwickelt +Wahl +Schon +arbeiten +größte +Donnerstag +Ab +Viele +Quellen +Nachdem +dadurch +Italien +erster +gekommen +dir +Mittwoch +danach +stellte +her +zahlreiche +Landes +Gesetz +Monaten +PDS +Rat +Franz +Verein +sonst +Frankfurter +Meine +Klaus +Karriere +müsse +meiner +anderer +zuletzt +Monate +Alter +hohe +Interesse +Regie +Montag +genommen +lag +Sommer +spricht +Trainer +Liebe +jedem +/DIE +Westen +guten +Kilometer +Johann +gesehen +darunter +solchen +indem +Mittel +oben +Schweizer +wichtig +Hälfte +Regel +obwohl +Bürgermeister +Aufgabe +Spiele +folgenden +Dienstag +version +Sache +sprechen +Gemeinden +electronic +for +Norden +außerdem +Antrag +gleichzeitig +ganzen +Politiker +gehörte +großer +China +Nähe +bereit +setzte +Druck +tatsächlich +Gott +frei +Grünen +zumindest +Opfer +genug +versucht +bevor \ No newline at end of file diff --git a/src/main/resources/com/gravity/goose/text/stopwords-es.txt b/src/main/resources/com/gravity/goose/text/stopwords-es.txt new file mode 100644 index 000000000..f562e4bba --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-es.txt @@ -0,0 +1,310 @@ +de +la +que +el +en +y +a +los +del +se +las +por +un +para +con +no +una +su +al +lo +como +más +pero +sus +le +ya +o +este +sí +porque +esta +entre +cuando +muy +sin +sobre +también +me +hasta +hay +donde +quien +desde +todo +nos +durante +todos +uno +les +ni +contra +otros +ese +eso +ante +ellos +e +esto +mí +antes +algunos +qué +unos +yo +otro +otras +otra +él +tanto +esa +estos +mucho +quienes +nada +muchos +cual +poco +ella +estar +estas +algunas +algo +nosotros +mi +mis +tú +te +ti +tu +tus +ellas +nosotras +vosotros +vosotras +os +mío +mía +míos +mías +tuyo +tuya +tuyos +tuyas +suyo +suya +suyos +suyas +nuestro +nuestra +nuestros +nuestras +vuestro +vuestra +vuestros +vuestras +esos +esas +estoy +estás +está +estamos +estáis +están +esté +estés +estemos +estéis +estén +estaré +estarás +estará +estaremos +estaréis +estarán +estaría +estarías +estaríamos +estaríais +estarían +estaba +estabas +estábamos +estabais +estaban +estuve +estuviste +estuvo +estuvimos +estuvisteis +estuvieron +estuviera +estuvieras +estuviéramos +estuvierais +estuvieran +estuviese +estuvieses +estuviésemos +estuvieseis +estuviesen +estando +estado +estada +estados +estadas +estad +he +has +ha +hemos +habéis +han +haya +hayas +hayamos +hayáis +hayan +habré +habrás +habrá +habremos +habréis +habrán +habría +habrías +habríamos +habríais +habrían +había +habías +habíamos +habíais +habían +hube +hubiste +hubo +hubimos +hubisteis +hubieron +hubiera +hubieras +hubiéramos +hubierais +hubieran +hubiese +hubieses +hubiésemos +hubieseis +hubiesen +habiendo +habido +habida +habidos +habidas + +# forms of ser, to be (not including the infinitive): +soy +eres +es +somos +sois +son +sea +seas +seamos +seáis +sean +seré +serás +será +seremos +seréis +serán +sería +serías +seríamos +seríais +serían +era +eras +éramos +erais +eran +fui +fuiste +fue +fuimos +fuisteis +fueron +fuera +fueras +fuéramos +fuerais +fueran +fuese +fueses +fuésemos +fueseis +fuesen +siendo +sido +tengo +tienes +tiene +tenemos +tenéis +tienen +tenga +tengas +tengamos +tengáis +tengan +tendré +tendrás +tendrá +tendremos +tendréis +tendrán +tendría +tendrías +tendríamos +tendríais +tendrían +tenía +tenías +teníamos +teníais +tenían +tuve +tuviste +tuvo +tuvimos +tuvisteis +tuvieron +tuviera +tuvieras +tuviéramos +tuvierais +tuvieran +tuviese +tuvieses +tuviésemos +tuvieseis +tuviesen +teniendo +tenido +tenida +tenidos +tenidas +tened diff --git a/src/main/resources/com/gravity/goose/text/stopwords-fi.txt b/src/main/resources/com/gravity/goose/text/stopwords-fi.txt new file mode 100644 index 000000000..3b468b32c --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-fi.txt @@ -0,0 +1,68 @@ +alla +ansiosta +ehkä +ei +enemmän +ennen +etessa +f +haikki +he +hitaasti +hoikein +hyvin +hän +ilman +ja +jos +jälkeen +kanssa +kaukana +kenties +keskellä +kesken +koskaan +kuinkan +kukka +kylliksi +kyllä +liian +lla +lla +luona +lähellä +läpi +me +miksi +mikä +milloin +milloinkan +minä +missä +miten +nopeasti +nyt +oikea +oikealla +paljon +siellä +sinä +ssa +sta +suoraan +tai +takana +takia +tarpeeksi +te +tässä +ulkopuolella +vahemmän +vasen +vasenmalla +vastan +vielä +vieressä +vähän +yhdessä +ylös diff --git a/src/main/resources/com/gravity/goose/text/stopwords-fr.txt b/src/main/resources/com/gravity/goose/text/stopwords-fr.txt new file mode 100644 index 000000000..30e06ef28 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-fr.txt @@ -0,0 +1,220 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (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.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +#----------------------------------------------------------------------- +# a couple of test stopwords to test that the words are really being +# configured from this file: +stopworda +stopwordb + +#Standard english stop words taken from Lucene's StopAnalyzer +a +an +and +are +as +at +be +but +by +for +if +in +into +is +it +no +not +of +on +or +s +such +t +that +the +their +then +there +these +they +this +to +was +will +with +au +aux +avec +ce +ces +dans +de +des +du +elle +en +et +eux +il +je +la +le +leur +lui +ma +mais +me +même +mes +moi +mon +ne +nos +notre +nous +on +ou +par +pas +pour +qu +que +qui +sa +se +ses +son +sur +ta +te +tes +toi +ton +tu +un +une +vos +votre +vous +c +d +j +l +à +m +n +s +t +y +été +étée +étées +étés +étant +suis +es +est +sommes +êtes +sont +serai +seras +sera +serons +serez +seront +serais +serait +serions +seriez +seraient +étais +était +étions +étiez +étaient +fus +fut +fûmes +fûtes +furent +sois +soit +soyons +soyez +soient +fusse +fusses +fût +fussions +fussiez +fussent +ayant +eu +eue +eues +eus +ai +as +avons +avez +ont +aurai +auras +aura +aurons +aurez +auront +aurais +aurait +aurions +auriez +auraient +avais +avait +avions +aviez +avaient +eut +eûmes +eûtes +eurent +aie +aies +ait +ayons +ayez +aient +eusse +eusses +eût +eussions +eussiez +eussent +ceci +celà +cet +cette +ici +ils +les +leurs +quel +quels +quelle +quelles +sans +soi diff --git a/src/main/resources/com/gravity/goose/text/stopwords-hu.txt b/src/main/resources/com/gravity/goose/text/stopwords-hu.txt new file mode 100644 index 000000000..694feb102 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-hu.txt @@ -0,0 +1,403 @@ +a +á +ahogy +ahol +aki +akik +akkor +alatt +által +általában +amely +amelyek +amelyekben +amelyeket +amelyet +amelynek +ami +amit +amolyan +amp +amíg +amikor +át +abban +ahhoz +annak +arra +arról +az +azok +azon +azt +azzal +azért +aztán +azután +azonban +b +bár +be +belül +benne +c +cikk +cikkek +cikkeket +csak +d +de +e +é +eddig +egész +egy +egyes +egyetlen +egyéb +egyik +egyre +ekkor +el +elég +ellen +elő +először +előtt +első +én +éppen +ebben +ehhez +emilyen +ennek +erre +ez +ezt +ezek +ezen +ezzel +ezért +és +f +fel +felé +g +h +hanem +hiszen +hogy +hogyan +i +í +igen +így +illetve +ill. +ill +ilyen +ilyenkor +is +ison +ismét +itt +j +jó +jól +jobban +k +kell +kellett +keresztül +keressünk +ki +kívül +között +közül +l +legalább +lehet +lehetett +legyen +lenne +lenni +lesz +lett +m +maga +magát +majd +majd +már +más +másik +meg +még +mellett +mert +mely +melyek +mi +mit +míg +miért +milyen +mikor +minden +mindent +mindenki +mindig +mint +mintha +mivel +most +n +nagy +nagyobb +nagyon +ne +néha +nekem +neki +nem +néhány +nélkül +nincs +o +ó +olyan +ott +össze +ö +ő +ők +őket +p +pedig +persze +q +r +rá +s +saját +sem +semmi +sok +sokat +sokkal +sz +számára +szemben +szerint +szinte +t +talán +tehát +teljes +tovább +továbbá +több +u +ú +úgy +ugyanis +új +újabb +újra +után +utána +utolsó +ü +ű +v +vagy +vagyis +valaki +valamely +valami +valamint +való +vagyok +van +vannak +volt +voltam +voltak +voltunk +vissza +vele +viszont +volna +számolnak +szólnak +szól +w +x +y +z +zs +a +ahogy +ahol +aki +akkor +alatt +általában +által +amely +amíg +amikor +ami +amolyan +arra +át +az +azért +azonban +azon +aztán +azt +azután +azzal +bár +be +belül +benne +cikk +csak +de +eddig +egész +egy +egyéb +egyes +egyetlen +egyik +egyre +ekkor +el +elég +ellen +elő +először +előtt +első +emilyen +én +éppen +erre +és +e +ez +ezen +ezért +ezzel +fel +felé +hanem +hiszen +hogy +hogyan +igen +így +ill. +illetve +ill +ilyen +ilyenkor +ismét +ison +itt +jó +jobban +jól +kell +keres +keresztül +ki +kívül +között +közül +legalább +legyen +lehet +lenni +lett +maga +maga +majd +már +más +másik +még +meg +mellett +mely +mert +miért +míg +mikor +milyen +minden +mindenki +mindig +mi +mint +mintha +mivel +most +nagy +nagyobb +nagyon +ne +néha +néhány +neki +nélkül +nem +nincs +ők +olyan +ő +össze +ott +pedig +persze +rá +saját +s +sem +semmi +sokkal +sok +számára +számol +szemben +szerint +szinte +szól +talán +tehát +teljes +továbbá +tovább +úgy +ugyanis +új +újabb +újra +utána +után +utolsó +vagy +vagyis +valaki +valamely +valami +valamint +való +van +vissza +viszont +volt + diff --git a/src/main/resources/com/gravity/goose/text/stopwords-id.txt b/src/main/resources/com/gravity/goose/text/stopwords-id.txt new file mode 100644 index 000000000..418f43f9a --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-id.txt @@ -0,0 +1,1309 @@ +a +abad +acara +aceh +ada +adalah +adanya +adapun +agak +agaknya +agama +agar +agustus +air +akan +akankah +akhir +akhiri +akhirnya +akibat +aku +akulah +alam +album +amat +amatlah +amerika +anak +and +anda +andalah +anggota +antar +antara +antarabangsa +antaranya +apa +apaan +apabila +apakah +apalagi +apatah +api +april +artikel +artinya +as +asal +asalkan +asas +asia +asing +atas +atau +ataukah +ataupun +australia +awal +awalnya +awam +b +badan +bagai +bagaikan +bagaimana +bagaimanakah +bagaimanapun +bagainamakah +bagi +bagian +bahagian +bahan +baharu +bahasa +bahawa +bahkan +bahwa +bahwasannya +bahwasanya +baik +baiknya +bakal +bakalan +balik +bandar +bangsa +bank +banyak +bapak +barang +barangan +barat +baru +baru-baru +bawah +beberapa +begini +beginian +beginikah +beginilah +begitu +begitukah +begitulah +begitupun +bekas +bekerja +belakang +belakangan +belanda +beli +beliau +belum +belumlah +benar +benarkah +benarlah +bentuk +berada +berakhir +berakhirlah +berakhirnya +berapa +berapakah +berapalah +berapapun +berarti +berasal +berat +berawal +berbagai +berbanding +berbeda +berdasarkan +berdatangan +berharap +berhasil +beri +berikan +berikut +berikutan +berikutnya +berita +berjalan +berjaya +berjumlah +berkaitan +berkali +berkali-kali +berkata +berkehendak +berkeinginan +berkenaan +berlainan +berlaku +berlalu +berlangsung +berlebihan +bermacam +bermacam-macam +bermain +bermaksud +bermula +bernama +bernilai +bersama +bersama-sama +bersiap +bertanya +bertemu +berturut +bertutur +berubah +berujar +berupa +besar +besok +betul +betulkah +bhd +biasa +biasanya +bidang +bila +bilakah +bilion +bintang +bisa +bisakah +blog +bn +bola +boleh +bolehkah +bolehlah +buat +bukan +bukankah +bukanlah +bukannya +buku +bulan +bumi +bung +bursa +cadangan +cara +caranya +catch +china +click +code +copyright +cukup +cukupkah +cukuplah +cuma +daerah +dagangan +dahulu +dalam +dan +dana +dapat +dari +daripada +dasar +data +datang +datuk +dekat +demi +demikian +demikianlah +dengan +depan +derivatives +desa +desember +detik +dewan +di +dia +diadakan +diakhiri +diakhirinya +dialah +dianggap +diantara +diantaranya +diberi +diberikan +diberikannya +dibuat +dibuatnya +dibuka +dicatatkan +didapat +didatangkan +didirikan +diduga +digunakan +diibaratkan +diibaratkannya +diingat +diingatkan +diinginkan +dijangka +dijawab +dijelaskan +dijelaskannya +dikarenakan +dikatakan +dikatakannya +dikenal +dikerjakan +diketahui +diketahuinya +dikira +dilakukan +dilalui +dilihat +dimaksud +dimaksudkan +dimaksudkannya +dimaksudnya +dimana +diminta +dimintai +dimisalkan +dimulai +dimulailah +dimulainya +dimungkinkan +dini +diniagakan +dipastikan +diperbuat +diperbuatnya +dipergunakan +diperkirakan +diperlihatkan +diperlukan +diperlukannya +dipersoalkan +dipertanyakan +dipunyai +diri +dirilis +dirinya +dis +disampaikan +disebut +disebutkan +disebutkannya +disember +disini +disinilah +distrik +ditambahkan +ditandaskan +ditanya +ditanyai +ditanyakan +ditegaskan +ditemukan +ditujukan +ditunjuk +ditunjuki +ditunjukkan +ditunjukkannya +ditunjuknya +ditutup +dituturkan +dituturkannya +diucapkan +diucapkannya +diungkapkan +document.write +dolar +dong +dr +dua +dulu +dunia +effective +ekonomi +eksekutif +eksport +empat +enam +enggak +enggaknya +entah +entahlah +era +eropa +err +faedah +feb +film +gat +gedung +gelar +gettracker +global +grup +guna +gunakan +gunung +hadap +hadapan +hal +hampir +hanya +hanyalah +harga +hari +harian +harus +haruslah +harusnya +hasil +hendak +hendaklah +hendaknya +hidup +hingga +https +hubungan +hukum +hutan +i +ia +iaitu +ialah +ibarat +ibaratkan +ibaratnya +ibu +ii +iklan +ikut +ilmu +indeks +india +indonesia +industri +informasi +ingat +inggris +ingin +inginkah +inginkan +ini +inikah +inilah +internasional +islam +isnin +isu +italia +itu +itukah +itulah +jabatan +jadi +jadilah +jadinya +jakarta +jalan +jalur +jaman +jan +jangan +jangankan +janganlah +januari +jauh +jawa +jawab +jawaban +jawabnya +jawatan +jawatankuasa +jelas +jelaskan +jelaslah +jelasnya +jenis +jepang +jepun +jerman +jika +jikalau +jiwa +jual +jualan +juga +julai +jumaat +jumat +jumlah +jumlahnya +jun +juni +justru +juta +kabar +kabupaten +kadar +kala +kalangan +kalau +kalaulah +kalaupun +kali +kalian +kalimantan +kami +kamilah +kamis +kamu +kamulah +kan +kantor +kapal +kapan +kapankah +kapanpun +karena +karenanya +karya +kasus +kata +katakan +katakanlah +katanya +kaunter +kawasan +ke +keadaan +kebetulan +kebutuhan +kecamatan +kecil +kedua +kedua-dua +keduanya +kedudukan +kegiatan +kehidupan +keinginan +kejadian +kekal +kelamaan +kelihatan +kelihatannya +kelima +kelompok +keluar +keluarga +kelurahan +kembali +kementerian +kemudahan +kemudian +kemungkinan +kemungkinannya +kenaikan +kenapa +kenyataan +kepada +kepadanya +kepala +kepentingan +keputusan +kerajaan +kerana +kereta +kerja +kerjasama +kes +kesampaian +keselamatan +keseluruhan +keseluruhannya +kesempatan +kesihatan +keterangan +keterlaluan +ketiga +ketika +ketua +keuntungan +kewangan +khamis +khusus +khususnya +kini +kinilah +kira +kira-kira +kiranya +kita +kitalah +klci +klibor +klik +km +kok +komentar +kompas +komposit +kondisi +kontrak +korban +korea +kos +kota +kuala +kuasa +kukuh +kumpulan +kurang +kurangnya +lagi +lagian +lagu +lah +lain +lainnya +laku +lalu +lama +lamanya +langkah +langsung +lanjut +lanjutnya +laporan +laut +lebih +lembaga +lepas +lewat +lima +lingkungan +login +lokasi +lot +luar +luas +lumpur +mac +macam +mahkamah +mahu +majlis +maka +makanan +makanya +makin +maklumat +malah +malahan +malam +malaysia +mampu +mampukah +mana +manakala +manalagi +mantan +manusia +masa +masalah +masalahnya +masih +masihkah +masing +masing-masing +masuk +masyarakat +mata +mau +maupun +measure +media +mei +melainkan +melakukan +melalui +melawan +melihat +melihatnya +memandangkan +memang +memastikan +membantu +membawa +memberi +memberikan +membolehkan +membuat +memerlukan +memihak +memiliki +meminta +memintakan +memisalkan +memperbuat +mempergunakan +memperkirakan +memperlihatkan +mempersiapkan +mempersoalkan +mempertanyakan +mempunyai +memulai +memungkinkan +menaiki +menambah +menambahkan +menandaskan +menanti +menantikan +menanya +menanyai +menanyakan +menarik +menawarkan +mencapai +mencari +mencatatkan +mendapat +mendapatkan +mendatang +mendatangi +mendatangkan +menegaskan +menerima +menerusi +mengadakan +mengakhiri +mengaku +mengalami +mengambil +mengapa +mengatakan +mengatakannya +mengenai +mengerjakan +mengetahui +menggalakkan +menggunakan +menghadapi +menghendaki +mengibaratkan +mengibaratkannya +mengikut +mengingat +mengingatkan +menginginkan +mengira +mengucapkan +mengucapkannya +mengumumkan +mengungkapkan +mengurangkan +meninggal +meningkat +meningkatkan +menjadi +menjalani +menjawab +menjelang +menjelaskan +menokok +menteri +menuju +menunjuk +menunjuki +menunjukkan +menunjuknya +menurut +menuturkan +menyaksikan +menyampaikan +menyangkut +menyatakan +menyebabkan +menyebutkan +menyediakan +menyeluruh +menyiapkan +merasa +mereka +merekalah +merosot +merupakan +meski +meskipun +mesyuarat +metrotv +meyakini +meyakinkan +milik +militer +minat +minggu +minta +minyak +mirip +misal +misalkan +misalnya +mobil +modal +mohd +mudah +mula +mulai +mulailah +mulanya +muncul +mungkin +mungkinkah +musik +musim +nah +naik +nama +namun +nanti +nantinya +nasional +negara +negara-negara +negeri +new +niaga +nilai +nomor +noun +nov +november +numeral +numeralia +nya +nyaris +nyatanya +of +ogos +okt +oktober +olah +oleh +olehnya +operasi +orang +organisasi +pada +padahal +padanya +pagetracker +pagi +pak +paling +pameran +panjang +pantas +papan +para +paras +parlimen +partai +parti +particle +pasar +pasaran +password +pasti +pastilah +pasukan +paticle +pegawai +pejabat +pekan +pekerja +pelabur +pelaburan +pelancongan +pelanggan +pelbagai +peluang +pemain +pembangunan +pemberita +pembinaan +pemerintah +pemerintahan +pemimpin +pendapatan +pendidikan +penduduk +penerbangan +pengarah +pengeluaran +pengerusi +pengguna +penggunaan +pengurusan +peniaga +peningkatan +penting +pentingnya +per +perancis +perang +peratus +percuma +perdagangan +perdana +peringkat +perjanjian +perkara +perkhidmatan +perladangan +perlu +perlukah +perlunya +permintaan +pernah +perniagaan +persekutuan +persen +persidangan +persoalan +pertama +pertandingan +pertanyaan +pertanyakan +pertubuhan +pertumbuhan +perubahan +perusahaan +pesawat +peserta +petang +pihak +pihaknya +pilihan +pinjaman +polis +polisi +politik +pos +posisi +presiden +prestasi +produk +program +projek +pronomia +pronoun +proses +proton +provinsi +pt +pubdate +pukul +pula +pulau +pun +punya +pusat +rabu +radio +raja +rakan +rakyat +ramai +rantau +rasa +rasanya +rata +raya +rendah +republik +resmi +ribu +ringgit +root +ruang +rumah +rupa +rupanya +saat +saatnya +sabah +sabtu +sahaja +saham +saja +sajalah +sakit +salah +saling +sama +sama-sama +sambil +sampai +sampaikan +sana +sangat +sangatlah +sarawak +satu +sawit +saya +sayalah +sdn +se +sebab +sebabnya +sebagai +sebagaimana +sebagainya +sebagian +sebahagian +sebaik +sebaiknya +sebaliknya +sebanyak +sebarang +sebegini +sebegitu +sebelah +sebelum +sebelumnya +sebenarnya +seberapa +sebesar +sebetulnya +sebisanya +sebuah +sebut +sebutlah +sebutnya +secara +secukupnya +sedang +sedangkan +sedemikian +sedikit +sedikitnya +seenaknya +segala +segalanya +segera +segi +seharusnya +sehingga +seingat +sejak +sejarah +sejauh +sejenak +sejumlah +sekadar +sekadarnya +sekali +sekali-kali +sekalian +sekaligus +sekalipun +sekarang +sekaranglah +sekecil +seketika +sekiranya +sekitar +sekitarnya +sekolah +sektor +sekurang +sekurangnya +sekuriti +sela +selagi +selain +selaku +selalu +selama +selama-lamanya +selamanya +selanjutnya +selasa +selatan +selepas +seluruh +seluruhnya +semacam +semakin +semalam +semampu +semampunya +semasa +semasih +semata +semaunya +sementara +semisal +semisalnya +sempat +semua +semuanya +semula +sen +sendiri +sendirian +sendirinya +senin +seolah +seolah-olah +seorang +sepak +sepanjang +sepantasnya +sepantasnyalah +seperlunya +seperti +sepertinya +sepihak +sept +september +serangan +serantau +seri +serikat +sering +seringnya +serta +serupa +sesaat +sesama +sesampai +sesegera +sesekali +seseorang +sesi +sesuai +sesuatu +sesuatunya +sesudah +sesudahnya +setelah +setempat +setengah +seterusnya +setiap +setiausaha +setiba +setibanya +setidak +setidaknya +setinggi +seusai +sewaktu +siap +siapa +siapakah +siapapun +siaran +sidang +singapura +sini +sinilah +sistem +soal +soalnya +sokongan +sri +stasiun +suara +suatu +sudah +sudahkah +sudahlah +sukan +suku +sumber +sungai +supaya +surat +susut +syarikat +syed +tadi +tadinya +tahap +tahu +tahun +tak +tama +tambah +tambahnya +tampak +tampaknya +tampil +tan +tanah +tandas +tandasnya +tanggal +tanpa +tanya +tanyakan +tanyanya +tapi +tawaran +tegas +tegasnya +teknologi +telah +televisi +teman +tempat +tempatan +tempo +tempoh +tenaga +tengah +tentang +tentara +tentu +tentulah +tentunya +tepat +terakhir +terasa +terbaik +terbang +terbanyak +terbesar +terbuka +terdahulu +terdapat +terdiri +terhadap +terhadapnya +teringat +terjadi +terjadilah +terjadinya +terkait +terkenal +terkira +terlalu +terlebih +terletak +terlihat +termasuk +ternyata +tersampaikan +tersebut +tersebutlah +tertentu +tertuju +terus +terutama +testimoni +testimony +tetap +tetapi +the +tiada +tiap +tiba +tidak +tidakkah +tidaklah +tidaknya +tiga +tim +timbalan +timur +tindakan +tinggal +tinggi +tingkat +toh +tokoh +try +tun +tunai +tunjuk +turun +turut +tutur +tuturnya +tv +uang +ucap +ucapnya +udara +ujar +ujarnya +umum +umumnya +unescape +ungkap +ungkapnya +unit +universitas +untuk +untung +upaya +urus +usah +usaha +usai +user +utama +utara +var +versi +waduh +wah +wahai +wakil +waktu +waktunya +walau +walaupun +wang +wanita +warga +warta +wib +wilayah +wong +word +ya +yaitu +yakin +yakni +yang +zaman \ No newline at end of file diff --git a/src/main/resources/com/gravity/goose/text/stopwords-it.txt b/src/main/resources/com/gravity/goose/text/stopwords-it.txt new file mode 100644 index 000000000..98ffee1d6 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-it.txt @@ -0,0 +1,287 @@ +ad +al +allo +ai +agli +all +agl +alla +alle +con +col +coi +da +dal +dallo +dai +dagli +dall +dagl +dalla +dalle +di +del +dello +dei +degli +dell +degl +della +delle +in +nel +nello +nei +negli +nell +negl +nella +nelle +su +sul +sullo +sui +sugli +sull +sugl +sulla +sulle +per +tra +contro +io +tu +lui +lei +noi +voi +loro +mio +mia +miei +mie +tuo +tua +tuoi +tue +suo +sua +suoi +sue +nostro +nostra +nostri +nostre +vostro +vostra +vostri +vostre +mi +ti +ci +vi +lo +la +li +le +gli +ne +il +un +uno +una +ma +ed +se +perchè +perché +perche +anche +come +dov +dove +che +chi +cui +non +più +piu +quale +quanto +quanti +quanta +quante +quello +quelli +quella +quelle +questo +questi +questa +queste +si +tutto +tutti +a +c +e +i +l +o +ho +hai +ha +abbiamo +avete +hanno +abbia +abbiate +abbiano +avrò +avro +avrai +avrà +avra +avremo +avrete +avranno +avrei +avresti +avrebbe +avremmo +avreste +avrebbero +avevo +avevi +aveva +avevamo +avevate +avevano +ebbi +avesti +ebbe +avemmo +aveste +ebbero +avessi +avesse +avessimo +avessero +avendo +avuto +avuta +avuti +avute +sono +sei +è +é +e +siamo +siete +sia +siate +siano +sarà +sarai +sarò +saro +saremo +sarete +saranno +sarei +saresti +sarebbe +saremmo +sareste +sarebbero +ero +eri +era +eravamo +eravate +erano +fui +fosti +fu +fummo +foste +furono +fossi +fosse +fossimo +fossero +essendo +faccio +fai +facciamo +fanno +faccia +facciate +facciano +farà +farai +farò +faremo +farete +faranno +farei +faresti +farebbe +faremmo +fareste +farebbero +facevo +facevi +faceva +facevamo +facevate +facevano +feci +facesti +fece +facemmo +faceste +fecero +facessi +facesse +facessimo +facessero +facendo +sto +stai +sta +stiamo +stanno +stia +stiate +stiano +starà +starai +starò +staremo +starete +staranno +starei +staresti +starebbe +staremmo +stareste +starebbero +stavo +stavi +stava +stavamo +stavate +stavano +stetti +stesti +stette +stemmo +steste +stettero +stessi +stesse +stessimo +stessero +stando diff --git a/src/main/resources/com/gravity/goose/text/stopwords-ko.txt b/src/main/resources/com/gravity/goose/text/stopwords-ko.txt new file mode 100644 index 000000000..a6746f776 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-ko.txt @@ -0,0 +1,70 @@ +을 +의 +에 +이 +를 +으로 +은 +는 +가 +로 +하고 +과 +에서 +도 +와 +이다 +고 +부터 +까지 +께 +에는 +이라고 +만 +라고 +보다 +에도 +다 +토록 +에게 +나 +대로 +에서는 +이나 +이며 +요 +든 +으로써 +같이 +로는 +밖에 +과의 +며 +로부터 +처럼 +아 +라 +여 +으로는 +이고 +에서의 +이라는 +만에 +으로부터 +에서도 +와의 +엔 +만을 +부터는 +만의 +야 +까지의 +과는 +치고 +과를 +으로의 +까지는 +보다는 +만이 +에만 +로의 \ No newline at end of file diff --git a/src/main/resources/com/gravity/goose/text/stopwords-nb.txt b/src/main/resources/com/gravity/goose/text/stopwords-nb.txt new file mode 100644 index 000000000..bb9edb15e --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-nb.txt @@ -0,0 +1,117 @@ +alle +andre +arbeid +av +begge +bort +bra +bruke +da +denne +der +deres +det +din +disse +du +eller +en +ene +eneste +enhver +enn +er +et +folk +for +fordi +forsÛke +fra +fÅ +fÛr +fÛrst +gjorde +gjÛre +god +gÅ +ha +hadde +han +hans +hennes +her +hva +hvem +hver +hvilken +hvis +hvor +hvordan +hvorfor +ikke +inn +innen +kan +kunne +lage +lang +lik +like +makt +mange +med +meg +meget +men +mens +mer +mest +min +mye +mÅ +mÅte +navn +nei +ny +nÅ +nÅr +og +ogsÅ +om +opp +oss +over +part +punkt +pÅ +rett +riktig +samme +sant +si +siden +sist +skulle +slik +slutt +som +start +stille +tid +til +tilbake +tilstand +under +ut +uten +var +ved +verdi +vi +vil +ville +vite +vÅr +vÖre +vÖrt +Å diff --git a/src/main/resources/com/gravity/goose/text/stopwords-nl.txt b/src/main/resources/com/gravity/goose/text/stopwords-nl.txt new file mode 100644 index 000000000..300c36833 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-nl.txt @@ -0,0 +1,48 @@ +aan +af +al +als +bij +dan +dat +die +dit +een +en +er +had +heb +hem +het +hij +hoe +hun +ik +in +is +je +kan +me +men +met +mij +nog +nu +of +ons +ook +te +tot +uit +van +was +wat +we +wel +wij +zal +ze +zei +zij +zo +zou diff --git a/src/main/resources/com/gravity/goose/text/stopwords-no.txt b/src/main/resources/com/gravity/goose/text/stopwords-no.txt new file mode 100644 index 000000000..4b14918b2 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-no.txt @@ -0,0 +1,120 @@ +at +av +de +den +der +det +du +en +er +et +for +fra +før +med +og +om +over +på +som +til +ved +år +alle +bare +ble +bort +bra +da +deg +dem +denne +dere +deres +det +dette +din +disse +dit +ditt +eller +ene +enn +er +et +ett +etter +for +fram +først +få +god +gå +ha +han +hans +har +her +hit +hun +hva +hvem +hver +ikke +inn +ja +jeg +kan +kom +kun +kunne +lage +lang +lik +like +man +mer +min +mot +mye +må +måte +ned +nei +noe +noen +ny +nå +når +også +opp +oss +seg +selv +si +siden +sin +sine +sist +skal +skulle +slik +som +så +sånn +tid +til +under +ut +uten +var +ved +vi +vil +vite +vår +å +dei +di +då +eg \ No newline at end of file diff --git a/src/main/resources/com/gravity/goose/text/stopwords-pl.txt b/src/main/resources/com/gravity/goose/text/stopwords-pl.txt new file mode 100644 index 000000000..93dac8291 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-pl.txt @@ -0,0 +1,277 @@ +a +aby +ach +acz +aczkolwiek +aj +albo +ale +ależ +ani +aż +bardziej +bardzo +bo +bowiem +by +byli +bynajmniej +być +był +była +było +były +będzie +będą +cali +cała +cały +ci +cię +ciebie +co +cokolwiek +coś +czasami +czasem +czemu +czy +czyli +daleko +dla +dlaczego +dlatego +do +dobrze +dokąd +dość +dużo +dwa +dwaj +dwie +dwoje +dziś +dzisiaj +gdy +gdyby +gdyż +gdzie +gdziekolwiek +gdzieś +i +ich +ile +im +inna +inne +inny +innych +iż +ja +ją +jak +jakaś +jakby +jaki +jakichś +jakie +jakiś +jakiż +jakkolwiek +jako +jakoś +je +jeden +jedna +jedno +jednak +jednakże +jego +jej +jemu +jest +jestem +jeszcze +jeśli +jeżeli +już +ją +każdy +kiedy +kilka +kimś +kto +ktokolwiek +ktoś +która +które +którego +której +który +których +którym +którzy +ku +lat +lecz +lub +ma +mają +mało +mam +mi +mimo +między +mną +mnie +mogą +moi +moim +moja +moje +może +możliwe +można +mój +mu +musi +my +na +nad +nam +nami +nas +nasi +nasz +nasza +nasze +naszego +naszych +natomiast +natychmiast +nawet +nią +nic +nich +nie +niech +niego +niej +niemu +nigdy +nim +nimi +niż +no +o +obok +od +około +on +ona +one +oni +ono +oraz +oto +owszem +pan +pana +pani +po +pod +podczas +pomimo +ponad +ponieważ +powinien +powinna +powinni +powinno +poza +prawie +przecież +przed +przede +przedtem +przez +przy +roku +również +sam +sama +są +się +skąd +sobie +sobą +sposób +swoje +ta +tak +taka +taki +takie +także +tam +te +tego +tej +temu +ten +teraz +też +to +tobą +tobie +toteż +trzeba +tu +tutaj +twoi +twoim +twoja +twoje +twym +twój +ty +tych +tylko +tym +u +w +wam +wami +was +wasz +wasza +wasze +we +według +wiele +wielu +więc +więcej +wszyscy +wszystkich +wszystkie +wszystkim +wszystko +wtedy +wy +właśnie +z +za +zapewne +zawsze +ze +zł +znowu +znów +został +żaden +żadna +żadne +żadnych +że +żeby \ No newline at end of file diff --git a/src/main/resources/com/gravity/goose/text/stopwords-pt.txt b/src/main/resources/com/gravity/goose/text/stopwords-pt.txt new file mode 100644 index 000000000..66d557f9c --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-pt.txt @@ -0,0 +1,147 @@ +último +é +acerca +agora +algmas +alguns +ali +ambos +antes +apontar +aquela +aquelas +aquele +aqueles +aqui +atrás +bem +bom +cada +caminho +cima +com +como +comprido +conhecido +corrente +das +debaixo +dentro +desde +desligado +deve +devem +deverá +direita +diz +dizer +dois +dos +e +ela +ele +eles +em +enquanto +então +está +estão +estado +estar +estará +este +estes +esteve +estive +estivemos +estiveram +eu +fará +faz +fazer +fazia +fez +fim +foi +fora +horas +iniciar +inicio +ir +irá +ista +iste +isto +ligado +maioria +maiorias +mais +mas +mesmo +meu +muito +muitos +nós +não +nome +nosso +novo +o +onde +os +ou +outro +para +parte +pegar +pelo +pessoas +pode +poderá +podia +por +porque +povo +promeiro +quê +qual +qualquer +quando +quem +quieto +são +saber +sem +ser +seu +somente +têm +tal +também +tem +tempo +tenho +tentar +tentaram +tente +tentei +teu +teve +tipo +tive +todos +trabalhar +trabalho +tu +um +uma +umas +uns +usa +usar +valor +veja +ver +verdade +verdadeiro +você diff --git a/src/main/resources/com/gravity/goose/text/stopwords-ru.txt b/src/main/resources/com/gravity/goose/text/stopwords-ru.txt new file mode 100644 index 000000000..94984803c --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-ru.txt @@ -0,0 +1,421 @@ +а +е +и +ж +м +о +на +не +ни +об +но +он +мне +мои +мож +она +они +оно +мной +много +многочисленное +многочисленная +многочисленные +многочисленный +мною +мой +мог +могут +можно +может +можхо +мор +моя +моё +мочь +над +нее +оба +нам +нем +нами +ними +мимо +немного +одной +одного +менее +однажды +однако +меня +нему +меньше +ней +наверху +него +ниже +мало +надо +один +одиннадцать +одиннадцатый +назад +наиболее +недавно +миллионов +недалеко +между +низко +меля +нельзя +нибудь +непрерывно +наконец +никогда +никуда +нас +наш +нет +нею +неё +них +мира +наша +наше +наши +ничего +начала +нередко +несколько +обычно +опять +около +мы +ну +нх +от +отовсюду +особенно +нужно +очень +отсюда +в +во +вон +вниз +внизу +вокруг +вот +восемнадцать +восемнадцатый +восемь +восьмой +вверх +вам +вами +важное +важная +важные +важный +вдали +везде +ведь +вас +ваш +ваша +ваше +ваши +впрочем +весь +вдруг +вы +все +второй +всем +всеми +времени +время +всему +всего +всегда +всех +всею +всю +вся +всё +всюду +г +год +говорил +говорит +года +году +где +да +ее +за +из +ли +же +им +до +по +ими +под +иногда +довольно +именно +долго +позже +более +должно +пожалуйста +значит +иметь +больше +пока +ему +имя +пор +пора +потом +потому +после +почему +почти +посреди +ей +два +две +двенадцать +двенадцатый +двадцать +двадцатый +двух +его +дел +или +без +день +занят +занята +занято +заняты +действительно +давно +девятнадцать +девятнадцатый +девять +девятый +даже +алло +жизнь +далеко +близко +здесь +дальше +для +лет +зато +даром +первый +перед +затем +зачем +лишь +десять +десятый +ею +её +их +бы +еще +при +был +про +процентов +против +просто +бывает +бывь +если +люди +была +были +было +будем +будет +будете +будешь +прекрасно +буду +будь +будто +будут +ещё +пятнадцать +пятнадцатый +друго +другое +другой +другие +другая +других +есть +пять +быть +лучше +пятый +к +ком +конечно +кому +кого +когда +которой +которого +которая +которые +который +которых +кем +каждое +каждая +каждые +каждый +кажется +как +какой +какая +кто +кроме +куда +кругом +с +т +у +я +та +те +уж +со +то +том +снова +тому +совсем +того +тогда +тоже +собой +тобой +собою +тобою +сначала +только +уметь +тот +тою +хорошо +хотеть +хочешь +хоть +хотя +свое +свои +твой +своей +своего +своих +свою +твоя +твоё +раз +уже +сам +там +тем +чем +сама +сами +теми +само +рано +самом +самому +самой +самого +семнадцать +семнадцатый +самим +самими +самих +саму +семь +чему +раньше +сейчас +чего +сегодня +себе +тебе +сеаой +человек +разве +теперь +себя +тебя +седьмой +спасибо +слишком +так +такое +такой +такие +также +такая +сих +тех +чаще +четвертый +через +часто +шестой +шестнадцать +шестнадцатый +шесть +четыре +четырнадцать +четырнадцатый +сколько +сказал +сказала +сказать +ту +ты +три +эта +эти +что +это +чтоб +этом +этому +этой +этого +чтобы +этот +стал +туда +этим +этими +рядом +тринадцать +тринадцатый +этих +третий +тут +эту +суть +чуть +тысяч diff --git a/src/main/resources/com/gravity/goose/text/stopwords-sv.txt b/src/main/resources/com/gravity/goose/text/stopwords-sv.txt new file mode 100644 index 000000000..74c0a895f --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-sv.txt @@ -0,0 +1,547 @@ +#----------------------------------------------------------------------- +# translated +#----------------------------------------------------------------------- + +kunna +om +ovan +enligt +i enlighet med detta +över +faktiskt +efter +efteråt +igen +mot +är inte +alla +tillåta +tillåter +nästan +ensam +längs +redan +också +även om +alltid +am +bland +bland +en +och +en annan +någon +någon +hur som helst +någon +något +ändå +ändå +var som helst +isär +visas +uppskatta +lämpligt +är +inte +runt +som +åt sidan +be +frågar +associerad +vid +tillgängliga +bort +väldigt +vara +blev +eftersom +bli +blir +blir +varit +innan +förhand +bakom +vara +tro +nedan +bredvid +förutom +bäst +bättre +mellan +bortom +både +kort +men +genom +c +c'mon +c: s +kom +kampanj +kan +kan inte +kan inte +cant +orsaka +orsaker +viss +säkerligen +förändringar +klart +co +com +komma +kommer +om +följaktligen +överväga +överväger +innehålla +innehållande +innehåller +motsvarande +kunde +kunde inte +kurs +närvarande +definitivt +beskrivits +trots +gjorde +inte +olika +göra +gör +inte +gör +inte +gjort +ned +nedåt +under +varje +edu +åtta +antingen +annars +någon annanstans +tillräckligt +godkändes +helt +speciellt +et +etc +även +någonsin +varje +alla +alla +allt +överallt +ex +exakt +exempel +utom +långt +få +femte +först +finansiella +fem +följt +efter +följer +för +fd +tidigare +framåt +fyra +från +ytterligare +dessutom +få +blir +få +given +ger +gå +går +gå +borta +fick +fått +hälsningar +hade +hade inte +händer +knappast +har +har inte +ha +har inte +med +han +han är +hallå +hjälpa +hence +henne +här +här finns +härefter +härmed +häri +härpå +hennes +själv +hej +honom +själv +hans +hit +förhoppningsvis +hur +howbeit +dock +jag skulle +jag ska +jag är +jag har +om +ignoreras +omedelbar +i +eftersom +inc +indeed +indikera +indikerade +indikerar +inre +mån +istället +in +inåt +är +är inte +den +det skulle +det ska +det är +dess +själv +bara +hålla +håller +hålls +vet +vet +känd +sista +nyligen +senare +senare +latterly +minst +mindre +lest +låt +låt oss +liknande +gillade +sannolikt +lite +ser +ser +ser +ltd +huvudsakligen +många +kan +kanske +mig +betyda +under tiden +endast +kanske +mer +dessutom +mest +mestadels +mycket +måste +min +själv +namn +nämligen +nd +nära +nästan +nödvändigt +behöver +behov +varken +aldrig +ändå +ny +nästa +nio +ingen +ingen +icke +ingen +ingen +eller +normalt +inte +ingenting +roman +nu +ingenstans +uppenbarligen +av +off +ofta +oh +ok +okay +gammal +på +en gång +ett +ettor +endast +på +eller +andra +andra +annars +borde +vår +vårt +oss +ut +utanför +över +övergripande +egen +särskilt +särskilt +per +kanske +placeras +vänligen +plus +möjligt +förmodligen +förmodligen +ger +ganska +citera +kvartalsvis +snarare +verkligen +rimligen +om +oavsett +gäller +relativt +respektive +höger +sa +samma +såg +säga +säger +säger +andra +det andra +se +ser +verkar +verkade +informationsproblem +verkar +sett +själv +själva +förnuftig +skickas +allvarlig +allvarligt +sju +flera +skall +hon +bör +bör inte +eftersom +sex +så +några +någon +på något sätt +någon +något +sometime +ibland +något +någonstans +snart +sorry +specificerade +ange +ange +fortfarande +sub +sådan +sup +säker +t s +ta +tas +berätta +tenderar +än +tacka +tack +thanx +att +det är +brinner +den +deras +deras +dem +själva +sedan +därifrån +där +det finns +därefter +därigenom +därför +däri +theres +därpå +dessa +de +de hade +de kommer +de är +de har +tror +tredje +detta +grundlig +grundligt +de +though +tre +genom +hela +thru +sålunda +till +tillsammans +alltför +tog +mot +mot +försökte +försöker +verkligt +försök +försöker +två gånger +två +enligt +tyvärr +såvida inte +osannolikt +tills +åt +upp +på +oss +använda +används +användbar +använder +användning +vanligtvis +uucp +värde +olika +mycket +via +viz +vs +vill +vill +var +var inte +sätt +vi +vi skulle +vi kommer +vi är +vi har +välkommen +väl +gick +var +var inte +vad +vad är +oavsett +när +varifrån +närhelst +där +var är +varefter +medan +varigenom +vari +varpå +varhelst +huruvida +som +medan +dit +som +vem är +vem +hela +vem +vars +varför +kommer +villig +önskar +med +inom +utan +kommer inte +undrar +skulle +skulle inte +ja +ännu +ni +du skulle +kommer du +du är +du har +din +själv +er +noll +tjänsteman +skarpt +kritiserade diff --git a/src/main/resources/com/gravity/goose/text/stopwords-zh.txt b/src/main/resources/com/gravity/goose/text/stopwords-zh.txt new file mode 100644 index 000000000..955ff2b05 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-zh.txt @@ -0,0 +1,125 @@ +的 +一 +不 +在 +人 +有 +是 +为 +以 +于 +上 +他 +而 +后 +之 +来 +及 +了 +因 +下 +可 +到 +由 +这 +与 +也 +此 +但 +并 +个 +其 +已 +无 +小 +我 +们 +起 +最 +再 +今 +去 +好 +只 +又 +或 +很 +亦 +某 +把 +那 +你 +乃 +它 +吧 +被 +比 +别 +趁 +当 +从 +到 +得 +打 +凡 +儿 +尔 +该 +各 +给 +跟 +和 +何 +还 +即 +几 +既 +看 +据 +距 +靠 +啦 +了 +另 +么 +每 +们 +嘛 +拿 +哪 +那 +您 +凭 +且 +却 +让 +仍 +啥 +如 +若 +使 +谁 +虽 +随 +同 +所 +她 +哇 +嗡 +往 +哪 +些 +向 +沿 +哟 +用 +于 +咱 +则 +怎 +曾 +至 +致 +着 +诸 +自 \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index 4f3b32344..26491f8ae 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -67,9 +67,12 @@ class Crawler(config: Configuration) { article.metaKeywords = extractor.getMetaKeywords(article) article.canonicalLink = extractor.getCanonicalLink(article) article.tags = extractor.extractTags(article) + println("TAGS") + println(article.tags) // before we do any calcs on the body itself let's clean up the document article.doc = docCleaner.clean(article) - + println("DOC") + println(article.doc) extractor.calculateBestNodeBasedOnClustering(article) match { diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index 9956c7849..2c77b8552 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -201,15 +201,22 @@ trait ContentExtractor { var i: Int = 0 val parentNodes = mutable.HashSet[Element]() val nodesWithText = mutable.Buffer[Element]() + println("NODES_WITH_TEXT") for (node <- nodesToCheck) { val nodeText: String = node.text val wordStats: WordStats = StopWords.getStopWordCount(nodeText) val highLinkDensity: Boolean = isHighLinkDensity(node) if (wordStats.getStopWordCount > 2 && !highLinkDensity) { nodesWithText.add(node) + println("NODE ADDED") + } else { + println("NODE LOST") } + println("WORD_STATS: " + wordStats) + println(node) } val numberOfNodes: Int = nodesWithText.size + println("NUMBER_OF_NODES", numberOfNodes) val negativeScoring: Int = 0 val bottomNodesForNegativeScore: Double = numberOfNodes * 0.25 diff --git a/src/main/scala/com/gravity/goose/text/WordStats.scala b/src/main/scala/com/gravity/goose/text/WordStats.scala index d6b6006c4..a8bca4fc3 100644 --- a/src/main/scala/com/gravity/goose/text/WordStats.scala +++ b/src/main/scala/com/gravity/goose/text/WordStats.scala @@ -21,6 +21,8 @@ package com.gravity.goose.text import java.util.ArrayList import java.util.List +import scala.collection.JavaConversions._ + /** * User: Jim Plush * Date: Oct 29, 2010 @@ -72,6 +74,8 @@ class WordStats { wordCount = cnt } - + override def toString: String = + "Word statistics: words = " + wordCount + ", stop words = " + + stopWordCount + " (" + stopWords.mkString(", ") + ")" } From 69b0271810cd035b6032787ff1c38002e0d0f0a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid?= <david@cliqz.com> Date: Mon, 16 Jun 2014 19:50:22 +0200 Subject: [PATCH 263/347] Removed accidentally added debugging messages. --- src/main/scala/com/gravity/goose/Crawler.scala | 5 ----- .../com/gravity/goose/extractors/ContentExtractor.scala | 7 ------- 2 files changed, 12 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index 26491f8ae..69bb85f38 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -67,13 +67,8 @@ class Crawler(config: Configuration) { article.metaKeywords = extractor.getMetaKeywords(article) article.canonicalLink = extractor.getCanonicalLink(article) article.tags = extractor.extractTags(article) - println("TAGS") - println(article.tags) // before we do any calcs on the body itself let's clean up the document article.doc = docCleaner.clean(article) - println("DOC") - println(article.doc) - extractor.calculateBestNodeBasedOnClustering(article) match { case Some(node: Element) => { diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index 2c77b8552..9956c7849 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -201,22 +201,15 @@ trait ContentExtractor { var i: Int = 0 val parentNodes = mutable.HashSet[Element]() val nodesWithText = mutable.Buffer[Element]() - println("NODES_WITH_TEXT") for (node <- nodesToCheck) { val nodeText: String = node.text val wordStats: WordStats = StopWords.getStopWordCount(nodeText) val highLinkDensity: Boolean = isHighLinkDensity(node) if (wordStats.getStopWordCount > 2 && !highLinkDensity) { nodesWithText.add(node) - println("NODE ADDED") - } else { - println("NODE LOST") } - println("WORD_STATS: " + wordStats) - println(node) } val numberOfNodes: Int = nodesWithText.size - println("NUMBER_OF_NODES", numberOfNodes) val negativeScoring: Int = 0 val bottomNodesForNegativeScore: Double = numberOfNodes * 0.25 From a0c320ada19161fe9a062d77e2f7671c4d06f495 Mon Sep 17 00:00:00 2001 From: darthbear <francois.dangngoc@gmail.com> Date: Tue, 17 Jun 2014 15:06:34 -0400 Subject: [PATCH 264/347] bumped version to 2.1.23. Thanks @eliasah --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index df6d7f3be..03c5e583c 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ <groupId>com.gravity</groupId> <artifactId>goose_2.10</artifactId> - <version>2.1.22</version> + <version>2.1.23</version> <packaging>jar</packaging> <name>goose</name> <url>http://maven.apache.org</url> From 4d4824a6e3e63a7b995fc76735ec5afdc4b6ca8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid?= <david@cliqz.com> Date: Wed, 18 Jun 2014 14:44:44 +0200 Subject: [PATCH 265/347] Upgraded jsoup to the latest version. Also bumped the version number up. --- pom.xml | 4 +- .../goose/cleaners/DocumentCleaner.scala | 56 ++++++++++--------- 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/pom.xml b/pom.xml index bf75fb222..f97822f75 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ <groupId>com.gravity</groupId> <artifactId>goose</artifactId> - <version>2.1.23</version> + <version>2.1.24</version> <packaging>jar</packaging> <name>goose</name> <url>http://maven.apache.org</url> @@ -42,7 +42,7 @@ <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> - <version>1.5.2</version> + <version>1.7.3</version> </dependency> <dependency> <groupId>commons-io</groupId> diff --git a/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala b/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala index 27c541d2d..63250d7ff 100644 --- a/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala +++ b/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala @@ -129,40 +129,46 @@ trait DocumentCleaner { } private def cleanBadTags(doc: Document): Document = { - val children: Elements = doc.body.children - val naughtyList: Elements = children.select(queryNaughtyIDs) - trace(naughtyList.size + " naughty ID elements found") + /* jsoup 1.7.3 can return pages without a body. */ + if (doc.body != null) { + val children: Elements = doc.body.children + val naughtyList: Elements = children.select(queryNaughtyIDs) + trace(naughtyList.size + " naughty ID elements found") - import scala.collection.JavaConversions._ - for (node <- naughtyList) { - trace("Removing node with id: " + node.id) - removeNode(node) - } - - val naughtyList2: Elements = children.select(queryNaughtyIDs) - trace(naughtyList2.size + " naughty ID elements found after removal") - - val naughtyClasses: Elements = children.select(queryNaughtyClasses) + import scala.collection.JavaConversions._ + for (node <- naughtyList) { + trace("Removing node with id: " + node.id) + removeNode(node) + } - trace(naughtyClasses.size + " naughty CLASS elements found") + val naughtyList2: Elements = children.select(queryNaughtyIDs) + trace(naughtyList2.size + " naughty ID elements found after removal") - for (node <- naughtyClasses) { - trace("Removing node with class: " + node.className) - removeNode(node) - } + val naughtyClasses: Elements = children.select(queryNaughtyClasses) - val naughtyClasses2: Elements = children.select(queryNaughtyClasses) - trace(naughtyClasses2.size + " naughty CLASS elements found after removal") + trace(naughtyClasses.size + " naughty CLASS elements found") - val naughtyList5: Elements = children.select(queryNaughtyNames) + for (node <- naughtyClasses) { + trace("Removing node with class: " + node.className) + removeNode(node) + } - trace(naughtyList5.size + " naughty Name elements found") + val naughtyClasses2: Elements = children.select(queryNaughtyClasses) + trace(naughtyClasses2.size + " naughty CLASS elements found after removal") - for (node <- naughtyList5) { + val naughtyList5: Elements = children.select(queryNaughtyNames) - trace("Removing node with class: " + node.attr("class") + " id: " + node.id + " name: " + node.attr("name")) + trace(naughtyList5.size + " naughty Name elements found") + + for (node <- naughtyList5) { + trace("Removing node with class: " + node.attr("class") + " id: " + + node.id + " name: " + node.attr("name")) - removeNode(node) + removeNode(node) + } + } + else { + trace("Document has no body.") } doc } From d13f0fc42d7951239a95076cdfbde8c9ca0bf27a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid?= <david@cliqz.com> Date: Wed, 18 Jun 2014 14:44:44 +0200 Subject: [PATCH 266/347] Upgraded jsoup to the latest version. Also bumped the version number up. Fixes #10. --- pom.xml | 4 +- .../goose/cleaners/DocumentCleaner.scala | 56 ++++++++++--------- 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/pom.xml b/pom.xml index bf75fb222..f97822f75 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ <groupId>com.gravity</groupId> <artifactId>goose</artifactId> - <version>2.1.23</version> + <version>2.1.24</version> <packaging>jar</packaging> <name>goose</name> <url>http://maven.apache.org</url> @@ -42,7 +42,7 @@ <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> - <version>1.5.2</version> + <version>1.7.3</version> </dependency> <dependency> <groupId>commons-io</groupId> diff --git a/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala b/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala index 27c541d2d..63250d7ff 100644 --- a/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala +++ b/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala @@ -129,40 +129,46 @@ trait DocumentCleaner { } private def cleanBadTags(doc: Document): Document = { - val children: Elements = doc.body.children - val naughtyList: Elements = children.select(queryNaughtyIDs) - trace(naughtyList.size + " naughty ID elements found") + /* jsoup 1.7.3 can return pages without a body. */ + if (doc.body != null) { + val children: Elements = doc.body.children + val naughtyList: Elements = children.select(queryNaughtyIDs) + trace(naughtyList.size + " naughty ID elements found") - import scala.collection.JavaConversions._ - for (node <- naughtyList) { - trace("Removing node with id: " + node.id) - removeNode(node) - } - - val naughtyList2: Elements = children.select(queryNaughtyIDs) - trace(naughtyList2.size + " naughty ID elements found after removal") - - val naughtyClasses: Elements = children.select(queryNaughtyClasses) + import scala.collection.JavaConversions._ + for (node <- naughtyList) { + trace("Removing node with id: " + node.id) + removeNode(node) + } - trace(naughtyClasses.size + " naughty CLASS elements found") + val naughtyList2: Elements = children.select(queryNaughtyIDs) + trace(naughtyList2.size + " naughty ID elements found after removal") - for (node <- naughtyClasses) { - trace("Removing node with class: " + node.className) - removeNode(node) - } + val naughtyClasses: Elements = children.select(queryNaughtyClasses) - val naughtyClasses2: Elements = children.select(queryNaughtyClasses) - trace(naughtyClasses2.size + " naughty CLASS elements found after removal") + trace(naughtyClasses.size + " naughty CLASS elements found") - val naughtyList5: Elements = children.select(queryNaughtyNames) + for (node <- naughtyClasses) { + trace("Removing node with class: " + node.className) + removeNode(node) + } - trace(naughtyList5.size + " naughty Name elements found") + val naughtyClasses2: Elements = children.select(queryNaughtyClasses) + trace(naughtyClasses2.size + " naughty CLASS elements found after removal") - for (node <- naughtyList5) { + val naughtyList5: Elements = children.select(queryNaughtyNames) - trace("Removing node with class: " + node.attr("class") + " id: " + node.id + " name: " + node.attr("name")) + trace(naughtyList5.size + " naughty Name elements found") + + for (node <- naughtyList5) { + trace("Removing node with class: " + node.attr("class") + " id: " + + node.id + " name: " + node.attr("name")) - removeNode(node) + removeNode(node) + } + } + else { + trace("Document has no body.") } doc } From e0f568a368dfeb097deea73e6c63a61e8a0f20ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid?= <david@cliqz.com> Date: Fri, 20 Jun 2014 16:29:04 +0200 Subject: [PATCH 267/347] Added a lang parameter to getStopWords(). --- .../com/gravity/goose/text/StopWords.scala | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/main/scala/com/gravity/goose/text/StopWords.scala b/src/main/scala/com/gravity/goose/text/StopWords.scala index f1b7ea94d..cfcec4e8d 100644 --- a/src/main/scala/com/gravity/goose/text/StopWords.scala +++ b/src/main/scala/com/gravity/goose/text/StopWords.scala @@ -24,7 +24,8 @@ package com.gravity.goose.text * Date: 8/16/11 */ -import java.util._ +import java.util.ArrayList +import java.util.List import com.gravity.goose.utils.FileHelper object StopWords { @@ -32,14 +33,24 @@ object StopWords { // the confusing pattern below is basically just match any non-word character excluding white-space. private val PUNCTUATION: StringReplacement = StringReplacement.compile("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\p{Pc}\\s]", string.empty) - val STOP_WORDS = FileHelper.loadResourceFile("stopwords-en.txt", StopWords.getClass).split(sys.props("line.separator")).toSet + // TODO: there must a better way to do this. See + // http://www.uofr.net/~greg/java/get-resource-listing.html? + val LANGUAGES: Set[String] = Set("ar", "da", "de", "en", "es", "fi", "fr", + "hu", "id", "it", "ko", "nb", "nl", "no", + "pl", "pt", "ru", "sv", "zh") + val STOP_WORDS: Map[String, Set[String]] = + (LANGUAGES.view map {lang => + lang -> + FileHelper.loadResourceFile("stopwords-" + lang + ".txt", + StopWords.getClass).split(sys.props("line.separator")).toSet + }).toMap.withDefaultValue(Set()) def removePunctuation(str: String): String = { PUNCTUATION.replaceAll(str) } - def getStopWordCount(content: String): WordStats = { + def getStopWordCount(content: String, lang: String = "en"): WordStats = { if (string.isNullOrEmpty(content)) return WordStats.EMPTY val ws: WordStats = new WordStats @@ -49,14 +60,16 @@ object StopWords { val overlappingStopWords: List[String] = new ArrayList[String] - candidateWords.foreach(w => { - if (STOP_WORDS.contains(w.toLowerCase)) overlappingStopWords.add(w.toLowerCase) - }) + val stopWords = STOP_WORDS(lang) + if (stopWords.size > 0) { + candidateWords.foreach(w => { + if (stopWords.contains(w.toLowerCase)) overlappingStopWords.add(w.toLowerCase) + }) + } ws.setWordCount(candidateWords.length) ws.setStopWordCount(overlappingStopWords.size) ws.setStopWords(overlappingStopWords) ws } - } From f3ae1d0ef9937788a1d11f1bf194e0c178d0c6ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid?= <david@cliqz.com> Date: Fri, 20 Jun 2014 16:32:51 +0200 Subject: [PATCH 268/347] Added the lang parameter to the interface. All we need now is to connect it down to StopWords. Also, removed the superfluous one-parameter extractContent method. --- .../scala/com/gravity/goose/Crawler.scala | 14 ++++++++++++- src/main/scala/com/gravity/goose/Goose.scala | 21 +++++++++++-------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index 69bb85f38..42dc51f53 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -34,7 +34,19 @@ import com.gravity.goose.outputformatters.{StandardOutputFormatter, OutputFormat * Date: 8/18/11 */ -case class CrawlCandidate(config: Configuration, url: String, rawHTML: String = null) +/** + * Represents the information we may know of a page we crawl. + * + * @param config the configuration. + * @param url the URL of the page. + * @param rawHTML the raw HTML page source -- optional. If not specified, and + * fetching is configured in {@code config}, the page will be + * downloaded. + * @param lang the surmised language of the page -- optional. Used as a fallback + * when the page does not report its language. + */ +case class CrawlCandidate(config: Configuration, url: String, + rawHTML: String = null, lang: String = null) class Crawler(config: Configuration) { diff --git a/src/main/scala/com/gravity/goose/Goose.scala b/src/main/scala/com/gravity/goose/Goose.scala index 23f724bdb..f49093c72 100644 --- a/src/main/scala/com/gravity/goose/Goose.scala +++ b/src/main/scala/com/gravity/goose/Goose.scala @@ -31,16 +31,19 @@ class Goose(config: Configuration = new Configuration) { initializeEnvironment() /** - * Main method to extract an article object from a URL, pass in a url and get back a Article - * @url The url that you want to extract + * Main method to extract an article object from a URL, pass in a url and get + * back an Article. + * + * @param url the URL of the page. + * @param rawHTML the raw HTML page source -- optional. If not specified, and + * fetching is configured in {@code config}, the page will be + * downloaded. + * @param lang the surmised language of the page -- optional. Used as a fallback + * when the page does not report its language. */ - def extractContent(url: String, rawHTML: String): Article = { - val cc = new CrawlCandidate(config, url, rawHTML) - sendToActor(cc) - } - - def extractContent(url: String): Article = { - val cc = new CrawlCandidate(config, url, null) + def extractContent(url: String, + rawHTML: String = null, lang: String = null): Article = { + val cc = new CrawlCandidate(config, url, rawHTML, lang) sendToActor(cc) } From b34e1d9d9cbc86570420335dad0eb44ece962a9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid?= <david@cliqz.com> Date: Fri, 20 Jun 2014 16:53:49 +0200 Subject: [PATCH 269/347] Fully wired lang in. --- .../scala/com/gravity/goose/Crawler.scala | 9 +++-- .../goose/extractors/ContentExtractor.scala | 33 ++++++++++--------- .../outputformatters/OutputFormatter.scala | 12 +++---- 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index 42dc51f53..a456cd02c 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -58,6 +58,7 @@ class Crawler(config: Configuration) { parseCandidate <- URLHelper.getCleanedUrl(crawlCandidate.url) rawHtml <- getHTML(crawlCandidate, parseCandidate) doc <- getDocument(parseCandidate.url.toString, rawHtml) + lang = crawlCandidate.lang } { trace("Crawling url: " + parseCandidate.url) @@ -82,7 +83,7 @@ class Crawler(config: Configuration) { // before we do any calcs on the body itself let's clean up the document article.doc = docCleaner.clean(article) - extractor.calculateBestNodeBasedOnClustering(article) match { + extractor.calculateBestNodeBasedOnClustering(article, lang) match { case Some(node: Element) => { article.topNode = node article.movies = extractor.extractVideos(article.topNode) @@ -102,12 +103,10 @@ class Crawler(config: Configuration) { } } } - article.topNode = extractor.postExtractionCleanup(article.topNode) + article.topNode = extractor.postExtractionCleanup(article.topNode, lang) - - - article.cleanedArticleText = outputFormatter.getFormattedText(article.topNode) + article.cleanedArticleText = outputFormatter.getFormattedText(article.topNode, lang) } case _ => trace("NO ARTICLE FOUND") } diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index 9956c7849..9632869c0 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -191,7 +191,8 @@ trait ContentExtractor { * @return */ - def calculateBestNodeBasedOnClustering(article: Article): Option[Element] = { + def calculateBestNodeBasedOnClustering(article: Article, + lang:String): Option[Element] = { trace(logPrefix + "Starting to calculate TopNode") val doc = article.doc var topNode: Element = null @@ -203,7 +204,7 @@ trait ContentExtractor { val nodesWithText = mutable.Buffer[Element]() for (node <- nodesToCheck) { val nodeText: String = node.text - val wordStats: WordStats = StopWords.getStopWordCount(nodeText) + val wordStats: WordStats = StopWords.getStopWordCount(nodeText, lang) val highLinkDensity: Boolean = isHighLinkDensity(node) if (wordStats.getStopWordCount > 2 && !highLinkDensity) { nodesWithText.add(node) @@ -217,7 +218,7 @@ trait ContentExtractor { for (node <- nodesWithText) { var boostScore: Float = 0 - if (isOkToBoost(node)) { + if (isOkToBoost(node, lang)) { if (cnt >= 0) { boostScore = ((1.0 / startingBoost) * 50).asInstanceOf[Float] startingBoost += 1 @@ -237,7 +238,7 @@ trait ContentExtractor { trace(logPrefix + "Location Boost Score: " + boostScore + " on interation: " + i + "' id='" + node.parent.id + "' class='" + node.parent.attr("class")) val nodeText: String = node.text - val wordStats: WordStats = StopWords.getStopWordCount(nodeText) + val wordStats: WordStats = StopWords.getStopWordCount(nodeText, lang) val upscore: Int = (wordStats.getStopWordCount + boostScore).asInstanceOf[Int] updateScore(node.parent, upscore) updateScore(node.parent.parent, upscore / 2) @@ -292,7 +293,7 @@ trait ContentExtractor { * @param node * @return */ - private def isOkToBoost(node: Element): Boolean = { + private def isOkToBoost(node: Element, lang: String): Boolean = { val para = "p" var stepsAway: Int = 0 val minimumStopWordCount = 5 @@ -306,7 +307,7 @@ trait ContentExtractor { return false } val paraText: String = currentNode.text - val wordStats: WordStats = StopWords.getStopWordCount(paraText) + val wordStats: WordStats = StopWords.getStopWordCount(paraText, lang) if (wordStats.getStopWordCount > minimumStopWordCount) { trace(logPrefix + "We're gonna boost this node, seems contenty") return true @@ -491,10 +492,10 @@ trait ContentExtractor { * @param targetNode * @return */ - def postExtractionCleanup(targetNode: Element): Element = { + def postExtractionCleanup(targetNode: Element, lang: String): Element = { trace(logPrefix + "Starting cleanup Node") - val node = addSiblings(targetNode) + val node = addSiblings(targetNode, lang) for { e <- node.children if (e.tagName != "p") @@ -534,7 +535,9 @@ trait ContentExtractor { * @param currentSibling * @return */ - def getSiblingContent(currentSibling: Element, baselineScoreForSiblingParagraphs: Int): Option[String] = { + def getSiblingContent(currentSibling: Element, + baselineScoreForSiblingParagraphs: Int, + lang: String): Option[String] = { if (currentSibling.tagName == "p" && currentSibling.text.length() > 0) { Some(currentSibling.outerHtml) @@ -549,7 +552,7 @@ trait ContentExtractor { Some((for { firstParagraph <- potentialParagraphs if (firstParagraph.text.length() > 0) - wordStats: WordStats = StopWords.getStopWordCount(firstParagraph.text) + wordStats: WordStats = StopWords.getStopWordCount(firstParagraph.text, lang) paragraphScore: Int = wordStats.getStopWordCount siblingBaseLineScore: Double = .30 if ((baselineScoreForSiblingParagraphs * siblingBaseLineScore).toDouble < paragraphScore) @@ -578,14 +581,14 @@ trait ContentExtractor { b } - private def addSiblings(topNode: Element): Element = { + private def addSiblings(topNode: Element, lang: String): Element = { trace(logPrefix + "Starting to add siblings") - val baselineScoreForSiblingParagraphs: Int = getBaselineScoreForSiblings(topNode) + val baselineScoreForSiblingParagraphs: Int = getBaselineScoreForSiblings(topNode, lang) val results = walkSiblings(topNode) { currentNode => { - getSiblingContent(currentNode, baselineScoreForSiblingParagraphs) + getSiblingContent(currentNode, baselineScoreForSiblingParagraphs, lang) } }.reverse.flatMap(itm => itm) @@ -602,7 +605,7 @@ trait ContentExtractor { * @param topNode * @return */ - private def getBaselineScoreForSiblings(topNode: Element): Int = { + private def getBaselineScoreForSiblings(topNode: Element, lang: String): Int = { var base: Int = 100000 var numberOfParagraphs: Int = 0 var scoreOfParagraphs: Int = 0 @@ -610,7 +613,7 @@ trait ContentExtractor { for (node <- nodesToCheck) { val nodeText: String = node.text - val wordStats: WordStats = StopWords.getStopWordCount(nodeText) + val wordStats: WordStats = StopWords.getStopWordCount(nodeText, lang) val highLinkDensity: Boolean = isHighLinkDensity(node) if (wordStats.getStopWordCount > 2 && !highLinkDensity) { numberOfParagraphs += 1; diff --git a/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala b/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala index a86a2252b..3222ad00a 100644 --- a/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala +++ b/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala @@ -49,11 +49,11 @@ trait OutputFormatter { * @param topNode the top most node to format * @return the prepared Element */ - @Deprecated def getFormattedElement(topNode: Element): Element = { + @Deprecated def getFormattedElement(topNode: Element, lang: String): Element = { removeNodesWithNegativeScores(topNode) convertLinksToText(topNode) replaceTagsWithText(topNode) - removeParagraphsWithFewWords(topNode) + removeParagraphsWithFewWords(topNode, lang) topNode } @@ -62,11 +62,11 @@ trait OutputFormatter { * @param topNode the top most node to format * @return a formatted string with all HTML removed */ - def getFormattedText(topNode: Element): String = { + def getFormattedText(topNode: Element, lang: String): String = { removeNodesWithNegativeScores(topNode) convertLinksToText(topNode) replaceTagsWithText(topNode) - removeParagraphsWithFewWords(topNode) + removeParagraphsWithFewWords(topNode, lang) convertToText(topNode) } @@ -173,7 +173,7 @@ trait OutputFormatter { /** * remove paragraphs that have less than x number of words, would indicate that it's some sort of link */ - private def removeParagraphsWithFewWords(topNode: Element) { + private def removeParagraphsWithFewWords(topNode: Element, lang: String) { if (topNode != null) { if (logger.isDebugEnabled) { logger.debug("removeParagraphsWithFewWords starting...") @@ -183,7 +183,7 @@ trait OutputFormatter { for (el <- allNodes) { try { - val stopWords = StopWords.getStopWordCount(el.text) + val stopWords = StopWords.getStopWordCount(el.text, lang) if (stopWords.getStopWordCount < 3 && el.getElementsByTag("object").size == 0 && el.getElementsByTag("embed").size == 0) { logger.debug("removeParagraphsWithFewWords - swcnt: %d removing text: %s".format(stopWords.getStopWordCount, el.text())) el.remove() From 8383fa7d86e0cafd3670fcd947144503c6367007 Mon Sep 17 00:00:00 2001 From: Theodore Lee <thl2516@gmail.com> Date: Mon, 7 Jul 2014 15:35:36 +0900 Subject: [PATCH 270/347] added ko stopword --- build.sbt | 41 +++++++++-- .../resources/com/gravity/goose/text/ko.txt | 70 +++++++++++++++++++ .../scala/com/gravity/goose/Article.scala | 2 +- .../com/gravity/goose/Configuration.scala | 2 +- .../com/gravity/goose/images/Image.scala | 10 +-- .../gravity/goose/network/HtmlFetcher.scala | 23 +++--- .../com/gravity/goose/text/StopWords.scala | 28 +++++--- 7 files changed, 141 insertions(+), 35 deletions(-) create mode 100644 src/main/resources/com/gravity/goose/text/ko.txt diff --git a/build.sbt b/build.sbt index abf3727a8..955b997c9 100644 --- a/build.sbt +++ b/build.sbt @@ -1,9 +1,42 @@ +import sbt._ +import Keys._ + name := "goose-fork" -version := "2.1.23-SNAPSHOT" +version := "2.1.23" + +organization := "com.gravity.goose" + +scalaVersion := "2.11.1" + +crossScalaVersions := Seq("2.11.0", "2.10.4") + +testFrameworks += TestFrameworks.ScalaTest + +testOptions in Test += Tests.Argument("-oF") -scalaVersion := "2.9.2" +resolvers ++= Seq( + "sonatype snapshots" at "https://oss.sonatype.org/content/repositories/snapshots", + "central mvn repo" at "http://repo1.maven.org/", + "Oracle Maven 2 Repository" at "http://download.oracle.com/maven", + "JBoss Maven 2 Repository" at "http://repository.jboss.com/maven2", + "JLangDetect Maven repository" at "https://jlangdetect.googlecode.com/svn/repo" +) -libraryDependencies += "com.novocode" % "junit-interface" % "0.10-M4" % "test" +libraryDependencies ++= { + Seq( + "org.scalatest" %% "scalatest" % "2.1.6" % "test", + "junit" % "junit" % "4.8.1" % "test", + "org.slf4j" % "slf4j-api" % "1.7.7", + "org.slf4j" % "slf4j-log4j12" % "1.7.7" % "test", + "commons-io" % "commons-io" % "2.4", + "org.apache.httpcomponents" % "httpclient" % "4.3.1", + "commons-lang" % "commons-lang" % "2.6", + "com.ibm.icu" % "icu4j" % "53.1", + "com.novocode" % "junit-interface" % "0.10-M4" % "test", + "me.champeau.jlangdetect" % "jlangdetect-extra" % "0.4", + "org.jsoup" % "jsoup" % "1.7.3" + ) +} -resolvers += "Sonatype Release" at "http://oss.sonatype.org/content/repositories/releases" \ No newline at end of file +publishTo := Some(Resolver.file("Github Pages", Path.userHome /"repo" / "maven" asFile)(Patterns(true, Resolver.mavenStyleBasePattern))) \ No newline at end of file diff --git a/src/main/resources/com/gravity/goose/text/ko.txt b/src/main/resources/com/gravity/goose/text/ko.txt new file mode 100644 index 000000000..0fc32d1ad --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/ko.txt @@ -0,0 +1,70 @@ +을 +의 +에 +이 +를 +으로 +은 +는 +가 +로 +하고 +과 +에서 +도 +와 +이다 +고 +부터 +까지 +께 +에는 +이라고 +만 +라고 +보다 +에도 +다 +토록 +에게 +나 +대로 +에서는 +이나 +이며 +요 +든 +으로써 +같이 +로는 +밖에 +과의 +며 +로부터 +처럼 +아 +라 +여 +으로는 +이고 +에서의 +이라는 +만에 +으로부터 +에서도 +와의 +엔 +만을 +부터는 +만의 +야 +까지의 +과는 +치고 +과를 +으로의 +까지는 +보다는 +만이 +에만 +로의 diff --git a/src/main/scala/com/gravity/goose/Article.scala b/src/main/scala/com/gravity/goose/Article.scala index a42899492..e4234432b 100644 --- a/src/main/scala/com/gravity/goose/Article.scala +++ b/src/main/scala/com/gravity/goose/Article.scala @@ -22,7 +22,7 @@ import images.Image import org.jsoup.nodes.{ Element, Document } import java.util.Date import scala.collection._ -import scala.reflect.BeanProperty +import beans.BeanProperty /** * Created by Jim Plush diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index 05a07b84a..294617858 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -21,7 +21,7 @@ package com.gravity.goose import network.{HtmlFetcher, AbstractHtmlFetcher} import org.jsoup.nodes.Element import java.util.Date -import reflect.BeanProperty +import beans.BeanProperty import com.gravity.goose.extractors.{StandardContentExtractor, ContentExtractor, AdditionalDataExtractor, PublishDateExtractor} diff --git a/src/main/scala/com/gravity/goose/images/Image.scala b/src/main/scala/com/gravity/goose/images/Image.scala index eb9d15cc4..bc22e6a63 100644 --- a/src/main/scala/com/gravity/goose/images/Image.scala +++ b/src/main/scala/com/gravity/goose/images/Image.scala @@ -36,15 +36,15 @@ class Image { /** * holds the src of the image */ - var imageSrc: String = ""; + var imageSrc: String = "" /** Raw score of image. */ - var imageScore: Float = 0; + var imageScore: Float = 0 /** * how confident are we in this image extraction? the most images generally the less confident */ - var confidenceScore: Double = 0.0; + var confidenceScore: Double = 0.0 /** * Height of the image in pixels @@ -59,13 +59,13 @@ class Image { /** * what kind of image extraction was used for this? bestGuess, linkTag, openGraph tags? */ - var imageExtractionType: String = "NA"; + var imageExtractionType: String = "NA" /** * stores how many bytes this image is. */ - var bytes: Long = 0; + var bytes: Long = 0 def getImageSrc = { diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index ac1658acd..0f4d6c717 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -52,7 +52,7 @@ import com.gravity.goose.utils.Logging import com.gravity.goose.Configuration import org.apache.http.impl.client.{DefaultHttpRequestRetryHandler, AbstractHttpClient, DefaultHttpClient} import org.apache.commons.io.IOUtils -import org.mozilla.universalchardet.UniversalDetector +import com.ibm.icu.text.CharsetDetector /** * User: Jim Plush @@ -362,8 +362,7 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { def convertStreamToString(is: InputStream, httpEncodingType: String): String = { try { var buf : Array[Byte] = IOUtils.toByteArray(is) - var finalEncodingType = detectEncoding(buf, httpEncodingType) - return new String(buf, finalEncodingType) + return encodedText(buf) } catch { case e: SocketTimeoutException => { @@ -379,18 +378,12 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { null } - def detectEncoding(buf : Array[Byte], httpEncodingType : String) : String = { - var detector : UniversalDetector = new UniversalDetector(null) - detector.handleData(buf, 0, buf.size) - detector.dataEnd() - - var detectedEncoding = detector.getDetectedCharset() - - if(detectedEncoding != null) { - return detectedEncoding - } else { - return httpEncodingType - } + def encodedText(buf : Array[Byte]) : String = { + val detector = new CharsetDetector() + detector.setText(buf) + val matched = detector.detect() + matched.getLanguage + matched.getString } } diff --git a/src/main/scala/com/gravity/goose/text/StopWords.scala b/src/main/scala/com/gravity/goose/text/StopWords.scala index b4af78de6..e7844fcba 100644 --- a/src/main/scala/com/gravity/goose/text/StopWords.scala +++ b/src/main/scala/com/gravity/goose/text/StopWords.scala @@ -24,13 +24,16 @@ package com.gravity.goose.text * Date: 8/16/11 */ -import java.util._ -import com.gravity.goose.utils.FileHelper +import java.util.{ArrayList, List} +import com.gravity.goose.utils.{Logging, FileHelper} import scala.collection.immutable.Map -object StopWords { - +object StopWords extends Logging{ + + import me.champeau.ld.UberLanguageDetector + val detector = UberLanguageDetector.getInstance() + // the confusing pattern below is basically just match any non-word character excluding white-space. private val PUNCTUATION: StringReplacement = StringReplacement.compile("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\p{Pc}\\s]", string.empty) @@ -41,6 +44,7 @@ object StopWords { "fr" -> FileHelper.loadResourceFile("fr.txt", StopWords.getClass).split(sys.props("line.separator")).toSet, "it" -> FileHelper.loadResourceFile("it.txt", StopWords.getClass).split(sys.props("line.separator")).toSet, "pt" -> FileHelper.loadResourceFile("pt.txt", StopWords.getClass).split(sys.props("line.separator")).toSet, + "ko" -> FileHelper.loadResourceFile("ko.txt", StopWords.getClass).split(sys.props("line.separator")).toSet, "all" -> FileHelper.loadResourceFile("all.txt", StopWords.getClass).split(sys.props("line.separator")).toSet); def removePunctuation(str: String): String = { @@ -48,7 +52,6 @@ object StopWords { } def getStopWordCount(content: String): WordStats = { - if (string.isNullOrEmpty(content)) return WordStats.EMPTY val ws: WordStats = new WordStats val strippedInput: String = removePunctuation(content) @@ -58,24 +61,31 @@ object StopWords { val overlappingStopWords: List[String] = new ArrayList[String] val languageCode : String = detectLanguage(content) - val stopWords = STOP_WORDS(languageCode) + val stopWords:Set[String] = STOP_WORDS(languageCode) + val stopWordsMatcher = languageCode match { + case "ko" => overlappingStopWordsMatherForKorean(_, _) + case other => overlappingStopWordsMatcherForNormal(_, _) + } candidateWords.foreach(w => { - if (stopWords.contains(w.toLowerCase)) overlappingStopWords.add(w.toLowerCase) + if(stopWordsMatcher(stopWords, w)) overlappingStopWords.add(w.toLowerCase) }) ws.setWordCount(candidateWords.length) ws.setStopWordCount(overlappingStopWords.size) ws.setStopWords(overlappingStopWords) ws } + + def overlappingStopWordsMatherForKorean(stopWords:Set[String], w:String):Boolean = stopWords.exists(w.endsWith(_)) + def overlappingStopWordsMatcherForNormal(stopWords:Set[String],w:String):Boolean = stopWords.contains(w.toLowerCase) /** * This method returns the code of the language identified in the content * passed as parameter. */ def detectLanguage(content: String): String = { - return "en" // TODO Fixme using some automatic language detector library + val language = detector.detectLang(content) + STOP_WORDS.keys.find(language == _).getOrElse("en") } - } From 79cb60721cd394547973c75b21f4e374cd562c6b Mon Sep 17 00:00:00 2001 From: Theodore Lee <thl2516@gmail.com> Date: Mon, 7 Jul 2014 16:11:51 +0900 Subject: [PATCH 271/347] updated build.sbt --- project/Build.scala | 23 ----------------------- project/build.properties | 1 - project/build.sbt | 3 --- 3 files changed, 27 deletions(-) delete mode 100644 project/Build.scala delete mode 100644 project/build.properties delete mode 100644 project/build.sbt diff --git a/project/Build.scala b/project/Build.scala deleted file mode 100644 index 558cfab9c..000000000 --- a/project/Build.scala +++ /dev/null @@ -1,23 +0,0 @@ -import sbt._ -import Keys._ - -object Dependencies { - val Slf4jApi = "org.slf4j" % "slf4j-api" % "1.6.6" - val Slf4jLog4j12 = "org.slf4j" % "slf4j-log4j12" % "1.6.6" - val Jsoup = "org.jsoup" % "jsoup" % "1.7.2" - val CommonsIo = "commons-io" % "commons-io" % "2.0.1" - val ScalaCompiler = "org.scala-lang" % "scala-compiler" % "2.9.2" - val ScalaLibrary = "org.scala-lang" % "scala-library" % "2.9.2" - val Httpclient = "org.apache.httpcomponents" % "httpclient" % "4.2.4" - val CommonsLang = "commons-lang" % "commons-lang" % "2.6" - val Juniversalchardet = "com.googlecode.juniversalchardet" % "juniversalchardet" % "1.0.3" - -} - -object GooseBuild extends Build { - import Dependencies._ - - lazy val root = Project("goose", file("."), - settings = Defaults.defaultSettings ++ - Seq(libraryDependencies ++= Seq(Slf4jApi, Slf4jLog4j12, Jsoup, CommonsIo, ScalaCompiler, ScalaLibrary, Httpclient, CommonsLang, Juniversalchardet))) -} \ No newline at end of file diff --git a/project/build.properties b/project/build.properties deleted file mode 100644 index 21e2c5d75..000000000 --- a/project/build.properties +++ /dev/null @@ -1 +0,0 @@ -sbt.version=0.12.2 \ No newline at end of file diff --git a/project/build.sbt b/project/build.sbt deleted file mode 100644 index 53bd52a94..000000000 --- a/project/build.sbt +++ /dev/null @@ -1,3 +0,0 @@ -scalacOptions += "-deprecation" - -resolvers += Classpaths.typesafeResolver \ No newline at end of file From fe56ab19a33efd2a0b4d0e4c05179b4d0a619ccd Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Mon, 7 Jul 2014 15:28:46 +0300 Subject: [PATCH 272/347] - fix build - upgrade to scala 2.10 --- build.sbt | 71 ++++++++------------------------------------- project/plugins.sbt | 22 +++++++------- 2 files changed, 23 insertions(+), 70 deletions(-) diff --git a/build.sbt b/build.sbt index bce09f355..248561715 100644 --- a/build.sbt +++ b/build.sbt @@ -1,40 +1,23 @@ -<<<<<<< HEAD import sbt._ import Keys._ -name := "goose-fork" - -version := "2.1.23" - organization := "com.gravity.goose" -scalaVersion := "2.11.1" - -crossScalaVersions := Seq("2.11.0", "2.10.4") -======= -import com.twitter.sbt._ -import AssemblyKeys._ - -seq(StandardProject.newSettings: _*) - - - -name := "goose" +name := "goose-fork" -version := "2.1.22" +version := "2.1.23" -organization := "com.gravity.goose" +//scalaVersion := "2.11.1" +scalaVersion := "2.10.2" -scalaVersion := "2.10.1" ->>>>>>> remotes/kkme/master +crossScalaVersions := Seq("2.11.1", "2.11.0", "2.10.4") testFrameworks += TestFrameworks.ScalaTest testOptions in Test += Tests.Argument("-oF") -<<<<<<< HEAD resolvers ++= Seq( - "sonatype snapshots" at "https://oss.sonatype.org/content/repositories/snapshots", + //"sonatype snapshots" at "https://oss.sonatype.org/content/repositories/snapshots", "central mvn repo" at "http://repo1.maven.org/", "Oracle Maven 2 Repository" at "http://download.oracle.com/maven", "JBoss Maven 2 Repository" at "http://repository.jboss.com/maven2", @@ -53,51 +36,21 @@ libraryDependencies ++= { "com.ibm.icu" % "icu4j" % "53.1", "com.novocode" % "junit-interface" % "0.10-M4" % "test", "me.champeau.jlangdetect" % "jlangdetect-extra" % "0.4", - "org.jsoup" % "jsoup" % "1.7.3" - ) -} - -publishTo := Some(Resolver.file("Github Pages", Path.userHome /"repo" / "maven" asFile)(Patterns(true, Resolver.mavenStyleBasePattern))) -======= -seq(assemblySettings: _*) - -resolvers ++= Seq( - "sonatype snapshots" at "https://oss.sonatype.org/content/repositories/snapshots", - "central mvn repo" at "http://repo1.maven.org/", - "Oracle Maven 2 Repository" at "http://download.oracle.com/maven", - "JBoss Maven 2 Repository" at "http://repository.jboss.com/maven2" - ) - -credentials += Credentials(Path.userHome / ".ivy2" / ".credentials") - -libraryDependencies ++= { - Seq( + "org.jsoup" % "jsoup" % "1.7.3", + //new "net.liftweb" % "lift-json_2.10" % "2.5", "log4j" % "log4j" % "1.2.14", - "org.slf4j" % "slf4j-nop" % "1.6.4", - "org.scalatest" %% "scalatest" % "1.9.1" % "test", "com.typesafe" % "config" % "1.0.2", - "org.scala-lang" % "scala-reflect" % "2.10.0", "com.jsuereth" %% "scala-arm" % "1.2" , "org.specs2" %% "specs2" % "1.13", "junit" % "junit" % "4.8.1" % "test", - "org.slf4j" % "slf4j-api" % "1.6.1", - "org.slf4j" % "slf4j-log4j12" % "1.6.1" % "test", "org.jsoup" % "jsoup" % "1.5.2", - "commons-io" % "commons-io" % "2.0.1", - "org.scala-lang" % "scala-compiler" % "2.9.0-1", - "org.scala-lang" % "scala-library" % "2.9.0-1", - "org.apache.httpcomponents" % "httpclient" % "4.1.2", + //"org.scala-lang" % "scala-compiler" % "2.9.0-1", + //"org.scala-lang" % "scala-library" % "2.9.0-1", + //"org.scala-lang" % "scala-reflect" % "2.10.0", "commons-lang" % "commons-lang" % "2.6", "com.chenlb.mmseg4j" % "mmseg4j-core" % "1.9.1" ) } - -packageDistDir <<= (baseDirectory, packageDistName) { (b, n) => b / "release" } - -parallelExecution in Test := false - - - ->>>>>>> remotes/kkme/master +publishTo := Some(Resolver.file("Github Pages", Path.userHome /"repo" / "maven" asFile)(Patterns(true, Resolver.mavenStyleBasePattern))) \ No newline at end of file diff --git a/project/plugins.sbt b/project/plugins.sbt index 0ace14d69..07e4df290 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,14 +1,14 @@ -resolvers ++= Seq("snapshots" at "http://scala-tools.org/repo-snapshots", - "releases" at "http://scala-tools.org/repo-releases", - "umeng.com snapshots" at "http://122.11.52.227:8088/nexus/content/repositories/snapshots", - "umeng.com releases" at "http://122.11.52.227:8088/nexus/content/repositories/releases", - "Oracle Maven 2 Repository" at "http://download.oracle.com/maven", - "JBoss Maven 2 Repository" at "http://repository.jboss.com/maven2", - "Sonatype snapshots" at "http://oss.sonatype.org/content/repositories/snapshots/" - ) +resolvers ++= Seq( + //"releases" at "http://scala-tools.org/repo-releases", + //"umeng.com releases" at "http://122.11.52.227:8088/nexus/content/repositories/releases", + "Oracle Maven 2 Repository" at "http://download.oracle.com/maven", + "JBoss Maven 2 Repository" at "http://repository.jboss.com/maven2", + "sbt-plugin-releases" at "http://repo.scala-sbt.org/scalasbt/sbt-plugin-releases" +) -addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.9.0") +//addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2") -addSbtPlugin("com.twitter" % "sbt-package-dist" % "1.1.0-SNAPSHOT") +//addSbtPlugin("com.twitter" % "sbt-package-dist" % "1.0.6") -addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.1.2") +//addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.2.1") +addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.3.0") From 688d310485a87e4eb37960d57c0d9c6508015ed1 Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Mon, 7 Jul 2014 15:29:41 +0300 Subject: [PATCH 273/347] - upgrade to languages --- src/main/scala/com/gravity/goose/Crawler.scala | 3 +-- .../scala/com/gravity/goose/text/StopWords.scala | 16 ++++------------ src/test/scala/com/gravity/goose/GooseTest.scala | 2 -- 3 files changed, 5 insertions(+), 16 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index 652f1bfd0..8f11d9d6f 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -73,9 +73,8 @@ class Crawler(config: Configuration) { if (article.publishDate == null) { article.publishDate = extractor.getDateFromURL(article.canonicalLink) } + extractor.calculateBestNodeBasedOnClustering(article, config.language) match { - extractor.calculateBestNodeBasedOnClustering(article) match { - case Some(node: Element) => { article.topNode = node article.movies = extractor.extractVideos(article.topNode) diff --git a/src/main/scala/com/gravity/goose/text/StopWords.scala b/src/main/scala/com/gravity/goose/text/StopWords.scala index 9dc9978dc..cab03840b 100644 --- a/src/main/scala/com/gravity/goose/text/StopWords.scala +++ b/src/main/scala/com/gravity/goose/text/StopWords.scala @@ -24,13 +24,8 @@ package com.gravity.goose.text * Date: 8/16/11 */ -<<<<<<< .mine -import java.util.{ArrayList, List} import com.gravity.goose.utils.{Logging, FileHelper} -======= -import com.gravity.goose.utils.FileHelper ->>>>>>> .theirs import com.gravity.goose.Language._ import com.chenlb.mmseg4j.ComplexSeg; import com.chenlb.mmseg4j.Dictionary; @@ -39,11 +34,7 @@ import com.chenlb.mmseg4j.Seg; import com.chenlb.mmseg4j.Word; import java.io.StringReader; import scala.collection.JavaConversions._ -import java.util.HashMap import scala.collection.Set -import java.util.Map - -import scala.collection.immutable.Map object StopWords extends Logging{ @@ -53,7 +44,7 @@ object StopWords extends Logging{ // the confusing pattern below is basically just match any non-word character excluding white-space. private val PUNCTUATION: StringReplacement = StringReplacement.compile("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\p{Pc}\\s]", string.empty) - val STOP_WORDS = Map("ca" -> FileHelper.loadResourceFile("ca.txt", StopWords.getClass).split(sys.props("line.separator")).toSet, + val stopWordsMap = Map("ca" -> FileHelper.loadResourceFile("ca.txt", StopWords.getClass).split(sys.props("line.separator")).toSet, "de" -> FileHelper.loadResourceFile("de.txt", StopWords.getClass).split(sys.props("line.separator")).toSet, "en" -> FileHelper.loadResourceFile("en.txt", StopWords.getClass).split(sys.props("line.separator")).toSet, "es" -> FileHelper.loadResourceFile("es.txt", StopWords.getClass).split(sys.props("line.separator")).toSet, @@ -97,13 +88,14 @@ object StopWords extends Logging{ var overlappingStopWords: List[String] = List[String]() val languageCode : String = detectLanguage(content) - val stopWords:Set[String] = STOP_WORDS(languageCode) + val stopWords:Set[String] = stopWordsMap(languageCode) val stopWordsMatcher = languageCode match { case "ko" => overlappingStopWordsMatherForKorean(_, _) case other => overlappingStopWordsMatcherForNormal(_, _) } candidateWords.foreach(w => { +//TODO w.toLowercase ??? if(stopWordsMatcher(stopWords, w)) overlappingStopWords.add(w.toLowerCase) }) ws.setWordCount(candidateWords.length) @@ -121,7 +113,7 @@ object StopWords extends Logging{ */ def detectLanguage(content: String): String = { val language = detector.detectLang(content) - STOP_WORDS.keys.find(language == _).getOrElse("en") + stopWordsMap.keys.find(language == _).getOrElse("en") } diff --git a/src/test/scala/com/gravity/goose/GooseTest.scala b/src/test/scala/com/gravity/goose/GooseTest.scala index b98846e37..6e2aa89ec 100644 --- a/src/test/scala/com/gravity/goose/GooseTest.scala +++ b/src/test/scala/com/gravity/goose/GooseTest.scala @@ -2,8 +2,6 @@ package com.gravity.goose import org.junit.Test import org.junit.Assert._ -import scala.actors.Future -import scala.actors.Futures._ /** * Created by Jim Plush From 44e886bb2616016945ca0131c1134a819ebb1b09 Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Mon, 7 Jul 2014 15:51:01 +0300 Subject: [PATCH 274/347] - add eclipse resources to classpath - use StopWords.scala created by kkme@github - detailed exception --- build.sbt | 5 +- .../com/gravity/goose/text/StopWords.scala | 55 +++++-------------- .../com/gravity/goose/utils/FileHelper.scala | 3 +- 3 files changed, 21 insertions(+), 42 deletions(-) diff --git a/build.sbt b/build.sbt index 248561715..a54ca0cb2 100644 --- a/build.sbt +++ b/build.sbt @@ -1,5 +1,6 @@ import sbt._ import Keys._ +import com.typesafe.sbteclipse.plugin.EclipsePlugin.EclipseKeys organization := "com.gravity.goose" @@ -53,4 +54,6 @@ libraryDependencies ++= { ) } -publishTo := Some(Resolver.file("Github Pages", Path.userHome /"repo" / "maven" asFile)(Patterns(true, Resolver.mavenStyleBasePattern))) \ No newline at end of file +publishTo := Some(Resolver.file("Github Pages", Path.userHome /"repo" / "maven" asFile)(Patterns(true, Resolver.mavenStyleBasePattern))) + +EclipseKeys.createSrc := EclipseCreateSrc.Default + EclipseCreateSrc.Resource diff --git a/src/main/scala/com/gravity/goose/text/StopWords.scala b/src/main/scala/com/gravity/goose/text/StopWords.scala index cab03840b..2ef16272d 100644 --- a/src/main/scala/com/gravity/goose/text/StopWords.scala +++ b/src/main/scala/com/gravity/goose/text/StopWords.scala @@ -24,8 +24,7 @@ package com.gravity.goose.text * Date: 8/16/11 */ -import com.gravity.goose.utils.{Logging, FileHelper} - +import com.gravity.goose.utils.FileHelper import com.gravity.goose.Language._ import com.chenlb.mmseg4j.ComplexSeg; import com.chenlb.mmseg4j.Dictionary; @@ -34,30 +33,22 @@ import com.chenlb.mmseg4j.Seg; import com.chenlb.mmseg4j.Word; import java.io.StringReader; import scala.collection.JavaConversions._ +import java.util.HashMap import scala.collection.Set +import java.util.Map -object StopWords extends Logging{ - - import me.champeau.ld.UberLanguageDetector - val detector = UberLanguageDetector.getInstance() +object StopWords { // the confusing pattern below is basically just match any non-word character excluding white-space. private val PUNCTUATION: StringReplacement = StringReplacement.compile("[^\\p{Ll}\\p{Lu}\\p{Lt}\\p{Lo}\\p{Nd}\\p{Pc}\\s]", string.empty) - - val stopWordsMap = Map("ca" -> FileHelper.loadResourceFile("ca.txt", StopWords.getClass).split(sys.props("line.separator")).toSet, - "de" -> FileHelper.loadResourceFile("de.txt", StopWords.getClass).split(sys.props("line.separator")).toSet, - "en" -> FileHelper.loadResourceFile("en.txt", StopWords.getClass).split(sys.props("line.separator")).toSet, - "es" -> FileHelper.loadResourceFile("es.txt", StopWords.getClass).split(sys.props("line.separator")).toSet, - "fr" -> FileHelper.loadResourceFile("fr.txt", StopWords.getClass).split(sys.props("line.separator")).toSet, - "it" -> FileHelper.loadResourceFile("it.txt", StopWords.getClass).split(sys.props("line.separator")).toSet, - "pt" -> FileHelper.loadResourceFile("pt.txt", StopWords.getClass).split(sys.props("line.separator")).toSet, - "ko" -> FileHelper.loadResourceFile("ko.txt", StopWords.getClass).split(sys.props("line.separator")).toSet, - "all" -> FileHelper.loadResourceFile("all.txt", StopWords.getClass).split(sys.props("line.separator")).toSet); + + //val STOP_WORDS = FileHelper.loadResourceFile("stopwords-en.txt", StopWords.getClass).split(sys.props("line.separator")).toSet + private var stopWordsMap: Map[String, Set[String]] = new HashMap[String, Set[String]]() def removePunctuation(str: String): String = { PUNCTUATION.replaceAll(str) } - + def getStopWords(language: Language): Set[String] = { val lname = language.toString() var stopWords = stopWordsMap.get(lname) @@ -69,6 +60,7 @@ object StopWords extends Logging{ } stopWords } + def getCandidateWords(strippedInput: String, language: Language): Array[String] = { language match { case English => string.SPACE_SPLITTER.split(strippedInput) @@ -84,39 +76,22 @@ object StopWords extends Logging{ val strippedInput: String = removePunctuation(content) val candidateWords = getCandidateWords(strippedInput, language) - + var overlappingStopWords: List[String] = List[String]() - - val languageCode : String = detectLanguage(content) - val stopWords:Set[String] = stopWordsMap(languageCode) - val stopWordsMatcher = languageCode match { - case "ko" => overlappingStopWordsMatherForKorean(_, _) - case other => overlappingStopWordsMatcherForNormal(_, _) - } + val STOP_WORDS = getStopWords(language) + candidateWords.foreach(w => { -//TODO w.toLowercase ??? - if(stopWordsMatcher(stopWords, w)) overlappingStopWords.add(w.toLowerCase) + if (STOP_WORDS.contains(w.toLowerCase)) { + overlappingStopWords = w.toLowerCase :: overlappingStopWords + } }) ws.setWordCount(candidateWords.length) ws.setStopWordCount(overlappingStopWords.size) ws.setStopWords(overlappingStopWords) ws } - - def overlappingStopWordsMatherForKorean(stopWords:Set[String], w:String):Boolean = stopWords.exists(w.endsWith(_)) - def overlappingStopWordsMatcherForNormal(stopWords:Set[String],w:String):Boolean = stopWords.contains(w.toLowerCase) - /** - * This method returns the code of the language identified in the content - * passed as parameter. - */ - def detectLanguage(content: String): String = { - val language = detector.detectLang(content) - stopWordsMap.keys.find(language == _).getOrElse("en") - } - - def tokenize(line: String): List[String] = { var seg = new ComplexSeg(Dictionary.getInstance()); diff --git a/src/main/scala/com/gravity/goose/utils/FileHelper.scala b/src/main/scala/com/gravity/goose/utils/FileHelper.scala index 2fb434832..c6adc2cd7 100644 --- a/src/main/scala/com/gravity/goose/utils/FileHelper.scala +++ b/src/main/scala/com/gravity/goose/utils/FileHelper.scala @@ -37,7 +37,8 @@ object FileHelper extends Logging { filedata = IOUtils.toString(is, "UTF-8") } catch { - case e: IOException => warn(e, e.toString) + case e: IOException => warn(s"Error while reading $filename: "+e, e.toString) + case e: NullPointerException => warn(s"Error while reading $filename: "+e, e.toString) } filedata } From d1034d0dcf9340df4bf85b7ad9d91297ca7cd1e5 Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Mon, 7 Jul 2014 15:58:56 +0300 Subject: [PATCH 275/347] - partially integrate assembly (but works with scala 2.9 only) --- build.sbt | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index a54ca0cb2..46fda7eb9 100644 --- a/build.sbt +++ b/build.sbt @@ -1,12 +1,16 @@ import sbt._ import Keys._ import com.typesafe.sbteclipse.plugin.EclipsePlugin.EclipseKeys +//assembly: import com.twitter.sbt._ +//assembly: import AssemblyKeys._ + +//assembly: seq(StandardProject.newSettings: _*) organization := "com.gravity.goose" -name := "goose-fork" +name := "goose" -version := "2.1.23" +version := "2.1.22-kkme" //scalaVersion := "2.11.1" scalaVersion := "2.10.2" @@ -17,6 +21,7 @@ testFrameworks += TestFrameworks.ScalaTest testOptions in Test += Tests.Argument("-oF") +//assembly: seq(assemblySettings: _*) resolvers ++= Seq( //"sonatype snapshots" at "https://oss.sonatype.org/content/repositories/snapshots", "central mvn repo" at "http://repo1.maven.org/", @@ -25,6 +30,8 @@ resolvers ++= Seq( "JLangDetect Maven repository" at "https://jlangdetect.googlecode.com/svn/repo" ) +credentials += Credentials(Path.userHome / ".ivy2" / ".credentials") + libraryDependencies ++= { Seq( "org.scalatest" %% "scalatest" % "2.1.6" % "test", @@ -57,3 +64,7 @@ libraryDependencies ++= { publishTo := Some(Resolver.file("Github Pages", Path.userHome /"repo" / "maven" asFile)(Patterns(true, Resolver.mavenStyleBasePattern))) EclipseKeys.createSrc := EclipseCreateSrc.Default + EclipseCreateSrc.Resource + +//assembly: packageDistDir <<= (baseDirectory, packageDistName) { (b, n) => b / "release" } + +parallelExecution in Test := false From 723fffe79c6f093e83cf8049342c7a64933278b6 Mon Sep 17 00:00:00 2001 From: Theodore Lee <thl2516@gmail.com> Date: Mon, 7 Jul 2014 22:03:22 +0900 Subject: [PATCH 276/347] updated build.sbt --- build.sbt | 2 + pom.xml | 178 ------------------------------------------------------ 2 files changed, 2 insertions(+), 178 deletions(-) delete mode 100644 pom.xml diff --git a/build.sbt b/build.sbt index 955b997c9..3216ac33e 100644 --- a/build.sbt +++ b/build.sbt @@ -39,4 +39,6 @@ libraryDependencies ++= { ) } +publishMavenStyle := true + publishTo := Some(Resolver.file("Github Pages", Path.userHome /"repo" / "maven" asFile)(Patterns(true, Resolver.mavenStyleBasePattern))) \ No newline at end of file diff --git a/pom.xml b/pom.xml deleted file mode 100644 index c7c427669..000000000 --- a/pom.xml +++ /dev/null @@ -1,178 +0,0 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - - <groupId>com.unfold</groupId> - <artifactId>goose-fork</artifactId> - <version>2.1.25</version> - - <packaging>jar</packaging> - - <name>Goose - Unfold Fork</name> - - <distributionManagement> - <repository> - <id>unfold-release</id> - <name>Unfold Nexus Release Repository</name> - <url>http://nexus.unfold.com:8081/nexus/content/repositories/releases</url> - </repository> - <snapshotRepository> - <id>unfold-snapshot</id> - <name>Unfold Nexus Snapshot Repository</name> - <url>http://nexus.unfold.com:8081/nexus/content/repositories/snapshots</url> - </snapshotRepository> - </distributionManagement> - - <properties> - <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - <maven.compiler.source>1.5</maven.compiler.source> - <maven.compiler.target>1.5</maven.compiler.target> - </properties> - - <dependencies> - <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - <version>4.8.1</version> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - <version>1.7.5</version> - </dependency> - - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-log4j12</artifactId> - <version>1.7.5</version> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>org.jsoup</groupId> - <artifactId>jsoup</artifactId> - <version>1.7.2</version> - </dependency> - - <dependency> - <groupId>commons-io</groupId> - <artifactId>commons-io</artifactId> - <version>2.2</version> - </dependency> - - <dependency> - <groupId>org.scala-lang</groupId> - <artifactId>scala-compiler</artifactId> - <version>2.9.2</version> - </dependency> - - <dependency> - <groupId>org.scala-lang</groupId> - <artifactId>scala-library</artifactId> - <version>2.9.2</version> - </dependency> - - <dependency> - <groupId>org.apache.httpcomponents</groupId> - <artifactId>httpclient</artifactId> - <version>4.3.1</version> - </dependency> - - <dependency> - <groupId>commons-lang</groupId> - <artifactId>commons-lang</artifactId> - <version>2.6</version> - </dependency> - - <dependency> - <groupId>com.googlecode.juniversalchardet</groupId> - <artifactId>juniversalchardet</artifactId> - <version>1.0.3</version> - </dependency> - - </dependencies> - - <!-- Hey... since we're open source, let's compile the source and javadocs into jars as well --> - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <version>2.6</version> - <configuration> - <useFile>false</useFile> - <disableXmlReport>false</disableXmlReport> - <includes> - <include>**/*Test.*</include> - </includes> - <excludes> - <exclude>**/*IT.*</exclude> - </excludes> - </configuration> - </plugin> - <plugin> - <groupId>org.scala-tools</groupId> - <artifactId>maven-scala-plugin</artifactId> - <version>2.14.3</version> - <configuration> - <charset>UTF-8</charset> - <jvmArgs> - <jvmArg>-Xmx1024m</jvmArg> - </jvmArgs> - </configuration> - <executions> - <execution> - <id>compile</id> - <goals> - <goal>compile</goal> - </goals> - <phase>compile</phase> - </execution> - <execution> - <id>test-compile</id> - <goals> - <goal>testCompile</goal> - </goals> - <phase>test-compile</phase> - </execution> - <execution> - <phase>process-resources</phase> - <goals> - <goal>compile</goal> - </goals> - </execution> - - </executions> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-source-plugin</artifactId> - <version>2.1.2</version> - <executions> - <execution> - <id>attach-sources</id> - <goals> - <goal>jar</goal> - </goals> - </execution> - </executions> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-javadoc-plugin</artifactId> - <version>2.8</version> - <executions> - <execution> - <id>attach-javadocs</id> - <goals> - <goal>jar</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - -</project> From f1eb1ed9cdecd8b1b22bb3d40598029a6cb4dcb9 Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Mon, 7 Jul 2014 16:25:19 +0300 Subject: [PATCH 277/347] - removed --- src/main/java/com/jimplush/goose/Article.java | 191 ---- .../com/jimplush/goose/Configuration.java | 84 -- .../com/jimplush/goose/ContentExtractor.java | 950 ------------------ src/main/java/eu/ahref/Test.java | 53 - 4 files changed, 1278 deletions(-) delete mode 100644 src/main/java/com/jimplush/goose/Article.java delete mode 100644 src/main/java/com/jimplush/goose/Configuration.java delete mode 100644 src/main/java/com/jimplush/goose/ContentExtractor.java delete mode 100644 src/main/java/eu/ahref/Test.java diff --git a/src/main/java/com/jimplush/goose/Article.java b/src/main/java/com/jimplush/goose/Article.java deleted file mode 100644 index d6a11bddc..000000000 --- a/src/main/java/com/jimplush/goose/Article.java +++ /dev/null @@ -1,191 +0,0 @@ -package com.jimplush.goose; -/** - * User: jim plush - * Date: 12/16/10 - */ - -import com.jimplush.goose.images.Image; -import org.apache.log4j.Logger; -import org.jsoup.nodes.Element; - -import java.net.MalformedURLException; -import java.net.URL; -import java.util.ArrayList; - -/** - * This class represents the extraction of an Article from a website - */ -public class Article { - - private static final Logger logger = Logger.getLogger(Article.class); - - /** - * Holds the title of the webpage - */ - private String title; - - /** - * holds the metadescription meta tag in the html doc - */ - private String metaDescription; - - - /** - * holds the clean text after we do strip out everything but the text and wrap it up in a nice package - * this is the guy you probably want, just pure text - */ - private String cleanedArticleText; - - - /** - * holds the meta keywords that would in the meta tag of the html doc - */ - private String metaKeywords; - - - /** - * holds the meta data canonical link that may be place in the meta tags of the html doc - */ - private String canonicalLink; - - - /** - * holds the domain of where the link came from. - * http://techcrunch.com/article/testme would be techcrunch.com as the domain - */ - private String domain; - - /** - * this represents the jSoup element that we think is the big content dude of this page - * we can use this node to start grabbing text, images, etc.. around the content - */ - private Element topNode; - - - /** - * if image extractor is enable this would hold the image we think is the best guess for the web page - */ - private Image topImage; - - - /** - * holds an array of the image candidates we thought might perhaps we decent images related - * to the content - */ - private ArrayList<String> imageCandidates = new ArrayList<String>(); - - - /** - * holds a list of elements that related to youtube or vimeo movie embeds - */ - private ArrayList<Element> movies; - - /* - * holds the original content of document - */ - private String OriginalDoc; - - /** - * returns the title of the webpage - * - * @return - */ - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getOriginalDoc() { - return OriginalDoc; - } - - public void setOriginalDoc(String originalDoc) { - OriginalDoc = originalDoc; - } - - public String getMetaDescription() { - return metaDescription; - } - - public void setMetaDescription(String metaDescription) { - this.metaDescription = metaDescription; - } - - public String getMetaKeywords() { - return metaKeywords; - } - - public void setMetaKeywords(String metaKeywords) { - this.metaKeywords = metaKeywords; - } - - public String getCanonicalLink() { - return canonicalLink; - } - - public void setCanonicalLink(String canonicalLink) { - this.canonicalLink = canonicalLink; - } - - public String getDomain() { - return domain; - } - - public void setDomain(String urlToParse) { - String domain = ""; - - URL url = null; - try { - url = new URL(urlToParse); - domain = url.getHost(); - } catch (MalformedURLException e) { - logger.error(e.toString(), e); - } - this.domain = domain; - } - - public Element getTopNode() { - return topNode; - } - - public void setTopNode(Element topNode) { - this.topNode = topNode; - } - - public ArrayList<Element> getMovies() { - return movies; - } - - public void setMovies(ArrayList<Element> movies) { - this.movies = movies; - } - - - public ArrayList<String> getImageCandidates() { - return imageCandidates; - } - - public void setImageCandidates(ArrayList<String> imageCandidates) { - this.imageCandidates = imageCandidates; - } - - - public Image getTopImage() { - return topImage; - } - - public void setTopImage(Image topImage) { - this.topImage = topImage; - } - - public String getCleanedArticleText() { - return cleanedArticleText; - } - - public void setCleanedArticleText(String cleanedArticleText) { - this.cleanedArticleText = cleanedArticleText; - } -} diff --git a/src/main/java/com/jimplush/goose/Configuration.java b/src/main/java/com/jimplush/goose/Configuration.java deleted file mode 100644 index ca9decc5a..000000000 --- a/src/main/java/com/jimplush/goose/Configuration.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.jimplush.goose; - -import org.apache.log4j.Logger; - -/** - * User: jim - * Date: 12/19/10 - */ - -public class Configuration { - private static final Logger logger = Logger.getLogger(Configuration.class); - - - /** - * this is the local storage path used to place images to inspect them - */ - private String localStoragePath = "/tmp/goose"; - - - /** - * What's the minimum bytes for an image we'd accept is, alot of times we want to filter out the author's little images - * in the beginning of the article - */ - private int minBytesForImages = 4500; - - - /** - * set this guy to false if you don't care about getting images, otherwise you can either use the default - * image extractor to implement the ImageExtractor interface to build your own - */ - private boolean enableImageFetching = true; - - - /** - * path to your imagemagick convert executable, on the mac using mac ports this is the default listed - */ - private String imagemagickConvertPath = "/usr/bin/convert"; - - - /** - * path to your imagemagick identify executable - */ - private String imagemagickIdentifyPath= "/usr/bin/identify"; - - public String getLocalStoragePath() { - return localStoragePath; - } - - public void setLocalStoragePath(String localStoragePath) { - this.localStoragePath = localStoragePath; - } - - public int getMinBytesForImages() { - return minBytesForImages; - } - - public void setMinBytesForImages(int minBytesForImages) { - this.minBytesForImages = minBytesForImages; - } - - public boolean isEnableImageFetching() { - return enableImageFetching; - } - - public void setEnableImageFetching(boolean enableImageFetching) { - this.enableImageFetching = enableImageFetching; - } - - public String getImagemagickConvertPath() { - return imagemagickConvertPath; - } - - public void setImagemagickConvertPath(String imagemagickConvertPath) { - this.imagemagickConvertPath = imagemagickConvertPath; - } - - public String getImagemagickIdentifyPath() { - return imagemagickIdentifyPath; - } - - public void setImagemagickIdentifyPath(String imagemagickIdentifyPath) { - this.imagemagickIdentifyPath = imagemagickIdentifyPath; - } -} diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java deleted file mode 100644 index a40119c3f..000000000 --- a/src/main/java/com/jimplush/goose/ContentExtractor.java +++ /dev/null @@ -1,950 +0,0 @@ -package com.jimplush.goose; - -import com.jimplush.goose.cleaners.DefaultDocumentCleaner; -import com.jimplush.goose.cleaners.DocumentCleaner; -import com.jimplush.goose.images.BestImageGuesser; -import com.jimplush.goose.images.ImageExtractor; -import com.jimplush.goose.network.HtmlFetcher; -import com.jimplush.goose.network.MaxBytesException; -import com.jimplush.goose.network.NotHtmlException; -import com.jimplush.goose.outputformatters.DefaultOutputFormatter; -import com.jimplush.goose.outputformatters.OutputFormatter; -import com.jimplush.goose.texthelpers.HashUtils; -import com.jimplush.goose.texthelpers.StopWords; -import com.jimplush.goose.texthelpers.WordStats; -import org.apache.commons.lang.StringEscapeUtils; -import org.apache.http.client.HttpClient; -import org.apache.log4j.Logger; -import org.jsoup.nodes.Attribute; -import org.jsoup.nodes.Attributes; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.parser.Tag; -import org.jsoup.select.Elements; - -import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Set; - -/** - * User: jim plush - * Date: 12/16/10 - * a lot of work in this class is based on Arc90's readability code that does content extraction in JS - * I wasn't able to find a good server side codebase to acheive the same so I started with their base ideas and then - * built additional metrics on top of it such as looking for clusters of english stopwords. - * Gravity was doing 30+ million links per day with this codebase across a series of crawling servers for a project - * and it held up well. Our current port is slightly different than this one but I'm working to align them so the goose - * project gets the love as we continue to move forward. - */ - - -public class ContentExtractor { - - - // PRIVATE PROPERTIES BELOW - - private static final Logger logger = Logger.getLogger(ContentExtractor.class); - - /** - * holds the configuration settings we want to use - */ - private Configuration config; - - // sets the default cleaner class to prep the HTML for parsing - private DocumentCleaner documentCleaner; - - - // the MD5 of the URL we're currently parsing, used to references the images we download to the url so we - // can more easily clean up resources when we're done with the page. - private String linkhash; - - - // once we have our topNode then we want to format that guy for output to the user - private OutputFormatter outputFormatter; - - private ImageExtractor imageExtractor; - - - /** - * you can optionally pass in a configuration object here that will allow you to override the settings - * that goose comes default with - */ - public ContentExtractor() { - this.config = new Configuration(); - } - - /** - * overloaded to accept a custom configuration object - * - * @param config - */ - public ContentExtractor(Configuration config) { - this.config = config; - } - - public Article extractContent(String urlToCrawl){ - return extractContent(urlToCrawl, ""); - } - - public Article extractContent(String urlToCrawl,String rawHtml){ - - try { - URL url = new URL(urlToCrawl); - this.linkhash = HashUtils.md5(urlToCrawl); - } catch (MalformedURLException e) { - throw new IllegalArgumentException("Invalid URL Passed in: " + urlToCrawl, e); - } - - ParseWrapper parseWrapper = new ParseWrapper(); - Article article; - try { - - if(rawHtml=="") - rawHtml = HtmlFetcher.getHtml(urlToCrawl); - Document doc = parseWrapper.parse(rawHtml, urlToCrawl); - DocumentCleaner documentCleaner = getDocCleaner(); - doc = documentCleaner.clean(doc); - - article = new Article(); - - article.setTitle(getTitle(doc, article)); - article.setMetaDescription(getMetaDescription(doc)); - article.setMetaKeywords(getMetaKeywords(doc)); - article.setCanonicalLink(getCanonicalLink(doc, urlToCrawl)); - article.setDomain(article.getCanonicalLink()); - article.setOriginalDoc(rawHtml); - - - // extract the content of the article - article.setTopNode(calculateBestNode(doc)); - - // extract any movie embeds out from our main article content - article.setMovies(extractVideos(article.getTopNode())); - - - if (config.isEnableImageFetching()) { - HttpClient httpClient = HtmlFetcher.getHttpClient(); - imageExtractor = getImageExtractor(httpClient, urlToCrawl); - article.setTopImage(imageExtractor.getBestImage(doc, article.getTopNode())); - - } - - // grab siblings and remove high link density elements - cleanupNode(article.getTopNode()); - - outputFormatter = getOutputFormatter(); - outputFormatter.getFormattedElement(article.getTopNode()); - - - article.setCleanedArticleText(outputFormatter.getFormattedText()); - - // cleans up all the temp images that we've downloaded - releaseResources(); - - - logger.info("FINAL EXTRACTION TEXT: \n" + article.getCleanedArticleText()); - if (config.isEnableImageFetching()) { - logger.info("\n\nFINAL EXTRACTION IMAGE: \n" + article.getTopImage().getImageSrc()); - } - - - } catch (MaxBytesException e) { - logger.error(e.toString(), e); - throw new RuntimeException(e); - } catch (NotHtmlException e) { - logger.error(e.toString(), e); - throw new RuntimeException(e); - } - - - return article; - } - - - // todo create a setter for this for people to override output formatter - private OutputFormatter getOutputFormatter() { - if (outputFormatter == null) { - return new DefaultOutputFormatter(); - } else { - return outputFormatter; - } - - } - - - private ImageExtractor getImageExtractor(HttpClient httpClient, String urlToCrawl) { - - if (imageExtractor == null) { - BestImageGuesser bestImageGuesser = new BestImageGuesser(this.config, httpClient, urlToCrawl); - return bestImageGuesser; - } else { - return imageExtractor; - } - - } - - /** - * todo allow for setter to override the default documentCleaner in case user wants more flexibility - * - * @return - */ - private DocumentCleaner getDocCleaner() { - if (this.documentCleaner == null) { - return new DefaultDocumentCleaner(); - } - return this.documentCleaner; - } - - /** - * attemps to grab titles from the html pages, lots of sites use different delimiters - * for titles so we'll try and do our best guess. - * - * @param doc - * @param article - * @return - */ - private String getTitle(Document doc, Article article) { - String title = ""; - - try { - - String titleText = ""; - - titleText = doc.getElementsByTag("title").first().text(); - - boolean usedDelimeter = false; - - if (titleText.contains("|")) { - titleText = doTitleSplits(titleText, "\\|"); - usedDelimeter = true; - } - - if (titleText.contains("-") && !usedDelimeter) { - titleText = doTitleSplits(titleText, " - "); - usedDelimeter = true; - } - if (titleText.contains("»") && !usedDelimeter) { - titleText = doTitleSplits(titleText, "»"); - usedDelimeter = true; - } - - if (titleText.contains(":") && !usedDelimeter) { - titleText = doTitleSplits(titleText, ":"); - usedDelimeter = true; - } - - // encode unicode charz - title = StringEscapeUtils.escapeHtml(titleText); - ; - - // todo this is a hack until I can fix this.. weird motely crue error with - // http://money.cnn.com/2010/10/25/news/companies/motley_crue_bp.fortune/index.htm?section=money_latest - title = title.replace("�", ""); - - logger.info("Page title is: " + title); - - } catch (NullPointerException e) { - logger.error(e.toString()); - } - return title; - - } - - /** - * based on a delimeter in the title take the longest piece or do some custom logic based on the site - * - * @param title - * @param delimeter - * @return - */ - private String doTitleSplits(String title, String delimeter) { - - String largeText = ""; - int largetTextLen = 0; - - String[] titlePieces = title.split(delimeter); - - // take the largest split - for (String p : titlePieces) { - if (p.length() > largetTextLen) { - largeText = p; - largetTextLen = p.length(); - } - } - - largeText = largeText.replace("»", ""); - largeText = largeText.replace("»", ""); - - - return largeText.trim(); - - - } - - - /** - * if the article has meta description set in the source, use that - */ - private String getMetaDescription(Document doc) { - String metaDescription = ""; - Elements meta = doc.select("meta[name=description]"); - if (meta.size() > 0) { - metaDescription = meta.first().attr("content").trim(); - } - return metaDescription; - } - - /** - * if the article has meta keywords set in the source, use that - */ - private String getMetaKeywords(Document doc) { - String metaKeywords = ""; - Elements meta = doc.select("meta[name=keywords]"); - if (meta.size() > 0) { - metaKeywords = meta.first().attr("content").trim(); - } - return metaKeywords; - } - - /** - * if the article has meta canonical link set in the url - */ - private String getCanonicalLink(Document doc, String baseUrl) { - String canonicalUrl = ""; - Elements meta = doc.select("link[rel=canonical]"); - if (meta.size() > 0) { - canonicalUrl = meta.first().attr("href").trim(); - - } - - // set domain based on canonicalUrl - URL url = null; - try { - - if (canonicalUrl != null) { - if (!canonicalUrl.startsWith("http://")) { - url = new URL(new URL(baseUrl), canonicalUrl); - } else { - url = new URL(canonicalUrl); - } - - } else { - url = new URL(baseUrl); - } - - } catch (MalformedURLException e) { - logger.error(e.toString(), e); - } - return canonicalUrl; - - - } - - private String getDomain(String canonicalLink) { - URL url = null; - try { - url = new URL(canonicalLink); - String domain = url.getHost(); - return domain; - } catch (MalformedURLException e) { - throw new RuntimeException(e); - } - - } - -private Element calculateBestNode(Document doc) { - logger.info("CalculateBestNode BEGIN"); - Elements itemsMeta = doc.getElementsByTag("meta"); - for (Element item : itemsMeta) { - if(item.attributes().get("content").equals("blogger")){ - logger.info("Blogger detected"); - - Elements elementsh3 = doc.getElementsByTag("h3"); - for(Element itemh : elementsh3){ - if(itemh.attributes().get("class").equals("post-title entry-title")) - logger.info(itemh); - } - logger.info("Trovato tutto"); - } - } - logger.info("CalculateBestNode END"); - try{ - return calculateBestNodeBasedOnClustering(doc); - }catch(Exception e){ - logger.error(e); - return null; - } -} - - /** - * we're going to start looking for where the clusters of paragraphs are. We'll score a cluster based on the number of stopwords - * and the number of consecutive paragraphs together, which should form the cluster of text that this node is around - * also store on how high up the paragraphs are, comments are usually at the bottom and should get a lower score - * - * @return - */ - private Element calculateBestNodeBasedOnClustering(Document doc) { - Element topNode = null; - - // grab all the paragraph elements on the page to start to inspect the likely hood of them being good peeps - ArrayList<Element> nodesToCheck = getNodesToCheck(doc); - - double startingBoost = 1.0; - int cnt = 0; - int i = 0; - - // holds all the parents of the nodes we're checking - Set<Element> parentNodes = new HashSet<Element>(); - - - ArrayList<Element> nodesWithText = new ArrayList<Element>(); - - - for (Element node : nodesToCheck) { - - String nodeText = node.text(); - WordStats wordStats = StopWords.getStopWordCount(nodeText); - boolean highLinkDensity = isHighLinkDensity(node); - - - if (wordStats.getStopWordCount() > 2 && !highLinkDensity) { - - nodesWithText.add(node); - } - - } - - int numberOfNodes = nodesWithText.size(); - int negativeScoring = 0; // we shouldn't give more negatives than positives - // we want to give the last 20% of nodes negative scores in case they're comments - double bottomNodesForNegativeScore = (float) numberOfNodes * 0.25; - - logger.info("About to inspect num of nodes with text: " + numberOfNodes); - - for (Element node : nodesWithText) { - - // add parents and grandparents to scoring - // only add boost to the middle paragraphs, top and bottom is usually jankz city - // so basically what we're doing is giving boost scores to paragraphs that appear higher up in the dom - // and giving lower, even negative scores to those who appear lower which could be commenty stuff - - float boostScore = 0; - - if (isOkToBoost(node, i)) { - if (cnt >= 0) { - boostScore = (float) ((1.0 / startingBoost) * 50); - startingBoost++; - } - } - - - // check for negative node values - if (numberOfNodes > 15) { - if ((numberOfNodes - i) <= bottomNodesForNegativeScore) { - float booster = (float) bottomNodesForNegativeScore - (float) (numberOfNodes - i); - boostScore = -(float) Math.pow(booster, (float) 2); - - // we don't want to score too highly on the negative side. - float negscore = Math.abs(boostScore) + negativeScoring; - if (negscore > 40) { - boostScore = 5; - } - } - } - - - logger.info("Location Boost Score: " + boostScore + " on interation: " + i + "' id='" + node.parent().id() + "' class='" + node.parent().attr("class")); - String nodeText = node.text(); - WordStats wordStats = StopWords.getStopWordCount(nodeText); - int upscore = (int) (wordStats.getStopWordCount() + boostScore); - updateScore(node.parent(), upscore); - updateScore(node.parent().parent(), upscore / 2); - updateNodeCount(node.parent(), 1); - updateNodeCount(node.parent().parent(), 1); - - if (!parentNodes.contains(node.parent())) { - parentNodes.add(node.parent()); - } - - if (!parentNodes.contains(node.parent().parent())) { - parentNodes.add(node.parent().parent()); - } - - cnt++; - i++; - } - - - // now let's find the parent node who scored the highest - - int topNodeScore = 0; - for (Element e : parentNodes) { - - - logger.info("ParentNode: score='" + e.attr("gravityScore") + "' nodeCount='" + e.attr("gravityNodes") + "' id='" + e.id() + "' class='" + e.attr("class") + "' "); - - //int score = Integer.parseInt(e.attr("gravityScore")) * Integer.parseInt(e.attr("gravityNodes")); - int score = getScore(e); - if (score > topNodeScore) { - topNode = e; - topNodeScore = score; - } - - if (topNode == null) { - topNode = e; - } - } - - logger.info("Our TOPNODE: score='" + topNode.attr("gravityScore") + "' nodeCount='" + topNode.attr("gravityNodes") + "' id='" + topNode.id() + "' class='" + topNode.attr("class") + "' "); - String logText = ""; - String targetText = ""; - Element topPara = topNode.getElementsByTag("p").first(); - if (topPara == null) { - topNode.text(); - } else { - topPara.text(); - } - - if (targetText.length() >= 51) { - logText = targetText.substring(0, 50); - } else { - logText = targetText; - } - logger.info("TOPNODE TEXT: " + logText.trim()); - - - return topNode; - - - } - - /** - * returns a list of nodes we want to search on like paragraphs and tables - * - * @return - */ - private ArrayList<Element> getNodesToCheck(Document doc) { - ArrayList<Element> nodesToCheck = new ArrayList<Element>(); - - Elements items = doc.getElementsByTag("p"); - for (Element item : items) { - nodesToCheck.add(item); - } - Elements items2 = doc.getElementsByTag("pre"); - for (Element item : items2) { - nodesToCheck.add(item); - } - Elements items3 = doc.getElementsByTag("td"); - for (Element item : items3) { - nodesToCheck.add(item); - } - return nodesToCheck; - - } - - /** - * checks the density of links within a node, is there not much text and most of it contains linky shit? - * if so it's no good - * - * @param e - * @return - */ - private static boolean isHighLinkDensity(Element e) { - - Elements links = e.getElementsByTag("a"); - String txt = e.text().trim(); - - if (links.size() == 0) { - return false; - } - - float score = 0; - String text = e.text(); - String[] words = text.split(" "); - float numberOfWords = words.length; - - - // let's loop through all the links and calculate the number of words that make up the links - StringBuilder sb = new StringBuilder(); - for (Element link : links) { - sb.append(link.text()); - } - String linkText = sb.toString(); - String[] linkWords = linkText.split(" "); - float numberOfLinkWords = linkWords.length; - - float numberOfLinks = links.size(); - - float linkDivisor = (float) (numberOfLinkWords / numberOfWords); - score = (float) linkDivisor * numberOfLinks; - - String logText = ""; - if (e.text().length() >= 51) { - logText = e.text().substring(0, 50); - } else { - logText = e.text(); - } - logger.info("Calulated link density score as: " + score + " for node: " + logText); - if (score > 1) { - return true; - } - - return false; - } - - /** - * alot of times the first paragraph might be the caption under an image so we'll want to make sure if we're going to - * boost a parent node that it should be connected to other paragraphs, at least for the first n paragraphs - * so we'll want to make sure that the next sibling is a paragraph and has at least some substatial weight to it - * - * @param node - * @param i - * @return - */ - private boolean isOkToBoost(Element node, int i) { - - int stepsAway = 0; - - Element sibling = node.nextElementSibling(); - while (sibling != null) { - - if (sibling.tagName().equals("p")) { - if (stepsAway >= 3) { - logger.info("Next paragraph is too far away, not boosting"); - return false; - } - - String paraText = sibling.text(); - String html = sibling.outerHtml(); - WordStats wordStats = StopWords.getStopWordCount(paraText); - if (wordStats.getStopWordCount() > 5) { - logger.info("We're gonna boost this node, seems contenty"); - return true; - } - - } - - // increase how far away the next paragraph is from this node - stepsAway++; - - sibling = sibling.nextElementSibling(); - } - - - return false; - } - - - /** - * adds a score to the gravityScore Attribute we put on divs - * we'll get the current score then add the score we're passing in to the current - * - * @param node - * @param addToScore - the score to add to the node - */ - private void updateScore(Element node, int addToScore) { - int currentScore; - try { - currentScore = Integer.parseInt(node.attr("gravityScore")); - } catch (NumberFormatException e) { - currentScore = 0; - } - int newScore = currentScore + addToScore; - node.attr("gravityScore", Integer.toString(newScore)); - - } - - /** - * stores how many decent nodes are under a parent node - * - * @param node - * @param addToCount - */ - private void updateNodeCount(Element node, int addToCount) { - int currentScore; - try { - currentScore = Integer.parseInt(node.attr("gravityNodes")); - } catch (NumberFormatException e) { - currentScore = 0; - } - int newScore = currentScore + addToCount; - node.attr("gravityNodes", Integer.toString(newScore)); - - } - - - /** - * returns the gravityScore as an integer from this node - * - * @param node - * @return - */ - private int getScore(Element node) { - try { - return Integer.parseInt(node.attr("gravityScore")); - } catch (NumberFormatException e) { - return 0; - } catch (NullPointerException e) { - return 0; - } - } - - - /** - * pulls out videos we like - * - * @return - */ - private ArrayList<Element> extractVideos(Element node) { - ArrayList<Element> candidates = new ArrayList<Element>(); - ArrayList<Element> goodMovies = new ArrayList<Element>(); - try { - - - Elements embeds = node.parent().getElementsByTag("embed"); - for (Element el : embeds) { - candidates.add(el); - } - Elements objects = node.parent().getElementsByTag("object"); - for (Element el : objects) { - candidates.add(el); - } - - logger.info("extractVideos: Starting to extract videos. Found: " + candidates.size()); - - for (Element el : candidates) { - - Attributes attrs = el.attributes(); - - for (Attribute a : attrs) { - try { - logger.info(a.getKey() + " : " + a.getValue()); - if ((a.getValue().contains("youtube") || a.getValue().contains("vimeo")) && a.getKey().equals("src")) { - logger.info("Found video... setting"); - - - logger.info("This page has a video!: " + a.getValue()); - goodMovies.add(el); - - } - } catch (Exception e) { - logger.error(e.toString()); - e.printStackTrace(); - } - } - - } - } catch (NullPointerException e) { - logger.info(e.toString()); - } catch (Exception e) { - logger.error(e.toString()); - } - logger.info("extractVideos: done looking videos"); - return goodMovies; - } - - - /** - * remove any divs that looks like non-content, clusters of links, or paras with no gusto - * - * @param node - * @return - */ - private Element cleanupNode(Element node) { - - logger.info("Starting cleanup Node"); - - node = addSiblings(node); - - Elements nodes = node.children(); - for (Element e : nodes) { - if (e.tagName().equals("p")) { - continue; - } - logger.info("CLEANUP NODE: " + e.id() + " class: " + e.attr("class")); - boolean highLinkDensity = isHighLinkDensity(e); - if (highLinkDensity) { - logger.info("REMOVING NODE FOR LINK DENSITY: " + e.id() + " class: " + e.attr("class")); - e.remove(); - continue; - } - // now check for word density - // grab all the paragraphs in the children and remove ones that are too small to matter - Elements subParagraphs = e.getElementsByTag("p"); - - - for (Element p : subParagraphs) { - if (p.text().length() < 25) { - p.remove(); - } - } - - // now that we've removed shorty paragraphs let's make sure to exclude any first paragraphs that don't have paras as - // their next siblings to avoid getting img bylines - // first let's remove any element that now doesn't have any p tags at all - Elements subParagraphs2 = e.getElementsByTag("p"); - if (subParagraphs2.size() == 0 && !e.tagName().equals("td")) { - logger.info("Removing node because it doesn't have any paragraphs"); - e.remove(); - continue; - } - - //if this node has a decent enough gravityScore we should keep it as well, might be content - int topNodeScore = getScore(node); - int currentNodeScore = getScore(e); - float thresholdScore = (float) (topNodeScore * .08); - logger.info("topNodeScore: " + topNodeScore + " currentNodeScore: " + currentNodeScore + " threshold: " + thresholdScore); - if (currentNodeScore < thresholdScore) { - if (!e.tagName().equals("td")) { - logger.info("Removing node due to low threshold score"); - e.remove(); - } else { - logger.info("Not removing TD node"); - } - - continue; - } - - } - - return node; - - } - - - /** - * adds any siblings that may have a decent score to this node - * - * @param node - * @return - */ - private Element addSiblings(Element node) { - - logger.info("Starting to add siblings"); - - int baselineScoreForSiblingParagraphs = getBaselineScoreForSiblings(node); - - Element currentSibling = node.previousElementSibling(); - while (currentSibling != null) { - logger.info("SIBLINGCHECK: " + debugNode(currentSibling)); - - if (currentSibling.tagName().equals("p")) { - - node.child(0).before(currentSibling.outerHtml()); - currentSibling = currentSibling.previousElementSibling(); - continue; - } - - // check for a paraph embedded in a containing element - Element firstParagraph = currentSibling.getElementsByTag("p").first(); - if (firstParagraph == null) { - currentSibling = currentSibling.previousElementSibling(); - continue; - } - WordStats wordStats = StopWords.getStopWordCount(firstParagraph.text()); - - int paragraphScore = wordStats.getStopWordCount(); - - if ((float) (baselineScoreForSiblingParagraphs * .30) < paragraphScore) { - logger.info("This node looks like a good sibling, adding it"); - node.child(0).before("<p>"+firstParagraph.text()+"<p>"); - } - - currentSibling = currentSibling.previousElementSibling(); - } - return node; - - - } - - /** - * we could have long articles that have tons of paragraphs so if we tried to calculate the base score against - * the total text score of those paragraphs it would be unfair. So we need to normalize the score based on the average scoring - * of the paragraphs within the top node. For example if our total score of 10 paragraphs was 1000 but each had an average value of - * 100 then 100 should be our base. - * - * @param topNode - * @return - */ - private int getBaselineScoreForSiblings(Element topNode) { - - int base = 100000; - - int numberOfParagraphs = 0; - int scoreOfParagraphs = 0; - - Elements nodesToCheck = topNode.getElementsByTag("p"); - - for (Element node : nodesToCheck) { - - String nodeText = node.text(); - WordStats wordStats = StopWords.getStopWordCount(nodeText); - boolean highLinkDensity = isHighLinkDensity(node); - - - if (wordStats.getStopWordCount() > 2 && !highLinkDensity) { - - numberOfParagraphs++; - scoreOfParagraphs += wordStats.getStopWordCount(); - } - - } - - if (numberOfParagraphs > 0) { - base = scoreOfParagraphs / numberOfParagraphs; - logger.info("The base score for siblings to beat is: " + base + " NumOfParas: " + numberOfParagraphs + " scoreOfAll: " + scoreOfParagraphs); - } - - return base; - - - } - - private String debugNode(Element e) { - - StringBuilder sb = new StringBuilder(); - sb.append("GravityScore: '"); - sb.append(e.attr("gravityScore")); - sb.append("' paraNodeCount: '"); - sb.append(e.attr("gravityNodes")); - sb.append("' nodeId: '"); - sb.append(e.id()); - sb.append("' className: '"); - sb.append(e.attr("class")); - return sb.toString(); - - } - - /** - * cleans up any temp shit we have laying around like temp images - * removes any image in the temp dir that starts with the linkhash of the url we just parsed - */ - public void releaseResources() { - logger.info("STARTING TO RELEASE ALL RESOURCES"); - File dir = new File(config.getLocalStoragePath()); - String[] children = dir.list(); - - if (children == null) { - logger.warn("No Temp images found for linkhash: " + this.linkhash); - } else { - for (int i = 0; i < children.length; i++) { - // Get filename of file or directory - String filename = children[i]; - - if (filename.startsWith(this.linkhash)) { - - File f = new File(dir.getAbsolutePath() + "/" + filename); - if (!f.delete()) { - logger.error("Unable to remove temp file: " + filename); - } - } - } - } - - } - - -} diff --git a/src/main/java/eu/ahref/Test.java b/src/main/java/eu/ahref/Test.java deleted file mode 100644 index 57ef71787..000000000 --- a/src/main/java/eu/ahref/Test.java +++ /dev/null @@ -1,53 +0,0 @@ -package eu.ahref; - -import com.jimplush.goose.Article; -import com.jimplush.goose.ContentExtractor; - -/** - * Created by IntelliJ IDEA. - * User: martino - * Date: 14/01/11 - * Time: 11.49 - * To change this template use File | Settings | File Templates. - */ -public class Test { - public void testUrl(String url){ - ContentExtractor contentExtractor = new ContentExtractor(); - Article article = contentExtractor.extractContent(url); - String title = article.getTitle(); - String text = article.getCleanedArticleText(); - System.out.println(title); - System.out.println(text); - - } - - public static void main(String[] args){ - String valigiabluUrl = "http://http://www.valigiablu.it/doc/353/il-dramma-de-laquila-a-21-mesi-dal-sisma.htm"; - String foursquareUrl = "http://4sq.com/eHo5Wv"; - String twitterUrl = "http://bit.ly/fJYQwr"; - String twitterUrlExpand = "http://twitter.com/jayrosen_nyu/status/25729475291389952#"; - String yfrog = "http://yfrog.com/h0m0gygj"; - String laStampa = "http://tinyurl.com/36swakc"; - String Reuters = "http://flpbd.it/F0wf"; - String Corriere = "http://t.co/y7Ztgri"; - String testUrl = "http://twitter.com/#!/jayrosen_nyu/status/25729475291389952"; - String wordpress = "http://framethink.wordpress.com/2011/01/17/how-facebook-ships-code/"; - String blogspot = "http://lhote.blogspot.com/2011/01/blindspot.html"; - String fuffa ="http://blog.flatlandia.eu/2010/09/nuitka-python-veloce.html"; - String asdasd="http://www.europaquotidiano.it/dettaglio/123976/non_regge_il_polpettone_di_signorini"; - String ar1 = "http://bit.ly/hfeSGC"; - String ar2 = "http://bit.ly/dOIiUl"; - String ar3 = "http://bit.ly/eSb56U"; - // http://bit.ly/eMUNMD - // https://www.dropbox.com/dropquest2011 - // https://www.dropbox.com/referrals/NTc4MTc5MDk?src=free_twitter - // http://lhote.blogspot.com/2011/01/blindspot.html - // http://framethink.wordpress.com/2011/01/17/how-facebook-ships-code/ - - // http://nyti.ms/fEVBUI guardare per l'immagine - System.out.println("asdasdasdasdasdasd"); - Test test = new Test(); - test.testUrl(blogspot); - } - -} From d4f6b9f5a5b50f4efbf7cdbb22e815ddeac8ba8b Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Mon, 7 Jul 2014 16:45:40 +0300 Subject: [PATCH 278/347] - integrate --- .../com/gravity/goose/Configuration.scala | 114 +++--------------- 1 file changed, 16 insertions(+), 98 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index 10f36c71b..d88234053 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -41,29 +41,12 @@ import Language._ * Date: 8/16/11 */ + +class Configuration { + /** - * @param localStoragePath this is the local storage path used to place images - * to inspect them, should be writable - * @param minBytesForImages What's the minimum bytes for an image we'd accept - * is, alot of times we want to filter out the author's - * little images in the beginning of the article - * @param enableImageFetching set this guy to false if you don't care about - * getting images, otherwise you can either use the - * default image extractor to implement the - * ImageExtractor interface to build your own - * @param imagemagickConvertPath path to your imagemagick convert executable, on - * the mac using mac ports this is the default - * listed (Note: not on Linux...) - * @param imagemagickIdentifyPath path to your imagemagick identify executable - * @param connectionTimeout Connection timeout for the crawler. - * @param socketTimeout Socket timeout for the crawler. - * @param browserUserAgent used as the user agent that is sent with your web - * requests to extract an article - * @param publishDateExtractor Pass in to extract article publish dates. - * @param additionalDataExtractor Pass in to extract any additional data not - * defined within {@link Article}. + * this is the local storage path used to place images to inspect them, should be writable */ -class Configuration( @BeanProperty var language: Language = Language.English @@ -77,7 +60,6 @@ class Configuration( * in the beginning of the article */ @BeanProperty -<<<<<<< .mine var minBytesForImages: Int = 4500 /** * Minimum legal height for an image - smaller than this considered unusable/undesirable @@ -93,55 +75,23 @@ class Configuration( * set this guy to false if you don't care about getting images, otherwise you can either use the default * image extractor to implement the ImageExtractor interface to build your own */ -======= - var minBytesForImages: Int = 4500, - - - - - - - - - - - - - - ->>>>>>> .theirs @BeanProperty - var enableImageFetching: Boolean = true, + var enableImageFetching: Boolean = true + /** + * path to your imagemagick convert executable, on the mac using mac ports this is the default listed + */ @BeanProperty -<<<<<<< .mine var imagemagickConvertPath: String = "convert" /** * path to your imagemagick identify executable */ -======= - var imagemagickConvertPath: String = "/opt/local/bin/convert", - - - ->>>>>>> .theirs @BeanProperty -<<<<<<< .mine var imagemagickIdentifyPath: String = "identify" -======= - var imagemagickIdentifyPath: String = "/opt/local/bin/identify", - ->>>>>>> .theirs @BeanProperty -<<<<<<< .mine var connectionTimeout: Int = 10000 // 10 seconds -======= - var connectionTimeout: Int = 10000, - ->>>>>>> .theirs @BeanProperty -<<<<<<< .mine var socketTimeout: Int = 10000 // 10 seconds @BeanProperty @@ -153,21 +103,7 @@ class Configuration( /** * used as the user agent that is sent with your web requests to extract an article */ -======= - var socketTimeout: Int = 10000, - - - - - - - - - - ->>>>>>> .theirs @BeanProperty -<<<<<<< .mine var browserUserAgent: String = "Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8" /** @@ -178,42 +114,22 @@ class Configuration( var contentExtractor: ContentExtractor = StandardContentExtractor -======= - var browserUserAgent: String = - "Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.8) " + - "Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8", - var contentExtractor: ContentExtractor = StandardContentExtractor, - - - - - - ->>>>>>> .theirs var publishDateExtractor: PublishDateExtractor = new PublishDateExtractor { def extract(rootElement: Element): Date = { null } - }, - var additionalDataExtractor: AdditionalDataExtractor = - new AdditionalDataExtractor, - var htmlFetcher: AbstractHtmlFetcher = HtmlFetcher) { + } + var additionalDataExtractor: AdditionalDataExtractor = new AdditionalDataExtractor - /** - * Default constructor for Java interoperability. See - * https://issues.scala-lang.org/browse/SI-4278 why it looks like this. :( - */ - def this() = this(minBytesForImages = 4500) + def getPublishDateExtractor: PublishDateExtractor = { + publishDateExtractor + } def setContentExtractor(extractor: ContentExtractor) { if (extractor == null) throw new IllegalArgumentException("extractor must not be null!") contentExtractor = extractor } - def getPublishDateExtractor: PublishDateExtractor = { - publishDateExtractor - } - /** * Pass in to extract article publish dates. * @param extractor a concrete instance of {@link PublishDateExtractor} @@ -237,6 +153,8 @@ class Configuration( this.additionalDataExtractor = extractor } + var htmlFetcher: AbstractHtmlFetcher = HtmlFetcher + def setHtmlFetcher(fetcher: AbstractHtmlFetcher) { require(fetcher != null, "fetcher MUST NOT be null!") this.htmlFetcher = fetcher @@ -244,4 +162,4 @@ class Configuration( def getHtmlFetcher: AbstractHtmlFetcher = htmlFetcher -} +} \ No newline at end of file From c8b4bde0d244acef4499d72cdad7279afb8e8044 Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Mon, 7 Jul 2014 17:25:39 +0300 Subject: [PATCH 279/347] - remove java folders when generated by sbteclipse - fix HtmlFetcher.scala integration --- build.sbt | 6 ++++++ src/main/scala/com/gravity/goose/network/HtmlFetcher.scala | 5 ----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/build.sbt b/build.sbt index 46fda7eb9..dda8c839b 100644 --- a/build.sbt +++ b/build.sbt @@ -65,6 +65,12 @@ publishTo := Some(Resolver.file("Github Pages", Path.userHome /"repo" / "maven" EclipseKeys.createSrc := EclipseCreateSrc.Default + EclipseCreateSrc.Resource +// Get rid of java source directories in compile +unmanagedSourceDirectories in Compile <<= (scalaSource in Compile)(Seq(_)) + +// Get rid of java source directories in test +unmanagedSourceDirectories in Test <<= (scalaSource in Test)(Seq(_)) + //assembly: packageDistDir <<= (baseDirectory, packageDistName) { (b, n) => b / "release" } parallelExecution in Test := false diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index ed85d0eda..40e9b5769 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -21,13 +21,8 @@ package com.gravity.goose.network import org.apache.http.Header import org.apache.http.HeaderElement import org.apache.http.HttpEntity -<<<<<<< .mine - - -======= import org.apache.http.HttpHost import org.apache.http.HttpResponse ->>>>>>> .theirs import org.apache.http.HttpVersion import org.apache.http.{HttpRequest, HttpRequestInterceptor, HttpResponse, HttpResponseInterceptor, HeaderElementIterator} import org.apache.http.client.entity.GzipDecompressingEntity From 2918726d0c4d3a91b5d06656b834a7f11af2ce2b Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Mon, 7 Jul 2014 19:30:11 +0300 Subject: [PATCH 280/347] - add sbt-dependency-graph plugin - add icu dependency to compile in mvn --- build.sbt | 43 ++++++++++--------- pom.xml | 5 +++ project/plugins.sbt | 2 + .../goose/extractors/ContentExtractor.scala | 22 +++------- 4 files changed, 34 insertions(+), 38 deletions(-) diff --git a/build.sbt b/build.sbt index dda8c839b..9d40048d8 100644 --- a/build.sbt +++ b/build.sbt @@ -34,30 +34,29 @@ credentials += Credentials(Path.userHome / ".ivy2" / ".credentials") libraryDependencies ++= { Seq( - "org.scalatest" %% "scalatest" % "2.1.6" % "test", - "junit" % "junit" % "4.8.1" % "test", - "org.slf4j" % "slf4j-api" % "1.7.7", - "org.slf4j" % "slf4j-log4j12" % "1.7.7" % "test", - "commons-io" % "commons-io" % "2.4", - "org.apache.httpcomponents" % "httpclient" % "4.3.1", - "commons-lang" % "commons-lang" % "2.6", - "com.ibm.icu" % "icu4j" % "53.1", - "com.novocode" % "junit-interface" % "0.10-M4" % "test", - "me.champeau.jlangdetect" % "jlangdetect-extra" % "0.4", - "org.jsoup" % "jsoup" % "1.7.3", - //new - "net.liftweb" % "lift-json_2.10" % "2.5", - "log4j" % "log4j" % "1.2.14", - "com.typesafe" % "config" % "1.0.2", - "com.jsuereth" %% "scala-arm" % "1.2" , - "org.specs2" %% "specs2" % "1.13", - "junit" % "junit" % "4.8.1" % "test", - "org.jsoup" % "jsoup" % "1.5.2", + "org.slf4j" % "slf4j-api" % "1.7.7" + ,"commons-io" % "commons-io" % "2.4" + ,"org.apache.httpcomponents" % "httpclient" % "4.3.3" + ,"commons-lang" % "commons-lang" % "2.6" + ,"com.ibm.icu" % "icu4j" % "53.1" + ,"me.champeau.jlangdetect" % "jlangdetect-extra" % "0.4" + ,"org.jsoup" % "jsoup" % "1.7.3" + ,"net.liftweb" % "lift-json_2.10" % "2.5" + ,"log4j" % "log4j" % "1.2.14" + ,"com.typesafe" % "config" % "1.0.2" + ,"com.jsuereth" %% "scala-arm" % "1.2" + ,"org.specs2" %% "specs2" % "1.13" + ,"org.jsoup" % "jsoup" % "1.7.3" + ,"com.chenlb.mmseg4j" % "mmseg4j-core" % "1.9.1" + ,"com.googlecode.juniversalchardet" % "juniversalchardet" % "1.0.3" + //tests + ,"junit" % "junit" % "4.11" % "test" + ,"org.scalatest" %% "scalatest" % "2.1.6" % "test" + ,"org.slf4j" % "slf4j-log4j12" % "1.7.7" % "test" + ,"com.novocode" % "junit-interface" % "0.10-M4" % "test" //"org.scala-lang" % "scala-compiler" % "2.9.0-1", //"org.scala-lang" % "scala-library" % "2.9.0-1", //"org.scala-lang" % "scala-reflect" % "2.10.0", - "commons-lang" % "commons-lang" % "2.6", - "com.chenlb.mmseg4j" % "mmseg4j-core" % "1.9.1" ) } @@ -74,3 +73,5 @@ unmanagedSourceDirectories in Test <<= (scalaSource in Test)(Seq(_)) //assembly: packageDistDir <<= (baseDirectory, packageDistName) { (b, n) => b / "release" } parallelExecution in Test := false + +net.virtualvoid.sbt.graph.Plugin.graphSettings diff --git a/pom.xml b/pom.xml index 5225200a2..75d9ec55c 100644 --- a/pom.xml +++ b/pom.xml @@ -121,6 +121,11 @@ Goose was originally an article extractor written in Java that has most recently <artifactId>mmseg4j-core</artifactId> <version>1.9.1</version> </dependency> + <dependency> + <groupId>com.ibm.icu</groupId> + <artifactId>icu4j</artifactId> + <version>53.1</version> + </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> diff --git a/project/plugins.sbt b/project/plugins.sbt index 07e4df290..8ac45b005 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -12,3 +12,5 @@ resolvers ++= Seq( //addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.2.1") addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.3.0") + +addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.7.4") \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index cdaaa3d3d..ffd9cc75a 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -115,29 +115,17 @@ trait ContentExtractor { if (titlePieces.length > 0) { var i: Int = 0 while (i < titlePieces.length) { - val current: String = titlePieces(i) - if (current.length > largetTextLen) { - largetTextLen = current.length - largeTextIndex = i + if (current.length > largestTextLen) { + largestTextLen = current.length + largestTextIndex = i } i += 1 - -<<<<<<< HEAD -======= - val current: String = titlePieces(i) - if (current.length > largestTextLen) { - largestTextLen = current.length - largestTextIndex = i ->>>>>>> c6c25f6f5af57f260ef1157315abc7c3ceb9bfab } - TITLE_REPLACEMENTS.replaceAll(titlePieces(largeTextIndex)).trim + + TITLE_REPLACEMENTS.replaceAll(titlePieces(largestTextIndex)).trim } -<<<<<<< HEAD else null -======= - TITLE_REPLACEMENTS.replaceAll(titlePieces(largestTextIndex)).trim ->>>>>>> c6c25f6f5af57f260ef1157315abc7c3ceb9bfab } private def getMetaContent(doc: Document, metaName: String): String = { From da2f7e676f6618569c7b5f8e4782ef2534fd25da Mon Sep 17 00:00:00 2001 From: Theodore Lee <thl2516@gmail.com> Date: Tue, 8 Jul 2014 14:43:36 +0900 Subject: [PATCH 281/347] Added domain property to an article. --- build.sbt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.sbt b/build.sbt index 3216ac33e..125915a7f 100644 --- a/build.sbt +++ b/build.sbt @@ -41,4 +41,6 @@ libraryDependencies ++= { publishMavenStyle := true +pomIncludeRepository := { _ => true} + publishTo := Some(Resolver.file("Github Pages", Path.userHome /"repo" / "maven" asFile)(Patterns(true, Resolver.mavenStyleBasePattern))) \ No newline at end of file From dfcca5ac4f5f042767a23e1b2dfbc594e7d65086 Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Tue, 8 Jul 2014 19:19:35 +0300 Subject: [PATCH 282/347] - fix all again --- project/{Build.scala => Build.scala-new} | 0 project/{GooseBuild.scala => GooseBuild.scala-new} | 0 project/build.properties | 2 +- project/plugins.sbt | 5 ++--- src/main/scala/com/gravity/goose/Configuration.scala | 5 +++++ src/main/scala/com/gravity/goose/Crawler.scala | 10 +++++----- .../com/gravity/goose/cleaners/DocumentCleaner.scala | 6 +++--- .../scala/com/gravity/goose/extractors/Extractor.scala | 2 -- .../gravity/goose/images/UpgradedImageIExtractor.scala | 9 --------- .../scala/com/gravity/goose/network/HtmlFetcher.scala | 6 +----- .../goose/outputformatters/OutputFormatter.scala | 4 ++-- 11 files changed, 19 insertions(+), 30 deletions(-) rename project/{Build.scala => Build.scala-new} (100%) rename project/{GooseBuild.scala => GooseBuild.scala-new} (100%) diff --git a/project/Build.scala b/project/Build.scala-new similarity index 100% rename from project/Build.scala rename to project/Build.scala-new diff --git a/project/GooseBuild.scala b/project/GooseBuild.scala-new similarity index 100% rename from project/GooseBuild.scala rename to project/GooseBuild.scala-new diff --git a/project/build.properties b/project/build.properties index 390c1af8c..8cbb5226c 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=0.11.3 \ No newline at end of file +sbt.version=0.13.0 \ No newline at end of file diff --git a/project/plugins.sbt b/project/plugins.sbt index 20ef3b3a5..7a3c53b85 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,4 +1,3 @@ - resolvers ++= Seq( //"releases" at "http://scala-tools.org/repo-releases", //"umeng.com releases" at "http://122.11.52.227:8088/nexus/content/repositories/releases", @@ -16,9 +15,9 @@ resolvers ++= Seq( addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.3.0") addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.7.4") + // Comment to get more information during initialization logLevel := Level.Warn // Use the Play sbt plugin for Play projects -//addSbtPlugin("play" % "sbt-plugin" % "2.1-SNAPSHOT") -addSbtPlugin("play" % "sbt-plugin" % "2.1-07132012") \ No newline at end of file +addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.1") \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index 8c9678c85..d59b3143b 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -49,6 +49,11 @@ class Configuration { // Refactory this in a YML file (like Ruby) def resolveCharSet(url: String, entity: HttpEntity): String = { +// if (contentType == null) { +// encodingType = "UTF-8" +// } else { +// encodingType = contentType.getCharset().name +// } var host = new URL(url).getHost() host match { diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index a475e66c9..58cfe9448 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -78,7 +78,7 @@ class Crawler(config: Configuration) { extractor.calculateBestNodeBasedOnClustering(article, config.language) match { case Some(node: Element) => { article.movies = extractor.extractVideos(node) - article.links = extractor.extractLinks(article.topNode) + article.links = extractor.extractLinks(node) if (config.enableImageFetching) { trace(logPrefix + "Image fetching enabled...") @@ -87,7 +87,7 @@ class Crawler(config: Configuration) { if (article.rawDoc == null) { article.topImage = new Image } else { - article.topImage = imageExtractor.getBestImage(article.rawDoc, article.topNode) + article.topImage = imageExtractor.getBestImage(article.rawDoc, node) if (config.enableAllImagesFetching) { article.allImages = imageExtractor.getAllImages(node) } @@ -99,9 +99,9 @@ class Crawler(config: Configuration) { } } } - article.topNode = extractor.postExtractionCleanup(article.topNode, config.language) - article.cleanedArticleText = outputFormatter.getFormattedText(article.topNode, config.language) - article.htmlArticle = outputFormatter.cleanupHtml(article.topNode) + article.topNode = extractor.postExtractionCleanup(node, config.language) + article.cleanedArticleText = outputFormatter.getFormattedText(node, config.language) + article.htmlArticle = outputFormatter.cleanupHtml(node, config.language) } case _ => trace("NO ARTICLE FOUND") diff --git a/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala b/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala index b53cafeac..7c91e37d7 100644 --- a/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala +++ b/src/main/scala/com/gravity/goose/cleaners/DocumentCleaner.scala @@ -43,12 +43,11 @@ trait DocumentCleaner { def clean(article: Article): Document = { trace("Starting cleaning phase with DefaultDocumentCleaner") - var docToClean: Document = article.doc + var docToClean: Document = article.doc.clone trace("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% BEFORE CLEAN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") trace(docToClean.html) trace("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% BEFORE CLEAN %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") - var docToClean: Document = article.doc.clone docToClean = cleanEmTags(docToClean) docToClean = removeDropCaps(docToClean) docToClean = removeScriptsAndStyles(docToClean) @@ -392,7 +391,8 @@ object DocumentCleaner extends Logging { // create negative elements sb.append("^side$|combx|retweet|mediaarticlerelated|menucontainer|navbar|comment(?!ed)|PopularQuestions|contact|foot|footer|Footer|footnote|cnn_strycaptiontxt|links|meta$|scroll(?!able)|shoutbox|sponsor") - sb.append("|tags|socialnetworking|socialNetworking|cnnStryHghLght|cnn_stryspcvbx|^inset$|pagetools|post-attributes|welcome_form|contentTools2|the_answers|remember-tool-tip") sb.append("|communitypromo|promo_holder|runaroundLeft|subscribe|vcard|articleheadings|date|^print$|popup|author-dropdown|tools|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text") + sb.append("|tags|socialnetworking|socialNetworking|cnnStryHghLght|cnn_stryspcvbx|^inset$|pagetools|post-attributes|welcome_form|contentTools2|the_answers|remember-tool-tip") + sb.append("|communitypromo|promo_holder|runaroundLeft|subscribe|vcard|articleheadings|date|^print$|popup|author-dropdown|tools|socialtools|byline|konafilter|KonaFilter|breadcrumbs|^fn$|wp-caption-text") /** * this regex is used to remove undesirable nodes from our doc * indicate that something maybe isn't content but more of a comment, footer or some other undesirable node diff --git a/src/main/scala/com/gravity/goose/extractors/Extractor.scala b/src/main/scala/com/gravity/goose/extractors/Extractor.scala index 96d9db43c..33c60bd5b 100644 --- a/src/main/scala/com/gravity/goose/extractors/Extractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/Extractor.scala @@ -36,7 +36,5 @@ trait Extractor[T] { * @param rootElement passed in from the {@link com.jimplush.goose.ContentExtractor} after the article has been parsed * @return an instance of type <code>T</code> */ - - public ArrayList<String> getAllImages() def extract(rootElement: Element): T } \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala index 22b3c34a4..7cab4f6d6 100644 --- a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala +++ b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala @@ -614,12 +614,3 @@ object UpgradedImageIExtractor { val KNOWN_IMG_DOM_NAMES = ListBuffer("yn-story-related-media", "cnn_strylccimg300cntr", "big_photo", "ap-smallphoto-a") } -<<<<<<< .mine - - - -======= - } - -} ->>>>>>> .theirs diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index 037fcc9fa..190515642 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -57,6 +57,7 @@ import com.gravity.goose.Configuration import org.apache.http.impl.client.{DefaultHttpRequestRetryHandler, AbstractHttpClient, DefaultHttpClient} import org.apache.commons.io.IOUtils import com.ibm.icu.text.CharsetDetector +import org.apache.http.util.EntityUtils /** * User: Jim Plush @@ -157,11 +158,6 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { try { contentType = ContentType.get(entity) trace("Got contentType: " + contentType) - if (contentType == null) { - encodingType = "UTF-8" - } else { - encodingType = contentType.getCharset().name - } } catch { case e: Exception => { diff --git a/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala b/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala index 5b1422e28..bf84b8d09 100644 --- a/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala +++ b/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala @@ -95,9 +95,9 @@ trait OutputFormatter { * @param topNode the top most node to format * @return a formatted string with all HTML */ - def cleanupHtml(topNode: Element): String = { + def cleanupHtml(topNode: Element, language: Language): String = { val node = topNode.clone - removeParagraphsWithFewWords(node) + removeParagraphsWithFewWords(node, language) convertToHtml(node) } From 680092b5c5e28ff919a3bb283ea8248b57090990 Mon Sep 17 00:00:00 2001 From: Jordan Burke <jordan.burke@gmail.com> Date: Tue, 8 Jul 2014 20:15:32 -0400 Subject: [PATCH 283/347] Add SBT. --- .gitignore | 2 ++ build.sbt | 21 +++++++++++++++++++ project/plugins.sbt | 1 + .../com/gravity/goose/Configuration.scala | 2 +- 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 build.sbt create mode 100644 project/plugins.sbt diff --git a/.gitignore b/.gitignore index 615c5c5c9..ddcf18da8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +.idea + target/ /goose.iml /goose.ipr diff --git a/build.sbt b/build.sbt new file mode 100644 index 000000000..70439dc5e --- /dev/null +++ b/build.sbt @@ -0,0 +1,21 @@ +name := "goose" + +version := "2.11.0" + +organization := "com.sapienapps" + +scalaVersion := "2.11.1" + +//resolvers += "Typesafe Maven Repository" at "http://repo.typesafe.com/typesafe/maven-releases/" + +libraryDependencies ++= Seq( + "junit" % "junit" % "4.8.1", + "org.slf4j" % "slf4j-api" % "1.6.1", + "org.jsoup" % "jsoup" % "1.5.2", + "commons-io" % "commons-io" % "2.0.1", + "org.apache.httpcomponents" % "httpclient" % "4.1.2", + "commons-lang" % "commons-lang" % "2.6" +) + +publishTo := Some(Resolver.file("goose", new File(Path.userHome + "/Dropbox/public/libs" )) ) + \ No newline at end of file diff --git a/project/plugins.sbt b/project/plugins.sbt new file mode 100644 index 000000000..14a6ca162 --- /dev/null +++ b/project/plugins.sbt @@ -0,0 +1 @@ +logLevel := Level.Warn \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index 20ce4653a..712dcb648 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -21,8 +21,8 @@ package com.gravity.goose import network.{HtmlFetcher, AbstractHtmlFetcher} import org.jsoup.nodes.Element import java.util.Date -import reflect.BeanProperty import com.gravity.goose.extractors.{StandardContentExtractor, ContentExtractor, AdditionalDataExtractor, PublishDateExtractor} +import scala.beans.BeanProperty /** From 9fda3224c788c16da2cb7a45a97bfa7411115e34 Mon Sep 17 00:00:00 2001 From: jordanburke <jordan.burke@gmail.com> Date: Tue, 8 Jul 2014 22:28:45 -0400 Subject: [PATCH 284/347] Changed the version to 2.2.0. Removed pom.xml --- build.sbt | 2 +- pom.xml | 154 ------------------------------------------------------ 2 files changed, 1 insertion(+), 155 deletions(-) delete mode 100644 pom.xml diff --git a/build.sbt b/build.sbt index 70439dc5e..aca7af595 100644 --- a/build.sbt +++ b/build.sbt @@ -1,6 +1,6 @@ name := "goose" -version := "2.11.0" +version := "2.2.0" organization := "com.sapienapps" diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 9fef84cba..000000000 --- a/pom.xml +++ /dev/null @@ -1,154 +0,0 @@ -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - - <groupId>com.gravity</groupId> - <artifactId>goose</artifactId> - <version>2.1.22</version> - <packaging>jar</packaging> - <name>goose</name> - <url>http://maven.apache.org</url> - <properties> - <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - </properties> - - <dependencies> - <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - <version>4.8.1</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - <version>1.6.1</version> - <type>jar</type> - <scope>compile</scope> - </dependency> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-log4j12</artifactId> - <version>1.6.1</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.jsoup</groupId> - <artifactId>jsoup</artifactId> - <version>1.5.2</version> - </dependency> - <dependency> - <groupId>commons-io</groupId> - <artifactId>commons-io</artifactId> - <version>2.0.1</version> - </dependency> - - <dependency> - <groupId>org.scala-lang</groupId> - <artifactId>scala-compiler</artifactId> - <version>2.9.0-1</version> - <scope>compile</scope> - </dependency> - - <dependency> - <groupId>org.scala-lang</groupId> - <artifactId>scala-library</artifactId> - <version>2.9.0-1</version> - </dependency> - - <dependency> - <groupId>org.apache.httpcomponents</groupId> - <artifactId>httpclient</artifactId> - <version>4.1.2</version> - </dependency> - <dependency> - <groupId>commons-lang</groupId> - <artifactId>commons-lang</artifactId> - <version>2.6</version> - </dependency> - </dependencies> - - <!-- - Hey... since we're open source, let's compile the source and javadocs into jars as well - --> - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <version>2.6</version> - <configuration> - <useFile>false</useFile> - <disableXmlReport>true</disableXmlReport> - <includes> - <include>**/*Test.*</include> - </includes> - <excludes> - <exclude>**/*IT.*</exclude> - </excludes> - </configuration> - </plugin> - <plugin> - <groupId>org.scala-tools</groupId> - <artifactId>maven-scala-plugin</artifactId> - <version>2.14.3</version> - <configuration> - <charset>UTF-8</charset> - <jvmArgs> - <jvmArg>-Xmx1024m</jvmArg> - </jvmArgs> - </configuration> - <executions> - <execution> - <id>compile</id> - <goals> - <goal>compile</goal> - </goals> - <phase>compile</phase> - </execution> - <execution> - <id>test-compile</id> - <goals> - <goal>testCompile</goal> - </goals> - <phase>test-compile</phase> - </execution> - <execution> - <phase>process-resources</phase> - <goals> - <goal>compile</goal> - </goals> - </execution> - - </executions> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-source-plugin</artifactId> - <version>2.1.2</version> - <executions> - <execution> - <id>attach-sources</id> - <goals> - <goal>jar</goal> - </goals> - </execution> - </executions> - </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-javadoc-plugin</artifactId> - <version>2.8</version> - <executions> - <execution> - <id>attach-javadocs</id> - <goals> - <goal>jar</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - </build> - -</project> \ No newline at end of file From f36c2a32cb5f00e035dd28516ec66b338404d0b1 Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Wed, 9 Jul 2014 20:20:11 +0300 Subject: [PATCH 285/347] configure stopwords --- .../resources/com/gravity/goose/text/all.txt | 1549 ---- .../resources/com/gravity/goose/text/de.txt | 231 - .../resources/com/gravity/goose/text/es.txt | 308 - .../resources/com/gravity/goose/text/fr.txt | 163 - .../resources/com/gravity/goose/text/it.txt | 279 - .../resources/com/gravity/goose/text/ko.txt | 70 - .../resources/com/gravity/goose/text/pt.txt | 203 - .../com/gravity/goose/text/stopwords-all.txt | 6197 +++++++++++++++++ .../goose/text/{ca.txt => stopwords-ca.txt} | 0 .../com/gravity/goose/text/stopwords-de.txt | 1850 ++--- .../goose/text/{en.txt => stopwords-en.txt} | 1091 ++- .../com/gravity/goose/text/stopwords-es.txt | 620 +- .../com/gravity/goose/text/stopwords-fr.txt | 383 +- .../com/gravity/goose/text/stopwords-it.txt | 699 +- .../com/gravity/goose/text/stopwords-ko.txt | 140 +- .../com/gravity/goose/text/stopwords-pt.txt | 442 +- .../com/gravity/goose/text/stopwords-ro.txt | 246 + 17 files changed, 9194 insertions(+), 5277 deletions(-) delete mode 100644 src/main/resources/com/gravity/goose/text/all.txt delete mode 100644 src/main/resources/com/gravity/goose/text/de.txt delete mode 100644 src/main/resources/com/gravity/goose/text/es.txt delete mode 100644 src/main/resources/com/gravity/goose/text/fr.txt delete mode 100644 src/main/resources/com/gravity/goose/text/it.txt delete mode 100644 src/main/resources/com/gravity/goose/text/ko.txt delete mode 100644 src/main/resources/com/gravity/goose/text/pt.txt create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-all.txt rename src/main/resources/com/gravity/goose/text/{ca.txt => stopwords-ca.txt} (100%) rename src/main/resources/com/gravity/goose/text/{en.txt => stopwords-en.txt} (86%) create mode 100644 src/main/resources/com/gravity/goose/text/stopwords-ro.txt diff --git a/src/main/resources/com/gravity/goose/text/all.txt b/src/main/resources/com/gravity/goose/text/all.txt deleted file mode 100644 index c7f995fa5..000000000 --- a/src/main/resources/com/gravity/goose/text/all.txt +++ /dev/null @@ -1,1549 +0,0 @@ -a -è -über -êtes -abans -abbia -abbiamo -abbiano -abbiate -aber -about -above -ací -across -ad -after -afterwards -again -against -agl -agli -ah -ai -aie -aient -aies -ait -així -això -al -él -aleshores -algo -algun -alguna -algunas -algunes -algunos -alguns -alhora -all -alla -allí -allò -allà -alle -allem -allen -aller -alles -allo -almost -alone -along -already -als -also -although -altra -altre -altres -always -am -amb -ambdós -ambdues -among -amongst -amoungst -amount -an -anche -and -ander -andere -anderem -anderen -anderer -anderes -anderm -andern -anderr -anders -another -ante -antes -any -anyhow -anyone -anything -anyway -anywhere -ao -aos -apa -aquí -aquela -aquelas -aquele -aqueles -aquell -aquella -aquelles -aquells -aquest -aquesta -aquestes -aquests -aquilo -éramos -are -érem -éreu -around -as -és -at -até -été -étée -étées -étaient -étais -était -étant -étés -étiez -étions -au -auch -auf -aura -aurai -auraient -aurais -aurait -auras -aurez -auriez -aurions -aurons -auront -aus -aux -avaient -avais -avait -avec -avemmo -avendo -avesse -avessero -avessi -avessimo -aveste -avesti -avete -aveva -avevamo -avevano -avevate -avevi -avevo -avez -aviez -avions -avons -avrò -avrai -avranno -avrà -avrebbe -avrebbero -avrei -avremmo -avremo -avreste -avresti -avrete -avuta -avute -avuti -avuto -ayant -ayez -ayons -à -às -back -baix -be -became -because -become -becomes -becoming -been -before -beforehand -behind -bei -being -below -beside -besides -between -beyond -bill -bin -bis -bist -both -bottom -but -by -c -cada -cadascú -cadascuna -cadascunes -cadascuns -call -can -cannot -cant -ce -ceci -celà -ces -cet -cette -che -chi -ci -co -coi -col -com -come -como -computer -con -contra -contro -could -couldnt -cry -cual -cuando -cui -d -da -daß -dagl -dagli -dai -dal -dall -dalla -dalle -dallo -dalt -damit -dann -dans -das -dasselbe -dazu -de -degl -degli -dei -dein -deine -deinem -deinen -deiner -deines -del -dela -delas -dele -deles -dell -della -delle -dello -dels -dem -demselben -den -denn -denselben -depois -der -derer -derselbe -derselben -des -describe -desde -després -desselben -dessen -detail -di -dich -die -dies -diese -dieselbe -dieselben -diesem -diesen -dieser -dieses -dins -dintre -dir -do -doch -donat -doncs -donde -done -dort -dos -dov -dove -down -du -due -d'un -d'una -d'unes -d'uns -durant -durante -durch -during -e -each -eûmes -eût -eûtes -ebbe -ebbero -ebbi -ed -eg -eh -eight -ein -eine -einem -einen -einer -eines -einig -einige -einigem -einigen -einiger -einiges -einmal -either -el -ela -elas -ele -eles -eleven -ella -ellas -elle -ellos -els -else -elsewhere -em -empty -en -encara -enough -ens -entre -er -era -erais -eram -eran -erano -eras -eravamo -eravate -eren -eres -eri -ero -es -esa -esas -ese -eso -esos -essa -essas -esse -essendo -esses -est -esta -está -esté -estaba -estabais -estábamos -estaban -estabas -estad -estada -estadas -estado -estados -estáis -estéis -estamos -están -estén -estando -estão -estar -estará -estaré -estaría -estaríais -estaríamos -estarían -estarías -estaréis -estarán -estarás -estaremos -estas -estás -estés -estava -estavam -estávamos -estaven -està -estàvem -estàveu -este -esteja -estejam -estejamos -estemos -estes -esteu -esteve -estivéramos -estivéssemos -estive -estivemos -estiver -estivera -estiveram -estiverem -estivermos -estivesse -estivessem -esto -estos -estou -estoy -estuve -estuviéramos -estuviésemos -estuviera -estuvierais -estuvieran -estuvieras -estuvieron -estuviese -estuvieseis -estuviesen -estuvieses -estuvimos -estuviste -estuvisteis -estuvo -et -etc -ets -etwas -eu -euch -eue -euer -eues -eure -eurem -euren -eurent -eurer -eures -eus -eusse -eussent -eusses -eussiez -eussions -eut -eux -even -ever -every -everyone -everything -everywhere -except -für -faccia -facciamo -facciano -facciate -faccio -facemmo -facendo -facesse -facessero -facessi -facessimo -faceste -facesti -faceva -facevamo -facevano -facevate -facevi -facevo -fai -fûmes -fanno -farò -farai -fôramos -faranno -farà -farebbe -farebbero -farei -faremmo -faremo -fareste -faresti -farete -fôssemos -fût -fûtes -fece -fecero -feci -few -fifteen -fify -fill -find -fins -fire -first -five -foi -fomos -for -fora -foram -forem -former -formerly -formos -forty -fosse -fossem -fossero -fossi -fossimo -foste -fosti -found -four -from -front -fu -fuéramos -fuésemos -fue -fuera -fuerais -fueran -fueras -fueron -fuese -fueseis -fuesen -fueses -fui -fuimos -fuiste -fuisteis -full -fummo -furent -furono -further -fus -fusse -fussent -fusses -fussiez -fussions -fut -gairebé -gegen -get -gewesen -give -gli -go -ha -há -hab -había -habíais -habíamos -habían -habías -habéis -habe -haben -habida -habidas -habido -habidos -habiendo -habrá -habré -habría -habríais -habríamos -habrían -habrías -habréis -habrán -habrás -habremos -had -hai -haja -hajam -hajamos -han -hanno -hão -has -hasnt -hasta -hat -hatte -hatten -have -havemos -havia -hay -haya -hayáis -hayamos -hayan -hayas -he -hei -hem -hemos -hence -her -here -hereafter -hereby -herein -hereupon -hers -herself -heu -hi -hier -him -himself -hin -hinter -his -ho -houvéramos -houvéssemos -houve -houvemos -houver -houvera -houverá -houveríamos -houveram -houverão -houverei -houverem -houveremos -houveria -houveriam -houvermos -houvesse -houvessem -how -however -hube -hubiéramos -hubiésemos -hubiera -hubierais -hubieran -hubieras -hubieron -hubiese -hubieseis -hubiesen -hubieses -hubimos -hubiste -hubisteis -hubo -hundred -i -ich -ici -ie -if -igual -iguals -ihm -ihn -ihnen -ihr -ihre -ihrem -ihren -ihrer -ihres -il -ils -im -in -inc -indeed -indem -ins -interest -into -io -is -isso -ist -isto -it -its -itself -j -ja -já -je -jede -jedem -jeden -jeder -jedes -jene -jenem -jenen -jener -jenes -jetzt -kann -können -könnte -keep -kein -keine -keinem -keinen -keiner -keines -l -la -las -last -latter -latterly -le -least -lei -les -less -leur -leurs -lhe -lhes -l'hi -li -li'n -llavors -lo -loro -los -ltd -lui -m -ma -mí -mía -même -mías -machen -made -mais -mal -malgrat -man -manche -manchem -manchen -mancher -manches -many -mío -míos -mas -más -més -mateix -mateixa -mateixes -mateixos -may -me -meanwhile -mein -meine -meinem -meinen -meiner -meines -mentre -mes -mesmo -meu -meus -meva -meves -m'he -mi -mia -mich -mie -miei -might -mill -mine -minha -minhas -mio -mir -mis -mit -moi -molt -molta -moltes -molts -mon -mons -more -moreover -most -mostly -move -much -mucho -muchos -muito -muss -musste -must -muy -my -myself -n -na -nós -nach -nada -name -namely -não -nas -ne -negl -negli -nei -neither -nel -nell -nella -nelle -nello -nem -never -nevertheless -next -n'he -n'hi -ni -nicht -nichts -nine -no -nobody -noch -nogensmenys -noi -només -non -none -noone -nor -nos -nosaltres -nosotras -nosotros -nossa -nossas -nosso -nossos -nostra -nostre -nostres -nostri -nostro -not -nothing -notre -nous -now -nowhere -nuestra -nuestras -nuestro -nuestros -num -numa -nun -nur -o -ob -oder -of -off -often -oh -ohne -oi -on -once -one -only -ont -onto -or -os -other -others -otherwise -otra -otras -otro -otros -ou -our -ours -ourselves -out -over -own -par -para -part -pas -pel -pela -pelas -pelo -pelos -pels -per -però -perché -perhaps -pero -perquè -più -please -poc -poca -poco -pocs -poques -por -porque -potser -pour -propi -put -qu -què -qué -qual -quale -quals -quan -quando -quant -quanta -quante -quanti -quanto -que -quel -quelcom -quella -quelle -quelles -quelli -quello -quels -quem -questa -queste -questi -questo -qui -quien -quienes -quin -quina -quines -quins -rather -re -s -sa -sí -só -sóc -són -same -sans -são -sarò -sarai -saranno -sarà -sarebbe -sarebbero -sarei -saremmo -saremo -sareste -saresti -sarete -se -sea -seáis -seamos -sean -seas -see -seem -seemed -seeming -seems -sehr -sei -sein -seine -seinem -seinen -seiner -seines -seja -sejam -sejamos -selbst -sem -semblant -semblants -sera -será -seré -sería -seríais -seríamos -serían -serías -serai -seraient -serais -seréis -serait -serán -serão -seras -serás -serei -seremos -serez -seria -seriam -seriez -serions -serious -serons -seront -ses -seu -seu -seus -seva -several -seves -s'ha -s'han -she -should -show -si -sia -siamo -siano -siate -sich -side -sido -sie -siendo -siete -sin -since -sincere -sind -six -sixty -so -sobre -sobretot -soi -soient -sois -soit -solament -solche -solchem -solchen -solcher -solches -soll -sollte -sols -some -somehow -someone -something -sometime -sometimes -somewhere -sommes -somos -son -son -sondern -sono -sons -sonst -sont -sota -sou -soy -soyez -soyons -sta -stai -stando -stanno -starò -starai -staranno -starà -starebbe -starebbero -starei -staremmo -staremo -stareste -staresti -starete -stava -stavamo -stavano -stavate -stavi -stavo -stemmo -stesse -stessero -stessi -stessimo -steste -stesti -stette -stettero -stetti -stia -stiamo -stiano -stiate -still -sto -su -sua -suas -such -sue -sugl -sugli -sui -suis -sul -sull -sulla -sulle -sullo -suo -suoi -sur -sus -suya -suyas -suyo -suyos -system -t -ta -take -tal -tém -també -também -también -tampoc -tan -tínhamos -tant -tanta -tantes -tanto -tú -te -tem -temos -ten -tenía -teníais -teníamos -tenían -tenías -tenéis -tendrá -tendré -tendría -tendríais -tendríamos -tendrían -tendrías -tendréis -tendrán -tendrás -tendremos -tened -tenemos -tenga -tengáis -tengamos -tengan -tengas -tengo -tenha -tenham -tenhamos -tenho -tenida -tenidas -tenido -tenidos -teniendo -terá -teríamos -terão -terei -teremos -teria -teriam -tes -teu -teus -teva -teve -teves -t'ha -than -t'han -that -the -t'he -their -them -themselves -then -thence -there -thereafter -thereby -therefore -therein -thereupon -these -they -thick -thin -third -this -those -though -three -through -throughout -thru -thus -ti -tiene -tienen -tienes -tinha -tinham -tivéramos -tivéssemos -tive -tivemos -tiver -tivera -tiveram -tiverem -tivermos -tivesse -tivessem -to -todo -todos -together -toi -ton -tons -too -top -tot -tota -totes -tots -toward -towards -tra -tu -tua -tuas -tue -tuo -tuoi -tus -tutti -tutto -tuve -tuviéramos -tuviésemos -tuviera -tuvierais -tuvieran -tuvieras -tuvieron -tuviese -tuvieseis -tuviesen -tuvieses -tuvimos -tuviste -tuvisteis -tuvo -tuya -tuyas -tuyo -tuyos -twelve -twenty -two -um -uma -un -una -und -under -une -unes -uno -unos -uns -unse -unsem -unsen -unser -unses -unter -until -up -upon -us -va -vaig -vam -van -vas -very -veu -vi -via -viel -você -vocês -voi -vom -von -vor -vos -vosaltres -vosotras -vosotros -vostra -vostre -vostres -vostri -vostro -votre -vous -vuestra -vuestras -vuestro -vuestros -würde -würden -während -war -waren -warst -was -we -weg -weil -weiter -welche -welchem -welchen -welcher -welches -well -wenn -werde -werden -were -what -whatever -when -whence -whenever -where -whereafter -whereas -whereby -wherein -whereupon -wherever -whether -which -while -whither -who -whoever -whole -whom -whose -why -wie -wieder -will -wir -wird -wirst -with -within -without -wo -wollen -wollte -would -y -ya -yet -yo -you -your -yours -yourself -yourselvesa -zu -zum -zur -zwar -zwischen diff --git a/src/main/resources/com/gravity/goose/text/de.txt b/src/main/resources/com/gravity/goose/text/de.txt deleted file mode 100644 index 721d5ca68..000000000 --- a/src/main/resources/com/gravity/goose/text/de.txt +++ /dev/null @@ -1,231 +0,0 @@ -über -aber -alle -allem -allen -aller -alles -als -also -am -an -ander -andere -anderem -anderen -anderer -anderes -anderm -andern -anderr -anders -auch -auf -aus -bei -bin -bis -bist -da -daß -damit -dann -das -dasselbe -dazu -dein -deine -deinem -deinen -deiner -deines -dem -demselben -den -denn -denselben -der -derer -derselbe -derselben -des -desselben -dessen -dich -die -dies -diese -dieselbe -dieselben -diesem -diesen -dieser -dieses -dir -doch -dort -du -durch -ein -eine -einem -einen -einer -eines -einig -einige -einigem -einigen -einiger -einiges -einmal -er -es -etwas -euch -euer -eure -eurem -euren -eurer -eures -für -gegen -gewesen -hab -habe -haben -hat -hatte -hatten -hier -hin -hinter -ich -ihm -ihn -ihnen -ihr -ihre -ihrem -ihren -ihrer -ihres -im -in -indem -ins -ist -jede -jedem -jeden -jeder -jedes -jene -jenem -jenen -jener -jenes -jetzt -kann -können -könnte -kein -keine -keinem -keinen -keiner -keines -machen -man -manche -manchem -manchen -mancher -manches -mein -meine -meinem -meinen -meiner -meines -mich -mir -mit -muss -musste -nach -nicht -nichts -noch -nun -nur -ob -oder -ohne -sehr -sein -seine -seinem -seinen -seiner -seines -selbst -sich -sie -sind -so -solche -solchem -solchen -solcher -solches -soll -sollte -sondern -sonst -um -und -uns -unse -unsem -unsen -unser -unses -unter -viel -vom -von -vor -würde -würden -während -war -waren -warst -was -weg -weil -weiter -welche -welchem -welchen -welcher -welches -wenn -werde -werden -wie -wieder -will -wir -wird -wirst -wo -wollen -wollte -zu -zum -zur -zwar -zwischen diff --git a/src/main/resources/com/gravity/goose/text/es.txt b/src/main/resources/com/gravity/goose/text/es.txt deleted file mode 100644 index be3901a04..000000000 --- a/src/main/resources/com/gravity/goose/text/es.txt +++ /dev/null @@ -1,308 +0,0 @@ -a -al -él -algo -algunas -algunos -ante -antes -éramos -como -con -contra -cual -cuando -de -del -desde -donde -durante -e -el -ella -ellas -ellos -en -entre -era -erais -eran -eras -eres -es -esa -esas -ese -eso -esos -esta -está -esté -estaba -estabais -estábamos -estaban -estabas -estad -estada -estadas -estado -estados -estáis -estéis -estamos -están -estén -estando -estar -estará -estaré -estaría -estaríais -estaríamos -estarían -estarías -estaréis -estarán -estarás -estaremos -estas -estás -estés -este -estemos -esto -estos -estoy -estuve -estuviéramos -estuviésemos -estuviera -estuvierais -estuvieran -estuvieras -estuvieron -estuviese -estuvieseis -estuviesen -estuvieses -estuvimos -estuviste -estuvisteis -estuvo -fuéramos -fuésemos -fue -fuera -fuerais -fueran -fueras -fueron -fuese -fueseis -fuesen -fueses -fui -fuimos -fuiste -fuisteis -ha -había -habíais -habíamos -habían -habías -habéis -habida -habidas -habido -habidos -habiendo -habrá -habré -habría -habríais -habríamos -habrían -habrías -habréis -habrán -habrás -habremos -han -has -hasta -hay -haya -hayáis -hayamos -hayan -hayas -he -hemos -hube -hubiéramos -hubiésemos -hubiera -hubierais -hubieran -hubieras -hubieron -hubiese -hubieseis -hubiesen -hubieses -hubimos -hubiste -hubisteis -hubo -la -las -le -les -lo -los -mí -mía -mías -mío -míos -más -me -mi -mis -mucho -muchos -muy -nada -ni -no -nos -nosotras -nosotros -nuestra -nuestras -nuestro -nuestros -o -os -otra -otras -otro -otros -para -pero -poco -por -porque -qué -que -quien -quienes -sí -se -sea -seáis -seamos -sean -seas -será -seré -sería -seríais -seríamos -serían -serías -seréis -serán -serás -seremos -sido -siendo -sin -sobre -sois -somos -son -soy -su -sus -suya -suyas -suyo -suyos -también -tanto -tú -te -tenía -teníais -teníamos -tenían -tenías -tenéis -tendrá -tendré -tendría -tendríais -tendríamos -tendrían -tendrías -tendréis -tendrán -tendrás -tendremos -tened -tenemos -tenga -tengáis -tengamos -tengan -tengas -tengo -tenida -tenidas -tenido -tenidos -teniendo -ti -tiene -tienen -tienes -todo -todos -tu -tus -tuve -tuviéramos -tuviésemos -tuviera -tuvierais -tuvieran -tuvieras -tuvieron -tuviese -tuvieseis -tuviesen -tuvieses -tuvimos -tuviste -tuvisteis -tuvo -tuya -tuyas -tuyo -tuyos -un -una -uno -unos -vosotras -vosotros -vuestra -vuestras -vuestro -vuestros -y -ya -yo diff --git a/src/main/resources/com/gravity/goose/text/fr.txt b/src/main/resources/com/gravity/goose/text/fr.txt deleted file mode 100644 index 9a0bda2a2..000000000 --- a/src/main/resources/com/gravity/goose/text/fr.txt +++ /dev/null @@ -1,163 +0,0 @@ -êtes -ai -aie -aient -aies -ait -as -été -étée -étées -étaient -étais -était -étant -étés -étiez -étions -au -aura -aurai -auraient -aurais -aurait -auras -aurez -auriez -aurions -aurons -auront -aux -avaient -avais -avait -avec -avez -aviez -avions -avons -ayant -ayez -ayons -à -c -ce -ceci -celà -ces -cet -cette -d -dans -de -des -du -eûmes -eût -eûtes -elle -en -es -est -et -eu -eue -eues -eurent -eus -eusse -eussent -eusses -eussiez -eussions -eut -eux -fûmes -fût -fûtes -furent -fus -fusse -fussent -fusses -fussiez -fussions -fut -ici -il -ils -j -je -l -la -le -les -leur -leurs -lui -m -ma -même -mais -me -mes -moi -mon -n -ne -nos -notre -nous -on -ont -ou -par -pas -pour -qu -que -quel -quelle -quelles -quels -qui -s -sa -sans -se -sera -serai -seraient -serais -serait -seras -serez -seriez -serions -serons -seront -ses -soi -soient -sois -soit -sommes -son -sont -soyez -soyons -suis -sur -t -ta -te -tes -toi -ton -tu -un -une -vos -votre -vous -y diff --git a/src/main/resources/com/gravity/goose/text/it.txt b/src/main/resources/com/gravity/goose/text/it.txt deleted file mode 100644 index 52fdd78a1..000000000 --- a/src/main/resources/com/gravity/goose/text/it.txt +++ /dev/null @@ -1,279 +0,0 @@ -a -è -abbia -abbiamo -abbiano -abbiate -ad -agl -agli -ai -al -all -alla -alle -allo -anche -avemmo -avendo -avesse -avessero -avessi -avessimo -aveste -avesti -avete -aveva -avevamo -avevano -avevate -avevi -avevo -avrò -avrai -avranno -avrà -avrebbe -avrebbero -avrei -avremmo -avremo -avreste -avresti -avrete -avuta -avute -avuti -avuto -c -che -chi -ci -coi -col -come -con -contro -cui -da -dagl -dagli -dai -dal -dall -dalla -dalle -dallo -degl -degli -dei -del -dell -della -delle -dello -di -dov -dove -e -ebbe -ebbero -ebbi -ed -era -erano -eravamo -eravate -eri -ero -essendo -faccia -facciamo -facciano -facciate -faccio -facemmo -facendo -facesse -facessero -facessi -facessimo -faceste -facesti -faceva -facevamo -facevano -facevate -facevi -facevo -fai -fanno -farò -farai -faranno -farà -farebbe -farebbero -farei -faremmo -faremo -fareste -faresti -farete -fece -fecero -feci -fosse -fossero -fossi -fossimo -foste -fosti -fu -fui -fummo -furono -gli -ha -hai -hanno -ho -i -il -in -io -l -la -le -lei -li -lo -loro -lui -ma -mi -mia -mie -miei -mio -ne -negl -negli -nei -nel -nell -nella -nelle -nello -noi -non -nostra -nostre -nostri -nostro -o -per -perché -più -quale -quanta -quante -quanti -quanto -quella -quelle -quelli -quello -questa -queste -questi -questo -sarò -sarai -saranno -sarà -sarebbe -sarebbero -sarei -saremmo -saremo -sareste -saresti -sarete -se -sei -si -sia -siamo -siano -siate -siete -sono -sta -stai -stando -stanno -starò -starai -staranno -starà -starebbe -starebbero -starei -staremmo -staremo -stareste -staresti -starete -stava -stavamo -stavano -stavate -stavi -stavo -stemmo -stesse -stessero -stessi -stessimo -steste -stesti -stette -stettero -stetti -stia -stiamo -stiano -stiate -sto -su -sua -sue -sugl -sugli -sui -sul -sull -sulla -sulle -sullo -suo -suoi -ti -tra -tu -tua -tue -tuo -tuoi -tutti -tutto -un -una -uno -vi -voi -vostra -vostre -vostri -vostro diff --git a/src/main/resources/com/gravity/goose/text/ko.txt b/src/main/resources/com/gravity/goose/text/ko.txt deleted file mode 100644 index 0fc32d1ad..000000000 --- a/src/main/resources/com/gravity/goose/text/ko.txt +++ /dev/null @@ -1,70 +0,0 @@ -을 -의 -에 -이 -를 -으로 -은 -는 -가 -로 -하고 -과 -에서 -도 -와 -이다 -고 -부터 -까지 -께 -에는 -이라고 -만 -라고 -보다 -에도 -다 -토록 -에게 -나 -대로 -에서는 -이나 -이며 -요 -든 -으로써 -같이 -로는 -밖에 -과의 -며 -로부터 -처럼 -아 -라 -여 -으로는 -이고 -에서의 -이라는 -만에 -으로부터 -에서도 -와의 -엔 -만을 -부터는 -만의 -야 -까지의 -과는 -치고 -과를 -으로의 -까지는 -보다는 -만이 -에만 -로의 diff --git a/src/main/resources/com/gravity/goose/text/pt.txt b/src/main/resources/com/gravity/goose/text/pt.txt deleted file mode 100644 index 9723b3798..000000000 --- a/src/main/resources/com/gravity/goose/text/pt.txt +++ /dev/null @@ -1,203 +0,0 @@ -a -ao -aos -aquela -aquelas -aquele -aqueles -aquilo -éramos -as -até -à -às -com -como -da -das -de -dela -delas -dele -deles -depois -do -dos -e -ela -elas -ele -eles -em -entre -era -eram -essa -essas -esse -esses -esta -está -estamos -estão -estas -estava -estavam -estávamos -este -esteja -estejam -estejamos -estes -esteve -estivéramos -estivéssemos -estive -estivemos -estiver -estivera -estiveram -estiverem -estivermos -estivesse -estivessem -estou -eu -fôramos -fôssemos -foi -fomos -for -fora -foram -forem -formos -fosse -fossem -fui -há -haja -hajam -hajamos -hão -havemos -hei -houvéramos -houvéssemos -houve -houvemos -houver -houvera -houverá -houveríamos -houveram -houverão -houverei -houverem -houveremos -houveria -houveriam -houvermos -houvesse -houvessem -isso -isto -já -lhe -lhes -mais -mas -me -mesmo -meu -meus -minha -minhas -muito -na -nós -não -nas -nem -no -nos -nossa -nossas -nosso -nossos -num -numa -o -os -ou -para -pela -pelas -pelo -pelos -por -qual -quando -que -quem -só -são -se -seja -sejam -sejamos -sem -será -seríamos -serão -serei -seremos -seria -seriam -seu -seus -somos -sou -sua -suas -tém -também -tínhamos -te -tem -temos -tenha -tenham -tenhamos -tenho -terá -teríamos -terão -terei -teremos -teria -teriam -teu -teus -teve -tinha -tinham -tivéramos -tivéssemos -tive -tivemos -tiver -tivera -tiveram -tiverem -tivermos -tivesse -tivessem -tu -tua -tuas -um -uma -você -vocês -vos diff --git a/src/main/resources/com/gravity/goose/text/stopwords-all.txt b/src/main/resources/com/gravity/goose/text/stopwords-all.txt new file mode 100644 index 000000000..9841ae222 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-all.txt @@ -0,0 +1,6197 @@ + + +# forms of ser, to be (not including the infinitive): +# translated +#----------------------------------------------------------------------- +/DIE +Ab +Aber +Abgeordneten +Alle +Allerdings +Als +Alter +Am +Amt +An +Anfang +Angaben +Antrag +April +Arbeit +Art +Artikel +Auch +Auf +Aufgabe +Augen +August +Aus +Außerdem +Bad +Band +Bau +Bayern +Bedeutung +Beginn +Begriff +Bei +Beifall +Beim +Beispiel +Bereich +Bericht +Berliner +Bevölkerung +Bild +Bilder +Bis +Blick +Buch +Bundesregierung +BÜNDNIS +Bürger +Bürgermeister +CDU +CDU/CSU +China +DM +Da +Dabei +Damit +Dann +Das +Daten +Dazu +Den +Denn +Der +Deshalb +Deutsche +Deutschen +Deutschland +Dezember +Die +Dienstag +Dies +Diese +Dieser +Dieses +Doch +Donnerstag +Dort +Dr +Dr. +Druck +Du +Durch +Ein +Eine +Einsatz +Einwohner +Eltern +Ende +Entscheidung +Entwicklung +Er +Erfolg +Ergebnis +Erst +Es +Euro +Europa +Europäischen +FC +Fall +Familie +Februar +Fenster +Film +Firma +Folge +Form +Frage +Fragen +Frankfurt +Frankfurter +Frankreich +Franz +Frau +Frauen +Freitag +Friedrich +Für +GRÜNEN +Gebiet +Geld +Gemeinde +Gemeinden +Geschichte +Gesellschaft +Gesetz +GmbH +Gott +Grund +Gruppe +Grünen +Hamburg +Hand +Hans +Haus +Hause +Heinrich +Herr +Herren +Herrn +Heute +Hier +Hilfe +Hälfte +Höhe +ISBN +Ich +Ihnen +Ihr +Ihre +Im +In +Informationen +Interesse +Internet +Ist +Italien +Ja +Jahr +Jahre +Jahren +Jahres +Jahrhundert +Jahrhunderts +Januar +Jetzt +Johann +John +Juli +Juni +Kampf +Karl +Karriere +Kilometer +Kind +Kinder +Kirche +Klaus +Kollegen +Kommission +Kopf +Kosten +Krieg +Kritik +Kultur +Kunst +Köln +König +Lage +Land +Landes +Leben +Leute +Liebe +Liste +Literatur +London +Länder +Ländern +Mai +Mal +Man +Mann +Mannheim +Mannschaft +Mark +Markt +Martin +Maßnahmen +Meine +Meinung +Menschen +Meter +Michael +Milliarden +Millionen +Minuten +Mit +Mitarbeiter +Mitglied +Mitglieder +Mitte +Mittel +Mittwoch +Monate +Monaten +Montag +Morgen +Musik +Mutter +Männer +März +Möglichkeit +München +Nach +Nachdem +Nacht +Name +Namen +Neben +Nein +Neue +New +Nicht +Noch +Norden +November +Nr. +Nun +Nur +Nähe +Oktober +Opfer +Ort +Osten +PDS +Paris +Parlament +Partei +Paul +Personen +Peter +Platz +Politik +Politiker +Polizei +Preis +Problem +Probleme +Programm +Prozent +Präsident +Punkt +Quellen +Rahmen +Rat +Raum +Recht +Regel +Regie +Regierung +Region +Reihe +Richtung +Rolle +SPD +Sache +Saison +Samstag +Schon +Schule +Schweiz +Schweizer +Sein +Seine +Seit +Seite +Seiten +September +Sicherheit +Sie +Siehe +Situation +So +Sohn +Soldaten +Sommer +Sonntag +Spiel +Spiele +Spieler +Sprache +St. +Staat +Staaten +Stadt +Stelle +Straße +Stunden +Stuttgart +System +Tag +Tage +Tagen +Team +Teil +Tel. +The +Thema +Thomas +Titel +Tochter +Tod +Trainer +USA +Uhr +Um +Und +Union +Universität +Unter +Unternehmen +Unterstützung +Vater +Verein +Verfahren +Verfügung +Verlag +Viele +Von +Vor +Wahl +Was +Wasser +Weblinks +Weg +Weise +Weitere +Welt +Wenn +Wer +Werk +Werke +Westen +Wie +Wien +Wilhelm +Wir +Wirtschaft +Woche +Wochen +Wolfgang +Wort +Während +York +Zahl +Zeit +Zeitung +Ziel +Zu +Zukunft +Zum +Zur +Zusammenarbeit +Zusammenhang +a +a +a +a's +aan +ab +abad +abans +abban +abbia +abbiamo +abbiano +abbiate +aber +abia +able +about +above +aby +acara +according +accordingly +acea +aceasta +aceea +aceeasi +aceh +aceia +acel +acela +acelasi +acelea +acerca +acest +acesta +aceste +acestea +acestei +acestia +acestui +ach +acht +acolo +across +actually +acum +acz +aczkolwiek +ací +ad +ada +adalah +adanya +adapun +adica +af +after +afterwards +again +against +agak +agaknya +agama +agar +agl +agl +agli +agli +agora +agustus +ah +ahhoz +ahogy +ahol +ai +ai +ai +aia +aici +aie +aient +aies +ain't +air +ait +aiurea +així +això +aj +akan +akankah +akhir +akhiri +akhirnya +aki +akibat +akik +akkor +aku +akulah +al +al +al +ala +alam +alatt +alaturi +albo +album +aldrig +ale +aleshores +ależ +algmas +algo +algun +alguna +algunas +algunes +algunos +alguns +alguns +alhora +ali +all +all +alla +alla +alla +alle +alle +alle +allein +allem +allen +aller +allerdings +alles +allo +allo +allow +allows +allt +alltför +alltid +allvarlig +allvarligt +allà +allí +allò +almost +alone +along +already +als +als +also +alt +alta +altceva +alte +alte +alten +altfel +although +alti +altii +altra +altre +altres +altul +always +am +am +amat +amatlah +amb +ambdues +ambdós +ambos +amely +amelyek +amelyekben +amelyeket +amelyet +amelynek +amerika +ami +amikor +amit +amolyan +among +amongst +amp +amíg +an +anak +anche +anche +and +and +anda +andalah +ander +andere +anderem +anderen +anderer +anderes +anderm +andern +anderr +anders +andet +andra +andre +ange +anggota +ani +annak +annars +another +ansiosta +antar +antara +antarabangsa +antaranya +ante +antes +antingen +anume +använda +användbar +använder +användning +används +any +anybody +anyhow +anyone +anything +anyway +anyways +anywhere +ao +aos +apa +apaan +apabila +apakah +apalagi +apart +apatah +api +apoi +apontar +appear +appreciate +appropriate +april +aquela +aquelas +aquele +aqueles +aquell +aquella +aquelles +aquells +aquest +aquesta +aquestes +aquests +aqui +aquilo +aquí +ar +arbeid +arbeiten +are +are +aren't +around +arra +arról +artikel +artinya +as +as +asa +asal +asalkan +asas +asemenea +asia +aside +asing +ask +asking +associated +associerad +asta +astazi +astfel +asupra +at +at +atare +atas +atau +ataukah +ataupun +ati +atit +atita +atitea +atitia +atrás +att +atunci +até +au +au +auch +auf +aufgrund +aura +aurai +auraient +aurais +aurait +auras +aurez +auriez +aurions +aurons +auront +aus +australia +aux +außerdem +av +avaient +available +avais +avait +avea +avec +avem +avemmo +avendo +avesse +avessero +avessi +avessimo +aveste +avesti +avete +aveva +avevamo +avevano +avevate +avevi +avevo +avez +aviez +avions +avons +avra +avrai +avranno +avrebbe +avrebbero +avrei +avremmo +avremo +avreste +avresti +avrete +avro +avrà +avrò +avut +avuta +avute +avuti +avuto +awal +awalnya +awam +away +awfully +ayant +ayez +ayons +az +azi +azok +azon +azonban +azt +aztán +azután +azzal +azért +aż +b +ba +badan +bagai +bagaikan +bagaimana +bagaimanakah +bagaimanapun +bagainamakah +bagi +bagian +bahagian +bahan +baharu +bahasa +bahawa +bahkan +bahwa +bahwasannya +bahwasanya +baik +baiknya +baix +bakal +bakalan +bakom +bald +balik +bandar +bangsa +bank +banyak +bapak +bara +barang +barangan +barat +bardziej +bardzo +bare +baru +baru-baru +bawah +be +be +beberapa +became +because +become +becomes +becoming +bedeutet +been +befindet +before +beforehand +begann +begge +begini +beginian +beginikah +beginilah +begitu +begitukah +begitulah +begitupun +behind +behov +behöver +bei +beide +beiden +beim +being +beispielsweise +bekannt +bekas +bekerja +bekommen +belakang +belakangan +belanda +beli +beliau +believe +below +belum +belumlah +belül +bem +benar +benarkah +benarlah +benne +bentuk +berada +berakhir +berakhirlah +berakhirnya +berapa +berapakah +berapalah +berapapun +berarti +berasal +berat +berawal +berbagai +berbanding +berbeda +berdasarkan +berdatangan +bereit +bereits +berharap +berhasil +beri +berikan +berikut +berikutan +berikutnya +berita +berjalan +berjaya +berjumlah +berkaitan +berkali +berkali-kali +berkata +berkehendak +berkeinginan +berkenaan +berlainan +berlaku +berlalu +berlangsung +berlebihan +bermacam +bermacam-macam +bermain +bermaksud +bermula +bernama +bernilai +bersama +bersama-sama +bersiap +bertanya +bertemu +berturut +bertutur +berubah +berujar +berupa +berätta +besar +beside +besides +beskrivits +besok +besonders +besser +best +besteht +besten +better +betul +betulkah +between +betyda +bevor +beyond +bezeichnet +bhd +biasa +biasanya +bidang +bietet +bij +bila +bilakah +bilion +bin +bine +bintang +bis +bisa +bisakah +bisher +bist +bland +ble +bleiben +bleibt +blev +bli +blieb +blir +blog +bn +bo +bola +boleh +bolehkah +bolehlah +bom +borde +bort +borta +bortom +both +bowiem +bra +bredvid +brief +bringen +brinner +bruke +buat +bukan +bukankah +bukanlah +bukannya +buku +bulan +bumi +bung +bursa +but +by +by +byli +bynajmniej +być +był +była +było +były +bzw. +bár +bäst +bättre +både +bör +bör inte +będzie +będą +c +c +c +c'mon +c'mon +c's +c: s +ca +ca. +cada +cada +cadangan +cadascuna +cadascunes +cadascuns +cadascú +cali +cam +came +caminho +campaign +can +can't +cannot +cant +cant +capat +cara +caranya +care +careia +carora +caruia +catch +catre +cause +causes +cała +cały +ce +ce +cea +ceci +ceea +cei +ceilalti +cel +cele +celor +celà +certain +certainly +ces +cet +cette +ceva +changes +che +che +chi +chi +chiar +china +ci +ci +ci +ciebie +cikk +cikkek +cikkeket +cima +cind +cine +cineva +cit +cita +cite +citera +citeva +citi +citiva +cię +clearly +click +co +co +code +coi +coi +cokolwiek +col +col +com +com +come +come +comes +como +comprido +con +con +concerning +conform +conhecido +consequently +consider +considering +contain +containing +contains +contra +contra +contro +contro +copyright +corrente +corresponding +could +couldn't +course +coś +criticized +csak +cu +cual +cuando +cui +cui +cui +cukup +cukupkah +cukuplah +cum +cuma +cumva +currently +czasami +czasem +czemu +czy +czyli +d +d +d'un +d'una +d'unes +d'uns +da +da +da +dabei +daca +dadurch +daerah +dafür +dagangan +dagegen +dagl +dagl +dagli +dagli +daher +dahulu +dai +dai +dal +dal +dalam +daleko +dall +dall +dalla +dalla +dalle +dalle +dallo +dallo +dalt +damals +damit +dan +dana +danach +dann +dans +dapat +dar +daran +darauf +darf +dari +darin +daripada +darunter +darüber +das +dasar +dass +dasselbe +dat +data +datang +datuk +davon +dazu +daß +de +de +de hade +de har +de kommer +de är +deasupra +debaixo +deci +decit +definitely +definitivt +deg +degl +degl +degli +degli +degraba +dei +dei +dei +dein +deine +deinem +deinen +deiner +deines +deja +dekat +del +del +del +dela +delas +dele +deles +dell +dell +della +della +delle +delle +dello +dello +dels +dem +dem +demi +demikian +demikianlah +demselben +den +den +denen +dengan +denn +denne +denselben +dentro +depan +depois +der +der +deras +dere +deren +derer +deres +derivatives +derselbe +derselben +derzeit +des +des +desa +described +desde +desember +deshalb +desi +desligado +despite +despre +després +dess +dessa +desselben +dessen +dessutom +det +det andra +det finns +det ska +det skulle +det är +detik +detta +dette +deutlich +deutsche +deutschen +deutscher +deve +devem +deverá +dewan +di +di +di +dia +diadakan +diakhiri +diakhirinya +dialah +dianggap +diantara +diantaranya +diberi +diberikan +diberikannya +dibuat +dibuatnya +dibuka +dicatatkan +dich +did +didapat +didatangkan +didirikan +didn't +diduga +die +die +dies +diese +dieselbe +dieselben +diesem +diesen +dieser +dieses +different +dig +digunakan +diibaratkan +diibaratkannya +diingat +diingatkan +diinginkan +dijangka +dijawab +dijelaskan +dijelaskannya +dikarenakan +dikatakan +dikatakannya +dikenal +dikerjakan +diketahui +diketahuinya +dikira +dilakukan +dilalui +dilihat +dimaksud +dimaksudkan +dimaksudkannya +dimaksudnya +dimana +diminta +dimintai +dimisalkan +dimulai +dimulailah +dimulainya +dimungkinkan +din +dini +diniagakan +dins +dintr +dintre +dipastikan +diperbuat +diperbuatnya +dipergunakan +diperkirakan +diperlihatkan +diperlukan +diperlukannya +dipersoalkan +dipertanyakan +dipunyai +dir +direita +direkt +diri +dirilis +dirinya +dis +disampaikan +disebut +disebutkan +disebutkannya +disember +disini +disinilah +disse +distrik +dit +ditambahkan +ditandaskan +ditanya +ditanyai +ditanyakan +ditegaskan +ditemukan +ditt +ditujukan +ditunjuk +ditunjuki +ditunjukkan +ditunjukkannya +ditunjuknya +ditutup +dituturkan +dituturkannya +diucapkan +diucapkannya +diungkapkan +diz +dizer +dla +dlaczego +dlatego +do +do +doar +dobrze +doch +dock +document.write +does +doesn't +dog +doing +dois +dokąd +dolar +don't +donat +doncs +donde +done +dong +dort +dos +dov +dov +dove +dove +down +downwards +dość +dpa +dr +drei +du +du +du har +du skulle +du är +dua +dulu +dunia +dupa +durant +durante +durch +during +dużo +dwa +dwaj +dwie +dwoje +dzisiaj +dziś +där +därefter +därför +däri +därifrån +därigenom +därpå +då +dürfen +e +e +e +ea +each +ebbe +ebben +ebbero +ebbi +eben +ebenfalls +ebenso +ed +ed +eddig +edu +edu +een +effective +efter +eftersom +efteråt +ega +egen +egy +egyes +egyetlen +egyik +egyre +egyéb +egész +eh +ehemaligen +eher +ehhez +ehkä +ei +eigene +eigenen +eigentlich +eight +ein +eine +einem +einen +einer +eines +einfach +eingesetzt +einig +einige +einigem +einigen +einiger +einiges +einmal +einzelnen +einzige +either +ej +ekkor +ekonomi +eksekutif +eksport +el +el +ela +elas +ele +ele +electronic +eles +ella +ellas +elle +ellen +eller +ellos +els +else +elsewhere +első +elég +elő +először +előtt +em +em +emilyen +empat +en +en +en annan +en gång +enam +encara +end +endast +endorsed +ene +enemmän +eneste +enggak +enggaknya +enhver +enligt +enn +ennek +ennen +enough +enquanto +ens +ensam +entah +entahlah +entirely +entre +entre +entwickelt +então +er +er +era +era +erais +eram +eran +erano +eras +eravamo +eravate +eren +eres +erhalten +erhielt +eri +erklärt +erklärte +erneut +ero +eropa +err +erre +erreichen +erreicht +erst +erste +ersten +erster +erstmals +es +es +esa +esas +ese +eso +esos +especially +essa +essas +esse +essendo +esses +est +esta +esta +estaba +estabais +estaban +estabas +estad +estada +estadas +estado +estados +estamos +estando +estar +estaremos +estará +estarán +estarás +estaré +estaréis +estaría +estaríais +estaríamos +estarían +estarías +estas +estava +estavam +estaven +este +este +esteja +estejam +estejamos +estemos +estes +esteu +esteve +estive +estivemos +estiver +estivera +estiveram +estiverem +estivermos +estivesse +estivessem +estivéramos +estivéssemos +esto +estos +estou +estoy +estuve +estuviera +estuvierais +estuvieran +estuvieras +estuvieron +estuviese +estuvieseis +estuviesen +estuvieses +estuvimos +estuviste +estuvisteis +estuviéramos +estuviésemos +estuvo +està +estàvem +estàveu +está +estábamos +estáis +están +estás +estávamos +estão +esté +estéis +estén +estés +et +et +etc +etc +etessa +ets +ett +etter +ettor +etwa +etwas +eu +eu +euch +eue +euer +eues +eure +eurem +euren +eurent +eurer +eures +europäischen +eus +eusse +eussent +eusses +eussiez +eussions +eut +eux +even +ever +every +everybody +everyone +everything +everywhere +ex +ex +exact +exactly +exakt +example +except +exempel +ez +ezek +ezen +ezt +ezzel +ezért +eûmes +eût +eûtes +f +faccia +facciamo +facciano +facciate +faccio +face +facemmo +facendo +facesse +facessero +facessi +facessimo +faceste +facesti +faceva +facevamo +facevano +facevate +facevi +facevo +faedah +fai +faktiskt +fand +fanno +far +fara +farai +faranno +farebbe +farebbero +farei +faremmo +faremo +fareste +faresti +farete +farà +fará +farò +fast +fata +faz +fazer +fazia +fd +feb +fece +fecero +feci +fel +felé +fem +femte +fest +few +fez +fi +fick +fie +fifth +film +fim +financial +finansiella +finden +findet +fins +fire +first +five +flera +flere +fleste +foarte +foi +folgenden +folk +followed +following +follows +fomos +for +for +fora +fora +foram +fordi +forem +former +formerly +formos +forrige +forsÛke +fortfarande +forth +fosse +fossem +fossero +fossi +fossimo +fost +foste +fosti +four +fra +fram +framåt +frei +from +frågar +från +früher +fu +fue +fuera +fuerais +fueran +fueras +fueron +fuese +fueseis +fuesen +fueses +fui +fuimos +fuiste +fuisteis +fummo +furent +furono +further +furthermore +fus +fusse +fussent +fusses +fussiez +fussions +fut +fuéramos +fuésemos +fyra +fÅ +fÛr +fÛrst +få +fått +fôramos +fôssemos +följaktligen +följer +följt +för +förhand +förhoppningsvis +förmodligen +förnuftig +först +försök +försöker +försökte +förutom +förändringar +før +først +fûmes +fût +fûtes +führen +führt +führte +fünf +für +g +gab +gairebé +gammal +ganska +ganz +ganze +ganzen +gar +gat +gdy +gdyby +gdyż +gdzie +gdziekolwiek +gdzieś +geaba +geben +gebracht +gedung +gefunden +gegeben +gegen +gegenüber +gegründet +gehen +geht +gehören +gehört +gehörte +gekommen +gelar +gemacht +gemeinsam +genannt +genau +genom +genommen +genug +ger +gerade +gesagt +gesehen +gestellt +gestern +get +gets +getting +gettracker +gewann +gewesen +geworden +gibt +gick +gillade +gilt +ging +given +given +gives +gjorde +gjort +gjÛre +gleich +gleichen +gleichzeitig +gli +gli +global +go +god +godkändes +goes +going +gone +got +gotten +greetings +große +großen +großer +grundlig +grundligt +grup +größte +größten +guna +gunakan +gunung +gut +gute +guten +gÅ +gäller +gå +går +gör +göra +h +ha +ha +hab +habe +haben +habida +habidas +habido +habidos +habiendo +habremos +habrá +habrán +habrás +habré +habréis +habría +habríais +habríamos +habrían +habrías +habéis +había +habíais +habíamos +habían +habías +had +had +hadap +hadapan +hadde +hade +hade inte +hadn't +hai +haikki +haja +hajam +hajamos +hal +hallå +halten +hampir +han +han +han är +handelt +hanem +hanno +hans +hanya +hanyalah +happens +har +har inte +hardly +harga +hari +harian +harus +haruslah +harusnya +has +has +hasil +hasn't +hasta +hat +hatte +hatten +have +havemos +haven't +havia +having +hay +haya +hayamos +hayan +hayas +hayáis +he +he +he's +heb +hei +heißt +hej +hela +hello +help +helt +hem +hemos +hence +hence +hendak +hendaklah +hendaknya +hendes +henne +hennes +her +her +here +here's +hereafter +hereby +herein +hereupon +hers +herself +het +heu +heute +heutigen +hi +hi +hidup +hier +hij +him +himself +hin +hinaus +hingga +hinter +his +hiszen +hit +hitaasti +hither +hjälpa +ho +ho +hoch +hoe +hogy +hogyan +hohe +hohen +hoikein +hon +honom +hopefully +horas +houve +houvemos +houver +houvera +houveram +houverei +houverem +houveremos +houveria +houveriam +houvermos +houverá +houverão +houveríamos +houvesse +houvessem +houvéramos +houvéssemos +how +howbeit +howbeit +however +https +hube +hubiera +hubierais +hubieran +hubieras +hubieron +hubiese +hubieseis +hubiesen +hubieses +hubimos +hubiste +hubisteis +hubiéramos +hubiésemos +hubo +hubungan +hukum +hun +hur +hur som helst +huruvida +hutan +huvudsakligen +hva +hvad +hvem +hver +hvilken +hvis +hvor +hvordan +hvorfor +hvornår +hyvin +há +hão +hälsningar +hält +hän +händer +här +här finns +härefter +häri +härmed +härpå +hätte +hätten +häufig +hålla +håller +hålls +höger +i +i +i +i enlighet med detta +i'd +i'll +i'm +i've +ia +iaitu +ialah +iar +ibarat +ibaratkan +ibaratnya +ibland +ibu +ich +ich +ici +icke +if +igen +ignored +ignoreras +igual +iguals +ihm +ihn +ihnen +ihr +ihre +ihrem +ihren +ihrer +ihres +ii +ik +ikke +iklan +ikut +il +il +il +ile +ill +ill. +illetve +ilman +ilmu +ils +ilyen +ilyenkor +im +im +imi +immediate +immer +in +in +in +inainte +inapoi +inasmuch +inc +inc +inca +incit +ind +indeed +indeed +indeks +indem +india +indicate +indicated +indicates +indikera +indikerade +indikerar +indonesia +industri +informasi +informationsproblem +ingat +ingen +ingenstans +ingenting +inggris +ingin +inginkah +inginkan +ini +iniciar +inicio +inikah +inilah +inn +inna +innan +inne +innehålla +innehållande +innehåller +innen +inner +innerhalb +inny +innych +inom +inre +ins +insa +insbesondere +insgesamt +insofar +instead +inte +internasional +internationalen +intet +into +intr +intre +inward +inzwischen +inåt +io +io +ir +irá +is +is +isi +islam +ismét +isn't +isnin +ison +isso +ist +ista +iste +isto +istället +isu +isär +it +it'd +it'll +it's +italia +iti +its +itself +itt +itu +itukah +itulah +iż +j +j +ja +ja +jabatan +jadi +jadilah +jadinya +jag har +jag ska +jag skulle +jag är +jak +jakarta +jakaś +jakby +jaki +jakichś +jakie +jakiś +jakiż +jakkolwiek +jako +jakoś +jalan +jalur +jaman +jan +jangan +jangankan +janganlah +januari +jauh +jawa +jawab +jawaban +jawabnya +jawatan +jawatankuasa +je +je +jede +jedem +jeden +jeden +jeder +jedes +jedna +jednak +jednakże +jedno +jedoch +jeg +jego +jej +jelas +jelaskan +jelaslah +jelasnya +jemu +jene +jenem +jenen +jener +jenes +jenis +jepang +jepun +jeres +jerman +jest +jestem +jeszcze +jetzt +jeweils +jeśli +jeżeli +jika +jikalau +jiwa +jobban +jos +jual +jualan +juga +julai +jumaat +jumat +jumlah +jumlahnya +jun +juni +just +justru +juta +już +já +jälkeen +jó +jól +ją +k +kabar +kabupaten +kadar +kala +kalangan +kalau +kalaulah +kalaupun +kali +kalian +kalimantan +kam +kamen +kami +kamilah +kamis +kampanj +kamu +kamulah +kan +kan inte +kann +kanske +kanssa +kantor +kapal +kapan +kapankah +kapanpun +karena +karenanya +karya +kasus +kata +katakan +katakanlah +katanya +kaukana +kaum +kaunter +kawasan +każdy +ke +keadaan +kebetulan +kebutuhan +kecamatan +kecil +kedua +kedua-dua +keduanya +kedudukan +keep +keeps +kegiatan +kehidupan +kein +keine +keinem +keinen +keiner +keines +keinginan +kejadian +kekal +kelamaan +kelihatan +kelihatannya +kelima +kell +kellett +kelompok +keluar +keluarga +kelurahan +kembali +kementerian +kemudahan +kemudian +kemungkinan +kemungkinannya +kenaikan +kenapa +kenties +kenyataan +kepada +kepadanya +kepala +kepentingan +kept +keputusan +kerajaan +kerana +keres +keressünk +keresztül +kereta +kerja +kerjasama +kes +kesampaian +keselamatan +keseluruhan +keseluruhannya +kesempatan +kesihatan +keskellä +kesken +keterangan +keterlaluan +ketiga +ketika +ketua +keuntungan +kewangan +khamis +khusus +khususnya +ki +kiedy +kilka +kimś +kini +kinilah +kira +kira-kira +kiranya +kita +kitalah +klar +klart +klci +kleine +kleinen +klibor +klik +km +km +knapp +knappast +know +known +knows +kok +kom +komentar +komma +kommen +kommer +kommer du +kommer inte +kommt +kompas +komposit +kondisi +konnte +konnten +kontrak +korban +korea +kort +kos +koskaan +kota +kritiserade +kto +ktokolwiek +ktoś +która +które +którego +której +który +których +którym +którzy +ku +kuala +kuasa +kuinkan +kukka +kukuh +kumpulan +kun +kunde +kunde inte +kunna +kunne +kurang +kurangnya +kurs +kurz +kvartalsvis +kylliksi +kyllä +känd +kívül +könne +können +könnte +könnten +között +közül +l +l +l +l'hi +la +la +la +lag +lage +lagi +lagian +lagu +lah +lain +lainnya +laku +lalu +lama +lamanya +lang +lang +lange +langkah +langsung +lanjut +lanjutnya +laporan +las +lassen +last +lat +lately +later +latter +latterly +latterly +laut +laut +lav +le +le +le +least +leben +lebih +lecz +lediglich +legalább +legyen +lehet +lehetett +lei +lei +leicht +lembaga +lenne +lenni +lepas +les +les +less +lest +lest +lesz +let +let's +lett +letzte +letzten +leur +leurs +lewat +lhe +lhes +li +li +li +li'n +lidt +liegen +liegt +ließ +ligado +liian +lik +like +like +liked +likely +liknande +lille +lima +lingkungan +lite +little +lla +llavors +lo +lo +login +lokasi +look +looking +looks +lor +loro +loro +los +lot +ltd +ltd +luar +luas +lub +lui +lui +lui +lumpur +luona +lähellä +lämpligt +längs +läpi +lässt +läuft +långt +låt +låt oss +m +m +m'he +ma +ma +ma +mac +macam +machen +macht +machte +maga +magát +mahkamah +mahu +mai +mainly +maioria +maiorias +mais +majd +majlis +mają +maka +makanan +makanya +makin +maklumat +makt +mal +mal +malah +malahan +malam +malaysia +malgrat +mam +mampu +mampukah +man +man +mana +manakala +manalagi +manche +manchem +manchen +mancher +manches +mand +mange +mantan +manusia +many +mare +mas +masa +masalah +masalahnya +masih +masihkah +masing +masing-masing +masuk +masyarakat +mata +mateix +mateixa +mateixes +mateixos +mau +maupun +may +maybe +mało +me +me +mean +meanwhile +measure +med +medan +media +meg +meget +mehr +mehrere +mei +mein +meine +meinem +meinen +meiner +meines +meist +meisten +melainkan +melakukan +melalui +melawan +melihat +melihatnya +mellan +mellett +mely +melyek +memandangkan +memang +memastikan +membantu +membawa +memberi +memberikan +membolehkan +membuat +memerlukan +memihak +memiliki +meminta +memintakan +memisalkan +memperbuat +mempergunakan +memperkirakan +memperlihatkan +mempersiapkan +mempersoalkan +mempertanyakan +mempunyai +memulai +memungkinkan +men +menaiki +menambah +menambahkan +menandaskan +menanti +menantikan +menanya +menanyai +menanyakan +menarik +menawarkan +mencapai +mencari +mencatatkan +mendapat +mendapatkan +mendatang +mendatangi +mendatangkan +menegaskan +menerima +menerusi +mengadakan +mengakhiri +mengaku +mengalami +mengambil +mengapa +mengatakan +mengatakannya +mengenai +mengerjakan +mengetahui +menggalakkan +menggunakan +menghadapi +menghendaki +mengibaratkan +mengibaratkannya +mengikut +mengingat +mengingatkan +menginginkan +mengira +mengucapkan +mengucapkannya +mengumumkan +mengungkapkan +mengurangkan +meninggal +meningkat +meningkatkan +menjadi +menjalani +menjawab +menjelang +menjelaskan +menokok +mens +menteri +mentre +menuju +menunjuk +menunjuki +menunjukkan +menunjuknya +menurut +menuturkan +menyaksikan +menyampaikan +menyangkut +menyatakan +menyebabkan +menyebutkan +menyediakan +menyeluruh +menyiapkan +mer +merasa +mere +mereka +merekalah +merely +merosot +mert +merupakan +mes +meski +meskipun +mesmo +mest +mestadels +mesyuarat +met +metrotv +meu +meu +meus +meus +meva +meves +meyakini +meyakinkan +mi +mi +mi +mia +mia +mich +mie +mie +miei +miei +mig +might +mij +mikor +miksi +mikä +milik +militer +milloin +milloinkan +milyen +mimo +min +minat +minden +mindenki +mindent +mindestens +mindig +mindre +minggu +minha +minhas +minst +mint +minta +mintha +minyak +minä +mio +mio +mir +mirip +mis +misal +misalkan +misalnya +missä +mit +mit +miten +mivel +miért +między +mnie +mną +mobil +mod +modal +mogą +mohd +moi +moi +moim +moja +moje +molt +molta +moltes +molts +mon +mon +mons +more +moreover +most +most +mostly +mot +motsvarande +może +możliwe +można +mu +much +mucho +muchos +mudah +muito +muitos +mula +mulai +mulailah +mulanya +mult +multa +multe +multi +muncul +mungkin +mungkinkah +musi +musik +musim +muss +musste +must +muy +muß +my +my +mycket +mye +myself +mÅ +mÅte +már +más +más +másik +må +mån +många +måste +måte +még +més +même +mí +mía +mías +míg +mío +míos +mój +möchte +möglich +möjligt +müsse +müssen +n +n +n'he +n'hi +na +na +nach +nachdem +nad +nada +nagy +nagyobb +nagyon +nah +nahm +naik +nam +nama +name +namely +nami +namn +namun +nanti +nantinya +nas +nas +nasi +nasional +nasz +nasza +nasze +naszego +naszych +natomiast +natychmiast +natürlich +navn +nawet +nd +nd +ne +ne +ne +near +nearly +neben +necessary +ned +nedan +nedåt +need +needs +negara +negara-negara +negeri +negl +negl +negli +negli +nehmen +nei +nei +nei +neither +nekem +neki +nel +nel +nell +nell +nella +nella +nelle +nelle +nello +nello +nem +nem +neu +neue +neuen +never +nevertheless +new +new +next +ni +ni +niaga +nic +nich +nicht +nichts +nici +niciodata +nie +nie +niech +niego +niej +niemu +nigdy +nilai +nim +nimeni +nimi +nimic +nimmt +nincs +nine +nio +niste +nią +niż +no +no +nobody +noch +noe +noen +nog +nogen +nogensmenys +noget +noi +noi +noi +noll +nome +nomor +només +non +non +none +noone +nopeasti +nor +normally +normalt +nos +nosaltres +nosotras +nosotros +nossa +nossas +nosso +nossos +nostra +nostra +nostra +nostre +nostre +nostre +nostres +nostri +nostri +nostri +nostro +nostro +not +nothing +notre +nou +noua +noun +nous +nov +novel +november +novo +now +nowhere +nu +nuestra +nuestras +nuestro +nuestros +num +numa +numai +numeral +numeralia +nun +nur +ny +nya +nyaris +nyatanya +nyligen +nyt +nÅ +nÅr +não +nächsten +nämlich +nämligen +när +nära +närhelst +närvarande +nästa +nästan +nå +någon +någon annanstans +någonsin +någonstans +något +några +når +nær +næste +næsten +néha +néhány +nélkül +nós +nödvändigt +o +o +o +oavsett +ob +oben +obok +obviously +obwohl +och +också +od +oder +of +of +off +off +official +oft +ofta +often +og +ogos +ogsÅ +også +oh +oh +ohne +oi +oikea +oikealla +ok +ok +okay +okay +około +okt +oktober +olah +old +oleh +olehnya +olika +olyan +om +omedelbar +on +on +ona +once +onde +one +one +ones +oni +only +ono +ons +ont +onto +ook +op +operasi +opp +or +or +orang +oraz +organisasi +ori +orice +oricum +orsaka +orsaker +os +osannolikt +oss +other +others +otherwise +oto +otra +otras +otro +otros +ott +otte +ou +ought +our +ours +ourselves +out +outro +outside +ovan +over +over +overall +own +owszem +p +paar +pada +padahal +padanya +pagetracker +pagi +pai +pak +paling +paljon +pameran +pan +pana +pani +panjang +pantas +papan +par +para +para +paras +parca +parlimen +part +partai +parte +parti +particle +particular +particularly +pas +pas +pasar +pasaran +password +pasti +pastilah +pasukan +paticle +pe +pedig +pegar +pegawai +pejabat +pekan +pekerja +pel +pela +pelabur +pelaburan +pelancongan +pelanggan +pelas +pelbagai +pelo +pelos +pels +peluang +pemain +pembangunan +pemberita +pembinaan +pemerintah +pemerintahan +pemimpin +pendapatan +pendidikan +penduduk +penerbangan +pengarah +pengeluaran +pengerusi +pengguna +penggunaan +pengurusan +peniaga +peningkatan +penting +pentingnya +pentru +per +per +per +perancis +perang +peratus +perche +perchè +perché +percuma +perdagangan +perdana +perhaps +peringkat +perjanjian +perkara +perkhidmatan +perladangan +perlu +perlukah +perlunya +permintaan +pernah +perniagaan +pero +perquè +persekutuan +persen +persidangan +persoalan +persze +pertama +pertandingan +pertanyaan +pertanyakan +pertubuhan +pertumbuhan +perubahan +perusahaan +però +pesawat +peserta +pessoas +peste +petang +pihak +pihaknya +pilihan +pina +pinjaman +piu +più +più +placed +placeras +please +plus +plus +po +poc +poca +poco +pocs +pod +podczas +pode +poderá +podia +polis +polisi +politik +politische +politischen +pomimo +ponad +ponieważ +poques +por +porque +pos +posisi +possible +potser +pour +povo +powinien +powinna +powinni +powinno +poza +prawie +prea +presiden +prestasi +presumably +prin +pro +probably +produk +program +projek +promeiro +pronomia +pronoun +propi +proses +proton +provides +provinsi +przecież +przed +przede +przedtem +przez +przy +pt +pubdate +pukul +pula +pulau +pun +punkt +punya +pusat +putini +pÅ +på +på något sätt +q +qu +qual +qual +quale +quale +qualquer +quals +quan +quando +quant +quanta +quanta +quante +quante +quanti +quanti +quanto +quanto +quarterly +que +que +quel +quelcom +quella +quella +quelle +quelle +quelles +quelli +quelli +quello +quello +quels +quem +questa +questa +queste +queste +questi +questi +questo +questo +qui +qui +quien +quienes +quieto +quin +quina +quines +quins +quite +quote +què +qué +quê +r +rabu +radio +raja +rakan +rakyat +ramai +rantau +rasa +rasanya +rata +rather +raya +really +reasonably +recht +redan +regarding +regardless +regards +relatively +relativt +rendah +republik +resmi +respectively +respektive +rett +ribu +richtig +right +riktig +rimligen +ringgit +roku +roman +root +ruang +rumah +rund +runt +rupa +rupanya +rá +również +s +s +s'ha +s'han +sa +sa +saat +saatnya +sabah +saber +sabtu +sagen +sagt +sagte +sah +sahaja +saham +sai +said +saja +sajalah +saját +sakit +salah +sale +saling +sam +sama +sama-sama +sambil +same +samma +samme +sampai +sampaikan +sana +sangat +sangatlah +sannolikt +sans +sant +sarai +saranno +sarawak +sarebbe +sarebbero +sarei +saremmo +saremo +sareste +saresti +sarete +saro +sarà +sarò +satu +sau +saw +sawit +say +saya +sayalah +saying +says +scheint +schließen +schließlich +schnell +schon +schwer +sdn +se +se +se +sea +seamos +sean +seas +sebab +sebabnya +sebagai +sebagaimana +sebagainya +sebagian +sebahagian +sebaik +sebaiknya +sebaliknya +sebanyak +sebarang +sebegini +sebegitu +sebelah +sebelum +sebelumnya +sebenarnya +seberapa +sebesar +sebetulnya +sebisanya +sebuah +sebut +sebutlah +sebutnya +secara +sechs +second +secondly +secukupnya +sedan +sedang +sedangkan +sedemikian +sedikit +sedikitnya +see +seeing +seem +seemed +seeming +seems +seen +seenaknya +seg +segala +segalanya +segera +segi +seharusnya +sehen +sehingga +sehr +sei +seien +sein +seine +seinem +seinen +seiner +seines +seingat +seit +seja +sejak +sejam +sejamos +sejarah +sejauh +sejenak +sejumlah +sekadar +sekadarnya +sekali +sekali-kali +sekalian +sekaligus +sekalipun +sekarang +sekaranglah +sekecil +seketika +sekiranya +sekitar +sekitarnya +sekolah +seks +sektor +sekurang +sekurangnya +sekuriti +sela +selagi +selain +selaku +selalu +selama +selama-lamanya +selamanya +selanjutnya +selasa +selatan +selbst +selepas +self +seluruh +seluruhnya +selv +selves +sem +sem +semacam +semakin +semalam +semampu +semampunya +semasa +semasih +semata +semaunya +semblant +semblants +sementara +semisal +semisalnya +semmi +sempat +semua +semuanya +semula +sen +senare +sendiri +sendirian +sendirinya +senin +sensible +sent +seolah +seolah-olah +seorang +sepak +sepanjang +sepantasnya +sepantasnyalah +seperlunya +seperti +sepertinya +sepihak +sept +september +ser +ser +sera +serai +seraient +serais +serait +serangan +serantau +seras +serei +seremos +serez +seri +seria +seriam +seriez +serikat +sering +seringnya +serions +serious +seriously +serons +seront +serta +serupa +será +serán +serás +serão +seré +seréis +sería +seríais +seríamos +serían +serías +ses +ses +sesaat +sesama +sesampai +sesegera +sesekali +seseorang +sesi +sesuai +sesuatu +sesuatunya +sesudah +sesudahnya +setelah +setempat +setengah +seterusnya +setiap +setiausaha +setiba +setibanya +setidak +setidaknya +setinggi +sett +setzt +setzte +seu +seu +seus +seus +seusai +seva +seven +several +seves +sewaktu +sex +seáis +shall +sharply +she +should +shouldn't +si +si +si +sia +siamo +siano +siap +siapa +siapakah +siapapun +siaran +siate +sich +sicher +sidang +siden +sido +sie +sieben +siehe +sieht +siellä +siendo +siete +sin +sin +since +sind +sine +singapura +sini +sinilah +sint +sintem +sinä +sist +sista +sistem +six +się +sju +själv +själva +skal +skall +skarpt +skickas +skulle +skulle inte +skąd +slik +slutt +snarare +snart +so +soal +soalnya +sobie +sobre +sobre +sobretot +sobą +sogar +soi +soient +sois +soit +sok +sokat +sokkal +sokongan +solament +solche +solchem +solchen +solcher +solches +soll +sollen +sollte +sollten +sols +som +some +somebody +somehow +somente +someone +something +sometime +sometime +sometimes +somewhat +somewhere +sommes +somos +son +son +sondern +sono +sons +sonst +sont +soon +sorry +sorry +sota +sou +sou +sowie +sowohl +soy +soyez +soyons +speciellt +specificerade +specified +specify +specifying +spielen +spielt +spielte +sposób +spre +sprechen +spricht +später +sri +ssa +sta +sta +stai +stand +stando +stanno +starai +staranno +starebbe +starebbero +starei +staremmo +staremo +stareste +staresti +starete +stark +start +starà +starò +stasiun +statt +stava +stavamo +stavano +stavate +stavi +stavo +stehen +steht +stellen +stellt +stellte +stemmo +stesse +stessero +stessi +stessimo +steste +stesti +stette +stettero +stetti +stia +stiamo +stiano +stiate +still +stille +sto +stor +store +su +su +sua +sua +suara +suas +suatu +sub +sub +such +sudah +sudahkah +sudahlah +sue +sue +sugl +sugl +sugli +sugli +sui +sui +suis +sukan +suku +sul +sul +sull +sull +sulla +sulla +sulle +sulle +sullo +sullo +sumber +sungai +suo +suo +suoi +suoi +suoraan +sup +sup +supaya +sur +surat +sure +sus +sus +susut +suya +suyas +suyo +suyos +swoje +syarikat +syed +syv +sz +szemben +szerint +szinte +számol +számolnak +számára +szól +szólnak +são +säga +säger +säker +säkerligen +särskilt +sätt +så +sådan +såg +sålunda +sånn +såvida inte +sí +só +sóc +són +są +t +t +t s +t'ha +t'han +t'he +t's +ta +ta +tack +tacka +tadi +tadinya +tahap +tahu +tahun +tai +tak +taka +takana +take +taken +taki +takia +takie +także +tal +tal +talán +tam +tama +tambah +tambahnya +también +també +também +tampak +tampaknya +tampil +tampoc +tan +tanah +tandas +tandasnya +tanggal +tanpa +tant +tanta +tantes +tanto +tanya +tanyakan +tanyanya +tapi +tarpeeksi +tas +tatsächlich +tawaran +taz +te +te +tegas +tegasnya +tego +tehát +teilweise +tej +teknologi +telah +televisi +teljes +tell +tem +teman +temos +tempat +tempatan +tempo +tempo +tempoh +temu +ten +tenaga +tenderar +tendremos +tendrá +tendrán +tendrás +tendré +tendréis +tendría +tendríais +tendríamos +tendrían +tendrías +tends +tened +tenemos +tenga +tengah +tengamos +tengan +tengas +tengo +tengáis +tenha +tenham +tenhamos +tenho +tenida +tenidas +tenido +tenidos +teniendo +tentang +tentar +tentara +tentaram +tente +tentei +tentu +tentulah +tentunya +tenéis +tenía +teníais +teníamos +tenían +tenías +tepat +terakhir +terasa +teraz +terbaik +terbang +terbanyak +terbesar +terbuka +terdahulu +terdapat +terdiri +terei +teremos +terhadap +terhadapnya +teria +teriam +teringat +terjadi +terjadilah +terjadinya +terkait +terkenal +terkira +terlalu +terlebih +terletak +terlihat +termasuk +ternyata +tersampaikan +tersebut +tersebutlah +tertentu +tertuju +terus +terutama +terá +terão +teríamos +tes +testimoni +testimony +tetap +tetapi +teu +teu +teus +teus +teva +teve +teves +też +than +thank +thanks +thanx +thanx +that +that's +thats +the +the +their +theirs +them +themselves +then +thence +there +there's +thereafter +thereby +therefore +therein +theres +theres +thereupon +these +they +they'd +they'll +they're +they've +think +third +this +thorough +thoroughly +those +though +though +three +through +throughout +thru +thru +thus +ti +ti +ti +tiada +tiap +tiba +tid +tidak +tidakkah +tidaklah +tidaknya +tidigare +tiene +tienen +tienes +tiga +til +tilbake +till +tillgängliga +tillräckligt +tills +tillsammans +tillåta +tillåter +tilstand +tim +timbalan +timur +tindakan +tinggal +tinggi +tingkat +tinha +tinham +tipo +tive +tivemos +tiver +tivera +tiveram +tiverem +tivermos +tivesse +tivessem +tivéramos +tivéssemos +tjänsteman +to +to +toata +toate +tobie +tobą +tocmai +todo +todos +tog +together +toh +toi +tokoh +ton +ton +tons +too +took +tot +tota +totes +toteż +toti +tots +totul +totusi +tovább +továbbá +toward +towards +tra +tra +trabalhar +trabalho +trat +tre +tredje +tried +tries +tro +tror +trots +trotz +truly +try +try +trying +trzeba +tu +tu +tu +tua +tua +tuas +tue +tue +tun +tun +tunai +tunjuk +tuo +tuo +tuoi +tuoi +turun +turut +tus +tutaj +tutti +tutti +tutto +tutto +tutur +tuturnya +tuturor +tuve +tuviera +tuvierais +tuvieran +tuvieras +tuvieron +tuviese +tuvieseis +tuviesen +tuvieses +tuvimos +tuviste +tuvisteis +tuviéramos +tuviésemos +tuvo +tuya +tuyas +tuyo +tuyos +tv +två +två gånger +twice +two +twoi +twoim +twoja +twoje +twym +twój +ty +tych +tylko +tym +tyvärr +tässä +tém +têm +tínhamos +több +tú +u +uang +ucap +ucapnya +ud +udara +ugyanis +uit +ujar +ujarnya +ulkopuolella +um +uma +umas +umum +umumnya +un +un +un +una +una +una +und +unde +under +under +under tiden +undrar +une +unei +unele +uneori +unes +unescape +unfortunately +ungkap +ungkapnya +unii +unit +universitas +unless +unlikely +uno +uno +unor +unos +uns +uns +unse +unsem +unsen +unser +unsere +unserer +unses +unter +until +unto +untuk +untung +unui +unul +up +upaya +upon +upp +uppenbarligen +uppskatta +urus +us +us +usa +usah +usaha +usai +usar +use +used +useful +user +uses +using +usually +ut +utama +utan +utanför +utara +uten +utolsó +utom +után +utána +uucp +uucp +v +va +vad +vad är +vagy +vagyis +vagyok +vahemmän +vaig +valaki +valamely +valami +valamint +valor +value +való +vam +van +vanligtvis +vannak +var +var inte +var som helst +var är +vara +varefter +varför +varhelst +vari +varifrån +varigenom +various +varit +varje +varken +varpå +vars +vas +vasen +vasenmalla +vastan +ved +veja +vele +vem +vem är +ver +verdade +verdadeiro +verdi +vergangenen +verkade +verkar +verkligen +verkligt +verschiedene +verschiedenen +versi +version +versucht +verwendet +very +vet +veu +vi +vi +vi +vi har +vi kommer +vi skulle +vi är +via +via +vid +viel +viele +vielen +vielleicht +vielä +vier +vieressä +vil +vill +ville +villig +visas +viss +vissza +viszont +vite +viz +viz +você +vocês +voi +voi +voi +volna +volt +voltak +voltam +voltunk +vom +vom +von +vor +vor +vos +vosaltres +vosotras +vosotros +vostra +vostra +vostra +vostre +vostre +vostre +vostres +vostri +vostri +vostro +vostro +votre +vous +vreo +vreun +vs +vs +vuestra +vuestras +vuestro +vuestros +vÅr +vÖre +vÖrt +vähän +väl +väldigt +välkommen +vänligen +värde +vår +vårt +völlig +w +waduh +wah +wahai +wakil +waktu +waktunya +walau +walaupun +wam +wami +wang +wanita +want +wants +war +waren +warga +warst +warta +was +was +wasn't +wasz +wasza +wasze +wat +way +we +we +we'd +we'll +we're +we've +według +weg +wegen +weil +weit +weiter +weitere +weiteren +weiterhin +weiß +wel +welche +welchem +welchen +welcher +welches +welcome +well +wenig +weniger +wenn +went +wer +werde +werden +were +weren't +what +what's +whatever +when +whence +whenever +where +where's +whereafter +whereas +whereby +wherein +whereupon +wherever +whether +which +while +whither +who +who's +whoever +whole +whom +whose +why +wib +wichtig +wie +wieder +wiele +wielu +wij +wilayah +will +willing +wir +wird +wirklich +wirst +wish +wissen +with +within +without +więc +więcej +wo +wobei +wohl +wollen +wollte +won't +wonder +wong +word +worden +would +wouldn't +wszyscy +wszystkich +wszystkie +wszystkim +wszystko +wtedy +wurde +wurden +wy +während +wäre +würde +würden +właśnie +x +y +y +ya +ya +yaitu +yakin +yakni +yang +yes +yet +yhdessä +ylös +yo +you +you'd +you'll +you're +you've +your +yours +yourself +yourselves +ytterligare +z +z. +z.B. +za +zahlreiche +zal +zamana +zapewne +zawsze +ze +zehn +zei +zeigen +zeigt +zero +zij +znowu +znów +zo +został +zou +zs +zu +zudem +zuletzt +zum +zumindest +zunächst +zur +zurück +zusammen +zuvor +zwar +zwei +zweite +zweiten +zwischen +zł +Å +Österreich +Über +à +às +á +által +általában +át +än +ändå +ännu +är +är inte +även +även om +å +år +åt +åt sidan +åtta +è +é +é +él +én +éppen +éramos +érem +éreu +és +étaient +étais +était +étant +étiez +étions +été +étée +étées +étés +êtes +í +így +ó +ö +öffentlichen +önskar +össze +över +överallt +övergripande +överväga +överväger +ú +úgy +új +újabb +újra +último +ü +über +überhaupt +ő +ők +őket +ű +żaden +żadna +żadne +żadnych +że +żebya +алло +без +близко +более +больше +будем +будет +будете +будешь +будто +буду +будут +будь +бы +бывает +бывь +был +была +были +было +быть +в +важная +важное +важные +важный +вам +вами +вас +ваш +ваша +ваше +ваши +вверх +вдали +вдруг +ведь +везде +весь +вниз +внизу +во +вокруг +вон +восемнадцатый +восемнадцать +восемь +восьмой +вот +впрочем +времени +время +все +всегда +всего +всем +всеми +всему +всех +всею +всю +всюду +вся +всё +второй +вы +г +где +говорил +говорит +год +года +году +да +давно +даже +далеко +дальше +даром +два +двадцатый +двадцать +две +двенадцатый +двенадцать +двух +девятнадцатый +девятнадцать +девятый +девять +действительно +дел +день +десятый +десять +для +до +довольно +долго +должно +другая +другие +других +друго +другое +другой +е +его +ее +ей +ему +если +есть +еще +ещё +ею +её +ж +же +жизнь +за +занят +занята +занято +заняты +затем +зато +зачем +здесь +значит +и +из +или +им +именно +иметь +ими +имя +иногда +их +к +каждая +каждое +каждые +каждый +кажется +как +какая +какой +кем +когда +кого +ком +кому +конечно +которая +которого +которой +которые +который +которых +кроме +кругом +кто +куда +лет +ли +лишь +лучше +люди +м +мало +между +меля +менее +меньше +меня +миллионов +мимо +мира +мне +много +многочисленная +многочисленное +многочисленные +многочисленный +мной +мною +мог +могут +мож +может +можно +можхо +мои +мой +мор +мочь +моя +моё +мы +на +наверху +над +надо +назад +наиболее +наконец +нам +нами +нас +начала +наш +наша +наше +наши +не +него +недавно +недалеко +нее +ней +нельзя +нем +немного +нему +непрерывно +нередко +несколько +нет +нею +неё +ни +нибудь +ниже +низко +никогда +никуда +ними +них +ничего +но +ну +нужно +нх +о +об +оба +обычно +один +одиннадцатый +одиннадцать +однажды +однако +одного +одной +около +он +она +они +оно +опять +особенно +от +отовсюду +отсюда +очень +первый +перед +по +под +пожалуйста +позже +пока +пор +пора +после +посреди +потом +потому +почему +почти +прекрасно +при +про +просто +против +процентов +пятнадцатый +пятнадцать +пятый +пять +раз +разве +рано +раньше +рядом +с +сам +сама +сами +самим +самими +самих +само +самого +самой +самом +самому +саму +свое +своего +своей +свои +своих +свою +сеаой +себе +себя +сегодня +седьмой +сейчас +семнадцатый +семнадцать +семь +сих +сказал +сказала +сказать +сколько +слишком +сначала +снова +со +собой +собою +совсем +спасибо +стал +суть +т +та +так +такая +также +такие +такое +такой +там +твой +твоя +твоё +те +тебе +тебя +тем +теми +теперь +тех +то +тобой +тобою +тогда +того +тоже +только +том +тому +тот +тою +третий +три +тринадцатый +тринадцать +ту +туда +тут +ты +тысяч +у +уж +уже +уметь +хорошо +хотеть +хоть +хотя +хочешь +часто +чаще +чего +человек +чем +чему +через +четвертый +четыре +четырнадцатый +четырнадцать +что +чтоб +чтобы +чуть +шестнадцатый +шестнадцать +шестой +шесть +эта +эти +этим +этими +этих +это +этого +этой +этом +этому +этот +эту +я +، +أ +ا +اثر +اجل +احد +اخرى +اذا +اربعة +اطار +اعادة +اعلنت +اف +اكثر +اكد +الا +الاخيرة +الان +الاول +الاولى +التى +التي +الثاني +الثانية +الذاتي +الذى +الذي +الذين +السابق +الف +الماضي +المقبل +الوقت +الى +اليوم +اما +امام +امس +ان +انه +انها +او +اول +اي +ايار +ايام +ايضا +ب +باسم +بان +برس +بسبب +بشكل +بعد +بعض +بن +به +بها +بين +تم +ثلاثة +ثم +جميع +حاليا +حتى +حوالى +حول +حيث +حين +خلال +دون +ذلك +زيارة +سنة +سنوات +شخصا +صباح +صفرa +ضد +ضمن +عام +عاما +عدة +عدد +عدم +عشر +عشرة +على +عليه +عليها +عن +عند +عندما +غدا +غير +ـ +ف +فان +في +فيه +فيها +قال +قبل +قد +قوة +كان +كانت +كل +كلم +كما +لا +لدى +لقاء +لكن +للامم +لم +لن +له +لها +لوكالة +ما +مايو +مساء +مع +مقابل +مليار +مليون +من +منذ +منها +نحو +نفسه +نهاية +هذا +هذه +هناك +هو +هي +و +و6 +واحد +واضاف +واضافت +واكد +وان +واوضح +وفي +وقال +وقالت +وقد +وقف +وكان +وكانت +ولا +ولم +ومن +وهو +وهي +يكون +يمكن +يوم +一 +上 +下 +不 +与 +且 +个 +为 +乃 +么 +之 +也 +了 +于 +些 +亦 +人 +今 +仍 +从 +他 +以 +们 +但 +何 +你 +使 +儿 +其 +再 +几 +凡 +凭 +则 +别 +到 +即 +却 +去 +又 +及 +另 +只 +可 +各 +同 +后 +向 +吧 +和 +咱 +哇 +哟 +哪 +啥 +啦 +嗡 +嘛 +因 +在 +她 +好 +如 +它 +小 +尔 +已 +并 +当 +往 +很 +得 +怎 +您 +我 +或 +所 +打 +把 +拿 +据 +无 +既 +是 +曾 +最 +有 +来 +某 +此 +每 +比 +沿 +用 +由 +的 +看 +着 +给 +而 +自 +至 +致 +若 +虽 +被 +让 +该 +诸 +谁 +起 +趁 +距 +跟 +还 +这 +那 +随 +靠 +가 +같이 +고 +과 +과는 +과를 +과의 +까지 +까지는 +까지의 +께 +나 +는 +다 +대로 +도 +든 +라 +라고 +로 +로는 +로부터 +로의 +를 +만 +만에 +만을 +만의 +만이 +며 +밖에 +보다 +보다는 +부터 +부터는 +아 +야 +에 +에게 +에는 +에도 +에만 +에서 +에서는 +에서도 +에서의 +엔 +여 +와 +와의 +요 +으로 +으로는 +으로부터 +으로써 +으로의 +은 +을 +의 +이 +이고 +이나 +이다 +이라고 +이라는 +이며 +처럼 +치고 +토록 +하고 +ad +а +فى diff --git a/src/main/resources/com/gravity/goose/text/ca.txt b/src/main/resources/com/gravity/goose/text/stopwords-ca.txt similarity index 100% rename from src/main/resources/com/gravity/goose/text/ca.txt rename to src/main/resources/com/gravity/goose/text/stopwords-ca.txt diff --git a/src/main/resources/com/gravity/goose/text/stopwords-de.txt b/src/main/resources/com/gravity/goose/text/stopwords-de.txt index 37e6714d3..67d418202 100644 --- a/src/main/resources/com/gravity/goose/text/stopwords-de.txt +++ b/src/main/resources/com/gravity/goose/text/stopwords-de.txt @@ -1,894 +1,956 @@ -der -die -und -in -den -von -zu -mit -ist -das -des -im -für -auf -sich -dem -Die -nicht -ein -eine -als -auch -an -es -er -aus -bei -werden -sie -nach -Der -sind -war -wurde -wird -einer -Das -hat -am -wie -um -Sie -zum -oder -einen -über -dass -einem -noch -bis -nur -vor -zur -durch -so -haben -aber -ich -In -man -mehr -wir -daß -kann -sein -vom -Es -unter -Ich -hatte -gegen -Im -Er -wenn -dieser -seine -eines -können -diese -wieder -wurden -dann -was -schon -Jahr -zwei -seiner -Jahre -Jahren -ihre -gibt -zwischen -Ein -immer -waren -Zeit -Uhr -keine -Wir -sei -habe -sehr -hier -alle -Nach -ab -sowie -da -beim -heute -seit -diesem -uns -soll -Und -Deutschland -Mit -anderen -jedoch -ihr -damit -ersten -drei -Auch -doch -ihm -seinen -Stadt -etwa -sagte -ihn -Eine -sondern -bereits -müssen -ohne -Menschen -will -Prozent -ihrer -worden -Bei -selbst -jetzt -of -Als -seinem -neue -muss -allem -neuen -Ende -nun -Von -geht -ihren -SPD -So -Für -weil -wo -mich -mir -Aber -Am -Diese -ganz -dieses -etwas -andere -Geschichte -Frau -liegt -Wenn -ins -gut -einmal -konnte -Euro -du -denn -viele -Auf -machen -Herr -Leben -the -diesen -erst -lassen -Wie -dort -beiden -erste -The -Teil -deutschen -weiter -also -viel -sollte -dabei -Millionen -Was -später -hatten -während -Welt -ISBN -sagt -denen -wollen -steht -Da -kommt -kein -vier -nichts -de -allerdings -Seite -ob -dazu -gab -s -letzten -kam -USA -wegen -dies -zurück -großen -kommen -alles -rund -ja -sollen -deren -dafür -Doch -Kinder -wäre -Frage -weitere -würde -dessen -große -Januar -zwar -darauf -Arbeit - -Beispiel -September -zusammen -einige -Land -allen -fast -Frauen -März -Namen -Unternehmen -ihrem -davon -Mann -Mai -Platz -deutsche -werde -Oktober -muß -Literatur -Art -ihnen -Deutschen -fünf -gilt -sehen -könnte -Dezember -stehen -sogar -seien -Wer -Seit -August -bin -Beifall -Fall -Juni -eigenen -November -mal -Film -finden -sagen -Regierung -April -München -oft -Dies -lange -ebenfalls -bekannt -Präsident -wohl -CDU/CSU -Zu -gehört -Man -weniger -gerade -statt -aller -Juli -möchte -Weg -Entwicklung -zunächst -ging -Mark -Bild -möglich -gar -besonders -hätte -macht -Politik -geben -Tag -Ihnen -Februar -Hier -Gemeinde -wenig -gewesen -Europa -gehen -gemacht -welche -New -gegenüber -heißt -Familie -Union -tun -Jahrhundert -einfach -Frankfurt -deutlich -Dabei -neben -sollten -Kirche -keinen -Artikel -Ihre -Peter -Thema -besteht -vielen -nie -bzw. -Aus -Zeitung -wollte -Kommission -seines -Hamburg -hätten -Geld -meine -Dr -kaum -zweiten -Während -lässt -Anfang -Um -Ort -weiß -findet -Bereich -Haus -anderem -Mal - -deshalb -alten -erhalten -zehn -Zum -bisher -meisten -darüber -würden -hin -Form -An -bleibt -sieht -Gesellschaft -Berliner -Den -vergangenen -bezeichnet -Nr. -Ziel -je -weit -Grund -sechs -darf -Rolle -Deutsche -wissen -jeder -zeigt -Damit -Denn -mehrere -nächsten -Vor -Dann -schließlich -kleinen -Durch -Michael -km -Lage -Gruppe -Band -damals -Spiel -Sohn -Dr. -stark -Universität -Hilfe -besser -hinter -meist -Seine -St. -stellt -Tage -unsere -daher -Nur -wirklich -führt -Dieser -beispielsweise -kurz -Bericht -gleich -weiteren -Straße -bleiben -Wirtschaft -Siehe -Zukunft -eher -Bedeutung -Recht -insbesondere -Bevölkerung -schnell -nehmen -Verlag -CDU -Tod -Alle -solche -neu -Bundesregierung -pro -Frankreich -Jahres -konnten -Ihr -ließ -Du -kleine -Europäischen -Vater -genannt -lang -Titel -Rahmen -Wort -eigentlich -erhielt -einigen -Woche -FC -Musik -dagegen -Sein -allein -Einsatz -genau -begann -innerhalb -unserer -Partei -Polizei -Wasser -bringen -deutscher -natürlich -eigene - -Wochen -insgesamt -Außerdem -Bis -halten -politischen -musste -Parlament -Meter -Hand -Zahl -stellen -gesagt -führen -daran -Erfolg -befindet -Zur -verschiedenen -Probleme -Unter -Abgeordneten -Milliarden -nahm -stand -geworden -c -liegen -erstmals -Sprache -Fragen -nämlich -Ja -Kollegen -Männer -Nicht -Wolfgang -Problem -Mutter -Minuten -Weitere -Mitte -Mitglied -Jahrhunderts -Krieg -Hans -könnten -Thomas -Über -Personen -Friedrich -ca. -ebenso -machte -York -vielleicht -Stelle -derzeit -Ländern -Höhe -verwendet -gute -überhaupt -Länder -Angaben -führte -gegeben -Tel. -klar -Karl -europäischen -sicher -Saison -Programm -erreicht -GRÜNEN -beide -Sonntag -sowohl -Region -alte -Staaten -Paris -Beginn -Buch -zweite -ganze -hinaus -König -Morgen -handelt -fand -Schweiz -jeweils -Weise -DM -fest -per -blieb -Mitglieder -Richtung -Heute -Stunden -leicht -Leute -wobei -gehören -bietet -Wien -politische -Folge -Blick -aufgrund -Entscheidung -Dort -Neben -hält -Gebiet -gemeinsam -erklärt -direkt -könne -Daten -recht -schwer -Bayern -jeden -Name -Schule -GmbH -dürfen -laut -Seiten -Bürger -Eltern -dpa -Meinung -Werke -Jetzt -letzte -Spieler -bald -London -häufig -heutigen -Einwohner -acht -eben -Internet -Markt -dich -Nein -Situation -System -zuvor -Möglichkeit -Freitag -mein -Mannheim -Fenster -Kosten -inzwischen -kamen -John -sieben -bekommen -erreichen -unser -Verfügung -Köln -Dazu -besten -Zusammenhang -Reihe -Kritik -richtig -Liste -Herren -Augen -taz -zeigen -siehe -hohen -spielte -leben -völlig -Neue -ihres -spielt -Sicherheit -weiterhin -hoch -nachdem -gegründet -erneut -sah -z. -wer -Informationen -anders -spielen -Dieses -gleichen -Kultur -größten -eingesetzt -Unterstützung -Beim -erklärte -Allerdings -Firma -Amt -Kopf -trotz -Erst -gebracht -gestellt -läuft -schließen -Bilder -nimmt -Mitarbeiter -BÜNDNIS -Deshalb -verschiedene -zudem -Werk -Ergebnis -Heinrich -Bau -ehemaligen -Preis -Tochter -Stuttgart -Samstag -Bad -Verfahren -Kind -früher -Paul -darin -paar -Punkt -Weblinks -Nun -Maßnahmen -Österreich -Wilhelm -Herrn -z.B. -Noch -Staat -Zusammenarbeit -knapp -Nacht -einzelnen -trat -gestern -Team -Osten -scheint -Mannschaft -Tagen -internationalen -jede -mindestens -teilweise -einzige -Soldaten -setzt -gefunden -Kunst -lediglich -öffentlichen -bedeutet -Raum -gewann -Kampf -Martin -Ist -Begriff -Hause -entwickelt -Wahl -Schon -arbeiten -größte -Donnerstag -Ab -Viele -Quellen -Nachdem -dadurch -Italien -erster -gekommen -dir -Mittwoch -danach -stellte -her -zahlreiche -Landes -Gesetz -Monaten -PDS -Rat -Franz -Verein -sonst -Frankfurter -Meine -Klaus -Karriere -müsse -meiner -anderer -zuletzt -Monate -Alter -hohe -Interesse -Regie -Montag -genommen -lag -Sommer -spricht -Trainer -Liebe -jedem -/DIE -Westen -guten -Kilometer -Johann -gesehen -darunter -solchen -indem -Mittel -oben -Schweizer -wichtig -Hälfte -Regel -obwohl -Bürgermeister -Aufgabe -Spiele -folgenden -Dienstag -version -Sache -sprechen -Gemeinden -electronic -for -Norden -außerdem -Antrag -gleichzeitig -ganzen -Politiker -gehörte -großer -China -Nähe -bereit -setzte -Druck -tatsächlich -Gott -frei -Grünen -zumindest -Opfer -genug -versucht -bevor \ No newline at end of file + +/DIE +Ab +Aber +Abgeordneten +Alle +Allerdings +Als +Alter +Am +Amt +An +Anfang +Angaben +Antrag +April +Arbeit +Art +Artikel +Auch +Auf +Aufgabe +Augen +August +Aus +Außerdem +Bad +Band +Bau +Bayern +Bedeutung +Beginn +Begriff +Bei +Beifall +Beim +Beispiel +Bereich +Bericht +Berliner +Bevölkerung +Bild +Bilder +Bis +Blick +Buch +Bundesregierung +BÜNDNIS +Bürger +Bürgermeister +CDU +CDU/CSU +China +DM +Da +Dabei +Damit +Dann +Das +Daten +Dazu +Den +Denn +Der +Deshalb +Deutsche +Deutschen +Deutschland +Dezember +Die +Dienstag +Dies +Diese +Dieser +Dieses +Doch +Donnerstag +Dort +Dr +Dr. +Druck +Du +Durch +Ein +Eine +Einsatz +Einwohner +Eltern +Ende +Entscheidung +Entwicklung +Er +Erfolg +Ergebnis +Erst +Es +Euro +Europa +Europäischen +FC +Fall +Familie +Februar +Fenster +Film +Firma +Folge +Form +Frage +Fragen +Frankfurt +Frankfurter +Frankreich +Franz +Frau +Frauen +Freitag +Friedrich +Für +GRÜNEN +Gebiet +Geld +Gemeinde +Gemeinden +Geschichte +Gesellschaft +Gesetz +GmbH +Gott +Grund +Gruppe +Grünen +Hamburg +Hand +Hans +Haus +Hause +Heinrich +Herr +Herren +Herrn +Heute +Hier +Hilfe +Hälfte +Höhe +ISBN +Ich +Ihnen +Ihr +Ihre +Im +In +Informationen +Interesse +Internet +Ist +Italien +Ja +Jahr +Jahre +Jahren +Jahres +Jahrhundert +Jahrhunderts +Januar +Jetzt +Johann +John +Juli +Juni +Kampf +Karl +Karriere +Kilometer +Kind +Kinder +Kirche +Klaus +Kollegen +Kommission +Kopf +Kosten +Krieg +Kritik +Kultur +Kunst +Köln +König +Lage +Land +Landes +Leben +Leute +Liebe +Liste +Literatur +London +Länder +Ländern +Mai +Mal +Man +Mann +Mannheim +Mannschaft +Mark +Markt +Martin +Maßnahmen +Meine +Meinung +Menschen +Meter +Michael +Milliarden +Millionen +Minuten +Mit +Mitarbeiter +Mitglied +Mitglieder +Mitte +Mittel +Mittwoch +Monate +Monaten +Montag +Morgen +Musik +Mutter +Männer +März +Möglichkeit +München +Nach +Nachdem +Nacht +Name +Namen +Neben +Nein +Neue +New +Nicht +Noch +Norden +November +Nr. +Nun +Nur +Nähe +Oktober +Opfer +Ort +Osten +PDS +Paris +Parlament +Partei +Paul +Personen +Peter +Platz +Politik +Politiker +Polizei +Preis +Problem +Probleme +Programm +Prozent +Präsident +Punkt +Quellen +Rahmen +Rat +Raum +Recht +Regel +Regie +Regierung +Region +Reihe +Richtung +Rolle +SPD +Sache +Saison +Samstag +Schon +Schule +Schweiz +Schweizer +Sein +Seine +Seit +Seite +Seiten +September +Sicherheit +Sie +Siehe +Situation +So +Sohn +Soldaten +Sommer +Sonntag +Spiel +Spiele +Spieler +Sprache +St. +Staat +Staaten +Stadt +Stelle +Straße +Stunden +Stuttgart +System +Tag +Tage +Tagen +Team +Teil +Tel. +The +Thema +Thomas +Titel +Tochter +Tod +Trainer +USA +Uhr +Um +Und +Union +Universität +Unter +Unternehmen +Unterstützung +Vater +Verein +Verfahren +Verfügung +Verlag +Viele +Von +Vor +Wahl +Was +Wasser +Weblinks +Weg +Weise +Weitere +Welt +Wenn +Wer +Werk +Werke +Westen +Wie +Wien +Wilhelm +Wir +Wirtschaft +Woche +Wochen +Wolfgang +Wort +Während +York +Zahl +Zeit +Zeitung +Ziel +Zu +Zukunft +Zum +Zur +Zusammenarbeit +Zusammenhang +ab +aber +acht +alle +allein +allem +allen +aller +allerdings +alles +als +also +alte +alten +am +an +ander +andere +anderem +anderen +anderer +anderes +anderm +andern +anderr +anders +arbeiten +auch +auf +aufgrund +aus +außerdem +bald +bedeutet +befindet +begann +bei +beide +beiden +beim +beispielsweise +bekannt +bekommen +bereit +bereits +besonders +besser +besteht +besten +bevor +bezeichnet +bietet +bin +bis +bisher +bist +bleiben +bleibt +blieb +bringen +bzw. +c +ca. +da +dabei +dadurch +dafür +dagegen +daher +damals +damit +danach +dann +daran +darauf +darf +darin +darunter +darüber +das +dass +dasselbe +davon +dazu +daß +de +dein +deine +deinem +deinen +deiner +deines +dem +demselben +den +denen +denn +denselben +der +deren +derer +derselbe +derselben +derzeit +des +deshalb +desselben +dessen +deutlich +deutsche +deutschen +deutscher +dich +die +dies +diese +dieselbe +dieselben +diesem +diesen +dieser +dieses +dir +direkt +doch +dort +dpa +drei +du +durch +dürfen +eben +ebenfalls +ebenso +ehemaligen +eher +eigene +eigenen +eigentlich +ein +eine +einem +einen +einer +eines +einfach +eingesetzt +einig +einige +einigem +einigen +einiger +einiges +einmal +einzelnen +einzige +electronic +entwickelt +er +erhalten +erhielt +erklärt +erklärte +erneut +erreichen +erreicht +erst +erste +ersten +erster +erstmals +es +etwa +etwas +euch +euer +eure +eurem +euren +eurer +eures +europäischen +fand +fast +fest +finden +findet +folgenden +for +frei +früher +führen +führt +führte +fünf +für +gab +ganz +ganze +ganzen +gar +geben +gebracht +gefunden +gegeben +gegen +gegenüber +gegründet +gehen +geht +gehören +gehört +gehörte +gekommen +gemacht +gemeinsam +genannt +genau +genommen +genug +gerade +gesagt +gesehen +gestellt +gestern +gewann +gewesen +geworden +gibt +gilt +ging +gleich +gleichen +gleichzeitig +große +großen +großer +größte +größten +gut +gute +guten +hab +habe +haben +halten +handelt +hat +hatte +hatten +heißt +her +heute +heutigen +hier +hin +hinaus +hinter +hoch +hohe +hohen +hält +hätte +hätten +häufig +ich +ihm +ihn +ihnen +ihr +ihre +ihrem +ihren +ihrer +ihres +im +immer +in +indem +innerhalb +ins +insbesondere +insgesamt +internationalen +inzwischen +ist +ja +je +jede +jedem +jeden +jeder +jedes +jedoch +jene +jenem +jenen +jener +jenes +jetzt +jeweils +kam +kamen +kann +kaum +kein +keine +keinem +keinen +keiner +keines +klar +kleine +kleinen +km +knapp +kommen +kommt +konnte +konnten +kurz +könne +können +könnte +könnten +lag +lang +lange +lassen +laut +leben +lediglich +leicht +letzte +letzten +liegen +liegt +ließ +lässt +läuft +machen +macht +machte +mal +man +manche +manchem +manchen +mancher +manches +mehr +mehrere +mein +meine +meinem +meinen +meiner +meines +meist +meisten +mich +mindestens +mir +mit +muss +musste +muß +möchte +möglich +müsse +müssen +nach +nachdem +nahm +natürlich +neben +nehmen +neu +neue +neuen +nicht +nichts +nie +nimmt +noch +nun +nur +nächsten +nämlich +ob +oben +obwohl +oder +of +oft +ohne +paar +per +politische +politischen +pro +recht +richtig +rund +s +sagen +sagt +sagte +sah +scheint +schließen +schließlich +schnell +schon +schwer +sechs +sehen +sehr +sei +seien +sein +seine +seinem +seinen +seiner +seines +seit +selbst +setzt +setzte +sich +sicher +sie +sieben +siehe +sieht +sind +so +sogar +solche +solchem +solchen +solcher +solches +soll +sollen +sollte +sollten +sondern +sonst +sowie +sowohl +spielen +spielt +spielte +sprechen +spricht +später +stand +stark +statt +stehen +steht +stellen +stellt +stellte +tatsächlich +taz +teilweise +the +trat +trotz +tun +um +und +uns +unse +unsem +unsen +unser +unsere +unserer +unses +unter +vergangenen +verschiedene +verschiedenen +version +versucht +verwendet +viel +viele +vielen +vielleicht +vier +vom +von +vor +völlig +war +waren +warst +was +weg +wegen +weil +weit +weiter +weitere +weiteren +weiterhin +weiß +welche +welchem +welchen +welcher +welches +wenig +weniger +wenn +wer +werde +werden +wichtig +wie +wieder +will +wir +wird +wirklich +wirst +wissen +wo +wobei +wohl +wollen +wollte +worden +wurde +wurden +während +wäre +würde +würden +z. +z.B. +zahlreiche +zehn +zeigen +zeigt +zu +zudem +zuletzt +zum +zumindest +zunächst +zur +zurück +zusammen +zuvor +zwar +zwei +zweite +zweiten +zwischen +Österreich +Über +öffentlichen +über +überhaupt diff --git a/src/main/resources/com/gravity/goose/text/en.txt b/src/main/resources/com/gravity/goose/text/stopwords-en.txt similarity index 86% rename from src/main/resources/com/gravity/goose/text/en.txt rename to src/main/resources/com/gravity/goose/text/stopwords-en.txt index d3a39543f..a4f1a030b 100644 --- a/src/main/resources/com/gravity/goose/text/en.txt +++ b/src/main/resources/com/gravity/goose/text/stopwords-en.txt @@ -1,546 +1,545 @@ -a's -able -about -above -according -accordingly -across -actually -after -afterwards -again -against -ain't -all -allow -allows -almost -alone -along -already -also -although -always -am -among -amongst -an -and -another -any -anybody -anyhow -anyone -anything -anyway -anyways -anywhere -apart -appear -appreciate -appropriate -are -aren't -around -as -aside -ask -asking -associated -at -available -away -awfully -be -became -because -become -becomes -becoming -been -before -beforehand -behind -being -believe -below -beside -besides -best -better -between -beyond -both -brief -but -by -c -c'mon -c's -came -campaign -can -can't -cannot -cant -cause -causes -certain -certainly -changes -clearly -co -com -come -comes -concerning -consequently -consider -considering -contain -containing -contains -corresponding -could -couldn't -course -currently -definitely -described -despite -did -didn't -different -do -does -doesn't -doing -don't -done -down -downwards -during -each -edu -eight -either -else -elsewhere -enough -endorsed -entirely -especially -et -etc -even -ever -every -everybody -everyone -everything -everywhere -ex -exactly -example -except -far -few -fifth -first -financial -five -followed -following -follows -for -former -formerly -forth -four -from -further -furthermore -get -gets -getting -given -gives -go -goes -going -gone -got -gotten -greetings -had -hadn't -happens -hardly -has -hasn't -have -haven't -having -he -he's -hello -help -hence -her -here -here's -hereafter -hereby -herein -hereupon -hers -herself -hi -him -himself -his -hither -hopefully -how -howbeit -however -i'd -i'll -i'm -i've -if -ignored -immediate -in -inasmuch -inc -indeed -indicate -indicated -indicates -inner -insofar -instead -into -inward -is -isn't -it -it'd -it'll -it's -its -itself -just -keep -keeps -kept -know -knows -known -last -lately -later -latter -latterly -least -less -lest -let -let's -like -liked -likely -little -look -looking -looks -ltd -mainly -many -may -maybe -me -mean -meanwhile -merely -might -more -moreover -most -mostly -much -must -my -myself -name -namely -nd -near -nearly -necessary -need -needs -neither -never -nevertheless -new -next -nine -no -nobody -non -none -noone -nor -normally -not -nothing -novel -now -nowhere -obviously -of -off -often -oh -ok -okay -old -on -once -one -ones -only -onto -or -other -others -otherwise -ought -our -ours -ourselves -out -outside -over -overall -own -particular -particularly -per -perhaps -placed -please -plus -possible -presumably -probably -provides -quite -quote -quarterly -rather -really -reasonably -regarding -regardless -regards -relatively -respectively -right -said -same -saw -say -saying -says -second -secondly -see -seeing -seem -seemed -seeming -seems -seen -self -selves -sensible -sent -serious -seriously -seven -several -shall -she -should -shouldn't -since -six -so -some -somebody -somehow -someone -something -sometime -sometimes -somewhat -somewhere -soon -sorry -specified -specify -specifying -still -sub -such -sup -sure -t's -take -taken -tell -tends -than -thank -thanks -thanx -that -that's -thats -the -their -theirs -them -themselves -then -thence -there -there's -thereafter -thereby -therefore -therein -theres -thereupon -these -they -they'd -they'll -they're -they've -think -third -this -thorough -thoroughly -those -though -three -through -throughout -thru -thus -to -together -too -took -toward -towards -tried -tries -truly -try -trying -twice -two -under -unfortunately -unless -unlikely -until -unto -up -upon -us -use -used -useful -uses -using -usually -uucp -value -various -very -via -viz -vs -want -wants -was -wasn't -way -we -we'd -we'll -we're -we've -welcome -well -went -were -weren't -what -what's -whatever -when -whence -whenever -where -where's -whereafter -whereas -whereby -wherein -whereupon -wherever -whether -which -while -whither -who -who's -whoever -whole -whom -whose -why -will -willing -wish -with -within -without -won't -wonder -would -would -wouldn't -yes -yet -you -you'd -you'll -you're -you've -your -yours -yourself -yourselves -zero -official -sharply -criticized \ No newline at end of file +a's +able +about +above +according +accordingly +across +actually +after +afterwards +again +against +ain't +all +allow +allows +almost +alone +along +already +also +although +always +am +among +amongst +an +and +another +any +anybody +anyhow +anyone +anything +anyway +anyways +anywhere +apart +appear +appreciate +appropriate +are +aren't +around +as +aside +ask +asking +associated +at +available +away +awfully +be +became +because +become +becomes +becoming +been +before +beforehand +behind +being +believe +below +beside +besides +best +better +between +beyond +both +brief +but +by +c +c'mon +c's +came +campaign +can +can't +cannot +cant +cause +causes +certain +certainly +changes +clearly +co +com +come +comes +concerning +consequently +consider +considering +contain +containing +contains +corresponding +could +couldn't +course +criticized +currently +definitely +described +despite +did +didn't +different +do +does +doesn't +doing +don't +done +down +downwards +during +each +edu +eight +either +else +elsewhere +endorsed +enough +entirely +especially +et +etc +even +ever +every +everybody +everyone +everything +everywhere +ex +exactly +example +except +far +few +fifth +financial +first +five +followed +following +follows +for +former +formerly +forth +four +from +further +furthermore +get +gets +getting +given +gives +go +goes +going +gone +got +gotten +greetings +had +hadn't +happens +hardly +has +hasn't +have +haven't +having +he +he's +hello +help +hence +her +here +here's +hereafter +hereby +herein +hereupon +hers +herself +hi +him +himself +his +hither +hopefully +how +howbeit +however +i'd +i'll +i'm +i've +if +ignored +immediate +in +inasmuch +inc +indeed +indicate +indicated +indicates +inner +insofar +instead +into +inward +is +isn't +it +it'd +it'll +it's +its +itself +just +keep +keeps +kept +know +known +knows +last +lately +later +latter +latterly +least +less +lest +let +let's +like +liked +likely +little +look +looking +looks +ltd +mainly +many +may +maybe +me +mean +meanwhile +merely +might +more +moreover +most +mostly +much +must +my +myself +name +namely +nd +near +nearly +necessary +need +needs +neither +never +nevertheless +new +next +nine +no +nobody +non +none +noone +nor +normally +not +nothing +novel +now +nowhere +obviously +of +off +official +often +oh +ok +okay +old +on +once +one +ones +only +onto +or +other +others +otherwise +ought +our +ours +ourselves +out +outside +over +overall +own +particular +particularly +per +perhaps +placed +please +plus +possible +presumably +probably +provides +quarterly +quite +quote +rather +really +reasonably +regarding +regardless +regards +relatively +respectively +right +said +same +saw +say +saying +says +second +secondly +see +seeing +seem +seemed +seeming +seems +seen +self +selves +sensible +sent +serious +seriously +seven +several +shall +sharply +she +should +shouldn't +since +six +so +some +somebody +somehow +someone +something +sometime +sometimes +somewhat +somewhere +soon +sorry +specified +specify +specifying +still +sub +such +sup +sure +t's +take +taken +tell +tends +than +thank +thanks +thanx +that +that's +thats +the +their +theirs +them +themselves +then +thence +there +there's +thereafter +thereby +therefore +therein +theres +thereupon +these +they +they'd +they'll +they're +they've +think +third +this +thorough +thoroughly +those +though +three +through +throughout +thru +thus +to +together +too +took +toward +towards +tried +tries +truly +try +trying +twice +two +under +unfortunately +unless +unlikely +until +unto +up +upon +us +use +used +useful +uses +using +usually +uucp +value +various +very +via +viz +vs +want +wants +was +wasn't +way +we +we'd +we'll +we're +we've +welcome +well +went +were +weren't +what +what's +whatever +when +whence +whenever +where +where's +whereafter +whereas +whereby +wherein +whereupon +wherever +whether +which +while +whither +who +who's +whoever +whole +whom +whose +why +will +willing +wish +with +within +without +won't +wonder +would +wouldn't +yes +yet +you +you'd +you'll +you're +you've +your +yours +yourself +yourselves +zero diff --git a/src/main/resources/com/gravity/goose/text/stopwords-es.txt b/src/main/resources/com/gravity/goose/text/stopwords-es.txt index f562e4bba..3aae76b23 100644 --- a/src/main/resources/com/gravity/goose/text/stopwords-es.txt +++ b/src/main/resources/com/gravity/goose/text/stopwords-es.txt @@ -1,310 +1,310 @@ -de -la -que -el -en -y -a -los -del -se -las -por -un -para -con -no -una -su -al -lo -como -más -pero -sus -le -ya -o -este -sí -porque -esta -entre -cuando -muy -sin -sobre -también -me -hasta -hay -donde -quien -desde -todo -nos -durante -todos -uno -les -ni -contra -otros -ese -eso -ante -ellos -e -esto -mí -antes -algunos -qué -unos -yo -otro -otras -otra -él -tanto -esa -estos -mucho -quienes -nada -muchos -cual -poco -ella -estar -estas -algunas -algo -nosotros -mi -mis -tú -te -ti -tu -tus -ellas -nosotras -vosotros -vosotras -os -mío -mía -míos -mías -tuyo -tuya -tuyos -tuyas -suyo -suya -suyos -suyas -nuestro -nuestra -nuestros -nuestras -vuestro -vuestra -vuestros -vuestras -esos -esas -estoy -estás -está -estamos -estáis -están -esté -estés -estemos -estéis -estén -estaré -estarás -estará -estaremos -estaréis -estarán -estaría -estarías -estaríamos -estaríais -estarían -estaba -estabas -estábamos -estabais -estaban -estuve -estuviste -estuvo -estuvimos -estuvisteis -estuvieron -estuviera -estuvieras -estuviéramos -estuvierais -estuvieran -estuviese -estuvieses -estuviésemos -estuvieseis -estuviesen -estando -estado -estada -estados -estadas -estad -he -has -ha -hemos -habéis -han -haya -hayas -hayamos -hayáis -hayan -habré -habrás -habrá -habremos -habréis -habrán -habría -habrías -habríamos -habríais -habrían -había -habías -habíamos -habíais -habían -hube -hubiste -hubo -hubimos -hubisteis -hubieron -hubiera -hubieras -hubiéramos -hubierais -hubieran -hubiese -hubieses -hubiésemos -hubieseis -hubiesen -habiendo -habido -habida -habidos -habidas - -# forms of ser, to be (not including the infinitive): -soy -eres -es -somos -sois -son -sea -seas -seamos -seáis -sean -seré -serás -será -seremos -seréis -serán -sería -serías -seríamos -seríais -serían -era -eras -éramos -erais -eran -fui -fuiste -fue -fuimos -fuisteis -fueron -fuera -fueras -fuéramos -fuerais -fueran -fuese -fueses -fuésemos -fueseis -fuesen -siendo -sido -tengo -tienes -tiene -tenemos -tenéis -tienen -tenga -tengas -tengamos -tengáis -tengan -tendré -tendrás -tendrá -tendremos -tendréis -tendrán -tendría -tendrías -tendríamos -tendríais -tendrían -tenía -tenías -teníamos -teníais -tenían -tuve -tuviste -tuvo -tuvimos -tuvisteis -tuvieron -tuviera -tuvieras -tuviéramos -tuvierais -tuvieran -tuviese -tuvieses -tuviésemos -tuvieseis -tuviesen -teniendo -tenido -tenida -tenidos -tenidas -tened + +# forms of ser, to be (not including the infinitive): +a +al +algo +algunas +algunos +ante +antes +como +con +contra +cual +cuando +de +del +desde +donde +durante +e +el +ella +ellas +ellos +en +entre +era +erais +eran +eras +eres +es +esa +esas +ese +eso +esos +esta +estaba +estabais +estaban +estabas +estad +estada +estadas +estado +estados +estamos +estando +estar +estaremos +estará +estarán +estarás +estaré +estaréis +estaría +estaríais +estaríamos +estarían +estarías +estas +este +estemos +esto +estos +estoy +estuve +estuviera +estuvierais +estuvieran +estuvieras +estuvieron +estuviese +estuvieseis +estuviesen +estuvieses +estuvimos +estuviste +estuvisteis +estuviéramos +estuviésemos +estuvo +está +estábamos +estáis +están +estás +esté +estéis +estén +estés +fue +fuera +fuerais +fueran +fueras +fueron +fuese +fueseis +fuesen +fueses +fui +fuimos +fuiste +fuisteis +fuéramos +fuésemos +ha +habida +habidas +habido +habidos +habiendo +habremos +habrá +habrán +habrás +habré +habréis +habría +habríais +habríamos +habrían +habrías +habéis +había +habíais +habíamos +habían +habías +han +has +hasta +hay +haya +hayamos +hayan +hayas +hayáis +he +hemos +hube +hubiera +hubierais +hubieran +hubieras +hubieron +hubiese +hubieseis +hubiesen +hubieses +hubimos +hubiste +hubisteis +hubiéramos +hubiésemos +hubo +la +las +le +les +lo +los +me +mi +mis +mucho +muchos +muy +más +mí +mía +mías +mío +míos +nada +ni +no +nos +nosotras +nosotros +nuestra +nuestras +nuestro +nuestros +o +os +otra +otras +otro +otros +para +pero +poco +por +porque +que +quien +quienes +qué +se +sea +seamos +sean +seas +seremos +será +serán +serás +seré +seréis +sería +seríais +seríamos +serían +serías +seáis +sido +siendo +sin +sobre +sois +somos +son +soy +su +sus +suya +suyas +suyo +suyos +sí +también +tanto +te +tendremos +tendrá +tendrán +tendrás +tendré +tendréis +tendría +tendríais +tendríamos +tendrían +tendrías +tened +tenemos +tenga +tengamos +tengan +tengas +tengo +tengáis +tenida +tenidas +tenido +tenidos +teniendo +tenéis +tenía +teníais +teníamos +tenían +tenías +ti +tiene +tienen +tienes +todo +todos +tu +tus +tuve +tuviera +tuvierais +tuvieran +tuvieras +tuvieron +tuviese +tuvieseis +tuviesen +tuvieses +tuvimos +tuviste +tuvisteis +tuviéramos +tuviésemos +tuvo +tuya +tuyas +tuyo +tuyos +tú +un +una +uno +unos +vosotras +vosotros +vuestra +vuestras +vuestro +vuestros +y +ya +yo +él +éramos diff --git a/src/main/resources/com/gravity/goose/text/stopwords-fr.txt b/src/main/resources/com/gravity/goose/text/stopwords-fr.txt index 30e06ef28..13fae674b 100644 --- a/src/main/resources/com/gravity/goose/text/stopwords-fr.txt +++ b/src/main/resources/com/gravity/goose/text/stopwords-fr.txt @@ -1,220 +1,163 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (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.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -#----------------------------------------------------------------------- -# a couple of test stopwords to test that the words are really being -# configured from this file: -stopworda -stopwordb - -#Standard english stop words taken from Lucene's StopAnalyzer -a -an -and -are -as -at -be -but -by -for -if -in -into -is -it -no -not -of -on -or -s -such -t -that -the -their -then -there -these -they -this -to -was -will -with -au -aux -avec -ce -ces -dans -de -des -du -elle -en -et -eux -il -je -la -le -leur -lui -ma -mais -me -même -mes -moi -mon -ne -nos -notre -nous -on -ou -par -pas -pour -qu -que -qui -sa -se -ses -son -sur -ta -te -tes -toi -ton -tu -un -une -vos -votre -vous -c -d -j -l -à -m -n -s -t -y -été -étée -étées -étés -étant -suis -es -est -sommes -êtes -sont -serai -seras -sera -serons -serez -seront -serais -serait -serions -seriez -seraient -étais -était -étions -étiez -étaient -fus -fut -fûmes -fûtes -furent -sois -soit -soyons -soyez -soient -fusse -fusses -fût -fussions -fussiez -fussent -ayant -eu -eue -eues -eus -ai -as -avons -avez -ont -aurai -auras -aura -aurons -aurez -auront -aurais -aurait -aurions -auriez -auraient -avais -avait -avions -aviez -avaient -eut -eûmes -eûtes -eurent -aie -aies -ait -ayons -ayez -aient -eusse -eusses -eût -eussions -eussiez -eussent -ceci -celà -cet -cette -ici -ils -les -leurs -quel -quels -quelle -quelles -sans -soi +ai +aie +aient +aies +ait +as +au +aura +aurai +auraient +aurais +aurait +auras +aurez +auriez +aurions +aurons +auront +aux +avaient +avais +avait +avec +avez +aviez +avions +avons +ayant +ayez +ayons +c +ce +ceci +celà +ces +cet +cette +d +dans +de +des +du +elle +en +es +est +et +eu +eue +eues +eurent +eus +eusse +eussent +eusses +eussiez +eussions +eut +eux +eûmes +eût +eûtes +furent +fus +fusse +fussent +fusses +fussiez +fussions +fut +fûmes +fût +fûtes +ici +il +ils +j +je +l +la +le +les +leur +leurs +lui +m +ma +mais +me +mes +moi +mon +même +n +ne +nos +notre +nous +on +ont +ou +par +pas +pour +qu +que +quel +quelle +quelles +quels +qui +s +sa +sans +se +sera +serai +seraient +serais +serait +seras +serez +seriez +serions +serons +seront +ses +soi +soient +sois +soit +sommes +son +sont +soyez +soyons +suis +sur +t +ta +te +tes +toi +ton +tu +un +une +vos +votre +vous +y +à +étaient +étais +était +étant +étiez +étions +été +étée +étées +étés +êtes diff --git a/src/main/resources/com/gravity/goose/text/stopwords-it.txt b/src/main/resources/com/gravity/goose/text/stopwords-it.txt index 98ffee1d6..c14afeb9f 100644 --- a/src/main/resources/com/gravity/goose/text/stopwords-it.txt +++ b/src/main/resources/com/gravity/goose/text/stopwords-it.txt @@ -1,287 +1,412 @@ -ad -al -allo -ai -agli -all -agl -alla -alle -con -col -coi -da -dal -dallo -dai -dagli -dall -dagl -dalla -dalle -di -del -dello -dei -degli -dell -degl -della -delle -in -nel -nello -nei -negli -nell -negl -nella -nelle -su -sul -sullo -sui -sugli -sull -sugl -sulla -sulle -per -tra -contro -io -tu -lui -lei -noi -voi -loro -mio -mia -miei -mie -tuo -tua -tuoi -tue -suo -sua -suoi -sue -nostro -nostra -nostri -nostre -vostro -vostra -vostri -vostre -mi -ti -ci -vi -lo -la -li -le -gli -ne -il -un -uno -una -ma -ed -se -perchè -perché -perche -anche -come -dov -dove -che -chi -cui -non -più -piu -quale -quanto -quanti -quanta -quante -quello -quelli -quella -quelle -questo -questi -questa -queste -si -tutto -tutti -a -c -e -i -l -o -ho -hai -ha -abbiamo -avete -hanno -abbia -abbiate -abbiano -avrò -avro -avrai -avrà -avra -avremo -avrete -avranno -avrei -avresti -avrebbe -avremmo -avreste -avrebbero -avevo -avevi -aveva -avevamo -avevate -avevano -ebbi -avesti -ebbe -avemmo -aveste -ebbero -avessi -avesse -avessimo -avessero -avendo -avuto -avuta -avuti -avute -sono -sei -è -é -e -siamo -siete -sia -siate -siano -sarà -sarai -sarò -saro -saremo -sarete -saranno -sarei -saresti -sarebbe -saremmo -sareste -sarebbero -ero -eri -era -eravamo -eravate -erano -fui -fosti -fu -fummo -foste -furono -fossi -fosse -fossimo -fossero -essendo -faccio -fai -facciamo -fanno -faccia -facciate -facciano -farà -farai -farò -faremo -farete -faranno -farei -faresti -farebbe -faremmo -fareste -farebbero -facevo -facevi -faceva -facevamo -facevate -facevano -feci -facesti -fece -facemmo -faceste -fecero -facessi -facesse -facessimo -facessero -facendo -sto -stai -sta -stiamo -stanno -stia -stiate -stiano -starà -starai -starò -staremo -starete -staranno -starei -staresti -starebbe -staremmo -stareste -starebbero -stavo -stavi -stava -stavamo -stavate -stavano -stetti -stesti -stette -stemmo -steste -stettero -stessi -stesse -stessimo -stessero -stando +a +a +abbia +abbiamo +abbiano +abbiate +ad +agl +agl +agli +agli +ai +ai +al +al +all +all +alla +alla +alle +alle +allo +allo +anche +anche +avemmo +avendo +avesse +avessero +avessi +avessimo +aveste +avesti +avete +aveva +avevamo +avevano +avevate +avevi +avevo +avra +avrai +avranno +avrebbe +avrebbero +avrei +avremmo +avremo +avreste +avresti +avrete +avro +avrà +avrò +avuta +avute +avuti +avuto +c +c +che +che +chi +chi +ci +ci +coi +coi +col +col +come +come +con +con +contro +contro +cui +cui +da +da +dagl +dagl +dagli +dagli +dai +dai +dal +dal +dall +dall +dalla +dalla +dalle +dalle +dallo +dallo +degl +degl +degli +degli +dei +dei +del +del +dell +dell +della +della +delle +delle +dello +dello +di +di +dov +dov +dove +dove +e +e +ebbe +ebbero +ebbi +ed +ed +era +erano +eravamo +eravate +eri +ero +essendo +faccia +facciamo +facciano +facciate +faccio +facemmo +facendo +facesse +facessero +facessi +facessimo +faceste +facesti +faceva +facevamo +facevano +facevate +facevi +facevo +fai +fanno +farai +faranno +farebbe +farebbero +farei +faremmo +faremo +fareste +faresti +farete +farà +farò +fece +fecero +feci +fosse +fossero +fossi +fossimo +foste +fosti +fu +fui +fummo +furono +gli +gli +ha +hai +hanno +ho +i +i +il +il +in +in +io +io +l +l +la +la +le +le +lei +lei +li +li +lo +lo +loro +loro +lui +lui +ma +ma +mi +mi +mia +mia +mie +mie +miei +miei +mio +mio +ne +ne +negl +negl +negli +negli +nei +nei +nel +nel +nell +nell +nella +nella +nelle +nelle +nello +nello +noi +noi +non +non +nostra +nostra +nostre +nostre +nostri +nostri +nostro +nostro +o +o +per +per +perche +perchè +perché +piu +più +più +quale +quale +quanta +quanta +quante +quante +quanti +quanti +quanto +quanto +quella +quella +quelle +quelle +quelli +quelli +quello +quello +questa +questa +queste +queste +questi +questi +questo +questo +sarai +saranno +sarebbe +sarebbero +sarei +saremmo +saremo +sareste +saresti +sarete +saro +sarà +sarò +se +se +sei +si +si +sia +siamo +siano +siate +siete +sono +sta +stai +stando +stanno +starai +staranno +starebbe +starebbero +starei +staremmo +staremo +stareste +staresti +starete +starà +starò +stava +stavamo +stavano +stavate +stavi +stavo +stemmo +stesse +stessero +stessi +stessimo +steste +stesti +stette +stettero +stetti +stia +stiamo +stiano +stiate +sto +su +su +sua +sua +sue +sue +sugl +sugl +sugli +sugli +sui +sui +sul +sul +sull +sull +sulla +sulla +sulle +sulle +sullo +sullo +suo +suo +suoi +suoi +ti +ti +tra +tra +tu +tu +tua +tua +tue +tue +tuo +tuo +tuoi +tuoi +tutti +tutti +tutto +tutto +un +un +una +una +uno +uno +vi +vi +voi +voi +vostra +vostra +vostre +vostre +vostri +vostri +vostro +vostro +è +é +ad diff --git a/src/main/resources/com/gravity/goose/text/stopwords-ko.txt b/src/main/resources/com/gravity/goose/text/stopwords-ko.txt index a6746f776..78bd35e1c 100644 --- a/src/main/resources/com/gravity/goose/text/stopwords-ko.txt +++ b/src/main/resources/com/gravity/goose/text/stopwords-ko.txt @@ -1,70 +1,70 @@ -을 -의 -에 -이 -를 -으로 -은 -는 -가 -로 -하고 -과 -에서 -도 -와 -이다 -고 -부터 -까지 -께 -에는 -이라고 -만 -라고 -보다 -에도 -다 -토록 -에게 -나 -대로 -에서는 -이나 -이며 -요 -든 -으로써 -같이 -로는 -밖에 -과의 -며 -로부터 -처럼 -아 -라 -여 -으로는 -이고 -에서의 -이라는 -만에 -으로부터 -에서도 -와의 -엔 -만을 -부터는 -만의 -야 -까지의 -과는 -치고 -과를 -으로의 -까지는 -보다는 -만이 -에만 -로의 \ No newline at end of file +가 +같이 +고 +과 +과는 +과를 +과의 +까지 +까지는 +까지의 +께 +나 +는 +다 +대로 +도 +든 +라 +라고 +로 +로는 +로부터 +로의 +를 +만 +만에 +만을 +만의 +만이 +며 +밖에 +보다 +보다는 +부터 +부터는 +아 +야 +에 +에게 +에는 +에도 +에만 +에서 +에서는 +에서도 +에서의 +엔 +여 +와 +와의 +요 +으로 +으로는 +으로부터 +으로써 +으로의 +은 +을 +의 +이 +이고 +이나 +이다 +이라고 +이라는 +이며 +처럼 +치고 +토록 +하고 diff --git a/src/main/resources/com/gravity/goose/text/stopwords-pt.txt b/src/main/resources/com/gravity/goose/text/stopwords-pt.txt index 66d557f9c..4e0189552 100644 --- a/src/main/resources/com/gravity/goose/text/stopwords-pt.txt +++ b/src/main/resources/com/gravity/goose/text/stopwords-pt.txt @@ -1,147 +1,295 @@ -último -é -acerca -agora -algmas -alguns -ali -ambos -antes -apontar -aquela -aquelas -aquele -aqueles -aqui -atrás -bem -bom -cada -caminho -cima -com -como -comprido -conhecido -corrente -das -debaixo -dentro -desde -desligado -deve -devem -deverá -direita -diz -dizer -dois -dos -e -ela -ele -eles -em -enquanto -então -está -estão -estado -estar -estará -este -estes -esteve -estive -estivemos -estiveram -eu -fará -faz -fazer -fazia -fez -fim -foi -fora -horas -iniciar -inicio -ir -irá -ista -iste -isto -ligado -maioria -maiorias -mais -mas -mesmo -meu -muito -muitos -nós -não -nome -nosso -novo -o -onde -os -ou -outro -para -parte -pegar -pelo -pessoas -pode -poderá -podia -por -porque -povo -promeiro -quê -qual -qualquer -quando -quem -quieto -são -saber -sem -ser -seu -somente -têm -tal -também -tem -tempo -tenho -tentar -tentaram -tente -tentei -teu -teve -tipo -tive -todos -trabalhar -trabalho -tu -um -uma -umas -uns -usa -usar -valor -veja -ver -verdade -verdadeiro -você +a +acerca +agora +algmas +alguns +ali +ambos +antes +ao +aos +apontar +aquela +aquelas +aquele +aqueles +aqui +aquilo +as +atrás +até +bem +bom +cada +caminho +cima +com +como +comprido +conhecido +corrente +da +das +de +debaixo +dela +delas +dele +deles +dentro +depois +desde +desligado +deve +devem +deverá +direita +diz +dizer +do +dois +dos +e +ela +elas +ele +eles +em +enquanto +entre +então +era +eram +essa +essas +esse +esses +esta +estado +estamos +estar +estará +estas +estava +estavam +este +esteja +estejam +estejamos +estes +esteve +estive +estivemos +estiver +estivera +estiveram +estiverem +estivermos +estivesse +estivessem +estivéramos +estivéssemos +estou +está +estávamos +estão +eu +fará +faz +fazer +fazia +fez +fim +foi +fomos +for +fora +foram +forem +formos +fosse +fossem +fui +fôramos +fôssemos +haja +hajam +hajamos +havemos +hei +horas +houve +houvemos +houver +houvera +houveram +houverei +houverem +houveremos +houveria +houveriam +houvermos +houverá +houverão +houveríamos +houvesse +houvessem +houvéramos +houvéssemos +há +hão +iniciar +inicio +ir +irá +isso +ista +iste +isto +já +lhe +lhes +ligado +maioria +maiorias +mais +mas +me +mesmo +meu +meus +minha +minhas +muito +muitos +na +nas +nem +no +nome +nos +nossa +nossas +nosso +nossos +novo +num +numa +não +nós +o +onde +os +ou +outro +para +parte +pegar +pela +pelas +pelo +pelos +pessoas +pode +poderá +podia +por +porque +povo +promeiro +qual +qualquer +quando +que +quem +quieto +quê +saber +se +seja +sejam +sejamos +sem +ser +serei +seremos +seria +seriam +será +serão +seríamos +seu +seus +somente +somos +sou +sua +suas +são +só +tal +também +te +tem +temos +tempo +tenha +tenham +tenhamos +tenho +tentar +tentaram +tente +tentei +terei +teremos +teria +teriam +terá +terão +teríamos +teu +teus +teve +tinha +tinham +tipo +tive +tivemos +tiver +tivera +tiveram +tiverem +tivermos +tivesse +tivessem +tivéramos +tivéssemos +todos +trabalhar +trabalho +tu +tua +tuas +tém +têm +tínhamos +um +uma +umas +uns +usa +usar +valor +veja +ver +verdade +verdadeiro +você +vocês +vos +à +às +é +éramos +último diff --git a/src/main/resources/com/gravity/goose/text/stopwords-ro.txt b/src/main/resources/com/gravity/goose/text/stopwords-ro.txt new file mode 100644 index 000000000..52001f744 --- /dev/null +++ b/src/main/resources/com/gravity/goose/text/stopwords-ro.txt @@ -0,0 +1,246 @@ +a +abia +acea +aceasta +aceea +aceeasi +aceia +acel +acela +acelasi +acelea +acest +acesta +aceste +acestea +acestei +acestia +acestui +acolo +acum +adica +ai +aia +aici +aiurea +al +ala +alaturi +ale +alt +alta +altceva +alte +altfel +alti +altii +altul +am +anume +apoi +ar +are +as +asa +asemenea +asta +astazi +astfel +asupra +atare +ati +atit +atita +atitea +atitia +atunci +au +avea +avem +avut +azi +b +ba +bine +c +ca +cam +capat +care +careia +carora +caruia +catre +ce +cea +ceea +cei +ceilalti +cel +cele +celor +ceva +chiar +ci +cind +cine +cineva +cit +cita +cite +citeva +citi +citiva +conform +cu +cui +cum +cumva +d +da +daca +dar +dat +de +deasupra +deci +decit +degraba +deja +desi +despre +din +dintr +dintre +doar +dupa +e +ea +ei +el +ele +era +este +eu +exact +f +face +fara +fata +fel +fi +fie +foarte +fost +g +geaba +h +i +ia +iar +ii +il +imi +in +inainte +inapoi +inca +incit +insa +intr +intre +isi +iti +j +k +l +la +le +li +lor +lui +m +ma +mai +mare +mi +mod +mult +multa +multe +multi +n +ne +ni +nici +niciodata +nimeni +nimic +niste +noi +nostri +nou +noua +nu +numai +o +or +ori +orice +oricum +p +pai +parca +pe +pentru +peste +pina +plus +prea +prin +putini +r +s +sa +sai +sale +sau +se +si +sint +sintem +spre +sub +sus +t +te +ti +toata +toate +tocmai +tot +toti +totul +totusi +tu +tuturor +u +un +una +unde +unei +unele +uneori +unii +unor +unui +unul +v +va +voi +vom +vor +vreo +vreun +x +z From 2495bba11cef655b7680531ea3697fb0f880b3ba Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Thu, 10 Jul 2014 11:14:47 +0300 Subject: [PATCH 286/347] integrate cassandra --- build.sbt | 4 +++ pom.xml | 33 +++++++++---------- .../com/gravity/goose/TalkToMeGoose.scala | 28 ++++++++-------- 3 files changed, 34 insertions(+), 31 deletions(-) diff --git a/build.sbt b/build.sbt index d533ec55c..7f7f6bfdd 100644 --- a/build.sbt +++ b/build.sbt @@ -50,6 +50,10 @@ libraryDependencies ++= { ,"org.jsoup" % "jsoup" % "1.7.3" ,"com.chenlb.mmseg4j" % "mmseg4j-core" % "1.9.1" ,"com.googlecode.juniversalchardet" % "juniversalchardet" % "1.0.3" + //add cassandra + ,"com.netflix.astyanax" % "astyanax-core" % "1.56.43" + ,"com.netflix.astyanax" % "astyanax-thrift" % "1.56.43" + ,"com.netflix.astyanax" % "astyanax-cassandra" % "1.56.43" //tests ,"junit" % "junit" % "4.11" % "test" ,"org.scalatest" %% "scalatest" % "2.1.6" % "test" diff --git a/pom.xml b/pom.xml index 65540e20b..9684734d0 100644 --- a/pom.xml +++ b/pom.xml @@ -138,23 +138,22 @@ Goose was originally an article extractor written in Java that has most recently <version>1.7.6</version> <scope>test</scope> </dependency> -<!-- - <dependency> - <groupId>com.netflix.astyanax</groupId> - <artifactId>astyanax-core</artifactId> - <version>1.56.43</version> - </dependency> - <dependency> - <groupId>com.netflix.astyanax</groupId> - <artifactId>astyanax-thrift</artifactId> - <version>1.56.43</version> - </dependency> - <dependency> - <groupId>com.netflix.astyanax</groupId> - <artifactId>astyanax-cassandra</artifactId> - <version>1.56.43</version> - </dependency> ---> </dependencies> + <dependency> + <groupId>com.netflix.astyanax</groupId> + <artifactId>astyanax-core</artifactId> + <version>1.56.43</version> + </dependency> + <dependency> + <groupId>com.netflix.astyanax</groupId> + <artifactId>astyanax-thrift</artifactId> + <version>1.56.43</version> + </dependency> + <dependency> + <groupId>com.netflix.astyanax</groupId> + <artifactId>astyanax-cassandra</artifactId> + <version>1.56.43</version> + </dependency> + </dependencies> <!-- Hey... since we're open source, let's compile the source and javadocs into jars as well --> <build> <defaultGoal>package</defaultGoal> diff --git a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala index a18da0096..a33acf32e 100644 --- a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala +++ b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala @@ -3,20 +3,6 @@ package com.gravity.goose import java.io._ import scala.collection.JavaConversions._ import scala.io.Source -import com.netflix.astyanax.AstyanaxContext -import com.netflix.astyanax.Keyspace -import com.netflix.astyanax.MutationBatch -import com.netflix.astyanax.connectionpool.NodeDiscoveryType -import com.netflix.astyanax.connectionpool.OperationResult -import com.netflix.astyanax.connectionpool.impl.ConnectionPoolConfigurationImpl -import com.netflix.astyanax.connectionpool.impl.CountingConnectionPoolMonitor -import com.netflix.astyanax.impl.AstyanaxConfigurationImpl -import com.netflix.astyanax.model.ColumnFamily -import com.netflix.astyanax.model.Row -import com.netflix.astyanax.serializers.StringSerializer -import com.netflix.astyanax.serializers.StringSerializer -import com.netflix.astyanax.thrift.ThriftFamilyFactory -import com.netflix.astyanax.util.RangeBuilder object TalkToMeGoose { @@ -65,6 +51,20 @@ object TalkToMeGoose { */ def mainCasandra(args: Array[String]) { +import com.netflix.astyanax.AstyanaxContext +import com.netflix.astyanax.Keyspace +import com.netflix.astyanax.MutationBatch +import com.netflix.astyanax.connectionpool.NodeDiscoveryType +import com.netflix.astyanax.connectionpool.OperationResult +import com.netflix.astyanax.connectionpool.impl.ConnectionPoolConfigurationImpl +import com.netflix.astyanax.connectionpool.impl.CountingConnectionPoolMonitor +import com.netflix.astyanax.impl.AstyanaxConfigurationImpl +import com.netflix.astyanax.model.ColumnFamily +import com.netflix.astyanax.model.Row +import com.netflix.astyanax.serializers.StringSerializer +import com.netflix.astyanax.serializers.StringSerializer +import com.netflix.astyanax.thrift.ThriftFamilyFactory +import com.netflix.astyanax.util.RangeBuilder val keyspace_name: String = args(0) val column_family_name: String = args(1) val context = new AstyanaxContext.Builder() From 4a797d6cb06f6bb80327af1c3f282ef7eb6689f0 Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Thu, 10 Jul 2014 11:16:39 +0300 Subject: [PATCH 287/347] - create different main --- .../com/gravity/goose/TalkToMeGoose.scala | 104 ----------------- .../goose/TalkToMeGooseAndCassandra.scala | 109 ++++++++++++++++++ 2 files changed, 109 insertions(+), 104 deletions(-) create mode 100644 src/main/scala/com/gravity/goose/TalkToMeGooseAndCassandra.scala diff --git a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala index a33acf32e..fc20bdc96 100644 --- a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala +++ b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala @@ -37,108 +37,4 @@ object TalkToMeGoose { } } } - - - - - /** - * Run Goose on a Cassandra keyspace column_family. Iterates over each key - * in the keyspace's column_family, uses that key as a URL to extract - * content from, and updates the row corresponding to that key with the - * content. - * mvn compile - * mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="keyspace column_family" - */ - - def mainCasandra(args: Array[String]) { -import com.netflix.astyanax.AstyanaxContext -import com.netflix.astyanax.Keyspace -import com.netflix.astyanax.MutationBatch -import com.netflix.astyanax.connectionpool.NodeDiscoveryType -import com.netflix.astyanax.connectionpool.OperationResult -import com.netflix.astyanax.connectionpool.impl.ConnectionPoolConfigurationImpl -import com.netflix.astyanax.connectionpool.impl.CountingConnectionPoolMonitor -import com.netflix.astyanax.impl.AstyanaxConfigurationImpl -import com.netflix.astyanax.model.ColumnFamily -import com.netflix.astyanax.model.Row -import com.netflix.astyanax.serializers.StringSerializer -import com.netflix.astyanax.serializers.StringSerializer -import com.netflix.astyanax.thrift.ThriftFamilyFactory -import com.netflix.astyanax.util.RangeBuilder - val keyspace_name: String = args(0) - val column_family_name: String = args(1) - val context = new AstyanaxContext.Builder() - .forCluster("Cluster") - .forKeyspace(keyspace_name) - .withAstyanaxConfiguration(new AstyanaxConfigurationImpl() - .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE) - .setTargetCassandraVersion("1.2") - ) - .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool") - .setPort(9160) - .setMaxConnsPerHost(1) - .setSeeds("127.0.0.1:9160") - ) - .withConnectionPoolMonitor(new CountingConnectionPoolMonitor()) - .buildKeyspace(ThriftFamilyFactory.getInstance()) - - context.start() - - val keyspace = context.getEntity() - val column_family = ColumnFamily.newColumnFamily( - column_family_name, - StringSerializer.get(), - StringSerializer.get()) - - val url_list = keyspace.prepareQuery(column_family) - .getAllRows() - .withColumnSlice(List("lastc", "lastv")) - .execute().getResult() - val mutation_batch = keyspace.prepareMutationBatch() - - var url = "" - var lastc = "" - var lastv = "" - var article = "" - var timestamp = "" - - val config: Configuration = new Configuration - config.enableImageFetching = false - val goose = new Goose(config) - - for (url_row <- url_list) { - url = url_row.getKey() - lastc = url_row.getColumns().getStringValue("lastc", "") - lastv = url_row.getColumns().getStringValue("lastv", "") - - try { - val gec = goose.extractContent(url) - article = gec.cleanedArticleText - timestamp = System.currentTimeMillis.toString - - if (article == "") { - article = gec.rawHtml - } - - if (article == lastc) { - mutation_batch.withRow(column_family, url) - .putColumn(timestamp, lastv) - } else { - lastv = "v" + (lastv.replace("v", "").toInt + 1) - mutation_batch.withRow(column_family, url) - .putColumn("lastc", article) - .putColumn("lastv", lastv) - .putColumn(lastv, article) - .putColumn(timestamp, lastv) - } - - mutation_batch.execute() - System.out.println("Extracted content from " + url) - } catch { - case e: Exception => { - System.out.println(url + " is not a valid URL: " + e.toString) - } - } - } - } } diff --git a/src/main/scala/com/gravity/goose/TalkToMeGooseAndCassandra.scala b/src/main/scala/com/gravity/goose/TalkToMeGooseAndCassandra.scala new file mode 100644 index 000000000..b833211f9 --- /dev/null +++ b/src/main/scala/com/gravity/goose/TalkToMeGooseAndCassandra.scala @@ -0,0 +1,109 @@ +package com.gravity.goose + +import java.io._ +import scala.collection.JavaConversions._ +import scala.io.Source + + +object TalkToMeGooseAndCassandra { + /** + * Run Goose on a Cassandra keyspace column_family. Iterates over each key + * in the keyspace's column_family, uses that key as a URL to extract + * content from, and updates the row corresponding to that key with the + * content. + * mvn compile + * mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="keyspace column_family" + */ + + def main(args: Array[String]) { +import com.netflix.astyanax.AstyanaxContext +import com.netflix.astyanax.Keyspace +import com.netflix.astyanax.MutationBatch +import com.netflix.astyanax.connectionpool.NodeDiscoveryType +import com.netflix.astyanax.connectionpool.OperationResult +import com.netflix.astyanax.connectionpool.impl.ConnectionPoolConfigurationImpl +import com.netflix.astyanax.connectionpool.impl.CountingConnectionPoolMonitor +import com.netflix.astyanax.impl.AstyanaxConfigurationImpl +import com.netflix.astyanax.model.ColumnFamily +import com.netflix.astyanax.model.Row +import com.netflix.astyanax.serializers.StringSerializer +import com.netflix.astyanax.serializers.StringSerializer +import com.netflix.astyanax.thrift.ThriftFamilyFactory +import com.netflix.astyanax.util.RangeBuilder + val keyspace_name: String = args(0) + val column_family_name: String = args(1) + val context = new AstyanaxContext.Builder() + .forCluster("Cluster") + .forKeyspace(keyspace_name) + .withAstyanaxConfiguration(new AstyanaxConfigurationImpl() + .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE) + .setTargetCassandraVersion("1.2") + ) + .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool") + .setPort(9160) + .setMaxConnsPerHost(1) + .setSeeds("127.0.0.1:9160") + ) + .withConnectionPoolMonitor(new CountingConnectionPoolMonitor()) + .buildKeyspace(ThriftFamilyFactory.getInstance()) + + context.start() + + val keyspace = context.getEntity() + val column_family = ColumnFamily.newColumnFamily( + column_family_name, + StringSerializer.get(), + StringSerializer.get()) + + val url_list = keyspace.prepareQuery(column_family) + .getAllRows() + .withColumnSlice(List("lastc", "lastv")) + .execute().getResult() + val mutation_batch = keyspace.prepareMutationBatch() + + var url = "" + var lastc = "" + var lastv = "" + var article = "" + var timestamp = "" + + val config: Configuration = new Configuration + config.enableImageFetching = false + val goose = new Goose(config) + + for (url_row <- url_list) { + url = url_row.getKey() + lastc = url_row.getColumns().getStringValue("lastc", "") + lastv = url_row.getColumns().getStringValue("lastv", "") + + try { + val gec = goose.extractContent(url) + article = gec.cleanedArticleText + timestamp = System.currentTimeMillis.toString + + if (article == "") { + article = gec.rawHtml + } + + if (article == lastc) { + mutation_batch.withRow(column_family, url) + .putColumn(timestamp, lastv) + } else { + lastv = "v" + (lastv.replace("v", "").toInt + 1) + mutation_batch.withRow(column_family, url) + .putColumn("lastc", article) + .putColumn("lastv", lastv) + .putColumn(lastv, article) + .putColumn(timestamp, lastv) + } + + mutation_batch.execute() + System.out.println("Extracted content from " + url) + } catch { + case e: Exception => { + System.out.println(url + " is not a valid URL: " + e.toString) + } + } + } + } +} From d335ef7099fe41ea3f74df89a5b1b2f198742932 Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Thu, 10 Jul 2014 11:19:00 +0300 Subject: [PATCH 288/347] - comment out cassandra as it introduces too many dependencies to be always kept in trunk code --- build.sbt | 6 +++--- pom.xml | 2 ++ .../scala/com/gravity/goose/TalkToMeGooseAndCassandra.scala | 3 +++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/build.sbt b/build.sbt index 7f7f6bfdd..ed2086ad0 100644 --- a/build.sbt +++ b/build.sbt @@ -51,9 +51,9 @@ libraryDependencies ++= { ,"com.chenlb.mmseg4j" % "mmseg4j-core" % "1.9.1" ,"com.googlecode.juniversalchardet" % "juniversalchardet" % "1.0.3" //add cassandra - ,"com.netflix.astyanax" % "astyanax-core" % "1.56.43" - ,"com.netflix.astyanax" % "astyanax-thrift" % "1.56.43" - ,"com.netflix.astyanax" % "astyanax-cassandra" % "1.56.43" + //,"com.netflix.astyanax" % "astyanax-core" % "1.56.43" + //,"com.netflix.astyanax" % "astyanax-thrift" % "1.56.43" + //,"com.netflix.astyanax" % "astyanax-cassandra" % "1.56.43" //tests ,"junit" % "junit" % "4.11" % "test" ,"org.scalatest" %% "scalatest" % "2.1.6" % "test" diff --git a/pom.xml b/pom.xml index 9684734d0..844d50232 100644 --- a/pom.xml +++ b/pom.xml @@ -138,6 +138,7 @@ Goose was originally an article extractor written in Java that has most recently <version>1.7.6</version> <scope>test</scope> </dependency> + <!-- add cassandra <dependency> <groupId>com.netflix.astyanax</groupId> <artifactId>astyanax-core</artifactId> @@ -153,6 +154,7 @@ Goose was originally an article extractor written in Java that has most recently <artifactId>astyanax-cassandra</artifactId> <version>1.56.43</version> </dependency> + --> </dependencies> <!-- Hey... since we're open source, let's compile the source and javadocs into jars as well --> <build> diff --git a/src/main/scala/com/gravity/goose/TalkToMeGooseAndCassandra.scala b/src/main/scala/com/gravity/goose/TalkToMeGooseAndCassandra.scala index b833211f9..c69bd78ed 100644 --- a/src/main/scala/com/gravity/goose/TalkToMeGooseAndCassandra.scala +++ b/src/main/scala/com/gravity/goose/TalkToMeGooseAndCassandra.scala @@ -16,6 +16,8 @@ object TalkToMeGooseAndCassandra { */ def main(args: Array[String]) { + println("for cassandra uncomment this and dependencies in build.sbt and/or pom.xml") + /* import com.netflix.astyanax.AstyanaxContext import com.netflix.astyanax.Keyspace import com.netflix.astyanax.MutationBatch @@ -105,5 +107,6 @@ import com.netflix.astyanax.util.RangeBuilder } } } + */ } } From e48f2ddb79489838e34aff5c8496e761d47acac6 Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Thu, 10 Jul 2014 12:32:14 +0300 Subject: [PATCH 289/347] - fix debug --- .../com/gravity/goose/extractors/ContentExtractor.scala | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index 0774ac5be..29d0c92aa 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -793,9 +793,9 @@ trait ContentExtractor { private def debugNode(e: Element): String = { val sb: StringBuilder = new StringBuilder - sb.append("tag '") + sb.append("'tag '") sb.append(e.tagName) - sb.append("'GravityScore: '") + sb.append("' GravityScore: '") sb.append(e.attr("gravityScore")) sb.append("' paraNodeCount: '") sb.append(e.attr("gravityNodes")) @@ -803,10 +803,6 @@ trait ContentExtractor { sb.append(e.id) sb.append("' className: '") sb.append(e.attr("class")) - sb.append("' GravityScore: '") - sb.append(e.attr("gravityScore")) - sb.append("' paraNodeCount: '") - sb.append(e.attr("gravityNodes")) sb.append("'") sb.toString() } From 2d06183923d39e1e9eef72abd050c17f7c7aa7ad Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Thu, 10 Jul 2014 13:15:41 +0300 Subject: [PATCH 290/347] - relative path to imageMagick executable - fix one test to use the newest stopwords files --- src/main/scala/com/gravity/goose/Configuration.scala | 10 ++-------- .../scala/com/gravity/goose/utils/FileHelperTest.scala | 2 +- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index 26086719d..29686c554 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -140,20 +140,14 @@ class Configuration { * path to your imagemagick convert executable, on the mac using mac ports this is the default listed */ @BeanProperty -<<<<<<< .mine - var imagemagickConvertPath: String = "/usr/local/bin/convert" -======= + //var imagemagickConvertPath: String = "/usr/local/bin/convert" var imagemagickConvertPath: String = "convert" ->>>>>>> .theirs /** * path to your imagemagick identify executable */ @BeanProperty -<<<<<<< .mine - var imagemagickIdentifyPath: String = "/usr/local/bin/identify" -======= + //var imagemagickIdentifyPath: String = "/usr/local/bin/identify" var imagemagickIdentifyPath: String = "identify" ->>>>>>> .theirs @BeanProperty var connectionTimeout: Int = 10000 // 10 seconds diff --git a/src/test/scala/com/gravity/goose/utils/FileHelperTest.scala b/src/test/scala/com/gravity/goose/utils/FileHelperTest.scala index 6a45e7136..47d8b7cd2 100644 --- a/src/test/scala/com/gravity/goose/utils/FileHelperTest.scala +++ b/src/test/scala/com/gravity/goose/utils/FileHelperTest.scala @@ -14,7 +14,7 @@ class FileHelperTest { @Test def loadFileContents() { - val txt = FileHelper.loadResourceFile("en.txt", StopWords.getClass) + val txt = FileHelper.loadResourceFile("stopwords-en.txt", StopWords.getClass) assertTrue(txt.startsWith("a's")) } From c53dd335de76af0042e920deb10bbdc4f1068fc9 Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Thu, 10 Jul 2014 14:02:22 +0300 Subject: [PATCH 291/347] - more details about mavn and imageMagick prerequisites --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 7e1d0be07..93c0fe2cb 100644 --- a/README.md +++ b/README.md @@ -38,6 +38,10 @@ Goose is licensed by Gravity.com under the Apache 2.0 license, see the LICENSE f ##Environment Prerequisites +The default behaviour is by using java image processing capabilities. + +### ImageMagick + You will need to have ImageMagick installed for Goose to work correctly. On osx, you can install with brew: @@ -46,11 +50,19 @@ On osx, you can install with brew: Update Configuration.scala with the location of identify and convert (eg /usr/local/bin) ##Take it for a spin + +### SBT To use goose from the command line: cd into the goose directory sbt "run-main com.gravity.goose.TalkToMeGoose http://techcrunch.com/2011/05/13/native-apps-or-web-apps-particle-code-wants-you-to-do-both/" +### MVN + cd into the goose directory + mvn compile + MAVEN_OPTS="-Xms256m -Xmx2000m"; mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="http://techcrunch.com/2011/05/13/native-apps-or-web-apps-particle-code-wants-you-to-do-both/" -e -q > ~/Desktop/gooseresult.txt + + ##Testing To run the junit tests, kick off the sbt test target: From 44969b732a953bd05eceda6037f317f38f41b9b8 Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Thu, 10 Jul 2014 14:53:21 +0300 Subject: [PATCH 292/347] add a main that exports a service on http://localhost:8890?url=http://.... --- build.sbt | 3 +- pom.xml | 12 ++-- .../scala/com/gravity/goose/UrlEndpoint.scala | 30 +++++----- .../com/gravity/goose/utils/JsonUtil.scala | 57 +++++++++++++++++++ 4 files changed, 83 insertions(+), 19 deletions(-) rename src/{test => main}/scala/com/gravity/goose/UrlEndpoint.scala (77%) create mode 100644 src/main/scala/com/gravity/goose/utils/JsonUtil.scala diff --git a/build.sbt b/build.sbt index e8f935c4a..1fd98325e 100644 --- a/build.sbt +++ b/build.sbt @@ -59,7 +59,8 @@ libraryDependencies ++= { ,"com.chenlb.mmseg4j" % "mmseg4j-core" % "1.9.1" ,"com.googlecode.juniversalchardet" % "juniversalchardet" % "1.0.3" //add json service - ,"net.sf.json-lib" % "json-lib" % "2.4" classifier "jdk15" + ,"com.fasterxml.jackson.core" % "jackson-databind" % "2.2.2" + ,"com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.2.2" ,"org.simpleframework" % "simple" % "4.1.21" //add cassandra //,"com.netflix.astyanax" % "astyanax-core" % "1.56.43" diff --git a/pom.xml b/pom.xml index 12b37c3ac..031e10fdb 100644 --- a/pom.xml +++ b/pom.xml @@ -142,10 +142,14 @@ Goose was originally an article extractor written in Java that has most recently </dependency> <!--json--> <dependency> - <groupId>net.sf.json-lib</groupId> - <artifactId>json-lib</artifactId> - <version>2.4</version> - <classifier>jdk15</classifier> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-databind</artifactId> + <version>2.2.2</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-module-scala</artifactId> + <version>2.2.2</version> </dependency> <dependency> <groupId>org.simpleframework</groupId> diff --git a/src/test/scala/com/gravity/goose/UrlEndpoint.scala b/src/main/scala/com/gravity/goose/UrlEndpoint.scala similarity index 77% rename from src/test/scala/com/gravity/goose/UrlEndpoint.scala rename to src/main/scala/com/gravity/goose/UrlEndpoint.scala index 2b6df8fff..e2423cd2d 100644 --- a/src/test/scala/com/gravity/goose/UrlEndpoint.scala +++ b/src/main/scala/com/gravity/goose/UrlEndpoint.scala @@ -1,18 +1,17 @@ -import com.jimplush.goose._ -import com.jimplush.goose.images.Image +package com.gravity.goose + +import com.gravity.goose._ import org.simpleframework.http.core.Container -import org.simpleframework.transport.connect.Connection import org.simpleframework.transport.connect.SocketConnection import org.simpleframework.http.Response import org.simpleframework.http.Request import java.net.InetSocketAddress -import java.net.SocketAddress -import java.io.PrintStream -import java.util._ -import net.sf.json._ import URLEndpoint._ -//remove if not needed import scala.collection.JavaConversions._ +import com.gravity.goose.extractors.ContentExtractor +import scala.collection.mutable.Map +import java.util.HashMap +import eu.ec.dgempl.eessi.utils.JsonUtil object URLEndpoint { @@ -45,29 +44,32 @@ class URLEndpoint extends Container { def handle(request: Request, response: Response) { try { val body = response.getPrintStream - val map = new HashMap() + val map = new HashMap[String,Any]() val url = request.getQuery.get("url") + println("read article from ["+url+"]") if (url == null || url.length == 0) { map.put("error", true) map.put("message", "No URL specified") } else { - val config = new Configuration() + val config = new Configuration config.setImagemagickConvertPath("/usr/bin/convert") config.setImagemagickIdentifyPath("/usr/bin/identify") config.setLocalStoragePath("./storage") - val contentExtractor = new ContentExtractor(config) - val article = contentExtractor.extractContent(url) + val goose = new Goose(config) + val article = goose.extractContent(url) map.put("success", true) map.put("title", encodeHTML(article.getTitle)) val image = article.getTopImage if (image != null) { map.put("image", article.getTopImage.getImageSrc) } - map.put("images", article.getImageCandidates) + map.put("images", article.getAllImages) map.put("link", article.getCanonicalLink) map.put("text", encodeHTML(article.getCleanedArticleText)) } - body.println(JSONObject.fromObject(map).toString) + val responseString = JsonUtil.toJson(map) + println(responseString) + body.println(responseString) response.set("Content-Type", "application/json") val time = System.currentTimeMillis() response.setDate("Date", time) diff --git a/src/main/scala/com/gravity/goose/utils/JsonUtil.scala b/src/main/scala/com/gravity/goose/utils/JsonUtil.scala new file mode 100644 index 000000000..17256067c --- /dev/null +++ b/src/main/scala/com/gravity/goose/utils/JsonUtil.scala @@ -0,0 +1,57 @@ +package eu.ec.dgempl.eessi.utils + +import java.io._ +import com.fasterxml.jackson.core._ +import com.fasterxml.jackson.databind._ +import com.fasterxml.jackson.databind.SerializationFeature + +object JsonUtil { + + private val LOG = org.slf4j.LoggerFactory.getLogger("JsonUtil") + + private val mapper = create() + + private def create(): ObjectMapper = { + val mapper = new ObjectMapper() + mapper.configure(SerializationFeature.INDENT_OUTPUT, true) + mapper + } + + def toJson[T](data: T): String = { + try { + mapper.writeValueAsString(data) + } catch { + case e: IOException => { + LOG.warn("can't format a json object from [" + data + "]", e) + null + } + } + } + + def toJsonNode[T](data: T): JsonNode = mapper.valueToTree(data) + + def fromJson[T](description: String, theClass: Class[T]): T = { + //PlayUtils.fixClassloader(theClass) + val parse = mapper.readValue(description, classOf[JsonNode]) + val fromJson = mapper.treeToValue(parse, theClass) + fromJson + } + + private def shorter(description: String): String = { + val maxSize = 1000 + if (description == null || description.length < maxSize) { + return description + } + description.substring(0, maxSize - 3) + "..." + } + + def copy[T](data: T): T = { + fromJson(toJson(data), data.getClass.asInstanceOf[Class[T]]) + } + + def clone[T](`object`: T, excludeFields: String): T = { + val exported = JsonUtil.toJson(`object`) + val obj = JsonUtil.fromJson(exported, `object`.getClass) + obj.asInstanceOf[T] + } +} From c35a9e0c95be842c6cba5109aa44fb6a06970b5c Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Thu, 10 Jul 2014 15:00:40 +0300 Subject: [PATCH 293/347] - fix JsonUtil serializer to handle scala collections --- src/main/scala/com/gravity/goose/UrlEndpoint.scala | 2 +- src/main/scala/com/gravity/goose/utils/JsonUtil.scala | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/UrlEndpoint.scala b/src/main/scala/com/gravity/goose/UrlEndpoint.scala index e2423cd2d..9faec695f 100644 --- a/src/main/scala/com/gravity/goose/UrlEndpoint.scala +++ b/src/main/scala/com/gravity/goose/UrlEndpoint.scala @@ -44,7 +44,7 @@ class URLEndpoint extends Container { def handle(request: Request, response: Response) { try { val body = response.getPrintStream - val map = new HashMap[String,Any]() + val map = Map[String,Any]() val url = request.getQuery.get("url") println("read article from ["+url+"]") if (url == null || url.length == 0) { diff --git a/src/main/scala/com/gravity/goose/utils/JsonUtil.scala b/src/main/scala/com/gravity/goose/utils/JsonUtil.scala index 17256067c..528b1912d 100644 --- a/src/main/scala/com/gravity/goose/utils/JsonUtil.scala +++ b/src/main/scala/com/gravity/goose/utils/JsonUtil.scala @@ -4,6 +4,7 @@ import java.io._ import com.fasterxml.jackson.core._ import com.fasterxml.jackson.databind._ import com.fasterxml.jackson.databind.SerializationFeature +import com.fasterxml.jackson.module.scala.DefaultScalaModule object JsonUtil { @@ -14,6 +15,7 @@ object JsonUtil { private def create(): ObjectMapper = { val mapper = new ObjectMapper() mapper.configure(SerializationFeature.INDENT_OUTPUT, true) + mapper.registerModule(DefaultScalaModule) mapper } From b56602dae27f6c0df6fc865a0cd648c2989463a4 Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Fri, 11 Jul 2014 14:14:19 +0300 Subject: [PATCH 294/347] - enable gae if needed --- build.sbt | 5 + src/main/scala/com/gravity/goose/Goose.scala | 5 +- .../com/gravity/goose/TalkToMeGoose.scala | 39 +--- .../gravity/goose/TalkToMeGooseAndGae.scala | 59 ++++++ .../gravity/goose/network/HtmlFetcher.scala | 29 ++- .../network/gae/GAEClientConnection.scala | 174 ++++++++++++++++++ .../network/gae/GAEConnectionManager.scala | 64 +++++++ 7 files changed, 333 insertions(+), 42 deletions(-) create mode 100644 src/main/scala/com/gravity/goose/TalkToMeGooseAndGae.scala create mode 100644 src/main/scala/com/gravity/goose/network/gae/GAEClientConnection.scala create mode 100644 src/main/scala/com/gravity/goose/network/gae/GAEConnectionManager.scala diff --git a/build.sbt b/build.sbt index 1fd98325e..30350bcec 100644 --- a/build.sbt +++ b/build.sbt @@ -58,6 +58,11 @@ libraryDependencies ++= { ,"org.jsoup" % "jsoup" % "1.7.3" ,"com.chenlb.mmseg4j" % "mmseg4j-core" % "1.9.1" ,"com.googlecode.juniversalchardet" % "juniversalchardet" % "1.0.3" + //gae + ,"com.google.appengine" % "appengine-api-labs" % "1.7.1" + ,"com.google.appengine" % "appengine-api-stubs" % "1.7.1" + ,"com.google.appengine" % "appengine-testing" % "1.7.1" + ,"com.google.appengine" % "appengine-api-1.0-sdk" % "1.7.1" //add json service ,"com.fasterxml.jackson.core" % "jackson-databind" % "2.2.2" ,"com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.2.2" diff --git a/src/main/scala/com/gravity/goose/Goose.scala b/src/main/scala/com/gravity/goose/Goose.scala index 4f6c8c533..97d0318d2 100644 --- a/src/main/scala/com/gravity/goose/Goose.scala +++ b/src/main/scala/com/gravity/goose/Goose.scala @@ -26,10 +26,7 @@ import org.apache.commons.lang.NotImplementedException * Created by Jim Plush - Gravity.com * Date: 8/14/11 */ -class Goose() { - - var config : Configuration = new Configuration() - +class Goose(var config : Configuration = new Configuration) { def setConfig(configuration: Configuration) = { config = configuration if (configuration.getEnableImageFetching) throw new NotImplementedException("image fetching should be rewritten before it can be used in GAE") diff --git a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala index cf465cb80..8dcddad39 100644 --- a/src/main/scala/com/gravity/goose/TalkToMeGoose.scala +++ b/src/main/scala/com/gravity/goose/TalkToMeGoose.scala @@ -4,12 +4,7 @@ import java.io._ import scala.collection.JavaConversions._ import scala.io.Source - object TalkToMeGoose { - - val URLConfig: LocalURLFetchServiceTestConfig = new LocalURLFetchServiceTestConfig() - val Helper: LocalServiceTestHelper = new LocalServiceTestHelper(URLConfig) - /** * You can use this method to run goose from the command line * to extract html from a bash script, or to just test its functionality: @@ -27,8 +22,8 @@ object TalkToMeGoose { */ def main(args: Array[String]) { try { - println("URL to extract article from:") - val url: String = if (args.isEmpty) readLine() else args(0) + println("URL to extract article from:") + val url: String = if (args.isEmpty) readLine() else args(0) talk(url) //talk2(url) } catch { @@ -36,40 +31,24 @@ object TalkToMeGoose { System.out.println("Make sure you pass in a valid URL: " + e.toString) e.printStackTrace() } - } finally { - Helper.tearDown() } } def talk(url: String) { val config: Configuration = new Configuration - config.enableImageFetching = false - config.imagemagickConvertPath = "/usr/bin/convert" - config.imagemagickIdentifyPath = "/usr/bin/identify" - config.localStoragePath = "/tmp/goose" - config.minBytesForImages = 4500 + config.enableImageFetching = false + config.imagemagickConvertPath = "/usr/bin/convert" + config.imagemagickIdentifyPath = "/usr/bin/identify" + config.localStoragePath = "/tmp/goose" + config.minBytesForImages = 4500 val goose = new Goose(config) val article = goose.extractContent(url) println("TITLE: " + article.title) println("DATE: " + article.publishDate) println("TAGS: " + article.tags) println("TEXT: " + article.cleanedArticleText) - println(article.topImage.imageSrc) - println(article.title) + println(article.topImage.imageSrc) + println(article.title) } - def talk2(url: String) { - Helper.setUp() - BasicConfigurator.configure(); - - val config: Configuration = new Configuration - config.enableImageFetching = false - - val goose = new Goose() - goose.setConfig(config) - - val article = goose.extractContent(url) - println("Tags: " + article.getTagsSet()) - println(article.cleanedArticleText) -} } diff --git a/src/main/scala/com/gravity/goose/TalkToMeGooseAndGae.scala b/src/main/scala/com/gravity/goose/TalkToMeGooseAndGae.scala new file mode 100644 index 000000000..4ac7ddf07 --- /dev/null +++ b/src/main/scala/com/gravity/goose/TalkToMeGooseAndGae.scala @@ -0,0 +1,59 @@ +package com.gravity.goose + +import java.io._ +import scala.collection.JavaConversions._ +import scala.io.Source + +object TalkToMeGooseAndGae { + import com.google.appengine.tools.development.testing.LocalURLFetchServiceTestConfig + import com.google.appengine.tools.development.testing.LocalServiceTestHelper + val URLConfig: LocalURLFetchServiceTestConfig = new LocalURLFetchServiceTestConfig() + val Helper: LocalServiceTestHelper = new LocalServiceTestHelper(URLConfig) + + /** + * You can use this method to run goose from the command line + * to extract html from a bash script, or to just test its functionality: + * + * cd into the goose root + * mvn compile + * MAVEN_OPTS="-Xms256m -Xmx2000m"; mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="http://techcrunch.com/2011/05/13/native-apps-or-web-apps-particle-code-wants-you-to-do-both/" -e -q > ~/Desktop/gooseresult.txt + * + * or if using sbt: + * + * cd into the goose root + * sbt + * > run http://www.thestar.com/news/insight/2013/04/26/spotting_tiny_gnatcatcher_can_put_a_spring_in_your_step.html + * + */ + def main(args: Array[String]) { + try { + println("URL to extract article from:") + val url: String = if (args.isEmpty) readLine() else args(0) + talk(url) + //talk2(url) + } catch { + case e: Exception => { + System.out.println("Make sure you pass in a valid URL: " + e.toString) + e.printStackTrace() + } + } finally { + Helper.tearDown() + } + } + + def talk(url: String) { + import org.apache.log4j.BasicConfigurator + Helper.setUp() + BasicConfigurator.configure(); + + val config: Configuration = new Configuration + config.enableImageFetching = false + + val goose = new Goose() + goose.setConfig(config) + + val article = goose.extractContent(url) + println("Tags: " + article.getTags()) + println(article.cleanedArticleText) + } +} diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index 0c460637d..89f4e1c92 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -58,6 +58,9 @@ import org.apache.http.impl.client.{DefaultHttpRequestRetryHandler, AbstractHttp import org.apache.commons.io.IOUtils import com.ibm.icu.text.CharsetDetector import org.apache.http.util.EntityUtils +import org.apache.http.conn.ClientConnectionManager +import com.gravity.goose.network.gae.GAEConnectionManager +import org.apache.http.conn.HttpClientConnectionManager /** * User: Jim Plush @@ -309,14 +312,7 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { httpParams.setParameter("Cache-Control", "max-age=0") httpParams.setParameter("http.connection.stalecheck", true) //gae??? - val cm = new GAEConnectionManager() - - val schemeRegistry: SchemeRegistry = new SchemeRegistry - schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory)) - schemeRegistry.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory)) - val cm = new PoolingClientConnectionManager(schemeRegistry) - cm.setMaxTotal(4000) - cm.setDefaultMaxPerRoute(20) + val cm = createConnectionManager httpClient = new DefaultHttpClient(cm, httpParams) httpClient.asInstanceOf[AbstractHttpClient].setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(0, false)) @@ -436,6 +432,23 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { matched.getLanguage matched.getString } + + def createConnectionManager:ClientConnectionManager = createDefaultConnectionManager + //enable gae connection manager + //def createConnectionManager:ClientConnectionManager = createGaeConnectionManager + + + def createGaeConnectionManager = new GAEConnectionManager + def createDefaultConnectionManager:ClientConnectionManager = { + val schemeRegistry: SchemeRegistry = new SchemeRegistry + schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory)) + schemeRegistry.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory)) + + val cm = new PoolingClientConnectionManager(schemeRegistry) + cm.setMaxTotal(4000) + cm.setDefaultMaxPerRoute(20) + cm + } } diff --git a/src/main/scala/com/gravity/goose/network/gae/GAEClientConnection.scala b/src/main/scala/com/gravity/goose/network/gae/GAEClientConnection.scala new file mode 100644 index 000000000..348c01fb6 --- /dev/null +++ b/src/main/scala/com/gravity/goose/network/gae/GAEClientConnection.scala @@ -0,0 +1,174 @@ +package com.gravity.goose.network + +import org.apache.http._ +import org.apache.http.conn.ClientConnectionManager +import org.apache.http.conn.ManagedClientConnection +import org.apache.http.conn.routing.HttpRoute +import org.apache.http.entity.ByteArrayEntity +import org.apache.http.message.BasicHttpResponse +import org.apache.http.params.HttpParams +import org.apache.http.protocol.HttpContext +import com.google.appengine.api.urlfetch._ +import java.io.ByteArrayOutputStream +import java.io.IOException +import java.net.InetAddress +import java.net.URI +import java.net.URISyntaxException +import java.util.concurrent.TimeUnit +import GAEClientConnection._ +import scala.reflect.{ BeanProperty, BooleanBeanProperty } +import scala.collection.JavaConversions._ +import org.apache.http.conn.HttpClientConnectionManager +import java.net.Socket + +object GAEClientConnection { + + private var urlFS: URLFetchService = URLFetchServiceFactory.getURLFetchService +} + +class GAEClientConnection(cm: ClientConnectionManager, @BeanProperty var route: HttpRoute, @BeanProperty var state: AnyRef) extends ManagedClientConnection { + def getId(): String = ??? + def bind(socket: Socket) = ??? + def getSocket() = ??? + override def isSecure(): Boolean = route.isSecure + + override def getSSLSession(): javax.net.ssl.SSLSession = null + + override def open(route: HttpRoute, context: HttpContext, params: HttpParams) { + close() + this.route = route + } + + override def tunnelTarget(secure: Boolean, params: HttpParams) { + throw new IOException("tunnelTarget() not supported") + } + + override def tunnelProxy(next: HttpHost, secure: Boolean, params: HttpParams) { + throw new IOException("tunnelProxy() not supported") + } + + override def layerProtocol(context: HttpContext, params: HttpParams) { + throw new IOException("layerProtocol() not supported") + } + + override def markReusable() { + reusable = true + } + + override def unmarkReusable() { + reusable = false + } + + override def isMarkedReusable(): Boolean = reusable + + override def setIdleDuration(duration: Long, unit: TimeUnit) { + } + + override def isResponseAvailable(timeout: Int): Boolean = response != null + + override def sendRequestHeader(request: HttpRequest) { + val host = route.getTargetHost + val uri = new URI(host.getSchemeName + "://" + host.getHostName + (if ((host.getPort == -1)) "" else (":" + host.getPort)) + request.getRequestLine.getUri) + this.request = new HTTPRequest(uri.toURL(), HTTPMethod.valueOf(request.getRequestLine.getMethod), FetchOptions.Builder.disallowTruncate()) + for (h <- request.getAllHeaders) { + this.request.addHeader(new HTTPHeader(h.getName, h.getValue)) + } + } + + override def sendRequestEntity(request: HttpEntityEnclosingRequest) { + val baos = new ByteArrayOutputStream() + if (request.getEntity != null) { + request.getEntity.writeTo(baos) + } + this.request.setPayload(baos.toByteArray()) + } + + override def receiveResponseHeader(): HttpResponse = { + if (this.response == null) { + flush() + } + val response = new BasicHttpResponse(new ProtocolVersion("HTTP", 1, 1), this.response.getResponseCode, null) + for (h <- this.response.getHeaders) { + response.addHeader(h.getName, h.getValue) + } + response + } + + override def receiveResponseEntity(response2: HttpResponse) { + //TODO review response2 and this.response + if (this.response == null) { + throw new IOException("receiveResponseEntity() called on closed connection") + } + val bae = new ByteArrayEntity(this.response.getContent) + bae.setContentType(response2.getFirstHeader("Content-Type")) + response2.setEntity(bae) + this.response = null + } + + override def flush() { + if (request != null) { + try { + response = urlFS.fetch(request) + request = null + } catch { + case ex: IOException => { + ex.printStackTrace() + throw ex + } + } + } else { + response = null + } + } + + override def close() { + request = null + response = null + closed = true + } + + override def isOpen(): Boolean = request != null || response != null + + override def isStale(): Boolean = !isOpen && !closed + + override def setSocketTimeout(timeout: Int) { + } + + override def getSocketTimeout(): Int = -1 + + override def shutdown() { + close() + } + + override def getMetrics(): HttpConnectionMetrics = null + + override def getLocalAddress(): InetAddress = null + + override def getLocalPort(): Int = 0 + + override def getRemoteAddress(): InetAddress = null + + override def getRemotePort(): Int = { + val host = route.getTargetHost + connManager.getSchemeRegistry.getScheme(host).resolvePort(host.getPort) + } + + override def releaseConnection() { + connManager.releaseConnection(this, java.lang.Long.MAX_VALUE, TimeUnit.MILLISECONDS) + } + + override def abortConnection() { + unmarkReusable() + shutdown() + } + + private var connManager: ClientConnectionManager = cm + + private var reusable: Boolean = _ + + private var request: HTTPRequest = _ + + private var response: HTTPResponse = _ + + private var closed: Boolean = true +} diff --git a/src/main/scala/com/gravity/goose/network/gae/GAEConnectionManager.scala b/src/main/scala/com/gravity/goose/network/gae/GAEConnectionManager.scala new file mode 100644 index 000000000..1d45f712c --- /dev/null +++ b/src/main/scala/com/gravity/goose/network/gae/GAEConnectionManager.scala @@ -0,0 +1,64 @@ +package com.gravity.goose.network.gae + +import org.apache.http.conn.ClientConnectionManager +import org.apache.http.conn.ClientConnectionRequest +import org.apache.http.conn.ManagedClientConnection +import org.apache.http.conn.routing.HttpRoute +import org.apache.http.conn.scheme.Scheme +import org.apache.http.conn.scheme.SchemeRegistry +import org.apache.http.conn.scheme.SchemeSocketFactory +import org.apache.http.params.HttpParams +import java.net.InetSocketAddress +import java.net.Socket +import java.util.concurrent.TimeUnit +import scala.reflect.BeanProperty +import com.gravity.goose.network.GAEClientConnection +import org.apache.http.conn.HttpClientConnectionManager + +class GAEConnectionManager extends ClientConnectionManager { + @BeanProperty + var schemeRegistry: SchemeRegistry = new SchemeRegistry() + + val no_socket_factory = new SchemeSocketFactory() { + + override def isSecure(sock: Socket): Boolean = false + + override def createSocket(params: HttpParams): Socket = null + + override def connectSocket(sock: Socket, remoteAddress: InetSocketAddress, localAddress: InetSocketAddress, params: HttpParams): Socket = { + null + } + } + + schemeRegistry.register(new Scheme("http", 80, no_socket_factory)) + + schemeRegistry.register(new Scheme("https", 443, no_socket_factory)) + + override def requestConnection(route: HttpRoute, state: AnyRef): ClientConnectionRequest = { + new ClientConnectionRequest() { + + def abortRequest() { + } + + def getConnection(timeout: Long, tunit: TimeUnit): ManagedClientConnection = { + GAEConnectionManager.this.getConnection(route, state) + } + } + } + + override def releaseConnection(conn: ManagedClientConnection, validDuration: Long, timeUnit: TimeUnit) { + } + + override def closeIdleConnections(idletime: Long, tunit: TimeUnit) { + } + + override def closeExpiredConnections() { + } + + override def shutdown() { + } + + private def getConnection(route: HttpRoute, state: AnyRef): ManagedClientConnection = { + new GAEClientConnection(this, route, state) + } +} From 0a9517e02334a9838c9547170072a7074e3992c0 Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Fri, 11 Jul 2014 14:19:32 +0300 Subject: [PATCH 295/347] - java changes are too old --- src/main/java/andrewlin12/URLEndpoint.java | 91 ------ .../goose/network/GAEClientConnection.java | 277 ------------------ .../goose/network/GAEConnectionManager.java | 94 ------ src/main/resources/log4j.properties | 15 - 4 files changed, 477 deletions(-) delete mode 100644 src/main/java/andrewlin12/URLEndpoint.java delete mode 100644 src/main/java/com/gravity/goose/network/GAEClientConnection.java delete mode 100644 src/main/java/com/gravity/goose/network/GAEConnectionManager.java delete mode 100644 src/main/resources/log4j.properties diff --git a/src/main/java/andrewlin12/URLEndpoint.java b/src/main/java/andrewlin12/URLEndpoint.java deleted file mode 100644 index 76e98ced3..000000000 --- a/src/main/java/andrewlin12/URLEndpoint.java +++ /dev/null @@ -1,91 +0,0 @@ -import com.jimplush.goose.*; -import com.jimplush.goose.images.Image; -import org.simpleframework.http.core.Container; -import org.simpleframework.transport.connect.Connection; -import org.simpleframework.transport.connect.SocketConnection; -import org.simpleframework.http.Response; -import org.simpleframework.http.Request; - -import java.net.InetSocketAddress; -import java.net.SocketAddress; -import java.io.PrintStream; -import java.util.*; - -import net.sf.json.*; - -public class URLEndpoint implements Container { - public static void main(String[] args) throws Exception{ - Container container = new URLEndpoint(); - Connection connection = new SocketConnection(container); - SocketAddress address = new InetSocketAddress(8890); - - connection.connect(address); - } - - public static String encodeHTML(String s) - { - if (s == null) { - return ""; - } - - StringBuffer out = new StringBuffer(); - for(int i=0; i<s.length(); i++) - { - char c = s.charAt(i); - if(c > 127 || c=='"' || c=='<' || c=='>') - { - out.append("&#"+(int)c+";"); - } - else - { - out.append(c); - } - } - return out.toString(); - } - - - public void handle(Request request, Response response) { - try { - PrintStream body = response.getPrintStream(); - Map map = new HashMap(); - - String url = request.getQuery().get("url"); - if (url == null || url.length() == 0) { - map.put("error", true); - map.put("message", "No URL specified"); - } - else { - Configuration config = new Configuration(); - config.setImagemagickConvertPath("/usr/bin/convert"); - config.setImagemagickIdentifyPath("/usr/bin/identify"); - config.setLocalStoragePath("./storage"); - - ContentExtractor contentExtractor = new ContentExtractor(config); - Article article = contentExtractor.extractContent(url); - - map.put("success", true); - map.put("title", encodeHTML(article.getTitle())); - Image image = article.getTopImage(); - if (image != null) { - map.put("image", article.getTopImage().getImageSrc()); - } - map.put("images", article.getImageCandidates()); - map.put("link", article.getCanonicalLink()); - map.put("text", encodeHTML(article.getCleanedArticleText())); - } - - body.println(JSONObject.fromObject(map).toString()); - - response.set("Content-Type", "application/json"); - - long time = System.currentTimeMillis(); - response.setDate("Date", time); - response.setDate("Last-Modified", time); - body.close(); - } - catch (Exception e) { - e.printStackTrace(); - } - } -} \ No newline at end of file diff --git a/src/main/java/com/gravity/goose/network/GAEClientConnection.java b/src/main/java/com/gravity/goose/network/GAEClientConnection.java deleted file mode 100644 index bd0fc1abb..000000000 --- a/src/main/java/com/gravity/goose/network/GAEClientConnection.java +++ /dev/null @@ -1,277 +0,0 @@ -package com.gravity.goose.network; - -import org.apache.http.*; -import org.apache.http.conn.ClientConnectionManager; -import org.apache.http.conn.ManagedClientConnection; -import org.apache.http.conn.routing.HttpRoute; -import org.apache.http.entity.ByteArrayEntity; -import org.apache.http.message.BasicHttpResponse; -import org.apache.http.params.HttpParams; -import org.apache.http.protocol.HttpContext; - -import com.google.appengine.api.urlfetch.*; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.net.InetAddress; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.concurrent.TimeUnit; - -/** - * HttpClient ManagedClientConnection implementation which works around the lack - * of threads in GAE - * - * from - http://esxx.blogspot.com/2009/06/using-apaches-httpclient-on-google-app.html - * - * @author Martin Blom (martin@blom.org) - */ -class GAEClientConnection implements ManagedClientConnection { - - public GAEClientConnection(ClientConnectionManager cm, HttpRoute route, Object state) { - this.connManager = cm; - this.route = route; - this.state = state; - this.closed = true; - } - - // From interface ManagedClientConnection - - @Override - public boolean isSecure() { - return route.isSecure(); - } - - @Override - public HttpRoute getRoute() { - return route; - } - - @Override - public javax.net.ssl.SSLSession getSSLSession() { - return null; - } - - @Override - public void open(HttpRoute route, HttpContext context, HttpParams params) - throws IOException { - close(); - this.route = route; - } - - @Override - public void tunnelTarget(boolean secure, HttpParams params) - throws IOException { - throw new IOException("tunnelTarget() not supported"); - } - - @Override - public void tunnelProxy(HttpHost next, boolean secure, HttpParams params) - throws IOException { - throw new IOException("tunnelProxy() not supported"); - } - - @Override - public void layerProtocol(HttpContext context, HttpParams params) - throws IOException { - throw new IOException("layerProtocol() not supported"); - } - - @Override - public void markReusable() { - reusable = true; - } - - @Override - public void unmarkReusable() { - reusable = false; - } - - @Override - public boolean isMarkedReusable() { - return reusable; - } - - @Override - public void setState(Object state) { - this.state = state; - } - - @Override - public Object getState() { - return state; - } - - @Override - public void setIdleDuration(long duration, TimeUnit unit) { - // Do nothing - } - - // From interface HttpClientConnection - @Override - public boolean isResponseAvailable(int timeout) throws IOException { - return response != null; - } - - @Override - public void sendRequestHeader(HttpRequest request) throws HttpException, IOException { - try { - HttpHost host = route.getTargetHost(); - - URI uri = new URI(host.getSchemeName() + "://" + host.getHostName() - + ((host.getPort() == -1) ? "" : (":" + host.getPort())) - + request.getRequestLine().getUri()); - - this.request = new HTTPRequest(uri.toURL(), - HTTPMethod.valueOf(request.getRequestLine().getMethod()), - FetchOptions.Builder.disallowTruncate()); - } catch (URISyntaxException ex) { - throw new IOException("Malformed request URI: " + ex.getMessage(), ex); - } catch (IllegalArgumentException ex) { - throw new IOException( - "Unsupported HTTP method: " + ex.getMessage(), ex); - } - - for (Header h : request.getAllHeaders()) { - this.request.addHeader(new HTTPHeader(h.getName(), h.getValue())); - } - } - - @Override - public void sendRequestEntity(HttpEntityEnclosingRequest request) throws HttpException, IOException { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - if (request.getEntity() != null) { - request.getEntity().writeTo(baos); - } - this.request.setPayload(baos.toByteArray()); - } - - @Override - public HttpResponse receiveResponseHeader() throws HttpException, - IOException { - if (this.response == null) { - flush(); - } - - HttpResponse response = new BasicHttpResponse(new ProtocolVersion("HTTP", 1, 1), this.response.getResponseCode(), null); - - for (HTTPHeader h : this.response.getHeaders()) { - response.addHeader(h.getName(), h.getValue()); - } - - return response; - } - - @Override - public void receiveResponseEntity(HttpResponse response) throws HttpException, IOException { - if (this.response == null) { - throw new IOException("receiveResponseEntity() called on closed connection"); - } - - ByteArrayEntity bae = new ByteArrayEntity(this.response.getContent()); - bae.setContentType(response.getFirstHeader("Content-Type")); - response.setEntity(bae); - - response = null; - } - - @Override - public void flush() throws IOException { - if (request != null) { - try { - // System.err.println("----"); - response = urlFS.fetch(request); - request = null; - } catch (IOException ex) { - ex.printStackTrace(); - throw ex; - } - } else { - response = null; - } - } - - // From interface HttpConnection - @Override - public void close() throws IOException { - request = null; - response = null; - closed = true; - } - - @Override - public boolean isOpen() { - return request != null || response != null; - } - - @Override - public boolean isStale() { - return !isOpen() && !closed; - } - - @Override - public void setSocketTimeout(int timeout) { - } - - @Override - public int getSocketTimeout() { - return -1; - } - - @Override - public void shutdown() throws IOException { - close(); - } - - @Override - public HttpConnectionMetrics getMetrics() { - return null; - } - - // From interface HttpInetConnection - @Override - public InetAddress getLocalAddress() { - return null; - } - - @Override - public int getLocalPort() { - return 0; - } - - @Override - public InetAddress getRemoteAddress() { - return null; - } - - @Override - public int getRemotePort() { - HttpHost host = route.getTargetHost(); - return connManager.getSchemeRegistry().getScheme(host).resolvePort(host.getPort()); - } - - // From interface ConnectionReleaseTrigger - - @Override - public void releaseConnection() throws IOException { - connManager.releaseConnection(this, Long.MAX_VALUE, - TimeUnit.MILLISECONDS); - } - - @Override - public void abortConnection() throws IOException { - unmarkReusable(); - shutdown(); - } - - private ClientConnectionManager connManager; - private HttpRoute route; - private Object state; - private boolean reusable; - - private HTTPRequest request; - private HTTPResponse response; - private boolean closed; - - private static URLFetchService urlFS = URLFetchServiceFactory.getURLFetchService(); -} \ No newline at end of file diff --git a/src/main/java/com/gravity/goose/network/GAEConnectionManager.java b/src/main/java/com/gravity/goose/network/GAEConnectionManager.java deleted file mode 100644 index c2f72361d..000000000 --- a/src/main/java/com/gravity/goose/network/GAEConnectionManager.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.gravity.goose.network; - -import org.apache.http.conn.ClientConnectionManager; -import org.apache.http.conn.ClientConnectionRequest; -import org.apache.http.conn.ConnectTimeoutException; -import org.apache.http.conn.ManagedClientConnection; -import org.apache.http.conn.routing.HttpRoute; -import org.apache.http.conn.scheme.Scheme; -import org.apache.http.conn.scheme.SchemeRegistry; -import org.apache.http.conn.scheme.SchemeSocketFactory; -import org.apache.http.params.HttpParams; - -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.Socket; -import java.net.UnknownHostException; -import java.util.concurrent.TimeUnit; - -/** - * HttpClient ClientConnectionManager implementation which works around the lack - * of threads in GAE - * - * from - http://esxx.blogspot.com/2009/06/using-apaches-httpclient-on-google-app.html - * - * @author Martin Blom (martin@blom.org) - */ -public class GAEConnectionManager implements ClientConnectionManager { - - public GAEConnectionManager() { - SchemeSocketFactory no_socket_factory = new SchemeSocketFactory() { - @Override - public boolean isSecure(Socket sock) - throws IllegalArgumentException { - return false; - } - @Override - public Socket createSocket(HttpParams params) throws IOException { - return null; - } - @Override - public Socket connectSocket(Socket sock, - InetSocketAddress remoteAddress, - InetSocketAddress localAddress, HttpParams params) - throws IOException, UnknownHostException, - ConnectTimeoutException { - return null; - } - }; - - schemeRegistry = new SchemeRegistry(); - schemeRegistry.register(new Scheme("http", 80, no_socket_factory)); - schemeRegistry.register(new Scheme("https", 443, no_socket_factory)); - } - - @Override - public SchemeRegistry getSchemeRegistry() { - return schemeRegistry; - } - - @Override - public ClientConnectionRequest requestConnection(final HttpRoute route, final Object state) { - return new ClientConnectionRequest() { - public void abortRequest() { - // Nothing to do - } - - public ManagedClientConnection getConnection(long timeout, TimeUnit tunit) { - return GAEConnectionManager.this.getConnection(route, state); - } - }; - } - - @Override - public void releaseConnection(ManagedClientConnection conn, long validDuration, TimeUnit timeUnit) { - } - - @Override - public void closeIdleConnections(long idletime, TimeUnit tunit) { - } - - @Override - public void closeExpiredConnections() { - } - - @Override - public void shutdown() { - } - - private ManagedClientConnection getConnection(HttpRoute route, Object state) { - return new GAEClientConnection(this, route, state); - } - - private SchemeRegistry schemeRegistry; -} \ No newline at end of file diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties deleted file mode 100644 index 551271ae7..000000000 --- a/src/main/resources/log4j.properties +++ /dev/null @@ -1,15 +0,0 @@ -# A default log4j configuration for log4j users. -# -# To use this configuration, deploy it into your application's WEB-INF/classes -# directory. You are also encouraged to edit it as you like. - -# Configure the console as our one appender -log4j.appender.A1=org.apache.log4j.ConsoleAppender -log4j.appender.A1.layout=org.apache.log4j.PatternLayout -log4j.appender.A1.layout.ConversionPattern=%d{HH:mm:ss,SSS} %-5p [%c] - %m%n - -log4j.logger.com.google.appengine.repackaged.org.apache.http=WARN, A1 -log4j.logger.org.apache.http.wire=WARN, A1 - - -log4j.logger.com.gravity.goose=TRACE, A1 \ No newline at end of file From 604ba7bddb68ae5a3eee2182a8886340b4c1f1b8 Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Fri, 11 Jul 2014 14:24:13 +0300 Subject: [PATCH 296/347] - prepare release --- build.sbt | 2 +- pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index 30350bcec..280a05ae6 100644 --- a/build.sbt +++ b/build.sbt @@ -11,7 +11,7 @@ organization := "com.gravity.goose" name := "goose" -version := "2.2.1" +version := "2.2.0" organizationHomepage := Some(url("http://gravity.com/")) diff --git a/pom.xml b/pom.xml index 1b808bf76..5d98761b7 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>com.gravity</groupId> <artifactId>goose</artifactId> - <version>2.2.0-SNAPSHOT</version> + <version>2.2.0</version> <packaging>jar</packaging> <name>goose</name> <url>https://github.com/raisercostin/goose</url> From 28a874525afeb7414475ecf71fe85c9eddf386de Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Fri, 11 Jul 2014 16:03:20 +0300 Subject: [PATCH 297/347] - add release details --- build.sbt | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index 280a05ae6..43f3d7fab 100644 --- a/build.sbt +++ b/build.sbt @@ -37,6 +37,7 @@ resolvers ++= Seq( "Oracle Maven 2 Repository" at "http://download.oracle.com/maven", "JBoss Maven 2 Repository" at "http://repository.jboss.com/maven2", "JLangDetect Maven repository" at "https://jlangdetect.googlecode.com/svn/repo" + "raisercostin repository" at "svn://raisercostin.synology.me/repo/maven/releases" ) credentials += Credentials(Path.userHome / ".ivy2" / ".credentials") @@ -86,8 +87,9 @@ publishMavenStyle := true pomIncludeRepository := { _ => true} -publishTo := Some(Resolver.file("Github Pages", Path.userHome /"repo" / "maven" asFile)(Patterns(true, Resolver.mavenStyleBasePattern))) -//publishTo := Some(Resolver.file("goose", new File(Path.userHome + "/Dropbox/public/libs" )) ) +//publishTo := Some(Resolver.file("Github Pages", Path.userHome /"repo" / "maven" asFile)(Patterns(true, Resolver.mavenStyleBasePattern))) +//publishTo := Some(Resolver.file("goose", new File("d:/Dropbox/public/libs"))(Patterns(true, Resolver.mavenStyleBasePattern)) ) +publishTo := Some(Resolver.file("goose", new File("./target/publish"))(Patterns(true, Resolver.mavenStyleBasePattern)) ) EclipseKeys.createSrc := EclipseCreateSrc.Default + EclipseCreateSrc.Resource @@ -105,3 +107,14 @@ net.virtualvoid.sbt.graph.Plugin.graphSettings scalacOptions ++= Seq("-unchecked", "-deprecation") + +//to see https://bitbucket.org/diversit/webdav4sbt +def svnPub = Command.args("svn", "<tag>") { (state, args) => + svnUrl := "svn://raisercostin.synology.me/repo/maven/releases" + val tag = s"""svn import -b "binary release" target\publish\ $svnUrl """ + println(s"\nexecute $tag") + tag.! + state +} + +commands ++= Seq(svnPub) \ No newline at end of file From 7754973bea6673754ea930ace60ffd379f29782e Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Fri, 11 Jul 2014 16:06:18 +0300 Subject: [PATCH 298/347] fix script --- build.sbt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.sbt b/build.sbt index 43f3d7fab..2a17a6577 100644 --- a/build.sbt +++ b/build.sbt @@ -36,7 +36,7 @@ resolvers ++= Seq( "central mvn repo" at "http://repo1.maven.org/", "Oracle Maven 2 Repository" at "http://download.oracle.com/maven", "JBoss Maven 2 Repository" at "http://repository.jboss.com/maven2", - "JLangDetect Maven repository" at "https://jlangdetect.googlecode.com/svn/repo" + "JLangDetect Maven repository" at "https://jlangdetect.googlecode.com/svn/repo", "raisercostin repository" at "svn://raisercostin.synology.me/repo/maven/releases" ) @@ -110,8 +110,8 @@ scalacOptions ++= Seq("-unchecked", "-deprecation") //to see https://bitbucket.org/diversit/webdav4sbt def svnPub = Command.args("svn", "<tag>") { (state, args) => - svnUrl := "svn://raisercostin.synology.me/repo/maven/releases" - val tag = s"""svn import -b "binary release" target\publish\ $svnUrl """ + val svnUrl = """svn://raisercostin.synology.me/repo/maven/releases""" + val tag = s"""svn import -m "binary release" target\\publish\\ $svnUrl """ println(s"\nexecute $tag") tag.! state From 43ab516e09710d923736bfba658dd55e8068ce84 Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Fri, 11 Jul 2014 16:47:38 +0300 Subject: [PATCH 299/347] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 93c0fe2cb..3468a16a3 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,8 @@ To run the junit tests, kick off the sbt test target: Note that there are currently problems in the tests. (8 failures in 41 tests on 2014-07-10 - raisercostin) ##Usage as a maven dependency +Last version (goose_2.10-2.2.0.jar) is hosted at http://raisercostin.googlecode.com/svn/maven2/com/gravity/goose/ + Goose is hosted on Sonatype's OSS repository, https://oss.sonatype.org/content/repositories/releases/com/gravity/goose/ From d8e8d6d29e6461d1827be0e0ad223d96779d20d4 Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Sun, 13 Jul 2014 10:51:19 +0300 Subject: [PATCH 300/347] - configuration as case class - release to svn repository in google code - detailed error in crawler - default language is "all" that includes dictionaries from all available languages: see stopwords-all.txt - better toString for Article, Configuration, Image and OpenGraphData - Language is a wrapped of string and not an enumeration since it will change as we add more stopwords files --- build.sbt | 2 +- .../scala/com/gravity/goose/Article.scala | 46 +++- .../com/gravity/goose/Configuration.scala | 228 ++++++++---------- .../scala/com/gravity/goose/Crawler.scala | 46 ++-- src/main/scala/com/gravity/goose/Goose.scala | 2 +- .../com/gravity/goose/images/Image.scala | 12 + .../goose/opengraph/OpenGraphData.scala | 3 +- .../com/gravity/goose/text/StopWords.scala | 2 +- 8 files changed, 183 insertions(+), 158 deletions(-) diff --git a/build.sbt b/build.sbt index 2a17a6577..7ea6be797 100644 --- a/build.sbt +++ b/build.sbt @@ -110,7 +110,7 @@ scalacOptions ++= Seq("-unchecked", "-deprecation") //to see https://bitbucket.org/diversit/webdav4sbt def svnPub = Command.args("svn", "<tag>") { (state, args) => - val svnUrl = """svn://raisercostin.synology.me/repo/maven/releases""" + val svnUrl = """https://raisercostin.googlecode.com/svn/maven2""" val tag = s"""svn import -m "binary release" target\\publish\\ $svnUrl """ println(s"\nexecute $tag") tag.! diff --git a/src/main/scala/com/gravity/goose/Article.scala b/src/main/scala/com/gravity/goose/Article.scala index 79711ad9d..96c0eb023 100644 --- a/src/main/scala/com/gravity/goose/Article.scala +++ b/src/main/scala/com/gravity/goose/Article.scala @@ -46,10 +46,9 @@ class Article { @BeanProperty var cleanedArticleText: String = "" - /** - * article with the originals HTML tags (<p>, <a>, ..) - */ + * article with the originals HTML tags (<p>, <a>, ..) + */ var htmlArticle: String = "" /** @@ -89,10 +88,10 @@ class Article { var topImage: Image = new Image /** - * holds all cadidate images from article - */ + * holds all cadidate images from article + */ @BeanProperty - var allImages: List[Image] = Nil + var allImages: List[Image] = Nil /** * holds a set of tags that may have been in the artcle, these are not meta keywords @@ -117,13 +116,13 @@ class Article { * escaped fragments were found in the starting url */ @BeanProperty - var finalUrl: String = ""; + var finalUrl: String = "" /** * stores the MD5 hash of the url to use for various identification tasks */ @BeanProperty - var linkhash: String = ""; + var linkhash: String = "" /** * stores the RAW HTML straight from the network connection @@ -162,4 +161,33 @@ class Article { /** * Facebook Open Graph data that that is found in Article Meta tags */ - var openGraphData: OpenGraphData = null} + var openGraphData: OpenGraphData = null + + override def toString = + fields.filterNot(_._1=="rawHtml").filterNot(_._1=="doc").filterNot(_._1=="rawDoc").mkString("\n") +// s"""Article{ +// title=$title, +// finalUrl=$finalUrl, +// cleanedArticleText=$cleanedArticleText, +// topImage=$topImage, +// tags=$tags, +// openGraphData=${openGraphData.values.mkString("\n ")}, +// metaDescription=$metaDescription, +// metaKeywords=[$metaKeywords], +// canonicalLink=$canonicalLink, +// allImages=$allImages, +// additionalData=$additionalData +//}""" + def fields = { + import reflect.runtime.universe._ + import reflect.runtime.currentMirror + + val r = currentMirror.reflect(this) + r.symbol.typeSignature.members.toStream + .collect { case s: TermSymbol if !s.isMethod => r.reflectField(s) } + .map{r => + //println(r.symbol) + r.symbol.name.toString.trim -> (if(r.get==null) "" else r.get.toString) + }.toMap + } +} diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index 29686c554..58a855d56 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -18,7 +18,7 @@ package com.gravity.goose -import network.{HtmlFetcher, AbstractHtmlFetcher} +import network.{ HtmlFetcher, AbstractHtmlFetcher } import org.jsoup.nodes.Element import java.util.Date import beans.BeanProperty @@ -27,14 +27,13 @@ import java.net.URL import org.apache.http.util.EntityUtils import org.apache.http.HttpEntity -object Language extends Enumeration { - type Language = Value - //val Get, Set, Add, Delete, Reset = Value - val English = Value("en") - val Chinese = Value("zh") - val Korean = Value("kr") - val Arabic = Value("ar") +object Language { + object English extends Language("en") + object Chinese extends Language("zh") + object Korean extends Language("kr") + object Arabic extends Language("ar") } +case class Language(lang: String) import Language._ @@ -44,134 +43,71 @@ import Language._ * Date: 8/16/11 */ - -class Configuration { - - // Refactory this in a YML file (like Ruby) - def resolveCharSet(url: String, entity: HttpEntity): String = { -// if (contentType == null) { -// encodingType = "UTF-8" -// } else { -// encodingType = contentType.getCharset().name -// } - -/* from andhapp@github - import org.mozilla.universalchardet.UniversalDetector - var encodingType: String = "UTF-8" - try { - encodingType = EntityUtils.getContentCharSet(entity) - - if (encodingType == null) { - - val buf: Array[Byte] = new Array[Byte](2048) - var instream2: InputStream = new ByteArrayInputStream(responseBytes) - var bytesRead: Int = 2048 - var inLoop = true - - detector = new UniversalDetector(null); - - while (inLoop) { - var n: Int = instream2.read(buf) - bytesRead += 2048 - - if (n < 0) inLoop = false - if (inLoop && !detector.isDone()) { - detector.handleData(buf, 0, n) - } - } - - detector.dataEnd() - encodingType = detector.getDetectedCharset() - println("The encoding: " + encodingType) - detector.reset() - } -*/ - - - - var host = new URL(url).getHost() - - host match { - case "www1.folha.uol.com.br" => return "ISO-8859-1" - case "espn.estadao.com.br" => return "ISO-8859-1" - case _ => return Option(EntityUtils.getContentCharSet(entity)) getOrElse "UTF-8" - } - } +case class Configuration( /** - * this is the local storage path used to place images to inspect them, should be writable - */ - @BeanProperty - var language: Language = Language.English + * Local storage path used to place images to inspect them, should be writable + */ + @BeanProperty var language: Language = Language.English, /** - * this is the local storage path used to place images to inspect them, should be writable - */ - @BeanProperty - var localStoragePath: String = "/tmp/goose" + * this is the local storage path used to place images to inspect them, should be writable + */ + @BeanProperty var localStoragePath: String = "/tmp/goose", /** - * What's the minimum bytes for an image we'd accept is, alot of times we want to filter out the author's little images - * in the beginning of the article - */ - @BeanProperty - var minBytesForImages: Int = 4500 + * What's the minimum bytes for an image we'd accept is, alot of times we want to filter out the author's little images + * in the beginning of the article + */ + @BeanProperty var minBytesForImages: Int = 4500, /** * Minimum legal height for an image - smaller than this considered unusable/undesirable */ - @BeanProperty - var minWidth: Int = 120 + @BeanProperty var minWidth: Int = 120, /** * Minimum legal width for an image - smaller than this considered unusable/undesirable */ - @BeanProperty - var minHeight: Int = 120 + @BeanProperty var minHeight: Int = 120, /** - * set this guy to false if you don't care about getting images, otherwise you can either use the default - * image extractor to implement the ImageExtractor interface to build your own - */ - @BeanProperty - var enableImageFetching: Boolean = true + * set this guy to false if you don't care about getting images, otherwise you can either use the default + * image extractor to implement the ImageExtractor interface to build your own + */ + @BeanProperty var enableImageFetching: Boolean = true, /** - * set this guy to false if you don't care about getting All images, otherwise you can either use the default - * image extractor to implement the ImageExtractor interface to build your own - */ - @BeanProperty - var enableAllImagesFetching: Boolean = true + * set this guy to false if you don't care about getting All images, otherwise you can either use the default + * image extractor to implement the ImageExtractor interface to build your own + */ + @BeanProperty var enableAllImagesFetching: Boolean = true, /** - * path to your imagemagick convert executable, on the mac using mac ports this is the default listed - */ - @BeanProperty - //var imagemagickConvertPath: String = "/usr/local/bin/convert" - var imagemagickConvertPath: String = "convert" + * path to your imagemagick convert executable, on the mac using mac ports this is the default listed + */ + @BeanProperty //var imagemagickConvertPath: String = "/usr/local/bin/convert" + var imagemagickConvertPath: String = "convert", /** - * path to your imagemagick identify executable - */ - @BeanProperty - //var imagemagickIdentifyPath: String = "/usr/local/bin/identify" - var imagemagickIdentifyPath: String = "identify" + * path to your imagemagick identify executable + */ + @BeanProperty //var imagemagickIdentifyPath: String = "/usr/local/bin/identify" + var imagemagickIdentifyPath: String = "identify", - @BeanProperty - var connectionTimeout: Int = 10000 // 10 seconds + @BeanProperty var connectionTimeout: Int = 10000 // 10 seconds + , - @BeanProperty - var socketTimeout: Int = 10000 // 10 seconds + @BeanProperty var socketTimeout: Int = 10000 // 10 seconds + , - @BeanProperty - var imageConnectionTimeout: Int = 2000 // 2 seconds + @BeanProperty var imageConnectionTimeout: Int = 2000 // 2 seconds + , - @BeanProperty - var imageSocketTimeout: Int = 5000 // 5 seconds + @BeanProperty var imageSocketTimeout: Int = 5000 // 5 seconds + , /** - * used as the user agent that is sent with your web requests to extract an article - */ - @BeanProperty - var browserUserAgent: String = "Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8" + * used as the user agent that is sent with your web requests to extract an article + */ + @BeanProperty var browserUserAgent: String = "Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8", /** - * sent as the referer header - */ - @BeanProperty - var browserReferer: String = "https://www.google.com" + * sent as the referer header + */ + @BeanProperty var browserReferer: String = "https://www.google.com") { var contentExtractor: ContentExtractor = StandardContentExtractor @@ -192,10 +128,10 @@ class Configuration { } /** - * Pass in to extract article publish dates. - * @param extractor a concrete instance of {@link PublishDateExtractor} - * @throws IllegalArgumentException if the instance passed in is <code>null</code> - */ + * Pass in to extract article publish dates. + * @param extractor a concrete instance of {@link PublishDateExtractor} + * @throws IllegalArgumentException if the instance passed in is <code>null</code> + */ def setPublishDateExtractor(extractor: PublishDateExtractor) { if (extractor == null) throw new IllegalArgumentException("extractor must not be null!") this.publishDateExtractor = extractor @@ -206,10 +142,10 @@ class Configuration { } /** - * Pass in to extract any additional data not defined within {@link Article} - * @param extractor a concrete instance of {@link AdditionalDataExtractor} - * @throws IllegalArgumentException if the instance passed in is <code>null</code> - */ + * Pass in to extract any additional data not defined within {@link Article} + * @param extractor a concrete instance of {@link AdditionalDataExtractor} + * @throws IllegalArgumentException if the instance passed in is <code>null</code> + */ def setAdditionalDataExtractor(extractor: AdditionalDataExtractor) { this.additionalDataExtractor = extractor } @@ -229,4 +165,52 @@ class Configuration { def getHtmlFetcher: AbstractHtmlFetcher = htmlFetcher + // Refactory this in a YML file (like Ruby) + def resolveCharSet(url: String, entity: HttpEntity): String = { + // if (contentType == null) { + // encodingType = "UTF-8" + // } else { + // encodingType = contentType.getCharset().name + // } + + /* from andhapp@github + import org.mozilla.universalchardet.UniversalDetector + var encodingType: String = "UTF-8" + try { + encodingType = EntityUtils.getContentCharSet(entity) + + if (encodingType == null) { + + val buf: Array[Byte] = new Array[Byte](2048) + var instream2: InputStream = new ByteArrayInputStream(responseBytes) + var bytesRead: Int = 2048 + var inLoop = true + + detector = new UniversalDetector(null); + + while (inLoop) { + var n: Int = instream2.read(buf) + bytesRead += 2048 + + if (n < 0) inLoop = false + if (inLoop && !detector.isDone()) { + detector.handleData(buf, 0, n) + } + } + + detector.dataEnd() + encodingType = detector.getDetectedCharset() + println("The encoding: " + encodingType) + detector.reset() + } +*/ + var host = new URL(url).getHost() + + host match { + case "www1.folha.uol.com.br" => return "ISO-8859-1" + case "espn.estadao.com.br" => return "ISO-8859-1" + case _ => return Option(EntityUtils.getContentCharSet(entity)) getOrElse "UTF-8" + } + } + } diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index 4f32e17ff..2b909051f 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -37,7 +37,7 @@ import scala.collection.JavaConversions._ /** * Represents the information we may know of a page we crawl. - * + * * @param config the configuration. * @param url the URL of the page. * @param rawHTML the raw HTML page source -- optional. If not specified, and @@ -47,7 +47,7 @@ import scala.collection.JavaConversions._ * when the page does not report its language. */ case class CrawlCandidate(config: Configuration, url: String, - rawHTML: String = null, lang: String = null) + rawHTML: String = null, lang: String = null) class Crawler(config: Configuration) { @@ -73,7 +73,7 @@ class Crawler(config: Configuration) { article.rawHtml = rawHtml article.doc = doc article.rawDoc = doc.clone - + article.title = extractor.getTitle(article) article.publishDate = config.publishDateExtractor.extract(doc) article.additionalData = config.getAdditionalDataExtractor.extract(doc) @@ -85,12 +85,11 @@ class Crawler(config: Configuration) { // before we do any calcs on the body itself let's clean up the document article.doc = docCleaner.clean(article) - if (article.publishDate == null) { article.publishDate = extractor.getDateFromURL(article.canonicalLink) - } - -// extractor.calculateBestNodeBasedOnClustering(article, config.language) match { + } + + // extractor.calculateBestNodeBasedOnClustering(article, config.language) match { extractor.calculateBestNodeBasedOnClustering(article, lang) match { case Some(node: Element) => { article.movies = extractor.extractVideos(node) @@ -104,9 +103,9 @@ class Crawler(config: Configuration) { article.topImage = new Image } else { article.topImage = imageExtractor.getBestImage(article.rawDoc, node) - if (config.enableAllImagesFetching) { - article.allImages = imageExtractor.getAllImages(node) - } + if (config.enableAllImagesFetching) { + article.allImages = imageExtractor.getAllImages(node) + } } } catch { case e: Exception => { @@ -120,7 +119,6 @@ class Crawler(config: Configuration) { article.cleanedArticleText = outputFormatter.getFormattedText(node, lang) article.htmlArticle = outputFormatter.cleanupHtml(node, lang) - } case _ => trace("NO ARTICLE FOUND") } @@ -178,20 +176,24 @@ class Crawler(config: Configuration) { */ def releaseResources(article: Article) { trace(logPrefix + "STARTING TO RELEASE ALL RESOURCES") - - if (config.getEnableImageFetching) { - val dir: File = new File(config.localStoragePath) - - dir.list.foreach(filename => { - if (filename.startsWith(article.linkhash)) { - val f: File = new File(dir.getAbsolutePath + "/" + filename) - if (!f.delete) { - warn("Unable to remove temp file: " + filename) + if (config.getEnableImageFetching) { + val dir: File = new File(config.localStoragePath) + if (dir.isDirectory && dir.exists) { + val list = dir.list + if (list == null) { + throw new RuntimeException(s"Can't list dir ${dir.getAbsolutePath}") } + list.foreach(filename => { + if (filename.startsWith(article.linkhash)) { + val f: File = new File(dir.getAbsolutePath + "/" + filename) + if (!f.delete) { + warn("Unable to remove temp file: " + filename) + } + } + }) } - }) - } } + } } diff --git a/src/main/scala/com/gravity/goose/Goose.scala b/src/main/scala/com/gravity/goose/Goose.scala index 97d0318d2..b8ff0c7ef 100644 --- a/src/main/scala/com/gravity/goose/Goose.scala +++ b/src/main/scala/com/gravity/goose/Goose.scala @@ -44,7 +44,7 @@ class Goose(var config : Configuration = new Configuration) { * when the page does not report its language. */ def extractContent(url: String, - rawHTML: String = null, lang: String = "en"): Article = { + rawHTML: String = null, lang: String = "all"): Article = { val cc = new CrawlCandidate(config, url, rawHTML, lang) sendToActor(cc) } diff --git a/src/main/scala/com/gravity/goose/images/Image.scala b/src/main/scala/com/gravity/goose/images/Image.scala index bc22e6a63..4e734f325 100644 --- a/src/main/scala/com/gravity/goose/images/Image.scala +++ b/src/main/scala/com/gravity/goose/images/Image.scala @@ -71,4 +71,16 @@ class Image { def getImageSrc = { imageSrc } + + + + override def toString = + s"""Image{ + imageSrc=$imageSrc, + imageScore=$imageScore, + height=$height, + width=$width, + imageExtractionType=$imageExtractionType +}""" + } \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/opengraph/OpenGraphData.scala b/src/main/scala/com/gravity/goose/opengraph/OpenGraphData.scala index 0e9d8cfe6..b1c4bc964 100644 --- a/src/main/scala/com/gravity/goose/opengraph/OpenGraphData.scala +++ b/src/main/scala/com/gravity/goose/opengraph/OpenGraphData.scala @@ -15,8 +15,7 @@ Copyright [2014] Robby Pond */ package com.gravity.goose.opengraph; -class OpenGraphData { - +case class OpenGraphData { var title: String = "" var siteName: String = "" var url: String = "" diff --git a/src/main/scala/com/gravity/goose/text/StopWords.scala b/src/main/scala/com/gravity/goose/text/StopWords.scala index 9f75ab0c2..a7cf65127 100644 --- a/src/main/scala/com/gravity/goose/text/StopWords.scala +++ b/src/main/scala/com/gravity/goose/text/StopWords.scala @@ -78,7 +78,7 @@ object StopWords { stopWords } def getCandidateWords(strippedInput: String, language: String): Array[String] = getCandidateWords(strippedInput, - Language.withName(language)) + Language(language)) def getCandidateWords(strippedInput: String, language: Language): Array[String] = { language match { From 9bfcca37d53925408b1ed6a20b99339b9a8aa4b3 Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Sun, 13 Jul 2014 11:18:52 +0300 Subject: [PATCH 301/347] - pass unique sub-folders to svn import as workaround for MKCOL failure 405: Method Not Allowed << execute svn import -m "binary release" target\publish\com\gravity\goose\ https://raisercostin.googlecode.com/svn/maven2//com/gravity/goose/ svn: E175002: MKCOL request on '/svn/!svn/wrk/e313f3f2-9a98-4543-a376-2021b116d0a4/maven2/com/gravity/goose/goose_2.10' failed: 405 Method Not Allowed >> --- build.sbt | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/build.sbt b/build.sbt index 7ea6be797..49b58352c 100644 --- a/build.sbt +++ b/build.sbt @@ -11,7 +11,7 @@ organization := "com.gravity.goose" name := "goose" -version := "2.2.0" +version := "2.2.1" organizationHomepage := Some(url("http://gravity.com/")) @@ -109,12 +109,28 @@ net.virtualvoid.sbt.graph.Plugin.graphSettings scalacOptions ++= Seq("-unchecked", "-deprecation") //to see https://bitbucket.org/diversit/webdav4sbt -def svnPub = Command.args("svn", "<tag>") { (state, args) => +def svnPublish = Command.args("svnPublish", "<tag>") { (state, args) => + val ver = "2.2.1" val svnUrl = """https://raisercostin.googlecode.com/svn/maven2""" - val tag = s"""svn import -m "binary release" target\\publish\\ $svnUrl """ - println(s"\nexecute $tag") - tag.! + val command = s"""svn import -m "binary release" target\\publish\\com\\gravity\\goose\\goose_2.10\\$ver $svnUrl/com/gravity/goose/goose_2.10/$ver """ + println(s"\nexecute $command") + command.! state } -commands ++= Seq(svnPub) \ No newline at end of file +commands ++= Seq(svnPublish) + +version <<= version { v => //only release *if* -Drelease=true is passed to JVM + val release = Option(System.getProperty("release")) == Some("true") + if (release) { + v + } else { + val suffix = Option(System.getProperty("suffix")) + val i = (v.indexOf('-'), v.length) match { + case (x, l) if x < 0 => l + case (x, l) if v substring (x + 1) matches """\d+""" => l //patch level, not RCx + case (x, _) => x + } + v.substring(0, i) + "-" + (suffix getOrElse "SNAPSHOT") + } +} From 914f759b8ab6cbc50d03ff7e2c7e38587dc0c855 Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Sun, 13 Jul 2014 11:20:10 +0300 Subject: [PATCH 302/347] 2.2.2-SNAPSHOT --- build.sbt | 4 ++-- pom.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.sbt b/build.sbt index 49b58352c..56a69dafd 100644 --- a/build.sbt +++ b/build.sbt @@ -11,7 +11,7 @@ organization := "com.gravity.goose" name := "goose" -version := "2.2.1" +version := "2.2.2-SNAPSHOT" organizationHomepage := Some(url("http://gravity.com/")) @@ -110,7 +110,7 @@ scalacOptions ++= Seq("-unchecked", "-deprecation") //to see https://bitbucket.org/diversit/webdav4sbt def svnPublish = Command.args("svnPublish", "<tag>") { (state, args) => - val ver = "2.2.1" + val ver = "2.2.2-SNAPSHOT" val svnUrl = """https://raisercostin.googlecode.com/svn/maven2""" val command = s"""svn import -m "binary release" target\\publish\\com\\gravity\\goose\\goose_2.10\\$ver $svnUrl/com/gravity/goose/goose_2.10/$ver """ println(s"\nexecute $command") diff --git a/pom.xml b/pom.xml index 5d98761b7..0347761c1 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>com.gravity</groupId> <artifactId>goose</artifactId> - <version>2.2.0</version> + <version>2.2.2-SNAPSHOT</version> <packaging>jar</packaging> <name>goose</name> <url>https://github.com/raisercostin/goose</url> From d64675c969724c8e6f8b37ba742f76dfd2a58343 Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Fri, 8 Aug 2014 15:15:20 +0300 Subject: [PATCH 303/347] - comment out prints - fix exception swallowed through printing just the message - fix testutils temp folder not to depend on windows/linux --- .gitignore | 1 - src/main/scala/com/gravity/goose/FetchMany.scala | 6 ++++-- src/main/scala/com/gravity/goose/JsonMain.scala | 2 +- .../com/gravity/goose/extractors/ContentExtractor.scala | 1 - src/main/scala/com/gravity/goose/text/StopWords.scala | 1 - src/test/scala/com/gravity/goose/AicaiTest.scala | 3 --- src/test/scala/com/gravity/goose/TestUtils.scala | 5 ++++- 7 files changed, 9 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 83cad4e0a..f9ff3a5c3 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,6 @@ target/ /goose.iml /goose.ipr /goose.iws - config/development.scala config/production.scala config/test.scala diff --git a/src/main/scala/com/gravity/goose/FetchMany.scala b/src/main/scala/com/gravity/goose/FetchMany.scala index 0b893e4f4..0fcbaf917 100644 --- a/src/main/scala/com/gravity/goose/FetchMany.scala +++ b/src/main/scala/com/gravity/goose/FetchMany.scala @@ -31,7 +31,9 @@ object FetchMany { } } catch { - case e: Exception => { println(e) } + case e: Exception => { + e.printStackTrace() + } } } out.close @@ -40,7 +42,7 @@ object FetchMany { } catch { case e: Exception => { - System.out.println(e.toString) + e.printStackTrace(); } } } diff --git a/src/main/scala/com/gravity/goose/JsonMain.scala b/src/main/scala/com/gravity/goose/JsonMain.scala index f15d16228..ca60b9e35 100644 --- a/src/main/scala/com/gravity/goose/JsonMain.scala +++ b/src/main/scala/com/gravity/goose/JsonMain.scala @@ -12,7 +12,7 @@ object JsonMain { val json = getArticleAsJson(url) println(json) } catch { - case e: Exception => println(e.toString) + case e: Exception => e.printStackTrace() } } def getArticleAsJson(url: String) = { diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index 29d0c92aa..8f73dd99a 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -355,7 +355,6 @@ trait ContentExtractor { trace(logPrefix + "ParentNode: score='" + e.attr("gravityScore") + "' nodeCount='" + e.attr("gravityNodes") + "' id='" + e.id + "' class='" + e.attr("class") + "' ") val score: Int = getScore(e) - println(score) if (score > topNodeScore) { topNode = e topNodeScore = score diff --git a/src/main/scala/com/gravity/goose/text/StopWords.scala b/src/main/scala/com/gravity/goose/text/StopWords.scala index a7cf65127..3d9886bbe 100644 --- a/src/main/scala/com/gravity/goose/text/StopWords.scala +++ b/src/main/scala/com/gravity/goose/text/StopWords.scala @@ -126,7 +126,6 @@ if (stopWords.size > 0) { tokens = word.getString() :: tokens ; word = mmSeg.next(); } - println(tokens) return tokens; } } \ No newline at end of file diff --git a/src/test/scala/com/gravity/goose/AicaiTest.scala b/src/test/scala/com/gravity/goose/AicaiTest.scala index 28c9dc121..0532c5c7a 100644 --- a/src/test/scala/com/gravity/goose/AicaiTest.scala +++ b/src/test/scala/com/gravity/goose/AicaiTest.scala @@ -34,10 +34,7 @@ class AicaiTest { val url = "http://luoxiaowei.baijia.baidu.com/article/11833" val html = Source.fromURL(url) - - println("tt") val goose = new Goose(config) - val article = goose.extractContent(url) println(article.cleanedArticleText) diff --git a/src/test/scala/com/gravity/goose/TestUtils.scala b/src/test/scala/com/gravity/goose/TestUtils.scala index 9bdf4a3b0..4e38aaf16 100644 --- a/src/test/scala/com/gravity/goose/TestUtils.scala +++ b/src/test/scala/com/gravity/goose/TestUtils.scala @@ -4,6 +4,7 @@ import images.Image import junit.framework.Assert._ import com.gravity.goose.extractors.AdditionalDataExtractor import org.jsoup.nodes.Element +import scala.util.Try /** * Created by Jim Plush @@ -18,7 +19,9 @@ object TestUtils { private val TAB = "\t\t"; val articleReport = new StringBuilder("=======================::. ARTICLE REPORT .::======================\n"); - val DEFAULT_CONFIG: Configuration = new Configuration + val DEFAULT_CONFIG: Configuration = new Configuration( + localStoragePath=Try{java.io.File.createTempFile("temp", null).getParentFile().getAbsolutePath()}.getOrElse(null) + ) //DEFAULT_CONFIG. val NO_IMAGE_CONFIG: Configuration = new Configuration NO_IMAGE_CONFIG.enableImageFetching = false From ef5da5e64ce30059188e17add71bfac8516e7fba Mon Sep 17 00:00:00 2001 From: raisercostin <raisercostin@gmail.com> Date: Sun, 10 Aug 2014 12:00:12 +0300 Subject: [PATCH 304/347] - remove node cloning --- .../scala/com/gravity/goose/Article.scala | 1 - .../outputformatters/OutputFormatter.scala | 9 +- .../com/gravity/goose/statichtml/bug1.html | 1490 +++++++++++++++++ .../com/gravity/goose/TextExtractions.scala | 12 +- 4 files changed, 1507 insertions(+), 5 deletions(-) create mode 100644 src/test/resources/com/gravity/goose/statichtml/bug1.html diff --git a/src/main/scala/com/gravity/goose/Article.scala b/src/main/scala/com/gravity/goose/Article.scala index 96c0eb023..638f7a90c 100644 --- a/src/main/scala/com/gravity/goose/Article.scala +++ b/src/main/scala/com/gravity/goose/Article.scala @@ -186,7 +186,6 @@ class Article { r.symbol.typeSignature.members.toStream .collect { case s: TermSymbol if !s.isMethod => r.reflectField(s) } .map{r => - //println(r.symbol) r.symbol.name.toString.trim -> (if(r.get==null) "" else r.get.toString) }.toMap } diff --git a/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala b/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala index 375fc7a90..e887b3683 100644 --- a/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala +++ b/src/main/scala/com/gravity/goose/outputformatters/OutputFormatter.scala @@ -67,8 +67,9 @@ trait OutputFormatter { */ // def getFormattedText(topNode: Element, language: Language): String = { def getFormattedText(topNode: Element, lang: String): String = { - var node = topNode.clone - + //with clonning replacing text cannot happen since nodes don't have a parent and this trigger exceptions in jsoup: convertLinksToText/item.replaceWith(tn) + //var node = topNode.clone + val node = topNode removeNodesWithNegativeScores(node) convertLinksToText(node) replaceTagsWithText(node) @@ -101,7 +102,9 @@ trait OutputFormatter { */ //def cleanupHtml(topNode: Element, language: Language): String = { def cleanupHtml(topNode: Element, language: String): String = { - val node = topNode.clone + //with clonning replacing text cannot happen since nodes don't have a parent and this trigge + //val node = topNode.clone + val node = topNode removeParagraphsWithFewWords(node, language) convertToHtml(node) } diff --git a/src/test/resources/com/gravity/goose/statichtml/bug1.html b/src/test/resources/com/gravity/goose/statichtml/bug1.html new file mode 100644 index 000000000..09d0d1c2d --- /dev/null +++ b/src/test/resources/com/gravity/goose/statichtml/bug1.html @@ -0,0 +1,1490 @@ +<html> + <head></head> + <body> + <title>Producatori - SC DAROMFARM SRL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + +
+ +
+ +
+

Categorii

+
+ + +
+
+ + +
+

+ Producători +

+
+ +
+
+ + + + +
+

Newsletter

+
+
+

+ +

+

+ + +

+
+
+
+ + +
+

Caută

+ +
+ + + + + + +
+ +
+ + + +

Producători

+

+ Sunt 48 producători. +

+ + + + +
+ +
+ + +
+

+ Coş + +   +

+
+ + + +
+

Nici un produs

+

+ Livrare + 0,00 lei +
+ Total + 0,00 lei +

+

+ Plăteşte +

+
+
+
+ + +
+ + comenzi telefinice + +
+ + +
+ + Urmariti-ne pe facebook + +
+ + + + + +
+

+ Reduceri +

+
+ +

+ Toate reducerile +

+
+
+ + +
+

Caută

+ +
+ + + +
+
+ + +
+ + + + diff --git a/src/test/scala/com/gravity/goose/TextExtractions.scala b/src/test/scala/com/gravity/goose/TextExtractions.scala index 07eb17598..c1c5020cf 100644 --- a/src/test/scala/com/gravity/goose/TextExtractions.scala +++ b/src/test/scala/com/gravity/goose/TextExtractions.scala @@ -382,5 +382,15 @@ class TextExtractions { expectedImage = null) } - + @Test + def bug1() { + // html is not parsed properly + implicit val config = TestUtils.NO_IMAGE_CONFIG + val html = getHtml("bug1.html") + val url: String = "http://www.tulsaworld.com/site/articlepath.aspx?articleid=20111118_61_A16_Opposi344152&rss_lnk=7" + val article = TestUtils.getArticle(url, html) + TestUtils.runArticleAssertions(article = article, + expectedStart = "            Produsele naturale şi ecologice au devenit u", + expectedImage = null) + } } From be2c01f817df2ed49ff34c0675c026d91ef0b99d Mon Sep 17 00:00:00 2001 From: raisercostin Date: Sun, 10 Aug 2014 12:04:39 +0300 Subject: [PATCH 305/347] - update distribution management --- pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pom.xml b/pom.xml index 0347761c1..8644925d9 100644 --- a/pom.xml +++ b/pom.xml @@ -21,6 +21,12 @@ Goose was originally an article extractor written in Java that has most recently http://www.apache.org/licenses/LICENSE-2.0.txt + + + raisercostin-releases + svn:https://raisercostin.googlecode.com/svn/maven2/ + + unfold-release From 404423e905a51928e4b18aefdf23d5af243a0fcd Mon Sep 17 00:00:00 2001 From: raisercostin Date: Sun, 10 Aug 2014 12:05:39 +0300 Subject: [PATCH 306/347] - update distribution management --- pom.xml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 8644925d9..8d1800989 100644 --- a/pom.xml +++ b/pom.xml @@ -26,25 +26,23 @@ Goose was originally an article extractor written in Java that has most recently raisercostin-releases svn:https://raisercostin.googlecode.com/svn/maven2/ - - + unfold-snapshot Unfold Nexus Snapshot Repository http://nexus.unfold.com:8081/nexus/content/repositories/snapshots + --> scm:git:git@github.com:raisercostin/goose.git From c4a939e2b3e50ab2c765a31f5340fd9bb8a5ef93 Mon Sep 17 00:00:00 2001 From: raisercostin Date: Sun, 10 Aug 2014 12:51:57 +0300 Subject: [PATCH 307/347] - mvn pom fixes -- require maven 3.0.4 for build reproducibility -- add log4j to compile for gae in mvn -- add proper jackson dependency on the one compiled with scala 2.10 -- fix directory to be back in target -- source and javadoc attached only when profile release is activated with -Prelease -- upload to svn repository (hosted by google code or any other via extension maven-svn-wagon) --- pom.xml | 95 +++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 65 insertions(+), 30 deletions(-) diff --git a/pom.xml b/pom.xml index 8d1800989..34e922dd3 100644 --- a/pom.xml +++ b/pom.xml @@ -5,6 +5,9 @@ oss-parent 7 + + 3.0.4 + 4.0.0 com.gravity goose @@ -26,6 +29,10 @@ Goose was originally an article extractor written in Java that has most recently raisercostin-releases svn:https://raisercostin.googlecode.com/svn/maven2/ + + raisercostin-snapshots + svn:https://raisercostin.googlecode.com/svn/maven2-snapshots/ + + + log4j + log4j + 1.2.14 + com.google.appengine appengine-api-labs @@ -176,8 +188,8 @@ Goose was originally an article extractor written in Java that has most recently 2.2.2 - com.fasterxml.jackson.core - jackson-module-scala + com.fasterxml.jackson.module + jackson-module-scala_2.10 2.2.2 @@ -206,10 +218,10 @@ Goose was originally an article extractor written in Java that has most recently package + ${project.basedir}/target ${project.artifactId}-${project.version} ${basedir}/src/main/scala ${basedir}/src/test/scala - ${project.basedir}/src/main/scala ${project.basedir}/target/scala-2.10/classes ${project.basedir}/target/scala-2.10/test-classes @@ -304,19 +316,6 @@ Goose was originally an article extractor written in Java that has most recently
- - org.apache.maven.plugins - maven-source-plugin - 2.2.1 - - - attach-sources - - jar - - - - org.codehaus.mojo build-helper-maven-plugin @@ -378,19 +377,6 @@ Goose was originally an article extractor written in Java that has most recently - - org.apache.maven.plugins - maven-javadoc-plugin - 2.8 - - - attach-javadocs - - jar - - - - org.apache.maven.plugins maven-jar-plugin @@ -433,6 +419,7 @@ Goose was originally an article extractor written in Java that has most recently maven-deploy-plugin 2.8.1 + +
+ + + com.google.code.maven-svn-wagon + maven-svn-wagon + 1.4 + +
- \ No newline at end of file + + + release + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.9.1 + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-source-plugin + 2.3 + + + attach-sources + + jar + + + + + + + + + From 70f7a25b04f57df18d768c2ef7ffa376c0426d12 Mon Sep 17 00:00:00 2001 From: raisercostin Date: Sun, 10 Aug 2014 12:56:14 +0300 Subject: [PATCH 308/347] ignore parent --- pom.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pom.xml b/pom.xml index 34e922dd3..e6cd4fd86 100644 --- a/pom.xml +++ b/pom.xml @@ -1,10 +1,12 @@ + 3.0.4 From e60aa50d6cd979c0ba3163b74c93663efabb0721 Mon Sep 17 00:00:00 2001 From: raisercostin Date: Sun, 10 Aug 2014 13:00:51 +0300 Subject: [PATCH 309/347] [maven-release-plugin] prepare release goose-2.2.2 --- pom.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index e6cd4fd86..2d389bdfa 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ 4.0.0 com.gravity goose - 2.2.2-SNAPSHOT + 2.2.2 jar goose https://github.com/raisercostin/goose @@ -58,7 +58,8 @@ Goose was originally an article extractor written in Java that has most recently scm:git:git@github.com:raisercostin/goose.git https://github.com/raisercostin/goose - + goose-2.2.2 + jiminoc From 0a1c2dfb54ba265b7a61a1103e899afa433d93e5 Mon Sep 17 00:00:00 2001 From: raisercostin Date: Sun, 10 Aug 2014 13:01:19 +0300 Subject: [PATCH 310/347] [maven-release-plugin] rollback the release of goose-2.2.2 --- pom.xml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 2d389bdfa..e6cd4fd86 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ 4.0.0 com.gravity goose - 2.2.2 + 2.2.2-SNAPSHOT jar goose https://github.com/raisercostin/goose @@ -58,8 +58,7 @@ Goose was originally an article extractor written in Java that has most recently scm:git:git@github.com:raisercostin/goose.git https://github.com/raisercostin/goose - goose-2.2.2 - + jiminoc From b9c2c4c468b21171fb3a1a7ab9b111c9efc54743 Mon Sep 17 00:00:00 2001 From: raisercostin Date: Sun, 10 Aug 2014 13:11:59 +0300 Subject: [PATCH 311/347] - add git --- pom.xml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index e6cd4fd86..5874dd690 100644 --- a/pom.xml +++ b/pom.xml @@ -54,10 +54,11 @@ Goose was originally an article extractor written in Java that has most recently --> - scm:git:git@github.com:raisercostin/goose.git - scm:git:git@github.com:raisercostin/goose.git - - https://github.com/raisercostin/goose + + scm:git:https://github.com/raisercostin/goose.git + scm:git:https://github.com/raisercostin/goose.git + https://github.com/raisercostin/goose.git + HEAD From 117a7da86f6955ec66d7ab7d1b28f7ca5c17c3cb Mon Sep 17 00:00:00 2001 From: raisercostin Date: Sun, 10 Aug 2014 13:13:14 +0300 Subject: [PATCH 312/347] [maven-release-plugin] prepare release goose-2.2.2 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 5874dd690..49cd684e5 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ 4.0.0 com.gravity goose - 2.2.2-SNAPSHOT + 2.2.2 jar goose https://github.com/raisercostin/goose @@ -58,7 +58,7 @@ Goose was originally an article extractor written in Java that has most recently scm:git:https://github.com/raisercostin/goose.git scm:git:https://github.com/raisercostin/goose.git https://github.com/raisercostin/goose.git - HEAD + goose-2.2.2 From a923cbe855338962bdb088b2e58595425b81f507 Mon Sep 17 00:00:00 2001 From: raisercostin Date: Sun, 10 Aug 2014 13:13:22 +0300 Subject: [PATCH 313/347] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 49cd684e5..880113d79 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ 4.0.0 com.gravity goose - 2.2.2 + 2.2.3-SNAPSHOT jar goose https://github.com/raisercostin/goose @@ -58,7 +58,7 @@ Goose was originally an article extractor written in Java that has most recently scm:git:https://github.com/raisercostin/goose.git scm:git:https://github.com/raisercostin/goose.git https://github.com/raisercostin/goose.git - goose-2.2.2 + HEAD From 895c6fa93643778ca3cb47b0544eb561a26ea86c Mon Sep 17 00:00:00 2001 From: raisercostin Date: Sun, 10 Aug 2014 13:19:10 +0300 Subject: [PATCH 314/347] - follow scala release name convention --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 880113d79..9c8c72119 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ 4.0.0 com.gravity - goose + goose_2.10 2.2.3-SNAPSHOT jar goose From a405f047670ed59c741fb2b6ef2046b1bf750eeb Mon Sep 17 00:00:00 2001 From: raisercostin Date: Sun, 10 Aug 2014 13:21:13 +0300 Subject: [PATCH 315/347] - describe release process --- README.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3468a16a3..e11142dad 100644 --- a/README.md +++ b/README.md @@ -71,9 +71,8 @@ To run the junit tests, kick off the sbt test target: Note that there are currently problems in the tests. (8 failures in 41 tests on 2014-07-10 - raisercostin) ##Usage as a maven dependency -Last version (goose_2.10-2.2.0.jar) is hosted at http://raisercostin.googlecode.com/svn/maven2/com/gravity/goose/ - +Last version (goose_2.10-2.2.0.jar) is hosted at http://raisercostin.googlecode.com/svn/maven2/com/gravity/goose/ Goose is hosted on Sonatype's OSS repository, https://oss.sonatype.org/content/repositories/releases/com/gravity/goose/ @@ -102,3 +101,19 @@ We made sure it was still nice and operable from Java as well so if you're using The stopword lists introduced in the [Python-Goose project](https://github.com/grangier/python-goose) have been incorporated into Goose. + +##Release +- release with standard maven process at http://raisercostin.googlecode.com/svn/maven2/com/gravity/goose/ + + mvn release:prepare -Prelease -DskipTests -Darguments="-DskipTests -Prelease" + mvn release:perform -Prelease -DskipTests -Darguments="-DskipTests -Prelease" + +- configure your ~/.m2/settings.xml as + + + + raisercostin-releases + svn-user + svn-pass + + \ No newline at end of file From d03f7bd74a1cd6c564d35f57a1b9e7e961c5b488 Mon Sep 17 00:00:00 2001 From: raisercostin Date: Sun, 10 Aug 2014 13:35:40 +0300 Subject: [PATCH 316/347] - fix pom groupId and artifactId --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9c8c72119..1accc1769 100644 --- a/pom.xml +++ b/pom.xml @@ -11,7 +11,7 @@ 3.0.4 4.0.0 - com.gravity + com.gravity.goose goose_2.10 2.2.3-SNAPSHOT jar From 9d24433fbf3c0fd365003adc975eded4db6e5790 Mon Sep 17 00:00:00 2001 From: raisercostin Date: Sun, 10 Aug 2014 13:36:38 +0300 Subject: [PATCH 317/347] [maven-release-plugin] prepare release goose_2.10-2.2.3 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 1accc1769..e37b46935 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ 4.0.0 com.gravity.goose goose_2.10 - 2.2.3-SNAPSHOT + 2.2.3 jar goose https://github.com/raisercostin/goose @@ -58,7 +58,7 @@ Goose was originally an article extractor written in Java that has most recently scm:git:https://github.com/raisercostin/goose.git scm:git:https://github.com/raisercostin/goose.git https://github.com/raisercostin/goose.git - HEAD + goose_2.10-2.2.3 From 8d191860144b000225f8451dba6b75caa42b6260 Mon Sep 17 00:00:00 2001 From: raisercostin Date: Sun, 10 Aug 2014 13:36:46 +0300 Subject: [PATCH 318/347] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index e37b46935..54af62406 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ 4.0.0 com.gravity.goose goose_2.10 - 2.2.3 + 2.2.4-SNAPSHOT jar goose https://github.com/raisercostin/goose @@ -58,7 +58,7 @@ Goose was originally an article extractor written in Java that has most recently scm:git:https://github.com/raisercostin/goose.git scm:git:https://github.com/raisercostin/goose.git https://github.com/raisercostin/goose.git - goose_2.10-2.2.3 + HEAD From dbd26ee5ba21bb2be8e293bf038b1e40c14a34ef Mon Sep 17 00:00:00 2001 From: jasongoodwin Date: Sun, 7 Sep 2014 11:30:26 -0400 Subject: [PATCH 319/347] upgrade scala --- build.sbt | 6 +++--- src/main/scala/com/gravity/goose/Configuration.scala | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build.sbt b/build.sbt index 1bcdb2b81..5f16c73ab 100644 --- a/build.sbt +++ b/build.sbt @@ -1,8 +1,8 @@ name := "goose" -version := "2.2.0-SNAPSHOT" +version := "2.2.1-SNAPSHOT" -scalaVersion := "2.10.2" +scalaVersion := "2.11.1" libraryDependencies ++= Seq( "org.slf4j" % "slf4j-api" % "1.7.6", @@ -12,7 +12,7 @@ libraryDependencies ++= Seq( "org.apache.httpcomponents" % "httpclient" % "4.1.2", "commons-io" % "commons-io" % "2.0.1", "commons-lang" % "commons-lang" % "2.6", - "org.scalatest" %% "scalatest" % "2.1.0" % "test", + "org.scalatest" %% "scalatest" % "2.2.1" % "test", "junit" % "junit" % "4.8.1" % "test", "com.novocode" % "junit-interface" % "0.10" % "test" ) diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index 20ce4653a..fdf3499d0 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -21,7 +21,7 @@ package com.gravity.goose import network.{HtmlFetcher, AbstractHtmlFetcher} import org.jsoup.nodes.Element import java.util.Date -import reflect.BeanProperty +import scala.beans.BeanProperty import com.gravity.goose.extractors.{StandardContentExtractor, ContentExtractor, AdditionalDataExtractor, PublishDateExtractor} From 28365f95b16353134618d0771d76e0ab06223320 Mon Sep 17 00:00:00 2001 From: jasongoodwin Date: Tue, 9 Sep 2014 14:42:28 -0400 Subject: [PATCH 320/347] checkin org in build sbt --- build.sbt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 5f16c73ab..8037eb204 100644 --- a/build.sbt +++ b/build.sbt @@ -1,5 +1,7 @@ name := "goose" - + +organization := "com.gravity" + version := "2.2.1-SNAPSHOT" scalaVersion := "2.11.1" From c256c403d0b603e014a0069c5aa6598f7a2a355f Mon Sep 17 00:00:00 2001 From: Nick Ward Date: Sat, 11 Oct 2014 11:05:59 +0100 Subject: [PATCH 321/347] Working with SBT and Scala 2.11.2 --- README.md | 11 +- build.sbt | 31 ++++ pom.xml | 154 ------------------ .../com/gravity/goose/Configuration.scala | 4 +- .../com/gravity/goose/utils/URLHelper.scala | 13 +- .../scala/com/gravity/goose/GooseTest.scala | 26 +-- 6 files changed, 52 insertions(+), 187 deletions(-) create mode 100644 build.sbt delete mode 100644 pom.xml diff --git a/README.md b/README.md index 47af399be..6bdf224cb 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ #Goose - Article Extractor +## This is a fork + +If you haven't guessed already, this is a fork of the wonderful [Goose library](http://github.com/GravityLabs/goose) by Gravity Labs. The original repo hasn't been updated for 2 years now, and I wanted to get the project up an running with the latest release of Scala using sbt instead of Maven (there have been a few pull requests in the past for moving to sbt but they have not been accepted and appear to also be dorment). + ##Intro @@ -38,9 +42,8 @@ Goose is licensed by Gravity.com under the Apache 2.0 license, see the LICENSE f ##Take it for a spin To use goose from the command line: - cd into the goose directory - mvn compile - MAVEN_OPTS="-Xms256m -Xmx2000m"; mvn exec:java -Dexec.mainClass=com.gravity.goose.TalkToMeGoose -Dexec.args="http://techcrunch.com/2011/05/13/native-apps-or-web-apps-particle-code-wants-you-to-do-both/" -e -q > ~/Desktop/gooseresult.txt + sbt + run http://your.url.here ##Regarding the port from JAVA to Scala @@ -55,4 +58,4 @@ Here are some of the reasons for the port to Scala: ##Issues It was a pretty fast Java to Scala port so lots of the nicities of the Scala language aren't in the codebase yet, but those will come over the coming months as we re-write alot of the internal methods to be more Scalesque. -We made sure it was still nice and operable from Java as well so if you're using goose from java you still should be able to use it with a few changes to the method signatures. \ No newline at end of file +We made sure it was still nice and operable from Java as well so if you're using goose from java you still should be able to use it with a few changes to the method signatures. diff --git a/build.sbt b/build.sbt new file mode 100644 index 000000000..f4794ba4e --- /dev/null +++ b/build.sbt @@ -0,0 +1,31 @@ +name := "Goose" + +version := "2.1.22-SNAPSHOT" + +organization := "com.gravity" + +organizationHomepage := Some(url("http://gravity.com/")) + +homepage := Some(url("https://github.com/GravityLabs/goose")) + +description := "Html Content / Article Extractor in Scala" + +licenses += "Apache2" -> url("http://www.apache.org/licenses/") + +scalaVersion := "2.11.2" + +scalacOptions ++= Seq("-unchecked", "-deprecation") + +libraryDependencies ++= Seq( + // Main dependencies + "org.slf4j" % "slf4j-simple" % "1.6.1", + "org.jsoup" % "jsoup" % "1.5.2", + "commons-io" % "commons-io" % "2.0.1", + "org.apache.httpcomponents" % "httpclient" % "4.1.2", + "commons-lang" % "commons-lang" % "2.6", + // Testing dependencies + "com.novocode" % "junit-interface" % "0.9" % Test, + "org.slf4j" % "slf4j-log4j12" % "1.6.1" % Test, + // Build dependencies + "org.slf4j" % "slf4j-api" % "1.6.1" % Compile +) diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 9fef84cba..000000000 --- a/pom.xml +++ /dev/null @@ -1,154 +0,0 @@ - - 4.0.0 - - com.gravity - goose - 2.1.22 - jar - goose - http://maven.apache.org - - UTF-8 - - - - - junit - junit - 4.8.1 - test - - - org.slf4j - slf4j-api - 1.6.1 - jar - compile - - - org.slf4j - slf4j-log4j12 - 1.6.1 - test - - - org.jsoup - jsoup - 1.5.2 - - - commons-io - commons-io - 2.0.1 - - - - org.scala-lang - scala-compiler - 2.9.0-1 - compile - - - - org.scala-lang - scala-library - 2.9.0-1 - - - - org.apache.httpcomponents - httpclient - 4.1.2 - - - commons-lang - commons-lang - 2.6 - - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - 2.6 - - false - true - - **/*Test.* - - - **/*IT.* - - - - - org.scala-tools - maven-scala-plugin - 2.14.3 - - UTF-8 - - -Xmx1024m - - - - - compile - - compile - - compile - - - test-compile - - testCompile - - test-compile - - - process-resources - - compile - - - - - - - org.apache.maven.plugins - maven-source-plugin - 2.1.2 - - - attach-sources - - jar - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.8 - - - attach-javadocs - - jar - - - - - - - - \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index 20ce4653a..548835063 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -21,7 +21,7 @@ package com.gravity.goose import network.{HtmlFetcher, AbstractHtmlFetcher} import org.jsoup.nodes.Element import java.util.Date -import reflect.BeanProperty +import scala.beans.BeanProperty import com.gravity.goose.extractors.{StandardContentExtractor, ContentExtractor, AdditionalDataExtractor, PublishDateExtractor} @@ -124,4 +124,4 @@ class Configuration { def getHtmlFetcher: AbstractHtmlFetcher = htmlFetcher -} \ No newline at end of file +} diff --git a/src/main/scala/com/gravity/goose/utils/URLHelper.scala b/src/main/scala/com/gravity/goose/utils/URLHelper.scala index e6966648f..cd8881970 100644 --- a/src/main/scala/com/gravity/goose/utils/URLHelper.scala +++ b/src/main/scala/com/gravity/goose/utils/URLHelper.scala @@ -21,6 +21,7 @@ package com.gravity.goose.utils import com.gravity.goose.text.{StringReplacement, HashUtils} import java.net.{URI, MalformedURLException, URL} import org.apache.http.client.methods.HttpGet +import java.io.{StringWriter,PrintWriter} /** * Created by Jim Plush @@ -57,13 +58,21 @@ object URLHelper extends Logging { urlToCrawl, unknown.getClass.getCanonicalName, unknown.getMessage, - unknown.getStackTraceString) + getStackTraceString(unknown)) None } } } + def getStackTraceString(e: Exception) = { + val stringWriter = new StringWriter + val printWriter = new PrintWriter(stringWriter) + e.printStackTrace(printWriter) + stringWriter.toString + } + + def tryToURL(url: String): Option[URL] = { val finalUrl = if (url.contains("#!")) { ESCAPED_FRAGMENT_REPLACEMENT.replaceAll(url) @@ -98,4 +107,4 @@ object URLHelper extends Logging { case None => None } } -} \ No newline at end of file +} diff --git a/src/test/scala/com/gravity/goose/GooseTest.scala b/src/test/scala/com/gravity/goose/GooseTest.scala index 7235a34ef..3dff688b3 100644 --- a/src/test/scala/com/gravity/goose/GooseTest.scala +++ b/src/test/scala/com/gravity/goose/GooseTest.scala @@ -2,8 +2,6 @@ package com.gravity.goose import org.junit.Test import org.junit.Assert._ -import scala.actors.Future -import scala.actors.Futures._ /** * Created by Jim Plush @@ -13,28 +11,6 @@ import scala.actors.Futures._ class GooseTest { - @Test - def gooseTest() { - - - // implicit val config = new Configuration - // val url = "http://techcrunch.com/2011/08/13/2005-zuckerberg-didnt-want-to-take-over-the-world/" - // val goose = new Goose(config) - // val article = goose.extractContent(url) - // - // println("\nFINAL TALLY") - // println("\nTEXT: \n" + article.cleanedArticleText) - // println("\nIMAGE: "+ article.topImage.getImageSrc) - // - // val url2 = "http://www.readwriteweb.com/archives/hewlett-packard_kills_webos_devices_to_save_webos.php" - // val article2 = goose.extractContent(url2) - // - // println("\nFINAL TALLY") - // println("\nTEXT: \n" + article2.cleanedArticleText) - // println("\nIMAGE: "+ article2.topImage.getImageSrc) - - } - @Test def badlink() { implicit val config = new Configuration @@ -45,4 +21,4 @@ class GooseTest { } -} \ No newline at end of file +} From 6464af9ab0a1c14884979b27f91f51d346f25719 Mon Sep 17 00:00:00 2001 From: Nick Ward Date: Sat, 11 Oct 2014 11:40:13 +0100 Subject: [PATCH 322/347] Update readme --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6bdf224cb..e4cf58a52 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,9 @@ ## This is a fork -If you haven't guessed already, this is a fork of the wonderful [Goose library](http://github.com/GravityLabs/goose) by Gravity Labs. The original repo hasn't been updated for 2 years now, and I wanted to get the project up an running with the latest release of Scala using sbt instead of Maven (there have been a few pull requests in the past for moving to sbt but they have not been accepted and appear to also be dorment). +If you haven't guessed already, this is a fork of the wonderful [Goose library](http://github.com/GravityLabs/goose) by Gravity Labs. The original repo hasn't been updated for 2 years now, and I wanted to get the project up an running with the latest release of Scala using sbt instead of Maven + +There have been quite [a few nice pull requests](https://github.com/GravityLabs/goose/pulls) that are lying dormant, so have started to integrate these. ##Intro From 78a71d6ed5d368c4500793153d43632270e3e8bc Mon Sep 17 00:00:00 2001 From: Nick Ward Date: Mon, 13 Oct 2014 18:17:31 +0100 Subject: [PATCH 323/347] Sonatype repo management --- README.md | 10 ++++++++-- build.sbt | 21 +++++++++++++++++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e4cf58a52..2ff0c1c50 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,15 @@ ## This is a fork -If you haven't guessed already, this is a fork of the wonderful [Goose library](http://github.com/GravityLabs/goose) by Gravity Labs. The original repo hasn't been updated for 2 years now, and I wanted to get the project up an running with the latest release of Scala using sbt instead of Maven +If you haven't guessed already, this is a fork of the wonderful [Goose library](http://github.com/GravityLabs/goose) by Gravity Labs. The original repo hasn't been updated for 2 years now, and there have been quite [a few nice pull requests](https://github.com/GravityLabs/goose/pulls) that are lying dormant. -There have been quite [a few nice pull requests](https://github.com/GravityLabs/goose/pulls) that are lying dormant, so have started to integrate these. +The project now uses sbt, and is hosted on Sonatype. Add the following to to your `build.sbt` to pull it in: + +``` +libraryDependencies ++= Seq("com.gravity" %% "goose" % "2.1.25-SNAPSHOT") + +resolvers += Resolver.sonatypeRepo("public") +``` ##Intro diff --git a/build.sbt b/build.sbt index f4794ba4e..711e6cbb4 100644 --- a/build.sbt +++ b/build.sbt @@ -1,12 +1,12 @@ name := "Goose" -version := "2.1.22-SNAPSHOT" +version := "2.1.25-SNAPSHOT" organization := "com.gravity" organizationHomepage := Some(url("http://gravity.com/")) -homepage := Some(url("https://github.com/GravityLabs/goose")) +homepage := Some(url("https://github.com/warrd/goose-fork")) description := "Html Content / Article Extractor in Scala" @@ -29,3 +29,20 @@ libraryDependencies ++= Seq( // Build dependencies "org.slf4j" % "slf4j-api" % "1.6.1" % Compile ) + +publishMavenStyle := true + +publishTo := { + val nexus = "https://oss.sonatype.org/" + if (isSnapshot.value) + Some("snapshots" at nexus + "content/repositories/snapshots") + else + Some("releases" at nexus + "service/local/staging/deploy/maven2") +} + +pomExtra := ( + + git@github.com:warrd/goose-fork.git + scm:git:git@github.com:warrd/goose-fork.git + +) From f49218c5c272449ff19a51db90d952150c95b91d Mon Sep 17 00:00:00 2001 From: Nick Ward Date: Tue, 14 Oct 2014 09:37:30 +0100 Subject: [PATCH 324/347] Extract open graph timestamps, tags and section --- build.sbt | 1 + .../scala/com/gravity/goose/Article.scala | 6 +-- .../com/gravity/goose/Configuration.scala | 4 +- .../extractors/OpenGraphDataExtractor.scala | 43 ++++++++++--------- .../extractors/PublishDateExtractor.scala | 14 +++--- .../gravity/goose/network/HtmlFetcher.scala | 2 +- .../goose/opengraph/OpenGraphData.scala | 9 +++- 7 files changed, 44 insertions(+), 35 deletions(-) diff --git a/build.sbt b/build.sbt index 711e6cbb4..152d8e44f 100644 --- a/build.sbt +++ b/build.sbt @@ -23,6 +23,7 @@ libraryDependencies ++= Seq( "commons-io" % "commons-io" % "2.0.1", "org.apache.httpcomponents" % "httpclient" % "4.1.2", "commons-lang" % "commons-lang" % "2.6", + "com.github.nscala-time" %% "nscala-time" % "1.4.0", // Testing dependencies "com.novocode" % "junit-interface" % "0.9" % Test, "org.slf4j" % "slf4j-log4j12" % "1.6.1" % Test, diff --git a/src/main/scala/com/gravity/goose/Article.scala b/src/main/scala/com/gravity/goose/Article.scala index 6e0bddaa2..76e1f4206 100644 --- a/src/main/scala/com/gravity/goose/Article.scala +++ b/src/main/scala/com/gravity/goose/Article.scala @@ -20,8 +20,8 @@ package com.gravity.goose import images.Image import org.jsoup.nodes.{Element, Document} -import java.util.Date import scala.collection._ +import com.github.nscala_time.time.Imports._ import com.gravity.goose.opengraph.OpenGraphData /** @@ -114,7 +114,7 @@ class Article { /** * Sometimes useful to try and know when the publish date of an article was */ - var publishDate: Date = null + var publishDate: DateTime = null /** * A property bucket for consumers of goose to store custom data extractions. @@ -128,4 +128,4 @@ class Article { * Facebook Open Graph data that that is found in Article Meta tags */ var openGraphData: OpenGraphData = null -} \ No newline at end of file +} diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index 37ea1b843..8e508b7ae 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -20,7 +20,7 @@ package com.gravity.goose import network.{HtmlFetcher, AbstractHtmlFetcher} import org.jsoup.nodes.Element -import java.util.Date +import com.github.nscala_time.time.Imports._ import scala.beans.BeanProperty import com.gravity.goose.extractors._ @@ -77,7 +77,7 @@ class Configuration { var contentExtractor: ContentExtractor = StandardContentExtractor var publishDateExtractor: PublishDateExtractor = new PublishDateExtractor { - def extract(rootElement: Element): Date = { + def extract(rootElement: Element): DateTime = { null } } diff --git a/src/main/scala/com/gravity/goose/extractors/OpenGraphDataExtractor.scala b/src/main/scala/com/gravity/goose/extractors/OpenGraphDataExtractor.scala index 77b8dc7e1..616e50551 100644 --- a/src/main/scala/com/gravity/goose/extractors/OpenGraphDataExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/OpenGraphDataExtractor.scala @@ -19,32 +19,33 @@ import org.jsoup.nodes.Element import scala.collection.JavaConversions._ import com.gravity.goose.opengraph.OpenGraphData +import org.joda.time.format.ISODateTimeFormat class OpenGraphDataExtractor extends Extractor[OpenGraphData] { def extract(rootElement: Element): OpenGraphData = { val openGraphData: OpenGraphData = new OpenGraphData - val elements : scala.collection.mutable.Buffer[Element] = rootElement.select("meta") - for(el <- elements) { - if(el.attr("property") == "og:title") - openGraphData.title = el.attr("content") - if(el.attr("property") == "og:site_name") - openGraphData.siteName = el.attr("content") - if(el.attr("property") == "og:url") - openGraphData.url = el.attr("content") - if(el.attr("property") == "og:description") - openGraphData.description = el.attr("content") - if(el.attr("property") == "og:image") - openGraphData.image = el.attr("content") - if(el.attr("property") == "og:type") - openGraphData.ogType = el.attr("content") - if(el.attr("property") == "og:locale") - openGraphData.locale = el.attr("content") - if(el.attr("property") == "article:author") - openGraphData.author = el.attr("content") - if(el.attr("property") == "article:publisher") - openGraphData.publisher = el.attr("content") + val dateParser = ISODateTimeFormat.dateTimeParser + for(el <- rootElement.select("meta")) { + val property = el.attr("property") + val value = el.attr("content") + property match { + case "og:title" => openGraphData.title = value + case "og:site_name" => openGraphData.siteName = value + case "og:url" => openGraphData.url = value + case "og:description" => openGraphData.description = value + case "og:image" => openGraphData.image = value + case "og:type" => openGraphData.ogType = value + case "og:locale" => openGraphData.locale = value + case "article:author" => openGraphData.author = value + case "article:publisher" => openGraphData.publisher = value + case "article:section" => openGraphData.section = value + case "article:tag" => openGraphData.tags ++= value.split(",").map(_.trim) + case "article:published_time" => openGraphData.publishedTime = dateParser.parseDateTime(value) + case "article:modified_time" => openGraphData.modifiedTime = dateParser.parseDateTime(value) + case _ => () + } } openGraphData } -} \ No newline at end of file +} diff --git a/src/main/scala/com/gravity/goose/extractors/PublishDateExtractor.scala b/src/main/scala/com/gravity/goose/extractors/PublishDateExtractor.scala index aa8e1ae04..1ac535724 100644 --- a/src/main/scala/com/gravity/goose/extractors/PublishDateExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/PublishDateExtractor.scala @@ -18,10 +18,10 @@ package com.gravity.goose.extractors import org.jsoup.nodes.Element -import java.util.Date +import com.github.nscala_time.time.Imports._ /** -* Implement this class to extract the {@link Date} of when this article was published. +* Implement this class to extract the {@link DateTime} of when this article was published. */ /** * Created by IntelliJ IDEA. @@ -29,15 +29,15 @@ import java.util.Date * Date: 5/19/11 * Time: 2:50 PM */ -abstract class PublishDateExtractor extends Extractor[Date] { +abstract class PublishDateExtractor extends Extractor[DateTime] { /** - * Intended to search the DOM and identify the {@link Date} of when this article was published. - *

This will be called by the {@link com.jimplush.goose.ContentExtractor#extractContent(String)} method and will be passed to {@link com.jimplush.goose.Article#setPublishDate(java.util.Date)}

+ * Intended to search the DOM and identify the {@link DateTime} of when this article was published. + *

This will be called by the {@link com.jimplush.goose.ContentExtractor#extractContent(String)} method and will be passed to {@link com.jimplush.goose.Article#setPublishDate(org.joda.time.DateTime)}

* * @param rootElement passed in from the {@link com.jimplush.goose.ContentExtractor} after the article has been parsed - * @return {@link Date} of when this particular article was published or null if no date could be found. + * @return {@link DateTime} of when this particular article was published or null if no date could be found. */ - def extract(rootElement: Element): Date + def extract(rootElement: Element): DateTime } diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index 34ebf44a7..7c29d6fe3 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -44,8 +44,8 @@ import java.net.SocketException import java.net.SocketTimeoutException import java.net.URLConnection import java.util.ArrayList -import java.util.Date import java.util.List +import java.util.Date import com.gravity.goose.utils.Logging import com.gravity.goose.Configuration import org.apache.http.impl.client.{DefaultHttpRequestRetryHandler, AbstractHttpClient, DefaultHttpClient} diff --git a/src/main/scala/com/gravity/goose/opengraph/OpenGraphData.scala b/src/main/scala/com/gravity/goose/opengraph/OpenGraphData.scala index 0e9d8cfe6..ddbf046f2 100644 --- a/src/main/scala/com/gravity/goose/opengraph/OpenGraphData.scala +++ b/src/main/scala/com/gravity/goose/opengraph/OpenGraphData.scala @@ -15,6 +15,9 @@ Copyright [2014] Robby Pond */ package com.gravity.goose.opengraph; +import scala.collection.mutable.Set +import com.github.nscala_time.time.Imports._ + class OpenGraphData { var title: String = "" @@ -23,7 +26,11 @@ class OpenGraphData { var description: String = "" var image: String = "" var ogType: String = "" - var locale: String = "en_US" + var locale: String = "" var author: String = "" var publisher: String = "" + var publishedTime : DateTime = null + var modifiedTime : DateTime = null + var tags : Set[String] = Set() + var section : String = "" } From 8b709f6670859e460952c744d1f086c61fc9787d Mon Sep 17 00:00:00 2001 From: Nick Ward Date: Tue, 14 Oct 2014 10:38:12 +0100 Subject: [PATCH 325/347] Use open graph data if available to parse publish date --- src/main/scala/com/gravity/goose/Configuration.scala | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index 8e508b7ae..afd2888e2 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -18,6 +18,7 @@ package com.gravity.goose +import scala.collection.JavaConversions._ import network.{HtmlFetcher, AbstractHtmlFetcher} import org.jsoup.nodes.Element import com.github.nscala_time.time.Imports._ @@ -78,6 +79,10 @@ class Configuration { var publishDateExtractor: PublishDateExtractor = new PublishDateExtractor { def extract(rootElement: Element): DateTime = { + // Try to retrieve publish time from open graph data + val dateParser = org.joda.time.format.ISODateTimeFormat.dateTimeParser + for (el <- rootElement.select("meta[property=article:published_time]")) + return dateParser.parseDateTime(el.attr("content")) null } } From 5523fda370ea61e7d9fd927a07e8434f25d99880 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Marques=20Vieira?= Date: Mon, 27 Oct 2014 11:41:52 +0000 Subject: [PATCH 326/347] Remove unused StandardImageExtractor --- .../goose/images/StandardImageExtractor.scala | 669 ------------------ .../images/UpgradedImageIExtractor.scala | 4 +- 2 files changed, 3 insertions(+), 670 deletions(-) delete mode 100644 src/main/scala/com/gravity/goose/images/StandardImageExtractor.scala diff --git a/src/main/scala/com/gravity/goose/images/StandardImageExtractor.scala b/src/main/scala/com/gravity/goose/images/StandardImageExtractor.scala deleted file mode 100644 index d19eeef58..000000000 --- a/src/main/scala/com/gravity/goose/images/StandardImageExtractor.scala +++ /dev/null @@ -1,669 +0,0 @@ -/** - * Licensed to Gravity.com under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. Gravity.com licenses this file - * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.gravity.goose.images - -import org.jsoup.select.Elements -import org.apache.http.protocol.{BasicHttpContext, HttpContext} -import org.apache.http.client.protocol.ClientContext -import org.apache.http.{Header, HttpEntity, HttpResponse} -import org.apache.http.client.HttpClient -import org.jsoup.nodes.{Element, Document} -import com.gravity.goose.{Article, Configuration} -import java.util.ArrayList -import collection.mutable.HashMap -import scala.collection.JavaConversions._ -import com.gravity.goose.text.string -import java.net.{MalformedURLException, URL} -import com.gravity.goose.network.HtmlFetcher -import java.io.{IOException, File} -import java.util.regex.{Pattern, Matcher} -import org.apache.http.client.methods.HttpGet - -/** -* Created by Jim Plush -* User: jim -* Date: 8/18/11 -*/ - -case class DepthTraversal(node: Element, parentDepth: Int, siblingDepth: Int) - -/** -* This image extractor will attempt to find the best image nearest the article. -* Unfortunately this is a slow process since we're actually downloading the image itself -* to inspect it's actual height/width and area metrics since most of the time these aren't -* in the image tags themselves or can be falsified. -* We'll weight the images in descending order depending on how high up they are compared to the top node content -* -* //todo this is a straight java to scala conversion, need to add the nicities of scala, all these null checks make me dizzy -*/ -class StandardImageExtractor(httpClient: HttpClient, article: Article, config: Configuration) extends ImageExtractor { - - - /** - * holds the document that we're extracting the image from - */ - private var doc: Document = null - - /** - * What's the minimum bytes for an image we'd accept is - */ - private var minBytesForImages: Int = 0 - /** - * location to store temporary image files if need be - */ - private var tempStoragePath: String = null - - /** - * this lists all the known bad button names that we have - */ - var matchBadImageNames: Matcher = null - val NODE_ID_FORMAT: String = "tag: %s class: %s ID: %s" - val KNOWN_IMG_DOM_NAMES = "yn-story-related-media" :: "cnn_strylccimg300cntr" :: "big_photo" :: "ap-smallphoto-a" :: Nil - - var sb: StringBuilder = new StringBuilder - // create negative elements - sb.append(".html|.gif|.ico|button|twitter.jpg|facebook.jpg|ap_buy_photo|digg.jpg|digg.png|delicious.png|facebook.png|reddit.jpg|doubleclick|diggthis|diggThis|adserver|/ads/|ec.atdmt.com") - sb.append("|mediaplex.com|adsatt|view.atdmt") - matchBadImageNames = Pattern.compile(sb.toString()).matcher(string.empty) - - /** - * holds the result of our image extraction - */ - val image = new Image - /** - * the webpage url that we're extracting content from - */ - val targetUrl = article.finalUrl - /** - * stores a hash of our url for reference and image processing - */ - val linkhash = article.linkhash - - - override def getBestImage(doc: Document, topNode: Element): Image = { - this.doc = doc - if (logger.isDebugEnabled) { - logger.debug("Starting to Look for the Most Relavent Image") - } - if (image.getImageSrc == "") { - this.checkForKnownElements() - } - if (image.getImageSrc == "") { - this.checkForLargeImages(topNode, 0, 0) - } - if (image.getImageSrc == "") { - this.checkForMetaTag - } - image - } - - private def checkForMetaTag: Boolean = { - if (this.checkForLinkTag) { - return true - } - if (this.checkForOpenGraphTag) { - return true - } - if (logger.isDebugEnabled) { - logger.debug("unable to find meta image") - } - false - } - - /** - * checks to see if we were able to find open graph tags on this page - * - * @return - */ - private def checkForOpenGraphTag: Boolean = { - try { - val meta: Elements = doc.select("meta[property~=og:image]") - import scala.collection.JavaConversions._ - for (item <- meta) { - if (item.attr("content").length < 1) { - return false - } - val imagePath: String = this.buildImagePath(item.attr("content")) - this.image.imageSrc = imagePath - this.image.imageExtractionType = "opengraph" - this.image.confidenceScore = 100 - this.image.bytes = this.getBytesForImage(imagePath) - trace(logPrefix + "open graph tag found, using it") - - return true - } - false - } - catch { - case e: Exception => { - e.printStackTrace() - return false - } - } - } - - /** - * checks to see if we were able to find open graph tags on this page - * - * @return - */ - private def checkForLinkTag: Boolean = { - try { - val meta: Elements = doc.select("link[rel~=image_src]") - import scala.collection.JavaConversions._ - for (item <- meta) { - if (item.attr("href").length < 1) { - return false - } - this.image.imageSrc = this.buildImagePath(item.attr("href")) - this.image.imageExtractionType = "linktag" - this.image.confidenceScore = 100 - this.image.bytes = getBytesForImage(buildImagePath(item.attr("href"))) - trace(logPrefix + "link tag found, using it") - - return true - } - false - } - catch { - case e: Exception => { - logger.error(e.toString, e) - false - } - } - } - - def getAllImages: ArrayList[Element] = { - null - } - - def getImagesFromNode(node: Element): Option[Elements] = { - val images: Elements = node.select("img") - - if (images == null || images.size < 1) { - None - } else { - Some(images) - } - } - - - def getImageCandidates(node: Element): Option[ArrayList[Element]] = { - - for { - n <- getNode(node) - images <- getImagesFromNode(node) - filteredImages <- filterBadNames(images) - goodImages <- findImagesThatPassByteSizeTest(filteredImages) - } { - return Some(goodImages) - } - None - - } - - def getDepthLevel(node: Element, parentDepth: Int, siblingDepth: Int): Option[DepthTraversal] = { - val MAX_PARENT_DEPTH = 2 - if (parentDepth > MAX_PARENT_DEPTH) { - trace(logPrefix + "ParentDepth is greater than %d, aborting depth traversal".format(MAX_PARENT_DEPTH)) - None - } else { - try { - val siblingNode = node.previousElementSibling() - if (siblingNode == null) throw new NullPointerException - Some(DepthTraversal(siblingNode, parentDepth, siblingDepth + 1)) - } catch { - case e: NullPointerException => { - if (node != null) { - Some(DepthTraversal(node.parent, parentDepth + 1, 0)) - } else { - None - } - - } - } - } - } - - /** - * although slow the best way to determine the best image is to download them and check the actual dimensions of the image when on disk - * so we'll go through a phased approach... - * 1. get a list of ALL images from the parent node - * 2. filter out any bad image names that we know of (gifs, ads, etc..) - * 3. do a head request on each file to make sure it meets our bare requirements - * 4. any images left over let's do a full GET request, download em to disk and check their dimensions - * 5. Score images based on different factors like height/width and possibly things like color density - * - * @param node - */ - private def checkForLargeImages(node: Element, parentDepthLevel: Int, siblingDepthLevel: Int) { - trace(logPrefix + "Checking for large images - parent depth %d sibling depth: %d".format(parentDepthLevel, siblingDepthLevel)) - - - getImageCandidates(node) match { - case Some(goodImages) => { - trace(logPrefix + "checkForLargeImages: After findImagesThatPassByteSizeTest we have: " + goodImages.size + " at parent depth: " + parentDepthLevel) - val scoredImages = downloadImagesAndGetResults(goodImages, parentDepthLevel) - var highScoreImage: Element = null - scoredImages.foreach { - case (key, value) => { - if (highScoreImage == null) { - highScoreImage = key - } else { - if (value > scoredImages.get(highScoreImage).get) { - highScoreImage = key - } - } - } - } - - if (highScoreImage != null) { - val f: File = new File(highScoreImage.attr("tempImagePath")) - this.image.topImageNode = highScoreImage - this.image.imageSrc = buildImagePath(highScoreImage.attr("src")) - this.image.imageExtractionType = "bigimage" - this.image.bytes = f.length.asInstanceOf[Int] - if (scoredImages.size > 0) { - this.image.confidenceScore = (100 / scoredImages.size) - } - else { - this.image.confidenceScore = 0 - } - trace(logPrefix + "High Score Image is: " + buildImagePath(highScoreImage.attr("src"))) - } else { - getDepthLevel(node, parentDepthLevel, siblingDepthLevel) match { - case Some(depthObj) => { - checkForLargeImages(depthObj.node, depthObj.parentDepth, depthObj.siblingDepth) - } - case None => trace("Image iteration is over!") - } - } - } - case None => { - - getDepthLevel(node, parentDepthLevel, siblingDepthLevel) match { - case Some(depthObj) => { - checkForLargeImages(depthObj.node, depthObj.parentDepth, depthObj.siblingDepth) - } - case None => trace("Image iteration is over!") - } - } - } - } - - def getNode(node: Element): Option[Element] = { - if (node == null) None else Some(node) - } - - /** - * loop through all the images and find the ones that have the best bytez to even make them a candidate - * - * @param images - * @return - */ - private def findImagesThatPassByteSizeTest(images: ArrayList[Element]): Option[ArrayList[Element]] = { - var cnt: Int = 0 - val goodImages: ArrayList[Element] = new ArrayList[Element] - - images.foreach(image => { - try { - if (cnt > 30) { - trace(logPrefix + "Abort! they have over 30 images near the top node: " + this.doc.baseUri) - return Some(goodImages) - } - val bytes: Int = getBytesForImage(image.attr("src")) - - val MAX_BYTES_SIZE: Int = 15728640 - if ((bytes == 0 || bytes > minBytesForImages) && bytes < MAX_BYTES_SIZE) { - trace(logPrefix + "findImagesThatPassByteSizeTest: Found potential image - size: " + bytes + " src: " + image.attr("src")) - goodImages.add(image) - } - else { - trace(logPrefix + " Removing image: " + image.attr("src")) - image.remove() - } - } catch { - case e: Exception => warn(e, e.toString) - } - cnt += 1 - }) - - trace(logPrefix + " Now leaving findImagesThatPassByteSizeTest") - if (goodImages != null && goodImages.size > 0) Some(goodImages) else None - } - - /** - * takes a list of image elements and filters out the ones with bad names - * - * @param images - * @return - */ - private def filterBadNames(images: Elements): Option[ArrayList[Element]] = { - val goodImages: ArrayList[Element] = new ArrayList[Element] - for (image <- images) { - if (this.isOkImageFileName(image)) { - goodImages.add(image) - } - else { - image.remove() - } - } - if (goodImages != null && goodImages.size > 0) Some(goodImages) else None - } - - /** - * will check the image src against a list of bad image files we know of like buttons, etc... - * - * @return - */ - private def isOkImageFileName(imageNode: Element): Boolean = { - var imgSrc: String = imageNode.attr("src") - if (string.isNullOrEmpty(imgSrc)) { - return false - } - matchBadImageNames.reset(imgSrc) - if (matchBadImageNames.find) { - if (logger.isDebugEnabled) { - logger.debug("Found bad filename for image: " + imgSrc) - } - return false - } - true - } - - /** - * in here we check for known image contains from sites we've checked out like yahoo, techcrunch, etc... that have - * known places to look for good images. - * //todo enable this to use a series of settings files so people can define what the image ids/classes are on specific sites - */ - def checkForKnownElements() { - - var knownImage: Element = null - trace(logPrefix + "Checking for known images from large sites") - - for (knownName <- KNOWN_IMG_DOM_NAMES) { - - try { - var known: Element = article.rawDoc.getElementById(knownName) - if (known == null) { - known = article.rawDoc.getElementsByClass(knownName).first - } - if (known != null) { - val mainImage: Element = known.getElementsByTag("img").first - if (mainImage != null) { - knownImage = mainImage - if (logger.isDebugEnabled) { - logger.debug("Got Image: " + mainImage.attr("src")) - } - } - } - - } - catch { - case e: NullPointerException => { - if (logger.isDebugEnabled) { - logger.debug(e.toString, e) - } - } - } - } - if (knownImage != null) { - val knownImgSrc: String = knownImage.attr("src") - this.image.imageSrc = this.buildImagePath(knownImgSrc) - this.image.imageExtractionType = "known" - this.image.confidenceScore = 90 - this.image.bytes = this.getBytesForImage(knownImgSrc) - } - else { - if (logger.isDebugEnabled) { - logger.debug("No known images found") - } - } - - } - - /** - * This method will take an image path and build out the absolute path to that image - * using the initial url we crawled so we can find a link to the image if they use relative urls like ../myimage.jpg - * - * @param image - * @return - */ - private def buildImagePath(image: String): String = { - var pageURL: URL = null - var newImage: String = image.replace(" ", "%20") - try { - pageURL = new URL(this.targetUrl) - var imageURL: URL = new URL(pageURL, image) - newImage = imageURL.toString - } - catch { - case e: MalformedURLException => { - logger.error("Unable to get Image Path: " + image) - } - } - newImage - } - - /** - * does the HTTP HEAD request to get the image bytes for this images - * - * @param src - * @return - */ - private def getBytesForImage(src: String): Int = { - var bytes: Int = 0 - var httpget: HttpGet = null - try { - var link: String = this.buildImagePath(src) - link = link.replace(" ", "%20") - val localContext: HttpContext = new BasicHttpContext - localContext.setAttribute(ClientContext.COOKIE_STORE, HtmlFetcher.emptyCookieStore) - httpget = new HttpGet(link) - var response: HttpResponse = null - response = httpClient.execute(httpget, localContext) - val entity: HttpEntity = response.getEntity - bytes = this.minBytesForImages + 1 - try { - val currentBytes: Int = entity.getContentLength.asInstanceOf[Int] - val contentType: Header = entity.getContentType - if (contentType.getValue.contains("image")) { - bytes = currentBytes - } - } - catch { - case e: NullPointerException => { - warn(e, "SRC: " + src + " " + e.toString) - - } - } - } - catch { - case e: Exception => { - warn(e, "BIG SRC: " + src + " " + e.toString) - - } - } - finally { - try { - httpget.abort() - } - catch { - case e: NullPointerException => { - logger.error("HttpGet is null, can't abortz") - } - } - } - bytes - } - - /** - * download the images to temp disk and set their dimensions - *

- * we're going to score the images in the order in which they appear so images higher up will have more importance, - * we'll count the area of the 1st image as a score of 1 and then calculate how much larger or small each image after it is - * we'll also make sure to try and weed out banner type ad blocks that have big widths and small heights or vice versa - * so if the image is 3rd found in the dom it's sequence score would be 1 / 3 = .33 * diff in area from the first image - * - * @param images - * @return - */ - - private def downloadImagesAndGetResults(images: ArrayList[Element], depthLevel: Int): HashMap[Element, Float] = { - val imageResults: HashMap[Element, Float] = new HashMap[Element, Float] - var cnt: Int = 1 - var initialArea: Float = 0 - - for (image <- images) { - var continueVar = true // major haxor during java to scala conversion -> this whole section needs a rewrite - if (cnt > 30) { - if (logger.isDebugEnabled) { - logger.debug("over 30 images attempted, that's enough for now") - } - return imageResults - } - try { - val imageSource: String = this.buildImagePath(image.attr("src")) - val localSrcPath: String = ImageSaver.storeTempImage(this.httpClient, this.linkhash, imageSource, config) - if (localSrcPath == null) { - if (logger.isDebugEnabled) { - logger.debug("unable to store this image locally: IMGSRC: " + image.attr("src") + " BUILD SRC: " + imageSource) - } - continueVar = false - } - if (logger.isDebugEnabled) { - logger.debug("Starting image: " + localSrcPath) - } - var width: Int = 0 - var height: Int = 0 - if (continueVar) { - image.attr("tempImagePath", localSrcPath) - try { - var imageDims: ImageDetails = ImageUtils.getImageDimensions(config.imagemagickIdentifyPath, localSrcPath) - width = imageDims.getWidth - height = imageDims.getHeight - if (depthLevel > 1) { - if (width < 300) { - if (logger.isDebugEnabled) { - logger.debug("going depthlevel: " + depthLevel + " and img was only: " + width + " wide: " + localSrcPath) - } - continueVar = false - } - } - } - catch { - case e: IOException => { - throw e - } - } - } - if (continueVar) { - if (this.isBannerDimensions(width, height)) { - if (logger.isDebugEnabled) { - logger.debug(image.attr("src") + " seems like a fishy image dimension wise, skipping it") - } - image.remove() - continueVar = false - } - } - if (continueVar) { - if (width < 50) { - if (logger.isDebugEnabled) { - logger.debug(image.attr("src") + " is too small width: " + width + " removing..") - } - image.remove() - continueVar = false - } - } - if (continueVar) { - val sequenceScore: Float = (1).asInstanceOf[Float] / cnt - val area: Int = width * height - var totalScore: Float = 0 - if (initialArea == 0) { - // give the initial image a little area boost as well - initialArea = area * 1.48.asInstanceOf[Float] - totalScore = 1 - } - else { - val areaDifference: Float = area.asInstanceOf[Float] / initialArea - totalScore = sequenceScore.asInstanceOf[Float] * areaDifference - } - trace(logPrefix + imageSource + " Area is: " + area + " sequence score: " + sequenceScore + " totalScore: " + totalScore) - cnt += 1; - - imageResults.put(image, totalScore) - } - } - catch { - case e: SecretGifException => { - - } - case e: Exception => { - warn(e, e.toString) - - } - } - } - imageResults - } - - - /** - * returns true if we think this is kind of a bannery dimension - * like 600 / 100 = 6 may be a fishy dimension for a good image - * - * @param width - * @param height - */ - private def isBannerDimensions(width: Int, height: Int): Boolean = { - if (width == height) { - return false - } - if (width > height) { - val diff: Float = (width.asInstanceOf[Float] / height.asInstanceOf[Float]) - if (diff > 5) { - return true - } - } - if (height > width) { - val diff: Float = height.asInstanceOf[Float] / width.asInstanceOf[Float] - if (diff > 5) { - return true - } - } - false - } - - def getMinBytesForImages: Int = { - minBytesForImages - } - - def setMinBytesForImages(minBytesForImages: Int) { - this.minBytesForImages = minBytesForImages - } - - def getTempStoragePath: String = { - tempStoragePath - } - - def setTempStoragePath(tempStoragePath: String) { - this.tempStoragePath = tempStoragePath - } - - -} \ No newline at end of file diff --git a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala index 787e9c0c1..1d981bf11 100644 --- a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala +++ b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala @@ -19,6 +19,8 @@ import io.Source * Date: 9/22/11 */ +case class DepthTraversal(node: Element, parentDepth: Int, siblingDepth: Int) + class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: Configuration) extends ImageExtractor { import UpgradedImageIExtractor._ @@ -542,4 +544,4 @@ object UpgradedImageIExtractor { val KNOWN_IMG_DOM_NAMES = ListBuffer("yn-story-related-media", "cnn_strylccimg300cntr", "big_photo", "ap-smallphoto-a") -} \ No newline at end of file +} From 94f0c4901af96600ffc28d18081410494f445d81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Marques=20Vieira?= Date: Mon, 27 Oct 2014 11:41:30 +0000 Subject: [PATCH 327/347] Allow extraction of all the images in the order found in the HTML --- .../scala/com/gravity/goose/Article.scala | 6 +++- .../scala/com/gravity/goose/Crawler.scala | 4 ++- .../gravity/goose/images/ImageExtractor.scala | 2 ++ .../images/UpgradedImageIExtractor.scala | 28 +++++++++++++++---- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Article.scala b/src/main/scala/com/gravity/goose/Article.scala index 40b4dadcd..7822f2f54 100644 --- a/src/main/scala/com/gravity/goose/Article.scala +++ b/src/main/scala/com/gravity/goose/Article.scala @@ -72,6 +72,10 @@ class Article { */ var topImage: Image = new Image + /** + * all article images in the order they were found + */ + var images: List[Image] = Nil /** * holds a set of tags that may have been in the artcle, these are not meta keywords @@ -122,4 +126,4 @@ class Article { * @return a {@link Map Map<String,String>} of property name to property vaue (represented as a {@link String}. */ var additionalData: Map[String, String] = Map.empty -} \ No newline at end of file +} diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index 4f3b32344..b4003fb46 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -83,8 +83,10 @@ class Crawler(config: Configuration) { try { if (article.rawDoc == null) { article.topImage = new Image + article.images = Nil } else { article.topImage = imageExtractor.getBestImage(article.rawDoc, article.topNode) + article.images = imageExtractor.getAllImages(article.topNode) } } catch { case e: Exception => { @@ -174,4 +176,4 @@ class Crawler(config: Configuration) { object Crawler extends Logging { val logPrefix = "crawler: " -} \ No newline at end of file +} diff --git a/src/main/scala/com/gravity/goose/images/ImageExtractor.scala b/src/main/scala/com/gravity/goose/images/ImageExtractor.scala index c73c8a4e0..784f4a923 100644 --- a/src/main/scala/com/gravity/goose/images/ImageExtractor.scala +++ b/src/main/scala/com/gravity/goose/images/ImageExtractor.scala @@ -33,6 +33,8 @@ trait ImageExtractor extends CanLog { def getBestImage(doc: Document, topNode: Element): Image + def getAllImages(node: Element): List[Image] + def logPrefix: String = ImageExtractor.loggingPrefix def critical(msg: String, refs: Any*) { diff --git a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala index 1d981bf11..e3067ddef 100644 --- a/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala +++ b/src/main/scala/com/gravity/goose/images/UpgradedImageIExtractor.scala @@ -74,6 +74,18 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: new Image } + def getAllImages(node: Element): List[Image] = { + getImageCandidates(node) match { + case Some(goodImages) => { + val scoredImages = downloadImagesAndGetResults(goodImages, 0) + scoredImages.map((scoredImage: (LocallyStoredImage, Float)) => scoredImageToResultImage(scoredImage._1, scoredImages.size)).toList + } + case None => { + Nil + } + } + } + private def checkForMetaTag: Option[Image] = { checkForLinkTag match { case Some(image) => return Some(image) @@ -110,12 +122,7 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: // get the high score image in a tuple scoredImages.sortBy(-_._2).take(1).headOption match { case Some(highScoreImage) => { - val mainImage = new Image - // mainImage.topImageNode = highScoreImage - mainImage.imageSrc = highScoreImage._1.imgSrc - mainImage.imageExtractionType = "bigimage" - mainImage.bytes = highScoreImage._1.bytes - mainImage.confidenceScore = if (scoredImages.size > 0) (100 / scoredImages.size) else 0 + val mainImage = scoredImageToResultImage(highScoreImage._1, scoredImages.size) trace("IMAGE COMPLETE: High Score Image is: " + mainImage.imageSrc + " Score is: " + highScoreImage._2) return Some(mainImage) } @@ -145,6 +152,15 @@ class UpgradedImageIExtractor(httpClient: HttpClient, article: Article, config: None } + private def scoredImageToResultImage(scoredImage: LocallyStoredImage, scoredImagesLength: Int): Image = { + val mainImage = new Image + mainImage.imageSrc = scoredImage.imgSrc + mainImage.imageExtractionType = "bigimage" + mainImage.bytes = scoredImage.bytes + mainImage.confidenceScore = 100 / scoredImagesLength + mainImage + } + def getDepthLevel(node: Element, parentDepth: Int, siblingDepth: Int): Option[DepthTraversal] = { if (node == null) return None From 34bd3e1f1bdbc9a57dd7f53456e8bfcca60d4c56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Marques=20Vieira?= Date: Mon, 27 Oct 2014 13:41:35 +0000 Subject: [PATCH 328/347] Add test for getting all images --- .../gravity/goose/statichtml/allImages.txt | 986 ++++++++++++++++++ .../scala/com/gravity/goose/AllImages.scala | 39 + .../scala/com/gravity/goose/TestUtils.scala | 15 +- 3 files changed, 1038 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/com/gravity/goose/statichtml/allImages.txt create mode 100644 src/test/scala/com/gravity/goose/AllImages.scala diff --git a/src/main/resources/com/gravity/goose/statichtml/allImages.txt b/src/main/resources/com/gravity/goose/statichtml/allImages.txt new file mode 100644 index 000000000..a5e2d8cc7 --- /dev/null +++ b/src/main/resources/com/gravity/goose/statichtml/allImages.txt @@ -0,0 +1,986 @@ + + + Understanding StatsD and Graphite - pkhamre.blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+

pkhamre.blog

+ +

thoughts, devops, tools and stuff.

+ +
+
+ +
+ +
+
+
+
+ +
+ + +

Understanding StatsD and Graphite

+ + + +

+ + + + + + + + + + + + + + +

+ +
+ + +

+ +

After a short conversation with BryanWB_ on the #logstash channel at Freenode, +I realized that I did not know how my data was sent and how it was stored in Graphite. +I knew that StatsD collects and aggregates my metrics. And I knew that StatsD +ships them off to Graphite. Which I knew stores the time-series data and +enables us to render graphs based on these data.

+ +

What I did not know was if my http-access graphs displayed requests per second, +average requests per retention or anything else.

+ +

It was time to research how these things worked in order to get a complete +understanding.

+ +

StatsD

+ +

To get a full understanding of how StatsD works, I started to read the source +code. I knew StatsD was a simple application, but I did not knew it was this +simple. Just over 300 lines of code in the main script and around 150 +lines in the graphite backend code.

+ +

Concepts in StatsD

+ +

StatsD has a few concepts listed in the documentation that should be +understood.

+ +

Buckets

+ +

Each stat is in its own “bucket”. They are not predefined anywhere. Buckets can be +named anything that will translate to Graphite (periods make folders, etc)

+ +

Values

+ +

Each stat will have a value. How it is interpreted depends on modifiers. In general +values should be integer.

+ +

Flush interval

+ +

After the flush interval timeout (default 10 seconds), stats are aggregated and +sent to an upstream backend service.

+ +

Metric types

+ +

Counters

+ +

Counters are simple. It adds a value to a bucket and stays in memory until the +flush interval.

+ +

Lets take a look at the source code that generates the counter stats that gets +flushed to the backend.

+ +
1
+2
+3
+4
+5
+6
+7
+8
+9
+
for (key in counters) {
+  var value = counters[key];
+  var valuePerSecond = value / (flushInterval / 1000); // calculate "per second" rate
+
+  statString += 'stats.'        + key + ' ' + valuePerSecond + ' ' + ts + "\n";
+  statString += 'stats_counts.' + key + ' ' + value          + ' ' + ts + "\n";
+
+  numStats += 1;
+}
+
+ + +

First, StatsD iterates over any counters received, where it starts by assigning +two variables. One variable holds the counter value, and one variable +holds the per-second value. It then adds the values to the statString and +increases the numStats variable.

+ +

If you have the default flush interval, 10 seconds, and send StatsD +7 increments on a counter with the flush interval, the counter would be 7 and +the per-second value would be 0.7. No magic.

+ +

Timers

+ +

Timers collects numbers. They does not necessarily need to contain a value of +time. You can collect bytes read, number of objects in some storage, or +anything that is a number. A good thing about timer, is that you get the mean, +the sum, the count, the upper and the lower values for free. Feed StatsD +a timer and this gets automatically calculated for you before it is flushed to +Graphite. Oh, I almost forgot to mention that you also get the 90 percentile +calculated for the mean, sum and upper values as well. You can also configure +StatsD to use an array of numbers as percentiles, which means you can get 50 +percentile, 90 percentile and 95 percentile calculated for you if you want.

+ +

The source code for timer stats is a bit more advanced than the code for the +counters.

+ +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+
for (key in timers) {
+  if (timers[key].length > 0) {
+    var values = timers[key].sort(function (a,b) { return a-b; });
+    var count = values.length;
+    var min = values[0];
+    var max = values[count - 1];
+
+    var cumulativeValues = [min];
+    for (var i = 1; i < count; i++) {
+        cumulativeValues.push(values[i] + cumulativeValues[i-1]);
+    }
+
+    var sum = min;
+    var mean = min;
+    var maxAtThreshold = max;
+
+    var message = "";
+
+    var key2;
+
+    for (key2 in pctThreshold) {
+      var pct = pctThreshold[key2];
+      if (count > 1) {
+        var thresholdIndex = Math.round(((100 - pct) / 100) * count);
+        var numInThreshold = count - thresholdIndex;
+
+        maxAtThreshold = values[numInThreshold - 1];
+        sum = cumulativeValues[numInThreshold - 1];
+        mean = sum / numInThreshold;
+      }
+
+      var clean_pct = '' + pct;
+      clean_pct.replace('.', '_');
+      message += 'stats.timers.' + key + '.mean_'  + clean_pct + ' ' + mean           + ' ' + ts + "\n";
+      message += 'stats.timers.' + key + '.upper_' + clean_pct + ' ' + maxAtThreshold + ' ' + ts + "\n";
+      message += 'stats.timers.' + key + '.sum_' + clean_pct + ' ' + sum + ' ' + ts + "\n";
+    }
+
+    sum = cumulativeValues[count-1];
+    mean = sum / count;
+
+    message += 'stats.timers.' + key + '.upper ' + max   + ' ' + ts + "\n";
+    message += 'stats.timers.' + key + '.lower ' + min   + ' ' + ts + "\n";
+    message += 'stats.timers.' + key + '.count ' + count + ' ' + ts + "\n";
+    message += 'stats.timers.' + key + '.sum ' + sum  + ' ' + ts + "\n";
+    message += 'stats.timers.' + key + '.mean ' + mean + ' ' + ts + "\n";
+    statString += message;
+
+    numStats += 1;
+  }
+}
+
+ + +

StatsD iterates over each timer and processes the timer if the value is above +0. It then sorts the array of values and simply counts it and locates the +minimum and maximum values. An array of the cumulative values is created and +a few variables are assigned before it starts to iterate over the percentile +thresholds array to calculate percentiles and creates the messages to assign to +the statString variable. When percentile calculation is done, the final sum +gets assigned and the final statString is created.

+ +

If you send the following timer values to StatsD during the default flush interval

+ +
    +
  • 450
  • +
  • 120
  • +
  • 553
  • +
  • 994
  • +
  • 334
  • +
  • 844
  • +
  • 675
  • +
  • 496
  • +
+ + +

StatsD will calculate the following values

+ +
    +
  • mean_90 496
  • +
  • upper_90 844
  • +
  • sum_90 3472
  • +
  • upper 994
  • +
  • lower 120
  • +
  • count 8
  • +
  • sum 4466
  • +
  • mean 558.25
  • +
+ + +

Gauges

+ +

A gauge simply indicates an arbitrary value at a point in time and is the most +simple type in StatsD. It just takes any number and ships it to the backend.

+ +

The source code for gauge stats is just four lines.

+ +
1
+2
+3
+4
+
for (key in gauges) {
+  statString += 'stats.gauges.' + key + ' ' + gauges[key] + ' ' + ts + "\n";
+  numStats += 1;
+}
+
+ + +

Feed StatsD a number and it sends it unprocessed to the backend. A thing to +note is that only the last value of a gauge during a flush interval is flushed +to the backend. That means that if you send the following gauge values to +StatsD during a flush interval

+ +
    +
  • 643
  • +
  • 754
  • +
  • 583
  • +
+ + +

The only value that gets flushed to the backend is 583. The value of this +gauge will be kept in memory in StatsD and be sent to the backend at the end of +every flush interval.

+ +

Graphite

+ +

Now that we know how our data is sent from StatsD, lets take a look at how it +is stored and processed in Graphite.

+ +

Overview

+ +

In the Graphite documentation we can find the Graphite overview. It sums +up Graphite with these two simple points.

+ +
    +
  • Graphite stores numeric time-series data.
  • +
  • Graphite renders graphs of this data on demand.
  • +
+ + +

Graphite consists of three parts.

+ +
    +
  • carbon - a daemon that listens for time-series data.
  • +
  • whisper - a simple database library for storing time-series data.
  • +
  • webapp - a (Django) webapp that renders graphs on demand.
  • +
+ + +

The format for time-series data in graphite looks like this

+ +
1
+
<key> <numeric value> <timestamp>
+ + +

Storage schemas

+ +

Graphite uses configurable storage schemas too define retention rates for +storing data. It matches data paths with a pattern and tells what frequency and +history for our data to store.

+ +

The following configuration example is taken from the StatsD documentation.

+ +
1
+2
+3
+
[stats]
+pattern = ^stats\..*
+retentions = 10:2160,60:10080,600:262974
+ + +

Which means these retentions will be used for every entry with a key matching +the pattern defined. The retention format is frequency:history. So this +configuration lets us store 10 second data for 6 hours, 1 minute data for +1 week, and 10 minute data for 5 years.

+ +

Visualizing a timer in Graphite

+ +

Knowing all this, we can now take a look at my simple ruby-script that collects +timings for a HTTP requests.

+ +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+
#!/usr/bin/env ruby
+
+require 'rubygems' if RUBY_VERSION < '1.9.0'
+require './statsdclient.rb'
+require 'typhoeus'
+
+Statsd.host = 'localhost'
+Statsd.port = 8125
+
+def to_ms time
+  (1000 * time).to_i
+end
+
+while true
+  start_time = Time.now.to_f
+
+  resp = Typhoeus::Request.get 'http://www.example.org/system/information'
+
+  end_time = Time.now.to_f
+
+  elapsed_time = (1000 * end_time) - (to_ms start_time)
+  response_time = to_ms resp.time
+  start_transfer_time = to_ms resp.start_transfer_time
+  app_connect_time = to_ms resp.app_connect_time
+  pretransfer_time = to_ms resp.pretransfer_time
+  connect_time = to_ms resp.connect_time
+  name_lookup_time = to_ms resp.name_lookup_time
+
+  Statsd.timing('http_request.elapsed_time', elapsed_time)
+  Statsd.timing('http_request.response_time', response_time)
+  Statsd.timing('http_request.start_transfer_time', start_transfer_time)
+  Statsd.timing('http_request.app_connect_time', app_connect_time)
+  Statsd.timing('http_request.pretransfer_time', pretransfer_time)
+  Statsd.timing('http_request.connect_time', connect_time)
+  Statsd.timing('http_request.name_lookup_time', name_lookup_time)
+
+  sleep 10
+end
+
+ + +

Lets take a look at the visualized Graphite render from this data. The data is +from the last 2 minutes, and the elapsed_time target from our script above.

+ +

Image visualization

+ +
Render URL
+ +

Render URL used for the image below.

+ +
1
+
/render/?width=586&height=308&from=-2minutes&target=stats.timers.http_request.elapsed_time.sum
+ + +
Rendered image from Graphite
+ +

Rendered image from Graphite, a simple graph visualizing elapsed_time for http +requests over time.

+ +

+ +

JSON-data

+ +
Render URL
+ +

Render URL used for the JSON-data below.

+ +
1
+
/render/?width=586&height=308&from=-2minutes&target=stats.timers.http_request.elapsed_time.sum&format=json
+ + +
JSON-output from Graphite
+ +

In the results below, we can see the raw data from Graphite. It is data from 12 +different data points which means 2 minutes with the StatsD 10-second flush +interval. It is really this simple, Graphite just visualizes its data.

+ +

The JSON-data is beautified with JSONLint for viewing purposes.

+ +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+
[
+    {
+        "target": "stats.timers.http_request.elapsed_time.sum",
+        "datapoints": [
+            [
+                53.449951171875,
+                1343038130
+            ],
+            [
+                50.3916015625,
+                1343038140
+            ],
+            [
+                50.1357421875,
+                1343038150
+            ],
+            [
+                39.601806640625,
+                1343038160
+            ],
+            [
+                41.5263671875,
+                1343038170
+            ],
+            [
+                34.3974609375,
+                1343038180
+            ],
+            [
+                36.3818359375,
+                1343038190
+            ],
+            [
+                35.009033203125,
+                1343038200
+            ],
+            [
+                37.0087890625,
+                1343038210
+            ],
+            [
+                38.486572265625,
+                1343038220
+            ],
+            [
+                45.66064453125,
+                1343038230
+            ],
+            [
+                null,
+                1343038240
+            ]
+        ]
+    }
+]
+
+ + +

Visualizing a gauge in Graphite

+ +

The following simple script ships a gauge to StatsD, simulating a number of +user registrations.

+ +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+
#!/usr/bin/env ruby
+
+require './statsdclient.rb'
+
+Statsd.host = 'localhost'
+Statsd.port = 8125
+
+user_registrations = 1
+
+while true
+  user_registrations += Random.rand 128
+
+  Statsd.gauge('user_registrations', user_registrations)
+
+  sleep 10
+end
+
+ + +

Image visualization - Number of user registrations

+ +
Render URL
+ +

Render URL used for the image below.

+ +
1
+
/render/?width=586&height=308&from=-20minutes&target=stats.gauges.user_registrations
+ + +
Rendered image from Graphite
+ +

Another simple graph, just showing the total number of registrations.

+ +

+ +

Image visualization - Number of user registrations per minute

+ +

By using the derivative-function in Graphite, we can get the number of user +registrations per minute.

+ +
Render URL
+ +

Render URL used for the image below.

+ +
1
+
/render/?width=586&height=308&from=-20minutes&target=derivative(stats.gauges.user_registrations)
+ + +
Rendered image from Graphite
+ +

A graph based on the same data as above, but with the derivative function +applied to visualize a per-minute rate.

+ +

+ +

Conclusion

+ +

Knowing more about how StatsD and Graphite works, it will be alot easier to +know what kind of data to ship StatsD, to know how to ship the data to StatsD, +and to know how to read the data from Graphite.

+ +

Got any comments or questions? Let me know in the comment section below.

+
+ + + +
+ +
+

Comments

+
+
+ +
+ + + + +
+
+

+ Copyright © 2013 - Pål-Kristian Hamre - + Powered by Octopress +

+ +
+ + + + + + +
+ + + + + + + + + + + + + + + + +
diff --git a/src/test/scala/com/gravity/goose/AllImages.scala b/src/test/scala/com/gravity/goose/AllImages.scala new file mode 100644 index 000000000..6a2cc1f8d --- /dev/null +++ b/src/test/scala/com/gravity/goose/AllImages.scala @@ -0,0 +1,39 @@ +package com.gravity.goose + +import extractors.PublishDateExtractor +import org.junit.Test +import org.junit.Assert._ +import utils.FileHelper +import java.text.SimpleDateFormat +import org.jsoup.select.Selector +import org.jsoup.nodes.Element +import java.util.Date + +/** + * Created by Francisco Vieira + * User: fvieira + * Date: 27/10/14 + */ + +class AllImages { + + def getHtml(filename: String): String = { + FileHelper.loadResourceFile(TestUtils.staticHtmlDir + filename, Goose.getClass) + } + + @Test + def allImages() { + implicit val config = TestUtils.DEFAULT_CONFIG + val url = "http://blog.pkhamre.com/2012/07/24/understanding-statsd-and-graphite/" + val html = getHtml("allImages.txt") + val article = TestUtils.getArticle(url, html) + val images = "http://blog.pkhamre.com/images/irssi-conversation.png" :: + "http://blog.pkhamre.com/images/graphite-render.png" :: + "http://blog.pkhamre.com/images/graphite-registrations.png" :: + "http://blog.pkhamre.com/images/graphite-registrations-derivative.png" :: + Nil + TestUtils.runArticleAssertions(article = article, expectedImages = images) + TestUtils.printReport() + } + +} diff --git a/src/test/scala/com/gravity/goose/TestUtils.scala b/src/test/scala/com/gravity/goose/TestUtils.scala index 58fc1cb87..7cace60c8 100644 --- a/src/test/scala/com/gravity/goose/TestUtils.scala +++ b/src/test/scala/com/gravity/goose/TestUtils.scala @@ -44,11 +44,12 @@ object TestUtils { article } - def runArticleAssertions(article: Article, expectedTitle: String = null, expectedStart: String = null, expectedImage: String = null, expectedDescription: String = null, expectedKeywords: String = null): Unit = { + def runArticleAssertions(article: Article, expectedTitle: String = null, expectedStart: String = null, expectedImage: String = null, expectedImages: List[String] = null, expectedDescription: String = null, expectedKeywords: String = null): Unit = { articleReport.append("URL: ").append(TAB).append(article.finalUrl).append(NL) articleReport.append("TITLE: ").append(TAB).append(article.title).append(NL) articleReport.append("IMAGE: ").append(TAB).append(article.topImage.getImageSrc).append(NL) articleReport.append("IMGKIND: ").append(TAB).append(article.topImage.imageExtractionType).append(NL) + articleReport.append("ALL_IMAGES: ").append(TAB).append(article.images.map((i: Image) => i.getImageSrc)).append(NL) articleReport.append("CONTENT: ").append(TAB).append(article.cleanedArticleText.replace("\n", " ")).append(NL) articleReport.append("METAKW: ").append(TAB).append(article.metaKeywords).append(NL) articleReport.append("METADESC: ").append(TAB).append(article.metaDescription).append(NL) @@ -78,6 +79,16 @@ object TestUtils { assertNotNull("Image src was NULL!", src) assertEquals("Image src was not as expected!", expectedImage, src) } + if (expectedImages != null) { + val images: List[Image] = article.images + assertNotNull("Images was NULL!", images) + assertEquals("Different number of images then expected!", expectedImages.size, images.size) + images.zip(expectedImages).foreach{ case (i: Image, ei: String) => + val src: String = i.getImageSrc + assertNotNull("Image src was NULL!", src) + assertEquals("Image src was not as expected!", ei, src) + } + } if (expectedDescription != null) { val description: String = article.metaDescription assertNotNull("Meta Description was NULL!", description) @@ -93,4 +104,4 @@ object TestUtils { def printReport() { println(articleReport) } -} \ No newline at end of file +} From 6c8fa777345e11090e88521a91906663d8895325 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Marques=20Vieira?= Date: Mon, 27 Oct 2014 15:03:28 +0000 Subject: [PATCH 329/347] Update surefire dependency to 2.17 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 9fef84cba..501dd4c93 100644 --- a/pom.xml +++ b/pom.xml @@ -76,7 +76,7 @@ org.apache.maven.plugins maven-surefire-plugin - 2.6 + 2.17 false true @@ -151,4 +151,4 @@ -
\ No newline at end of file + From 95d34130b84c9d39c91b4b286afffd2ac54c00e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Marques=20Vieira?= Date: Mon, 27 Oct 2014 15:20:14 +0000 Subject: [PATCH 330/347] Allow settings imagemagick binaries using env vars --- src/main/scala/com/gravity/goose/Configuration.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index 20ce4653a..e810cf204 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -55,12 +55,12 @@ class Configuration { * path to your imagemagick convert executable, on the mac using mac ports this is the default listed */ @BeanProperty - var imagemagickConvertPath: String = "/opt/local/bin/convert" + var imagemagickConvertPath: String = sys.env.get("GOOSE_IMGMAGICK_CONVERT_PATH").getOrElse("/opt/local/bin/convert") /** * path to your imagemagick identify executable */ @BeanProperty - var imagemagickIdentifyPath: String = "/opt/local/bin/identify" + var imagemagickIdentifyPath: String = sys.env.get("GOOSE_IMGMAGICK_IDENTIFY_PATH").getOrElse("/opt/local/bin/identify") @BeanProperty var connectionTimeout: Int = 10000 @@ -124,4 +124,4 @@ class Configuration { def getHtmlFetcher: AbstractHtmlFetcher = htmlFetcher -} \ No newline at end of file +} From 636eb995d0b7b85b3e79dacc1a06c4da970cffc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Jos=C3=A9=20Marques=20Vieira?= Date: Mon, 27 Oct 2014 15:20:39 +0000 Subject: [PATCH 331/347] Rename AllImages and TextExtractions tests so they always run --- .../gravity/goose/{AllImages.scala => AllImagesTest.scala} | 2 +- .../{TextExtractions.scala => TextExtractionsTest.scala} | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/test/scala/com/gravity/goose/{AllImages.scala => AllImagesTest.scala} (98%) rename src/test/scala/com/gravity/goose/{TextExtractions.scala => TextExtractionsTest.scala} (99%) diff --git a/src/test/scala/com/gravity/goose/AllImages.scala b/src/test/scala/com/gravity/goose/AllImagesTest.scala similarity index 98% rename from src/test/scala/com/gravity/goose/AllImages.scala rename to src/test/scala/com/gravity/goose/AllImagesTest.scala index 6a2cc1f8d..71e1a7628 100644 --- a/src/test/scala/com/gravity/goose/AllImages.scala +++ b/src/test/scala/com/gravity/goose/AllImagesTest.scala @@ -15,7 +15,7 @@ import java.util.Date * Date: 27/10/14 */ -class AllImages { +class AllImagesTest { def getHtml(filename: String): String = { FileHelper.loadResourceFile(TestUtils.staticHtmlDir + filename, Goose.getClass) diff --git a/src/test/scala/com/gravity/goose/TextExtractions.scala b/src/test/scala/com/gravity/goose/TextExtractionsTest.scala similarity index 99% rename from src/test/scala/com/gravity/goose/TextExtractions.scala rename to src/test/scala/com/gravity/goose/TextExtractionsTest.scala index 4840dfd99..ddd5fa79d 100644 --- a/src/test/scala/com/gravity/goose/TextExtractions.scala +++ b/src/test/scala/com/gravity/goose/TextExtractionsTest.scala @@ -15,7 +15,7 @@ import java.util.Date * Date: 8/19/11 */ -class TextExtractions { +class TextExtractionsTest { def getHtml(filename: String): String = { FileHelper.loadResourceFile(TestUtils.staticHtmlDir + filename, Goose.getClass) @@ -389,4 +389,4 @@ class TextExtractions { } -} \ No newline at end of file +} From 5cc6b0052be90c7d46b8f2efcddb1ca435dca5bd Mon Sep 17 00:00:00 2001 From: Onilton Maciel Date: Tue, 28 Oct 2014 11:47:27 -0200 Subject: [PATCH 332/347] Using LinkedHashSet to avoid inconsistency Goose uses a HashSet for iterating topNode candidates But HashSet doesn't guarantee ordering, so when two candidates have the same score, the choice is basically random. This is not acceptable. Now, by using LinkedHashSet we make sure that in case of draw, we choose the first tag that was found in the DOM tree. --- .../scala/com/gravity/goose/extractors/ContentExtractor.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala index 8f73dd99a..652f99725 100644 --- a/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala +++ b/src/main/scala/com/gravity/goose/extractors/ContentExtractor.scala @@ -291,7 +291,7 @@ trait ContentExtractor { var startingBoost: Double = 1.0 var cnt: Int = 0 var i: Int = 0 - val parentNodes = mutable.HashSet[Element]() + val parentNodes = mutable.LinkedHashSet[Element]() val nodesWithText = mutable.Buffer[Element]() for (node <- nodesToCheck) { val nodeText: String = node.text From a0c0cc89beecc05ed1fb96ac3bc9104d1f984e37 Mon Sep 17 00:00:00 2001 From: Ivan Giuliani Date: Tue, 28 Oct 2014 16:43:35 +0000 Subject: [PATCH 333/347] Accept single cookie header Accept cookies from web sites which put all the cookies into one request header. --- src/main/scala/com/gravity/goose/network/HtmlFetcher.scala | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index 34ebf44a7..04b27c2e1 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -260,6 +260,7 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { private[network] var emptyList: ArrayList[Cookie] = new ArrayList[Cookie] } + httpParams.setParameter("http.protocol.single-cookie-header", true) httpParams.setParameter("http.protocol.cookie-policy", CookiePolicy.BROWSER_COMPATIBILITY) httpParams.setParameter("http.User-Agent", "Mozilla/5.0 (X11; U; Linux x86_64; de; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8") httpParams.setParameter("http.language.Accept-Language", "en-us") From 714ed21dab7693bf22aa728deb31893c70451f2e Mon Sep 17 00:00:00 2001 From: Ivan Giuliani Date: Tue, 28 Oct 2014 17:24:51 +0000 Subject: [PATCH 334/347] Check stale connections --- src/main/scala/com/gravity/goose/network/HtmlFetcher.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index 04b27c2e1..9479987bb 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -267,7 +267,7 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { httpParams.setParameter("http.protocol.content-charset", "UTF-8") httpParams.setParameter("Accept", "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5") httpParams.setParameter("Cache-Control", "max-age=0") - httpParams.setParameter("http.connection.stalecheck", false) + httpParams.setParameter("http.connection.stalecheck", true) val schemeRegistry: SchemeRegistry = new SchemeRegistry schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory)) schemeRegistry.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory)) From abe2f980f80cba927b570824b6fa9d4b0e1d5d21 Mon Sep 17 00:00:00 2001 From: Ivan Giuliani Date: Tue, 28 Oct 2014 17:25:11 +0000 Subject: [PATCH 335/347] Re raise unknown exceptions --- src/main/scala/com/gravity/goose/network/HtmlFetcher.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala index 9479987bb..767a74a55 100644 --- a/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala +++ b/src/main/scala/com/gravity/goose/network/HtmlFetcher.scala @@ -168,8 +168,8 @@ object HtmlFetcher extends AbstractHtmlFetcher with Logging { return None } case e: Exception => { - trace("FAILURE FOR LINK: " + cleanUrl + " " + e.toString) - return None + warn("FAILURE FOR LINK: " + cleanUrl + " " + e.toString) + throw e } } finally { From b0ad84a062fb86ea77e071a647a54e1ba71a2c5e Mon Sep 17 00:00:00 2001 From: raisercostin Date: Tue, 28 Oct 2014 22:43:12 +0200 Subject: [PATCH 336/347] - upgraded to scala 2.11 (and some dependencies accordingly) --- build.sbt | 14 +++++++------- .../goose/network/gae/GAEClientConnection.scala | 3 ++- .../goose/network/gae/GAEConnectionManager.scala | 3 ++- .../gravity/goose/opengraph/OpenGraphData.scala | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/build.sbt b/build.sbt index 9bb3d683e..6d3b2e5e4 100644 --- a/build.sbt +++ b/build.sbt @@ -21,8 +21,8 @@ description := "Extracts text, metadata, and key image from web articles." licenses += "Apache2" -> url("http://www.apache.org/licenses/") -//scalaVersion := "2.11.1" -scalaVersion := "2.10.2" +scalaVersion := "2.11.1" +//scalaVersion := "2.10.2" crossScalaVersions := Seq("2.11.1", "2.11.0", "2.10.4") @@ -37,7 +37,7 @@ resolvers ++= Seq( "Oracle Maven 2 Repository" at "http://download.oracle.com/maven", "JBoss Maven 2 Repository" at "http://repository.jboss.com/maven2", "JLangDetect Maven repository" at "https://jlangdetect.googlecode.com/svn/repo", - "raisercostin repository" at "svn://raisercostin.synology.me/repo/maven/releases" + "raisercostin repository" at "http://raisercostin.googlecode.com/svn/maven2" ) credentials += Credentials(Path.userHome / ".ivy2" / ".credentials") @@ -54,8 +54,8 @@ libraryDependencies ++= { ,"net.liftweb" % "lift-json_2.10" % "2.5" ,"log4j" % "log4j" % "1.2.14" ,"com.typesafe" % "config" % "1.0.2" - ,"com.jsuereth" %% "scala-arm" % "1.2" - ,"org.specs2" %% "specs2" % "1.13" + ,"com.jsuereth" %% "scala-arm" % "1.4" + ,"org.specs2" %% "specs2" % "2.3.11" ,"org.jsoup" % "jsoup" % "1.7.3" ,"com.chenlb.mmseg4j" % "mmseg4j-core" % "1.9.1" ,"com.googlecode.juniversalchardet" % "juniversalchardet" % "1.0.3" @@ -65,8 +65,8 @@ libraryDependencies ++= { ,"com.google.appengine" % "appengine-testing" % "1.7.1" ,"com.google.appengine" % "appengine-api-1.0-sdk" % "1.7.1" //add json service - ,"com.fasterxml.jackson.core" % "jackson-databind" % "2.2.2" - ,"com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.2.2" + ,"com.fasterxml.jackson.core" % "jackson-databind" % "2.4.3" + ,"com.fasterxml.jackson.module" %% "jackson-module-scala" % "2.4.3" ,"org.simpleframework" % "simple" % "4.1.21" //add cassandra //,"com.netflix.astyanax" % "astyanax-core" % "1.56.43" diff --git a/src/main/scala/com/gravity/goose/network/gae/GAEClientConnection.scala b/src/main/scala/com/gravity/goose/network/gae/GAEClientConnection.scala index 348c01fb6..4eb787462 100644 --- a/src/main/scala/com/gravity/goose/network/gae/GAEClientConnection.scala +++ b/src/main/scala/com/gravity/goose/network/gae/GAEClientConnection.scala @@ -16,7 +16,8 @@ import java.net.URI import java.net.URISyntaxException import java.util.concurrent.TimeUnit import GAEClientConnection._ -import scala.reflect.{ BeanProperty, BooleanBeanProperty } +import scala.beans._ +//import scala.reflect.{ BeanProperty, BooleanBeanProperty } import scala.collection.JavaConversions._ import org.apache.http.conn.HttpClientConnectionManager import java.net.Socket diff --git a/src/main/scala/com/gravity/goose/network/gae/GAEConnectionManager.scala b/src/main/scala/com/gravity/goose/network/gae/GAEConnectionManager.scala index 1d45f712c..5e8f8819a 100644 --- a/src/main/scala/com/gravity/goose/network/gae/GAEConnectionManager.scala +++ b/src/main/scala/com/gravity/goose/network/gae/GAEConnectionManager.scala @@ -11,7 +11,8 @@ import org.apache.http.params.HttpParams import java.net.InetSocketAddress import java.net.Socket import java.util.concurrent.TimeUnit -import scala.reflect.BeanProperty +//import scala.reflect.BeanProperty +import scala.beans.BeanProperty import com.gravity.goose.network.GAEClientConnection import org.apache.http.conn.HttpClientConnectionManager diff --git a/src/main/scala/com/gravity/goose/opengraph/OpenGraphData.scala b/src/main/scala/com/gravity/goose/opengraph/OpenGraphData.scala index b1c4bc964..0a6e4d268 100644 --- a/src/main/scala/com/gravity/goose/opengraph/OpenGraphData.scala +++ b/src/main/scala/com/gravity/goose/opengraph/OpenGraphData.scala @@ -15,7 +15,7 @@ Copyright [2014] Robby Pond */ package com.gravity.goose.opengraph; -case class OpenGraphData { +case class OpenGraphData() { var title: String = "" var siteName: String = "" var url: String = "" From 2557c08e1234a2db99969a756d2894a55458fbaa Mon Sep 17 00:00:00 2001 From: raisercostin Date: Tue, 28 Oct 2014 23:28:13 +0200 Subject: [PATCH 337/347] - fix compilation errors --- build.sbt | 24 +++++++++---------- .../scala/com/gravity/goose/Crawler.scala | 2 +- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/build.sbt b/build.sbt index e3b666a7f..c4d07ffbc 100644 --- a/build.sbt +++ b/build.sbt @@ -46,9 +46,9 @@ credentials += Credentials(Path.userHome / ".ivy2" / ".credentials") libraryDependencies ++= { Seq( "org.slf4j" % "slf4j-api" % "1.7.7" - ,"org.slf4j" % "slf4j-simple" % "1.7.7" + //,"org.slf4j" % "slf4j-simple" % "1.7.7" ,"org.slf4j" % "slf4j-log4j12" % "1.7.7" % Test - //,"log4j" % "log4j" % "1.2.14" + ,"log4j" % "log4j" % "1.2.14" ,"commons-io" % "commons-io" % "2.4" ,"org.apache.httpcomponents" % "httpclient" % "4.3.3" ,"commons-lang" % "commons-lang" % "2.6" @@ -94,22 +94,20 @@ pomIncludeRepository := { _ => true} //publishTo := Some(Resolver.file("Github Pages", Path.userHome /"repo" / "maven" asFile)(Patterns(true, Resolver.mavenStyleBasePattern))) //publishTo := Some(Resolver.file("goose", new File("d:/Dropbox/public/libs"))(Patterns(true, Resolver.mavenStyleBasePattern)) ) publishTo := Some(Resolver.file("goose", new File("./target/publish"))(Patterns(true, Resolver.mavenStyleBasePattern)) ) -/* -publishTo := { - val nexus = "https://oss.sonatype.org/" - if (isSnapshot.value) - Some("snapshots" at nexus + "content/repositories/snapshots") - else - Some("releases" at nexus + "service/local/staging/deploy/maven2") -} +//publishTo := { +// val nexus = "https://oss.sonatype.org/" +// if (isSnapshot.value) +// Some("snapshots" at nexus + "content/repositories/snapshots") +// else +// Some("releases" at nexus + "service/local/staging/deploy/maven2") +//} pomExtra := ( - git@github.com:warrd/goose-fork.git - scm:git:git@github.com:warrd/goose-fork.git + git@github.com:raisercostin/goose.git + scm:git:git@github.com:raisercostin/goose.git ) -*/ EclipseKeys.createSrc := EclipseCreateSrc.Default + EclipseCreateSrc.Resource diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index 2b909051f..5373b7c9a 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -75,7 +75,7 @@ class Crawler(config: Configuration) { article.rawDoc = doc.clone article.title = extractor.getTitle(article) - article.publishDate = config.publishDateExtractor.extract(doc) + article.publishDate = config.publishDateExtractor.extract(doc).toDate article.additionalData = config.getAdditionalDataExtractor.extract(doc) article.metaDescription = extractor.getMetaDescription(article) article.metaKeywords = extractor.getMetaKeywords(article) From 1e0397698f98573df68002056a9df408b5379b8c Mon Sep 17 00:00:00 2001 From: raisercostin Date: Wed, 29 Oct 2014 12:30:17 +0200 Subject: [PATCH 338/347] - fix compilation errors after merge --- .../com/gravity/goose/Configuration.scala | 29 ++++++++++--------- .../scala/com/gravity/goose/Crawler.scala | 9 ++---- .../goose/images/StandardImageExtractor.scala | 1 - .../scala/com/gravity/goose/TestUtils.scala | 4 +-- .../gravity/goose/TextExtractionsTest.scala | 12 ++++---- 5 files changed, 25 insertions(+), 30 deletions(-) diff --git a/src/main/scala/com/gravity/goose/Configuration.scala b/src/main/scala/com/gravity/goose/Configuration.scala index a31b8839a..2cba5b825 100644 --- a/src/main/scala/com/gravity/goose/Configuration.scala +++ b/src/main/scala/com/gravity/goose/Configuration.scala @@ -77,22 +77,23 @@ case class Configuration( * image extractor to implement the ImageExtractor interface to build your own */ @BeanProperty var enableAllImagesFetching: Boolean = true, - /** - * path to your imagemagick convert executable, on the mac using mac ports this is the default listed - */ - @BeanProperty - //var imagemagickConvertPath: String = "/usr/local/bin/convert" - //var imagemagickConvertPath: String = sys.env.get("GOOSE_IMGMAGICK_CONVERT_PATH").getOrElse("/opt/local/bin/convert") - var imagemagickConvertPath: String = sys.env.get("GOOSE_IMGMAGICK_CONVERT_PATH").getOrElse("convert") - /** - * path to your imagemagick identify executable - */ + + /** + * path to your imagemagick convert executable, on the mac using mac ports this is the default listed + */ @BeanProperty - //var imagemagickIdentifyPath: String = "/usr/local/bin/identify" - //var imagemagickIdentifyPath: String = "identify", + //var imagemagickConvertPath: String = "/usr/local/bin/convert", + //var imagemagickConvertPath: String = sys.env.get("GOOSE_IMGMAGICK_CONVERT_PATH").getOrElse("/opt/local/bin/convert"), + var imagemagickConvertPath: String = sys.env.get("GOOSE_IMGMAGICK_CONVERT_PATH").getOrElse("convert"), + + /** + * path to your imagemagick identify executable + */ @BeanProperty - //var imagemagickIdentifyPath: String = sys.env.get("GOOSE_IMGMAGICK_IDENTIFY_PATH").getOrElse("/opt/local/bin/identify") - var imagemagickIdentifyPath: String = sys.env.get("GOOSE_IMGMAGICK_IDENTIFY_PATH").getOrElse("identify") + //var imagemagickIdentifyPath: String = "/usr/local/bin/identify", + //var imagemagickIdentifyPath: String = "identify", + //var imagemagickIdentifyPath: String = sys.env.get("GOOSE_IMGMAGICK_IDENTIFY_PATH").getOrElse("/opt/local/bin/identify"), + var imagemagickIdentifyPath: String = sys.env.get("GOOSE_IMGMAGICK_IDENTIFY_PATH").getOrElse("identify"), @BeanProperty var connectionTimeout: Int = 10000 // 10 seconds , diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index 8ee9ef4a6..ed9100d75 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -101,17 +101,12 @@ class Crawler(config: Configuration) { try { if (article.rawDoc == null) { article.topImage = new Image - article.images = Nil + article.allImages = Nil } else { -<<<<<<< HEAD - article.topImage = imageExtractor.getBestImage(article.rawDoc, node) if (config.enableAllImagesFetching) { + article.topImage = imageExtractor.getBestImage(article.rawDoc, node) article.allImages = imageExtractor.getAllImages(node) } -======= - article.topImage = imageExtractor.getBestImage(article.rawDoc, article.topNode) - article.images = imageExtractor.getAllImages(article.topNode) ->>>>>>> remotes/pickl-it/master } } catch { case e: Exception => { diff --git a/src/main/scala/com/gravity/goose/images/StandardImageExtractor.scala b/src/main/scala/com/gravity/goose/images/StandardImageExtractor.scala index 237a9cae6..bc486e01b 100644 --- a/src/main/scala/com/gravity/goose/images/StandardImageExtractor.scala +++ b/src/main/scala/com/gravity/goose/images/StandardImageExtractor.scala @@ -40,7 +40,6 @@ import org.apache.http.client.methods.HttpGet * Date: 8/18/11 */ -case class DepthTraversal(node: Element, parentDepth: Int, siblingDepth: Int) /** * This image extractor will attempt to find the best image nearest the article. diff --git a/src/test/scala/com/gravity/goose/TestUtils.scala b/src/test/scala/com/gravity/goose/TestUtils.scala index 11af5bb11..6059e59cf 100644 --- a/src/test/scala/com/gravity/goose/TestUtils.scala +++ b/src/test/scala/com/gravity/goose/TestUtils.scala @@ -54,7 +54,7 @@ object TestUtils { articleReport.append("IMAGE: ").append(TAB).append(article.topImage.getImageSrc).append(NL) articleReport.append("All_IMGS: ").append(TAB).append(article.allImages).append(NL) articleReport.append("IMGKIND: ").append(TAB).append(article.topImage.imageExtractionType).append(NL) - articleReport.append("ALL_IMAGES: ").append(TAB).append(article.images.map((i: Image) => i.getImageSrc)).append(NL) + articleReport.append("ALL_IMAGES: ").append(TAB).append(article.allImages.map((i: Image) => i.getImageSrc)).append(NL) articleReport.append("CONTENT: ").append(TAB).append(article.cleanedArticleText.replace("\n", " ")).append(NL) articleReport.append("HTML CONTENT: ").append(TAB).append(article.htmlArticle).append(NL) articleReport.append("METAKW: ").append(TAB).append(article.metaKeywords).append(NL) @@ -93,7 +93,7 @@ object TestUtils { assertEquals("Image src was not as expected!", expectedImage, src) } if (expectedImages != null) { - val images: List[Image] = article.images + val images: List[Image] = article.allImages assertNotNull("Images was NULL!", images) assertEquals("Different number of images then expected!", expectedImages.size, images.size) images.zip(expectedImages).foreach{ case (i: Image, ei: String) => diff --git a/src/test/scala/com/gravity/goose/TextExtractionsTest.scala b/src/test/scala/com/gravity/goose/TextExtractionsTest.scala index b90fe63e1..931e06974 100644 --- a/src/test/scala/com/gravity/goose/TextExtractionsTest.scala +++ b/src/test/scala/com/gravity/goose/TextExtractionsTest.scala @@ -172,22 +172,22 @@ class TextExtractionsTest { def wiredPubDate() { val url = "http://www.wired.com/playbook/2010/08/stress-hormones-boxing/"; val html = getHtml("wired1.txt") - val fmt = new SimpleDateFormat("yyyy-MM-dd") - + //val fmt = new SimpleDateFormat("yyyy-MM-dd") + import com.github.nscala_time.time.Imports._ + val dateParser = DateTimeFormat.forPattern("yyyy-MM-dd") // example of a custom PublishDateExtractor implicit val config = new Configuration(); config.enableImageFetching = false config.setPublishDateExtractor(new PublishDateExtractor() { @Override - def extract(rootElement: Element): Date = { + def extract(rootElement: Element): DateTime = { // look for this guy: val elements = Selector.select("meta[name=DisplayDate]", rootElement); if (elements.size() == 0) return null; val metaDisplayDate = elements.get(0); if (metaDisplayDate.hasAttr("content")) { val dateStr = metaDisplayDate.attr("content"); - - return fmt.parse(dateStr); + return dateParser.parseDateTime(dateStr); } null; } @@ -202,7 +202,7 @@ class TextExtractionsTest { val expectedDateString = "2010-08-18"; assertNotNull("publishDate should not be null!", article.publishDate); - assertEquals("Publish date should equal: \"2010-08-18\"", expectedDateString, fmt.format(article.publishDate)); + assertEquals("Publish date should equal: \"2010-08-18\"", expectedDateString, dateParser.print(new DateTime(article.publishDate))); } @Test From d0314215490b1f8a0d5d2918800d7c89e6af5d3f Mon Sep 17 00:00:00 2001 From: raisercostin Date: Wed, 29 Oct 2014 18:23:48 +0200 Subject: [PATCH 339/347] - upgrade to scala 2.11.2 --- build.sbt | 6 +++--- src/main/scala/com/gravity/goose/Crawler.scala | 2 +- test-2014-10-29 16_20_15-Scala - Scala IDE.png | Bin 0 -> 14072 bytes 3 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 test-2014-10-29 16_20_15-Scala - Scala IDE.png diff --git a/build.sbt b/build.sbt index c4d07ffbc..41670be39 100644 --- a/build.sbt +++ b/build.sbt @@ -25,7 +25,7 @@ scalaVersion := "2.11.2" //scalaVersion := "2.11.1" //scalaVersion := "2.10.2" -crossScalaVersions := Seq("2.11.1", "2.11.0", "2.10.4") +crossScalaVersions := Seq("2.11.2")//, "2.11.0", "2.10.4") testFrameworks += TestFrameworks.ScalaTest @@ -55,7 +55,7 @@ libraryDependencies ++= { ,"com.ibm.icu" % "icu4j" % "53.1" ,"me.champeau.jlangdetect" % "jlangdetect-extra" % "0.4" ,"org.jsoup" % "jsoup" % "1.7.3" - ,"net.liftweb" % "lift-json_2.10" % "2.5" + ,"net.liftweb" %% "lift-json" % "2.6-RC1" ,"com.github.nscala-time" %% "nscala-time" % "1.4.0" ,"com.typesafe" % "config" % "1.0.2" ,"com.jsuereth" %% "scala-arm" % "1.4" @@ -130,7 +130,7 @@ scalacOptions ++= Seq("-unchecked", "-deprecation") def svnPublish = Command.args("svnPublish", "") { (state, args) => val ver = "2.2.2-SNAPSHOT" val svnUrl = """https://raisercostin.googlecode.com/svn/maven2""" - val command = s"""svn import -m "binary release" target\\publish\\com\\gravity\\goose\\goose_2.10\\$ver $svnUrl/com/gravity/goose/goose_2.10/$ver """ + val command = s"""svn import -m "binary release" target\\publish\\com\\gravity\\goose\\goose_2.11\\$ver $svnUrl/com/gravity/goose/goose_2.11/$ver """ println(s"\nexecute $command") command.! state diff --git a/src/main/scala/com/gravity/goose/Crawler.scala b/src/main/scala/com/gravity/goose/Crawler.scala index ed9100d75..5e15b4e95 100644 --- a/src/main/scala/com/gravity/goose/Crawler.scala +++ b/src/main/scala/com/gravity/goose/Crawler.scala @@ -75,7 +75,7 @@ class Crawler(config: Configuration) { article.rawDoc = doc.clone article.title = extractor.getTitle(article) - article.publishDate = config.publishDateExtractor.extract(doc).toDate + article.publishDate = Option(config.publishDateExtractor.extract(doc)).map(_.toDate).getOrElse(null) article.additionalData = config.getAdditionalDataExtractor.extract(doc) article.metaDescription = extractor.getMetaDescription(article) article.metaKeywords = extractor.getMetaKeywords(article) diff --git a/test-2014-10-29 16_20_15-Scala - Scala IDE.png b/test-2014-10-29 16_20_15-Scala - Scala IDE.png new file mode 100644 index 0000000000000000000000000000000000000000..96f083c3e236055e83d07967a5c90c76abc7d0d9 GIT binary patch literal 14072 zcmb`tcQ~Bi`z|_C)QB2{=tLbQYIKPfqKw|V=tOj8kPwV6QAhMPI*HMZ=t2+-qXY@j zdpGJC`Fzj5&gY!7_w~E>Z~wu(^Uhl9dDeQL=U&f!uNSJNp-fCjO9%h}h+n8EXafK^ z2<-JKJ}&mZGo9ZI_5;ULTlpEFa_G?-_RAf6d3AXJpeCN^!s;&eJHcxeBToR}e&@{} zPOm%M7JHN2OVQ9v$NiO;uhknnfbttVJ2y`UcQ122d~6p{_ZJHCx_;(cnSn|4dYL<( z=<##3*-2bJ8ewXl>bdh>pmKorC{C@X_O^u7qeDWR)TT&$Tdz%dHbDgj&@BSokCE+e z47sfP_n1jw;Trhr&mx&)X`hUQMTA)%gonxD`*UOl+0I|i=rym``)--(tsFk(C@yWw zMg)}&1zkF2OBA2f2RE;8N-F^Xsso)Qvb>Kqvv_;r8D*_mW&ddEXwCz4i4=%KKJ5Q^ zP68$3Z_)amA*RV|+VHwdDQHOc8oX4Wg%t5z86vj8Nnnhm1+d$V7QC>&y1*>7<1tb? zqbmpP=wvSH%{R8T^cJ26mF;D|`dME@4hmdN@9ip-rjFKeKl^aHPrL#Za(k+2`ei?0 zFGKd4uN)+ObZF*2as0icuOEPQfVO&hnuJc@xpYr$EZ}6;H`{Lk%F*RHES)-_(&F>7 z<=G}IFxn5Zn60g>s&j>PG-rL4>v`%k{&76~@@kl_+raItDXrD|gP+$1i^rc;29I7(>PTn(PpodH zB6{CHVC;vkQ~a(5Wg~$5H(ptf?>DMer?>4J zv+KHVub)h}91rMbUW+-t_4B&q;U0uI??+CDb${&kug_*J;+3$Fx-zZmr=yJM+8S0T zoo`<8+UtBz(bauo$`n-V(!^aB7I3yKb#=PfSfS0ZeO0(B`=sEG>vVq^Dsl8WXk6RF zdxp^Cd~_cApe&mzq7V+6wHZ8VyS_9{!Nopavd?F*Yv%BC3y{xY-@y7Q{5u_2ygBRL ztzX$)ySXb#^wOO1Nhx*4DR%O=_Ez)bOG{eo=Yu3u3!$*ee8s_~bM(Pup7!Z0^EPzQ zo55k-Oh`m{0dcADNyRr-r)%(K`htmAkQunu^^@P966Fq4=D4V!y|2-!Y9kN%`OL*Z zpGG|74L@XKr;uQ{HQ6LGR!WAjBl*d6|A>S(k+zWJh=e^(xBj6DMFp=s>)!>}8P{vNV_+x#t$`X_E~yD z&Od*c|BugC?5?WSKATS$5JdcKf>!^8MJK|73TW_&O{1Yj(d$y#AdRkiuX`R^^&Qi4 zx*R+Ip!la(P+G=~rw*XNH%qEjdOS{MnPSnm_ZcH@N2G&{S8AS=&hR#L@xWTg%8oau zK4P;9OcJ#!VT>|G8c2UuXz{T$+)M`1)cYRaSMb?e66)^Q=IHLQ+eik%&L{qmA==uG zb@xivvL9Tplm?TU(b@bq!fbNyO*v~)X2Xu3dK_1*MCrK6i1B{Yl!kb!l-J1|CHZ|e zAx!Iqx6p!2J{LSUzs6zJ&R_M*{yyWY#Zb7#{?T7oj3oQCi=#zfts!#hf$*(7+^_gX zdml-na?Q%_ne2UBSB#zhF#J`94R^jpy4tlqn%PkzxI0;w-wZWTVZvb^xFu5KJ}+ap zbAHHH1$qii9j+w-I@P&<<_Kywc3H(V8v6FGBuTe!qn{AcXxBMkhkQP^;3uzYg%}#Q z`RUOXHoB`bfHFp<%`V1{ilcRA+IXA9fI9xt!{wC4X4iTi+A}2!C;V=d*Wg8TS4?v9 zJiqaEKV#SD;=ryb`@k+9Neeyys-1x6QWuA;{U@arWyw2rRCie~)K|HUFK(cMCT2DG$S`0m-v&eu+|Q1a;jBG`MN)rN`MtRaEk@R9+rD z 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 NLQzAZ@|oqk{|kY4Fm3<< literal 0 HcmV?d00001 From 83d03a21243638e175fff1076828cdf890749b38 Mon Sep 17 00:00:00 2001 From: raisercostin Date: Wed, 29 Oct 2014 21:22:47 +0200 Subject: [PATCH 340/347] - upgrade pom.xml --- build.sbt | 2 +- pom.xml | 94 +++++++++++++++++++++++++++++++++---------------------- 2 files changed, 57 insertions(+), 39 deletions(-) diff --git a/build.sbt b/build.sbt index 41670be39..9f61dc60e 100644 --- a/build.sbt +++ b/build.sbt @@ -50,8 +50,8 @@ libraryDependencies ++= { ,"org.slf4j" % "slf4j-log4j12" % "1.7.7" % Test ,"log4j" % "log4j" % "1.2.14" ,"commons-io" % "commons-io" % "2.4" - ,"org.apache.httpcomponents" % "httpclient" % "4.3.3" ,"commons-lang" % "commons-lang" % "2.6" + ,"org.apache.httpcomponents" % "httpclient" % "4.3.3" ,"com.ibm.icu" % "icu4j" % "53.1" ,"me.champeau.jlangdetect" % "jlangdetect-extra" % "0.4" ,"org.jsoup" % "jsoup" % "1.7.3" diff --git a/pom.xml b/pom.xml index 54af62406..ed07c1bc0 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,7 @@ 4.0.0 com.gravity.goose - goose_2.10 + goose_2.11 2.2.4-SNAPSHOT jar goose @@ -75,41 +75,84 @@ Goose was originally an article extractor written in Java that has most recently http://www.gravity.com/GravityLabs http://robbie.robnrob.com/ + + raisercostin + Costin Grigore + brainlight + http://blog.raisercostin.org/ + UTF-8 1.5 1.5 1.7 - 2.10.4 + 2.11.2 + 2.11 3.1.2.RELEASE 1.7.1 ${appengine.sdk.root} + 1.7.7 org.slf4j slf4j-api - 1.7.6 + ${slf4j.version} + - org.jsoup - jsoup - 1.7.3 + org.slf4j + slf4j-log4j12 + ${slf4j.version} + test + + + log4j + log4j + 1.2.14 + commons-io commons-io 2.4 + + commons-lang + commons-lang + 2.6 + + + org.apache.httpcomponents + httpclient + 4.3.3 + + + org.jsoup + jsoup + 1.7.3 + + + com.chenlb.mmseg4j + mmseg4j-core + 1.9.1 + + + com.github.nscala-time + nscala-time_${scala.prefix} + 1.4.0 + + org.scala-lang scala-compiler @@ -120,26 +163,12 @@ Goose was originally an article extractor written in Java that has most recently scala-library ${scala.version} - - org.apache.httpcomponents - httpclient - 4.3.3 - - - commons-lang - commons-lang - 2.6 - + com.googlecode.juniversalchardet juniversalchardet 1.0.3 - - com.chenlb.mmseg4j - mmseg4j-core - 1.9.1 - com.ibm.icu icu4j @@ -151,18 +180,7 @@ Goose was originally an article extractor written in Java that has most recently 4.11 test - - org.slf4j - slf4j-log4j12 - 1.7.6 - test - - - log4j - log4j - 1.2.14 - com.google.appengine appengine-api-labs @@ -188,12 +206,12 @@ Goose was originally an article extractor written in Java that has most recently com.fasterxml.jackson.core jackson-databind - 2.2.2 + 2.4.3 com.fasterxml.jackson.module - jackson-module-scala_2.10 - 2.2.2 + jackson-module-scala_${scala.prefix} + 2.4.3 org.simpleframework @@ -225,8 +243,8 @@ Goose was originally an article extractor written in Java that has most recently ${project.artifactId}-${project.version} ${basedir}/src/main/scala ${basedir}/src/test/scala - ${project.basedir}/target/scala-2.10/classes - ${project.basedir}/target/scala-2.10/test-classes + ${project.basedir}/target/scala-out/classes + ${project.basedir}/target/scala-out/test-classes org.apache.maven.plugins From dd4a4307e8668bb1504a7a11c04eecf2ab4f5af1 Mon Sep 17 00:00:00 2001 From: raisercostin Date: Wed, 29 Oct 2014 21:25:16 +0200 Subject: [PATCH 341/347] [maven-release-plugin] prepare release goose_2.11-2.2.4 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ed07c1bc0..d798d2204 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ 4.0.0 com.gravity.goose goose_2.11 - 2.2.4-SNAPSHOT + 2.2.4 jar goose https://github.com/raisercostin/goose @@ -58,7 +58,7 @@ Goose was originally an article extractor written in Java that has most recently scm:git:https://github.com/raisercostin/goose.git scm:git:https://github.com/raisercostin/goose.git https://github.com/raisercostin/goose.git - HEAD + goose_2.11-2.2.4 From 89744669381db374b13bc6cd067a3b390f587b3a Mon Sep 17 00:00:00 2001 From: raisercostin Date: Wed, 29 Oct 2014 21:25:24 +0200 Subject: [PATCH 342/347] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index d798d2204..865640e27 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ 4.0.0 com.gravity.goose goose_2.11 - 2.2.4 + 2.2.5-SNAPSHOT jar goose https://github.com/raisercostin/goose @@ -58,7 +58,7 @@ Goose was originally an article extractor written in Java that has most recently scm:git:https://github.com/raisercostin/goose.git scm:git:https://github.com/raisercostin/goose.git https://github.com/raisercostin/goose.git - goose_2.11-2.2.4 + HEAD From e7fa1d87fdc04a373c3153c1f5a118a87995f8b9 Mon Sep 17 00:00:00 2001 From: raisercostin Date: Fri, 14 Oct 2016 14:03:44 +0200 Subject: [PATCH 343/347] distribution moved to bintray --- README.md | 16 +++++++--- pom.xml | 91 ++++++++++++++++++++++++++----------------------------- 2 files changed, 55 insertions(+), 52 deletions(-) diff --git a/README.md b/README.md index b9251f915..ba364547f 100644 --- a/README.md +++ b/README.md @@ -115,17 +115,25 @@ The stopword lists introduced in the [Python-Goose project](https://github.com/g into Goose. ##Release -- release with standard maven process at http://raisercostin.googlecode.com/svn/maven2/com/gravity/goose/ +### Release with maven +- to release for scala 2.11 + `mvn release:prepare -Prelease -DskipTests -Darguments="-DskipTests -Prelease"` +- to release for scala 2.10 + `mvn release:prepare -Prelease -Pscala210 -DskipTests -Darguments="-DskipTests -Prelease -Pscala210"` + +The release is done via bintray +- release with standard maven process at http://raisercostin.googlecode.com/svn/maven2/com/gravity/goose/ mvn release:prepare -Prelease -DskipTests -Darguments="-DskipTests -Prelease" - mvn release:perform -Prelease -DskipTests -Darguments="-DskipTests -Prelease" + mvn release:perform -Prelease -DskipTests -Darguments="-DskipTests -Prelease" - configure your ~/.m2/settings.xml as - + ``` raisercostin-releases svn-user svn-pass - \ No newline at end of file + + ``` diff --git a/pom.xml b/pom.xml index 865640e27..16f8038dd 100644 --- a/pom.xml +++ b/pom.xml @@ -12,11 +12,31 @@ 4.0.0 com.gravity.goose - goose_2.11 - 2.2.5-SNAPSHOT + goose_${scala.prefix} + 2.2.5 jar goose - https://github.com/raisercostin/goose + + UTF-8 + 1.5 + 1.5 + 1.7 + 2.11 + 2.11.2 + + 3.1.2.RELEASE + 1.7.1 + ${appengine.sdk.root} + 1.7.7 + + raisercostin + goose + https://github.com/${github.user}/${github.repo} + ${github.user} + maven + ${github.repo} + + ${github.url} Html Content / Article Extractor in Scala - open sourced from Gravity Labs - http://gravity.com Goose was originally an article extractor written in Java that has most recently (aug2011) converted to a scala project. It's mission is to take any news article or article type web page and not only extract what is the main body of the article but also all meta data and most probable image candidate. @@ -26,40 +46,22 @@ Goose was originally an article extractor written in Java that has most recently http://www.apache.org/licenses/LICENSE-2.0.txt + + scm:git:${github.url}.git + scm:git:${github.url}.git + ${github.url} + ${project.artifactId}-${project.version} + - raisercostin-releases - svn:https://raisercostin.googlecode.com/svn/maven2/ + bintray + https://api.bintray.com/maven/${bintray.user}/${bintray.repo}/${bintray.package} - - raisercostin-snapshots - svn:https://raisercostin.googlecode.com/svn/maven2-snapshots/ - - - - - scm:git:https://github.com/raisercostin/goose.git - scm:git:https://github.com/raisercostin/goose.git - https://github.com/raisercostin/goose.git - HEAD - + + Github + https://github.com/raisercostin/${project.artifactId}/issues + jiminoc @@ -78,23 +80,9 @@ Goose was originally an article extractor written in Java that has most recently raisercostin Costin Grigore - brainlight - http://blog.raisercostin.org/ + http://raisercostin.org/ - - UTF-8 - 1.5 - 1.5 - 1.7 - 2.11.2 - 2.11 - - 3.1.2.RELEASE - 1.7.1 - ${appengine.sdk.root} - 1.7.7 - org.slf4j @@ -492,6 +480,13 @@ Goose was originally an article extractor written in Java that has most recently + + scala210 + + 2.10 + 2.10.4 + + release From 4ae111bd8b647f9e39e8e62959c9ac97315f1f20 Mon Sep 17 00:00:00 2001 From: raisercostin Date: Fri, 14 Oct 2016 14:23:29 +0200 Subject: [PATCH 344/347] autopublish to bintray --- pom.xml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 16f8038dd..ad0dadef9 100644 --- a/pom.xml +++ b/pom.xml @@ -12,8 +12,9 @@ 4.0.0 com.gravity.goose - goose_${scala.prefix} - 2.2.5 + goose_2.11 + + 2.2.6 jar goose @@ -52,10 +53,11 @@ Goose was originally an article extractor written in Java that has most recently ${github.url} ${project.artifactId}-${project.version} + bintray - https://api.bintray.com/maven/${bintray.user}/${bintray.repo}/${bintray.package} + https://api.bintray.com/maven/${bintray.user}/${bintray.repo}/${bintray.package}/;publish=1 From 837a76623b8b0e7579417206f17602fd2ac84aa1 Mon Sep 17 00:00:00 2001 From: raisercostin Date: Sun, 5 Feb 2017 20:17:32 +0100 Subject: [PATCH 345/347] added pom files to release for scala 2.10 and 2.11 --- README.md | 6 + pom_scala210.xml | 536 ++++++++++++++++++++++++++++++++++++++++++++++ pom_scala211.xml | 546 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1088 insertions(+) create mode 100644 pom_scala210.xml create mode 100644 pom_scala211.xml diff --git a/README.md b/README.md index ba364547f..c4c912553 100644 --- a/README.md +++ b/README.md @@ -137,3 +137,9 @@ The release is done via bintray ``` + +## Deploy libraries to bintray +- deploy for scala 2.11 + `mvn deploy -DskipTests -f pom_scala211.xml -Prelease` +- deploy for scala 2.10 + `mvn deploy -DskipTests -f pom_scala210.xml -Prelease` diff --git a/pom_scala210.xml b/pom_scala210.xml new file mode 100644 index 000000000..01604b1ce --- /dev/null +++ b/pom_scala210.xml @@ -0,0 +1,536 @@ + + + + + 3.0.4 + + 4.0.0 + com.gravity.goose + goose_2.10 + + 2.2.7 + jar + goose + + UTF-8 + 1.5 + 1.5 + 1.7 + + + 3.1.2.RELEASE + 1.7.1 + ${appengine.sdk.root} + 1.7.7 + + raisercostin + goose + https://github.com/${github.user}/${github.repo} + ${github.user} + maven + ${github.repo} + + ${github.url} + Html Content / Article Extractor in Scala - open sourced from Gravity Labs - http://gravity.com +Goose was originally an article extractor written in Java that has most recently (aug2011) converted to a scala project. It's mission is to take any news article or article type web page and not only extract what is the main body of the article but also all meta data and most probable image candidate. + + + The Apache Software License, Version 2.0 + repo + http://www.apache.org/licenses/LICENSE-2.0.txt + + + + scm:git:${github.url}.git + scm:git:${github.url}.git + ${github.url} + ${project.artifactId}-${project.version} + + + + + bintray + https://api.bintray.com/maven/${bintray.user}/${bintray.repo}/${bintray.package}/;publish=1 + + + + Github + https://github.com/raisercostin/${project.artifactId}/issues + + + + jiminoc + Jim Plush + Gravity Labs + http://www.gravity.com/GravityLabs + http://jimplush.com + + + erraggy + Robbie Coleman + Gravity Labs + http://www.gravity.com/GravityLabs + http://robbie.robnrob.com/ + + + raisercostin + Costin Grigore + http://raisercostin.org/ + + + + + org.slf4j + slf4j-api + ${slf4j.version} + + + + org.slf4j + slf4j-log4j12 + ${slf4j.version} + test + + + log4j + log4j + 1.2.14 + + + + commons-io + commons-io + 2.4 + + + commons-lang + commons-lang + 2.6 + + + org.apache.httpcomponents + httpclient + 4.3.3 + + + org.jsoup + jsoup + 1.7.3 + + + com.chenlb.mmseg4j + mmseg4j-core + 1.9.1 + + + com.github.nscala-time + nscala-time_2.10 + 1.4.0 + + + + org.scala-lang + scala-compiler + 2.10.6 + + + org.scala-lang + scala-library + 2.10.6 + + + + com.googlecode.juniversalchardet + juniversalchardet + 1.0.3 + + + com.ibm.icu + icu4j + 53.1 + + + junit + junit + 4.11 + test + + + + com.google.appengine + appengine-api-labs + ${gae.version} + + + com.google.appengine + appengine-api-stubs + ${gae.version} + + + com.google.appengine + appengine-testing + ${gae.version} + + + com.google.appengine + appengine-api-1.0-sdk + ${gae.version} + compile + + + + com.fasterxml.jackson.core + jackson-databind + 2.4.3 + + + com.fasterxml.jackson.module + jackson-module-scala_2.10 + 2.4.3 + + + org.simpleframework + simple + 4.1.21 + + + + + + package + ${project.basedir}/target + ${project.artifactId}-${project.version} + ${basedir}/src/main/scala + ${basedir}/src/test/scala + ${project.basedir}/target/scala-out/classes + ${project.basedir}/target/scala-out/test-classes + + + org.apache.maven.plugins + maven-surefire-plugin + 2.17 + + false + true + + **/*Test.* + + + **/*IT.* + + + + + + net.alchim31.maven + scala-maven-plugin + 3.1.6 + + + -Xmx1024m + + ${project.build.sourceEncoding} + ${scala.prefix} + ${scala.version} + + -deprecation + -feature + + + + + attach-javadocs + + doc-jar + + + + compile + + compile + + compile + + + test-compile + + testCompile + + test-compile + + + process-resources + + compile + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-source + generate-sources + + add-source + + + + src/main/scala + + + + + + add-test-source + generate-sources + + add-test-source + + + + src/test/scala + + + + + + + org.apache.maven.plugins + maven-eclipse-plugin + 2.8 + + false + false + + org.scala-ide.sdt.core.scalanature + org.eclipse.jdt.core.javanature + + + org.scala-ide.sdt.core.scalabuilder + + + org.scala-ide.sdt.launching.SCALA_CONTAINER + org.eclipse.jdt.launching.JRE_CONTAINER + + + + org.scala-lang:scala-library + org.scala-lang:scala-compiler + + + **/*.scala + **/*.java + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.4 + + + + true + true + true + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + ${project.build.sourceEncoding} + ${source.version} + ${source.version} + + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + ${project.build.sourceEncoding} + + + + org.apache.maven.plugins + maven-release-plugin + 2.5 + + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.1 + + + + + + + com.google.code.maven-svn-wagon + maven-svn-wagon + 1.4 + + + + + + scala210 + + true + + + 2.10 + 2.10.6 + + + + release + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.9.1 + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-source-plugin + 2.3 + + + attach-sources + + jar + + + + + + + + + diff --git a/pom_scala211.xml b/pom_scala211.xml new file mode 100644 index 000000000..b28471b56 --- /dev/null +++ b/pom_scala211.xml @@ -0,0 +1,546 @@ + + + + + 3.0.4 + + 4.0.0 + com.gravity.goose + goose_2.11 + + 2.2.7 + jar + goose + + UTF-8 + 1.5 + 1.5 + 1.7 + + + 3.1.2.RELEASE + 1.7.1 + ${appengine.sdk.root} + 1.7.7 + + raisercostin + goose + https://github.com/${github.user}/${github.repo} + ${github.user} + maven + ${github.repo} + + ${github.url} + Html Content / Article Extractor in Scala - open sourced from Gravity Labs - http://gravity.com +Goose was originally an article extractor written in Java that has most recently (aug2011) converted to a scala project. It's mission is to take any news article or article type web page and not only extract what is the main body of the article but also all meta data and most probable image candidate. + + + The Apache Software License, Version 2.0 + repo + http://www.apache.org/licenses/LICENSE-2.0.txt + + + + scm:git:${github.url}.git + scm:git:${github.url}.git + ${github.url} + ${project.artifactId}-${project.version} + + + + + bintray + https://api.bintray.com/maven/${bintray.user}/${bintray.repo}/${bintray.package}/;publish=1 + + + + Github + https://github.com/raisercostin/${project.artifactId}/issues + + + + jiminoc + Jim Plush + Gravity Labs + http://www.gravity.com/GravityLabs + http://jimplush.com + + + erraggy + Robbie Coleman + Gravity Labs + http://www.gravity.com/GravityLabs + http://robbie.robnrob.com/ + + + raisercostin + Costin Grigore + http://raisercostin.org/ + + + + + org.slf4j + slf4j-api + ${slf4j.version} + + + + org.slf4j + slf4j-log4j12 + ${slf4j.version} + test + + + log4j + log4j + 1.2.14 + + + + commons-io + commons-io + 2.4 + + + commons-lang + commons-lang + 2.6 + + + org.apache.httpcomponents + httpclient + 4.3.3 + + + org.jsoup + jsoup + 1.7.3 + + + com.chenlb.mmseg4j + mmseg4j-core + 1.9.1 + + + com.github.nscala-time + nscala-time_2.11 + 1.4.0 + + + + org.scala-lang + scala-compiler + 2.11.8 + + + org.scala-lang + scala-library + 2.11.8 + + + + com.googlecode.juniversalchardet + juniversalchardet + 1.0.3 + + + com.ibm.icu + icu4j + 53.1 + + + junit + junit + 4.11 + test + + + + com.google.appengine + appengine-api-labs + ${gae.version} + + + com.google.appengine + appengine-api-stubs + ${gae.version} + + + com.google.appengine + appengine-testing + ${gae.version} + + + com.google.appengine + appengine-api-1.0-sdk + ${gae.version} + compile + + + + com.fasterxml.jackson.core + jackson-databind + 2.4.3 + + + com.fasterxml.jackson.module + jackson-module-scala_2.11 + 2.4.3 + + + org.simpleframework + simple + 4.1.21 + + + + + + package + ${project.basedir}/target + ${project.artifactId}-${project.version} + ${basedir}/src/main/scala + ${basedir}/src/test/scala + ${project.basedir}/target/scala-out/classes + ${project.basedir}/target/scala-out/test-classes + + + org.apache.maven.plugins + maven-surefire-plugin + 2.17 + + false + true + + **/*Test.* + + + **/*IT.* + + + + + + net.alchim31.maven + scala-maven-plugin + 3.1.6 + + + -Xmx1024m + + ${project.build.sourceEncoding} + ${scala.prefix} + ${scala.version} + + -deprecation + -feature + + + + + attach-javadocs + + doc-jar + + + + compile + + compile + + compile + + + test-compile + + testCompile + + test-compile + + + process-resources + + compile + + + + + + org.codehaus.mojo + build-helper-maven-plugin + + + add-source + generate-sources + + add-source + + + + src/main/scala + + + + + + add-test-source + generate-sources + + add-test-source + + + + src/test/scala + + + + + + + org.apache.maven.plugins + maven-eclipse-plugin + 2.8 + + false + false + + org.scala-ide.sdt.core.scalanature + org.eclipse.jdt.core.javanature + + + org.scala-ide.sdt.core.scalabuilder + + + org.scala-ide.sdt.launching.SCALA_CONTAINER + org.eclipse.jdt.launching.JRE_CONTAINER + + + + org.scala-lang:scala-library + org.scala-lang:scala-compiler + + + **/*.scala + **/*.java + + + + + org.apache.maven.plugins + maven-jar-plugin + 2.4 + + + + true + true + true + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + ${project.build.sourceEncoding} + ${source.version} + ${source.version} + + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + ${project.build.sourceEncoding} + + + + org.apache.maven.plugins + maven-release-plugin + 2.5 + + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.1 + + + + + + + com.google.code.maven-svn-wagon + maven-svn-wagon + 1.4 + + + + + + scala210 + + true + + + 2.10 + 2.10.6 + + + + scala211 + + true + + + 2.11 + 2.11.8 + + + + release + + + + org.apache.maven.plugins + maven-javadoc-plugin + 2.9.1 + + + attach-javadocs + + jar + + + + + + org.apache.maven.plugins + maven-source-plugin + 2.3 + + + attach-sources + + jar + + + + + + + + + From 179e1a06677c8f37d117aceff0f0cae6a17a44ba Mon Sep 17 00:00:00 2001 From: raisercostin Date: Sun, 26 Feb 2017 22:08:52 +0200 Subject: [PATCH 346/347] prepare 2.2.8 --- .gitignore | 4 +- pom.xml | 526 ----------------------------------------------- pom_scala210.xml | 26 +-- pom_scala211.xml | 34 +-- 4 files changed, 16 insertions(+), 574 deletions(-) delete mode 100644 pom.xml diff --git a/.gitignore b/.gitignore index f9ff3a5c3..86120d4b6 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,6 @@ config/consumer.properties release/ *.sw* .DS_Store -bin/ \ No newline at end of file +bin/ +/.cache-main +/.cache-tests diff --git a/pom.xml b/pom.xml deleted file mode 100644 index ad0dadef9..000000000 --- a/pom.xml +++ /dev/null @@ -1,526 +0,0 @@ - - - - - 3.0.4 - - 4.0.0 - com.gravity.goose - goose_2.11 - - 2.2.6 - jar - goose - - UTF-8 - 1.5 - 1.5 - 1.7 - 2.11 - 2.11.2 - - 3.1.2.RELEASE - 1.7.1 - ${appengine.sdk.root} - 1.7.7 - - raisercostin - goose - https://github.com/${github.user}/${github.repo} - ${github.user} - maven - ${github.repo} - - ${github.url} - Html Content / Article Extractor in Scala - open sourced from Gravity Labs - http://gravity.com -Goose was originally an article extractor written in Java that has most recently (aug2011) converted to a scala project. It's mission is to take any news article or article type web page and not only extract what is the main body of the article but also all meta data and most probable image candidate. - - - The Apache Software License, Version 2.0 - repo - http://www.apache.org/licenses/LICENSE-2.0.txt - - - - scm:git:${github.url}.git - scm:git:${github.url}.git - ${github.url} - ${project.artifactId}-${project.version} - - - - - bintray - https://api.bintray.com/maven/${bintray.user}/${bintray.repo}/${bintray.package}/;publish=1 - - - - Github - https://github.com/raisercostin/${project.artifactId}/issues - - - - jiminoc - Jim Plush - Gravity Labs - http://www.gravity.com/GravityLabs - http://jimplush.com - - - erraggy - Robbie Coleman - Gravity Labs - http://www.gravity.com/GravityLabs - http://robbie.robnrob.com/ - - - raisercostin - Costin Grigore - http://raisercostin.org/ - - - - - org.slf4j - slf4j-api - ${slf4j.version} - - - - org.slf4j - slf4j-log4j12 - ${slf4j.version} - test - - - log4j - log4j - 1.2.14 - - - - commons-io - commons-io - 2.4 - - - commons-lang - commons-lang - 2.6 - - - org.apache.httpcomponents - httpclient - 4.3.3 - - - org.jsoup - jsoup - 1.7.3 - - - com.chenlb.mmseg4j - mmseg4j-core - 1.9.1 - - - com.github.nscala-time - nscala-time_${scala.prefix} - 1.4.0 - - - - org.scala-lang - scala-compiler - ${scala.version} - - - org.scala-lang - scala-library - ${scala.version} - - - - com.googlecode.juniversalchardet - juniversalchardet - 1.0.3 - - - com.ibm.icu - icu4j - 53.1 - - - junit - junit - 4.11 - test - - - - com.google.appengine - appengine-api-labs - ${gae.version} - - - com.google.appengine - appengine-api-stubs - ${gae.version} - - - com.google.appengine - appengine-testing - ${gae.version} - - - com.google.appengine - appengine-api-1.0-sdk - ${gae.version} - compile - - - - com.fasterxml.jackson.core - jackson-databind - 2.4.3 - - - com.fasterxml.jackson.module - jackson-module-scala_${scala.prefix} - 2.4.3 - - - org.simpleframework - simple - 4.1.21 - - - - - - package - ${project.basedir}/target - ${project.artifactId}-${project.version} - ${basedir}/src/main/scala - ${basedir}/src/test/scala - ${project.basedir}/target/scala-out/classes - ${project.basedir}/target/scala-out/test-classes - - - org.apache.maven.plugins - maven-surefire-plugin - 2.17 - - false - true - - **/*Test.* - - - **/*IT.* - - - - - - net.alchim31.maven - scala-maven-plugin - 3.1.6 - - - -Xmx1024m - - ${project.build.sourceEncoding} - ${scala.version} - - - - attach-javadocs - - doc-jar - - - - compile - - compile - - compile - - - test-compile - - testCompile - - test-compile - - - process-resources - - compile - - - - - - org.codehaus.mojo - build-helper-maven-plugin - - - add-source - generate-sources - - add-source - - - - src/main/scala - - - - - - add-test-source - generate-sources - - add-test-source - - - - src/test/scala - - - - - - - org.apache.maven.plugins - maven-eclipse-plugin - 2.8 - - false - false - - org.scala-ide.sdt.core.scalanature - org.eclipse.jdt.core.javanature - - - org.scala-ide.sdt.core.scalabuilder - - - org.scala-ide.sdt.launching.SCALA_CONTAINER - org.eclipse.jdt.launching.JRE_CONTAINER - - - - org.scala-lang:scala-library - org.scala-lang:scala-compiler - - - **/*.scala - **/*.java - - - - - org.apache.maven.plugins - maven-jar-plugin - 2.4 - - - - true - true - true - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.1 - - ${project.build.sourceEncoding} - ${source.version} - ${source.version} - - - - org.apache.maven.plugins - maven-resources-plugin - 2.6 - - ${project.build.sourceEncoding} - - - - org.apache.maven.plugins - maven-release-plugin - 2.5 - - - org.apache.maven.plugins - maven-deploy-plugin - 2.8.1 - - - - - - - com.google.code.maven-svn-wagon - maven-svn-wagon - 1.4 - - - - - - scala210 - - 2.10 - 2.10.4 - - - - release - - - - org.apache.maven.plugins - maven-javadoc-plugin - 2.9.1 - - - attach-javadocs - - jar - - - - - - org.apache.maven.plugins - maven-source-plugin - 2.3 - - - attach-sources - - jar - - - - - - - - - diff --git a/pom_scala210.xml b/pom_scala210.xml index 01604b1ce..326d2b7ae 100644 --- a/pom_scala210.xml +++ b/pom_scala210.xml @@ -14,7 +14,7 @@ com.gravity.goose goose_2.10 - 2.2.7 + 2.2.8 jar goose @@ -22,10 +22,8 @@ 1.5 1.5 1.7 - + 2.10 + 2.10.6 3.1.2.RELEASE 1.7.1 @@ -141,19 +139,19 @@ Goose was originally an article extractor written in Java that has most recently com.github.nscala-time - nscala-time_2.10 + nscala-time_${scala.prefix} 1.4.0 org.scala-lang scala-compiler - 2.10.6 + ${scala.version} org.scala-lang scala-library - 2.10.6 + ${scala.version} @@ -202,7 +200,7 @@ Goose was originally an article extractor written in Java that has most recently com.fasterxml.jackson.module - jackson-module-scala_2.10 + jackson-module-scala_${scala.prefix} 2.4.3 @@ -489,16 +487,6 @@ Goose was originally an article extractor written in Java that has most recently - - scala210 - - true - - - 2.10 - 2.10.6 - - release diff --git a/pom_scala211.xml b/pom_scala211.xml index b28471b56..b94a4dcc5 100644 --- a/pom_scala211.xml +++ b/pom_scala211.xml @@ -14,7 +14,7 @@ com.gravity.goose goose_2.11 - 2.2.7 + 2.2.8 jar goose @@ -22,10 +22,8 @@ 1.5 1.5 1.7 - + 2.11.8 3.1.2.RELEASE 1.7.1 @@ -141,19 +139,19 @@ Goose was originally an article extractor written in Java that has most recently com.github.nscala-time - nscala-time_2.11 + nscala-time_${scala.prefix} 1.4.0 org.scala-lang scala-compiler - 2.11.8 + ${scala.version} org.scala-lang scala-library - 2.11.8 + ${scala.version} @@ -202,7 +200,7 @@ Goose was originally an article extractor written in Java that has most recently com.fasterxml.jackson.module - jackson-module-scala_2.11 + jackson-module-scala_${scala.prefix} 2.4.3 @@ -489,26 +487,6 @@ Goose was originally an article extractor written in Java that has most recently - - scala210 - - true - - - 2.10 - 2.10.6 - - - - scala211 - - true - - - 2.11 - 2.11.8 - - release From 21634573c9c0b8e5989e32bdaaf1ff0b3709e72f Mon Sep 17 00:00:00 2001 From: raisercostin Date: Sun, 26 Feb 2017 22:55:18 +0200 Subject: [PATCH 347/347] update deploy procedure via mvn --- README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c4c912553..58ceee844 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,7 @@ We made sure it was still nice and operable from Java as well so if you're using The stopword lists introduced in the [Python-Goose project](https://github.com/grangier/python-goose) have been incorporated into Goose. + + +## Deploy libraries to bintray + - configure your ~/.m2/settings.xml as ``` @@ -138,8 +143,8 @@ The release is done via bintray ``` -## Deploy libraries to bintray - deploy for scala 2.11 - `mvn deploy -DskipTests -f pom_scala211.xml -Prelease` + ```mvn -f pom_scala211.xml deploy -DskipTests -Prelease``` + - deploy for scala 2.10 - `mvn deploy -DskipTests -f pom_scala210.xml -Prelease` + ```mvn -f pom_scala210.xml deploy -DskipTests -Prelease```

*%RG5D`d> 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 + 4.0.0 + 1 + jar + http://maven.apache.org + + + UTF-8 + + + + + junit + junit + 4.8.1 + test + + + org.slf4j + slf4j-api + 1.6.1 + jar + compile + + + org.slf4j + slf4j-log4j12 + 1.6.1 + test + + + org.jsoup + jsoup + 1.5.2 + + + commons-io + commons-io + 2.0.1 + + + org.quartz-scheduler + quartz + 2.0.0 + + + org.quartz-scheduler + quartz-oracle + 2.0.0 + + + org.quartz-scheduler + quartz-weblogic + 2.0.0 + + + org.quartz-scheduler + quartz-jboss + 2.0.0 + + + org.apache.httpcomponents + httpclient + 4.0.3 + + + commons-lang + commons-lang + 2.6 + + + + + + + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + attach-javadocs + + jar + + + + + + + geese + geese + com.knx.lum + diff --git a/src/main/java/com/jimplush/goose/Article.java b/src/main/java/com/jimplush/goose/Article.java new file mode 100644 index 000000000..43b9edd29 --- /dev/null +++ b/src/main/java/com/jimplush/goose/Article.java @@ -0,0 +1,258 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose; +/** + * User: jim plush + * Date: 12/16/10 + */ + +import com.jimplush.goose.images.Image; +import org.jsoup.nodes.Element; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.MalformedURLException; +import java.net.URL; +import java.util.*; + +/** + * This class represents the extraction of an Article from a website + */ +public class Article { + + private static final Logger logger = LoggerFactory.getLogger(Article.class); + + /** + * Holds the title of the webpage + */ + private String title; + + private Date publishDate; + + /** + * holds the metadescription meta tag in the html doc + */ + private String metaDescription; + + + /** + * holds the clean text after we do strip out everything but the text and wrap it up in a nice package + * this is the guy you probably want, just pure text + */ + private String cleanedArticleText; + + /** + * holds the original unmodified HTML that goose retrieved from the URL + */ + private String rawHtml; + + + /** + * holds the meta keywords that would in the meta tag of the html doc + */ + private String metaKeywords; + + + /** + * holds the meta data canonical link that may be place in the meta tags of the html doc + */ + private String canonicalLink; + + + /** + * holds the domain of where the link came from. + * http://techcrunch.com/article/testme would be techcrunch.com as the domain + */ + private String domain; + + /** + * this represents the jSoup element that we think is the big content dude of this page + * we can use this node to start grabbing text, images, etc.. around the content + */ + private Element topNode; + + + /** + * if image extractor is enable this would hold the image we think is the best guess for the web page + */ + private Image topImage; + + + /** + * holds an array of the image candidates we thought might perhaps we decent images related + * to the content + */ + private ArrayList imageCandidates = new ArrayList(); + + + /** + * holds a list of elements that related to youtube or vimeo movie embeds + */ + private ArrayList movies; + + /** + * holds a list of tags extracted from the article + */ + private Set tags; + + private Map additionalData; + + /** + * returns the title of the webpage + * + * @return + */ + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + /** + * The {@link Date} this {@link Article} was published + * @return an instance of {@link Date} or null if no date was identified + */ + public Date getPublishDate() { + return publishDate; + } + + public void setPublishDate(Date publishDate) { + this.publishDate = publishDate; + } + + public String getMetaDescription() { + return metaDescription; + } + + public void setMetaDescription(String metaDescription) { + this.metaDescription = metaDescription; + } + + public String getMetaKeywords() { + return metaKeywords; + } + + public void setMetaKeywords(String metaKeywords) { + this.metaKeywords = metaKeywords; + } + + public String getCanonicalLink() { + return canonicalLink; + } + + public void setCanonicalLink(String canonicalLink) { + this.canonicalLink = canonicalLink; + } + + public String getDomain() { + return domain; + } + + public void setDomain(String urlToParse) { + String domain = ""; + + URL url = null; + try { + url = new URL(urlToParse); + domain = url.getHost(); + } catch (MalformedURLException e) { + logger.error(e.toString(), e); + } + this.domain = domain; + } + + public Element getTopNode() { + return topNode; + } + + public void setTopNode(Element topNode) { + this.topNode = topNode; + } + + public ArrayList getMovies() { + return movies; + } + + public void setMovies(ArrayList movies) { + this.movies = movies; + } + + /** + * The unique set of tags that matched: "a[rel=tag], a[href*=/tag/]" + * @return the unique set of TAGs extracted from this {@link Article} + */ + public Set getTags() { + if (tags == null) { + tags = new HashSet(); + } + return tags; + } + + public void setTags(Set tags) { + this.tags = tags; + } + + public ArrayList getImageCandidates() { + return imageCandidates; + } + + public void setImageCandidates(ArrayList imageCandidates) { + this.imageCandidates = imageCandidates; + } + + + public Image getTopImage() { + return topImage; + } + + public void setTopImage(Image topImage) { + this.topImage = topImage; + } + + public String getCleanedArticleText() { + return cleanedArticleText; + } + + public void setCleanedArticleText(String cleanedArticleText) { + this.cleanedArticleText = cleanedArticleText; + } + + public String getRawHtml() { + return rawHtml; + } + + public void setRawHtml(String rawHtml) { + this.rawHtml = rawHtml; + } + + /** + * A property bucket for consumers of goose to store custom data extractions. + * This is populated by an implementation of {@link com.jimplush.goose.extractors.AdditionalDataExtractor} + * which is executed before document cleansing within {@link ContentExtractor#extractContent} + * @return a {@link Map Map<String,String>} of property name to property vaue (represented as a {@link String}. + */ + public Map getAdditionalData() { + return additionalData; + } + + public void setAdditionalData(Map additionalData) { + this.additionalData = additionalData; + } +} diff --git a/src/main/java/com/jimplush/goose/Configuration.java b/src/main/java/com/jimplush/goose/Configuration.java new file mode 100644 index 000000000..7f04cf4e2 --- /dev/null +++ b/src/main/java/com/jimplush/goose/Configuration.java @@ -0,0 +1,148 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose; + + +import com.jimplush.goose.extractors.AdditionalDataExtractor; +import com.jimplush.goose.extractors.PublishDateExtractor; +import org.jsoup.nodes.Element; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Date; +import java.util.Map; + +/** + * User: jim + * Date: 12/19/10 + */ + +public class Configuration { + + /** + * this is the local storage path used to place images to inspect them + */ + private String localStoragePath = "/opt/goose"; + + + /** + * What's the minimum bytes for an image we'd accept is, alot of times we want to filter out the author's little images + * in the beginning of the article + */ + private int minBytesForImages = 4500; + + + /** + * set this guy to false if you don't care about getting images, otherwise you can either use the default + * image extractor to implement the ImageExtractor interface to build your own + */ + private boolean enableImageFetching = true; + + + /** + * path to your imagemagick convert executable, on the mac using mac ports this is the default listed + */ + private String imagemagickConvertPath = "/opt/local/bin/convert"; + + + /** + * path to your imagemagick identify executable + */ + private String imagemagickIdentifyPath= "/opt/local/bin/identify"; + + private PublishDateExtractor publishDateExtractor = new PublishDateExtractor() { + @Override + public Date extract(Element rootElement) { + return null; + } + }; + + public PublishDateExtractor getPublishDateExtractor() { + return publishDateExtractor; + } + + /** + * Pass in to extract article publish dates. + * @param extractor a concrete instance of {@link PublishDateExtractor} + * @throws IllegalArgumentException if the instance passed in is null + */ + public void setPublishDateExtractor(PublishDateExtractor extractor) throws IllegalArgumentException { + if (extractor == null) throw new IllegalArgumentException("extractor must not be null!"); + this.publishDateExtractor = extractor; + } + + private AdditionalDataExtractor additionalDataExtractor = new AdditionalDataExtractor() { + @Override + public Map extract(Element rootElement) { + return null; + } + }; + + public AdditionalDataExtractor getAdditionalDataExtractor() { + return additionalDataExtractor; + } + + /** + * Pass in to extract any additional data not defined within {@link Article} + * @param extractor a concrete instance of {@link AdditionalDataExtractor} + * @throws IllegalArgumentException if the instance passed in is null + */ + public void setAdditionalDataExtractor(AdditionalDataExtractor extractor) { + this.additionalDataExtractor = extractor; + } + + public String getLocalStoragePath() { + return localStoragePath; + } + + public void setLocalStoragePath(String localStoragePath) { + this.localStoragePath = localStoragePath; + } + + public int getMinBytesForImages() { + return minBytesForImages; + } + + public void setMinBytesForImages(int minBytesForImages) { + this.minBytesForImages = minBytesForImages; + } + + public boolean isEnableImageFetching() { + return enableImageFetching; + } + + public void setEnableImageFetching(boolean enableImageFetching) { + this.enableImageFetching = enableImageFetching; + } + + public String getImagemagickConvertPath() { + return imagemagickConvertPath; + } + + public void setImagemagickConvertPath(String imagemagickConvertPath) { + this.imagemagickConvertPath = imagemagickConvertPath; + } + + public String getImagemagickIdentifyPath() { + return imagemagickIdentifyPath; + } + + public void setImagemagickIdentifyPath(String imagemagickIdentifyPath) { + this.imagemagickIdentifyPath = imagemagickIdentifyPath; + } +} diff --git a/src/main/java/com/jimplush/goose/ContentExtractor.java b/src/main/java/com/jimplush/goose/ContentExtractor.java new file mode 100644 index 000000000..7c3b61bc1 --- /dev/null +++ b/src/main/java/com/jimplush/goose/ContentExtractor.java @@ -0,0 +1,1053 @@ +/** + * Licensed to Gravity.com under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Gravity.com licenses this file + * to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jimplush.goose; + +import com.jimplush.goose.cleaners.DefaultDocumentCleaner; +import com.jimplush.goose.cleaners.DocumentCleaner; +import com.jimplush.goose.images.BestImageGuesser; +import com.jimplush.goose.images.ImageExtractor; +import com.jimplush.goose.network.*; +import com.jimplush.goose.outputformatters.DefaultOutputFormatter; +import com.jimplush.goose.outputformatters.OutputFormatter; +import com.jimplush.goose.texthelpers.*; +import org.apache.commons.lang.StringEscapeUtils; +import org.apache.http.client.HttpClient; +import org.jsoup.nodes.*; +import org.jsoup.select.Elements; +import org.jsoup.select.Selector; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.*; + +/** + * User: jim plush + * Date: 12/16/10 + * a lot of work in this class is based on Arc90's readability code that does content extraction in JS + * I wasn't able to find a good server side codebase to acheive the same so I started with their base ideas and then + * built additional metrics on top of it such as looking for clusters of english stopwords. + * Gravity was doing 30+ million links per day with this codebase across a series of crawling servers for a project + * and it held up well. Our current port is slightly different than this one but I'm working to align them so the goose + * project gets the love as we continue to move forward. + * + * Cougar: God dammit, Mustang! This is Ghost Rider 117. This bogey is all over me. He's got missile lock on me. Do I have permission to fire? + * Stinger: Do not fire until fired upon... + */ + + +public class ContentExtractor { + + + // PRIVATE PROPERTIES BELOW + + private static final Logger logger = LoggerFactory.getLogger(ContentExtractor.class); + + private static final StringReplacement MOTLEY_REPLACEMENT = StringReplacement.compile("�", string.empty); + + private static final StringReplacement ESCAPED_FRAGMENT_REPLACEMENT = StringReplacement.compile("#!", "?_escaped_fragment_="); + + private static final ReplaceSequence TITLE_REPLACEMENTS = ReplaceSequence.create("»").append("»"); + private static final StringSplitter PIPE_SPLITTER = new StringSplitter("\\|"); + private static final StringSplitter DASH_SPLITTER = new StringSplitter(" - "); + private static final StringSplitter ARROWS_SPLITTER = new StringSplitter("»"); + private static final StringSplitter COLON_SPLITTER = new StringSplitter(":"); + private static final StringSplitter SPACE_SPLITTER = new StringSplitter(" "); + + private static final Set NO_STRINGS = new HashSet(0); + private static final String A_REL_TAG_SELECTOR = "a[rel=tag], a[href*=/tag/]"; + + + /** + * holds the configuration settings we want to use + */ + private Configuration config; + + // sets the default cleaner class to prep the HTML for parsing + private DocumentCleaner documentCleaner; + // the MD5 of the URL we're currently parsing, used to references the images we download to the url so we + // can more easily clean up resources when we're done with the page. + private String linkhash; + // once we have our topNode then we want to format that guy for output to the user + private OutputFormatter outputFormatter; + private ImageExtractor imageExtractor; + + + /** + * you can optionally pass in a configuration object here that will allow you to override the settings + * that goose comes default with + */ + public ContentExtractor() { + this.config = new Configuration(); + } + + /** + * overloaded to accept a custom configuration object + * + * @param config + */ + public ContentExtractor(Configuration config) { + this.config = config; + } + + + /** + * @param urlToCrawl - The url you want to extract the text from + * @param html - if you already have the raw html handy you can pass it here to avoid a network call + * @return + */ + public Article extractContent(String urlToCrawl, String html) { + + return performExtraction(urlToCrawl, html); + + + } + + /** + * @param urlToCrawl - The url you want to extract the text from, makes a network call + * @return + */ + public Article extractContent(String urlToCrawl) { + String html = null; + return performExtraction(urlToCrawl, html); + } + + + public Article performExtraction(String urlToCrawl, String rawHtml) { + + urlToCrawl = getUrlToCrawl(urlToCrawl); + try { + new URL(urlToCrawl); + + this.linkhash = HashUtils.md5(urlToCrawl); + } catch (MalformedURLException e) { + throw new IllegalArgumentException("Invalid URL Passed in: " + urlToCrawl, e); + } + + ParseWrapper parseWrapper = new ParseWrapper(); + Article article = null; + try { + + if (rawHtml == null) { + rawHtml = HtmlFetcher.getHtml(urlToCrawl); + } + + article = new Article(); + + article.setRawHtml(rawHtml); + + Document doc = parseWrapper.parse(rawHtml, urlToCrawl); + + + // before we cleanse, provide consumers with an opportunity to extract the publish date + article.setPublishDate(config.getPublishDateExtractor().extract(doc)); + + // now allow for any additional data to be extracted + article.setAdditionalData(config.getAdditionalDataExtractor().extract(doc)); + + // grab the text nodes of any elements + article.setTags(extractTags(doc)); + + // now perform a nice deep cleansing + DocumentCleaner documentCleaner = getDocCleaner(); + doc = documentCleaner.clean(doc); + + article.setTitle(getTitle(doc)); + article.setMetaDescription(getMetaDescription(doc)); + article.setMetaKeywords(getMetaKeywords(doc)); + article.setCanonicalLink(getCanonicalLink(doc, urlToCrawl)); + article.setDomain(article.getCanonicalLink()); + + + // extract the content of the article + article.setTopNode(calculateBestNodeBasedOnClustering(doc)); + + if (article.getTopNode() != null) { + + // extract any movie embeds out from our main article content + article.setMovies(extractVideos(article.getTopNode())); + + + if (config.isEnableImageFetching()) { + HttpClient httpClient = HtmlFetcher.getHttpClient(); + imageExtractor = getImageExtractor(httpClient, urlToCrawl); + article.setTopImage(imageExtractor.getBestImage(doc, article.getTopNode())); + + } + + // grab siblings and remove high link density elements + cleanupNode(article.getTopNode()); + + + outputFormatter = getOutputFormatter(); + + + article.setCleanedArticleText(outputFormatter.getFormattedText(article.getTopNode())); + + + if (logger.isDebugEnabled()) { + logger.debug("FINAL EXTRACTION TEXT: \n" + article.getCleanedArticleText()); + } + + if (config.isEnableImageFetching()) { + if (logger.isDebugEnabled()) { + logger.debug("\n\nFINAL EXTRACTION IMAGE: \n" + article.getTopImage().getImageSrc()); + } + } + + } + + // cleans up all the temp images that we've downloaded + releaseResources(); + + + } catch (MaxBytesException e) { + logger.error(e.toString(), e); + } catch (NotHtmlException e) { + logger.error("URL: " + urlToCrawl + " did not contain valid HTML to parse, exiting. " + e.toString()); + } catch (Exception e) { + logger.error("General Exception occured on url: " + urlToCrawl + " " + e.toString()); +// throw new RuntimeException(e); + } + + + return article; + } + + private Set extractTags(Element node) { + if (node.children().size() == 0) return NO_STRINGS; + + Elements elements = Selector.select(A_REL_TAG_SELECTOR, node); + if (elements.size() == 0) return NO_STRINGS; + + Set tags = new HashSet(elements.size()); + for (Element el : elements) { + String tag = el.text(); + if (!string.isNullOrEmpty(tag)) tags.add(tag); + } + + return tags; + } + + // used for gawker type ajax sites with pound sites + private String getUrlToCrawl(String urlToCrawl) { + String finalURL; + if (urlToCrawl.contains("#!")) { + finalURL = ESCAPED_FRAGMENT_REPLACEMENT.replaceAll(urlToCrawl); + } else { + finalURL = urlToCrawl; + } + + if (logger.isDebugEnabled()) { + logger.debug("Goose Extraction: " + finalURL); + } + + return finalURL; + } + + + // todo create a setter for this for people to override output formatter + private OutputFormatter getOutputFormatter() { + if (outputFormatter == null) { + return new DefaultOutputFormatter(); + } else { + return outputFormatter; + } + + } + + + private ImageExtractor getImageExtractor(HttpClient httpClient, String urlToCrawl) { + + if (imageExtractor == null) { + BestImageGuesser bestImageGuesser = new BestImageGuesser(this.config, httpClient, urlToCrawl); + return bestImageGuesser; + } else { + return imageExtractor; + } + + } + + /** + * todo allow for setter to override the default documentCleaner in case user wants more flexibility + * + * @return + */ + private DocumentCleaner getDocCleaner() { + if (this.documentCleaner == null) { + this.documentCleaner = new DefaultDocumentCleaner(); + } + return this.documentCleaner; + } + + /** + * attemps to grab titles from the html pages, lots of sites use different delimiters + * for titles so we'll try and do our best guess. + * + * + * @param doc + * @return + */ + private String getTitle(Document doc) { + String title = string.empty; + + try { + + Elements titleElem = doc.getElementsByTag("title"); + if (titleElem == null || titleElem.isEmpty()) return string.empty; + + String titleText = titleElem.first().text(); + + if (string.isNullOrEmpty(titleText)) return string.empty; + + boolean usedDelimeter = false; + + if (titleText.contains("|")) { + titleText = doTitleSplits(titleText, PIPE_SPLITTER); + usedDelimeter = true; + } + + if (!usedDelimeter && titleText.contains("-")) { + titleText = doTitleSplits(titleText, DASH_SPLITTER); + usedDelimeter = true; + } + if (!usedDelimeter && titleText.contains("»")) { + titleText = doTitleSplits(titleText, ARROWS_SPLITTER); + usedDelimeter = true; + } + + if (!usedDelimeter && titleText.contains(":")) { + titleText = doTitleSplits(titleText, COLON_SPLITTER); + } + + // encode unicode charz + title = StringEscapeUtils.escapeHtml(titleText); + + // todo this is a hack until I can fix this.. weird motely crue error with + // http://money.cnn.com/2010/10/25/news/companies/motley_crue_bp.fortune/index.htm?section=money_latest + title = MOTLEY_REPLACEMENT.replaceAll(title); + + if (logger.isDebugEnabled()) { + logger.debug("Page title is: " + title); + } + + } catch (NullPointerException e) { + logger.error(e.toString()); + } + return title; + + } + + /** + * based on a delimeter in the title take the longest piece or do some custom logic based on the site + * + * @param title + * @param splitter + * @return + */ + private String doTitleSplits(String title, StringSplitter splitter) { + int largetTextLen = 0; + int largeTextIndex = 0; + + String[] titlePieces = splitter.split(title); + + // take the largest split + for (int i = 0; i < titlePieces.length; i++) { + String current = titlePieces[i]; + if (current.length() > largetTextLen) { + largetTextLen = current.length(); + largeTextIndex = i; + } + } + + return TITLE_REPLACEMENTS.replaceAll(titlePieces[largeTextIndex]).trim(); + } + + private String getMetaContent(Document doc, String metaName) { + Elements meta = doc.select(metaName); + if (meta.size() > 0) { + String content = meta.first().attr("content"); + return string.isNullOrEmpty(content) ? string.empty : content.trim(); + } + return string.empty; + } + + + /** + * if the article has meta description set in the source, use that + */ + private String getMetaDescription(Document doc) { + return getMetaContent(doc, "meta[name=description]"); + } + + /** + * if the article has meta keywords set in the source, use that + */ + private String getMetaKeywords(Document doc) { + return getMetaContent(doc, "meta[name=keywords]"); + } + + /** + * if the article has meta canonical link set in the url + */ + private String getCanonicalLink(Document doc, String baseUrl) { + Elements meta = doc.select("link[rel=canonical]"); + if (meta.size() > 0) { + String href = meta.first().attr("href"); + return string.isNullOrEmpty(href) ? string.empty : href.trim(); + } else { + return baseUrl; + } + +/* Not sure what this is for + // set domain based on canonicalUrl + URL url = null; + try { + + if (canonicalUrl != null) { + if (!canonicalUrl.startsWith("http://")) { + url = new URL(new URL(baseUrl), canonicalUrl); + } else { + url = new URL(canonicalUrl); + } + + } else { + url = new URL(baseUrl); + } + + } catch (MalformedURLException e) { + logger.error(e.toString(), e); + }*/ + } + + private String getDomain(String canonicalLink) { + try { + return new URL(canonicalLink).getHost(); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + } + + /** + * we're going to start looking for where the clusters of paragraphs are. We'll score a cluster based on the number of stopwords + * and the number of consecutive paragraphs together, which should form the cluster of text that this node is around + * also store on how high up the paragraphs are, comments are usually at the bottom and should get a lower score + * + * @return + */ + private Element calculateBestNodeBasedOnClustering(Document doc) { + Element topNode = null; + + // grab all the paragraph elements on the page to start to inspect the likely hood of them being good peeps + ArrayList nodesToCheck = getNodesToCheck(doc); + + double startingBoost = 1.0; + int cnt = 0; + int i = 0; + + // holds all the parents of the nodes we're checking + Set parentNodes = new HashSet(); + + + ArrayList nodesWithText = new ArrayList(); + + + for (Element node : nodesToCheck) { + + String nodeText = node.text(); + WordStats wordStats = StopWords.getStopWordCount(nodeText); + boolean highLinkDensity = isHighLinkDensity(node); + + + if (wordStats.getStopWordCount() > 2 && !highLinkDensity) { + + nodesWithText.add(node); + } + + } + + int numberOfNodes = nodesWithText.size(); + int negativeScoring = 0; // we shouldn't give more negatives than positives + // we want to give the last 20% of nodes negative scores in case they're comments + double bottomNodesForNegativeScore = (float) numberOfNodes * 0.25; + + if (logger.isDebugEnabled()) { + logger.debug("About to inspect num of nodes with text: " + numberOfNodes); + } + + for (Element node : nodesWithText) { + + // add parents and grandparents to scoring + // only add boost to the middle paragraphs, top and bottom is usually jankz city + // so basically what we're doing is giving boost scores to paragraphs that appear higher up in the dom + // and giving lower, even negative scores to those who appear lower which could be commenty stuff + + float boostScore = 0; + + if (isOkToBoost(node)) { + if (cnt >= 0) { + boostScore = (float) ((1.0 / startingBoost) * 50); + startingBoost++; + } + } + + + // check for negative node values + if (numberOfNodes > 15) { + if ((numberOfNodes - i) <= bottomNodesForNegativeScore) { + float booster = (float) bottomNodesForNegativeScore - (float) (numberOfNodes - i); + boostScore = -(float) Math.pow(booster, (float) 2); + + // we don't want to score too highly on the negative side. + float negscore = Math.abs(boostScore) + negativeScoring; + if (negscore > 40) { + boostScore = 5; + } + } + } + + if (logger.isDebugEnabled()) { + logger.debug("Location Boost Score: " + boostScore + " on interation: " + i + "' id='" + node.parent().id() + "' class='" + node.parent().attr("class")); + } + String nodeText = node.text(); + WordStats wordStats = StopWords.getStopWordCount(nodeText); + int upscore = (int) (wordStats.getStopWordCount() + boostScore); + updateScore(node.parent(), upscore); + updateScore(node.parent().parent(), upscore / 2); + updateNodeCount(node.parent(), 1); + updateNodeCount(node.parent().parent(), 1); + + if (!parentNodes.contains(node.parent())) { + parentNodes.add(node.parent()); + } + + if (!parentNodes.contains(node.parent().parent())) { + parentNodes.add(node.parent().parent()); + } + + cnt++; + i++; + } + + + // now let's find the parent node who scored the highest + + int topNodeScore = 0; + for (Element e : parentNodes) { + + if (logger.isDebugEnabled()) { + logger.debug("ParentNode: score='" + e.attr("gravityScore") + "' nodeCount='" + e.attr("gravityNodes") + "' id='" + e.id() + "' class='" + e.attr("class") + "' "); + } + //int score = Integer.parseInt(e.attr("gravityScore")) * Integer.parseInt(e.attr("gravityNodes")); + int score = getScore(e); + if (score > topNodeScore) { + topNode = e; + topNodeScore = score; + } + + if (topNode == null) { + topNode = e; + } + } + + if (logger.isDebugEnabled()) { + if (topNode == null) { + logger.debug("ARTICLE NOT ABLE TO BE EXTRACTED!, WE HAZ FAILED YOU LORD VADAR"); + } else { + String logText; + String targetText = ""; + Element topPara = topNode.getElementsByTag("p").first(); + if (topPara == null) { + topNode.text(); + } else { + topPara.text(); + } + + if (targetText.length() >= 51) { + logText = targetText.substring(0, 50); + } else { + logText = targetText; + } + logger.debug("TOPNODE TEXT: " + logText.trim()); + logger.debug("Our TOPNODE: score='" + topNode.attr("gravityScore") + "' nodeCount='" + topNode.attr("gravityNodes") + "' id='" + topNode.id() + "' class='" + topNode.attr("class") + "' "); + } + } + + + return topNode; + + + } + + /** + * returns a list of nodes we want to search on like paragraphs and tables + * + * @return + */ + private ArrayList getNodesToCheck(Document doc) { + ArrayList nodesToCheck = new ArrayList(); + + nodesToCheck.addAll(doc.getElementsByTag("p")); + nodesToCheck.addAll(doc.getElementsByTag("pre")); + nodesToCheck.addAll(doc.getElementsByTag("td")); + return nodesToCheck; + + } + + /** + * checks the density of links within a node, is there not much text and most of it contains linky shit? + * if so it's no good + * + * @param e + * @return + */ + private static boolean isHighLinkDensity(Element e) { + + Elements links = e.getElementsByTag("a"); + + if (links.size() == 0) { + return false; + } + + String text = e.text().trim(); + String[] words = SPACE_SPLITTER.split(text); + float numberOfWords = words.length; + + + // let's loop through all the links and calculate the number of words that make up the links + StringBuilder sb = new StringBuilder(); + for (Element link : links) { + sb.append(link.text()); + } + String linkText = sb.toString(); + String[] linkWords = SPACE_SPLITTER.split(linkText); + float numberOfLinkWords = linkWords.length; + + float numberOfLinks = links.size(); + + float linkDivisor = numberOfLinkWords / numberOfWords; + float score = linkDivisor * numberOfLinks; + + if (logger.isDebugEnabled()) { + String logText; + if (e.text().length() >= 51) { + logText = e.text().substring(0, 50); + } else { + logText = e.text(); + } + logger.debug("Calulated link density score as: " + score + " for node: " + logText); + } + if (score > 1) { + return true; + } + + return false; + } + + /** + * alot of times the first paragraph might be the caption under an image so we'll want to make sure if we're going to + * boost a parent node that it should be connected to other paragraphs, at least for the first n paragraphs + * so we'll want to make sure that the next sibling is a paragraph and has at least some substatial weight to it + * + * + * @param node + * @return + */ + private boolean isOkToBoost(Element node) { + + int stepsAway = 0; + + Element sibling = node.nextElementSibling(); + while (sibling != null) { + + if (sibling.tagName().equals("p")) { + if (stepsAway >= 3) { + if (logger.isDebugEnabled()) { + logger.debug("Next paragraph is too far away, not boosting"); + } + return false; + } + + String paraText = sibling.text(); + WordStats wordStats = StopWords.getStopWordCount(paraText); + if (wordStats.getStopWordCount() > 5) { + if (logger.isDebugEnabled()) { + logger.debug("We're gonna boost this node, seems contenty"); + } + return true; + } + + } + + // increase how far away the next paragraph is from this node + stepsAway++; + + sibling = sibling.nextElementSibling(); + } + + + return false; + } + + + /** + * adds a score to the gravityScore Attribute we put on divs + * we'll get the current score then add the score we're passing in to the current + * + * @param node + * @param addToScore - the score to add to the node + */ + private void updateScore(Element node, int addToScore) { + int currentScore; + try { + String scoreString = node.attr("gravityScore"); + currentScore = string.isNullOrEmpty(scoreString) ? 0 : Integer.parseInt(scoreString); + } catch (NumberFormatException e) { + currentScore = 0; + } + int newScore = currentScore + addToScore; + node.attr("gravityScore", Integer.toString(newScore)); + + } + + /** + * stores how many decent nodes are under a parent node + * + * @param node + * @param addToCount + */ + private void updateNodeCount(Element node, int addToCount) { + int currentScore; + try { + String countString = node.attr("gravityNodes"); + currentScore = string.isNullOrEmpty(countString) ? 0 : Integer.parseInt(countString); + } catch (NumberFormatException e) { + currentScore = 0; + } + int newScore = currentScore + addToCount; + node.attr("gravityNodes", Integer.toString(newScore)); + + } + + + /** + * returns the gravityScore as an integer from this node + * + * @param node + * @return + */ + private int getScore(Element node) { + if (node == null) return 0; + try { + String grvScoreString = node.attr("gravityScore"); + if (string.isNullOrEmpty(grvScoreString)) return 0; + return Integer.parseInt(grvScoreString); + } catch (NumberFormatException e) { + return 0; + } + } + + + /** + * pulls out videos we like + * + * @return + */ + private ArrayList extractVideos(Element node) { + ArrayList candidates = new ArrayList(); + ArrayList goodMovies = new ArrayList(); + try { + + + Elements embeds = node.parent().getElementsByTag("embed"); + for (Element el : embeds) { + candidates.add(el); + } + Elements objects = node.parent().getElementsByTag("object"); + for (Element el : objects) { + candidates.add(el); + } + if (logger.isDebugEnabled()) { + logger.debug("extractVideos: Starting to extract videos. Found: " + candidates.size()); + } + + for (Element el : candidates) { + + Attributes attrs = el.attributes(); + + for (Attribute a : attrs) { + try { + if (logger.isDebugEnabled()) { + logger.debug(a.getKey() + " : " + a.getValue()); + } + if ((a.getValue().contains("youtube") || a.getValue().contains("vimeo")) && a.getKey().equals("src")) { + if (logger.isDebugEnabled()) { + logger.debug("Found video... setting"); + logger.debug("This page has a video!: " + a.getValue()); + } + goodMovies.add(el); + + } + } catch (Exception e) { + logger.error(e.toString()); + e.printStackTrace(); + } + } + + } + } catch (NullPointerException e) { + logger.error(e.toString(), e); + } catch (Exception e) { + logger.error(e.toString(), e); + } + if (logger.isDebugEnabled()) { + logger.debug("extractVideos: done looking videos"); + } + return goodMovies; + } + + + /** + * remove any divs that looks like non-content, clusters of links, or paras with no gusto + * + * @param node + * @return + */ + private Element cleanupNode(Element node) { + if (logger.isDebugEnabled()) { + logger.debug("Starting cleanup Node"); + } + + node = addSiblings(node); + + Elements nodes = node.children(); + for (Element e : nodes) { + if (e.tagName().equals("p")) { + continue; + } + if (logger.isDebugEnabled()) { + logger.debug("CLEANUP NODE: " + e.id() + " class: " + e.attr("class")); + } + boolean highLinkDensity = isHighLinkDensity(e); + if (highLinkDensity) { + if (logger.isDebugEnabled()) { + logger.debug("REMOVING NODE FOR LINK DENSITY: " + e.id() + " class: " + e.attr("class")); + } + e.remove(); + continue; + } + // now check for word density + // grab all the paragraphs in the children and remove ones that are too small to matter + Elements subParagraphs = e.getElementsByTag("p"); + + + for (Element p : subParagraphs) { + if (p.text().length() < 25) { + p.remove(); + } + } + + // now that we've removed shorty paragraphs let's make sure to exclude any first paragraphs that don't have paras as + // their next siblings to avoid getting img bylines + // first let's remove any element that now doesn't have any p tags at all + Elements subParagraphs2 = e.getElementsByTag("p"); + if (subParagraphs2.size() == 0 && !e.tagName().equals("td")) { + if (logger.isDebugEnabled()) { + logger.debug("Removing node because it doesn't have any paragraphs"); + } + e.remove(); + continue; + } + + //if this node has a decent enough gravityScore we should keep it as well, might be content + int topNodeScore = getScore(node); + int currentNodeScore = getScore(e); + float thresholdScore = (float) (topNodeScore * .08); + if (logger.isDebugEnabled()) { + logger.debug("topNodeScore: " + topNodeScore + " currentNodeScore: " + currentNodeScore + " threshold: " + thresholdScore); + } + if (currentNodeScore < thresholdScore) { + if (!e.tagName().equals("td")) { + if (logger.isDebugEnabled()) { + logger.debug("Removing node due to low threshold score"); + } + e.remove(); + } else { + if (logger.isDebugEnabled()) { + logger.debug("Not removing TD node"); + } + } + + continue; + } + + } + + return node; + + } + + + /** + * adds any siblings that may have a decent score to this node + * + * @param node + * @return + */ + private Element addSiblings(Element node) { + if (logger.isDebugEnabled()) { + logger.debug("Starting to add siblings"); + } + int baselineScoreForSiblingParagraphs = getBaselineScoreForSiblings(node); + + Element currentSibling = node.previousElementSibling(); + while (currentSibling != null) { + if (logger.isDebugEnabled()) { + logger.debug("SIBLINGCHECK: " + debugNode(currentSibling)); + } + + if (currentSibling.tagName().equals("p")) { + + node.child(0).before(currentSibling.outerHtml()); + currentSibling = currentSibling.previousElementSibling(); + continue; + } + + // check for a paraph embedded in a containing element + int insertedSiblings = 0; + Elements potentialParagraphs = currentSibling.getElementsByTag("p"); + if (potentialParagraphs.first() == null) { + currentSibling = currentSibling.previousElementSibling(); + continue; + } + for (Element firstParagraph : potentialParagraphs) { + WordStats wordStats = StopWords.getStopWordCount(firstParagraph.text()); + + int paragraphScore = wordStats.getStopWordCount(); + + if ((float) (baselineScoreForSiblingParagraphs * .30) < paragraphScore) { + if (logger.isDebugEnabled()) { + logger.debug("This node looks like a good sibling, adding it"); + } + node.child(insertedSiblings).before("

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