diff --git a/.github/workflows/integrity-check.yml b/.github/workflows/integrity-check.yml
index f97a3694..8b9716ac 100644
--- a/.github/workflows/integrity-check.yml
+++ b/.github/workflows/integrity-check.yml
@@ -20,8 +20,12 @@ jobs:
python3 -m pip install --upgrade pipenv
pipenv install
- - name: Validate
+ - name: Validate regular & extended decks
run: |
pipenv run build
+ - name: Validate experimental deck
+ run: |
+ pipenv run build_experimental
+
# TODO: Validate the csv file structure
diff --git a/LICENSE.md b/LICENSE.md
index d95ae33b..6f656adc 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -46,3 +46,7 @@ The sources and licenses of the flags (`ug-flag-...`) and maps (`ug-map-...`) in
`sources.csv` references only the licenses of the files themselves. Some flags, like the [European Union flag](https://www.coe.int/en/web/about-us/the-european-flag#column-5), may come with additional copyright restrictions.
All images have been optimised, resized and/or converted to reduce file size. Any further modifications are listed in the _Modifications_ column.
+
+## jsvectormap
+
+[MIT License — Copyright (c) 2020 Mustafa Omar](https://github.com/themustafaomar/jsvectormap/blob/main/LICENSE)
diff --git a/Pipfile b/Pipfile
index c53ea083..95594bad 100644
--- a/Pipfile
+++ b/Pipfile
@@ -13,3 +13,4 @@ python_version = "3.7"
[scripts]
build = "brain_brew run recipes/source_to_anki.yaml"
+build_experimental = "brain_brew run recipes/source_to_anki_[experimental].yaml"
diff --git a/README.md b/README.md
index aadd299e..7899c592 100644
--- a/README.md
+++ b/README.md
@@ -31,7 +31,7 @@ The deck is available in **English**, **German**, **Spanish**, **French**, **Nor
## Features
-The standard version of the deck comes with four note templates: _Country - Capital_, _Capital - Country_, _Flag - Country_, and _Map - Country_. An **extended version** is also available, with two additional note templates: _Country - Flag_ and _Country - Map_.
+The standard version of the deck comes with four note templates: _Country - Capital_, _Capital - Country_, _Flag - Country_, and _Map - Country_. An **extended version** is also available, with two additional note templates: _Country - Flag_ and _Country - Map_. The [experimental version](https://github.com/anki-geo/ultimate-geography/wiki/Experimental-extended-deck) is a clone of extended version except it also provides interactivity for the _Country - Map_ note template.
Flag - Country |
@@ -103,9 +103,10 @@ In order to install and later upgrade _Ultimate Geography_, you'll need to first
You're now ready to install _Ultimate Geography_:
1. Go to the **[_Releases_ page](https://github.com/anki-geo/ultimate-geography/releases)**.
-1. In the latest release's _Assets_ section, download the ZIP archive of the version of the deck you'd like to use. You can choose between [a standard and an extended version](#features) in a number of [languages](#ultimate-geography) -- for instance, if you're after the standard German deck, download `Ultimate_Geography_v[...]_DE.zip`.
+1. In the latest release's _Assets_ section, download the ZIP archive of the version of the deck you'd like to use. You can choose between [a standard, extended and experimental version](#features) in a number of [languages](#ultimate-geography) -- for instance, if you're after the standard German deck, download `Ultimate_Geography_v[...]_DE.zip`.
1. Extract the content of the archive on your computer.
1. Open Anki and make sure your devices are all synchronised.
+1. Create [a manual backup](https://docs.ankiweb.net/backups.html#creating) via _File -> Create Backup_ in case something goes wrong.
1. In the _File_ menu, select _CrowdAnki: Import from disk_.
1. Browse for and select the folder you extracted from the archive, which contains the deck's JSON file and `media` folder -- e.g. `Ultimate Geography [DE]`.
1. Don't change anything in the _CrowdAnki Import Settings_ dialog box that opens -- just press _OK_ to start the import. A dialog box should then confirm that the import was successful.
diff --git a/recipes/source_to_anki.yaml b/recipes/source_to_anki.yaml
index c8850704..98a85a2d 100644
--- a/recipes/source_to_anki.yaml
+++ b/recipes/source_to_anki.yaml
@@ -51,8 +51,11 @@
name: Ultimate Geography [ZH]
- media_group_from_folder:
- - part_id: all_media
- source: src/media
+ - part_id: maps
+ source: src/media/maps
+ recursive: true
+ - part_id: flags
+ source: src/media/flags
recursive: true
@@ -361,7 +364,7 @@
<<: &default_crowd_anki_gen
headers: default header
media:
- parts: [all_media]
+ parts: [maps, flags]
note_models:
parts:
- part_id: Ultimate Geography
@@ -443,7 +446,7 @@
<<: &extended_deck
headers: default header
media:
- parts: [ all_media ]
+ parts: [ maps, flags ]
note_models:
parts:
- part_id: Ultimate Geography [Extended]
diff --git a/recipes/source_to_anki_[experimental].yaml b/recipes/source_to_anki_[experimental].yaml
new file mode 100644
index 00000000..c67414fc
--- /dev/null
+++ b/recipes/source_to_anki_[experimental].yaml
@@ -0,0 +1,433 @@
+- generate_guids_in_csv:
+ source: src/data/guid.csv
+ columns:
+ - guid
+ - guid:de
+ - guid:es
+ - guid:fr
+ - guid:nb
+ - guid:cs
+ - guid:ru
+ - guid:nl
+ - guid:sv
+ - guid:pt
+ - guid:zh
+ - guid:pl
+ - guid:it
+ - guid:da
+
+- build_parts:
+ - note_model_from_yaml_part:
+ part_id: Ultimate Geography [Experimental]
+ file: src/note_models/Ultimate_Geography_[Experimental].yaml
+
+ - headers_from_yaml_part:
+ - part_id: default header
+ file: src/headers/default.yaml
+ override:
+ deck_description_html_file: src/headers/desc.html
+ crowdanki_uuid: 43c5ba66-9a65-11e8-90c9-a0481cc15658
+ name: Ultimate Geography
+ - part_id: default header:es
+ file: src/headers/default.yaml
+ override:
+ deck_description_html_file: src/headers/desc_es.html
+ crowdanki_uuid: cb4d32ee-12ed-9960-1841-28c09449ded0
+ name: Ultimate Geography [ES]
+ - part_id: default header:sv
+ file: src/headers/default.yaml
+ override:
+ deck_description_html_file: src/headers/desc_sv.html
+ crowdanki_uuid: 75bfcdb5-0ff3-4038-83cb-3e6ed974f439
+ name: Ultimate Geography [SV]
+ - part_id: default header:zh
+ file: src/headers/default.yaml
+ override:
+ deck_description_html_file: src/headers/desc_zh.html
+ crowdanki_uuid: 6c995ee1-4b62-4019-a033-de0ef8651c83
+ name: Ultimate Geography [ZH]
+
+ - media_group_from_folder:
+ - part_id: maps
+ source: src/media/maps
+ recursive: true
+ - part_id: flags
+ source: src/media/flags
+ recursive: true
+ - part_id: experimental_assets
+ source: src/media/experimental_assets
+
+ - notes_from_csvs:
+ part_id: english
+
+ note_model_mappings:
+ - note_models: ¬e_models_in_mapping
+ - Ultimate Geography [Experimental]
+ columns_to_fields:
+ <<: &default_columns_to_fields
+ flag: Flag
+ map: Map
+ region code: Region code
+ tags: tags
+
+ guid : guid
+ country : Country
+ country info : Country info
+ capital : Capital
+ capital info : Capital info
+ capital hint : Capital hint
+ flag similarity : Flag similarity
+
+ personal_fields: [ ]
+
+ file_mappings: &file_mappings
+ - file: src/data/main.csv
+ note_model: Ultimate Geography [Experimental]
+ derivatives:
+ - file: src/data/guid.csv
+ - file: src/data/country.csv
+ - file: src/data/country_info.csv
+ - file: src/data/capital.csv
+ - file: src/data/capital_info.csv
+ - file: src/data/capital_hint.csv
+ - file: src/data/flag_similarity.csv
+
+ - notes_from_csvs:
+ part_id: german
+
+ note_model_mappings:
+ - note_models: *note_models_in_mapping
+ columns_to_fields:
+ <<: *default_columns_to_fields
+
+ guid:de : guid
+ country:de : Country
+ country info:de : Country info
+ capital:de : Capital
+ capital info:de : Capital info
+ capital hint:de : Capital hint
+ flag similarity:de : Flag similarity
+
+ personal_fields: [ ]
+
+ file_mappings: *file_mappings
+ - notes_from_csvs:
+ part_id: spanish
+
+ note_model_mappings:
+ - note_models: *note_models_in_mapping
+ columns_to_fields:
+ <<: *default_columns_to_fields
+
+ guid:es : guid
+ country:es : Country
+ country info:es : Country info
+ capital:es : Capital
+ capital info:es : Capital info
+ capital hint:es : Capital hint
+ flag similarity:es : Flag similarity
+
+ personal_fields: [ ]
+
+ file_mappings: *file_mappings
+
+ - notes_from_csvs:
+ part_id: french
+
+ note_model_mappings:
+ - note_models: *note_models_in_mapping
+ columns_to_fields:
+ <<: *default_columns_to_fields
+
+ guid:fr : guid
+ country:fr : Country
+ country info:fr : Country info
+ capital:fr : Capital
+ capital info:fr : Capital info
+ capital hint:fr : Capital hint
+ flag similarity:fr : Flag similarity
+
+ personal_fields: [ ]
+
+ file_mappings: *file_mappings
+
+ - notes_from_csvs:
+ part_id: norwegian
+
+ note_model_mappings:
+ - note_models: *note_models_in_mapping
+ columns_to_fields:
+ <<: *default_columns_to_fields
+
+ guid:nb : guid
+ country:nb : Country
+ country info:nb : Country info
+ capital:nb : Capital
+ capital info:nb : Capital info
+ capital hint:nb : Capital hint
+ flag similarity:nb : Flag similarity
+
+ personal_fields: [ ]
+
+ file_mappings: *file_mappings
+
+ - notes_from_csvs:
+ part_id: czech
+
+ note_model_mappings:
+ - note_models: *note_models_in_mapping
+ columns_to_fields:
+ <<: *default_columns_to_fields
+
+ guid:cs : guid
+ country:cs : Country
+ country info:cs : Country info
+ capital:cs : Capital
+ capital info:cs : Capital info
+ capital hint:cs : Capital hint
+ flag similarity:cs : Flag similarity
+
+ personal_fields: [ ]
+
+ file_mappings: *file_mappings
+
+ - notes_from_csvs:
+ part_id: russian
+
+ note_model_mappings:
+ - note_models: *note_models_in_mapping
+ columns_to_fields:
+ <<: *default_columns_to_fields
+
+ guid:ru : guid
+ country:ru : Country
+ country info:ru : Country info
+ capital:ru : Capital
+ capital info:ru : Capital info
+ capital hint:ru : Capital hint
+ flag similarity:ru : Flag similarity
+
+ personal_fields: [ ]
+
+ file_mappings: *file_mappings
+
+ - notes_from_csvs:
+ part_id: dutch
+
+ note_model_mappings:
+ - note_models: *note_models_in_mapping
+ columns_to_fields:
+ <<: *default_columns_to_fields
+
+ guid:nl : guid
+ country:nl : Country
+ country info:nl : Country info
+ capital:nl : Capital
+ capital info:nl : Capital info
+ capital hint:nl : Capital hint
+ flag similarity:nl : Flag similarity
+
+ personal_fields: [ ]
+
+ file_mappings: *file_mappings
+
+ - notes_from_csvs:
+ part_id: swedish
+
+ note_model_mappings:
+ - note_models: *note_models_in_mapping
+ columns_to_fields:
+ <<: *default_columns_to_fields
+
+ guid:sv : guid
+ country:sv : Country
+ country info:sv : Country info
+ capital:sv : Capital
+ capital info:sv : Capital info
+ capital hint:sv : Capital hint
+ flag similarity:sv : Flag similarity
+
+ personal_fields: [ ]
+
+ file_mappings: *file_mappings
+
+ - notes_from_csvs:
+ part_id: portuguese
+
+ note_model_mappings:
+ - note_models: *note_models_in_mapping
+ columns_to_fields:
+ <<: *default_columns_to_fields
+
+ guid:pt : guid
+ country:pt : Country
+ country info:pt : Country info
+ capital:pt : Capital
+ capital info:pt : Capital info
+ capital hint:pt : Capital hint
+ flag similarity:pt : Flag similarity
+
+ personal_fields: [ ]
+
+ file_mappings: *file_mappings
+
+ - notes_from_csvs:
+ part_id: chinese
+
+ note_model_mappings:
+ - note_models: *note_models_in_mapping
+ columns_to_fields:
+ <<: *default_columns_to_fields
+
+ guid:zh : guid
+ country:zh : Country
+ country info:zh : Country info
+ capital:zh : Capital
+ capital info:zh : Capital info
+ capital hint:zh : Capital hint
+ flag similarity:zh : Flag similarity
+
+ personal_fields: [ ]
+
+ file_mappings: *file_mappings
+
+ - notes_from_csvs:
+ part_id: polish
+
+ note_model_mappings:
+ - note_models: *note_models_in_mapping
+ columns_to_fields:
+ <<: *default_columns_to_fields
+
+ guid:pl : guid
+ country:pl : Country
+ country info:pl : Country info
+ capital:pl : Capital
+ capital info:pl : Capital info
+ capital hint:pl : Capital hint
+ flag similarity:pl : Flag similarity
+
+ personal_fields: [ ]
+
+ file_mappings: *file_mappings
+
+ - notes_from_csvs:
+ part_id: italian
+
+ note_model_mappings:
+ - note_models: *note_models_in_mapping
+ columns_to_fields:
+ <<: *default_columns_to_fields
+
+ guid:it : guid
+ country:it : Country
+ country info:it : Country info
+ capital:it : Capital
+ capital info:it : Capital info
+ capital hint:it : Capital hint
+ flag similarity:it : Flag similarity
+
+ personal_fields: [ ]
+
+ file_mappings: *file_mappings
+
+ - notes_from_csvs:
+ part_id: danish
+
+ note_model_mappings:
+ - note_models: *note_models_in_mapping
+ columns_to_fields:
+ <<: *default_columns_to_fields
+
+ guid:da : guid
+ country:da : Country
+ country info:da : Country info
+ capital:da : Capital
+ capital info:da : Capital info
+ capital hint:da : Capital hint
+ flag similarity:da : Flag similarity
+
+ personal_fields: [ ]
+
+ file_mappings: *file_mappings
+
+
+- generate_crowd_anki:
+ <<: &extended_deck
+ headers: default header
+ media:
+ parts: [ maps, flags, experimental_assets ]
+ note_models:
+ parts:
+ - part_id: Ultimate Geography [Experimental]
+
+ folder: build/Ultimate Geography [EN] [Experimental]
+ notes:
+ part_id: english
+- generate_crowd_anki:
+ <<: *extended_deck
+ folder: build/Ultimate Geography [DE] [Experimental]
+ notes:
+ part_id: german
+- generate_crowd_anki:
+ <<: *extended_deck
+ headers: default header:es
+ folder: build/Ultimate Geography [ES] [Experimental]
+ notes:
+ part_id: spanish
+- generate_crowd_anki:
+ <<: *extended_deck
+ folder: build/Ultimate Geography [FR] [Experimental]
+ notes:
+ part_id: french
+- generate_crowd_anki:
+ <<: *extended_deck
+ folder: build/Ultimate Geography [NB] [Experimental]
+ notes:
+ part_id: norwegian
+- generate_crowd_anki:
+ <<: *extended_deck
+ folder: build/Ultimate Geography [CS] [Experimental]
+ notes:
+ part_id: czech
+- generate_crowd_anki:
+ <<: *extended_deck
+ folder: build/Ultimate Geography [RU] [Experimental]
+ notes:
+ part_id: russian
+- generate_crowd_anki:
+ <<: *extended_deck
+ folder: build/Ultimate Geography [NL] [Experimental]
+ notes:
+ part_id: dutch
+- generate_crowd_anki:
+ <<: *extended_deck
+ folder: build/Ultimate Geography [SV] [Experimental]
+ notes:
+ part_id: swedish
+- generate_crowd_anki:
+ <<: *extended_deck
+ folder: build/Ultimate Geography [PT] [Experimental]
+ notes:
+ part_id: portuguese
+- generate_crowd_anki:
+ <<: *extended_deck
+ headers: default header:zh
+ folder: build/Ultimate Geography [ZH] [Experimental]
+ notes:
+ part_id: chinese
+- generate_crowd_anki:
+ <<: *extended_deck
+ folder: build/Ultimate Geography [PL] [Experimental]
+ notes:
+ part_id: polish
+- generate_crowd_anki:
+ <<: *extended_deck
+ folder: build/Ultimate Geography [IT] [Experimental]
+ notes:
+ part_id: italian
+- generate_crowd_anki:
+ <<: *extended_deck
+ folder: build/Ultimate Geography [DA] [Experimental]
+ notes:
+ part_id: danish
diff --git a/src/data/main.csv b/src/data/main.csv
index 29db1a9d..9bddb262 100644
--- a/src/data/main.csv
+++ b/src/data/main.csv
@@ -1,320 +1,320 @@
-country,flag,map,tags
-England,"","",UG::Europe
-Scotland,"","",UG::Europe
-United Kingdom,"","","UG::Europe, UG::Sovereign_State"
-Northern Ireland,,"",UG::Europe
-France,"","","UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State"
-Wales,"","",UG::Europe
-Georgia,"","","UG::Europe, UG::Sovereign_State"
-Germany,"","","UG::Europe, UG::European_Union, UG::Sovereign_State"
-Greece,"","","UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State"
-Greenland,"","",UG::North_America
-Hungary,"","","UG::Europe, UG::European_Union, UG::Sovereign_State"
-Albania,"","","UG::Europe, UG::Mediterranean, UG::Sovereign_State"
-Andorra,"","","UG::Europe, UG::Sovereign_State"
-Austria,"","","UG::Europe, UG::European_Union, UG::Sovereign_State"
-Azerbaijan,"","","UG::Europe, UG::Sovereign_State"
-Belarus,"","","UG::Europe, UG::Sovereign_State"
-Belgium,"","","UG::Europe, UG::European_Union, UG::Sovereign_State"
-Bosnia and Herzegovina,"","","UG::Europe, UG::Mediterranean, UG::Sovereign_State"
-Bulgaria,"","","UG::Europe, UG::European_Union, UG::Sovereign_State"
-Croatia,"","","UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State"
-Czech Republic,"","","UG::Europe, UG::European_Union, UG::Sovereign_State"
-Denmark,"","","UG::Europe, UG::European_Union, UG::Sovereign_State"
-Estonia,"","","UG::Europe, UG::European_Union, UG::Sovereign_State"
-Faroe Islands,"","",UG::Europe
-Finland,"","","UG::Europe, UG::European_Union, UG::Sovereign_State"
-Iceland,"","","UG::Europe, UG::Sovereign_State"
-Ireland,"","","UG::Europe, UG::European_Union, UG::Sovereign_State"
-Italy,"","","UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State"
-Latvia,"","","UG::Europe, UG::European_Union, UG::Sovereign_State"
-Liechtenstein,"","","UG::Europe, UG::Sovereign_State"
-Lithuania,"","","UG::Europe, UG::European_Union, UG::Sovereign_State"
-Luxembourg,"","","UG::Europe, UG::European_Union, UG::Sovereign_State"
-North Macedonia,"","","UG::Europe, UG::Sovereign_State"
-Malta,"","","UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State"
-Moldova,"","","UG::Europe, UG::Sovereign_State"
-Monaco,"","","UG::Europe, UG::Mediterranean, UG::Sovereign_State"
-Montenegro,"","","UG::Europe, UG::Mediterranean, UG::Sovereign_State"
-Netherlands,"","","UG::Europe, UG::European_Union, UG::Sovereign_State"
-Norway,"","","UG::Europe, UG::Sovereign_State"
-Poland,"","","UG::Europe, UG::European_Union, UG::Sovereign_State"
-Portugal,"","","UG::Europe, UG::European_Union, UG::Sovereign_State"
-Romania,"","","UG::Europe, UG::European_Union, UG::Sovereign_State"
-Russia,"","","UG::Europe, UG::Sovereign_State"
-San Marino,"","","UG::Europe, UG::Sovereign_State"
-Serbia,"","","UG::Europe, UG::Sovereign_State"
-Slovakia,"","","UG::Europe, UG::European_Union, UG::Sovereign_State"
-Slovenia,"","","UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State"
-Spain,"","","UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State"
-Sweden,"","","UG::Europe, UG::European_Union, UG::Sovereign_State"
-Switzerland,"","","UG::Europe, UG::Sovereign_State"
-Turkey,"","","UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State"
-Ukraine,"","","UG::Europe, UG::Sovereign_State"
-Vatican City,"","","UG::Europe, UG::Sovereign_State"
-Armenia,"","","UG::Europe, UG::Sovereign_State"
-Cyprus,"","","UG::Asia, UG::European_Union, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State"
-Kazakhstan,"","","UG::Asia, UG::Sovereign_State"
-Egypt,"","","UG::Africa, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State"
-Algeria,"","","UG::Africa, UG::Mediterranean, UG::Sovereign_State"
-Angola,"","","UG::Africa, UG::Sovereign_State"
-Benin,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa"
-Botswana,"","","UG::Africa, UG::Sovereign_State"
-Burkina Faso,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa"
-Cameroon,"","","UG::Africa, UG::Sovereign_State"
-Burundi,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State"
-Cape Verde,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa"
-São Tomé and Príncipe,"","","UG::Africa, UG::Sovereign_State"
-Central African Republic,"","","UG::Africa, UG::Sovereign_State"
-Chad,"","","UG::Africa, UG::Sovereign_State"
-Equatorial Guinea,"","","UG::Africa, UG::Sovereign_State"
-Kenya,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State"
-Comoros,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State"
-Ivory Coast,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa"
-Democratic Republic of the Congo,"","","UG::Africa, UG::Sovereign_State"
-Djibouti,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State"
-Guinea-Bissau,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa"
-Eritrea,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State"
-Ethiopia,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State"
-Gabon,"","","UG::Africa, UG::Sovereign_State"
-The Gambia,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa"
-Lesotho,"","","UG::Africa, UG::Sovereign_State"
-Liberia,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa"
-Madagascar,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State"
-Malawi,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State"
-Mali,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa"
-Mauritania,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa"
-Mauritius,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State"
-Morocco,"","","UG::Africa, UG::Mediterranean, UG::Sovereign_State"
-Mozambique,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State"
-Namibia,"","","UG::Africa, UG::Sovereign_State"
-Niger,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa"
-Nigeria,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa"
-Republic of the Congo,"","","UG::Africa, UG::Sovereign_State"
-Rwanda,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State"
-Senegal,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa"
-Seychelles,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State"
-Sierra Leone,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa"
-South Africa,"","","UG::Africa, UG::Sovereign_State"
-Sudan,"","","UG::Africa, UG::Sovereign_State"
-Eswatini,"","","UG::Africa, UG::Sovereign_State"
-Tanzania,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State"
-Togo,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa"
-Tunisia,"","","UG::Africa, UG::Mediterranean, UG::Sovereign_State"
-Uganda,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State"
-Sahrawi Arab Democratic Republic,"","","UG::Africa, UG::Sovereign_State"
-Zambia,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State"
-Zimbabwe,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State"
-Canary Islands,,"",UG::Africa
-Afghanistan,"","","UG::Asia, UG::Sovereign_State"
-Bahrain,"","","UG::Asia, UG::Middle_East, UG::Sovereign_State"
-Bangladesh,"","","UG::Asia, UG::Sovereign_State"
-Bhutan,"","","UG::Asia, UG::Sovereign_State"
-Brunei,"","","UG::Asia, UG::Southeast_Asia, UG::Sovereign_State"
-China,"","","UG::Asia, UG::Sovereign_State"
-Cambodia,"","","UG::Asia, UG::Southeast_Asia, UG::Sovereign_State"
-Indonesia,"","","UG::Asia, UG::Southeast_Asia, UG::Sovereign_State"
-India,"","","UG::Asia, UG::Sovereign_State"
-Hong Kong,"","",UG::Asia
-Iran,"","","UG::Asia, UG::Middle_East, UG::Sovereign_State"
-Israel,"","","UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State"
-Iraq,"","","UG::Asia, UG::Middle_East, UG::Sovereign_State"
-South Korea,"","","UG::Asia, UG::Sovereign_State"
-North Korea,"","","UG::Asia, UG::Sovereign_State"
-Jordan,"","","UG::Asia, UG::Middle_East, UG::Sovereign_State"
-Japan,"","","UG::Asia, UG::Sovereign_State"
-Lebanon,"","","UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State"
-Laos,"","","UG::Asia, UG::Southeast_Asia, UG::Sovereign_State"
-Kyrgyzstan,"","","UG::Asia, UG::Sovereign_State"
-Kuwait,"","","UG::Asia, UG::Middle_East, UG::Sovereign_State"
-Myanmar,"","","UG::Asia, UG::Southeast_Asia, UG::Sovereign_State"
-Mongolia,"","","UG::Asia, UG::Sovereign_State"
-Maldives,"","","UG::Asia, UG::Sovereign_State"
-Malaysia,"","","UG::Asia, UG::Southeast_Asia, UG::Sovereign_State"
-Oman,"","","UG::Asia, UG::Middle_East, UG::Sovereign_State"
-Nepal,"","","UG::Asia, UG::Sovereign_State"
-Palestine,"","","UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State"
-Pakistan,"","","UG::Asia, UG::Sovereign_State"
-Qatar,"","","UG::Asia, UG::Middle_East, UG::Sovereign_State"
-Saudi Arabia,"","","UG::Asia, UG::Middle_East, UG::Sovereign_State"
-Singapore,"","","UG::Asia, UG::Southeast_Asia, UG::Sovereign_State"
-Syria,"","","UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State"
-Taiwan,"","","UG::Asia, UG::Sovereign_State"
-Sri Lanka,"","","UG::Asia, UG::Sovereign_State"
-Tajikistan,"","","UG::Asia, UG::Sovereign_State"
-Thailand,"","","UG::Asia, UG::Southeast_Asia, UG::Sovereign_State"
-East Timor,"","","UG::Asia, UG::Southeast_Asia, UG::Sovereign_State"
-United Arab Emirates,"","","UG::Asia, UG::Middle_East, UG::Sovereign_State"
-Turkmenistan,"","","UG::Asia, UG::Sovereign_State"
-Yemen,"","","UG::Asia, UG::Middle_East, UG::Sovereign_State"
-Vietnam,"","","UG::Asia, UG::Southeast_Asia, UG::Sovereign_State"
-Uzbekistan,"","","UG::Asia, UG::Sovereign_State"
-Fiji,"","","UG::Oceania, UG::Sovereign_State"
-Papua New Guinea,"","","UG::Oceania, UG::Sovereign_State"
-Australia,"","","UG::Oceania, UG::Sovereign_State"
-Solomon Islands,"","","UG::Oceania, UG::Sovereign_State"
-Argentina,"","","UG::South_America, UG::Sovereign_State"
-Bolivia,"","","UG::South_America, UG::Sovereign_State"
-Brazil,"","","UG::South_America, UG::Sovereign_State"
-Chile,"","","UG::South_America, UG::Sovereign_State"
-Colombia,"","","UG::South_America, UG::Sovereign_State"
-Ecuador,"","","UG::South_America, UG::Sovereign_State"
-Guyana,"","","UG::South_America, UG::Sovereign_State"
-Paraguay,"","","UG::South_America, UG::Sovereign_State"
-Peru,"","","UG::South_America, UG::Sovereign_State"
-Suriname,"","","UG::South_America, UG::Sovereign_State"
-Uruguay,"","","UG::South_America, UG::Sovereign_State"
-Venezuela,"","","UG::South_America, UG::Sovereign_State"
-Cook Islands,"","","UG::Oceania, UG::Sovereign_State"
-Federated States of Micronesia,"","","UG::Oceania, UG::Sovereign_State"
-Guam,"","",UG::Oceania
-Vanuatu,"","","UG::Oceania, UG::Sovereign_State"
-Canada,"","","UG::North_America, UG::Sovereign_State"
-United States of America,"","","UG::North_America, UG::Sovereign_State"
-Mexico,"","","UG::North_America, UG::Sovereign_State"
-Puerto Rico,"","","UG::Caribbean, UG::North_America"
-Cuba,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State"
-Dominican Republic,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State"
-Haiti,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State"
-Jamaica,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State"
-Trinidad and Tobago,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State"
-Bermuda,,"","UG::Caribbean, UG::North_America"
-Guadeloupe,,"","UG::Caribbean, UG::North_America"
-The Bahamas,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State"
-Barbados,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State"
-Belize,"","","UG::North_America, UG::Sovereign_State"
-Costa Rica,"","","UG::North_America, UG::Sovereign_State"
-El Salvador,"","","UG::North_America, UG::Sovereign_State"
-Guatemala,"","","UG::North_America, UG::Sovereign_State"
-Honduras,"","","UG::North_America, UG::Sovereign_State"
-Nicaragua,"","","UG::North_America, UG::Sovereign_State"
-Panama,"","","UG::North_America, UG::Sovereign_State"
-Antigua and Barbuda,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State"
-Dominica,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State"
-Saint Vincent and the Grenadines,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State"
-Somalia,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State"
-Zanzibar,,"",UG::Africa
-Ghana,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa"
-Guinea,"","","UG::Africa, UG::Sovereign_State, UG::West_Africa"
-New Zealand,"","","UG::Oceania, UG::Sovereign_State"
-French Polynesia,"","",UG::Oceania
-Philippines,"","","UG::Asia, UG::Southeast_Asia, UG::Sovereign_State"
-Kosovo,"","","UG::Europe, UG::Sovereign_State"
-Libya,"","","UG::Africa, UG::Mediterranean, UG::Sovereign_State"
-Palau,"","","UG::Oceania, UG::Sovereign_State"
-Saint Lucia,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State"
-Bali,,"",UG::Asia
-Grenada,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State"
-British Virgin Islands,,"","UG::Caribbean, UG::North_America"
-Turks and Caicos Islands,,"","UG::Caribbean, UG::North_America"
-Cayman Islands,,"","UG::Caribbean, UG::North_America"
-Anguilla,,"","UG::Caribbean, UG::North_America"
-Azores,,"",UG::Europe
-Curaçao,"","","UG::Caribbean, UG::North_America"
-French Guiana,,"",UG::South_America
-Gibraltar,,"","UG::Europe, UG::Mediterranean"
-Guernsey,,"",UG::Europe
-Isle of Man,,"",UG::Europe
-Jersey,,"",UG::Europe
-Kiribati,"","","UG::Oceania, UG::Sovereign_State"
-Macau,"","",UG::Asia
-Madeira,,"",UG::Europe
-Marshall Islands,"","","UG::Oceania, UG::Sovereign_State"
-Nauru,"","","UG::Oceania, UG::Sovereign_State"
-New Caledonia,"","",UG::Oceania
-Niue,"","","UG::Oceania, UG::Sovereign_State"
-Northern Cyprus,"","","UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State"
-Saint Kitts and Nevis,"","","UG::Caribbean, UG::North_America, UG::Sovereign_State"
-Samoa,"","","UG::Oceania, UG::Sovereign_State"
-Somaliland,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State"
-South Sudan,"","","UG::Africa, UG::East_Africa, UG::Sovereign_State"
-Tuvalu,"","","UG::Oceania, UG::Sovereign_State"
-United States Virgin Islands,"","","UG::Caribbean, UG::North_America"
-Åland Islands,"","",UG::Europe
-South Ossetia,"","","UG::Europe, UG::Sovereign_State"
-American Samoa,,"",UG::Oceania
-Northern Mariana Islands,,"",UG::Oceania
-Aruba,"","","UG::Caribbean, UG::North_America"
-Abkhazia,"","","UG::Europe, UG::Sovereign_State"
-Sint Maarten,,"","UG::Caribbean, UG::North_America"
-Tonga,"","","UG::Oceania, UG::Sovereign_State"
-Transnistria,"","","UG::Europe, UG::Sovereign_State"
-Sardinia,,"",UG::Europe
-Kaliningrad Oblast,,"",UG::Europe
-Martinique,,"","UG::Caribbean, UG::North_America"
-Java,,"",UG::Asia
-Corsica,,"",UG::Europe
-European Union,"","",UG::Europe
-Gulf of Mexico,,"",UG::Oceans+Seas
-Philippine Sea,,"",UG::Oceans+Seas
-Southern Ocean,,"",UG::Oceans+Seas
-Gulf of Thailand,,"",UG::Oceans+Seas
-Micronesia,,"",UG::Oceania
-Pacific Ocean,,"",UG::Oceans+Seas
-Atlantic Ocean,,"",UG::Oceans+Seas
-Indian Ocean,,"",UG::Oceans+Seas
-Arctic Ocean,,"",UG::Oceans+Seas
-Hudson Bay,,"",UG::Oceans+Seas
-Labrador Sea,,"",UG::Oceans+Seas
-White Sea,,"",UG::Oceans+Seas
-Denmark Strait,,"",UG::Oceans+Seas
-Norwegian Sea,,"",UG::Oceans+Seas
-Baltic Sea,,"",UG::Oceans+Seas
-Celtic Sea,,"",UG::Oceans+Seas
-English Channel,,"",UG::Oceans+Seas
-Adriatic Sea,,"",UG::Oceans+Seas
-Bay of Biscay,,"",UG::Oceans+Seas
-Black Sea,,"",UG::Oceans+Seas
-Aegean Sea,,"",UG::Oceans+Seas
-Balkan Peninsula,,"",UG::Europe
-Caspian Sea,,"",UG::Oceans+Seas
-Mediterranean Sea,,"",UG::Oceans+Seas
-East Siberian Sea,,"",UG::Oceans+Seas
-Bering Strait,,"",UG::Oceans+Seas
-Arabian Sea,,"",UG::Oceans+Seas
-Red Sea,,"",UG::Oceans+Seas
-Dead Sea,,"",UG::Oceans+Seas
-Bay of Bengal,,"",UG::Oceans+Seas
-Sea of Japan,,"",UG::Oceans+Seas
-Yellow Sea,,"",UG::Oceans+Seas
-Coral Sea,,"",UG::Oceans+Seas
-South China Sea,,"",UG::Oceans+Seas
-Tasman Sea,,"",UG::Oceans+Seas
-Gulf of Carpentaria,,"",UG::Oceans+Seas
-Aral Sea,,"",UG::Oceans+Seas
-Persian Gulf,,"",UG::Oceans+Seas
-Caribbean Sea,,"",UG::Oceans+Seas
-Gulf of California,,"",UG::Oceans+Seas
-Polynesia,,"",UG::Oceania
-Melanesia,,"",UG::Oceania
-Scandinavia,,"",UG::Europe
-Sea of Galilee,,"",UG::Oceans+Seas
-Sumatra,,"",UG::Asia
-Sicily,,"",UG::Europe
-Mayotte,,"","UG::Africa, UG::East_Africa"
-Réunion,,"","UG::Africa, UG::East_Africa"
-Falkland Islands,,"",UG::South_America
-Europe,,"",UG::Continents
-North America,,"",UG::Continents
-South America,,"",UG::Continents
-Asia,,"",UG::Continents
-Africa,,"",UG::Continents
-Oceania,,"",UG::Continents
-Antarctica,,"",UG::Continents
-Saint Martin,,"","UG::Caribbean, UG::North_America"
-Wallis and Futuna,,"",UG::Oceania
-Akrotiri and Dhekelia,,"","UG::Asia, UG::Mediterranean, UG::Middle_East"
-Svalbard,,"",UG::Europe
-Hawaii,,"",UG::Oceania
-Alaska,,"",UG::North_America
-Bougainville,,"",UG::Oceania
-Jeju,,"",UG::Asia
-Banda Sea,,"",UG::Oceans+Seas
-Barents Sea,,"",UG::Oceans+Seas
-Celebes Sea,,"",UG::Oceans+Seas
-East China Sea,,"",UG::Oceans+Seas
-Gulf of Alaska,,"",UG::Oceans+Seas
-Gulf of Guinea,,"",UG::Oceans+Seas
-North Sea,,"",UG::Oceans+Seas
-Sea of Okhotsk,,"",UG::Oceans+Seas
-Timor Sea,,"",UG::Oceans+Seas
+country,flag,map,region code,tags
+England,"","",,UG::Europe
+Scotland,"","",,UG::Europe
+United Kingdom,"","",GB,"UG::Europe, UG::Sovereign_State"
+Northern Ireland,,"",,UG::Europe
+France,"","",FR,"UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State"
+Wales,"","",,UG::Europe
+Georgia,"","",GE,"UG::Europe, UG::Sovereign_State"
+Germany,"","",DE,"UG::Europe, UG::European_Union, UG::Sovereign_State"
+Greece,"","",GR,"UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State"
+Greenland,"","",GL,UG::North_America
+Hungary,"","",HU,"UG::Europe, UG::European_Union, UG::Sovereign_State"
+Albania,"","",AL,"UG::Europe, UG::Mediterranean, UG::Sovereign_State"
+Andorra,"","",AD,"UG::Europe, UG::Sovereign_State"
+Austria,"","",AT,"UG::Europe, UG::European_Union, UG::Sovereign_State"
+Azerbaijan,"","",AZ,"UG::Europe, UG::Sovereign_State"
+Belarus,"","",BY,"UG::Europe, UG::Sovereign_State"
+Belgium,"","",BE,"UG::Europe, UG::European_Union, UG::Sovereign_State"
+Bosnia and Herzegovina,"","",BA,"UG::Europe, UG::Mediterranean, UG::Sovereign_State"
+Bulgaria,"","",BG,"UG::Europe, UG::European_Union, UG::Sovereign_State"
+Croatia,"","",HR,"UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State"
+Czech Republic,"","",CZ,"UG::Europe, UG::European_Union, UG::Sovereign_State"
+Denmark,"","",DK,"UG::Europe, UG::European_Union, UG::Sovereign_State"
+Estonia,"","",EE,"UG::Europe, UG::European_Union, UG::Sovereign_State"
+Faroe Islands,"","",FO,UG::Europe
+Finland,"","",FI,"UG::Europe, UG::European_Union, UG::Sovereign_State"
+Iceland,"","",IS,"UG::Europe, UG::Sovereign_State"
+Ireland,"","",IE,"UG::Europe, UG::European_Union, UG::Sovereign_State"
+Italy,"","",IT,"UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State"
+Latvia,"","",LV,"UG::Europe, UG::European_Union, UG::Sovereign_State"
+Liechtenstein,"","",,"UG::Europe, UG::Sovereign_State"
+Lithuania,"","",LT,"UG::Europe, UG::European_Union, UG::Sovereign_State"
+Luxembourg,"","",LU,"UG::Europe, UG::European_Union, UG::Sovereign_State"
+North Macedonia,"","",MK,"UG::Europe, UG::Sovereign_State"
+Malta,"","",,"UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State"
+Moldova,"","",MD,"UG::Europe, UG::Sovereign_State"
+Monaco,"","",,"UG::Europe, UG::Mediterranean, UG::Sovereign_State"
+Montenegro,"","",ME,"UG::Europe, UG::Mediterranean, UG::Sovereign_State"
+Netherlands,"","",NL,"UG::Europe, UG::European_Union, UG::Sovereign_State"
+Norway,"","",NO,"UG::Europe, UG::Sovereign_State"
+Poland,"","",PL,"UG::Europe, UG::European_Union, UG::Sovereign_State"
+Portugal,"","",PT,"UG::Europe, UG::European_Union, UG::Sovereign_State"
+Romania,"","",RO,"UG::Europe, UG::European_Union, UG::Sovereign_State"
+Russia,"","",RU,"UG::Europe, UG::Sovereign_State"
+San Marino,"","",,"UG::Europe, UG::Sovereign_State"
+Serbia,"","",RS,"UG::Europe, UG::Sovereign_State"
+Slovakia,"","",SK,"UG::Europe, UG::European_Union, UG::Sovereign_State"
+Slovenia,"","",SI,"UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State"
+Spain,"","",ES,"UG::Europe, UG::European_Union, UG::Mediterranean, UG::Sovereign_State"
+Sweden,"","",SE,"UG::Europe, UG::European_Union, UG::Sovereign_State"
+Switzerland,"","",CH,"UG::Europe, UG::Sovereign_State"
+Turkey,"","",TR,"UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State"
+Ukraine,"","",UA,"UG::Europe, UG::Sovereign_State"
+Vatican City,"","",,"UG::Europe, UG::Sovereign_State"
+Armenia,"","",AM,"UG::Europe, UG::Sovereign_State"
+Cyprus,"","",CY,"UG::Asia, UG::European_Union, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State"
+Kazakhstan,"","",KZ,"UG::Asia, UG::Sovereign_State"
+Egypt,"","",EG,"UG::Africa, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State"
+Algeria,"","",DZ,"UG::Africa, UG::Mediterranean, UG::Sovereign_State"
+Angola,"","",AO,"UG::Africa, UG::Sovereign_State"
+Benin,"","",BJ,"UG::Africa, UG::Sovereign_State, UG::West_Africa"
+Botswana,"","",BW,"UG::Africa, UG::Sovereign_State"
+Burkina Faso,"","",BF,"UG::Africa, UG::Sovereign_State, UG::West_Africa"
+Cameroon,"","",CM,"UG::Africa, UG::Sovereign_State"
+Burundi,"","",BI,"UG::Africa, UG::East_Africa, UG::Sovereign_State"
+Cape Verde,"","",CV,"UG::Africa, UG::Sovereign_State, UG::West_Africa"
+São Tomé and Príncipe,"","",ST,"UG::Africa, UG::Sovereign_State"
+Central African Republic,"","",CF,"UG::Africa, UG::Sovereign_State"
+Chad,"","",TD,"UG::Africa, UG::Sovereign_State"
+Equatorial Guinea,"","",GQ,"UG::Africa, UG::Sovereign_State"
+Kenya,"","",KE,"UG::Africa, UG::East_Africa, UG::Sovereign_State"
+Comoros,"","",KM,"UG::Africa, UG::East_Africa, UG::Sovereign_State"
+Ivory Coast,"","",CI,"UG::Africa, UG::Sovereign_State, UG::West_Africa"
+Democratic Republic of the Congo,"","",CD,"UG::Africa, UG::Sovereign_State"
+Djibouti,"","",DJ,"UG::Africa, UG::East_Africa, UG::Sovereign_State"
+Guinea-Bissau,"","",GW,"UG::Africa, UG::Sovereign_State, UG::West_Africa"
+Eritrea,"","",ER,"UG::Africa, UG::East_Africa, UG::Sovereign_State"
+Ethiopia,"","",ET,"UG::Africa, UG::East_Africa, UG::Sovereign_State"
+Gabon,"","",GA,"UG::Africa, UG::Sovereign_State"
+The Gambia,"","",GM,"UG::Africa, UG::Sovereign_State, UG::West_Africa"
+Lesotho,"","",LS,"UG::Africa, UG::Sovereign_State"
+Liberia,"","",LR,"UG::Africa, UG::Sovereign_State, UG::West_Africa"
+Madagascar,"","",MG,"UG::Africa, UG::East_Africa, UG::Sovereign_State"
+Malawi,"","",MW,"UG::Africa, UG::East_Africa, UG::Sovereign_State"
+Mali,"","",ML,"UG::Africa, UG::Sovereign_State, UG::West_Africa"
+Mauritania,"","",MR,"UG::Africa, UG::Sovereign_State, UG::West_Africa"
+Mauritius,"","",MU,"UG::Africa, UG::East_Africa, UG::Sovereign_State"
+Morocco,"","",MA,"UG::Africa, UG::Mediterranean, UG::Sovereign_State"
+Mozambique,"","",MZ,"UG::Africa, UG::East_Africa, UG::Sovereign_State"
+Namibia,"","",NA,"UG::Africa, UG::Sovereign_State"
+Niger,"","",NE,"UG::Africa, UG::Sovereign_State, UG::West_Africa"
+Nigeria,"","",NG,"UG::Africa, UG::Sovereign_State, UG::West_Africa"
+Republic of the Congo,"","",CG,"UG::Africa, UG::Sovereign_State"
+Rwanda,"","",RW,"UG::Africa, UG::East_Africa, UG::Sovereign_State"
+Senegal,"","",SN,"UG::Africa, UG::Sovereign_State, UG::West_Africa"
+Seychelles,"","",,"UG::Africa, UG::East_Africa, UG::Sovereign_State"
+Sierra Leone,"","",SL,"UG::Africa, UG::Sovereign_State, UG::West_Africa"
+South Africa,"","",ZA,"UG::Africa, UG::Sovereign_State"
+Sudan,"","",SD,"UG::Africa, UG::Sovereign_State"
+Eswatini,"","",SZ,"UG::Africa, UG::Sovereign_State"
+Tanzania,"","",TZ,"UG::Africa, UG::East_Africa, UG::Sovereign_State"
+Togo,"","",TG,"UG::Africa, UG::Sovereign_State, UG::West_Africa"
+Tunisia,"","",TN,"UG::Africa, UG::Mediterranean, UG::Sovereign_State"
+Uganda,"","",UG,"UG::Africa, UG::East_Africa, UG::Sovereign_State"
+Sahrawi Arab Democratic Republic,"","",,"UG::Africa, UG::Sovereign_State"
+Zambia,"","",ZM,"UG::Africa, UG::East_Africa, UG::Sovereign_State"
+Zimbabwe,"","",ZW,"UG::Africa, UG::East_Africa, UG::Sovereign_State"
+Canary Islands,,"",,UG::Africa
+Afghanistan,"","",AF,"UG::Asia, UG::Sovereign_State"
+Bahrain,"","",BH,"UG::Asia, UG::Middle_East, UG::Sovereign_State"
+Bangladesh,"","",BD,"UG::Asia, UG::Sovereign_State"
+Bhutan,"","",BT,"UG::Asia, UG::Sovereign_State"
+Brunei,"","",BN,"UG::Asia, UG::Southeast_Asia, UG::Sovereign_State"
+China,"","",CN,"UG::Asia, UG::Sovereign_State"
+Cambodia,"","",KH,"UG::Asia, UG::Southeast_Asia, UG::Sovereign_State"
+Indonesia,"","",ID,"UG::Asia, UG::Southeast_Asia, UG::Sovereign_State"
+India,"","",IN,"UG::Asia, UG::Sovereign_State"
+Hong Kong,"","",HK,UG::Asia
+Iran,"","",IR,"UG::Asia, UG::Middle_East, UG::Sovereign_State"
+Israel,"","",IL,"UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State"
+Iraq,"","",IQ,"UG::Asia, UG::Middle_East, UG::Sovereign_State"
+South Korea,"","",KR,"UG::Asia, UG::Sovereign_State"
+North Korea,"","",KP,"UG::Asia, UG::Sovereign_State"
+Jordan,"","",JO,"UG::Asia, UG::Middle_East, UG::Sovereign_State"
+Japan,"","",JP,"UG::Asia, UG::Sovereign_State"
+Lebanon,"","",LB,"UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State"
+Laos,"","",LA,"UG::Asia, UG::Southeast_Asia, UG::Sovereign_State"
+Kyrgyzstan,"","",KG,"UG::Asia, UG::Sovereign_State"
+Kuwait,"","",KW,"UG::Asia, UG::Middle_East, UG::Sovereign_State"
+Myanmar,"","",MM,"UG::Asia, UG::Southeast_Asia, UG::Sovereign_State"
+Mongolia,"","",MN,"UG::Asia, UG::Sovereign_State"
+Maldives,"","",,"UG::Asia, UG::Sovereign_State"
+Malaysia,"","",MY,"UG::Asia, UG::Southeast_Asia, UG::Sovereign_State"
+Oman,"","",OM,"UG::Asia, UG::Middle_East, UG::Sovereign_State"
+Nepal,"","",NP,"UG::Asia, UG::Sovereign_State"
+Palestine,"","",PS,"UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State"
+Pakistan,"","",PK,"UG::Asia, UG::Sovereign_State"
+Qatar,"","",QA,"UG::Asia, UG::Middle_East, UG::Sovereign_State"
+Saudi Arabia,"","",SA,"UG::Asia, UG::Middle_East, UG::Sovereign_State"
+Singapore,"","",SG,"UG::Asia, UG::Southeast_Asia, UG::Sovereign_State"
+Syria,"","",SY,"UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State"
+Taiwan,"","",TW,"UG::Asia, UG::Sovereign_State"
+Sri Lanka,"","",LK,"UG::Asia, UG::Sovereign_State"
+Tajikistan,"","",TJ,"UG::Asia, UG::Sovereign_State"
+Thailand,"","",TH,"UG::Asia, UG::Southeast_Asia, UG::Sovereign_State"
+East Timor,"","",TL,"UG::Asia, UG::Southeast_Asia, UG::Sovereign_State"
+United Arab Emirates,"","",AE,"UG::Asia, UG::Middle_East, UG::Sovereign_State"
+Turkmenistan,"","",TM,"UG::Asia, UG::Sovereign_State"
+Yemen,"","",YE,"UG::Asia, UG::Middle_East, UG::Sovereign_State"
+Vietnam,"","",VN,"UG::Asia, UG::Southeast_Asia, UG::Sovereign_State"
+Uzbekistan,"","",UZ,"UG::Asia, UG::Sovereign_State"
+Fiji,"","",FJ,"UG::Oceania, UG::Sovereign_State"
+Papua New Guinea,"","",PG,"UG::Oceania, UG::Sovereign_State"
+Australia,"","",AU,"UG::Oceania, UG::Sovereign_State"
+Solomon Islands,"","",SB,"UG::Oceania, UG::Sovereign_State"
+Argentina,"","",AR,"UG::South_America, UG::Sovereign_State"
+Bolivia,"","",BO,"UG::South_America, UG::Sovereign_State"
+Brazil,"","",BR,"UG::South_America, UG::Sovereign_State"
+Chile,"","",CL,"UG::South_America, UG::Sovereign_State"
+Colombia,"","",CO,"UG::South_America, UG::Sovereign_State"
+Ecuador,"","",EC,"UG::South_America, UG::Sovereign_State"
+Guyana,"","",GY,"UG::South_America, UG::Sovereign_State"
+Paraguay,"","",PY,"UG::South_America, UG::Sovereign_State"
+Peru,"","",PE,"UG::South_America, UG::Sovereign_State"
+Suriname,"","",SR,"UG::South_America, UG::Sovereign_State"
+Uruguay,"","",UY,"UG::South_America, UG::Sovereign_State"
+Venezuela,"","",VE,"UG::South_America, UG::Sovereign_State"
+Cook Islands,"","",,"UG::Oceania, UG::Sovereign_State"
+Federated States of Micronesia,"","",,"UG::Oceania, UG::Sovereign_State"
+Guam,"","",,UG::Oceania
+Vanuatu,"","",VU,"UG::Oceania, UG::Sovereign_State"
+Canada,"","",CA,"UG::North_America, UG::Sovereign_State"
+United States of America,"","",US,"UG::North_America, UG::Sovereign_State"
+Mexico,"","",MX,"UG::North_America, UG::Sovereign_State"
+Puerto Rico,"","",PR,"UG::Caribbean, UG::North_America"
+Cuba,"","",CU,"UG::Caribbean, UG::North_America, UG::Sovereign_State"
+Dominican Republic,"","",DO,"UG::Caribbean, UG::North_America, UG::Sovereign_State"
+Haiti,"","",HT,"UG::Caribbean, UG::North_America, UG::Sovereign_State"
+Jamaica,"","",JM,"UG::Caribbean, UG::North_America, UG::Sovereign_State"
+Trinidad and Tobago,"","",TT,"UG::Caribbean, UG::North_America, UG::Sovereign_State"
+Bermuda,,"",,"UG::Caribbean, UG::North_America"
+Guadeloupe,,"",GP,"UG::Caribbean, UG::North_America"
+The Bahamas,"","",BS,"UG::Caribbean, UG::North_America, UG::Sovereign_State"
+Barbados,"","",BB,"UG::Caribbean, UG::North_America, UG::Sovereign_State"
+Belize,"","",BZ,"UG::North_America, UG::Sovereign_State"
+Costa Rica,"","",CR,"UG::North_America, UG::Sovereign_State"
+El Salvador,"","",SV,"UG::North_America, UG::Sovereign_State"
+Guatemala,"","",GT,"UG::North_America, UG::Sovereign_State"
+Honduras,"","",HN,"UG::North_America, UG::Sovereign_State"
+Nicaragua,"","",NI,"UG::North_America, UG::Sovereign_State"
+Panama,"","",PA,"UG::North_America, UG::Sovereign_State"
+Antigua and Barbuda,"","",AG,"UG::Caribbean, UG::North_America, UG::Sovereign_State"
+Dominica,"","",DM,"UG::Caribbean, UG::North_America, UG::Sovereign_State"
+Saint Vincent and the Grenadines,"","",,"UG::Caribbean, UG::North_America, UG::Sovereign_State"
+Somalia,"","",SO,"UG::Africa, UG::East_Africa, UG::Sovereign_State"
+Zanzibar,,"",,UG::Africa
+Ghana,"","",GH,"UG::Africa, UG::Sovereign_State, UG::West_Africa"
+Guinea,"","",GN,"UG::Africa, UG::Sovereign_State, UG::West_Africa"
+New Zealand,"","",NZ,"UG::Oceania, UG::Sovereign_State"
+French Polynesia,"","",,UG::Oceania
+Philippines,"","",PH,"UG::Asia, UG::Southeast_Asia, UG::Sovereign_State"
+Kosovo,"","",,"UG::Europe, UG::Sovereign_State"
+Libya,"","",LY,"UG::Africa, UG::Mediterranean, UG::Sovereign_State"
+Palau,"","",,"UG::Oceania, UG::Sovereign_State"
+Saint Lucia,"","",,"UG::Caribbean, UG::North_America, UG::Sovereign_State"
+Bali,,"",,UG::Asia
+Grenada,"","",,"UG::Caribbean, UG::North_America, UG::Sovereign_State"
+British Virgin Islands,,"",,"UG::Caribbean, UG::North_America"
+Turks and Caicos Islands,,"",,"UG::Caribbean, UG::North_America"
+Cayman Islands,,"",,"UG::Caribbean, UG::North_America"
+Anguilla,,"",,"UG::Caribbean, UG::North_America"
+Azores,,"",,UG::Europe
+Curaçao,"","",,"UG::Caribbean, UG::North_America"
+French Guiana,,"",GF,UG::South_America
+Gibraltar,,"",,"UG::Europe, UG::Mediterranean"
+Guernsey,,"",,UG::Europe
+Isle of Man,,"",IM,UG::Europe
+Jersey,,"",,UG::Europe
+Kiribati,"","",,"UG::Oceania, UG::Sovereign_State"
+Macau,"","",,UG::Asia
+Madeira,,"",,UG::Europe
+Marshall Islands,"","",,"UG::Oceania, UG::Sovereign_State"
+Nauru,"","",,"UG::Oceania, UG::Sovereign_State"
+New Caledonia,"","",NC,UG::Oceania
+Niue,"","",,"UG::Oceania, UG::Sovereign_State"
+Northern Cyprus,"","",,"UG::Asia, UG::Mediterranean, UG::Middle_East, UG::Sovereign_State"
+Saint Kitts and Nevis,"","",,"UG::Caribbean, UG::North_America, UG::Sovereign_State"
+Samoa,"","",,"UG::Oceania, UG::Sovereign_State"
+Somaliland,"","",,"UG::Africa, UG::East_Africa, UG::Sovereign_State"
+South Sudan,"","",SS,"UG::Africa, UG::East_Africa, UG::Sovereign_State"
+Tuvalu,"","",,"UG::Oceania, UG::Sovereign_State"
+United States Virgin Islands,"","",,"UG::Caribbean, UG::North_America"
+Åland Islands,"","",AX,UG::Europe
+South Ossetia,"","",,"UG::Europe, UG::Sovereign_State"
+American Samoa,,"",,UG::Oceania
+Northern Mariana Islands,,"",,UG::Oceania
+Aruba,"","",,"UG::Caribbean, UG::North_America"
+Abkhazia,"","",,"UG::Europe, UG::Sovereign_State"
+Sint Maarten,,"",,"UG::Caribbean, UG::North_America"
+Tonga,"","",,"UG::Oceania, UG::Sovereign_State"
+Transnistria,"","",,"UG::Europe, UG::Sovereign_State"
+Sardinia,,"",,UG::Europe
+Kaliningrad Oblast,,"",,UG::Europe
+Martinique,,"",MQ,"UG::Caribbean, UG::North_America"
+Java,,"",,UG::Asia
+Corsica,,"",,UG::Europe
+European Union,"","",,UG::Europe
+Gulf of Mexico,,"",,UG::Oceans+Seas
+Philippine Sea,,"",,UG::Oceans+Seas
+Southern Ocean,,"",,UG::Oceans+Seas
+Gulf of Thailand,,"",,UG::Oceans+Seas
+Micronesia,,"",,UG::Oceania
+Pacific Ocean,,"",,UG::Oceans+Seas
+Atlantic Ocean,,"",,UG::Oceans+Seas
+Indian Ocean,,"",,UG::Oceans+Seas
+Arctic Ocean,,"",,UG::Oceans+Seas
+Hudson Bay,,"",,UG::Oceans+Seas
+Labrador Sea,,"",,UG::Oceans+Seas
+White Sea,,"",,UG::Oceans+Seas
+Denmark Strait,,"",,UG::Oceans+Seas
+Norwegian Sea,,"",,UG::Oceans+Seas
+Baltic Sea,,"",,UG::Oceans+Seas
+Celtic Sea,,"",,UG::Oceans+Seas
+English Channel,,"",,UG::Oceans+Seas
+Adriatic Sea,,"",,UG::Oceans+Seas
+Bay of Biscay,,"",,UG::Oceans+Seas
+Black Sea,,"",,UG::Oceans+Seas
+Aegean Sea,,"",,UG::Oceans+Seas
+Balkan Peninsula,,"",,UG::Europe
+Caspian Sea,,"",,UG::Oceans+Seas
+Mediterranean Sea,,"",,UG::Oceans+Seas
+East Siberian Sea,,"",,UG::Oceans+Seas
+Bering Strait,,"",,UG::Oceans+Seas
+Arabian Sea,,"",,UG::Oceans+Seas
+Red Sea,,"",,UG::Oceans+Seas
+Dead Sea,,"",,UG::Oceans+Seas
+Bay of Bengal,,"",,UG::Oceans+Seas
+Sea of Japan,,"",,UG::Oceans+Seas
+Yellow Sea,,"",,UG::Oceans+Seas
+Coral Sea,,"",,UG::Oceans+Seas
+South China Sea,,"",,UG::Oceans+Seas
+Tasman Sea,,"",,UG::Oceans+Seas
+Gulf of Carpentaria,,"",,UG::Oceans+Seas
+Aral Sea,,"",,UG::Oceans+Seas
+Persian Gulf,,"",,UG::Oceans+Seas
+Caribbean Sea,,"",,UG::Oceans+Seas
+Gulf of California,,"",,UG::Oceans+Seas
+Polynesia,,"",,UG::Oceania
+Melanesia,,"",,UG::Oceania
+Scandinavia,,"",,UG::Europe
+Sea of Galilee,,"",,UG::Oceans+Seas
+Sumatra,,"",,UG::Asia
+Sicily,,"",,UG::Europe
+Mayotte,,"",YT,"UG::Africa, UG::East_Africa"
+Réunion,,"",RE,"UG::Africa, UG::East_Africa"
+Falkland Islands,,"",FK,UG::South_America
+Europe,,"",,UG::Continents
+North America,,"",,UG::Continents
+South America,,"",,UG::Continents
+Asia,,"",,UG::Continents
+Africa,,"",,UG::Continents
+Oceania,,"",,UG::Continents
+Antarctica,,"",,UG::Continents
+Saint Martin,,"",,"UG::Caribbean, UG::North_America"
+Wallis and Futuna,,"",,UG::Oceania
+Akrotiri and Dhekelia,,"",,"UG::Asia, UG::Mediterranean, UG::Middle_East"
+Svalbard,,"",SJ,UG::Europe
+Hawaii,,"",,UG::Oceania
+Alaska,,"",,UG::North_America
+Bougainville,,"",,UG::Oceania
+Jeju,,"",,UG::Asia
+Banda Sea,,"",,UG::Oceans+Seas
+Barents Sea,,"",,UG::Oceans+Seas
+Celebes Sea,,"",,UG::Oceans+Seas
+East China Sea,,"",,UG::Oceans+Seas
+Gulf of Alaska,,"",,UG::Oceans+Seas
+Gulf of Guinea,,"",,UG::Oceans+Seas
+North Sea,,"",,UG::Oceans+Seas
+Sea of Okhotsk,,"",,UG::Oceans+Seas
+Timor Sea,,"",,UG::Oceans+Seas
diff --git a/src/media/experimental_assets/_ug-interactive_map_config.js b/src/media/experimental_assets/_ug-interactive_map_config.js
new file mode 100644
index 00000000..2eeae64f
--- /dev/null
+++ b/src/media/experimental_assets/_ug-interactive_map_config.js
@@ -0,0 +1,91 @@
+/**
+ * Overall configuration. Includes validated user properties
+ * and core properties - program auxiliary data. Should not
+ * be modified unless the author understands what they are doing
+ */
+function getMapConfig() {
+ let userConfig = JSON.parse(sessionStorage.getItem("userConfig"));
+ let configObj = {};
+ configObj.commonConfig = {
+ interactiveEnabled: true,
+ interactiveMobileEnabled: true,
+ autoAnswerEnabled: true,
+ toolTipEnabled: false,
+ ...filterObjValidBooleans(userConfig.commonFeatures),
+
+ isMobile: document.documentElement.classList.contains("mobile"),
+ regionCode: document.currentScript.dataset.regionCode,
+ cardSide: document.currentScript.dataset.cardSide,
+ questionCardSideName: "question",
+ answerCardSideName: "answer",
+ selectedRegionSessionKey: "selectedRegion",
+ mapSvgId: "world"
+ }
+ configObj.commonColors = {
+ region: "#fdfbe5",
+ selectedRegion: "#e7f3ea",
+ incorrectRegionHighlight: "#c02637",
+ correctRegionHighlight: "#329446",
+ background: "#b3dff5",
+ border: "#757674",
+ tooltipBackground: "#fdfbe5",
+ tooltipText: "#000000",
+ ...filterObjValidColors(userConfig.commonColors)
+ };
+ configObj.commonElements = {
+ interactiveMap: document.querySelector(".value--map"),
+ staticMap: document.querySelector(".value--image"),
+ mapTooltips: document.querySelectorAll("body > div.jvm-tooltip"),
+ hiddenTextarea: document.querySelector("textarea#typeans")
+ };
+ configObj.commonMap = {
+ selector: configObj.commonElements.interactiveMap,
+ map: configObj.commonConfig.mapSvgId,
+ zoomButtons: false,
+ zoomMax: 25,
+ backgroundColor: configObj.commonColors.background,
+ regionStyle: {
+ initial: {
+ fill: configObj.commonColors.region,
+ stroke: configObj.commonColors.border,
+ strokeWidth: 0.2
+ }
+ }
+ };
+ return configObj;
+}
+
+/**
+ * Assemble the object from properties of original object
+ * values of which match the predicate
+ */
+function filterObj(obj, predicate, mapper) {
+ let filtered = {};
+ for (let [key, value] of Object.entries(obj))
+ if (predicate(value))
+ filtered[key] = mapper ? mapper(value) : value;
+ return filtered;
+}
+
+/**
+ * Assemble the object with valid boolean property values
+ * ignoring invalid and non-boolean properties
+ */
+function filterObjValidBooleans(obj) {
+ let toLower = v => v.toString().toLowerCase()
+ return filterObj(
+ obj,
+ v => ["true", "false"].some(x => toLower(v) === x),
+ v => toLower(v) === "true");
+}
+
+/**
+ * Assemble the object with valid HEX string property values
+ * ignoring invalid and non-HEX properties
+ */
+function filterObjValidColors(obj) {
+ return filterObj(
+ obj,
+ v => v.toString().match(/^#(?:[0-9a-fA-F]{3}){1,2}$/g)
+ );
+}
diff --git a/src/media/experimental_assets/_ug-interactive_map_init.js b/src/media/experimental_assets/_ug-interactive_map_init.js
new file mode 100644
index 00000000..32d48b53
--- /dev/null
+++ b/src/media/experimental_assets/_ug-interactive_map_init.js
@@ -0,0 +1,182 @@
+(function () {
+ const mapConfig = getMapConfig();
+ const commonConfig = mapConfig.commonConfig;
+ const commonColors = mapConfig.commonColors;
+ const commonElements = mapConfig.commonElements;
+ const commonMap = mapConfig.commonMap;
+
+ clearTooltips();
+
+ if (resolveInteractiveEnabled()) {
+ interactiveMapMode(true);
+ try {
+ if (cardSide(commonConfig.questionCardSideName))
+ initFrontMap();
+ else if (cardSide(commonConfig.answerCardSideName)) {
+ failInvalidRegionCode()
+ initBackMap();
+ }
+ } catch (e) {
+ interactiveMapMode(false);
+ throw e;
+ }
+ }
+
+
+ /**
+ * Using configuration options to determine whether to display interactive map
+ */
+ function resolveInteractiveEnabled() {
+ return commonConfig.interactiveEnabled && (nonMobile() || interactiveMobileEnabled())
+ }
+
+ /**
+ * @returns {boolean} true when device is not mobile, false otherwise
+ */
+ function nonMobile() {
+ return !commonConfig.isMobile
+ }
+
+ /**
+ * @returns {boolean} true if and only if the device is mobile
+ * and interactive map is enabled
+ */
+ function interactiveMobileEnabled() {
+ return commonConfig.isMobile && commonConfig.interactiveMobileEnabled;
+ }
+
+ /**
+ * Set interactive display map mode based on passed boolean argument
+ * Note, that static fallback is specifically displayed by default in case current script fails to be loaded
+ */
+ function interactiveMapMode(enabled) {
+ commonElements.staticMap.style.display = enabled ? "none" : "block";
+ commonElements.interactiveMap.style.display = enabled ? "block" : "none";
+ }
+
+ /**
+ * Determine card side using predefined names from configuration.
+ * Note that current card side is figured out via accessing the value of
+ * data attribute of the <script> element invoking the program
+ */
+ function cardSide(cardSideName) {
+ return commonConfig.cardSide === cardSideName;
+ }
+
+ /**
+ * Throw an error if region code specified in the card field is absent in the map object to indicate
+ * the reason of static map display and to automatically undo enabled interactive map mode
+ */
+ function failInvalidRegionCode() {
+ let usedMapObj = window[commonConfig.mapSvgId];
+ if (!usedMapObj.paths[commonConfig.regionCode])
+ throw Error(`Region code "${commonConfig.regionCode || "empty"}" does not exist in the map`);
+ }
+
+ /**
+ * Initialization of the map displayed on the front side of the card
+ */
+ function initFrontMap() {
+ new jsVectorMap({
+ ...commonMap,
+ regionsSelectable: true,
+ regionsSelectableOne: true,
+
+ regionStyle: {
+ ...commonMap.regionStyle,
+ selected: {fill: commonColors.selectedRegion}
+ },
+
+ onRegionSelected: swapToBackSide,
+
+ ...mobileSwipingHack(false)
+ });
+ }
+
+ /**
+ * Initialization of the map displayed on the back side of the card
+ */
+ function initBackMap() {
+ new jsVectorMap({
+ ...commonMap,
+ selectedRegions: [commonConfig.regionCode],
+
+ regionStyle: {
+ ...commonMap.regionStyle,
+ selected: {fill: getRegionColor()}
+ },
+ focusOn: {
+ region: commonConfig.regionCode,
+ animate: true
+ },
+
+ ...mobileSwipingHack(commonConfig.toolTipEnabled, (event, tooltip) => {
+ tooltip._tooltip.style.backgroundColor = commonColors.tooltipBackground;
+ tooltip._tooltip.style.color = commonColors.tooltipText;
+ })
+ });
+ }
+
+ /**
+ * Jsvectormap logic incompatibility with project specifics - tooltips are inserted
+ * as direct children of <body> element and get persisted during cards review session
+ * accumulating and littering the canvas. Current handling is temporary fix until library issue is resolved
+ */
+ function clearTooltips() {
+ commonElements.mapTooltips.forEach(x => x.remove());
+ }
+
+ /**
+ * Jsvectormap library bug - map swiping does not work on mobile with disabled tooltip.
+ * Enable tooltip and hide it in case original tooltip is not displayable.
+ * Current handling is temporary fix until library issue is resolved
+ */
+ function mobileSwipingHack(tooltipEnabled, tooltipShowHandler) {
+ return commonConfig.isMobile
+ ? {
+ showTooltip: true,
+ onRegionTooltipShow(event, tooltip) {
+ if (tooltipEnabled && tooltipShowHandler)
+ tooltipShowHandler(event, tooltip)
+ else
+ tooltip._tooltip.style.display = "none";
+ }
+ }
+ : {
+ showTooltip: tooltipEnabled,
+ onRegionTooltipShow: tooltipShowHandler
+ }
+ }
+
+ /**
+ * After region on the front card side is selected persist its region code and
+ * swap the card to back side if configuration allows to do so. The action is
+ * achieved via sending "Enter" key event on manually defined hidden text area
+ */
+ function swapToBackSide(selectedRegionCode) {
+ sessionStorage.setItem(commonConfig.selectedRegionSessionKey, selectedRegionCode);
+
+ if (!commonConfig.autoAnswerEnabled)
+ return
+
+ if (!commonElements.hiddenTextarea.onkeypress)
+ commonElements.hiddenTextarea.onkeypress = () => _typeAnsPress();
+
+ if (typeof AnkiDroidJS !== "undefined") {
+ showAnswer();
+ } else {
+ commonElements.hiddenTextarea.dispatchEvent(new KeyboardEvent("keypress", {code: "Enter"}));
+ }
+ }
+
+ /**
+ * Retrieve region highlighting color for answer card side
+ * depending on the configuration and whether the selected
+ * by the user on question side region is correct
+ */
+ function getRegionColor() {
+ return commonConfig.regionCode === sessionStorage.getItem(commonConfig.selectedRegionSessionKey)
+ ? commonColors.correctRegionHighlight
+ : commonColors.incorrectRegionHighlight;
+ }
+}())
diff --git a/src/media/experimental_assets/_ug-jsvectormap.js b/src/media/experimental_assets/_ug-jsvectormap.js
new file mode 100644
index 00000000..7091f1be
--- /dev/null
+++ b/src/media/experimental_assets/_ug-jsvectormap.js
@@ -0,0 +1 @@
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).jsVectorMap=e()}(this,(function(){"use strict";var t=function(t){return function(t){return!!t&&"object"==typeof t}(t)&&!function(t){var i=Object.prototype.toString.call(t);return"[object RegExp]"===i||"[object Date]"===i||function(t){return t instanceof Node}(t)||function(t){return t.$$typeof===e}(t)}(t)};var e="function"==typeof Symbol&&Symbol.for?Symbol.for("react.element"):60103;function i(t,e){return!1!==e.clone&&e.isMergeableObject(t)?o((i=t,Array.isArray(i)?[]:{}),t,e):t;var i}function s(t,e,s){return t.concat(e).map((function(t){return i(t,s)}))}function a(t){return Object.keys(t).concat(function(t){return Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(t).filter((function(e){return t.propertyIsEnumerable(e)})):[]}(t))}function n(t,e){try{return e in t}catch(t){return!1}}function r(t,e,s){var r={};return s.isMergeableObject(t)&&a(t).forEach((function(e){r[e]=i(t[e],s)})),a(e).forEach((function(a){(function(t,e){return n(t,e)&&!(Object.hasOwnProperty.call(t,e)&&Object.propertyIsEnumerable.call(t,e))})(t,a)||(n(t,a)&&s.isMergeableObject(e[a])?r[a]=function(t,e){if(!e.customMerge)return o;var i=e.customMerge(t);return"function"==typeof i?i:o}(a,s)(t[a],e[a],s):r[a]=i(e[a],s))})),r}var o=function(e,a,n){(n=n||{}).arrayMerge=n.arrayMerge||s,n.isMergeableObject=n.isMergeableObject||t,n.cloneUnlessOtherwiseSpecified=i;var o=Array.isArray(a);return o===Array.isArray(e)?o?n.arrayMerge(e,a,n):r(e,a,n):i(a,n)},h=function(t){return"object"==typeof t&&void 0!==t.nodeType?t:"string"==typeof t?document.querySelector(t):null},l=function(t,e,i,s){void 0===s&&(s=!1);var a=document.createElement(t);return i&&(a[s?"innerHTML":"textContent"]=i),e&&(a.className=e),a},c=function(t){t.parentNode.removeChild(t)},u=function(t,e,i){return void 0===i&&(i=!1),i?o(t,e):Object.assign(t,e)},p=function(t,e){return t.toLowerCase()+":to:"+e.toLowerCase()},d=function(t,e){Object.assign(t.prototype,e)},f={},m=1,g={on:function(t,e,i,s){void 0===s&&(s={});var a="jvm:"+e+"::"+m++;f[a]={selector:t,handler:i},i._uid=a,t.addEventListener(e,i,s)},delegate:function(t,e,i,s){(e=e.split(" ")).forEach((function(e){g.on(t,e,(function(t){var e=t.target;e.matches(i)&&s.call(e,t)}))}))},off:function(t,e,i){var s=e.split(":")[1];t.removeEventListener(s,i),delete f[i._uid]},flush:function(){Object.keys(f).forEach((function(t){g.off(f[t].selector,t,f[t].handler)}))},getEventRegistry:function(){return f}};var v={onLoaded:"map:loaded",onViewportChange:"viewport:changed",onRegionClick:"region:clicked",onMarkerClick:"marker:clicked",onRegionSelected:"region:selected",onMarkerSelected:"marker:selected",onRegionTooltipShow:"region.tooltip:show",onMarkerTooltipShow:"marker.tooltip:show",onDestroyed:"map:destroyed"},_=function(t,e,i){var s=h(e),a=-1===s.getAttribute("class").indexOf("jvm-region")?"marker":"region",n="region"===a,r=n?s.getAttribute("data-code"):s.getAttribute("data-index"),o=n?v.onRegionSelected:v.onMarkerSelected;return i&&(o=n?v.onRegionTooltipShow:v.onMarkerTooltipShow),{type:a,code:r,event:o,element:n?t.regions[r].element:t._markers[r].element,tooltipText:n?t._mapData.paths[r].name||"":t._markers[r].config.name||""}};function y(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,s=Array(e);i=t.length?{done:!0}:{done:!1,value:t[s++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function S(){return S=Object.assign?Object.assign.bind():function(t){for(var e=1;e>10||1),a=i.container.getBoundingClientRect(),n=t.pageX-a.left-window.pageXOffset,r=t.pageY-a.top-window.pageYOffset,o=Math.pow(1+s.params.zoomOnScrollSpeed/1e3,-1.5*e);s.tooltip&&s._tooltip.hide(),s._setScale(s.scale*o,n,r),t.preventDefault()}))},_setupElementEvents:function(){var t,e,i,s=this,a=this.container;g.on(a,"mousemove",(function(s){Math.abs(t-s.pageX)+Math.abs(e-s.pageY)>2&&(i=!0)})),g.delegate(a,"mousedown",".jvm-element",(function(s){t=s.pageX,e=s.pageY,i=!1})),g.delegate(a,"mouseover mouseout",".jvm-element",(function(t){var e=_(s,this,!0),i=s.params.showTooltip;"mouseover"===t.type?(e.element.hover(!0),i&&(s._tooltip.text(e.tooltipText),s._tooltip.show(),s._emit(e.event,[t,s._tooltip,e.code]))):(e.element.hover(!1),i&&s._tooltip.hide())})),g.delegate(a,"mouseup",".jvm-element",(function(t){var e=_(s,this);if(!i&&("region"===e.type&&s.params.regionsSelectable||"marker"===e.type&&s.params.markersSelectable)){var a=e.element;s.params[e.type+"sSelectableOne"]&&s._clearSelected(e.type+"s"),e.element.isSelected?a.select(!1):a.select(!0),s._emit(e.event,[e.code,a.isSelected,s._getSelected(e.type+"s")])}})),g.delegate(a,"click",".jvm-element",(function(t){var e=_(s,this),i=e.type,a=e.code;s._emit("region"===i?v.onRegionClick:v.onMarkerClick,[t,a])}))},_setupZoomButtons:function(){var t=this,e=l("div","jvm-zoom-btn jvm-zoomin","+",!0),i=l("div","jvm-zoom-btn jvm-zoomout","−",!0);this.container.appendChild(e),this.container.appendChild(i);var s=function(e){return void 0===e&&(e=!0),function(){return t._setScale(e?t.scale*t.params.zoomStep:t.scale/t.params.zoomStep,t._width/2,t._height/2,!1,t.params.zoomAnimate)}};g.on(e,"click",s()),g.on(i,"click",s(!1))},_setupContainerTouchEvents:function(){var t,e,i,s,a,n,r,o=this,h=function(h){var l,c,u,p,d=h.touches;if("touchstart"==h.type&&(r=0),1==d.length)1==r&&(u=o.transX,p=o.transY,o.transX-=(i-d[0].pageX)/o.scale,o.transY-=(s-d[0].pageY)/o.scale,o._tooltip.hide(),o._applyTransform(),u==o.transX&&p==o.transY||h.preventDefault()),i=d[0].pageX,s=d[0].pageY;else if(2==d.length)if(2==r)c=Math.sqrt(Math.pow(d[0].pageX-d[1].pageX,2)+Math.pow(d[0].pageY-d[1].pageY,2))/e,o._setScale(t*c,a,n),o._tooltip.hide(),h.preventDefault();else{var f=o.container.getBoundingClientRect();l={top:f.top+window.scrollY,left:f.left+window.scrollX},a=d[0].pageX>d[1].pageX?d[1].pageX+(d[0].pageX-d[1].pageX)/2:d[0].pageX+(d[1].pageX-d[0].pageX)/2,n=d[0].pageY>d[1].pageY?d[1].pageY+(d[0].pageY-d[1].pageY)/2:d[0].pageY+(d[1].pageY-d[0].pageY)/2,a-=l.left,n-=l.top,t=o.scale,e=Math.sqrt(Math.pow(d[0].pageX-d[1].pageX,2)+Math.pow(d[0].pageY-d[1].pageY,2))}r=d.length};g.on(o.container,"touchstart",h),g.on(o.container,"touchmove",h)},_createRegions:function(){for(var t in this._regionLabelsGroup=this._regionLabelsGroup||this.canvas.createGroup("jvm-regions-labels-group"),this._mapData.paths){var e=new j({map:this,code:t,path:this._mapData.paths[t].path,style:u({},this.params.regionStyle),labelStyle:this.params.regionLabelStyle,labelsGroup:this._regionLabelsGroup,label:this.params.labels&&this.params.labels.regions});this.regions[t]={config:this._mapData.paths[t],element:e}}},_createLines:function(t,e,i){void 0===i&&(i=!1);var s=!1,a=!1;for(var n in this.linesGroup=this.linesGroup||this.canvas.createGroup("jvm-lines-group"),t){var r=t[n];for(var o in e){var h=i?e[o].config:e[o];h.name===r.from&&(s=this.getMarkerPosition(h)),h.name===r.to&&(a=this.getMarkerPosition(h))}!1!==s&&!1!==a&&(this._lines[p(r.from,r.to)]=new C({index:n,map:this,style:u({initial:this.params.lineStyle},{initial:r.style||{}},!0),x1:s.x,y1:s.y,x2:a.x,y2:a.y,group:this.linesGroup,config:r}))}},_createMarkers:function(t,e){var i=this;void 0===t&&(t={}),void 0===e&&(e=!1),this._markersGroup=this._markersGroup||this.canvas.createGroup("jvm-markers-group"),this._markerLabelsGroup=this._markerLabelsGroup||this.canvas.createGroup("jvm-markers-labels-group");var s=function(){var s=t[a],n=i.getMarkerPosition(s),r=s.coords.join(":");if(!n)return 0;if(e){if(Object.keys(i._markers).filter((function(t){return i._markers[t]._uid===r})).length)return 0;a=Object.keys(i._markers).length}var o=new L({index:a,map:i,style:u(i.params.markerStyle,S({},s.style||{}),!0),label:i.params.labels&&i.params.labels.markers,labelsGroup:i._markerLabelsGroup,cx:n.x,cy:n.y,group:i._markersGroup,marker:s,isRecentlyCreated:e});i._markers[a]&&i.removeMarkers([a]),i._markers[a]={_uid:r,config:s,element:o}};for(var a in t)s()},_createSeries:function(){for(var t in this.series={markers:[],regions:[]},this.params.series)for(var e=0;ee?this.transY=e:this.transYt?this.transX=t:this.transXthis._defaultWidth/this._defaultHeight?(this._baseScale=this._height/this._defaultHeight,this._baseTransX=Math.abs(this._width-this._defaultWidth*this._baseScale)/(2*this._baseScale)):(this._baseScale=this._width/this._defaultWidth,this._baseTransY=Math.abs(this._height-this._defaultHeight*this._baseScale)/(2*this._baseScale)),this.scale*=this._baseScale/t,this.transX*=this._baseScale/t,this.transY*=this._baseScale/t},_setScale:function(t,e,i,s,a){var n,r,o,h,l,c,u,p,d,f,m=this,g=0,_=Math.abs(Math.round(60*(t-this.scale)/Math.max(t,this.scale)));t>this.params.zoomMax*this._baseScale?t=this.params.zoomMax*this._baseScale:t0?(o=this.scale,h=(t-o)/_,l=this.transX*this.scale,u=this.transY*this.scale,c=(d*t-l)/_,p=(f*t-u)/_,r=setInterval((function(){g+=1,m.scale=o+h*g,m.transX=(l+c*g)/m.scale,m.transY=(u+p*g)/m.scale,m._applyTransform(),g==_&&(clearInterval(r),m._emit(v.onViewportChange,[m.scale,m.transX,m.transY]))}),10)):(this.transX=d,this.transY=f,this.scale=t,this._applyTransform(),this._emit(v.onViewportChange,[this.scale,this.transX,this.transY]))},setFocus:function(t){var e=this;void 0===t&&(t={});var i,s=[];if(t.region?s.push(t.region):t.regions&&(s=t.regions),s.length)return s.forEach((function(t){if(e.regions[t]){var s=e.regions[t].element.shape.getBBox();s&&(i=void 0===i?s:{x:Math.min(i.x,s.x),y:Math.min(i.y,s.y),width:Math.max(i.x+i.width,s.x+s.width)-Math.min(i.x,s.x),height:Math.max(i.y+i.height,s.y+s.height)-Math.min(i.y,s.y)})}})),this._setScale(Math.min(this._width/i.width,this._height/i.height),-(i.x+i.width/2),-(i.y+i.height/2),!0,t.animate);if(t.coords){var a=this.coordsToPoint(t.coords[0],t.coords[1]),n=this.transX-a.x/this.scale,r=this.transY-a.y/this.scale;return this._setScale(t.scale*this._baseScale,n,r,!0,t.animate)}},updateSize:function(){this._width=this.container.offsetWidth,this._height=this.container.offsetHeight,this._resize(),this.canvas.setSize(this._width,this._height),this._applyTransform()},coordsToPoint:function(t,e){var i=V.maps[this.params.map].projection,s=O[i.type](t,e,i.centralMeridian),a=s.x,n=s.y,r=this.getInsetForPoint(a,n);if(!r)return!1;var o=r.bbox;return a=(a-o[0].x)/(o[1].x-o[0].x)*r.width*this.scale,n=(n-o[0].y)/(o[1].y-o[0].y)*r.height*this.scale,{x:a+this.transX*this.scale+r.left*this.scale,y:n+this.transY*this.scale+r.top*this.scale}},getInsetForPoint:function(t,e){for(var i=V.maps[this.params.map].insets,s=0;sn.x&&tn.y&ðis.max&&(this.max=e),e-1)})),this._markers,!0)},e.removeLines=function(t){var e=this;(t=Array.isArray(t)?t.map((function(t){return p(t.from,t.to)})):this._getLinesAsUids()).forEach((function(t){e._lines[t].dispose(),delete e._lines[t]}))},e.removeLine=function(t,e){console.warn("`removeLine` method is deprecated, please use `removeLines` instead.");var i=p(t,e);this._lines.hasOwnProperty(i)&&(this._lines[i].element.remove(),delete this._lines[i])},e.reset=function(){for(var t in this.series)for(var e=0;e img,
.value > .placeholder {
max-width: 100%;
diff --git a/src/note_models/templates/Country - Map [Experimental].html b/src/note_models/templates/Country - Map [Experimental].html
new file mode 100644
index 00000000..97272bf4
--- /dev/null
+++ b/src/note_models/templates/Country - Map [Experimental].html
@@ -0,0 +1,62 @@
+
+{{Country}}
+
+
+Location
+
+
+
+
+
+
+
+
+
+
+--
+
+{{Country}}
+{{#Country info}}{{Country info}}
{{/Country info}}
+
+
+
+Location
+
+{{Map}}
+
+
+
+
+