]> git.openstreetmap.org Git - rails.git/commitdiff
Merge remote-tracking branch 'upstream/pull/4882' master live
authorTom Hughes <tom@compton.nu>
Thu, 6 Jun 2024 18:09:15 +0000 (19:09 +0100)
committerTom Hughes <tom@compton.nu>
Thu, 6 Jun 2024 18:09:15 +0000 (19:09 +0100)
183 files changed:
CONTRIBUTING.md
Gemfile
Gemfile.lock
INSTALL.md
README.md
app/assets/images/about/sprite.png [deleted file]
app/assets/images/about/sprite.svg [deleted file]
app/assets/images/about/sprite@2x.png [deleted file]
app/assets/images/closed_note_marker.png [deleted file]
app/assets/images/closed_note_marker.svg [new file with mode: 0644]
app/assets/images/closed_note_marker@2x.png [deleted file]
app/assets/images/directions.png [deleted file]
app/assets/images/menu-icon.png [deleted file]
app/assets/images/menu-icon.svg [new file with mode: 0644]
app/assets/images/new_note_marker.png [deleted file]
app/assets/images/new_note_marker.svg [new file with mode: 0644]
app/assets/images/new_note_marker@2x.png [deleted file]
app/assets/images/open_note_marker.png [deleted file]
app/assets/images/open_note_marker.svg [new file with mode: 0644]
app/assets/images/open_note_marker@2x.png [deleted file]
app/assets/images/openid.svg [new file with mode: 0644]
app/assets/images/openid_small.png [deleted file]
app/assets/images/routing-sprite.png [deleted file]
app/assets/images/routing-sprite.svg
app/assets/images/welcome-sprite.png [deleted file]
app/assets/images/welcome-sprite.svg [deleted file]
app/assets/javascripts/application.js
app/assets/javascripts/index/browse.js
app/assets/javascripts/index/directions.js
app/assets/javascripts/index/note.js
app/assets/javascripts/index/search.js
app/assets/javascripts/leaflet.layers.js
app/assets/javascripts/leaflet.share.js
app/assets/javascripts/osm.js.erb
app/assets/stylesheets/common.scss
app/controllers/accounts_controller.rb
app/controllers/api/capabilities_controller.rb
app/controllers/api/changeset_comments_controller.rb
app/controllers/api/changesets_controller.rb
app/controllers/api/map_controller.rb
app/controllers/api/nodes_controller.rb
app/controllers/api/notes_controller.rb
app/controllers/api/old_elements_controller.rb
app/controllers/api/permissions_controller.rb
app/controllers/api/relations_controller.rb
app/controllers/api/tracepoints_controller.rb
app/controllers/api/traces_controller.rb
app/controllers/api/user_blocks_controller.rb
app/controllers/api/user_preferences_controller.rb
app/controllers/api/users_controller.rb
app/controllers/api/versions_controller.rb
app/controllers/api/ways_controller.rb
app/controllers/api_controller.rb
app/controllers/application_controller.rb
app/controllers/changesets_controller.rb
app/controllers/concerns/pagination_methods.rb
app/controllers/concerns/session_methods.rb
app/controllers/diary_entries_controller.rb
app/controllers/errors_controller.rb
app/controllers/export_controller.rb
app/controllers/friendships_controller.rb
app/controllers/messages_controller.rb
app/controllers/notes_controller.rb
app/controllers/oauth2_authorizations_controller.rb
app/controllers/oauth_controller.rb
app/controllers/sessions_controller.rb
app/controllers/site_controller.rb
app/controllers/traces/icons_controller.rb
app/controllers/traces/pictures_controller.rb
app/controllers/users_controller.rb
app/helpers/browse_tags_helper.rb
app/helpers/open_graph_helper.rb
app/helpers/user_helper.rb
app/models/diary_entry.rb
app/models/issue.rb
app/models/trace.rb
app/models/user.rb
app/views/accounts/edit.html.erb
app/views/application/_auth_providers.html.erb
app/views/browse/_node.html.erb
app/views/browse/_relation.html.erb
app/views/browse/_way.html.erb
app/views/changesets/_heading.html.erb
app/views/changesets/show.html.erb
app/views/confirmations/confirm.html.erb
app/views/dashboards/_contact.html.erb
app/views/diary_entries/_diary_comment.html.erb
app/views/diary_entries/_diary_entry.html.erb
app/views/diary_entries/_diary_entry_heading.html.erb
app/views/diary_entries/comments.html.erb
app/views/diary_entries/show.html.erb
app/views/errors/bad_request.html.erb [new file with mode: 0644]
app/views/issues/_comments.html.erb
app/views/issues/_reports.html.erb
app/views/issues/show.html.erb
app/views/layouts/_head.html.erb
app/views/layouts/_header.html.erb
app/views/layouts/_inbox.html.erb [deleted file]
app/views/layouts/_meta.html.erb
app/views/layouts/_search.html.erb
app/views/notes/index.html.erb
app/views/notes/new.html.erb
app/views/notes/show.html.erb
app/views/oauth2_applications/_application.html.erb
app/views/oauth2_applications/show.html.erb
app/views/profiles/edit.html.erb
app/views/sessions/new.html.erb
app/views/site/_about_section.html.erb [deleted file]
app/views/site/_any_questions.html.erb
app/views/site/about.html.erb
app/views/site/fixthemap.html.erb
app/views/site/welcome.html.erb
app/views/traces/_trace.html.erb
app/views/users/new.html.erb
app/views/users/show.html.erb
app/views/users/terms.html.erb
config/brakeman.ignore [new file with mode: 0644]
config/initializers/abstract_adapter.rb
config/initializers/content_security_policy.rb
config/initializers/cors.rb
config/initializers/i18n.rb
config/initializers/mail_delivery_job.rb
config/initializers/oauth.rb
config/initializers/router.rb
config/initializers/rtlcss.rb
config/initializers/secure_headers.rb [deleted file]
config/initializers/session_store.rb
config/locales/README
config/locales/be.yml
config/locales/bg.yml
config/locales/bn.yml
config/locales/br.yml
config/locales/ce.yml
config/locales/cs.yml
config/locales/de.yml
config/locales/diq.yml
config/locales/el.yml
config/locales/en.yml
config/locales/eo.yml
config/locales/et.yml
config/locales/fi.yml
config/locales/fr.yml
config/locales/gl.yml
config/locales/he.yml
config/locales/ia.yml
config/locales/it.yml
config/locales/ko.yml
config/locales/lb.yml
config/locales/mk.yml
config/locales/ms.yml
config/locales/ne.yml
config/locales/pa.yml
config/locales/pl.yml
config/locales/pt-PT.yml
config/locales/pt.yml
config/locales/ru.yml
config/locales/skr-arab.yml
config/locales/sl.yml
config/locales/sr.yml
config/locales/sv.yml
config/locales/tr.yml
config/locales/uk.yml
config/locales/zh-CN.yml
config/locales/zh-TW.yml
config/routes.rb
config/settings.yml
lib/osm.rb
lib/rich_text.rb
test/controllers/api/capabilities_controller_test.rb
test/controllers/api/user_preferences_controller_test.rb
test/controllers/api/versions_controller_test.rb
test/controllers/changesets_controller_test.rb
test/controllers/diary_entries_controller_test.rb
test/controllers/errors_controller_test.rb
test/controllers/notes_controller_test.rb
test/controllers/traces_controller_test.rb
test/controllers/user_blocks_controller_test.rb
test/controllers/users_controller_test.rb
test/helpers/browse_tags_helper_test.rb
test/helpers/user_helper_test.rb
test/integration/user_creation_test.rb
test/lib/rich_text_test.rb
yarn.lock

index ddd959664ebaea6597d450e2861562f0fe02930e..f19b2e2673dc80def557ea7ba8c09f77e2a6bab6 100644 (file)
@@ -1,5 +1,5 @@
 * https://www.ruby-lang.org/ - The homepage of Ruby which has more links and some great tutorials.
-* http://rubyonrails.org/ - The homepage of Rails, also has links and tutorials
+* https://rubyonrails.org/ - The homepage of Rails, also has links and tutorials.
 
 ## Coding style
 
diff --git a/Gemfile b/Gemfile
index 5385e1217978d7a7c4cfcf41fd459923e2f7b551..77a9f1c97ff252c30ce1cd4f66dbd1034c1307ec 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -63,6 +63,7 @@ gem "oauth-plugin", ">= 0.5.1"
 gem "openstreetmap-deadlock_retry", ">= 1.3.1", :require => "deadlock_retry"
 gem "rack-cors"
 gem "rails-i18n", "~> 7.0.0"
+gem "rails_param"
 gem "rinku", ">= 2.0.6", :require => "rails_rinku"
 gem "strong_migrations"
 gem "validates_email_format_of", ">= 1.5.1"
@@ -115,9 +116,6 @@ gem "connection_pool"
 gem "dalli"
 gem "kgio"
 
-# Load secure_headers for Content-Security-Policy support
-gem "secure_headers"
-
 # Load canonical-rails to generate canonical URLs
 gem "canonical-rails"
 
@@ -142,6 +140,9 @@ gem "image_processing"
 # Used to validate widths
 gem "unicode-display_width"
 
+# Keep ruby 3.0 compatibility
+gem "multi_xml", "~> 0.6.0"
+
 # Gems useful for development
 group :development do
   gem "better_errors"
index 62a312dca9addedf8700e42c8e818d72528f4723..392976e465681062230bea15d43306afd92e4f7d 100644 (file)
@@ -3,35 +3,35 @@ GEM
   specs:
     aasm (5.5.0)
       concurrent-ruby (~> 1.0)
-    actioncable (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actioncable (7.1.3.4)
+      actionpack (= 7.1.3.4)
+      activesupport (= 7.1.3.4)
       nio4r (~> 2.0)
       websocket-driver (>= 0.6.1)
       zeitwerk (~> 2.6)
-    actionmailbox (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      activejob (= 7.1.3.2)
-      activerecord (= 7.1.3.2)
-      activestorage (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actionmailbox (7.1.3.4)
+      actionpack (= 7.1.3.4)
+      activejob (= 7.1.3.4)
+      activerecord (= 7.1.3.4)
+      activestorage (= 7.1.3.4)
+      activesupport (= 7.1.3.4)
       mail (>= 2.7.1)
       net-imap
       net-pop
       net-smtp
-    actionmailer (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      actionview (= 7.1.3.2)
-      activejob (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actionmailer (7.1.3.4)
+      actionpack (= 7.1.3.4)
+      actionview (= 7.1.3.4)
+      activejob (= 7.1.3.4)
+      activesupport (= 7.1.3.4)
       mail (~> 2.5, >= 2.5.4)
       net-imap
       net-pop
       net-smtp
       rails-dom-testing (~> 2.2)
-    actionpack (7.1.3.2)
-      actionview (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actionpack (7.1.3.4)
+      actionview (= 7.1.3.4)
+      activesupport (= 7.1.3.4)
       nokogiri (>= 1.8.5)
       racc
       rack (>= 2.2.4)
@@ -41,39 +41,39 @@ GEM
       rails-html-sanitizer (~> 1.6)
     actionpack-page_caching (1.2.4)
       actionpack (>= 4.0.0)
-    actiontext (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      activerecord (= 7.1.3.2)
-      activestorage (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actiontext (7.1.3.4)
+      actionpack (= 7.1.3.4)
+      activerecord (= 7.1.3.4)
+      activestorage (= 7.1.3.4)
+      activesupport (= 7.1.3.4)
       globalid (>= 0.6.0)
       nokogiri (>= 1.8.5)
-    actionview (7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actionview (7.1.3.4)
+      activesupport (= 7.1.3.4)
       builder (~> 3.1)
       erubi (~> 1.11)
       rails-dom-testing (~> 2.2)
       rails-html-sanitizer (~> 1.6)
     active_record_union (1.3.0)
       activerecord (>= 4.0)
-    activejob (7.1.3.2)
-      activesupport (= 7.1.3.2)
+    activejob (7.1.3.4)
+      activesupport (= 7.1.3.4)
       globalid (>= 0.3.6)
-    activemodel (7.1.3.2)
-      activesupport (= 7.1.3.2)
-    activerecord (7.1.3.2)
-      activemodel (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    activemodel (7.1.3.4)
+      activesupport (= 7.1.3.4)
+    activerecord (7.1.3.4)
+      activemodel (= 7.1.3.4)
+      activesupport (= 7.1.3.4)
       timeout (>= 0.4.0)
-    activerecord-import (1.6.0)
+    activerecord-import (1.7.0)
       activerecord (>= 4.2)
-    activestorage (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      activejob (= 7.1.3.2)
-      activerecord (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    activestorage (7.1.3.4)
+      actionpack (= 7.1.3.4)
+      activejob (= 7.1.3.4)
+      activerecord (= 7.1.3.4)
+      activesupport (= 7.1.3.4)
       marcel (~> 1.0)
-    activesupport (7.1.3.2)
+    activesupport (7.1.3.4)
       base64
       bigdecimal
       concurrent-ruby (~> 1.0, >= 1.0.2)
@@ -95,16 +95,16 @@ GEM
     autoprefixer-rails (10.4.16.0)
       execjs (~> 2)
     aws-eventstream (1.3.0)
-    aws-partitions (1.925.0)
-    aws-sdk-core (3.194.1)
+    aws-partitions (1.938.0)
+    aws-sdk-core (3.196.1)
       aws-eventstream (~> 1, >= 1.3.0)
       aws-partitions (~> 1, >= 1.651.0)
       aws-sigv4 (~> 1.8)
       jmespath (~> 1, >= 1.6.1)
-    aws-sdk-kms (1.80.0)
+    aws-sdk-kms (1.82.0)
       aws-sdk-core (~> 3, >= 3.193.0)
       aws-sigv4 (~> 1.1)
-    aws-sdk-s3 (1.149.1)
+    aws-sdk-s3 (1.151.0)
       aws-sdk-core (~> 3, >= 3.194.0)
       aws-sdk-kms (~> 1)
       aws-sigv4 (~> 1.8)
@@ -140,7 +140,7 @@ GEM
     builder (3.2.4)
     bzip2-ffi (1.1.1)
       ffi (~> 1.0)
-    cancancan (3.5.0)
+    cancancan (3.6.1)
     canonical-rails (0.2.15)
       actionview (>= 4.1, <= 7.2)
     capybara (3.40.0)
@@ -152,8 +152,8 @@ GEM
       rack-test (>= 0.6.3)
       regexp_parser (>= 1.5, < 3.0)
       xpath (~> 3.2)
-    concurrent-ruby (1.2.3)
-    config (5.4.0)
+    concurrent-ruby (1.3.1)
+    config (5.5.1)
       deep_merge (~> 1.2, >= 1.2.1)
     connection_pool (2.4.1)
     crack (1.0.0)
@@ -198,7 +198,7 @@ GEM
       concurrent-ruby (~> 1.0)
       dry-core (~> 1.0, < 2)
       zeitwerk (~> 2.6)
-    dry-schema (1.13.3)
+    dry-schema (1.13.4)
       concurrent-ruby (~> 1.0)
       dry-configurable (~> 1.0, >= 1.0.1)
       dry-core (~> 1.0, < 2)
@@ -238,7 +238,7 @@ GEM
       faraday-net_http (>= 2.0, < 3.2)
     faraday-net_http (3.1.0)
       net-http
-    ffi (1.16.3)
+    ffi (1.17.0)
     ffi-compiler (1.3.2)
       ffi (>= 1.15.5)
       rake
@@ -262,10 +262,9 @@ GEM
       concurrent-ruby (~> 1.0)
     i18n-js (3.9.2)
       i18n (>= 0.6.6)
-    i18n-tasks (1.0.13)
+    i18n-tasks (1.0.14)
       activesupport (>= 4.0.2)
       ast (>= 2.1.0)
-      better_html (>= 1.0, < 3.0)
       erubi
       highline (>= 2.0.0)
       i18n
@@ -328,10 +327,10 @@ GEM
     maxminddb (0.1.22)
     mini_magick (4.12.0)
     mini_mime (1.1.5)
-    mini_portile2 (2.8.6)
+    mini_portile2 (2.8.7)
     mini_racer (0.9.0)
       libv8-node (~> 18.19.0.0)
-    minitest (5.22.3)
+    minitest (5.23.1)
     minitest-focus (1.4.0)
       minitest (>= 4, < 6)
     msgpack (1.7.2)
@@ -340,7 +339,7 @@ GEM
     mutex_m (0.2.0)
     net-http (0.4.1)
       uri
-    net-imap (0.4.10)
+    net-imap (0.4.12)
       date
       net-protocol
     net-pop (0.1.2)
@@ -349,8 +348,8 @@ GEM
       timeout
     net-smtp (0.5.0)
       net-protocol
-    nio4r (2.7.2)
-    nokogiri (1.16.4)
+    nio4r (2.7.3)
+    nokogiri (1.16.5)
       mini_portile2 (~> 2.8.2)
       racc (~> 1.4)
     oauth (0.4.7)
@@ -370,8 +369,9 @@ GEM
       hashie (>= 3.4.6)
       rack (>= 1.6.2, < 3)
       rack-protection
-    omniauth-facebook (9.0.0)
-      omniauth-oauth2 (~> 1.2)
+    omniauth-facebook (10.0.0)
+      bigdecimal
+      omniauth-oauth2 (>= 1.2, < 3)
     omniauth-github (2.0.1)
       omniauth (~> 2.0)
       omniauth-oauth2 (~> 1.8)
@@ -383,7 +383,7 @@ GEM
     omniauth-mediawiki (0.0.4)
       jwt (~> 2.0)
       omniauth-oauth (~> 1.0)
-    omniauth-microsoft_graph (2.0.0)
+    omniauth-microsoft_graph (2.0.1)
       jwt (~> 2.0)
       omniauth (~> 2.0)
       omniauth-oauth2 (~> 1.8.0)
@@ -396,12 +396,12 @@ GEM
     omniauth-openid (2.0.1)
       omniauth (>= 1.0, < 3.0)
       rack-openid (~> 1.4.0)
-    omniauth-rails_csrf_protection (1.0.1)
+    omniauth-rails_csrf_protection (1.0.2)
       actionpack (>= 4.2)
       omniauth (~> 2.0)
     openstreetmap-deadlock_retry (1.3.1)
     parallel (1.24.0)
-    parser (3.3.1.0)
+    parser (3.3.2.0)
       ast (~> 2.4.1)
       racc
     pg (1.5.6)
@@ -413,7 +413,7 @@ GEM
     puma (5.6.8)
       nio4r (~> 2.0)
     quad_tile (1.0.1)
-    racc (1.7.3)
+    racc (1.8.0)
     rack (2.2.9)
     rack-cors (2.0.2)
       rack (>= 2.0.0)
@@ -431,20 +431,20 @@ GEM
     rackup (1.0.0)
       rack (< 3)
       webrick
-    rails (7.1.3.2)
-      actioncable (= 7.1.3.2)
-      actionmailbox (= 7.1.3.2)
-      actionmailer (= 7.1.3.2)
-      actionpack (= 7.1.3.2)
-      actiontext (= 7.1.3.2)
-      actionview (= 7.1.3.2)
-      activejob (= 7.1.3.2)
-      activemodel (= 7.1.3.2)
-      activerecord (= 7.1.3.2)
-      activestorage (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    rails (7.1.3.4)
+      actioncable (= 7.1.3.4)
+      actionmailbox (= 7.1.3.4)
+      actionmailer (= 7.1.3.4)
+      actionpack (= 7.1.3.4)
+      actiontext (= 7.1.3.4)
+      actionview (= 7.1.3.4)
+      activejob (= 7.1.3.4)
+      activemodel (= 7.1.3.4)
+      activerecord (= 7.1.3.4)
+      activestorage (= 7.1.3.4)
+      activesupport (= 7.1.3.4)
       bundler (>= 1.15.0)
-      railties (= 7.1.3.2)
+      railties (= 7.1.3.4)
     rails-controller-testing (1.0.5)
       actionpack (>= 5.0.1.rc1)
       actionview (>= 5.0.1.rc1)
@@ -459,9 +459,12 @@ GEM
     rails-i18n (7.0.9)
       i18n (>= 0.7, < 2)
       railties (>= 6.0.0, < 8)
-    railties (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    rails_param (1.3.1)
+      actionpack (>= 3.2.0)
+      activesupport (>= 3.2.0)
+    railties (7.1.3.4)
+      actionpack (= 7.1.3.4)
+      activesupport (= 7.1.3.4)
       irb
       rackup (>= 1.0.0)
       rake (>= 12.2)
@@ -470,22 +473,23 @@ GEM
     rainbow (3.1.1)
     rake (13.2.1)
     rb-fsevent (0.11.2)
-    rb-inotify (0.10.1)
+    rb-inotify (0.11.1)
       ffi (~> 1.0)
-    rdoc (6.6.3.1)
+    rdoc (6.7.0)
       psych (>= 4.0.0)
-    regexp_parser (2.9.0)
-    reline (0.5.5)
+    regexp_parser (2.9.2)
+    reline (0.5.8)
       io-console (~> 0.5)
     request_store (1.7.0)
       rack (>= 1.4)
-    rexml (3.2.6)
+    rexml (3.2.8)
+      strscan (>= 3.0.9)
     rinku (2.0.6)
     rotp (6.3.0)
     rouge (4.2.1)
     rtlcss (0.2.1)
       mini_racer (>= 0.6.3)
-    rubocop (1.63.4)
+    rubocop (1.64.1)
       json (~> 2.3)
       language_server-protocol (>= 3.17.0)
       parallel (~> 1.10)
@@ -508,7 +512,7 @@ GEM
     rubocop-performance (1.21.0)
       rubocop (>= 1.48.1, < 2.0)
       rubocop-ast (>= 1.31.1, < 2.0)
-    rubocop-rails (2.24.1)
+    rubocop-rails (2.25.0)
       activesupport (>= 4.2.0)
       rack (>= 1.1)
       rubocop (>= 1.33.0, < 2.0)
@@ -526,8 +530,7 @@ GEM
     sass-embedded (1.64.2)
       google-protobuf (~> 3.23)
       rake (>= 13.0.0)
-    secure_headers (6.5.0)
-    selenium-webdriver (4.20.1)
+    selenium-webdriver (4.21.1)
       base64 (~> 0.2)
       rexml (~> 3.2, >= 3.2.5)
       rubyzip (>= 1.2.2, < 3.0)
@@ -539,8 +542,7 @@ GEM
     simplecov-html (0.12.3)
     simplecov-lcov (0.8.0)
     simplecov_json_formatter (0.1.4)
-    simpleidn (0.2.2)
-      unf (~> 0.1.4)
+    simpleidn (0.2.3)
     smart_properties (1.17.0)
     snaky_hash (2.0.1)
       hashie
@@ -558,6 +560,7 @@ GEM
     stringio (3.1.0)
     strong_migrations (1.8.0)
       activerecord (>= 5.2)
+    strscan (3.1.0)
     terminal-table (3.0.2)
       unicode-display_width (>= 1.1.1, < 3)
     terser (1.2.2)
@@ -571,9 +574,6 @@ GEM
       railties (>= 6.0.0)
     tzinfo (2.0.6)
       concurrent-ruby (~> 1.0)
-    unf (0.1.4)
-      unf_ext
-    unf_ext (0.0.9.1)
     unicode-display_width (2.5.0)
     uri (0.13.0)
     validates_email_format_of (1.8.2)
@@ -581,7 +581,7 @@ GEM
       simpleidn
     vendorer (0.2.0)
     version_gem (1.1.4)
-    webmock (3.23.0)
+    webmock (3.23.1)
       addressable (>= 2.8.0)
       crack (>= 0.3.2)
       hashdiff (>= 0.4.0, < 2.0.0)
@@ -592,7 +592,7 @@ GEM
     websocket-extensions (0.1.5)
     xpath (3.2.0)
       nokogiri (~> 1.8)
-    zeitwerk (2.6.13)
+    zeitwerk (2.6.15)
 
 PLATFORMS
   ruby
@@ -654,6 +654,7 @@ DEPENDENCIES
   mini_racer (~> 0.9.0)
   minitest (~> 5.1)
   minitest-focus
+  multi_xml (~> 0.6.0)
   oauth-plugin (>= 0.5.1)
   omniauth (~> 2.0.2)
   omniauth-facebook
@@ -672,6 +673,7 @@ DEPENDENCIES
   rails (~> 7.1.0)
   rails-controller-testing
   rails-i18n (~> 7.0.0)
+  rails_param
   rinku (>= 2.0.6)
   rotp
   rtlcss
@@ -684,7 +686,6 @@ DEPENDENCIES
   rubocop-rake
   sanitize
   sass-embedded (~> 1.64.0)
-  secure_headers
   selenium-webdriver
   simplecov
   simplecov-lcov
index 63aad6f1a267bd1a60c82f47fbd7e7e768ddcdfc..c8e28a62fbc20cd2b06166cbf2992dc91968946b 100644 (file)
@@ -125,7 +125,7 @@ If you want to add in the full history later on, perhaps to run `git blame` or `
 
 ## Ruby gems
 
-We use [Bundler](http://gembundler.com/) to manage the rubygems required for the project.
+We use [Bundler](https://bundler.io/) to manage the rubygems required for the project.
 
 ```
 cd openstreetmap-website
index b7d2a4f027372ab14efaaf2f8ee3e5fe7455d9d6..eba23a360b8cb75cf6ebfc3075ea164d777850a1 100644 (file)
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
 [![Tests](https://github.com/openstreetmap/openstreetmap-website/workflows/Tests/badge.svg?branch=master&event=push)](https://github.com/openstreetmap/openstreetmap-website/actions?query=workflow%3ATests%20branch%3Amaster%20event%3Apush)
 [![Coverage Status](https://coveralls.io/repos/openstreetmap/openstreetmap-website/badge.svg?branch=master)](https://coveralls.io/r/openstreetmap/openstreetmap-website?branch=master)
 
-This is `openstreetmap-website`, the [Ruby on Rails](http://rubyonrails.org/)
+This is `openstreetmap-website`, the [Ruby on Rails](https://rubyonrails.org/)
 application that powers the [OpenStreetMap](https://www.openstreetmap.org) website and API.
 
 This repository consists of:
diff --git a/app/assets/images/about/sprite.png b/app/assets/images/about/sprite.png
deleted file mode 100644 (file)
index fa0ce29..0000000
Binary files a/app/assets/images/about/sprite.png and /dev/null differ
diff --git a/app/assets/images/about/sprite.svg b/app/assets/images/about/sprite.svg
deleted file mode 100644 (file)
index 01a80ae..0000000
+++ /dev/null
@@ -1,388 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="320"
-   height="200"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.48.4 r9939"
-   inkscape:export-filename="./sprite@2x.png"
-   inkscape:export-xdpi="180"
-   inkscape:export-ydpi="180"
-   sodipodi:docname="sprite.svg">
-  <defs
-     id="defs4">
-    <clipPath
-       clipPathUnits="userSpaceOnUse"
-       id="clipPath4253">
-      <path
-         style="color:#000000;fill:#555555;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         d="m 445.5,-52.21875 c -8.23506,3.941544 -15.68019,9.273939 -22.0625,15.65625 l 113.125,113.125 C 542.94481,70.18019 548.27721,62.73506 552.21875,54.5 L 445.5,-52.21875 z"
-         id="path4255"
-         inkscape:connector-curvature="0" />
-    </clipPath>
-    <clipPath
-       clipPathUnits="userSpaceOnUse"
-       id="clipPath4257">
-      <path
-         style="color:#000000;fill:#555555;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         d="m 407.78125,-14.5 c -4.39728,9.187219 -7.07096,19.3435 -7.65625,30.0625 l 84.3125,84.3125 c 10.719,-0.58529 20.87528,-3.25897 30.0625,-7.65625 L 407.78125,-14.5 z"
-         id="path4259"
-         inkscape:connector-curvature="0" />
-    </clipPath>
-    <clipPath
-       clipPathUnits="userSpaceOnUse"
-       id="clipPath4261">
-      <path
-         style="color:#000000;fill:#555555;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         d="m 423.4375,-36.5625 c -6.38231,6.382311 -11.71471,13.827444 -15.65625,22.0625 L 514.5,92.21875 c 8.23506,-3.94154 15.68019,-9.27394 22.0625,-15.65625 l -113.125,-113.125 z"
-         id="path4263"
-         inkscape:connector-curvature="0" />
-    </clipPath>
-    <clipPath
-       clipPathUnits="userSpaceOnUse"
-       id="clipPath4265">
-      <path
-         style="color:#000000;fill:#555555;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         d="M 400.125,15.5625 C 400.04489,17.02967 400,18.51283 400,20 c 0,22.09139 8.96035,42.08535 23.4375,56.5625 C 437.91465,91.03965 457.90861,100 480,100 c 1.48717,0 2.97033,-0.04489 4.4375,-0.125 L 400.125,15.5625 z"
-         id="path4267"
-         inkscape:connector-curvature="0" />
-    </clipPath>
-    <clipPath
-       clipPathUnits="userSpaceOnUse"
-       id="clipPath4280">
-      <path
-         style="color:#000000;fill:#555555;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         d="m 475.5625,-59.875 c -10.719,0.585293 -20.87528,3.258972 -30.0625,7.65625 L 552.21875,54.5 c 4.39728,-9.18722 7.07096,-19.3435 7.65625,-30.0625 L 475.5625,-59.875 z"
-         id="path4282"
-         inkscape:connector-curvature="0" />
-    </clipPath>
-    <clipPath
-       clipPathUnits="userSpaceOnUse"
-       id="clipPath4295">
-      <path
-         style="color:#000000;fill:#555555;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         d="m 480,-60 c -1.48717,0 -2.97033,0.04489 -4.4375,0.125 L 559.875,24.4375 C 559.95511,22.97033 560,21.48717 560,20 560,-2.09139 551.03965,-22.085347 536.5625,-36.5625 522.08535,-51.039653 502.09139,-60 480,-60 z"
-         id="path4297"
-         inkscape:connector-curvature="0" />
-    </clipPath>
-    <clipPath
-       clipPathUnits="userSpaceOnUse"
-       id="clipPath4864">
-      <rect
-         style="color:#000000;fill:#202020;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         id="rect4866"
-         width="420"
-         height="160"
-         x="110"
-         y="812.36218" />
-    </clipPath>
-    <clipPath
-       clipPathUnits="userSpaceOnUse"
-       id="clipPath5076">
-      <rect
-         y="785.52893"
-         x="39.999992"
-         height="213.3333"
-         width="559.99988"
-         id="rect5078"
-         style="color:#000000;fill:#202020;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-    </clipPath>
-    <clipPath
-       clipPathUnits="userSpaceOnUse"
-       id="clipPath3009">
-      <rect
-         y="732.86218"
-         x="0"
-         height="320"
-         width="640"
-         id="rect3011"
-         style="color:#000000;fill:#222b30;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:11;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-    </clipPath>
-    <clipPath
-       clipPathUnits="userSpaceOnUse"
-       id="clipPath5092">
-      <rect
-         style="color:#000000;fill:#202020;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         id="rect5094"
-         width="420"
-         height="160"
-         x="30"
-         y="852.36218" />
-    </clipPath>
-  </defs>
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="2.8177596"
-     inkscape:cx="119.20742"
-     inkscape:cy="107.0188"
-     inkscape:document-units="px"
-     inkscape:current-layer="svg2"
-     showgrid="true"
-     showguides="false"
-     inkscape:guide-bbox="true"
-     showborder="true"
-     width="4212.99px"
-     inkscape:window-width="1242"
-     inkscape:window-height="760"
-     inkscape:window-x="51"
-     inkscape:window-y="189"
-     inkscape:window-maximized="0"
-     fit-margin-top="0"
-     fit-margin-left="0"
-     fit-margin-right="0"
-     fit-margin-bottom="0">
-    <inkscape:grid
-       type="xygrid"
-       id="grid2985"
-       empspacing="5"
-       visible="true"
-       enabled="true"
-       snapvisiblegridlinesonly="true" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:groupmode="layer"
-     id="layer2"
-     inkscape:label="gray"
-     style="display:inline"
-     transform="translate(0,20)" />
-  <g
-     inkscape:groupmode="layer"
-     id="layer3"
-     inkscape:label="sprite"
-     style="display:inline"
-     transform="translate(0,20)">
-    <path
-       sodipodi:type="arc"
-       style="opacity:0.98000004;color:#000000;fill:#7ec95c;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       id="path4499"
-       sodipodi:cx="220"
-       sodipodi:cy="20"
-       sodipodi:rx="15"
-       sodipodi:ry="15"
-       d="m 235,20 c 0,8.284271 -6.71573,15 -15,15 -8.28427,0 -15,-6.715729 -15,-15 0,-8.284271 6.71573,-15 15,-15 8.28427,0 15,6.715729 15,15 z"
-       transform="translate(0,-20)" />
-    <path
-       style="opacity:0.98000004;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="M 215.5,-6 214,-4.5 218.5,0 214,4.5 215.5,6 220,1.5 224.5,6 226,4.5 221.5,0 226,-4.5 224.5,-6 220,-1.5 215.5,-6 z"
-       id="path3965"
-       inkscape:connector-curvature="0" />
-    <path
-       style="opacity:0.98000004;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="m 303,-6 -1,1 0,3 -6,0 -1,1 0,2 1,1 6,0 0,3 1,1 5,-6 z"
-       id="path3921"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccccc" />
-    <g
-       transform="translate(-260,-1042.3622)"
-       id="g7110">
-      <path
-         transform="matrix(0.86666662,0,0,0.86666662,54.000012,588.69555)"
-         d="m 270,610 c 0,8.28427 -6.71573,15 -15,15 -8.28427,0 -15,-6.71573 -15,-15 0,-8.28427 6.71573,-15 15,-15 8.28427,0 15,6.71573 15,15 z"
-         sodipodi:ry="15"
-         sodipodi:rx="15"
-         sodipodi:cy="610"
-         sodipodi:cx="255"
-         id="path15441"
-         style="color:#000000;fill:none;stroke:#c0c0c0;stroke-width:4.61538458;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         sodipodi:type="arc" />
-      <text
-         sodipodi:linespacing="125%"
-         id="text15443"
-         y="1123.7971"
-         x="281.65521"
-         style="font-size:18px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:end;text-decoration:none;line-height:125%;letter-spacing:0px;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:end;baseline-shift:baseline;color:#000000;fill:#c0c0c0;fill-opacity:1;fill-rule:nonzero;stroke:#c0c0c0;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Helvetica Neue;-inkscape-font-specification:Helvetica Neue Bold"
-         xml:space="preserve"><tspan
-           y="1123.7971"
-           x="281.65521"
-           id="tspan15445"
-           sodipodi:role="line">C</tspan></text>
-    </g>
-    <g
-       transform="translate(-260,-1722.3623)"
-       id="g7115">
-      <path
-         sodipodi:type="arc"
-         style="color:#000000;fill:none;stroke:#c0c0c0;stroke-width:4.61538458;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         id="path15563"
-         sodipodi:cx="255"
-         sodipodi:cy="610"
-         sodipodi:rx="15"
-         sodipodi:ry="15"
-         d="m 270,610 c 0,8.28427 -6.71573,15 -15,15 -8.28427,0 -15,-6.71573 -15,-15 0,-8.28427 6.71573,-15 15,-15 8.28427,0 15,6.71573 15,15 z"
-         transform="matrix(0.86666662,0,0,0.86666662,54.000012,1308.6956)" />
-      <rect
-         ry="2"
-         rx="2"
-         transform="matrix(0,-1,1,0,0,0)"
-         style="color:#000000;fill:#c0c0c0;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         id="rect11874-2"
-         width="12"
-         height="4"
-         x="-1843.3622"
-         y="273" />
-      <rect
-         y="1835.3622"
-         x="269.00009"
-         height="4.0002432"
-         width="12"
-         id="rect15609"
-         style="color:#000000;fill:#c0c0c0;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         rx="2.0001216"
-         ry="2.0001216" />
-    </g>
-    <g
-       transform="translate(-260,-2012.3623)"
-       id="g7120">
-      <path
-         transform="matrix(0.86666662,0,0,0.86666662,54.000012,1638.6956)"
-         d="m 270,610 c 0,8.28427 -6.71573,15 -15,15 -8.28427,0 -15,-6.71573 -15,-15 0,-8.28427 6.71573,-15 15,-15 8.28427,0 15,6.71573 15,15 z"
-         sodipodi:ry="15"
-         sodipodi:rx="15"
-         sodipodi:cy="610"
-         sodipodi:cx="255"
-         id="path15611"
-         style="color:#000000;fill:none;stroke:#c55151;stroke-width:4.61538458;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         sodipodi:type="arc" />
-      <rect
-         y="1725.0107"
-         x="-1344.1022"
-         height="4"
-         width="12"
-         id="rect15631"
-         style="color:#000000;fill:#c55151;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         transform="matrix(0.70710678,-0.70710678,0.70710678,0.70710678,0,0)"
-         rx="2"
-         ry="2" />
-      <rect
-         transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,0,0)"
-         ry="2.0001216"
-         rx="2.0001216"
-         style="color:#000000;fill:#c55151;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         id="rect15633"
-         width="12"
-         height="4.0002432"
-         x="1721.0109"
-         y="1336.1022" />
-    </g>
-    <g
-       transform="translate(-260,-772.36218)"
-       id="g6944">
-      <path
-         sodipodi:type="arc"
-         style="color:#000000;fill:none;stroke:#c0c0c0;stroke-width:4.61538458;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         id="path6661"
-         sodipodi:cx="255"
-         sodipodi:cy="610"
-         sodipodi:rx="15"
-         sodipodi:ry="15"
-         d="m 270,610 c 0,8.28427 -6.71573,15 -15,15 -8.28427,0 -15,-6.71573 -15,-15 0,-8.28427 6.71573,-15 15,-15 8.28427,0 15,6.71573 15,15 z"
-         transform="matrix(0.86666662,0,0,0.86666662,54.000012,238.69555)" />
-      <path
-         sodipodi:nodetypes="csssc"
-         inkscape:connector-curvature="0"
-         id="path6667"
-         d="m 275,774.36218 c 0,0 5,-4.5199 5,-8 0,-3 -2,-5 -5,-5 -3,0 -5,2 -5,5 0,3.4801 5,8 5,8 z"
-         style="color:#000000;fill:#c0c0c0;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-    </g>
-    <g
-       transform="translate(-260,-872.36219)"
-       id="g6940">
-      <path
-         transform="matrix(0.86666662,0,0,0.86666662,54.000012,378.69555)"
-         d="m 270,610 c 0,8.28427 -6.71573,15 -15,15 -8.28427,0 -15,-6.71573 -15,-15 0,-8.28427 6.71573,-15 15,-15 8.28427,0 15,6.71573 15,15 z"
-         sodipodi:ry="15"
-         sodipodi:rx="15"
-         sodipodi:cy="610"
-         sodipodi:cx="255"
-         id="path6737"
-         style="color:#000000;fill:none;stroke:#c0c0c0;stroke-width:4.61538458;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         sodipodi:type="arc" />
-      <path
-         sodipodi:nodetypes="cccccccccc"
-         inkscape:connector-curvature="0"
-         id="path6753"
-         d="m 275,899.36218 -6,6 0,7 4,0 0,-4 4,0 0,4 4,0 0,-7 z"
-         style="color:#000000;fill:#c0c0c0;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-    </g>
-    <image
-       y="-9"
-       x="250"
-       id="image9767"
-       xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAYAAAA5ZDbSAAAABHNCSVQICAgIfAhkiAAAIABJREFU eJysvHmwbcdV5vlbmbmHM9zpvfsGzXoanmbZkjVhbDwbbOgyUAbbVNMUFAEN3TRUBx1dRFMVQQ/V 3UFHQAdURVENXU10ELZMgxk84kFlW7Kt0ZY1y7I16413vuecPWTm6j9y73Pfs2TZhtrSfXc45+yd O79ca33rWyu3ANy/djuv2/8+7j/9YVHhgCjLKkRRVVUJiraCehVpQSupZHrT+e/j2497T37IIYAS bj74fn3ZG/4THo9vfgYrToJG6xW9duWtoX/t08//2XXb9cZSJdOTC0tLs+2T6/WLD36zOlAuT3/h J/4P/+3n+pcf/i/MxZddagejQRgWg/jjF/8aAHcd+3/5wXN+9j/ZmD//+F9x6NACIFZE5Irlt5w1 lsc37tgH3IjwC6JcoegvXLny1gf/IdcUgPvWbuem/Qmw+0/f/usq8r8J2qJSq+pMYUtEtxXZAH1R lGcUeRb0aVE5oejGzQffv3Hmie89+UGnKlFV462HP8A9xz4EVrnl4Af+3oN9fPOzCMaIICAcXXrz HNQvnfhgNvNyESrvEWN+ZbfZPrI5PbXr2+ZEaMKx6OOxYlw+nRfZw6r6TZtnawuL46137/vP10WG 84mO1dfkzrUHbeHygKK3Hv4Ad5/4ILce+vuNW1W5++m/kBijLCwumfOX3+lXcpm//sTmZ/epymUg bxXhPapyHcJIVAH+2ytW3vJ7AI9tfJqrVt7xfV9fAO4//WEA87rVn473rX34B0X1b0D2qYKigCIC qICAAmkA4lX1GUUeQPQronovwtM3H/jAi/0F7j31IYlBjXluEm6+5RcBuP/23+d17/uN7zq4Jzbv AEEAEcSMOezPXbpy/vpP/fkl/P6PfvDcY9PT125VOz+myD8yxlyEQtPUnNx6gd1qmywrcEWGsYJY QcCrj8dD4x+NPj4Q23A/wuNr+e7z/+LG39vqz/+VEx+06XYl3nro/d/zpD6y9ikQRBXjW89rD/9o OPP1x9Y/vSriLkW4ReBdqrwBZAHRdLuaphr0HuA9Vy6/5fjjG3dz5cqt3/MY+mO+lO5f+7C8bv9P K8B9pz/8L1H9HxVIFwVVQUQ7cNPHNIGcBqMKoo0oX1HkE4J+EeSRmw++f7O/xt3HP2hQjbee8zMA PLr5aaxYrlh6K49tfhrEICoipP+vWHpz/PYBP7F1xyIqF4IeAW6yxr51q5nctlFtO0TQEAhtQCK6 4zdlJ24hxmCMIYaAbz0SFY1KjCFNJmAze2x5vHTHodH+T47d8O4bDr73yf6a9xz/U5TCiGi8pbPk 0/W3WC0uAeCh9U90NiCIiFyz74dfNu5P3f8nF1x45OKLsjy7IYbwjhh5E7AIIALaAdvNcf+TivKj V6685RPfN7LfDnAC9nZz0+r74r2nPnwt6J8jemVaSKKIosgexqra3ROoIqId6PM/bYF+SpVPk5mv 3Lr/fQ/31/mK/o2YEzNdLFc7D4Fctfz2V4zZj219bp9ROU/gPIWjCDeIyg8oeoVIGv5WM2Gz3iG0 gdh6tdaSFQV1nLFRn5LaVxrrIMF7NKiKIDbPsLlDUawYxtmQlWKRYVYCPKKiH0X5oiAP3Hr4A8f6 8Xzhmf9HNEZdXjqIs47go1y/+u6Xjf2RjU+tCOZ8a+yRpq5vqKv6jda6m621i85luMwBgqqi2sEr cqbRSDIa/uCq5bf8NwCPr3+WK/e97R8EMDetplh87+kP/U8Cv412Fgr0i0sVNE2unAGuqorI3K0n sLEgXp8wd538KEY+Of2JX/r8D0nZvtJgHp180po2vwCR81C5UOByRK9GuUZErlbUSB8mVDFi8OpZ q7bZmU40toGsyMTmWZofAie2X2B7ewMi2MyRD3IRY1Q1oqpSuFz3lUss5WOxGCLar2dAWoU7EPm0 gS/ffPDWL4kcecWF+Iz/woHZpL5YVS9GOQpcA/Ia4GpBiCHSNC0xRIwxWGOw1qnLM0QkGYwqPcg9 z1DlMdA3XLXylvXvC9lXAjgBe7vcvPo+vffUh94I8iGEc0E7t5zG0IGLqEoXjJPlpnlRVFEQRMAJ 5nSNuec04ejCerx+5W/lZPXXxXDprmG+UAb1F5Es9EIVLhWRSwW5HLhwPiiVjgPQLx1EBIPojq84 ubOGrxvyssBkVtJSM2iMHF97np16k3I4xFiDoml5qDJ0Aw4M9zHOBqCawEWl9wzpFtJXltkXijL7 KFJ/5sr88BfhDVuweVXFc9dsMrk6Eq8Grg4xHo2BdL6ohKjEEFHt7gO0bVqmVYWIkNsMY4y4Ildj TGfB3W2DiGoDvPvKlbd8FuCR9c9wzb63f88Au1dAXAFuPvD+L957+vZPAP+sAxdVRKWLFWhv0smf 9JOv2jlrUUzCgpemaGnR1WIfE/9zMZOf9FrfGXSQgRwBvVgR299Vd9Z+irvrCNI5E8GIALPQyNZs G183uDzHZDZxARDVSFu1FNmAkHtistieNMo4G3JwuJ+BK4ka6ZeOiGCMUWMF66xYawhtw/qptfNf fPbUf3n8xbWf/71HX/zcief/9enVgyvXLe1beK1zFkGwzpJljtF4wMq+RVb2L3LOeascPm9V8yIn +Ci+DTINkSpr8T5SBs9AC/w0iHGWvCgwyYq7WScX4R3AZwEM5nsG9xUB7l10d3xSVD8ADFVRFZEe 3B7GObh97Eiz1MECRFU5PkNXcnQ5F5qIwkLU8K6gHiuuZ4zIGeB2RC6dVToCQzKuJnimvmbiK2Z1 hTEGl7seXAB8nTKf4XBMXc0IoQJjUZShKzk03E/pSoImgmtEMNbgMkPUINV0yovPnNZvPPIiz3/r hJx8aZOmMowX9xej0aF3HTrnQlQN2+sGYywhBtqmIfiWGNc0hBfx7USM8aweWpJLj57PFddczDmX HaDOPK0JBBOZCeSuIFeL94FZOyErcrI860wYVHn9o5ufya9efnuTM/iHAXzmIehngC+o8iMqHct6 RXC7d3cj6jg2IMhOK9QBXcrQzKjUERGRqJE2NBhn59dTSaxiHgKTQSEYokaq0FCFhto3tJoYscZI VmSc4b8BiD5gM4fLHFJJl+xFMuNYHaycBa7LLM4a2rbmhWdO8+hXn+Hh+5/lxIvbkmcr7D9wIUev uk0vvuQIBw/ul+XlRZaXFxkMBmSZwzmrIUbquqaqatne3pGN9U3W1jZ47tkXeO7pp7nrjme545Nf Y2G14Mi153LdrUc5/5LDRIVKawZFSZ7l1HVNUzWE1ksxKNUYI6BHiOYI8MSl+37gHwbwmUTrptX3 b9578kN3IfIjKEZEVbukSKJ0kHQMq8/h6KxZEBVUjs9g4NCVAto5AqpRxYdGc1uQHIPOCUGfhXUu it12yqSdUQeP14CqirVO0YhGRcxZbks0qorprBKDNYktG4TFbCjjbKBRI2KEosgIvuGZbzzP/Xc9 KV/9yre0nmZccPG1vPWHr+OKq49y8ZHzOXhglUGeSYytavCoBjQm167aImJkWGQaFqwePLSAsRdh XUEMytr6Bk9/6zl54rGn9ImHHuGrn3uM+z73OEdfeyE3v/UaLr/qInG50UwzjDW0bUtd18wmU8pB iXVuAZHXAk98X+i+EsA3rb6P+07ezk0H39fNsnwe5WkRPaK9x4wiHZHqDO7bwO2AwYjIiRk6sMSV HNqY3G9n7TF6CbHBmjxN1J5jT29DqHzNWrVFHRqs2ASaMcTgJXiPyZLb1XnYFmKM6eMm/SUzeYqR YhjnQwQRmxmyIuP0idPc+akH+NJnniD4Mde+9q1yw223cNV1Rzn/nENkAr6eEustJrPEvNNY57lC 50qFQJQ2tH00RwBjDMMy54Ybr+C1r7tOTp5+E9/8xjN87csPcP9XvsDDd/8NN7/xKn78vW+TI5ec jzTp5o211FXFbDKjHJSLWZFfB9wO8PUTn+D6Q+/6+wEMzMEFEJUvI/HrCkeSd+5IaIeU6jw0z2Og omCMyMTDxGu8YASlRSYeFZljGDVoGxqMSTlhH4eZYyWqREKy2nl6hESJwWvwAVtk3aLqEnQRUUmQ p1EKzmSImMRYTCblIFc18PD9T/GRP/2PvPD0lBtueRNvedc75aprL2dlcaTtbMJ08wS2Y9FdvrqX SvQQ906pCzs+eu15CAISQYKnaSoREV0Y5Nxw81UcvfYyXv+2N/CVO+7irs99Sp64///mx37qh/TN P3wLo/GQatYg5YCaSqpZJVH1NT0mx16Yp+Xf9XhZmtQf9578LDcfTEn1Pac++K9QfucMcKWf7DPB 7b+LCJoJ5ukJ8o1t4jXLxPOHSBU6R6ydThOxJmOQj5GORPcTJh2tUmC72WWj3iVoxIrBiOAbT2gD xaBETM/9+3RKaKsm5b1FQdVMODk5hrVw9OBFGG+54+P38bEP3cPyyhF+7Kd+mptefyOrK2N8NcHX MzRGgsb5OQ0Gw9497jHytK4VxUePjwEx0pGHve9GDMYmDxRjpAWkHKLB8dTDT/Px/++vePRrX+aW Nx7l/T//bi48ci6zSYX3kbqqaerq4clk+81vvuZn175ndHk1kiUv7f2scrcoL6B6vopEwM6T8jPy 3sSROhs0IhyfoblBVwuljX0mK/1bQDRoxMdWnDUJ3m7hK52YgdHFfCRWjG7UO9KoJ3gITas2z5JL SZHjzBSZGAMSRVNeazVzTvIFw/MvneSODz6g99/5PDe/4R3y3p/7ABdfdFi1mjBZO5HWihGCRo3e S4xRrbOiYvCqoFEFwYgRBUIMqighBmmjT0MJXeYuabV3qRcmWDXGYK2RDGF3e00bUS5/zYXyq5f/ Bnd87Dr+9vYP6jNP/bH8wq/9hN5027UymzWqmgvovrrOrwU+//0A/B0t+MzjvhMfWlLlI4q+BRGP quvFjnlirh1JEkENEBT7uePoakG49QAyaVOtotMxz/x8ZnPKbNgtmF5UYc62TGcBTfRsNDts7GwR Gs9gPEwEq7f6TpgA8FUSy/KyBFGmZpPnvvUin/rj+9h+MePHf+Zn+ZEf/2FWFgqayRZtUxNCRGPA pHiKD54YAsYYsizDGkvVVsQYKbMCI5ba13MX3vqUmkWNhBC79bYXc4yxCWhrsNZhjGGnnVBFz9Li AUq3yCMPPMmf/dEfs376m/zSb/wkb3zb62jbQNv4KsbwL65Zffv/+f0A/KpZ8y/+9/8YgJsOvX9L 4YlORjMqvYGdBa52NowaQY5XkBnihSPFdqarOhfDursHVULw6qNXjX3OlcxQjKixAgaNKA6jYy10 QEY+yNNC6qOjRpSYBA0UW1gNwRN8q4NxwfGnNvQvf/8LOjs15pd/8zd57z95D0sFOl0/pW1V4b0n xEDUmIQOY0BUjTMEDQqqRZbjnEONghXNc6fWWZxzFHmByyx5lmmR5RgraqzBiFGNqjFGgg+0bUtT N1rVtbZtS04GIbK2/hJb0+N6zc1H+Y1/9Vt60SU38of/++366Y9+SfPCaZa70hhzbY/Nkxuf+4cD /KkP3zX/WVUfUJggYvRscHUulPe0w4rKRo2s18jJCjlVKYVBR07VpUtq1O4kXbmKiLGigmiMkaZt qKsZ1Wym1axiNpvqzu4OoWk5tLif1fGKxtZrVVVoinvaE6uekGFQlxueffKY/sUffJ6sPZdf/x9+ i7e/443q/FSnu5v40EJSXzVoS9AWaw1FliWAnFGTGVQjmXNkWaZqUhpWZAUusyoWLfMc6wxiYVCU OhoMGRSFusxgbJrpiGqMqiEEfNNS1ZXGENQEaJuG3Z0N1taf1QMXLPCrv/XP9dob3sQf/d5H+Lu/ vasty4yiyK76wiMfygGOrrz1ewL4O8VgAXj+6ePQWVvTtPdmRfY8IleiGgHHnEt34HaFAIKiB0r0 VIX51k6KxUsZui8nHijRpQwQjFfRjkS0VUuRdy4uKjF2KUm3jqy15EWOyzIyl2EaI5sNzHyNb1tc npHnOSIQE3uW4eKAY0+f4vY/+Du0XuLXfuu/47bbbqDd3ZC6niHIXPhPPkb7YoBkWcYkTFP+3Mmz mXGMi6FE/NxTLBWLRA2JkBnFxyCZyShsTuMbRFMuLlGJEdGgxAiqEW3TQg/e49sWjSoalVPhOfbv P49f+s3/mj/6XeXf/95fysLikB96203nHr36kuuB+74ndAH7Cn+TM76b7kvX13bW3vjOG/8zES5B NZCyTEluOemYiR2pSozo2Ek8soAeLJCgyolK5GStbq0Rs9agtafGaxNa2rqR4AM9MTVGJM9zirKk KArNi1zyPFfjbLeYIoAaFYyIZNYRfNC2aRArYozBOsNst9a//pPPy6lng/7yb/5z+YEfuJFmd4PZ bKLWOqwxEqKncJm6zNJELwDDfMCwHCogEdXMOlkulxjlQwpXaGYts1BJExtymysCUz+VNjaoJOLl Yyteg6p0fEu6oZteCOj8TYS2bWVazfAhdJlnlLqd6tLKolxz/Y089diz3PnZL5oLLz1cXHPeZY/8 z7/zh/cBzPQR/pff+bevCvC3k6wzwRXA5HlG07QtwJde/LN/Y6351SSEJ8FYkV6GTklNF2HViGDP EA9VkLWK5ok15HRDhpVqpOqvXSJfGeLEkWc5mc16wVNfcXidAirGqIZIPa0IGokGduspO/WuZINc s7zgc39+L3f+9eP8k1/6FX78J95NmG0xrSYSNeooH5BZR+1rxoMRkch2syNDW+pCMSZzOSEGtuot 6lAzdiPEiHgN2oaWmZ/RxhYjBkEIGvqsjp5l9Devqsk6U2ZIDJEYlOADGmEym8n67qZGIkVZkBcF /QI/sHohx5/Z4Pd/51/ryr7a/Mpv/tSfvP7y9/7iq6J6xvFKMXgOLiBt600PfFM1X1fVnST5a9Su YJ3CqHb5YbpLiYq0EXy606iR3cIzvWZM+47DcHSJ8bZhYeZwKd0hhrCnhGmkJ07zQh6x08EVDQGx QjEqsdbiVFguxgxcgW8bHr37m3zl44/yxre/i3e8621oPSG2LZl1GKAJNcYYlkaLOGtp1ZO8hyUQ 2Wl22W0meA00vmVtus7pap31aoPtZhsfPYIkxtxp2p3gTd/a1P9BBMSAGMVYsM5gM8FmBpsZggSC JsbeVDX1rKKpGurZjLW1Fzl04T553y/8fDh1suXf/O6HrlDVecXhutfd/H0DfNbRqTcOYP309kOq nE5Dl6i9NaGSkBVJeW4yta65Qwgq041dCVUrC4OxDBdHoheNCauF6EYt+CiAhBgkxCB98bQra6Rz zMtJ9GeVJEki5bAUmznRqDIuBuycmsnn/vxeueDCq+U9H/jHMsxF2mYmGBFnDc4ZCQSptZZGG5n4 qdS+kqiRiZ/Ier0p282O7LYTadpGRI1Yl4kRixUr1jgRMd1IVKJG6cqRoprGHTSKJk1NIlE6+VEy l0mWWTFWxOVWxCLReIwTEWskhChN3UhdVdLUrUynE9nYPMZrbrvWvPEdP8rX73/uqtf9wA1ndd9d 97qbviN+rxSD4Wwr7r+8sTK95U3X/6Qxcp6iAcFK74u0y2HneS70BfPZZEbwnvHCAtY5og9gBNms YaNGzx8hziAKxhrE2Lk3Dt7T1DV1VadKS90QY+qKSKlMJ4hYi3UOay13feJhnnpkg/f+03/Ktdce pdpeRyUpTa22RIlYawkSaGNLE1o0xO7afQ7eF+rTudPf+1VmkjKFmU+VMQaFua8ZuREr5UoiW7El aKSwOUVXXEGgdAVIpA1JI1CU2DUKaIydxm0I0ZMVmVx85Ki+9OyLowfuuT+f7Gz/FRBOHnuJQ+ee y8ljL/FKx/dCssRYI6raPnz/U+3P/fp73mScXJf8UM9y53Wg+Um05xJRmU0m5IkwERORQEuDbDWY F6foxQtQWAiJPddVxWw6pWlqvPdde06aROmkvrqq8G2LzRzSNdQZZzj27CYf//CXueaGH+QdP/ZO tNqB6PHqiXgigVRpshAVjSEVKkyqBwOE4AkhJAbdgasxAZebLBUWNGDEMMrGHBoeYJSN8NETNDBw A1bL/Z2sanHGUvkZQcNcurTGkllHVI8YyJzDSErHQgjpK2USIIJvajmwejAOh0vm6SeevGIynTw3 m+x+FeDQOedy6NzzXhHkV60HsxdVTPfe2NT+kaLIW0WzlC3NTfhsiLv6/Ww6xVhLlmepi7FbpYoI Q6diDHGzYhogVA3OZRRlIS5zKiJYa7Euw1o798/Be2lbr23Tsru9TTkYYq1DVfnyHV8X1QV9w9vf RJFBmMwQZ1N5TwMYBJVEX7voLr23aIOkkoLibLpm0ECIAYNhX7kiS8WCBo2cmp5m0k7JTcZCvkDU KJN2ppWvGboRhS04NTuNoizkYyZ2IrvtrgKUtiSi7LYTfGgwBilzp0ZKnBicMUxnNU3TUqtirRFs prvbp+31N10XbnvzW+2zT3/zA2vwF8DmQw/c9x1j8SsB3GMUe9N0ztKEqICujA4eGBRFph0lVPr4 k1SkSEQ1ENPbJbRd4d25RKLo5Dsf0YGTNlfqY1swXiQrc5x1lIMSl2XzvoGUhsV5Y4FYwyAfSjmI 7O7ssrO1w3Bcsn6i5tGvPcs1N7xBLr78CNV0i2HuCMETNaASMGrQqBIJIIIzjsxkePU00iKC7CuX WRms4EPLiekp6lizmC+wXC7RhkaMGPaXK9S+ZqveQlFWymWcsZIWb0TEMHADmthixFLaIW0IyRGr Uoea9dkGAhQ2S7HdCmWZYUSS1ZuGGBQbBQIynWwzXthnbn7D67nvS3e+aTqZ/MTayeP/4WzL+ntY cFO3EQi//bu/dvGwHL4hsxmqtAoZfV1lXkKLfZogUSMyztU6S55n3UR3rNioVFlUnxnK2sFonFxk SIWLEHwXyqVvWwHodF+kbRoFcJmjrmp2d3a5+wuPorogr7n1dSiNChHEggUrhjIbkLlMvAatfM3A lRwcrFLagvVmg9PVuiCCMVadGDI3wHXNArnNEETWZxtqrePAYJVBNmC92kCaXZaLRXHGEYnaJHWM 1F7UMMoGZMaJNU5VIyEGat9QhxqANnoxYjA9p3SQ5xbRgrYOaFRp20bFCJubp+Syqy6LN956m3vy sUd+jFQjnj70wL3fF8DaW29e5NrUTQvwI+9584+IlSu7+qyZT/m8iGAQTPrZCE1dU+ZDKYoiKUxW 5+XEpm0IAyOLFxbkOxFfrhBEiW1LE2d47+krEr302Hcdtk1DPasktAFjLFnumE2UJx9+gfMuuo7L rrocP9uQhSKjT6eHxYBxPiJ3BarI6dkaKkqrLQNTUtpyzhnWqw2pQ82hwQEykwGkMiAwLkZdRhjJ rUNMssYmtGTicMZKHWva2JCZrG+g61MpyUxG7Wf42M49R9CI1zAvtEWFQCBIwEvERIMJRnwbqCYT lpYOyjU3vJaLv3jZG5u6+qHTx4998jtZ6KulSZ31Ngp4IF9cHr1ThJGqhoQkSbrS2PUZB6IGjQSN GmjampjinsYuXosxRFXaqqUcj7RcXVSHI/OOMhtq5nLVqITQuXztI7Zo8J7ZzoR6UlHkuY4Wxoox 7Ex2eerxFzW0Q73sqqNYF7GiDPNSnbWIoIUt8BrYrrfJxOpCPtYm1BybHmer2VZnrGbGAkobPNN2 plEjuck1aKSK01S9V9HdttKIYsQh0WlmnBqBhXzI4eEBnDG6Xq/jjNP95T58DFS+RlGtfaXb9TYz XxE1ap9Xmq7OjaAYRRyKg+girba0odUYgnrf6s72ulxyxWVcdsVVB1T19T1g19348jj83fLgVN0E Pnr3n9zinH1t54g7RUNJAnSX1PSZBJxR8024dk0uoiitbwnB46yVWIoEE4lbNYqK11aC+nnZTwSx iSXLZGdC41tk4KhdlK0wlXW/w0asePSxZ2Q4XJUrr7uG3ekmSgBBMucSSenuRlXxGqS0hYDQhJYm NGKNFSM2WRJKExppYkvuciltQdsKsyaQm6EUMhajjrYe4MJhOVReIKUbEaNjZFbIdSw79YyTs1Oy 0WywWW/RRk8bWjldrclOs4OPnqhRtGti0bkoImKNwTkrWe7IC4dkUGsjbWgl+CjT3W0OHFrVo1df zb79q29YOXDwgjRZLxc+XjUGdzJlBDjn/INvFSNHulhrtIf/rMXQsyB6kgVdi29q7UFCCNrWDVmR i0SIuWByUbYb4sFCQvT0DXIiqIiRGKLubu/ILDba5pG62RHvPb4NNG2r0gzYPFXJOav7OXTeYdY3 n2VYFhoJ4sSqESNBgxamIJooQQPOZBhJt9HEVgBKV1KFClAduoFk1mlhMzlvfI6e2oqc3IpyeKlg 3yBnUnvdnSkxZrIzE3ZnLXWnp7dxLKJWd/1UMJWK9agGmbYzal8zlzT7dpHONnoRULos01jRLLNo UKnV08aWLGbatq007UwuvPQIFx659DWb6+vXAc8DPHT/2bH4VV1006Q2yIPnrJR5kd8KoBp9Z73d HhbdE6CZl4nVd8Vva21XxEvnjDHiQ4t1FlFUS6OaG2S7JWjQoF7ng5JUCJ7s7LLZ7uqWmTLxM2rf 4GPQEFP30NbJCcYP9Zzzz9WgNYrHWiEm2QABDaR8sw4NIXpNDduBUV6yVIzVGaur5T72l/vJzZDl bFWtlswalDDEScGkDrywPtMXN6Z6fKui9ikkbU5rXZ/UTGrPtPF4LypxhGn3q2kPoO0iVas0cdbN lelISycRzWWEfm8h0G3DM9ZgM0uWGY0EbaMnxqjT3W0On3cOh887b18I4XKA1vvvz4K7AfCRO/+v m4yRK/pphzMqDPPNS3vmLIYkUKAYayR2SzSq4r1POa0RNERhYNBCMOue2LZE9XTVBASR2XTKTjOh cp5I7MpvlqgqGj2iwsbxbQb5MuddeBHVNIAfQRhK9CXg0OCoPAxMzkKWkUsmVR0IzYBhPsLpAruz SFDwfkCorZxuQHSGjyk9C2ktUbVeumaR1LSpe7MyDypEoiYVL4aMqlozgO4sAAAgAElEQVSkwaDG C1KlioOavc+kpAORZMMi9P+ASdp1jE5iCPjoyWKgrqa6/8B5cvDwOWR5dhTg8Qe/+r0D/KZ33sLn /+4eAMaLw5tEONIJGzI3x84F96658zAKEGJIsoQRYoxqjEiMUZu6lqIs0j6hEFNdamAFUeJOpWGY GuONMVTTGXVTq8/Tjk/RtLm3bxaIUZFoZLIxoygP6uqhc/FVKTQWCUOc5hpakdCq+hhlVy3jwjFV dFIL2u6T3VaYzSpNuXzfC5ZRx6hK30c2F6D6m2R+o9o3LKj4CBAxSZWXqKo+dqJtGKH1uSouQr4m uXWg0qdUXf0GUhey7vVzIRgjWCsanRDbKIGYauDOsnroICv79l/cNO25G6dOvNRb3XcFuAcXwFpz HWBUtWs4Zt4c179H56lqsuwutdF+KhTRTv5TMV2pURRCRIdOQ6bEzRmMUvdhXddazWaY0hIjGuuI NbY/n6im6lPGQKfbDbkIS8v7mM18z6UIUfFBNcbE+qo2UvtmTrhEpAsZe5XJ+TT3ojr0qX6vtNN1 FnWrWtPORSOMSqMIVE3shSFyZ7TMYLfyMqsztD2X3BpdHNT4EEmNemnEPbFUFU34dj0URsRaQ3SK RtWogdT1UrG4vMT+AwcPv/TCC/uBl75d7/iu1aR7nv/LC4CjyVqTwan0nG/vv7N/6zdz9a8J2unH LrNYa4n9roAQ0bEjGiWenmCswYeW2e6UsiwJDqq2SX3NHQKpfRc0RtQL2gpZXlCUw24jWQoHbYjJ xdKVMztBJnadBb1cKf12m94X9e+NmvTghGT6nAoLpeOc5YKVYZZWuyqjwrI8zFga5IwLhw9K1abr h16NowXNkPYAJpZk1pIbx1ka/nyVze2o70/DOIOxgooSCPi2YWl5maXllcOqcX/30bOOV7Tgvt8Z oCjL1wKXdcmR9DuQ+ov3w0lTeMYOh/Rvn0oRQsB7zyAfJredug7TvBeWOG3QnSmqS8wmM3LnxJUZ O9NNggasSXWRfqNbKqBHfONxtmQ4HqF0LT+k3t69UDKPjz2KEufj7+4oWTQRlaip8WJYWoaFpfWR 7ZknBBiXRvaPc5wRykzxMTKpA2VumTZRpnUgd4kcJxKmOKO0oVsmEgk+o24KBoOWzFjqML81ZO4a uqH2k2xEjJEUj1WTRhA8w+GQcjBYVmUh3evZhOg7uOgT85+M4WrQw9o7xzN8QM+b936bx+VudmVe zmvbBpdZjDWp3wrtShiCfHML3Zihl4yoJlMkKOV4yFqzzaStsGL26ucoSkjWIJ62adFgyfMcYyuy rCKEnBj7xcq8mHBWxya9RaZK1agDs/HK5rQhqjIuHMujjKoJ7MwSaSwzS4jK8c2aUWEZ5I7ap33A tY/sVC1l3m2xESFGaDXifZyPJUYhBEffL703hWeAe+bykx4LQa2gUdCQQHZ5hstcCZqn959tw68I sMjhM389mha4RtJDNOZb/84GuP9s/1r/SprEEDzWWdJmuZgoaGYwz+wij6wTLx1RXQhhtyIflKz5 bdaqrQ4QQx/SVdrkFKpV2NpH3DLgJ9jMYIwnL2e0XghR5m5u7nY1xcrcWayBJkRmTaTIDIPcEhUG mSEUjs1py+a0JUSlcJ3KpJEQIz4kq699+qwRYdZGWh/wqtRtJOreZCepcm8+EkeRvV9fNn9dCOo9 Yk92DBijqEnifNRInuc4lxkgfyUsXzVNevD0Ry8GLus6W+dX7ffzdjzv2yJXf/SPZtmLffNbtAKZ EXluV81DG4QLB1SXWprdHRoT2fJbsttMNQkee+BiGvBDZOsqka3Dyq5Dqm2Eh0mldsG4IDYLGqIS Qh9qdG49IiIxpjNmxtCYtE+9SW5YRqXV3BmsEXartFNheZiltA6k9lHzzGAkkbjWK42PtHUUBPVd TftsMOk7Y7RHy4h2mnMXqmBOsvrY0mdK9OUWAYxJlhzn53zV49X3B4tcCXr5mV5Zz/QBMvf5Z0Db x+AU63qBUiQRrWgi5Bbzwi7mwXWJ5w6J1y7Sbq8zrWbsZi1VU2O7ngnt3bJtIAxh6xbc9CKKYk2K 7Hn8cEpWJFULJDUtCuJDshone4PtmXXbTUzhUleGT5VDrBh86Jofu/1FPiRL7Xa+U/soWRtoO728 Dcq09rRBcTZ1/vsY556sx6vHLI0xYkyntc8Xw14Mnk+jyB6rke6JGSJgTN9uQfCeGIOqamrw1rNd wncROuIViJyjZ+CnnOVUzlY4gL2n7ege0grW2aRBW8iOzZAH1iQeKDVcu4gSaeuW7XZCayFFsE7j FEGNB7XIznWM5CCL5z8umBM6mWzjq5wsD7Rt6rCIIZPoHSGqhqg4azrSmCY59L1Fmqw2VZsCQQ0q Ik0wxGg0tXslsOo2oCo4IxJi1FmTJr2NyqRuadMzOKQNczyZP1cEOtae+D+aALaupd+JMXfMvZM7 Q+gQ7U6laeBpPqTfBiTeB2KIFUqT5v+7xOCHNz7GtSs/2oN5xRmrQl4Bz34482POXLuQ3fNAm1lm 1OQv7WK/vkNYyYnXr4ha8LOaKtS0EhFNz7vQNFjpnyags/MYcZCDh58mGxxjNonpUQAGYmzToxM0 p64WCN6iRPFRybuh74mldD0bgkhDXk6wNhU3JAoxOIIfio9pS2uq6fa7DFPyUDUBH1MaFnp1pPMQ /Yf69LAHOLH0ZIXGelzW4LvYvDeBfZti55uTSffnSf3VdMgawRjHbDKlrqsdhCmAsfYsgF4G8DXL VwFw74t/eTGqV8zjah8H2Wup60fVh5D5KAWMMRJjIlfGGiW3Yk+0ah/ckbgywL92GclFaT3et2nj tJ3zhz1RVoLGkEnWXKT7VrZkMF6jrnNCCEqs0RjEuoiGqNUkEEMhEBIwbdDcWXEmbfrfcylGEyHb lSyvOszBOMTYBnUVakpt6pGE6DREFZHUBNdG1aYNhDjvGZ0rWfR4qPSqRVJ4Iv1bVCSSZbUYicSo fRl1L4sTUfoVImc+w2ovm0uL1ahzuexsb7O7s3NClXUA586G9GVCR5MWAsZxtaLXz2sJ0nViSJS5 36Wjir3ykC4vUVXyskA10DQ1mhthvWL48K7I0OFvWIaRQ9sgqlFiCGhUrLXd8uxOm1aTmHYf46yU wWgndS0mnyVGRKI2jBZKYoiyfnpNrDNzJtpGldbvbYGJ2qtQKsY14rIqSTIqoioSY0qdMC15sSvl aB3rZhIVfICqDcyaIL38mFyoSP+kMJ0v/X57XgJjr9dbxLpWsnKS0qXUe3wmuAlhTWthnmnK3Iqk fyRF4XIp8pLNzQ02Tp96QeEUwNrx+VMkoSjOBniqXyfQtZsYuUJhdQ7c3Hh7q+0pdd+g3u/yS+Db 9EwqWgnKdo2957RGItNrRxrK9DCWvcZ2VWOMOuu6VZfAjerVqKXwF+h42GCziWrM1JiUY4oYogZd 3j9W8Jw+cYzMWawx5E40c4a69dr60I1Z52TW2CZtd0yD7l9GFWI0qijONToYbeLyHa2916rt3C2d rWqX7WtnwCnnT48tmT8/bC+5EIEsr3Cu6dqn6Y0kxdbeODsuK2fu4lRw4hhlQ903XNaV4bIaLKdP nOTkiRMvzHa2TgAcP3acf3Tt9WmEdX02wNtsM5Qb+Nj9/3YoIjf0hck5eJK8T3cD/UOrtJMwu99V 6cp02aBAtxril46rcYZ426pWeSTOml7i0+SkIqUtGLlSY4zqY1c1sZbVcr+OzQGyvFbrWgRDJIJB xRhVIiurizTNVI+98JyWZU6RG/LMUDhRHwPT2muIsStSABLVmKC90NaBvIdFr51HCFRqi1Nk5SZi AqhN6O3h0xlun7NKv07S8p9br8G6VovBbmfevamf2dtPVwNPr6kqIaZW26Eb6Eq5rMuDZZaLBZaG SzLZ3uHUiRPsbG9/A2jOveQSVznH3zz8dU52d3OWwx5RJsseFMshtvuNtals18dF3ZMNzjg6h7hn 2v1d50WGzqKEY7u4Gw/BaokcmxFNstxOVUc17dxbKQb4mBrBc+tYGYyk1APsZB7ragTLxM/YrnYY MZQsgxgdwa9SzY6zvbWWct0UyEW6NpjaB2wrFC71HWOCQOg8SHcLe0VZoqrErl02EDESGYy2MCYy myxJCBlCRPrCD3Pq3BHDvXxWNRJjosHFYFeyrJ6LHM5YnHE00fdP7xXOmEeDMHAl42zI0A2lsCXW OESN2nzAiRef4vSJ41vGmmcBhmVpDi4vxZM7O/xsl86cBfDJ5MZ5+9X/7KVPP/FHD1tr3+2sI8tz ybJcrbVixKiw97wEQLvy3XyGukqSEBV73pj60l01T66LW8k0WymkqRqstx3xTOs2amTBlZqPD9BG L4V1OGPY3h6rzWaS5402XuXUbINpPSMvnFpxzHYOycbpfYwWVtU3M46/9Lzs23+ItvGkjMKIatRZ EySqkqe9SZq6P4Noqstq2mKedOiuF7o3M41qxJhIMdhBTNBqskzbFpJU796rSr/9vSsppm2XMYqo CsVgQjnY6WKdEUVx4nToSiQ00pViu8QIscbqwJUyzkaUNseIVcGS9lMacVnB09/8Fs9+65uPOee+ CRja1ozzQjaGQ/3UdMpzqme76EvlXfxXv/1+A7Cxtnl3U9e7dV2xu7vD1taGbG5u6NbmOttbm7q7 s62TnV2muxN88BjTbTTU2HttCEFt7pTr9zEZBpX7TlHuqDZ47R8f2JFQ7dY7mXUMswJrjEZVbeoC l7Vqs5qtaqaTdpom1Cix3UesL1ArTi+46CIm2zt847FHKAeD+fmMETVGiKpaNUGndaBuQ//AFPXB a+MbqramaitqX2uIQbu42JNhjTEhmRdThgtr5MVUUVGNpou/2rNx3YtrQoxG82Kmw/EmxnhUDV0H kyJQ2pzFbMRCNtJxNtRxNmClWNSDg/3sL1Z04ApNlTRBxIiIUZcNdGtzwre+8Q2Ov/TSg7vbW09d esWVo2isiUQzzjMB5HrjXs6i7/y7rwJw6sXdB8ZLS3ePlxbJiwIA37bUTU3dVNR1RdPWNE3NZGeH yWTSUV6ZqyyqiX6W4wHxxn3sSo3ct4abKt4kktVrrckI6DopNTXQdyzGSEAJzHxDbksWywVys4iJ hxnmiwwHwnC0iG8jp46/SNs2qcdaUyrebWFCgdpHZo2nalua2FDHhiY0adtJTMpSnMdrnVfWpCMk qoLLaoYLa5TDbcREVA1nEJKOqAkxCnkxZbSwjnN1D+58rnv21Te6Z8ZSupJBNiQ3efeYr9RxaY3D GoczmQwGizz5xJM89djjUxF50EhojLWFOGt8FKNuYGyWs6nh5XuT1k5uSoxqPv7nX9j4mV9+9zVF mf+gdZasKLQoC8nLUvKykCzPxOU5LnMSY5CqmknbtpJlTtLj99jjDYrYcSHVAiLP7kh+upXZEphR JtZaaZtGQgxSlIUk1xYT3OokNotSFojJGpm2UXJbyiAbUDASna3KbOKkbWdSN7U4J7K9eYrx0oqc e/6F0jS1AOJjSt3mCZio5EUlxrR7DGdPsOmQ6rmw7r0uvfQhYkwQlzdirE9jDg6NqZdDEbE2SFbu yGC0Li5rhARunwxJp+acoWgguc2ltKU448SIEWPSTkZncpzJxUqmzubSqNWP/fXH5D9+6pP3tL79 DwcOnVOJiEElBjERROum1tg2+u0WLL4NQrcp7dSJjYeCD1vSO7w+J55/JSssyoLheETT1GxtbtK2 LTGG/jEMXY5rGC6PMdai2y2h8cQzCEWXCSAiWJOR2wFOlxiVGcPC0XqDwWElleuibcjKOlWobAaq 7D9wLs2s4anHHuqqV4linLXnVAAMMbg5mn2acqbMN89rNRUPet14/tRaNUCkKHcZLqwxXFhjMNqi HG4zHG0yWlhnOF7HumZu+b3N9ooF9KRVKFzJwA3JbYEzOZktyExBZnKsZBixahDJB2N9/ImnzNfu vYfdnZ0vqvK8da40xlhjxObOmEHuZN/BczHDoXy7BQtJ/LCAPXB4hatec8nNeZ5d0OnCPYHvaSP9 79ZaXJ5TzWb41pPl6Ql0kYjmBiYt+X0bmDqye80AXcnQNpBlGekhNobRYAFnCpzkOJMR/RjBYbIp W+0WdUg76hNZglJGTHYWaZsW31bp+cyh4eGv3sPJE8e5+NLLKYdD6qqZl8F7oG3myfJZN8t9pqB9 xWnOqs8MIXSg762AZITGKC6rcXlNlldkxQzrmm5xnyn6vfzITMYwGzF0w9TKaxzOpEcsGbHpAWz9 d+ukUhs/+pG/MZ/7+McfqmaTP9y3f2XLGJNpUleCCRq9EgejgdabGy+34DNAHvy7//XDz0x2pk+k Hioxfbp4VtrbhdsYozpndbwwVu9brWYzRNCYicadWvXO4+rXptretKLmgrH6KhDrqLktNXdDzW2p zhRqJdPuuVMavFVUtY2VttHPHyOQmExUa1WzHLUu16IY6Obmmj75xKM8+MB9+pEP/qk++ejXdTAY qLGiiVEn3UmjaPCuo7zzUNgh14uNpM43SQliT7i6oWns/4tBNUaNscsiRVXVdKRMzzq3IGrEqjVO ncm0zIY6LpZ0mI1wJldrrBox6VpIN16riUEjdjCOD379YXvnZz/L1ubGx6zhCedsIYhBMVHFRhGx RCOTdWMHY3k1gDNAj71w+tG2DTPZS9Gkv1uV/s47rT4EyfNciiKXpm4IFjG7Xsxdp4SJl/a2/RIP FlKaQgbZENFM1ItYY0WMkahBlCBzyTM6URVptZGgUWRvPRHTkhPnRKzNxGWFxBDlpReep229VNOp fPqjH5Hjx16QhYVFISYHlEixSAxWVK30ZLk31l6z6EXYhKl0Eo6ic5glrXNV0RhFY0RjkH79JxsQ MWJSHLU5zubibCbWZFK4UkbZSAqTS3chMYjYLns3iTGLNSb5kCzXkxvbfOajH+eJhx/6/9t78yDL rvM+7Pedc+76tn5Lb7MPBhjsIsHNJEXLkWQ7ZdmWFDmWSmVXJYqSUpKKbFWlKqn8EVfKScpluSqJ FVuuRCXFZkhx0wYSoCguEimABEGQIDDAAINZe2Z6lt77rXc5y5c/zr1vGiMAJEHJcSo8VW/6dffr N+/e3/m+862/76tFUXys118iBknUV8Y1gxfRbFqi0e2+zsiqwVUVuCGAqDvoiEffde+7ozhcnqtp b0fUBxcfOMi82gkClFaTGxZIXpwwcgP7gUXwIAZyA0ECUZhQkZfMzJCBL8JTUoKEb+AlAPmszZ7s ahcznfuQOBEcgwIJjqmNbNJFWRLKMoOQEvlsQttbN8HMvHnrJhrNJk4/9ChAEkZ72t9K0qCCEkL5 OmyuKQlQR5jvfDdXyQBRFd/E/Myu7KU5g7m3JogkpAgghW/sFj7BzLVajlUMRRJzcEmAhGCiig1P yMpylrDsSKvIfuEPPy//4Lc/Nt3a2PgnFNDTzUarRQTlM2PkCGyJ2TIJW2h2SRy+pYpWAMIP/9rj V2aT2TVRH0X1Nq56kzzU1Q6q4m6kJKk4hHh5HzzRZD+0TNyPiEpLqPUPORCYnLP1/iNflXunV8c5 SdYEFIiApCCy7Dk8bNWXTBAEDkkISSAiISQdPXk/Vg+fAADSWtMfPf579PyzT1OjmZIKFHnfGMRO kS7jA1rhQI7ep0/m1nRt7Va1K1Sb0lVMo8aoNtIqyUYlhZVEeLuFAhlQorylTL4AnERVpTGX20ox K0NkZ5acDe2Zb76kPv3xT2D96tqH97e3f3dl+VDkcaoGLhB7ifeqQIgkJhnHr/OD6a7ntTVdbm/s X7LWgoRX6VTdlnntsAcdVScVs3McJTEiLeF6IXgxZk/lT3VpsU90iwPBWhB8KU31XuRgrUCeJxxR jH6ScBIoSOHZHhIVsLMxW+spHKSUbK3hOE5w/J4H0FnoQ0rJWxu38Hsf+S2+9NrLaC90EAQhSDAD kq0Nwc7zIXoI7nhLNI/KzmuE5w5UXTdM9R/68PMdAwxgwIGdD37XpbyhDDlVKSvhC+5ICBYgFo4g DEGUDJExywKQObOeFrAs+dqNDfHJD38EZ1948Svj6ehX73n3/SNnbDDPWflPSSCQreZZyFgiisM3 VNESd9R0AEDe+9Cx5NSDxx4Lo6DD9eFS/0EtvvUOrn1fJSH2S9BIA4sxcSxBlmlOcgICO39uK6ng mCGEIJ8y9L+fDAeYjnsUhCUaMagRpEiCGK0wQcQ9mgxXKc99WtJaz0wzm02glO8Lnk2GZK3F7Zvr tL15CyfvPY3FlcPQZeFNJxKQsoRUuj5v7tyFmrav1t2VCUKe8Lp6rT8zKml+vSYkQFQXS+RpGxKV 1PYGBBNkwSRyJlEwRMEQlqBIkZASM2jKY4WtLKP/+7f+NX3u04+/euP62i8X0+nL3d5KgwghAAkm QbbSEYKsJRiyxllmF0jJb+YmqeoRAhBrF27mf/PnfuQDjVZyxDnnao3sVXJdf4G5KNbXyokELo2Y RproSIMhQFSVMBARwcFPKat2YRAG/uKFRVk0MBkPWBcJ5VmL81mbbNFiW/Rgiy7NxgPMpp1Kbiyc taR1iXw2hS4LBGHE2XRCushZkKD1tcu8v7uNex94iAZLK9BlDmuJhQCCoKjNq1p+uQpSVq55He+o VHElM1xZYAdv3lzWq85IQYIPgAsigiiZ5dhCFOzVs5KgOIBKI+ZI0MhlXMYBTTXzJ//Nx+grn3/C nX5o+V++8sJrHwWAXn+l4bUxJMHTzQmAWcKC2ZIxtmS2gZTuoIrmA19t9XAA6Oa1za3x/uSqpz6r rJQ7rvD8qfcviIUQLIWA7QaYno7hro9ZvjIElGDU0wArMXHsWBsNTw4u2UeNgcm4i2zahhCWpdRw DC51gCKLMR4tYDzqsrWqrh6BUiFHYcyNVhtCKexs3UJZzLjdaGKx2+NWo4nnnv4yPvp//G9Yv3qB F3oLHAQBtI5hTVw7A96Q4yr04hXSnQyw96UZdZkpze8Xz5E9kOpjMIcyQqISCCFBTCwnluXQQDCB 2hHTQsyiHUM1ImjpsFuMWYcBJjPLH/8/P4ovf/Yz+Omf/6D4Z7/xDwc1UBKAP/o9I64TDvX0DK5B q7bbG0nwQWtaVa+hH/2J951YPtR/j5QyAMAkRGUj+JL7ylggYpA2hsq8QDHLQIOEwjgieW5IiCXx UkywfviUdY5sabx2F5KiOCQhLE3HfexuHYMQltrdDer0b1Gnd5uanS1Km7sUxVMIacjagJwNiYQ3 1qRQVJY5Lpx7AWsXXiLWJcVBSIkKKA4jcs7RtbXLuLV+lZZXDtPq0WPErMgaTYEqK5H1ZsY8lFh9 9ZbSnWIT9oZ2bfDX4l1n1YhAlKiEGkGDhJBERBAzR2LqiNKA0IlJhAEpqYhAyHSB/WJCqtGmvd2M Pvzrv0VPfeFJ+ts/+278zf/wxzHcbYrZ8N2/8/KLn83b7UaswlCBhMfHHxVOsHDOwTCsdcRWCeXe jAitJj+rQRYPP3Zq4fQjx98XRKpljHHOWjLaUFkWrEsNU2qqvrLWGrrUJEl60u6VBmNqSF4YMboR cScEMcFZx/kshyBBnniUOM9a2Nk4TkJaLK5eQbu7wUGYkyDLJJhIOARhjrQx5CDMocuEyiJEEEg2 psCZ55+ms88/DVfkSIKYA2/JsvOTWqCkxK3ra3zp/KtIGgkdOnYScdxlYwpIWc4L26iG1yvreWKz 9qgqX9gLbn3kzFUgswe3xUoqIkEQFhBTx5QooBORlAEUCTbWYlTMaGo1wnQBaxfW+Tf+l1+nV194 mn/uFz5Ef/Vv/TXe2+7SjavO9ZYmX/zD33/85mSYB72lfgASUqCi0gA5MHk6IWKjJblEBm8I8EFX ScIbWmSMpff/6KN/RUpaLIrSGWOksXdItOfTPAmIohBJI6U4iX1RpCTwYgzaKkBrU/BKCmqF5AqN 8XAMKRUWeg1o3cDOxnEIaWlp9TLH6Wh+RxkCqLI29eEXRjMEagrmNrKZwLee+Tyee+qzZGZTbkQJ gqqfqbQGeVGiNBpxGFESxtjd2sD5sy8im47QG6ygt3gMJJjgCh/K4DpFR3cOL7pz6N7R2/MvnmwU jEhGaIZtBNUwEEECImcSliDaMZQKAWbMdIGhnsFFEYFi/tqXvobf/Of/O2aza/j5X/wP8K73/zj2 dlLs705IqNtWBbe//vsf/cLLjo3qLR+OJCCJ4AMdDOfYWbC1DmRKFjZpJPxmPFkOd85hC0A8+5WX Nibj2VZroQGpJAkpfQGAOEj/d/cbVdGB0oEjAfeeAdRTm5DP7yJ7bxfjfAJrDKJUwLoUO5tHQcKi v7SGIMrhnDoQlAdIAFIIX7zuAGeBuDlGUV7Cl//oNXztj59AORujmTQqcAml8YX0WanR6qdYWVrA bDuHgEA2neGLv/dJXHntVXzgx34Cj77n3Ris9OB4BHYGgPAlkdWxW1/RPAJ5IBBSF/xIIZEGTYQi 9KlAISEcQRpApgqsJHKTIzMamggUt3Ht0nV84fEn8Oyf/imOnjyGn/y5/wSHjh7FcHcKYzaQpJso i6zNLB+oNCoLquIAfsP54ASYHRE7x3BZxiaK3xDggyCbCmAJoCBSN5JGCjjIOtBaidibvE1tSwFC A+iGKB5rQz61CfeNAtOToKhJiOM+djZOwFlgsHIFQZzBcUC+LYEA47WlEISiNAgDhR5PiOwM17Yk vvSFb+DpLzyHYpqhlTYQSkngGtwSWVlChBLdpSYGxxbgFi1tXR1ib0OitBoXz7yACy+/hJ/8+7+I n/p7f4+iOIF1+3BWg+v+XR96qRypg7vu4OU6CkSMsCqtAeCjURpgwcgCR4XNoRlgFWPr1g6+9sdP 4mt//MeYTSy9/0d+Bj/y138Y7QWJPL+FINoEiylmU+20hiJBD1ZYOBJV6rHKkng8BANw5Ap2RQ7S 5rsiI1X117/+Mx+8f2m1/y4hhfLZi7m3VLu/r3v4s8wXyBSzzF94pTEAACAASURBVBdpxwxNFtHF GVTAkEcPYzp6FLYI0D90BWE6g6MAlFvQxTGwlUMsRAgaAc69cA2/+7FnsL12G+9dKXF4dYDhZopP /fZXsHZpA91WE3EQYA6uLpHrEpACaTtGEEiQAFr9BnrLbYRRAJNZwBL6S33IUOLKxSuYjkv0+itI 0yaEVBBKeaJSEpXlejD9WP0MlVULASUUpAwqDk0HMyqRCUYeK+RW4Nqlm/j8H/wRnvjE7+Lci6/i 0NGH8Lf+7t/H+37kEaTNHUBcAdEuZtMMo/0Mk3FmjDGSnZuO9vPHr1y4mncHS6lUQgoI4bMfzrJj Y9kZZuOoKCzH8ZsaWTXI9TmsAMj3/uWHji+tLPwlgGNnnSNBQpCYA0xEgPAEWuwYRe7Hs5VFCaMN 8lkOMEMspYAr0bpuMLMPYpasYHDoCpLWEG5KEBcmEGf3gb0SareE0g7n1jfxqY8+jWe+eBZr59aR ZQIPn34nThxS6NA2bm457O4WCJRnZy10ibwswZKQtCJEcVDljn2/U9yM0D/cRnMhQauT4r0/9jBO PbKM7Zs3sX55Ha+8+ArWLl0HOEKz1YdSMaQMIFUIKUOoIIRS/iFVgEBFUCqGUAFYSFgSKBkoMsYs Z1zb3sWzz3wLn/vdJ/GVP/oCbl6/hJXDx/GhH/9ZvOeDfxuDlQBh8hK0vorR/gSjvQzTSQ5dGgBw YRjIKA7zhUH76S898dWNOGiGSTNWBFQT/tgCbJxz1oBdHAd2d3f6piq6VkAHfWJz/fKtjYffdXJW luGCc+BASUil/GSUSnP5ZDaBnSNjNHsCUoEojtFst1AWGYhz2AeP0ngv4uiVW0iWMyQyB16aQFyd gUDklmLG8Sa4ZJz94gX8zlMv4PyNTSz2m2Dn6Pe/uM6T/En8yn90HP/+Tz+K7kIH//L/ehGvXNqn IHSsTQlIQrOdIG3GiBKFKA4QxSERiCejDACjs9zA8okuFlYD9FckfXDlHt64vo+b1/Yx3Mnw9Odv 4U//iJE2mzhy4jgtry5zd9BDZ9BBoCTY1m0L8OF0JkzGE+zs3MDu5i5uXbmGG9euYzgeEtuC212B 935oBY+86zQOHTsJrVPsbNygzVszBjHiBoFdiaL0rapBoBAEgYjTEEGoOqtHF08DOLO/O0Z/pesD PWwtAMsEJ9g5WOdsI+GyHL7lGXzQ2HIAzN7WeLfVaeeNZoI8y2G0QalL4mIepvVAk5+9F6cpBYEP QxZ5DmszpE0BZ9vY23sHiiMxHZZfRutbL4PPtcBSwi0ncIcT0FJCQgm8/Pw1/P5zZ3Dx8m2kzRhK CMggQGAsffmpMxB2jF/+hcfwvg+msNkA//Q3R3jlSk7NpkCzFaHVSdDptNDoRIjSAEEgwY7JWocy MxjbDMyMnS2BsnRIUqL2YogTD5wGO4n1K5vYWB8im4xx+dWXcP7MGbJgGGvAliGVgpASzhiUZUnW GF8AUQ36CCKH1oLEfY8s4vipFTp2ahXtbgJrS8xmt+CcQbMTYrhHtLPRRtJM0Oxcg1IzAApSCqhA UhgqxEnU7fXb9wEIZtkYwgJWVKWdzjnrnHNOMDvjxrtDZNPJd6RRcgdApnMvX90No7BImylUGPhy WVfNOKliOXWJSxUIgS4LdrZAHEsImcDoAfa378V01KTukeusDscw55qgNIY73oTthhCCiLTD2efW +A8++gwuXfDgBqJy+ZyjKJAciAaeenYTxM/hv/z5Pj7wfsYv7YX0q79tsJ83udmO0O4o9Jdb6A7a iBsSMhBkteNsWiCbFTDGVapQYzaZUbOVYKFHTLSLZifGyYd6uP8dh2EtY7gzpuF4xuP1MSYXMuhO BNVLAAOwC8i5EMyGG60InYUUqiURthU6/TY6rYRiqZhLi/2dfRjLcJZhDGDMiGQwQtLq8nR8BLNp D91+jiBihEGIpBFSFIccxoFM0vAIgADI2DpblSX6VmPJbDOtXWYs56Mp22L6lgAflGIGYF/+5oWR Myh9M5UnBWFH5Cp2cgbBaj8ixjkNQRZShaSCJpztYjI8hNF+FwzG4uGLWOjeIgjAvG8RUMqH30rf 53v2zHU8/ttfp0uv3kQah3NwBVWevSOKFEHC4U++vgWjJ/jlnxP4Gz88w3Cs8bGnY5LJChaXCf3l CO1OirilIAOC1ZbCiCAVI8tKWFPVJHviNRS5odF+jiKziJICYTJGnIboDCL0Ty6Raragiib43QPg 3jbYAcoQJElAgKQgTMwU28UuZkWO3WwLWyMHwZIiGaEpEyhWMKVBkWtMJxmKIkMQaUqZMdpbRZ6t orWwgzhRCMPAyRDCuMLt7u3eAiCABCyYHcg5tobZOSblpJ05NxtzWRQM4C3P4BpkB0ADUL/yj/7T owvNpXYsAxQmI1NN8SqKHI4NSclQoeAwCuFcTNZE0OUCimzAs2nDT9tpb1G7u4E4HQFM7Iz0sf1c g1gwBOGVM9fp07/9dVw+dwtpHHIgJRHAgnyFcDWg0vNkCZBSwBefnbIxDv/tz+3RT71niPMby3hp +zA32xEtrpa80A8pCCKADKy13GglaHWblM9K6ML4Wn0hiAh+8DQzG22pLCUHuaJsajBRJYIk4yAz CMoxya+OgK0243gTohGStNLPR2LmW9NdGhZTViTJ9wA4WFPysJxgyxEFVkFqYrK+3tkbcYRWe8RS tKksVpkZFMRDMJWOpRJlXq5/5fPPPw1ALB9elo5hCGyY2TLYGqudUsoJ59jmEzSJvrMESymcta4A QH/1Jz74VwIZHNeZhc6dAAQS1aZm2gZgoY2AMRHpMkFZJMhmDVhLCMIJdQfXECcjCsIcQlqwE3DV HGJrbEWawnTu2+v4zMeexZVzt9FII1Tg4i5wAWayztMU+Sidpc8+Y9FNLR6+v4cdcwj9/gKpaAlR mtPicolG0oIgCeM0FWWBrJoDkecF6cLAGgdjLKxxsJbJGgtrLZWlgVICKlBQU0EqUlAPtxDczKDO 7BIuDUH3LUAsNkAkkJmchtkE2lmy8CPtrDZwhqnMNYw2ABGiIKJW2EArbCAIFIQkhBFT2trD3naf xqNlNBZmCGMtAIn9vfHZf/U/f+QKANXspOSsdSCyYGecsTYk2BKC9yYZA+AJ83emMrSe0Esv9Jr9 Tqf5Pl0WAkQmSRuSBCCkA1hhNu3wbNJGWQZEpBFEE6T9bchwwlLmRKJkkCVmwc5WQ9OYYYyDc44d A6+dWacnP/5cBW6IKFA1DxgLgCQJvhtc6xxbtlDKkdAOH/+TBMduHMLqiWVeWVHUbKesi1VSYofT lgMFMbF2iIsEaWy4NAXyIietSz95u9TQhWVTGtLasjGOnHOsSwujHZEgyEJDxorFcgCVEslrE8in b4Ae6IFPtng0GdNYZ+yMJWcdW23htPX5Z6UgVcAgwAqmKTyLUDdsIQ4Vk2IKooK7S5u0u3Uf59kA jfaWKAs7u3D2+vNe8KLQGluSYCuksgBba60llfCo2GfoHG0VYGT0dwQY8NEs/rV/84/f0V5o3xNG ge82EEwQDkWe8mi/jyJPEYQzLPS2OYwmIGGIhAbI+XZMl6DuJfT9gQ7GWnbOUxCdO3MDT378Ob76 2iYaaURRqKoz10eFBVENbsV046rRtFWTmHNM0MhKIhYKrVaKOG3x4uoEbFd5ki2g464jGM7AScRB O4TKFUIdIE1StsagNCXlZeGnvJSai6KEKS2b0vqNaB0cM1vj4CYlSAqUkWA63UTw3A6Jm2NgNcJ4 NOFxNvbDCpmhAgUZBCAQezIzX6JDgpgkY4IpkbNYVAtoxgnLQCGKJ2z0GLPJKnX7M5hyc/uzn3r6 FQBiod+RpigdgsBKCFMwWxLssiJ3uzduMAAWh04C186/NcCtdgPj0ZQB4L6HTr0/iuMjPvZuBcFh NmlhuL9EQlj0F28ijEcA2XnBODsJhjjQqFZV7DDBWYazvun63Is38OQnnsPV1zaRpqGns4efvONj Qz5GVLl4leRaMtVz5yxK46eUHDm+gOP3tJAkiggLaC4METTG4P1V4OUp1GQbtpGSO9EClmLIkKBK BiuFkCMkcQPGeBWelznKokRZltClgefDYLIVkw57mhxwIsGJ8oOfZznprIQzDkEUeDeqYqmTQvjM kqTq4hgkAZJALgrsuREFpNBWDQhl0OlvYOtmH3vbqxiP1q4+9blndwCIMJCwVltIsmyFNbOZszAu y3IGLJ8+dQrnL50H8B1IWMajaf00aTSSx3zWzBohnJxOuhjuLSJJJtxcuAUncmIWIPZzCarSaQA+ WM3eTWZmkLV+vq5zjs+9cB1PfuI5unp+A2kSchjIqnKL52k7n6lhts6RsW4usb6P2JExFsY5Xug3 sXqsT+2FFO2ugYganGVNWrZXOVjbpJICyHsWIKc504u7oMWI+GQLrhsxaQepmYQUUEoiDCJO4wZp o7koCyp1Aa0LaGO8BDsmZ6vu8UhCJBEVWQFLjPZCkwUrYgIrX00HIcnXgtV1uAIgKVhKAelzQiip xFa5xyxBPZVyEmdotIe0fbtfvvKCebXSpkJbY5nICmuMJLINKd3lnV3H0wkCAOcvXZpj+KYACyng KkLNJ7/+r98hpbwPcBDCUTZr02S4xI3GmJL2OsZmjJnWrEihFSYIRQBHri5rOJhwgTV+LIe1jl55 4Rqe+PizWDu/wY0kQgVunWFnurMr2DJXHNGV9Fo/Uk4b/7NmO8HiagetToqkkfDCikU420R6hjls DKGOBrzRfBfS1Sn1O1dAVyfAWs5itwAOpeATLXAiQYXP2AsiSCU4CAIkUcLGGmhTkDYa2mgYp5mr QdC501ASiJoxY6Xnx95le1xaA0Hz6g+qiWmFFCwE5rOa6uonJqB0BpvZLjMsBmmKzsI+Nm+ms6c/ f/EcgEIFiq22WhBpY2DjOHFopo6vXWEAEGkDmM0F880BfuSdp3HmW+cAAIPl/nuFxEkSFvmsSdPh EtLGBGHrBvaKfYyKAl5q/aDIftz2wyi8BFY1PZ5XigE4y3jl+at44hPPYu38baRphDCougHr8sDq OXPFGlup4kpqq3PYq+VGK0Z/uYN2t4FWJ0FjoYmmY/S2XgW5AfYOvwON+0NgqDDZ6aGRbCC6l8Er DYhLU4hrU/BmDj7ehDuc+ilshmsKI5AkSBUijMLq81iUZYYsn6F0GYJQIIoU4jgG+k2UWYEJJnAV tRNXXZfkLUZfl1U9r0tE5qUiACxbbGb7IGGpFzcRqLVbL37j8+sAiihOtbOmMJpLltLsZbndvbbG ABBKieIAuG8JcA0uAMSJ+CEpEWaTjpuN+5SkU0TNDdothpgUmgR8psXCIrclcqvRUJHftQ6oh2ww +3FxZ7+9hs98/Ou4ev42pWmEUB0A9w6TEHkKA/+3Bw0q48Elax2arRiD5QV0By10+00sDFpo9xrU uFogDgD715YwdSvY3wDKchNWp5js9SmKZkDCsI92wIdTiMtjiHND0K2M+J4WeBCBvB1ZHTMEYyy0 Lsk5hqQAadxGHDcgWwHUSgSTF6SlAIUKgZIgJs/TVSmxqgLVvx/V/6BWcfMeCgkJx5Z3iims28D+ /ubL08n6EIBmZzPHXAgpDCzb3VtXGQDHaeyTOXet72hF//OP/OfHiKLT09EA2bTNjeZYRI1t7BUj TEtTjVdF1SlYJRyqnlpUrDXWegpfaxxe/vYaPvOJZ7B2/hbSJPI3or4BXFeUA576gFGr4gPGFbS1 cNaimSQYLHXQXWyhv9TCYLmD3nIbbSgkeQHxcBfpcY1k7yJujQYo8hhwDsNdoLUQI4pncMbBdQPw u3qg2znE1SnEC7vAUgx9IkUZAKwrKjyiuVqVUiKQAVQOYNeC8hRZLKCrRrwwCCBZVDMNq4r5A9J6 Z/n3tb7cCQD7zgYlwFJie7ZnXzhz5hWAhwC0MSYTgkrnnBmO9uso4xuC+6YAq0B5ZxzAiRM//e7R 7rF7AxWg1dkjEW1jt5hiWhbzNKGrE+LMUFIhlKpqgq7H43hwX3r+Cj7zia9h7fxtJElYgXtQaitq KFTgVoB66fUz/bSxcMRopQmWum10VzrorbQxWOpgsNJBd7mN1qUZwlYEcbQF0hJxsodWdwgVPgZT tpHNbmNnQ2DliKems1nlanUZLgohrxnEW1OIjRnESgh3LPXSOHMISoLMHDCZAYUFCwGSAmgquEHk q0NJQklPxoh6s9MBgT0ALjuGznM4ayGVRF2AbbUlcIFsUgy/+dRrFwGMiaR21hbGCZ0Xk3q83Fuu N+OLrj8KN5L+I0liDoXJNrTcoXFWcGF17aNWjTq+51UJhWbQQChCWGvJGD/1yGiLl56/jM984qse 3DioRt1w3dIzP3t9ssKScdUEJnfnUWoNy4xOt0nLrRb3F1vornpge4ttdJfaaElF6dSxOtKE6EWA BkpDaLSmSBuXsbf1EOlyhccjRri9jzgdgl0AIgmyRCpSjIe6cDkg1zMkWyVoZ+JpAiQRB8ROCSAU QCsCEgVOAtgEpHnCwmmAAFuNgJ/XxAlvL1pjfW+0u0MvLARRmISswsArQT/intg5zCbFpctn1jcB lCoUpTWudKY0AJxSko2x3zvA9sAfpd2dE9TcwVCPOS+tH1dXbceKOZ0YQCBCtMMUqYzAlWp1jklr gzPPX8ITn/gq1i7cRBKHkIL8AOm6macGt2JYr6SWrOPaJUJZ+hGt7cU2VgZdDGRI3aNd9A930R+0 sNBroDlooHFpijBQhBPNyhchFHmJJJUQwjemCxkQ4xCmYyBJLyFKDIAQQiiIurC5LWAficBbBWiz ABR58rZEEcUSiBU49CNxyRFsmYNzX4A50lNMde61UmUtG21QTgsCCFJJyKBqQBdA4Ceo0pyYlIhl 6LXgZFi8Ot6bDAFYXZoCzAZVAug7gfumAMOfEu4f/E+/cGrC28eLIkBpbEVyLbguPHNgEhDcDGM0 /Xw+OOugtYF1jnRpcOZbl/jTn3wKVy9UkluNahV1v0B1Lr0eXB+KtM6xddZLrmV0Bi2sHu5jMUyo n8TcO9ZDf2UBCwspmgsJYiEQbpdEvQi8lLC0VI2JzeFcB8O9o5CqoMHKeZ5NBshnRzAdK0TpGpQs YY0j6xu2mQrnOxn7IbAUe/Xqql3tGLAONHWYO7XGkrEl9ssJ7+YjGGc9kbkgnzWa5iSVYhUFPpIl qS6kBzPX4M4ZaQCCM5ZvXth4DcA+PO+Thk/dzovt3w7A80Lu0+88da8BHyPnE9hVB4MfiMGMSAZo hw1KgxiCCdpWYPiBVXjp+Yv49CefIi+5ESSR5++rroLqa5xLqo8Qzc9cZ0lrA+Mcuv02Vk8uot9p YKADDE72qXt4AZ1eA81mhHghRnh5AukYONWGIyKjDXQ2hVIRJqPj0KVAb2kNSTqiOBlh69Yp7G4t w1pGf+kqgrCAcxLsJFVcS0Bh4QcEVLfmgJVUVe+Cwchsjo1sF6Ni6jsYK3CttiinOVQQIGzEVY2c 8/MmDtxw/36VX1n9xGo7vHJ2/SqAGe4UQc4Nq7cL8Pz/bHeaJwKljtV1wFVvBzOYYhWiF7URq5Cd Y2jrwbDacVFonHn+An3mk3+KtYu3kMSRH4jjB1lR1XcJ3zHqYJ2XWMeOrXMw7Mg5i7I0sM5xd7FD h08scm+lQwMKsUQxuvcNuL3cRCMOKUlDKCJWtwtQK6RyEMCMZnA6YyUjyrNTnGdt6i2uIUlHcFZx nI6wdOgS7dw+gf2dFTYmQH/5GsXJ2PvfTvojsnJjaxSo6iSsn0kSPNUz3Jhs0H4+rgdZMwh+jNAs J6EkwjQCwOycq+Me8Le16oWpDbG6T9Ax8nG+tnFtZw+AJSLLzHV1zfcBcN2yASBOo1NCUuTcHVpF BpMihW7URqpiaGfIGIuy0H6gcV7SmW+dx6c/9RSuXryJNI0g66af2v2rAhnMrlLFDG9Q2QpoRqn9 IKz+ygIdObmMweoC9QZNLI0FBnGC5uEONXopYgjIdgRxZUw8KZGdbqGYTKFsgSjuUDa5F6P9Ver2 riNORnBOoCaPjdN9LB66CLFxnCbDJegyRm9xHc3WLkhYAkvf0V9HPPxdqJCouJsB2suG2Mv260bv uYDovCSAEKYRSMCzotXyX91Lr8wOBDwYJMgfWXub41eunbu173fC966e3xDgOI4ozwoG0JZKraCq lKzjwWCmUCgOSMJYQ8Za6NKgLDTnWYkXv3WePvM7f+rBTSIEUnLViuA1GvtuHsfO0w07Cz9AysI6 R44Z2hg4x+ivLvCxkys0WGlzb7lNg5UO9wuJhS1DybUc4VILSASXswzR1TEZYugVgUasYMtFHu0d o3zW4Vb7FjU7G+ycAHvCYjATrJUcRBMsHrpIQVhgf+cQNm/ci6J3mzu9WxSEOYMFMQuuZlX4eKIH nIkA4wzlJgfAVWeuj7NabdhqQ2ESs6/kdLVJibnnMQ9h1fI857wkx4zNqzvnJ8PZfgXN9yy9bwQw BaGiPCv45/+rn1xVoVp2lmGrOYRVloiN0Mg5BxgoSs1loVHkGi9/+xKe+N2neO3STTSSiAIlvR84 vzv+pnAttZUr5Gp3iB1rbeCYaXG1i+OnVjFY6XB/sYX+coe7iy20ew0kI4f03ITFN3YweWcTdi9D uK85erQD0V6gbK+P2XgJgOP+8gWkjSEDBOdEff8r147gnIJUJfeWryCIMtrdPIbdrSMo8pR7izeQ NIYM3BlF50loKmkmgmPLDHugN4nADqyzAjJUrCKFigkBANUquQ5tVREA0Pw1VRyTDZv1SxvrACa4 U936/QNMXseYe+4/doitXTWlhrPWX4+nfUHJBtoaQAPZLKPZNMdLz1/E5x5/BtfXNuYRqgrc+bHi DSrPkm6tt5ZrcB1769uBsbjax4n7VrG4skC9xRb6yy30Bi20OinSZoxwJYRth2SeuY34OY1ABhCt APpwH5PdFRTTCI3WbWo09yGVBljA8Rzcyv0m1DOKnBMg4dDu3UQQ5NjZPE6TUQ9ax+gvXUWzswOf 3KW6WXh+ghLXni7V0S4yuY8qBVGAOgBUxefuEJVWuKJKqMxN58rgsaXdmezNRgCMkMI4+7pJH28b 4PlObHYaiwQaCCmgQlVF/kGOHVvjaKQzREbBWeJzZ6/hc5/5Ol27chuNJOLQg0tUn1Xsqct9wn/u Avkx0h5cKqs6qOUjA5w4fYgWVxbgJbfFC/0mtRdSThoxRaECFxqzluXwR5bQOpuRuDYDv6+DcbkE XQTcX7qCINA+7+xk7Yj5lKWH+Q6VSm01OQmQo7S1A6lK7Gwe5/H+Em3fPsFSaUobQzDEHApm8hTp znEoFAIRkIODsxam1BzEIUklma2fBsg1kpXnD8AzMle2SX0W171u2axYH+6MxwDgrHtb0ns3wFVI yTfItnutftxMeqKSRH9j/EBIrQ3Pihwuc3T5xRv43O99Fdcu3+I0DqFqya3OowNZoap6w7HzbtDc oNJaswNj5cgi7rn/MBZXF9BbbPFgqYWFQROtTspxI0IcBeycRTabURAESI4vwNkJkGkukw6xIW62 dihONNgp2NokQe2CeNumnqhQmxVVX2/dxchhMsJg9RKIHI/2VrC3dZjDcIYgLMjaqvqT/FRzwxqx ipAGEUZ6xiYrIKVAEFVlxagD0a9zge5whntg64+DqnEVxUxv7m2Opvg+1PPdAAOAUMqbgWEU9qQU Ud1ixszkrGOjLVntuMhLnH3uEr78+Ddxa20TSRIhUAo11/WdvC7uxKVdfd5yHdCA1hoMYPXYEk49 eASLqwvoD5roLbWx0G+g1UkRp771hK1FNptBhQEaacO3a84MRMCkGwuIQlCzOcNkpCfWattsp51A KTjH8HworhKT6mproWa+Iz2O4FghCDP0l9dgTYjZtIPZtIO22gTBwVW9SA4O1mlEUqEZJhjlEzhn ESWR96IqrXrABarlv+II8KJD809EnkaKCFIKWG3Lu8D9/gCWSmJnYwgAQRiHPZJiLr2o6YyZUeYl vfqtK/jS73+DN65uI0lCCpSY//9UWZoEf17V4NqKSbYGuiw1MYAjJ1Zx38PHMVhpoTdoorfURKff pGY78eBGAdhZzGZTVkGAZrPp74hhUhOLIA4g2zF2tif7r337+W8/+5VXX3UMd+K+w8urRwaLy6v9 Q72lzuFmq9EQQsxTl/A8drXO9Q6+j6/DOYkwmqK3tIaNG/djtL/kuSelJlTnObOFYwsB4WPwZodK Acgw8Gy19Tlbn7uMml66Tpv5zlvynZNCCJS5wWRv9tq1V24+c3tte+bf4Ht3j94IYGq2UxrujhlA L06jQ3fm6vmIc8UKhGymcf3KNtYvbyGUQFDlc+fiMc8KVZGpShXbAwZVqf2IuqP3HMKDj96DpUNd tHsRuoMGFvpNNNox4iRiX+TnMJtNKQgDarVbXqUKgtKALS3WNncvvfSFr7z6zB+/du6Jj3zqNQBj +MY5A6Dxng89vPpD7z29euqBo4fueeDovatHFu9pLTRbfrYg19TBFakhe8JYB3IQSBp7aHdvYrh7 GNm0g2Z7G7XB5Zz1AiAALh1SmcAoT5t0J987p1zy34nK56wKAIQQ0Lnmna3x2tb63sX1C5vnzn3j 8ovf+PyZVwBkURKiyMq3BS5wJ0oGAKLRStR0nIXLRwaL//Wv/tLPtHrN92/d3BmP96dstFEAImM5 MBrqZC+87+a59Qf/8EuXYCyhlQbzY8ZblZXkVirZceUSOUdF4TMux04d5ofecQqrhwe0MGig1QvR 7ibcaCdIkpDCOASBvVpWEs0K3HxWYGtz//ray9fPX/rya1eeeebslW+eu3gFQH5g0x68IQyvg4KT 9x859MEfe+fRBx49efTk/UfuOXx86d72QrNTt7nW8dh6M0tp2ZiINm+chlIlFlcuQUjP4aVNAcc+ VzwZTUCCeCxz7OZDqCrYPG80pYNHMFBmutjbGF25vbZ9KiFfTQAACpFJREFU+fprt65efOH6+vN/ 8soV+OkpOYAJEe0z8wjAFL75wOF7XK8DuLo5sQqDjjOm6xw3UVEaVg8JIPhv/osf/cB/9w9+/GcL 1zr0j//FGXz6ya9xIyY0kmh+wDlvRPn6qzt0vFRqA5ICp+4/jofeeS9WDvXQG7TR7iVI2gKNTow0 jSq2WofZZAIhJQSUvn1j5/raxRtr58+sXX71zJWbX/vSt68B2KnBlFJqa22BOzFbAqCISAlJoa2n XfnfhUdPrqy89y8/cuihd546ct/Dx+89enL1dHuh2RNzJHxumshiuLuE0d4KL65eRJzMYDShNAWR JM6mM7LaoNPpIEeJW7Md5Lb0G71KCZrS8nh3ur59c2/t1tr2tRsXNm6vnb2x8epzl28CGNWfS0iR s+MRM+9XP59WgBt8v2cwABCRM6Uu4QPcSkoRqUBJAFTkpQZgH3tkeaHTXT1Eg0fxK7/Y4unuFfzJ 19ZJkEISSdzxbZnq+LJz7KvErMWRo0vmwR86JQ8fGVBvqYPF5S6aCxFkbKACAakk8qzk65dv7Fy7 fPPGzsZ4/drF2zcvvHJ148VvnLsFv8sNABdFobbW5sbYzFqbAyjvAlgys7KGQwChkCJWSka6NO76 ldtXr1+5feX3PvzFaPlwf+mx9z+4/PBj9x558B2nTh85uXJft9de8WWvQKszQVloKssOorgAhKlm +fo5UnEaQwYSiYvQUikmk1kx3p3eGm6Nb26t7964+urN6zcvb+1ceXl9Z397vAMgq3dRECnjHBfO uMxZN6tAnVavqSX3+1bRhDukK5FUMgXQsMZGRBQSUeAcJODEe99936Ff/1//+//4sQc7f0OKGzh7 dof/ya99DU99/QriWCIKBSz7jgDruw3JVhWI1tpbaSPa7Q06YuXwYnT83kPhvQ8cSw4d78WFnpY3 rm9tXbt4e+PaxZu3r6/d2r51fXd748bGJoBhBZ5utNLCOZuVuc6sdRmA4sDjYMwW+LPEbiGAkAiR VCoOQxWXhQ6MsXWwOeoutgcPvePU4PQjJ5cffuzek6ceOHT/YLl3TBfHEqNb6C9dB9MM2gCT0Rhl Xjoitb29sb9++/rW+vlzV29cvHR9d/v23nhjbXt/68bePrxdwABISMFREhijbWG0zdlxUV1b8QbX Ul/P21p01/cHO/rDCuxAShlIFQRJkoRlqeNsNsFf+uCH7vuN//GHf+XhB45/QCQKZ771Gv/Tf/UN /MnXNykMCEmMObjG+k4GMNatddfzLC90qV0QKZs0Ym53GrbVTm2py+n27b29G2sbOwy9B2ACUJ6k SRYlQaZLPdOlmelSz5i5ltaDN6LmFDl4VhH+LC1UTdNYgU1RGAVxFAdxnpVBWej6vgQAFu5/9ET3 5OnF7gM/9MMnTpx69+lTD+aHHabu1rXd6+fPXrl24eW1G5u3h3u317enVy/eHMGr1qJ6DwbAjXZi HXNpSlMYbQt2rKvPXx747AevodZCb1t63wjg+vCpgRZKKRmEgQqjNIiTNG42Gy3jXPvqxfPR3/07 /95j/8M//LH/7IFj9JCQI5x9eZ3/2W9dwmef2qdAMZJ4XtkBkvKKEHSZHWsfVnKl0aYoijKbTWfT bJpPAEyjKJgmzWgaRcHEWjspCz0utZ7oUmdwLmfmwjlXg2ruAvXN/MWD1yXw+o0c4IB0C0FRFIdR FIex0TacjGe1KyEANAdLS53VY72U2fCNtc3Z3s5oAq9O565MnIYcRIG11pbWuNJoW1ptD37muz97 /fnv9nnftvV88MLf/HdhSP1GKsI4VbLZDNMgTKVSrSCU/dG47K2tDdt/5ydOPvqPfunen3/4pDsp 5QiXLmy7X/vYpnjyqzlmJUMKQAXhuTCKXgM4d845Zlc6yzPHbuasnTprp9baiXNubK0dO2dHztqJ MWbmjM2Mtbm1pmBrNb/x7v5e4rQ1YAcBlwceBwEPAIQkKGKHALUDXKnaAw8mIlOl9N4IxLs34sEN efem/L4AvXu9FQkLcPpePgQJpAkFSSKjIAiklBGcSNM4aPf6Uf/rZ3bN1m42eeCoPtSPR81Bb58e PjI1L13G+Nx1wY1GcDFtpC8JISdEohCSxoLkHgnaISG2hBCbQogNItogQZsE2mTGDoN3nbNDAGNm NzVa1yq5PpPebvjubuk4SBd1UG0W8NZrDsYM3uCpz/v69zP4bM8YXi2Pq0ct1Xf/zUF1XF/D9y2l b7XeGmDrqBcrkjIUIghlIGVAjBhAyuBUKdFeaAWdb76aF9t75eShY5PVpthPnj2H859/vnOmsNF6 oxFdlyoYgbkkorEgMSSiXSFom4TYFiS3SNA2CdoRJHYZGFZuwpSIc0tUFHmh4asZrPSDQv88b8hB oL8bwGvQaku3tnqz6vcHwXwjNfwXCujd660BznNq9BqkKCQSgZRKScAFACIiip3jVCmRNBNKv3UB s7IssuubGP36E53Xbu5Ge+2mHBHRDIwchAkBQyKxB6JdFtgmoh0haBegPSIaEYmJdW5GxLlTpPWo 0LPJqIor+vVv4c7cDfhBxr9a9R6UxoNSebc98G8d0LvXG5/Bjz8O/NRPAQBay6s06LaEoiBQURxL wQ2AFgAagHkZhIEg9AuN5jRH5FiEUUAyjRwJgZIZBQEZM48YGBGwD8K+c27uyGtjZs7awjrWsNa4 UNkbmxtst3f+X7sxb7He6J79u/g5Aby1kTV/zX33P0CaoWQUhJEKEgFqgdBl5kUCegB1BVEn10iN I5WEHAifiSsAZCBMGBjBh932AYycdUMQpuxcXha6MGy1AIydGnv95nVGNcf4B+v7W2+toqtlwwas KYhZQJKCpKowrMokCuGHZAsBHUhoImQAJswYE2EIwj4Ye8zYI+KhcxhadhNmnmldFEWRlwxhs+nU 3r51jd9GyPUH603WmwIcpB047X31YjJCBILWloUkDkLFQkhGxc9ERAaMkpkLAjICpiCMAR4BtE/A PrPbB/MQTGPHbmqsybTWZZkVhi3brJzy7u3b/86quv+vrjftLtSz4YHvGHvZlJNy5hqJtIUJS0cS 0hcTGbAoAEwAjuAjQ9L5eSqGCAWDc2Y3Y0bGzLk1pmBrSp1lJp8WbjxxrMvt14ErhMC8leMH622v 74aExS9juDBgCYliNmUbWg5V6KQgI5TIAUTMHJBAgIpi3TOuCA1waa0twSiMZe20MWGU6KGbut3d zT8jtUGQQuvZn+d1/v92fVdnMFCFawAMRyOOIJAkCZe5ZkhYESoDhjbGFGDKiURmrc0s2xkR5da5 XGtdOO1KtsYUwprhbOT2NjYBX+n/uuXcDwysP6/1XQN8cOk8ZxKCIcFpM2V25Iq8MEVRGpDQJElr rUujTWmt007rspzlxlhrnWI7nIx5fPM2wzk0ZRMll3/e1/WDVa3vCeDPfeBH8ZH1NTgAs9kMhg1S 1XB2BgdhnYRxgSDLRKbMMiMdWWHYaOucKXM7GW+5ndEUes/T3DrgB+D+Ba/vxg9+w7W4uIitra3q uxi91S61uUQ5yjAlosJYpGHMAg4zCJRwbMYjAEDSSJBNsz+Pz/+D9Re9PvXMR9/oxweqj+6s39za f4OX/mD9Ra7/B+8nhIqj5rEdAAAAAElFTkSuQmCC "
-       height="20"
-       width="20" />
-    <path
-       style="opacity:0.50000000000000000;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="m 178,-13 0,5.375 1.6563,0.625 1.2812,0 c 0.256,0 0.51,-0.0297 0.75,-0.0937 0.2453,-0.064 0.4762,-0.13926 0.6563,-0.28125 0.5478,-0.43174 0.6562,-1.05881 0.6562,-1.53128 0,-0.45113 -0.1365,-0.74932 -0.3125,-1.00002 -0.1707,-0.256 -0.4291,-0.39865 -0.7813,-0.49995 0.2563,-0.1227 0.4658,-0.27675 0.5938,-0.46875 0.1333,-0.192 0.1875,-0.43075 0.1875,-0.71875 0,-0.2667 -0.034,-0.5062 -0.125,-0.6875 -0.085,-0.1814 -0.215,-0.29955 -0.375,-0.40625 -0.16,-0.112 -0.3699,-0.202 -0.5937,-0.25 -0.2243,-0.048 -0.4504,-0.0625 -0.7188,-0.0625 z m 5.6563,0 2.0937,3.78125 0,2.1875 L 187,-7.5 l 0,-1.6875 2.125,-3.8125 -1.4062,0 -1.3125,2.5625 L 185.0626,-13 z m -4.4063,0.96875 1.3438,0 c 0.1116,0 0.2424,0.0102 0.3437,0.0312 0.1067,0.016 0.2011,0.0457 0.2813,0.0937 0.08,0.048 0.1394,0.1022 0.1874,0.1875 0.049,0.085 0.063,0.21035 0.063,0.34375 0,0.24 -0.075,0.3933 -0.2188,0.5 -0.144,0.1066 -0.3387,0.17777 -0.5625,0.1875 l -1.4375,0 z m 0,2.32924 1.5625,0 c 0.272,0 0.4907,0.059 0.6563,0.1875 0.165,0.1227 0.2187,0.3317 0.2187,0.625 0,0.1494 -0.011,0.44976 -0.062,0.54576 -0.048,0.096 -0.1022,0.16005 -0.1875,0.21875 -0.085,0.053 -0.2005,0.098 -0.3125,0.125 -0.112,0.021 -0.2209,0.0312 -0.3438,0.0312 l -1.5312,0 z M 174.5,-8 168.4062,-5.40625 167,-4 167,9 168.5625,10.5625 174.5,8 l 8,3 7.0938,-2.59375 L 191,7 191,-6 189.4375,-7.5625 182.5,-5 z m -2.3126,5.84375 c 0.4982,0 0.9222,0.076 1.3126,0.25 0.3896,0.174 0.7296,0.41275 1,0.71875 0.2696,0.306 0.4806,0.67975 0.625,1.09375 0.1436,0.408 0.2187,0.8325 0.2187,1.3125 0,0.468 -0.075,0.9045 -0.2187,1.3125 -0.1442,0.402 -0.3552,0.7625 -0.625,1.0625 -0.2704,0.3 -0.6103,0.54475 -1,0.71875 -0.3904,0.168 -0.8144,0.25 -1.3126,0.25 -0.4918,0 -0.9477,-0.082 -1.3437,-0.25 -0.39,-0.174 -0.73,-0.41875 -1,-0.71875 -0.27,-0.3 -0.481,-0.6605 -0.625,-1.0625 C 169.0747,2.12325 169,1.68675 169,1.21875 c 0,-0.48 0.075,-0.9045 0.2187,-1.3125 0.144,-0.414 0.355,-0.78775 0.625,-1.09375 0.27,-0.306 0.61,-0.54475 1,-0.71875 0.396,-0.174 0.8519,-0.25 1.3437,-0.25 z m 6.2189,0 c 0.3358,0 0.6627,0.047 0.9687,0.125 0.312,0.072 0.5725,0.17575 0.8125,0.34375 0.24,0.168 0.4554,0.39225 0.5938,0.65625 0.1438,0.258 0.2187,0.5655 0.2187,0.9375 l -1.375,0 c -0.012,-0.192 -0.053,-0.34275 -0.125,-0.46875 -0.066,-0.126 -0.1669,-0.2405 -0.2813,-0.3125 -0.1139,-0.072 -0.2562,-0.12625 -0.4062,-0.15625 -0.144,-0.03 -0.2946,-0.0312 -0.4688,-0.0312 -0.1139,0 -0.2297,0.0102 -0.3437,0.0312 -0.114,0.024 -0.2165,0.065 -0.3125,0.125 -0.09,0.06 -0.1586,0.12875 -0.2188,0.21875 -0.06,0.09 -0.094,0.20575 -0.094,0.34375 0,0.126 0.014,0.2345 0.062,0.3125 0.048,0.078 0.1435,0.15275 0.2812,0.21875 0.1442,0.066 0.3478,0.1215 0.5938,0.1875 0.252,0.066 0.5666,0.148 0.9688,0.25 0.1196,0.024 0.2896,0.0901 0.5,0.15625 0.2156,0.06 0.4462,0.14325 0.6562,0.28125 0.21,0.138 0.3815,0.3285 0.5312,0.5625 0.1562,0.228 0.2188,0.515 0.2188,0.875 0,0.294 -0.042,0.59175 -0.1562,0.84375 -0.1144,0.252 -0.2722,0.47025 -0.5,0.65625 -0.2223,0.18 -0.5078,0.30425 -0.8438,0.40625 -0.33,0.102 -0.7186,0.15625 -1.1562,0.15625 -0.3544,0 -0.6953,-0.035 -1.0313,-0.125 -0.33,-0.084 -0.617,-0.22025 -0.875,-0.40625 -0.252,-0.186 -0.475,-0.43075 -0.625,-0.71875 -0.15,-0.288 -0.225,-0.63525 -0.2187,-1.03125 l 1.375,0 c 0,0.216 0.047,0.4125 0.125,0.5625 0.078,0.15 0.1865,0.24775 0.3124,0.34375 0.1323,0.09 0.2634,0.17075 0.4376,0.21875 0.1739,0.042 0.3767,0.0625 0.5624,0.0625 0.1262,0 0.2623,-0.0133 0.4063,-0.0312 0.144,-0.024 0.2799,-0.065 0.4063,-0.125 0.1259,-0.06 0.2285,-0.148 0.3124,-0.25 0.084,-0.108 0.125,-0.24425 0.125,-0.40625 0,-0.174 -0.073,-0.29825 -0.1874,-0.40625 -0.1082,-0.108 -0.2574,-0.20925 -0.4376,-0.28125 -0.1798,-0.072 -0.3657,-0.1335 -0.5937,-0.1875 -0.228,-0.054 -0.4535,-0.1215 -0.6875,-0.1875 -0.24,-0.06 -0.4905,-0.1035 -0.7188,-0.1875 -0.2278,-0.09 -0.4137,-0.20575 -0.5937,-0.34375 -0.18,-0.138 -0.3549,-0.32725 -0.4687,-0.53125 -0.1082,-0.21 -0.1563,-0.456 -0.1563,-0.75 0,-0.33 0.081,-0.60375 0.2187,-0.84375 0.1442,-0.246 0.3342,-0.463 0.5626,-0.625 0.2277,-0.162 0.4617,-0.26575 0.75,-0.34375 0.288,-0.078 0.5873,-0.10702 0.875,-0.125 z M 181.9997,-2 l 2,0 1.5157,4.40625 1.5158,-4.40625 2,0 0,6.40625 -1.3437,0 0,-4.53125 -1.6878,4.53125 -1.0938,0 -1.5625,-4.5 -0.031,4.5 -1.3124,0 z m -9.8123,1.03125 c -0.3179,0 -0.5909,0.061 -0.8124,0.1875 -0.2223,0.12 -0.4242,0.29 -0.5626,0.5 -0.1375,0.204 -0.2152,0.4235 -0.2812,0.6875 -0.06,0.264 -0.094,0.5305 -0.094,0.8125 0,0.27 0.034,0.5545 0.094,0.8125 0.066,0.252 0.1436,0.4835 0.2812,0.6875 0.1383,0.204 0.3403,0.34275 0.5626,0.46875 0.2219,0.12 0.4949,0.1875 0.8124,0.1875 0.3182,0 0.5593,-0.067 0.7813,-0.1875 0.222,-0.126 0.4245,-0.26475 0.5625,-0.46875 0.138,-0.204 0.2216,-0.4355 0.2812,-0.6875 0.066,-0.258 0.094,-0.5425 0.094,-0.8125 0,-0.282 -0.027,-0.5485 -0.094,-0.8125 -0.06,-0.264 -0.1432,-0.4835 -0.2812,-0.6875 -0.138,-0.21 -0.3405,-0.38 -0.5625,-0.5 -0.222,-0.126 -0.4629,-0.1875 -0.7813,-0.1875 z"
-       id="path3323-5"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccscsscccscccsccccccccccccscccscscccscscccscccccccccccccccscccscccscscscscsccsccccccscccssccccscscccsccscccccscccsccsccscscccscsccccccccccccssccscccscscscccss" />
-    <path
-       style="opacity:1;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="m 74.875,-16 0,10.57817 L 78.66654,-4 80.75,-4 c 0.512,0 1.02,-0.0595 1.5,-0.1875 0.4906,-0.128 0.9523,-0.27852 1.3125,-0.5625 1.0956,-0.86348 1.3125,-2.11756 1.3125,-3.0625 0,-0.90226 -0.273,-1.4986 -0.625,-2 -0.3414,-0.512 -0.8581,-0.7974 -1.5625,-1 0.5126,-0.2454 0.9315,-0.5535 1.1875,-0.9375 0.2666,-0.384 0.375,-0.8615 0.375,-1.4375 0,-0.5334 -0.068,-1.0124 -0.25,-1.375 -0.17,-0.3628 -0.43,-0.5991 -0.75,-0.8125 -0.32,-0.224 -0.7399,-0.404 -1.1875,-0.5 C 81.6139,-15.971 81.1618,-16 80.625,-16 z m 11.3125,0 4.1875,7.5625 0,4.16076 2.5,-0.89286 0,-3.2054 4.25,-7.625 -2.8125,0 -2.625,5.125 L 89,-16 z m -8.8125,1.9375 2.6875,0 c 0.2232,0 0.4849,0.0205 0.6875,0.0625 0.2134,0.032 0.4021,0.0915 0.5625,0.1875 0.16,0.096 0.279,0.2044 0.375,0.375 0.098,0.17 0.125,0.4207 0.125,0.6875 0,0.48 -0.1499,0.7866 -0.4375,1 -0.288,0.2132 -0.6774,0.35554 -1.125,0.375 l -2.875,0 z m 0,4.65625 3.125,0 c 0.544,0 0.9813,0.118 1.3125,0.375 0.33,0.2454 0.4375,0.6634 0.4375,1.25 0,0.2988 -0.023,0.90175 -0.125,1.09375 -0.096,0.192 -0.2044,0.3201 -0.375,0.4375 -0.17,0.106 -0.401,0.196 -0.625,0.25 -0.224,0.042 -0.4417,0.0625 -0.6875,0.0625 l -3.0625,0 z M 68,-6 55.8125,-0.8125 C 54.59258,-0.29327 53,0.30925 53,2 l 0,26 c 0,2.50005 0,4.52175 3.5,3 L 68,26 84,32 98.1875,26.8125 C 99.43265,26.35722 101,25.30925 101,24 l 0,-26 c 0,-3.49995 -0.19997,-4 -3,-3 L 84,0 z M 63.25,5.6875 c 0.9964,0 1.8442,0.152 2.625,0.5 0.7792,0.348 1.4592,0.8255 2,1.4375 0.5392,0.612 0.9612,1.3595 1.25,2.1875 0.2872,0.816 0.4375,1.665 0.4375,2.625 0,0.936 -0.1501,1.809 -0.4375,2.625 -0.2884,0.804 -0.7104,1.525 -1.25,2.125 -0.5408,0.6 -1.2206,1.0895 -2,1.4375 -0.7808,0.336 -1.6286,0.5 -2.625,0.5 -0.9836,0 -1.8955,-0.164 -2.6875,-0.5 -0.78,-0.348 -1.46,-0.8375 -2,-1.4375 -0.54,-0.6 -0.962,-1.321 -1.25,-2.125 -0.288,-0.816 -0.4375,-1.689 -0.4375,-2.625 0,-0.96 0.1501,-1.809 0.4375,-2.625 0.288,-0.828 0.71,-1.5755 1.25,-2.1875 0.54,-0.612 1.22,-1.0895 2,-1.4375 0.792,-0.348 1.7039,-0.5 2.6875,-0.5 z m 12.4375,0 c 0.6716,0 1.3255,0.094 1.9375,0.25 0.624,0.144 1.145,0.3515 1.625,0.6875 0.48,0.336 0.9107,0.7845 1.1875,1.3125 0.2876,0.516 0.4375,1.131 0.4375,1.875 l -2.75,0 C 78.101,9.4285 78.019,9.127 77.875,8.875 77.743,8.623 77.5413,8.394 77.3125,8.25 77.0847,8.106 76.8,7.9975 76.5,7.9375 76.212,7.8775 75.9109,7.875 75.5625,7.875 c -0.2278,0 -0.4595,0.0205 -0.6875,0.0625 -0.228,0.048 -0.433,0.13 -0.625,0.25 -0.18,0.12 -0.3171,0.2575 -0.4375,0.4375 -0.12,0.18 -0.1875,0.4115 -0.1875,0.6875 0,0.252 0.029,0.469 0.125,0.625 0.096,0.156 0.2871,0.3055 0.5625,0.4375 0.2884,0.132 0.6955,0.243 1.1875,0.375 0.504,0.132 1.1331,0.296 1.9375,0.5 0.2392,0.048 0.5792,0.1802 1,0.3125 0.4312,0.12 0.8925,0.2865 1.3125,0.5625 0.42,0.276 0.7631,0.657 1.0625,1.125 0.3124,0.456 0.4375,1.03 0.4375,1.75 0,0.588 -0.0841,1.1835 -0.3125,1.6875 -0.2288,0.504 -0.5444,0.9405 -1,1.3125 -0.4446,0.36 -1.0155,0.6085 -1.6875,0.8125 -0.66,0.204 -1.4373,0.3125 -2.3125,0.3125 -0.7088,0 -1.3905,-0.07 -2.0625,-0.25 -0.66,-0.168 -1.234,-0.4405 -1.75,-0.8125 -0.504,-0.372 -0.95,-0.8615 -1.25,-1.4375 -0.3,-0.576 -0.4501,-1.2705 -0.4375,-2.0625 l 2.75,0 c 0,0.432 0.094,0.825 0.25,1.125 0.156,0.3 0.3732,0.4955 0.625,0.6875 0.2646,0.18 0.5266,0.3415 0.875,0.4375 0.3478,0.084 0.7536,0.125 1.125,0.125 0.2524,0 0.5245,-0.0267 0.8125,-0.0625 0.288,-0.048 0.5597,-0.13 0.8125,-0.25 0.2518,-0.12 0.4572,-0.296 0.625,-0.5 0.168,-0.216 0.25,-0.4885 0.25,-0.8125 0,-0.348 -0.1462,-0.5965 -0.375,-0.8125 -0.2164,-0.216 -0.5146,-0.4185 -0.875,-0.5625 -0.3596,-0.144 -0.7315,-0.267 -1.1875,-0.375 -0.456,-0.108 -0.907,-0.243 -1.375,-0.375 -0.48,-0.12 -0.9809,-0.207 -1.4375,-0.375 -0.4556,-0.18 -0.8275,-0.4115 -1.1875,-0.6875 -0.36,-0.276 -0.7099,-0.6545 -0.9375,-1.0625 -0.2164,-0.42 -0.3125,-0.912 -0.3125,-1.5 0,-0.66 0.1621,-1.2075 0.4375,-1.6875 0.2884,-0.492 0.6682,-0.926 1.125,-1.25 0.4554,-0.324 0.9234,-0.5315 1.5,-0.6875 0.576,-0.156 1.1746,-0.21404 1.75,-0.25 z M 82.875,6 l 4,0 3.03125,8.8125 L 92.9375,6 l 4,0 0,12.8125 -2.6875,0 0,-9.0625 -3.375,9.0625 -2.1875,0 -3.125,-9 -0.0625,9 -2.625,0 z M 63.25,8.0625 c -0.6358,0 -1.182,0.122 -1.625,0.375 -0.4446,0.24 -0.8482,0.58 -1.125,1 -0.275,0.408 -0.4305,0.847 -0.5625,1.375 -0.12,0.528 -0.1875,1.061 -0.1875,1.625 0,0.54 0.0675,1.109 0.1875,1.625 0.132,0.504 0.2873,0.967 0.5625,1.375 0.2766,0.408 0.6804,0.6855 1.125,0.9375 0.4438,0.24 0.99,0.375 1.625,0.375 0.6364,0 1.1185,-0.134 1.5625,-0.375 0.444,-0.252 0.849,-0.5295 1.125,-0.9375 0.276,-0.408 0.4433,-0.871 0.5625,-1.375 0.132,-0.516 0.1875,-1.085 0.1875,-1.625 0,-0.564 -0.0535,-1.097 -0.1875,-1.625 -0.12,-0.528 -0.2865,-0.967 -0.5625,-1.375 -0.276,-0.42 -0.681,-0.76 -1.125,-1 -0.444,-0.252 -0.9257,-0.375 -1.5625,-0.375 z"
-       id="path7865"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccsccscccscccsccccccccccccscccscccccscscccsccccsssccssssccscccscccscscscscsccsccccccscccssccccscscccsccsccsccscccsccsccscsccccccccccccccccccscccscccscscscccs" />
-  </g>
-  <path
-     style="color:#000000;fill:#ffffff;fill-opacity:0.75294118;fill-rule:nonzero;stroke:none;stroke-width:2.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-     d="m 143,14 -1,1 0,2 -3.5,0 c -2.493,0 -4.5,2.007 -4.5,4.5 0,2.493 2.007,4.5 4.5,4.5 l 3.5,0 c 0,-1.656854 -1.34315,-3 -3,-3 l -0.5,0 c -0.831,0 -1.5,-0.669 -1.5,-1.5 0,-0.831 0.669,-1.5 1.5,-1.5 l 3.5,0 0,2 1,1 4,-4.5 z"
-     id="rect3834"
-     inkscape:connector-curvature="0"
-     sodipodi:nodetypes="cccssscssssccccc" />
-  <g
-     transform="translate(0.0630273,180.06303)"
-     style="display:inline"
-     id="g4031"
-     inkscape:export-filename="C:\Users\simon\Downloads\sprite.png"
-     inkscape:export-xdpi="599.83337"
-     inkscape:export-ydpi="599.83337">
-    <g
-       transform="translate(4.5101293,-0.563766)"
-       style="font-size:16px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#c0c0c0;fill-opacity:1;stroke:#c0c0c0;stroke-width:0.40000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;font-family:Sans;-inkscape-font-specification:Sans Bold"
-       id="g4014">
-      <path
-         sodipodi:type="arc"
-         style="color:#000000;fill:none;stroke:#c0c0c0;stroke-width:4.61538458;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         id="path3031"
-         sodipodi:cx="255"
-         sodipodi:cy="610"
-         sodipodi:rx="15"
-         sodipodi:ry="15"
-         d="m 270,610 c 0,8.28427 -6.71573,15 -15,15 -8.28427,0 -15,-6.71573 -15,-15 0,-8.28427 6.71573,-15 15,-15 8.28427,0 15,6.71573 15,15 z"
-         transform="matrix(0.86666662,0,0,0.86666662,-165.6154,-533.41911)" />
-    </g>
-    <path
-       d="m 63.142047,-10.043787 -2.148438,0.226562 c -0.02084,-0.385407 -0.13412,-0.679678 -0.339843,-0.882812 -0.205734,-0.203115 -0.49089,-0.304678 -0.855469,-0.304688 -0.338546,1e-5 -0.596358,0.07423 -0.773438,0.222656 -0.177086,0.148447 -0.265628,0.316416 -0.265625,0.503907 -3e-6,0.255217 0.119789,0.500008 0.359375,0.734375 0.161455,0.156258 0.695309,0.526049 1.601563,1.109375 0.906244,0.58334 1.505202,1.000006 1.796875,1.25 0.453117,0.380214 0.777336,0.756515 0.972656,1.128906 0.195305,0.3724 0.292961,0.78516 0.292969,1.238281 -8e-6,0.484378 -0.118498,0.930993 -0.355469,1.339844 -0.236987,0.408856 -0.592455,0.779949 -1.066406,1.113281 0.317701,0.291668 0.55468,0.602865 0.710937,0.933594 0.156243,0.330729 0.234368,0.680989 0.234375,1.050781 -7e-6,0.770832 -0.28907,1.416665 -0.867187,1.9375 -0.578131,0.52083 -1.40886,0.781247 -2.492188,0.78125 -1.04167,-3e-6 -1.875002,-0.257815 -2.5,-0.773437 -0.625001,-0.515627 -0.994792,-1.203127 -1.109375,-2.0625 l 2.140625,-0.257813 c 0.09375,0.468749 0.272133,0.821614 0.535157,1.058594 0.263017,0.236977 0.595048,0.355467 0.996093,0.355469 0.343746,-2e-6 0.617183,-0.08985 0.820313,-0.269532 0.203119,-0.179688 0.304682,-0.397136 0.304687,-0.652343 -5e-6,-0.244793 -0.09636,-0.463542 -0.289062,-0.65625 -0.197922,-0.192709 -0.891932,-0.667969 -2.082031,-1.425782 -1.190107,-0.75781 -1.964845,-1.386716 -2.324219,-1.886718 -0.359376,-0.499997 -0.539063,-1.059892 -0.539063,-1.679688 0,-0.510411 0.117187,-0.984369 0.351563,-1.421875 0.234374,-0.437493 0.598957,-0.796868 1.09375,-1.078125 -0.260418,-0.281242 -0.457033,-0.5677 -0.589844,-0.859375 -0.132813,-0.291658 -0.19922,-0.588533 -0.199219,-0.890625 -10e-7,-0.703115 0.274739,-1.298167 0.824219,-1.785156 0.549477,-0.486968 1.321612,-0.730457 2.316406,-0.730469 1.020829,1.2e-5 1.824213,0.243501 2.410157,0.730469 0.58593,0.486989 0.930982,1.121103 1.035156,1.902344 z m -1.960938,6.726562 c 0.229161,-0.208331 0.399734,-0.407549 0.511719,-0.597656 0.111973,-0.190101 0.167963,-0.373695 0.167969,-0.550781 -6e-6,-0.171872 -0.0599,-0.348955 -0.179688,-0.53125 -0.119797,-0.182288 -0.447922,-0.468746 -0.984375,-0.859375 l -2.132812,-1.546875 c -0.177086,0.104173 -0.333336,0.25261 -0.46875,0.445312 -0.135419,0.192714 -0.203127,0.398443 -0.203125,0.617188 -2e-6,0.526046 0.35156,1.026046 1.054687,1.5 z"
-       style="font-size:16px;font-style:normal;font-weight:bold;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#c0c0c0;fill-opacity:1;stroke:#c0c0c0;stroke-width:0.30000001;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Sans;-inkscape-font-specification:Sans Bold"
-       id="path4012"
-       inkscape:connector-curvature="0" />
-  </g>
-</svg>
diff --git a/app/assets/images/about/sprite@2x.png b/app/assets/images/about/sprite@2x.png
deleted file mode 100644 (file)
index 7560c87..0000000
Binary files a/app/assets/images/about/sprite@2x.png and /dev/null differ
diff --git a/app/assets/images/closed_note_marker.png b/app/assets/images/closed_note_marker.png
deleted file mode 100644 (file)
index ad2812f..0000000
Binary files a/app/assets/images/closed_note_marker.png and /dev/null differ
diff --git a/app/assets/images/closed_note_marker.svg b/app/assets/images/closed_note_marker.svg
new file mode 100644 (file)
index 0000000..d16b570
--- /dev/null
@@ -0,0 +1,43 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="40.226" width="25.1">
+  <defs>
+    <linearGradient id="A" x1="106.764" gradientUnits="userSpaceOnUse" y1="59.373" x2="106.764" y2="21.809">
+      <stop stop-color="#7cb928" offset="0"/>
+      <stop stop-color="#a2c857" offset="1"/>
+    </linearGradient>
+    <linearGradient id="B" x1="106.76" gradientUnits="userSpaceOnUse" y1="40.861" x2="106.76" y2="21.809">
+      <stop stop-color="#74963a" offset="0"/>
+      <stop stop-color="#89b63e" offset="1"/>
+    </linearGradient>
+  </defs>
+  <linearGradient x1="66.61" gradientUnits="userSpaceOnUse" y1="59.373" x2="66.61" y2="21.809">
+    <stop stop-color="#286eb5" offset="0"/>
+    <stop stop-color="#4d9cd1" offset="1"/>
+  </linearGradient>
+  <linearGradient x1="66.609" gradientUnits="userSpaceOnUse" y1="40.861" x2="66.609" y2="21.809">
+    <stop stop-color="#306d98" offset="0"/>
+    <stop stop-color="#3984b8" offset="1"/>
+  </linearGradient>
+  <linearGradient x1="160.144" gradientUnits="userSpaceOnUse" y1="59.373" x2="160.144" y2="21.809">
+    <stop stop-color="#286eb5" offset="0"/>
+    <stop stop-color="#4d9cd1" offset="1"/>
+  </linearGradient>
+  <linearGradient x1="160.146" gradientUnits="userSpaceOnUse" y1="40.861" x2="160.146" y2="21.809">
+    <stop stop-color="#306d98" offset="0"/>
+    <stop stop-color="#3984b8" offset="1"/>
+  </linearGradient>
+  <path fill-rule="evenodd" fill="#fff" d="M4.123 4.656h16.838v17.462H4.123z"/>
+  <g transform="translate(-94.205 -21.438)">
+    <linearGradient x1="106.764" gradientUnits="userSpaceOnUse" y1="59.373" x2="106.764" y2="21.809">
+      <stop stop-color="#7cb928" offset="0"/>
+      <stop stop-color="#a2c857" offset="1"/>
+    </linearGradient>
+    <linearGradient x1="106.76" gradientUnits="userSpaceOnUse" y1="40.861" x2="106.76" y2="21.809">
+      <stop stop-color="#74963a" offset="0"/>
+      <stop stop-color="#89b63e" offset="1"/>
+    </linearGradient>
+    <g stroke-width="1.1">
+      <path d="m 106.8,21.988 c -6.572,0 -12.045,5.691 -12.045,11.865 0,2.777 1.564,6.309 2.693,8.747 l 9.307,17.871 9.262,-17.871 c 1.131,-2.438 2.738,-5.792 2.738,-8.747 0,-6.174 -5.38,-11.865 -11.96,-11.865 z m -1.18,20.069 c -0.521,0 -1.025,-0.215 -1.389,-0.604 -0.025,-0.027 -2.609,-2.793 -3.945,-3.996 -0.779,-0.703 -0.841,-1.904 -0.139,-2.684 0.703,-0.781 1.904,-0.842 2.684,-0.139 0.64,0.576 1.501,1.438 2.275,2.232 1.244,-2.398 3.327,-6 5.765,-8.545 0.726,-0.758 1.929,-0.783 2.687,-0.057 0.758,0.725 0.783,1.928 0.058,2.686 -3.412,3.562 -6.228,9.906 -6.255,9.971 -0.258,0.584 -0.792,1 -1.422,1.108 -0.11,0.018 -0.22,0.028 -0.32,0.028 z" fill-rule="evenodd" stroke="url(#B)" fill="url(#A)"/>
+      <path d="M106.79 23.093c-5.943 0-10.938 5.221-10.938 10.75 0 2.359 1.443 5.832 2.562 8.25.006.012.025.021.031.031l8.312 15.969 8.25-15.969c.006-.012.025-.02.031-.031 1.135-2.448 2.625-5.706 2.625-8.25.01-5.537-4.93-10.75-10.87-10.75zm5.45 3.543a3.01 3.01 0 0 0-2.166.926c-2.09 2.18-3.914 5.074-5.236 7.471-.502-.498-.928-.904-1.273-1.217-.553-.498-1.266-.771-2.009-.771a3 3 0 0 0-2.228.992c-1.107 1.227-1.01 3.129.219 4.236 1.288 1.16 3.85 3.901 3.874 3.926.569.609 1.368.957 2.196.957a3.08 3.08 0 0 0 .498-.041c1.002-.172 1.841-.824 2.248-1.75.029-.064 2.805-6.271 6.043-9.652a2.98 2.98 0 0 0 .834-2.141c-.018-.801-.346-1.547-.925-2.102a3.01 3.01 0 0 0-2.08-.834z" stroke-opacity=".122" stroke="#fff" fill="none"/>
+    </g>
+  </g>
+</svg>
diff --git a/app/assets/images/closed_note_marker@2x.png b/app/assets/images/closed_note_marker@2x.png
deleted file mode 100644 (file)
index 96a2592..0000000
Binary files a/app/assets/images/closed_note_marker@2x.png and /dev/null differ
diff --git a/app/assets/images/directions.png b/app/assets/images/directions.png
deleted file mode 100644 (file)
index 197244f..0000000
Binary files a/app/assets/images/directions.png and /dev/null differ
diff --git a/app/assets/images/menu-icon.png b/app/assets/images/menu-icon.png
deleted file mode 100644 (file)
index a67c73c..0000000
Binary files a/app/assets/images/menu-icon.png and /dev/null differ
diff --git a/app/assets/images/menu-icon.svg b/app/assets/images/menu-icon.svg
new file mode 100644 (file)
index 0000000..a1628b3
--- /dev/null
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="60" height="60" viewBox="0 0 15.875 15.875" stroke="#fff" stroke-width=".794"><rect width="10.933" height="2.295" x="2.45" y="3.029" rx="1" paint-order="stroke fill markers"/><rect width="10.933" height="2.295" x="2.45" y="6.79" rx="1" paint-order="stroke fill markers"/><rect width="10.933" height="2.295" x="2.471" y="10.531" rx="1" paint-order="stroke fill markers"/></svg>
diff --git a/app/assets/images/new_note_marker.png b/app/assets/images/new_note_marker.png
deleted file mode 100644 (file)
index a414644..0000000
Binary files a/app/assets/images/new_note_marker.png and /dev/null differ
diff --git a/app/assets/images/new_note_marker.svg b/app/assets/images/new_note_marker.svg
new file mode 100644 (file)
index 0000000..efa538b
--- /dev/null
@@ -0,0 +1,23 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="40.226" width="25.099">
+  <linearGradient x1="66.61" gradientUnits="userSpaceOnUse" y1="59.373" x2="66.61" y2="21.809">
+    <stop stop-color="#286eb5" offset="0"/>
+    <stop stop-color="#4d9cd1" offset="1"/>
+  </linearGradient>
+  <linearGradient x1="66.609" gradientUnits="userSpaceOnUse" y1="40.861" x2="66.609" y2="21.809">
+    <stop stop-color="#306d98" offset="0"/>
+    <stop stop-color="#3984b8" offset="1"/>
+  </linearGradient>
+  <linearGradient id="A" x1="12.548" gradientUnits="userSpaceOnUse" y1="37.935" x2="12.548" y2=".371">
+    <stop stop-color="#286eb5" offset="0"/>
+    <stop stop-color="#4d9cd1" offset="1"/>
+  </linearGradient>
+  <linearGradient id="B" x1="12.55" gradientUnits="userSpaceOnUse" y1="19.423" x2="12.55" y2=".371">
+    <stop stop-color="#306d98" offset="0"/>
+    <stop stop-color="#3984b8" offset="1"/>
+  </linearGradient>
+  <g fill-rule="evenodd">
+    <path fill="#fff" d="M2.063 13.585L12.069 2.251l11.124 12.602-10.006 11.335z"/>
+    <path fill="url(#A)" d="M 12.594,0.55000001 C 6.022,0.55000001 0.55000001,6.241 0.55000001,12.415 c 0,2.777 1.56299999,6.309 2.69299999,8.747 l 9.307,17.871 9.262,-17.871 c 1.13,-2.438 2.737001,-5.792 2.737001,-8.747 C 24.539001,6.241 19.159,0.55000001 12.589,0.55000001 v 0 z M 14.644,11.411 V 6.595 c 0,-1.105 -0.895,-2 -2,-2 -1.104,0 -2.001,0.897 -2,2 V 11.41 H 5.829 c -1.104,-10e-4 -2,0.896 -2,2 0,1.104 0.895,2 2,2 h 4.815 v 4.815 c -10e-4,1.104 0.896,2 2,2 0.552,0 1.052,-0.224 1.414,-0.586 0.361,-0.361 0.586,-0.861 0.586,-1.414 V 15.41 h 4.815 c 0.551,0 1.052,-0.224 1.414,-0.586 0.361,-0.362 0.585,-0.862 0.586,-1.415 0.001,-1.104 -0.896,-2.001 -2,-2 -0.008,0.0044 -4.815,0.002 -4.815,0.002 z" stroke="url(#B)" stroke-width="1.1"/>
+  </g>
+  <path fill="none" stroke-opacity=".122" stroke="#fff" stroke-width="1.1" d="M12.584 1.655c-5.944 0-10.938 5.221-10.938 10.75 0 2.359 1.442 5.832 2.562 8.25.005.012.025.021.03.031l8.313 15.969 8.25-15.969c.005-.012.025-.02.03-.031 1.136-2.448 2.625-5.706 2.625-8.25.01-5.537-4.92-10.75-10.86-10.75h0zm-2.13 2.757a3.08 3.08 0 0 0-.908 2.194l.001 3.714-3.716-.001a3.08 3.08 0 0 0-2.192.908 3.07 3.07 0 0 0-.906 2.193 3.07 3.07 0 0 0 .906 2.191c.586.585 1.365.908 2.193.908l3.714-.001.001 3.716c-.001.826.321 1.605.907 2.191s1.365.908 2.191.907 1.606-.322 2.191-.907a3.08 3.08 0 0 0 .909-2.193l.001-3.713 3.714-.001a3.08 3.08 0 0 0 2.191-.908c.586-.586.909-1.365.908-2.192a3.07 3.07 0 0 0-.907-2.191 3.07 3.07 0 0 0-2.191-.907h-3.717l.002-3.715a3.08 3.08 0 0 0-.908-2.192c-.586-.585-1.364-.908-2.193-.908-.8-.002-1.58.321-2.17.907h0z"/>
+</svg>
diff --git a/app/assets/images/new_note_marker@2x.png b/app/assets/images/new_note_marker@2x.png
deleted file mode 100644 (file)
index 756ad6f..0000000
Binary files a/app/assets/images/new_note_marker@2x.png and /dev/null differ
diff --git a/app/assets/images/open_note_marker.png b/app/assets/images/open_note_marker.png
deleted file mode 100644 (file)
index 6fe5cb7..0000000
Binary files a/app/assets/images/open_note_marker.png and /dev/null differ
diff --git a/app/assets/images/open_note_marker.svg b/app/assets/images/open_note_marker.svg
new file mode 100644 (file)
index 0000000..8dc07b7
--- /dev/null
@@ -0,0 +1,43 @@
+<svg xmlns="http://www.w3.org/2000/svg" height="40.226" width="25.099">
+  <defs>
+    <linearGradient id="A" x1="27.311" gradientUnits="userSpaceOnUse" y1="59.373" x2="27.311" y2="21.809">
+      <stop stop-color="#c72118" offset="0"/>
+      <stop stop-color="#d2534f" offset="1"/>
+    </linearGradient>
+    <linearGradient id="B" x1="27.31" gradientUnits="userSpaceOnUse" y1="40.861" x2="27.31" y2="21.809">
+      <stop stop-color="#983a38" offset="0"/>
+      <stop stop-color="#b83d3b" offset="1"/>
+    </linearGradient>
+  </defs>
+  <linearGradient x1="66.61" gradientUnits="userSpaceOnUse" y1="59.373" x2="66.61" y2="21.809">
+    <stop stop-color="#286eb5" offset="0"/>
+    <stop stop-color="#4d9cd1" offset="1"/>
+  </linearGradient>
+  <linearGradient x1="66.609" gradientUnits="userSpaceOnUse" y1="40.861" x2="66.609" y2="21.809">
+    <stop stop-color="#306d98" offset="0"/>
+    <stop stop-color="#3984b8" offset="1"/>
+  </linearGradient>
+  <linearGradient x1="160.144" gradientUnits="userSpaceOnUse" y1="59.373" x2="160.144" y2="21.809">
+    <stop stop-color="#286eb5" offset="0"/>
+    <stop stop-color="#4d9cd1" offset="1"/>
+  </linearGradient>
+  <linearGradient x1="160.146" gradientUnits="userSpaceOnUse" y1="40.861" x2="160.146" y2="21.809">
+    <stop stop-color="#306d98" offset="0"/>
+    <stop stop-color="#3984b8" offset="1"/>
+  </linearGradient>
+  <path d="M2.805 9.333l5.717-6.132 9.459.208 4.47 7.068-2.806 11.33-8.835.728-5.405-1.455-2.391-6.444z" fill="#fff"/>
+  <g transform="translate(-14.761 -21.438)">
+    <linearGradient x1="27.311" gradientUnits="userSpaceOnUse" y1="59.373" x2="27.311" y2="21.809">
+      <stop stop-color="#c72118" offset="0"/>
+      <stop stop-color="#d2534f" offset="1"/>
+    </linearGradient>
+    <linearGradient x1="27.31" gradientUnits="userSpaceOnUse" y1="40.861" x2="27.31" y2="21.809">
+      <stop stop-color="#983a38" offset="0"/>
+      <stop stop-color="#b83d3b" offset="1"/>
+    </linearGradient>
+    <g stroke-width="1.1">
+      <path d="m 27.355,21.988 c -6.572,0 -12.044,5.691 -12.044,11.865 0,2.777 1.563,6.309 2.693,8.747 L 27.311,60.471 36.573,42.6 c 1.13,-2.438 2.737,-5.792 2.737,-8.747 10e-4,-6.174 -5.382,-11.865 -11.955,-11.865 z m 2.875,12.86 3.547,-3.547 c 0.781,-0.781 0.781,-2.047 0,-2.828 -0.782,-0.781 -2.049,-0.781 -2.829,0 l -3.547,3.547 -3.547,-3.547 c -0.779,-0.781 -2.047,-0.781 -2.828,0 -0.781,0.781 -0.781,2.047 0,2.828 l 3.547,3.547 -3.547,3.546 c -0.781,0.78 -0.781,2.048 0,2.828 0.391,0.391 0.902,0.586 1.414,0.586 0.512,0 1.024,-0.195 1.414,-0.586 l 3.547,-3.546 3.547,3.546 c 0.39,0.391 0.902,0.586 1.414,0.586 0.512,0 1.023,-0.195 1.415,-0.586 0.781,-0.78 0.781,-2.048 0,-2.828 z" fill-rule="evenodd" stroke="url(#B)" fill="url(#A)"/>
+      <path d="M27.343 23.093c-5.944 0-10.938 5.221-10.938 10.75 0 2.359 1.442 5.832 2.562 8.25.005.012.025.021.03.031l8.313 15.969 8.25-15.969c.005-.012.025-.02.03-.031 1.136-2.448 2.625-5.706 2.625-8.25.002-5.537-4.929-10.75-10.872-10.75zm5.02 3.706a3.08 3.08 0 0 0-2.193.909l-2.768 2.769-2.769-2.77a3.08 3.08 0 0 0-2.192-.908c-.828 0-1.607.323-2.191.909s-.908 1.363-.908 2.191a3.08 3.08 0 0 0 .908 2.192l2.769 2.768-2.769 2.77c-.586.584-.908 1.363-.908 2.191s.322 1.607.908 2.191 1.363.908 2.191.908a3.08 3.08 0 0 0 2.193-.908l2.768-2.767 2.769 2.767c.585.586 1.363.908 2.192.908s1.607-.322 2.191-.908a3.07 3.07 0 0 0 .908-2.191c0-.828-.322-1.607-.908-2.191l-2.769-2.77 2.769-2.768a3.08 3.08 0 0 0 0-4.384 3.08 3.08 0 0 0-2.191-.908z" stroke-opacity=".122" stroke="#fff" fill="none"/>
+    </g>
+  </g>
+</svg>
diff --git a/app/assets/images/open_note_marker@2x.png b/app/assets/images/open_note_marker@2x.png
deleted file mode 100644 (file)
index 84df3f7..0000000
Binary files a/app/assets/images/open_note_marker@2x.png and /dev/null differ
diff --git a/app/assets/images/openid.svg b/app/assets/images/openid.svg
new file mode 100644 (file)
index 0000000..d4de589
--- /dev/null
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48px" height="48px">
+  <path fill="#9E9E9E" d="M44,27l-1-9l-2.9,1.9c-2.7-1.7-6.1-2.9-9.9-3.5c0,0-1.9-0.4-4.4-0.4s-4.8,0.3-4.8,0.3C11.3,17.5,4,23,4,29.6C4,36.4,11.5,42,23,43v-3.9c-7.9-1.1-12.9-4.8-12.9-9.5c0-4.4,4.6-8.1,10.9-9.3c0,0,4.9-1.1,9.2,0.2c2.1,0.5,4,1.2,5.6,2.2L32,25L44,27z"/>
+  <path d="M23 8L23 43 29 40 29 5z"/>
+  <path fill="#FF9800" d="M23 8L23 43 29 40 29 5z"/>
+</svg>
diff --git a/app/assets/images/openid_small.png b/app/assets/images/openid_small.png
deleted file mode 100644 (file)
index 41adc9f..0000000
Binary files a/app/assets/images/openid_small.png and /dev/null differ
diff --git a/app/assets/images/routing-sprite.png b/app/assets/images/routing-sprite.png
deleted file mode 100644 (file)
index 079f4dd..0000000
Binary files a/app/assets/images/routing-sprite.png and /dev/null differ
index 15aa57b2dcfdb00354b5a47c47a7277e93674a13..e03a1bb84453f9b21cc1190e19ab3350875c9d57 100644 (file)
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:xlink="http://www.w3.org/1999/xlink"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="520"
-   height="20"
-   viewBox="0 0 520.00001 20"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.91 r13725"
-   sodipodi:docname="routing-sprite.svg"
-   inkscape:export-filename="/home/patrick/Code/openstreetmap-website/app/assets/images/routing-sprite.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="5.6568542"
-     inkscape:cx="131.24519"
-     inkscape:cy="13.736603"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="true"
-     inkscape:showpageshadow="false"
-     inkscape:window-width="1920"
-     inkscape:window-height="1080"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="0"
-     showguides="false"
-     inkscape:guide-bbox="true"
-     units="px">
-    <inkscape:grid
-       type="xygrid"
-       id="grid4224" />
-    <sodipodi:guide
-       position="20.000001,31"
-       orientation="1,0"
-       id="guide4226" />
-    <sodipodi:guide
-       position="40.000001,19"
-       orientation="1,0"
-       id="guide4245" />
-    <sodipodi:guide
-       position="60.000002,29"
-       orientation="1,0"
-       id="guide4299" />
-    <sodipodi:guide
-       position="80.000002,35"
-       orientation="1,0"
-       id="guide4388" />
-    <sodipodi:guide
-       position="71.000002,10"
-       orientation="-0.7193398,-0.69465837"
-       id="guide4432"
-       inkscape:label=""
-       inkscape:color="rgb(0,0,255)" />
-    <sodipodi:guide
-       position="100,15"
-       orientation="1,0"
-       id="guide4499" />
-    <sodipodi:guide
-       position="120,15"
-       orientation="1,0"
-       id="guide4578" />
-    <sodipodi:guide
-       position="140,16"
-       orientation="1,0"
-       id="guide4580" />
-    <sodipodi:guide
-       position="160,21"
-       orientation="1,0"
-       id="guide4582" />
-    <sodipodi:guide
-       position="180,15"
-       orientation="1,0"
-       id="guide4729" />
-    <sodipodi:guide
-       position="200.00001,15"
-       orientation="1,0"
-       id="guide4731" />
-    <sodipodi:guide
-       position="220.00001,11"
-       orientation="1,0"
-       id="guide4747" />
-    <sodipodi:guide
-       position="78.000002,12"
-       orientation="-0.70710678,0.70710678"
-       id="guide4212"
-       inkscape:label=""
-       inkscape:color="rgb(0,0,255)" />
-    <sodipodi:guide
-       position="240.00001,19"
-       orientation="1,0"
-       id="guide4264" />
-    <sodipodi:guide
-       position="260.00001,19"
-       orientation="1,0"
-       id="guide4266" />
-    <sodipodi:guide
-       position="280.00001,5"
-       orientation="1,0"
-       id="guide4280" />
-    <sodipodi:guide
-       position="300.00001,10"
-       orientation="1,0"
-       id="guide4297" />
-    <sodipodi:guide
-       position="320.00001,24"
-       orientation="1,0"
-       id="guide4305" />
-    <sodipodi:guide
-       position="340.00001,28"
-       orientation="1,0"
-       id="guide4335" />
-    <sodipodi:guide
-       position="360.00001,30"
-       orientation="1,0"
-       id="guide4337" />
-    <sodipodi:guide
-       position="380.00001,19"
-       orientation="1,0"
-       id="guide4376" />
-    <sodipodi:guide
-       position="400.00001,19"
-       orientation="1,0"
-       id="guide4382" />
-    <sodipodi:guide
-       position="420.00001,36"
-       orientation="1,0"
-       id="guide4394" />
-    <sodipodi:guide
-       position="440.00001,20"
-       orientation="1,0"
-       id="guide4449" />
-    <sodipodi:guide
-       position="460.00001,22"
-       orientation="1,0"
-       id="guide4451" />
-    <sodipodi:guide
-       position="480.00001,20"
-       orientation="1,0"
-       id="guide4485" />
-    <sodipodi:guide
-       position="500.00001,40"
-       orientation="1,0"
-       id="guide4487" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-1032.3622)">
-    <image
-       y="1002.3622"
-       x="1.7763568e-15"
-       id="image4217"
-       xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWgAAAAUCAMAAACXrFfpAAABOFBMVEUAAAB/f39/f39/f39/f396 enoAAAB7e3t7e3t4eHh5eXl5eXl6enp3d3d4eHgAAAB3d3d1dXVzc3MAAABwcHBvb29ubm4AAABt bW1sbGxsbGxsbGxra2tra2toaGhoaGhqamoAAABmZmZoaGgAAABnZ2dkZGQAAABiYmJXV1dXV1cA AAAAAABMTEwAAAAAAABDQ0MAAAA1NTU1NTUxMTEAAAAxMTEAAAAAAAAmJiYlJSUkJCQjIyMiIiIA AAAcHBwAAAAAAAAAAAAAAAAUFBQAAAAAAAAQEBAPDw8AAAAPDw8AAAAAAAANDQ0MDAwAAAAAAAAM DAwKCgoAAAAAAAAICAgICAgAAAAHBwcAAAAHBwcGBgYAAAAAAAAAAAAAAAADAwMAAAAAAAAAAAAA AAAAAAAAAAAAAABULW3yAAAAZ3RSTlMAAQIGCw4QEBIUFhcZGh0gICItMDQ5PEBAQUJERUZHSEhK SkxMTU9QUFZXWGBgZGZpcHl6f4CAiJCRk5SXmaCmrLC1uLzAxMXIyMrM0NDT09TU29zg4OLk5ebm 6fDx8/T09vf4+/z9ttm2NwAABH9JREFUeF7tV+9zFTUUzQOMFZUAiwZbkB9bXYEU3UI0FVhcNQVx rQpbsBopFuX8//+BMy/vvd3k7mRnio8PHc/HOyc35545yWbZkYOQtKYSvDeOgg/Xs4JR8OI/kDnc Q6jX02wqqtZlKR7tN47MWtNfOMRZOZ/n+fmVuNwMD6hRhDmQSlcNXCCpJAKVtbYiRnIViAVspQsp w9Wo0+OmNXMHQWeoUjzabxwSsP1mNDMn1/KHAB7ma+9EK9uhfi1CPdxgijJMggtjnzWeZViSVnmW jqaF0yyBtGYNVNRTiEEe7Xc4oxXtxS78Co+fVoO6BSTpZgEgKt78GyCCHGxvFN5iBh12a6kD+OsK C2EBtCqR6pRm8SdI0QCwMQ8AsvF+FGLA6HkcpV64cOwz5B7Iw3B492gsXVgtp0XVXRFTPANQyX5S jSya/iyyBvDMs1WfCFeQrNGqrOFqyRjRTL0CGh7SDnAANcQb7Uf3FS01ugRQe+kL6uRT5Jfu/nb3 UmR04++DENmTOAu8jszXmKMbUMxa8WZxPHmDHnSQK8AQo1+uswDKExUb0VyUN4B1VQSBLixspnnI W/c82m9k3woqMtofTMjI6E9waxfA7i3kE5IiQcYLjc5aAO0VmCGj3fzclPOsyO48CO0GjGa1KxyA RgRG/wPU8UH3EGxM8w3gJovQ4BdvM+Wl+9F9BdDGRvvwtbxv9MnVTcyxufruwkBX/Qh8VTfkCq2t DZ4JQM1ZkwXfFCnlE7guMvUiFw5YULl2aKSUVd9oVTHRRPeTdp8DCEMJdNlPajYziXE6XMEor2Is 3Y/ua19iX4dGq9YAKJuqb/SFB+jwYG2RmNmHQPDoUeA4r8NLrAzf/3pqm0AtyDeFfF2EhfArupKc jdM3WjILOHKjzo5XUrMGtrcBE8Zl77s9H0rKS/aj+4pCY12FRgvGpgOIvtFn76HDvbPpL64F1HQ9 edPERpeK0ValySywrqquQ1lGRnuERnN/ZAeNrkdeCQ5qKrNnVjk91DUqwisATvsl9/VeclNIwApT BAPw5gd8Y33L41efYo6nV48nRJNSyujhdRYHwD6K0RUA0pUSM5RpgZk/CE2/rOGPuiUPZs8j/ZL7 +tAW2Aeew0ZyZe+ZdeY25rh9hi3XaOH8RXhYo+nDvB1JIPcZbUOjDWNMBcqF/7N1yGi/9L7eaP/9 cyKWa7tpJznmyCdLNdp7CscPazR90zfZiEDWoBa8ggtFl0y68DC0nteO9aP7ash5hjSRK3tfgouP XuHF9y/w6tFFtmyjufNqDmd0iELrgrFRYzBFwKww8BPT8Ui/9L7KZrMpHKdyy0WgT63lG1vX8+tb G/naqcmSjWYajr+e0RRpzdm3wM9RUe/hueGUt50cOA3uoFNyz23uPL6zcf+P+xt3Hu9snluC0ZEc zZZvdKxRUp5lKR7tNw7jeEpujp3Z1YHd35Ev22hmxFE1Wpik3MubH324sXXtg2tff7H68ZeX2dFD Zm1G0mdNgrcUrLw/YW+dPsFOnH6bHXtvhb0p/I9/AQmEF7Y+Eo3CAAAAAElFTkSuQmCC "
-       preserveAspectRatio="none"
-       height="20.000017"
-       width="360" />
-    <path
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 9,1039.3309 3.6e-5,10.0313 1.999964,0 -3.5e-5,-10.0313 z"
-       id="path4446"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       sodipodi:nodetypes="cccc"
-       inkscape:connector-curvature="0"
-       id="path4448"
-       d="m 15,1039.3466 -5,-4.9844 -5,5 z"
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    <path
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 87.125,4.984375 87.125,5 86,5 86,12.005859 82,12 l 5,5 5,-4.984375 -4,-0.0059 0,-5.025391 7,0 L 95,17 l 2,0 0,-12 -0.46875,0 0,-0.015625 -9.40625,0 z"
-       transform="translate(0,1032.3622)"
-       id="path4509"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 28,3.9882812 2.814453,2.8203126 -4.777344,4.7460942 0,0.04297 -0.03711,0 L 26,17 28,17 28,12.423828 32.228516,8.2226562 35,11 35,4 28,3.9882812 Z"
-       transform="translate(0,1032.3622)"
-       id="path4450"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 53,4 0.0059,3.984375 -6.005859,0 0,2 L 47,17 l 2,0 0,-7.015625 4.009766,0 L 53.015625,14 58,9 53,4 Z"
-       transform="translate(0,1032.3622)"
-       id="path4208"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="M 67.025391,4.4101562 67.003906,17 l 2,0 0,-7.5527344 3.685547,3.8710934 -2.683114,2.694508 6.989812,0.05505 0.01101,-7.0846724 -2.854816,2.9210504 z"
-       transform="translate(0,1032.3622)"
-       id="path4424"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccccc" />
-    <path
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 170,1035.3622 -4,5 3,0 0,5 2,0 0,-5 3,0 z"
-       id="path4735"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccccccc" />
-    <g
-       id="g4237">
-      <path
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="m 189,1039.3309 4e-5,10.0313 1.99996,0 -3e-5,-10.0313 z"
-         id="path4233"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="ccccc" />
-      <path
-         sodipodi:nodetypes="cccc"
-         inkscape:connector-curvature="0"
-         id="path4235"
-         d="m 195,1039.3466 -5,-4.9844 -5,5 z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    </g>
-    <path
-       id="path4221"
-       d="m 112.00001,1036.3505 -2.81445,2.8203 4.77734,4.7461 0,0.043 0.0371,0 0,5.4023 -2,0 0,-4.5762 -4.22852,-4.2011 -2.77148,2.7773 0,-7 7,-0.012 z"
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       inkscape:connector-curvature="0" />
-    <path
-       id="path4223"
-       d="m 128.00028,1036.3622 -0.006,3.9844 6.00586,0 0,2 0,7.0156 -2,0 0,-7.0156 -4.00977,0 -0.006,4.0156 -4.98437,-5 5,-5 z"
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       inkscape:connector-curvature="0" />
-    <path
-       sodipodi:nodetypes="cccccccccc"
-       inkscape:connector-curvature="0"
-       id="path4225"
-       d="m 153.98575,1036.7724 0.0215,12.5898 -2,0 0,-7.5527 -3.68555,3.8711 2.68312,2.6945 -6.98982,0.055 -0.011,-7.0847 2.85482,2.9211 z"
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    <g
-       id="g4254"
-       transform="translate(-2.0000461,0)">
-      <circle
-         r="3"
-         transform="scale(1,-1)"
-         cy="-1044.3622"
-         cx="210.04105"
-         id="path4231"
-         style="opacity:1;fill:none;fill-opacity:0.43824702;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <path
-         id="path4247"
-         transform="translate(0,1032.3622)"
-         d="m 211,3.9882812 2.81445,2.8203126 -1.76562,1.7539062 c 0.58436,0.3442274 1.07073,0.8277607 1.41797,1.4101562 l 1.76172,-1.75 L 218,11 218,4 211,3.9882812 Z M 209,15.84375 209,17 l 2,0 0,-1.130859 C 210.69097,15.946541 210.3729,16 210.04102,16 209.67912,16 209.3342,15.935262 209,15.84375 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         inkscape:connector-curvature="0" />
-    </g>
-    <g
-       transform="translate(17.999954,0)"
-       id="g4258">
-      <circle
-         style="opacity:1;fill:none;fill-opacity:0.43824702;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
-         id="circle4260"
-         cx="210.04105"
-         cy="-1044.3622"
-         transform="scale(1,-1)"
-         r="3" />
-      <path
-         inkscape:connector-curvature="0"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="m 211,3.9882812 2.81445,2.8203126 -1.76562,1.7539062 c 0.58436,0.3442274 1.07073,0.8277607 1.41797,1.4101562 l 1.76172,-1.75 L 218,11 218,4 211,3.9882812 Z M 209,15.84375 209,17 l 2,0 0,-1.130859 C 210.69097,15.946541 210.3729,16 210.04102,16 209.67912,16 209.3342,15.935262 209,15.84375 Z"
-         transform="translate(0,1032.3622)"
-         id="path4262" />
-    </g>
-    <g
-       id="g4268"
-       transform="translate(37.999954,0)">
-      <circle
-         r="3"
-         transform="scale(1,-1)"
-         cy="-1044.3622"
-         cx="210.04105"
-         id="circle4270"
-         style="opacity:1;fill:none;fill-opacity:0.43824702;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
-      <path
-         id="path4272"
-         transform="translate(0,1032.3622)"
-         d="m 211,3.9882812 2.81445,2.8203126 -1.76562,1.7539062 c 0.58436,0.3442274 1.07073,0.8277607 1.41797,1.4101562 l 1.76172,-1.75 L 218,11 218,4 211,3.9882812 Z M 209,15.84375 209,17 l 2,0 0,-1.130859 C 210.69097,15.946541 210.3729,16 210.04102,16 209.67912,16 209.3342,15.935262 209,15.84375 Z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         inkscape:connector-curvature="0" />
-    </g>
-    <g
-       id="g4274"
-       transform="translate(80,0)">
-      <path
-         sodipodi:nodetypes="ccccc"
-         inkscape:connector-curvature="0"
-         id="path4276"
-         d="m 189,1039.3309 4e-5,10.0313 1.99996,0 -3e-5,-10.0313 z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-      <path
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="m 195,1039.3466 -5,-4.9844 -5,5 z"
-         id="path4278"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="cccc" />
-    </g>
-    <path
-       id="path4295"
-       d="m 290,1035.3622 a 2,2 0 0 0 -2,2 2,2 0 0 0 2,2 2,2 0 0 0 2,-2 2,2 0 0 0 -2,-2 z m 0,4 -4,5 3,0 0,5 2,0 0,-5 3,0 -4,-5 z"
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       inkscape:connector-curvature="0" />
-    <g
-       id="g4313">
-      <g
-         id="g4299"
-         transform="translate(115.01146,2)">
-        <path
-           sodipodi:nodetypes="ccccc"
-           inkscape:connector-curvature="0"
-           id="path4301"
-           d="m 189,1037.3422 4e-5,7.9763 1.99996,0 -3e-5,-7.9763 z"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-        <path
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="M 192.99451,1037.3474 190,1034.3622 l -3.01146,3.0115 z"
-           id="path4303"
-           inkscape:connector-curvature="0"
-           sodipodi:nodetypes="cccc" />
-      </g>
-      <g
-         transform="matrix(1,0,0,-1,123.01146,2083.7244)"
-         id="g4307">
-        <path
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 189,1039.3309 4e-5,10.0313 1.99996,0 -3e-5,-10.0313 z"
-           id="path4309"
-           inkscape:connector-curvature="0"
-           sodipodi:nodetypes="ccccc" />
-        <path
-           sodipodi:nodetypes="cccc"
-           inkscape:connector-curvature="0"
-           id="path4311"
-           d="m 195,1039.3466 -5,-4.9844 -5,5 z"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-      </g>
-    </g>
-    <g
-       id="g4321"
-       transform="matrix(-1,0,0,-1,640.01146,2083.7244)">
-      <g
-         transform="translate(115.01146,2)"
-         id="g4323">
-        <path
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 189,1037.3422 4e-5,7.9763 1.99996,0 -3e-5,-7.9763 z"
-           id="path4325"
-           inkscape:connector-curvature="0"
-           sodipodi:nodetypes="ccccc" />
-        <path
-           sodipodi:nodetypes="cccc"
-           inkscape:connector-curvature="0"
-           id="path4327"
-           d="M 192.99451,1037.3474 190,1034.3622 l -3.01146,3.0115 z"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-      </g>
-      <g
-         id="g4329"
-         transform="matrix(1,0,0,-1,123.01146,2083.7244)">
-        <path
-           sodipodi:nodetypes="ccccc"
-           inkscape:connector-curvature="0"
-           id="path4331"
-           d="m 189,1039.3309 4e-5,10.0313 1.99996,0 -3e-5,-10.0313 z"
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-        <path
-           style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-           d="m 195,1039.3466 -5,-4.9844 -5,5 z"
-           id="path4333"
-           inkscape:connector-curvature="0"
-           sodipodi:nodetypes="cccc" />
-      </g>
-    </g>
-    <path
-       style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
-       d="m 349,3 0,1 -3,0 0,5.2265625 L 343.95508,10 347,13 l 0,0.904297 1.61133,1.425781 1.88867,-1.671875 1.89062,1.671875 L 354,13.90625 354,13 357.04492,10.044922 355,9.2617188 355,4 l -3,0 0,-1 -3,0 z m -2,2 7,0 0,3.8769531 L 350.48633,7.53125 347,8.8496094 347,5 Z m -0.2793,9.992188 -2.2207,1.966796 0.66211,0.748047 1.55859,-1.378906 L 348.61133,18 350.5,16.328125 352.39062,18 l 1.88868,-1.671875 1.55859,1.378906 0.66211,-0.748047 -2.2207,-1.966796 -1.88868,1.673828 -1.89062,-1.673828 -1.88867,1.673828 -1.89063,-1.673828 z"
-       transform="translate(0,1032.3622)"
-       id="path4341"
-       inkscape:connector-curvature="0" />
-    <g
-       id="g4384">
-      <path
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="m 370,1036.3505 2.81445,2.8203 -4.77734,4.7461 0,0.043 -0.0371,0 0,5.4023 2,0 0,-4.5762 4.22852,-4.2011 2.77148,2.7773 0,-7 -7,-0.012 z"
-         id="path4374"
-         inkscape:connector-curvature="0" />
-      <path
-         sodipodi:nodetypes="ccccccccc"
-         inkscape:connector-curvature="0"
-         id="path4378"
-         d="m 365.18556,1039.1708 4.77734,4.7461 0,0.043 0.0371,0 0,5.4023 -2,0 0,-4.5762 -4.22852,-4.2011 z"
-         style="fill:#000000;fill-opacity:0.5098038;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    </g>
-    <g
-       id="g4388"
-       transform="matrix(-1,0,0,1,760.00001,0)">
-      <path
-         inkscape:connector-curvature="0"
-         id="path4390"
-         d="m 370,1036.3505 2.81445,2.8203 -4.77734,4.7461 0,0.043 -0.0371,0 0,5.4023 2,0 0,-4.5762 4.22852,-4.2011 2.77148,2.7773 0,-7 -7,-0.012 z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-      <path
-         style="fill:#000000;fill-opacity:0.5098038;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="m 365.18556,1039.1708 4.77734,4.7461 0,0.043 0.0371,0 0,5.4023 -2,0 0,-4.5762 -4.22852,-4.2011 z"
-         id="path4392"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="ccccccccc" />
-    </g>
-    <g
-       id="g4438">
-      <path
-         id="path4421"
-         transform="translate(0,1032.3622)"
-         d="m 407.0293,3.9882812 0,5.4023438 0.0371,0 0,0.042969 1.95117,1.9375 0,5.638672 2.8164,-2.820313 2.72657,2.796875 1.44531,-1.382812 -2.76758,-2.837891 0.0195,-0.02148 2.75977,-2.7460939 -5.5293,0.00977 -1.45898,-1.4433584 0,-4.5761719 -2,0 z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         inkscape:connector-curvature="0" />
-      <path
-         sodipodi:nodetypes="ccccccccc"
-         inkscape:connector-curvature="0"
-         id="path4423"
-         d="m 404.21408,1046.5416 4.77734,-4.7461 0,-0.043 0.0371,0 0,-5.4023 -2,0 0,4.5762 -4.22852,4.2011 z"
-         style="fill:#000000;fill-opacity:0.5098038;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    </g>
-    <g
-       id="g4442"
-       transform="matrix(-1,0,0,1,840.01754,0)">
-      <path
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="m 407.0293,3.9882812 0,5.4023438 0.0371,0 0,0.042969 1.95117,1.9375 0,5.638672 2.8164,-2.820313 2.72657,2.796875 1.44531,-1.382812 -2.76758,-2.837891 0.0195,-0.02148 2.75977,-2.7460939 -5.5293,0.00977 -1.45898,-1.4433557 0,-4.5761719 -2,0 z"
-         transform="translate(0,1032.3622)"
-         id="path4444"
-         inkscape:connector-curvature="0" />
-      <path
-         style="fill:#000000;fill-opacity:0.5098038;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="m 404.21408,1046.5416 4.77734,-4.7461 0,-0.043 0.0371,0 0,-5.4023 -2,0 0,4.5762 -4.22852,4.2011 z"
-         id="path4447"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="ccccccccc" />
-    </g>
-    <g
-       id="g4465"
-       transform="translate(-0.99975,0)">
-      <path
-         sodipodi:nodetypes="ccccc"
-         inkscape:connector-curvature="0"
-         id="path4455"
-         d="m 449,1041.3622 4e-5,8 1.99996,0 -3e-5,-8 z"
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-      <path
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="m 454.0156,1045.3622 4.9844,-5 -5,-5 z"
-         id="path4457"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="cccc" />
-      <path
-         style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-         d="m 455,1039.3466 -6,0 0,2 6,-10e-5 z"
-         id="path4461"
-         inkscape:connector-curvature="0"
-         sodipodi:nodetypes="ccccc" />
-      <path
-         sodipodi:nodetypes="ccccc"
-         inkscape:connector-curvature="0"
-         id="path4463"
-         d="m 451.01565,1039.3466 -7.9629,0 0,2 7.9629,-10e-5 z"
-         style="fill:#000000;fill-opacity:0.5098038;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    </g>
-    <path
-       sodipodi:nodetypes="ccccc"
-       inkscape:connector-curvature="0"
-       id="path4473"
-       d="m 472.053,1041.3622 -4e-5,8 -1.99996,0 3e-5,-8 z"
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    <path
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 467.0374,1045.3622 -4.9844,-5 5,-5 z"
-       id="path4475"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="cccc" />
-    <path
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 466.053,1039.3466 6,0 0,2 -6,-10e-5 z"
-       id="path4477"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       sodipodi:nodetypes="ccccc"
-       inkscape:connector-curvature="0"
-       id="path4479"
-       d="m 470.03735,1039.3466 7.9629,0 0,2 -7.9629,-10e-5 z"
-       style="fill:#000000;fill-opacity:0.5098038;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    <path
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 490,1036.3505 2.81445,2.8203 -4.77734,4.7461 0,0.043 -0.0371,0 0,5.4023 2,0 0,-4.5762 4.22852,-4.2011 2.77148,2.7773 0,-7 -7,-0.012 z"
-       id="path4491"
-       inkscape:connector-curvature="0" />
-    <path
-       style="fill:#000000;fill-opacity:0.50980392;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 490,1038.3622 -4e-5,11 -1.99996,0 3e-5,-11 z"
-       id="path4505"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path4510"
-       d="m 490,1036.3505 2.81445,2.8203 -4.77734,4.7461 0,0.043 -0.0371,0 0,5.4023 2,0 0,-4.5762 4.22852,-4.2011 2.77148,2.7773 0,-7 -7,-0.012 z"
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    <path
-       inkscape:connector-curvature="0"
-       id="path4514"
-       d="m 510.00001,1036.3505 -2.81445,2.8203 4.77734,4.7461 0,0.043 0.0371,0 0,5.4023 -2,0 0,-4.5762 -4.22852,-4.2011 -2.77148,2.7773 0,-7 7,-0.012 z"
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    <path
-       sodipodi:nodetypes="ccccc"
-       inkscape:connector-curvature="0"
-       id="path4516"
-       d="m 510.00001,1038.3622 4e-5,11 1.99996,0 -3e-5,-11 z"
-       style="fill:#000000;fill-opacity:0.5098038;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
-    <path
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 510.00001,1036.3505 -2.81445,2.8203 4.77734,4.7461 0,0.043 0.0371,0 0,5.4023 -2,0 0,-4.5762 -4.22852,-4.2011 -2.77148,2.7773 0,-7 7,-0.012 z"
-       id="path4518"
-       inkscape:connector-curvature="0" />
-    <text
-       xml:space="preserve"
-       style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:12px;line-height:125%;font-family:'Times New Roman';-inkscape-font-specification:'Times New Roman';letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       x="7.5"
-       y="1065.3622"
-       id="text4238"
-       sodipodi:linespacing="125%"><tspan
-         sodipodi:role="line"
-         id="tspan4240"
-         x="7.5"
-         y="1065.3622">0    1     2     3    4     5     6     7    8     9   10  11   12    13   14  15   16  17   18  19   20   21   22  23   24  25</tspan></text>
-    <path
-       inkscape:connector-curvature="0"
-       style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
-       d="m 170,1045.3622 c -1.10457,0 -2,0.8954 -2,2 0,1.1046 0.89543,2 2,2 1.10457,0 2,-0.8954 2,-2 0,-1.1046 -0.89543,-2 -2,-2 z"
-       id="path3440"
-       sodipodi:nodetypes="sssss" />
-  </g>
+<svg xmlns="http://www.w3.org/2000/svg" width="520" height="20">
+  <style><![CDATA[.C{fill-opacity:.51}.D{stroke-width:2}]]></style>
+  <path d="M9 6.969V17h2V6.969z"/>
+  <path d="M15 6.985L10 2 5 7zm72.125-2.001V5H86v7.006L82 12l5 5 5-4.984-4-.006V6.984h7V17h2V5h-.469v-.016h-9.406zM28 3.988l2.814 2.82-4.777 4.746v.043H26V17h2v-4.576l4.229-4.201L35 11V4l-7-.012zM53 4l.006 3.984H47v2V17h2V9.984h4.01L53.016 14 58 9l-5-5zm14.025.41L67.004 17h2V9.447l3.686 3.871-2.683 2.695 6.99.055.011-7.085-2.855 2.921zM170 3l-4 5h3v5h2V8h3zm19 3.969V17h2V6.969z"/>
+  <path d="M195 6.985L190 2l-5 5zm-83-2.997l-2.814 2.82 4.777 4.746v.043H114V17h-2v-4.576l-4.229-4.201L105 11V4l7-.012zM128 4l-.006 3.984H134v2V17h-2V9.985h-4.01L127.984 14 123 9l5-5zm25.986.41l.022 12.59h-2V9.447l-3.686 3.871 2.683 2.695-6.99.055-.011-7.085 2.855 2.921z"/>
+  <circle r="3" cy="12" cx="208" fill="none" stroke="#000" class="D"/>
+  <path d="M209 3.988l2.814 2.82-1.766 1.754a4.03 4.03 0 0 1 1.418 1.41l1.762-1.75L216 11V4l-7-.012zm-2 11.855V17h2v-1.131c-.309.077-.627.131-.959.131-.362 0-.707-.065-1.041-.156z"/>
+  <circle cx="228" cy="12" r="3" fill="none" stroke="#000" class="D"/>
+  <path d="M229 3.988l2.814 2.82-1.766 1.754a4.03 4.03 0 0 1 1.418 1.41l1.762-1.75L236 11V4l-7-.012zm-2 11.855V17h2v-1.131c-.309.077-.627.131-.959.131-.362 0-.707-.065-1.041-.156z"/>
+  <circle r="3" cy="12" cx="248" fill="none" stroke="#000" class="D"/>
+  <path d="M249 3.988l2.814 2.82-1.766 1.754a4.03 4.03 0 0 1 1.418 1.41l1.762-1.75L256 11V4l-7-.012zm-2 11.855V17h2v-1.131c-.309.077-.627.131-.959.131a3.94 3.94 0 0 1-1.041-.156zm22-8.874V17h2V6.969z"/>
+  <path d="M275 6.985L270 2l-5 5zM290 3a2 2 0 1 0 0 4 2 2 0 1 0 0-4zm0 4l-4 5h3v5h2v-5h3l-4-5zm14.011-.02v7.976h2V6.98z"/>
+  <path d="M308.006 6.985L305.011 4 302 7.012zm4.005 5.047V2h2v10.031z"/>
+  <path d="M318.011 12.016l-5 4.984-5-5z"/>
+  <path d="M336 12.02v-7.976h-2v7.976z"/>
+  <path d="M332.005 12.015l2.995 2.985 3.011-3.012z m-4.005-5.047v10.031h-2v-10.031z"/>
+  <path d="M322 6.984l5-4.984 5 5z"/>
+  <path d="M349 3v1h-3v5.227l-2.045.773L347 13v.904l1.611 1.426 1.889-1.672 1.891 1.672L354 13.906V13l3.045-2.955L355 9.262V4h-3V3h-3zm-2 2h7v3.877l-3.514-1.346L347 8.85V5zm-.279 9.992l-2.221 1.967.662.748 1.559-1.379 1.89 1.672 1.889-1.672L352.391 18l1.889-1.672 1.559 1.379.662-.748-2.221-1.967-1.889 1.674-1.891-1.674-1.889 1.674-1.891-1.674zM370 3.988l2.814 2.82-4.777 4.746v.043H368V17h2v-4.576l4.229-4.201L377 11V4l-7-.012z"/>
+  <path d="M365.186 6.809l4.777 4.746v.043H370V17h-2v-4.576l-4.229-4.201z" class="C"/>
+  <path d="M390 3.989l-2.814 2.82 4.777 4.746v0.043H392v5.402h-2v-4.576l-4.229-4.201-2.771 2.777v-7l7-0.012z"/>
+  <path d="M394.814 6.809l-4.777 4.746v0.043H390v5.402h2v-4.576l4.229-4.201z" class="C"/>
+  <path d="M407.029 3.988v5.402h.037v.043l1.951 1.938v5.639l2.816-2.82 2.727 2.797 1.445-1.383-2.768-2.838.019-.021 2.76-2.746-5.529.01-1.459-1.443V3.988h-2z"/>
+  <path d="M404.214 14.18l4.777-4.746V9.39h.037V3.988h-2v4.576l-4.229 4.201z" class="C"/>
+  <path d="M432.989 3.988v5.402h-0.037v0.043l-1.951 1.938v5.639l-2.816-2.82-2.727 2.797-1.445-1.383 2.768-2.838-0.019-0.021-2.76-2.746 5.529 0.01 1.459-1.443v-4.576h2z"/>
+  <path d="M435.804 14.18l-4.777-4.746v-0.043h-0.037v-5.402h2v4.576l4.229 4.201z" class="C"/>
+  <path d="M448 9v8h2V9zm5.016 4L458 8l-5-5z"/>
+  <path d="M454 6.985h-6v2h6z"/>
+  <path d="M450.016 6.985h-7.963v2h7.963z" class="C"/>
+  <path d="M472.053 9v8h-2V9zm-5.016 4l-4.984-5 5-5z"/>
+  <path d="M466.053 6.985h6v2h-6z"/>
+  <path d="M470.037 6.985H478v2h-7.963z" class="C"/>
+  <path d="M490 3.988l2.814 2.82-4.777 4.746v.043H488V17h2v-4.576l4.229-4.201L497 11V4l-7-.012z"/>
+  <path d="M490 6v11h-2V6z" class="C"/>
+  <path d="M490 3.988l2.814 2.82-4.777 4.746v.043H488V17h2v-4.576l4.229-4.201L497 11V4l-7-.012zm20 0l-2.814 2.82 4.777 4.746v.043H512V17h-2v-4.576l-4.229-4.201L503 11V4l7-.012z"/>
+  <path d="M510 6v11h2V6z" class="C"/>
+  <path d="M510 3.988l-2.814 2.82 4.777 4.746v.043H512V17h-2v-4.576l-4.229-4.201L503 11V4l7-.012z"/>
 </svg>
diff --git a/app/assets/images/welcome-sprite.png b/app/assets/images/welcome-sprite.png
deleted file mode 100644 (file)
index 30d93d7..0000000
Binary files a/app/assets/images/welcome-sprite.png and /dev/null differ
diff --git a/app/assets/images/welcome-sprite.svg b/app/assets/images/welcome-sprite.svg
deleted file mode 100644 (file)
index 4af03a2..0000000
+++ /dev/null
@@ -1,288 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="1000"
-   height="500"
-   id="svg2"
-   version="1.1"
-   inkscape:version="0.48.4 r9939"
-   sodipodi:docname="welcome-sprite.svg"
-   inkscape:export-filename="C:\Users\simon\Downloads\welcome-sprite.png"
-   inkscape:export-xdpi="90"
-   inkscape:export-ydpi="90">
-  <defs
-     id="defs4" />
-  <sodipodi:namedview
-     id="base"
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1.0"
-     inkscape:pageopacity="0.0"
-     inkscape:pageshadow="2"
-     inkscape:zoom="1"
-     inkscape:cx="372.09193"
-     inkscape:cy="435.3413"
-     inkscape:document-units="px"
-     inkscape:current-layer="layer1"
-     showgrid="false"
-     inkscape:window-width="1369"
-     inkscape:window-height="1036"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="0"
-     showguides="true"
-     inkscape:guide-bbox="true"
-     inkscape:snap-bbox="false"
-     inkscape:snap-nodes="true"
-     inkscape:object-paths="true"
-     inkscape:object-nodes="true"
-     inkscape:snap-grids="true"
-     inkscape:snap-global="false">
-    <inkscape:grid
-       type="xygrid"
-       id="grid2985"
-       empspacing="5"
-       visible="true"
-       enabled="true"
-       snapvisiblegridlinesonly="true" />
-    <sodipodi:guide
-       orientation="1,0"
-       position="100,530"
-       id="guide11961" />
-    <sodipodi:guide
-       orientation="1,0"
-       position="200,540"
-       id="guide11963" />
-    <sodipodi:guide
-       orientation="1,0"
-       position="300,550"
-       id="guide11977" />
-    <sodipodi:guide
-       orientation="1,0"
-       position="400,600"
-       id="guide11979" />
-    <sodipodi:guide
-       orientation="1,0"
-       position="500,580"
-       id="guide11981" />
-    <sodipodi:guide
-       orientation="1,0"
-       position="600,500"
-       id="guide11983" />
-    <sodipodi:guide
-       orientation="1,0"
-       position="700,500"
-       id="guide11985" />
-    <sodipodi:guide
-       orientation="-0.79335322,-0.60876159"
-       position="575.00001,439.99998"
-       id="guide12971" />
-    <sodipodi:guide
-       orientation="0,1"
-       position="420,400"
-       id="guide3038" />
-    <sodipodi:guide
-       orientation="1,0"
-       position="799,715"
-       id="guide3196" />
-  </sodipodi:namedview>
-  <metadata
-     id="metadata7">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <g
-     inkscape:label="Layer 1"
-     inkscape:groupmode="layer"
-     id="layer1"
-     transform="translate(0,-552.36218)">
-    <g
-       id="g11955"
-       transform="translate(0,-3)" />
-    <path
-       inkscape:export-ydpi="90"
-       inkscape:export-xdpi="90"
-       inkscape:export-filename="/Users/saman/work_repos/osm-redesign/renders/share-1.png"
-       sodipodi:nodetypes="ccccccccc"
-       inkscape:connector-curvature="0"
-       id="path6918-2"
-       d="m -153,412.86218 0,-2.00001 10,-3.99999 2,10e-6 0,1.99998 -4,10 -2,1e-5 0,-6 z"
-       style="color:#000000;fill:#70cd8f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter6591-2);enable-background:accumulate" />
-    <path
-       sodipodi:type="arc"
-       style="color:#000000;fill:#70cd8f;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       id="path2987"
-       sodipodi:cx="42.5"
-       sodipodi:cy="42.5"
-       sodipodi:rx="42.5"
-       sodipodi:ry="42.5"
-       d="M 85,42.5 C 85,65.972102 65.972102,85 42.5,85 19.027898,85 0,65.972102 0,42.5 0,19.027898 19.027898,0 42.5,0 65.972102,0 85,19.027898 85,42.5 z"
-       transform="matrix(1.0588235,0,0,1.0588235,5,557.36218)" />
-    <path
-       sodipodi:type="arc"
-       style="color:#000000;fill:#cd7070;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       id="path2987-7"
-       sodipodi:cx="42.5"
-       sodipodi:cy="42.5"
-       sodipodi:rx="42.5"
-       sodipodi:ry="42.5"
-       d="M 85,42.5 C 85,65.972102 65.972102,85 42.5,85 19.027898,85 0,65.972102 0,42.5 0,19.027898 19.027898,0 42.5,0 65.972102,0 85,19.027898 85,42.5 z"
-       transform="matrix(1.0588235,0,0,1.0588235,105,557.36218)" />
-    <path
-       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="m 135,582.36218 -2,0 -3,3 0,2 15,15 -15,15 0,2 3,3 2,0 15,-15 15,15 2,0 3,-3 0,-2 -15,-15 15,-15 0,-2 -3,-3 -2,0 -15,15 z"
-       id="rect3761-9"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccccccccccccccc" />
-    <path
-       sodipodi:type="arc"
-       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       id="path2987-7-7-1"
-       sodipodi:cx="42.5"
-       sodipodi:cy="42.5"
-       sodipodi:rx="42.5"
-       sodipodi:ry="42.5"
-       d="M 85,42.5 C 85,65.972102 65.972102,85 42.5,85 19.027898,85 0,65.972102 0,42.5 0,19.027898 19.027898,0 42.5,0 65.972102,0 85,19.027898 85,42.5 z"
-       transform="matrix(0.3529412,0,0,0.3529412,235,587.36218)" />
-    <path
-       style="opacity:0.5;color:#000000;fill:#7092ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.05882347;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="m 519.72811,582.91357 19.83383,-15.21904 40.43807,49.66766 -19.83383,15.21904 z"
-       id="rect4144"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="color:#000000;fill:#7092ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="m 510.59669,571.01327 19.83383,-15.21904 6.08761,7.93353 -19.83383,15.21904 z"
-       id="rect4174"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       style="color:#000000;fill:#7092ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:10;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="m 563.20997,636.54797 19.83384,-15.21903 1.19788,17.98791 -3.96676,3.04381 z"
-       id="path4182"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccc" />
-    <path
-       sodipodi:type="arc"
-       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       id="path2987-7-7-2"
-       sodipodi:cx="42.5"
-       sodipodi:cy="42.5"
-       sodipodi:rx="42.5"
-       sodipodi:ry="42.5"
-       d="M 85,42.5 C 85,65.972102 65.972102,85 42.5,85 19.027898,85 0,65.972102 0,42.5 0,19.027898 19.027898,0 42.5,0 65.972102,0 85,19.027898 85,42.5 z"
-       transform="matrix(1.0588235,0,0,1.0588235,605,557.36218)" />
-    <path
-       style="color:#000000;fill:#7092ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       d="m 425.00002,639.36218 -20.00002,-20 0,-29 20.00003,-20.00001 67.99997,10e-6 2,2 0,65 -1.99998,2 z"
-       id="rect11998"
-       inkscape:connector-curvature="0"
-       sodipodi:nodetypes="ccccccccc" />
-    <path
-       inkscape:connector-curvature="0"
-       d="m 379.30233,557.36218 c -8.6696,0 -15.69768,7.02808 -15.69768,15.69767 0,1.58143 0.28446,3.07359 0.71948,4.51309 l -39.11337,39.11337 c -1.4395,-0.43502 -2.93166,-0.71948 -4.51309,-0.71948 -8.66959,0 -15.69767,7.02808 -15.69767,15.69768 0,8.66959 7.02808,15.69767 15.69767,15.69767 8.6696,0 15.69768,-7.02808 15.69768,-15.69767 0,-1.58143 -0.28446,-3.07359 -0.71948,-4.51309 l 39.11337,-39.11337 c 1.4395,0.43502 2.93166,0.71948 4.51309,0.71948 8.66959,0 15.69767,-7.02808 15.69767,-15.69768 0,-8.66959 -7.02808,-15.69767 -15.69767,-15.69767 z m 0,9.4186 c 3.46782,0 6.27907,2.81125 6.27907,6.27907 0,3.46783 -2.81125,6.27907 -6.27907,6.27907 -3.46783,0 -6.27907,-2.81124 -6.27907,-6.27907 0,-3.46782 2.81124,-6.27907 6.27907,-6.27907 z m -58.60466,58.60466 c 3.46783,0 6.27907,2.81124 6.27907,6.27907 0,3.46782 -2.81124,6.27907 -6.27907,6.27907 -3.46782,0 -6.27907,-2.81125 -6.27907,-6.27907 0,-3.46783 2.81125,-6.27907 6.27907,-6.27907 z"
-       id="path5387-6-5"
-       style="color:#000000;fill:#7092ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-    <path
-       inkscape:connector-curvature="0"
-       d="m 250,557.36218 c -20.7105,0 -37.5,16.78935 -37.5,37.5 0,20.71072 37.5,52.5 37.5,52.5 0,0 37.5,-31.78928 37.5,-52.5 0,-20.71065 -16.7895,-37.5 -37.5,-37.5 z m 1.1715,22.5 c 8.2845,0 15,6.71572 15,15 0,8.28427 -6.7155,15 -15,15 -8.28375,0 -15,-6.71573 -15,-15 0,-8.28428 6.71625,-15 15,-15 z"
-       id="path8139-4-6-3-5"
-       style="color:#000000;fill:#7092ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-    <path
-       sodipodi:nodetypes="ccccccccccccc"
-       inkscape:connector-curvature="0"
-       id="path12963"
-       d="m 31,598.36218 -2,0 -3,3 0,2 14,14 5,5 5,-5 25,-25 0,-2 -3,-3 -2,0 -25,25 z"
-       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-    <g
-       id="g12979">
-      <path
-         transform="matrix(1.0666649,0,0,1.0666649,-20.332779,546.02902)"
-         d="m 335,80 c 0,8.284271 -6.71573,15 -15,15 -8.28427,0 -15,-6.715729 -15,-15 0,-8.284271 6.71573,-15 15,-15 8.28427,0 15,6.715729 15,15 z"
-         sodipodi:ry="15"
-         sodipodi:rx="15"
-         sodipodi:cy="80"
-         sodipodi:cx="320"
-         id="path12975"
-         style="color:#000000;fill:#7092ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:16;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         sodipodi:type="arc" />
-      <path
-         sodipodi:type="arc"
-         style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:16;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-         id="path12977"
-         sodipodi:cx="320"
-         sodipodi:cy="80"
-         sodipodi:rx="15"
-         sodipodi:ry="15"
-         d="m 335,80 c 0,8.284271 -6.71573,15 -15,15 -8.28427,0 -15,-6.715729 -15,-15 0,-8.284271 6.71573,-15 15,-15 8.28427,0 15,6.715729 15,15 z"
-         transform="matrix(0.46666693,0,0,0.46666693,171.66658,594.02886)" />
-    </g>
-    <path
-       transform="matrix(1.0588235,0,0,1.0588235,605,557.36218)"
-       d="M 85,42.5 C 85,65.972102 65.972102,85 42.5,85 19.027898,85 0,65.972102 0,42.5 0,19.027898 19.027898,0 42.5,0 65.972102,0 85,19.027898 85,42.5 z"
-       sodipodi:ry="42.5"
-       sodipodi:rx="42.5"
-       sodipodi:cy="42.5"
-       sodipodi:cx="42.5"
-       id="path16825"
-       style="color:#000000;fill:#7092ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       sodipodi:type="arc" />
-    <text
-       xml:space="preserve"
-       style="font-size:60px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:125%;letter-spacing:0px;word-spacing:0px;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Helvetica Neue;-inkscape-font-specification:Helvetica Neue Bold"
-       x="633.32001"
-       y="624.29218"
-       id="text16827"
-       sodipodi:linespacing="125%"><tspan
-         sodipodi:role="line"
-         id="tspan16829"
-         x="633.32001"
-         y="624.29218">?</tspan></text>
-    <rect
-       style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       id="rect3053"
-       width="10"
-       height="15.000005"
-       x="415"
-       y="597.36218"
-       rx="3"
-       ry="2.2500007" />
-    <path
-       transform="matrix(1.0588235,0,0,1.0588235,705,557.36218)"
-       d="m 85,42.5 a 42.5,42.5 0 1 1 -85,0 42.5,42.5 0 1 1 85,0 z"
-       sodipodi:ry="42.5"
-       sodipodi:rx="42.5"
-       sodipodi:cy="42.5"
-       sodipodi:cx="42.5"
-       id="path16825-7"
-       style="color:#000000;fill:#7092ff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
-       sodipodi:type="arc" />
-    <text
-       xml:space="preserve"
-       style="font-size:48px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:#ffffff;font-family:Sans;stroke-opacity:1"
-       x="736.80469"
-       y="614.78406"
-       id="text3795"
-       sodipodi:linespacing="125%"><tspan
-         sodipodi:role="line"
-         id="tspan3797"
-         x="736.80469"
-         y="614.78406"
-         style="font-weight:normal;-inkscape-font-specification:Sans;fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-opacity:1">§</tspan></text>
-  </g>
-</svg>
index 20976d15a56ff93264d1d81a511c564840517904..05474212645361fd975d3a0e188edbe1c4bdae81 100644 (file)
@@ -106,6 +106,7 @@ $(document).ready(function () {
     $("body").removeClass("compact-nav");
 
     $("header").removeClass("text-nowrap");
+    $("header nav.secondary > ul").removeClass("flex-nowrap");
 
     updateHeader();
 
index 69d625ecab5420ca85f83bcb1a2a0895ef5ec44e..7a761b50036dd30d02c1ec2d2fd0ca16f6b660d0 100644 (file)
@@ -58,7 +58,7 @@ OSM.initializeBrowse = function (map) {
               .click(cancel))),
         $("<p class='alert alert-warning'>")
           .text(I18n.t("browse.start_rjs.feature_warning", { num_features: count, max_features: limit })),
-        $("<input type='submit' class='btn btn-primary'>")
+        $("<input type='submit' class='btn btn-primary d-block mx-auto'>")
           .val(I18n.t("browse.start_rjs.load_data"))
           .click(add)));
   }
index 42854f2e2897b8ed19c64c6c6c6c48560dcead3a..f6b0581caef1d7ba5ce98a21da8990ac05638949 100644 (file)
@@ -307,7 +307,7 @@ OSM.Directions = function (map) {
         var row = $("<tr class='turn'/>");
         row.append("<td class='border-0'><div class='direction i" + direction + "'/></td> ");
         row.append("<td>" + instruction);
-        row.append("<td class='distance text-muted text-end'>" + dist);
+        row.append("<td class='distance text-body-secondary text-end'>" + dist);
 
         row.on("click", function () {
           popup
@@ -357,7 +357,7 @@ OSM.Directions = function (map) {
     getRoute(true, true);
   });
 
-  $(".routing_marker").on("dragstart", function (e) {
+  $(".routing_marker_column img").on("dragstart", function (e) {
     var dt = e.originalEvent.dataTransfer;
     dt.effectAllowed = "move";
     var dragData = { type: $(this).data("type") };
index 15fedb1d113b52bbd8d402427af3d38c8c7f23ed..3839d2715d731121cc90308134e9724e5ced246e 100644 (file)
@@ -36,12 +36,12 @@ OSM.Note = function (map) {
   };
 
   function initialize(path, id, callback) {
-    content.find("input[type=submit]").on("click", function (e) {
+    content.find("button[type=submit]").on("click", function (e) {
       e.preventDefault();
       var data = $(e.target).data();
       var form = e.target.form;
 
-      $(form).find("input[type=submit]").prop("disabled", true);
+      $(form).find("button[type=submit]").prop("disabled", true);
 
       $.ajax({
         url: data.url,
@@ -83,12 +83,12 @@ OSM.Note = function (map) {
   }
 
   function updateButtons(form) {
-    $(form).find("input[type=submit]").prop("disabled", false);
+    $(form).find("button[type=submit]").prop("disabled", false);
     if ($(form.text).val() === "") {
-      $(form.close).val($(form.close).data("defaultActionText"));
+      $(form.close).text($(form.close).data("defaultActionText"));
       $(form.comment).prop("disabled", true);
     } else {
-      $(form.close).val($(form.close).data("commentActionText"));
+      $(form.close).text($(form.close).data("commentActionText"));
       $(form.comment).prop("disabled", false);
     }
   }
index d41fc7d532b04865a65cd1a068956e08ca64c86d..94bb52a1be485b98cd6c8e87e208884f787d33fd 100644 (file)
@@ -9,9 +9,9 @@ OSM.Search = function (map) {
     }
   });
 
-  $(".search_form a.button.switch_link").on("click", function (e) {
+  $(".search_form a.btn.switch_link").on("click", function (e) {
     e.preventDefault();
-    var query = $(e.target).parent().parent().find("input[name=query]").val();
+    var query = $(this).closest("form").find("input[name=query]").val();
     if (query) {
       OSM.router.route("/directions?from=" + encodeURIComponent(query) + OSM.formatHash(map));
     } else {
index 1a34b05c24f80522d6d323e123d31a691c58845c..55d492b29421968cad2e0b3585aebdcdd2c0e23a 100644 (file)
@@ -84,7 +84,7 @@ L.OSM.layers = function (options) {
 
       $("<p>")
         .text(I18n.t("javascripts.map.layers.overlays"))
-        .attr("class", "text-muted")
+        .attr("class", "text-body-secondary small mb-2")
         .appendTo(overlaySection);
 
       var overlays = $("<ul class='list-unstyled form-check'>")
index 69db10ad78ae80069a8c64f8d1c7329942e151f9..0b868d2cac6cf31bdd8688c854a0368559031295 100644 (file)
@@ -98,7 +98,7 @@ L.OSM.share = function (options) {
           .on("click", select))
       .append(
         $("<p>")
-          .attr("class", "text-muted")
+          .attr("class", "text-body-secondary")
           .text(I18n.t("javascripts.share.paste_html")));
 
     // Geo URI
@@ -128,7 +128,7 @@ L.OSM.share = function (options) {
 
     $("<div>")
       .attr("id", "export-warning")
-      .attr("class", "text-muted")
+      .attr("class", "text-body-secondary")
       .text(I18n.t("javascripts.share.only_standard_layer"))
       .appendTo($imageSection);
 
@@ -223,7 +223,7 @@ L.OSM.share = function (options) {
     };
 
     $("<p>")
-      .attr("class", "text-muted")
+      .attr("class", "text-body-secondary")
       .html(I18n.t("javascripts.share.image_dimensions", args))
       .appendTo($form);
 
index 2e33438dbdef6bc9c821e8c217ed41415d05eb08..e429f4479f143dfe2d50622b870d62d60558a263 100644 (file)
@@ -39,9 +39,9 @@ OSM = {
   MARKER_ICON_2X:          <%= image_path("leaflet/dist/images/marker-icon-2x.png").to_json %>,
   MARKER_SHADOW:           <%= image_path("leaflet/dist/images/marker-shadow.png").to_json %>,
 
-  NEW_NOTE_MARKER:         <%= image_path("new_note_marker.png").to_json %>,
-  OPEN_NOTE_MARKER:        <%= image_path("open_note_marker.png").to_json %>,
-  CLOSED_NOTE_MARKER:      <%= image_path("closed_note_marker.png").to_json %>,
+  NEW_NOTE_MARKER:         <%= image_path("new_note_marker.svg").to_json %>,
+  OPEN_NOTE_MARKER:        <%= image_path("open_note_marker.svg").to_json %>,
+  CLOSED_NOTE_MARKER:      <%= image_path("closed_note_marker.svg").to_json %>,
 
   apiUrl: function (object) {
     var apiType = object.type === "note" ? "notes" : object.type;
index 12d115073f2f3cede709c3bfdc283a09453f95ad..4cc31d611b6d7dd0187ca475e08b298d0636e1c9 100644 (file)
@@ -16,8 +16,6 @@ time[title] {
   text-decoration: underline dotted;
 }
 
-#container { position: relative; }
-
 /* Rules for icons */
 
 .icon {
@@ -50,7 +48,7 @@ time[title] {
 
 /* Utility for de-emphasizing content */
 
-.text-muted a {
+.text-body-secondary a {
   color: $blue;
 }
 
@@ -79,7 +77,7 @@ time[title] {
   position: absolute;
   top: 0;
   right: 0;
-  background: image-url("menu-icon.png") no-repeat;
+  background: image-url("menu-icon.svg") no-repeat;
   background-size: 30px 30px;
   width: 30px;
   height: 30px;
@@ -98,23 +96,13 @@ header {
   position: relative;
   font-size: 14px;
 
-  h1, nav, nav > ul, nav > ul > li {
-    display: inline-block;
-  }
-
   > * {
-    height: 100%;
     padding: $lineheight * 0.5;
   }
 
-  img.logo {
-    margin-top: -2px;
-  }
-
   h1 {
+    height: $headerHeight;
     font-size: 18px;
-    line-height: 1.2;
-    padding-top: 15px;
   }
 
   .btn {
@@ -124,6 +112,10 @@ header {
   nav.primary {
     margin-right: auto;
   }
+
+  .username {
+    max-width: 12em;
+  }
 }
 
 nav.primary {
@@ -160,7 +152,7 @@ nav.primary {
 
 nav.secondary {
   .nav-link {
-    padding: 0.2rem;
+    padding: 0.3rem;
   }
 }
 
@@ -197,7 +189,7 @@ body.small-nav {
     min-height: $headerHeight;
 
     &.closed nav {
-      display: none;
+      display: none !important;
     }
 
     .search_forms {
@@ -222,6 +214,8 @@ body.small-nav {
   }
 
   nav.secondary {
+    flex-direction: column;
+
     .user-menu, .login-menu {
       width: 100%;
     }
@@ -429,10 +423,6 @@ body.small-nav {
   }
 
   .overlay-layers {
-    p {
-      font-size: 13px;
-      margin-bottom: 8px;
-    }
     li.disabled { color: $darkgrey; }
   }
 }
@@ -499,16 +489,6 @@ body.small-nav {
 
 .donate-attr { color: darken($green, 10%) !important; }
 
-/* Rules for the sidebar */
-
-#browse_status {
-  input {
-    display: block;
-    margin-left: auto;
-    margin-right: auto;
-  }
-}
-
 /* Temporary label size override until we remove site-wide font customisation */
 
 form {
@@ -566,7 +546,7 @@ header .search_forms,
 /* Rules for routing */
 
 div.direction {
-  background-image: image-url('routing-sprite.png');
+  background-image: image-url('routing-sprite.svg');
   width: 20px;
   height: 20px;
   background-repeat: no-repeat;
@@ -588,10 +568,12 @@ tr.turn {
     cursor: pointer;
 }
 
-.routing_marker { width: 15px; cursor: move; }
+.routing_marker_column {
+  width: 15px;
 
-.browse_status {
-  display: none;
+  img {
+    cursor: move;
+  }
 }
 
 /* Rules for the history sidebar */
@@ -642,26 +624,11 @@ tr.turn {
     }
   }
 
-  .note-description {
-    overflow: hidden;
-    margin: 0 0 10px 10px;
-  }
-
   .query-results {
     display: none;
   }
 }
 
-/* Bootstrap buttons don't have any vertical margin, so
-   they touch when adjacent buttons wrap onto a new line
-   e.g. wide form buttons on a narrow sidebar */
-
-.btn-wrapper {
-  > .btn {
-    margin-bottom: $spacer * 0.25;
-  }
-}
-
 /* Force LTR/RTL alignment for placeholder text */
 
 .form-control::placeholder {
@@ -891,52 +858,7 @@ div.secondary-actions {
   }
 }
 
-/* Rules for the "Welcome" page */
-.site-welcome, .site-fixthemap {
-  .sprite {
-    background-image: image-url("welcome-sprite.png");
-    background-size: 500px 250px;
-    display: block;
-  }
-
-  .sprite.small {
-    width: 50px;
-    height: 50px;
-  }
-
-  .sprite.x {
-    /*rtl:ignore*/ background-position: -50px 0;
-  }
-
-  .sprite.term {
-    margin-right: 10px;
-    vertical-align: middle;
-  }
-
-  .sprite.node {
-    /*rtl:ignore*/ background-position: -100px 0;
-  }
-
-  .sprite.way {
-    /*rtl:ignore*/ background-position: -150px 0;
-  }
-
-  .sprite.tag {
-    /*rtl:ignore*/ background-position: -200px 0;
-  }
-
-  .sprite.editor {
-    /*rtl:ignore*/ background-position: -250px 0;
-  }
-
-  .sprite.question {
-    /*rtl:ignore*/ background-position: -300px 0;
-  }
-
-  .sprite.rules {
-    /*rtl:ignore*/ background-position: -350px 0;
-  }
-}
+/* Rules for the "About" page */
 
 .site-about #content {
   .content-inner {
@@ -971,37 +893,6 @@ div.secondary-actions {
       margin-left: -1em;
     }
   }
-
-  .icon {
-    width: 30px;
-    height: 30px;
-    background: 40px 40px image-url('about/sprite.png') no-repeat;
-
-    &.local {
-      /*rtl:ignore*/
-      background-position: 0px 0px;
-    }
-    &.community {
-      /*rtl:ignore*/
-      background-position: 0px -40px;
-    }
-    &.open {
-      /*rtl:ignore*/
-      background-position: 0px -80px;
-    }
-    &.partners {
-      /*rtl:ignore*/
-      background-position: 0px -120px;
-    }
-    &.infringement {
-      /*rtl:ignore*/
-      background-position: 0px -160px;
-    }
-    &.legal {
-      /*rtl:ignore*/
-      background-position: -45px -160px;
-    }
-  }
 }
 
 .auth-container {
index 6b47ca6660d1ee200691f05b0443178eb1d54997..d45dce66a8e00f6f413831d767436b8b537524e2 100644 (file)
@@ -11,15 +11,13 @@ class AccountsController < ApplicationController
 
   before_action :check_database_readable
   before_action :check_database_writable, :only => [:update]
-  before_action :allow_thirdparty_images, :only => [:edit, :update]
+
+  allow_thirdparty_images :only => [:edit, :update]
+  allow_social_login :only => [:edit, :update]
 
   def edit
     @tokens = current_user.oauth_tokens.authorized
 
-    append_content_security_policy_directives(
-      :form_action => %w[accounts.google.com *.facebook.com login.microsoftonline.com github.com meta.wikimedia.org]
-    )
-
     if errors = session.delete(:user_errors)
       errors.each do |attribute, error|
         current_user.errors.add(attribute, error)
@@ -31,10 +29,6 @@ class AccountsController < ApplicationController
   def update
     @tokens = current_user.oauth_tokens.authorized
 
-    append_content_security_policy_directives(
-      :form_action => %w[accounts.google.com *.facebook.com login.microsoftonline.com github.com meta.wikimedia.org]
-    )
-
     user_params = params.require(:user).permit(:display_name, :new_email, :pass_crypt, :pass_crypt_confirmation, :auth_provider)
 
     if params[:user][:auth_provider].blank? ||
index 80222c40bd93fb622753a5d672841cbe1fa2d12d..cbdcace0cd80b1a7c87ea47535b2cb81328b75fa 100644 (file)
@@ -1,5 +1,7 @@
 module Api
   class CapabilitiesController < ApiController
+    skip_before_action :check_api_readable
+
     authorize_resource :class => false
 
     before_action :set_request_formats
index 756e56dccdfb706d8d6e7c4456683fcc232eb08c..4a96ec3bbaef00087e8b03a464c7ee78e65c56c2 100644 (file)
@@ -1,7 +1,6 @@
 module Api
   class ChangesetCommentsController < ApiController
     before_action :check_api_writable
-    before_action :check_api_readable, :except => [:create]
     before_action :authorize
 
     authorize_resource
@@ -105,7 +104,7 @@ module Api
     ##
     # Check if the current user has exceed the rate limit for comments
     def rate_limit_exceeded?
-      recent_comments = current_user.changeset_comments.where("created_at >= ?", Time.now.utc - 1.hour).count
+      recent_comments = current_user.changeset_comments.where(:created_at => Time.now.utc - 1.hour..).count
 
       recent_comments >= current_user.max_changeset_comments_per_hour
     end
index 616d3fdec9d5360232740ed876d17e4a30bd8bcb..3d59eeb171e4232c70d5fe1b68dc5252a6d4de2b 100644 (file)
@@ -3,7 +3,6 @@
 module Api
   class ChangesetsController < ApiController
     before_action :check_api_writable, :only => [:create, :update, :upload, :subscribe, :unsubscribe]
-    before_action :check_api_readable, :except => [:index, :create, :update, :upload, :download, :subscribe, :unsubscribe]
     before_action :setup_user_auth, :only => [:show]
     before_action :authorize, :only => [:create, :update, :upload, :close, :subscribe, :unsubscribe]
 
@@ -331,7 +330,7 @@ module Api
         changesets.where("closed_at >= ? and created_at <= ?", from, to)
       else
         # if there is no comma, assume its a lower limit on time
-        changesets.where("closed_at >= ?", Time.parse(time).utc)
+        changesets.where(:closed_at => Time.parse(time).utc..)
       end
       # stupid Time seems to throw both of these for bad parsing, so
       # we have to catch both and ensure the correct code path is taken.
index 5a05f6de2b527e6c236b665007ab8a5cd309b534..6d4a9feb6c3d8062cf141fb375eca35a42da018e 100644 (file)
@@ -1,7 +1,5 @@
 module Api
   class MapController < ApiController
-    before_action :check_api_readable
-
     authorize_resource :class => false
 
     around_action :api_call_handle_error, :api_call_timeout
index dc7d04dc5792d93698aa7ddc8b899a0592485c86..5aad78dbffb91bfc99c36f36adcbb20893b2d5dc 100644 (file)
@@ -3,7 +3,6 @@
 module Api
   class NodesController < ApiController
     before_action :check_api_writable, :only => [:create, :update, :delete]
-    before_action :check_api_readable, :except => [:create, :update, :delete]
     before_action :authorize, :only => [:create, :update, :delete]
 
     authorize_resource
index 8a0a82c40150687063fbf0720b5114c409c73725..d53059a94e0f019f1e56e374e332d8b6f483f07f 100644 (file)
@@ -1,6 +1,5 @@
 module Api
   class NotesController < ApiController
-    before_action :check_api_readable
     before_action :check_api_writable, :only => [:create, :comment, :close, :reopen, :destroy]
     before_action :setup_user_auth, :only => [:create, :show]
     before_action :authorize, :only => [:close, :reopen, :destroy, :comment]
index 6a468a900631953247414ecee55145745c393e62..2343252dbb0a63243ece6e1c90c9de0875dfee4c 100644 (file)
@@ -3,7 +3,6 @@
 # nodes, ways and relations are basically identical.
 module Api
   class OldElementsController < ApiController
-    before_action :check_api_readable
     before_action :check_api_writable, :only => [:redact]
     before_action :setup_user_auth, :only => [:history, :show]
     before_action :authorize, :only => [:redact]
index 8c0c949dc2c71302f64b1611f2977961a71d7718..717bbfa6f7fd1c23428c9d952b1e18d55ef5032b 100644 (file)
@@ -1,7 +1,5 @@
 module Api
   class PermissionsController < ApiController
-    before_action :check_api_readable
-
     authorize_resource :class => false
 
     before_action :setup_user_auth
index e82ac6368a371fb43bb2bfaa6e7db071f3f0ddef..5fb99dbd18a390e1e234308bcf78b90f05a36939 100644 (file)
@@ -1,7 +1,6 @@
 module Api
   class RelationsController < ApiController
     before_action :check_api_writable, :only => [:create, :update, :delete]
-    before_action :check_api_readable, :except => [:create, :update, :delete]
     before_action :authorize, :only => [:create, :update, :delete]
 
     authorize_resource
index f38351de96f0884e0a69aecebbb430871ad2c231..d8d9da98b680f62729b503085a5ab36c40e318cc 100644 (file)
@@ -1,7 +1,5 @@
 module Api
   class TracepointsController < ApiController
-    before_action :check_api_readable
-
     authorize_resource
 
     around_action :api_call_handle_error, :api_call_timeout
index 956bcde6e82dccabb23e022919d0d87673e74ec3..738642fff7dc56531bec8d550c3a5f31dcc414b6 100644 (file)
@@ -1,14 +1,11 @@
 module Api
   class TracesController < ApiController
-    before_action :check_database_readable, :except => [:show, :data]
-    before_action :check_database_writable, :only => [:create, :update, :destroy]
+    before_action :check_api_writable, :only => [:create, :update, :destroy]
     before_action :set_locale
     before_action :authorize
 
     authorize_resource
 
-    before_action :check_api_readable, :only => [:show, :data]
-    before_action :check_api_writable, :only => [:create, :update, :destroy]
     before_action :offline_error, :only => [:create, :destroy, :data]
     around_action :api_call_handle_error
 
index 19fd4b400b043c8736d29cab5fb236e37240856f..6c285e14a253d50e45daa31ef57134071560a708 100644 (file)
@@ -1,7 +1,5 @@
 module Api
   class UserBlocksController < ApiController
-    before_action :check_api_readable
-
     authorize_resource
 
     around_action :api_call_handle_error, :api_call_timeout
index 02a23095addd70ef9a72dde3d84cad35a257b308..cb852ce881aa10909a267e776aa884c406e388b4 100644 (file)
@@ -1,6 +1,7 @@
 # Update and read user preferences, which are arbitrary key/val pairs
 module Api
   class UserPreferencesController < ApiController
+    before_action :check_api_writable, :only => [:update_all, :update, :destroy]
     before_action :authorize
 
     authorize_resource
@@ -66,7 +67,7 @@ module Api
         pref.k = params[:preference_key]
       end
 
-      pref.v = request.raw_post.chomp
+      pref.v = request.raw_post.chomp.force_encoding("UTF-8")
       pref.save!
 
       render :plain => ""
index 6fa47095a16f9c062ba246100bea989ff7dd9ecb..5ff275ee9dc52f268b250d52f445dd71a3295b1c 100644 (file)
@@ -1,6 +1,5 @@
 module Api
   class UsersController < ApiController
-    before_action :check_api_readable
     before_action :disable_terms_redirect, :only => [:details]
     before_action :setup_user_auth, :only => [:show, :index]
     before_action :authorize, :only => [:details, :gpx_files]
index d5c9c5f87cebf2036316655c72013b49b55b4832..d311a18d24f14a1b3304bc3b8c7325272a805323 100644 (file)
@@ -1,5 +1,6 @@
 module Api
   class VersionsController < ApiController
+    skip_before_action :check_api_readable
     authorize_resource :class => false
 
     before_action :set_request_formats
index f8254d8027bacbd43fe8e0c6c641c78b8b04e338..4099e16763f15554e7b33de5f35cffb7eb8885f9 100644 (file)
@@ -1,7 +1,6 @@
 module Api
   class WaysController < ApiController
     before_action :check_api_writable, :only => [:create, :update, :delete]
-    before_action :check_api_readable, :except => [:create, :update, :delete]
     before_action :authorize, :only => [:create, :update, :delete]
 
     authorize_resource
index e4e156ee85a78fd2b6b23cf29e27bbf5910ddb85..ff7f694c5eb63bac0ac23c7e00ba454630f7ac69 100644 (file)
@@ -1,6 +1,8 @@
 class ApiController < ApplicationController
   skip_before_action :verify_authenticity_token
 
+  before_action :check_api_readable
+
   private
 
   ##
@@ -106,8 +108,12 @@ class ApiController < ApplicationController
     if doorkeeper_token&.accessible?
       self.current_user = User.find(doorkeeper_token.resource_owner_id)
     elsif Authenticator.new(self, [:token]).allow?
-      # self.current_user setup by OAuth
-    elsif Settings.basic_auth_support
+      if Settings.oauth_10a_support
+        # self.current_user setup by OAuth
+      else
+        report_error t("application.oauth_10a_disabled", :link => t("application.auth_disabled_link")), :forbidden
+      end
+    else
       username, passwd = auth_data # parse from headers
       # authenticate per-scheme
       self.current_user = if username.nil?
@@ -115,8 +121,14 @@ class ApiController < ApplicationController
                           else
                             User.authenticate(:username => username, :password => passwd) # basic auth
                           end
-      # log if we have authenticated using basic auth
-      logger.info "Authenticated as user #{current_user.id} using basic authentication" if current_user
+      if username && current_user
+        if Settings.basic_auth_support
+          # log if we have authenticated using basic auth
+          logger.info "Authenticated as user #{current_user.id} using basic authentication"
+        else
+          report_error t("application.basic_auth_disabled", :link => t("application.auth_disabled_link")), :forbidden
+        end
+      end
     end
 
     # have we identified the user?
index 488e6a8189cbb41c5b389f34cb9c8b48c8777783..05fa76658d55bedeecf412c4a5d1927cb6ce3899 100644 (file)
@@ -10,14 +10,33 @@ class ApplicationController < ActionController::Base
   rescue_from CanCan::AccessDenied, :with => :deny_access
   check_authorization
 
+  rescue_from RailsParam::InvalidParameterError, :with => :invalid_parameter
+
   before_action :fetch_body
-  around_action :better_errors_allow_inline, :if => proc { Rails.env.development? }
 
   attr_accessor :current_user, :oauth_token
 
   helper_method :current_user
   helper_method :oauth_token
 
+  def self.allow_thirdparty_images(**options)
+    content_security_policy(options) do |policy|
+      policy.img_src("*")
+    end
+  end
+
+  def self.allow_social_login(**options)
+    content_security_policy(options) do |policy|
+      policy.form_action(*policy.form_action, "accounts.google.com", "*.facebook.com", "login.microsoftonline.com", "github.com", "meta.wikimedia.org")
+    end
+  end
+
+  def self.allow_all_form_action(**options)
+    content_security_policy(options) do |policy|
+      policy.form_action(nil)
+    end
+  end
+
   private
 
   def authorize_web
@@ -67,6 +86,10 @@ class ApplicationController < ActionController::Base
     @oauth_token = current_user.oauth_token(Settings.oauth_application) if current_user && Settings.key?(:oauth_application)
   end
 
+  def require_oauth_10a_support
+    report_error t("application.oauth_10a_disabled", :link => t("application.auth_disabled_link")), :forbidden unless Settings.oauth_10a_support
+  end
+
   ##
   # require the user to have cookies enabled in their browser
   def require_cookies
@@ -227,13 +250,15 @@ class ApplicationController < ActionController::Base
   end
 
   def map_layout
-    append_content_security_policy_directives(
-      :child_src => %w[http://127.0.0.1:8111 https://127.0.0.1:8112],
-      :frame_src => %w[http://127.0.0.1:8111 https://127.0.0.1:8112],
-      :connect_src => [Settings.nominatim_url, Settings.overpass_url, Settings.fossgis_osrm_url, Settings.graphhopper_url, Settings.fossgis_valhalla_url],
-      :form_action => %w[render.openstreetmap.org],
-      :style_src => %w['unsafe-inline']
-    )
+    policy = request.content_security_policy.clone
+
+    policy.child_src(*policy.child_src, "http://127.0.0.1:8111", "https://127.0.0.1:8112")
+    policy.frame_src(*policy.frame_src, "http://127.0.0.1:8111", "https://127.0.0.1:8112")
+    policy.connect_src(*policy.connect_src, Settings.nominatim_url, Settings.overpass_url, Settings.fossgis_osrm_url, Settings.graphhopper_url, Settings.fossgis_valhalla_url)
+    policy.form_action(*policy.form_action, "render.openstreetmap.org")
+    policy.style_src(*policy.style_src, :unsafe_inline)
+
+    request.content_security_policy = policy
 
     case Settings.status
     when "database_offline", "api_offline"
@@ -245,10 +270,6 @@ class ApplicationController < ActionController::Base
     request.xhr? ? "xhr" : "map"
   end
 
-  def allow_thirdparty_images
-    append_content_security_policy_directives(:img_src => %w[*])
-  end
-
   def preferred_editor
     if params[:editor]
       params[:editor]
@@ -271,17 +292,6 @@ class ApplicationController < ActionController::Base
     end
   end
 
-  def better_errors_allow_inline
-    yield
-  rescue StandardError
-    append_content_security_policy_directives(
-      :script_src => %w['unsafe-inline'],
-      :style_src => %w['unsafe-inline']
-    )
-
-    raise
-  end
-
   def current_ability
     Ability.new(current_user)
   end
@@ -306,6 +316,17 @@ class ApplicationController < ActionController::Base
     end
   end
 
+  def invalid_parameter(_exception)
+    if request.get?
+      respond_to do |format|
+        format.html { redirect_to :controller => "/errors", :action => "bad_request" }
+        format.any { head :bad_request }
+      end
+    else
+      head :bad_request
+    end
+  end
+
   # extract authorisation credentials from headers, returns user = nil if none
   def auth_data
     if request.env.key? "X-HTTP_AUTHORIZATION" # where mod_rewrite might have put it
index 6a80f260ad05f99128a631558c2adac886f49b2a..a5ddaf364fe44ae48dafeaa5f0e9761830e2ee98 100644 (file)
@@ -18,6 +18,8 @@ class ChangesetsController < ApplicationController
   ##
   # list non-empty changesets in reverse chronological order
   def index
+    param! :max_id, Integer, :min => 1
+
     @params = params.permit(:display_name, :bbox, :friends, :nearby, :max_id, :list)
 
     if request.format == :atom && @params[:max_id]
@@ -58,7 +60,7 @@ class ChangesetsController < ApplicationController
         changesets = changesets.where(:user => current_user.nearby)
       end
 
-      changesets = changesets.where("changesets.id <= ?", @params[:max_id]) if @params[:max_id]
+      changesets = changesets.where(:changesets => { :id => ..@params[:max_id] }) if @params[:max_id]
 
       @changesets = changesets.order("changesets.id DESC").limit(20).preload(:user, :changeset_tags, :comments)
 
@@ -86,7 +88,7 @@ class ChangesetsController < ApplicationController
     if @changeset.user.active? && @changeset.user.data_public?
       changesets = conditions_nonempty(@changeset.user.changesets)
       @next_by_user = changesets.where("id > ?", @changeset.id).reorder(:id => :asc).first
-      @prev_by_user = changesets.where("id < ?", @changeset.id).reorder(:id => :desc).first
+      @prev_by_user = changesets.where(:id => ...@changeset.id).reorder(:id => :desc).first
     end
     render :layout => map_layout
   rescue ActiveRecord::RecordNotFound
index 3dc9f52aad3057726c69435227ec381a3fe808f0..79ab10bfb1a6c9bb8c47937406b2d29952df9c70 100644 (file)
@@ -6,6 +6,9 @@ module PaginationMethods
   ##
   # limit selected items to one page, get ids of first item before/after the page
   def get_page_items(items, includes: [], limit: 20)
+    param! :before, Integer, :min => 1
+    param! :after, Integer, :min => 1
+
     id_column = "#{items.table_name}.id"
     page_items = if params[:before]
                    items.where("#{id_column} < ?", params[:before]).order(:id => :desc)
index 5dcddb82debb5e4849039c28e2d4cf128d6f5c5f..45cf0d9439607642725c088feb5517215e232524 100644 (file)
@@ -39,7 +39,7 @@ module SessionMethods
     session[:fingerprint] = user.fingerprint
     session_expires_after 28.days if session[:remember_me]
 
-    target = referer || session[:referer] || url_for(:controller => :site, :action => :index)
+    target = referer || url_for(:controller => :site, :action => :index)
 
     # The user is logged in, so decide where to send them:
     #
@@ -56,31 +56,28 @@ module SessionMethods
     end
 
     session.delete(:remember_me)
-    session.delete(:referer)
   end
 
   ##
   # process a failed login
-  def failed_login(message, username = nil)
+  def failed_login(message, username, referer = nil)
     flash[:error] = message
 
-    redirect_to :controller => "sessions", :action => "new", :referer => session[:referer],
+    redirect_to :controller => "sessions", :action => "new", :referer => referer,
                 :username => username, :remember_me => session[:remember_me]
 
     session.delete(:remember_me)
-    session.delete(:referer)
   end
 
   ##
   #
-  def unconfirmed_login(user)
+  def unconfirmed_login(user, referer = nil)
     session[:pending_user] = user.id
 
     redirect_to :controller => "confirmations", :action => "confirm",
-                :display_name => user.display_name, :referer => session[:referer]
+                :display_name => user.display_name, :referer => referer
 
     session.delete(:remember_me)
-    session.delete(:referer)
   end
 
   ##
index 8da0842eb09cbee7942cf28d725d5ee6b49e9308..f3fbcd1fd0193aed5b70015f24490e0b2a7176bd 100644 (file)
@@ -12,7 +12,8 @@ class DiaryEntriesController < ApplicationController
 
   before_action :lookup_user, :only => [:show, :comments]
   before_action :check_database_writable, :only => [:new, :create, :edit, :update, :comment, :hide, :hidecomment, :subscribe, :unsubscribe]
-  before_action :allow_thirdparty_images, :only => [:new, :create, :edit, :update, :index, :show, :comments]
+
+  allow_thirdparty_images :only => [:new, :create, :edit, :update, :index, :show, :comments]
 
   def index
     if params[:display_name]
@@ -67,6 +68,7 @@ class DiaryEntriesController < ApplicationController
     @entry = entries.find_by(:id => params[:id])
     if @entry
       @title = t ".title", :user => params[:display_name], :title => @entry.title
+      @og_image = @entry.body.image
       @comments = can?(:unhidecomment, DiaryEntry) ? @entry.comments : @entry.visible_comments
     else
       @title = t "diary_entries.no_such_entry.title", :id => params[:id]
index ee1fcca6f8892ea346c1cacd3161eebc9c56983c..605403348a07ecacc543ae4c9ecfdc2eabe759ab 100644 (file)
@@ -5,6 +5,13 @@ class ErrorsController < ApplicationController
 
   before_action :set_locale
 
+  def bad_request
+    respond_to do |format|
+      format.html { render :status => :bad_request }
+      format.any { render :status => :bad_request, :plain => "" }
+    end
+  end
+
   def forbidden
     respond_to do |format|
       format.html { render :status => :forbidden }
index 94851de96485741758d681a1247be029c402dc17..cddc97b6883e13044601c5b4a3a24b1f84d83f74 100644 (file)
@@ -4,6 +4,10 @@ class ExportController < ApplicationController
   before_action :update_totp, :only => [:finish]
   authorize_resource :class => false
 
+  content_security_policy(:only => :embed) do |policy|
+    policy.frame_ancestors("*")
+  end
+
   caches_page :embed
 
   # When the user clicks 'Export' we redirect to a URL which generates the export download
@@ -25,9 +29,5 @@ class ExportController < ApplicationController
     end
   end
 
-  def embed
-    append_content_security_policy_directives(
-      :frame_ancestors => %w[*]
-    )
-  end
+  def embed; end
 end
index 7b14f2e820799d3c9f47a2092cbdcbe646d552cc..ab54cbfd1b31f7dcd8fec56d4e23ec9c5c92908e 100644 (file)
@@ -19,7 +19,7 @@ class FriendshipsController < ApplicationController
       friendship.befriendee = @friend
       if current_user.friends_with?(@friend)
         flash[:warning] = t ".already_a_friend", :name => @friend.display_name
-      elsif current_user.friendships.where("created_at >= ?", Time.now.utc - 1.hour).count >= current_user.max_friends_per_hour
+      elsif current_user.friendships.where(:created_at => Time.now.utc - 1.hour..).count >= current_user.max_friends_per_hour
         flash.now[:error] = t ".limit_exceeded"
       elsif friendship.save
         flash[:notice] = t ".success", :name => @friend.display_name
index 111a31f96ae8cf4b27ce108215368aad5207d78b..779174e255ffc915fe14f44c67e2710b8cb87cba 100644 (file)
@@ -11,7 +11,8 @@ class MessagesController < ApplicationController
   before_action :lookup_user, :only => [:new, :create]
   before_action :check_database_readable
   before_action :check_database_writable, :only => [:new, :create, :reply, :mark, :destroy]
-  before_action :allow_thirdparty_images, :only => [:new, :create, :show]
+
+  allow_thirdparty_images :only => [:new, :create, :show]
 
   # Show a message
   def show
@@ -42,7 +43,7 @@ class MessagesController < ApplicationController
     @message.sender = current_user
     @message.sent_on = Time.now.utc
 
-    if current_user.sent_messages.where("sent_on >= ?", Time.now.utc - 1.hour).count >= current_user.max_messages_per_hour
+    if current_user.sent_messages.where(:sent_on => Time.now.utc - 1.hour..).count >= current_user.max_messages_per_hour
       flash.now[:error] = t ".limit_exceeded"
       render :action => "new"
     elsif @message.save
index 97efc3eda8128f79bbd0a870b347cebc0c384501..26d27692e5cd5804386aca35191e68e26bbd7dbe 100644 (file)
@@ -16,6 +16,8 @@ class NotesController < ApplicationController
   ##
   # Display a list of notes by a specified user
   def index
+    param! :page, Integer, :min => 1
+
     @params = params.permit(:display_name)
     @title = t ".title", :user => @user.display_name
     @page = (params[:page] || 1).to_i
index dca95de4e7a34b737906ba2dd524d1c7b2e3f49f..415ab2775c12f248e90598bde7e2495078e126f9 100644 (file)
@@ -3,13 +3,8 @@ class Oauth2AuthorizationsController < Doorkeeper::AuthorizationsController
 
   prepend_before_action :authorize_web
   before_action :set_locale
-  before_action :allow_all_form_action, :only => [:new]
 
-  authorize_resource :class => false
-
-  private
+  allow_all_form_action :only => :new
 
-  def allow_all_form_action
-    override_content_security_policy_directives(:form_action => []) if Settings.csp_enforce || Settings.key?(:csp_report_url)
-  end
+  authorize_resource :class => false
 end
index cd7e48277a2517b23e49af4cdb31eddfd396a762..62a68b53369ddc0e2cf4829a9a4c40f4d5f552d5 100644 (file)
@@ -5,8 +5,12 @@ class OauthController < ApplicationController
   # a login, but we want to check authorization on every action.
   authorize_resource :class => false
 
+  before_action :require_oauth_10a_support
+
   layout "site"
 
+  allow_all_form_action :only => :oauth1_authorize
+
   def revoke
     @token = current_user.oauth_tokens.find_by :token => params[:token]
     if @token
@@ -39,8 +43,6 @@ class OauthController < ApplicationController
   end
 
   def oauth1_authorize
-    override_content_security_policy_directives(:form_action => []) if Settings.csp_enforce || Settings.key?(:csp_report_url)
-
     if @token.invalidated?
       @message = t "oauth.authorize_failure.invalid"
       render :action => "authorize_failure"
index fdf2df6a753cf51f1e639495ebe5d9b3c3477ba1..a3e6f42f03db4b172607bc26285d6c79c3b0ee8b 100644 (file)
@@ -11,18 +11,20 @@ class SessionsController < ApplicationController
 
   authorize_resource :class => false
 
-  def new
-    override_content_security_policy_directives(:form_action => []) if Settings.csp_enforce || Settings.key?(:csp_report_url)
+  allow_all_form_action :only => :new
 
-    session[:referer] = safe_referer(params[:referer]) if params[:referer]
+  def new
+    referer = safe_referer(params[:referer]) if params[:referer]
 
-    parse_oauth_referer session[:referer]
+    parse_oauth_referer referer
   end
 
   def create
     session[:remember_me] ||= params[:remember_me]
-    session[:referer] = safe_referer(params[:referer]) if params[:referer]
-    password_authentication(params[:username].strip, params[:password])
+
+    referer = safe_referer(params[:referer]) if params[:referer]
+
+    password_authentication(params[:username].strip, params[:password], referer)
   end
 
   def destroy
@@ -43,15 +45,15 @@ class SessionsController < ApplicationController
 
   ##
   # handle password authentication
-  def password_authentication(username, password)
+  def password_authentication(username, password, referer = nil)
     if (user = User.authenticate(:username => username, :password => password))
-      successful_login(user)
+      successful_login(user, referer)
     elsif (user = User.authenticate(:username => username, :password => password, :pending => true))
-      unconfirmed_login(user)
+      unconfirmed_login(user, referer)
     elsif User.authenticate(:username => username, :password => password, :suspended => true)
-      failed_login({ :partial => "sessions/suspended_flash" }, username)
+      failed_login({ :partial => "sessions/suspended_flash" }, username, referer)
     else
-      failed_login t("sessions.new.auth failure"), username
+      failed_login(t("sessions.new.auth failure"), username, referer)
     end
   end
 end
index 3d830c63f7fab352aa47b893a7c3fdfa0d9a9e07..15ffe58a2616765eac3b34474b9dd0542447cb33 100644 (file)
@@ -12,6 +12,17 @@ class SiteController < ApplicationController
 
   authorize_resource :class => false
 
+  content_security_policy(:only => :edit) do |policy|
+    policy.frame_src(*policy.frame_src, :blob)
+  end
+
+  content_security_policy(:only => :id) do |policy|
+    policy.connect_src("*")
+    policy.img_src(*policy.img_src, "*", :blob)
+    policy.script_src(*policy.script_src, :unsafe_eval)
+    policy.style_src(*policy.style_src, :unsafe_inline)
+  end
+
   def index
     session[:location] ||= OSM.ip_location(request.env["REMOTE_ADDR"]) unless Settings.status == "database_readonly" || Settings.status == "database_offline"
   end
@@ -71,12 +82,6 @@ class SiteController < ApplicationController
       require_user
     end
 
-    if %w[id].include?(editor)
-      append_content_security_policy_directives(
-        :frame_src => %w[blob:]
-      )
-    end
-
     begin
       if params[:node]
         bbox = Node.visible.find(params[:node]).bbox.to_unscaled
@@ -136,13 +141,6 @@ class SiteController < ApplicationController
   end
 
   def id
-    append_content_security_policy_directives(
-      :connect_src => %w[*],
-      :img_src => %w[* blob:],
-      :script_src => %w[dev.virtualearth.net 'unsafe-eval'],
-      :style_src => %w['unsafe-inline']
-    )
-
     render :layout => false
   end
 
index ec67a6bb1336585735388d96709d69653c248b77..a62e6af8630cfa2a22aaa2bd014cee55dfacb520 100644 (file)
@@ -6,21 +6,12 @@ module Traces
     authorize_resource :trace
 
     def show
-      trace = Trace.visible.find(params[:trace_id])
+      trace = Trace.visible.imported.find(params[:trace_id])
 
-      if trace.inserted?
-        if trace.public? || (current_user && current_user == trace.user)
-          if trace.icon.attached?
-            redirect_to rails_blob_path(trace.icon, :disposition => "inline")
-          else
-            expires_in 7.days, :private => !trace.public?, :public => trace.public?
-            send_file(trace.icon_picture_name, :filename => "#{trace.id}_icon.gif", :type => "image/gif", :disposition => "inline")
-          end
-        else
-          head :forbidden
-        end
+      if trace.public? || (current_user && current_user == trace.user)
+        redirect_to rails_blob_path(trace.icon, :disposition => "inline")
       else
-        head :not_found
+        head :forbidden
       end
     rescue ActiveRecord::RecordNotFound
       head :not_found
index 0e0d588cb7410a8c781d41380f0fa316fc039fbb..0b26ed8847f37d0507de5d1870e67331119e8525 100644 (file)
@@ -6,21 +6,12 @@ module Traces
     authorize_resource :trace
 
     def show
-      trace = Trace.visible.find(params[:trace_id])
+      trace = Trace.visible.imported.find(params[:trace_id])
 
-      if trace.inserted?
-        if trace.public? || (current_user && current_user == trace.user)
-          if trace.icon.attached?
-            redirect_to rails_blob_path(trace.image, :disposition => "inline")
-          else
-            expires_in 7.days, :private => !trace.public?, :public => trace.public?
-            send_file(trace.large_picture_name, :filename => "#{trace.id}.gif", :type => "image/gif", :disposition => "inline")
-          end
-        else
-          head :forbidden
-        end
+      if trace.public? || (current_user && current_user == trace.user)
+        redirect_to rails_blob_path(trace.image, :disposition => "inline")
       else
-        head :not_found
+        head :forbidden
       end
     rescue ActiveRecord::RecordNotFound
       head :not_found
index 2cdec642d33ed8a4876defd7f53100b97b1d18f6..b7c156bd913e98e11cdad31d496c14ef12fd5891 100644 (file)
@@ -17,7 +17,9 @@ class UsersController < ApplicationController
   before_action :check_database_writable, :only => [:new, :go_public]
   before_action :require_cookies, :only => [:new]
   before_action :lookup_user_by_name, :only => [:set_status, :destroy]
-  before_action :allow_thirdparty_images, :only => [:show]
+
+  allow_thirdparty_images :only => :show
+  allow_social_login :only => :new
 
   ##
   # display a list of users matching specified criteria
@@ -54,18 +56,10 @@ class UsersController < ApplicationController
 
   def new
     @title = t ".title"
-    @referer = if params[:referer]
-                 safe_referer(params[:referer])
-               else
-                 session[:referer]
-               end
+    @referer = safe_referer(params[:referer])
 
     parse_oauth_referer @referer
 
-    append_content_security_policy_directives(
-      :form_action => %w[accounts.google.com *.facebook.com login.microsoftonline.com github.com meta.wikimedia.org]
-    )
-
     if current_user
       # The user is logged in already, so don't show them the signup
       # page, instead send them to the home page
@@ -94,10 +88,6 @@ class UsersController < ApplicationController
     self.current_user = User.new(user_params)
 
     if check_signup_allowed(current_user.email)
-      session[:referer] = safe_referer(params[:referer]) if params[:referer]
-
-      Rails.logger.info "create: #{session[:referer]}"
-
       if current_user.auth_uid.present?
         # We are creating an account with external authentication and
         # no password was specified so create a random one
@@ -108,14 +98,9 @@ class UsersController < ApplicationController
       if current_user.invalid?
         # Something is wrong with a new user, so rerender the form
         render :action => "new"
-      elsif current_user.auth_provider.present?
-        # Verify external authenticator before moving on
-        session[:new_user] = current_user.slice("email", "display_name", "pass_crypt", "pass_crypt_confirmation")
-        redirect_to auth_url(current_user.auth_provider, current_user.auth_uid), :status => :temporary_redirect
       else
         # Save the user record
-        session[:new_user] = current_user.slice("email", "display_name", "pass_crypt", "pass_crypt_confirmation")
-        save_new_user params[:email_hmac]
+        save_new_user params[:email_hmac], params[:referer]
       end
     end
   end
@@ -200,6 +185,7 @@ class UsersController < ApplicationController
   ##
   # omniauth success callback
   def auth_success
+    referer = request.env["omniauth.params"]["referer"]
     auth_info = request.env["omniauth.auth"]
 
     provider = auth_info[:provider]
@@ -228,12 +214,6 @@ class UsersController < ApplicationController
       session[:user_errors] = current_user.errors.as_json
 
       redirect_to edit_account_path
-    elsif session[:new_user]
-      session[:new_user]["auth_provider"] = provider
-      session[:new_user]["auth_uid"] = uid
-
-      email_hmac = UsersController.message_hmac(email) if email_verified && email
-      save_new_user email_hmac
     else
       user = User.find_by(:auth_provider => provider, :auth_uid => uid)
 
@@ -246,18 +226,18 @@ class UsersController < ApplicationController
       if user
         case user.status
         when "pending"
-          unconfirmed_login(user)
+          unconfirmed_login(user, referer)
         when "active", "confirmed"
-          successful_login(user, request.env["omniauth.params"]["referer"])
+          successful_login(user, referer)
         when "suspended"
-          failed_login({ :partial => "sessions/suspended_flash" })
+          failed_login({ :partial => "sessions/suspended_flash" }, user.display_name, referer)
         else
-          failed_login t("sessions.new.auth failure")
+          failed_login(t("sessions.new.auth failure"), user.display_name, referer)
         end
       else
         email_hmac = UsersController.message_hmac(email) if email_verified && email
         redirect_to :action => "new", :nickname => name, :email => email, :email_hmac => email_hmac,
-                    :auth_provider => provider, :auth_uid => uid
+                    :auth_provider => provider, :auth_uid => uid, :referer => referer
       end
     end
   end
@@ -281,9 +261,7 @@ class UsersController < ApplicationController
 
   private
 
-  def save_new_user(email_hmac)
-    new_user = session.delete(:new_user)
-    self.current_user = User.new(new_user)
+  def save_new_user(email_hmac, referer = nil)
     if check_signup_allowed(current_user.email)
       current_user.data_public = true
       current_user.description = "" if current_user.description.nil?
@@ -306,11 +284,10 @@ class UsersController < ApplicationController
 
         flash[:matomo_goal] = Settings.matomo["goals"]["signup"] if defined?(Settings.matomo)
 
-        referer = welcome_path(welcome_options)
+        referer = welcome_path(welcome_options(referer))
 
         if current_user.status == "active"
-          session[:referer] = referer
-          successful_login(current_user)
+          successful_login(current_user, referer)
         else
           session[:pending_user] = current_user.id
           UserMailer.signup_confirm(current_user, current_user.generate_token_for(:new_user), referer).deliver_later
@@ -322,8 +299,8 @@ class UsersController < ApplicationController
     end
   end
 
-  def welcome_options
-    uri = URI(session[:referer]) if session[:referer].present?
+  def welcome_options(referer = nil)
+    uri = URI(referer) if referer.present?
 
     return { "oauth_return_url" => uri&.to_s } if uri&.path == oauth_authorization_path
 
index 6d3bf5e91245cb247b9ea71dc5786d5a699286d8..722b0425d6f90c26192df9d6514ea3ecef5e598e 100644 (file)
@@ -69,38 +69,35 @@ module BrowseTagsHelper
 
     case key
     when "wikipedia", /^(#{SECONDARY_WIKI_PREFIXES}):wikipedia/o
-      # This regex should match Wikipedia language codes, everything
-      # from de to zh-classical
-      lang = if value =~ /^([a-z-]{2,12}):(.+)$/i
-               # Value is <lang>:<title> so split it up
-               # Note that value is always left as-is, see: https://trac.openstreetmap.org/ticket/4315
-               Regexp.last_match(1)
-             else
-               # Value is <title> so default to English Wikipedia
-               "en"
-             end
+      lang = "en"
     when /^wikipedia:(\S+)$/
-      # Language is in the key, so assume value is the title
       lang = Regexp.last_match(1)
     else
-      # Not a wikipedia key!
       return nil
     end
 
-    if value =~ /^([^#]*)#(.*)/
+    # This regex should match Wikipedia language codes, everything
+    # from de to zh-classical
+    if value =~ /^([a-z-]{2,12}):(.+)$/i
+      lang = Regexp.last_match(1)
+      title_section = Regexp.last_match(2)
+    else
+      title_section = value
+    end
+
+    if title_section =~ /^([^#]*)#(.*)/
       # Contains a reference to a section of the wikipedia article
       # Must break it up to correctly build the url
-      value = Regexp.last_match(1)
-      section = "##{Regexp.last_match(2)}"
+      title = Regexp.last_match(1)
       encoded_section = "##{CGI.escape(Regexp.last_match(2).gsub(/ +/, '_'))}"
     else
-      section = ""
+      title = title_section
       encoded_section = ""
     end
 
     {
-      :url => "https://#{lang}.wikipedia.org/wiki/#{value}?uselang=#{I18n.locale}#{encoded_section}",
-      :title => value + section
+      :url => "https://#{lang}.wikipedia.org/wiki/#{title}?uselang=#{I18n.locale}#{encoded_section}",
+      :title => value
     }
   end
 
index a91457645416f49c3ef01a4e50d63d239804d36b..0ce4d626707a49c5d6737cc8f578d8b8d52cbf5b 100644 (file)
@@ -1,11 +1,10 @@
 module OpenGraphHelper
-  def opengraph_tags(title = nil)
+  def opengraph_tags(title = nil, og_image = nil)
     tags = {
       "og:site_name" => t("layouts.project_name.title"),
       "og:title" => [title, t("layouts.project_name.title")].compact.join(" | "),
       "og:type" => "website",
-      "og:image" => image_url("osm_logo_256.png", :protocol => "http"),
-      "og:image:secure_url" => image_url("osm_logo_256.png", :protocol => "https"),
+      "og:image" => og_image ? URI.join(root_url, og_image) : image_url("osm_logo_256.png"),
       "og:url" => url_for(:only_path => false),
       "og:description" => t("layouts.intro_text")
     }
index 536f2620e02df11c20004b7e0320954201ea38ad..e2de9934f6a5131150debf676c89265902b13676 100644 (file)
@@ -53,7 +53,7 @@ module UserHelper
   # External authentication support
 
   def openid_logo
-    image_tag "openid_small.png", :alt => t("application.auth_providers.openid_logo_alt"), :class => "align-text-bottom"
+    image_tag "openid.svg", :size => "24", :alt => t("application.auth_providers.openid_logo_alt"), :class => "align-text-bottom"
   end
 
   def auth_button(name, provider, options = {})
@@ -77,7 +77,7 @@ module UserHelper
                 :size => "24") + t("application.auth_providers.#{name}.title"),
       auth_path(options.merge(:provider => provider)),
       :method => :post,
-      :class => "auth_button fs-6 border rounded text-muted text-decoration-none py-2 px-4 d-flex justify-content-center align-items-center",
+      :class => "auth_button fs-6 border rounded text-body-secondary text-decoration-none py-2 px-4 d-flex justify-content-center align-items-center",
       :title => t("application.auth_providers.#{name}.title")
     )
   end
index e83dfb9ee47af81706161260781f7bb663a8fc88..089c7e6c60fecb1ebcc92238a00eb0d1e37a7c9e 100644 (file)
@@ -50,7 +50,7 @@ class DiaryEntry < ApplicationRecord
   after_save :spam_check
 
   def body
-    RichText.new(self[:body_format], self[:body])
+    @body ||= RichText.new(self[:body_format], self[:body])
   end
 
   private
index 54947be303d569e76691e7959b17b7568a7e69ab..a3f82ee40b11881bddf5d5226404f8209668f614 100644 (file)
@@ -50,11 +50,11 @@ class Issue < ApplicationRecord
   scope :visible_to, ->(user) { where(:assigned_role => user.roles.map(&:role)) }
 
   def read_reports
-    resolved_at.present? ? reports.where("updated_at < ?", resolved_at) : nil
+    resolved_at.present? ? reports.where(:updated_at => ...resolved_at) : nil
   end
 
   def unread_reports
-    resolved_at.present? ? reports.where("updated_at >= ?", resolved_at) : reports
+    resolved_at.present? ? reports.where(:updated_at => resolved_at..) : reports
   end
 
   include AASM
index 818cc363b8629595bed5a4d842033f708598f14c..20723b98d01ddc7e0efe3d732879c12c8345d77b 100644 (file)
@@ -38,6 +38,7 @@ class Trace < ApplicationRecord
   scope :visible_to, ->(u) { visible.where(:visibility => %w[public identifiable]).or(visible.where(:user => u)) }
   scope :visible_to_all, -> { where(:visibility => %w[public identifiable]) }
   scope :tagged, ->(t) { joins(:tags).where(:gpx_file_tags => { :tag => t }) }
+  scope :imported, -> { where(:inserted => true) }
 
   has_one_attached :file, :service => Settings.trace_file_storage
   has_one_attached :image, :service => Settings.trace_image_storage
@@ -80,7 +81,7 @@ class Trace < ApplicationRecord
             :content_type => content_type(attachable.path),
             :identify => false)
     else
-      super(attachable)
+      super
     end
   end
 
index 192f52ac4e74ebd440d073d9b8676b0799699c90..e4067a350fe822dac17a0adfd90d0f4b8cb43c63 100644 (file)
@@ -411,7 +411,7 @@ class User < ApplicationRecord
   def max_messages_per_hour
     account_age_in_seconds = Time.now.utc - created_at
     account_age_in_hours = account_age_in_seconds / 3600
-    recent_messages = messages.where("sent_on >= ?", Time.now.utc - 3600).count
+    recent_messages = messages.where(:sent_on => Time.now.utc - 3600..).count
     max_messages = account_age_in_hours.ceil + recent_messages - (active_reports * 10)
     max_messages.clamp(0, Settings.max_messages_per_hour)
   end
@@ -419,7 +419,7 @@ class User < ApplicationRecord
   def max_friends_per_hour
     account_age_in_seconds = Time.now.utc - created_at
     account_age_in_hours = account_age_in_seconds / 3600
-    recent_friends = Friendship.where(:befriendee => self).where("created_at >= ?", Time.now.utc - 3600).count
+    recent_friends = Friendship.where(:befriendee => self).where(:created_at => Time.now.utc - 3600..).count
     max_friends = account_age_in_hours.ceil + recent_friends - (active_reports * 10)
     max_friends.clamp(0, Settings.max_friends_per_hour)
   end
index e783367dd1b9600812e670e12c752aef3cba5a59..f15bc195c584d7614bfe1548f08fa4a63d24d860 100644 (file)
       <%= f.select(:auth_provider, Auth.providers, :hide_label => true, :wrapper => { :class => "col-auto mb-0" }) %>
       <%= f.text_field(:auth_uid, :hide_label => true, :wrapper => { :class => "col mb-0" }) %>
     </div>
-    <small class="form-text text-muted">(<a href="<%= t ".openid.link" %>" target="_new"><%= t ".openid.link text" %></a>)</small>
+    <small class="form-text text-body-secondary">(<a href="<%= t ".openid.link" %>" target="_new"><%= t ".openid.link text" %></a>)</small>
   </fieldset>
 
   <div class="mb-3">
     <label class="form-label"><%= t ".public editing.heading" %></label>
-    <span class="form-text text-muted">
+    <span class="form-text text-body-secondary">
       <% if current_user.data_public? %>
         <%= t ".public editing.enabled" %>
         (<a href="<%= t ".public editing.enabled link" %>" target="_new"><%= t ".public editing.enabled link text" %></a>)
@@ -40,7 +40,7 @@
 
   <div class="mb-3">
     <label class="form-label"><%= t ".contributor terms.heading" %></label>
-    <span class="form-text text-muted">
+    <span class="form-text text-body-secondary">
       <% if current_user.terms_agreed? %>
         <%= t ".contributor terms.agreed" %>
         (<a href="<%= t ".contributor terms.link" %>" target="_new"><%= t ".contributor terms.link text" %></a>)
     </span>
   </div>
 
-  <div class="row justify-content-between">
-    <div class="col-auto btn-wrapper">
+  <div class="row justify-content-between g-1">
+    <div class="col-auto">
       <%= f.primary t(".save changes button") %>
     </div>
-    <div class="col-auto btn-wrapper">
+    <div class="col-auto">
       <%= link_to t(".delete_account"), account_deletion_path, :class => "btn btn-outline-danger" %>
     </div>
   </div>
index a79e7b5ce3cf75e920d1e91d11664b590cf50a21..0cbb529a500c70a34be6dc605dcfc3d469328fdc 100644 (file)
@@ -1,29 +1,42 @@
 <div>
-  <div class="list-inline justify-content-center d-flex align-items-center flex-wrap mb-3 gap-3" id="login_auth_buttons">
+  <div class="list-inline justify-content-center d-flex align-items-center flex-wrap w-100 mb-3" id="login_auth_buttons">
 
+    <% prefered_auth_button_available = false %>
     <% %w[google facebook microsoft github wikipedia].each do |provider| %>
       <% if Settings.key?("#{provider}_auth_id".to_sym) -%>
         <% if @preferred_auth_provider == provider %>
-          <div class="mx-2"><%= auth_button_preferred provider, provider %></div>
+          <% prefered_auth_button_available = true %>
         <% end %>
       <% end -%>
     <% end -%>
 
-    <div class="justify-content-center d-flex gap-1">
-      <div>
-        <%= link_to image_tag("openid.png",
-                              :alt => t("application.auth_providers.openid.title"),
-                              :size => "24"),
-                    "#",
-                    :id => "openid_open_url",
-                    :title => t("application.auth_providers.openid.title"),
-                    :class => "p-2 d-block" %>
+    <% if prefered_auth_button_available %>
+      <div class="list-inline justify-content-center d-flex align-items-center flex-wrap w-50">
+        <% %w[google facebook microsoft github wikipedia].each do |provider| %>
+          <% if Settings.key?("#{provider}_auth_id".to_sym) -%>
+            <% if @preferred_auth_provider == provider %>
+              <%= auth_button_preferred provider, provider %>
+            <% end %>
+          <% end -%>
+        <% end -%>
       </div>
+      <div class="list-inline justify-content-center d-flex align-items-center flex-wrap w-50">
+    <% else %>
+      <div class="list-inline justify-content-center d-flex align-items-center flex-wrap w-100">
+    <% end %>
+
+      <%= link_to image_tag("openid.png",
+                            :alt => t("application.auth_providers.openid.title"),
+                            :size => "24"),
+                  "#",
+                  :id => "openid_open_url",
+                  :title => t("application.auth_providers.openid.title"),
+                  :class => "p-2 d-block" %>
 
       <% %w[google facebook microsoft github wikipedia].each do |provider| %>
         <% unless @preferred_auth_provider == provider %>
           <% if Settings.key?("#{provider}_auth_id".to_sym) -%>
-            <div><%= auth_button provider, provider %></div>
+            <%= auth_button provider, provider %>
           <% end -%>
         <% end %>
       <% end -%>
@@ -36,7 +49,7 @@
       <label for="openid_url" class="form-label"><%= t ".openid_html", :logo => openid_logo %></label>
       <%= hidden_field_tag("referer", params[:referer], :autocomplete => "off") %>
       <%= text_field_tag("openid_url", "", :tabindex => 20, :autocomplete => "on", :class => "openid_url form-control") %>
-      <span class="form-text text-muted">(<a href="<%= t "accounts.edit.openid.link" %>" target="_new"><%= t "accounts.edit.openid.link text" %></a>)</span>
+      <span class="form-text text-body-secondary">(<a href="<%= t "accounts.edit.openid.link" %>" target="_new"><%= t "accounts.edit.openid.link text" %></a>)</span>
     </div>
 
     <%= submit_tag t(".openid_login_button"), :tabindex => 21, :id => "openid_login_button", :class => "btn btn-primary" %>
index 4e2ae0343d2e57f5ba7a460b5701892ed0d923b3..0ffe7c68b82dd01c9cbafe2ca6966295d4b8532a 100644 (file)
@@ -7,7 +7,7 @@
                                        :id => node.redaction.id), node.redaction) %>
   </div>
 <% else %>
-  <%= tag.div :class => ["browse-section", "browse-node", { "text-muted" => node.redacted? }] do %>
+  <%= tag.div :class => ["browse-section", "browse-node", { "text-body-secondary" => node.redacted? }] do %>
     <%= render :partial => "browse/common_details", :object => node %>
 
     <% unless node.ways.empty? and node.containing_relation_members.empty? %>
index a987fe4d8e179bdedd701197e80e1a8c22a45302..5dcdffa47f6cc683d657fa8ad215adf546234c7f 100644 (file)
@@ -7,7 +7,7 @@
                                        :id => relation.redaction.id), relation.redaction) %>
   </div>
 <% else %>
-  <%= tag.div :class => ["browse-section", "browse-relation", { "text-muted" => relation.redacted? }] do %>
+  <%= tag.div :class => ["browse-section", "browse-relation", { "text-body-secondary" => relation.redacted? }] do %>
     <%= render :partial => "browse/common_details", :object => relation %>
 
     <% unless relation.containing_relation_members.empty? %>
index d015438fe998568ae45c1a454ff63f8e6ef0b2d7..d04eff14030183432704277a9e07802b378c2083 100644 (file)
@@ -7,7 +7,7 @@
                                        :id => way.redaction.id), way.redaction) %>
   </div>
 <% else %>
-  <%= tag.div :class => ["browse-section", "browse-way", { "text-muted" => way.redacted? }] do %>
+  <%= tag.div :class => ["browse-section", "browse-way", { "text-body-secondary" => way.redacted? }] do %>
     <%= render :partial => "browse/common_details", :object => way %>
 
     <% unless way.containing_relation_members.empty? %>
index a125a135a5ff34c315f47cde4e4f0781492ee771..acb6c9834a20fb72adace17eb8c6144db7e892c1 100644 (file)
@@ -9,7 +9,7 @@
     </div>
   </div>
 
-  <small class='text-muted'>
+  <small class='text-body-secondary'>
     <%= t(".created_by_html", :link_user => link_to(changeset.user.display_name, changeset.user), :created => l(changeset.created_at, :format => :blog)) %>
   </small>
 </div>
index 3ba3968f704b20626496e189676fec7e9e831994..6ae0efb8b25af84a1428a3ebfed25abe54be37c5 100644 (file)
     <% if current_user %>
       <div class="col-auto">
         <% if @changeset.subscribers.exists?(current_user.id) %>
-          <button class="btn btn-sm btn-primary" name="unsubscribe" data-method="POST" data-url="<%= api_changeset_unsubscribe_url(@changeset) %>"><%= t("javascripts.changesets.show.unsubscribe") %></button>
+          <%= tag.button t(".unsubscribe"),
+                         :class => "btn btn-sm btn-primary",
+                         :name => "unsubscribe",
+                         :data => { :method => "POST",
+                                    :url => api_changeset_unsubscribe_url(@changeset) } %>
         <% else %>
-          <button class="btn btn-sm btn-primary" name="subscribe" data-method="POST" data-url="<%= api_changeset_subscribe_url(@changeset) %>"><%= t("javascripts.changesets.show.subscribe") %></button>
+          <%= tag.button t(".subscribe"),
+                         :class => "btn btn-sm btn-primary",
+                         :name => "subscribe",
+                         :data => { :method => "POST",
+                                    :url => api_changeset_subscribe_url(@changeset) } %>
         <% end %>
       </div>
     <% end %>
       <% @comments.each do |comment| %>
         <% next unless comment.visible || current_user&.moderator? %>
         <li id="c<%= comment.id %>">
-          <small class='text-muted'>
+          <small class='text-body-secondary'>
             <%= t comment.visible ? ".comment_by_html" : ".hidden_comment_by_html",
                   :time_ago => friendly_date_ago(comment.created_at),
                   :user => link_to(comment.author.display_name, comment.author) %>
             <% if current_user&.moderator? %>
               —
-              <%= tag.button t("javascripts.changesets.show.#{comment.visible ? 'hide' : 'unhide'}_comment"),
+              <%= tag.button t(".#{comment.visible ? 'hide' : 'unhide'}_comment"),
                              :class => "btn btn-sm small btn-link link-secondary p-0 align-baseline",
                              :data => { :method => "POST",
                                         :url => comment.visible ? changeset_comment_hide_url(comment) : changeset_comment_unhide_url(comment) } %>
         <div id="comment-error" class="alert alert-danger p-2 mb-3" hidden>
         </div>
         <div>
-          <button name="comment" data-method="POST" data-url="<%= changeset_comment_url(@changeset) %>" disabled class="btn btn-sm btn-primary"><%= t("javascripts.changesets.show.comment") %></button>
+          <%= tag.button t(".comment"),
+                         :class => "btn btn-primary",
+                         :name => "comment",
+                         :disabled => true,
+                         :data => { :method => "POST",
+                                    :url => changeset_comment_url(@changeset) } %>
         </div>
       </form>
     <% else %>
index 879fb8f337cebf45c1a4f15ff46efdd1d5c422a6..4f98a85399a206d93f0be0dca30d3a9d49676e40 100644 (file)
 <% else %>
   <h1>
     <%= t ".introduction_1" %>
-    <span class="text-muted">
+    <span class="text-body-secondary">
       <%= t ".introduction_2" %>
     </span>
   </h1>
 
-  <p class='text-muted'>
+  <p class='text-body-secondary'>
     <%= t ".resend_html",
           :reconfirm_link => link_to(t(".click_here"), url_for(:action => "confirm_resend")) %>
   </p>
index b28a28a26770ead4a7ffd029bcab072d8bf63a5e..759faab8f7d50d713a301ffab32b29d6ba959e65 100644 (file)
@@ -9,7 +9,7 @@
     <%= user_thumbnail contact %>
   </div>
   <div class="col">
-    <p class='text-muted mb-0'>
+    <p class='text-body-secondary mb-0'>
       <%= link_to contact.display_name, contact %>
       <% if @user.home_location? and contact.home_location? %>
         <% distance = @user.distance(contact) %>
@@ -32,7 +32,7 @@
     </p>
 
     <nav class='secondary-actions'>
-      <ul class='clearfix text-muted'>
+      <ul class='clearfix text-body-secondary'>
         <li><%= link_to t("users.show.send message"), new_message_path(contact) %></li>
         <li>
           <% if current_user.friends_with?(contact) %>
index 5ade361aa1ac66ff90f0f70f1981a0e94a5f4637..c3c68fbc9934f0afdf2592e876f680d1ff9220f3 100644 (file)
@@ -1,9 +1,9 @@
-<div class="row diary-comment border-bottom py-3<%= " text-muted bg-danger bg-opacity-10" unless diary_comment.visible? %>">
+<div class="row diary-comment border-bottom py-3<%= " text-body-secondary bg-danger bg-opacity-10" unless diary_comment.visible? %>">
   <div class="col-auto pe-0 text-center">
     <%= user_thumbnail diary_comment.user %>
   </div>
   <div class="col">
-    <p class="text-muted m-0" id="comment<%= diary_comment.id %>"><%= t(".comment_from_html", :link_user => (link_to diary_comment.user.display_name, diary_comment.user), :comment_created_at => link_to(l(diary_comment.created_at, :format => :friendly), :anchor => "comment#{diary_comment.id}")) %>
+    <p class="text-body-secondary m-0" id="comment<%= diary_comment.id %>"><%= t(".comment_from_html", :link_user => (link_to diary_comment.user.display_name, diary_comment.user), :comment_created_at => link_to(l(diary_comment.created_at, :format => :friendly), :anchor => "comment#{diary_comment.id}")) %>
       <% if current_user and diary_comment.user.id != current_user.id %>
         | <%= report_link(t(".report"), diary_comment) %>
       <% end %>
index 9c7d7b2dc297bc211c6772d3902048eb60f9e0f0..d4ee530d7f9d80b7787ccdf52b20fd37b261a2cd 100644 (file)
@@ -1,4 +1,4 @@
-<article class='diary_post border-top border-secondary-subtle py-3<%= " text-muted px-3 bg-danger bg-opacity-10" unless diary_entry.visible %> user_<%= diary_entry.user.id %>'>
+<article class='diary_post border-top border-secondary-subtle py-3<%= " text-body-secondary px-3 bg-danger bg-opacity-10" unless diary_entry.visible %> user_<%= diary_entry.user.id %>'>
   <%= render :partial => "diary_entry_heading", :object => diary_entry, :as => "diary_entry" %>
 
   <div class="richtext text-break" xml:lang="<%= diary_entry.language_code %>" lang="<%= diary_entry.language_code %>">
index 30f7bc03baf2a13a27e4827901a1d1849dffc35d..b6dca2ee41da292f471562040cbe4c1ac45d54bc 100644 (file)
@@ -12,7 +12,7 @@
     </div>
   <% end %>
 
-  <small class='text-muted'>
+  <small class='text-body-secondary'>
     <%= t("diary_entries.diary_entry.posted_by_html", :link_user => (link_to diary_entry.user.display_name, diary_entry.user), :created => l(diary_entry.created_at, :format => :blog), :language_link => (link_to diary_entry.language.name, :controller => "diary_entries", :action => "index", :display_name => nil, :language => diary_entry.language_code)) %>
     <% if (l(diary_entry.updated_at, :format => :blog) != l(diary_entry.created_at, :format => :blog)) %>
       <%= t("diary_entries.diary_entry.updated_at_html", :updated => l(diary_entry.updated_at, :format => :blog)) %>
index aa0fceb95c921046bb962547c7a5816f8089692b..aa5c163847912083e64b706c9112910f869657a3 100644 (file)
     </thead>
     <% @comments.each do |comment| -%>
     <tr>
-      <td width="25%" class="<%= "text-muted" unless comment.visible? %>"><%= link_to comment.diary_entry.title, diary_entry_path(comment.diary_entry.user, comment.diary_entry) %></td>
-      <td width="25%" class="<%= "text-muted" unless comment.visible? %>">
+      <td width="25%" class="<%= "text-body-secondary" unless comment.visible? %>"><%= link_to comment.diary_entry.title, diary_entry_path(comment.diary_entry.user, comment.diary_entry) %></td>
+      <td width="25%" class="<%= "text-body-secondary" unless comment.visible? %>">
         <%= friendly_date_ago(comment.created_at) %>
       </td>
-      <td width="50%" class="richtext text-break<%= " text-muted" unless comment.visible? %>"><%= comment.body.to_html %></td>
+      <td width="50%" class="richtext text-break<%= " text-body-secondary" unless comment.visible? %>"><%= comment.body.to_html %></td>
     </tr>
     <% end -%>
   </table>
index 6c0895380d55d0c0e2024c15a00164a3a33110d1..1830c9ced6a4cbbfef8e1597d008ded6b8bb7bbc 100644 (file)
@@ -19,9 +19,9 @@
     <% if current_user %>
       <div class="col-auto">
         <% if @entry.subscribers.exists?(current_user.id) %>
-          <%= link_to t("javascripts.changesets.show.unsubscribe"), diary_entry_unsubscribe_path(@entry.user, @entry), :method => :post, :class => "btn btn-sm btn-primary" %>
+          <%= link_to t(".unsubscribe"), diary_entry_unsubscribe_path(@entry.user, @entry), :method => :post, :class => "btn btn-sm btn-primary" %>
         <% else %>
-          <%= link_to t("javascripts.changesets.show.subscribe"), diary_entry_subscribe_path(@entry.user, @entry.id), :method => :post, :class => "btn btn-sm btn-primary" %>
+          <%= link_to t(".subscribe"), diary_entry_subscribe_path(@entry.user, @entry.id), :method => :post, :class => "btn btn-sm btn-primary" %>
         <% end %>
       </div>
     <% end %>
diff --git a/app/views/errors/bad_request.html.erb b/app/views/errors/bad_request.html.erb
new file mode 100644 (file)
index 0000000..036517b
--- /dev/null
@@ -0,0 +1,3 @@
+<h1><%= t ".title" %></h1>
+<p><%= t ".description" %></p>
+<%= render :partial => "contact" %>
index 9200b4cec6246b8feebcc7dbaab1eee77fe19a43..f828e5a4350b4a80bb64306190aa85ecc4cd18bd 100644 (file)
@@ -5,7 +5,7 @@
         <%= link_to user_thumbnail(comment.user), comment.user %>
       </div>
       <div class="col">
-        <p class="text-muted">
+        <p class="text-body-secondary">
           <%= t ".comment_from_html", :user_link => link_to(comment.user.display_name, comment.user),
                                       :comment_created_at => tag.time(l(comment.created_at.to_datetime, :format => :friendly),
                                                                       :datetime => comment.created_at.xmlschema) %>
index 2d1b78800688bcb17d024b1d603c83fed890dd36..2d0f1650bdf4f3c2040c0c8c09086f7641ef7f92 100644 (file)
@@ -4,7 +4,7 @@
       <%= link_to user_thumbnail(report.user), report.user %>
     </div>
     <div class="col">
-      <p class="text-muted">
+      <p class="text-body-secondary">
         <%= t ".reported_by_html", :category => report.category,
                                    :user => link_to(report.user.display_name, report.user),
                                    :updated_at => tag.time(l(report.updated_at.to_datetime, :format => :friendly),
index ad463c259320daa443ac57d4836a2faf30d4059a..a58b8c5cb18b4f36c4bb1c0bf978618dc08b0255 100644 (file)
@@ -1,7 +1,7 @@
 <% content_for :heading do %>
 <h1><%= t ".title", :status => @issue.status.humanize, :issue_id => @issue.id %></h1>
 <p><%= @issue.reportable.model_name.human %> : <%= link_to reportable_title(@issue.reportable), reportable_url(@issue.reportable) %></p>
-<p class="text-muted">
+<p class="text-body-secondary">
   <small>
     <%= @issue.assigned_role %>
     <% if @issue.reports.count > 0 %>
@@ -45,7 +45,7 @@
     <h3><%= t ".reports_of_this_issue" %></h3>
 
     <% if @read_reports.present? %>
-    <div class="bg-body-tertiary text-muted">
+    <div class="bg-body-tertiary text-body-secondary">
       <h4><%= t ".read_reports" %></h4>
       <%= render "reports", :reports => @read_reports %>
     </div>
index 724ca552635e4582313d043070a85b3077a5faa7..3c691612ab1d4c37ec1ad7a0f8c001b334e50272 100644 (file)
@@ -12,6 +12,6 @@
   <%= yield :head %>
   <%= yield :auto_discovery_link_tag %>
   <%= csrf_meta_tag %>
-  <meta name="csp-nonce" content="<%= content_security_policy_style_nonce %>" />
+  <%= csp_meta_tag %>
   <title><%= "#{@title} | " if @title %><%= t "layouts.project_name.title" %></title>
 <% end %>
index 8942eb49c5703e3b3e13cdcafbff1366e570485a..77ef647a0d7817877544df342fee46024963e338 100644 (file)
@@ -1,7 +1,7 @@
 <header class="d-flex bg-body text-nowrap closed z-3">
-  <h1 class="m-0 fw-semibold">
-    <a href="<%= root_path %>" class="text-body-emphasis text-decoration-none geolink">
-      <%= image_tag "osm_logo.png", :srcset => image_path("osm_logo.svg"), :alt => t("layouts.logo.alt_text"), :width => 30, :height => 30, :class => "logo" %>
+  <h1 class="d-flex m-0 fw-semibold">
+    <a href="<%= root_path %>" class="icon-link gap-1 text-body-emphasis text-decoration-none geolink">
+      <%= image_tag "osm_logo.png", :srcset => image_path("osm_logo.svg"), :alt => t("layouts.logo.alt_text"), :size => 30 %>
       <%= t "layouts.project_name.h1" %>
     </a>
   </h1>
@@ -31,8 +31,8 @@
       <%= link_to t("layouts.export"), export_path, :class => "btn btn-outline-primary geolink", :id => "export_tab" %>
     </div>
   </nav>
-  <nav class='secondary'>
-    <ul class='mx-1 px-0'>
+  <nav class='secondary d-flex gap-2 align-items-center'>
+    <ul class='nav flex-nowrap'>
       <% if Settings.status != "database_offline" && can?(:index, Issue) %>
         <li class="compact-hide nav-item">
           <%= link_to issues_path(:status => "open"), :class => header_nav_link_class(issues_path) do %>
     </ul>
     <% if current_user && current_user.id %>
       <div class='d-inline-flex dropdown user-menu logged-in'>
-        <button class='dropdown-toggle btn btn-outline-secondary border-secondary-subtle bg-body text-secondary px-2 py-1 flex-grow-1' type='button' data-bs-toggle='dropdown'>
+        <button class='d-flex gap-1 align-items-center justify-content-center dropdown-toggle btn btn-outline-secondary border-secondary-subtle bg-body text-secondary px-2 py-1 flex-grow-1' type='button' data-bs-toggle='dropdown'>
           <%= user_thumbnail_tiny(current_user, :width => 25, :height => 25, :class => "user_thumbnail_tiny rounded-1 bg-body") %>
-          <%= render :partial => "layouts/inbox" %>
-          <span class="user-button">
-            <span class='username'>
-              <%= current_user.display_name %>
-            </span>
+          <% if current_user.new_messages.size > 0 %>
+            <span class="badge count-number position-static m-1"><%= current_user.new_messages.size %></span>
+          <% end %>
+          <span class='username align-middle text-truncate'>
+            <%= current_user.display_name %>
           </span>
         </button>
         <div class='dropdown-menu dropdown-menu-end'>
           <%= link_to t("layouts.logout"), logout_path(:referer => request.fullpath), :method => "post", :class => "geolink dropdown-item" %>
         </div>
       </div>
-    <% elsif (controller_name != "users" and controller_name != "sessions") || action_name != "new" %>
+    <% else %>
       <div class="d-inline-flex btn-group login-menu" role="">
         <%= link_to t("layouts.log_in"), login_path(:referer => request.fullpath), :class => "geolink btn btn-outline-secondary" %>
         <%= link_to t("layouts.sign_up"), user_new_path, :class => "btn btn-outline-secondary" %>
diff --git a/app/views/layouts/_inbox.html.erb b/app/views/layouts/_inbox.html.erb
deleted file mode 100644 (file)
index 2f5a637..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-<% if current_user.new_messages.size > 0 %>
-<span id="inboxanchor" class="badge count-number m-1"><%= current_user.new_messages.size %></span>
-<% end %>
index 2352ad0b6931993eb488bb5e5e257b869241d7e9..37afbb89498e5cc67a2e101a17c4e83d312bc62f 100644 (file)
@@ -21,7 +21,7 @@
 <% end -%>
 <%= tag.link :rel => "search", :type => "application/opensearchdescription+xml", :title => "OpenStreetMap Search", :href => asset_path("osm.xml") %>
 <%= tag.meta :name => "description", :content => "OpenStreetMap is the free wiki world map." %>
-<%= opengraph_tags(@title) %>
+<%= opengraph_tags(@title, @og_image) %>
 <% if flash[:matomo_goal] -%>
 <%= tag.meta :name => "matomo-goal", :content => flash[:matomo_goal] %>
 <% end -%>
index 41529e0c2d92293b58bcd9c16d33382183b54d4b..d4bd0cb824b1a77aa525e481d0a3d4a342b564c3 100644 (file)
@@ -3,49 +3,57 @@
     <div class="row gx-2 mx-0">
       <div class="col">
         <div class="input-group flex-nowrap">
-          <%= text_field_tag "query", params[:query], :placeholder => t("site.search.search"), :autofocus => autofocus, :autocomplete => "on", :class => "form-control form-control-sm z-0", :dir => "auto" %>
+          <%= text_field_tag "query", params[:query], :placeholder => t("site.search.search"), :autofocus => autofocus, :autocomplete => "on", :class => "form-control z-0 py-1 px-2", :dir => "auto" %>
           <div class="input-group-text border-start-0 p-0 position-relative">
-            <%= button_tag t("site.search.where_am_i"), :type => "button", :class => "describe_location position-absolute end-0 me-1 btn btn-sm btn-outline-primary border-0 bg-transparent text-primary link-body-emphasis link-opacity-100-hover", :title => t("site.search.where_am_i_title") %>
+            <%= button_tag t("site.search.where_am_i"), :type => "button", :class => "describe_location position-absolute end-0 top-0 bottom-0 m-1 btn btn-outline-primary border-0 p-1 bg-transparent text-primary link-body-emphasis link-opacity-100-hover", :title => t("site.search.where_am_i_title") %>
           </div>
-          <%= submit_tag t("site.search.submit_text"), :class => "btn btn-sm btn-primary", :data => { :disable_with => false } %>
+          <%= button_tag :class => "btn btn-primary p-1", :title => t("site.search.submit_text") do %>
+            <svg width="24" height="20">
+              <circle cx="13" cy="7" r="6.5" fill="#fff8" stroke="#fff" />
+              <path d="M9.75 12.629 A6.5 6.5 0 0 1 7.371 10.25" fill="none" stroke="#fff" stroke-width="1.5" />
+              <line x1="1" y1="19" x2="1.5" y2="18.5" stroke="#fff8" stroke-width="2" />
+              <line x1="1.5" y1="18.5" x2="6" y2="14" stroke="#fff" stroke-width="2.5" />
+              <line x1="6" y1="14" x2="6.5" y2="13.5" stroke="#fff8" stroke-width="2" />
+              <line x1="6.5" y1="13.5" x2="8.5" y2="11.5" stroke="#fff" stroke-width="1.5" />
+            </svg>
+          <% end %>
         </div>
       </div>
       <div class="col-auto">
-        <%= link_to image_tag("directions.png", :width => "20", :height => "20", :class => "align-bottom"), directions_path, :class => "btn btn-sm btn-primary switch_link", :title => t("site.search.get_directions_title") %>
+        <%= link_to directions_path, :class => "btn btn-primary p-1 switch_link", :title => t("site.search.get_directions_title") do %>
+          <svg width="28" height="24" viewBox="0 -2 28 24" class="align-bottom">
+            <path d="M11.5 9.5 v-3h3v-1l-5 -5l-5 5v1h3v6" fill="none" stroke="#fff8" />
+            <path d="M7.5 19.5h4v-5a1 1 0 0 1 1 -1h5v3h1l5 -5l-5 -5h-1v3h-6a4 4 0 0 0 -4 4z" fill="#fff8" stroke="#fff" />
+          </svg>
+        <% end %>
       </div>
     </div>
   </form>
 
-  <form method="GET" action="<%= directions_path %>" class="directions_form bg-body-secondary pb-3">
+  <form method="GET" action="<%= directions_path %>" class="directions_form bg-body-secondary pb-2">
     <div class="d-flex flex-row-reverse px-3 py-3"><button type="button" class="btn-close" aria-label="<%= t("javascripts.close") %>"></button></div>
 
-    <div class="row gx-2 m-1">
-      <div class="col-1">
-        <%= image_tag "marker-green.png", :class => "routing_marker mx-auto d-block", :data => { :type => "from" }, :draggable => "true" %>
-      </div>
-      <div class="col">
-        <%= text_field_tag "route_from", params[:from], :placeholder => t("site.search.from"), :autocomplete => "on", :class => "form-control form-control-sm", :dir => "auto" %>
-      </div>
-    </div>
-    <div class="row gx-2 m-1">
-      <div class="col-1">
-        <%= image_tag "marker-red.png", :class => "routing_marker mx-auto d-block", :data => { :type => "to" }, :draggable => "true" %>
-      </div>
-      <div class="col">
-        <%= text_field_tag "route_to", params[:to], :placeholder => t("site.search.to"), :autocomplete => "on", :class => "form-control form-control-sm", :dir => "auto" %>
+    <div class="d-flex flex-column mx-2 gap-1">
+      <div class="d-flex gap-2 align-items-center">
+        <div class="routing_marker_column flex-shrink-0">
+          <%= image_tag "marker-green.png", :class => "img-fluid", :data => { :type => "from" }, :draggable => "true" %>
+        </div>
+        <%= text_field_tag "route_from", params[:from], :placeholder => t("site.search.from"), :autocomplete => "on", :class => "form-control py-1 px-2", :dir => "auto" %>
       </div>
-    </div>
-    <div class="row gx-2 m-1">
-      <div class="col offset-1">
-        <select class="routing_engines form-select form-select-sm" name="routing_engines"></select>
+      <div class="d-flex gap-2 align-items-center">
+        <div class="routing_marker_column flex-shrink-0">
+          <%= image_tag "marker-red.png", :class => "img-fluid", :data => { :type => "to" }, :draggable => "true" %>
+        </div>
+        <%= text_field_tag "route_to", params[:to], :placeholder => t("site.search.to"), :autocomplete => "on", :class => "form-control py-1 px-2", :dir => "auto" %>
       </div>
-      <div class="col-auto">
-        <%= submit_tag t("site.search.submit_text"), :class => "routing_go btn btn-sm btn-primary", :data => { :disable_with => false } %>
+      <div class="d-flex gap-2 align-items-center">
+        <div class="routing_marker_column flex-shrink-0"></div>
+        <select class="routing_engines form-select py-1 px-2" name="routing_engines"></select>
+        <%= submit_tag t("site.search.submit_text"), :class => "routing_go btn btn-primary py-1 px-2", :data => { :disable_with => false } %>
       </div>
-    </div>
-    <div class="row gx-2 m-1">
-      <div class="col offset-1">
-        <button class="btn btn-sm btn-link reverse_directions"><%= t("site.search.reverse_directions_text") %></button>
+      <div class="d-flex gap-2 align-items-center">
+        <div class="routing_marker_column flex-shrink-0"></div>
+        <button class="btn btn-link py-1 px-2 reverse_directions"><%= t("site.search.reverse_directions_text") %></button>
       </div>
     </div>
 
index 8622bbf2974e07bef84fa21033c205c8e1d6fb52..d5efe0d79c79e3308c0f26252b7a403e6b3b3070 100644 (file)
@@ -27,9 +27,9 @@
     <tr<% if note.author == @user %> class="table-primary"<% end %>>
       <td>
         <% if note.closed? %>
-          <%= image_tag("closed_note_marker.png", :alt => "closed", :size => "25x40") %>
+          <%= image_tag("closed_note_marker.svg", :alt => "closed", :width => 25, :height => 40) %>
         <% else %>
-          <%= image_tag("open_note_marker.png", :alt => "open", :size => "25x40") %>
+          <%= image_tag("open_note_marker.svg", :alt => "open", :width => 25, :height => 40) %>
         <% end %>
       </td>
       <td><%= link_to note.id, note %></td>
index 6728b32ffbc6a501abb252fc6941b3ec3e2cfdcd..c9b1275b9493f43c9bca1525341dd9b6910af7d2 100644 (file)
@@ -15,7 +15,7 @@
     <div class="mb-3">
       <textarea class="form-control" name="text" cols="40" rows="10" maxlength="2000" placeholder="<%= t(".advice") %>"></textarea>
     </div>
-    <div class="btn-wrapper">
+    <div>
       <input type="submit" name="add" value="<%= t(".add") %>" disabled="1" class="btn btn-primary">
     </div>
   </form>
index a7baccf856dec921056d6c40fd8da7a8c75ff685..4aa2e7fd345d196b9b3d0f4ad215b9a6950b6432 100644 (file)
@@ -4,7 +4,7 @@
 
 <div>
   <h4><%= t(".description") %></h4>
-  <div class="note-description">
+  <div class="overflow-hidden ms-2">
     <%= h(@note_comments.first.body.to_html) %>
   </div>
 
@@ -33,7 +33,7 @@
       <ul class="list-unstyled">
         <% @note_comments.drop(1).each do |comment| %>
           <li id="c<%= comment.id %>">
-            <small class='text-muted'><%= note_event(comment.event, comment.created_at, comment.author) %></small>
+            <small class='text-body-secondary'><%= note_event(comment.event, comment.created_at, comment.author) %></small>
             <div class="mx-2">
               <%= comment.body.to_html %>
             </div>
         </div>
         <div id="comment-error" class="alert alert-danger p-2 mb-3" hidden>
         </div>
-        <div class="btn-wrapper">
+        <div class="d-flex flex-wrap gap-1">
           <% if current_user.moderator? -%>
-            <%= submit_tag t(".hide"), :name => "hide", :class => "btn btn-light",
+            <%= button_tag t(".hide"), :name => "hide", :class => "btn btn-light",
                                        :data => { :method => "DELETE",
                                                   :url => api_note_url(@note, "json") } %>
           <% end -%>
-          <%= submit_tag t(".resolve"), :name => "close", :class => "btn btn-primary",
+          <%= button_tag t(".resolve"), :name => "close", :class => "btn btn-primary",
                                         :data => { :method => "POST",
                                                    :url => close_api_note_url(@note, "json"),
                                                    :default_action_text => t(".resolve"),
                                                    :comment_action_text => t(".comment_and_resolve") } %>
-          <%= submit_tag t(".comment"), :name => "comment", :class => "btn btn-primary", :disabled => true,
+          <%= button_tag t(".comment"), :name => "comment", :class => "btn btn-primary", :disabled => true,
                                         :data => { :method => "POST",
                                                    :url => comment_api_note_url(@note, "json") } %>
         </div>
       <input type="hidden" name="text" value="" autocomplete="off">
       <div id="comment-error" class="alert alert-danger p-2 mb-3" hidden>
       </div>
-      <div class="btn-wrapper">
+      <div class="d-flex flex-wrap gap-1">
         <% if @note.status != "hidden" and current_user and current_user.moderator? -%>
-          <input type="submit" name="hide" value="<%= t(".hide") %>" class="btn btn-light" data-method="DELETE" data-url="<%= api_note_url(@note, "json") %>">
+          <%= button_tag t(".hide"), :name => "hide", :class => "btn btn-light",
+                                     :data => { :method => "DELETE",
+                                                :url => api_note_url(@note, "json") } %>
         <% end -%>
         <% if current_user -%>
-          <input type="submit" name="reopen" value="<%= t(".reactivate") %>" class="btn btn-primary" data-method="POST" data-url="<%= reopen_api_note_url(@note, "json") %>">
+          <%= button_tag t(".reactivate"), :name => "reopen", :class => "btn btn-primary",
+                                           :data => { :method => "POST",
+                                                      :url => reopen_api_note_url(@note, "json") } %>
         <% end -%>
       </div>
     </form>
@@ -90,7 +94,7 @@
 
   <% if current_user && current_user != @note.author %>
     <p>
-      <small class="text-muted">
+      <small class="text-body-secondary">
         <%= t ".report_link_html", :link => report_link(t(".report"), @note) %>
         <% if @note.status == "open" %>
           <%= t ".other_problems_resolve", :link => report_link(t(".report"), @note) %>
   <% end %>
 
   <% if @note.freshly_closed? %>
-    <small class="text-muted">
+    <small class="text-body-secondary">
       <%= t ".disappear_date_html", :disappear_in => friendly_date(@note.freshly_closed_until) %>
     </small>
   <% end %>
index 57e852182941301acd09cb75543270dc149a406b..796e3e776857c551d06349c413d95333184d06cf 100644 (file)
@@ -3,14 +3,14 @@
     <ul class="list-unstyled mb-0">
       <li><%= link_to application.name, oauth_application_path(application) %></li>
       <% application.redirect_uri.split.each do |uri| -%>
-        <li class="text-muted"><%= uri %></li>
+        <li class="text-body-secondary"><%= uri %></li>
       <% end -%>
     </ul>
   </td>
   <td class="align-middle">
     <ul class="list-unstyled mb-0">
       <% application.scopes.each do |scope| -%>
-        <li><%= authorization_scope(scope) %> <code class="text-muted">(<%= scope %>)</code></li>
+        <li><%= authorization_scope(scope) %> <code class="text-body-secondary">(<%= scope %>)</code></li>
       <% end -%>
     </ul>
   </td>
index 8d9c8516dfd297ad5494e946a082d464bd16631b..2c4557c1e301ad4c4a9c90176de26816570d1787 100644 (file)
@@ -28,7 +28,7 @@
     <td>
       <ul class="list-unstyled mb-0">
         <% @application.scopes.each do |scope| -%>
-          <li><%= t "oauth.scopes.#{scope}" %> <code class="text-muted">(<%= scope %>)</code></li>
+          <li><%= t "oauth.scopes.#{scope}" %> <code class="text-body-secondary">(<%= scope %>)</code></li>
         <% end -%>
       </ul>
     </td>
index d755be52cae4b7d3f0bb931f9de4351f6d13db8a..fea15eb2fa4913628e0f23d57bf14f945e36ea32 100644 (file)
@@ -42,7 +42,7 @@
 
   <fieldset>
     <legend><%= t ".home location" -%></legend>
-    <p id="home_message" class="text-muted m-0<% if current_user.home_location? %> invisible<% end %>"><%= t ".no home location" %></p>
+    <p id="home_message" class="text-body-secondary m-0<% if current_user.home_location? %> invisible<% end %>"><%= t ".no home location" %></p>
     <div class="row">
       <%= f.text_field :home_lat, :wrapper_class => "col-sm-4 d-flex flex-column", :class => "mt-auto", :id => "home_lat" %>
       <%= f.text_field :home_lon, :wrapper_class => "col-sm-4 d-flex flex-column", :class => "mt-auto", :id => "home_lon" %>
index 71c0a14f3d2d2c7c58600eb9bcf170f8b5de2704..70839d1608533e0da9f29eb5f1ef81a7e8cd75d9 100644 (file)
@@ -7,16 +7,16 @@
 
 <% content_for :heading do %>
   <% if @client_app_name %>
-    <p class="text-center text-muted fs-6 py-2 mb-0 bg-body"><%= t(".login_to_authorize_html", :client_app_name => @client_app_name) %></p>
+    <p class="text-center text-body-secondary fs-6 py-2 mb-0 bg-body"><%= t(".login_to_authorize_html", :client_app_name => @client_app_name) %></p>
   <% end %>
 
   <div class="header-illustration new-user-main auth-container mx-auto">
-    <ul class="nav nav-tabs position-absolute bottom-0 px-3 fs-6 w-100">
+    <ul class="nav nav-tabs position-absolute bottom-0 fs-6 w-100">
       <li class="nav-item">
         <%= link_to t("sessions.new.tab_title"), "#", :class => "nav-link active" %>
       </li>
       <li class="nav-item">
-        <%= link_to t("users.new.tab_title"), url_for(:action => :new, :controller => :users), :class => "nav-link" %>
+        <%= link_to t("users.new.tab_title"), url_for(:action => :new, :controller => :users, :referer => params[:referer]), :class => "nav-link" %>
       </li>
     </ul>
   </div>
@@ -25,7 +25,7 @@
 <div id="login_login" class="auth-container mx-auto my-0">
   <% if @preferred_auth_provider %>
     <%= render :partial => "auth_providers" %>
-    <div class="d-flex justify-content-center align-items-center">
+    <div class="d-flex justify-content-center align-items-center mb-2">
       <div class="border-bottom border-1 flex-grow-1"></div>
       <div class="text-secondary mx-3"><%= t ".or" %></div>
       <div class="border-bottom border-1 flex-grow-1"></div>
   <%= bootstrap_form_tag(:action => "login", :html => { :id => "login_form" }) do |f| %>
     <%= hidden_field_tag("referer", h(params[:referer]), :autocomplete => "off") %>
 
-    <%= f.text_field :username, :label => t(".email or username"), :tabindex => 1, :value => params[:username] %>
+    <%= f.text_field :username, :label => t(".email or username"), :autofocus => true, :tabindex => 1, :value => params[:username] %>
 
     <div class="row">
       <div class="col">
-        <%= f.label :password, :class => "form-label" %>
+        <%= f.label :password, t(".password"), :class => "form-label" %>
       </div>
       <div class="col text-end">
         <small><%= link_to(t(".lost password link"), user_forgot_password_path) %></small>
       </div>
     </div>
-    <input class="form-control mb-3" type="password" name="password" id="password" tabindex="2" value="" autocomplete="off" />
+    <input class="form-control mb-3" type="password" name="password" id="password" tabindex="2" value="" autocomplete="on" />
 
     <%= f.form_group do %>
       <%= f.check_box :remember_me, { :label => t(".remember"), :tabindex => 3, :checked => (params[:remember_me] == "yes") }, "yes" %>
diff --git a/app/views/site/_about_section.html.erb b/app/views/site/_about_section.html.erb
deleted file mode 100644 (file)
index 4baec72..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-<%= tag.section :id => local_assigns[:id] do %>
-  <div class='d-flex align-items-center gap-2 mb-2'>
-    <div class='flex-shrink-0 icon <%= icon %>'></div>
-    <h2 class='flex-grow-1 mb-0'><%= t "site.about.#{title}_title" %></h2>
-  </div>
-  <%= yield %>
-<% end %>
index b330d8035e3b25fcc5b7e52d1af6b84dec47b9d4..0224fd3ea89d82a55a4de32fed27df6e3325d1d6 100644 (file)
@@ -1,4 +1,9 @@
-  <h2><%= t ".title" %></h2>
-  <span class='sprite small term question float-start'></span>
+<h2><%= t ".title" %></h2>
+<div class='d-flex align-items-center gap-2'>
+  <svg width='50' height='50' viewBox='0 0 100 100' class='flex-shrink-0 align-self-start'>
+    <circle cx="50" cy="50" r="45" fill="#7092ff" />
+    <path d="M44.42 54.95q0-3 1.26-5.04 1.26-2.04 4.32-4.26 2.7-1.92 3.84-3.3 1.2-1.44 1.2-3.36 0-1.92-1.44-2.88-1.38-1.02-3.9-1.02-2.52 0-4.98.78-2.46.78-5.04 2.1l-3.18-6.42q2.94-1.62 6.36-2.64 3.42-1.02 7.5-1.02 6.24 0 9.66 3 3.48 3 3.48 7.62 0 2.46-.78 4.26-.78 1.8-2.34 3.36-1.56 1.5-3.9 3.24-1.74 1.26-2.7 2.16-.96.9-1.32 1.74-.3.84-.3 2.1v1.74h-7.74zm-.96 12.18q0-2.76 1.5-3.84 1.5-1.14 3.66-1.14 2.1 0 3.6 1.14 1.5 1.08 1.5 3.84 0 2.64-1.5 3.84-1.5 1.14-3.6 1.14-2.16 0-3.66-1.14-1.5-1.2-1.5-3.84z" fill="#fff" />
+  </svg>
   <p><%= t ".paragraph_1_html", :help_link => link_to(t(".get_help_here"), help_path),
                                 :welcome_mat_link => link_to(t(".welcome_mat"), t(".welcome_mat_url")) %></p>
+</div>
index 7dbed1514839add65c39a04f2e47a0d4c3b15ce1..6cc32edd037dc8817a574252ca6633859c3e813b 100644 (file)
     <div class='bg-body px-5 py-4'>
       <p class="lead"><%= t ".lede_text" %></p>
 
-      <%= render :layout => "about_section", :locals => { :icon => "local", :title => "local_knowledge" } do %>
+      <section>
+        <div class="d-flex align-items-center gap-2 mb-2">
+          <svg width="30" height="30" class="flex-shrink-0">
+            <circle cx="15" cy="15" r="13" fill="none" stroke="#c0c0c0" stroke-width="4" />
+            <path d="m 15,22 c 0,0 5,-4.5199 5,-8 0,-3 -2,-5 -5,-5 -3,0 -5,2 -5,5 0,3.4801 5,8 5,8 z" fill="#c0c0c0" />
+          </svg>
+          <h2 class="flex-grow-1 mb-0"><%= t "site.about.local_knowledge_title" %></h2>
+        </div>
         <p><%= t "site.about.local_knowledge_html" %></p>
-      <% end %>
+      </section>
 
-      <%= render :layout => "about_section", :locals => { :icon => "community", :title => "community_driven" } do %>
+      <section>
+        <div class="d-flex align-items-center gap-2 mb-2">
+          <svg width="30" height="30" class="flex-shrink-0">
+            <circle cx="15" cy="15" r="13" fill="none" stroke="#c0c0c0" stroke-width="4" />
+            <path d="m 15,7 -6,6 0,7 4,0 0,-4 4,0 0,4 4,0 0,-7 z" fill="#c0c0c0" />
+          </svg>
+          <h2 class="flex-grow-1 mb-0"><%= t "site.about.community_driven_title" %></h2>
+        </div>
         <p>
           <%= t "site.about.community_driven_1_html", :osm_blog_link => link_to(t("site.about.community_driven_osm_blog"),
                                                                                 t("site.about.community_driven_osm_blog_url")),
                                                       :osm_foundation_link => link_to(t("site.about.community_driven_osm_foundation"),
                                                                                       t("site.about.community_driven_osm_foundation_url")) %>
         </p>
-      <% end %>
+      </section>
 
-      <%= render :layout => "about_section", :locals => { :id => "open-data", :icon => "open", :title => "open_data" } do %>
+      <section id="open-data">
+        <div class="d-flex align-items-center gap-2 mb-2">
+          <svg width="30" height="30" class="flex-shrink-0">
+            <circle cx="15" cy="15" r="13" fill="none" stroke="#c0c0c0" stroke-width="4" />
+            <path d="M20.196 18 a6 6 0 1 1 0 -6" fill="none" stroke="#c0c0c0" stroke-width="3" />
+          </svg>
+          <h2 class="flex-grow-1 mb-0"><%= t "site.about.open_data_title" %></h2>
+        </div>
         <p>
           <%= t "site.about.open_data_1_html", :open_data => tag.i(t("site.about.open_data_open_data")),
                                                :copyright_license_link => link_to(t("site.about.open_data_copyright_license"),
                                                                                   copyright_path) %></p>
-      <% end %>
+      </section>
 
-      <%= render :layout => "about_section", :locals => { :id => "legal", :icon => "legal", :title => "legal" } do %>
+      <section id="legal">
+        <div class="d-flex align-items-center gap-2 mb-2">
+          <svg width="30" height="30" class="flex-shrink-0">
+            <circle cx="15" cy="15" r="13" fill="none" stroke="#c0c0c0" stroke-width="4" />
+            <g fill="none" stroke="#c0c0c0" stroke-width="1.125" stroke-linecap="round">
+              <path transform="translate(15 15) scale(2.2 1.75) rotate(45)"
+                    d="M.5 1 a1 1 0 0 0 0 -2 h-2.5 a1 1 0 0 1 0 -2 h.5" />
+              <path transform="translate(15 15) scale(-2.2 -1.75) rotate(45)"
+                    d="M.5 1 a1 1 0 0 0 0 -2 h-2.5 a1 1 0 0 1 0 -2 h.5" />
+            </g>
+          </svg>
+          <h2 class="flex-grow-1 mb-0"><%= t "site.about.legal_title" %></h2>
+        </div>
         <p>
           <%= t "site.about.legal_1_1_html", :openstreetmap_foundation_link => link_to(t("site.about.legal_1_1_openstreetmap_foundation"),
                                                                                        t("site.about.legal_1_1_openstreetmap_foundation_url")),
           <%= t "site.about.legal_2_2_html", :registered_trademarks_link => link_to(t("site.about.legal_2_2_registered_trademarks"),
                                                                                     t("site.about.legal_2_2_registered_trademarks_url")) %>
         </p>
-      <% end %>
+      </section>
 
-      <%= render :layout => "about_section", :locals => { :id => "partners", :icon => "partners", :title => "partners" } do %>
+      <section id="partners">
+        <div class="d-flex align-items-center gap-2 mb-2">
+          <svg width="30" height="30" class="flex-shrink-0">
+            <circle cx="15" cy="15" r="13" fill="none" stroke="#c0c0c0" stroke-width="4" />
+            <g stroke="#c0c0c0" stroke-width="4" stroke-linecap="round">
+              <line x1="11" y1="15" x2="19" y2="15" />
+              <line x1="15" y1="11" x2="15" y2="19" />
+            </g>
+          </svg>
+          <h2 class="flex-grow-1 mb-0"><%= t "site.about.partners_title" %></h2>
+        </div>
         <p><%= t "layouts.hosting_partners_2024_html", :fastly => link_to(t("layouts.partners_fastly"), "https://www.fastly.com/"),
                                                        :corpmembers => link_to(t("layouts.partners_corpmembers"), "https://osmfoundation.org/wiki/Corporate_Members"),
                                                        :partners => link_to(t("layouts.partners_partners"), "https://hardware.openstreetmap.org/thanks/") %>
         </p>
-      <% end %>
+      </section>
     </div>
   <% end %>
 <% end %>
index 3edafd8b7fc8ac99ff0b5bec2d768056a8e7c3b7..1e943c7cc8dc8eccffa8856a10cdb387cac7b1a4 100644 (file)
 
 <div class='row'>
   <div class='col-sm'>
-    <h5><%= t ".how_to_help.join_the_community.title" %></h5>
+    <h3 class='fs-5'><%= t ".how_to_help.join_the_community.title" %></h3>
     <p><%= t ".how_to_help.join_the_community.explanation_html" %></p>
     <p class='text-center'>
       <a class="btn btn-primary" href="<%= user_new_path %>"><%= t("layouts.start_mapping") %></a>
     </p>
   </div>
   <div class='col-sm'>
-    <h5><%= t "site.welcome.add_a_note.title" %></h5>
+    <h3 class='fs-5'><%= t "site.welcome.add_a_note.title" %></h3>
     <p><%= t "site.welcome.add_a_note.para_1" %></p>
     <p><%= t ".how_to_help.add_a_note.instructions_1_html", :note_icon => tag.a(:class => "icon note bg-dark rounded-1") %></p>
   </div>
index f8f339284f222246ee303fae979dcdee80fc1689..33c9a7e24609f10427ef84759a89bec893d3d5b7 100644 (file)
 <h2><%= t ".whats_on_the_map.title" %></h2>
 
 <div class='row'>
-  <div class='col'>
-    <div>
-      <span class='sprite small check mx-auto'></span>
-    </div>
+  <div class='col-sm'>
+    <svg width='50' height='50' viewBox='0 0 100 100' class='d-block mx-auto'>
+      <circle cx="50" cy="50" r="45" fill="#70cd8f" />
+      <path d="M31 46h-2l-3 3v2l14 14 5 5 5-5 25-25v-2l-3-3h-2l-25 25z" fill="#fff" />
+    </svg>
     <p><%= t ".whats_on_the_map.on_the_map_html", :real_and_current => tag.em(t(".whats_on_the_map.real_and_current")) %></p>
   </div>
-  <div class='col'>
-    <div class='center'>
-      <span class='sprite small x mx-auto'></span>
-    </div>
+  <div class='col-sm'>
+    <svg width='50' height='50' viewBox='0 0 100 100' class='d-block mx-auto'>
+      <circle cx="50" cy="50" r="45" fill="#cd7070" />
+      <path d="M35 30h-2l-3 3v2l15 15-15 15v2l3 3h2l15-15 15 15h2l3-3v-2l-15-15 15-15v-2l-3-3h-2l-15 15z" fill="#fff" />
+    </svg>
     <p><%= t ".whats_on_the_map.off_the_map_html", :doesnt => tag.em(t(".whats_on_the_map.doesnt")) %></p>
   </div>
 </div>
 
 <p><%= t ".basic_terms.paragraph_1" %></p>
 
-<div class='clearfix'>
-  <div class='clearfix'>
-    <span class='sprite small term editor float-start'></span>
-    <p><%= t ".basic_terms.an_editor_html", :editor => tag.strong(t(".basic_terms.editor")) %></p>
-  </div>
-  <div class='clearfix'>
-    <span class='sprite small term node float-start'></span>
-    <p><%= t ".basic_terms.a_node_html", :node => tag.strong(t(".basic_terms.node")) %></p>
-  </div>
-  <div class='clearfix'>
-    <span class='sprite small term way float-start'></span>
-    <p><%= t ".basic_terms.a_way_html", :way => tag.strong(t(".basic_terms.way")) %></p>
-  </div>
-  <div class='clearfix'>
-    <span class='sprite small term tag float-start'></span>
-    <p><%= t ".basic_terms.a_tag_html", :tag => tag.strong(t(".basic_terms.tag")) %></p>
-  </div>
-</div>
+<ul class='list-unstyled'>
+  <li class='d-flex align-items-center gap-2 mb-2'>
+    <svg width='50' height='50' viewBox='0 0 100 100' class='flex-shrink-0 align-self-start'>
+      <path d="M19.728 30.552l19.834-15.219L80 65l-19.834 15.219z" fill="#7092ff" opacity=".5" />
+      <path d="M10.597 18.651l19.834-15.219 6.088 7.934-19.834 15.219zm52.613 65.535l19.834-15.219 1.198 17.988-3.967 3.044z" fill="#7092ff" />
+    </svg>
+    <span><%= t ".basic_terms.an_editor_html", :editor => tag.strong(t(".basic_terms.editor")) %></span>
+  </li>
+  <li class='d-flex align-items-center gap-2 mb-2'>
+    <svg width='50' height='50' viewBox='0 0 100 100' class='flex-shrink-0 align-self-start'>
+      <path d="M50 5c-20.71 0-37.5 16.789-37.5 37.5s37.5 52.5 37.5 52.5 37.5-31.789 37.5-52.5-16.789-37.5-37.5-37.5z" fill="#7092ff" />
+      <circle cx="50" cy="42.5" r="15" fill="#fff" />
+    </svg>
+    <span><%= t ".basic_terms.a_node_html", :node => tag.strong(t(".basic_terms.node")) %></span>
+  </li>
+  <li class='d-flex align-items-center gap-2 mb-2'>
+    <svg width='50' height='50' viewBox='0 0 100 100' class='flex-shrink-0 align-self-start'>
+      <line x1="20" y1="80" x2="80" y2="20" stroke="#7092ff" stroke-width="15" />
+      <circle cx="20" cy="80" r="15" fill="#7092ff" />
+      <circle cx="80" cy="20" r="15" fill="#7092ff" />
+      <circle cx="20" cy="80" r="7" fill="#fff" />
+      <circle cx="80" cy="20" r="7" fill="#fff" />
+    </svg>
+    <span><%= t ".basic_terms.a_way_html", :way => tag.strong(t(".basic_terms.way")) %></span>
+  </li>
+  <li class='d-flex align-items-center gap-2 mb-2'>
+    <svg width='50' height='50' viewBox='0 0 100 100' class='flex-shrink-0 align-self-start'>
+      <path d="M25 87l-20-20v-29l20-20h68l2 2v65l-2 2z" fill="#7092ff" />
+      <rect width="10" height="15" x="15" y="45" rx="3" ry="2.25" fill="#fff" />
+    </svg>
+    <span><%= t ".basic_terms.a_tag_html", :tag => tag.strong(t(".basic_terms.tag")) %></span>
+  </li>
+</ul>
 
-<div class='clearfix'>
-  <h2><%= t ".rules.title" %></h2>
-  <span class='sprite small term rules float-start'></span>
+<h2><%= t ".rules.title" %></h2>
+<div class='d-flex align-items-center gap-2'>
+  <svg width='50' height='50' viewBox='0 0 100 100' class='flex-shrink-0 align-self-start'>
+    <circle cx="50" cy="50" r="45" fill="#7092ff" />
+    <path d="M41.072 49.28q0-2.4 1.152-3.84 1.152-1.488 2.64-2.208-1.728-.96-2.688-2.256-.96-1.344-.96-3.264 0-2.88 2.448-4.512 2.448-1.68 7.008-1.68 2.688 0 4.56.48 1.872.432 3.648 1.152l-1.296 3.216q-1.632-.672-3.264-1.104-1.632-.48-3.936-.48-2.88 0-4.08.768-1.152.72-1.152 2.064 0 1.344 1.344 2.304 1.344.912 4.992 2.256 3.696 1.344 5.76 3.072 2.064 1.728 2.064 4.608 0 2.448-1.104 4.032-1.104 1.536-2.496 2.352 1.68.912 2.592 2.208.96 1.248.96 3.072 0 3.312-2.784 5.136-2.736 1.824-7.68 1.824-2.64 0-4.608-.384-1.968-.432-3.504-1.2v-3.6q1.536.72 3.792 1.344 2.256.624 4.512.624 3.552 0 4.896-1.008 1.344-1.056 1.344-2.4 0-.912-.48-1.584-.432-.672-1.776-1.392-1.296-.768-3.936-1.728-2.496-.96-4.32-1.968-1.776-1.008-2.736-2.4-.912-1.392-.912-3.504zm3.6-.48q0 1.776 1.488 3.024 1.536 1.2 5.376 2.64l1.056.384q1.104-.672 2.064-1.68 1.008-1.056 1.008-2.688 0-1.2-.672-2.16-.624-.96-2.256-1.824-1.632-.912-4.608-1.824-1.344.336-2.4 1.44-1.056 1.104-1.056 2.688z" fill="#fff" stroke="#fff" />
+  </svg>
   <p><%= t ".rules.para_1_html", :imports_link => link_to(t(".rules.imports"), t(".rules.imports_url")),
                                  :automated_edits_link => link_to(t(".rules.automated_edits"), t(".rules.automated_edits_url")) %></p>
 </div>
 
-<div class='clearfix'>
-  <%= render "any_questions" %>
-</div>
+<%= render "any_questions" %>
 
-<div class='clearfix text-center'>
-  <p class="display-5">
+<div class='text-center mb-3'>
 <% if params[:oauth_return_url] %>
   <a class="btn btn-primary" href="<%= params[:oauth_return_url] %>"><%= t ".continue_authorization" %></a>
 <% else %>
-  <a class="button btn btn-primary start-mapping" href="<%= edit_path %>"><%= t ".start_mapping" %></a>
+  <a class="btn btn-primary start-mapping" href="<%= edit_path %>"><%= t ".start_mapping" %></a>
 <% end %>
-  </p>
 </div>
 
 <div class='alert alert-primary'>
index cd4dce99e1c2eca1592f1213027ec22a1f3c7fa6..37713679f1c12ee6a58ee7119f1f8999de900f3f 100644 (file)
@@ -30,7 +30,7 @@
         <span class="badge bg-<%= badge_class %> text-white"><%= t(".#{trace.visibility}") %></span>
       </li>
     </ul>
-    <p class="text-muted mb-0">
+    <p class="text-body-secondary mb-0">
       <% if trace.tags.empty? %>
         <%= t ".details_without_tags_html", :time_ago => friendly_date_ago(trace.timestamp),
                                             :user => link_to(trace.user.display_name, trace.user) %>
index a2a06836066398b467da603578321a1c93a1ba09..b618f381107260222c9343f3e7db44ef64173654 100644 (file)
@@ -7,13 +7,13 @@
 
 <% content_for :heading do %>
   <% if @client_app_name %>
-    <p class="text-center text-muted fs-6 py-2 mb-0 bg-body"><%= t(".signup_to_authorize_html", :client_app_name => @client_app_name) %></p>
+    <p class="text-center text-body-secondary fs-6 py-2 mb-0 bg-body"><%= t(".signup_to_authorize_html", :client_app_name => @client_app_name) %></p>
   <% end %>
 
   <div class="header-illustration new-user-main auth-container mx-auto">
-    <ul class="nav nav-tabs position-absolute bottom-0 px-3 fs-6 w-100">
+    <ul class="nav nav-tabs position-absolute bottom-0 fs-6 w-100">
       <li class="nav-item">
-        <%= link_to t("sessions.new.tab_title"), url_for(:action => :new, :controller => :sessions), :class => "nav-link" %>
+        <%= link_to t("sessions.new.tab_title"), url_for(:action => :new, :controller => :sessions, :referer => @referer), :class => "nav-link" %>
       </li>
       <li class="nav-item">
         <%= link_to t("users.new.tab_title"), "#", :class => "nav-link active" %>
 
 <div class="auth-container mx-auto my-0">
   <% if current_user.auth_uid.nil? %>
-    <div class="text-muted fs-6">
+    <div class="text-body-secondary fs-6">
       <p><strong><%= t ".about.header" %></strong> <%= t ".about.paragraph_1" %></p>
       <p><%= t ".about.paragraph_2" %></p>
     </div>
 
     <% unless @preferred_auth_provider.nil? %>
       <%= render :partial => "auth_providers" %>
-      <div class="d-flex justify-content-center align-items-center">
+      <div class="d-flex justify-content-center align-items-center mb-2">
         <div class="border-bottom border-1 flex-grow-1"></div>
         <div class="text-secondary mx-3"><%= t ".or" %></div>
         <div class="border-bottom border-1 flex-grow-1"></div>
@@ -53,6 +53,7 @@
                                                                            t(".privacy_policy_url"),
                                                                            :title => t(".privacy_policy_title"),
                                                                            :target => :new)),
+                                :autofocus => true,
                                 :tabindex => 1 %>
     <% else %>
       <%= f.hidden_field :email %>
       </div>
     <% end %>
 
-    <p class="mb-3 text-muted fs-6"><%= t(".by_signing_up_html",
-                                          :tou_link => link_to(t("layouts.tou"),
-                                                               "https://wiki.osmfoundation.org/wiki/Terms_of_Use",
-                                                               :target => :new),
-                                          :privacy_policy_link => link_to(t(".privacy_policy"),
-                                                                          t(".privacy_policy_url"),
-                                                                          :title => t(".privacy_policy_title"),
-                                                                          :target => :new),
-                                          :contributor_terms_link => link_to(t(".contributor_terms"),
-                                                                             t(".contributor_terms_url"),
-                                                                             :target => :new)) %></p>
+    <p class="mb-3 text-body-secondary fs-6"><%= t(".by_signing_up_html",
+                                                   :tou_link => link_to(t("layouts.tou"),
+                                                                        "https://wiki.osmfoundation.org/wiki/Terms_of_Use",
+                                                                        :target => :new),
+                                                   :privacy_policy_link => link_to(t(".privacy_policy"),
+                                                                                   t(".privacy_policy_url"),
+                                                                                   :title => t(".privacy_policy_title"),
+                                                                                   :target => :new),
+                                                   :contributor_terms_link => link_to(t(".contributor_terms"),
+                                                                                      t(".contributor_terms_url"),
+                                                                                      :target => :new)) %></p>
     <%= f.form_group do %>
       <%= f.check_box :consider_pd,
                       :tabindex => 5,
index 9da3f8f046884b37279fb2a579852006b277e41a..2c40cfebed99c2183451910ca675c28e6eed62bd 100644 (file)
         </nav>
       <% end %>
 
-      <div class='text-muted'>
+      <div class='text-body-secondary'>
         <small>
           <dl class="list-inline">
             <dt class="list-inline-item m-0"><%= t ".mapper since" %></dt>
             <dd class="list-inline-item"><%= l @user.created_at.to_date, :format => :long %></dd>
+            <dt class="list-inline-item m-0"><%= t ".last map edit" %></dt>
+            <dd class="list-inline-item"><%= l @user.changesets.first&.created_at&.to_date, :format => :long, :default => t(".no activity yet") %></dd>
             <% unless @user.terms_agreed %>
               <dt class="list-inline-item m-0"><%= t ".ct status" %></dt>
               <dd class="list-inline-item">
       <% end %>
 
       <% if current_user and current_user.administrator? -%>
-        <div class='text-muted'>
+        <div class='text-body-secondary'>
           <small>
             <dl class="list-inline">
               <dt class="list-inline-item m-0"><%= t ".email address" %></dt>
index 340aaf04e2ac7c4604e8322844560f87e4759dde..b7efe912e27e68dea89326de851e2591b1f6e476 100644 (file)
 
 <%= form_tag({ :action => "save" }) do %>
   <!-- legale is <%= @legale %> -->
-  <p class="text-muted"><%= t ".read and accept with tou" %></p>
+  <p class="text-body-secondary"><%= t ".read and accept with tou" %></p>
   <h4>
     <%= t ".heading_ct" %>
   </h4>
-  <p class="text-muted"><%= t ".contributor_terms_explain" %></p>
+  <p class="text-body-secondary"><%= t ".contributor_terms_explain" %></p>
   <label class="form-label">
     <%= t ".legale_select" %>
   </label>
@@ -35,7 +35,7 @@
   </div>
 
   <div>
-    <p id="contributorGuidance" class="text-muted">
+    <p id="contributorGuidance" class="text-body-secondary">
       <%= t ".guidance_info_html",
             :readable_summary_link => link_to(t(".readable_summary"),
                                               "https://www.osmfoundation.org/wiki/License/Contributor_Terms_Summary"),
@@ -55,7 +55,7 @@
   <h4>
     <%= t "layouts.tou" %>
   </h4>
-  <p class="text-muted"><%= t ".tou_explain_html", :tou_link => link_to(t("layouts.tou"), "https://wiki.osmfoundation.org/wiki/Terms_of_Use", :target => :new) %></p>
+  <p class="text-body-secondary"><%= t ".tou_explain_html", :tou_link => link_to(t("layouts.tou"), "https://wiki.osmfoundation.org/wiki/Terms_of_Use", :target => :new) %></p>
 
   <div class="mb-3">
     <div class="form-check">
diff --git a/config/brakeman.ignore b/config/brakeman.ignore
new file mode 100644 (file)
index 0000000..b8fed1d
--- /dev/null
@@ -0,0 +1,29 @@
+{
+  "ignored_warnings": [
+    {
+      "warning_type": "HTTP Verb Confusion",
+      "warning_code": 118,
+      "fingerprint": "9567bbac855c6ec5552572700ec809d7c1d77f59953e6725aeca54fee5091674",
+      "check_name": "VerbConfusion",
+      "message": "Potential HTTP verb confusion. `HEAD` is routed like `GET` but `request.get?` will return `false`",
+      "file": "app/controllers/application_controller.rb",
+      "line": 312,
+      "link": "https://brakemanscanner.org/docs/warning_types/http_verb_confusion/",
+      "code": "if request.get? then\n  respond_to do\n   format.html do\n   redirect_to(:controller => \"/errors\", :action => \"bad_request\")\n   end\n  format.any do\n   head(:bad_request)\n   end\n   end\nelse\n  head(:bad_request)\nend",
+      "render_path": null,
+      "location": {
+        "type": "method",
+        "class": "ApplicationController",
+        "method": "invalid_parameter"
+      },
+      "user_input": "request.get?",
+      "confidence": "Weak",
+      "cwe_id": [
+        352
+      ],
+      "note": ""
+    }
+  ],
+  "updated": "2024-04-11 10:07:03 +0100",
+  "brakeman_version": "6.1.2"
+}
index 2bc4f5e59d40d07f552d36417bd3f211eda8d6ee..9d59656c7b2cd4255d019c523bf57952249e0648 100644 (file)
@@ -6,7 +6,7 @@ if defined?(ActiveRecord::ConnectionAdaptors::AbstractAdapter)
           if e.is_a?(Timeout::Error) || e.is_a?(OSM::APITimeoutError)
             e
           else
-            super(e, sql)
+            super
           end
         end
       end
index b3076b38fe14399a56099ba187b1cb21cac15f09..9ddaf70f94598b62f6d65a272457d61c68c05ed6 100644 (file)
@@ -4,22 +4,42 @@
 # See the Securing Rails Applications Guide for more information:
 # https://guides.rubyonrails.org/security.html#content-security-policy-header
 
-# Rails.application.configure do
-#   config.content_security_policy do |policy|
-#     policy.default_src :self, :https
-#     policy.font_src    :self, :https, :data
-#     policy.img_src     :self, :https, :data
-#     policy.object_src  :none
-#     policy.script_src  :self, :https
-#     policy.style_src   :self, :https
-#     # Specify URI for violation reports
-#     # policy.report_uri "/csp-violation-report-endpoint"
-#   end
-#
-#   # Generate session nonces for permitted importmap, inline scripts, and inline styles.
-#   config.content_security_policy_nonce_generator = ->(request) { request.session.id.to_s }
-#   config.content_security_policy_nonce_directives = %w(script-src style-src)
-#
-#   # Report violations without enforcing the policy.
-#   # config.content_security_policy_report_only = true
-# end
+Rails.application.configure do
+  connect_src = [:self]
+  img_src = [:self, :data, "www.gravatar.com", "*.wp.com", "tile.openstreetmap.org", "gps.tile.openstreetmap.org", "*.tile.thunderforest.com", "tile.tracestrack.com", "*.openstreetmap.fr"]
+  script_src = [:self]
+
+  connect_src << Settings.matomo["location"] if defined?(Settings.matomo)
+  img_src << Settings.matomo["location"] if defined?(Settings.matomo)
+  script_src << Settings.matomo["location"] if defined?(Settings.matomo)
+
+  img_src << Settings.avatar_storage_url if Settings.key?(:avatar_storage_url)
+  img_src << Settings.trace_image_storage_url if Settings.key?(:trace_image_storage_url)
+
+  config.content_security_policy do |policy|
+    policy.default_src :self
+    policy.child_src(:self)
+    policy.connect_src(*connect_src)
+    policy.font_src(:none)
+    policy.form_action(:self)
+    policy.frame_ancestors(:self)
+    policy.frame_src(:self)
+    policy.img_src(*img_src)
+    policy.manifest_src(:self)
+    policy.media_src(:none)
+    policy.object_src(:self)
+    policy.plugin_types
+    policy.script_src(*script_src)
+    policy.style_src(:self)
+    policy.worker_src(:none)
+    policy.manifest_src(:self)
+    policy.report_uri(Settings.csp_report_url) if Settings.key?(:csp_report_url)
+  end
+
+  # Generate session nonces for permitted importmap and inline scripts
+  config.content_security_policy_nonce_generator = ->(_request) { SecureRandom.base64(24) }
+  config.content_security_policy_nonce_directives = %w[style-src]
+
+  # Report violations without enforcing the policy.
+  config.content_security_policy_report_only = true unless Settings.csp_enforce
+end
index fdbf11a2ce05cacaaffcdd4a90a822518be92e81..e7b813b73f788fb7bf4cac947007c2ff0154340d 100644 (file)
@@ -6,7 +6,7 @@
 module OpenStreetMap
   class Cors < Rack::Cors
     def call(env)
-      status, headers, body = super(env)
+      status, headers, body = super
       headers["Cache-Control"] = "no-cache" if headers["Access-Control-Allow-Origin"]
       [status, headers, body]
     end
index 266e41cbb98d501435ba985efbdba9af475c8d63..8f74c3cd39455a0b5548aa8d6a364da9259a1309 100644 (file)
@@ -18,7 +18,7 @@ module OpenStreetMap
       def store_translations(locale, data, options = {})
         locale = ::I18n::Locale::Tag::Rfc4646.tag(locale).to_s
 
-        super(locale, data, options)
+        super
       end
     end
 
index 4bab2000b03ed897a600133b22bb9231ca32d4e8..30b23d2ddb47fa298df8dcba50a8aa5a82d3edc6 100644 (file)
@@ -4,7 +4,7 @@ module OpenStreetMap
       def perform(mailer, mail_method, delivery_method, *args, **kwargs)
         kwargs = args.pop if kwargs.empty? && args.last.is_a?(Hash)
 
-        super(mailer, mail_method, delivery_method, *args, **kwargs)
+        super
       end
     end
   end
index fbe4ad219161a6c87d58c872a98aced64b1acdfd..812e6610d9e67a46b1df270cd5a201cf41d3dff4 100644 (file)
@@ -45,7 +45,7 @@ module OpenStreetMap
         status = options.delete(:status) || :ok
         head status, options
       else
-        super(options)
+        super
       end
     end
 
@@ -61,7 +61,7 @@ module OpenStreetMap
           end
         end
 
-        super(controller)
+        super
       end
     end
   end
index 4357a87f25f47ea0cc98c8da6d9f155ed8dad750..849aba2ad15f428785b83f457b0141933dbdfd7a 100644 (file)
@@ -5,7 +5,7 @@ module OpenStreetMap
   module Router
     module ForceEncoding
       def normalize_path(path)
-        super(path).force_encoding("UTF-8")
+        super.force_encoding("UTF-8")
       end
     end
   end
index 11e4e0d5c053894f3752e730c06879d48e667dbb..793c484fc40127058a5ab790dcf0ae337151e6c8 100644 (file)
@@ -2,7 +2,7 @@ require "rtlcss"
 
 class RtlcssSCSSProcessor < SassC::Rails::ScssTemplate
   def self.call(input)
-    output = super(input)
+    output = super
     data = Rtlcss.flip_css(output[:data])
     output.delete(:map)
     output.merge(:data => data)
diff --git a/config/initializers/secure_headers.rb b/config/initializers/secure_headers.rb
deleted file mode 100644 (file)
index 60f1551..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-csp_policy = {
-  :preserve_schemes => true,
-  :default_src => %w['self'],
-  :child_src => %w['self'],
-  :connect_src => %w['self'],
-  :font_src => %w['none'],
-  :form_action => %w['self'],
-  :frame_ancestors => %w['self'],
-  :frame_src => %w['self'],
-  :img_src => %w['self' data: www.gravatar.com *.wp.com tile.openstreetmap.org *.tile.openstreetmap.org *.tile.thunderforest.com tile.tracestrack.com *.openstreetmap.fr],
-  :manifest_src => %w['self'],
-  :media_src => %w['none'],
-  :object_src => %w['self'],
-  :plugin_types => %w[],
-  :script_src => %w['self'],
-  :style_src => %w['self'],
-  :worker_src => %w['none'],
-  :report_uri => []
-}
-
-csp_policy[:connect_src] << Settings.matomo["location"] if defined?(Settings.matomo)
-csp_policy[:img_src] << Settings.matomo["location"] if defined?(Settings.matomo)
-csp_policy[:script_src] << Settings.matomo["location"] if defined?(Settings.matomo)
-
-csp_policy[:img_src] << Settings.avatar_storage_url if Settings.key?(:avatar_storage_url)
-csp_policy[:img_src] << Settings.trace_image_storage_url if Settings.key?(:trace_image_storage_url)
-
-csp_policy[:report_uri] << Settings.csp_report_url if Settings.key?(:csp_report_url)
-
-cookie_policy = {
-  :httponly => { :only => %w[_osm_session _osm_totp_token] }
-}
-
-SecureHeaders::Configuration.default do |config|
-  config.hsts = SecureHeaders::OPT_OUT
-  config.referrer_policy = "strict-origin-when-cross-origin"
-
-  if Settings.csp_enforce
-    config.csp = csp_policy
-    config.csp_report_only = SecureHeaders::OPT_OUT
-  elsif Settings.key?(:csp_report_url)
-    config.csp = SecureHeaders::OPT_OUT
-    config.csp_report_only = csp_policy
-  else
-    config.csp = SecureHeaders::OPT_OUT
-    config.csp_report_only = SecureHeaders::OPT_OUT
-  end
-
-  config.cookies = cookie_policy
-end
index a122848553bf1a9f00fe4d09f2f18ee292617f3b..4119064c39cf1601dbcf5babc877ff06ae953ae1 100644 (file)
@@ -1,7 +1,7 @@
 # Be sure to restart your server when you modify this file.
 
 if Settings.key?(:memcache_servers)
-  Rails.application.config.session_store :mem_cache_store, :memcache_server => Settings.memcache_servers, :namespace => "rails:session", :key => "_osm_session"
+  Rails.application.config.session_store :mem_cache_store, :memcache_server => Settings.memcache_servers, :namespace => "rails:session", :key => "_osm_session", :same_site => :lax
 else
-  Rails.application.config.session_store :cache_store, :key => "_osm_session", :cache => ActiveSupport::Cache::MemoryStore.new
+  Rails.application.config.session_store :cache_store, :key => "_osm_session", :cache => ActiveSupport::Cache::MemoryStore.new, :same_site => :lax
 end
index 136afb014a37e8985d2c6b36317c6ccb0567cd65..ac2146830a8c4ac4bf38dd0db7b2933ce819350c 100644 (file)
@@ -10,4 +10,4 @@ errors, as there is at least one test that makes sure that all translations are
 valid (we'll makes sure that they won't cause the site to not work).
 
 There is more information about translating the website on the wiki at
-http://wiki.openstreetmap.org/wiki/Website_Internationalization.
+https://wiki.openstreetmap.org/wiki/Website_internationalization.
index c0fd0644c83793bb877fa3187d3fb58973996461..ea0b3008289ee7251389f8d47943dbe7fe65dd8f 100644 (file)
@@ -2,6 +2,7 @@
 # Exported from translatewiki.net
 # Export driver: phpyaml
 # Author: Alex73
+# Author: Andoti
 # Author: Artsiom91
 # Author: Chadyka
 # Author: Goshaproject
@@ -58,6 +59,9 @@ be:
       messages:
         invalid_email_address: не падобны на карэктны адрас электроннай пошты
         email_address_not_routable: немагчыма пракласці маршрут
+      models:
+        user_mute:
+          is_already_muted: ужо заглушаны
     models:
       acl: Спіс правоў доступу
       changeset: Пакет правак
@@ -334,6 +338,9 @@ be:
       delete_account: Выдаліць уліковы запіс...
     go_public:
       heading: Публічнае рэдагаванне
+      find_out_why: даведацца, чаму
+      email_not_revealed: Ваш адрас электроннай пошты не будзе раскрыты, калі стане
+        публічным.
       make_edits_public_button: Зрабіць усе мае змены публічнымі
     update:
       success_confirm_needed: Звесткі аб карыстальніку паспяхова абноўленыя. Праверце
@@ -595,6 +602,31 @@ be:
       comment: Каментар
       newer_comments: Навейшыя каментары
       older_comments: Старэйшыя каментары
+  doorkeeper:
+    scopes:
+      phone: Праглядзець ваш нумар тэлефона
+      profile: Праглядзець інфармацыю вашага профілю
+  errors:
+    contact:
+      contact_url_title: Тлумачэнне розных каналаў сувязі
+      contact: звяртацца
+      contact_the_community_html: Не саромейцеся %{contact_link} да супольнасці OpenStreetMap,
+        калі вы знайшлі непрацуючую спасылку / памылку. Запішыце дакладны URL вашага
+        запыту.
+    bad_request:
+      title: Памылковы запыт
+      description: Запытаная вамі аперацыя на серверы OpenStreetMap   несапраўдная
+        (HTTP 400)
+    forbidden:
+      title: Доступ забаронены
+      description: Запытаная вамі аперацыя на серверы OpenStreetMap даступная толькі
+        адміністратарам (HTTP 403)
+    internal_server_error:
+      title: Памылка праграмы
+      description: Сервер OpenStreetMap сутыкнуўся з нечаканай сітуацыяй, якая перашкодзіла
+        яму выканаць запыт (HTTP 500)
+    not_found:
+      title: Файл не знойдзены
   friendships:
     make_friend:
       heading: Пасябраваць з %{user}?
@@ -677,16 +709,22 @@ be:
           hospital: Бальніца
           hunting_stand: Паляўнічая вежа
           ice_cream: Марозіва
+          internet_cafe: Інтэрнэт-кафэ
           kindergarten: Дзіцячы садок
+          language_school: Моўная школа
           library: Бібліятэка
+          love_hotel: Гатэль кахання
           marketplace: Рыначная плошча
           monastery: Кляштар
+          money_transfer: Перавод грошай
           motorcycle_parking: Паркоўка для матацыклаў
+          music_school: Музычная школа
           nightclub: Начны клуб
           nursing_home: Прыватная лякарня
           parking: Паркоўка
           parking_entrance: Заезд на паркоўку
           parking_space: Паркоўка
+          payment_terminal: Плацежны тэрмінал
           pharmacy: Аптэка
           place_of_worship: Культавы будынак
           police: Паліцыя
@@ -694,7 +732,10 @@ be:
           post_office: Паштовае аддзяленне
           prison: Турма
           pub: Паб
+          public_bath: Лазня
+          public_bookcase: Кніжны абмен
           public_building: Грамадскі будынак
+          ranger_station: Станцыя рэйнджараў
           recycling: Пункт перапрацоўкі
           restaurant: Рэстаран
           school: Школа
@@ -715,12 +756,19 @@ be:
           village_hall: Вясковая зала
           waste_basket: Кош для смецця
           waste_disposal: Смеццевы бак
+          waste_dump_site: Нелегальная звалка
+          watering_place: Вадапой для жывёл
           water_point: Вада
+          weighbridge: Грузавыя вагі
+          "yes": Зручнасць
         boundary:
+          aboriginal_lands: Тэрыторыі тубыльцаў
           administrative: Адміністрацыйная мяжа
           census: Межы перапісу
           national_park: Нацыянальны парк
+          political: Электаральная мяжа
           protected_area: Абаронены раён
+          "yes": Мяжа
         bridge:
           aqueduct: Акведук
           boardwalk: Тратуар
@@ -729,6 +777,39 @@ be:
           viaduct: Віядук
           "yes": Мост
         building:
+          apartment: Кватэра
+          apartments: Кватэры
+          barn: Свіран
+          bungalow: Бунгала
+          cabin: Хаціна
+          chapel: Капліца
+          church: Будынак царквы
+          civic: Грамадзянскі будынак
+          college: Будынак каледжа
+          commercial: Камерцыйны будынак
+          construction: Будынак будуецца
+          hangar: Ангар
+          hospital: Будынак бальніцы
+          hotel: Будынак гасцініцы
+          house: Дом
+          houseboat: Плывучы дом
+          hut: Хата
+          industrial: Прамысловы будынак
+          kindergarten: Дзіцячы сад
+          manufacture: Вытворчы будынак
+          office: Офисны будынак
+          public: Грамадскі будынак
+          residential: Жылы будынак
+          retail: Гандлёвы будынак
+          roof: Дах
+          ruins: Рэшткі будынку
+          school: Школа
+          static_caravan: Мабільны дом
+          temple: Храм
+          terrace: Тэраса
+          train_station: Чыгуначны вакзал
+          university: Универсітэт
+          warehouse: Склад
           "yes": Будынак
         craft:
           brewery: Бровар
index 714adfce190e9906e903067f245ee0b58d6736d2..0eba4b72a9ab99be95433af74770a4beb8422a22 100644 (file)
@@ -1561,6 +1561,21 @@ bg:
         more_title_html: Открийте повече
         contributors_title_html: Нашите сътрудници
         infringement_title_html: Нарушаване на авторските права
+        infringement_1_html: Напомняме на сътрудниците на OSM никога да не добавят
+          данни от източници, защитени с авторски права (например Google Maps или
+          печатни карти), без изрично разрешение от притежателите на авторските права.
+        infringement_2_1_html: Ако смятате, че материал, защитен с авторско право,
+          е добавен по неправомерен начин в базата данни на OpenStreetMap или в този
+          сайт, моля, обърнете се към нашата %{takedown_procedure_link} или подайте
+          сигнал директно чрез нашата %{online_filing_page_link}.
+        infringement_2_1_takedown_procedure: процедура за сваляне
+        infringement_2_1_online_filing_page: онлайн страница за подаване на документи
+        trademarks_title: Търговски марки
+        trademarks_1_1_html: |-
+          OpenStreetMap, логото с лупата и State of the Map са регистрирани търговски марки на
+          OpenStreetMap Foundation. Ако имате въпроси относно използването на марките, моля вижте нашата
+          %{trademark_policy_link}.
+        trademarks_1_1_trademark_policy: политика за търговски марки
     index:
       js_2: OpenStreetMap използва JavaScript за своята статична карта.
       permalink: Постоянна връзка
index a9f60ec4e3f1b5f22ac5626e2a04b92a7210cecb..0c1cf6f6f69b805c5f798488b2fb9b353b36e6f6 100644 (file)
@@ -19,6 +19,7 @@
 # Author: R4356th
 # Author: R4bb1
 # Author: Rasal Lia
+# Author: RiazACU
 # Author: Sayma Jahan
 # Author: Tahmid
 # Author: Tauhid16
index 67c5b031cf23ec04a7a1c86768ffa076b8e3b4e0..028b640b3324f3619f5f08b8283e1753a9e4c77f 100644 (file)
@@ -676,6 +676,8 @@ br:
   errors:
     contact:
       contact: darempred
+    bad_request:
+      title: Reked fall
     forbidden:
       title: Difennet
     internal_server_error:
@@ -1927,7 +1929,8 @@ br:
       lost password link: Ankouaet ho ker-tremen ganeoc'h ?
       login_button: Kevreañ
       register now: En em enskrivañ bremañ
-      with external: 'Mod all, implijit un tredeour evit kevreañ :'
+      with external: 'pe kevreit gant un tredeour:'
+      or: pe
       auth failure: Ho tigarez, met n'eus ket bet gallet hoc'h anavezout gant an titouroù
         pourchaset.
     destroy:
@@ -2195,7 +2198,7 @@ br:
       close: Serriñ
     search:
       search: Klask
-      get_directions: Kaout an tuioù
+      get_directions: Kaout an durc'hadurioù
       get_directions_title: Kavit an hentoù etre an daou boent
       from: Eus
       to: Da
@@ -2417,6 +2420,7 @@ br:
       identifiable: ANAVEZADUS
       private: PREVEZ
       trackable: HEULIADUS
+      details_with_tags_html: '%{time_ago} gant %{user} e-barzh %{tags}'
       details_without_tags_html: '%{time_ago} gant %{user}'
     index:
       public_traces: Roudoù GPS foran
@@ -2473,6 +2477,7 @@ br:
       muted_users: Implijerien kuzhet
     auth_providers:
       openid_logo_alt: Kevreañ gant un OpenID
+      openid_login_button: Kenderc'hel
       openid:
         title: Kevreañ gant OpenID
         alt: Kevreañ gant un URL OpenID
@@ -2623,20 +2628,23 @@ br:
   users:
     new:
       title: Kevreañ
+      tab_title: En em enskrivañ
       no_auto_account_create: Siwazh n'omp ket evit krouiñ ur gont evidoc'h ent emgefreek.
       please_contact_support_html: Kit e darempred gant ar %{support_link}, mar plij,
         evit ma krouo ur gont evidoc'h - klask a raimp plediñ gant ho koulenn kerkent
         ha ma vo tu.
       support: skor
       about:
-        header: Digoust hag aozadus
+        header: Digoust hag aozadus.
         paragraph_1: E-skoaz ar c'hartennoù all eo savet OpenStreetMap penn-da-benn
           gant tud eveldoc'h ha tu zo da bep hini reizhañ, hizivaat, pellgargañ hag
           implijout e gartennoù.
-        paragraph_2: Lakait hoc'h anv ha stagit da gemer perzh. Kaset a vo ur postel
-          deoc'h a-benn kadarnaat ho kont.
+        paragraph_2: Lakait hoc'h anv ha stagit da gemer perzh.
+        welcome: Degemer mat en OpenStreetMap
       display name description: Emañ hoc'h anv implijer a-wel d'an holl. Se a c'hallit
         cheñch diwezhatoc'h en ho penndibaboù.
+      tou: Termenoù implijout
+      contributor_terms: reolennoù ar genlabourerien
       external auth: 'Dilesadur trede :'
       continue: En em enskrivañ
       terms accepted: Trugarez deoc'h evit bezañ asantet da ziferadennoù nevez ar
@@ -2644,7 +2652,9 @@ br:
       email_help_html: Ho chomlec'h ne vo ket hewel d'an holl, sellit ouzh %{privacy_policy_link}
         evit gouzout hiroc'h.
       privacy_policy: reolennoù prevezded
-      use external auth: 'Mod all, implijit un tredeour evit kevreañ :'
+      consider_pd: domani foran
+      or: pe
+      use external auth: 'pe kevreit gant un tredeour:'
     terms:
       title: Termenoù
       heading: Termenoù
@@ -2974,12 +2984,15 @@ br:
       reactivate: Adweredekaat
       comment_and_resolve: Addisplegañ & Diskoulmañ
       comment: Evezhiadenn
+      log_in_to_comment: Kevreit evit skrivañ war an notenn-mañ
       other_problems_resolved: Evit an holl gudennoù all ez eo a-walc'h d'o diskoulmañ.
     new:
       title: Notenn nevez
       intro: Gwelet ho peus ur fazi pe un dra a vank ? Roit an dra-se da c'houzout
         d'ar gartennaouerien all evit ma vo renket. Lakait ar merker el lec'h mat
         ha skrivit un notenn da zisplegañ ar gudenn.
+      anonymous_warning_log_in: kevreañ
+      anonymous_warning_sign_up: en em enskrivañ
       advice: Foran eo ho notenn ha ne c'hall ket bezañ implijet evit hizivaat ar
         gartenn. Setu perak eo arabat ebarzhiñ titouroù personel pe titouroù o tont
         eus kartennoù gwarezet na endalc'hioù rolloù.
@@ -3036,6 +3049,7 @@ br:
         standard: Standard
         cycle_map: Kelc'hiad kartenn
         transport_map: Kartenn treuzdougen
+        tracestracktop_topo: Tracestrack Topo
         hot: Denegour
       layers:
         header: Gwiskadoù kartenn
@@ -3082,7 +3096,7 @@ br:
         fossgis_valhalla_car: Karr (Valhalla)
         fossgis_valhalla_foot: War droad (Valhalla)
       descend: Diskenn
-      directions: Tuioù
+      directions: Durc'hadurioù
       distance: Hed
       distance_m: '%{distance}m'
       distance_km: '%{distance}km'
index 611ea26966816f877f4a0e688d76fca4ec29d2c6..822891be326d797aac6d384508db1e84a0ad352d 100644 (file)
@@ -3,6 +3,7 @@
 # Export driver: phpyaml
 # Author: McDutchie
 # Author: Sasan700
+# Author: Исмаил Садуев
 # Author: Умар
 ---
 ce:
@@ -919,7 +920,7 @@ ce:
       revoker: 'БлокдӀайаьккхинарг:'
     block:
       show: Гайта
-      edit: Ð\9dиÑ\81йе
+      edit: Ð\9dиÑ\81йан
       revoke: ДӀайаккхаблок!
     blocks:
       display_name: Блоктоьхна декъашхо
index 0bb05f8441f88b1412888e6c8d330e45c1562175..c84032e2dedbd967d6ce65d632138f921e73d269 100644 (file)
@@ -91,6 +91,7 @@ cs:
       messages:
         invalid_email_address: není platná e-mailová adresa
         email_address_not_routable: není routovatelná
+        display_name_is_user_n: nemůže být user_n, pokud n není vaše ID uživatele
       models:
         user_mute:
           is_already_muted: již je ztlumen
@@ -1767,7 +1768,7 @@ cs:
         odkaz.
     lost_password:
       subject: '[OpenStreetMap] Žádost o nové heslo'
-      greeting: Dobrý den,
+      greeting: Ahoj,
       hopefully_you: Někdo (patrně vy) požádal o vygenerování nového hesla pro uživatele
         serveru openstreetmap.org s touto e-mailovou adresou.
       click_the_link: Pokud jste to byli Vy, kliknutím na níže uvedený odkaz získáte
@@ -2012,6 +2013,7 @@ cs:
     new:
       title: Přihlásit se
       tab_title: Přihlášení
+      login_to_authorize_html: Pro přístup k %{client_app_name} se přihlaste do OpenStreetMap.
       email or username: E-mailová adresa nebo uživatelské jméno
       password: Heslo
       remember: Zapamatuj si mě
@@ -2019,6 +2021,7 @@ cs:
       login_button: Přihlásit se
       register now: Zaregistrujte se
       with external: nebo se přihlaste prostřednictvím třetí strany
+      or: nebo
       auth failure: Je mi líto, ale s uvedenými údaji se nemůžete přihlásit.
     destroy:
       title: Odhlásit se
@@ -2627,6 +2630,8 @@ cs:
       identifiable: IDENTIFIKOVATELNÁ
       private: SOUKROMÁ
       trackable: STOPOVATELNÁ
+      details_with_tags_html: '%{time_ago} uživatelem %{user} v %{tags}'
+      details_without_tags_html: '%{time_ago} uživatelem %{user}'
     index:
       public_traces: Veřejné GPS stopy
       my_gps_traces: Moje GPS stopy
@@ -2682,6 +2687,7 @@ cs:
       muted_users: Ztlumení uživatelé
     auth_providers:
       openid_logo_alt: Přihlášení pomocí OpenID
+      openid_login_button: Pokračovat
       openid:
         title: Přihlásit se pomocí OpenID
         alt: Přihlásit se pomocí OpenID URL
@@ -2745,6 +2751,8 @@ cs:
       write_redactions: Upravte mapová data
       read_email: Přečíst e-mailovou adresu uživatele
       skip_authorization: Automaticky schválit aplikaci
+    for_roles:
+      moderator: Toto oprávnění je pro akce dostupné pouze moderátorům
   oauth_clients:
     new:
       title: Registrace nové aplikace
@@ -2840,29 +2848,42 @@ cs:
   users:
     new:
       title: Zaregistrovat se
+      tab_title: Registrace
+      signup_to_authorize_html: Zaregistrujte se pomocí OpenStreetMap pro přístup
+        k %{client_app_name}.
       no_auto_account_create: Bohužel za vás momentálně nejsme schopni vytvořit účet
         automaticky.
       please_contact_support_html: Kontaktujte prosím %{support_link} a domluvte se
         na vytvoření účtu – pokusíme se žádost vyřídit co nejrychleji.
       support: podporu
       about:
-        header: Svobodná a editovatelná
+        header: Svobodná a editovatelná.
         paragraph_1: Na rozdíl od jiných map je OpenStreetMap kompletně vytvořena
           lidmi jako jste vy a kdokoli ji může zdarma opravit, aktualizovat, stáhnout
           a používat.
-        paragraph_2: Zaregistrujte se a začněte přispívat. Zašleme vám e-mail pro
-          potvrzení vašeho účtu.
+        paragraph_2: Zaregistrujte se a začněte přispívat.
+        welcome: Vítejte v OpenStreetMap
+      duplicate_social_email: Pokud již máte účet OpenStreetMap a chcete používat
+        poskytovatele identity třetí strany, přihlaste se pomocí svého hesla a upravte
+        nastavení svého účtu.
       display name description: Vaše veřejně zobrazované uživatelské jméno. Můžete
         si ho později změnit ve svém nastavení.
+      by_signing_up_html: Registrací souhlasíte s našimi %{tou_link}, %{privacy_policy_link}
+        a %{contributor_terms_link}.
+      tou: podmínkami užití
+      contributor_terms: podmínkami pro přispěvatele
       external auth: 'Autentizace třetí stranou:'
       continue: Zaregistrovat se
       terms accepted: Děkujeme za odsouhlasení nových podmínek pro přispěvatele!
       email_help_html: Vaše adresa se nezobrazuje veřejně, více informací získáte
-        v našich %{privacy_policy_link}.
-      privacy_policy: pravidlech ochrany osobních údajů
+        na stránce s našimi %{privacy_policy_link}.
+      privacy_policy: pravidly ochrany osobních údajů
       privacy_policy_title: Pravidla ochrany osobních údajů OSMF, včetně části o e-mailových
         adresách
-      use external auth: Případně se přihlaste prostřednictvím třetí strany
+      consider_pd_html: Své příspěvky považuji za %{consider_pd_link}.
+      consider_pd: volné dílo
+      or: nebo
+      use external auth: nebo se přihlaste prostřednictvím třetí strany
     terms:
       title: Podmínky
       heading: Podmínky
index 4103dbcbada13f0e150b11fb05f0d143314f3464..d48d67a9725309e0cd08b91c487dcbc65460b889 100644 (file)
@@ -72,6 +72,7 @@
 # Author: MarkusHD
 # Author: McDutchie
 # Author: Mcandri13
+# Author: Mcliquid
 # Author: Metalhead64
 # Author: Michi
 # Author: Milet
@@ -776,6 +777,10 @@ de:
       contact_the_community_html: Bitte nimm %{contact_link} mit der OpenStreetMap-Community
         auf, wenn du einen defekten Link / Fehler gefunden hast. Notiere dir die genaue
         URL deiner Anfrage.
+    bad_request:
+      title: Ungültige Anfrage
+      description: Die angeforderte Operation auf dem OpenStreetMap-Server ist ungültig
+        (HTTP 400).
     forbidden:
       title: Verboten
       description: Die von dir angeforderte Aktion auf dem OpenStreetMap-Server ist
@@ -1854,8 +1859,8 @@ de:
           den du kommentiert hattest, reaktivert.'
         commented_note_html: '%{commenter} hat einen Hinweis in der Nähe von %{place},
           den du kommentiert hattest, reaktivert.'
-      details: Weitere Details über den Hinweis findest du unter %{url}.
-      details_html: Weitere Details über den Hinweis findest du unter %{url}.
+      details: Antworte oder erfahre mehr über die Notiz unter %{url}.
+      details_html: Antworte oder erfahre mehr über die Notiz unter %{url}.
     changeset_comment_notification:
       description: 'OpenStreetMap-Änderungssatz #%{id}'
       hi: Hallo %{to_user},
@@ -1876,9 +1881,8 @@ de:
         partial_changeset_with_comment: mit der Bemerkung „%{changeset_comment}“
         partial_changeset_with_comment_html: mit der Bemerkung „%{changeset_comment}“
         partial_changeset_without_comment: ohne Kommentar
-      details: Weitere Details über den Änderungssatz können gefunden werden unter
-        %{url}.
-      details_html: Weitere Details über den Änderungssatz findest Du unter %{url}.
+      details: Antworte oder erfahre mehr über den Änderungssatz unter %{url}.
+      details_html: Antworte oder erfahre mehr über den Änderungssatz unter %{url}.
       unsubscribe: Du kannst dich auf %{url} von den Benachrichtigungen dieses Änderungssatzes
         abmelden.
       unsubscribe_html: Du kannst dich auf %{url} von den Benachrichtigungen dieses
@@ -2059,6 +2063,8 @@ de:
     new:
       title: Anmelden
       tab_title: Anmelden
+      login_to_authorize_html: Melde dich bei OpenStreetMap an, um auf %{client_app_name}
+        zuzugreifen.
       email or username: E-Mail-Adresse oder Benutzername
       password: Passwort
       remember: Anmeldedaten merken
@@ -2739,6 +2745,9 @@ de:
         other: GPX-Datei mit %{count} Punkten von %{user}
       description_without_count: GPX-Datei von %{user}
   application:
+    basic_auth_disabled: 'Die HTTP-Basisauthentifizierung ist deaktiviert: %{link}'
+    oauth_10a_disabled: 'OAuth 1.0 und 1.0a sind deaktiviert: %{link}'
+    auth_disabled_link: https://wiki.openstreetmap.org/wiki/DE:2024_authentication_update
     permission_denied: Du hast keine Berechtigung, um auf diese Aktion zuzugreifen.
     require_cookies:
       cookies_needed: Es scheint als hättest du Cookies ausgeschaltet. Bitte aktiviere
@@ -2827,6 +2836,9 @@ de:
       write_redactions: Kartendaten redigieren
       read_email: Lesen der Benutzer-E-Mail-Adresse
       skip_authorization: Antrag automatisch genehmigen
+    for_roles:
+      moderator: Diese Berechtigung gilt nur für Aktionen, die nur Moderatoren zur
+        Verfügung stehen.
   oauth_clients:
     new:
       title: Eine neue Anwendung registrieren
@@ -2931,18 +2943,21 @@ de:
         erstellen zu lassen - wir werden die Anfrage möglichst schnell bearbeiten.
       support: Support
       about:
-        header: Frei und editierbar
+        header: Frei und editierbar.
         paragraph_1: Im Gegensatz zu anderen Karten wird OpenStreetMap vollständig
           von Leuten wie dir erstellt und kann von jedem kostenlos repariert, aktualisiert,
           heruntergeladen und verwendet werden.
-        paragraph_2: Melde dich an, um mit der Mitarbeit zu beginnen. Wir senden dir
-          eine E-Mail zur Bestätigung deines Kontos.
+        paragraph_2: Registriere dich, um mit deinem Beitrag zu beginnen.
         welcome: Willkommen bei OpenStreetMap
+      duplicate_social_email: Wenn du bereits ein OpenStreetMap-Konto hast und einen
+        Identitätsanbieter eines Drittanbieters verwenden möchtest, melde dich bitte
+        mit deinem Passwort an und ändere die Einstellungen deines Kontos.
       display name description: Dein öffentlich angezeigter Benutzername. Er kann
         später in den Einstellungen geändert werden.
       by_signing_up_html: Mit Ihrer Anmeldung stimmen Sie unseren %{tou_link}, %{privacy_policy_link}
         und %{contributor_terms_link} zu.
       tou: Nutzungsbedingungen
+      contributor_terms: Bedingungen für Mitwirkende
       external auth: 'Drittparteiauthentifikation:'
       continue: Registrieren
       terms accepted: Vielen Dank, dass du den neuen Bedingungen für Mitwirkende zugestimmt
@@ -2952,6 +2967,8 @@ de:
       privacy_policy: Datenschutzrichtlinie
       privacy_policy_title: OSMF-Datenschutzrichtlinie einschließlich Abschnitt zu
         E-Mail-Adressen
+      consider_pd_html: Ich betrachte meine Beiträge als %{consider_pd_link}.
+      consider_pd: gemeinfrei
       or: oder
       use external auth: oder melde dich über einen Drittanbieter an
     terms:
@@ -3315,6 +3332,10 @@ de:
       intro: Fehlt etwas oder hast du einen Fehler gefunden? Bitte verschiebe den
         Marker auf die exakte Position und gib genaue Hinweise/Informationen an bzw.
         beschreibe den Fehler in der Karte möglichst präzise.
+      anonymous_warning_html: Du bist nicht eingeloggt. Bitte %{log_in} oder %{sign_up},
+        wenn du Updates für deine Notiz erhalten möchtest.
+      anonymous_warning_log_in: Anmelden
+      anonymous_warning_sign_up: Registrieren
       advice: Deine Meldung ist öffentlich und kann zur Aktualisierung der Karte verwendet
         werden. Gib deshalb keine persönlichen oder urheberrechtlich geschützten Informationen
         von anderen Karten oder Verzeichnislisten an.
index de3966bf3bd9ac902669334513aba66af1083d82..4a018f7d79f81219979545486db05a1b6eb32bc1 100644 (file)
@@ -149,7 +149,7 @@ diq:
         new_email: E-postay adresiyo neweh
         active: Aktiv
         display_name: Nameyo ke Aseno
-        description: Şınasiya weci
+        description: Şınasiya Profili
         home_lat: 'Verıniye:'
         home_lon: Derganiye
         languages: Zıwanê tercihi
index 148cfe72b8bd9757581a7643f7edbd3450f70078..5ca9b5d5838e047ef93e5c66bcf9dde48fbfab67 100644 (file)
@@ -708,6 +708,8 @@ el:
       contact_the_community_html: Μη διστάσετε να %{contact_link} με την κοινότητα
         του OpenStreetMap εάν έχετε βρει έναν κατεστραμμένο σύνδεσμο / σφάλμα. Σημειώστε
         την ακριβή διεύθυνση URL του αιτήματός σας.
+    bad_request:
+      title: Κακό αίτημα
     forbidden:
       title: Απαγορευμένο
       description: Η λειτουργία που ζητήσατε στο διακομιστή OpenStreetMap είναι διαθέσιμη
@@ -890,7 +892,7 @@ el:
           boardwalk: Πεζοδρόμιο
           suspension: Κρεμαστή γέφυρα
           swing: Αιωρούμενη γέφυρα
-          viaduct: Î\9aοιλαδογέφυρα
+          viaduct: Î\9fδογέφυρα
           "yes": Γέφυρα
         building:
           apartment: Διαμέρισμα
@@ -1233,7 +1235,7 @@ el:
           peninsula: Χερσόνησος
           point: Σημείο
           reef: Ύφαλος
-          ridge: Î£ÎºÏ\8cÏ\80ελοÏ\82
+          ridge: Î\9aοÏ\81Ï\85Ï\86ογÏ\81αμμή
           rock: Βράχος
           saddle: Σέλα
           sand: Άμμος
@@ -1998,7 +2000,8 @@ el:
       lost password link: Ξεχάσατε το συνθηματικό σας;
       login_button: Σύνδεση
       register now: Εγγραφείτε τώρα
-      with external: 'Εναλλακτικά, χρησιμοποιήστε τρίτη υπηρεσία για σύνδεση:'
+      with external: ή συνδεθείτε μέσω τρίτης υπηρεσίας
+      or: ή
       auth failure: Λυπούμαστε, δεν μπορείτε να συνδεθείτε με αυτές τις λεπτομέρειες.
     destroy:
       title: Αποσύνδεση
@@ -2639,6 +2642,7 @@ el:
       muted_users: Χρήστες σε Σίγαση
     auth_providers:
       openid_logo_alt: Σύνδεση με ένα OpenID
+      openid_login_button: Συνέχεια
       openid:
         title: Σύνδεση με OpenID
         alt: Σύνδεση με ένα OpenID URL
@@ -2800,6 +2804,8 @@ el:
   users:
     new:
       title: Εγγραφή
+      tab_title: Εγγραφή
+      signup_to_authorize_html: Εγγραφείτε με το OpenStreetMap για πρόσβαση στο %{client_app_name}.
       no_auto_account_create: Δυστυχώς δεν μπορούμε να δημιουργήσουμε αυτόματα έναν
         λογαριασμό για εσάς.
       please_contact_support_html: Παρακαλώ επικοινωνήστε με %{support_link} για να
@@ -2807,14 +2813,15 @@ el:
         το αίτημα το συντομότερο δυνατό.
       support: υποστήριξη
       about:
-        header: Ελεύθερος και επεξεργάσιμος
+        header: Ελεύθερος και επεξεργάσιμος.
         paragraph_1: Σε αντίθεση με άλλους χάρτες, το OpenStreetMap δημιουργείται
           εξ ολοκλήρου από ανθρώπους σαν εσάς και είναι δωρεάν για οποιονδήποτε να
           το διορθώσει, να ενημερώσει, να το κατεβάσει και να το χρησιμοποιήσει.
-        paragraph_2: Εγγραφείτε για να ξεκινήσετε να συνεισφέρετε. Θα σας στείλουμε
-          ένα email για να επιβεβαιώσουμε τον λογαριασμό σας.
+        paragraph_2: Εγγραφείτε για να ξεκινήσετε να συνεισφέρετε.
+        welcome: Καλώς ήλθατε στο OpenStreetMap
       display name description: Το δημόσια εμφανιζόμενο όνομα χρήστη. Μπορείτε να
         το αλλάξετε αργότερα από τις προτιμήσεις.
+      tou: όροι χρήσης
       external auth: 'Έλεγχος ταυτότητας από τρίτο μέρος:'
       continue: Εγγραφή
       terms accepted: Ευχαριστούμε για την αποδοχή των νέων όρων συνεισφοράς!
@@ -2823,7 +2830,8 @@ el:
       privacy_policy: πολιτική απορρήτου
       privacy_policy_title: Πολιτική απορρήτου OSMF, συμπεριλαμβανομένης της ενότητας
         για τις διευθύνσεις ηλεκτρονικού ταχυδρομείου
-      use external auth: Εναλλακτικά, χρησιμοποιήστε τρίτη υπηρεσία για σύνδεση
+      or: ή
+      use external auth: ή συνδεθείτε μέσω τρίτης υπηρεσίας
     terms:
       title: Όροι
       heading: Όροι
index 774be22d43d9bc530576927814cabd4dc9ae7726..1da263d77337e4ee8bef5d3748f3f60daffa6634 100644 (file)
@@ -472,8 +472,13 @@ en:
       discussion: Discussion
       join_discussion: "Log in to join the discussion"
       still_open: "Changeset still open - discussion will open once the changeset is closed."
+      subscribe: "Subscribe"
+      unsubscribe: "Unsubscribe"
       comment_by_html: "Comment from %{user} %{time_ago}"
       hidden_comment_by_html: "Hidden comment from %{user} %{time_ago}"
+      hide_comment: "hide"
+      unhide_comment: "unhide"
+      comment: "Comment"
       changesetxml: "Changeset XML"
       osmchangexml: "osmChange XML"
     paging_nav:
@@ -543,6 +548,8 @@ en:
       title: "%{user}'s Diary | %{title}"
       user_title: "%{user}'s Diary"
       discussion: "Discussion"
+      subscribe: "Subscribe"
+      unsubscribe: "Unsubscribe"
       leave_a_comment: "Leave a comment"
       login_to_leave_a_comment_html: "%{login_link} to leave a comment"
       login: "Log in"
@@ -633,6 +640,9 @@ en:
       contact_url_title: Various contact channels explained
       contact: contact
       contact_the_community_html: Feel free to %{contact_link} the OpenStreetMap community if you have found a broken link / bug. Make a note of the exact URL of your request.
+    bad_request:
+      title: Bad request
+      description: The operation you requested on the OpenStreetMap server is not valid (HTTP 400)
     forbidden:
       title: Forbidden
       description: The operation you requested on the OpenStreetMap server is only available to administrators (HTTP 403)
@@ -1670,8 +1680,8 @@ en:
         your_note_html: "%{commenter} has reactivated one of your map notes near %{place}."
         commented_note: "%{commenter} has reactivated a map note you have commented on. The note is near %{place}."
         commented_note_html: "%{commenter} has reactivated a map note you have commented on. The note is near %{place}."
-      details: "More details about the note can be found at %{url}."
-      details_html: "More details about the note can be found at %{url}."
+      details: "Reply or learn more about the note at %{url}."
+      details_html: "Reply or learn more about the note at %{url}."
     changeset_comment_notification:
       description: "OpenStreetMap Changeset #%{id}"
       hi: "Hi %{to_user},"
@@ -1686,8 +1696,8 @@ en:
         partial_changeset_with_comment: "with comment '%{changeset_comment}'"
         partial_changeset_with_comment_html: "with comment '%{changeset_comment}'"
         partial_changeset_without_comment: "without comment"
-      details: "More details about the changeset can be found at %{url}."
-      details_html: "More details about the changeset can be found at %{url}."
+      details: "Reply or learn more about the changeset at %{url}."
+      details_html: "Reply or learn more about the changeset at %{url}."
       unsubscribe: "You can unsubscribe from updates to this changeset at %{url}."
       unsubscribe_html: "You can unsubscribe from updates to this changeset at %{url}."
   confirmations:
@@ -2557,6 +2567,9 @@ en:
         other: "GPX file with %{count} points from %{user}"
       description_without_count: "GPX file from %{user}"
   application:
+    basic_auth_disabled: "HTTP Basic Authentication is disabled: %{link}"
+    oauth_10a_disabled: "OAuth 1.0 and 1.0a are disabled: %{link}"
+    auth_disabled_link: "https://wiki.openstreetmap.org/wiki/2024_authentication_update"
     permission_denied: You do not have permission to access that action
     require_cookies:
       cookies_needed: "You appear to have cookies disabled - please enable cookies in your browser before continuing."
@@ -2815,6 +2828,8 @@ en:
       remove as friend: Unfriend
       add as friend: Add Friend
       mapper since: "Mapper since:"
+      last map edit: "Last map edit:"
+      no activity yet: "No activity yet"
       uid: "User id:"
       ct status: "Contributor terms:"
       ct undecided: Undecided
@@ -3163,13 +3178,6 @@ en:
       queryfeature_tooltip: Query features
       queryfeature_disabled_tooltip: Zoom in to query features
       embed_html_disabled: HTML embedding is not available for this map layer
-    changesets:
-      show:
-        comment: "Comment"
-        subscribe: "Subscribe"
-        unsubscribe: "Unsubscribe"
-        hide_comment: "hide"
-        unhide_comment: "unhide"
     edit_help: Move the map and zoom in on a location you want to edit, then click here.
     directions:
       ascend: "Ascend"
index cb500f71fc1867ce479654c494f8bd89b2cf1377..b2d676c9abf58fc01d0232056b8084748439417d 100644 (file)
@@ -675,6 +675,10 @@ eo:
       contact_the_community_html: '%{contact_link} kun la OpenStreetMap-komunumo,
         se vi trovis misligilon aŭ alian eraron. Skribu la detalan retadreson de via
         peto.'
+    bad_request:
+      title: Malĝusta peto
+      description: La ago – pri kiu vi petis la servilon OpenStreetMap – ne estas
+        valida (HTTP 400)
     forbidden:
       title: Malpermesata
       description: La ago, pri kiu vi petis la OpenStreetMap-servilon estas disponebla
@@ -1733,8 +1737,8 @@ eo:
           La rimarko troviĝis ĉe %{place}.'
         commented_note_html: '%{commenter} remalfermis rimarkon sur la mapo pri kiu
           vi interesiĝis. La rimarko troviĝis ĉe %{place}.'
-      details: Pli da detaloj pri la rimarko, vi povas trovi je %{url}.
-      details_html: Pli da detaloj pri la noto troveblas ĉe %{url}.
+      details: Vi povas respondi aŭ sciiĝi pli pri la rimarko ĉe %{url}.
+      details_html: Vi povas respondi aŭ sciiĝi pli pri la rimarko ĉe %{url}.
     changeset_comment_notification:
       description: 'OpenStreetMap: ŝanĝaro %{id}'
       hi: Saluton %{to_user},
@@ -1752,8 +1756,8 @@ eo:
         partial_changeset_with_comment: kun komento '%{changeset_comment}'
         partial_changeset_with_comment_html: kun komento '%{changeset_comment}'
         partial_changeset_without_comment: sen komento
-      details: Pli da detaloj pri la ŝanĝaro povas esti trovita ĉe %{url}.
-      details_html: Pli da detaloj pri la ŝanĝaro povas esti trovita ĉe %{url}.
+      details: Vi povas respondi aŭ sciiĝi pli pri la ŝanĝaro ĉe %{url}.
+      details_html: Vi povas respondi aŭ sciiĝi pli pri la ŝanĝaro ĉe %{url}.
       unsubscribe: Vi povas malaboni ĝisdatigojn pri tiu ĉi ŝanĝaro ĉe %{url}.
       unsubscribe_html: Vi povas malaboni ĝisdatigojn pri tiu ĉi ŝanĝaro ĉe %{url}.
   confirmations:
@@ -1865,7 +1869,7 @@ eo:
   passwords:
     new:
       title: Perdita pasvorto
-      heading: Forgesis vian pasvorton ?
+      heading: Ĉu vi forgesis pasvorton?
       email address: Retpoŝta adreso
       new password button: Nuligi pasvorton
       help_text: Entajpu la retpoŝtan adreson kiun vi uzis por ensaluto, ni sendos
@@ -1932,7 +1936,7 @@ eo:
       lost password link: Ĉu vi forgesis vian pasvorton?
       login_button: Ensaluti
       register now: Registriĝi
-      with external: aŭ ensalutu uzante eksteran liveranton
+      with external: 'ensaluti per ekstera liveranto:'
       or: aŭ
       auth failure: Bedaŭrinde ne povas ensaluti kun ĉi tiuj informoj.
     destroy:
@@ -2566,6 +2570,8 @@ eo:
         other: GPX-dosiero kun %{count} punktoj de %{user}
       description_without_count: GPX-dosiero de %{user}
   application:
+    basic_auth_disabled: 'Baza alira aŭtentigo estas malaktiva: %{link}'
+    oauth_10a_disabled: 'OAuth 1.0 kaj 1.0a estas malaktivaj: %{link}'
     permission_denied: Vi ne rajtas fari tiun ĉi agon
     require_cookies:
       cookies_needed: Ŝajnas, ke vi malaktivigis 'kuketojn' - bonvolu aktivigi 'kuketojn'
@@ -2782,7 +2788,7 @@ eo:
       consider_pd_html: Mi konsideras ke miaj kontribuoj estu eldonitaj en la %{consider_pd_link}.
       consider_pd: publika havaĵo
       or: aŭ
-      use external auth: aŭ registriĝu uzante eksteran liveranton
+      use external auth: 'registriĝi per ekstera liveranto:'
     terms:
       title: Kondiĉoj
       heading: Kondiĉoj
@@ -3120,6 +3126,10 @@ eo:
       intro: Ĉu vi rimarkis eraron aŭ io mankas? Sciigu aliajn mapigistojn, por ili
         povos ripari tion. Movu la markon al la respektivan pozicion kaj enmetu la
         rimarkon priskribantan la problemon.
+      anonymous_warning_html: Vi ne estas ensalutinta. %{log_in} aŭ %{sign_up} por
+        ricevi sciigojn pri via rimarko.
+      anonymous_warning_log_in: Ensalutu
+      anonymous_warning_sign_up: registriĝu
       advice: Via rimarko estas publika kaj povas esti uzita por ĝisdatigi la mapon,
         do ne enmetu privatajn informojn kaj informojn el kopirajtaj mapoj aŭ aliaj
         datumbazoj.
index 0c3b1427cc614ef55eb2f673fb980dc2427c31d4..3ab6a2a2dcdd67527113844becd1124e9739300f 100644 (file)
@@ -108,7 +108,7 @@ et:
       diary_entry:
         user: Kasutaja
         title: Teema
-        body: Päevikusissekanne
+        body: Kehatekst
         latitude: Laius
         longitude: Pikkus
         language_code: Keel
@@ -1662,8 +1662,8 @@ et:
           Märkus on koha %{place} lähedal.'
         commented_note_html: '%{commenter} on taasaktiveerinud märkuse, mida oled
           kommenteerinud. Märkus on koha %{place} lähedal.'
-      details: Üksikasjad märkuse kohta leiad aadressilt %{url}.
-      details_html: Üksikasjad märkuse kohta leiad aadressilt %{url}.
+      details: Vasta või loe veel märkuse kohta aadressil %{url}.
+      details_html: Vasta või loe veel märkuse kohta aadressil %{url}.
     changeset_comment_notification:
       description: 'OpenStreetMapi muudatuskogum #%{id}'
       hi: Tere, %{to_user}
@@ -1682,8 +1682,8 @@ et:
         partial_changeset_with_comment: kommentaariga '%{changeset_comment}'.
         partial_changeset_with_comment_html: kommentaariga '%{changeset_comment}'.
         partial_changeset_without_comment: ilma kommentaarita.
-      details: Üksikasjad muudatuskogumi kohta leiad aadressilt %{url}.
-      details_html: Üksikasjad muudatuskogumi kohta leiad aadressilt %{url}.
+      details: Vasta või loe muudatuskogumi kohta veel aadressil %{url}.
+      details_html: Vasta või loe muudatuskogumi kohta veel aadressil %{url}.
       unsubscribe: Saad muudatuskogumi uuendusteadetest ära ütelda aadressil %{url}.
       unsubscribe_html: Saad muudatuskogumi uuendusteadetest ära ütelda aadressil
         %{url}.
@@ -1859,7 +1859,7 @@ et:
       lost password link: Kas unustasid parooli?
       login_button: Logi sisse
       register now: Registreeru nüüd
-      with external: 'Teise võimalusena võid sisse logida kolmanda osapoole kaudu:'
+      with external: või logi sisse kolmanda osapoole kaudu
       auth failure: Kahjuks ei õnnestu nende andmetega sisse logida.
     destroy:
       title: Logi välja
@@ -2653,6 +2653,7 @@ et:
       title: Minu volitatud rakendused
       application: Rakendus
       permissions: Õigused
+      last_authorized: Viimati volitatud
       no_applications_html: Sa pole volitanud veel ühtegi %{oauth2} rakendust.
     application:
       revoke: Eemalda juurdepääs
@@ -2660,27 +2661,33 @@ et:
   users:
     new:
       title: Registreerumine
+      tab_title: Registreeru
       no_auto_account_create: Kahjuks ei ole meil võimalik luua hetkel sinu jaoks
         automaatselt kontot.
       please_contact_support_html: Palun võta ühendust %{support_link}, et kasutajakonto
         luua. Üritame tegeleda selle taotlusega nii kiiresti kui võimalik.
       support: toega
       about:
-        header: Vaba ja muudetav
+        header: Vaba ja muudetav.
         paragraph_1: Erinevalt teistest kaartidest on kogu OpenStreetMapi loonud sinusugused
           inimesed ja igaüks võib seda parandada, täiendada, alla laadida ja kasutada.
-        paragraph_2: Registreeru, et alustada kaardi täiendamist. Saadame sulle e-kirja,
-          et saaksid kinnitada enda kasutajakonto.
+        paragraph_2: Registreeru, et alustada kaardi täiendamist.
       display name description: Avalikult kuvatud kasutajanimi. Seda saate muuta hiljem
         eelistustes.
+      by_signing_up_html: Registreerudes nõustud meie %{tou_link}, %{privacy_policy_link}
+        ja %{contributor_terms_link}.
+      tou: kasutustingimustega
+      contributor_terms: kaastöötingimustega
       external auth: 'Kolmanda osapoole autentimine:'
       continue: Registreeru
       terms accepted: Täname, et nõustusid uute kaastöötingimustega!
-      email_help_html: Sinu aadressi ei kuvata avalikult, loe täpsemalt meie %{privacy_policy_link}.
-      privacy_policy: andmekaitsereeglitest
+      email_help_html: Sinu aadressi ei kuvata avalikult, tutvu meie %{privacy_policy_link}.
+      privacy_policy: andmekaitsereeglitega
       privacy_policy_title: OSMF-i andmekaitsereeglid, milles on alaosa e-posti aadresside
         kohta
-      use external auth: Teise võimalusena võid sisse logida kolmanda osapoole kaudu
+      consider_pd_html: Pean enda kaastööd %{consider_pd_link} kuuluvaks.
+      consider_pd: avalikku omandisse
+      use external auth: või registreeru kolmanda osapoole kaudu
     terms:
       title: Tingimused
       heading: Tingimused
@@ -2856,8 +2863,8 @@ et:
         andis.
       success: Blokeering uuendatud.
     index:
-      title: Kasutaja blokeeringud
-      heading: Kasutaja blokeeringute loetelu
+      title: Kasutajate blokeeringud
+      heading: Kasutajate blokeeringute loetelu
       empty: Ühtegi blokeeringut pole veel antud.
     revoke:
       title: Kasutaja %{block_on} blokeeringu eemaldamine
@@ -3001,6 +3008,10 @@ et:
       intro: Kas märkasid viga või midagi, mis vajab täiendamist? Anna sellest teistele
         kaardistajatele teada, et nad saaksid seda parandada. Lohista marker õigele
         kohale ja kirjuta märkus, et probleemi selgitada.
+      anonymous_warning_html: Sa pole sisse logitud. Palun %{log_in} või %{sign_up},
+        kui soovid saada enda märkuse kohta uuendusi.
+      anonymous_warning_log_in: logi sisse
+      anonymous_warning_sign_up: registreeru
       advice: Märkus on avalik ja seda võidakse kasutada kaardi uuendamiseks. Seega
         palun ära kirjuta siia isiklikku teavet ega teavet autoriõigustega kaitstud
         kaartidelt ega kataloogiloenditest.
@@ -3105,24 +3116,24 @@ et:
         continue_without_exit: 'Liigu edasi teele: %{name}'
         slight_right_without_exit: 'Pööra kergelt paremal pool asuvale teele: %{name}'
         offramp_right: Sõida paremal asuvale kaldteele
-        offramp_right_with_exit: Lahku teelt paremal asuva ärapöörde %{exit} kaudu
-        offramp_right_with_exit_name: 'Lahku teelt paremal asuva ärapöörde %{exit}
-          kaudu sõites teele: %{name}'
-        offramp_right_with_exit_directions: 'Lahku teelt paremal asuva ärapöörde %{exit}
-          kaudu võttes suunaks: %{directions}'
-        offramp_right_with_exit_name_directions: 'Lahku teelt paremal asuva ärapöörde
-          %{exit} kaudu sõites teele: %{name} suunaga %{directions} poole'
+        offramp_right_with_exit: Lahku teelt %{exit}. väljumise kaudu paremal
+        offramp_right_with_exit_name: 'Lahku paremalt %{exit}. väljumise kaudu sõites
+          teele: %{name}'
+        offramp_right_with_exit_directions: Lahku paremalt %{exit}. väljumise kaudu,
+          sõites tee %{directions} suunas
+        offramp_right_with_exit_name_directions: Lahku paremalt %{exit}. väljumise
+          kaudu sõites teele %{name} tee %{directions} suunas
         offramp_right_with_name: 'Pööra paremal asuvalt kaldteelt teele: %{name}'
-        offramp_right_with_directions: Pööra paremal asuvale kaldteele suunaga %{directions}
-          poole
+        offramp_right_with_directions: Pööra paremal asuvale kaldteele, liikudes tee
+          %{directions} suunas
         offramp_right_with_name_directions: 'Pööra paremal asuvale kaldteele: uus
           tee on %{name} ja suunaks %{directions}'
         onramp_right_without_exit: 'Pööra paremale ja sõida kaldteed mööda teele:
           %{name}'
-        onramp_right_with_directions: Pööra paremale ja sõida kaldteelt %{directions}
+        onramp_right_with_directions: Pööra paremale ja sõida kaldteelt tee %{directions}
           suunas
-        onramp_right_with_name_directions: Pööra paremal asuvale kaldteele %{name}
-          poole, suunaks %{directions}
+        onramp_right_with_name_directions: Pööra paremal asuvalt kaldteelt teele %{name},
+          sõites tee %{directions} suunas
         onramp_right_without_directions: Sõida paremal asuvale kaldteele
         onramp_right: Sõida paremal asuvale kaldteele
         endofroad_right_without_exit: 'Tee lõpus pööra paremale teele: %{name}'
@@ -3134,20 +3145,20 @@ et:
         sharp_left_without_exit: 'Pööra järsult vasakul pool asuvale teele: %{name}'
         turn_left_without_exit: 'Pööra vasakul pool asuvale teele: %{name}'
         offramp_left: Sõida vasakul asuvale kaldteele
-        offramp_left_with_exit: Lahku teelt vasakul asuva ärapöörde %{exit} kaudu
-        offramp_left_with_exit_name: 'Lahku teelt vasakul asuva ärapöörde %{exit}
-          kaudu sõites teele: %{name}'
-        offramp_left_with_exit_directions: 'Lahku teelt vasakul asuva ärapöörde %{exit}
-          kaudu võttes suunaks: %{directions}'
-        offramp_left_with_exit_name_directions: 'Lahku teelt vasakul asuva ärapöörde
-          %{exit} kaudu sõites teele: %{name} suunaga %{directions} poole'
+        offramp_left_with_exit: Lahku vasakult %{exit}. väljumise kaudu
+        offramp_left_with_exit_name: 'Lahku vasakult %{exit}. väljumise kaudu sõites
+          teele: %{name}'
+        offramp_left_with_exit_directions: Lahku vasakult %{exit}. väljumise kaudu,
+          sõites tee %{directions} suunas
+        offramp_left_with_exit_name_directions: Lahku vasakult %{exit}. väljumise
+          kaudu sõites teele %{name} tee %{directions} suunas
         offramp_left_with_name: 'Pööra vasakul asuvalt kaldteelt teele: %{name}'
-        offramp_left_with_directions: Pööra vasakul asuvale kaldteele suunaga %{directions}
-          poole
+        offramp_left_with_directions: Pööra vasakul asuvale kaldteele, liikudes tee
+          %{directions} suunas
         offramp_left_with_name_directions: 'Pööra vasakul asuvale kaldteele: uus tee
           on %{name} ja suunaks %{directions}'
         onramp_left_without_exit: 'Pööra vasakule ja sõida kaldteed mööda teele: %{name}'
-        onramp_left_with_directions: Pööra vasakule ja sõida kaldteelt %{directions}
+        onramp_left_with_directions: Pööra vasakule ja sõida kaldteelt tee %{directions}
           suunas
         onramp_left_with_name_directions: 'Pööra vaskul asuvale kaldteele: uus tee
           on %{name} ja suunaks %{directions}'
@@ -3159,7 +3170,7 @@ et:
         slight_left_without_exit: 'Pööra kergelt vasakule teele: %{name}'
         via_point_without_exit: (teekonnapunkti kaudu)
         follow_without_exit: 'Sõida edasi mööda teed: %{name}'
-        roundabout_without_exit: 'Pööra ringteelt järgnevale teele: %{name}'
+        roundabout_without_exit: 'Pööra ringteelt järgmisele teele: %{name}'
         leave_roundabout_without_exit: Pööra ära ringteelt - %{name}
         stay_roundabout_without_exit: Jätka sõitmist ringteel - %{name}
         start_without_exit: 'Alusta teelt: %{name}'
index 7268c13e7e8465184050bb7a520fe27d504f64bb..c1e66950c2c8ca81a5b262ef16a93b25e107a6ff 100644 (file)
@@ -2552,17 +2552,26 @@ fi:
   users:
     new:
       title: Rekisteröidy
+      tab_title: Rekisteröidy
       no_auto_account_create: Automaattinen käyttäjätunnuksen luonti ei ole juuri
         nyt käytössä.
       support: tuki
       about:
         header: Muokkaa vapaasti
+        paragraph_1: Toisin kuin muut karttapalvelut, OpenStreetMap on täysin tavallisten
+          ihmisten luoma. Kuka tahansa voi korjata, päivittää, ladata ja käyttää sitä
+          ilmaiseksi.
+        paragraph_2: Osallistu projektiin luomalla käyttäjätunnus.
       display name description: Julkisesti näkyvä käyttäjänimi. Tätä voi myöhemmin
         muuttaa asetuksista.
+      by_signing_up_html: Rekisteröitymällä hyväksyt %{tou_link}, %{privacy_policy_link}
+        ja %{contributor_terms_link}.
       external auth: 'Kolmannen osapuolen todennus:'
       continue: Rekisteröidy
       terms accepted: Kiitos uusien osallistujaehtojen hyväksymisestä!
+      email_help_html: Osoitetta ei näytetä julkisesti, lisätietoja on sivulla %{privacy_policy_link}.
       privacy_policy: tietosuojakäytäntö
+      consider_pd_html: Pidän tuotoksiani %{consider_pd_link}.
       use external auth: Kirjaudu toisen palvelun tunnuksilla
     terms:
       title: Ehdot
@@ -2853,6 +2862,7 @@ fi:
       intro: Huomasitko virheen tai puuttuvan kohteen? Ilmoita siitä muille kartoittajille,
         jolloin virhe voidaan korjata. Siirrä merkkipiste oikeaan kohtaan ja kirjoita
         selite ongelmasta.
+      anonymous_warning_sign_up: rekisteröidy
       advice: Merkintä näkyy julkisesti kaikille, älä kirjoita henkilökohtaisia tietoja.
         Aineistoa kehitetään palautteen perusteella, minkä takia älä käytä lähteenä
         muita karttoja tai hakemistoja.
index da9281e0d215dad78daf74aeb7d7f361e6d39394..eaff896dd0697af2418e4103c913cdd80b39af40 100644 (file)
@@ -38,6 +38,7 @@
 # Author: GeorgeKaplan
 # Author: Gileri
 # Author: Gomoko
+# Author: Graineahumus
 # Author: Gravitystorm
 # Author: Guilhelma
 # Author: Hashar
@@ -75,6 +76,7 @@
 # Author: Orikrin1998
 # Author: Otourly
 # Author: Oupsa
+# Author: Overflorian
 # Author: Peter17
 # Author: Phoenamandre
 # Author: Pipo
@@ -245,7 +247,7 @@ fr:
         auth_provider: Fournisseur d’authentification
         auth_uid: UID d’authentification
         email: Courriel
-        new_email: Nouvelle adresse de courriel
+        new_email: Nouvelle adresse email
         active: Actif
         display_name: Afficher le nom
         description: Description du profil
@@ -457,6 +459,7 @@ fr:
     view_unredacted_history: Voir l'historique non censuré
     view_details: Afficher les détails
     view_redacted_data: Afficher les données censurées
+    view_redaction_message: Afficher le message de rédaction
     location: 'Emplacement :'
     common_details:
       coordinates_html: '%{latitude} ; %{longitude}'
@@ -583,6 +586,7 @@ fr:
         closed: Fermé
         belongs_to: Auteur
     subscribe:
+      heading: S'abonner à la discussion sur l'ensemble de modifications suivante ?
       button: S'abonner à la discussion
     unsubscribe:
       heading: Se désabonner de la discussion du groupe de modifications suivant ?
@@ -591,6 +595,7 @@ fr:
       title: Groupe de modifications %{id}
       created_by_html: Créé par %{link_user} le %{created}.
     no_such_entry:
+      title: Aucun ensemble de modifications de ce type
       heading: 'Aucune entrée avec l’identifiant : %{id}'
       body: Désolé, il n’y a aucun groupe de modifications avec l'identifiant %{id}.
         Veuillez vérifier l'orthographe ou la validité du lien sur lequel vous avez
@@ -740,8 +745,10 @@ fr:
       newer_comments: Commentaires plus récents
       older_comments: Commentaires plus anciens
     subscribe:
+      heading: S'abonner à la discussion suivante sur les entrées de journal ?
       button: S'abonner à la discussion
     unsubscribe:
+      heading: Se désinscrire de la discussion suivante sur les entrées du journal ?
       button: Se désinscrire de la discussion
   doorkeeper:
     errors:
@@ -785,6 +792,10 @@ fr:
       contact_the_community_html: N’hésitez pas à %{contact_link} la communauté OpenStreetMap
         si vous avez trouvé un lien cassé ou une anomalie. Notez l’URL exacte de votre
         demande.
+    bad_request:
+      title: Mauvaise requête
+      description: L'opération que vous avez demandée sur le serveur OpenStreetMap
+        n'est pas valide (HTTP 400)
     forbidden:
       title: Interdit
       description: L’opération que vous avez demandée sur le serveur OpenStreetMap
@@ -1725,6 +1736,7 @@ fr:
     hosting_partners_2024_html: L’hébergement est pris en charge par %{fastly}, %{corpmembers},
       et d’autres %{partners}.
     partners_fastly: Fastly
+    partners_corpmembers: Membres d'entreprise de l'OSMF
     partners_partners: partenaires
     tou: Conditions d’utilisation
     osm_offline: La base de données OpenStreetMap est actuellement hors ligne ; une
@@ -1746,6 +1758,7 @@ fr:
     more: Plus
   user_mailer:
     diary_comment_notification:
+      description: 'Entrée du journal OpenStreetMap #%{id}'
       subject: '[OpenStreetMap] %{user} a publié un commentaire sur un article de
         journal'
       hi: Bonjour %{to_user},
@@ -1860,8 +1873,8 @@ fr:
           La note se trouve près de %{place}.'
         commented_note_html: '%{commenter} a réactivé une note de carte que vous avez
           commentée. La note est près de %{place}.'
-      details: Plus de détails concernant la note se trouvent à %{url}.
-      details_html: Plus de détails concernant la note se trouvent à %{url}.
+      details: Répondez ou apprenez-en plus sur la note sur %{url}.
+      details_html: Répondez ou en savoir plus sur la note sur %{url}.
     changeset_comment_notification:
       description: 'Groupe de modifications OpenStreetMap #%{id}'
       hi: Bonjour %{to_user},
@@ -1882,9 +1895,8 @@ fr:
         partial_changeset_with_comment: avec le commentaire « %{changeset_comment} »
         partial_changeset_with_comment_html: avec le commentaire « %{changeset_comment} »
         partial_changeset_without_comment: sans commentaire
-      details: Plus de détails sur l’ensemble de modifications à %{url}.
-      details_html: Vous pouvez trouver plus de détails sur l’ensemble de modifications
-        sur %{url}.
+      details: Répondez ou en savoir plus sur l'ensemble de changements sur %{url}.
+      details_html: Répondre ou en savoir plus sur l'ensemble de changements sur %{url}.
       unsubscribe: Vous pouvez vous désabonner des mises à jour de cet ensemble de
         modifications depuis %{url}.
       unsubscribe_html: Vous pouvez vous désabonner des mises à jour de cet ensemble
@@ -1983,9 +1995,9 @@ fr:
       unread_button: Marque comme non lu
       destroy_button: Supprimer
       back: Retour
-      wrong_user: Vous êtes identifié comme « %{user} » mais le message que vous essayez
-        de lire n’a pas été envoyé par cet utilisateur, ni ne lui a été destiné. Veuillez
-        vous connecter avec l’identifiant correct pour pouvoir le lire.
+      wrong_user: Vous êtes identifié comme « %{user} » mais le message que vous avez
+        demandé de lire n’a pas été envoyé par cet utilisateur, ni ne lui a été destiné.
+        Veuillez vous connecter avec le bon identifiant pour pouvoir le lire.
     sent_message_summary:
       destroy_button: Supprimer
     heading:
@@ -2067,6 +2079,7 @@ fr:
     new:
       title: Se connecter
       tab_title: Se connecter
+      login_to_authorize_html: Connectez-vous à OpenStreetMap pour accéder à %{client_app_name}.
       email or username: 'Adresse de courriel ou nom d’utilisateur :'
       password: 'Mot de passe :'
       remember: Se souvenir de moi
@@ -2266,7 +2279,12 @@ fr:
           générale des finances publiques (anciennement la Direction générale des
           impôts).'
         contributors_fr_france: France
+        contributors_hr_credit_html: |-
+          %{croatia} : contient des données de %{dgu_link} et %{open_data_portal}
+          (informations publiques de Croatie).
         contributors_hr_croatia: Croatie
+        contributors_hr_dgu: Administration géodésique de l'État de Croatie
+        contributors_hr_open_data_portal: Portail national des données ouvertes
         contributors_nl_credit_html: '%{netherlands} : contient des données © AND,
           2007 (%{and_link})'
         contributors_nl_netherlands: Pays-Bas
@@ -2719,6 +2737,8 @@ fr:
       identifiable: IDENTIFIABLE
       private: PRIVÉE
       trackable: PISTABLE
+      details_with_tags_html: '%{time_ago} par %{user} dans %{tags}'
+      details_without_tags_html: '%{time_ago} par %{user}'
     index:
       public_traces: Traces GPS publiques
       my_gps_traces: Mes traces GPS
@@ -2754,6 +2774,8 @@ fr:
         other: Fichier GPX avec %{count} points de %{user}
       description_without_count: Fichier GPX de %{user}
   application:
+    basic_auth_disabled: 'L''authentification HTTP de base est désactivée : %{link}'
+    oauth_10a_disabled: 'OAuth 1.0 et 1.0a sont désactivés : %{link}'
     permission_denied: Vous n’avez pas le droit d’accéder à cette action
     require_cookies:
       cookies_needed: Il semble que les témoins (cookies) soient désactivés dans votre
@@ -2776,30 +2798,31 @@ fr:
       muted_users: Utilisateurs silencieux
     auth_providers:
       openid_logo_alt: Se connecter avec OpenID
+      openid_login_button: Continuer
       openid:
         title: Connexion avec OpenID
         alt: Se connecter avec une URL OpenID
       google:
-        title: Connexion avec Google
+        title: Se connecter avec Google
         alt: Se connecter avec un OpenID de Google
       facebook:
-        title: Connexion avec Facebook
+        title: Se connecter avec Facebook
         alt: Se connecter avec un compte de Facebook
       microsoft:
-        title: Connexion avec Microsoft
+        title: Se connecter avec Microsoft
         alt: Se connecter avec un compte Microsoft
       github:
-        title: Connexion avec GitHub
-        alt: Se connecter avec un compte de GitHub
+        title: Se connecter avec GitHub
+        alt: Se connecter avec un compte GitHub
       wikipedia:
-        title: Connexion avec Wikipédia
-        alt: Se connecter avec un compte de Wikipédia
+        title: Se connecter avec Wikipédia
+        alt: Se connecter avec un compte Wikipédia
       wordpress:
-        title: Connexion avec Wordpress
+        title: Se connecter avec Wordpress
         alt: Se connecter avec un OpenID de Wordpress
       aol:
-        title: Connexion avec AOL
-        alt: Se connecter avec un OpenID d’AOL
+        title: Se connecter avec AOL
+        alt: Se connecter avec un OpenID AOL
   oauth:
     authorize:
       title: Autoriser l’accès à votre compte
@@ -2843,6 +2866,9 @@ fr:
       write_redactions: Caviarder les données cartographiques
       read_email: Lire l’adresse courriel de l’utilisateur
       skip_authorization: Demande d’approbation automatique
+    for_roles:
+      moderator: Cette autorisation concerne les actions disponibles uniquement pour
+        les modérateurs
   oauth_clients:
     new:
       title: Inscrire une nouvelle application
@@ -2939,6 +2965,8 @@ fr:
   users:
     new:
       title: S’inscrire
+      tab_title: Créer un compte
+      signup_to_authorize_html: Se connecter à OpenStreetMap pour accéder à %{client_app_name}.
       no_auto_account_create: Malheureusement, nous ne sommes actuellement pas en
         mesure de vous créer un compte automatiquement.
       please_contact_support_html: Veuillez contacter %{support_link} pour organiser
@@ -2950,10 +2978,17 @@ fr:
         paragraph_1: Contrairement à d’autres cartes, OpenStreetMap est entièrement
           créé par des personnes comme vous et il permet à quiconque de librement
           la réparer, la mettre à jour, la télécharger et l’utiliser.
-        paragraph_2: Inscrivez-vous pour commencer à contribuer. Nous vous enverrons
-          un courriel pour confirmer votre compte.
+        paragraph_2: Se connecter pour commencer à contribuer.
+        welcome: Bienvenue dans OpenStreetMap
+      duplicate_social_email: Si vous possédez déjà un compte OpenStreetMap et souhaitez
+        utiliser un fournisseur d'identité tiers, veuillez vous connecter en utilisant
+        votre mot de passe et modifier les paramètres de votre compte.
       display name description: Votre nom d’utilisateur affiché publiquement. Vous
         pouvez changer ceci ultérieurement dans les préférences.
+      by_signing_up_html: En vous inscrivant, vous acceptez nos %{tou_link}, %{privacy_policy_link}
+        et %{contributor_terms_link}.
+      tou: conditions d'utilisation
+      contributor_terms: Conditions de contribution
       external auth: 'Authentification tierce :'
       continue: S’inscrire
       terms accepted: Merci d’avoir accepté les nouveaux termes du contributeur !
@@ -2962,8 +2997,10 @@ fr:
       privacy_policy: politique de confidentialité
       privacy_policy_title: Politique de confidentialité de l’OSMF, qui comprend une
         section sur les adresses de courriel
-      use external auth: Vous pouvez également utiliser un service tiers pour vous
-        connecter.
+      consider_pd_html: Je considère que mes contributions se situent dans le %{consider_pd_link}.
+      consider_pd: domaine public
+      or: ou
+      use external auth: ou vous pouvez vous connecter avec un service tiers.
     terms:
       title: Conditions
       heading: Conditions
@@ -3074,6 +3111,9 @@ fr:
       heading: Utilisateurs
       older: Utilisateurs plus anciens
       newer: Utilisateurs plus récents
+      found_users:
+        one: '%{count} utilisateur trouvé'
+        other: '%{count} utilisateurs trouvés'
       summary_html: '%{name} créé depuis %{ip_address} le %{date}'
       summary_no_ip_html: '%{name} créé le %{date}'
       confirm: Confirmer les utilisateurs sélectionnés
@@ -3098,9 +3138,9 @@ fr:
       heading: Votre identifiant n’est pas encore associé à un compte OpenStreetMap.
       option_1: Si vous êtes nouveau sur OpenStreetMap, veuillez créer un nouveau
         compte à l’aide du formulaire ci-dessous.
-      option_2: Si vous avez déjà un compte, vous pouvez vous connecter avec en utilisant
-        votre nom d’utilisateur et votre mot de passe, puis associer le compte avec
-        votre ID dans vos préférences utilisateur.
+      option_2: Si vous avez déjà un compte, vous pouvez vous y connecter avec en
+        utilisant votre nom d’utilisateur et votre mot de passe, puis associer le
+        compte avec votre ID dans vos préférences utilisateur.
   user_role:
     filter:
       not_a_role: La chaîne « %{role} » n’est pas un rôle valide.
@@ -3231,6 +3271,8 @@ fr:
       reason: Motif du blocage
       status: État
       revoker_name: Révoqué par
+      older: Blocs plus anciens
+      newer: Blocs plus récents
     navigation:
       all_blocks: Tous les blocages
       blocks_on_me: Blocages me concernant
@@ -3312,6 +3354,10 @@ fr:
       intro: Vous avez repéré une erreur ou un manque ? Faites-le savoir aux autres
         cartographes afin qu’ils puissent y remédier. Déplacez le marqueur à la position
         exacte et écrivez une note pour expliquer le problème.
+      anonymous_warning_html: Vous n'êtes pas connecté. Veuillez %{log_in} ou %{sign_up}
+        si vous souhaitez recevoir des mises à jour pour votre note.
+      anonymous_warning_log_in: se connecter
+      anonymous_warning_sign_up: créer un compte
       advice: Votre note est publique et peut être utilisée pour mettre à jour la
         carte, aussi n’entrez aucune information personnelle, ni aucune information
         venant de cartes protégées, ni aucune entrée de répertoire ou d’annuaire.
index 761edf335b314cd4470f3751e0e468f8084dc331..d0258b35673e05d8491a978bd6e97c4e3cb725e3 100644 (file)
@@ -685,6 +685,10 @@ gl:
       contact_the_community_html: Non dubides en %{contact_link} coa comunidade do
         OpenStreetMap se atopaches un erro ou unha ligazón rota. Anota o enderezo
         URL exacto da túa solicitude.
+    bad_request:
+      title: Solicitude incorrecta
+      description: A operación que solicitaches no servidor do OpenStreetMap non é
+        válida (HTTP 400)
     forbidden:
       title: Prohibido
       description: A operación que solicitaches no servidor do OpenStreetMap só está
@@ -2631,6 +2635,8 @@ gl:
         other: Ficheiro GPX con %{count} puntos de %{user}
       description_without_count: Ficheiro GPX de %{user}
   application:
+    basic_auth_disabled: 'A autenticación básica HTTP está desactivada: %{link}'
+    oauth_10a_disabled: 'OAuth 1.0 e 1.0a están desactivados: %{link}'
     permission_denied: Non ten permisos para acceder a esa acción
     require_cookies:
       cookies_needed: Semella que ten as cookies do navegador desactivadas. Actíveas
@@ -3194,6 +3200,10 @@ gl:
       intro: Atopou un erro ou descubriu que falla algún dato? Informe ós outros cartógrafos
         para que poidamos solucionalo. Mova o marcador á posición correcta e escriba
         unha nota expoñendo o problema.
+      anonymous_warning_html: Non iniciaches sesión. Por favor, %{log_in} ou %{sign_up}
+        se queres recibir actualizacións da túa nota.
+      anonymous_warning_log_in: accede ao sistema
+      anonymous_warning_sign_up: rexístrate
       advice: A túa nota será pública e poderá empregarse para actualizar o mapa;
         por conseguinte, non insiras información persoal, nin datos de mapas protexidos
         por dereitos de autoría ou listaxes de directorios.
index 365c8980dc1ffcbe7243e3ec55b8e970143590d6..b9ce9761e1a6985e8a92147cf753491e4759ec39 100644 (file)
@@ -712,6 +712,9 @@ he:
       contact: ליצור קשר
       contact_the_community_html: אפשר %{contact_link} עם קהילת OpenStreetMap אם מצאת
         קישור פגום / תקלה. יש לתעד את הכתובת המדויקת של הבקשה שלך.
+    bad_request:
+      title: בקשה מקולקלת
+      description: הפעולה שביקשת בשרת OpenStreetMap אינה תקינה (HTTP 400)
     forbidden:
       title: אסור
       description: הפעולה שביקשת לבצע מול שרת OpenStreetMap זמינה למנהלים בלבד (HTTP
@@ -1769,8 +1772,8 @@ he:
           היא ליד %{place}.
         commented_note_html: '%{commenter} הפעיל מחדש הערת מפה שהגבת עליה. הערה נמצאת
           ליד %{place}'
-      details: ×\90פשר ×\9c×\9eצ×\95×\90 ×¤×¨×\98×\99×\9d × ×\95ספ×\99×\9d ×¢×\9c ×\94×\94ערה בכתובת %{url}
-      details_html: ×\90פשר ×\9c×\9eצ×\95×\90 ×¤×¨×\98×\99×\9d × ×\95ספ×\99×\9d ×¢×\9c ×\94×\94ער×\94 ×\91×\9bת×\95×\91ת %{url}.
+      details: ×\90פשר ×\9c×\94×\92×\99×\91 ×\9c×\94ער×\94 ×\90×\95 ×\9cק×\91×\9c ×\9e×\99×\93×¢ × ×\95סף ×¢×\9c×\99ה בכתובת %{url}
+      details_html: ×\90פשר ×\9c×\94×\92×\99×\91 ×\9c×\94ער×\94 ×\90×\95 ×\9cק×\91×\9c ×\9e×\99×\93×¢ × ×\95סף ×¢×\9c×\99×\94 ×\91×\9bת×\95×\91ת %{url}
     changeset_comment_notification:
       description: ערכת שינויים של OpenStreetMap מס׳ %{id}
       hi: שלום %{to_user},
@@ -1791,8 +1794,8 @@ he:
         partial_changeset_with_comment: עם ההערה '%{changeset_comment}'
         partial_changeset_with_comment_html: עם ההערה '%{changeset_comment}'
         partial_changeset_without_comment: ללא הערה
-      details: ×¤×¨×\98×\99×\9d × ×\95ספ×\99×\9d ×¢×\9c ×¢×¨×\9bת ×\94ש×\99× ×\95×\99×\99×\9d ×\90פשר ×\9c×\9eצ×\95×\90 בכתובת %{url}
-      details_html: ×¤×¨×\98×\99×\9d × ×\95ספ×\99×\9d ×¢×\9c ×¢×¨×\9bת ×\94ש×\99× ×\95×\99×\99×\9d ×\90פשר ×\9c×\9eצ×\95×\90 בכתובת %{url}
+      details: ×\90פשר ×\9c×\94×\92×\99×\91 ×\9cער×\9bת ×\94ש×\99× ×\95×\99×\99×\9d ×\90×\95 ×\9cק×\91×\9c ×\9e×\99×\93×¢ × ×\95סף ×¢×\9c×\99×\94 בכתובת %{url}
+      details_html: ×\90פשר ×\9c×\94×\92×\99×\91 ×\9cער×\9bת ×\94ש×\99× ×\95×\99×\99×\9d ×\90×\95 ×\9cק×\91×\9c ×\9e×\99×\93×¢ × ×\95סף ×¢×\9c×\99×\94 בכתובת %{url}
       unsubscribe: באפשרותך לבטל את המינוי לעדכונים מערכת השינויים הזאת בכתובת %{url}.
       unsubscribe_html: באפשרותך לבטל את המינוי לעדכונים מערכת השינויים הזאת בכתובת
         %{url}.
@@ -2608,6 +2611,8 @@ he:
         other: קובץ GPS עם %{count} נקודות מאת %{user}
       description_without_count: קובץ GPS מאת %{user}
   application:
+    basic_auth_disabled: 'אימות בסיסי ב־HTTP כבוי: %{link}'
+    oauth_10a_disabled: 'OAuth 1.0 ו־1.0a כבויים: %{link}'
     permission_denied: אין לך הרשאה לגשת לפעולה הזאת
     require_cookies:
       cookies_needed: נראה שהעוגיות כבויות אצלך – נא להפעיל עוגיות בדפדפן שלך כדי
@@ -3164,6 +3169,10 @@ he:
       title: הערה חדשה
       intro: יש פה טעות או שחסר משהו? אנו מבקשים ממך לספר את זה לממפים אחרים. לשם
         כך צריך להזיז את הסמן למקום הנכון ולכתוב הערה שמסבירה את הבעיה.
+      anonymous_warning_html: לא נכנסת לחשבון. נא %{log_in} או %{sign_up} אם ברצונך
+        לקבל עדכונים על ההערה שלך.
+      anonymous_warning_log_in: להיכנס לחשבון
+      anonymous_warning_sign_up: להירשם
       advice: /start
       add: הוספת הערה
   javascripts:
index be024cccb46b96f2bf0d7def77fc6a66d5dea77d..18101a05ed57fc906e3397a44f0495b743547fd5 100644 (file)
@@ -256,7 +256,7 @@ ia:
         delete_introduction: 'Tu pote deler tu conto OpenStreetMap con le button sequente.
           Nota ben que:'
         delete_profile: Tu information de profilo, includente tu avatar, description
-          e domicilio, essera removite.
+          e loco de residentia, essera removite.
         delete_display_name: Tu nomine a monstrar essera removite e potera esser reusate
           per altere contos.
         retain_caveats: 'Nonobstante, alcun informationes sur te essera retenite sur
@@ -529,8 +529,8 @@ ia:
       friend: Amico
     show:
       title: Mi pannello
-      no_home_location_html: '%{edit_profile_link} e defini tu loco de domicilio pro
-        vider le usatores a proximitate.'
+      no_home_location_html: '%{edit_profile_link} e defini tu loco de residentia
+        pro vider le usatores a proximitate.'
       edit_your_profile: Modifica tu profilo
       my friends: Mi amicos
       no friends: Tu non ha ancora addite alcun amico.
@@ -665,6 +665,10 @@ ia:
       contact_the_community_html: Sia libere de %{contact_link} le communitate de
         OpenStreetMap si tu ha trovate un ligamine rupte o qualcunque anomalia. Nota
         le URL exacte de tu requesta.
+    bad_request:
+      title: Mal requesta
+      description: Le operation que tu ha requestate sur le servitor de OpenStreetMap
+        non es valide (HTTP 400)
     forbidden:
       title: Prohibite
       description: Le operation que tu ha requestate sur le servitor de OpenStreetMap
@@ -1578,7 +1582,7 @@ ia:
   layouts:
     logo:
       alt_text: Logo de OpenStreetMap
-    home: Vader al position de initio
+    home: Vader al loco de residentia
     logout: Clauder session
     log_in: Aperir session
     sign_up: Crear conto
@@ -1927,9 +1931,9 @@ ia:
       delete image: Remover le imagine actual
       replace image: Reimplaciar le imagine actual
       image size hint: (imagines quadrate de al minus 100×100 functiona melio)
-      home location: Position de origine
-      no home location: Tu non ha entrate tu position de origine.
-      update home location on click: Actualisar le position de origine quando io clicca
+      home location: Loco de residentia
+      no home location: Tu non ha definite tu loco de residentia.
+      update home location on click: Actualisar le loco de residentia quando io clicca
         sur le carta?
       show: Monstrar
       delete: Deler
@@ -2600,6 +2604,8 @@ ia:
         other: File GPX con %{count} punctos de %{user}
       description_without_count: File GPX de %{user}
   application:
+    basic_auth_disabled: 'Le authentication HTTP basic es disactivate: %{link}'
+    oauth_10a_disabled: 'OAuth 1.0 e 1.0a es disactivate: %{link}'
     permission_denied: Tu non ha le permission de acceder a iste action
     require_cookies:
       cookies_needed: Tu pare haber disactivate le cookies. Per favor activa le cookies
@@ -3161,6 +3167,10 @@ ia:
       intro: Tu ha trovate un error? Qualcosa manca? Face lo saper al altere cartographos
         a fin que nos pote corriger lo. Displacia le marcator al position correcte
         e scribe un nota pro explicar le problema.
+      anonymous_warning_html: Tu non ha aperite session. Per favor %{log_in} o %{sign_up}
+        si tu vole reciper actualisationes pro tu nota.
+      anonymous_warning_log_in: aperi session
+      anonymous_warning_sign_up: crea un conto
       advice: Tu nota es public e pote esser usate pro actualisar le carta. Dunque,
         non insere alcun information personal, ni datos ab cartas o catalogos protegite
         per derectos de autor.
index 2c633afd91704910697c994a8cb610093456ee73..54cb5dd0526355ef9d8fca8bb58f7b25b9e2ff2d 100644 (file)
@@ -1797,8 +1797,8 @@ it:
           La nota si trova vicino a %{place}.'
         commented_note_html: '%{commenter} ha riattivato una nota che avevi commentato.
           La nota si trova vicino a %{place}.'
-      details: Ulteriori dettagli sulla nota possono essere trovati su %{url}.
-      details_html: Ulteriori dettagli sulla nota possono essere trovati su %{url}.
+      details: Rispondi o scopri di più sulla nota su %{url}.
+      details_html: Rispondi o scopri di più sulla nota su %{url}.
     changeset_comment_notification:
       description: 'Gruppo di modifiche OpenStreetMap #%{id}'
       hi: Ciao %{to_user},
@@ -1818,10 +1818,8 @@ it:
         partial_changeset_with_comment: con il commento '%{changeset_comment}'
         partial_changeset_with_comment_html: con il commento '%{changeset_comment}'
         partial_changeset_without_comment: senza commento
-      details: Ulteriori dettagli sul gruppo di modifiche possono essere trovati su
-        %{url}.
-      details_html: Ulteriori dettagli sul gruppo di modifiche possono essere trovati
-        su %{url}.
+      details: Rispondi o scopri di più sul gruppo di modifiche su %{url}.
+      details_html: Rispondi o scopri di più sul gruppo di modifiche su %{url}.
       unsubscribe: Puoi annullare l'iscrizione agli aggiornamenti di questo insieme
         di modifiche su %{url}.
       unsubscribe_html: Puoi annullare l'iscrizione agli aggiornamenti di questo insieme
@@ -3214,6 +3212,8 @@ it:
       intro: Ti sei accorto di un errore o di qualcosa che manca? Fallo sapere agli
         altri mappatori così possono correggerlo. Sposta il puntatore nella posizione
         esatta e inserisci una nota per spiegare il problema.
+      anonymous_warning_log_in: entra
+      anonymous_warning_sign_up: registrati
       advice: La tua nota è pubblica e potrebbe essere utilizzata per aggiornare la
         mappa, pertanto non inserire informazioni personali e neppure dati provenienti
         da mappe protette da copyright oppure elenchi.
index 03188391bb4f3142595e4bc82c752e5c6e9c1865..444c0b841c360cc4a3ecca964f0bb01bde59d261 100644 (file)
@@ -86,6 +86,9 @@ ko:
       messages:
         invalid_email_address: 유효한 이메일 주소로 보이지 않음
         email_address_not_routable: 라우팅할 수 없음
+      models:
+        user_mute:
+          is_already_muted: 님은 이미 음소거되어 있습니다
     models:
       acl: 접근 제어 목록
       changeset: 바뀜집합
@@ -416,6 +419,15 @@ ko:
       introduction: 근처의 지물을 찾으려면 지도에서 클릭하세요.
       nearby: 근처 지물
       enclosing: 근접 지역 내 지물
+  old_nodes:
+    not_found:
+      sorry: '죄송합니다. 버전 %{version}의 노드 #%{id}를 찾을 수 없습니다.'
+  old_ways:
+    not_found:
+      sorry: '죄송합니다. 버전 %{version}의 경로 #%{id}를 찾을 수 없습니다.'
+  old_relations:
+    not_found:
+      sorry: '죄송합니다. 버전 %{version}의 관계 #%{id}를 찾을 수 없습니다.'
   changesets:
     changeset_paging_nav:
       showing_page: '%{page}쪽'
@@ -620,6 +632,8 @@ ko:
       contact: 여러 연락 수단
       contact_the_community_html: 끊어진 링크나 버그를 발견했다면 언제든지 오픈스트리트맵 커뮤니티에 %{contact_link}으로
         알려주십시오. 요청의 정확한 URL을 기록해 두십시오.
+    bad_request:
+      title: 잘못된 요청
     forbidden:
       title: 접근 거부됨
       description: 오픈스트리트맵 서버에 요청한 이 작업은 관리자만 사용할 수 있습니다(HTTP 403).
@@ -1794,7 +1808,8 @@ ko:
       lost password link: 비밀번호를 잊으셨나요?
       login_button: 로그인
       register now: 지금 등록하세요
-      with external: '다른 제3자 로그인 방식 사용하기:'
+      with external: 혹은 제3자 방식으로 로그인하기
+      or: 혹은
       auth failure: 죄송합니다, 입력한 정보로 로그인할 수 없습니다.
     destroy:
       title: 로그아웃
@@ -2166,6 +2181,7 @@ ko:
           lake: 호수
           reservoir: 저수지
           glacier: 빙하
+          reef: 암초
           wetland: 습지
           farm: 농장
           brownfield: 재개발지역
@@ -2227,6 +2243,7 @@ ko:
         imports: 들여오기
         automated_edits: 자동화 편집
       start_mapping: 매핑 시작하기
+      continue_authorization: 승인 계속하기
       add_a_note:
         title: 편집할 짬을 내기가 어려우신가요? 손쉽게 '노트'(참고)를 덧붙이세요!
         para_1: 가입한 다음 편집 방법을 배울 시간이 없거나 자잘한 사항만 고치고 싶은 경우, '노트'(참고)를 덧붙여서 알려주면 쉽습니다.
@@ -2320,6 +2337,7 @@ ko:
       identifiable: 식별 가능
       private: 비공개
       trackable: 추적 가능
+      details_without_tags_html: '%{time_ago} %{user}님'
     index:
       public_traces: 공개 GPS 궤적
       my_gps_traces: 내 GPS 궤적
@@ -2519,6 +2537,7 @@ ko:
   users:
     new:
       title: 가입하기
+      tab_title: 가입하기
       no_auto_account_create: 불행하게도 현재로서는 자동으로 계정을 만들 수 없습니다.
       please_contact_support_html: 계정 생성 준비를 위해 %{support_link}(으)로 문의해 주세요. 요청 처리가
         최대한 빨리 이뤄질 수 있도록 노력하겠습니다.
@@ -2527,14 +2546,19 @@ ko:
         header: 자유롭게 편집 가능
         paragraph_1: 다른 지도와 달리 오픈스트리트맵은 전부 여러분과 같은 사람들이 제작했으며 누구나 자유롭게 수정, 업데이트, 다운로드,
           사용을 할 수 있습니다.
-        paragraph_2: 기여를 시작하려면 가입하세요. 당신의 계정 확인을 위해 이메일을 보내드리겠습니다.
+        paragraph_2: 회원 가입으로 기여를 시작해 봅시다.
+        welcome: 오픈스트리트맵에 오신 것을 환영합니다
       display name description: 공개적으로 표시되는 사용자 이름입니다. 나중에 환경 설정에서 바꿀 수 있습니다.
+      tou: 이용 약관
+      contributor_terms: 기여자 약관
       external auth: '제3자 인증:'
       continue: 가입하기
       terms accepted: 새 기여자 약관에 동의해 주셔서 감사합니다!
       email_help_html: 당신의 주소는 공개적으로 노출되지 않습니다. 자세한 내용은 %{privacy_policy_link}를 참조하세요.
       privacy_policy: 개인정보처리방침
       privacy_policy_title: 이메일 주소 섹션을 포함한 OSMF 개인 정보 보호 정책
+      consider_pd: 퍼블릭 도메인
+      or: 혹은
       use external auth: 다른 제3자 로그인 방식 사용하기
     terms:
       title: 약관
@@ -2585,6 +2609,8 @@ ko:
       my_dashboard: 내 대시보드
       blocks on me: 나를 차단
       blocks by me: 나한테 차단
+      create_mute: 이 사용자 음소거하기
+      destroy_mute: 이 사용자를 음소거 해제
       edit_profile: 프로필 수정
       send message: 메시지 보내기
       diary: 일기
@@ -2715,6 +2741,7 @@ ko:
       flash: 이 차단을 해제했습니다.
     revoke_all:
       revoke: 해제!
+      flash: 모든 차단 내역이 비활성화되었습니다.
     helper:
       time_future_html: '%{time}에 끝납니다.'
       until_login: 사용자가 로그인할 때까지 활성합니다.
@@ -2763,8 +2790,14 @@ ko:
       reason: 차단 이유
       status: 상태
       revoker_name: 해제자
+      older: 옛 차단내역
+      newer: 최근 차단내역
     navigation:
       all_blocks: 모든 차단
+      blocks_on_me: 나의 차단내역
+      blocks_on_user: '%{user}님의 차단내역'
+      blocks_by_me: 내가 차단한 내역
+      blocks_by_user: '%{user}님이 차단한 내역'
       block: '#%{id} 차단'
   user_mutes:
     index:
@@ -2772,7 +2805,14 @@ ko:
         thead:
           actions: 동작
         tbody:
+          unmute: 음소거 해제
           send_message: 메시지 보내기
+    create:
+      notice: '%{name}님을 음소거했습니다.'
+      error: '%{name}님을 음소거할 수 없습니다. %{full_message}.'
+    destroy:
+      notice: '%{name}님의 음소거를 해제했습니다.'
+      error: 유저의 음소거를 해제할 수 없습니다. 다시 시도해 주세요.
   notes:
     index:
       title: '%{user} 님이 제출했거나 덧글을 남긴 참고'
@@ -2817,6 +2857,8 @@ ko:
       title: 새로운 참고
       intro: 실수했거나 없는 무언가를 발견했나요? 다른 매퍼에게 알려주어 고칠 수 있게 해주세요. 마커를 올바른 위치로 이동하고, 참고를
         남겨 문제를 설명해주세요.
+      anonymous_warning_log_in: 로그인
+      anonymous_warning_sign_up: 가입하기
       advice: 노트는 공개되어 지도 업데이트에 쓰일 수 있으므로 개인정보 또는 저작권이 있는 지도나 디렉터리 리스팅의 정보를 입력하지 마십시오.
       add: 참고 추가
   javascripts:
index cce5d43a2d17ddba5ce8448ba093e4175ed89125..810d9de08109a710696edd3bd02d3ead647622ad 100644 (file)
@@ -2114,6 +2114,7 @@ lb:
     description:
       description_without_count: GPX-Fichier vum %{user}
   application:
+    oauth_10a_disabled: 'OAuth 1.0 an 1.0a sinn desaktivéiert: %{link}'
     settings_menu:
       account_settings: Astellunge vum Benotzerkont
       oauth1_settings: OAuth 1-Astellungen
index 2cc8373164da19f9b82e7ab473c0c6551481cba7..4d318e03914442820b57a592dcc0c07bd60f78ea 100644 (file)
@@ -658,6 +658,10 @@ mk:
       contact_the_community_html: Слободно стапете во %{contact_link} со заедницата
         OpenStreetMap ако имате најдено расипана врска или грешка. Забележете ја точната
         URL на вашето барање.
+    bad_request:
+      title: Неисправно барање
+      description: Операцијат што ја побаравте од опслужувачот на OpenStreetMap server
+        не е важечка (HTTP 400)
     forbidden:
       title: Забрането
       description: Постапката која ја побаравте на опслужувачот на OpenStreetMap е
@@ -2581,6 +2585,8 @@ mk:
         other: GPX-податотеки со %{count} точки од %{user}
       description_without_count: GPX-податотека од %{user}
   application:
+    basic_auth_disabled: 'Оневозможена е основната заверка со HTTP: %{link}'
+    oauth_10a_disabled: 'OAuth 1.0 и 1.0a се оневозможени: %{link}'
     permission_denied: Немате дозвола за ова дејство
     require_cookies:
       cookies_needed: Изгледа сте оневозможиле колачиња - дозволете колачиња во прелистувачот
@@ -3141,6 +3147,10 @@ mk:
       intro: Забележавте некоја грешка или нешто недостасува? Дајте им на знаење на
         другите картографи за да ја средиме работата. Поместете го бележникот на исправното
         место и внесете порака, објаснувајќи го проблемот.
+      anonymous_warning_html: Не сте најавени. %{log_in} или %{sign_up} ако сакате
+        да ве известуваме за вашата белешка.
+      anonymous_warning_log_in: Најавете се
+      anonymous_warning_sign_up: зачленете се
       advice: Вашата белешка е јавна и може да се употреби за поднова на картата.
         Затоа, не внесувајте лични податоци, или пак податоци од карти или именици
         заштитени со авторски права.
index e73c511c1a2b8f62b75d8402a608184ad4653bb7..5c61fc8167f01f85cdc4afc73707025c2cfb82de 100644 (file)
@@ -1469,7 +1469,7 @@ ms:
       url: URL
     richtext_field:
       edit: Sunting
-      preview: Pralihat
+      preview: Pratayang
   site:
     about:
       next: Berikutnya
index 8d7b4561e1f7d7d7b6aa9e4f96cd23fb5674fa17..93f2054ffb8219ce732f6ca1b31b15e04b951419 100644 (file)
@@ -4,6 +4,7 @@
 # Author: Bada Kaji
 # Author: Danieldegroot2
 # Author: Drjpoudel
+# Author: Gravitystorm
 # Author: Haribanshi
 # Author: Krish Dulal
 # Author: Nirajan pant
 # Author: हिमाल सुबेदी
 ---
 ne:
+  html:
+    dir: ltr
   time:
     formats:
       friendly: '%e %B %Y मा %H:%M'
+  count:
+    at_least_pattern: '%{count}+'
   helpers:
     file:
       prompt: फाइल छान्नुहोस्
@@ -39,10 +44,23 @@ ne:
       oauth2_application:
         create: दर्ता गर्नुहाेस्
         update: अद्यावधिक गर्नुहोस्
+      redaction:
+        create: डेटा हटाउनुहोस्
+        update: डेटा हटाउने सङ्ग्रह गर्नुहोस्
       trace:
-        create: अपलोड गर्ने
-        update: परिवर्तनहरू संग्रह गर्ने
+        create: अपलोड गर्नुहोस्
+        update: परिवर्तनहरू संग्रह गर्नुहोस्
+      user_block:
+        create: ब्लक सिर्जना गर्नुहोस्
+        update: ब्लक अद्यावधिक गर्नुहाेस्
   activerecord:
+    errors:
+      messages:
+        invalid_email_address: इमेल मान्य देखिँदैन
+        email_address_not_routable: राउटेबल छैन
+      models:
+        user_mute:
+          is_already_muted: पहिले नै म्युट गरिएको छ
     models:
       acl: अनुमति नियन्त्रण सूची
       changeset: परिवर्तनहरू सूची
@@ -51,6 +69,7 @@ ne:
       diary_comment: डायरी टिप्पणी
       diary_entry: डायरी प्रविष्टी
       friend: साथी
+      issue: इस्यु
       language: भाषा
       message: सन्देश
       node: नोड
@@ -66,6 +85,7 @@ ne:
       relation: रिलेशन
       relation_member: रिलेशन सदस्य
       relation_tag: सम्बन्ध चिनो
+      report: रिपोर्ट गर्नुहोस्
       session: सत्र
       trace: ट्रेस
       tracepoint: ट्रेस बिन्दु
@@ -77,14 +97,32 @@ ne:
       way_node: बाटो नोड
       way_tag: मार्ग चिनो
     attributes:
+      client_application:
+        name: नाम (आवश्यक)
+        url: मुख्य एप्लिकेसन युआरएल (आवश्यक)
+        callback_url: कलब्याक युआरएल
+        support_url: सहायता युआरएल
+        allow_read_prefs: उनीहरूको प्रयोगकर्ता अभिरुचीहरू पढ्नुहोस्
+        allow_write_prefs: उनीहरूको प्रयोगकर्ता अभिरुचीहरू परिमार्जन गर्नुहोस्
+        allow_write_diary: डायरी प्रविष्टी गर्नुहोस्, टिप्पणीहरू र साथी बनाउनुहोस्
+        allow_write_api: नक्सा परिमार्जन गर्नुहोस्
+        allow_read_gpx: उनीहरूको निजी जिपिएस ट्रेसहरू पढ्नुहोस्
+        allow_write_gpx: जिपिएस ट्रेसहरू अपलोड गर्नुहोस्
+        allow_write_notes: टिपोटहरू परिमार्जन गर्नुहोस्
       diary_comment:
         body: बडी
       diary_entry:
         user: प्रयोगकर्ता
         title: विषय
+        body: बडी
         latitude: अक्षांश
         longitude: देशान्तर
         language_code: भाषा
+      doorkeeper/application:
+        name: नाम
+        redirect_uri: रिडाइरेक्ट युआरआइहरू
+        confidential: गोप्य एप्लिकेसन?
+        scopes: अनुमतिहरू
       friend:
         user: प्रयोगकर्ता
         friend: साथी
@@ -97,23 +135,26 @@ ne:
         longitude: देशान्तर
         public: सार्वजनिक
         description: वर्णन
-        gpx_file: 'जिपिएक्स फाइल उर्ध्वभरण गर्नुहाेस्:'
-        visibility: 'दृश्यक्षमता:'
-        tagstring: ट्यागहरू
+        gpx_file: GPX फाइल अपलोड गर्नुहोस्
+        visibility: प्रदर्शन
+        tagstring: ट्यागहरू
       message:
         sender: पठाउने
         title: विषय
         body: बडी
         recipient: प्रापक
       redaction:
+        title: शीर्षक
         description: वर्णन
+      report:
+        category: तपाईँको रिपोर्टको कारण छान्नुहोस्
       user:
         email: इमेल
         active: सक्रिय
         display_name: देखाउने नाम
         description: वर्णन
-        home_lat: 'देशान्तर:'
-        home_lon: 'अक्षांश:'
+        home_lat: अक्षांश
+        home_lon: देशान्तर
         languages: भाषाहरू
         pass_crypt: पासवर्ड
     help:
@@ -127,24 +168,42 @@ ne:
     remote:
       name: रिमोट कन्ट्रोल
       description: रिमोट कन्ट्रोल  (JOSM वा Merkaartor)
+  auth:
+    providers:
+      none: कुनै पनि होइन
   api:
     notes:
+      comment:
+        commented_at_by_html: '%{user}  द्वारा  %{when} पहिले अद्यावधिक गरिएको'
       entry:
         comment: टिप्पणी
+  account:
+    deletions:
+      show:
+        confirm_delete: निश्चित हुनुहुन्छ ?
+        cancel: रद्द गर्नुहोस्
   accounts:
     edit:
-      my settings: मेरो अनुकुलताहरु
+      title: खाता सम्पादन गर्नुहोस्
+      my settings: मेरो सेटिङहरू
+      current email address: हालको इमेल ठेगाना
+      external auth: वाह्य अथेन्टिकेसन
       openid:
+        link: https://wiki.openstreetmap.org/wiki/OpenID
         link text: यो के हो ?
       public editing:
         heading: सार्वजनिक सम्पादन
+        enabled: सक्रिय। Not anonymous and can edit data.
         enabled link text: यो के हो ?
         disabled link text: म किन सम्पादन गर्न सक्दिन?
       contributor terms:
+        heading: योगदानकर्ता सर्तहरू
+        agreed: तपाईँले नयाँ योगदानकर्ता सर्तहरू स्वीकार गर्नुभएको छ।
+        not yet agreed: तपाईँले नयाँ योगदानकर्ता सर्तहरू स्वीकार गर्नुभएको छैन।
         link text: यो के हो ?
       save changes button: परिवर्तनहरू संग्रह गर्नुहोस्
     go_public:
-      heading: 'सार्वजनिक सम्पादन:'
+      heading: सार्वजनिक सम्पादन
     update:
       success_confirm_needed: प्रयोगकर्ताको जानकारीहरू सफलतापूर्वक अध्यावधिक गरियो।
         Check your email for a note to confirm your new email address.
@@ -211,7 +270,7 @@ ne:
       feature_warning: '%{num_features}वटा सुविधाहरु लोड हुँदै छन्, जसले गर्दा तपाईंको
         ब्राउजर सुस्त वा अनुत्तरदायी बनाउन सक्छ । तपाईं साँच्चै यो जानकारी हेर्न चाहनुहुन्छ
         ?'
-      load_data: डेटा लोडगर्ने
+      load_data: डेटा लोड गर्नुहोस्
       loading: खुल्दै छ…
     tag_details:
       tags: ट्यागहरू
@@ -245,7 +304,7 @@ ne:
       title: परिवर्नहरू
       title_user: '%{user}द्वरा गरिएका परिवर्तनहरू'
       title_friend: तपाईको मित्रहरूद्वारा गरिएका परिवर्तनहरू
-      title_nearby: à¤¤à¤ªà¤¾à¤\88à¤\82 नजिक हुनुभएका प्रयोगकर्ताहरूद्वारा गरिएका परिवर्तनहरू
+      title_nearby: à¤¤à¤ªà¤¾à¤\88à¤\81à¤\95à¥\8b नजिक हुनुभएका प्रयोगकर्ताहरूद्वारा गरिएका परिवर्तनहरू
       empty: कुनै पनि परिवर्तनहरू भेटिएनन्।
       empty_area: यो क्षेत्रमा कुनै परिवर्तनहरू छैनन्।
       empty_user: यस प्रयोगकर्ताद्वारा कुनै परिवर्तनहरू गरिएका छैनन्।
@@ -259,6 +318,10 @@ ne:
         created: सृजना गरिएको
         closed: समापन भएको
         belongs_to: रचयिता
+    heading:
+      title: 'परिवर्तनहरू: %{id}'
+    no_such_entry:
+      heading: '%{id} आइडी भएको कुनै अभिलेख भेटिएन'
     show:
       title: 'परिवर्तनहरू: %{id}'
       discussion: छलफल
@@ -273,12 +336,14 @@ ne:
       relations: सम्बन्धहरू (%{count})
       relations_paginated: सम्बन्धहरू (जम्मा %{count} मध्येबाट %{x}-%{y})
     timeout:
-      sorry: à¤®à¤¾à¤« à¤\97रà¥\8dनà¥\81हà¥\8bला, à¤¤à¤ªà¤¾à¤\88à¤\82ले खोज्नुभएको परिवर्तनहरूको सूची प्राप्त गर्न निकै
+      sorry: à¤®à¤¾à¤« à¤\97रà¥\8dनà¥\81हà¥\8bला, à¤¤à¤ªà¤¾à¤\88à¤\81ले खोज्नुभएको परिवर्तनहरूको सूची प्राप्त गर्न निकै
         समय लाग्यो ।
   changeset_comments:
     comment:
-      comment: ' %{author}द्वारा #%{changeset_id}मा नयाँ टिप्पणी'
-      commented_at_by_html: ' %{user}  द्वारा  %{when} पहिले अद्यावधिक गरिएको'
+      comment: '%{author}द्वारा #%{changeset_id}मा नयाँ टिप्पणी'
+      commented_at_by_html: '%{user}  द्वारा  %{when} पहिले अद्यावधिक गरिएको'
+    comments:
+      comment: '%{author}द्वारा #%{changeset_id}मा नयाँ टिप्पणी'
     index:
       title_all: OpenStreetMap परिवर्वतन सूची छलफल
       title_particular: 'OpenStreetMap परिवर्तन सूची #%{changeset_id} छलफल'
@@ -292,7 +357,8 @@ ne:
       friend: साथी
     show:
       my friends: मेरा साथीहरू
-      no friends: तपाईं कुनै साथीहरूलाई जोड्नु भएको छैन
+      no friends: तपाईँ कुनै साथीहरूलाई थप्नु भएको छैन
+      nearby users: अन्य नजिकका प्रयोगकर्ताहरू
   diary_entries:
     new:
       title: नयाँ दैनिकी प्रविष्टी
@@ -306,17 +372,19 @@ ne:
       user_title: '%{user}को डायरी'
       in_language_title: '%{language} भाषामा भएका दैनिकीहरू'
       new: नयाँ दैनिकी
-      new_title: तपाईंको डायरीमा नयाँ दैनिकी सिर्जना गर्नुहोस्
+      new_title: तपाईँको डायरीमा नयाँ दैनिकी सिर्जना गर्नुहोस्
+      my_diary: मेरो डायरी
       no_entries: कुनै पनि अभिलेखहरू भेटिएनन्
       recent_entries: हालैका दैनिकीहरू
       older_entries: पुराना अभिलेखहरू
       newer_entries: नयाँ अभिलेखहरू
     edit:
-      title: à¤¦à¥\88निà¤\95à¥\80 à¤ªà¥\8dरविषà¥\8dठà¥\80 à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनà¥\87
-      marker_text: à¤¦à¥\88निà¤\95ी प्रविष्ठी स्थान
+      title: à¤¡à¤¾à¤¯à¤°à¥\80 à¤ªà¥\8dरविषà¥\8dठà¥\80 à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d
+      marker_text: à¤¡à¤¾à¤¯à¤°ी प्रविष्ठी स्थान
     show:
       title: '%{user}को डायरी | %{title}'
       user_title: '%{user}को डायरी'
+      discussion: छलफल
       leave_a_comment: टिप्पणी छोड्ने
       login_to_leave_a_comment_html: '%{login_link} टिप्पणी छोड्नलाई'
       login: प्रवेश
@@ -337,26 +405,27 @@ ne:
       edit_link: यो प्रविष्टी सम्पादन गर्ने
       hide_link: यो प्रविष्टी लुकाउने
       confirm: निश्चित गर्नुहोस्
-      report: à¤¯à¥\8b à¤ªà¥\8dरविषà¥\8dà¤\9fà¥\80à¤\95à¥\8b à¤\89à¤\9cà¥\81रà¥\80 à¤\97रà¥\8dनà¥\87
+      report: à¤¯à¥\8b à¤ªà¥\8dरविषà¥\8dà¤\9fà¥\80à¤\95à¥\8b à¤\89à¤\9cà¥\81रà¥\80 à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d
     diary_comment:
       comment_from_html: '%{link_user}द्वारा %{comment_created_at}मा गरिएको टिप्पणी'
       hide_link: यो टिप्पणी लुकाउनुहोस्
       confirm: निश्चित गर्नुहोस्
     location:
       location: 'स्थान:'
-      view: अवलोकन गर्ने
-      edit: सम्पादन
+      view: अवलोकन गर्नुहोस्
+      edit: सम्पादन गर्नुहोस्
+      coordinates: '%{latitude}; %{longitude}'
     feed:
       user:
-        title: '%{user}को लागि ओपनस्ट्रीटम्याप दैनिकी'
-        description: '%{user}को लागि हालैका ओपनस्ट्रीटम्याप दैनिकीहरू'
+        title: '%{user}को लागि OpenStreetMap डायरी'
+        description: '%{user}को लागि हालैका OpenStreetMap डायरी'
       language:
         title: '%{language_name} भाषामा OpenStreetMap दैनिकी'
-        description: '%{language_name} भाषामा ओपनस्ट्रीटम्याप प्रयोगकर्ताहरूका हालैका
-          à¤¦à¥\88निà¤\95ी'
+        description: '%{language_name} भाषामा OpenStreetMap प्रयोगकर्ताहरूका हालैका
+          à¤¡à¤¾à¤¯à¤°ी'
       all:
-        title: ओपनस्ट्रीटम्याप दैनिकीहरू
-        description: ओपनस्ट्रीटम्याप प्रयोगकर्ताहरूका हालैका दैनिकीहरू
+        title: OpenStreetMap डायरी प्रविष्टीहरू
+        description: OpenStreetMap प्रयोगकर्ताहरूका हालैका डायरी प्रविष्टीहरू
     comments:
       post: पोष्ट
       when: कहिले
@@ -366,9 +435,11 @@ ne:
   friendships:
     make_friend:
       button: साथीको रूपमा थप्नुहोस्
-      success: '%{name} à¤\85ब à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤®à¤¿à¤¤à¥\8dर हुनुभएको छ!'
+      success: '%{name} à¤\85ब à¤¤à¤ªà¤¾à¤\88à¤\81à¤\95à¥\8b à¤¸à¤¾à¤¥à¥\80 हुनुभएको छ!'
       failed: माफ गर्नुहोला, %{name}लाई मित्रको रुपमा थप्न सकिएन।
-      already_a_friend: '%{name} सँग तपाईंले पहिले नै मित्रता गरिसक्नु भएको छ ।'
+      already_a_friend: '%{name} सँग तपाईँले पहिले साथी हुनुहुन्छ।'
+      limit_exceeded: तपाईँले हालसालै थुप्रै प्रयोगकर्ताहरूलाई साथी बनाउनु भएको छ।
+        Please wait a while before trying to friend any more.
     remove_friend:
       button: साथीबाट हटाउने
   geocoder:
@@ -483,6 +554,10 @@ ne:
           viaduct: भियाडक्ट
           "yes": पुल
         building:
+          garages: ग्यारेजहरू
+          hangar: ह्याङ्गर
+          house: घर
+          public: सार्वजनिक भवन
           "yes": भवन
         craft:
           brewery: ब्रुएरी
@@ -551,6 +626,7 @@ ne:
           "yes": ऐतिहासिक स्थल
         landuse:
           basin: बेसिन
+          cemetery: अन्त्यष्टी स्थल
           commercial: व्यवसायिक क्षेत्र
           conservation: संरक्षण
           construction: निर्माण
@@ -626,6 +702,7 @@ ne:
           administrative: प्रबन्धकीय स्थल
           architect: आर्किटेक्ट
           company: कम्पनी
+          estate_agent: घरजग्गा एजेन्ट
           government: सरकारी कार्यालय
           insurance: बीमा कार्यालय
           it: आइटी कार्यालय
@@ -657,6 +734,7 @@ ne:
         railway:
           abandoned: परित्यक्त रेलमार्ग
           junction: रेलमार्ग जङ्सन
+          subway: सबवे
         shop:
           bakery: बेकरी
           beauty: सौन्दर्य पसल
@@ -704,6 +782,7 @@ ne:
           sports: खेलकुद सामग्री पसल
           tailor: सुचीकार
           toys: खेलौना पसल
+          travel_agency: ट्राभल एजेन्सी
           video: भिडियो पसल
           "yes": पसल
         tourism:
@@ -734,6 +813,7 @@ ne:
           "yes": जलमार्ग
       admin_levels:
         level2: राष्ट्रिय सीमा
+        level3: क्षेत्र सीमा
         level4: राज्य सीमा
         level5: क्षेत्र सीमा
         level6: इलाका सीमा
@@ -759,16 +839,25 @@ ne:
   reports:
     new:
       categories:
+        diary_entry:
+          other_label: अन्य
+        diary_comment:
+          other_label: अन्य
+        user:
+          other_label: अन्य
         note:
           other_label: अन्य
   layouts:
+    project_name:
+      title: OpenStreetMap
+      h1: OpenStreetMap
     logo:
       alt_text: OpenStreetMap लोगो
     logout: निर्गमन
     log_in: प्रवेश गर्नुहोस्
     sign_up: खाता खाेल्नुहाेस्
     start_mapping: म्यापिङ गर्न सुरु गर्नुहोस्
-    edit: सम्पादन
+    edit: सम्पादन गर्नुहोस्
     history: इतिहास
     export: निर्यात गर्नुहोस्
     data: डेटा
@@ -798,6 +887,10 @@ ne:
     friendship_notification:
       hi: नमस्ते %{to_user},
       subject: '[OpenStreetMap] %{user} ले तपाईँलाई मित्रको रूपमा थप्नु भयो'
+    gpx_failure:
+      hi: नमस्ते %{to_user},
+    gpx_success:
+      hi: नमस्ते %{to_user},
     signup_confirm:
       greeting: नमस्ते!
     email_confirm:
@@ -860,27 +953,39 @@ ne:
       title: पासवर्ड बिर्सियो
       heading: पासवर्ड बिर्सिनुभयो ?
       email address: 'इमेल ठेगाना:'
-      new password button: à¤ªà¥\8dरवà¥\87स à¤¶à¤¬à¥\8dद à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dनà¥\87
+      new password button: à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d
     edit:
-      title: à¤ªà¥\8dरवà¥\87स à¤¶à¤¬à¥\8dद à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dनà¥\87
-      heading: '%{user}à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤ªà¥\8dरवà¥\87स à¤¶à¤¬à¥\8dद à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dनà¥\87'
-      reset: à¤¨à¤¯à¤¾à¤\81 à¤ªà¥\8dरवà¥\87शशवà¥\8dद
+      title: à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d
+      heading: '%{user}à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d'
+      reset: à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤°à¤¿à¤¸à¥\87à¤\9f à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d
     update:
-      flash changed: तपाईंको प्रवेश शब्द परिवर्तन गरिएको छ।
+      flash changed: तपाईँको पासवर्ड परिवर्तन गरिएको छ।
+  preferences:
+    edit:
+      cancel: रद्द गर्नुहोस्
   profiles:
     edit:
-      image: 'चित्र:'
+      cancel: रद्द गर्नुहोस्
+      image: तस्विर
       home location: 'गृह स्थान:'
-      no home location: तपाईंले आफ्नो गृहस्थान प्रविष्ठ गर्नुभएको छैन।
+      no home location: तपाईँले आफ्नो गृहस्थान प्रविष्ठ गर्नुभएको छैन।
+      show: देखाउनुहोस्
+      delete: हटाउनुहोस्
   sessions:
     new:
       title: प्रवेश
       tab_title: प्रवेश
-      password: 'पासवर्ड:'
+      password: पासवर्ड
       login_button: प्रवेश
     destroy:
       title: लगआउट
       logout_button: निर्गमन
+  shared:
+    markdown_help:
+      link: कडी
+      image: तस्विर
+    richtext_field:
+      edit: सम्पादन गर्नुहोस्
   site:
     about:
       next: अर्को
@@ -896,6 +1001,7 @@ ne:
       legal_babble:
         more_title_html: थप जान्नको लागि
         contributors_title_html: हाम्रा योगदान कर्ताहरू
+        contributors_fr_france: फ्रान्स
     index:
       permalink: स्थायी लिङ्क
       shortlink: छोटो लिङ्क
@@ -970,35 +1076,52 @@ ne:
           subway: सबवे
           cable_car: केबल कार
           chair_lift: कुर्सी लिफ्ट
+          taxiway: ट्याक्सीको बाटो
+          city: शहर
+          vineyard: अङ्गुर-बगैँचा
           forest: वन
           wood: कुञ्ज
+          farmland: खेतीयोग्य जमिन
+          grass: घाँस
+          meadow: घाँसेमैदान
+          sand: बालुवा
           golf: गल्फ कोर्स
           park: उद्यान
           resident: आवासीय क्षेत्र
           lake: ताल
-          reservoir: मुहान
+          reservoir: जलाशय
+          glacier: हिमनदी
+          wetland: सिमसार
           farm: खेती
           cemetery: अन्त्यष्टी स्थल
+          beach: समुद्र किनारा
           school: विद्यालय
           university: विश्वविद्यालय
+          hospital: अस्पताल
           summit: शिखर
           peak: शिखर
           bicycle_shop: साइकल पसल
           bicycle_parking: साकल पार्किङ
           toilets: शौचालय
     welcome:
-      title: स्वागतम्!
+      title: स्वागत!
       whats_on_the_map:
         title: म्यापमा के छ
+      basic_terms:
+        node: नोड
+        way: बाटो
       rules:
         title: नियमहरू !
+      start_mapping: म्यापिङ गर्न सुरु गर्नुहोस्
   traces:
     new:
+      upload_trace: GPS Trace अपलोड गर्ने
       visibility_help: यसको मतलाब के हो ?
       help: सहायता
     create:
       upload_trace: GPS Trace अपलोड गर्ने
     edit:
+      cancel: रद्द गर्नुहोस्
       title: ट्रेस सम्पादन गर्दै %{name}
       heading: ट्रेस सम्पादन गर्दै %{name}
       visibility_help: यसको मतलब के हो ?
@@ -1013,6 +1136,7 @@ ne:
       uploaded: 'अपलोड गरिएको:'
       points: 'विन्दुहरू:'
       start_coordinates: 'सुरूको निर्देशङ्क:'
+      coordinates_html: '%{latitude}; %{longitude}'
       map: नक्सा
       edit: सम्पादन
       owner: 'मालिक:'
@@ -1033,9 +1157,11 @@ ne:
       public: सार्वजनिक
       private: निजी
     index:
-      public_traces: सारवजनिक GPS ट्रेसहरु
-      public_traces_from: '%{user}बाट सार्वकनिक GPS ट्रेसहरु'
+      public_traces: सार्वजनिक GPS ट्रेसहरू
+      my_gps_traces: मेरो जिपिएस ट्रेसहरू
+      public_traces_from: '%{user}बाट सार्वजनिक GPS ट्रेसहरू'
       tagged_with: ' %{tags}हरूद्वारा ट्याग गरिएको'
+      my_traces: मेरा ट्रेसहरू
     destroy:
       scheduled_for_deletion: मेट्नको लागि तालिकावद्ध गरिएको ट्रेस
     make_public:
@@ -1049,8 +1175,20 @@ ne:
     show:
       confirm: निश्चित हुनुहुन्छ ?
   oauth2_applications:
+    index:
+      name: नाम
+      permissions: अनुमतिहरू
+    application:
+      edit: सम्पादन गर्नुहोस्
+      delete: हटाउनुहोस्
     show:
+      edit: सम्पादन गर्नुहोस्
       delete: मेट्ने
+      permissions: अनुमतिहरू
+      redirect_uris: रिडाइरेक्ट युआरआइहरू
+  oauth2_authorized_applications:
+    index:
+      permissions: अनुमतिहरू
   users:
     new:
       title: खाता खाेल्नुहाेस्
@@ -1076,6 +1214,8 @@ ne:
       my comments: मेरा टिप्पणीहरू
       edits: सम्पादनहरू
       traces: ट्रेसहरू
+      notes: म्याप टिप्पणीहरू
+      remove as friend: साथीबाट हटाउने
       add as friend: साथी जोड्नुहोस्
       status: 'स्थिति:'
       role:
@@ -1083,7 +1223,7 @@ ne:
       comments: टिप्पणी
       confirm: निश्चित गर्नुहोस्
     go_public:
-      flash success: à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95ा à¤¸à¤¬à¥\88 à¤¸à¤®à¥\8dपादनहरà¥\82 à¤¸à¤¾à¤°à¥\8dवाà¤\9cनिà¤\95 à¤\9bनà¥\8d , à¤¤à¤ªà¤¾à¤\88à¤\82 अब सम्पादन लायक
+      flash success: à¤¤à¤ªà¤¾à¤\88à¤\81à¤\95ा à¤¸à¤¬à¥\88 à¤¸à¤®à¥\8dपादनहरà¥\82 à¤¸à¤¾à¤°à¥\8dवाà¤\9cनिà¤\95 à¤\9bनà¥\8d , à¤¤à¤ªà¤¾à¤\88à¤\81 अब सम्पादन लायक
         हुनु भयो ।
     index:
       title: प्रयोगकर्ताहरू
@@ -1104,7 +1244,7 @@ ne:
     revoke:
       title: भूमिका फिर्ता निश्चित गर्ने
       heading: भूमिका फिर्ता निश्चित गर्ने
-      are_you_sure: à¤¤à¤ªà¤¾à¤\88à¤\82 भूमिका `%{role}' , `%{name} प्रोगकर्ताबाट फिर्ता लिने कुरामा
+      are_you_sure: à¤¤à¤ªà¤¾à¤\88à¤\81 भूमिका `%{role}' , `%{name} प्रोगकर्ताबाट फिर्ता लिने कुरामा
         निश्चित हुनुहुन्छ'?
       confirm: निश्चित गर्नुहोस्
       fail: भूमिका `%{role}' ,`%{name}'बाट फिर्ता लिन सकिएन । प्रोगकर्ता नाम र भूमिका
@@ -1112,16 +1252,21 @@ ne:
   user_blocks:
     show:
       created: सृजना गरिएको
-      status: वस्तुस्थिति
+      status: 'स्थिति:'
       show: देखाउनुहोस्
-      edit: सम्पादन
+      edit: सम्पादन गर्नुहोस्
       confirm: निश्चित हुनुहुन्छ ?
     block:
       show: देखाउनुहोस्
-      edit: सम्पादन
+      edit: सम्पादन गर्नुहोस्
     blocks:
       creator_name: सर्जक
       status: वस्तुस्थिति
+  user_mutes:
+    index:
+      table:
+        tbody:
+          send_message: सान्देस पठाउ
   notes:
     index:
       id: आईडी
@@ -1143,7 +1288,7 @@ ne:
     share:
       title: आदान-प्रदान गर्नुहोस्
       cancel: रद्द गर्नुहोस्
-      image: à¤\9bवि
+      image: à¤¤à¤¸à¥\8dविर
       long_link: कडी
       embed: एचटीएमएल
       format: 'ढाँचा:'
@@ -1158,6 +1303,8 @@ ne:
       layers:
         header: म्याप लेयरहरू
         notes: म्याप टिप्पणीहरू
+        gps: सार्वजनिक GPS ट्रेसहरू
+      make_a_donation: दान गर्नुहोस्
     changesets:
       show:
         comment: टिप्पणी
index 1439d1c1e298e860ae4f71d69acd2f0f9540b778..57425aa6db3a6385e625c2574b3f6067039e638c 100644 (file)
@@ -4,6 +4,7 @@
 # Author: Aalam
 # Author: Babanwalia
 # Author: Bgo eiu
+# Author: Cabal
 # Author: Jimidar
 # Author: Kuldeepburjbhalaike
 # Author: Satnam S Virdi
@@ -16,9 +17,9 @@ pa:
   helpers:
     submit:
       diary_comment:
-        create: à¨¸à¨¾à¨\82ਭà©\8b
+        create: à¨\9fਿੱਪਣà©\80
       diary_entry:
-        create: à¨\9bਾਪ
+        create: à¨¸à¨¾à¨\82ਭ
         update: ਅੱਪਡੇਟ ਕਰੋ
       issue_comment:
         create: ਟਿੱਪਣੀ ਕਰੋ
@@ -61,7 +62,7 @@ pa:
       relation: ਸਬੰਧ
       relation_member: ਸਬੰਧ ਮੈਂਬਰ
       relation_tag: ਸਬੰਧ ਟੈਗ
-      report: à¨°à¨¿à¨ªà©\8bਰà¨\9f à¨\95ਰà©\8b
+      report: à¨\87ਤਲਾਹ à¨¦à¨¿à¨\93
       session: ਸੈਸ਼ਨ
       trace: ਟਰੇਸ
       tracepoint: ਟਰੇਸ ਪੁਆਇੰਟ
@@ -74,7 +75,12 @@ pa:
       way_tag: ਰਾਹ ਟੈਗ
     attributes:
       client_application:
+        name: ਨਾਮ (ਲੋੜੀਂਦਾ)
+        url: ਮੁੱਢਲਾ Application URL (ਲੋੜੀਂਦਾ ਹੈ)
         support_url: ਮਦਦ URL
+        allow_read_prefs: ਉਹਨਾਂ ਦੀਆਂ ਵਰਤੋਂਕਾਰ ਤਰਜੀਹਾਂ ਨੂੰ ਪੜ੍ਹੋ
+        allow_write_prefs: ਉਹਨਾਂ ਦੀਆਂ ਵਰਤੋਂਕਾਰ ਤਰਜੀਹਾਂ ਨੂੰ ਸੋਧੋ
+        allow_write_api: ਨਕਸ਼ੇ ਨੂੰ ਸੋਧੋ
       diary_comment:
         body: ਮੁੱਖ ਭਾਗ
       diary_entry:
@@ -85,12 +91,13 @@ pa:
         language_code: ਬੋਲੀ
       doorkeeper/application:
         name: ਨਾਂ
+        scopes: ਇਜਾਜ਼ਤਾਂ
       friend:
         user: ਵਰਤੋਂਕਾਰ
         friend: ਦੋਸਤ
       trace:
         user: ਵਰਤੋਂਕਾਰ
-        visible: ਵਿਖਣਯੋਗ
+        visible: ਵਿਖਣ-ਯੋਗ
         name: ਨਾਂ
         size: ਅਕਾਰ
         latitude: ਅਕਸ਼ਾਂਸ਼
@@ -105,20 +112,64 @@ pa:
         body: ਮੁੱਖ ਭਾਗ
         recipient: ਪ੍ਰਾਪਤਕਰਤਾ
       redaction:
+        title: ਸਿਰਲੇਖ
         description: ਵੇਰਵਾ
+      report:
+        category: ਆਪਣੀ ਇਤਲਾਹ ਦਾ ਕਾਰਨ ਚੁਣੋ
+        details: ਕਿਰਪਾ ਕਰਕੇ ਸਮੱਸਿਆ ਬਾਰੇ ਕੁਝ ਹੋਰ ਵੇਰਵੇ ਪ੍ਰਦਾਨ ਕਰੋ (ਲੋੜੀਂਦਾ)
       user:
         email: ਈਮੇਲ
-        new_email: 'ਨਵਾਂ ਈ-ਮੇਲ ਪਤਾ:'
+        new_email: 'ਨਵਾਂ ਈਮੇਲ ਪਤਾ:'
         active: ਸਰਗਰਮ
         display_name: ਵਿਖਾਉਣ ਨਾਂ
         description: ਵੇਰਵਾ
         home_lat: ਅਕਸ਼ਾਂਸ਼
         home_lon: 'ਰੇਖਾਂਸ਼:'
-        languages: ਬੋਲੀਆਂ
+        languages: ਤਰਜੀਹੀ ਬੋਲੀਆਂ
+        preferred_editor: ਤਰਜੀਹੀ ਸੰਪਾਦਕ
         pass_crypt: ਪਛਾਣ-ਸ਼ਬਦ
+    help:
+      user:
+        new_email: (ਜਨਤਕ ਤੌਰ 'ਤੇ ਕਦੇ ਨਹੀਂ ਪ੍ਰਦਰਸ਼ਿਤ)
   datetime:
     distance_in_words_ago:
+      about_x_hours:
+        one: ਲਗਭਗ %{count} ਘੰਟਾ ਪਹਿਲਾਂ
+        other: ਲਗਭਗ %{count} ਘੰਟੇ ਪਹਿਲਾਂ
+      about_x_months:
+        one: about %{count} ਮਹੀਨਾ ਪਹਿਲਾਂ
+        other: ਲਗਭਗ %{count} ਮਹੀਨੇ ਪਹਿਲਾਂ
+      about_x_years:
+        one: about %{count} ਸਾਲ ਪਹਿਲਾਂ
+        other: ਲਗਭਗ %{count} ਸਾਲ ਪਹਿਲਾਂ
+      almost_x_years:
+        one: ਲਗਭਗ %{count} ਸਾਲ ਪਹਿਲਾਂ
+        other: ਲਗਭਗ %{count} ਸਾਲ ਪਹਿਲਾਂ
       half_a_minute: ਅੱਧਾ ਮਿੰਟ ਪਹਿਲਾਂ
+      less_than_x_seconds:
+        one: '%{count} ਸਕਿੰਟ ਤੋਂ ਘੱਟ'
+        other: '%{count} ਸਕਿੰਟ ਪਹਿਲਾਂ'
+      less_than_x_minutes:
+        one: '%{count} ਮਿੰਟ ਤੋਂ ਘੱਟ ਪਹਿਲਾਂ'
+        other: '%{count} ਮਿੰਟ ਪਹਿਲਾਂ'
+      over_x_years:
+        one: ਲਗਭਗ %{count} ਸਾਲ ਪਹਿਲਾਂ
+        other: ਲਗਭਗ %{count} ਸਾਲ ਪਹਿਲਾਂ
+      x_seconds:
+        one: '%{count} ਸਕਿੰਟ ਪਹਿਲਾਂ'
+        other: '%{count} ਸਕਿੰਟ ਪਹਿਲਾਂ'
+      x_minutes:
+        one: '%{count} ਮਿੰਟ ਪਹਿਲਾਂ'
+        other: '%{count} ਮਿੰਟ ਪਹਿਲਾਂ'
+      x_days:
+        one: '%{count} ਦਿਨ ਪਹਿਲਾਂ'
+        other: '%{count} ਦਿਨ ਪਹਿਲਾਂ'
+      x_months:
+        one: '%{count} ਮਹੀਨਾ ਪਹਿਲਾਂ'
+        other: '%{count} ਮਹੀਨੇ ਪਹਿਲਾਂ'
+      x_years:
+        one: '%{count} ਸਾਲ ਪਹਿਲਾਂ'
+        other: '%{count} ਸਾਲ ਪਹਿਲਾਂ'
   editor:
     default: ਮੂਲ (ਮੌਜੂਦਾ %{name})
     id:
@@ -130,14 +181,41 @@ pa:
       none: ਕੋਈ ਨਹੀਂ
       google: ਗੂਗਲ
       facebook: ਫੇਸਬੁੱਕ
-      microsoft: à¨µà¨¿à©°à¨¡à©\8bà¨\9c਼ à¨²à¨¾à¨\88ਵ
+      microsoft: à¨®à¨¾à¨\88à¨\95à©\8dਰà©\8bਸਾਫà¨\9f
       github: ਗਿੱਟਹੱਬ
       wikipedia: ਵਿਕੀਪੀਡੀਆ
   api:
     notes:
+      comment:
+        opened_at_html: '%{when} ਬਣਾਇਆ ਗਿਆ'
+        opened_at_by_html: '%{when} ਨੂੰ %{user} ਦੁਆਰਾ ਬਣਾਇਆ ਗਿਆ'
+        closed_at_html: '%{when} ਹੱਲ ਕੀਤਾ'
+        closed_at_by_html: '%{when} ਨੂੰ %{user} ਦੁਆਰਾ ਹੱਲ ਕੀਤਾ ਗਿਆ'
+        reopened_at_html: '%{when} ਮੁੜ ਸਰਗਰਮ ਕੀਤਾ'
+        reopened_at_by_html: '%{when} ਨੂੰ %{user} ਦੁਆਰਾ ਮੁੜ ਸਰਗਰਮ ਕੀਤਾ'
       entry:
-        comment: ਟਿੱਪਣੀ ਕਰੋ
+        comment: ਟਿੱਪਣੀ
         full: ਪੂਰੀ ਟਿੱਪਣੀ
+  account:
+    deletions:
+      show:
+        title: ਮੇਰਾ ਖਾਤਾ ਮਿਟਾਓ
+        warning: ਚੇਤਾਵਨੀ! ਖਾਤਾ ਮਿਟਾਉਣ ਦੀ ਪ੍ਰਕਿਰਿਆ ਅੰਤਿਮ ਹੈ, ਅਤੇ ਇਸਨੂੰ ਵਾਪਸ ਨਹੀਂ ਕੀਤਾ
+          ਜਾ ਸਕਦਾ ਹੈ।
+        delete_account: ਖਾਤਾ ਮਿਟਾਓ
+        delete_introduction: 'ਤੁਸੀਂ ਹੇਠਾਂ ਦਿੱਤੇ ਬਟਨ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਆਪਣੇ ਖੁੱਲ੍ਹਾ-ਗਲੀ-ਨਕਸ਼ਾ
+          ਖਾਤੇ ਨੂੰ ਮਿਟਾ ਸਕਦੇ ਹੋ। ਕਿਰਪਾ ਕਰਕੇ ਹੇਠ ਦਿੱਤੇ ਵੇਰਵਿਆਂ ਵੱਲ ਧਿਆਨ ਦਿਓ:'
+        delete_profile: ਤੁਹਾਡੇ ਪ੍ਰੋਫਾਈਲ ਦੀ ਜਾਣਕਾਰੀ, ਜਿਸ ਵਿੱਚ ਤੁਹਾਡਾ ਅਵਤਾਰ, ਵੇਰਵਾ ਅਤੇ
+          ਘਰ ਦੇ ਟਿਕਾਣੇ ਸ਼ਾਮਲ ਹੈ, ਨੂੰ ਮਿਦਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।
+        retain_caveats: 'ਹਾਲਾਂਕਿ, ਤੁਹਾਡੇ ਬਾਰੇ ਕੁਝ ਜਾਣਕਾਰੀ ਖੁੱਲ੍ਹਾ-ਗਲੀ-ਨਕਸ਼ਾ ''ਤੇ ਬਰਕਰਾਰ
+          ਰੱਖੀ ਜਾਵੇਗੀ, ਭਾਵੇਂ ਤੁਹਾਡਾ ਖਾਤਾ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ ਹੋਵੇ:'
+        retain_edits: ਨਕਸ਼ੇ ਦੇ ਭੰਡਾਰ ਵਿੱਚ ਤੁਹਾਡੇ ਸੰਪਾਦਨ, ਜੇ ਕੋਈ ਹਨ, ਨੂੰ ਬਰਕਰਾਰ ਰੱਖਿਆ
+          ਜਾਵੇਗਾ।
+        retain_email: ਤੁਹਾਡਾ ਈਮੇਲ ਪਤਾ ਬਰਕਰਾਰ ਰੱਖਿਆ ਜਾਵੇਗਾ।
+        recent_editing_html: ਜਿਵੇਂ ਕਿ ਤੁਸੀਂ ਹਾਲ ਹੀ ਵਿੱਚ ਸੰਪਾਦਿਤ ਕੀਤਾ ਹੈ ਤੁਹਾਡੇ ਖਾਤੇ
+          ਨੂੰ ਵਰਤਮਾਨ ਵਿੱਚ ਮਿਟਾਇਆ ਨਹੀਂ ਜਾ ਸਕਦਾ ਹੈ। %{time} ਵਿੱਚ ਮਿਟਾਉਣਾ ਸੰਭਵ ਹੋਵੇਗਾ।
+        confirm_delete: ਕੀ ਤੁਹਾਨੂੰ ਯਕੀਨ ਹੈ?
+        cancel: ਰੱਦ ਕਰੋ
   accounts:
     edit:
       title: ਖਾਤਾ ਸੋਧੋ
@@ -150,23 +228,40 @@ pa:
         enabled link text: ਇਹ ਕੀ ਹੈ?
         disabled link text: ਮੈਂ ਸੋਧ ਕਿਉਂ ਨਹੀਂ ਕਰ ਸਕਦਾ?
       contributor terms:
-        heading: 'ਯੋਗਦਾਨ ਦੀਆਂ ਸ਼ਰਤਾਂ:'
+        heading: 'ਯੋਗਦਾਨ ਦੀਆਂ ਸ਼ਰਤਾਂ:'
         agreed: ਤੁਸੀਂ ਯੋਗਦਾਨੀ ਦੀਆਂ ਨਵੀਆਂ ਸ਼ਰਤਾਂ ਨਾਲ਼ ਸਹਿਮਤੀ ਜਤਾਈ ਹੈ।
         not yet agreed: ਤੁਸੀਂ ਯੋਗਦਾਨੀ ਦੀਆਂ ਨਵੀਆਂ ਸ਼ਰਤਾਂ ਨਾਲ਼ ਸਹਿਮਤੀ ਨਹੀਂ ਜਤਾਈ।
         link text: ਇਹ ਕੀ ਹੈ?
       save changes button: ਤਬਦੀਲੀਆਂ ਸਾਂਭੋ
+      delete_account: ਖਾਤਾ ਮਿਟਾਓ
     go_public:
+      heading: ਜਨਤਕ ਸੁਧਾਈ
+      currently_not_public: ਵਰਤਮਾਨ ਵਿੱਚ ਤੁਹਾਡੇ ਸੰਪਾਦਨ ਅਗਿਆਤ ਹਨ ਅਤੇ ਲੋਕ ਤੁਹਾਨੂੰ ਸੁਨੇਹੇ
+        ਨਹੀਂ ਭੇਜ ਸਕਦੇ ਜਾਂ ਤੁਹਾਡਾ ਟਿਕਾਣਾ ਨਹੀਂ ਦੇਖ ਸਕਦੇ। ਇਹ ਦਿਖਾਉਣ ਲਈ ਕਿ ਤੁਸੀਂ ਕੀ ਸੰਪਾਦਿਤ
+        ਕੀਤਾ ਹੈ ਅਤੇ ਲੋਕਾਂ ਨੂੰ ਵੈੱਬਸਾਈਟ ਰਾਹੀਂ ਤੁਹਾਡੇ ਨਾਲ ਸੰਪਰਕ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿੱਤੀ
+        ਹੈ, ਹੇਠਾਂ ਦਿੱਤੇ ਬਟਨ 'ਤੇ ਕਲਿੱਕ ਕਰੋ।
+      find_out_why: ਪਤਾ ਕਰੋ ਕਿਉਂ
+      email_not_revealed: ਤੁਹਾਡਾ ਈਮੇਲ ਪਤਾ ਜਨਤਕ ਹੋਣ ਨਾਲ ਪ੍ਰਗਟ ਨਹੀਂ ਕੀਤਾ ਜਾਵੇਗਾ।
+      not_reversible: ਇਸ ਕਾਰਵਾਈ ਨੂੰ  ਵਾਪਸ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ ਅਤੇ ਸਾਰੇ ਨਵੇਂ ਵਰਤੋਂਕਾਰ
+        ਹੁਣ ਮੂਲ ਰੂਪ ਵਿੱਚ ਜਨਤਕ ਹਨ।
       make_edits_public_button: ਮੇਰੀਆਂ ਸਾਰੀਆਂ ਸੋਧਾਂ ਜਨਤਕ ਕਰੋ
+    destroy:
+      success: ਖਾਤਾ ਮਿਟਾ ਦਿੱਤਾ ਗਿਆ ਹੈ।
   browse:
+    deleted_ago_by_html: '%{time_ago} ਨੂੰ %{user} ਦੁਆਰਾ ਮਿਟਾਇਆ ਗਿਆ'
+    edited_ago_by_html: '%{time_ago} ਨੂੰ %{user} ਦੁਆਰਾ ਸੋਧਿਆ ਗਿਆ'
     version: ਵਰਜਨ
     in_changeset: ਤਬਦੀਲੀਆਂ
     anonymous: ਬੇਪਛਾਣ
     no_comment: (ਕੋਈ ਟਿੱਪਣੀ ਨਹੀਂ)
     part_of: ਦਾ ਹਿੱਸਾ
+    part_of_relations:
+      one: '%{count} ਸਬੰਧ'
+      other: '%{count} ਸਬੰਧ'
     download_xml: XML ਲਾਹੋ
     view_history: ਅਤੀਤ ਵੇਖੋ
     view_details: ਵੇਰਵੇ ਵੇਖੋ
-    location: 'ਸਥਿਤà©\80:'
+    location: 'à¨\9fਿà¨\95ਾਣਾ:'
     relation:
       members: ਜੀਅ
     relation_member:
@@ -175,7 +270,12 @@ pa:
         node: ਨੋਡ
         way: ਰਾਹ
         relation: ਸਬੰਧ
+    containing_relation:
+      entry_html: ਸਬੰਧ %{relation_name}
+      entry_role_html: ਸਬੰਧ %{relation_name} (%{relation_role} ਵਜੋਂ)
     not_found:
+      title: ਨਹੀਂ ਲੱਭਿਆ
+      sorry: 'ਮਾਫ਼ ਕਰਨਾ, %{type} #%{id} ਲੱਭਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ।'
       type:
         node: ਨੋਡ
         way: ਰਾਹ
@@ -195,15 +295,22 @@ pa:
         way: ਰਾਹ
         relation: ਸਬੰਧ
     start_rjs:
-      load_data: à¨¡à¨¾à¨\9fਾ à¨²à©\8bਡ à¨\95ਰ
-      loading: à¨²à©\8bਡ à¨¹à©\8b à¨°à¨¿à¨¹à¨¾ à¨¹à©\88â\80¦
+      load_data: à¨¡à©\87à¨\9fਾ à¨²à©±à¨¦
+      loading: à¨²à©±à¨¦ à¨°à¨¿à¨¹à¨¾ à¨¹à©\88...
     tag_details:
       tags: ਟੈਗ
       wikipedia_link: '%{page} ਲੇਖ ਵਿਕਿਪੀਡਿਆ ਉੱਤੇ'
       telephone_link: '%{phone_number} ਨੂੰ ਫੋਨ ਕਰੋ'
+      colour_preview: ਰੰਗ %{colour_value} ਝਲਕ
+      email_link: ਈਮੇਲ %{email}
+    query:
+      title: ਪੁੱਛਗਿੱਛ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ
+      introduction: ਨੇੜਲੀ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ ਲੱਭਣ ਲਈ ਨਕਸ਼ੇ ਉੱਤੇ ਕਲਿੱਕ ਕਰੋ।
+      nearby: ਨੇੜਲੀ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ
+      enclosing: ਨੱਥੀ ਵਿਸ਼ੇਸ਼ਤਾਵਾਂ
   changesets:
     changeset_paging_nav:
-      showing_page: à¨µà¨°à¨\95ਾ %{page}
+      showing_page: à¨¸à¨«à¨¼ਾ %{page}
       next: ਅਗਲਾ »
       previous: « ਪਿਛਲਾ
     changeset:
@@ -213,10 +320,10 @@ pa:
       id: ਸ਼ਨਾਖ਼ਤ
       user: ਵਰਤੋਂਕਾਰ
       comment: ਟਿੱਪਣੀ
-      area: à¨\87ਲਾà¨\95ਾ
+      area: à¨\96à©\87ਤਰ
     index:
       title: ਤਬਦੀਲੀਆਂ
-      load_more: à¨¹à©\8bਰ à¨²à©\8bਡ à¨\95ਰ
+      load_more: à¨¹à©\8bਰ à¨ªà©\9cà©\8dਹ
       feed:
         title: ਤਬਦੀਲੀ ਲੜੀ %{id}
         title_comment: ਤਬਦੀਲੀ ਲੜੀ %{id} - %{comment}
@@ -225,24 +332,35 @@ pa:
         belongs_to: ਲੇਖਕ
     show:
       title: 'ਤਬਦੀਲੀ ਲੜੀ: %{id}'
-      discussion: ਚਰਚਾ
+      created: 'ਬਣਾਇਆ ਗਿਆ: %{when}'
+      closed: 'ਬੰਦ ਕੀਤਾ: %{when}'
+      created_ago_html: '%{time_ago} ਬਣਾਇਆ ਗਿਆ'
+      closed_ago_html: '%{time_ago} ਬੰਦ ਕੀਤਾ'
+      created_ago_by_html: '%{time_ago} ਨੂੰ %{user} ਦੁਆਰਾ ਬਣਾਇਆ ਗਿਆ'
+      closed_ago_by_html: '%{time_ago} ਨੂੰ %{user} ਦੁਆਰਾ ਬੰਦ ਕੀਤਾ ਗਿਆ'
+      discussion: ਗੱਲ-ਬਾਤ
+      join_discussion: ਚਰਚਾ ਵਿੱਚ ਸ਼ਾਮਲ ਹੋਣ ਲਈ ਦਾਖ਼ਲ ਹੋਵੋ
+      comment_by_html: '%{user} %{time_ago} ਤੋਂ ਟਿੱਪਣੀ'
+      hidden_comment_by_html: '%{user} %{time_ago} ਤੋਂ ਲੁਕਵੀਂ ਟਿੱਪਣੀ'
       changesetxml: ਤਬਦੀਲੀ ਲੜੀ XML
   dashboards:
     contact:
       km away: '%{count}ਕਿ.ਮੀ. ਪਰ੍ਹਾਂ'
       m away: '%{count}ਮੀਟਰ ਪਰ੍ਹਾਂ'
-      latest_edit_html: 'à¨\86à¨\96਼ਰà©\80 à¨¸à©\8bਧ %{ago}:'
+      latest_edit_html: 'ਤਾà¨\9c਼à©\87 à¨¸à©\8bਧ (%{ago}):'
     popup:
       your location: ਤੁਹਾਡੀ ਸਥਿਤੀ
       friend: ਦੋਸਤ
     show:
+      my friends: ਮੇਰੇ ਦੋਸਤ
       no friends: ਤੁਸੀਂ ਅਜੇ ਕੋਈ ਮਿੱਤਰ ਨਹੀਂ ਜੋੜਿਆ।
       nearby users: ਨੇੜੇ-ਤੇੜੇ ਦੇ ਹੋਰ ਵਰਤੋਂਕਾਰ
   diary_entries:
     form:
-      location: 'ਸਥਿਤੀ:'
+      location: ਟਿਕਾਣਾ
       use_map_link: ਨਕਸ਼ਾ ਵਰਤੋ
     show:
+      discussion: ਗੱਲ-ਬਾਤ
       leave_a_comment: ਕੋਈ ਟਿੱਪਣੀ ਛੱਡੋ
       login_to_leave_a_comment_html: ਟਿੱਪਣੀ ਛੱਡਣ ਵਾਸਤੇ %{login_link}
       login: ਦਾਖ਼ਲ ਹੋਵੋ
@@ -251,6 +369,7 @@ pa:
     diary_entry:
       comment_link: ਇਸ ਇੰਦਰਾਜ 'ਤੇ ਟਿੱਪਣੀ ਕਰੋ
       reply_link: ਇਸ ਇੰਦਰਾਜ ਦਾ ਜੁਆਬ ਦਿਉ
+      no_comments: ਕੋਈ ਟਿੱਪਣੀਆਂ ਨਹੀਂ
       edit_link: ਇਹ ਇੰਦਰਾਜ ਸੋਧੋ
       hide_link: ਇਹ ਇੰਦਰਾਜ ਲੁਕਾਉ
       confirm: ਤਸਦੀਕ ਕਰੋ
@@ -258,15 +377,15 @@ pa:
       hide_link: ਇਹ ਟਿੱਪਣੀ ਲੁਕਾਉ
       confirm: ਤਸਦੀਕ ਕਰੋ
     location:
-      location: 'ਸਥਿਤà©\80:'
+      location: 'à¨\9fਿà¨\95ਾਣਾ:'
       view: ਵੇਖੋ
       edit: ਸੋਧੋ
     comments:
       post: ਡਾਕ
       when: ਕਦੋਂ
       comment: ਟਿੱਪਣੀ
-      newer_comments: à¨¹à©\8bਰ à¨¨à¨µà©\80à¨\86à¨\82 à¨\9fਿੱਪਣà©\80à¨\86à¨\82
-      older_comments: à¨¹à©\8bਰ à¨ªà©\81ਰਾਣà©\80à¨\86à¨\82 à¨\9fਿੱਪਣà©\80à¨\86à¨\82
+      newer_comments: ਨਵੀਆਂ ਟਿੱਪਣੀਆਂ
+      older_comments: ਪੁਰਾਣੀਆਂ ਟਿੱਪਣੀਆਂ
   friendships:
     make_friend:
       heading: '%{user} ਨਾਲ਼ ਯਾਰੀ ਪਾਉਣੀ ਹੈ?'
@@ -282,7 +401,7 @@ pa:
         aeroway:
           aerodrome: ਏਰੋਡਰੋਮ
           apron: ਐਪਰਨ
-          gate: ਦਰਵਾਜ਼ਾ
+          gate: à¨¹à¨µà¨¾à¨\88 à¨\85ੱਡà©\87 à¨¦à¨¾ à¨¦à¨°à¨µà¨¾à¨\9c਼ਾ
           helipad: ਹੈਲੀਪੈਡ
           runway: ਉਡਾਣ-ਪੱਟੀ
           taxiway: ਟੈਕਸੀਵੇਅ
@@ -369,7 +488,7 @@ pa:
           waste_basket: ਕੂੜਾਦਾਨ
           waste_disposal: ਕੂੜੇਦਾਨ
         boundary:
-          administrative: à¨ªà©\8dਰਸ਼ਾਸਕੀ ਸਰਹੱਦ
+          administrative: à¨ªà©\8dਰਬੰਧਕੀ ਸਰਹੱਦ
           census: ਮਰਦਮਸ਼ੁਮਾਰੀ ਸਰਹੱਦ
           national_park: ਕੌਮੀ ਬਾਗ਼
           protected_area: ਸੁਰੱਖਿਅਤ ਖੇਤਰ
@@ -477,7 +596,7 @@ pa:
           recreation_ground: ਮਨੋਰੰਜਨ ਮੈਦਾਨ
           reservoir: ਸਰੋਵਰ
           residential: ਰਿਹਾਇਸ਼ੀ ਇਲਾਕਾ
-          retail: ਪਰਚੂਨ
+          retail: ਪਰਚੂਨ ਖੇਤਰ
           village_green: ਸ਼ਾਮਲਾਤ
           vineyard: ਅੰਗੂਰਾਂ ਦਾ ਬਾਗ਼
         leisure:
@@ -723,18 +842,19 @@ pa:
       more_results: ਹੋਰ ਨਤੀਜੇ
   layouts:
     logo:
-      alt_text: à¨\93ਪਨਸà¨\9fਰà©\80à¨\9fਮà©\88ਪ à¨²à©\8bà¨\97à©\8b
+      alt_text: à¨\96à©\81ੱਲà©\8dਹਾ-à¨\97ਲà©\80-ਨà¨\95ਸ਼ਾ à¨®à¨¾à¨°à¨\95ਾ
     home: ਘਰੇਲੂ ਟਿਕਾਣੇ 'ਤੇ ਜਾਉ
     logout: ਵਿਦਾਈ ਲਉ
     log_in: ਦਾਖ਼ਲ ਹੋਵੋ
     sign_up: ਭਰਤੀ ਹੋਵੋ
     start_mapping: ਨਕਸ਼ਾਬੰਦੀ ਸ਼ੁਰੂ ਕਰੋ
     edit: ਸੋਧੋ
-    history: à¨\85ਤà©\80ਤ
+    history: à¨ªà©\81ਰਾਣਾ
     export: ਬਰਾਮਦ
     data: ਸਮੱਗਰੀ
     export_data: ਸਮੱਗਰੀ ਬਰਾਮਦ ਕਰੋ
     edit_with: '%{editor} ਨਾਲ ਸੋਧੋ'
+    intro_header: ਖੁੱਲ੍ਹਾ-ਗਲੀ-ਨਕਸ਼ਾ ਉੱਤੇ ਜੀ ਆਇਆਂ ਨੂੰ
     intro_2_create_account: ਇੱਕ ਵਰਤੋਂਕਾਰ ਖਾਤਾ ਬਣਾਉ
     partners_partners: ਜੋੜੀਦਾਰ
     help: ਮਦਦ
@@ -748,9 +868,25 @@ pa:
     learn_more: ਹੋਰ ਜਾਣੋ
     more: ਹੋਰ
   user_mailer:
+    message_notification:
+      subject: '[ਖੁੱਲ੍ਹਾ-ਗਲੀ-ਨਕਸ਼ਾ] %{message_title}'
+      header: '%{from_user} ਨੇ ਤੁਹਾਨੂੰ ਖੁੱਲ੍ਹਾ-ਗਲੀ-ਨਕਸ਼ਾ ਰਾਹੀਂ %{subject}: ਵਿਸ਼ੇ ਨਾਲ
+        ਸੁਨੇਹਾ ਭੇਜਿਆ ਹੈ।'
+      header_html: '%{from_user} ਨੇ ਤੁਹਾਨੂੰ %{subject} ਵਿਸ਼ੇ ਦੇ ਨਾਲ ਖੁੱਲ੍ਹਾ-ਗਲੀ-ਨਕਸ਼ਾ
+        ਰਾਹੀਂ ਇੱਕ ਸੁਨੇਹਾ ਭੇਜਿਆ ਹੈ:'
+    friendship_notification:
+      subject: '[ਖੁੱਲ੍ਹਾ-ਗਲੀ-ਨਕਸ਼ਾ] %{user} ਨੇ ਤੁਹਾਨੂੰ ਇੱਕ ਦੋਸਤ ਵਜੋਂ ਸ਼ਾਮਲ ਕੀਤਾ ਹੈ'
+      had_added_you: '%{user} ਨੇ ਤੁਹਾਨੂੰ ਖੁੱਲ੍ਹਾ-ਗਲੀ-ਨਕਸ਼ਾ ''ਤੇ ਇੱਕ ਦੋਸਤ ਵਜੋਂ ਸ਼ਾਮਲ
+        ਕੀਤਾ ਹੈ।'
+    gpx_failure:
+      subject: '[ਖੁੱਲ੍ਹਾ-ਗਲੀ-ਨਕਸ਼ਾ] GPX ਦਰਾਮਦ ਅਸਫਲਤਾ'
+    gpx_success:
+      subject: '[ਖੁੱਲ੍ਹਾ-ਗਲੀ-ਨਕਸ਼ਾ] GPX ਦਰਾਮਦ ਸਫਲਤਾ'
     signup_confirm:
+      subject: '[ਖੁੱਲ੍ਹਾ-ਗਲੀ-ਨਕਸ਼ਾ] ਉੱਤੇ ਜੀ ਆਈਆਂ ਨੂੰ'
       greeting: ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ ਜੀ!
     email_confirm:
+      subject: '[ਖੁੱਲ੍ਹਾ-ਗਲੀ-ਨਕਸ਼ਾ] ਆਪਣੇ ਈਮੇਲ ਪਤੇ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ'
       greeting: ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ,
     lost_password:
       greeting: ਸਤਿ ਸ੍ਰੀ ਅਕਾਲ,
@@ -783,7 +919,7 @@ pa:
       date: ਮਿਤੀ
     message_summary:
       reply_button: ਜੁਆਬ
-      destroy_button: à¨®à¨¿à¨\9fਾà¨\89
+      destroy_button: à¨®à¨¿à¨\9fਾà¨\93
     new:
       title: ਸੁਨੇਹਾ ਘੱਲੋ
     create:
@@ -799,7 +935,7 @@ pa:
       unread_button: ਅਣ-ਪੜ੍ਹਿਆ ਨਿਸ਼ਾਨ ਲਾਉ
       back: ਪਿੱਛੇ
     sent_message_summary:
-      destroy_button: à¨®à¨¿à¨\9fਾà¨\89
+      destroy_button: à¨®à¨¿à¨\9fਾà¨\93
     heading:
       my_inbox: ਮੇਰਾ ਇਨਬਾਕਸ
     destroy:
@@ -808,7 +944,7 @@ pa:
     new:
       title: ਪਛਾਣ ਸ਼ਬਦ ਗੁੰਮ ਗਿਆ
       heading: ਪਛਾਣ ਸ਼ਬਦ ਭੁੱਲ ਗਿਆ?
-      email address: 'ਈਮੇਲ ਪਤਾ:'
+      email address: ਈਮੇਲ ਪਤਾ
       new password button: ਪਛਾਣ ਸ਼ਬਦ ਮੁੜ-ਸੈੱਟ ਕਰੋ
     edit:
       title: ਪਛਾਣ ਸ਼ਬਦ ਮੁੜ-ਸੈੱਟ ਕਰੋ
@@ -824,7 +960,7 @@ pa:
       keep image: ਮੌਜੂਦਾ ਤਸਵੀਰ ਰੱਖੋ
       delete image: ਮੌਜੂਦਾ ਤਸਵੀਰ ਹਟਾਉ
       replace image: ਮੌਜੂਦਾ ਤਸਵੀਰ ਵਟਾਉ
-      home location: 'ਘਰ ਦੀ ਸਥਿਤੀ:'
+      home location: ਘਰ ਦਾ ਟਿਕਾਣਾ
       no home location: ਤੁਸੀਂ ਆਪਣੇ ਘਰ ਦੀ ਸਥਿਤੀ ਨਹੀਂ ਦੱਸੀ ਹੈ।
   sessions:
     new:
@@ -837,12 +973,13 @@ pa:
       login_button: ਦਾਖ਼ਲ ਹੋਵੋ
       register now: ਹੁਣੇ ਰਜਿਸਟਰ ਕਰੋ
     destroy:
-      title: à¨²à©\8cà¨\97à¨\86à¨\8aà¨\9f
-      heading: à¨\93ਪਨ à¨¸à¨\9fਰà©\80à¨\9f à¨®à©\88ਪ à¨¤à©\8bà¨\82 à¨²à©\8cà¨\97à¨\86à¨\8aà¨\9f à¨\95ਰà©\8b
-      logout_button: à¨²à©\8cà¨\97à¨\86à¨\8aà¨\9f
+      title: à¨¬à¨¾à¨¹à¨° à¨\86à¨\89
+      heading: à¨\96à©\81ੱਲà©\8dਹਾ-à¨\97ਲà©\80-ਨà¨\95ਸ਼ਾ à¨¤à©\8bà¨\82 à¨¬à¨¾à¨¹à¨° à¨\86à¨\93
+      logout_button: à¨¬à¨¾à¨¹à¨° à¨\86à¨\89
   site:
     about:
       next: ਅੱਗੇ
+      heading_html: '%{copyright}ਖੁੱਲ੍ਹਾ-ਗਲੀ-ਨਕਸ਼ਾ %{br} ਯੋਗਦਾਨੀ'
       local_knowledge_title: ਸਥਾਨੀ ਗਿਆਨ
       open_data_title: ਓਪਨ ਡਾਟਾ
       legal_title: ਕਾਨੂੰਨੀ
@@ -857,6 +994,10 @@ pa:
         mapping_link: ਨਕਸ਼ਾਬੰਦੀ ਸ਼ੁਰੂ ਕਰੋ
       legal_babble:
         title_html: ਨਕਲ-ਹੱਕ ਤੇ ਲਾਇਸੰਸ
+        introduction_1_osm_foundation: ਖੁੱਲ੍ਹਾ-ਗਲੀ-ਨਕਸ਼ਾ ਸੰਸਥਾ
+        credit_title_html: ਖੁੱਲ੍ਹਾ-ਗਲੀ-ਨਕਸ਼ਾ ਨੂੰ ਕਿਵੇਂ ਸੇਹਰਾ ਦੇਣਾ ਹੈ
+        credit_1_html: 'ਜਿੱਥੇ ਤੁਸੀਂ ਖੁੱਲ੍ਹਾ-ਗਲੀ-ਨਕਸ਼ਾ ਡੇਟਾ ਦੀ ਵਰਤੋਂ ਕਰਦੇ ਹੋ, ਤੁਹਾਨੂੰ
+          ਹੇਠ ਲਿਖੀਆਂ ਦੋ ਚੀਜ਼ਾਂ ਕਰਨ ਦੀ ਲੋੜ ਹੁੰਦੀ ਹੈ:'
         more_title_html: ਹੋਰ ਜਾਣਕਾਰੀ ਲੱਭਣ ਵਾਸਤੇ
         contributors_title_html: ਸਾਡੇ ਯੋਗਦਾਨੀ
     index:
@@ -869,7 +1010,7 @@ pa:
     export:
       title: ਬਰਾਮਦ
       manually_select: ਆਪਣੇ ਆਪ ਇੱਕ ਵੱਖਰਾ ਖੇਤਰ ਚੁਣੋ
-      licence: à¨²à¨¾à¨\87ਸੰਸ
+      licence: ਲਸੰਸ
       too_large:
         other:
           title: ਹੋਰ ਸਰੋਤ
@@ -879,7 +1020,7 @@ pa:
       how_to_help:
         title: ਮਦਦ ਕਿਵੇਂ ਕਰਨੀ ਹੈ
         join_the_community:
-          title: ਭਾਈਚਾਰੇ ਨਾਲ ਜੁੜੋ
+          title: ਭਾਈਚਾਰੇ ਨਾਲ ਜੁੜੋ
       other_concerns:
         title: ਹੋਰ ਫ਼ਿਕਰ
     help:
@@ -903,7 +1044,7 @@ pa:
       get_directions: ਦਿਸ਼ਾਵਾਂ ਪ੍ਰਾਪਤ ਕਰੋ
       from: ਵੱਲੋਂ
       to: ਵੱਲ
-      where_am_i: à¨®à©\88à¨\82 à¨\95ਿੱਥà©\87 à¨¹à¨¾à¨\82?
+      where_am_i: à¨\87ਹ à¨\95ਿੱਥà©\87 à¨¹à©\88?
       submit_text: ਜਾਉ
     key:
       table:
@@ -923,9 +1064,9 @@ pa:
           runway: ਹਵਾਈ ਅੱਡੇ ਦੀ ਉਡਾਣ ਪੱਟੀ
           taxiway: ਟੈਕਸੀਵੇਅ
           apron: ਹਵਾਈ ਅੱਡੇ ਦਾ ਐਪਰਨ
-          admin: à¨ªà©\8dਰਸ਼ਾਸਕੀ ਸਰਹੱਦ
+          admin: à¨ªà©\8dਰਬੰਧਕੀ ਸਰਹੱਦ
           forest: ਜੰਗਲ
-          wood: à¨\9cà©°à¨\97ਲ
+          wood: à¨²à©±à¨\95à©\9c
           golf: ਗੋਲਫ਼ ਮੈਦਾਨ
           park: ਪਾਰਕ
           common: ਸ਼ਾਮਲਾਟ
@@ -1022,9 +1163,10 @@ pa:
         header: ਮੁਫ਼ਤ ਅਤੇ ਸੋਧਣਯੋਗ
       continue: ਭਰਤੀ ਹੋਵੋ
     terms:
-      title: à¨¯à©\8bà¨\97ਦਾਨà©\80 à¨¦à©\80à¨\86à¨\82 à¨¸à¨¼à¨°à¨¤à¨¾à¨\82
-      heading: à¨¯à©\8bà¨\97ਦਾਨà©\80 à¨¦à©\80à¨\86à¨\82 à¨¸à¨¼à¨°à¨¤à¨¾à¨\82
+      title: ਸ਼ਰਤਾਂ
+      heading: ਸ਼ਰਤਾਂ
       consider_pd_why: ਇਹ ਕੀ ਹੈ?
+      informal_translations: ਗ਼ੈਰ-ਰਸਮੀ ਤਰਜਮਾ
       decline: ਮਨਜ਼ੂਰ ਨਹੀਂ
       legale_select: 'ਆਪਣੀ ਰਿਹਾਇਸ਼ ਦਾ ਦੇਸ਼ ਚੁਣੋ:'
       legale_names:
@@ -1059,10 +1201,10 @@ pa:
       created from: 'ਕਿੱਥੋਂ ਉਸਾਰਿਆ:'
       status: 'ਦਰਜਾ:'
       role:
-        administrator: à¨\87ਹ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ à¨\87ੱà¨\95 à¨ªà©\8dਰਸ਼ਾਸਕ ਹੈ।
+        administrator: à¨\87ਹ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ à¨\87ੱà¨\95 à¨ªà©\8dਰਬੰਧਕ ਹੈ।
         moderator: ਇਹ ਵਰਤੋਂਕਾਰ ਇੱਕ ਵਿਚੋਲਾ ਹੈ।
         grant:
-          administrator: à¨ªà©\8dਰਸ਼ਾਸà¨\95à©\80 à¨¹à©±à¨\95 à¨¦à¨¿à¨\89
+          administrator: à¨ªà©\8dਰਬੰਧà¨\95à©\80 à¨¹à©±à¨\95 à¨¦à¨¿à¨\93
           moderator: ਵਿਚੋਲਗੀ ਦੇ ਹੱਕ ਦਿਉ
       comments: ਟਿੱਪਣੀਆਂ
       create_block: ਇਸ ਵਰਤੋਂਕਾਰ 'ਤੇ ਰੋਕ ਲਾਉ
@@ -1102,7 +1244,7 @@ pa:
     helper:
       block_duration:
         hours:
-          one: ੧ ਘੰਟਾ
+          one: '%{count} ਘੰਟਾ'
           other: '%{count} ਘੰਟੇ'
     show:
       status: ਹਾਲਾਤ
index 88ac2cc0833119eebc0fc7c684ba689ebfdc0ca3..382627115af952afbe22bda7ed98822ea5f42f9a 100644 (file)
@@ -466,7 +466,7 @@ pl:
       entry_role_html: Relacja %{relation_name} (jako %{relation_role})
     not_found:
       title: Nie znaleziono
-      sorry: 'Niestety, nie odnaleziono %{type} #%{id}.'
+      sorry: 'Nie odnaleziono %{type} #%{id}.'
       type:
         node: węzła
         way: linii
@@ -512,6 +512,15 @@ pl:
       introduction: Kliknij na mapie, by wyszukać pobliskie obiekty.
       nearby: Obiekty w pobliżu
       enclosing: Większe, otaczające obiekty
+  old_nodes:
+    not_found:
+      sorry: 'Nie odnaleziono węzła #%{id} w wersji %{version}.'
+  old_ways:
+    not_found:
+      sorry: 'Nie odnaleziono linii #%{id} w wersji %{version}.'
+  old_relations:
+    not_found:
+      sorry: 'Nie odnaleziono relacji #%{id} w wersji %{version}.'
   changesets:
     changeset_paging_nav:
       showing_page: Strona %{page}
@@ -742,7 +751,7 @@ pl:
     search:
       title:
         results_from_html: Wyniki z %{results_link}
-        latlon: Wewnętrzny
+        latlon: Internal
         osm_nominatim: Nominatim
         osm_nominatim_reverse: Nominatim
     search_osm_nominatim:
@@ -1911,6 +1920,10 @@ pl:
       new password button: Wyczyść hasło
       help_text: Proszę wprowadzić adres e-mail używany do logowania. Zostanie wysłany
         na niego odnośnik służący do wyczyszczenia hasła.
+    create:
+      send_paranoid_instructions: Jeśli twój adres e-mail istnieje w naszej bazie
+        danych, otrzymasz link do odzyskania hasła na swój adres e-mail w ciągu kilku
+        minut.
     edit:
       title: Wyczyść hasło
       heading: Czyszczenie hasła użytkownika %{user}
@@ -1918,6 +1931,7 @@ pl:
       flash token bad: Nie znaleziono tokenu, sprawdź URL
     update:
       flash changed: Hasło zostało zmienione.
+      flash token bad: Nie znalaziono tego tokena. Sprawdź adres URL.
   preferences:
     show:
       title: Preferencje
@@ -1981,7 +1995,9 @@ pl:
       support: supportem
   shared:
     markdown_help:
-      heading_html: Przeanalizowano za pomocą %{kramdown_link}
+      heading_html: Składnia %{kramdown_link}
+      kramdown_url: https://kramdown.gettalong.org/quickref.html
+      kramdown: kramdown
       headings: Nagłówki
       heading: Nagłówki
       subheading: Podtytuł
@@ -2116,6 +2132,14 @@ pl:
         contributors_fr_credit_html: '%{france}: Zawiera dane uzyskane z Direction
           Générale des Impôts.'
         contributors_fr_france: Francja
+        contributors_hr_credit_html: |-
+          %{croatia}: Zawiera dane z %{dgu_link} i %{open_data_portal}
+          (informacje publiczne Chorwacji).
+        contributors_hr_croatia: Chorwacja
+        contributors_hr_dgu: Państwowej Administracji Geodezyjnej Chorwacji (Državna
+          geodetska uprava)
+        contributors_hr_open_data_portal: Krajowego portalu otwartych danych (Portal
+          otvorenih podataka)
         contributors_nl_credit_html: '%{netherlands}: Zawiera dane &copy; AND, 2007
           (%{and_link})'
         contributors_nl_netherlands: Holandia
@@ -2124,8 +2148,12 @@ pl:
         contributors_nz_new_zealand: Nowa Zelandia
         contributors_nz_linz_data_service: LINZ Data Service
         contributors_nz_cc_by: CC BY 4.0
+        contributors_rs_credit_html: |-
+          %{serbia}: Zawiera dane z %{rgz_link} i %{open_data_portal}
+          (informacje publiczne Serbii), 2018.
         contributors_rs_serbia: Serbia
-        contributors_rs_open_data_portal: Krajowy Portal Otwartych Danych
+        contributors_rs_rgz: Serbskiego Urzędu Geodezyjnego
+        contributors_rs_open_data_portal: Krajowego portalu otwartych danych
         contributors_si_credit_html: '%{slovenia}: Zawiera dane %{gu_link} oraz %{mkgp_link}
           (informacja publiczna Słowenii).'
         contributors_si_slovenia: Słowenia
@@ -2146,7 +2174,7 @@ pl:
         contributors_gb_united_kingdom: Wielka Brytania
         contributors_2_html: Szczegóły tych i innych źródeł, które zostały wykorzystane,
           aby udoskonalić OpenStreetMap, są dostępne na stronie %{contributors_page_link}.
-        contributors_2_contributors_page: Contributors (en)
+        contributors_2_contributors_page: Contributors
         contributors_footer_2_html: Włączenie danych do OpenStreetMap nie musi oznaczać,
           że udostępniający je podmiot popiera OpenStreetMap, udziela jakiejkolwiek
           gwarancji lub ponosi jakąkolwiek odpowiedzialność.
@@ -2327,6 +2355,7 @@ pl:
           farmland: Grunty rolne
           grass: Trawnik
           meadow: Łąka
+          bare_rock: Odkryte skały
           sand: Piaski
           golf: Pole golfowe
           park: Park
@@ -2340,6 +2369,7 @@ pl:
           scrubland: Zarośla
           lake: Jezioro
           reservoir: Zbiornik
+          intermittent_water: Okresowy ciek
           glacier: Lodowiec
           reef: Rafa
           wetland: Mokradła
@@ -2553,6 +2583,7 @@ pl:
       oauth2_authorizations: Autoryzacje OAuth 2
     auth_providers:
       openid_logo_alt: Zaloguj się przez OpenID
+      openid_login_button: Kontynuuj
       openid:
         title: Zaloguj się przez OpenID
         alt: Zaloguj się za pomocą adresu URL OpenID
@@ -2713,6 +2744,7 @@ pl:
   users:
     new:
       title: Zarejestruj się
+      tab_title: Rejestracja
       no_auto_account_create: Niestety nie możemy aktualnie stworzyć ci konta automatycznie.
       please_contact_support_html: Skontaktuj się z %{support_link} w celu umówienia
         się na założenie konta – postaramy się rozpatrzyć prośbę jak najszybciej.
@@ -2735,7 +2767,7 @@ pl:
       privacy_policy_title: Polityka prywatności OSMF, w tym sekcja dotycząca adresów
         e-mail
       or: lub
-      use external auth: Alternatywnie, zaloguj się przez...
+      use external auth: 'Alternatywnie, zarejestruj się przez:'
     terms:
       title: Warunki
       heading: Warunki
@@ -2809,14 +2841,18 @@ pl:
       role:
         administrator: Ten użytkownik jest administratorem
         moderator: Ten użytkownik jest moderatorem
+        importer: Ten użytkownik jest importerem
         grant:
           administrator: Przyznaj dostęp administratora
           moderator: Przyznaj dostęp moderatora
+          importer: Przyznaj rolę importera
         revoke:
           administrator: Cofnij dostęp administratora
           moderator: Cofnij dostęp moderatora
+          importer: Odwołaj rolę importera
       block_history: aktywne blokady
       moderator_history: nałożone blokady
+      revoke_all_blocks: Odwołaj wszystkie blokady
       comments: komentarze
       create_block: Zablokuj tego użytkownika
       activate_user: Aktywuj tego użytkownika
@@ -2922,6 +2958,18 @@ pl:
       confirm: Czy na pewno chcesz odwołać tę blokadę?
       revoke: Odwołaj!
       flash: Blokada została odwołana.
+    revoke_all:
+      title: Odwoływanie wszystkich blokad nałożonych na użytkownika %{block_on}
+      heading_html: Odwoływanie wszystkich blokad nałożonych na użytkownika %{block_on}
+      empty: Użytkownik %{name} nie ma aktywnych blokad.
+      confirm: Jesteś pewny, że chcesz odwołać %{active_blocks}?
+      active_blocks:
+        one: '%{count} aktywna blokada'
+        few: '%{count} aktywne blokady'
+        many: '%{count} aktywnych blokad'
+        other: ""
+      revoke: Odwołaj!
+      flash: Wszystkie aktywne blokady zostały odwołane.
     helper:
       time_future_html: Blokada wygasa za %{time}.
       until_login: Aktywna do momentu zalogowania się użytkownika.
@@ -2957,7 +3005,7 @@ pl:
     blocks_on:
       title: Blokady na użytkownika %{name}
       heading_html: Lista blokad na użytkownika %{name}
-      empty: '%{name} nie był jeszcze zablokowany.'
+      empty: Użytkownik %{name} nie był jeszcze zablokowany.
     blocks_by:
       title: Blokady nałożone przez %{name}
       heading_html: Lista blokad nałożonych przez %{name}
@@ -2986,14 +3034,31 @@ pl:
       reason: Powód blokady
       status: Status
       revoker_name: Odwołana przez
+      older: Starsze blokady
+      newer: Nowsze blokady
+    navigation:
+      all_blocks: Wszystkie blokady
+      blocks_on_me: Blokady nałożone na mnie
+      blocks_on_user: Blokady na %{user}
+      blocks_by_me: Blokady nałożone przeze mnie
+      blocks_by_user: Blokady nałożone przez %{user}
+      block: Blokada nr %{id}
   user_mutes:
     index:
+      user_mute_explainer: Wiadomości od wyciszonych użytkowników są przenoszone do
+        osobnej skrzynki odbiorczej, a ty nie otrzymasz powiadomień e-mailem.
+      user_mute_admins_and_moderators: Możesz wyciszyć administratorów i moderatorów,
+        jednak ich wiadomości nie będą wyciszone.
       table:
         tbody:
           unmute: Wyłącz wyciszenie
           send_message: Wyślij wiadomość
     create:
-      notice: Wyciszyłeś %{name}.
+      notice: Wyciszyłeś użytkownika %{name}.
+      error: Nie udało się wyciszyć użytkownika %{name}. %{full_message}
+    destroy:
+      notice: Odciszyłeś użytkownika %{name}.
+      error: Nie udało się odciszyć użytkownika. Spróbuj ponownie.
   notes:
     index:
       title: Uwagi użytkownika %{user}
@@ -3043,6 +3108,10 @@ pl:
       intro: Zauważyłeś błąd lub brak czegoś? Daj znać innym mapującym, aby mogli
         to poprawić. Przesuń znacznik do właściwej pozycji i wpisz notatkę opisującą
         problem.
+      anonymous_warning_html: Nie jesteś zalogowany. %{log_in} lub %{sign_up}, jeśli
+        chcesz otrzymywać aktualizacje tej uwagi.
+      anonymous_warning_log_in: Zaloguj się
+      anonymous_warning_sign_up: zarejestruj
       advice: Twoja uwaga jest publiczna i może zostać użyta do zaktualizowania mapy,
         nie podawaj tu więc informacji osobistych oraz informacji z map i źródeł chronionych
         prawami autorskimi.
@@ -3113,6 +3182,7 @@ pl:
       osm_france: OpenStreetMap France
       thunderforest_credit: Kafelki dzięki uprzejmości %{thunderforest_link}
       andy_allan: Andy'ego Allana
+      tracestrack_credit: Kafelki dzięki uprzejmości %{tracestrack_link}
       hotosm_credit: 'Styl kafelków: %{hotosm_link}. Hosting: %{osm_france_link}'
       hotosm_name: Humanitarian OpenStreetMap Team
     site:
index 1dc5c537ac548062dc9a93a372d6466b073a967d..530e0bb8cf600e8d192b04137efaf6c01712146a 100644 (file)
@@ -710,6 +710,10 @@ pt-PT:
       contact_the_community_html: Fique à vontade para %{contact_link} a comunidade
         OpenStreetMap caso tenha encontrado uma ligação inativa ou um erro. Deixe
         uma nota da URL exata da sua solicitação.
+    bad_request:
+      title: Pedido inválido
+      description: A operação solicitada no servidor OpenStreetMap não é válida (HTTP
+        400)
     forbidden:
       title: Proibido
       description: A operação solicitada no servidor do OpenStreetMap só está disponível
@@ -1778,8 +1782,8 @@ pt-PT:
           perto de %{place}.'
         commented_note_html: '%{commenter} reabriu uma nota comentada por ti. A nota
           fica perto de %{place}.'
-      details: Podes ver mais detalhes sobre a nota em %{url}.
-      details_html: Podes ver mais detalhes sobre a nota em %{url}.
+      details: Responde ou descobre mais sobre a nota em %{url}.
+      details_html: Responde ou descobre mais sobre a nota em %{url}.
     changeset_comment_notification:
       description: Conjunto de alterações n.º %{id}
       hi: Olá, %{to_user}.
@@ -1800,10 +1804,8 @@ pt-PT:
         partial_changeset_with_comment: com o comentário '%{changeset_comment}'
         partial_changeset_with_comment_html: com o comentário '%{changeset_comment}'
         partial_changeset_without_comment: sem comentários
-      details: Podes encontrar mais informações sobre o conjunto de alterações em
-        %{url}.
-      details_html: Podes encontrar mais informações sobre o conjunto de alterações
-        em %{url}.
+      details: Responde ou descobre mais sobre o conjunto de alterações em %{url}.
+      details_html: Responde ou descobre mais sobre o conjunto de alterações em %{url}.
       unsubscribe: Podes deixar de acompanhar as atualizações deste conjunto de alterações
         em %{url}.
       unsubscribe_html: Podes deixar de acompanhar as atualizações deste conjunto
@@ -1980,13 +1982,15 @@ pt-PT:
     new:
       title: Entrar
       tab_title: Iniciar sessão
+      login_to_authorize_html: Inicia sessão no OpenStreetMap para acederes a %{client_app_name}.
       email or username: 'E-mail ou Nome de utilizador:'
       password: Palavra-passe
       remember: Ficar autenticado entre sessões
       lost password link: Perdeste a tua palavra-passe?
       login_button: Iniciar sessão
       register now: Regista-te agora
-      with external: 'Em alternativa, usa um serviço externo para iniciares sessão:'
+      with external: ou inicia sessão com uma aplicação de terceiros
+      or: ou
       auth failure: Lamentamos, mas não foi possível iniciar sessão com os dados fornecidos.
     destroy:
       title: Sair
@@ -2157,6 +2161,12 @@ pt-PT:
         contributors_fr_credit_html: '%{france}: contém dados provenientes da Direção
           Geral de Impostos.'
         contributors_fr_france: França
+        contributors_hr_credit_html: |-
+          %{croatia}: Contém dados de %{dgu_link} e %{open_data_portal}
+          (informação pública da Croácia).
+        contributors_hr_croatia: Croácia
+        contributors_hr_dgu: Administração Geodésica Estatal da Croácia
+        contributors_hr_open_data_portal: Portal Nacional de Dados Abertos
         contributors_nl_credit_html: '%{netherlands}: Contém &copy; e dados, 2007
           (%{and_link})'
         contributors_nl_netherlands: Países Baixos
@@ -2617,6 +2627,8 @@ pt-PT:
         other: Ficheiro GPX com %{count} pontos de %{user}
       description_without_count: Ficheiro GPX de %{user}
   application:
+    basic_auth_disabled: 'A Autenticação Básica HTTP está desativada: %{link}'
+    oauth_10a_disabled: 'OAuth 1.0 e 1.0a estão desativados: %{link}'
     permission_denied: Não tens permissões para realizar essa operação
     require_cookies:
       cookies_needed: Parece que tens os "cookies" desativados - por favor, ativa-os
@@ -2639,6 +2651,7 @@ pt-PT:
       muted_users: Utilizadores Silenciados
     auth_providers:
       openid_logo_alt: Iniciar sessão com um OpenID
+      openid_login_button: Continuar
       openid:
         title: Iniciar sessão com OpenID
         alt: Iniciar sessão com um URL do OpenID
@@ -2703,6 +2716,8 @@ pt-PT:
       write_redactions: Rever dados do mapa
       read_email: ‎Ler e-mail de utilizador
       skip_authorization: Aprovar a aplicação automaticamente
+    for_roles:
+      moderator: Esta permissão é para ações disponíveis apenas para moderadores
   oauth_clients:
     new:
       title: Registar uma nova aplicação
@@ -2798,20 +2813,29 @@ pt-PT:
   users:
     new:
       title: Criar conta
+      tab_title: Registar
+      signup_to_authorize_html: Inicia sessão no OpenStreetMap para acederes a %{client_app_name}.
       no_auto_account_create: Infelizmente, e de momento, não é possível criar uma
         conta automaticamente.
       please_contact_support_html: Por favor, contacta %{support_link} para pedir
         a criação de uma conta - tentaremos tratar do pedido o mais rapidamente possível.
       support: apoio
       about:
-        header: Livre e editável
+        header: Gratuito e editável.
         paragraph_1: Ao contrário de outros mapas, o OpenStreetMap é completamente
           criado por pessoas como tu, e qualquer pessoa o pode corrigir, transferir
           e usar de forma gratuita.
-        paragraph_2: Regista-te para começares a contribuir. Iremos enviar um e-mail
-          para confirmar a tua conta.
+        paragraph_2: Regista-te para começares a contribuir.
+        welcome: Bem-vind@ ao OpenStreetMap
+      duplicate_social_email: Se já tens uma conta OpenStreetMap e desejas utilizar
+        um provedor de identidade externo, inicia sessão com a tua palavra-passe e
+        modifica as definições da tua conta.
       display name description: O nome de utilizador ficará visível publicamente.
         Poderás alterar o nome posteriormente nas configurações do teu perfil.
+      by_signing_up_html: Ao registares-te, aceitas os nossos %{tou_link}, %{privacy_policy_link}
+        e %{contributor_terms_link}.
+      tou: Termos de Utilização
+      contributor_terms: Termos de Contribuidor
       external auth: 'Autenticação por terceiros:'
       continue: Criar conta
       terms accepted: Obrigado por aceitares os novos termos de contribuidor!
@@ -2820,7 +2844,10 @@ pt-PT:
       privacy_policy: política de privacidade
       privacy_policy_title: Política de privacidade da OSMF incluindo secção sobre
         endereços de correio eletrónico
-      use external auth: Em alternativa, usa um serviço externo para iniciares sessão
+      consider_pd_html: Considero que as minhas contribuições estão no %{consider_pd_link}.
+      consider_pd: domínio público
+      or: ou
+      use external auth: ou regista-te com um serviço externo
     terms:
       title: Termos
       heading: Termos
@@ -3091,6 +3118,13 @@ pt-PT:
       revoker_name: Revogado por
       older: Blocos mais antigos
       newer: Blocos mais recentes
+    navigation:
+      all_blocks: Todos os bloqueios
+      blocks_on_me: Quem me bloqueou
+      blocks_on_user: Bloqueios a %{user}
+      blocks_by_me: Os meus bloqueios
+      blocks_by_user: Bloqueios de %{user}
+      block: 'Bloqueio #%{id}'
   user_mutes:
     index:
       title: Utilizadores Silenciados
@@ -3166,6 +3200,10 @@ pt-PT:
         o mais pormenorizada possível sobre o que pretendes ver alterado no mapa,
         para que outros mapeadores te possam ajudar. Posiciona o marcador no local
         correto e escreve uma nota que explique o problema.
+      anonymous_warning_html: Não tens sessão iniciada. Por favor, %{log_in} ou %{sign_up}
+        se quiseres receber atualizações sobre a tua nota.
+      anonymous_warning_log_in: inicia sessão
+      anonymous_warning_sign_up: regista-te
       advice: 'Lembra-te: a tua nota é pública e poderá ser usada para atualizar o
         mapa, portanto, não introduzas informações pessoais, dados de mapas ou catálogos
         protegidos por direitos de autor.'
index 28447097c12c1ac943c3e3eb05a816bfa54de87e..b2e05b488b6b35b3710e79aa753079d2fe7daa73 100644 (file)
@@ -381,7 +381,7 @@ pt:
       success: Conta eliminada.
   browse:
     deleted_ago_by_html: Excluído há %{time_ago} por %{user}
-    edited_ago_by_html: Editado há %{time_ago} por %{user}
+    edited_ago_by_html: Editado %{time_ago} por %{user}
     version: Versão
     redacted_version: Versão reduzida
     in_changeset: Conjunto de alterações
index 83a1f5f2883af5bd5458dd3659a29aa7778a9241..0023f649b954073e3c8a21e8d643f5c5e45fc9f3 100644 (file)
@@ -1834,8 +1834,8 @@ ru:
           заметок недалеко от %{place}.'
         commented_note_html: '%{commenter} открыл заново одну из вами прокомментированных
           заметок недалеко от %{place}.'
-      details: Ð\9fодÑ\80обнее о заметке %{url}.
-      details_html: 'Ð\9fодÑ\80обнее о заметке: %{url}.'
+      details: Ð\9eÑ\82веÑ\82иÑ\82Ñ\8c Ð¸Ð»Ð¸ Ñ\83знаÑ\82Ñ\8c Ð±Ð¾Ð»Ñ\8cÑ\88е о заметке %{url}.
+      details_html: 'Ð\9eÑ\82веÑ\82иÑ\82Ñ\8c Ð¸Ð»Ð¸ Ñ\83знаÑ\82Ñ\8c Ð±Ð¾Ð»Ñ\8cÑ\88е о заметке: %{url}.'
     changeset_comment_notification:
       hi: Здравствуйте, %{to_user},
       greeting: Здравствуйте,
@@ -1855,8 +1855,8 @@ ru:
         partial_changeset_with_comment: с комментарием '%{changeset_comment}'
         partial_changeset_with_comment_html: с комментарием '%{changeset_comment}'
         partial_changeset_without_comment: без комментария
-      details: Дополнительные сведения о пакете правок можно найти на %{url}.
-      details_html: Ð\94ополниÑ\82елÑ\8cнÑ\8bе Ñ\81ведениÑ\8f Ð¾ Ð¿Ð°ÐºÐµÑ\82е Ð¿Ñ\80авок Ð¼Ð¾Ð¶Ð½Ð¾ Ð½Ð°Ð¹Ñ\82и на %{url}.
+      details: 'Ответить или узнать больше о пакете правок: %{url}.'
+      details_html: Ð\9eÑ\82веÑ\82иÑ\82Ñ\8c Ð¸Ð»Ð¸ Ñ\83знаÑ\82Ñ\8c Ð±Ð¾Ð»Ñ\8cÑ\88е Ð¾ Ð¿Ð°ÐºÐµÑ\82е Ð¿Ñ\80авок Ð¼Ð¾Ð¶Ð½Ð¾ на %{url}.
       unsubscribe: Чтобы отказаться от новых сообщений для этого пакета правок, перейдите
         по ссылке %{url} и нажмите кнопку "Отписаться".
       unsubscribe_html: Чтобы отказаться от подписки на обновления этого набора изменений,
index f4c574c4fdeb1bcc4b051f0126c8f07afbd9a6e3..d220aae7f7adac4346b92a5d51008a5deded593d 100644 (file)
@@ -1348,6 +1348,8 @@ skr-arab:
       comment: تبصرہ
     new:
       title: نواں نوٹ
+      anonymous_warning_log_in: لاگ ان
+      anonymous_warning_sign_up: سائن اپ
       add: نوٹ شامل کرو
   javascripts:
     close: بند کرو
index 7c3a19f10688dc9b9579aa828ae80cfebc955ba7..7e046f0def796bee44ae6029d039016a75cf440e 100644 (file)
@@ -15,6 +15,7 @@
 # Author: Mtej
 # Author: Peter Klofutar
 # Author: Pickle12
+# Author: Pipi Ferry
 # Author: Ruila
 # Author: Skalcaa
 # Author: Stefanb
@@ -522,6 +523,8 @@ sl:
         in povezavo, ki ste jo kliknili.
     show:
       title: 'Nabor sprememb: %{id}'
+      created: 'Ustvarjeno: %{when}'
+      closed: 'Zaprto: %{when}'
       created_ago_html: Ustvaril_a %{time_ago}
       closed_ago_html: Zaprto %{time_ago}
       created_ago_by_html: Ustvaril %{user} %{time_ago}
@@ -603,6 +606,7 @@ sl:
     show:
       title: Dnevnik uporabnika %{user} | %{title}
       user_title: Dnevnik uporabnika %{user}
+      discussion: Pogovor
       leave_a_comment: Napiši komentar
       login_to_leave_a_comment_html: '%{login_link} za vpis komentarja'
       login: Prijava
@@ -802,7 +806,7 @@ sl:
           fountain: Vodomet
           fuel: Polnilna postaja
           gambling: Igre na srečo
-          grave_yard: Pokopališče
+          grave_yard: Pokopališče v bližini cerkve
           grit_bin: Posoda za pesek
           hospital: Bolnišnica
           hunting_stand: Lovska preža
@@ -834,7 +838,7 @@ sl:
           pub: Pivnica
           public_bath: Kopališče
           public_bookcase: Javna knjižna omara
-          public_building: Javne stavba
+          public_building: Javna stavba
           ranger_station: Gozdarska postaja
           recycling: Reciklirna točka
           restaurant: Restavracija
@@ -874,7 +878,7 @@ sl:
           "yes": Meja
         bridge:
           aqueduct: Akvadukt
-          boardwalk: Sprehajališče
+          boardwalk: Sprehajališče iz desk
           suspension: Viseči most
           swing: Vrteči most
           viaduct: Viadukt
@@ -885,7 +889,7 @@ sl:
           barn: Skedenj
           bungalow: Bungalov
           cabin: Brunarica
-          chapel: Kapelica
+          chapel: Kapela
           church: Cerkveno poslopje
           civic: Občinska stavba
           college: VIsokošolska stavba
@@ -894,7 +898,7 @@ sl:
           detached: Osamljena hiša
           dormitory: Študentski dom
           duplex: Dvostanovanjska hiša
-          farm: Kmetija
+          farm: Hiša kmetije
           farm_auxiliary: Pomožna kmetijska stavba
           garage: Garaža
           garages: Garaže
@@ -903,7 +907,7 @@ sl:
           hospital: Poslopje bolnišnice
           hotel: Poslopje hotela
           house: Hiša
-          houseboat: Bivalni čoln
+          houseboat: Bivalni čoln - Hiša-čoln
           hut: Koča
           industrial: Industrijski objekt
           kindergarten: Poslopje vrtca
@@ -918,7 +922,7 @@ sl:
           semidetached_house: Dvojček
           service: Servisna stavba
           shed: Lopa
-          stable: Hlev
+          stable: Hlev za konje
           static_caravan: Stanovanjska prikolica
           temple: Tempelj
           terrace: Terasa
@@ -1009,7 +1013,7 @@ sl:
           stop: Stop znak
           street_lamp: Ulična svetilka
           tertiary: Lokalna cesta
-          tertiary_link: Terciarna cesta
+          tertiary_link: Priključek na lokalno cesto
           track: Kolovoz
           traffic_mirror: Prometno ogledalo
           traffic_signals: Prometna signalizacija
@@ -1018,7 +1022,7 @@ sl:
           trunk_link: Priključek na hitro cesto
           turning_circle: Obračališče
           turning_loop: Obračališče
-          unclassified: Neopredeljena cesta
+          unclassified: Neopredeljena cesta - Neklasificirana cesta
           "yes": Cesta
         historic:
           aircraft: Zgodovinsko letalo
@@ -1052,7 +1056,7 @@ sl:
           tomb: Grobnica
           tower: Stolp
           wayside_chapel: Obcestna kapelica
-          wayside_cross: Križ
+          wayside_cross: Obpotni križ
           wayside_shrine: Kapelica
           wreck: Razbitina
           "yes": Zgodovinski kraj
@@ -1063,12 +1067,12 @@ sl:
           aquaculture: Akvakultura
           basin: Čistilni bazen
           brownfield: Gradbišče
-          cemetery: Pokopališče
+          cemetery: Pokopališče, ki ni ob cerkvi
           commercial: Poslovna cona
           conservation: Zaščiteno območje
           construction: Gradbišče
           farmland: Kmetijsko zemljišče
-          farmyard: Kmetija
+          farmyard: Kmetija - dvorišče
           forest: Gozd
           garages: Garaže
           grass: Trata
@@ -1303,7 +1307,7 @@ sl:
           funicular: Žična vzpenjača
           halt: Železniško postajališče
           junction: Križišče železnic
-          level_crossing: Prehod
+          level_crossing: Nivojski prehod
           light_rail: Mestna železnica
           miniature: Miniaturna železnica
           monorail: Monorail
@@ -1368,7 +1372,7 @@ sl:
           erotic: Erotična trgovina
           estate_agent: Nepremičninska agencija
           fabric: Prodajalna blaga
-          farm: Kmečka trgovina
+          farm: Kmetijska trgovina
           fashion: Modna trgovina
           fishing: Prodajalna ribiške opreme
           florist: Cvetličarna
@@ -1442,7 +1446,7 @@ sl:
           wine: Vinoteka
           "yes": Trgovina
         tourism:
-          alpine_hut: Koča
+          alpine_hut: Alpska koča
           apartment: Počitniški apartma
           artwork: Umetnina
           attraction: Zanimivost
@@ -1450,7 +1454,7 @@ sl:
           cabin: Turistično prenočišče
           camp_pitch: Prostor za kampiranje
           camp_site: Kamp
-          caravan_site: Kamp
+          caravan_site: Kamp - Prostor za avtodome/bivalne prikolice
           chalet: Počitniška hišica
           gallery: Galerija
           guest_house: Penzion
@@ -2173,6 +2177,10 @@ sl:
           %{france}: Vsebuje podatke iz
           Direction Générale des Impôts.
         contributors_fr_france: Francija
+        contributors_hr_credit_html: |-
+          %{croatia}: Vsebuje podatke iz %{dgu_link} in %{open_data_portal}
+          (javne informacije Hrvaške).
+        contributors_hr_croatia: Hrvaška
         contributors_nl_credit_html: '%{netherlands}: Vsebuje podatke © IN, 2007 (%{and_link})'
         contributors_nl_netherlands: Nizozemska
         contributors_nz_credit_html: |-
@@ -3189,6 +3197,8 @@ sl:
       intro: Ste opazili napako ali pomanjkljivost? Obvestite druge kartografe o tem,
         da lahko to popravimo. Premaknite označevalec na pravo mesto in vpišite opombo,
         v kateri pojasnite težavo.
+      anonymous_warning_log_in: Prijavite se
+      anonymous_warning_sign_up: Registrirajte se
       advice: Vaša opomba je javna in se lahko uporabi za posodobitev zemljevida.
         Ne vnašajte osebnih podatkov ali podatkov iz avtorsko varovanih zemljevidov
         ali imenikov.
index b09af786ced5ffe55de7b07220f91a420ad346c7..ad4b00b3fe73b52731497c4e18de97aa17ade3e4 100644 (file)
@@ -1462,7 +1462,7 @@ sr:
           места %{place}.'
         commented_note: '%{commenter} је реактивирао белешку мапе коју сте коментарисали.
           Белешка је у близини места %{place}.'
-      details: Ð\92иÑ\88е Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\98а Ð¾ Ð±ÐµÐ»ÐµÑ\88Ñ\86и Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¿Ñ\80онаÑ\92е на %{url}.
+      details: Ð\9eдговоÑ\80иÑ\82е Ð¸Ð»Ð¸ Ñ\81азнаÑ\98Ñ\82е Ð²Ð¸Ñ\88е Ð¾ Ð±ÐµÐ»ÐµÑ\88Ñ\86и на %{url}.
     changeset_comment_notification:
       hi: Поздрав, %{to_user},
       greeting: Поздрав,
@@ -1477,7 +1477,7 @@ sr:
           мапе који надгледате и који је направио %{changeset_author}'
         partial_changeset_with_comment: са коментаром „%{changeset_comment}”
         partial_changeset_without_comment: без коментара
-      details: Ð\92иÑ\88е Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\98а Ð¾ Ñ\87еÑ\98нÑ\9fÑ\81еÑ\82овима Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¿Ñ\80онаÑ\92е на %{url}.
+      details: Ð\9eдговоÑ\80иÑ\82е Ð¸Ð»Ð¸ Ñ\81азнаÑ\98Ñ\82е Ð²Ð¸Ñ\88е Ð¾ Ñ\81еÑ\82овима Ð¿Ñ\80омена на %{url}.
       unsubscribe: Можете одјавити обавештења овог скупа измена на %{url}.
   confirmations:
     confirm:
index 184082f24e115d5275b0818ceac0baa2459f816c..98db2c6ca2366b16c766ec8dde1beb80162651b0 100644 (file)
@@ -369,6 +369,7 @@ sv:
     deleted_ago_by_html: Raderades %{time_ago} av %{user}
     edited_ago_by_html: Redigerades %{time_ago} av %{user}
     version: Version
+    redacted_version: Redigerad version
     in_changeset: Ändringsuppsättning
     anonymous: anonym
     no_comment: (inga kommentarer)
@@ -381,7 +382,10 @@ sv:
       other: '%{count} sträckor'
     download_xml: Ladda ner XML
     view_history: Visa historik
+    view_unredacted_history: Visa oredigerad historik
     view_details: Visa detaljer
+    view_redacted_data: Visa redigerad data
+    view_redaction_message: Visa redigeringsmeddelande
     location: 'Plats:'
     node:
       title_html: 'Nod: %{name}'
@@ -503,8 +507,24 @@ sv:
         created: Skapad
         closed: Stängd
         belongs_to: Författare
+    subscribe:
+      heading: Prenumerera på följande diskussion om ändringsuppsättning?
+      button: Prenumerera på diskussion
+    unsubscribe:
+      heading: Avsluta prenumeration på följande diskussion om ändringsuppsättning?
+      button: Sluta prenumerera på diskussion
+    heading:
+      title: Ändringsuppsättning %{id}
+      created_by_html: Skapades av %{link_user} %{created}.
+    no_such_entry:
+      title: Ingen sådan ändringsuppsättning
+      heading: 'Inget inlägg med ID: %{id}'
+      body: Det finns tyvärr ingen ändringsuppsättning med ID:t %{id}. Kontrollera
+        stavningen eller så kanske du tryckt på fel länk.
     show:
       title: 'Ändringsuppsättning: %{id}'
+      created: 'Skapades: %{when}'
+      closed: 'Stängdes: %{when}'
       created_ago_html: Skapades %{time_ago}
       closed_ago_html: Stängdes %{time_ago}
       created_ago_by_html: Skapades %{time_ago} av %{user}
@@ -588,6 +608,7 @@ sv:
     show:
       title: '%{user}s dagbok | %{title}'
       user_title: '%{user}s dagbok'
+      discussion: Diskussion
       leave_a_comment: Lämna en kommentar
       login_to_leave_a_comment_html: '%{login_link} för att lämna en kommentar'
       login: Logga in
@@ -640,6 +661,12 @@ sv:
       comment: Kommentar
       newer_comments: Nyare kommentarer
       older_comments: Äldre kommentarer
+    subscribe:
+      heading: Prenumerera på följande diskussion om dagboksinlägg?
+      button: Prenumerera på diskussion
+    unsubscribe:
+      heading: Avsluta prenumeration på följande diskussion om dagboksinlägg?
+      button: Avsluta prenumeration på diskussion
   doorkeeper:
     errors:
       messages:
@@ -676,6 +703,10 @@ sv:
       contact: kontakta
       contact_the_community_html: Gå gärna till %{contact_link} OpenStreetMap-gemenskapen
         om du har hittat en trasig länk/bugg. Anteckna din förfrågas exakta webbadress.
+    bad_request:
+      title: Felaktig förfrågan
+      description: Operationen du begärde från OpenStreetMaps server är inte giltig
+        (HTTP 400)
     forbidden:
       title: Förbjudet
       description: Åtgärden du begärde på OpenStreetMap-servern är endast tillgänglig
@@ -1607,6 +1638,7 @@ sv:
       och fri att använda under en öppen licens.
     intro_2_create_account: Skapa ett användarkonto
     partners_fastly: Fastly
+    partners_corpmembers: OSMF-företagsmedlemmar
     partners_partners: partners
     tou: Användarvillkor
     osm_offline: OpenStreetMap-databasen är inte tillgänglig just nu, då nödvändigt
@@ -1628,6 +1660,7 @@ sv:
     more: Mer
   user_mailer:
     diary_comment_notification:
+      description: 'OpenStreetMap dagboksinlägg #%{id}'
       subject: '[OpenStreetMap] %{user} kommenterade på ett dagboksinlägg'
       hi: Hej %{to_user},
       header: '%{from_user} har kommenterat dagboksinlägget på OpenStreetMap med rubriken
@@ -1638,6 +1671,9 @@ sv:
         %{commenturl} eller skicka ett meddelande till författaren på %{replyurl}
       footer_html: Du kan också läsa kommentaren på %{readurl} och du kan kommentera
         på %{commenturl} eller skicka ett meddelande till författaren på %{replyurl}
+      footer_unsubscribe: Du kan avsluta prenumerationen från diskussionen på %{unsubscribeurl}
+      footer_unsubscribe_html: Du kan avsluta prenumerationen från diskussionen på
+        %{unsubscribeurl}
     message_notification:
       subject: '[OpenStreetMap] %{message_title}'
       hi: Hej %{to_user},
@@ -1698,6 +1734,7 @@ sv:
       click_the_link: Om det är du, klicka på länken nedan för att återställa ditt
         lösenord.
     note_comment_notification:
+      description: 'OpenStreetMap not #%{id}'
       anonymous: En anonym användare
       greeting: Hej,
       commented:
@@ -1736,9 +1773,10 @@ sv:
           på. Anteckningen är nära %{place}.'
         commented_note_html: '%{commenter} har återaktiverat en kartanteckning du
           har kommenterat på. Anteckningen är nära %{place}.'
-      details: Fler detaljer om anteckningen finns på %{url}.
-      details_html: Fler detaljer om anteckningen finns på %{url}.
+      details: Svara eller ta reda på mer anteckningen på %{url}.
+      details_html: Svara eller ta reda på mer om anteckningen på %{url}.
     changeset_comment_notification:
+      description: 'OpenStreetMap ändringsuppsättning #%{id}'
       hi: Hej %{to_user},
       greeting: Hej,
       commented:
@@ -1756,12 +1794,12 @@ sv:
         partial_changeset_with_comment: med kommentar '%{changeset_comment}'
         partial_changeset_with_comment_html: med kommentar '%{changeset_comment}'
         partial_changeset_without_comment: utan kommentar
-      details: Fler detaljer om ändringsuppsättningen finns på %{url}.
-      details_html: Fler detaljer om ändringsuppsättningen finns på %{url}.
-      unsubscribe: För att avsluta prenumerationen av uppdateringar i denna ändringsuppsättning,
-        besök %{url} och klicka på "Avprenumerera".
-      unsubscribe_html: För att avsluta prenumerationen av uppdateringar i denna ändringsuppsättning,
-        besök %{url} och klicka på "Avprenumerera".
+      details: Svara eller ta reda på mer om ändringsuppsättningen på %{url}.
+      details_html: Svara eller ta reda på mer om ändringsuppsättningen på %{url}.
+      unsubscribe: Du kan avsluta prenumeration på uppdateringar i denna ändringsuppsättning
+        på %{url}.
+      unsubscribe_html: Du kan avsluta prenumeration på uppdateringar i denna ändringsuppsättning
+        på %{url}.
   confirmations:
     confirm:
       heading: Kontrollera din e-post!
@@ -1928,13 +1966,15 @@ sv:
     new:
       title: Logga in
       tab_title: Logga in
+      login_to_authorize_html: Logga in på OpenStreetMap för att komma åt %{client_app_name}.
       email or username: E-postadress eller Användarnamn
       password: Lösenord
       remember: Kom ihåg mig
       lost password link: Glömt ditt lösenord?
       login_button: Logga in
       register now: Registrera dig nu
-      with external: 'Alternativt kan du använda en tredje part för att logga in:'
+      with external: eller logga in med en tredje part
+      or: eller
       auth failure: Kunde inte logga in med de uppgifterna.
     destroy:
       title: Logga ut
@@ -2096,6 +2136,8 @@ sv:
         contributors_at_cc_by_at_with_amendments: CC BY AT med tillägg
         contributors_au_australia: Australien
         contributors_au_geoscape_australia: Geoscape Australien
+        contributors_au_cc_licence: Creative Commons Erkännande 4.0 Internationell-licens
+          (CC BY 4.0)
         contributors_ca_credit_html: |-
           %{canada}: Innehåller data från
           GeoBase&reg;, GeoGratis (&copy; Department of Natural
@@ -2103,13 +2145,23 @@ sv:
           Resources Canada), och StatCan (Geography Division,
           Statistics Canada).
         contributors_ca_canada: Kanada
+        contributors_cz_credit_html: '%{czechia}: Innehåller data från den statliga
+          administrationen för landmäteri och Cadastre licensierad under %{cc_licence_link}'
         contributors_cz_czechia: Tjeckien
+        contributors_cz_cc_licence: Creative Commons Erkännande 4.0 Internationell
+          (CC BY 4.0)
+        contributors_fi_credit_html: '%{finland}: Innehåller data från Lantmäteriet
+          i Finlands Terrängdatabas och andra datauppsättningar, under %{nlsfi_license_link}.'
         contributors_fi_finland: Finland
         contributors_fi_nlsfi_license: NLSFI-licens
         contributors_fr_credit_html: |-
           %{france}: Innehåller data hämtade från
           Direction Générale des Impôts.
         contributors_fr_france: Frankrike
+        contributors_hr_credit_html: '%{croatia}: Innehåller data från %{dgu_link}
+          och %{open_data_portal} (offentlig information om Kroatien)'
+        contributors_hr_croatia: Kroatien
+        contributors_hr_dgu: Kroatiens statliga geodatiska förvaltning
         contributors_nl_credit_html: '%{netherlands}: Innehåller &copy; AND data,
           2007 (%{and_link}).'
         contributors_nl_netherlands: Nederländerna
@@ -2123,7 +2175,12 @@ sv:
           %{serbia}: Innehåller data från %{rgz_link} och %{open_data_portal}
           (offentlig information om Serbien), 2018.
         contributors_rs_serbia: Serbien
+        contributors_rs_rgz: Serbiens geodetiska myndighet
+        contributors_rs_open_data_portal: Nationell portal för öppen data
+        contributors_si_credit_html: '%{slovenia}: Innehåller data från %{gu_link}
+          och %{mkgp_link} (offentlig information om Slovenien)'
         contributors_si_slovenia: Slovenien
+        contributors_si_gu: Lantmäteri- och kartverket
         contributors_si_mkgp: Ministeriet för Jordbruk, Skogsbruk och Livsmedel
         contributors_es_credit_html: |-
           %{spain}: Innehåller data hämtade från
@@ -2349,7 +2406,7 @@ sv:
           heathland: Hed
           scrubland: Buskskog
           lake: Sjö
-          reservoir: vattenmagasin
+          reservoir: Vattenmagasin
           intermittent_water: Intermittent vattenkropp
           glacier: Glaciär
           reef: Rev
@@ -2527,6 +2584,8 @@ sv:
       identifiable: IDENTIFIERBAR
       private: PRIVAT
       trackable: SPÅRBAR
+      details_with_tags_html: '%{time_ago} av %{user} i %{tags}'
+      details_without_tags_html: '%{time_ago} av %{user}'
     index:
       public_traces: Publika GPS-spår
       my_gps_traces: Mina GPS-spår
@@ -2559,6 +2618,8 @@ sv:
         other: GPX-fil med %{count} punkter från %{user}
       description_without_count: GPX-fil från %{user}
   application:
+    basic_auth_disabled: 'Grundläggande HTTP-autentisering är inaktiverat: %{link}'
+    oauth_10a_disabled: 'OAuth 1.0 och 1.0a är inaktiverade: %{link}'
     permission_denied: Du har inte behörighet för denna åtgärd
     require_cookies:
       cookies_needed: Du verkar ha inaktiverat kakor - aktivera kakor i din webbläsare
@@ -2581,6 +2642,7 @@ sv:
       muted_users: Tystade användare
     auth_providers:
       openid_logo_alt: Logga in med ett OpenID
+      openid_login_button: Fortsätt
       openid:
         title: Logga in med OpenID
         alt: Logga in med en OpenID-URL
@@ -2646,6 +2708,9 @@ sv:
       write_redactions: Omarbeta kartdata
       read_email: Läs användarens e-postadress
       skip_authorization: Godkänn applikation automatiskt
+    for_roles:
+      moderator: Denna behörighet är till för åtgärder som endast är tillgängliga
+        för moderatorer
   oauth_clients:
     new:
       title: Registrera en ny applikation
@@ -2741,20 +2806,25 @@ sv:
   users:
     new:
       title: Registrera
+      tab_title: Registrera
+      signup_to_authorize_html: Registrera dig på OpenStreetMap för att få åtkomst
+        till %{client_app_name}
       no_auto_account_create: Tyvärr kan vi för närvarande inte kan skapa ett konto
         åt dig automatiskt.
       please_contact_support_html: Kontakta %{support_link} för att ordna att ett
         konto ska skapas - vi kommer att försöka ta itu med begäran så fort som möjligt.
       support: support
       about:
-        header: Fri och redigerbar
+        header: Fri och redigerbar.
         paragraph_1: Till skillnad från andra kartor är OpenStreetMap helt skapad
           av människor som du, och det är gratis för alla att fixa, uppdatera, ladda
           ner och använda.
-        paragraph_2: Registrera dig för att börja bidra. Vi skickar ett e-postmeddelande
-          för att bekräfta ditt konto.
+        paragraph_2: Registrera dig för att börja bidra.
+        welcome: Välkommen till OpenStreetMap
       display name description: Ditt offentligt visade användarnamn. Du kan ändra
         detta senare i alternativ.
+      tou: användarvillkor
+      contributor_terms: bidragsvillkor
       external auth: 'Tredjepartsautentisering:'
       continue: Registrera
       terms accepted: Tack för att du accepterat de nya villkoren för bidrag till
@@ -2763,7 +2833,10 @@ sv:
         för mer information.
       privacy_policy: integritetspolicy
       privacy_policy_title: OSMFs integritetspolicy inklusive avsnitt om e-postadresser
-      use external auth: Alternativt kan du använda en tredje part för att logga in
+      consider_pd_html: Jag anser mina bidrag vara i %{consider_pd_link}.
+      consider_pd: public domain
+      or: eller
+      use external auth: eller registrera med en tredje part
     terms:
       title: Villkor för deltagare
       heading: Villkor för deltagare
@@ -2868,6 +2941,11 @@ sv:
     index:
       title: Användare
       heading: Användare
+      older: Äldre användare
+      newer: Nyare användare
+      found_users:
+        one: '%{count} användare hittade'
+        other: '%{count} användare hittade'
       summary_html: '%{name} skapades från %{ip_address} den %{date}'
       summary_no_ip_html: '%{name} skapad den %{date}'
       confirm: Bekräfta valda användare
@@ -3024,6 +3102,15 @@ sv:
       reason: Orsak till blockering
       status: Status
       revoker_name: Återkallad av
+      older: Äldre blockeringar
+      newer: Nya blockeringar
+    navigation:
+      all_blocks: Alla blockeringar
+      blocks_on_me: Blockeringar på mig
+      blocks_on_user: Blockeringar på %{user}
+      blocks_by_me: Blockeringar av mig
+      blocks_by_user: Blockeringar av %{user}
+      block: 'Blockering #%{id}'
   user_mutes:
     index:
       title: Tystade användare
@@ -3096,6 +3183,10 @@ sv:
       intro: Upptäckt ett misstag eller något som saknas? Låt andra karterare veta
         så att vi kan fixa det. Flytta markören till rätt position och skriv in en
         kommentar som förklarar problemet.
+      anonymous_warning_html: Du är inte inloggad. %{log_in} eller %{sign_up} om du
+        vill få uppdateringar för din anteckning.
+      anonymous_warning_log_in: logga in
+      anonymous_warning_sign_up: registrera dig
       advice: Din anteckning är offentlig och kan användas för att uppdatera kartan,
         så skriv inte personuppgifter eller information från upphovsrättsligt skyddade
         kartor eller kataloger.
@@ -3144,6 +3235,7 @@ sv:
         standard: Standard
         cycle_map: Cykelkarta
         transport_map: Transportkarta
+        tracestracktop_topo: Tracetrack Topo
         hot: Humanitärt
       layers:
         header: Kartskikt
index f5335238226d73be11837a9d416d43cb40c4e382..8249f046b5a1ce78e5e378a291227b9e39137117 100644 (file)
@@ -708,6 +708,10 @@ tr:
       contact_the_community_html: Bozuk bir bağlantı/hata bulduysanız OpenStreetMap
         topluluğuna %{contact_link} bağlantısıyla iletmekten çekinmeyin. İsteğinizin
         tam URL'sini not edin.
+    bad_request:
+      title: Geçersiz İstek
+      description: OpenStreetMap sunucusunda talep ettiğiniz işlem geçerli değil (HTTP
+        400)
     forbidden:
       title: Yasaklı
       description: OpenStreetMap sunucusunda talep ettiğiniz işlem sadece yöneticiler
@@ -1782,8 +1786,10 @@ tr:
           Not, %{place} yakınlarında yer almakta.'
         commented_note_html: '%{commenter}, yorumladığınız bir harita notunu yeniden
           etkinleştirdi. Not, %{place} yakınlarında yer almakta.'
-      details: Not hakkındaki ayrıntılı bilgiler %{url} bağlantısında görülebilir.
-      details_html: Notla ilgili daha fazla ayrıntı %{url} adresinde bulunabilir.
+      details: '%{url} bağlantısındaki notu yanıtlayın veya not hakkında daha fazla
+        bilgi edinin.'
+      details_html: '%{url} bağlantısındaki notu yanıtlayın veya not hakkında daha
+        fazla bilgi edinin.'
     changeset_comment_notification:
       description: 'OpenStreetMap Değişiklik Kaydı #%{id}'
       hi: Merhaba %{to_user},
@@ -1804,9 +1810,10 @@ tr:
         partial_changeset_with_comment: '''%{changeset_comment}'' yorumuyla'
         partial_changeset_with_comment_html: '''%{changeset_comment}'' yorumuyla'
         partial_changeset_without_comment: yorumsuz
-      details: Değişiklik kaydıyla ilgili daha fazla bilgi %{url} sayfasından edinebilirsiniz.
-      details_html: Değişiklik kümesiyle ilgili daha fazla ayrıntı %{url} adresinde
-        bulunabilir.
+      details: '%{url} bağlantısına yanıt verin veya değişiklik seti hakkında daha
+        fazla bilgi edinin.'
+      details_html: '%{url} bağlantısına yanıt verin veya değişiklik seti hakkında
+        daha fazla bilgi edinin.'
       unsubscribe: Bu değişiklik kaydındaki güncellemelere ilişkin aboneliğinizi %{url}
         adresinden iptal edebilirsiniz.
       unsubscribe_html: Bu değişiklik kaydındaki güncellemelere ilişkin aboneliğinizi
@@ -2643,6 +2650,8 @@ tr:
         other: '%{user} tarafından %{count} noktalı GPX dosyası'
       description_without_count: '%{user} tarafından GPX dosyası'
   application:
+    basic_auth_disabled: 'HTTP Temel Kimlik Doğrulaması devre dışı: %{link}'
+    oauth_10a_disabled: 'OAuth 1.0 ve 1.0a devre dışı bırakıldı: %{link}'
     permission_denied: Bu eyleme erişme izniniz yok
     require_cookies:
       cookies_needed: Çerezleri devre dışı bırakmış görünüyorsunuz - devam etmeden
@@ -3210,6 +3219,10 @@ tr:
       intro: Bir hata mı buldunuz ya da eksik bir şey mi var? Bu sorunun düzeltilebilmesi
         için diğer haritacılara bildirin. İmleci doğru konuma taşıyın ve sorunu açıklayan
         bir not yazın.
+      anonymous_warning_html: Giriş yapmadınız. Notunuzla ilgili güncellemeleri almak
+        istiyorsanız lütfen %{log_in} veya %{sign_up}.
+      anonymous_warning_log_in: oturum aç
+      anonymous_warning_sign_up: kaydol
       advice: Notunuz herkese açıktır ve haritayı güncellemek için kullanılabilir,
         bu nedenle kişisel bilgilerinizi veya telif hakkıyla korunan haritalar veya
         dizin listelerinden bilgi girmeyin.
index a2b46449b2abdd0863ada85af20e63f90add2070..48d3e2c4b8180733d423812ec4ffe151189775ad 100644 (file)
@@ -100,7 +100,7 @@ uk:
       diary_comment: Коментарі щоденника
       diary_entry: Запис щоденника
       friend: Друг
-      issue: Звіт
+      issue: Звернення
       language: Мова
       message: Повідомлення
       node: Точка
@@ -572,15 +572,15 @@ uk:
         він стане закритим.
       comment_by_html: Коментар від %{user} %{time_ago}
       hidden_comment_by_html: Прихований коментар від %{user} %{time_ago}
-      changesetxml: XML опис набору змін
+      changesetxml: Набір змін в XML
       osmchangexml: osmChange XML
     paging_nav:
       nodes: Точки (%{count})
-      nodes_paginated: Точки (%{x}-%{y} із %{count})
+      nodes_paginated: Точки (%{x}-%{y} з %{count})
       ways: Лінії (%{count})
-      ways_paginated: Лінії (%{x}-%{y} із %{count})
+      ways_paginated: Лінії (%{x}-%{y} з %{count})
       relations: Зв’язки (%{count})
-      relations_paginated: Зв’язки (%{x}-%{y} із %{count})
+      relations_paginated: Зв’язки (%{x}-%{y} з %{count})
     timeout:
       sorry: На жаль, перелік наборів змін, який ви запросили, потребує забагато часу
         для завантаження.
@@ -742,6 +742,10 @@ uk:
       contact_the_community_html: Будь ласка, %{contact_link} зі спільнотою OpenStreetMap,
         якщо ви знайшли несправне посилання або помилку. Запишіть точну URL-адресу
         вашого запиту.
+    bad_request:
+      title: Хибний запит
+      description: Операція, яку ви запитали на сервері OpenStreetMap, не є дійсною
+        (HTTP 400)
     forbidden:
       title: Заборонено
       description: Дія, яку ви намагались виконати, доступна лише адміністраторам
@@ -1089,7 +1093,7 @@ uk:
           memorial: Меморіал
           milestone: Історичний межовий стовп
           mine: Копальня
-          mine_shaft: Шахтний вал
+          mine_shaft: Шахтний ствол
           monument: Пам’ятник
           railway: Історична залізниця
           roman_road: Римська дорога
@@ -1590,7 +1594,7 @@ uk:
         other: ""
       no_reports: Скарг немає
       report_created_at_html: Вперше повідомлено %{datetime}
-      last_resolved_at_html: Востаннє розв'язано %{datetime}
+      last_resolved_at_html: Востаннє розвʼязано %{datetime}
       last_updated_at_html: В останнє оновлено %{datetime}, %{displayname}
       resolve: Розв'язати
       ignore: Ігнорувати
@@ -1736,7 +1740,7 @@ uk:
       had_added_you: '%{user} додав Вас як друга в OpenStreetMap.'
       see_their_profile: Ви можете побачити їх профіль на %{userurl}.
       see_their_profile_html: Ви можете ознайомитись з його/її профілем - %{userurl}.
-      befriend_them: Ð\92и Ñ\82акож Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð¾Ð´Ð°Ñ\82и Ñ\97Ñ\85 Ñ\83 Ñ\8fкоÑ\81Ñ\82Ñ\96 друзів %{befriendurl}.
+      befriend_them: Ð\92и Ñ\82акож Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð¾Ð´Ð°Ñ\82и Ñ\97Ñ\85 Ñ\8fк друзів %{befriendurl}.
       befriend_them_html: Ви також можете додати його/її до друзів %{befriendurl}.
     gpx_description:
       description_with_tags_html: 'Схоже це ваш файл GPX %{trace_name}, що має опис
@@ -1818,8 +1822,8 @@ uk:
           біля %{place}.'
         commented_note_html: '%{commenter} поновив нотатку, прокоментовану вами, що
           знаходиться біля %{place}.'
-      details: Ð\94окладнÑ\96Ñ\88е Ð¿Ñ\80о Ð½Ð¾Ñ\82аÑ\82кÑ\83 %{url}.
-      details_html: Ð\94окладнÑ\96Ñ\88е Ð¿Ñ\80о Ð½Ð¾Ñ\82аÑ\82кÑ\83 %{url}.
+      details: Ð\94айÑ\82е Ð²Ñ\96дповÑ\96дÑ\8c Ð°Ð±Ð¾ Ð´Ñ\96знайÑ\82еÑ\81Ñ\8f Ð±Ñ\96лÑ\8cÑ\88е Ð¿Ñ\80о Ð½Ð¾Ñ\82аÑ\82кÑ\83 Ð·Ð° %{url}.
+      details_html: Ð\94айÑ\82е Ð²Ñ\96дповÑ\96дÑ\8c Ð°Ð±Ð¾ Ð´Ñ\96знайÑ\82еÑ\81Ñ\8f Ð±Ñ\96лÑ\8cÑ\88е Ð¿Ñ\80о Ð½Ð¾Ñ\82аÑ\82кÑ\83 Ð·Ð° %{url}.
     changeset_comment_notification:
       description: 'Набір змін OpenStreetMap #%{id}'
       hi: Привіт %{to_user},
@@ -1840,8 +1844,8 @@ uk:
         partial_changeset_with_comment: з коментарем '%{changeset_comment}'
         partial_changeset_with_comment_html: з коментарем '%{changeset_comment}'
         partial_changeset_without_comment: без коментарів
-      details: Ð\91Ñ\96лÑ\8cÑ\88е Ð´ÐµÑ\82алей Ð¿Ñ\80о Ð·Ð¼Ñ\96ни, Ñ\8fкÑ\96 Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð±Ñ\83Ñ\82и Ð·Ð½Ð°Ð¹Ð´ÐµÐ½Ñ\96 Ð² %{url}.
-      details_html: Ð\91Ñ\96лÑ\8cÑ\88е Ð´ÐµÑ\82алей Ð¿Ñ\80о Ð½Ð°Ð±Ñ\96Ñ\80 Ð·Ð¼Ñ\96н Ð¼Ð¾Ð¶Ð½Ð° Ð·Ð½Ð°Ð¹Ñ\82и Ð·Ð° Ð¿Ð¾Ñ\81иланнÑ\8fм - %{url}.
+      details: Ð\94айÑ\82е Ð²Ñ\96дповÑ\96дÑ\8c Ð°Ð±Ð¾ Ð´Ñ\96знайÑ\82еÑ\81Ñ\8f Ð±Ñ\96лÑ\8cÑ\88е Ð¿Ñ\80о Ð½Ð°Ð±Ñ\96Ñ\80 Ð·Ð¼Ñ\96н Ð·Ð° %{url}.
+      details_html: Ð\94айÑ\82е Ð²Ñ\96дповÑ\96дÑ\8c Ð°Ð±Ð¾ Ð´Ñ\96знайÑ\82еÑ\81Ñ\8f Ð±Ñ\96лÑ\8cÑ\88е Ð¿Ñ\80о Ð½Ð°Ð±Ñ\96Ñ\80 Ð·Ð¼Ñ\96н Ð·Ð° %{url}.
       unsubscribe: Щоб відмовитись від отримання повідомлень для цього набору змін
         за посиланням %{url}.
       unsubscribe_html: Щоб відмовитись від отримання повідомлень для цього набору
@@ -1988,7 +1992,7 @@ uk:
       preferred_languages: Типові мови
       edit_preferences: Зміна вподобань
     edit:
-      title: Ð\97мÑ\96на Ð½Ð°Ð»Ð°Ñ\88Ñ\82Ñ\83вань
+      title: Ð\97мÑ\96на Ð²Ð¿Ð¾Ð´Ð¾Ð±ань
       save: Зберегти вподобання
       cancel: Скасувати
     update:
@@ -2025,13 +2029,15 @@ uk:
     new:
       title: Ласкаво просимо
       tab_title: Ласкаво просимо
+      login_to_authorize_html: Увійдіть до OpenStreetMap, щоб отримати доступ до %{client_app_name}.
       email or username: Ел. пошта або прізвисько
       password: Пароль
       remember: Запам’ятати мене
       lost password link: Забули пароль?
       login_button: Увійти
       register now: Зареєструйтеся зараз
-      with external: 'Або використовуйте, облікові записи з інших ресурсів:'
+      with external: Або використовуйте, облікові записи з інших ресурсів
+      or: або
       auth failure: Вибачте, вхід з цими ім’ям або паролем неможливий.
     destroy:
       title: Вийти
@@ -2683,6 +2689,8 @@ uk:
         other: ""
       description_without_count: GPX файл від %{user}
   application:
+    basic_auth_disabled: 'HTTP Basic Authentication вимкнено: %{link}'
+    oauth_10a_disabled: 'OAuth 1.0 та 1.0a вимкнено: %{link}'
     permission_denied: Вибачте, у вас недостатньо прав для виконання цієї дії.
     require_cookies:
       cookies_needed: Схоже, що у вас вимкнені куки. Будь ласка, увімкніть куки у
@@ -2704,10 +2712,11 @@ uk:
       oauth2_authorizations: авторизації OAuth 2
       muted_users: Стишені учасники
     auth_providers:
-      openid_logo_alt: Увійти з допомогою OpenID
+      openid_logo_alt: Увійти з OpenID
+      openid_login_button: Продовжити
       openid:
-        title: Увійти за допомогою OpenID
-        alt: Увійти за допомогою OpenID URL
+        title: Увійти за OpenID
+        alt: Увійти за OpenID URL
       google:
         title: Увійти через Google
         alt: Увійти через Google OpenID
@@ -2770,6 +2779,8 @@ uk:
       write_redactions: Виконувати очищення даних
       read_email: Отримувати адресу е-пошти
       skip_authorization: Автоматичне схвалення заявки
+    for_roles:
+      moderator: Цей дозвіл призначений для дій, доступних лише модераторам
   oauth_clients:
     new:
       title: Зареєструвати новий застосунок
@@ -2865,6 +2876,9 @@ uk:
   users:
     new:
       title: Реєстрація
+      tab_title: Реєстрація
+      signup_to_authorize_html: Увійдіть до свого облікового запису OpenStreetMap,
+        щоб отримати доступ до %{client_app_name}.
       no_auto_account_create: На жаль, наразі ми не в змозі створити для вас обліковий
         запис автоматично.
       please_contact_support_html: Будь ласка, зв’яжіться з %{support_link}, щоб домовитися
@@ -2872,14 +2886,22 @@ uk:
         швидше.
       support: підтримкою
       about:
-        header: Вільні й доступні для редагування
+        header: Вільні й доступні для редагування.
         paragraph_1: На відміну від інших мап, OpenStreetMap повністю створено людьми,
           такими ж як ви, і кожен може вільно виправляти, оновлювати, завантажувати
           та використовувати дані OpenStreetMap.
-        paragraph_2: Зареєструйтеся, щоб почати мапити. Ми надішлемо електронного
-          листа для підтвердження вашого облікового запису.
+        paragraph_2: Зареєструйтеся, щоб почати мапити.
+        welcome: Ласкаво просимо до OpenStreetMap
+      duplicate_social_email: Якщо у вас вже є обліковий запис OpenStreetMap і ви
+        хочете використовувати стороннього постачальника ідентифікаційних даних, будь
+        ласка, увійдіть, використовуючи свій пароль, і змініть налаштування свого
+        облікового запису.
       display name description: Ваше ім’я учасника, доступне всім. Ви можете змінити
         його потім у ваших налаштуваннях.
+      by_signing_up_html: Реєструючись, ви приймаєте наші %{tou_link}, %{privacy_policy_link}
+        і %{contributor_terms_link}.
+      tou: умови використання
+      contributor_terms: умови співпраці
       external auth: 'Автентифікація через:'
       continue: Зареєструватись
       terms accepted: Дякуємо за прийняття нових умов співпраці!
@@ -2888,7 +2910,10 @@ uk:
       privacy_policy: Політикою конфіденційності
       privacy_policy_title: Політика конфіденційності OSMF, включаючи розділ про адреси
         електронної пошти
-      use external auth: Або використовуйте, облікові записи з інших ресурсів для
+      consider_pd_html: Я вважаю, що мій внесок належать до %{consider_pd_link}.
+      consider_pd: суспільного надбання
+      or: або
+      use external auth: або використовуйте, облікові записи з інших ресурсів для
         входу
     terms:
       title: Умови
@@ -3250,6 +3275,10 @@ uk:
       intro: Помітили помилку або чогось не вистачає? Дайте знати іншим маперам, щоб
         можна було це виправити. Перемістіть позначку в потрібне місце та додайте
         пояснення проблеми.
+      anonymous_warning_html: Ви не ввійшли в систему. Будь ласка, %{log_in} або %{sign_up},
+        якщо ви хочете отримувати оновлення щодо своєї нотатки.
+      anonymous_warning_log_in: увійдіть
+      anonymous_warning_sign_up: зареєструйтесь
       advice: Ваша нотатка є публічною та може бути використана для оновлення мапи.
         Будь ласка, не додавайте персональні дані або інформацію, яка міститься на
         захищених авторським правом мапах чи каталогах.
@@ -3343,7 +3372,7 @@ uk:
     edit_help: Перемістіть мапу і наблизьтесь до місця, яке ви бажаєте змінити, потім
       клацніть тут.
     directions:
-      ascend: Ð\92гоÑ\80Ñ\83
+      ascend: Ð\9fÑ\96дйом
       engines:
         fossgis_osrm_bike: Велосипед (OSRM)
         fossgis_osrm_car: Машина (OSRM)
@@ -3354,7 +3383,7 @@ uk:
         fossgis_valhalla_bicycle: Велосипед (Valhalla)
         fossgis_valhalla_car: Машина (Valhalla)
         fossgis_valhalla_foot: Пішки (Valhalla)
-      descend: Ð\92низ
+      descend: Ð¡Ð¿Ñ\83Ñ\81к
       directions: Маршрут
       distance: Відстань
       distance_m: '%{distance} м'
index bb10289150f6ea34547245b4afa2119bbd725fbc..9965542c9e17252fc2dfbf610abdf7776d957f4f 100644 (file)
@@ -702,6 +702,9 @@ zh-CN:
       contact: 联系
       contact_the_community_html: 如果您发现有损坏的链接/错误,请随时%{contact_link} OpenStreetMap
         社区。并记下您请求的确切 URL。
+    bad_request:
+      title: 错误请求
+      description: 您在 OpenStreetMap 服务器上请求的操作无效 (HTTP 400)
     forbidden:
       title: 禁止
       description: 您在 OpenStreetMap 服务器上请求的操作仅限管理员使用(HTTP 403)
@@ -1717,8 +1720,8 @@ zh-CN:
         subject_other: '[OpenStreetMap] %{commenter} 已经解决了一个您感兴趣的注记'
         your_note: '%{commenter} 解决了您在 %{place} 附近的一个注记。'
         your_note_html: '%{commenter} 解决了您在 %{place} 附近的一个注记。'
-        commented_note: '%{commenter} 解决了您感兴趣的一个地图注记。该注记位于 %{place} 附近。'
-        commented_note_html: '%{commenter} 解决了您感兴趣的一个地图注记。该注记位于 %{place} 附近。'
+        commented_note: '%{commenter} 解决了您留言的地图注记。该注记位于 %{place} 附近。'
+        commented_note_html: '%{commenter} 解决了您留言的地图注记。该注记位于 %{place} 附近。'
       reopened:
         subject_own: '[OpenStreetMap] %{commenter} 重新激活了您的一个注记'
         subject_other: '[OpenStreetMap] %{commenter} 重新激活了您感兴趣的一个注记'
@@ -1726,8 +1729,8 @@ zh-CN:
         your_note_html: '%{commenter} 重新激活了您在 %{place} 附近的一个注记。'
         commented_note: '%{commenter} 重新激活了您感兴趣的一个地图注记。该注记位于 %{place} 附近。'
         commented_note_html: '%{commenter} 重新激活了您感兴趣的一个地图注记。该注记位于 %{place} 附近。'
-      details: 更多关于笔记的详细信息可以在%{url}找到
-      details_html: 更多关于笔记的详细信息可以在%{url}找到
+      details: 在 %{url} 回复或了解更多有关注记的信息
+      details_html: 在 %{url} 回复或了解更多有关注记的信息
     changeset_comment_notification:
       description: 'OpenStreetMap 变更集 #%{id}'
       hi: 您好,%{to_user}:
@@ -1742,8 +1745,8 @@ zh-CN:
         partial_changeset_with_comment: 带评论“%{changeset_comment}”
         partial_changeset_with_comment_html: 带有评论“%{changeset_comment}”
         partial_changeset_without_comment: 没有评论
-      details: 更多关于变更集的详细信息可以在 %{url} 找到
-      details_html: 更多有关变更集的详细信息,请参见 %{url}
+      details: 在 %{url} 回复或了解更多有关变更集的信息
+      details_html: 在 %{url} 回复或了解更多有关变更集的信息
       unsubscribe: 您可访问%{url}以从该变更集中退订。
       unsubscribe_html: 您可访问%{url}以从该变更集中退订。
   confirmations:
@@ -2438,6 +2441,8 @@ zh-CN:
         other: 来自 %{user} 的带 %{count} 点的GPX文件
       description_without_count: 来自 %{user} 的 GPX 文件
   application:
+    basic_auth_disabled: HTTP 基本身份验证已禁用:%{link}
+    oauth_10a_disabled: OAuth 1.0 和 1.0a 已禁用:%{link}
     permission_denied: 您没有权限来执行此操作
     require_cookies:
       cookies_needed: 您似乎停用了 cookie - 请在继续操作前启用您的浏览器 cookie。
@@ -2947,6 +2952,9 @@ zh-CN:
     new:
       title: 新注记
       intro: 发现错误或遗漏了什么?请告诉其他绘图者以便于我们更正错误。将标记移动到正确的位置并输入备注说明问题。
+      anonymous_warning_html: 您尚未登录。如果您想接收笔记的更新信息,请%{log_in}或%{sign_up}。
+      anonymous_warning_log_in: 登录
+      anonymous_warning_sign_up: 注册
       advice: 您的注释会公开,并可能用于更新地图,所以不要输入个人信息,或是来自版权保护地图的信息或目录列表。
       add: 添加注记
   javascripts:
index be1fa17cc1054d03f6f3998a76cdb0e546f419a1..7fc27bf7a2a1e4f08aaeb27e5f029c574bc1f8e1 100644 (file)
@@ -43,6 +43,7 @@
 # Author: Winston Sung
 # Author: Wrightbus
 # Author: Xiplus
+# Author: Yuchenglinedu
 # Author: 予弦
 # Author: 列维劳德
 # Author: 捍粵者
@@ -86,7 +87,7 @@ zh-TW:
     errors:
       messages:
         invalid_email_address: 似乎不是有效的電子郵件信箱地址。
-        email_address_not_routable: ä¸\8då\8f¯ç¹\9e
+        email_address_not_routable: ä¸\8då\8f¯ç\99¼
         display_name_is_user_n: 不能是「user_n」除非「n」是您的使用者 ID
       models:
         user_mute:
@@ -122,21 +123,21 @@ zh-TW:
       tracetag: 軌跡標籤
       user: 使用者
       user_preference: 使用者偏好設定
-      user_token: 使用者令牌
+      user_token: 使用者Token
       way: 路徑
       way_node: 路徑節點
       way_tag: 路徑標籤
     attributes:
       client_application:
-        name: 名稱(必
-        url: 主程式 URL(必需
-        callback_url: 回 (Callback) URL
+        name: 名稱(必
+        url: 主要應用程式 URL(必填
+        callback_url: 回 (Callback) URL
         support_url: 支援 URL
-        allow_read_prefs: è®\80å\8f\96ä»\96å\80\91ç\9a\84使ç\94¨è\80\85å\81\8f好設å®\9a
-        allow_write_prefs: ä¿®æ\94¹ä»\96å\80\91ç\9a\84使ç\94¨è\80\85å\81\8f好設å®\9a
+        allow_read_prefs: 讀取使用者偏好設定
+        allow_write_prefs: 修改使用者偏好設定
         allow_write_diary: 建立日記、評論和加入好友
         allow_write_api: 修改地圖
-        allow_read_gpx: 讀取他們的私人GPS軌跡
+        allow_read_gpx: 讀取人GPS軌跡
         allow_write_gpx: 上傳 GPS 軌跡
         allow_write_notes: 修改註記
       diary_comment:
@@ -164,7 +165,7 @@ zh-TW:
         latitude: 緯度
         longitude: 經度
         public: 公開
-        description: 說明
+        description: 描述
         gpx_file: 上傳 GPX 檔案
         visibility: 能見度
         tagstring: 標籤
@@ -175,18 +176,18 @@ zh-TW:
         recipient: 收件者
       redaction:
         title: 標題
-        description: 說明
+        description: 描述
       report:
-        category: 選擇回報的原因
-        details: è«\8bæ\8f\90ä¾\9bæ\9c\89é\97\9cå\95\8fé¡\8cç\9a\84æ\9b´å¤\9aäº\9b詳æ\83\85ï¼\88å¿\85é\9c\80
+        category: 選擇回報的原因
+        details: è«\8bæ\8f\90ä¾\9bæ\9b´å¤\9aæ\9c\89é\97\9cå\95\8fé¡\8cç\9a\84詳æ\83\85ï¼\88å¿\85å¡«
       user:
-        auth_provider: 認證提供
+        auth_provider: 認證提供
         auth_uid: 認證 UID
         email: 電子郵件
         new_email: 新的電子郵件地址
-        active: 開啟中
+        active: 活躍
         display_name: 顯示名稱
-        description: å\9fºæ\9c¬è³\87æ\96\99說æ\98\8e
+        description: å\80\8b人æª\94æ¡\88æ\8f\8fè¿°
         home_lat: 緯度
         home_lon: 經度
         languages: 偏好的語言
@@ -196,14 +197,14 @@ zh-TW:
     help:
       doorkeeper/application:
         confidential: 應用程式會在客戶端密鑰可以維持機密時使用(本地端移動應用程式和單一頁面應用程式不保密)
-        redirect_uri: 一行一URI
+        redirect_uri: 每條 URI 使用一行
       trace:
-        tagstring: 逗點分隔
+        tagstring: 逗點分隔
       user_block:
-        reason: 封鎖使用者的理由。請盡量以平靜、合理態度詳細描述情況,並記住訊息公開可見。請注意,並非所有使用者都了解社群術語,所以請盡量使用通俗說法。
+        reason: 封鎖使用者的理由。請盡量以平靜、合理態度詳細描述情況,並記住訊息公開可見。請注意,並非所有使用者都了解社群術語,所以請盡量使用通俗說法。
         needs_view: 解封前是否需要使用者登入?
       user:
-        new_email: (永不公開顯示)
+        new_email: (永遠不公開顯示)
   datetime:
     distance_in_words_ago:
       about_x_hours:
@@ -215,34 +216,22 @@ zh-TW:
       about_x_years:
         one: 約 %{count} 年前
         other: 約 %{count} 年前
-      almost_x_years:
-        one: 將近 %{count} 年前
-        other: 將近 %{count} 年前
+      almost_x_years: 將近 %{count} 年前
       half_a_minute: 半分鐘前
-      less_than_x_seconds:
-        one: 小於 %{count} 秒前
-        other: 小於 %{count} 秒前
-      less_than_x_minutes:
-        one: 小於 %{count} 分前
-        other: 小於 %{count} 分前
+      less_than_x_seconds: 不到 %{count} 秒前
+      less_than_x_minutes: 不到 %{count} 分鐘前
       over_x_years:
-        one: 超過 %{count} 年前
-        other: 超過 %{count} 年前
+        one: 超過1年前
+        other: 超過%{count}年前
       x_seconds:
-        one: '%{count} 秒前'
-        other: '%{count} 秒前'
-      x_minutes:
-        one: '%{count} 分鐘前'
-        other: '%{count} 分鐘前'
-      x_days:
-        one: '%{count} 天前'
-        other: '%{count} 天前'
+        one: 1秒前
+        other: '%{count}秒前'
+      x_minutes: '%{count} 分鐘前'
+      x_days: '%{count} 天前'
       x_months:
         one: '%{count} 個月前'
         other: '%{count} 個月前'
-      x_years:
-        one: '%{count} 年前'
-        other: '%{count} 年前'
+      x_years: '%{count} 年前'
   printable_name:
     current_and_old_links_html: '%{current_link},%{old_link}'
   editor:
@@ -274,13 +263,13 @@ zh-TW:
         reopened_at_by_html: 於%{when}由%{user}重新開啟
       rss:
         title: OpenStreetMap 註記
-        description_all: å·²å ±å\91\8aã\80\81è©\95è«\96ã\80\81æ\88\96æ\98¯é\97\9cé\96\89註è¨\98ç\9a\84清單
+        description_all: å ±å\91\8aã\80\81è©\95è«\96ã\80\81æ\88\96é\97\9cé\96\89ç\9a\84註è¨\98清單
         description_area: 在你的區域[(%{min_lat}|%{min_lon}) -- (%{max_lat}|%{max_lon})]所報告、評論或關閉的註記的清單
         description_item: 註記 %{id} 的 RSS feed
         opened: 新的註記 (在 %{place} 附近)
         commented: 新的評論 (在 %{place} 附近)
         closed: 關閉的註記 (在 %{place} 附近)
-        reopened: 重新開啟的註記 (在 %{place} 附近)
+        reopened: 重新開啟的註記(在%{place}附近)
       entry:
         comment: 評論
         full: 註記原文
@@ -288,20 +277,20 @@ zh-TW:
     deletions:
       show:
         title: 刪除我的帳號
-        warning: 警告!帳號刪除處理是完全徹底、無法還原的
+        warning: 警告!帳號刪除程序不可逆轉,無法復原
         delete_account: 刪除帳號
-        delete_introduction: 您可以使用下方按鈕來刪除您的 OpenStreetMap 帳號。並請注意以下細節:
-        delete_profile: 您的個人檔案資訊,包含像是您的頭像圖片、描述,以及住家位置將會移除。
-        delete_display_name: 的顯示名稱將會移除,並且會被其他帳號拿來重覆使用。
-        retain_caveats: 然而,即使您的帳號被刪除後,一些關於您的資訊仍會繼續保留在 OpenStreetMap 裡:
-        retain_edits: 若有您對於地圖資料庫的編輯次數,這將會繼續保留。
-        retain_traces: 若有上傳過的軌跡資料內容,這將會繼續保留。
-        retain_diary_entries: 若有您的日記項目與日記評論內容,這將會繼續保留。
-        retain_notes: 若有的地圖註記與註記評論內容,這將會繼續保留;不過會隱藏起來。
-        retain_changeset_discussions: 若有的變更集討論,這將會繼續保留。
-        retain_email: 的電子郵件地址將會繼續保留。
-        recent_editing_html: 因為您最近有作過編輯,目前無法刪除您的帳號。在 %{time} 後才可刪除。
-        confirm_delete: 確定嗎?
+        delete_introduction: 你可以使用下方按鈕來刪除你的 OpenStreetMap 帳號。並請留意以下細節:
+        delete_profile: 你的個人檔案資訊,包含:例如你的頭像圖片、描述,以及住家位置將會移除。
+        delete_display_name: 的顯示名稱將會移除,並且會被其他帳號拿來重覆使用。
+        retain_caveats: 然而,即使你的帳號被刪除後,一些關於你的資訊仍會繼續保留在 OpenStreetMap 裡:
+        retain_edits: 你對於地圖資料庫的編輯次數,假如存在,這將會繼續保留。
+        retain_traces: 若有上傳過的軌跡資料內容,這將會繼續保留。
+        retain_diary_entries: 若有你的日誌項目與日誌評論內容,這將會繼續保留。
+        retain_notes: 若有的地圖註記與註記評論內容,這將會繼續保留;不過會隱藏起來。
+        retain_changeset_discussions: 若有的變更集討論,這將會繼續保留。
+        retain_email: 的電子郵件地址將會繼續保留。
+        recent_editing_html: 因為你最近有編輯過,目前無法刪除你的帳號。在 %{time} 後才可刪除。
+        confirm_delete: 確定嗎?
         cancel: 取消
   accounts:
     edit:
@@ -315,28 +304,28 @@ zh-TW:
         heading: 公開編輯
         enabled: 已開啟。非匿名且可以編輯資料。
         enabled link text: 這是什麼?
-        disabled: 已停用且不能編輯資料,所有先前的編輯都會成為匿名的。
+        disabled: 已停用且不能編輯資料,所有先前的編輯都會成為匿名的。
         disabled link text: 為什麼我不能編輯?
       contributor terms:
         heading: 貢獻者條款
-        agreed: 已同意新的貢獻者條款。
-        not yet agreed: 未同意新的貢獻者條款。
+        agreed: 已同意新的貢獻者條款。
+        not yet agreed: 未同意新的貢獻者條款。
         review link text: 請跟隨此連結,方便你檢視並接受新的貢獻者條款。
-        agreed_with_pd: 您亦同意將您的編輯放到公共領域
+        agreed_with_pd: 你亦同意將你的編輯放到公共領域
         link text: 這是什麼?
       save changes button: 儲存變更
       delete_account: 刪除帳號…
     go_public:
       heading: 公開編輯
-      currently_not_public: 目前你的編輯都是暱名的,其他人無法寄給你訊息或是知道你的位置。要讓別人知道你編輯什麼,以及透過網站聯繫你,你點下面的按鈕。
+      currently_not_public: 目前你的編輯都是暱名的,其他人無法寄給你訊息或是知道你的位置。要讓別人知道你編輯什麼,以及透過網站聯繫你,請你點以下的按鈕。
       only_public_can_edit: 自從 API 0.6 版本上線,只有公共帳號的使用者可以編輯地圖資料。
       find_out_why_html: (%{link})。
-      find_out_why: 找出來為什麼
-      email_not_revealed: 你的電子郵件地址不會揭露公開
+      find_out_why: 找出原因
+      email_not_revealed: 你的電子郵件地址不會公開洩漏
       not_reversible: 這項操作無法撤銷,所有的新使用者都是預設公開的。
-      make_edits_public_button: 將所有的編輯設為公開
+      make_edits_public_button: 將與我有關的所有的編輯設為公開
     update:
-      success_confirm_needed: 使用者資訊成功的更新。請檢查您的電子郵件,以確認收到新電子郵件地址的通知。
+      success_confirm_needed: 使用者資訊成功的更新。請檢查你的電子郵件,以便確認收到新電子郵件地址的通知。
       success: 使用者資訊已成功更新。
     destroy:
       success: 帳號已刪除。
@@ -346,21 +335,21 @@ zh-TW:
     version: 版本
     redacted_version: 編修版本
     in_changeset: 變更集
-    anonymous: 匿名
+    anonymous: 匿名使用者
     no_comment: (沒有評論)
     part_of: 屬於:
     part_of_relations:
-      one: '%{count} 個關聯'
+      one: 1 個關聯
       other: '%{count} 個關聯'
     part_of_ways:
       one: '%{count} 條路徑'
       other: '%{count} 條路徑'
     download_xml: 下載 XML
     view_history: 檢視歷史
-    view_unredacted_history: 查看未編修的歷史
+    view_unredacted_history: 查看未編輯的歷史記錄
     view_details: 檢視詳細資料
     view_redacted_data: 查看編修資料
-    view_redaction_message: 查看編修訊息
+    view_redaction_message: 查看密文訊息
     location: 位置:
     node:
       title_html: 節點:%{name}
@@ -666,6 +655,9 @@ zh-TW:
       contact: 聯絡
       contact_the_community_html: 如果您發現有損壞的連結/錯誤,請隨時%{contact_link}OpenStreetMap 社群。並請記下您的請求的確切
         URL 位址。
+    bad_request:
+      title: 錯誤請求
+      description: 您在 OpenStreetMap 伺服器上請求的操作無效(HTTP 400)
     forbidden:
       title: Forbidden
       description: 您在 OpenStreetMap 伺服器上請求的運作僅限管理員使用(HTTP 403)
@@ -1684,11 +1676,11 @@ zh-TW:
         commented_note_html: '%{commenter} 在你感興趣的地圖註記評論。該註記在 %{place} 附近。'
       closed:
         subject_own: '[OpenStreetMap] %{commenter} 解決你其中一筆註記 %{commenter}'
-        subject_other: '[OpenStreetMap]%{commenter} 已經解決一筆你興趣的註記'
-        your_note: '%{commenter} 已經解決你其中一筆接近 %{place} 的註記。'
-        your_note_html: '%{commenter} 已經解決你其中一筆接近 %{place} 的註記。'
-        commented_note: '%{commenter} 已經解決一筆你留言過的地圖註記。這筆在 %{place} 附近。'
-        commented_note_html: '%{commenter} 已經解決一筆你留言過的地圖註記。這筆在 %{place} 附近。'
+        subject_other: '[OpenStreetMap]%{commenter} 已解決一項你感興趣的註記'
+        your_note: '%{commenter} 已解決你在 %{place} 附近的註記之一。'
+        your_note_html: '%{commenter} 已解決你在 %{place} 附近的註記之一。'
+        commented_note: '%{commenter} 已解決你留言過的地圖註記。該註記在 %{place} 附近。'
+        commented_note_html: '%{commenter} 已解決你留言過的地圖註記。該註記在 %{place} 附近。'
       reopened:
         subject_own: '[OpenStreetMap] %{commenter} 再次開啟你其中一筆註記。'
         subject_other: '[OpenStreetMap] %{commenter} 再次開啟你感興趣的註記。'
@@ -1697,7 +1689,7 @@ zh-TW:
         commented_note: '%{commenter} 重新開啟了一個您曾評論的地圖註記。該註記位於 %{place} 附近。'
         commented_note_html: '%{commenter} 重新開啟了一個您曾評論的地圖註記。該註記位於 %{place} 附近。'
       details: 關於註記的更多詳細資料可在 %{url} 找到。
-      details_html: 關於註記的更多詳細資料可在 %{url} 找到
+      details_html: 在%{url}回覆或是瞭解更多有關註記的訊息
     changeset_comment_notification:
       description: 'OpenStreetMap 變更集 #%{id}'
       hi: 嗨 %{to_user},
@@ -1712,8 +1704,8 @@ zh-TW:
         partial_changeset_with_comment: 評論 "%{changeset_comment}"
         partial_changeset_with_comment_html: 評論 "%{changeset_comment}"
         partial_changeset_without_comment: 沒有評論
-      details: 關於變更集的詳情可在 %{url} 找到
-      details_html: 關於變更集的詳情可在 %{url} 找到
+      details: 在 %{url} 回覆或瞭解更多有關於變更集的資訊
+      details_html: 在 %{url} 回覆或瞭解更多有關變更集的資訊
       unsubscribe: 您可以在 %{url} 取消訂閱此變更集的更新內容。
       unsubscribe_html: 您可以在 %{url} 取消訂閱此變更集的更新內容。
   confirmations:
@@ -2168,7 +2160,7 @@ zh-TW:
       search: 搜尋
       get_directions: 取得方向指引
       get_directions_title: 尋找兩點之間的路線
-      from: 來自
+      from: 
       to: 到
       where_am_i: 這是哪裡?
       where_am_i_title: 使用搜尋引擎描述目前的位置
@@ -2417,6 +2409,8 @@ zh-TW:
         other: 由 %{user} 上傳的 GPX 檔案,含有 %{count} 點
       description_without_count: 由 %{user} 上傳的 GPX 檔案
   application:
+    basic_auth_disabled: HTTP 基本認證已停用:%{link}
+    oauth_10a_disabled: OAuth 1.0 與 1.0a 已停用:%{link}
     permission_denied: 您沒有權限來存取該操作。
     require_cookies:
       cookies_needed: 您似乎已停用 cookies - 請在瀏覽器中開啟 cookies,然後繼續。
@@ -2496,6 +2490,8 @@ zh-TW:
       write_redactions: 編寫地圖資料
       read_email: 讀取使用者電子郵件位址
       skip_authorization: 自動核准申請
+    for_roles:
+      moderator: 此權限用於僅可由仲裁員執行的操作
   oauth_clients:
     new:
       title: 註冊新的應用程式
@@ -2921,10 +2917,13 @@ zh-TW:
       report_link_html: 如果此註記含有需要移除的敏感資訊,您可以%{link}。
       other_problems_resolve: 對於註記的所有其他問題,您可以依據評論內容來自行處理。
       other_problems_resolved: 對於其他類型回報,解決已經足夠了。
-      disappear_date_html: 已經解決的註記會從地圖的 %{disappear_in} 消失
+      disappear_date_html: 已解決的註記會在%{disappear_in}後從地圖中消失
     new:
       title: 新增註記
       intro: 發現錯誤或缺少些什麼東西嗎?請告訴其他地圖製作者以便於我們處理。將標記移動到正確的位置並輸入註記,以解釋問題。
+      anonymous_warning_html: 您尚未登入。若您想收到您的註記更新內容,請%{log_in}或%{sign_up}。
+      anonymous_warning_log_in: 登入
+      anonymous_warning_sign_up: 註冊
       advice: 您的註記已公開並可用於更新地圖,因此請不要輸入個人訊息,或是來自於具版權保護地圖的訊息以及目錄清單。
       add: 送出註記
   javascripts:
index 8271e7e4dba1b95f05b4027af56a5d5cc0aac605..c44064ba325c7f975f6af0c3f6e26bef823492db 100644 (file)
@@ -347,6 +347,7 @@ OpenStreetMap::Application.routes.draw do
   resources :redactions
 
   # errors
+  match "/400", :to => "errors#bad_request", :via => :all
   match "/403", :to => "errors#forbidden", :via => :all
   match "/404", :to => "errors#not_found", :via => :all
   match "/500", :to => "errors#internal_server_error", :via => :all
index c057be978a841485174d6714ea3499744011fd2e..ec868b651baa84d729f5305c3bcb859e4ac6899f 100644 (file)
@@ -97,9 +97,12 @@ attachments_dir: ":rails_root/public/attachments"
 #memcache_servers: []
 # Enable HTTP basic authentication support
 basic_auth_support: true
+# Enable OAuth 1.0/1.0a registration
+oauth_10_registration: true
 # Enable legacy OAuth 1.0 support
 oauth_10_support: true
-oauth_10_registration: true
+# Enable OAuth 1.0a support
+oauth_10a_support: true
 # URL of Nominatim instance to use for geocoding
 nominatim_url: "https://nominatim.openstreetmap.org/"
 # Default editor
index 65eab6907a00ff6008299f28d7d2beb8b674d78c..a0fcef8b9f2cf86a238844b0b5170f8dd0552fde 100644 (file)
@@ -8,7 +8,7 @@ module OSM
   # The base class for API Errors.
   class APIError < RuntimeError
     def initialize(message = "Generic API Error")
-      super(message)
+      super
     end
 
     def status
index 56d358bd8dcb2823afa64a7dcb56e62f5a40d589..f19d3d3a952ddd2c8240e2ea8da228c434523ffc 100644 (file)
@@ -49,6 +49,10 @@ module RichText
         (spammy_phrases * 40)
     end
 
+    def image
+      nil
+    end
+
     protected
 
     def simple_format(text)
@@ -80,12 +84,33 @@ module RichText
 
   class Markdown < Base
     def to_html
-      linkify(sanitize(Kramdown::Document.new(self).to_html), :all)
+      linkify(sanitize(document.to_html), :all)
     end
 
     def to_text
       to_s
     end
+
+    def image
+      return @image if defined? @image
+
+      @image = first_image_element(document.root)&.attr&.[]("src")
+    end
+
+    private
+
+    def document
+      @document ||= Kramdown::Document.new(self)
+    end
+
+    def first_image_element(element)
+      return element if element.type == :img
+
+      element.children.find do |child|
+        nested_image = first_image_element(child)
+        break nested_image if nested_image
+      end
+    end
   end
 
   class Text < Base
index 46ebb6a3741ea0d8f8ce934311a2f279b5460b25..7d2feed292dc585be422d6b67e165581fb1d08d5 100644 (file)
@@ -71,5 +71,75 @@ module Api
       assert_equal "online", js["api"]["status"]["gpx"]
       assert_equal Settings.imagery_blacklist.length, js["policy"]["imagery"]["blacklist"].length
     end
+
+    def test_capabilities_api_readonly
+      with_settings(:status => "api_readonly") do
+        get api_capabilities_path
+        assert_response :success
+        assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", :count => 1 do
+          assert_select "api", :count => 1 do
+            assert_select "status[database='online']", :count => 1
+            assert_select "status[api='readonly']", :count => 1
+            assert_select "status[gpx='online']", :count => 1
+          end
+        end
+      end
+    end
+
+    def test_capabilities_api_offline
+      with_settings(:status => "api_offline") do
+        get api_capabilities_path
+        assert_response :success
+        assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", :count => 1 do
+          assert_select "api", :count => 1 do
+            assert_select "status[database='online']", :count => 1
+            assert_select "status[api='offline']", :count => 1
+            assert_select "status[gpx='online']", :count => 1
+          end
+        end
+      end
+    end
+
+    def test_capabilities_database_readonly
+      with_settings(:status => "database_readonly") do
+        get api_capabilities_path
+        assert_response :success
+        assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", :count => 1 do
+          assert_select "api", :count => 1 do
+            assert_select "status[database='readonly']", :count => 1
+            assert_select "status[api='readonly']", :count => 1
+            assert_select "status[gpx='readonly']", :count => 1
+          end
+        end
+      end
+    end
+
+    def test_capabilities_database_offline
+      with_settings(:status => "database_offline") do
+        get api_capabilities_path
+        assert_response :success
+        assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", :count => 1 do
+          assert_select "api", :count => 1 do
+            assert_select "status[database='offline']", :count => 1
+            assert_select "status[api='offline']", :count => 1
+            assert_select "status[gpx='offline']", :count => 1
+          end
+        end
+      end
+    end
+
+    def test_capabilities_gpx_offline
+      with_settings(:status => "gpx_offline") do
+        get api_capabilities_path
+        assert_response :success
+        assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", :count => 1 do
+          assert_select "api", :count => 1 do
+            assert_select "status[database='online']", :count => 1
+            assert_select "status[api='online']", :count => 1
+            assert_select "status[gpx='offline']", :count => 1
+          end
+        end
+      end
+    end
   end
 end
index 3d3f7971201e6951967e53ea54512c8785ed403a..4e96d4ce9146a8d6227c16280980e659d258987f 100644 (file)
@@ -150,6 +150,19 @@ module Api
         put user_preferences_path, :params => "nonsense", :headers => auth_header
       end
       assert_response :bad_request
+
+      # try a put with unicode characters
+      assert_no_difference "UserPreference.count" do
+        put user_preferences_path, :params => "<osm><preferences><preference k='kêy' v='néw_vâlué'/><preference k='nêw_kêy' v='vâlué'/></preferences></osm>", :headers => auth_header
+      end
+      assert_response :success
+      assert_equal "text/plain", @response.media_type
+      assert_equal "", @response.body
+      assert_equal "néw_vâlué", UserPreference.find([user.id, "kêy"]).v
+      assert_equal "vâlué", UserPreference.find([user.id, "nêw_kêy"]).v
+      assert_raises ActiveRecord::RecordNotFound do
+        UserPreference.find([user.id, "some_key"])
+      end
     end
 
     ##
@@ -187,6 +200,15 @@ module Api
       assert_equal "text/plain", @response.media_type
       assert_equal "", @response.body
       assert_equal "newer_value", UserPreference.find([user.id, "new_key"]).v
+
+      # try changing the value of a preference to include unicode characters
+      assert_difference "UserPreference.count", 1 do
+        put user_preference_path(:preference_key => "nêw_kêy"), :params => "néwèr_vâlué", :headers => auth_header
+      end
+      assert_response :success
+      assert_equal "text/plain", @response.media_type
+      assert_equal "", @response.body
+      assert_equal "néwèr_vâlué", UserPreference.find([user.id, "nêw_kêy"]).v
     end
 
     ##
index 1c70831c93c9b65293cb107ac1f04b059f4fd90c..d2b353a8edfe5142f8697b099c0346eb39050590 100644 (file)
@@ -46,5 +46,17 @@ module Api
       assert_response :success
       assert_select "osm[version]", :count => 0
     end
+
+    def test_versions_available_while_offline
+      with_settings(:status => "api_offline") do
+        get api_versions_path
+        assert_response :success
+        assert_select "osm[generator='#{Settings.generator}']", :count => 1 do
+          assert_select "api", :count => 1 do
+            assert_select "version", Settings.api_version
+          end
+        end
+      end
+    end
   end
 end
index 3d264181c4cde89bb6e65dea54d6291d4351bb5a..a486e4b5ee87f98f955fe1de82d5647ec93d4cc1 100644 (file)
@@ -92,6 +92,15 @@ class ChangesetsControllerTest < ActionDispatch::IntegrationTest
     check_index_result(changesets.last(20))
   end
 
+  ##
+  # This should report an error
+  def test_index_invalid_xhr
+    %w[-1 0 fred].each do |id|
+      get history_path(:format => "html", :list => "1", :max_id => id)
+      assert_redirected_to :controller => :errors, :action => :bad_request
+    end
+  end
+
   ##
   # This should display the last 20 changesets closed in a specific area
   def test_index_bbox
index 2b10402fa04cd14d159e3d3c76749cb42f758aab..b6d11c62aff91e69478bfeaa090e181bc3d2708a 100644 (file)
@@ -590,6 +590,17 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
     assert_select "li.page-item.disabled span.page-link", :text => "Newer Entries", :count => 1
   end
 
+  def test_index_invalid_paged
+    # Try some invalid paged accesses
+    %w[-1 0 fred].each do |id|
+      get diary_entries_path(:before => id)
+      assert_redirected_to :controller => :errors, :action => :bad_request
+
+      get diary_entries_path(:after => id)
+      assert_redirected_to :controller => :errors, :action => :bad_request
+    end
+  end
+
   def test_rss
     create(:language, :code => "de")
     create(:diary_entry, :language_code => "en")
@@ -741,6 +752,28 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
     end
   end
 
+  def test_show_og_image
+    user = create(:user)
+    diary_entry = create(:diary_entry, :user => user, :body => "![some picture](https://example.com/picture.jpg)")
+
+    get diary_entry_path(user, diary_entry)
+    assert_response :success
+    assert_dom "head meta[property='og:image']" do
+      assert_dom "> @content", "https://example.com/picture.jpg"
+    end
+  end
+
+  def test_show_og_image_with_relative_uri
+    user = create(:user)
+    diary_entry = create(:diary_entry, :user => user, :body => "![some local picture](/picture.jpg)")
+
+    get diary_entry_path(user, diary_entry)
+    assert_response :success
+    assert_dom "head meta[property='og:image']" do
+      assert_dom "> @content", "#{root_url}picture.jpg"
+    end
+  end
+
   def test_hide
     user = create(:user)
     diary_entry = create(:diary_entry, :user => user)
@@ -899,6 +932,18 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
     assert_response :not_found
   end
 
+  def test_comments_invalid_paged
+    user = create(:user)
+
+    %w[-1 0 fred].each do |id|
+      get diary_comments_path(:display_name => user.display_name, :before => id)
+      assert_redirected_to :controller => :errors, :action => :bad_request
+
+      get diary_comments_path(:display_name => user.display_name, :after => id)
+      assert_redirected_to :controller => :errors, :action => :bad_request
+    end
+  end
+
   def test_subscribe_page
     user = create(:user)
     other_user = create(:user)
index 9f8ccee56d66acc34b147625b643af81698df178..253cbbdc0bf795463afd2061ee610c789b11b663 100644 (file)
@@ -2,6 +2,10 @@ require "test_helper"
 
 class ErrorsControllerTest < ActionDispatch::IntegrationTest
   def test_routes
+    assert_routing(
+      { :path => "/400", :method => :get },
+      { :controller => "errors", :action => "bad_request" }
+    )
     assert_routing(
       { :path => "/403", :method => :get },
       { :controller => "errors", :action => "forbidden" }
@@ -16,6 +20,11 @@ class ErrorsControllerTest < ActionDispatch::IntegrationTest
     )
   end
 
+  def test_bad_request
+    get "/400"
+    assert_response :bad_request
+  end
+
   def test_forbidden
     get "/403"
     assert_response :forbidden
index a543342698648aad26dc1991a42fcc3f0ab2330f..4092ad7326599cfe964b7adc97d8790a57f7570e 100644 (file)
@@ -83,6 +83,15 @@ class NotesControllerTest < ActionDispatch::IntegrationTest
     assert_select "table.note_list tbody tr", :count => 10
   end
 
+  def test_index_invalid_paged
+    user = create(:user)
+
+    %w[-1 0 fred].each do |page|
+      get user_notes_path(user, :page => page)
+      assert_redirected_to :controller => :errors, :action => :bad_request
+    end
+  end
+
   def test_empty_page
     user = create(:user)
     get user_notes_path(user)
index 73966641eb8641f346c25429bba0cd233f5421c0..972cbb3c32be43e42978e19f27c74c633464ac97 100644 (file)
@@ -322,6 +322,17 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
     assert_select "li.page-item a.page-link", :text => "Older Traces", :count => 2
   end
 
+  def test_index_invalid_paged
+    # Try some invalid paged accesses
+    %w[-1 0 fred].each do |id|
+      get traces_path(:before => id)
+      assert_redirected_to :controller => :errors, :action => :bad_request
+
+      get traces_path(:after => id)
+      assert_redirected_to :controller => :errors, :action => :bad_request
+    end
+  end
+
   # Check the RSS feed
   def test_rss
     user = create(:user)
index a7ab02c75fb9afa5011f8a1b275e743df1d3d677..97f5171335d4910fd27e53fda34bc6ea8dc8e2f5 100644 (file)
@@ -115,6 +115,18 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
     check_no_page_link "Older Blocks"
   end
 
+  ##
+  # test the index action with invalid pages
+  def test_index_invalid_paged
+    %w[-1 0 fred].each do |id|
+      get user_blocks_path(:before => id)
+      assert_redirected_to :controller => :errors, :action => :bad_request
+
+      get user_blocks_path(:after => id)
+      assert_redirected_to :controller => :errors, :action => :bad_request
+    end
+  end
+
   ##
   # test the show action
   def test_show
@@ -560,6 +572,20 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
     check_no_page_link "Older Blocks"
   end
 
+  ##
+  # test the blocks_on action with invalid pages
+  def test_blocks_on_invalid_paged
+    user = create(:user)
+
+    %w[-1 0 fred].each do |id|
+      get user_blocks_on_path(user, :before => id)
+      assert_redirected_to :controller => :errors, :action => :bad_request
+
+      get user_blocks_on_path(user, :after => id)
+      assert_redirected_to :controller => :errors, :action => :bad_request
+    end
+  end
+
   ##
   # test the blocks_by action
   def test_blocks_by
@@ -628,6 +654,20 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
     check_no_page_link "Older Blocks"
   end
 
+  ##
+  # test the blocks_by action with invalid pages
+  def test_blocks_by_invalid_paged
+    user = create(:moderator_user)
+
+    %w[-1 0 fred].each do |id|
+      get user_blocks_by_path(user, :before => id)
+      assert_redirected_to :controller => :errors, :action => :bad_request
+
+      get user_blocks_by_path(user, :after => id)
+      assert_redirected_to :controller => :errors, :action => :bad_request
+    end
+  end
+
   private
 
   def check_user_blocks_table(user_blocks)
index c5566e65db4ae534015fa97331fba7c6f2c7fd05..cff52cff25a24fc2ff3ccf251c3b533b6ba94ce5 100644 (file)
@@ -558,6 +558,18 @@ class UsersControllerTest < ActionDispatch::IntegrationTest
     check_no_page_link "Older Users"
   end
 
+  def test_index_get_invalid_paginated
+    session_for(create(:administrator_user))
+
+    %w[-1 0 fred].each do |id|
+      get users_path(:before => id)
+      assert_redirected_to :controller => :errors, :action => :bad_request
+
+      get users_path(:after => id)
+      assert_redirected_to :controller => :errors, :action => :bad_request
+    end
+  end
+
   private
 
   def check_no_page_link(name)
index f47c215c0e48dc14b2041ebe406d721901f0a0be..f09eb3356e3ccc43d92ebb405f0683804db47194 100644 (file)
@@ -186,33 +186,37 @@ class BrowseTagsHelperTest < ActionView::TestCase
     assert_equal "Test", link[:title]
 
     link = wikipedia_link("wikipedia", "de:Test")
-    assert_equal "https://de.wikipedia.org/wiki/de:Test?uselang=en", link[:url]
+    assert_equal "https://de.wikipedia.org/wiki/Test?uselang=en", link[:url]
     assert_equal "de:Test", link[:title]
 
+    link = wikipedia_link("wikipedia:fr", "Portsea")
+    assert_equal "https://fr.wikipedia.org/wiki/Portsea?uselang=en", link[:url]
+    assert_equal "Portsea", link[:title]
+
     link = wikipedia_link("wikipedia:fr", "de:Test")
-    assert_equal "https://fr.wikipedia.org/wiki/de:Test?uselang=en", link[:url]
+    assert_equal "https://de.wikipedia.org/wiki/Test?uselang=en", link[:url]
     assert_equal "de:Test", link[:title]
 
     link = wikipedia_link("wikipedia", "de:Englischer Garten (München)#Japanisches Teehaus")
-    assert_equal "https://de.wikipedia.org/wiki/de:Englischer Garten (München)?uselang=en#Japanisches_Teehaus", link[:url]
+    assert_equal "https://de.wikipedia.org/wiki/Englischer Garten (München)?uselang=en#Japanisches_Teehaus", link[:url]
     assert_equal "de:Englischer Garten (München)#Japanisches Teehaus", link[:title]
 
     link = wikipedia_link("wikipedia", "de:Alte Brücke (Heidelberg)#Brückenaffe")
-    assert_equal "https://de.wikipedia.org/wiki/de:Alte Brücke (Heidelberg)?uselang=en#Br%C3%BCckenaffe", link[:url]
+    assert_equal "https://de.wikipedia.org/wiki/Alte Brücke (Heidelberg)?uselang=en#Br%C3%BCckenaffe", link[:url]
     assert_equal "de:Alte Brücke (Heidelberg)#Brückenaffe", link[:title]
 
     link = wikipedia_link("wikipedia", "de:Liste der Baudenkmäler in Eichstätt#Brückenstraße 1, Ehemaliges Bauernhaus")
-    assert_equal "https://de.wikipedia.org/wiki/de:Liste der Baudenkmäler in Eichstätt?uselang=en#Br%C3%BCckenstra%C3%9Fe_1%2C_Ehemaliges_Bauernhaus", link[:url]
+    assert_equal "https://de.wikipedia.org/wiki/Liste der Baudenkmäler in Eichstätt?uselang=en#Br%C3%BCckenstra%C3%9Fe_1%2C_Ehemaliges_Bauernhaus", link[:url]
     assert_equal "de:Liste der Baudenkmäler in Eichstätt#Brückenstraße 1, Ehemaliges Bauernhaus", link[:title]
 
     I18n.with_locale "pt-BR" do
       link = wikipedia_link("wikipedia", "zh-classical:Test#Section")
-      assert_equal "https://zh-classical.wikipedia.org/wiki/zh-classical:Test?uselang=pt-BR#Section", link[:url]
+      assert_equal "https://zh-classical.wikipedia.org/wiki/Test?uselang=pt-BR#Section", link[:url]
       assert_equal "zh-classical:Test#Section", link[:title]
     end
 
     link = wikipedia_link("subject:wikipedia", "en:Catherine McAuley")
-    assert_equal "https://en.wikipedia.org/wiki/en:Catherine McAuley?uselang=en", link[:url]
+    assert_equal "https://en.wikipedia.org/wiki/Catherine McAuley?uselang=en", link[:url]
     assert_equal "en:Catherine McAuley", link[:title]
 
     link = wikipedia_link("foo", "Test")
index c2883c2c09e4dffd85e51120e8852c793ec039ed..3cd53e16996a87bbe17d070d8de7c7908f2ddf22 100644 (file)
@@ -111,7 +111,7 @@ class UserHelperTest < ActionView::TestCase
 
   def test_openid_logo
     logo = openid_logo
-    assert_match %r{^<img .* src="/images/openid_small.png" />$}, logo
+    assert_match %r{^<img .* src="/images/openid.svg" .* />$}, logo
   end
 
   def test_auth_button
index 4611860d02552705267c588419d8e275353d1faa..1b0933d32b0f9c760f704ba707e49362cdc7f5ff 100644 (file)
@@ -45,47 +45,6 @@ class UserCreationTest < ActionDispatch::IntegrationTest
     assert_select "form > div > input.is-invalid#user_email"
   end
 
-  def test_user_create_association_bad_auth_provider
-    assert_difference("User.count", 0) do
-      assert_no_difference("ActionMailer::Base.deliveries.size") do
-        perform_enqueued_jobs do
-          post "/user/new",
-               :params => { :user => { :email => "test@example.com",
-                                       :display_name => "new_tester",
-                                       :pass_crypt => "testtest",
-                                       :pass_crypt_confirmation => "testtest",
-                                       :auth_provider => "noprovider",
-                                       :auth_uid => "123454321",
-                                       :consider_pd => "1" } }
-          assert_redirected_to auth_path(:provider => "noprovider", :origin => "/user/new")
-          post response.location
-        end
-      end
-    end
-    assert_response :not_found
-  end
-
-  def test_user_create_association_no_auth_uid
-    OmniAuth.config.mock_auth[:google] = :invalid_credentials
-    assert_difference("User.count", 0) do
-      assert_no_difference("ActionMailer::Base.deliveries.size") do
-        perform_enqueued_jobs do
-          post "/user/new",
-               :params => { :user => { :email => "test@example.com",
-                                       :display_name => "new_tester",
-                                       :pass_crypt => "testtest",
-                                       :pass_crypt_confirmation => "testtest",
-                                       :auth_provider => "google",
-                                       :consider_pd => "1" } }
-          assert_redirected_to auth_path(:provider => "google", :origin => "/user/new")
-          post response.location
-        end
-      end
-    end
-    follow_redirect!
-    assert_redirected_to auth_failure_path(:strategy => "google", :message => "invalid_credentials", :origin => "/user/new")
-  end
-
   def test_user_create_association_submit_duplicate_email
     dup_email = create(:user).email
     display_name = "new_tester"
@@ -275,6 +234,7 @@ class UserCreationTest < ActionDispatch::IntegrationTest
   def test_user_create_openid_success
     new_email = "newtester-openid@osm.org"
     display_name = "new_tester-openid"
+    openid_url = "http://localhost:1000/new.tester"
     auth_uid = "http://localhost:1123/new.tester"
 
     OmniAuth.config.add_mock(:openid,
@@ -284,8 +244,8 @@ class UserCreationTest < ActionDispatch::IntegrationTest
     assert_difference("User.count") do
       assert_difference("ActionMailer::Base.deliveries.size", 1) do
         perform_enqueued_jobs do
-          post auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
-          assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
+          post auth_path(:provider => "openid", :openid_url => openid_url, :origin => "/user/new")
+          assert_redirected_to auth_success_path(:provider => "openid", :openid_url => openid_url, :origin => "/user/new")
           follow_redirect!
           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name, :email => new_email,
                                :auth_provider => "openid", :auth_uid => auth_uid
@@ -294,11 +254,8 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                :params => { :user => { :email => new_email,
                                        :display_name => display_name,
                                        :auth_provider => "openid",
-                                       :auth_uid => "http://localhost:1123/new.tester",
+                                       :auth_uid => auth_uid,
                                        :consider_pd => "1" } }
-          assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
-          post response.location
-          follow_redirect!
         end
       end
     end
@@ -335,22 +292,10 @@ class UserCreationTest < ActionDispatch::IntegrationTest
   def test_user_create_openid_failure
     OmniAuth.config.mock_auth[:openid] = :connection_failed
 
-    new_email = "newtester-openid2@osm.org"
-    display_name = "new_tester-openid2"
     assert_difference("User.count", 0) do
       assert_difference("ActionMailer::Base.deliveries.size", 0) do
         perform_enqueued_jobs do
-          post "/user/new",
-               :params => { :user => { :email => new_email,
-                                       :email_confirmation => new_email,
-                                       :display_name => display_name,
-                                       :auth_provider => "openid",
-                                       :auth_uid => "http://localhost:1123/new.tester",
-                                       :pass_crypt => "",
-                                       :pass_crypt_confirmation => "" } }
-          assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
+          post auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
           follow_redirect!
           assert_redirected_to auth_failure_path(:strategy => "openid", :message => "connection_failed", :origin => "/user/new")
           follow_redirect!
@@ -363,6 +308,7 @@ class UserCreationTest < ActionDispatch::IntegrationTest
   end
 
   def test_user_create_openid_redirect
+    openid_url = "http://localhost:1000/new.tester"
     auth_uid = "http://localhost:1123/new.tester"
     new_email = "redirect_tester_openid@osm.org"
     display_name = "redirect_tester_openid"
@@ -374,8 +320,8 @@ class UserCreationTest < ActionDispatch::IntegrationTest
     assert_difference("User.count") do
       assert_difference("ActionMailer::Base.deliveries.size", 1) do
         perform_enqueued_jobs do
-          post auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
-          assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
+          post auth_path(:provider => "openid", :openid_url => openid_url, :origin => "/user/new")
+          assert_redirected_to auth_success_path(:provider => "openid", :openid_url => openid_url, :origin => "/user/new")
           follow_redirect!
           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name, :email => new_email,
                                :auth_provider => "openid", :auth_uid => auth_uid
@@ -386,11 +332,6 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                                        :auth_provider => "openid",
                                        :auth_uid => auth_uid,
                                        :consider_pd => "1" } }
-          assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
-          follow_redirect!
-          assert_redirected_to :controller => :confirmations, :action => :confirm, :display_name => display_name
           follow_redirect!
         end
       end
@@ -454,10 +395,6 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                                        :auth_uid => auth_uid,
                                        :consider_pd => "1" },
                             :email_hmac => email_hmac }
-          assert_redirected_to auth_path(:provider => "google", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "google")
-          follow_redirect!
           assert_redirected_to welcome_path
           follow_redirect!
         end
@@ -499,22 +436,11 @@ class UserCreationTest < ActionDispatch::IntegrationTest
   def test_user_create_google_failure
     OmniAuth.config.mock_auth[:google] = :connection_failed
 
-    new_email = "newtester-google2@osm.org"
-    display_name = "new_tester-google2"
     assert_difference("User.count", 0) do
       assert_difference("ActionMailer::Base.deliveries.size", 0) do
         perform_enqueued_jobs do
-          post "/user/new",
-               :params => { :user => { :email => new_email,
-                                       :email_confirmation => new_email,
-                                       :display_name => display_name,
-                                       :auth_provider => "google",
-                                       :auth_uid => "123454321",
-                                       :pass_crypt => "",
-                                       :pass_crypt_confirmation => "" } }
-          assert_redirected_to auth_path(:provider => "google", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "google")
+          post auth_path(:provider => "google", :origin => "/user/new")
+          assert_response :redirect
           follow_redirect!
           assert_redirected_to auth_failure_path(:strategy => "google", :message => "connection_failed", :origin => "/user/new")
           follow_redirect!
@@ -555,11 +481,7 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                                        :auth_provider => "google",
                                        :auth_uid => auth_uid,
                                        :consider_pd => "1" } }
-          assert_redirected_to auth_path(:provider => "google", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "google")
-          follow_redirect!
-          assert_redirected_to :controller => :confirmations, :action => :confirm, :display_name => display_name
+          assert_response :redirect
           follow_redirect!
         end
       end
@@ -622,10 +544,6 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                                        :auth_uid => auth_uid,
                                        :consider_pd => "1" },
                             :email_hmac => email_hmac }
-          assert_redirected_to auth_path(:provider => "facebook", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "facebook")
-          follow_redirect!
           assert_redirected_to welcome_path
           follow_redirect!
         end
@@ -666,22 +584,11 @@ class UserCreationTest < ActionDispatch::IntegrationTest
   def test_user_create_facebook_failure
     OmniAuth.config.mock_auth[:facebook] = :connection_failed
 
-    new_email = "newtester-facebook2@osm.org"
-    display_name = "new_tester-facebook2"
     assert_difference("User.count", 0) do
       assert_difference("ActionMailer::Base.deliveries.size", 0) do
         perform_enqueued_jobs do
-          post "/user/new",
-               :params => { :user => { :email => new_email,
-                                       :email_confirmation => new_email,
-                                       :display_name => display_name,
-                                       :auth_provider => "facebook",
-                                       :auth_uid => "123454321",
-                                       :pass_crypt => "",
-                                       :pass_crypt_confirmation => "" } }
-          assert_redirected_to auth_path(:provider => "facebook", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "facebook")
+          post auth_path(:provider => "facebook", :origin => "/user/new")
+          assert_response :redirect
           follow_redirect!
           assert_redirected_to auth_failure_path(:strategy => "facebook", :message => "connection_failed", :origin => "/user/new")
           follow_redirect!
@@ -723,11 +630,6 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                                        :auth_provider => "facebook",
                                        :auth_uid => auth_uid,
                                        :consider_pd => "1" } }
-          assert_redirected_to auth_path(:provider => "facebook", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "facebook")
-          follow_redirect!
-          assert_redirected_to :controller => :confirmations, :action => :confirm, :display_name => display_name
           assert_response :redirect
           follow_redirect!
         end
@@ -790,10 +692,6 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                                        :auth_uid => auth_uid,
                                        :consider_pd => "1" },
                             :email_hmac => email_hmac }
-          assert_redirected_to auth_path(:provider => "microsoft", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "microsoft")
-          follow_redirect!
           assert_redirected_to welcome_path
           follow_redirect!
         end
@@ -834,22 +732,11 @@ class UserCreationTest < ActionDispatch::IntegrationTest
   def test_user_create_microsoft_failure
     OmniAuth.config.mock_auth[:microsoft] = :connection_failed
 
-    new_email = "newtester-microsoft2@osm.org"
-    display_name = "new_tester-microsoft2"
     assert_difference("User.count", 0) do
       assert_difference("ActionMailer::Base.deliveries.size", 0) do
         perform_enqueued_jobs do
-          post "/user/new",
-               :params => { :user => { :email => new_email,
-                                       :email_confirmation => new_email,
-                                       :display_name => display_name,
-                                       :auth_provider => "microsoft",
-                                       :auth_uid => "123454321",
-                                       :pass_crypt => "",
-                                       :pass_crypt_confirmation => "" } }
-          assert_redirected_to auth_path(:provider => "microsoft", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "microsoft")
+          post auth_path(:provider => "microsoft", :origin => "/user/new")
+          assert_response :redirect
           follow_redirect!
           assert_redirected_to auth_failure_path(:strategy => "microsoft", :message => "connection_failed", :origin => "/user/new")
           follow_redirect!
@@ -890,11 +777,6 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                                        :auth_provider => "microsoft",
                                        :auth_uid => auth_uid,
                                        :consider_pd => "1" } }
-          assert_redirected_to auth_path(:provider => "microsoft", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "microsoft")
-          follow_redirect!
-          assert_redirected_to :controller => :confirmations, :action => :confirm, :display_name => display_name
           assert_response :redirect
           follow_redirect!
         end
@@ -962,10 +844,6 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                             :read_ct => 1,
                             :read_tou => 1,
                             :email_hmac => email_hmac }
-          assert_redirected_to auth_path(:provider => "github", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "github")
-          follow_redirect!
           assert_redirected_to welcome_path
           follow_redirect!
         end
@@ -1007,22 +885,10 @@ class UserCreationTest < ActionDispatch::IntegrationTest
   def test_user_create_github_failure
     OmniAuth.config.mock_auth[:github] = :connection_failed
 
-    new_email = "newtester-github2@osm.org"
-    display_name = "new_tester-github2"
     assert_difference("User.count", 0) do
       assert_difference("ActionMailer::Base.deliveries.size", 0) do
         perform_enqueued_jobs do
-          post "/user/new",
-               :params => { :user => { :email => new_email,
-                                       :email_confirmation => new_email,
-                                       :display_name => display_name,
-                                       :auth_provider => "github",
-                                       :auth_uid => "123454321",
-                                       :pass_crypt => "",
-                                       :pass_crypt_confirmation => "" } }
-          assert_redirected_to auth_path(:provider => "github", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "github")
+          post auth_path(:provider => "github", :origin => "/user/new")
           follow_redirect!
           assert_redirected_to auth_failure_path(:strategy => "github", :message => "connection_failed", :origin => "/user/new")
           follow_redirect!
@@ -1062,11 +928,6 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                                        :auth_provider => "github",
                                        :auth_uid => auth_uid,
                                        :consider_pd => "1" } }
-          assert_redirected_to auth_path(:provider => "github", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "github")
-          follow_redirect!
-          assert_redirected_to :controller => :confirmations, :action => :confirm, :display_name => display_name
           assert_response :redirect
           follow_redirect!
         end
@@ -1133,10 +994,6 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                             :read_ct => 1,
                             :read_tou => 1,
                             :email_hmac => email_hmac }
-          assert_redirected_to auth_path(:provider => "wikipedia", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
-          follow_redirect!
           assert_redirected_to welcome_path
           follow_redirect!
         end
@@ -1175,22 +1032,11 @@ class UserCreationTest < ActionDispatch::IntegrationTest
   def test_user_create_wikipedia_failure
     OmniAuth.config.mock_auth[:wikipedia] = :connection_failed
 
-    new_email = "newtester-wikipedia2@osm.org"
-    display_name = "new_tester-wikipedia2"
     assert_difference("User.count", 0) do
       assert_difference("ActionMailer::Base.deliveries.size", 0) do
         perform_enqueued_jobs do
-          post "/user/new",
-               :params => { :user => { :email => new_email,
-                                       :email_confirmation => new_email,
-                                       :display_name => display_name,
-                                       :auth_provider => "wikipedia",
-                                       :auth_uid => "123454321",
-                                       :pass_crypt => "",
-                                       :pass_crypt_confirmation => "" } }
-          assert_redirected_to auth_path(:provider => "wikipedia", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
+          post auth_path(:provider => "wikipedia", :origin => "/user/new")
+          assert_response :redirect
           follow_redirect!
           assert_redirected_to auth_failure_path(:strategy => "wikipedia", :message => "connection_failed", :origin => "/user/new")
           follow_redirect!
@@ -1232,11 +1078,6 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                                        :auth_provider => "wikipedia",
                                        :auth_uid => auth_uid,
                                        :consider_pd => "1" } }
-          assert_redirected_to auth_path(:provider => "wikipedia", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
-          follow_redirect!
-          assert_redirected_to :controller => :confirmations, :action => :confirm, :display_name => display_name
           assert_response :redirect
           follow_redirect!
         end
index 033a221d4e5ccca7c1e898cfa3f47c7b9eecc8ea..8dc9e49b1180582535d0939b67fdd3ede88219be 100644 (file)
@@ -250,6 +250,31 @@ class RichTextTest < ActiveSupport::TestCase
     assert_equal 141, r.spam_score.round
   end
 
+  def test_text_no_image
+    r = RichText.new("text", "foo https://example.com/ bar")
+    assert_nil r.image
+  end
+
+  def test_html_no_image
+    r = RichText.new("html", "foo <a href='https://example.com/'>bar</a> baz")
+    assert_nil r.image
+  end
+
+  def test_markdown_no_image
+    r = RichText.new("markdown", "foo [bar](https://example.com/) baz")
+    assert_nil r.image
+  end
+
+  def test_markdown_image
+    r = RichText.new("markdown", "foo ![bar](https://example.com/image.jpg) baz")
+    assert_equal "https://example.com/image.jpg", r.image
+  end
+
+  def test_markdown_first_image
+    r = RichText.new("markdown", "foo ![bar1](https://example.com/image1.jpg) baz\nfoo ![bar2](https://example.com/image2.jpg) baz")
+    assert_equal "https://example.com/image1.jpg", r.image
+  end
+
   private
 
   def assert_html(richtext, &block)
index 0c3bd5c63097296c8e592e6c7262a55f3b98d8a6..17fcde1625c8dad0f2e725280b22976b6a90dea4 100644 (file)
--- a/yarn.lock
+++ b/yarn.lock
   resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz#1816b5f6948029c5eaacb0703b850ee0cb37d8f8"
   integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==
 
-"@eslint/eslintrc@^3.0.2":
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.0.2.tgz#36180f8e85bf34d2fe3ccc2261e8e204a411ab4e"
-  integrity sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==
+"@eslint/config-array@^0.15.1":
+  version "0.15.1"
+  resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.15.1.tgz#1fa78b422d98f4e7979f2211a1fde137e26c7d61"
+  integrity sha512-K4gzNq+yymn/EVsXYmf+SBcBro8MTf+aXJZUphM96CdzUEr+ClGDvAbpmaEK+cGVigVXIgs9gNmvHAlrzzY5JQ==
+  dependencies:
+    "@eslint/object-schema" "^2.1.3"
+    debug "^4.3.1"
+    minimatch "^3.0.5"
+
+"@eslint/eslintrc@^3.1.0":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6"
+  integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==
   dependencies:
     ajv "^6.12.4"
     debug "^4.3.2"
     minimatch "^3.1.2"
     strip-json-comments "^3.1.1"
 
-"@eslint/js@9.2.0":
-  version "9.2.0"
-  resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.2.0.tgz#b0a9123e8e91a3d9a2eed3a04a6ed44fdab639aa"
-  integrity sha512-ESiIudvhoYni+MdsI8oD7skpprZ89qKocwRM2KEvhhBJ9nl5MRh7BXU5GTod7Mdygq+AUl+QzId6iWJKR/wABA==
+"@eslint/js@9.4.0":
+  version "9.4.0"
+  resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.4.0.tgz#96a2edd37ec0551ce5f9540705be23951c008a0c"
+  integrity sha512-fdI7VJjP3Rvc70lC4xkFXHB0fiPeojiL1PxVG6t1ZvXQrarj893PweuBTujxDUFk0Fxj4R7PIIAZ/aiiyZPZcg==
 
-"@humanwhocodes/config-array@^0.13.0":
-  version "0.13.0"
-  resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748"
-  integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==
-  dependencies:
-    "@humanwhocodes/object-schema" "^2.0.3"
-    debug "^4.3.1"
-    minimatch "^3.0.5"
+"@eslint/object-schema@^2.1.3":
+  version "2.1.3"
+  resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.3.tgz#e65ae80ee2927b4fd8c5c26b15ecacc2b2a6cc2a"
+  integrity sha512-HAbhAYKfsAC2EkTqve00ibWIZlaU74Z1EHwAjYr4PXF0YU2VEA1zSIKSSpKszRLRWwHzzRZXvK632u+uXzvsvw==
 
 "@humanwhocodes/module-importer@^1.0.1":
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
   integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
 
-"@humanwhocodes/object-schema@^2.0.3":
-  version "2.0.3"
-  resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3"
-  integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==
-
-"@humanwhocodes/retry@^0.2.3":
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.2.3.tgz#c9aa036d1afa643f1250e83150f39efb3a15a631"
-  integrity sha512-X38nUbachlb01YMlvPFojKoiXq+LzZvuSce70KPMPdeM1Rj03k4dR7lDslhbqXn3Ang4EU3+EAmwEAsbrjHW3g==
+"@humanwhocodes/retry@^0.3.0":
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570"
+  integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==
 
 "@nodelib/fs.scandir@2.1.5":
   version "2.1.5"
@@ -246,17 +246,17 @@ eslint-visitor-keys@^4.0.0:
   integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==
 
 eslint@^9.0.0:
-  version "9.2.0"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.2.0.tgz#0700ebc99528753315d78090876911d3cdbf19fe"
-  integrity sha512-0n/I88vZpCOzO+PQpt0lbsqmn9AsnsJAQseIqhZFI8ibQT0U1AkEKRxA3EVMos0BoHSXDQvCXY25TUjB5tr8Og==
+  version "9.4.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.4.0.tgz#79150c3610ae606eb131f1d648d5f43b3d45f3cd"
+  integrity sha512-sjc7Y8cUD1IlwYcTS9qPSvGjAC8Ne9LctpxKKu3x/1IC9bnOg98Zy6GxEJUfr1NojMgVPlyANXYns8oE2c1TAA==
   dependencies:
     "@eslint-community/eslint-utils" "^4.2.0"
     "@eslint-community/regexpp" "^4.6.1"
-    "@eslint/eslintrc" "^3.0.2"
-    "@eslint/js" "9.2.0"
-    "@humanwhocodes/config-array" "^0.13.0"
+    "@eslint/config-array" "^0.15.1"
+    "@eslint/eslintrc" "^3.1.0"
+    "@eslint/js" "9.4.0"
     "@humanwhocodes/module-importer" "^1.0.1"
-    "@humanwhocodes/retry" "^0.2.3"
+    "@humanwhocodes/retry" "^0.3.0"
     "@nodelib/fs.walk" "^1.2.8"
     ajv "^6.12.4"
     chalk "^4.0.0"
@@ -512,9 +512,9 @@ keyv@^4.5.4:
     json-buffer "3.0.1"
 
 leaflet.locatecontrol@^0.81.0:
-  version "0.81.0"
-  resolved "https://registry.yarnpkg.com/leaflet.locatecontrol/-/leaflet.locatecontrol-0.81.0.tgz#75e92d07c19edade910a2b5a177ac24cef7d10e7"
-  integrity sha512-5Dqj6VXVFl1vPquYZW95hQYegvzqSI4eLIpZrBMuHuyoAo5i9y6js3z02TF//XXZByIyTI/XBtlxlZLUM08Pcg==
+  version "0.81.1"
+  resolved "https://registry.yarnpkg.com/leaflet.locatecontrol/-/leaflet.locatecontrol-0.81.1.tgz#8aec3124ef5cdda3476fd9013315789b4e301a45"
+  integrity sha512-ZtsdScGufPw330X3UIaGGjnfQ1NrhLySnlruWufIMnfzsHgQPz0+mSxsCQMVh7QgOBoefCGb/lioSejiaNx1EQ==
 
 leaflet@^1.8.0:
   version "1.9.4"
@@ -576,9 +576,9 @@ optionator@^0.9.3:
     type-check "^0.4.0"
 
 osm-community-index@^5.2.0:
-  version "5.6.3"
-  resolved "https://registry.yarnpkg.com/osm-community-index/-/osm-community-index-5.6.3.tgz#8c7621683a2a4c1037ddb14d060b8442a3aa15cb"
-  integrity sha512-UnJBRbaMPIM3J08CA1crKeAok6c1HYiK6tB8AdnjvrvGNnl2JXPxdztA4Jcb3pbrjq/0q14v1mBr300TmtMwbQ==
+  version "5.7.1"
+  resolved "https://registry.yarnpkg.com/osm-community-index/-/osm-community-index-5.7.1.tgz#2341666c83d14c00ef3d9a90298c96d5e791b56c"
+  integrity sha512-E+Xib5m//WliNq2iqeUXyKqZk7yhZu/vSJbwwyxDAPzcNWxgIMoO0B7cUMeFNckhMQsKM2UuC2BAjWuVfbYf1Q==
   dependencies:
     diacritics "^1.3.0"