From e34fab01c82e8f8b68a03e42da47fae5a24dcee5 Mon Sep 17 00:00:00 2001
From: vinibrsl
See
- Similar to Example: Similar to Example:insert_all/2
but with the following differences:Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+
insert_all/2
but with the following differences:
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
Cldr.LanguageTag
.
The format of an Accept-Language
header is as follows in ABNF
format:
Accept-Language = "Accept-Language" ":"
1#( language-range [ ";" "q" "=" qvalue ] )
- language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an + language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
Each language-range MAY be given an associated quality value which represents an estimate of the user's preference for the languages specified by that range. The quality value defaults to "q=1". For example,
Accept-Language: da, en-gb;q=0.8, en;q=0.7
would mean: "I prefer Danish, but will accept British English and other types of English."
@@ -232,54 +232,54 @@ a configurediex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
-{:error,
- {Cldr.NoMatchingLocale,
- "No configured locale could be matched to \"xx,yy;q=0.3\""}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
+{:error,
+ {Cldr.NoMatchingLocale,
+ "No configured locale could be matched to \"xx,yy;q=0.3\""}}
-iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
-{:error, {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
+{:error, {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
- ]}
+ transform: %{},
+ language_variants: []
+ }}
+ ]}
-iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
-{:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
+{:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
-{:ok,
- [
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
+{:ok,
+ [
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
- ]}
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+ ]}
iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }}
-]
+ transform: %{},
+ language_variants: []
+ }}
+]
Plausible.Cldr.AcceptLanguage.parse! "invalid_tag"
** (Cldr.AcceptLanguageError) "Expected a BCP47 language tag. Could not parse the remaining "g" starting at position 11
(ex_cldr) lib/cldr/accept_language.ex:304: Cldr.AcceptLanguage.parse!/1
-iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
-[
- {1.0,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
+[
+ {1.0,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "da",
cldr_locale_name: :da,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "da",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :da,
requested_locale_name: "da",
script: :Latn,
territory: :DK,
- transform: %{},
- language_variants: []
- }},
- {0.3,
- %Cldr.LanguageTag{
+ transform: %{},
+ language_variants: []
+ }},
+ {0.3,
+ %Cldr.LanguageTag{
backend: TestBackend.Cldr,
canonical_locale_name: "zh-TW",
cldr_locale_name: :"zh-Hant",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: nil,
language: "zh",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :"zh-Hant",
requested_locale_name: "zh-TW",
script: :Hant,
territory: :TW,
- transform: %{},
- language_variants: []
- }},
- {:error,
- {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-]
+ transform: %{},
+ language_variants: []
+ }},
+ {:error,
+ {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+]
:all
. See FJD: %Cldr.Currency{
+ %{ FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -404,12 +404,12 @@ The default is :all
. See symbol: "FJD",
tender: true,
to: nil
- },
- SUR: %Cldr.Currency{
+ },
+ SUR: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "SUR",
- count: %{one: "Soviet rouble", other: "Soviet roubles"},
+ count: %{one: "Soviet rouble", other: "Soviet roubles"},
digits: 2,
from: nil,
iso_digits: nil,
@@ -419,7 +419,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
- },
+ },
...
}}
@@ -470,11 +470,11 @@ The default is :all
. See FJD: %Cldr.Currency{
+ => %{FJD: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "FJD",
- count: %{one: "Fijian dollar", other: "Fijian dollars"},
+ count: %{one: "Fijian dollar", other: "Fijian dollars"},
digits: 2,
from: nil,
iso_digits: 2,
@@ -484,12 +484,12 @@ The default is :all
. See symbol: "FJD",
tender: true,
to: nil
-},
-SUR: %Cldr.Currency{
+},
+SUR: %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "SUR",
- count: %{one: "Soviet rouble", other: "Soviet roubles"},
+ count: %{one: "Soviet rouble", other: "Soviet roubles"},
digits: 2,
from: nil,
iso_digits: nil,
@@ -499,7 +499,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
-},
+},
...
}
@@ -557,13 +557,13 @@ or a
-iex> Plausible.Cldr.Currency.currency_for_code("AUD")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("AUD")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -571,15 +571,15 @@ or a rounding: 0,
symbol: "A$",
tender: true
-}}
+}}
-iex> Plausible.Cldr.Currency.currency_for_code("THB")
-{:ok,
- %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("THB")
+{:ok,
+ %Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "THB",
- count: %{one: "Thai baht", other: "Thai baht"},
+ count: %{one: "Thai baht", other: "Thai baht"},
digits: 2,
iso_digits: 2,
name: "Thai Baht",
@@ -587,7 +587,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}}
+}}
@@ -646,12 +646,12 @@ or a
-iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "AUD",
- count: %{one: "Australian dollar", other: "Australian dollars"},
+ count: %{one: "Australian dollar", other: "Australian dollars"},
digits: 2,
iso_digits: 2,
name: "Australian Dollar",
@@ -659,14 +659,14 @@ or a rounding: 0,
symbol: "A$",
tender: true
-}
+}
-iex> Plausible.Cldr.Currency.currency_for_code!("THB")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("THB")
+%Cldr.Currency{
cash_digits: 2,
cash_rounding: 0,
code: "THB",
- count: %{one: "Thai baht", other: "Thai baht"},
+ count: %{one: "Thai baht", other: "Thai baht"},
digits: 2,
iso_digits: 2,
name: "Thai Baht",
@@ -674,7 +674,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}
+}
@@ -715,11 +715,11 @@ or a
-iex> {:ok, locale} = Plausible.Cldr.validate_locale "en"
+iex> {:ok, locale} = Plausible.Cldr.validate_locale "en"
iex> Plausible.Cldr.Currency.currency_from_locale locale
:USD
-iex> {:ok, locale} = Plausible.Cldr.validate_locale "en-AU"
+iex> {:ok, locale} = Plausible.Cldr.validate_locale "en-AU"
iex> Plausible.Cldr.Currency.currency_from_locale locale
:AUD
@@ -768,13 +768,13 @@ or a
iex> MyApp.Cldr.Currency.currency_history_for_locale "en"
-{:ok,
- %{
- USD: %{from: ~D[1792-01-01], to: nil},
- USN: %{tender: false},
- USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
- }
-}
+
{:ok,
+ %{
+ USD: %{from: ~D[1792-01-01], to: nil},
+ USN: %{tender: false},
+ USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
+ }
+}
@@ -834,8 +834,8 @@ The default is :all
. See MyApp.Cldr.Currency.currency_strings "en"
-=> {:ok,
- %{
+=> {:ok,
+ %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -845,7 +845,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }}
+ }}
:all
. See MyApp.Cldr.Currency.currency_strings! "en"
-=> %{
+=> %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -915,7 +915,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }
+ iex> Plausible.Cldr.Currency.current_territory_currencies()
0.05
. Optional.iex> Plausible.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0)
+{:ok,
+ %Cldr.Currency{
alt_code: :XAE,
cash_digits: 0,
cash_rounding: nil,
code: :XAE,
- count: %{other: "Custom Name"},
+ count: %{other: "Custom Name"},
digits: 0,
from: nil,
iso_digits: 0,
@@ -1264,11 +1264,11 @@ such as 0.05
. Optional.symbol
: "XAE",
tender: false,
to: nil
- }}
-iex> MyApp.Cldr.Currency.new(:XAH, name: "Custom Name")
-{:error, "Required options are missing. Required options are [:name, :digits]"}
-iex> Plausible.Cldr.Currency.new(:XAE, name: "XAE", digits: 0)
-{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}
+ }}
+iex> MyApp.Cldr.Currency.new(:XAH, name: "Custom Name")
+{:error, "Required options are missing. Required options are [:name, :digits]"}
+iex> Plausible.Cldr.Currency.new(:XAE, name: "XAE", digits: 0)
+{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}
Plaus
iex> Plausible.Cldr.Currency.pluralize 1, :USD
-{:ok, "US dollar"}
+{:ok, "US dollar"}
iex> Plausible.Cldr.Currency.pluralize 3, :USD
-{:ok, "US dollars"}
+{:ok, "US dollars"}
iex> Plausible.Cldr.Currency.pluralize 12, :USD, locale: "zh"
-{:ok, "美元"}
+{:ok, "美元"}
iex> Plausible.Cldr.Currency.pluralize 12, :USD, locale: "fr"
-{:ok, "dollars des États-Unis"}
+{:ok, "dollars des États-Unis"}
iex> Plausible.Cldr.Currency.pluralize 1, :USD, locale: "fr"
-{:ok, "dollar des États-Unis"}
+{:ok, "dollar des États-Unis"}
iex> MyApp.Cldr.Currency.strings_for_currency :AUD, "en"
-["a$", "australian dollars", "aud", "australian dollar"]
+["a$", "australian dollars", "aud", "australian dollar"]
iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA")
+{:ok, [:"fr-CA", :fr, :und]}
# Fallbacks are typically formed by progressively
# stripping variant, territory and script from the
# given locale name. But not always - there are
# certain fallbacks that take a different path.
-iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)
-{:ok, [:nb, :no, :und]}
+iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)
+{:ok, [:nb, :no, :und]}
Plausible.Cldr.Locale.fallback_locales(:"fr-CA")
+=> {:ok,
+ [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
+ #Cldr.LanguageTag<und [validated]>]}
# Fallbacks are typically formed by progressively
# stripping variant, territory and script from the
# given locale name. But not always - there are
# certain fallbacks that take a different path.
-Plausible.Cldr.Locale.fallback_locales(:nb))
-=> {:ok,
- [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
- #Cldr.LanguageTag<und [validated]>]}
+Plausible.Cldr.Locale.fallback_locales(:nb))
+=> {:ok,
+ [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
+ #Cldr.LanguageTag<und [validated]>]}
iex> Cldr.Locale.territory_from_host("a.b.com.au")
+{:ok, :AU}
-iex> Cldr.Locale.territory_from_host("a.b.com")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
+iex> Cldr.Locale.territory_from_host("a.b.com")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
:zero
, iex> Plausible.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
nil
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
"few"
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
"other"
iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
-{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
+iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
+{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
"0 billion", "0 million", "0 thousand",
"0 trillion", "00 billion", "00 million", "00 thousand", "00 trillion",
"000 billion", "000 million", "000 thousand", "000 trillion", "000B", "000K",
@@ -506,7 +506,7 @@ the known formats at compile time. Its use is not otherwise recommended."¤#,##0.00", "¤#,##0.00;(¤#,##0.00)", "¤000B", "¤000K", "¤000M",
"¤000T", "¤00B", "¤00K", "¤00M", "¤00T", "¤0B", "¤0K", "¤0M", "¤0T",
"¤ #,##0.00", "¤ #,##0.00;(¤ #,##0.00)", "¤ 000B", "¤ 000K", "¤ 000M",
- "¤ 000T", "¤ 00B", "¤ 00K", "¤ 00M", "¤ 00T", "¤ 0B", "¤ 0K", "¤ 0M", "¤ 0T"]}
+ "¤ 000T", "¤ 00B", "¤ 00K", "¤ 00M", "¤ 00T", "¤ 0B", "¤ 0K", "¤ 0M", "¤ 0T"]}
Plausible.Cld
Examples
iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)
-{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
+iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)
+{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
Plausible.Cld
Examples
iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)
-%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
+iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)
+%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
percent: "#,##0 %",
scientific: "#E0",
standard: "#,##0.###"
- currency_short: [{"1000", [one: "0 k ¤", other: "0 k ¤"]},
- {"10000", [one: "00 k ¤", other: "00 k ¤"]},
- {"100000", [one: "000 k ¤", other: "000 k ¤"]},
- {"1000000", [one: "0 M ¤", other: "0 M ¤"]},
- {"10000000", [one: "00 M ¤", other: "00 M ¤"]},
- {"100000000", [one: "000 M ¤", other: "000 M ¤"]},
- {"1000000000", [one: "0 Md ¤", other: "0 Md ¤"]},
- {"10000000000", [one: "00 Md ¤", other: "00 Md ¤"]},
- {"100000000000", [one: "000 Md ¤", other: "000 Md ¤"]},
- {"1000000000000", [one: "0 Bn ¤", other: "0 Bn ¤"]},
- {"10000000000000", [one: "00 Bn ¤", other: "00 Bn ¤"]},
- {"100000000000000", [one: "000 Bn ¤", other: "000 Bn ¤"]}],
+ currency_short: [{"1000", [one: "0 k ¤", other: "0 k ¤"]},
+ {"10000", [one: "00 k ¤", other: "00 k ¤"]},
+ {"100000", [one: "000 k ¤", other: "000 k ¤"]},
+ {"1000000", [one: "0 M ¤", other: "0 M ¤"]},
+ {"10000000", [one: "00 M ¤", other: "00 M ¤"]},
+ {"100000000", [one: "000 M ¤", other: "000 M ¤"]},
+ {"1000000000", [one: "0 Md ¤", other: "0 Md ¤"]},
+ {"10000000000", [one: "00 Md ¤", other: "00 Md ¤"]},
+ {"100000000000", [one: "000 Md ¤", other: "000 Md ¤"]},
+ {"1000000000000", [one: "0 Bn ¤", other: "0 Bn ¤"]},
+ {"10000000000000", [one: "00 Bn ¤", other: "00 Bn ¤"]},
+ {"100000000000000", [one: "000 Bn ¤", other: "000 Bn ¤"]}],
...
}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
-{:ok, 1}
+iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
+{:ok, 1}
Plausible.Cld
Examples
-iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
+iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
1
:zero
, iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
"one"
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
nil
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
"two"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
"other"
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
"other"
diff --git a/Plausible.Cldr.Number.Symbol.html b/Plausible.Cldr.Number.Symbol.html
index 1dc44ddb2..503b7deab 100644
--- a/Plausible.Cldr.Number.Symbol.html
+++ b/Plausible.Cldr.Number.Symbol.html
@@ -349,9 +349,9 @@ is Plausible.Cld
Example:
-iex> Plausible.Cldr.Number.Symbol.number_symbols_for(:th)
-{:ok, %{
- latn: %Cldr.Number.Symbol{
+iex> Plausible.Cldr.Number.Symbol.number_symbols_for(:th)
+{:ok, %{
+ latn: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -364,8 +364,8 @@ is Plausible.Cld
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- },
- thai: %Cldr.Number.Symbol{
+ },
+ thai: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -378,8 +378,8 @@ is Plausible.Cld
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- }
- }}
+ }
+ }}
diff --git a/Plausible.Cldr.Number.System.html b/Plausible.Cldr.Number.System.html
index 1d17039b5..b3a4ca619 100644
--- a/Plausible.Cldr.Number.System.html
+++ b/Plausible.Cldr.Number.System.html
@@ -288,23 +288,23 @@ it is returned as is.iex> Plausible.Cldr.Number.System.number_system_for "th", :latn
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :default
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "he", :traditional
-{:ok, %{rules: "hebrew", type: :algorithmic}}
+{:ok, %{rules: "hebrew", type: :algorithmic}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :native
-{:ok, %{digits: "0123456789", type: :numeric}}
+{:ok, %{digits: "0123456789", type: :numeric}}
iex> Plausible.Cldr.Number.System.number_system_for "en", :finance
-{
+{
:error,
- {Cldr.UnknownNumberSystemError,
- "The number system :finance is unknown for the locale named :en. Valid number systems are %{default: :latn, native: :latn}"}
-}
+ {Cldr.UnknownNumberSystemError,
+ "The number system :finance is unknown for the locale named :en. Valid number systems are %{default: :latn, native: :latn}"}
+}
iex> Plausible.Cldr.Number.System.number_system_names_for "en"
-{:ok, [:latn]}
+{:ok, [:latn]}
iex> Plausible.Cldr.Number.System.number_system_names_for "zz"
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
iex> Plausible.Cldr.Number.System.number_systems_for "en"
-{:ok, %{default: :latn, native: :latn}}
+{:ok, %{default: :latn, native: :latn}}
iex> Plausible.Cldr.Number.System.number_systems_for "th"
-{:ok, %{default: :latn, native: :thai}}
+{:ok, %{default: :latn, native: :thai}}
iex> Plausible.Cldr.Number.System.number_systems_for "zz"
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
ex> Plausible.Cldr.Number.System.system_name_from(:default, "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from("latn", "en")
-{:ok, :latn}
+iex> Plausible.Cldr.Number.System.system_name_from("latn", "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from(:native, "en")
-{:ok, :latn}
+iex> Plausible.Cldr.Number.System.system_name_from(:native, "en")
+{:ok, :latn}
-iex> Plausible.Cldr.Number.System.system_name_from(:nope, "en")
-{
+iex> Plausible.Cldr.Number.System.system_name_from(:nope, "en")
+{
:error,
- {Cldr.UnknownNumberSystemError, "The number system :nope is unknown"}
-}
Note that return value is not guaranteed to be a valid +
{Cldr.UnknownNumberSystemError, "The number system :nope is unknown"} +}Note that return value is not guaranteed to be a valid number system for the given locale as demonstrated in the third example.
To configure these transliteration pairs, add the to the use Cldr
configuration
-in a backend module:
defmodule MyApp.Cldr do
+in a backend module:defmodule MyApp.Cldr do
use Cldr,
- locale: ["en", "fr", "th"],
+ locale: ["en", "fr", "th"],
default_locale: "en",
- precompile_transliterations: [{:latn, :thai}, {:arab, :thai}]
-end
Where each tuple in the list configures one transliteration map. In this example, two maps are
+
precompile_transliterations: [{:latn, :thai}, {:arab, :thai}]
+end
Where each tuple in the list configures one transliteration map. In this example, two maps are
configured: from :latn
to :thai
and from :arab
to :thai
.
A list of configurable number systems is returned by Cldr.Number.System.systems_with_digits/0
.
If a transliteration is requested between two number pairs that have not been configured for precompilation, a warning is logged.
iex> Plausible.Cldr.Number.Transliterate.transliterate("123556")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556")
"123556"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123,556.000", "fr", :default)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123,556.000", "fr", :default)
"123 556,000"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :default)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :default)
"123556"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", "thai")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", "thai")
"๑๒๓๕๕๖"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :native)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :native)
"๑๒๓๕๕๖"
-iex> Plausible.Cldr.Number.Transliterate.transliterate("Some number is: 123556", "th", "thai")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("Some number is: 123556", "th", "thai")
"Some number is: ๑๒๓๕๕๖"
diff --git a/Plausible.Cldr.Number.html b/Plausible.Cldr.Number.html
index 5898f9a64..3d8ae7766 100644
--- a/Plausible.Cldr.Number.html
+++ b/Plausible.Cldr.Number.html
@@ -412,19 +412,19 @@ using the Elixir standard library functions.
-iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de")
-{:ok, 1000.34}
+iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de")
+{:ok, 1000.34}
-iex> Plausible.Cldr.Number.parse("-1_000_000.34")
-{:ok, -1000000.34}
+iex> Plausible.Cldr.Number.parse("-1_000_000.34")
+{:ok, -1000000.34}
-iex> Plausible.Cldr.Number.parse("1.000", locale: "de", number: :integer)
-{:ok, 1000}
+iex> Plausible.Cldr.Number.parse("1.000", locale: "de", number: :integer)
+{:ok, 1000}
-iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de", number: :integer)
-{:error,
- {Cldr.Number.ParseError,
- "The string \"+1.000,34\" could not be parsed as a number"}}
+iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de", number: :integer)
+{:error,
+ {Cldr.Number.ParseError,
+ "The string \"+1.000,34\" could not be parsed as a number"}}
@@ -496,17 +496,17 @@ financial instruments.
-iex> Plausible.Cldr.Number.scan("100 US dollars")
+iex> Plausible.Cldr.Number.scan("100 US dollars")
...> |> Plausible.Cldr.Number.resolve_currencies
-[100, :USD]
+[100, :USD]
-iex> Plausible.Cldr.Number.scan("100 eurosports")
-...> |> Plausible.Cldr.Number.resolve_currencies(fuzzy: 0.75)
-[100, :EUR]
+iex> Plausible.Cldr.Number.scan("100 eurosports")
+...> |> Plausible.Cldr.Number.resolve_currencies(fuzzy: 0.75)
+[100, :EUR]
-iex> Plausible.Cldr.Number.scan("100 dollars des États-Unis")
-...> |> Plausible.Cldr.Number.resolve_currencies(locale: "fr")
-[100, :USD]
+iex> Plausible.Cldr.Number.scan("100 dollars des États-Unis")
+...> |> Plausible.Cldr.Number.resolve_currencies(locale: "fr")
+[100, :USD]
@@ -583,19 +583,19 @@ financial instruments.iex> Plausible.Cldr.Number.resolve_currency("US dollars")
-[:USD]
+iex> Plausible.Cldr.Number.resolve_currency("US dollars")
+[:USD]
-iex> Plausible.Cldr.Number.resolve_currency("100 eurosports", fuzzy: 0.75)
-[:EUR]
+iex> Plausible.Cldr.Number.resolve_currency("100 eurosports", fuzzy: 0.75)
+[:EUR]
-iex> Plausible.Cldr.Number.resolve_currency("dollars des États-Unis", locale: "fr")
-[:USD]
+iex> Plausible.Cldr.Number.resolve_currency("dollars des États-Unis", locale: "fr")
+[:USD]
-iex> Plausible.Cldr.Number.resolve_currency("not a known currency", locale: "fr")
-{:error,
- {Cldr.UnknownCurrencyError,
- "The currency \"not a known currency\" is unknown or not supported"}}
+iex> Plausible.Cldr.Number.resolve_currency("not a known currency", locale: "fr")
+{:error,
+ {Cldr.UnknownCurrencyError,
+ "The currency \"not a known currency\" is unknown or not supported"}}
options[:backend].get_locale()
iex> Plausible.Cldr.Number.resolve_per "11%"
-["11", :percent]
+["11", :percent]
iex> Plausible.Cldr.Number.resolve_per "% of linguists"
-[:percent, " of linguists"]
+[:percent, " of linguists"]
iex> Plausible.Cldr.Number.resolve_per "% of linguists %"
-[:percent, " of linguists ", :percent]
+[:percent, " of linguists ", :percent]
options[:backend].get_locale()
Examples
-iex> Plausible.Cldr.Number.scan("100%")
-...> |> Plausible.Cldr.Number.resolve_pers()
-[100, :percent]
+iex> Plausible.Cldr.Number.scan("100%")
+...> |> Plausible.Cldr.Number.resolve_pers()
+[100, :percent]
iex> Plausible.Cldr.Number.scan("£1_000_000.34")
+["£", 1000000.34]
-iex> Plausible.Cldr.Number.scan("I want £1_000_000 dollars")
-["I want £", 1000000, " dollars"]
+iex> Plausible.Cldr.Number.scan("I want £1_000_000 dollars")
+["I want £", 1000000, " dollars"]
-iex> Plausible.Cldr.Number.scan("The prize is 23")
-["The prize is ", 23]
+iex> Plausible.Cldr.Number.scan("The prize is 23")
+["The prize is ", 23]
-iex> Plausible.Cldr.Number.scan("The lottery number is 23 for the next draw")
-["The lottery number is ", 23, " for the next draw"]
+iex> Plausible.Cldr.Number.scan("The lottery number is 23 for the next draw")
+["The lottery number is ", 23, " for the next draw"]
-iex> Plausible.Cldr.Number.scan("The loss is -1.000 euros", locale: "de", number: :integer)
-["The loss is ", -1000, " euros"]
+iex> Plausible.Cldr.Number.scan("The loss is -1.000 euros", locale: "de", number: :integer)
+["The loss is ", -1000, " euros"]
iex> Plausible.Cldr.Number.to_range_string 1234..5678
-{:ok, "1,234–5,678"}
+{:ok, "1,234–5,678"}
iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
...> string, :currency_symbol -> "<span class=\"symbol\">" <> string <> "</span>"
...> string, :number -> "<span class=\"number\">" <> string <> "</span>"
...> string, :currency_space -> "<span>" <> string <> "</span>"
...> string, _other -> string
-...> end)
-{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
It is also possible and recommended to use the Phoenix.HTML.Tag.content_tag/3
+
It is also possible and recommended to use the Phoenix.HTML.Tag.content_tag/3
function if wrapping HTML tags since these will ensure HTML entities are
-correctly encoded. For example:
iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
-...> string, :currency_symbol -> Phoenix.HTML.Tag.content_tag(:span, string, class: "symbol")
-...> string, :number -> Phoenix.HTML.Tag.content_tag(:span, string, class: "number")
-...> string, :currency_space -> Phoenix.HTML.Tag.content_tag(:span, string)
+correctly encoded. For example:iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
+...> string, :currency_symbol -> Phoenix.HTML.Tag.content_tag(:span, string, class: "symbol")
+...> string, :number -> Phoenix.HTML.Tag.content_tag(:span, string, class: "number")
+...> string, :currency_space -> Phoenix.HTML.Tag.content_tag(:span, string)
...> string, _other -> string
-...> end)
-{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
When formatting a number the format is parsed into format elements that might include
+
...> end)
+{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}
When formatting a number the format is parsed into format elements that might include a currency symbol, a literal string, inserted text between a currency symbol and the currency amount, a percent sign, the number itself and several other elements. In some cases it is helpful to be apply specific formatting to each element. @@ -1139,80 +1139,80 @@ inserted in the final formatted number.
An error tuple {:error, reason}
will be returned if an error is detected.
-The two most likely causes of an error return are:
iex> Plausible.Cldr.Number.to_string(12345, format: "0#")
- {:error, {Cldr.FormatCompileError,
- "Decimal format compiler: syntax error before: \"#\""}}
locale
and
+The two most likely causes of an error return are: iex> Plausible.Cldr.Number.to_string(12345, format: "0#")
+ {:error, {Cldr.FormatCompileError,
+ "Decimal format compiler: syntax error before: \"#\""}}
locale
and
number_system
. This happens typically when the number system is
:algorithmic
rather than the more common :numeric
. In this case the error
-return looks like: iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr")
- {:error, {Cldr.UnknownFormatError,
- "The locale :he with number system :hebr does not define a format :standard"}}
+return looks like: iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr")
+ {:error, {Cldr.UnknownFormatError,
+ "The locale :he with number system :hebr does not define a format :standard"}}
Functions to implement the number system rule-based-number-format rules of CLDR.
These rules are defined only on the "und" locale and represent specialised number formatting.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.NumberSystem.rule_sets(:und)
-...> |> Enum.sort()
-[
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.NumberSystem.rule_sets(:und)
+...> |> Enum.sort()
+[
:armenian_lower,
:armenian_upper,
:cyrillic_lower,
@@ -132,9 +132,9 @@ defined in the Unicode CLDR data repository. Available rules are identified by:
:roman_upper,
:tamil,
:zz_default
-]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.NumberSystem.roman_upper(123, :und)
-"CXXIII"
This particular call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :roman)
-{:ok, "CXXIII"}
+]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.NumberSystem.roman_upper(123, :und)
+"CXXIII"
This particular call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :roman)
+{:ok, "CXXIII"}
Functions to implement the ordinal rule-based-number-format rules of CLDR.
As CLDR notes, the data is incomplete or non-existent for many languages. It is considered complete for English however.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets(:en)
-[:digits_ordinal]
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets(:en)
+[:digits_ordinal]
-iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets("fr")
-...> |> Enum.sort()
-[
+iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets("fr")
+...> |> Enum.sort()
+[
:digits_ordinal,
:digits_ordinal_feminine,
:digits_ordinal_feminine_plural,
:digits_ordinal_masculine,
:digits_ordinal_masculine_plural
-]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.Ordinal.digits_ordinal(123, :en)
-"123rd"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :ordinal)
-{:ok, "123rd"}
+]
A rule can then be invoked on an available rule_set. For example
iex> Plausible.Cldr.Rbnf.Ordinal.digits_ordinal(123, :en)
+"123rd"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :ordinal)
+{:ok, "123rd"}
Functions to implement the spellout rule-based-number-format rules of CLDR.
As CLDR notes, the data is incomplete or non-existent for many languages. It is considered complete for English however.
The standard public API for RBNF is via the Cldr.Number.to_string/2
function.
The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:
iex> Plausible.Cldr.Rbnf.Spellout.rule_sets("en")
-...> |> Enum.sort()
-[
+defined in the Unicode CLDR data repository. Available rules are identified by:iex> Plausible.Cldr.Rbnf.Spellout.rule_sets("en")
+...> |> Enum.sort()
+[
:spellout_cardinal,
:spellout_cardinal_verbose,
:spellout_numbering,
@@ -126,9 +126,9 @@ defined in the Unicode CLDR data repository. Available rules are identified by:
:spellout_numbering_year,
:spellout_ordinal,
:spellout_ordinal_verbose
-]
A rule can then be invoked on an available rule_set. For example:
iex> Plausible.Cldr.Rbnf.Spellout.spellout_ordinal(123, "en")
-"one hundred twenty-third"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :spellout)
-{:ok, "one hundred twenty-three"}
+]
A rule can then be invoked on an available rule_set. For example:
iex> Plausible.Cldr.Rbnf.Spellout.spellout_ordinal(123, "en")
+"one hundred twenty-third"
This call is equivalent to the call through the public API of:
iex> Plausible.Cldr.Number.to_string(123, format: :spellout)
+{:ok, "one hundred twenty-three"}
iex> Plausible.Cldr.default_locale()
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.default_locale()
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en-001",
cldr_locale_name: :"en-001",
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en-001",
script: :Latn,
territory: :"001",
- transform: %{},
- language_variants: []
-}
+ transform: %{},
+ language_variants: []
+}
iex> Plausible.Cldr.default_territory()
:"001"
iex> Plausible.Cldr.ellipsis "And furthermore"
"And furthermore…"
-iex> Plausible.Cldr.ellipsis ["And furthermore", "there is much to be done"], locale: :ja
+iex> Plausible.Cldr.ellipsis ["And furthermore", "there is much to be done"], locale: :ja
"And furthermore…there is much to be done"
iex> Plausible.Cldr.ellipsis "And furthermore", format: :word
"And furthermore …"
-iex> Plausible.Cldr.ellipsis ["And furthermore", "there is much to be done"], locale: :ja, format: :word
+iex> Plausible.Cldr.ellipsis ["And furthermore", "there is much to be done"], locale: :ja, format: :word
"And furthermore … there is much to be done"
@@ -675,23 +675,23 @@ take an optional locale parameter for which a locale is not supplied.iex> Plausible.Cldr.put_locale("pl")
+iex> Plausible.Cldr.put_locale("pl")
iex> Plausible.Cldr.get_locale
-%Cldr.LanguageTag{
+%Cldr.LanguageTag{
backend: Elixir.Plausible.Cldr,
canonical_locale_name: "pl",
cldr_locale_name: :pl,
- extensions: %{},
+ extensions: %{},
language: "pl",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :pl,
territory: :PL,
requested_locale_name: "pl",
script: :Latn,
- transform: %{},
- language_variants: []
- }
+ transform: %{},
+ language_variants: []
+ }
iex> Plausible.Cldr.known_gettext_locale_name?("en")
true
-iex> Plausible.Cldr.known_gettext_locale_name?("!!")
+iex> Plausible.Cldr.known_gettext_locale_name?("!!")
false
iex> Plausible.Cldr.known_locale_name?(:en)
true
-iex> Plausible.Cldr.known_locale_name?(:"!!")
+iex> Plausible.Cldr.known_locale_name?(:"!!")
false
@@ -1004,7 +1004,7 @@ in this module or in iex> Plausible.Cldr.known_number_system_types
-[:default, :finance, :native, :traditional]
+[:default, :finance, :native, :traditional]
iex> Plausible.Cldr.known_rbnf_locale_name?(:en)
true
-iex> Plausible.Cldr.known_rbnf_locale_name?(:"!!")
+iex> Plausible.Cldr.known_rbnf_locale_name?(:"!!")
false
iex> Plausible.Cldr.put_locale("en")
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.put_locale("en")
+{:ok,
+ %Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en",
cldr_locale_name: :en,
- language_subtags: [],
- extensions: %{},
+ language_subtags: [],
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en",
script: :Latn,
territory: :US,
- transform: %{},
- language_variants: []
- }}
+ transform: %{},
+ language_variants: []
+ }}
-iex> Plausible.Cldr.put_locale("invalid-locale!")
-{:error, {Cldr.LanguageTag.ParseError,
- "Expected a BCP47 language tag. Could not parse the remaining \"!\" starting at position 15"}}
+iex> Plausible.Cldr.put_locale("invalid-locale!")
+{:error, {Cldr.LanguageTag.ParseError,
+ "Expected a BCP47 language tag. Could not parse the remaining \"!\" starting at position 15"}}
iex> Plausible.Cldr.validate_locale(:en)
+{:ok,
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en",
cldr_locale_name: :en,
- extensions: %{},
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en",
script: :Latn,
territory: :US,
- transform: %{},
- language_variants: []
-}}
+ transform: %{},
+ language_variants: []
+}}
-iex> Plausible.Cldr.validate_locale Plausible.Cldr.default_locale()
-{:ok,
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.validate_locale Plausible.Cldr.default_locale()
+{:ok,
+%Cldr.LanguageTag{
backend: Plausible.Cldr,
canonical_locale_name: "en-001",
cldr_locale_name: :"en-001",
- extensions: %{},
+ extensions: %{},
gettext_locale_name: "en",
language: "en",
- locale: %{},
- private_use: [],
+ locale: %{},
+ private_use: [],
rbnf_locale_name: :en,
requested_locale_name: "en-001",
script: :Latn,
territory: :"001",
- transform: %{},
- language_variants: []
-}}
+ transform: %{},
+ language_variants: []
+}}
-iex> Plausible.Cldr.validate_locale("zzz")
-{:error, {Cldr.InvalidLanguageError, "The language \"zzz\" is invalid"}}
+iex> Plausible.Cldr.validate_locale("zzz")
+{:error, {Cldr.InvalidLanguageError, "The language \"zzz\" is invalid"}}
See
- Similar to Example: Similar to Example:insert_all/2
but with the following differences:Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+
insert_all/2
but with the following differences:
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
In the case of a DB-IP database:
iex> database_type()
-"DBIP-City-Lite"
In the case of a MaxMind database:
iex> database_type()
+ In the case of a DB-IP database:
iex> database_type()
+"DBIP-City-Lite"
In the case of a MaxMind database:
iex> database_type()
"GeoLite2-City"
Loading from a local file:
iex> load_db(path: "/etc/plausible/dbip-city.mmdb")
-:ok
Downloading a MaxMind DB (this license key is no longer active):
iex> load_db(license_key: "LNpsJCCKPis6XvBP", edition: "GeoLite2-City", async: true)
+ Loading from a local file:
iex> load_db(path: "/etc/plausible/dbip-city.mmdb")
+:ok
Downloading a MaxMind DB (this license key is no longer active):
iex> load_db(license_key: "LNpsJCCKPis6XvBP", edition: "GeoLite2-City", async: true)
:ok
@@ -302,21 +302,21 @@ asynchronously.
-iex> lookup("8.7.6.5")
-%{
- "city" => %{
+iex> lookup("8.7.6.5")
+%{
+ "city" => %{
"geoname_id" => 5349755,
- "names" => %{
+ "names" => %{
"de" => "Fontana",
"en" => "Fontana",
"ja" => "フォンタナ",
"ru" => "Фонтана"
- }
- },
- "continent" => %{
+ }
+ },
+ "continent" => %{
"code" => "NA",
"geoname_id" => 6255149,
- "names" => %{
+ "names" => %{
"de" => "Nordamerika",
"en" => "North America",
"es" => "Norteamérica",
@@ -325,12 +325,12 @@ asynchronously."pt-BR" => "América do Norte",
"ru" => "Северная Америка",
"zh-CN" => "北美洲"
- }
- },
- "country" => %{
+ }
+ },
+ "country" => %{
"geoname_id" => 6252001,
"iso_code" => "US",
- "names" => %{
+ "names" => %{
"de" => "Vereinigte Staaten",
"en" => "United States",
"es" => "Estados Unidos",
@@ -339,20 +339,20 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "location" => %{
+ }
+ },
+ "location" => %{
"accuracy_radius" => 50,
"latitude" => 34.1211,
"longitude" => -117.4362,
"metro_code" => 803,
"time_zone" => "America/Los_Angeles"
- },
- "postal" => %{"code" => "92336"},
- "registered_country" => %{
+ },
+ "postal" => %{"code" => "92336"},
+ "registered_country" => %{
"geoname_id" => 6252001,
"iso_code" => "US",
- "names" => %{
+ "names" => %{
"de" => "Vereinigte Staaten",
"en" => "United States",
"es" => "Estados Unidos",
@@ -361,13 +361,13 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "subdivisions" => [
- %{
+ }
+ },
+ "subdivisions" => [
+ %{
"geoname_id" => 5332921,
"iso_code" => "CA",
- "names" => %{
+ "names" => %{
"de" => "Kalifornien",
"en" => "California",
"es" => "California",
@@ -376,10 +376,10 @@ asynchronously."pt-BR" => "Califórnia",
"ru" => "Калифорния",
"zh-CN" => "加州"
- }
- }
- ]
-}
+ }
+ }
+ ]
+}
diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html
index 6e4cd23e5..6a486ecaf 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -1114,23 +1114,23 @@ pool to disconnect within the given interval.See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index 497ae2033..f4578b80e 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -1114,23 +1114,23 @@ pool to disconnect within the given interval.
See
-Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+Similar to insert_all/2
but with the following differences:
- accepts rows as streams or lists
- sends rows as a chunked request
- doesn't autogenerate ids or does any other preprocessing
Example:
Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
-defmodule Demo do
+defmodule Demo do
use Ecto.Schema
@primary_key false
- schema "ecto_ch_demo" do
+ schema "ecto_ch_demo" do
field :a, Ch, type: "UInt64"
field :b, :string
- end
-end
+ end
+end
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
# schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Stats.FilterParser.html b/Plausible.Stats.FilterParser.html
index 61750709c..09978e35a 100644
--- a/Plausible.Stats.FilterParser.html
+++ b/Plausible.Stats.FilterParser.html
@@ -178,14 +178,14 @@ Functions
Examples:
-
iex> FilterParser.parse_filters("{\"page\":\"/blog/**\"}")
-%{"page" => "/blog/**"}
+iex> FilterParser.parse_filters("{\"page\":\"/blog/**\"}")
+%{"page" => "/blog/**"}
-iex> FilterParser.parse_filters("visit:browser!=Chrome")
-%{"visit:browser" => {:is_not, "Chrome"}}
+iex> FilterParser.parse_filters("visit:browser!=Chrome")
+%{"visit:browser" => {:is_not, "Chrome"}}
-iex> FilterParser.parse_filters(nil)
-%{}
+iex> FilterParser.parse_filters(nil)
+%{}
diff --git a/Plausible.epub b/Plausible.epub
index d0bfc2db12dc3decd74c6ef14e8226b20c5be721..95dce25fd7d44ecbf2e905f6c0c92ef091031b4c 100644
GIT binary patch
delta 112217
zcmZ_#Wl)^Y(*_E&i@Q4n_XKx$hv4q+?zVVvhsA>jcMAk}4-njg1t(|{?C@j%Pu2UL
zsc3B{4Q4Vb5A^F-gG>(Kzwf4fz!B~n
zn8m+9eggwk6)11OnUxTt6U!EdfcUDcos9JR_9B&>{~gHC`6n+y#Ki+s(R%Hblz<~V
zpg8DUOF%%XG%xvX+I2IyEg{eIwDs}96BrJq%&*7wuD17(_i*fFd71U!Rfg&ztfUw(
zac44F2O8@ncK?C-{n7750q-8g1Zlqh85^_&uO_oo=90-zVweB^9j8)%3}im&BS)D5
z=6^X)Zt?{&NIz?CC&Oe?GXU7U-1}Yt@4FbJD#_U*BD;op7YVR8gvUjTVC0&|Nom^?
zrqc^F9YUcCl8(YDqaNwY`HyQ6-^o)lC>~RfxQmP26sxM(w|K_>N*a{pQw>E;ryOH_
zmy50}k{4+dp2~4SEl#(2*th*d0CgbsBU_9rQD7~IvUO?wKxObi9^VaEef8sWqE^OL
zBxzoLSkgp8jtL?qQ)JdVjKIRdJe2;v2K;>g*%fmSL6nb?syFxa^qrbuovsfGt(9bE
z)DhyffT-~54v|PB18WNMn$3UC$XTjOW8@U0sS_l_%;WCztSNqiq4LjXHO;O+s;Yi-o7KvXcZk?e7Lm}`Wt>79Qg1MnLrvj|to7A637j{;
zk|#EHgbytZc!@l!YcNOxHd~d)tlZoG(u1oVaENt}NeK@%3ST?2i{+v<3@-}%lIGYj
z32MI6yjWF4?k)V{Tv-(%94-pDLNDlOE0ldm*o?L@D_2~xqgv_dC2;%e8OUi5SmDy$
z=};5@HSpCGzLiSfbT*Ne{cM!D2sgo*F;;25oI-E!vMxy$L86)1X17t!YeFj0f@f*m
z{BxxszY#R;ihqPa{hCGBOIBf5n@FR2B?zVnU7klI?Zks;yL*lH$RTU!F%MWP=v9H_
z=#yA^vs~hb<0m2BB1isrI_X@ehE;g*z2O&ct&3jk#9IGW?hkjFR(vYsnrn>Tc8@;C
zY#+jE!>)gWO5K8|Ef((YqYL~OVFC!j;>oc}s)(Zl!CD$~j*>fUP*7>K;D#pvF1R2W4z?+#;Q^u+)#eZJ0@vvY0YTmL5Kz%)4gu&x;lMZJ86)Ko
zAU3`SiI#q*1){S(_W%K#i>@$len}%uV2xp*pfm`<LB=AxlG+I;t-VJ2YzMio`Vm`ZSMS6>;?5X9=
zT$>RPF!3g8dyfjReG8;569Z5JK_WPSOUPQR7-3l^0id92fMAMj;F~w_5*QA*&7J^|
z{kDI%ArJvRye)SdFBO3M&0(7>JwOv;YK#fs20_9sfH;i*qG+2E0nom^-?lqtKpxtg
zEW;4s1kr;x1nvjSk(hS2o?$kz_)FC1GwLorj0Ndunh_IF#-?-85|h>f9N?5
z0QpU|1ttOD-+n@EpK<`E5WSOp03G66#=`C3I*o55E(iF*g9J`aNT3Zr;lc91x9#iqea8f8xx7|@UC-D|)rU5=iWJeAJHvp`&
zLdN8LoR@5iK;rzW?rfAP;(1cOqwSc2s!1xDe8g|mIQTY}!Z5d>5hff1^DVC}g-qIJ2!pEAkFI_O{vI9iOrE*;!F0Mc!$HZP
z5#$Ul2z?Ay4qV6ZoatxPs7fp<@++jad9Fm-wVwSKHT`epUK)eys{yTQ(0zKSr7Sw@y^vPFq1lkYRN7#H69s&Y_n12LM&a%I&Hm=Y-FE{i4V}2ILZk%4>&xU
z=bREjdbuvPrcD^;$BRRkmeI-)$ocqK0r)H^)%vN|9Q4R=Y6b|{?4P7;X$~&r$~mVo
zW3BDyD67+A%cQ|llEt+T<)Fvrr4!QoVk6$ig9|amo0BhALA{Q?^B#2Ljr{NR2_1xt
z!Us|x=1=l$CGR?)jD7?Xd6J#s#Q_t9=ZiW(YoyDSm8R=4VnO*N%ej8v*JGr*h2AYw
zCaO9Oz5DVKk9BOiPu7Nn){5-pO!N6zqPxlTq^P?E)r7b{LJLnA-iXIq1lyp;Fn23>
z(YY^Onqu07kA(m=Mq&FO%7K5sUB!l5tE?$$NC9kIp|4^9YQSI}r(i(VPv{#ktfmqf
zsOYknTL-rF0hMoTg#4@w4#t(S-HIo|G35CHQU8)~=T~@a>EyBf6dLuOY!d?)Lwq5A
zx|O)&2+zsEDU4B-5nb%PBuowg7^muUV@j(`%!*9ER{4F+PMia_iN-D7WP42s@~XMe
z@bXM!#GhoT%bebhkY`=e0xoiQNq&Z5P^@@S3d}+%zOXWuSWmwQv7gz&a^t1o9ZY7F
zn{*3U+b!MBIl0mcoRht6@hgih7%3$ME1-Y)TA@Xg2Cu)Ef%Ec|24IF>mynssT5(G#
zx7}U>v%qQ2c2s6LI~hNe&yl>Z#T
zVWF%09v3gYPtQi9}8CdsXn|aNYa)$c@}6LlhX^xn4242b!vu
z!n7Xw*v4wO{`e_aI$l}QfOa+BkZ(`aEuTJpP9*c{+@M2$Nc_Bx5>&fCV_IfY#rEW7
zUd#F=q_t}xQ#?eknqmo-^Fe3s1oZ9)7SZoE3)zbvGuaoXy~Xpn?#d2f!!5S6lg)oV
zg1OFVNiWW|XSqUqozR9)yd=-AyTcnlqjK)&h}oSloOvuZH{EO99zPrZyMn?G7f4du
zx{$3f2p>2HBlK$zm2apT3&LuF7wW$5)}4X9Evk(LdOOeKzWsidFE?9z)CUrK#F(}8TG~qE(<*rjK_g0lrr1o#+v#xc_U!4Sj=xK1z<>0q&vZxWYMDvc}0VVfu
zB?MC@aUt5%HVmqElgK+DbfOQRy|#aD<`~@{4GiA{jiuN9@x241?SkKDvpznfx2?AT
z&>`9S{41allGY@ZopCH*6CpD?xL^uE+BVSz_yl<(eo72#etmL)`u
z1UP{pzA=C<#A5msU=$)VnFRoWZ%J0#<>N2a*IdsHd`+^r;LD;{La|*4ht*a%5739?
z`j;PoG6*VP1QbG$;`0A7fuj{bF+`TQ2KWGR)UyRhgUGaY0J)G*b?1
z+&=(51eHAj1Q6dQxPV_gPx(r)ObOro(w4&!w2{CA-$Se@AOmS26w3`JAiemN0G1Ge
z8|t9(z%J%MIPgR{98y~eI!LHxD-G}$kegr1BZhUp`auGIUl<7CpKXC+KsAUzjReR053f^M#r}`K;e$Vm
z0g=Hkl0YJKy!5nX$GMWmU<${OZj&=Gy%dlh
zin?KNmtp3)J=+A-C7{H8;8oYh;BjdbUGZ=PCqzwb%i$cl|Il9cR}t$aF87*`_~ibc
z*mOllz>9amv|+!YXQp-hT|d2JlteqznOKARL-=UibTGUU9GGc-n0*+UCEb_wbF+4e
zEx?9@gjCfG2fM=p?m_Yg=L&DnS~qCRJ^xl$ruYe@AE1Mri?iMus%TJSm-2fEh=b>;
zZ```as6X3U6e-_1lN0HMyM|jRQm_uUvevWx@0+o)mAT;kUFWtRBe&U?ge(^Ib9z#{
z>;42-o@g(PN!s!2p9i;b-Ch!Hv}N1b9?C|VCsS)|iz&Bawzxlv1~Z7b!eGG@GC&g0
zKyxkSiqfwrM6FuXkDi;uu-@dIfL4%j68idVc0zPhbw#|+4!^|@
zw79~dMp%o6(aZv_y7x;S)Vis$tS>cyP#X>v+6hv*on0-^u~GP(898sE_y((Y?RMih
zEkmos`eos?n5l46(MKDhekN79PsH-{3}$X>eO9nqg!MA7sg~%MXZ*gJa>Q`z
zxID^LEA~Jy6Sah``|5PsJ#-SQyhK+YP}jISg`Kc1U7(O@gmTUt?#t_>aoGss@|m%2
z%1l8045d|_(jGK>Vs*K=;|}Y*_E3hsuNx~OU~@vy8DPgl0Xrsbfct=sOLVDt@@X
zmjG=Bb;Nf2o0E4YZs@Fp(~88;Z_o@hc5J9~^6QzT&~oSp^7P%%3K-o}BbfjD7GIzm
z`7BVwv9Z7pHgI?69yud1?Bo()(J(Yj?KT|lHZBxe*R>(8eaVdJT-=p$cVWxK)R*+fjzAp9c09N0;~MgMDy0$w7hJ!lh~Nw$4EVej4!%vr1sDt2#y5R{
zOc47hAfWSGv9v8H7WfU~NhlFG2mR)07yc|A=`~F#LOi{if&~ZE!(p_^roOs+3)(mX
z*bG5<*}yKyFhvU`m4B}RlKwBihS$S9NAu>-VxLtnHH
zfW&X>r3ZjchCDong(if|00|k|5mEv0!-I~67(pO{eqFHtN*So{pz|TJS_)`B2w6F%
zf<}Ri{Ywu$3i~!aW*bXwbrdKlS1Iss2Ou7}UJM$k?SdKF2J(LO1fba=(@YeDhK3AI
zmxjK9n2wW&4uenwVZ`}yW+Eu4@~!_Zq8KzBSh@3+nMi0r%c4=Bba)0YH>NtQdRi9s
zdZEMO331x6Z1fk!sM4fve4+2|y_GcS;_SW3!l{J6qs~9TRwHTjbR1$uy~M8{CP1B1
z9uHJGKQ;qsDn4+9IdG**s~{69M2xkzhJ@^5`^RXQqW*g%eENMTM`D@!Ap@0@-5!}E
zz6iHX_bUMnVJcfa+^JnHAg$ZR?NCL3IGKaGHdK`acM!i}DvyK<6l4fWqT_cO
zwLzniI;2Sc+h+Z7Zsjf*%*ds^*-K40ab$4x^|zpalql*{mM`vh6Xtde#=FwK@jprI
zFz0DfNP9?IKBzfg3JzNrwxyoQ9Vp|UEizHi(aIbRmr|}wJ
zMXr`#Y39%9{sL*GFX1|%oZV(B&Cf6kTHWXDel4vMY8(Tk_`NuSOJd=5?
zjKyjl;?8_6SoLhU&0(OfDwC6tvQgFZK<$O5Bak&f@I?Jon8pHD@Dz_#5HssT
zRKhy=ccd3vE~a^b8oEN>-as39;3F|$;b$$anv(7|rDih###+@}D~%xp{jHH|Znhhu
zp6_MGC`|mdNx{e?E9ORo``xUDoC=yy3qT3h5)~p{m&8^kdC8zy^x^yo~
zLVVf9m5xa3bSDblJ~|huCv6de&l8vPyDmGUsYjK@C#`K}j4dQ)#!tPz-}MILTjNW#
zU%@*n!=<(v%UgnEp$vjS18UoRZr7gq7T0O}cA~S+A`1S#t}%GO#;+tTZKDy%2M=P@Z=
zG(W+5?#mcpRNX<-4DF4GU*{fA1x#^wDZ~ByP=QcJ%#VdVpKe#B4w~wr-S1CZtuj8`
zctX-@+EXm)iV3kRtJ%lT%)N7b{&b3wY@qC=-h78;rgU$o#f8DY=HX+4|0&d5Z^KOp
z_YrDf8x09|-MZH!+&&(@yaTx&9jD+**I3!;uR!}@dis3P{jCdTd!1Xt7_~=`J#f=p
zFh6l*R|2EF$@L<54b+HVR{!Dlbmj7_a?9a#@Gn-X^D`PE4d=KYYP?GH13eEX@Emz!anM}1w6?y`LHo0d}GmIKZ
zzGnDtA2&8
z*twz0Ryg7PzC**KZz}K$`+Jw+!vb2Mx+OBhn)Pbr6_7lLXZMbur%Un(BHpQFz5@
zZ$LWMPYw%fn}Wj75$md{vKExjA+%|x7SJ4Gjo&ACC;hB%Mmpj@Lyw7?5wCrtqX)b2
z3?0TVahOa0^^W6QKq>n(EJ*$#X}Ut(8`qn|2AHMdal}+{eT^I!RWdkZn*sQ2_JOIF
zmSeS}JO$LuK!1chjmNvmA2+tK%$O0f5GHAE@BlPbOATALscgJ6Na>KKlm>XK$l`VP|;^%plL
zwo`1MPyI|(HOG3$C*!o7p6dADuf?%#<0EV8PS~F%338He1d61_3ZQDEIeM_&)MrWF
z)qqs+3WX5*T`}TAUH^b>;qU5^+zjilZ|rpYmbiDcgwEL$K3Cf};Srd5H(l{s!F-}&
zSC|E5Y$R(o;~kL~949^Pj_q-^*NHMmRoqcvm1_Mu(Z1PVL;S)MqprU0Z{wzA*td69
zFy@b{Y-H?vr7Zg7B%peNbUr&t6jq7;8HF1ump)zP
zCbQi2h8a?}jj6T2^<c1^B(c$i4qJfjQuj*cBRAgOn(7B(DTa#UYK_B`7OTZ#h{w<7aqn!EVsnXrL|UHExWc8RI^BofD{JOFG?E
zzZlknlYw9}bmUgBC#%ho17?|QdPz3H!1Mh(nzdwN)o2n_iTH10i%;DbodTBRC|rt2
z?BJO2v=XF)B_lhdRQyk@Fr~VW|uX2T5&L
z;-4@AImL0#Ec~K44@cyhhWJ{u()`c9;f&HxX&@TJDEpamphK`jl^SjR;@mhmwC-E^
z>=bQ{8tR0OP|0o$w?2X$5-dSYk+{1Zs~JU?P2QSl@xyX1W)`uMa3CeYuBz+Vk_P5A8Nfi``d)j
z=H*hJ+jNBLkt;6!MNP>wx``w7y9&w;G6=gzgw~1RH#NIff8Z6Sn8qGr(PS62J^PG)
zq`)*Qxz}9boeYm3W%mMUR
z>-M{fS*;j53paAz3?73d*x=A$vxp<5{x1nm6v53PJM()V95=jKUbr=#HFI&U3ef^Y
zG{ouVSqiTToFC*V{%rC;n=uq*>rp==f45=+%YOgaLeb3X1_0vpqpaxYHD4g$GEuVe
zO1U{Sq!1(zBQQaSpfV*2ud50)SIUA^9ok?B4aJkOw@(u);BC;jj-4c>PNlpMOu?61
z8{YH+4*$pyV;L$IT;~-eiKkhQS<>FSZ7FBPPRy=ddpi$nYYV>vgwfKRN!1DC&pqOp
zyEc$SQf^0+HqY})4O+X2j*;~sxqJFbTkVw%jxYq7GS@HcwS`{G2YwD#&Pf9~DO_@W
z)1fs=>lI9u>+36&BZ`fTc!tG3Dr#~-CUyPXUafiZvry>NpitnGp;Kj!+ajO+!l{Z1
z%RfHt_r-QxhW(YP*5O;ZZr1J0V55>XaYv2SpLJ+_JSBI>OH%$lxhs=|mnG`#nNuZf
zPwTPM9o#R0tDk6yQ+4;_yCn5Nsa@HcsNsv;x5mr5#`~EX`n6PHWMTy8bZ|moIvWd7=OYiCid~%a{H)Cn_+UNadnz-1
zk4gq31ycWm9zBno_!`gdt0J;zSIi-+cg#XU@bFimk_Q>*);3hw@|A|yQ!f96fT_tAR1-8)_zY7kn`#)&Qf7#D-e+b~m
z={xPy;XX3Gc0m0{X7pcsmvDl&9+={o;&q~_OEfm}l%qL`&h(AFI#$71nCxQ=4Z{uU
zYgu^l2R(Hx6cJeCk(40ESRVkL@Zq0z;Wg11tkO7ou3-{7we_kh+2kU{+S5a`%0YUn
zY#0uPO7?;kg2d@hpxmw(q3(8s&E35=?o$8U+}viR5;kS!WO;Xb1n7m1BF*ztIl;lP
z8Sa|UpVaTr=mvJ`H*DCKw_)u3XJD0iEd~DGS51gp<+;+0sO5qJBGnw~aa)hK!`)!j
zKBi@e#+<8Wx!tWb<0x-#Xo`b^HDcwmKeE$@gPOpMf=hK9iVVAz`QZAoWlMbX8M+e`
zI%DpyqIV77&O$!={<$x6$v+A^{`t*cv>0_^t8$^k_Ehcbk?@=qsv!}O{_~l}4`%__
z`8{%ZDY%2Gw4_`R`AK0&B+|K8pOsD`-T}w=aQ3)rQ(9TPyp<12Hm}sDQZea2>SMn)
ziJhjvU(KtBTUe#`3Mw;Z79dODc_GvMf7;*0Dba6
zWktC+*eB#N#L6&Z4lYaA*wX_av&UFz94>GwN@1qQX~ZZKN`_-|FL7$lrbXLoV2o2q
ze^J0{rjJ+==P)rL{Vdyr{OQugFL0I`TowvH_yt|g#7fD;GW8Hdzg|rI%6_s>Ys;2e
zWeb4VrJ!-gT2uWpo)SOX(tVf*l+Nd9Md-iEeygsOw{h)FU5dh(!)4S@35t&>NZZ-G
zzx64W)N=;H7SJas8|lP3k#uj!syexulmCQ?Ly&Oo1}g@#)t
zg;)N=BO#*ZWfL@quJWNU0jiq@3hc7nZ$kBz1x10<^yl3fY+Rm-zN(1q_B*Q6Sgew&
zJ1Eds{CAC1M$S-m3*1|1D~*pqDpiVXhq*YMo-NHhqY2G5`n;ms`7kSWWC=-KexrIs
z0mRn!jQ(Pd`<(jSdjFyqK0BRUcNz(z-{ahT`P|WTuRtlMy2bP|B48EpJs?Puww$b&
z;SwkNAD^J}a|c?Pq*$Z_GtPpzno8MsNh%-p;O4n=#P4xL(9hXFW!bHqp;~_mv1#5#
zjlBB}p+DK_LdV@RGoOq7r7ALv#n+_N5D=r>INqO`vS~+^F2>I@{bMwJNK}mi97aG2H8Et)oBW_E~fR=!N
zdu%*TNc7)b6*>mwv2hVJ0$8LA4!aE_ANqecRw6~vM37pM!53&5NcFI+4*DF@*aPl>
zmWNQTS?c|>nb+EyHql$vu?@BxdJi)0bO5>&=Bvk1%y_>mutnjTdVgl$4q@E*(PB1lg^)8dywGard41U+_02LEBLBih!ppHuUV%49(Y;N?>*v$S
zi`T8XJ`7^|h`9@vWWoM1SN}b~E=_`353n!S`}gS6*l4Lz~kR(D{iwoB9|%7e)~K=z
zqi0cO;mDP=n*r!S;(UK^Ps0@>sMWs*Ma}K)#Z8Jz_J0}n@!zA_?JorTf1`j)A7)FR
z(1h^`davdbZo(Il{C>fJa>)x-S+}I*k#JU=5l5Tc(7jeU$czO^TN75pG$O`AYcrly
zoTk`mG!%-LUA)XBA$kF~$Ks%JQ%Em*`KK__vL>NV*|xGe$caOxglLxjbU(LHs<*U&
zCHpLBBHGZKlf}^&3
z)6Wu`5uG?N9kj9SH`aj3D)DIXi2H#-frb=_SYC!*8Ehk#R;Gr{zd#=Sv3RuJ0k_aK
z2vhMJv)*qh5L5*Auqs9><5r^JwVy*MwR@Sw$tN=uVNAKP1-tc@Lzz#lvcLN|bKo58
zFUSzit$SIMEOoM&EM`x!zkK7by0y6G(f4_6H>n6>b5Ol=sahd|kK|qM3{a_5nm+8m
z;g}zyHu*~vokSEGXr`wvS@u2@Zy)ei7N3mpIUy6B1cYkXe>J9x4Yr*_$o6d*NH4|jZ?10(PIE~B1f>yO{hn5M3upSm47+r0nM
zHY>bHxzXUXtdqu0>W#ESX~kPM;=u?!pBU&~EP0lq;C51x@_zA}#nfToU5Ule=G+Lt
zOVALXNYhXAfK7DC=jssiD{y!h05H2Pp9uZ4IoLovr8kt>qQ0}qH^BT^d9^#Lt7JJ+
zaNM@}$E5ZqH5N8YS)4y+js|tov!l*8-igKUbl4`CFNa)|rJCct5hD64RePC=?ZVXMPCH^>N^8~qaNl&0
zUugRp#PsPyr;W*Qc&FVR+xMN+u*aGqQ;ZLOI9_pOzc6G!w&Lwx;}#lSQp
zE`}`4x+8bNPv9-J!YvZA{M@fHiYy!IWfTw9D)f3~L$#PkW@Jysrd=Bsp8p2&KsyCJ
zfJM*J2h%6CaKKmV-`#}A{-}lHMG}Hf_ZoQ9`E}@q>i18nHAQtL{Rc;wiy8be>(aP%t(d=+$E
zV+Jr99QZ!eJadk7T-?sXFbDeUivXOX^ZTl#!$=;6^MJZ35RKvrN@qc(abXP6kcq{(
z{-P*7EPh2y25wzG#eK`wn#+m3O2A{_1?S9Y(MKlFo0~P6{EH2(s2!L3`L#9DyH7ml
zq)5NVvt?8Jem|qy%b5G@gI0G!?wF{UGV2F#lYLvs7M7Bfu$CR*`)%%q_TzK*U5zvj
z47Ba{e^ab9R*9CSv_U3bciK`F87k<`zgJT
zA7Am3MqvhnF4VO~)K=oBz9X{D>_xw;B40FW_8`CYb9MOFMUTfc5Ol%Lvgy&cb%PwxB;C%9=8dRhO_6Or|s*IgI2Uw-dsjIaz=mhniTgKO-rk
ztBBS=6%fvV;U~d5SJt^b16PW=+~QojSlKE>v45-HWI^tR#@NVTL#fUiz)u{ti|FiL
zc4L~{2BNs0V26!rq=EiNOXo=;YI`rW>YMKMA}jDxvO$Ifjr}{WFU2_Jer!jT&Nq*Q
zw$7dIvk!D;D=pc3weZeN)_?Xdts>fdnB6Ha)CgYWcn_)*ttRAJr_)Jm7Wu}AWB+lIz`jey
zL!@jpQFSqK!rV?+_%GYpW3HER*~Zq~^hHF7)cBvP^N6%5s?o#pr7Q)D6(d^bRGzW5
z;tTc(uNxGanN;ttiJp|6Yr%CwF*3MeZT%+a*_Ta`r~4TmSl;>Zzx?W*2-ZX#GzU8r
zGM=EFcWyQ;+TE@L{N60^DHle;Gn*^Sqt-LAJcjz5&VGqVNGRDcMUGNYS?q>n0*0+zS)}ulxPhb6JgSNpv^U#JMOF0eLv+?;eJV0xeqs)cU1~B|4
zf-ZE?rg5q9BC5bq@QSSq&12&}IEeKsI3(ceVj$d3f$3}L;ufoR=dg6>q9dI~XLinO
zXN>Ara4z|9Xqg8$jc&>~U0=c&CM-H;p=T|#JQe6LtYpq
zaRM5sVE~cpowtbu`cZ)=aq4U@TOsVcwX-?jCnio*(GVNIWp62q8(7Val#a^v)I=+6_ek-S``jz0=7GG7wN{lyA+zbs(xeUR#@p9%;?!sD!;_Slr*;rH^oTx
z=x|rB6{ARdX+N<4sSyDe}NNqX&|u+GWGVJW7i9&vqPanmP^dc#ce>rIREf<
zgqFcANzT;$6Hv4;wMUB3!M3z2Iwy>tlae_*BcVtqHxwV;C)F_mj#eph1TEb)UTE6j
zkVU8XKxaWr2qw3%f9%l3k3_jAA~kiq+<t24(G&~`*L9O$cNjZ+!s8`4@_$!(LL4$BT?k1Kg5x7#5#?gu=!!7%t^V|
zG;ws(-B%oh0=;xLuylxvd5UoRs~Mb!_5<;Biw|I*v{+v6zNTW7L1Q>N0Dr8*-P)
zj|G`la*dwKSv1aj@9f$0S{~MAZcYaUfvS^SN$mujH(&2@ImV3Lw&1tIw)*N~5BpYz
zR9(iWH#J7v(2nxD9@B_MZl-wLsT5~7bJ4UbWjQ7Sk~Ez6?P4>wV%B3w4bY!^ILg%z
z7Oxw@Uyv(I&buyicgZ*pmd;Ig$va#=uVyU%LH_@5J~7EWGAL^UFG4TFWB%8SG8z<@
z+3`mxi$T7`u4>}cce!Tt#t%3R0c_9A}It(KF{tR6U
z(F=irp@7Ir5nv7=eHVY3DRdQHEvN6j)!V_MbTDXbT}UwY|5tRs|F7tN_*QhE^Fw0$
z|0=qZ(u^b%&qkA=OT_QVC7<61Zf)qoNrttfv13SyzHbB8hKca5rx0r%!vI&QZjC49
zC^OlXLJmxe)DV>GVqUL8#s!a`rukZ7&(ypzc9+g
z@0Bsr@WngZg8zbN!nO)j!X^)X@)Ek+imv@aad&0ddN^nt&k`QpLLN>|EoOceBf)K!
zH^t>U<09)(hJU|HNiOJlkk>$U*t+CTZ*)CBs@cYz=^i4r%86sutMuI5@Ki1jI5
zkhWO|dYkH5qMDL>H*!*5SE>UP*$;=6Ym_On@O*dP)?xdzAXMx&DSmM^fH~^}m-w_D
zEoLYlRR&{0)%rh#SoVf5lDLaWA3u+N2IUQ^a_cRm2ucs+u2tuvVWrDNn3V3Q129t+
z-+%b1$cbx5v>!Jidub~{X_=wqCcK3Eo$|~D%6o*2WvOL9I)$RD>VCWlMCa>u<4{C;
zmTrr!$iRP}T=UQGjBB?2Q4qJWaG>x2-6aHF$&^aOMKHLWn-+m`>
z4wFp-Z&~Bgxi@lhLTe|oDU9Y9|5#888y`G$-NSFlb8)Isr
zy@{6OeI_OJ(6Sj38y=54ker4hkxuu1hauv(%U;7yJ{`A3!n>2*R(|)Yu=_L{&j*ps
z_Tn(BBh;C%Caa!Jw>;^IMoP(WIitd$!RlI1!A-&!wD{~3^wn1
zE#-i>TqU1u
zuM;q(q48HYCM{Uf)Fm5d*{p_@G7NJOjuKx>Ok|ynr|DQ$)u9Q7PhV6Q1LHB_M8+fm
z^>{OOoVvgX?zLckcEFQH+T116Z6@#M`{NFC_P~W`x`i?JJ8IU>--U&tmCiQsg}5N#
zpQAi&fwM4p{5jJE^ja{_pxBJgX-cKeDM_jlrs{d2Jlh{)$V$mUBBT3r;+9ZD+mj*w
z&cM
z?Nm23il_CfygsGC-h6p&3pm=h08A+7V+L{1e%twH0QbWI8PuX_8{b2__n5R=VSKpu
zus>xrELM`2(&sQ-bA%5NI$M3bUlD%)HS@I5=8R^Q=;BAUAGw3${4=t^hBn{uZN|yy
zHXTN!z^Jtg7|=9iP$g7dsUK`8AM(EEJZ3D%4&K{9mye0R?i2D%_qea9jPOehK!a#t
z$AXvS99mSL7<3P9rtbx*nB#S4dFRCIp9Bzozj(gG9OC(}Vs0GM$-2Y?shEpEw=SNH
zhbe$E*5X?>ML)jw1q1>YIc)RIzTEqqIGj3)>SMNB|LmxG?F&%w$vfUKt$s%Sf8F(G
z1Mrw%@A^qfava_l*!Y7cN^{Iu94Wrf4N}S{Bgt{G#dJTU6jd)b;M9?_WD|5#H*<32
z{^cW+%XzJh3---!sYFePCVz`!J~K{ZHQPcY`Rh2tmq7n|abMjGlhU?=Lr^M-?aU~p
z>%&R9yYuU8Z9er{WM;a{o#a*@I>$m-bTeBqq*!e2T7aZ5fw~mbuD-T+S7x4HT-=H;
z7gcOtl7iyaFWNF~lgBenP4e@Xb&j^OD-PPH-!8oC(P~zCe3ttA_x7pLlY+bPSP!IK
zgps6E6)ra;jtn=(Nj8{ty1CiPo*$p@gEro$u~!`H0u1|@xe@Q0b?A8i&7}iZhHhHn
zH?5x!Yu)mHgFcmSsYr(7HxyYUthMC>A+fCR95&(Fu6KkS
z<2~jj6;`an+6T~cz@s=u5A`d?F#aS&sl)CRtstWW5N2|k522F!wt2NB;X2SO;rf-c{0>|}UYs?s8CIKWQ$6sM8~tEm~*Uiek;>{w_-JjtO4WAv0j
zk`?wHXy^IQarJBlZK(fX#V2Z34x0L+!bKJAYGSm^m6HXU{J4}cZ%zdiv#6@G%|#-4q7WwjTqW?fk2rhEPI8IyJw
zv`*b?xg11Q)kf7kNz=gpBwgh(Wt``LxGeGO$-KI@##ygOvAGMcBe_xHIxr~M4utHv
zeS!PCO>}?=hIqnIRR;snwZ(o$cRi|^=Dut1tgyeEzL)C(N)w&L9KORy*l@zIJHJ8d
zVIxWFm^aTgWuCg#-nK50xWARi6y5jr|7ktXE+(g?9E)>XC#?FeD~PrV)+;}|=DKvA
zS6lxDt?3^==ZBo1s<+*_$x)A;D1i1aI!z+|;|~QaV%}N>3Us?;rcXX6eNtM-KNuT%B`9y13Q=~`I>6!_X^xav_@{(RZw3ZV+5Ma>(xcj`kDo*R$0}Nl
z$vZ2l@n1UytTMG@9~9U9^S+5Z=amg@>ki%<5nlaY3(!{EAq5NxO+TU4@0KOE2B>)EvzV_~d*kJzGggVU$gA0T3AFZ+k<~+BZ
z@WODRz#nRJe8hzF0Mkjqu!EeSnL{naZaDQ_4ZeFY$}zxwaZP(I@lsj5n8mrt9khwn
zdREY?HW%>MSq*65sE)am{)$URaG%u5E@RAQV~a&n^d0==AVX=%X?ReiHdxC}jZSwl
z4V}hb{ligIy-y<7j?pKW+O(d;)H3+BG3W6yFU8-3jxj5RTvs5{tOGQg@p^$IEsiU0
zz=%$`Pc5pWMsmP8fzX56TrJ9#@T<6kk!?#yg&iliCe*^Zl$RaL{x5Go)L63b=r1z7
zJRQuF%VB9+wNjdWWS8Ic%&9z?4TQ?zC_EY}*c~GM-(QnvRHw$mX2~+7V6>z>*hms1
z@n`jY-aVULj(heg&y9iR9i*tD#$kG-Qr3Q@%1j+Hx>|6)Hm0#Aj1NY(B+&A$1_lsO
z&So}3%}%~AiTa_AkhM+Ofv^}?VH(Kn;`F@^z%>DgdU$0!+i|0werrHKt39nl9lc5LftV?|ZmBfGHl
zhcvF|An|G1DkB9%mb7bI%ckiSqLY1pNPIC4OfdEc+?)+%f3HMK%w&^?U;gt~fFYZW
zmaPXml*BnA4!il!cPK@1(}$8+`B+?Ru(;aqqY0HW-PkVV#b#I?abAmj)&YI4TC4vpc{KY+8+=B!%L@%XqyHU
zRNFRnBxiR@A6tWW;8#0ih&tm*0a~0$
z@PjIxT6;u^B}A2Qk=H<0HNDW5l7~l|M;lxxqpiKeD+{Ltl4q1P3aku&7KU{Jpv8yG
zjC#!4W`E>RivmdZJPqF7?h|Gg3QUBkOa1}Q#Rb(8R4qL4daRasI3q4znq|StNgqUv
zGD?$Vmt%55{gXi$l(Akp;P=>_w5-X8n>iCZC=mG5;duBx&(Tu3IvanFS2l>A=0m-K
z64+wDh5frTC?RX!a4AKsXw~5Lj{eFS?B*nYJN|k{-<>-<$zYnL&5H4QNB_t!I~|bv
zLMswZvzuy^9{&|aKh+DU1yLlgdJN(_)IRgPe^}wGZVF){yzZ2Ks>*d
zy#aTRq%Pn5P6jD|oFz_Bz4v5rWIGr$$D=Qsn#RAE$IWr)S@oZt6%NYRew%KWF|T>m
z4i@Yc-~YGs+a5)Rzq-O{;X!qM=^xOABm13Nj#2uVb{QQ9jn1Tg>{T~g3^te4=7y@*
z4K))uGxyGZ7tU*~C&Dk_p4kL8s7H*sUbe-3W|Q&ti_aHE{KaR(;*PI8wb((v>g*l
z)Ze!jN(Au*1B+-8w+c`MZvzpFXc1Qm>BK)PIsgEYQ~>}Qmw^ug6PI9^1O>OEQv}%s
z1H;;-mws6UPXPdz&RGN=e=kSl;0>-vsmb`WYawsN)PPdVNX0-0r?_D(6L9vJ;7ouQ
zmO4G+lfX)clYoY!Ns!|LovnReTld7EBSltWJ`+-9l(Ro!%0Vy?
zW|~u_AvpJlQB-J74P1Icdf^typ*D(%`3cdn%;AJ^8B-4A(1Iq4PU&lp}AbN
zBf3*&esQKXp`@}$q9vhu&X;ywdCCw{YM2xQIU}*mGAW2&W|8EYFhN9-MWFNvi3_Db
z#LVs{5|Utq`e{MW3x`Z_wt@5N<*@p1Drg4#0r&w7F)7rc8F4qj
z3+0bO8VJT4=_;Q$MNkE#E&V@!-Y;iAB}pB*uXBjmjK#znD=AJ;{u=qKWPucRMe)Rt
z6ryTnEt=Za*F~sLY`7mb?*W|>wi|G!4Z(W1?5+$TORR;Ge`p90Qd5cXYsuQ-X%_Sa%jy=Z9?z#{!}nKBju94P?9U
zSQ8ws{W>-gf4ecEY(1N1|)$IaH;x@n%+;d(!$-!337O3t}Come}o)(Juv<*ln6
zs&LjCbZ!zjn=8-=9bP5q%ntB&AalEIMR48INuZ&Wf5#{8QT>Fl_K^L9WxWNmy=|pc
z!U3ude{IFRt^0J;E2IoF9BFxlKkQY~q{ss2_NoBxgO^KsPMa{b@}=NQFYGmgltI}#
z3D)rQANvdpni4H}Gvb-6lR*>oM)+j@n9KMho72usOYN
zO>OA^_iAZ9#Nq#i^U%WSIj?hwwbwe#@pZ1Cn}IdAsKE^*JkY)HN2_1EM7n7r7Z>-g
zf6*%{<^`R@Z**SOtGO_?CN^Fg8#~(gd$$SB7EA?pxGf{C_KXU~jn9N%KDVEqr>gwo
zQ|*bRtYBl>X?+&5vqv2)>FpX70(E<+rjvBsTkSq9XqI#Eb`2EUi@i~=tLeT4{I*gb
z)KtR48slFZ{#slay@nzu6`C96InlU@e-oYOq!1c7hG9FV7cy8ppPSdVGoskKu!z0z
zS66|f>Z9(a6q*?IYIi$BpAeQS&fe6YD_P{eO~I>|=V#xazZ!q{%Ezuhe2CJEJ|#Pp
z-+QyM7k;w^ncZ65f_RAKzqW-zdb6dmR3aK*gGl&gAyjH!@m_@}35)%t*bBMJw18TY+-Os9Fx!l^DIL+APsPVc1dxfgzXh|=f7
z#S9CBmsWd!dh}?TL<9sbA9i=WyZ9!59qr5v%F3Ncos<{tK5sUj!Bc5<8byUj!q6
z64{AeXKRN6L83@JAJ6}HM2$6Fq$J{0>q{^7!jo}e?}X#}{iPRn2x)twwHI<3Q4VcS
z5pT2suN5uzNK6g&=SpU&&*DpOI5_QHoDTcvL;uVRzx;I{soyuKwuh;yVmH*lB-2lC
z@3|Mg-ACyC;mlQ2F`E?Ood~)(h|Ly%cLd^qO2UT>w1N2GntI{$51BMCLHI9T^or}l
z>8&HhQgbkuUQu&Ery5X-8L8F>)30#f6Zp|6D)daM#gkX$V6P4|IA{mrRLnCvhsh09
zj0&Tl-0I;zeQ3C$4_V`O2J6>67(_A#{F5qhZi2`#DRS8A(p{D4F&N6YM=WlC3^ST>
zGpRB>c!4@usF>X}1^fhP3@VQYKBpv6FuU}gwL#pG^r3Op{qA
za@`y%;<8d!v0Tnyc*F+RPgop-xb%$5z(bo^C8ASW8K;#m1z&q%>o({WT4o=ytUNj%2T3pYRl^^NF{vH}!JL^Sn|33)2vSZn&88dz
zDkxtY7U^KhW(ZtnI}zvSyQCX-JFw=Hj0V4ck8i#T88NqB7OTP
ze~dYOHwX>2s6oJKW>EF7t-Mo-v_y)GM)w1hz{+aXO&0;ICf4skzk539_JeP146bte
z>?UTxpP5kwHnGmMMN(hXd}`fcvm-Cc(pcx2aT@*zm|#LtbuH{CQ<;QBF1}JcoCs9ra+jOp*X}{+%g;|{Y{1K!wQ=QhbpmLjPk-RLi0df
zR|u|fcCFRdg?PuM3>Huye_KC|t>a3x1-*tWCBWH=se6^!=#=x6WI_W+OX$=p#$fe)
zZkJDD1QvhrxaK|h>ipvLyni+r`aLf^+DGVk7y8&XVSF@W0Ou^#Ob7k4UW=-1JnPw@
z7ad|JE~$b4_b8+^?x^U5Cq$+eP?LA>$lLe-)5)hvCsow85=h>vf;YKN6=ztQaJNiB
z3gkEP_7FJlPqy<}0rM@amr}(IobsLndYBp?snLH%x_cGJj?Mgn#8_1M)D{;dMI;;S
zb=wDgs^-}OaI}9UZMBN-$ycvRfIEzp@o>yph}JcDi;27%!onceY6+T2#hSFPy!BzR
zRx0#I-$y>P+Y-*S>B!mRWT#-3fWyNwVNsG#7nPgs53-~(<&Y3q?YCGkrO`Er_>Kt+
z8E2PbV+0-nJC}iD1Q&nbXX|Pla^PRs64hx7
ztRl!+iLhBm$oA-t?jY9E1i59#=E#0A&Sl8(c^1-R@1O6x_1~eP4+0)_{LT3C>{=G+J>t??vU{N3j{Uqth9pmC#4^SH)S*5gKz2qgXHvDT(g*
zWJ9evZg7B|2B3fK&2}KGVmDr_`_Za6<
zQV%vE_xim@7pf#b?#=yfANqV=-AiBW^~vKE=JqU8HsOC3n97^a>^HuVZ$SF%k3YAA
zwW59cp1XgXaeg+q=nYPXXBYN3qxA@VcXx03Xs|t?`7CM+bCKCuS=wW?Sc4Wu2I+SI_jwL7ZD%~{A#g-+`aORu&W=1rLIW^|O
zGhX!Ob0O{f??pl`3vDydxzw<@ISviYRWx>=q>@lx^lj7q8!sYF_YH1wDRoY5i?&f$
zZKE5hlNO=9Mxhob$=`qe)$XX%)~GI3q!0!;#Fl@~ICv3*`J2?fZ!}oMUi6XE!Z2JK
z{J<04v`TtW&?xOiz&TTfnJy?Pk0jJmKh?5OK1(jV)04CF!P(KflXHLQMZa`GsmD}U
z?%-4dVTR;IoDnO@3`ioy)~&XC^lM+K%4JMB^p>i>(f^JI}Q_tSq%
z#>Q$UQtuA2m7FpPVsrPXe2nRPAN@76s6~ad!lLQlIr+*YvKk^X8f``lfJ=eJ9Pl4wh>DhS3Z`VlaNgd;79
z3#~y|vaqXSZeai^E_G)MomB{i3u~7TXaoj-Xna)xpi!Oi2F;*$&(bR(2%%K&Cgn?m
z6xB2b3%a!DCSzD$=<*>FM@UOdp%iD3U<1V>lMOdYg%5MAKiH`2s4jA#EES8;w^fQ-
zw4!2H_J3H2?^U^o%pBsUi_02HIl5mc0-Vj6-r)9E96nUB#Nu&H`SASk#*YD@uB2J@NihR%vIaWjj51=VaTe$O$8R6UM8)_<@#<$BL=n20Rd$bbf
z7KCwyz7PAh=IRl$q%m0^lKP`Ze|bfJw&$Kb{k`UFMfZ58m>l;T6Q$WTHq$B2HBavF
zNz2RiLqc8OU$^`o2
zZmf037*Ec^)1AuB>C?1=>9u=95ccUi;Mp$4=d7jpl-}(!FxD7;@p;dckT+s~>ewd|
zs!jJppG^fX@8sv6kFUo+J0JgyRrCp9r&EuHOlv;}2{sn5oQ#yG7+=Dc@DU*V=_@25t=!JvbxYMlarIM(@+k=(sS7JTSKO$W4
z{s900|Nrb+TT|mU6n^)w(3+Wlo$z1_vP`#S9aE<5^o57c()Oj(VH8`AHOP`H$&k$S
z$M;CSV6!HKtV@?I41^@sIXdS%7k!e%)ruNJ*XD}Lgm8K#NI_>2LAj#Y!q1H<^(n?V
zU8ge9VOe0x*_tVQX%rKyFgFE1FsB9|`Em1=i7<(0hll9&6iuNB{f#nz!ZnR>sc7tZ
z$o)h(WjF9CD&vpTR7z+>naQa_@PdA>okCF}Q;HH!v|jj3a3-i9_dJcT9S|cX&<{LS
zD3hun21(_ON;Y=XGE1UqimFlybeq#|>RLOp+7Z(zks@QOO2JSjylr?ifxt)Md>+2T
zjSCJKKOQxw8PXVJ(Fy?*q&Ujwh@}hvTF6^57GHcE5Vfk8B5MR9f3JhWM?^6a+lKYU4je;q{
zQE5MZ5S+2`w|+co1;F?AuS%K^RMh_;5cWPxcvSjjqZM49KOHceF-?c9AGUSm`o2xX
zrXHMl_qKW0YDuXfjQiV*?F=9LZYhai6&XspVxy`poX4xpf9krY!d4g*12Y^7;Q~G&
zBVloXE|pcnS=*@JqcTB6m!xx7t3V3A@#E2H04EsRxMJ(ry~&R|X|@ssIwbw1bRTwi
z*86Y>ec||SO}@Xntzbp2mSG|bT(;?ni6DGqSfcTg%Ox%d6VN4>y%CA+uylQJaR)4e
zbu=I~bkNi}f6PI7*V`h*_70|
zRqI+-jGKUozODQ=eqSpB+y(6d@4@4?u2{B+0e`1*Fkv!ZR_)60?=_&Vo0!3vMK``sgv*K
zC*K~O9KHW0fF*UdHxYVF^WjsOgbmb7WL!_jef}8kZ{F;Q`+N`FpNYY_-ZK${v%3CA
z3{KBpe`(tbqiql}OS%4-g1r5?1JmM68zi&t9IZzVGy=ojf!W26AKL@7TgVu%5>RzI
zk;)PXNQ=Y~2$XNioLbU`q)P1}nM4^$7-t5+0fJVP5K%3K_NeSJDM@@!m+;3Xi0P{r5Ue}MYu%C9@e7t(@uz6=;C$O|XiHlTiz
zAJrw{pVK(yIvJYH9qu#y8&<4yMceP@zp!rGXB-pHT>EF$SQ8HEd;Wga=UBl
zb^TGDvek&_8c@}m*_I96qTVbz|1zdPgG-@-ubGlXqkm+#J;lw$*Ks59jC<<|ZXRB5
ze;h`3bo-v218%3?>G}C@dt5g>Ny8Vj1D*u0FX^^nid%-~yIuGP00960>{)GZ+cpsX
z?q9(wK#>5G89Uw5ri!+%UH4(ZFeJdf3`0OkXNw3$X(E-_z<&IW)JtTWc4j+3lQsd8
zIMUtm?%^Hp;lfBSMpGz_K!V4~Mh|Y;lxgwKF#+v6c
zphmV<3@B?pq@zxoPbJe;2_DfUlS(iR=bp^H@J8l$@>=9E6L2kA20tG5{x}L~ItmA^
zLyV*)OwPSj>q4DTI^{a8qG6n8v=FRPJQ6^eWMZy)tY{?ih-QpSDtOeBh(%Hke_?iT
zG4fgmd7Mk1*;qVMg1|LE6zDD20zLhc!yUQGt1?E28gEFzTkVqjah`y$e2h$`zTgrg
zWhG~R%98}-xwnGu8hCpv^+BysH9!P3;kOo&K!J6*wUOkp(j}Ku?;bIf?UpDYR`;*$
z>!O6^4OwuDX*3vB8eRX%=r=AAf5)z^Y)%R@gqMJ6D-~g+ktbXxJZ2hkCVYZr0K_c9Cma$|`#Lbb5-bl)L#hd%V%jH!
zN&LQLTrkW)v_Wi$xNI1tW5SbjZxvHI@>w~pGLTwznc8f+p8`wjz3vsp!2?E`!t5t5
z=IV`~ZO+yYm;G=AAP{qM%LH#xA{M36;)?)9^G%m6aReBDO|Zj^WrcvfQ15K)2>LIL
z{u1UUPZxm5*bP(#sgr)?d<_&@X+@_6siXpd!I(7kLJqUnQ~e$nFk*|sGF}GPC51~2
zo!YLW-6e>JY{E42r)6FhzS)t{$;s)-yYJt0UF;pXlQ()F7u#DSK4C(2khisK&u3E#O(|OS?&ESR1dT_n
z=Pq!2me>Z`>yEXCt#2sXlHGhBEvcHC?g)dEC3Vzc>$BiXkui1n!oYTAU<;QWas(ZJ
zr94gt^>d^hRiwaLWkQgT7oRRWL7g%^NZBor2tf9E$RsaGg(d+v4$1)%5t}<%o>b@!
zzQiY+xYZQ2hMA_v!!fcs`fL5CWmsz(bR*Jh!ZzGJYFSoU1m(4wD-GGTrE|NMwA<9z
zTG@_hUkdzj3!LdZQy3n$D}{{N+!9QGt=7ns8hNZw1ATK4;3jW-ciK>GHG^0zwMDAy
zO!=0rZbf)ETiTEIK6BRVfMy#Ov`VSQZ%>bpPu`Ay7#kA%*IK%kz=TyoyN!n5t#QH$
zg|#=~lF8UffOoQo=M%quJaf432{(z##4b4g{m3kHVcQ?4DSb2j=%p3y)rziv0Cwsl
z>vC>=dl|Yl9+BXck(~6eA#}7`Avx@Pt);Xa>dO@UxlGYlcJAp-(yuHa?F!o1Z64{`
z5c!uhLz@T2==HVJQsT>>fB#H2jE);W>-jNWOr4_5sOjlN+{=-FouO#rVCAbv)sD0OjfS4|{D1HT=l>4WcKRQ{COhBu
z{{fbf*_!IR$NlSWP!Fg)nZfU`300960>{(lH+cp$__pe|T
ztVn>!s@*k7T}RtGY)?TkG{auj!JwpLi3mk%B$e3f`rmh`n`K*aVz(QA);150Ws&Fh
zoeK|7G)*&q>V+}_{K^#g145>rhR`r6{6YJ%dLkjGT3S;}F9PhfC)Qe-I;y
zNth<{Toig%ypcPrX%#Df=-kvHR59u%EQ&x}I!5K-p#7{N(HU(F)ykEEFCD*A3?hVk
zD?2<|JtU)sn#F>eTmfpUsL-4m)L2Nz@3Hl`_2XpfC8GkuHJB1(GClFUn3*IGhM`Qo
zjMH4RfP+T`LsIpKBmzKDH5d|D&0M8nLe`9b*
zu4S%5XkcB()kcu3T{KT87G$^&;vS4!lG@0Y&=#@eVK9|ZwHc5y)J8E8J1fLmfu}PF
z^=heD#(>}S%9>i#Aj2RxsQUMozEX+wxo*ot2`sEy!z}e+F|)vXo*5#0p_^1`#QB9avonCJIK@oW+;`
z5upMZ!w`88Yhv+M=UFC|(F2up&?KN5w~IUtK#{p#R4Fx@9KU`2=I4_kYUxjt
z@$S0gQWfVZ2&0=2ucD=>JY|qPsPMEnRk^)yIr*VxFsQ;9lX{GQbM8+$^QSg-nmiOm
z?)aq+RbjR$Qn4hrl(QOMQoySU#~@U}a?6*Ib_5zhUI)Mej~4XhN8{fxIuQP!D*6rd
zZK$t7lF}QsM
z`Rr^oK7Tp7c<$n1eB4E(5!wleL-?I^5#2dO->_{8+Gu^#N7G64c|twj1@+TEb7@{Z
zc~X8K!h3Jn=alOP_kXF|D~img==Ln5uch15$B!-E=hWh%zii|6`+wKy{qcaVj5BSB
zoVQy8P3{sFCM2P^*e2Mf%567QgN}cu>LY4_0i~FciXC1B)>(Y1`QNhgG4l`3d<_0;
zfZf-hjwCFyuQOmfd*fC|ytcj75Feg5!sZ`mf5D7{V0b&2WmIYKp4a88L~z&Ev4y-u
zaj$&q7yadBU5~BDWh|W%9m)(&>%#f&9f`qI^&aooj|qBsg1)Jdw+B?YVsC$`G|TwX
zK9`PSm|4`a8Q}4SNT$e8FVjGBZRZ2!VWm$=m@5S$WR{zVY%ysPx>m1h4L|g@>epb3A!%90Onu&9
z-UdK&+m>TLeo#NNqjzcbDNSY2s0K9yLvH|=ym$m3e;dTM%i`X%*B;`pe%v}hA5hZC
z$V@i#q*fklPac|XRX4;}$-O8-TEN{CdmKJQ?~1S_>7Ebwbm&In$v$LY=0mAs&r0^x
zJbZEX?V00O4`slj?X7<+giVux;aC|>3|5EUAl!5Q+)ewnj+|F$JZwC9F?x1(@nSSO
zf7w4}e|G$G;0a=%!RI>Xy#}8eeZ-;-gNWxPy6I|x?!gRc+vZ&$9KD_wiADU
z$&Km%00030|Lj@aZre5#zV}nGDmJ7*WYz9Z($o>wWw}~_bxpUMwg_nHSmI1mDoG_a
zh5>ni?G3he|wS&HB02;*1K@O)7aVXckEOW<(x`Jg}(hw
z`$?DK^Q2|?*yy%Kd(g_^2BUF{k#S+rbR$YhCKPZ8G)3L+_zad`NBZeUNc_a{hmF>_
ze`KWu**db(eaGL~IHZ_3r<{duzQCPL6YGX`?zK_4J=)0e8`~$}1*A;2Jtb{le@LTo
ziw`E9CW*t7qQ73!X!x8;1;-s68?^LqnV#ciibVz?q2$}6=MVQt+0_J39Yb=IWIQAy
z(Ihn<5FG=Nu%JvZ5j7)YwZ3l8GA?|ln;B7>N^O><=uM)S#)ASGJ?dIfZB2P&lhjl~Pf=fomZUUbFWnAv<3O
zabut%$b3qZ2_>Cf8MP`|>J{Cxb#Y$Vrtev}X
zh?(+k%)$`Fp`&F6#ywVwKE3
zag~c%0vbV9wuV!P-
zEvgZ4nrU?X8)IL%MDmnf%SQ}Lr9v-_-}&!--#9(k7yvd%M@O
zdL89^SY0GCT!SgE6*%|E!NEU)y3wJc^GgB?wkN6oEDTA$-?@ege>P)*<$>B9EU26-
zOnH(CGj{Vt;NFZAB_7x3f=gwTEdZ63^I=TdJlf9B)7Q}WHM^p>wr%HUCBUF4Cv2`U
zerDXCaOPu(6H~=iO9)%WejZ9O7YTMe6)R%5e{yU&CFK)ldK#b&U`2P=(a1c{B;ibH
zlFUf;Oo`_i53jITe>}7$hox0V27k!STli~=w^U#ajye6Tkhdsb1{Ql5+CLe$Ts%5F4GE?J|d=c}!c`oqCX)C3{SXvVd1yOUE9loHgm
zS-Ug!=W0&0Cm)u$Rdd)j`;}S8^dA@YSMqP>#aeI+I)^MJfBD3@w%vWIGr_#rX*<1@
z_|aH~Bp;RS;;c=$S2*u3|6GH5clp<5v`>AK`ZrkH_6XANt5AD9`h|8%=ljdw*J6Bs
z`Nw*gAFZY{(J-p+J6nq97L@;0UGxMS#2T)eGD7=E_c8c+1=4ULzk_>kT7^;1{V51{UkfW3D
zUgTOh^-q}y>?;Q}vhok>E@ddHHA5i;%K)s%B9bzNbA`={XK|5%5l;nal^<)3LsV?v
zZBTweS89;UD%4yA7O7s@IIJI?Mv;|m=3g>qVG&Y^0}|_Rmr#EM6@O~ne6+42Y#8a<26cq&QLu
zk!Y5&P!Y~-R2`R;zJG$`e(u6SSP<+cB#MAtIZ9;U1inWq7nx#KdP(7OMpsVIn8x>v
zt?j_W_8~c~yh+Tk$^__Y1!j`!zOEd`onWWSqw?X{_mb0KP!?0-k|>qRvFF7^CE0Ws
z@`aaDoJlgJ;9-X8N|8`{Q_82_0u$y@GObyJG!jEtzPVn5Nq<7lTwK6~1W=s=Xj=h2|!lA&R~nmJ@@7HyXab9FDwS3@V9Q&_>n;zUi=ni{&i_xle<+?-}dB
z6g~94G|20=<$nf)`r~#FIjJ2)qAO<|HxmL_xH4sQou74xZ+U)fmq+Ep_xbsM=ch*8
zr_4`f-tYWSZYJ}9>8S#I!?RQLcvO6SpPR08V{_CvCQ}II`c?iq6|lV!8)ado15Pug
zOaICE+mg`sYCU&6uXDFzO4YasGGTZD-a9*t)}r>xAb)UljQ)ML7F=T%XE=sGa9n0o
z>pZoW>S-w`SrXyh$yVta~WV@r&Vj$NPlKD@F{8DcZ%$G
zmqA)cFa(x3T(U&db_t
z)0l#AJ%YIk2b&
zmvKwL1Bkf~?e;Q5%sA7MK_?rB+QW<1vEP2lxcUUF`0lZ0jX>|^?wheLMZ!`6lUhGz
zALZ>O=$RgkMutA-_0V6tF({>5{)$*sZjGJMFH=R=F^bUjD6Ah`eV-{@p27&O-K>TX_#
z9j^D}j$no}s=8kKKGrUM{{a91|9}7NS=(;gMi71XS1cGbumMw)wsu9EG>L6SZMvo4
z8qhuN&VhmD{#0cpyj^C$a$okYsF){o4xj0~)w3&uH<1uhN6U!$4*f)if#}dl_?m#y;QwHgLwS2L>7aLZN7x{o+v4mXYu+wlSl9p6?m>(7JK4{9g
zMGSD+G9n3QAg5}Dvp;kOrlAqfXSdr{b^z1|nMx{NrzDVYb7{S)#d%`RnOImvGtJ@B
zy22ksM??q6By5@yMYBO%rT5_m4
z-8I##7`ke)0_?xiXKB2L&rki|acw&;f5t`~su(==cz-Fqj1%T*g0|eE8UbgCM%RBf
z_PI->DT|Fw&e@Vl=Q?#WYi~W)4z57+Q`*FNctrkg)`|?qJT8qYLz+>=JUcyUxl~7C
zhIK^7V~qJ>94(H!LtUeb580aRm^`$AO&HfU69sY@`H5NF8tfOjxs${7I$uE)wU8GM
zYVmKl6Mw`EDj-z&WikmRSvpCUPGVe3WpWY>cPpPwkLbSXB^&YJoy0z$dfSL8}3`5Ye5e
zAVD?HxCXP0F*k8ctd0r#MM=z}=_Z8*R?7r_%74sj(ic}#leM|X3j7}Y3eVO>PR+h0
z&KYWiEZQ8F9>j)@V-kW=xIbC1A6M(I<{Fl`+~?2@*(F#@wm;@P;6e*fg`^yJ*G`&+Wzf3mIo-sRs9@d~Je
z)H!0o`pk40<(;K>Sef2`00030|Ls@XZsRr(efL)oTwvh1ECP`(>G$v7Pp21GmlyAX8I7I>4jhg87S;tRrGXq0%i|nqBw+h?Z9nw7
zClea|ob%EM+#3Frr@C*KqEXmuO{32|7w9~!WVwk!uguO^f7q<-u7Fq5lyfVGLVY!F
z7c_bt0wcpdfYz#)gBOG!zC)LLVe;f(XJ?PYz{pr>HD
z$SHBSZMj%XFJYD5v2$0*h?R=ZhZaEwJO%Bu3fDQwG~6xen_i3~(_F}VO02LsEa^4g
z5UYsIklDLZdhcpj1Qw007Tzw{P{Os~K_=1^N?;o5;?J#IQJ5G23tJ_PY~Nh(=@f~Q0j~%n8ge`X@}gz-Hvtdi
zMwL2&f0oZfLS4cHCcwB%=GcY5;&y=C&PiQLD^7j>FifB-laBLGCB|wY*M4FY(G9?J
z$}-rxePOX-uw6MO*etww7tWaPL7Cm;{fQSXT!<}S(#KdeuD<Tlvu|1X(mCG*Twe=3W}Vw=H9LXWu-N#GySh|66CdUi(U^RI?h&*HzGS#Q>mT7j%2
zf8W5K-fBl@=^x5*Qw2ClK5ijF9tm&TmM0PKt1t;jQ@XOi-o`Edz$huT25FlO*zq(N
z91V~Xeus0yZEDf{gji&==S@H0dR=Z1$k6?ZrMK~IzpBK+uHUh)8|!O(`Hv02sO~4&
zU1#`P=FuV-5pvTz7Aptp8R&vXj)@=G%7cc)Ei|G}{8Kv854kU3__6vZosdV^CQvx=2_DOhl21=9_jmsEeSy{AQay)gN-hjI
zsYr|0m><!X*wz62nL!NmkqmNRN~oe3NT?bKNbFm4DAgH@4*KQ~
znrDowftPBXpM>FTHVbCmK*&kh?)7@%+{k!F=!9WD8F++ysQPq(?2k2ZLh@p?W``#E
z*jnneT1S7O$dwm?LO&%qiL7QnBO0SP#ZnPH@CrTlk3AGF7d6$4M4uQg6df@VoU%j)
zmm@w7KIeonQE23&Y8g#iK`UtYL#I}=&v8Zu-h^->u@=%pvEZ6;aCkOlC%0rT{fv5C>5tS06%g|Fv#shyZp-P7)exEQpr_w)v^TV${pPzOD
zt6LgYv81_1O2&1Sqwg+HuP%P<27f|=`k@nw4h~GN!ZKO?kw_LOW>`V3mI3&bLrjoV
zXFY8rnpBJMcx&pMPMEfxCx?&3nhI{sWFjdTNkr_GUg5LSlJW_d?&r~mf?H{Yv_Le=
z8OeXZEz&7Ls&pd3gg?THBt9>)5t05_$PBv$g~S-0UcA2y`e7b{#dpg7i@4B4y|$JT
z3lmR4HQ$S0NYg)VF@WEW3ZhdsDeofg~ys^1lcm7BDX5U1#HW7P-;-O@(X{b
z7OSn5Es!L+P!wis0jYmC#gt()k*>(bClrBeI;LP`v^a4{C0UO-!`Gz9ksBZnX^FXF
zSi=x<0qIdV%S+KojtZ^_gLXBJyoi$di-~><{cOb6g?a34-9(ynz+up6%Zp4V4bm9kqY_wimr@Qi7>}@ud*@E#dC(LoB~)Qkt1bZFqhw
ze?bsz%pc_9Z?m|;!N#1QLHqBRTP0*;IkpDh*^t(|ly=J4R%2Z+`hAlz)R-SQ6rz)I
zmmJ2h-%yTOv*YOXW7r9wkHBdBiQ2kR9wUU4#x*P#cPLv*)Ie10gh2J$L1XVe;)z&E9%Y6
zc6icKf*9JKA^>WYmk=o$iiJ(%d2sJ5<&|?zBZ#9t9^TEqG$CU3vxw|H6kmh)mXT
z+~}w)b4!UaW9E`Yz7%wdnZ18b3VY|UD>?<7lhi(_UC+e$`P<3e(RS>k>PC0J+O&?3
zd&kF}H@(eQiN|apsHeNEZ?JZy!dPunc@wBcPgQNeijS$84qYhu=C`dwf8Oe3%
z|1`}{$=|{yf!jdoRFP#^E>?sN*fC|w2QH+&(ugCHWgt%5H!Rcu~
z->_zHNs10jS9JwYp{0tXR^HD%;0F}@DNTSP0N<7cF(jC-D}Hw7>fV9-tPooo+fV4U
z0`3(26%(o>>ZhG0BQIIpVI}CTi0#q`Snre^yTOGNvntG{bwwu}>q3%xiYvdcuMI0o
z5w>paQfuokUs*_1xxs&139SD4@j>zgDC$jU?$QLOeNs{Hp~jPEgE$loAno&)4(jVQ
zoX?a?;M^Hj4M^R>{y}X_Yq_*faAha4*Y^gv<Q!4LMgjvp;TmgTMU)ZzJh}$;R%HCo|>sl@^_GRzDyRdI;g?rak
zf?Rdg?zFS7a$HLVrKB%71M1l51{wrpm*~qh){9;B@15MvzKp%m;pO|q3Ds#a3gF@$
z=H+)!A%-nup=qqb5fh^@!<2`Nj%pI-MPxwchZk^<`xm!klmyuW4vT0JS8iC!Ijsf&
z0J|WQp~n@Ma1jLtmt~j)6o2b(+cp&bpQqp$plE?g@}+5;)E3aCDUdB_yENM{41+;S
zw8fPoRg#KrY^hf8u;T8x~e
zPOJ4Sl7+@GF!VA?(%5nKa%u=lGNLp!eO#JR@EoIP{?ahRY5b0pQnMka;W1BDcs>-P
z@U2RjARGm#ev2+!VJmF+BG1(jFGx=NcuWOV#7KovB88y>^qov!$;2{t;cuarGw}hL
zSpi&zPEC|(jgg|fkAJn9ajG*)P33u}=%|lVrcGqs4=86-rh?O_KmGp8>2W7?yp>>`
zC{`GxRnla6c5r@tarSdJ{2TD;MV=_$+p|zb6;{2WOlK(JL_?_N4g^eqPk^bHp0yE6
z>zD9&6LOv<%GzF$H;*QUN#UgAGA%hxWr8cE@Le0l#26&^ihuZZDIB#%Mk1CMoaUev
znT#Si*P%c{FeI9$fhhAKRl!KAoEY~)BRN9HXRpq~UR1;&@TGP?k&uS!$4*d6Abd$ov&1-AOB_qzT9+?N;CcB1g&*;?R6Bcbt2mf{^Q&OaRu?N5
zAVmwQ8C2E`pnrKu7$>$KeUPnA2!b$d#6ZY!cH}KpblK;ee4u54eEDEx6cL&e10^UV
zz@tfCRHWkql|oYv*=iNxn9=Ejv3UXMY{{01MS?eVkX0<8FI*`K$JVC-v?{&oeSsYw
z!C1+%2!Cu5wK@mwR`>9EyBoA|{BRW$w1@bJikrxLw2EnBt8-Ujkbr-#H7;diX7oU=
z2W*?{zt$PL($a4-yxn!-#qooWr8F-_%KyKKJKY@ik_cZKozv4+5}TrOUJ6O2%B+
zBY#^$IJYNG`mtn}guA1)bO$i^#$;gBICBpgXH_}6`{R{AuB_3`%80?|EeJwI$g
zBo4k-j`+=GjkKekGj6AfSoZdov#lWvj%NR?xA4Pffo?AKg*8$Qy)z!iZ6-rKOH&?yaY%GW=6>UOX>xCXRs88Eb>sm)zdVl}$
zku#|dH)yL2YkvRiMlMe;SktdsxlHiTZ~TuDm(Zi>9T~j|)jLOYVO)EIaS9F`0}tZB
zUfyjrw)t#(KUn1aSLg_h0=s!ns7rHmC#Zil;!^9coU5T&@*O*5u2!Xkv?>)Ad&b9b!L-%nLWE`Ks>_m0`q1*x6VDv*Lh*ITIu5(H@H)>kk#gI(wF
z*0$vCPp@QobteeDAuESrBJ-%Ijz|%KMlmxi(b160VU!alBF=^l3VV4N(&_$Ly9SUY
zkb1;J
zwvCBx8xz~MotzU-?3}S}8xz}}*qPYIoBMjcs_zGMS9Nvu(Y0e+%O>bV{O3LPvO1-~
zMC0&7eQ8x?(~G;9hk@+~U&--$>o3PK_axzT=$ql_&bgmhcrn`8wCk=wtWv
zD5lhmZ*u+@IIunk!v8Lw?{K73PSw
z1y?9ZjlSccV^d5(%XwI30T5$~^OkrYBucVSFgjrSoUPb9Y3FbxU{fPca+1#SeUC^0
zJ!Rz<6z_kWYEFKkUL_9AcM@IaKM5*9iw9)UDySS3$U?;E8cf)F`d8}Q^*PJ>O#l9`
z$`MKUUzPJ}@v0*pY6AVuYQQ~gm7Zapoj0rakfw!}>Gz49X9Gy8iT?gEphSWDn3YC%
zflbgBGDn+oxit3F`|jqB>m}LBUiD2jiAjz=r7LBsWpdp5n7#P~N$lvsgo}%X>v>PC
zyA&Q|!(gd0>OBH&`>t|?tD19~P-7}3o_)yuHD;9lE@uu&lPN%Qm8hT|M-P&@$j)4A
zTg$w_OnNq6+XJR!nnZO-GAyEtcJTg%kT?*KnhVI(?IYEZ)!Slkgf>RAmZi}
z1!+I8ec7SSK5Ss}j}U1QBejNMI78-Ox?i2tr3=okwg9~nYWXZf!?xHno?X)JknK6~
z)_oDcV!`xB@||`^LRz6~Ui;d8{7c3Q1LwTh<`Z3{50FPbG#1*mVgi*oZe#sos?7&@
zV`)@^g59haACv(bE(9r%b%!0a@IT%Z^U?h)86^{x
zG#IAbT7W-|${4YWlVT@JII3Y$!ELKtcmq_kq>$vnYoQW!V=j}lJ(S*I=k3n%scH0K
z99aTCei4N(RACUB(;P=KkIwcdpsTR@vj%mCi-DU=^z*xLF2_*`IGu8QyI#ra1l8!5
znsRu;Fgz(Fa@vRf@z}TW9`|XZKscuq
zppXE}D0+gbqBlgd&(vf((ud_fX!_NSq9#mJ+Zgw(>sIw)WpW{l()y5FX_hNC7Se__
z+vj&%gk$X%)qy#A6(~sOc`-qKn@v$)-R{&;oR6K@QKwy#5yFw^z_wR$7MdGZ^Fl(KJis7(eABUdT=$5C{
z^rSB8(I72sw(0}|Bo^&XqS_N{;G@--)44@Hy<#(9wIr+SJS(@^FsqyUtrl%~nu)$j
z-!41g=r=#ra;;s7&2S#un=7TDb0_-VGT|@#U!R+9Hsf<^xii!BCDtjWw5g3l3;+f8
zMZ?2>uZryX-`V?es~YQ!M4;!BF%`sV;>RixI0O9p{5srsyZ3Ew>Y5;!Iu+732b+t5
zJTWF*`7F^k0#XxM7>+1z+Bbz9nome#`wdg>Q46wZhroC!4gWPd2^>4LgTB;
zH(t&(c)KUgMP{em{}(qxUEjbT!Q9^MbNr@%n9D475J(}$@E(W*?sdKvUf%I`Mqb)R
zy$IW&zPY=SbyDIzwP>iuqpqYWDAY@zH2Ui*1_VK}>1<%VZ
zKbzg0#}^Lk!+0bXq$fzowHW4N-P@cG=9N3g2co$c256NphPZ|Mj~PP;2VxfY69mL9
z7Zil_|Cli(BTxvf4s{UQu<$!-dD1Kskx6d)`arD?2yQ@MeGLU{5=eV4tYkaI-Nbbc
zmTFaLsIpH*Q;{EPZm6`}B<4VdUYK6USnMQhZ6t02IEAbNq~^(m?)~}|G8Ky=nCCFX
z^ojcLV??m9Uf!1a)-`ts1iCy#h70(6J)<9C&S`Y81(4=Me8OCv8?)jCmfBBsH_a
z%)G3hNT`6AY}2Gwzl^;0W|L0{9F_zV$tqGy)#_xbAtyAT%z9tU7au{2$=a_K+);ZJ
z@ErIC?46du2>)k_6Fib*H9GsBppX}NKcy!@eSKZ@mzf^-v{Xqo7x>bQs
zJKQ|K82BCaDN`4*`Ef0d#fxd5`LT`Ekiyy<*eN>1_foi5#3LgC%4JLO<40}ToktZl
z1~E1?=}gr`|08)lQ%Sa80Xkv=)n^st^qWD{?&e6d!|RK%xV
zf;MDT4~1Dqs^N^JnUK^eQMP1#aJ_K;Cd=W?>cSB|lrq(lY9TOkk%d_nxVymoRLlb(
zv;_*U%a|r5j&^OKgTf*2|qzs#bDP%-)NiZ*4oT^>7pb9
zuXu;_%E7%wYmsf%H}l6pR%f?^jJQMBHfO3c2Oh`Yg5SUJsJ;;!r*E;-9lS~a_ZI=`t27B(R5
zHf>H@j?6rrATiUINfI%G9nxSAkBI^{m<@&=-w04_7GV%2TT(q;A6WX&Eg_PGAw{YM
zeGAMUxurVk@9*!H_%OS9hnQ%>G6~+P$d#A5lm1L^2cNiC1f>Y%(MENkdn4led)1p*
z!19qx$YB8;%*vU~RmCA;L(4q@F%qD7N7a$U2?d07ddG7p5w@^I%mXQ(*Q{6YC!4Fr
zX4JARJAYtj
zI0)g&fmJ92cYUQuDZ8D4+1zhrpQ0mqBjk6IlhiS3S@_BKKITE*L+%GMv3mg2GIlF2
zu9RZ}GF(vmCY-Al^wgY{D-z}&FRe_uAsdQ|T+&1J3d0Us;GL!;
z=4^b^q!IryKwY#^eOCD}#nF9$SiZ7z%)ReY-?{!^LC4;P6AUx=@!U!GRX?M8^T!GD
zaz*d2O8HRi14M(BHIGz>8-Fa3CcZCIe+SzpKf+6u3TYPs8M>CH51J!QPDCu
zDksjr6-})IEHI?pCgaKa&7q*X*DKa_Kcj#48egjrlJv7!Mz~~L!
zeilU1_x}MP_`_L1wYT@qDoyIc4|0ZjcPz{sbf9+8BTysq#k3uEoUv&+?7~Hn%k7Sm
z1Oz-j@4gI~J`?s)9u~>L?sR?CpuLV60zO&ra&mHzrkPH$H>D_oYo45>uA;RAy@k$r
zt7DKGj{K)a1+kwBuK{_-gF8m1PNaU@*!Nm`n~(uR{PL3V$=^3+x%5AYYGzwy`aN~r
zTF-;00NP@WxS3$a(<|4Y=jYP^!zcDC<3)xV~S@Ix(d&(({
zkFBX%;tfQ?u-wx>uSawS_cN_QMmupqqV6JwLG}2Fua_-L*C3f8W#jKe9YRu}x4crK
z_ty)+J`EzeK0ntk&F?|Ac=M`fCQ#clLz7JM+hxR7?`s-Uq=8r#hPDg!W_L>G?aT)(61_3IuZW
zLy$lUH4q2*0d@KzIM6?;z%`0=6ub}#*+_muk2VZE&j1VhAy`2@flK}0zu2ehUwMHL
z=m$7L^y!nu(z9ng5(V&;xB1eeLnYYE@`g3bTeegfol_DSjl<*ad0wF6@hqJ`uypo3
z!4WQH-LP2WROBODXlz;AYUBKa9;!LDtJRsbr547c#)9pixd>)NdNG|z9=Dgz-$((Z
z?&FmFAYWl}fkw}{bsKeJG=MDZsE2*Dncdi1Ub-lp%bIeR{r!^z2Hw~&VfCy|(Vpj`
z`|6IGV*NLe*GoRLSWCQuD=J8z5=2QmL%A*2=89*yo@08)B~EakCV_6XboJAm&=KD&
zHN>c(_3hcZza~-&`sk0Sd7)&%l(j{L@rbg|s_RPROtz3Uf%k`%Z-DwYw`M)%?RDum
zWA}}J1(X9I&7thF>r1(y1fN*GP}NdD!gqS8q?L7FCadNAg3yt$ak8K^cHD+Z82mXg
zHj2FuoC9;|vP^OkJuR-;L+72vgC7RbnJz@jc;IS4qy;XdpBKQ2dLAG$p~O1_p*)MO
z(smbp}>hVy8&4f?S|VJGB0Ad2yKl0F<5U7>w>3||w8;%6(o2|Z`2De4~-_K~{2#opDCZ4;TZ&$TnL
zsr7-O%pOP@DHN
zh5q#&eGmMlORZ*9rbj@}ywF$B$eVZVz0lLy>;n=Lg4jy#nfl4=$|Kpm5O8J$0uzC9
zYrZMn)M(Y`XWj|$dIaJJVDQ({Endz1IF9nay>fTSvKP{YVsstt$4kPuo6=zCL}I0a
z-!Hu^mhFLS-dTK_e;X;%;enb9#uZUT$z2U5bfmkH6QStk3MDE^NkQ-_(kvIsMXYRM
zZT`2f+!o~r%Q+)tOE!O0RS4O@(cFJAm>z{BIT3x4?1br`j2EFO0c>nnwb(Z#5md7K
z{va_3jzX)@{Kn-9LUu_o&zm;2q%$L=-izH#)#E^`!nLBrz9}lS&O(t;5K`pcLzxTz
z##TuWV|De#M9Y_ginFue0h3xmO@_6>Su=6Zb
zp9?TJG>rvm2$(V|kTa1YbDA11T*dj38!2t{BAz3QeaN3C1LU+oKQrV4g})Dg20e2O
zGrJD0+9Lu7+R$+Ggg+OUnAWU#0Rg-Ol!mH(M>X+ETlD^gH9<}E#9as6ms}%k4|6L}
zJ~K^yRsxHOD|%D(g5g&$8@kO?zmV*unAD9@I^z2Gn?33N6zm)&nKdoN3KPO~!uaKa
zPZ$l;|D!SM2B7uW>KxBbWCT}|`uogA{>@jJE*oMjmg?obbeoGe{*^)YS9*OpClJjR
z^bK+u#+66hT>_@c8Dp_Uq?P6-V!keX#%xu+
zKCBdHnX;9)o4SHq<%mdR?(pLgarm(lQ)uCrHAjr{$kaTz5N$h$IS2dDN6|P(k(X5w
zxJc?w=tt@rC&CMrh=qPl#`KJ%NY<#VYMpY7z&W?x1g9ghZ8Bqy^RUg`Rrjn}iAoklVztHqt?I?xPi_{PjWah;W_3K-zpE
zFL5F_nxTE?taHrjH>7<$-CJjp94VbhQ^_G!1E}q%Rq-v2Ia(S;bB3R{&N|FaiG?l9
z@149}8&{8QgJ;!ld>F%@`vyIRrD>ATQ!h?k<;tiXce3wVNWo5>*Yrxr8DAfdn{_+0
zNG?w{4GxESiRV|(wS5b|T3;5qXO+|p;Q2r`#W-i=tR5U}xU-G56(AxHh
zG4%+Z6SVBZ*8>~aVm$B}0(%|~6w@Zkbv?o|!)cBK(9eK}Zu{C{*|AW?X!BC+lgM^P
z9R>`3Gy2u9n+(I{=gfB2mUw7H9rx9!0L~mt4ZTf;^g<1XxY{4zGyn1l_khnxHO-E$%({K3R*TQrDn{oE557A#nj`E5AJW9Gm3
zShfA}*Vn`QW=aqY@YhVg*86J`zzhg5OpA+)#Zi-7SHW-PSWFr~^m-r@4lKuxGcdM9
zM%9=+`Q_`=5cd`b3^ufz=mP>BpHQC-NBffATsW#lV+T=x6+aT0aF1aAwO$Z
zbnU(B`=Dfnb3K6LBadgiO-xU$w!Z9E6ZV?h2C`MDo|)ufL9Y!?LNcF(de`Y&)`>>C
zDeOulC2`^aw;QWJ}ps$L+-Mqx33j`iN0A5xJCuvrcMvdS{w%Q9~yh4~IG<^D@8
z>QSOlPj558I%!2=p0cS2w1h!m((^aDHF*}*-oSUeyWT%~YLq*r|JCyp^wM5)6Zu$~`!t${4CYDliqHZ7K`hkQZQr&%X=Ec4rF$rK
zeI~>T;*b09Zmu`9=%h!>lc_b5!&DCCCm8_DB!_X>^~et`lO)M2x`!UA;6HgV6ICIp
zQ>7WVlW^_DRYJjnMFS7NDqaLMuU;vj({GWT5<~>=X(C+P`0GuIS$W(yaj;%#6jR&&
ztOXrj0@iP}6sypBN=wECn%-?>ynj4|zd@UU)AkOy>MCg;6iOj#`e}Pg@`tbxOFe+h@~c&2@dafy7g+km
z9m=nC2Y%}eo^F#a@=sCHPMNvJj_TZH^EQc{4!~{a+-N)V{L*+_P;2nk92Fb$<(>XD
z+(wp9Mn=~S*7pe-gcC}FA>;ay&OB}GlwJz^lO-O+LLMf$##@hKF6!6$Kg#?;ep0n#
z-z1}0ln@Iye3M@Xq(OwoV#@iYJz>t!8pHqA$Gol
zm5p~zOFsHtq#O01?H1w9=R)06-lq9mGN6=n=@I~bft<|N)VN@?6ja3Nh>2X?w5mqqAHyQWOg5)P0nQnc$1Z`
z&x0wws5=wCqFf;Y1K5#J`+mwX^I}+C%pbmJP*lD7AbNlE%C1*Cyjc`*1-HvdVSsuW
z(i6UQrT^M$M<&xs7vJkG{=gPKk3pnEXQ{eVnLb{3aZ*hz{)!tuWYpOrcod3kG%`#_
znK)oBus6uvKkXN!0xMFd@jCMr%w=Wd7gh(a?PeWszNWI-pqb#A!$YWw&AhfG9BE)7
zCi_lVbl=`T`EFszjB~1b7{)J-Qb4Gg^l8&+*bkG%12?$(cPu)64A+S(wYWBck51{O
zsJWAfmy=y0w`xnQh_Zr52BoOUWiCD*ytv^JDXAH1PRW)=4!SoEi&Q{e3Sq;=)q3uI
z*UY(MXYV+EKtUsyV1#yHx}M;*dEDC%--~WL@0n%}e7wfX+3n5lr0{^FBs{5Z@7vIj
zc$tZmjLA|y;%toyKaHSuKMlhvVE+7fl-*VdDSDJOO4Q(Zq=vmBWy55?9KDf1m4I!7
z_A^)kk5f;}L?5ew-;2^IJXtqWWj|-Vd`Is40aVv5{z~ci4;F@HPC*R4!dxC4v;>N6
zb`vai!+U?_WM!KkV#n3!F04PCMVGh1WHBpjR0RzEz)WVsgfGUwW_Lm#hrr?z0Yr&n
zcOWr5DoP<1F%0U2;my`r9F>84E$6*q2lIGmVx4#)mT-wIeVWPP+b7lQV;S0BUx2n1
zmm^m8xzD-*T
zF>m?gi7f2+wUR3OQn18NxRCus0=Pz-O0$k&4?}p=y*l%nm&U);^0j3KO8(wL0T~u9
zG6EtLfU4uqgk|OI#&>PINe4jglg5niOyD7py-kK6#DUInf*1Vo;JCoO_VXMd^sYq>
zd1nc>;>C=(@opUVzJCYqkIfWXO3k?43Frw>ar5iVHC82c_bL>+LUUAs1AKmpkqG{q
zviFJp%A-!!Eo8kE@grQ&P_DsPUSXq}yuIllF3s%p?g>9Ty01Jr-5Y<`)MlX9#A;i=LLRYw#Nd`%RS7_JG-n^3E{?MX
z{C$g~dVPZcFN|w}0MXAN0;Wcqc5Wmdq4ryeAef=Ifeb%5z7N1WS!n!MjACxwrq6h0
z#6-vJPx8GDeU)ec9Cy8s6(fr*q`X6y6u#YZ6KVM>{aGt%nIcBwVg5i_I%A!(qgD+>u{%c5!L(N4>f}~R^E?83Yac6$
ztN3YG({{T^DNjIMnsdTpK(#fUcm7ZBrSjM#ZlH!dHSfLVL_iiFG!`ymFb}w?IUk2H
zTnWd^5LN~3VVldFL}@lvV47K)2E6OskEn!53gIhNVOV)5k(8fq$o|yelk&r581x_T
z@j3^;obuapf6apiLKsKKzzkpG)SQ$~t;71NhZz@4>?CQqqR-VV{??i82R$iu2Te3-&kj{S`bU
zlCA6iRJ$g7is|(2KHGYjs65sL_H1?LG_hDa3Vs&uoGu9gJf(m@;E~~MZ^M9HmIfP6mG
zFXevPrS*{rn$ui#3C%ZUwMu{_a{`|HF^Xp8t8lM@e**Dd)pFhKc7Feli~i?BW9HO(@%1aHqoOd;>+IvPgqwL=b#w2^raqZDrJXLi
zhH4fb9f>u&GXmneJ9Gc1+q$OKU7=hdj>r%FZ#}vLxbIEJh?x83ioSyWX9{M1r3gT7
zW+m=y%3L{3xwgt2lXzE8^Uqy^Jzv`2js@+>F
zv2;z@G3$P4L=G=GN>i=BCMs>lfR5%4d8cQx~!hvR)>F@gcTWpe9p9XEhN&ba2d@g>KS#Jf{p#&*-E_Q~l~0wp|{=Si
z3wt;5G+~b?rIb_9>)|n=C&YgaxtWLmY4p{gvLu`yX7!+`?Ty`;X{*s|cz$joq4=Ok
zShUg(S?!A;ho*Ts?&KgLAQ2ph^zRt7mv2;_>(rXAHR}^6(6GrR7n%fOW$pQ8H*m^J
zC5^tnFL1SX7rQk@lg5*lWwH>E+csLqT1ex$!nmI1tq41ME4wDBUuU!&|5F%yDc)FR
zob@YRCZCXlp>s<5M^TVn@nL(rE3p9U2JPNiEHc-y{!w0IYc9N6tkdN0k>U&*Ei
z2*|?yM4=NXqCAQO7%NQk|LF26ax%yZF)p6&vJRB3fgz6=HkIs3OI)ig4+xjc$6Y3x
zL}&U;*j4$7gXcG;g8Qy~WJ=ZvH6SZe`WxHUIWS5zaxL_GiQampj-KfD(ffp&_+Y2*O#wfuZRkyBWXF4`1x&2MSUKflF{@~>;c=Ew@&32TyDZJG
z9xuN6Y4$Ce)VlDEsjGwPb1o;nXPWZEMmy#1O&J&)ofOBw@Rr8O{)v0)EnJqhAwzIQoVTs1)Jd9_7;=;r`auF$aGiOoTU-&&%YVD~nq6~`bd~IS
zG>jV?-gJ|znXrHqVZVP#A(7x(G(so9g
zpdu__AoOYEnvfc8=Zx|s<+Y#TlYLx6BPsC?$d2b(hBH<>MDOR9aEkjL$u}_tNtUQ#
zyU*BH4-fEWZ)OKlX$}=$gfmgIPELe9+yNUOOc4+`7K+x>VLHi1pZBvNe;W8vl(?FC+2nlkLH84c#G0-u%&lmK%B?6UaomJddYsip{yJyQRL#~TWQ
zL1kU=4kO94<9}yamDV>(3BZljv!aSZ$GnbU!l$^tR!z;(vakjg%xHl%W>gEsY!%V+
zTl$;E;T-J{=pXJs;Gf77E`)X{U7wVmDV&cyL)?3pEw=2#l8JdP2u#meUW(qVZD7@;
zpHs6fxj%P#wGs6H7Teh_m}>ex#2oS
z6xCYLbaiFSQLaf#(2S)|W7Hx7gGLcqAj$7zZxd_eQl&dz|
zz#s#Op;X8VAi9TAWrvydwPYg#raYXaYrHfNmQ*ttBhr4Wm}&T_kU;u2PwECX#GS8P
zMHI6%Dd?C7eJ9WcApC4Iycq^)yRd=)ldrKDqI|E$JUcEcXss%TrT=cS(6a1={3tiR
zQXv(|grXF2(@m1J(hwy`i+3Aa`{2^O6TlI!@2MM|KkSwLYlT#>Z~_q)(l_s>EYrb1
zIuXD4Lm#O_`NoZ>*YCk+axYJ2d6N&L
z;dCw$XYTFv#~-Q+^g!yX$zjcQXgdKn)>~9*mck~BfZ})>jUYsgW&4`1skPXRQAzWv
zDJP*Jn2LxT;i8T-tuVpFiv%~R)IEw$23?XV5E&$uaGX#gQ`Jll+$iNz+th!T)NgEy
zf5beZHwvIIYVg5pz6hUufzqCl$kP-K9;pCJ3qv;Bjpi2j0Xeo^6O)yN;%fw1Ak)k!
zfQZP2tcckXx7G?)-&HVsCcy3MC9IvfG0F{hIeNkKvyAs@TWAf~vIoHqItx78gE$8h
zS^=)@e`u_w>#u%j3TQIRM7t!
z#LS~&ss%j1?5`z%BcK~rcl*oxNEfLZP*=O`1L)I(ODr2l9(3$tRS4iD2$&TDn#1zl
z`%?1y12fohMuwq{^!KIRXQhgR{C3{yQAf>X%uE5ZcN8SxX@in`IATd?HRp(%V4hmH
zdG7kR412itOEGFxIw0U%>vyOJ5cNwrbF*(VQfhzGf2Z2h#y^2Bj2`S3`R-^m6!edj
z-c0U_hM20aY=$YU`Ag9+%8G=Z|E)h{&mu}b?VrZpQPFBewAH+>!lB=w1^rD$c=eW@
zW&8oi3hQ%#-}!HY)K@}5iA#CJ<+5sOr876uD@nWx#LK-L?ZYRwdlKRmmBPE9*Au0
zplN%9<7-J6Yx*l0fy;#hc%M4PJuh9VP5&fOH$BP@9M`H}g(B%F(x$z>2>H^a`MiwNe%-vRf0XWNCQmKiJ8mS+t5j;(JK*fJ6}!
zxnVR#uRB8GwClN2RH_PeWPC!lL#@&XWK%c!tFqT7wU8YR=D!VCD?GtOKLbNrfHrtj
z)Sy3qjYhKY>7nrp*3>V(CBLu^)XX%&!k${Ba~4}Y)JGpOn>Fnp7UUgTEG-@n`q%SO
z?eLir6t!MA(^B?ecNjX;`*FE{0dx@L1??)-U)UMiCxyAfxGVD^9_tS7PKr1p9IwI=
zq0r8yr&t6l%L^pw2nU$2wdCjnkcfK4klN3P_n;0p*R9=N0wR|owjVL_$WaW00?sHq
z06rE{agK;9P|a7~<2Q9<`#*$NYSR4w$bRl5&Bnlw#V!iWXj=7mU+Cpr<1!ySL|1U9
zHJBR339@PhmiGNMc7d5Gc_swroeL1}@jClF+ypuo2i2pT+!oUY$W
ziCoX_S(!mX9T+Z*Sf4qed5|XuRzQJ&-!y|*6gI8-Nc=%BloHG|r-2Kt4i7>EQq43H
zc})zJG!5B6W