forms/upload.py: add pilot and co-pilot name
model.airspace: add extract_airspace method

Converts the stored height string into a int + reference string
using SI units
model.airspace: add get_airspace_infringements function
lib.xcsoar_.analysis: flight_path can be passed to analysis

Uploading a flight requires the flight path in several methods.
This allows us to share the data between those.
views.upload: share flightpath between methods
templates/macros/form.jinja: add error/help text to checkbox template
views.upload: ask for confirmation if any airspace penetrations were found

Hopefully prevent users to upload flights with unauthorized
airspace infringements.
mapserver: add mapserver basemap and mapproxy cache for osm + airspace
lib.sql: add query_to_sql method

Convert a sqlalchemy query to raw SQL
model.airspace: fix gathering of airspace infringement periods
templates/upload/details.jinja: render a nice airspace table
views.upload: create images of airspace intrusions
views.upload: make mapscript optional

Just don't create the images if no mapscript is available...
views.upload: make flake8 happy
model.airspace: simplify grouping of infringements

This method is both faster and more robust...
views.upload: scale image extent by factor 1.05
mapserver/basemap.map: add OSM copyright notice
mapserver/basemap.map: increase flight line width
config.default: add mapserver basepath
templates/upload: show warning sign on form errors