diff options
110 files changed, 2199 insertions, 656 deletions
diff --git a/.gitignore b/.gitignore index ab8556fb0..eac22039e 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,5 @@ tags /web/cobrands/reading/css/css.css /web/css/core.css /web/css/main.css +/web/cobrands/fixmystreet/*.css /local diff --git a/bin/send-alerts b/bin/send-alerts index 89dc18ee7..4464b16e9 100755 --- a/bin/send-alerts +++ b/bin/send-alerts @@ -1,4 +1,4 @@ -#!/usr/bin/perl -w +#!/usr/bin/env perl -w # send-alerts: # Email alerts for FixMyStreet diff --git a/bin/send-questionnaires b/bin/send-questionnaires index d6e269e32..4910abc02 100755 --- a/bin/send-questionnaires +++ b/bin/send-questionnaires @@ -1,4 +1,4 @@ -#!/usr/bin/perl -w +#!/usr/bin/env perl -w # send-questionnaires: # Send out creator questionnaires diff --git a/bin/send-reports b/bin/send-reports index f1d8c5742..d92c10467 100755 --- a/bin/send-reports +++ b/bin/send-reports @@ -1,4 +1,4 @@ -#!/usr/bin/perl -w +#!/usr/bin/env perl -w # send-reports: # Send new problem reports to councils diff --git a/bin/showcouncilrates b/bin/showcouncilrates index cc8ce8d10..1dacae597 100755 --- a/bin/showcouncilrates +++ b/bin/showcouncilrates @@ -26,9 +26,10 @@ BEGIN { my $query = "SELECT council, COUNT(*) AS total, SUM(fixed) AS fixed FROM (SELECT council, - CASE WHEN state = 'fixed' THEN 1 ELSE 0 END AS fixed + CASE WHEN state in ('fixed','fixed - user', 'fixed - council') + THEN 1 ELSE 0 END AS fixed FROM problem WHERE confirmed IS NOT NULL AND - state IN ('fixed', 'confirmed') AND + state IN ('fixed', 'fixed - user', 'fixed - council', 'confirmed') AND whensent < NOW() - INTERVAL '4 weeks') AS a GROUP BY council"; diff --git a/bin/update-all-reports b/bin/update-all-reports index 2263a3d9d..c87977f68 100755 --- a/bin/update-all-reports +++ b/bin/update-all-reports @@ -1,4 +1,4 @@ -#!/usr/bin/perl +#!/usr/bin/env perl # update-all-reports: # Generate the data for the /reports page diff --git a/commonlib b/commonlib -Subproject 7486b07a4a865f977df04c3c34de759126c014e +Subproject 4c2e8e4d8b27aa043d5aa120622a659b56f494d diff --git a/conf/.gitignore b/conf/.gitignore index 0a78c8825..f0c34fd29 100644 --- a/conf/.gitignore +++ b/conf/.gitignore @@ -1,4 +1,4 @@ -/general -/general.deployed +/general.yml +/general.yml.deployed /httpd.conf /httpd.conf.deployed diff --git a/conf/packages b/conf/packages index 3168be1e5..cf2247988 100644 --- a/conf/packages +++ b/conf/packages @@ -33,3 +33,5 @@ liblist-moreutils-perl libhaml-ruby libtemplate-perl postgresql-server-dev-8.4 +gnuplot +ttf-bitstream-vera diff --git a/notes/INSTALL b/notes/INSTALL index 7287aa3d3..560eb6c0f 100644 --- a/notes/INSTALL +++ b/notes/INSTALL @@ -14,14 +14,14 @@ conf/packages is a list of Debian packages that are needed, so install them if you're on Debian/Ubuntu. You'll also probably need to install lots of CPAN modules, see the section on that below. -FixMyStreet expects a PostgreSQL database with the postGIS extension, so set one -of them up - the schema is available in db/schema.sql. You will also need to load -in db/alert_types.sql to populate the alert types table. +FixMyStreet expects a PostgreSQL database, so set one of them up - the schema +is available in db/schema.sql. You will also need to load in db/alert_types.sql +to populate the alert types table. -Copy conf/general-example to conf/general and set it up appropriately: +Copy conf/general.yml-example to conf/general.yml and set it up appropriately: * provide the relevant database connection details -* the OPTION_BASE_URL to be where your test site will run - eg 'http://localhost' -* set OPTION_UPLOAD_CACHE and OPTION_GEO_CACHE to your preferred values +* the BASE_URL to be where your test site will run - eg 'http://localhost' +* set UPLOAD_CACHE and GEO_CACHE to your preferred values * MAP_TYPE - OSM is probably the best one to try to start with, it's being successfully used. @@ -83,6 +83,12 @@ Note: Others are starting to work on this and it might be a good idea to switch to their output: http://blogs.perl.org/users/sebastian_willert/2011/03/how-i-distribute-my-projects.html +Notes +----- + +* no-update-server is a shell script used by NUUG for setting up + www.fiksgatami.no using the FixMyStreet codebase. + Running the code ================ diff --git a/notes/no-update-server b/notes/no-update-server new file mode 100644 index 000000000..ad1ce26e2 --- /dev/null +++ b/notes/no-update-server @@ -0,0 +1,534 @@ +#!/bin/sh +# +# This is a script used by Norway to bootstrap/update their FixMyStreet and +# mapit installations. It may be helpful to you in order to see what it does, +# but also is quite specific about where things are located and so on. +# We hope to improve the installation process in the near future. +# +# Single argument is one of 'bootstrap' 'update' 'remove' or 'update_map' + +# Exit on first error +set -e + +PATH=/sbin:/usr/sbin:$PATH +export PATH + +servername=$(hostname) +basedir=/srv/$servername +codename=$(lsb_release -cs) + +install_debs() { + # Statistics::Distributions is created locally + dpkg -i /root/libstatistics-distributions-perl_1.02-1_all.deb + + # Install fixmystreet dependencies + apt-get install -y $(cat fixmystreet/conf/packages) \ + libregexp-common-perl +# libcache-memcached-perl libfile-slurp-perl \ +# libgeography-nationalgrid-perl liberror-perl libwww-perl \ +# libimage-magick-perl libdbd-pg-perl libio-string-perl \ +# libregexp-common-perl libmath-bigint-gmp-perl libdigest-sha1-perl \ +# libxml-rss-perl libfcgi-perl libjson-perl libimage-size-perl \ +# php5-cli postgresql apache2 libtext-template-perl libtext-csv-perl + + # Install mapit dependencies + apt-get install -y $(cat mapit/conf/packages) + + apt-get install -y libapache2-mod-fcgid + apt-get install -y pwgen + + apt-get install -y gnuplot ttf-bitstream-vera + + # XXX Also need to fetch and compile + # https://secure.mysociety.org/cvstrac/dir?d=mysociety/run-with-lockfile +} + +# Load Debian and CPAN packages needed for the Catalyst version +install_dev_catalyst() { + apt-get install -y libcatalyst-perl \ + libreadonly-perl \ + libclass-c3-componentised-perl \ + libfile-find-rule-perl \ + libcatalyst-modules-perl \ + libcatalyst-modules-extra-perl \ + libdatetime-format-iso8601-perl \ + libdatetime-format-http-perl \ + libdatetime-format-pg-perl \ + libdbd-pg-perl \ + libsub-override-perl \ + libhtml-treebuilder-xpath-perl \ + libtest-requires-perl \ + libhtml-selector-xpath-perl \ + libtest-base-perl \ + libdbix-class-encodedcolumn-perl \ + libcrypt-eksblowfish-perl \ + libdatetime-format-w3cdtf-perl \ + libhaml-ruby + + # Workaround for missing Perl modules in Debian + ( + installcpandeb() { + pkg=$1 + echo "info: Generating deb for $pkg" + debs=$(LC_ALL=C cpan2deb $pkg 2>&1 |grep 'dpkg-deb: building package'| sed "s/.* in \`\(.*\)'./\1/" | sed 's%^../%%') + echo "info: Installing $debs" + dpkg -i $debs + } + + mkdir -p /srv/src + cd /srv/src + + apt-get install -y dh-make-perl apt-file + apt-file update + + installcpandeb URI::SmartURI + installcpandeb Catalyst::Plugin::SmartURI + installcpandeb Catalyst::Plugin::Unicode::Encoding + installcpandeb Web::Scraper + installcpandeb Sort::Key + installcpandeb Term::Size::Perl + installcpandeb Devel::Hide + installcpandeb Term::Size::Any + installcpandeb Template::Plugin::DateTime::Format + installcpandeb Template::Plugin::Comma + # Upgrade from 0.34 in Squeeze, to get expose_methods provided + # since 0.35. + installcpandeb Catalyst::View::TT + + # App::cpanminus, Bundle::DBD::Pg, CPAN::ParseDistribution + ) +} + +pgsql_createuser() { + dbuser="$1" + dbpassword="$2" + su postgres -c "createuser -SDRl $dbuser" + su postgres -c "psql -c \"alter user \\\"$dbuser\\\" with password '$dbpassword';\"" +} + +pgsql_fixmystreet_bootstrap() { + dbuser="$1" + dbname="$2" + su postgres -c "createdb -E UTF8 --owner $dbuser $dbname; createlang plpgsql $dbname" + su $dbuser -c "psql $dbname -f $basedir/fixmystreet/db/schema.sql" + su $dbuser -c "psql $dbname -f $basedir/fixmystreet/db/alert_types.sql" +} + +pgsql_mapit_bootstrap() { + dbuser="$1" + dbname="$2" + su postgres -c "createdb -E UTF8 -T template_postgis --owner $dbuser $dbname" + # No need to use "createlang plpgsql $dbname", as template_postgis + # already include it. +} + +pgsql_remove_db() { + dbname="$1" + su postgres -c "dropdb $dbname" +} +pgsql_remove_user() { + dbuser="$1" + su postgres -c "dropuser $dbuser" +} + +postgis_bootstrap() { + case "$codename" in + lenny) + POSTGIS_SQL_PATH=/usr/share/postgresql-8.3-postgis + POSTGISSQL=lwpostgis.sql + ;; + *) + POSTGIS_SQL_PATH=/usr/share/postgresql/8.4/contrib/postgis-1.5 + POSTGISSQL=postgis.sql + ;; + esac + + su postgres -c "createdb -E UTF8 template_postgis" + su postgres -c "createlang -d template_postgis plpgsql" + su postgres -c "psql -d postgres -c \"UPDATE pg_database SET datistemplate='true' WHERE datname='template_postgis';\"" + + # Loading the PostGIS SQL routines + su postgres -c "psql -d template_postgis -f $POSTGIS_SQL_PATH/$POSTGISSQL" + su postgres -c "psql -d template_postgis -f $POSTGIS_SQL_PATH/spatial_ref_sys.sql" + # Enabling users to alter spatial tables. + su postgres -c "psql -d template_postgis -c \"GRANT ALL ON geometry_columns TO PUBLIC;\"" + su postgres -c "psql -d template_postgis -c \"GRANT ALL ON spatial_ref_sys TO PUBLIC;\"" +} + +postgis_remove() { + # Change template status to make it possible to drop the database + su postgres -c "psql -d postgres -c \"UPDATE pg_database SET datistemplate='false' WHERE datname='template_postgis';\"" + su postgres -c "dropdb template_postgis" +} + +apache_config() { + cat > /etc/apache2/sites-available/fixmystreet <<EOF +<VirtualHost *:80> + ServerName $servername + ServerAlias fiksgatami.no www.fiksgatami.no + DocumentRoot $basedir/fixmystreet/web/ + + # 5 MB limit to allow large images to be uploaded + FcgidMaxRequestLen 5242880 + + RewriteEngine on + RewriteCond %{HTTP_HOST} ^fiksgatami\.no + RewriteRule ^(.*)$ http://www.fiksgatami.no$1 [R=permanent,L] + RewriteCond %{HTTP_HOST} ^fiksgatami\.nuug\.no + RewriteRule ^(.*)$ http://www.fiksgatami.no$1 [R=permanent,L] + + # Pull in the specific config + Include $basedir/fixmystreet/conf/httpd.conf + + <Directory $basedir/fixmystreet/web> + # You also need to enable cgi files to run as CGI scripts. For example: + # on production servers these are run under fastcgi + Options +ExecCGI + AddHandler fcgid-script .cgi + </Directory> + + <Location /admin> + Options +ExecCGI + AddHandler fcgid-script .cgi + + AllowOverride AuthConfig + Order Allow,Deny + Allow From All + + AuthName "Fiksgatami Admin Access" + AuthType Basic + AuthUserFile /etc/apache2/htpasswd.fixmystreet.users + require valid-user + </Location> + + Alias /admin/ $basedir/fixmystreet/web-admin/ + Alias /jslib/ $basedir/fixmystreet/commonlib/jslib/ +</VirtualHost> +EOF + + ( + cd $basedir + sed s/mapit.mysociety.org/mapit.nuug.no/ \ + < fixmystreet/conf/httpd.conf-example \ + > fixmystreet/conf/httpd.conf + ) + + htpwdfile=/etc/apache2/htpasswd.fixmystreet.users + if [ ! -e $htpwdfile ] ; then + htpasswd -cmb $htpwdfile admin "$webpassword" + fi + + case "$codename" in + lenny) + djangodir=/var/lib/python-support/python2.5/django + ;; + *) + djangodir=/var/lib/python-support/python2.6/django + ;; + esac + cat > /etc/apache2/sites-available/mapit <<EOF +<VirtualHost *:80> + ServerName mapit.nuug.no + ServerAlias mapit-dev.nuug.no + DocumentRoot $basedir/mapit/web/ + + WSGIDaemonProcess mapit.nuug.no user=www-data group=www-data processes=5 threads=1 display-name=mapit.nuug.no + WSGIProcessGroup mapit.nuug.no + + WSGIScriptAlias / $basedir/mapit/web/django.wsgi + + Alias /media $djangodir/contrib/admin/media + Alias /static $basedir/mapit/mapit/static + + <Directory $basedir/mapit/web> + # You also need to enable cgi files to run as CGI scripts. For example: + # on production servers these are run under fastcgi + Options +ExecCGI + AddHandler fcgid-script .cgi + </Directory> +</VirtualHost> +EOF + a2dissite default + a2ensite fixmystreet + a2ensite mapit + a2enmod proxy rewrite + a2enmod proxy_http + a2enmod expires + /etc/init.d/apache2 restart +} + +apache_stop() { + /etc/init.d/apache2 stop +} + +apache_remove() { + a2dissite fixmystreet + a2dissite mapit + /etc/init.d/apache2 restart + rm /etc/apache2/sites-available/fixmystreet + rm /etc/apache2/sites-available/mapit +} + + +fetch_git_source() { + for gitmodule in fixmystreet mapit ; do + if [ ! -d $gitmodule ] ; then + git clone git://github.com/petterreinholdtsen/$gitmodule.git -b $servername || \ + git clone https://github.com/mysociety/$gitmodule.git + (cd $gitmodule && + git submodule update --init) + else + (cd $gitmodule && + git pull && + git submodule update && + git diff) | cat + fi + done + + # Update translation files + (cd fixmystreet && commonlib/bin/gettext-makemo) + + # Generate CSS files + (cd fixmystreet && bin/make_css) + + # Not quite sure why this directory is needed + mkdir -p fixmystreet/perl-external/local-lib +} + +update_fixmystreet_config() { + dbuser="$1" + fgmdbpassword="$2" + dbname="$3" + cat > $basedir/fixmystreet/conf/general.yml <<EOF +# general-example.yml: +# Example values for the "general" config file. +# +# Configuration parameters, in YAML syntax. +# +# Copy this file to one called "general.yml" in the same directory. Or +# have multiple config files and use a symlink to change between them. + +FMS_DB_HOST: 'localhost' +FMS_DB_PORT: '5432' +FMS_DB_NAME: '$dbname' +FMS_DB_USER: '$dbuser' +FMS_DB_PASS: '$fgmdbpassword' + +BASE_URL: 'http://$servername' + +EMAIL_DOMAIN: 'nuug.no' +CONTACT_EMAIL: '' +TEST_EMAIL_PREFIX: '' + +CONTACT_NAME: 'FiksGataMi' +STAGING_SITE: 1 + +UPLOAD_CACHE: '/var/lib/fixmystreet/upload/' +GEO_CACHE: '/var/lib/fixmystreet/cache/' +GOOGLE_MAPS_API_KEY: '' + +MAPIT_URL: 'http://mapit.nuug.no' +MAP_TYPE: 'OSM' +EVEL_URL: '' +GAZE_URL: 'http://gaze.mysociety.org/gaze' + +# empty = use /usr/sbin/sendmail' +SMTP_SMARTHOST: '' + +AUTH_SHARED_SECRET: '' +HEARFROMYOURMP_BASE_URL: '' + +IPHONE_URL: '' +ANDROID_URL: 'http://wiki.nuug.no/grupper/fiksgatami/android' + +# Log file (used in test harness, and later in admin scripts) +HTTPD_ERROR_LOG: '/var/log/apache/error.log + +ALLOWED_COBRANDS: 'fiksgatami' + +# How many items are returned in the GeoRSS feeds by default +RSS_LIMIT: '200' + +OSM_GUESS_OPERATOR: 1 + +# Should problem reports link to the council summary pages? +AREA_LINKS_FROM_PROBLEMS: 1 + +EOF + if [ ! -d /var/lib/fixmystreet ] ; then + ( + mkdir /var/lib/fixmystreet && \ + cd /var/lib/fixmystreet && \ + mkdir cache && \ + mkdir upload && \ + chown www-data cache && \ + chown www-data upload + ) + fi +} + +update_mapit_config() { + dbuser="$1" + dbpassword="$2" + dbname="$3" + + if [ -e $basedir/mapit/conf/general ] ; then + mv $basedir/mapit/conf/general $basedir/mapit/conf/general.old-$$ + fi + cat > $basedir/mapit/conf/general.yml <<EOF +# Connection details for database +MAPIT_DB_NAME: '$dbname' +MAPIT_DB_USER: '$dbuser' +MAPIT_DB_PASS: '$dbpassword' + +MAPIT_DB_HOST: null +MAPIT_DB_PORT: null + +# Country is currently one of GB, NO, or KE +COUNTRY: 'NO' +# An EPSG code for what the areas are stored as. 27700 is OSGB, 4326 for WGS84. +AREA_SRID: 4326 +STAGING: 0 +RATE_LIMIT: [] +BUGS_EMAIL: '' + +DJANGO_SECRET_KEY: '' +EOF +} + +mapit_manage="$basedir/mapit/project/manage.py" + +load_mapit_n5000() { + N5000SHP="$basedir/N5000 shape/N5000_AdministrativFlate.shp" + su www-data -c "$mapit_manage generation_create --commit --desc 'N5000 Norway'" + su www-data -c "$mapit_manage import_norway_n5000 --commit '$N5000SHP'" +# su www-data -c "$mapit_manage find_parents" + su www-data -c "$mapit_manage generation_activate --commit" +} + +load_mapit_osm() { + python $basedir/mapit/bin/osm_to_kml + # This require changes in the code + if [ new-generation = "$1" ] ; then + su www-data -c "$mapit_manage generation_create --commit --desc 'OpenStreetmap.org'" + fi + su www-data -c "$mapit_manage import_norway_osm --commit $basedir/mapit/data/cache/*.kml" +# su www-data -c "$mapit_manage find_parents" +# su www-data -c "$mapit_manage import_area_unions --commit data/norway/regions.csv" + if [ new-generation = "$1" ] ; then + su www-data -c "$mapit_manage generation_activate --commit" + fi +} + +load_mapit_postcodes() { + rm -f postnummer-utf8.txt postnummer-ekstra.csv + wget http://www.erikbolstad.no/nedlasting/postnummer-utf8.txt + wget http://www.nuug.no/prosjekt/fiksgatami/postnummer-ekstra.csv + su www-data -c "$mapit_manage import_bolstad_postcodes postnummer-utf8.txt" + su www-data -c "$mapit_manage import_bolstad_postcodes postnummer-ekstra.csv" +} + +# This one need to run as user www-data +load_mapit() { + su www-data -c "$mapit_manage syncdb --noinput" + su www-data -c "$mapit_manage migrate" + su www-data -c "$mapit_manage loaddata norway" + #load_mapit_n5000 + load_mapit_osm new-generation + load_mapit_postcodes || true +} + +setup_locale() { + cat > /etc/locale.gen <<EOF +en_GB.UTF-8 UTF-8 +en_US.UTF-8 UTF-8 +nb_NO.UTF-8 UTF-8 +nn_NO.UTF-8 UTF-8 +EOF + locale-gen +} + +flush_memcache() { + (echo flush_all; sleep 1) | telnet localhost 11211 || true +} + +append_if_missing() { + file="$1" + string="$2" + if [ -e "$file" ] ; then + if ! grep -qxF "$string" "$file" ; then + echo "Appending '$string' to $file." + echo "$string" >> $file + fi + fi +} +tune_postgresql() { + conf=/etc/postgresql/8.4/main/postgresql.conf + append_if_missing $conf "effective_cache_size = 256MB" + append_if_missing $conf "shared_buffers = 128MB" + append_if_missing $conf "log_min_duration_statement = 250" + + touch /etc/sysctl.d/postgresql.conf + append_if_missing /etc/sysctl.d/postgresql.conf "kernel.shmmax = 136314880" + sysctl -w kernel.shmmax=$(( 130 * 1024 * 1024 )) + /etc/init.d/postgresql reload +} + +cd /srv/$servername/ + +case "$1" in + bootstrap) + fetch_git_source + install_debs + if [ yes = "$CATALYST" ] ; then + install_dev_catalyst + fi + + +# Not yet ready, should adjust dynamically based on memory size +# tune_postgresql + + # Password to use when connecting to the postgresql database. + fgmdbpassword="$(pwgen -1)" + midbpassword="$(pwgen -1)" + webpassword="$(pwgen -1)" + + postgis_bootstrap + pgsql_createuser www-data "$fgmdbpassword" + pgsql_createuser mapit "$midbpassword" + pgsql_fixmystreet_bootstrap www-data fixmystreet + update_fixmystreet_config www-data "$fgmdbpassword" fixmystreet + pgsql_mapit_bootstrap www-data mapit + update_mapit_config www-data "$midbpassword" mapit + load_mapit + setup_locale + apache_config + ;; + remove) + apache_stop + flush_memcache + pgsql_remove_db fixmystreet || true + pgsql_remove_db mapit || true + pgsql_remove_user mapit || true + pgsql_remove_user www-data || true + postgis_remove || true + apache_remove || true + rm $basedir/mapit/data/cache/relation-* + ;; + update) + fetch_git_source + fgmdbpassword=$(grep OPTION_BCI_DB_PASS $basedir/fixmystreet/conf/general | cut -d\' -f4) + midbpassword=$(grep OPTION_MAPIT_DB_PASS $basedir/mapit/conf/general | cut -d\' -f4) + + update_fixmystreet_config www-data $fgmdbpassword fixmystreet + update_mapit_config www-data $midbpassword mapit + apache_config + flush_memcache + ;; + update_map) + rm $basedir/mapit/data/cache/relation-* + load_mapit_osm + flush_memcache + ;; +esac + diff --git a/perl-external/bin/cpanm b/perl-external/bin/cpanm index 15996e72c..9aeb9c906 100755 --- a/perl-external/bin/cpanm +++ b/perl-external/bin/cpanm @@ -1,6 +1,6 @@ -#!/usr/bin/perl +#!/usr/bin/env perl -eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' +eval 'exec /usr/bin/env perl -S $0 ${1+"$@"}' if 0; # not running under some shell # # You want to install cpanminus? Run the following command and it will diff --git a/perllib/CrossSell.pm b/perllib/CrossSell.pm index 9235d0a03..4a0f31ea8 100644 --- a/perllib/CrossSell.pm +++ b/perllib/CrossSell.pm @@ -167,7 +167,7 @@ EOF sub display_advert ($$;$%) { my ($c, $email, $name, %data) = @_; - return '' unless $c->cobrand->is_default; + return '' unless $c->cobrand->moniker eq 'fixmystreet'; #if (defined $data{council} && $data{council} eq '2326') { # my ($out, $ad) = display_hfyc_cheltenham_advert($email, $name); diff --git a/perllib/FixMyStreet/App/Controller/Admin.pm b/perllib/FixMyStreet/App/Controller/Admin.pm index c988b23c1..0e34ea64b 100644 --- a/perllib/FixMyStreet/App/Controller/Admin.pm +++ b/perllib/FixMyStreet/App/Controller/Admin.pm @@ -81,7 +81,7 @@ sub index : Path : Args(0) { $c->stash->{alerts} = \%alert_counts; - my $contacts = $c->model('DB::Contact')->summary_count( $c->cobrand->contact_restriction ); + my $contacts = $c->model('DB::Contact')->summary_count(); my %contact_counts = map { $_->confirmed => $_->get_column('confirmed_count') } $contacts->all; @@ -770,7 +770,7 @@ sub update_edit : Path('update_edit') : Args(1) { # If we're hiding an update, see if it marked as fixed and unfix if so if ( $new_state eq 'hidden' && $update->mark_fixed ) { - if ( $update->problem->state eq 'fixed' ) { + if ( $update->problem->state =~ /^fixed/ ) { $update->problem->state('confirmed'); $update->problem->update; } diff --git a/perllib/FixMyStreet/App/Controller/Alert.pm b/perllib/FixMyStreet/App/Controller/Alert.pm index ff92a7d2d..40dde455e 100644 --- a/perllib/FixMyStreet/App/Controller/Alert.pm +++ b/perllib/FixMyStreet/App/Controller/Alert.pm @@ -27,8 +27,6 @@ Show the alerts page sub index : Path('') : Args(0) { my ( $self, $c ) = @_; - $c->stash->{cobrand_form_elements} = $c->cobrand->form_elements('alerts'); - unless ( $c->req->referer && $c->req->referer =~ /fixmystreet\.com/ ) { $c->forward( 'add_recent_photos', [10] ); } @@ -149,7 +147,6 @@ sub updates : Path('updates') : Args(0) { $c->stash->{email} = $c->req->param('rznvy'); $c->stash->{problem_id} = $c->req->param('id'); - $c->stash->{cobrand_form_elements} = $c->cobrand->form_elements('alerts'); } =head2 confirm @@ -508,8 +505,6 @@ sub setup_request : Private { $c->stash->{rznvy} ||= $c->user->email; } - $c->stash->{cobrand_form_elements} = $c->cobrand->form_elements('alerts'); - return 1; } diff --git a/perllib/FixMyStreet/App/Controller/Report.pm b/perllib/FixMyStreet/App/Controller/Report.pm index 6596615c6..166f9d58e 100644 --- a/perllib/FixMyStreet/App/Controller/Report.pm +++ b/perllib/FixMyStreet/App/Controller/Report.pm @@ -100,10 +100,6 @@ sub format_problem_for_display : Private { $c->stash->{banner} = $c->cobrand->generate_problem_banner($problem); - $c->stash->{cobrand_alert_fields} = $c->cobrand->form_elements('/alerts'); - $c->stash->{cobrand_update_fields} = - $c->cobrand->form_elements('/updateForm'); - ( $c->stash->{short_latitude}, $c->stash->{short_longitude} ) = map { Utils::truncate_coordinate($_) } ( $problem->latitude, $problem->longitude ); diff --git a/perllib/FixMyStreet/App/Controller/Report/New.pm b/perllib/FixMyStreet/App/Controller/Report/New.pm index e982d6a4c..1e5825460 100644 --- a/perllib/FixMyStreet/App/Controller/Report/New.pm +++ b/perllib/FixMyStreet/App/Controller/Report/New.pm @@ -654,13 +654,15 @@ sub process_user : Private { $report->user( $user ); $report->name( $user->name ); $c->stash->{field_errors}->{name} = _('You have successfully signed in; please check and confirm your details are accurate:'); + $c->log->info($user->id . ' logged in during problem creation'); return 1; } # set the user's name, phone, and password $report->user->name( Utils::trim_text( $params{name} ) ) if $params{name}; $report->user->phone( Utils::trim_text( $params{phone} ) ); - $report->user->password( Utils::trim_text( $params{password_register} ) ); + $report->user->password( Utils::trim_text( $params{password_register} ) ) + if $params{password_register}; $report->name( Utils::trim_text( $params{name} ) ); return 1; @@ -957,10 +959,12 @@ sub save_user_and_report : Private { $report->user->phone( undef ); $report->user->password( '', 1 ); $report->user->insert(); + $c->log->info($report->user->id . ' created for this report'); } elsif ( $c->user && $report->user->id == $c->user->id ) { $report->user->update(); $report->confirm; + $c->log->info($report->user->id . ' is logged in for this report'); } else { # User exists and we are not logged in as them. @@ -971,6 +975,7 @@ sub save_user_and_report : Private { password => $report->user->password, }; $report->user->discard_changes(); + $c->log->info($report->user->id . ' exists, but is not logged in for this report'); } # If there was a photo add that too @@ -1050,6 +1055,7 @@ sub redirect_or_confirm_creation : Private { # Subscribe problem reporter to email updates $c->forward( 'create_reporter_alert' ); my $report_uri = $c->uri_for( '/report', $report->id ); + $c->log->info($report->user->id . ' was logged in, redirecting to /report/' . $report->id); $c->res->redirect($report_uri); $c->detach; } @@ -1071,6 +1077,7 @@ sub redirect_or_confirm_creation : Private { # tell user that they've been sent an email $c->stash->{template} = 'email_sent.html'; $c->stash->{email_type} = 'problem'; + $c->log->info($report->user->id . ' created ' . $report->id . ', email sent, ' . ($data->{password} ? 'password set' : 'password not set')); } sub create_reporter_alert : Private { diff --git a/perllib/FixMyStreet/App/Controller/Report/Update.pm b/perllib/FixMyStreet/App/Controller/Report/Update.pm index c67ca4d1f..29933e2f6 100644 --- a/perllib/FixMyStreet/App/Controller/Report/Update.pm +++ b/perllib/FixMyStreet/App/Controller/Report/Update.pm @@ -134,7 +134,8 @@ sub process_user : Private { $update->user->name( Utils::trim_text( $params{name} ) ) if $params{name}; - $update->user->password( Utils::trim_text( $params{password_register} ) ); + $update->user->password( Utils::trim_text( $params{password_register} ) ) + if $params{password_register}; return 1; } diff --git a/perllib/FixMyStreet/App/View/Web.pm b/perllib/FixMyStreet/App/View/Web.pm index 43d46ae25..755f1e405 100644 --- a/perllib/FixMyStreet/App/View/Web.pm +++ b/perllib/FixMyStreet/App/View/Web.pm @@ -168,7 +168,7 @@ sub html_filter { my %version_hash; sub version { my ( $self, $c, $file ) = @_; - unless ($version_hash{$file}) { + unless ($version_hash{$file} && !FixMyStreet->config('STAGING_SITE')) { my $path = FixMyStreet->path_to('web', $file); $version_hash{$file} = ( stat( $path ) )[9]; } diff --git a/perllib/FixMyStreet/Cobrand.pm b/perllib/FixMyStreet/Cobrand.pm index 6fe2a2bc8..ad21820d7 100644 --- a/perllib/FixMyStreet/Cobrand.pm +++ b/perllib/FixMyStreet/Cobrand.pm @@ -84,6 +84,9 @@ sub get_class_for_moniker { return $avail if $moniker eq $avail->moniker; } + # Special case for old blank cobrand entries in fixmystreet.com. + return 'FixMyStreet::Cobrand::FixMyStreet' if $moniker eq ''; + # if none match then use the default return 'FixMyStreet::Cobrand::Default'; } diff --git a/perllib/FixMyStreet/Cobrand/Barnet.pm b/perllib/FixMyStreet/Cobrand/Barnet.pm index a12fa6d06..9791b071a 100644 --- a/perllib/FixMyStreet/Cobrand/Barnet.pm +++ b/perllib/FixMyStreet/Cobrand/Barnet.pm @@ -1,66 +1,13 @@ package FixMyStreet::Cobrand::Barnet; -use base 'FixMyStreet::Cobrand::Default'; +use base 'FixMyStreet::Cobrand::UKCouncils'; use strict; use warnings; -use Carp; -use URI::Escape; -use mySociety::VotingArea; - -sub site_restriction { - return ( "and council='2489'", 'barnet', { council => '2489' } ); -} - -sub problems_clause { - return { council => '2489' }; -} - -sub problems { - my $self = shift; - return $self->{c}->model('DB::Problem')->search( $self->problems_clause ); -} - -sub base_url { - my $base_url = mySociety::Config::get('BASE_URL'); - if ( $base_url !~ /barnet/ ) { - $base_url =~ s{http://(?!www\.)}{http://barnet.}g; - $base_url =~ s{http://www\.}{http://barnet.}g; - } - return $base_url; -} - -sub site_title { - my ($self) = @_; - return 'Barnet Council FixMyStreet'; -} - -sub enter_postcode_text { - my ($self) = @_; - return 'Enter a Barnet postcode, or street name and area'; -} - -sub council_check { - my ( $self, $params, $context ) = @_; - - my $councils = $params->{all_councils}; - my $council_match = defined $councils->{2489}; - if ($council_match) { - return 1; - } - my $url = 'http://www.fixmystreet.com/'; - $url .= 'alert' if $context eq 'alert'; - $url .= '?pc=' . URI::Escape::uri_escape( $self->{c}->req->param('pc') ) - if $self->{c}->req->param('pc'); - my $error_msg = "That location is not covered by Barnet. -Please visit <a href=\"$url\">the main FixMyStreet site</a>."; - return ( 0, $error_msg ); -} - -# All reports page only has the one council. -sub all_councils_report { - return 0; -} +sub council_id { return 2489; } +sub council_area { return 'Barnet'; } +sub council_name { return 'Barnet Council'; } +sub council_url { return 'barnet'; } sub disambiguate_location { return { @@ -70,11 +17,5 @@ sub disambiguate_location { }; } -sub recent_photos { - my ( $self, $num, $lat, $lon, $dist ) = @_; - $num = 2 if $num == 3; - return $self->problems->recent_photos( $num, $lat, $lon, $dist ); -} - 1; diff --git a/perllib/FixMyStreet/Cobrand/Base.pm b/perllib/FixMyStreet/Cobrand/Base.pm new file mode 100644 index 000000000..42a891cb4 --- /dev/null +++ b/perllib/FixMyStreet/Cobrand/Base.pm @@ -0,0 +1,69 @@ +package FixMyStreet::Cobrand::Base; + +use strict; +use warnings; + +=head2 new + + my $cobrand = $class->new; + my $cobrand = $class->new( { c => $c } ); + +Create a new cobrand object, optionally setting the context. + +You probably shouldn't need to do this and should get the cobrand object via a +method in L<FixMyStreet::Cobrand> instead. + +=cut + +sub new { + my $class = shift; + my $self = shift || {}; + return bless $self, $class; +} + +=head2 moniker + + $moniker = $cobrand_class->moniker(); + +Returns a moniker that can be used to identify this cobrand. By default this is +the last part of the class name lowercased - eg 'F::C::SomeCobrand' becomes +'somecobrand'. + +=cut + +sub moniker { + my $class = ref( $_[0] ) || $_[0]; # deal with object or class + my ($last_part) = $class =~ m{::(\w+)$}; + $last_part = lc($last_part); + return $last_part; +} + +=head2 is_default + + $bool = $cobrand->is_default(); + +Returns true if this is the default cobrand, false otherwise. + +=cut + +sub is_default { + my $self = shift; + return $self->moniker eq 'default'; +} + +=head2 path_to_web_templates + + $path = $cobrand->path_to_web_templates( ); + +Returns the path to the templates for this cobrand - by default +"templates/web/$moniker" + +=cut + +sub path_to_web_templates { + my $self = shift; + return FixMyStreet->path_to( 'templates/web', $self->moniker ); +} + +1; + diff --git a/perllib/FixMyStreet/Cobrand/Default.pm b/perllib/FixMyStreet/Cobrand/Default.pm index b5a1cd8d3..aeb956680 100644 --- a/perllib/FixMyStreet/Cobrand/Default.pm +++ b/perllib/FixMyStreet/Cobrand/Default.pm @@ -1,4 +1,5 @@ package FixMyStreet::Cobrand::Default; +use base 'FixMyStreet::Cobrand::Base'; use strict; use warnings; @@ -10,69 +11,6 @@ use Carp; use mySociety::MaPit; use mySociety::PostcodeUtil; -=head2 new - - my $cobrand = $class->new; - my $cobrand = $class->new( { c => $c } ); - -Create a new cobrand object, optionally setting the context. - -You probably shouldn't need to do this and should get the cobrand object via a -method in L<FixMyStreet::Cobrand> instead. - -=cut - -sub new { - my $class = shift; - my $self = shift || {}; - return bless $self, $class; -} - -=head2 moniker - - $moniker = $cobrand_class->moniker(); - -Returns a moniker that can be used to identify this cobrand. By default this is -the last part of the class name lowercased - eg 'F::C::SomeCobrand' becomes -'somecobrand'. - -=cut - -sub moniker { - my $class = ref( $_[0] ) || $_[0]; # deal with object or class - my ($last_part) = $class =~ m{::(\w+)$}; - $last_part = lc($last_part); - return '' if $last_part eq 'default'; - return $last_part; -} - -=head2 is_default - - $bool = $cobrand->is_default(); - -Returns true if this is the default cobrand, false otherwise. - -=cut - -sub is_default { - my $self = shift; - return $self->moniker eq ''; -} - -=head2 path_to_web_templates - - $path = $cobrand->path_to_web_templates( ); - -Returns the path to the templates for this cobrand - by default -"templates/web/$moniker" - -=cut - -sub path_to_web_templates { - my $self = shift; - return FixMyStreet->path_to( 'templates/web', $self->moniker ); -} - =head1 country Returns the country that this cobrand operates in, as an ISO3166-alpha2 code. @@ -114,17 +52,6 @@ empty string and site key 0 if the cobrand uses all the data. sub site_restriction { return ( "", 0, {} ) } -=head2 contact_restriction - -Return a contact restriction clause if the cobrand uses a subset of the -FixMyStreet contact data. - -=cut - -sub contact_restriction { - {}; -} - =head2 restriction Return a restriction to pull out data saved while using the cobrand site. @@ -315,15 +242,6 @@ sub disambiguate_location { }; } -=head2 form_elements - -Parameters are FORM_NAME, QUERY. Return HTML for any extra needed elements for -FORM_NAME - -=cut - -sub form_elements { '' } - =head2 cobrand_data_for_generic_update Parameter is UPDATE_DATA, a reference to a hash of non-cobranded update data. @@ -422,15 +340,6 @@ Return any params to be added to responses sub header_params { return {} } -=head2 root_path_js - -Parameter is QUERY. Return some js to set the root path from which AJAX queries -should be made. - -=cut - -sub root_path_js { 'var root_path = "";' } - =head2 site_title Return the title to be used in page heads. diff --git a/perllib/FixMyStreet/Cobrand/EmptyHomes.pm b/perllib/FixMyStreet/Cobrand/EmptyHomes.pm index 189daee0c..6885f6a95 100644 --- a/perllib/FixMyStreet/Cobrand/EmptyHomes.pm +++ b/perllib/FixMyStreet/Cobrand/EmptyHomes.pm @@ -1,5 +1,5 @@ package FixMyStreet::Cobrand::EmptyHomes; -use base 'FixMyStreet::Cobrand::Default'; +use base 'FixMyStreet::Cobrand::FixMyStreet'; use strict; use warnings; diff --git a/perllib/FixMyStreet/Cobrand/FixMyStreet.pm b/perllib/FixMyStreet/Cobrand/FixMyStreet.pm new file mode 100644 index 000000000..37fa7a16d --- /dev/null +++ b/perllib/FixMyStreet/Cobrand/FixMyStreet.pm @@ -0,0 +1,10 @@ +package FixMyStreet::Cobrand::FixMyStreet; +use base 'FixMyStreet::Cobrand::Default'; + +# FixMyStreet should return all cobrands +sub restriction { + return {}; +} + +1; + diff --git a/perllib/FixMyStreet/Cobrand/LichfieldDC.pm b/perllib/FixMyStreet/Cobrand/LichfieldDC.pm index 12882faee..91c5e10ec 100644 --- a/perllib/FixMyStreet/Cobrand/LichfieldDC.pm +++ b/perllib/FixMyStreet/Cobrand/LichfieldDC.pm @@ -1,13 +1,16 @@ package FixMyStreet::Cobrand::LichfieldDC; -use base 'FixMyStreet::Cobrand::Default'; +use base 'FixMyStreet::Cobrand::UKCouncils'; use strict; use warnings; -use Carp; -use URI::Escape; -use mySociety::VotingArea; +sub council_id { return 2434; } +sub council_area { return 'Lichfield district'; } +sub council_name { return 'Lichfield District Council'; } +sub council_url { return 'lichfielddc'; } +# Different to councils parent due to this being a two-tier council. If we get +# more, this can be genericised in the parent. sub site_restriction { return ( "and council like '%2434%'", 'lichfield', { council => '2434' } ); } @@ -16,52 +19,6 @@ sub problems_clause { return { council => { like => '%2434%' } }; } -sub problems { - my $self = shift; - return $self->{c}->model('DB::Problem')->search( $self->problems_clause ); -} - -sub base_url { - my $base_url = mySociety::Config::get('BASE_URL'); - if ( $base_url !~ /lichfielddc/ ) { - $base_url =~ s{http://(?!www\.)}{http://lichfielddc.}g; - $base_url =~ s{http://www\.}{http://lichfielddc.}g; - } - return $base_url; -} - -sub site_title { - my ($self) = @_; - return 'Lichfield District Council FixMyStreet'; -} - -sub enter_postcode_text { - my ($self) = @_; - return 'Enter a Lichfield district postcode, or street name and area'; -} - -sub council_check { - my ( $self, $params, $context ) = @_; - - my $councils = $params->{all_councils}; - my $council_match = defined $councils->{2434}; - if ($council_match) { - return 1; - } - my $url = 'http://www.fixmystreet.com/'; - $url .= 'alert' if $context eq 'alert'; - $url .= '?pc=' . URI::Escape::uri_escape( $self->{c}->req->param('pc') ) - if $self->{c}->req->param('pc'); - my $error_msg = "That location is not covered by Lichfield District Council. -Please visit <a href=\"$url\">the main FixMyStreet site</a>."; - return ( 0, $error_msg ); -} - -# All reports page only has the one council. -sub all_councils_report { - return 0; -} - # FIXME - need to double check this is all correct sub disambiguate_location { return { @@ -71,11 +28,5 @@ sub disambiguate_location { }; } -sub recent_photos { - my ( $self, $num, $lat, $lon, $dist ) = @_; - $num = 2 if $num == 3; - return $self->problems->recent_photos( $num, $lat, $lon, $dist ); -} - 1; diff --git a/perllib/FixMyStreet/Cobrand/Reading.pm b/perllib/FixMyStreet/Cobrand/Reading.pm index 8e98931fd..afc2b6ac6 100644 --- a/perllib/FixMyStreet/Cobrand/Reading.pm +++ b/perllib/FixMyStreet/Cobrand/Reading.pm @@ -1,66 +1,15 @@ package FixMyStreet::Cobrand::Reading; -use base 'FixMyStreet::Cobrand::Default'; +use base 'FixMyStreet::Cobrand::UKCouncils'; use strict; use warnings; use Carp; -use URI::Escape; -use mySociety::VotingArea; -sub site_restriction { - return ( "and council='2596'", 'reading', { council => '2596' } ); -} - -sub problems_clause { - return { council => '2596' }; -} - -sub problems { - my $self = shift; - return $self->{c}->model('DB::Problem')->search( $self->problems_clause ); -} - -sub base_url { - my $base_url = mySociety::Config::get('BASE_URL'); - if ($base_url !~ /reading/) { - $base_url =~ s{http://(?!www\.)}{http://reading.}g; - $base_url =~ s{http://www\.}{http://reading.}g; - } - return $base_url; -} - -sub site_title { - my ( $self ) = @_; - return 'Reading City Council FixMyStreet'; -} - -sub enter_postcode_text { - my ( $self ) = @_; - return 'Enter a Reading postcode, or street name and area'; -} - -sub council_check { - my ( $self, $params, $context ) = @_; - - my $councils = $params->{all_councils}; - my $council_match = defined $councils->{2596}; - if ($council_match) { - return 1; - } - my $url = 'http://www.fixmystreet.com/'; - $url .= 'alert' if $context eq 'alert'; - $url .= '?pc=' . URI::Escape::uri_escape_utf8($self->{c}->req->param('pc')) - if $self->{c}->req->param('pc'); - my $error_msg = "That location is not covered by Reading. -Please visit <a href=\"$url\">the main FixMyStreet site</a>."; - return ( 0, $error_msg ); -} - -# All reports page only has the one council. -sub all_councils_report { - return 0; -} +sub council_id { return 2596; } +sub council_area { return 'Reading'; } +sub council_name { return 'Reading City Council'; } +sub council_url { return 'reading'; } sub disambiguate_location { return { @@ -71,12 +20,6 @@ sub disambiguate_location { }; } -sub recent_photos { - my ($self, $num, $lat, $lon, $dist) = @_; - $num = 2 if $num == 3; - return $self->problems->recent_photos( $num, $lat, $lon, $dist ); -} - sub get_report_stats { my $self = shift; diff --git a/perllib/FixMyStreet/Cobrand/Southampton.pm b/perllib/FixMyStreet/Cobrand/Southampton.pm index 213dd533b..5bb7df3b6 100644 --- a/perllib/FixMyStreet/Cobrand/Southampton.pm +++ b/perllib/FixMyStreet/Cobrand/Southampton.pm @@ -1,66 +1,13 @@ package FixMyStreet::Cobrand::Southampton; -use base 'FixMyStreet::Cobrand::Default'; +use base 'FixMyStreet::Cobrand::UKCouncils'; use strict; use warnings; -use Carp; -use URI::Escape; -use mySociety::VotingArea; - -sub site_restriction { - return ( "and council='2567'", 'southampton', { council => '2567' } ); -} - -sub problems_clause { - return { council => '2567' }; -} - -sub problems { - my $self = shift; - return $self->{c}->model('DB::Problem')->search( $self->problems_clause ); -} - -sub base_url { - my $base_url = mySociety::Config::get('BASE_URL'); - if ($base_url !~ /southampton/) { - $base_url =~ s{http://(?!www\.)}{http://southampton.}g; - $base_url =~ s{http://www\.}{http://southampton.}g; - } - return $base_url; -} - -sub site_title { - my ( $self ) = @_; - return 'Southampton City Council FixMyStreet'; -} - -sub enter_postcode_text { - my ( $self ) = @_; - return 'Enter a Southampton postcode, or street name and area'; -} - -sub council_check { - my ( $self, $params, $context ) = @_; - - my $councils = $params->{all_councils}; - my $council_match = defined $councils->{2567}; - if ($council_match) { - return 1; - } - my $url = 'http://www.fixmystreet.com/'; - $url .= 'alert' if $context eq 'alert'; - $url .= '?pc=' . URI::Escape::uri_escape_utf8($self->{c}->req->param('pc')) - if $self->{c}->req->param('pc'); - my $error_msg = "That location is not covered by Southampton. -Please visit <a href=\"$url\">the main FixMyStreet site</a>."; - return ( 0, $error_msg ); -} - -# All reports page only has the one council. -sub all_councils_report { - return 0; -} +sub council_id { return 2567; } +sub council_area { return 'Southampton'; } +sub council_name { return 'Southampton City Council'; } +sub council_url { return 'southampton'; } sub disambiguate_location { return { @@ -71,11 +18,5 @@ sub disambiguate_location { }; } -sub recent_photos { - my ($self, $num, $lat, $lon, $dist) = @_; - $num = 2 if $num == 3; - return $self->problems->recent_photos( $num, $lat, $lon, $dist ); -} - 1; diff --git a/perllib/FixMyStreet/Cobrand/UKCouncils.pm b/perllib/FixMyStreet/Cobrand/UKCouncils.pm new file mode 100644 index 000000000..589abd178 --- /dev/null +++ b/perllib/FixMyStreet/Cobrand/UKCouncils.pm @@ -0,0 +1,79 @@ +package FixMyStreet::Cobrand::UKCouncils; +use base 'FixMyStreet::Cobrand::FixMyStreet'; + +use strict; +use warnings; + +use Carp; +use URI::Escape; + +sub site_restriction { + my $self = shift; + return ( "and council='" . $self->council_id . "'", $self->council_url, { council => sprintf('%d', $self->council_id) } ); +} + +sub restriction { + return { cobrand => shift->moniker }; +} + +sub problems_clause { + my $self = shift; + return { council => sprintf('%d', $self->council_id) }; +} + +sub problems { + my $self = shift; + return $self->{c}->model('DB::Problem')->search( $self->problems_clause ); +} + +sub base_url { + my $self = shift; + my $base_url = mySociety::Config::get('BASE_URL'); + my $u = $self->council_url; + if ( $base_url !~ /$u/ ) { + $base_url =~ s{http://(?!www\.)}{http://$u.}g; + $base_url =~ s{http://www\.}{http://$u.}g; + } + return $base_url; +} + +sub site_title { + my ($self) = @_; + return $self->council_name . ' FixMyStreet'; +} + +sub enter_postcode_text { + my ($self) = @_; + return 'Enter a ' . $self->council_area . ' postcode, or street name and area'; +} + +sub council_check { + my ( $self, $params, $context ) = @_; + + my $councils = $params->{all_councils}; + my $council_match = defined $councils->{$self->council_id}; + if ($council_match) { + return 1; + } + my $url = 'http://www.fixmystreet.com/'; + $url .= 'alert' if $context eq 'alert'; + $url .= '?pc=' . URI::Escape::uri_escape( $self->{c}->req->param('pc') ) + if $self->{c}->req->param('pc'); + my $error_msg = "That location is not covered by " . $self->council_name . ". +Please visit <a href=\"$url\">the main FixMyStreet site</a>."; + return ( 0, $error_msg ); +} + +# All reports page only has the one council. +sub all_councils_report { + return 0; +} + +sub recent_photos { + my ( $self, $num, $lat, $lon, $dist ) = @_; + $num = 2 if $num == 3; + return $self->problems->recent_photos( $num, $lat, $lon, $dist ); +} + +1; + diff --git a/t/00-check-config.t b/t/00-check-config.t index 7d334152c..20f0fe8cf 100644 --- a/t/00-check-config.t +++ b/t/00-check-config.t @@ -2,11 +2,12 @@ use strict; use warnings; use Test::More; +use YAML; use FixMyStreet; -# check that all the fields listed in general-example are also present in -# general - helps prevent later test failures due to un-noticed additions to the +# check that all the fields listed in general.yml-example are also present in +# general.yml - helps prevent later test failures due to un-noticed additions to the # config file. # This code will bail_out to prevent the test suite proceeding to save time if @@ -14,10 +15,8 @@ use FixMyStreet; # load the config file and store the contents in a readonly hash -mySociety::Config::set_file( FixMyStreet->path_to("conf/general-example") ); -my $example_config = mySociety::Config::get_list(); -mySociety::Config::set_file( FixMyStreet->path_to("conf/general") ); -my $local_config = mySociety::Config::get_list(); +my $example_config = YAML::LoadFile( FixMyStreet->path_to("conf/general.yml-example") ); +my $local_config = YAML::LoadFile( FixMyStreet->path_to("conf/general.yml") ); # find all keys missing from each config my @missing_from_example = find_missing( $example_config, $local_config ); @@ -25,12 +24,12 @@ my @missing_from_local = find_missing( $local_config, $example_config ); if ( @missing_from_example || @missing_from_local ) { - fail "Missing from 'general': $_" for @missing_from_local; - fail "Missing from 'general-example': $_" for @missing_from_example; + fail "Missing from 'general.yml': $_" for @missing_from_local; + fail "Missing from 'general.yml-example': $_" for @missing_from_example; # bail out to prevent other tests failing due to config issues BAIL_OUT( "Config has changed" - . " - update your 'general' and add/remove the keys listed above" ); + . " - update your 'general.yml' and add/remove the keys listed above" ); } else { pass "configs contain the same keys"; diff --git a/t/app/controller/admin.t b/t/app/controller/admin.t index beeb6c9c1..d8a1c24a1 100644 --- a/t/app/controller/admin.t +++ b/t/app/controller/admin.t @@ -79,6 +79,8 @@ my $alert = FixMyStreet::App->model('DB::Alert')->find_or_create( subtest 'check summary counts' => sub { my $problems = FixMyStreet::App->model('DB::Problem')->search( { state => { -in => [qw/confirmed fixed closed investigating planned/, 'in progress', 'fixed - user', 'fixed - council'] } } ); + ok $mech->host('www.fixmystreet.com'); + my $problem_count = $problems->count; $problems->update( { cobrand => '' } ); @@ -947,7 +949,7 @@ subtest 'hiding comment marked as fixed reopens report' => sub { $update->mark_fixed( 1 ); $update->update; - $report->state('fixed'); + $report->state('fixed - user'); $report->update; diff --git a/t/app/controller/report_new.t b/t/app/controller/report_new.t index 15237e041..076813868 100644 --- a/t/app/controller/report_new.t +++ b/t/app/controller/report_new.t @@ -80,7 +80,7 @@ foreach my $test ( ], }, { - msg => 'may_show_name defaults to true', + msg => 'may_show_name is remembered', pc => 'SW1A 1AA', fields => { title => '', @@ -95,7 +95,7 @@ foreach my $test ( password_register => '', remember_me => undef, }, - changes => { may_show_name => '1' }, + changes => {}, errors => [ 'Please enter a subject', 'Please enter some details', @@ -313,15 +313,24 @@ foreach my $test ( }; } +my $first_user; foreach my $test ( { - desc => 'does not have an account', - user => 0, + desc => 'does not have an account, does not set a password', + user => 0, password => 0, }, { - desc => 'does have an account and is not signed in; does not sign in', - user => 1, - } + desc => 'does not have an account, sets a password', + user => 0, password => 1, + }, + { + desc => 'does have an account and is not signed in; does not sign in, does not set a password', + user => 1, password => 0, + }, + { + desc => 'does have an account and is not signed in; does not sign in, sets a password', + user => 1, password => 1, + }, ) { subtest "test report creation for a user who " . $test->{desc} => sub { $mech->log_out_ok; @@ -336,9 +345,13 @@ foreach my $test ( $user->name( 'Old Name' ); $user->password( 'old_password' ); $user->update; - } else { + } elsif (!$first_user) { ok !FixMyStreet::App->model('DB::User')->find( { email => $test_email } ), "test user does not exist"; + $first_user = 1; + } else { + # Not first pass, so will exist, but want no user to start, so delete it. + $mech->delete_user($test_email); } # submit initial pc form @@ -362,7 +375,7 @@ foreach my $test ( email => 'test-1@example.com', phone => '07903 123 456', category => 'Street lighting', - password_register => 'secret', + password_register => $test->{password} ? 'secret' : '', } }, "submit good details" @@ -410,7 +423,13 @@ foreach my $test ( $mech->get_ok( '/report/' . $report->id ); is $report->name, 'Joe Bloggs', 'name updated correctly'; - ok $report->user->check_password('secret'), 'password updated correctly'; + if ($test->{password}) { + ok $report->user->check_password('secret'), 'password updated correctly'; + } elsif ($test->{user}) { + ok $report->user->check_password('old_password'), 'password unchanged, as no new one given'; + } else { + is $report->user->password, '', 'password still not set, as none given'; + } # check that the reporter has an alert my $alert = FixMyStreet::App->model('DB::Alert')->find( { @@ -425,7 +444,7 @@ foreach my $test ( # cleanup $mech->delete_user($user) - if $test->{user}; + if $test->{user} && $test->{password}; }; } diff --git a/t/app/model/alert_type.t b/t/app/model/alert_type.t index 6767d43fc..ab129b4e7 100644 --- a/t/app/model/alert_type.t +++ b/t/app/model/alert_type.t @@ -174,11 +174,11 @@ for my $test ( }, { postcode => 'Buckingham Gate', - expected_postcode => 'Buckingham Gate', + expected_postcode => 'Buckingham\s+Gate', }, { postcode => 'Buckingham gate', - expected_postcode => 'Buckingham gate', + expected_postcode => 'Buckingham\s+gate', }, ) { subtest "correct text for postcode $test->{postcode}" => sub { diff --git a/templates/web/default/admin/report_edit.html b/templates/web/default/admin/report_edit.html index 79207192d..cbba1b3b0 100644 --- a/templates/web/default/admin/report_edit.html +++ b/templates/web/default/admin/report_edit.html @@ -14,10 +14,6 @@ <li><label for='detail'>[% loc('Details:') %]</label><br><textarea name='detail' id='detail' cols=60 rows=10>[% problem.detail | html %]</textarea></li> <li>[% loc('Co-ordinates:') %] [% problem.latitude %], [% problem.longitude %] ( [% loc('originally entered') %] [% problem.postcode | html %] , [% IF problem.used_map %][% loc('used map') %][% ELSE %][% loc("didn't use map") %][% END %])</li> <li>[% loc('For council(s):') %] [% IF problem.council %][% problem.council %][% ELSE %]<em>[% loc('None' ) %]</em>[% END %] ([% loc('other areas:') %] [% problem.areas | remove('^,') | remove( ',$' ) %])</li> -<li><label for="anonymous">[% loc('Anonymous:') %]</label> <select name="anonymous" id="anonymous"> -<option [% 'selected ' IF problem.anonymous %]value="1">[% loc('Yes') %]</option> -<option [% 'selected ' IF !problem.anonymous %]value="0">[% loc('No') %]</option> -</select></li> <li><label for="state">[% loc('State:') %]</label> <select name="state" id="state"> [% FOREACH state IN [ ['confirmed', loc('Open')], ['investigating', loc('Investigating')], ['planned', loc('Planned')], ['in progress', @@ -27,6 +23,10 @@ [% END %] </select></li> <li>[% loc('Category:') %] [% problem.category | html %] </li> +<li><label for="anonymous">[% loc('Anonymous:') %]</label> <select name="anonymous" id="anonymous"> +<option [% 'selected ' IF problem.anonymous %]value="1">[% loc('Yes') %]</option> +<option [% 'selected ' IF !problem.anonymous %]value="0">[% loc('No') %]</option> +</select></li> <li>[% loc('Name:') %] <input type='text' name='name' id='name' value='[% problem.name | html %]'></li> <li>[% loc('Email:') %] <input type='text' id='email' name='email' value='[% problem.user.email | html %]'> [% PROCESS abuse_button %] [% PROCESS flag_button user=problem.user %]</li> <li>[% loc('Phone:') %] [% problem.user.phone | html %]</li> diff --git a/templates/web/default/alert/index.html b/templates/web/default/alert/index.html index 4d63e7f34..d8478cf98 100644 --- a/templates/web/default/alert/index.html +++ b/templates/web/default/alert/index.html @@ -11,7 +11,7 @@ within a certain distance of a particular location.') %] [% IF location_offshore %] <ul class="error"><li>[% loc('That location does not appear to be covered by a council, perhaps it is offshore - please try somewhere more specific.') %]</li></ul> [% ELSIF location_error %] - <ul class="error"><li>[% location_error | html %]</li></ul> + <ul class="error"><li>[% location_error %]</li></ul> [% ELSE %] [% INCLUDE 'errors.html' %] [% END %] @@ -22,7 +22,6 @@ within a certain distance of a particular location.') %] postcode or street name and area:' ) %] <input type="text" name="pc" value="[% pc | html %]"> <input type="submit" value="[% loc('Go') %]"> - [% cobrand_form_elements %] </p> </form> diff --git a/templates/web/default/alert/list.html b/templates/web/default/alert/list.html index 36bfaffd9..c763331cc 100644 --- a/templates/web/default/alert/list.html +++ b/templates/web/default/alert/list.html @@ -22,8 +22,6 @@ <input type="hidden" name="type" value="local"> <input type="hidden" name="pc" value="[% pc | html %]"> - [% cobrand_form_elements %] - [% IF photos.size %] <div id="alert_photos"> <h2>[% loc('Photos of recent nearby reports') %]</h2> diff --git a/templates/web/default/alert/updates.html b/templates/web/default/alert/updates.html index 76b5ef23e..5efc41bac 100644 --- a/templates/web/default/alert/updates.html +++ b/templates/web/default/alert/updates.html @@ -15,7 +15,6 @@ <input type="hidden" name="id" value="[% problem_id | html %]"> <input type="hidden" name="type" value="updates"> <input type="submit" value="[% loc('Subscribe') %]"> -[% cobrand_form_elements %] </form> diff --git a/templates/web/default/around/around_index.html b/templates/web/default/around/around_index.html index 3e6d96acd..c07eb2ca2 100644 --- a/templates/web/default/around/around_index.html +++ b/templates/web/default/around/around_index.html @@ -15,7 +15,6 @@ <form action="[% c.uri_for('/around') %]" method="get" name="postcodeForm" id="postcodeForm"> <label for="pc">[% question %]:</label> <input type="text" name="pc" value="[% pc | html %]" id="pc" size="10" maxlength="200"> <input type="submit" value="[% loc('Go') %]" id="submit"> -[% c.cobrand.form_elements('postcodeForm') %] [% IF partial_token %] <input type="hidden" name="partial" value="[% partial_token.token %]"> diff --git a/templates/web/default/around/display_location.html b/templates/web/default/around/display_location.html index 3d9c82187..b5705a77b 100755 --- a/templates/web/default/around/display_location.html +++ b/templates/web/default/around/display_location.html @@ -40,7 +40,6 @@ <input type="hidden" name="map_override" value="[% c.req.params.map_override | html %]"> [% END %] <input type="hidden" name="pc" value="[% pc | html %]"> -[% c.cobrand.form_elements('mapForm') %] <input type="hidden" name="latitude" id="fixmystreet.latitude" value="[% short_latitude | html %]"> <input type="hidden" name="longitude" id="fixmystreet.longitude" value="[% short_longitude | html %]"> @@ -67,7 +66,7 @@ <div id="side"> <p id="text_map" class="banner"> - [% loc( 'To <strong>report a problem</strong>, simply click on the map at the correct location.' ) %] + [% loc( 'To <strong>report a problem</strong>, click on the map at the correct location.' ) %] [% tprintf( loc("<small>If you cannot see the map, <a href='%s' rel='nofollow'>skip this step</a>.</small>"), diff --git a/templates/web/default/contact/index.html b/templates/web/default/contact/index.html index 2c0c2ff02..a644ed952 100644 --- a/templates/web/default/contact/index.html +++ b/templates/web/default/contact/index.html @@ -92,10 +92,8 @@ <textarea class="required" name="message" id="form_message" rows="7" cols="50">[% message | html %]</textarea></div> <div class="checkbox"><input type="submit" value="[% loc('Post') %]"></div> -[% c.cobrand.form_elements('contactForm') %] - </form> -[% INCLUDE 'contact/address.html' %] +[% TRY %][% INCLUDE 'contact/address.html' %][% CATCH file %][% END %] [% INCLUDE 'footer.html' %] diff --git a/templates/web/default/footer.html b/templates/web/default/footer.html index 38e83c1c2..a58a3e696 100644 --- a/templates/web/default/footer.html +++ b/templates/web/default/footer.html @@ -1,49 +1,29 @@ -</div> -</div> - -<h2 class="v">[% loc('Navigation') %]</h2> -<ul id="navigation"> -<li><a href="/">[% loc("Report a problem") %]</a></li> -<li id="nav_new"><a href="/my">[% loc("Your reports") %]</a></li> -<li><a href="/reports">[% loc("All reports") %]</a></li> -<li><a href="/alert[% pc ? '/list?pc=' : '' %][% pc | uri %]">[% loc("Local alerts") %]</a></li> -<li><a href="/faq">[% loc("Help") %]</a></li> -</ul> - -[% IF ! c.cobrand.moniker %] - <!-- winter 2011 promotion for unbranded site only --> - <div id="promo"> - <a href="http://www.mysociety.org/2011/11/02/fix-before-the-freeze/" - title="Fix Before the Freeze - report those dangerous potholes and broken streetlights before winter hits"><img - src="/i/promo-fb4tf.gif" - alt="Fix Before the Freeze - report those dangerous potholes and broken streetlights before winter hits" ></a> - </div> - [% loc('<a href="http://www.mysociety.org/"><img id="logo" width="159" height="39" src="/i/mysociety-on-white.gif" alt="View mySociety.org"><span id="logoie"></span></a>') %] - -[% ELSE %] - - [% loc('<a href="http://www.mysociety.org/"><img id="logo" width="133" height="26" src="/i/mysociety-dark.png" alt="View mySociety.org"><span id="logoie"></span></a>') %] - -[% END %] - -</div> -<div id="footer"> - - <p>[% loc('Built by <a href="http://www.mysociety.org/">mySociety</a>') %] - | <a href="/contact">[% loc("Contact FixMyStreet") | replace(' ', ' ') %]</a></p> - - <p>Mobile apps: - <a href="http://itunes.apple.com/gb/app/fixmystreet/id297456545">iPhone</a>, - <a href="http://itunes.apple.com/gb/app/streetreport/id371891859">StreetReport (iPhone)</a> - | <a href="https://market.android.com/details?id=com.android.fixmystreet">Android</a> - | <a href="http://store.ovi.com/content/107557">Nokia</a> - </p> + </div><!-- #mysociety .container --> + + <div id="navigation" class="container" role="navigation"> + <div class="spacer"></div> + <ul id="site-nav" class="nav"> + <li><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END + %]>[% loc("Report a problem") %]</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[% + %]<li><[% IF c.req.uri.path == '/my' %]span[% ELSE %]a href="/my"[% END + %]>[% loc("Your reports") %]</[% c.req.uri.path == '/my' ? 'span' : 'a' %]></li>[% + %]<li><[% IF c.req.uri.path == '/reports' %]span[% ELSE %]a href="/reports"[% END + %]>[% loc("All reports") %]</[% c.req.uri.path == '/reports' ? 'span' : 'a' %]></li>[% + %]<li><[% IF c.req.uri.path == '/alert' %]span[% ELSE %]a href="/alert[% pc ? '/list?pc=' : '' %][% pc | uri %]"[% END + %]>[% loc("Local alerts") %]</[% c.req.uri.path == '/alert' ? 'span' : 'a' %]></li>[% + %]<li><[% IF c.req.uri.path == '/faq' %]span[% ELSE %]a href="/faq"[% END + %]>[% loc("Help") %]</[% c.req.uri.path == '/faq' ? 'span' : 'a' %]></li> + </ul> + + </div> + +</div></div></div><!-- wrappers --> + +<div id="footer"> + + <p><a href="/contact">[% loc("Contact FixMyStreet") | replace(' ', ' ') %]</a></p> - <p class="l">[% loc('Are you from a council? Would you like better integration with FixMyStreet?') %] - <a href="http://www.mysociety.org/fixmystreet-for-local-council-websites/">[% loc('Find out about FixMyStreet for councils') %]</a>. - </p> - - <p class="r">[% loc('Are you a developer? Would you like to contribute to FixMyStreet?') %] + <p>[% loc('Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?') %] [% loc('Our code is open source and <a href="http://github.com/mysociety/fixmystreet">available on GitHub</a>.') %] </p> diff --git a/templates/web/default/header.html b/templates/web/default/header.html index e3c364363..e6362a449 100644 --- a/templates/web/default/header.html +++ b/templates/web/default/header.html @@ -4,7 +4,6 @@ <!--[if IE 8]> <html class="no-js ie8 oldie" lang="[% lang_code %]"><![endif]--> <!--[if gt IE 8]><!--><html class="no-js" lang="[% lang_code %]"><!--<![endif]--> <head> - <meta name="viewport" content="initial-scale=1.0"> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black"> @@ -12,37 +11,28 @@ <meta name="HandHeldFriendly" content="true"> <meta name="mobileoptimized" content="0"> - <link rel="stylesheet" type="text/css" href="[% version('/css/core.css') %]"> - <link rel="stylesheet" type="text/css" href="[% version('/css/main.css') %]"> + <link rel="stylesheet" href="[% version('/css/core.css') %]"> [% INCLUDE 'common_header_tags.html' %] - [% IF c.req.uri.host == 'osm.fixmystreet.com' %] - <link rel="canonical" href="http://www.fixmystreet.com[% c.req.uri.path_query %]"> - [% END %] - - [% INCLUDE 'tracking_code.html' %] - </head> <body> - [% IF NOT title AND NOT c.req.path %]<h1 id="header">[% ELSE %]<div id="header"><a href="/">[% END %] - [%- loc('Fix<span id="my">My</span>Street') %] +<div id="wrapper"><div id="wrapper2"><div id="wrapper3"> + + [% IF NOT title AND NOT c.req.path %]<h1 id="header" role="banner">[% ELSE %]<div id="header" role="banner"><a href="/">[% END + %][% loc('FixMyStreet') %] [%- IF NOT title AND NOT c.req.path %]</h1>[% ELSE %]</a></div>[% END %] - <div [% IF ! c.cobrand.moniker %]class="promo-background"[% END %] > <ul id="meta"> [% IF c.user_exists %] <li>[% tprintf(loc('Signed in as %s'), c.user.name || c.user.email) %] - <li><a href="/auth/sign_out">[% loc('Sign out') %]</a></li> + <li class="last"><a href="/auth/sign_out">[% loc('Sign out') %]</a></li> [% ELSE %] <li> </li> [% END %] </ul> - <div id="wrapper"><div id="mysociety"> - - [% IF ! c.cobrand.moniker %] - - [% END %] + + <div id="mysociety" class="container" role="main"> [% INCLUDE 'debug_header.html' %] diff --git a/templates/web/default/index.html b/templates/web/default/index.html index 96f5c33de..06f3ef771 100644 --- a/templates/web/default/index.html +++ b/templates/web/default/index.html @@ -15,7 +15,7 @@ <strong>[% loc('Report, view, or discuss local problems') %]</strong> [% IF subhead != ' ' %] - <br><small>[% subhead %]</small> + <small>[% subhead %]</small> [% END %] </p> @@ -32,7 +32,6 @@ <span><input type="text" name="pc" value="" id="pc" size="10" maxlength="200"> <input type="submit" value="[% loc('Go') %]" id="submit"> </span> - [% c.cobrand.form_elements('postcodeForm') %] </form> <div id="front_intro"> diff --git a/templates/web/default/maps/openlayers.html b/templates/web/default/maps/openlayers.html index aab5180b6..1c0a32278 100644 --- a/templates/web/default/maps/openlayers.html +++ b/templates/web/default/maps/openlayers.html @@ -85,8 +85,8 @@ var fixmystreet = { [% IF pin.id %] <a title="[% pin.title | html %]" href="[% c.uri_for('/report/' _ pin.id) %]"> [%- END -%] -<img border="0" class="pin" src="[% c.uri_for('/i/pin' _ cols.${pin.colour} _ '.gif') %]" - alt="[% loc('Problem') %]" style="top:[% pin.py - 59 %]px; left:[% pin.px - 2 %]px; position: absolute;"> +<img border="0" class="pin" src="[% c.uri_for('/i/pin' _ cols.${pin.colour} _ '.png') %]" + alt="[% loc('Problem') %]" style="top:[% pin.py - 58 %]px; left:[% pin.px - 22 %]px; position: absolute;"> [%- IF pin.id -%] </a> [% END %] diff --git a/templates/web/default/questionnaire/index.html b/templates/web/default/questionnaire/index.html index a7e5ad60c..5b48f8915 100644 --- a/templates/web/default/questionnaire/index.html +++ b/templates/web/default/questionnaire/index.html @@ -21,8 +21,6 @@ <input type="hidden" name="token" value="[% token | html %]"> -[% c.cobrand.form_elements('questionnaireForm') %] - [% IF c.cobrand.moniker == 'emptyhomes' %] [% IF num_questionnaire == 1 %] [% loc('<p>Getting empty homes back into use can be difficult. You shouldn’t expect diff --git a/templates/web/default/report/display.html b/templates/web/default/report/display.html index 1e320e1b4..999d332d2 100644 --- a/templates/web/default/report/display.html +++ b/templates/web/default/report/display.html @@ -41,7 +41,6 @@ <input type="hidden" name="id" value="[% problem.id %]"> <input type="hidden" name="type" value="updates"> <input type="submit" value="[% loc('Subscribe') %]"> - [% cobrand_alert_fields %] </form> <a href="[% c.uri_for( '/rss', problem.id ) %]"> @@ -192,8 +191,6 @@ [% END %] - [% cobrand_update_fields %] - </form> </div> diff --git a/templates/web/default/report/new/fill_in_details.html b/templates/web/default/report/new/fill_in_details.html index 701a9bafa..22d1ee739 100644 --- a/templates/web/default/report/new/fill_in_details.html +++ b/templates/web/default/report/new/fill_in_details.html @@ -9,12 +9,10 @@ <input type="hidden" name="map_override" value="[% c.req.params.map_override | html %]"> [% END %] <input type="hidden" name="pc" value="[% pc | html %]"> -[% c.cobrand.form_elements('mapForm') %] [% ELSE %] <form action="[% c.uri_for('/report/new') %]" method="post" name="mapSkippedForm"[% IF c.cobrand.allow_photo_upload %] enctype="multipart/form-data"[% END %] class="validate"> <input type="hidden" name="pc" value="[% pc | html %]"> <input type="hidden" name="skipped" value="1"> -[% c.cobrand.form_elements('mapSkippedForm') %] [% END %] <input type="hidden" name="latitude" id="fixmystreet.latitude" value="[% short_latitude | html %]"> diff --git a/templates/web/default/report/new/fill_in_details_form.html b/templates/web/default/report/new/fill_in_details_form.html index b6b77c75a..2809b9c0e 100644 --- a/templates/web/default/report/new/fill_in_details_form.html +++ b/templates/web/default/report/new/fill_in_details_form.html @@ -206,7 +206,7 @@ <div class="checkbox"> [%# if there is nothing in the name field then set check box as default on form %] - <input type="checkbox" name="may_show_name" id="form_may_show_name" value="1"[% ' checked' IF !report.anonymous || !report.name %]> + <input type="checkbox" name="may_show_name" id="form_may_show_name" value="1"[% ' checked' IF !report.anonymous %]> <label for="form_may_show_name">[% loc('Show my name publicly') %]</label> <br><small>[% loc('(we never show your email address or phone number)') %]</small> </div> diff --git a/templates/web/default/reports/council.html b/templates/web/default/reports/council.html index 44f0040cb..797d34d6b 100755 --- a/templates/web/default/reports/council.html +++ b/templates/web/default/reports/council.html @@ -77,7 +77,7 @@ Its area is now covered by <a href="/reports/Bedford">Bedford Borough Council</a [% INCLUDE 'reports/cobrand_stats.html' %] -[% IF c.cobrand.moniker == '' %] +[% IF c.cobrand.moniker == 'fixmystreet' %] <p class="promo"> FixMyStreet is now available for local council websites. <a href="http://www.mysociety.org/fixmystreet-for-local-council-websites/">Find out more</a>. diff --git a/templates/web/emptyhomes/around/display_location.html b/templates/web/emptyhomes/around/display_location.html index 2b2a8e9f0..888c8717e 100755 --- a/templates/web/emptyhomes/around/display_location.html +++ b/templates/web/emptyhomes/around/display_location.html @@ -22,7 +22,6 @@ <input type="hidden" name="map_override" value="[% c.req.params.map_override | html %]"> [% END %] <input type="hidden" name="pc" value="[% pc | html %]"> -[% c.cobrand.form_elements('mapForm') %] <input type="hidden" name="latitude" id="fixmystreet.latitude" value="[% short_latitude | html %]"> <input type="hidden" name="longitude" id="fixmystreet.longitude" value="[% short_longitude | html %]"> diff --git a/templates/web/emptyhomes/faq/faq-cy.html b/templates/web/emptyhomes/faq/faq-cy.html index 6d32845ca..3bea990c8 100644 --- a/templates/web/emptyhomes/faq/faq-cy.html +++ b/templates/web/emptyhomes/faq/faq-cy.html @@ -4,13 +4,13 @@ <dl> <dt>Beth yw diben y safle hwn?</dt> -<dd>Diben y safle hwn yw ei gwneud mor hawdd â phosibl i chi gael tai gwag yn eich ardal yn ôl mewn defnydd. Mae’n caniatáu i chi weld adroddiadau am dai gwag a gweld beth sydd wedi cael ei wneud yn eu cylch. Mae’n gwneud cynghorau’n atebol am ymateb i’r tai gwag rydych chi’n rhoi gwybod amdanynt, ac am ddelio â nhw.</dd> +<dd>Diben y safle hwn yw ei gwneud mor hawdd â phosibl i chi gael tai gwag yn eich ardal yn ôl mewn defnydd. Mae’n gwneud cynghorau’n atebol am ymateb i’r tai gwag rydych chi’n rhoi gwybod amdanynt, ac am ddelio â nhw.</dd> <dt>Sut ydw i’n defnyddio’r safle?</dt> -<dd>Rhowch god post neu gyfeiriad yn y blwch ar y dudalen hafan ac fe gyflwynir map o’r ardal honno i chi. Cliciwch ar y man lle mae’r eiddo gwag, llenwch y manylion, llwythwch ffotograff i fyny os oes un gennych a phwyswch anfon. A dyna’r cyfan. Gallwch hefyd weld adroddiadau am eiddo gwag eraill a gweld beth wnaed amdanyn nhw.</dd> +<dd>Rhowch god post neu gyfeiriad yn y blwch ar y dudalen hafan ac fe gyflwynir map o’r ardal honno i chi. Cliciwch ar y man lle mae’r eiddo gwag, llenwch y manylion, llwythwch ffotograff i fyny os oes un gennych a phwyswch anfon. A dyna’r cyfan.</dd> <dt>A yw’r gwasanaeth ar gael am ddim?</dt> <dd>Ydy. Talwyd am gostau datblygu a chynnal y safle hwn gan yr Asiantaeth Tai Gwag a Shelter Cymru drwy haelioni eu cyllidwyr. Mae'r Asiantaeth Tai Gwag a Shelter Cymru yn elusennau cofrestredig, felly os ydych yn credu yn ein nodau a hoffech gyfrannu, mae croeso i chi wneud hynny. -<a href="http://www.emptyhomes.com/donate.html">Asiantaeth Tai Gwag</a> -/ <a href="http://www.sheltercymru.org.uk/shelter/cymraeg/howtohelp/ood.asp">Shelter Cymru</a>.</dd> +<a href="https://secure.thebiggive.org.uk/donate/donate.php?charity_id=6651">Asiantaeth Tai Gwag</a> +/ <a href="http://cymraeg.sheltercymru.org.uk/Help/donating.aspx?ParentID=7&year=0&type=1&subcat=32&pageid=93">Shelter Cymru</a>.</dd> <dt>Ydych chi’n cael gwared ar gynnwys gwirion neu anghyfreithlon?</dt> <dd>Rydym yn cadw’r hawl i ddileu unrhyw adroddiadau neu ddiweddariadau yr ydym yn eu hystyried yn amhriodol.</dd> @@ -21,7 +21,7 @@ Mae cynghorau’n helpu ac yn dwyn perswâd ar berchenogion i adfer eu heiddo iâ Hyd yn oed wedyn, gall y broses fod yn araf, yn enwedig os yw’r eiddo mewn cyflwr gwael iawn neu os yw’r perchennog yn amharod i wneud unrhyw beth. Yn y rhan fwyaf o achosion, bydd chwe mis yn mynd heibio cyn y gallwch ddisgwyl gweld unrhyw beth yn newid, weithiau hwy. Nid yw hyn yn golygu nad yw’r cyngor yn gwneud unrhyw beth, a dyma pam rydym ni’n annog y cyngor i ddiweddaru’r wefan fel y gallwch weld beth sy’n digwydd.</p> <p> Byddwn yn cysylltu â chi ddwywaith (mis a chwe mis ar ôl i chi roi gwybod am yr eiddo gwag), fel y gallwch ddweud wrthym beth sydd wedi digwydd. Os nad yw’r cyngor yn gwneud unrhyw beth, neu os ydych chi’n meddwl bod eu hymateb yn annigonol, byddwn yn rhoi cyngor i chi ar beth i’w wneud nesaf.</p> <p> Os taw’r llywodraeth neu un o’i hasiantaethau sy’n berchen ar yr eiddo gwag, nid oes gan gynghorau unrhyw bŵer i helpu’n aml. Fodd bynnag, mae’n bosibl y byddwch yn gallu gweithredu’ch hunan yn uniongyrchol gan ddefnyddio PROD: -<a href="http://www.emptyhomes.com/usefulinformation/policy_docs/prods.html">http://www.emptyhomes.com/usefulinformation/policy_docs/prods.html</a> +<a href="http://www.emptyhomes.com/what-you-can-do-2/resources/prods-2">http://www.emptyhomes.com/what-you-can-do-2/resources/prods-2</a> </dd> <dt>A fydd adrodd am eiddo gwag yn gwneud unrhyw wahaniaeth?</dt> <dd><p>Bydd. Gall cynghorau wneud gwahaniaeth gwirioneddol, ond mae ganddynt lawer o bethau i’w gwneud. Bydd llawer o gynghorau ddim ond yn delio ag eiddo gwag sydd wedi cael eu hysbysu iddyn nhw. Os nad yw pobl yn rhoi gwybod am eiddo gwag, mae’n bosibl iawn y daw cynghorau i’r casgliad bod meysydd gwaith eraill yn fwy pwysig.</p> <p> @@ -31,9 +31,7 @@ Os taw’r llywodraeth neu un o’i hasiantaethau sy’n berchen ar yr eiddo gwa <h2>Cwestiynau Preifatrwydd </h2> <dl> <dt>Pwy sy’n cael gweld fy nghyfeiriad e-bost?</dt> - <dd>Os gwnaethoch gyflwyno eiddo gwag, wrth reswm, mae eich manylion yn cael eu darparu i ni. - Bydd eich enw’n cael ei arddangos ar y safle os ydych yn caniatáu i ni wneud hynny, ond nid eich cyfeiriad e-bost; - felly y mae hi gyda diweddariadau. Ni fyddwn byth yn rhoi nac yn gwerthu eich cyfeiriad e-bost i unrhyw un arall, oni bai ein bod ni’n gorfod gwneud hynny yn ôl y gyfraith.</dd> + <dd>Os gwnaethoch gyflwyno eiddo gwag, wrth reswm, mae eich manylion yn cael eu darparu i ni. Ni fyddwn byth yn rhoi nac yn gwerthu eich cyfeiriad e-bost i unrhyw un arall, oni bai ein bod ni’n gorfod gwneud hynny yn ôl y gyfraith.</dd> <dt>A fyddwch chi’n anfon negeseuon sbam budr, bwystfilaidd at fy nghyfeiriad e-bost?</dt> <dd>Byth. Byddwn yn anfon neges e-bost atoch os yw rhywun yn gadael diweddariad ar adroddiad a wnaed gennych, ac yn anfon holiaduron e-bost atoch chi bedair wythnos a chwe mis wedi i chi gyflwyno problem yn gofyn am ddiweddariad am ei statws; dim ond ynghylch eich problem y byddwn yn anfon negeseuon e-bost atoch chi.</dd> </dl> diff --git a/templates/web/emptyhomes/faq/faq-en-gb.html b/templates/web/emptyhomes/faq/faq-en-gb.html index 0222fcd9e..9f66613a7 100755 --- a/templates/web/emptyhomes/faq/faq-en-gb.html +++ b/templates/web/emptyhomes/faq/faq-en-gb.html @@ -4,23 +4,18 @@ <dl> <dt>What is this site for?</dt> <dd>This site is to help make it as easy as possible for you to get -empty homes in your area put back into use. It allows you, to view empty homes -that have been reported and see what has been done about them. It makes -councils accountable for responding and dealing with the empty homes you +empty homes in your area put back into use. It makes councils accountable for responding and dealing with the empty homes you report.</dd> <dt>How do I use the site?</dt> <dd>Enter a postcode or address in the box on the homepage and you are presented with a map of that area. Click where the empty property is, fill in the details, upload a photo if you have one and press submit. That’s -it. You can also view other empty properties that have been reported and see -what has been done about them.</dd> +it. </dd> <dt>Is it free?</dt> <dd>Yes. The costs of developing and running this site are shared -between the Empty Homes Agency and Shelter Cymru through the generosity of -their funders. Both the Empty Homes Agency and Shelter Cymru are registered charities, -so if you believe in their aims and would like to make a contribution, please do: -<a href="http://www.emptyhomes.com/donate.html">Empty Homes Agency</a> -or <a href="http://www.sheltercymru.org.uk/shelter/howtohelp/ood.asp">Shelter Cymru</a>.</dd> +between the Empty Homes Agency, Shelter Cymru and Shlter Scotland through the generosity of their funders. We are all registered charities, so if you believe in their aims and would like to make a contribution, please do: +<a href="https://secure.thebiggive.org.uk/donate/donate.php?charity_id=6651">Empty Homes</a> +or <a href="http://www.sheltercymru.org.uk/Help/donating.aspx?ParentID=7&year=0&type=1&subcat=32&pageid=93">Shelter Cymru</a>.</dd> <dt>Do you remove silly or illegal content?</dt> <dd>We reserve the right to remove any reports or updates which we consider to be inappropriate.</dd> @@ -40,15 +35,15 @@ Even so the process can be slow, especially if the property is in very poor repair or the owner is unwilling to do anything. In most cases it takes six months before you can expect to see anything change, occasionally longer. This doesn’t mean the council isn’t doing anything, which is why we encourage -councils to update the website so you can see what is happening.</p> <p> +councils to update you to let you know what is happening.</p> <p> We will contact you twice (a month and six months after you report the empty home) so you can tell us what has happened. If the council doesn’t do anything, or you think their response is inadequate we will advise you what you can do next.</p> <p> If the empty home is owned by the government or one its agencies, councils are often powerless to help. However you might be able to take action directly -yourself using a PROD: -<a href="http://www.emptyhomes.com/usefulinformation/policy_docs/prods.html">http://www.emptyhomes.com/usefulinformation/policy_docs/prods.html</a> +yourself using the +<a href="http://emptyhomes.com/what-you-can-do-2/resources/prods-2/">Community Right to Reclaim Land</a> </dd> <dt>Will reporting an empty home make any difference?</dt> <dd><p>Yes. Councils can make a real difference, but they have lots of @@ -68,15 +63,13 @@ save 10 million tonnes of CO<sub>2</sub> over building the same number of new ho <h2>Privacy Questions</h2> <dl> <dt>Who gets to see my email address?</dt> - <dd>If you submit an empty property, your details are provided to us and to the council. -Your name is displayed upon the site if you let us, but not your email address; -similarly with updates. We will never give or sell your email address to + <dd>If you submit an empty property, your details are provided to us and to the council. We will never give or sell your email address to anyone else, unless we are obliged to by law.</dd> <dt>Will you send nasty, brutish spam to my email address?</dt> <dd>Never. We will email you if someone leaves an update on a report you’ve made, and send you questionnaire emails four weeks and six months after you submit a problem, asking for a status update; we’ll only ever -send you emails in relation to your problem.</dd> +send you emails in relation to your report.</dd> </dl> <h2>Organisation Questions</h2> <dl> @@ -85,7 +78,7 @@ send you emails in relation to your problem.</dd> mySociety is the project of a registered charity which has grown out of the community of volunteers who built sites like <a href="http://www.theyworkforyou.com/">TheyWorkForYou</a>. mySociety’s primary mission is to build Internet projects which give people simple, tangible -benefits in the civic and community aspects of their lives. Our first project +benefits in the civic and community aspects of their lives. Their first project was <a href="http://www.writetothem.com/">WriteToThem</a>, where you can write to any of your elected representatives, for free. <a href="https://secure.mysociety.org/donate/">Donate to mySociety</a></dd> diff --git a/templates/web/emptyhomes/header.html b/templates/web/emptyhomes/header.html index d7fbcb6af..063cbba18 100644 --- a/templates/web/emptyhomes/header.html +++ b/templates/web/emptyhomes/header.html @@ -25,7 +25,6 @@ <div id="navigation"> <ul> <li><a href="/">[% loc("Report a problem") %]</a></li> - <li><a href="/reports">[% loc("All reports") %]</a></li> <li><a href="/faq">[% loc("Help") %]</a></li> <li><a href="/about">[% loc('About us') %]</a></li> [% IF lang_code == 'en-gb' %] diff --git a/templates/web/emptyhomes/index.html b/templates/web/emptyhomes/index.html index 7c4d6881b..bd7261f49 100644 --- a/templates/web/emptyhomes/index.html +++ b/templates/web/emptyhomes/index.html @@ -6,10 +6,17 @@ <div class="video"><object id="flashObj" width="480" height="270" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,47,0"><param name="movie" value="http://c.brightcove.com/services/viewer/federated_f9?isVid=1&isUI=1" /><param name="bgcolor" value="#FFFFFF" /><param name="flashVars" value="@videoPlayer=1293919404001&playerID=1242807532001&playerKey=AQ~~,AAABIWs5YNk~,K8Yb_Dc0PlMA8gCUiCBbnEcXR1bU7HRm&domain=embed&dynamicStreaming=true" /><param name="base" value="http://admin.brightcove.com" /><param name="seamlesstabbing" value="false" /><param name="allowFullScreen" value="true" /><param name="swLiveConnect" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://c.brightcove.com/services/viewer/federated_f9?isVid=1&isUI=1" bgcolor="#FFFFFF" flashVars="@videoPlayer=1293919404001&playerID=1242807532001&playerKey=AQ~~,AAABIWs5YNk~,K8Yb_Dc0PlMA8gCUiCBbnEcXR1bU7HRm&domain=embed&dynamicStreaming=true" base="http://admin.brightcove.com" name="flashObj" width="480" height="270" seamlesstabbing="false" type="application/x-shockwave-flash" allowFullScreen="true" allowScriptAccess="always" swLiveConnect="true" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash"></embed></object></div> -<p>We’re really excited to be offical advisors to the forthcoming new -empty homes TV series<br><strong>The Great British Property Scandal</strong>!</p> -<p>The series will highlight the nearly two million British families who don’t -have adequate housing, and the million-odd homes lying empty across the UK.</p> +<p> +Empty Homes were offical advisors to the recent empty homes TV series <strong>The Great British Property Scandal</strong>! +</p> + +<p> +The series highlighted the nearly two million British families who don’t have adequate housing, and the million-odd homes lying empty across the UK. +</p> + +<p> +The TV series launched a campaign for action and while this is running, our <a href="[% uri => '/' %]">www.reportemptyhomes.com</a> website has been merged with the campaign's reporting system so that all reports are gathered together and sent on to the local councils. Please use these links to report empty properties which you know of: +</p> <ul class="channel4"> @@ -41,7 +48,6 @@ have adequate housing, and the million-odd homes lying empty across the UK.</p> <span><input type="text" name="pc" value="" id="pc" size="10" maxlength="200"> <input type="submit" value="[% loc('Go') %]" id="submit"> </span> - [% c.cobrand.form_elements('postcodeForm') %] </form> <div id="front_intro"> diff --git a/templates/web/default/contact/address.html b/templates/web/fixmystreet/contact/address.html index b7ff37e5c..b7ff37e5c 100644 --- a/templates/web/default/contact/address.html +++ b/templates/web/fixmystreet/contact/address.html diff --git a/templates/web/fixmystreet/footer.html b/templates/web/fixmystreet/footer.html new file mode 100644 index 000000000..089eb1cb7 --- /dev/null +++ b/templates/web/fixmystreet/footer.html @@ -0,0 +1,51 @@ + </div><!-- #mysociety .container --> + + <div id="navigation" class="container" role="navigation"> + <div class="spacer"></div> + <ul id="site-nav" class="nav"> + <li><[% IF c.req.uri.path == '/' %]span[% ELSE %]a href="/"[% END + %]>[% loc("Report a problem") %]</[% c.req.uri.path == '/' ? 'span' : 'a' %]></li>[% + %]<li><[% IF c.req.uri.path == '/my' %]span[% ELSE %]a href="/my"[% END + %]>[% loc("Your reports") %]</[% c.req.uri.path == '/my' ? 'span' : 'a' %]></li>[% + %]<li><[% IF c.req.uri.path == '/reports' %]span[% ELSE %]a href="/reports"[% END + %]>[% loc("All reports") %]</[% c.req.uri.path == '/reports' ? 'span' : 'a' %]></li>[% + %]<li><[% IF c.req.uri.path == '/alert' %]span[% ELSE %]a href="/alert[% pc ? '/list?pc=' : '' %][% pc | uri %]"[% END + %]>[% loc("Local alerts") %]</[% c.req.uri.path == '/alert' ? 'span' : 'a' %]></li>[% + %]<li><[% IF c.req.uri.path == '/faq' %]span[% ELSE %]a href="/faq"[% END + %]>[% loc("Help") %]</[% c.req.uri.path == '/faq' ? 'span' : 'a' %]></li> + </ul> + + <ul id="mysociety-nav" class="nav"> + <li><a id="mysociety-logo" href="http://www.mysociety.org/">mySociety</a></li>[% + %]<li><a href="http://mysociety.org/donate/">Donate</a></li>[% + %]<li><a href="http://www.mysociety.org/projects/">Our Sites</a></li> + </ul> + + </div> + +</div></div></div><!-- wrappers --> + +<div id="footer"> + + <p><a href="/contact">[% loc("Contact FixMyStreet") | replace(' ', ' ') %]</a> + <br>Mobile apps: + <a href="http://itunes.apple.com/gb/app/fixmystreet/id297456545">iPhone</a>, + <a href="http://itunes.apple.com/gb/app/streetreport/id371891859">StreetReport (iPhone)</a> + | <a href="https://market.android.com/details?id=com.android.fixmystreet">Android</a> + | <a href="http://store.ovi.com/content/107557">Nokia</a> + </p> + + <p>[% loc('Are you from a <strong>council</strong>? Would you like better integration with FixMyStreet?') %] + <a href="http://www.mysociety.org/fixmystreet-for-local-council-websites/">[% loc('Find out about FixMyStreet for councils') %]</a>. + </p> + + <p>[% loc('Are you a <strong>developer</strong>? Would you like to contribute to FixMyStreet?') %] + [% loc('Our code is open source and <a href="http://github.com/mysociety/fixmystreet">available on GitHub</a>.') %] + </p> + +</div> + +[% INCLUDE 'debug_footer.html' %] + +</body> +</html> diff --git a/templates/web/default/front/news.html b/templates/web/fixmystreet/front/news.html index 080034a28..080034a28 100644 --- a/templates/web/default/front/news.html +++ b/templates/web/fixmystreet/front/news.html diff --git a/templates/web/fixmystreet/header.html b/templates/web/fixmystreet/header.html new file mode 100644 index 000000000..ff08116a9 --- /dev/null +++ b/templates/web/fixmystreet/header.html @@ -0,0 +1,49 @@ +<!doctype html> +<!--[if lt IE 7]><html class="no-js ie6 oldie" lang="[% lang_code %]"><![endif]--> +<!--[if IE 7]> <html class="no-js ie7 oldie" lang="[% lang_code %]"><![endif]--> +<!--[if IE 8]> <html class="no-js ie8 oldie" lang="[% lang_code %]"><![endif]--> +<!--[if gt IE 8]><!--><html class="no-js" lang="[% lang_code %]"><!--<![endif]--> + <head> + <meta name="viewport" content="initial-scale=1.0"> + <meta name="apple-mobile-web-app-capable" content="yes"> + <meta name="apple-mobile-web-app-status-bar-style" content="black"> + <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1"> + <meta name="HandHeldFriendly" content="true"> + <meta name="mobileoptimized" content="0"> + + <link rel="stylesheet" href="[% version('/css/core.css') %]"> + <link rel="stylesheet" href="[% version('/cobrands/fixmystreet/base.css') %]"> + <link rel="stylesheet" href="[% version('/cobrands/fixmystreet/layout.css') %]" media="(min-width:48em)"> + <!--[if (lt IE 9) & (!IEMobile)]> + <link rel="stylesheet" href="[% version('/cobrands/fixmystreet/layout.css') %]"> + <![endif]--> + + [% INCLUDE 'common_header_tags.html' %] + + [% IF c.req.uri.host == 'osm.fixmystreet.com' %] + <link rel="canonical" href="http://www.fixmystreet.com[% c.req.uri.path_query %]"> + [% END %] + + [% INCLUDE 'tracking_code.html' %] + + </head> + <body> + +<div id="wrapper"><div id="wrapper2"><div id="wrapper3"> + + [% IF NOT title AND NOT c.req.path %]<h1 id="header" role="banner">[% ELSE %]<div id="header" role="banner"><a href="/">[% END + %]<img src="/cobrands/fixmystreet/fms-logo-flat.png" width=327 height=62 alt="[% loc('FixMyStreet') %]"> + [%- IF NOT title AND NOT c.req.path %]</h1>[% ELSE %]</a></div>[% END %] + + <ul id="meta"> + [% IF c.user_exists %] + <li>[% tprintf(loc('Signed in as %s'), c.user.name || c.user.email) %] + <li class="last"><a href="/auth/sign_out">[% loc('Sign out') %]</a></li> + [% ELSE %] + <li> </li> + [% END %] + </ul> + + <div id="mysociety" class="container" role="main"> + + [% INCLUDE 'debug_header.html' %] diff --git a/templates/web/default/tracking_code.html b/templates/web/fixmystreet/tracking_code.html index b506d41c1..b506d41c1 100644 --- a/templates/web/default/tracking_code.html +++ b/templates/web/fixmystreet/tracking_code.html diff --git a/web/cobrands/fixmystreet/_colours.scss b/web/cobrands/fixmystreet/_colours.scss new file mode 100644 index 000000000..936a98c34 --- /dev/null +++ b/web/cobrands/fixmystreet/_colours.scss @@ -0,0 +1,5 @@ +/* COLOURS */ + +$colour_dark: #4e1602; +$colour: #c23704; +$colour_alt: #ffeeaa; diff --git a/web/cobrands/fixmystreet/_h5bp.scss b/web/cobrands/fixmystreet/_h5bp.scss new file mode 100644 index 000000000..30ebcbfe1 --- /dev/null +++ b/web/cobrands/fixmystreet/_h5bp.scss @@ -0,0 +1,272 @@ +/* + * HTML5 ✰ Boilerplate, with minor tweaks. + * + * What follows is the result of much research on cross-browser styling. + * Credit left inline and big thanks to Nicolas Gallagher, Jonathan Neal, + * Kroc Camen, and the H5BP dev community and team. + * + * Detailed information about this CSS: h5bp.com/css + * + * ==|== normalize ========================================================== + */ + + +/* ============================================================================= + HTML5 display definitions + ========================================================================== */ + +article, aside, details, figcaption, figure, footer, header, hgroup, nav, section { display: block; } +audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; } +audio:not([controls]) { display: none; } +[hidden] { display: none; } + + +/* ============================================================================= + Base + ========================================================================== */ + +/* + * 1. Correct text resizing oddly in IE6/7 when body font-size is set using em units + * 2. Force vertical scrollbar in non-IE - mySociety removed. + * 3. Prevent iOS text size adjust on device orientation change, without disabling user zoom: h5bp.com/g + */ + +html { font-size: 100%; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } + +/* mySociety change: line-height from 1.4 */ +body { margin: 0; font-size: 1em; line-height: 1.5; } + +/* mySociety addition: background colour */ +body, button, input, select, textarea { + font-family: sans-serif; + color: #222; + background-color: #fff +} + +/* + * Remove text-shadow in selection highlight: h5bp.com/i + * These selection declarations have to be separate + * mySociety change: background colour from #fe57a1 + */ + +::-moz-selection { background: #ffeeaa; color: #000; text-shadow: none; } +::selection { background: #ffeeaa; color: #000; text-shadow: none; } + + +/* ============================================================================= + Links + ========================================================================== */ + +/* mySociety removal: link colours specified elsewhere */ +a:focus { outline: thin dotted; } + +/* Improve readability when focused and hovered in all browsers: h5bp.com/h */ +a:hover, a:active { outline: 0; } + + +/* ============================================================================= + Typography + ========================================================================== */ + +abbr[title] { border-bottom: 1px dotted; } + +b, strong { font-weight: bold; } + +/* mySociety change: from 1em 40px; */ +blockquote { margin: 1.5em 2em; } + +dfn { font-style: italic; } + +hr { display: block; height: 1px; border: 0; border-top: 1px solid #ccc; margin: 1em 0; padding: 0; } + +ins { background: #ff9; color: #000; text-decoration: none; } + +mark { background: #ff0; color: #000; font-style: italic; font-weight: bold; } + +/* Redeclare monospace font family: h5bp.com/j */ +pre, code, kbd, samp { font-family: monospace, serif; _font-family: 'courier new', monospace; font-size: 1em; } + +/* Improve readability of pre-formatted text in all browsers */ +pre { white-space: pre; white-space: pre-wrap; word-wrap: break-word; } + +q { quotes: none; } +q:before, q:after { content: ""; content: none; } + +small { font-size: 85%; } + +/* Position subscript and superscript content without affecting line-height: h5bp.com/k */ +sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } +sup { top: -0.5em; } +sub { bottom: -0.25em; } + + +/* ============================================================================= + Lists + ========================================================================== */ + +/* mySociety change: left 40px, top/bottom 1em */ +ul, ol { margin: 0 0 1.5em; padding: 0 0 0 2em; } +dd { margin: 0 0 0 2em; } +nav ul, nav ol { list-style: none; list-style-image: none; margin: 0; padding: 0; } + + +/* ============================================================================= + Embedded content + ========================================================================== */ + +/* + * 1. Improve image quality when scaled in IE7: h5bp.com/d + * 2. Remove the gap between images and borders on image containers: h5bp.com/e + */ + +img { border: 0; -ms-interpolation-mode: bicubic; vertical-align: middle; } + +/* + * Correct overflow not hidden in IE9 + */ + +svg:not(:root) { overflow: hidden; } + + +/* ============================================================================= + Figures + ========================================================================== */ + +figure { margin: 0; } + + +/* ============================================================================= + Forms + ========================================================================== */ + +form { margin: 0; } +fieldset { border: 0; margin: 0; padding: 0; } + +/* Indicate that 'label' will shift focus to the associated form element */ +label { cursor: pointer; } + +/* + * 1. Correct color not inheriting in IE6/7/8/9 + * 2. Correct alignment displayed oddly in IE6/7 + */ + +legend { border: 0; *margin-left: -7px; padding: 0; } + +/* + * 1. Correct font-size not inheriting in all browsers + * 2. Remove margins in FF3/4 S5 Chrome + * 3. Define consistent vertical alignment display in all browsers + */ + +button, input, select, textarea { font-size: 100%; margin: 0; vertical-align: baseline; *vertical-align: middle; } + +/* + * 1. Define line-height as normal to match FF3/4 (set using !important in the UA stylesheet) + */ + +button, input { line-height: normal; } + +/* + * 1. Display hand cursor for clickable form elements + * 2. Allow styling of clickable form elements in iOS + * 3. Correct inner spacing displayed oddly in IE7 (doesn't effect IE6) + */ + +button, input[type="button"], input[type="reset"], input[type="submit"] { cursor: pointer; -webkit-appearance: button; *overflow: visible; } + +/* + * Consistent box sizing and appearance + */ + +input[type="checkbox"], input[type="radio"] { box-sizing: border-box; padding: 0; } +input[type="search"] { -webkit-appearance: textfield; -moz-box-sizing: content-box; -webkit-box-sizing: content-box; box-sizing: content-box; } +input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } + +/* + * Remove inner padding and border in FF3/4: h5bp.com/l + */ + +button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } + +/* + * 1. Remove default vertical scrollbar in IE6/7/8/9 + * 2. Allow only vertical resizing + */ + +textarea { overflow: auto; vertical-align: top; resize: vertical; } + + +/* ============================================================================= + Tables + ========================================================================== */ + +table { border-collapse: collapse; border-spacing: 0; } +td { vertical-align: top; } + + +/* ==|== primary styles ===================================================== + Author: + ========================================================================== */ + + + + + + + + + + + + + + + + +/* ==|== non-semantic helper classes ======================================== + Please define your styles before this section. + ========================================================================== */ + +/* For image replacement */ +.ir { display: block; border: 0; text-indent: -999em; overflow: hidden; background-color: transparent; background-repeat: no-repeat; text-align: left; direction: ltr; *line-height: 0; } +.ir br { display: none; } + +/* Hide from both screenreaders and browsers: h5bp.com/u */ +.hidden { display: none !important; visibility: hidden; } + +/* Hide only visually, but have it available for screenreaders: h5bp.com/v */ +.visuallyhidden { border: 0; clip: rect(0 0 0 0); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; } + +/* Extends the .visuallyhidden class to allow the element to be focusable when navigated to via the keyboard: h5bp.com/p */ +.visuallyhidden.focusable:active, .visuallyhidden.focusable:focus { clip: auto; height: auto; margin: 0; overflow: visible; position: static; width: auto; } + +/* Hide visually and from screenreaders, but maintain layout */ +.invisible { visibility: hidden; } + +/* Contain floats: h5bp.com/q */ +/* mySociety change: rename to cf */ +.cf:before, .cf:after { content: ""; display: table; } +.cf:after { clear: both; } +.cf { *zoom: 1; } + + + +/* ==|== print styles ======================================================= + Print styles. + Inlined to avoid required HTTP connection: h5bp.com/r + ========================================================================== */ + +@media print { + * { background: transparent !important; color: black !important; box-shadow:none !important; text-shadow: none !important; filter:none !important; -ms-filter: none !important; } /* Black prints faster: h5bp.com/s */ + a, a:visited { text-decoration: underline; } + a[href]:after { content: " (" attr(href) ")"; } + abbr[title]:after { content: " (" attr(title) ")"; } + .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } /* Don't show links for images, or javascript/internal links */ + pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } + thead { display: table-header-group; } /* h5bp.com/t */ + tr, img { page-break-inside: avoid; } + img { max-width: 100% !important; } + @page { margin: 0.5cm; } + p, h2, h3 { orphans: 3; widows: 3; } + h2, h3 { page-break-after: avoid; } +} diff --git a/web/cobrands/fixmystreet/base.scss b/web/cobrands/fixmystreet/base.scss new file mode 100644 index 000000000..2eccad197 --- /dev/null +++ b/web/cobrands/fixmystreet/base.scss @@ -0,0 +1,198 @@ +/* Base stylesheet for FixMyStreet look + * + * In a mobile first way, this contains the look of the site, and a basic + * layout for browsers that can't handle media queries. Baseline grid of 1.5em. + */ + +@import "_h5bp"; +@import "_colours"; + +/* HEADINGS and TYPOGRAPHY */ + +@font-face { + font-family: 'MuseoSansRounded-500'; + src: url('fonts/MuseoSansRounded500.eot'); + src: url('fonts/MuseoSansRounded500.eot?#iefix') format('embedded-opentype'), + url('fonts/MuseoSansRounded500.woff') format('woff'), + url('fonts/MuseoSansRounded500.ttf') format('truetype'), + url('fonts/MuseoSansRounded500.svg#MuseoSansRounded-500') format('svg'); +} + +h1, h2, h3, h4, h5, h6, #header { + font-family: 'MuseoSansRounded-500', sans-serif; + font-weight: normal; +} + +/* Opera has a bug (from around 10.5 upwards to current 11.6) with showing the + * table caption *at all* if the header is set to a font-face :( */ +noindex:-o-prefocus, #header { + font-family: sans-serif; +} + +/* Headings fit within the baseline grid, skewed towards the bottom. As the h1 + * appears first, if it appears, it needs no margin at all. */ +h1 { + font-size: 2em; + margin: 0; +} + +h2 { + font-size: 1.5em; + line-height: 1; + margin: 1.5em 0 0.5em; +} + +h3 { + font-size: 1.25em; + line-height: 1.2; + margin: 1.8em 0 0.6em; +} + +h4 { + font-size: 1.2em; + line-height: 1.25; + margin: 1.875em 0 0.625em; +} + +p { + margin: 0 0 1.5em; +} + +select, input, textarea { + font-size: 99%; + max-width: 95%; +} + +img { + max-width: 100%; +} + +/* LINKS */ + +a:link { + color: $colour; +} + +a:visited { + color: $colour_dark; +} + +a:active, a:hover { + color: #200; +} + + +/* LAYOUT */ + +/* header is a div containing a link on all pages bar the front page, when it + * is a h1 that is not a link. It should always display the same. */ +#header { + display: block; + margin: 0 0 0.5em 0; + font-size: 200%; + + /* The link of the heading should not be underlined. */ + a { + text-decoration: none; + } +} + +#meta { + list-style-type: none; + margin: 0.5em 0; + padding: 0; + font-size: 0.875em; + li { + display: inline; + margin: 0; + padding: 0 0 0 0.25em; + } + li.last { + border-left: solid 1px $colour_dark; + } +} + +.container { + position: relative; + margin: auto; + overflow: hidden; +} + +/* Three wrapper divs are used in the source. At large screen widths, the + * default background colour is $colour, in order for the footer to stay the + * same at any depth. So the outermost wrapper changes this back to white at + * full width; the second wrapper sets a maximum width for the main content, + * with a little padding so it never hits the browser edge, and centred; and + * the third wrapper is a full width table, so that a table caption can be used + * to have correct source order.*/ +#wrapper { + background: #fff; +} + +#wrapper2 { + max-width: 59em; + padding: 0.5em; + margin: 0 auto; +} + +#navigation { + display: table; + width: 100%; + border-top: solid 1px $colour; + padding-top: 1.5em; + margin: 1.5em 0; +} + +.nav { + display: table-cell; + // width: 50%; +} +.ie6, .ie7 { + .nav { + float: left; + } +} + +#footer { + color: #fff; + padding: 0.5em; + background-color: #3c3c3c; + background-image: url(/cobrands/fixmystreet/texture.png); + + a { + color: #fff; + } + + a:hover { + color: #ffe600; + } + + p { + margin: 0.5em 0; + } +} + + +/* DISPLAY BITS */ + +a.unsuitable-report { + font-size: small; +} + +blockquote { + border-left: solid 4px $colour; +} + +.a { + color: #000000; + background-color: $colour_alt; +} + +#postcodeForm { + background-color: $colour_alt; +} + +#front_stats div { + background-color: $colour_alt; +} + diff --git a/web/cobrands/fixmystreet/fms-logo-flat.png b/web/cobrands/fixmystreet/fms-logo-flat.png Binary files differnew file mode 100644 index 000000000..50d1e4891 --- /dev/null +++ b/web/cobrands/fixmystreet/fms-logo-flat.png diff --git a/web/cobrands/fixmystreet/fms-logo.png b/web/cobrands/fixmystreet/fms-logo.png Binary files differnew file mode 100644 index 000000000..23bea6b0f --- /dev/null +++ b/web/cobrands/fixmystreet/fms-logo.png diff --git a/web/cobrands/fixmystreet/fonts/MuseoSansRounded500.eot b/web/cobrands/fixmystreet/fonts/MuseoSansRounded500.eot Binary files differnew file mode 100644 index 000000000..8517f0a04 --- /dev/null +++ b/web/cobrands/fixmystreet/fonts/MuseoSansRounded500.eot diff --git a/web/cobrands/fixmystreet/fonts/MuseoSansRounded500.svg b/web/cobrands/fixmystreet/fonts/MuseoSansRounded500.svg new file mode 100644 index 000000000..572bef8e4 --- /dev/null +++ b/web/cobrands/fixmystreet/fonts/MuseoSansRounded500.svg @@ -0,0 +1,418 @@ +<?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" > +<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%"> +<metadata version="1.0"><uniqueid id="com.myfonts.exljbris.museo-sans-rounded.500.wfkit2.5nqn"/><vendor name="MyFonts" url="http://www.myfonts.com/"/><credits><credit name="Jos Buivenga" url="http://www.myfonts.com/person/buivenga/jos/"/></credits><description><text lang="en">This is a Webfont from MyFonts. Full information about this font: +http://www.myfonts.com/fonts/exljbris/museo-sans-rounded/500// +</text></description><license url="http://new.myfonts.com/license/922,1146"/><copyright><text lang="en">Copyright (c) 2011 by Jos Buivenga. All rights reserved.</text></copyright><trademark><text lang="en">Museo Sans Rounded is a trademark of Jos Buivenga.</text></trademark></metadata> +<defs > +<font id="MuseoSansRounded-500" horiz-adv-x="453" ><font-face + font-family="Museo Sans Rounded 500" + units-per-em="1000" + panose-1="2 0 0 0 0 0 0 0 0 0" + ascent="772" + descent="-228" + alphabetic="0" /> +<missing-glyph horiz-adv-x="549" d="M25 33V667Q25 700 58 700H492Q525 700 525 667V33Q525 0 492 0H58Q25 0 25 33ZM275 395L445 650H105L275 395ZM305 350L475 95V605L305 350ZM75 95L245 350L75 605V95ZM105 50H445L275 305L105 50Z" /> +<glyph unicode=" " glyph-name="space" horiz-adv-x="250" /> +<glyph unicode="!" glyph-name="exclam" horiz-adv-x="259" d="M118 194Q85 194 85 227L80 673Q80 706 112 706H146Q179 706 179 673L174 227Q172 194 140 194H118ZM80 33V65Q80 98 113 98H147Q180 98 180 65V33Q180 0 147 0H113Q80 0 80 33Z" /> +<glyph unicode=""" glyph-name="quotedbl" horiz-adv-x="329" d="M230 506Q197 506 197 539V685Q197 718 230 718H240Q273 718 273 685V539Q273 506 240 506H230ZM89 506Q56 506 56 539V685Q56 718 89 718H99Q132 718 132 685V539Q132 506 99 506H89Z" /> +<glyph unicode="#" glyph-name="numbersign" horiz-adv-x="702" d="M143 35L170 191H76Q40 191 45 226L47 235Q51 265 83 265H183L212 433H119Q83 433 88 468L90 477Q95 506 125 506H225L254 677Q260 706 290 706H305Q341 706 335 671L306 506H461L490 677Q496 +706 527 706H541Q577 706 571 671L542 506H636Q672 506 667 471L665 462Q660 433 630 433H530L500 265H593Q629 265 624 229L622 221Q617 191 586 191H487L460 30Q454 0 423 0H409Q373 0 379 35L406 191H251L223 30Q219 0 187 0H173Q137 0 143 35ZM264 265H419L449 +433H293L264 265Z" /> +<glyph unicode="$" glyph-name="dollar" horiz-adv-x="536" d="M76 60Q50 80 71 106L87 129Q105 154 134 135Q207 80 287 80Q339 80 374 108T410 184Q410 224 375 253T288 304T186 351T100 419T64 521Q64 594 115 648T249 715V776Q249 809 281 809H289Q320 809 +320 780V716Q401 712 468 665Q492 650 477 620L464 595Q448 567 418 586Q355 626 291 626Q236 626 200 596T163 523Q163 495 182 473T231 434T299 403T373 370T440 328T490 269T509 187Q509 110 458 55T320 -10V-69Q320 -102 289 -102H281Q249 -102 249 -73V-10Q154 +-1 76 60Z" /> +<glyph unicode="%" glyph-name="percent" horiz-adv-x="755" d="M196 422Q133 422 89 465T44 570T88 674T196 718Q258 718 303 675T348 570T303 466T196 422ZM91 40L585 687Q600 706 625 706H643Q664 706 670 694T663 666L169 20Q153 0 129 0H111Q90 0 84 12T91 +40ZM196 496Q227 496 248 517T270 570T249 623T196 645T144 623T122 570Q122 538 143 517T196 496ZM407 136Q407 197 451 240T558 284T665 241T710 136T666 32T558 -12T451 31T407 136ZM485 167T485 136T506 84T558 62Q590 62 611 83T632 136Q632 167 611 189T558 +211T506 189Z" /> +<glyph unicode="&" glyph-name="ampersand" horiz-adv-x="644" d="M45 198Q45 258 78 309T170 379V381Q166 382 160 385T138 400T109 428T86 473T76 536Q76 622 136 670T293 718H339Q372 718 372 685V667Q372 634 339 634H298Q243 634 210 604T176 526Q176 +483 205 449T306 415H437V478Q437 511 470 511H501Q534 511 534 483V415H595Q628 415 628 382V362Q628 329 595 329H534V235Q534 118 469 53T290 -12Q181 -12 113 48T45 198ZM146 203Q146 151 186 115T290 79Q360 79 398 118T437 239V329H302Q227 329 187 296T146 +203Z" /> +<glyph unicode="'" glyph-name="quotesingle" horiz-adv-x="188" d="M88 530Q55 530 55 562V685Q55 718 88 718H100Q132 718 132 685V562Q132 530 100 530H88Z" /> +<glyph unicode="(" glyph-name="parenleft" horiz-adv-x="275" d="M154 -75Q49 114 49 340Q49 537 152 713Q164 735 191 735H206Q225 735 231 725T229 697Q137 522 137 339Q137 131 231 -56Q239 -73 233 -84T208 -95H191Q165 -95 154 -75Z" /> +<glyph unicode=")" glyph-name="parenright" horiz-adv-x="275" d="M50 -54Q142 130 142 339Q142 524 51 697Q42 714 47 724T72 735H89Q116 735 128 713Q230 538 230 340Q230 113 128 -73Q116 -95 88 -95H73Q54 -95 48 -84T50 -54Z" /> +<glyph unicode="*" glyph-name="asterisk" horiz-adv-x="473" d="M141 349L124 361Q97 380 119 406L185 491V493L82 522Q48 530 59 562L65 581Q76 615 106 602L208 564L204 672Q201 706 235 706H258Q292 706 289 673L284 564L386 601Q418 614 428 582L435 563Q444 +530 413 523L308 493V491L374 407Q397 381 369 361L353 349Q325 329 308 357L248 447H246L187 359Q168 329 141 349Z" /> +<glyph unicode="+" glyph-name="plus" horiz-adv-x="613" d="M75 246Q42 246 42 279V291Q42 324 75 324H266V537Q266 570 299 570H315Q348 570 348 537V324H538Q571 324 571 291V279Q571 246 538 246H348V33Q348 0 315 0H299Q266 0 266 33V246H75Z" /> +<glyph unicode="," glyph-name="comma" horiz-adv-x="237" d="M35 -87L87 77Q94 105 124 105H155Q174 105 181 95T181 67L113 -99Q103 -124 74 -124H63Q25 -124 35 -87Z" /> +<glyph unicode="-" glyph-name="hyphen" horiz-adv-x="420" d="M97 242Q64 242 64 275V295Q64 328 97 328H323Q356 328 356 295V275Q356 242 323 242H97Z" /> +<glyph unicode="." glyph-name="period" horiz-adv-x="228" d="M62 33V72Q62 105 95 105H133Q166 105 166 72V33Q166 0 133 0H95Q62 0 62 33Z" /> +<glyph unicode="/" glyph-name="slash" horiz-adv-x="395" d="M46 -5L279 717Q288 744 317 744H335Q352 744 360 734T362 707L129 -15Q119 -42 91 -42H73Q55 -42 48 -32T46 -5Z" /> +<glyph unicode="0" glyph-name="zero" horiz-adv-x="622" d="M311 -12Q243 -12 193 16T115 95T74 210T61 354T74 497T115 611T193 690T311 718Q561 718 561 354Q561 -12 311 -12ZM163 79T311 79T459 354Q459 627 311 627T163 354Q163 79 311 79Z" /> +<glyph unicode="1" glyph-name="one" horiz-adv-x="469" d="M50 33V53Q50 86 83 86H206V542L207 585H205Q196 569 174 547L129 503Q104 480 83 504L69 518Q45 542 69 565L197 690Q214 706 237 706H269Q302 706 302 673V86H424Q457 86 457 53V33Q457 0 424 0H83Q50 +0 50 33Z" /> +<glyph unicode="2" glyph-name="two" horiz-adv-x="559" d="M48 33V54Q48 113 73 163T137 247T221 313T304 372T368 434T394 508Q394 560 359 592T267 625Q193 625 142 560Q118 534 95 553L77 567Q51 587 68 612Q97 653 148 685T274 718Q372 718 434 662T497 515Q497 +468 479 427T430 357T364 300T292 249T225 201T176 148T156 86H475Q508 86 508 53V33Q508 0 475 0H83Q48 0 48 33Z" /> +<glyph unicode="3" glyph-name="three" horiz-adv-x="556" d="M72 63Q48 82 67 109L83 132Q102 156 129 138Q198 82 274 82Q334 82 376 118T418 211Q418 273 371 307T254 341H232Q206 341 195 365L192 371Q181 394 200 414L336 575L380 621V623Q359 620 320 620H114Q81 +620 81 653V673Q81 706 114 706H470Q503 706 503 675V666Q503 642 488 626L311 422Q393 413 455 361T518 215T451 55T278 -12Q167 -12 72 63Z" /> +<glyph unicode="4" glyph-name="four" horiz-adv-x="597" d="M56 189Q23 189 23 222V228Q23 250 36 269L336 685Q350 706 375 706H430Q463 706 463 673V273H526Q559 273 559 240V222Q559 189 531 189H463V33Q463 0 430 0H398Q365 0 365 33V189H56ZM133 273H365V530L370 +600H368Q351 567 333 542L133 275V273Z" /> +<glyph unicode="5" glyph-name="five" horiz-adv-x="553" d="M85 65Q60 85 82 110L98 132Q117 156 143 136Q200 82 273 82Q337 82 382 122T428 225T382 329T267 370Q220 370 170 345Q146 336 126 343L117 346Q90 357 93 385L123 675Q126 706 157 706H449Q482 706 +482 673V653Q482 620 449 620H212L195 471L190 434H192Q231 456 283 456Q392 456 460 390T529 226Q529 124 458 56T279 -12Q165 -12 85 65Z" /> +<glyph unicode="6" glyph-name="six" horiz-adv-x="592" d="M55 319Q55 391 74 460T131 587T232 682T373 718Q432 718 479 701Q510 690 498 659L489 634Q479 606 449 614Q412 627 377 627Q285 627 231 557T163 386H165Q188 417 231 437T328 457Q424 457 485 392T546 +230Q546 125 482 57T318 -12Q204 -12 130 80T55 319ZM158 270Q158 204 205 142T318 79Q377 79 412 119T447 225Q447 291 408 332T299 373Q240 373 199 343T158 270Z" /> +<glyph unicode="7" glyph-name="seven" horiz-adv-x="515" d="M97 39L353 556L392 621V623Q378 620 343 620H60Q27 620 27 653V673Q27 706 60 706H466Q499 706 499 675V659Q499 636 490 619L192 24Q181 0 154 0H121Q102 0 96 11T97 39Z" /> +<glyph unicode="8" glyph-name="eight" horiz-adv-x="599" d="M54 199Q54 312 167 391Q82 447 82 533Q82 609 139 663T302 718Q402 718 464 667T526 532Q526 438 442 347Q542 287 542 194Q542 110 475 49T300 -12Q194 -12 124 48T54 199ZM367 383Q429 450 429 +521Q429 573 394 602T302 632T212 604T179 532Q179 515 184 501T200 474T223 453T254 434T288 417T327 400T367 383ZM153 209Q153 150 196 113T300 75Q356 75 398 109T441 194Q441 214 433 231T414 259T380 284T341 304T290 326T238 349Q153 285 153 209Z" /> +<glyph unicode="9" glyph-name="nine" horiz-adv-x="592" d="M94 47L103 73Q113 100 143 92Q190 79 215 79Q307 79 361 149T429 320H427Q404 289 360 270T263 250Q168 250 107 315T46 479Q46 584 110 651T273 718Q388 718 462 627T537 388Q537 316 518 247T461 +119T361 24T219 -12Q157 -12 113 6Q82 15 94 47ZM293 333Q351 333 392 364T434 436Q434 502 387 564T274 627Q215 627 180 587T145 481Q145 415 184 374T293 333Z" /> +<glyph unicode=":" glyph-name="colon" horiz-adv-x="232" d="M98 403Q66 403 66 436V473Q66 506 98 506H134Q167 506 167 473V436Q167 403 134 403H98ZM66 33V70Q66 103 98 103H134Q167 103 167 70V33Q167 0 134 0H98Q66 0 66 33Z" /> +<glyph unicode=";" glyph-name="semicolon" horiz-adv-x="273" d="M139 401Q106 401 106 434V473Q106 506 139 506H174Q207 506 207 473V434Q207 401 174 401H139ZM56 -88L100 77Q107 105 137 105H168Q187 105 194 95T194 67L134 -98Q125 -124 96 -124H84Q48 -124 +56 -88Z" /> +<glyph unicode="<" glyph-name="less" horiz-adv-x="613" d="M84 241Q59 251 59 279V290Q59 318 84 329L486 508Q503 515 514 509T525 484V464Q525 438 499 426L167 286V284L499 143Q525 133 525 105V86Q525 67 514 60T486 61L84 241Z" /> +<glyph unicode="=" glyph-name="equal" horiz-adv-x="613" d="M101 340Q68 340 68 373V385Q68 418 101 418H512Q545 418 545 385V373Q545 340 512 340H101ZM101 151Q68 151 68 184V196Q68 229 101 229H512Q545 229 545 196V184Q545 151 512 151H101Z" /> +<glyph unicode=">" glyph-name="greater" horiz-adv-x="613" d="M88 86V105Q88 133 113 143L445 284V286L113 426Q88 438 88 464V484Q88 503 98 509T126 509L529 329Q554 317 554 290V279Q554 251 529 241L126 61Q109 54 99 60T88 86Z" /> +<glyph unicode="?" glyph-name="question" horiz-adv-x="456" d="M190 194Q157 194 157 227V247Q157 286 174 318T217 374T267 419T309 470T327 530Q327 572 295 600T212 629Q168 629 125 604Q94 588 78 613L65 631Q46 659 71 676Q139 720 219 720Q307 720 367 +669T428 537Q428 493 411 457T368 396T318 350T273 300T252 240L251 219Q247 194 219 194H190ZM154 33V65Q154 98 187 98H222Q255 98 255 65V33Q255 0 222 0H187Q154 0 154 33Z" /> +<glyph unicode="@" glyph-name="at" horiz-adv-x="794" d="M52 241Q52 396 158 503T418 611Q552 611 614 554T677 408V125H716Q749 125 749 92V85Q749 52 716 52H476Q385 52 327 107T269 241Q269 318 326 373T476 428H584Q582 473 540 502T422 531Q307 531 228 +446T149 241Q149 129 219 48T401 -45Q433 -48 433 -79V-92Q433 -127 399 -124Q247 -113 150 -9T52 241ZM367 242Q367 193 400 159T484 125H584V361H486Q434 361 401 327T367 242Z" /> +<glyph unicode="A" glyph-name="A" horiz-adv-x="621" d="M24 38L256 679Q265 706 293 706H341Q369 706 378 679L610 38Q616 21 609 11T583 0H549Q521 0 512 27L449 203H183L121 27Q114 0 85 0H51Q32 0 25 10T24 38ZM209 285H423L345 509L318 609H316Q300 545 +288 509L209 285Z" /> +<glyph unicode="B" glyph-name="B" horiz-adv-x="617" d="M90 33V673Q90 706 123 706H337Q428 706 484 658T541 526Q541 475 518 435T454 374V372Q508 356 539 309T570 201Q570 105 506 53T342 0H123Q90 0 90 33ZM188 409H337Q384 409 412 439T441 516T413 591T335 +620H188V409ZM188 86H347Q404 86 436 119T469 206T436 293T347 327H188V86Z" /> +<glyph unicode="C" glyph-name="C" horiz-adv-x="707" d="M46 357Q46 512 147 615T405 718Q541 718 639 645Q662 627 645 599L632 579Q615 553 586 571Q502 627 409 627Q289 627 219 550T148 358Q148 241 220 160T410 79Q513 79 602 148Q629 169 648 144L663 124Q682 +99 658 78Q550 -12 407 -12Q246 -12 146 93T46 357Z" /> +<glyph unicode="D" glyph-name="D" horiz-adv-x="729" d="M90 33V673Q90 706 123 706H324Q487 706 584 613T682 354Q682 188 585 94T324 0H123Q90 0 90 33ZM188 86H317Q438 86 509 156T580 354Q580 481 509 550T317 620H188V86Z" /> +<glyph unicode="E" glyph-name="E" horiz-adv-x="555" d="M90 33V673Q90 706 123 706H467Q500 706 500 673V653Q500 620 467 620H188V399H409Q442 399 442 366V346Q442 313 409 313H188V86H484Q517 86 517 53V33Q517 0 484 0H123Q90 0 90 33Z" /> +<glyph unicode="F" glyph-name="F" horiz-adv-x="505" d="M90 33V673Q90 706 123 706H446Q479 706 479 673V653Q479 620 446 620H188V388H402Q435 388 435 355V335Q435 302 402 302H188V33Q188 0 155 0H123Q90 0 90 33Z" /> +<glyph unicode="G" glyph-name="G" horiz-adv-x="751" d="M46 194T46 351T148 613T406 718Q484 718 544 697T638 652Q663 633 645 607L631 586Q615 561 585 577Q503 627 411 627Q292 627 220 549T148 355Q148 235 222 157T406 79Q442 79 476 88T533 111T573 137T599 +160L607 170V269H525Q492 269 492 302V322Q492 355 525 355H664Q697 355 697 322V33Q697 0 664 0H645Q612 0 612 28V54L613 76H611Q608 72 602 67T576 46T532 19T471 -2T393 -12Q248 -12 147 91Z" /> +<glyph unicode="H" glyph-name="H" horiz-adv-x="743" d="M90 33V673Q90 706 123 706H155Q188 706 188 673V395H555V673Q555 706 588 706H621Q653 706 653 673V33Q653 0 621 0H588Q555 0 555 33V310H188V33Q188 0 155 0H123Q90 0 90 33Z" /> +<glyph unicode="I" glyph-name="I" horiz-adv-x="278" d="M90 33V673Q90 706 123 706H155Q188 706 188 673V33Q188 0 155 0H123Q90 0 90 33Z" /> +<glyph unicode="J" glyph-name="J" horiz-adv-x="522" d="M22 205Q22 238 55 238H89Q105 238 112 231T121 204Q124 147 151 113T231 79Q279 79 310 109T342 204V620H197Q165 620 165 653V673Q165 706 197 706H407Q440 706 440 673V203Q440 96 379 42T232 -12Q145 +-12 84 43T22 205Z" /> +<glyph unicode="K" glyph-name="K" horiz-adv-x="605" d="M90 33V673Q90 706 123 706H155Q188 706 188 673V409H294L459 684Q471 706 498 706H535Q555 706 561 695T558 666L375 371V369L571 39Q581 22 575 11T549 0H508Q482 0 469 23L294 324H188V33Q188 0 155 +0H123Q90 0 90 33Z" /> +<glyph unicode="L" glyph-name="L" horiz-adv-x="510" d="M90 33V673Q90 706 123 706H155Q188 706 188 673V86H472Q505 86 505 53V33Q505 0 472 0H123Q90 0 90 33Z" /> +<glyph unicode="M" glyph-name="M" horiz-adv-x="845" d="M68 34L120 675Q123 706 154 706H199Q227 706 236 680L389 324L424 229H426Q444 285 460 324L613 680Q622 706 650 706H695Q726 706 729 675L781 34Q783 0 749 0H717Q686 0 683 32L651 445L649 549H647Q625 +484 609 445L479 153Q469 127 441 127H408Q380 127 370 153L240 445L202 551H200Q202 488 198 445L166 32Q163 0 133 0H100Q66 0 68 34Z" /> +<glyph unicode="N" glyph-name="N" horiz-adv-x="744" d="M90 33V673Q90 706 123 706H161Q187 706 201 684L502 247Q513 230 527 205T551 162L560 145H562Q556 208 556 247V673Q556 706 589 706H621Q654 706 654 673V33Q654 0 621 0H583Q556 0 544 22L242 458L184 +561H182Q188 498 188 458V33Q188 0 155 0H123Q90 0 90 33Z" /> +<glyph unicode="O" glyph-name="O" horiz-adv-x="815" d="M45 358Q45 511 148 614T408 718Q564 718 667 615T770 358Q770 201 667 95T408 -12T149 94T45 358ZM147 358Q147 239 221 159T408 79T594 159T668 358Q668 473 594 550T408 627T222 550T147 358Z" /> +<glyph unicode="P" glyph-name="P" horiz-adv-x="596" d="M90 33V673Q90 706 123 706H348Q446 706 507 646T569 485T507 323T348 261H188V33Q188 0 155 0H123Q90 0 90 33ZM188 347H332Q396 347 432 384T469 485Q469 548 433 584T333 620H188V347Z" /> +<glyph unicode="Q" glyph-name="Q" horiz-adv-x="816" d="M46 357Q46 511 149 614T407 718Q565 718 668 615T771 357Q771 225 688 124L746 66Q770 45 749 20L736 6Q712 -18 691 4L631 64Q536 -12 407 -12Q251 -12 149 94T46 357ZM148 357Q148 239 222 159T407 +79Q498 79 561 131L502 190Q478 211 500 236L513 249Q535 275 557 253L617 192Q669 264 669 357Q669 473 594 550T407 627Q296 627 222 550T148 357Z" /> +<glyph unicode="R" glyph-name="R" horiz-adv-x="617" d="M90 33V673Q90 706 123 706H313Q403 706 445 687Q497 664 526 616T556 502Q556 434 522 381T430 308V306Q439 296 451 274L578 39Q588 22 582 11T556 0H516Q488 0 477 23L339 281H188V33Q188 0 155 0H123Q90 +0 90 33ZM188 367H330Q388 367 422 403T456 498Q456 580 390 608Q363 620 306 620H188V367Z" /> +<glyph unicode="S" glyph-name="S" horiz-adv-x="537" d="M77 61Q54 82 73 107L90 131Q108 154 135 137Q214 80 289 80Q345 80 379 107T413 181Q413 224 378 254T293 306T193 351T108 418T73 522Q73 610 138 664T302 718Q358 718 405 701T479 664Q503 647 489 +619L475 594Q460 567 430 585Q361 626 300 626Q244 626 209 599T173 527Q173 492 198 465T261 423T343 386T425 344T488 282T513 189Q513 103 453 46T289 -12Q221 -12 166 11T77 61Z" /> +<glyph unicode="T" glyph-name="T" horiz-adv-x="595" d="M249 33V620H39Q6 620 6 653V673Q6 706 39 706H557Q589 706 589 673V653Q589 620 557 620H347V33Q347 0 314 0H281Q249 0 249 33Z" /> +<glyph unicode="U" glyph-name="U" horiz-adv-x="717" d="M81 250V673Q81 706 114 706H147Q179 706 179 673V251Q179 171 227 125T358 79T488 125T537 252V673Q537 706 570 706H603Q636 706 636 673V250Q636 132 560 60T359 -12Q234 -12 158 60T81 250Z" /> +<glyph unicode="V" glyph-name="V" horiz-adv-x="623" d="M256 27L21 668Q15 685 22 695T48 706H86Q114 706 123 679L289 207L316 110H318Q333 169 345 207L513 679Q522 706 550 706H587Q606 706 613 696T614 668L379 27Q370 0 342 0H294Q266 0 256 27Z" /> +<glyph unicode="W" glyph-name="W" horiz-adv-x="945" d="M210 29L47 670Q39 706 76 706H111Q141 706 148 677L265 188L278 113H280Q286 149 297 188L428 678Q435 706 465 706H493Q523 706 529 678L660 188L676 113H678Q683 150 692 188L815 677Q822 706 852 706H886Q923 +706 915 670L746 28Q739 0 709 0H654Q626 0 618 28L502 458L480 558H477Q467 503 455 458L339 28Q331 0 302 0H247Q218 0 210 29Z" /> +<glyph unicode="X" glyph-name="X" horiz-adv-x="587" d="M41 39L239 364L55 667Q45 684 51 695T77 706H119Q143 706 158 684L255 515L300 431H302Q323 476 346 515L445 684Q457 706 483 706H525Q545 706 551 695T547 667L361 364L560 39Q571 22 565 11T538 0H499Q473 +0 460 23L345 217L300 298H298Q278 256 255 217L141 23Q128 0 102 0H64Q44 0 37 11T41 39Z" /> +<glyph unicode="Y" glyph-name="Y" horiz-adv-x="567" d="M241 33V299L27 667Q17 684 24 695T50 706H90Q117 706 128 683L247 474L290 385H292Q313 434 335 474L453 683Q465 706 491 706H531Q550 706 557 695T554 667L340 299V33Q340 0 307 0H274Q241 0 241 33Z" /> +<glyph unicode="Z" glyph-name="Z" horiz-adv-x="588" d="M32 33V43Q32 65 46 85L372 556Q384 574 396 590T416 614L423 621V623Q404 620 370 620H83Q50 620 50 653V673Q50 706 83 706H513Q546 706 546 674V664Q546 642 533 622L206 150Q194 133 181 117T162 94L155 +86V84Q174 86 208 86H517Q550 86 550 53V33Q550 0 517 0H65Q32 0 32 33Z" /> +<glyph unicode="[" glyph-name="bracketleft" horiz-adv-x="285" d="M80 -62V703Q80 735 113 735H213Q245 735 245 703V695Q245 662 214 662H165V-21H213Q245 -21 245 -54V-62Q245 -95 213 -95H113Q80 -95 80 -62Z" /> +<glyph unicode="\" glyph-name="backslash" horiz-adv-x="395" d="M277 -15L44 707Q39 724 46 734T72 744H89Q118 744 127 717L361 -5Q366 -22 359 -32T333 -42H315Q287 -42 277 -15Z" /> +<glyph unicode="]" glyph-name="bracketright" horiz-adv-x="285" d="M40 -54Q40 -21 72 -21H120V662H72Q40 662 40 695V703Q40 735 72 735H172Q205 735 205 703V-62Q205 -95 172 -95H72Q40 -95 40 -62V-54Z" /> +<glyph unicode="^" glyph-name="asciicircum" horiz-adv-x="613" d="M118 247Q99 247 92 258T93 286L265 681Q275 706 303 706H312Q340 706 350 681L522 286Q530 269 523 258T496 247H479Q452 247 441 273L307 599L174 273Q163 247 136 247H118Z" /> +<glyph unicode="_" glyph-name="underscore" horiz-adv-x="550" d="M6 -33Q6 0 39 0H511Q544 0 544 -33V-45Q544 -78 511 -78H39Q6 -78 6 -45V-33Z" /> +<glyph unicode="`" glyph-name="grave" horiz-adv-x="499" d="M285 755Q261 755 245 775L196 842Q183 858 187 870T213 882H243Q269 882 282 859L321 791Q330 777 326 766T305 755H285Z" /> +<glyph unicode="a" glyph-name="a" horiz-adv-x="517" d="M29 138Q29 183 51 216T104 267T180 295T258 309T331 312H357V325Q357 436 247 436Q190 436 133 404Q104 390 88 416L80 430Q64 460 91 475Q167 518 255 518Q350 518 402 467T454 320V33Q454 0 421 0H396Q363 +0 363 33V63L366 94H364Q362 90 358 83T340 57T308 25T262 0T199 -12Q129 -12 79 29T29 138ZM127 146Q127 113 152 89T221 65Q281 65 319 115T358 226V248H332Q127 248 127 146Z" /> +<glyph unicode="b" glyph-name="b" horiz-adv-x="592" d="M71 33V673Q71 706 104 706H135Q167 706 167 673V468L164 425H166Q168 429 171 435T189 457T221 485T267 508T331 518Q431 518 491 445T552 254Q552 134 488 61T323 -12Q290 -12 261 -2T215 22T184 50T166 +74L161 84H159Q162 72 162 54V29Q162 0 129 0H104Q71 0 71 33ZM165 253Q165 178 202 125T307 72Q370 72 412 120T454 252Q454 334 415 383T311 433Q249 433 207 388T165 253Z" /> +<glyph unicode="c" glyph-name="c" horiz-adv-x="531" d="M37 253Q37 366 113 442T307 518Q405 518 474 464Q500 447 480 419L470 404Q454 379 425 396Q372 434 312 434Q236 434 186 383T136 254T186 124T314 72Q382 72 443 118Q471 136 488 109L496 94Q512 67 +487 50Q412 -12 307 -12Q188 -12 113 63T37 253Z" /> +<glyph unicode="d" glyph-name="d" horiz-adv-x="592" d="M39 253Q39 373 103 445T268 518Q300 518 328 509T374 487T403 462T420 440L425 431H427Q424 446 424 465V673Q424 706 457 706H488Q521 706 521 673V33Q521 0 488 0H462Q429 0 429 31V60L431 85H429Q427 +81 424 75T406 52T375 22T327 -1T262 -12Q160 -12 100 61T39 253ZM138 253Q138 171 177 122T281 72Q343 72 385 117T427 254Q427 327 390 380T283 433Q221 433 180 385T138 253Z" /> +<glyph unicode="e" glyph-name="e" horiz-adv-x="545" d="M38 253Q38 372 109 445T291 518Q394 518 451 452T509 277Q509 263 500 253T475 243H137Q141 163 191 118T312 72Q379 72 433 112Q463 128 478 101L487 86Q504 58 477 42Q400 -12 306 -12Q188 -12 113 +63T38 253ZM141 307H412Q410 372 376 407T289 442Q233 442 192 406T141 307Z" /> +<glyph unicode="f" glyph-name="f" horiz-adv-x="322" d="M92 33V422H60Q27 422 27 455V468Q27 501 60 501H92V525Q92 570 106 605T141 660T188 691T235 707T275 711H287Q320 711 320 678V659Q320 629 285 626Q267 625 254 622T224 609T198 577T189 521V501H276Q309 +501 309 468V455Q309 422 276 422H189V33Q189 0 156 0H125Q92 0 92 33Z" /> +<glyph unicode="g" glyph-name="g" horiz-adv-x="585" d="M106 -121Q119 -93 148 -104Q207 -126 258 -126Q328 -126 372 -92T417 16V60L420 92H418Q371 6 268 6Q164 6 102 79T40 266Q40 377 99 447T266 518Q301 518 330 509T376 488T404 464T420 442L424 433H426Q424 +439 424 449V478Q424 506 457 506H481Q514 506 514 473V21Q514 -95 441 -152T263 -210Q180 -210 116 -182Q86 -169 99 -138L106 -121ZM285 90Q344 90 381 131T419 263Q419 434 279 434Q212 434 176 390T139 270Q139 188 178 139T285 90Z" /> +<glyph unicode="h" glyph-name="h" horiz-adv-x="592" d="M71 33V673Q71 706 104 706H135Q167 706 167 673V444L164 402H166Q186 446 236 482T355 518Q529 518 529 324V33Q529 0 496 0H465Q432 0 432 33V302Q432 363 412 396T336 429Q263 429 215 376T167 240V33Q167 +0 135 0H104Q71 0 71 33Z" /> +<glyph unicode="i" glyph-name="i" horiz-adv-x="237" d="M102 607Q69 607 69 640V673Q69 706 102 706H136Q169 706 169 673V640Q169 607 136 607H102ZM70 33V473Q70 506 103 506H134Q167 506 167 473V33Q167 0 134 0H103Q70 0 70 33Z" /> +<glyph unicode="j" glyph-name="j" horiz-adv-x="238" d="M102 607Q69 607 69 640V673Q69 706 102 706H136Q169 706 169 673V640Q169 607 136 607H102ZM71 -11V473Q71 506 104 506H135Q167 506 167 473V-15Q167 -62 153 -98T118 -154T70 -186T23 -202T-15 -206H-27Q-60 +-206 -60 -173V-155Q-60 -126 -27 -122Q-9 -121 5 -117T36 -102T62 -68T71 -11Z" /> +<glyph unicode="k" glyph-name="k" horiz-adv-x="509" d="M71 33V673Q71 706 104 706H135Q167 706 167 673V321H240L363 485Q376 506 402 506H439Q459 506 465 494T459 466L319 283V281L481 40Q492 23 486 12T459 0H419Q393 0 380 23L242 237H167V33Q167 0 135 +0H104Q71 0 71 33Z" /> +<glyph unicode="l" glyph-name="l" horiz-adv-x="262" d="M70 138V673Q70 706 103 706H134Q167 706 167 673V150Q167 87 213 83Q239 80 239 54V30Q239 -4 205 -4Q70 -4 70 138Z" /> +<glyph unicode="m" glyph-name="m" horiz-adv-x="902" d="M70 33V473Q70 506 103 506H131Q164 506 164 473V428L161 399H163Q183 446 232 482T339 518Q464 518 491 403H493Q515 450 564 484T672 518Q758 518 798 470T839 324V33Q839 0 806 0H775Q742 0 742 33V303Q742 +364 724 397T653 430Q586 430 545 372T503 236V33Q503 0 471 0H439Q407 0 407 33V303Q407 363 390 396T319 430Q251 430 209 371T167 236V33Q167 0 134 0H103Q70 0 70 33Z" /> +<glyph unicode="n" glyph-name="n" horiz-adv-x="591" d="M70 33V473Q70 506 103 506H131Q164 506 164 473V428L161 399H163Q183 443 232 480T355 518Q528 518 528 324V33Q528 0 495 0H464Q431 0 431 33V302Q431 363 412 396T336 429Q263 429 215 375T167 242V33Q167 +0 134 0H103Q70 0 70 33Z" /> +<glyph unicode="o" glyph-name="o" horiz-adv-x="619" d="M37 140T37 254T116 443T309 518Q424 518 503 443T582 254T503 64T309 -12T116 64ZM135 332T135 254T186 124T309 72Q382 72 432 123T483 254Q483 332 433 383T309 434Q237 434 186 383Z" /> +<glyph unicode="p" glyph-name="p" horiz-adv-x="592" d="M71 -167V473Q71 506 104 506H127Q160 506 160 478V448L158 421H160Q162 425 165 431T183 454T215 484T263 507T330 518Q431 518 491 445T552 253T488 61T323 -12Q291 -12 263 -3T218 20T189 46T171 68L166 +78H164Q167 60 167 34V-167Q167 -200 135 -200H104Q71 -200 71 -167ZM165 251Q165 179 203 126T308 72Q370 72 412 120T454 252Q454 334 415 383T311 433Q249 433 207 388T165 251Z" /> +<glyph unicode="q" glyph-name="q" horiz-adv-x="592" d="M39 253Q39 373 103 445T269 518Q303 518 332 509T378 485T408 457T426 434L431 424H433Q431 436 431 452V478Q431 506 464 506H488Q521 506 521 473V-167Q521 -200 488 -200H457Q424 -200 424 -167V38L427 +82H425Q423 78 420 72T403 50T372 21T325 -2T260 -12Q161 -12 100 61T39 253ZM138 253Q138 171 177 122T281 72Q343 72 385 117T427 254Q427 327 390 380T283 433Q221 433 180 385T138 253Z" /> +<glyph unicode="r" glyph-name="r" horiz-adv-x="356" d="M70 33V473Q70 506 103 506H131Q164 506 164 473V415L161 377H163Q181 432 222 471T318 510Q350 510 350 477V449Q350 416 314 416Q244 416 206 354T167 209V33Q167 0 134 0H103Q70 0 70 33Z" /> +<glyph unicode="s" glyph-name="s" horiz-adv-x="439" d="M68 43Q43 59 61 88L71 102Q88 125 117 109Q180 68 241 68Q279 68 303 85T327 135Q327 162 300 180T235 212T158 242T93 292T66 372Q66 441 118 479T249 518T389 479Q417 465 400 435L391 420Q377 395 +347 409Q296 438 244 438Q206 438 183 422T159 374Q159 347 186 328T251 296T328 267T393 218T420 137Q420 72 370 30T238 -12Q141 -12 68 43Z" /> +<glyph unicode="t" glyph-name="t" horiz-adv-x="342" d="M94 182V422H59Q27 422 27 455V468Q27 501 60 501H96V612Q96 645 129 645H158Q191 645 191 612V501H279Q312 501 312 468V455Q312 422 280 422H191V197Q191 91 287 83Q307 81 314 74T322 50V29Q322 -4 +282 -4Q201 -4 148 43T94 182Z" /> +<glyph unicode="u" glyph-name="u" horiz-adv-x="587" d="M64 182V473Q64 506 97 506H128Q160 506 160 473V204Q160 144 180 111T255 78Q330 78 375 134T420 269V473Q420 506 453 506H484Q517 506 517 473V33Q517 0 484 0H456Q423 0 423 33V78L426 107H424Q404 +62 354 25T236 -12Q150 -12 107 35T64 182Z" /> +<glyph unicode="v" glyph-name="v" horiz-adv-x="499" d="M191 26L25 468Q19 485 26 495T51 506H85Q113 506 122 479L236 164L254 95H256Q265 136 274 164L388 479Q397 506 425 506H459Q477 506 484 496T485 468L321 26Q312 0 284 0H228Q200 0 191 26Z" /> +<glyph unicode="w" glyph-name="w" horiz-adv-x="803" d="M171 28L28 469Q23 486 30 496T56 506H89Q119 506 126 478L225 151L237 97H239Q245 125 253 151L355 477Q361 505 391 505H422Q452 505 459 477L561 151L574 97H576Q581 125 589 151L688 478Q694 506 724 +506H757Q775 506 782 496T785 469L642 28Q635 0 605 0H556Q526 0 519 28L422 325L408 380H406Q400 351 391 325L295 28Q288 0 258 0H208Q178 0 171 28Z" /> +<glyph unicode="x" glyph-name="x" horiz-adv-x="483" d="M41 40L188 260L50 466Q39 483 45 494T72 506H110Q136 506 148 483L230 352L246 322H248Q258 339 265 352L346 483Q359 506 385 506H422Q442 506 448 495T444 466L307 260L454 40Q465 23 459 12T432 0H396Q370 +0 357 23L264 169L248 197H246Q239 181 231 169L138 23Q125 0 99 0H63Q43 0 37 11T41 40Z" /> +<glyph unicode="y" glyph-name="y" horiz-adv-x="502" d="M35 -134Q46 -110 72 -117Q100 -128 112 -128Q141 -128 163 -107T199 -52L224 6L28 468Q21 485 28 495T53 506H92Q120 506 129 480L248 175L266 114H268Q276 148 285 174L400 479Q409 506 437 506H473Q491 +506 498 496T499 468L276 -89Q254 -147 210 -178T112 -210Q81 -210 42 -194Q13 -182 27 -151L35 -134Z" /> +<glyph unicode="z" glyph-name="z" horiz-adv-x="500" d="M31 28V36Q31 56 45 74L286 376L328 423V425Q312 423 279 423H75Q42 423 42 456V473Q42 506 75 506H426Q459 506 459 478V470Q459 450 445 432L204 129L161 83V81Q177 83 210 83H434Q467 83 467 51V33Q467 +0 434 0H64Q31 0 31 28Z" /> +<glyph unicode="{" glyph-name="braceleft" horiz-adv-x="325" d="M112 77V173Q112 249 54 274Q27 288 27 311V340Q27 362 54 376Q112 404 112 479V562Q112 615 128 653T170 707T215 730T254 737H265Q298 737 298 704V692Q298 659 265 659Q197 659 197 554V454Q197 +426 189 403T168 367T145 344T124 330L116 327V325Q119 324 124 322T144 310T168 287T188 251T197 198V85Q197 51 204 29T224 -3T245 -16T265 -20Q298 -20 298 -53V-65Q298 -98 265 -98H254Q236 -98 216 -92T170 -69T129 -14T112 77Z" /> +<glyph unicode="|" glyph-name="bar" horiz-adv-x="243" d="M79 -126V759Q79 792 112 792H131Q164 792 164 759V-126Q164 -159 131 -159H112Q79 -159 79 -126Z" /> +<glyph unicode="}" glyph-name="braceright" horiz-adv-x="326" d="M27 -53Q27 -20 60 -20Q70 -20 79 -17T101 -4T120 28T128 85V198Q128 227 136 250T156 287T180 310T200 322L209 325V327Q206 328 201 330T181 343T157 366T137 402T128 454V554Q128 659 60 659Q27 +659 27 692V704Q27 737 60 737H71Q85 737 100 734T137 719T174 690T201 638T213 562V479Q213 404 271 376Q298 362 298 340V311Q298 288 271 274Q213 249 213 173V77Q213 34 202 1T174 -50T137 -80T101 -94T71 -98H60Q27 -98 27 -65V-53Z" /> +<glyph unicode="~" glyph-name="asciitilde" horiz-adv-x="589" d="M96 204Q59 204 65 247Q82 373 202 373Q237 373 265 358T309 324T346 291T394 275Q442 275 456 338Q467 369 491 369H506Q522 369 530 360T537 334Q524 200 400 200Q365 200 337 215T293 248T256 +282T208 297Q159 297 146 234Q135 204 111 204H96Z" /> +<glyph unicode=" " glyph-name="uni00A0" horiz-adv-x="250" /> +<glyph unicode="¡" glyph-name="exclamdown" horiz-adv-x="253" d="M138 312Q171 312 171 279L176 -167Q176 -200 144 -200H110Q77 -200 77 -167L82 279Q84 312 116 312H138ZM176 473V441Q176 408 143 408H109Q76 408 76 441V473Q76 506 109 506H143Q176 +506 176 473Z" /> +<glyph unicode="¢" glyph-name="cent" horiz-adv-x="559" d="M258 20V73Q162 86 105 164T48 353Q48 464 105 542T258 634V685Q258 718 290 718H298Q329 718 329 690V634Q385 627 431 593T503 510Q518 481 486 467L458 456Q432 447 415 472Q371 544 298 544Q226 +544 187 491T147 352Q147 267 186 215T298 163T415 235Q433 260 458 251L486 240Q518 226 503 197Q478 149 432 114T329 73V20Q329 -13 298 -13H290Q258 -13 258 20Z" /> +<glyph unicode="£" glyph-name="sterling" horiz-adv-x="578" d="M53 33V53Q53 86 86 86H116V319H95Q65 319 65 351V357Q65 389 95 389H116V525Q116 608 177 663T333 718Q407 718 474 675Q501 655 478 629L463 609Q445 587 417 604Q376 628 334 628Q280 628 +248 598T216 521V389H367Q400 389 400 357V351Q400 319 367 319H216V86H508Q541 86 541 53V33Q541 0 508 0H86Q53 0 53 33Z" /> +<glyph unicode="¥" glyph-name="yen" horiz-adv-x="590" d="M121 199Q88 199 88 228V234Q88 262 121 262H251V299L224 347H121Q88 347 88 376V382Q88 410 117 410H191L46 667Q37 684 43 695T70 706H111Q139 706 149 681L257 486L300 384H302Q323 439 345 +486L453 681Q463 706 491 706H532Q552 706 558 695T556 667L411 410H480Q513 410 513 382V376Q513 347 480 347H377L351 299V262H480Q513 262 513 234V228Q513 199 480 199H351V33Q351 0 318 0H284Q251 0 251 33V199H121Z" /> +<glyph unicode="§" glyph-name="section" horiz-adv-x="439" d="M151 140L86 501Q81 526 81 547Q81 622 132 670T270 718Q333 718 384 686Q411 669 392 640L383 628Q366 607 338 620Q302 637 270 637Q223 637 193 611T163 536Q163 518 169 496L228 147Q232 +130 224 121T199 111H187Q157 111 151 140ZM84 16L92 29Q108 53 137 38Q169 19 207 19Q253 19 283 46T313 124Q313 144 307 169L249 509Q245 526 253 535T278 545H290Q320 545 326 516L390 155Q395 128 395 110Q395 34 344 -14T206 -62Q145 -62 92 -29Q64 -12 84 +16Z" /> +<glyph unicode="¨" glyph-name="dieresis" horiz-adv-x="499" d="M326 781Q293 781 293 814V849Q293 882 326 882H340Q373 882 373 849V814Q373 781 340 781H326ZM159 781Q126 781 126 814V849Q126 882 159 882H173Q206 882 206 849V814Q206 781 173 781H159Z" /> +<glyph unicode="©" glyph-name="copyright" horiz-adv-x="816" d="M51 201T51 353T154 611T406 718Q555 718 660 612T765 353T660 95T406 -12Q258 -12 155 94ZM124 478T124 353T205 142T406 56Q527 56 609 142T692 353T610 564T406 650Q287 650 206 564ZM217 +352Q217 434 271 493T415 552Q464 552 501 530T559 482Q575 460 556 445L543 434Q524 417 503 441Q466 483 417 483Q359 483 326 445T292 351Q292 296 325 259T417 221Q471 221 507 265Q525 286 543 269L555 260Q575 243 559 221Q501 152 415 152Q325 152 271 210T217 +352Z" /> +<glyph unicode="ª" glyph-name="ordfeminine" horiz-adv-x="400" d="M172 382Q128 382 95 408T62 480Q62 589 251 589H261V595Q261 658 198 658Q168 658 138 643Q112 632 101 652L98 658Q84 682 114 695Q156 716 206 716Q268 716 300 684T333 590V422Q333 +389 303 389H299Q268 389 268 420V441H266Q263 434 257 425T226 399T172 382ZM186 441Q219 441 240 468T261 530V538H249Q135 538 135 484Q135 466 148 454T186 441ZM95 265Q62 265 62 292V296Q62 322 95 322H304Q337 322 337 296V292Q337 265 304 265H95Z" /> +<glyph unicode="«" glyph-name="guillemotleft" horiz-adv-x="523" d="M271 259Q253 282 271 305L401 469Q417 488 441 488H462Q483 488 488 476T481 448L350 282L481 117Q495 100 490 89T465 77H441Q417 77 401 96L271 259ZM199 96L70 259Q50 282 70 305L199 +469Q215 488 240 488H260Q281 488 286 476T279 448L148 282L279 117Q292 100 288 89T264 77H240Q215 77 199 96Z" /> +<glyph unicode="¬" glyph-name="logicalnot" horiz-adv-x="617" d="M99 340Q66 340 66 373V385Q66 418 99 418H510Q543 418 543 385V184Q543 151 510 151H495Q462 151 462 184V340H99Z" /> +<glyph unicode="­" glyph-name="uni00AD" horiz-adv-x="420" d="M97 242Q64 242 64 275V295Q64 328 97 328H323Q356 328 356 295V275Q356 242 323 242H97Z" /> +<glyph unicode="®" glyph-name="registered" horiz-adv-x="816" d="M51 201T51 353T155 611T406 718Q556 718 660 612T765 353T661 95T406 -12Q259 -12 155 94ZM124 478T124 353T205 142T406 56Q527 56 609 142T692 353T610 564T406 650Q287 650 206 564ZM284 +198V510Q284 543 317 543H430Q483 543 515 512T548 428Q548 388 527 362T479 328V326Q483 322 492 305L544 204Q553 187 548 177T526 166H514Q486 166 475 190L417 312H355V198Q355 166 324 166H315Q284 166 284 198ZM355 364H415Q444 364 460 381T476 428Q476 +457 460 473T416 489H355V364Z" /> +<glyph unicode="¯" glyph-name="overscore" horiz-adv-x="499" d="M155 784Q122 784 122 816V823Q122 855 155 855H344Q377 855 377 823V816Q377 784 344 784H155Z" /> +<glyph unicode="°" glyph-name="degree" horiz-adv-x="382" d="M191 422Q127 422 83 465T39 570Q39 631 83 674T191 718Q253 718 298 675T343 570T298 466T191 422ZM160 496T191 496T243 517T265 570T244 623T191 645T139 623T117 570T138 518Z" /> +<glyph unicode="±" glyph-name="plusminus" horiz-adv-x="613" d="M75 246Q42 246 42 279V291Q42 324 75 324H266V537Q266 570 299 570H315Q348 570 348 537V324H538Q571 324 571 291V279Q571 246 538 246H348V33Q348 0 315 0H299Q266 0 266 33V246H75ZM91 +-95H522Q555 -95 555 -128V-140Q555 -173 522 -173H91Q58 -173 58 -140V-128Q58 -95 91 -95Z" /> +<glyph unicode="²" glyph-name="twosuperior" horiz-adv-x="357" d="M62 423Q29 423 29 459Q29 506 51 542T104 601T166 643T219 686T241 736Q241 764 221 782T169 801T107 775Q81 756 62 774L58 777Q33 800 56 822Q109 870 173 870Q235 870 276 834T317 +739Q317 699 297 667T246 615T186 576T135 537T111 489H291Q324 489 324 458V454Q324 423 291 423H62Z" /> +<glyph unicode="³" glyph-name="threesuperior" horiz-adv-x="357" d="M184 413Q109 413 59 458Q35 475 54 501L58 506Q74 527 102 512Q137 482 181 482Q214 482 238 504T263 558T238 609T178 629H165Q140 629 133 648T142 688L213 770L238 794V796Q219 793 +202 793H93Q60 793 60 825V829Q60 860 93 860H299Q332 860 332 836V831Q332 813 316 794L223 686Q272 678 305 646T339 558Q339 499 295 456T184 413Z" /> +<glyph unicode="´" glyph-name="acute" horiz-adv-x="499" d="M207 755Q190 755 184 766T187 792L227 859Q240 882 266 882H295Q316 882 321 870T313 842L264 775Q248 755 224 755H207Z" /> +<glyph unicode="µ" glyph-name="mu" horiz-adv-x="630" d="M85 -167V473Q85 506 118 506H149Q181 506 181 473V204Q181 144 200 111T275 78Q351 78 396 134T441 269V473Q441 506 474 506H505Q538 506 538 473V33Q538 0 505 0H477Q444 0 444 33V75L446 104H444Q437 +90 426 75T392 38T334 2T256 -12Q227 -12 205 -4T174 12L166 19H164Q171 -30 171 -59V-167Q171 -200 138 -200H118Q85 -200 85 -167Z" /> +<glyph unicode="¶" glyph-name="paragraph" horiz-adv-x="591" d="M273 -17V241Q176 241 106 308T36 474Q36 571 105 638T273 706H511Q544 706 544 673V653Q544 620 511 620H348V-17Q348 -50 315 -50H306Q273 -50 273 -17ZM410 -17V530Q410 563 443 563H452Q485 +563 485 530V-17Q485 -50 452 -50H443Q410 -50 410 -17Z" /> +<glyph unicode="·" glyph-name="middot" horiz-adv-x="231" d="M97 237Q65 237 65 270V310Q65 343 97 343H133Q166 343 166 310V270Q166 237 133 237H97Z" /> +<glyph unicode="¸" glyph-name="cedilla" horiz-adv-x="499" d="M198 -59L217 19H270L256 -50Q288 -54 308 -73T328 -123Q328 -166 299 -186T226 -207Q174 -207 174 -178Q174 -148 192 -148Q196 -148 204 -149T218 -151Q261 -151 261 -119Q261 -92 214 -87Q190 +-85 198 -59Z" /> +<glyph unicode="¹" glyph-name="onesuperior" horiz-adv-x="303" d="M68 423Q35 423 35 454V458Q35 489 64 489H128V738L130 764H128Q125 757 111 744L90 723Q73 710 58 725L50 734Q30 756 53 779L118 843Q135 860 159 860H170Q203 860 203 827V489H262Q295 +489 295 458V454Q295 423 262 423H68Z" /> +<glyph unicode="º" glyph-name="ordmasculine" d="M298 384T226 384T105 431T55 552Q55 623 105 670T226 717Q298 717 347 670T397 552Q397 479 348 432ZM185 449T226 449T295 478T324 552Q324 596 296 624T226 653T157 625T128 552Q128 507 156 478ZM104 +265Q71 265 71 292V296Q71 322 104 322H350Q383 322 383 296V292Q383 265 350 265H104Z" /> +<glyph unicode="»" glyph-name="guillemotright" horiz-adv-x="523" d="M268 117L399 282L268 448Q254 464 259 476T284 488H308Q332 488 348 469L478 305Q496 282 478 259L348 96Q332 77 308 77H287Q266 77 261 88T268 117ZM85 77Q64 77 59 88T66 117L197 +282L66 448Q53 464 57 476T82 488H106Q130 488 146 469L276 305Q296 282 276 259L146 96Q130 77 106 77H85Z" /> +<glyph unicode="¼" glyph-name="onequarter" horiz-adv-x="941" d="M806 0Q773 0 773 33V107H599Q566 107 566 132V141Q566 159 578 175L752 416Q766 437 792 437H814Q847 437 847 404V173H882Q911 173 911 142V138Q911 107 882 107H847V33Q847 0 814 0H806ZM647 +173H773V296L777 354H775Q761 327 745 306L647 175V173ZM344 25Q332 0 305 0H293Q277 0 272 11T275 39L581 682Q592 706 620 706H631Q648 706 652 696T649 667L344 25ZM87 270Q54 270 54 301V305Q54 336 83 336H147V585L149 611H147Q144 604 130 591L109 570Q92 +557 77 572L69 581Q49 603 72 626L137 690Q154 707 178 707H189Q222 707 222 674V336H281Q314 336 314 305V301Q314 270 281 270H87Z" /> +<glyph unicode="½" glyph-name="onehalf" horiz-adv-x="926" d="M626 0Q593 0 593 36Q593 83 615 119T668 178T730 220T783 263T805 313Q805 341 785 359T733 378T671 352Q645 333 626 351L622 354Q597 377 620 399Q673 447 737 447Q799 447 840 411T881 +316Q881 276 861 244T810 192T750 153T699 114T675 66H855Q888 66 888 35V31Q888 0 855 0H626ZM343 25Q331 0 304 0H292Q276 0 271 11T274 39L580 682Q591 706 619 706H630Q647 706 651 696T648 667L343 25ZM85 270Q52 270 52 301V305Q52 336 81 336H145V585L147 +611H145Q142 604 128 591L107 570Q90 557 75 572L67 581Q47 603 70 626L135 690Q152 707 176 707H187Q220 707 220 674V336H279Q312 336 312 305V301Q312 270 279 270H85Z" /> +<glyph unicode="¾" glyph-name="threequarters" horiz-adv-x="956" d="M836 0Q803 0 803 33V107H629Q596 107 596 132V141Q596 159 608 175L782 416Q796 437 822 437H844Q877 437 877 404V173H912Q941 173 941 142V138Q941 107 912 107H877V33Q877 0 844 +0H836ZM677 173H803V296L807 354H805Q791 327 775 306L677 175V173ZM200 260Q125 260 75 305Q51 322 70 348L74 353Q90 374 118 359Q153 329 197 329Q230 329 254 351T279 405T254 456T194 476H181Q156 476 149 495T158 535L229 617L254 641V643Q235 640 218 640H109Q76 +640 76 672V676Q76 707 109 707H315Q348 707 348 683V678Q348 660 332 641L239 533Q288 525 321 493T355 405Q355 346 311 303T200 260ZM373 25Q361 0 334 0H322Q306 0 301 11T304 39L610 682Q621 706 649 706H660Q677 706 681 696T678 667L373 25Z" /> +<glyph unicode="¿" glyph-name="questiondown" horiz-adv-x="460" d="M297 312Q330 312 330 279V259Q330 220 313 188T270 132T220 87T178 36T160 -24Q160 -66 192 -94T275 -123Q319 -123 362 -98Q393 -82 409 -107L422 -125Q441 -153 416 -170Q348 -214 +268 -214Q180 -214 120 -163T59 -31Q59 13 76 49T119 110T169 156T214 206T235 266L236 287Q240 312 268 312H297ZM333 473V441Q333 408 300 408H265Q232 408 232 441V473Q232 506 265 506H300Q333 506 333 473Z" /> +<glyph unicode="À" glyph-name="Agrave" horiz-adv-x="621" d="M302 755Q278 755 262 775L213 842Q200 858 204 870T230 882H260Q286 882 299 859L338 791Q347 777 343 766T322 755H302ZM24 38L256 679Q265 706 293 706H341Q369 706 378 679L610 38Q616 21 +609 11T583 0H549Q521 0 512 27L449 203H183L121 27Q114 0 85 0H51Q32 0 25 10T24 38ZM209 285H423L345 509L318 609H316Q300 545 288 509L209 285Z" /> +<glyph unicode="Á" glyph-name="Aacute" horiz-adv-x="621" d="M313 755Q296 755 290 766T293 792L333 859Q346 882 372 882H401Q422 882 427 870T419 842L370 775Q354 755 330 755H313ZM24 38L256 679Q265 706 293 706H341Q369 706 378 679L610 38Q616 21 +609 11T583 0H549Q521 0 512 27L449 203H183L121 27Q114 0 85 0H51Q32 0 25 10T24 38ZM209 285H423L345 509L318 609H316Q300 545 288 509L209 285Z" /> +<glyph unicode="Â" glyph-name="Acircumflex" horiz-adv-x="621" d="M221 755Q203 755 199 766T205 795L251 860Q266 882 292 882H341Q367 882 381 860L428 795Q439 778 435 767T413 755H391Q370 755 356 777L317 835H315L276 777Q264 755 241 755H221ZM24 +38L256 679Q265 706 293 706H341Q369 706 378 679L610 38Q616 21 609 11T583 0H549Q521 0 512 27L449 203H183L121 27Q114 0 85 0H51Q32 0 25 10T24 38ZM209 285H423L345 509L318 609H316Q300 545 288 509L209 285Z" /> +<glyph unicode="Ã" glyph-name="Atilde" horiz-adv-x="621" d="M180 756Q151 756 151 788Q151 829 177 856T245 883Q276 883 300 866T342 832T378 815Q395 815 404 828T415 860Q417 880 445 880H453Q482 880 482 852Q482 807 457 780T388 753Q357 753 333 +770T291 804T255 821Q219 821 217 776Q214 756 188 756H180ZM24 38L256 679Q265 706 293 706H341Q369 706 378 679L610 38Q616 21 609 11T583 0H549Q521 0 512 27L449 203H183L121 27Q114 0 85 0H51Q32 0 25 10T24 38ZM209 285H423L345 509L318 609H316Q300 545 +288 509L209 285Z" /> +<glyph unicode="Ä" glyph-name="Adieresis" horiz-adv-x="621" d="M24 38L256 679Q265 706 293 706H341Q369 706 378 679L610 38Q616 21 609 11T583 0H549Q521 0 512 27L449 203H183L121 27Q114 0 85 0H51Q32 0 25 10T24 38ZM209 285H423L345 509L318 609H316Q300 +545 288 509L209 285ZM393 781Q360 781 360 814V849Q360 882 393 882H407Q440 882 440 849V814Q440 781 407 781H393ZM226 781Q193 781 193 814V849Q193 882 226 882H240Q273 882 273 849V814Q273 781 240 781H226Z" /> +<glyph unicode="Å" glyph-name="Aring" horiz-adv-x="621" d="M24 38L256 679Q265 706 293 706H341Q369 706 378 679L610 38Q616 21 609 11T583 0H549Q521 0 512 27L449 203H183L121 27Q114 0 85 0H51Q32 0 25 10T24 38ZM209 285H423L345 509L318 609H316Q300 +545 288 509L209 285ZM352 743T317 743T257 763T232 817Q232 851 257 871T317 892T377 872T402 817Q402 784 377 764ZM317 784Q331 784 340 793T350 817Q350 833 341 842T317 852Q302 852 293 843T284 817Q284 803 293 794T317 784Z" /> +<glyph unicode="Æ" glyph-name="AE" horiz-adv-x="859" d="M20 38L285 681Q295 706 323 706H779Q812 706 812 673V653Q812 620 779 620H500V399H721Q754 399 754 366V346Q754 313 721 313H500V86H796Q829 86 829 53V33Q829 0 796 0H435Q402 0 402 33V314H232L117 +26Q107 0 79 0H45Q27 0 20 11T20 38ZM265 396H402V620H355L265 396Z" /> +<glyph unicode="Ç" glyph-name="Ccedilla" horiz-adv-x="709" d="M356 -59L368 -10Q223 3 135 106T47 357Q47 512 148 615T406 718Q542 718 640 645Q663 627 646 599L633 579Q616 553 587 571Q503 627 410 627Q290 627 220 550T149 358Q149 241 221 160T411 +79Q514 79 603 148Q630 169 649 144L664 124Q683 99 659 78Q556 -8 422 -12L414 -50Q446 -54 466 -73T486 -123Q486 -166 457 -186T384 -207Q332 -207 332 -178Q332 -148 350 -148Q354 -148 362 -149T376 -151Q419 -151 419 -119Q419 -92 372 -87Q348 -85 356 -59Z" +/> +<glyph unicode="È" glyph-name="Egrave" horiz-adv-x="555" d="M90 33V673Q90 706 123 706H467Q500 706 500 673V653Q500 620 467 620H188V399H409Q442 399 442 366V346Q442 313 409 313H188V86H484Q517 86 517 53V33Q517 0 484 0H123Q90 0 90 33ZM291 755Q267 +755 251 775L202 842Q189 858 193 870T219 882H249Q275 882 288 859L327 791Q336 777 332 766T311 755H291Z" /> +<glyph unicode="É" glyph-name="Eacute" horiz-adv-x="555" d="M302 755Q285 755 279 766T282 792L322 859Q335 882 361 882H390Q411 882 416 870T408 842L359 775Q343 755 319 755H302ZM90 33V673Q90 706 123 706H467Q500 706 500 673V653Q500 620 467 620H188V399H409Q442 +399 442 366V346Q442 313 409 313H188V86H484Q517 86 517 53V33Q517 0 484 0H123Q90 0 90 33Z" /> +<glyph unicode="Ê" glyph-name="Ecircumflex" horiz-adv-x="555" d="M210 755Q192 755 188 766T194 795L240 860Q255 882 281 882H330Q356 882 370 860L417 795Q428 778 424 767T402 755H380Q359 755 345 777L306 835H304L265 777Q253 755 230 755H210ZM90 +33V673Q90 706 123 706H467Q500 706 500 673V653Q500 620 467 620H188V399H409Q442 399 442 366V346Q442 313 409 313H188V86H484Q517 86 517 53V33Q517 0 484 0H123Q90 0 90 33Z" /> +<glyph unicode="Ë" glyph-name="Edieresis" horiz-adv-x="555" d="M382 781Q349 781 349 814V849Q349 882 382 882H396Q429 882 429 849V814Q429 781 396 781H382ZM215 781Q182 781 182 814V849Q182 882 215 882H229Q262 882 262 849V814Q262 781 229 781H215ZM90 +33V673Q90 706 123 706H467Q500 706 500 673V653Q500 620 467 620H188V399H409Q442 399 442 366V346Q442 313 409 313H188V86H484Q517 86 517 53V33Q517 0 484 0H123Q90 0 90 33Z" /> +<glyph unicode="Ì" glyph-name="Igrave" horiz-adv-x="278" d="M94 33V673Q94 706 127 706H159Q192 706 192 673V33Q192 0 159 0H127Q94 0 94 33ZM130 755Q106 755 90 775L41 842Q28 858 32 870T58 882H88Q114 882 127 859L166 791Q175 777 171 766T150 755H130Z" /> +<glyph unicode="Í" glyph-name="Iacute" horiz-adv-x="278" d="M90 33V673Q90 706 123 706H155Q188 706 188 673V33Q188 0 155 0H123Q90 0 90 33ZM137 755Q120 755 114 766T117 792L157 859Q170 882 196 882H225Q246 882 251 870T243 842L194 775Q178 755 +154 755H137Z" /> +<glyph unicode="Î" glyph-name="Icircumflex" horiz-adv-x="278" d="M94 33V673Q94 706 127 706H159Q192 706 192 673V33Q192 0 159 0H127Q94 0 94 33ZM49 755Q31 755 27 766T33 795L79 860Q94 882 120 882H169Q195 882 209 860L256 795Q267 778 263 767T241 +755H219Q198 755 184 777L145 835H143L104 777Q92 755 69 755H49Z" /> +<glyph unicode="Ï" glyph-name="Idieresis" horiz-adv-x="278" d="M90 33V673Q90 706 123 706H155Q188 706 188 673V33Q188 0 155 0H123Q90 0 90 33ZM217 781Q184 781 184 814V849Q184 882 217 882H231Q264 882 264 849V814Q264 781 231 781H217ZM50 781Q17 +781 17 814V849Q17 882 50 882H64Q97 882 97 849V814Q97 781 64 781H50Z" /> +<glyph unicode="Ð" glyph-name="Eth" horiz-adv-x="730" d="M91 33V312H65Q32 312 32 345V361Q32 394 54 394H91V673Q91 706 124 706H325Q488 706 585 613T682 354Q682 188 585 94T325 0H124Q91 0 91 33ZM189 86H318Q439 86 509 156T580 354Q580 481 510 +550T318 620H189V394H306Q339 394 339 361V345Q339 312 307 312H189V86Z" /> +<glyph unicode="Ñ" glyph-name="Ntilde" horiz-adv-x="744" d="M90 33V673Q90 706 123 706H161Q187 706 201 684L502 247Q513 230 527 205T551 162L560 145H562Q556 208 556 247V673Q556 706 589 706H621Q654 706 654 673V33Q654 0 621 0H583Q556 0 544 22L242 +458L184 561H182Q188 498 188 458V33Q188 0 155 0H123Q90 0 90 33ZM236 756Q207 756 207 788Q207 829 233 856T301 883Q332 883 356 866T398 832T434 815Q451 815 460 828T471 860Q473 880 501 880H509Q538 880 538 852Q538 807 513 780T444 753Q413 753 389 770T347 +804T311 821Q275 821 273 776Q270 756 244 756H236Z" /> +<glyph unicode="Ò" glyph-name="Ograve" horiz-adv-x="815" d="M393 755Q369 755 353 775L304 842Q291 858 295 870T321 882H351Q377 882 390 859L429 791Q438 777 434 766T413 755H393ZM45 358Q45 511 148 614T408 718Q564 718 667 615T770 358Q770 201 +667 95T408 -12T149 94T45 358ZM147 358Q147 239 221 159T408 79T594 159T668 358Q668 473 594 550T408 627T222 550T147 358Z" /> +<glyph unicode="Ó" glyph-name="Oacute" horiz-adv-x="815" d="M404 755Q387 755 381 766T384 792L424 859Q437 882 463 882H492Q513 882 518 870T510 842L461 775Q445 755 421 755H404ZM45 358Q45 511 148 614T408 718Q564 718 667 615T770 358Q770 201 +667 95T408 -12T149 94T45 358ZM147 358Q147 239 221 159T408 79T594 159T668 358Q668 473 594 550T408 627T222 550T147 358Z" /> +<glyph unicode="Ô" glyph-name="Ocircumflex" horiz-adv-x="815" d="M312 755Q294 755 290 766T296 795L342 860Q357 882 383 882H432Q458 882 472 860L519 795Q530 778 526 767T504 755H482Q461 755 447 777L408 835H406L367 777Q355 755 332 755H312ZM45 +358Q45 511 148 614T408 718Q564 718 667 615T770 358Q770 201 667 95T408 -12T149 94T45 358ZM147 358Q147 239 221 159T408 79T594 159T668 358Q668 473 594 550T408 627T222 550T147 358Z" /> +<glyph unicode="Õ" glyph-name="Otilde" horiz-adv-x="815" d="M271 756Q242 756 242 788Q242 829 268 856T336 883Q367 883 391 866T433 832T469 815Q486 815 495 828T506 860Q508 880 536 880H544Q573 880 573 852Q573 807 548 780T479 753Q448 753 424 +770T382 804T346 821Q310 821 308 776Q305 756 279 756H271ZM45 358Q45 511 148 614T408 718Q564 718 667 615T770 358Q770 201 667 95T408 -12T149 94T45 358ZM147 358Q147 239 221 159T408 79T594 159T668 358Q668 473 594 550T408 627T222 550T147 358Z" /> +<glyph unicode="Ö" glyph-name="Odieresis" horiz-adv-x="815" d="M484 781Q451 781 451 814V849Q451 882 484 882H498Q531 882 531 849V814Q531 781 498 781H484ZM317 781Q284 781 284 814V849Q284 882 317 882H331Q364 882 364 849V814Q364 781 331 781H317ZM45 +358Q45 511 148 614T408 718Q564 718 667 615T770 358Q770 201 667 95T408 -12T149 94T45 358ZM147 358Q147 239 221 159T408 79T594 159T668 358Q668 473 594 550T408 627T222 550T147 358Z" /> +<glyph unicode="×" glyph-name="multiply" horiz-adv-x="613" d="M91 33Q68 54 90 79L274 285L90 491Q68 516 91 537L100 546Q124 570 146 545L328 343L510 545Q532 570 557 546L565 537Q588 516 566 491L381 285L566 79Q588 54 565 33L557 24Q532 0 510 +25L328 227L146 25Q124 0 100 24L91 33Z" /> +<glyph unicode="Ø" glyph-name="Oslash" horiz-adv-x="814" d="M135 31L168 77Q110 129 78 201T45 357Q45 510 150 614T408 718Q509 718 593 668L619 706Q639 732 664 715Q687 697 674 678L643 635Q703 584 736 513T770 357Q770 202 666 95T408 -12Q302 -12 +217 42L188 1Q168 -25 144 -8Q119 9 135 31ZM226 158L537 591Q479 627 408 627Q299 627 223 550T147 357Q147 239 226 158ZM272 119Q332 79 407 79Q516 79 592 159T668 357Q668 479 585 555L272 119Z" /> +<glyph unicode="Ù" glyph-name="Ugrave" horiz-adv-x="717" d="M81 250V673Q81 706 114 706H147Q179 706 179 673V251Q179 171 227 125T358 79T488 125T537 252V673Q537 706 570 706H603Q636 706 636 673V250Q636 132 560 60T359 -12Q234 -12 158 60T81 250ZM344 +755Q320 755 304 775L255 842Q242 858 246 870T272 882H302Q328 882 341 859L380 791Q389 777 385 766T364 755H344Z" /> +<glyph unicode="Ú" glyph-name="Uacute" horiz-adv-x="717" d="M354 755Q337 755 331 766T334 792L374 859Q387 882 413 882H442Q463 882 468 870T460 842L411 775Q395 755 371 755H354ZM81 250V673Q81 706 114 706H147Q179 706 179 673V251Q179 171 227 +125T358 79T488 125T537 252V673Q537 706 570 706H603Q636 706 636 673V250Q636 132 560 60T359 -12Q234 -12 158 60T81 250Z" /> +<glyph unicode="Û" glyph-name="Ucircumflex" horiz-adv-x="717" d="M262 755Q244 755 240 766T246 795L292 860Q307 882 333 882H382Q408 882 422 860L469 795Q480 778 476 767T454 755H432Q411 755 397 777L358 835H356L317 777Q305 755 282 755H262ZM81 +250V673Q81 706 114 706H147Q179 706 179 673V251Q179 171 227 125T358 79T488 125T537 252V673Q537 706 570 706H603Q636 706 636 673V250Q636 132 560 60T359 -12Q234 -12 158 60T81 250Z" /> +<glyph unicode="Ü" glyph-name="Udieresis" horiz-adv-x="717" d="M435 781Q402 781 402 814V849Q402 882 435 882H449Q482 882 482 849V814Q482 781 449 781H435ZM268 781Q235 781 235 814V849Q235 882 268 882H282Q315 882 315 849V814Q315 781 282 781H268ZM81 +250V673Q81 706 114 706H147Q179 706 179 673V251Q179 171 227 125T358 79T488 125T537 252V673Q537 706 570 706H603Q636 706 636 673V250Q636 132 560 60T359 -12Q234 -12 158 60T81 250Z" /> +<glyph unicode="Ý" glyph-name="Yacute" horiz-adv-x="567" d="M241 33V299L27 667Q17 684 24 695T50 706H90Q117 706 128 683L247 474L290 385H292Q313 434 335 474L453 683Q465 706 491 706H531Q550 706 557 695T554 667L340 299V33Q340 0 307 0H274Q241 +0 241 33ZM287 755Q270 755 264 766T267 792L307 859Q320 882 346 882H375Q396 882 401 870T393 842L344 775Q328 755 304 755H287Z" /> +<glyph unicode="Þ" glyph-name="Thorn" horiz-adv-x="598" d="M90 33V673Q90 706 123 706H155Q188 706 188 674V586H348Q446 586 507 526T569 365T507 203T347 141H188V33Q188 0 155 0H123Q90 0 90 33ZM188 227H332Q396 227 432 264T469 365Q469 428 433 +464T333 500H188V227Z" /> +<glyph unicode="ß" glyph-name="germandbls" horiz-adv-x="582" d="M71 33V530Q71 618 135 668T287 718Q369 718 423 672T477 557Q477 524 462 496T427 450T393 412T377 371Q377 354 395 336T440 300T492 262T536 211T555 145Q555 72 506 33T385 -7Q322 -7 +269 13Q243 20 243 50V69Q243 105 274 97Q321 77 373 77Q409 77 433 95T457 149Q457 176 429 202T368 248T306 300T278 368Q278 396 294 422T328 465T363 507T379 556Q379 588 354 611T283 634Q236 634 202 605T167 523V33Q167 0 135 0H104Q71 0 71 33Z" /> +<glyph unicode="à" glyph-name="agrave" horiz-adv-x="517" d="M29 138Q29 183 51 216T104 267T180 295T258 309T331 312H357V325Q357 436 247 436Q190 436 133 404Q104 390 88 416L80 430Q64 460 91 475Q167 518 255 518Q350 518 402 467T454 320V33Q454 +0 421 0H396Q363 0 363 33V63L366 94H364Q362 90 358 83T340 57T308 25T262 0T199 -12Q129 -12 79 29T29 138ZM127 146Q127 113 152 89T221 65Q281 65 319 115T358 226V248H332Q127 248 127 146ZM244 580Q220 580 204 600L155 667Q142 684 146 695T172 707H202Q228 +707 241 684L280 616Q289 602 285 591T264 580H244Z" /> +<glyph unicode="á" glyph-name="aacute" horiz-adv-x="517" d="M29 138Q29 183 51 216T104 267T180 295T258 309T331 312H357V325Q357 436 247 436Q190 436 133 404Q104 390 88 416L80 430Q64 460 91 475Q167 518 255 518Q350 518 402 467T454 320V33Q454 +0 421 0H396Q363 0 363 33V63L366 94H364Q362 90 358 83T340 57T308 25T262 0T199 -12Q129 -12 79 29T29 138ZM127 146Q127 113 152 89T221 65Q281 65 319 115T358 226V248H332Q127 248 127 146ZM252 580Q235 580 229 591T232 617L272 684Q285 707 311 707H340Q361 +707 366 696T358 667L309 600Q293 580 269 580H252Z" /> +<glyph unicode="â" glyph-name="acircumflex" horiz-adv-x="517" d="M161 580Q143 580 139 591T145 620L191 685Q206 707 232 707H281Q307 707 321 685L368 620Q379 603 375 592T353 580H331Q310 580 296 602L257 660H255L216 602Q204 580 181 580H161ZM29 +138Q29 183 51 216T104 267T180 295T258 309T331 312H357V325Q357 436 247 436Q190 436 133 404Q104 390 88 416L80 430Q64 460 91 475Q167 518 255 518Q350 518 402 467T454 320V33Q454 0 421 0H396Q363 0 363 33V63L366 94H364Q362 90 358 83T340 57T308 25T262 +0T199 -12Q129 -12 79 29T29 138ZM127 146Q127 113 152 89T221 65Q281 65 319 115T358 226V248H332Q127 248 127 146Z" /> +<glyph unicode="ã" glyph-name="atilde" horiz-adv-x="517" d="M120 581Q91 581 91 613Q91 654 117 681T185 708Q216 708 240 691T282 657T318 640Q335 640 344 653T355 685Q357 705 385 705H393Q422 705 422 677Q422 632 397 605T328 578Q297 578 273 595T231 +629T195 646Q159 646 157 601Q154 581 128 581H120ZM29 138Q29 183 51 216T104 267T180 295T258 309T331 312H357V325Q357 436 247 436Q190 436 133 404Q104 390 88 416L80 430Q64 460 91 475Q167 518 255 518Q350 518 402 467T454 320V33Q454 0 421 0H396Q363 +0 363 33V63L366 94H364Q362 90 358 83T340 57T308 25T262 0T199 -12Q129 -12 79 29T29 138ZM127 146Q127 113 152 89T221 65Q281 65 319 115T358 226V248H332Q127 248 127 146Z" /> +<glyph unicode="ä" glyph-name="adieresis" horiz-adv-x="517" d="M29 138Q29 183 51 216T104 267T180 295T258 309T331 312H357V325Q357 436 247 436Q190 436 133 404Q104 390 88 416L80 430Q64 460 91 475Q167 518 255 518Q350 518 402 467T454 320V33Q454 +0 421 0H396Q363 0 363 33V63L366 94H364Q362 90 358 83T340 57T308 25T262 0T199 -12Q129 -12 79 29T29 138ZM127 146Q127 113 152 89T221 65Q281 65 319 115T358 226V248H332Q127 248 127 146ZM333 606Q300 606 300 639V674Q300 707 333 707H347Q380 707 380 +674V639Q380 606 347 606H333ZM166 606Q133 606 133 639V674Q133 707 166 707H180Q213 707 213 674V639Q213 606 180 606H166Z" /> +<glyph unicode="å" glyph-name="aring" horiz-adv-x="517" d="M29 138Q29 183 51 216T104 267T180 295T258 309T331 312H357V325Q357 436 247 436Q190 436 133 404Q104 390 88 416L80 430Q64 460 91 475Q167 518 255 518Q350 518 402 467T454 320V33Q454 +0 421 0H396Q363 0 363 33V63L366 94H364Q362 90 358 83T340 57T308 25T262 0T199 -12Q129 -12 79 29T29 138ZM127 146Q127 113 152 89T221 65Q281 65 319 115T358 226V248H332Q127 248 127 146ZM292 568T257 568T197 588T172 642Q172 676 197 696T257 717T317 +697T342 642Q342 609 317 589ZM257 609Q271 609 280 618T290 642Q290 658 281 667T257 677Q242 677 233 668T224 642Q224 628 233 619T257 609Z" /> +<glyph unicode="æ" glyph-name="ae" horiz-adv-x="853" d="M31 142Q31 175 42 201T72 245T117 275T170 294T228 304T283 309T333 310H358V325Q358 436 244 436Q190 436 133 404Q104 389 88 416L80 430Q65 460 92 475Q165 518 251 518Q378 518 419 429H421Q481 +518 600 518Q702 518 759 452T817 279Q817 266 808 256T783 245H451Q455 162 502 117T620 72Q685 72 741 111Q771 129 786 101L794 86Q811 58 785 42Q708 -12 614 -12Q539 -12 483 21T397 115H395Q390 101 379 84T346 43T287 4T204 -12Q131 -12 81 29T31 142ZM455 +310H719Q717 372 683 406T599 441Q542 441 504 407T455 310ZM129 147Q129 113 154 90T225 66Q284 66 321 116T359 228V245H312Q129 245 129 147Z" /> +<glyph unicode="ç" glyph-name="ccedilla" horiz-adv-x="534" d="M254 -59L266 -9Q164 4 101 76T38 253Q38 366 114 442T308 518Q406 518 475 464Q501 447 481 419L471 404Q455 379 426 396Q373 434 313 434Q237 434 187 383T137 254T187 124T315 72Q383 +72 444 118Q472 136 489 109L497 94Q513 67 488 50Q416 -9 319 -12L312 -50Q344 -54 364 -73T384 -123Q384 -166 355 -186T282 -207Q230 -207 230 -178Q230 -148 248 -148Q252 -148 260 -149T274 -151Q317 -151 317 -119Q317 -92 270 -87Q246 -85 254 -59Z" /> +<glyph unicode="è" glyph-name="egrave" horiz-adv-x="545" d="M38 253Q38 372 109 445T291 518Q394 518 451 452T509 277Q509 263 500 253T475 243H137Q141 163 191 118T312 72Q379 72 433 112Q463 128 478 101L487 86Q504 58 477 42Q400 -12 306 -12Q188 +-12 113 63T38 253ZM141 307H412Q410 372 376 407T289 442Q233 442 192 406T141 307ZM278 580Q254 580 238 600L189 667Q176 684 180 695T206 707H236Q262 707 275 684L314 616Q323 602 319 591T298 580H278Z" /> +<glyph unicode="é" glyph-name="eacute" horiz-adv-x="545" d="M287 580Q270 580 264 591T267 617L307 684Q320 707 346 707H375Q396 707 401 696T393 667L344 600Q328 580 304 580H287ZM38 253Q38 372 109 445T291 518Q394 518 451 452T509 277Q509 263 +500 253T475 243H137Q141 163 191 118T312 72Q379 72 433 112Q463 128 478 101L487 86Q504 58 477 42Q400 -12 306 -12Q188 -12 113 63T38 253ZM141 307H412Q410 372 376 407T289 442Q233 442 192 406T141 307Z" /> +<glyph unicode="ê" glyph-name="ecircumflex" horiz-adv-x="545" d="M195 580Q177 580 173 591T179 620L225 685Q240 707 266 707H315Q341 707 355 685L402 620Q413 603 409 592T387 580H365Q344 580 330 602L291 660H289L250 602Q238 580 215 580H195ZM38 +253Q38 372 109 445T291 518Q394 518 451 452T509 277Q509 263 500 253T475 243H137Q141 163 191 118T312 72Q379 72 433 112Q463 128 478 101L487 86Q504 58 477 42Q400 -12 306 -12Q188 -12 113 63T38 253ZM141 307H412Q410 372 376 407T289 442Q233 442 192 +406T141 307Z" /> +<glyph unicode="ë" glyph-name="edieresis" horiz-adv-x="545" d="M367 606Q334 606 334 639V674Q334 707 367 707H381Q414 707 414 674V639Q414 606 381 606H367ZM200 606Q167 606 167 639V674Q167 707 200 707H214Q247 707 247 674V639Q247 606 214 606H200ZM38 +253Q38 372 109 445T291 518Q394 518 451 452T509 277Q509 263 500 253T475 243H137Q141 163 191 118T312 72Q379 72 433 112Q463 128 478 101L487 86Q504 58 477 42Q400 -12 306 -12Q188 -12 113 63T38 253ZM141 307H412Q410 372 376 407T289 442Q233 442 192 +406T141 307Z" /> +<glyph unicode="ì" glyph-name="igrave" horiz-adv-x="237" d="M74 33V473Q74 506 107 506H138Q171 506 171 473V33Q171 0 138 0H107Q74 0 74 33ZM110 580Q86 580 70 600L21 667Q8 684 12 695T38 707H68Q94 707 107 684L146 616Q155 602 151 591T130 580H110Z" /> +<glyph unicode="í" glyph-name="iacute" horiz-adv-x="237" d="M116 580Q99 580 93 591T96 617L136 684Q149 707 175 707H204Q225 707 230 696T222 667L173 600Q157 580 133 580H116ZM70 33V473Q70 506 103 506H134Q167 506 167 473V33Q167 0 134 0H103Q70 0 70 33Z" /> +<glyph unicode="î" glyph-name="icircumflex" horiz-adv-x="237" d="M28 580Q10 580 6 591T12 620L58 685Q73 707 99 707H148Q174 707 188 685L235 620Q246 603 242 592T220 580H198Q177 580 163 602L124 660H122L83 602Q71 580 48 580H28ZM74 33V473Q74 +506 107 506H138Q171 506 171 473V33Q171 0 138 0H107Q74 0 74 33Z" /> +<glyph unicode="ï" glyph-name="idieresis" horiz-adv-x="237" d="M197 606Q164 606 164 639V674Q164 707 197 707H211Q244 707 244 674V639Q244 606 211 606H197ZM30 606Q-3 606 -3 639V674Q-3 707 30 707H44Q77 707 77 674V639Q77 606 44 606H30ZM70 33V473Q70 +506 103 506H134Q167 506 167 473V33Q167 0 134 0H103Q70 0 70 33Z" /> +<glyph unicode="ð" glyph-name="eth" horiz-adv-x="578" d="M39 235Q39 329 102 397T276 466Q313 466 344 455T389 432L402 420H404Q374 503 292 557L147 492Q131 486 123 488T109 503L105 513Q95 536 123 549L225 594Q187 615 129 632Q98 641 107 673L113 +689Q124 720 154 711Q255 684 330 639L433 685Q461 696 470 675L476 663Q486 642 458 630L386 597Q530 477 530 275Q530 222 516 173T472 82T392 14T276 -12Q168 -12 104 61T39 235ZM138 233Q138 167 175 120T279 72Q354 72 393 128T432 258Q432 315 393 351T290 +388Q217 388 178 343T138 233Z" /> +<glyph unicode="ñ" glyph-name="ntilde" horiz-adv-x="591" d="M70 33V473Q70 506 103 506H131Q164 506 164 473V428L161 399H163Q183 443 232 480T355 518Q528 518 528 324V33Q528 0 495 0H464Q431 0 431 33V302Q431 363 412 396T336 429Q263 429 215 375T167 +242V33Q167 0 134 0H103Q70 0 70 33ZM171 581Q142 581 142 613Q142 654 168 681T236 708Q267 708 291 691T333 657T369 640Q386 640 395 653T406 685Q408 705 436 705H444Q473 705 473 677Q473 632 448 605T379 578Q348 578 324 595T282 629T246 646Q210 646 208 +601Q205 581 179 581H171Z" /> +<glyph unicode="ò" glyph-name="ograve" horiz-adv-x="619" d="M37 140T37 254T116 443T309 518Q424 518 503 443T582 254T503 64T309 -12T116 64ZM135 332T135 254T186 124T309 72Q382 72 432 123T483 254Q483 332 433 383T309 434Q237 434 186 383ZM295 +580Q271 580 255 600L206 667Q193 684 197 695T223 707H253Q279 707 292 684L331 616Q340 602 336 591T315 580H295Z" /> +<glyph unicode="ó" glyph-name="oacute" horiz-adv-x="619" d="M306 580Q289 580 283 591T286 617L326 684Q339 707 365 707H394Q415 707 420 696T412 667L363 600Q347 580 323 580H306ZM37 140T37 254T116 443T309 518Q424 518 503 443T582 254T503 64T309 +-12T116 64ZM135 332T135 254T186 124T309 72Q382 72 432 123T483 254Q483 332 433 383T309 434Q237 434 186 383Z" /> +<glyph unicode="ô" glyph-name="ocircumflex" horiz-adv-x="619" d="M213 580Q195 580 191 591T197 620L243 685Q258 707 284 707H333Q359 707 373 685L420 620Q431 603 427 592T405 580H383Q362 580 348 602L309 660H307L268 602Q256 580 233 580H213ZM37 +140T37 254T116 443T309 518Q424 518 503 443T582 254T503 64T309 -12T116 64ZM135 332T135 254T186 124T309 72Q382 72 432 123T483 254Q483 332 433 383T309 434Q237 434 186 383Z" /> +<glyph unicode="õ" glyph-name="otilde" horiz-adv-x="619" d="M173 581Q144 581 144 613Q144 654 170 681T238 708Q269 708 293 691T335 657T371 640Q388 640 397 653T408 685Q410 705 438 705H446Q475 705 475 677Q475 632 450 605T381 578Q350 578 326 +595T284 629T248 646Q212 646 210 601Q207 581 181 581H173ZM37 140T37 254T116 443T309 518Q424 518 503 443T582 254T503 64T309 -12T116 64ZM135 332T135 254T186 124T309 72Q382 72 432 123T483 254Q483 332 433 383T309 434Q237 434 186 383Z" /> +<glyph unicode="ö" glyph-name="odieresis" horiz-adv-x="619" d="M386 606Q353 606 353 639V674Q353 707 386 707H400Q433 707 433 674V639Q433 606 400 606H386ZM219 606Q186 606 186 639V674Q186 707 219 707H233Q266 707 266 674V639Q266 606 233 606H219ZM37 +140T37 254T116 443T309 518Q424 518 503 443T582 254T503 64T309 -12T116 64ZM135 332T135 254T186 124T309 72Q382 72 432 123T483 254Q483 332 433 383T309 434Q237 434 186 383Z" /> +<glyph unicode="÷" glyph-name="divide" horiz-adv-x="613" d="M292 435Q259 435 259 468V493Q259 526 292 526H320Q353 526 353 493V468Q353 435 320 435H292ZM87 246Q54 246 54 279V291Q54 324 87 324H526Q559 324 559 291V279Q559 246 526 246H87ZM259 +77V102Q259 135 292 135H320Q353 135 353 102V77Q353 44 320 44H292Q259 44 259 77Z" /> +<glyph unicode="ø" glyph-name="oslash" horiz-adv-x="620" d="M110 16L133 49Q38 126 38 254Q38 368 117 443T310 518Q382 518 445 485L465 513Q484 539 509 523Q533 507 518 487L493 452Q583 375 583 254Q583 140 504 64T310 -12Q238 -12 183 18L162 -11Q144 +-38 119 -21Q94 -3 110 16ZM187 125L393 413Q354 434 310 434Q238 434 187 383T136 254Q136 178 187 125ZM235 90Q268 72 310 72Q383 72 433 123T484 254Q484 326 438 375L235 90Z" /> +<glyph unicode="ù" glyph-name="ugrave" horiz-adv-x="587" d="M64 182V473Q64 506 97 506H128Q160 506 160 473V204Q160 144 180 111T255 78Q330 78 375 134T420 269V473Q420 506 453 506H484Q517 506 517 473V33Q517 0 484 0H456Q423 0 423 33V78L426 107H424Q404 +62 354 25T236 -12Q150 -12 107 35T64 182ZM277 580Q253 580 237 600L188 667Q175 684 179 695T205 707H235Q261 707 274 684L313 616Q322 602 318 591T297 580H277Z" /> +<glyph unicode="ú" glyph-name="uacute" horiz-adv-x="587" d="M286 580Q269 580 263 591T266 617L306 684Q319 707 345 707H374Q395 707 400 696T392 667L343 600Q327 580 303 580H286ZM64 182V473Q64 506 97 506H128Q160 506 160 473V204Q160 144 180 111T255 +78Q330 78 375 134T420 269V473Q420 506 453 506H484Q517 506 517 473V33Q517 0 484 0H456Q423 0 423 33V78L426 107H424Q404 62 354 25T236 -12Q150 -12 107 35T64 182Z" /> +<glyph unicode="û" glyph-name="ucircumflex" horiz-adv-x="587" d="M194 580Q176 580 172 591T178 620L224 685Q239 707 265 707H314Q340 707 354 685L401 620Q412 603 408 592T386 580H364Q343 580 329 602L290 660H288L249 602Q237 580 214 580H194ZM64 +182V473Q64 506 97 506H128Q160 506 160 473V204Q160 144 180 111T255 78Q330 78 375 134T420 269V473Q420 506 453 506H484Q517 506 517 473V33Q517 0 484 0H456Q423 0 423 33V78L426 107H424Q404 62 354 25T236 -12Q150 -12 107 35T64 182Z" /> +<glyph unicode="ü" glyph-name="udieresis" horiz-adv-x="587" d="M367 606Q334 606 334 639V674Q334 707 367 707H381Q414 707 414 674V639Q414 606 381 606H367ZM200 606Q167 606 167 639V674Q167 707 200 707H214Q247 707 247 674V639Q247 606 214 606H200ZM64 +182V473Q64 506 97 506H128Q160 506 160 473V204Q160 144 180 111T255 78Q330 78 375 134T420 269V473Q420 506 453 506H484Q517 506 517 473V33Q517 0 484 0H456Q423 0 423 33V78L426 107H424Q404 62 354 25T236 -12Q150 -12 107 35T64 182Z" /> +<glyph unicode="ý" glyph-name="yacute" horiz-adv-x="502" d="M35 -134Q46 -110 72 -117Q100 -128 112 -128Q141 -128 163 -107T199 -52L224 6L28 468Q21 485 28 495T53 506H92Q120 506 129 480L248 175L266 114H268Q276 148 285 174L400 479Q409 506 437 +506H473Q491 506 498 496T499 468L276 -89Q254 -147 210 -178T112 -210Q81 -210 42 -194Q13 -182 27 -151L35 -134ZM263 579Q246 579 240 590T243 616L283 683Q296 706 322 706H351Q372 706 377 694T369 666L320 599Q304 579 280 579H263Z" /> +<glyph unicode="þ" glyph-name="thorn" horiz-adv-x="592" d="M72 -167V673Q72 706 105 706H136Q168 706 168 673V476L167 434H169Q170 435 178 445T192 462T213 481T243 499T281 512T329 518Q431 518 492 444T553 253T490 62T325 -12Q293 -12 265 -4T219 +17T190 42T173 62L168 71H166Q168 53 168 27V-167Q168 -200 136 -200H105Q72 -200 72 -167ZM166 252Q166 173 205 123T310 72Q373 72 414 122T455 253Q455 333 416 383T313 434Q249 434 208 389T166 252Z" /> +<glyph unicode="ÿ" glyph-name="ydieresis" horiz-adv-x="502" d="M35 -134Q46 -110 72 -117Q100 -128 112 -128Q141 -128 163 -107T199 -52L224 6L28 468Q21 485 28 495T53 506H92Q120 506 129 480L248 175L266 114H268Q276 148 285 174L400 479Q409 506 +437 506H473Q491 506 498 496T499 468L276 -89Q254 -147 210 -178T112 -210Q81 -210 42 -194Q13 -182 27 -151L35 -134ZM344 605Q311 605 311 638V673Q311 706 344 706H358Q391 706 391 673V638Q391 605 358 605H344ZM177 605Q144 605 144 638V673Q144 706 177 +706H191Q224 706 224 673V638Q224 605 191 605H177Z" /> +<glyph unicode="Œ" glyph-name="OE" horiz-adv-x="946" d="M44 354Q44 507 149 611T410 715Q436 715 476 711T532 706H858Q891 706 891 673V653Q891 620 858 620H579V399H799Q832 399 832 366V346Q832 313 799 313H579V86H875Q908 86 908 53V33Q908 0 875 +0H533Q517 0 477 -4T410 -9Q254 -9 149 95T44 354ZM146 354Q146 236 220 157T410 77Q428 77 445 79T472 83L481 85V622Q450 629 410 629Q294 629 220 550T146 354Z" /> +<glyph unicode="œ" glyph-name="oe" horiz-adv-x="990" d="M37 135T37 252T115 443T306 518Q454 518 526 398H528Q592 518 736 518Q839 518 897 452T955 277Q955 263 945 253T920 243H583Q589 162 638 117T757 72Q823 72 879 112Q909 128 923 101L932 86Q948 +57 922 42Q847 -12 751 -12Q598 -12 530 111H528Q456 -12 307 -12Q193 -12 115 61ZM586 307H856Q854 370 820 405T735 441Q678 441 637 405T586 307ZM136 252Q136 172 186 122T309 72T432 122T483 255Q483 334 432 384T309 434T187 384T136 252Z" /> +<glyph unicode="Š" glyph-name="Scaron" horiz-adv-x="537" d="M264 755Q238 755 223 776L177 842Q166 859 170 870T193 882H213Q235 882 248 860L287 801H289L328 860Q343 882 363 882H384Q402 882 406 871T400 842L353 776Q339 755 313 755H264ZM77 61Q54 +82 73 107L90 131Q108 154 135 137Q214 80 289 80Q345 80 379 107T413 181Q413 224 378 254T293 306T193 351T108 418T73 522Q73 610 138 664T302 718Q358 718 405 701T479 664Q503 647 489 619L475 594Q460 567 430 585Q361 626 300 626Q244 626 209 599T173 527Q173 +492 198 465T261 423T343 386T425 344T488 282T513 189Q513 103 453 46T289 -12Q221 -12 166 11T77 61Z" /> +<glyph unicode="š" glyph-name="scaron" horiz-adv-x="439" d="M214 580Q188 580 173 601L127 667Q116 684 120 695T143 707H163Q185 707 198 685L237 626H239L278 685Q293 707 313 707H334Q352 707 356 696T350 667L303 601Q289 580 263 580H214ZM68 43Q43 +59 61 88L71 102Q88 125 117 109Q180 68 241 68Q279 68 303 85T327 135Q327 162 300 180T235 212T158 242T93 292T66 372Q66 441 118 479T249 518T389 479Q417 465 400 435L391 420Q377 395 347 409Q296 438 244 438Q206 438 183 422T159 374Q159 347 186 328T251 +296T328 267T393 218T420 137Q420 72 370 30T238 -12Q141 -12 68 43Z" /> +<glyph unicode="Ÿ" glyph-name="Ydieresis" horiz-adv-x="567" d="M241 33V299L27 667Q17 684 24 695T50 706H90Q117 706 128 683L247 474L290 385H292Q313 434 335 474L453 683Q465 706 491 706H531Q550 706 557 695T554 667L340 299V33Q340 0 307 0H274Q241 +0 241 33ZM364 781Q331 781 331 814V849Q331 882 364 882H378Q411 882 411 849V814Q411 781 378 781H364ZM197 781Q164 781 164 814V849Q164 882 197 882H211Q244 882 244 849V814Q244 781 211 781H197Z" /> +<glyph unicode="Ž" glyph-name="Zcaron" horiz-adv-x="588" d="M280 755Q254 755 239 776L193 842Q182 859 186 870T209 882H229Q251 882 264 860L303 801H305L344 860Q359 882 379 882H400Q418 882 422 871T416 842L369 776Q355 755 329 755H280ZM32 33V43Q32 +65 46 85L372 556Q384 574 396 590T416 614L423 621V623Q404 620 370 620H83Q50 620 50 653V673Q50 706 83 706H513Q546 706 546 674V664Q546 642 533 622L206 150Q194 133 181 117T162 94L155 86V84Q174 86 208 86H517Q550 86 550 53V33Q550 0 517 0H65Q32 0 32 +33Z" /> +<glyph unicode="ž" glyph-name="zcaron" horiz-adv-x="500" d="M223 580Q197 580 182 601L136 667Q125 684 129 695T152 707H172Q194 707 207 685L246 626H248L287 685Q302 707 322 707H343Q361 707 365 696T359 667L312 601Q298 580 272 580H223ZM31 28V36Q31 +56 45 74L286 376L328 423V425Q312 423 279 423H75Q42 423 42 456V473Q42 506 75 506H426Q459 506 459 478V470Q459 450 445 432L204 129L161 83V81Q177 83 210 83H434Q467 83 467 51V33Q467 0 434 0H64Q31 0 31 28Z" /> +<glyph unicode="ƒ" glyph-name="florin" horiz-adv-x="376" d="M-30 -25Q-14 -27 4 -27Q21 -27 36 -23T70 -9T102 25T118 84L141 350H92Q59 350 59 382V395Q59 428 92 428H148L157 530Q161 578 178 613T218 668T269 699T320 714T365 718Q376 718 418 715Q449 +712 449 680V662Q449 627 423 630Q391 634 370 634Q353 634 337 630T303 616T271 582T255 523L245 428H329Q362 428 362 395V382Q362 350 330 350H238L215 76Q210 17 187 -23T129 -80T67 -104T8 -111Q-9 -111 -31 -109Q-62 -106 -62 -74V-56Q-62 -22 -30 -25Z" +/> +<glyph unicode="ˆ" glyph-name="circumflex" horiz-adv-x="499" d="M158 755Q140 755 136 766T142 795L188 860Q203 882 229 882H278Q304 882 318 860L365 795Q376 778 372 767T350 755H328Q307 755 293 777L254 835H252L213 777Q201 755 178 755H158Z" /> +<glyph unicode="˜" glyph-name="tilde" horiz-adv-x="499" d="M113 756Q84 756 84 788Q84 829 110 856T178 883Q209 883 233 866T275 832T311 815Q328 815 337 828T348 860Q350 880 378 880H386Q415 880 415 852Q415 807 390 780T321 753Q290 753 266 770T224 +804T188 821Q152 821 150 776Q147 756 121 756H113Z" /> +<glyph unicode="–" glyph-name="endash" horiz-adv-x="655" d="M97 246Q65 246 65 279V291Q65 324 97 324H558Q591 324 591 291V279Q591 246 558 246H97Z" /> +<glyph unicode="—" glyph-name="emdash" horiz-adv-x="855" d="M97 246Q65 246 65 279V291Q65 324 97 324H758Q791 324 791 291V279Q791 246 758 246H97Z" /> +<glyph unicode="‘" glyph-name="quoteleft" horiz-adv-x="209" d="M79 499Q61 499 54 509T52 537L102 691Q111 717 139 717H148Q183 717 175 681L139 529Q133 499 104 499H79Z" /> +<glyph unicode="’" glyph-name="quoteright" horiz-adv-x="207" d="M85 499Q48 499 58 536L93 688Q99 717 129 717H153Q171 717 178 707T180 680L130 526Q121 499 93 499H85Z" /> +<glyph unicode="‚" glyph-name="quotesinglbase" horiz-adv-x="226" d="M45 -77L81 76Q87 105 117 105H141Q159 105 166 95T168 68L118 -86Q109 -113 81 -113H73Q38 -113 45 -77Z" /> +<glyph unicode="“" glyph-name="quotedblleft" horiz-adv-x="356" d="M226 499Q208 499 201 509T199 537L249 691Q258 717 286 717H295Q330 717 322 681L287 529Q280 499 251 499H226ZM79 499Q61 499 54 509T52 537L102 691Q111 717 139 717H148Q183 717 +175 681L140 529Q134 499 104 499H79Z" /> +<glyph unicode="”" glyph-name="quotedblright" horiz-adv-x="354" d="M232 499Q196 499 204 536L240 688Q246 717 276 717H301Q339 717 328 680L278 526Q268 499 240 499H232ZM85 499Q48 499 58 536L93 688Q99 717 129 717H154Q172 717 179 707T181 680L131 +526Q122 499 93 499H85Z" /> +<glyph unicode="„" glyph-name="quotedblbase" horiz-adv-x="373" d="M193 -77L229 76Q235 105 264 105H289Q308 105 315 95T316 68L267 -86Q256 -113 229 -113H220Q185 -113 193 -77ZM46 -77L82 76Q88 105 118 105H143Q161 105 168 95T170 68L120 -86Q109 +-113 82 -113H74Q38 -113 46 -77Z" /> +<glyph unicode="†" glyph-name="dagger" horiz-adv-x="423" d="M164 -17V429H76Q43 429 43 461V473Q43 506 76 506H164V673Q164 706 197 706H224Q257 706 257 673V506H348Q381 506 381 473V461Q381 429 348 429H257V-17Q257 -50 224 -50H197Q164 -50 164 -17Z" /> +<glyph unicode="‡" glyph-name="daggerdbl" horiz-adv-x="435" d="M169 -17V171H82Q49 171 49 204V216Q49 249 82 249H169V429H82Q49 429 49 461V473Q49 506 82 506H169V673Q169 706 202 706H230Q263 706 263 673V506H354Q387 506 387 473V461Q387 429 +354 429H263V249H354Q387 249 387 216V204Q387 171 354 171H263V-17Q263 -50 230 -50H202Q169 -50 169 -17Z" /> +<glyph unicode="•" glyph-name="bullet" horiz-adv-x="411" d="M205 136Q141 136 96 181T51 291T96 400T205 446Q270 446 315 401T360 291T315 181T205 136Z" /> +<glyph unicode="…" glyph-name="ellipsis" horiz-adv-x="745" d="M581 33V72Q581 105 614 105H650Q683 105 683 72V33Q683 0 650 0H614Q581 0 581 33ZM322 33V72Q322 105 354 105H390Q423 105 423 72V33Q423 0 390 0H354Q322 0 322 33ZM62 33V72Q62 105 +95 105H131Q164 105 164 72V33Q164 0 131 0H95Q62 0 62 33Z" /> +<glyph unicode="‰" glyph-name="perthousand" horiz-adv-x="1100" d="M199 422Q136 422 92 465T47 570T91 674T199 718Q261 718 306 675T351 570T306 466T199 422ZM94 40L588 687Q603 706 628 706H646Q667 706 673 694T666 666L172 20Q156 0 132 0H114Q93 +0 87 12T94 40ZM168 496T199 496T251 517T273 570T252 623T199 645T147 623T125 570Q125 538 146 517ZM764 136Q764 197 808 240T916 284Q978 284 1023 241T1068 136T1023 32T916 -12Q852 -12 808 31T764 136ZM410 136Q410 197 454 240T561 284T668 241T713 136T669 +32T561 -12T454 31T410 136ZM842 136Q842 104 863 83T916 62Q947 62 968 83T990 136T969 189T916 211T864 189T842 136ZM488 167T488 136T509 84T561 62T613 83T635 136Q635 167 614 189T561 211T509 189Z" /> +<glyph unicode="‹" glyph-name="guilsinglleft" horiz-adv-x="321" d="M199 96L70 259Q50 282 70 305L199 469Q215 488 240 488H260Q281 488 286 476T279 448L148 282L279 117Q292 100 288 89T264 77H240Q215 77 199 96Z" /> +<glyph unicode="›" glyph-name="guilsinglright" horiz-adv-x="321" d="M85 77Q64 77 59 88T66 117L197 282L66 448Q53 464 57 476T82 488H106Q130 488 146 469L276 305Q296 282 276 259L146 96Q130 77 106 77H85Z" /> +<glyph unicode="€" glyph-name="Euro" horiz-adv-x="599" d="M70 258Q40 258 40 290Q40 321 70 321H95Q90 353 95 393H71Q40 393 40 425T71 457H106Q137 573 230 645T445 718Q472 718 512 713Q547 707 537 673L530 646Q523 616 496 621Q463 626 443 626Q360 +626 299 580T212 457H456Q492 457 486 424Q480 393 449 393H197Q192 358 197 321H430Q468 321 460 288Q455 258 424 258H214Q237 178 300 130T446 82Q482 82 505 87Q538 93 544 63L550 36Q557 3 525 -3Q482 -12 445 -12Q318 -12 226 62T105 258H70Z" /> +<glyph unicode="™" glyph-name="trademark" horiz-adv-x="965" d="M454 300L485 675Q487 706 518 706H529Q557 706 568 681L660 476L674 434H676Q682 458 690 476L782 681Q793 706 821 706H832Q863 706 865 675L895 300Q897 266 863 266H853Q823 266 820 +297L802 529L803 559H801L716 373Q706 347 678 347H672Q644 347 634 373L549 559H547L548 529L529 297Q527 266 496 266H486Q452 266 454 300ZM225 266Q192 266 192 299V639H73Q40 639 40 670V675Q40 706 73 706H387Q420 706 420 675V670Q420 639 387 639H268V299Q268 +266 235 266H225Z" /> +</font> +</defs> +</svg> diff --git a/web/cobrands/fixmystreet/fonts/MuseoSansRounded500.ttf b/web/cobrands/fixmystreet/fonts/MuseoSansRounded500.ttf Binary files differnew file mode 100644 index 000000000..7bec6cf5f --- /dev/null +++ b/web/cobrands/fixmystreet/fonts/MuseoSansRounded500.ttf diff --git a/web/cobrands/fixmystreet/fonts/MuseoSansRounded500.woff b/web/cobrands/fixmystreet/fonts/MuseoSansRounded500.woff Binary files differnew file mode 100644 index 000000000..dfbbe1cdc --- /dev/null +++ b/web/cobrands/fixmystreet/fonts/MuseoSansRounded500.woff diff --git a/web/cobrands/fixmystreet/layout.scss b/web/cobrands/fixmystreet/layout.scss new file mode 100644 index 000000000..fea728bc6 --- /dev/null +++ b/web/cobrands/fixmystreet/layout.scss @@ -0,0 +1,169 @@ +@import "_colours"; + +body { + margin: 7px 0 0 0; + padding: 0; + background-color: #3c3c3c; + background-image: url(/cobrands/fixmystreet/texture.png); +} + +#wrapper2 { + padding: 0 0.5em; +} + +/* A third wrapper is needed because display:table cannot be given a max-width. + * The other two wrappers (to set full width white background and the + * max-width, are defined in base.scss. */ +#wrapper3 { + display: table; + caption-side: top; + width: 100%; + background-color: #fff; +} + +/* As the navigation is put in place using position:absolute in IE6+7, add some + * extra space here to cover it. */ +.ie6, .ie7 { + #wrapper3 { + padding-top: 2em; + } +} + +#meta { + float: right; + margin: -3em 0 0 1em; +} + +#mysociety { + padding: 0 0 1em 0; +} + +/* Giving this a display: table-caption, and #wrapper3 a caption-side: top, + * means that this div appears above the main content, even though it is below + * it in source order. */ +#navigation { + border: none; + padding-top: 0; + margin: 0; + display: table-caption; + line-height: 1.2; +} + +#navigation .spacer { + display: table-cell; + width: 100%; +} + +/* The two lists in the navigation are displayed as simple horizontal lists in + * table cells. */ +.nav { + display: table-cell; + width: auto; + white-space: nowrap; + margin: 0; + padding: 0; + list-style-type: none; + vertical-align: top; +} + +.nav li { + display: inline-block; +} + +.nav a, .nav span { + text-decoration: none; + display: block; + padding: 10px; +} + +.nav span { + text-decoration: underline; +} + +#site-nav a, #site-nav span { + color: $colour; + padding: 9px 20px 8px 0px; +} + +#site-nav a:hover { + color: #000; +} + +#mysociety-nav { + line-height: 1.5; + font-size: 68.75%; + text-transform: uppercase; + background-color: #3c3c3c; + background-image: url(/cobrands/fixmystreet/texture.png); + border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + -webkit-border-radius: 0 0 6px 6px; +} + +#mysociety-nav li a { + color: #fff; +} + +#mysociety-nav li a:hover { + color: #ffe600; +} + +#mysociety-logo { + width: 78px; + background: url(mysociety-logo.png) center center no-repeat; + text-indent: -999999em; +} + +/* As IE6 cannot cope with the PNG transparency (the above logo will work on + * any colour), we generate a static non-transparent PNG on the right + * background colour and use that here. */ +.ie6 #mysociety-logo { + background: url(mysociety-logo-ie6.gif) center center no-repeat; +} + +#footer p { + text-align: center; + display: table-cell; + width: 31%; + padding: 0 1%; + margin: 0; +} + +/* IE6 and IE7 do no understand display:table, but we'd like them to get the + * grasp of the right thing, rather than the mobile-first default. So move the + * navigation bar into place with position:absolute, and float all the list + * items. */ +.ie6, .ie7 { + + #navigation { + position: absolute; + top: 7px; + right: 0; + width: 47em; + } + + #navigation .spacer { + display: none; + } + + .nav { + float: left; + } + + .nav li { + float: left; + display: block; + } + + .nav a { + display: block; + } + + #footer p { + text-align: left; + width: auto; + padding: 0; + margin: 0.5em 0; + } + +} diff --git a/web/cobrands/fixmystreet/mysociety-logo-ie6.gif b/web/cobrands/fixmystreet/mysociety-logo-ie6.gif Binary files differnew file mode 100644 index 000000000..b0a262666 --- /dev/null +++ b/web/cobrands/fixmystreet/mysociety-logo-ie6.gif diff --git a/web/cobrands/fixmystreet/mysociety-logo.png b/web/cobrands/fixmystreet/mysociety-logo.png Binary files differnew file mode 100644 index 000000000..8b7d6fc75 --- /dev/null +++ b/web/cobrands/fixmystreet/mysociety-logo.png diff --git a/web/cobrands/fixmystreet/texture.png b/web/cobrands/fixmystreet/texture.png Binary files differnew file mode 100644 index 000000000..31ac97633 --- /dev/null +++ b/web/cobrands/fixmystreet/texture.png diff --git a/web/css/core.scss b/web/css/core.scss index 675471b40..a38a188ce 100644 --- a/web/css/core.scss +++ b/web/css/core.scss @@ -86,8 +86,12 @@ $map_width: 500px; margin: 0; } + p#expl small { + display: block; + } + #postcodeForm { - display: table; /* IE6 has fixed width set below */ + display: table; /* Full width in IE6 and IE7 */ text-align: center; font-size: 150%; margin: 1em auto; @@ -95,6 +99,9 @@ $map_width: 500px; -moz-border-radius: 1em; -webkit-border-radius: 1em; border-radius: 1em; + -moz-box-shadow: 2px 2px 4px #999; + -webkit-box-shadow: 2px 2px 4px #999; + box-shadow: 2px 2px 4px #999; label { float: none; @@ -170,7 +177,7 @@ $map_width: 500px; float: left; text-align: right; padding-right: 0.5em; - width: 5em; + width: 6em; } fieldset, .fieldset { @@ -562,15 +569,12 @@ $map_width: 500px; right: 3px; } -.ie6 { +.ie6, .ie7 { #mysociety { #front_stats div { float: left; margin: 0 1em 1em; } - #postcodeForm { - width: 33em; - } } } @@ -587,7 +591,11 @@ $map_width: 500px; @media all and (max-width: 50em) { #mysociety { p#expl { - font-size: 110%; + font-size: 120%; + } + + p#expl small { + display: inline; } #postcodeForm { diff --git a/web/i/pin-shadow.png b/web/i/pin-shadow.png Binary files differnew file mode 100644 index 000000000..1b6d2380f --- /dev/null +++ b/web/i/pin-shadow.png diff --git a/web/i/pin3orange.gif b/web/i/pin3orange.gif Binary files differdeleted file mode 100644 index 4a45bd89c..000000000 --- a/web/i/pin3orange.gif +++ /dev/null diff --git a/web/i/pin3pink.gif b/web/i/pin3pink.gif Binary files differdeleted file mode 100644 index 93401b264..000000000 --- a/web/i/pin3pink.gif +++ /dev/null diff --git a/web/i/pinB.gif b/web/i/pinB.gif Binary files differdeleted file mode 100644 index 2501bc63b..000000000 --- a/web/i/pinB.gif +++ /dev/null diff --git a/web/i/pinB.png b/web/i/pinB.png Binary files differnew file mode 100644 index 000000000..0d549dc8c --- /dev/null +++ b/web/i/pinB.png diff --git a/web/i/pinG.gif b/web/i/pinG.gif Binary files differdeleted file mode 100644 index 6ba710878..000000000 --- a/web/i/pinG.gif +++ /dev/null diff --git a/web/i/pinG.png b/web/i/pinG.png Binary files differnew file mode 100644 index 000000000..388658fd9 --- /dev/null +++ b/web/i/pinG.png diff --git a/web/i/pinG1.gif b/web/i/pinG1.gif Binary files differdeleted file mode 100644 index 58f136791..000000000 --- a/web/i/pinG1.gif +++ /dev/null diff --git a/web/i/pinG2.gif b/web/i/pinG2.gif Binary files differdeleted file mode 100644 index bcd7beddf..000000000 --- a/web/i/pinG2.gif +++ /dev/null diff --git a/web/i/pinG3.gif b/web/i/pinG3.gif Binary files differdeleted file mode 100644 index 140ad9a7d..000000000 --- a/web/i/pinG3.gif +++ /dev/null diff --git a/web/i/pinG4.gif b/web/i/pinG4.gif Binary files differdeleted file mode 100644 index 3da172f24..000000000 --- a/web/i/pinG4.gif +++ /dev/null diff --git a/web/i/pinG5.gif b/web/i/pinG5.gif Binary files differdeleted file mode 100644 index 22fb7b919..000000000 --- a/web/i/pinG5.gif +++ /dev/null diff --git a/web/i/pinG6.gif b/web/i/pinG6.gif Binary files differdeleted file mode 100644 index d06d37f7a..000000000 --- a/web/i/pinG6.gif +++ /dev/null diff --git a/web/i/pinG7.gif b/web/i/pinG7.gif Binary files differdeleted file mode 100644 index a9c194a85..000000000 --- a/web/i/pinG7.gif +++ /dev/null diff --git a/web/i/pinG8.gif b/web/i/pinG8.gif Binary files differdeleted file mode 100644 index 68978cb2d..000000000 --- a/web/i/pinG8.gif +++ /dev/null diff --git a/web/i/pinG9.gif b/web/i/pinG9.gif Binary files differdeleted file mode 100644 index 2ed1adffe..000000000 --- a/web/i/pinG9.gif +++ /dev/null diff --git a/web/i/pinP.gif b/web/i/pinP.gif Binary files differdeleted file mode 100644 index 70ee2a6cb..000000000 --- a/web/i/pinP.gif +++ /dev/null diff --git a/web/i/pinP.png b/web/i/pinP.png Binary files differnew file mode 100644 index 000000000..4e835234c --- /dev/null +++ b/web/i/pinP.png diff --git a/web/i/pinR.gif b/web/i/pinR.gif Binary files differdeleted file mode 100644 index 612c6f72e..000000000 --- a/web/i/pinR.gif +++ /dev/null diff --git a/web/i/pinR.png b/web/i/pinR.png Binary files differnew file mode 100644 index 000000000..c16299fd2 --- /dev/null +++ b/web/i/pinR.png diff --git a/web/i/pinR1.gif b/web/i/pinR1.gif Binary files differdeleted file mode 100644 index ecba968c2..000000000 --- a/web/i/pinR1.gif +++ /dev/null diff --git a/web/i/pinR2.gif b/web/i/pinR2.gif Binary files differdeleted file mode 100644 index fa1b11cbf..000000000 --- a/web/i/pinR2.gif +++ /dev/null diff --git a/web/i/pinR3.gif b/web/i/pinR3.gif Binary files differdeleted file mode 100644 index 31c27dc02..000000000 --- a/web/i/pinR3.gif +++ /dev/null diff --git a/web/i/pinR4.gif b/web/i/pinR4.gif Binary files differdeleted file mode 100644 index 183135eb4..000000000 --- a/web/i/pinR4.gif +++ /dev/null diff --git a/web/i/pinR5.gif b/web/i/pinR5.gif Binary files differdeleted file mode 100644 index d16c826c5..000000000 --- a/web/i/pinR5.gif +++ /dev/null diff --git a/web/i/pinR6.gif b/web/i/pinR6.gif Binary files differdeleted file mode 100644 index ea6092e98..000000000 --- a/web/i/pinR6.gif +++ /dev/null diff --git a/web/i/pinR7.gif b/web/i/pinR7.gif Binary files differdeleted file mode 100644 index e9f1fddeb..000000000 --- a/web/i/pinR7.gif +++ /dev/null diff --git a/web/i/pinR8.gif b/web/i/pinR8.gif Binary files differdeleted file mode 100644 index b792510ee..000000000 --- a/web/i/pinR8.gif +++ /dev/null diff --git a/web/i/pinR9.gif b/web/i/pinR9.gif Binary files differdeleted file mode 100644 index b651cc0be..000000000 --- a/web/i/pinR9.gif +++ /dev/null diff --git a/web/i/pin_red.gif b/web/i/pin_red.gif Binary files differdeleted file mode 100644 index 70a8c469c..000000000 --- a/web/i/pin_red.gif +++ /dev/null diff --git a/web/i/pin_red.png b/web/i/pin_red.png Binary files differdeleted file mode 100644 index f960799b3..000000000 --- a/web/i/pin_red.png +++ /dev/null diff --git a/web/i/pin_shadow.png b/web/i/pin_shadow.png Binary files differdeleted file mode 100644 index 3a89759fc..000000000 --- a/web/i/pin_shadow.png +++ /dev/null diff --git a/web/i/pin_yellow.gif b/web/i/pin_yellow.gif Binary files differdeleted file mode 100644 index 829c7afda..000000000 --- a/web/i/pin_yellow.gif +++ /dev/null diff --git a/web/i/pin_yellow.png b/web/i/pin_yellow.png Binary files differdeleted file mode 100644 index 26e8a9d13..000000000 --- a/web/i/pin_yellow.png +++ /dev/null diff --git a/web/js/fixmystreet.js b/web/js/fixmystreet.js index 524bcdafa..b1a8f1889 100644 --- a/web/js/fixmystreet.js +++ b/web/js/fixmystreet.js @@ -10,11 +10,11 @@ function form_category_onchange() { }; if ( typeof fixmystreet !== 'undefined' ) { - args['latitude'] = fixmystreet.latitude; - args['longitude'] = fixmystreet.longitude; + args.latitude = fixmystreet.latitude; + args.longitude = fixmystreet.longitude; } else { - args['latitude'] = $('input[name="latitude"]').val(); - args['longitude'] = $('input[name="longitude"]').val(); + args.latitude = $('input[name="latitude"]').val(); + args.longitude = $('input[name="longitude"]').val(); } $.getJSON('/report/new/category_extras', args, function(data) { @@ -66,13 +66,14 @@ $(function(){ // FIXME - needs to use translated string jQuery.validator.addMethod('validCategory', function(value, element) { - return this.optional(element) || value != '-- Pick a category --'; }, validation_strings['category'] ); + return this.optional(element) || value != '-- Pick a category --'; }, validation_strings.category ); jQuery.validator.addMethod('validName', function(value, element) { var validNamePat = /\ba\s*n+on+((y|o)mo?u?s)?(ly)?\b/i; - return this.optional(element) || value.length > 5 && value.match( /\S/ ) && !value.match( validNamePat ) }, validation_strings['category'] ); + return this.optional(element) || value.length > 5 && value.match( /\S/ ) && !value.match( validNamePat ); }, validation_strings.category ); var form_submitted = 0; + var submitted = false; $("form.validate").validate({ rules: { @@ -87,17 +88,9 @@ $(function(){ errorElement: 'div', errorClass: 'form-error', // we do this to stop things jumping around on blur - success: function (err) { if ( form_submitted ) { err.addClass('label-valid').html( ' ' ); } else { err.addClass('label-valid-hidden'); } }, + success: function (err) { if ( form_submitted ) { err.addClass('label-valid').removeClass('label-valid-hidden').html( ' ' ); } else { err.addClass('label-valid-hidden'); } }, errorPlacement: function( error, element ) { - /* And all because the .before thing doesn't seem to work in - mobile safari on iOS 5. However outerHTML is not cross - browser so we have to have two solutions :( */ - if ( element[0].outerHTML ) { - var html = element.parent('div').html(); - element.parent('div').html( error[0].outerHTML + html ); - } else { - element.parent('div').before( error ); - } + element.parent('div').before( error ); }, submitHandler: function(form) { if (form.submit_problem) { @@ -108,7 +101,9 @@ $(function(){ }, // make sure we can see the error message when we focus on invalid elements showErrors: function( errorMap, errorList ) { - submitted && errorList.length && $(window).scrollTop( $(errorList[0].element).offset().top - 40 ); + if ( submitted && errorList.length ) { + $(window).scrollTop( $(errorList[0].element).offset().top - 40 ); + } this.defaultShowErrors(); submitted = false; }, @@ -140,8 +135,9 @@ $(function(){ } ); $('#email_alert').click(function(e) { - if (!$('#email_alert_box').length) + if (!$('#email_alert_box').length) { return true; + } e.preventDefault(); if ($('#email_alert_box').is(':visible')) { email_alert_close(); diff --git a/web/js/map-OpenLayers.js b/web/js/map-OpenLayers.js index c8bdb85df..fa93c2f4c 100644 --- a/web/js/map-OpenLayers.js +++ b/web/js/map-OpenLayers.js @@ -1,65 +1,46 @@ -$(function(){ - - var perm = new OpenLayers.Control.Permalink(); - set_map_config(perm); - - fixmystreet.map = new OpenLayers.Map("map", { - controls: fixmystreet.controls, - displayProjection: new OpenLayers.Projection("EPSG:4326") - }); - - fixmystreet.layer_options = OpenLayers.Util.extend({ - zoomOffset: fixmystreet.zoomOffset, - transitionEffect: 'resize', - numZoomLevels: fixmystreet.numZoomLevels - }, fixmystreet.layer_options); - var layer = new fixmystreet.map_type("", fixmystreet.layer_options); - fixmystreet.map.addLayer(layer); - - if (!fixmystreet.map.getCenter()) { - var centre = new OpenLayers.LonLat( fixmystreet.longitude, fixmystreet.latitude ); - centre.transform( - new OpenLayers.Projection("EPSG:4326"), - fixmystreet.map.getProjectionObject() - ); - fixmystreet.map.setCenter(centre, fixmystreet.zoom || 3); - } - - if (document.getElementById('mapForm')) { - var click = new OpenLayers.Control.Click(); - fixmystreet.map.addControl(click); - click.activate(); - } - - /* To let permalink not be caught by the Click layer, answer found - * at http://www.mail-archive.com/users@openlayers.org/msg12958.html - * Not sure why you can't use eventListeners or events.register... - */ - OpenLayers.Event.observe( perm.element, "click", function(e) { - OpenLayers.Event.stop(e); - location.href = OpenLayers.Event.element(e).href; - return false; - }); +// This function might be passed either an OpenLayers.LonLat (so has +// lon and lat) or an OpenLayers.Geometry.Point (so has x and y) +function fixmystreet_update_pin(lonlat) { + lonlat.transform( + fixmystreet.map.getProjectionObject(), + new OpenLayers.Projection("EPSG:4326") + ); + document.getElementById('fixmystreet.latitude').value = lonlat.lat || lonlat.y; + document.getElementById('fixmystreet.longitude').value = lonlat.lon || lonlat.x; +} - $(window).hashchange(function(){ - if (location.hash) return; - // Okay, back to around view. - fixmystreet.bbox_strategy.activate(); - fixmystreet.markers.refresh( { force: true } ); - fixmystreet.drag.deactivate(); - $('#side-form').hide(); - $('#side').show(); - $('#sub_map_links').show(); - fixmystreet.page = 'around'; - }); +function fixmystreet_activate_drag() { + fixmystreet.drag = new OpenLayers.Control.DragFeature( fixmystreet.markers, { + onComplete: function(feature, e) { + fixmystreet_update_pin( feature.geometry.clone() ); + } + } ); + fixmystreet.map.addControl( fixmystreet.drag ); + fixmystreet.drag.activate(); +} - // Vector layers must be added onload as IE sucks - if ($.browser.msie) { - $(window).load(fixmystreet_onload); - } else { - fixmystreet_onload(); +function fms_markers_list(pins, transform) { + var cols = { 'red':'R', 'green':'G', 'blue':'B', 'purple':'P' }; + var markers = []; + for (var i=0; i<pins.length; i++) { + var pin = pins[i]; + var loc = new OpenLayers.Geometry.Point(pin[1], pin[0]); + if (transform) { + // The Strategy does this for us, so don't do it in that case. + loc.transform( + new OpenLayers.Projection("EPSG:4326"), + fixmystreet.map.getProjectionObject() + ); + } + var marker = new OpenLayers.Feature.Vector(loc, { + type: cols[pin[2]], + id: pin[3], + title: pin[4] || '' + }); + markers.push( marker ); } -}); + return markers; +} function fixmystreet_onload() { if ( fixmystreet.area ) { @@ -78,15 +59,25 @@ function fixmystreet_onload() { } var pin_layer_options = { + rendererOptions: { + yOrdering: true + }, styleMap: new OpenLayers.StyleMap({ 'default': new OpenLayers.Style({ - externalGraphic: "/i/pin${type}.gif", + externalGraphic: "/i/pin${type}.png", graphicTitle: "${title}", - graphicWidth: 32, - graphicHeight: 59, + graphicWidth: 44, + graphicHeight: 58, graphicOpacity: 1, - graphicXOffset: -2, - graphicYOffset: -59 + graphicXOffset: -22, + graphicYOffset: -58, + backgroundGraphic: "/i/pin-shadow.png", + backgroundWidth: 50, + backgroundHeight: 19, + backgroundXOffset: -7, + backgroundYOffset: -19, + graphicZIndex: 11, + backgroundGraphicZIndex: 10 }) }) }; @@ -173,28 +164,68 @@ function fixmystreet_onload() { } -function fms_markers_list(pins, transform) { - var cols = { 'red':'R', 'green':'G', 'blue':'B', 'purple':'P' }; - var markers = []; - for (var i=0; i<pins.length; i++) { - var pin = pins[i]; - var loc = new OpenLayers.Geometry.Point(pin[1], pin[0]); - if (transform) { - // The Strategy does this for us, so don't do it in that case. - loc.transform( - new OpenLayers.Projection("EPSG:4326"), - fixmystreet.map.getProjectionObject() - ); - } - var marker = new OpenLayers.Feature.Vector(loc, { - type: cols[pin[2]], - id: pin[3], - title: pin[4] - }); - markers.push( marker ); +$(function(){ + + var perm = new OpenLayers.Control.Permalink(); + set_map_config(perm); + + fixmystreet.map = new OpenLayers.Map("map", { + controls: fixmystreet.controls, + displayProjection: new OpenLayers.Projection("EPSG:4326") + }); + + fixmystreet.layer_options = OpenLayers.Util.extend({ + zoomOffset: fixmystreet.zoomOffset, + transitionEffect: 'resize', + numZoomLevels: fixmystreet.numZoomLevels + }, fixmystreet.layer_options); + var layer = new fixmystreet.map_type("", fixmystreet.layer_options); + fixmystreet.map.addLayer(layer); + + if (!fixmystreet.map.getCenter()) { + var centre = new OpenLayers.LonLat( fixmystreet.longitude, fixmystreet.latitude ); + centre.transform( + new OpenLayers.Projection("EPSG:4326"), + fixmystreet.map.getProjectionObject() + ); + fixmystreet.map.setCenter(centre, fixmystreet.zoom || 3); + } + + if (document.getElementById('mapForm')) { + var click = new OpenLayers.Control.Click(); + fixmystreet.map.addControl(click); + click.activate(); } - return markers; -} + + /* To let permalink not be caught by the Click layer, answer found + * at http://www.mail-archive.com/users@openlayers.org/msg12958.html + * Not sure why you can't use eventListeners or events.register... + */ + OpenLayers.Event.observe( perm.element, "click", function(e) { + OpenLayers.Event.stop(e); + location.href = OpenLayers.Event.element(e).href; + return false; + }); + + $(window).hashchange(function(){ + if (location.hash) { return; } + // Okay, back to around view. + fixmystreet.bbox_strategy.activate(); + fixmystreet.markers.refresh( { force: true } ); + fixmystreet.drag.deactivate(); + $('#side-form').hide(); + $('#side').show(); + $('#sub_map_links').show(); + fixmystreet.page = 'around'; + }); + + // Vector layers must be added onload as IE sucks + if ($.browser.msie) { + $(window).load(fixmystreet_onload); + } else { + fixmystreet_onload(); + } +}); /* Overridding the buttonDown function of PanZoom so that it does zoomTo(0) rather than zoomToMaxExtent() @@ -261,10 +292,13 @@ OpenLayers.Format.FixMyStreet = OpenLayers.Class(OpenLayers.Format.JSON, { } else { obj = json; } - if (typeof(obj.current) != 'undefined') - document.getElementById('current').innerHTML = obj.current; - if (typeof(obj.current_near) != 'undefined') - document.getElementById('current_near').innerHTML = obj.current_near; + var current, current_near; + if (typeof(obj.current) != 'undefined' && (current = document.getElementById('current'))) { + current.innerHTML = obj.current; + } + if (typeof(obj.current_near) != 'undefined' && (current_near = document.getElementById('current_near'))) { + current_near.innerHTML = obj.current_near; + } var markers = fms_markers_list( obj.pins, false ); return markers; }, @@ -283,16 +317,14 @@ OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, { initialize: function(options) { this.handlerOptions = OpenLayers.Util.extend( - {}, this.defaultHandlerOptions - ); + {}, this.defaultHandlerOptions); OpenLayers.Control.prototype.initialize.apply( this, arguments ); this.handler = new OpenLayers.Handler.Click( this, { 'click': this.trigger - }, this.handlerOptions - ); + }, this.handlerOptions); }, trigger: function(e) { @@ -330,6 +362,13 @@ OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, { } }); $('#side-form').show(); + /* For some reason on IOS5 if you use the jQuery show method it + * doesn't display the JS validation error messages unless you do this + * or you cause a screen redraw by changing the phone orientation. + * NB: This has to happen after the call to show() */ + if ( navigator.userAgent.match(/like Mac OS X/i)) { + document.getElementById('side-form').style.display = 'block'; + } $('#side').hide(); $('#sub_map_links').hide(); fixmystreet.page = 'new'; @@ -337,24 +376,3 @@ OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, { } }); -// This function might be passed either an OpenLayers.LonLat (so has -// lon and lat) or an OpenLayers.Geometry.Point (so has x and y) -function fixmystreet_update_pin(lonlat) { - lonlat.transform( - fixmystreet.map.getProjectionObject(), - new OpenLayers.Projection("EPSG:4326") - ); - document.getElementById('fixmystreet.latitude').value = lonlat.lat || lonlat.y; - document.getElementById('fixmystreet.longitude').value = lonlat.lon || lonlat.x; -} - -function fixmystreet_activate_drag() { - fixmystreet.drag = new OpenLayers.Control.DragFeature( fixmystreet.markers, { - onComplete: function(feature, e) { - fixmystreet_update_pin( feature.geometry.clone() ); - } - } ); - fixmystreet.map.addControl( fixmystreet.drag ); - fixmystreet.drag.activate(); -} - diff --git a/web/jslib b/web/jslib new file mode 120000 index 000000000..5e9df2c7f --- /dev/null +++ b/web/jslib @@ -0,0 +1 @@ +../commonlib/jslib
\ No newline at end of file |