Quantcast
Channel: Hacker News
Viewing all 737 articles
Browse latest View live

Why Being an Australian Startup Sucks

$
0
0

Australian Startups

I’ve wanted to write this piece for a while now, after bootstrapping in Australia for over 5 years we’re finally getting traction. It’s been a long hard slog, we’ve failed at almost 8 ideas & taken absolutely no funding. Maybe that’s another story – for now though I want to talk about how growing a Startup or idea in Australia is terribly difficult.

This isn’t a rant; instead I’m trying to highlight some of the current challenges I see in the Australian startup scene – which could be a reason why we don’t see more successful startups or investments in our lovely country.

Just to paint some perspective, here’s just some of the recent acquisitions in the Australian online space:

Acquisitions

  • Hitwise – $240M by Experian (US)
  • Melbourne IT (DBS) – $152M by CSC (US)
  • Retailmenot – ~$50-100M by WhaleShark Media in 2010 (US)
  • Chomp – $50M acquistion by Apple (US)
  • Ebook Library – $30M by ProQuest (US)
  • We Are Hunted – $ undisclosed by Twitter (US)
  • Sessions – $ undisclosed by MyFitnessPal (US)
  • 5th Finger – $ undisclosed by Merkle (US)
  • VOLT Media – $ undisclosed by Alphabird (US)
  • Trunk.ly – $ undisclosed by Delicous (US)
  • BuyInvite – $ undisclosed by OzSale (US)
  • Crowdmass – $ undisclosed by Groupon (US)
  • Grabble – $ undisclosed by Walmart (US)
  • Skitch – $ undisclosed by Evernote (US)
  • Tjoos – $ undisclosed by Internet Brands (US)
  • oo.com.au – $ undisclosed by Grays Australia (AU)
  • StyleTread – $ undisclosed by Munro Family (AU)
  • Vinomofo – $ undisclosed by Catch of the Day (AU)
  • MYOB – $ undisclosed by Bain Capital (US)
  • Buzz Numbers – $ undisclosed by Sentia Media (US)
  • Spreets – $40M by Yahoo7 (AU)

The first thing we notice is that the majority of acquisitions involve a partner that is located outside Australia. There’s obviously a few potential reasons for this:

  • It’s difficult to scale products worldwide from Australia
  • We’ve built a great products but other companies feel they an scale it to a much larger userbase through an integration

Just look at what WhaleShark media have done with RetailMeNot in 4 years. They’ve scaled the business to $78.5M in revenue per quarter. To do this they’ve needed to get closer to the clients (who are mostly US based businesses) & also the customers. Something that Bevan & Guy would have struggled to do with a team here in Australia.

RetailMeNot IPO

What’s also interesting to note is that quite a few of the companies above actually left Australia completely to setup base in the USA. We hear so often in the media about founders like Josh Reich from BankSimple who was recently acquired for $117M, it’s like our media like to hold onto the fact that someone from this country is doing something great, even though they had to leave Australia to do it in the first place. Even Atlassian left Australia to register itself as a UK business:

Basically, for startups it’s super expensive to do business in Australia compared to other big cities—wages, compliance, tax and even software costs are high, and to make it even more tough, there’s typically less funding available to meet these costs.

An article surfaced today from 99dresses founder Nikki Durkin who talks at length about braving visa issues to join Y Combinator in the USA at the hope of really making an impact with her Australian born startup.

The Government Does Not Support Online Businesses

There’s almost no benefits given to startup founders in Australia that actually help us accelerate our business. In fact our government recently announced a new budget designed to reduce our $49.9Bn defecit, which involves big changes to how they support startups (even though Tony Abbott is quite happy to spend $12Bn on 58 F-35 Fighter Jets).

The Government has cut funding to over 8 innovation & research programs. One of the first areas to be completely cut was Commercialisation Australia, an organisation that was there to help startups from early stage right through to acquisition – they had roughly $88M per year to help Australian products & services. They also cut the Innovation Investment Fund & 6 others to give combined budget savings of $845M.

Commercialisation Australia

In a recent interview after winning a Pearcy award, Guy King the Co-founder of RetailMeNot mentioned how Commercialisation Australia was instrumental in helping them with the growth of their business.

Singapore is kicking our arse in the battle to become Asia’s tech hub and to secure the initial public offerings that would come with it.

The Government has however pledged $484M in a new Entrepreneurs’ Infrastructure Program, which we still have little to no information on.

Nor Does it Support Venture Capital

The amount of money invested by Australian VCs was at its lowest level in 2013 with just $111.44M invested, with the average investment around the $1M. Compare that to $1.71Bn in Singapore (which is a 600% increase since 2009).

There’s no sugarcoating the fact that the local VC environment is struggling; investors here are less experienced, they have to be pickier with the startups they back, there’s absolutely no support from the government & we have corporate VC like ANZ, Optus & that are more interested in funding startups that can benefit their own business.

To this end many Australian businesses continue to look for overseas investment:

  • Atlassian – $60M from Accel Partners (US)
  • The Iconic – $25M from Summit Partners (US)
  • LIFX – $12M from Sequoia (US)
  • App.io – $1M (Formerly Kickfolio) from Multiple Investors (US)
  • Campaign Monitor – $250M from Insight Partners (US)
  • QuikFlix – $10M from HBO (US)
  • SiteMinder – $30M from TCV (US)
  • BigCommerce – $40M from Revolution Growth (US)

It is well known that the Australian VC scene needs a few large homeruns to see money be invested back into the ecosystem, but right now our banks view tech startups as high risk & not many are willing to take the calculated risks we see elsewhere in the world. After all, when you invest money in equipment & infrastructure – if it all goes bellyup you still have some assets to sell right? Australia still has some way to go (as with a lot of things) for this to change.

Foreign Investors Want You to Have a Global Vision

Even though we are a large country, our population is still relatively small – only 22.68M people. When you compare this to 314M in the USA or 63M in the UK our possible customer penetration is small unless you plan to target your product globally (a pattern that you’ll see ring true in many of the investments above).

There have been plenty of companies that have made an impact locally when you consider industries like Travel or E-Commerce. But to attract the right kind of funding that will drive growth you need to be in an industry or have a concept that you can scale globally.

Australia is struggling to provide enough market competitiveness due to rising costs, just look at the the E-Commerce space – many international companies (ASOS, Eastbay & Amazon) are cleaning up due to cheaper shipping costs & lower product prices. And even many of our own iconic brands like Myer or David Jones are just being left behind due to lack of innovation or just being too late to the party.

Take our business Gleam for example, our potential customerbase increases by 1500% or more just by selling into the USA market alone. We’re lucky that most of our sales & growth don’t require physical sales people.

Employee Share Schemes in Australia are a Joke

An effective employee share scheme should help Australian startups attract the right talent (I mean who wouldn’t want to come live in our country?), foster innovation & in the end help us see more success on the global playing field.

The current regulations & treatment of tax towards employee share schemes in Australia makes them downright useless.

Employee Share Schemes

In a nutshell start-up employees are liable for the tax charge on shares when they vest (not when sold), even though the value can’t be realised properly yet. This means that employees have additional tax charges without any additional income to cover them – even if the startup is destined to fail 6 months into the future.

I know, total bullshit.

Just so you know, it is possible to get around these tax liabilities – but it’s extremely expensive. Which most startups don’t have the time, money or resources to cover.

Very Few Tax Breaks or Grants

Tax breaks are hugely important to help startups get through those tough first few years where cashflow is tight.

Take Singapore for example (again), if you incorporate your Startup there they will allow your first $100k of income to be completely tax free for 3 years, there’s even more benefits if you earn up to $300k they cap your tax at just 8.5% – plus it’s even allowed on dividends & foreign income! Not only that, Singapore provides 50% deduction on taxes relating to Angel investing, no wonder Singapore has seen a massive investment & startup boom – the government understands the value.

Singapore is Helping Startups

There’s a few grants in Australia, the first major one is the R&D offset. If you can prove that your startup is conducting research & development you can claim back up to 38.5% of your development costs – however the payment is extremely lagged & can take more than a year after the actual activities for you to be able to claim (which doesn’t really help startups).

Export market development grants can help you reduce the cost of exporting any products overseas, for example advertising your business in other countries, travel, marketing & communications. You can reimburse up to 50% of these costs, again this rebate comes almost a year after the actual activity has taken place. What about incentives to grow my business locally?

Problem I have here is none of these grants do much to help me as a startup scale my business, the grants & tax breaks you see in Singapore actually align with how someone grows a business – those guys have their shit together.

Australia is Getting Really Expensive

Australia is fast becoming one of the most expensive countries in the world to live in, this means that good talent is very expensive, cost of living is expensive & wages are generally in line with that trend. Australia has the 3rd highest average wage in the world (behind Luxembourg & Switzerland).

Consider myself & John. We’re both in our early 30′s, with a family & mortgages. We need roughly a MMR (monthly recurring revenue) of $25k AUD just to cover ourselves in Australia (fully loaded, including 9.5% Superannuation). John is a fairly competent developer who could easily get a lucrative corporate contract paying crazy daily rates.

This hurts two-fold, it makes it expensive to hire & retain good people – as they can command extremely high rates by default. And we all know that startups generally can’t match those rates without some other incentives (*cough* share options *cough*).

Secondly, if your company is currency agnostic (i.e. could potentially exist anywhere in the world) you end up paying much much more to run your business. I could go on about this point forever but you just have the look at the price of a Macbook side by side:

Macbook Cost in Australia

Heck, we can’t even get Games of Thrones in Australia without pirating it apparently.

GST Sucks

If your business earns more than $75,000 per year you must register for GST. This ends up screwing over people that want to buy your product in Australia.

For example, consider our $39 plan. If someone in the USA wants to purchase it, we charge them $39 AUD, however if someone in Australia wants to buy it we charge them $39 + 10%, or $42.90 – if we were a USA company Australians wouldn’t have to pay an extra.

To make matters worse, we end up just collecting this 10% for the government & paying it back to them in full every quarter.

Timezones Make Communication Hard

The majority of our business comes from the USA, which means they are awake mostly whilst we are asleep. This makes having meetings & communicating with customers very difficult – normally giving you at least a 24 lag on anything that crops up.

This lag definitely works against us in Australia in terms of the amount of business & efficiency of business we can do in the rest of the world. I’m guessing this is a big reason many startups move to the USA.

Lack of Payment Options, Until Now

Online payment options have been archaic to say the least for many years, here’s a good example of what a startup might have to go through.

We would have to get a merchant account with the bank, then find a payment processor, then do all the integrations.

Finally thanks to Stripe we were able to charge Australians in AUD from launch (as part of the beta), and only now they are rolling out the BETA of allowing Australian companies to charge in USD or GBP. It’s taken a long time, but finally there are solutions for Australian companies to play on a global field – without having to worry about the bureaucracy of banking.

All This Stuff Doesn’t Stop Us

Even though all this stuff makes Australia seem bad, there’s still thousands of entrepreneurs out there making it work day in day out – I’ve witnessed a huge explosion of enthusiasm in Australia, we’ve got more incubators than ever before, we got lots of amazing co-working spaces & everyone is really just trying to find their product market fit in the big bad world.

So here’s to all the Australian startups – maybe we’re all waiting for the next big thing to come along, will it be Australian? Who knows, but we’ll bloody well keep trying.

Stuart McKeown

Stuart McKeown

Stuart McKeown is one of the Co-founders here at Gleam. He's passionate about growing businesses, whether it's his own or yours - that's exactly why we built Gleam. Have you checked us out yet?

Follow me on Twitter - Connect on LinkedIn - Follow me on Google+

There's below this post, there will be another when you add yours I hope :)


Houston, We Have A Public Domain Problem

$
0
0

I received a bogus copyright takedown notice for using public domain audio on SoundCloud yesterday. The sound in question—the famous “Houston, we have a problem” snippet of the Apollo 13 mission—is incontrovertibly available to all, for any use, without copyright restrictions. The fact that it’s been yanked from my SoundCloud page, though, is a sad demonstration of how completely many online services have swallowed the fallacy that “unauthorized” means “unacceptable.”

It’s a dangerous myth, that we should all need permission any time we’re getting value out of a piece of culture. And it’s one that gets entrenched deeper each time we accept the idea that we’re able to make use of a work because a copyright owner is or would be OK with it, and not just because we have a basic right to participate in culture that is more fundamental than anybody else’s desire to maximize profits.

So I was disheartened when I got the takedown, and even more so when I looked through the guidelines for disputing an automatic match and found that I faced a presumption of guilt. There’s no option for “The work in question is not restricted by copyright,” or even “I am making a fair use.” Instead, the “valid reasons” offered are variations on the theme that I actually have permission—not that I never needed it in the first place.

The “valid reasons” offered by the SoundCloud dispute form.

I am the primary copyright activist at the Electronic Frontier Foundation, a digital civil liberties organization. I witness takedown abuse every day. My case is not an anomaly and is, in fact, pretty tame: this was almost certainly a greedy mistake by somebody who knows there are unlikely to be negative consequences. It’s what’s known as copyfraud, but it’s not somebody deliberately targeting my upload and misusing the copyright system as the handiest tool to take it down. (We see plenty of that, too.)

The real goofy bit is that before I started at EFF, I worked at SoundCloud. I actually uploaded this Apollo 13 clip, along with sounds from Apollo 11 and others, as part of a project to attract more historic and archival audio and really celebrate the public domain as a rich source of sounds.

But it’s true, our public domain has taken a beating. Through acts of Congress and unfortunate outcomes in Supreme Court cases, the steady expansion of our cultural commons has been largely replaced by stagnation.

There are, of course, a few ways a work can end up in the public domain. Works of the US government are immediately and always free of copyright restrictions. Since that category includes recordings by NASA, my upload is a simple case. Beyond that, the public domain was once the default in the United States: unless you put a proper notice with a copyright sign and the year, and sent in a registration form and fee, your essay or film or recording or picture would never carry copyright restrictions at all.

Even if works did get copyright status, the terms once granted would eventually expire. The result was a rich pool of common resources.

Over the last forty years or so that has changed. For one thing, nearly all works are granted copyright restrictions automatically. As soon as a minimally original work of authorship is recorded—“fixed in a tangible medium,” is how the law puts it—it’s covered by copyright. On top of that, a 1998 law extended copyright terms for 20 years retroactively, meaning that no copyright on a published work has expired in the US for some 16 years. We’ve suffered a long drought, marked solemnly each January 1st—Public Domain Day—by thinking about what we could have had.

And with that quantitative shift, there’s been a qualitative one, too. In decades past, the cultural treasures of each generation would be the common property of the next. Now we are limited to cultural works that date back nearly a full century; it’s not our fathers’ and mothers’ culture, it’s our distant ancestors’.

With that declining relevance, and the rising uncertainty caused by innocent mistakes and copyfraud, the public domain starts to look less like an inviting common meadow and more like a foreboding possible minefield. So here and there, in dribs and drabs, the public domain gets edited out of the picture.

We’ve lost a valuable chunk of the public domain, then, even without the complicity of online services. But those sites feel pressure, too: the minimum they must do to stay inside copyright “safe harbors” is prescribed by law, and many go further in efforts to be on good terms with media companies. That looks like overzealous algorithmic copyright enforcement, like the automated system that caught my upload after some partner presumably laid claim to it (and who knows how much else).

Even as these companies and services strive to be massively accessible public spaces—SoundCloud bills itself as “the world’s leading social sound platform where anyone can create sounds and share them everywhere”—they reflect mostly corporate priorities, because they face far too little pressure from the other side. That is, from users who wish to participate in culture, and who don’t want to be treated like criminals.

But that doesn’t have to be the case. I refuse to let this be an eulogy for the public domain. I choose to engage with it as an essential component of a participatory culture. It’s only if we forget how to use it that we could see it wither away. Even with its rough recent history, it deserves our attention, and our support.

I’m sure my particular uploading situation will work out fine. SoundCloud is full of smart people, and this automated match will get cleared up in days, if not hours. But that’s ultimately an unsatisfying conclusion. The real problem is that we’ve bought into the rhetoric and the arguments that an unauthorized use is an unacceptable use. As a result our online services have looked less like the public platforms we want, and more like policed spaces where any activity can be interrogated for its papers, please.

Parker Higgins is an activist at the Electronic Frontier Foundation. Along withSarah Jeonghe writesFive Useful Articles, a weekly newsletter about IP issues that is much funnier than you’d expect.

Cayley – An open-source graph database

$
0
0
README.md

Cayley

Cayley is an open-source graph inspired by the graph database behind Freebase and Google's Knowledge Graph.

Its goal is to be a part of the developer's toolbox where Linked Data and graph-shaped data (semantic webs, social networks, etc) in general are concerned.

Features

  • Written in Go
  • Easy to get running (3 or 4 commands, below)
  • RESTful API
  • Built-in query editor and visualizer
  • Multiple query languages:
    • Javascript, with a Gremlin-inspired* graph object.
    • (simplified) MQL, for Freebase fans
  • Plays well with multiple backend stores:
  • Modular design; easy to extend with new languages and backends
  • Good test coverage
  • Speed, where possible.

Rough performance testing shows that, on consumer hardware and an average disk, 134m triples in LevelDB is no problem and a multi-hop intersection query -- films starring X and Y -- takes ~150ms.

* Note that while it's not exactly Gremlin, it certainly takes inspiration from that API. For this flavor, see the documentation.

Building

Make sure you have the right packages installed. Mostly, this is just Go as a dependency, and different ways of pulling packages.

Linux

Ubuntu / Debian

sudo apt-get install golang git bzr mercurial make

RHEL / Fedora

sudo yum install golang git bzr mercurial make gcc

OS X

Homebrew is the preferred method.

brew install bazaar mercurial git go

Clone and build

Now you can clone the repository and build the project.

git clone **INSERT PATH HERE**
cd cayley
make deps
make

And the cayley binary will be built and ready.

Give it a quick test with:

./cayley repl --dbpath=testdata.nt 

You should see a cayley> REPL prompt. Go ahead and give it a try:

// Simple math
cayley> 2 + 2

// Javascript syntax
cayley> x = 2 * 8
cayley> x

// See all the entities in this small follow graph.
cayley> graph.Vertex().All()

// See only dani.
cayley> graph.Vertex("dani").All()

// See who dani follows.
cayley> graph.Vertex("dani").Out("follows").All()

Sample Data

For somewhat more interesting data, a sample of 30k movies from Freebase comes in the checkout.

gzip -cd 30kmoviedata.nt.gz > 30kmovies.nt
./cayley repl --dbpath=30kmovies.nt

To run the web frontend, replace the "repl" command with "http"

./cayley http --dbpath=30kmovies.nt

And visit port 64210 on your machine, commonly http://localhost:64210

Running queries

The default environment is based on Gremlin and is simply a Javascript environment. If you can write jQuery, you can query a graph.

You'll notice we have a special object, graph or g, which is how you can interact with the graph.

The simplest query is merely to return a single vertex. Using the 30kmovies.nt dataset from above, let's walk through some simple queries:

// Query all vertices in the graph, limit to the first 5 vertices found.graph.Vertex().GetLimit(5)// Start with only one vertex, the literal name "Humphrey Bogart", and retreive all of them.graph.Vertex("Humphrey Bogart").All()// `g` and `V` are synonyms for `graph` and `Vertex` respectively, as they are quite common.g.V("Humphrey Bogart").All()// "Humphrey Bogart" is a name, but not an entity. Let's find the entities with this name in our dataset.// Follow links that are pointing In to our "Humphrey Bogart" node with the predicate "name".g.V("Humphrey Bogart").In("name").All()// Notice that "name" is a generic predicate in our dataset. // Starting with a movie gives a similar effect.g.V("Casablanca").In("name").All()// Relatedly, we can ask the reverse; all ids with the name "Casablanca"g.V().Has("name","Casablanca").All()

You may start to notice a pattern here: with Gremlin, the query lines tend to:

Start somewhere in the graph | Follow a path | Run the query with "All" or "GetLimit"

g.V("Casablanca") | .In("name") | .All()

And these pipelines continue...

// Let's get the list of actors in the filmg.V().Has("name","Casablanca").Out("/film/film/starring").Out("/film/performance/actor").Out("name").All()// But this is starting to get long. Let's use a morphism -- a pre-defined path stored in a variable -- as our linkagevarfilmToActor=g.Morphism().Out("/film/film/starring").Out("/film/performance/actor")g.V().Has("name","Casablanca").Follow(filmToActor).Out("name").All()

There's more in the Javascript API Documentation, but that should give you a feel for how to walk around the graph.

Disclaimer

Not a Google project, but created and maintained by a Googler, with permission from and assignment to Google, under the Apache License, version 2.0.

Contact

India's Pointless Search for 'Black Money'

$
0
0

Fairy tales always end with the words “and they lived happily ever after,” which is why in our cynical age even toddlers have stopped taking them seriously. Millions of adult Indians, however, enthusiastically propagate a grown-up version of happily ever after.

In this fantasy, billions of dollars of “black money” have been siphoned out of India over decades by corrupt politicians and businessmen; it lies securely in the discreet vaults of Swiss banks. Once a “strong government” (perhaps the one just elected?) cracks the whip and brings this money home, India will cease to be a poor country and will take its rightful place among the superpowers of the world.

The first major move by India's new prime minister, Narendra Modi, last month was to appoint a special investigative team to look into the black-money issue, as he promised in his election campaign. This was also a way for the new government to establish its own bona fides on the issue of tackling corruption, which Modi’s Bharatiya Janata Party repeatedly accused the previous government of temporizing.

India’s new finance minister, Arun Jaitley, has spoken several times recently about asking Swiss authorities to make available to the Indian government a list of their Indian account holders and the sums they hold. Last week, Indian newspapers declared that the Swiss had agreed to cooperate with the new government, only to run another round of stories this week saying that they hadn’t, actually. Justice M.B. Shah, chairman of the special team on black money, has termed this development “a setback” but said he will plow ahead regardless.

Perhaps it’s the memory of once being a fairly prosperous society that had its wealth slowly drained by two centuries of colonialism, or the (very legitimate) resentment felt toward businessmen, farmers and politicians by salaried Indians, who constitute the bulk of India’s very small income-tax base, that explains why middle-class Indians take a perverse pride in sticking a number on the amount of wealth at stake in the black-money dispute.

The grander the sum, the more clear it becomes that the motherland has been bled dry by a small cabal of corrupt, anti-national conspirators. It's a theme Bollywood films mine often to highlight the gulf between the rich and the poor -- not the suffocation of Indian potential by the deep-rooted hierarchies of the caste system, or the sickening spectacle of gender violence in family life and on the street, or the country's perverse incentive structure and obsession with controls and permits after more than six decades of socialist policies.

Indian opinion on black money is persistently inflamed by such moral crusaders as the yoga guru Baba Ramdev, who declared that once India has regained its lost wealth, one Indian rupee will be worth $50 instead of the other way around. Or the maverick lawyer Ram Jethmalani, the figure behind a 2009 petition that led the Supreme Court of India to direct the Indian government to set up a special task force to recover India's lost money -- and moralized in a 50-plus-page judgment on what the neoliberal order had done to make selfish monsters of Indians.

Last week, a study by the Indian business confederation Assocham put that figure at nearly $2 trillion. Just to put this astonishing figure in context, that’s about the same as India’s gross domestic product.

Yet the naivete continues. Even if one assumes that the Indian government could recover such a large stash of cash from Swiss banks, the proceeds would be considered a national asset and go straight into the hands of the state, whose agencies and departments would have been one of the major sources of this embezzlement to begin with. Outlays are no guarantee of outcomes. But if I could be given a dollar (at pre-black-money-repatriation rates) for every time I heard someone say, “Once we bring all that black money back, no Indian will ever go hungry,” I’d soon have enough for a little nest egg in a Swiss bank myself -- or at least enough to buy a ticket to the World Cup final on the black market.

Will black money really make for a new “India Shining,” as so many believe? Why, it already has. “One of the best places in which to invest money is India, not Switzerland or the US or any western destination,” the straight-talking economics columnist Swaminathan Aiyar wrote. “Housing prices in the US doubled after 2000 and that was called a bubble, but housing prices in India rose almost ten-fold. Declarations by politicians of their assets show a huge preference for real estate over all other assets. … Most black money never leaves India, and much of that does come right back.”

If those sensational sums did ever exist, they’re no longer lying in Swiss banks, but have long since been put to use in India’s murky real estate market and in the massive war chests deployed by political parties (including the BJP) in state and national elections. Indian politicians have long resisted attempts to regulate real estate and election finances, except when ensconced on the benches of the opposition. It suits them very well to whip up outrage over black money as long as no policy changes are involved.

Other sensible voices have urged the public to consider not just the sums allegedly stashed away illegally, but also the systems and loopholes that have made such large-scale embezzlement possible -- and what can be done in the future to stanch such outflows and “round-tripping.” “Sometimes it appears that the narrative has become so distant from reality that 'bringing back' black money is being seen as a coherent act of economic policy reform," the Business Standard argued in an editorial. "… The biggest step that the government should take on ending the black economy is to make it more difficult for people to bring black money back to India. That is, in the end, what tax evaders wish to do with their unaccounted-for cash -- put it back to work in the economy they know best, not store it in distant vaults.”

But none of this advice -- nor last week's revelation that Indian account holders hold no more than 2 billion francs in the Swiss banking system, a fraction of Assocham’s estimate -- will deter millions of Indians from imagining life in the beautiful El Dorado of post-Operation Black Money India, or from supporting every team that plays against Switzerland in the World Cup. Even adults -- perhaps even more than children -- need a fairy tale or two to make it bearable.

To contact the writer of this article: Chandrahas Choudhury at chandrahas.choudhury@gmail.com.

To contact the editor responsible for this article: Brooke Sample at bsample1@bloomberg.net.

Gmail API

$
0
0

What is the Gmail API?

The Gmail API gives you flexible, RESTful access to the user's inbox, with a natural interface to Threads, Messages, Labels, Drafts, and History. From the modern language of your choice, your app can use the API to add Gmail features like:

  • Read messages from Gmail
  • Send email messages
  • Modify the labels applied to messages and threads
  • Search for specific messages and threads

All you need to use the Gmail API is the client library for your choice of language and an app that can authenticate as a Gmail user.

Note:The Gmail API should not be used to replace IMAP for full-fledged email client access. Instead, see IMAP and SMTP.

Typical use cases

The Gmail API can be used in a variety of different applications, including, typically:

  • Read-only mail extraction, indexing, and backup
  • Label management (add/remove labels)
  • Automated or programmatic message sending

See the API overview for a general description of the API and its use. For detailed information on the API's resources and methods, refer to the Gmail API Reference.

How do I find out more?

Use this documentation to start building a Gmail app today:

Supreme court: Warrantless cell phone searches illegal [pdf]

$
0
0

%PDF-1.6 %âãÏÓ 1225 0 obj <</Linearized 1/L 193818/O 1227/E 55509/N 38/T 193247/H [ 499 459]>> endobj 1243 0 obj <</DecodeParms<</Columns 4/Predictor 12>>/Filter/FlateDecode/ID[<4075CDA26B7A7E4AB57B2401C42AA29B>]/Index[1225 30]/Info 1224 0 R/Length 88/Prev 193248/Root 1226 0 R/Size 1255/Type/XRef/W[1 2 1]>>stream hÞbbd``b`^$[@D$`­± &3¡RrÄI0ϱvXÛ@ÄB$Æl$’¢€D Ð¼ÌÀÄÈd100Müÿ«þ À&Ã2 endstream endobj startxref 0 %%EOF 1254 0 obj <</C 564/Filter/FlateDecode/I 586/Length 363/O 548/S 481>>stream hÞb```¢rvs``f`Šs<@I0œá:Æu‹ó/k!³*S+Ó æ‰Ì*Ì",ÝÌÏ™û˜w3g3og®aîbùÀÅRÊü—EƒÉ™y‹s3Ë–µÌY.qleÖffa˜ríþ¶Û¹@´Hþ®mÙ $#È»Ž£í:ÛÄÆYŽMÈn–r\ǓɶÃp‰\‡³É¦{®³™4ÇH\âÅÆ]ò$m‡ñ’YÎMÊn¶ò8[îizp®Êu`àt0p40€ “Æf0É&!ˆU„†Ø ê3$4À$y4€Œ³³•ÁJAšê"@BÔ]`hú20‡-‡Äƒ((xMø¼x5X äR–2f3ó°qpgˆmP¸á¹‚ ¤†™‡ež$ʃ˜LA:ÈH30'¦i~†ðÕð„‘ÂÀ|b'T7@€]Ê–Š endstream endobj 1226 0 obj <</MarkInfo<</Marked true>>/Metadata 98 0 R/Outlines 108 0 R/Pages 1216 0 R/StructTreeRoot 115 0 R/Type/Catalog>> endobj 1227 0 obj <</Contents[1231 0 R 1232 0 R 1234 0 R 1235 0 R 1236 0 R 1237 0 R 1238 0 R 1239 0 R]/CropBox[0.0 0.0 612.0 792.0]/MediaBox[0.0 0.0 612.0 792.0]/Parent 1217 0 R/Resources<</ExtGState<</GS0 1244 0 R>>/Font<</T1_0 1247 0 R/TT0 1249 0 R/TT1 1251 0 R/TT2 1253 0 R>>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 38/Tabs/S/Type/Page>> endobj 1228 0 obj <</Filter/FlateDecode/First 93/Length 1051/N 10/Type/ObjStm>>stream hÞÄVÛnÜ6ý>6HÞDоd㢵[xº€áeM{…j¥ÅJFã¿ï̐º9»ÞÚ}(„‘†9CÎ9¢TI“*1ÌüZ&¥D%e2ÍPqLjI¼LŠ£Œ`JjšdJ;´Å”S¤i¦Løé?þ¢ø©¿ÏË–ÿö;»ÏËÆƒrÎ$ŸÅæüœ‰Bñ«§µçŸ¿·_æmÞzþõärð­×aðááä˧õÒWLñf/<Óá{‹Ëåÿ\-껢zà×EuT5Eß>-îïýÆWß„„»Œ‹Æ!‡‡qŽY]µüªXùæà²^åU?"ì:ΊMӞ,ó ü×<ªÊ>üÖâ¤8³äWõת_ž°aý’´Âuq×.›ÜN FÚÖÿIpýD8f„ qÐNS8zl(d³ ›Ä›>ûÇÒx˜£“ê/S’¥J1kSÒ¡±¤£PPgÍE¥‡¾¨£½³e0§c?Å 1P¾6£¸H‡q¨¿}ÎãØ£žnÉ»‹q¼'_ÔqÎöS¡_“@<°‡‚ÞÝj8JŠgÓ†È ˜;zP>fðîò ØMp&G4dxèˆ‹jÂR¨‹Iª}Ê£õS‹iÛ¾õ„¢ =GŠQF÷…Bý2nˆ$ÎsÁ$© ɱt‰v²ËŸ6Þîž7³?”-‚koëï a\;Å&û@qKœsÔ,|ÕÂ~’¯Ï|ñ°lé考é@IËgeþÐ0{×ßo¤5ì@‹4R·ò–¬³|U”O?€ïãæ‰Í˺.¿Õõ_(½BȺ.ò•翜ÍÎÎOßG·Á‹FÌۍoK~QoVyI]×!T(þs›—Åâ¨z(=Pâ¼õ«?˜K¶ÃL6ź­7üÏQ†SÎݹþNVxX«g넟æ×´4r èÍ£§èÆ ?°íâLáqDäS^=«„‘T^ÿBº2ý3)TdšÈl¨;\`9lc?2œ“¦o‡¬Ô"ò “hÉh¥w 1_šô7:€OÃ*ƒ1™&€‰ìŒŒã£obû‘M‡xñ‹’Ðê¯yDJtå²#ËÐ’¹1Z`žˆmð¢£_‡¹-³«õCÀÂ+AÑEؤö£szt¶ å…õß#žF©—A£Å~ÐlŒð.ûŸPº(¨ghÁáŒá :0Ä~×ÛП)»eþq)c ÷€úñ/¸>Ão7^]dÖC€1©[—Éײ¼1.Ô­ôOWvR·tSeþoF·ÕwC…’Ôÿá¸.ïöeºƒÉ¥ûëqËjo-A5-Ag^®ÀDí¾Zÿ×'ܐúKd¼“„úô„OÑDöxˈWZ¨¯æO endstream endobj 1229 0 obj <</Filter/FlateDecode/Length 378>>stream H‰t’MNÃ0…¹€ïà%ˆE—6±uÓ Q!~D½cOJµ#7]ôöäM АXd”|óÆ™ç™lµYoBÛËì9E·¥^6mð‰ñ˜Éšvm¹–¾uýù‹£ÛÛNdCñötèi¿ M”U%²—!yèÓI^ÞßÝÞ=¬¯Wúc:mÝGŒ_uŒŸ×êJzjDö”<¥6ìäåkþö~†Ûc×}Ñ~(’ŠÉr9&V¶{´{’Ùÿ³RÊ|lÔEO‡Î:J6ìHTZ-eeŠ¥ àÿä¤ÖcMÝLÅ A©á]TE€ •Ö(¡à •u9@>QhÍ ·3•VÜÜŒ ˜ÌÇ3€bè£,”v¬0†3VXËY0¨êQa€cÅœûð~Ò:œsPyá༜Ø7|›jàܜݖ0jÎæpA¾Ì|R²'Šæg˜Vìwìî˜Ò0qÞC^» ô»ª]ìP%‡Gˆ‹oàoÄ™ endstream endobj 1230 0 obj <</Filter/FlateDecode/Length 238>>stream H‰„±nà EûüÃS¥8KË‹«(V•¶ªÛîž]TÐ3ü÷’zÈÒïrÐÑåuóÔX€¿‘S-èÕ„³[H!t8ËŠh£Âõ–w5IÏx„Ûu85¶wP–Œ¿Çp´Âîùt<ûmXhmÕ·scçÜÏCähÔ^܃ƞñWÒHưû(>¿®Ãvñ~Ä)² ò¤ª.A}–þENüßÿ3P\´•Ó8{©¤•QAù(+†VßdÓõ7¡"žó—%<</Filter/FlateDecode/Length 486>>stream H‰lSMk1ü+:¶‡ÕJ²ü!Ð×B¡ôVßB!mJ!%}¥Í¿¯lïîۏ²{f4iOÆw/çw÷g¸ºO§ç¿pÃ>€€†=܎åõç7?ß½>ÿ>ÃõõéÃ{€ñã‚ï¿`,…€¡<À@HͽB‰!@ùÊd û21!#”'xoË#pDMÉåëtBM£ÒÉîF¹\·B*ˆ1§P¯UâŽ?pÂ`¨!2zZßV›¹ÛdvZëD$i&ÛFaL A"º‹ÑKY#ºÔˆƒAU¸Zhwsñ(÷GÝØÑc®‹ãl½-ŸºœŸä‚r“c¢r”3°_GÔ2pq ÛQgcŠùÀn/ÖJÝúØÀŠj‡{¬õ“Wý$^hfËh,HY×Vv0%T±sߝ8óå¼ÌÛ@/úý LÖÒÆë;"μ=ŽWÜCU  9­kìõÔ¶‘Ñë²À†ÅKV6ÂNÑÚgܐ°¶}K’ÎrÔGIÐ9WcµïZà&}×£8c²ÑÔ]cIg¤Ï-ÚÓF½_2h¦›ÒaÒ碹­g¹6?­‘½ê•ÜÇ©áåç«c,qÞNð3Aâ¬Í[í6ò¦k¤ÿû±©ýšðO€®4ú/ endstream endobj 1232 0 obj <</Filter/FlateDecode/Length 641>>stream H‰lSßoÚ@þWüx'‘ã~'™ªJ¥EÚ&1&i¥^ËMtAÄúßϾFÉ9ÎçÏögŸº(s¨i'œT)¡%z^à‰Ï¬1x<¹ÿö€Øžƒê×GåiþÈ{Á’¡J[ªFîgÎ×qÕb0ÝÄ?ܱÈÖðÌ0ú˜ó³•ê¥/ò$©3ȎËqN<½¯¦£ñ*žål<›Pyž9†OŒ—]¨¾‹nýüiæF8-ÜF¯ËþøADëu½Ø“±»N¨?ÉRö·ÁØ+ºeÒ‡mºê`ïS®Y5æž}ÁÛ¥¼f¿V\9¶\I ¶yÉv¯Ýk¨éŒ‹5z† ò|p• %÷èOè9[¡‰ãçEö¬ié¥>DЧ¶¡cË4Cv¥Y dN$q—º>/QÑ]`…fNGúE’-Î6goØIÁ^¸24bÙ©!jO²€e“|d‡e©Õ&ý8ÄvEgzcr‹ØšŽ€ßƒÄ[S‘-’Q:‚÷p Ðl0&åêÈS@´õŽ*ܞZüþ 0ü$û endstream endobj 1233 0 obj <</Filter/FlateDecode/Length 566>>stream H‰\”͎›0…û¼ƒ—­ª _g¶„ØL7YôG“¶{ǘ©üÈbÞ¾>˜Þv‘#òÙF>ŸÐÍŸ/Ÿ/C·ªüû<†k\UÛ Í—ñ1‡¨nñÞ ÕtaÝÿq†ÞOYž__—5ö—¡UUeùKZ\ÖùU½ÿÑõqùô2ö~ø¨?¨&¶YþmnâÜ ÷´J?íðú˜¦ß±Ãª4“ºÞž¿øé«ï£Êÿy/*EÛuÂØÄeò!Î~¸Ç¬ÒºVUÛÖYšÿÖTqÚÎÜZ¹y?Ñ6uÀ¡=ƒgŽDNx>mÀ<áùI¼ãp ((J,€À8<€àp €F€hÚ¿€ ‚„‚ Ž@Ç ‚ãPAÂA $|TðAPAÂA $|TðAPAÂA $|Tða ¢dm:=gU‰E£IÀb‡Ñ>@DZ²8Œ&|A²849ÞYiG€,Žô޲l¹Üà‡6wÀ ‡Ñ'Þ7š pÑvàõpáéÌ÷€ŽãêhΡ©„‹æVÔwhî´hîö¶EÝ^‚z¹³8‚rn+—>¤ÐËmå>‚^†¶#èåör€^n/ɽÜ^Ž_Š^N”sèåör°îЋ#\Ý‡æ‰rLLÀ·óœ&I\˜RÝß&é4N8¥Ò/ËÞý`_%c— endstream endobj 1234 0 obj <</Filter/FlateDecode/Length 599>>stream H‰lSÛnAý?U3Uv˜Ë^¥(…Jš†‡ õ…EÙ vѲPåïcÏ¡(Çöññ±gìH!¥ŽÀ.ÑRq¨Àþ RÇ`‡0gö'¬„=Ù;Wl³áJ²Eq@/ù`ÙÔÎTšuUwà*b]é"5Ù 4ƒžÜ°–À  YÏXç‹£ÕPJE¥*Êq0:Áu"¦(uÐrd…³å‹c/(»¬ùûÉ4‰—©t2íwT·kK¤lGÞ^¹Ž‹wD:ò¼•0ñi ý¶;´<@çÁÑ:÷²"à¾rz‘Œ­=îR|KŸp,kpØzéc¨ù:µ-«OJN““ä7wQ3-yJã¤xÏZ(tíÕ+åÕKÊŸ³Y]uåŠöÓnA;;Á¤‡9TH(W J–â-ÑĸGlÅþ½e’ê‚ 5a”0qâ1sR×b“MՁ­¶5Œªƒo@ ŸÛ×]¶@ÎA#înºòú,&ƒilΠ¥Ä00å1nO=Z݁1 Z§æã@ïîï{ãÁh~Ég­þœ‚N.ŠŒç…&?*Âo,¢¢$ÔÙ–61{äã/xgôÿÈÃÀþÌaök„g›ajû6Ÿ~ÝNxÕε|zš§µg®‡tš CÆ";uà.ðfCO•.ä×љÕm[I‘¥^š³t “B¤•PTšMFÏùï›ÍKB²ãÉy}ƒ.£ó¯n޳ôŸG/œA°þÿÁ‡C©7 endstream endobj 1235 0 obj <</Filter/FlateDecode/Length 626>>stream H‰|Sïk£@ýWÞÇõ¨wןP ^’RK‹ÝÞ—ëqˆ1ÕÃjPÛÐûëowMHZè!¬Ã¸3ï½yãååìnž,àãêêûbØuÇ…, #îCîÁQO0*àF! _ð“Ì—™LÒ,¶ld‰eû2…¼Ybž>Z!É,N$ÒkÄ÷÷Ëx¥£y¼J®ÓlÄÖ/y«Új$ Â…hŠ\P/<¡‘KþÁL²ßêääIñÔ”‡ÜÿéG>e"à† =è¶×éc&oÃÕ*–K,’™%s©;MO¸œº|jåŸø|ÿˆÏ>à×£nx^¢°~$IºFº^~)oy§Œ™Ýãò`Vp4ë“nv„\ÃÚ,¤~$`sʘ€Ü(ÃÖOœûL{&8…e< qoÙ.yÖÇ«eRnïL®n`„GàŽ)rUy°(óÑbd£îÞš¢ÖTZ6#àÞé¾>¾ÁØýYJøaïŸG¸F§B(Œ†ÁA@ÒjXœéº=¿À®ë±îÌ÷Ò0GV7廉öù€aì,;$»â»í¦9FäÛmmáÍÈêš|êÅå«f>mÖaÄ,äÂ,…æÆ'fûª.*”jVofíøš7Í;7v¨êaBìûrq¶üº›1Œù4tÝ€t-öe¾ëÚE•÷Ïå@¸E§™–=ŽË¦5®«…œ\Ÿºœˆ –ˆò)Wᄄêöy궨7ЧÊCô(Ǫ„¹Ú—g¿”ð¢UïHU!Œ”í©ÿš×F¡©ZnQ6 vU×–zÑȶï^&tå¦)èþç߈À?!O endstream endobj 1236 0 obj <</Filter/FlateDecode/Length 622>>stream H‰„SÁnœ0ý•9ÚR ˜] HQ¤&©ÔVŠT5ÜÚ,˜7o¶é×wưl{h#!˜ñØÃ›÷žU¦Å¶‚D¥yVAÓÁW1j&]û„!™TšÁív¦Eºmqš°cwÎ?ë`œzíeRŠA&¹pAÛ¬“ß›OðþáàòÃë8 }¤ÀõõåÃÝÇ{¨áææöžŠ"‘͏eß絬²S=ÉÒ,ËJhZ H• š#d84÷;º.¢ð8¢”&† :Ð?ƒž¦÷(ŠØ uµá˜h¥Ú#U%´T¹R] ”µè¤*×j,œ‚æ&~ÇUÏ«Èûã‹Ö”€žãNËQLÓxÞ­'áÜ!bGßΣ«MQ3âdýËØbdYgèµí'ØüÿuVê ¡óS=›/:_å§YÖÙ¥‚tö€?õ³±‹êã@žû–ç9·Ÿ)Û¬]æár}y‚Îô&è=´Î$ϧ·zB&Ý £öMÃ6¦¶|U§u¾üä£nÿò´* Tgݨ´Þ”èÚËdK~¢—þËÈp–Ã^øc:t±7¾„K‚Ñ’’œ†“÷ÏvR…Z„ÏòExÁšïÜÁv‘ÙÇ@· ÚAûž¸þböø <</Filter/FlateDecode/Length 601>>stream H‰„“_kÛ0Å¿Ê}”FíÚJl'P ]:Xc3ìaÛƒâ(±†- Iié>ý®ä?Iè /Ž#É¿{νGõ#diƪê¨?ÀOÂé’(šäd_5ÍÉñÐz˜×A¨6þiÄpDàEâÃ;®Â_ G׏`,[@ÝÄRë<”Ê«´XVA½ÃšÒÈ^ø&ñú‹1æàÀÕhEzÑo…u­4é¯x,Ê“‘—ä)˪QÐëg¤{ îhŒÎï:š”hãYî„:C.'d±%fÅb’ØŠßø–{|0º“è´å¨|ë¹TX$¢"‰MfÙ$.‚¸¶·º‡V:hDׁ rZš0¢•Hjä{+雸 4úhß:Gxe–ižÍô€ždpŒ^{©ÕФ"\í†æÒdAà…;øÏp2V‚æIp£Õ³l¼Ø¥c«ŒÞɽ¶JrØÐ¤À¨,ÉÑzÐ{¸3Fðø~/m¾:¯¶û¼Z.¦ö ¢À/:…|A(™åñy–&!o˜Bgt<</Filter/FlateDecode/Length 599>>stream H‰\TÁ’›0ýM'd€„d{ï¡Ó33{H÷à5"¸6c›Mó÷• Û=@#====( 1Pì‹SUAsƒò´¯ª3д ºàGxƒÅßUUE˜0Dï@»œOÖ`Yór(ŠÃU–õCå+V^î«â,€©× R0õÞ!Üt„€í‡uWç!Ùi@”ïŒrQ`ôåµ²RÅ…‘†èç`l‹.ÙÎb›½5¿–9N\Ö|EèÄú0Þ¡÷sä Ž@ämŠ€§ˆ& :iù¿µh²³ê³# Ỏ¦ ü„ަ~±ƒGç¢,Wˆúx\9\”¦rc0Ò_HC´Lbl€Á_wÐbZ†‘+-(è³¼¤înæÓ÷G è/O'Æò‰@ÐBò³ºÙgõg–ƒþ1Ø]hËâÊzá]•g¦]<7öƒøS%÷ ò™£HÝ%ýŽÃެÀÇÄ6ð¯6|}hÓòHÊF*{GIäá&¨âÉ¿C\Ð'€DdŽMÙÓªlu®6ŠÁ͝Y­D™);ˆìY'–LB÷½ÈMÏýÐ́ºpp%fÕRdzjÍAà»J–ãê:?“ùÛ0_¹j÷IŇýE¹m:+S#Wk GÙÐC7=²·G_Žl²^‚M[ÑDÁ(ruQ´p*]”ÜEF+ñUr#.]CrÉׯ’&ç7O×ǯNPü²’ë˜^‡+/Ȧ^„ÏAg—÷–Pê'Ê×/ÊE¢3ù餺]ÄHt~¢H2úvŽ'3LÙü`…c; endstream endobj 1239 0 obj <</Filter/FlateDecode/Length 498>>stream H‰lRÛn1ý•y´QÖ±½—¤RU ’"¨TT©F}(<˜]‡‘õÊë$âï{/D4»žñ\ΙãQpÿ¸X~úÓíMûÜéno—›Ï[7pw÷a‹Q’QõkL|šã’OñŒ3ÎyªÎ„”%¨3d¢bR®ðdT¯¤ó¦ï!ì ˜“mL[p?‚¶­i`çÝh&I÷FûznG+’òu§}8˜60…>ý®FT9 Êâ&‚òn‹p[ÛO³œX*H@%;¦ÛHÁ"t8¸`]»Ý6ðrœ«œu©ÖÑiO)0ô2Í%™7âˆIžŠDvUÕ ßP›kD©SbNÌ|oÒ°bR8—iXVa ÄUî'Í bh&PÃÈÐx 99ÛÁƒ/ŽÈ¢¢YI¤HÿÅÀ~©”@Pµƒ3ãDëŒUŒ3Ð×Öâìðt@IL?5àÿÈjl dz•Š|¬'pbiÄÿ ׳J¨È'°—#®€·fqEM¾Ž…‘åTŽ®IµÀ×+QA| ±Îk<¼…è¹+‹„F‘K–l•çóú¦Å¼˜Ýôi“niš'õ(§b•F‘¬”¥÷]g4>Èï(|ìœG9Ùǽ7ðÑúxo`c}}´Ñdûu¯þ 0îìß endstream endobj 1240 0 obj <</Filter/FlateDecode/Length 25090/Length1 34536>>stream H‰tV{PTç?ß½wwÝeeミÝea°À¾_Àî^`%‚0DV$‚ ©Æ(«‘‡/ ‰Ú1JP‡Ó‰ÑNbÄÚµmbÚ4mè´ÑIgÄÖiÜÆiю»éwA'õûî÷:çÜï;ßùsî³!$TW-¶9;R­€uïbjíÊÖÆ¶"å² €æ_ /VvvèO‡ßh¡8™«ÚV·þ³äoEízjÇê–-«íÿò~÷&@ÃÙ5͍Mcµ›F0Í»è½|¼×&̇œ5­›ÿæŸOt⥠£eýÊÆ»ùh9ÀŠ}xÿ’ÖÆÍm¼>ÔïÀú[›vÙQ€Õ¸QtÛúXo\âX~Û†æ¶5•/Ëñú®ör\±Œç¨zàÕ£QÂzÔ«Ày•¼@l©;ô³½Ãž%Îq‡€‚ÇzòÒc†ßžº„÷x-õJÈ™/!ß3"E$è”û‚AEÈáTƒ£¨žÑ:#2§3ât„˜ÃóvE"Ñ_E¾Œp"-ÿ"ú¿nDë˜R­¬ËOøk`ÒK…»ìöí3ÚÙ!™Õh~_4Àzø(àkp]4-Œq¹e­ŒªZõ¹ê¾ŠR¢&ËPÜêròó-10è +Ÿþj¸oà‚™^P†ÄBˆÒÛc‰€M°%è$;ÃÏ6±$`Smh/Á%Év¶Ñ‰z2|íéx™•ˆI”ÞBë6ú*}õj/]rââ°#—Ü©Er7Û`ò¸}^Ûl2‹§)9MíëÅT6Âva»ê8÷À‰£cšË,Tt®Ø:Ð!bF\Ÿäý „Q@8ì:RAºgsÉX\œÜ()uA”Ô…,¹Ò`ðǹ:Yn®Îâ ˆêH)¥.òkC ¦©GÑF#ÊÌ,¿kHYòtQP%1–« Á(‚óiiªå"5+Êc„Æ*/ò.³Û«í„}mfô%Cö¼¶¼KydÞUfŒ´Qo\a¤ôF»±š/ j˜;¶5Ž˜ö™°IÆ”†$À⁁H„8D’%b#l˜Ì€‚0¯Ä`6VTå[Si™¯ØjËÎ)ËfjÁ_è­EEù%µPšS^>[ [qgµZÙ¶ˆ¡öÒ"%‹™y²äÙ†tÄãòX}®idÍéh_Ÿéi¸qyÓ¡•ÍNâ&q9}…ˆÛ¹gÑÑEYŒ„Ó "Z¤ÙE ¢Ñ°ˆ'b-.£Æ’S%¬uÃØ³•éˆÀê+”<“ÙDxÜŸ—èÕô÷Ι¿¯Gs|QϞۗrîú~:•úôÓñÔgÉýîþ¦¨éÊzîh>O7MŸ^ÅØø$Ÿ§&Õ<9¯Ž¨#ëxu³¶’[y{ɽ¼ÃÄòïð,ÉŒŽRNgÚ/PˆPÖ¹¸Iã2zª}j2!yªXLªP*$r±0‡Äã&Læì3·wÇãËNiº÷ÏŸÛ»Ÿswxå‘ԉ˧Þ;±ñ {_ 9Ço σCX³ˆ ò'UÐÏH‚¥bŠ*.:ô”GÝe™ý-ï"š€y`A÷ß÷|ˏ¢ F9e*r¬ ®,uTèõ•ŠÓëi?öô¦â•[™ ’¨ÂSšä$=• '%Ó~¯æõy}!4ãGÙ6dà)”O“¼™­\Þt}’óq5e‹aÆ÷pŽW(}ø3ðCâ'4F²8èÕä¢sMeL¹»>hô-ER9-T(Ò2µ8Ó•ïk¨+s<¥x©M¯´!Õo¶ø-jyšx¶Ý¥öåø©™<Çeކ Óe9Aœ&÷|‹4]¬³EÛô…¡¢¼Ì¶yø÷ºS#èMø {ÃÆÕ0Œ“Ö!ѹ@$)±!„â’‰*ázá€ðk!5 Ž ‡§žÂ'º!֞¸×.a?¦8LÆv©™Ïì'F™¹ù;9—ÓÒRaAyÄSö\jÄþúzZD‘NGduÝ8Öf7ê!´„«y.ށãbá‡äÿ¸.û &Ò;Ž?Ïnv7/»ÙlÈnáEBBHDcدUj rÑØ¢Ô®Zï&ÑÁéÜÁ´Z´^®íøRlÏ{qÄÖé]ÕÞxÎt¤3^¼ó;=§w3œvJ{íTbŸ'Èá4™<»ùc³›ç÷ý~Ÿü‚"¿Pàb×<þm›h;¥úˆœãèª_=™ƒÇÀÔ»VÉfpŒÖI—ªZµAµ[õ©ŠSMª¦Î/-€EV˜GOè.·?Ó`¶'özêëï4x*¼Þ@€î'sŠ<Ôµ¨NÈ9#äEÔ(ùi@‰ÓgNÎ*`¹¢US$ ÅÑ(õIÆª‘5dLÓ¯IhÆ5SšóZs‰h–tj..ÝßEŸfv®ÐhWÙ³ yê´ú ÑèÌ Dg™$?-&Jœj´”>ÍÁôë ŒB¤.AòóŠ w3A‡ƒÍ'è"põÐë©¿½ÿnbjbð/ÃGO<þökÔáãH §&Sc'¯Â~¸å橆ÅÔ‹©©ÇûÇà8ÕX÷PëºEõ 4¾C©ôm3P’‹$…ªMÉJPyc®Á­úk:Îʵr1î=n–£ZŽ3±Ÿ¢sÈCsz¬†jd¥2‘€pg-m•¸Ý éìB?qѐ½êÊ¢ûT…ÇYðÉkWš¨¾ÿZ-¼ØÜì.!ßÈ.®3ÔøÐÅÛT ø½Ü|‚½ ¼>Ò|ìúÜõø§ò?¬Jé2kÌ.»²ÈY ԍš¤ãCÝÁwdôêvfì1 ›Žš®—^/SUB%؝ ³³aº€¢fˆÍÁV†¥;¨¸ M¢„)©‰Ilx X!@ÀvYT*­ŒÌ1¦ŸI0ãÌ3‹lë[Žë‹ZŠùŁù…yüÇ—ú`T@ p×*°áEÚ*¡Þ¿Òp@,K‡Ì,ÒEC\h–Kj­0ÿî°<28rŽc‹»k+×=¿ãÖÐàÍÞ O¤3õﮩõo¦¶ù`3TÖn»Ðtà•CfŽS›¶xk:{N÷õžíª{5Ø×òÉs¸º£HÙ"ÚË&TÔðD=õœõ&ºÁÓNµ‡{=ûÂt«”Ùã¶ÒxY›ÍVÇóuÕÁ A"TV´ÕQYmJ¸‹‹×†ÜɆ³9ɘ*0u¯c÷ø‡ýGý¤W|-\ Ý = ‘¡³{ŒÃÆ£FÒ¸+®‡ú.++³X CŒM°ï±³ì]–IIsÚ%轐^1],ÌË©²¼›Ø—Ä•¶QU¸ÉéµXv“Þ°;­0'BºšÜ2›ÊŠO}Eæ’¶„åÎh.§. ”V,•¦T¨(LWG× ®Ó˜×sà*æç}k¹Ðã÷­”r…ü—®"fÇZ{†~üéÿkZí Z‹K×íëüÅÄÁxž·DŸcËÍ÷—Çeyhp÷p¡/àòT·|ïƒËw‰ûùßÚ~ü\ïþM?ÛÒ²©fÝ+Ŝ沓ÓoO(is†h$ˆPhäô+­y’Ýã+YÝR»sãžÇúÐH€]È+^ä^˜À²T$K>±QêFÀqÀlP¢8kä,£d0%I¤±Ma0N«iãXŠ›!ž— Ân6Î>dŸ° žÍe]l5«`gˆNYME@K­$$gàÙ!½UŠ“ÂCä…\Á%ÂAË‚U”E"&ö‹ qJœ)›ÅŒË¼€ü²ˆ&ª¨€»®nn ŠÒ½:PÀÜXå‡*<¬«Ú?Ü^á^¼AøRÙð>Õ÷x}Û‡ÁØÜìXu5F_Œbí!íg íËP)WÕóÐd,1Ö—4”µ—l*ÛQÆì°ÒØSBä)e Wƒ²®‚ç+*öeCúKÌÈÍ5û1|8ÝÓf:xžK7U:mæ*t<Êôš5y¥JåLƤ7¤›ÒCI!a‡Ø-Ψσy]ýE‰¢ñ"²h—Õ"[îZY1KÂ2‹O,Ø ¡e'èðhºXåªÂ›b\ŠSô«ßµ¸€Íð5`3Ú£Õ 2ËS¸69Ê &‡Éå´”K#À%º1NC,÷¥T‚ipFz ›‹HB@4€g:÷ÿ©Ÿfž6B§š‡m¥Þ|²{ï/m-£ÁkP“šûì·×ù*klG`pý‰×3Ø` ,S KµÔá5Ù*>ÿûµ©C……©ÇïÞJ}ù瑍õU¥å:A²~ÓýÇäÕwްËbv”rjXø;¬î½¨‚NTÁbPÎȝïó·µ·ùÏí_i)F[Éúµ¤ß]ïnwwx{˜n÷Noo…’VûYÂl& "§KJTùÓåšVqc¹“¹Dn4«K<ëIÒ8-ÓD9ÝJÇè­ g`\6;’¸ËÉãú¹7ÎMqçQ§c8¬äÊt™æ£˜|ЊΖs }pÅ–“>¥G¼§˜Ù0®dE%ÂC´«ˆëíϤáõç¶Ÿº—ú׵яŽœÔ«?éiköyêMRVAõ¶©Ý°ìåÉŸïûÁøab¼wó½s7S_þ®ž½_¸Øê\·þe9…ù‹Þ8”º})kÕ…_¿uù­7/ŸÁ.8‰öÐN ƒLðÝKÀ·Éji+ˆ –I<‰˜Êq%¡ìâyGy¦œÙšËϜʤ31Q›ðŒ2ÉŸçòOxºœçgy’ç-YK…wí \“¼6‘VCFK<ÊôÕІD”ÿ;// kÔz¿Ã³Ú¹qWëèâgµ% Ô°Ùù÷ÔÛ©Ù§7”Ö6†®^Šc©çþŠÀ¼„žÞ‹`ùÀMr©ËÇ…¹K‡µ=/Rqtºz…–ÖžüîânǨK·_9Ä Ù_rùÛeÅ}ÆñýíÞîÞw»·w{DZ{÷wÈœøzʆ„·` jRñ,*‰^mEQj”³U‘š¬bŠ`m5¾Ujs :“DmMÌ8t2™ÔΔڴ 3IǦ­ñÎ>{ ¡3{ùíýñì³ßïó|¾ªŽ”í!Ý~㏾˜öªñ*?â`•ZäJq9ëž×m@¯à;U­ºíÆÓ¦[& ‰\™ÖŽÚU¤ÖÁc _(}IÊóéŒ>ŸN—%Ÿú’Îs¤Èpæ„I¯kKíJ„ Û_’RæÔù‰j¢žˆ B&FÚ^×ÄD¡#ÿÀì®cÕ6µ¤&êÕM꨺[=¤V©iõcLBw“{1<É¥MoE˜º<¯F6W¶„Aua$ƒÄÓ=5ß‘´²|D~ƒ©&gäFCöõñã×ÿ™¼º{dmâf¤¼³ý‡?n[ÖÙxfàtlÐ/º¶ïäÎ7îþdû¥%[>ïÿ´æèòëëƒÛ¿³û`Û+/ïü,ØûjçÀÀÞí;Á§-ð”ð”˜û©ôÒÍB÷üœþ wYN­®&óÛîšœ½ÉýrN‡N·À*tɈ–HM%XÙ¦^/ë<¯"mçYm4£;Ï›g),o\ÜŸR¤XG²I³ÇYÊæ%ê©&°n75D Sc0´ä¾åϰ÷BöÿZÉíBÓ ƒÙô<;¶ÐÓ–ä Ñ,w«ŸùÅ÷zÿ‰˜ë"cÿãýËæå?'Š+6žX—xÐÔݽ­yàþÁºõ½¥%ÞLü&‘H\l_³tYqž=ÛÌYsš}¿}íú…³Wvî¶<ÝNC–9N¼Y& ["9Sz8ª£9ˆ4*3î3™ªL›M÷Md—iV*!šIN6üT×M²0Ь€c˜vÄ@iI PV6OAAE9ñ^i`nIYA~yÜT€ü*édx1Y‰ˆÕHóº’q¯7ýž^-W”¢eÁ§EÚ(¥E…q_ÄWñ›ùû<ÙÅòCʏñÜÄúiM†ã€øáÉÝ}|2ÉŰSaŽ7g¨´j«²¥Xtk1U†¦iÍšµOW-ʶÿ蟹óiÁJ%f?¦k…fwuQ`ýÊÍîÅK}^¸wòç¿wZ·)J‡´Zÿh¸å`UdÅáÚ–î^^È›ç—VU4¿ýþ‘5ËnØ·'ѽ«(/,(Áð'_bùù0;v[Úe/~Ù·Úe¡wÅc%éuµñÏj<èãÄ¿p ùàÑÛ+*+º½-ºRîÉ/­¬¬Œ¿¿*зòfÆœX>vErT(iK(ß凧Éü€!Ë%“®gÓ’ÀðÓ„—ª8YRdy¶¸áµ£;°õƒ+ebâÞÄHâÎȯ‘çBýòÅ®øÅ¯wô$®$¶%Þºtô/Mü;11ŠÂcŸ¢}ïÃ<+ýÝýñ˜;"ÙmsP_Ö1.)Í<èÎÆ„tJ÷x”çɐf=(i3@xF¦±Ë0hÀ ²ÞrahÜ&e±Á]á/©°‚Lž¢¤U´šÖÐ Êér¸²\¥ §r\™)î­ÈƒÃ‹‹¶oŲIïÖ©yæõx<Â(âJKå`~éŒîmye¾3ée/‚5Áœ,´©|nÇÑ—úÞy=r)þâë…9¹î>œŸã-î9Û¶Ò»xoãÈ[Áe‰ÿ¸=´+–—Y™éPœ.×× gí¢Hç#´õÂaÐÓèÊ:èŠ Ré]‡¡W×oè±þÙúÐJ3 ÌZ¥¨$þÜrÅ2ò[ÖÕŠ5Öˆ6bˆX[µ­†Vk‡µ_¡«²"™býŒ”ä/Љá/HFÈù¸"®Šëâ9ŠáDØ òFJMµÑžæÃ‹páÕ’ˆ†§‡ì!V° ~Aª…¨Ð-ИÀÂBˆáUR†MÉ1!=Ë i¨™áx†Øœ²Áõhò!ÉêT§ رFאsØyÃI`NÖisúMNÒ)?:¯¼x‚ÉQžœxû/ÛÕÛÄy†ïûÎgŸû~ØÎã³cÇçßIl—J Á;FÒ¥¦¬%$ڀ–L)[šBBƒ ˆªJ!+]YZ¤¶ÐuB0 j26Á¤hLZ7Ø&u«ø14y]—Ží¶5=³÷sH§éìóÝw÷‡¿ç}Þçy^b=qZA3ˆ+e…ÏÚƒˆædag»PòÖRtU¹ÔRKÅ(ñS„ÛjT*LÐUGÏ)ØÓˆ¯9~úpñ–Ø2À¬XÁìÛÑ[=ï/èÙ†USM›g’µ}Ì•¢ão?ÆŒ9f´½wÔ¸¡ÆÇz"f‰E¡6]P›G 6qêªV³šyŠéã¿ë>Ä¿èþéûÛÁ ïñ¯»?gh+³ÊC…Œ  ÂIƒ9$j¸Ò®¬«ÅEÈknq!×ì9Y®¤˜@OðŸfð÷"dÉÅs¤\%+¸6ŠN§ ÌcˆÑ¼ª¢Ì3Z ІϪHPƒj§Ú­^S•ÀšxkA0&à$hîlç‚IòaO L¨þšås ì2w¯HµuœTƒ]{™U«,ÏmÈ,~Ýhx-KÔ½(Rˆmm¯ª2>y鈱ùäËÆ‡óºIš^‹‡È„öÌý›fŠ™¡þª-ÛÀ<}xOd·ôr'þNoS¿£.݆{wU«ef‡wÅã¥mšì0ž²W4õ‡ú‚Q+YÒÅ\ѫۊÑ/×Åu]RÄUSüšÒuÕõÆÆ½µB•®{= SM[5Aj -÷Jùh­Æe„Iâí9yá:eG×ÏYFyrI¡ëš8Pêëû.S‹ë’ë*Ø0AÂK˜E(<ð&b,Óû³Ø é¾5ø½g×&œžì±nßò¸Ó§÷¿Že§N4‹²®Ç›M/ÃÀZO\‚:© ë‚ÈËÒI¢ÊAm Z(R¡\™5ƒ5܉»ñ fð„%›lIâäDd4`A–[”[€ôÖéîvßvßu[Ücè3Ml?Ã!žÓ¸N®›äÎr׸»Ëã®i½&ƒB;„ª4kí éYÓÔ0kSm‘uÈʆ­¡uT5‚ÌVjÙ=ÏÌ¢Ó£¤%f§Ð隢SøåöGÓÛ® ûsOÛòõ«ÒΠbmeÇò{†ëµ!@$ýbéŽó[{¬ûÀÍ‹Zl,ÇùôþÓÇéó± Ó_è,DQíBE8^¦r"ü-e“o—ÒëRöûŽ*#>›µÊ²ªª@( V„WW­­VW‡Ë$IŽD#áhy$¹¡K–ܲ,YXöÉò¨»¼Ä™YÃD† ¦ –\°Â;1c¦³ŒD$#?hA+ªD:?†,ÿÃXx³ ¿=œš‡k3ËôîH7YRü!ú4±¾q±yMÛ£öâ3wÜÁšacÃó2´<”.1ÃmóSj®¯ÒŠÇš¦:]÷•»\xýŠ#!Á£ë‰*Ó¨#=¨ã΃J*Ô¸¶pƒýcû'ö)»i™£Õ±Ù±Û±ß1âø…Ãb¶kL+9-³Á§µ},/ð˜'q%&–9s"+ìâr<¼£ñðÆmÞL•nZá¶,üEÀZ¢º~Þlg›Û-ŸÎJ—%Z†¥Ò5é¶ÄH¤¿}s½š£ÔæÄ0²%e#æú°ÝIb\ðåd¢áÓoÇ"é¯\;ùûÌÊÐT¦oɼdâU€)Q3µ3©ÞD¢qEOÏ7 EHþû´<—0‚K$á Z`9 Øpb%$:>`=2‹<2í¥Ë1›~›äák£Ø*'•‚µem¶7m&ÛÒ2ÜI…©<¯ ¼èƒ Â{ÖLXãá0 ã* Šß>C{cIïÀRg¡¥'šß8£ýäw†÷L:ÂO5`U‚ÊŠæ 5Ë4¤B©D2Ü/AÓÀ…Ð$GÇпû—Ö.X¶ÓذwÁü¢¼ÜøgæO¿;ôÍTv/seªÛ4¬GÓSÛÕ(*hºóù~f÷Ô¯;;ê̺nÝ4@U ˽ظ†¨;ZïY/ÚÊlòö1ýöÝ®^ïaæ°ý€kÐ{œ9nv {9hYˆÁã.¡Ò ñQ,&kL¨Ü“dÖbåX˜âDÆÎJ¿VBI“Z%ZšpZÞÀ¶7øé|G…ò î;Ã#~ÐâÎ>A *¥UT†•Êmå®b¥²¨Á"#ÀiX¡•qô)¥ÎNp“ ÃDŒÉQҀi X““HÔ`ÍM˜þËw™ÇFq_q|~sxwg¯Ù{fööس·½ñɃ‡Óvœ`#ðV6ø€„9|„Æ@ňzp”*ЖCr[Hz`á¯1ˆ(ÐÒTJª5¥þ0Rkš x×}3kÓ¦•*Ë3ãßÊZÍ÷½÷}Ÿïµk³J#yå`Ôs ðCF½Yá$^‰Ö;+J;pª~YEëÔº×ûÒnÜi*²¹¶½Díîysðººè×—<ë G§Þر þ"÷¶5—ÑHx]Ó·¨ßé17Ö/m^‘Ód^ɎâÃ9)øêIŽº O’Ö&×vb;ÕOôSýÎ3tJu6]0_°Û.:.²c΋î§ÔcÚÎ`„}@­áo’y…$âd;‰“w,7O×uëÈÝ!®\t2ÖyfDR’!ÐïL´-"!Ôáä,k9äˆk†>3—2¸H0c¨zôbfìÂùÌõË#hþ¥«Ÿ?é{ëæëÔ_~•9uûvæ‡ãWѦÛDmã/g.eŽd¶f>:€¢"‡°ð¬<ų؛’?¨v5j4Nƒl?yNØÒ. J~>a÷Ýì&)#½ë„¬iê´#Æîƒ!{ 2zZ…OÈ•†­›åølR6®Ë#àª1Wô¨|I$àpñRî$æ'ò’3ö/DY‚,¤Øÿµp¤¸;$)˜ºüÓLjÜþãÏ3Ol®Â³é¹G£¡’š-èò+ï¼ôݳ]s©ñ»ÃÃm{3ª¨|Zð?ˆÓNôí_.w/™þ5ï^„ÍÇþ)ïç  ºçq7SkõúZ-‰¼ËÊó.Þ¥Õ“vuq£ÏW”jªç6ɞeXä¦äg˜l„"™ûvº<àâáŸH¿¥•±"ë[å7éÄXq Óì”bƒ±÷bcb¾X{¬;Öû(v7¦nˆ¡˜,g•ÒY0MO>j™ÌÌKºg,û¹´‰ƒ‚=ùBœ™=¥²Ì ±TUž$*ðò$*£J’˜J=‡˜›D€F•³ZË=zݐʃ;컨pà¬\NUÿ¯%øÔŸ¿X3ríàæaO.ïñ–æ,¶Ü¯Ýä´ñÆÚwXØâ珞ŽÇ £«çÇë^êCð£µÇWYuÛFöÆóWmÍüìÅš²{ûº§Çò–º:ÑOžÅôÀ¾w_ë/òeßÛù˜ÏÔ(ž•@¼•O”ëªu/9›¨¤«ƒZ¯[ïÚAõº¾OÝpÜ`íúC€)U³\ U9;xþ®Â8DcÄÙP.Ÿ“q §Àiøv(ª7‚ÁÝ•– ¢UDQo$<ó„za“°[8(œ~+Üþ.L´W(ªàRTQ/I?­ˆž›¦žh#º ø"¨;j#‘Bç%•dn7w›¯˜Is o”~+½ 1!_ènè³Å—c…Ì—°™a‚& úŠ Å%eŒ‚h¥6DPkcþöh1ÿý¤Œ™6ñú,VµF¡S¨uóZýòiÂ*åî³xFQ+†eƒßž=2óö(¡/[Ty}yp›âU ¦b;6SqÙk³8L5׿,œÿðäg¥ÝƒÇ×fþþÞ;=55a”7rtlé±;_4ízú~ËYêk{Ò÷žLœ|µzÓ"±¬óL÷õÌÓ£ðy“™çvUoª-©¨Y?võéB¨pxQæÑý\ZÜBÞ"?qKœ¨†|‘o曝ÇÉcÎǤªŠ¬ä+õd=OQ,áuÏ‚èA÷)÷4$A÷ìåNá+%&¦35 jD46࿈º0@­9aÅ\mn䖏Œ2O`ÖÓÖA+Ñ#kõz²šOÀì%ÀÏ䛲¬ª&3ÀQÌ2õÀYÜÿßP¢d•ÐLº—,ÎÜ­ˆ„ãßK/77¯ øðš¡–OŒ&ƒÏÖæA°Ëu‘çÄÀþž‡r¯—MO(;>‚–æôet©¾Ì°”^¢_jXI'õ+oëß6œ¡Ïèb¡•¶”.×.ÑTë_r6ä¡r ²á\¤Ñ/žBu’ѯqtºmÆ îsnÜ-/ð\ð|(àãâ!ñ´8(R˜Èˆ>±[ì)FDâ(¾‹*&Ž.£\&äŽTØhÆÿ#zPö½p¡tö\\6’¬o”á?Ý_uäùà®°f%^l]Ý<ó§©D¤°ðÛ’yùS—÷.z¥÷ãsø™æ–®®n]{:ô`÷Á]¯5½EìÊ…¼4ýxú6õ!hãÅ~'iƒl•ÿ˜–`9ΑšÞ%­ yÎçäù+´ÚJÓjÇ¡µð¤u:ÔZ£iãxÝdòš1á`µ„ÙâÔ¨sHÄsX’^K¡ß”¤-q$¡vD ¾E²aæ[>‹dé³Z>³P>êµ K /¹Ð‹¡8Ú$Ý«›™l‘I²ÅœH˜fð†•![ù©ª”jÆ­ ³ùF~ˆ¨r;¡"+œÕ‹4_7@•(‚4x׿Eq³íCMô‚Ä:<7ZôJ0SV›þÒY=/úœ¶ mÊOœwç̯«kÝü,B…Ë]%LßVÉÊÅQ»T°ˆC íR¶6ÚÁot„6D·±;Ýý¡oFµ:Ý\ÝKºZ[M ‡#Z–Ö…RÓ«†¸PЗš^-}ƒŽF|šX4º‘ր¶6 mäX+DZ`°™ãቊ4gµ×ÐZ–ãᘆˆúLð™x´†4‘¨¦ÝŒÌfÎh¬2Ö £1Lx N§ ‡9øšIÇÛ}È÷©$;0.¤ hi}®žëâ¶s$¸{ø—’D#zmÇ|`ä[$“1Þǻ㈉7Äñx¼èYøW[z&y.ݳð«Ü'åL‰Â„¼DM‰«Œ<€õB½ªäN¯„Ò=¥3)@.^6Ìf‚ˆJÍTª+¿šQ•:Êu›«Yž—ՀCU5Ja=ø×UÛÄy†¿ï;ûü{öåŸíøï.ö9q~ˆó‡_–HÝ·%„„še¤PJâh,¤[ÂÊ:XÉÚ®åGSR¶nÚдRÚ.Ðn°Úu› -UǤi¡"m7ÔŒ ¥¾ì=P©%Ÿì;KŸõ¼Ïó¼ÏXUl¥q)Ö/)oë&›åÕ4®¼eml\‚Ï5®¬v+Ï-W~¥¼Wz]±V´3+°Ýê úž«ˆÇÝn;w«Šj+/mŽÅãúâDòf“¦ñæ[ZñrÐÌ8ëëjÃyÛSüîÐÃAæ…ÐÁºÛ¼™éç÷0»ìÚå|—q˜~‚æµzƒá1)”+ŒRˆ7Ý>×aÐC<0ðF}ˆî•°$ 9ÈÆ’0LÒ+tøõ¼ÑÆêC$ìpú‚ƒ3cq;;ÁN±«³ $BdÒKRd’аâ<òz8b´Ó6ÙêpJΟ”…cážðDXžÁ°Ì„`$˜RÁ`q‘:(ójÆLªÅä6¤ÞTEŽª9x«¥637¶A#ŒM»QèaTÚLJÂÉä]©9¾¢4Uh÷æN™ì^Ù]cÁ#ØÂµÄZIÕ†T•rÄ¥»žª‰(Õ¾˜uÜãʳ§ãÿ‰U ¼–õé ¥DbíñxA¿Cþ²D" Á«Êy&Á ˜\Bu cƒc!§M§u£FfÎ1T„I0½Ì83Ë\dèI¸C˜»FœžŽ±`3åÛ=Ýó*~ñhQaIè¨Ò¥´ò_[‡óÊžÉœ× ‡H6u˜ ¶ QÓirZ 'èIzšÖ´Ó)z>ÎÒišV}ßÂ^S³'T‘Xæ0ü•øW-â¥N+.8Š_TÆà4íåÌi‹‹Hc^ìG⏡]~ïãy iØ/æQYº<¢í¢Yã¼ù¯ƒýjûØ™®•:ƒ– (:+ß¿I]SvÈj5œôõÍú(«oÊGü>ì»aÛÔÕl1 ¿–¦(Ê`B˜G†×R6:Z˜†Ã”?<>žU¹CZd§9áîu§2U-¨:åtZé ²R`‡,L‹/‹$"bQ¬Ì²™ÄÌíæó¸YÓcžÊ4³$ªÏ635 Ì«œƒŠÖIÞàà`Xjóð35çDU™ÝgD™)(UgÒ6¹ A ¾¨„«¬À´úLMßÕ1ØÖÕ’ôLnœ|wbïèúÎX©Ó[_VÑ<ûÚ/Ö®åù@rIy¬ý¡oÿúѺø}Éo6ïØðÌ„}÷?tçY…Bi´¥ºïg+Û6)¨Eñ‘@{ÃÀÇ~ ¢Î.^ÕX´Iè’,¸eKÒcû]ŽNçN„\)Î¿ÅÊM¬10‘ñ»²‰³Z9†ñ°šÁ‡e‹gTpFœ²3áìuj3Ø%"NàÆ¹IN#pN晬;ÎMs縋Ü9·&9Š;Žß‡¤‘)7CéOÙ9€l¼Ðr€n\Œ-Ì«RŽfâlž i ¢$i}X0À%H»úp¾Þߗͯ`QÛê' N» å&®måE€¡ç µää,ƒhÂÙs3­†ÖÜ!2ÎÏB^«Þ¸t²ã¥¹/^[³÷¾hu¡§5VDÚ·w¨Ùª=Úé•?¤(ç?Q>kyp]½å[ßÑÊëâ韟¹táÄ#ÛþöáIuÃ6.ÎQ ೈŽÉ!À Ö®-úRHQ&Ä÷pƒÜ7ÁMqW¸ENg…ݧR‘Çy2ožp'ð4>…/b¨Í¹U½Ã©ŒP_¦OÑç@£:Dt„N€lA°“4¦ó³$MÃeAe©ÚçUNŽYóü½[òk¼}(OŸVèC@yEì€Kª« íߥhš,o(ÊÚ´J¹öÖuÌÎüðÕæ%¥ËòÙUÍ£±îéG0oS>Æä£ë8g²®mYII¡Íä­íÚyþݳÀ¹­À¹íÀ97*DŸÉ1Ÿló¸å|³¤ç ž|w'Ú‰‘'eÓå§Ì&ºSgÔë‰Á ‘1÷„{ ôúcZÊZE •’œX°&¬¤Ì:n%=Ö)+±ªj ßb6ÄÂ\2“¸¢e™"u—WY@¼"Ã儼ðHdàâc=@0Kþ×iMAcþˆ&`’F°Ñp‡V™§\¨0×^ Ù=#ÚÂ\xnç³ÏU<¥Ûæœ1¢‚ È:2Ü£ò悔ª DÖàh´I9åŒè™þxrèÙî‰ê¦ÖæúÇǾ׿õÐÃ+µïäÜPârüdÿ£Øüÿìì^GrŠÊÓ×^9ÿÉï¿ûû­½ª®;}'€}¹È‡~*—Ê^ª×kYÖ}iäíÈ~c­g«Ó¦Œ&Þ5Œ¦Sz|NY=Ö«ˆZ;¾Â`+㇕3èW‘„ìšå”jtó±4¬TuýBÈÉÂX’ç3å-—Ë%4r縶c¯ÕÞ‡4&LËõlÇ>KÌZزÅEP9q‹¼ê|µ*íPu§‚ÃkÅŠ,åhê•ôm|Í÷OoozFùüMe1}|÷ہt~>X¸'¹éGø½ÖöÍz”9Ì~8‡]{Ÿ|¤µ|éÀÁªË¢*µŸCƒzUv÷{‡½»…ý‚†×“Æ\Ê~ÂFû}e>â›Áÿ–}…Nl0wšŒÒºqP'Ä)ñЏ(ꬰfÈúß"wVåžÁ’,“Àf”H¹æ§¹§¯°±¿a Ë&ØI;Çñ?o§¹¹ˆ&°µ <+3Ùd~>û@œÏàg ñް£x *â×@TT‰3„+í{ƒH º2Ñ×”IÛñ“—/ó¾šñôÛ«‹~oÿÐXcYQmÐ[ZÚñmꗝéÕe6hRÁù]çòëX;ÐUß\.ó9Í9ž~»ºOÒ4RGKÑ Ôþ,×wUl®8Pñ¶íOµgšèº@]°®±V®mZ!¯hÒâÙ&k©ÿ“]õ±MœgüÞ»óW>îÎñ?s¶“8¶ã‹Ïg'MbðåÓ¬¦$d•IihÔ–fC(…$4ë í Ó$è¤þhÿèÇ„VšÁ*ÐÆþØ&µk´ÊVåŸhHÛ²T¢Ò„=ïå«,²ôêÞ÷ìó=¿çy~¿ßõNìõù‚5-GýB—@v ‹)Ì“Åje’!’æ•¢çȉ¦£ISçÑ Û=X^n`k{AáíöјYçI§¨IÖÕ¹•È`fÒ=È)~EQT…ÆËrKùF1(?ßÇ=ߣ÷ml9™Ï./­ÐÍè} „Öër>‰¿õ%²àÃQÝ:^!Ìa^$𠼦Â5õø¦ÉXwA‹ëe´±ÂÏL› Ô›Õ±º‘e=Ò“h‰z“¼ÙV–ü=¿=08ú|û¾½ñÞ¡)íѝ»_:ÕdÏ‘½û¾ü°ãõ?9xðØqïüÏwÏ|ô‹ºQjäU®Œwx£½‰Þ7œ.%$†Óƒ'»G:w<Óø¼Ó™mWûÊcoì;7vNŽ¿}vüø¹Gc;ÛBµÃUéJ\ãAЧƈ{jì'òª·hŽédê¾o0¸ŠÞ@°¢¢¤„íå òEX«Ï:g½i¥­7‹°r]µb‘±DˆÀåÀ0Ú æW}cA¬éüDl:6£bDq‘®ÈL„ŠàòVpy/e—òÀ²@µÜ*Ñë£î2»˜lõ /qºŒS¥Ëè8Ì§Ù}r¹A¡‘¢K+EÊ}Òࡽ' ŠÜ P"k«ÔÕÛÉ[cÓu'ZQÎl9ƒöAýOÐwpgCgu¬K36¨ñÜþöÑîˆÒ¥Y’Jª© È4/?×'•0¢µJ¡L¦ª }z|êé=Ú[‰H&Ñ‡šOã@ªßBÂGdÕb…PáðÏF_oÑã<ú§ZUl,±÷ ¶fÚ2k!S–NiÉR3&,-î97Ùåžq“n™_‡l Â&rI§‚¿?w·¸ÙÖuT响ƒBµÑ¶Ynm»ƒF8GÅËùõWW©©gwÛähKk4Ú–ÿ¢ðѽ2†Ïd¤*rwC^ýñ--‡®îÁû‡ˆTv’™aHŸ™°sv¿²Ï£ß«ÏzP8žhQpoèL‘Ñ3ız,zTÐdñØ«A¼TÆÚ|¶iÛ¬¶½ž¯K刲¹22U¶lIqÀ•8Ð0šÍ=\† qãfs„^ÜÃåœè%a/õ3¬Ïïõ‹~ÊXÊ–Ýõ& {œóïÂa³ê¶mÕ,{6kõþ-WUEnk;ÿåTËÎmÕ‚‰aK¬NÓZ÷¸ Ø´æ¿~4y[ÓšâMÏzY«{{O7%ÔoëÀ=T=trGœÚÝÃöpûKˆ4Ër¢dKÄr<ìhÆë=NÒ<+Sòê㳉ÅÄJ‚f¾Dg¢/10$àñ×Ò„zY%ULñc­×A2ø‘©ôPz&ýMš&Ò\Ì¥?O?N¹tl¨4uךŸÁ„‚¼›<^ô \®VØ"°ö¤°"èÕ¦3pºÝI}uuØ…ÿg<°5 Ñ[ø^?{ò›¡Ó¨ÈnÚuñÙÃãå­ïžT»…Òú˜VkR¾Ÿ¥jYÕ*€;w¿œÜcó$-œKµ»©÷­/õýààÀ±ÁWv¹¤Å"¬#“ ‡Ñ/·î8°C¬eûЕ7Oí8§½%qÞ“5 TF+ðÆ¯¨_ƒöÞUÃç\ï¸HjôxÍT…ç¾Ñ¤k°1Àmˆ/¥«/ÎMaá¦Ï¯Êïu²ˆÁ­M Æêì#‚pVìÛ"½ÚpN—\n)Ó±%7aǀç×Üy‰Óm²¸MN¬¼.§ËìYÕ^×õé¦T¤ "í9i(5€ôÒÔÆt³‘¥-ÊÒmçåmEõ6KêÃW²ã»äº­$ÖRnÎ]ˆÕ5k\s¼¦y»B½oÛ?:0ð½KÏk 5Ðñ‘:?•:xíÇÚ{xö’Ù¦ Gí0É܀I¦ˆpgÕ*T729Ñ6sñQÂd;j*´ªÔ5C]¡þDT ùàš¤æÉöO¸Q¢¼êâæ–ñè²êWgä4y£½•˜¹~‰àŠ)‚+¶õV,²¸±…°HëÊt†È¡l%lõA®ÄñwˆòŸ"tì/¯]Ëkׇf¦sÇÏOS¿ÓVúÕ8âÿö5âÓüëâgŸýã«ß@dÛµ º¥*ç[5äQ 0’™äª*†¦²Þò3„±j¨¸sC’AotÔrÃLç@®_Z/ÿGvÕÇ6qžñ÷½ûΎώ}¾ÇœíØwgçË.!CŠo䋏®M!$p qXQ uÔBJÅÔdÝ© U¥1ºº°Žþ Ú†ZþضjTÕ&ЖnjUT5ªH²ç.i˜:Y¾{Þ»÷{Ÿçùýžß¯O2qæP‘Vº2¥J‹Ò©ô+“ÊåžÂx”!å¶B²!§•q|ÓÔkæX°ü8’Â7HµFsÆÔÏV†”²¤­È®:µr5i«Ü‰ËŠàRÅDwâ GÂôoYh=ιuw¢—ŠsZ/r{›ÇzSIJ%£½tŒÒª:°7‹}êf»þ ®¡òk™¼O ‡·v^Ü?ÐufËkËý%©ÆYWc*µf'ñäþÓ¯wïM¯;F^yvǁ퇦?êÝúÔìñ ¯Ôܬ…ÈOÓdýú?½cbãs“Ÿ€7$Ð>¨Áf¨AU¢ûÆÊ|0!òb^%r\I®”ÌKù¡š°‚A¾°æàÚ]œ–œA†sK줍 h„Êh΄©9ÜÉAÚÛ_ÖGá )z(,·ÈDRÎÈr¿|W¦;ä`þq"‹ª,-p=SSóÐ=  e2¸C9fêLscU#^^)ªZ‰¦ŠÑ6T©”µáŠ!ŽIZ*…Ûpi.V«š’ú¡¨Ö¼?®&xmšÒýeÓ˜÷-Šê,P0x£åâ·ét¡»-jÖ*°[žgmõêhЬ‹Ïú×Ô-]5´ùí/z¯wµýùÙ“'w×÷¬©ë%K[ŠxðBWnn®ZŠwmÚ„}7ðù‘üÁGÿ¶õÂàùŸm1§ê2„Ƚÿrôw#µ[:,—.KïK·¤Jÿ–ZöË×ådªVhˆ˜AóDÈYnjȉcø3£ªxж—†ÚÃÅ/tp]\žäF¸»Ügws!.É=.r׸Ûâ07F<ÓTWY Ý©úžßì¿QÛ°A ›2fv»;Ÿ&¯ÂDÙo¼£G—G75G_u hÃE§Ô‹XƉwãÃø?d,p²¼ÓÉV$«œ‘Yήb7°¯²o°o±¿bÏÞb?cï³N+°ìßXŠeKHÔ’ìLæ’ï&'’“É{I;Jz’Frþa¿õõÀr*ùuU¥£Ê1ÀŸâ ^Ê‹·Eâ ±Cìóâ ,æD{–#Râþ„’}^¿Íklä¾2ø®HŒ²)à4¼†oD¼(^?„½wE›[ÄâÁ³ø WNŸÐ'u2¤gtB¿Jˆƒ$xG“ƒŠùZñp`-®…»ÇQˆópa.e-;¹~ŽáƉ—MjìÎ,€A½\9c shd2 [ÌR—ÎBlE&`»³–¢Él)fЗY…6ÍI­ ½Š0ëÊfyµ/Z…Íi 8ƒŸIyк=J^ZýÖ¡ý=反÷Ö7>u®oÏšD ¾âԁŽç–>2ø“¥·þîÔÉÃëjx¼ãÇ;Ö•eBвæù†Ý­û¾Û4;úÚÑlý*=.}ÊÑ­G~¾½÷˜^fîKâ.­#uÁÓNìÉ<²Qÿ’<Ïùýv/|ô¯9·Åò¨½ß0Šû"æYT#ØœÞ R‚Î`.Ø<Ë{AÆ ¬'ˆÓÁqüW]œ‘…y]‡³¦äüˆœÙøŸgf\B¤ŒÛP „PÀÅø4• Ò6›@MS´hŸÆ‚ÿ¡¦Âó9šr꼄¢u3aºf)+½ûþ¶ÜÙÆgðººÚU³×ùÖwÚómíåJ–¼2ó£ƒGÞ;;R5dSñƒ¹št=3¾s׿ָtmœd007EÕ’ >7øµü6¾×7`?áö_ö`gÍ½b´1~>lüþÆÎ3Œõñ|ÃBÈ vÉ0 tœ®3ž3n7qF>ƒ }‘õqnÁn#¡…ãÌ æ{Ì f˜¡o3¶@µd½ûr؝rO¸I÷‘3ŠR8‡‡ð»xÓxŒè2|M¢;è¢<¨ ! <_šŸZÈÊ´Òéb]i$e@Ë Ðn` àxUzÁ¬Ò`VÍ š´™/âçà³Ä˯֘+;Žb@bÿa{µãþ?è!|lU“oö§µ³C|úQòB±¤DfnÇ­ó64Ø–U<ø”|¤"ŠM­™›²Ù!‹ø´±k±u«öc‘fÍa„·8¶èíñ=Ž=z¯#WÕ_uKp˜›²ê-Ï&Þp¾.¼©žŸM85Mw¨Vub†hÇnÁÓîEÃí!”¨hGœÓÕÎ)Ò’vÅ›;rITca¸{Ù¸ÖtMÕ{XϲŽD<>À21NU^…h,Ö#JIQIœ–IhHÂíæ8Œ‘MÅâqÝÉ$â:…TØ¡Ñl,*‘¢ÒRìwX‚eQh—_º¨amŒŒ`¸NŽRÈ@ýP&zÝFB]ˆH£q¼U~ƒ€å‚‚d‹­ª[BÉ \óîcÑøyçö_ö«=¶©ëŒŸs®}}sí›ë·¯óò#‰_7Žoℼ\ì„„@IÊDd6Fa@Âx•6¡¥À€*°²¤UÕµ*M[º1JJ‘Èj5i°²”jRáL"•XצÄì;vµÛ?Û?þîã;çÛ÷|¿ïñûhŠLö¯ Š,gIH?†õ#ÿþº‹.æh²ÝèFòtZ͘óËŒ(a|àLÊÊñ«3|nþ£“žê¹øœ§Ì›ñçc†²9xmýl)y»:ùå­êäÛz´' v‹Õ>ñþ²ÕÛА-%Ð?¹ 664h£µZr`b=ñf°•=`¼$Œ×ÅøCì"Ó"ç*Ó*çv€å8g†BÚŒm¦ÅÎE®eq «(%ŽiŒ&«¸œÎ£Ñärn÷¦g…8Hµ;%fxr;M*Y1jË–È.ìrɢބÁiÂ+ûh`“$¿?À»4F†pøŠ¨ƒ¿ ¹Õ$¬ƒhŒ9D1*¶ˆÌ‹¢Mê"½d?¹@Tˆ($FBƒÒû=RŸ4(—T¢•Z$Fz¬G6ä‡ßÐvÙöCÝe¨¹ÃÀÇ´=ÁÀH€¶4@Ý¢ŒÖÏ18ôp¡1yKt§ )=Sõ4í‘HdšJץܯ¦pŸôÌs\dW¦þhúHê’†¿›Æ;€íÀ“áΊCõMQ):štÅ…¨AQŒ=^Ÿ[g|ãuÃV¼·oÞIìÊ­¯KºÜåv½éô€ÓêhJ>Õä«+?•+^n Ê×ÛGß·šemCƒ­ózrw¡#×r:mÖWgýv»`Äñ¸Fò×ÝÂߏ04cÈÉîTÞUеX¬=°9ƒ 5bÉV2`ù€e t‹ä¢ Ì[¬Vs‘5XTôY: ÍVëF™7Ë2äx3,YFvËßÇ‚¾N»h½²YˆØ^÷~7q?“ƒJ̼–Ѹ FKÜEdý0^y2fè1Ã0ñœÀŸÐ—z—¬C%­Û4»V¥kú´UI)°(•c•‰T7r?ÏR ¸¡âb 7~‰©ðæûÇj0«IsÜ)¾K1 ýC ÁbüÛ@ÌbõYKu;ÞÙíM^¼xÉã•O™Jåp}gÎ’äk¦ª H͎\A˜ø¾TªúÙúzí’»Ÿ|8¿yA$X]š¯5‰IY}‚|íój`‹Ë¡—Øv7¢¿Ä5@mÉ.r„06¦‚idÚ™-Ìó{P<ÂÓ]&3—u‚†ÉÐTïZp_âZ¡5è…Æ`œï1ö‰‘RÑ&:a fµŒj ׿34k¸>ŒkŒ}‡ ¬'T¶«˜Ñcå­>æÖóN^ác|+ˆgßÉwñ½ü~þ*›×´‚BxÚšÒ- ¤±;cU@)ªÒ|s"REOýXŽT¥{†Z»;Ý`nì¢ÔŠq•W€Ü–?@nLǎ›³¬wo‘y_5ϯ”š˜c‘»Ÿn;š<ÐÀäÊ+¶Òn÷…äff­zÍB°5Ö{xÎÑdnöÜœy¹Ì¢¼öh[l§´»z :;ºàFäF”·E±ˆßŒä®«‚1 U-A´¾©®|Ó‹Õ¨¹,nWê3kܳ»2÷gÊ|;s$S€U“ÌWŒWàèQ†”3ÊyE%*- Q^)ëêÈP.è¨ÆÝ±ŒºCäBH‡ŽDõl<»Ãq¦k›qsGÝ0¿íÀŽPbR d•;`8©wN\랺©'§ŠBú %RÉ$‘bh9UÕ…›Ä¨l*{®òÔ´!‰±¶¡êÂÊ6,ËplßN[´X¸pª;{๶O×.Æ0]1õìAçõ¤BX=±˜qJ³ÚfbúÀK~õü©×·½< YÖãhCÞ#>Äව}ý¶´% ¤]§Úûõ&’·2½žÓM®Ç©õÏN[?6¹ž“þq“®'(Μ`ˆúsdB^Ô+TÖJòÅìñR‡û¸AŽpýfĘ-ÒVOÈ‚-½ÎQÏ0n¹u«¶C6½ºÑãRˆºA㣺”+FÆxÊGkÊÄ­n=Ðý“ ”;‰åá©–ÃF)_¸b:*…ß0‡+/é‹¢³ŠbËI¿kEÂÆÛÅ`´^®]¦þ<и/ìÆl­R_Û~ñÈÃC?3DΩ¯#3ò£1W^géA¸ ³~®»¤g€3Ø}!+¶öúFÝt‡e&ءʔڡiTZ„õBŸpEPGA] ƒ CÂáÞé‚yü¹ÇÌS± óU«T/©^RÔKXÄÞÖ<Ë-ÍÀ|˜ÿ£Ö¤]7)ãÚq]¿P%Œf.CâŸôÃF0ØMÓzs¶ùKeÄ2b°í–éU{eV9ÈxÖxv)ÈS Û³·çDrþš»9Ï—÷KG½Óé¼àR\gÝÝó?-x±`¼ð´g›Wöù|?ñü®Ê׋ކÿÛR¬üdNqgñG¡¡ƒ¡Ëå±<–ÿA´ŽbšB¡Š2TÃYp²è?~ ·B.iuõd2[¬6ɞ•“›Ü¨ ÐãõùÐ\‡”’Ò0‚†¯²ªEÐLôOÚ«8ªêÿçÜ{7$!`H‚œåÉnBx»›'¼€]šM²!‘•M7KZ`¦b¡dfA^U‹Ø e˜|ÁЩL[éX§‚C+ÅV+ÈTÔéÔ²·ß½ÙÐÄb­uzÏÜs¿óŸÿüçÿÞ[@óÈé*,*.)-›_¾`aEeUuÍ¢ÅKܞ¥Ë–¯¸÷†ÏŸ>yŠŽŸøuó×kú?^2u¡Ï"‹~pͤ9TAKÈCËh=Dëh=A?¦C"E#tk¦qdÃçšKUwy½´“~DOwˆHº®¿÷U2ÉJú;Ý{»Ö½;¡ÿþŠÇ.½k%Šb‰R1bQëR¡u¶‹â*§æçÃ@Œ",%ŠMàÉQÌiŸÅèQ,oˆb°Å1´‡w׬mñ5zë}â°¨iò‰òÀê@$á[Ao¨9°Z´øës„Óò~ “Ȇ8Qð¯1h­¢d5VæåçO°ç特~¿¨j^ÙjU¾V_°ÍאSV\X\îÌvøV‡Ö×V×7þº@`Õ7¥G â_ÑÜ*¼"è[ÙÜò} "ô6øñW‰@ã¶•jh-µ‘õx :Œ»†šL\NZ;åøSPØè½ 7›?Öç9Mº÷[J”k®î宯¬ŸÖÜåk­Ïž=ó(mÙÑça<¼~<«À½„Lþ*HjŤ6ô XYFÅTˆ»ZgC#$†°KûVCvö2ö­3Ÿ«L +1ï‡ÆÁo¼úÿÍߟCÜ“GÀ#†/ŒøMkŒqÈôŠálÄ££GL+5äÇ·É &f;H!Rö(“pªÛ{ž|05òd™s|"+ŠÂ%´ö¾e¤|á‚…¨Õâ®Üˆ|‡¥Ä¼Ç^D{ß¹lÌ*oQŠrF*›°ÃaÊ Ò¯÷Þ‘GõO0gÅ󶄍„¿ü¸Úõ¯¸zYõò©÷.u}øº¾²–ÑG¸7à~v 2¿Ê܁*þ}Úϲè68\Ð$ýy*¢iðã_€=b:ì*BtÑ«LE~N'P[/ê/ ª%R’©FÈ|–žƒÇËh;½DoÊñ¨ÀÃPÃÇQ%m¡³ô +cíÒDªÒÖÒ›ô· ŽÆ#·Ê‘›¨ƒ¯à;qê¦a¯UȉCÔIŸ²$vS®ÐÇêÛõ]úýϐXDée:‡öK´[Lavö®$¤6=¤ïÓ_„ƹ4.×YzþkþÁ&³£ìuv‹§ò™¼KZ¨,×;ñ^ËÆ~ªEÆ´â\®§Çh#m¥mtÒÏÓ &A‡d6‚gÙ$ÖÄZØ“ó>Á³x._&åHÒi銺™U¬‘5³­l?;ÆN²¿òÉ|>ÿ€ß–Ò¤MÒ.é¨\¢xï\Žì‰ü6rKOÖéÏë4ßm 4Õf¤—š­>©€µa§fxç»ô=ر™Â´›žÁésˆõ: ‹^¥_Ñoè}úþHbCÙýl ›Ææ°Ål3³§¡ÉyøèCö1—ø`>ŒFKËx%ðm|?È5‘²¤ éŒÔ-}.ß'§ÊBž(/“7ÊOÉÇäKÊRe•²QÙ­ì·ŒŠññë;9‘øHcähä¬ÈÐgë‹õuúãúUxËx#KxSZh¬J3¿l¨¢98sd†Ñ®B«¦E´Ü¬&~óä±2l\O?€•[à×ø y’öÑ~Xz9z„NÑDÿÄð5ú]A¼‹vþDÒ-úé¤#¶1,ž%ÀIðÄh6¾˜Éf³l[Ν¢µ£me{ØOàŸƒ¬ƒbà¥Kì û€é\æCx:ŸÊgñyÜÉ«Ñܼ…·óüÞÁ_â¿à—ùÛü*ÿH’¥LiŠÔ(=!@;‚¦Iç¥Ï¥;2ÉqòTù1ù¦QH±*s•xñ¼rAyCù½rͲÈòŠåï1ž©¤Á–#ý·4Jj£³“Oz™u…°YÌÊDz۴M¾$¿Íså¡T*ÏdÉÒJ¶žy gö*KP¼|8ËÅ >+5*-£(;ÆO*ÎÎ^ 4vQÎ`›Ø³r_ÊÛø,©‘fJår~YΓ® H•±ùÒNÈ´qdVäöhDBµääÏÈŸ>mò¤‰yrsì¶ì¬ñãÆŽÉ­Ž²Š‘÷ÈHOžzß°¡)C’“Jˆ‹8 Æ¢Ègds©…µBS«ÉcÔâb»1V½ xûj5|sh…ýy4Qk²‰þœàlügAgÁ]N–( ì6áR…vÑ©Š.¶´Ò ü¸Sõí¦‰ËM,1 X­X!\©MN¡±ZáÒ ÛšÂ®Z'äuÆÅ:T‡/Ön£ÎØ8À8 ­Pméd…³™ x¡kF'§ ÐJ+U.­Du*hR¦ËÛ UTº]Ît«Õc·iÌQ¯Öi¤ÎÓg›,ä0·Ñ,-ÆÜF4æÐÑi;ÞÚ•HuµÙñ jƒw¹[“¼c¤l­HujEë®§Úm]¬£Æ­ tt1ªqŸ¡R}CgɧÓcì–ìp·÷eO—®ÔfaÃáv¡í«t÷µ½Ç¡v[Y•Û ­U×Va˜Qå6-€P–š% šafÁ>ÕePjÚ@užÚ~¸ÁJkTµÖz<­´àŒÞM¥.®q«VmNºêñ:3:S(\µöDI(é?c·u&&õxºsÐà(ˆOè|wçLd²Z÷ºš©%HMÔhâV5ž9Ýè|Ó)\?l¸ÐaÒd3þøŸóž÷}Ïó>ïó<﹕ü$á>™ÍG8÷X?„¦uyfMüŸZZ[Ü%<þ%_³Ÿ#}JC'eef2\=ksò­¼YÑäžuØš2¤b2Y–*KF“›{Ó‰-ù¡`~òdyy²®4ê.©7=ðV^—¹g]­§vÚÞ蚺¼ZÊ×ÙWbž„«ò5ùå«kªC¥É¨³qNËB뎜_}₏¯Êç#Åÿ <U/ºð¤ÁÚýYß’ûÇÿ½Ç{×{·Þ‰_ŒPmô~)QÆ*œ[?òޝüûSlS&±Èa}(M§¸¼3}IÞIûÔ#ô-µ‰P?)&¡/>/·È©ý›pÿCh'Eÿ×ÀUI°´€oƒVð]P¾‡Á{˜£Œça•öÒjåe*gÒŸã{s3xõ·Ú¬¬¥m¸®…-QéyZ‰9tܯA»©í¥°ïÜÇq†î˜ùJ5á¾Ï¾†9ïj)_9D3•Céqy”^‚ÝwðÞÐè1™Òã¸~ÓYCö,‘߇ýDUh/WÒ«7Gl¢¹â¦ô€|Š q=O›Žþ£´ýJÑ ÆÆ0v¾ÔC;àÇB<[ˆ±¹°kÔs¤‹´sn—/â‹äixÿ‹öº­µ¿Íkv×Äö;6=‚e#ì{Ë>›gÁ´ Û&Ãv=Q‘Tˆ}݉}Ù™Å}“|QØÛbX×RìM>ƒÈ››Ï‚¯Ê[éIÜρ/+=XßVò€'øzš|€š¥q2ñlŽúžÕ©81vŒtñ›äWñ¬n¢:¶kÙˆØëµâa+½; ¡OÉ×(WªM§Á-¼ë¬¸¿A_±жqQ›Ç=ØCø¼ø¯/Ì‘xÿæðÞkïÇÜ™âÄïúŠåŸQÄ!Ñ|ÄäqŒ)åñ˜÷g?š(Öƒø{k˜—‰Üýr±öá-2˜BàǨÁ;`1b5ýŸâ¸åØáå8áÁ¼!Ø·ÔŠ]^ÇZš=ÉqrçuŒÿ˜ ÂðÅÏ>ró†c—muçæãØqՎsŽQà|àõr|¹jåáÚÎv°8Î\Õz£4—s‘óUšf«xæq³]Uþ’¾Á~â=ç<å\™P×>ä-玫V F]ð£ÊlŠª%ð=SX:=|¾!ÿú"Í”£óØûCx6ÖÀJÏ’ž_ê'È×ÍV\WÀ¦ý“ô}F» lSNӀåï´Oü#m`pÝ ]Ÿ=ðÙûv²¿\u÷åEã:ã*ï›Ø”îqôº£·m¥¹\¹q=äš$ÿæÁ^Lø¾sƒ:~Äÿ“ü>Ùß“•k)×37Å앳~« §¹&ð;àÄUúoüœë¾º gÒZœøàVkAèFM¸“þ­ýò°÷¦s¼Çì¶ÙÉ·5ÜÏ­ûÊ=+>ã܇ë?÷çu°mê9ø5ß³ùXD«¬`›w .NÑ&ùSZ.ÞAMþ1…6™kùJz̪Gx.5¡ }°®õV?öïÔk§¦KoÚµTQ‘‹Ò¶îŸÄØ>ÄÏy÷HUwÐB%_¸ïâúûÝfÕúZ*æ5+?§Fk/œÚÂ{ë9CO{nRT[€³,}Æìذ|uŠÕö—ZÍu‘š=£E´N@ƒ1ðÓÓ–¿?º¾R~‡³†}ÅsÞ£jö•z}ž!ѹ=gq}˜Š=Ï£ÿЃz{z‡fYgP~áL“Ž`]ïP¦×qÜŸ¢¥°É°8n"&ÑG‘qÍk¿ÅYÉù!]ÃyR3ÑÎçã?Á^ÄÄ8Œï8?0¯t>Gü:çÞ4+ŽaüôC«?×MB¾TST¼J†Ã“ՍiÕ®e8WFÀ¿<‘Kç¨óþü 3hÛo×q†|N”£éëÊQñ ÷úaŒ0`?ce~ö¿¶ÿ?ˆ#ÊQĎ×7þºÔn¹Êµ$Àl ßg´J ªDã ®˜Ôžàög&Ú+‘ÿÍ ”¾zƒ?9Å6ºC‹i)$RòiÞ]“N“„§}é¿e”“” ‰I3K©Ù5¨GFÚG.Hûvõzè—úH[‰®ÿVàWFø¯PÞ½{Pï²QY¬‡–e‰_'$@ Ü B™BŸ9UüqÍ ÕŸ ê×™fíÖo6CLŸÞÜ0¨ŸŽ,Ö#m|Ÿ¡ëÍõâúH>^Pý«¶A½Ô-Ë®P¤Àm×ào„€L ÌLô߯cbÅ:-+WPˆ€(H€`Üv®Dœ+°DC¸„¹.Q€ap¨­QP cR¯ÛÂ%3q46¨Sg°3ÔitšáN•*ƒ•¡J£Ò¬WªÔl µ­fk¸U¥X0Š13Ž©T¬ UUf•9® ÇÃcÞИ1fŽIF–0³ÌÀpÖp@5êÍzÑh0ÄD}ª^L4¤Ä۝‚÷ʈP4°{x·˜hKµ‰F›Ù&&"‰Ó©H괬˺R (².ê’¨“.ˆº KAo0P H!o(P"”H†×T’é5!"…½á@\j”Z¤œ¸õFB·.Ð"$¼‰@»ò¦™'„oG _èòv†„¯ùÑ@à²0ìdêZÐW …|%šá«ÐL_DûâZÔרÕùZ´„¯]KùNh¾~­Ë7¤ ø.kþ܀РÔMv/JÔ-¢F4O@(!9¤”È%J\Ž+r£Ò.·+™ºô(!‰bø+ÓQÂþ¸õ7*uþ%áoWRþJ‡¿_éò)þËʰ?—²CÙfv"[¦²2dÄ”Ç<æ¡^áJ÷ó l9oËl9gËïmùØ– ¶ÔØRmK•-•¶¬¶¥Â–§lɳ%×–óUè8ø;øÜ7Àuð)8 úÁ)p´wA3hß  l[AlëAµõž¿Ú¯;kË -Ÿ˜9Ð[à<øåó’@Åñ™íǼÌJ-dk­Ôí¶xéb„m Á\,%Ü Ñºtˆf—êâMĘKõ„Ç© ¶NýSu­7)^ªoÞÌçËo~½ôÛ­åøX|L†´V(0ÙeïêžÉ&Ï™•Èo´ëód0õ…ÿ1Z<Ñ›,U¸ÞÆA/>ãL¹ne<7;[ûÉ5c6­·aB»dÜñTÔvÕº–rë¹u-a‘ÓÒ$⩾d6W3Öíö¥â8 ~€&„ Â~MÔ|DhšŽ/_`†½f°úãŽ Ê(«4z¡]Wi{SCã´²öæ·÷cy endstream endobj 1241 0 obj <</Filter/FlateDecode/Length 20704/Length1 30028>>stream H‰\VpÇþwï%Ù–îtºÓËFÒY–±-Æ’%˲Œ@ÇÓ&‚ؐ‘§ #lcccG<¯ÌZ¤JßUZÎx½Jñ4g#<åaì¬~îµÖhÈ &UÖëÃM<ÿ´³é¹ðŽðÁ0£pÿþ‚šv×¢ÚZgßY®ºˆê`‰0‘ÍFý©ln0•5‰Q¿ö’6j²FŨ–LVÈÆ³d8¥åEFÉ]@©AH!'²Z¬ ‘†p}¥EÙSÎr,gDœ%ŒXÈS>õ”W†ëg£H¡ -²Ä2d™+K”É’6¹S½¶%ՎÐöÄŒ¶ör3¦«]óg8“êšDçÊ—÷…V¼;øÚÐÕ~ñq÷è=ÇÚ+/ž:š¿‚Z;š“_ÿþžSÃ[·/ÛH¥ÒÙçšmZPï›ÙÜ\P†;_˜;t­æèΝ;ïÿ°wlÿ’ÍKw]üQÿŠ·«&×|ïÀ²|¶åê‹»2m[…0Ëçoâoƒ ªO#ÈàyªPò[L„ †?©?/ “Ù'(l²ã óôÓI~ OÒ«u Íò»V,¬$ŽäoDÃs‚^™Ò­llI.è#»ì@»±ŠDжÚ}SDl—Ðq '´ÏF£àåˆ€Ì §¼‰¾ëË÷bça²¶oê!ê‚{Pòy8ÁS'õÑ6(!k ž«D _PÀ¼á“`KK0ÔÜ|¯%TßÒRj!’~•ÔÅ^f7È`ƒßªq̰,¢ Êl³ˆØJ1Èf¥Ì£È lɨ±l»h‘DÑb±ZD먒,ƒEÊ:JKüZk@UÀ %ä,ƒ- sÈV 9$ÉNQÑ^eD«h/j‘(:ìt)Ÿóùb>a™˜ä™ ‚#r‹ûb Œ“ÜÉȦ֧Û&üj±Öæcȃ „,ƞ´<ÏÅbœÛC)B!ÎÃQYf"N‰ÌFq¤DôH¡CÉüÄÛÖÑ0ðÏ7çþ*¯~ÖXŸ{ߍÿœÛ‡ÞavOÎKþš7*ÞD‚j^îÅ›r‰™¡YSé<³—à´ò°á „;ÀŠ6©¼¡Ì@›¥4MÑ%"ë›™áiÚaÍ ©%n²Ùìú4ÏÛZÂ…òÉšB~RWÂ_ 'ùÅIÕfÿÂcíã-!…csZÑòÌ"RH1yÐGþ:¼ÓðÇ)Ø_Æ«á@ôÈ Ô–e`Ë¢eÌ^ˬGùÍùƒ£«Î®_*ÐvôBïUÀSLj«íg®øPíor»\¢Ž×'ugiÒÁa6ÉÙE[Òþm 7¸wI<ï§3)ºá.§ÈcÚäpâNª‚Év‡Ý®Óq:¤Y#¦<‚‹&7åtñ~åÏ{:\È•Á{κýN伈íP.L¤ö\ÊFXN jOˆŽ äÒЉ94¶Md˜]àù+Â}ÿÃø×[B|Œð¯Agv¢ã¡ V‡”òu h ®,=Ë-h J¹ŸJáö0UûìeÏœEurîRÛPŸÎ¿„n3×þói} ‘¨¨ä%ä»‰Ì öéÔ‘Ü1 ¦¾ ˆ^!ˆ–B4Â1µM.«®©©$SR¹4 ºpUMM»$K’$ëtÕeu=‚·¦•õ4VW€­’%!œ..VÒŒd•¢EFe:Je>d0“Á÷΍IH:ÆS¹Ô V"±šláaŒhFC*W°ãB02ŒH Ùþ¨%À(A‹fœÖr¬¢AšW{<Ĉ ¦¥96EÀ¬– ¢(ï~ç­åwîž?s0“ÿ|òŽex‘E¹Êø^Ԑ_w¢ã™èé°|ä%O›uë½ Ëïd®µê9œQ¼†Ïo8h¦wÛl¥ö܏»Ï¬ß8«¦¼5w3÷Ëb}™Aܱæäà^âc—ÉÙWÄü ÊaŸªÊÕr\aõ9—C/tZ¿¬Åœâ6p?àhí§19•—\ÀXßç¦dâ9÷U½©Ï®i‘‰~*NµRu ÿ‰(SBçdYÅgðƒcºL“¡‡œs¹A“€KŠÑ¤™w.ÏGý¶lª.B)rœEB”§rz-©@Zƒ„œK+9Ñ<Êÿû£;w?½zÝþþºWQÑãèV6AêóKò降¨É5VÃ^ÖËa¡ˆ/N`IB…×ÛΤ…šd‘’\¤ã}U‚À[y_Ñ´´ŸÕ0ÁT½‹Gc¤ðþËwÙÇ6qŸqü~¿ó{âÜËïâ;ŸØÎŸÄv o]^½6r)/5´+b(… i‡`#¼„Œ¶cllë£Bl-Ó²vÝÖ‰­R‡V­“д26†VmHeCe#µ³çΉ «‚eìŸdK¿çû|žï÷’ëÏçn•+ô4ŠÉSÅÿÏM«7r(—°Ã¦Xà#P0SêdU-ç‘„fz·ð£sù2¡çÑ5ãtחБW_Ëtí_ýÛÝM|á=GmÌ~¹ðëÂÍ7ßûÃW³ m¶çËÊ¡{W6_ÿÉÇo¬[X5oüp%'C€3gå(ƒ¤¨ ]Ûìèc÷:†¶¸WÊU-j¨T¡x«;ùaócøªN¶‘A‚ AZ:g5QK{hè¨wãµã1ô¼Îêh #ZGðjÒFÒìMãý¹;ÓjmšXîFêmŽ5sÖߺ‘cá=Cý­§åZ¦ÐwZ)Vß„Ñ#3uP$sjº•DZbû¹±Àyâå»ñº²£G¿r6¹äâ¢ÊõËÏ~óä÷Iþ fMG3Œ1g´ã((_ûʱ°–ÿxïÉüꞖuòoº<²—Ïfë³õJb@=¾DАF“ÔõÊ6OW·Ûg%G½£1›‰%® Žá_d³pi_MdPVpJѬ($‰ôŸ@ˆO© TAÙ2Ô6P%„u !ç–:âŠ1[jݾH˜ÆdŠâ7ºiD›—0&) D$)OŠlµ½Dì éµ×ËŸÓLœS€ói)¢)iaÍ[&h':©)¶[­ÀÑâÀ3P˜zìCœöçàÉÞ1ß&Tnr`¥†šäB]̶N¥ÆI+u¦=Ã0p™IÖ¾cEדóíœ;[¸¾:ûΫkŽmãÚ<(Q¿ÇÕ®9K…cs˶ýåÅÛ*)täw›ÏÛÛ˜¿sQ0*>úû»WþØñâç>¨fäÈ¢EŸÏÿíÜ39Ô…œ·Ñ{-=(ʹøhC‚~ÐÝ슪ªÛY[ç@l ÎÇ\H ¡d&e$©æ6ƒbÝŒÁV‹UFuc]ƒÑèt4GUŸ(öªn~ꨫëÍ4™L³ËiDkk«9–E@a²±1ªveÔö˜[mf;ÕµêVu@=®ŽªÔ ÕŨ!µSíV¯©vuŸÔË3ª˜ÕL»'3ÒÎ~€ìþ\¢Ã2ª·©¢±ŸEÏšÂà¾e™JµÎèí3z¾•÷€ËÝœ–wEÈÔöá,M¬/$BOû^Âg7Þîx¤•9ˆ‡Ùf-|ŠàÝޞööŠÂ{zÁB.Š,îì¬ÉïzÅÞ¼`#—?!¤¶4۝ž»Ê~9›h)T¢»L…ÎfMãC<5Û¡º-ÓÆüg‹R*ÂjümfCf¶·ð¾-ùÈ—¹|/éÛY‰2¶xæ¤yÉÌø)NG²ÙÇm'¼åj¸KãÄŸìàôàY£ºêA7ípJ¬½Š*(Š*˝¾nßZßVŸÍ7†›ß³ˆ£Y] oñ¸á†J"¦²Š¨$<J·²VÙª(£ŠƒU:aŽ\Â)‚ÿLU!Šò¢íTÂ\OÍÞb§]=oæ#+ÿÌäm*âjZwÍý½¶ÑâÖé›6Ki;ð.]Qy{nÿá¿^¼|äé…+¶Ä3aFTFv8¯!d«o‚Š<þéž­ßuáØÐ«Ë:ZUó³f¯Øsú›ôÏ 3›JO|~6ÕiA~ý%§5A¬QHRQDy…¨v«bVÈHá éF£jj™l%äñz5aÔ×Dj”H/„ÉJ3º9…ŠÃ®»ªö¦›„tº þ¶R N‡«©¨0An¨¯—e¿«tÞ–n5±i1íL§Ï¤éôOñU ֏R¡bŸFk1[¨º&Qµ˜u=´Ñfxru¸ö½ãt±Ó]–Õå&uA%d¡9ÝÈ7-½#ç–WêÖ,~–{fp·eN[;‡—s¹gWxô¤:ÐÃå×c^†-ÜýhÍËÚI&¿¬zªé8Õº¤ËæàX²FId³ ‹›ò±l6}œºTØâöøM'ÌÚNÃ'‹Ù$dýfk{ú®õ0}Ì˽’ù"ƒ%‹_"¡¤jƒ2Ñ%A¥rƒÃÏénBx7k:/x¦®R\ŠÃ:×Çmã¹aîçะŠI¬(ŠFDâH/é #ׁL„¹õ°1Ùð¹I‡Üš¡¨ßømnï¼9Lá}G¬ñßBx‡~büH™¾Á‡šìÉGël]Ëøq‘ †~ùÏ‚#»Ü¶ŸðA“zx¹V™9 ½ wćx>^ÀY¨òiJÀ´-ÜËÃ_ïÄÂ/áSá°3îF)›Ûn؈‹jµFÔÊt¼‡3xµJ1Ô±‰úÈa„ˆ‡‘€1r{<½’_$?í—å>LÃ!¬ªê›L€A?µÑ´Ùò`‰€,»h¿‡n’ªâA°cMJÇüR\c%Q%u^,á8nÁYÈuñkØ…1#…¤­Òqé‚tIšœ!©SÂÒ¾®s”6  i§µ ÍÎhÈŒ|wús0„ü#Šv—`'½™í}Š>C’ÍÈÚwßü¦fÞmx‚Q¶Z"çúûQ„LzZ0t#…6ªQ¦¸öNé¾ ý{+¾Œ~Ã-ÐÛ=…_Ѿ`{?ŸßÉ­ïhõ¢®OÏÎ>Rø‡¯ÞX*€w­ûšˆ$ÜØÑo¿<þuÛ–lmtüi·Û_thiÛ[÷ÎØûÆï-‹&­Z¶÷Úd·[A‡ðTþGx¹À6uqüœsïuüŠ}®}ý¸Iì{mã\;?‚'äáH²„ÀBŽ€5#”%& a!`Œ@„¶AXµv¥-u R ÖmZVMÛªö(]µJQa6vv®“t 1Í’}ϵmé;ÿïÿýþåD!>xV¾‘@´ŽZXtͰh ýyî6„b,QE™-dÖ‘$t}À3˜fb‘‹ËöãR¸vÂnÜwbÝqê¸ÑP‹+Y6ãßAUVbt&»ÉOALéú¸.O$Ô \¾8ÐRš¸6×”ÏE,Èó±¬ "ÔŠY# ³Ä-ãæ(²4±Ø]œ(º›§ÓjM!’ ¥öQÈ@˜XèÂFý> »DŒm¢MôkcxϐÿÅ-á$ú›ì"C¢,ÒÊB)‘ܵ‹#â¸8)ªÄ Tü$¡m雟eó RD´Bxõ1hʈG=ï¾Ì¼ ~Z¨èáÿ(ç€òÕYÃíëkkkÛú2²‚.ø_`"2òd"†uNJs‘å|¾‚¨O³V>UÀ"ÆôZqúâ’Ô¥´É窩q›R¿5÷¯Í‡:ÊZN‚ìƒcÔ³<¿dis³æÜƒ…ôý‡‹‹½µ¹Ùÿ.uC£öp$ó!ð*ÉÕ$cdØ(×–²‹ø:¦Y¿¯µ¯å×3½úAþ¯SÃÇÙ—,cö1^eHÊšÈÒä´SÃÔuž¢ÕNãM%)Ç;æqí¤i•\à$EžNõÍ:çt¦i`‰sA†ÚMln•f`AÔÄFòiÝ]Xýezýõ/ÒWîÁÙ65¹ëüØY˜Ý±õ-f:LߟI×§g`¤Â+©†Þôíôê?øÅGw¡ê/ÐLŠL‹ ¢~ƒr>¯‹ŠôœÝç/āYoŠ›E¾H¯Ÿs5ÝyMܝ„›d›(šý$œrfµ½ØÇ³²kó˜$úÓOí£Åø^jú1îQ‚å½ÔÍùa@Rçd0ËÇ ù•8¡Â.·ôD&%ˆ*ËŒ™,G‹þðÉö#Ó?i9}.Žì4¥öš–}‹ƒUTq¬Z»—}Ö»óÄ¥Õ‹´ÌÕÖ76OöêÓTvvž¨°îh¶Á)¤º³{½}›ËG€¼‘PÕ“sv‚Xnʍ•ÎJ1"5Ûês[«¤n[§4$ÇÄQ){XxS˜( `AB‚,0žNßsÂß~á°ï–e`…¢ÚE‰p¸ÖNÂ2f½ žRQ½„¦V“ ’¨å­Ú«aÈÐ}[¥ÊsU'!€Þ„h–¢p@¯·¸Úó†óFòÎçÑyŠtüã–I²(Ò©ËHGI‘Aò$Q2X‘‰ŽÓ³¯€`ç4K&€©"6›%ƒä–l‡€bÌm^b½%Q›’ qF•ëTJ$·0#@¦Ì”)6@J·Í2©f͝€âåÄÆéUêªÐ7ü¢sÿæîͺðÚ‚Ó3`ä<öÇÁª»é/·œ¿ðÒ›éëç\þ¬×Ž<µýéKgkÇÞUååÅÍŸ~O½ïÛ»Ÿ¯^f0¾-¯¯=HO¤ïßMG´ðŸ_¹’¾—º{cÃöò Ïî³K<|&–è~æz“…ô%š¹ÍÜ Ž‚:ð¶»Ëëê<Ŏq/œ œ ª8Œ[\ P„ɊΉ§x!m"B9Ä$\.[Á›ÈÑ0ùØšíp9EQ@i+Ù`¤:HÇèz­"çøñŠŠf'aDÖÃB8HòEØ*¸”T!/¡‰'úÈMÈ:bE²’@xS6*}¾Bh†f…… A¾×צø6¾Ó–é-òº0Hr^EFìd¥vUíÓ±ÔN媼G>œ÷ÃYDdÜõÁ2‚¿žˆ€™ÞRaSÜPE=HYóB””¼‘/åKÒ¦`a ý³üƺD}®tqב‹áu‡®Ä:»ö§ÿ}¦ÿêÆíµ‰†öߍ_V¾ú«}M0÷——™¥¹‹Óðxë®#¯l«^W[ÒèŠü°ÿ;¿ß¿lM2¿ÿÑÐÄ®ê~glùºPMNùÇ$ʤǼ`J^:ì‚9OfDf<èÈpàÉ=Ÿ£&½-ÞuÞ—½´×kÎŒ>ß—ƒyŸ¯e*aD ¢j!0«Bä$dó0¦dˆ ”$Œ^èM"·ì˜pXAøv~„ç§ø[Æåi~} ò•ÂWûÚîd*®\SÁÇÆŽrU8Uõä’!Sè¢<_õÐ#æl¶Ë”·UY8D°·Ù±u¨1bL_£e/p)É|¸ªRËT¡è3?Xìi`®¦þz¨ußoôÁV­ÎIŒ¿€Þc1;<í›cS$AÏÌ'Yµ¤ŽAðs¹aw”;ÃQ~6“ÌxgNœþ`ØY[Ü®R«[%?'I~§(ƍ,g4²¼Ý®Pž>áÑHƐÏ/±FlL¢¿Ë-qÒJiƒ4"K“RÖ JRñ²6¤‘lFÙ­£ÿAüOøÂ«>¶‰óß{>Ÿïµ“÷ΟgÇqΜ?Î>“HRaÉ¥ ![4„ÆÄë’ð‘º%i-í†U%”¶¸i  )]ª¦ÐÂÆ`dhÙÆTuÚnL£«¨Úôª1*¶eÄÉÞ;;&m“ÿðÝ«ûç}>~¿çqb¬&ïô€\Qÿ9þ×ÈšC.çµ­nd7¸+ás”aùÐêÈý–]þjøgë©ñó;^V´Gq¤¶›¿³¸Îu¼òØÍãÙ[þó:h/ntáÓ—ššGº)(2Y!>¸6%#ÕßÍ®zÿ«?žëßC¾ÃZù"µóþvö3úFµ˜ø@ ï†Ãöa‡®™oç{àn†:_q€Á[ìÖ˜…pdz‘Ýwv@‰BÞáuò|dl2v‡#øÉè´!£ç-f³Š8ï€NÞÁPcIÂìö úal„­°¦`ŽCÏ’û‹›Œ›+åql{­ZÍW*}Ù|ƒRþ{…Ò¦Aܪ¡‹Ç¾Üzue >!âšVTÃ1RYØÐ,³àoÜsÍÓ—×_ajî/ÅèCbÍtX7±²º|Q4Ê=ukRßP%c¬þ9û³cU.)©.¦‹ï$‚]RW¸K2naka-ªe ¨“5¥@ŠLƒ4IU·Ê‚‡dêy¸;8ÖQ¼¯`ªBT‚¿„Ei4tÆÀ‘s8:y‡9Æyb^"Ù.GÊb„à,‰ õh"d2³žâ¥ ÿ+½Œö0±`ÀðØs:ÚŒ’Íh” ML,²…Ã!ÕrÄ&3PŽ0|Ú02ÚÌy÷V¥L‡%)#åtXÞø;#9‚0àtVðÀ(Ŭä’ÂÒ2)*=*í”~"},Á*©Q"G°y2äžSøJŒú¡‹9Ù+WÈŠ¼ZNÈòGå7dR>Köå8zůãуwΕæmÞǵ|EÔßÕŒ´Ÿ6øqÊIÂR¸Ó”˜¹“çnJjUñy‰0¹[$Ú[D«JÌE5ÅÅUÅÌiƬ (å£Jè^iÒd$Í‚æºEÁ‡ÁYÊZôàz3Ùfydé}`¸d®^$#pÕIKÂÙÁñì'úÒ5XYÒ‚é:ݺ½.1 yÑô}º‘‚_ÆíiAùšÛ&jùí‹ú¥u O;oÖš¬ÊÈ+l)Û¨M§™‘³bi”ˆB¬„ðK1‚5¢ë±Ç<6"äÇiM5¤O„ŒÕfKä,i³ÛÛDŸM}~«jN"å>Ÿ'Ïw‰‡ñ1Ðf´ÑV(e·’Ö° ù8NlW‹ qHL‹ãâñc¢"’¢˜!¿:‚"/†ŒÚÒä¾ÐFc>ØUþ‡‡]ê2QÙ›óÌœ¥-ÿ¯ÝÞepp¿¥œ»ïÍy˜F<6-dji\l¸¾¿ä-'xÏúxëÿ<éðÔ½L rqå„)¤€á_‡BQ(y‹\²CY[ŒëM ,’’:{²¸XgB,§+ÊBˆ#‡P%4 ]n&„·…‹Â„I&qƒÚ†³Õ8®UŸG­4îW” dÈ¿*…Ðß»48A:Àé2Ê4ò°ûû®G¿Áö÷Åç8Ôèãpç‰Ôã5‡ýÉeÕØugՎN5´aZñûEÍL ÞÈw!®:¾ÜÙqù\®iR;ѪùÁòWÞÿákÓ;/-ûò\IðÛ ËÆ&ª›6µ¼ötÏÆÖ—öŽulüÓ‘ƒÀw¤/~Ò’¥¡¸$Ü2\4“Y£èÈ]3—Ǟٹ´ïNÔˆZQÚ††ÐKhD¿F¿GŸ£oª@øp^@4‡¿@)”Fz„0g‚ñ(8g¥›9""ƒÿÊ=h•‰Ó†JÆd>üêçc†6Ír™›C§o·‘T.B䲨 îÁý¿}ý™7Ïü#=rÔ Ý·6XÀPtå†u<²vl¨C%»âð¹ÇgÞ;öæ×¬Ñ no4ûêòèLf´/™ ‡¶÷« bÕì—ºì Ñs¦> q¬Ï×+e6Sî¤É &)h6ç[*p5øæ$RQ3½Šaµ!aØf8aÐs`8KN~nª?~=ï¿®VÁíâM€ê üœÀüÚ=éù²ç›“ykqâWÉô»¯bx[êþErmsðª¶Ÿ}ï‰GG¦‚©äGGÆ@d⩎•-5¡FGÏ—ÍLŽïÆêYÕs«ÇOT_+‹[¥^ç ¿Ë·Ëÿ‚q˜"ßÓ¢NOÖðonP]\Áây½ÎÃÚ¿Ç~r>Ûäì\üã³óâKœøÎÄõ¼584`Jš’P©»¤¥]´&Óè(PH‰¶¬TÚNM!ê²¶¨hŠ6U+ÛPµQm­T&µšÒÑvЪK̞;Û!LZ"]ìóåÿžï÷óýþVY“©ÃõCù†4aŸ²h'í³„I6ãç,ÓÈiW,ËoPÄù㐞摘P¹@zZŒ«Šš¯ãm…ï#8µËEe$žWÔ9ü@ë³Cµÿ<õþ`ß3øÓÁän½ûâ}÷4ö_G<<Þ1þâ/gò7~¸©íÈ£ ¼ågíMÍcàö•Üq„ü'Ä>Skµ-+{´„#4$´S¥:ð Ê`ÜAÚfsÀ If ƒF÷å Pñye¶PŽÛ6Úi€!Ѐ¯å€Ñh°¦ÝÀíAŽs@VBÊ0 'QìÌ@=„³8:á]Ý7ZèHŸ¢’ëR"‘XDæçûŠKL^Ey¨p'çPdÃúSØü¢:?+ÈïCÞKÁæ¢1*¶äÈ Nn^uþiFji×PÖòΞúŸœ²¿ÿå¡¶æ®hÈ[UbtÊãÄٞE}îÛÓÐÁXMÒË7¯â®žË ¢¯5Æ7…ĪX#n¿“Ñ!$±v,0¹AëÓúq~²tOx§¼¯{ßõ~èýÄ«•½iï„÷†Wãõ:º³!k,Ñ’õ8Ҏ“Âñ6}ÓƒïÎ[²ø,øNNALÊ&tÊs|³{ã\ ÐJÕ̍wMvìú¤KÓÕåŽbÍ[ɐãä$‰Î¶CЧdªŸš¢Hž”±²æaYKƒæ']|£Ö"ZX\qÞÄ1!EòNô:_AôHàÀWŒgô†€ïŒ¯®ö†\”ÉLWqÏ|öÆÊ椧ç~ÖçÌ~qaÃcg¦æ6•¤{ìúãh8ýèÎvto;ÞŸ»váè¾ç/t%ÎnÕ‘šr½Žë=ðìz]‚søõ$iŠílé>1 ES;ë™Îè½OšzöoøÅ ¥vfïÖìùÉ-Cû‡»Ûl;¥L>Y¾Ô¼ŠHÌ—ÜÝÎïâÇøç"ÏñoÑ¿£obzw(°ÄøPd§V°Ùê2Œ›f7f¸Í){¯@T΋3r6JÁ4oÉ:LSǹ™#ŒÄô2ÃÌnæ0óQðë]q‘ÁÏÜøÃå-T|û3üIò=Ì„qØ9¹Êh6z,~kPãáa6Äy ÏÊlš`w³Ù—ØV¯e;X²€eјßX'úßÚ”'rѝÁÂëÅ”g[q”*ÌFÁ³ýŸ)ª+!ø¾6™¬‰¤ä578m•uݝm¿ïŽu:ŽiœI‰&ßKñIŽðòâ·_±Ž²²Ú{Vœ|ecËšNp»Äì²Ò-H×I¤ëÕäG˜¤ô‹!iLº‰"xCc,†IbrP2-sS#û€Ï‡ÅbA¤AQ>d4VÌ‚=2…¤ÈšÏjt1£`䨬ÓD×DìÀnOé™X3P£ö­7%°™å}§Ò©sWzÜ’çrGÈ} °Tâð;Ý_‘.ˆ'rS6ÞwP`«Å ­£6[›A’“édr"9•$“IQH541Y‡Píbi—‹] eÂÕt8\-/©=…­$Â+˜ i¡_t˜ jü+¹¤Õàr†‚ÓZU|+ü^ðJ“Ês¼€ñ| |û¥º·Uì#TE0Ö+ìè]ӞXg:dmäêš6'·úw½|ÁQWkh=zøôß4Ս 4hnŸy¿§?uèЎžMý¹-°”.DÿËxÙÇ6qŸqü÷»³Ïö9w¾ØgŸã³‰í³ïœ8‰òæ'9 IÌ‹! !dnL0›ñ¦1ha%4a#ª`#!dE”Ñd…®D©º´ë¶?ÊLkÇИºUÚXD§Ò?6”Ë~缘&Í–ürg[ÖóßAïå5‘æ n¼YTX Ôn> ¼Fb»×ÕTù–*3?@ïpÆD»ÜÏ™•?B_w·W¯¯£=x¿B°^î$%c!Yâ(©Ž–"ðxW‚Áp”=…ó¡ ×§’Ñ뮆‚!©$2“Yà—:ô$9O|¿¿M”XQ”|Ðê*ë!ÎÓ>jB´aD{IÌÒ>–åý~G?âý Ç]Çߏ9³Ü¯w|ì¸ã “͍ÏÀˆn1,Êb\LŠãâmQDoGÄ÷D ƒŽˆ¸("ó–É0â¿È9ÄðÿÏÿYNÍîӧ蟻ÿ¹\Y,¾é²×-¸#‘v4‘ĮǠ[ˆ3O90BÝÈ0zãç­ÙâM;;|µ¢nùdë²uÜ·Ø¥R»òÏUm?½«µ8Bíüšr6¦Úc)år³Óluõ±Ž^ÜÔPÓÓÑêpDùƒ2£üN“æÜ%&ËJdu(µÝ@©Öžx9ð×ñSÊg§þ6öt~æ òþ™ý½`ÓOö›y^9¨Y†þ½9çy_{ÑÞ‹¸ÇVak´mËßëÐRH‹x9› (2eÐC]JoeYš²AØFÑ,Eр+2›²vÙˆ@aÆc4èiHÛ8¿(€¡„* ÐS’f\!WØ%»Æ]r!ôâž?ä‚.5U,sÓ2§’T5@RãÔ‡ÔGô-ê}¦í¦×ÑI”pïP÷(C1tœŠÓ‡¨ôYM«é¯Ô@qTéSr4½{Ø9õh,§êQĨ~R’æÑ2+ê$ê'é9š'þìZuž*´…æ)í×Íí'µ)ð‰~ÀºâHEá¬Âv'\¢).o²Á e­Ã›ŒûjßU¸½u¢gkKóéÞÎ)}Í{V­Ú‚ÿ9‡ryͿݗøð̈ò›óxß%åzzËÎC°~¨k7š¸êY%Ꙃ)ùÛê¤&}Ìø©…h­ù[ÁV~kþ>Ž8™?$¾ ð¦CÄHÚ˜"˜>epj@è84Ñ*Îi‰¥iÉY0‰ZŸ+“× è|³‘4ÐR0@3@²Kˤ´ô=鉸)Ý•0IšÀ¾óž´l[“Öq«fµÓºÓŠ3ÖƒVÌŠèþvPâ¤`¶(ý©m˜'È,àQ'ê뙇Ө-ó} ç[‘x¢(&ÔÀ2¸¸–¹+ÞìCàüOÿj¹ò&Ql´)N[Á6>µîØúW/ž‡æ#ë÷F”Ç.é\½z´/‰O>ê¶ææyšš’p[2öî™spéxC{ç1å×Ã;_r©Ÿý•þF_7ÙCö’ßϹ`x| y ÑÌhéMqâ$mg!ÄÝÈN'°ˆìËϘt¨ü]$Ȥ À!ãLÛCæ¤yÀ[`?ãPo„¿9ÙS¹¼­¾Ä_N´‰VÈ{ÂöJJ—6˜•ÿpEK]ͳå~“ƒ!iÚU= <:>”YbÌ~Š·©´ ÏÇÇpt«ã-P#çÔŒ×¼Ws«FSSSäY:ÉðÐÍCôˆ¼çoMJjšÊðŒxÆ=·T[T±æ®\¹ý%Ÿït_yÙ½+§ßXFLy¶Žßì÷‹/ý(\zÿ`ÏÆª†HÀ‘ÏQŽ`fM…Û]Z­Ýxøý¾îÚX¤€uÛmoÍÞõ5~ \Qå—ªID¶~VsÙú¹´ÃtÔ„aZB§ƒyè±@qœ¢t;é1ú&Ó4ÏÚ9¨Óµ±€Eg£)ÙdGB¬áZóìv#hJ­~ȘaŒÇ:€ÙÞ`GÙ+ì${›ý«ëdûÙÓ,fe6Î&Y ËB–Ux}á …OÌgÒêPõõQþiU+™‡ º°sÍÕö¹¨•UA5çý€îªóªóû‹RŽ“wºxÒ©7à$o¡X6DD:ÁÏ ‚ßHQm­Ý­bñkÓ?î®/©€ÚiØ1í,¨a/ 7ÉÉÑï¼_Ñ_G‰†aŸCý:†6È'hƒ€a9DJÐetx1”`ÿÃ~µµq]ásw%-z¼Z! è!‘xƒ1˜òö7Ä£ „…ìÚN:qü¨ã&ãÛñĞ&vi;‰ë¦ã0É'vštšIgZÏ$ùÓ¤í¤ÎØ­Û2¤ÓŽÓ¸MA=»°]»þáÎtÚñž¹÷ž½{îÝÝs¿ûs¹l5Çe§00Dú(IN’——“ÍÉ•'dAf–úÌÇJÃÜî÷]Ndç|\+×ǝãÞã$rTq4ÇñàÍ“ri\Þm)CoŒL—¹–ó…ÛsP¼§¶©\Ƙ{„°c¶’e^`n;¥˜MO«Éæ½¹fŽ+3MJ;g­õ¶ß¹7ôl^³(ÃH÷#ŸºŽú·L‘ªÃ¹Ö¬\6ÅT8Ôâµ¹G^œê;L™L›¨ä±¥D—£È’äh‚´9X^N'h_N5XòÀcUqã´¾N¦ÁNýíU—D¯›¥þàÓ›ƒšäB‹ÕS&§S› E˜éA’V$ŠåYœÂ÷¦Oª5ô'Îa¸»@vC¹|¡wÁmÃzÞmKP©á÷õRPó"õ*Ü^â–¢“Tγ,ï^c‰K@å-h¥%LÌãBW2ÁpÇûÚESf>50ãgaZªŠ —™’œÙ&{¶£snÃPÓók×*rM.ŠÈd)¥õãÁJ—‡Ë*ö®u7•xÊ ÎºO_8Ö[•¹Ö‘n)u9ìoà0ÓËꙥ‹ìÞµ»Cƒk-ñbFššR0þÌÑwžÔUW;·[Ë{  /w˜Ú›vX¼ ©¾ÃNëSô2‘æ‹ßSºA\Í9úcj½ø¨Àö YªÚ'ûc‹/'ÌÒbŸô²‡P„¤¨0ÿcžO nð>3x½u—KˆT·³¼ QW`lp7Ÿ¤?.q{mFYï((Z×Y|ðª¸Ss‹xHÙ¹*T¢ £ÿ*´š¾(*]]43væxœQ/}&~:á¼L/;›¸/©*¹8ù#ù~E†²UÙªÒÞ!Ÿª¿—’˜ò~jQê‡ihΦW¤WdÈ3Žhœùƒ¬„¬ßêN­q­¹ÎîÑ÷èÇÍp3†ÍÙ¹ÿ3Rµ"=”‡òPþ¹“â3n¼ÔÈñ¨‘,¸ïEµT¨“å ¡MÈX1È6šÌ›gÉ/°ÚìŽBgQq‰«ÔíòØóšÚºú†ÆuMë¡eCë—ÚÚ;:»º{6n‚-½÷xãy,3÷ÿ°ÿÔ%‚)¬Y‘КÀŠùšj 6Â|vÃ8ΪØôh4f‘/XTBZøav­ZD¯ÞMÀ™WN]y!¶÷»dp|Åòq€˜Nü#±¯^˳IP¿Óh†_ó+,â—l‘äÆt”9¦SDb:ý“1]„ú+1]‚úŸb:'邎]A€=ÃvØæÐx(‚]lu(é°Ç±~võ;2ÉúÙp`hd2ØHØ?úãlhðß;:€A„F?¶,œÁÒÂÞ!ljY±PwaÔùڏý#‚‹=c8ÞŠZÐïÀ™X° £—­Ûñél_±›Ä¾Fl—Þé7Š °và}%ڎaÛ†ÖCøÁ¾ gšÄ†XàÈ&hÀmр_Wü¢ÎÁ·„ñ½í8÷0¾‹oŸÐŽâVjþmçíæBë1ì ?à\ÿÍÑ·Û³wÁ¢%ïC~]ÃÂó÷Á›¼/YÔùuÀ» à~Lqõ hâÙ„þ>™1€ø¤ØýŒò-|\…AJ)¢(‘D$‹¥4ò!uðVZjÞв™„ý‚Ï-N5ó6¹ÀœúÍ/ø§â_‚Bü.˜ÄO"U‚Lä½XY|@^†.RJx|ÈæÕ¸œMä5øœƒ­.`Ì«cô§Ïã¨uÈ®D¯ƒ-ÓÀ ÅP-ð"¾‡ƒCðä@.”'•pÞ„·àFô&²ªÅ¯û!²öψ"º‰¸Ñš Ná˜÷ŸS!ZáF¦w`>‡äcnÅzØ‚V“¾?!Ajó?ù®à(®#ÚýÿÌ®$$´ Á‚3ËXââ0ˆ »+tp¨]ʁ•ŠDq9Š)01ÅeFsØ!ƸØXJ`8%b‘€q lI06G ©Âs$á*\hòf”p¥²­ÖôÿÝÿÿî×ýçÿQÆYuЀ i&hÕÐ8vÑ)ŒzȉœÁ[x?eHi¯T7[‡0¦õD9ä…WŽRYŠÑ+i5½NïÐNúŒ.ÒU¬þ=àNœÅ³ø5qQvU„ÒQ™¨þÝZa½‰HTÌÒäÇ\#h$°+o+é7˜£Žêi?}ˆ¾¢³tž™U|¥%p_ÏSùß"AÅŸåO¬>Öj‡{IgÔL?l¤l æc€ñtÄ[‚-3.F¶V ¶:‡Ò¨™>¥¿±¯è wõá(Âsðý··óŸøsþ+%Š>" b¢NfË¥òeùª\+”ˆR¢ìU¥:¾å™–a-ÍYc­ÕÖë:j\Å©—„jHq¼²oýðŒlŽrü‹üL¶ž ìbÈÈÀï% X‹Ü¯§×hò½ 5µƒçýt€>@öÒ1Ðgtt‰®Ñ-úè6ÝãdNáîä|žÌ?ã¹¼Œ·!kð1þ„Ïñ%¾*Ü"Eè"KmmäMü+äà·ÈÂ~äá#>ŽL\äü€‚,¶D/Ëd¥|õ·Nn’Gä'òŒ¼ oÉÿÈï‘/—’ ÊQ¦+åJ%j3U¬ª“Ôfõ˜zÎïzÆUéjpugº#îùîeî¯ãRãô¸ÁqӁå@õé_ýX)çºÅ·¨œß¦E_õ¼8Îþ…œOcÕÔ¤œã‹ê8ÛäÞ¨”ÊݳBÄË+êQÎ)2QŒg8(öбžªåEì¥þâ=š,(>äô÷œÆý•,Ê㨁?Ç"AT†î–¹â.nŽý¸F.U©Tx•éÈéûtZIKe}£n§ê±•ٍÞvÍåQ8ƶŠËd†åœ=hà€¬þþÌŒ~}ûôNO{VïåÓ~ôLÏÞîÝR»véÜ)¥cOrû¤Äv ñqn—ªHÁ”Öócš™3•t½ Ào·õt”´éˆ™¸Ü™ùOÛ˜ZÌ1Ӟ¶À²ü–VËÀKöh#h„?Sëšy"¤kM9?A䇇7 ŠK‚Wf‘ ›…zÈvÁ”iá’2sâ¤H8äõù¢þL“ƒ³ôR“ôÑfr†cBAgÓ4ÝÎ2Z¥Õh™‡Ú&•Æ2Ëô²’ç#¦,‰ÚktÈ0Çè!sÌKÿHõg6ñ»S"f|°‰iJä YՍ…Õ¡PÔ^­c0²¦­¹WáÔJÍnÆÍ|gR¤­ÖgÿF1©?³xrįõp­f‡19âD€I95NÚ}v˜­ÏÖÃvOlŽfÆë£õ cNÉên˜4y‰o_÷¢ÀAëk* kÆ”ˆî3GyõhI¨Gc'2&/Ù_Ð ŸÖø3=Z‘nlŸüHHLj+Ì~¢s$ÇÜ–àõc¨ÙöH/D‰˜Ú, žDtS¤åØÿfç1+føEˆV¿˜án'BMóèšq‡Púõïžî)yÔãJóÜ![´ËåIÉAÿX632Ì~ýìJq‘Zx–ç´‡ø3™ÅúBf2šÁ èð,@îóÙY®i P)fõ¤Hk[£Rï> deDM³5‡k:Oµ5Տ5O†Çt”óç3´³—þä/ÙÓ%%\1Üä.ÿG=»UíÖ5͘I/1j¼é1£6ŠÔäc+F¾®å1£¤Éª.Õ5n4ñÇ!5Y‡k¼f 6ZÁÕÌnEÃL F¤WD[%á•Q?9~ˆ!Gß­=›63yÄòÆ9¯Ì]9Ííç¾›-GÖÆ_ŠûÍxÇÞ¹;¹/·„‰¼8;WÄ_âqòµù‰m®GÆ"÷×Ój™ÍyʪSªè-W==t¤M"—_„n±¨·áªýKèwÁ>}ÕxÎCûì÷€'€—ƒkÀïƒO+UÖôg¹×¹VQGèw«Ó¬‡xîQo€nžº”~çZźºƒ>uWÐ=Ì}J]ŠëÒ4¿]ÊÜSê­ùÊNTȺ-ê¹›²gJm€?ã±NÏ lþ¦ŒµšÑqëÅ*klò ot÷¤5è¯&yÊkú‹1f.x°8I¯@÷k¥7Õ¯ °ÁgŠÕ 8¸íÆúæ‡øë¸Ø©ÙŽùqL¶ÿŽOÿƒmmÿÚ²ã_~âÛÙö«-–ÙdÁÿo”*ë>Ú¹ÀÅÀ·Ö.´7#7ëmvo¥™Ài澫”Q7×]k-üÜ¡ !hw§:\E=•·¬Ïåm @—ázƒú£¿@1Nè¦+Æü—󪎪ºâç¾÷ö½·,/YBòP@Þ*#iÌbCG)ÂKeh'Ёª»+a»d²|ˆ@‡bSe' éœ c‘¦/ $| EJË`C‡ÚUE¥X¿ªXñõwnv3Lÿh3sîïæ½{ï;÷w~çÜ»ØëP|k,|ß‚5o–z˜Gb~%p˜v‘«S Œ ú“ÊTüËqÅüçh-pÇÏ„©·Ð{°sb»PÅvºÌ>Á‡ræc/â_ÂÚìÿqŽŸvÁv>|·Åvÿ˜z‹ß„oý8‘½cý]o2Fl÷C‡¹xå-ƒ°aûÀÛ(ØnkŠóé$ìëŒÐ$çÞ¦/ß}‘k)׳¼¹>öjõ€sškç5´þüï©·ö;TÆù«ýQæ‚}–溏qùº8D#dÞ½Èsükû̵s79ÚNYžS¡ÉžºïoW3T¿¿ÉïÕå¨Y£=Bke-·ZÒÿ êÅ«j 5ÎuXFeÆbÚ­÷ǘnú£Ü+su x©‡/}²?Š×2®úoLª’œ±aŽ~Ò?/ùÊñØËŸ5̯ù ò \É1¨ŸÁITƦ_ —Ìg1þ*ìKÚ4éNÝñß•|Í£Mø5µP]Oã´ATź6NP…zŽB½ç sö‰DŸèF-ŸŸ;{æóYÉù!ÏOhHOÈsI•s6Ó\ý"5éïP“F~wÓõ×°õˆí‡˜û”„¿¥u ?ðmÄé>yÞæÏ=äƒ>Ö?ªßØ!‡¤ø†ö:mÔv“ª’ß•×p_ÌkZG½Àî¹Ãøÿ1«K§èоµuêì.:­ïÃðl‹¬§”UÚ)1'°Ç_»"Žö(k¹#ö5q¬ç#Ûõïþ×çÿ)Åùœý¿¡¦5òíÒ¸,¢°H±Ïݰ•°‘f©Øl&Ä>#Na-A3¡ÙZmTÑxíX×Ki°I"Êu19:0Ø®Vñ•Sù}Lãé Ba*&Ü=µU¾O*ÞªDþGô•î­$ü„òAµ_­V&œj'Q^]ž˜X=1ñfõ›‰~[c“ÜáN]ì÷N'ìqX8‰Ecnlz,NF’Ѥ›œžTNSûuÔ"Fw´“N5§ZS]©Ó©@:ÞowÅOÇáT$M¹)-Ä£q7®E^Q8~î3Êlmv@qW]£¬Q[•VµKéRMìK*QU›¬ . ® ¦ƒÍATF‚Ñ Ô¡H(rCÚôPMhQhM(jµ†Ç(7&ÓŒÙÆBcµ±ÁØjüÖè4Båz¹1[Ÿm,Ò­z«aºn¡n\ظºqC£ÖÜ(2êí{bÜd¬ƒ·$î ˜Iv_9@þŸ˜§$ú£g‹Cb±|t‡(ŠÝ´ÎvšÖͲ펍-NÇÆ’{I÷ gIwÆ×¼öÅŒRÖ¶$Ü‹g2¢Ú+pδ‹jñ”WpÃÿ}Ç_î tp nv“'#°EL·C9(VÒ6²Ä={¶Y?ÙfUÞ¬L¦d)•²-•m5 ý·blS²-‘m‘;¨Áú°Áú[ƒuªÁz¹ÁúEƒõhƒõý«ÒQž¡zL]!Û¤lkd“íTnÅ˲m‘íÙN“í@wp½õ~½õ^½u¹ÞºTo®·öÕ[Õ[³ë­Ê~âßT‡Q—e»T¶£ÜAuÖuVgµµÎúiõDµ¸ÎŠÕYÅò )˜QÆx©R»ŒP\iÂ$[F ñ]r[xâ(EBWGPÞ]Œ!½ Ð½Ì(»]1ÐÙAGAgÕ»]\Eçþ"»2(>£¤!¾W€XPüÒK}Û©‹M—ÏFñÀzJX°Ïlñ#Ì>>ˬ@çáb;#·Õff]/5Ô9 ÆSüÖOz·—x*„!:°ÚhL˜S‚a/5ÚÉË‹wB^b…SfnX{(¦q˜¯aBw>¥¢“dwB µj3FAT+žó:í·`|§¼uϵßÊ}¬µí—0|G¼=ßkoIÔ9?Od´|`&¸l7éDólm»R¯í5ÉöPM Â³˜[ëBß‹¥škD &µœGÿµzŸUØån/k:¥¢îꁑ^6îeû†zـ!=PâeK…^6н샠ônä‡%[¼l?˜ö²€ ^6hð²6ài/{`•—­r*ˆ')ËnŠe4C Q'&/¡ZeسQ ×qþþ‰ß…Cç³#œ¿gKãðêHÖq$3J“ç´eۍ½èØ¿KfnÈÙ• :;1¶eFFœhk±›{ìµ7c+“с"“ä@;ójÛ9~{íØÈàÈ`z¿ØO¥E½;ÕHŸ6Ò0Ò#½ÖH/7ÒËŒôB#=ßHÏ1Ò³ŒôÃFz¦1¼͌˜ÃÌ¡æ`ó&Ó6‹Í"3l˜ýÍ~¦iê¦f*&™Åÿ-¿#ÛÜÚz˜A׸Õd?¬p‹Fž5ÂT¨ŠDë@uŠ2åo‰)­]Ò”¹‘Ö+ψ~ß{¨5ð_Êʰµi ŒãwW—è:][a¤†bkaoÂpˆ 2]×4ñÅ‚P–ÒæpH6† 4ˆ0¬ H%¯üÃW|Óqû êwðÌçyR܆ôàî¹ûÿÇ]’ç.U›«‚Ǽ–m¨‡–ÿ õÀòÔµæó áüƒTâ݈³¼‚"ަ*4‚1\`/CãÙ`(%[Ø«µÂjþÑSgJӽصþ,Æå!÷šoêóp¼…·x[Hjg°å?©2@ÏG.&.&.&.&.þÍ%õÑóõ©$Õ=윕¤§nùåÍ`,NÅW׋í@œº¨³GÖ Œu@vÆl`|uc¾NX+ÅÚâ±=€‰EÖ&¬-ñgÄq¦;I§C”æs)®k>Q3÷SJ»H%׈Ҋ(æ©e¤’0æ{ˆL²‘„[´¥µs;HíÃÔ>L·òåÜE>$1i»páS¾Õ´Â¡öþ‘½\^Úÿ?‡»;˜ÌÍ ¹ÊlÙØLãg‘…Ôìši/ä^¯Ržævž|3¹žùÁ²–T³U[e«6«Õ+÷˜ßÕæ”’镊±o_aüˆè9¯O¬¥úR-8khÝy~bû+Xãhbå@ÎñâÛ~/ŠX¯O%êõ8£È²ú}ôúà)án«2Ôµ÷]U®:Js·G™üD¸Cáf*Œ2…ªÃØ/>stream H‰|Ïj!‡û¾ÃSRÐ ä&{hB›%d[²iïFg!þA]JÞ¾«I÷CŠÎo>ùºi¶Õ ègp²Ã½¶*`tcg´%Õ ”–é~+»4Â:ÁÝ5&4ípNèq c WXìwo»ö}yÒc‹?Gg„}yuµdÏ °'ô#(Ú°8U_ß÷b7zAƒ6+•º¾›ƒð­0ôŸ—K+@uS•NaôBbv@ÂW¬¾^×­zÈfæÜ?4gl:gæ/Ëxþÿ¬$Ç&ã2¤"š=´ÅyŽÞùLÁ´yú`PIy¥ endstream endobj 1 0 obj >/Font>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 39/Tabs/S/Type/Page>> endobj 2 0 obj >stream H‰ŒWmsÛ6þ+øHÝH4 yÓéŒã4¯n/«n’N†¦ Eª$eGýõ·» HŠ¢N&_ÀÅbwŸgŸ}³fW×uk¶YÞ²~¸zó¦úÆ>ñH1ÁB0G쏫õé ÙÕ]vªŽ-ûñÇ7oo»úù>` »Z¯ÆÙzËV

Ó >£ÙÆ¾¦m–Dž=Â`É \¸^Èh „Dë­íçÝè¦+k¤£ÇÕ¨¯÷zNðA!aêP#Á``u:È­\c×ÈŒ,{ÀI³UTMƒåJ”8‰.A@*Ôÿ@™ F,Ý_BûqâÿÐ$Ð1µ#îÌùÎÓP¸Ñ-ù@R‘;?tC°ÈÝè„ý`9Ëœ|P&±ŸôÔe6þr*Kxw7`¾eB*$ç0– mÔ[о)ªÇƒæFy'Î*{ØTÐG°ùBgÙÍ:7æUÝ½º®Íß8 ^ꦮðTt¥¾£›Fç_ÉÀO“Aêx?Ãä4GƒÝREvþãù´-—É[J¤3±¤"…¡Ïr²^ì±õ·–&­¢ð@ñïlwckAtâKkËÕxkï¾OzqOz©¯$•ô’³®Ü1‰°3Q^ÄG”×1ÂíX6:?Ö@_jRV%YŽÛŒ¥˜xÚi§0t9‚ŏlc`4+3[‚Ü!k€QA»üŸñjÛmÜ¢¿ÂG§H ‹Ôõ±ÝhÚ‡}è…,ӎP]\INÖß33"Emg_[6iræÌ¹¼‰»]áÜm²LDÕ·çr˜(ï>2m`þÄ…‘ùNq.÷M ›Ø1ϝ¥K][Ù›9!Û[hí‹'"BGˆüoØÎØÎe×à˜Ô:N35&´åÊÁ?”P¡ZE#˜˜ÈêJZAa©ü͇Åã팓ýpØuóþ´ß­£l’i‰R°nz¶n [7] h˜Ý4(Æ’·/gÆI®D£_:‡›P‘4[I@\:zšPÂQ#ûßó¹ç§””,eÀÃBŠs-òhîtáÁèZä çñÙúÓÌt~¨Ž(N®Òe`âœ)ökeÏœúîÌúðb›y¥º-–¡ÕÀL¾jæß2 ¡îç1ãÈ÷Þ—¯sáÜ;žÝå2š:f÷Žæ©žÐrÒu‡!hK=è‚÷«l#Ÿ®0ñ³·œ®×¤Ž+–LÔ©±CÇ#±.w™#5K ”8É#c©áœÉ*Nˆ—öð^¡Ho>=×­mnÙ²Ìÿ c#Š!f‰ d¼ëöÜÀyL– ¶§ ŒÈS9ŸrU+…[Œ6W*Âw‡ äK 5"mó¯„dj¦ 0#Iôƒ÷ü´ä–Š ƒ;9¾Äóà{Ylh”_Jg—è„탠4ƒJ4'ªõ]ª³µ€çžP¹wzQ²/›èÿ™þ3tŸ‹)hù£×]mWç$‘8¤af½ #Ô2bÑG„@³ŸÈ‡lé:ɶfˆÞ]R¿¢ L݁˜ò«2Û4òóyeü—,bÆî?ÚQõ#jG²Uw[PÜôPÞáîø·VI ¾ß $œÁóéƒô`ñÂ¥ªxœ–ú3ästæ…k¬}GůEùlsœó ºH3乯Á¹­M¹&$+¥zµ%\ ¯ƒi`‡«ÜP0ÜÝÔh@I&é4åQFƒ?GØ“¸H»[x¢8Ðf{¤,½°a$4óÁ„=®~}Rÿ0ÍM( endstream endobj 3 0 obj >/Font>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 40/Tabs/S/Type/Page>> endobj 4 0 obj >stream H‰ŒWێÛÈý•~¤‚‡Ý¼‹lo’ÝÀ^y/Õ’˜P¤BR3«¿Ï©jv“ѳkc$ŠlV×åÔ©Óï7âþ]7T»¢Ä?Ü¿ßþ.eœ%¢$I‹ßî7—“÷‹K{ď?¾ÿéƒ÷ÿxľ÷›M ¤ØìÄ:ðƒ@*±)]…‘ؼˆPl:‘‹ÿs»¾‚Ñ$÷iÝQxbµù¡¯²+6ÛñNÀFø}?Œc±–¾šžòF*¡5Òϳ„G*}õúZf~‚UëTúq0{ åÌã0£Õ*òU’ x%×kÇèxÏ” Óe“wkù‘XG~6ßÀ$"r‰Hh© üT…ó |\–„’—ùI–‹u†€fñ`ajÍÉŒwV‰¤¾áÀÕB+Ù§‘ù28ƒs9»wç´R¦~ a¡ŸÜ„c÷—üE®ü,^U†nfùU%é]‹‰DÙWs™Ü¸dÒæ²fÖ~gKõÆü†A>ZÍà½rK±vÉ_¿mþ9S#³S“ûù˜Â¹JÁhv[©Ìß¼½ÆÂ4oÞ7[%ãVQhê•ûq^{gÁôENMA”ÎwFP ™x•PŽÆU`Š‘R]³dK&܎©Ž^|·ÂJÚ2Å/y…°õ¼ JÆœ ¬Lòl‡_*‹©’p_Òâ;N•Mn–.ÂÖQL…Ü2´RÞìn‹ª±\¦‹l8TðTƒEÿW4‘ÊB/NÑLØüËjxþjâ>øâþ‰¯ž#]™jÏ>“KŸ>üò~¤™,œ`{˜ñòè=\hº.žÎtÑ/TÖà,A– bÞ%#1¡x\E^µ =”Wâ¥Àg׈v·J½]Uê®§ÛíNЃfµ–ž¨è“n¶U³[¾¿_ŞîîŒK‹SŽƒR˜–qhs¨}ÊÖ~µN‘2éMoÏæ^àFJf::âr8ƒ(C×é~Ðú«Rª¿¥ ™Ç#i"øpN„eÛì4€Vº‡-„»­Zò‰m÷¥n¦6µ3&“qlQ/ÙxîD.¢0ŒÌ59¬zñ¤‡h.¶³‚ý|9tóp*W¹ÐVÎ[Ož -6Ææ6žL¤õèm‘Ô†þ4Ò‹°pu  víy€“«ÌkèqE9À7- È£Úe1{uÝsÁË €ú÷RŸÆ•¨:Ã~¶X8m¡G$½rüvÈÉUÈ‘™!SÈŸ*{ß0€;ý?|É‡ªÓ„TÍ}Fe#DDìeàFG¯ÚãUQV]y>®r¯ Tµ÷…xÐúêܾÎC¶¤äíû¸áNü»èp±®‹y~9œž´:‹ÞŸðúië‹ÏðD7ՀÚQ`š7÷ 4pwYhŸÙ˜úiêÆå³¿¤J¥kWé‡nñÏÅ…\¾¦‹j3ôãÔ}'BŒÒ/>±¡Ê#*‡Ê3ôjB,¦rúÌ‘ÔÏ'ŸúEö´Ú=ùö±xÒµGzÅœÁ8íR¥¬èIå•öüêU±°Ã,nª¡ÖÎbf-Bµ'™ aX„½/È:ȁ¯† £

bÃ?•ÞU ýØ~DQ÷­àËê>Jc uEáC=ƒgîö–îð1MÎO±É›d’éŒå¬fœp]²¯âÄ_íS­`&Ø4™ƒæ05Ëõ3Û¯iæ·ÆŽS˜íédn ´ýr±e8i~°£B˜5G`¬×¦¢6aèÔª)m·´Þ-þ@I§Béç‘=h¾ Ä+Íd«H3G3Sèsf „6èC¼@Ôµ¸uÆw Ýb‰'z¥M_¤ú½´ÿèºdzÅSâÝçѪ`³-Y!kî9™'+>YcÞèŽîÆz¬Æ9³y üœŒöÿhò}Þ˜‚ N£@"û{R}Iw²Ò[ž­‰ó_Àª¥‘‘ D#11`:Òüƒç!ÇbR0ÆyèãOS`߉º˜Ò¼Æ€-0h°ƒ£+ar#ëׯÔlˆP˵¬‡ÆŽ¢£&}òïž&±aô|ó?‰~ßlj½p›ë4â8[ÀÓåDÔà"éÀ¶ âŒr§/NVD¾ÄPr“•’]TÿÏújx»%Š=«â+mh±Þ›'KŒñ¹S]|ªKê³ mYL;a#(nI(é^@¯ž›'ÎÛ]°!ù6¼v¡áA~Õy“6Œõ¹¬.æ`y©®Y?&òu¾“çÒ;\-ç¢ àE=M𔸢˜SÛò•Iç‹0héäß0閭~O=u8FFw~ìIÎ[ÙÖ=òŸO¼É´'_GišÝwÛC܉-ž¬ã+²i!6˜¥Ä»@“¼ÔNZ˜x_QÄŒ@—*J`¨ž°;G»»ñ‹|iî M;“œ£ýhøÒîÉsb)n¨ŒŠöÑúý¦2WM•zeJ7f'Ê´^§Ë¦ª?hªÍÜT:‹Õõ«mŸ$™Þ–sP~êB¦93Ï=•.”æ—z)^Ç‚Ÿ–®FÉÇ{)õCr\6þëü]ª¿Ûœk’b”ï§Íç÷DéOcß*³£þŽÞw¢À–c&i–z]ø¦BîÃ0!º|fúÄûT„¨ãHe‹Ö¢¼rªyÌPʤêgÙ(ûÈëìs"¿½VΠH&‹Í‹C/ÉõƸÁ$öSùLm¸âÓ|efþ¤TâÃSAtÒ¿)™xZ÷‹ê°’TÏn•|J–Cc5;ŒH »7É“^Ü×ÓòÊ%U!´N†Ž2’WRõ?£Ì¢„é–'ðdÿ‰üíÉ!v.~¯&÷÷Aþ>ÇKf}×ÏeÙfNèÑ1S“œºýhå(dãz•þv¼ '–È‘#1ލKgÏv¤yF³f´D'TÙT¦a-VŒs^çÁÐÑ’G‡8Ú'ò”ŽÛ|»N~¯G‡ø•’²q”0ÎbaÎ| Eò7j’’p»czìåCÂgV=—Õ⨱$¶~*¼*_gêXX–øŽ›^Ÿ=zQèÌwEƤŸ}=$v^q³­ñ* …ó`}³ã¹tõ&Õ¹YrÓ ÷Y¾ñæ4ÏcðÙnQ%Œ’ï'Ë7õ$¿±wnÀM=3‘M?2Ѥ¤_øÆ’ÍÜo¾¬ôŽ®(kr–¹°¤ðiЬ¸ÔµG¦ˆššö–;ë…Ç^úPWvdB¢Ö¬¡„/Gf-ûôM G_ñOÿBϽ‹¹©gB[7„ ØW'ûEENØnÒ¨ì'Ž¿7^*Ný"ÅeÑ`vó‘È‘|O–¦I—·pUü™*i±= W-Yáuù³ò©ß³¿“-Z©:¹¡ è=×â-¶»Cok¡·ä툄½uW³ýÕÚÁ÷f=FŒPln¸ol{jÆ(!óD™ó’Içì¬Ç”ì’{Bg™ñãu»ŽbOcòèŒ.‰ N¤nú#bIO¦ê¡0Iš“±R‹6¿nðk;¥¥s杣ÇÐéjvR¿}Sÿ0ÄÁìÑ endstream endobj 5 0 obj >/Font>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 41/Tabs/S/Type/Page>> endobj 6 0 obj >stream H‰ŒWmÛ6þ+ü(ÖZ‘zŠÉ¦isHÚ ë~8lŠW¦m^eɐdo|¿þf†/¢6{Û ˆ—’F£™á3Ï['òú¥4¹M“×/hYðÀghë*¤¦Òª…®âìÿÊg6J‘‰oÓrå¹ÛŽ*}q;RÊn>·¢Ï`ŒÐ‹]€UMû[ÄYV¾XvžÙ ÓŒªÉë¸Ì«‹É},fD\e9[gqz­â´.BÈ$¾©JÀ1u+-=q1ÁÁÁ¢[«šbÍ¡üÞIa‰ÐkðHÃyœ-¿[ÆUU/oÔÕâ•u iæÔÃy¤¼Ã ïð¸¬óð•Ÿ>!?…´öfšdsPÐÛM*S» xmf;à#@¾«þô¯g%¡ý–Âæå™-Ð%¶–a2ω¶×ÕóîÍÇïûý×o‚>cäŸî>¼6Œ€tÛà:´–uµ­|a¦.‘6QDÃE 1H‹ÀrÆ›7´‘Ì=Ç‹J5«{bª5êhGM·l™¡‡Î:ïH[o°Û÷ƒFŸx¯eù¥Ž‰‰¶ ¹°?M…51ãÙ ù“n be´ÇbÂZódÂ)ŠTÐÖd 8½¬»Ä/ÈQyíRaÅ“è|„0ñ?à³O¼x@zbÎ@€"|þ€O¤it³¢7t«Lù ë°éðy’fì7º|Ù£Ù8jþ#´ áíL- 3ïŽ!—??`™gð ôñd0Ê(M«.‰C™ž@?ÿ˱ï^§u.¾‹×yº”Jnfgö$iâœ÷Y"V`³=ÀÐZ]ŒN¢: hBe8•ñoß™+R= @'©¤^L÷LÐFó2ij±”¬]k ê¸×Í tñ7ÝgßWƒ¥\Dê„°LkÂYÌ÷ zj' È$ÈðԏÀ‹¦qÿ0™d[ÜxØYŠêÏíB{åN³ÏÛ˜,Å#’¶‚0A'Bü !I>µúˆÌ8“¾•¡‡ÝœHáOµM¤žâpiz@íc†} _§†ÔgÁku%ê ûÊò³ýPVùùQ'á¨{ƒú&¥ÓÔݞ84Œb¨… ±½=løCÕ>¼ãa Ëf'|™#iiKˆ¶EàJ"`+¸±çz§(I`oþAÇ#\G{BfÀÓì Zuñü2»@"ÄminÂû!Õd!Õ #ì’ÉUW|é†õªmh®Í6Í‹TÜ(wj¢ÃŒÍTè„Ø´P#Ä?õ(oÎNÛãî‰tg‹à¦p’ROìHbHÒ3cAÖ;ŒÓûpDg¥×9Ϋw:Ò•ßq2ä)ïÆ¯Êz>†Hó@ÁÂkêÁ‘ƒm45²Œ½×ÉŒözÃîdPäÊ]’sîj5ÉãÜ¿ñŒ‹=Þ¢… >N£Ø–…1–mOô™±Á_·êfy6€„’ÌC>;wp…GaØ #˜o•9=hfä—¹YÍÚaëð-ͶïhBÌÀ½Z´»¨Å¡.±‡:j˜þqìXMí'HˆØFrÒ˜ ”Ç~ж©wTÙù‘džŽ$ªÕõVïõx…0:”äv¢žä0¾åľá7‘f~$YP0Ã÷˜mk©×èŒVÎRUyw"uîRa´à(Çv‡\`G’½ .±±¡®Ît°êñzËüÓ퉂¾eø¤,ž+V8„GšÔ…0/ œP4iö 4E·8Þxæ+óÂͦÊS:R9µ§ÑØ'ÕŸ §L揊»VÿÇ=bCºÌ$®­ËÅ)ÀH­+!ëìN?ݱ䠑d~Ë©02qSO‡+Í‚ÿ1^uMmãPô¯øÑÌ$Kòçô)tS–.`˜í‹‰Ý`&qÒ8òï{î•%Ù8žâØÒ•î×¹ç°åÕ‰–Ÿ´vâøÚ‘qiÅU.l%®ŠC³Ðš‚tR«CXÖÔ‡Õ£²©¦ý:Va–éü–»â¹n–^õk[•5éJ2ƒè”Õ¾Ú­±±Â¦zCåÚà™™SÍHø€C—Z]¢Þ~Ô ¤V:NµÞÔüÞ°4Ϳĉ”hs°±ë ƒâmöó»²E3|۞”˜*‰ŒƒL/ >¦Ù8ÅV£p õRí÷Ëï'Þ[Àœ["ˆñ§«¼s&¼ûÝþ{Ý"Û"šø)¼„`¡—ÑWzI@³²dXE–Ããz.«†Ýê˜?üß1cß"K»k¾!nëya©3s3 ^¼{¶IusïèpøÄs wëf±« #š¥«B;ÿ¢èõ¼¼Ö»·úmÐäA‹ªeI¥w°ÑV–9ÄÄȶL¯çý7ë ‡Ð˜Ø²ìæ9GÚ“ËMà E6¦äÄcðbúòdŸøyCÉʲ4ëݽ©ÊOž³'ɞ€½”Ÿ2ïKà©Òèhto2ãñ‰´Õù2õ¿p¥j•¦"5æf[7µ!LýŠÂr¶#T`‡Ioì'L´SðÓ@vãújb0t2RaMa/kÍ.ΉZÍí1žF1΍FžN•#þ?.¦Ñ‘˜&°€ã ×hÿüòrþ×Ý(¢"áªYõ?3•2òoCjl[†Y€Áflÿ}õïìH²TÄcËgNfG,G9¼Ýu~y""ÿæ‘þž®ñp6—ÌT&::ìÔ¹q$D2Oawù×ó»ùõÈ %e/Ži%ü^ÊEľõb½²W+v`1ó˜fA$Ô@‰T™%Ë\š }ȝßz¿·d` endstream endobj 7 0 obj >/Font>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 42/Tabs/S/Type/Page>> endobj 8 0 obj >stream H‰œWñoÛ¶þWîGy°‘)j¤‰óê¢m [ÙðЃš(±†Äòd¥Yö׿ïHI–gÞŠÅEÞï¾»ûîMF'§uSÞæ× ýôÓÉ›7ÕŸôYhCÊRl"2‰¦¯'Ùó¶ “÷ùsõØÐÏ?¿9?#:ùÏ*¢»dYD‚²[šEa IÙ5ñ“Š){"EYM)Eø—‡2&cҐ÷=P@“ìw*”VcGvÓ®DNˆ;*­i&B¹ÿ:&41ÍŒ S¥§XÜêg‰8ŸàÉiwRÈ0²‘%#ñn"±7B‰PèxdÄÉö:BYËâfFРФÙï"4QâOÆÒÌ&?_³wÞª³Ê'F‡qüRŠ»@«0eag‘Ó§túÂÚNM$RwXâtj_œÖ¡MGWÅ­b¡æ+kzûûXDKã¼iHÚ(Ô¤MçÄßÿó¡êŒñfÅâ&0a£HëNÙäïõª4Ôöo;" q{>çŸ~T’JÒ‘ ¥Níƒ"Ô°n¦ÂÔ¡&u¨“”=(ìÀ_q!Cf24ö€‘î.Å-€¥‹ŸŒìq€ëT°¤èÛëufÂâ9a$$ʀ¥ƒ§Hۀ‡©Ë–yÛïÖó‹¥›ÖÐÔzL: zKåÁVÛÝIk¯†%Jd`hãý=TÞ™˜Ým29Ⱦt éªH’ÈÞ6qܶö*I”·M†Ö¤ì F[·uþkְ֝6M~½.ø“¬ÚÒɲ¼[7(v¾ÆZp¢µÐ$¶/‚o‹ü¦¨»"x´äECxÇ@µUˆÛ è‰gQgŠDVHP&)Ioʧü®ÜäMYmzs$Ç_vy|V6廑ÏÒª@'“™]Mf&‘ã­Bró%¨œ_&>ã½eŸØ¤g‹sT÷Vþ8¾¾ÆpAM\&æNíå¶Ü°QÕ-5ëb’tV=ÖÍqÙr(ûï‹·°¿•îÏÁÇËlq61Áÿ»‹jdë‰ÊUÛ‰A9Iƒ /Tü—°¾{Ä÷ߋk|i¨©èv"¢ bÔùDˆàžêâ;¾–;>í~+Û°Z8n¬ûò:o`A§ÃýmØŒ¢ï‡­$êËò9Đ*ƒâž5>LT!&ÈëgòŸ Ú­À°ˆ];hê€×˞.n°—V4pE»µ¯-±¥à5瓊ŸêfÇÏ!¼¦¥“çŽÝðzQ»ƒ¹S]ÿáÏÕ´Ê±@ÿ4qßñá€|óLÍóÖ¹’¡}Wçò-¼·¼ï©ª©BB×Hx×F²ÜSQ×bLJ§€?öb…rþCjâõo÷Yºn3 õ¸»æe„™£l‡=z`m9Ì{¦oüˆÈ%ÁCÎ)઎_d!·í¥dЂŸ6·¯O=¼Ü—Nj—{¼ûXþÝU.±Ø‡lr©å$qætÉu¬êéžEg™ðìÙ9)q ßJÀ3$GÎQíø3X‚NL˜X_ÿVWŸ–ós:»„#®–ñï…+MÙÛ9]}\à=›ŸÓ*;Íæ«ã昁9#2@ܺ¦&µæ^¶gl¨ÃÕ.‘ÿ"¥áö"ÿ•”óÏf2‹ƒ›ö«tŸåqC’ãÆS‰C6'ñcá ºc¼ç§¿,ýçô~~ù‘–‹÷ÜòæÀͧ¬—>ͳE¶¸ü8_îÉyÛ¿[¶äJºž ÿÈ}¸|JñôÒ‘éïa·mèFÏf˜›Éx@wРOß/.ØÂËåGþYpÜN»ÆŽ+C漢‘:û[|À¿.€Åƒþl¾Äí—§¬l¹pÉ.PÎ.¯PÜ–¯Û{úéÓüô=?±sÀa âØ†I¼×êKÛ ‚õÖ%1G,6 ²~j¸Àͧ=#~bÚáþé^rÏIÕšHðÙý·‹K$Æ[w'à! Þ#è|±ÊØpJö÷SF…ࡇft¿-kvh†2.EGfœ/~Y¬P€#t:¢D¢/ ‘¿{äz슲£R(çSbþϞùúê_˜ _šðz d‚0iL*†q¾L€õÙœŒëúËhëÛÅü‚^/Qbì×K£ Ä=C%øðß“D‹ÁãZ´`h ´,»t’c%(Âv¤ãòÍ| ”­öM§MfúhZ§–gž¡·n0|/j0R°07£)«w¤Ø'¶@ÇÃ¤Ü G”•nX©£kŽs¢À{eëbWPóTÑu¾ªóKÌšèºzx€axþã±Øñ|ú#=4­ÇÙÚÎ}2§Öx“uCQ…Áª ‡üyJOe³®Êé)¯ë|ÃÍ«A»šÒ®Èëë5Ý”we“ß»Ä.7·Ø)ëÞ{¼m™ÂjÕÏ_Î1’Þ£¾«u‡2™¤#|,6¢·e½]Ö"SÚMÉL{㞕µm_¡ó®¥ey_M‹¢êö?˜^0ÇÜpñc¦Žè9$Ý9|9BTüùÒo×ÅfµE:õÀë§Ï#_s endstream endobj 9 0 obj >stream H‰|Ïj!‡û¾ÃSRÐ ä&{hB›%d[²iïFg!þA]JÞ¾«I÷CŠÎo>ùºi¶Õ ègp²Ã½¶*`tcg´%Õ ”–é~+»4Â:ÁÝ5&4ípNèq c WXìwo»ö}yÒc‹?Gg„}yuµdÏ °'ô#(Ú°8U_ß÷b7zAƒ6+•º¾›ƒð­0ôŸ—K+@uS•NaôBbv@ÂW¬¾^×­zÈfæÜ?4gl:gæ/Ëxþÿ¬$Ç&ã2¤"š=´ÅyŽÞùLÁ´yú`PIy¥ endstream endobj 10 0 obj >/Font>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 43/Tabs/S/Type/Page>> endobj 11 0 obj >stream H‰ŒWkoÛFý+÷#¹°hߊŽ“Ýz›¶A"`±ˆóaL$nøÈ¡÷×÷ÜR¢E%]¶õÞç9çÞy³¦Û»N—[Yhúé§Û7oÚoôYÄ …EIBIÓ—ÛõËAÑí{ùÒš~þùÍÛ{¢Û}òi×Óízí“ õ–V¾çû"£uAÂ÷á'´>RHëŽròñ“SE^œÀ|’ä^ˆïkrÈ]ÿÏ>Ëį‚ŒM½œ\oÆC"Á3A`ñ÷« ð‚(£•ð{ÊóíU’y9,¾Ÿ6rëAdqÊgž™Øì«(޽4)%BxIžGçÍãÙ`˜…ü8^ ãÝÎQšƒ©=ÚDVAêYB«ÐKÄì(œfóM LJý,IF/°gÜdn¦tÒÈú)RË~æÅ "ߦÎGa6ð"?º`´ê‡éä?¸îŒIXÿüav½"Ùd4ŸJǵƒwqݦŸrcíP¤‹£cEýï$ˆ“S@áÜ~:kŽŠ%J.Gc:a”Ÿ3ÏŽ>ãhûøûeýoNM‚ðJ‰Dñóý"Ûw¿1ãæL½ÓZ{O·ëörª­SÏÃ@g'ÿ¢äFuƒ¯óÕŸó†P9[ƒÿ/ž)’ ÂÓÐ’0§Òôɹ+©Ë¶™¢q>>¼÷_c’"¬¤œÑh ñˆÆNÅÔ9›Î­ÿWû¶Ýxyì|RŠîeåÑÕÈ MÛ(ºkþ:vƒ(å_5ˆùè>:nâˆG÷†˜ÀbüÐe-/Ëè<: y="">

wTfˆ3g7?œÅc™eGåÄ99 $ RqH„?Ã÷p.ƒXœÄ mM×2waÊËEš[“4O‚”Áp7‰ï¤Ý“š…r¨'yÖº¤Z7ëªÙÁ2w…÷‡ §CÍÃô¼0oªiTÉÕî|¤é>Šn4•UçÏc*øjÞœ~Ù·à•›çwÒš„DKÓL@øù½Þèò¡VåˆÆh@£ÄôÇÈs#i~`ë¸ñpOöÁ¼ÿ0‰½å~×v hѱy$2oÒ@À/ ¸´iô½´¹ØÒ£Eªya¦îý¹ð¸®Ñu]ó‰àëû ~ôLIÿª,Ó')SÉÁœŒgœ"ˆãÜ»î[žy€.NÉÖÅ3X­×ø¯i{G C1šïôPaõÌm´ÀÝT]õÒ¨zÓÏU®ˆ¡_µ´®öøcÏ°Tˆ3,=zŠ/¶ÕNs™ÜP9rd V;Ó1^M òì÷Efý>;‚Ô@K.G’HÏQøM¹àA¤W³d›—¨´Lî6ÖàØ¾ìÚƒ¢no[©F/µá±¤érÃ@BšijkLNèDlytlÍZ#ªÓVepqn&Gð;ÇÀc˜Ý*­šÒ¨~Û”Ö¾ðMTh5Óøj8º“"Ãs˜…6Ã\L4Ì#æ-Ül0˜Ù ~ÒÏåä“?³ßp‚üݽ”Ý꟎À:Â-LÎAa‘̆„â³2RÍIah´e`öh›$ÿ°ÿx¤CY/“>›V}رۃShyýÀ«-µãÕJ/MË[‰²e¨dáTò–^ß $E?xîuUou|*ªYØ8ßÖØúé(ð^ƒS‘§½;Kzõ—-ÆÁö–œ@Œ‚‡g¯*»-or·)™°K=l_Z©Îž9¯BšLgñ’GM7 QÃ8&èŒZά²«{[•/ÐkHŸé©Jf·ÓW@„—@ˆ¿pO³•Áúß¾#œ¶Z+¬Œâ¶¸ÐµvÐFÁxL1 ¥ðt?ÞOžðƒzW«Y³c|‡#ülP/­åá6¬µ2¹BÍ/»ë’0á ‘„i@«q$>On4_¡~î¹I2á8è]b9^Ò(”Ý#}q 5?îŒêì'ýv›ãÈdMǦÖÇ{žÉX¹åùv¾qÏ&–iÉMƺG j؞ ú-è/ |¹˜£v²vnÁ²ÄÝÂn¾z#œcæõ‡ã,q¹ÿXöâ[A©–u€ce2ÈIâ4P!ÐɇeÜIDN«Û·´Ý7¯Úl·Ê.áçV7¼¢ì™ª7Ù)ú÷¾1švê'°+O:½%D2ËF®«ºV X5ûjÕV;宐Fc¥†G¿ôÂʱïÿÝãðí²)Ñ3oÕ‡ÅÍíªê÷½Žm‡ûä&cŽcw,»„J“ÅçÔïß›Ùwª1Rm0¥ÿò-»·j2 î˜Èцå?8“ₘ?ÌŒ(–]}‚^´ Õ°÷£XNv–)÷âÐo|æ•É`—ÌI×GÞaNÛÙz¹Ñ¸LáÃj`ëpyŒòKÕWõaM5‚E¹œòåx–¨Eëx+:ì±ô?#kB endstream endobj 14 0 obj >/Font>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 45/Tabs/S/Type/Page>> endobj 15 0 obj >stream H‰ŒWkoÛHü+ó‘:X4gøÆ-pœä’Cr»Xë°8Ä‹`D$À‡µ¾_Õ=¤HK´÷Äz §««»jzÞ­Äí]Ýæ[µâ‡nß½«þßd ?Aä‹(Åo·«ç£·_ôsÕµâÇß½¿âöžØ5âvµò„«­Xz®çÉD¬2!=WI/«“ðŪ©ðð/* Ü0ÂöQ”º>~/„#«ßí³ô@&èJèÑØMéÁÕ¦_$#ÈWà§*í9QqÏIr±4î—Æ´= $mê¯ì꫘E+Á‰ïFòbW)i©m 5´E’Ì—eàÀK‹6p}Tùºpñ˜«$Pc7)‰.ˆ§Õøð•T1UÓ]Ûêlo6âÛíª:B@fÛBM£È 4µ„Ê’³Ê>½1õ ²yMySMa#¨`ª¨àÿÃ3 Q(q½ûQ$ñÉÏz——ºÍ«r@ãüòùˇÿð´²g„gª$ô´À0ⸯSÒwªæÏÖÔ¥>Xhs~äuóž¢eµ1¥+Kèù[sE^v­iÄAc¯ ò,ª£)£X¡ËÍ9Ä¥gyçfG+7ú$4=ÔV»Z÷D¢§ªÐ%m‚÷k½~i)K¢÷{[ý x9¸Mõ¤‡£>ššÐû*qVôX›¦ÒÅ2tçºk[ª\9bqŸ Q×Ô´•ÐY†ÝDÞ6"C4q¨vÌ!¯ðZ‹Eäô°|c@Ø3k£bÿ’”>Qvj¼Æ>ºiª,áqÊÛ=opUñƒ^›ƒ+%:&Ñ;žL¼ð:‰ !:"D gcoòÚdmU?ò¶ÖHtÌb©×m¿j£®*ôx!G]·…)[0ž6y¹sG‡Å¡¦â¸ü´¯Ò냁J­€èqûs~îÊA¶m'´‡ƒl¼÷˜ ­Ò Æd]Ý«ÇÒœöù9¯[—ïúô|×G êäuR‘›f»œ«h𢢗£‚}|J;êÍ7F×Ù®k]RÝZ² †p#º#`ó!•–¡\NšVÖo#Ï'É,ÜèÜÞ¸¤o§f€Ú±­:2'üoLþ_©àm¨QÁ]F&–A3ˆ¬Z,c'¡æ]TçK[ˆÒô\½kiþÞÙÌõ W}SwôiÇ ~´™ò_dH!ê…rìúCÞ?¢Å6çu¦'F9…ý~A¯EWò2:foègÁËû5—.~%óL7{WÌq¿àòbô»3µ, #Ýëz7ØÜ&oÚ:§ôֶ̙͙‰íI}õ˜¹Ðó±‚ñ7 킦ÏzGûc:y/ŠGã¸yْȳ¢#U{TõÅxʽ±6¶}·æP±|mPÒ\?PMêEBN*]öŒ+¨Ä?ÑïŠë¨Ÿl_vȃ1ƒÙ¿ñ@ê;öåÞÅÁÄ©RÎîqñw4æÕ .2­JùèèǍOF[Zum]3'TÓù,eå™'šG²Á;̆f m]gCëm'$qu: ó8³x6$P^ï:+oÝ»@ìä-7 ï9ÛºÃxƒ­ñJïʬ*›6o»· yÛ Ò9'ðf'#Õ˜â>G£ýF’ìW¼çvÂ,|OvVÑqJƒ"È£1n住¦â«cáöT* ê"a‹¢DÅÎ{Äñè µÁˆGç+F|D+q™¡Ñºf¦ÑúËÎËÁç@!»ÎD䆣ý—Á1þ°4¸Ì¤œÌ¶‘Š€–í~èêªôÂKH1uÞPf3‘Þœ¡÷¨—†råRSnÄÑ:ž9œ›/t>æuÓÎtaš°sHWMeOµoÎ}^gÛCÅyý„aƒ2¤b?*Þd¢Ž¼þjð&S€ÉÙŒâÙ2Wg9“O:ãQO°ex»©¥|»«¥š=àB_žåGpµ,O9æ“Wœ‘1÷N÷68ÿ/À½äP`ß7“©¡vÒfp^VœŒ÷;R†Ÿ8>ô5(ìÊ: 1fã%m":?H£kÑíÍac_*Ê(nòv¸”a:òÊfÛ³ÓÿqÿÜäÙ¤7R«.{UéÉ]ÐDÇÛðö…~ækÓŠÙ\O{©oÏÐÐM½sŸ¢6Ù0Wƒ“A‹ã4ã.ý‹ºœ‡")Awúր×íj%Ñ_«íDUR¹‰õTæ÷†ba¡7YÈ  Z‘@âØŸ¤d¬Äÿħ¹B endstream endobj 16 0 obj >/Font>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 46/Tabs/S/Type/Page>> endobj 17 0 obj >stream H‰ŒWms£Fþ+ý]If`€«Tªü²—ìæR›:k/ì­«1Idè`°Öùõ×=à ±sI%¶¬yéé~ž§Ÿ¾YÃÕu£‹­Ì5üðÃÕÍMýÂXO!DÃ׫õËQÁÕ?åKÝiøñÇ›»[€«Ÿîصpµ^Âz«À‚Á:úG°>‡uøox°Ï""ó¹€õcX…>;» …/"X‰ÔÏÄh^Êí?K͝ö7Ž?"ásXd¶F[¶˜àFW®ÂÈp1^¥áôü µÏ“(£µÿ&he,Ò‹•¢_)²Ä¬Œ}–ÀŠùQMWÚŸqJ+éo™yrpyfÖ'7Ž„‰”%&s«óÎ¥/r‰0¿ð8ó#ˆ’ÌOÎ9°eë£ ÒÈ”í2ƒQû fïr³‰*é_s“¿V®]ßÍÄá2÷ÊVÜáå+£þ¼ÀfnÕ/¥„°‹Ôõ+3Ê¡=SÌ/ìW¶lCâ"?eóuaªaVÚ8/WöXúˇEwNC?KÒW¥¤?OñþáWbÔ˜‰×ZË|¯6ðpµ®põ¯b·×HEËÐ(‰EXMŠþ¬äF5Ž¢³„Æ„ŒâÀO9r}DÉøÿ‹È…Â0Oà"ÁP’!”ß䮨¤.êj‡1?‹™}÷ƒw[h²ý;,V,å^œ,V±ÇáËb%ëQ"ûó®”Mù2 œñÌ_GŽ€Í›â©¨vw¥Ì ¸Ìe0“¸>´‚¾ Zcù)Šó+²nãxzg·àðZü©6þ#u›¹ê&£êºž:Ö!û®[ˆVß5ä7¬j^b˜K 6Ñ7]©L½£Ë÷­®+ÕëÇë^1wÏˁÜ$nŽàEA” { c-+Õ¶ôfò0ð$5G‡)ŠYÚwórú°päÃ\ ’ÄàË»!M@Ù}é×O|Û…Hü(qêÙ¿¸a`ÛM…dé¸ñÞëÑ3½g★=wÝ` 1^øo ™ðPùy–ºGˆ2jx\P[È">w ‚…öòYÁFiÔ©wU }_²‰ ôNE:6Ïã“ZŠJt¥6y8}Ý+ÔLI¥íñmJ‹¸î*ìÆ!U™/‘l¥ôP–ˆ×u'ñ,ª-21hÀÙ7&¬JO"s2‹X¶iÌ¡§Êu- •ê´ýkyٝ»A˜¾jÔrP+¬‹= ?mñMq´31áI„;\‚אG|k€™¼ÇðŒhUí$í5ʨ=«Uy}8*]艩šcS´ôå¯sÏ$vÌTƒÛ1¸û?ö ÎmïB™ã±QåY¯±Þ§z_!Ÿfĸ9Œâq?E#û(í–xØbìÇn¤yð¾TŒ{ƒƒÒ˜Š¦«I| Ù™‡‹sÐÔ8çšAFÐåŒÇ¶é =]ÂàlĜˢ¢# ÇÂ=GÕð…ÛÈü˜ ß$â˜^cÊqVSK’ß½$^b])¦“*Kª®sï-shÛ†$ƒ>Y™1WŒfšjHðûx§±¨›Uò鈯J™+ÞHä]êeûüÊ9“Ì™ìé’tâ³­Ìû>/Font>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 47/Tabs/S/Type/Page>> endobj 19 0 obj >stream H‰ŒWkÛ6ý+ü(/lH=]&¶³H7AãE±˜éF¢m5²ä¥äq&¿~Ï%©‡m¥Y“Ï\^ÞÇ9ç^¾Ú°»{Ý•[™wìÇï^½j¾°G',ÌX”„,IcöçÝæå¨ØÝ;ùÒœ:öÓO¯Þ¼fì۵ìn³ g›-[~ðŒmrÆ_ð a›3ÙF³5ðoÍDùq÷I²öCüýÀ¿8¶† ¤úW–œ;ËPË™&l…ûÃ+Ÿ‘µäqØ[Âý¬Ó¾¼øC:dN^¯2Ÿ”Ó$øYZÙU˜îò$~„s¨yšò+w±³ä1¢Lf}LyÜW“@$PŒ‰éÛßåSvÜwÌ÷ª`w›æB¨mvŒ¤ªRÖdk~U²PºgÍS[ƒGåb•xZ›ouW©¶e­’kYYçe¡j—ƒqÖ#>­x8w#½®aRkÕv¬Éó“fç²Û³-.H=Ívzð5¸ŠðŒ÷½T²Cr[­þ{Ruþ‚ìd=Æõ-Í[9#ù=”¤8å`¸XÅÞñ¤Û“DF$’÷û¨éûÃgïäÏòY-'™÷"—­-†[Þà–&4&ënʯ'­Ø“ˆÒØOÞ§§Å’}ÆÑªP,Qíã˞¼ÕQ…Ï®ê2¹#3SB\w{Çœø£¸k¨—CŽbŠ:úe± ½\«ÈëÂ#lÛë–ŠyÊÉbošglÁ  Æ›Ô]Ãň)ºhŠ©½lÙ'¥j¦UÞìêò+ú¹m4z˜Ÿ'ý²deäæ ¤¥ì ouÛJ&3­ü$;ç¼FÈոĪ¦Þ¡C«ˆÇÁĸºÔ¤ÉÀ€(%¢—™{]~mj9'Mýä SS_L¡°Ç?{ö¯uopïý_ú›*²rîÖ¨§ëÖ’Åøðo8ÅmÞÇ Úq{Ìl-¹)hB‚m@«À§~¨›®¬wFê@Âý$„h|¢Ëùg¥QÈ= D˽v¦ÃÊ0A:)ˆ~—ˆàN|dãEv¬PÔCejñ¶ÉO-.èl áÐôÛrü¼/þÆ«¯—‹î7Ûm™+ݲƒ|q‚ø x.ݽàÚSM™‹PLâ¤}J 5yz›âf¯#­*ƒ¶#`­ C¨š`¬: ù"NY²êSeZ¶kž•®KÂn’˜èÒëļö”ïýavàEÏÁ"Ü4hóš üÊÛ–ºí–sýÙˆ`

'kÓä>“œšY'‰ýúr„¿G8ì3Lûi9zZÍõ"»(FÏ‚È=pÝùÉ»•¢¥ê:*OX…%mþŠ- Ÿ¢a\µ ŠXŒ/ibáÉ7¢øúiêœ\­ôZ0vl!ëvVòh®6£}Ô*†­ï‡’ʺ3ó—¬:į>#ë'À}œ€øC¬”ºa¬j!œ®/ö…aHÌÔv«ðè4jÓæò8lÄ÷n¥ýf×Ã{s¶m>/Font>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 48/Tabs/S/Type/Page>> endobj 21 0 obj >stream H‰ŒWkoÛHü+ó‘ZH4gø¾],à8{—,nq‹òÉ #rd1‘Ivüï¯z8ÇÄ8›‰MQ=ÝÕUÕ=oöìæ¶éŠ£Ì:öË/7oÞTߨ=#æ',ˆÅ!û|³©»ù·|©úŽýúë›·wŒÝüëƒÇZv³ß{Œ³ý‘íü„¡‡)gaœº"Mã)|]Ä:睈]§øß ø2>Ly"JèUz3á‹Ôé-“„…:ÞðŒŠ üùFöU®¦g‚í|7âb½2‘bêA/_ MPòWÏ1µÁœ\kpðÖ3 G^¬–Ç ^ú¶¼d5gËî%é4YkgZ ÂxŒÉ×q0‰ú,`¦ÔøïedStŽ~#•xLåOùP”²+ªrLG7Nše÷Î]Ñ)&Û°ÍN$¾Æ›]èøìãf9îfç;ìƒËþ‹?ì“# ÇO¶ù¼ÿÝdö'¥ôÇÝû·°$_n{çqÝ;ázILTˆÄpêꢤœª#ëNj;ì®ê›n=´X„Nlh¯9W "Ðf$Ÿ•¬é¨†åªíš>ëŠÃY1õTäªÌ”ûIÀ# lX+¬uf=úâ\ltù>w·æmoz{ ˜ÃdÇâH dG¾;ëáTŽ?/g8egm„¸™¸ž¯&}âþ„l¿uªl‹'ŞeÓȲ;«¶e­’Mv"ïNÅ£:ã\ѲSõ¨X^䬬ºk?‹}߈ΰÿ-úq,:ö\t§¢D?ŠÇeª&ÖlÙAe²o£7d‹˜›]ìt¬T*»jèÙBfž¯Ízÿsê¦ê˜[EM´ò¨ºj¾Y7ªUÍÓ¬¯÷ÌõÀóWûp1LGüí¬jYŽÝÝà“›˜Ãf6c®v4\%¨™ns¯¼wþ š³´­e$´³ìT³e€]£¸¬Ü³žážoˆ¹ÕíÇ’ ñæìC')V·ñÕÚ8ó%ÁZ¸ñžH;´™2O«˜‡÷ÝÀ7fáüUв­ÊkØ/çtàúpy“ê–øü#±7™“Œƒ;¶˜ï„ù½#xçáiìÚlÉ,¬S bY×ç‚Hˆ§øí¬CLžêIJRÅrÀ.­˜"˜Ô€ËóK}h(SEjÇJ¼+÷NV•´KÕÏ$KYCËð$¥áÖªºpÝ@p‡Ý²º:C4xwf‹ï^ê“*Ž,ýœÝ;ã5v^Ø@bm€4z’¹M,g¶çHŸ;Gèv9yS›¹XÕUöUuTŒŸ¦Î;4«'CÊ!-̞OJèúFó/Ðr¶’Ù—µe²n{ÍÞÈ9©¦*J—­yÕÌ¥_Ò±°:$oÂÛâŸïÌÊdÁÝpäî°FCnbi¯û…? íÛºVòLM-³s¯'‘‚šÓÒ SX{M®gI}i¯¸5®Ý|áK}Ù( ÎÈQKcrôÈÐÑó²/ÏÅWu~¡VŸä“š°¿ÜÕ­¶ÑEÖÀ²è—A˜L2thV®1´Þdañ$Ì]>Y`K –ʂʆ˜µ‰"ä‚[_Aª‘S¯»Púºqo1h/®sÞ9d-Ȫ=r…D¾ô-ÔJfLkÙhG•̬´ ñÝ[Ër݁ kaKÊ ýÌ”wØD+b1¨QÇÐÕDÉ·xBr.XÈÒÄ1J7A×@ÃVüL¶jw ¨_vô3“ù—ž~Í‹ëùw €û(aúڢͫFý¯/rÝȵr…Eâ±(Õõt5×± 5'1eö|R¨¦az¯k6ÂѐÓ#EOôazQ£ßJbÞHÊAV2û³QÜß¹&— xu=Æóé÷ÚÑAá‡ðÕÛv¶à¨o?Áÿàæ›mà› eHqn™õY‚6`7‘á¾û¼èp ÆƒEÚNN½*F´®n~¸6. ¦ä\å…4èêy+°(bH’—ÒnÁíž.nArS× n/™á0ü燬ZÙ

ìã!I`uÓÁje #2„«k\Vά!!˜ ^ègÍdgQoªòŸžäÕ;¤få,2ìÝVǺNJªÝöÎw]X(Cq«öÚ‹õ ²gd‚4Kò¬ _½Rmѹ\+ „1Ä \@zRÁcâÕ¨"= +؆v¥:c}×$ ›P§8®~q"êi°XÀÝ‚¥H›ˆmh«Y‚:Gi†øsóøbÊܶ mÀüq× E¥ë[¬©B Ö¦”FP§=Ôç~5ËöåA‚–GØEÞ§È|Š"{ÚàlÄnaɹՌ¦y6ÕHr¨wPcÌ´M¾Ä”ÚÔZ£®`ÀŸ¶ªì1|)>ËÜK|§ÒŽU«Šc9D팚 ¬pû*¶(3WeÛIDÐªÚ¨Æ#Ԏw&Òtb‰©÷Ùt{­Ë*D^GlWuz•Ù{ËV+kxÑòö‹Ö0˜«¼³È@L‘‡·M†ï°¦ã qZX„æ’#~"FT çd[Ÿ`è4¸LBo¬ÔAUº=|SìVyÙeä*D|ò«^çâfgèG$^P v4lÊNƒ%Á70€ÊõÀovÏ ˆø|…b¹QŸì–§è=B–8Stç¾Köœ‡íŐíÒ Mÿ-RÃär½¦ î}‹êׁuSﯳÖõY–z_º8Ršô²ªŸ£êÛa§qQ"EWÈdÏGã×X03œ¬‘a“"}eS÷8+ÐL‚ñX•u:sÞ©oўí5Óƒ¤zx?ŸÐ!V¬#Ik6ϬOˆéŽ‹:„®ã4 Ídÿ—¡1¨ºùËÜÄœ>PH,p˜€½å¢`&ñ endstream endobj 24 0 obj >/Font>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 50/Tabs/S/Type/Page>> endobj 25 0 obj >stream H‰ŒWێÛFü•óH-$›wîl'Ø$XÁGAf‚EØÛ–H†—‘õ÷[§›¤¨‘=ˆ(¦ ¥0(N"úën}ªÝýGžª¾£|ÿÓ¢»ß{´kén½öHÐzK+ÏõߺÇO|sŸ @1­R7ôg ›Ÿ/ëÆY$ön?ŒÅe|ëò1JŠy‹éð‡üf†Á«•97 HýÙ™ˆŸÞh„͹ӫ ìõéÅ«¾æÉyoBÆ7I|»#Sa›)|WWe0¿Æóþü‘Ñ=gÅ»®“›Båôp·®jºû¬wEZX¶„‘`DZ1è’NtùEÉ\5#]n’Û“#ŒèN‘lÿI‹•ŸN”,V‘ЋU츋UàнKÿÅzt|O„ZüµþͶ$“²(òQò„¡ûöðOµ.ùêjK]¡‰Cª¾éì 6·ß9©~ý "œÃî{lõäÌå®"Ù4ªí(¯6]£K¤U×{­Z£KBvDœ%8TèÖ"uJÚ¨ýžê¢*U»¤c¡7ÎTç|‡ „S,{ÎYNY©íùCªUó,[ý¬ˆk*ËœtÙê¶SeGµDP–\êý‰öz«P!ÙÍjûB‘¼ ê?áT“ê¦zVÍ7J/V‘{z֭¶Mu ²ié`»©Ê;ç7s¾GèˆŒW¡3å6èÚú8\–¤uÕtn•ìúFq¬EÀ#Y.LWN.Ñ;jœ‰©ÙûK œ Ä¡[,P‹ó©“_Ui£å}Ö{M¶db-%›Ü€oç#wÕ¿®û‘Féu$µzWê­Þpù¥jtw2áÈwÕà‰¹‡dÞï»–Êj±Jœ#UÇ’·}¼Êj,f\ø©s¯(-½séþ »bI¿«#}V-2ÀÐÕ,ñ•›Îht™Æ§c©š¶Ðõ£¡àAÈþ¨s Ò>:¿õy´$þõqÛ#‡~~F­öªmùm5cÚ/§ºPå}Ž”óGÊ9«³Úœ\0rdd` RÀ3ÊØA¸°¶ÀóWEöVÚŸ¸THpÁ”|πm “'ÚB+«Ôɯ+}?º¤ºªû½4Ýlu¹®2À± ˜j(‹‡$K{ï“BaÎЇžkè4UºnA%œ`ª v–$ð¿È"àAb|°q ~‚AO²EÕü¾q4Gb$šÓ©MQVûjw¢GB˜ªô³|Ú¿˜ÔøÐLUºqŽÒ¥èKÅ“ éÑ4 WÔÓðdI/‰b5Ë0›†Ç‚+s1›Wgy÷Ým§E¡Ìµ7ggB{ž?¸ ç+Ëß‹ùÏÉES`Îçê úX•¯Œþá`x@oÜP2EH[ç*wéŒÃ9ŒÅ$«Ö` á&~2óλ§–%úP5,²8¹U´ëu.jF¬XÀ¶]îH5rijT×흘¸;NË=:ž+hÁ‡º€cVê›:ÔÜ՝æb3£;žæÕöJú÷ 0SˆG°A)ë¾Cú»×:pràeðtÂàond±d´ò7g“ß n¨8"#ò¥ù(W»F)Ý]w¤²vMÏhìëŠðëg¿.JÑë¢ßèædc/XÜ˽‘4ŒÚœÈÄ;äYq±_¾=×bpoaꝫ]*ȱHÀ;Ð0‘U7#˜;ÝéëõŽÇuÉÕǤ¾šóð×ÑË2Cë€èYë>²‰¾ÁŸ‰>‘›eãBð穤v—D²”‡Û"ËÐ DèFq:³¤{͸XM?Ã@7äÍÅžÓo Â«ñf6ļh:'X`ðEñ™8$Sºã"p*jtûµ™ˆx h0cLR˜å£:°ºW[,‡ŠËÉ›e™ê7£„*[mßD»á}&‘)>]Ù/å|²½x.Bð‘­m“)èîνÊ5pf'Œ]ßYliy(+”ûPËû€ºö~±½K)²0žþŒ¿0ÿê$wNOö‰5¦ŒaýÝ'ïiÆLðÚœÉõ âЃøÌRÞ4žn•c E"v%‘б&ÂnÆÒ õfð¡Ó:Uû-0ð\{¾cМ%ÕQ=³C®÷Šú,Íß½|KÓy…^ä"»¥Ÿ¤S¢‹út@©20®UÓ²ö£mÐûƒµ;{Ý ;Õ0rx=1#’ÐõÏkúŸf­Ÿ/ endstream endobj 26 0 obj >/Font>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 51/Tabs/S/Type/Page>> endobj 27 0 obj >stream H‰ŒWkÛ6ý+ü(/Æ‘zEÉcÛÙM7EÆÅb1éZ¢ÇJeÉ«Ç8Þ_¿ç’¢L?’ Æ3EÞÇ9ç¾Y±û‡n¨6²Ø?Ü¿yÓ~eÏ

è ð1rzԍ(O½D.ÙÌØ"±^#ÁXjèÒc:Ônγ ¼.”ª+$ÿ€u¸5G¶oI#*I˜:3lq) oÛö ^UwgXs²=ïWìÿ_$ endstream endobj 28 0 obj >/Font>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 52/Tabs/S/Type/Page>> endobj 29 0 obj >stream H‰ŒWkÛÆý+÷#U¬¸äŸAÀ^çÑ"iŒ¬Œ~XňIã•H•¤,«¿¾çΐ%ÊMl`W+rîóÜsϼ]Ð㛺5kU´ôý÷oßV_é%Œ’EIBIÓ§ÇÅù éñWu®Ž-ýðÃÛwOD??´ièq±(¤Å𿁡 EAüIF´8‘¤EM9øŸû"¢$É}™ÐbOÍŸ)”¾Èb¼±Xuß6 ÆßÖ,[œ‡‰ŸD)~ûâòÜ}Kó$óódtŒCŠø¬.ˆÙBøyfCrŸ¤~”"éDDöô~t:Hº„’8ëÝqhÝÙ(äIDW!óé̝EœòiÍá/ˆnÞL†7sëÇ•`.ý$´n^ðn(üü´øõÙØ#2ŒÇGîYO‡,†8ä$}QˆÜö/ yäg\Âw÷Ì…É•çÁž vkooñû¶Z.Ôðº†i6©aŸf‰ÁY䜉›à;ôÉL—¦Èå­k3ïHÃΤÈ2 ÇčÉ>ò ÏÃÁ{x×ûÐìÌAåO‹ŒÔäÍ‹â䣯öƒLCÍqä§ÖÔþNA”‹{XâØO3L¶ˆB?’´ç} ìÚïŠ÷ε4Æø“}S³KcâûøËÀ'·ùñ7æ•1½i[Ul5ðô¸¨ôø‡Ùl[’ã©(J˜KU6Õ/Z­tÝÕ]Z Æ´E¨IÆSþµúXD^ƒ ™¤ˆ%by¯6¦T­©Ê!!|™wäöâ=™V“j¾£Ù\dÒ‹ÓÙýÿè£'ÀegÓ ?˲”«šgü÷ƒ)Ùuµ¦v«g©GOÕ±n—Û{Nê·§¿¿‰wþ%Òì¹| ÌŽà…Ûªœ%ž¦B•¤Ë•*7èFYQUjÿ®g1ö|K¸WTû^×[uh¬ŸFí5í-"¶ê‹¦¥Ö%¾4«.]*ÌFÕºmõípž‘ãòÑнxU¼R£ÍÑÝu]íéj6O½¥)›ªü(„h&•‡%[ù0òCðC×S:TÅ«n}â^Òï%÷²˜Í#O£É)nÈÚ¨ÊÅàÍ¢˜wÇñm”)ZQ•m]íú,9ê2­uvR ˝yÕ»3žª9¸ø;OBÆÝ\wEåÁ.ªãn动ŠB7 ¼´@KgݦnÝê²m|¢·x%p,_ËêTN’HD2ò"œ—ÃöܘB!ðåg]´ íÕÙ­v'unF»"Ì„]q¥”ÝZ8T¦Ú4¯Ícj¯Ðßš¶ÕéÛ›´;?ÞN͎qó@«cmʍ­#’ƒeÕî«æ°Õµæú**ŽM[­¢Vu­®Š»Ô‚8²E]ü¼ÅVÍ5¥ )t ɞ‰ZOüx=C›Üàr``ô8JÝ2È°GZ‹˜ÌÚpøیzÛL®kYµdVè™YŸÿjÀ

%PDF-1.6 %âãÏÓ 1225 0 obj <</Linearized 1/L 193818/O 1227/E 55509/N 38/T 193247/H [ 499 459]>> endobj 1243 0 obj <</DecodeParms<</Columns 4/Predictor 12>>/Filter/FlateDecode/ID[<4075CDA26B7A7E4AB57B2401C42AA29B>]/Index[1225 30]/Info 1224 0 R/Length 88/Prev 193248/Root 1226 0 R/Size 1255/Type/XRef/W[1 2 1]>>stream hÞbbd``b`^$[@D$`­± &3¡RrÄI0ϱvXÛ@ÄB$Æl$’¢€D Ð¼ÌÀÄÈd100Müÿ«þ À&Ã2 endstream endobj startxref 0 %%EOF 1254 0 obj <</C 564/Filter/FlateDecode/I 586/Length 363/O 548/S 481>>stream hÞb```¢rvs``f`Šs<@I0œá:Æu‹ó/k!³*S+Ó æ‰Ì*Ì",ÝÌÏ™û˜w3g3og®aîbùÀÅRÊü—EƒÉ™y‹s3Ë–µÌY.qleÖffa˜ríþ¶Û¹@´Hþ®mÙ $#È»Ž£í:ÛÄÆYŽMÈn–r\ǓɶÃp‰\‡³É¦{®³™4ÇH\âÅÆ]ò$m‡ñ’YÎMÊn¶ò8[îizp®Êu`àt0p40€ “Æf0É&!ˆU„†Ø ê3$4À$y4€Œ³³•ÁJAšê"@BÔ]`hú20‡-‡Äƒ((xMø¼x5X äR–2f3ó°qpgˆmP¸á¹‚ ¤†™‡ež$ʃ˜LA:ÈH30'¦i~†ðÕð„‘ÂÀ|b'T7@€]Ê–Š endstream endobj 1226 0 obj <</MarkInfo<</Marked true>>/Metadata 98 0 R/Outlines 108 0 R/Pages 1216 0 R/StructTreeRoot 115 0 R/Type/Catalog>> endobj 1227 0 obj <</Contents[1231 0 R 1232 0 R 1234 0 R 1235 0 R 1236 0 R 1237 0 R 1238 0 R 1239 0 R]/CropBox[0.0 0.0 612.0 792.0]/MediaBox[0.0 0.0 612.0 792.0]/Parent 1217 0 R/Resources<</ExtGState<</GS0 1244 0 R>>/Font<</T1_0 1247 0 R/TT0 1249 0 R/TT1 1251 0 R/TT2 1253 0 R>>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 38/Tabs/S/Type/Page>> endobj 1228 0 obj <</Filter/FlateDecode/First 93/Length 1051/N 10/Type/ObjStm>>stream hÞÄVÛnÜ6ý>6HÞDоd㢵[xº€áeM{…j¥ÅJFã¿ï̐º9»ÞÚ}(„‘†9CÎ9¢TI“*1ÌüZ&¥D%e2ÍPqLjI¼LŠ£Œ`JjšdJ;´Å”S¤i¦Løé?þ¢ø©¿ÏË–ÿö;»ÏËÆƒrÎ$ŸÅæüœ‰Bñ«§µçŸ¿·_æmÞzþõärð­×aðááä˧õÒWLñf/<Óá{‹Ëåÿ\-껢zà×EuT5Eß>-îïýÆWß„„»Œ‹Æ!‡‡qŽY]µüªXùæà²^åU?"ì:ΊMӞ,ó ü×<ªÊ>üÖâ¤8³äWõת_ž°aý’´Âuq×.›ÜN FÚÖÿIpýD8f„ qÐNS8zl(d³ ›Ä›>ûÇÒx˜£“ê/S’¥J1kSÒ¡±¤£PPgÍE¥‡¾¨£½³e0§c?Å 1P¾6£¸H‡q¨¿}ÎãØ£žnÉ»‹q¼'_ÔqÎöS¡_“@<°‡‚ÞÝj8JŠgÓ†È ˜;zP>fðîò ØMp&G4dxèˆ‹jÂR¨‹Iª}Ê£õS‹iÛ¾õ„¢ =GŠQF÷…Bý2nˆ$ÎsÁ$© ɱt‰v²ËŸ6Þîž7³?”-‚koëï a\;Å&û@qKœsÔ,|ÕÂ~’¯Ï|ñ°lé考é@IËgeþÐ0{×ßo¤5ì@‹4R·ò–¬³|U”O?€ïãæ‰Í˺.¿Õõ_(½BȺ.ò•翜ÍÎÎOßG·Á‹FÌۍoK~QoVyI]×!T(þs›—Åâ¨z(=Pâ¼õ«?˜K¶ÃL6ź­7üÏQ†SÎݹþNVxX«g넟æ×´4r èÍ£§èÆ ?°íâLáqDäS^=«„‘T^ÿBº2ý3)TdšÈl¨;\`9lc?2œ“¦o‡¬Ô"ò “hÉh¥w 1_šô7:€OÃ*ƒ1™&€‰ìŒŒã£obû‘M‡xñ‹’Ðê¯yDJtå²#ËÐ’¹1Z`žˆmð¢£_‡¹-³«õCÀÂ+AÑEؤö£szt¶ å…õß#žF©—A£Å~ÐlŒð.ûŸPº(¨ghÁáŒá :0Ä~×ÛП)»eþq)c ÷€úñ/¸>Ão7^]dÖC€1©[—Éײ¼1.Ô­ôOWvR·tSeþoF·ÕwC…’Ôÿá¸.ïöeºƒÉ¥ûëqËjo-A5-Ag^®ÀDí¾Zÿ×'ܐúKd¼“„úô„OÑDöxˈWZ¨¯æO endstream endobj 1229 0 obj <</Filter/FlateDecode/Length 378>>stream H‰t’MNÃ0…¹€ïà%ˆE—6±uÓ Q!~D½cOJµ#7]ôöäM АXd”|óÆ™ç™lµYoBÛËì9E·¥^6mð‰ñ˜Éšvm¹–¾uýù‹£ÛÛNdCñötèi¿ M”U%²—!yèÓI^ÞßÝÞ=¬¯Wúc:mÝGŒ_uŒŸ×êJzjDö”<¥6ìäåkþö~†Ûc×}Ñ~(’ŠÉr9&V¶{´{’Ùÿ³RÊ|lÔEO‡Î:J6ìHTZ-eeŠ¥ àÿä¤ÖcMÝLÅ A©á]TE€ •Ö(¡à •u9@>QhÍ ·3•VÜÜŒ ˜ÌÇ3€bè£,”v¬0†3VXËY0¨êQa€cÅœûð~Ò:œsPyá༜Ø7|›jàܜݖ0jÎæpA¾Ì|R²'Šæg˜Vìwìî˜Ò0qÞC^» ô»ª]ìP%‡Gˆ‹oàoÄ™ endstream endobj 1230 0 obj <</Filter/FlateDecode/Length 238>>stream H‰„±nà EûüÃS¥8KË‹«(V•¶ªÛîž]TÐ3ü÷’zÈÒïrÐÑåuóÔX€¿‘S-èÕ„³[H!t8ËŠh£Âõ–w5IÏx„Ûu85¶wP–Œ¿Çp´Âîùt<ûmXhmÕ·scçÜÏCähÔ^܃ƞñWÒHưû(>¿®Ãvñ~Ä)² ò¤ª.A}–þENüßÿ3P\´•Ó8{©¤•QAù(+†VßdÓõ7¡"žó—%<</Filter/FlateDecode/Length 486>>stream H‰lSMk1ü+:¶‡ÕJ²ü!Ð×B¡ôVßB!mJ!%}¥Í¿¯lïîۏ²{f4iOÆw/çw÷g¸ºO§ç¿pÃ>€€†=܎åõç7?ß½>ÿ>ÃõõéÃ{€ñã‚ï¿`,…€¡<À@HͽB‰!@ùÊd û21!#”'xoË#pDMÉåëtBM£ÒÉîF¹\·B*ˆ1§P¯UâŽ?pÂ`¨!2zZßV›¹ÛdvZëD$i&ÛFaL A"º‹ÑKY#ºÔˆƒAU¸Zhwsñ(÷GÝØÑc®‹ãl½-ŸºœŸä‚r“c¢r”3°_GÔ2pq ÛQgcŠùÀn/ÖJÝúØÀŠj‡{¬õ“Wý$^hfËh,HY×Vv0%T±sߝ8óå¼ÌÛ@/úý LÖÒÆë;"μ=ŽWÜCU  9­kìõÔ¶‘Ñë²À†ÅKV6ÂNÑÚgܐ°¶}K’ÎrÔGIÐ9WcµïZà&}×£8c²ÑÔ]cIg¤Ï-ÚÓF½_2h¦›ÒaÒ碹­g¹6?­‘½ê•ÜÇ©áåç«c,qÞNð3Aâ¬Í[í6ò¦k¤ÿû±©ýšðO€®4ú/ endstream endobj 1232 0 obj <</Filter/FlateDecode/Length 641>>stream H‰lSßoÚ@þWüx'‘ã~'™ªJ¥EÚ&1&i¥^ËMtAÄúßϾFÉ9ÎçÏögŸº(s¨i'œT)¡%z^à‰Ï¬1x<¹ÿö€Øžƒê×GåiþÈ{Á’¡J[ªFîgÎ×qÕb0ÝÄ?ܱÈÖðÌ0ú˜ó³•ê¥/ò$©3ȎËqN<½¯¦£ñ*žål<›Pyž9†OŒ—]¨¾‹nýüiæF8-ÜF¯ËþøADëu½Ø“±»N¨?ÉRö·ÁØ+ºeÒ‡mºê`ïS®Y5æž}ÁÛ¥¼f¿V\9¶\I ¶yÉv¯Ýk¨éŒ‹5z† ò|p• %÷èOè9[¡‰ãçEö¬ié¥>DЧ¶¡cË4Cv¥Y dN$q—º>/QÑ]`…fNGúE’-Î6goØIÁ^¸24bÙ©!jO²€e“|d‡e©Õ&ý8ÄvEgzcr‹ØšŽ€ßƒÄ[S‘-’Q:‚÷p Ðl0&åêÈS@´õŽ*ܞZüþ 0ü$û endstream endobj 1233 0 obj <</Filter/FlateDecode/Length 566>>stream H‰\”͎›0…û¼ƒ—­ª _g¶„ØL7YôG“¶{ǘ©üÈbÞ¾>˜Þv‘#òÙF>ŸÐÍŸ/Ÿ/C·ªüû<†k\UÛ Í—ñ1‡¨nñÞ ÕtaÝÿq†ÞOYž__—5ö—¡UUeùKZ\ÖùU½ÿÑõqùô2ö~ø¨?¨&¶YþmnâÜ ÷´J?íðú˜¦ß±Ãª4“ºÞž¿øé«ï£Êÿy/*EÛuÂØÄeò!Î~¸Ç¬ÒºVUÛÖYšÿÖTqÚÎÜZ¹y?Ñ6uÀ¡=ƒgŽDNx>mÀ<áùI¼ãp ((J,€À8<€àp €F€hÚ¿€ ‚„‚ Ž@Ç ‚ãPAÂA $|TðAPAÂA $|TðAPAÂA $|Tða ¢dm:=gU‰E£IÀb‡Ñ>@DZ²8Œ&|A²849ÞYiG€,Žô޲l¹Üà‡6wÀ ‡Ñ'Þ7š pÑvàõpáéÌ÷€ŽãêhΡ©„‹æVÔwhî´hîö¶EÝ^‚z¹³8‚rn+—>¤ÐËmå>‚^†¶#èåör€^n/ɽÜ^Ž_Š^N”sèåör°îЋ#\Ý‡æ‰rLLÀ·óœ&I\˜RÝß&é4N8¥Ò/ËÞý`_%c— endstream endobj 1234 0 obj <</Filter/FlateDecode/Length 599>>stream H‰lSÛnAý?U3Uv˜Ë^¥(…Jš†‡ õ…EÙ vѲPåïcÏ¡(Çöññ±gìH!¥ŽÀ.ÑRq¨Àþ RÇ`‡0gö'¬„=Ù;Wl³áJ²Eq@/ù`ÙÔÎTšuUwà*b]é"5Ù 4ƒžÜ°–À  YÏXç‹£ÕPJE¥*Êq0:Áu"¦(uÐrd…³å‹c/(»¬ùûÉ4‰—©t2íwT·kK¤lGÞ^¹Ž‹wD:ò¼•0ñi ý¶;´<@çÁÑ:÷²"à¾rz‘Œ­=îR|KŸp,kpØzéc¨ù:µ-«OJN““ä7wQ3-yJã¤xÏZ(tíÕ+åÕKÊŸ³Y]uåŠöÓnA;;Á¤‡9TH(W J–â-ÑĸGlÅþ½e’ê‚ 5a”0qâ1sR×b“MՁ­¶5Œªƒo@ ŸÛ×]¶@ÎA#înºòú,&ƒilΠ¥Ä00å1nO=Z݁1 Z§æã@ïîï{ãÁh~Ég­þœ‚N.ŠŒç…&?*Âo,¢¢$ÔÙ–61{äã/xgôÿÈÃÀþÌaök„g›ajû6Ÿ~ÝNxÕε|zš§µg®‡tš CÆ";uà.ðfCO•.ä×љÕm[I‘¥^š³t “B¤•PTšMFÏùï›ÍKB²ãÉy}ƒ.£ó¯n޳ôŸG/œA°þÿÁ‡C©7 endstream endobj 1235 0 obj <</Filter/FlateDecode/Length 626>>stream H‰|Sïk£@ýWÞÇõ¨wןP ^’RK‹ÝÞ—ëqˆ1ÕÃjPÛÐûëowMHZè!¬Ã¸3ï½yãååìnž,àãêêûbØuÇ…, #îCîÁQO0*àF! _ð“Ì—™LÒ,¶ld‰eû2…¼Ybž>Z!É,N$ÒkÄ÷÷Ëx¥£y¼J®ÓlÄÖ/y«Új$ Â…hŠ\P/<¡‘KþÁL²ßêääIñÔ”‡ÜÿéG>e"à† =è¶×éc&oÃÕ*–K,’™%s©;MO¸œº|jåŸø|ÿˆÏ>à×£nx^¢°~$IºFº^~)oy§Œ™Ýãò`Vp4ë“nv„\ÃÚ,¤~$`sʘ€Ü(ÃÖOœûL{&8…e< qoÙ.yÖÇ«eRnïL®n`„GàŽ)rUy°(óÑbd£îÞš¢ÖTZ6#àÞé¾>¾ÁØýYJøaïŸG¸F§B(Œ†ÁA@ÒjXœéº=¿À®ë±îÌ÷Ò0GV7廉öù€aì,;$»â»í¦9FäÛmmáÍÈêš|êÅå«f>mÖaÄ,äÂ,…æÆ'fûª.*”jVofíøš7Í;7v¨êaBìûrq¶üº›1Œù4tÝ€t-öe¾ëÚE•÷Ïå@¸E§™–=ŽË¦5®«…œ\Ÿºœˆ –ˆò)Wᄄêöy궨7ЧÊCô(Ǫ„¹Ú—g¿”ð¢UïHU!Œ”í©ÿš×F¡©ZnQ6 vU×–zÑȶï^&tå¦)èþç߈À?!O endstream endobj 1236 0 obj <</Filter/FlateDecode/Length 622>>stream H‰„SÁnœ0ý•9ÚR ˜] HQ¤&©ÔVŠT5ÜÚ,˜7o¶é×wưl{h#!˜ñØÃ›÷žU¦Å¶‚D¥yVAÓÁW1j&]û„!™TšÁív¦Eºmqš°cwÎ?ë`œzíeRŠA&¹pAÛ¬“ß›OðþáàòÃë8 }¤ÀõõåÃÝÇ{¨áææöžŠ"‘͏eß絬²S=ÉÒ,ËJhZ H• š#d84÷;º.¢ð8¢”&† :Ð?ƒž¦÷(ŠØ uµá˜h¥Ú#U%´T¹R] ”µè¤*×j,œ‚æ&~ÇUÏ«Èûã‹Ö”€žãNËQLÓxÞ­'áÜ!bGßΣ«MQ3âdýËØbdYgèµí'ØüÿuVê ¡óS=›/:_å§YÖÙ¥‚tö€?õ³±‹êã@žû–ç9·Ÿ)Û¬]æár}y‚Îô&è=´Î$ϧ·zB&Ý £öMÃ6¦¶|U§u¾üä£nÿò´* Tgݨ´Þ”èÚËdK~¢—þËÈp–Ã^øc:t±7¾„K‚Ñ’’œ†“÷ÏvR…Z„ÏòExÁšïÜÁv‘ÙÇ@· ÚAûž¸þböø <</Filter/FlateDecode/Length 601>>stream H‰„“_kÛ0Å¿Ê}”FíÚJl'P ]:Xc3ìaÛƒâ(±†- Iié>ý®ä?Iè /Ž#É¿{νGõ#diƪê¨?ÀOÂé’(šäd_5ÍÉñÐz˜×A¨6þiÄpDàEâÃ;®Â_ G׏`,[@ÝÄRë<”Ê«´XVA½ÃšÒÈ^ø&ñú‹1æàÀÕhEzÑo…u­4é¯x,Ê“‘—ä)˪QÐëg¤{ îhŒÎï:š”hãYî„:C.'d±%fÅb’ØŠßø–{|0º“è´å¨|ë¹TX$¢"‰MfÙ$.‚¸¶·º‡V:hDׁ rZš0¢•Hjä{+雸 4úhß:Gxe–ižÍô€ždpŒ^{©ÕФ"\í†æÒdAà…;øÏp2V‚æIp£Õ³l¼Ø¥c«ŒÞɽ¶JrØÐ¤À¨,ÉÑzÐ{¸3Fðø~/m¾:¯¶û¼Z.¦ö ¢À/:…|A(™åñy–&!o˜Bgt<</Filter/FlateDecode/Length 599>>stream H‰\TÁ’›0ýM'd€„d{ï¡Ó33{H÷à5"¸6c›Mó÷• Û=@#====( 1Pì‹SUAsƒò´¯ª3д ºàGxƒÅßUUE˜0Dï@»œOÖ`Yór(ŠÃU–õCå+V^î«â,€©× R0õÞ!Üt„€í‡uWç!Ùi@”ïŒrQ`ôåµ²RÅ…‘†èç`l‹.ÙÎb›½5¿–9N\Ö|EèÄú0Þ¡÷sä Ž@ämŠ€§ˆ& :iù¿µh²³ê³# Ỏ¦ ü„ަ~±ƒGç¢,Wˆúx\9\”¦rc0Ò_HC´Lbl€Á_wÐbZ†‘+-(è³¼¤înæÓ÷G è/O'Æò‰@ÐBò³ºÙgõg–ƒþ1Ø]hËâÊzá]•g¦]<7öƒøS%÷ ò™£HÝ%ýŽÃެÀÇÄ6ð¯6|}hÓòHÊF*{GIäá&¨âÉ¿C\Ð'€DdŽMÙÓªlu®6ŠÁ͝Y­D™);ˆìY'–LB÷½ÈMÏýÐ́ºpp%fÕRdzjÍAà»J–ãê:?“ùÛ0_¹j÷IŇýE¹m:+S#Wk GÙÐC7=²·G_Žl²^‚M[ÑDÁ(ruQ´p*]”ÜEF+ñUr#.]CrÉׯ’&ç7O×ǯNPü²’ë˜^‡+/Ȧ^„ÏAg—÷–Pê'Ê×/ÊE¢3ù餺]ÄHt~¢H2úvŽ'3LÙü`…c; endstream endobj 1239 0 obj <</Filter/FlateDecode/Length 498>>stream H‰lRÛn1ý•y´QÖ±½—¤RU ’"¨TT©F}(<˜]‡‘õÊë$âï{/D4»žñ\ΙãQpÿ¸X~úÓíMûÜéno—›Ï[7pw÷a‹Q’QõkL|šã’OñŒ3ÎyªÎ„”%¨3d¢bR®ðdT¯¤ó¦ï!ì ˜“mL[p?‚¶­i`çÝh&I÷FûznG+’òu§}8˜60…>ý®FT9 Êâ&‚òn‹p[ÛO³œX*H@%;¦ÛHÁ"t8¸`]»Ý6ðrœ«œu©ÖÑiO)0ô2Í%™7âˆIžŠDvUÕ ßP›kD©SbNÌ|oÒ°bR8—iXVa ÄUî'Í bh&PÃÈÐx 99ÛÁƒ/ŽÈ¢¢YI¤HÿÅÀ~©”@Pµƒ3ãDëŒUŒ3Ð×Öâìðt@IL?5àÿÈjl dz•Š|¬'pbiÄÿ ׳J¨È'°—#®€·fqEM¾Ž…‘åTŽ®IµÀ×+QA| ±Îk<¼…è¹+‹„F‘K–l•çóú¦Å¼˜Ýôi“niš'õ(§b•F‘¬”¥÷]g4>Èï(|ìœG9Ùǽ7ðÑúxo`c}}´Ñdûu¯þ 0îìß endstream endobj 1240 0 obj <</Filter/FlateDecode/Length 25090/Length1 34536>>stream H‰tV{PTç?ß½wwÝeeミÝea°À¾_Àî^`%‚0DV$‚ ©Æ(«‘‡/ ‰Ú1JP‡Ó‰ÑNbÄÚµmbÚ4mè´ÑIgÄÖiÜÆiю»éwA'õûî÷:çÜï;ßùsî³!$TW-¶9;R­€uïbjíÊÖÆ¶"å² €æ_ /VvvèO‡ßh¡8™«ÚV·þ³äoEízjÇê–-«íÿò~÷&@ÃÙ5͍Mcµ›F0Í»è½|¼×&̇œ5­›ÿæŸOt⥠£eýÊÆ»ùh9ÀŠ}xÿ’ÖÆÍm¼>ÔïÀú[›vÙQ€Õ¸QtÛúXo\âX~Û†æ¶5•/Ëñú®ör\±Œç¨zàÕ£QÂzÔ«Ày•¼@l©;ô³½Ãž%Îq‡€‚ÇzòÒc†ßžº„÷x-õJÈ™/!ß3"E$è”û‚AEÈáTƒ£¨žÑ:#2§3ât„˜ÃóvE"Ñ_E¾Œp"-ÿ"ú¿nDë˜R­¬ËOøk`ÒK…»ìöí3ÚÙ!™Õh~_4Àzø(àkp]4-Œq¹e­ŒªZõ¹ê¾ŠR¢&ËPÜêròó-10è +Ÿþj¸oà‚™^P†ÄBˆÒÛc‰€M°%è$;ÃÏ6±$`Smh/Á%Év¶Ñ‰z2|íéx™•ˆI”ÞBë6ú*}õj/]rââ°#—Ü©Er7Û`ò¸}^Ûl2‹§)9MíëÅT6Âva»ê8÷À‰£cšË,Tt®Ø:Ð!bF\Ÿäý „Q@8ì:RAºgsÉX\œÜ()uA”Ô…,¹Ò`ðǹ:Yn®Îâ ˆêH)¥.òkC ¦©GÑF#ÊÌ,¿kHYòtQP%1–« Á(‚óiiªå"5+Êc„Æ*/ò.³Û«í„}mfô%Cö¼¶¼KydÞUfŒ´Qo\a¤ôF»±š/ j˜;¶5Ž˜ö™°IÆ”†$À⁁H„8D’%b#l˜Ì€‚0¯Ä`6VTå[Si™¯ØjËÎ)ËfjÁ_è­EEù%µPšS^>[ [qgµZÙ¶ˆ¡öÒ"%‹™y²äÙ†tÄãòX}®idÍéh_Ÿéi¸qyÓ¡•ÍNâ&q9}…ˆÛ¹gÑÑEYŒ„Ó "Z¤ÙE ¢Ñ°ˆ'b-.£Æ’S%¬uÃØ³•éˆÀê+”<“ÙDxÜŸ—èÕô÷Ι¿¯Gs|QϞۗrîú~:•úôÓñÔgÉýîþ¦¨éÊzîh>O7MŸ^ÅØø$Ÿ§&Õ<9¯Ž¨#ëxu³¶’[y{ɽ¼ÃÄòïð,ÉŒŽRNgÚ/PˆPÖ¹¸Iã2zª}j2!yªXLªP*$r±0‡Äã&Læì3·wÇãËNiº÷ÏŸÛ»Ÿswxå‘ԉ˧Þ;±ñ {_ 9Ço σCX³ˆ ò'UÐÏH‚¥bŠ*.:ô”GÝe™ý-ï"š€y`A÷ß÷|ˏ¢ F9e*r¬ ®,uTèõ•ŠÓëi?öô¦â•[™ ’¨ÂSšä$=• '%Ó~¯æõy}!4ãGÙ6dà)”O“¼™­\Þt}’óq5e‹aÆ÷pŽW(}ø3ðCâ'4F²8èÕä¢sMeL¹»>hô-ER9-T(Ò2µ8Ó•ïk¨+s<¥x©M¯´!Õo¶ø-jyšx¶Ý¥öåø©™<Çeކ Óe9Aœ&÷|‹4]¬³EÛô…¡¢¼Ì¶yø÷ºS#èMø {ÃÆÕ0Œ“Ö!ѹ@$)±!„â’‰*ázá€ðk!5 Ž ‡§žÂ'º!֞¸×.a?¦8LÆv©™Ïì'F™¹ù;9—ÓÒRaAyÄSö\jÄþúzZD‘NGduÝ8Öf7ê!´„«y.ށãbá‡äÿ¸.û &Ò;Ž?Ïnv7/»ÙlÈnáEBBHDcدUj rÑØ¢Ô®Zï&ÑÁéÜÁ´Z´^®íøRlÏ{qÄÖé]ÕÞxÎt¤3^¼ó;=§w3œvJ{íTbŸ'Èá4™<»ùc³›ç÷ý~Ÿü‚"¿Pàb×<þm›h;¥úˆœãèª_=™ƒÇÀÔ»VÉfpŒÖI—ªZµAµ[õ©ŠSMª¦Î/-€EV˜GOè.·?Ó`¶'özêëï4x*¼Þ@€î'sŠ<Ôµ¨NÈ9#äEÔ(ùi@‰ÓgNÎ*`¹¢US$ ÅÑ(õIÆª‘5dLÓ¯IhÆ5SšóZs‰h–tj..ÝßEŸfv®ÐhWÙ³ yê´ú ÑèÌ Dg™$?-&Jœj´”>ÍÁôë ŒB¤.AòóŠ w3A‡ƒÍ'è"põÐë©¿½ÿnbjbð/ÃGO<þökÔáãH §&Sc'¯Â~¸å橆ÅÔ‹©©ÇûÇà8ÕX÷PëºEõ 4¾C©ôm3P’‹$…ªMÉJPyc®Á­úk:Îʵr1î=n–£ZŽ3±Ÿ¢sÈCsz¬†jd¥2‘€pg-m•¸Ý éìB?qѐ½êÊ¢ûT…ÇYðÉkWš¨¾ÿZ-¼ØÜì.!ßÈ.®3ÔøÐÅÛT ø½Ü|‚½ ¼>Ò|ìúÜõø§ò?¬Jé2kÌ.»²ÈY ԍš¤ãCÝÁwdôêvfì1 ›Žš®—^/SUB%؝ ³³aº€¢fˆÍÁV†¥;¨¸ M¢„)©‰Ilx X!@ÀvYT*­ŒÌ1¦ŸI0ãÌ3‹lë[Žë‹ZŠùŁù…yüÇ—ú`T@ p×*°áEÚ*¡Þ¿Òp@,K‡Ì,ÒEC\h–Kj­0ÿî°<28rŽc‹»k+×=¿ãÖÐàÍÞ O¤3õﮩõo¦¶ù`3TÖn»Ðtà•CfŽS›¶xk:{N÷õžíª{5Ø×òÉs¸º£HÙ"ÚË&TÔðD=õœõ&ºÁÓNµ‡{=ûÂt«”Ùã¶ÒxY›ÍVÇóuÕÁ A"TV´ÕQYmJ¸‹‹×†ÜɆ³9ɘ*0u¯c÷ø‡ýGý¤W|-\ Ý = ‘¡³{ŒÃÆ£FÒ¸+®‡ú.++³X CŒM°ï±³ì]–IIsÚ%轐^1],ÌË©²¼›Ø—Ä•¶QU¸ÉéµXv“Þ°;­0'BºšÜ2›ÊŠO}Eæ’¶„åÎh.§. ”V,•¦T¨(LWG× ®Ó˜×sà*æç}k¹Ðã÷­”r…ü—®"fÇZ{†~üéÿkZí Z‹K×íëüÅÄÁxž·DŸcËÍ÷—Çeyhp÷p¡/àòT·|ïƒËw‰ûùßÚ~ü\ïþM?ÛÒ²©fÝ+Ŝ沓ÓoO(is†h$ˆPhäô+­y’Ýã+YÝR»sãžÇúÐH€]È+^ä^˜À²T$K>±QêFÀqÀlP¢8kä,£d0%I¤±Ma0N«iãXŠ›!ž— Ân6Î>dŸ° žÍe]l5«`gˆNYME@K­$$gàÙ!½UŠ“ÂCä…\Á%ÂAË‚U”E"&ö‹ qJœ)›ÅŒË¼€ü²ˆ&ª¨€»®nn ŠÒ½:PÀÜXå‡*<¬«Ú?Ü^á^¼AøRÙð>Õ÷x}Û‡ÁØÜìXu5F_Œbí!íg íËP)WÕóÐd,1Ö—4”µ—l*ÛQÆì°ÒØSBä)e Wƒ²®‚ç+*öeCúKÌÈÍ5û1|8ÝÓf:xžK7U:mæ*t<Êôš5y¥JåLƤ7¤›ÒCI!a‡Ø-Ψσy]ýE‰¢ñ"²h—Õ"[îZY1KÂ2‹O,Ø ¡e'èðhºXåªÂ›b\ŠSô«ßµ¸€Íð5`3Ú£Õ 2ËS¸69Ê &‡Éå´”K#À%º1NC,÷¥T‚ipFz ›‹HB@4€g:÷ÿ©Ÿfž6B§š‡m¥Þ|²{ï/m-£ÁkP“šûì·×ù*klG`pý‰×3Ø` ,S KµÔá5Ù*>ÿûµ©C……©ÇïÞJ}ù瑍õU¥å:A²~ÓýÇäÕwްËbv”rjXø;¬î½¨‚NTÁbPÎȝïó·µ·ùÏí_i)F[Éúµ¤ß]ïnwwx{˜n÷Noo…’VûYÂl& "§KJTùÓåšVqc¹“¹Dn4«K<ëIÒ8-ÓD9ÝJÇè­ g`\6;’¸ËÉãú¹7ÎMqçQ§c8¬äÊt™æ£˜|ЊΖs }pÅ–“>¥G¼§˜Ù0®dE%ÂC´«ˆëíϤáõç¶Ÿº—ú׵яŽœÔ«?éiköyêMRVAõ¶©Ý°ìåÉŸïûÁøab¼wó½s7S_þ®ž½_¸Øê\·þe9…ù‹Þ8”º})kÕ…_¿uù­7/ŸÁ.8‰öÐN ƒLðÝKÀ·Éji+ˆ –I<‰˜Êq%¡ìâyGy¦œÙšËϜʤ31Q›ðŒ2ÉŸçòOxºœçgy’ç-YK…wí \“¼6‘VCFK<ÊôÕІD”ÿ;// kÔz¿Ã³Ú¹qWëèâgµ% Ô°Ùù÷ÔÛ©Ù§7”Ö6†®^Šc©çþŠÀ¼„žÞ‹`ùÀMr©ËÇ…¹K‡µ=/Rqtºz…–ÖžüîânǨK·_9Ä Ù_rùÛeÅ}ÆñýíÞîÞw»·w{DZ{÷wÈœøzʆ„·` jRñ,*‰^mEQj”³U‘š¬bŠ`m5¾Ujs :“DmMÌ8t2™ÔΔڴ 3IǦ­ñÎ>{ ¡3{ùíýñì³ßïó|¾ªŽ”í!Ý~㏾˜öªñ*?â`•ZäJq9ëž×m@¯à;U­ºíÆÓ¦[& ‰\™ÖŽÚU¤ÖÁc _(}IÊóéŒ>ŸN—%Ÿú’Îs¤Èpæ„I¯kKíJ„ Û_’RæÔù‰j¢žˆ B&FÚ^×ÄD¡#ÿÀì®cÕ6µ¤&êÕM꨺[=¤V©iõcLBw“{1<É¥MoE˜º<¯F6W¶„Aua$ƒÄÓ=5ß‘´²|D~ƒ©&gäFCöõñã×ÿ™¼º{dmâf¤¼³ý‡?n[ÖÙxfàtlÐ/º¶ïäÎ7îþdû¥%[>ïÿ´æèòëëƒÛ¿³û`Û+/ïü,ØûjçÀÀÞí;Á§-ð”ð”˜û©ôÒÍB÷üœþ wYN­®&óÛîšœ½ÉýrN‡N·À*tɈ–HM%XÙ¦^/ë<¯"mçYm4£;Ï›g),o\ÜŸR¤XG²I³ÇYÊæ%ê©&°n75D Sc0´ä¾åϰ÷BöÿZÉíBÓ ƒÙô<;¶ÐÓ–ä Ñ,w«ŸùÅ÷zÿ‰˜ë"cÿãýËæå?'Š+6žX—xÐÔݽ­yàþÁºõ½¥%ÞLü&‘H\l_³tYqž=ÛÌYsš}¿}íú…³Wvî¶<ÝNC–9N¼Y& ["9Sz8ª£9ˆ4*3î3™ªL›M÷Md—iV*!šIN6üT×M²0Ь€c˜vÄ@iI PV6OAAE9ñ^i`nIYA~yÜT€ü*édx1Y‰ˆÕHóº’q¯7ýž^-W”¢eÁ§EÚ(¥E…q_ÄWñ›ùû<ÙÅòCʏñÜÄúiM†ã€øáÉÝ}|2ÉŰSaŽ7g¨´j«²¥Xtk1U†¦iÍšµOW-ʶÿ蟹óiÁJ%f?¦k…fwuQ`ýÊÍîÅK}^¸wòç¿wZ·)J‡´Zÿh¸å`UdÅáÚ–î^^È›ç—VU4¿ýþ‘5ËnØ·'ѽ«(/,(Áð'_bùù0;v[Úe/~Ù·Úe¡wÅc%éuµñÏj<èãÄ¿p ùàÑÛ+*+º½-ºRîÉ/­¬¬Œ¿¿*зòfÆœX>vErT(iK(ß凧Éü€!Ë%“®gÓ’ÀðÓ„—ª8YRdy¶¸áµ£;°õƒ+ebâÞÄHâÎȯ‘çBýòÅ®øÅ¯wô$®$¶%Þºtô/Mü;11ŠÂcŸ¢}ïÃ<+ýÝýñ˜;"ÙmsP_Ö1.)Í<èÎÆ„tJ÷x”çɐf=(i3@xF¦±Ë0hÀ ²ÞrahÜ&e±Á]á/©°‚Lž¢¤U´šÖÐ Êér¸²\¥ §r\™)î­ÈƒÃ‹‹¶oŲIïÖ©yæõx<Â(âJKå`~éŒîmye¾3ée/‚5Áœ,´©|nÇÑ—úÞy=r)þâë…9¹î>œŸã-î9Û¶Ò»xoãÈ[Áe‰ÿ¸=´+–—Y™éPœ.×× gí¢Hç#´õÂaÐÓèÊ:èŠ Ré]‡¡W×oè±þÙúÐJ3 ÌZ¥¨$þÜrÅ2ò[ÖÕŠ5Öˆ6bˆX[µ­†Vk‡µ_¡«²"™býŒ”ä/Љá/HFÈù¸"®Šëâ9ŠáDØ òFJMµÑžæÃ‹páÕ’ˆ†§‡ì!V° ~Aª…¨Ð-ИÀÂBˆáUR†MÉ1!=Ë i¨™áx†Øœ²Áõhò!ÉêT§ رFאsØyÃI`NÖisúMNÒ)?:¯¼x‚ÉQžœxû/ÛÕÛÄy†ïûÎgŸû~ØÎã³cÇçßIl—J Á;FÒ¥¦¬%$ڀ–L)[šBBƒ ˆªJ!+]YZ¤¶ÐuB0 j26Á¤hLZ7Ø&u«ø14y]—Ží¶5=³÷sH§éìóÝw÷‡¿ç}Þçy^b=qZA3ˆ+e…ÏÚƒˆædag»PòÖRtU¹ÔRKÅ(ñS„ÛjT*LÐUGÏ)ØÓˆ¯9~úpñ–Ø2À¬XÁìÛÑ[=ï/èÙ†USM›g’µ}Ì•¢ão?ÆŒ9f´½wÔ¸¡ÆÇz"f‰E¡6]P›G 6qêªV³šyŠéã¿ë>Ä¿èþéûÛÁ ïñ¯»?gh+³ÊC…Œ  ÂIƒ9$j¸Ò®¬«ÅEÈknq!×ì9Y®¤˜@OðŸfð÷"dÉÅs¤\%+¸6ŠN§ ÌcˆÑ¼ª¢Ì3Z ІϪHPƒj§Ú­^S•ÀšxkA0&à$hîlç‚IòaO L¨þšås ì2w¯HµuœTƒ]{™U«,ÏmÈ,~Ýhx-KÔ½(Rˆmm¯ª2>y鈱ùäËÆ‡óºIš^‹‡È„öÌý›fŠ™¡þª-ÛÀ<}xOd·ôr'þNoS¿£.݆{wU«ef‡wÅã¥mšì0ž²W4õ‡ú‚Q+YÒÅ\ѫۊÑ/×Åu]RÄUSüšÒuÕõÆÆ½µB•®{= SM[5Aj -÷Jùh­Æe„Iâí9yá:eG×ÏYFyrI¡ëš8Pêëû.S‹ë’ë*Ø0AÂK˜E(<ð&b,Óû³Ø é¾5ø½g×&œžì±nßò¸Ó§÷¿Že§N4‹²®Ç›M/ÃÀZO\‚:© ë‚ÈËÒI¢ÊAm Z(R¡\™5ƒ5܉»ñ fð„%›lIâäDd4`A–[”[€ôÖéîvßvßu[Ücè3Ml?Ã!žÓ¸N®›äÎr׸»Ëã®i½&ƒB;„ª4kí éYÓÔ0kSm‘uÈʆ­¡uT5‚ÌVjÙ=ÏÌ¢Ó£¤%f§Ð隢SøåöGÓÛ® ûsOÛòõ«ÒΠbmeÇò{†ëµ!@$ýbéŽó[{¬ûÀÍ‹Zl,ÇùôþÓÇéó± Ó_è,DQíBE8^¦r"ü-e“o—ÒëRöûŽ*#>›µÊ²ªª@( V„WW­­VW‡Ë$IŽD#áhy$¹¡K–ܲ,YXöÉò¨»¼Ä™YÃD† ¦ –\°Â;1c¦³ŒD$#?hA+ªD:?†,ÿÃXx³ ¿=œš‡k3ËôîH7YRü!ú4±¾q±yMÛ£öâ3wÜÁšacÃó2´<”.1ÃmóSj®¯ÒŠÇš¦:]÷•»\xýŠ#!Á£ë‰*Ó¨#=¨ã΃J*Ô¸¶pƒýcû'ö)»i™£Õ±Ù±Û±ß1âø…Ãb¶kL+9-³Á§µ},/ð˜'q%&–9s"+ìâr<¼£ñðÆmÞL•nZá¶,üEÀZ¢º~Þlg›Û-ŸÎJ—%Z†¥Ò5é¶ÄH¤¿}s½š£ÔæÄ0²%e#æú°ÝIb\ðåd¢áÓoÇ"é¯\;ùûÌÊÐT¦oɼdâU€)Q3µ3©ÞD¢qEOÏ7 EHþû´<—0‚K$á Z`9 Øpb%$:>`=2‹<2í¥Ë1›~›äák£Ø*'•‚µem¶7m&ÛÒ2ÜI…©<¯ ¼èƒ Â{ÖLXãá0 ã* Šß>C{cIïÀRg¡¥'šß8£ýäw†÷L:ÂO5`U‚ÊŠæ 5Ë4¤B©D2Ü/AÓÀ…Ð$GÇпû—Ö.X¶ÓذwÁü¢¼ÜøgæO¿;ôÍTv/seªÛ4¬GÓSÛÕ(*hºóù~f÷Ô¯;;ê̺nÝ4@U ˽ظ†¨;ZïY/ÚÊlòö1ýöÝ®^ïaæ°ý€kÐ{œ9nv {9hYˆÁã.¡Ò ñQ,&kL¨Ü“dÖbåX˜âDÆÎJ¿VBI“Z%ZšpZÞÀ¶7øé|G…ò î;Ã#~ÐâÎ>A *¥UT†•Êmå®b¥²¨Á"#ÀiX¡•qô)¥ÎNp“ ÃDŒÉQҀi X““HÔ`ÍM˜þËw™ÇFq_q|~sxwg¯Ù{fööس·½ñɃ‡Óvœ`#ðV6ø€„9|„Æ@ňzp”*ЖCr[Hz`á¯1ˆ(ÐÒTJª5¥þ0Rkš x×}3kÓ¦•*Ë3ãßÊZÍ÷½÷}Ÿïµk³J#yå`Ôs ðCF½Yá$^‰Ö;+J;pª~YEëÔº×ûÒnÜi*²¹¶½Díîysðººè×—<ë G§Þر þ"÷¶5—ÑHx]Ó·¨ßé17Ö/m^‘Ód^ɎâÃ9)øêIŽº O’Ö&×vb;ÕOôSýÎ3tJu6]0_°Û.:.²c΋î§ÔcÚÎ`„}@­áo’y…$âd;‰“w,7O×uëÈÝ!®\t2ÖyfDR’!ÐïL´-"!Ôáä,k9äˆk†>3—2¸H0c¨zôbfìÂùÌõË#hþ¥«Ÿ?é{ëæëÔ_~•9uûvæ‡ãWѦÛDmã/g.eŽd¶f>:€¢"‡°ð¬<ų؛’?¨v5j4Nƒl?yNØÒ. J~>a÷Ýì&)#½ë„¬iê´#Æîƒ!{ 2zZ…OÈ•†­›åølR6®Ë#àª1Wô¨|I$àpñRî$æ'ò’3ö/DY‚,¤Øÿµp¤¸;$)˜ºüÓLjÜþãÏ3Ol®Â³é¹G£¡’š-èò+ï¼ôݳ]s©ñ»ÃÃm{3ª¨|Zð?ˆÓNôí_.w/™þ5ï^„ÍÇþ)ïç  ºçq7SkõúZ-‰¼ËÊó.Þ¥Õ“vuq£ÏW”jªç6ɞeXä¦äg˜l„"™ûvº<àâáŸH¿¥•±"ë[å7éÄXq Óì”bƒ±÷bcb¾X{¬;Öû(v7¦nˆ¡˜,g•ÒY0MO>j™ÌÌKºg,û¹´‰ƒ‚=ùBœ™=¥²Ì ±TUž$*ðò$*£J’˜J=‡˜›D€F•³ZË=zݐʃ;컨pà¬\NUÿ¯%øÔŸ¿X3ríàæaO.ïñ–æ,¶Ü¯Ýä´ñÆÚwXØâ珞ŽÇ £«çÇë^êCð£µÇWYuÛFöÆóWmÍüìÅš²{ûº§Çò–º:ÑOžÅôÀ¾w_ë/òeßÛù˜ÏÔ(ž•@¼•O”ëªu/9›¨¤«ƒZ¯[ïÚAõº¾OÝpÜ`íúC€)U³\ U9;xþ®Â8DcÄÙP.Ÿ“q §Àiøv(ª7‚ÁÝ•– ¢UDQo$<ó„za“°[8(œ~+Üþ.L´W(ªàRTQ/I?­ˆž›¦žh#º ø"¨;j#‘Bç%•dn7w›¯˜Is o”~+½ 1!_ènè³Å—c…Ì—°™a‚& úŠ Å%eŒ‚h¥6DPkcþöh1ÿý¤Œ™6ñú,VµF¡S¨uóZýòiÂ*åî³xFQ+†eƒßž=2óö(¡/[Ty}yp›âU ¦b;6SqÙk³8L5׿,œÿðäg¥ÝƒÇ×fþþÞ;=55a”7rtlé±;_4ízú~ËYêk{Ò÷žLœ|µzÓ"±¬óL÷õÌÓ£ðy“™çvUoª-©¨Y?võéB¨pxQæÑý\ZÜBÞ"?qKœ¨†|‘o曝ÇÉcÎǤªŠ¬ä+õd=OQ,áuÏ‚èA÷)÷4$A÷ìåNá+%&¦35 jD46࿈º0@­9aÅ\mn䖏Œ2O`ÖÓÖA+Ñ#kõz²šOÀì%ÀÏ䛲¬ª&3ÀQÌ2õÀYÜÿßP¢d•ÐLº—,ÎÜ­ˆ„ãßK/77¯ øðš¡–OŒ&ƒÏÖæA°Ëu‘çÄÀþž‡r¯—MO(;>‚–æôet©¾Ì°”^¢_jXI'õ+oëß6œ¡Ïèb¡•¶”.×.ÑTë_r6ä¡r ²á\¤Ñ/žBu’ѯqtºmÆ îsnÜ-/ð\ð|(àãâ!ñ´8(R˜Èˆ>±[ì)FDâ(¾‹*&Ž.£\&äŽTØhÆÿ#zPö½p¡tö\\6’¬o”á?Ý_uäùà®°f%^l]Ý<ó§©D¤°ðÛ’yùS—÷.z¥÷ãsø™æ–®®n]{:ô`÷Á]¯5½EìÊ…¼4ýxú6õ!hãÅ~'iƒl•ÿ˜–`9ΑšÞ%­ yÎçäù+´ÚJÓjÇ¡µð¤u:ÔZ£iãxÝdòš1á`µ„ÙâÔ¨sHÄsX’^K¡ß”¤-q$¡vD ¾E²aæ[>‹dé³Z>³P>êµ K /¹Ð‹¡8Ú$Ý«›™l‘I²ÅœH˜fð†•![ù©ª”jÆ­ ³ùF~ˆ¨r;¡"+œÕ‹4_7@•(‚4x׿Eq³íCMô‚Ä:<7ZôJ0SV›þÒY=/úœ¶ mÊOœwç̯«kÝü,B…Ë]%LßVÉÊÅQ»T°ˆC íR¶6ÚÁot„6D·±;Ýý¡oFµ:Ý\ÝKºZ[M ‡#Z–Ö…RÓ«†¸PЗš^-}ƒŽF|šX4º‘ր¶6 mäX+DZ`°™ãቊ4gµ×ÐZ–ãᘆˆúLð™x´†4‘¨¦ÝŒÌfÎh¬2Ö £1Lx N§ ‡9øšIÇÛ}È÷©$;0.¤ hi}®žëâ¶s$¸{ø—’D#zmÇ|`ä[$“1Þǻ㈉7Äñx¼èYøW[z&y.ݳð«Ü'åL‰Â„¼DM‰«Œ<€õB½ªäN¯„Ò=¥3)@.^6Ìf‚ˆJÍTª+¿šQ•:Êu›«Yž—ՀCU5Ja=ø×UÛÄy†¿ï;ûü{öåŸíøï.ö9q~ˆó‡_–HÝ·%„„še¤PJâh,¤[ÂÊ:XÉÚ®åGSR¶nÚдRÚ.Ðn°Úu› -UǤi¡"m7ÔŒ ¥¾ì=P©%Ÿì;KŸõ¼Ïó¼ÏXUl¥q)Ö/)oë&›åÕ4®¼eml\‚Ï5®¬v+Ï-W~¥¼Wz]±V´3+°Ýê úž«ˆÇÝn;w«Šj+/mŽÅãúâDòf“¦ñæ[ZñrÐÌ8ëëjÃyÛSüîÐÃAæ…ÐÁºÛ¼™éç÷0»ìÚå|—q˜~‚æµzƒá1)”+ŒRˆ7Ý>×aÐC<0ðF}ˆî•°$ 9ÈÆ’0LÒ+tøõ¼ÑÆêC$ìpú‚ƒ3cq;;ÁN±«³ $BdÒKRd’аâ<òz8b´Ó6ÙêpJΟ”…cážðDXžÁ°Ì„`$˜RÁ`q‘:(ójÆLªÅä6¤ÞTEŽª9x«¥637¶A#ŒM»QèaTÚLJÂÉä]©9¾¢4Uh÷æN™ì^Ù]cÁ#ØÂµÄZIÕ†T•rÄ¥»žª‰(Õ¾˜uÜãʳ§ãÿ‰U ¼–õé ¥DbíñxA¿Cþ²D" Á«Êy&Á ˜\Bu cƒc!§M§u£FfÎ1T„I0½Ì83Ë\dèI¸C˜»FœžŽ±`3åÛ=Ýó*~ñhQaIè¨Ò¥´ò_[‡óÊžÉœ× ‡H6u˜ ¶ QÓirZ 'èIzšÖ´Ó)z>ÎÒišV}ßÂ^S³'T‘Xæ0ü•øW-â¥N+.8Š_TÆà4íåÌi‹‹Hc^ìG⏡]~ïãy iØ/æQYº<¢í¢Yã¼ù¯ƒýjûØ™®•:ƒ– (:+ß¿I]SvÈj5œôõÍú(«oÊGü>ì»aÛÔÕl1 ¿–¦(Ê`B˜G†×R6:Z˜†Ã”?<>žU¹CZd§9áîu§2U-¨:åtZé ²R`‡,L‹/‹$"bQ¬Ì²™ÄÌíæó¸YÓcžÊ4³$ªÏ635 Ì«œƒŠÖIÞàà`Xjóð35çDU™ÝgD™)(UgÒ6¹ A ¾¨„«¬À´úLMßÕ1ØÖÕ’ôLnœ|wbïèúÎX©Ó[_VÑ<ûÚ/Ö®åù@rIy¬ý¡oÿúѺø}Éo6ïØðÌ„}÷?tçY…Bi´¥ºïg+Û6)¨Eñ‘@{ÃÀÇ~ ¢Î.^ÕX´Iè’,¸eKÒcû]ŽNçN„\)Î¿ÅÊM¬10‘ñ»²‰³Z9†ñ°šÁ‡e‹gTpFœ²3áìuj3Ø%"NàÆ¹IN#pN晬;ÎMs縋Ü9·&9Š;Žß‡¤‘)7CéOÙ9€l¼Ðr€n\Œ-Ì«RŽfâlž i ¢$i}X0À%H»úp¾Þߗͯ`QÛê' N» å&®måE€¡ç µää,ƒhÂÙs3­†ÖÜ!2ÎÏB^«Þ¸t²ã¥¹/^[³÷¾hu¡§5VDÚ·w¨Ùª=Úé•?¤(ç?Q>kyp]½å[ßÑÊëâ韟¹táÄ#ÛþöáIuÃ6.ÎQ ೈŽÉ!À Ö®-úRHQ&Ä÷pƒÜ7ÁMqW¸ENg…ݧR‘Çy2ožp'ð4>…/b¨Í¹U½Ã©ŒP_¦OÑç@£:Dt„N€lA°“4¦ó³$MÃeAe©ÚçUNŽYóü½[òk¼}(OŸVèC@yEì€Kª« íߥhš,o(ÊÚ´J¹öÖuÌÎüðÕæ%¥ËòÙUÍ£±îéG0oS>Æä£ë8g²®mYII¡Íä­íÚyþݳÀ¹­À¹íÀ97*DŸÉ1Ÿló¸å|³¤ç ž|w'Ú‰‘'eÓå§Ì&ºSgÔë‰Á ‘1÷„{ ôúcZÊZE •’œX°&¬¤Ì:n%=Ö)+±ªj ßb6ÄÂ\2“¸¢e™"u—WY@¼"Ã儼ðHdàâc=@0Kþ×iMAcþˆ&`’F°Ñp‡V™§\¨0×^ Ù=#ÚÂ\xnç³ÏU<¥Ûæœ1¢‚ È:2Ü£ò悔ª DÖàh´I9åŒè™þxrèÙî‰ê¦ÖæúÇǾ׿õÐÃ+µïäÜPârüdÿ£Øüÿìì^GrŠÊÓ×^9ÿÉï¿ûû­½ª®;}'€}¹È‡~*—Ê^ª×kYÖ}iäíÈ~c­g«Ó¦Œ&Þ5Œ¦Sz|NY=Ö«ˆZ;¾Â`+㇕3èW‘„ìšå”jtó±4¬TuýBÈÉÂX’ç3å-—Ë%4r縶c¯ÕÞ‡4&LËõlÇ>KÌZزÅEP9q‹¼ê|µ*íPu§‚ÃkÅŠ,åhê•ôm|Í÷OoozFùüMe1}|÷ہt~>X¸'¹éGø½ÖöÍz”9Ì~8‡]{Ÿ|¤µ|éÀÁªË¢*µŸCƒzUv÷{‡½»…ý‚†×“Æ\Ê~ÂFû}e>â›Áÿ–}…Nl0wšŒÒºqP'Ä)ñЏ(ꬰfÈúß"wVåžÁ’,“Àf”H¹æ§¹§¯°±¿a Ë&ØI;Çñ?o§¹¹ˆ&°µ <+3Ùd~>û@œÏàg ñް£x *â×@TT‰3„+í{ƒH º2Ñ×”IÛñ“—/ó¾šñôÛ«‹~oÿÐXcYQmÐ[ZÚñmꗝéÕe6hRÁù]çòëX;ÐUß\.ó9Í9ž~»ºOÒ4RGKÑ Ôþ,×wUl®8Pñ¶íOµgšèº@]°®±V®mZ!¯hÒâÙ&k©ÿ“]õ±MœgüÞ»óW>îÎñ?s¶“8¶ã‹Ïg'MbðåÓ¬¦$d•IihÔ–fC(…$4ë í Ó$è¤þhÿèÇ„VšÁ*ÐÆþØ&µk´ÊVåŸhHÛ²T¢Ò„=ïå«,²ôêÞ÷ìó=¿çy~¿ßõNìõù‚5-GýB—@v ‹)Ì“Åje’!’æ•¢çȉ¦£ISçÑ Û=X^n`k{AáíöјYçI§¨IÖÕ¹•È`fÒ=È)~EQT…ÆËrKùF1(?ßÇ=ߣ÷ml9™Ï./­ÐÍè} „Öër>‰¿õ%²àÃQÝ:^!Ìa^$𠼦Â5õø¦ÉXwA‹ëe´±ÂÏL› Ô›Õ±º‘e=Ò“h‰z“¼ÙV–ü=¿=08ú|û¾½ñÞ¡)íѝ»_:ÕdÏ‘½û¾ü°ãõ?9xðØqïüÏwÏ|ô‹ºQjäU®Œwx£½‰Þ7œ.%$†Óƒ'»G:w<Óø¼Ó™mWûÊcoì;7vNŽ¿}vüø¹Gc;ÛBµÃUéJ\ãAЧƈ{jì'òª·hŽédê¾o0¸ŠÞ@°¢¢¤„íå òEX«Ï:g½i¥­7‹°r]µb‘±DˆÀåÀ0Ú æW}cA¬éüDl:6£bDq‘®ÈL„ŠàòVpy/e—òÀ²@µÜ*Ñë£î2»˜lõ /qºŒS¥Ëè8Ì§Ù}r¹A¡‘¢K+EÊ}Òࡽ' ŠÜ P"k«ÔÕÛÉ[cÓu'ZQÎl9ƒöAýOÐwpgCgu¬K36¨ñÜþöÑîˆÒ¥Y’Jª© È4/?×'•0¢µJ¡L¦ª }z|êé=Ú[‰H&Ñ‡šOã@ªßBÂGdÕb…PáðÏF_oÑã<ú§ZUl,±÷ ¶fÚ2k!S–NiÉR3&,-î97Ùåžq“n™_‡l Â&rI§‚¿?w·¸ÙÖuT响ƒBµÑ¶Ynm»ƒF8GÅËùõWW©©gwÛähKk4Ú–ÿ¢ðѽ2†Ïd¤*rwC^ýñ--‡®îÁû‡ˆTv’™aHŸ™°sv¿²Ï£ß«ÏzP8žhQpoèL‘Ñ3ız,zTÐdñØ«A¼TÆÚ|¶iÛ¬¶½ž¯K刲¹22U¶lIqÀ•8Ð0šÍ=\† qãfs„^ÜÃåœè%a/õ3¬Ïïõ‹~ÊXÊ–Ýõ& {œóïÂa³ê¶mÕ,{6kõþ-WUEnk;ÿåTËÎmÕ‚‰aK¬NÓZ÷¸ Ø´æ¿~4y[ÓšâMÏzY«{{O7%ÔoëÀ=T=trGœÚÝÃöpûKˆ4Ër¢dKÄr<ìhÆë=NÒ<+Sòê㳉ÅÄJ‚f¾Dg¢/10$àñ×Ò„zY%ULñc­×A2ø‘©ôPz&ýMš&Ò\Ì¥?O?N¹tl¨4uךŸÁ„‚¼›<^ô \®VØ"°ö¤°"èÕ¦3pºÝI}uuØ…ÿg<°5 Ñ[ø^?{ò›¡Ó¨ÈnÚuñÙÃãå­ïžT»…Òú˜VkR¾Ÿ¥jYÕ*€;w¿œÜcó$-œKµ»©÷­/õýààÀ±ÁWv¹¤Å"¬#“ ‡Ñ/·î8°C¬eûЕ7Oí8§½%qÞ“5 TF+ðÆ¯¨_ƒöÞUÃç\ï¸HjôxÍT…ç¾Ñ¤k°1Àmˆ/¥«/ÎMaá¦Ï¯Êïu²ˆÁ­M Æêì#‚pVìÛ"½ÚpN—\n)Ó±%7aǀç×Üy‰Óm²¸MN¬¼.§ËìYÕ^×õé¦T¤ "í9i(5€ôÒÔÆt³‘¥-ÊÒmçåmEõ6KêÃW²ã»äº­$ÖRnÎ]ˆÕ5k\s¼¦y»B½oÛ?:0ð½KÏk 5Ðñ‘:?•:xíÇÚ{xö’Ù¦ Gí0É܀I¦ˆpgÕ*T729Ñ6sñQÂd;j*´ªÔ5C]¡þDT ùàš¤æÉöO¸Q¢¼êâæ–ñè²êWgä4y£½•˜¹~‰àŠ)‚+¶õV,²¸±…°HëÊt†È¡l%lõA®ÄñwˆòŸ"tì/¯]Ëkׇf¦sÇÏOS¿ÓVúÕ8âÿö5âÓüëâgŸýã«ß@dÛµ º¥*ç[5äQ 0’™äª*†¦²Þò3„±j¨¸sC’AotÔrÃLç@®_Z/ÿGvÕÇ6qžñ÷½ûΎώ}¾ÇœíØwgçË.!CŠo䋏®M!$p qXQ uÔBJÅÔdÝ© U¥1ºº°Žþ Ú†ZþضjTÕ&ЖnjUT5ªH²ç.i˜:Y¾{Þ»÷{Ÿçùýžß¯O2qæP‘Vº2¥J‹Ò©ô+“ÊåžÂx”!å¶B²!§•q|ÓÔkæX°ü8’Â7HµFsÆÔÏV†”²¤­È®:µr5i«Ü‰ËŠàRÅDwâ GÂôoYh=ιuw¢—ŠsZ/r{›ÇzSIJ%£½tŒÒª:°7‹}êf»þ ®¡òk™¼O ‡·v^Ü?ÐufËkËý%©ÆYWc*µf'ñäþÓ¯wïM¯;F^yvǁ퇦?êÝúÔìñ ¯Ôܬ…ÈOÓdýú?½cbãs“Ÿ€7$Ð>¨Áf¨AU¢ûÆÊ|0!òb^%r\I®”ÌKù¡š°‚A¾°æàÚ]œ–œA†sK줍 h„Êh΄©9ÜÉAÚÛ_ÖGá )z(,·ÈDRÎÈr¿|W¦;ä`þq"‹ª,-p=SSóÐ=  e2¸C9fêLscU#^^)ªZ‰¦ŠÑ6T©”µáŠ!ŽIZ*…Ûpi.V«š’ú¡¨Ö¼?®&xmšÒýeÓ˜÷-Šê,P0x£åâ·ét¡»-jÖ*°[žgmõêhЬ‹Ïú×Ô-]5´ùí/z¯wµýùÙ“'w×÷¬©ë%K[ŠxðBWnn®ZŠwmÚ„}7ðù‘üÁGÿ¶õÂàùŸm1§ê2„Ƚÿrôw#µ[:,—.KïK·¤Jÿ–ZöË×ådªVhˆ˜AóDÈYnjȉcø3£ªxж—†ÚÃÅ/tp]\žäF¸»Ügws!.É=.r׸Ûâ07F<ÓTWY Ý©úžßì¿QÛ°A ›2fv»;Ÿ&¯ÂDÙo¼£G—G75G_u hÃE§Ô‹XƉwãÃø?d,p²¼ÓÉV$«œ‘Yήb7°¯²o°o±¿bÏÞb?cï³N+°ìßXŠeKHÔ’ìLæ’ï&'’“É{I;Jz’Frþa¿õõÀr*ùuU¥£Ê1ÀŸâ ^Ê‹·Eâ ±Cìóâ ,æD{–#Râþ„’}^¿Íklä¾2ø®HŒ²)à4¼†oD¼(^?„½wE›[ÄâÁ³ø WNŸÐ'u2¤gtB¿Jˆƒ$xG“ƒŠùZñp`-®…»ÇQˆópa.e-;¹~ŽáƉ—MjìÎ,€A½\9c shd2 [ÌR—ÎBlE&`»³–¢Él)fЗY…6ÍI­ ½Š0ëÊfyµ/Z…Íi 8ƒŸIyк=J^ZýÖ¡ý=反÷Ö7>u®oÏšD ¾âԁŽç–>2ø“¥·þîÔÉÃëjx¼ãÇ;Ö•eBвæù†Ý­û¾Û4;úÚÑlý*=.}ÊÑ­G~¾½÷˜^fîKâ.­#uÁÓNìÉ<²Qÿ’<Ïùýv/|ô¯9·Åò¨½ß0Šû"æYT#ØœÞ R‚Î`.Ø<Ë{AÆ ¬'ˆÓÁqüW]œ‘…y]‡³¦äüˆœÙøŸgf\B¤ŒÛP „PÀÅø4• Ò6›@MS´hŸÆ‚ÿ¡¦Âó9šr꼄¢u3aºf)+½ûþ¶ÜÙÆgðººÚU³×ùÖwÚómíåJ–¼2ó£ƒGÞ;;R5dSñƒ¹št=3¾s׿ָtmœd007EÕ’ >7øµü6¾×7`?áö_ö`gÍ½b´1~>lüþÆÎ3Œõñ|ÃBÈ vÉ0 tœ®3ž3n7qF>ƒ }‘õqnÁn#¡…ãÌ æ{Ì f˜¡o3¶@µd½ûr؝rO¸I÷‘3ŠR8‡‡ð»xÓxŒè2|M¢;è¢<¨ ! <_šŸZÈÊ´Òéb]i$e@Ë Ðn` àxUzÁ¬Ò`VÍ š´™/âçà³Ä˯֘+;Žb@bÿa{µãþ?è!|lU“oö§µ³C|úQòB±¤DfnÇ­ó64Ø–U<ø”|¤"ŠM­™›²Ù!‹ø´±k±u«öc‘fÍa„·8¶èíñ=Ž=z¯#WÕ_uKp˜›²ê-Ï&Þp¾.¼©žŸM85Mw¨Vub†hÇnÁÓîEÃí!”¨hGœÓÕÎ)Ò’vÅ›;rITca¸{Ù¸ÖtMÕ{XϲŽD<>À21NU^…h,Ö#JIQIœ–IhHÂíæ8Œ‘MÅâqÝÉ$â:…TØ¡Ñl,*‘¢ÒRìwX‚eQh—_º¨amŒŒ`¸NŽRÈ@ýP&zÝFB]ˆH£q¼U~ƒ€å‚‚d‹­ª[BÉ \óîcÑøyçö_ö«=¶©ëŒŸs®}}sí›ë·¯óò#‰_7Žoℼ\ì„„@IÊDd6Fa@Âx•6¡¥À€*°²¤UÕµ*M[º1JJ‘Èj5i°²”jRáL"•XצÄì;vµÛ?Û?þîã;çÛ÷|¿ïñûhŠLö¯ Š,gIH?†õ#ÿþº‹.æh²ÝèFòtZ͘óËŒ(a|àLÊÊñ«3|nþ£“žê¹øœ§Ì›ñçc†²9xmýl)y»:ùå­êäÛz´' v‹Õ>ñþ²ÕÛА-%Ð?¹ 664h£µZr`b=ñf°•=`¼$Œ×ÅøCì"Ó"ç*Ó*çv€å8g†BÚŒm¦ÅÎE®eq «(%ŽiŒ&«¸œÎ£Ñärn÷¦g…8Hµ;%fxr;M*Y1jË–È.ìrɢބÁiÂ+ûh`“$¿?À»4F†pøŠ¨ƒ¿ ¹Õ$¬ƒhŒ9D1*¶ˆÌ‹¢Mê"½d?¹@Tˆ($FBƒÒû=RŸ4(—T¢•Z$Fz¬G6ä‡ßÐvÙöCÝe¨¹ÃÀÇ´=ÁÀH€¶4@Ý¢ŒÖÏ18ôp¡1yKt§ )=Sõ4í‘HdšJץܯ¦pŸôÌs\dW¦þhúHê’†¿›Æ;€íÀ“áΊCõMQ):štÅ…¨AQŒ=^Ÿ[g|ãuÃV¼·oÞIìÊ­¯KºÜåv½éô€ÓêhJ>Õä«+?•+^n Ê×ÛGß·šemCƒ­ózrw¡#×r:mÖWgýv»`Äñ¸Fò×ÝÂߏ04cÈÉîTÞUеX¬=°9ƒ 5bÉV2`ù€e t‹ä¢ Ì[¬Vs‘5XTôY: ÍVëF™7Ë2äx3,YFvËßÇ‚¾N»h½²YˆØ^÷~7q?“ƒJ̼–Ѹ FKÜEdý0^y2fè1Ã0ñœÀŸÐ—z—¬C%­Û4»V¥kú´UI)°(•c•‰T7r?ÏR ¸¡âb 7~‰©ðæûÇj0«IsÜ)¾K1 ýC ÁbüÛ@ÌbõYKu;ÞÙíM^¼xÉã•O™Jåp}gÎ’äk¦ª H͎\A˜ø¾TªúÙúzí’»Ÿ|8¿yA$X]š¯5‰IY}‚|íój`‹Ë¡—Øv7¢¿Ä5@mÉ.r„06¦‚idÚ™-Ìó{P<ÂÓ]&3—u‚†ÉÐTïZp_âZ¡5è…Æ`œï1ö‰‘RÑ&:a fµŒj ׿34k¸>ŒkŒ}‡ ¬'T¶«˜Ñcå­>æÖóN^ác|+ˆgßÉwñ½ü~þ*›×´‚BxÚšÒ- ¤±;cU@)ªÒ|s"REOýXŽT¥{†Z»;Ý`nì¢ÔŠq•W€Ü–?@nLǎ›³¬wo‘y_5ϯ”š˜c‘»Ÿn;š<ÐÀäÊ+¶Òn÷…äff­zÍB°5Ö{xÎÑdnöÜœy¹Ì¢¼öh[l§´»z :;ºàFäF”·E±ˆßŒä®«‚1 U-A´¾©®|Ó‹Õ¨¹,nWê3kܳ»2÷gÊ|;s$S€U“ÌWŒWàèQ†”3ÊyE%*- Q^)ëêÈP.è¨ÆÝ±ŒºCäBH‡ŽDõl<»Ãq¦k›qsGÝ0¿íÀŽPbR d•;`8©wN\랺©'§ŠBú %RÉ$‘bh9UÕ…›Ä¨l*{®òÔ´!‰±¶¡êÂÊ6,ËplßN[´X¸pª;{๶O×.Æ0]1õìAçõ¤BX=±˜qJ³ÚfbúÀK~õü©×·½< YÖãhCÞ#>Äව}ý¶´% ¤]§Úûõ&’·2½žÓM®Ç©õÏN[?6¹ž“þq“®'(Μ`ˆúsdB^Ô+TÖJòÅìñR‡û¸AŽpýfĘ-ÒVOÈ‚-½ÎQÏ0n¹u«¶C6½ºÑãRˆºA㣺”+FÆxÊGkÊÄ­n=Ðý“ ”;‰åá©–ÃF)_¸b:*…ß0‡+/é‹¢³ŠbËI¿kEÂÆÛÅ`´^®]¦þ<и/ìÆl­R_Û~ñÈÃC?3DΩ¯#3ò£1W^géA¸ ³~®»¤g€3Ø}!+¶öúFÝt‡e&ءʔڡiTZ„õBŸpEPGA] ƒ CÂáÞé‚yü¹ÇÌS± óU«T/©^RÔKXÄÞÖ<Ë-ÍÀ|˜ÿ£Ö¤]7)ãÚq]¿P%Œf.CâŸôÃF0ØMÓzs¶ùKeÄ2b°í–éU{eV9ÈxÖxv)ÈS Û³·çDrþš»9Ï—÷KG½Óé¼àR\gÝÝó?-x±`¼ð´g›Wöù|?ñü®Ê׋ކÿÛR¬üdNqgñG¡¡ƒ¡Ëå±<–ÿA´ŽbšB¡Š2TÃYp²è?~ ·B.iuõd2[¬6ɞ•“›Ü¨ ÐãõùÐ\‡”’Ò0‚†¯²ªEÐLôOÚ«8ªêÿçÜ{7$!`H‚œåÉnBx»›'¼€]šM²!‘•M7KZ`¦b¡dfA^U‹Ø e˜|ÁЩL[éX§‚C+ÅV+ÈTÔéÔ²·ß½ÙÐÄb­uzÏÜs¿óŸÿüçÿÞ[@óÈé*,*.)-›_¾`aEeUuÍ¢ÅKܞ¥Ë–¯¸÷†ÏŸ>yŠŽŸøuó×kú?^2u¡Ï"‹~pͤ9TAKÈCËh=Dëh=A?¦C"E#tk¦qdÃçšKUwy½´“~DOwˆHº®¿÷U2ÉJú;Ý{»Ö½;¡ÿþŠÇ.½k%Šb‰R1bQëR¡u¶‹â*§æçÃ@Œ",%ŠMàÉQÌiŸÅèQ,oˆb°Å1´‡w׬mñ5zë}â°¨iò‰òÀê@$á[Ao¨9°Z´øës„Óò~ “Ȇ8Qð¯1h­¢d5VæåçO°ç特~¿¨j^ÙjU¾V_°ÍאSV\X\îÌvøV‡Ö×V×7þº@`Õ7¥G â_ÑÜ*¼"è[ÙÜò} "ô6øñW‰@ã¶•jh-µ‘õx :Œ»†šL\NZ;åøSPØè½ 7›?Öç9Mº÷[J”k®î宯¬ŸÖÜåk­Ïž=ó(mÙÑça<¼~<«À½„Lþ*HjŤ6ô XYFÅTˆ»ZgC#$†°KûVCvö2ö­3Ÿ«L +1ï‡ÆÁo¼úÿÍߟCÜ“GÀ#†/ŒøMkŒqÈôŠálÄ££GL+5äÇ·É &f;H!Rö(“pªÛ{ž|05òd™s|"+ŠÂ%´ö¾e¤|á‚…¨Õâ®Üˆ|‡¥Ä¼Ç^D{ß¹lÌ*oQŠrF*›°ÃaÊ Ò¯÷Þ‘GõO0gÅ󶄍„¿ü¸Úõ¯¸zYõò©÷.u}øº¾²–ÑG¸7à~v 2¿Ê܁*þ}Úϲè68\Ð$ýy*¢iðã_€=b:ì*BtÑ«LE~N'P[/ê/ ª%R’©FÈ|–žƒÇËh;½DoÊñ¨ÀÃPÃÇQ%m¡³ô +cíÒDªÒÖÒ›ô· ŽÆ#·Ê‘›¨ƒ¯à;qê¦a¯UȉCÔIŸ²$vS®ÐÇêÛõ]úýϐXDée:‡öK´[Lavö®$¤6=¤ïÓ_„ƹ4.×YzþkþÁ&³£ìuv‹§ò™¼KZ¨,×;ñ^ËÆ~ªEÆ´â\®§Çh#m¥mtÒÏÓ &A‡d6‚gÙ$ÖÄZØ“ó>Á³x._&åHÒi銺™U¬‘5³­l?;ÆN²¿òÉ|>ÿ€ß–Ò¤MÒ.é¨\¢xï\Žì‰ü6rKOÖéÏë4ßm 4Õf¤—š­>©€µa§fxç»ô=ر™Â´›žÁésˆõ: ‹^¥_Ñoè}úþHbCÙýl ›Ææ°Ål3³§¡ÉyøèCö1—ø`>ŒFKËx%ðm|?È5‘²¤ éŒÔ-}.ß'§ÊBž(/“7ÊOÉÇäKÊRe•²QÙ­ì·ŒŠññë;9‘øHcähä¬ÈÐgë‹õuúãúUxËx#KxSZh¬J3¿l¨¢98sd†Ñ®B«¦E´Ü¬&~óä±2l\O?€•[à×ø y’öÑ~Xz9z„NÑDÿÄð5ú]A¼‹vþDÒ-úé¤#¶1,ž%ÀIðÄh6¾˜Éf³l[Ν¢µ£me{ØOàŸƒ¬ƒbà¥Kì û€é\æCx:ŸÊgñyÜÉ«Ñܼ…·óüÞÁ_â¿à—ùÛü*ÿH’¥LiŠÔ(=!@;‚¦Iç¥Ï¥;2ÉqòTù1ù¦QH±*s•xñ¼rAyCù½rͲÈòŠåï1ž©¤Á–#ý·4Jj£³“Oz™u…°YÌÊDz۴M¾$¿Íså¡T*ÏdÉÒJ¶žy gö*KP¼|8ËÅ >+5*-£(;ÆO*ÎÎ^ 4vQÎ`›Ø³r_ÊÛø,©‘fJår~YΓ® H•±ùÒNÈ´qdVäöhDBµääÏÈŸ>mò¤‰yrsì¶ì¬ñãÆŽÉ­Ž²Š‘÷ÈHOžzß°¡)C’“Jˆ‹8 Æ¢Ègds©…µBS«ÉcÔâb»1V½ xûj5|sh…ýy4Qk²‰þœàlügAgÁ]N–( ì6áR…vÑ©Š.¶´Ò ü¸Sõí¦‰ËM,1 X­X!\©MN¡±ZáÒ ÛšÂ®Z'äuÆÅ:T‡/Ön£ÎØ8À8 ­Pméd…³™ x¡kF'§ ÐJ+U.­Du*hR¦ËÛ UTº]Ît«Õc·iÌQ¯Öi¤ÎÓg›,ä0·Ñ,-ÆÜF4æÐÑi;ÞÚ•HuµÙñ jƒw¹[“¼c¤l­HujEë®§Úm]¬£Æ­ tt1ªqŸ¡R}CgɧÓcì–ìp·÷eO—®ÔfaÃáv¡í«t÷µ½Ç¡v[Y•Û ­U×Va˜Qå6-€P–š% šafÁ>ÕePjÚ@užÚ~¸ÁJkTµÖz<­´àŒÞM¥.®q«VmNºêñ:3:S(\µöDI(é?c·u&&õxºsÐà(ˆOè|wçLd²Z÷ºš©%HMÔhâV5ž9Ýè|Ó)\?l¸ÐaÒd3þøŸóž÷}Ïó>ïó<﹕ü$á>™ÍG8÷X?„¦uyfMüŸZZ[Ü%<þ%_³Ÿ#}JC'eef2\=ksò­¼YÑäžuØš2¤b2Y–*KF“›{Ó‰-ù¡`~òdyy²®4ê.©7=ðV^—¹g]­§vÚÞ蚺¼ZÊ×ÙWbž„«ò5ùå«kªC¥É¨³qNËB뎜_}₏¯Êç#Åÿ <U/ºð¤ÁÚýYß’ûÇÿ½Ç{×{·Þ‰_ŒPmô~)QÆ*œ[?òޝüûSlS&±Èa}(M§¸¼3}IÞIûÔ#ô-µ‰P?)&¡/>/·È©ý›pÿCh'Eÿ×ÀUI°´€oƒVð]P¾‡Á{˜£Œça•öÒjåe*gÒŸã{s3xõ·Ú¬¬¥m¸®…-QéyZ‰9tܯA»©í¥°ïÜÇq†î˜ùJ5á¾Ï¾†9ïj)_9D3•Céqy”^‚ÝwðÞÐè1™Òã¸~ÓYCö,‘߇ýDUh/WÒ«7Gl¢¹â¦ô€|Š q=O›Žþ£´ýJÑ ÆÆ0v¾ÔC;àÇB<[ˆ±¹°kÔs¤‹´sn—/â‹äixÿ‹öº­µ¿Íkv×Äö;6=‚e#ì{Ë>›gÁ´ Û&Ãv=Q‘Tˆ}݉}Ù™Å}“|QØÛbX×RìM>ƒÈ››Ï‚¯Ê[éIÜρ/+=XßVò€'øzš|€š¥q2ñlŽúžÕ©81vŒtñ›äWñ¬n¢:¶kÙˆØëµâa+½; ¡OÉ×(WªM§Á-¼ë¬¸¿A_±жqQ›Ç=ØCø¼ø¯/Ì‘xÿæðÞkïÇÜ™âÄïúŠåŸQÄ!Ñ|ÄäqŒ)åñ˜÷g?š(Öƒø{k˜—‰Üýr±öá-2˜BàǨÁ;`1b5ýŸâ¸åØáå8áÁ¼!Ø·ÔŠ]^ÇZš=ÉqrçuŒÿ˜ ÂðÅÏ>ró†c—muçæãØqՎsŽQà|àõr|¹jåáÚÎv°8Î\Õz£4—s‘óUšf«xæq³]Uþ’¾Á~â=ç<å\™P×>ä-玫V F]ð£ÊlŠª%ð=SX:=|¾!ÿú"Í”£óØûCx6ÖÀJÏ’ž_ê'È×ÍV\WÀ¦ý“ô}F» lSNӀåï´Oü#m`pÝ ]Ÿ=ðÙûv²¿\u÷åEã:ã*ï›Ø”îqôº£·m¥¹\¹q=äš$ÿæÁ^Lø¾sƒ:~Äÿ“ü>Ùß“•k)×37Å앳~« §¹&ð;àÄUúoüœë¾º gÒZœøàVkAèFM¸“þ­ýò°÷¦s¼Çì¶ÙÉ·5ÜÏ­ûÊ=+>ã܇ë?÷çu°mê9ø5ß³ùXD«¬`›w .NÑ&ùSZ.ÞAMþ1…6™kùJz̪Gx.5¡ }°®õV?öïÔk§¦KoÚµTQ‘‹Ò¶îŸÄØ>ÄÏy÷HUwÐB%_¸ïâúûÝfÕúZ*æ5+?§Fk/œÚÂ{ë9CO{nRT[€³,}Æìذ|uŠÕö—ZÍu‘š=£E´N@ƒ1ðÓÓ–¿?º¾R~‡³†}ÅsÞ£jö•z}ž!ѹ=gq}˜Š=Ï£ÿЃz{z‡fYgP~áL“Ž`]ïP¦×qÜŸ¢¥°É°8n"&ÑG‘qÍk¿ÅYÉù!]ÃyR3ÑÎçã?Á^ÄÄ8Œï8?0¯t>Gü:çÞ4+ŽaüôC«?×MB¾TST¼J†Ã“ՍiÕ®e8WFÀ¿<‘Kç¨óþü 3hÛo×q†|N”£éëÊQñ ÷úaŒ0`?ce~ö¿¶ÿ?ˆ#ÊQĎ×7þºÔn¹Êµ$Àl ßg´J ªDã ®˜Ôžàög&Ú+‘ÿÍ ”¾zƒ?9Å6ºC‹i)$RòiÞ]“N“„§}é¿e”“” ‰I3K©Ù5¨GFÚG.Hûvõzè—úH[‰®ÿVàWFø¯PÞ½{Pï²QY¬‡–e‰_'$@ Ü B™BŸ9UüqÍ ÕŸ ê×™fíÖo6CLŸÞÜ0¨ŸŽ,Ö#m|Ÿ¡ëÍõâúH>^Pý«¶A½Ô-Ë®P¤Àm×ào„€L ÌLô߯cbÅ:-+WPˆ€(H€`Üv®Dœ+°DC¸„¹.Q€ap¨­QP cR¯ÛÂ%3q46¨Sg°3ÔitšáN•*ƒ•¡J£Ò¬WªÔl µ­fk¸U¥X0Š13Ž©T¬ UUf•9® ÇÃcÞИ1fŽIF–0³ÌÀpÖp@5êÍzÑh0ÄD}ª^L4¤Ä۝‚÷ʈP4°{x·˜hKµ‰F›Ù&&"‰Ó©H괬˺R (².ê’¨“.ˆº KAo0P H!o(P"”H†×T’é5!"…½á@\j”Z¤œ¸õFB·.Ð"$¼‰@»ò¦™'„oG _èòv†„¯ùÑ@à²0ìdêZÐW …|%šá«ÐL_DûâZÔרÕùZ´„¯]KùNh¾~­Ë7¤ ø.kþ܀РÔMv/JÔ-¢F4O@(!9¤”È%J\Ž+r£Ò.·+™ºô(!‰bø+ÓQÂþ¸õ7*uþ%áoWRþJ‡¿_éò)þËʰ?—²CÙfv"[¦²2dÄ”Ç<æ¡^áJ÷ó l9oËl9gËïmùØ– ¶ÔØRmK•-•¶¬¶¥Â–§lɳ%×–óUè8ø;øÜ7Àuð)8 úÁ)p´wA3hß  l[AlëAµõž¿Ú¯;kË -Ÿ˜9Ð[à<øåó’@Åñ™íǼÌJ-dk­Ôí¶xéb„m Á\,%Ü Ñºtˆf—êâMĘKõ„Ç© ¶NýSu­7)^ªoÞÌçËo~½ôÛ­åøX|L†´V(0ÙeïêžÉ&Ï™•Èo´ëód0õ…ÿ1Z<Ñ›,U¸ÞÆA/>ãL¹ne<7;[ûÉ5c6­·aB»dÜñTÔvÕº–rë¹u-a‘ÓÒ$⩾d6W3Öíö¥â8 ~€&„ Â~MÔ|DhšŽ/_`†½f°úãŽ Ê(«4z¡]Wi{SCã´²öæ·÷cy endstream endobj 1241 0 obj <</Filter/FlateDecode/Length 20704/Length1 30028>>stream H‰\VpÇþwï%Ù–îtºÓËFÒY–±-Æ’%˲Œ@ÇÓ&‚ؐ‘§ #lcccG<¯ÌZ¤JßUZÎx½Jñ4g#<åaì¬~îµÖhÈ &UÖëÃM<ÿ´³é¹ðŽðÁ0£pÿþ‚šv×¢ÚZgßY®ºˆê`‰0‘ÍFý©ln0•5‰Q¿ö’6j²FŨ–LVÈÆ³d8¥åEFÉ]@©AH!'²Z¬ ‘†p}¥EÙSÎr,gDœ%ŒXÈS>õ”W†ëg£H¡ -²Ä2d™+K”É’6¹S½¶%ՎÐöÄŒ¶ör3¦«]óg8“êšDçÊ—÷…V¼;øÚÐÕ~ñq÷è=ÇÚ+/ž:š¿‚Z;š“_ÿþžSÃ[·/ÛH¥ÒÙçšmZPï›ÙÜ\P†;_˜;t­æèΝ;ïÿ°wlÿ’ÍKw]üQÿŠ·«&×|ïÀ²|¶åê‹»2m[…0Ëçoâoƒ ªO#ÈàyªPò[L„ †?©?/ “Ù'(l²ã óôÓI~ OÒ«u Íò»V,¬$ŽäoDÃs‚^™Ò­llI.è#»ì@»±ŠDжÚ}SDl—Ðq '´ÏF£àåˆ€Ì §¼‰¾ëË÷bça²¶oê!ê‚{Pòy8ÁS'õÑ6(!k ž«D _PÀ¼á“`KK0ÔÜ|¯%TßÒRj!’~•ÔÅ^f7È`ƒßªq̰,¢ Êl³ˆØJ1Èf¥Ì£È lɨ±l»h‘DÑb±ZD먒,ƒEÊ:JKüZk@UÀ %ä,ƒ- sÈV 9$ÉNQÑ^eD«h/j‘(:ìt)Ÿóùb>a™˜ä™ ‚#r‹ûb Œ“ÜÉȦ֧Û&üj±Öæcȃ „,ƞ´<ÏÅbœÛC)B!ÎÃQYf"N‰ÌFq¤DôH¡CÉüÄÛÖÑ0ðÏ7çþ*¯~ÖXŸ{ߍÿœÛ‡ÞavOÎKþš7*ÞD‚j^îÅ›r‰™¡YSé<³—à´ò°á „;ÀŠ6©¼¡Ì@›¥4MÑ%"ë›™áiÚaÍ ©%n²Ùìú4ÏÛZÂ…òÉšB~RWÂ_ 'ùÅIÕfÿÂcíã-!…csZÑòÌ"RH1yÐGþ:¼ÓðÇ)Ø_Æ«á@ôÈ Ô–e`Ë¢eÌ^ˬGùÍùƒ£«Î®_*ÐvôBïUÀSLj«íg®øPíor»\¢Ž×'ugiÒÁa6ÉÙE[Òþm 7¸wI<ï§3)ºá.§ÈcÚäpâNª‚Év‡Ý®Óq:¤Y#¦<‚‹&7åtñ~åÏ{:\È•Á{κýN伈íP.L¤ö\ÊFXN jOˆŽ äÒЉ94¶Md˜]àù+Â}ÿÃø×[B|Œð¯Agv¢ã¡ V‡”òu h ®,=Ë-h J¹ŸJáö0UûìeÏœEurîRÛPŸÎ¿„n3×þói} ‘¨¨ä%ä»‰Ì öéÔ‘Ü1 ¦¾ ˆ^!ˆ–B4Â1µM.«®©©$SR¹4 ºpUMM»$K’$ëtÕeu=‚·¦•õ4VW€­’%!œ..VÒŒd•¢EFe:Je>d0“Á÷΍IH:ÆS¹Ô V"±šláaŒhFC*W°ãB02ŒH Ùþ¨%À(A‹fœÖr¬¢AšW{<Ĉ ¦¥96EÀ¬– ¢(ï~ç­åwîž?s0“ÿ|òŽex‘E¹Êø^Ԑ_w¢ã™èé°|ä%O›uë½ Ëïd®µê9œQ¼†Ïo8h¦wÛl¥ö܏»Ï¬ß8«¦¼5w3÷Ëb}™Aܱæäà^âc—ÉÙWÄü ÊaŸªÊÕr\aõ9—C/tZ¿¬Åœâ6p?àhí§19•—\ÀXßç¦dâ9÷U½©Ï®i‘‰~*NµRu ÿ‰(SBçdYÅgðƒcºL“¡‡œs¹A“€KŠÑ¤™w.ÏGý¶lª.B)rœEB”§rz-©@Zƒ„œK+9Ñ<Êÿû£;w?½zÝþþºWQÑãèV6AêóKò降¨É5VÃ^ÖËa¡ˆ/N`IB…×ÛΤ…šd‘’\¤ã}U‚À[y_Ñ´´ŸÕ0ÁT½‹Gc¤ðþËwÙÇ6qŸqü~¿ó{âÜËïâ;ŸØÎŸÄv o]^½6r)/5´+b(… i‡`#¼„Œ¶cllë£Bl-Ó²vÝÖ‰­R‡V­“д26†VmHeCe#µ³çΉ «‚eìŸdK¿çû|žï÷’ëÏçn•+ô4ŠÉSÅÿÏM«7r(—°Ã¦Xà#P0SêdU-ç‘„fz·ð£sù2¡çÑ5ãtחБW_Ëtí_ýÛÝM|á=GmÌ~¹ðëÂÍ7ßûÃW³ m¶çËÊ¡{W6_ÿÉÇo¬[X5oüp%'C€3gå(ƒ¤¨ ]Ûìèc÷:†¶¸WÊU-j¨T¡x«;ùaócøªN¶‘A‚ AZ:g5QK{hè¨wãµã1ô¼Îêh #ZGðjÒFÒìMãý¹;ÓjmšXîFêmŽ5sÖߺ‘cá=Cý­§åZ¦ÐwZ)Vß„Ñ#3uP$sjº•DZbû¹±Àyâå»ñº²£G¿r6¹äâ¢ÊõËÏ~óä÷Iþ fMG3Œ1g´ã((_ûʱ°–ÿxïÉüꞖuòoº<²—Ïfë³õJb@=¾DАF“ÔõÊ6OW·Ûg%G½£1›‰%® Žá_d³pi_MdPVpJѬ($‰ôŸ@ˆO© TAÙ2Ô6P%„u !ç–:âŠ1[jݾH˜ÆdŠâ7ºiD›—0&) D$)OŠlµ½Dì éµ×ËŸÓLœS€ói)¢)iaÍ[&h':©)¶[­ÀÑâÀ3P˜zìCœöçàÉÞ1ß&Tnr`¥†šäB]̶N¥ÆI+u¦=Ã0p™IÖ¾cEדóíœ;[¸¾:ûΫkŽmãÚ<(Q¿ÇÕ®9K…cs˶ýåÅÛ*)täw›ÏÛÛ˜¿sQ0*>úû»WþØñâç>¨fäÈ¢EŸÏÿíÜ39Ô…œ·Ñ{-=(ʹøhC‚~ÐÝ슪ªÛY[ç@l ÎÇ\H ¡d&e$©æ6ƒbÝŒÁV‹UFuc]ƒÑèt4GUŸ(öªn~ꨫëÍ4™L³ËiDkk«9–E@a²±1ªveÔö˜[mf;ÕµêVu@=®ŽªÔ ÕŨ!µSíV¯©vuŸÔË3ª˜ÕL»'3ÒÎ~€ìþ\¢Ã2ª·©¢±ŸEÏšÂà¾e™JµÎèí3z¾•÷€ËÝœ–wEÈÔöá,M¬/$BOû^Âg7Þîx¤•9ˆ‡Ùf-|ŠàÝޞööŠÂ{zÁB.Š,îì¬ÉïzÅÞ¼`#—?!¤¶4۝ž»Ê~9›h)T¢»L…ÎfMãC<5Û¡º-ÓÆüg‹R*ÂjümfCf¶·ð¾-ùÈ—¹|/éÛY‰2¶xæ¤yÉÌø)NG²ÙÇm'¼åj¸KãÄŸìàôàY£ºêA7ípJ¬½Š*(Š*˝¾nßZßVŸÍ7†›ß³ˆ£Y] oñ¸á†J"¦²Š¨$<J·²VÙª(£ŠƒU:aŽ\Â)‚ÿLU!Šò¢íTÂ\OÍÞb§]=oæ#+ÿÌäm*âjZwÍý½¶ÑâÖé›6Ki;ð.]Qy{nÿá¿^¼|äé…+¶Ä3aFTFv8¯!d«o‚Š<þéž­ßuáØÐ«Ë:ZUó³f¯Øsú›ôÏ 3›JO|~6ÕiA~ý%§5A¬QHRQDy…¨v«bVÈHá éF£jj™l%äñz5aÔ×Dj”H/„ÉJ3º9…ŠÃ®»ªö¦›„tº þ¶R N‡«©¨0An¨¯—e¿«tÞ–n5±i1íL§Ï¤éôOñU ֏R¡bŸFk1[¨º&Qµ˜u=´Ñfxru¸ö½ãt±Ó]–Õå&uA%d¡9ÝÈ7-½#ç–WêÖ,~–{fp·eN[;‡—s¹gWxô¤:ÐÃå×c^†-ÜýhÍËÚI&¿¬zªé8Õº¤ËæàX²FId³ ‹›ò±l6}œºTØâöøM'ÌÚNÃ'‹Ù$dýfk{ú®õ0}Ì˽’ù"ƒ%‹_"¡¤jƒ2Ñ%A¥rƒÃÏénBx7k:/x¦®R\ŠÃ:×Çmã¹aîçะŠI¬(ŠFDâH/é #ׁL„¹õ°1Ùð¹I‡Üš¡¨ßømnï¼9Lá}G¬ñßBx‡~büH™¾Á‡šìÉGël]Ëøq‘ †~ùÏ‚#»Ü¶ŸðA“zx¹V™9 ½ wćx>^ÀY¨òiJÀ´-ÜËÃ_ïÄÂ/áSá°3îF)›Ûn؈‹jµFÔÊt¼‡3xµJ1Ô±‰úÈa„ˆ‡‘€1r{<½’_$?í—å>LÃ!¬ªê›L€A?µÑ´Ùò`‰€,»h¿‡n’ªâA°cMJÇüR\c%Q%u^,á8nÁYÈuñkØ…1#…¤­Òqé‚tIšœ!©SÂÒ¾®s”6  i§µ ÍÎhÈŒ|wús0„ü#Šv—`'½™í}Š>C’ÍÈÚwßü¦fÞmx‚Q¶Z"çúûQ„LzZ0t#…6ªQ¦¸öNé¾ ý{+¾Œ~Ã-ÐÛ=…_Ѿ`{?ŸßÉ­ïhõ¢®OÏÎ>Rø‡¯ÞX*€w­ûšˆ$ÜØÑo¿<þuÛ–lmtüi·Û_thiÛ[÷ÎØûÆï-‹&­Z¶÷Úd·[A‡ðTþGx¹À6uqüœsïuüŠ}®}ý¸Iì{mã\;?‚'äáH²„ÀBŽ€5#”%& a!`Œ@„¶AXµv¥-u R ÖmZVMÛªö(]µJQa6vv®“t 1Í’}ϵmé;ÿïÿýþåD!>xV¾‘@´ŽZXtͰh ýyî6„b,QE™-dÖ‘$t}À3˜fb‘‹ËöãR¸vÂnÜwbÝqê¸ÑP‹+Y6ãßAUVbt&»ÉOALéú¸.O$Ô \¾8ÐRš¸6×”ÏE,Èó±¬ "ÔŠY# ³Ä-ãæ(²4±Ø]œ(º›§ÓjM!’ ¥öQÈ@˜XèÂFý> »DŒm¢MôkcxϐÿÅ-á$ú›ì"C¢,ÒÊB)‘ܵ‹#â¸8)ªÄ Tü$¡m雟eó RD´Bxõ1hʈG=ï¾Ì¼ ~Z¨èáÿ(ç€òÕYÃíëkkkÛú2²‚.ø_`"2òd"†uNJs‘å|¾‚¨O³V>UÀ"ÆôZqúâ’Ô¥´É窩q›R¿5÷¯Í‡:ÊZN‚ìƒcÔ³<¿dis³æÜƒ…ôý‡‹‹½µ¹Ùÿ.uC£öp$ó!ð*ÉÕ$cdØ(×–²‹ø:¦Y¿¯µ¯å×3½úAþ¯SÃÇÙ—,cö1^eHÊšÈÒä´SÃÔuž¢ÕNãM%)Ç;æqí¤i•\à$EžNõÍ:çt¦i`‰sA†ÚMln•f`AÔÄFòiÝ]Xýezýõ/ÒWîÁÙ65¹ëüØY˜Ý±õ-f:LߟI×§g`¤Â+©†Þôíôê?øÅGw¡ê/ÐLŠL‹ ¢~ƒr>¯‹ŠôœÝç/āYoŠ›E¾H¯Ÿs5ÝyMܝ„›d›(šý$œrfµ½ØÇ³²kó˜$úÓOí£Åø^jú1îQ‚å½ÔÍùa@Rçd0ËÇ ù•8¡Â.·ôD&%ˆ*ËŒ™,G‹þðÉö#Ó?i9}.Žì4¥öš–}‹ƒUTq¬Z»—}Ö»óÄ¥Õ‹´ÌÕÖ76OöêÓTvvž¨°îh¶Á)¤º³{½}›ËG€¼‘PÕ“sv‚Xnʍ•ÎJ1"5Ûês[«¤n[§4$ÇÄQ){XxS˜( `AB‚,0žNßsÂß~á°ï–e`…¢ÚE‰p¸ÖNÂ2f½ žRQ½„¦V“ ’¨å­Ú«aÈÐ}[¥ÊsU'!€Þ„h–¢p@¯·¸Úó†óFòÎçÑyŠtüã–I²(Ò©ËHGI‘Aò$Q2X‘‰ŽÓ³¯€`ç4K&€©"6›%ƒä–l‡€bÌm^b½%Q›’ qF•ëTJ$·0#@¦Ì”)6@J·Í2©f͝€âåÄÆéUêªÐ7ü¢sÿæîͺðÚ‚Ó3`ä<öÇÁª»é/·œ¿ðÒ›éëç\þ¬×Ž<µýéKgkÇÞUååÅÍŸ~O½ïÛ»Ÿ¯^f0¾-¯¯=HO¤ïßMG´ðŸ_¹’¾—º{cÃöò Ïî³K<|&–è~æz“…ô%š¹ÍÜ Ž‚:ð¶»Ëëê<Ŏq/œ œ ª8Œ[\ P„ɊΉ§x!m"B9Ä$\.[Á›ÈÑ0ùØšíp9EQ@i+Ù`¤:HÇèz­"çøñŠŠf'aDÖÃB8HòEØ*¸”T!/¡‰'úÈMÈ:bE²’@xS6*}¾Bh†f…… A¾×צø6¾Ó–é-òº0Hr^EFìd¥vUíÓ±ÔN媼G>œ÷ÃYDdÜõÁ2‚¿žˆ€™ÞRaSÜPE=HYóB””¼‘/åKÒ¦`a ý³üƺD}®tqב‹áu‡®Ä:»ö§ÿ}¦ÿêÆíµ‰†öߍ_V¾ú«}M0÷——™¥¹‹Óðxë®#¯l«^W[ÒèŠü°ÿ;¿ß¿lM2¿ÿÑÐÄ®ê~glùºPMNùÇ$ʤǼ`J^:ì‚9OfDf<èÈpàÉ=Ÿ£&½-ÞuÞ—½´×kÎŒ>ß—ƒyŸ¯e*aD ¢j!0«Bä$dó0¦dˆ ”$Œ^èM"·ì˜pXAøv~„ç§ø[Æåi~} ò•ÂWûÚîd*®\SÁÇÆŽrU8Uõä’!Sè¢<_õÐ#æl¶Ë”·UY8D°·Ù±u¨1bL_£e/p)É|¸ªRËT¡è3?Xìi`®¦þz¨ußoôÁV­ÎIŒ¿€Þc1;<í›cS$AÏÌ'Yµ¤ŽAðs¹aw”;ÃQ~6“ÌxgNœþ`ØY[Ü®R«[%?'I~§(ƍ,g4²¼Ý®Pž>áÑHƐÏ/±FlL¢¿Ë-qÒJiƒ4"K“RÖ JRñ²6¤‘lFÙ­£ÿAüOøÂ«>¶‰óß{>Ÿïµ“÷ΟgÇqΜ?Î>“HRaÉ¥ ![4„ÆÄë’ð‘º%i-í†U%”¶¸i  )]ª¦ÐÂÆ`dhÙÆTuÚnL£«¨Úôª1*¶eÄÉÞ;;&m“ÿðÝ«ûç}>~¿çqb¬&ïô€\Qÿ9þ×ÈšC.çµ­nd7¸+ás”aùÐêÈý–]þjøgë©ñó;^V´Gq¤¶›¿³¸Îu¼òØÍãÙ[þó:h/ntáÓ—ššGº)(2Y!>¸6%#ÕßÍ®zÿ«?žëßC¾ÃZù"µóþvö3úFµ˜ø@ ï†Ãöa‡®™oç{àn†:_q€Á[ìÖ˜…pdz‘Ýwv@‰BÞáuò|dl2v‡#øÉè´!£ç-f³Š8ï€NÞÁPcIÂìö úal„­°¦`ŽCÏ’û‹›Œ›+åql{­ZÍW*}Ù|ƒRþ{…Ò¦Aܪ¡‹Ç¾Üzue >!âšVTÃ1RYØÐ,³àoÜsÍÓ—×_ajî/ÅèCbÍtX7±²º|Q4Ê=ukRßP%c¬þ9û³cU.)©.¦‹ï$‚]RW¸K2naka-ªe ¨“5¥@ŠLƒ4IU·Ê‚‡dêy¸;8ÖQ¼¯`ªBT‚¿„Ei4tÆÀ‘s8:y‡9Æyb^"Ù.GÊb„à,‰ õh"d2³žâ¥ ÿ+½Œö0±`ÀðØs:ÚŒ’Íh” ML,²…Ã!ÕrÄ&3PŽ0|Ú02ÚÌy÷V¥L‡%)#åtXÞø;#9‚0àtVðÀ(Ŭä’ÂÒ2)*=*í”~"},Á*©Q"G°y2äžSøJŒú¡‹9Ù+WÈŠ¼ZNÈòGå7dR>Köå8zůãуwΕæmÞǵ|EÔßÕŒ´Ÿ6øqÊIÂR¸Ó”˜¹“çnJjUñy‰0¹[$Ú[D«JÌE5ÅÅUÅÌiƬ (å£Jè^iÒd$Í‚æºEÁ‡ÁYÊZôàz3Ùfydé}`¸d®^$#pÕIKÂÙÁñì'úÒ5XYÒ‚é:ݺ½.1 yÑô}º‘‚_ÆíiAùšÛ&jùí‹ú¥u O;oÖš¬ÊÈ+l)Û¨M§™‘³bi”ˆB¬„ðK1‚5¢ë±Ç<6"äÇiM5¤O„ŒÕfKä,i³ÛÛDŸM}~«jN"å>Ÿ'Ïw‰‡ñ1Ðf´ÑV(e·’Ö° ù8NlW‹ qHL‹ãâñc¢"’¢˜!¿:‚"/†ŒÚÒä¾ÐFc>ØUþ‡‡]ê2QÙ›óÌœ¥-ÿ¯ÝÞepp¿¥œ»ïÍy˜F<6-dji\l¸¾¿ä-'xÏúxëÿ<éðÔ½L rqå„)¤€á_‡BQ(y‹\²CY[ŒëM ,’’:{²¸XgB,§+ÊBˆ#‡P%4 ]n&„·…‹Â„I&qƒÚ†³Õ8®UŸG­4îW” dÈ¿*…Ðß»48A:Àé2Ê4ò°ûû®G¿Áö÷Åç8Ôèãpç‰Ôã5‡ýÉeÕØugՎN5´aZñûEÍL ÞÈw!®:¾ÜÙqù\®iR;ѪùÁòWÞÿákÓ;/-ûò\IðÛ ËÆ&ª›6µ¼ötÏÆÖ—öŽulüÓ‘ƒÀw¤/~Ò’¥¡¸$Ü2\4“Y£èÈ]3—Ǟٹ´ïNÔˆZQÚ††ÐKhD¿F¿GŸ£oª@øp^@4‡¿@)”Fz„0g‚ñ(8g¥›9""ƒÿÊ=h•‰Ó†JÆd>üêçc†6Ír™›C§o·‘T.B䲨 îÁý¿}ý™7Ïü#=rÔ Ý·6XÀPtå†u<²vl¨C%»âð¹ÇgÞ;öæ×¬Ñ no4ûêòèLf´/™ ‡¶÷« bÕì—ºì Ñs¦> q¬Ï×+e6Sî¤É &)h6ç[*p5øæ$RQ3½Šaµ!aØf8aÐs`8KN~nª?~=ï¿®VÁíâM€ê üœÀüÚ=éù²ç›“ykqâWÉô»¯bx[êþErmsðª¶Ÿ}ï‰GG¦‚©äGGÆ@d⩎•-5¡FGÏ—ÍLŽïÆêYÕs«ÇOT_+‹[¥^ç ¿Ë·Ëÿ‚q˜"ßÓ¢NOÖðonP]\Áây½ÎÃÚ¿Ç~r>Ûäì\üã³óâKœøÎÄõ¼584`Jš’P©»¤¥]´&Óè(PH‰¶¬TÚNM!ê²¶¨hŠ6U+ÛPµQm­T&µšÒÑvЪK̞;Û!LZ"]ìóåÿžï÷óýþVY“©ÃõCù†4aŸ²h'í³„I6ãç,ÓÈiW,ËoPÄù㐞摘P¹@zZŒ«Šš¯ãm…ï#8µËEe$žWÔ9ü@ë³Cµÿ<õþ`ß3øÓÁän½ûâ}÷4ö_G<<Þ1þâ/gò7~¸©íÈ£ ¼ågíMÍcàö•Üq„ü'Ä>Skµ-+{´„#4$´S¥:ð Ê`ÜAÚfsÀ If ƒF÷å Pñye¶PŽÛ6Úi€!Ѐ¯å€Ñh°¦ÝÀíAŽs@VBÊ0 'QìÌ@=„³8:á]Ý7ZèHŸ¢’ëR"‘XDæçûŠKL^Ey¨p'çPdÃúSØü¢:?+ÈïCÞKÁæ¢1*¶äÈ Nn^uþiFji×PÖòΞúŸœ²¿ÿå¡¶æ®hÈ[UbtÊãÄٞE}îÛÓÐÁXMÒË7¯â®žË ¢¯5Æ7…ĪX#n¿“Ñ!$±v,0¹AëÓúq~²tOx§¼¯{ßõ~èýÄ«•½iï„÷†Wãõ:º³!k,Ñ’õ8Ҏ“Âñ6}ÓƒïÎ[²ø,øNNALÊ&tÊs|³{ã\ ÐJÕ̍wMvìú¤KÓÕåŽbÍ[ɐãä$‰Î¶CЧdªŸš¢Hž”±²æaYKƒæ']|£Ö"ZX\qÞÄ1!EòNô:_AôHàÀWŒgô†€ïŒ¯®ö†\”ÉLWqÏ|öÆÊ椧ç~ÖçÌ~qaÃcg¦æ6•¤{ìúãh8ýèÎvto;ÞŸ»váè¾ç/t%ÎnÕ‘šr½Žë=ðìz]‚søõ$iŠílé>1 ES;ë™Îè½OšzöoøÅ ¥vfïÖìùÉ-Cû‡»Ûl;¥L>Y¾Ô¼ŠHÌ—ÜÝÎïâÇøç"ÏñoÑ¿£obzw(°ÄøPd§V°Ùê2Œ›f7f¸Í){¯@T΋3r6JÁ4oÉ:LSǹ™#ŒÄô2ÃÌnæ0óQðë]q‘ÁÏÜøÃå-T|û3üIò=Ì„qØ9¹Êh6z,~kPãáa6Äy ÏÊlš`w³Ù—ØV¯e;X²€eјßX'úßÚ”'rѝÁÂëÅ”g[q”*ÌFÁ³ýŸ)ª+!ø¾6™¬‰¤ä578m•uݝm¿ïŽu:ŽiœI‰&ßKñIŽðòâ·_±Ž²²Ú{Vœ|ecËšNp»Äì²Ò-H×I¤ëÕäG˜¤ô‹!iLº‰"xCc,†IbrP2-sS#û€Ï‡ÅbA¤AQ>d4VÌ‚=2…¤ÈšÏjt1£`䨬ÓD×DìÀnOé™X3P£ö­7%°™å}§Ò©sWzÜ’çrGÈ} °Tâð;Ý_‘.ˆ'rS6ÞwP`«Å ­£6[›A’“édr"9•$“IQH541Y‡Píbi—‹] eÂÕt8\-/©=…­$Â+˜ i¡_t˜ jü+¹¤Õàr†‚ÓZU|+ü^ðJ“Ês¼€ñ| |û¥º·Uì#TE0Ö+ìè]ӞXg:dmäêš6'·úw½|ÁQWkh=zøôß4Ս 4hnŸy¿§?uèЎžMý¹-°”.DÿËxÙÇ6qŸqü÷»³Ïö9w¾ØgŸã³‰í³ïœ8‰òæ'9 IÌ‹! !dnL0›ñ¦1ha%4a#ª`#!dE”Ñd…®D©º´ë¶?ÊLkÇИºUÚXD§Ò?6”Ë~缘&Í–ürg[ÖóßAïå5‘æ n¼YTX Ôn> ¼Fb»×ÕTù–*3?@ïpÆD»ÜÏ™•?B_w·W¯¯£=x¿B°^î$%c!Yâ(©Ž–"ðxW‚Áp”=…ó¡ ×§’Ñ뮆‚!©$2“Yà—:ô$9O|¿¿M”XQ”|Ðê*ë!ÎÓ>jB´aD{IÌÒ>–åý~G?âý Ç]Çߏ9³Ü¯w|ì¸ã “͍ÏÀˆn1,Êb\LŠãâmQDoGÄ÷D ƒŽˆ¸("ó–É0â¿È9ÄðÿÏÿYNÍîӧ蟻ÿ¹\Y,¾é²×-¸#‘v4‘ĮǠ[ˆ3O90BÝÈ0zãç­ÙâM;;|µ¢nùdë²uÜ·Ø¥R»òÏUm?½«µ8Bíüšr6¦Úc)år³Óluõ±Ž^ÜÔPÓÓÑêpDùƒ2£üN“æÜ%&ËJdu(µÝ@©Öžx9ð×ñSÊg§þ6öt~æ òþ™ý½`ÓOö›y^9¨Y†þ½9çy_{ÑÞ‹¸ÇVak´mËßëÐRH‹x9› (2eÐC]JoeYš²AØFÑ,Eр+2›²vÙˆ@aÆc4èiHÛ8¿(€¡„* ÐS’f\!WØ%»Æ]r!ôâž?ä‚.5U,sÓ2§’T5@RãÔ‡ÔGô-ê}¦í¦×ÑI”pïP÷(C1tœŠÓ‡¨ôYM«é¯Ô@qTéSr4½{Ø9õh,§êQĨ~R’æÑ2+ê$ê'é9š'þìZuž*´…æ)í×Íí'µ)ð‰~ÀºâHEá¬Âv'\¢).o²Á e­Ã›ŒûjßU¸½u¢gkKóéÞÎ)}Í{V­Ú‚ÿ9‡ryͿݗøð̈ò›óxß%åzzËÎC°~¨k7š¸êY%Ꙃ)ùÛê¤&}Ìø©…h­ù[ÁV~kþ>Ž8™?$¾ ð¦CÄHÚ˜"˜>epj@è84Ñ*Îi‰¥iÉY0‰ZŸ+“× è|³‘4ÐR0@3@²Kˤ´ô=鉸)Ý•0IšÀ¾óž´l[“Öq«fµÓºÓŠ3ÖƒVÌŠèþvPâ¤`¶(ý©m˜'È,àQ'ê뙇Ө-ó} ç[‘x¢(&ÔÀ2¸¸–¹+ÞìCàüOÿj¹ò&Ql´)N[Á6>µîØúW/ž‡æ#ë÷F”Ç.é\½z´/‰O>ê¶ææyšš’p[2öî™spéxC{ç1å×Ã;_r©Ÿý•þF_7ÙCö’ßϹ`x| y ÑÌhéMqâ$mg!ÄÝÈN'°ˆìËϘt¨ü]$Ȥ À!ãLÛCæ¤yÀ[`?ãPo„¿9ÙS¹¼­¾Ä_N´‰VÈ{ÂöJJ—6˜•ÿpEK]ͳå~“ƒ!iÚU= <:>”YbÌ~Š·©´ ÏÇÇpt«ã-P#çÔŒ×¼Ws«FSSSäY:ÉðÐÍCôˆ¼çoMJjšÊðŒxÆ=·T[T±æ®\¹ý%Ÿït_yÙ½+§ßXFLy¶Žßì÷‹/ý(\zÿ`ÏÆª†HÀ‘ÏQŽ`fM…Û]Z­Ýxøý¾îÚX¤€uÛmoÍÞõ5~ \Qå—ªID¶~VsÙú¹´ÃtÔ„aZB§ƒyè±@qœ¢t;é1ú&Ó4ÏÚ9¨Óµ±€Eg£)ÙdGB¬áZóìv#hJ­~ȘaŒÇ:€ÙÞ`GÙ+ì${›ý«ëdûÙÓ,fe6Î&Y ËB–Ux}á …OÌgÒêPõõQþiU+™‡ º°sÍÕö¹¨•UA5çý€îªóªóû‹RŽ“wºxÒ©7à$o¡X6DD:ÁÏ ‚ßHQm­Ý­bñkÓ?î®/©€ÚiØ1í,¨a/ 7ÉÉÑï¼_Ñ_G‰†aŸCý:†6È'hƒ€a9DJÐetx1”`ÿÃ~µµq]ásw%-z¼Z! è!‘xƒ1˜òö7Ä£ „…ìÚN:qü¨ã&ãÛñĞ&vi;‰ë¦ã0É'vštšIgZÏ$ùÓ¤í¤ÎØ­Û2¤ÓŽÓ¸MA=»°]»þáÎtÚñž¹÷ž½{îÝÝs¿ûs¹l5Çe§00Dú(IN’——“ÍÉ•'dAf–úÌÇJÃÜî÷]Ndç|\+×ǝãÞã$rTq4ÇñàÍ“ri\Þm)CoŒL—¹–ó…ÛsP¼§¶©\Ƙ{„°c¶’e^`n;¥˜MO«Éæ½¹fŽ+3MJ;g­õ¶ß¹7ôl^³(ÃH÷#ŸºŽú·L‘ªÃ¹Ö¬\6ÅT8Ôâµ¹G^œê;L™L›¨ä±¥D—£È’äh‚´9X^N'h_N5XòÀcUqã´¾N¦ÁNýíU—D¯›¥þàÓ›ƒšäB‹ÕS&§S› E˜éA’V$ŠåYœÂ÷¦Oª5ô'Îa¸»@vC¹|¡wÁmÃzÞmKP©á÷õRPó"õ*Ü^â–¢“Tγ,ï^c‰K@å-h¥%LÌãBW2ÁpÇûÚESf>50ãgaZªŠ —™’œÙ&{¶£snÃPÓók×*rM.ŠÈd)¥õãÁJ—‡Ë*ö®u7•xÊ ÎºO_8Ö[•¹Ö‘n)u9ìoà0ÓËꙥ‹ìÞµ»Cƒk-ñbFššR0þÌÑwžÔUW;·[Ë{  /w˜Ú›vX¼ ©¾ÃNëSô2‘æ‹ßSºA\Í9úcj½ø¨Àö YªÚ'ûc‹/'ÌÒbŸô²‡P„¤¨0ÿcžO nð>3x½u—KˆT·³¼ QW`lp7Ÿ¤?.q{mFYï((Z×Y|ðª¸Ss‹xHÙ¹*T¢ £ÿ*´š¾(*]]43væxœQ/}&~:á¼L/;›¸/©*¹8ù#ù~E†²UÙªÒÞ!Ÿª¿—’˜ò~jQê‡ihΦW¤WdÈ3Žhœùƒ¬„¬ßêN­q­¹ÎîÑ÷èÇÍp3†ÍÙ¹ÿ3Rµ"=”‡òPþ¹“â3n¼ÔÈñ¨‘,¸ïEµT¨“å ¡MÈX1È6šÌ›gÉ/°ÚìŽBgQq‰«ÔíòØóšÚºú†ÆuMë¡eCë—ÚÚ;:»º{6n‚-½÷xãy,3÷ÿ°ÿÔ%‚)¬Y‘КÀŠùšj 6Â|vÃ8ΪØôh4f‘/XTBZøav­ZD¯ÞMÀ™WN]y!¶÷»dp|Åòq€˜Nü#±¯^˳IP¿Óh†_ó+,â—l‘äÆt”9¦SDb:ý“1]„ú+1]‚úŸb:'邎]A€=ÃvØæÐx(‚]lu(é°Ç±~võ;2ÉúÙp`hd2ØHØ?úãlhðß;:€A„F?¶,œÁÒÂÞ!ljY±PwaÔùڏý#‚‹=c8ÞŠZÐïÀ™X° £—­Ûñél_±›Ä¾Fl—Þé7Š °và}%ڎaÛ†ÖCøÁ¾ gšÄ†XàÈ&hÀmр_Wü¢ÎÁ·„ñ½í8÷0¾‹oŸÐŽâVjþmçíæBë1ì ?à\ÿÍÑ·Û³wÁ¢%ïC~]ÃÂó÷Á›¼/YÔùuÀ» à~Lqõ hâÙ„þ>™1€ø¤ØýŒò-|\…AJ)¢(‘D$‹¥4ò!uðVZjÞв™„ý‚Ï-N5ó6¹ÀœúÍ/ø§â_‚Bü.˜ÄO"U‚Lä½XY|@^†.RJx|ÈæÕ¸œMä5øœƒ­.`Ì«cô§Ïã¨uÈ®D¯ƒ-ÓÀ ÅP-ð"¾‡ƒCðä@.”'•pÞ„·àFô&²ªÅ¯û!²öψ"º‰¸Ñš Ná˜÷ŸS!ZáF¦w`>‡äcnÅzØ‚V“¾?!Ajó?ù®à(®#ÚýÿÌ®$$´ Á‚3ËXââ0ˆ »+tp¨]ʁ•ŠDq9Š)01ÅeFsØ!ƸØXJ`8%b‘€q lI06G ©Âs$á*\hòf”p¥²­ÖôÿÝÿÿî×ýçÿQÆYuЀ i&hÕÐ8vÑ)ŒzȉœÁ[x?eHi¯T7[‡0¦õD9ä…WŽRYŠÑ+i5½NïÐNúŒ.ÒU¬þ=àNœÅ³ø5qQvU„ÒQ™¨þÝZa½‰HTÌÒäÇ\#h$°+o+é7˜£Žêi?}ˆ¾¢³tž™U|¥%p_ÏSùß"AÅŸåO¬>Öj‡{IgÔL?l¤l æc€ñtÄ[‚-3.F¶V ¶:‡Ò¨™>¥¿±¯è wõá(Âsðý··óŸøsþ+%Š>" b¢NfË¥òeùª\+”ˆR¢ìU¥:¾å™–a-ÍYc­ÕÖë:j\Å©—„jHq¼²oýðŒlŽrü‹üL¶ž ìbÈÈÀï% X‹Ü¯§×hò½ 5µƒçýt€>@öÒ1Ðgtt‰®Ñ-úè6ÝãdNáîä|žÌ?ã¹¼Œ·!kð1þ„Ïñ%¾*Ü"Eè"KmmäMü+äà·ÈÂ~äá#>ŽL\äü€‚,¶D/Ëd¥|õ·Nn’Gä'òŒ¼ oÉÿÈï‘/—’ ÊQ¦+åJ%j3U¬ª“Ôfõ˜zÎïzÆUéjpugº#îùîeî¯ãRãô¸ÁqӁå@õé_ýX)çºÅ·¨œß¦E_õ¼8Îþ…œOcÕÔ¤œã‹ê8ÛäÞ¨”ÊݳBÄË+êQÎ)2QŒg8(öбžªåEì¥þâ=š,(>äô÷œÆý•,Ê㨁?Ç"AT†î–¹â.nŽý¸F.U©Tx•éÈéûtZIKe}£n§ê±•ٍÞvÍåQ8ƶŠËd†åœ=hà€¬þþÌŒ~}ûôNO{VïåÓ~ôLÏÞîÝR»véÜ)¥cOrû¤Äv ñqn—ªHÁ”Öócš™3•t½ Ào·õt”´éˆ™¸Ü™ùOÛ˜ZÌ1Ӟ¶À²ü–VËÀKöh#h„?Sëšy"¤kM9?A䇇7 ŠK‚Wf‘ ›…zÈvÁ”iá’2sâ¤H8äõù¢þL“ƒ³ôR“ôÑfr†cBAgÓ4ÝÎ2Z¥Õh™‡Ú&•Æ2Ëô²’ç#¦,‰ÚktÈ0Çè!sÌKÿHõg6ñ»S"f|°‰iJä YՍ…Õ¡PÔ^­c0²¦­¹WáÔJÍnÆÍ|gR¤­ÖgÿF1©?³xrįõp­f‡19âD€I95NÚ}v˜­ÏÖÃvOlŽfÆë£õ cNÉên˜4y‰o_÷¢ÀAëk* kÆ”ˆî3GyõhI¨Gc'2&/Ù_Ð ŸÖø3=Z‘nlŸüHHLj+Ì~¢s$ÇÜ–àõc¨ÙöH/D‰˜Ú, žDtS¤åØÿfç1+føEˆV¿˜án'BMóèšq‡Púõïžî)yÔãJóÜ![´ËåIÉAÿX632Ì~ýìJq‘Zx–ç´‡ø3™ÅúBf2šÁ èð,@îóÙY®i P)fõ¤Hk[£Rï> deDM³5‡k:Oµ5Տ5O†Çt”óç3´³—þä/ÙÓ%%\1Üä.ÿG=»UíÖ5͘I/1j¼é1£6ŠÔäc+F¾®å1£¤Éª.Õ5n4ñÇ!5Y‡k¼f 6ZÁÕÌnEÃL F¤WD[%á•Q?9~ˆ!Gß­=›63yÄòÆ9¯Ì]9Ííç¾›-GÖÆ_ŠûÍxÇÞ¹;¹/·„‰¼8;WÄ_âqòµù‰m®GÆ"÷×Ój™ÍyʪSªè-W==t¤M"—_„n±¨·áªýKèwÁ>}ÕxÎCûì÷€'€—ƒkÀïƒO+UÖôg¹×¹VQGèw«Ó¬‡xîQo€nžº”~çZźºƒ>uWÐ=Ì}J]ŠëÒ4¿]ÊÜSê­ùÊNTȺ-ê¹›²gJm€?ã±NÏ lþ¦ŒµšÑqëÅ*klò ot÷¤5è¯&yÊkú‹1f.x°8I¯@÷k¥7Õ¯ °ÁgŠÕ 8¸íÆúæ‡øë¸Ø©ÙŽùqL¶ÿŽOÿƒmmÿÚ²ã_~âÛÙö«-–ÙdÁÿo”*ë>Ú¹ÀÅÀ·Ö.´7#7ëmvo¥™Ài澫”Q7×]k-üÜ¡ !hw§:\E=•·¬Ïåm @—ázƒú£¿@1Nè¦+Æü—󪎪ºâç¾÷ö½·,/YBòP@Þ*#iÌbCG)ÂKeh'Ёª»+a»d²|ˆ@‡bSe' éœ c‘¦/ $| EJË`C‡ÚUE¥X¿ªXñõwnv3Lÿh3sîïæ½{ï;÷w~çÜ»ØëP|k,|ß‚5o–z˜Gb~%p˜v‘«S Œ ú“ÊTüËqÅüçh-pÇÏ„©·Ð{°sb»PÅvºÌ>Á‡ræc/â_ÂÚìÿqŽŸvÁv>|·Åvÿ˜z‹ß„oý8‘½cý]o2Fl÷C‡¹xå-ƒ°aûÀÛ(ØnkŠóé$ìëŒÐ$çÞ¦/ß}‘k)׳¼¹>öjõ€sškç5´þüï©·ö;TÆù«ýQæ‚}–溏qùº8D#dÞ½Èsükû̵s79ÚNYžS¡ÉžºïoW3T¿¿ÉïÕå¨Y£=Bke-·ZÒÿ êÅ«j 5ÎuXFeÆbÚ­÷ǘnú£Ü+su x©‡/}²?Š×2®úoLª’œ±aŽ~Ò?/ùÊñØËŸ5̯ù ò \É1¨ŸÁITƦ_ —Ìg1þ*ìKÚ4éNÝñß•|Í£Mø5µP]Oã´ATź6NP…zŽB½ç sö‰DŸèF-ŸŸ;{æóYÉù!ÏOhHOÈsI•s6Ó\ý"5éïP“F~wÓõ×°õˆí‡˜û”„¿¥u ?ðmÄé>yÞæÏ=äƒ>Ö?ªßØ!‡¤ø†ö:mÔv“ª’ß•×p_ÌkZG½Àî¹Ãøÿ1«K§èоµuêì.:­ïÃðl‹¬§”UÚ)1'°Ç_»"Žö(k¹#ö5q¬ç#Ûõïþ×çÿ)Åùœý¿¡¦5òíÒ¸,¢°H±Ïݰ•°‘f©Øl&Ä>#Na-A3¡ÙZmTÑxíX×Ki°I"Êu19:0Ø®Vñ•Sù}Lãé Ba*&Ü=µU¾O*ÞªDþGô•î­$ü„òAµ_­V&œj'Q^]ž˜X=1ñfõ›‰~[c“ÜáN]ì÷N'ìqX8‰Ecnlz,NF’Ѥ›œžTNSûuÔ"Fw´“N5§ZS]©Ó©@:ÞowÅOÇáT$M¹)-Ä£q7®E^Q8~î3Êlmv@qW]£¬Q[•VµKéRMìK*QU›¬ . ® ¦ƒÍATF‚Ñ Ô¡H(rCÚôPMhQhM(jµ†Ç(7&ÓŒÙÆBcµ±ÁØjüÖè4Båz¹1[Ÿm,Ò­z«aºn¡n\ظºqC£ÖÜ(2êí{bÜd¬ƒ·$î ˜Iv_9@þŸ˜§$ú£g‹Cb±|t‡(ŠÝ´ÎvšÖͲ펍-NÇÆ’{I÷ gIwÆ×¼öÅŒRÖ¶$Ü‹g2¢Ú+pδ‹jñ”WpÃÿ}Ç_î tp nv“'#°EL·C9(VÒ6²Ä={¶Y?ÙfUÞ¬L¦d)•²-•m5 ý·blS²-‘m‘;¨Áú°Áú[ƒuªÁz¹ÁúEƒõhƒõý«ÒQž¡zL]!Û¤lkd“íTnÅ˲m‘íÙN“í@wp½õ~½õ^½u¹ÞºTo®·öÕ[Õ[³ë­Ê~âßT‡Q—e»T¶£ÜAuÖuVgµµÎúiõDµ¸ÎŠÕYÅò )˜QÆx©R»ŒP\iÂ$[F ñ]r[xâ(EBWGPÞ]Œ!½ Ð½Ì(»]1ÐÙAGAgÕ»]\Eçþ"»2(>£¤!¾W€XPüÒK}Û©‹M—ÏFñÀzJX°Ïlñ#Ì>>ˬ@çáb;#·Õff]/5Ô9 ÆSüÖOz·—x*„!:°ÚhL˜S‚a/5ÚÉË‹wB^b…SfnX{(¦q˜¯aBw>¥¢“dwB µj3FAT+žó:í·`|§¼uϵßÊ}¬µí—0|G¼=ßkoIÔ9?Od´|`&¸l7éDólm»R¯í5ÉöPM Â³˜[ëBß‹¥škD &µœGÿµzŸUØån/k:¥¢îꁑ^6îeû†zـ!=PâeK…^6н샠ônä‡%[¼l?˜ö²€ ^6hð²6ài/{`•—­r*ˆ')ËnŠe4C Q'&/¡ZeسQ ×qþþ‰ß…Cç³#œ¿gKãðêHÖq$3J“ç´eۍ½èØ¿KfnÈÙ• :;1¶eFFœhk±›{ìµ7c+“с"“ä@;ójÛ9~{íØÈàÈ`z¿ØO¥E½;ÕHŸ6Ò0Ò#½ÖH/7ÒËŒôB#=ßHÏ1Ò³ŒôÃFz¦1¼͌˜ÃÌ¡æ`ó&Ó6‹Í"3l˜ýÍ~¦iê¦f*&™Åÿ-¿#ÛÜÚz˜A׸Õd?¬p‹Fž5ÂT¨ŠDë@uŠ2åo‰)­]Ò”¹‘Ö+ψ~ß{¨5ð_Êʰµi ŒãwW—è:][a¤†bkaoÂpˆ 2]×4ñÅ‚P–ÒæpH6† 4ˆ0¬ H%¯üÃW|Óqû êwðÌçyR܆ôàî¹ûÿÇ]’ç.U›«‚Ǽ–m¨‡–ÿ õÀòÔµæó áüƒTâ݈³¼‚"ަ*4‚1\`/CãÙ`(%[Ø«µÂjþÑSgJӽصþ,Æå!÷šoêóp¼…·x[Hjg°å?©2@ÏG.&.&.&.&.þÍ%õÑóõ©$Õ=윕¤§nùåÍ`,NÅW׋í@œº¨³GÖ Œu@vÆl`|uc¾NX+ÅÚâ±=€‰EÖ&¬-ñgÄq¦;I§C”æs)®k>Q3÷SJ»H%׈Ҋ(æ©e¤’0æ{ˆL²‘„[´¥µs;HíÃÔ>L·òåÜE>$1i»páS¾Õ´Â¡öþ‘½\^Úÿ?‡»;˜ÌÍ ¹ÊlÙØLãg‘…Ôìši/ä^¯Ržævž|3¹žùÁ²–T³U[e«6«Õ+÷˜ßÕæ”’镊±o_aüˆè9¯O¬¥úR-8khÝy~bû+Xãhbå@ÎñâÛ~/ŠX¯O%êõ8£È²ú}ôúà)án«2Ôµ÷]U®:Js·G™üD¸Cáf*Œ2…ªÃØ/>stream H‰|Ïj!‡û¾ÃSRÐ ä&{hB›%d[²iïFg!þA]JÞ¾«I÷CŠÎo>ùºi¶Õ ègp²Ã½¶*`tcg´%Õ ”–é~+»4Â:ÁÝ5&4ípNèq c WXìwo»ö}yÒc‹?Gg„}yuµdÏ °'ô#(Ú°8U_ß÷b7zAƒ6+•º¾›ƒð­0ôŸ—K+@uS•NaôBbv@ÂW¬¾^×­zÈfæÜ?4gl:gæ/Ëxþÿ¬$Ç&ã2¤"š=´ÅyŽÞùLÁ´yú`PIy¥ endstream endobj 1 0 obj >/Font>/ProcSet[/PDF/Text]>>/Rotate 0/StructParents 39/Tabs/S/Type/Page>> endobj 2 0 obj >stream H‰ŒWmsÛ6þ+øHÝH4 yÓéŒã4¯n/«n’N†¦ Eª$eGýõ·» HŠ¢N&_ÀÅbwŸgŸ}³fW×uk¶YÞ²~¸zó¦úÆ>ñH1ÁB0G쏫õé ÙÕ]vªŽ-ûñÇ7oo»úù>` »Z¯ÆÙzËV

The Unofficial Google Cardboard kit $19.95

$
0
0

Lets be honest here, Virtual Reality is awesome and Google making a cardboard Occulus Rift is cool but who wants to order all those different pieces and spend a day cutting carboard? We did the math and it costs over $45 to order all those bits and pieces Google suggested, and that doesn't even include shipping. Well lucky for you because we are nerds who know a thing or two about making stuff and we want to help get VR goggles in your hands!

We are gathering all the pieces you will need to assemble your own Google cardboard VR goggle (minus the smartphone). We precut the cardboard and you should be able to assemble all the pieces in under 5 minutes. Easy Peezy. Get cracking and place your order. There is high demand so order soon, and please allow 4-6 weeks for delivery.

Patents Are Eating the World and Hurting Innovation

$
0
0

It’s been a busy month for intellectual property. In late May, the U.S. Senate failed to pass a reform bill aimed at curbing the influence of patent trolls. In early June, Elon Musk announced that Tesla would not initiate lawsuits with any firm that used its patents “in good faith.” Last week, the U.S. Supreme Court issued a ruling limiting the scope of software patents.

The backdrop for all of it — and the reason why so many companies ought to be paying attention — is the explosion of patent litigation since the 1980s, illustrated below:

patentlawsuits

That chart is also key to understanding Tesla’s decision to share its patents in order to grow the electric vehicle industry, as I discussed today with Orly Lobel of University of San Diego and James Bessen of BU. (You can watch the recording of our conversation at the bottom of this post.)

“What Musk has said is basically these patents aren’t very valuable to us in terms of keeping other electric vehicles out of the marketplace,” Bessen explained. “But he’s hanging on to them, and what he’s talking about there is that they may be valuable in defensive terms, if other firms come after him and sue Tesla.”

In other words, the value of patents in an increasing number of cases is merely to keep from getting sued by someone else with patents.

Tesla isn’t the first to recognize this. The same sentiment was behind Twitter’s announcement in 2012 of an Innovator’s Patent Agreement, designed so that “employees can be assured that their patents will be used only as a shield rather than as a weapon.”

In his 2008 book Patent Failure, Bessen and co-author Michael Meurer argue that after taking the cost of litigation into account, the effect of patenting in all industries except pharmaceuticals and chemicals was to reduce the profitability of innovation rather than to increase it. The system works better in the pharmaceutical and chemical industries since the “boundaries” around the patents — what is and isn’t covered — are relatively clear. By contrast, in software it’s often far less obvious what a given patent protects.

Last week’s Supreme Court ruling sought to remedy that, holding that abstract ideas are not made patentable simply by the fact that they are performed by a computer. But it did not go out of its way to make clear just what sort of software inventions were novel enough to warrant protection.

While Lobel and Bessen see the ruling as positive, our conversation ended on a gloomy note. Patent pools, defensive patent agreements, and court rulings can all help. But ultimately the onus is largely on policymakers to clean up the mess.

“We’re forgetting that intellectual property is all about striking the right balance,” said Lobel. “It’s all about the purpose of promoting, not impeding progress in arts and science.” Instead, we treat patenting as a natural right, she said, ignoring the adverse impact on innovation.

Hence cutting-edge firms like Tesla hold patents even when they aren’t looking to exclude others from copying their technology, just in order to mitigate their own litigation risk. Given such a perverse environment, sharing patents in good faith is a step in the right direction. But it doesn’t really fix the problem.


A Comparison of Ruby Application Servers, Part 2 – Performance

$
0
0

App Server Arena

In the first post in this series, I compared popular Ruby application servers Passenger, Thin, Unicorn and Puma across multiple categories: mode of operation, use cases and configuration. This post details a simplistic performance test and analysis.

The Arena

The arena in which all these application servers will do battle is a basic test application I built that is available on GitHub. It's a Sinatra app with some purely academic examples, not designed to do real, meaningful work, but instead to attempt a fair (or "fair enough") set of tasks for each application server to process and repeat multiple times.

/server

This action spits out information about the application server itself (pid of the worker, name of app server processing the request), and some information about the request and response environment variables. It's designed to be as close to the "metal" as reasonably possible, and does not reference any external data store.

/pi

Computes pi to 5,000 decimal places. Initially, I was doing 20k, but that turned out to cause all application servers to fall over very quickly into my tests, leaving me without enough sample size to be able to consider tests even borderline legitimate.

This task is designed to simulate mildly-computationally expensive work and see how each does under that particular type of strain.

/borat

I am so excite! The /borat resource fetches the last 10 tweets from @devops_borat. The intent here was to generate a test that would give a fair estimate of how various servers performed with real-world network latency, but unfortunately, Twitter's API rate limitations prevented me from testing this as thoroughly as I would have liked. I also was unable to include it in my /random test for that very reason. I’ve since removed this feature from the application’s source code, though you should be able to see what it originally looked like by browsing the repo history.

/sleep

Sleeps for 1 second then returns a response. Spoofs unusually high request queuing and shows how each processes requests while stuck in a "wait-like” situation.

/random

Does one of the above at random with a 50% chance to run /server. The idea would be to simulate load based on several users swarming the application at once, all doing different things.

LET THE GAMES BEGIN!

In no case can any of the performance tests here be taken as "gospel", or in any way interpreted that these simplistic use cases are in any way all-encompassing. These are really straight-forward and simple tests that show different servers under different situations, but are not generalizable and applicable to even a majority of applications out there, especially those in complex problem domains.

In other words, your mileage may vary.

Testing hardware

This app was deployed to four different environments on Engine Yard Cloud backed by Amazon EC2 in US East 1. All VMs are High CPU Mediums. They come with 2 VCPU cores each and 1.7GB of memory. No database was used and no external data store (with the exception of the Twitter example, since a REST API could be considered a data store) was used in the app because I didn't want to artificially slow down tests because the app server was waiting on, for example, the database driver for whatever reason - that would just skew the tests in a weird way.

Testing methodology

I used a tool called Siege by Jeff Fulmer. I'd had major problems getting apache bench to work right and stumbled on Siege, which has a lot of very interesting options.

(Tip: you can install this crazy easy on OS X via brew install siege. If you don't have Homebrew, you really should get it.)

I used the following command/syntax to perform these tests, then put the results in flat files you can read under the "performance" subdirectory of the aforementioned repository:

siege -r 1000 -c 100 -b -q http://asa-puma/sleep > puma.txt 2>&1

I'm not concerned with doing anything too fancy here, I just want a straight up, "how fast can you do it?" test. With the /borat example hitting the Twitter API, I left off the -b (benchmark) option to allow siege to internally throttle requests so as not to get blacklisted from Twitter.

The arguments used:

  • -r repetitions. Do this test N number of times, in this case, 1000.
  • -c concurrency. How many simultaneous requests are we doing? In this case, 100 simultaneous requests, a thousand times over.
  • -b benchmark. Removes internal throttling from siege. Really tries to hit the server crazy hard.
  • -q quiet. Suppresses output that otherwise shows every. single. get. request. ever. made. throughout the entire test.

Other than that, I used the default settings for siege:

jaustinhughey:~/ $ siege -C                                                                                                                                                                                                        [14:45:02]
CURRENT  SIEGE  CONFIGURATION
JoeDog/1.00 [en] (X11; I; Siege 3.0.0)
Edit the resource file to change the settings.
----------------------------------------------
version:                        3.0.0
verbose:                        true
quiet:                          false
debug:                          false
protocol:                       HTTP/1.1
get method:                     HEAD
connection:                     close
concurrent users:               15
time to run:                    n/a
repetitions:                    n/a
socket timeout:                 30
delay:                          1 sec
internet simulation:            false
benchmark mode:                 false
failures until abort:           1024
named URL:                      none
URLs file:                      /usr/local/Cellar/siege/3.0.0/etc/urls.txt
logging:                        true
log file:                       /usr/local/var/siege.log
resource file:                  /usr/local/Cellar/siege/3.0.0/etc/siegerc
timestamped output:             false
comma separated output:         false
allow redirects:                true
allow zero byte data:           true
allow chunked encoding:         true
upload unique files:            true

A quick note about the "concurrency" rating you'll see in these tests: the higher it is, the worse the app server performed. This is because the number in the concurrency rating is how many requests are being processed at the same time, on average. If performance is high, very few things will be processed "at the same time" because formerly issued instructions (requests) will have already been processed. So, higher concurrency, lower performance according to siege output.

Results & Analysis

Passenger 3

Phusion Passenger 3 performed reasonably well all around. Unfortunately it fell over hard on the /pi test and failed to complete /server. It didn't even make it a quarter of the way through /sleep. Passenger appears roughly on-par with the other gladiators when doing simple tasks under mild to moderate load. It had the highest rate of concurrency on /borat test.

Passenger outperformed Puma in the /random test yet maintained a very high degree of concurrency during the same. It failed to complete the /random test however, and had the longest "shortest duration" metric. Overall, it appears to be a solid contender for generic use cases and will likely outperform the others here in a low-to-moderate traffic, multi-application deployment due to its elastic loading of applications into memory, thus making your dollar go further. I would recommend this for development shops and digital agencies producing simple, low-traffic web applications for small businesses.

Raw data: sleep | borat | pi | random | server

Passenger 4

Passenger 4 was tested using the same methodology listed above in March 2014, some time after the original tests here were performed. I’m pleased to say that it has certainly improved in many areas versus its predecessor. However, I did not repeat the /borat test on Passenger 4 due to the same Twitter API rate limitations mentioned above.

Compared to Passenger 3, version 4 dramatically improved on the /pi and /random tests, completing all transactions. It took over three hours to complete the /pi test, and had a transaction rate of 8.8 transactions per second - roughly on par with all other application servers tested though significantly behind Unicorn and Thin. Passenger 4 performs on par or better on the /server test than any other application server tested here, was roughly equal to Unicorn in the /sleep and /random tests.

Raw data: pi | random | server | sleep

Unicorn

Unicorn was faster than Passenger or Thin with /borat and had the second highest transaction rate for the same. It had the shortest duration of both longest and shortest transaction with /borat as well. It was one of only two that actually finished the /pi test, and did so faster than Thin. Unicorn had the highest concurrency and transaction rates on /pi of all app servers tested and the shortest "longest transaction" on /pi. It completed the entire /server test; second in total duration only to Thin. Unicorn was the only contestant to complete all /sleep tests and still managed to have the shortest "longest transaction" duration.

It had zero failed transactions on /random with highest concurrency rating.

Raw data: sleep | borat | pi | random | server

Thin

Thin was one of only two to complete the /pi test, though it was slightly slower than Unicorn. It had the shortest transaction under /pi and quickest "longest transaction" under /server. Thin had the highest concurrency rating and transaction rate under /server and unfortunately failed miserably with /sleep, only completing 66 requests!

It was one of only two to finish the /random test, though it took much longer than Unicorn and had the lowest transaction rate. Thin appears to be an excellent choice for any application that doesn't rely on lots of wait-like scenarios or that don't have much request queueing.

Raw data: sleep | borat | pi | random | server

Puma

Puma was the fastest to finish /borat but failed miserably with the /pi test. It was on-par with Unicorn's speed for finishing the /server test, and had the second highest transaction rate for the same. It failed the /sleep test horribly, finishing less than 25% of the test.

Puma also failed the /random test, finishing less than 25%. I found this extremely odd so I went for a second round for Puma on the /random test, thinking that perhaps over my planned 100,000 requests, it was thrown an inordinate number of "pi" tests (because it is random, after all). The results were repeated the second time around. While it's still possible that it was hit with an unusually large number of "pi" tests, it's not as likely as it just plain doesn't work well when presented with computationally expensive tasks while processing multiple other incoming requests.

In all fairness, due to Ruby's GVL, I should have at least run more Puma workers. Instead, in the interest of research, I ran only as many as there are CPU cores on the machine (2) because I wanted to see, even with a 1:1 worker:core ratio, how Puma performed compared to its contemporaries. In most cases, the /pi and /random tests being notable exceptions, it performs on-par with the others tested here in spite of having far fewer worker processes.

Raw data: sleep | borat | pi | random | server

Key Takeaways

After performing these tests, there are a few basic generalizations we can make that should give developers wondering which application server to use a fair idea of where to start. While these generalizations won’t apply to every situation, they should provide a fair overview of strengths and weaknesses based on the data above.

Use CaseRecommended Application Server
Multiple apps, low traffic, limited hardwarePhusion Passenger
Live Streaming in Rails 4, Long PollingThin, Puma (on JRuby or Rubinius for threads)
Single application fast request/response (API for example)Unicorn

If you’re unsure of which application server to use for your project, consider starting with Passenger 4 on your local development machine to test for unusual behavior. If you find none, deploy to a staging environment with Passenger 4 and try throwing it a lot of traffic from your favorite load testing application. See how well it holds up. If you find that it’s not performing well, consider the guidelines here and attempt deploying under a different application server.

Other Notes

This test wasn't as fair as it should have been to Puma because of the GVL in MRI. The test should be repeated under JRuby and/or Rubinius to see how it performs when it has all the tools it's supposed to.


Tagged:

How I got a medal from the Army for writing code

$
0
0

In 2005 my National Guard unit was deployed to Iraq as part of Operation Iraqi Freedom. My MOS (Military Occupational Specialty) in the Army was 92A, which is basically a logistics and supplies specialist. My job was to order parts for mechanics, pick them up, return old parts, manage HAZMAT, dispatch/return vehicles from missions, and handle licenses. I also did a few other things that I don’t remember right now. Anyway, at the time, the heart of this system was a tool called ULLS-G (Unit Level Logistics System – Ground). I say “at the time”, because shortly after we came back, ULLS-G was replaced by SAMS-E (Standard Army Maintenance System – Enhanced), which incidentally uses Oracle as a back-end database. Compared to SAMS-E, ULLS-G was a dinosaur. I had used it quite a bit, of course, having been in the Army for about 4 years by the time I was deployed. It was a complete pain to use it. ULLS-G was a DOS application (yes, MS-DOS) and most of the computers I used it on at the armory were only running DOS (this was circa early 2000′s so it wasn’t too uncommon to still see DOS systems around). By the time I was deployed most computers were running WinXP/2K or something like that, and so you could run ULLS-G in “MS-DOS compatibility mode”.

So as I mentioned before, ULLS-G was a pain to use. You couldn’t really use the mouse in it, since it was written for use in DOS. So all interaction was via the keyboard. I recall that towards the end of our mission, I didn’t even have to look at the keyboard; I had memorized the keystrokes and so I could simply type them in to get stuff done. Part of what made the system so horrible was that there was no batch functionality of any kind. So let’s say you had to print out licenses for soldiers in your unit. You had to go through and print out each license one by one. You’d go to a screen to load up a user’s license by entering their license number, and then you had to print it. Our unit had around 150 soldiers, so to print everyone’s licenses, I had to individually look up each soldier and then print his license. Also related to licenses, if you had to add a vehicle qualification for soldiers, you also had to do this individually. Normally this isn’t so aggravating, since you only have to deal with a few qualifications at a time. But we were a unit that was specifically stood up for this mission (our soldiers all came from four different 1/180th batteries to form 1/180 HHB FA), which meant that our ULLS-G system had no information about soldiers’ qualifications. So initially, I had to manually input each soldier’s qualifications and then print out their license. This would basically take me the better part of an hour to go through 150 or so soldiers. In true Army fashion, it gets even worse. Before we left, we had pre-mobilization training at Ft. Lewis, WA. There was a lot of vehicle training (M-1114, 5-ton, deuce-and-half, etc.) that our soldiers had to go through. These were staggered as well, so after each training mission I had to add qualifications and reprint licenses.

Needless to say, I was annoyed. I even got word that when we were finally in-country, there were going to be more vehicle qualifications which meant that I would have to add qualifications and print out licenses all over again. Now as a programmer, I’m constantly looking for ways to make my job easy. I didn’t want to sit and add qualifications, and print licenses one by one. I was too lazy for that, and worse, the whole thing was horribly inefficient. So I decided to figure out how to automate the process. The first thing I tried to do was to figure out the format of the ULLS-G data files. I wasn’t able to do that at all, unfortunately and it was mainly due to lack of time (what with all the military training going on). But then quite serendipitously, I stumbled across a page where someone had posted an ODBC driver for ULLS-G. This meant that I could run SQL queries against the ULLS-G data files. Armed with this, I started writing Perl scripts to query the data. By the time we had reached Iraq, I had a working script that generated licenses as text files for all the soldiers. The script only took a second or two to run, and the longest part of the process was simply printing out the licenses. But I wasn’t done yet. I was still annoyed that I would have to add driver qualifications manually. So I wrote another script that would go and add qualifications to drivers en masse. The script even had a configuration file where you could specify what qualifications you wanted to add and to whom.

When we finally reached our unit, I had to print out everyone’s licenses again. I still remember my Motor Sergeant looking perplexed when I showed up in 20 minutes with a warm stack of licenses, still fresh from the printer. “Didn’t this take you a lot longer before?”, he asked. I started talking about the script but he just tuned me out after about three or four words out of my mouth about Perl, SQL, and ODBC connections and nodded and took the licenses to the TOC. In a way it was good he didn’t ask me too many questions, because what I was doing wasn’t really sanctioned. Only licensed technicians (there is another MOS for that) are allowed to mess with the ULLS-G install, and I wasn’t technically qualified, at least in the Army’s eyes.

After we were in country, I also found out that we had to send up daily reports to our TOC (who would then send it up to battalion). These reports consisted of the state of our vehicles (whether they were dead-lined or good to go) and various other bits of information. Pretty much every other unit there typed up all this information manually in an Excel spreadsheet, and then printed it out and took it to the TOC. As a result, there was always room for errors. Every morning I would have to spend 20-30 minutes fixing the report and making sure that it was up to date, before I printed it out and sent it to the TOC. I remember getting yelled at once or twice because I had the wrong information there, and so after that I was doubly careful. Again, I was starting to get annoyed. There had to be a better way to do this, and there was. Excel can make use of ODBC connections registered in Windows, and I had already registered one for use with my ULLS-G Perl scripts. So I simply used that same connection with a nifty Excel macro that populated all the fields in our spreadsheet. It was pretty neat. It would automatically update the list of dead-lined vehicles and it also included other information that other units didn’t report, like the service status of all our vehicles and their mileage as well. The service status bit was especially useful even on a day-to-day basis since previously we had to manually look up each vehicle’s service status when it was returned from dispatch. Now I simply had to look it up in a spreadsheet and it would show me at a glance which vehicles required servicing.

From a programming standpoint, what I did wasn’t all that stellar. I had simply figured out a way to grab information out of the ULLS-G database. But my leadership was very impressed, especially my squad leader and my Motor Sergeant. Around 2-3 months after we had already been in country, we had a new Battalion Motor Officer show up (CW2 Lee, if I recall correctly). He was very curious about what I had done. Once I had demoed it to him, he looked at me and said “You know you’re not supposed to be doing this, right?”. I was initially scared that I was going to get in serious trouble, but he had a smile on his face. He told me that he didn’t mind because it seemed like I knew what I was doing and the end result was that I was helping my unit out by being efficient and by providing accurate reporting.

The next few months passed and soon we were only a month or two away from getting out of Iraq. My scripts and macros had been running with only minor hiccups here and there. Towards the end we had an awards ceremony. The commander and First Sergeant came over to the motorpool to hand out awards. I was kind of surprised to be called up because I wasn’t expecting one (my job mainly kept me on base; I did my job well I thought, but I didn’t think it was award worthy. There aren’t too many ways to really excel at supplies and logistics). After awarding me the Army Commendation Medal, both he and the First Sergeant shook my hand and congratulated me. I thought it was just a generic “good job” award until I saw the paperwork. When I read through the paperwork, I saw that my squad leader SSG Lopez had put me in for the award based on the work I had done with the Perl scripts and the Excel macros. I was surprised and elated. Although I didn’t work on any of it for recognition, it’s still a good feeling when you find out that your work is appreciated.

So that’s my story about how I got a medal from the Army for writing code.

Migrating From AWS to FB

$
0
0

Welcome to the Instagram Engineering Blog, where we share insights on building and scaling our service.

When Instagram joined Facebook in 2012, we quickly found numerous integration points with Facebook’s infrastructure that allowed us to accelerate our product development and make our community safer. In the beginning, we built these integrations by effectively bouncing through Facebook web services using ad-hoc endpoints. However, we found that this could be cumbersome and it limited our ability to use internal Facebook services.

Starting in April of 2013, we began a massive migration to move Instagram’s back-end stack from Amazon Web Services (AWS) into Facebook’s data centers. This would ease the integration with other internal Facebook systems and allow us to take advantage of tooling built to manage large scale server deployments. The primary goals of the migration were to keep the site fully available during the transition, avoid impacting feature development, and minimize infrastructure-level changes to avoid operational complexity.

The migration seemed simple enough at first: set up a secure connection between Amazon’s Elastic Compute Cloud (EC2) and a Facebook data center, and migrate services across the gap piece by piece. Easy.

Not so much. The main blocker to this easy migration was that Facebook’s private IP space conflicts with that of EC2. We had but one route: migrate to Amazon’s Virtual Private Cloud (VPC) first, followed by a subsequent migration to Facebook using Amazon Direct Connect. Amazon’s VPC offered the addressing flexibility necessary to avoid conflicts with Facebook’s private network.

This task looked incredibly daunting on the face of it; we were running many thousands of instances in EC2, with new ones spinning up every day. In order to minimize downtime and operational complexity, it was essential that instances running in both EC2 and VPC seemed as if they were part of the same network. AWS does not provide a way of sharing security groups nor bridging private EC2 and VPC networks. The only way to communicate between the two private networks is to use the public address space.

So we developed Neti — a dynamic iptables manipulation daemon, written in Python, and backed by ZooKeeper. Neti provides both the missing security group functionality as well as a single address for each instance, regardless of whether it is running in EC2 or VPC. It manages thousands of local NAT and filter rules on each instance to allow secure communication using a single, flat “overlay” address space. The NAT rules selected the most efficient path for communication based on the source and destination instances. Communication between instances across the VPC and EC2 boundary would use the public network, while internal traffic would use the private network. This was transparent to our application and backend systems because Neti applied the appropriate iptables rules on every instance.

It took less than three weeks to migrate all of the various components that make up Instagram’s stack to the VPC environment from EC2 — something that we believe would have taken much longer without Neti. We experienced no significant downtime during the process and as far as we are aware, this was the fastest-ever VPC migration of this scale.

With the VPC migration complete and our instances running in a compatible address space, Instagram was ready to complete its migration into Facebook’s data centers.

An existing set of EC2-centric tools for managing Instagram’s production systems had been built over the years. This included configuration management scripts, Chef for provisioning, as well as Fabric for a wide range of operations tasks, from application deployment to database master promotion. This tooling made assumptions specific to EC2 that were no longer valid in the Facebook environment.

To provide portability for our provisioning tools, all of the Instagram-specific software now runs inside of a Linux Container (LXC) on the servers in Facebook’s data centers. Facebook provisioning tools are used to build the base system, and Chef runs inside the container to install and configure Instagram-specific software. To support an infrastructure that spans both EC2 and Facebook’s data centers, our existing Chef recipes were augmented with new logic that allowed them to support the CentOS platform used inside Facebook, alongside Ubuntu, which was used in EC2.

The EC2-specific command-line tools used for basic tasks, such as enumerating running hosts as well as the provisioning support in the Chef “knife” tool, were replaced with a single tool. This tool was designed as an abstraction layer and provided a similar workflow to the one used in EC2. That eased the human and technical transition into this new environment.

Once the tooling was ready and environment was in place, the migration of Instagram’s production infrastructure from VPC to Facebook’s data centers was completed in two weeks.

This multi-stage effort was hugely successful and hit the major goals laid out when the project began. In addition, during the planning and execution phases of the migration the team shipped major features such as Instagram Direct and our user base nearly doubled in size. We held true to our initial objective of minimizing change, so the transition was mostly transparent to our engineering teams.

Looking back, there were a few key takeaways from the year-long project:

  • Plan to change just the bare minimum needed to support the new environment, and avoid the temptation of “while we’re here.”
  • Sometimes “crazy” ideas work — Neti is proof of that.
  • Invest in making your tools; the last thing you need is unexpected curveballs when conducting a large-scale migration like this.
  • Reuse the concepts and workflows familiar to the team to avoid compounding the complexity of communicating changes to the team.

This was a coordinated effort that spanned multiple teams and a number of individual contributors. We’ll be providing a deeper dive on the work that went into the migration in the weeks to come, so keep an eye on this space.

By Rick Branson, Pedro Canahuati and Nick Shortway

© 2012 Instagram, Inc.

Recovering SpaceX’s Falcon 9 Ocean Landing Video

$
0
0
Recovering SpaceX’s Falcon 9 Ocean Landing Video – How it was done | NASASpaceFlight.com

NASASpaceFlight

no alt

When SpaceX launched its Falcon 9 v1.1 rocket last April, most eyes were on the vehicle’s passenger, the CRS-3 Dragon spacecraft, en route to another mission to the ISS. However, for many SpaceX followers, a hugely interesting aspect of the mission was its secondary objective – to bring the first stage back from space to a soft splashdown in the ocean after stage separation. While this goal was achieved, video footage suffered from heavy interference, leading to a huge crowd sourcing effort to restore the historic imagery.

First Stage Return:

Since the debut of the Falcon 9 v1.1, SpaceX has worked on their reusability aspirations, ranging from boost back tests of their first stages, through to ocean splashdowns– albeit with lessons learned, not least on the controllability element as the stage heads back to Earth under large aerodynamic stresses.

An actual soft splashdown was achieved after the F9 successfully sent the Dragon spacecraft on her way to the ISS, with numerous firsts including the successful deployment of the four legs attached to the aft of the vehicle.

The landing attempt was to be supported by a NASA P3 Orion aircraft, which would have observed the stage, and a SpaceX-chartered recovery vessel, to retrieve it from the ocean after landing.

Unfortunately, heavy seas in the landing area kept the recovery ship in port, and icing conditions kept the Orion on the ground.

2014-06-26 16_07_42-SpaceX MCC - Google SearchSpaceX improvised, sending CEO Elon Musk’s private jet out to the landing area with a small satellite dish affixed behind a window. The plane kept a safe distance from the re-entering stage, but managed to retrieve telemetry confirming that the landing had been completed successfully.

A video stream of this historic event was also captured, but unfortunately heavy interference damaged it beyond recognition. A SpaceX-hired video recovery expert managed to extract two still frames, but judged the error rate too high to allow further recovery.

On April 28, SpaceX published both the original and the partially repaired video stream on their web site, and asked the world for help.

Taking on the Challenge:

The main response came from the NASASpaceFlight.com forum, with several skilled programmers and computer experts willing to take up the challenge. The first results came surprisingly quickly.

By the 4th of May, twelve of what ultimately turned out to be 15 keyframes had been extracted. None of them showed much by way of visuals, however, as heavy damage caused decoding to fail, resulting in mostly gray images.

frame11_tantalizing_350This changed with the introduction of a special version of FFmpeg, a video decoding tool, modified for the project by one of its authors.

Rather than showing a gray image when an error was detected, this version continued to attempt to decode the image.

Applying it to the damaged frames resulted in a jumble of colored blocks, with scattered throughout some tantalizing bits of detail.

Gaining good images out of this seemed possible, but would be a jigsaw puzzle of epic proportions.

Frames and Macroblocks:

To understand the challenge, it helps to know something about the MPEG4 video compression used by SpaceX.

MPEG4 encodes a video frame-by-frame, with each frame split into a grid of 16×16 pixel squares, known as macroblocks (MBs), which are stored in left-to-right, top-to-bottom order. For each macroblock, brightness and color information is separated, color detail is reduced, and then both are compressed and stored separately.

macroblocksTo further reduce the space needed, most information about a macroblock is not stored directly, but as a difference with respect to either its left or top neighbor.

While this greatly reduces the bandwidth required to transmit high-quality video, it also causes any error in a single macroblock to propagate throughout the subsequent macroblocks, and multiple independent errors to stack up.

As a result of this, repairing a damaged frame is like solving a jigsaw puzzle with damaged, paint-splattered pieces, whose remaining undamaged parts are scrambled until the piece is slotted into place correctly. A seemingly impossible task.

We Do This SpaceX Style:

The team set to work with the new tools, which allowed them to reset the decoding process by artificially inserting a plain gray macroblock, and to then restart at an arbitrary position in the file.

This kept errors from propagating, and let them piece together undamaged macroblocks even if earlier damaged macroblocks had not yet been repaired.

common_dirt2_350At launch, a spray of dirty water from the flame trench had left splatters of mud on the camera.

As these appeared in the same place in different frames, they could be used to place pieces of the image in the right location, which was especially helpful in the otherwise rather featureless top half of the frames.

Meanwhile, an easy-to-use web interface was built, so that people could help the repair without having to install special software on their computers. New extensions were created to patch up damaged macroblocks, rather than just ignoring them.

A wiki was added to document the results, which, less than two weeks in, were already significant.

AllGoodFrames_350There was still a lot of damage, but the images now showed that the rocket had successfully deployed its landing legs, fired its Merlin engine to slow the descent, and reached the water intact.

This result did not go unnoticed, with Elon Musk himself tweeting a link to the partially repaired video, and he would later comment on the effort at the Dragon v2 reveal.

“The data came through really well, but the video was corrupted because unfortunately when you compress video, it’s hard to uncorrupt a compressed video because you actually have to figure out the compression algorithms and all these things, so we weren’t able to get very far,” said Mr. Musk (video and transcript).

2014-06-26 15_41_38-Shit Elon Says - Transcript - SpaceX Dragon 2 Unveil Q&A“We put the video up online and then we crowd sourced the clean-up of the video and people did a really great job of fixing it. Mostly the people on the NASASpaceFlight forum were able to fix the video.”

The repaired video began showing up in SpaceX presentations.

Another on-going effort was the development of tools for automatically repairing frames by undoing damage at the level of individual bits.

Analysis of the repairs made to the transport stream had revealed that these occurred in particular patterns, and software was created to automatically try to undo potential damage according to these patterns.

Unfortunately, it turned out to be very difficult to automatically judge whether a change was an improvement. Also, in combination with the sheer amount of possible error patterns, the results were not as good as what could be achieved manually.

Fortunately, manual work continued as well, and it was becoming clear that some of the frames had damage beyond mere macroblock errors. Furthermore, there appeared to be frames missing, and so far only so-called I-frames had been looked at, while the video consisted mostly of P-frames

I-frames, P-frames and the Transport Stream:

In MPEG-4, I-frames are essentially independent pictures. They consist of the collection of compressed macroblocks making up the picture, and some additional information needed to decode them. Even with the macroblocks compressed, an I-frame still requires a significant amount of space.

To further reduce the size of a video, most frames are therefore stored as P-frames rather than I-frames.

2014-06-26 19_24_44-index.php (448×900)In a P-frame, most macroblocks do not contain image data, but point to the corresponding area in a previous I-frame. The decoder then simply copies the area from the previous frame.

If a completely new object appears, such as a whitecap or flames from the engine, the corresponding macroblocks will contain the actual data just like in an I-frame.

Once the encoder has encoded all the frames, it puts them into a transport stream, which is used to combine audio, video, and other information into a single file.

The landing video only contains video, but damage to the transport stream still caused frames to decode incorrectly, or even disappear completely.

Many hours were spent creating purpose-built software, and using it to clean up the transport stream. The hard work paid off though, resulting in a complete set of frames.

The Home Stretch:

It was now late May, and the project had been underway for about a month.

iframe_221_progress_2_resized_halfframesTeam members continued to contribute macroblock repairs, now both for I-frames and P-frames, and the results were now being processed and uploaded to YouTube automatically.

Damaged areas in I-frames were back-filled from previous frames.

The time counter in the bottom left of the video turned out to be fairly heavily damaged in most frames, most likely because such a high-detail region requires many bits to describe, which increases the chance of some of them being damaged.

Fortunately, the shapes of the numbers could be extracted from good frames, and the correct values were reconstructed from the internal MPEG4 timestamps, making it possible to redraw this area directly.

2014-06-26 19_32_58-SpaceX Landing Restoration 2014_06_22 20_45_06 GMT - YouTubeAs with the rest of the repair, the team proceeded very carefully, wanting to be as sure as possible that the restored timestamps matched what had been sent by the rocket originally.

Work continued throughout early June, and by the 22nd, the team were ready to declare the work as complete.

A short introduction sequence had been created, together with a trailer with credits, and these were glued onto the repaired video.

About two months after SpaceX had first published the damaged stream and two partially restored still frames, the restored video now clearly showed a controlled descent, leg deployment, and finally a soft touchdown on the surface of the Atlantic ocean.

Mission accomplished!

*Click here for the final version of the restored video*
*Click here to view the 1,780 post/365,000 read recovery effort thread*

(Images via the restoration process and SpaceX).

Share This Article

Recovering SpaceX’s Falcon 9 Ocean Landing Video – How it was done | NASASpaceFlight.com

NASASpaceFlight

no alt

When SpaceX launched its Falcon 9 v1.1 rocket last April, most eyes were on the vehicle’s passenger, the CRS-3 Dragon spacecraft, en route to another mission to the ISS. However, for many SpaceX followers, a hugely interesting aspect of the mission was its secondary objective – to bring the first stage back from space to a soft splashdown in the ocean after stage separation. While this goal was achieved, video footage suffered from heavy interference, leading to a huge crowd sourcing effort to restore the historic imagery.

First Stage Return:

Since the debut of the Falcon 9 v1.1, SpaceX has worked on their reusability aspirations, ranging from boost back tests of their first stages, through to ocean splashdowns– albeit with lessons learned, not least on the controllability element as the stage heads back to Earth under large aerodynamic stresses.

An actual soft splashdown was achieved after the F9 successfully sent the Dragon spacecraft on her way to the ISS, with numerous firsts including the successful deployment of the four legs attached to the aft of the vehicle.

The landing attempt was to be supported by a NASA P3 Orion aircraft, which would have observed the stage, and a SpaceX-chartered recovery vessel, to retrieve it from the ocean after landing.

Unfortunately, heavy seas in the landing area kept the recovery ship in port, and icing conditions kept the Orion on the ground.

2014-06-26 16_07_42-SpaceX MCC - Google SearchSpaceX improvised, sending CEO Elon Musk’s private jet out to the landing area with a small satellite dish affixed behind a window. The plane kept a safe distance from the re-entering stage, but managed to retrieve telemetry confirming that the landing had been completed successfully.

A video stream of this historic event was also captured, but unfortunately heavy interference damaged it beyond recognition. A SpaceX-hired video recovery expert managed to extract two still frames, but judged the error rate too high to allow further recovery.

On April 28, SpaceX published both the original and the partially repaired video stream on their web site, and asked the world for help.

Taking on the Challenge:

The main response came from the NASASpaceFlight.com forum, with several skilled programmers and computer experts willing to take up the challenge. The first results came surprisingly quickly.

By the 4th of May, twelve of what ultimately turned out to be 15 keyframes had been extracted. None of them showed much by way of visuals, however, as heavy damage caused decoding to fail, resulting in mostly gray images.

frame11_tantalizing_350This changed with the introduction of a special version of FFmpeg, a video decoding tool, modified for the project by one of its authors.

Rather than showing a gray image when an error was detected, this version continued to attempt to decode the image.

Applying it to the damaged frames resulted in a jumble of colored blocks, with scattered throughout some tantalizing bits of detail.

Gaining good images out of this seemed possible, but would be a jigsaw puzzle of epic proportions.

Frames and Macroblocks:

To understand the challenge, it helps to know something about the MPEG4 video compression used by SpaceX.

MPEG4 encodes a video frame-by-frame, with each frame split into a grid of 16×16 pixel squares, known as macroblocks (MBs), which are stored in left-to-right, top-to-bottom order. For each macroblock, brightness and color information is separated, color detail is reduced, and then both are compressed and stored separately.

macroblocksTo further reduce the space needed, most information about a macroblock is not stored directly, but as a difference with respect to either its left or top neighbor.

While this greatly reduces the bandwidth required to transmit high-quality video, it also causes any error in a single macroblock to propagate throughout the subsequent macroblocks, and multiple independent errors to stack up.

As a result of this, repairing a damaged frame is like solving a jigsaw puzzle with damaged, paint-splattered pieces, whose remaining undamaged parts are scrambled until the piece is slotted into place correctly. A seemingly impossible task.

We Do This SpaceX Style:

The team set to work with the new tools, which allowed them to reset the decoding process by artificially inserting a plain gray macroblock, and to then restart at an arbitrary position in the file.

This kept errors from propagating, and let them piece together undamaged macroblocks even if earlier damaged macroblocks had not yet been repaired.

common_dirt2_350At launch, a spray of dirty water from the flame trench had left splatters of mud on the camera.

As these appeared in the same place in different frames, they could be used to place pieces of the image in the right location, which was especially helpful in the otherwise rather featureless top half of the frames.

Meanwhile, an easy-to-use web interface was built, so that people could help the repair without having to install special software on their computers. New extensions were created to patch up damaged macroblocks, rather than just ignoring them.

A wiki was added to document the results, which, less than two weeks in, were already significant.

AllGoodFrames_350There was still a lot of damage, but the images now showed that the rocket had successfully deployed its landing legs, fired its Merlin engine to slow the descent, and reached the water intact.

This result did not go unnoticed, with Elon Musk himself tweeting a link to the partially repaired video, and he would later comment on the effort at the Dragon v2 reveal.

“The data came through really well, but the video was corrupted because unfortunately when you compress video, it’s hard to uncorrupt a compressed video because you actually have to figure out the compression algorithms and all these things, so we weren’t able to get very far,” said Mr. Musk (video and transcript).

2014-06-26 15_41_38-Shit Elon Says - Transcript - SpaceX Dragon 2 Unveil Q&A“We put the video up online and then we crowd sourced the clean-up of the video and people did a really great job of fixing it. Mostly the people on the NASASpaceFlight forum were able to fix the video.”

The repaired video began showing up in SpaceX presentations.

Another on-going effort was the development of tools for automatically repairing frames by undoing damage at the level of individual bits.

Analysis of the repairs made to the transport stream had revealed that these occurred in particular patterns, and software was created to automatically try to undo potential damage according to these patterns.

Unfortunately, it turned out to be very difficult to automatically judge whether a change was an improvement. Also, in combination with the sheer amount of possible error patterns, the results were not as good as what could be achieved manually.

Fortunately, manual work continued as well, and it was becoming clear that some of the frames had damage beyond mere macroblock errors. Furthermore, there appeared to be frames missing, and so far only so-called I-frames had been looked at, while the video consisted mostly of P-frames

I-frames, P-frames and the Transport Stream:

In MPEG-4, I-frames are essentially independent pictures. They consist of the collection of compressed macroblocks making up the picture, and some additional information needed to decode them. Even with the macroblocks compressed, an I-frame still requires a significant amount of space.

To further reduce the size of a video, most frames are therefore stored as P-frames rather than I-frames.

2014-06-26 19_24_44-index.php (448×900)In a P-frame, most macroblocks do not contain image data, but point to the corresponding area in a previous I-frame. The decoder then simply copies the area from the previous frame.

If a completely new object appears, such as a whitecap or flames from the engine, the corresponding macroblocks will contain the actual data just like in an I-frame.

Once the encoder has encoded all the frames, it puts them into a transport stream, which is used to combine audio, video, and other information into a single file.

The landing video only contains video, but damage to the transport stream still caused frames to decode incorrectly, or even disappear completely.

Many hours were spent creating purpose-built software, and using it to clean up the transport stream. The hard work paid off though, resulting in a complete set of frames.

The Home Stretch:

It was now late May, and the project had been underway for about a month.

iframe_221_progress_2_resized_halfframesTeam members continued to contribute macroblock repairs, now both for I-frames and P-frames, and the results were now being processed and uploaded to YouTube automatically.

Damaged areas in I-frames were back-filled from previous frames.

The time counter in the bottom left of the video turned out to be fairly heavily damaged in most frames, most likely because such a high-detail region requires many bits to describe, which increases the chance of some of them being damaged.

Fortunately, the shapes of the numbers could be extracted from good frames, and the correct values were reconstructed from the internal MPEG4 timestamps, making it possible to redraw this area directly.

2014-06-26 19_32_58-SpaceX Landing Restoration 2014_06_22 20_45_06 GMT - YouTubeAs with the rest of the repair, the team proceeded very carefully, wanting to be as sure as possible that the restored timestamps matched what had been sent by the rocket originally.

Work continued throughout early June, and by the 22nd, the team were ready to declare the work as complete.

A short introduction sequence had been created, together with a trailer with credits, and these were glued onto the repaired video.

About two months after SpaceX had first published the damaged stream and two partially restored still frames, the restored video now clearly showed a controlled descent, leg deployment, and finally a soft touchdown on the surface of the Atlantic ocean.

Mission accomplished!

*Click here for the final version of the restored video*
*Click here to view the 1,780 post/365,000 read recovery effort thread*

(Images via the restoration process and SpaceX).

Share This Article

Visualizing Algorithms

$
0
0
Visualizing Algorithms

June 26, 2014

The power of the unaided mind is highly overrated… The real powers come from devising external aids that enhance cognitive abilities. Donald Norman

Algorithms are a fascinating use case for visualization. To visualize an algorithm, we don’t merely fit data to a chart; there is no primary dataset. Instead there are logical rules that describe behavior. This may be why algorithm visualizations are so unusual, as designers experiment with novel forms to better communicate. This is reason enough to study them.

But algorithms are also a reminder that visualization is more than a tool for finding patterns in data. Visualization leverages the human visual system to augment human intellect: we can use it to better understand these important abstract processes, and perhaps other things, too. This is an adaption of my talk at Eyeo 2014. A video of the talk will be available soon. (Thanks, Eyeo folks!)

#Sampling

Before I can explain the first algorithm, I first need to explain the problem it addresses.

Van Gogh’s The Starry Night

Light — electromagnetic radiation — the light emanating from this screen, traveling through the air, focused by your lens and projected onto the retina — is a continuous signal. To be perceived, we must reduce light to discrete impulses by measuring its intensity and frequency distribution at different points in space.

This reduction process is called sampling, and it is essential to vision. You can think of it as a painter applying discrete strokes of color to form an image (particularly in Pointillism or Divisionism). Sampling is further a core concern of computer graphics; for example, to rasterize a 3D scene by raytracing, we must determine where to shoot rays. Even resizing an image requires sampling.

Sampling is made difficult by competing goals. On the one hand, samples should be evenly distributed so there are no gaps. But we must also avoid repeating, regular patterns, which cause aliasing. This is why you shouldn’t wear a finely-striped shirt on camera: the stripes resonate with the grid of pixels in the camera’s sensor and cause Moiré patterns.

Photo: retinalmicroscopy.com

This micrograph is of the human retina’s periphery. The larger cone cells detect color, while the smaller rod cells improve low-light vision.

The human retina has a beautiful solution to sampling in its placement of photoreceptor cells. The cells cover the retina densely and evenly (with the exception of the blind spot over the optic nerve), and yet the cells’ relative positions are irregular. This is called a Poisson-disc distribution because it maintains a minimum distance between cells, avoiding occlusion and thus wasted photoreceptors.

Unfortunately, creating a Poisson-disc distribution is hard. (More on that in a bit.) So here’s a simple approximation known as Mitchell’s best-candidate algorithm.

Best-candidate

You can see from these dots that best-candidate sampling produces a pleasing random distribution. It’s not without flaws: there are too many samples in some areas (oversampling), and not enough in other areas (undersampling). But it’s reasonably good, and just as important, easy to implement.

Here’s how it works:

Best-candidate

For each new sample, the best-candidate algorithm generates a fixed number of candidates, shown in gray. (Here, that number is 10.) Each candidate is chosen uniformly from the sampling area.

The best candidate, shown in red, is the one that is farthest away from all previous samples, shown in black. The distance from each candidate to the closest sample is shown by the associated line and circle: notice that there are no other samples inside the gray or red circles. After all candidates are created and distances measured, the best candidate becomes the new sample, and the remaining candidates are discarded.

Now here’s the code:

function sample() {
  var bestCandidate, bestDistance = 0;
  for (var i = 0; i < numCandidates; ++i) {
    var c = [Math.random() * width, Math.random() * height],
        d = distance(findClosest(samples, c), c);
    if (d > bestDistance) {
      bestDistance = d;
      bestCandidate = c;
    }
  }
  return bestCandidate;
}

As I explained the algorithm above, I will let the code stand on its own. (And the purpose of this essay is to let you study code through visualization, besides.) But I will clarify a few details:

The external numCandidates defines the number of candidates to create per sample. This parameter lets you trade-off speed with quality. The lower the number of candidates, the faster it runs. Conversely, the higher the number of candidates, the better the sampling quality.

The distance function is simple geometry:

function distance(a, b) {
  var dx = a[0] - b[0],
      dy = a[1] - b[1];
  return Math.sqrt(dx * dx + dy * dy);
}

You can omit the sqrt here, if you want, since it’s a monotonic function and doesn’t change the determination of the best candidate.

The findClosest function returns the closest sample to the current candidate. This can be done by brute force, iterating over every existing sample. Or you can accelerate the search, say by using a quadtree. Brute force is simple to implement but very slow (quadratic time, in O-notation). The accelerated approach is much faster, but more work to implement.

Speaking of trade-offs: when deciding whether to use an algorithm, we evaluate it not in a vacuum but against other approaches. And as a practical matter it is useful to weigh the complexity of implementation — how long it takes to implement, how difficult it is to maintain — against its performance and quality.

The simplest alternative is uniform random sampling:

function sample() {
  return [random() * width, random() * height];
}

It looks like this:

Uniform random

Uniform random is pretty terrible. There is both severe under- and oversampling: many samples are densely-packed, even overlapping, leading to large empty areas. (Uniform random sampling also represents the lower bound of quality for the best-candidate algorithm, as when the number of candidates per sample is set to one.)

Dots patterns are one way of showing sample pattern quality, but not the only way. For example, we can attempt to simulate vision under different sampling strategies by coloring an image according to the color of the closest sample. This is, in effect, a Voronoi diagram of the samples where each cell is colored by the associated sample.

What does The Starry Night look like through 6,667 uniform random samples?

Uniform random

Hold down the mouse to compare to the original.

The lackluster quality of this approach is again apparent. The cells vary widely in size, as expected from the uneven sample distribution. Detail has been lost because densely-packed samples (small cells) are underutilized. Meanwhile, sparse samples (large cells) introduce noise by exaggerating rare colors, such as the pink star in the bottom-left.

Now observe best-candidate sampling:

Best-candidate

Hold down the mouse to compare to the original.

Much better! Cells are more consistently sized, though still randomly placed. Despite the quantity of samples (6,667) remaining constant, there is substantially more detail and less noise thanks to their even distribution. If you squint, you can almost make out the original brush strokes.

We can use Voronoi diagrams to study sample distributions more directly by coloring each cell according to its area. Darker cells are larger, indicating sparse sampling; lighter cells are smaller, indicating dense sampling. The optimal pattern has nearly-uniform color while retaining irregular sample positions. (A histogram showing cell area distribution would also be nice, but the Voronoi has the advantage that it shows sample position simultaneously.)

Here are the same 6,667 uniform random samples:

Uniform random

The black spots — large gaps between samples — would be localized deficiencies in vision due to undersampling. The same number of best-candidate samples exhibits much less variation in cell area, and thus more consistent coloration:

Best-candidate

Can we do better than best-candidate? Yes! Not only can we produce a better sample distribution with a different algorithm, but this algorithm is faster (linear time). It’s at least as easy to implement as best-candidate. And this algorithm even scales to arbitrary dimensions.

This wonder is called Bridson’s algorithm for Poisson-disc sampling, and it looks like this:

Poisson-disc

This algorithm functions visibly differently than the other two: it builds incrementally from existing samples, rather than scattering new samples randomly throughout the sample area. This gives its progression a quasi-biological appearance, like cells dividing in a petri dish. Notice, too, that no samples are too close to each other; this is the minimum-distance constraint that defines a Poisson-disc distribution, enforced by the algorithm.

Here’s how it works:

Poisson-disc

Red dots represent “active” samples. At each iteration, one is selected randomly from the set of all active samples. Then, some number of candidate samples (shown as hollow black dots) are randomly generated within an annulus surrounding the selected sample. The annulus extends from radius r to 2r, where r is the minimum-allowable distance between samples.

Candidate samples within distance r from an existing sample are rejected; this “exclusion zone” is shown in gray, along with a black line connecting the rejected candidate to the nearby existing sample. A grid accelerates the distance check for each candidate. The grid size r/√2 ensures each cell can contain at most one sample, and only a fixed number of neighboring cells need to be checked.

If a candidate is acceptable, it is added as a new sample, and a new active sample is randomly selected. If none of the candidates are acceptable, the selected active sample is marked as inactive (changing from red to black). When no samples remain active, the algorithm terminates.

The area-as-color Voronoi diagram shows Poisson-disc sampling’s improvement over best-candidate, with no dark-blue or light-yellow cells:

Poisson-disc

The Starry Night under Poisson-disc sampling retains the greatest amount of detail and the least noise. It is reminscent of a beautiful Roman mosaic:

Poisson-disc

Hold down the mouse to compare to the original.

Now that you’ve seen a few examples, let’s briefly consider why to visualize algorithms.

Entertaining - I find watching algorithms endlessly fascinating, even mesmerizing. Particularly so when randomness is involved. And while this may seem a weak justification, don’t underestimate the value of joy! Further, while these visualizations can be engaging even without understanding the underlying algorithm, grasping the importance of the algorithm can give a deeper appreciation.

Teaching - Did you find the code or the animation more helpful? What about pseudocode— that euphemism for code that won’t compile? While formal description has its place in unambiguous documentation, visualization can make intuitive understanding more accessible.

Debugging - Have you ever implemented an algorithm based on formal description? It can be hard! Being able to see what your code is doing can boost productivity. Visualization does not supplant the need for tests, but tests are useful primarily for detecting failure and not explaining it. Visualization can also discover unexpected behavior in your implementation, even when the output looks correct. (See Bret Victor’s Learnable Programming and Inventing on Principle for excellent related work.)

Learning - Even if you just want to learn for yourself, visualization can be a great way to gain deep understanding. Teaching is one of the most effective ways of learning, and implementing a visualization is like teaching yourself. I find it easier to remember an algorithm intuitively, having seen it, than to memorize code where I am bound to forget small but essential details.

#Shuffling

Shuffling is the process of rearranging an array of elements randomly. For example, you might shuffle a deck of cards before dealing a poker game. A good shuffling algorithm is unbiased, where every ordering is equally likely.

The Fisher–Yates shuffle is an optimal shuffling algorithm. Not only is it unbiased, but it runs in linear time, uses constant space, and is easy to implement.

function shuffle(array) {
  var n = array.length, t, i;
  while (n) {
    i = Math.random() * n-- | 0; // 0 ≤ i < n
    t = array[n];
    array[n] = array[i];
    array[i] = t;
  }
  return array;
}

Above is the code, and below is a visual explanation:

For a more detailed explanation of this algorithm, see my post on the Fisher–Yates shuffle.

Each line represents a number. Small numbers lean left and large numbers lean right. (Note that you can shuffle an array of anything — not just numbers — but this visual encoding is useful for showing the order of elements. It is inspired by Robert Sedgwick’s sorting visualizations in Algorithms in C.)

The algorithm splits the array into two parts: the right side of the array (in black) is the shuffled section, while the left side of the array (in gray) contains elements remaining to be shuffled. At each step it picks a random element from the left and moves it to the right, thereby expanding the shuffled section by one. The original order on the left does not need to be preserved, so to make room for the new element in the shuffled section, the algorithm can simply swap the element into place. Eventually all elements are shuffled, and the algorithm terminates.

If Fisher–Yates is a good algorithm, what does a bad algorithm look like? Here’s one:

// DON’T DO THIS!
function shuffle(array) {
  return array.sort(function(a, b) {
    return Math.random() - .5; // ಠ_ಠ
  });
}

This approach uses sorting to shuffle by specifying a random comparator function. A comparator defines the order of elements. It takes arguments a and b— two elements from the array to compare — and returns a value less than zero if a is less than b, a value greater than zero if a is greater than b, or zero if a and b are equal. The comparator is invoked repeatedly during sorting. If you don’t specify a comparator to array.sort, elements are ordered lexicographically.

Here the comparator returns a random number between -.5 and +.5. The assumption is that this defines a random order, so sorting will jumble the elements randomly and perform a good shuffle.

Unfortunately, this assumption is flawed. A random pairwise order (for any two elements) does not establish a random order for a set of elements. A comparator must obey transitivity: if a> b and b> c, then a> c. But the random comparator returns a random value, violating transitivity and causing the behavior of array.sort to be undefined! You might get lucky, or you might not.

How bad is it? We can try to answer this question by visualizing the output:

Another reason this algorithm is bad is that sorting takes O(n lg n) time, making it significantly slower than Fisher–Yates which takes O(n). But speed is less damning than bias.

This may look random, so you might be tempted to conclude that random comparator shuffle is adequate, and dismiss concerns of bias as pedantic. But looks can be misleading! There are many things that appear random to the human eye but are substantially non-random.

This deception demonstrates that visualization is not a magic wand. Showing a single run of the algorithm does not effectively assess the quality of its randomness. We must instead carefully design a visualization that addresses the specific question at hand: what is the algorithm’s bias?

To show bias, we must first define it. One definition is based on the probability that an array element at index i prior to shuffling will be at index j after shuffling. If the algorithm is unbiased, every element has equal probability of ending up at every index, and thus the probability for all i and j is the same: 1/n, where n is the number of elements.

Computing these probabilities analytically is difficult, since it depends on knowing the exact sorting algorithm used. But computing them empirically is easy: we simply shuffle thousands of times and count the number of occurrences of element i at index j. An effective display for this matrix of probabilities is a matrix diagram:

SHUFFLE BIAS
column = index before shuffle
row = index after shuffle
green = positive bias
red = negative bias

The column (horizontal position) of the matrix represents the index of the element prior to shuffling, while the row (vertical position) represents the index of the element after shuffling. Color encodes probability: green cells indicate positive bias, where the element occurs more frequently than we would expect for an unbiased algorithm; likewise red cells indicate negative bias, where it occurs less frequently than expected.

Random comparator shuffle in Chrome, shown above, is surprisingly mediocre. Parts of the array are only weakly biased. However, it exhibits a strong positive bias below the diagonal, which indicates a tendency to push elements from index i to i+1 or i+2. There is also strange behavior for the first, middle and last row, which might be a consequence of Chrome using median-of-three quicksort.

The unbiased Fisher–Yates algorithm looks like this:

No patterns are visible in this matrix, other than a small amount of noise due to empirical measurement. (That noise could be reduced if desired by taking additional measurements.)

The behavior of random comparator shuffle is heavily dependent on your browser. Different browsers use different sorting algorithms, and different sorting algorithms behave very differently with (broken) random comparators. Here’s random comparator shuffle on Firefox:

For an interactive version of these matrix diagrams to test alternative shuffling strategies, see Will It Shuffle?

This is egregiously biased! The resulting array is often barely shuffled, as shown by the strong green diagonal in this matrix. This does not mean that Chrome’s sort is somehow “better” than Firefox’s; it simply means you should never use random comparator shuffle. Random comparators are fundamentally broken.

#Sorting

Sorting is the inverse of shuffling: it creates order from disorder, rather than vice versa. This makes sorting a harder problem with diverse solutions designed for different trade-offs and constraints.

One of the most well-known sorting algorithms is quicksort.

Quicksort

Quicksort first partitions the array into two parts by picking a pivot. The left part contains all elements less than the pivot, while the right part contains all elements greater than the pivot. After the array is partitioned, quicksort recurses into the left and right parts. When a part contains only a single element, recursion stops.

The partition operation makes a single pass over the active part of the array. Similar to how the Fisher–Yates shuffle incrementally builds the shuffled section by swapping elements, the partition operation builds the lesser (left) and greater (right) parts of the subarray incrementally. As each element is visited, if it is less than the pivot it is swapped into the lesser part; if it is greater than the pivot the partition operation moves on to the next element.

Here’s the code:

function quicksort(array, left, right) {
  if (left < right - 1) {
    var pivot = left + right >> 1;
    pivot = partition(array, left, right, pivot);
    quicksort(array, left, pivot);
    quicksort(array, pivot + 1, right);
  }
}

function partition(array, left, right, pivot) {
  var pivotValue = array[pivot];
  swap(array, pivot, --right);
  for (var i = left; i < right; ++i) {
    if (array[i] < pivotValue) {
      swap(array, i, left++);
    }
  }
  swap(array, left, right);
  return left;
}

There are many variations of quicksort. The one shown above is one of the simplest — and slowest. This variation is useful for teaching, but in practice more elaborate implementations are used for better performance.

A common improvement is “median-of-three” pivot selection, where the median of the first, middle and last elements is used as the pivot. This tends to choose a pivot closer to the true median, resulting in similarly-sized left and right parts and shallower recursion. Another optimization is switching from quicksort to insertion sort for small parts of the array, which can be faster due to the overhead of function calls. A particularly clever variation is Yaroslavskiy’s dual-pivot quicksort, which partitions the array into three parts rather than two. This is the default sorting algorithm in Java and Dart.

The sort and shuffle animations above have the nice property that time is mapped to time: we can simply watch how the algorithm proceeds. But while intuitive, animation can be frustrating to watch, especially if we want to focus on an occasional weirdness in the algorithm’s behavior. Animations also rely heavily on our memory to observe patterns in behavior. While animations are improved by controls to pause and scrub time, static displays that show everything at once can be even more effective. The eye scans faster than the hand.

A simple way of turning an animation into a static display is to pick key frames from the animation and display those sequentially, like a comic strip. If we then remove redundant information across key frames, we use space more efficiently. A more denser display may require more study to understand, but is faster to scan since the eye travels less.

Below, each row shows the state of the array prior to recursion. The first row is the initial state of the array, the second row is the array after the first partition operation, the third row is after the first partition’s left and right parts are again partitioned, etc. In effect, this is breadth-first quicksort, where the partition operation on both left and right proceeds in parallel.

Quicksort

As before, the pivots for each partition operation are highlighted in red. Notice that the pivots turn gray at the next level of recursion: after the partition operation completes, the associated pivot is in its final, sorted position. The total depth of the display — the maximum depth of recursion — gives a sense of how efficiently quicksort performed. It depends heavily on input and pivot choice.

Another static display of quicksort, less dense but perhaps easier to read, represents each element as a colored thread and shows each sequential swap. (This form is inspired by Aldo Cortesi’s sorting visualizations.) Smaller values are lighter, and larger values are darker.

At the start of each partition, the pivot is moved to the end (the right) of the active subarray.

Partitioning then proceeds from left to right. At each step, a new element is added either of the set of lesser values (in which case a swap occurs) or to the set of greater values (in which case no swap occurs).

When a swap occurs, the left-most value greater than the pivot is moved to the right, so as to make room on the left for the new lesser value. Thus, notice that in all swap operations, only values darker than the pivot move right, and only values lighter than the pivot move left. When the partition operation has visited all elements in the array, the pivot is placed in its final position between the two parts. Then, the algorithm recurses into the left part, followed by the right part (far below). This visualization doesn’t show the state of the stack, so it can appear to jump around arbitrarily due to the nature of recursion. Still, you can typically see when a partition operation finishes due to the characteristic movement of the pivot to the end of the active subarray. Quicksort

You’ve now seen three different visual representations of the same algorithm: an animation, a dense static display, and a sparse static display. Each form has strengths and weaknesses. Animations are fun to watch, but static visualizations allow close inspection without being rushed. Sparse displays may likely easier to understand, but dense displays show the “macro” view of the algorithm’s behavior in addition to its details.

Before we move on, let’s contrast quicksort with another well-known sorting algorithm: mergesort.

function mergesort(array) {
  var n = array.length, a0 = array, a1 = new Array(n);
  for (var m = 1; m < n; m <<= 1) {
    for (var i = 0; i < n; i += m << 1) {
      var left = i,
          right = Math.min(i + m, n),
          end = Math.min(i + (m << 1), n);
      merge(a0, a1, left, right, end);
    }
    array = a0, a0 = a1, a1 = array;
  }
}

function merge(a0, a1, left, right, end) {
  for (var i0 = left, i1 = right; left < end; ++left) {
    if (i0 < right && (i1 >= end || a0[i0] <= a0[i1])) {
      a1[left] = a0[i0++];
    } else {
      a1[left] = a0[i1++];
    }
  }
}

Again, above is the code and below is an animation:

Mergesort

As you’ve likely surmised from either the code or the animation, mergesort takes a very different approach to sorting than quicksort. Unlike quicksort, which operates in-place by performing swaps, mergesort requires an extra copy of the array. This extra space is used to merge sorted subarrays, combining the elements from pairs of subarrays while preserving order. Since mergesort performs copies instead of swaps, we must modify the animation accordingly (or risk misleading readers).

Mergesort works from the bottom-up. Initially, it merges subarrays of size one, since these are trivially sorted. Each adjacent subarray — at first, just a pair of elements — is merged into a sorted subarray of size two using the extra array. Then, each adjacent sorted subarray of size two is merged into a sorted subarray of size four. After each pass over the whole array, mergesort doubles the size of the sorted subarrays: eight, sixteen, and so on. Eventually, this doubling merges the entire array and the algorithm terminates.

Because mergesort performs repeated passes over the array rather than recursing like quicksort, and because each pass doubles the size of sorted subarrays regardless of input, it is easier to design a static display. We simply show the state of the array after each pass.

Mergesort

Let’s again take a moment to consider what we’ve seen. The goal here is to study the behavior of an algorithm rather than a specific dataset. Yet there is still data, necessarily — the data is derived from the execution of the algorithm. And this means we can use the type of derived data to classify algorithm visualizations.

Level 0 / black box - The simplest class just shows the output. This does not explain the algorithm’s operation, but it can still verify correctness. And by treating the algorithm as a black box, you can more easily compare outputs of different algorithms. Black box visualizations can also be combined with deeper analysis of output, such as the shuffle bias matrix diagram shown above.

Level 1 / gray box - Many algorithms (though not all) build up output incrementally. By visualizing the intermediate output as it develops, we start to see how the algorithm works. This explains more without introducing new abstraction, since the intermediate and final output share the same structure. Yet this type of visualization can raise more questions than it answers, since it offers no explanation as to why the algorithm does what it does.

Level 2 / white box - To answer “why” questions, white box visualizations expose the internal state of the algorithm in addition to its intermediate output. This type has the greatest potential to explain, but also the highest burden on the reader, as the meaning and purpose of internal state must be clearly described. There is a risk that the additional complexity will overwhelm the reader; layering information may make the graphic more accessible. Lastly, since internal state is highly-dependent on the specific algorithm, this type of visualization is often unsuitable for comparing algorithms.

There’s also the practical matter of implementating algorithm visualizations. Typically you can’t just run code as-is; you must instrument it to capture state for visualization. (View source on this page for examples.) You may even need to interleave execution with visualization, which is particularly challenging for recursive algorithms that capture state on the stack. Language parsers such as Esprima may facilitate algorithm visualization through code instrumentation, cleanly separating execution code from visualization code.

#Maze Generation

The last problem we’ll look at is maze generation. All algorithms in this section generate a spanning tree of a two-dimensional rectangular grid. This means there are no loops and there is a unique path from the root in the bottom-left corner to every other cell in the maze.

I apologize for the esoteric subject — I don’t know enough to say why these algorithms are useful beyond simple games, and possibly something about electrical networks. But even so, they are fascinating from a visualization perspective because they solve the same, highly-constrained problem in wildly-different ways.

And they’re just fun to watch.

Random traversal

The random traversal algorithm initializes the first cell of the maze in the bottom-left corner. The algorithm then tracks all possible ways by which the maze could be extended (shown in red). At each step, one of these possible extensions is picked randomly, and the maze is extended as long as this does not reconnect it with another part of the maze.

Like Bridon’s Poisson-disc sampling algorithm, random traversal maintains a frontier and randomly selects from that frontier to expand. Both algorithms thus appear to grow organically, like a fungus.

Randomized depth-first traversal follows a very different pattern:

Randomized depth-first traversal

Rather than picking a new random passage each time, this algorithm always extends the deepest passage — the one with the longest path back to the root — in a random direct. Thus, randomized depth-first traversal only branches when the current path dead-ends into an earlier part of the maze. To continue, it backtracks until it can start a new branch. This snake-like exploration leads to mazes with significantly fewer branches and much longer, winding passages.

Prim’s algorithm constructs a minimum spanning tree, a spanning tree of a graph with weighted edges with the lowest total weight. This algorithm can be used to construct a random spanning tree by initializing edge weights randomly:

Randomized Prim’s

At each step, Prim’s algorithm extends the maze using the lowest-weighted edge (potential direction) connected to the existing maze. If this edge would form a loop, it is discarded and the next-lowest-weighted edge is considered.

Prim’s algorithm is commonly implemented using a heap, which is an efficient data structure for prioritizing elements. When a new cell is added to the maze, connected edges (shown in red) are added to the heap. Despite edges being added in arbitrary order, the heap allows the lowest-weighted edge to be quickly removed.

Lastly, a most unusual specimen:

Wilson’s

Wilson’s algorithm uses loop-erased random walks to generate a uniform spanning tree — an unbiased sample of all possible spanning trees. The other maze generation algorithms we have seen lack this beautiful mathematical property.

The algorithm initializes the maze with an arbitrary starting cell. Then, a new cell is added to the maze, initiating a random walk (shown in red). The random walk continues until it reconnects with the existing maze (shown in white). However, if the random walk intersects itself, the resulting loop is erased before the random walk continues.

Initially, the algorithm can be frustratingly slow to watch, as early random walks are unlikely to reconnect with the small existing maze. As the maze grows, random walks become more likely to collide with the maze and the algorithm accelerates dramatically.

These four maze generation algorithms work very differently. And yet, when the animations end, the resulting mazes are difficult to distinguish from each other. The animations are useful for showing how the algorithm works, but fail to reveal the resulting tree structure.

A way to show structure, rather than process, is to flood the maze with color:

Random traversal

Color encodes tree depth — the length of the path back to the root in the bottom-left corner. The color scale cycles as you get deeper into the tree; this is occasionally misleading when a deep path circles back adjacent to a shallow one, but the higher contrast allows better differentiation of local structure. (This is not a convential rainbow color scale, which is nominally considered harmful, but a cubehelix rainbow with improved perceptual properties.)

We can further emphasize the structure of the maze by subtracting the walls, reducing visual noise. Below, each pixel represents a path through the maze. As above, paths are colored by depth and color floods deeper into the maze over time.

Random traversal

Concentric circles of color, like a tie-dye shirt, reveal that random traversal produces many branching paths. Yet the shape of each path is not particularly interesting, as it tends to go in a straight line back to the root. Because random traversal extends the maze by picking randomly from the frontier, paths are never given much freedom to meander — they end up colliding with the growing frontier and terminate due to the restriction on loops.

Randomized depth-first traversal, on the other hand, is all about the meander:

Randomized depth-first traversal

This animation proceeds at fifty times the speed of the previous one. This speed-up is necessary because randomized depth-first traversal mazes are much, much deeper than random traversal mazes due to limited branching. You can see that typically there is only one, and rarely more than a few, active branches at any particular depth.

Now Prim’s algorithm on a random graph:

Randomized Prim’s

This is more interesting! The simultaneously-expanding florets of color reveal substantial branching, and there is more complex global structure than random traversal.

Wilson’s algorithm, despite operating very differently, seems to produce very similar results:

Wilson’s

Just because they look the same does not mean they are. Despite appearances, Prim’s algorithm on a randomly-weighted graph does not produce a uniform spanning tree (as far as I know — proving this is outside my area of expertise). Visualization can sometimes mislead due to human error. An earlier version of the Prim’s color flood had a bug where the color scale rotated twice as fast as intended; this suggested that Prim’s and Wilson’s algorithms produced very different trees, when in fact they appear much more similar than different.

Since these mazes are spanning trees, we can also use specialized tree visualizations to show structure. To illustrate the duality between maze and tree, here the passages (shown in white) of a maze generated by Wilson’s algorithm are gradually transformed into a tidy tree layout. As with the other animations, it proceeds by depth, starting with the root and descending to the leaves:

Wilson’s

For comparison, again we see how randomized depth-first traversal produces trees with long passages and little branching.

Randomized depth-first traversal

Both trees have the same number of nodes (3,239) and are scaled to fit in the same area (960×500 pixels). This hides an important difference: at this size, randomized depth-first traversal typically produces a tree two-to-five times deeper than Wilson’s algorithm. The tree depths above are _ and _, respectively. In the larger 480,000-node mazes used for color flooding, randomized depth-first traversal produces a tree that is 10-20 times deeper!

#Using Vision to Think

This essay has focused on algorithms. Yet the techniques discussed here apply to a broader space of problems: mathematical formulas, dynamical systems, processes, etc. Basically, anywhere there is code that needs understanding.

Shan Carter, Archie Tse and I recently built a new rent vs. buy calculator; powering the calculator is a couple hundred lines of code to compute the total cost of renting or buying a home. It’s a simplistic model, but more complicated than fits in your head. The calculator takes about twenty input parameters (such as purchase price and mortgage rate) and considers opportunity costs on investments, inflation, marginal tax rates, and a variety of other factors.

The goal of the calculator is to help you decide whether you should buy or rent a home. If the total cost of buying is cheaper, you should buy. Otherwise, you should rent.

Except, it’s not that simple.

To output an accurate answer, the calculator needs accurate inputs. While some inputs are well-known (such as the length of your mortgage), others are difficult or impossible to predict. No one can say exactly how the stock market will perform, how much a specific home will appreciate or depreciate, or how the renting market will change over time.
Is It Better to Buy or Rent?

We can make educated guesses at each variable — for example, looking at Case–Shiller data. But if the calculator is a black box, then readers can’t see how sensitive their answer is to small changes.

To fix this, we need to do more than output a single number. We need to show how the underlying system works. The new calculator therefore charts every variable and lets you quickly explore any variable’s effect by adjusting the associated slider.

The slope of the chart shows the associated variable’s importance: the greater the slope, the more the decision depends on that variable. Since variables interact with each other, changing a variable may change the slope of other charts.

This design lets you inspect many aspects of the system. For example, should you make a large down payment? Yes, if the down payment rate slopes down; or no, if the down payment rate slopes up, as with a higher investment return rate. This suggests that the optimal loan size depends on the difference between the opportunity cost on the down payment (money not invested) and the interest cost on the mortgage.

So, why visualize algorithms? Why visualize anything? To leverage the human visual system to improve understanding. Or more simply, to use vision to think.

#Related Work

I mentioned Aldo Cortesi’s sorting visualizations earlier. (I also like Cortesi’s visualizations of malware entropy.) Others abound, including: sorting.at, sorting-algorithms.com, and Aaron Dufour’s Sorting Visualizer, which lets you plug in your own algorithm. YouTube user andrut’s audibilizations are interesting. Robert Sedgwick has published several new editions of Algorithms since I took his class, and his latest uses traditional bars rather than angled lines.

Amit Patel explores “visual and interactive ways of explaining math and computer algorithms.” The articles on 2D visibility, polygonal map generation and pathfinding are particularly great. Nicky Case published another lovely explanation of 2D visibility and shadow effects. I am heavily-indebted to Jamis Buck for his curation of maze generation algorithms. Christopher Wellons’ GPU-based path finding implementation uses cellular automata— another fascinatingsubject. David Mimno gave a talk on visualization for models and algorithms at OpenVis 2014 that was an inspiration for this work. And like many, I have long been inspired by Bret Victor, especially Inventing on Principle and Up and Down the Ladder of Abstraction.

Jason Davies has made numerous illustrations of mathematical concepts and algorithms. Some of my favorites are: Lloyd’s Relaxation, Coalescing Soap Bubbles, Biham-Middleton-Levine Traffic Model, Collatz Graph, Random Points on a Sphere, Bloom Filters, Animated Bézier Curves, Animated Trigonometry, Proof of Pythagoras’ Theorem, and Morley’s Trisector Theorem. Pierre Guilleminot’s Fourier series explanation is great, as are Lucas V. Barbosa’s Fourier transform time and frequency domains and an explanation of Simpson’s paradox by Lewis Lehe & Victor Powell; also see Powell’s animations of the central limit theorem and conditional probabilities. Steven Wittens makes mind-expanding visualizations of mathematical concepts in three dimensions, such as Julia fractals.

In my own work, I’ve used visualization to explain topology inference (including a visual debugger), D3’s selections and the Fisher–Yates shuffle. There are more standalone visualizations on my bl.ocks. If you have suggestions for interesting visualizations, or any other feedback, please contact me on Twitter.

Thank you for reading! June 26, 2014

Visualizing Algorithms

June 26, 2014

The power of the unaided mind is highly overrated… The real powers come from devising external aids that enhance cognitive abilities. Donald Norman

Algorithms are a fascinating use case for visualization. To visualize an algorithm, we don’t merely fit data to a chart; there is no primary dataset. Instead there are logical rules that describe behavior. This may be why algorithm visualizations are so unusual, as designers experiment with novel forms to better communicate. This is reason enough to study them.

But algorithms are also a reminder that visualization is more than a tool for finding patterns in data. Visualization leverages the human visual system to augment human intellect: we can use it to better understand these important abstract processes, and perhaps other things, too. This is an adaption of my talk at Eyeo 2014. A video of the talk will be available soon. (Thanks, Eyeo folks!)

#Sampling

Before I can explain the first algorithm, I first need to explain the problem it addresses.

Van Gogh’s The Starry Night

Light — electromagnetic radiation — the light emanating from this screen, traveling through the air, focused by your lens and projected onto the retina — is a continuous signal. To be perceived, we must reduce light to discrete impulses by measuring its intensity and frequency distribution at different points in space.

This reduction process is called sampling, and it is essential to vision. You can think of it as a painter applying discrete strokes of color to form an image (particularly in Pointillism or Divisionism). Sampling is further a core concern of computer graphics; for example, to rasterize a 3D scene by raytracing, we must determine where to shoot rays. Even resizing an image requires sampling.

Sampling is made difficult by competing goals. On the one hand, samples should be evenly distributed so there are no gaps. But we must also avoid repeating, regular patterns, which cause aliasing. This is why you shouldn’t wear a finely-striped shirt on camera: the stripes resonate with the grid of pixels in the camera’s sensor and cause Moiré patterns.

Photo: retinalmicroscopy.com

This micrograph is of the human retina’s periphery. The larger cone cells detect color, while the smaller rod cells improve low-light vision.

The human retina has a beautiful solution to sampling in its placement of photoreceptor cells. The cells cover the retina densely and evenly (with the exception of the blind spot over the optic nerve), and yet the cells’ relative positions are irregular. This is called a Poisson-disc distribution because it maintains a minimum distance between cells, avoiding occlusion and thus wasted photoreceptors.

Unfortunately, creating a Poisson-disc distribution is hard. (More on that in a bit.) So here’s a simple approximation known as Mitchell’s best-candidate algorithm.

Best-candidate

You can see from these dots that best-candidate sampling produces a pleasing random distribution. It’s not without flaws: there are too many samples in some areas (oversampling), and not enough in other areas (undersampling). But it’s reasonably good, and just as important, easy to implement.

Here’s how it works:

Best-candidate

For each new sample, the best-candidate algorithm generates a fixed number of candidates, shown in gray. (Here, that number is 10.) Each candidate is chosen uniformly from the sampling area.

The best candidate, shown in red, is the one that is farthest away from all previous samples, shown in black. The distance from each candidate to the closest sample is shown by the associated line and circle: notice that there are no other samples inside the gray or red circles. After all candidates are created and distances measured, the best candidate becomes the new sample, and the remaining candidates are discarded.

Now here’s the code:

function sample() {
  var bestCandidate, bestDistance = 0;
  for (var i = 0; i < numCandidates; ++i) {
    var c = [Math.random() * width, Math.random() * height],
        d = distance(findClosest(samples, c), c);
    if (d > bestDistance) {
      bestDistance = d;
      bestCandidate = c;
    }
  }
  return bestCandidate;
}

As I explained the algorithm above, I will let the code stand on its own. (And the purpose of this essay is to let you study code through visualization, besides.) But I will clarify a few details:

The external numCandidates defines the number of candidates to create per sample. This parameter lets you trade-off speed with quality. The lower the number of candidates, the faster it runs. Conversely, the higher the number of candidates, the better the sampling quality.

The distance function is simple geometry:

function distance(a, b) {
  var dx = a[0] - b[0],
      dy = a[1] - b[1];
  return Math.sqrt(dx * dx + dy * dy);
}

You can omit the sqrt here, if you want, since it’s a monotonic function and doesn’t change the determination of the best candidate.

The findClosest function returns the closest sample to the current candidate. This can be done by brute force, iterating over every existing sample. Or you can accelerate the search, say by using a quadtree. Brute force is simple to implement but very slow (quadratic time, in O-notation). The accelerated approach is much faster, but more work to implement.

Speaking of trade-offs: when deciding whether to use an algorithm, we evaluate it not in a vacuum but against other approaches. And as a practical matter it is useful to weigh the complexity of implementation — how long it takes to implement, how difficult it is to maintain — against its performance and quality.

The simplest alternative is uniform random sampling:

function sample() {
  return [random() * width, random() * height];
}

It looks like this:

Uniform random

Uniform random is pretty terrible. There is both severe under- and oversampling: many samples are densely-packed, even overlapping, leading to large empty areas. (Uniform random sampling also represents the lower bound of quality for the best-candidate algorithm, as when the number of candidates per sample is set to one.)

Dots patterns are one way of showing sample pattern quality, but not the only way. For example, we can attempt to simulate vision under different sampling strategies by coloring an image according to the color of the closest sample. This is, in effect, a Voronoi diagram of the samples where each cell is colored by the associated sample.

What does The Starry Night look like through 6,667 uniform random samples?

Uniform random

Hold down the mouse to compare to the original.

The lackluster quality of this approach is again apparent. The cells vary widely in size, as expected from the uneven sample distribution. Detail has been lost because densely-packed samples (small cells) are underutilized. Meanwhile, sparse samples (large cells) introduce noise by exaggerating rare colors, such as the pink star in the bottom-left.

Now observe best-candidate sampling:

Best-candidate

Hold down the mouse to compare to the original.

Much better! Cells are more consistently sized, though still randomly placed. Despite the quantity of samples (6,667) remaining constant, there is substantially more detail and less noise thanks to their even distribution. If you squint, you can almost make out the original brush strokes.

We can use Voronoi diagrams to study sample distributions more directly by coloring each cell according to its area. Darker cells are larger, indicating sparse sampling; lighter cells are smaller, indicating dense sampling. The optimal pattern has nearly-uniform color while retaining irregular sample positions. (A histogram showing cell area distribution would also be nice, but the Voronoi has the advantage that it shows sample position simultaneously.)

Here are the same 6,667 uniform random samples:

Uniform random

The black spots — large gaps between samples — would be localized deficiencies in vision due to undersampling. The same number of best-candidate samples exhibits much less variation in cell area, and thus more consistent coloration:

Best-candidate

Can we do better than best-candidate? Yes! Not only can we produce a better sample distribution with a different algorithm, but this algorithm is faster (linear time). It’s at least as easy to implement as best-candidate. And this algorithm even scales to arbitrary dimensions.

This wonder is called Bridson’s algorithm for Poisson-disc sampling, and it looks like this:

Poisson-disc

This algorithm functions visibly differently than the other two: it builds incrementally from existing samples, rather than scattering new samples randomly throughout the sample area. This gives its progression a quasi-biological appearance, like cells dividing in a petri dish. Notice, too, that no samples are too close to each other; this is the minimum-distance constraint that defines a Poisson-disc distribution, enforced by the algorithm.

Here’s how it works:

Poisson-disc

Red dots represent “active” samples. At each iteration, one is selected randomly from the set of all active samples. Then, some number of candidate samples (shown as hollow black dots) are randomly generated within an annulus surrounding the selected sample. The annulus extends from radius r to 2r, where r is the minimum-allowable distance between samples.

Candidate samples within distance r from an existing sample are rejected; this “exclusion zone” is shown in gray, along with a black line connecting the rejected candidate to the nearby existing sample. A grid accelerates the distance check for each candidate. The grid size r/√2 ensures each cell can contain at most one sample, and only a fixed number of neighboring cells need to be checked.

If a candidate is acceptable, it is added as a new sample, and a new active sample is randomly selected. If none of the candidates are acceptable, the selected active sample is marked as inactive (changing from red to black). When no samples remain active, the algorithm terminates.

The area-as-color Voronoi diagram shows Poisson-disc sampling’s improvement over best-candidate, with no dark-blue or light-yellow cells:

Poisson-disc

The Starry Night under Poisson-disc sampling retains the greatest amount of detail and the least noise. It is reminscent of a beautiful Roman mosaic:

Poisson-disc

Hold down the mouse to compare to the original.

Now that you’ve seen a few examples, let’s briefly consider why to visualize algorithms.

Entertaining - I find watching algorithms endlessly fascinating, even mesmerizing. Particularly so when randomness is involved. And while this may seem a weak justification, don’t underestimate the value of joy! Further, while these visualizations can be engaging even without understanding the underlying algorithm, grasping the importance of the algorithm can give a deeper appreciation.

Teaching - Did you find the code or the animation more helpful? What about pseudocode— that euphemism for code that won’t compile? While formal description has its place in unambiguous documentation, visualization can make intuitive understanding more accessible.

Debugging - Have you ever implemented an algorithm based on formal description? It can be hard! Being able to see what your code is doing can boost productivity. Visualization does not supplant the need for tests, but tests are useful primarily for detecting failure and not explaining it. Visualization can also discover unexpected behavior in your implementation, even when the output looks correct. (See Bret Victor’s Learnable Programming and Inventing on Principle for excellent related work.)

Learning - Even if you just want to learn for yourself, visualization can be a great way to gain deep understanding. Teaching is one of the most effective ways of learning, and implementing a visualization is like teaching yourself. I find it easier to remember an algorithm intuitively, having seen it, than to memorize code where I am bound to forget small but essential details.

#Shuffling

Shuffling is the process of rearranging an array of elements randomly. For example, you might shuffle a deck of cards before dealing a poker game. A good shuffling algorithm is unbiased, where every ordering is equally likely.

The Fisher–Yates shuffle is an optimal shuffling algorithm. Not only is it unbiased, but it runs in linear time, uses constant space, and is easy to implement.

function shuffle(array) {
  var n = array.length, t, i;
  while (n) {
    i = Math.random() * n-- | 0; // 0 ≤ i < n
    t = array[n];
    array[n] = array[i];
    array[i] = t;
  }
  return array;
}

Above is the code, and below is a visual explanation:

For a more detailed explanation of this algorithm, see my post on the Fisher–Yates shuffle.

Each line represents a number. Small numbers lean left and large numbers lean right. (Note that you can shuffle an array of anything — not just numbers — but this visual encoding is useful for showing the order of elements. It is inspired by Robert Sedgwick’s sorting visualizations in Algorithms in C.)

The algorithm splits the array into two parts: the right side of the array (in black) is the shuffled section, while the left side of the array (in gray) contains elements remaining to be shuffled. At each step it picks a random element from the left and moves it to the right, thereby expanding the shuffled section by one. The original order on the left does not need to be preserved, so to make room for the new element in the shuffled section, the algorithm can simply swap the element into place. Eventually all elements are shuffled, and the algorithm terminates.

If Fisher–Yates is a good algorithm, what does a bad algorithm look like? Here’s one:

// DON’T DO THIS!
function shuffle(array) {
  return array.sort(function(a, b) {
    return Math.random() - .5; // ಠ_ಠ
  });
}

This approach uses sorting to shuffle by specifying a random comparator function. A comparator defines the order of elements. It takes arguments a and b— two elements from the array to compare — and returns a value less than zero if a is less than b, a value greater than zero if a is greater than b, or zero if a and b are equal. The comparator is invoked repeatedly during sorting. If you don’t specify a comparator to array.sort, elements are ordered lexicographically.

Here the comparator returns a random number between -.5 and +.5. The assumption is that this defines a random order, so sorting will jumble the elements randomly and perform a good shuffle.

Unfortunately, this assumption is flawed. A random pairwise order (for any two elements) does not establish a random order for a set of elements. A comparator must obey transitivity: if a> b and b> c, then a> c. But the random comparator returns a random value, violating transitivity and causing the behavior of array.sort to be undefined! You might get lucky, or you might not.

How bad is it? We can try to answer this question by visualizing the output:

Another reason this algorithm is bad is that sorting takes O(n lg n) time, making it significantly slower than Fisher–Yates which takes O(n). But speed is less damning than bias.

This may look random, so you might be tempted to conclude that random comparator shuffle is adequate, and dismiss concerns of bias as pedantic. But looks can be misleading! There are many things that appear random to the human eye but are substantially non-random.

This deception demonstrates that visualization is not a magic wand. Showing a single run of the algorithm does not effectively assess the quality of its randomness. We must instead carefully design a visualization that addresses the specific question at hand: what is the algorithm’s bias?

To show bias, we must first define it. One definition is based on the probability that an array element at index i prior to shuffling will be at index j after shuffling. If the algorithm is unbiased, every element has equal probability of ending up at every index, and thus the probability for all i and j is the same: 1/n, where n is the number of elements.

Computing these probabilities analytically is difficult, since it depends on knowing the exact sorting algorithm used. But computing them empirically is easy: we simply shuffle thousands of times and count the number of occurrences of element i at index j. An effective display for this matrix of probabilities is a matrix diagram:

SHUFFLE BIAS
column = index before shuffle
row = index after shuffle
green = positive bias
red = negative bias

The column (horizontal position) of the matrix represents the index of the element prior to shuffling, while the row (vertical position) represents the index of the element after shuffling. Color encodes probability: green cells indicate positive bias, where the element occurs more frequently than we would expect for an unbiased algorithm; likewise red cells indicate negative bias, where it occurs less frequently than expected.

Random comparator shuffle in Chrome, shown above, is surprisingly mediocre. Parts of the array are only weakly biased. However, it exhibits a strong positive bias below the diagonal, which indicates a tendency to push elements from index i to i+1 or i+2. There is also strange behavior for the first, middle and last row, which might be a consequence of Chrome using median-of-three quicksort.

The unbiased Fisher–Yates algorithm looks like this:

No patterns are visible in this matrix, other than a small amount of noise due to empirical measurement. (That noise could be reduced if desired by taking additional measurements.)

The behavior of random comparator shuffle is heavily dependent on your browser. Different browsers use different sorting algorithms, and different sorting algorithms behave very differently with (broken) random comparators. Here’s random comparator shuffle on Firefox:

For an interactive version of these matrix diagrams to test alternative shuffling strategies, see Will It Shuffle?

This is egregiously biased! The resulting array is often barely shuffled, as shown by the strong green diagonal in this matrix. This does not mean that Chrome’s sort is somehow “better” than Firefox’s; it simply means you should never use random comparator shuffle. Random comparators are fundamentally broken.

#Sorting

Sorting is the inverse of shuffling: it creates order from disorder, rather than vice versa. This makes sorting a harder problem with diverse solutions designed for different trade-offs and constraints.

One of the most well-known sorting algorithms is quicksort.

Quicksort

Quicksort first partitions the array into two parts by picking a pivot. The left part contains all elements less than the pivot, while the right part contains all elements greater than the pivot. After the array is partitioned, quicksort recurses into the left and right parts. When a part contains only a single element, recursion stops.

The partition operation makes a single pass over the active part of the array. Similar to how the Fisher–Yates shuffle incrementally builds the shuffled section by swapping elements, the partition operation builds the lesser (left) and greater (right) parts of the subarray incrementally. As each element is visited, if it is less than the pivot it is swapped into the lesser part; if it is greater than the pivot the partition operation moves on to the next element.

Here’s the code:

function quicksort(array, left, right) {
  if (left < right - 1) {
    var pivot = left + right >> 1;
    pivot = partition(array, left, right, pivot);
    quicksort(array, left, pivot);
    quicksort(array, pivot + 1, right);
  }
}

function partition(array, left, right, pivot) {
  var pivotValue = array[pivot];
  swap(array, pivot, --right);
  for (var i = left; i < right; ++i) {
    if (array[i] < pivotValue) {
      swap(array, i, left++);
    }
  }
  swap(array, left, right);
  return left;
}

There are many variations of quicksort. The one shown above is one of the simplest — and slowest. This variation is useful for teaching, but in practice more elaborate implementations are used for better performance.

A common improvement is “median-of-three” pivot selection, where the median of the first, middle and last elements is used as the pivot. This tends to choose a pivot closer to the true median, resulting in similarly-sized left and right parts and shallower recursion. Another optimization is switching from quicksort to insertion sort for small parts of the array, which can be faster due to the overhead of function calls. A particularly clever variation is Yaroslavskiy’s dual-pivot quicksort, which partitions the array into three parts rather than two. This is the default sorting algorithm in Java and Dart.

The sort and shuffle animations above have the nice property that time is mapped to time: we can simply watch how the algorithm proceeds. But while intuitive, animation can be frustrating to watch, especially if we want to focus on an occasional weirdness in the algorithm’s behavior. Animations also rely heavily on our memory to observe patterns in behavior. While animations are improved by controls to pause and scrub time, static displays that show everything at once can be even more effective. The eye scans faster than the hand.

A simple way of turning an animation into a static display is to pick key frames from the animation and display those sequentially, like a comic strip. If we then remove redundant information across key frames, we use space more efficiently. A more denser display may require more study to understand, but is faster to scan since the eye travels less.

Below, each row shows the state of the array prior to recursion. The first row is the initial state of the array, the second row is the array after the first partition operation, the third row is after the first partition’s left and right parts are again partitioned, etc. In effect, this is breadth-first quicksort, where the partition operation on both left and right proceeds in parallel.

Quicksort

As before, the pivots for each partition operation are highlighted in red. Notice that the pivots turn gray at the next level of recursion: after the partition operation completes, the associated pivot is in its final, sorted position. The total depth of the display — the maximum depth of recursion — gives a sense of how efficiently quicksort performed. It depends heavily on input and pivot choice.

Another static display of quicksort, less dense but perhaps easier to read, represents each element as a colored thread and shows each sequential swap. (This form is inspired by Aldo Cortesi’s sorting visualizations.) Smaller values are lighter, and larger values are darker.

At the start of each partition, the pivot is moved to the end (the right) of the active subarray.

Partitioning then proceeds from left to right. At each step, a new element is added either of the set of lesser values (in which case a swap occurs) or to the set of greater values (in which case no swap occurs).

When a swap occurs, the left-most value greater than the pivot is moved to the right, so as to make room on the left for the new lesser value. Thus, notice that in all swap operations, only values darker than the pivot move right, and only values lighter than the pivot move left. When the partition operation has visited all elements in the array, the pivot is placed in its final position between the two parts. Then, the algorithm recurses into the left part, followed by the right part (far below). This visualization doesn’t show the state of the stack, so it can appear to jump around arbitrarily due to the nature of recursion. Still, you can typically see when a partition operation finishes due to the characteristic movement of the pivot to the end of the active subarray. Quicksort

You’ve now seen three different visual representations of the same algorithm: an animation, a dense static display, and a sparse static display. Each form has strengths and weaknesses. Animations are fun to watch, but static visualizations allow close inspection without being rushed. Sparse displays may likely easier to understand, but dense displays show the “macro” view of the algorithm’s behavior in addition to its details.

Before we move on, let’s contrast quicksort with another well-known sorting algorithm: mergesort.

function mergesort(array) {
  var n = array.length, a0 = array, a1 = new Array(n);
  for (var m = 1; m < n; m <<= 1) {
    for (var i = 0; i < n; i += m << 1) {
      var left = i,
          right = Math.min(i + m, n),
          end = Math.min(i + (m << 1), n);
      merge(a0, a1, left, right, end);
    }
    array = a0, a0 = a1, a1 = array;
  }
}

function merge(a0, a1, left, right, end) {
  for (var i0 = left, i1 = right; left < end; ++left) {
    if (i0 < right && (i1 >= end || a0[i0] <= a0[i1])) {
      a1[left] = a0[i0++];
    } else {
      a1[left] = a0[i1++];
    }
  }
}

Again, above is the code and below is an animation:

Mergesort

As you’ve likely surmised from either the code or the animation, mergesort takes a very different approach to sorting than quicksort. Unlike quicksort, which operates in-place by performing swaps, mergesort requires an extra copy of the array. This extra space is used to merge sorted subarrays, combining the elements from pairs of subarrays while preserving order. Since mergesort performs copies instead of swaps, we must modify the animation accordingly (or risk misleading readers).

Mergesort works from the bottom-up. Initially, it merges subarrays of size one, since these are trivially sorted. Each adjacent subarray — at first, just a pair of elements — is merged into a sorted subarray of size two using the extra array. Then, each adjacent sorted subarray of size two is merged into a sorted subarray of size four. After each pass over the whole array, mergesort doubles the size of the sorted subarrays: eight, sixteen, and so on. Eventually, this doubling merges the entire array and the algorithm terminates.

Because mergesort performs repeated passes over the array rather than recursing like quicksort, and because each pass doubles the size of sorted subarrays regardless of input, it is easier to design a static display. We simply show the state of the array after each pass.

Mergesort

Let’s again take a moment to consider what we’ve seen. The goal here is to study the behavior of an algorithm rather than a specific dataset. Yet there is still data, necessarily — the data is derived from the execution of the algorithm. And this means we can use the type of derived data to classify algorithm visualizations.

Level 0 / black box - The simplest class just shows the output. This does not explain the algorithm’s operation, but it can still verify correctness. And by treating the algorithm as a black box, you can more easily compare outputs of different algorithms. Black box visualizations can also be combined with deeper analysis of output, such as the shuffle bias matrix diagram shown above.

Level 1 / gray box - Many algorithms (though not all) build up output incrementally. By visualizing the intermediate output as it develops, we start to see how the algorithm works. This explains more without introducing new abstraction, since the intermediate and final output share the same structure. Yet this type of visualization can raise more questions than it answers, since it offers no explanation as to why the algorithm does what it does.

Level 2 / white box - To answer “why” questions, white box visualizations expose the internal state of the algorithm in addition to its intermediate output. This type has the greatest potential to explain, but also the highest burden on the reader, as the meaning and purpose of internal state must be clearly described. There is a risk that the additional complexity will overwhelm the reader; layering information may make the graphic more accessible. Lastly, since internal state is highly-dependent on the specific algorithm, this type of visualization is often unsuitable for comparing algorithms.

There’s also the practical matter of implementating algorithm visualizations. Typically you can’t just run code as-is; you must instrument it to capture state for visualization. (View source on this page for examples.) You may even need to interleave execution with visualization, which is particularly challenging for recursive algorithms that capture state on the stack. Language parsers such as Esprima may facilitate algorithm visualization through code instrumentation, cleanly separating execution code from visualization code.

#Maze Generation

The last problem we’ll look at is maze generation. All algorithms in this section generate a spanning tree of a two-dimensional rectangular grid. This means there are no loops and there is a unique path from the root in the bottom-left corner to every other cell in the maze.

I apologize for the esoteric subject — I don’t know enough to say why these algorithms are useful beyond simple games, and possibly something about electrical networks. But even so, they are fascinating from a visualization perspective because they solve the same, highly-constrained problem in wildly-different ways.

And they’re just fun to watch.

Random traversal

The random traversal algorithm initializes the first cell of the maze in the bottom-left corner. The algorithm then tracks all possible ways by which the maze could be extended (shown in red). At each step, one of these possible extensions is picked randomly, and the maze is extended as long as this does not reconnect it with another part of the maze.

Like Bridon’s Poisson-disc sampling algorithm, random traversal maintains a frontier and randomly selects from that frontier to expand. Both algorithms thus appear to grow organically, like a fungus.

Randomized depth-first traversal follows a very different pattern:

Randomized depth-first traversal

Rather than picking a new random passage each time, this algorithm always extends the deepest passage — the one with the longest path back to the root — in a random direct. Thus, randomized depth-first traversal only branches when the current path dead-ends into an earlier part of the maze. To continue, it backtracks until it can start a new branch. This snake-like exploration leads to mazes with significantly fewer branches and much longer, winding passages.

Prim’s algorithm constructs a minimum spanning tree, a spanning tree of a graph with weighted edges with the lowest total weight. This algorithm can be used to construct a random spanning tree by initializing edge weights randomly:

Randomized Prim’s

At each step, Prim’s algorithm extends the maze using the lowest-weighted edge (potential direction) connected to the existing maze. If this edge would form a loop, it is discarded and the next-lowest-weighted edge is considered.

Prim’s algorithm is commonly implemented using a heap, which is an efficient data structure for prioritizing elements. When a new cell is added to the maze, connected edges (shown in red) are added to the heap. Despite edges being added in arbitrary order, the heap allows the lowest-weighted edge to be quickly removed.

Lastly, a most unusual specimen:

Wilson’s

Wilson’s algorithm uses loop-erased random walks to generate a uniform spanning tree — an unbiased sample of all possible spanning trees. The other maze generation algorithms we have seen lack this beautiful mathematical property.

The algorithm initializes the maze with an arbitrary starting cell. Then, a new cell is added to the maze, initiating a random walk (shown in red). The random walk continues until it reconnects with the existing maze (shown in white). However, if the random walk intersects itself, the resulting loop is erased before the random walk continues.

Initially, the algorithm can be frustratingly slow to watch, as early random walks are unlikely to reconnect with the small existing maze. As the maze grows, random walks become more likely to collide with the maze and the algorithm accelerates dramatically.

These four maze generation algorithms work very differently. And yet, when the animations end, the resulting mazes are difficult to distinguish from each other. The animations are useful for showing how the algorithm works, but fail to reveal the resulting tree structure.

A way to show structure, rather than process, is to flood the maze with color:

Random traversal

Color encodes tree depth — the length of the path back to the root in the bottom-left corner. The color scale cycles as you get deeper into the tree; this is occasionally misleading when a deep path circles back adjacent to a shallow one, but the higher contrast allows better differentiation of local structure. (This is not a convential rainbow color scale, which is nominally considered harmful, but a cubehelix rainbow with improved perceptual properties.)

We can further emphasize the structure of the maze by subtracting the walls, reducing visual noise. Below, each pixel represents a path through the maze. As above, paths are colored by depth and color floods deeper into the maze over time.

Random traversal

Concentric circles of color, like a tie-dye shirt, reveal that random traversal produces many branching paths. Yet the shape of each path is not particularly interesting, as it tends to go in a straight line back to the root. Because random traversal extends the maze by picking randomly from the frontier, paths are never given much freedom to meander — they end up colliding with the growing frontier and terminate due to the restriction on loops.

Randomized depth-first traversal, on the other hand, is all about the meander:

Randomized depth-first traversal

This animation proceeds at fifty times the speed of the previous one. This speed-up is necessary because randomized depth-first traversal mazes are much, much deeper than random traversal mazes due to limited branching. You can see that typically there is only one, and rarely more than a few, active branches at any particular depth.

Now Prim’s algorithm on a random graph:

Randomized Prim’s

This is more interesting! The simultaneously-expanding florets of color reveal substantial branching, and there is more complex global structure than random traversal.

Wilson’s algorithm, despite operating very differently, seems to produce very similar results:

Wilson’s

Just because they look the same does not mean they are. Despite appearances, Prim’s algorithm on a randomly-weighted graph does not produce a uniform spanning tree (as far as I know — proving this is outside my area of expertise). Visualization can sometimes mislead due to human error. An earlier version of the Prim’s color flood had a bug where the color scale rotated twice as fast as intended; this suggested that Prim’s and Wilson’s algorithms produced very different trees, when in fact they appear much more similar than different.

Since these mazes are spanning trees, we can also use specialized tree visualizations to show structure. To illustrate the duality between maze and tree, here the passages (shown in white) of a maze generated by Wilson’s algorithm are gradually transformed into a tidy tree layout. As with the other animations, it proceeds by depth, starting with the root and descending to the leaves:

Wilson’s

For comparison, again we see how randomized depth-first traversal produces trees with long passages and little branching.

Randomized depth-first traversal

Both trees have the same number of nodes (3,239) and are scaled to fit in the same area (960×500 pixels). This hides an important difference: at this size, randomized depth-first traversal typically produces a tree two-to-five times deeper than Wilson’s algorithm. The tree depths above are _ and _, respectively. In the larger 480,000-node mazes used for color flooding, randomized depth-first traversal produces a tree that is 10-20 times deeper!

#Using Vision to Think

This essay has focused on algorithms. Yet the techniques discussed here apply to a broader space of problems: mathematical formulas, dynamical systems, processes, etc. Basically, anywhere there is code that needs understanding.

Shan Carter, Archie Tse and I recently built a new rent vs. buy calculator; powering the calculator is a couple hundred lines of code to compute the total cost of renting or buying a home. It’s a simplistic model, but more complicated than fits in your head. The calculator takes about twenty input parameters (such as purchase price and mortgage rate) and considers opportunity costs on investments, inflation, marginal tax rates, and a variety of other factors.

The goal of the calculator is to help you decide whether you should buy or rent a home. If the total cost of buying is cheaper, you should buy. Otherwise, you should rent.

Except, it’s not that simple.

To output an accurate answer, the calculator needs accurate inputs. While some inputs are well-known (such as the length of your mortgage), others are difficult or impossible to predict. No one can say exactly how the stock market will perform, how much a specific home will appreciate or depreciate, or how the renting market will change over time.
Is It Better to Buy or Rent?

We can make educated guesses at each variable — for example, looking at Case–Shiller data. But if the calculator is a black box, then readers can’t see how sensitive their answer is to small changes.

To fix this, we need to do more than output a single number. We need to show how the underlying system works. The new calculator therefore charts every variable and lets you quickly explore any variable’s effect by adjusting the associated slider.

The slope of the chart shows the associated variable’s importance: the greater the slope, the more the decision depends on that variable. Since variables interact with each other, changing a variable may change the slope of other charts.

This design lets you inspect many aspects of the system. For example, should you make a large down payment? Yes, if the down payment rate slopes down; or no, if the down payment rate slopes up, as with a higher investment return rate. This suggests that the optimal loan size depends on the difference between the opportunity cost on the down payment (money not invested) and the interest cost on the mortgage.

So, why visualize algorithms? Why visualize anything? To leverage the human visual system to improve understanding. Or more simply, to use vision to think.

#Related Work

I mentioned Aldo Cortesi’s sorting visualizations earlier. (I also like Cortesi’s visualizations of malware entropy.) Others abound, including: sorting.at, sorting-algorithms.com, and Aaron Dufour’s Sorting Visualizer, which lets you plug in your own algorithm. YouTube user andrut’s audibilizations are interesting. Robert Sedgwick has published several new editions of Algorithms since I took his class, and his latest uses traditional bars rather than angled lines.

Amit Patel explores “visual and interactive ways of explaining math and computer algorithms.” The articles on 2D visibility, polygonal map generation and pathfinding are particularly great. Nicky Case published another lovely explanation of 2D visibility and shadow effects. I am heavily-indebted to Jamis Buck for his curation of maze generation algorithms. Christopher Wellons’ GPU-based path finding implementation uses cellular automata— another fascinatingsubject. David Mimno gave a talk on visualization for models and algorithms at OpenVis 2014 that was an inspiration for this work. And like many, I have long been inspired by Bret Victor, especially Inventing on Principle and Up and Down the Ladder of Abstraction.

Jason Davies has made numerous illustrations of mathematical concepts and algorithms. Some of my favorites are: Lloyd’s Relaxation, Coalescing Soap Bubbles, Biham-Middleton-Levine Traffic Model, Collatz Graph, Random Points on a Sphere, Bloom Filters, Animated Bézier Curves, Animated Trigonometry, Proof of Pythagoras’ Theorem, and Morley’s Trisector Theorem. Pierre Guilleminot’s Fourier series explanation is great, as are Lucas V. Barbosa’s Fourier transform time and frequency domains and an explanation of Simpson’s paradox by Lewis Lehe & Victor Powell; also see Powell’s animations of the central limit theorem and conditional probabilities. Steven Wittens makes mind-expanding visualizations of mathematical concepts in three dimensions, such as Julia fractals.

In my own work, I’ve used visualization to explain topology inference (including a visual debugger), D3’s selections and the Fisher–Yates shuffle. There are more standalone visualizations on my bl.ocks. If you have suggestions for interesting visualizations, or any other feedback, please contact me on Twitter.

Thank you for reading! June 26, 2014

Python-based Project Euler command line tool

$
0
0
README.rst

EulerPy is a command line tool designed to streamline the process of solving Project Euler problems using Python. The package focuses on two main tasks: firstly, to create Python "template" files with a docstring containing the text of a Project Euler problem for ease-of-reference, and secondly, to check whether a problem has been solved correctly.

Installation

EulerPy can be installed (and updated) from PyPI using pip:

$ pip install --upgrade EulerPy

Conversely, it can be uninstalled using pip as well.

Usage

First, you'll want to cd to the directory where your Project Euler files are being stored.

$ mkdir ~/project-euler
$ cd ~/project-euler

At this point, you'll probably want to run the euler command, which will prompt to create 001.py, a file containing the text to Project Euler problem #1 as its docstring.

$ euler
No Project Euler files found in the current directory.
Generate file for problem #1? [Y/n]: Y
Successfully created "001.py".

$ cat 001.py
"""Project Euler Problem #1=========================If we list all the natural numbers below 10 that are multiples of 3 or 5,we get 3, 5, 6 and 9. The sum of these multiples is 23.Find the sum of all the multiples of 3 or 5 below 1000."""

At this point, you can open up your editor of choice and code up a solution to the problem, making sure to print() the output. Once you feel that you've solved the problem, run the euler command again to verify your solution is correct. If the answer is correct, the solution will be printed in green and the script will ask to generate the next problem file. If incorrect, the solution will be printed in red instead.

$ euler
Checking "001.py" against solution: [no output]# (output in red)$ echo print 42>> 001.py
$ euler
Checking "001.py" against solution: 42# (output in green)
Generate file for problem #2? [Y/n]: Y
Successfully created "002.py".

EulerPy also comes with five options that act as commands. (The --help option can be used to display a summary of all of the options.)

--cheat / -c

The --cheat option will print the solution of a problem after prompting the user to ensure that they want to see it. If no problem argument is given, it will print the answer to the problem that they are currently working on.

$ euler --cheat
View solution to problem #2? [y/N]: Y
The solution to problem #2 is <redacted>.$ euler --cheat 100
View solution to problem #100? [y/N]: Y
The solution to problem #100 is <redacted>.

--generate / -g

The --generate option will create a Python file for the given problem number. If no problem number is given, it will overwrite the most recent problem with a file containing only the problem docstring (after prompting the user).

$ euler --generate
Generate file for problem #2? [Y/n]: Y"002.py" already exists. Overwrite? [y/N]:
Successfully created "002.py".

$ euler --generate 5
Generate file for problem #5? [Y/n]: n
Aborted!

euler <problem> is equivalent to euler --generate <problem> if the file does not exist.

$ cat 005.py
cat: 005.py: No such file or directory

$ euler 5
Generate file for problem #5? [Y/n]: n
Aborted!

--preview / -p

The --preview option will print the text of a given problem to the terminal; if no problem number is given, it will print the current problem instead.

$ euler --preview
Project Euler Problem #2
Each new term in the Fibonacci sequence is generated by adding the
previous two terms. By starting with 1 and 2, the first 10 terms will be:

                  1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

Find the sum of all the even-valued terms in the sequence which do not
exceed four million.

$ euler --preview 3
Project Euler Problem #3
The prime factors of 13195 are 5, 7, 13 and 29.

What is the largest prime factor of the number 600851475143?

--skip / -s

The --skip option will prompt the user to "skip" to the next problem.

$ euler --skip
Current problem is problem #2.
Generate file for problem #3? [y/N]: Y
Successfully created "003.py".

--verify / -v

The --verify option will check whether a given problem file outputs the correct solution to the problem. If no problem number is given, it will check the current problem.

$ euler --verify
Checking "003.py" against solution: [no output]# (output in red)$ euler --verify 1
Checking "001.py" against solution: <redacted> # (output in green)

euler <problem> is equivalent to euler --verify <problem> if the file does exist.

$ cat 001.py
"""Project Euler Problem #1=========================..."""$ euler 1
Checking "001.py" against solution: <redacted>

Contributing

See CONTRIBUTING.rst.

Miscellaneous

The text for problems 1 through 202 were derived from Kyle Keen's Local Euler project, and the solutions found in solutions.txt were derived from the projecteuler-solutions wiki.

See this blog post for insight into the development process.

License

EulerPy is licensed under the MIT License.

Top designers react to Google’s new ‘Material’ design language

$
0
0

Two days ago, Google revealed its next generation “Material” design language—  a departure from past guidelines and a clear reaction to design trends made popular by Apple and Microsoft.

To fully digest the impact Material will have on the future of digital design, VentureBeat asked several designers to share their first impressions. Shift your eyes below for insight from top creators at firms like IDEO, R/GA, Obvious Corp., and more.

This isn’t just an extension of flat design

Marc Edwards, director and lead designer at Bjango: I love the animation and use of depth. Giving designers exact layering hierarchy and shadow sizes is great. Material seems very cohesive and thoughtful. It’s a small thing, but I like how Google has evolved the Android status bar, and how they’re using it as a dragable window title bar on desktops.


We’ll be exploring the importance of mobile design, and how it impacts your mobile business, at MobileBeat 2014 in San Francisco on July 8-9.

Grab your tickets now!


Many will see Material as a further extension into a flat era of design, in the same way Windows 8 and iOS 7 use large areas of solid color and wide open spaces with a focus on typography. I think it’s more than that – the current design trends are the only sane way to support a wide range of display sizes, ratios, and pixel densities. Physics, animation, and some of the layering effects are only now possible because the hardware allows it to be.

While Material, iOS 7, and Windows may all seem superficially similar, I think their similarities exist for deeper, technical reasons. It’s a shame Android L won’t be adopted as fast as iOS updates are.

Material design is a big part of the L-Release of Android

Above: Material design is a big part of the L-Release of Android

A post-rationalization of current design trends

Kristy Tillman, designer at IDEO: You can tell Google is trying to get ahead of all of the screen sizes they have going now and provide some real structure. It seems they really tried to set up a fail proof way to design around all of the screen sizes, from the desktop experience to Glass to the watch. The effort is extremely expressive and is obviously about controlling the experience. Experience as brand. This is something Apple has always been better at. Google has put in a real effort to achieve something similar on a much more open platform, which is an ambitious but very necessary goal.

Visually it looks good. This is the first time I’ve seriously considered ditching iOS. Everything seems really considered. With that said, reading the guidelines, it seems that it’s a post rationalization of a lot of current design trends (i.e.: the tiles). Which isn’t a bad thing. I initially thought about Windows’ Metro design upon seeing the new UI, but it looks like they have added their own spin on it.

All in all, I see this a great effort forward in laying the groundwork for a very Google-driven future ecosystem.

google-material6

Google has really stepped up its design game

Sacha Greif, creator of Folyo, Telescope, and Sidebar: For the past year or so, Google has really stepped up its design game, and it shows. Where Apple often takes their aesthetic decisions to questionable extremes (as we’ve seen with skeuomorphism first, and flat design more recently), Google generally adopts a subtler, more nuanced approach.

So instead of trying to impose a strict visual aesthetic, Google defined a set of principles that leave more freedom to individual designers, while still pushing their numerous apps in the same consistent direction.

And while flat design was all about taking things away (gradients, shadows, highlights, etc.), this new design philosophy seems based on adding movement, animations, and colors.

Maybe this is Google’s way of filling the void left by the demise of richly textured skeuomorphic designs? In any case, we can only hope it will add a little warmth and humanity to digital design and save us from a world where every app looks and behaves the same.

google-material5

This is about developers

Irene Au, operating partner at Khosla Ventures, former design head at Google: I was really pleased to see the attention paid to design at the Google I/O conference this week. All the efforts featured on the Google Design website are about scaling great design and bringing it to everyone.

They’re teaching developers better design processes and practices and equipping them with design guidelines, principles, and visual language to make it easier for developers to do the right thing. I’m so proud of the team!

google-material4

The magic shines through in animations and transitions

Renato Valdés, cofounder of Human: I think Material design is another great step for Google, proving design is becoming more and more important in their culture. While overall I think it can still use some refinement, the magic shines through in animations and transitions.

Their guidelines are some of the best around, I must say. And I’m hoping we can quickly adopt Material Design in our Sketch/Framer.js workflow.

google-material3

Not a massive departure from Google’s current design language

Grace LaRosa, senior experience designer at R/GA: My initial reaction is positive, without a doubt. Despite looking great, however, Material doesn’t strike me as something that seems like such a massive departure from Google’s current design language. It’s clean, focused, minimal; all things we’ve come to expect as makers and users today.

What’s newest and most of note, in my opinion, is how well documented and systematic the language is. After a long era of designers and developers creating Android experiences that often feel renegade or pieced together, Google have undoubtedly stepped up their efforts to standardize and improve the UI and UX across their app ecosystem. If it’s adopted, it’ll certainly lend a much-needed consistency to that world.

The emphasis on motion and nailing microinteractions is an intensely refreshing component. The flexibility across devices is also key. And, despite all the z-axis pizzaz, it’s not flat. Material feels in line with the current trends in interfaces and experiences we see today in iOS and Windows. Some elements, like containers, feel almost like a direct copy of Windows UI, to be completely honest.

Overall? I like it, I’m glad it’s here, but I don’t find myself bowled over by any of the components of the new system. It’s a well-considered stride in a necessary direction.

google-material2

Material addresses design problems that designers deal with everyday

Tina Chen, designer at Obvious Corp., former senior UX designer at Google: My first impression is that Google has created a modern system that addresses many design problems that designers deal with every day. In particular, animation and touch gestures are an area app design is increasingly focused on, but there’s no consensus yet on which patterns feel the most natural. Animation as radial action and ripples is a promising concept that I haven’t seen used as a system before. The new version of Roboto is lovely, and more versatile, too.

It’s wonderful seeing Google increasingly focused on design, and more importantly, providing tools that help developers bring their apps to a new level of usability and delight. I hope Google continues to invest significant resources in this direction.

A lot of developers pick iOS to build for first, especially if they obsess about design and nuance, and it’ll be exciting if Google makes it just as easy to provide an optimal experience.

google-material1

For more on Material design, check out our coverage of the announcement at Google I/O 2014.

Google's innovative search technologies connect millions of people around the world with information every day. Founded in 1998 by Stanford Ph.D. students Larry Page and Sergey Brin, Google today is a top web property in all major glob... read more »

Powered by VBProfiles


Use a free or cheap marketing automation system? Tell us what's great about it (and not so great), and we'll share survey data from everyone else with you.

Commencement address by Bill and Melinda Gates

$
0
0

Bill Gates: Congratulations, Class of 2014! Melinda and I are excited to be here. It would be a thrill for anyone to be invited to speak at a Stanford Commencement – but it's especially gratifying for us.

Stanford is rapidly becoming the favorite university for members of our family. And it's long been a favorite university for Microsoft and our foundation. Our formula has been to get the smartest, most creative people working on the most important problems. It turns out that a disproportionate number of those people are at Stanford.

Right now, we have more than 30 foundation research projects underway with Stanford. When we want to learn more about the immune system to help cure the worst diseases, we work with Stanford. When we want to understand the changing landscape of higher education in the United States so that more low-income students get college degrees, we work with Stanford.

This is where genius lives.

There is a flexibility of mind here – an openness to change, an eagerness for what's new. This is where people come to discover the future and have fun doing it.

Melinda Gates: Some people call you nerds – and you claim the label with pride.

Bill: Well, so do we.

There are so many remarkable things going on here at this campus. But if Melinda and I had to put into one word what we love most about Stanford, it's the optimism. There's an infectious feeling here that innovation can solve almost every problem.

That's the belief that drove me, in 1975, to leave a college in the suburbs of Boston and go on an endless leave of absence. I believed that the magic of computers and software would empower people everywhere and make the world much, much better.

It's been almost 40 years since then, and 20 years since Melinda and I were married. We are both more optimistic now than ever. But on our journey together, our optimism evolved. We'd like to tell you what we learned – and talk to you today about how your optimism and ours can do more – for more people.

When Paul Allen and I started Microsoft, we wanted to bring the power of computers and software to the people – and that was the kind of rhetoric we used. One of the pioneering books in the field had a raised fist on the cover, and it was called Computer Lib. At that time, only big businesses could buy computers. We wanted to offer the same power to regular people – and democratize computing.

By the 1990s, we saw how profoundly personal computers could empower people. But that success created a new dilemma: If rich kids got computers and poor kids didn't, then technology would make inequality worse. That ran counter to our core belief: Technology should benefit everybody. So we worked to close the digital divide. I made it a priority at Microsoft, and Melinda and I made it an early priority at our foundation – donating personal computers to public libraries to make sure everyone had access.

The digital divide was a focus of mine in 1997 when I took my first trip to South Africa. I went there on business, so I spent most of my time in meetings in downtown Johannesburg. I stayed in the home of one of the richest families in South Africa. It had only been three years since the election of Nelson Mandela marked the end of apartheid. When I sat down for dinner with my hosts, they used a bell to call the butler. After dinner, the men and women separated, and the men smoked cigars. I thought, "Good thing I read Jane Austen, or I wouldn't have known what was going on."

The next day I went to Soweto – the poor township southwest of Johannesburg that had been a center of the anti-apartheid movement.

It was a short distance from the city into the township, but the entry was sudden, jarring, and harsh. I passed into a world completely unlike the one I came from.

My visit to Soweto became an early lesson in how naïve I was.

Microsoft was donating computers and software to a community center there – the kind of thing we did in the United States. But it became clear to me very quickly that this was not the United States.

I had seen statistics on poverty, but I had never really seen poverty. The people there lived in corrugated tin shacks with no electricity, no water, no toilets. Most people didn't wear shoes; they walked barefoot along the streets. Except there were no streets – just ruts in the mud.

The community center had no consistent source of power, so they had rigged up an extension cord that ran about 200 feet from the center to a diesel generator outside. Looking at the setup, I knew the minute the reporters and I left, the generator would get moved to a more urgent task, and the people who used the community center would go back to worrying about challenges that couldn't be solved by a PC.

When I gave my prepared remarks to the press, I said: "Soweto is a milestone. There are major decisions ahead about whether technology will leave the developing world behind. This is to close the gap."

As I was reading those words, I knew they were irrelevant. What I didn't say was: "By the way, we're not focused on the fact that half a million people on this continent are dying every year from malaria. But we're sure as hell going to bring you computers."

Before I went to Soweto, I thought I understood the world's problems, but I was blind to the most important ones. I was so taken aback by what I saw that I had to ask myself, "Do I still believe that innovation can solve the world's toughest problems?"

I promised myself that before I came back to Africa, I would find out more about what keeps people poor.

Over the years, Melinda and I did learn more about the most pressing needs of the poor. On a later trip to South Africa, I paid a visit to a hospital for patients with MDR-TB, or multi-drug-resistant tuberculosis, a disease with a cure rate of under 50 percent.

I remember that hospital as a place of despair. It was a giant open ward with a sea of patients shuffling around in pajamas, wearing masks.

There was one floor just for children, including some babies lying in bed. They had a little school for the kids who were well enough to learn, but many of the children couldn't make it, and the hospital didn't seem to know whether it was worth it to keep the school open.

I talked to a patient there in her early thirties. She had been a worker at a TB hospital when she came down with a cough. She went to a doctor, and he told her she had drug-resistant TB. She was later diagnosed with AIDS. She wasn't going to live much longer, but there were plenty of MDR patients waiting to take her bed when she vacated it.

This was hell with a waiting list.

But seeing hell didn't reduce my optimism; it channeled it. I got in the car and told the doctor who was working with us: "Yeah, I know. MDR-TB is hard to cure. But we should be able to do something for these people." This year, we're entering phase three with a new TB drug regime. For patients who respond, instead of a 50 percent cure rate after 18 months for $2,000, we could get an 80-90 percent cure rate after six months for under $100.

That's better by a factor of a hundred.

Optimism is often dismissed as false hope. But there is also false hopelessness.

That's the attitude that says we can't defeat poverty and disease.

We absolutely can.

Melinda: Bill called me after he visited the TB hospital. Ordinarily, if we're calling from a trip, we just go through the agenda of the day: "Here's what I did; here's where I went; here's who I met." But this call was different. He said: "Melinda, I've gone somewhere I've never been before" and then he choked up and couldn't talk. Finally he just said: "I'll tell you when I get home."

I knew what he was going through. When you see people with so little hope, it breaks your heart. But if you want to do the most, you have to see the worst. That's what Bill was doing that day. I've had days like that, too.

Ten years ago, I traveled to India with friends. On the last day there, I spent some time meeting with prostitutes. I expected to talk to them about the risk of AIDS, but they wanted to talk about stigma. Most of these women had been abandoned by their husbands, and that's why they'd gone into prostitution. They were trying to make enough money to feed their kids. They were so low in the eyes of society that they could be raped and robbed and beaten by anybody – even by police – and nobody cared.

Talking to them about their lives was so moving to me. But what I remember most is how much they wanted to touch me and be touched. It was as if physical contact somehow proved their worth. As I was leaving, we took a photo of all of us with our arms linked together.

Later that day, I spent some time in a home for the dying. I walked into a large hall and saw rows and rows of cots. Every cot was attended except for one far off in the corner that no one was going near, so I walked over there. The patient was a woman who seemed to be in her thirties. I remember her eyes. She had these huge, brown, sorrowful eyes. She was emaciated, on the verge of death. Her intestines weren't holding anything – so they had put her on a cot with a hole cut out in the bottom, and everything just poured through into a pan below.

I could tell she had AIDS, both from the way she looked, and the fact that she was off in the corner alone. The stigma of AIDS is vicious – especially for women – and the punishment is abandonment.

When I arrived at her cot, I suddenly felt totally helpless. I had absolutely nothing I could offer her. I knew I couldn't save her, but I didn't want her to be alone. So I knelt down next to her and reached out to touch her – and as soon as she felt my hand, she grabbed it and wouldn't let go. We sat there holding hands, and even though I knew she couldn't understand me, I just started saying: "It's okay. It's okay. It's not your fault. It's not your fault."

We had been there together for a while when she pointed upward with her finger. It took me some time to figure out that she wanted to go up to the roof and sit outside while it was still light out. I asked one of the workers if that would be okay, but she was overwhelmed by all the patients she had to care for. She said: "She's in the last stages of dying, and I have to pass out medicine." Then I asked another, and got the same answer. It was getting late and the sun was going down, and I had to leave, and no one seemed willing to take her upstairs.

So finally I just scooped her up – she was just skin over a skeleton, just a sack of bones – and I carried her up the stairs. On the roof, there were a few of those plastic chairs that will blow over in a strong breeze, and I set her down on one of those, and I helped prop her feet up on another, and I placed a blanket over her legs.

And she sat there with her face to the west, watching the sunset. I made sure the workers knew that she was up there so they would come get her after the sun went down. Then I had to leave her.

But she never left me.

I felt completely and totally inadequate in the face of this woman's death.

But sometimes it's the people you can't help who inspire you the most.

I knew that the sex workers I linked arms with in the morning could become the woman I carried upstairs in the evening – unless they found a way to defy the stigma that hung over their lives.

Over the past 10 years, our foundation has helped sex workers build support groups so they could empower each other to speak out for safe sex and demand that their clients use condoms. Their brave efforts helped keep HIV prevalence low among sex workers, and a lot of studies show that is a big reason why the AIDS epidemic in India hasn't exploded.

When these sex workers gathered together to help stop AIDS transmission, something unexpected and wonderful happened. The community they formed became a platform for everything. They were able to set up speed-dial networks to respond to violent attacks. Police and others who raped and robbed them couldn't get away with it anymore. The women set up systems to encourage savings. They used financial services that helped some of them start businesses and get out of sex work. This was all done by people society considered the lowliest of the low.

Optimism for me isn't a passive expectation that things will get better; it's a conviction that we can make things better – that whatever suffering we see, no matter how bad it is, we can help people if we don't lose hope and we don't look away.

Bill: Melinda and I have described some devastating scenes. But we want to make the strongest case we can for the power of optimism. Even in dire situations, optimism can fuel innovation and lead to new tools to eliminate suffering. But if you never really see the people who are suffering, your optimism can't help them. You will never change their world.

And that brings me to what I see as a paradox.

The world of science and technology is driving phenomenal innovations – and Stanford stands at the center of that, creating new companies, prize-winning professors, ingenious software, miracle drugs, and amazing graduates. We're on the verge of mind-blowing breakthroughs in what human beings can do for each other. And people here are really excited about the future.

At the same time, if you ask people across the United States, "Is the future going to be better than the past?" most people will say: "No. My kids will be worse off than I am." They think innovation won't make the world better for them or for their children.

So who's right?

The people who say innovation will create new possibilities and make the world better?

…or…

The people who see a trend toward inequality and a decline in opportunity and don't think innovation will change that?

The pessimists are wrong in my view, but they're not crazy. If technology is purely market-driven and we don't focus innovation on the big inequities, then we could have amazing inventions that leave the world even more divided.

We won't improve public schools. We won't cure malaria. We won't end poverty. We won't develop the innovations poor farmers need to grow food in a changing climate.

If our optimism doesn't address the problems that affect so many of our fellow human beings, then our optimism needs more empathy. If empathy channeled our optimism, we would see the poverty and the disease and the poor schools, we would answer with our innovations, and we would surprise the pessimists.

Over the next generation, you Stanford graduates will lead a new wave of innovation and apply it to your world. Which problems will you decide to solve? If your world is wide, you can create the future we all want. If your world is narrow, you may create the future the pessimists fear.

I started learning in Soweto that if we're going to make our optimism matter to everyone and empower people everywhere, we have to see the lives of those most in need. If we have optimism, but we don't have empathy – then it doesn't matter how much we master the secrets of science, we're not really solving problems; we're just working on puzzles.

I think most of you have a broader worldview than I had at your age. You can do better at this than I did. If you put your hearts and minds to it, you can surprise the pessimists. We can't wait to see it.

Melinda: Let your heart break. It will change what you do with your optimism.

On a trip to South Asia, I met a desperately poor mother who brought me her two small children and implored me: "Please take them home with you." When I begged her forgiveness and said I could not, she said: "Then please take one."

On another trip, to South Los Angeles, I was talking to a group of high school students from a tough neighborhood when one young woman said to me: "Do you ever feel like we are just somebody else's kids whose parents shirked their responsibilities, that we're all just leftovers?"

These women made my heart break – and still do. And the empathy intensifies if I admit to myself: "That could be me."

When I talk with the mothers I meet during my travels, I see that there is no difference at all in what we want for our children. The only difference is our ability to give it to them.

What accounts for that difference?

Bill and I talk about this with our kids at the dinner table. Bill worked incredibly hard and took risks and made sacrifices for success. But there is another essential ingredient of success, and that ingredient is luck – absolute and total luck.

When were you born? Who were your parents? Where did you grow up? None of us earned these things. They were given to us.

When we strip away our luck and privilege and consider where we'd be without them, it becomes easier to see someone who's poor and sick and say "that could be me." This is empathy; it tears down barriers and opens up new frontiers for optimism.

So here is our appeal to you: As you leave Stanford, take your genius and your optimism and your empathy and go change the world in ways that will make millions of others optimistic as well.

You don't have to rush. You have careers to launch, debts to pay, spouses to meet and marry. That's enough for now.

But in the course of your lives, without any plan on your part, you'll come to see suffering that will break your heart.

When it happens, and it will, don't turn away from it; turn toward it.

That is the moment when change is born.

Congratulations and good luck.

Teenage Haskell

$
0
0

I’ve been inspired by the efforts of others (Chris Smith, Manuel Chakravarty) to try teaching children haskell as a first experience of programming. Haskell has a reputation of being a "hard" language, but I suspect this stems from the challenges faced by software developers transitioning from an imperative programming paradigm to a functional one. There’s anecdotal evidence that, for first steps into programming, a functional programming language may be easier for many students, and allow a class to focus more quickly on interesting aspects of programming.

With any group of beginners, and especially children, simple tooling is really important. Being able to run examples in minutes of turning on the computer is really important. But running even the simplest of traditional toolchains requires at least a rudimentary understanding of:

  • a text editor
  • the file system
  • a command line
  • an interpreter/compiler

And there’s platform issues here also – even when the language is platform independent the other items will vary. It would be very easy to get bogged down in all this well before actually writing a program that does something interesting…

Hence I was excited several weeks ago when Chris announced the reimplementation of his codeworld environment. In a nutshell, it’s a web site where:

  1. you edit haskell code in your browser
  2. it gets compiled to java script on the remote server using ghcjs
  3. the javascript runs back in the browser

and it comes with a beginner-friendly prelude focussed on creating pictures, animations, and simple games (no monads required!).

This was just in time for school holidays here in Sydney – my own children to be my "guinea pig" students. Nick (aged 14) is in year 9 at school, whereas Sam (aged 12) is in year 7. At school they have covered simple algebra, number planes, and other math ripe to be used for something more fun than drill exercises! They have a younger brother Henry (aged 10), who has being observing with interest.

Our goal is to learn to draw pictures, then move on to animations, and, further down the track (if we get there) write some games. After a couple of 2 hour sessions, it has gone remarkably well.

So what have we done? Here’s a short outline of our two sessions so far:

Session 1 (2.5 hours):

We discussed the nature of computers, programming languages, compilers.

We launched the codeworld environment, and played with the demos. We tried changing them, mostly by adjusting various constants, and found they broke in often entertaining ways.

We typed in a trivial 2 line program to draw a circle, and made it work. We observed how problems were reported in the log window.

We talked about what a function is, and looked at a few of the builtin functions:

solidCircle :: Number -> Picture
color :: Color -> Picture -> Picture
(&) :: Picture -> Picture -> Picture

… and looked at how they can be composed using haskell syntax.

Then we played!

After this, we introduced some extra functions:

solidRectangle :: Number -> Number -> Picture
translate :: Number -> Number -> Picture -> Picture
rotate :: Number -> Picture -> Picture
scale :: Number -> Number -> Picture -> Picture

which let us draw much more interesting stuff. The rest of this session was spent seeing what cool stuff we could draw with these 7 functions.

Nick programmed some abstract art:

Sam coded up a sheep:

That ended the session, though the boys found some unsupervised time on the computer the next day, when Nick built a castle:

and Sam did some virtual surfing:

Session 2 (2 hours):

In the second session, we started by talked about organising code for clarity and reuse.

The transformation functions introduced in the previous session caused some confusion when used in combination. We talked about how each primitive worked, and how they combined – the different between rotating and then translating versus translating then rotating was investigated.

The boys were keen to move on to animations. I thought we’d leave this for a few sessions, but their enthusiasm overruled. This required that we looked at how to write our own functions for the first time. (In codeworld an animation is a function from time to a picture). This is quite a big step, as we needed to get at least a basic idea of scoping also.

Nevertheless we battled on, and got some movement on the screen. It was soon discovered that rotations are the most interesting transform to animate, as you don’t lose you picture elements off the screen as time goes to infinity!

Nick and Sam needed more assistance here, but still managed to get some ideas working. I’ve only got single frames of their results. Sam produced his space race:

and Nick made a working clock (which tells the right time if you push the run button at 12 oclock!):

In the next session we are going to have to look at numerical functions in a bit more detail in order to produce more types of animations. Time for some graph paper perhaps…

Summary

For a beta (alpha?) piece of software, relying on some fairly advanced and new technology, Codeworld works remarkably well. And Chris has plans for it – there’s a long list of proposed enhancements in the github issue tracker, and a mailing list has just been created.

Right now the main issue is documentation. It works well with an already haskell-literate tutor. Others may want to wait for the documentation, course guides, etc to be written.

If you are a haskell enthusiast, Give it a try!

. Bookmark the

.

PostgreSQL/FreeBSD performance and scalability on a 40-core machine [pdf]

$
0
0

%PDF-1.5 %ÐÔÅØ 105 0 obj << /Length 1091 /Filter /FlateDecode >> stream xÚåWYo7~ׯØG.Ð¥yEQ´N"´IÓØµÐˆƒ`µ¢­…W»Êvýï;<¤Ä†Šªovú ˆ\ÎÁo8ó‘sº˜Ì©Î¨ÆŒJ‘-®2Ê62STbnu¶XeïÑYÎê†ñºw翜Ìý´w.§èôâe^p*Ð6/à£ë¯º°¸)ÛÊùŽÊvE†ªlÊeÝÔcÎ4ºÏ?,^g–cEXV0Š-5Ñ[×&Ũ&HQE£ÉবÖuë¼þÉœñŒ‚®”,l^Ì…Èf"Y»$„'Qñ¥hAµÁ\ƒo.1€ŽÒoüÖºvËv¬ý>Àï©kºiènãì»›zùÃÜ‹A>îÂøúû€G¬•<3Ø*•Âo±–4+ÇD±háâ÷_AO0py[uàˆ2•,ÈŒ ®"2¦5¦Z2°a“];ºv’†Ê,ødÊ+PaƒtÚ4/¬$èÝ­ëokwk˜b°ç I¿Ô¯`1®IƒJCo]9L}Ý^Ãv9GUج¡1@Pç…$äYüQiô.ÂW좒8EÅ žåœ¢òÚŸ¿ÒhfS3ÆéOPë!À\Jø¿8å(ÛÒРrðæ¸ðU ³q ž¹~N‘ýg C¥‘‡YÇ0KA9[ß1á–eu“²O OLõqeX—aæVq1̀q´fÏ 4߁î]á)Ø n;5å¸/ºqí"ćù²/G€­¬xJxR‡ñŠ„÷e_^wí%áò>^A»CÕŸncÝù ”ËÆù¤ ú‰§:–Gxä‘Ó °rÏ\)ôn@ç/\¡5ÒGÒßÓF»lº+Õ $<ýJ¹â@Ôõ¡¤â{æX† |ªW¶>ºòÿ˜cÒQºÖÎ'7ùò‚|„ä4» ½”|2ê]¸M¹]w^»ÖÒGÉ“ŠdúêãÔ¸˜ùÕvú8Os‚új}I$ä5£`ØC†t4ô¶*×4eëà1ç=S©¢Âµ£÷µ³¾Ûn*ïWDǞ^Â{þÿðôã†q」_ýéwÌŸò©ÛCå ÷å°Ê N-`¼hv4ûóÉ;0+å³Kú€¿»RÇÍöjððågø¯˜=†ûVrùìÑ‹ýƒ"AsCzMõØÄšý*)ÐK&òÉon€‡¼‡Qz1rˆöl”ýÑ—P–kWõ_ßæ…06QèX­#‡Nƒ¿ÐgÚ:ojöj1û4£`‘dÚBKÊVð_mfï?l‹à:u“ÝÑ ˆÂ)ã&»˜ÏN}ÏI&±Õ:1œÀÊ‚--¦zÜ&sši%Ô‹BWI5`†ò(¸X×>! _¹Ë™E] â›øe·2D¸ÐGÇåP.ð}é5îãx¦0˜Gßqჷ;µ«Ò÷‰øEK)óû²Ø³k[SÔþIw”m endstream endobj 122 0 obj << /Length 2260 /Filter /FlateDecode >> stream xÚ­XKsÜ6¾ëWÌ‘ªò0$À§s²l9Ñ®½R¬I²U¶k‹"1C–ø˜à(ò¯ßn40$JŽ_f@ nô×OœmN~xË“UꦋV›íÊç܍£d¥Ìõ½pµ)Vÿtí{žç\ž²ÄùíüÃo翟~Þü뇷~4ÙËyâÆÜ_y´‹ W~àò bH³¶Dkº^Š®4$Qx©£•¯É:Zk²¼¬Z!_!ÞÔ£ÈM·Vº¯vþ‚¹±ØMSf‰ð6'¥®ÍýK×-Ã\& *åCË ÚpJ›¸I˜ZÚ·¨ß8ÒÔOæÆÞñ\«³µÖêš×Èóçz}]`ýe+Ä=·ÇiÀŽ–ž)ú¿'ÌK0daÀÍý_‹V‰?iýu×4`b¹ö2©q>9ßœüq‚šòVþʏ}—%|ÆÌM¶Ê›“Ÿ½U‹`q.O“՝&mV,JÜ(AêÕõÉ/K‡Dž›°ø©C€œÔ@gœaÌ›]ޏcFa¸ Þ“ýUzæ'@~ÆŒ.Øœó¯2Û-ð 8îû¾ËJ‹Xò5$nÏUÀ܃ŒæCð’hhýÛ˜.k}Âõ8T6t ::¢§O~õÏhY“Rá?ƒƒG®Ï¾pµØ‹gQí4¾‰ç2S¦6œ9.úÐ)¯Ýö™Tý«¡/!¤s3TuAè˜{Z¡n¦‰Ûˆì DŸ{©%,BH1þs]ÐL¸qš®B?vÃ(h&»©©úæò­tŠm1Ýk#–¢ »ö™Á²ü§1·õ“XÎhQ̾žÇô™w-Ö»¡×ñþ%ÑÃúH¿æ¨­9fî“çÇg㈏Ay/t~?ÕeŽjD/Öçÿ¥Éóx$¡G¯¯~•4ÒyÉ‹pðŸ~>õ/¨(¡8ä^ßPç8G™M˜mw•*iôófC‘iºÒl6…Žá²T#©Ne5a€u ÚcàC¶Ü^Ìj¤ÀIA™i‚‚*ÍÉ­Ê^d…üqI½¤3Ònø÷µëoΦbrçë÷ßóüw×tî¦ÚB {€âŒÔî;5ŒG¾»ìë‹7ôUTòÖjLÇbÕwu-ú¯J÷Ûâ¦pÉ9`‰0\_‹Ökºˆ%çÚÕb}èê¡VcoÖþQÔ©#߃è–BT›)]Oo¡*6•|$nÙzkÛwÍ’Ûr>{º…0’òãýmlà1„Ý•"„&œ’Šl”D Ž>A¨òIßÚ®€ŠI¬úe~±Pôz‰Bò3r]iŸŸ¶J+ÕÐ Ç“ú2j@’±® 0!§.ô±³ÙýÚz#§ñ±cpOׇ¸r¨ Ag¥ñ؁à‡m€  m%ðÿÑÿLUê¤Gúˆ •ƒEZÒzf¶ŠÖ\ äR¸|ÏÀƒ:¥ïö4ÒÍükž8ØïÈŠà"%͘^±¥lрR”¹¥å»Rè3°A1ÂâǞˆ2ðÁº’å–CH’¤± v^¡`¦yE³W¦S¦CÓʐ¦•a£2«·4ê¶c«Œžf½}°n´ `±Øaõ°ÑQ¾nlP $ÁcÆfš-¸*@:¿2Ý]öN÷þzƒ‚-Ö²£izWè$Å]3f9uE‚½ø3RVú1Ÿ;ÀÌŠ,ÉdA«f§}´!>;ú„ÐÕT9íFÕÆ¤©s­ªº6;³

ÐmpO.G@|,’OÎl|d˜åЁåÝåëÿïêÃåÛ‹wÿùé“z)ü,•}¾ºq’XgØfùø >—M¬G¦Óç+Z±àA%ЊÚ]Ìd‘˽£Çý}é ÓB±—²9L“X­ » *#® ymÐä5M0Âb…–Õ÷_H£ð©Ñ©r¼5F§1ÐE à M&†^Dц^ü¡A©úÑàõB>hÓV]CÓ·º¸E­,ZÛ¼¶°Õ£nSm¡5’6½bÈmPV»ÒöMšyÔEßAô%–”žš¦†ÙÇÖÄåÜ>Ϻú–…P¨¡ý‘Bâc2tc§ô¨²Õ]»ü„c˜†Óòþè<¾5îÆô‚Ì8£E¥½£µzÿQáœgk{Zw´ £1yd¶ Û¤uÅÎ…9oo œ*jŠ"Vº&ŠBÜ»ÅL·#Í ~÷úù‹Âü]YaÆÕ8ÔúÆw´PÐGkó‚Ék°9óŽyt áÕúÎÅ¢yPó¤þ¼ì$‰ YCFŸûÕ’;͏0ÁbŒOØec¢êf&ã¬ÛÆG7ñŃ[¸VÙÈŠ;ËŰ©<§|[qwÔ àñäyÕw(TM˜±ÉC3~ÐC3‡0fø0Skà`{l`œtã«üþh¾Œ±‡]¤˜F;§ŸÚqzªN`†½MŒfѬÆRáÞ¾h¨—öEãÿÄ©m endstream endobj 134 0 obj << /Length 2376 /Filter /FlateDecode >> stream xÚ¥XYÜ¸~÷¯˜`¢ÜI¤()`Çv6wádfó†Zbwk­£WÇÿ>uQ­î‘oò$²T,ëøXÅ×w/nÞ©ô*ó3™«»ÝU¨”Ÿ˜ôÊd‘ñÕ]yõ//ºÞ„Ax®Sí½ºŽï/o¯7J)ïÝuª’z?½Çá“¿õã›÷oÿqýݼÍB¾R©Ÿ¨ð*`ÉŠYt°`Ù8žÒ~š0ãw¿¹ÙVíÍpÀ°z†~‹~ÃTv×OC1Ö<.ívÚûuW|ö}·ó{;Øñáÿ.À¶ù¶¶ëŽû­m‹/ÜüÌ_ȼ¸˜ßñ7LáV¾"àflŽBù‰¿é<üOœI0¿FÂ0æãÀ¿þD„ÐÇ5>qp°y)g‰ø{Zó{Ù¬ëGaù,–’iÛóà§5 3\lþ Ûò¤ÃEÀ¡F0‹D£W»Ñ‚LmBÏ>Úb«®}¹„Iäë,raú-…ñ£ qKŠ®óªx¯ñ`qgÇì黏ÒuÕ9Õ£°¦nÅó-NŸÈº›0I}“eçF®ÁeÀR€ét ½äÏ«‘gcÕXÌïÖ¢òÆòÙƒ àiÄœ;ÞW–‘¾0@EûA„ Õ#@u;ð°»½ÝÅ¢ÞI%9‰0¶\S{ÌÇâç\‰œÏ¸Ôö­­}¶µŠ¯Bí+m"ñ*•Ž’@…:€R‘—ïa•"8á,ËÓïó¶¬Áù«1Ü)s# ;N!T÷vÀLày~d÷Ùœ˜:vüÝ¿ÄÑ¢ÀEòDqàc\*üóÎ×nû³-0ƒŒ’ø¹#㇡rëNjRð«ÈøIrü+‘¨R‰òŽì~ íÄõ@<,]¦j¤~i·å}ó‰–}:tuù5M³ÌWfƇÝÔh?È´ØÄÞÝAT˜³•½ºäRát:€_¥æütc.Yj8Kc‡÷Ui™Põ½ÝMF‹ÿÚBf‹¬6 A5ðª¢Î«qÁD¨m/ÂØáÖq÷V†¤/ÄœŽ´·Ff¾>Ñ9‡C+ð3…{Bt‘Q_œBÎx„º¨Ìe «ÂD,ˆìI$I²Y,<Öˆwôs.×3é.`¸‡Kí˾;)Q`/ðñ ·›¼øeªúù—än(QÍcŠØÄ+_%Êé´f¾q0N€ïÏ26€ 4¨ó±º·Kü¨D.¢øš¶'ˆÐ_Pàà0šC ¨Ç:/(րLöZÍ~ÞÊ}‹›=ñ8o™‡%—Ž¥Û1•Í÷-ª[S9ïç–±Y€ÔÚÇ‘I'¡DXŽñ¹\-׏,EégfÇi¤[o„Lës›ÜBuBR¸Úú‰G$2JDãzÿ»Ó_Nòx Q¼¼Ò©ØÃ¾¾}³‚:ôuš9Þ¼Þ³«ñÐð³³pÂ0…úìè6¦ØÄ)ÅfEÞ3åáPI½· ÓÐ7çsíÕÛÚÞçí(fì.ÌYL€îoY Å4TÑ_—!ðOìÎøk‰B~`…Þïøü‘ZËùbQm}Âd €,¢óo¸D^—Ôô³ÈkpñÊÍ÷¼I¢K¸ÿÒ›ØOâù‚@S%ÑÒ'àM(D.€›2 ÌåÀåc$xœÎž £üUŽs¼0ñ;C§¿bï [‘ím.í}vê3{ûµflž]Æx² úÂͯ`¨³ÓVÃ1/ìZ²@gωu‚±À+ì@(:,.ƒ’ù£a àÛ}\²@…wô™c¦ãZ |.ƒ¢ÉŸ`Ûþi­F‰}°—cæ@à|²”E_I‰4pZIö)ί9“(íËjÿaݽ`~ «Õ|úªåJz®{Í}–.c™w{Îþ=ahÝMm¹Z9E`Öo5Z¸ìú_ž°wu·ægÌ*à§},êi€û`×—dƒp•´° - U,µM*¡yÉT*kÅ+(?Nf›|Àë†qßÛÛ¿¿_3¡lŸce°ý=õ“ »#ªÉ`oª²n»†c¶¬Sf'̧ŗ±m]›‹+2/f<ÖÊH7ƒáSiÈ©’p$DŽõ›qÐE¸UxRËèV;¢ˆ¨Yö~¹WzÚ+o»ö©é¦a­FilÃ鍱Ža՞+ J¥i-Tæ@ó!­‚¦ˆÌÔ@Xá^Htµ Ž»©ç˜´B$ŒN¬”Ë_T€ÃF|rO r-Rqõ]åÈ%”N¹¥Ó©¹B§¶B)¿`ý‰¨~!+x%¦FåÄ8'ÜTL“ž¹B¸ÃÔp¥‰¸X3 óCàyV^¨þ_Á`ÆjpH EýëËsèXKûہÉÇœK“ë9¡#3×5´^Z žŽŽ¬¦"Ï|œj‰= uÒ‰~çå¹m`+ž(ô>@çÃ%£Tñ•Èh‘l{¹[Š£Ýs 9L`@ñcǏ¡€ÀO]5ÕèîàÈT¡ôÍKt{þr{¶†jßVX´X‹­=´UÔ¡1ÐRŒ»¿mmÁ­¸ÔagaælÎÈ\ø)|b~Ê+_4,š’I~/Sç.ÿñ}Ï~¹À¾ƒæ"/åiÃ]q&ÈÄäœI€›f~N(™xAüÈÂ?NÏ!Kåè}L”&y¬‡•ÅJ†Ë}]²lT˜ºµ0=•4xA<Ñs òLc-Ï50Ëù6ïî±7Å7w×óÓs°Þ P~Ÿ:è)¢…%[¼Îöu´”Nf_jªÚQrözƒS–(qlÅð»èàhŠ­Ní&´oÒº!ùP펅Û8dêZG6nçpÔtÃÈLâ J¥^þÚ Þ>B'ÊVbC¯H5)ùÀ´9 q2ò25 Pn ‚“ˆÊо(Žé®­íh©ß‹ÉÛ2ª¼õ—ª$ðáúý¦ÚÉøJÇ¿æmꔂs6vG¦,ßOý÷¹\¾x{÷â?[^·e endstream endobj 139 0 obj << /Length 744 /Filter /FlateDecode >> stream xڝ”Moã6†ïþ:R+óŏñmMZ‹¢-¼§¶ÇIÓµl×–³ûó;”(;Y4À¶:‰Ãáðy_ù~9»ºáTi£Bµ|¨¹‰!UA©AðÕò¾úÍQ=Gp?×IÜ»š¢ûþºž3³»©çHr?äßåþáÝOß}¸þµþcùãÕ †õ™S++KN™]/g9V¾ $¢6ä¹Zu³¿gyb>f@ŽLÉó){þ"ýý  «ØhöDl‚ý¢O %wîÚ/õœ’°û\“ºö©¿BèMh¿ëÛM=Ât™.A‚¨nµ;m{ÓJÁ»öù±,;§^B«mûçnsÿb¸ÙY+ñ©Ä¶m·Î6˜¤¹6Šé½mÊN‚e:˜21‡’„KòêCŒª±„)A^OÀè(‡5¨óª& !:¨ç:Á‰ó|2©ÏÝÕswûО6}S£[-¬òÖ¶?{q¿ƒ‡ÃçÅs7ww­W½ñ%½ŒôšB¦õœ¨¡Ç=:6E!y*h¨‰(Xµ³BJÓ´ò¤ð9¡µ*Ð[äœ)ýÚ¢Ýùwîâº2ÈÄ|âT¸I˜}‚ÉRLAX­‘uâF‰¤2Mãĝ]xÅmŠóÊ·¸ô¿q¿ƒíȁ¼Ã(YyJÉE '3í (£ÇÑ{rªv\Ø!“¨5‰‰ÀZˆÁ©˜ÙRˆ?å_¶WÇÓ]Íà·ýé°=öO›u³Zx—^9ã¨;õë/‹sâÞ ",¥ÙS F[®‚I²/ÛkGdóçÃÔÅó|/^y%†¡œ©ß·WþGkÛñ¥ËMcÊܪDD0Å`Ñ ÎýD$>„é4 .Ñàw:ӏ^ю8Ù^äoàýêɵŽh¼heû6ª4ŠXæ×º½Û¬Ç›!âî×ù¾ß›á•ŠöJ5ûüàvͱoûã˜l»ý´vwê÷yÕ©ÿ†Çü—Ù?wý}Û endstream endobj 144 0 obj << /Length 2430 /Filter /FlateDecode >> stream xÚµYYsܸ~÷¯Ð[8U.AðLžÖY;qÊ{Ô®’<Ä)Db4´8䄇dýûí$g†RÙ‰ó¢ÁE Ñýõ×ÝÐë›Wß½ÕÙUîçI˜\Ýì®”Ö~šdWIú*ˆ¯nÊ«yáf«‚ ð~Ùd‘÷ý&L½¿¼ÙlµÖÞÛM¦q$óþþ›7<ü×ïúáý›_7ÿ¾ùÛwoU²Ø_ëÌOµº x瘗èüJ)?ã×lÝ¢­Žü,|R¨0†3uè™zÞǥȥ•g†ýÊyÁÕVe~œËMnöv³”ò>:jLÀ»k¹¥¼vÇ#¬£Í¢`±è$Mr'ûÃáãÎŒõð!ˆƒþ¨•ã“ÜÏ"í¾ØM1TmÃgU½œÕJ¿éS׳4zDåvíq³…_ÛñìÑàíשּׁ5·5‰wMB?Q!4H|¬m†î 4æÊÚҎ®¯#<Õ_ø5üS“ Aà€_€AwÏ#H|ø[¶xeðgC(ŽèÛÐc¯9¢NSô'ž=´ýP?q{lJTm··nßã÷dÚ×a¶`o¹÷¥AcˆùÄ8èùþZ§¾ ÓSVqhºdš{Òs#.Ý8õØW‚¸TZ"³´è|ß~>Ö¦j¤GÀu~wv’Ä"ðÉç:KaHšýnæ®…È?1œCÐýx˜™jf©ÎNÔté!Á×SbÓ^Et¿boœÎ(T¯@qœné”ÕïQtæ"+üfÑrš¶y:´c‘åOßÐÉ'2œeŸùÛ±aOˆg/®äâ*ÚpÿÔ_óǽ•C?”(LÀ¨*±ÿÿrÇ {#‚ÓUvÖ”BñÄ£rAg¡‰†Y/ÐÄ»=8†/PIØê«a4„oˆ¿×xÁÄ{ÜWާyYÇš‚|¿¶Ü(L/­)MÁŽÐ+|FyŠœÔ6g_÷û2Øïìå#Pä—UžDêTî GäÊ™Ò`Ä¥i"ׁ` ã’]²’ RÈÓóœòã¾­Ë—’¢<ó³`J£ zpÜi,øÌŒ ƒÅÞ:o[ _`Äߊ͂ÄO¢ì”'03êϼª´ÙlÎf¾pÎm9•ó‰Îþg¬HãŠ3¸Èûm¨êúzrV¦¸áÔ… G”s†æxÒã ðû4žÙË]@*˜F'މ#‰‰NŒ{Ö‰;ÚSóûE+Òè¿Èh³“Œ6ö~dÈØöÁv×sÎuyd’ùÑ\A½Ç@wÐQúT-%94(¥^Ya0aô(¯;ÁŒr˜QìW(œŠÒõÂŒ½=[&¤­™C N¡XC<}FžµHÞ–‚5¤yÁ°"ÂJfW^DÖƒ5§aÕ«±yÉèSȽ=ðäíðÑóaög1¦ø¨Rl.Ð)BÖ¥qSå§™úz:È…»‘â™.!饻Ѝ4ð¡Þÿ¢Ì(õó{‹”7‡¸À‰’Š!QR§ä¹d].r îV‡ÃF¡) ò»êüÝ@ù]èÂM¸0Q(u’ù´°I["NÃHPjæÁžÛ{ËÙõÉÆ@‰Û5¼••p!”Q×>Xî£imI–{ïvbÙnD,Héx¢Â€i\cOÒЏýu|’)ˆ!“Uºên?ˆ¬SæOôöÄâáCÉgJºå0G¾>Çñ]»àú®ïögaÝÎuã “»eš3­,Úá•ÔcøóÎósƒÁ: ð“#´"·æÁªïGšW®JäÅ;ƒ×ÃI–‡¿à‘ UéN…¢(¨2ls¶ßyš‰c3zùÙeå ¥aš-»É0ͧŒ%ónÇþ ôŒ´&Þ¯lBœh¦l=Ì—“ã§H´€~ìBӍ%^Ö@±ò£xªlèõ®³öõo?¬ *R¾Îã3NÁ­%í:S—îÑ%ô³øL x-!{þq¡!€ ɬµt%xœO=6äœØuή‚)rp ŒÏêE[– Œ„™²mdkJ\—gɲC±G½ëÄ{ÍVXKþèlPÆ$:79eÏæàÊ©úߺâ<ôÞ |Ì$ÅG8¿¨­q~†å³¬ãÒÐöpÌl‡BïÝ>ç Ž?RùŠ1‹Á.³5’ÜÅèíX—ܾå;Çqà¸[Ë­ÔuP§"%êʝª)¬ÛER/Ü)ÊÙàî±ú˺7^À£—9'Œ'W^#ð)Ÿ;{àX)ƒ±X¿ Ó”¥Í]E5‚P½;4Vv:økÙfa¾Öî)Ýåû(þð½"^TÃ)1§V$Ÿ”*Ø#ݤÈçCù‚‡ntí§#°&¾îbQÃtÏ=ò„L‰°!Ï ¬j~’„Ñù}:ýѲZÜO¼ðÆPöM¹íÁ4 Ùrí©¯²xô$¦7"wKºš¯BÆ’€¥}užßYº¡**~'X¹"= p{ þ±Ü¡¢¬$„†¢Àß?~ä߃¡¸ž_Mî×xžB2•,Ýþ%‡b_«ÉáÉ[à¬Î>´÷®8>ý[€…'â·||6¸”jpíÀü§zAêì2—°áKRaUçéü€LI4=5b»W¼ëeqI,rÂÉIÉ>÷ébðÛQΡ¼-D®¹!ÑË"zMC28†WQÁ¶Âà0òl½u"?{åǮ싗V¹N;C2Õ©TPpyî—#ævñâgìgÙŠ]L¥<< /Length 2891 /Filter /FlateDecode >> stream xÚ¥Y[sã¶~ß_á·Ð3BàíÑéî6n×7v“é4MÁ³©’”ýûž(R¦·Ý鋈ëÁÁ¹~úáîÝ÷Mv–«<‰’³»Ç3mŒJ“ì,É#¥Ãøìn}öÏ :_é0ƒ›óÌ—çQüùÃùÊ|<ώdÁß?aóއ¼üüþÓ‡ŸÏÿu÷—ï?êdBߘL¥FŸ…L9Á%g+Á©Y «àCSWÃùʆYPõøÍƒýŽûCËdm8!kS•ä©§ºÛ»ßÂ8ÌáG/0ac•,=>g»«ÝÖ5·=×AÑÀŃâÉU] xÍÞò–€öžÅ«YдBiÖ{/]Û<ñ,…ÅCíxŠ#®*]1øu͍\HH»]Ew|‚Ûör¢lß1õî±Å{w[!¾Á岿õkŠ]'œßc¨Ú¦Wpa£ƒ» ì‰r°wUYÔ¢™x¢™4Q:÷š!ãêœûáöý’ʵŠÁtÿW•[•Æ£Œºî™)”m”G QÐցÛe犡…½>Z‡©2Y2žý|¾JBøÐU®_8=‰À<Ü´ âºj¾ ŒV&q+ZIž€ =9èu<Ž&&ó<}ýžv bàp° ê4э&ñ¼½'‰,(X«ÌZ¿N-ÊUh㩽܃Â\÷5«É´JŽ{çÖ½\Eü׀ÿFƈPñߺnÉ1Jt¾×Œ˜Xic—¬ç°t±TeÑñ^àMipõè£9·ö>M-–iUV;8¾çQR|û O»5÷EɳU*¸[óZO‰D1Ý,‚;Û¹A amËËÆ×_ðó£Èówý’Î!Ø8: è¾® æ-Æq¿N˜+Û-ݎ/ $ÚÆF%éI´ýˆkÄ#W6 A&́[uLُCK쿎[¹VöͰ5çÙ(êW¨À`ɧz?˜åe°Ä8-ñöÐèk¸üø$yp;Ñ,_»-_jɦV‘Ñ*:Qݦ h&DûÚçjÄp„ƒB·o Ñp XŠ‹V…éx¹þЗCþ‘©/®kTµ+U¿ÙÞï{w¿Û–B¦ëŠ¢Ñ0åùö€y0úÒ³r£,QËçwÚ÷¢ŒzÁ#•é‘ß›ÿq»À Xã1v¯$©(ÿrÍßöáwWܦ, ߇¢ü­™ëA{TÏ»'ÉHšÜÜFœ4qÎ5²©ãX¿¯å˜J.'*N[ Cè/4f<@ŸyH™è#€Á/Ö¾Pí.$84²~}Ú£NAäÜŒLL‘ÓŸI’ÁoÇ¢þ¦ÉEâ¨Nì½ÚªÜž˜ì•HÁ{‘—-0¸g_m«š9â6ßEÓ䉁|Ì3`ŸÈé¾hÚæ«vjRe3;±ScBo§xæ#K¸t;M’WºZd*æÿe™Úµ^™Ï0ÁæÚó(Ú)»J¦ýÔuÛ¶í¾çñ™ù@bÂòÀhc@ w›J–¿à\1AÍt"Ä_¾ý,¦Âíí˜øo(J÷ÃSçnÿöiAq¬¬áàŒSÈ5Ò+$9=·ÕZr“¤#@Ϯ۸b-½Ç“i²vø­f·EF×MéSLŒ*;±ÒKXY ²rÜû-4¶q«§Hp˜³ÝIèeø—sEß)°}ë=ðˆw)l#Ô"÷D¤°˜/¤M™å¯wS¦á|¸àRTÂéÜ¿÷ÎgÝ9ðΔ0ÿÍ,³);Â+xŒi a[F~ôu@ã’˜·©´Â% ©ŠÁ‰©†q\´Ãb#‡bã’‡÷²Àþ*MUG'¡FʇèíŠq‚4@wqñ$xÆ×@›b·fbôöqçõõåÍýçŸ>ßßþzy³pð–†ù,˜˜ l÷µØ± |î€íu4×ûÒ­óšüŒõÑmušCcÜQ°I ze@:Šƒ›Î­vØ¡˜Û×\ð¬LêsFÊ9ÃDâJ)FxXŒ®ôš{ŒßPÏæ"ÔÏ´%`yQ’‹5&¨¹mûE u¨ú€/z®½}½D±ÅÎÔèÎ>-Z*Ä»Ð},°x¦“¸°Bò¥SœÞÍb%»®‰ý4‡mÃæB°…(‰®Ü]XP”¥ÔT¾üϏ+güââ1,ᬯõÚ96Ë,[è¹?JÂ^€jž—òE”A[O’ؽ@’%(kçåœÔ-’ ¬æl PDjš4( У‚õ™Âj !©®ç‘q7aÓÀ7óL´aFœ‰!GØ’°Ë¶éŠ÷Ž{û¨â8øùÓÕõÕÝýõ‡ëO?ýé¯Bmƒ‰Ú²Á‘çp‘9¾¾GèLzXÄ¡ÿO‚²@g[ü~,Xqnní8FåY–½U7ÓßAæþJM-+âlá`^Bgò¨ß¸Ã‚¼aß9)xun `:-ø'/äÚ'&üסÝr‘F>#²è\”`…_ëÁ4NjÉ`ÙoÈX»M1!`=Iú9ĽìCJ0ø>×£§€?óßa0TÖò˜Êão_877mœ®šj¨ŠZ¦_% # Ȉ ˜È“´†-’‚õÇü8Y?ˏ6Ú¹'–º¶c ¦Íôo7  n÷LpÈšÌ?~hüûdÅõ¼ê˜µa·ÓA½š˜u½^ [Q¤²8þ–'(#×R ¢'

MUPãëo¿þkùõBˆaÌ8O—"îkYØ÷œ´Î uG¨U0Ðç®Ì³ŠFÎæL~v3¼±F̳²¶`9[E[Ó ’ЯŒØÞLÂ‹r·Ê/DŒ Pg[°ìL¡CÄÞš²î;šààÖ¿ghÚ¤!nM^eçW¹Á÷Ó +£g{|ÿyåÂ…Ö,œÜgÿP»3/ݺ,RâÂß.V]÷¾ý«kƒ/‡jô¨ÃPç(u(´{í¨¬Ù´¤-%tÐh˜îr5ÍLŸ êpò3¡ýqp¬š½5 ü>˜¬Àš;ÏBŠCÛœÇ8ÔºP +=Ó`žÕ«±pèðÚyÀ‡I7´¨ðü#aRzòÂ8ÒõÃŒ|½_§-œ=u¯Ý]R¦ãñ¾pÁÕµlȉü´óЛttPõ£€=š‘ ƒ.œ?­³ÕÎt"¥) &p4X\¸£q a€LÎS‹À¸£‘uѨ^Ã$Èäx‘GÓ׿é•P´H’WÝ_RÜb0þ^@'÷ͬqÖîî*/çÚ/׎ɕ€ø'ßhœ‹#5±bq#…Z-]å e¿¦mÌo”ú¿ôöEi]©0Þ…‰ÓPž{Šs0diYè±—èiœ7+næØ c(7½ka5Œçν8Y‚ùÚüª^ѐg=бzéÜf`¡î!ËÍSvÆŒ º¢Ÿ4fI½Ì€¹‹T̖ΛÈAQ¼°nŒ*f~Á‰DÄø4wò¡«¦Ž‡N/LÝü0ùàrOLݲÞC˜÷˜¡`©/bØÅ$bãI»%`H‚Uâ("îH‰û=‚,X¤W‡° Äâ"gÎC8'%Y:0u7´”aiOél;?eõñJ–¢€‰ÅòÕS!€ÙèbÖ•aáö‰~G @êË…§¾z®[w‚ÜÂu{RºU$HR&@ðAráRR"˜eµÎ~c[FH¯838¦ŒøOú þŠo½î“tDÈG0°¬à4¨òœiòõM€eÇã4—ô®&ÜLjõv ”¡d*½4SU ÎTŠÖˆ„P\±T]”UÈ…SINf:cBfŸ4çsÙÊâ³n­±>ÇÓ·Hy­Öæ95öCY¹z—L…Fë³Ô™DòŠDQ:/Y´º&X„‚Ëüg—ÂM…‘Ë‚”Ï‚„Ë‚ö6úNiÝõ4HÏ/@jV@àœ ô`Fÿ±;Ô”œá,´§¡¾p k`Tã¥Ìr¾º+ðúªog Èb.‰ƒUÙõ6ȘŽÅƒÎÌ­:mcAU/ê&6)û=èÀl«Ì]7>Û´½,ïM+—ùOï´æHs —Ó8 +‚>Á¼z¥à—[•b,h†Êq_á…]Þ}¾{÷?|Òðî endstream endobj 2 0 obj > stream xÚµYÛn#7}ﯨGûa)’Åëb`.ëM€¹x€Í®í‡¶Ü #KŠº•Ìü}NuKÙ²[’Gz˜¡º»HOºÑ†4ybMœ¡L1Ñ”3&c182^“‰d’Ç?29’5dÙÖ’ LÖ“Í ?‰2q²¢ÓoÈá';rÛDr O C–ý¼u…³äå»'0òß3;l時Çà($‡ï¡–OEo},Å,b”l"(¼¥)%Hã@ÆCš2ŒŽrÀˈSbÀ‰´Ž”FŽE²=æáø:Â~†¡¢ÞaN>Á`y¡SÂü$r™¬Æñ³:톀Èè"#9zœ°Hvd#Ë-aŸ€>B6Ð@²Åa`vZ”^ÞÉ`“-Þr²­¾ÄÙ‹Á`Á´!ʤbwãV„†F¨°ÍÃî€æ r>¼Æa9 L–9‘ƺøä  ƆúÁ‰N Phƒy^áD¢s@#,­C•ZF Lo²åâÍ\Òàß³3| ³º6ãÙT™súî»âìç?«ÅŸãê¯ómÁåíÿe×Ò?Ue½\Œ§Ÿh8›6ÕT¾ž¿¸…í&ýR~ªè¢\Nú¾œÞMªEïfv½ÙEY7ôKÙŒvˆ¯·}­é¶~õîgªG墺#üWîXW+,ªÌgóå¤ldfT°†ëÖø°(?ͦ÷“¯ï.?¬gπ¦¼TõË`­tx·¼¿¯ô¾ŽªÞy Óôv2~Þ!»Âèöá¤*{Læ6Löë²Zöiì;ÙËꡜf‹>ÑЉÖ8ÔÝ5¼e9©h8_ÊϺ*ÃÑõÙõùËÓãŠ}ãzXM&å´š-ëÞÇ58£¿æÃë3w}N³)ý§ª›‡ Vþ×ï;¦¯ðz¸w“—Sr[þ0øyÇÔ•!›‡ù}}}æ1yE1xµcúÚ‹Ù°ªkjÆM/mR'þ[Uÿzär'÷‡˜Þ¿üSk8¢e½Í²+d M¿ÑàbÜÜȬ7oŠÁǯóŠÂ‹bð¾óýZòŠHl?[. pžÛW?UwãòÝì]i’œ&ÙÌÞXb¹¯©“{;Î°Ô•ä%Ù5ùnÝ»!uCn‡¬»Átƒí†NéÜ­’»Ur·JîVÉÝ*¹[EòP7šÕhWc·ÒMñè譞ÅàryÛ´Ï?ާŸ‹Á»Ùâ®Z´G47ƒï?Þ_ÉrúF@6t…ü¡bDòrF%IBÙ('‰É¥9Aî-õÇèã¨á¢Š’CmT9"•«h‘@U2ñy-¶ÀqÑAiè`¡K!eà¶!ö"bg¨ÁR"¤:©;¼²–wAbOaTAJ*›‘ÖPÖqFèi·.§À%j…b…µV~„JK¡JÙ­ Ÿ@Ÿ”E‰ƒzR1b‡¬ðn·.îø¬e°Õ kuV¨‹QÓ"f³éeí) ±P ‚ÍY%T¦Ì^¹´Ó‘ù$¬…YP­§ØI¹Ï 5ôn]ìñÍc³VNZ˜‡Ñ%#èÔk>«¤éD´4J1«{µð'ÐÂ!’¡!°Á¨;¡]SÚö§œp5@Uér­ÐÄH¼÷È„½ZÄã“Tv·’&˜FzUë”ñ;&žÂa,bªD+i¥[Ý´Ý­Ë Â¼ÒïÚGAñÕêæöÀåA ý=˜\P¤t·¢›ö»U9T–6™ÑK›”±ý$@ fÐº²\@çÀ”~Λjl”ó¿ÿ÷Ô®E9:Ðt9™Ü¼(Ê­hð”ÎûÈ: •A¦G²hZe/äÎM§UsaÛû¨õƒÜðèÕƒÜc³~öfݐpÀƒ[=yðë/€Ò„õƒ\ u5?tH/uYU40.hð±úÒÌHm(È|Vr=Æ• cØ)øç´á¸©TÙ4æ 5äm_nƒ½& ËM.jÇûê ¬áýÃÚَae‰‰þp†="Õ#º½Ä°W“*o“*DªMÒxmÈ2d¥’vÎ$˜ø —üöpì¶Ý˽ڽÜQÝŠµôèŽÊÚ,Ò0ю[†'“ìÝ}w³ÝûYaõSz…lÍ'>ñ(¶nøÄ«Ÿ¶^ë.n|¦Äa¤Ùèö¶ÈÑ–ã7ƘGaå¹Êo×6~ÏÚÆ‡§xú*Hñœ°7ZåÈû »èÚîj?a'÷¡Âºyj. endstream endobj 160 0 obj > stream xÚ•XY“Û6~÷¯˜GªÊ¢I¼Š½µ©NÍØyØl¹8$$±ÌCæ1ãÙ_¿}‡D%΋4€F£ûë þððêÍ{•Ü¥nÑÝÃáÎWʍ£ä.J×÷»‡âî?ŽÞí}Ïóœ»D;owAìüëÝn¯”r~ÿøîã»ûÝ~zóޏz”JÜXùwkHpÊÝÞJ÷J»IÌCù)kަ}QìŒMa:n'ƒÄ)ÓeC»§swûP‡Îà ,r²g>ãP;V¢ãq·‡¾-m«+éöe“KóqüÓSÊt=w3

Û‘“UÔ#/=ˎfà‰t,”4曈pŸØiË5àùqœwéP6GÖ:ªòɰȞæ5tƒLNíxÁÿÆI5i VEØLh/u&?™y'ÊpœgTFø*ðÚsþ}àqV\Î3DgѵgÁGÁÃ௝ïÔÜ36ƒâ‡³m}ž5“i‡è@Žv'»4Ã×nªµL‹xÚ[ÐÉ`O Í£iººK8Hä.ÊÛ±!laçÌGy2 :%>ˆn Â,c—vÊó©ÌO“2Ê69-7Ïǎû偧ÌéE™¿²ß&ÏäP¥s•åäJ`²þÙa0h2ÉîC;/V3B±³æ¢&¢Á¼¹ÉC"ruÍìæëØMôލ%fÃ-û fƒÕp£ú"´Iê”hB“åå$JÄê õ¿1œº™Åޏ àªh¹=±vNåñ™KksÌÑ~°k0p(¬ÚM3™TX;ю³7€÷8å(:²3•!õf„²ä“iðÆÆ¬Eûš3¤±Ú˜ 7ðÀs x_©4@D&°Ã&½Êad£rÀtMç·æb盘¨²šhÌì=„¾Ý3 ›‰ò±A‘´;”.˜5- ‚ƒðäO£Co֎:XD~xnL'?²þU<šÖ A4›„ó80Ï‚€‡Ó4HW·Ëf‰™=Æpÿ|2V/¨yáùÄP(špˆÒHaåxEλS¢ho(KÏãYŠÌÔmó§z)üøÙÇn쥶l@Àƈñ0LŠe>V|_ccm½œBhJ(9$s:FžS”#á2Í su¡ð™Ž-›4{1òêx¸šÿÏ@ÂD ’ߊ#ßñèU ä,šä`3ž,Õ‹\By–Ÿd—Ë"‡;óu$þÂ>ßIß.؏òše–óî=ö¬|5]- uAÕ³;yA»bpž~2•þÁz;ìMœP6½éÐôÛôãØq‰¤<›)„¸ª8u&+¨¬Pށ<…î}ÞõæB(‡²syç K¹èdN®ˆÃda8ÝMÒ™T@-†Þ¦šLREBw§ÌÂR’ÿnÁÇ~ýøË[lÑ­)AS¿•u9,ôm• ²e8ï©^oS]iëI½ßb¡~•ÃFª©$‰ÍÚsyÜJí@¹éô @|XZRqæ'Nm²ëyóŒ*{2Æ ±Àô¾R9É8ó¥HËz;“ÿ°€ÕI˜x@ˆÃ-,¾Th=£k*×O“uô„±í¹zåzÙG}ßû}™³.ÍE‘*÷€‘aðÐm ól؉ K§Ê÷Ó/,NÓ¨”LhÞfE`(„ðºÈ³€Ø`œØBÆØlñF²D<­zQqy\)šý±ƒ©\¶zc7bJ±7䆡Ïå ´’qšßB8N±„i\¥¦ÔÂArÞ’=ÔÌFzf£þ6“P1Gnz4^CÎïÚ§ÚmØ_ŸÉÊÏ»¶Û@¿¯=xXÛu„z捎í*Æœ*#t›e]âwVQ”©¬’×Û>ð á ¨]OÞ KVÚ¸BËâLQ9@a ì£$Ў8Þä%Æ–b ÃÍX_w, À?>î)x‡iœWÊîp¯Áiú-.™µÜ@×I#o”ëº_9X),ëj*¾;ÄS÷‡R÷ß›:;ŸZ¬þ»ïªøwxÕf‹˜@ÿµ¬—PIÜÄÓ6äˆuûáØ™ûßÞØ&ŒÜX);.[±eõ}&ðÝDO:ï_à!€¯ô(t>ñ_§A—$_·N”&nœL`œn^\?}…Ø3ˆKMß‹þ—&?uí^€¨"׏â*ÿ—ñ½O˜’êÚ9Qèzi`MxO>5æ‡û7ÌÕÊU°ØæN}®L ¬fy6öùV}>ý|r’‘'©•ñ_ ˆoܲá0Ëæ²…/t/qµwqÄÙe~,DÛ&ŸŸÜ('£üÈù‚ìoºÆT,/²!“–éó®|ä»Ü·v 1ƒ¿I±ˆ^;i(‰†2{hZ‘<78wñpäҎÞÌ’ruÖ¼ØÌ¢ã°i¼²)‰•””~­P<³Í2sõœ¹=œ©’´$ËÿŠr¯Ñá'P+¨ïOíFœs!T*êc(”+.°zî=žK^¸‰¨¼†6¤Ó'n­p$E/Ê%ì×yé'P9Ì%X\~³êPGm¿Êœÿ*7Š></Â5o"öfëB ¼%m€áŸÛ³¡7–ºñƂԋÃiN`ÁŽòYÕð£Ò¦ëÏY.ÝT,Ó‰°{á µÜU^´Âè+Žs…|aý>‰\ T´Âl]ã‚БFþ5}Åz r¯ 6áM•D‘óöÀ_YaB•HÎ5“–‡ä5/pÓøŸy2Ó¸ñɈuö‘ ¼o¥õ©˜ÑÀ†k*ƒÊ ìóF¹NIVo-–’ð&¯dÅT%c'¯ Ü&'Agúr‰i‡²ÙºÐSÜ"·‚e~þÈ´¼ŽéÁ4}+ãoþܞì¢Um#b+ÉøáµöS™U3(Öy R7QÓÕxn»¡ÇUá …ž¥Ó—†s6`Å„[ægzzãÓ~Kƒ2P­€¼þ˜ÁmóæÌðè¿V©Ú6JÂ8r£ Vö*¢/Ä—¯Þ=¼ú?s endstream endobj 164 0 obj << /Length 2442 /Filter /FlateDecode >> stream xڝY[oÛ¸~ï¯ðË2P³âM—Ç4›ží9í6'I±ìªDÛBdÉ+J¹üû3á$ÛQÒî>¦x›áp¾of˜÷7oÞ}É"ei$¢ÅÍzÁ¥dq”,¢T0êÅM±ø#ˆ–+†ap}þËÅÏ·_?],WRÊàüòëíõÅÙÕù/†:„?¾üßÍ¿ß}àÑÁ†R&,–|ÒV)M‘zÁ“*8g5LZIÍ"­&©\¥Í·¦¸í+RäûþÖšl)EÐæÛW$‡‹•€CȘ¶»júÍ–ß/E´ÍŸ¡TUYo¨³·c³Û¢,©‚®ÙSÏ®Y®D†>×m³#‰*<4^,Y¢âá¬û]n»¬C“tŒ$ÓhX°n– ¤”€ófFÌŠÅ’HB#a"‘´¸¬m×öyW6µ]µ¦+[SÌH› &Çkͽ©;[˜l€¢»6ë`¯LæÇûý`úú'j4ëãÙl·¯Œ¥ÞMý-m§‚̝s0ætjåV??qˆj³T{ô.ðúõÇšÁÀhÚ¾v¦9Ôõ%i¬äɰrt?”•þ0·V´§‚†!ãqt|ˆ³ýÞ›¡îª§%xö[P*æ/)3™¦ƒ„¼Êê *Ä_PHs¦äèXy³Û— ˆdP›/ƒ>Ê àn)îæÂ}ôv˜7õŠèX#N¾ïœJ ´Ùgà´+t¢? Ÿá±•;ؾêƒ0ZúYý€¬û¦êÉ!Ý÷HÅAl”!dpðaɃҹð–†wYŸOô{øY¢.YåŽ0xXDºs g5\$VëÀ<šÜ‹×êÀgáÃdù–Z°sg;ú°e—;³åJ‡QpVûù{§¼iËá:aò¸ ^â¹H#äp¯w¦­ßÑ#ÇW0ø.ËçÈ'ea¬†½œÏ% ΄Á°Éó×¼N¦Œ'£×ݛ֎S¤ê€ú|bOD~0ö4*tú› \¤L#§†'鱟K›› ðbšÞúå邬$†8¡ NøeŒãB¡ƒí8žV¹Ó6UàNëà·¥n¶Ý|xuñû|ô†Õ©¿‰xûDî-ü¹„CÓŒÑu73˜ñDY¬‡r¼"§¢‹ ГZ;pT;ÎWúÞlïÝÑÓQAÝ5 Ûрƒ ůË3 •„ü®Ü…“·Û˜Ú´¬•š‚mg<¡`ß:¨[j?lïí¼}”¿w…‘"ύõ3Q#óXÚ΁{@=¢&Cß—ŸÏ©ñùúʲ#`÷°-q7ÃoÑj8‘ø»uQÐãɝ V8H`кÑoö ÔÙQ×72#æÚrS—˜d䙣x‡=Ò´tèp¹„Av†ŒÀGX8‘"üÆÞAn²‚0`]€ 1C…üWVû¿›Æ¯‰uÒ úÒ¯f›Uf¾ëfŒ‹.âiâoxúÉÓ<µë=9O 'ï"ðpyì”Bø7èl©rtß8›{7ÏtœÇ,âò‡A b ¿1ƒ«ª0 ²ªÛú´…–”S5}GýÁåâ7d>eG=¥›%§­Ò!*é!=Ï<>þùä$\+¦_gPl‘zlïQG;¿°¦_rAhmy‘ÛÎf™¥ˆ–.Ûë^ݚƽoʱ«GÀoæ.ìèìRçžÀh”ö–yÛda°BäÙ·ž°§.®ï ¸+™Ø¨QFb¶0`q"†ylŽ™Wªàø•ˆYü,ïZGü¬²€Øc4¨l€µ?¾ûòíl7=Úœ‡£Ufò15‰Ôß­Ëלâbªä”Õ]ÛTY’wrè}¹™Û “ŒÆ.ÜÅÆuÓ‘þ3ný7:¥_&b´äKíýl/ x:òÌ£‡$\uÛÖd¸Z¨ƒÀ¢”?> ^~¤îì¸õ“ä@tкùôžvKi\ÓNÁ¬

<ôúôÀ¥ å ð‰;“YðtÌά_ûÑO) çU¸ñ3Ûbï„#ø814v¡/ºàõ»…Î÷ÜJCpÂÒÇ]Ùuc©eg@ óˆF‰J^‚(ÿDA ©ãŒJÑn·_[<‚ž0j·T¼:uPaŒ€¬| ¯Áôª¯ka‘ÏqRÜ#+¨ËçÑ~p†Ÿ¸f‘©Kˆl·iÍõ?Í%WÑarUd]F»»ÇW€øYÃJ!Æ•'–˜Íââh46Ît9"ˆ2yÕþ¤óÕ!X?eQtRb~ýpýšDd¥tÌÿ)X¸¾¹Ì†²êÉÞ†šiWm¸í[JÓð\#ï¿ËÌ<{"ÔVÿ-«¤Sùaj¯ÜX’èlc°}¥Ÿ"è N„*î n‹ öµÝ}}<«rYtÅà•47ËÿêKë*FËæÎa/Vë\2£ð`_^RU’.ˆ—á/èJŸùõà!ãüØã©ELYô`•rM·ˆÅÑÆ82oíE¢Á+:š×¹gŒ ~ cx]š»¥'<(úv”áðŠGÄ釁éÑé|'›#ö›¡XÜTT[#Íjû9kµK|:ƒ[ÌÇ'¬²žeƒˆ©8=ÎVš­è €°£Â(¸Py.¼l=ѹ‚™¯+;¤çj œçýÁÆ¼¿þy.óL

%PDF-1.5 %ÐÔÅØ 105 0 obj << /Length 1091 /Filter /FlateDecode >> stream xÚåWYo7~ׯØG.Ð¥yEQ´N"´IÓØµÐˆƒ`µ¢­…W»Êvýï;<¤Ä†Šªovú ˆ\ÎÁo8ó‘sº˜Ì©Î¨ÆŒJ‘-®2Ê62STbnu¶XeïÑYÎê†ñºw翜Ìý´w.§èôâe^p*Ð6/à£ë¯º°¸)ÛÊùŽÊvE†ªlÊeÝÔcÎ4ºÏ?,^g–cEXV0Š-5Ñ[×&Ũ&HQE£ÉবÖuë¼þÉœñŒ‚®”,l^Ì…Èf"Y»$„'Qñ¥hAµÁ\ƒo.1€ŽÒoüÖºvËv¬ý>Àï©kºiènãì»›zùÃÜ‹A>îÂøúû€G¬•<3Ø*•Âo±–4+ÇD±háâ÷_AO0py[uàˆ2•,ÈŒ ®"2¦5¦Z2°a“];ºv’†Ê,ødÊ+PaƒtÚ4/¬$èÝ­ëokwk˜b°ç I¿Ô¯`1®IƒJCo]9L}Ý^Ãv9GUج¡1@Pç…$äYüQiô.ÂW좒8EÅ žåœ¢òÚŸ¿ÒhfS3ÆéOPë!À\Jø¿8å(ÛÒРrðæ¸ðU ³q ž¹~N‘ýg C¥‘‡YÇ0KA9[ß1á–eu“²O OLõqeX—aæVq1̀q´fÏ 4߁î]á)Ø n;5å¸/ºqí"ćù²/G€­¬xJxR‡ñŠ„÷e_^wí%áò>^A»CÕŸncÝù ”ËÆù¤ ú‰§:–Gxä‘Ó °rÏ\)ôn@ç/\¡5ÒGÒßÓF»lº+Õ $<ýJ¹â@Ôõ¡¤â{æX† |ªW¶>ºòÿ˜cÒQºÖÎ'7ùò‚|„ä4» ½”|2ê]¸M¹]w^»ÖÒGÉ“ŠdúêãÔ¸˜ùÕvú8Os‚új}I$ä5£`ØC†t4ô¶*×4eëà1ç=S©¢Âµ£÷µ³¾Ûn*ïWDǞ^Â{þÿðôã†q」_ýéwÌŸò©ÛCå ÷å°Ê N-`¼hv4ûóÉ;0+å³Kú€¿»RÇÍöjððågø¯˜=†ûVrùìÑ‹ýƒ"AsCzMõØÄšý*)ÐK&òÉon€‡¼‡Qz1rˆöl”ýÑ—P–kWõ_ßæ…06QèX­#‡Nƒ¿ÐgÚ:ojöj1û4£`‘dÚBKÊVð_mfï?l‹à:u“ÝÑ ˆÂ)ã&»˜ÏN}ÏI&±Õ:1œÀÊ‚--¦zÜ&sši%Ô‹BWI5`†ò(¸X×>! _¹Ë™E] â›øe·2D¸ÐGÇåP.ð}é5îãx¦0˜Gßqჷ;µ«Ò÷‰øEK)óû²Ø³k[SÔþIw”m endstream endobj 122 0 obj << /Length 2260 /Filter /FlateDecode >> stream xÚ­XKsÜ6¾ëWÌ‘ªò0$À§s²l9Ñ®½R¬I²U¶k‹"1C–ø˜à(ò¯ßn40$JŽ_f@ nô×OœmN~xË“UꦋV›íÊç܍£d¥Ìõ½pµ)Vÿtí{žç\ž²ÄùíüÃo翟~Þü뇷~4ÙËyâÆÜ_y´‹ W~àò bH³¶Dkº^Š®4$Qx©£•¯É:Zk²¼¬Z!_!ÞÔ£ÈM·Vº¯vþ‚¹±ØMSf‰ð6'¥®ÍýK×-Ã\& *åCË ÚpJ›¸I˜ZÚ·¨ß8ÒÔOæÆÞñ\«³µÖêš×Èóçz}]`ýe+Ä=·ÇiÀŽ–ž)ú¿'ÌK0daÀÍý_‹V‰?iýu×4`b¹ö2©q>9ßœüq‚šòVþʏ}—%|ÆÌM¶Ê›“Ÿ½U‹`q.O“՝&mV,JÜ(AêÕõÉ/K‡Dž›°ø©C€œÔ@gœaÌ›]ޏcFa¸ Þ“ýUzæ'@~ÆŒ.Øœó¯2Û-ð 8îû¾ËJ‹Xò5$nÏUÀ܃ŒæCð’hhýÛ˜.k}Âõ8T6t ::¢§O~õÏhY“Rá?ƒƒG®Ï¾pµØ‹gQí4¾‰ç2S¦6œ9.úÐ)¯Ýö™Tý«¡/!¤s3TuAè˜{Z¡n¦‰Ûˆì DŸ{©%,BH1þs]ÐL¸qš®B?vÃ(h&»©©úæò­tŠm1Ýk#–¢ »ö™Á²ü§1·õ“XÎhQ̾žÇô™w-Ö»¡×ñþ%ÑÃúH¿æ¨­9fî“çÇg㈏Ay/t~?ÕeŽjD/Öçÿ¥Éóx$¡G¯¯~•4ÒyÉ‹pðŸ~>õ/¨(¡8ä^ßPç8G™M˜mw•*iôófC‘iºÒl6…Žá²T#©Ne5a€u ÚcàC¶Ü^Ìj¤ÀIA™i‚‚*ÍÉ­Ê^d…üqI½¤3Ònø÷µëoΦbrçë÷ßóüw×tî¦ÚB {€âŒÔî;5ŒG¾»ìë‹7ôUTòÖjLÇbÕwu-ú¯J÷Ûâ¦pÉ9`‰0\_‹Ökºˆ%çÚÕb}èê¡VcoÖþQÔ©#߃è–BT›)]Oo¡*6•|$nÙzkÛwÍ’Ûr>{º…0’òãýmlà1„Ý•"„&œ’Šl”D Ž>A¨òIßÚ®€ŠI¬úe~±Pôz‰Bò3r]iŸŸ¶J+ÕÐ Ç“ú2j@’±® 0!§.ô±³ÙýÚz#§ñ±cpOׇ¸r¨ Ag¥ñ؁à‡m€  m%ðÿÑÿLUê¤Gúˆ •ƒEZÒzf¶ŠÖ\ äR¸|ÏÀƒ:¥ïö4ÒÍükž8ØïÈŠà"%͘^±¥lрR”¹¥å»Rè3°A1ÂâǞˆ2ðÁº’å–CH’¤± v^¡`¦yE³W¦S¦CÓʐ¦•a£2«·4ê¶c«Œžf½}°n´ `±Øaõ°ÑQ¾nlP $ÁcÆfš-¸*@:¿2Ý]öN÷þzƒ‚-Ö²£izWè$Å]3f9uE‚½ø3RVú1Ÿ;ÀÌŠ,ÉdA«f§}´!>;ú„ÐÕT9íFÕÆ¤©s­ªº6;³

ÐmpO.G@|,’OÎl|d˜åЁåÝåëÿïêÃåÛ‹wÿùé“z)ü,•}¾ºq’XgØfùø >—M¬G¦Óç+Z±àA%ЊÚ]Ìd‘˽£Çý}é ÓB±—²9L“X­ » *#® ymÐä5M0Âb…–Õ÷_H£ð©Ñ©r¼5F§1ÐE à M&†^Dц^ü¡A©úÑàõB>hÓV]CÓ·º¸E­,ZÛ¼¶°Õ£nSm¡5’6½bÈmPV»ÒöMšyÔEßAô%–”žš¦†ÙÇÖÄåÜ>Ϻú–…P¨¡ý‘Bâc2tc§ô¨²Õ]»ü„c˜†Óòþè<¾5îÆô‚Ì8£E¥½£µzÿQáœgk{Zw´ £1yd¶ Û¤uÅÎ…9oo œ*jŠ"Vº&ŠBÜ»ÅL·#Í ~÷úù‹Âü]YaÆÕ8ÔúÆw´PÐGkó‚Ék°9óŽyt áÕúÎÅ¢yPó¤þ¼ì$‰ YCFŸûÕ’;͏0ÁbŒOØec¢êf&ã¬ÛÆG7ñŃ[¸VÙÈŠ;ËŰ©<§|[qwÔ àñäyÕw(TM˜±ÉC3~ÐC3‡0fø0Skà`{l`œtã«üþh¾Œ±‡]¤˜F;§ŸÚqzªN`†½MŒfѬÆRáÞ¾h¨—öEãÿÄ©m endstream endobj 134 0 obj << /Length 2376 /Filter /FlateDecode >> stream xÚ¥XYÜ¸~÷¯˜`¢ÜI¤()`Çv6wádfó†Zbwk­£WÇÿ>uQ­î‘oò$²T,ëøXÅ×w/nÞ©ô*ó3™«»ÝU¨”Ÿ˜ôÊd‘ñÕ]yõ//ºÞ„Ax®Sí½ºŽï/o¯7J)ïÝuª’z?½Çá“¿õã›÷oÿqýݼÍB¾R©Ÿ¨ð*`ÉŠYt°`Ù8žÒ~š0ãw¿¹ÙVíÍpÀ°z†~‹~ÃTv×OC1Ö<.ívÚûuW|ö}·ó{;Øñáÿ.À¶ù¶¶ëŽû­m‹/ÜüÌ_ȼ¸˜ßñ7LáV¾"àflŽBù‰¿é<üOœI0¿FÂ0æãÀ¿þD„ÐÇ5>qp°y)g‰ø{Zó{Ù¬ëGaù,–’iÛóà§5 3\lþ Ûò¤ÃEÀ¡F0‹D£W»Ñ‚LmBÏ>Úb«®}¹„Iäë,raú-…ñ£ qKŠ®óªx¯ñ`qgÇì黏ÒuÕ9Õ£°¦nÅó-NŸÈº›0I}“eçF®ÁeÀR€ét ½äÏ«‘gcÕXÌïÖ¢òÆòÙƒ àiÄœ;ÞW–‘¾0@EûA„ Õ#@u;ð°»½ÝÅ¢ÞI%9‰0¶\S{ÌÇâç\‰œÏ¸Ôö­­}¶µŠ¯Bí+m"ñ*•Ž’@…:€R‘—ïa•"8á,ËÓïó¶¬Áù«1Ü)s# ;N!T÷vÀLày~d÷Ùœ˜:vüÝ¿ÄÑ¢ÀEòDqàc\*üóÎ×nû³-0ƒŒ’ø¹#㇡rëNjRð«ÈøIrü+‘¨R‰òŽì~ íÄõ@<,]¦j¤~i·å}ó‰–}:tuù5M³ÌWfƇÝÔh?È´ØÄÞÝAT˜³•½ºäRát:€_¥æütc.Yj8Kc‡÷Ui™Põ½ÝMF‹ÿÚBf‹¬6 A5ðª¢Î«qÁD¨m/ÂØáÖq÷V†¤/ÄœŽ´·Ff¾>Ñ9‡C+ð3…{Bt‘Q_œBÎx„º¨Ìe «ÂD,ˆìI$I²Y,<Öˆwôs.×3é.`¸‡Kí˾;)Q`/ðñ ·›¼øeªúù—än(QÍcŠØÄ+_%Êé´f¾q0N€ïÏ26€ 4¨ó±º·Kü¨D.¢øš¶'ˆÐ_Pàà0šC ¨Ç:/(րLöZÍ~ÞÊ}‹›=ñ8o™‡%—Ž¥Û1•Í÷-ª[S9ïç–±Y€ÔÚÇ‘I'¡DXŽñ¹\-׏,EégfÇi¤[o„Lës›ÜBuBR¸Úú‰G$2JDãzÿ»Ó_Nòx Q¼¼Ò©ØÃ¾¾}³‚:ôuš9Þ¼Þ³«ñÐð³³pÂ0…úìè6¦ØÄ)ÅfEÞ3åáPI½· ÓÐ7çsíÕÛÚÞçí(fì.ÌYL€îoY Å4TÑ_—!ðOìÎøk‰B~`…Þïøü‘ZËùbQm}Âd €,¢óo¸D^—Ôô³ÈkpñÊÍ÷¼I¢K¸ÿÒ›ØOâù‚@S%ÑÒ'àM(D.€›2 ÌåÀåc$xœÎž £üUŽs¼0ñ;C§¿bï [‘ím.í}vê3{ûµflž]Æx² úÂͯ`¨³ÓVÃ1/ìZ²@gωu‚±À+ì@(:,.ƒ’ù£a àÛ}\²@…wô™c¦ãZ |.ƒ¢ÉŸ`Ûþi­F‰}°—cæ@à|²”E_I‰4pZIö)ί9“(íËjÿaݽ`~ «Õ|úªåJz®{Í}–.c™w{Îþ=ahÝMm¹Z9E`Öo5Z¸ìú_ž°wu·ægÌ*à§},êi€û`×—dƒp•´° - U,µM*¡yÉT*kÅ+(?Nf›|Àë†qßÛÛ¿¿_3¡lŸce°ý=õ“ »#ªÉ`oª²n»†c¶¬Sf'̧ŗ±m]›‹+2/f<ÖÊH7ƒáSiÈ©’p$DŽõ›qÐE¸UxRËèV;¢ˆ¨Yö~¹WzÚ+o»ö©é¦a­FilÃ鍱Ža՞+ J¥i-Tæ@ó!­‚¦ˆÌÔ@Xá^Htµ Ž»©ç˜´B$ŒN¬”Ë_T€ÃF|rO r-Rqõ]åÈ%”N¹¥Ó©¹B§¶B)¿`ý‰¨~!+x%¦FåÄ8'ÜTL“ž¹B¸ÃÔp¥‰¸X3 óCàyV^¨þ_Á`ÆjpH EýëËsèXKûہÉÇœK“ë9¡#3×5´^Z žŽŽ¬¦"Ï|œj‰= uÒ‰~çå¹m`+ž(ô>@çÃ%£Tñ•Èh‘l{¹[Š£Ýs 9L`@ñcǏ¡€ÀO]5ÕèîàÈT¡ôÍKt{þr{¶†jßVX´X‹­=´UÔ¡1ÐRŒ»¿mmÁ­¸ÔagaælÎÈ\ø)|b~Ê+_4,š’I~/Sç.ÿñ}Ï~¹À¾ƒæ"/åiÃ]q&ÈÄäœI€›f~N(™xAüÈÂ?NÏ!Kåè}L”&y¬‡•ÅJ†Ë}]²lT˜ºµ0=•4xA<Ñs òLc-Ï50Ëù6ïî±7Å7w×óÓs°Þ P~Ÿ:è)¢…%[¼Îöu´”Nf_jªÚQrözƒS–(qlÅð»èàhŠ­Ní&´oÒº!ùP펅Û8dêZG6nçpÔtÃÈLâ J¥^þÚ Þ>B'ÊVbC¯H5)ùÀ´9 q2ò25 Pn ‚“ˆÊо(Žé®­íh©ß‹ÉÛ2ª¼õ—ª$ðáúý¦ÚÉøJÇ¿æmꔂs6vG¦,ßOý÷¹\¾x{÷â?[^·e endstream endobj 139 0 obj << /Length 744 /Filter /FlateDecode >> stream xڝ”Moã6†ïþ:R+óŏñmMZ‹¢-¼§¶ÇIÓµl×–³ûó;”(;Y4À¶:‰Ãáðy_ù~9»ºáTi£Bµ|¨¹‰!UA©AðÕò¾úÍQ=Gp?×IÜ»š¢ûþºž3³»©çHr?äßåþáÝOß}¸þµþcùãÕ †õ™S++KN™]/g9V¾ $¢6ä¹Zu³¿gyb>f@ŽLÉó){þ"ýý  «ØhöDl‚ý¢O %wîÚ/õœ’°û\“ºö©¿BèMh¿ëÛM=Ât™.A‚¨nµ;m{ÓJÁ»öù±,;§^B«mûçnsÿb¸ÙY+ñ©Ä¶m·Î6˜¤¹6Šé½mÊN‚e:˜21‡’„KòêCŒª±„)A^OÀè(‡5¨óª& !:¨ç:Á‰ó|2©ÏÝÕswûО6}S£[-¬òÖ¶?{q¿ƒ‡ÃçÅs7ww­W½ñ%½ŒôšB¦õœ¨¡Ç=:6E!y*h¨‰(Xµ³BJÓ´ò¤ð9¡µ*Ð[äœ)ýÚ¢Ýùwîâº2ÈÄ|âT¸I˜}‚ÉRLAX­‘uâF‰¤2Mãĝ]xÅmŠóÊ·¸ô¿q¿ƒíȁ¼Ã(YyJÉE '3í (£ÇÑ{rªv\Ø!“¨5‰‰ÀZˆÁ©˜ÙRˆ?å_¶WÇÓ]Íà·ýé°=öO›u³Zx—^9ã¨;õë/‹sâÞ ",¥ÙS F[®‚I²/ÛkGdóçÃÔÅó|/^y%†¡œ©ß·WþGkÛñ¥ËMcÊܪDD0Å`Ñ ÎýD$>„é4 .Ñàw:ӏ^ю8Ù^äoàýêɵŽh¼heû6ª4ŠXæ×º½Û¬Ç›!âî×ù¾ß›á•ŠöJ5ûüàvͱoûã˜l»ý´vwê÷yÕ©ÿ†Çü—Ù?wý}Û endstream endobj 144 0 obj << /Length 2430 /Filter /FlateDecode >> stream xÚµYYsܸ~÷¯Ð[8U.AðLžÖY;qÊ{Ô®’<Ä)Db4´8䄇dýûí$g†RÙ‰ó¢ÁE Ñýõ×ÝÐë›Wß½ÕÙUîçI˜\Ýì®”Ö~šdWIú*ˆ¯nÊ«yáf«‚ ð~Ùd‘÷ý&L½¿¼ÙlµÖÞÛM¦q$óþþ›7<ü×ïúáý›_7ÿ¾ùÛwoU²Ø_ëÌOµº x瘗èüJ)?ã×lÝ¢­Žü,|R¨0†3uè™zÞǥȥ•g†ýÊyÁÕVe~œËMnöv³”ò>:jLÀ»k¹¥¼vÇ#¬£Í¢`±è$Mr'ûÃáãÎŒõð!ˆƒþ¨•ã“ÜÏ"í¾ØM1TmÃgU½œÕJ¿éS׳4zDåvíq³…_ÛñìÑàíשּׁ5·5‰wMB?Q!4H|¬m†î 4æÊÚҎ®¯#<Õ_ø5üS“ Aà€_€AwÏ#H|ø[¶xeðgC(ŽèÛÐc¯9¢NSô'ž=´ýP?q{lJTm··nßã÷dÚ×a¶`o¹÷¥AcˆùÄ8èùþZ§¾ ÓSVqhºdš{Òs#.Ý8õØW‚¸TZ"³´è|ß~>Ö¦j¤GÀu~wv’Ä"ðÉç:KaHšýnæ®…È?1œCÐýx˜™jf©ÎNÔté!Á×SbÓ^Et¿boœÎ(T¯@qœné”ÕïQtæ"+üfÑrš¶y:´c‘åOßÐÉ'2œeŸùÛ±aOˆg/®äâ*ÚpÿÔ_óǽ•C?”(LÀ¨*±ÿÿrÇ {#‚ÓUvÖ”BñÄ£rAg¡‰†Y/ÐÄ»=8†/PIØê«a4„oˆ¿×xÁÄ{ÜWާyYÇš‚|¿¶Ü(L/­)MÁŽÐ+|FyŠœÔ6g_÷û2Øïìå#Pä—UžDêTî GäÊ™Ò`Ä¥i"ׁ` ã’]²’ RÈÓóœòã¾­Ë—’¢<ó³`J£ zpÜi,øÌŒ ƒÅÞ:o[ _`Äߊ͂ÄO¢ì”'03êϼª´ÙlÎf¾pÎm9•ó‰Îþg¬HãŠ3¸Èûm¨êúzrV¦¸áÔ… G”s†æxÒã ðû4žÙË]@*˜F'މ#‰‰NŒ{Ö‰;ÚSóûE+Òè¿Èh³“Œ6ö~dÈØöÁv×sÎuyd’ùÑ\A½Ç@wÐQúT-%94(¥^Ya0aô(¯;ÁŒr˜QìW(œŠÒõÂŒ½=[&¤­™C N¡XC<}FžµHÞ–‚5¤yÁ°"ÂJfW^DÖƒ5§aÕ«±yÉèSȽ=ðäíðÑóaög1¦ø¨Rl.Ð)BÖ¥qSå§™úz:È…»‘â™.!饻Ѝ4ð¡Þÿ¢Ì(õó{‹”7‡¸À‰’Š!QR§ä¹d].r îV‡ÃF¡) ò»êüÝ@ù]èÂM¸0Q(u’ù´°I["NÃHPjæÁžÛ{ËÙõÉÆ@‰Û5¼••p!”Q×>Xî£imI–{ïvbÙnD,Héx¢Â€i\cOÒЏýu|’)ˆ!“Uºên?ˆ¬SæOôöÄâáCÉgJºå0G¾>Çñ]»àú®ïögaÝÎuã “»eš3­,Úá•ÔcøóÎósƒÁ: ð“#´"·æÁªïGšW®JäÅ;ƒ×ÃI–‡¿à‘ UéN…¢(¨2ls¶ßyš‰c3zùÙeå ¥aš-»É0ͧŒ%ónÇþ ôŒ´&Þ¯lBœh¦l=Ì—“ã§H´€~ìBӍ%^Ö@±ò£xªlèõ®³öõo?¬ *R¾Îã3NÁ­%í:S—îÑ%ô³øL x-!{þq¡!€ ɬµt%xœO=6äœØuή‚)rp ŒÏêE[– Œ„™²mdkJ\—gɲC±G½ëÄ{ÍVXKþèlPÆ$:79eÏæàÊ©úߺâ<ôÞ |Ì$ÅG8¿¨­q~†å³¬ãÒÐöpÌl‡BïÝ>ç Ž?RùŠ1‹Á.³5’ÜÅèíX—ܾå;Çqà¸[Ë­ÔuP§"%êʝª)¬ÛER/Ü)ÊÙàî±ú˺7^À£—9'Œ'W^#ð)Ÿ;{àX)ƒ±X¿ Ó”¥Í]E5‚P½;4Vv:økÙfa¾Öî)Ýåû(þð½"^TÃ)1§V$Ÿ”*Ø#ݤÈçCù‚‡ntí§#°&¾îbQÃtÏ=ò„L‰°!Ï ¬j~’„Ñù}:ýѲZÜO¼ðÆPöM¹íÁ4 Ùrí©¯²xô$¦7"wKºš¯BÆ’€¥}užßYº¡**~'X¹"= p{ þ±Ü¡¢¬$„†¢Àß?~ä߃¡¸ž_Mî×xžB2•,Ýþ%‡b_«ÉáÉ[à¬Î>´÷®8>ý[€…'â·||6¸”jpíÀü§zAêì2—°áKRaUçéü€LI4=5b»W¼ëeqI,rÂÉIÉ>÷ébðÛQΡ¼-D®¹!ÑË"zMC28†WQÁ¶Âà0òl½u"?{åǮ싗V¹N;C2Õ©TPpyî—#ævñâgìgÙŠ]L¥<< /Length 2891 /Filter /FlateDecode >> stream xÚ¥Y[sã¶~ß_á·Ð3BàíÑéî6n×7v“é4MÁ³©’”ýûž(R¦·Ý鋈ëÁÁ¹~úáîÝ÷Mv–«<‰’³»Ç3mŒJ“ì,É#¥Ãøìn}öÏ :_é0ƒ›óÌ—çQüùÃùÊ|<ώdÁß?aóއ¼üüþÓ‡ŸÏÿu÷—ï?êdBߘL¥FŸ…L9Á%g+Á©Y «àCSWÃùʆYPõøÍƒýŽûCËdm8!kS•ä©§ºÛ»ßÂ8ÌáG/0ac•,=>g»«ÝÖ5·=×AÑÀŃâÉU] xÍÞò–€öžÅ«YдBiÖ{/]Û<ñ,…ÅCíxŠ#®*]1øu͍\HH»]Ew|‚Ûör¢lß1õî±Å{w[!¾Á岿õkŠ]'œßc¨Ú¦Wpa£ƒ» ì‰r°wUYÔ¢™x¢™4Q:÷š!ãêœûáöý’ʵŠÁtÿW•[•Æ£Œºî™)”m”G QÐցÛe犡…½>Z‡©2Y2žý|¾JBøÐU®_8=‰À<Ü´ âºj¾ ŒV&q+ZIž€ =9èu<Ž&&ó<}ýžv bàp° ê4э&ñ¼½'‰,(X«ÌZ¿N-ÊUh㩽܃Â\÷5«É´JŽ{çÖ½\Eü׀ÿFƈPñߺnÉ1Jt¾×Œ˜Xic—¬ç°t±TeÑñ^àMipõè£9·ö>M-–iUV;8¾çQR|û O»5÷EɳU*¸[óZO‰D1Ý,‚;Û¹A amËËÆ×_ðó£Èówý’Î!Ø8: è¾® æ-Æq¿N˜+Û-ݎ/ $ÚÆF%éI´ýˆkÄ#W6 A&́[uLُCK쿎[¹VöͰ5çÙ(êW¨À`ɧz?˜åe°Ä8-ñöÐèk¸üø$yp;Ñ,_»-_jɦV‘Ñ*:Qݦ h&DûÚçjÄp„ƒB·o Ñp XŠ‹V…éx¹þЗCþ‘©/®kTµ+U¿ÙÞï{w¿Û–B¦ëŠ¢Ñ0åùö€y0úÒ³r£,QËçwÚ÷¢ŒzÁ#•é‘ß›ÿq»À Xã1v¯$©(ÿrÍßöáwWܦ, ߇¢ü­™ëA{TÏ»'ÉHšÜÜFœ4qÎ5²©ãX¿¯å˜J.'*N[ Cè/4f<@ŸyH™è#€Á/Ö¾Pí.$84²~}Ú£NAäÜŒLL‘ÓŸI’ÁoÇ¢þ¦ÉEâ¨Nì½ÚªÜž˜ì•HÁ{‘—-0¸g_m«š9â6ßEÓ䉁|Ì3`ŸÈé¾hÚæ«vjRe3;±ScBo§xæ#K¸t;M’WºZd*æÿe™Úµ^™Ï0ÁæÚó(Ú)»J¦ýÔuÛ¶í¾çñ™ù@bÂòÀhc@ w›J–¿à\1AÍt"Ä_¾ý,¦Âíí˜øo(J÷ÃSçnÿöiAq¬¬áàŒSÈ5Ò+$9=·ÕZr“¤#@Ϯ۸b-½Ç“i²vø­f·EF×MéSLŒ*;±ÒKXY ²rÜû-4¶q«§Hp˜³ÝIèeø—sEß)°}ë=ðˆw)l#Ô"÷D¤°˜/¤M™å¯wS¦á|¸àRTÂéÜ¿÷ÎgÝ9ðΔ0ÿÍ,³);Â+xŒi a[F~ôu@ã’˜·©´Â% ©ŠÁ‰©†q\´Ãb#‡bã’‡÷²Àþ*MUG'¡FʇèíŠq‚4@wqñ$xÆ×@›b·fbôöqçõõåÍýçŸ>ßßþzy³pð–†ù,˜˜ l÷µØ± |î€íu4×ûÒ­óšüŒõÑmušCcÜQ°I ze@:Šƒ›Î­vØ¡˜Û×\ð¬LêsFÊ9ÃDâJ)FxXŒ®ôš{ŒßPÏæ"ÔÏ´%`yQ’‹5&¨¹mûE u¨ú€/z®½}½D±ÅÎÔèÎ>-Z*Ä»Ð},°x¦“¸°Bò¥SœÞÍb%»®‰ý4‡mÃæB°…(‰®Ü]XP”¥ÔT¾üϏ+güââ1,ᬯõÚ96Ë,[è¹?JÂ^€jž—òE”A[O’ؽ@’%(kçåœÔ-’ ¬æl PDjš4( У‚õ™Âj !©®ç‘q7aÓÀ7óL´aFœ‰!GØ’°Ë¶éŠ÷Ž{û¨â8øùÓÕõÕÝýõ‡ëO?ýé¯Bmƒ‰Ú²Á‘çp‘9¾¾GèLzXÄ¡ÿO‚²@g[ü~,Xqnní8FåY–½U7ÓßAæþJM-+âlá`^Bgò¨ß¸Ã‚¼aß9)xun `:-ø'/äÚ'&üסÝr‘F>#²è\”`…_ëÁ4NjÉ`ÙoÈX»M1!`=Iú9ĽìCJ0ø>×£§€?óßa0TÖò˜Êão_877mœ®šj¨ŠZ¦_% # Ȉ ˜È“´†-’‚õÇü8Y?ˏ6Ú¹'–º¶c ¦Íôo7  n÷LpÈšÌ?~hüûdÅõ¼ê˜µa·ÓA½š˜u½^ [Q¤²8þ–'(#×R ¢'

Lisp implementation in sed

$
0
0
README.md

Lisp implementation in (GNU) sed

How to Use

$ sed -f sedlisp.sed  # '>' won't be shown.
> (car (quote (a b c)))
a
> (cdr (quote (a b c)))
(b c)
> (cons 1 (cons 2 (cons 3 ())))
(1 2 3)
> (defun fact (n) (if (eq n 0) 1 (* n (fact (- n 1)))))
(lambda (n) (if (eq n 0) 1 (* n (fact (- n 1)))))
> (fact 10)
3628800
> (defun fib (n) (if (eq n 1) 1 (if (eq n 0) 1 (+ (fib (- n 1)) (fib (- n 2))))))
(lambda (n) (if (eq n 1) 1 (if (eq n 0) 1 (+ (fib (- n 1)) (fib (- n 2))))))
> (fib 12)
233
> (defun gen (n) ((lambda (x y) y) (define G n) (lambda (m) (define G (+ G m)))))
(lambda (n) ((lambda (x y) y) (define G n) (lambda (m) (define G (+ G m)))))
> (define x (gen 100))
(lambda (m) (define G (+ G m)))
> (x 10)
110
> (x 90)
200
> (x 300)
500

Builtin Functions

  • car
  • cdr
  • cons
  • eq
  • atom
  • +, -, *, /, mod
  • neg?
  • print

Special Forms

  • quote
  • if
  • lambda
  • defun
  • define

More Complicated Examples

You can test a few more examples.

FizzBuzz:

$ cat fizzbuzz.l | sed -f sedlisp.sed
(lambda (n) (if (eq n 101) nil (if (print (if (eq (mod n 15) 0) FizzBuzz (if (eq (mod n 5) 0) Buzz (if (eq (mod n 3) 0) Fizz n)))) (fizzbuzz (+ n 1)) nil)))
PRINT: 1
PRINT: 2
PRINT: Fizz
...
PRINT: 98
PRINT: Fizz
PRINT: Buzz
nil

Sort:

$ cat sort.l /dev/stdin | sed -f sedlisp.sed
...
(sort (quote (4 2)))
(2 4)
(sort (quote (4 2 99 12 -4 -7)))
(-7 -4 2 4 12 99)

Though this Lisp implementation does not support eval function, we can implement eval on top of this interpreter - eval.l is the implementation:

$ cat eval.l /dev/stdin | sed -f sedlisp.sed
(eval (quote (+ 4 38)))
42
(eval (quote (defun fact (n) (if (eq n 0) 1 (* n (fact (- n 1)))))))
(fact (lambda (n) (if (eq n 0) 1 (* n (fact (- n 1))))))
(eval (quote (fact 4)))  ; Takes 10 seconds or so.
24

This essentially means we have a Lisp interpreter in Lisp. evalify.rb is a helper script to convert a normal Lisp program into the Lisp in Lisp. You can run the FizzBuzz program like:

$ ./evalify.rb fizzbuzz.l | sed -f sedlisp.sed
...
PRINT: 1
PRINT: 2
PRINT: Fizz

This takes very long time. For me, it took 45 minutes.

Though sedlisp.sed does not support defmacro, eval.l also defines defmacro:

$ ./evalify.rb | sed -f sedlisp.sed
(defmacro let (l e) (cons (cons lambda (cons (cons (car l) nil) (cons e nil))) (cons (car (cdr l)) nil)))
(let (x 42) (+ x 7))  ; Hit ^d after this.
...
49
$ ./evalify.rb | sed -f sedlisp.sed
(defun list0 (a) (cons a nil))
(defun cadr (a) (car (cdr a)))
(defmacro cond (l) (if l (cons if (cons (car (car l)) (cons (cadr (car l)) (cons (cons (quote cond) (list0 (cdr l))))))) nil))
(defun fb (n) (cond (((eq (mod n 5) 0) "Buzz") ((eq (mod n 3) 0) "Fizz") (t n))))
(fb 18)  ; Hit ^d after this. This will take about one minute.
...
Fizz

You can apply ./evalify.rb multiple times. However, sedlisp seems to be too slow to run the generated program. purelisp.rb, which is a reference implementation of sedlisp, can run it:

$ ./evalify.rb fizzbuzz.l | ./evalify.rb | ruby purelisp.rb
...
PRINT: 1
PRINT: 2
PRINT: Fizz
PRINT: 4
PRINT: Buzz
PRINT: Fizz
PRINT: 7
PRINT: 8

test.l is the test program I was using during the development. test.rb runs it with sedlisp.sed and purelisp.rb and compare their results. You can run the test with evalify.rb by passing -e:

$ ./test.rb -e

Limitations

There should be a lot of limitations. sedlisp behaves very strangely when you pass a broken Lisp code.

I don't know how many GNU extensions I used, so it would not be easy to port this to other sed implementations.

Letter to the Patent Office From Professor Donald Knuth (1994)

$
0
0
Letter to the Patent Office from Professor Donald Knuth. Programming Freedom.N11.Feb95.

Programming Freedom - February 1995 - Number 11

League For Programming Freedom
1 Kendall Square #143
P.O. Box 9171
Cambridge, MA 02139

Programming Freedom is the Newsletter of The League For Programming Freedom. Visit our web page: http://lpf.ai.mit.edu . Reproduction of Programming Freedom via all media is encouraged. To reproduce a signed article individually, please contact the author for permission.


Professor Donald Knuth of Stanford University is the world's leading authority on algorithms. His magnum opus, the three volume work the "The Art of Computer Programming," is the most important reference work on algorithms. Knuth also developed the mathematical text formatter TeX and the idea of "literate programming". Supporting evidence of Knuth's position are the following distinctions:

National Medal of Science
Member, National Academy of Sciences
Member, National Academy of Engineering
Fellow, American Academy of Arts and Sciences
Turing Award, Association for Computing Machinery
18 Honorary Doctorates

The first four of these distinctions are the highest American awards for scientists. Since there is no Nobel prize in computing, the receipt of the Turing award is often regarded as having a similar status.

Through these honors, Knuth is perhaps the most distinguished living exponent of the field of computer science. He is also now a member of the League for Programming Freedom.

Here is the letter he sent in February 1994 to the Patent Commissioner on the subject of software patents.

Commissioner of Patents and Trademarks
Box 4
Patent and Trademark Office
Washington, DC 20231

Dear Commissioner:

Along with many other computer scientists, I would like to ask you to 
reconsider the current policy of giving patents for computational 
processes.  I find a considerable anxiety throughout the community of 
practicing computer scientists that decisions by the patent courts and the 
Patent and Trademark Office are making life much more difficult for 
programmers.

In the period 1945-1980, it was generally believed that patent law did not 
pertain to software.  However, it now appears that some people have 
received patents for algorithms of practical importance - e.g., Lempel-Ziv 
compression and RSA public key encryption - and are now legally preventing 
other programmers from using these algorithms.

This is a serious change from the previous policy under which the computer 
revolution became possible, and I fear this change will be harmful for 
society.  It certainly would have had a profoundly negative effect on my 
own work: For example, I developed software called TeX that is now used to 
produce more than 90% of all books and journals in mathematics and physics 
and to produce hundreds of thousands of technical reports in all scientific 
disciplines.  If software patents had been commonplace in 1980, I would not 
have been able to create such a system, nor would I probably have ever 
thought of doing it, nor can I imagine anyone else doing so.

I am told that the courts are trying to make a distinction between 
mathematical algorithms and nonmathematical algorithms.  To a computer 
scientist, this makes no sense, because every algorithm is as mathematical 
as anything could be.  An algorithm is an abstract concept unrelated to 
physical laws of the universe.

Nor is it possible to distinguish between "numerical" and "nonnumerical" 
algorithms, as if numbers were somehow different from other kinds of 
precise information.  All data are numbers, and all numbers are data.  
Mathematicians work much more with symbolic entities than with numbers.

Therefore the idea of passing laws that say some kinds of algorithms belong 
to mathematics and some do not strikes me as absurd as the 19th century 
attempts of the Indiana legislature to pass a law that the ratio of a 
circle's circumference to its diameter is exactly 3, not approximately 
3.1416.  It's like the medieval church ruling that the sun revolves about 
the earth.  Man-made laws can be significantly helpful but not when they 
contradict fundamental truths.

Congress wisely decided long ago that mathematical things cannot be 
patented.  Surely nobody could apply mathematics if it were necessary to 
pay a license fee whenever the theorem of Pythagoras is employed.  The 
basic algorithmic ideas that people are now rushing to patent are so 
fundamental, the result threatens to be like what would happen if we 
allowed authors to have patents on individual words and concepts.  
Novelists or journalists would be unable to write stories unless their 
publishers had permission from the owners of the words.  Algorithms are 
exactly as basic to software as words are to writers, because they are the 
fundamental building blocks needed to make interesting products.  What 
would happen if individual lawyers could patent their methods of defense, 
or if Supreme Court justices could patent their precedents?

I realize that the patent courts try their best to serve society when they 
formulate patent law.  The Patent Office has fulfilled this mission 
admirably with respect to aspects of technology that involve concrete laws 
of physics rather than abstract laws of thought.  I myself have a few 
patents on hardware devices.  But I strongly believe that the recent trend 
to patenting algorithms is of benefit only to a very small number of 
attorneys and inventors, while it is seriously harmful to the vast majority 
of people who want to do useful things with computers.

When I think of the computer programs I require daily to get my own work 
done, I cannot help but realize that none of them would exist today if 
software patents had been prevalent in the 1960s and 1970s.  Changing the 
rules now will have the effect of freezing progress at essentially its 
current level.  If present trends continue, the only recourse available to 
the majority of America's brilliant software developers will be to give up 
software or to emigrate.  The U.S.A.  will soon lose its dominant position.

Please do what you can to reverse this alarming trend.  There are far 
better ways to protect the intellectual property rights of software 
developers than to take away their right to use fundamental building 
blocks.

Sincerely,
Donald E. Knuth
Professor Emeritus

http://lpf.ai.mit.edu

Letter to the Patent Office from Professor Donald Knuth. Programming Freedom.N11.Feb95.

Programming Freedom - February 1995 - Number 11

League For Programming Freedom
1 Kendall Square #143
P.O. Box 9171
Cambridge, MA 02139

Programming Freedom is the Newsletter of The League For Programming Freedom. Visit our web page: http://lpf.ai.mit.edu . Reproduction of Programming Freedom via all media is encouraged. To reproduce a signed article individually, please contact the author for permission.


Professor Donald Knuth of Stanford University is the world's leading authority on algorithms. His magnum opus, the three volume work the "The Art of Computer Programming," is the most important reference work on algorithms. Knuth also developed the mathematical text formatter TeX and the idea of "literate programming". Supporting evidence of Knuth's position are the following distinctions:

National Medal of Science
Member, National Academy of Sciences
Member, National Academy of Engineering
Fellow, American Academy of Arts and Sciences
Turing Award, Association for Computing Machinery
18 Honorary Doctorates

The first four of these distinctions are the highest American awards for scientists. Since there is no Nobel prize in computing, the receipt of the Turing award is often regarded as having a similar status.

Through these honors, Knuth is perhaps the most distinguished living exponent of the field of computer science. He is also now a member of the League for Programming Freedom.

Here is the letter he sent in February 1994 to the Patent Commissioner on the subject of software patents.

Commissioner of Patents and Trademarks
Box 4
Patent and Trademark Office
Washington, DC 20231

Dear Commissioner:

Along with many other computer scientists, I would like to ask you to 
reconsider the current policy of giving patents for computational 
processes.  I find a considerable anxiety throughout the community of 
practicing computer scientists that decisions by the patent courts and the 
Patent and Trademark Office are making life much more difficult for 
programmers.

In the period 1945-1980, it was generally believed that patent law did not 
pertain to software.  However, it now appears that some people have 
received patents for algorithms of practical importance - e.g., Lempel-Ziv 
compression and RSA public key encryption - and are now legally preventing 
other programmers from using these algorithms.

This is a serious change from the previous policy under which the computer 
revolution became possible, and I fear this change will be harmful for 
society.  It certainly would have had a profoundly negative effect on my 
own work: For example, I developed software called TeX that is now used to 
produce more than 90% of all books and journals in mathematics and physics 
and to produce hundreds of thousands of technical reports in all scientific 
disciplines.  If software patents had been commonplace in 1980, I would not 
have been able to create such a system, nor would I probably have ever 
thought of doing it, nor can I imagine anyone else doing so.

I am told that the courts are trying to make a distinction between 
mathematical algorithms and nonmathematical algorithms.  To a computer 
scientist, this makes no sense, because every algorithm is as mathematical 
as anything could be.  An algorithm is an abstract concept unrelated to 
physical laws of the universe.

Nor is it possible to distinguish between "numerical" and "nonnumerical" 
algorithms, as if numbers were somehow different from other kinds of 
precise information.  All data are numbers, and all numbers are data.  
Mathematicians work much more with symbolic entities than with numbers.

Therefore the idea of passing laws that say some kinds of algorithms belong 
to mathematics and some do not strikes me as absurd as the 19th century 
attempts of the Indiana legislature to pass a law that the ratio of a 
circle's circumference to its diameter is exactly 3, not approximately 
3.1416.  It's like the medieval church ruling that the sun revolves about 
the earth.  Man-made laws can be significantly helpful but not when they 
contradict fundamental truths.

Congress wisely decided long ago that mathematical things cannot be 
patented.  Surely nobody could apply mathematics if it were necessary to 
pay a license fee whenever the theorem of Pythagoras is employed.  The 
basic algorithmic ideas that people are now rushing to patent are so 
fundamental, the result threatens to be like what would happen if we 
allowed authors to have patents on individual words and concepts.  
Novelists or journalists would be unable to write stories unless their 
publishers had permission from the owners of the words.  Algorithms are 
exactly as basic to software as words are to writers, because they are the 
fundamental building blocks needed to make interesting products.  What 
would happen if individual lawyers could patent their methods of defense, 
or if Supreme Court justices could patent their precedents?

I realize that the patent courts try their best to serve society when they 
formulate patent law.  The Patent Office has fulfilled this mission 
admirably with respect to aspects of technology that involve concrete laws 
of physics rather than abstract laws of thought.  I myself have a few 
patents on hardware devices.  But I strongly believe that the recent trend 
to patenting algorithms is of benefit only to a very small number of 
attorneys and inventors, while it is seriously harmful to the vast majority 
of people who want to do useful things with computers.

When I think of the computer programs I require daily to get my own work 
done, I cannot help but realize that none of them would exist today if 
software patents had been prevalent in the 1960s and 1970s.  Changing the 
rules now will have the effect of freezing progress at essentially its 
current level.  If present trends continue, the only recourse available to 
the majority of America's brilliant software developers will be to give up 
software or to emigrate.  The U.S.A.  will soon lose its dominant position.

Please do what you can to reverse this alarming trend.  There are far 
better ways to protect the intellectual property rights of software 
developers than to take away their right to use fundamental building 
blocks.

Sincerely,
Donald E. Knuth
Professor Emeritus

http://lpf.ai.mit.edu

Viewing all 737 articles
Browse latest View live