+ + + + View Source + + + Plausible.MigrationUtils + (Plausible v0.0.1) + +
+ + +Base module for to use in Clickhouse migrations
+From 05c18eaddb5c06671f8a5927d8f978388929bbb4 Mon Sep 17 00:00:00 2001
From: macobo
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])
Give
Queries the ClickHouse database for the monthly pageview usage. If the given user's
subscription is active
, past_due
, or a deleted
(but not yet expired), a map
-with the following structure is returned:
%{
- current_cycle: usage_cycle(),
- last_cycle: usage_cycle(),
- penultimate_cycle: usage_cycle()
-}
In all other cases of the subscription status (or a free_10k
subscription which
-does not have a last_bill_date
defined) - the following structure is returned:
%{last_30_days: usage_cycle()}
Given only a user as input, the usage is queried from across all the sites that the +with the following structure is returned:
%{
+ current_cycle: usage_cycle(),
+ last_cycle: usage_cycle(),
+ penultimate_cycle: usage_cycle()
+}
In all other cases of the subscription status (or a free_10k
subscription which
+does not have a last_bill_date
defined) - the following structure is returned:
%{last_30_days: usage_cycle()}
Given only a user as input, the usage is queried from across all the sites that the
user owns. Alternatively, given an optional argument of site_ids
, the usage from
across all those sites is queried instead.
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."
@@ -261,54 +261,54 @@ a configuredExamples
-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("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"}}
@@ -369,95 +369,95 @@ wuth an error tuple for each invalid tag added at the end of the list.
Example
-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"}}
+ ]}
@@ -502,92 +502,92 @@ wuth an error tuple for each invalid tag added at the end of the list.
Example
-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"}}
+]
diff --git a/Plausible.Cldr.Currency.html b/Plausible.Cldr.Currency.html
index f2a55572e..2da0cca9a 100644
--- a/Plausible.Cldr.Currency.html
+++ b/Plausible.Cldr.Currency.html
@@ -14,7 +14,7 @@
-
+
@@ -419,11 +419,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,
@@ -433,12 +433,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,
@@ -448,7 +448,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
- },
+ },
...
}}
@@ -499,11 +499,11 @@ The default is :all
. See Example
MyApp.Cldr.Currency.currencies_for_locale!("en")
- => %{
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,
@@ -513,12 +513,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,
@@ -528,7 +528,7 @@ The default is :all
. See symbol: "SUR",
tender: true,
to: nil
-},
+},
...
}
@@ -586,13 +586,13 @@ or a
Examples
-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",
@@ -600,15 +600,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",
@@ -616,7 +616,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}}
+}}
@@ -675,12 +675,12 @@ or a
Examples
-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",
@@ -688,14 +688,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",
@@ -703,7 +703,7 @@ or a rounding: 0,
symbol: "THB",
tender: true
-}
+}
@@ -744,15 +744,15 @@ or a
Examples
-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
-iex> Plausible.Cldr.Currency.currency_from_locale("en-GB")
+iex> Plausible.Cldr.Currency.currency_from_locale("en-GB")
:GBP
@@ -796,14 +796,14 @@ or a
Example
-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]}
- }
-}
+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]}
+ }
+}
@@ -862,9 +862,9 @@ The default is :all
. See Example
-MyApp.Cldr.Currency.currency_strings("en")
-=> {:ok,
- %{
+MyApp.Cldr.Currency.currency_strings("en")
+=> {:ok,
+ %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -874,7 +874,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }}
+ }}
@@ -933,8 +933,8 @@ The default is :all
. See Example
-MyApp.Cldr.Currency.currency_strings!("en")
-=> %{
+MyApp.Cldr.Currency.currency_strings!("en")
+=> %{
"mexican silver pesos" => :MXP,
"sudanese dinar" => :SDD,
"bad" => :BAD,
@@ -944,7 +944,7 @@ The default is :all
. See "guyanaese dollars" => :GYD,
"equatorial guinean ekwele" => :GQE,
...
- }
+ }
@@ -982,10 +982,10 @@ or a
Example
-iex> MyApp.Cldr.Currency.current_currency_from_locale("en")
+iex> MyApp.Cldr.Currency.current_currency_from_locale("en")
:USD
-iex> MyApp.Cldr.Currency.current_currency_from_locale("en-AU")
+iex> MyApp.Cldr.Currency.current_currency_from_locale("en-AU")
:AUD
@@ -1033,7 +1033,7 @@ mapping is returned for that territory.Example
-iex> Plausible.Cldr.Currency.current_territory_currencies()
+iex> Plausible.Cldr.Currency.current_territory_currencies()
@@ -1125,11 +1125,11 @@ currency codeExamples
-iex> Plausible.Cldr.Currency.known_currency_code("AUD")
-{:ok, :AUD}
+iex> Plausible.Cldr.Currency.known_currency_code("AUD")
+{:ok, :AUD}
-iex> Plausible.Cldr.Currency.known_currency_code("GGG")
-{:error, {Cldr.UnknownCurrencyError, "The currency \"GGG\" is invalid"}}
+iex> Plausible.Cldr.Currency.known_currency_code("GGG")
+{:error, {Cldr.UnknownCurrencyError, "The currency \"GGG\" is invalid"}}
@@ -1176,13 +1176,13 @@ currency codeExamples
-iex> Plausible.Cldr.Currency.known_currency_code?("AUD")
+iex> Plausible.Cldr.Currency.known_currency_code?("AUD")
true
-iex> Plausible.Cldr.Currency.known_currency_code?("GGG")
+iex> Plausible.Cldr.Currency.known_currency_code?("GGG")
false
-iex> Plausible.Cldr.Currency.known_currency_code?(:XCV)
+iex> Plausible.Cldr.Currency.known_currency_code?(:XCV)
false
@@ -1217,7 +1217,7 @@ currency codeExample
-iex> Plausible.Cldr.Currency.known_currency_codes()
+iex> Plausible.Cldr.Currency.known_currency_codes()
@@ -1276,14 +1276,14 @@ such as 0.05
. Optional.Example
-iex> Plausible.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0)
-{:ok,
- %Cldr.Currency{
+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,
@@ -1293,11 +1293,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."}}
@@ -1355,20 +1355,20 @@ default is Plaus
Examples
-iex> Plausible.Cldr.Currency.pluralize(1, :USD)
-{:ok, "US dollar"}
+iex> Plausible.Cldr.Currency.pluralize(1, :USD)
+{:ok, "US dollar"}
-iex> Plausible.Cldr.Currency.pluralize(3, :USD)
-{:ok, "US dollars"}
+iex> Plausible.Cldr.Currency.pluralize(3, :USD)
+{:ok, "US dollars"}
-iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "zh")
-{:ok, "美元"}
+iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "zh")
+{:ok, "美元"}
-iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "fr")
-{:ok, "dollars des États-Unis"}
+iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "fr")
+{:ok, "dollars des États-Unis"}
-iex> Plausible.Cldr.Currency.pluralize(1, :USD, locale: "fr")
-{:ok, "dollar des États-Unis"}
+iex> Plausible.Cldr.Currency.pluralize(1, :USD, locale: "fr")
+{:ok, "dollar des États-Unis"}
@@ -1410,8 +1410,8 @@ or a
Example
-iex> MyApp.Cldr.Currency.strings_for_currency(:AUD, "en")
-["a$", "australian dollars", "aud", "australian dollar"]
+iex> MyApp.Cldr.Currency.strings_for_currency(:AUD, "en")
+["a$", "australian dollars", "aud", "australian dollar"]
diff --git a/Plausible.Cldr.Locale.html b/Plausible.Cldr.Locale.html
index 75c337e51..be9410090 100644
--- a/Plausible.Cldr.Locale.html
+++ b/Plausible.Cldr.Locale.html
@@ -14,7 +14,7 @@
-
+
@@ -326,16 +326,16 @@ this specific locale..Examples
-iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA")
-{:ok, [:"fr-CA", :fr, :und]}
+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]}
@@ -389,20 +389,20 @@ this specific locale.Examples
-Plausible.Cldr.Locale.fallback_locales(:"fr-CA")
-=> {:ok,
- [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
- #Cldr.LanguageTag<und [validated]>]}
+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]>]}
@@ -533,15 +533,15 @@ generic top-level domain names.Examples
iex> Plausible.Cldr.Locale.locale_from_host "a.b.com.au"
-Elixir.Plausible.Cldr.validate_locale(:"en-AU")
+Elixir.Plausible.Cldr.validate_locale(:"en-AU")
-iex> Plausible.Cldr.Locale.locale_from_host("a.b.com.tv")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"tv\""}}
+iex> Plausible.Cldr.Locale.locale_from_host("a.b.com.tv")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"tv\""}}
-iex> Plausible.Cldr.Locale.locale_from_host("a.b.com")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
+iex> Plausible.Cldr.Locale.locale_from_host("a.b.com")
+{:error,
+ {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
@@ -683,12 +683,12 @@ be a territory.Examples
-iex> Cldr.Locale.territory_from_host("a.b.com.au")
-{:ok, :AU}
+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\""}}
diff --git a/Plausible.Cldr.Number.Cardinal.html b/Plausible.Cldr.Number.Cardinal.html
index a14c7a159..80f48558f 100644
--- a/Plausible.Cldr.Number.Cardinal.html
+++ b/Plausible.Cldr.Number.Cardinal.html
@@ -14,7 +14,7 @@
-
+
@@ -455,31 +455,31 @@ The valid substitution keys are :zero
, Examples
-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"
diff --git a/Plausible.Cldr.Number.Format.html b/Plausible.Cldr.Number.Format.html
index 33028d2f1..74b5a8bba 100644
--- a/Plausible.Cldr.Number.Format.html
+++ b/Plausible.Cldr.Number.Format.html
@@ -14,7 +14,7 @@
-
+
@@ -468,7 +468,7 @@ to precompile all the known formats at compile time.Example
#=> Plausible.Cldr.Number.Format.Format.decimal_format_list
-["#", "#,##,##0%",
+["#", "#,##,##0%",
"#,##,##0.###", "#,##,##0.00¤", "#,##,##0.00¤;(#,##,##0.00¤)",
"#,##,##0 %", "#,##0%", "#,##0.###", "#,##0.00 ¤",
"#,##0.00 ¤;(#,##0.00 ¤)", "#,##0.00¤", "#,##0.00¤;(#,##0.00¤)",
@@ -478,7 +478,7 @@ to precompile all the known formats at compile time."000 B ¤"
, "000 E ¤", "000 K ¤", "000 MRD ¤", "000 Md ¤", "000 Mio'.' ¤",
"000 Mio ¤", "000 Mld ¤", "000 Mln ¤", "000 Mn ¤", "000 Mrd'.' ¤",
"000 Mrd ¤", "000 Mr ¤", "000 M ¤", "000 NT ¤", "000 N ¤", "000 Tn ¤",
-"000 Tr ¤", ...]
+"000 Tr ¤", ...]
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",
@@ -535,7 +535,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
, Examples
-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.PluralRule.Range.html b/Plausible.Cldr.Number.PluralRule.Range.html
index 37dfd5769..66516cdee 100644
--- a/Plausible.Cldr.Number.PluralRule.Range.html
+++ b/Plausible.Cldr.Number.PluralRule.Range.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Cldr.Number.Symbol.html b/Plausible.Cldr.Number.Symbol.html
index cb5466ce6..ea7c107c2 100644
--- a/Plausible.Cldr.Number.Symbol.html
+++ b/Plausible.Cldr.Number.Symbol.html
@@ -14,7 +14,7 @@
-
+
@@ -378,9 +378,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: ",",
@@ -393,8 +393,8 @@ is Plausible.Cld
plus_sign: "+",
superscripting_exponent: "×",
time_separator: ":"
- },
- thai: %Cldr.Number.Symbol{
+ },
+ thai: %Cldr.Number.Symbol{
decimal: ".",
exponential: "E",
group: ",",
@@ -407,8 +407,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 dc5ebd4ee..c6b571a14 100644
--- a/Plausible.Cldr.Number.System.html
+++ b/Plausible.Cldr.Number.System.html
@@ -14,7 +14,7 @@
-
+
@@ -317,23 +317,23 @@ it is returned as is.Examples
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}"}
+}
@@ -424,10 +424,10 @@ or a Examples
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"}}
@@ -509,13 +509,13 @@ or a Examples
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"}}
@@ -613,20 +613,20 @@ actual system name.Examples
-ex> Plausible.Cldr.Number.System.system_name_from(:default, "en")
-{:ok, :latn}
+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.
@@ -673,16 +673,16 @@ is recommended.Examples
iex> Plausible.Cldr.Number.System.to_system 123456, :hebr
-{:ok, "קכ״ג׳תנ״ו"}
+{:ok, "קכ״ג׳תנ״ו"}
iex> Plausible.Cldr.Number.System.to_system 123, :hans
-{:ok, "一百二十三"}
+{:ok, "一百二十三"}
iex> Plausible.Cldr.Number.System.to_system 123, :hant
-{:ok, "一百二十三"}
+{:ok, "一百二十三"}
iex> Plausible.Cldr.Number.System.to_system 123, :hansfin
-{:ok, "壹佰贰拾叁"}
+{:ok, "壹佰贰拾叁"}
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.numeric_systems/0
.
If a transliteration is requested between two number pairs that have not been configured for precompilation, a warning is logged.
Examples
-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 ffefa5f32..6e6251274 100644
--- a/Plausible.Cldr.Number.html
+++ b/Plausible.Cldr.Number.html
@@ -14,7 +14,7 @@
-
+
@@ -441,19 +441,19 @@ using the Elixir standard library functions.
Examples
-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"}}
@@ -525,17 +525,17 @@ financial instruments.
Examples
-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]
@@ -612,19 +612,19 @@ financial instruments.Examples
-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"}}
@@ -688,13 +688,13 @@ The default is options[:backend].get_locale()
Examples
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]
@@ -751,9 +751,9 @@ The default is 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("£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_approx_string 1234
-{:ok, "~1,234"}
+{:ok, "~1,234"}
iex> Plausible.Cldr.Number.to_at_least_string 1234
-{:ok, "1,234+"}
+{:ok, "1,234+"}
iex> Plausible.Cldr.Number.to_at_most_string 1234
-{:ok, "≤1,234"}
+{:ok, "≤1,234"}
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. @@ -1168,80 +1168,80 @@ inserted in the final formatted number.
iex> Plausible.Cldr.Number.to_string 12345
-{:ok, "12,345"}
+{:ok, "12,345"}
iex> Plausible.Cldr.Number.to_string 12345, locale: "fr"
-{:ok, "12 345"}
+{:ok, "12 345"}
iex> Plausible.Cldr.Number.to_string 1345.32, currency: :EUR, locale: "es", minimum_grouping_digits: 1
-{:ok, "1.345,32 €"}
+{:ok, "1.345,32 €"}
iex> Plausible.Cldr.Number.to_string 1345.32, currency: :EUR, locale: "es"
-{:ok, "1345,32 €"}
+{:ok, "1345,32 €"}
iex> Plausible.Cldr.Number.to_string 12345, locale: "fr", currency: "USD"
-{:ok, "12 345,00 $US"}
+{:ok, "12 345,00 $US"}
iex> Plausible.Cldr.Number.to_string 12345, format: "#E0"
-{:ok, "1.2345E4"}
+{:ok, "1.2345E4"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB"
-{:ok, "THB 12,345.00"}
+{:ok, "THB 12,345.00"}
iex> Plausible.Cldr.Number.to_string -12345, format: :accounting, currency: "THB"
-{:ok, "(THB 12,345.00)"}
+{:ok, "(THB 12,345.00)"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB",
...> locale: "th"
-{:ok, "฿12,345.00"}
+{:ok, "฿12,345.00"}
iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB",
...> locale: "th", number_system: :native
-{:ok, "฿๑๒,๓๔๕.๐๐"}
+{:ok, "฿๑๒,๓๔๕.๐๐"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :long
-{:ok, "1 thousand"}
+{:ok, "1 thousand"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :long, currency: "USD"
-{:ok, "1,244 US dollars"}
+{:ok, "1,244 US dollars"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :short
-{:ok, "1K"}
+{:ok, "1K"}
iex> Plausible.Cldr.Number.to_string 1244.30, format: :short, currency: "EUR"
-{:ok, "€1K"}
+{:ok, "€1K"}
iex> Plausible.Cldr.Number.to_string 1234, format: :spellout
-{:ok, "one thousand two hundred thirty-four"}
+{:ok, "one thousand two hundred thirty-four"}
iex> Plausible.Cldr.Number.to_string 1234, format: :spellout_verbose
-{:ok, "one thousand two hundred and thirty-four"}
+{:ok, "one thousand two hundred and thirty-four"}
iex> Plausible.Cldr.Number.to_string 1989, format: :spellout_year
-{:ok, "nineteen eighty-nine"}
+{:ok, "nineteen eighty-nine"}
iex> Plausible.Cldr.Number.to_string 123, format: :ordinal
-{:ok, "123rd"}
+{:ok, "123rd"}
iex> Plausible.Cldr.Number.to_string 123, format: :roman
-{:ok, "CXXIII"}
+{:ok, "CXXIII"}
iex> Plausible.Cldr.Number.to_string 123, locale: "th-u-nu-thai"
-{:ok, "๑๒๓"}
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", format: :percent)
- {:error, {Cldr.UnknownFormatError,
- "The locale :he with number system :hebr does not define a format :percent"}}
+return looks like: iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr", format: :percent)
+ {:error, {Cldr.UnknownFormatError,
+ "The locale :he with number system :hebr does not define a format :percent"}}
iex> Plausible.Cldr.Number.validate_number_system "en", :latn
-{:ok, :latn}
+{:ok, :latn}
iex> Plausible.Cldr.Number.validate_number_system "en", :default
-{:ok, :latn}
+{:ok, :latn}
iex> Plausible.Cldr.Number.validate_number_system "en", :unknown
-{:error,
- {Cldr.UnknownNumberSystemError, "The number system :unknown is unknown"}}
+{:error,
+ {Cldr.UnknownNumberSystemError, "The number system :unknown is unknown"}}
iex> Plausible.Cldr.Number.validate_number_system "zz", :default
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
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,
@@ -161,9 +161,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,
@@ -155,9 +155,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()
+iex> Plausible.Cldr.default_territory()
:"001"
iex> Plausible.Cldr.ellipsis("And furthermore")
+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)
+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"
@@ -715,23 +715,23 @@ take an optional locale parameter for which a locale is not supplied.
Example
-iex> Plausible.Cldr.put_locale("pl")
-iex> Plausible.Cldr.get_locale()
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.put_locale("pl")
+iex> Plausible.Cldr.get_locale()
+%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: []
+ }
@@ -818,10 +818,10 @@ take an optional locale parameter for which a locale is not supplied.
Examples
-iex> Plausible.Cldr.known_gettext_locale_name("en")
+iex> Plausible.Cldr.known_gettext_locale_name("en")
"en"
-iex> Plausible.Cldr.known_gettext_locale_name("en-SA")
+iex> Plausible.Cldr.known_gettext_locale_name("en-SA")
false
@@ -864,10 +864,10 @@ name is configured and available in Gettext.Examples
-iex> Plausible.Cldr.known_gettext_locale_name?("en")
+iex> Plausible.Cldr.known_gettext_locale_name?("en")
true
-iex> Plausible.Cldr.known_gettext_locale_name?("!!")
+iex> Plausible.Cldr.known_gettext_locale_name?("!!")
false
@@ -941,10 +941,10 @@ to return the first known locale name from a list.Examples
-iex> Plausible.Cldr.known_locale_name(:"en-AU")
+iex> Plausible.Cldr.known_locale_name(:"en-AU")
:"en-AU"
-iex> Plausible.Cldr.known_locale_name(:"en-SA")
+iex> Plausible.Cldr.known_locale_name(:"en-SA")
false
@@ -986,10 +986,10 @@ name is configured and available in Cldr.Examples
-iex> Plausible.Cldr.known_locale_name?(:en)
+iex> Plausible.Cldr.known_locale_name?(:en)
true
-iex> Plausible.Cldr.known_locale_name?(:"!!")
+iex> Plausible.Cldr.known_locale_name?(:"!!")
false
@@ -1043,8 +1043,8 @@ in this module or in
Example
-iex> Plausible.Cldr.known_number_system_types()
-[:default, :finance, :native, :traditional]
+iex> Plausible.Cldr.known_number_system_types()
+[:default, :finance, :native, :traditional]
@@ -1109,10 +1109,10 @@ and has RBNF rules defined.
Examples
-iex> Plausible.Cldr.known_rbnf_locale_name(:en)
+iex> Plausible.Cldr.known_rbnf_locale_name(:en)
:en
-iex> Plausible.Cldr.known_rbnf_locale_name(:"en-SA")
+iex> Plausible.Cldr.known_rbnf_locale_name(:"en-SA")
false
@@ -1155,10 +1155,10 @@ rules based number formats (RBNF).Examples
-iex> Plausible.Cldr.known_rbnf_locale_name?(:en)
+iex> Plausible.Cldr.known_rbnf_locale_name?(:en)
true
-iex> Plausible.Cldr.known_rbnf_locale_name?(:"!!")
+iex> Plausible.Cldr.known_rbnf_locale_name?(:"!!")
false
@@ -1294,14 +1294,14 @@ CLDR backend defined by the t:Cldr.LanguageTag
is se
Examples
iex> import Cldr.LanguageTag.Sigil
-iex> Plausible.Cldr.put_gettext_locale(~l"en")
-{:ok, "en"}
+iex> Plausible.Cldr.put_gettext_locale(~l"en")
+{:ok, "en"}
iex> import Cldr.LanguageTag.Sigil
-iex> Plausible.Cldr.put_gettext_locale(~l"de")
-{:error,
- {Cldr.UnknownLocaleError,
- "Locale #Cldr.LanguageTag<de [validated]> does not map to a known gettext locale name"}}
+iex> Plausible.Cldr.put_gettext_locale(~l"de")
+{:error,
+ {Cldr.UnknownLocaleError,
+ "Locale #Cldr.LanguageTag<de [validated]> does not map to a known gettext locale name"}}
@@ -1345,29 +1345,29 @@ of a language tag.
Examples
-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"}}
@@ -1416,10 +1416,10 @@ The default is Examples
-iex> Plausible.Cldr.quote("Quoted String")
+iex> Plausible.Cldr.quote("Quoted String")
"“Quoted String”"
-iex> Plausible.Cldr.quote("Quoted String", locale: :ja)
+iex> Plausible.Cldr.quote("Quoted String", locale: :ja)
"「Quoted String」"
@@ -1550,47 +1550,47 @@ of a language tag.Examples
-iex> Plausible.Cldr.validate_locale(:en)
-{:ok,
-%Cldr.LanguageTag{
+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"}}
@@ -1660,23 +1660,23 @@ of a language tag.Examples
-iex> Plausible.Cldr.validate_number_system_type(:default)
-{:ok, :default}
+iex> Plausible.Cldr.validate_number_system_type(:default)
+{:ok, :default}
-iex> Plausible.Cldr.validate_number_system_type(:traditional)
-{:ok, :traditional}
+iex> Plausible.Cldr.validate_number_system_type(:traditional)
+{:ok, :traditional}
-iex> Plausible.Cldr.validate_number_system_type(:latn)
-{
+iex> Plausible.Cldr.validate_number_system_type(:latn)
+{
:error,
- {Cldr.UnknownNumberSystemTypeError, "The number system type :latn is unknown"}
-}
+ {Cldr.UnknownNumberSystemTypeError, "The number system type :latn is unknown"}
+}
-iex> Plausible.Cldr.validate_number_system_type("bork")
-{
+iex> Plausible.Cldr.validate_number_system_type("bork")
+{
:error,
- {Cldr.UnknownNumberSystemTypeError, "The number system type \"bork\" is invalid"}
-}
+ {Cldr.UnknownNumberSystemTypeError, "The number system type \"bork\" is invalid"}
+}
diff --git a/Plausible.ClickhouseEventV2.html b/Plausible.ClickhouseEventV2.html
index af2d4facb..bc64dab25 100644
--- a/Plausible.ClickhouseEventV2.html
+++ b/Plausible.ClickhouseEventV2.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ClickhouseRepo.html b/Plausible.ClickhouseRepo.html
index 0ab381555..26a518078 100644
--- a/Plausible.ClickhouseRepo.html
+++ b/Plausible.ClickhouseRepo.html
@@ -14,7 +14,7 @@
-
+
@@ -845,23 +845,23 @@ pool to disconnect within the given interval.
diff --git a/Plausible.ClickhouseSessionV2.BoolUInt8.html b/Plausible.ClickhouseSessionV2.BoolUInt8.html
index e5ec3b8f4..479519c66 100644
--- a/Plausible.ClickhouseSessionV2.BoolUInt8.html
+++ b/Plausible.ClickhouseSessionV2.BoolUInt8.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ClickhouseSessionV2.html b/Plausible.ClickhouseSessionV2.html
index 9a7c45916..8e97d9dad 100644
--- a/Plausible.ClickhouseSessionV2.html
+++ b/Plausible.ClickhouseSessionV2.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ConfigHelpers.html b/Plausible.ConfigHelpers.html
index 926ee4a32..b9492dd3d 100644
--- a/Plausible.ConfigHelpers.html
+++ b/Plausible.ConfigHelpers.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataCase.html b/Plausible.DataCase.html
index 6585a3957..050fe0e20 100644
--- a/Plausible.DataCase.html
+++ b/Plausible.DataCase.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.NumericIDs.html b/Plausible.DataMigration.NumericIDs.html
index bb1b474b3..cd609f1a7 100644
--- a/Plausible.DataMigration.NumericIDs.html
+++ b/Plausible.DataMigration.NumericIDs.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html
index db9188c8a..34317a82a 100644
--- a/Plausible.DataMigration.Repo.html
+++ b/Plausible.DataMigration.Repo.html
@@ -14,7 +14,7 @@
-
+
@@ -1152,23 +1152,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.DataMigration.html b/Plausible.DataMigration.html
index b7c2f1320..5285a6ff7 100644
--- a/Plausible.DataMigration.html
+++ b/Plausible.DataMigration.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.DebugReplayInfo.html b/Plausible.DebugReplayInfo.html
index c2a75abb5..1f603ad63 100644
--- a/Plausible.DebugReplayInfo.html
+++ b/Plausible.DebugReplayInfo.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ecto.EventName.html b/Plausible.Ecto.EventName.html
index 513e2ab26..b3a15eeaf 100644
--- a/Plausible.Ecto.EventName.html
+++ b/Plausible.Ecto.EventName.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Factory.html b/Plausible.Factory.html
index 91040d16f..75703fa0b 100644
--- a/Plausible.Factory.html
+++ b/Plausible.Factory.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Funnel.Const.html b/Plausible.Funnel.Const.html
index 10645d392..adb262aea 100644
--- a/Plausible.Funnel.Const.html
+++ b/Plausible.Funnel.Const.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Funnel.Step.html b/Plausible.Funnel.Step.html
index 9f01c2c31..27b9ba3e2 100644
--- a/Plausible.Funnel.Step.html
+++ b/Plausible.Funnel.Step.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Funnel.html b/Plausible.Funnel.html
index 834ad1049..b51a0d143 100644
--- a/Plausible.Funnel.html
+++ b/Plausible.Funnel.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Funnels.html b/Plausible.Funnels.html
index ea5518217..a5dcd6ffc 100644
--- a/Plausible.Funnels.html
+++ b/Plausible.Funnels.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Geo.html b/Plausible.Geo.html
index ded0a17a4..8a3f37823 100644
--- a/Plausible.Geo.html
+++ b/Plausible.Geo.html
@@ -14,7 +14,7 @@
-
+
@@ -260,8 +260,8 @@ and MaxMind license key.
Examples
- 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"
@@ -301,8 +301,8 @@ asynchronously.
Examples
- 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
@@ -331,21 +331,21 @@ asynchronously.
Examples
-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",
@@ -354,12 +354,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",
@@ -368,20 +368,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",
@@ -390,13 +390,13 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "subdivisions" => [
- %{
+ }
+ },
+ "subdivisions" => [
+ %{
"geoname_id" => 5332921,
"iso_code" => "CA",
- "names" => %{
+ "names" => %{
"de" => "Kalifornien",
"en" => "California",
"es" => "California",
@@ -405,10 +405,10 @@ asynchronously."pt-BR" => "Califórnia",
"ru" => "Калифорния",
"zh-CN" => "加州"
- }
- }
- ]
-}
+ }
+ }
+ ]
+}
diff --git a/Plausible.Goal.Revenue.html b/Plausible.Goal.Revenue.html
index 406ec32f7..b520ac1b5 100644
--- a/Plausible.Goal.Revenue.html
+++ b/Plausible.Goal.Revenue.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Goal.html b/Plausible.Goal.html
index 056dae29e..3d679b8bb 100644
--- a/Plausible.Goal.html
+++ b/Plausible.Goal.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Goals.html b/Plausible.Goals.html
index 0cda75086..87019f14b 100644
--- a/Plausible.Goals.html
+++ b/Plausible.Goals.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.Api.Mock.html b/Plausible.Google.Api.Mock.html
index 745d73463..581dab4bd 100644
--- a/Plausible.Google.Api.Mock.html
+++ b/Plausible.Google.Api.Mock.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.Api.html b/Plausible.Google.Api.html
index cd569790d..9789a0d70 100644
--- a/Plausible.Google.Api.html
+++ b/Plausible.Google.Api.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.HTTP.html b/Plausible.Google.HTTP.html
index 8d8aa9612..6b70cc3c9 100644
--- a/Plausible.Google.HTTP.html
+++ b/Plausible.Google.HTTP.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Google.ReportRequest.html b/Plausible.Google.ReportRequest.html
index 9b3a05dfd..239e275d4 100644
--- a/Plausible.Google.ReportRequest.html
+++ b/Plausible.Google.ReportRequest.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.HTTPClient.Interface.html b/Plausible.HTTPClient.Interface.html
index 2b5da73bd..23027c692 100644
--- a/Plausible.HTTPClient.Interface.html
+++ b/Plausible.HTTPClient.Interface.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.HTTPClient.Non200Error.html b/Plausible.HTTPClient.Non200Error.html
index 2a2aac477..245350405 100644
--- a/Plausible.HTTPClient.Non200Error.html
+++ b/Plausible.HTTPClient.Non200Error.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.HTTPClient.html b/Plausible.HTTPClient.html
index 7a0e8eba1..4978ae846 100644
--- a/Plausible.HTTPClient.html
+++ b/Plausible.HTTPClient.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Helpers.JSON.html b/Plausible.Helpers.JSON.html
index 72fa867cb..f9c375425 100644
--- a/Plausible.Helpers.JSON.html
+++ b/Plausible.Helpers.JSON.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html
index 9ddd930d8..794841101 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -14,7 +14,7 @@
-
+
@@ -1143,23 +1143,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.Imported.Buffer.html b/Plausible.Imported.Buffer.html
index 5271abd99..e909224b0 100644
--- a/Plausible.Imported.Buffer.html
+++ b/Plausible.Imported.Buffer.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Imported.ImportSources.html b/Plausible.Imported.ImportSources.html
index 868359315..45bfee9c1 100644
--- a/Plausible.Imported.ImportSources.html
+++ b/Plausible.Imported.ImportSources.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Imported.NoopImporter.html b/Plausible.Imported.NoopImporter.html
index c9c066d9d..7ae094f79 100644
--- a/Plausible.Imported.NoopImporter.html
+++ b/Plausible.Imported.NoopImporter.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Imported.UniversalAnalytics.html b/Plausible.Imported.UniversalAnalytics.html
index 472eb0582..1d0a7dc56 100644
--- a/Plausible.Imported.UniversalAnalytics.html
+++ b/Plausible.Imported.UniversalAnalytics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Imported.html b/Plausible.Imported.html
index b51ca9365..dcddf5d97 100644
--- a/Plausible.Imported.html
+++ b/Plausible.Imported.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index 7fd125a0c..9cad30243 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -14,7 +14,7 @@
-
+
@@ -1143,23 +1143,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.Ingestion.Counters.Buffer.html b/Plausible.Ingestion.Counters.Buffer.html
index 049aa9d18..bff38dd67 100644
--- a/Plausible.Ingestion.Counters.Buffer.html
+++ b/Plausible.Ingestion.Counters.Buffer.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Counters.Record.html b/Plausible.Ingestion.Counters.Record.html
index 6808e4fd5..a97771695 100644
--- a/Plausible.Ingestion.Counters.Record.html
+++ b/Plausible.Ingestion.Counters.Record.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Counters.TelemetryHandler.html b/Plausible.Ingestion.Counters.TelemetryHandler.html
index 20bcfc67d..97a7b0446 100644
--- a/Plausible.Ingestion.Counters.TelemetryHandler.html
+++ b/Plausible.Ingestion.Counters.TelemetryHandler.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Counters.html b/Plausible.Ingestion.Counters.html
index 0fbc3ce04..a5b25bcb8 100644
--- a/Plausible.Ingestion.Counters.html
+++ b/Plausible.Ingestion.Counters.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Event.Revenue.html b/Plausible.Ingestion.Event.Revenue.html
index 97519579c..fc68a7bc7 100644
--- a/Plausible.Ingestion.Event.Revenue.html
+++ b/Plausible.Ingestion.Event.Revenue.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Event.html b/Plausible.Ingestion.Event.html
index 9db835d3f..0b189c98b 100644
--- a/Plausible.Ingestion.Event.html
+++ b/Plausible.Ingestion.Event.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Request.Revenue.html b/Plausible.Ingestion.Request.Revenue.html
index b3078a18b..3897768a9 100644
--- a/Plausible.Ingestion.Request.Revenue.html
+++ b/Plausible.Ingestion.Request.Revenue.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Ingestion.Request.html b/Plausible.Ingestion.Request.html
index d59c049bd..0c47463fc 100644
--- a/Plausible.Ingestion.Request.html
+++ b/Plausible.Ingestion.Request.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Mailer.html b/Plausible.Mailer.html
index 4b6b6ff0a..889674d55 100644
--- a/Plausible.Mailer.html
+++ b/Plausible.Mailer.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.MigrationUtils.html b/Plausible.MigrationUtils.html
new file mode 100644
index 000000000..3d3ab030d
--- /dev/null
+++ b/Plausible.MigrationUtils.html
@@ -0,0 +1,241 @@
+
+
+
+
+
+
+
+
+
+
+ Plausible.MigrationUtils — Plausible v0.0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ View Source
+
+
+ Plausible.MigrationUtils
+ (Plausible v0.0.1)
+
+
+
+
+
+Base module for to use in Clickhouse migrations
+
+
+
+
+
+
+
+
+ Summary
+
+
+
+ Functions
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Functions
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Plausible.OpenTelemetry.Sampler.html b/Plausible.OpenTelemetry.Sampler.html
index fcb6fad75..6b8ce81fe 100644
--- a/Plausible.OpenTelemetry.Sampler.html
+++ b/Plausible.OpenTelemetry.Sampler.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.PaddleApi.Mock.html b/Plausible.PaddleApi.Mock.html
index de8e5e3a5..a66e81622 100644
--- a/Plausible.PaddleApi.Mock.html
+++ b/Plausible.PaddleApi.Mock.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Pagination.html b/Plausible.Pagination.html
index 17e5a327c..34d1da986 100644
--- a/Plausible.Pagination.html
+++ b/Plausible.Pagination.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Plugins.API.CustomProps.html b/Plausible.Plugins.API.CustomProps.html
index 400a169de..519761a20 100644
--- a/Plausible.Plugins.API.CustomProps.html
+++ b/Plausible.Plugins.API.CustomProps.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Plugins.API.Goals.html b/Plausible.Plugins.API.Goals.html
index 0d93de41c..859a44778 100644
--- a/Plausible.Plugins.API.Goals.html
+++ b/Plausible.Plugins.API.Goals.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Plugins.API.SharedLinks.html b/Plausible.Plugins.API.SharedLinks.html
index c2caa6c76..4dff9d0ef 100644
--- a/Plausible.Plugins.API.SharedLinks.html
+++ b/Plausible.Plugins.API.SharedLinks.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Plugins.API.Token.html b/Plausible.Plugins.API.Token.html
index 2ad3f8bfc..4e8322173 100644
--- a/Plausible.Plugins.API.Token.html
+++ b/Plausible.Plugins.API.Token.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Plugins.API.Tokens.html b/Plausible.Plugins.API.Tokens.html
index 0540842ce..468b52c25 100644
--- a/Plausible.Plugins.API.Tokens.html
+++ b/Plausible.Plugins.API.Tokens.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.PromEx.Plugins.PlausibleMetrics.html b/Plausible.PromEx.Plugins.PlausibleMetrics.html
index 4cee6a8ed..6bcd7b3e7 100644
--- a/Plausible.PromEx.Plugins.PlausibleMetrics.html
+++ b/Plausible.PromEx.Plugins.PlausibleMetrics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.PromEx.html b/Plausible.PromEx.html
index 3594c87ce..d121bd949 100644
--- a/Plausible.PromEx.html
+++ b/Plausible.PromEx.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Props.html b/Plausible.Props.html
index 14561a31e..a643bc42d 100644
--- a/Plausible.Props.html
+++ b/Plausible.Props.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Purge.html b/Plausible.Purge.html
index 5032266ef..def097af6 100644
--- a/Plausible.Purge.html
+++ b/Plausible.Purge.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.RateLimit.html b/Plausible.RateLimit.html
index e35b0710d..2af64b506 100644
--- a/Plausible.RateLimit.html
+++ b/Plausible.RateLimit.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Release.html b/Plausible.Release.html
index b5a1f4d49..babfed710 100644
--- a/Plausible.Release.html
+++ b/Plausible.Release.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Repo.html b/Plausible.Repo.html
index 888d3f596..97f570eda 100644
--- a/Plausible.Repo.html
+++ b/Plausible.Repo.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Sentry.Client.html b/Plausible.Sentry.Client.html
index 367a38800..76b26bfa5 100644
--- a/Plausible.Sentry.Client.html
+++ b/Plausible.Sentry.Client.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.SentryFilter.html b/Plausible.SentryFilter.html
index e73e9c6a8..16ab6f60f 100644
--- a/Plausible.SentryFilter.html
+++ b/Plausible.SentryFilter.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Session.CacheStore.html b/Plausible.Session.CacheStore.html
index c8cfeeefc..6b3928456 100644
--- a/Plausible.Session.CacheStore.html
+++ b/Plausible.Session.CacheStore.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Session.Salts.html b/Plausible.Session.Salts.html
index 99dd3923b..ae145cb19 100644
--- a/Plausible.Session.Salts.html
+++ b/Plausible.Session.Salts.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.IPRule.html b/Plausible.Shield.IPRule.html
index de7cf841a..a55685553 100644
--- a/Plausible.Shield.IPRule.html
+++ b/Plausible.Shield.IPRule.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shield.IPRuleCache.html b/Plausible.Shield.IPRuleCache.html
index f7b5d7caf..9705dc948 100644
--- a/Plausible.Shield.IPRuleCache.html
+++ b/Plausible.Shield.IPRuleCache.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Shields.html b/Plausible.Shields.html
index a5bb4b4af..fa5804429 100644
--- a/Plausible.Shields.html
+++ b/Plausible.Shields.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Cache.html b/Plausible.Site.Cache.html
index eced52da1..b30214509 100644
--- a/Plausible.Site.Cache.html
+++ b/Plausible.Site.Cache.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Domain.html b/Plausible.Site.Domain.html
index fafec09bc..a97cdd04b 100644
--- a/Plausible.Site.Domain.html
+++ b/Plausible.Site.Domain.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.GateKeeper.html b/Plausible.Site.GateKeeper.html
index d0950688c..17de429b9 100644
--- a/Plausible.Site.GateKeeper.html
+++ b/Plausible.Site.GateKeeper.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.GoogleAuth.html b/Plausible.Site.GoogleAuth.html
index 9f8c90e63..7dbb6bd8d 100644
--- a/Plausible.Site.GoogleAuth.html
+++ b/Plausible.Site.GoogleAuth.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.ImportedData.html b/Plausible.Site.ImportedData.html
index 8e5ceee8d..833a43ec7 100644
--- a/Plausible.Site.ImportedData.html
+++ b/Plausible.Site.ImportedData.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Membership.html b/Plausible.Site.Membership.html
index 1c5a1b215..cc626c553 100644
--- a/Plausible.Site.Membership.html
+++ b/Plausible.Site.Membership.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Memberships.AcceptInvitation.html b/Plausible.Site.Memberships.AcceptInvitation.html
index 4850db73b..014f41b1f 100644
--- a/Plausible.Site.Memberships.AcceptInvitation.html
+++ b/Plausible.Site.Memberships.AcceptInvitation.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Memberships.CreateInvitation.html b/Plausible.Site.Memberships.CreateInvitation.html
index fbb9b1bab..65670db5a 100644
--- a/Plausible.Site.Memberships.CreateInvitation.html
+++ b/Plausible.Site.Memberships.CreateInvitation.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Memberships.RejectInvitation.html b/Plausible.Site.Memberships.RejectInvitation.html
index e729141c1..6c5c47860 100644
--- a/Plausible.Site.Memberships.RejectInvitation.html
+++ b/Plausible.Site.Memberships.RejectInvitation.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Memberships.RemoveInvitation.html b/Plausible.Site.Memberships.RemoveInvitation.html
index a98301087..49a87cc78 100644
--- a/Plausible.Site.Memberships.RemoveInvitation.html
+++ b/Plausible.Site.Memberships.RemoveInvitation.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Memberships.html b/Plausible.Site.Memberships.html
index 0abb45780..1072d1855 100644
--- a/Plausible.Site.Memberships.html
+++ b/Plausible.Site.Memberships.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.MonthlyReport.html b/Plausible.Site.MonthlyReport.html
index 825ff2b47..5247303c6 100644
--- a/Plausible.Site.MonthlyReport.html
+++ b/Plausible.Site.MonthlyReport.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.Removal.html b/Plausible.Site.Removal.html
index 8a25c6666..9f4250840 100644
--- a/Plausible.Site.Removal.html
+++ b/Plausible.Site.Removal.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.SharedLink.html b/Plausible.Site.SharedLink.html
index 83b3bcb91..1a3797533 100644
--- a/Plausible.Site.SharedLink.html
+++ b/Plausible.Site.SharedLink.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.SpikeNotification.html b/Plausible.Site.SpikeNotification.html
index 840ef53d4..cc5f954c4 100644
--- a/Plausible.Site.SpikeNotification.html
+++ b/Plausible.Site.SpikeNotification.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.UserPreference.html b/Plausible.Site.UserPreference.html
index 583842ee9..6bab296b0 100644
--- a/Plausible.Site.UserPreference.html
+++ b/Plausible.Site.UserPreference.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.WeeklyReport.html b/Plausible.Site.WeeklyReport.html
index 8ee2fed81..06af817d9 100644
--- a/Plausible.Site.WeeklyReport.html
+++ b/Plausible.Site.WeeklyReport.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Site.html b/Plausible.Site.html
index 966ad4ffb..5812f7492 100644
--- a/Plausible.Site.html
+++ b/Plausible.Site.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.SiteAdmin.html b/Plausible.SiteAdmin.html
index cf3b80a43..5770a9747 100644
--- a/Plausible.SiteAdmin.html
+++ b/Plausible.SiteAdmin.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Sites.html b/Plausible.Sites.html
index fda90d853..05d825c1e 100644
--- a/Plausible.Sites.html
+++ b/Plausible.Sites.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Aggregate.html b/Plausible.Stats.Aggregate.html
index 29a554a34..433c80a5e 100644
--- a/Plausible.Stats.Aggregate.html
+++ b/Plausible.Stats.Aggregate.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Base.html b/Plausible.Stats.Base.html
index b14fa27d4..8d5e098a2 100644
--- a/Plausible.Stats.Base.html
+++ b/Plausible.Stats.Base.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Breakdown.html b/Plausible.Stats.Breakdown.html
index 5bf338d9f..f9254dbda 100644
--- a/Plausible.Stats.Breakdown.html
+++ b/Plausible.Stats.Breakdown.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Clickhouse.html b/Plausible.Stats.Clickhouse.html
index ab24524c4..940cc4b8c 100644
--- a/Plausible.Stats.Clickhouse.html
+++ b/Plausible.Stats.Clickhouse.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Compare.html b/Plausible.Stats.Compare.html
index 8f77d3add..72f3485d4 100644
--- a/Plausible.Stats.Compare.html
+++ b/Plausible.Stats.Compare.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Comparisons.html b/Plausible.Stats.Comparisons.html
index 3cbc6e637..5f6915c68 100644
--- a/Plausible.Stats.Comparisons.html
+++ b/Plausible.Stats.Comparisons.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.CurrentVisitors.html b/Plausible.Stats.CurrentVisitors.html
index 58ff7d9c4..3fbccc7ae 100644
--- a/Plausible.Stats.CurrentVisitors.html
+++ b/Plausible.Stats.CurrentVisitors.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.CustomProps.html b/Plausible.Stats.CustomProps.html
index 810a386d6..684df4128 100644
--- a/Plausible.Stats.CustomProps.html
+++ b/Plausible.Stats.CustomProps.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.EmailReport.html b/Plausible.Stats.EmailReport.html
index a5328203b..f7d84dafb 100644
--- a/Plausible.Stats.EmailReport.html
+++ b/Plausible.Stats.EmailReport.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.FilterSuggestions.html b/Plausible.Stats.FilterSuggestions.html
index 5d40a05ae..36d6d6dce 100644
--- a/Plausible.Stats.FilterSuggestions.html
+++ b/Plausible.Stats.FilterSuggestions.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Filters.Utils.html b/Plausible.Stats.Filters.Utils.html
index f87ec98df..7e86ab043 100644
--- a/Plausible.Stats.Filters.Utils.html
+++ b/Plausible.Stats.Filters.Utils.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Filters.html b/Plausible.Stats.Filters.html
index 3e9bfb1d8..2d77e2c95 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -14,7 +14,7 @@
-
+
@@ -245,14 +245,14 @@ Pages
Examples:
-
iex> Filters.parse("{\"page\":\"/blog/**\"}")
-%{"event:page" => {:matches, "/blog/**"}}
+iex> Filters.parse("{\"page\":\"/blog/**\"}")
+%{"event:page" => {:matches, "/blog/**"}}
-iex> Filters.parse("visit:browser!=Chrome")
-%{"visit:browser" => {:is_not, "Chrome"}}
+iex> Filters.parse("visit:browser!=Chrome")
+%{"visit:browser" => {:is_not, "Chrome"}}
-iex> Filters.parse(nil)
-%{}
+iex> Filters.parse(nil)
+%{}
diff --git a/Plausible.Stats.Fragments.html b/Plausible.Stats.Fragments.html
index c76a56eb7..0d8a62f95 100644
--- a/Plausible.Stats.Fragments.html
+++ b/Plausible.Stats.Fragments.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Funnel.html b/Plausible.Stats.Funnel.html
index 71db44794..f9918ac2f 100644
--- a/Plausible.Stats.Funnel.html
+++ b/Plausible.Stats.Funnel.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Goal.Revenue.html b/Plausible.Stats.Goal.Revenue.html
index 51000f9e5..668f861aa 100644
--- a/Plausible.Stats.Goal.Revenue.html
+++ b/Plausible.Stats.Goal.Revenue.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Imported.html b/Plausible.Stats.Imported.html
index b538d6abd..8a1f9cd7a 100644
--- a/Plausible.Stats.Imported.html
+++ b/Plausible.Stats.Imported.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Interval.html b/Plausible.Stats.Interval.html
index 572f2a113..cc6837e13 100644
--- a/Plausible.Stats.Interval.html
+++ b/Plausible.Stats.Interval.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Props.html b/Plausible.Stats.Props.html
index c7f2182c0..7c475803b 100644
--- a/Plausible.Stats.Props.html
+++ b/Plausible.Stats.Props.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Query.html b/Plausible.Stats.Query.html
index b20f2d2d5..b4cc07b92 100644
--- a/Plausible.Stats.Query.html
+++ b/Plausible.Stats.Query.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Sampling.html b/Plausible.Stats.Sampling.html
index a2dc6771b..df136efa1 100644
--- a/Plausible.Stats.Sampling.html
+++ b/Plausible.Stats.Sampling.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Timeseries.html b/Plausible.Stats.Timeseries.html
index 2262e8cb3..0a241b78f 100644
--- a/Plausible.Stats.Timeseries.html
+++ b/Plausible.Stats.Timeseries.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.Util.html b/Plausible.Stats.Util.html
index ce9c2128f..077f28cd2 100644
--- a/Plausible.Stats.Util.html
+++ b/Plausible.Stats.Util.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Stats.html b/Plausible.Stats.html
index 2c3ffbd9a..20f8cddf2 100644
--- a/Plausible.Stats.html
+++ b/Plausible.Stats.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Test.Support.HTML.html b/Plausible.Test.Support.HTML.html
index 03a02e155..85a2dbc20 100644
--- a/Plausible.Test.Support.HTML.html
+++ b/Plausible.Test.Support.HTML.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Test.Support.HTTPMocker.html b/Plausible.Test.Support.HTTPMocker.html
index 0982c8b3f..341abbd50 100644
--- a/Plausible.Test.Support.HTTPMocker.html
+++ b/Plausible.Test.Support.HTTPMocker.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.TestUtils.html b/Plausible.TestUtils.html
index d5d0c2f0f..3dc401acb 100644
--- a/Plausible.TestUtils.html
+++ b/Plausible.TestUtils.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Themes.html b/Plausible.Themes.html
index a1ca92b56..a5890f97b 100644
--- a/Plausible.Themes.html
+++ b/Plausible.Themes.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Timezones.html b/Plausible.Timezones.html
index 157bd063d..5c997af74 100644
--- a/Plausible.Timezones.html
+++ b/Plausible.Timezones.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Users.html b/Plausible.Users.html
index 0aa3aa545..05fd500a8 100644
--- a/Plausible.Users.html
+++ b/Plausible.Users.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.AcceptTrafficUntil.html b/Plausible.Workers.AcceptTrafficUntil.html
index b60275307..8d0567222 100644
--- a/Plausible.Workers.AcceptTrafficUntil.html
+++ b/Plausible.Workers.AcceptTrafficUntil.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.CheckUsage.html b/Plausible.Workers.CheckUsage.html
index 14883801d..07ee3f247 100644
--- a/Plausible.Workers.CheckUsage.html
+++ b/Plausible.Workers.CheckUsage.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.CleanInvitations.html b/Plausible.Workers.CleanInvitations.html
index 1dedaf12f..27c5d82f1 100644
--- a/Plausible.Workers.CleanInvitations.html
+++ b/Plausible.Workers.CleanInvitations.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ExpireDomainChangeTransitions.html b/Plausible.Workers.ExpireDomainChangeTransitions.html
index f3e73a071..77cf1c60f 100644
--- a/Plausible.Workers.ExpireDomainChangeTransitions.html
+++ b/Plausible.Workers.ExpireDomainChangeTransitions.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ImportAnalytics.html b/Plausible.Workers.ImportAnalytics.html
index f2728ca24..4bcf84f81 100644
--- a/Plausible.Workers.ImportAnalytics.html
+++ b/Plausible.Workers.ImportAnalytics.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.LockSites.html b/Plausible.Workers.LockSites.html
index c19c4bd4e..6e9e97f79 100644
--- a/Plausible.Workers.LockSites.html
+++ b/Plausible.Workers.LockSites.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.NotifyAnnualRenewal.html b/Plausible.Workers.NotifyAnnualRenewal.html
index 36ff6ac7a..3dbfcfea2 100644
--- a/Plausible.Workers.NotifyAnnualRenewal.html
+++ b/Plausible.Workers.NotifyAnnualRenewal.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.RotateSalts.html b/Plausible.Workers.RotateSalts.html
index 6d845e1a5..a2af87b8a 100644
--- a/Plausible.Workers.RotateSalts.html
+++ b/Plausible.Workers.RotateSalts.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.ScheduleEmailReports.html b/Plausible.Workers.ScheduleEmailReports.html
index ddae76cea..10e7f4ed2 100644
--- a/Plausible.Workers.ScheduleEmailReports.html
+++ b/Plausible.Workers.ScheduleEmailReports.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.SendCheckStatsEmails.html b/Plausible.Workers.SendCheckStatsEmails.html
index ce715267c..f10e540ce 100644
--- a/Plausible.Workers.SendCheckStatsEmails.html
+++ b/Plausible.Workers.SendCheckStatsEmails.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.SendEmailReport.html b/Plausible.Workers.SendEmailReport.html
index bb60b5a73..e3d10e5f8 100644
--- a/Plausible.Workers.SendEmailReport.html
+++ b/Plausible.Workers.SendEmailReport.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.SendSiteSetupEmails.html b/Plausible.Workers.SendSiteSetupEmails.html
index 89374e88b..63b0062b8 100644
--- a/Plausible.Workers.SendSiteSetupEmails.html
+++ b/Plausible.Workers.SendSiteSetupEmails.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.SendTrialNotifications.html b/Plausible.Workers.SendTrialNotifications.html
index bdda11afb..7a7791d2f 100644
--- a/Plausible.Workers.SendTrialNotifications.html
+++ b/Plausible.Workers.SendTrialNotifications.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.Workers.SpikeNotifier.html b/Plausible.Workers.SpikeNotifier.html
index c1091fa94..417cd8b46 100644
--- a/Plausible.Workers.SpikeNotifier.html
+++ b/Plausible.Workers.SpikeNotifier.html
@@ -14,7 +14,7 @@
-
+
diff --git a/Plausible.epub b/Plausible.epub
index 29e916b48a43aab0cd49f64dbfdc1e16c5c95b54..197c48cbe4fc32c9ea0a63c075c55199a1e16148 100644
GIT binary patch
delta 133593
zcmY(qb9`OT7w?@D+qN6qw(T^wZJs!dZL={OtFan2ZtOHxW8C(9f6w!}H~-9gX3ea9
z&di*h_1SCoM-$apCl#WKJOm^r*uOtti6lfGa9@c=sRF>?qWK8GjECeap{OHdcc1Es
z3I?{{OhMoX1@v5_Lyfq6!88Z}`vcX~oPKKAX2|boFlkd?$&s`oR!A6mL(yxcusAfp`n($OnqHGM|TX|s7P=OJXP
z*XMTWZKK_Y`^=$o=eoeFc@c%Q5W2)jh&>BoRyBW54yf_a^(oPEdK@8L^8
zf(G_cgIPyTd3D4my);erI~L+ehW0yyVehXxl=3>-MT%NoicPJxs(+NKq473@5-)CK
zSuS*u|f<9jQ=`I}p`Ke!j*3QpN!<&Ouifc%nqy
z=2r_Pt^8dyQ|vVZA=DxJ&6=U!;mu^G30r*O88fiJzu=oO>3i6LZn}nYvrXf63wLugC$}
z>V%B}II&Cp-nE|r*q0P3;_41zp16|EpF(<+kiPP^7QNI5;}~Q3CW|5o`HT{DGV$q5
zes{dO8#xbL2vZr}Ua65kIcEvCh`tsi8|lYP&5abjswrTX)$QCML8=p{Cc}D-NY6g!a>*t^o%PB0=lR7m4MXiVX(X6lHMqMLD$4Y}LMC7vJW@K$|T{BocDZBFLYd`cD#Z=Cw}l=m+||FE4EFuKyL^1q
zWUi^Lv4CzJh$zN}L2M8^Dw(t6LwN1j_tZ;;GL@7t$Mf2*VlJk6TIJdb5Az@6H+;zk
zsozh-OT*rB4^s83za=5%*#rhBNvB_pZdN9J6`v%W8KKPLD|s{T&X5=#H#udLbQE?Z
zniZ%P3sE~Mgk~zEq#XIV6U{F%z-$wnr%S
z@ip(XlIKWjG~^9Qp0B4dORXorhJeqxbSN?uN*_xTp^
zdwg9F1-H~TdN8E%2cf9-$|ZiI2l?UjqL8WyOH}uq-)m0G`g7v)CyH7E&w<8=GdM0(n-Ixl0-Kh~E8pmX$ErjtQKT$q20ekvOMm~HNULHzFzr(|
z3$iyAcl)g;n;UtzUPsZ{DhXZ`V3Wi)Z?F}E*UqISMKK{Rhmxddx#)I&
zKCj@4?}tF2;cB;YMleisMyBCGu=z^{z~|J9%zROE5?f*&M~h}pJM=OPTxllmhQU4q
z6UWDguhANQv)^Qcy<0`gw9-w?fDA87e7b+JAYDmM!5|?a{@OM3t4o{3>Vh>j*AW@6
z(di))mJYb;hy1}%{`F5_|FaP(b?r~n4Z&hZRsZ#4-jyB*t4pca`*frv6=hoB@T%Wl
z)8TAS^Jp4B!=#E9QjP2flcd8S*_K6bc{HvoGVt>jy#U=#*P+Ltw9+Z*c9*5agLLy$
zW(N4osPfRGs@uu08QxGJ=+|4Tv*B9Ig4z23q|Frq>kT?pz_DA)`em`;$(#iyJ%x+T
z1=o5p@AT**$&roPtvdbyL#Tufp6tYewP|*B!nns+D&wu3%PvG*H0~{NWzK?IHKX%}
zU$T=v_&h2uqQc}XvCS=E=q$ODMYbE@WFbdPEoJP*T>z2X5G2eCYjY5wbj}}DfH3|O
z_*GCPLqjpE7X#WF!Vl4i={g=iz)CNOZ;w#FcoAKY^3?y+OShLgDd~=tl4qXnTgXNJ
zF%m)tSQ0B8gOf(e@B9)yq6h7cJlmGG6MZ5!`O}b{{g;T}(<@D2{2e{)yk@+Lu|x@w
zpR_fJGs&ay@&NDd81I
zcR|f(b?Q0W+n?)xAR%?t@6z|q;lD$AIP-DJiT7dj_b(P_w7|92$qh=kt%)Hu0@bv3
z;!)0JCGA|X9DZvrEg%%b0Rr&y2N{SCk5T(EGZ>8l1dEtY=M%H)40&6tA(9Hw1WM9h
z8gIat>NP5qC^!=wFpP_`+2HDfr5f?SsnFvI8UzI
zt`R^~Dm8n~Nji6xqa5xjJi_I72w2#wXxxl0@%}ollaOT>(1=GzplZ;*thq*G_J%@t
zBQr!O{V=gj*A$a*FW1K6aE?ZiB6@8=jKAPWF7D1Yx;2P}&cC=f`GHmR9cVP7rc*!U
zD^$#yXmOCmc~q_Od-%Yb27j<^x|K{GOtoO!yUpUs=1s*GTioOo_(P>({pkl!5SLvP
z>@xgMva8ep)d7`V95+Z|g~fbsv7`PJeDo14Y6aWGtU-2_?Sl&kq+E!CBEk5@{7Rd~
zN>;LZ(Vb4IEFVZ-GWizYD3O)63pNXQ^l13`9X`fj>hopI@EVoTL4{kXlWyC{!NdMt
z9Lbl?Y-u!kAxbvO)>r`jmNEr{d%{KHfmAGogriAd*BX*s{Bl
zDDr@QG!X36dLU7i!@`-go~4d)WH$bRefA4!99OSk2>t20jMgvoT(Hm|d=;fcZ7HtB
zd2-Im>Qlx#yilsM(Rwaj1saWVozjRjE~?0J`+{aPzdec&DBo7%_>QUL9Oro@NUqLD
zD`K3p$=%)7Y`uVTF>l#^BoU7TD-y`T8QCWfi&AR(&c+*ViN1oca7(1@i<9=EXJV9u
zo}cq_Di))DEjMemc?GO>oxg7=N822r=hRD1a6O6VPK*9#1Y1l@TOOUGLrh0MJXn5o
zsAR{6#zT!J@0m71Ef%oCq;NP*O5HKqgdfL_3!$@uhL;Cs+aaVA>KU6%cCgbnzX>}a
zGuBn*SU6Dvk`O(Wa*TurP8Q%0>ZlasTBjOs`3YahaE{pm70^iJY4QPRz-9$km6TaFiUa$i;EfIg;SG%3`f#?g@FF1|l0M(sO+YaLIRo
zo7rFy4P$ADy!0)W+l?E?mgKy`G%;cT;uWb1%H!P+-Q2$4aiIPr41T(?>Wg>)@2h(F)KAm_ygeYF2A4IOGm|H;e0Y3O2gnk
z8RR84LF@=z=~b!)_%PoLcvzJ}#uF(^T@D!PoJob~UtS@H81lSx=$_aY2Fy}Kp6kh;
zQPA2!|Ely)-ayDA8?C(7*ej^=UVWuE&d!quu1BqZI^BCny`KYGeEK0XR6c^N923xq
zccpWla%YoQwyOZnjo+s+0Y9yZgl%_knjSsdkMvhfk#!6K-TG8U6Zr6GK6)hi
zKH}w_VkKl+E2F8_pvW&+;kPVg4ayMI9@5Qbjwd8=PGLM~k
z)V`XFa(fmPn&in@!2<|tQ5=Las;dY^dmrGG;s$0{?a^e-4Yp-p&ftsWy<;>&&C)_3
zeQrG59#`nxj5b2dz+mFy$%!k?1JKIYP_G51jxd>+a_0uYX|Y6Ktuy3BsHd}nW33*{%4?LsbiX;1;BDwsntmMp%p_VH
zTft85>-c6`OrN!apRbSK+se!H^~ZYW&iHq!lA?NrxNpYa^!Hj&t9}L{D
zi8OIotpDh!uI9-2?mlW=YKB|FtE1t~VT
zA@I(p?fmiyQMXA$;ewUjP{QcxIG4ihDE@N6UZ*eeJw^*Una|iGqUOoN?RZ7qay#n-
z;=j$V>hyQBk8ZutqSnv>B6nFaeIHpSvHd&4hu=UZs&Sa_1+0
z0AB)|^7z-_-@G+Gdw1f`lvNN3$;n_33?gDZ@0Z=l#Y@AxVqU)e`o5@xOTmgk?BTIG
zc4^3kZPo%fMO$B7vA~Xt^!ItAU+)8^`=;%B^n_Xsq@8)a`TOwPUiB#(d!G
zcG226c$E|xUX=w;2A8j$7EZ|+9_}Bp7#+lm>+OwLx1DqUc*n;OzWC5ME6CGu8w7z}
z6$|8p_fTZe7Y1m3;__J==;s*6@{qHmM20S|KsJ&U4~ZGx}7A{`S;7svusu^a0+t6z+fb4Nl6q){bKusz-N%Or8YS*q_LK`
z_=e(s+)~!j$;HHV)RG+u*xdf5=bb4Oc?xW&JXPBo82lFCq;Ogc)`pj!TT4OlX$y|d
zFnzzjL_l^SGqb&hM&oh7x;!s9>T4a{m%JlAI+XERWbQ~P0ddU~o9^?SqF+6CDiZv8
zQRVP2oPi%F#{wKqmi8n1Z#~dm9)D>F(K-ad{uV;CE&~ThWLPdtSG`ZAt%c
zXRmBH{$jy|xq1@2z%^%&IjWf=4QW&{O0}4OLh+Kg6=!V&cqA6
zQhtvO{k`a2B(Za)D%vzcXvhf+CP-jI$g!sNnf9+6DIrwDGBZ^!v-mnOp1IFRKlWsX`z|rzYRviayVS4x-uJUsl5ZPnQwpV!d&^q(
zTr`*CCAOiR&H58I(5_yWL)e`jA8ht?P$7rkq>bL3%xSuk^#|6hLa`lz?o5g0S%r*Y
za}<#f>zf5Gt4AGkOUg18I0;SCe(3u*8#Wz!;l2rHf&&)MwSta@)Dqz;@}%DAf|I=H
zhptQ>I^#{S;TqTNX!r
zBFz<&+v}QC_Z{ajH(me^=*G8<9bUEM@OBBY;F+&z=L{2>-hWS;)2Q4k_}vTvz4zr+
zD@8UtGE^g_?Q^A!mjoLjUFc5fgYn=vZ&-{}R@|cOGvHV@Ur+Di8_68;QPwwM(X17!
z{nF{utohaEMj{I~CW&l19&vAc^P4>W%lAQldVelR{%Dpg?5Y({pzQ>C${xyq`qvT$
zHr{W;+BDoVH@%m9_Yt1)dPf5c7et*}$(lM$^|xVhl#$NN-3{WWSCm8Bol<3qtq=`b
z(aK950t6n=Q|?dIUh}pKyc`4GSyAo#Dtju&>(=1#%a^_^$tqv%NLP&ap@Ab#-iyLw
z)z}B9-{M)VFqU
zR1Hua`v-d0yUNgT;#a<5x9aXY>s0&UXtIAl;O+Jz_6Com?f`~uxEPovrLkj+*R`)v7lJzyJ4#jmbNqJ^yLyJ(`SXU
zA>Ikh0vk;`f+^cS0=>BXfB|OEO?dK$qGL8itNDZMXX6m+ziMpAb~*NkgU>{AjMM47
z@c^cevT1JsM>CJEr81&^ORD%EsXdIPEOM^MRhrdE5?6Za4&-1vmKBTD@P&`L7AE<)
z-5x9c93`EJqemNw36d+@JO59hQCf&@un%2X!&6Vemf)kRsn>^l?M2coRBhTI0
z4n69clk@|{K4G|}<=S(qK6}XIp-VHR^b}w0s%e=J_i?x?o|M<)o$YS!
z%Z{p#r4h79ieypTj|sD00~em@lAh}Ga-R$|;<%DjI+-PfZl&A0A+j~*w3E&rZdUU)
z8YQxl#YLXuRmAHHg+NwC#*Xkl$z>9Z6yK|YIW>Q_qR%kzw=QY*jEAnY9IwiJi$HJX
z)l>raZ+^0VY#vs3)~Yamca#WF3krt6r)G1;cLG+K67C(Zvi#{b)|DLVcKJNh&E}um
z^J-d+r8{teEFNCL1@pq7Cs;#S{jQ+6+6O+u?$cqS-F((USQws+pvbS=Uxp1K3?0b|
zg~~>&B4i`rT^OZ=B_GRyUBK3F$^Dq64@1GeflOG+B-dZ7Hz1TV4?G9h79lM!3F!
zDV#9bOEO&Fd76H{k~Sp`xvo4+Gw?Rsl$`*arr2ay%$*u-WS}livceT&I62K_7aKaI
zIY1Od0za3r?<^O=tWm@)ue0OURwhJmkb^t@em|Ux-|KojJF8V+firkm9}n
zfRoq6vPeO((pW15+Ipl9QZM$Du0%wAKP;<%B%D*mnC;i=*@B62vz)BtpN+u|vwb%p$cU$r#Bjzmh8Jm9mQ71{*
zzxY9P{KUkjg{0(7624tbW?ShYrkfj$FP08NgA*IcwUKyd>^!hmOrnK!@9p7EGR^%Z
zZwNhwX)N$XXo!1vv8pyH{qzr>j>25`knluJW1IO%^
zu`AUK%LNs7CN&QUTjfhGoBj4EIK2R^HV+~q!T-yFh8$Zsf
z^OSdvfa~fx-D04fiohurzaF(-i)!J1*{=V>N-RbI4<=`;3)sOdf)t98++sKC;GF5y9opZQMyg9c-jYAPI~&`Tgl?pY84VvYoZV)7N2)G2X5=;YVQvT
z6+{YVU?{!<)ltPHf5bG+jlE>VO!xa0>zj!OoScxnpO2uf5aZWDm-I0FiqiJG7wld`
zZ|{5U>$PepD=Vv`qdr4Uu}Myz561VS&y{3>z=4^c;-QlTlXSGSQ^@v1LeHu(8@+H#ccelzdy8^m!iUb<)d+_sEYXtS}6I1)LV)%P}%cMn)Bg^C|k((WAdohTJer
z*ausTmX#1!qzHVXi&U%35LZf{rY_@NMS>+^ShOZ7ddOsW*?wqBvR5&)wXJmz>SL|F
zg}yM^${(4K)TI5cKX~Ar5kLM)9E+n+4it&u`YD8tCJmY3`b8T9)L2L>lP%xo!9%vS2
zx>ch_bZ4M3S9HjIy-M0te-!I&M#-Ef~FIIsA3j`dvQ+(qC~
z7-I^3_pvKRx;ghDh$ZK`tRF>Md?m*GxXR;OSUbY_0ILvMTmmPKq8G-<63ZMjJ2PPB
z!qSYH+$_DXe81R-I
zf3%qhlOAeqKIy6#l}uy#!iZh8e7t$$cN2O;+o+8y4BH^D=*X
zGAShGdAmfL{Re;hpX1G8D34Gh>JXb3mti9j(S0fItal}uqLVNr;lLifw+wCjjGEKG7Z(kI1E{HX73=giS&}VZJaNDW>Sns})>wPIVL;
zx(!R|R9uv8-WT!Cmw6HD7I9APXHofUc)soc%!2Z}bPQqB*F&copLTvEAL91hWoISX
zA^gDbrq;>u9bK1^?2|-hl;XyrZE!6Unn2KjJ*bSQ;X=pUO!cvkdjYcK$|}Pow^5HP
zI$>H&<)X82#gQh!Vz|T=_MV{S@)-s>Gc|dwIV{(a3VU&a@ki`Y
zZ;hO@e?rn83Tk9tO*8NT!gy_vDYqyv^%D$xXF635(#bC|#ezwXg~UKsA}|5OwTV|s
zVfSLCTRLLPY^~Y)9PL>52>oorb`G)!<)5x5-c2A!=?W=W~zh0U3}o5kkI
zpT7~&OqS-Vk?M{~qc`ac5~o67doM%5hzy3Nwv8HIrMLfFxIMc{fCw-~D?9d$sLTLQl0xHb>x
z2K-{kRv24miHE{$6#9*E2WaL
z3V{uo9C-=OYFa6&vD}y`!~yA#OuKu}pM^#q7Rkv}TqT8q|E8_i;Gz}pqR;Ck=4Hmp
zZXZt1xPTdYvKcGc%0t>=pNK{A`$S=*W(5&PKZ&n+6I^Ti4TV}fJsRp1xgq+6vJv{!
ziTFt6*Jbz{DM>n=)*6HDzvRP9AI;Mtd;mT6{N|w5U-}V>5{Q>{jv6Iu6$GTZMFLP7
z0^fY>ko$Fhi0XX3-82-O(_cu(HQ5oDRSY-jxddYRpQ(9Ey#+gYj1riJd}nMSC>{b(
zgEbPdlN^te7cA0}8o3$#Sc*u=b#Ezv4kF
zcADkf`ftxP9*W`Wfzxbq;p~b`-{d-5M$e#Ng$@cnW_=kGsVLLG(pP_7mhLP%I>p-M
zg#@0Wht;(`x%O{7-6dx)TpyzMqBBiofoNJaN6cw$AW`|tXGBu+K%)Pv(m>5HF|
z&Ej1eh61|KM+A}_*}R2Q^#Wiw0Qnu0Ou#nSCf4B%+jH}i@E=a@RK%;+&u_}c=>-`v
zd){LmPq3xTVY;{0+ulUZnUI4J`wMvTM0@2=%BEzi(uuTfV&csrEt8lrqu&&`*2_Fh
ztuq_lqxCojggYXDM5osGBu(spfE5vJdnsFOdeb^?vK+p9d{L-6%k-G)=c5BI48T8K
zn<#rzuPj`>o-&UCo&z7EnSuhnb^IsyPNE^<1fRV2I_$a=<6SA9%>|e>BH!h*RJ`id
zAH_VClvtT?nJRN5!>DxTU?&g&889#qyqS&+SZ)usPGG>4$&wgTz5udcWfu
z3u45j4}1wqVYdiQp>sBqNE05=vop^oD=K`fSXxf8`D?*?ts+aI%>LtcXxZggh4<1t
z3tdkq0ngaA9~{^32XzgoLkrkI(^_}}&ygr!n)IrljGm-bw!w|Mcx~GB6ulC^$Kf^=
ztx{y~FXgZUJW>7S?E}r+s?}ynRUvoFrH|r-<1x=v6DWYV0$(OVy-(nQ#N#l5PsoIV}-^e$cQ=u@ZavFfJM#2J$C*Yvm}FtxNi!ns^o26K*)QxA!9>Q}T_
zmAf2YDz`F`X*sp9a2D}_UHH16=a2RUQWV*Sfav1lrTu21)KWLw78(@*g_stT*_Tw@
z90*2Z=Q}^vdg+3^u+JPhz8d5+R|#IPga$dRf&dF#k&PkZB0yf9Y2S$jH1gSTL|gwhR+&NURi*UC3tLh#imgzJ|qZRvw@OeJa1MA<$maa>R)FxLFM~TK2XWGBnB!2
zSF6GQ^`l?U1=Yv5G(dHd-Fi@c_TU_JinH%%3-qlE&(uJlvSs1>*2DP`pfb1<<
zfSG^&+ibxBUXY+;pWik6cQ7Eqz@#$J*a1v!gfIZ+e``KNk)808daKni4<|2&%pU
zBtdXp{l7`EZU8udT9&{4ZwgF00QVq2x;=n!kZHRg5DNmwk^jvF{3IX{)Dk@dfCoYP
zJYf6ZHgEG@14R65Y25~BfGk@3fLD-3;|#$3Z*R1PUjv3gCWU)|90c6I-$WzimEc%L
z!4rTV=#a9;f%<-7MD}BLKxHjMe(lr%VgWP0y{#PXn1plyvdy5DHm}NXhpT!
zLD-VV=ddHB&y;+BzPc#q>v+8yQ&7BSZf#ynEK}=o;W?-uKM@u*%^6q*^L>d&c4X}
ziX0RCY$_#hE#`5V(W%GP&?i;?%B(}wzTIzH_QN~eI^n`i1h55@#i`(7T06>YWx0^%
zeP7md!>xAg(RgpeXN>{z=_m&M0kL6tA(a>;M?IcH*=p4+UHfJMmahy+v2Ky
zmHj`r8Mh>TFYjwtC}B2e9g>Ylctgd=O~Z2K{K?K$EM^X101R9VvD0ry>;pgFD3SYM
zf|S@MtfupC(b1<$8z$hhmI&3d9`hVtfqK8AqY#l8CRQrm(nQ5|R9$IQI9mo>72)m3
zek(-8RK%+8dQ2~z)ATc^w(mQuEostXeJlP@>qy7?{lf=oo;SGoN2M4NPZxk@j-Fh^
zM#c$=re>86qL+dLL(L`~cgr2wToL2^cdqR%(pP#?s;_YH?7>33Bo#8UqIl2W!+@#<
zvRTQWMJ0{(#D+yEw~Krv40zTt8+#8JCg(WH$yYmOZ*L)FLO;(T-dD6{!ccD@>nT7w
zRG;1&Ch2dAU}b*(vvy;;p)q{st@4PARU$h56BAO)O*531)pAjKA+RDjT4^@5i=>a$
zvjNow+>P+yh--cZGD1O7PT`fZ=n*(sS}G1d4>k<1wkM3ds}U?hmmUJ6$Kc8SgEe4(
zBvn48netPr+o~~uhb(w6lNC}ki;z|qY?UR+uw$Z<)R2-be0nv+v5+Zh%|&Pq3u^+b
z_bz;h2J873b3?ZOwWx1%<
zcqgJl^xuYTcTcw@t*b
z_mt*G5M!RbcYe)y>QA!?%cerRo2+pT%a{JI#>GrjDM$*oGGFvrdRrojSfEAkmWF7q
z5?&uCMFac=b+`5a0i$8P&$tx{_#L=3tlcle+8HTt06(CS_KIe0ORlemL!?q-@Sk#j
zp~k3pTzjA*k31KNr(S!maMlbnalRlgf8Y!<@X^8)*&MECGvV1qX!hs50ZmG3HOAVk
z0YAji9*<0q!Op_V%W_H;4Er?$k*!-O`LcNAA#gq*f_qnIxkDcBd+WZ24x2f?%j~De
z-^Zb+dUn9eMA#Jxly;I)oE2yr?~tyIl$(eP
z9w3|&i_*oN9yJR~`^I?DS`N1B%&c0fn}+2WGf{Fuqk`93Ttai!mk3=xqR7qzY69q@s&V$^r#EzsUEr8$4@8n`v|3?Q
zx@D#&F@^$rZqp6X78jxjLAy!Q)l%6PM@rr0Vv9z^Hg#iScJV0=h0-RM=nY-1TkrnW
z_F&{4>!mFC*k;RP(nJp`1nDtNY{9UDvfg@uh(_&fc!EM++Nj|1I>=Fk-Qe*iL_`8v
z25%rWPzTyjeXhwqNu!6#4pmp-yU|4Uy)-yYfwh9hWYDd3X(rB
z!j4VLv)0uG@mb&RY-+y&4mC;%HwTdFR`q~fSO`QY$5|9GnsZq9=*6z$2YB-BPH{lL
zXY4%F6TpS^`WTaP`EHC_m%$$F%3$m45=F}s$DF`-#Xdmw(V&xB4rV<=12MJpNPH42
zlcmhXhWtwj?`8w@G_jDc`Sec>C4N?J@BD?gnNrqeqXTsQm8JJj+fS^Ac4OZL9g~5-
zIeqoW!7iWb_`h2oqlaDZeVPn=-Vd8#{fO9fo<}edGK775l4e!tnOEV6On+~j7~{d3gsd`%|dD(Tbcx?Y=^@|TkM*u6jb+OJ($EY~~0ns(`m
zC_r3m`>5Ru#eK!#ts|Sh`1(GhP1tWBzgRqwhstMrHk<_L(iQ&Sftv#zgM`0F>;jIo
zb%<@Ceo_L;o4drxY|E;YZyV5Ujgn*$8=cQ;&RGhpK6;j)$nnrK6;=aQ@?c;aFPA$W
z2=&BwA)#`ud%okpko1=SeCW_F(x4|Mvn5ZK@kap{J(7Ob_(q)6
zRls?}cuR62eezJRTW}$i4Dd48#utv73`@~lI)J;BKJ~~Gx1W0req&xPT5}}b3+Z9M
zD2EZ}`K@PvvV2*tw>s_uzoQ>28H%OK>kAzfR#SF3Il0*M5O#+n{d0!LWi+A+n&*pu
z0+*5Vig14fKXW2kc)diw)$T_bBQ;>hUonJ;T(+1Jjyy=7f*ci29Ee}ciRC_sm`s3~
zlE=w{Mg+;GR2noc#(IV1z$4he`8B8xX%Nr9w3|ANgGB-U`14bhcc^_YUz}NS{NF5p
zX#`6h(e$@U1WAs{%zQn5G%B*cZw6Rgm|jR?h|rq9*jn{&+p8sIS!+m5{=!gmOe+q1g90=c2G7`8mAQIa^#$O76_F?JRG{H?HJNl{
ztv>%TN+%gDH$Gm}XT_T}2cOZYvvmx4`yF|vDLq^4kgCP(K@JVs-YSOM6*lZCOZ}4l
zD5#InRL*yuiHySYPk-EaqTinoH%P%{3Q#_H&xPYwRq?)@3fPBYg>R$G7BBxM6>7
zIA=$juTVIVz|jK!qDx=pWtEa(-IYL;P-AFNrTu1g(KsRTsgzEPUK$=bc^)6y7vMLE
z@dXowQ=i_nSCoKZ)&iaiJc%_b-)A#Di^ia3sYmg27;p;2*lVWkUw>0R!K5zx-I`u_mxz%C2XL#e`x&^?VJ|kEvsX&l4I@oN+eB
zcGAD*kW(utJ`p_8vv_Um$7o1%M{?)nMGjid6Cgg2&1NDH1ZQppoMgY#u
z#@ffuzSlntEVWB$q(PK^ID$}%QQ+lgIbdX`!FP<&4$nZ#o?_yAPN&-E&RQOwDkO9I
zGm7v_Eze1C_`sd%-TB1Tvk3@v$a??&3w$)t>?T)^S}F2kHHptUr-y4&=Av@qYlF2<
zA1!@-w+Aeu;CD2GzLJB3qlevs!=|OP>{jl!UL-sGjK4}07sp`oDw7KG^CikV#Q!Z=
z+v=de7m+}5I0kqO2++yEc|ifWA{BTA2p(v`7yk*-wrLLVeo)Y!#0M?|k_Bsm;GrNe
z76qRH0jnhVB1qK1N`rTTT88AnvElv=Usng`01Zdi1!n`9r1Zg6L6Btxe)~_nw#7Sx
ztNuHv+_nP*XGQx5m`UKs|7o8zd1*V*zoLl~A!Y6!FT)WXj;PHt4P5>|C2immZv^+(
zS^}TZ=nI9FL5cwflQDx1huL_5TUwv-PJ|DQHa@t?7vf&l|tCjwjP1vAmXz;L27Osc{0
zS|}lwVPLWNZJOQVgX%IMU?I4Gr6e(w#($Kz()AlPTJ2qgNV;^Y
zS$$okmVm=8+YMdjy39;n&)sdSkrvOveyqV!_R$WMMzC25&*duKF2d
zVJ6w_S_I5paFNS-KqtkqnB+*S(Le?f^q1({g9SjGAmn2=-Wy|RyzyXYb6N)=czmyo
zQ~0`sS0rW9)ufvU8ADPJyaXQ&N6Z?V78AQQHTTXM?U{WMv6`eWA@qhW4>s|%PDsBu
zTnq8mpKj2ftj4R7FZ|hC(GEA>GwYSVDPDZ_`@x7g^u^)^`HCUcg0Pu}g@*;4fxsC7
zZ_t3k1!{r>l4q!LK4G%7;6baMaBBI-m974=`#mvtqtC{LzESWsu-j3_oqv;SUr%hd
ze<*zX>4$C%v06~{Zc;t%-SQbGenJ6P#7RsGquz~!g3tTXMcY0SU)>;82X2vO=zQ+w6oHh@+k{vU?fxoOn_yE$^nwWmBr_^^5;cl!JGC+nWelQy|{x;5faOmzC+|2q`0B%Zs;a$*+wBY
ze5L#F0ik`EwkEplc{$^5j7OHsDF0bWolbP=NN)@hZU)?FI}qvddCaiy<)F>&es6S1
zRt{D)GS5yAVwfce-ofpMmmpbK6`{RwHDS)2qDIg72<~>10h)7~!x!i^x6R@oLi_GA
ze^$4*&^0V89nc*4HTG+A`Ohqne_J$o&OF7c^=TQG=N0wq&f7VlY6pGwAsBJ|B#im<
zq2PYoL-xmBGAGdKi***7T9ZP8rrQ<$D~jVV(5drcDF3eh7tAfbF#;zl!{T=(pEwtM
zqc6n^BmH7~1lEiIJbDdkwTp_hc(?BwhzGP9boAf;d_G0Hxt8Sb4qZ~o6A~{>^WnBP6FUah
z6AXOToYxWvZ^7-{<~)3-yAEOj!9oSBc;Hf{J2`_#roGndTumVg5rB&cjdj
z!Mb|SxMvS|Uc2wsHSWb_Z?Mp|Wa9$Sx-c=2L35qf^YC?Wi?dEkoPlA$doN}OYp-8M#G8SfrFJ_+eJYz@H*>+t38{l(Cm4#aXoU^dzm
zq?{V`{9PyZQ;a6uR&jXwAIH-a#r_I=C~sPPRW!;i{u_Q&}NQymm!X$hVf_Vx_j>fTp9PnkZ;ZR
zLFpVbfZF}rsG+)2mOu^K8;Iog|`
zNCkWaiEgZ8H1aB^SKz#eHr<}P*$Jf6-}q^vpFx)8=8Tz;`*y-KtDz$6>km2B2{^4_
zgJ?Y+C6pKv3QJ|!>QA`Py$74{*<6SlMV4N`+&YrI^~mBXQxUOV(k@K8dnSFk&R+-k
zMBC?saNo`&>o)q-&hv8xPKEq@e+u^Gs2S|e1VUddnftD#bdcp`!Czc_N_!T5cpq`q
zJ8zb!-Wcq$6f612NBBV$WC0Z9biE93_T9r#r$|(+#yp
zo4xRl9`Ot72E{uvVrEl<*BH!(%mb}mCzsTxpcG4*#c%2Hlf-YG(7u#zla9sGd3>LT
zLb7VM;pxc_zuk_OGD`UI9#8ng$;SP;N8=)e%UZQFa}tw;TYYq4hn-oed5=SFPR8|m
zBD|)3(#+7>g0S34drS~EhMDN;7&?;UxdWq7qU;#xAK5x=w%eYpx#HVSbPg>3dK`ox
zx8#y01ra~V(5k#-f+k$p7+7zC^KO5dNDH)v4<#g%RPQ)n4&H~p#JSs7F8YiHnXyIV
zvJR&|%l{F{BdI^l*uiY!vE<-RQgHb#Lc6oD5E3zx^vEXKRWy$_$rr_&u@V2ov=%NE
zQ<;M=bEIqk!I9pifoR{P_7Io_sf~a4m6NmEyahO|5>J}d)kpt!E6SNu2N
zU-c*qkB1D)13tKsDl*N8JCOn$+%-+}uIuJErh!oJSRx<7V3&9+%eQD}&@1?CXJEHV
zTmnJW6VH(6_P(raYsO1!2_uD3>Vx4ji*m#$SN*tyB~K4*e&P4#T*U#X=g8VOz3%O#
z4=1+yn+j5adasrnh7iDlaB*|)(>40d*Be{PHqkmo#Nt@SkGTV%_A+AP!564|xP50f
zk^-{Nl-fRBBKin0W0&QvLPdU@M3>vt9ZJ93n@+qvAIb(x+Un|*Ukw#T>W35q<+X?4
zF!B8<_*vG|Q4;o~!UIg7e7QD0KkWs2EiN=!~_WP{ts1O85LI-YzZ`tLxQ`zySux)ySqD$1PBt`CAhmg1PSgT
zxH}0DTmuYW=gq8n|4tvR+r7@MUAv@70U}^LwnYi31oyw=Q9v>z7{&cy!VzY8
z$BFQW>9f<&Sm__w0B~&v;sAN@yb39RAQ;dd%lyyok#c|~@TMlp0B&$2QymZq1Kz8K
z>Bj@|yYE04J>A6=fSuk=`tCbW*8^aK=Q$Vw?!bFlm;zS8cwNLEKnw1%cLX4T5v{K~
z0QMgir!n6n>VB6Cgq)t>0*95(k^z88|4RN2h?~6u!(ib8`~ipHh6M<~0zM)w3@``=
z*7`93e(+F69KZv77D@)d{2$a_M1Js71-_$v{PYW4XzX+qa(G}{b~eBfY&swm0O-Mc
zahJSH34ScQmarGl`+{xUH0$^IF4XVem1rFR8?>KJ>1d$)Ev;BT(u^^!^;<9`kTI9B
z7Of;n!@>L*w3V2G!JD|diX2V$YS!Pqbo7-!$?anMbn2w5Z|iHagr%*|$7ANkaW$qg
zr9utX%a;SU6UGrECal+s{rw?hTU=>GMYVBkb=Y?CtTKR^(C`p+v|FoboPzE~xM6jI2QC*+qZRUDqXM?U;4G@}c@aFmlDv!eCEj;1^5v8aF|
zjgrs8bmP5%*<`t>k(%Hr!&S%yx_s0)7$8-h#&o&y?B$yvui+u`8>G*p-OKx|hh1J`
zQu0?uE)q_rEKcJ$h6PmquWEG2>k4%CiU3erUMC7RcxA*An~8@nVD}g-*d|
z3|0MujgzX&-&;YTlb4uf=w3{O4=5Z8L0{BaCiXa^)aV)%G@+RGGSGKzYpBHscCAoB
z=i*b*&ttQE4F#gbI@4dm8R91}b_Lw*A|Du1O#(u+!pQ!H>!7mD0BP%8+Qkl2Z`D9z
z3OLkgfk`uza4_?Tf61y1A5-gy{xnXq(JgBCHbgL_I=!cXw4i1?QL5T@;nAb-g>#y!
zBbj-v$gBdrjogaJWY4CO+%zzwwLAlt;rMnYo>(tzZS2`A3;wu}URk0$E_GTUDrwT@
z=c?~vGc|l7Mhtn`{XkF%eZW?NfI9|qr*^0z65`t7SS~E%E5EzWg)Of_dA*RbIlLc?
zM(k<0eKK&Lj5-mb8E9Kgp+D?nOxmRR`c@=b49{TU)VtP
z0-vu?(r5$SkkjVxf>$;T*E%0nxnfY3!D?%DxvMkGLe2i>!rUPC&QI}xU)@}wWFBfd
z)1(DRBh18~ouRmb-0pCgv7PWS=G#2IlJI_|jZ%_W&9X8G+()!`L1p;Wh~rufYiV0U
z?FAEQcO33_c)2$)w62i`EU78%%;W5RPn#;zqC^uv)sejKe(j#G?r^b7HBukSesOE|nU;AR$xu)dsbSLx1kJ59&N1Zf
zAR~*U$3%t8_%+EA>Tgvw*^glT@4`%*e{tWVi~S>nTyvMFwQOtPtHgp+@DvbD_r$H4
zE+>2AT{RlK0+2;eUoBZhE#NJ}_3R<-8;7T$;>IaQ66(7%)=7O3>(*$kZ4WLQYOL6t
z;&HLHIOs3pwr`xi!xEYwf=cz0j6>`9N`IYg49f<}IIG#gUs-$KOH?
zd`V${f*%iE#-IAaie?fOt>>Xi5`d;QnYs(%A_h|>jd&|IV~??haftd=`q%1)fz+B&
znI30n=c0?lkcO%^=~bhPr(j$}(cGnpi-+6k?y2yp+JO3D(TruS5$NwyN3`x=^CkZj
z#LiE&8uYe*)>&s=~ZzU^C
zC7z$nYl=r{E+b0Igf&cLN~bg-N+{+e%HHsWW4%n5Ut0!z`cBo8l}buh7WlA&j-B3o
z_1m(mRxKjhMB#V)Z$KQVzFvq+t-M`bn>?$l`1l2H5NECd`u;4BiATSby7sc|JiC>h
z2{x)WeHMS<`w4TyW^bHr5WeKy&w;YF)JgoA2GuizUFy1a5Ba|mI>#;0P;W5W5vb)
z^Dz_zL@4Y(Wd>FnMAYywZ6CV<0I)*9>;oYE(=duVkvNL)8b%87zhDP~Hu*t-4R}h+
zFaZCbs_3?6mREl#Z}f2fO?esvIDz$x-5fvzJonoIpbo6LT-N}?{}%b*$5qn4%O*+p
z|7k7~x_8aBzX@OmPsTj};DDF29|Nkv-t(OsfH_$INId~a!9BJx&>7%400iiue-ayH
zC~!KyOKgYwALD|Vo=*r3(^iQB{SQ&_p+VzqyU;MXunP4_FSR&y9Xi4y~5f#t?FbNpb0sZf%zU_wI0&lbU
z4O$5-HPtY54tVm=G;|kO#*iP-W#A#Y73hCK2EiN9tKd}zJJ3h}p8f#3777d&NNc1h
zA>IWogH3k<0kA-dw$^T@9=6U-njW?e?o2*59*zzrnq%*ASs#0z>2(h0i6~Z4X1PL&
z#ap>VqG3j%ZZKvs92*K`LW<3v|4c|)>@P~`EnxrH@AhSP#=`!?)SI{U*4_jC#nzXT
zb{%`U+29zBYuKXGojI04Th9sCx|Pr$fARHc
z9WpRJM7SceC4Buh!I5{^1O*%&ZTrT^xD$;Qp}>E(>O5|PJ!YhFkxL+oD*ej
z(wZxY+sXPFWP==1*!^kMf%hkJ303I^O(%otRI@14ee64uq02TF5)d-TGu$V_C$ulr
zu@2U3s8))<
zd&+m{C*o}ShGteYgzJM{Q|+&0FKc4aZ0(4FPXD_VbX>_^O$(=GLW{|Qc5@d2?=p?+
z>s0*wUU0!MzcyOHhJ;U~=DGE|-Lsqny^Z*Edn%$7HR(#fnTWL#E%COY3+ffU-CYvH
zpm^(Pc%;q86*1-MNVc7VO6jqWTH2R7BnIK*lSLQ)G${sUHupXDt!T?P(Q)o_-D(1;
zoA%;ALCIXpvx|%9D=?f0h*M{h@Zq0+3N_ustc8LuRH?=sAy^l81bY3uXzKX>O6y7?
zbPiCA%H$5Azm(E=*%W;E6)YoE(eNYq()Gdgk-x&b--%r3al?vs=Zo8wP6B&Q)iizr&^m4}9G;h0w=uJZJIs&U;+owCWvW>ZMko88>vs-m$S!x1x-4dGTex{Af9Lyh(fm~kB(3TsX?I)*B1
z(sXSwfqy^0K3sDk{7_v#$-iPIqxtFJ^+ny@ogIWS$lGSiN~n?=-a!(+quwt@7Nw)7
zq{xG5hiCO^LgnHl4Vdn3bt=(hfV{jh7AYTVlS*DD2lGj6CP0k;(I2?M+31233s$&0ojc1VHMJLDbhY~Zr;S-a8j^x
z(UhRLHl=7W>xRa7F(?<0b@2h=^ihe3RQNh`ifE_=74qWcsH+D;R5Q6_s7nTH2J`u(
z`GC?Ja|v~?qrb4eSYjHOUy-GX`e_0_%!C;e8dXdU!4uZ$VFkf{Z_na}7;ij&*fcfA
z4WDN5!bB=$iJu_T>KMsA8;Jz6%C~>}Ow9!9jo}JO8es1xlM3GsYh!A_bU7!1u;(^N
zU`t}@vD<@*OwI)mwTsxsAY%)C6CS0rPoI0NyT6r-pZ+fPiv1Xhp
zGdA!Jh@(}Z$x5u=!Rlgr7>GGN%)q7}uN*M)jAE>7I{4li-`x4~;k>a3yJi~ytE*`9
zZ?iM*WM!>2Dt$V!9|MK@5JWuvBD-Rsa(x~o$^b6&EZOnNWq3w92?BT`bh*smW%i6@
zFq%Ewa8_a4!&z`y>Uelm$^Pu2HhQB#`F!L&1e>K{Ce_JNXGXGcO?RqH7_ShxiO=VR
zWNuLy6lJO?jEe|tYzd~ABp$X0m(TpWR+_1_8E0Y%i9mX{A?UunC)6l%K(9SWUDox~
z>VpS-&_*C^Ygp%&Xqifqk=Jh{s5KLhM3Y+0L|CVG10$p@qg+E|=4pV=V-Fv7*dBKt
zf+Z*)g6W$n`~^YBBVWM@g=yw5)SI=Ld84oQa~K;be|f^|MtGa?Uew@JJBX8JZF7G(
z%Jybq$3Tz3XIs+ILSOq7>diucj`Q*pxP)R#7eel%nDtsHiAKVvF-tvH4?;U>rE{>W
zo&c2nm+>8kxN{R@p^W;uNH^K2JBmx*6mg2`l`Ts6ua4@|$`xTxo{Q_u&YbMi67!Wf
zYp5dQq_7&S8L8LIkeMFzp
zU|TqC{0}Ogi1o-A`B%SNbGm80T_#df6T5HyckRk`oKbAMR
zVt;d7K~QgJY&q4vu-bIu;@S;}+H-!rg8$Avu7`|l92H5k#0|Ad1zj~P48Xg5+8mSz
zrB3zR{SkTQySrzF|DDMJdR{o`>25)}!y0Kp5@>YUsF8AWmGP^&5VEKyx*)8-7G3Ww
zrzie`e?DFVd0$r?*wOOLmVd$M8d}*^7OdP_#OluRx3l8p>Uq5V@&D1K&TCxn#U`$`
zRghSGf+;l>@v3zh@@ekU(isPhR>ks5VkA?@aFgtI-+Dn5l=Nw!g{C6pikT;nZy8T$tY*?8ozl?S2
zmuDi3^_vl-B_
zm|YL87CgYzN=RL<;Ue6BRI?P#TJ)D*DgqA%J;0tAlz=*#qEYmm^^DmZ;y}}Rp}FuJ
zjwvOfik8+)6RcdX%4w2~duGr~VThm?9@@mK#I0oR-qw0nXg<$1UVL53uB1@&tyT-Q
z7MIoQ`+8ctyhHId8eI~6s&D&95PS8$<*wx~SyeppTTg@N
zxwtu&K$j^|wg#x<=2B(ySgj5s*$N>Tr~PD2_
z!EDs3_D@Zza`EgOrre==`E5o7=Begtd-7`L?Bzv8b&;xYsw)^|ZDVe>7a5%Fq`&lq
zsTL}b+(X%0h%L1?@XFJ|Nt&l9p$}woNic&$nrJw}yJKYOxkET2u`suZ;*c`Izr@8=EC?>{*R4xqZVCheC8@-*D)
zt*ojnbzSJW<9@2&TxkgaIlw##Pb`jn0QDFW{mER)@qFqxB#R=`^!NSy#+)>!YW@hh
zQrrt!_RamcbxPg${>YJs5)Wa&d3FI#QgrQw5~d%0zvWUn*lGdB=A4X(1pf}jg!*UZ
z#yZgoF#;Jf4dF^A{y_Fs?_bmf!Lr4mD4RT4N(_>5$EGXhTx>HUhl7CI=LwiFY~n;B
z0_I=+QMc&7Tfg0Z5`18`1-;%hA-MB5jw~(yfoRL&0*Zox%oZ>3A62U_2n2u)5)(<_
zz&~TCIuEpY_HHXVz=G|-G(I3go3bnr0lZLO0Z0r7Hbr`t%B;lR5fJY7ek
z#dD~b(9Pl#n=Z+$(~9&;
z3?IZTD;laCV3t1%XyB^g+)R+q!Fz
z%l56_;VlNJ)a5p#xO}OHrHWI#)CQ_L6v(xcepdRZT5y=Lt7=exZ!k`)j0OEWJt54k
zn=Q}w8eaq1&RNt^-mBv7
z_Zcqoc4#`G;$jHD9byeDkr>Nw`eTzR=zl_~ISd}5RokDcA!`NxhGWkC8U_`{A#D&RxWLpqgcWjT-T>Qr(W?j(X~G`It*hB@oPq8Yc3I&uj|K+$IrCv-JP8{y*)nMeoN_uRzPyd
zt8`H-;4$bKrK5(=GKI$WY^Si4Ue(f-P9Io!6zx*vI0~(SL}lbDUqd57nSfc
z!8JaC#M_qb<7fSP-uXv-cQZop_!%5C73}TZo+w_Dy7Yj127|tzG^F0Lb?BR2u|ElW
z0bISY{Mffl5_^nYZr0xhwddVCJfGQQF7$UlEp(-qTLUpcYdqkZY8U{9?qEtuS(WA$
z9TC-2#`Fz_yLl`aMn#4~jIjg_bmF@{X4$}@xSDn^=w{Y{23l9EQD5E(N9x{
zqVtzZW4jtru!0gaj%9XOXiuSrXK1IE4b!eq9nJ_ApLYzA1Lz7tPxHP7D3#vnUDO_P
zO;7qgLBw_kR^p?FP=>ltGIoH1;w!%2y9KXAh`Tn4ZrtoXjN
zvc|}Z`A!}?jD@DDEi-b!!Z_`!TYB%n5h*)wdhX6ETqG=9y(5D-cm*%MH~AgNjc7T`
z*@`Z@IuL!LN+g%OAy18I_Pn4P^Ot4@mzw&zyk#sEL)jU6B@0gS+SyvmrzjRK@)d52
zYikv#|DXYU3zH*c{5v$TJXQMiKhU80Y&2I-)l|+a%dn*+;0*12VNYo9W~`Iz_b928
ze)4laIZyLxb74yzdYKL5ypqLF(hnaPK-o*jy-+PAt*0Y0GDUOg%*WSDp
z{p0$`lA5z&niqJrq2fS#o}^o=F@zwb8k6_wf^&Hw?B6~uhDZKrcNk9>B=&Cq0Ry%@
zrwC8^uF@A-VW}_SLQoHB5C#LLh+(-0DmZe5Cco~_u!eJ0^j(Ezw!g9wz{7*a>+WzK
zu{kZIyEh?>sw{g68{eUUO4X?u6A!KJ;nMsDiFdK1-~c4lJ;Rvlwacf|^hgKs5a&II
zDa(%wT1rg^RhAnKPd^-cKwB|KJ6}U@Ps;vmyd=@6aovyS`HU!_WX;5nQr!~r0Kba1
z1rg1x^*IgT&LxnSg_lavAgpRLaj?P>kygcmpg797L;@8rDOT#+AoMT4u4)>I{xw%B
zhAbiHcl+XJc$CgO*R#8@%v^BBP8$v-(czdDbni>~N0j+u=B;|g*sqVvY+@l3t9)Fxfs+33n81xb|B%E
zFby2v?~3t0B7SWTQbfxwF?BY3O|VRJ^ZZ4rcSJ2(ufy;Z^U|AeZQ>IU
zK)~=N*7}o@+W1i!kxTr7vY^?UE;@Ar_K!3|tRoP+y)6e00gz1F=rckxv<-pYlq^hE
z5>0_xh|n#9;I*+Y1&y&?sXAPpx*iReV!;~>^rh@e<~s6I*sBW~Pe+8P5DJhRRrX+EJ
zp)vWAD?V#e$W;ss(xPABj^uolv=+og!&+j#{LQ7ML?aV1-HZrFHU-`0m-#sc!wl6o
z6+b{rk4;EgKUv^!0*ho0##l+aIV+7A@8c5amNFAw)+)aUx@7EtGc!y^QsT?yE5+#G
zxT%WYI$9WAW9;}(J}3d=PZ?>Z?)pc+KjFybQrLk%^IF@DT&o4FGSVXZ3MegSl&D3_Do;}ANc29I
zR4ja&=8!>~dqs<+DS+`Ktl*I(MzYp3k+lpRp2h}^5
z>=iuN2%cpIGL=eYA%;)3B&Cir->xRyNjZn8hi;-%CUp=5$IY+On6}vdW;ep|;B|)o
zS4=j>d4$`iCP
z^L5q;KX;a6xmLnnICX(ocB6FIBfzmwugY`>@(;zIVQNDx`}GJn$1m3hj^J%yI>$nkA#kL5eyc4w0~
zrr0wDRj#a^^oVLTnbEE{94?#0*b0NtbQ83bh4XVt>8Hpr71UXg*~Wbm8g0d)GM6F`
z?zN@&@Ps4yKPeN6IbF(qAEn&n*O95+yR`5D5Hu%
zk!T~)#B_$=3bylZCJu=g!L}Ucgzq%+2
zT~1R)LT%a$OoUJ~Tvd}B8n}Ahog8@#_a?X*U<-&sFtD+v!1Zicjij7%>o)S$k5v8x
zskNo8JVYona-JmD)zG$joBcWaIUl>1$xu_L>o-KG_$X!DqcjW`D|xe6A=2GY0ZqY%
z0-GOVJ9PWRo}ia9MrW185ic#sg<1|3Kf3uw3}%A(@JafImP$3_B)43VJj|n=#orDL
z$@ALNk`w$91-8^00cQctrkJ<`h&$Vjh
zomJm!(NFB`|Mm?$neYe*5qv<2hv7Hb(DEZ#bQZx$kjDCRrXp--#A$U1a!Rgr)%Epa
zx7+Ky#iU;Fd8npd;O=rvbFZW-`E%DkL#VQL+q-Gum!6*9v}i&%?~=s!gNt8#IXUN7
zakbyBzR47K+_T7&E|#(^;0U2d=#ddJE;tOT*7&aTOM3k#NprNZm%;Qh&N1aAm%+sS^4O#Fu!nUQEE*2gMoRzHnw)$g0
z4`cDtu!H?LiEF(hc)@zPkBDg7zxq0!W*#4BmJ|qIgS@?7W-}w1z1>2Dex*GF$%9PZ
zg6!HYn*#mnBg9HG1tXx0E4_$(A!$LqTaT}*FQ;!vb;Q|kuAs|*#n#p{XWpqcjFCT&
z^l(^=T=|V=)NZF*SP96uEctK|FejY(-?3w26e=lx^5MfE-Pwva+^U_{t49(po~e1z
zvtTHC9}DOIMHX8F6{VP$jhRf0e&}cotY^&pBN({pPtlie$WP-hFJJ!V29H2-%H@*p
zS?sjz6>|b2aY_rAYb{C`islrrho|1@wd!rmF0fg39B3zOJd8qR{789h(4kqY$$BMT
zr~zO%c8Ph&f{#o5Gz%TVG9bfFCH*>E9zsN3Nl43J~pAOJn1PqPHMm
zAxlD~H%WnVHeob3|FwD=))5Uy?58r1Ca^xT86^X%&HaKC>+NWU){qidaB3t>T^sre
z_z%DJ0S!UIXqDjWQ7Xhjr)5>3MD09a&b!zw{Z{9^0Hc
zB8ee`n)X*kzjsTc32@U7yLe=uhKxaesvaz+EvHz=kj*Z1GaaDWv*c;UEXbgTL#Ai_
z5-JFjYtITXQ$@yCUsFP#$D~k
zm+)R)`kK^A%A@05fpcL(OAlgeS-zqsguB`x5dSnjUS@_lQr^kSCDL%e%r%_<7lsq-
zrZG{SG3gA5_rDIHc3d{~;G=Pj5VW>z={@8zH!u?BmWL^{$|tKzreg~U8}J~B0|b$_
zb3My#ewt*SfF{{Sgt_sI`z;nczgg7$OmX&->-8q@FN_64wMQF9*+*TM6gKE|#lb7{
z6?6zg+y$YK6}y$|7?Rh#8t0LocmFqVh@%Qs!(isy{DFZD`UQnwIwGrec^J_x^kuOvo7A27
zfI`;sCs$XAschK3;*G8O&AsM(>(!Sk7Ery6e%{6_jpa3bA=E9udkDqa-oEb@gKyA7
zAk_*ANNQ|w-}3EhYhUtfL>I|1cgXGI;f?;yMpfSC>vc7RrCyJLDiSvec;Kd?p$e$?~hV%5vaZD5=ci|F^{itIowg5Q=m+k
zEZ39n!;JS21snxpq+!-VSkgtkul*R6@tOn+H}UIOnpsW`#@mw?FyD`f#|FdabEI5)
zA8+#^`gOYu`a8THL)kHe#$F?HAq7?X5_TziiRE|y{E-pU74Xswcqh`|-loz8oqvcB
zMBWD={HEYb9A@^kSr}IPoFRgwk#5omBmuoZomZ-#@%{
zb&VKa;Mfd!O)NQTuf_F+7nD2)VYiF?uFbTtpKEFMcYx;5RIoj>laogd3BoeG4r#q(
z`DQUO4^I{X`Sz-3CDK76C8Ex?NU57NPTe0jh6)7KWJb`)E-iAWv>NagAxA~Rii0L=
zj5s{93)T2wMY#wF%p%dH=ACCEi12>Z=r0rB5TNVLTF2!#WDEjB3($LP{diomM~|T-
zf0buf(zWtWq0D||di$0!=+&U?5i`?d)+kFhTPt81muk$D%*5YV*!<&pl7geVFPn8cI(<*Zh>KwdrRK`V@vX&Z5wnlw}{NbRko^hY<
zV0Hx`f*_PFjbZopt<$Z;*qi6mpEobIX=_LI&pz?`$1%KHSZ0j$Yr-!kGa~T`@%8G6
zj4Huib?amf7#LqPm#Zsj+@z;1n{IDbf;{C-9AmYnQ1mu(?n<2sQ11vd6s&%iHoeF*
zL=0k-?K(CYl(%;|hrj=caoky{>u7X^RiY|2wY^t_4UA
zHvSm9fdgQN`DH)Q0c^q<4+Gu62I7w~U==vUEqD!h3m)>`2EKuZeD;Bd{{n#jiZP)b
z;zK}$?EPbj>!Dy!+7b?d4F8uP{-e!;(CHaG8lBAHXb}FtoaMF-sHHNDvX1`<;;t9_r+Ur_@pyP{6NJpCn=_qLRUVl1*W%0v`4QOxb
zC}~9vU{#gL5vn_>QyE-qhmRv5)KDgYxtI`7JeCK_9a81eGhGoOZ)#=Pqsem5PW@q8
zcvb$fnj?UY#4IVQ+|vZ
zwa&)fRW`$?VHiFPY4r$#5;wKpDdT+uUqG@&LQ~W{y87j53JE6%>^0p`9Z2c3y{LeE
zOv|Ov!Dj+GLBJ8T@l&Z?akc^PXFXC~8;MynD|%X^+YllwLZI
z&(qtoaA6bg=wPaF+tQ4oZ`T5siL-_FT3ElMX1~A%6z6v64O+QZ!E9KNdJxy&16+B4k))nl~zw_l!QX*UL
zeEH=}uu^v~=>B5f*wVXxk?^=8?&ZChlpocU`mY-%=bo^akF#1Z=eq4qRfz_tNk+`w
z-ndo#0k95%IQLAyR;Bmi3_G~DU+F8z+y0gFKFv`5A167j4GfOJx1{Q2xC90)6%7B0
zi8NDYN7C8(?__d`2(p~45rOxKDb>pj7}}t?kkYTlXnLLeSFhf}Np}lf19NrUA!NR&
z8_Rt(rV=xQK`30cRF2j1<#UjlI42}XMa{LVVBp7V33C>O0msZ<7
zOA)n%<-
zzM6#|_Afp-EDh^}b!7=6jM$XuX0;dMEim%bNsqR;M6zP*nTsD~9}
zxg4DR5Vke7+!mRZcaoD!y;P;t+W^n~%QfBg#=$U?bNgdg73OmTIZyShZd9uufu1CN
zqF;z+xPVZtg3(|k+I~_-EitL8O}G$9Dz7)E-tS1~r($myowX-TISio&@@D8y(6&wo
zUe32C-G00PV%;!6fhAMa`AxRNj}|}A25OU;g829bzP19}D7LvfJ)JKpgjs*C$u;!L
z(LutfAbXBek@^M!jBsG$$1X$v?`F*NTjK?A5)cVuIxFFQla{?^qcecq<62W}tdxuzR${Vi|J
zuI<Wp)8)xzjg09)>p*q^I{{&m$*v-L`Xdm_bC))_-q}
zpc&(S7M*mcL`zEBMZaj4{NIDYW*;V6(_2|=qW%jPlv9(BHGO-IOF0{kqKVI1L+SrZ
zA>X~X;k~tS8L5?s5fI+Ah1(;^-Kff|Xl{s}NJ#oDZ=OU*NVpOi`jXf|t>`{jEW%5z
zXS^qNxJpBXg(Fnvd6(rPL=JjHYp6VIE*$vC9l(Ss2TzBYYrHp~p{KmtUhJ(Eq@m4f
zlY04`MpjDpFU(izzFECEIrYorfW~|)y=v$R9U;vNA)-BoDN9jqEtdYwe4b~DM;(eU
zH4;{VcqOj6ylsn{7Si{`#GNw8rUc|#%TXMfRtQY$YTvP!P0dsxXZb)dIbpf>B4-{D
zyS4M>#l`suZ9dMIyuLhB09qHXs6^9wqcH6?76kaQR*ro99N
ze#ZH$SCsNG+e%I+B(;H_kj7SRZe9ib?st6g(#P-|Z!%;Nt;Vgm#w{_IayYW4c)moD
z1X$|S?%}34wUa3fS=84N2aUQZ6_5yi*9ibVEZb`n9Df+uz1Z(8zcdRI=X*gdW0>@05G?6#G
zE&n5?gHTy?bk46R#q#DI-Em#1tDM#Lm5*eFs`%z#@}XQxzbKKyIpvoYK5)e5cRLIv
zVL{xEMA$VEYRgo9Z-Yr39tC1*K*o@)5pjNe48~?35
z6bFql#o^Z|R$|ru&xz~(tM9&Olsx=rX!AV&cMXY$&jjCqJV=m2^h69@-st%+y{CN
zpGt=^&)HklZ6^AjQ?AwRRJxg-_6}~XrfHZ%b0D3ma?h7|_z{s`e_wsfs#dhp^d3g@
zP=oqoAkOE7k4aLNJBDFC(i4;=jUQF
zQ7J>X{*FCfD$RK01FpUCwkd}9PJ9G}phNrs_fYMOp)BF4Y9^C~)-m;~%Q4rO)4h*B
z(rJ3turxRVm{7(HjN#!p;q<=r!QAZL=0>ImF+Znzf@(wVBv0$a(H7Nh?<~u_FR`jm
zDW~~xeYS^Ms_^T_6Ds0dE{ni!k&NbgwjCS$^2wRWuXc2#DznJvvU2YtmZ8_1iJ^egV`tTvE
zYQiOw2_!JLMSoyhVr-k*U|rO}T}}*hFohL1McN`*faf7LMM-co7!dC
zfso%(KUUDlYb@|E^zuL{WhU>dLy~a;4s9hEbXSl!TjKZB}u0y>F(WE;*!)r)In?
zU4470f`7WzdfNCX>F_NDL8*eX|K1`6-?RJ^AIhD@!eyUq#a>yK`iL=KTMGru*}oi-
z@XQzh^n03v1?+#BF<9yEuS`T>watB$_gZwwA`;%
zBDFxoLbGS6!-PJlYxqc$Y06k$IYBO-6lJDtGmF6;jv@vMG~0Wr_eDHTskcmJcZ9=I
znm8YTXdKcTjf#LES2%4hqBjV>AyZx1H+kSh=zZlyHjwr!-@dCu1`%6b>I6SzQJ;LFh+$n
z!&!Efkp77W(IIBP45o#fL#leXy7w%?BpLcNLyy!rk5KJ;A>|DY*YFxcQ0fy+P4R8W
z&eYztKOcwK=;M%ulbRtDA~yY+ZEJE_6x;Lja2V!#c_nD&+K(Su(6`#Hbn#l78eVI(
z`MP}QCtM6N5Y0Hqse1A-J9ChuhRZz|S?aDBFtTq3c_w|^GzgJ8zMv7sZVhQe)-7@T
z*xy>lt}M!g%jn&0E3kPudn@2~<&Mb88
z&suq=;b+gRXO+87>lY@D=VEi$_HJdZ;AGjw=yp)&%QGmT@OBw87
z`$w~bSeZl)?jro(|E5z%XhxCX^fRufIhG^|6JZe>#m=PpEk^D?9a2-@bUxr%Ak@c+fSpIy=BK)d5ex}YHSs`G+A9?7oG^0x2ll^X|WA=wyb@$Tq
z_Sh?V9=_eXRS@nzybX0Y@7_41(tcXCJuQ0R)2#1-Vr(lH4Tn50iF?b+v(D0vv+;q$LP__x7NYbp4))=iQ#dcffB4O
zN8tM+wI?;~^lVvQ+-8RX*L-fccfIN0Z7P|Z62{)19`8lzZ|%q6EP}~vOtrk>)~PVL
z=(m<_4f|ZSuJ&Dcvfur0vrG$#%rU10Er>SwkHwWjQIecTW|D%t%t4A
z8dXiFD)kci>9DeviuVB7&ygB3e2@-m{Z$36aOT_Usz*l
z1ZzzVo;V+QT8FML*Wbfg3)pe|v!=~K4#KkEDi+(6P9KU&ejT~t0-MFNOi|M(g0G5baQP{UBRbhBlb0=bYTP{oAAec7yhoF{))BmcCX7)MpU!+r
zhoc460QXTsJw5NeFQj6`@z%9jpHBj@HvL79Mr0+12t#-ZlP+i>9Z3W_OO+}2?)+ZN
z)4!l##7xZ@_(@Np=GuwSS{3UND)vnVQePCQY8+Q+TqkSq--;3*Ka~@HR%ew@KtCt0
zFw?*ZbgObkIT7b(3>*dFwQ(=!?~1+`x7+U15k04ZLrNwKXY4!NLb&;eWVud?#r=s^
zvAu(tef@WV5*D3ByeA|#6ke#@UdTOd6o!IxF1F%F`=p#G*hm~Jo^?L&hcFyjg&~ei
zDzcx9(vk*RqjYKG9qy6K+nuP0;vd`MRN;AS*y$xb6y*1s-AcAW^drveFg>C6?uY_e
zps1%3j%;{4G+=oRBSqYe*KfF!2Yjusx$!;ac~6yx@uL|!@dD1n3MmSmAvyl6Wl>h>
zC`6bkbx4TK+&gZ&Q?%$r*2&}1!I71S6WHD_^HB^510|W+pP}OXA>!phuahRCn`06{
z6~Bgascec`uQ@yrp>E!QJCUQStz}syIlFSH?4IeO#YxjwceYt6R#x|~0$O7%gyQ*m
zP9<%uWlLcy>M?lGITSFOZ>!@+bcqo%iE}pWBB%^CS{pv+{a2e$8~7fPOB?im@bSaC
zQiQq^Gq16&G(tD@tyjq^m@2ng&g)kau`Ep;&NE$4-{3MpCSvAhVg>ZHkfUT!qBLWp
zUFdSN5;Ee|Ar75nY7hlvL-r4pBGwAQEUc2Qa9!;s!f`N;;b#MA*)Wl84OciN;kn_5
znVp*=pZCejtGloDR_g+;@v6W7{5H??y5>+uHdDU{^I&Vp*DAz>HFE->V1=AcQ*gv^
ztf`nbOM*iN5qv4tv3yPdT-%dXkTnA=Yt+8CSjRASA8?09GF-mfQonCd$$)t!^M$PJwZ+{vTP1ki7Iha4k
zGUihe3nknWzgd3;QD3L1u8nirR$XnD@TK0E;ZpX2EZAO2`jYNPzCHRh3T?i(aXG4#5o)~vI-apoiA%`rx_#DCGRW~+E(L~KMYoe}91kqxd~w$$8f8VNe@Iy-cP{Hov_n;&si6NJM8mOQ>KS
zSvQ4apRe*4LTFLW`4kJTI;6F*1OQTo{$gChi~?>g;mSg&`Psy&I0|8$JqHYlhgwXM
zmTE*_KU6Z+5=YyRh{TeIr4Ca^xuGSR=8aXgv}Cltd8!o@_iWnhshFgijUN3fnCxn8
zAN|yN`5G+LlHDdLKw%~-ZuY9PWG3Zh17gUZdM+As{2-mMb47DDg=RC`1;9ToINX9#
zbAx-@<`jiLx~kz>^9+9+*-XvkhR@I!ac(T%5iP|rBpupea+jMrEH|izB_n(qFtg--
zSNZW(@KwkubIqk@V+=(lN(knhpwpVBEl9wxmI1A^*^P8c`4)B&ZAm1qatg0HQDaQf
zm{j}o$s4Y-wSd;C$H!j&rUKAvGQ1bXgEU?V)-?t}CVN>;U#U>sg>%+1T1@m|MgRIO
zfEPHqenM<`L@l%3S=vh%wMkHtRhWIH{`T+<1ZORLe<%)dL3{DQ$xX4@ys-eVXSme&
zUFyKuZp6b(ys_Ihh?YS%MRtoJt-CrJc(#4!HnCXyn%VibSm_O5%?J39)nQzEdn^CO
zYVOqKAn~iZQEu+pmWHs}U^))ReJ$cOge~G=Q4e|V3D~-~`uu;liN^nx5q)QB2rwE?
z{l+4)I3yQDRv8{?5r()fO)+4#+9h--5=hGi1sM%`%=m43OvE+SE;Z_j)h*Za>0^xV
zMmui0Z`|8c0Z<$Wv=e_^uK6WtQk&3K7EUYAUbL~|i+8F-1A8Bg!N1;5^uJLdTS(~lqc}v1
z1&~M$ySuOAhLx3Mp)CakE>~54MRQE*6<^C5pE4EC0l531Cmhdq(c@E#RU^a##jLUX
z5p}ffxC7lp3eYJe+Bn`0EHG&xVD&a2jh)
zw6Y&`9kGozm*W$!U;65-GF_vbbbzNSi67jo}7De?
zZ*6wsHCalr(a?TSVN%Bsu!sAr#t@1pT`B&u2k7c=G#fz5LIq_yY2<|&NbIOgg*QqH
z^;A3)B1>y^=4swjDYZ;xrW5Wfk)}4P3{7AG+G8qu38Qr!w+g%Z
z1Qgse&c6`;qqbuV#g>B!t^Pi|qD~ogiWps6^E6{h^>72{LNH{z^9wEL+Z!{$`4?&7
zFlM4vi{fj1M&R7G>SjKDVQ`iA;OK>wD5Nc-D(FyMpbtbz(q$p3g8?!h-=?4B1Or3i
zXv*bv+9kx`tz{iE%2YG=K~)9)E7EFM8{iVy#ye8&PY@*aj-RH%QJ7}P$-z*>--0=E
z-;ai%$f3k(1XBeT3R+`A!?b2mr2@(@@GnpukhR1KF|NcY@1tF$!92AHm+H}1y0}(F
zpi-_!7!{aSFt_n02?JaZCjNS++zM8
zhY2=d%Uh3@wH}_7#l7W}gI@1d{0H9V@zvFFs1z9so1MFGE)q?JO`Eq;y(9CZjy9@(
zp7lji8BIUX<}9(jNtf@zUK$L(8QDNMv~_GNRg#o5p&)-$Bn2Q0P7H_?tG8?T*D>NQ
zO4>}H#rxS+Yb)Z`sVq1Ac`SnM8@Tceno&iL&}u7FJ5_p-@mlOYrK0EamITBtJCMcX
z*46fMT`!NgCk(VKc+a{8#m1)d!hY3iBKMr;xFhiHKl!)f)}*A~`JP3+?{K)MK;q?*
zefNxR=%lgeHF550o&m6o;d_sGu2rthdH2(E$=v)-V&xNPZ;$gtFnq&YmSwJV!sUrj
zyFgLwZ+SJ4*0;W2Vo7vzEPHPR|2S5noDKfb#e|Hr!vQyy35V
z_VpT*g}{cGY}&Ds47^WlV>Zm(^EOJ)cH}^60ks#OB10B5h}l6%S)!HWh557d>HnG%
z*s~4LXCw^{_}JX&K)YAdnd-yPNTsGz_B21w2Advi5{G5RneKx52>luUerlAhb7i@760o?``b*EKr$gNBZW1~>w$7|Lf244KTziwy)xrW%e~)@%oe
zN`i0mwJM>^bmoSVX^@;5RT70f%0M*Fbk`21WhekX+c;uqj%uLJbHcB{KH9d#CaF9K
z*DxC@=G&%Np!5EISb6^s$Z=}wDx(d*i*w4s04pl#K7D&bw5J{9+~Oju~;dtPU=eqnk`
zekK6h_-7!9lj}3X+Rxg)BO%u&M#4DDt)K;ZK=lTzks*ZKD+C-|1b4VXMuD^u^?XFA
zBlR~);$RkPq;s#=}>pOdC1m{^WoFfN-%IZ10|4cDGVB&IT^91!Km2K
zk&nKv!-Wpv1}a`t4|XzmIXsxGi#gPq>fKWoD7d0?XJcb$@v(zO02!#z_ji74OTGY$
zFFWHm1DUhs20#0@d{w+9-?CS6`2)a>zVA8{*c`L6K}EYyGYfl1-EOvfbHVzv>-p!A
z&-t!JQH!sujGKgINloN}+>XQ*3|Z3xAaN<(6pXHNc)8MS^Ht{c+L=C0a?C$s`1tQ&
za)KHjrOB|8)huDZlQ{bo5smq*W7-(xT_G^Qu9o*Is9C4wAQ`)E=#1`czZFpTjjO+z
zO@1AKFXtwKC~n)uIC#RGcxFbk|N1&$>4JfqlYN~|1W(JKk@J&}C1UpKy_r)OaG*0ZqfBGM~;*%{r1Ar4Gsl0NLd3_$YT^6POdhKu*;p>OLaW)U3O0zVv@
z$?1R_)vipHq^-Shp-MW!(g2{99bgq|sDWuvNfeG>78j6k%3_*>_X)16tEDQ^24`zf
zUyPmakE3Z~fQ|5j;tPojFJH2=8Mm2}1XAFnd|(q>x+~Q$k$B>U(%Og8&^v(Idbcvo
z$Dzx$U<*`;`mQ#bkTb5rzpum^u4vTj@N;Hzbc0o73(%-m>0IsRHghuB<{
z@j#%A^q;O^md6+In<%*>LD9m>mnUOvGSQ~IiX!RFp=n!@um;nqHJhKsxA)u}=O51H
z+(RCp{{IHA`yX`a^HO7gnJe)#b8V5?DT!;&!h31pg@FG=m4YU^*#6F=h%Ur=-?>Rh
z(4kCL-f#>76io%schig3Dn7Gp0
zi=r_CwImefeje1>!v)sO+>&y1qY`2KB$FM$v>WXr@T4}dpyyg%$q1XclXZb=OdchI
z^9l_|kwBB7KN=8+k!1MaJIuIEV_kWCN;tahNK+aDBADs-9AWPRuvB+}M)=&W9bTSe
zr_(Co;3nbVe9LsAecowKqd!f;ZrTFaj43+;iO30FGpVJbjFe!^b_2#?w=6`;QskVK
zB!1A4sW>exht!^|^w|Fzzq&NU5DI3SpmiU)t1N5#^;g<66H+mcWmVMoU`KN;_I1@h$si*W-za^K!B9J_b4qx182T2sZaH)CbLt{wFAfKY2Cw
zC};=%WfzEp4#c$#HFqG4n2b;>CQ1@59nb*R3;2DR^ebU%`oBhkfpYABxE;+*ANnFq
zY8#K0$7J#hijpev9%}D^4pL!p9BG}9jGcV0-<9nWh%Uu7&rkkHy~{AwG4Ra$Qq<4N
zW2UT*4h%<(vH?=@bpWJ^;;VIpf-cZoCXXov&&&YLvS2)3nR!`)JxjQ-htDaNaX{V6%UFAoz(50I
z^WV&J_d3#9*t(PhQtAfo)5BuuTh-Af{_{@sKk{zu?v?4*oKzK@)Q4jMo?<~~(TauI
z-P_Z!%$%BIp@pmrt!~Z3U3gtCC>Q`;)JW0E^#Z{p6Oc@Ds%qUzqbg49!!C@$x|A$N
z*)lSnF&<+e4>DgL(=Vf}Td2^~M6av0E+iTRnR2KcqxF#>N$;sz3)@gJ*!`F=yOl^7
z8u!>T%lH5m?ukgdxD#Xy^`;sK=z($y>XLR7&9<%bE3NHRoj6S7PO?M}p(Fqdm=h))
z9(P?c)Z@-*&jjyjk6e^GP;1*q>!u6=>@+w9!n7O&c`UU+T*t00Er(63Uc%@`_7R-Q
zb_V-~L?_$xx9omf^MgpZIiv5d@Dc?5KU>x9)ufW3DLf8`a
zSrVH~g&ld_E92K3SJwVFExl=DO3@<&jzx+(8#j2(YSPD&V?4_xMcn`^P>e&{o_Jm*
z+oAxA6fJF3w_TdVw!k4c)#cN}fwlL!Q