From 94f2d9a994b9fc756488cf7c4faa9fde66957ebd Mon Sep 17 00:00:00 2001
From: zoldar
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 caf183033..34b5527cc 100644
--- a/Plausible.Cldr.Currency.html
+++ b/Plausible.Cldr.Currency.html
@@ -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 161408001..5053f3a02 100644
--- a/Plausible.Cldr.Locale.html
+++ b/Plausible.Cldr.Locale.html
@@ -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 597a5f30c..7e7b09fd2 100644
--- a/Plausible.Cldr.Number.Cardinal.html
+++ b/Plausible.Cldr.Number.Cardinal.html
@@ -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 8562b6c86..28d08d1f3 100644
--- a/Plausible.Cldr.Number.Format.html
+++ b/Plausible.Cldr.Number.Format.html
@@ -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.Symbol.html b/Plausible.Cldr.Number.Symbol.html
index 4dcc5eb82..85905d329 100644
--- a/Plausible.Cldr.Number.Symbol.html
+++ b/Plausible.Cldr.Number.Symbol.html
@@ -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 085b1fc78..85ce636b6 100644
--- a/Plausible.Cldr.Number.System.html
+++ b/Plausible.Cldr.Number.System.html
@@ -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 b6b53ec63..7135f1b71 100644
--- a/Plausible.Cldr.Number.html
+++ b/Plausible.Cldr.Number.html
@@ -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.ClickhouseRepo.html b/Plausible.ClickhouseRepo.html
index ba4adb8a1..2f7706bf5 100644
--- a/Plausible.ClickhouseRepo.html
+++ b/Plausible.ClickhouseRepo.html
@@ -845,23 +845,23 @@ pool to disconnect within the given interval.
diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html
index 95d109f22..ff9f20d91 100644
--- a/Plausible.DataMigration.Repo.html
+++ b/Plausible.DataMigration.Repo.html
@@ -1162,23 +1162,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.Exports.html b/Plausible.Exports.html
index 467ad19f7..35c7bf415 100644
--- a/Plausible.Exports.html
+++ b/Plausible.Exports.html
@@ -381,7 +381,7 @@ tables into the format of imported_*
tables for a we
-Renders export archive filename.
Examples:
iex> archive_filename("plausible.io", _created_on = ~D[2024-12-31])
+Renders export archive filename.
Examples:
iex> archive_filename("plausible.io", _created_on = ~D[2024-12-31])
"plausible_io_20241231.zip"
@@ -404,10 +404,10 @@ tables into the format of imported_*
tables for a we
-Safely renders content disposition for an arbitrary export filename.
Examples:
iex> content_disposition("plausible_io_20241231.zip")
+Safely renders content disposition for an arbitrary export filename.
Examples:
iex> content_disposition("plausible_io_20241231.zip")
"attachment; filename=\"plausible_io_20241231.zip\""
-iex> content_disposition("📊.zip")
+iex> content_disposition("📊.zip")
"attachment; filename=\"plausible-export.zip\"; filename*=utf-8''%F0%9F%93%8A.zip"
@@ -724,14 +724,14 @@ tables into the format of imported_*
tables for a we
-Creates a streamable Zip archive from the provided (named) Ecto queries.
Example usage:
{:ok, pool} = Ch.start_link(pool_size: 1)
+Creates a streamable Zip archive from the provided (named) Ecto queries.
Example usage:
{:ok, pool} = Ch.start_link(pool_size: 1)
-DBConnection.run(pool, fn conn ->
+DBConnection.run(pool, fn conn ->
conn
- |> stream_archive(export_queries(_site_id = 1), format: "CSVWithNames")
- |> Stream.into(File.stream!("export.zip"))
- |> Stream.run()
-end)
+ |> stream_archive(export_queries(_site_id = 1), format: "CSVWithNames")
+ |> Stream.into(File.stream!("export.zip"))
+ |> Stream.run()
+end)
diff --git a/Plausible.Geo.html b/Plausible.Geo.html
index f3bb2500a..627e1dcde 100644
--- a/Plausible.Geo.html
+++ b/Plausible.Geo.html
@@ -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"
@@ -302,8 +302,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
@@ -332,21 +332,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",
@@ -355,12 +355,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",
@@ -369,20 +369,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",
@@ -391,13 +391,13 @@ asynchronously."pt-BR" => "EUA",
"ru" => "США",
"zh-CN" => "美国"
- }
- },
- "subdivisions" => [
- %{
+ }
+ },
+ "subdivisions" => [
+ %{
"geoname_id" => 5332921,
"iso_code" => "CA",
- "names" => %{
+ "names" => %{
"de" => "Kalifornien",
"en" => "California",
"es" => "California",
@@ -406,10 +406,10 @@ asynchronously."pt-BR" => "Califórnia",
"ru" => "Калифорния",
"zh-CN" => "加州"
- }
- }
- ]
-}
+ }
+ }
+ ]
+}
diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html
index b67781885..8bb8ad016 100644
--- a/Plausible.ImportDeletionRepo.html
+++ b/Plausible.ImportDeletionRepo.html
@@ -1153,23 +1153,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.CSVImporter.html b/Plausible.Imported.CSVImporter.html
index d96ac6871..5f89cfe58 100644
--- a/Plausible.Imported.CSVImporter.html
+++ b/Plausible.Imported.CSVImporter.html
@@ -257,13 +257,13 @@ or from local storage for which it uses iex> date_range([
-...> %{"filename" => "imported_devices_20190101_20210101.csv"},
+Extracts min/max date range from a list of uploads.
Examples:
iex> date_range([
+...> %{"filename" => "imported_devices_20190101_20210101.csv"},
...> "pages_20200101_20220101.csv"
-...> ])
-Date.range(~D[2019-01-01], ~D[2022-01-01])
+...> ])
+Date.range(~D[2019-01-01], ~D[2022-01-01])
-iex> date_range([])
+iex> date_range([])
nil
@@ -292,13 +292,13 @@ or from local storage for which it uses iex> extract_table("my_data.csv")
+Extracts the table name from the provided filename.
Raises if the filename doesn't conform to the expected format.
Examples:
iex> extract_table("my_data.csv")
** (ArgumentError) invalid filename
-iex> extract_table("imported_devices_00010101_20250101.csv")
+iex> extract_table("imported_devices_00010101_20250101.csv")
"imported_devices"
-iex> extract_table("devices_00010101_20250101.csv")
+iex> extract_table("devices_00010101_20250101.csv")
"imported_devices"
@@ -321,8 +321,8 @@ or from local storage for which it uses
-Returns local directory for CSV imports storage.
Builds upon $PERSISTENT_CACHE_DIR
(if set) and falls back to /tmp
Examples:
iex> local_dir = local_dir(_site_id = 37)
-iex> String.ends_with?(local_dir, "/plausible-imports/37")
+Returns local directory for CSV imports storage.
Builds upon $PERSISTENT_CACHE_DIR
(if set) and falls back to /tmp
Examples:
iex> local_dir = local_dir(_site_id = 37)
+iex> String.ends_with?(local_dir, "/plausible-imports/37")
true
@@ -382,14 +382,14 @@ or from local storage for which it uses iex> parse_filename!("my_data.csv")
+Extracts table name and min/max dates from the filename.
Examples:
iex> parse_filename!("my_data.csv")
** (ArgumentError) invalid filename
-iex> parse_filename!("imported_devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("imported_devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
-iex> parse_filename!("devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
@@ -417,13 +417,13 @@ or from local storage for which it uses iex> valid_filename?("my_data.csv")
+Checks if the provided filename conforms to the expected format.
Examples:
iex> valid_filename?("my_data.csv")
false
-iex> valid_filename?("imported_devices_00010101_20250101.csv")
+iex> valid_filename?("imported_devices_00010101_20250101.csv")
true
-iex> valid_filename?("devices_00010101_20250101.csv")
+iex> valid_filename?("devices_00010101_20250101.csv")
true
diff --git a/Plausible.Imported.Importer.html b/Plausible.Imported.Importer.html
index 8e8477f51..92950d708 100644
--- a/Plausible.Imported.Importer.html
+++ b/Plausible.Imported.Importer.html
@@ -183,30 +183,30 @@ scope of importer logic and is expected to be implemented separately.
In case it's necessary to run the whole import job fully synchronously, the
Plausible.Workers.ImportAnalytics
worker sends an Oban.Notifier
message
-on completion, failure or transient failure of the import.
A basic usage scenario looks like this:
{:ok, job} = Plausible.Imported.NoopImporter.new_import(
+on completion, failure or transient failure of the import.A basic usage scenario looks like this:
{:ok, job} = Plausible.Imported.NoopImporter.new_import(
site,
user,
start_date: ~D[2005-01-01],
- end_date: Date.utc_today(),
+ end_date: Date.utc_today(),
# this option is necessary to setup the calling process as listener
listen?: true
-)
+)
-import_id = job.args[:import_id]
+import_id = job.args[:import_id]
-receive do
- {:notification, :analytics_imports_jobs, %{"event" => "complete", "import_id" => ^import_id}} ->
- IO.puts("Job completed")
+receive do
+ {:notification, :analytics_imports_jobs, %{"event" => "complete", "import_id" => ^import_id}} ->
+ IO.puts("Job completed")
- {:notification, :analytics_imports_jobs, %{"event" => "transient_fail", "import_id" => ^import_id}} ->
- IO.puts("Job failed transiently")
+ {:notification, :analytics_imports_jobs, %{"event" => "transient_fail", "import_id" => ^import_id}} ->
+ IO.puts("Job failed transiently")
- {:notification, :analytics_imports_jobs, %{"event" => "fail", "import_id" => ^import_id}} ->
- IO.puts("Job failed permanently")
-after
+ {:notification, :analytics_imports_jobs, %{"event" => "fail", "import_id" => ^import_id}} ->
+ IO.puts("Job failed permanently")
+after
15_000 ->
- IO.puts("Job didn't finish in 15 seconds")
-end
In a more realistic scenario, job scheduling will be done inside a GenServer process
+
IO.puts("Job didn't finish in 15 seconds")
+end
In a more realistic scenario, job scheduling will be done inside a GenServer process
like LiveView, where notifications can be listened for via handle_info/2
.
diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html
index 7dbcf0d91..c3fb824fa 100644
--- a/Plausible.IngestRepo.html
+++ b/Plausible.IngestRepo.html
@@ -1153,23 +1153,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.S3.html b/Plausible.S3.html
index 97672d95e..233a31f85 100644
--- a/Plausible.S3.html
+++ b/Plausible.S3.html
@@ -316,7 +316,7 @@ The URL expires in 300 seconds, which should be enough for a redirect.
In
Returns the pre-configured S3 bucket for CSV exports.
config :plausible, Plausible.S3,
- exports_bucket: System.fetch_env!("S3_EXPORTS_BUCKET")
Example:
iex> exports_bucket()
+ exports_bucket: System.fetch_env!("S3_EXPORTS_BUCKET")
Example:
iex> exports_bucket()
"test-exports"
@@ -348,8 +348,8 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
-
Returns access_key_id
and secret_access_key
to be used by ClickHouse during imports from S3.
Example:
iex> import_clickhouse_credentials()
-%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
+Returns access_key_id
and secret_access_key
to be used by ClickHouse during imports from S3.
Example:
iex> import_clickhouse_credentials()
+%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
@@ -371,9 +371,9 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
-Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> upload = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
-iex> true = String.ends_with?(upload.s3_url, "/test-imports/123/imported_browsers.csv")
-iex> true = String.contains?(upload.presigned_url, "/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&")
+Presigns an upload for an imported file.
In the current implementation the bucket always goes into the path component.
Example:
iex> upload = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
+iex> true = String.ends_with?(upload.s3_url, "/test-imports/123/imported_browsers.csv")
+iex> true = String.contains?(upload.presigned_url, "/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&")
@@ -402,7 +402,7 @@ The URL expires in 300 seconds, which should be enough for a redirect.In
Returns the pre-configured S3 bucket for CSV imports.
config :plausible, Plausible.S3,
- imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")
Example:
iex> imports_bucket()
+ imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")
Example:
iex> imports_bucket()
"test-imports"
diff --git a/Plausible.Stats.Filters.html b/Plausible.Stats.Filters.html
index d2a8fc532..9121632f5 100644
--- a/Plausible.Stats.Filters.html
+++ b/Plausible.Stats.Filters.html
@@ -283,14 +283,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.epub b/Plausible.epub
index 064aef9fde3b518c4653ad0168da60aabcd472b4..509ba619d304e466aa15d2d8cb82998cd5cd99d3 100644
GIT binary patch
delta 138196
zcmY&fby$>5v}cR%knWJ~E(t;DmImqW&IJjjlwP_)q>)%aTImkyZb=a&1um}Nz0Y&^
zpZUFK&YYOpcjuflvy&sN{UfZH>PjFmA=2MZlR^TfFtACXRz4T-*wpO;K9T%w6Uh$o
z|F$6aX1aVyO-?mUn1`VxAp+xVAs|_|R=~#gUdUO@$_>us5&TOh^*{&o%e0lU-
z^(Bfr{ZJJ<o5*pk?}c-|TbWu{`&j!Gu)|i&c<=Z^jX9`PD`>gD$SYP=Ks`PqS`|gJ7)mv5m6ob=RWPK8
zo^Peqgb%5vX@<&pX5w-(X`k)7Ph=*GIL|-@8L8HF)xGJfQ;#+r_SN@-b;7%+TS_V-
z%JZdYZ`gC2j}@m)Lb~}F{q7UX8qW{Anc2_YUe`wyqUQ62!xPI?cyOsCCP_*g)}`lDvVqHcs}sENo+b#
zBVA75qp4A51}iM8stjptPrV7hie#yyr?;=(_bdT_y$bL4vPcFhP`bpp
zJWh|d2V>QP0J${b`)A6ZT?NM_-}Rf_zT&yf;A{!?W>xUG%l&C*
zkm@9Yh^62|@_8I#gj-|$P-TG41-7TJ=koGGav;VO6shiq$~TI?uY9%rbL7A6Z&xVf
zZ|m(nhWIIX5nv4Z`&<&tj`Fviju=He7eyhX{e7-T96P=`p}bkKng}e(#3`)
zBmfv;KdAwz@E`_&FoF-x41gklFbBX20djc&FA!i)0Kkp_PecJ;2oNU;a7O@uEWi^1
zd|m*85a2=y@D2e&)c+F*&;jTmD0=#U3Sr_{>F-LzBN6~Z2#RJZp#7hmhb|MT$j7O{Btoq9<2piMlG5l{u#Z3h9{g42
zf1b?d0#Xq|T?zp!2%z>6K>hd22Y0Olh$4hmzyX~I;M@ub`KP!OApK8GP>ZJI;iI`=
z0@%-@M{`|20?=W3vgjzVoB;qT4Ey;bdOHWgf=P7&!0?D3z&1jO;{f0*LK4p?AO->2
zCjnA_LE|hy4ncUa_}|L3uL7J96ppR`)⁡xIl=hJ_JM{x&%)Fu?X<(_kRoW`Uap5
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