[osm2pgsql] 10/18: Imported Upstream version 0.90.0~rc1+ds

Sebastiaan Couwenberg sebastic at moszumanska.debian.org
Sat Feb 27 15:33:46 UTC 2016


This is an automated email from the git hooks/post-receive script.

sebastic pushed a commit to branch master
in repository osm2pgsql.

commit a134b29990b3b9f8dfdc6c66b252216f8a93b7d9
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Sat Feb 27 15:08:55 2016 +0100

    Imported Upstream version 0.90.0~rc1+ds
---
 contrib/libosmium/LICENSE.txt                      |   23 -
 contrib/libosmium/README.contrib                   |    2 -
 contrib/libosmium/README.md                        |  108 --
 contrib/libosmium/osmium/area/assembler.hpp        |  787 ---------------
 .../osmium/area/detail/node_ref_segment.hpp        |  262 -----
 .../libosmium/osmium/area/detail/proto_ring.hpp    |  277 -----
 .../libosmium/osmium/area/detail/segment_list.hpp  |  218 ----
 .../osmium/area/multipolygon_collector.hpp         |  223 ----
 contrib/libosmium/osmium/area/problem_reporter.hpp |  149 ---
 .../osmium/area/problem_reporter_exception.hpp     |   96 --
 .../libosmium/osmium/area/problem_reporter_ogr.hpp |  139 ---
 .../osmium/area/problem_reporter_stream.hpp        |   96 --
 contrib/libosmium/osmium/builder/builder.hpp       |  237 -----
 .../libosmium/osmium/builder/builder_helper.hpp    |  103 --
 .../osmium/builder/osm_object_builder.hpp          |  370 -------
 contrib/libosmium/osmium/diff_handler.hpp          |   67 --
 contrib/libosmium/osmium/diff_iterator.hpp         |  129 ---
 contrib/libosmium/osmium/diff_visitor.hpp          |  104 --
 contrib/libosmium/osmium/dynamic_handler.hpp       |  190 ----
 .../libosmium/osmium/experimental/flex_reader.hpp  |  137 ---
 contrib/libosmium/osmium/fwd.hpp                   |   70 --
 contrib/libosmium/osmium/geom/coordinates.hpp      |   96 --
 contrib/libosmium/osmium/geom/factory.hpp          |  419 --------
 contrib/libosmium/osmium/geom/geojson.hpp          |  160 ---
 contrib/libosmium/osmium/geom/geos.hpp             |  240 -----
 contrib/libosmium/osmium/geom/haversine.hpp        |   94 --
 .../libosmium/osmium/geom/mercator_projection.hpp  |  110 --
 contrib/libosmium/osmium/geom/ogr.hpp              |  178 ----
 contrib/libosmium/osmium/geom/projection.hpp       |  167 ---
 contrib/libosmium/osmium/geom/rapid_geojson.hpp    |  190 ----
 contrib/libosmium/osmium/geom/relations.hpp        |   57 --
 contrib/libosmium/osmium/geom/tile.hpp             |  101 --
 contrib/libosmium/osmium/geom/util.hpp             |   75 --
 contrib/libosmium/osmium/geom/wkb.hpp              |  273 -----
 contrib/libosmium/osmium/geom/wkt.hpp              |  156 ---
 contrib/libosmium/osmium/handler.hpp               |   94 --
 contrib/libosmium/osmium/handler/chain.hpp         |  128 ---
 contrib/libosmium/osmium/handler/disk_store.hpp    |  111 --
 contrib/libosmium/osmium/handler/dump.hpp          |  294 ------
 .../osmium/handler/node_locations_for_ways.hpp     |  180 ----
 .../libosmium/osmium/handler/object_relations.hpp  |  106 --
 contrib/libosmium/osmium/index/bool_vector.hpp     |   85 --
 .../osmium/index/detail/create_map_with_fd.hpp     |   71 --
 .../osmium/index/detail/mmap_vector_anon.hpp       |   67 --
 .../osmium/index/detail/mmap_vector_base.hpp       |  180 ----
 .../osmium/index/detail/mmap_vector_file.hpp       |   74 --
 contrib/libosmium/osmium/index/detail/tmpfile.hpp  |   62 --
 .../libosmium/osmium/index/detail/vector_map.hpp   |  246 -----
 .../osmium/index/detail/vector_multimap.hpp        |  186 ----
 contrib/libosmium/osmium/index/index.hpp           |  100 --
 contrib/libosmium/osmium/index/map.hpp             |  275 -----
 contrib/libosmium/osmium/index/map/all.hpp         |   46 -
 .../osmium/index/map/dense_file_array.hpp          |   67 --
 .../libosmium/osmium/index/map/dense_mem_array.hpp |   57 --
 .../osmium/index/map/dense_mmap_array.hpp          |   60 --
 contrib/libosmium/osmium/index/map/dummy.hpp       |   88 --
 .../osmium/index/map/sparse_file_array.hpp         |   67 --
 .../osmium/index/map/sparse_mem_array.hpp          |   60 --
 .../libosmium/osmium/index/map/sparse_mem_map.hpp  |  116 ---
 .../osmium/index/map/sparse_mem_table.hpp          |  147 ---
 .../osmium/index/map/sparse_mmap_array.hpp         |   60 --
 contrib/libosmium/osmium/index/multimap.hpp        |  127 ---
 contrib/libosmium/osmium/index/multimap/all.hpp    |   41 -
 contrib/libosmium/osmium/index/multimap/hybrid.hpp |  204 ----
 .../osmium/index/multimap/sparse_file_array.hpp    |   54 -
 .../osmium/index/multimap/sparse_mem_array.hpp     |   58 --
 .../osmium/index/multimap/sparse_mem_multimap.hpp  |  151 ---
 .../osmium/index/multimap/sparse_mmap_array.hpp    |   58 --
 .../libosmium/osmium/index/node_locations_map.hpp  |   70 --
 contrib/libosmium/osmium/io/any_compression.hpp    |   48 -
 contrib/libosmium/osmium/io/any_input.hpp          |   52 -
 contrib/libosmium/osmium/io/any_output.hpp         |   53 -
 contrib/libosmium/osmium/io/bzip2_compression.hpp  |  321 ------
 contrib/libosmium/osmium/io/compression.hpp        |  321 ------
 contrib/libosmium/osmium/io/debug_output.hpp       |   39 -
 .../osmium/io/detail/debug_output_format.hpp       |  485 ---------
 .../libosmium/osmium/io/detail/input_format.hpp    |  211 ----
 .../osmium/io/detail/o5m_input_format.hpp          |  633 ------------
 .../osmium/io/detail/opl_output_format.hpp         |  261 -----
 .../libosmium/osmium/io/detail/output_format.hpp   |  184 ----
 contrib/libosmium/osmium/io/detail/pbf.hpp         |   89 --
 contrib/libosmium/osmium/io/detail/pbf_decoder.hpp |  777 --------------
 .../osmium/io/detail/pbf_input_format.hpp          |  242 -----
 .../osmium/io/detail/pbf_output_format.hpp         |  643 ------------
 .../libosmium/osmium/io/detail/protobuf_tags.hpp   |  170 ----
 contrib/libosmium/osmium/io/detail/queue_util.hpp  |  157 ---
 contrib/libosmium/osmium/io/detail/read_thread.hpp |  133 ---
 contrib/libosmium/osmium/io/detail/read_write.hpp  |  180 ----
 .../libosmium/osmium/io/detail/string_table.hpp    |  265 -----
 contrib/libosmium/osmium/io/detail/string_util.hpp |  206 ----
 .../libosmium/osmium/io/detail/write_thread.hpp    |  107 --
 .../osmium/io/detail/xml_input_format.hpp          |  679 -------------
 .../osmium/io/detail/xml_output_format.hpp         |  473 ---------
 contrib/libosmium/osmium/io/detail/zlib.hpp        |  115 ---
 contrib/libosmium/osmium/io/error.hpp              |   70 --
 contrib/libosmium/osmium/io/file.hpp               |  328 ------
 contrib/libosmium/osmium/io/file_compression.hpp   |   72 --
 contrib/libosmium/osmium/io/file_format.hpp        |   84 --
 contrib/libosmium/osmium/io/gzip_compression.hpp   |  277 -----
 contrib/libosmium/osmium/io/header.hpp             |  122 ---
 contrib/libosmium/osmium/io/input_iterator.hpp     |  178 ----
 contrib/libosmium/osmium/io/o5m_input.hpp          |   45 -
 contrib/libosmium/osmium/io/opl_output.hpp         |   39 -
 contrib/libosmium/osmium/io/output_iterator.hpp    |  133 ---
 contrib/libosmium/osmium/io/overwrite.hpp          |   39 -
 contrib/libosmium/osmium/io/pbf_input.hpp          |   48 -
 contrib/libosmium/osmium/io/pbf_output.hpp         |   48 -
 contrib/libosmium/osmium/io/reader.hpp             |  380 -------
 contrib/libosmium/osmium/io/reader_iterator.hpp    |   51 -
 contrib/libosmium/osmium/io/writer.hpp             |  344 -------
 contrib/libosmium/osmium/io/writer_options.hpp     |   60 --
 contrib/libosmium/osmium/io/xml_input.hpp          |   48 -
 contrib/libosmium/osmium/io/xml_output.hpp         |   47 -
 contrib/libosmium/osmium/memory/buffer.hpp         |  617 -----------
 contrib/libosmium/osmium/memory/collection.hpp     |  153 ---
 contrib/libosmium/osmium/memory/item.hpp           |  177 ----
 contrib/libosmium/osmium/memory/item_iterator.hpp  |  234 -----
 .../libosmium/osmium/object_pointer_collection.hpp |  112 --
 contrib/libosmium/osmium/osm.hpp                   |   48 -
 contrib/libosmium/osmium/osm/area.hpp              |  215 ----
 contrib/libosmium/osmium/osm/box.hpp               |  250 -----
 contrib/libosmium/osmium/osm/changeset.hpp         |  458 ---------
 contrib/libosmium/osmium/osm/crc.hpp               |  242 -----
 contrib/libosmium/osmium/osm/diff_object.hpp       |  180 ----
 contrib/libosmium/osmium/osm/entity.hpp            |   80 --
 contrib/libosmium/osmium/osm/entity_bits.hpp       |  105 --
 contrib/libosmium/osmium/osm/item_type.hpp         |  200 ----
 contrib/libosmium/osmium/osm/location.hpp          |  285 ------
 contrib/libosmium/osmium/osm/node.hpp              |   76 --
 contrib/libosmium/osmium/osm/node_ref.hpp          |  173 ----
 contrib/libosmium/osmium/osm/node_ref_list.hpp     |  184 ----
 contrib/libosmium/osmium/osm/object.hpp            |  438 --------
 .../libosmium/osmium/osm/object_comparisons.hpp    |  110 --
 contrib/libosmium/osmium/osm/relation.hpp          |  194 ----
 contrib/libosmium/osmium/osm/segment.hpp           |  105 --
 contrib/libosmium/osmium/osm/tag.hpp               |  140 ---
 contrib/libosmium/osmium/osm/timestamp.hpp         |  193 ----
 contrib/libosmium/osmium/osm/types.hpp             |   66 --
 contrib/libosmium/osmium/osm/types_from_string.hpp |  122 ---
 .../libosmium/osmium/osm/undirected_segment.hpp    |  100 --
 contrib/libosmium/osmium/osm/way.hpp               |  117 ---
 contrib/libosmium/osmium/relations/collector.hpp   |  544 ----------
 .../osmium/relations/detail/member_meta.hpp        |  158 ---
 .../osmium/relations/detail/relation_meta.hpp      |  136 ---
 contrib/libosmium/osmium/tags/filter.hpp           |  162 ---
 contrib/libosmium/osmium/tags/regex_filter.hpp     |   58 --
 contrib/libosmium/osmium/tags/taglist.hpp          |   67 --
 .../libosmium/osmium/thread/function_wrapper.hpp   |  123 ---
 contrib/libosmium/osmium/thread/pool.hpp           |  190 ----
 contrib/libosmium/osmium/thread/queue.hpp          |  192 ----
 contrib/libosmium/osmium/thread/sorted_queue.hpp   |  159 ---
 contrib/libosmium/osmium/thread/util.hpp           |  116 ---
 contrib/libosmium/osmium/util/cast.hpp             |  103 --
 contrib/libosmium/osmium/util/compatibility.hpp    |   56 -
 contrib/libosmium/osmium/util/config.hpp           |   72 --
 contrib/libosmium/osmium/util/data_file.hpp        |  194 ----
 contrib/libosmium/osmium/util/delta.hpp            |  174 ----
 contrib/libosmium/osmium/util/double.hpp           |   93 --
 contrib/libosmium/osmium/util/endian.hpp           |   45 -
 contrib/libosmium/osmium/util/file.hpp             |  121 ---
 contrib/libosmium/osmium/util/memory_mapping.hpp   |  757 --------------
 contrib/libosmium/osmium/util/minmax.hpp           |  120 ---
 contrib/libosmium/osmium/util/options.hpp          |  165 ---
 contrib/libosmium/osmium/util/string.hpp           |  102 --
 contrib/libosmium/osmium/util/verbose_output.hpp   |  139 ---
 contrib/libosmium/osmium/visitor.hpp               |  258 -----
 contrib/libosmium/protozero/byteswap.hpp           |   69 --
 contrib/libosmium/protozero/exception.hpp          |   68 --
 contrib/libosmium/protozero/pbf_builder.hpp        |  137 ---
 contrib/libosmium/protozero/pbf_message.hpp        |   94 --
 contrib/libosmium/protozero/pbf_reader.hpp         | 1067 --------------------
 contrib/libosmium/protozero/pbf_types.hpp          |   49 -
 contrib/libosmium/protozero/pbf_writer.hpp         |  666 ------------
 contrib/libosmium/protozero/varint.hpp             |  132 ---
 contrib/libosmium/protozero/version.hpp            |   22 -
 175 files changed, 31132 deletions(-)

diff --git a/contrib/libosmium/LICENSE.txt b/contrib/libosmium/LICENSE.txt
deleted file mode 100644
index 36b7cd9..0000000
--- a/contrib/libosmium/LICENSE.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
diff --git a/contrib/libosmium/README.contrib b/contrib/libosmium/README.contrib
deleted file mode 100644
index d6011be..0000000
--- a/contrib/libosmium/README.contrib
+++ /dev/null
@@ -1,2 +0,0 @@
-Source: https://github.com/osmcode/libosmium
-Revision: v2.5.1
diff --git a/contrib/libosmium/README.md b/contrib/libosmium/README.md
deleted file mode 100644
index 9ac5a70..0000000
--- a/contrib/libosmium/README.md
+++ /dev/null
@@ -1,108 +0,0 @@
-# Libosmium
-
-http://osmcode.org/libosmium
-
-A fast and flexible C++ library for working with OpenStreetMap data.
-
-[![Build Status](https://secure.travis-ci.org/osmcode/libosmium.png)](https://travis-ci.org/osmcode/libosmium)
-[![Build status](https://ci.appveyor.com/api/projects/status/mkbg6e6stdgq7c1b?svg=true)](https://ci.appveyor.com/project/Mapbox/libosmium)
-
-Libosmium is developed on Linux, but also works on OSX and Windows (with some
-limitations).
-
-There are a few applications that use the Osmium library in the examples
-directory. See the [osmium-contrib](http://github.com/osmcode/osmium-contrib)
-repository for more example code.
-
-## Prerequisites
-
-Because Libosmium uses many C++11 features you need a modern compiler and
-standard C++ library. Osmium needs at least GCC 4.8 or clang (LLVM) 3.4.
-(Some parts may work with older versions.)
-
-Different parts of Libosmium (and the applications built on top of it) need
-different libraries. You DO NOT NEED to install all of them, just install those
-you need for your programs.
-
-For details see the
-[list of dependencies](https://github.com/osmcode/libosmium/wiki/Libosmium-dependencies).
-
-The [protozero](https://github.com/mapbox/protozero) and
-[utf8-cpp](http://utfcpp.sourceforge.net/) header-only libraries are included
-in the libosmium repository.
-
-
-## Directories
-
-* benchmarks: Some benchmarks checking different parts of Libosmium.
-
-* cmake: CMake configuration scripts.
-
-* doc: Config for documentation.
-
-* examples: Osmium example applications.
-
-* include: C/C++ include files. All of Libosmium is in those header files
-  which are needed for building Osmium applications.
-
-* test: Tests (see below).
-
-
-## Building
-
-Osmium is a header-only library, so there is nothing to build for the
-library itself.
-
-But there are some tests and examples that can be build. Libosmium uses
-cmake:
-
-    mkdir build
-    cd build
-    cmake ..
-    make
-
-This will build the examples and tests. Call `ctest` to run the tests.
-
-For more see the
-[Libosmium Wiki](https://github.com/osmcode/libosmium/wiki/Building-Libosmium).
-
-
-## Testing
-
-See the
-[Libosmium Wiki](https://github.com/osmcode/libosmium/wiki/Testing-Libosmium)
-for instructions.
-
-
-## Osmium on 32bit Machines
-
-Osmium works well on 64 bit machines, but on 32 bit machines there are some
-problems. Be aware that not everything will work on 32 bit architectures.
-This is mostly due to the 64 bit needed for node IDs. Also Osmium hasn't been
-tested well on 32 bit systems. Here are some issues you might run into:
-
-* Google Sparsehash does not work on 32 bit machines in our use case.
-* The `mmap` system call is called with a `size_t` argument, so it can't
-  give you more than 4GByte of memory on 32 bit systems. This might be a
-  problem.
-
-Please report any issues you have and we might be able to solve them.
-
-
-## Switching from the old Osmium
-
-If you have been using the old version of Osmium at
-https://github.com/joto/osmium you might want to read about the
-[changes needed](https://github.com/osmcode/libosmium/wiki/Changes-from-old-versions-of-Osmium).
-
-
-## License
-
-Libosmium is available under the Boost Software License. See LICENSE.txt.
-
-
-## Authors
-
-Libosmium was mainly written and is maintained by Jochen Topf
-(jochen at topf.org). See the git commit log for other authors.
-
diff --git a/contrib/libosmium/osmium/area/assembler.hpp b/contrib/libosmium/osmium/area/assembler.hpp
deleted file mode 100644
index 87feea2..0000000
--- a/contrib/libosmium/osmium/area/assembler.hpp
+++ /dev/null
@@ -1,787 +0,0 @@
-#ifndef OSMIUM_AREA_ASSEMBLER_HPP
-#define OSMIUM_AREA_ASSEMBLER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <cassert>
-#include <cstring>
-#include <iostream>
-#include <iterator>
-#include <list>
-#include <set>
-#include <string>
-#include <map>
-#include <vector>
-
-#include <osmium/builder/osm_object_builder.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm/area.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/relation.hpp>
-#include <osmium/tags/filter.hpp>
-
-#include <osmium/area/detail/proto_ring.hpp>
-#include <osmium/area/detail/node_ref_segment.hpp>
-#include <osmium/area/detail/segment_list.hpp>
-#include <osmium/area/problem_reporter.hpp>
-
-namespace osmium {
-
-    namespace area {
-
-        using osmium::area::detail::ProtoRing;
-
-        struct AssemblerConfig {
-
-            osmium::area::ProblemReporter* problem_reporter;
-
-            // Enables debug output to stderr
-            bool debug;
-
-            explicit AssemblerConfig(osmium::area::ProblemReporter* pr = nullptr, bool d = false) :
-                problem_reporter(pr),
-                debug(d) {
-            }
-
-            /**
-             * Enable or disable debug output to stderr. This is for Osmium
-             * developers only.
-             */
-            void enable_debug_output(bool d = true) {
-                debug = d;
-            }
-
-        }; // struct AssemblerConfig
-
-        /**
-         * Assembles area objects from multipolygon relations and their
-         * members. This is called by the MultipolygonCollector object
-         * after all members have been collected.
-         */
-        class Assembler {
-
-            const AssemblerConfig m_config;
-
-            // The way segments
-            osmium::area::detail::SegmentList m_segment_list;
-
-            // The rings we are building from the way segments
-            std::list<ProtoRing> m_rings;
-
-            std::vector<ProtoRing*> m_outer_rings;
-            std::vector<ProtoRing*> m_inner_rings;
-
-            int m_inner_outer_mismatches { 0 };
-
-            bool debug() const {
-                return m_config.debug;
-            }
-
-            /**
-             * Checks whether the given NodeRefs have the same location.
-             * Uses the actual location for the test, not the id. If both
-             * have the same location, but not the same id, a problem
-             * point will be added to the list of problem points.
-             */
-            bool has_same_location(const osmium::NodeRef& nr1, const osmium::NodeRef& nr2) {
-                if (nr1.location() != nr2.location()) {
-                    return false;
-                }
-                if (nr1.ref() != nr2.ref()) {
-                    if (m_config.problem_reporter) {
-                        m_config.problem_reporter->report_duplicate_node(nr1.ref(), nr2.ref(), nr1.location());
-                    }
-                }
-                return true;
-            }
-
-            void add_tags_to_area(osmium::builder::AreaBuilder& builder, const osmium::Way& way) const {
-                osmium::builder::TagListBuilder tl_builder(builder.buffer(), &builder);
-                for (const osmium::Tag& tag : way.tags()) {
-                    tl_builder.add_tag(tag.key(), tag.value());
-                }
-            }
-
-            void add_common_tags(osmium::builder::TagListBuilder& tl_builder, std::set<const osmium::Way*>& ways) const {
-                std::map<std::string, size_t> counter;
-                for (const osmium::Way* way : ways) {
-                    for (const auto& tag : way->tags()) {
-                        std::string kv {tag.key()};
-                        kv.append(1, '\0');
-                        kv.append(tag.value());
-                        ++counter[kv];
-                    }
-                }
-
-                size_t num_ways = ways.size();
-                for (const auto& t_c : counter) {
-                    if (debug()) {
-                        std::cerr << "        tag " << t_c.first << " is used " << t_c.second << " times in " << num_ways << " ways\n";
-                    }
-                    if (t_c.second == num_ways) {
-                        size_t len = std::strlen(t_c.first.c_str());
-                        tl_builder.add_tag(t_c.first.c_str(), t_c.first.c_str() + len + 1);
-                    }
-                }
-            }
-
-            struct MPFilter : public osmium::tags::KeyFilter {
-
-                MPFilter() : osmium::tags::KeyFilter(true) {
-                    add(false, "type");
-                    add(false, "created_by");
-                    add(false, "source");
-                    add(false, "note");
-                    add(false, "test:id");
-                    add(false, "test:section");
-                }
-
-            }; // struct MPFilter
-
-            static MPFilter& filter() {
-                static MPFilter filter;
-                return filter;
-            }
-
-            void add_tags_to_area(osmium::builder::AreaBuilder& builder, const osmium::Relation& relation) const {
-                const auto count = std::count_if(relation.tags().begin(), relation.tags().end(), filter());
-
-                if (debug()) {
-                    std::cerr << "  found " << count << " tags on relation (without ignored ones)\n";
-                }
-
-                if (count > 0) {
-                    if (debug()) {
-                        std::cerr << "    use tags from relation\n";
-                    }
-
-                    // write out all tags except type=*
-                    osmium::builder::TagListBuilder tl_builder(builder.buffer(), &builder);
-                    for (const osmium::Tag& tag : relation.tags()) {
-                        if (strcmp(tag.key(), "type")) {
-                            tl_builder.add_tag(tag.key(), tag.value());
-                        }
-                    }
-                } else {
-                    if (debug()) {
-                        std::cerr << "    use tags from outer ways\n";
-                    }
-                    std::set<const osmium::Way*> ways;
-                    for (const auto& ring : m_outer_rings) {
-                        ring->get_ways(ways);
-                    }
-                    if (ways.size() == 1) {
-                        if (debug()) {
-                            std::cerr << "      only one outer way\n";
-                        }
-                        osmium::builder::TagListBuilder tl_builder(builder.buffer(), &builder);
-                        for (const osmium::Tag& tag : (*ways.begin())->tags()) {
-                            tl_builder.add_tag(tag.key(), tag.value());
-                        }
-                    } else {
-                        if (debug()) {
-                            std::cerr << "      multiple outer ways, get common tags\n";
-                        }
-                        osmium::builder::TagListBuilder tl_builder(builder.buffer(), &builder);
-                        add_common_tags(tl_builder, ways);
-                    }
-                }
-            }
-
-            /**
-             * Go through all the rings and find rings that are not closed.
-             * Problems are reported through the problem reporter.
-             *
-             * @returns true if any rings were not closed, false otherwise
-             */
-            bool check_for_open_rings() {
-                bool open_rings = false;
-
-                for (const auto& ring : m_rings) {
-                    if (!ring.closed()) {
-                        open_rings = true;
-                        if (m_config.problem_reporter) {
-                            m_config.problem_reporter->report_ring_not_closed(ring.get_segment_front().first().location(), ring.get_segment_back().second().location());
-                        }
-                    }
-                }
-
-                return open_rings;
-            }
-
-            /**
-             * Check whether there are any rings that can be combined with the
-             * given ring to one larger ring by appending the other ring to
-             * the end of this ring.
-             * If the rings can be combined they are and the function returns
-             * true.
-             */
-            bool possibly_combine_rings_back(ProtoRing& ring) {
-                const osmium::NodeRef& nr = ring.get_segment_back().second();
-
-                if (debug()) {
-                    std::cerr << "      possibly_combine_rings_back()\n";
-                }
-                for (auto it = m_rings.begin(); it != m_rings.end(); ++it) {
-                    if (&*it != &ring && !it->closed()) {
-                        if (has_same_location(nr, it->get_segment_front().first())) {
-                            if (debug()) {
-                                std::cerr << "      ring.last=it->first\n";
-                            }
-                            ring.merge_ring(*it, debug());
-                            m_rings.erase(it);
-                            return true;
-                        }
-                        if (has_same_location(nr, it->get_segment_back().second())) {
-                            if (debug()) {
-                                std::cerr << "      ring.last=it->last\n";
-                            }
-                            ring.merge_ring_reverse(*it, debug());
-                            m_rings.erase(it);
-                            return true;
-                        }
-                    }
-                }
-                return false;
-            }
-
-            /**
-             * Check whether there are any rings that can be combined with the
-             * given ring to one larger ring by prepending the other ring to
-             * the start of this ring.
-             * If the rings can be combined they are and the function returns
-             * true.
-             */
-            bool possibly_combine_rings_front(ProtoRing& ring) {
-                const osmium::NodeRef& nr = ring.get_segment_front().first();
-
-                if (debug()) {
-                    std::cerr << "      possibly_combine_rings_front()\n";
-                }
-                for (auto it = m_rings.begin(); it != m_rings.end(); ++it) {
-                    if (&*it != &ring && !it->closed()) {
-                        if (has_same_location(nr, it->get_segment_back().second())) {
-                            if (debug()) {
-                                std::cerr << "      ring.first=it->last\n";
-                            }
-                            ring.swap_segments(*it);
-                            ring.merge_ring(*it, debug());
-                            m_rings.erase(it);
-                            return true;
-                        }
-                        if (has_same_location(nr, it->get_segment_front().first())) {
-                            if (debug()) {
-                                std::cerr << "      ring.first=it->first\n";
-                            }
-                            ring.reverse();
-                            ring.merge_ring(*it, debug());
-                            m_rings.erase(it);
-                            return true;
-                        }
-                    }
-                }
-                return false;
-            }
-
-            void split_off_subring(osmium::area::detail::ProtoRing& ring, osmium::area::detail::ProtoRing::segments_type::iterator it, osmium::area::detail::ProtoRing::segments_type::iterator it_begin, osmium::area::detail::ProtoRing::segments_type::iterator it_end) {
-                if (debug()) {
-                    std::cerr << "        subring found at: " << *it << "\n";
-                }
-                ProtoRing new_ring(it_begin, it_end);
-                ring.remove_segments(it_begin, it_end);
-                if (debug()) {
-                    std::cerr << "        split into two rings:\n";
-                    std::cerr << "          " << new_ring << "\n";
-                    std::cerr << "          " << ring << "\n";
-                }
-                m_rings.push_back(std::move(new_ring));
-            }
-
-            bool has_closed_subring_back(ProtoRing& ring, const NodeRef& nr) {
-                if (ring.segments().size() < 3) {
-                    return false;
-                }
-                if (debug()) {
-                    std::cerr << "      has_closed_subring_back()\n";
-                }
-                const auto end = ring.segments().end();
-                for (auto it = ring.segments().begin() + 1; it != end - 1; ++it) {
-                    if (has_same_location(nr, it->first())) {
-                        split_off_subring(ring, it, it, end);
-                        return true;
-                    }
-                }
-                return false;
-            }
-
-            bool has_closed_subring_front(ProtoRing& ring, const NodeRef& nr) {
-                if (ring.segments().size() < 3) {
-                    return false;
-                }
-                if (debug()) {
-                    std::cerr << "      has_closed_subring_front()\n";
-                }
-                const auto end = ring.segments().end();
-                for (auto it = ring.segments().begin() + 1; it != end - 1; ++it) {
-                    if (has_same_location(nr, it->second())) {
-                        split_off_subring(ring, it, ring.segments().begin(), it+1);
-                        return true;
-                    }
-                }
-                return false;
-            }
-
-            bool check_for_closed_subring(ProtoRing& ring) {
-                if (debug()) {
-                    std::cerr << "      check_for_closed_subring()\n";
-                }
-
-                osmium::area::detail::ProtoRing::segments_type segments(ring.segments().size());
-                std::copy(ring.segments().begin(), ring.segments().end(), segments.begin());
-                std::sort(segments.begin(), segments.end());
-                const auto it = std::adjacent_find(segments.begin(), segments.end(), [this](const osmium::area::detail::NodeRefSegment& s1, const osmium::area::detail::NodeRefSegment& s2) {
-                    return has_same_location(s1.first(), s2.first());
-                });
-                if (it == segments.end()) {
-                    return false;
-                }
-                const auto r1 = std::find_first_of(ring.segments().begin(), ring.segments().end(), it, it+1);
-                assert(r1 != ring.segments().end());
-                const auto r2 = std::find_first_of(ring.segments().begin(), ring.segments().end(), it+1, it+2);
-                assert(r2 != ring.segments().end());
-
-                if (debug()) {
-                    std::cerr << "      found subring in ring " << ring << " at " << it->first() << "\n";
-                }
-
-                const auto m = std::minmax(r1, r2);
-
-                ProtoRing new_ring(m.first, m.second);
-                ring.remove_segments(m.first, m.second);
-
-                if (debug()) {
-                    std::cerr << "        split ring1=" << new_ring << "\n";
-                    std::cerr << "        split ring2=" << ring << "\n";
-                }
-
-                m_rings.emplace_back(new_ring);
-
-                return true;
-            }
-
-            void combine_rings_front(const osmium::area::detail::NodeRefSegment& segment, ProtoRing& ring) {
-                if (debug()) {
-                    std::cerr << " => match at front of ring\n";
-                }
-                ring.add_segment_front(segment);
-                has_closed_subring_front(ring, segment.first());
-                if (possibly_combine_rings_front(ring)) {
-                    check_for_closed_subring(ring);
-                }
-            }
-
-            void combine_rings_back(const osmium::area::detail::NodeRefSegment& segment, ProtoRing& ring) {
-                if (debug()) {
-                    std::cerr << " => match at back of ring\n";
-                }
-                ring.add_segment_back(segment);
-                has_closed_subring_back(ring, segment.second());
-                if (possibly_combine_rings_back(ring)) {
-                    check_for_closed_subring(ring);
-                }
-            }
-
-            /**
-             * Append each outer ring together with its inner rings to the
-             * area in the buffer.
-             */
-            void add_rings_to_area(osmium::builder::AreaBuilder& builder) const {
-                for (const ProtoRing* ring : m_outer_rings) {
-                    if (debug()) {
-                        std::cerr << "    ring " << *ring << " is outer\n";
-                    }
-                    {
-                        osmium::builder::OuterRingBuilder ring_builder(builder.buffer(), &builder);
-                        ring_builder.add_node_ref(ring->get_segment_front().first());
-                        for (const auto& segment : ring->segments()) {
-                            ring_builder.add_node_ref(segment.second());
-                        }
-                    }
-                    for (ProtoRing* inner : ring->inner_rings()) {
-                        osmium::builder::InnerRingBuilder ring_builder(builder.buffer(), &builder);
-                        ring_builder.add_node_ref(inner->get_segment_front().first());
-                        for (const auto& segment : inner->segments()) {
-                            ring_builder.add_node_ref(segment.second());
-                        }
-                    }
-                }
-            }
-
-            bool add_to_existing_ring(osmium::area::detail::NodeRefSegment segment) {
-                int n = 0;
-                for (auto& ring : m_rings) {
-                    if (debug()) {
-                        std::cerr << "    check against ring " << n << " " << ring;
-                    }
-                    if (ring.closed()) {
-                        if (debug()) {
-                            std::cerr << " => ring CLOSED\n";
-                        }
-                    } else {
-                        if (has_same_location(ring.get_segment_back().second(), segment.first())) {
-                            combine_rings_back(segment, ring);
-                            return true;
-                        }
-                        if (has_same_location(ring.get_segment_back().second(), segment.second())) {
-                            segment.swap_locations();
-                            combine_rings_back(segment, ring);
-                            return true;
-                        }
-                        if (has_same_location(ring.get_segment_front().first(), segment.first())) {
-                            segment.swap_locations();
-                            combine_rings_front(segment, ring);
-                            return true;
-                        }
-                        if (has_same_location(ring.get_segment_front().first(), segment.second())) {
-                            combine_rings_front(segment, ring);
-                            return true;
-                        }
-                        if (debug()) {
-                            std::cerr << " => no match\n";
-                        }
-                    }
-
-                    ++n;
-                }
-                return false;
-            }
-
-            void check_inner_outer(ProtoRing& ring) {
-                const osmium::NodeRef& min_node = ring.min_node();
-                if (debug()) {
-                    std::cerr << "    check_inner_outer min_node=" << min_node << "\n";
-                }
-
-                int count = 0;
-                int above = 0;
-
-                for (auto it = m_segment_list.begin(); it != m_segment_list.end() && it->first().location().x() <= min_node.location().x(); ++it) {
-                    if (!ring.contains(*it)) {
-                        if (debug()) {
-                            std::cerr << "      segments for count: " << *it;
-                        }
-                        if (it->to_left_of(min_node.location())) {
-                            ++count;
-                            if (debug()) {
-                                std::cerr << " counted\n";
-                            }
-                        } else {
-                            if (debug()) {
-                                std::cerr << " not counted\n";
-                            }
-                        }
-                        if (it->first().location() == min_node.location()) {
-                            if (it->second().location().y() > min_node.location().y()) {
-                                ++above;
-                            }
-                        }
-                        if (it->second().location() == min_node.location()) {
-                            if (it->first().location().y() > min_node.location().y()) {
-                                ++above;
-                            }
-                        }
-                    }
-                }
-
-                if (debug()) {
-                    std::cerr << "      count=" << count << " above=" << above << "\n";
-                }
-
-                count += above % 2;
-
-                if (count % 2) {
-                    ring.set_inner();
-                }
-            }
-
-            void check_inner_outer_roles() {
-                if (debug()) {
-                    std::cerr << "    check_inner_outer_roles\n";
-                }
-
-                for (const auto ringptr : m_outer_rings) {
-                    for (const auto& segment : ringptr->segments()) {
-                        if (!segment.role_outer()) {
-                            ++m_inner_outer_mismatches;
-                            if (debug()) {
-                                std::cerr << "      segment " << segment << " from way " << segment.way()->id() << " should have role 'outer'\n";
-                            }
-                            if (m_config.problem_reporter) {
-                                m_config.problem_reporter->report_role_should_be_outer(segment.way()->id(), segment.first().location(), segment.second().location());
-                            }
-                        }
-                    }
-                }
-                for (const auto ringptr : m_inner_rings) {
-                    for (const auto& segment : ringptr->segments()) {
-                        if (!segment.role_inner()) {
-                            ++m_inner_outer_mismatches;
-                            if (debug()) {
-                                std::cerr << "      segment " << segment << " from way " << segment.way()->id() << " should have role 'inner'\n";
-                            }
-                            if (m_config.problem_reporter) {
-                                m_config.problem_reporter->report_role_should_be_inner(segment.way()->id(), segment.first().location(), segment.second().location());
-                            }
-                        }
-                    }
-                }
-            }
-
-            /**
-             * Create rings from segments.
-             */
-            bool create_rings() {
-                m_segment_list.sort();
-                m_segment_list.erase_duplicate_segments();
-
-                // Now we look for segments crossing each other. If there are
-                // any, the multipolygon is invalid.
-                // In the future this could be improved by trying to fix those
-                // cases.
-                if (m_segment_list.find_intersections(m_config.problem_reporter)) {
-                    return false;
-                }
-
-                // Now iterator over all segments and add them to rings. Each segment
-                // is tacked on to either end of an existing ring if possible, or a
-                // new ring is started with it.
-                for (const auto& segment : m_segment_list) {
-                    if (debug()) {
-                        std::cerr << "  checking segment " << segment << "\n";
-                    }
-                    if (!add_to_existing_ring(segment)) {
-                        if (debug()) {
-                            std::cerr << "    new ring for segment " << segment << "\n";
-                        }
-                        m_rings.emplace_back(segment);
-                    }
-                }
-
-                if (debug()) {
-                    std::cerr << "  Rings:\n";
-                    for (const auto& ring : m_rings) {
-                        std::cerr << "    " << ring;
-                        if (ring.closed()) {
-                            std::cerr << " (closed)";
-                        }
-                        std::cerr << "\n";
-                    }
-                }
-
-                if (check_for_open_rings()) {
-                    if (debug()) {
-                        std::cerr << "  not all rings are closed\n";
-                    }
-                    return false;
-                }
-
-                if (debug()) {
-                    std::cerr << "  Find inner/outer...\n";
-                }
-
-                if (m_rings.size() == 1) {
-                    m_outer_rings.push_back(&m_rings.front());
-                } else {
-                    for (auto& ring : m_rings) {
-                        check_inner_outer(ring);
-                        if (ring.outer()) {
-                            if (!ring.is_cw()) {
-                                ring.reverse();
-                            }
-                            m_outer_rings.push_back(&ring);
-                        } else {
-                            if (ring.is_cw()) {
-                                ring.reverse();
-                            }
-                            m_inner_rings.push_back(&ring);
-                        }
-                    }
-
-                    if (m_outer_rings.size() == 1) {
-                        for (auto inner : m_inner_rings) {
-                            m_outer_rings.front()->add_inner_ring(inner);
-                        }
-                    } else {
-                        // sort outer rings by size, smallest first
-                        std::sort(m_outer_rings.begin(), m_outer_rings.end(), [](ProtoRing* a, ProtoRing* b) {
-                            return a->area() < b->area();
-                        });
-                        for (auto inner : m_inner_rings) {
-                            for (auto outer : m_outer_rings) {
-                                if (inner->is_in(outer)) {
-                                    outer->add_inner_ring(inner);
-                                    break;
-                                }
-                            }
-                        }
-                    }
-                }
-
-                check_inner_outer_roles();
-
-                return true;
-            }
-
-        public:
-
-            typedef osmium::area::AssemblerConfig config_type;
-
-            explicit Assembler(const config_type& config) :
-                m_config(config),
-                m_segment_list(config.debug) {
-            }
-
-            ~Assembler() = default;
-
-            /**
-             * Assemble an area from the given way.
-             * The resulting area is put into the out_buffer.
-             */
-            void operator()(const osmium::Way& way, osmium::memory::Buffer& out_buffer) {
-                if (m_config.problem_reporter) {
-                    m_config.problem_reporter->set_object(osmium::item_type::way, way.id());
-                }
-
-                if (!way.ends_have_same_id()) {
-                    if (m_config.problem_reporter) {
-                        m_config.problem_reporter->report_duplicate_node(way.nodes().front().ref(), way.nodes().back().ref(), way.nodes().front().location());
-                    }
-                }
-
-                m_segment_list.extract_segments_from_way(way, "outer");
-
-                if (debug()) {
-                    std::cerr << "\nBuild way id()=" << way.id() << " segments.size()=" << m_segment_list.size() << "\n";
-                }
-
-                // Now create the Area object and add the attributes and tags
-                // from the relation.
-                {
-                    osmium::builder::AreaBuilder builder(out_buffer);
-                    builder.initialize_from_object(way);
-
-                    if (create_rings()) {
-                        add_tags_to_area(builder, way);
-                        add_rings_to_area(builder);
-                    }
-                }
-                out_buffer.commit();
-            }
-
-            /**
-             * Assemble an area from the given relation and its members.
-             * All members are to be found in the in_buffer at the offsets
-             * given by the members parameter.
-             * The resulting area is put into the out_buffer.
-             */
-            void operator()(const osmium::Relation& relation, const std::vector<size_t>& members, const osmium::memory::Buffer& in_buffer, osmium::memory::Buffer& out_buffer) {
-                if (m_config.problem_reporter) {
-                    m_config.problem_reporter->set_object(osmium::item_type::relation, relation.id());
-                }
-
-                m_segment_list.extract_segments_from_ways(relation, members, in_buffer);
-
-                if (debug()) {
-                    std::cerr << "\nBuild relation id()=" << relation.id() << " members.size()=" << members.size() << " segments.size()=" << m_segment_list.size() << "\n";
-                }
-
-                size_t area_offset = out_buffer.committed();
-
-                // Now create the Area object and add the attributes and tags
-                // from the relation.
-                {
-                    osmium::builder::AreaBuilder builder(out_buffer);
-                    builder.initialize_from_object(relation);
-
-                    if (create_rings()) {
-                        add_tags_to_area(builder, relation);
-                        add_rings_to_area(builder);
-                    }
-                }
-                out_buffer.commit();
-
-                const osmium::TagList& area_tags = out_buffer.get<osmium::Area>(area_offset).tags(); // tags of the area we just built
-
-                // Find all closed ways that are inner rings and check their
-                // tags. If they are not the same as the tags of the area we
-                // just built, add them to a list and later build areas for
-                // them, too.
-                std::vector<const osmium::Way*> ways_that_should_be_areas;
-                if (m_inner_outer_mismatches == 0) {
-                    auto memit = relation.members().begin();
-                    for (size_t offset : members) {
-                        if (!std::strcmp(memit->role(), "inner")) {
-                            const osmium::Way& way = in_buffer.get<const osmium::Way>(offset);
-                            if (way.is_closed() && way.tags().size() > 0) {
-                                auto d = std::count_if(way.tags().begin(), way.tags().end(), filter());
-                                if (d > 0) {
-                                    osmium::tags::KeyFilter::iterator way_fi_begin(filter(), way.tags().begin(), way.tags().end());
-                                    osmium::tags::KeyFilter::iterator way_fi_end(filter(), way.tags().end(), way.tags().end());
-                                    osmium::tags::KeyFilter::iterator area_fi_begin(filter(), area_tags.begin(), area_tags.end());
-                                    osmium::tags::KeyFilter::iterator area_fi_end(filter(), area_tags.end(), area_tags.end());
-
-                                    if (!std::equal(way_fi_begin, way_fi_end, area_fi_begin) || d != std::distance(area_fi_begin, area_fi_end)) {
-                                        ways_that_should_be_areas.push_back(&way);
-                                    }
-                                }
-                            }
-                        }
-                        ++memit;
-                    }
-                }
-
-                // Now build areas for all ways found in the last step.
-                for (const osmium::Way* way : ways_that_should_be_areas) {
-                    Assembler assembler(m_config);
-                    assembler(*way, out_buffer);
-                }
-            }
-
-        }; // class Assembler
-
-    } // namespace area
-
-} // namespace osmium
-
-#endif // OSMIUM_AREA_ASSEMBLER_HPP
diff --git a/contrib/libosmium/osmium/area/detail/node_ref_segment.hpp b/contrib/libosmium/osmium/area/detail/node_ref_segment.hpp
deleted file mode 100644
index ec7b035..0000000
--- a/contrib/libosmium/osmium/area/detail/node_ref_segment.hpp
+++ /dev/null
@@ -1,262 +0,0 @@
-#ifndef OSMIUM_AREA_DETAIL_NODE_REF_SEGMENT_HPP
-#define OSMIUM_AREA_DETAIL_NODE_REF_SEGMENT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <cstdint>
-#include <cstring>
-#include <iosfwd>
-#include <utility>
-
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node_ref.hpp>
-
-namespace osmium {
-
-    class Way;
-
-    namespace area {
-
-        /**
-         * @brief Namespace for Osmium internal use
-         */
-        namespace detail {
-
-            /**
-             * This helper class for the Assembler class models a segment.
-             * Segments are the connection between
-             * two nodes and they all have their smaller coordinate at the
-             * beginning of the segment. Smaller, in this case, means smaller x
-             * coordinate, and if they are the same smaller y coordinate.
-             */
-            class NodeRefSegment {
-
-                osmium::NodeRef m_first;
-                osmium::NodeRef m_second;
-
-                /// Role of the member this segment was from.
-                const char* m_role;
-
-                /// Way this segment was from.
-                const osmium::Way* m_way;
-
-            public:
-
-                void swap_locations() {
-                    using std::swap;
-                    swap(m_first, m_second);
-                }
-
-                explicit NodeRefSegment() noexcept :
-                    m_first(),
-                    m_second(),
-                    m_role(nullptr),
-                    m_way(nullptr) {
-                }
-
-                explicit NodeRefSegment(const osmium::NodeRef& nr1, const osmium::NodeRef& nr2, const char* role, const osmium::Way* way) :
-                    m_first(nr1),
-                    m_second(nr2),
-                    m_role(role),
-                    m_way(way) {
-                    if (nr2.location() < nr1.location()) {
-                        swap_locations();
-                    }
-                }
-
-                NodeRefSegment(const NodeRefSegment&) = default;
-                NodeRefSegment(NodeRefSegment&&) = default;
-
-                NodeRefSegment& operator=(const NodeRefSegment&) = default;
-                NodeRefSegment& operator=(NodeRefSegment&&) = default;
-
-                ~NodeRefSegment() = default;
-
-                /// Return first NodeRef of Segment according to sorting order (bottom left to top right).
-                const osmium::NodeRef& first() const noexcept {
-                    return m_first;
-                }
-
-                /// Return second NodeRef of Segment according to sorting order (bottom left to top right).
-                const osmium::NodeRef& second() const noexcept {
-                    return m_second;
-                }
-
-                bool to_left_of(const osmium::Location& location) const {
-    //                std::cerr << "segment " << first() << "--" << second() << " to_left_of(" << location << "\n";
-
-                    if (first().location() == location || second().location() == location) {
-                        return false;
-                    }
-
-                    const std::pair<osmium::Location, osmium::Location> mm = std::minmax(first().location(), second().location(), [](const osmium::Location a, const osmium::Location b) {
-                        return a.y() < b.y();
-                    });
-
-                    if (mm.first.y() >= location.y() || mm.second.y() < location.y() || first().location().x() > location.x()) {
-    //                    std::cerr << "  false\n";
-                        return false;
-                    }
-
-                    int64_t ax = mm.first.x();
-                    int64_t bx = mm.second.x();
-                    int64_t lx = location.x();
-                    int64_t ay = mm.first.y();
-                    int64_t by = mm.second.y();
-                    int64_t ly = location.y();
-                    return ((bx - ax)*(ly - ay) - (by - ay)*(lx - ax)) <= 0;
-                }
-
-                bool role_outer() const noexcept {
-                    return !strcmp(m_role, "outer");
-                }
-
-                bool role_inner() const noexcept {
-                    return !strcmp(m_role, "inner");
-                }
-
-                const osmium::Way* way() const noexcept {
-                    return m_way;
-                }
-
-            }; // class NodeRefSegment
-
-            /// NodeRefSegments are equal if both their locations are equal
-            inline bool operator==(const NodeRefSegment& lhs, const NodeRefSegment& rhs) noexcept {
-                return lhs.first().location() == rhs.first().location() && lhs.second().location() == rhs.second().location();
-            }
-
-            inline bool operator!=(const NodeRefSegment& lhs, const NodeRefSegment& rhs) noexcept {
-                return ! (lhs == rhs);
-            }
-
-            /**
-             * NodeRefSegments are "smaller" if they are to the left and down of another
-             * segment. The first() location is checked first() and only if they have the
-             * same first() location the second() location is taken into account.
-             */
-            inline bool operator<(const NodeRefSegment& lhs, const NodeRefSegment& rhs) noexcept {
-                return (lhs.first().location() == rhs.first().location() && lhs.second().location() < rhs.second().location()) || lhs.first().location() < rhs.first().location();
-            }
-
-            inline bool operator>(const NodeRefSegment& lhs, const NodeRefSegment& rhs) noexcept {
-                return rhs < lhs;
-            }
-
-            inline bool operator<=(const NodeRefSegment& lhs, const NodeRefSegment& rhs) noexcept {
-                return ! (rhs < lhs);
-            }
-
-            inline bool operator>=(const NodeRefSegment& lhs, const NodeRefSegment& rhs) noexcept {
-                return ! (lhs < rhs);
-            }
-
-            template <typename TChar, typename TTraits>
-            inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const NodeRefSegment& segment) {
-                return out << segment.first() << "--" << segment.second();
-            }
-
-            inline bool outside_x_range(const NodeRefSegment& s1, const NodeRefSegment& s2) noexcept {
-                if (s1.first().location().x() > s2.second().location().x()) {
-                    return true;
-                }
-                return false;
-            }
-
-            inline bool y_range_overlap(const NodeRefSegment& s1, const NodeRefSegment& s2) {
-                const std::pair<int32_t, int32_t> m1 = std::minmax(s1.first().location().y(), s1.second().location().y());
-                const std::pair<int32_t, int32_t> m2 = std::minmax(s2.first().location().y(), s2.second().location().y());
-                if (m1.first > m2.second || m2.first > m1.second) {
-                    return false;
-                }
-                return true;
-            }
-
-            /**
-             * Calculate the intersection between to NodeRefSegments. The result is returned
-             * as a Location. Note that because the Location uses integers with limited
-             * precision internally, the result might be slightly different than the
-             * numerically correct location.
-             *
-             * If the segments touch in one of their endpoints, it doesn't count as an
-             * intersection.
-             *
-             * If the segments intersect not in a single point but in multiple points, ie
-             * if they overlap, this is NOT detected.
-             *
-             * @returns Undefined osmium::Location if there is no intersection or a defined
-             *          Location if the segments intersect.
-             */
-            inline osmium::Location calculate_intersection(const NodeRefSegment& s1, const NodeRefSegment& s2) {
-                if (s1.first().location()  == s2.first().location()  ||
-                    s1.first().location()  == s2.second().location() ||
-                    s1.second().location() == s2.first().location()  ||
-                    s1.second().location() == s2.second().location()) {
-                    return osmium::Location();
-                }
-
-                auto d = (static_cast<int64_t>(s2.second().y()) - static_cast<int64_t>(s2.first().y())) *
-                         (static_cast<int64_t>(s1.second().x()) - static_cast<int64_t>(s1.first().x())) -
-                         (static_cast<int64_t>(s2.second().x()) - static_cast<int64_t>(s2.first().x())) *
-                         (static_cast<int64_t>(s1.second().y()) - static_cast<int64_t>(s1.first().y()));
-
-                if (d != 0) {
-                    double denom  = ((s2.second().lat() - s2.first().lat())*(s1.second().lon() - s1.first().lon())) -
-                                    ((s2.second().lon() - s2.first().lon())*(s1.second().lat() - s1.first().lat()));
-
-                    double nume_a = ((s2.second().lon() - s2.first().lon())*(s1.first().lat() - s2.first().lat())) -
-                                    ((s2.second().lat() - s2.first().lat())*(s1.first().lon() - s2.first().lon()));
-
-                    double nume_b = ((s1.second().lon() - s1.first().lon())*(s1.first().lat() - s2.first().lat())) -
-                                    ((s1.second().lat() - s1.first().lat())*(s1.first().lon() - s2.first().lon()));
-
-                    if ((denom > 0 && nume_a >= 0 && nume_a <= denom && nume_b >= 0 && nume_b <= denom) ||
-                        (denom < 0 && nume_a <= 0 && nume_a >= denom && nume_b <= 0 && nume_b >= denom)) {
-                        double ua = nume_a / denom;
-                        double ix = s1.first().lon() + ua*(s1.second().lon() - s1.first().lon());
-                        double iy = s1.first().lat() + ua*(s1.second().lat() - s1.first().lat());
-                        return osmium::Location(ix, iy);
-                    }
-                }
-
-                return osmium::Location();
-            }
-
-        } // namespace detail
-
-    } // namespace area
-
-} // namespace osmium
-
-#endif // OSMIUM_AREA_DETAIL_NODE_REF_SEGMENT_HPP
diff --git a/contrib/libosmium/osmium/area/detail/proto_ring.hpp b/contrib/libosmium/osmium/area/detail/proto_ring.hpp
deleted file mode 100644
index 162e289..0000000
--- a/contrib/libosmium/osmium/area/detail/proto_ring.hpp
+++ /dev/null
@@ -1,277 +0,0 @@
-#ifndef OSMIUM_AREA_DETAIL_PROTO_RING_HPP
-#define OSMIUM_AREA_DETAIL_PROTO_RING_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <cstdint>
-#include <cstdlib>
-#include <iostream>
-#include <iterator>
-#include <set>
-#include <vector>
-
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node_ref.hpp>
-#include <osmium/area/detail/node_ref_segment.hpp>
-
-namespace osmium {
-
-    namespace area {
-
-        namespace detail {
-
-            /**
-             * A ring in the process of being built by the Assembler object.
-             */
-            class ProtoRing {
-
-            public:
-
-                typedef std::vector<NodeRefSegment> segments_type;
-
-            private:
-
-                // segments in this ring
-                segments_type m_segments;
-
-                bool m_outer {true};
-
-                // if this is an outer ring, these point to it's inner rings (if any)
-                std::vector<ProtoRing*> m_inner;
-
-            public:
-
-                explicit ProtoRing(const NodeRefSegment& segment) noexcept :
-                    m_segments() {
-                    add_segment_back(segment);
-                }
-
-                explicit ProtoRing(segments_type::const_iterator sbegin, segments_type::const_iterator send) :
-                    m_segments(static_cast<size_t>(std::distance(sbegin, send))) {
-                    std::copy(sbegin, send, m_segments.begin());
-                }
-
-                bool outer() const noexcept {
-                    return m_outer;
-                }
-
-                void set_inner() noexcept {
-                    m_outer = false;
-                }
-
-                segments_type& segments() noexcept {
-                    return m_segments;
-                }
-
-                const segments_type& segments() const noexcept {
-                    return m_segments;
-                }
-
-                void remove_segments(segments_type::iterator sbegin, segments_type::iterator send) {
-                    m_segments.erase(sbegin, send);
-                }
-
-                void add_segment_front(const NodeRefSegment& segment) {
-                    m_segments.insert(m_segments.begin(), segment);
-                }
-
-                void add_segment_back(const NodeRefSegment& segment) {
-                    m_segments.push_back(segment);
-                }
-
-                const NodeRefSegment& get_segment_front() const {
-                    return m_segments.front();
-                }
-
-                NodeRefSegment& get_segment_front() {
-                    return m_segments.front();
-                }
-
-                const NodeRefSegment& get_segment_back() const {
-                    return m_segments.back();
-                }
-
-                NodeRefSegment& get_segment_back() {
-                    return m_segments.back();
-                }
-
-                bool closed() const {
-                    return m_segments.front().first().location() == m_segments.back().second().location();
-                }
-
-                int64_t sum() const {
-                    int64_t sum = 0;
-
-                    for (const auto& segment : m_segments) {
-                        sum += static_cast<int64_t>(segment.first().location().x()) * static_cast<int64_t>(segment.second().location().y()) -
-                               static_cast<int64_t>(segment.second().location().x()) * static_cast<int64_t>(segment.first().location().y());
-                    }
-
-                    return sum;
-                }
-
-                bool is_cw() const {
-                    return sum() <= 0;
-                }
-
-                int64_t area() const {
-                    return std::abs(sum()) / 2;
-                }
-
-                void swap_segments(ProtoRing& other) {
-                    using std::swap;
-                    swap(m_segments, other.m_segments);
-                }
-
-                void add_inner_ring(ProtoRing* ring) {
-                    m_inner.push_back(ring);
-                }
-
-                const std::vector<ProtoRing*>& inner_rings() const {
-                    return m_inner;
-                }
-
-                void print(std::ostream& out) const {
-                    out << "[";
-                    bool first = true;
-                    for (const auto& segment : m_segments) {
-                        if (first) {
-                            out << segment.first().ref();
-                        }
-                        out << ',' << segment.second().ref();
-                        first = false;
-                    }
-                    out << "]";
-                }
-
-                void reverse() {
-                    std::for_each(m_segments.begin(), m_segments.end(), [](NodeRefSegment& segment) {
-                        segment.swap_locations();
-                    });
-                    std::reverse(m_segments.begin(), m_segments.end());
-                }
-
-                /**
-                 * Merge other ring to end of this ring.
-                 */
-                void merge_ring(const ProtoRing& other, bool debug) {
-                    if (debug) {
-                        std::cerr << "        MERGE rings ";
-                        print(std::cerr);
-                        std::cerr << " to ";
-                        other.print(std::cerr);
-                        std::cerr << "\n";
-                    }
-                    m_segments.insert(m_segments.end(), other.m_segments.begin(), other.m_segments.end());
-                    if (debug) {
-                        std::cerr << "          result ring: ";
-                        print(std::cerr);
-                        std::cerr << "\n";
-                    }
-                }
-
-                void merge_ring_reverse(const ProtoRing& other, bool debug) {
-                    if (debug) {
-                        std::cerr << "        MERGE rings (reverse) ";
-                        print(std::cerr);
-                        std::cerr << " to ";
-                        other.print(std::cerr);
-                        std::cerr << "\n";
-                    }
-                    size_t n = m_segments.size();
-                    m_segments.resize(n + other.m_segments.size());
-                    std::transform(other.m_segments.rbegin(), other.m_segments.rend(), m_segments.begin() + static_cast<segments_type::difference_type>(n), [](NodeRefSegment segment) {
-                        segment.swap_locations();
-                        return segment;
-                    });
-                    if (debug) {
-                        std::cerr << "          result ring: ";
-                        print(std::cerr);
-                        std::cerr << "\n";
-                    }
-                }
-
-                const NodeRef& min_node() const {
-                    auto it = std::min_element(m_segments.begin(), m_segments.end());
-                    if (location_less()(it->first(), it->second())) {
-                        return it->first();
-                    } else {
-                        return it->second();
-                    }
-                }
-
-                bool is_in(ProtoRing* outer) {
-                    osmium::Location testpoint = segments().front().first().location();
-                    bool is_in = false;
-
-                    for (size_t i = 0, j = outer->segments().size()-1; i < outer->segments().size(); j = i++) {
-                        if (((outer->segments()[i].first().location().y() > testpoint.y()) != (outer->segments()[j].first().location().y() > testpoint.y())) &&
-                            (testpoint.x() < (outer->segments()[j].first().location().x() - outer->segments()[i].first().location().x()) * (testpoint.y() - outer->segments()[i].first().location().y()) / (outer->segments()[j].first().location().y() - outer->segments()[i].first().location().y()) + outer->segments()[i].first().location().x()) ) {
-                            is_in = !is_in;
-                        }
-                    }
-
-                    return is_in;
-                }
-
-                void get_ways(std::set<const osmium::Way*>& ways) {
-                    for (const auto& segment : m_segments) {
-                        ways.insert(segment.way());
-                    }
-                }
-
-                bool contains(const NodeRefSegment& segment) const {
-                    for (const auto& s : m_segments) {
-                        if (s == segment || (s.first() == segment.second() && s.second() == segment.first())) {
-                            return true;
-                        }
-                    }
-                    return false;
-                }
-
-            }; // class ProtoRing
-
-            template <typename TChar, typename TTraits>
-            inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const ProtoRing& ring) {
-                ring.print(out);
-                return out;
-            }
-
-        } // namespace detail
-
-    } // namespace area
-
-} // namespace osmium
-
-#endif // OSMIUM_AREA_DETAIL_PROTO_RING_HPP
diff --git a/contrib/libosmium/osmium/area/detail/segment_list.hpp b/contrib/libosmium/osmium/area/detail/segment_list.hpp
deleted file mode 100644
index 289ecf0..0000000
--- a/contrib/libosmium/osmium/area/detail/segment_list.hpp
+++ /dev/null
@@ -1,218 +0,0 @@
-#ifndef OSMIUM_AREA_DETAIL_SEGMENT_LIST_HPP
-#define OSMIUM_AREA_DETAIL_SEGMENT_LIST_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <cassert>
-#include <iostream>
-#include <vector>
-
-#include <osmium/area/problem_reporter.hpp>
-#include <osmium/area/detail/node_ref_segment.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node_ref.hpp>
-#include <osmium/osm/relation.hpp>
-#include <osmium/osm/way.hpp>
-
-namespace osmium {
-
-    namespace area {
-
-        namespace detail {
-
-            /**
-             * This is a helper class for the area assembler. It models
-             * a list of segments.
-             */
-            class SegmentList {
-
-                typedef std::vector<NodeRefSegment> slist_type;
-
-                slist_type m_segments;
-
-                bool m_debug;
-
-            public:
-
-                explicit SegmentList(bool debug) noexcept :
-                    m_debug(debug) {
-                }
-
-                ~SegmentList() = default;
-
-                SegmentList(const SegmentList&) = delete;
-                SegmentList(SegmentList&&) = delete;
-
-                SegmentList& operator=(const SegmentList&) = delete;
-                SegmentList& operator=(SegmentList&&) = delete;
-
-                /// The number of segments in the list.
-                size_t size() const noexcept {
-                    return m_segments.size();
-                }
-
-                bool empty() const noexcept {
-                    return m_segments.empty();
-                }
-
-                typedef slist_type::const_iterator const_iterator;
-
-                const_iterator begin() const noexcept {
-                    return m_segments.begin();
-                }
-
-                const_iterator end() const noexcept {
-                    return m_segments.end();
-                }
-
-                /**
-                 * Enable or disable debug output to stderr. This is for Osmium
-                 * developers only.
-                 */
-                void enable_debug_output(bool debug = true) noexcept {
-                    m_debug = debug;
-                }
-
-                /// Clear the list of segments. All segments are removed.
-                void clear() {
-                    m_segments.clear();
-                }
-
-                /// Sort the list of segments.
-                void sort() {
-                    std::sort(m_segments.begin(), m_segments.end());
-                }
-
-                /**
-                 * Extract segments from given way and add them to the list.
-                 *
-                 * Segments connecting two nodes with the same location (ie same
-                 * node or different node with same location) are removed.
-                 *
-                 * XXX should two nodes with same location be reported?
-                 */
-                void extract_segments_from_way(const osmium::Way& way, const char* role) {
-                    osmium::NodeRef last_nr;
-                    for (const osmium::NodeRef& nr : way.nodes()) {
-                        if (last_nr.location() && last_nr.location() != nr.location()) {
-                            m_segments.emplace_back(last_nr, nr, role, &way);
-                        }
-                        last_nr = nr;
-                    }
-                }
-
-                /**
-                 * Extract all segments from all ways that make up this
-                 * multipolygon relation and add them to the list.
-                 */
-                void extract_segments_from_ways(const osmium::Relation& relation, const std::vector<size_t>& members, const osmium::memory::Buffer& in_buffer) {
-                    auto member_it = relation.members().begin();
-                    for (size_t offset : members) {
-                        const osmium::Way& way = in_buffer.get<const osmium::Way>(offset);
-                        extract_segments_from_way(way, member_it->role());
-                        ++member_it;
-                    }
-                }
-
-                /**
-                 * Find duplicate segments (ie same start and end point) in the
-                 * list and remove them. This will always remove pairs of the same
-                 * segment. So if there are three, for instance, two will be
-                 * removed and one will be left.
-                 */
-                void erase_duplicate_segments() {
-                    while (true) {
-                        auto it = std::adjacent_find(m_segments.begin(), m_segments.end());
-                        if (it == m_segments.end()) {
-                            return;
-                        }
-                        if (m_debug) {
-                            std::cerr << "  erase duplicate segment: " << *it << "\n";
-                        }
-                        m_segments.erase(it, it+2);
-                    }
-                }
-
-                /**
-                 * Find intersection between segments.
-                 *
-                 * @param problem_reporter Any intersections found are reported to this object.
-                 * @returns true if there are intersections.
-                 */
-                bool find_intersections(osmium::area::ProblemReporter* problem_reporter) const {
-                    if (m_segments.empty()) {
-                        return false;
-                    }
-
-                    bool found_intersections = false;
-
-                    for (auto it1 = m_segments.begin(); it1 != m_segments.end()-1; ++it1) {
-                        const NodeRefSegment& s1 = *it1;
-                        for (auto it2 = it1+1; it2 != m_segments.end(); ++it2) {
-                            const NodeRefSegment& s2 = *it2;
-
-                            assert(s1 != s2); // erase_duplicate_segments() should have made sure of that
-
-                            if (outside_x_range(s2, s1)) {
-                                break;
-                            }
-
-                            if (y_range_overlap(s1, s2)) {
-                                osmium::Location intersection = calculate_intersection(s1, s2);
-                                if (intersection) {
-                                    found_intersections = true;
-                                    if (m_debug) {
-                                        std::cerr << "  segments " << s1 << " and " << s2 << " intersecting at " << intersection << "\n";
-                                    }
-                                    if (problem_reporter) {
-                                        problem_reporter->report_intersection(s1.way()->id(), s1.first().location(), s1.second().location(), s2.way()->id(), s2.first().location(), s2.second().location(), intersection);
-                                    }
-                                }
-                            }
-                        }
-                    }
-
-                    return found_intersections;
-                }
-
-            }; // class SegmentList
-
-        } // namespace detail
-
-    } // namespace area
-
-} // namespace osmium
-
-#endif // OSMIUM_AREA_DETAIL_SEGMENT_LIST_HPP
diff --git a/contrib/libosmium/osmium/area/multipolygon_collector.hpp b/contrib/libosmium/osmium/area/multipolygon_collector.hpp
deleted file mode 100644
index c4155db..0000000
--- a/contrib/libosmium/osmium/area/multipolygon_collector.hpp
+++ /dev/null
@@ -1,223 +0,0 @@
-#ifndef OSMIUM_AREA_MULTIPOLYGON_COLLECTOR_HPP
-#define OSMIUM_AREA_MULTIPOLYGON_COLLECTOR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <cassert>
-#include <cstddef>
-#include <cstring>
-#include <vector>
-
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node_ref.hpp>
-#include <osmium/osm/relation.hpp>
-#include <osmium/osm/tag.hpp>
-#include <osmium/osm/way.hpp>
-#include <osmium/relations/collector.hpp>
-#include <osmium/relations/detail/member_meta.hpp>
-
-namespace osmium {
-
-    namespace relations {
-        class RelationMeta;
-    }
-
-    /**
-     * @brief Code related to the building of areas (multipolygons) from relations.
-     */
-    namespace area {
-
-        /**
-         * This class collects all data needed for creating areas from
-         * relations tagged with type=multipolygon or type=boundary.
-         * Most of its functionality is derived from the parent class
-         * osmium::relations::Collector.
-         *
-         * The actual assembling of the areas is done by the assembler
-         * class given as template argument.
-         *
-         * @tparam TAssembler Multipolygon Assembler class.
-         */
-        template <typename TAssembler>
-        class MultipolygonCollector : public osmium::relations::Collector<MultipolygonCollector<TAssembler>, false, true, false> {
-
-            typedef typename osmium::relations::Collector<MultipolygonCollector<TAssembler>, false, true, false> collector_type;
-
-            typedef typename TAssembler::config_type assembler_config_type;
-            const assembler_config_type m_assembler_config;
-
-            osmium::memory::Buffer m_output_buffer;
-
-            static constexpr size_t initial_output_buffer_size = 1024 * 1024;
-            static constexpr size_t max_buffer_size_for_flush = 100 * 1024;
-
-            void flush_output_buffer() {
-                if (this->callback()) {
-                    osmium::memory::Buffer buffer(initial_output_buffer_size);
-                    using std::swap;
-                    swap(buffer, m_output_buffer);
-                    this->callback()(std::move(buffer));
-                }
-            }
-
-            void possibly_flush_output_buffer() {
-                if (m_output_buffer.committed() > max_buffer_size_for_flush) {
-                    flush_output_buffer();
-                }
-            }
-
-        public:
-
-            explicit MultipolygonCollector(const assembler_config_type& assembler_config) :
-                collector_type(),
-                m_assembler_config(assembler_config),
-                m_output_buffer(initial_output_buffer_size, osmium::memory::Buffer::auto_grow::yes) {
-            }
-
-            /**
-             * We are interested in all relations tagged with type=multipolygon
-             * or type=boundary.
-             *
-             * Overwritten from the base class.
-             */
-            bool keep_relation(const osmium::Relation& relation) const {
-                const char* type = relation.tags().get_value_by_key("type");
-
-                // ignore relations without "type" tag
-                if (!type) {
-                    return false;
-                }
-
-                if ((!strcmp(type, "multipolygon")) || (!strcmp(type, "boundary"))) {
-                    return true;
-                }
-
-                return false;
-            }
-
-            /**
-             * Overwritten from the base class.
-             */
-            bool keep_member(const osmium::relations::RelationMeta& /*relation_meta*/, const osmium::RelationMember& member) const {
-                // We are only interested in members of type way.
-                return member.type() == osmium::item_type::way;
-            }
-
-            /**
-             * This is called when a way is not in any multipolygon
-             * relation.
-             *
-             * Overwritten from the base class.
-             */
-            void way_not_in_any_relation(const osmium::Way& way) {
-                // you need at least 4 nodes to make up a polygon
-                if (way.nodes().size() <= 3) {
-                    return;
-                }
-                try {
-                    if (!way.nodes().front().location() || !way.nodes().back().location()) {
-                        throw osmium::invalid_location("invalid location");
-                    }
-                    if (way.ends_have_same_location()) {
-                        // way is closed and has enough nodes, build simple multipolygon
-                        TAssembler assembler(m_assembler_config);
-                        assembler(way, m_output_buffer);
-                        possibly_flush_output_buffer();
-                    }
-                } catch (osmium::invalid_location&) {
-                    // XXX ignore
-                }
-            }
-
-            void complete_relation(osmium::relations::RelationMeta& relation_meta) {
-                const osmium::Relation& relation = this->get_relation(relation_meta);
-                std::vector<size_t> offsets;
-                for (const auto& member : relation.members()) {
-                    if (member.ref() != 0) {
-                        offsets.push_back(this->get_offset(member.type(), member.ref()));
-                    }
-                }
-                try {
-                    TAssembler assembler(m_assembler_config);
-                    assembler(relation, offsets, this->members_buffer(), m_output_buffer);
-                    possibly_flush_output_buffer();
-                } catch (osmium::invalid_location&) {
-                    // XXX ignore
-                }
-
-                // clear member metas
-                for (const auto& member : relation.members()) {
-                    if (member.ref() != 0) {
-                        auto& mmv = this->member_meta(member.type());
-                        auto range = std::equal_range(mmv.begin(), mmv.end(), osmium::relations::MemberMeta(member.ref()));
-                        assert(range.first != range.second);
-
-                        // if this is the last time this object was needed
-                        // then mark it as removed
-                        if (osmium::relations::count_not_removed(range.first, range.second) == 1) {
-                            this->get_member(range.first->buffer_offset()).set_removed(true);
-                        }
-
-                        for (auto it = range.first; it != range.second; ++it) {
-                            if (!it->removed() && relation.id() == this->get_relation(it->relation_pos()).id()) {
-                                it->remove();
-                                break;
-                            }
-                        }
-                    }
-                }
-            }
-
-            void flush() {
-                flush_output_buffer();
-            }
-
-            osmium::memory::Buffer read() {
-                osmium::memory::Buffer buffer(initial_output_buffer_size, osmium::memory::Buffer::auto_grow::yes);
-
-                using std::swap;
-                swap(buffer, m_output_buffer);
-
-                return buffer;
-            }
-
-        }; // class MultipolygonCollector
-
-    } // namespace area
-
-} // namespace osmium
-
-#endif // OSMIUM_AREA_MULTIPOLYGON_COLLECTOR_HPP
diff --git a/contrib/libosmium/osmium/area/problem_reporter.hpp b/contrib/libosmium/osmium/area/problem_reporter.hpp
deleted file mode 100644
index 4ae4bb2..0000000
--- a/contrib/libosmium/osmium/area/problem_reporter.hpp
+++ /dev/null
@@ -1,149 +0,0 @@
-#ifndef OSMIUM_AREA_PROBLEM_REPORTER_HPP
-#define OSMIUM_AREA_PROBLEM_REPORTER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/types.hpp>
-
-namespace osmium {
-
-    namespace area {
-
-        /**
-         * When assembling a multipolygon/area from a multipolygon relation
-         * or a closed way several problems can be detected. This includes
-         * intersections between lines, wrong role attributes on relation
-         * members etc. These problems are reported by the area::Assembler
-         * class to the ProblemReporter class or one of its child classes.
-         *
-         * This is the parent class which does nothing with the reports.
-         * Child classes are expected to implement different ways of
-         * reporting the problems.
-         */
-        class ProblemReporter {
-
-        protected:
-
-            // Type of object we are currently working on
-            osmium::item_type m_object_type;
-
-            // ID of the relation/way we are currently working on
-            osmium::object_id_type m_object_id;
-
-        public:
-
-            ProblemReporter() = default;
-
-            virtual ~ProblemReporter() = default;
-
-            /**
-             * Set the object the next problem reports will be on.
-             *
-             * @param object_type The type of the object.
-             * @param object_id The ID of the object.
-             */
-            void set_object(osmium::item_type object_type, osmium::object_id_type object_id) noexcept {
-                m_object_type = object_type;
-                m_object_id = object_id;
-            }
-
-// Disable "unused-parameter" warning, so that the compiler will not complain.
-// We can't remove the parameter names, because then doxygen will complain.
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-
-            /**
-             * Report a duplicate node, ie. two nodes with the same location.
-             *
-             * @param node_id1       ID of the first node.
-             * @param node_id2       ID of the second node.
-             * @param location       Location of both nodes.
-             */
-            virtual void report_duplicate_node(osmium::object_id_type node_id1, osmium::object_id_type node_id2, osmium::Location location) {
-            }
-
-            /**
-             * Report an intersection between two segments.
-             *
-             * @param way1_id        ID of the first involved way.
-             * @param way1_seg_start Location where the segment of the first way with the intersection starts
-             * @param way1_seg_end   Location where the segment of the first way with the intersection ends
-             * @param way2_id        ID of the second involved way.
-             * @param way2_seg_start Location where the segment of the second way with the intersection starts
-             * @param way2_seg_end   Location where the segment of the second way with the intersection ends
-             * @param intersection   Location of the intersection. This might be slightly off the correct location due to rounding.
-             */
-            virtual void report_intersection(osmium::object_id_type way1_id, osmium::Location way1_seg_start, osmium::Location way1_seg_end,
-                                             osmium::object_id_type way2_id, osmium::Location way2_seg_start, osmium::Location way2_seg_end, osmium::Location intersection) {
-            }
-
-            /**
-             * Report an open ring.
-             *
-             * @param end1           Location of the first open end.
-             * @param end2           Location of the second open end.
-             */
-            virtual void report_ring_not_closed(osmium::Location end1, osmium::Location end2) {
-            }
-
-            /**
-             * Report a segment that should have role "outer", but has a different role.
-             *
-             * @param way_id         ID of the way this segment is in.
-             * @param seg_start      Start of the segment with the wrong role.
-             * @param seg_end        End of the segment with the wrong role.
-             */
-            virtual void report_role_should_be_outer(osmium::object_id_type way_id, osmium::Location seg_start, osmium::Location seg_end) {
-            }
-
-            /**
-             * Report a segment that should have role "inner", but has a different role.
-             *
-             * @param way_id         ID of the way this segment is in.
-             * @param seg_start      Start of the segment with the wrong role.
-             * @param seg_end        End of the segment with the wrong role.
-             */
-            virtual void report_role_should_be_inner(osmium::object_id_type way_id, osmium::Location seg_start, osmium::Location seg_end) {
-            }
-
-#pragma GCC diagnostic pop
-
-        }; // class ProblemReporter
-
-    } // namespace area
-
-} // namespace osmium
-
-#endif // OSMIUM_AREA_PROBLEM_REPORTER_HPP
diff --git a/contrib/libosmium/osmium/area/problem_reporter_exception.hpp b/contrib/libosmium/osmium/area/problem_reporter_exception.hpp
deleted file mode 100644
index 5e743c6..0000000
--- a/contrib/libosmium/osmium/area/problem_reporter_exception.hpp
+++ /dev/null
@@ -1,96 +0,0 @@
-#ifndef OSMIUM_AREA_PROBLEM_REPORTER_EXCEPTION_HPP
-#define OSMIUM_AREA_PROBLEM_REPORTER_EXCEPTION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <sstream>
-#include <stdexcept>
-
-#include <osmium/area/problem_reporter_stream.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/types.hpp>
-
-namespace osmium {
-
-    namespace area {
-
-        class ProblemReporterException : public ProblemReporterStream {
-
-            std::stringstream m_sstream;
-
-        public:
-
-            ProblemReporterException() :
-                ProblemReporterStream(m_sstream) {
-            }
-
-            virtual ~ProblemReporterException() = default;
-
-            void report_duplicate_node(osmium::object_id_type node_id1, osmium::object_id_type node_id2, osmium::Location location) override {
-                m_sstream.str();
-                ProblemReporterStream::report_duplicate_node(node_id1, node_id2, location);
-                throw std::runtime_error(m_sstream.str());
-            }
-
-            void report_intersection(osmium::object_id_type way1_id, osmium::Location way1_seg_start, osmium::Location way1_seg_end,
-                                     osmium::object_id_type way2_id, osmium::Location way2_seg_start, osmium::Location way2_seg_end, osmium::Location intersection) override {
-                m_sstream.str();
-                ProblemReporterStream::report_intersection(way1_id, way1_seg_start, way1_seg_end, way2_id, way2_seg_start, way2_seg_end, intersection);
-                throw std::runtime_error(m_sstream.str());
-            }
-
-            void report_ring_not_closed(osmium::Location end1, osmium::Location end2) override {
-                m_sstream.str();
-                ProblemReporterStream::report_ring_not_closed(end1, end2);
-                throw std::runtime_error(m_sstream.str());
-            }
-
-            void report_role_should_be_outer(osmium::object_id_type way_id, osmium::Location seg_start, osmium::Location seg_end) override {
-                m_sstream.str();
-                ProblemReporterStream::report_role_should_be_outer(way_id, seg_start, seg_end);
-                throw std::runtime_error(m_sstream.str());
-            }
-
-            void report_role_should_be_inner(osmium::object_id_type way_id, osmium::Location seg_start, osmium::Location seg_end) override {
-                m_sstream.str();
-                ProblemReporterStream::report_role_should_be_inner(way_id, seg_start, seg_end);
-                throw std::runtime_error(m_sstream.str());
-            }
-
-        }; // class ProblemReporterException
-
-    } // namespace area
-
-} // namespace osmium
-
-#endif // OSMIUM_AREA_PROBLEM_REPORTER_EXCEPTION_HPP
diff --git a/contrib/libosmium/osmium/area/problem_reporter_ogr.hpp b/contrib/libosmium/osmium/area/problem_reporter_ogr.hpp
deleted file mode 100644
index 5332997..0000000
--- a/contrib/libosmium/osmium/area/problem_reporter_ogr.hpp
+++ /dev/null
@@ -1,139 +0,0 @@
-#ifndef OSMIUM_AREA_PROBLEM_REPORTER_OGR_HPP
-#define OSMIUM_AREA_PROBLEM_REPORTER_OGR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-/**
- * @file
- *
- * This file contains code for reporting problems through OGR when
- * assembling multipolygons.
- *
- * @attention If you include this file, you'll need to link with `libgdal`.
- */
-
-#include <memory>
-
-#include <gdalcpp.hpp>
-
-#include <osmium/area/problem_reporter.hpp>
-#include <osmium/geom/factory.hpp>
-#include <osmium/geom/ogr.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/types.hpp>
-
-namespace osmium {
-
-    namespace area {
-
-        /**
-         * Report problems when assembling areas by adding them to
-         * layers in an OGR datasource.
-         */
-        class ProblemReporterOGR : public ProblemReporter {
-
-            osmium::geom::OGRFactory<> m_ogr_factory;
-
-            gdalcpp::Layer m_layer_perror;
-            gdalcpp::Layer m_layer_lerror;
-
-            void write_point(const char* problem_type, osmium::object_id_type id1, osmium::object_id_type id2, osmium::Location location) {
-                gdalcpp::Feature feature(m_layer_perror, m_ogr_factory.create_point(location));
-                feature.set_field("id1", static_cast<double>(id1));
-                feature.set_field("id2", static_cast<double>(id2));
-                feature.set_field("problem_type", problem_type);
-                feature.add_to_layer();
-            }
-
-            void write_line(const char* problem_type, osmium::object_id_type id1, osmium::object_id_type id2, osmium::Location loc1, osmium::Location loc2) {
-                std::unique_ptr<OGRPoint> ogr_point1 = m_ogr_factory.create_point(loc1);
-                std::unique_ptr<OGRPoint> ogr_point2 = m_ogr_factory.create_point(loc2);
-                std::unique_ptr<OGRLineString> ogr_linestring = std::unique_ptr<OGRLineString>(new OGRLineString());
-                ogr_linestring->addPoint(ogr_point1.get());
-                ogr_linestring->addPoint(ogr_point2.get());
-
-                gdalcpp::Feature feature(m_layer_lerror, std::move(ogr_linestring));
-                feature.set_field("id1", static_cast<double>(id1));
-                feature.set_field("id2", static_cast<double>(id2));
-                feature.set_field("problem_type", problem_type);
-                feature.add_to_layer();
-            }
-
-        public:
-
-            explicit ProblemReporterOGR(gdalcpp::Dataset& dataset) :
-                m_layer_perror(dataset, "perrors", wkbPoint),
-                m_layer_lerror(dataset, "lerrors", wkbLineString) {
-
-                m_layer_perror.add_field("id1", OFTReal, 10);
-                m_layer_perror.add_field("id2", OFTReal, 10);
-                m_layer_perror.add_field("problem_type", OFTString, 30);
-
-                m_layer_lerror.add_field("id1", OFTReal, 10);
-                m_layer_lerror.add_field("id2", OFTReal, 10);
-                m_layer_lerror.add_field("problem_type", OFTString, 30);
-            }
-
-            virtual ~ProblemReporterOGR() = default;
-
-            void report_duplicate_node(osmium::object_id_type node_id1, osmium::object_id_type node_id2, osmium::Location location) override {
-                write_point("duplicate_node", node_id1, node_id2, location);
-            }
-
-            void report_intersection(osmium::object_id_type way1_id, osmium::Location way1_seg_start, osmium::Location way1_seg_end,
-                                     osmium::object_id_type way2_id, osmium::Location way2_seg_start, osmium::Location way2_seg_end, osmium::Location intersection) override {
-                write_point("intersection", m_object_id, 0, intersection);
-                write_line("intersection", m_object_id, way1_id, way1_seg_start, way1_seg_end);
-                write_line("intersection", m_object_id, way2_id, way2_seg_start, way2_seg_end);
-            }
-
-            void report_ring_not_closed(osmium::Location end1, osmium::Location end2) override {
-                write_point("ring_not_closed", m_object_id, 0, end1);
-                write_point("ring_not_closed", m_object_id, 0, end2);
-            }
-
-            void report_role_should_be_outer(osmium::object_id_type way_id, osmium::Location seg_start, osmium::Location seg_end) override {
-                write_line("role_should_be_outer", m_object_id, way_id, seg_start, seg_end);
-            }
-
-            void report_role_should_be_inner(osmium::object_id_type way_id, osmium::Location seg_start, osmium::Location seg_end) override {
-                write_line("role_should_be_inner", m_object_id, way_id, seg_start, seg_end);
-            }
-
-        }; // class ProblemReporterOGR
-
-    } // namespace area
-
-} // namespace osmium
-
-#endif // OSMIUM_AREA_PROBLEM_REPORTER_OGR_HPP
diff --git a/contrib/libosmium/osmium/area/problem_reporter_stream.hpp b/contrib/libosmium/osmium/area/problem_reporter_stream.hpp
deleted file mode 100644
index ddcb343..0000000
--- a/contrib/libosmium/osmium/area/problem_reporter_stream.hpp
+++ /dev/null
@@ -1,96 +0,0 @@
-#ifndef OSMIUM_AREA_PROBLEM_REPORTER_STREAM_HPP
-#define OSMIUM_AREA_PROBLEM_REPORTER_STREAM_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <ostream>
-
-#include <osmium/area/problem_reporter.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/types.hpp>
-
-namespace osmium {
-
-    namespace area {
-
-        class ProblemReporterStream : public ProblemReporter {
-
-            std::ostream* m_out;
-
-        public:
-
-            explicit ProblemReporterStream(std::ostream& out) :
-                m_out(&out) {
-            }
-
-            virtual ~ProblemReporterStream() = default;
-
-            void header(const char* msg) {
-                *m_out << "DATA PROBLEM: " << msg << " on " << item_type_to_char(m_object_type) << m_object_id << ": ";
-            }
-
-            void report_duplicate_node(osmium::object_id_type node_id1, osmium::object_id_type node_id2, osmium::Location location) override {
-                header("duplicate node");
-                *m_out << "node_id1=" << node_id1 << " node_id2=" << node_id2 << " location=" << location << "\n";
-            }
-
-            void report_intersection(osmium::object_id_type way1_id, osmium::Location way1_seg_start, osmium::Location way1_seg_end,
-                                     osmium::object_id_type way2_id, osmium::Location way2_seg_start, osmium::Location way2_seg_end, osmium::Location intersection) override {
-                header("intersection");
-                *m_out << "way1_id=" << way1_id << " way1_seg_start=" << way1_seg_start << " way1_seg_end=" << way1_seg_end
-                       << " way2_id=" << way2_id << " way2_seg_start=" << way2_seg_start << " way2_seg_end=" << way2_seg_end << " intersection=" << intersection << "\n";
-            }
-
-            void report_ring_not_closed(osmium::Location end1, osmium::Location end2) override {
-                header("ring not closed");
-                *m_out << "end1=" << end1 << " end2=" << end2 << "\n";
-            }
-
-            void report_role_should_be_outer(osmium::object_id_type way_id, osmium::Location seg_start, osmium::Location seg_end) override {
-                header("role should be outer");
-                *m_out << "way_id=" << way_id << " seg_start=" << seg_start << " seg_end=" << seg_end << "\n";
-            }
-
-            void report_role_should_be_inner(osmium::object_id_type way_id, osmium::Location seg_start, osmium::Location seg_end) override {
-                header("role should be inner");
-                *m_out << "way_id=" << way_id << " seg_start=" << seg_start << " seg_end=" << seg_end << "\n";
-            }
-
-        }; // class ProblemReporterStream
-
-    } // namespace area
-
-} // namespace osmium
-
-#endif // OSMIUM_AREA_PROBLEM_REPORTER_STREAM_HPP
diff --git a/contrib/libosmium/osmium/builder/builder.hpp b/contrib/libosmium/osmium/builder/builder.hpp
deleted file mode 100644
index 63eb4bb..0000000
--- a/contrib/libosmium/osmium/builder/builder.hpp
+++ /dev/null
@@ -1,237 +0,0 @@
-#ifndef OSMIUM_BUILDER_BUILDER_HPP
-#define OSMIUM_BUILDER_BUILDER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <cassert>
-#include <cstddef>
-#include <cstdint>
-#include <cstring>
-#include <new>
-#include <string>
-#include <type_traits>
-
-#include <osmium/memory/buffer.hpp>
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/util/cast.hpp>
-
-namespace osmium {
-
-    /**
-     * @brief Classes for building OSM objects and other items in buffers
-     */
-    namespace builder {
-
-        class Builder {
-
-            osmium::memory::Buffer& m_buffer;
-            Builder* m_parent;
-            size_t m_item_offset;
-
-            Builder(const Builder&) = delete;
-            Builder(Builder&&) = delete;
-
-            Builder& operator=(const Builder&) = delete;
-            Builder& operator=(Builder&&) = delete;
-
-        protected:
-
-            explicit Builder(osmium::memory::Buffer& buffer, Builder* parent, osmium::memory::item_size_type size) :
-                m_buffer(buffer),
-                m_parent(parent),
-                m_item_offset(buffer.written()) {
-                m_buffer.reserve_space(size);
-                assert(buffer.is_aligned());
-                if (m_parent) {
-                    m_parent->add_size(size);
-                }
-            }
-
-            ~Builder() = default;
-
-            osmium::memory::Item& item() const {
-                return *reinterpret_cast<osmium::memory::Item*>(m_buffer.data() + m_item_offset);
-            }
-
-        public:
-
-            /**
-             * Add padding to buffer (if needed) to align data properly.
-             *
-             * This calculates how many padding bytes are needed and adds
-             * as many zero bytes to the buffer. It also adds this number
-             * to the size of the current item (if the "self" param is
-             * true) and recursively to all the parent items.
-             *
-             * @param self If true add number of padding bytes to size
-             *             of current item. Size is always added to
-             *             parent item (if any).
-             *
-             */
-            void add_padding(bool self = false) {
-                auto padding = osmium::memory::align_bytes - (size() % osmium::memory::align_bytes);
-                if (padding != osmium::memory::align_bytes) {
-                    std::fill_n(m_buffer.reserve_space(padding), padding, 0);
-                    if (self) {
-                        add_size(padding);
-                    } else if (m_parent) {
-                        m_parent->add_size(padding);
-                        assert(m_parent->size() % osmium::memory::align_bytes == 0);
-                    }
-                }
-            }
-
-            void add_size(uint32_t size) {
-                item().add_size(size);
-                if (m_parent) {
-                    m_parent->add_size(size);
-                }
-            }
-
-            uint32_t size() const noexcept {
-                return item().byte_size();
-            }
-
-            void add_item(const osmium::memory::Item* item) {
-                unsigned char* target = m_buffer.reserve_space(item->padded_size());
-                std::copy_n(reinterpret_cast<const unsigned char*>(item), item->padded_size(), target);
-                add_size(item->padded_size());
-            }
-
-            /**
-             * Reserve space for an object of class T in buffer and return
-             * pointer to it.
-             */
-            template <typename T>
-            T* reserve_space_for() {
-                assert(m_buffer.is_aligned());
-                return reinterpret_cast<T*>(m_buffer.reserve_space(sizeof(T)));
-            }
-
-            /**
-             * Append data to buffer.
-             *
-             * @param data Pointer to data.
-             * @param length Length of data in bytes. If data is a
-             *               \0-terminated string, length must contain the
-             *               \0 byte.
-             * @returns The number of bytes appended (length).
-             */
-            osmium::memory::item_size_type append(const char* data, const osmium::memory::item_size_type length) {
-                unsigned char* target = m_buffer.reserve_space(length);
-                std::copy_n(reinterpret_cast<const unsigned char*>(data), length, target);
-                return length;
-            }
-
-            /**
-             * Append \0-terminated string to buffer.
-             *
-             * @param str \0-terminated string.
-             * @returns The number of bytes appended (strlen(str) + 1).
-             */
-            osmium::memory::item_size_type append(const char* str) {
-                return append(str, static_cast<osmium::memory::item_size_type>(std::strlen(str) + 1));
-            }
-
-            /**
-             * Append '\0' to the buffer.
-             *
-             * @returns The number of bytes appended (always 1).
-             */
-            osmium::memory::item_size_type append_zero() {
-                *m_buffer.reserve_space(1) = '\0';
-                return 1;
-            }
-
-            /// Return the buffer this builder is using.
-            osmium::memory::Buffer& buffer() noexcept {
-                return m_buffer;
-            }
-
-        }; // class Builder
-
-        template <typename TItem>
-        class ObjectBuilder : public Builder {
-
-            static_assert(std::is_base_of<osmium::memory::Item, TItem>::value, "ObjectBuilder can only build objects derived from osmium::memory::Item");
-
-        public:
-
-            explicit ObjectBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
-                Builder(buffer, parent, sizeof(TItem)) {
-                new (&item()) TItem();
-            }
-
-            TItem& object() noexcept {
-                return static_cast<TItem&>(item());
-            }
-
-            /**
-             * Add user name to buffer.
-             *
-             * @param user Pointer to user name.
-             * @param length Length of user name (without \0 termination).
-             */
-            void add_user(const char* user, const string_size_type length) {
-                object().set_user_size(length + 1);
-                add_size(append(user, length) + append_zero());
-                add_padding(true);
-            }
-
-            /**
-             * Add user name to buffer.
-             *
-             * @param user Pointer to \0-terminated user name.
-             */
-            void add_user(const char* user) {
-                add_user(user, static_cast_with_assert<string_size_type>(std::strlen(user)));
-            }
-
-            /**
-             * Add user name to buffer.
-             *
-             * @param user User name.
-             */
-            void add_user(const std::string& user) {
-                add_user(user.data(), static_cast_with_assert<string_size_type>(user.size()));
-            }
-
-        }; // class ObjectBuilder
-
-    } // namespace builder
-
-} // namespace osmium
-
-#endif // OSMIUM_BUILDER_BUILDER_HPP
diff --git a/contrib/libosmium/osmium/builder/builder_helper.hpp b/contrib/libosmium/osmium/builder/builder_helper.hpp
deleted file mode 100644
index eebdf33..0000000
--- a/contrib/libosmium/osmium/builder/builder_helper.hpp
+++ /dev/null
@@ -1,103 +0,0 @@
-#ifndef OSMIUM_BUILDER_BUILDER_HELPER_HPP
-#define OSMIUM_BUILDER_BUILDER_HELPER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstddef>
-#include <initializer_list>
-#include <functional>
-#include <map>
-#include <utility>
-
-#include <osmium/builder/osm_object_builder.hpp>
-#include <osmium/memory/buffer.hpp>
-
-namespace osmium {
-
-    class NodeRef;
-    class TagList;
-    class WayNodeList;
-
-    namespace builder {
-
-        inline const osmium::WayNodeList& build_way_node_list(osmium::memory::Buffer& buffer, const std::initializer_list<osmium::NodeRef>& nodes) {
-            size_t pos = buffer.committed();
-            {
-                osmium::builder::WayNodeListBuilder wnl_builder(buffer);
-                for (const auto& node_ref : nodes) {
-                    wnl_builder.add_node_ref(node_ref);
-                }
-            }
-            buffer.commit();
-            return buffer.get<const osmium::WayNodeList>(pos);
-        }
-
-        inline const osmium::TagList& build_tag_list(osmium::memory::Buffer& buffer, const std::initializer_list<std::pair<const char*, const char*>>& tags) {
-            size_t pos = buffer.committed();
-            {
-                osmium::builder::TagListBuilder tl_builder(buffer);
-                for (const auto& p : tags) {
-                    tl_builder.add_tag(p.first, p.second);
-                }
-            }
-            buffer.commit();
-            return buffer.get<const osmium::TagList>(pos);
-        }
-
-        inline const osmium::TagList& build_tag_list_from_map(osmium::memory::Buffer& buffer, const std::map<const char*, const char*>& tags) {
-            size_t pos = buffer.committed();
-            {
-                osmium::builder::TagListBuilder tl_builder(buffer);
-                for (const auto& p : tags) {
-                    tl_builder.add_tag(p.first, p.second);
-                }
-            }
-            buffer.commit();
-            return buffer.get<const osmium::TagList>(pos);
-        }
-
-        inline const osmium::TagList& build_tag_list_from_func(osmium::memory::Buffer& buffer, std::function<void(osmium::builder::TagListBuilder&)> func) {
-            size_t pos = buffer.committed();
-            {
-                osmium::builder::TagListBuilder tl_builder(buffer);
-                func(tl_builder);
-            }
-            buffer.commit();
-            return buffer.get<const osmium::TagList>(pos);
-        }
-
-    } // namespace builder
-
-} // namespace osmium
-
-#endif // OSMIUM_BUILDER_BUILDER_HELPER_HPP
diff --git a/contrib/libosmium/osmium/builder/osm_object_builder.hpp b/contrib/libosmium/osmium/builder/osm_object_builder.hpp
deleted file mode 100644
index 6aa43ac..0000000
--- a/contrib/libosmium/osmium/builder/osm_object_builder.hpp
+++ /dev/null
@@ -1,370 +0,0 @@
-#ifndef OSMIUM_BUILDER_OSM_OBJECT_BUILDER_HPP
-#define OSMIUM_BUILDER_OSM_OBJECT_BUILDER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cassert>
-#include <cstring>
-#include <initializer_list>
-#include <new>
-#include <stdexcept>
-#include <string>
-#include <utility>
-
-#include <osmium/builder/builder.hpp>
-#include <osmium/osm.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node_ref.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/tag.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/util/cast.hpp>
-
-namespace osmium {
-
-    namespace memory {
-        class Buffer;
-    }
-
-    namespace builder {
-
-        class TagListBuilder : public ObjectBuilder<TagList> {
-
-        public:
-
-            explicit TagListBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
-                ObjectBuilder<TagList>(buffer, parent) {
-            }
-
-            ~TagListBuilder() {
-                add_padding();
-            }
-
-            /**
-             * Add tag to buffer.
-             *
-             * @param key Tag key (0-terminated string).
-             * @param value Tag value (0-terminated string).
-             */
-            void add_tag(const char* key, const char* value) {
-                if (std::strlen(key) > osmium::max_osm_string_length) {
-                    throw std::length_error("OSM tag key is too long");
-                }
-                if (std::strlen(value) > osmium::max_osm_string_length) {
-                    throw std::length_error("OSM tag value is too long");
-                }
-                add_size(append(key) + append(value));
-            }
-
-            /**
-             * Add tag to buffer.
-             *
-             * @param key Pointer to tag key.
-             * @param key_length Length of key (not including the \0 byte).
-             * @param value Pointer to tag value.
-             * @param value_length Length of value (not including the \0 byte).
-             */
-            void add_tag(const char* key, const size_t key_length, const char* value, const size_t value_length) {
-                if (key_length > osmium::max_osm_string_length) {
-                    throw std::length_error("OSM tag key is too long");
-                }
-                if (value_length > osmium::max_osm_string_length) {
-                    throw std::length_error("OSM tag value is too long");
-                }
-                add_size(append(key,   osmium::memory::item_size_type(key_length))   + append_zero() +
-                         append(value, osmium::memory::item_size_type(value_length)) + append_zero());
-            }
-
-            /**
-             * Add tag to buffer.
-             *
-             * @param key Tag key.
-             * @param value Tag value.
-             */
-            void add_tag(const std::string& key, const std::string& value) {
-                if (key.size() > osmium::max_osm_string_length) {
-                    throw std::length_error("OSM tag key is too long");
-                }
-                if (value.size() > osmium::max_osm_string_length) {
-                    throw std::length_error("OSM tag value is too long");
-                }
-                add_size(append(key.data(),   osmium::memory::item_size_type(key.size())   + 1) +
-                         append(value.data(), osmium::memory::item_size_type(value.size()) + 1));
-            }
-
-        }; // class TagListBuilder
-
-        template <typename T>
-        class NodeRefListBuilder : public ObjectBuilder<T> {
-
-        public:
-
-            explicit NodeRefListBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
-                ObjectBuilder<T>(buffer, parent) {
-            }
-
-            ~NodeRefListBuilder() {
-                static_cast<Builder*>(this)->add_padding();
-            }
-
-            void add_node_ref(const NodeRef& node_ref) {
-                new (static_cast<Builder*>(this)->reserve_space_for<osmium::NodeRef>()) osmium::NodeRef(node_ref);
-                static_cast<Builder*>(this)->add_size(sizeof(osmium::NodeRef));
-            }
-
-            void add_node_ref(const object_id_type ref, const osmium::Location& location = Location{}) {
-                add_node_ref(NodeRef(ref, location));
-            }
-
-        }; // class NodeRefListBuilder
-
-        typedef NodeRefListBuilder<WayNodeList> WayNodeListBuilder;
-        typedef NodeRefListBuilder<OuterRing> OuterRingBuilder;
-        typedef NodeRefListBuilder<InnerRing> InnerRingBuilder;
-
-        class RelationMemberListBuilder : public ObjectBuilder<RelationMemberList> {
-
-            /**
-             * Add role to buffer.
-             *
-             * @param member Relation member object where the length of the role
-             *               will be set.
-             * @param role The role.
-             * @param length Length of role (without \0 termination).
-             * @throws std:length_error If role is longer than osmium::max_osm_string_length
-             */
-            void add_role(osmium::RelationMember& member, const char* role, const size_t length) {
-                if (length > osmium::max_osm_string_length) {
-                    throw std::length_error("OSM relation member role is too long");
-                }
-                member.set_role_size(osmium::string_size_type(length) + 1);
-                add_size(append(role, osmium::memory::item_size_type(length)) + append_zero());
-                add_padding(true);
-            }
-
-        public:
-
-            explicit RelationMemberListBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
-                ObjectBuilder<RelationMemberList>(buffer, parent) {
-            }
-
-            ~RelationMemberListBuilder() {
-                add_padding();
-            }
-
-            /**
-             * Add a member to the relation.
-             *
-             * @param type The type (node, way, or relation).
-             * @param ref The ID of the member.
-             * @param role The role of the member.
-             * @param role_length Length of the role (without \0 termination).
-             * @param full_member Optional pointer to the member object. If it
-             *                    is available a copy will be added to the
-             *                    relation.
-             * @throws std:length_error If role_length is greater than
-             *         osmium::max_osm_string_length
-             */
-            void add_member(osmium::item_type type, object_id_type ref, const char* role, const size_t role_length, const osmium::OSMObject* full_member = nullptr) {
-                osmium::RelationMember* member = reserve_space_for<osmium::RelationMember>();
-                new (member) osmium::RelationMember(ref, type, full_member != nullptr);
-                add_size(sizeof(RelationMember));
-                add_role(*member, role, role_length);
-                if (full_member) {
-                    add_item(full_member);
-                }
-            }
-
-            /**
-             * Add a member to the relation.
-             *
-             * @param type The type (node, way, or relation).
-             * @param ref The ID of the member.
-             * @param role The role of the member (\0 terminated string).
-             * @param full_member Optional pointer to the member object. If it
-             *                    is available a copy will be added to the
-             *                    relation.
-             * @throws std:length_error If role is longer than osmium::max_osm_string_length
-             */
-            void add_member(osmium::item_type type, object_id_type ref, const char* role, const osmium::OSMObject* full_member = nullptr) {
-                add_member(type, ref, role, std::strlen(role), full_member);
-            }
-
-            /**
-             * Add a member to the relation.
-             *
-             * @param type The type (node, way, or relation).
-             * @param ref The ID of the member.
-             * @param role The role of the member.
-             * @param full_member Optional pointer to the member object. If it
-             *                    is available a copy will be added to the
-             *                    relation.
-             * @throws std:length_error If role is longer than osmium::max_osm_string_length
-             */
-            void add_member(osmium::item_type type, object_id_type ref, const std::string& role, const osmium::OSMObject* full_member = nullptr) {
-                add_member(type, ref, role.data(), role.size(), full_member);
-            }
-
-        }; // class RelationMemberListBuilder
-
-        class ChangesetDiscussionBuilder : public ObjectBuilder<ChangesetDiscussion> {
-
-            osmium::ChangesetComment* m_comment = nullptr;
-
-            void add_user(osmium::ChangesetComment& comment, const char* user, const size_t length) {
-                if (length > osmium::max_osm_string_length) {
-                    throw std::length_error("OSM user name is too long");
-                }
-                comment.set_user_size(osmium::string_size_type(length) + 1);
-                add_size(append(user, osmium::memory::item_size_type(length)) + append_zero());
-            }
-
-            void add_text(osmium::ChangesetComment& comment, const char* text, const size_t length) {
-                // XXX There is no limit on the length of a comment text. We
-                // limit it here to 2^16-2 characters, because that's all that
-                // will fit into our internal data structure. This is not ideal,
-                // and will have to be discussed and cleared up.
-                if (length > std::numeric_limits<osmium::string_size_type>::max() - 1) {
-                    throw std::length_error("OSM changeset comment is too long");
-                }
-                comment.set_text_size(osmium::string_size_type(length) + 1);
-                add_size(append(text, osmium::memory::item_size_type(length)) + append_zero());
-                add_padding(true);
-            }
-
-        public:
-
-            explicit ChangesetDiscussionBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
-                ObjectBuilder<ChangesetDiscussion>(buffer, parent) {
-            }
-
-            ~ChangesetDiscussionBuilder() {
-                assert(!m_comment && "You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
-                add_padding();
-            }
-
-            void add_comment(osmium::Timestamp date, osmium::user_id_type uid, const char* user) {
-                assert(!m_comment && "You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
-                m_comment = reserve_space_for<osmium::ChangesetComment>();
-                new (m_comment) osmium::ChangesetComment(date, uid);
-                add_size(sizeof(ChangesetComment));
-                add_user(*m_comment, user, std::strlen(user));
-            }
-
-            void add_comment_text(const char* text) {
-                assert(m_comment && "You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
-                add_text(*m_comment, text, std::strlen(text));
-                m_comment = nullptr;
-            }
-
-            void add_comment_text(const std::string& text) {
-                assert(m_comment && "You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
-                add_text(*m_comment, text.c_str(), text.size());
-                m_comment = nullptr;
-            }
-
-        }; // class ChangesetDiscussionBuilder
-
-        template <typename T>
-        class OSMObjectBuilder : public ObjectBuilder<T> {
-
-        public:
-
-            explicit OSMObjectBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
-                ObjectBuilder<T>(buffer, parent) {
-                static_cast<Builder*>(this)->reserve_space_for<string_size_type>();
-                static_cast<Builder*>(this)->add_size(sizeof(string_size_type));
-            }
-
-            void add_tags(const std::initializer_list<std::pair<const char*, const char*>>& tags) {
-                osmium::builder::TagListBuilder tl_builder(static_cast<Builder*>(this)->buffer(), this);
-                for (const auto& p : tags) {
-                    tl_builder.add_tag(p.first, p.second);
-                }
-            }
-
-        }; // class OSMObjectBuilder
-
-        typedef OSMObjectBuilder<osmium::Node> NodeBuilder;
-        typedef OSMObjectBuilder<osmium::Relation> RelationBuilder;
-
-        class WayBuilder : public OSMObjectBuilder<osmium::Way> {
-
-        public:
-
-            explicit WayBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
-                OSMObjectBuilder<osmium::Way>(buffer, parent) {
-            }
-
-            void add_node_refs(const std::initializer_list<osmium::NodeRef>& nodes) {
-                osmium::builder::WayNodeListBuilder builder(buffer(), this);
-                for (const auto& node_ref : nodes) {
-                    builder.add_node_ref(node_ref);
-                }
-            }
-
-        }; // class WayBuilder
-
-        class AreaBuilder : public OSMObjectBuilder<osmium::Area> {
-
-        public:
-
-            explicit AreaBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
-                OSMObjectBuilder<osmium::Area>(buffer, parent) {
-            }
-
-            /**
-             * Initialize area attributes from the attributes of the given object.
-             */
-            void initialize_from_object(const osmium::OSMObject& source) {
-                osmium::Area& area = object();
-                area.set_id(osmium::object_id_to_area_id(source.id(), source.type()));
-                area.set_version(source.version());
-                area.set_changeset(source.changeset());
-                area.set_timestamp(source.timestamp());
-                area.set_visible(source.visible());
-                area.set_uid(source.uid());
-
-                add_user(source.user());
-            }
-
-        }; // class AreaBuilder
-
-        typedef ObjectBuilder<osmium::Changeset> ChangesetBuilder;
-
-    } // namespace builder
-
-} // namespace osmium
-
-#endif // OSMIUM_BUILDER_OSM_OBJECT_BUILDER_HPP
diff --git a/contrib/libosmium/osmium/diff_handler.hpp b/contrib/libosmium/osmium/diff_handler.hpp
deleted file mode 100644
index 4f9b3a1..0000000
--- a/contrib/libosmium/osmium/diff_handler.hpp
+++ /dev/null
@@ -1,67 +0,0 @@
-#ifndef OSMIUM_DIFF_HANDLER_HPP
-#define OSMIUM_DIFF_HANDLER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <osmium/osm/diff_object.hpp>
-
-namespace osmium {
-
-    /**
-     * @brief Osmium diff handlers provide access to differences between OSM object versions
-     */
-    namespace diff_handler {
-
-        class DiffHandler {
-
-        public:
-
-            DiffHandler() {
-            }
-
-            void node(const osmium::DiffNode&) const {
-            }
-
-            void way(const osmium::DiffWay&) const {
-            }
-
-            void relation(const osmium::DiffRelation&) const {
-            }
-
-        }; // class DiffHandler
-
-    } // namespace diff_handler
-
-} // namespace osmium
-
-#endif // OSMIUM_DIFF_HANDLER_HPP
diff --git a/contrib/libosmium/osmium/diff_iterator.hpp b/contrib/libosmium/osmium/diff_iterator.hpp
deleted file mode 100644
index 4ee67f7..0000000
--- a/contrib/libosmium/osmium/diff_iterator.hpp
+++ /dev/null
@@ -1,129 +0,0 @@
-#ifndef OSMIUM_DIFF_ITERATOR_HPP
-#define OSMIUM_DIFF_ITERATOR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cassert>
-#include <iterator>
-#include <type_traits>
-
-#include <osmium/osm/diff_object.hpp>
-
-namespace osmium {
-
-    class OSMObject;
-
-    template <typename TBasicIterator>
-    class DiffIterator : public std::iterator<std::input_iterator_tag, const osmium::DiffObject> {
-
-        static_assert(std::is_base_of<osmium::OSMObject, typename TBasicIterator::value_type>::value, "TBasicIterator::value_type must derive from osmium::OSMObject");
-
-        TBasicIterator m_prev;
-        TBasicIterator m_curr;
-        TBasicIterator m_next;
-
-        const TBasicIterator m_end;
-
-        mutable osmium::DiffObject m_diff;
-
-        void set_diff() const {
-            assert(m_curr != m_end);
-
-            TBasicIterator prev = m_prev;
-            if (prev->type() != m_curr->type() || prev->id() != m_curr->id()) {
-                prev = m_curr;
-            }
-
-            TBasicIterator next = m_next;
-            if (next == m_end || next->type() != m_curr->type() || next->id() != m_curr->id()) {
-                next = m_curr;
-            }
-
-            m_diff = osmium::DiffObject(*prev, *m_curr, *next);
-        }
-
-    public:
-
-        explicit DiffIterator(TBasicIterator begin, TBasicIterator end) :
-            m_prev(begin),
-            m_curr(begin),
-            m_next(begin == end ? begin : ++begin),
-            m_end(end) {
-        }
-
-        DiffIterator(const DiffIterator&) = default;
-        DiffIterator& operator=(const DiffIterator&) = default;
-
-        DiffIterator(DiffIterator&&) = default;
-        DiffIterator& operator=(DiffIterator&&) = default;
-
-        DiffIterator& operator++() {
-            m_prev = std::move(m_curr);
-            m_curr = m_next;
-
-            if (m_next != m_end) {
-                ++m_next;
-            }
-
-            return *this;
-        }
-
-        DiffIterator operator++(int) {
-            DiffIterator tmp(*this);
-            operator++();
-            return tmp;
-        }
-
-        bool operator==(const DiffIterator& rhs) const {
-            return m_curr == rhs.m_curr && m_end == rhs.m_end;
-        }
-
-        bool operator!=(const DiffIterator& rhs) const {
-            return !(*this == rhs);
-        }
-
-        reference operator*() const {
-            set_diff();
-            return m_diff;
-        }
-
-        pointer operator->() const {
-            set_diff();
-            return &m_diff;
-        }
-
-    }; // class DiffIterator
-
-} // namespace osmium
-
-#endif // OSMIUM_DIFF_ITERATOR_HPP
diff --git a/contrib/libosmium/osmium/diff_visitor.hpp b/contrib/libosmium/osmium/diff_visitor.hpp
deleted file mode 100644
index e7dc576..0000000
--- a/contrib/libosmium/osmium/diff_visitor.hpp
+++ /dev/null
@@ -1,104 +0,0 @@
-#ifndef OSMIUM_DIFF_VISITOR_HPP
-#define OSMIUM_DIFF_VISITOR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <osmium/diff_iterator.hpp>
-#include <osmium/io/input_iterator.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm/diff_object.hpp>
-#include <osmium/osm/item_type.hpp>
-
-namespace osmium {
-
-    namespace detail {
-
-        template <typename THandler>
-        inline void apply_diff_iterator_recurse(const osmium::DiffObject& diff, THandler& handler) {
-            switch (diff.type()) {
-                case osmium::item_type::node:
-                    handler.node(static_cast<const osmium::DiffNode&>(diff));
-                    break;
-                case osmium::item_type::way:
-                    handler.way(static_cast<const osmium::DiffWay&>(diff));
-                    break;
-                case osmium::item_type::relation:
-                    handler.relation(static_cast<const osmium::DiffRelation&>(diff));
-                    break;
-                default:
-                    throw osmium::unknown_type();
-            }
-        }
-
-        template <typename THandler, typename... TRest>
-        inline void apply_diff_iterator_recurse(const osmium::DiffObject& diff, THandler& handler, TRest&... more) {
-            apply_diff_iterator_recurse(diff, handler);
-            apply_diff_iterator_recurse(diff, more...);
-        }
-
-    } // namespace detail
-
-    template <typename TIterator, typename... THandlers>
-    inline void apply_diff(TIterator it, TIterator end, THandlers&... handlers) {
-        typedef osmium::DiffIterator<TIterator> diff_iterator;
-
-        diff_iterator dit(it, end);
-        diff_iterator dend(end, end);
-
-        for (; dit != dend; ++dit) {
-            detail::apply_diff_iterator_recurse(*dit, handlers...);
-        }
-    }
-
-    class OSMObject;
-
-    template <typename TSource, typename... THandlers>
-    inline void apply_diff(TSource& source, THandlers&... handlers) {
-        apply_diff(osmium::io::InputIterator<TSource, osmium::OSMObject> {source},
-                   osmium::io::InputIterator<TSource, osmium::OSMObject> {},
-                   handlers...);
-    }
-
-    template <typename... THandlers>
-    inline void apply_diff(osmium::memory::Buffer& buffer, THandlers&... handlers) {
-        apply_diff(buffer.begin(), buffer.end(), handlers...);
-    }
-
-    template <typename... THandlers>
-    inline void apply_diff(const osmium::memory::Buffer& buffer, THandlers&... handlers) {
-        apply_diff(buffer.cbegin(), buffer.cend(), handlers...);
-    }
-
-} // namespace osmium
-
-#endif // OSMIUM_DIFF_VISITOR_HPP
diff --git a/contrib/libosmium/osmium/dynamic_handler.hpp b/contrib/libosmium/osmium/dynamic_handler.hpp
deleted file mode 100644
index 39baba5..0000000
--- a/contrib/libosmium/osmium/dynamic_handler.hpp
+++ /dev/null
@@ -1,190 +0,0 @@
-#ifndef OSMIUM_DYNAMIC_HANDLER_HPP
-#define OSMIUM_DYNAMIC_HANDLER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <memory>
-#include <utility>
-
-#include <osmium/fwd.hpp>
-#include <osmium/handler.hpp>
-
-namespace osmium {
-
-    namespace handler {
-
-        namespace detail {
-
-            class HandlerWrapperBase {
-
-            public:
-
-                virtual ~HandlerWrapperBase() {
-                }
-
-                virtual void node(const osmium::Node&) {
-                }
-
-                virtual void way(const osmium::Way&) {
-                }
-
-                virtual void relation(const osmium::Relation&) {
-                }
-
-                virtual void area(const osmium::Area&) {
-                }
-
-                virtual void changeset(const osmium::Changeset&) {
-                }
-
-                virtual void flush() {
-                }
-
-            }; // class HandlerWrapperBase
-
-
-            // The following uses trick from
-            // http://stackoverflow.com/questions/257288/is-it-possible-to-write-a-c-template-to-check-for-a-functions-existence
-            // to either call handler style functions or visitor style operator().
-
-#define OSMIUM_DYNAMIC_HANDLER_DISPATCH(_name_, _type_) \
-template <typename THandler> \
-auto _name_##_dispatch(THandler& handler, const osmium::_type_& object, int) -> decltype(handler._name_(object), void()) { \
-    handler._name_(object); \
-} \
-template <typename THandler> \
-auto _name_##_dispatch(THandler& handler, const osmium::_type_& object, long) -> decltype(handler(object), void()) { \
-    handler(object); \
-}
-
-            OSMIUM_DYNAMIC_HANDLER_DISPATCH(node, Node)
-            OSMIUM_DYNAMIC_HANDLER_DISPATCH(way, Way)
-            OSMIUM_DYNAMIC_HANDLER_DISPATCH(relation, Relation)
-            OSMIUM_DYNAMIC_HANDLER_DISPATCH(changeset, Changeset)
-            OSMIUM_DYNAMIC_HANDLER_DISPATCH(area, Area)
-
-            template <typename THandler>
-            auto flush_dispatch(THandler& handler, int) -> decltype(handler.flush(), void()) {
-                handler.flush();
-            }
-
-            template <typename THandler>
-            void flush_dispatch(THandler&, long) {}
-
-            template <typename THandler>
-            class HandlerWrapper : public HandlerWrapperBase {
-
-                THandler m_handler;
-
-            public:
-
-                template <typename... TArgs>
-                HandlerWrapper(TArgs&&... args) :
-                    m_handler(std::forward<TArgs>(args)...) {
-                }
-
-                void node(const osmium::Node& node) override final {
-                    node_dispatch(m_handler, node, 0);
-                }
-
-                void way(const osmium::Way& way) override final {
-                    way_dispatch(m_handler, way, 0);
-                }
-
-                void relation(const osmium::Relation& relation) override final {
-                    relation_dispatch(m_handler, relation, 0);
-                }
-
-                void area(const osmium::Area& area) override final {
-                    area_dispatch(m_handler, area, 0);
-                }
-
-                void changeset(const osmium::Changeset& changeset) override final {
-                    changeset_dispatch(m_handler, changeset, 0);
-                }
-
-                void flush() override final {
-                    flush_dispatch(m_handler, 0);
-                }
-
-            }; // class HandlerWrapper
-
-        } // namespace detail
-
-        class DynamicHandler : public osmium::handler::Handler {
-
-            typedef std::unique_ptr<osmium::handler::detail::HandlerWrapperBase> impl_ptr;
-            impl_ptr m_impl;
-
-        public:
-
-            DynamicHandler() :
-                m_impl(impl_ptr(new osmium::handler::detail::HandlerWrapperBase)) {
-            }
-
-            template <typename THandler, typename... TArgs>
-            void set(TArgs&&... args) {
-                m_impl = impl_ptr(new osmium::handler::detail::HandlerWrapper<THandler>(std::forward<TArgs>(args)...));
-            }
-
-            void node(const osmium::Node& node) {
-                m_impl->node(node);
-            }
-
-            void way(const osmium::Way& way) {
-                m_impl->way(way);
-            }
-
-            void relation(const osmium::Relation& relation) {
-                m_impl->relation(relation);
-            }
-
-            void area(const osmium::Area& area) {
-                m_impl->area(area);
-            }
-
-            void changeset(const osmium::Changeset& changeset) {
-                m_impl->changeset(changeset);
-            }
-
-            void flush() {
-                m_impl->flush();
-            }
-
-        }; // class DynamicHandler
-
-    } // namspace handler
-
-} // namespace osmium
-
-#endif // OSMIUM_DYNAMIC_HANDLER_HPP
diff --git a/contrib/libosmium/osmium/experimental/flex_reader.hpp b/contrib/libosmium/osmium/experimental/flex_reader.hpp
deleted file mode 100644
index c1d2357..0000000
--- a/contrib/libosmium/osmium/experimental/flex_reader.hpp
+++ /dev/null
@@ -1,137 +0,0 @@
-#ifndef OSMIUM_EXPERIMENTAL_FLEX_READER_HPP
-#define OSMIUM_EXPERIMENTAL_FLEX_READER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <string>
-#include <vector>
-
-#include <osmium/area/assembler.hpp>
-#include <osmium/area/multipolygon_collector.hpp>
-#include <osmium/handler/node_locations_for_ways.hpp>
-#include <osmium/io/file.hpp>
-#include <osmium/io/header.hpp>
-#include <osmium/io/reader.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm/entity_bits.hpp>
-#include <osmium/visitor.hpp>
-
-namespace osmium {
-
-    /**
-     * @brief Experimental code that is not "officially" supported.
-     */
-    namespace experimental {
-
-        template <typename TLocationHandler>
-        class FlexReader {
-
-            bool m_with_areas;
-            osmium::osm_entity_bits::type m_entities;
-
-            TLocationHandler& m_location_handler;
-
-            osmium::io::Reader m_reader;
-            osmium::area::Assembler::config_type m_assembler_config;
-            osmium::area::MultipolygonCollector<osmium::area::Assembler> m_collector;
-
-        public:
-
-            explicit FlexReader(const osmium::io::File& file, TLocationHandler& location_handler, osmium::osm_entity_bits::type entities = osmium::osm_entity_bits::nwr) :
-                m_with_areas((entities & osmium::osm_entity_bits::area) != 0),
-                m_entities((entities & ~osmium::osm_entity_bits::area) | (m_with_areas ? osmium::osm_entity_bits::node | osmium::osm_entity_bits::way : osmium::osm_entity_bits::nothing)),
-                m_location_handler(location_handler),
-                m_reader(file, m_entities),
-                m_assembler_config(),
-                m_collector(m_assembler_config)
-            {
-                m_location_handler.ignore_errors();
-                if (m_with_areas) {
-                    osmium::io::Reader reader(file, osmium::osm_entity_bits::relation);
-                    m_collector.read_relations(reader);
-                    reader.close();
-                }
-            }
-
-            explicit FlexReader(const std::string& filename, TLocationHandler& location_handler, osmium::osm_entity_bits::type entities = osmium::osm_entity_bits::nwr) :
-                FlexReader(osmium::io::File(filename), location_handler, entities) {
-            }
-
-            explicit FlexReader(const char* filename, TLocationHandler& location_handler, osmium::osm_entity_bits::type entities = osmium::osm_entity_bits::nwr) :
-                FlexReader(osmium::io::File(filename), location_handler, entities) {
-            }
-
-            osmium::memory::Buffer read() {
-                osmium::memory::Buffer buffer = m_reader.read();
-
-                if (buffer) {
-                    if (m_with_areas) {
-                        std::vector<osmium::memory::Buffer> area_buffers;
-                        osmium::apply(buffer, m_location_handler, m_collector.handler([&area_buffers](osmium::memory::Buffer&& area_buffer) {
-                            area_buffers.push_back(std::move(area_buffer));
-                        }));
-                        for (const osmium::memory::Buffer& b : area_buffers) {
-                            buffer.add_buffer(b);
-                            buffer.commit();
-                        }
-                    } else if (m_entities & (osmium::osm_entity_bits::node | osmium::osm_entity_bits::way)) {
-                        osmium::apply(buffer, m_location_handler);
-                    }
-                }
-
-                return buffer;
-            }
-
-            osmium::io::Header header() {
-                return m_reader.header();
-            }
-
-            void close() {
-                return m_reader.close();
-            }
-
-            bool eof() const {
-                return m_reader.eof();
-            }
-
-            const osmium::area::MultipolygonCollector<osmium::area::Assembler>& collector() const {
-                return m_collector;
-            }
-
-        }; // class FlexReader
-
-    } // namespace experimental
-
-} // namespace osmium
-
-#endif // OSMIUM_EXPERIMENTAL_FLEX_READER_HPP
diff --git a/contrib/libosmium/osmium/fwd.hpp b/contrib/libosmium/osmium/fwd.hpp
deleted file mode 100644
index bfcb5f5..0000000
--- a/contrib/libosmium/osmium/fwd.hpp
+++ /dev/null
@@ -1,70 +0,0 @@
-#ifndef OSMIUM_FWD_HPP
-#define OSMIUM_FWD_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-/**
- *
- * @file
- *
- * This file contains forward declarations for commonly used Osmium classes.
- *
- */
-
-namespace osmium {
-
-    class Area;
-    class Box;
-    class Changeset;
-    class ChangesetComment;
-    class ChangesetDiscussion;
-    class InnerRing;
-    class Location;
-    class Node;
-    class NodeRef;
-    class NodeRefList;
-    class OSMEntity;
-    class OSMObject;
-    class OuterRing;
-    class Relation;
-    class RelationMemberList;
-    class Segment;
-    class Tag;
-    class TagList;
-    class Timestamp;
-    class Way;
-    class WayNodeList;
-
-} // namespace osmium
-
-#endif // OSMIUM_FWD_HPP
diff --git a/contrib/libosmium/osmium/geom/coordinates.hpp b/contrib/libosmium/osmium/geom/coordinates.hpp
deleted file mode 100644
index 6544e68..0000000
--- a/contrib/libosmium/osmium/geom/coordinates.hpp
+++ /dev/null
@@ -1,96 +0,0 @@
-#ifndef OSMIUM_GEOM_COORDINATES_HPP
-#define OSMIUM_GEOM_COORDINATES_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <iosfwd>
-#include <string>
-
-#include <osmium/osm/location.hpp>
-#include <osmium/util/double.hpp>
-
-namespace osmium {
-
-    namespace geom {
-
-        struct Coordinates {
-
-            double x;
-            double y;
-
-            explicit Coordinates(double cx, double cy) noexcept : x(cx), y(cy) {
-            }
-
-            Coordinates(const osmium::Location& location) : x(location.lon()), y(location.lat()) {
-            }
-
-            void append_to_string(std::string& s, const char infix, int precision) const {
-                osmium::util::double2string(s, x, precision);
-                s += infix;
-                osmium::util::double2string(s, y, precision);
-            }
-
-            void append_to_string(std::string& s, const char prefix, const char infix, const char suffix, int precision) const {
-                s += prefix;
-                append_to_string(s, infix, precision);
-                s += suffix;
-            }
-
-        }; // struct coordinates
-
-        /**
-         * Compare whether two Coordinates are identical. Might not give the
-         * right result if the coordinates have been the result of some
-         * calculation that introduced rounding errors.
-         */
-        inline bool operator==(const Coordinates& lhs, const Coordinates& rhs) noexcept {
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wfloat-equal"
-            return lhs.x == rhs.x && lhs.y == rhs.y;
-#pragma GCC diagnostic pop
-        }
-
-        inline bool operator!=(const Coordinates& lhs, const Coordinates& rhs) noexcept {
-            return ! operator==(lhs, rhs);
-        }
-
-        template <typename TChar, typename TTraits>
-        inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const Coordinates& c) {
-            return out << '(' << c.x << ',' << c.y << ')';
-        }
-
-    } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_COORDINATES_HPP
diff --git a/contrib/libosmium/osmium/geom/factory.hpp b/contrib/libosmium/osmium/geom/factory.hpp
deleted file mode 100644
index 49dc78c..0000000
--- a/contrib/libosmium/osmium/geom/factory.hpp
+++ /dev/null
@@ -1,419 +0,0 @@
-#ifndef OSMIUM_GEOM_FACTORY_HPP
-#define OSMIUM_GEOM_FACTORY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstddef>
-#include <stdexcept>
-#include <string>
-#include <utility>
-
-#include <osmium/geom/coordinates.hpp>
-#include <osmium/memory/collection.hpp>
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/area.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node.hpp>
-#include <osmium/osm/node_ref.hpp>
-#include <osmium/osm/way.hpp>
-
-namespace osmium {
-
-    /**
-     * Exception thrown when an invalid geometry is encountered. An example
-     * would be a linestring with less than two points.
-     */
-    class geometry_error : public std::runtime_error {
-
-        std::string m_message;
-        osmium::object_id_type m_id;
-
-    public:
-
-        geometry_error(const std::string& message, const char* object_type = "", osmium::object_id_type id = 0) :
-            std::runtime_error(message),
-            m_message(message),
-            m_id(id) {
-            if (m_id != 0) {
-                m_message += " (";
-                m_message += object_type;
-                m_message += "_id=";
-                m_message += std::to_string(m_id);
-                m_message += ")";
-            }
-        }
-
-        void set_id(const char* object_type, osmium::object_id_type id) {
-            if (m_id == 0 && id != 0) {
-                m_message += " (";
-                m_message += object_type;
-                m_message += "_id=";
-                m_message += std::to_string(id);
-                m_message += ")";
-            }
-            m_id = id;
-        }
-
-        osmium::object_id_type id() const noexcept {
-            return m_id;
-        }
-
-        virtual const char* what() const noexcept override {
-            return m_message.c_str();
-        }
-
-    }; // struct geometry_error
-
-    /**
-     * @brief Everything related to geometry handling.
-     */
-    namespace geom {
-
-        /**
-         * Which nodes of a way to use for a linestring.
-         */
-        enum class use_nodes : bool {
-            unique = true, ///< Remove consecutive nodes with same location.
-            all    = false ///< Use all nodes.
-        }; // enum class use_nodes
-
-        /**
-         * Which direction the linestring created from a way
-         * should have.
-         */
-        enum class direction : bool {
-            backward = true, ///< Linestring has reverse direction.
-            forward  = false ///< Linestring has same direction as way.
-        }; // enum class direction
-
-        /**
-         * This pseudo projection just returns its WGS84 input unchanged.
-         * Used as a template parameter if a real projection is not needed.
-         */
-        class IdentityProjection {
-
-        public:
-
-            Coordinates operator()(osmium::Location location) const {
-                return Coordinates{location.lon(), location.lat()};
-            }
-
-            int epsg() const noexcept {
-                return 4326;
-            }
-
-            std::string proj_string() const {
-                return "+proj=longlat +datum=WGS84 +no_defs";
-            }
-
-        }; // class IdentityProjection
-
-        /**
-         * Geometry factory.
-         */
-        template <typename TGeomImpl, typename TProjection = IdentityProjection>
-        class GeometryFactory {
-
-            /**
-             * Add all points of an outer or inner ring to a multipolygon.
-             */
-            void add_points(const osmium::OuterRing& nodes) {
-                osmium::Location last_location;
-                for (const osmium::NodeRef& node_ref : nodes) {
-                    if (last_location != node_ref.location()) {
-                        last_location = node_ref.location();
-                        m_impl.multipolygon_add_location(m_projection(last_location));
-                    }
-                }
-            }
-
-            TProjection m_projection;
-            TGeomImpl m_impl;
-
-        public:
-
-            /**
-             * Constructor for default initialized projection.
-             */
-            template <typename... TArgs>
-            GeometryFactory<TGeomImpl, TProjection>(TArgs&&... args) :
-                m_projection(),
-                m_impl(std::forward<TArgs>(args)...) {
-            }
-
-            /**
-             * Constructor for explicitly initialized projection. Note that the
-             * projection is moved into the GeometryFactory.
-             */
-            template <typename... TArgs>
-            GeometryFactory<TGeomImpl, TProjection>(TProjection&& projection, TArgs&&... args) :
-                m_projection(std::move(projection)),
-                m_impl(std::forward<TArgs>(args)...) {
-            }
-
-            typedef TProjection projection_type;
-            typedef typename TGeomImpl::point_type        point_type;
-            typedef typename TGeomImpl::linestring_type   linestring_type;
-            typedef typename TGeomImpl::polygon_type      polygon_type;
-            typedef typename TGeomImpl::multipolygon_type multipolygon_type;
-            typedef typename TGeomImpl::ring_type         ring_type;
-
-            int epsg() const {
-                return m_projection.epsg();
-            }
-
-            std::string proj_string() const {
-                return m_projection.proj_string();
-            }
-
-            /* Point */
-
-            point_type create_point(const osmium::Location& location) const {
-                return m_impl.make_point(m_projection(location));
-            }
-
-            point_type create_point(const osmium::Node& node) {
-                try {
-                    return create_point(node.location());
-                } catch (osmium::geometry_error& e) {
-                    e.set_id("node", node.id());
-                    throw;
-                }
-            }
-
-            point_type create_point(const osmium::NodeRef& node_ref) {
-                try {
-                    return create_point(node_ref.location());
-                } catch (osmium::geometry_error& e) {
-                    e.set_id("node", node_ref.ref());
-                    throw;
-                }
-            }
-
-            /* LineString */
-
-            void linestring_start() {
-                m_impl.linestring_start();
-            }
-
-            template <typename TIter>
-            size_t fill_linestring(TIter it, TIter end) {
-                size_t num_points = 0;
-                for (; it != end; ++it, ++num_points) {
-                    m_impl.linestring_add_location(m_projection(it->location()));
-                }
-                return num_points;
-            }
-
-            template <typename TIter>
-            size_t fill_linestring_unique(TIter it, TIter end) {
-                size_t num_points = 0;
-                osmium::Location last_location;
-                for (; it != end; ++it) {
-                    if (last_location != it->location()) {
-                        last_location = it->location();
-                        m_impl.linestring_add_location(m_projection(last_location));
-                        ++num_points;
-                    }
-                }
-                return num_points;
-            }
-
-            linestring_type linestring_finish(size_t num_points) {
-                return m_impl.linestring_finish(num_points);
-            }
-
-            linestring_type create_linestring(const osmium::WayNodeList& wnl, use_nodes un = use_nodes::unique, direction dir = direction::forward) {
-                linestring_start();
-                size_t num_points = 0;
-
-                if (un == use_nodes::unique) {
-                    osmium::Location last_location;
-                    switch (dir) {
-                        case direction::forward:
-                            num_points = fill_linestring_unique(wnl.cbegin(), wnl.cend());
-                            break;
-                        case direction::backward:
-                            num_points = fill_linestring_unique(wnl.crbegin(), wnl.crend());
-                            break;
-                    }
-                } else {
-                    switch (dir) {
-                        case direction::forward:
-                            num_points = fill_linestring(wnl.cbegin(), wnl.cend());
-                            break;
-                        case direction::backward:
-                            num_points = fill_linestring(wnl.crbegin(), wnl.crend());
-                            break;
-                    }
-                }
-
-                if (num_points < 2) {
-                    throw osmium::geometry_error("need at least two points for linestring");
-                }
-
-                return linestring_finish(num_points);
-            }
-
-            linestring_type create_linestring(const osmium::Way& way, use_nodes un=use_nodes::unique, direction dir=direction::forward) {
-                try {
-                    return create_linestring(way.nodes(), un, dir);
-                } catch (osmium::geometry_error& e) {
-                    e.set_id("way", way.id());
-                    throw;
-                }
-            }
-
-            /* Polygon */
-
-            void polygon_start() {
-                m_impl.polygon_start();
-            }
-
-            template <typename TIter>
-            size_t fill_polygon(TIter it, TIter end) {
-                size_t num_points = 0;
-                for (; it != end; ++it, ++num_points) {
-                    m_impl.polygon_add_location(m_projection(it->location()));
-                }
-                return num_points;
-            }
-
-            template <typename TIter>
-            size_t fill_polygon_unique(TIter it, TIter end) {
-                size_t num_points = 0;
-                osmium::Location last_location;
-                for (; it != end; ++it) {
-                    if (last_location != it->location()) {
-                        last_location = it->location();
-                        m_impl.polygon_add_location(m_projection(last_location));
-                        ++num_points;
-                    }
-                }
-                return num_points;
-            }
-
-            polygon_type polygon_finish(size_t num_points) {
-                return m_impl.polygon_finish(num_points);
-            }
-
-            polygon_type create_polygon(const osmium::WayNodeList& wnl, use_nodes un = use_nodes::unique, direction dir = direction::forward) {
-                polygon_start();
-                size_t num_points = 0;
-
-                if (un == use_nodes::unique) {
-                    osmium::Location last_location;
-                    switch (dir) {
-                        case direction::forward:
-                            num_points = fill_polygon_unique(wnl.cbegin(), wnl.cend());
-                            break;
-                        case direction::backward:
-                            num_points = fill_polygon_unique(wnl.crbegin(), wnl.crend());
-                            break;
-                    }
-                } else {
-                    switch (dir) {
-                        case direction::forward:
-                            num_points = fill_polygon(wnl.cbegin(), wnl.cend());
-                            break;
-                        case direction::backward:
-                            num_points = fill_polygon(wnl.crbegin(), wnl.crend());
-                            break;
-                    }
-                }
-
-                if (num_points < 4) {
-                    throw osmium::geometry_error("need at least four points for polygon");
-                }
-
-                return polygon_finish(num_points);
-            }
-
-            polygon_type create_polygon(const osmium::Way& way, use_nodes un=use_nodes::unique, direction dir=direction::forward) {
-                try {
-                    return create_polygon(way.nodes(), un, dir);
-                } catch (osmium::geometry_error& e) {
-                    e.set_id("way", way.id());
-                    throw;
-                }
-            }
-
-            /* MultiPolygon */
-
-            multipolygon_type create_multipolygon(const osmium::Area& area) {
-                try {
-                    size_t num_polygons = 0;
-                    size_t num_rings = 0;
-                    m_impl.multipolygon_start();
-
-                    for (auto it = area.cbegin(); it != area.cend(); ++it) {
-                        const osmium::OuterRing& ring = static_cast<const osmium::OuterRing&>(*it);
-                        if (it->type() == osmium::item_type::outer_ring) {
-                            if (num_polygons > 0) {
-                                m_impl.multipolygon_polygon_finish();
-                            }
-                            m_impl.multipolygon_polygon_start();
-                            m_impl.multipolygon_outer_ring_start();
-                            add_points(ring);
-                            m_impl.multipolygon_outer_ring_finish();
-                            ++num_rings;
-                            ++num_polygons;
-                        } else if (it->type() == osmium::item_type::inner_ring) {
-                            m_impl.multipolygon_inner_ring_start();
-                            add_points(ring);
-                            m_impl.multipolygon_inner_ring_finish();
-                            ++num_rings;
-                        }
-                    }
-
-                    // if there are no rings, this area is invalid
-                    if (num_rings == 0) {
-                        throw osmium::geometry_error("area contains no rings");
-                    }
-
-                    m_impl.multipolygon_polygon_finish();
-                    return m_impl.multipolygon_finish();
-                } catch (osmium::geometry_error& e) {
-                    e.set_id("area", area.id());
-                    throw;
-                }
-            }
-
-        }; // class GeometryFactory
-
-    } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_FACTORY_HPP
diff --git a/contrib/libosmium/osmium/geom/geojson.hpp b/contrib/libosmium/osmium/geom/geojson.hpp
deleted file mode 100644
index e5b5a9c..0000000
--- a/contrib/libosmium/osmium/geom/geojson.hpp
+++ /dev/null
@@ -1,160 +0,0 @@
-#ifndef OSMIUM_GEOM_GEOJSON_HPP
-#define OSMIUM_GEOM_GEOJSON_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cassert>
-#include <string>
-#include <utility>
-
-#include <osmium/geom/coordinates.hpp>
-#include <osmium/geom/factory.hpp>
-
-namespace osmium {
-
-    namespace geom {
-
-        namespace detail {
-
-            class GeoJSONFactoryImpl {
-
-                std::string m_str;
-                int m_precision;
-
-            public:
-
-                typedef std::string point_type;
-                typedef std::string linestring_type;
-                typedef std::string polygon_type;
-                typedef std::string multipolygon_type;
-                typedef std::string ring_type;
-
-                GeoJSONFactoryImpl(int precision = 7) :
-                    m_precision(precision) {
-                }
-
-                /* Point */
-
-                // { "type": "Point", "coordinates": [100.0, 0.0] }
-                point_type make_point(const osmium::geom::Coordinates& xy) const {
-                    std::string str {"{\"type\":\"Point\",\"coordinates\":"};
-                    xy.append_to_string(str, '[', ',', ']', m_precision);
-                    str += "}";
-                    return str;
-                }
-
-                /* LineString */
-
-                // { "type": "LineString", "coordinates": [ [100.0, 0.0], [101.0, 1.0] ] }
-                void linestring_start() {
-                    m_str = "{\"type\":\"LineString\",\"coordinates\":[";
-                }
-
-                void linestring_add_location(const osmium::geom::Coordinates& xy) {
-                    xy.append_to_string(m_str, '[', ',', ']', m_precision);
-                    m_str += ',';
-                }
-
-                linestring_type linestring_finish(size_t /* num_points */) {
-                    assert(!m_str.empty());
-                    std::string str;
-
-                    using std::swap;
-                    swap(str, m_str);
-
-                    str.back() = ']';
-                    str += "}";
-                    return str;
-                }
-
-                /* MultiPolygon */
-
-                void multipolygon_start() {
-                    m_str = "{\"type\":\"MultiPolygon\",\"coordinates\":[";
-                }
-
-                void multipolygon_polygon_start() {
-                    m_str += '[';
-                }
-
-                void multipolygon_polygon_finish() {
-                    m_str += "],";
-                }
-
-                void multipolygon_outer_ring_start() {
-                    m_str += '[';
-                }
-
-                void multipolygon_outer_ring_finish() {
-                    assert(!m_str.empty());
-                    m_str.back() = ']';
-                }
-
-                void multipolygon_inner_ring_start() {
-                    m_str += ",[";
-                }
-
-                void multipolygon_inner_ring_finish() {
-                    assert(!m_str.empty());
-                    m_str.back() = ']';
-                }
-
-                void multipolygon_add_location(const osmium::geom::Coordinates& xy) {
-                    xy.append_to_string(m_str, '[', ',', ']', m_precision);
-                    m_str += ',';
-                }
-
-                multipolygon_type multipolygon_finish() {
-                    assert(!m_str.empty());
-                    std::string str;
-
-                    using std::swap;
-                    swap(str, m_str);
-
-                    str.back() = ']';
-                    str += "}";
-                    return str;
-                }
-
-            }; // class GeoJSONFactoryImpl
-
-        } // namespace detail
-
-        template <typename TProjection = IdentityProjection>
-        using GeoJSONFactory = GeometryFactory<osmium::geom::detail::GeoJSONFactoryImpl, TProjection>;
-
-    } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_GEOJSON_HPP
diff --git a/contrib/libosmium/osmium/geom/geos.hpp b/contrib/libosmium/osmium/geom/geos.hpp
deleted file mode 100644
index 49b1fd7..0000000
--- a/contrib/libosmium/osmium/geom/geos.hpp
+++ /dev/null
@@ -1,240 +0,0 @@
-#ifndef OSMIUM_GEOM_GEOS_HPP
-#define OSMIUM_GEOM_GEOS_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-/**
- * @file
- *
- * This file contains code for conversion of OSM geometries into GDAL
- * geometries.
- *
- * @attention If you include this file, you'll need to link with `libgeos`.
- */
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include <geos/geom/Coordinate.h>
-#include <geos/geom/CoordinateSequence.h>
-#include <geos/geom/CoordinateSequenceFactory.h>
-#include <geos/geom/GeometryFactory.h>
-#include <geos/geom/LinearRing.h>
-#include <geos/geom/MultiPolygon.h>
-#include <geos/geom/Point.h>
-#include <geos/geom/Polygon.h>
-#include <geos/geom/PrecisionModel.h>
-#include <geos/util/GEOSException.h>
-
-#include <osmium/geom/factory.hpp>
-#include <osmium/geom/coordinates.hpp>
-
-// MSVC doesn't support throw_with_nested yet
-#ifdef _MSC_VER
-# define THROW throw
-#else
-# define THROW std::throw_with_nested
-#endif
-
-namespace osmium {
-
-    struct geos_geometry_error : public geometry_error {
-
-        geos_geometry_error(const char* message) :
-            geometry_error(std::string("geometry creation failed in GEOS library: ") + message) {
-        }
-
-    }; // struct geos_geometry_error
-
-    namespace geom {
-
-        namespace detail {
-
-            class GEOSFactoryImpl {
-
-                std::unique_ptr<const geos::geom::PrecisionModel> m_precision_model;
-                std::unique_ptr<geos::geom::GeometryFactory> m_our_geos_factory;
-                geos::geom::GeometryFactory* m_geos_factory;
-
-                std::unique_ptr<geos::geom::CoordinateSequence> m_coordinate_sequence;
-                std::vector<std::unique_ptr<geos::geom::LinearRing>> m_rings;
-                std::vector<std::unique_ptr<geos::geom::Polygon>> m_polygons;
-
-            public:
-
-                typedef std::unique_ptr<geos::geom::Point>        point_type;
-                typedef std::unique_ptr<geos::geom::LineString>   linestring_type;
-                typedef std::unique_ptr<geos::geom::Polygon>      polygon_type;
-                typedef std::unique_ptr<geos::geom::MultiPolygon> multipolygon_type;
-                typedef std::unique_ptr<geos::geom::LinearRing>   ring_type;
-
-                explicit GEOSFactoryImpl(geos::geom::GeometryFactory& geos_factory) :
-                    m_precision_model(nullptr),
-                    m_our_geos_factory(nullptr),
-                    m_geos_factory(&geos_factory) {
-                }
-
-                explicit GEOSFactoryImpl(int srid = -1) :
-                    m_precision_model(new geos::geom::PrecisionModel),
-                    m_our_geos_factory(new geos::geom::GeometryFactory(m_precision_model.get(), srid)),
-                    m_geos_factory(m_our_geos_factory.get()) {
-                }
-
-                /* Point */
-
-                point_type make_point(const osmium::geom::Coordinates& xy) const {
-                    try {
-                        return point_type(m_geos_factory->createPoint(geos::geom::Coordinate(xy.x, xy.y)));
-                    } catch (geos::util::GEOSException& e) {
-                        THROW(osmium::geos_geometry_error(e.what()));
-                    }
-                }
-
-                /* LineString */
-
-                void linestring_start() {
-                    try {
-                        m_coordinate_sequence.reset(m_geos_factory->getCoordinateSequenceFactory()->create(static_cast<size_t>(0), 2));
-                    } catch (geos::util::GEOSException& e) {
-                        THROW(osmium::geos_geometry_error(e.what()));
-                    }
-                }
-
-                void linestring_add_location(const osmium::geom::Coordinates& xy) {
-                    try {
-                        m_coordinate_sequence->add(geos::geom::Coordinate(xy.x, xy.y));
-                    } catch (geos::util::GEOSException& e) {
-                        THROW(osmium::geos_geometry_error(e.what()));
-                    }
-                }
-
-                linestring_type linestring_finish(size_t /* num_points */) {
-                    try {
-                        return linestring_type(m_geos_factory->createLineString(m_coordinate_sequence.release()));
-                    } catch (geos::util::GEOSException& e) {
-                        THROW(osmium::geos_geometry_error(e.what()));
-                    }
-                }
-
-                /* MultiPolygon */
-
-                void multipolygon_start() {
-                    m_polygons.clear();
-                }
-
-                void multipolygon_polygon_start() {
-                    m_rings.clear();
-                }
-
-                void multipolygon_polygon_finish() {
-                    try {
-                        assert(!m_rings.empty());
-                        auto inner_rings = new std::vector<geos::geom::Geometry*>;
-                        std::transform(std::next(m_rings.begin(), 1), m_rings.end(), std::back_inserter(*inner_rings), [](std::unique_ptr<geos::geom::LinearRing>& r) {
-                            return r.release();
-                        });
-                        m_polygons.emplace_back(m_geos_factory->createPolygon(m_rings[0].release(), inner_rings));
-                        m_rings.clear();
-                    } catch (geos::util::GEOSException& e) {
-                        THROW(osmium::geos_geometry_error(e.what()));
-                    }
-                }
-
-                void multipolygon_outer_ring_start() {
-                    try {
-                        m_coordinate_sequence.reset(m_geos_factory->getCoordinateSequenceFactory()->create(static_cast<size_t>(0), 2));
-                    } catch (geos::util::GEOSException& e) {
-                        THROW(osmium::geos_geometry_error(e.what()));
-                    }
-                }
-
-                void multipolygon_outer_ring_finish() {
-                    try {
-                        m_rings.emplace_back(m_geos_factory->createLinearRing(m_coordinate_sequence.release()));
-                    } catch (geos::util::GEOSException& e) {
-                        THROW(osmium::geos_geometry_error(e.what()));
-                    }
-                }
-
-                void multipolygon_inner_ring_start() {
-                    try {
-                        m_coordinate_sequence.reset(m_geos_factory->getCoordinateSequenceFactory()->create(static_cast<size_t>(0), 2));
-                    } catch (geos::util::GEOSException& e) {
-                        THROW(osmium::geos_geometry_error(e.what()));
-                    }
-                }
-
-                void multipolygon_inner_ring_finish() {
-                    try {
-                        m_rings.emplace_back(m_geos_factory->createLinearRing(m_coordinate_sequence.release()));
-                    } catch (geos::util::GEOSException& e) {
-                        THROW(osmium::geos_geometry_error(e.what()));
-                    }
-                }
-
-                void multipolygon_add_location(const osmium::geom::Coordinates& xy) {
-                    try {
-                        m_coordinate_sequence->add(geos::geom::Coordinate(xy.x, xy.y));
-                    } catch (geos::util::GEOSException& e) {
-                        THROW(osmium::geos_geometry_error(e.what()));
-                    }
-                }
-
-                multipolygon_type multipolygon_finish() {
-                    try {
-                        auto polygons = new std::vector<geos::geom::Geometry*>;
-                        std::transform(m_polygons.begin(), m_polygons.end(), std::back_inserter(*polygons), [](std::unique_ptr<geos::geom::Polygon>& p) {
-                            return p.release();
-                        });
-                        m_polygons.clear();
-                        return multipolygon_type(m_geos_factory->createMultiPolygon(polygons));
-                    } catch (geos::util::GEOSException& e) {
-                        THROW(osmium::geos_geometry_error(e.what()));
-                    }
-                }
-
-            }; // class GEOSFactoryImpl
-
-        } // namespace detail
-
-        template <typename TProjection = IdentityProjection>
-        using GEOSFactory = GeometryFactory<osmium::geom::detail::GEOSFactoryImpl, TProjection>;
-
-    } // namespace geom
-
-} // namespace osmium
-
-#undef THROW
-
-#endif // OSMIUM_GEOM_GEOS_HPP
diff --git a/contrib/libosmium/osmium/geom/haversine.hpp b/contrib/libosmium/osmium/geom/haversine.hpp
deleted file mode 100644
index e62a31b..0000000
--- a/contrib/libosmium/osmium/geom/haversine.hpp
+++ /dev/null
@@ -1,94 +0,0 @@
-#ifndef OSMIUM_GEOM_HAVERSINE_HPP
-#define OSMIUM_GEOM_HAVERSINE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cmath>
-#include <iterator>
-
-#include <osmium/geom/coordinates.hpp>
-#include <osmium/geom/util.hpp>
-#include <osmium/osm/node_ref.hpp>
-#include <osmium/osm/way.hpp>
-
-namespace osmium {
-
-    namespace geom {
-
-        /**
-         * @brief Functions to calculate arc distance on Earth using the haversine formula.
-         *
-         * See http://en.wikipedia.org/wiki/Haversine_formula
-         *
-         * Implementation derived from
-         * http://blog.julien.cayzac.name/2008/10/arc-and-distance-between-two-points-on.html
-         */
-        namespace haversine {
-
-            /// @brief Earth's quadratic mean radius for WGS84
-            constexpr double EARTH_RADIUS_IN_METERS = 6372797.560856;
-
-            /**
-             * Calculate distance in meters between two sets of coordinates.
-             */
-            inline double distance(const osmium::geom::Coordinates& c1, const osmium::geom::Coordinates& c2) {
-                double lonh = sin(deg_to_rad(c1.x - c2.x) * 0.5);
-                lonh *= lonh;
-                double lath = sin(deg_to_rad(c1.y - c2.y) * 0.5);
-                lath *= lath;
-                const double tmp = cos(deg_to_rad(c1.y)) * cos(deg_to_rad(c2.y));
-                return 2.0 * EARTH_RADIUS_IN_METERS * asin(sqrt(lath + tmp*lonh));
-            }
-
-            /**
-             * Calculate length of way.
-             */
-            inline double distance(const osmium::WayNodeList& wnl) {
-                double sum_length = 0;
-
-                for (auto it = wnl.begin(); it != wnl.end(); ++it) {
-                    if (std::next(it) != wnl.end()) {
-                        sum_length += distance(it->location(), std::next(it)->location());
-                    }
-                }
-
-                return sum_length;
-            }
-
-        } // namespace haversine
-
-    } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_HAVERSINE_HPP
diff --git a/contrib/libosmium/osmium/geom/mercator_projection.hpp b/contrib/libosmium/osmium/geom/mercator_projection.hpp
deleted file mode 100644
index 22a0d64..0000000
--- a/contrib/libosmium/osmium/geom/mercator_projection.hpp
+++ /dev/null
@@ -1,110 +0,0 @@
-#ifndef OSMIUM_GEOM_MERCATOR_PROJECTION_HPP
-#define OSMIUM_GEOM_MERCATOR_PROJECTION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cmath>
-#include <string>
-
-#include <osmium/geom/coordinates.hpp>
-#include <osmium/geom/util.hpp>
-#include <osmium/osm/location.hpp>
-
-namespace osmium {
-
-    namespace geom {
-
-        namespace detail {
-
-            constexpr double earth_radius_for_epsg3857 = 6378137.0;
-            constexpr double max_coordinate_epsg3857 = 20037508.34;
-
-            constexpr inline double lon_to_x(double lon) {
-                return earth_radius_for_epsg3857 * deg_to_rad(lon);
-            }
-
-            inline double lat_to_y(double lat) { // not constexpr because math functions aren't
-                return earth_radius_for_epsg3857 * std::log(std::tan(osmium::geom::PI/4 + deg_to_rad(lat)/2));
-            }
-
-            constexpr inline double x_to_lon(double x) {
-                return rad_to_deg(x) / earth_radius_for_epsg3857;
-            }
-
-            inline double y_to_lat(double y) { // not constexpr because math functions aren't
-                return rad_to_deg(2 * std::atan(std::exp(y / earth_radius_for_epsg3857)) - osmium::geom::PI/2);
-            }
-
-        } // namespace detail
-
-        /**
-         * The maximum latitude that can be projected with the Web Mercator
-         * (EPSG:3857) projection.
-         */
-        constexpr double MERCATOR_MAX_LAT = 85.0511288;
-
-        inline Coordinates lonlat_to_mercator(const Coordinates& c) {
-            return Coordinates(detail::lon_to_x(c.x), detail::lat_to_y(c.y));
-        }
-
-        inline Coordinates mercator_to_lonlat(const Coordinates& c) {
-            return Coordinates(detail::x_to_lon(c.x), detail::y_to_lat(c.y));
-        }
-
-        /**
-         * Functor that does projection from WGS84 (EPSG:4326) to "Web
-         * Mercator" (EPSG:3857)
-         */
-        class MercatorProjection {
-
-        public:
-
-            Coordinates operator()(osmium::Location location) const {
-                return Coordinates {detail::lon_to_x(location.lon()), detail::lat_to_y(location.lat())};
-            }
-
-            int epsg() const noexcept {
-                return 3857;
-            }
-
-            std::string proj_string() const {
-                return "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs";
-            }
-
-        }; // class MercatorProjection
-
-    } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_MERCATOR_PROJECTION_HPP
diff --git a/contrib/libosmium/osmium/geom/ogr.hpp b/contrib/libosmium/osmium/geom/ogr.hpp
deleted file mode 100644
index 4d5995c..0000000
--- a/contrib/libosmium/osmium/geom/ogr.hpp
+++ /dev/null
@@ -1,178 +0,0 @@
-#ifndef OSMIUM_GEOM_OGR_HPP
-#define OSMIUM_GEOM_OGR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-/**
- * @file
- *
- * This file contains code for conversion of OSM geometries into OGR
- * geometries.
- *
- * @attention If you include this file, you'll need to link with `libgdal`.
- */
-
-#include <cassert>
-#include <cstddef>
-#include <memory>
-#include <utility>
-
-#include <ogr_geometry.h>
-
-#include <osmium/geom/coordinates.hpp>
-#include <osmium/geom/factory.hpp>
-
-namespace osmium {
-
-    namespace geom {
-
-        namespace detail {
-
-            class OGRFactoryImpl {
-
-            public:
-
-                typedef std::unique_ptr<OGRPoint>        point_type;
-                typedef std::unique_ptr<OGRLineString>   linestring_type;
-                typedef std::unique_ptr<OGRPolygon>      polygon_type;
-                typedef std::unique_ptr<OGRMultiPolygon> multipolygon_type;
-                typedef std::unique_ptr<OGRLinearRing>   ring_type;
-
-            private:
-
-                linestring_type   m_linestring;
-                multipolygon_type m_multipolygon;
-                polygon_type      m_polygon;
-                ring_type         m_ring;
-
-            public:
-
-                OGRFactoryImpl() = default;
-
-                /* Point */
-
-                point_type make_point(const osmium::geom::Coordinates& xy) const {
-                    return point_type(new OGRPoint(xy.x, xy.y));
-                }
-
-                /* LineString */
-
-                void linestring_start() {
-                    m_linestring = std::unique_ptr<OGRLineString>(new OGRLineString());
-                }
-
-                void linestring_add_location(const osmium::geom::Coordinates& xy) {
-                    assert(!!m_linestring);
-                    m_linestring->addPoint(xy.x, xy.y);
-                }
-
-                linestring_type linestring_finish(size_t /* num_points */) {
-                    return std::move(m_linestring);
-                }
-
-                /* Polygon */
-
-                void polygon_start() {
-                    m_ring = std::unique_ptr<OGRLinearRing>(new OGRLinearRing());
-                }
-
-                void polygon_add_location(const osmium::geom::Coordinates& xy) {
-                    assert(!!m_ring);
-                    m_ring->addPoint(xy.x, xy.y);
-                }
-
-                polygon_type polygon_finish(size_t /* num_points */) {
-                    std::unique_ptr<OGRPolygon> polygon = std::unique_ptr<OGRPolygon>(new OGRPolygon());
-                    polygon->addRingDirectly(m_ring.release());
-                    return polygon;
-                }
-
-                /* MultiPolygon */
-
-                void multipolygon_start() {
-                    m_multipolygon.reset(new OGRMultiPolygon());
-                }
-
-                void multipolygon_polygon_start() {
-                    m_polygon.reset(new OGRPolygon());
-                }
-
-                void multipolygon_polygon_finish() {
-                    assert(!!m_multipolygon);
-                    assert(!!m_polygon);
-                    m_multipolygon->addGeometryDirectly(m_polygon.release());
-                }
-
-                void multipolygon_outer_ring_start() {
-                    m_ring.reset(new OGRLinearRing());
-                }
-
-                void multipolygon_outer_ring_finish() {
-                    assert(!!m_polygon);
-                    assert(!!m_ring);
-                    m_polygon->addRingDirectly(m_ring.release());
-                }
-
-                void multipolygon_inner_ring_start() {
-                    m_ring.reset(new OGRLinearRing());
-                }
-
-                void multipolygon_inner_ring_finish() {
-                    assert(!!m_polygon);
-                    assert(!!m_ring);
-                    m_polygon->addRingDirectly(m_ring.release());
-                }
-
-                void multipolygon_add_location(const osmium::geom::Coordinates& xy) {
-                    assert(!!m_polygon);
-                    assert(!!m_ring);
-                    m_ring->addPoint(xy.x, xy.y);
-                }
-
-                multipolygon_type multipolygon_finish() {
-                    assert(!!m_multipolygon);
-                    return std::move(m_multipolygon);
-                }
-
-            }; // class OGRFactoryImpl
-
-        } // namespace detail
-
-        template <typename TProjection = IdentityProjection>
-        using OGRFactory = GeometryFactory<osmium::geom::detail::OGRFactoryImpl, TProjection>;
-
-    } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_OGR_HPP
diff --git a/contrib/libosmium/osmium/geom/projection.hpp b/contrib/libosmium/osmium/geom/projection.hpp
deleted file mode 100644
index 6419101..0000000
--- a/contrib/libosmium/osmium/geom/projection.hpp
+++ /dev/null
@@ -1,167 +0,0 @@
-#ifndef OSMIUM_GEOM_PROJECTION_HPP
-#define OSMIUM_GEOM_PROJECTION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-/**
- * @file
- *
- * This file contains code for projecting OSM locations to arbitrary
- * coordinate reference systems. It is based on the Proj.4 library.
- *
- * @attention If you include this file, you'll need to link with `libproj`.
- */
-
-#include <memory>
-#include <string>
-
-#include <proj_api.h>
-
-#include <osmium/geom/coordinates.hpp>
-#include <osmium/geom/util.hpp>
-#include <osmium/osm/location.hpp>
-
-namespace osmium {
-
-    namespace geom {
-
-        /**
-         * C++ wrapper for a Coordinate Reference System of the proj library.
-         */
-        class CRS {
-
-            struct ProjCRSDeleter {
-                void operator()(void* crs) {
-                    pj_free(crs);
-                }
-            }; // struct ProjCRSDeleter
-
-            std::unique_ptr<void, ProjCRSDeleter> m_crs;
-
-            projPJ get() const {
-                return m_crs.get();
-            }
-
-        public:
-
-            CRS(const std::string& crs) :
-                m_crs(pj_init_plus(crs.c_str()), ProjCRSDeleter()) {
-                if (!m_crs) {
-                    throw osmium::projection_error(std::string("creation of CRS failed: ") + pj_strerrno(*pj_get_errno_ref()));
-                }
-            }
-
-            CRS(int epsg) :
-                CRS(std::string("+init=epsg:") + std::to_string(epsg)) {
-            }
-
-            bool is_latlong() const {
-                return pj_is_latlong(m_crs.get()) != 0;
-            }
-
-            bool is_geocent() const {
-                return pj_is_geocent(m_crs.get()) != 0;
-            }
-
-            /**
-             * Transform coordinates from one CRS into another. Wraps the same function
-             * of the proj library.
-             *
-             * Coordinates have to be in radians and are produced in radians.
-             *
-             * @throws osmmium::projection_error if the projection fails
-             */
-            friend Coordinates transform(const CRS& src, const CRS& dest, Coordinates c) {
-                int result = pj_transform(src.get(), dest.get(), 1, 1, &c.x, &c.y, nullptr);
-                if (result != 0) {
-                    throw osmium::projection_error(std::string("projection failed: ") + pj_strerrno(result));
-                }
-                return c;
-            }
-
-        }; // class CRS
-
-        /**
-         * Functor that does projection from WGS84 (EPSG:4326) to the given
-         * CRS.
-         */
-        class Projection {
-
-            int m_epsg;
-            std::string m_proj_string;
-            CRS m_crs_wgs84 {4326};
-            CRS m_crs_user;
-
-        public:
-
-            Projection(const std::string& proj_string) :
-                m_epsg(-1),
-                m_proj_string(proj_string),
-                m_crs_user(proj_string) {
-            }
-
-            Projection(int epsg) :
-                m_epsg(epsg),
-                m_proj_string(std::string("+init=epsg:") + std::to_string(epsg)),
-                m_crs_user(epsg) {
-            }
-
-            Coordinates operator()(osmium::Location location) const {
-                Coordinates c {location.lon(), location.lat()};
-
-                if (m_epsg != 4326) {
-                    c = transform(m_crs_wgs84, m_crs_user, Coordinates(deg_to_rad(location.lon()), deg_to_rad(location.lat())));
-                    if (m_crs_user.is_latlong()) {
-                        c.x = rad_to_deg(c.x);
-                        c.y = rad_to_deg(c.y);
-                    }
-                }
-
-                return c;
-            }
-
-            int epsg() const noexcept {
-                return m_epsg;
-            }
-
-            std::string proj_string() const {
-                return m_proj_string;
-            }
-
-        }; // class Projection
-
-    } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_PROJECTION_HPP
diff --git a/contrib/libosmium/osmium/geom/rapid_geojson.hpp b/contrib/libosmium/osmium/geom/rapid_geojson.hpp
deleted file mode 100644
index 87e479b..0000000
--- a/contrib/libosmium/osmium/geom/rapid_geojson.hpp
+++ /dev/null
@@ -1,190 +0,0 @@
-#ifndef OSMIUM_GEOM_RAPID_GEOJSON_HPP
-#define OSMIUM_GEOM_RAPID_GEOJSON_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <osmium/geom/coordinates.hpp>
-#include <osmium/geom/factory.hpp>
-
-namespace osmium {
-
-    namespace geom {
-
-        namespace detail {
-
-            /**
-             * A geometry factory implementation that can be used with the
-             * RapidJSON (https://github.com/miloyip/rapidjson) JSON writer.
-             */
-            template <typename TWriter>
-            class RapidGeoJSONFactoryImpl {
-
-                TWriter* m_writer;
-
-            public:
-
-                typedef void point_type;
-                typedef void linestring_type;
-                typedef void polygon_type;
-                typedef void multipolygon_type;
-                typedef void ring_type;
-
-                RapidGeoJSONFactoryImpl(TWriter& writer) :
-                    m_writer(&writer) {
-                }
-
-                /* Point */
-
-                // { "type": "Point", "coordinates": [100.0, 0.0] }
-                point_type make_point(const osmium::geom::Coordinates& xy) const {
-                    m_writer->String("geometry");
-                    m_writer->StartObject();
-                    m_writer->String("type");
-                    m_writer->String("Point");
-                    m_writer->String("coordinates");
-                    m_writer->StartArray();
-                    m_writer->Double(xy.x);
-                    m_writer->Double(xy.y);
-                    m_writer->EndArray();
-                    m_writer->EndObject();
-                }
-
-                /* LineString */
-
-                // { "type": "LineString", "coordinates": [ [100.0, 0.0], [101.0, 1.0] ] }
-                void linestring_start() {
-                    m_writer->String("geometry");
-                    m_writer->StartObject();
-                    m_writer->String("type");
-                    m_writer->String("LineString");
-                    m_writer->String("coordinates");
-                    m_writer->StartArray();
-                }
-
-                void linestring_add_location(const osmium::geom::Coordinates& xy) {
-                    m_writer->StartArray();
-                    m_writer->Double(xy.x);
-                    m_writer->Double(xy.y);
-                    m_writer->EndArray();
-                }
-
-                linestring_type linestring_finish(size_t /* num_points */) {
-                    m_writer->EndArray();
-                    m_writer->EndObject();
-                }
-
-                /* Polygon */
-
-                // { "type": "Polygon", "coordinates": [[[100.0, 0.0], [101.0, 1.0]]] }
-                void polygon_start() {
-                    m_writer->String("geometry");
-                    m_writer->StartObject();
-                    m_writer->String("type");
-                    m_writer->String("Polygon");
-                    m_writer->String("coordinates");
-                    m_writer->StartArray();
-                    m_writer->StartArray();
-                }
-
-                void polygon_add_location(const osmium::geom::Coordinates& xy) {
-                    m_writer->StartArray();
-                    m_writer->Double(xy.x);
-                    m_writer->Double(xy.y);
-                    m_writer->EndArray();
-                }
-
-                polygon_type polygon_finish(size_t /* num_points */) {
-                    m_writer->EndArray();
-                    m_writer->EndArray();
-                    m_writer->EndObject();
-                }
-
-                /* MultiPolygon */
-
-                void multipolygon_start() {
-                    m_writer->String("geometry");
-                    m_writer->StartObject();
-                    m_writer->String("type");
-                    m_writer->String("MultiPolygon");
-                    m_writer->String("coordinates");
-                    m_writer->StartArray();
-                }
-
-                void multipolygon_polygon_start() {
-                    m_writer->StartArray();
-                }
-
-                void multipolygon_polygon_finish() {
-                    m_writer->EndArray();
-                }
-
-                void multipolygon_outer_ring_start() {
-                    m_writer->StartArray();
-                }
-
-                void multipolygon_outer_ring_finish() {
-                    m_writer->EndArray();
-                }
-
-                void multipolygon_inner_ring_start() {
-                    m_writer->StartArray();
-                }
-
-                void multipolygon_inner_ring_finish() {
-                    m_writer->EndArray();
-                }
-
-                void multipolygon_add_location(const osmium::geom::Coordinates& xy) {
-                    m_writer->StartArray();
-                    m_writer->Double(xy.x);
-                    m_writer->Double(xy.y);
-                    m_writer->EndArray();
-                }
-
-                multipolygon_type multipolygon_finish() {
-                    m_writer->EndArray();
-                    m_writer->EndObject();
-                }
-
-            }; // class RapidGeoJSONFactoryImpl
-
-        } // namespace detail
-
-        template <typename TWriter, typename TProjection = IdentityProjection>
-        using RapidGeoJSONFactory = GeometryFactory<detail::RapidGeoJSONFactoryImpl<TWriter>, TProjection>;
-
-    } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_RAPID_GEOJSON_HPP
diff --git a/contrib/libosmium/osmium/geom/relations.hpp b/contrib/libosmium/osmium/geom/relations.hpp
deleted file mode 100644
index e9e2aa4..0000000
--- a/contrib/libosmium/osmium/geom/relations.hpp
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef OSMIUM_GEOM_RELATIONS_HPP
-#define OSMIUM_GEOM_RELATIONS_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <osmium/osm/box.hpp>
-#include <osmium/osm/location.hpp>
-
-namespace osmium {
-
-    namespace geom {
-
-        /**
-         * Check whether one geometry contains another.
-         */
-        inline bool contains(const osmium::Box& a, const osmium::Box& b) {
-            return ((a.bottom_left().x() >= b.bottom_left().x()) &&
-                    (a.top_right().x()   <= b.top_right().x())   &&
-                    (a.bottom_left().y() >= b.bottom_left().y()) &&
-                    (a.top_right().y()   <= b.top_right().y()));
-        }
-
-    } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_RELATIONS_HPP
diff --git a/contrib/libosmium/osmium/geom/tile.hpp b/contrib/libosmium/osmium/geom/tile.hpp
deleted file mode 100644
index 6ca0682..0000000
--- a/contrib/libosmium/osmium/geom/tile.hpp
+++ /dev/null
@@ -1,101 +0,0 @@
-#ifndef OSMIUM_GEOM_TILE_HPP
-#define OSMIUM_GEOM_TILE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstdint>
-
-#include <osmium/geom/mercator_projection.hpp>
-
-namespace osmium {
-
-    namespace geom {
-
-        namespace detail {
-
-            template <typename T>
-            inline T restrict_to_range(T value, T min, T max) {
-                if (value < min) return min;
-                if (value > max) return max;
-                return value;
-            }
-
-        } // namespace detail
-
-        /**
-         * A tile in the usual Mercator projection.
-         */
-        struct Tile {
-
-            uint32_t x;
-            uint32_t y;
-            uint32_t z;
-
-            explicit Tile(uint32_t zoom, uint32_t tx, uint32_t ty) noexcept : x(tx), y(ty), z(zoom) {
-            }
-
-            explicit Tile(uint32_t zoom, const osmium::Location& location) :
-                z(zoom) {
-                osmium::geom::Coordinates c = lonlat_to_mercator(location);
-                const int32_t n = 1 << zoom;
-                const double scale = detail::max_coordinate_epsg3857 * 2 / n;
-                x = uint32_t(detail::restrict_to_range<int32_t>(int32_t((c.x + detail::max_coordinate_epsg3857) / scale), 0, n-1));
-                y = uint32_t(detail::restrict_to_range<int32_t>(int32_t((detail::max_coordinate_epsg3857 - c.y) / scale), 0, n-1));
-            }
-
-        }; // struct Tile
-
-        inline bool operator==(const Tile& a, const Tile& b) {
-            return a.z == b.z && a.x == b.x && a.y == b.y;
-        }
-
-        inline bool operator!=(const Tile& a, const Tile& b) {
-            return ! (a == b);
-        }
-
-        /**
-         * This defines an arbitrary order on tiles for use in std::map etc.
-         */
-        inline bool operator<(const Tile& a, const Tile& b) {
-            if (a.z < b.z) return true;
-            if (a.z > b.z) return false;
-            if (a.x < b.x) return true;
-            if (a.x > b.x) return false;
-            return a.y < b.y;
-        }
-
-    } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_TILE_HPP
diff --git a/contrib/libosmium/osmium/geom/util.hpp b/contrib/libosmium/osmium/geom/util.hpp
deleted file mode 100644
index 5e9f822..0000000
--- a/contrib/libosmium/osmium/geom/util.hpp
+++ /dev/null
@@ -1,75 +0,0 @@
-#ifndef OSMIUM_GEOM_UTIL_HPP
-#define OSMIUM_GEOM_UTIL_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <stdexcept>
-#include <string>
-
-namespace osmium {
-
-    /**
-     * Exception thrown when a projection object can not be initialized or the
-     * projection of some coordinates can not be calculated.
-     */
-    struct projection_error : public std::runtime_error {
-
-        projection_error(const std::string& what) :
-            std::runtime_error(what) {
-        }
-
-        projection_error(const char* what) :
-            std::runtime_error(what) {
-        }
-
-    }; // struct projection_error
-
-    namespace geom {
-
-        constexpr double PI = 3.14159265358979323846;
-
-        /// Convert angle from degrees to radians.
-        inline constexpr double deg_to_rad(double degree) noexcept {
-            return degree * (PI / 180.0);
-        }
-
-        /// Convert angle from radians to degrees.
-        inline constexpr double rad_to_deg(double radians) noexcept {
-            return radians * (180.0 / PI);
-        }
-
-    } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_UTIL_HPP
diff --git a/contrib/libosmium/osmium/geom/wkb.hpp b/contrib/libosmium/osmium/geom/wkb.hpp
deleted file mode 100644
index 49833e6..0000000
--- a/contrib/libosmium/osmium/geom/wkb.hpp
+++ /dev/null
@@ -1,273 +0,0 @@
-#ifndef OSMIUM_GEOM_WKB_HPP
-#define OSMIUM_GEOM_WKB_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstddef>
-#include <cstdint>
-#include <string>
-
-#include <osmium/geom/coordinates.hpp>
-#include <osmium/geom/factory.hpp>
-#include <osmium/util/cast.hpp>
-#include <osmium/util/endian.hpp>
-
-namespace osmium {
-
-    namespace geom {
-
-        enum class wkb_type : bool {
-            wkb  = false,
-            ewkb = true
-        }; // enum class wkb_type
-
-        enum class out_type : bool {
-            binary = false,
-            hex    = true
-        }; // enum class out_type
-
-        namespace detail {
-
-            template <typename T>
-            inline void str_push(std::string& str, T data) {
-                size_t size = str.size();
-                str.resize(size + sizeof(T));
-                std::copy_n(reinterpret_cast<char*>(&data), sizeof(T), &str[size]);
-            }
-
-            inline std::string convert_to_hex(const std::string& str) {
-                static const char* lookup_hex = "0123456789ABCDEF";
-                std::string out;
-
-                for (char c : str) {
-                    out += lookup_hex[(c >> 4) & 0xf];
-                    out += lookup_hex[c & 0xf];
-                }
-
-                return out;
-            }
-
-            class WKBFactoryImpl {
-
-                /// OSM data always uses SRID 4326 (WGS84).
-                static constexpr uint32_t srid = 4326;
-
-                /**
-                * Type of WKB geometry.
-                * These definitions are from
-                * 99-049_OpenGIS_Simple_Features_Specification_For_SQL_Rev_1.1.pdf (for WKB)
-                * and http://trac.osgeo.org/postgis/browser/trunk/doc/ZMSgeoms.txt (for EWKB).
-                * They are used to encode geometries into the WKB format.
-                */
-                enum wkbGeometryType : uint32_t {
-                    wkbPoint               = 1,
-                    wkbLineString          = 2,
-                    wkbPolygon             = 3,
-                    wkbMultiPoint          = 4,
-                    wkbMultiLineString     = 5,
-                    wkbMultiPolygon        = 6,
-                    wkbGeometryCollection  = 7,
-
-                    // SRID-presence flag (EWKB)
-                    wkbSRID                = 0x20000000
-                }; // enum wkbGeometryType
-
-                /**
-                * Byte order marker in WKB geometry.
-                */
-                enum class wkb_byte_order_type : uint8_t {
-                    XDR = 0,         // Big Endian
-                    NDR = 1          // Little Endian
-                }; // enum class wkb_byte_order_type
-
-                std::string m_data;
-                uint32_t m_points {0};
-                wkb_type m_wkb_type;
-                out_type m_out_type;
-
-                size_t m_linestring_size_offset = 0;
-                size_t m_polygons = 0;
-                size_t m_rings = 0;
-                size_t m_multipolygon_size_offset = 0;
-                size_t m_polygon_size_offset = 0;
-                size_t m_ring_size_offset = 0;
-
-                size_t header(std::string& str, wkbGeometryType type, bool add_length) const {
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-                    str_push(str, wkb_byte_order_type::NDR);
-#else
-                    str_push(str, wkb_byte_order_type::XDR);
-#endif
-                    if (m_wkb_type == wkb_type::ewkb) {
-                        str_push(str, type | wkbSRID);
-                        str_push(str, srid);
-                    } else {
-                        str_push(str, type);
-                    }
-                    size_t offset = str.size();
-                    if (add_length) {
-                        str_push(str, static_cast<uint32_t>(0));
-                    }
-                    return offset;
-                }
-
-                void set_size(const size_t offset, const size_t size) {
-                    *reinterpret_cast<uint32_t*>(&m_data[offset]) = static_cast_with_assert<uint32_t>(size);
-                }
-
-            public:
-
-                typedef std::string point_type;
-                typedef std::string linestring_type;
-                typedef std::string polygon_type;
-                typedef std::string multipolygon_type;
-                typedef std::string ring_type;
-
-                explicit WKBFactoryImpl(wkb_type wtype = wkb_type::wkb, out_type otype = out_type::binary) :
-                    m_wkb_type(wtype),
-                    m_out_type(otype) {
-                }
-
-                /* Point */
-
-                point_type make_point(const osmium::geom::Coordinates& xy) const {
-                    std::string data;
-                    header(data, wkbPoint, false);
-                    str_push(data, xy.x);
-                    str_push(data, xy.y);
-
-                    if (m_out_type == out_type::hex) {
-                        return convert_to_hex(data);
-                    } else {
-                        return data;
-                    }
-                }
-
-                /* LineString */
-
-                void linestring_start() {
-                    m_data.clear();
-                    m_linestring_size_offset = header(m_data, wkbLineString, true);
-                }
-
-                void linestring_add_location(const osmium::geom::Coordinates& xy) {
-                    str_push(m_data, xy.x);
-                    str_push(m_data, xy.y);
-                }
-
-                linestring_type linestring_finish(size_t num_points) {
-                    set_size(m_linestring_size_offset, num_points);
-                    std::string data;
-
-                    using std::swap;
-                    swap(data, m_data);
-
-                    if (m_out_type == out_type::hex) {
-                        return convert_to_hex(data);
-                    } else {
-                        return data;
-                    }
-                }
-
-                /* MultiPolygon */
-
-                void multipolygon_start() {
-                    m_data.clear();
-                    m_polygons = 0;
-                    m_multipolygon_size_offset = header(m_data, wkbMultiPolygon, true);
-                }
-
-                void multipolygon_polygon_start() {
-                    ++m_polygons;
-                    m_rings = 0;
-                    m_polygon_size_offset = header(m_data, wkbPolygon, true);
-                }
-
-                void multipolygon_polygon_finish() {
-                    set_size(m_polygon_size_offset, m_rings);
-                }
-
-                void multipolygon_outer_ring_start() {
-                    ++m_rings;
-                    m_points = 0;
-                    m_ring_size_offset = m_data.size();
-                    str_push(m_data, static_cast<uint32_t>(0));
-                }
-
-                void multipolygon_outer_ring_finish() {
-                    set_size(m_ring_size_offset, m_points);
-                }
-
-                void multipolygon_inner_ring_start() {
-                    ++m_rings;
-                    m_points = 0;
-                    m_ring_size_offset = m_data.size();
-                    str_push(m_data, static_cast<uint32_t>(0));
-                }
-
-                void multipolygon_inner_ring_finish() {
-                    set_size(m_ring_size_offset, m_points);
-                }
-
-                void multipolygon_add_location(const osmium::geom::Coordinates& xy) {
-                    str_push(m_data, xy.x);
-                    str_push(m_data, xy.y);
-                    ++m_points;
-                }
-
-                multipolygon_type multipolygon_finish() {
-                    set_size(m_multipolygon_size_offset, m_polygons);
-                    std::string data;
-
-                    using std::swap;
-                    swap(data, m_data);
-
-                    if (m_out_type == out_type::hex) {
-                        return convert_to_hex(data);
-                    } else {
-                        return data;
-                    }
-                }
-
-            }; // class WKBFactoryImpl
-
-        } // namespace detail
-
-        template <typename TProjection = IdentityProjection>
-        using WKBFactory = GeometryFactory<osmium::geom::detail::WKBFactoryImpl, TProjection>;
-
-    } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_WKB_HPP
diff --git a/contrib/libosmium/osmium/geom/wkt.hpp b/contrib/libosmium/osmium/geom/wkt.hpp
deleted file mode 100644
index 9cf5371..0000000
--- a/contrib/libosmium/osmium/geom/wkt.hpp
+++ /dev/null
@@ -1,156 +0,0 @@
-#ifndef OSMIUM_GEOM_WKT_HPP
-#define OSMIUM_GEOM_WKT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cassert>
-#include <cstddef>
-#include <string>
-#include <utility>
-
-#include <osmium/geom/coordinates.hpp>
-#include <osmium/geom/factory.hpp>
-
-namespace osmium {
-
-    namespace geom {
-
-        namespace detail {
-
-            class WKTFactoryImpl {
-
-                std::string m_str;
-                int m_precision;
-
-            public:
-
-                typedef std::string point_type;
-                typedef std::string linestring_type;
-                typedef std::string polygon_type;
-                typedef std::string multipolygon_type;
-                typedef std::string ring_type;
-
-                WKTFactoryImpl(int precision = 7) :
-                    m_precision(precision) {
-                }
-
-                /* Point */
-
-                point_type make_point(const osmium::geom::Coordinates& xy) const {
-                    std::string str {"POINT"};
-                    xy.append_to_string(str, '(', ' ', ')', m_precision);
-                    return str;
-                }
-
-                /* LineString */
-
-                void linestring_start() {
-                    m_str = "LINESTRING(";
-                }
-
-                void linestring_add_location(const osmium::geom::Coordinates& xy) {
-                    xy.append_to_string(m_str, ' ', m_precision);
-                    m_str += ',';
-                }
-
-                linestring_type linestring_finish(size_t /* num_points */) {
-                    assert(!m_str.empty());
-                    std::string str;
-
-                    using std::swap;
-                    swap(str, m_str);
-
-                    str.back() = ')';
-                    return str;
-                }
-
-                /* MultiPolygon */
-
-                void multipolygon_start() {
-                    m_str = "MULTIPOLYGON(";
-                }
-
-                void multipolygon_polygon_start() {
-                    m_str += '(';
-                }
-
-                void multipolygon_polygon_finish() {
-                    m_str += "),";
-                }
-
-                void multipolygon_outer_ring_start() {
-                    m_str += '(';
-                }
-
-                void multipolygon_outer_ring_finish() {
-                    assert(!m_str.empty());
-                    m_str.back() = ')';
-                }
-
-                void multipolygon_inner_ring_start() {
-                    m_str += ",(";
-                }
-
-                void multipolygon_inner_ring_finish() {
-                    assert(!m_str.empty());
-                    m_str.back() = ')';
-                }
-
-                void multipolygon_add_location(const osmium::geom::Coordinates& xy) {
-                    xy.append_to_string(m_str, ' ', m_precision);
-                    m_str += ',';
-                }
-
-                multipolygon_type multipolygon_finish() {
-                    assert(!m_str.empty());
-                    std::string str;
-
-                    using std::swap;
-                    swap(str, m_str);
-
-                    str.back() = ')';
-                    return str;
-                }
-
-            }; // class WKTFactoryImpl
-
-        } // namespace detail
-
-        template <typename TProjection = IdentityProjection>
-        using WKTFactory = GeometryFactory<osmium::geom::detail::WKTFactoryImpl, TProjection>;
-
-    } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_WKT_HPP
diff --git a/contrib/libosmium/osmium/handler.hpp b/contrib/libosmium/osmium/handler.hpp
deleted file mode 100644
index f366197..0000000
--- a/contrib/libosmium/osmium/handler.hpp
+++ /dev/null
@@ -1,94 +0,0 @@
-#ifndef OSMIUM_HANDLER_HPP
-#define OSMIUM_HANDLER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <osmium/fwd.hpp>
-
-namespace osmium {
-
-    /**
-     * @brief Osmium handlers provide callbacks for OSM objects
-     */
-    namespace handler {
-
-        class Handler {
-
-        public:
-
-            void osm_object(const osmium::OSMObject&) const {
-            }
-
-            void node(const osmium::Node&) const {
-            }
-
-            void way(const osmium::Way&) const {
-            }
-
-            void relation(const osmium::Relation&) const {
-            }
-
-            void area(const osmium::Area&) const {
-            }
-
-            void changeset(const osmium::Changeset&) const {
-            }
-
-            void tag_list(const osmium::TagList&) const {
-            }
-
-            void way_node_list(const osmium::WayNodeList&) const {
-            }
-
-            void relation_member_list(const osmium::RelationMemberList&) const {
-            }
-
-            void outer_ring(const osmium::OuterRing&) const {
-            }
-
-            void inner_ring(const osmium::InnerRing&) const {
-            }
-
-            void changeset_discussion(const osmium::ChangesetDiscussion&) const {
-            }
-
-            void flush() const {
-            }
-
-        }; // class Handler
-
-    } // namspace handler
-
-} // namespace osmium
-
-#endif // OSMIUM_HANDLER_HPP
diff --git a/contrib/libosmium/osmium/handler/chain.hpp b/contrib/libosmium/osmium/handler/chain.hpp
deleted file mode 100644
index 4f3291c..0000000
--- a/contrib/libosmium/osmium/handler/chain.hpp
+++ /dev/null
@@ -1,128 +0,0 @@
-#ifndef OSMIUM_HANDLER_CHAIN_HPP
-#define OSMIUM_HANDLER_CHAIN_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <tuple>
-
-#include <osmium/handler.hpp>
-
-#define OSMIUM_CHAIN_HANDLER_CALL(_func_, _type_) \
-    template <int N, int SIZE, typename THandlers> \
-    struct call_ ## _func_ { \
-        void operator()(THandlers& handlers, osmium::_type_& object) { \
-            std::get<N>(handlers)._func_(object); \
-            call_ ## _func_<N+1, SIZE, THandlers>()(handlers, object); \
-        } \
-    }; \
-    template <int SIZE, typename THandlers> \
-    struct call_ ## _func_<SIZE, SIZE, THandlers> { \
-        void operator()(THandlers&, osmium::_type_&) {} \
-    };
-
-namespace osmium {
-
-    class Node;
-    class Way;
-    class Relation;
-    class Area;
-    class Changeset;
-
-    namespace handler {
-
-        /**
-         * This handler allows chaining of any number of handlers into a single
-         * handler.
-         */
-        template <typename... THandler>
-        class ChainHandler : public osmium::handler::Handler {
-
-            typedef std::tuple<THandler&...> handlers_type;
-            handlers_type m_handlers;
-
-            template <int N, int SIZE, typename THandlers>
-            struct call_flush {
-                void operator()(THandlers& handlers) {
-                    std::get<N>(handlers).flush();
-                    call_flush<N+1, SIZE, THandlers>()(handlers);
-                }
-            }; // struct call_flush
-
-            template <int SIZE, typename THandlers>
-            struct call_flush<SIZE, SIZE, THandlers> {
-                void operator()(THandlers&) {}
-            }; // struct call_flush
-
-            OSMIUM_CHAIN_HANDLER_CALL(node, Node)
-            OSMIUM_CHAIN_HANDLER_CALL(way, Way)
-            OSMIUM_CHAIN_HANDLER_CALL(relation, Relation)
-            OSMIUM_CHAIN_HANDLER_CALL(changeset, Changeset)
-            OSMIUM_CHAIN_HANDLER_CALL(area, Area)
-
-        public:
-
-            explicit ChainHandler(THandler&... handlers) :
-                m_handlers(handlers...) {
-            }
-
-            void node(osmium::Node& node) {
-                call_node<0, sizeof...(THandler), handlers_type>()(m_handlers, node);
-            }
-
-            void way(osmium::Way& way) {
-                call_way<0, sizeof...(THandler), handlers_type>()(m_handlers, way);
-            }
-
-            void relation(osmium::Relation& relation) {
-                call_relation<0, sizeof...(THandler), handlers_type>()(m_handlers, relation);
-            }
-
-            void changeset( osmium::Changeset& changeset) {
-                call_changeset<0, sizeof...(THandler), handlers_type>()(m_handlers, changeset);
-            }
-
-            void area(osmium::Area& area) {
-                call_area<0, sizeof...(THandler), handlers_type>()(m_handlers, area);
-            }
-
-            void flush() {
-                call_flush<0, sizeof...(THandler), handlers_type>()(m_handlers);
-            }
-
-        }; // class ChainHandler
-
-    } // namespace handler
-
-} // namespace osmium
-
-#endif // OSMIUM_HANDLER_CHAIN_HPP
diff --git a/contrib/libosmium/osmium/handler/disk_store.hpp b/contrib/libosmium/osmium/handler/disk_store.hpp
deleted file mode 100644
index ccae596..0000000
--- a/contrib/libosmium/osmium/handler/disk_store.hpp
+++ /dev/null
@@ -1,111 +0,0 @@
-#ifndef OSMIUM_HANDLER_DISK_STORE_HPP
-#define OSMIUM_HANDLER_DISK_STORE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstddef>
-
-#include <osmium/handler.hpp>
-#include <osmium/index/map.hpp>
-#include <osmium/io/detail/read_write.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/memory/item_iterator.hpp>
-#include <osmium/osm/node.hpp>
-#include <osmium/osm/relation.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/osm/way.hpp>
-#include <osmium/visitor.hpp>
-
-namespace osmium {
-
-    namespace handler {
-
-        /**
-         *
-         * Note: This handler will only work if either all object IDs are
-         *       positive or all object IDs are negative.
-         */
-        class DiskStore : public osmium::handler::Handler {
-
-            typedef osmium::index::map::Map<unsigned_object_id_type, size_t> offset_index_type;
-
-            size_t m_offset = 0;
-            int m_data_fd;
-
-            offset_index_type& m_node_index;
-            offset_index_type& m_way_index;
-            offset_index_type& m_relation_index;
-
-        public:
-
-            explicit DiskStore(int data_fd, offset_index_type& node_index, offset_index_type& way_index, offset_index_type& relation_index) :
-                m_data_fd(data_fd),
-                m_node_index(node_index),
-                m_way_index(way_index),
-                m_relation_index(relation_index) {
-            }
-
-            DiskStore(const DiskStore&) = delete;
-            DiskStore& operator=(const DiskStore&) = delete;
-
-            ~DiskStore() noexcept = default;
-
-            void node(const osmium::Node& node) {
-                m_node_index.set(node.positive_id(), m_offset);
-                m_offset += node.byte_size();
-            }
-
-            void way(const osmium::Way& way) {
-                m_way_index.set(way.positive_id(), m_offset);
-                m_offset += way.byte_size();
-            }
-
-            void relation(const osmium::Relation& relation) {
-                m_relation_index.set(relation.positive_id(), m_offset);
-                m_offset += relation.byte_size();
-            }
-
-            // XXX
-            void operator()(const osmium::memory::Buffer& buffer) {
-                osmium::io::detail::reliable_write(m_data_fd, buffer.data(), buffer.committed());
-
-                osmium::apply(buffer.begin(), buffer.end(), *this);
-            }
-
-        }; // class DiskStore
-
-    } // namespace handler
-
-} // namespace osmium
-
-#endif // OSMIUM_HANDLER_DISK_STORE_HPP
diff --git a/contrib/libosmium/osmium/handler/dump.hpp b/contrib/libosmium/osmium/handler/dump.hpp
deleted file mode 100644
index a23236e..0000000
--- a/contrib/libosmium/osmium/handler/dump.hpp
+++ /dev/null
@@ -1,294 +0,0 @@
-#ifndef OSMIUM_HANDLER_DUMP_HPP
-#define OSMIUM_HANDLER_DUMP_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <iomanip>
-#include <iostream>
-#include <string>
-
-#include <osmium/handler.hpp>
-#include <osmium/memory/collection.hpp>
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/area.hpp>
-#include <osmium/osm/box.hpp>
-#include <osmium/osm/changeset.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node.hpp>
-#include <osmium/osm/node_ref.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/relation.hpp>
-#include <osmium/osm/tag.hpp>
-#include <osmium/osm/timestamp.hpp>
-#include <osmium/osm/way.hpp>
-#include <osmium/visitor.hpp>
-
-namespace osmium {
-
-    namespace handler {
-
-        class Dump : public osmium::handler::Handler {
-
-            std::ostream* m_out;
-            bool m_with_size;
-            std::string m_prefix;
-
-            void print_title(const char* title, const osmium::memory::Item& item) {
-                *m_out << m_prefix
-                       << title
-                       << ":";
-
-                if (m_with_size) {
-                    *m_out << " ["
-                           << item.byte_size()
-                           << "]";
-                }
-
-                *m_out << "\n";
-            }
-
-            void print_meta(const osmium::OSMObject& object) {
-                *m_out << m_prefix
-                       << "  id="
-                       << object.id()
-                       << "\n";
-                *m_out << m_prefix
-                       << "  version="
-                       << object.version()
-                       << "\n";
-                *m_out << m_prefix
-                       << "  uid="
-                       << object.uid()
-                       << "\n";
-                *m_out << m_prefix
-                       << "  user=|"
-                       << object.user()
-                       << "|\n";
-                *m_out << m_prefix
-                       << "  changeset="
-                       << object.changeset()
-                       << "\n";
-                *m_out << m_prefix
-                       << "  timestamp="
-                       << object.timestamp().to_iso()
-                       << "\n";
-                *m_out << m_prefix
-                       << "  visible="
-                       << (object.visible() ? "yes" : "no")
-                       << "\n";
-
-                Dump dump(*m_out, m_with_size, m_prefix + "  ");
-                osmium::apply(object.cbegin(), object.cend(), dump);
-            }
-
-            void print_location(const osmium::Node& node) {
-                const osmium::Location& location = node.location();
-
-                if (location) {
-                    *m_out << m_prefix
-                           << "  lon="
-                           << std::fixed
-                           << std::setprecision(7)
-                           << location.lon_without_check()
-                           << "\n";
-                    *m_out << m_prefix
-                           << "  lat="
-                           << location.lat_without_check()
-                           << "\n";
-                } else {
-                    *m_out << m_prefix
-                           << "  lon=\n"
-                           << m_prefix
-                           << "  lat=\n";
-                }
-            }
-
-        public:
-
-            explicit Dump(std::ostream& out, bool with_size = true, const std::string& prefix = "") :
-                m_out(&out),
-                m_with_size(with_size),
-                m_prefix(prefix) {
-            }
-
-            void tag_list(const osmium::TagList& tags) {
-                print_title("TAGS", tags);
-                for (const auto& tag : tags) {
-                    *m_out << m_prefix
-                           << "  k=|"
-                           << tag.key()
-                           << "| v=|"
-                           << tag.value()
-                           << "|"
-                           << "\n";
-                }
-            }
-
-            void way_node_list(const osmium::WayNodeList& wnl) {
-                print_title("NODES", wnl);
-                for (const auto& node_ref : wnl) {
-                    *m_out << m_prefix
-                           << "  ref="
-                           << node_ref.ref();
-                    if (node_ref.location()) {
-                        *m_out << " pos="
-                               << node_ref.location();
-                    }
-                    *m_out << "\n";
-                }
-            }
-
-            void relation_member_list(const osmium::RelationMemberList& rml) {
-                print_title("MEMBERS", rml);
-                for (const auto& member : rml) {
-                    *m_out << m_prefix
-                           << "  type="
-                           << item_type_to_name(member.type())
-                           << " ref="
-                           << member.ref()
-                           << " role=|"
-                           << member.role()
-                           << "|\n";
-                    if (member.full_member()) {
-                        Dump dump(*m_out, m_with_size, m_prefix + "  | ");
-                        osmium::apply_item(member.get_object(), dump);
-                    }
-                }
-            }
-
-            void outer_ring(const osmium::OuterRing& ring) {
-                print_title("OUTER RING", ring);
-                for (const auto& node_ref : ring) {
-                    *m_out << m_prefix
-                           << "  ref="
-                           << node_ref.ref();
-                    if (node_ref.location()) {
-                        *m_out << " pos="
-                               << node_ref.location();
-                    }
-                    *m_out << "\n";
-                }
-            }
-
-            void inner_ring(const osmium::InnerRing& ring) {
-                print_title("INNER RING", ring);
-                for (const auto& node_ref : ring) {
-                    *m_out << m_prefix
-                           << "  ref="
-                           << node_ref.ref();
-                    if (node_ref.location()) {
-                        *m_out << " pos="
-                               << node_ref.location();
-                    }
-                    *m_out << "\n";
-                }
-            }
-
-            void node(const osmium::Node& node) {
-                print_title("NODE", node);
-                print_meta(node);
-                print_location(node);
-            }
-
-            void way(const osmium::Way& way) {
-                print_title("WAY", way);
-                print_meta(way);
-            }
-
-            void relation(const osmium::Relation& relation) {
-                print_title("RELATION", relation);
-                print_meta(relation);
-            }
-
-            void area(const osmium::Area& area) {
-                print_title("AREA", area);
-                print_meta(area);
-            }
-
-            void changeset(const osmium::Changeset& changeset) {
-                print_title("CHANGESET", changeset);
-                *m_out << m_prefix
-                       << "  id="
-                       << changeset.id()
-                       << "\n";
-                *m_out << m_prefix
-                       << "  num_changes="
-                       << changeset.num_changes()
-                       << "\n";
-                *m_out << m_prefix
-                       << "  uid="
-                       << changeset.uid()
-                       << "\n";
-                *m_out << m_prefix
-                       << "  user=|"
-                       << changeset.user()
-                       << "|\n";
-                *m_out << m_prefix
-                       << "  created_at="
-                       << changeset.created_at().to_iso()
-                       << "\n";
-                *m_out << m_prefix
-                       << "  closed_at="
-                       << changeset.closed_at().to_iso()
-                       << "\n";
-                *m_out << m_prefix
-                       << "  bounds=";
-
-                if (changeset.bounds()) {
-                    *m_out << '('
-                           << changeset.bounds().bottom_left().lon_without_check()
-                           << ','
-                           << changeset.bounds().bottom_left().lat_without_check()
-                           << ','
-                           << changeset.bounds().top_right().lon_without_check()
-                           << ','
-                           << changeset.bounds().top_right().lat_without_check()
-                           << ')';
-                } else {
-                    *m_out << "(undefined)";
-                }
-
-                *m_out << "\n";
-
-                Dump dump(*m_out, m_with_size, m_prefix + "  ");
-                osmium::apply(changeset.cbegin(), changeset.cend(), dump);
-            }
-
-        }; // class Dump
-
-    } // namespace handler
-
-} // namespace osmium
-
-#endif // OSMIUM_HANDLER_DUMP_HPP
diff --git a/contrib/libosmium/osmium/handler/node_locations_for_ways.hpp b/contrib/libosmium/osmium/handler/node_locations_for_ways.hpp
deleted file mode 100644
index 8d31310..0000000
--- a/contrib/libosmium/osmium/handler/node_locations_for_ways.hpp
+++ /dev/null
@@ -1,180 +0,0 @@
-#ifndef OSMIUM_HANDLER_NODE_LOCATIONS_FOR_WAYS_HPP
-#define OSMIUM_HANDLER_NODE_LOCATIONS_FOR_WAYS_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <type_traits>
-
-#include <osmium/handler.hpp>
-#include <osmium/index/index.hpp>
-#include <osmium/index/map/dummy.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node.hpp>
-#include <osmium/osm/node_ref.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/osm/way.hpp>
-
-#include <osmium/index/node_locations_map.hpp>
-
-namespace osmium {
-
-    namespace handler {
-
-        typedef osmium::index::map::Dummy<osmium::unsigned_object_id_type, osmium::Location> dummy_type;
-
-        /**
-         * Handler to retrieve locations from nodes and add them to ways.
-         *
-         * @tparam TStoragePosIDs Class that handles the actual storage of the node locations
-         *                        (for positive IDs). It must support the set(id, value) and
-         *                        get(id) methods.
-         * @tparam TStorageNegIDs Same but for negative IDs.
-         */
-        template <typename TStoragePosIDs, typename TStorageNegIDs = dummy_type>
-        class NodeLocationsForWays : public osmium::handler::Handler {
-
-            static_assert(std::is_base_of<osmium::index::map::Map<osmium::unsigned_object_id_type, osmium::Location>, TStoragePosIDs>::value, "Index class must be derived from osmium::index::map::Map<osmium::unsigned_object_id_type, osmium::Location>");
-
-            static_assert(std::is_base_of<osmium::index::map::Map<osmium::unsigned_object_id_type, osmium::Location>, TStorageNegIDs>::value, "Index class must be derived from osmium::index::map::Map<osmium::unsigned_object_id_type, osmium::Location>");
-
-        public:
-
-            typedef TStoragePosIDs index_pos_type;
-            typedef TStorageNegIDs index_neg_type;
-
-        private:
-
-            /// Object that handles the actual storage of the node locations (with positive IDs).
-            TStoragePosIDs& m_storage_pos;
-
-            /// Object that handles the actual storage of the node locations (with negative IDs).
-            TStorageNegIDs& m_storage_neg;
-
-            bool m_ignore_errors {false};
-
-            bool m_must_sort {false};
-
-            // It is okay to have this static dummy instance, even when using several threads,
-            // because it is read-only.
-            static dummy_type& get_dummy() {
-                static dummy_type instance;
-                return instance;
-            }
-
-        public:
-
-            explicit NodeLocationsForWays(TStoragePosIDs& storage_pos,
-                                          TStorageNegIDs& storage_neg = get_dummy()) :
-                m_storage_pos(storage_pos),
-                m_storage_neg(storage_neg) {
-            }
-
-            NodeLocationsForWays(const NodeLocationsForWays&) = delete;
-            NodeLocationsForWays& operator=(const NodeLocationsForWays&) = delete;
-
-            NodeLocationsForWays(NodeLocationsForWays&&) = default;
-            NodeLocationsForWays& operator=(NodeLocationsForWays&&) = default;
-
-            ~NodeLocationsForWays() noexcept = default;
-
-            void ignore_errors() {
-                m_ignore_errors = true;
-            }
-
-            /**
-             * Store the location of the node in the storage.
-             */
-            void node(const osmium::Node& node) {
-                m_must_sort = true;
-                const osmium::object_id_type id = node.id();
-                if (id >= 0) {
-                    m_storage_pos.set(static_cast<osmium::unsigned_object_id_type>( id), node.location());
-                } else {
-                    m_storage_neg.set(static_cast<osmium::unsigned_object_id_type>(-id), node.location());
-                }
-            }
-
-            /**
-             * Get location of node with given id.
-             */
-            osmium::Location get_node_location(const osmium::object_id_type id) const {
-                if (id >= 0) {
-                    return m_storage_pos.get(static_cast<osmium::unsigned_object_id_type>( id));
-                } else {
-                    return m_storage_neg.get(static_cast<osmium::unsigned_object_id_type>(-id));
-                }
-            }
-
-            /**
-             * Retrieve locations of all nodes in the way from storage and add
-             * them to the way object.
-             */
-            void way(osmium::Way& way) {
-                if (m_must_sort) {
-                    m_storage_pos.sort();
-                    m_storage_neg.sort();
-                    m_must_sort = false;
-                }
-                bool error = false;
-                for (auto& node_ref : way.nodes()) {
-                    try {
-                        node_ref.set_location(get_node_location(node_ref.ref()));
-                        if (!node_ref.location()) {
-                            error = true;
-                        }
-                    } catch (osmium::not_found&) {
-                        error = true;
-                    }
-                }
-                if (error && !m_ignore_errors) {
-                    throw osmium::not_found("location for one or more nodes not found in node location index");
-                }
-            }
-
-            /**
-             * Call clear on the location indexes. Makes the
-             * NodeLocationsForWays handler unusable. Used to explicitly free
-             * memory if thats needed.
-             */
-            void clear() {
-                m_storage_pos.clear();
-                m_storage_neg.clear();
-            }
-
-        }; // class NodeLocationsForWays
-
-    } // namespace handler
-
-} // namespace osmium
-
-#endif // OSMIUM_HANDLER_NODE_LOCATIONS_FOR_WAYS_HPP
diff --git a/contrib/libosmium/osmium/handler/object_relations.hpp b/contrib/libosmium/osmium/handler/object_relations.hpp
deleted file mode 100644
index dc4aa45..0000000
--- a/contrib/libosmium/osmium/handler/object_relations.hpp
+++ /dev/null
@@ -1,106 +0,0 @@
-#ifndef OSMIUM_HANDLER_OBJECT_RELATIONS_HPP
-#define OSMIUM_HANDLER_OBJECT_RELATIONS_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <osmium/handler.hpp>
-#include <osmium/index/multimap.hpp>
-#include <osmium/osm/node_ref.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/relation.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/osm/way.hpp>
-
-namespace osmium {
-
-    namespace handler {
-
-        /**
-         *
-         * Note: This handler will only work if either all object IDs are
-         *       positive or all object IDs are negative.
-         */
-        class ObjectRelations : public osmium::handler::Handler {
-
-            typedef osmium::index::multimap::Multimap<unsigned_object_id_type, unsigned_object_id_type> index_type;
-
-            index_type& m_index_n2w;
-            index_type& m_index_n2r;
-            index_type& m_index_w2r;
-            index_type& m_index_r2r;
-
-        public:
-
-            explicit ObjectRelations(index_type& n2w, index_type& n2r, index_type& w2r, index_type& r2r) :
-                m_index_n2w(n2w),
-                m_index_n2r(n2r),
-                m_index_w2r(w2r),
-                m_index_r2r(r2r) {
-            }
-
-            ObjectRelations(const ObjectRelations&) = delete;
-            ObjectRelations& operator=(const ObjectRelations&) = delete;
-
-            ~ObjectRelations() noexcept = default;
-
-            void way(const osmium::Way& way) {
-                for (const auto& node_ref : way.nodes()) {
-                    m_index_n2w.set(node_ref.positive_ref(), way.positive_id());
-                }
-            }
-
-            void relation(const osmium::Relation& relation) {
-                for (const auto& member : relation.members()) {
-                    switch (member.type()) {
-                        case osmium::item_type::node:
-                            m_index_n2r.set(member.positive_ref(), relation.positive_id());
-                            break;
-                        case osmium::item_type::way:
-                            m_index_w2r.set(member.positive_ref(), relation.positive_id());
-                            break;
-                        case osmium::item_type::relation:
-                            m_index_r2r.set(member.positive_ref(), relation.positive_id());
-                            break;
-                        default:
-                            break;
-                    }
-                }
-            }
-
-        }; // class ObjectRelations
-
-    } // namespace handler
-
-} // namespace osmium
-
-#endif // OSMIUM_HANDLER_OBJECT_RELATIONS_HPP
diff --git a/contrib/libosmium/osmium/index/bool_vector.hpp b/contrib/libosmium/osmium/index/bool_vector.hpp
deleted file mode 100644
index 04850a5..0000000
--- a/contrib/libosmium/osmium/index/bool_vector.hpp
+++ /dev/null
@@ -1,85 +0,0 @@
-#ifndef OSMIUM_INDEX_BOOL_VECTOR_HPP
-#define OSMIUM_INDEX_BOOL_VECTOR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <type_traits>
-#include <vector>
-
-namespace osmium {
-
-    namespace index {
-
-        /**
-         * Index storing one bit for each Id. The index automatically scales
-         * with the Ids stored. Default value is 'false'. Storage uses
-         * std::vector<bool> and needs a minimum of memory if the Ids are
-         * dense.
-         */
-        template <typename T>
-        class BoolVector {
-
-            static_assert(std::is_unsigned<T>::value, "Needs unsigned type");
-
-            std::vector<bool> m_bits;
-
-        public:
-
-            BoolVector() = default;
-
-            BoolVector(const BoolVector&) = default;
-            BoolVector(BoolVector&&) = default;
-            BoolVector& operator=(const BoolVector&) = default;
-            BoolVector& operator=(BoolVector&&) = default;
-
-            ~BoolVector() noexcept = default;
-
-            void set(T id, bool value = true) {
-                if (m_bits.size() <= id) {
-                    m_bits.resize(id + 1024 * 1024);
-                }
-
-                m_bits[id] = value;
-            }
-
-            bool get(T id) const {
-                return id < m_bits.size() && m_bits[id];
-            }
-
-        }; // class BoolVector
-
-    } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_BOOL_VECTOR_HPP
diff --git a/contrib/libosmium/osmium/index/detail/create_map_with_fd.hpp b/contrib/libosmium/osmium/index/detail/create_map_with_fd.hpp
deleted file mode 100644
index 5eb6cd0..0000000
--- a/contrib/libosmium/osmium/index/detail/create_map_with_fd.hpp
+++ /dev/null
@@ -1,71 +0,0 @@
-#ifndef OSMIUM_INDEX_DETAIL_CREATE_MAP_WITH_FD_HPP
-#define OSMIUM_INDEX_DETAIL_CREATE_MAP_WITH_FD_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cassert>
-#include <cerrno>
-#include <cstring>
-#include <fcntl.h>
-#include <stdexcept>
-#include <string>
-#include <vector>
-
-namespace osmium {
-
-    namespace index {
-
-        namespace detail {
-
-            template <typename T>
-            inline T* create_map_with_fd(const std::vector<std::string>& config) {
-                if (config.size() == 1) {
-                    return new T();
-                } else {
-                    assert(config.size() > 1);
-                    const std::string& filename = config[1];
-                    int fd = ::open(filename.c_str(), O_CREAT | O_RDWR, 0644);
-                    if (fd == -1) {
-                        throw std::runtime_error(std::string("can't open file '") + filename + "': " + strerror(errno));
-                    }
-                    return new T(fd);
-                }
-            }
-
-        } // namespace detail
-
-    } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_DETAIL_CREATE_MAP_WITH_FD_HPP
diff --git a/contrib/libosmium/osmium/index/detail/mmap_vector_anon.hpp b/contrib/libosmium/osmium/index/detail/mmap_vector_anon.hpp
deleted file mode 100644
index 12a1803..0000000
--- a/contrib/libosmium/osmium/index/detail/mmap_vector_anon.hpp
+++ /dev/null
@@ -1,67 +0,0 @@
-#ifndef OSMIUM_INDEX_DETAIL_MMAP_VECTOR_ANON_HPP
-#define OSMIUM_INDEX_DETAIL_MMAP_VECTOR_ANON_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#ifdef __linux__
-
-#include <osmium/index/detail/mmap_vector_base.hpp>
-
-namespace osmium {
-
-    namespace detail {
-
-        /**
-         * This class looks and behaves like STL vector, but uses mmap
-         * internally.
-         */
-        template <typename T>
-        class mmap_vector_anon : public mmap_vector_base<T> {
-
-        public:
-
-            mmap_vector_anon() :
-                mmap_vector_base<T>() {
-            }
-
-            ~mmap_vector_anon() noexcept = default;
-
-        }; // class mmap_vector_anon
-
-    } // namespace detail
-
-} // namespace osmium
-
-#endif // __linux__
-
-#endif // OSMIUM_INDEX_DETAIL_MMAP_VECTOR_ANON_HPP
diff --git a/contrib/libosmium/osmium/index/detail/mmap_vector_base.hpp b/contrib/libosmium/osmium/index/detail/mmap_vector_base.hpp
deleted file mode 100644
index e5f28e9..0000000
--- a/contrib/libosmium/osmium/index/detail/mmap_vector_base.hpp
+++ /dev/null
@@ -1,180 +0,0 @@
-#ifndef OSMIUM_INDEX_DETAIL_MMAP_VECTOR_BASE_HPP
-#define OSMIUM_INDEX_DETAIL_MMAP_VECTOR_BASE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstddef>
-#include <new> // IWYU pragma: keep
-#include <stdexcept>
-
-#include <osmium/util/memory_mapping.hpp>
-
-namespace osmium {
-
-    namespace detail {
-
-        constexpr size_t mmap_vector_size_increment = 1024 * 1024;
-
-        /**
-         * This is a base class for implementing classes that look like
-         * STL vector but use mmap internally. Do not use this class itself,
-         * use the derived classes mmap_vector_anon or mmap_vector_file.
-         */
-        template <typename T>
-        class mmap_vector_base {
-
-        protected:
-
-            size_t m_size;
-            osmium::util::TypedMemoryMapping<T> m_mapping;
-
-        public:
-
-            mmap_vector_base(int fd, size_t capacity, size_t size = 0) :
-                m_size(size),
-                m_mapping(capacity, osmium::util::MemoryMapping::mapping_mode::write_shared, fd) {
-            }
-
-            explicit mmap_vector_base(size_t capacity = mmap_vector_size_increment) :
-                m_size(0),
-                m_mapping(capacity) {
-            }
-
-            ~mmap_vector_base() noexcept = default;
-
-            typedef T value_type;
-            typedef T& reference;
-            typedef const T& const_reference;
-            typedef T* pointer;
-            typedef const T* const_pointer;
-            typedef T* iterator;
-            typedef const T* const_iterator;
-
-            void close() {
-                m_mapping.unmap();
-            }
-
-            size_t capacity() const noexcept {
-                return m_mapping.size();
-            }
-
-            size_t size() const noexcept {
-                return m_size;
-            }
-
-            bool empty() const noexcept {
-                return m_size == 0;
-            }
-
-            const T* data() const {
-                return m_mapping.begin();
-            }
-
-            T* data() {
-                return m_mapping.begin();
-            }
-
-            T& operator[](size_t n) {
-                return data()[n];
-            }
-
-            T at(size_t n) const {
-                if (n >= m_size) {
-                    throw std::out_of_range("out of range");
-                }
-                return data()[n];
-            }
-
-            void clear() noexcept {
-                m_size = 0;
-            }
-
-            void shrink_to_fit() {
-                // XXX do something here
-            }
-
-            void push_back(const T& value) {
-                if (m_size >= capacity()) {
-                    resize(m_size+1);
-                }
-                data()[m_size] = value;
-                ++m_size;
-            }
-
-            void reserve(size_t new_capacity) {
-                if (new_capacity > capacity()) {
-                    m_mapping.resize(new_capacity);
-                }
-            }
-
-            void resize(size_t new_size) {
-                if (new_size > capacity()) {
-                    reserve(new_size + osmium::detail::mmap_vector_size_increment);
-                }
-                if (new_size > size()) {
-                    new (data() + size()) T[new_size - size()];
-                }
-                m_size = new_size;
-            }
-
-            iterator begin() noexcept {
-                return data();
-            }
-
-            iterator end() noexcept {
-                return data() + m_size;
-            }
-
-            const_iterator begin() const noexcept {
-                return data();
-            }
-
-            const_iterator end() const noexcept {
-                return data() + m_size;
-            }
-
-            const_iterator cbegin() const noexcept {
-                return data();
-            }
-
-            const_iterator cend() const noexcept {
-                return data() + m_size;
-            }
-
-        }; // class mmap_vector_base
-
-    } // namespace detail
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_DETAIL_MMAP_VECTOR_BASE_HPP
diff --git a/contrib/libosmium/osmium/index/detail/mmap_vector_file.hpp b/contrib/libosmium/osmium/index/detail/mmap_vector_file.hpp
deleted file mode 100644
index 54ef513..0000000
--- a/contrib/libosmium/osmium/index/detail/mmap_vector_file.hpp
+++ /dev/null
@@ -1,74 +0,0 @@
-#ifndef OSMIUM_INDEX_DETAIL_MMAP_VECTOR_FILE_HPP
-#define OSMIUM_INDEX_DETAIL_MMAP_VECTOR_FILE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <osmium/index/detail/mmap_vector_base.hpp>
-#include <osmium/index/detail/tmpfile.hpp>
-#include <osmium/util/file.hpp>
-
-namespace osmium {
-
-    namespace detail {
-
-        /**
-         * This class looks and behaves like STL vector, but mmap's a file
-         * internally.
-         */
-        template <typename T>
-        class mmap_vector_file : public mmap_vector_base<T> {
-
-        public:
-
-            mmap_vector_file() :
-                mmap_vector_base<T>(
-                    osmium::detail::create_tmp_file(),
-                    osmium::detail::mmap_vector_size_increment) {
-            }
-
-            explicit mmap_vector_file(int fd) :
-                mmap_vector_base<T>(
-                    fd,
-                    osmium::util::file_size(fd) / sizeof(T),
-                    osmium::util::file_size(fd) / sizeof(T)) {
-            }
-
-            ~mmap_vector_file() noexcept = default;
-
-        }; // class mmap_vector_file
-
-    } // namespace detail
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_DETAIL_MMAP_VECTOR_FILE_HPP
diff --git a/contrib/libosmium/osmium/index/detail/tmpfile.hpp b/contrib/libosmium/osmium/index/detail/tmpfile.hpp
deleted file mode 100644
index 06cab65..0000000
--- a/contrib/libosmium/osmium/index/detail/tmpfile.hpp
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifndef OSMIUM_INDEX_DETAIL_TMPFILE_HPP
-#define OSMIUM_INDEX_DETAIL_TMPFILE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cerrno>
-#include <cstdio>
-#include <system_error>
-
-namespace osmium {
-
-    namespace detail {
-
-        /**
-         * Create and open a temporary file. It is removed after opening.
-         *
-         * @returns File descriptor of temporary file.
-         * @throws std::system_error if something went wrong.
-         */
-        inline int create_tmp_file() {
-            FILE* file = ::tmpfile();
-            if (!file) {
-                throw std::system_error(errno, std::system_category(), "tempfile failed");
-            }
-            return fileno(file);
-        }
-
-    } // namespace detail
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_DETAIL_TMPFILE_HPP
diff --git a/contrib/libosmium/osmium/index/detail/vector_map.hpp b/contrib/libosmium/osmium/index/detail/vector_map.hpp
deleted file mode 100644
index 48b0f62..0000000
--- a/contrib/libosmium/osmium/index/detail/vector_map.hpp
+++ /dev/null
@@ -1,246 +0,0 @@
-#ifndef OSMIUM_INDEX_DETAIL_VECTOR_MAP_HPP
-#define OSMIUM_INDEX_DETAIL_VECTOR_MAP_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <cstddef>
-#include <stdexcept>
-#include <utility>
-
-#include <osmium/index/index.hpp>
-#include <osmium/index/map.hpp>
-#include <osmium/io/detail/read_write.hpp>
-
-namespace osmium {
-
-    namespace index {
-
-        namespace map {
-
-            template <typename TVector, typename TId, typename TValue>
-            class VectorBasedDenseMap : public Map<TId, TValue> {
-
-                TVector m_vector;
-
-            public:
-
-                typedef TValue element_type;
-                typedef TVector vector_type;
-                typedef typename vector_type::iterator iterator;
-                typedef typename vector_type::const_iterator const_iterator;
-
-                VectorBasedDenseMap() :
-                    m_vector() {
-                }
-
-                explicit VectorBasedDenseMap(int fd) :
-                    m_vector(fd) {
-                }
-
-                ~VectorBasedDenseMap() noexcept = default;
-
-                void reserve(const size_t size) override final {
-                    m_vector.reserve(size);
-                }
-
-                void set(const TId id, const TValue value) override final {
-                    if (size() <= id) {
-                        m_vector.resize(id+1);
-                    }
-                    m_vector[id] = value;
-                }
-
-                const TValue get(const TId id) const override final {
-                    try {
-                        const TValue& value = m_vector.at(id);
-                        if (value == osmium::index::empty_value<TValue>()) {
-                            not_found_error(id);
-                        }
-                        return value;
-                    } catch (std::out_of_range&) {
-                        not_found_error(id);
-                    }
-                }
-
-                size_t size() const override final {
-                    return m_vector.size();
-                }
-
-                size_t byte_size() const {
-                    return m_vector.size() * sizeof(element_type);
-                }
-
-                size_t used_memory() const override final {
-                    return sizeof(TValue) * size();
-                }
-
-                void clear() override final {
-                    m_vector.clear();
-                    m_vector.shrink_to_fit();
-                }
-
-                void dump_as_array(const int fd) override final {
-                    osmium::io::detail::reliable_write(fd, reinterpret_cast<const char*>(m_vector.data()), byte_size());
-                }
-
-                iterator begin() {
-                    return m_vector.begin();
-                }
-
-                iterator end() {
-                    return m_vector.end();
-                }
-
-                const_iterator cbegin() const {
-                    return m_vector.cbegin();
-                }
-
-                const_iterator cend() const {
-                    return m_vector.cend();
-                }
-
-                const_iterator begin() const {
-                    return m_vector.cbegin();
-                }
-
-                const_iterator end() const {
-                    return m_vector.cend();
-                }
-
-            }; // class VectorBasedDenseMap
-
-
-            template <typename TId, typename TValue, template<typename...> class TVector>
-            class VectorBasedSparseMap : public Map<TId, TValue> {
-
-            public:
-
-                typedef typename std::pair<TId, TValue> element_type;
-                typedef TVector<element_type> vector_type;
-                typedef typename vector_type::iterator iterator;
-                typedef typename vector_type::const_iterator const_iterator;
-
-            private:
-
-                vector_type m_vector;
-
-            public:
-
-                VectorBasedSparseMap() :
-                    m_vector() {
-                }
-
-                VectorBasedSparseMap(int fd) :
-                    m_vector(fd) {
-                }
-
-                ~VectorBasedSparseMap() override final = default;
-
-                void set(const TId id, const TValue value) override final {
-                    m_vector.push_back(element_type(id, value));
-                }
-
-                const TValue get(const TId id) const override final {
-                    const element_type element {
-                        id,
-                        osmium::index::empty_value<TValue>()
-                    };
-                    const auto result = std::lower_bound(m_vector.begin(), m_vector.end(), element, [](const element_type& a, const element_type& b) {
-                        return a.first < b.first;
-                    });
-                    if (result == m_vector.end() || result->first != id) {
-                        not_found_error(id);
-                    } else {
-                        return result->second;
-                    }
-                }
-
-                size_t size() const override final {
-                    return m_vector.size();
-                }
-
-                size_t byte_size() const {
-                    return m_vector.size() * sizeof(element_type);
-                }
-
-                size_t used_memory() const override final {
-                    return sizeof(element_type) * size();
-                }
-
-                void clear() override final {
-                    m_vector.clear();
-                    m_vector.shrink_to_fit();
-                }
-
-                void sort() override final {
-                    std::sort(m_vector.begin(), m_vector.end());
-                }
-
-                void dump_as_list(const int fd) override final {
-                    osmium::io::detail::reliable_write(fd, reinterpret_cast<const char*>(m_vector.data()), byte_size());
-                }
-
-                iterator begin() {
-                    return m_vector.begin();
-                }
-
-                iterator end() {
-                    return m_vector.end();
-                }
-
-                const_iterator cbegin() const {
-                    return m_vector.cbegin();
-                }
-
-                const_iterator cend() const {
-                    return m_vector.cend();
-                }
-
-                const_iterator begin() const {
-                    return m_vector.cbegin();
-                }
-
-                const_iterator end() const {
-                    return m_vector.cend();
-                }
-
-            }; // class VectorBasedSparseMap
-
-        } // namespace map
-
-    } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_DETAIL_VECTOR_MAP_HPP
diff --git a/contrib/libosmium/osmium/index/detail/vector_multimap.hpp b/contrib/libosmium/osmium/index/detail/vector_multimap.hpp
deleted file mode 100644
index dc2e15a..0000000
--- a/contrib/libosmium/osmium/index/detail/vector_multimap.hpp
+++ /dev/null
@@ -1,186 +0,0 @@
-#ifndef OSMIUM_INDEX_DETAIL_VECTOR_MULTIMAP_HPP
-#define OSMIUM_INDEX_DETAIL_VECTOR_MULTIMAP_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <cstddef>
-#include <utility>
-
-#include <osmium/index/index.hpp>
-#include <osmium/index/multimap.hpp>
-#include <osmium/io/detail/read_write.hpp>
-
-namespace osmium {
-
-    namespace index {
-
-        namespace multimap {
-
-            template <typename TId, typename TValue, template<typename...> class TVector>
-            class VectorBasedSparseMultimap : public Multimap<TId, TValue> {
-
-            public:
-
-                typedef typename std::pair<TId, TValue> element_type;
-                typedef TVector<element_type> vector_type;
-                typedef typename vector_type::iterator iterator;
-                typedef typename vector_type::const_iterator const_iterator;
-
-            private:
-
-                vector_type m_vector;
-
-                static bool is_removed(element_type& element) {
-                    return element.second == osmium::index::empty_value<TValue>();
-                }
-
-            public:
-
-                VectorBasedSparseMultimap() :
-                    m_vector() {
-                }
-
-                explicit VectorBasedSparseMultimap(int fd) :
-                    m_vector(fd) {
-                }
-
-                ~VectorBasedSparseMultimap() noexcept = default;
-
-                void set(const TId id, const TValue value) override final {
-                    m_vector.push_back(element_type(id, value));
-                }
-
-                void unsorted_set(const TId id, const TValue value) {
-                    m_vector.push_back(element_type(id, value));
-                }
-
-                std::pair<iterator, iterator> get_all(const TId id) {
-                    const element_type element {
-                        id,
-                        osmium::index::empty_value<TValue>()
-                    };
-                    return std::equal_range(m_vector.begin(), m_vector.end(), element, [](const element_type& a, const element_type& b) {
-                        return a.first < b.first;
-                    });
-                }
-
-                std::pair<const_iterator, const_iterator> get_all(const TId id) const {
-                    const element_type element {
-                        id,
-                        osmium::index::empty_value<TValue>()
-                    };
-                    return std::equal_range(m_vector.cbegin(), m_vector.cend(), element, [](const element_type& a, const element_type& b) {
-                        return a.first < b.first;
-                    });
-                }
-
-                size_t size() const override final {
-                    return m_vector.size();
-                }
-
-                size_t byte_size() const {
-                    return m_vector.size() * sizeof(element_type);
-                }
-
-                size_t used_memory() const override final {
-                    return sizeof(element_type) * size();
-                }
-
-                void clear() override final {
-                    m_vector.clear();
-                    m_vector.shrink_to_fit();
-                }
-
-                void sort() override final {
-                    std::sort(m_vector.begin(), m_vector.end());
-                }
-
-                void remove(const TId id, const TValue value) {
-                    auto r = get_all(id);
-                    for (auto it = r.first; it != r.second; ++it) {
-                        if (it->second == value) {
-                            it->second = 0;
-                            return;
-                        }
-                    }
-                }
-
-                void consolidate() {
-                    std::sort(m_vector.begin(), m_vector.end());
-                }
-
-                void erase_removed() {
-                    m_vector.erase(
-                        std::remove_if(m_vector.begin(), m_vector.end(), is_removed),
-                        m_vector.end()
-                    );
-                }
-
-                void dump_as_list(const int fd) override final {
-                    osmium::io::detail::reliable_write(fd, reinterpret_cast<const char*>(m_vector.data()), byte_size());
-                }
-
-                iterator begin() {
-                    return m_vector.begin();
-                }
-
-                iterator end() {
-                    return m_vector.end();
-                }
-
-                const_iterator cbegin() const {
-                    return m_vector.cbegin();
-                }
-
-                const_iterator cend() const {
-                    return m_vector.cend();
-                }
-
-                const_iterator begin() const {
-                    return m_vector.cbegin();
-                }
-
-                const_iterator end() const {
-                    return m_vector.cend();
-                }
-
-            }; // class VectorBasedSparseMultimap
-
-        } // namespace multimap
-
-    } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_DETAIL_VECTOR_MULTIMAP_HPP
diff --git a/contrib/libosmium/osmium/index/index.hpp b/contrib/libosmium/osmium/index/index.hpp
deleted file mode 100644
index f415192..0000000
--- a/contrib/libosmium/osmium/index/index.hpp
+++ /dev/null
@@ -1,100 +0,0 @@
-#ifndef OSMIUM_INDEX_INDEX_HPP
-#define OSMIUM_INDEX_INDEX_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstddef>
-#include <limits>
-#include <sstream>
-#include <stdexcept>
-#include <string>
-
-#include <osmium/util/compatibility.hpp>
-
-namespace osmium {
-
-    /**
-     * Exception signaling that an element could not be
-     * found in an index.
-     */
-    struct not_found : public std::runtime_error {
-
-        not_found(const std::string& what) :
-            std::runtime_error(what) {
-        }
-
-        not_found(const char* what) :
-            std::runtime_error(what) {
-        }
-
-    }; // struct not_found
-
-    /**
-     * @brief Indexing of OSM data, Locations, etc.
-     */
-    namespace index {
-
-        template <typename TKey>
-        OSMIUM_NORETURN void not_found_error(TKey key) {
-            std::stringstream s;
-            s << "id " << key << " not found";
-            throw not_found(s.str());
-        }
-
-        /**
-         * Some of the index classes need an "empty" value that can
-         * never appear in real data. This function must return this
-         * empty value for any class used as a value in an index.
-         * The default implementation returns a default constructed
-         * object, but it can be specialized.
-         */
-        template <typename T>
-        inline constexpr T empty_value() {
-            return T{};
-        }
-
-        /**
-         * The size_t value in indexes is usually used for offsets
-         * into a buffer or file. It is unlikely that we ever need
-         * the full range, so the max value is a good "empty" value.
-         */
-        template <>
-        inline OSMIUM_CONSTEXPR size_t empty_value<size_t>() {
-            return std::numeric_limits<size_t>::max();
-        }
-
-    } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_INDEX_HPP
diff --git a/contrib/libosmium/osmium/index/map.hpp b/contrib/libosmium/osmium/index/map.hpp
deleted file mode 100644
index 68a9c20..0000000
--- a/contrib/libosmium/osmium/index/map.hpp
+++ /dev/null
@@ -1,275 +0,0 @@
-#ifndef OSMIUM_INDEX_MAP_HPP
-#define OSMIUM_INDEX_MAP_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <cstddef>
-#include <functional>
-#include <map>
-#include <memory>
-#include <stdexcept>
-#include <string>
-#include <type_traits>
-#include <vector>
-
-#include <osmium/util/compatibility.hpp>
-#include <osmium/util/string.hpp>
-
-namespace osmium {
-
-    namespace index {
-
-        /**
-         * @brief Key-value containers with unique integer values for a key
-         */
-        namespace map {
-
-            /**
-             * This abstract class defines an interface to storage classes
-             * intended for storing small pieces of data (such as coordinates)
-             * indexed by a positive integer (such as an object ID). The
-             * storage must be very space efficient and able to scale to billions
-             * of objects.
-             *
-             * Subclasses have different implementations that store the
-             * data in different ways in memory and/or on disk. Some storage
-             * classes are better suited when working with the whole planet,
-             * some are better for data extracts.
-             *
-             * Note that these classes are not required to track "empty" fields.
-             * When reading data you have to be sure you have put something in
-             * there before.
-             *
-             * A typical use for this and derived classes is storage of node
-             * locations indexed by node ID. These indexes will only work
-             * on 64 bit systems if used in this case. 32 bit systems just
-             * can't address that much memory!
-             *
-             * @tparam TId Id type, usually osmium::unsigned_object_id_type,
-             *             must be an unsigned integral type.
-             * @tparam TValue Value type, usually osmium::Location or size_t.
-             *                Copied by value, so should be "small" type.
-             */
-            template <typename TId, typename TValue>
-            class Map {
-
-                static_assert(std::is_integral<TId>::value && std::is_unsigned<TId>::value,
-                              "TId template parameter for class Map must be unsigned integral type");
-
-                Map(const Map&) = delete;
-                Map& operator=(const Map&) = delete;
-
-            protected:
-
-                Map(Map&&) = default;
-                Map& operator=(Map&&) = default;
-
-            public:
-
-                /// The "key" type, usually osmium::unsigned_object_id_type.
-                typedef TId key_type;
-
-                /// The "value" type, usually a Location or size_t.
-                typedef TValue value_type;
-
-                Map() = default;
-
-                virtual ~Map() noexcept = default;
-
-                virtual void reserve(const size_t) {
-                    // default implementation is empty
-                }
-
-                /// Set the field with id to value.
-                virtual void set(const TId id, const TValue value) = 0;
-
-                /// Retrieve value by id. Does not check for overflow or empty fields.
-                virtual const TValue get(const TId id) const = 0;
-
-                /**
-                 * Get the approximate number of items in the storage. The storage
-                 * might allocate memory in blocks, so this size might not be
-                 * accurate. You can not use this to find out how much memory the
-                 * storage uses. Use used_memory() for that.
-                 */
-                virtual size_t size() const = 0;
-
-                /**
-                 * Get the memory used for this storage in bytes. Note that this
-                 * is not necessarily entirely accurate but an approximation.
-                 * For storage classes that store the data in memory, this is
-                 * the main memory used, for storage classes storing data on disk
-                 * this is the memory used on disk.
-                 */
-                virtual size_t used_memory() const = 0;
-
-                /**
-                 * Clear memory used for this storage. After this you can not
-                 * use the storage container any more.
-                 */
-                virtual void clear() = 0;
-
-                /**
-                 * Sort data in map. Call this after writing all data and
-                 * before reading. Not all implementations need this.
-                 */
-                virtual void sort() {
-                    // default implementation is empty
-                }
-
-                // This function could usually be const in derived classes,
-                // but not always. It could, for instance, sort internal data.
-                // This is why it is not declared const here.
-                virtual void dump_as_list(const int /*fd*/) {
-                    throw std::runtime_error("can't dump as list");
-                }
-
-                // This function could usually be const in derived classes,
-                // but not always. It could, for instance, sort internal data.
-                // This is why it is not declared const here.
-                virtual void dump_as_array(const int /*fd*/) {
-                    throw std::runtime_error("can't dump as array");
-                }
-
-            }; // class Map
-
-        } // namespace map
-
-        template <typename TId, typename TValue>
-        class MapFactory {
-
-        public:
-
-            typedef TId id_type;
-            typedef TValue value_type;
-            typedef osmium::index::map::Map<id_type, value_type> map_type;
-            typedef std::function<map_type*(const std::vector<std::string>&)> create_map_func;
-
-        private:
-
-            std::map<const std::string, create_map_func> m_callbacks;
-
-            MapFactory() = default;
-
-            MapFactory(const MapFactory&) = delete;
-            MapFactory& operator=(const MapFactory&) = delete;
-
-            MapFactory(MapFactory&&) = delete;
-            MapFactory& operator=(MapFactory&&) = delete;
-
-            OSMIUM_NORETURN static void error(const std::string& map_type_name) {
-                std::string error_message {"Support for map type '"};
-                error_message += map_type_name;
-                error_message += "' not compiled into this binary.";
-                throw std::runtime_error(error_message);
-            }
-
-        public:
-
-            static MapFactory<id_type, value_type>& instance() {
-                static MapFactory<id_type, value_type> factory;
-                return factory;
-            }
-
-            bool register_map(const std::string& map_type_name, create_map_func func) {
-                return m_callbacks.emplace(map_type_name, func).second;
-            }
-
-            bool has_map_type(const std::string& map_type_name) const {
-                return m_callbacks.count(map_type_name);
-            }
-
-            std::vector<std::string> map_types() const {
-                std::vector<std::string> result;
-
-                for (const auto& cb : m_callbacks) {
-                    result.push_back(cb.first);
-                }
-
-                std::sort(result.begin(), result.end());
-
-                return result;
-            }
-
-            std::unique_ptr<map_type> create_map(const std::string& config_string) const {
-                std::vector<std::string> config = osmium::split_string(config_string, ',');
-
-                if (config.empty()) {
-                    throw std::runtime_error("Need non-empty map type name.");
-                }
-
-                auto it = m_callbacks.find(config[0]);
-                if (it != m_callbacks.end()) {
-                    return std::unique_ptr<map_type>((it->second)(config));
-                }
-
-                error(config[0]);
-            }
-
-        }; // class MapFactory
-
-        namespace map {
-
-            template <typename TId, typename TValue, template<typename, typename> class TMap>
-            struct create_map {
-                TMap<TId, TValue>* operator()(const std::vector<std::string>&) {
-                    return new TMap<TId, TValue>();
-                }
-            };
-
-        } // namespace map
-
-        template <typename TId, typename TValue, template<typename, typename> class TMap>
-        inline bool register_map(const std::string& name) {
-            return osmium::index::MapFactory<TId, TValue>::instance().register_map(name, [](const std::vector<std::string>& config) {
-                return map::create_map<TId, TValue, TMap>()(config);
-            });
-        }
-
-#define OSMIUM_CONCATENATE_DETAIL_(x, y) x##y
-#define OSMIUM_CONCATENATE_(x, y) OSMIUM_CONCATENATE_DETAIL_(x, y)
-
-#define REGISTER_MAP(id, value, klass, name) \
-namespace osmium { namespace index { namespace detail { \
-    const bool OSMIUM_CONCATENATE_(registered_, name) = osmium::index::register_map<id, value, klass>(#name); \
-    inline bool OSMIUM_CONCATENATE_(get_registered_, name)() noexcept { \
-        return OSMIUM_CONCATENATE_(registered_, name); \
-    } \
-} } }
-
-    } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MAP_HPP
diff --git a/contrib/libosmium/osmium/index/map/all.hpp b/contrib/libosmium/osmium/index/map/all.hpp
deleted file mode 100644
index 9ffadc0..0000000
--- a/contrib/libosmium/osmium/index/map/all.hpp
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef OSMIUM_INDEX_MAP_ALL_HPP
-#define OSMIUM_INDEX_MAP_ALL_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <osmium/index/map/dense_file_array.hpp>  // IWYU pragma: keep
-#include <osmium/index/map/dense_mem_array.hpp>   // IWYU pragma: keep
-#include <osmium/index/map/dense_mmap_array.hpp>  // IWYU pragma: keep
-#include <osmium/index/map/dummy.hpp>             // IWYU pragma: keep
-#include <osmium/index/map/sparse_file_array.hpp> // IWYU pragma: keep
-#include <osmium/index/map/sparse_mem_array.hpp>  // IWYU pragma: keep
-#include <osmium/index/map/sparse_mem_map.hpp>    // IWYU pragma: keep
-#include <osmium/index/map/sparse_mem_table.hpp>  // IWYU pragma: keep
-#include <osmium/index/map/sparse_mmap_array.hpp> // IWYU pragma: keep
-
-#endif // OSMIUM_INDEX_MAP_ALL_HPP
diff --git a/contrib/libosmium/osmium/index/map/dense_file_array.hpp b/contrib/libosmium/osmium/index/map/dense_file_array.hpp
deleted file mode 100644
index d209a87..0000000
--- a/contrib/libosmium/osmium/index/map/dense_file_array.hpp
+++ /dev/null
@@ -1,67 +0,0 @@
-#ifndef OSMIUM_INDEX_MAP_DENSE_FILE_ARRAY_HPP
-#define OSMIUM_INDEX_MAP_DENSE_FILE_ARRAY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <string>
-#include <vector>
-
-#include <osmium/index/detail/mmap_vector_file.hpp>
-#include <osmium/index/detail/vector_map.hpp>
-#include <osmium/index/detail/create_map_with_fd.hpp>
-
-#define OSMIUM_HAS_INDEX_MAP_DENSE_FILE_ARRAY
-
-namespace osmium {
-
-    namespace index {
-
-        namespace map {
-
-            template <typename TId, typename TValue>
-            using DenseFileArray = VectorBasedDenseMap<osmium::detail::mmap_vector_file<TValue>, TId, TValue>;
-
-            template <typename TId, typename TValue>
-            struct create_map<TId, TValue, DenseFileArray> {
-                DenseFileArray<TId, TValue>* operator()(const std::vector<std::string>& config) {
-                    return osmium::index::detail::create_map_with_fd<DenseFileArray<TId, TValue>>(config);
-                }
-            };
-
-        } // namespace map
-
-    } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MAP_DENSE_FILE_ARRAY_HPP
diff --git a/contrib/libosmium/osmium/index/map/dense_mem_array.hpp b/contrib/libosmium/osmium/index/map/dense_mem_array.hpp
deleted file mode 100644
index b45eec4..0000000
--- a/contrib/libosmium/osmium/index/map/dense_mem_array.hpp
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef OSMIUM_INDEX_MAP_DENSE_MEM_ARRAY_HPP
-#define OSMIUM_INDEX_MAP_DENSE_MEM_ARRAY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <vector>
-
-#include <osmium/index/detail/vector_map.hpp>
-
-#define OSMIUM_HAS_INDEX_MAP_DENSE_MEM_ARRAY
-
-namespace osmium {
-
-    namespace index {
-
-        namespace map {
-
-            template <typename TId, typename TValue>
-            using DenseMemArray = VectorBasedDenseMap<std::vector<TValue>, TId, TValue>;
-
-        } // namespace map
-
-    } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MAP_DENSE_MEM_ARRAY_HPP
diff --git a/contrib/libosmium/osmium/index/map/dense_mmap_array.hpp b/contrib/libosmium/osmium/index/map/dense_mmap_array.hpp
deleted file mode 100644
index a912aeb..0000000
--- a/contrib/libosmium/osmium/index/map/dense_mmap_array.hpp
+++ /dev/null
@@ -1,60 +0,0 @@
-#ifndef OSMIUM_INDEX_MAP_DENSE_MMAP_ARRAY_HPP
-#define OSMIUM_INDEX_MAP_DENSE_MMAP_ARRAY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#ifdef __linux__
-
-#include <osmium/index/detail/mmap_vector_anon.hpp> // IWYU pragma: keep
-#include <osmium/index/detail/vector_map.hpp>
-
-#define OSMIUM_HAS_INDEX_MAP_DENSE_MMAP_ARRAY
-
-namespace osmium {
-
-    namespace index {
-
-        namespace map {
-
-            template <typename TId, typename TValue>
-            using DenseMmapArray = VectorBasedDenseMap<osmium::detail::mmap_vector_anon<TValue>, TId, TValue>;
-
-        } // namespace map
-
-    } // namespace index
-
-} // namespace osmium
-
-#endif // __linux__
-
-#endif // OSMIUM_INDEX_MAP_DENSE_MMAP_ARRAY_HPP
diff --git a/contrib/libosmium/osmium/index/map/dummy.hpp b/contrib/libosmium/osmium/index/map/dummy.hpp
deleted file mode 100644
index 5b471df..0000000
--- a/contrib/libosmium/osmium/index/map/dummy.hpp
+++ /dev/null
@@ -1,88 +0,0 @@
-#ifndef OSMIUM_INDEX_MAP_DUMMY_HPP
-#define OSMIUM_INDEX_MAP_DUMMY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstddef>
-
-#include <osmium/index/index.hpp>
-#include <osmium/index/map.hpp>
-
-namespace osmium {
-
-    namespace index {
-
-        namespace map {
-
-            /**
-             * Pseudo map.
-             * Use this class if you don't need a map, but you
-             * need an object that behaves like one.
-             */
-            template <typename TId, typename TValue>
-            class Dummy : public osmium::index::map::Map<TId, TValue> {
-
-            public:
-
-                Dummy() = default;
-
-                ~Dummy() noexcept override final = default;
-
-                void set(const TId, const TValue) override final {
-                    // intentionally left blank
-                }
-
-                const TValue get(const TId id) const override final {
-                    not_found_error(id);
-                }
-
-                size_t size() const override final {
-                    return 0;
-                }
-
-                size_t used_memory() const override final {
-                    return 0;
-                }
-
-                void clear() override final {
-                }
-
-            }; // class Dummy
-
-        } // namespace map
-
-    } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MAP_DUMMY_HPP
diff --git a/contrib/libosmium/osmium/index/map/sparse_file_array.hpp b/contrib/libosmium/osmium/index/map/sparse_file_array.hpp
deleted file mode 100644
index 2ba9315..0000000
--- a/contrib/libosmium/osmium/index/map/sparse_file_array.hpp
+++ /dev/null
@@ -1,67 +0,0 @@
-#ifndef OSMIUM_INDEX_MAP_SPARSE_FILE_ARRAY_HPP
-#define OSMIUM_INDEX_MAP_SPARSE_FILE_ARRAY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <string>
-#include <vector>
-
-#include <osmium/index/detail/mmap_vector_file.hpp>
-#include <osmium/index/detail/vector_map.hpp>
-#include <osmium/index/detail/create_map_with_fd.hpp>
-
-#define OSMIUM_HAS_INDEX_MAP_SPARSE_FILE_ARRAY
-
-namespace osmium {
-
-    namespace index {
-
-        namespace map {
-
-            template <typename TId, typename TValue>
-            using SparseFileArray = VectorBasedSparseMap<TId, TValue, osmium::detail::mmap_vector_file>;
-
-            template <typename TId, typename TValue>
-            struct create_map<TId, TValue, SparseFileArray> {
-                SparseFileArray<TId, TValue>* operator()(const std::vector<std::string>& config) {
-                    return osmium::index::detail::create_map_with_fd<SparseFileArray<TId, TValue>>(config);
-                }
-            };
-
-        } // namespace map
-
-    } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MAP_SPARSE_FILE_ARRAY_HPP
diff --git a/contrib/libosmium/osmium/index/map/sparse_mem_array.hpp b/contrib/libosmium/osmium/index/map/sparse_mem_array.hpp
deleted file mode 100644
index 9adf41f..0000000
--- a/contrib/libosmium/osmium/index/map/sparse_mem_array.hpp
+++ /dev/null
@@ -1,60 +0,0 @@
-#ifndef OSMIUM_INDEX_MAP_SPARSE_MEM_ARRAY_HPP
-#define OSMIUM_INDEX_MAP_SPARSE_MEM_ARRAY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <vector>
-
-#include <osmium/index/detail/vector_map.hpp>
-
-#define OSMIUM_HAS_INDEX_MAP_SPARSE_MEM_ARRAY
-
-namespace osmium {
-
-    namespace index {
-
-        namespace map {
-
-            template <typename T>
-            using StdVectorWrap = std::vector<T>;
-
-            template <typename TId, typename TValue>
-            using SparseMemArray = VectorBasedSparseMap<TId, TValue, StdVectorWrap>;
-
-        } // namespace map
-
-    } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MAP_SPARSE_MEM_ARRAY_HPP
diff --git a/contrib/libosmium/osmium/index/map/sparse_mem_map.hpp b/contrib/libosmium/osmium/index/map/sparse_mem_map.hpp
deleted file mode 100644
index 9bad07e..0000000
--- a/contrib/libosmium/osmium/index/map/sparse_mem_map.hpp
+++ /dev/null
@@ -1,116 +0,0 @@
-#ifndef OSMIUM_INDEX_MAP_SPARSE_MEM_MAP_HPP
-#define OSMIUM_INDEX_MAP_SPARSE_MEM_MAP_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm> // IWYU pragma: keep (for std::copy)
-#include <cstddef>
-#include <iterator>
-#include <map>
-#include <stdexcept>
-#include <vector>
-
-#include <osmium/index/map.hpp>
-#include <osmium/index/index.hpp>
-#include <osmium/io/detail/read_write.hpp>
-
-#define OSMIUM_HAS_INDEX_MAP_SPARSE_MEM_MAP
-
-namespace osmium {
-
-    namespace index {
-
-        namespace map {
-
-            /**
-             * This implementation uses std::map internally. It uses rather a
-             * lot of memory, but might make sense for small maps.
-             */
-            template <typename TId, typename TValue>
-            class SparseMemMap : public osmium::index::map::Map<TId, TValue> {
-
-                // This is a rough estimate for the memory needed for each
-                // element in the map (id + value + pointers to left, right,
-                // and parent plus some overhead for color of red-black-tree
-                // or similar).
-                static constexpr size_t element_size = sizeof(TId) + sizeof(TValue) + sizeof(void*) * 4;
-
-                std::map<TId, TValue> m_elements;
-
-            public:
-
-                SparseMemMap() = default;
-
-                ~SparseMemMap() noexcept override final = default;
-
-                void set(const TId id, const TValue value) override final {
-                    m_elements[id] = value;
-                }
-
-                const TValue get(const TId id) const override final {
-                    auto it = m_elements.find(id);
-                    if (it == m_elements.end()) {
-                        not_found_error(id);
-                    }
-                    return it->second;
-                }
-
-                size_t size() const noexcept override final {
-                    return m_elements.size();
-                }
-
-                size_t used_memory() const noexcept override final {
-                    return element_size * m_elements.size();
-                }
-
-                void clear() override final {
-                    m_elements.clear();
-                }
-
-                void dump_as_list(const int fd) override final {
-                    typedef typename std::map<TId, TValue>::value_type t;
-                    std::vector<t> v;
-                    v.reserve(m_elements.size());
-                    std::copy(m_elements.cbegin(), m_elements.cend(), std::back_inserter(v));
-                    osmium::io::detail::reliable_write(fd, reinterpret_cast<const char*>(v.data()), sizeof(t) * v.size());
-                }
-
-            }; // class SparseMemMap
-
-        } // namespace map
-
-    } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MAP_SPARSE_MEM_MAP_HPP
diff --git a/contrib/libosmium/osmium/index/map/sparse_mem_table.hpp b/contrib/libosmium/osmium/index/map/sparse_mem_table.hpp
deleted file mode 100644
index 032400e..0000000
--- a/contrib/libosmium/osmium/index/map/sparse_mem_table.hpp
+++ /dev/null
@@ -1,147 +0,0 @@
-#ifndef OSMIUM_INDEX_MAP_SPARSE_MEM_TABLE_HPP
-#define OSMIUM_INDEX_MAP_SPARSE_MEM_TABLE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#ifdef OSMIUM_WITH_SPARSEHASH
-
-#include <cstddef>
-#include <utility>
-#include <vector>
-
-#include <google/sparsetable>
-
-#include <osmium/index/index.hpp>
-#include <osmium/index/map.hpp>
-#include <osmium/io/detail/read_write.hpp>
-
-#define OSMIUM_HAS_INDEX_MAP_SPARSE_MEM_TABLE
-
-namespace osmium {
-
-    namespace index {
-
-        namespace map {
-
-            /**
-            * The SparseMemTable index stores elements in a Google sparsetable,
-            * a data structure that can hold sparsly filled tables in a
-            * space efficient way. It will resize automatically.
-            *
-            * Use this index if the ID space is only sparsly
-            * populated, such as when working with smaller OSM files (like
-            * country extracts).
-            *
-            * This will only work on 64 bit machines.
-            */
-            template <typename TId, typename TValue>
-            class SparseMemTable : public osmium::index::map::Map<TId, TValue> {
-
-                TId m_grow_size;
-
-                google::sparsetable<TValue> m_elements;
-
-                static_assert(sizeof(typename google::sparsetable<TValue>::size_type) >= 8, "google::sparsetable needs 64bit machine");
-
-            public:
-
-                /**
-                * Constructor.
-                *
-                * @param grow_size The initial size of the index (ie number of
-                *                  elements that fit into the index).
-                *                  The storage will grow by at least this size
-                *                  every time it runs out of space.
-                */
-                explicit SparseMemTable(const TId grow_size = 10000) :
-                    m_grow_size(grow_size),
-                    m_elements(grow_size) {
-                }
-
-                ~SparseMemTable() noexcept override final = default;
-
-                void set(const TId id, const TValue value) override final {
-                    if (id >= m_elements.size()) {
-                        m_elements.resize(id + m_grow_size);
-                    }
-                    m_elements[id] = value;
-                }
-
-                const TValue get(const TId id) const override final {
-                    if (id >= m_elements.size()) {
-                        not_found_error(id);
-                    }
-                    if (m_elements[id] == osmium::index::empty_value<TValue>()) {
-                        not_found_error(id);
-                    }
-                    return m_elements[id];
-                }
-
-                size_t size() const override final {
-                    return m_elements.size();
-                }
-
-                size_t used_memory() const override final {
-                    // unused elements use 1 bit, used elements sizeof(TValue) bytes
-                    // http://google-sparsehash.googlecode.com/svn/trunk/doc/sparsetable.html
-                    return (m_elements.size() / 8) + (m_elements.num_nonempty() * sizeof(TValue));
-                }
-
-                void clear() override final {
-                    m_elements.clear();
-                }
-
-                void dump_as_list(const int fd) override final {
-                    std::vector<std::pair<TId, TValue>> v;
-                    v.reserve(m_elements.size());
-                    int n = 0;
-                    for (const TValue value : m_elements) {
-                        if (value != osmium::index::empty_value<TValue>()) {
-                            v.emplace_back(n, value);
-                        }
-                        ++n;
-                    }
-                    osmium::io::detail::reliable_write(fd, reinterpret_cast<const char*>(v.data()), sizeof(std::pair<TId, TValue>) * v.size());
-                }
-
-            }; // class SparseMemTable
-
-        } // namespace map
-
-    } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_WITH_SPARSEHASH
-
-#endif // OSMIUM_INDEX_BYID_SPARSE_MEM_TABLE_HPP
diff --git a/contrib/libosmium/osmium/index/map/sparse_mmap_array.hpp b/contrib/libosmium/osmium/index/map/sparse_mmap_array.hpp
deleted file mode 100644
index c85e2c9..0000000
--- a/contrib/libosmium/osmium/index/map/sparse_mmap_array.hpp
+++ /dev/null
@@ -1,60 +0,0 @@
-#ifndef OSMIUM_INDEX_MAP_SPARSE_MMAP_ARRAY_HPP
-#define OSMIUM_INDEX_MAP_SPARSE_MMAP_ARRAY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#ifdef __linux__
-
-#include <osmium/index/detail/mmap_vector_anon.hpp>
-#include <osmium/index/detail/vector_map.hpp>
-
-#define OSMIUM_HAS_INDEX_MAP_SPARSE_MMAP_ARRAY
-
-namespace osmium {
-
-    namespace index {
-
-        namespace map {
-
-            template <typename TId, typename TValue>
-            using SparseMmapArray = VectorBasedSparseMap<TId, TValue, osmium::detail::mmap_vector_anon>;
-
-        } // namespace map
-
-    } // namespace index
-
-} // namespace osmium
-
-#endif // __linux__
-
-#endif // OSMIUM_INDEX_MAP_SPARSE_MMAP_ARRAY_HPP
diff --git a/contrib/libosmium/osmium/index/multimap.hpp b/contrib/libosmium/osmium/index/multimap.hpp
deleted file mode 100644
index c817b6f..0000000
--- a/contrib/libosmium/osmium/index/multimap.hpp
+++ /dev/null
@@ -1,127 +0,0 @@
-#ifndef OSMIUM_INDEX_MULTIMAP_HPP
-#define OSMIUM_INDEX_MULTIMAP_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstddef>
-#include <stdexcept>
-#include <type_traits>
-#include <utility>
-
-namespace osmium {
-
-    namespace index {
-
-        /**
-         * @brief Key-value containers with multiple values for an integer key
-         */
-        namespace multimap {
-
-            template <typename TId, typename TValue>
-            class Multimap {
-
-                static_assert(std::is_integral<TId>::value && std::is_unsigned<TId>::value, "TId template parameter for class Multimap must be unsigned integral type");
-
-                typedef typename std::pair<TId, TValue> element_type;
-
-                Multimap(const Multimap&) = delete;
-                Multimap& operator=(const Multimap&) = delete;
-
-            protected:
-
-                Multimap(Multimap&&) = default;
-                Multimap& operator=(Multimap&&) = default;
-
-            public:
-
-                /// The "key" type, usually osmium::unsigned_object_id_type.
-                typedef TId key_type;
-
-                /// The "value" type, usually a Location or size_t.
-                typedef TValue value_type;
-
-                Multimap() = default;
-
-                virtual ~Multimap() noexcept = default;
-
-                /// Set the field with id to value.
-                virtual void set(const TId id, const TValue value) = 0;
-
-                typedef element_type* iterator;
-
-//                virtual std::pair<iterator, iterator> get_all(const TId id) const = 0;
-
-                /**
-                 * Get the approximate number of items in the storage. The storage
-                 * might allocate memory in blocks, so this size might not be
-                 * accurate. You can not use this to find out how much memory the
-                 * storage uses. Use used_memory() for that.
-                 */
-                virtual size_t size() const = 0;
-
-                /**
-                 * Get the memory used for this storage in bytes. Note that this
-                 * is not necessarily entirely accurate but an approximation.
-                 * For storage classes that store the data in memory, this is
-                 * the main memory used, for storage classes storing data on disk
-                 * this is the memory used on disk.
-                 */
-                virtual size_t used_memory() const = 0;
-
-                /**
-                 * Clear memory used for this storage. After this you can not
-                 * use the storage container any more.
-                 */
-                virtual void clear() = 0;
-
-                /**
-                 * Sort data in map. Call this after writing all data and
-                 * before reading. Not all implementations need this.
-                 */
-                virtual void sort() {
-                    // default implementation is empty
-                }
-
-                virtual void dump_as_list(const int /*fd*/) {
-                    std::runtime_error("can't dump as list");
-                }
-
-            }; // class Multimap
-
-        } // namespace map
-
-    } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MULTIMAP_HPP
diff --git a/contrib/libosmium/osmium/index/multimap/all.hpp b/contrib/libosmium/osmium/index/multimap/all.hpp
deleted file mode 100644
index 8b0ae99..0000000
--- a/contrib/libosmium/osmium/index/multimap/all.hpp
+++ /dev/null
@@ -1,41 +0,0 @@
-#ifndef OSMIUM_INDEX_MULTIMAP_ALL_HPP
-#define OSMIUM_INDEX_MULTIMAP_ALL_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <osmium/index/multimap/sparse_file_array.hpp>   // IWYU pragma: keep
-#include <osmium/index/multimap/sparse_mem_array.hpp>    // IWYU pragma: keep
-#include <osmium/index/multimap/sparse_mem_multimap.hpp> // IWYU pragma: keep
-#include <osmium/index/multimap/sparse_mmap_array.hpp>   // IWYU pragma: keep
-
-#endif // OSMIUM_INDEX_MULTIMAP_ALL_HPP
diff --git a/contrib/libosmium/osmium/index/multimap/hybrid.hpp b/contrib/libosmium/osmium/index/multimap/hybrid.hpp
deleted file mode 100644
index cdf14a3..0000000
--- a/contrib/libosmium/osmium/index/multimap/hybrid.hpp
+++ /dev/null
@@ -1,204 +0,0 @@
-#ifndef OSMIUM_INDEX_MULTIMAP_HYBRID_HPP
-#define OSMIUM_INDEX_MULTIMAP_HYBRID_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstddef>
-#include <utility>
-
-#include <osmium/index/index.hpp>
-#include <osmium/index/multimap.hpp>
-#include <osmium/index/multimap/sparse_mem_array.hpp>
-#include <osmium/index/multimap/sparse_mem_multimap.hpp>
-
-namespace osmium {
-
-    namespace index {
-
-        namespace multimap {
-
-            template <typename TId, typename TValue>
-            class HybridIterator {
-
-                typedef SparseMemArray<TId, TValue> main_map_type;
-                typedef SparseMemMultimap<TId, TValue> extra_map_type;
-
-                typedef typename std::pair<TId, TValue> element_type;
-
-                typename main_map_type::iterator m_begin_main;
-                typename main_map_type::iterator m_end_main;
-                typename extra_map_type::iterator m_begin_extra;
-                typename extra_map_type::iterator m_end_extra;
-
-            public:
-
-                 HybridIterator(typename main_map_type::iterator begin_main,
-                                typename main_map_type::iterator end_main,
-                                typename extra_map_type::iterator begin_extra,
-                                typename extra_map_type::iterator end_extra) :
-                    m_begin_main(begin_main),
-                    m_end_main(end_main),
-                    m_begin_extra(begin_extra),
-                    m_end_extra(end_extra) {
-                }
-
-                ~HybridIterator() noexcept = default;
-
-                HybridIterator& operator++() {
-                    if (m_begin_main == m_end_main) {
-                        ++m_begin_extra;
-                    } else {
-                        ++m_begin_main;
-                        while (m_begin_main != m_end_main && m_begin_main->second == osmium::index::empty_value<TValue>()) { // ignore removed elements
-                            ++m_begin_main;
-                        }
-                    }
-                    return *this;
-                }
-
-                HybridIterator<TId, TValue> operator++(int) {
-                    auto tmp(*this);
-                    operator++();
-                    return tmp;
-                }
-
-                bool operator==(const HybridIterator& rhs) const {
-                    return m_begin_main == rhs.m_begin_main &&
-                           m_end_main   == rhs.m_end_main &&
-                           m_begin_extra == rhs.m_begin_extra &&
-                           m_end_extra   == rhs.m_end_extra;
-                }
-
-                bool operator!=(const HybridIterator& rhs) const {
-                    return ! operator==(rhs);
-                }
-
-                const element_type& operator*() {
-                    if (m_begin_main == m_end_main) {
-                        return *m_begin_extra;
-                    } else {
-                        return *m_begin_main;
-                    }
-                }
-
-                const element_type* operator->() {
-                    return &operator*();
-                }
-
-            }; // class HybridIterator
-
-            template <typename TId, typename TValue>
-            class Hybrid : public Multimap<TId, TValue> {
-
-                typedef SparseMemArray<TId, TValue> main_map_type;
-                typedef SparseMemMultimap<TId, TValue> extra_map_type;
-
-                main_map_type m_main;
-                extra_map_type m_extra;
-
-            public:
-
-                typedef HybridIterator<TId, TValue> iterator;
-                typedef const HybridIterator<TId, TValue> const_iterator;
-
-                Hybrid() :
-                    m_main(),
-                    m_extra() {
-                }
-
-                ~Hybrid() noexcept = default;
-
-                size_t size() const override final {
-                    return m_main.size() + m_extra.size();
-                }
-
-                size_t used_memory() const override final {
-                    return m_main.used_memory() + m_extra.used_memory();
-                }
-
-                void reserve(const size_t size) {
-                    m_main.reserve(size);
-                }
-
-                void unsorted_set(const TId id, const TValue value) {
-                    m_main.set(id, value);
-                }
-
-                void set(const TId id, const TValue value) override final {
-                    m_extra.set(id, value);
-                }
-
-                std::pair<iterator, iterator> get_all(const TId id) {
-                    auto result_main = m_main.get_all(id);
-                    auto result_extra = m_extra.get_all(id);
-                    return std::make_pair(iterator(result_main.first, result_main.second, result_extra.first, result_extra.second),
-                                          iterator(result_main.second, result_main.second, result_extra.second, result_extra.second));
-                }
-
-                void remove(const TId id, const TValue value) {
-                    m_main.remove(id, value);
-                    m_extra.remove(id, value);
-                }
-
-                void consolidate() {
-                    m_main.erase_removed();
-                    for (const auto& element : m_extra) {
-                        m_main.set(element.first, element.second);
-                    }
-                    m_extra.clear();
-                    m_main.sort();
-                }
-
-                void dump_as_list(const int fd) override final {
-                    consolidate();
-                    m_main.dump_as_list(fd);
-                }
-
-                void clear() override final {
-                    m_main.clear();
-                    m_extra.clear();
-                }
-
-                void sort() override final {
-                    m_main.sort();
-                }
-
-            }; // class Hybrid
-
-        } // namespace multimap
-
-    } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MULTIMAP_HYBRID_HPP
diff --git a/contrib/libosmium/osmium/index/multimap/sparse_file_array.hpp b/contrib/libosmium/osmium/index/multimap/sparse_file_array.hpp
deleted file mode 100644
index 0b9ae92..0000000
--- a/contrib/libosmium/osmium/index/multimap/sparse_file_array.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef OSMIUM_INDEX_MULTIMAP_SPARSE_FILE_ARRAY_HPP
-#define OSMIUM_INDEX_MULTIMAP_SPARSE_FILE_ARRAY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <osmium/index/detail/mmap_vector_file.hpp>
-#include <osmium/index/detail/vector_multimap.hpp>
-
-namespace osmium {
-
-    namespace index {
-
-        namespace multimap {
-
-            template <typename TId, typename TValue>
-            using SparseFileArray = VectorBasedSparseMultimap<TId, TValue, osmium::detail::mmap_vector_file>;
-
-        } // namespace multimap
-
-    } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MULTIMAP_SPARSE_FILE_ARRAY_HPP
diff --git a/contrib/libosmium/osmium/index/multimap/sparse_mem_array.hpp b/contrib/libosmium/osmium/index/multimap/sparse_mem_array.hpp
deleted file mode 100644
index c4140cb..0000000
--- a/contrib/libosmium/osmium/index/multimap/sparse_mem_array.hpp
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef OSMIUM_INDEX_MULTIMAP_SPARSE_MEM_ARRAY_HPP
-#define OSMIUM_INDEX_MULTIMAP_SPARSE_MEM_ARRAY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <vector>
-
-#include <osmium/index/detail/vector_multimap.hpp>
-
-namespace osmium {
-
-    namespace index {
-
-        namespace multimap {
-
-            template <typename T>
-            using StdVectorWrap = std::vector<T>;
-
-            template <typename TId, typename TValue>
-            using SparseMemArray = VectorBasedSparseMultimap<TId, TValue, StdVectorWrap>;
-
-        } // namespace multimap
-
-    } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MULTIMAP_SPARSE_MEM_ARRAY_HPP
diff --git a/contrib/libosmium/osmium/index/multimap/sparse_mem_multimap.hpp b/contrib/libosmium/osmium/index/multimap/sparse_mem_multimap.hpp
deleted file mode 100644
index 353e357..0000000
--- a/contrib/libosmium/osmium/index/multimap/sparse_mem_multimap.hpp
+++ /dev/null
@@ -1,151 +0,0 @@
-#ifndef OSMIUM_INDEX_MULTIMAP_SPARSE_MEM_MULTIMAP_HPP
-#define OSMIUM_INDEX_MULTIMAP_SPARSE_MEM_MULTIMAP_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <cstddef>
-#include <map>
-#include <utility>
-#include <vector>
-
-#include <osmium/index/multimap.hpp>
-#include <osmium/io/detail/read_write.hpp>
-
-namespace osmium {
-
-    namespace index {
-
-        namespace multimap {
-
-            /**
-             * This implementation uses std::multimap internally. It uses rather a
-             * lot of memory, but might make sense for small maps.
-             */
-            template <typename TId, typename TValue>
-            class SparseMemMultimap : public osmium::index::multimap::Multimap<TId, TValue> {
-
-                // This is a rough estimate for the memory needed for each
-                // element in the map (id + value + pointers to left, right,
-                // and parent plus some overhead for color of red-black-tree
-                // or similar).
-                static constexpr size_t element_size = sizeof(TId) + sizeof(TValue) + sizeof(void*) * 4;
-
-            public:
-
-                typedef typename std::multimap<const TId, TValue> collection_type;
-                typedef typename collection_type::iterator iterator;
-                typedef typename collection_type::const_iterator const_iterator;
-                typedef typename collection_type::value_type value_type;
-
-                typedef typename std::pair<TId, TValue> element_type;
-
-            private:
-
-                collection_type m_elements;
-
-            public:
-
-                SparseMemMultimap() = default;
-
-                ~SparseMemMultimap() noexcept override final = default;
-
-                void unsorted_set(const TId id, const TValue value) {
-                    m_elements.emplace(id, value);
-                }
-
-                void set(const TId id, const TValue value) override final {
-                    m_elements.emplace(id, value);
-                }
-
-                std::pair<iterator, iterator> get_all(const TId id) {
-                    return m_elements.equal_range(id);
-                }
-
-                std::pair<const_iterator, const_iterator> get_all(const TId id) const {
-                    return m_elements.equal_range(id);
-                }
-
-                void remove(const TId id, const TValue value) {
-                    std::pair<iterator, iterator> r = get_all(id);
-                    for (iterator it = r.first; it != r.second; ++it) {
-                        if (it->second == value) {
-                            m_elements.erase(it);
-                            return;
-                        }
-                    }
-                }
-
-                iterator begin() {
-                    return m_elements.begin();
-                }
-
-                iterator end() {
-                    return m_elements.end();
-                }
-
-                size_t size() const override final {
-                    return m_elements.size();
-                }
-
-                size_t used_memory() const override final {
-                    return element_size * m_elements.size();
-                }
-
-                void clear() override final {
-                    m_elements.clear();
-                }
-
-                void consolidate() {
-                    // intentionally left blank
-                }
-
-                void dump_as_list(const int fd) override final {
-                    std::vector<element_type> v;
-                    v.reserve(m_elements.size());
-                    for (const auto& element : m_elements) {
-                        v.emplace_back(element.first, element.second);
-                    }
-                    std::sort(v.begin(), v.end());
-                    osmium::io::detail::reliable_write(fd, reinterpret_cast<const char*>(v.data()), sizeof(element_type) * v.size());
-                }
-
-            }; // class SparseMemMultimap
-
-        } // namespace multimap
-
-    } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MULTIMAP_SPARSE_MEM_MULTIMAP_HPP
diff --git a/contrib/libosmium/osmium/index/multimap/sparse_mmap_array.hpp b/contrib/libosmium/osmium/index/multimap/sparse_mmap_array.hpp
deleted file mode 100644
index 9f92555..0000000
--- a/contrib/libosmium/osmium/index/multimap/sparse_mmap_array.hpp
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef OSMIUM_INDEX_MULTIMAP_SPARSE_MMAP_ARRAY_HPP
-#define OSMIUM_INDEX_MULTIMAP_SPARSE_MMAP_ARRAY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#ifdef __linux__
-
-#include <osmium/index/detail/mmap_vector_anon.hpp>
-#include <osmium/index/detail/vector_multimap.hpp>
-
-namespace osmium {
-
-    namespace index {
-
-        namespace multimap {
-
-            template <typename TId, typename TValue>
-            using SparseMmapArray = VectorBasedSparseMultimap<TId, TValue, osmium::detail::mmap_vector_anon>;
-
-        } // namespace multimap
-
-    } // namespace index
-
-} // namespace osmium
-
-#endif // __linux__
-
-#endif // OSMIUM_INDEX_MULTIMAP_SPARSE_MMAP_ARRAY_HPP
diff --git a/contrib/libosmium/osmium/index/node_locations_map.hpp b/contrib/libosmium/osmium/index/node_locations_map.hpp
deleted file mode 100644
index ca4b136..0000000
--- a/contrib/libosmium/osmium/index/node_locations_map.hpp
+++ /dev/null
@@ -1,70 +0,0 @@
-#ifndef OSMIUM_INDEX_NODE_LOCATIONS_MAP_HPP
-#define OSMIUM_INDEX_NODE_LOCATIONS_MAP_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <osmium/index/map.hpp> // IWYU pragma: keep
-
-#ifdef OSMIUM_HAS_INDEX_MAP_DENSE_FILE_ARRAY
-    REGISTER_MAP(osmium::unsigned_object_id_type, osmium::Location, osmium::index::map::DenseFileArray, dense_file_array)
-#endif
-
-#ifdef OSMIUM_HAS_INDEX_MAP_DENSE_MEM_ARRAY
-    REGISTER_MAP(osmium::unsigned_object_id_type, osmium::Location, osmium::index::map::DenseMemArray, dense_mem_array)
-#endif
-
-#ifdef OSMIUM_HAS_INDEX_MAP_DENSE_MMAP_ARRAY
-    REGISTER_MAP(osmium::unsigned_object_id_type, osmium::Location, osmium::index::map::DenseMmapArray, dense_mmap_array)
-#endif
-
-#ifdef OSMIUM_HAS_INDEX_MAP_SPARSE_FILE_ARRAY
-    REGISTER_MAP(osmium::unsigned_object_id_type, osmium::Location, osmium::index::map::SparseFileArray, sparse_file_array)
-#endif
-
-#ifdef OSMIUM_HAS_INDEX_MAP_SPARSE_MEM_ARRAY
-    REGISTER_MAP(osmium::unsigned_object_id_type, osmium::Location, osmium::index::map::SparseMemArray, sparse_mem_array)
-#endif
-
-#ifdef OSMIUM_HAS_INDEX_MAP_SPARSE_MEM_MAP
-    REGISTER_MAP(osmium::unsigned_object_id_type, osmium::Location, osmium::index::map::SparseMemMap, sparse_mem_map)
-#endif
-
-#ifdef OSMIUM_HAS_INDEX_MAP_SPARSE_MEM_TABLE
-    REGISTER_MAP(osmium::unsigned_object_id_type, osmium::Location, osmium::index::map::SparseMemTable, sparse_mem_table)
-#endif
-
-#ifdef OSMIUM_HAS_INDEX_MAP_SPARSE_MMAP_ARRAY
-    REGISTER_MAP(osmium::unsigned_object_id_type, osmium::Location, osmium::index::map::SparseMmapArray, sparse_mmap_array)
-#endif
-
-#endif // OSMIUM_INDEX_NODE_LOCATIONS_MAP_HPP
diff --git a/contrib/libosmium/osmium/io/any_compression.hpp b/contrib/libosmium/osmium/io/any_compression.hpp
deleted file mode 100644
index 00e8ee2..0000000
--- a/contrib/libosmium/osmium/io/any_compression.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef OSMIUM_IO_ANY_COMPRESSION_HPP
-#define OSMIUM_IO_ANY_COMPRESSION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-/**
- * @file
- *
- * Include this file if you want to read or write compressed OSM XML files.
- *
- * @attention If you include this file, you'll need to link with `libz`
- *            and `libbz2`.
- */
-
-#include <osmium/io/bzip2_compression.hpp> // IWYU pragma: export
-#include <osmium/io/gzip_compression.hpp> // IWYU pragma: export
-
-#endif // OSMIUM_IO_ANY_COMPRESSION_HPP
diff --git a/contrib/libosmium/osmium/io/any_input.hpp b/contrib/libosmium/osmium/io/any_input.hpp
deleted file mode 100644
index 36f43b7..0000000
--- a/contrib/libosmium/osmium/io/any_input.hpp
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef OSMIUM_IO_ANY_INPUT_HPP
-#define OSMIUM_IO_ANY_INPUT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-/**
- * @file
- *
- * Include this file if you want to read all kinds of OSM files.
- *
- * @attention If you include this file, you'll need to link with
- *            `ws2_32` (Windows only), `libexpat`, `libz`, `libbz2`,
- *            and enable multithreading.
- */
-
-#include <osmium/io/any_compression.hpp> // IWYU pragma: export
-
-#include <osmium/io/pbf_input.hpp> // IWYU pragma: export
-#include <osmium/io/xml_input.hpp> // IWYU pragma: export
-#include <osmium/io/o5m_input.hpp> // IWYU pragma: export
-
-#endif // OSMIUM_IO_ANY_INPUT_HPP
diff --git a/contrib/libosmium/osmium/io/any_output.hpp b/contrib/libosmium/osmium/io/any_output.hpp
deleted file mode 100644
index 990a27b..0000000
--- a/contrib/libosmium/osmium/io/any_output.hpp
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef OSMIUM_IO_ANY_OUTPUT_HPP
-#define OSMIUM_IO_ANY_OUTPUT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-/**
- * @file
- *
- * Include this file if you want to write all kinds of OSM files.
- *
- * @attention If you include this file, you'll need to link with
- *            `ws2_32` (Windows only), `libz`, `libbz2`, and enable
- *            multithreading.
- */
-
-#include <osmium/io/any_compression.hpp> // IWYU pragma: export
-
-#include <osmium/io/debug_output.hpp> // IWYU pragma: export
-#include <osmium/io/opl_output.hpp> // IWYU pragma: export
-#include <osmium/io/pbf_output.hpp> // IWYU pragma: export
-#include <osmium/io/xml_output.hpp> // IWYU pragma: export
-
-#endif // OSMIUM_IO_ANY_OUTPUT_HPP
diff --git a/contrib/libosmium/osmium/io/bzip2_compression.hpp b/contrib/libosmium/osmium/io/bzip2_compression.hpp
deleted file mode 100644
index ad4b877..0000000
--- a/contrib/libosmium/osmium/io/bzip2_compression.hpp
+++ /dev/null
@@ -1,321 +0,0 @@
-#ifndef OSMIUM_IO_BZIP2_COMPRESSION_HPP
-#define OSMIUM_IO_BZIP2_COMPRESSION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-/**
- * @file
- *
- * Include this file if you want to read or write bzip2-compressed OSM XML
- * files.
- *
- * @attention If you include this file, you'll need to link with `libbz2`.
- */
-
-#include <cerrno>
-#include <cstddef>
-#include <cstdio>
-#include <stdexcept>
-#include <string>
-
-#include <bzlib.h>
-
-#ifndef _MSC_VER
-# include <unistd.h>
-#endif
-
-#include <osmium/io/compression.hpp>
-#include <osmium/io/error.hpp>
-#include <osmium/io/file_compression.hpp>
-#include <osmium/io/writer_options.hpp>
-#include <osmium/util/cast.hpp>
-#include <osmium/util/compatibility.hpp>
-
-namespace osmium {
-
-    /**
-     * Exception thrown when there are problems compressing or
-     * decompressing bzip2 files.
-     */
-    struct bzip2_error : public io_error {
-
-        int bzip2_error_code;
-        int system_errno;
-
-        bzip2_error(const std::string& what, int error_code) :
-            io_error(what),
-            bzip2_error_code(error_code),
-            system_errno(error_code == BZ_IO_ERROR ? errno : 0) {
-        }
-
-    }; // struct bzip2_error
-
-    namespace io {
-
-        namespace detail {
-
-            OSMIUM_NORETURN inline void throw_bzip2_error(BZFILE* bzfile, const char* msg, int bzlib_error = 0) {
-                std::string error("bzip2 error: ");
-                error += msg;
-                error += ": ";
-                int errnum = bzlib_error;
-                if (bzlib_error) {
-                    error += std::to_string(bzlib_error);
-                } else {
-                    error += ::BZ2_bzerror(bzfile, &errnum);
-                }
-                throw osmium::bzip2_error(error, errnum);
-            }
-
-        } // namespace detail
-
-        class Bzip2Compressor : public Compressor {
-
-            FILE* m_file;
-            int m_bzerror;
-            BZFILE* m_bzfile;
-
-        public:
-
-            explicit Bzip2Compressor(int fd, fsync sync) :
-                Compressor(sync),
-                m_file(fdopen(dup(fd), "wb")),
-                m_bzerror(BZ_OK),
-                m_bzfile(::BZ2_bzWriteOpen(&m_bzerror, m_file, 6, 0, 0)) {
-                if (!m_bzfile) {
-                    detail::throw_bzip2_error(m_bzfile, "write open failed", m_bzerror);
-                }
-            }
-
-            ~Bzip2Compressor() noexcept override final {
-                try {
-                    close();
-                } catch (...) {
-                    // Ignore any exceptions because destructor must not throw.
-                }
-            }
-
-            void write(const std::string& data) override final {
-                int error;
-                ::BZ2_bzWrite(&error, m_bzfile, const_cast<char*>(data.data()), static_cast_with_assert<int>(data.size()));
-                if (error != BZ_OK && error != BZ_STREAM_END) {
-                    detail::throw_bzip2_error(m_bzfile, "write failed", error);
-                }
-            }
-
-            void close() override final {
-                if (m_bzfile) {
-                    int error;
-                    ::BZ2_bzWriteClose(&error, m_bzfile, 0, nullptr, nullptr);
-                    m_bzfile = nullptr;
-                    if (m_file) {
-                        if (do_fsync()) {
-                            osmium::io::detail::reliable_fsync(::fileno(m_file));
-                        }
-                        if (fclose(m_file) != 0) {
-                            throw std::system_error(errno, std::system_category(), "Close failed");
-                        }
-                    }
-                    if (error != BZ_OK) {
-                        detail::throw_bzip2_error(m_bzfile, "write close failed", error);
-                    }
-                }
-            }
-
-        }; // class Bzip2Compressor
-
-        class Bzip2Decompressor : public Decompressor {
-
-            FILE* m_file;
-            int m_bzerror;
-            BZFILE* m_bzfile;
-            bool m_stream_end {false};
-
-        public:
-
-            Bzip2Decompressor(int fd) :
-                Decompressor(),
-                m_file(fdopen(dup(fd), "rb")),
-                m_bzerror(BZ_OK),
-                m_bzfile(::BZ2_bzReadOpen(&m_bzerror, m_file, 0, 0, nullptr, 0)) {
-                if (!m_bzfile) {
-                    detail::throw_bzip2_error(m_bzfile, "read open failed", m_bzerror);
-                }
-            }
-
-            ~Bzip2Decompressor() noexcept override final {
-                try {
-                    close();
-                } catch (...) {
-                    // Ignore any exceptions because destructor must not throw.
-                }
-            }
-
-            std::string read() override final {
-                std::string buffer;
-
-                if (!m_stream_end) {
-                    buffer.resize(osmium::io::Decompressor::input_buffer_size);
-                    int error;
-                    int nread = ::BZ2_bzRead(&error, m_bzfile, const_cast<char*>(buffer.data()), static_cast_with_assert<int>(buffer.size()));
-                    if (error != BZ_OK && error != BZ_STREAM_END) {
-                        detail::throw_bzip2_error(m_bzfile, "read failed", error);
-                    }
-                    if (error == BZ_STREAM_END) {
-                        void* unused;
-                        int nunused;
-                        if (! feof(m_file)) {
-                            ::BZ2_bzReadGetUnused(&error, m_bzfile, &unused, &nunused);
-                            if (error != BZ_OK) {
-                                detail::throw_bzip2_error(m_bzfile, "get unused failed", error);
-                            }
-                            std::string unused_data(static_cast<const char*>(unused), static_cast<std::string::size_type>(nunused));
-                            ::BZ2_bzReadClose(&error, m_bzfile);
-                            if (error != BZ_OK) {
-                                detail::throw_bzip2_error(m_bzfile, "read close failed", error);
-                            }
-                            m_bzfile = ::BZ2_bzReadOpen(&error, m_file, 0, 0, const_cast<void*>(static_cast<const void*>(unused_data.data())), static_cast_with_assert<int>(unused_data.size()));
-                            if (error != BZ_OK) {
-                                detail::throw_bzip2_error(m_bzfile, "read open failed", error);
-                            }
-                        } else {
-                            m_stream_end = true;
-                        }
-                    }
-                    buffer.resize(static_cast<std::string::size_type>(nread));
-                }
-
-                return buffer;
-            }
-
-            void close() override final {
-                if (m_bzfile) {
-                    int error;
-                    ::BZ2_bzReadClose(&error, m_bzfile);
-                    m_bzfile = nullptr;
-                    if (m_file) {
-                        if (fclose(m_file) != 0) {
-                            throw std::system_error(errno, std::system_category(), "Close failed");
-                        }
-                    }
-                    if (error != BZ_OK) {
-                        detail::throw_bzip2_error(m_bzfile, "read close failed", error);
-                    }
-                }
-            }
-
-        }; // class Bzip2Decompressor
-
-        class Bzip2BufferDecompressor : public Decompressor {
-
-            const char* m_buffer;
-            size_t m_buffer_size;
-            bz_stream m_bzstream;
-
-        public:
-
-            Bzip2BufferDecompressor(const char* buffer, size_t size) :
-                m_buffer(buffer),
-                m_buffer_size(size),
-                m_bzstream() {
-                m_bzstream.next_in = const_cast<char*>(buffer);
-                m_bzstream.avail_in = static_cast_with_assert<unsigned int>(size);
-                int result = BZ2_bzDecompressInit(&m_bzstream, 0, 0);
-                if (result != BZ_OK) {
-                    std::string message("bzip2 error: decompression init failed: ");
-                    throw bzip2_error(message, result);
-                }
-            }
-
-            ~Bzip2BufferDecompressor() noexcept override final {
-                try {
-                    close();
-                } catch (...) {
-                    // Ignore any exceptions because destructor must not throw.
-                }
-            }
-
-            std::string read() override final {
-                std::string output;
-
-                if (m_buffer) {
-                    const size_t buffer_size = 10240;
-                    output.resize(buffer_size);
-                    m_bzstream.next_out = const_cast<char*>(output.data());
-                    m_bzstream.avail_out = buffer_size;
-                    int result = BZ2_bzDecompress(&m_bzstream);
-
-                    if (result != BZ_OK) {
-                        m_buffer = nullptr;
-                        m_buffer_size = 0;
-                    }
-
-                    if (result != BZ_OK && result != BZ_STREAM_END) {
-                        std::string message("bzip2 error: decompress failed: ");
-                        throw bzip2_error(message, result);
-                    }
-
-                    output.resize(static_cast<unsigned long>(m_bzstream.next_out - output.data()));
-                }
-
-                return output;
-            }
-
-            void close() override final {
-                BZ2_bzDecompressEnd(&m_bzstream);
-            }
-
-        }; // class Bzip2BufferDecompressor
-
-        namespace detail {
-
-            // we want the register_compression() function to run, setting
-            // the variable is only a side-effect, it will never be used
-            const bool registered_bzip2_compression = osmium::io::CompressionFactory::instance().register_compression(osmium::io::file_compression::bzip2,
-                [](int fd, fsync sync) { return new osmium::io::Bzip2Compressor(fd, sync); },
-                [](int fd) { return new osmium::io::Bzip2Decompressor(fd); },
-                [](const char* buffer, size_t size) { return new osmium::io::Bzip2BufferDecompressor(buffer, size); }
-            );
-
-            // dummy function to silence the unused variable warning from above
-            inline bool get_registered_bzip2_compression() noexcept {
-                return registered_bzip2_compression;
-            }
-
-        } // namespace detail
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_BZIP2_COMPRESSION_HPP
diff --git a/contrib/libosmium/osmium/io/compression.hpp b/contrib/libosmium/osmium/io/compression.hpp
deleted file mode 100644
index 4a69be7..0000000
--- a/contrib/libosmium/osmium/io/compression.hpp
+++ /dev/null
@@ -1,321 +0,0 @@
-#ifndef OSMIUM_IO_COMPRESSION_HPP
-#define OSMIUM_IO_COMPRESSION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cerrno>
-#include <functional>
-#include <map>
-#include <memory>
-#include <stdexcept>
-#include <string>
-#include <system_error>
-#include <tuple>
-#include <utility>
-
-#ifndef _MSC_VER
-# include <unistd.h>
-#else
-# include <io.h>
-#endif
-
-#include <osmium/io/detail/read_write.hpp>
-#include <osmium/io/error.hpp>
-#include <osmium/io/file_compression.hpp>
-#include <osmium/io/writer_options.hpp>
-#include <osmium/util/compatibility.hpp>
-
-namespace osmium {
-
-    namespace io {
-
-        class Compressor {
-
-            fsync m_fsync;
-
-        protected:
-
-            bool do_fsync() const {
-                return m_fsync == fsync::yes;
-            }
-
-        public:
-
-            explicit Compressor(fsync sync) :
-                m_fsync(sync) {
-            }
-
-            virtual ~Compressor() noexcept {
-            }
-
-            virtual void write(const std::string& data) = 0;
-
-            virtual void close() = 0;
-
-        }; // class Compressor
-
-        class Decompressor {
-
-        public:
-
-            static constexpr unsigned int input_buffer_size = 1024 * 1024;
-
-            Decompressor() = default;
-
-            Decompressor(const Decompressor&) = delete;
-            Decompressor& operator=(const Decompressor&) = delete;
-
-            Decompressor(Decompressor&&) = delete;
-            Decompressor& operator=(Decompressor&&) = delete;
-
-            virtual ~Decompressor() noexcept {
-            }
-
-            virtual std::string read() = 0;
-
-            virtual void close() = 0;
-
-        }; // class Decompressor
-
-        /**
-         * This singleton factory class is used to register compression
-         * algorithms used for reading and writing OSM files.
-         *
-         * For each algorithm we store two functions that construct
-         * a compressor and decompressor object, respectively.
-         */
-        class CompressionFactory {
-
-        public:
-
-            typedef std::function<osmium::io::Compressor*(int, fsync)> create_compressor_type;
-            typedef std::function<osmium::io::Decompressor*(int)> create_decompressor_type_fd;
-            typedef std::function<osmium::io::Decompressor*(const char*, size_t)> create_decompressor_type_buffer;
-
-        private:
-
-            typedef std::map<const osmium::io::file_compression,
-                             std::tuple<create_compressor_type,
-                                        create_decompressor_type_fd,
-                                        create_decompressor_type_buffer>> compression_map_type;
-
-            compression_map_type m_callbacks;
-
-            CompressionFactory() = default;
-
-            CompressionFactory(const CompressionFactory&) = delete;
-            CompressionFactory& operator=(const CompressionFactory&) = delete;
-
-            CompressionFactory(CompressionFactory&&) = delete;
-            CompressionFactory& operator=(CompressionFactory&&) = delete;
-
-            OSMIUM_NORETURN void error(osmium::io::file_compression compression) {
-                std::string error_message {"Support for compression '"};
-                error_message += as_string(compression);
-                error_message += "' not compiled into this binary.";
-                throw unsupported_file_format_error(error_message);
-            }
-
-        public:
-
-            static CompressionFactory& instance() {
-                static CompressionFactory factory;
-                return factory;
-            }
-
-            bool register_compression(
-                osmium::io::file_compression compression,
-                create_compressor_type create_compressor,
-                create_decompressor_type_fd create_decompressor_fd,
-                create_decompressor_type_buffer create_decompressor_buffer) {
-
-                compression_map_type::value_type cc(compression,
-                                                    std::make_tuple(create_compressor,
-                                                                    create_decompressor_fd,
-                                                                    create_decompressor_buffer));
-
-                return m_callbacks.insert(cc).second;
-            }
-
-            template <typename... TArgs>
-            std::unique_ptr<osmium::io::Compressor> create_compressor(osmium::io::file_compression compression, TArgs&&... args) {
-                auto it = m_callbacks.find(compression);
-
-                if (it != m_callbacks.end()) {
-                    return std::unique_ptr<osmium::io::Compressor>(std::get<0>(it->second)(std::forward<TArgs>(args)...));
-                }
-
-                error(compression);
-            }
-
-            std::unique_ptr<osmium::io::Decompressor> create_decompressor(osmium::io::file_compression compression, int fd) {
-                auto it = m_callbacks.find(compression);
-
-                if (it != m_callbacks.end()) {
-                    return std::unique_ptr<osmium::io::Decompressor>(std::get<1>(it->second)(fd));
-                }
-
-                error(compression);
-            }
-
-            std::unique_ptr<osmium::io::Decompressor> create_decompressor(osmium::io::file_compression compression, const char* buffer, size_t size) {
-                auto it = m_callbacks.find(compression);
-
-                if (it != m_callbacks.end()) {
-                    return std::unique_ptr<osmium::io::Decompressor>(std::get<2>(it->second)(buffer, size));
-                }
-
-                error(compression);
-            }
-
-        }; // class CompressionFactory
-
-        class NoCompressor : public Compressor {
-
-            int m_fd;
-
-        public:
-
-            NoCompressor(int fd, fsync sync) :
-                Compressor(sync),
-                m_fd(fd) {
-            }
-
-            ~NoCompressor() noexcept override final {
-                try {
-                    close();
-                } catch (...) {
-                    // Ignore any exceptions because destructor must not throw.
-                }
-            }
-
-            void write(const std::string& data) override final {
-                osmium::io::detail::reliable_write(m_fd, data.data(), data.size());
-            }
-
-            void close() override final {
-                if (m_fd >= 0) {
-                    int fd = m_fd;
-                    m_fd = -1;
-                    if (do_fsync()) {
-                        osmium::io::detail::reliable_fsync(fd);
-                    }
-                    osmium::io::detail::reliable_close(fd);
-                }
-            }
-
-        }; // class NoCompressor
-
-        class NoDecompressor : public Decompressor {
-
-            int m_fd;
-            const char *m_buffer;
-            size_t m_buffer_size;
-
-        public:
-
-            NoDecompressor(int fd) :
-                Decompressor(),
-                m_fd(fd),
-                m_buffer(nullptr),
-                m_buffer_size(0) {
-            }
-
-            NoDecompressor(const char* buffer, size_t size) :
-                Decompressor(),
-                m_fd(-1),
-                m_buffer(buffer),
-                m_buffer_size(size) {
-            }
-
-            ~NoDecompressor() noexcept override final {
-                try {
-                    close();
-                } catch (...) {
-                    // Ignore any exceptions because destructor must not throw.
-                }
-            }
-
-            std::string read() override final {
-                std::string buffer;
-
-                if (m_buffer) {
-                    if (m_buffer_size != 0) {
-                        size_t size = m_buffer_size;
-                        m_buffer_size = 0;
-                        buffer.append(m_buffer, size);
-                    }
-                } else {
-                    buffer.resize(osmium::io::Decompressor::input_buffer_size);
-                    auto nread = ::read(m_fd, const_cast<char*>(buffer.data()), osmium::io::Decompressor::input_buffer_size);
-                    if (nread < 0) {
-                        throw std::system_error(errno, std::system_category(), "Read failed");
-                    }
-                    buffer.resize(std::string::size_type(nread));
-                }
-
-                return buffer;
-            }
-
-            void close() override final {
-                if (m_fd >= 0) {
-                    int fd = m_fd;
-                    m_fd = -1;
-                    osmium::io::detail::reliable_close(fd);
-                }
-            }
-
-        }; // class NoDecompressor
-
-        namespace detail {
-
-            // we want the register_compression() function to run, setting
-            // the variable is only a side-effect, it will never be used
-            const bool registered_no_compression = osmium::io::CompressionFactory::instance().register_compression(osmium::io::file_compression::none,
-                [](int fd, fsync sync) { return new osmium::io::NoCompressor(fd, sync); },
-                [](int fd) { return new osmium::io::NoDecompressor(fd); },
-                [](const char* buffer, size_t size) { return new osmium::io::NoDecompressor(buffer, size); }
-            );
-
-            // dummy function to silence the unused variable warning from above
-            inline bool get_registered_no_compression() noexcept {
-                return registered_no_compression;
-            }
-
-        } // namespace detail
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_COMPRESSION_HPP
diff --git a/contrib/libosmium/osmium/io/debug_output.hpp b/contrib/libosmium/osmium/io/debug_output.hpp
deleted file mode 100644
index 2836f79..0000000
--- a/contrib/libosmium/osmium/io/debug_output.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef OSMIUM_IO_DEBUG_OUTPUT_HPP
-#define OSMIUM_IO_DEBUG_OUTPUT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <osmium/io/writer.hpp> // IWYU pragma: export
-#include <osmium/io/detail/debug_output_format.hpp> // IWYU pragma: export
-
-#endif // OSMIUM_IO_DEBUG_OUTPUT_HPP
diff --git a/contrib/libosmium/osmium/io/detail/debug_output_format.hpp b/contrib/libosmium/osmium/io/detail/debug_output_format.hpp
deleted file mode 100644
index 90ec199..0000000
--- a/contrib/libosmium/osmium/io/detail/debug_output_format.hpp
+++ /dev/null
@@ -1,485 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_DEBUG_OUTPUT_FORMAT_HPP
-#define OSMIUM_IO_DETAIL_DEBUG_OUTPUT_FORMAT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cinttypes>
-#include <cstddef>
-#include <cstdint>
-#include <cstdio>
-#include <future>
-#include <iterator>
-#include <memory>
-#include <string>
-#include <thread>
-#include <utility>
-
-#include <osmium/io/detail/output_format.hpp>
-#include <osmium/io/file_format.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/memory/collection.hpp>
-#include <osmium/osm/box.hpp>
-#include <osmium/osm/changeset.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/relation.hpp>
-#include <osmium/osm/tag.hpp>
-#include <osmium/osm/timestamp.hpp>
-#include <osmium/osm/way.hpp>
-#include <osmium/thread/pool.hpp>
-#include <osmium/util/minmax.hpp>
-#include <osmium/visitor.hpp>
-
-namespace osmium {
-
-    namespace io {
-
-        class File;
-
-        namespace detail {
-
-            constexpr const char* color_bold    = "\x1b[1m";
-            constexpr const char* color_black   = "\x1b[30m";
-            constexpr const char* color_gray    = "\x1b[30;1m";
-            constexpr const char* color_red     = "\x1b[31m";
-            constexpr const char* color_green   = "\x1b[32m";
-            constexpr const char* color_yellow  = "\x1b[33m";
-            constexpr const char* color_blue    = "\x1b[34m";
-            constexpr const char* color_magenta = "\x1b[35m";
-            constexpr const char* color_cyan    = "\x1b[36m";
-            constexpr const char* color_white   = "\x1b[37m";
-            constexpr const char* color_reset   = "\x1b[0m";
-
-            struct debug_output_options {
-
-                /// Should metadata of objects be added?
-                bool add_metadata;
-
-                /// Output with ANSI colors?
-                bool use_color;
-
-            };
-
-            /**
-             * Writes out one buffer with OSM data in Debug format.
-             */
-            class DebugOutputBlock : public OutputBlock {
-
-                debug_output_options m_options;
-
-                const char* m_utf8_prefix = "";
-                const char* m_utf8_suffix = "";
-
-                void append_encoded_string(const char* data) {
-                    append_debug_encoded_string(*m_out, data, m_utf8_prefix, m_utf8_suffix);
-                }
-
-                void write_color(const char* color) {
-                    if (m_options.use_color) {
-                        *m_out += color;
-                    }
-                }
-
-                void write_string(const char* string) {
-                    *m_out += '"';
-                    write_color(color_blue);
-                    append_encoded_string(string);
-                    write_color(color_reset);
-                    *m_out += '"';
-                }
-
-                void write_object_type(const char* object_type, bool visible = true) {
-                    if (visible) {
-                        write_color(color_bold);
-                    } else {
-                        write_color(color_white);
-                    }
-                    *m_out += object_type;
-                    write_color(color_reset);
-                    *m_out += ' ';
-                }
-
-                void write_fieldname(const char* name) {
-                    *m_out += "  ";
-                    write_color(color_cyan);
-                    *m_out += name;
-                    write_color(color_reset);
-                    *m_out += ": ";
-                }
-
-                void write_comment_field(const char* name) {
-                    write_color(color_cyan);
-                    *m_out += name;
-                    write_color(color_reset);
-                    *m_out += ": ";
-                }
-
-                void write_counter(int width, int n) {
-                    write_color(color_white);
-                    output_formatted("    %0*d: ", width, n++);
-                    write_color(color_reset);
-                }
-
-                void write_error(const char* msg) {
-                    write_color(color_red);
-                    *m_out += msg;
-                    write_color(color_reset);
-                }
-
-                void write_timestamp(const osmium::Timestamp& timestamp) {
-                    if (timestamp.valid()) {
-                        *m_out += timestamp.to_iso();
-                        output_formatted(" (%d)", timestamp.seconds_since_epoch());
-                    } else {
-                        write_error("NOT SET");
-                    }
-                    *m_out += '\n';
-                }
-
-                void write_meta(const osmium::OSMObject& object) {
-                    output_formatted("%" PRId64 "\n", object.id());
-                    if (m_options.add_metadata) {
-                        write_fieldname("version");
-                        output_formatted("  %d", object.version());
-                        if (object.visible()) {
-                            *m_out += " visible\n";
-                        } else {
-                            write_error(" deleted\n");
-                        }
-                        write_fieldname("changeset");
-                        output_formatted("%d\n", object.changeset());
-                        write_fieldname("timestamp");
-                        write_timestamp(object.timestamp());
-                        write_fieldname("user");
-                        output_formatted("     %d ", object.uid());
-                        write_string(object.user());
-                        *m_out += '\n';
-                    }
-                }
-
-                void write_tags(const osmium::TagList& tags, const char* padding="") {
-                    if (!tags.empty()) {
-                        write_fieldname("tags");
-                        *m_out += padding;
-                        output_formatted("     %d\n", tags.size());
-
-                        osmium::max_op<size_t> max;
-                        for (const auto& tag : tags) {
-                            max.update(std::strlen(tag.key()));
-                        }
-                        for (const auto& tag : tags) {
-                            *m_out += "    ";
-                            write_string(tag.key());
-                            auto spacing = max() - std::strlen(tag.key());
-                            while (spacing--) {
-                                *m_out += " ";
-                            }
-                            *m_out += " = ";
-                            write_string(tag.value());
-                            *m_out += '\n';
-                        }
-                    }
-                }
-
-                void write_location(const osmium::Location& location) {
-                    write_fieldname("lon/lat");
-                    output_formatted("  %.7f,%.7f", location.lon_without_check(), location.lat_without_check());
-                    if (!location.valid()) {
-                        write_error(" INVALID LOCATION!");
-                    }
-                    *m_out += '\n';
-                }
-
-                void write_box(const osmium::Box& box) {
-                    write_fieldname("box l/b/r/t");
-                    if (!box) {
-                        write_error("BOX NOT SET!\n");
-                        return;
-                    }
-                    const auto& bl = box.bottom_left();
-                    const auto& tr = box.top_right();
-                    output_formatted("%.7f,%.7f %.7f,%.7f", bl.lon_without_check(), bl.lat_without_check(), tr.lon_without_check(), tr.lat_without_check());
-                    if (!box.valid()) {
-                        write_error(" INVALID BOX!");
-                    }
-                    *m_out += '\n';
-                }
-
-            public:
-
-                DebugOutputBlock(osmium::memory::Buffer&& buffer, const debug_output_options& options) :
-                    OutputBlock(std::move(buffer)),
-                    m_options(options),
-                    m_utf8_prefix(options.use_color ? color_red  : ""),
-                    m_utf8_suffix(options.use_color ? color_blue : "") {
-                }
-
-                DebugOutputBlock(const DebugOutputBlock&) = default;
-                DebugOutputBlock& operator=(const DebugOutputBlock&) = default;
-
-                DebugOutputBlock(DebugOutputBlock&&) = default;
-                DebugOutputBlock& operator=(DebugOutputBlock&&) = default;
-
-                ~DebugOutputBlock() noexcept = default;
-
-                std::string operator()() {
-                    osmium::apply(m_input_buffer->cbegin(), m_input_buffer->cend(), *this);
-
-                    std::string out;
-                    using std::swap;
-                    swap(out, *m_out);
-
-                    return out;
-                }
-
-                void node(const osmium::Node& node) {
-                    write_object_type("node", node.visible());
-                    write_meta(node);
-
-                    if (node.visible()) {
-                        write_location(node.location());
-                    }
-
-                    write_tags(node.tags());
-
-                    *m_out += '\n';
-                }
-
-                void way(const osmium::Way& way) {
-                    write_object_type("way", way.visible());
-                    write_meta(way);
-                    write_tags(way.tags());
-
-                    write_fieldname("nodes");
-
-                    output_formatted("    %d", way.nodes().size());
-                    if (way.nodes().size() < 2) {
-                        write_error(" LESS THAN 2 NODES!\n");
-                    } else if (way.nodes().size() > 2000) {
-                        write_error(" MORE THAN 2000 NODES!\n");
-                    } else if (way.nodes().is_closed()) {
-                        *m_out += " (closed)\n";
-                    } else {
-                        *m_out += " (open)\n";
-                    }
-
-                    int width = int(log10(way.nodes().size())) + 1;
-                    int n = 0;
-                    for (const auto& node_ref : way.nodes()) {
-                        write_counter(width, n++);
-                        output_formatted("%10" PRId64, node_ref.ref());
-                        if (node_ref.location().valid()) {
-                            output_formatted(" (%.7f,%.7f)", node_ref.location().lon_without_check(), node_ref.location().lat_without_check());
-                        }
-                        *m_out += '\n';
-                    }
-
-                    *m_out += '\n';
-                }
-
-                void relation(const osmium::Relation& relation) {
-                    static const char* short_typename[] = { "node", "way ", "rel " };
-                    write_object_type("relation", relation.visible());
-                    write_meta(relation);
-                    write_tags(relation.tags());
-
-                    write_fieldname("members");
-                    output_formatted("  %d\n", relation.members().size());
-
-                    int width = int(log10(relation.members().size())) + 1;
-                    int n = 0;
-                    for (const auto& member : relation.members()) {
-                        write_counter(width, n++);
-                        *m_out += short_typename[item_type_to_nwr_index(member.type())];
-                        output_formatted(" %10" PRId64 " ", member.ref());
-                        write_string(member.role());
-                        *m_out += '\n';
-                    }
-
-                    *m_out += '\n';
-                }
-
-                void changeset(const osmium::Changeset& changeset) {
-                    write_object_type("changeset");
-                    output_formatted("%d\n", changeset.id());
-
-                    write_fieldname("num changes");
-                    output_formatted("%d", changeset.num_changes());
-                    if (changeset.num_changes() == 0) {
-                        write_error(" NO CHANGES!");
-                    }
-                    *m_out += '\n';
-
-                    write_fieldname("created at");
-                    *m_out += ' ';
-                    write_timestamp(changeset.created_at());
-
-                    write_fieldname("closed at");
-                    *m_out += "  ";
-                    if (changeset.closed()) {
-                        write_timestamp(changeset.closed_at());
-                    } else {
-                        write_error("OPEN!\n");
-                    }
-
-                    write_fieldname("user");
-                    output_formatted("       %d ", changeset.uid());
-                    write_string(changeset.user());
-                    *m_out += '\n';
-
-                    write_box(changeset.bounds());
-                    write_tags(changeset.tags(), "  ");
-
-                    if (changeset.num_comments() > 0) {
-                        write_fieldname("comments");
-                        output_formatted("   %d\n", changeset.num_comments());
-
-                        int width = int(log10(changeset.num_comments())) + 1;
-                        int n = 0;
-                        for (const auto& comment : changeset.discussion()) {
-                            write_counter(width, n++);
-
-                            write_comment_field("date");
-                            write_timestamp(comment.date());
-                            output_formatted("      %*s", width, "");
-
-                            write_comment_field("user");
-                            output_formatted("%d ", comment.uid());
-                            write_string(comment.user());
-                            output_formatted("\n      %*s", width, "");
-
-                            write_comment_field("text");
-                            write_string(comment.text());
-                            *m_out += '\n';
-                        }
-                    }
-
-                    *m_out += '\n';
-                }
-
-            }; // class DebugOutputBlock
-
-            class DebugOutputFormat : public osmium::io::detail::OutputFormat {
-
-                debug_output_options m_options;
-
-                void write_fieldname(std::string& out, const char* name) {
-                    out += "  ";
-                    if (m_options.use_color) {
-                        out += color_cyan;
-                    }
-                    out += name;
-                    if (m_options.use_color) {
-                        out += color_reset;
-                    }
-                    out += ": ";
-                }
-
-            public:
-
-                DebugOutputFormat(const osmium::io::File& file, future_string_queue_type& output_queue) :
-                    OutputFormat(output_queue),
-                    m_options() {
-                    m_options.add_metadata = file.is_not_false("add_metadata");
-                    m_options.use_color    = file.is_true("color");
-                }
-
-                DebugOutputFormat(const DebugOutputFormat&) = delete;
-                DebugOutputFormat& operator=(const DebugOutputFormat&) = delete;
-
-                ~DebugOutputFormat() noexcept = default;
-
-                void write_header(const osmium::io::Header& header) override final {
-                    std::string out;
-
-                    if (m_options.use_color) {
-                        out += color_bold;
-                    }
-                    out += "header\n";
-                    if (m_options.use_color) {
-                        out += color_reset;
-                    }
-
-                    write_fieldname(out, "multiple object versions");
-                    out += header.has_multiple_object_versions() ? "yes" : "no";
-                    out += '\n';
-                    write_fieldname(out, "bounding boxes");
-                    out += '\n';
-                    for (const auto& box : header.boxes()) {
-                        out += "    ";
-                        box.bottom_left().as_string(std::back_inserter(out), ',');
-                        out += " ";
-                        box.top_right().as_string(std::back_inserter(out), ',');
-                        out += '\n';
-                    }
-                    write_fieldname(out, "options");
-                    out += '\n';
-                    for (const auto& opt : header) {
-                        out += "    ";
-                        out += opt.first;
-                        out += " = ";
-                        out += opt.second;
-                        out += '\n';
-                    }
-                    out += "\n=============================================\n\n";
-
-                    send_to_output_queue(std::move(out));
-                }
-
-                void write_buffer(osmium::memory::Buffer&& buffer) override final {
-                    m_output_queue.push(osmium::thread::Pool::instance().submit(DebugOutputBlock{std::move(buffer), m_options}));
-                }
-
-            }; // class DebugOutputFormat
-
-            // we want the register_output_format() function to run, setting
-            // the variable is only a side-effect, it will never be used
-            const bool registered_debug_output = osmium::io::detail::OutputFormatFactory::instance().register_output_format(osmium::io::file_format::debug,
-                [](const osmium::io::File& file, future_string_queue_type& output_queue) {
-                    return new osmium::io::detail::DebugOutputFormat(file, output_queue);
-            });
-
-            // dummy function to silence the unused variable warning from above
-            inline bool get_registered_debug_output() noexcept {
-                return registered_debug_output;
-            }
-
-        } // namespace detail
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_DEBUG_OUTPUT_FORMAT_HPP
diff --git a/contrib/libosmium/osmium/io/detail/input_format.hpp b/contrib/libosmium/osmium/io/detail/input_format.hpp
deleted file mode 100644
index d26b1ee..0000000
--- a/contrib/libosmium/osmium/io/detail/input_format.hpp
+++ /dev/null
@@ -1,211 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_INPUT_FORMAT_HPP
-#define OSMIUM_IO_DETAIL_INPUT_FORMAT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <exception>
-#include <functional>
-#include <future>
-#include <map>
-#include <memory>
-#include <stdexcept>
-#include <string>
-#include <utility>
-
-#include <osmium/io/detail/queue_util.hpp>
-#include <osmium/io/file.hpp>
-#include <osmium/io/file_format.hpp>
-#include <osmium/io/header.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm/entity_bits.hpp>
-
-namespace osmium {
-
-    namespace io {
-
-        namespace detail {
-
-            class Parser {
-
-                future_buffer_queue_type& m_output_queue;
-                std::promise<osmium::io::Header>& m_header_promise;
-                queue_wrapper<std::string> m_input_queue;
-                osmium::osm_entity_bits::type m_read_types;
-                bool m_header_is_done;
-
-            protected:
-
-                std::string get_input() {
-                    return m_input_queue.pop();
-                }
-
-                bool input_done() const {
-                    return m_input_queue.has_reached_end_of_data();
-                }
-
-                osmium::osm_entity_bits::type read_types() const {
-                    return m_read_types;
-                }
-
-                bool header_is_done() const {
-                    return m_header_is_done;
-                }
-
-                void set_header_value(const osmium::io::Header& header) {
-                    if (!m_header_is_done) {
-                        m_header_is_done = true;
-                        m_header_promise.set_value(header);
-                    }
-                }
-
-                void set_header_exception(const std::exception_ptr& exception) {
-                    if (!m_header_is_done) {
-                        m_header_is_done = true;
-                        m_header_promise.set_exception(exception);
-                    }
-                }
-
-                /**
-                 * Wrap the buffer into a future and add it to the output queue.
-                 */
-                void send_to_output_queue(osmium::memory::Buffer&& buffer) {
-                    add_to_queue(m_output_queue, std::move(buffer));
-                }
-
-                void send_to_output_queue(std::future<osmium::memory::Buffer>&& future) {
-                    m_output_queue.push(std::move(future));
-                }
-
-            public:
-
-                Parser(future_string_queue_type& input_queue,
-                       future_buffer_queue_type& output_queue,
-                       std::promise<osmium::io::Header>& header_promise,
-                       osmium::osm_entity_bits::type read_types) :
-                    m_output_queue(output_queue),
-                    m_header_promise(header_promise),
-                    m_input_queue(input_queue),
-                    m_read_types(read_types),
-                    m_header_is_done(false) {
-                }
-
-                Parser(const Parser&) = delete;
-                Parser& operator=(const Parser&) = delete;
-
-                Parser(Parser&&) = delete;
-                Parser& operator=(Parser&&) = delete;
-
-                virtual ~Parser() noexcept = default;
-
-                virtual void run() = 0;
-
-                void parse() {
-                    try {
-                        run();
-                    } catch (...) {
-                        std::exception_ptr exception = std::current_exception();
-                        set_header_exception(exception);
-                        add_to_queue(m_output_queue, std::move(exception));
-                    }
-
-                    add_end_of_data_to_queue(m_output_queue);
-                }
-
-            }; // class Parser
-
-            /**
-             * This factory class is used to create objects that decode OSM
-             * data written in a specified format.
-             *
-             * Do not use this class directly. Use the osmium::io::Reader
-             * class instead.
-             */
-            class ParserFactory {
-
-            public:
-
-                typedef std::function<
-                            std::unique_ptr<Parser>(
-                                future_string_queue_type&,
-                                future_buffer_queue_type&,
-                                std::promise<osmium::io::Header>& header_promise,
-                                osmium::osm_entity_bits::type read_which_entities
-                            )
-                        > create_parser_type;
-
-            private:
-
-                typedef std::map<osmium::io::file_format, create_parser_type> map_type;
-
-                map_type m_callbacks;
-
-                ParserFactory() :
-                    m_callbacks() {
-                }
-
-            public:
-
-                static ParserFactory& instance() {
-                    static ParserFactory factory;
-                    return factory;
-                }
-
-                bool register_parser(osmium::io::file_format format, create_parser_type create_function) {
-                    if (! m_callbacks.insert(map_type::value_type(format, create_function)).second) {
-                        return false;
-                    }
-                    return true;
-                }
-
-                create_parser_type get_creator_function(const osmium::io::File& file) {
-                    auto it = m_callbacks.find(file.format());
-                    if (it == m_callbacks.end()) {
-                        throw unsupported_file_format_error(
-                                std::string("Can not open file '") +
-                                file.filename() +
-                                "' with type '" +
-                                as_string(file.format()) +
-                                "'. No support for reading this format in this program.");
-                    }
-                    return it->second;
-                }
-
-            }; // class ParserFactory
-
-        } // namespace detail
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_INPUT_FORMAT_HPP
diff --git a/contrib/libosmium/osmium/io/detail/o5m_input_format.hpp b/contrib/libosmium/osmium/io/detail/o5m_input_format.hpp
deleted file mode 100644
index b5b5c71..0000000
--- a/contrib/libosmium/osmium/io/detail/o5m_input_format.hpp
+++ /dev/null
@@ -1,633 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_O5M_INPUT_FORMAT_HPP
-#define OSMIUM_IO_DETAIL_O5M_INPUT_FORMAT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <cstddef>
-#include <cstdint>
-#include <cstring>
-#include <future>
-#include <memory>
-#include <string>
-#include <utility>
-
-#include <protozero/varint.hpp>
-
-#include <osmium/builder/builder.hpp>
-#include <osmium/builder/osm_object_builder.hpp>
-#include <osmium/io/detail/input_format.hpp>
-#include <osmium/io/detail/queue_util.hpp>
-#include <osmium/io/error.hpp>
-#include <osmium/io/file_format.hpp>
-#include <osmium/io/header.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm.hpp>
-#include <osmium/osm/box.hpp>
-#include <osmium/osm/entity_bits.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/util/cast.hpp>
-#include <osmium/util/delta.hpp>
-
-namespace osmium {
-
-    /**
-     * Exception thrown when the o5m deocder failed. The exception contains
-     * (if available) information about the place where the error happened
-     * and the type of error.
-     */
-    struct o5m_error : public io_error {
-
-        o5m_error(const char* what) :
-            io_error(std::string("o5m format error: ") + what) {
-        }
-
-    }; // struct o5m_error
-
-    namespace io {
-
-        namespace detail {
-
-            // Implementation of the o5m/o5c file formats according to the
-            // description at http://wiki.openstreetmap.org/wiki/O5m .
-
-            class ReferenceTable {
-
-                // The following settings are from the o5m description:
-
-                // The maximum number of entries in this table.
-                const uint64_t number_of_entries = 15000;
-
-                // The size of one entry in the table.
-                const unsigned int entry_size = 256;
-
-                // The maximum length of a string in the table including
-                // two \0 bytes.
-                const unsigned int max_length = 250 + 2;
-
-                // The data is stored in this string. It is default constructed
-                // and then resized on demand the first time something is added.
-                // This is done because the ReferenceTable is in a O5mParser
-                // object which will be copied from one thread to another. This
-                // way the string is still small when it is copied.
-                std::string m_table;
-
-                unsigned int current_entry = 0;
-
-            public:
-
-                void clear() {
-                    current_entry = 0;
-                }
-
-                void add(const char* string, size_t size) {
-                    if (m_table.empty()) {
-                        m_table.resize(entry_size * number_of_entries);
-                    }
-                    if (size <= max_length) {
-                        std::copy_n(string, size, &m_table[current_entry * entry_size]);
-                        if (++current_entry == number_of_entries) {
-                            current_entry = 0;
-                        }
-                    }
-                }
-
-                const char* get(uint64_t index) const {
-                    if (m_table.empty() || index == 0 || index > number_of_entries) {
-                        throw o5m_error("reference to non-existing string in table");
-                    }
-                    auto entry = (current_entry + number_of_entries - index) % number_of_entries;
-                    return &m_table[entry * entry_size];
-                }
-
-            }; // class ReferenceTable
-
-            class O5mParser : public Parser {
-
-                static constexpr int buffer_size = 2 * 1000 * 1000;
-
-                osmium::io::Header m_header;
-
-                osmium::memory::Buffer m_buffer;
-
-                std::string m_input;
-
-                const char* m_data;
-                const char* m_end;
-
-                ReferenceTable m_reference_table;
-
-                static int64_t zvarint(const char** data, const char* end) {
-                    return protozero::decode_zigzag64(protozero::decode_varint(data, end));
-                }
-
-                bool ensure_bytes_available(size_t need_bytes) {
-                    if ((m_end - m_data) >= long(need_bytes)) {
-                        return true;
-                    }
-
-                    if (input_done() && (m_input.size() < need_bytes)) {
-                        return false;
-                    }
-
-                    m_input.erase(0, m_data - m_input.data());
-
-                    while (m_input.size() < need_bytes) {
-                        std::string data = get_input();
-                        if (input_done()) {
-                            return false;
-                        }
-                        m_input.append(data);
-                    }
-
-                    m_data = m_input.data();
-                    m_end = m_input.data() + m_input.size();
-
-                    return true;
-                }
-
-                void check_header_magic() {
-                    static const unsigned char header_magic[] = { 0xff, 0xe0, 0x04, 'o', '5' };
-
-                    if (std::strncmp(reinterpret_cast<const char*>(header_magic), m_data, sizeof(header_magic))) {
-                        throw o5m_error("wrong header magic");
-                    }
-
-                    m_data += sizeof(header_magic);
-                }
-
-                void check_file_type() {
-                    if (*m_data == 'm') {         // o5m data file
-                        m_header.set_has_multiple_object_versions(false);
-                    } else if (*m_data == 'c') {  // o5c change file
-                        m_header.set_has_multiple_object_versions(true);
-                    } else {
-                        throw o5m_error("wrong header magic");
-                    }
-
-                    m_data++;
-                }
-
-                void check_file_format_version() {
-                    if (*m_data != '2') {
-                        throw o5m_error("wrong header magic");
-                    }
-
-                    m_data++;
-                }
-
-                void decode_header() {
-                    if (! ensure_bytes_available(7)) { // overall length of header
-                        throw o5m_error("file too short (incomplete header info)");
-                    }
-
-                    check_header_magic();
-                    check_file_type();
-                    check_file_format_version();
-                }
-
-                void mark_header_as_done() {
-                    set_header_value(m_header);
-                }
-
-                osmium::util::DeltaDecode<osmium::object_id_type> m_delta_id;
-
-                osmium::util::DeltaDecode<int64_t> m_delta_timestamp;
-                osmium::util::DeltaDecode<osmium::changeset_id_type> m_delta_changeset;
-                osmium::util::DeltaDecode<int64_t> m_delta_lon;
-                osmium::util::DeltaDecode<int64_t> m_delta_lat;
-
-                osmium::util::DeltaDecode<osmium::object_id_type> m_delta_way_node_id;
-                osmium::util::DeltaDecode<osmium::object_id_type> m_delta_member_ids[3];
-
-                void reset() {
-                    m_reference_table.clear();
-
-                    m_delta_id.clear();
-                    m_delta_timestamp.clear();
-                    m_delta_changeset.clear();
-                    m_delta_lon.clear();
-                    m_delta_lat.clear();
-
-                    m_delta_way_node_id.clear();
-                    m_delta_member_ids[0].clear();
-                    m_delta_member_ids[1].clear();
-                    m_delta_member_ids[2].clear();
-                }
-
-                const char* decode_string(const char** dataptr, const char* const end) {
-                    if (**dataptr == 0x00) { // get inline string
-                        (*dataptr)++;
-                        if (*dataptr == end) {
-                            throw o5m_error("string format error");
-                        }
-                        return *dataptr;
-                    } else { // get from reference table
-                        auto index = protozero::decode_varint(dataptr, end);
-                        return m_reference_table.get(index);
-                    }
-                }
-
-                std::pair<osmium::user_id_type, const char*> decode_user(const char** dataptr, const char* const end) {
-                    bool update_pointer = (**dataptr == 0x00);
-                    const char* data = decode_string(dataptr, end);
-                    const char* start = data;
-
-                    auto uid = protozero::decode_varint(&data, end);
-
-                    if (data == end) {
-                        throw o5m_error("missing user name");
-                    }
-
-                    const char* user = ++data;
-
-                    if (uid == 0 && update_pointer) {
-                        m_reference_table.add("\0\0", 2);
-                        *dataptr = data;
-                        return std::make_pair(0, "");
-                    }
-
-                    while (*data++) {
-                        if (data == end) {
-                            throw o5m_error("no null byte in user name");
-                        }
-                    }
-
-                    if (update_pointer) {
-                        m_reference_table.add(start, data - start);
-                        *dataptr = data;
-                    }
-
-                    return std::make_pair(static_cast_with_assert<osmium::user_id_type>(uid), user);
-                }
-
-                void decode_tags(osmium::builder::Builder* builder, const char** dataptr, const char* const end) {
-                    osmium::builder::TagListBuilder tl_builder(m_buffer, builder);
-
-                    while(*dataptr != end) {
-                        bool update_pointer = (**dataptr == 0x00);
-                        const char* data = decode_string(dataptr, end);
-                        const char* start = data;
-
-                        while (*data++) {
-                            if (data == end) {
-                                throw o5m_error("no null byte in tag key");
-                            }
-                        }
-
-                        const char* value = data;
-                        while (*data++) {
-                            if (data == end) {
-                                throw o5m_error("no null byte in tag value");
-                            }
-                        }
-
-                        if (update_pointer) {
-                            m_reference_table.add(start, data - start);
-                            *dataptr = data;
-                        }
-
-                        tl_builder.add_tag(start, value);
-                    }
-                }
-
-                const char* decode_info(osmium::OSMObject& object, const char** dataptr, const char* const end) {
-                    const char* user = "";
-
-                    if (**dataptr == 0x00) { // no info section
-                        ++*dataptr;
-                    } else { // has info section
-                        object.set_version(static_cast_with_assert<object_version_type>(protozero::decode_varint(dataptr, end)));
-                        auto timestamp = m_delta_timestamp.update(zvarint(dataptr, end));
-                        if (timestamp != 0) { // has timestamp
-                            object.set_timestamp(timestamp);
-                            object.set_changeset(m_delta_changeset.update(zvarint(dataptr, end)));
-                            if (*dataptr != end) {
-                                auto uid_user = decode_user(dataptr, end);
-                                object.set_uid(uid_user.first);
-                                user = uid_user.second;
-                            } else {
-                                object.set_uid(user_id_type(0));
-                            }
-                        }
-                    }
-
-                    return user;
-                }
-
-                void decode_node(const char* data, const char* const end) {
-                    osmium::builder::NodeBuilder builder(m_buffer);
-                    osmium::Node& node = builder.object();
-
-                    node.set_id(m_delta_id.update(zvarint(&data, end)));
-
-                    builder.add_user(decode_info(node, &data, end));
-
-                    if (data == end) {
-                        // no location, object is deleted
-                        builder.object().set_visible(false);
-                        builder.object().set_location(osmium::Location{});
-                    } else {
-                        auto lon = m_delta_lon.update(zvarint(&data, end));
-                        auto lat = m_delta_lat.update(zvarint(&data, end));
-                        builder.object().set_location(osmium::Location{lon, lat});
-
-                        if (data != end) {
-                            decode_tags(&builder, &data, end);
-                        }
-                    }
-
-                    m_buffer.commit();
-                }
-
-                void decode_way(const char* data, const char* const end) {
-                    osmium::builder::WayBuilder builder(m_buffer);
-                    osmium::Way& way = builder.object();
-
-                    way.set_id(m_delta_id.update(zvarint(&data, end)));
-
-                    builder.add_user(decode_info(way, &data, end));
-
-                    if (data == end) {
-                        // no reference section, object is deleted
-                        builder.object().set_visible(false);
-                    } else {
-                        auto reference_section_length = protozero::decode_varint(&data, end);
-                        if (reference_section_length > 0) {
-                            const char* const end_refs = data + reference_section_length;
-                            if (end_refs > end) {
-                                throw o5m_error("way nodes ref section too long");
-                            }
-
-                            osmium::builder::WayNodeListBuilder wn_builder(m_buffer, &builder);
-
-                            while (data < end_refs) {
-                                wn_builder.add_node_ref(m_delta_way_node_id.update(zvarint(&data, end)));
-                            }
-                        }
-
-                        if (data != end) {
-                            decode_tags(&builder, &data, end);
-                        }
-                    }
-
-                    m_buffer.commit();
-                }
-
-                osmium::item_type decode_member_type(char c) {
-                    if (c < '0' || c > '2') {
-                        throw o5m_error("unknown member type");
-                    }
-                    return osmium::nwr_index_to_item_type(c - '0');
-                }
-
-                std::pair<osmium::item_type, const char*> decode_role(const char** dataptr, const char* const end) {
-                    bool update_pointer = (**dataptr == 0x00);
-                    const char* data = decode_string(dataptr, end);
-                    const char* start = data;
-
-                    auto member_type = decode_member_type(*data++);
-                    if (data == end) {
-                        throw o5m_error("missing role");
-                    }
-                    const char* role = data;
-
-                    while (*data++) {
-                        if (data == end) {
-                            throw o5m_error("no null byte in role");
-                        }
-                    }
-
-                    if (update_pointer) {
-                        m_reference_table.add(start, data - start);
-                        *dataptr = data;
-                    }
-
-                    return std::make_pair(member_type, role);
-                }
-
-                void decode_relation(const char* data, const char* const end) {
-                    osmium::builder::RelationBuilder builder(m_buffer);
-                    osmium::Relation& relation = builder.object();
-
-                    relation.set_id(m_delta_id.update(zvarint(&data, end)));
-
-                    builder.add_user(decode_info(relation, &data, end));
-
-                    if (data == end) {
-                        // no reference section, object is deleted
-                        builder.object().set_visible(false);
-                    } else {
-                        auto reference_section_length = protozero::decode_varint(&data, end);
-                        if (reference_section_length > 0) {
-                            const char* const end_refs = data + reference_section_length;
-                            if (end_refs > end) {
-                                throw o5m_error("relation format error");
-                            }
-
-                            osmium::builder::RelationMemberListBuilder rml_builder(m_buffer, &builder);
-
-                            while (data < end_refs) {
-                                auto delta_id = zvarint(&data, end);
-                                if (data == end) {
-                                    throw o5m_error("relation member format error");
-                                }
-                                auto type_role = decode_role(&data, end);
-                                auto i = osmium::item_type_to_nwr_index(type_role.first);
-                                auto ref = m_delta_member_ids[i].update(delta_id);
-                                rml_builder.add_member(type_role.first, ref, type_role.second);
-                            }
-                        }
-
-                        if (data != end) {
-                            decode_tags(&builder, &data, end);
-                        }
-                    }
-
-                    m_buffer.commit();
-                }
-
-                void decode_bbox(const char* data, const char* const end) {
-                    auto sw_lon = zvarint(&data, end);
-                    auto sw_lat = zvarint(&data, end);
-                    auto ne_lon = zvarint(&data, end);
-                    auto ne_lat = zvarint(&data, end);
-
-                    m_header.add_box(osmium::Box{osmium::Location{sw_lon, sw_lat},
-                                                 osmium::Location{ne_lon, ne_lat}});
-                }
-
-                void decode_timestamp(const char* data, const char* const end) {
-                    auto timestamp = osmium::Timestamp(zvarint(&data, end)).to_iso();
-                    m_header.set("o5m_timestamp", timestamp);
-                    m_header.set("timestamp", timestamp);
-                }
-
-                void flush() {
-                    osmium::memory::Buffer buffer(buffer_size);
-                    using std::swap;
-                    swap(m_buffer, buffer);
-                    send_to_output_queue(std::move(buffer));
-                }
-
-                enum class dataset_type : unsigned char {
-                    node         = 0x10,
-                    way          = 0x11,
-                    relation     = 0x12,
-                    bounding_box = 0xdb,
-                    timestamp    = 0xdc,
-                    header       = 0xe0,
-                    sync         = 0xee,
-                    jump         = 0xef,
-                    reset        = 0xff
-                };
-
-                void decode_data() {
-                    while (ensure_bytes_available(1)) {
-                        dataset_type ds_type = dataset_type(*m_data++);
-                        if (ds_type > dataset_type::jump) {
-                            if (ds_type == dataset_type::reset) {
-                                reset();
-                            }
-                        } else {
-                            ensure_bytes_available(protozero::max_varint_length);
-
-                            uint64_t length = 0;
-                            try {
-                                length = protozero::decode_varint(&m_data, m_end);
-                            } catch (protozero::end_of_buffer_exception&) {
-                                throw o5m_error("premature end of file");
-                            }
-
-                            if (! ensure_bytes_available(length)) {
-                                throw o5m_error("premature end of file");
-                            }
-
-                            switch (ds_type) {
-                                case dataset_type::node:
-                                    mark_header_as_done();
-                                    if (read_types() & osmium::osm_entity_bits::node) {
-                                        decode_node(m_data, m_data + length);
-                                    }
-                                    break;
-                                case dataset_type::way:
-                                    mark_header_as_done();
-                                    if (read_types() & osmium::osm_entity_bits::way) {
-                                        decode_way(m_data, m_data + length);
-                                    }
-                                    break;
-                                case dataset_type::relation:
-                                    mark_header_as_done();
-                                    if (read_types() & osmium::osm_entity_bits::relation) {
-                                        decode_relation(m_data, m_data + length);
-                                    }
-                                    break;
-                                case dataset_type::bounding_box:
-                                    decode_bbox(m_data, m_data + length);
-                                    break;
-                                case dataset_type::timestamp:
-                                    decode_timestamp(m_data, m_data + length);
-                                    break;
-                                default:
-                                    // ignore unknown datasets
-                                    break;
-                            }
-
-                            if (read_types() == osmium::osm_entity_bits::nothing && header_is_done()) {
-                                break;
-                            }
-
-                            m_data += length;
-
-                            if (m_buffer.committed() > buffer_size / 10 * 9) {
-                                flush();
-                            }
-                        }
-                    }
-
-                    if (m_buffer.committed()) {
-                        flush();
-                    }
-
-                    mark_header_as_done();
-                }
-
-            public:
-
-                O5mParser(future_string_queue_type& input_queue,
-                          future_buffer_queue_type& output_queue,
-                          std::promise<osmium::io::Header>& header_promise,
-                          osmium::osm_entity_bits::type read_types) :
-                    Parser(input_queue, output_queue, header_promise, read_types),
-                    m_header(),
-                    m_buffer(buffer_size),
-                    m_input(),
-                    m_data(m_input.data()),
-                    m_end(m_data) {
-                }
-
-                ~O5mParser() noexcept = default;
-
-                void run() override final {
-                    decode_header();
-                    decode_data();
-                }
-
-            }; // class O5mParser
-
-            // we want the register_parser() function to run, setting
-            // the variable is only a side-effect, it will never be used
-            const bool registered_o5m_parser = ParserFactory::instance().register_parser(
-                file_format::o5m,
-                [](future_string_queue_type& input_queue,
-                    future_buffer_queue_type& output_queue,
-                    std::promise<osmium::io::Header>& header_promise,
-                    osmium::osm_entity_bits::type read_which_entities) {
-                    return std::unique_ptr<Parser>(new O5mParser(input_queue, output_queue, header_promise, read_which_entities));
-            });
-
-            // dummy function to silence the unused variable warning from above
-            inline bool get_registered_o5m_parser() noexcept {
-                return registered_o5m_parser;
-            }
-
-        } // namespace detail
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_O5M_INPUT_FORMAT_HPP
diff --git a/contrib/libosmium/osmium/io/detail/opl_output_format.hpp b/contrib/libosmium/osmium/io/detail/opl_output_format.hpp
deleted file mode 100644
index 5c40bf2..0000000
--- a/contrib/libosmium/osmium/io/detail/opl_output_format.hpp
+++ /dev/null
@@ -1,261 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_OPL_OUTPUT_FORMAT_HPP
-#define OSMIUM_IO_DETAIL_OPL_OUTPUT_FORMAT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cinttypes>
-#include <cstddef>
-#include <cstdint>
-#include <cstdio>
-#include <future>
-#include <iterator>
-#include <memory>
-#include <string>
-#include <thread>
-#include <utility>
-
-#include <osmium/io/detail/output_format.hpp>
-#include <osmium/io/file_format.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/memory/collection.hpp>
-#include <osmium/osm/box.hpp>
-#include <osmium/osm/changeset.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/relation.hpp>
-#include <osmium/osm/tag.hpp>
-#include <osmium/osm/timestamp.hpp>
-#include <osmium/osm/way.hpp>
-#include <osmium/thread/pool.hpp>
-#include <osmium/visitor.hpp>
-
-namespace osmium {
-
-    namespace io {
-
-        class File;
-
-        namespace detail {
-
-            struct opl_output_options {
-
-                /// Should metadata of objects be added?
-                bool add_metadata;
-
-            };
-
-            /**
-             * Writes out one buffer with OSM data in OPL format.
-             */
-            class OPLOutputBlock : public OutputBlock {
-
-                opl_output_options m_options;
-
-                void append_encoded_string(const char* data) {
-                    osmium::io::detail::append_utf8_encoded_string(*m_out, data);
-                }
-
-                void write_meta(const osmium::OSMObject& object) {
-                    output_formatted("%" PRId64, object.id());
-                    if (m_options.add_metadata) {
-                        output_formatted(" v%d d", object.version());
-                        *m_out += (object.visible() ? 'V' : 'D');
-                        output_formatted(" c%d t", object.changeset());
-                        *m_out += object.timestamp().to_iso();
-                        output_formatted(" i%d u", object.uid());
-                        append_encoded_string(object.user());
-                    }
-                    *m_out += " T";
-                    bool first = true;
-                    for (const auto& tag : object.tags()) {
-                        if (first) {
-                            first = false;
-                        } else {
-                            *m_out += ',';
-                        }
-                        append_encoded_string(tag.key());
-                        *m_out += '=';
-                        append_encoded_string(tag.value());
-                    }
-                }
-
-                void write_location(const osmium::Location& location, const char x, const char y) {
-                    if (location) {
-                        output_formatted(" %c%.7f %c%.7f", x, location.lon_without_check(), y, location.lat_without_check());
-                    } else {
-                        *m_out += ' ';
-                        *m_out += x;
-                        *m_out += ' ';
-                        *m_out += y;
-                    }
-                }
-
-            public:
-
-                OPLOutputBlock(osmium::memory::Buffer&& buffer, const opl_output_options& options) :
-                    OutputBlock(std::move(buffer)),
-                    m_options(options) {
-                }
-
-                OPLOutputBlock(const OPLOutputBlock&) = default;
-                OPLOutputBlock& operator=(const OPLOutputBlock&) = default;
-
-                OPLOutputBlock(OPLOutputBlock&&) = default;
-                OPLOutputBlock& operator=(OPLOutputBlock&&) = default;
-
-                ~OPLOutputBlock() noexcept = default;
-
-                std::string operator()() {
-                    osmium::apply(m_input_buffer->cbegin(), m_input_buffer->cend(), *this);
-
-                    std::string out;
-                    using std::swap;
-                    swap(out, *m_out);
-
-                    return out;
-                }
-
-                void node(const osmium::Node& node) {
-                    *m_out += 'n';
-                    write_meta(node);
-                    write_location(node.location(), 'x', 'y');
-                    *m_out += '\n';
-                }
-
-                void way(const osmium::Way& way) {
-                    *m_out += 'w';
-                    write_meta(way);
-
-                    *m_out += " N";
-                    bool first = true;
-                    for (const auto& node_ref : way.nodes()) {
-                        if (first) {
-                            first = false;
-                        } else {
-                            *m_out += ',';
-                        }
-                        output_formatted("n%" PRId64, node_ref.ref());
-                    }
-                    *m_out += '\n';
-                }
-
-                void relation(const osmium::Relation& relation) {
-                    *m_out += 'r';
-                    write_meta(relation);
-
-                    *m_out += " M";
-                    bool first = true;
-                    for (const auto& member : relation.members()) {
-                        if (first) {
-                            first = false;
-                        } else {
-                            *m_out += ',';
-                        }
-                        *m_out += item_type_to_char(member.type());
-                        output_formatted("%" PRId64 "@", member.ref());
-                        append_encoded_string(member.role());
-                    }
-                    *m_out += '\n';
-                }
-
-                void changeset(const osmium::Changeset& changeset) {
-                    output_formatted("c%d k%d s", changeset.id(), changeset.num_changes());
-                    *m_out += changeset.created_at().to_iso();
-                    *m_out += " e";
-                    *m_out += changeset.closed_at().to_iso();
-                    output_formatted(" d%d i%d u", changeset.num_comments(), changeset.uid());
-                    append_encoded_string(changeset.user());
-                    write_location(changeset.bounds().bottom_left(), 'x', 'y');
-                    write_location(changeset.bounds().top_right(), 'X', 'Y');
-                    *m_out += " T";
-                    bool first = true;
-                    for (const auto& tag : changeset.tags()) {
-                        if (first) {
-                            first = false;
-                        } else {
-                            *m_out += ',';
-                        }
-                        append_encoded_string(tag.key());
-                        *m_out += '=';
-                        append_encoded_string(tag.value());
-                    }
-
-                    *m_out += '\n';
-                }
-
-            }; // class OPLOutputBlock
-
-            class OPLOutputFormat : public osmium::io::detail::OutputFormat {
-
-                opl_output_options m_options;
-
-            public:
-
-                OPLOutputFormat(const osmium::io::File& file, future_string_queue_type& output_queue) :
-                    OutputFormat(output_queue),
-                    m_options() {
-                    m_options.add_metadata = file.is_not_false("add_metadata");
-                }
-
-                OPLOutputFormat(const OPLOutputFormat&) = delete;
-                OPLOutputFormat& operator=(const OPLOutputFormat&) = delete;
-
-                ~OPLOutputFormat() noexcept = default;
-
-                void write_buffer(osmium::memory::Buffer&& buffer) override final {
-                    m_output_queue.push(osmium::thread::Pool::instance().submit(OPLOutputBlock{std::move(buffer), m_options}));
-                }
-
-            }; // class OPLOutputFormat
-
-            // we want the register_output_format() function to run, setting
-            // the variable is only a side-effect, it will never be used
-            const bool registered_opl_output = osmium::io::detail::OutputFormatFactory::instance().register_output_format(osmium::io::file_format::opl,
-                [](const osmium::io::File& file, future_string_queue_type& output_queue) {
-                    return new osmium::io::detail::OPLOutputFormat(file, output_queue);
-            });
-
-            // dummy function to silence the unused variable warning from above
-            inline bool get_registered_opl_output() noexcept {
-                return registered_opl_output;
-            }
-
-        } // namespace detail
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_OPL_OUTPUT_FORMAT_HPP
diff --git a/contrib/libosmium/osmium/io/detail/output_format.hpp b/contrib/libosmium/osmium/io/detail/output_format.hpp
deleted file mode 100644
index ba1fb41..0000000
--- a/contrib/libosmium/osmium/io/detail/output_format.hpp
+++ /dev/null
@@ -1,184 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_OUTPUT_FORMAT_HPP
-#define OSMIUM_IO_DETAIL_OUTPUT_FORMAT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <functional>
-#include <map>
-#include <memory>
-#include <stdexcept>
-#include <string>
-#include <utility>
-
-#include <osmium/handler.hpp>
-#include <osmium/io/detail/queue_util.hpp>
-#include <osmium/io/detail/string_util.hpp>
-#include <osmium/io/file.hpp>
-#include <osmium/io/file_format.hpp>
-#include <osmium/memory/buffer.hpp>
-
-namespace osmium {
-
-    namespace io {
-        class Header;
-    }
-
-    namespace io {
-
-        namespace detail {
-
-            class OutputBlock : public osmium::handler::Handler {
-
-            protected:
-
-                std::shared_ptr<osmium::memory::Buffer> m_input_buffer;
-
-                std::shared_ptr<std::string> m_out;
-
-                explicit OutputBlock(osmium::memory::Buffer&& buffer) :
-                    m_input_buffer(std::make_shared<osmium::memory::Buffer>(std::move(buffer))),
-                    m_out(std::make_shared<std::string>()) {
-                }
-
-                template <typename... TArgs>
-                void output_formatted(const char* format, TArgs&&... args) {
-                    append_printf_formatted_string(*m_out, format, std::forward<TArgs>(args)...);
-                }
-
-            }; // class OutputBlock;
-
-            /**
-             * Virtual base class for all classes writing OSM files in different
-             * formats.
-             *
-             * Do not use this class or derived classes directly. Use the
-             * osmium::io::Writer class instead.
-             */
-            class OutputFormat {
-
-            protected:
-
-                future_string_queue_type& m_output_queue;
-
-                /**
-                 * Wrap the string into a future and add it to the output
-                 * queue.
-                 */
-                void send_to_output_queue(std::string&& data) {
-                    add_to_queue(m_output_queue, std::move(data));
-                }
-
-            public:
-
-                explicit OutputFormat(future_string_queue_type& output_queue) :
-                    m_output_queue(output_queue) {
-                }
-
-                OutputFormat(const OutputFormat&) = delete;
-                OutputFormat(OutputFormat&&) = delete;
-
-                OutputFormat& operator=(const OutputFormat&) = delete;
-                OutputFormat& operator=(OutputFormat&&) = delete;
-
-                virtual ~OutputFormat() noexcept = default;
-
-                virtual void write_header(const osmium::io::Header&) {
-                }
-
-                virtual void write_buffer(osmium::memory::Buffer&&) = 0;
-
-                virtual void write_end() {
-                }
-
-            }; // class OutputFormat
-
-            /**
-             * This factory class is used to create objects that write OSM data
-             * into a specified output format.
-             *
-             * Do not use this class directly. Instead use the osmium::io::Writer
-             * class.
-             */
-            class OutputFormatFactory {
-
-            public:
-
-                typedef std::function<osmium::io::detail::OutputFormat*(const osmium::io::File&, future_string_queue_type&)> create_output_type;
-
-            private:
-
-                typedef std::map<osmium::io::file_format, create_output_type> map_type;
-
-                map_type m_callbacks;
-
-                OutputFormatFactory() :
-                    m_callbacks() {
-                }
-
-            public:
-
-                static OutputFormatFactory& instance() {
-                    static OutputFormatFactory factory;
-                    return factory;
-                }
-
-                bool register_output_format(osmium::io::file_format format, create_output_type create_function) {
-                    if (! m_callbacks.insert(map_type::value_type(format, create_function)).second) {
-                        return false;
-                    }
-                    return true;
-                }
-
-                std::unique_ptr<osmium::io::detail::OutputFormat> create_output(const osmium::io::File& file, future_string_queue_type& output_queue) {
-                    auto it = m_callbacks.find(file.format());
-                    if (it != m_callbacks.end()) {
-                        return std::unique_ptr<osmium::io::detail::OutputFormat>((it->second)(file, output_queue));
-                    }
-
-                    throw unsupported_file_format_error(
-                                std::string("Can not open file '") +
-                                file.filename() +
-                                "' with type '" +
-                                as_string(file.format()) +
-                                "'. No support for writing this format in this program.");
-                }
-
-            }; // class OutputFormatFactory
-
-        } // namespace detail
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_OUTPUT_FORMAT_HPP
diff --git a/contrib/libosmium/osmium/io/detail/pbf.hpp b/contrib/libosmium/osmium/io/detail/pbf.hpp
deleted file mode 100644
index 4a32a63..0000000
--- a/contrib/libosmium/osmium/io/detail/pbf.hpp
+++ /dev/null
@@ -1,89 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_PBF_HPP
-#define OSMIUM_IO_DETAIL_PBF_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstdint>
-#include <string>
-
-// needed for htonl and ntohl
-#ifndef _WIN32
-# include <netinet/in.h>
-#else
-# include <winsock2.h>
-#endif
-
-#include <osmium/io/error.hpp>
-#include <osmium/osm/location.hpp>
-
-namespace osmium {
-
-    /**
-     * Exception thrown when there was a problem with parsing the PBF format of
-     * a file.
-     */
-    struct pbf_error : public io_error {
-
-        pbf_error(const std::string& what) :
-            io_error(std::string("PBF error: ") + what) {
-        }
-
-        pbf_error(const char* what) :
-            io_error(std::string("PBF error: ") + what) {
-        }
-
-    }; // struct pbf_error
-
-    namespace io {
-
-        namespace detail {
-
-            // the maximum size of a blob header in bytes
-            const int max_blob_header_size = 64 * 1024; // 64 kB
-
-            // the maximum size of an uncompressed blob in bytes
-            const uint64_t max_uncompressed_blob_size = 32 * 1024 * 1024; // 32 MB
-
-            // resolution for longitude/latitude used for conversion
-            // between representation as double and as int
-            const int64_t lonlat_resolution = 1000 * 1000 * 1000;
-
-            const int64_t resolution_convert = lonlat_resolution / osmium::Location::coordinate_precision;
-
-        }
-
-    }
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_PBF_HPP
diff --git a/contrib/libosmium/osmium/io/detail/pbf_decoder.hpp b/contrib/libosmium/osmium/io/detail/pbf_decoder.hpp
deleted file mode 100644
index 09e09bf..0000000
--- a/contrib/libosmium/osmium/io/detail/pbf_decoder.hpp
+++ /dev/null
@@ -1,777 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_PBF_DECODER_HPP
-#define OSMIUM_IO_DETAIL_PBF_DECODER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstddef>
-#include <cstdint>
-#include <cstring>
-#include <algorithm>
-#include <limits>
-#include <memory>
-#include <stdexcept>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include <protozero/pbf_message.hpp>
-
-#include <osmium/builder/osm_object_builder.hpp>
-#include <osmium/io/detail/pbf.hpp> // IWYU pragma: export
-#include <osmium/io/detail/protobuf_tags.hpp>
-#include <osmium/io/detail/zlib.hpp>
-#include <osmium/io/header.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm/entity_bits.hpp>
-#include <osmium/util/cast.hpp>
-#include <osmium/util/delta.hpp>
-
-namespace osmium {
-
-    namespace io {
-
-        namespace detail {
-
-            using ptr_len_type = std::pair<const char*, size_t>;
-            using osm_string_len_type = std::pair<const char*, osmium::string_size_type>;
-
-            class PBFPrimitiveBlockDecoder {
-
-                static constexpr size_t initial_buffer_size = 2 * 1024 * 1024;
-
-                ptr_len_type m_data;
-                std::vector<osm_string_len_type> m_stringtable;
-
-                int64_t m_lon_offset = 0;
-                int64_t m_lat_offset = 0;
-                int64_t m_date_factor = 1000;
-                int32_t m_granularity = 100;
-
-                osmium::osm_entity_bits::type m_read_types;
-
-                osmium::memory::Buffer m_buffer { initial_buffer_size };
-
-                void decode_stringtable(const ptr_len_type& data) {
-                    if (!m_stringtable.empty()) {
-                        throw osmium::pbf_error("more than one stringtable in pbf file");
-                    }
-
-                    protozero::pbf_message<OSMFormat::StringTable> pbf_string_table(data);
-                    while (pbf_string_table.next(OSMFormat::StringTable::repeated_bytes_s)) {
-                        auto str_len = pbf_string_table.get_data();
-                        if (str_len.second > osmium::max_osm_string_length) {
-                            throw osmium::pbf_error("overlong string in string table");
-                        }
-                        m_stringtable.emplace_back(str_len.first, osmium::string_size_type(str_len.second));
-                    }
-                }
-
-                void decode_primitive_block_metadata() {
-                    protozero::pbf_message<OSMFormat::PrimitiveBlock> pbf_primitive_block(m_data);
-                    while (pbf_primitive_block.next()) {
-                        switch (pbf_primitive_block.tag()) {
-                            case OSMFormat::PrimitiveBlock::required_StringTable_stringtable:
-                                decode_stringtable(pbf_primitive_block.get_data());
-                                break;
-                            case OSMFormat::PrimitiveBlock::optional_int32_granularity:
-                                m_granularity = pbf_primitive_block.get_int32();
-                                break;
-                            case OSMFormat::PrimitiveBlock::optional_int32_date_granularity:
-                                m_date_factor = pbf_primitive_block.get_int32();
-                                break;
-                            case OSMFormat::PrimitiveBlock::optional_int64_lat_offset:
-                                m_lat_offset = pbf_primitive_block.get_int64();
-                                break;
-                            case OSMFormat::PrimitiveBlock::optional_int64_lon_offset:
-                                m_lon_offset = pbf_primitive_block.get_int64();
-                                break;
-                            default:
-                                pbf_primitive_block.skip();
-                        }
-                    }
-                }
-
-                void decode_primitive_block_data() {
-                    protozero::pbf_message<OSMFormat::PrimitiveBlock> pbf_primitive_block(m_data);
-                    while (pbf_primitive_block.next(OSMFormat::PrimitiveBlock::repeated_PrimitiveGroup_primitivegroup)) {
-                        protozero::pbf_message<OSMFormat::PrimitiveGroup> pbf_primitive_group = pbf_primitive_block.get_message();
-                        while (pbf_primitive_group.next()) {
-                            switch (pbf_primitive_group.tag()) {
-                                case OSMFormat::PrimitiveGroup::repeated_Node_nodes:
-                                    if (m_read_types & osmium::osm_entity_bits::node) {
-                                        decode_node(pbf_primitive_group.get_data());
-                                    } else {
-                                        pbf_primitive_group.skip();
-                                    }
-                                    break;
-                                case OSMFormat::PrimitiveGroup::optional_DenseNodes_dense:
-                                    if (m_read_types & osmium::osm_entity_bits::node) {
-                                        decode_dense_nodes(pbf_primitive_group.get_data());
-                                    } else {
-                                        pbf_primitive_group.skip();
-                                    }
-                                    break;
-                                case OSMFormat::PrimitiveGroup::repeated_Way_ways:
-                                    if (m_read_types & osmium::osm_entity_bits::way) {
-                                        decode_way(pbf_primitive_group.get_data());
-                                    } else {
-                                        pbf_primitive_group.skip();
-                                    }
-                                    break;
-                                case OSMFormat::PrimitiveGroup::repeated_Relation_relations:
-                                    if (m_read_types & osmium::osm_entity_bits::relation) {
-                                        decode_relation(pbf_primitive_group.get_data());
-                                    } else {
-                                        pbf_primitive_group.skip();
-                                    }
-                                    break;
-                                default:
-                                    pbf_primitive_group.skip();
-                            }
-                        }
-                    }
-                }
-
-                osm_string_len_type decode_info(const ptr_len_type& data, osmium::OSMObject& object) {
-                    osm_string_len_type user = std::make_pair("", 0);
-
-                    protozero::pbf_message<OSMFormat::Info> pbf_info(data);
-                    while (pbf_info.next()) {
-                        switch (pbf_info.tag()) {
-                            case OSMFormat::Info::optional_int32_version:
-                                {
-                                    auto version = pbf_info.get_int32();
-                                    if (version < 0) {
-                                        throw osmium::pbf_error("object version must not be negative");
-                                    }
-                                    object.set_version(static_cast_with_assert<object_version_type>(version));
-                                }
-                                break;
-                            case OSMFormat::Info::optional_int64_timestamp:
-                                object.set_timestamp(pbf_info.get_int64() * m_date_factor / 1000);
-                                break;
-                            case OSMFormat::Info::optional_int64_changeset:
-                                {
-                                    auto changeset_id = pbf_info.get_int64();
-                                    if (changeset_id < 0) {
-                                        throw osmium::pbf_error("object changeset_id must not be negative");
-                                    }
-                                    object.set_changeset(static_cast_with_assert<changeset_id_type>(changeset_id));
-                                }
-                                break;
-                            case OSMFormat::Info::optional_int32_uid:
-                                object.set_uid_from_signed(pbf_info.get_int32());
-                                break;
-                            case OSMFormat::Info::optional_uint32_user_sid:
-                                user = m_stringtable.at(pbf_info.get_uint32());
-                                break;
-                            case OSMFormat::Info::optional_bool_visible:
-                                object.set_visible(pbf_info.get_bool());
-                                break;
-                            default:
-                                pbf_info.skip();
-                        }
-                    }
-
-                    return user;
-                }
-
-                using kv_type = std::pair<protozero::pbf_reader::const_uint32_iterator, protozero::pbf_reader::const_uint32_iterator>;
-
-                void build_tag_list(osmium::builder::Builder& builder, const kv_type& keys, const kv_type& vals) {
-                    if (keys.first != keys.second) {
-                        osmium::builder::TagListBuilder tl_builder(m_buffer, &builder);
-                        auto kit = keys.first;
-                        auto vit = vals.first;
-                        while (kit != keys.second) {
-                            if (vit == vals.second) {
-                                // this is against the spec, must have same number of elements
-                                throw osmium::pbf_error("PBF format error");
-                            }
-                            const auto& k = m_stringtable.at(*kit++);
-                            const auto& v = m_stringtable.at(*vit++);
-                            tl_builder.add_tag(k.first, k.second, v.first, v.second);
-                        }
-                    }
-                }
-
-                int32_t convert_pbf_coordinate(int64_t c) const {
-                    return int32_t((c * m_granularity + m_lon_offset) / resolution_convert);
-                }
-
-                void decode_node(const ptr_len_type& data) {
-                    osmium::builder::NodeBuilder builder(m_buffer);
-                    osmium::Node& node = builder.object();
-
-                    kv_type keys;
-                    kv_type vals;
-                    int64_t lon = std::numeric_limits<int64_t>::max();
-                    int64_t lat = std::numeric_limits<int64_t>::max();
-
-                    osm_string_len_type user = { "", 0 };
-
-                    protozero::pbf_message<OSMFormat::Node> pbf_node(data);
-                    while (pbf_node.next()) {
-                        switch (pbf_node.tag()) {
-                            case OSMFormat::Node::required_sint64_id:
-                                node.set_id(pbf_node.get_sint64());
-                                break;
-                            case OSMFormat::Node::packed_uint32_keys:
-                                keys = pbf_node.get_packed_uint32();
-                                break;
-                            case OSMFormat::Node::packed_uint32_vals:
-                                vals = pbf_node.get_packed_uint32();
-                                break;
-                            case OSMFormat::Node::optional_Info_info:
-                                user = decode_info(pbf_node.get_data(), builder.object());
-                                break;
-                            case OSMFormat::Node::required_sint64_lat:
-                                lat = pbf_node.get_sint64();
-                                break;
-                            case OSMFormat::Node::required_sint64_lon:
-                                lon = pbf_node.get_sint64();
-                                break;
-                            default:
-                                pbf_node.skip();
-                        }
-                    }
-
-                    if (node.visible()) {
-                        if (lon == std::numeric_limits<int64_t>::max() ||
-                            lat == std::numeric_limits<int64_t>::max()) {
-                            throw osmium::pbf_error("illegal coordinate format");
-                        }
-                        node.set_location(osmium::Location(
-                                convert_pbf_coordinate(lon),
-                                convert_pbf_coordinate(lat)
-                        ));
-                    }
-
-                    builder.add_user(user.first, user.second);
-
-                    build_tag_list(builder, keys, vals);
-
-                    m_buffer.commit();
-                }
-
-                void decode_way(const ptr_len_type& data) {
-                    osmium::builder::WayBuilder builder(m_buffer);
-
-                    kv_type keys;
-                    kv_type vals;
-                    std::pair<protozero::pbf_reader::const_sint64_iterator, protozero::pbf_reader::const_sint64_iterator> refs;
-
-                    osm_string_len_type user = { "", 0 };
-
-                    protozero::pbf_message<OSMFormat::Way> pbf_way(data);
-                    while (pbf_way.next()) {
-                        switch (pbf_way.tag()) {
-                            case OSMFormat::Way::required_int64_id:
-                                builder.object().set_id(pbf_way.get_int64());
-                                break;
-                            case OSMFormat::Way::packed_uint32_keys:
-                                keys = pbf_way.get_packed_uint32();
-                                break;
-                            case OSMFormat::Way::packed_uint32_vals:
-                                vals = pbf_way.get_packed_uint32();
-                                break;
-                            case OSMFormat::Way::optional_Info_info:
-                                user = decode_info(pbf_way.get_data(), builder.object());
-                                break;
-                            case OSMFormat::Way::packed_sint64_refs:
-                                refs = pbf_way.get_packed_sint64();
-                                break;
-                            default:
-                                pbf_way.skip();
-                        }
-                    }
-
-                    builder.add_user(user.first, user.second);
-
-                    if (refs.first != refs.second) {
-                        osmium::builder::WayNodeListBuilder wnl_builder(m_buffer, &builder);
-                        osmium::util::DeltaDecode<int64_t> ref;
-                        while (refs.first != refs.second) {
-                            wnl_builder.add_node_ref(ref.update(*refs.first++));
-                        }
-                    }
-
-                    build_tag_list(builder, keys, vals);
-
-                    m_buffer.commit();
-                }
-
-                void decode_relation(const ptr_len_type& data) {
-                    osmium::builder::RelationBuilder builder(m_buffer);
-
-                    kv_type keys;
-                    kv_type vals;
-                    std::pair<protozero::pbf_reader::const_int32_iterator,  protozero::pbf_reader::const_int32_iterator> roles;
-                    std::pair<protozero::pbf_reader::const_sint64_iterator, protozero::pbf_reader::const_sint64_iterator> refs;
-                    std::pair<protozero::pbf_reader::const_int32_iterator,  protozero::pbf_reader::const_int32_iterator> types;
-
-                    osm_string_len_type user = { "", 0 };
-
-                    protozero::pbf_message<OSMFormat::Relation> pbf_relation(data);
-                    while (pbf_relation.next()) {
-                        switch (pbf_relation.tag()) {
-                            case OSMFormat::Relation::required_int64_id:
-                                builder.object().set_id(pbf_relation.get_int64());
-                                break;
-                            case OSMFormat::Relation::packed_uint32_keys:
-                                keys = pbf_relation.get_packed_uint32();
-                                break;
-                            case OSMFormat::Relation::packed_uint32_vals:
-                                vals = pbf_relation.get_packed_uint32();
-                                break;
-                            case OSMFormat::Relation::optional_Info_info:
-                                user = decode_info(pbf_relation.get_data(), builder.object());
-                                break;
-                            case OSMFormat::Relation::packed_int32_roles_sid:
-                                roles = pbf_relation.get_packed_int32();
-                                break;
-                            case OSMFormat::Relation::packed_sint64_memids:
-                                refs = pbf_relation.get_packed_sint64();
-                                break;
-                            case OSMFormat::Relation::packed_MemberType_types:
-                                types = pbf_relation.get_packed_enum();
-                                break;
-                            default:
-                                pbf_relation.skip();
-                        }
-                    }
-
-                    builder.add_user(user.first, user.second);
-
-                    if (refs.first != refs.second) {
-                        osmium::builder::RelationMemberListBuilder rml_builder(m_buffer, &builder);
-                        osmium::util::DeltaDecode<int64_t> ref;
-                        while (roles.first != roles.second && refs.first != refs.second && types.first != types.second) {
-                            const auto& r = m_stringtable.at(*roles.first++);
-                            int type = *types.first++;
-                            if (type < 0 || type > 2) {
-                                throw osmium::pbf_error("unknown relation member type");
-                            }
-                            rml_builder.add_member(
-                                osmium::item_type(type + 1),
-                                ref.update(*refs.first++),
-                                r.first,
-                                r.second
-                            );
-                        }
-                    }
-
-                    build_tag_list(builder, keys, vals);
-
-                    m_buffer.commit();
-                }
-
-                void decode_dense_nodes(const ptr_len_type& data) {
-                    bool has_info     = false;
-                    bool has_visibles = false;
-
-                    std::pair<protozero::pbf_reader::const_sint64_iterator, protozero::pbf_reader::const_sint64_iterator> ids;
-                    std::pair<protozero::pbf_reader::const_sint64_iterator, protozero::pbf_reader::const_sint64_iterator> lats;
-                    std::pair<protozero::pbf_reader::const_sint64_iterator, protozero::pbf_reader::const_sint64_iterator> lons;
-
-                    std::pair<protozero::pbf_reader::const_int32_iterator,  protozero::pbf_reader::const_int32_iterator>  tags;
-
-                    std::pair<protozero::pbf_reader::const_int32_iterator,  protozero::pbf_reader::const_int32_iterator>  versions;
-                    std::pair<protozero::pbf_reader::const_sint64_iterator, protozero::pbf_reader::const_sint64_iterator> timestamps;
-                    std::pair<protozero::pbf_reader::const_sint64_iterator, protozero::pbf_reader::const_sint64_iterator> changesets;
-                    std::pair<protozero::pbf_reader::const_sint32_iterator, protozero::pbf_reader::const_sint32_iterator> uids;
-                    std::pair<protozero::pbf_reader::const_sint32_iterator, protozero::pbf_reader::const_sint32_iterator> user_sids;
-                    std::pair<protozero::pbf_reader::const_int32_iterator,  protozero::pbf_reader::const_int32_iterator>  visibles;
-
-                    protozero::pbf_message<OSMFormat::DenseNodes> pbf_dense_nodes(data);
-                    while (pbf_dense_nodes.next()) {
-                        switch (pbf_dense_nodes.tag()) {
-                            case OSMFormat::DenseNodes::packed_sint64_id:
-                                ids = pbf_dense_nodes.get_packed_sint64();
-                                break;
-                            case OSMFormat::DenseNodes::optional_DenseInfo_denseinfo:
-                                {
-                                    has_info = true;
-                                    protozero::pbf_message<OSMFormat::DenseInfo> pbf_dense_info = pbf_dense_nodes.get_message();
-                                    while (pbf_dense_info.next()) {
-                                        switch (pbf_dense_info.tag()) {
-                                            case OSMFormat::DenseInfo::packed_int32_version:
-                                                versions = pbf_dense_info.get_packed_int32();
-                                                break;
-                                            case OSMFormat::DenseInfo::packed_sint64_timestamp:
-                                                timestamps = pbf_dense_info.get_packed_sint64();
-                                                break;
-                                            case OSMFormat::DenseInfo::packed_sint64_changeset:
-                                                changesets = pbf_dense_info.get_packed_sint64();
-                                                break;
-                                            case OSMFormat::DenseInfo::packed_sint32_uid:
-                                                uids = pbf_dense_info.get_packed_sint32();
-                                                break;
-                                            case OSMFormat::DenseInfo::packed_sint32_user_sid:
-                                                user_sids = pbf_dense_info.get_packed_sint32();
-                                                break;
-                                            case OSMFormat::DenseInfo::packed_bool_visible:
-                                                has_visibles = true;
-                                                visibles = pbf_dense_info.get_packed_bool();
-                                                break;
-                                            default:
-                                                pbf_dense_info.skip();
-                                        }
-                                    }
-                                }
-                                break;
-                            case OSMFormat::DenseNodes::packed_sint64_lat:
-                                lats = pbf_dense_nodes.get_packed_sint64();
-                                break;
-                            case OSMFormat::DenseNodes::packed_sint64_lon:
-                                lons = pbf_dense_nodes.get_packed_sint64();
-                                break;
-                            case OSMFormat::DenseNodes::packed_int32_keys_vals:
-                                tags = pbf_dense_nodes.get_packed_int32();
-                                break;
-                            default:
-                                pbf_dense_nodes.skip();
-                        }
-                    }
-
-                    osmium::util::DeltaDecode<int64_t> dense_id;
-                    osmium::util::DeltaDecode<int64_t> dense_latitude;
-                    osmium::util::DeltaDecode<int64_t> dense_longitude;
-                    osmium::util::DeltaDecode<int64_t> dense_uid;
-                    osmium::util::DeltaDecode<int64_t> dense_user_sid;
-                    osmium::util::DeltaDecode<int64_t> dense_changeset;
-                    osmium::util::DeltaDecode<int64_t> dense_timestamp;
-
-                    auto tag_it = tags.first;
-
-                    while (ids.first != ids.second) {
-                        if (lons.first == lons.second ||
-                            lats.first == lats.second) {
-                            // this is against the spec, must have same number of elements
-                            throw osmium::pbf_error("PBF format error");
-                        }
-
-                        bool visible = true;
-
-                        osmium::builder::NodeBuilder builder(m_buffer);
-                        osmium::Node& node = builder.object();
-
-                        node.set_id(dense_id.update(*ids.first++));
-
-                        if (has_info) {
-                            if (versions.first == versions.second ||
-                                changesets.first == changesets.second ||
-                                timestamps.first == timestamps.second ||
-                                uids.first == uids.second ||
-                                user_sids.first == user_sids.second) {
-                                // this is against the spec, must have same number of elements
-                                throw osmium::pbf_error("PBF format error");
-                            }
-
-                            auto version = *versions.first++;
-                            if (version < 0) {
-                                throw osmium::pbf_error("object version must not be negative");
-                            }
-                            node.set_version(static_cast<osmium::object_version_type>(version));
-
-                            auto changeset_id = dense_changeset.update(*changesets.first++);
-                            if (changeset_id < 0) {
-                                throw osmium::pbf_error("object changeset_id must not be negative");
-                            }
-                            node.set_changeset(static_cast<osmium::changeset_id_type>(changeset_id));
-
-                            node.set_timestamp(dense_timestamp.update(*timestamps.first++) * m_date_factor / 1000);
-                            node.set_uid_from_signed(static_cast<osmium::signed_user_id_type>(dense_uid.update(*uids.first++)));
-
-                            if (has_visibles) {
-                                if (visibles.first == visibles.second) {
-                                    // this is against the spec, must have same number of elements
-                                    throw osmium::pbf_error("PBF format error");
-                                }
-                                visible = (*visibles.first++) != 0;
-                            }
-                            node.set_visible(visible);
-
-                            const auto& u = m_stringtable.at(dense_user_sid.update(*user_sids.first++));
-                            builder.add_user(u.first, u.second);
-                        } else {
-                            builder.add_user("");
-                        }
-
-                        // even if the node isn't visible, there's still a record
-                        // of its lat/lon in the dense arrays.
-                        const auto lon = dense_longitude.update(*lons.first++);
-                        const auto lat = dense_latitude.update(*lats.first++);
-                        if (visible) {
-                            builder.object().set_location(osmium::Location(
-                                    convert_pbf_coordinate(lon),
-                                    convert_pbf_coordinate(lat)
-                            ));
-                        }
-
-                        if (tag_it != tags.second) {
-                            osmium::builder::TagListBuilder tl_builder(m_buffer, &builder);
-                            while (tag_it != tags.second && *tag_it != 0) {
-                                const auto& k = m_stringtable.at(*tag_it++);
-                                if (tag_it == tags.second) {
-                                    throw osmium::pbf_error("PBF format error"); // this is against the spec, keys/vals must come in pairs
-                                }
-                                const auto& v = m_stringtable.at(*tag_it++);
-                                tl_builder.add_tag(k.first, k.second, v.first, v.second);
-                            }
-
-                            if (tag_it != tags.second) {
-                                ++tag_it;
-                            }
-                        }
-
-                        m_buffer.commit();
-                    }
-
-                }
-
-            public:
-
-                PBFPrimitiveBlockDecoder(const ptr_len_type& data, osmium::osm_entity_bits::type read_types) :
-                    m_data(data),
-                    m_read_types(read_types) {
-                }
-
-                PBFPrimitiveBlockDecoder(const PBFPrimitiveBlockDecoder&) = delete;
-                PBFPrimitiveBlockDecoder& operator=(const PBFPrimitiveBlockDecoder&) = delete;
-
-                PBFPrimitiveBlockDecoder(PBFPrimitiveBlockDecoder&&) = delete;
-                PBFPrimitiveBlockDecoder& operator=(PBFPrimitiveBlockDecoder&&) = delete;
-
-                ~PBFPrimitiveBlockDecoder() noexcept = default;
-
-                osmium::memory::Buffer operator()() {
-                    try {
-                        decode_primitive_block_metadata();
-                        decode_primitive_block_data();
-                    } catch (std::out_of_range&) {
-                        throw osmium::pbf_error("string id out of range");
-                    }
-
-                    return std::move(m_buffer);
-                }
-
-            }; // class PBFPrimitiveBlockDecoder
-
-            inline ptr_len_type decode_blob(const std::string& blob_data, std::string& output) {
-                int32_t raw_size = 0;
-                std::pair<const char*, protozero::pbf_length_type> zlib_data = {nullptr, 0};
-
-                protozero::pbf_message<FileFormat::Blob> pbf_blob(blob_data);
-                while (pbf_blob.next()) {
-                    switch (pbf_blob.tag()) {
-                        case FileFormat::Blob::optional_bytes_raw:
-                            {
-                                auto data_len = pbf_blob.get_data();
-                                if (data_len.second > max_uncompressed_blob_size) {
-                                    throw osmium::pbf_error("illegal blob size");
-                                }
-                                return data_len;
-                            }
-                        case FileFormat::Blob::optional_int32_raw_size:
-                            raw_size = pbf_blob.get_int32();
-                            if (raw_size <= 0 || uint32_t(raw_size) > max_uncompressed_blob_size) {
-                                throw osmium::pbf_error("illegal blob size");
-                            }
-                            break;
-                        case FileFormat::Blob::optional_bytes_zlib_data:
-                            zlib_data = pbf_blob.get_data();
-                            break;
-                        case FileFormat::Blob::optional_bytes_lzma_data:
-                            throw osmium::pbf_error("lzma blobs not implemented");
-                        default:
-                            throw osmium::pbf_error("unknown compression");
-                    }
-                }
-
-                if (zlib_data.second != 0 && raw_size != 0) {
-                    return osmium::io::detail::zlib_uncompress_string(
-                        zlib_data.first,
-                        static_cast<unsigned long>(zlib_data.second),
-                        static_cast<unsigned long>(raw_size),
-                        output
-                    );
-                }
-
-                throw osmium::pbf_error("blob contains no data");
-            }
-
-            inline osmium::Box decode_header_bbox(const ptr_len_type& data) {
-                    int64_t left   = std::numeric_limits<int64_t>::max();
-                    int64_t right  = std::numeric_limits<int64_t>::max();
-                    int64_t top    = std::numeric_limits<int64_t>::max();
-                    int64_t bottom = std::numeric_limits<int64_t>::max();
-
-                    protozero::pbf_message<OSMFormat::HeaderBBox> pbf_header_bbox(data);
-                    while (pbf_header_bbox.next()) {
-                        switch (pbf_header_bbox.tag()) {
-                            case OSMFormat::HeaderBBox::required_sint64_left:
-                                left = pbf_header_bbox.get_sint64();
-                                break;
-                            case OSMFormat::HeaderBBox::required_sint64_right:
-                                right = pbf_header_bbox.get_sint64();
-                                break;
-                            case OSMFormat::HeaderBBox::required_sint64_top:
-                                top = pbf_header_bbox.get_sint64();
-                                break;
-                            case OSMFormat::HeaderBBox::required_sint64_bottom:
-                                bottom = pbf_header_bbox.get_sint64();
-                                break;
-                            default:
-                                pbf_header_bbox.skip();
-                        }
-                    }
-
-                    if (left   == std::numeric_limits<int64_t>::max() ||
-                        right  == std::numeric_limits<int64_t>::max() ||
-                        top    == std::numeric_limits<int64_t>::max() ||
-                        bottom == std::numeric_limits<int64_t>::max()) {
-                        throw osmium::pbf_error("invalid bbox");
-                    }
-
-                    osmium::Box box;
-                    box.extend(osmium::Location(left  / resolution_convert, bottom / resolution_convert));
-                    box.extend(osmium::Location(right / resolution_convert, top    / resolution_convert));
-
-                    return box;
-            }
-
-            inline osmium::io::Header decode_header_block(const ptr_len_type& data) {
-                osmium::io::Header header;
-                int i = 0;
-
-                protozero::pbf_message<OSMFormat::HeaderBlock> pbf_header_block(data);
-                while (pbf_header_block.next()) {
-                    switch (pbf_header_block.tag()) {
-                        case OSMFormat::HeaderBlock::optional_HeaderBBox_bbox:
-                            header.add_box(decode_header_bbox(pbf_header_block.get_data()));
-                            break;
-                        case OSMFormat::HeaderBlock::repeated_string_required_features:
-                            {
-                                auto feature = pbf_header_block.get_data();
-                                if (!strncmp("OsmSchema-V0.6", feature.first, feature.second)) {
-                                    // intentionally left blank
-                                } else if (!strncmp("DenseNodes", feature.first, feature.second)) {
-                                    header.set("pbf_dense_nodes", true);
-                                } else if (!strncmp("HistoricalInformation", feature.first, feature.second)) {
-                                    header.set_has_multiple_object_versions(true);
-                                } else {
-                                    std::string msg("required feature not supported: ");
-                                    msg.append(feature.first, feature.second);
-                                    throw osmium::pbf_error(msg);
-                                }
-                            }
-                            break;
-                        case OSMFormat::HeaderBlock::repeated_string_optional_features:
-                            header.set("pbf_optional_feature_" + std::to_string(i++), pbf_header_block.get_string());
-                            break;
-                        case OSMFormat::HeaderBlock::optional_string_writingprogram:
-                            header.set("generator", pbf_header_block.get_string());
-                            break;
-                        case OSMFormat::HeaderBlock::optional_int64_osmosis_replication_timestamp:
-                            {
-                                auto timestamp = osmium::Timestamp(pbf_header_block.get_int64()).to_iso();
-                                header.set("osmosis_replication_timestamp", timestamp);
-                                header.set("timestamp", timestamp);
-                            }
-                            break;
-                        case OSMFormat::HeaderBlock::optional_int64_osmosis_replication_sequence_number:
-                            header.set("osmosis_replication_sequence_number", std::to_string(pbf_header_block.get_int64()));
-                            break;
-                        case OSMFormat::HeaderBlock::optional_string_osmosis_replication_base_url:
-                            header.set("osmosis_replication_base_url", pbf_header_block.get_string());
-                            break;
-                        default:
-                            pbf_header_block.skip();
-                    }
-                }
-
-                return header;
-            }
-
-            /**
-             * Decode HeaderBlock.
-             *
-             * @param header_block_data Input data
-             * @returns Header object
-             * @throws osmium::pbf_error If there was a parsing error
-             */
-            inline osmium::io::Header decode_header(const std::string& header_block_data) {
-                std::string output;
-
-                return decode_header_block(decode_blob(header_block_data, output));
-            }
-
-            class PBFDataBlobDecoder {
-
-                std::shared_ptr<std::string> m_input_buffer;
-                osmium::osm_entity_bits::type m_read_types;
-
-            public:
-
-                PBFDataBlobDecoder(std::string&& input_buffer, osmium::osm_entity_bits::type read_types) :
-                    m_input_buffer(std::make_shared<std::string>(std::move(input_buffer))),
-                    m_read_types(read_types) {
-                }
-
-                PBFDataBlobDecoder(const PBFDataBlobDecoder&) = default;
-                PBFDataBlobDecoder& operator=(const PBFDataBlobDecoder&) = default;
-
-                PBFDataBlobDecoder(PBFDataBlobDecoder&&) = default;
-                PBFDataBlobDecoder& operator=(PBFDataBlobDecoder&&) = default;
-
-                ~PBFDataBlobDecoder() noexcept = default;
-
-                osmium::memory::Buffer operator()() {
-                    std::string output;
-                    PBFPrimitiveBlockDecoder decoder(decode_blob(*m_input_buffer, output), m_read_types);
-                    return decoder();
-                }
-
-            }; // class PBFDataBlobDecoder
-
-        } // namespace detail
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_PBF_DECODER_HPP
diff --git a/contrib/libosmium/osmium/io/detail/pbf_input_format.hpp b/contrib/libosmium/osmium/io/detail/pbf_input_format.hpp
deleted file mode 100644
index 4464fd7..0000000
--- a/contrib/libosmium/osmium/io/detail/pbf_input_format.hpp
+++ /dev/null
@@ -1,242 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_PBF_INPUT_FORMAT_HPP
-#define OSMIUM_IO_DETAIL_PBF_INPUT_FORMAT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <cassert>
-#include <cstddef>
-#include <cstdint>
-#include <cstring>
-#include <memory>
-#include <sstream>
-#include <string>
-#include <thread>
-#include <type_traits>
-
-#include <protozero/pbf_message.hpp>
-
-#include <osmium/io/detail/input_format.hpp>
-#include <osmium/io/detail/pbf.hpp> // IWYU pragma: export
-#include <osmium/io/detail/pbf_decoder.hpp>
-#include <osmium/io/detail/protobuf_tags.hpp>
-#include <osmium/io/error.hpp>
-#include <osmium/io/file.hpp>
-#include <osmium/io/file_format.hpp>
-#include <osmium/osm.hpp>
-#include <osmium/osm/entity_bits.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/timestamp.hpp>
-#include <osmium/thread/pool.hpp>
-#include <osmium/thread/util.hpp>
-#include <osmium/util/config.hpp>
-
-namespace osmium {
-
-    namespace io {
-
-        namespace detail {
-
-            class PBFParser : public Parser {
-
-                std::string m_input_buffer;
-
-                /**
-                 * Read the given number of bytes from the input queue.
-                 *
-                 * @param size Number of bytes to read
-                 * @returns String with the data
-                 * @throws osmium::pbf_error If size bytes can't be read
-                 */
-                std::string read_from_input_queue(size_t size) {
-                    while (m_input_buffer.size() < size) {
-                        std::string new_data = get_input();
-                        if (input_done()) {
-                            throw osmium::pbf_error("truncated data (EOF encountered)");
-                        }
-                        m_input_buffer += new_data;
-                    }
-
-                    std::string output { m_input_buffer.substr(size) };
-                    m_input_buffer.resize(size);
-
-                    using std::swap;
-                    swap(output, m_input_buffer);
-
-                    return output;
-                }
-
-                /**
-                 * Read 4 bytes in network byte order from file. They contain
-                 * the length of the following BlobHeader.
-                 */
-                uint32_t read_blob_header_size_from_file() {
-                    uint32_t size_in_network_byte_order;
-
-                    try {
-                        const std::string input_data = read_from_input_queue(sizeof(size_in_network_byte_order));
-                        size_in_network_byte_order = *reinterpret_cast<const uint32_t*>(input_data.data());
-                    } catch (osmium::pbf_error&) {
-                        return 0; // EOF
-                    }
-
-                    const uint32_t size = ntohl(size_in_network_byte_order);
-                    if (size > static_cast<uint32_t>(max_blob_header_size)) {
-                        throw osmium::pbf_error("invalid BlobHeader size (> max_blob_header_size)");
-                    }
-
-                    return size;
-                }
-
-                /**
-                 * Decode the BlobHeader. Make sure it contains the expected
-                 * type. Return the size of the following Blob.
-                 */
-                size_t decode_blob_header(protozero::pbf_message<FileFormat::BlobHeader>&& pbf_blob_header, const char* expected_type) {
-                    std::pair<const char*, size_t> blob_header_type;
-                    size_t blob_header_datasize = 0;
-
-                    while (pbf_blob_header.next()) {
-                        switch (pbf_blob_header.tag()) {
-                            case FileFormat::BlobHeader::required_string_type:
-                                blob_header_type = pbf_blob_header.get_data();
-                                break;
-                            case FileFormat::BlobHeader::required_int32_datasize:
-                                blob_header_datasize = pbf_blob_header.get_int32();
-                                break;
-                            default:
-                                pbf_blob_header.skip();
-                        }
-                    }
-
-                    if (blob_header_datasize == 0) {
-                        throw osmium::pbf_error("PBF format error: BlobHeader.datasize missing or zero.");
-                    }
-
-                    if (strncmp(expected_type, blob_header_type.first, blob_header_type.second)) {
-                        throw osmium::pbf_error("blob does not have expected type (OSMHeader in first blob, OSMData in following blobs)");
-                    }
-
-                    return blob_header_datasize;
-                }
-
-                size_t check_type_and_get_blob_size(const char* expected_type) {
-                    assert(expected_type);
-
-                    const auto size = read_blob_header_size_from_file();
-                    if (size == 0) { // EOF
-                        return 0;
-                    }
-
-                    const std::string blob_header = read_from_input_queue(size);
-
-                    return decode_blob_header(protozero::pbf_message<FileFormat::BlobHeader>(blob_header), expected_type);
-                }
-
-                std::string read_from_input_queue_with_check(size_t size) {
-                    if (size > max_uncompressed_blob_size) {
-                        throw osmium::pbf_error(std::string("invalid blob size: " +
-                                                std::to_string(size)));
-                    }
-                    return read_from_input_queue(size);
-                }
-
-                // Parse the header in the PBF OSMHeader blob.
-                void parse_header_blob() {
-                    osmium::io::Header header;
-                    const auto size = check_type_and_get_blob_size("OSMHeader");
-                    header = decode_header(read_from_input_queue_with_check(size));
-                    set_header_value(header);
-                }
-
-                void parse_data_blobs() {
-                    while (const auto size = check_type_and_get_blob_size("OSMData")) {
-                        std::string input_buffer = read_from_input_queue_with_check(size);
-
-                        PBFDataBlobDecoder data_blob_parser{ std::move(input_buffer), read_types() };
-
-                        if (osmium::config::use_pool_threads_for_pbf_parsing()) {
-                            send_to_output_queue(osmium::thread::Pool::instance().submit(std::move(data_blob_parser)));
-                        } else {
-                            send_to_output_queue(data_blob_parser());
-                        }
-                    }
-                }
-
-            public:
-
-                PBFParser(future_string_queue_type& input_queue,
-                          future_buffer_queue_type& output_queue,
-                          std::promise<osmium::io::Header>& header_promise,
-                          osmium::osm_entity_bits::type read_types) :
-                    Parser(input_queue, output_queue, header_promise, read_types),
-                    m_input_buffer() {
-                }
-
-                ~PBFParser() noexcept = default;
-
-                void run() override final {
-                    osmium::thread::set_thread_name("_osmium_pbf_in");
-
-                    parse_header_blob();
-
-                    if (read_types() != osmium::osm_entity_bits::nothing) {
-                        parse_data_blobs();
-                    }
-                }
-
-            }; // class PBFParser
-
-            // we want the register_parser() function to run, setting
-            // the variable is only a side-effect, it will never be used
-            const bool registered_pbf_parser = ParserFactory::instance().register_parser(
-                file_format::pbf,
-                [](future_string_queue_type& input_queue,
-                    future_buffer_queue_type& output_queue,
-                    std::promise<osmium::io::Header>& header_promise,
-                    osmium::osm_entity_bits::type read_which_entities) {
-                    return std::unique_ptr<Parser>(new PBFParser(input_queue, output_queue, header_promise, read_which_entities));
-            });
-
-            // dummy function to silence the unused variable warning from above
-            inline bool get_registered_pbf_parser() noexcept {
-                return registered_pbf_parser;
-            }
-
-        } // namespace detail
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_PBF_INPUT_FORMAT_HPP
diff --git a/contrib/libosmium/osmium/io/detail/pbf_output_format.hpp b/contrib/libosmium/osmium/io/detail/pbf_output_format.hpp
deleted file mode 100644
index 97b143b..0000000
--- a/contrib/libosmium/osmium/io/detail/pbf_output_format.hpp
+++ /dev/null
@@ -1,643 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_PBF_OUTPUT_FORMAT_HPP
-#define OSMIUM_IO_DETAIL_PBF_OUTPUT_FORMAT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <cassert>
-#include <cmath>
-#include <cstdint>
-#include <cstdlib>
-#include <iterator>
-#include <memory>
-#include <string>
-#include <time.h>
-#include <utility>
-
-// needed for older boost libraries
-#define BOOST_RESULT_OF_USE_DECLTYPE
-#include <boost/iterator/transform_iterator.hpp>
-
-#include <protozero/pbf_builder.hpp>
-
-#include <osmium/handler.hpp>
-#include <osmium/io/detail/output_format.hpp>
-#include <osmium/io/detail/pbf.hpp> // IWYU pragma: export
-#include <osmium/io/detail/protobuf_tags.hpp>
-#include <osmium/io/detail/string_table.hpp>
-#include <osmium/io/detail/zlib.hpp>
-#include <osmium/io/file.hpp>
-#include <osmium/io/file_format.hpp>
-#include <osmium/io/header.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/memory/collection.hpp>
-#include <osmium/osm/box.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/relation.hpp>
-#include <osmium/osm/tag.hpp>
-#include <osmium/osm/timestamp.hpp>
-#include <osmium/osm/way.hpp>
-#include <osmium/thread/pool.hpp>
-#include <osmium/util/cast.hpp>
-#include <osmium/util/delta.hpp>
-#include <osmium/visitor.hpp>
-
-namespace osmium {
-
-    namespace io {
-
-        namespace detail {
-
-            struct pbf_output_options {
-
-                /// Should nodes be encoded in DenseNodes?
-                bool use_dense_nodes;
-
-                /**
-                 * Should the PBF blobs contain zlib compressed data?
-                 *
-                 * The zlib compression is optional, it's possible to store the
-                 * blobs in raw format. Disabling the compression can improve
-                 * the writing speed a little but the output will be 2x to 3x
-                 * bigger.
-                 */
-                bool use_compression;
-
-                /// Should metadata of objects be written?
-                bool add_metadata;
-
-                /// Add the "HistoricalInformation" header flag.
-                bool add_historical_information_flag;
-
-                /// Should the visible flag be added to all OSM objects?
-                bool add_visible_flag;
-
-            };
-
-            /**
-             * Maximum number of items in a primitive block.
-             *
-             * The uncompressed length of a Blob *should* be less
-             * than 16 megabytes and *must* be less than 32 megabytes.
-             *
-             * A block may contain any number of entities, as long as
-             * the size limits for the surrounding blob are obeyed.
-             * However, for simplicity, the current Osmosis (0.38)
-             * as well as Osmium implementation always
-             * uses at most 8k entities in a block.
-             */
-            constexpr int32_t max_entities_per_block = 8000;
-
-            constexpr int location_granularity = 100;
-
-            /**
-             * convert a double lat or lon value to an int, respecting the granularity
-             */
-            inline int64_t lonlat2int(double lonlat) {
-                return static_cast<int64_t>(std::round(lonlat * lonlat_resolution / location_granularity));
-            }
-
-            enum class pbf_blob_type {
-                header = 0,
-                data = 1
-            };
-
-            class SerializeBlob {
-
-                std::string m_msg;
-
-                pbf_blob_type m_blob_type;
-
-                bool m_use_compression;
-
-            public:
-
-                /**
-                 * Initialize a blob serializer.
-                 *
-                 * @param msg Protobuf-message containing the blob data
-                 * @param type Type of blob.
-                 * @param use_compression Should the output be compressed using
-                 *        zlib?
-                 */
-                SerializeBlob(std::string&& msg, pbf_blob_type type, bool use_compression) :
-                    m_msg(std::move(msg)),
-                    m_blob_type(type),
-                    m_use_compression(use_compression) {
-                }
-
-                /**
-                 * Serialize a protobuf message into a Blob, optionally apply
-                 * compression and return it together with a BlobHeader ready
-                 * to be written to a file.
-                 */
-                std::string operator()() {
-                    assert(m_msg.size() <= max_uncompressed_blob_size);
-
-                    std::string blob_data;
-                    protozero::pbf_builder<FileFormat::Blob> pbf_blob(blob_data);
-
-                    if (m_use_compression) {
-                        pbf_blob.add_int32(FileFormat::Blob::optional_int32_raw_size, int32_t(m_msg.size()));
-                        pbf_blob.add_bytes(FileFormat::Blob::optional_bytes_zlib_data, osmium::io::detail::zlib_compress(m_msg));
-                    } else {
-                        pbf_blob.add_bytes(FileFormat::Blob::optional_bytes_raw, m_msg);
-                    }
-
-                    std::string blob_header_data;
-                    protozero::pbf_builder<FileFormat::BlobHeader> pbf_blob_header(blob_header_data);
-
-                    pbf_blob_header.add_string(FileFormat::BlobHeader::required_string_type, m_blob_type == pbf_blob_type::data ? "OSMData" : "OSMHeader");
-                    pbf_blob_header.add_int32(FileFormat::BlobHeader::required_int32_datasize, static_cast_with_assert<int32_t>(blob_data.size()));
-
-                    uint32_t sz = htonl(static_cast_with_assert<uint32_t>(blob_header_data.size()));
-
-                    // write to output: the 4-byte BlobHeader-Size followed by the BlobHeader followed by the Blob
-                    std::string output;
-                    output.reserve(sizeof(sz) + blob_header_data.size() + blob_data.size());
-                    output.append(reinterpret_cast<const char*>(&sz), sizeof(sz));
-                    output.append(blob_header_data);
-                    output.append(blob_data);
-
-                    return output;
-                }
-
-            }; // class SerializeBlob
-
-            /**
-             * Contains the code to pack any number of nodes into a DenseNode
-             * structure.
-             *
-             * Because this needs to allocate a lot of memory on the heap,
-             * only one object of this class will be created and then re-used
-             * after calling clear() on it.
-             */
-            class DenseNodes {
-
-                StringTable& m_stringtable;
-
-                std::vector<int64_t> m_ids;
-
-                std::vector<int32_t> m_versions;
-                std::vector<int64_t> m_timestamps;
-                std::vector<int64_t> m_changesets;
-                std::vector<int32_t> m_uids;
-                std::vector<int32_t> m_user_sids;
-                std::vector<bool> m_visibles;
-
-                std::vector<int64_t> m_lats;
-                std::vector<int64_t> m_lons;
-                std::vector<int32_t> m_tags;
-
-                osmium::util::DeltaEncode<object_id_type, int64_t> m_delta_id;
-
-                osmium::util::DeltaEncode<time_t, int64_t> m_delta_timestamp;
-                osmium::util::DeltaEncode<changeset_id_type, int64_t> m_delta_changeset;
-                osmium::util::DeltaEncode<user_id_type, int32_t> m_delta_uid;
-                osmium::util::DeltaEncode<uint32_t, int32_t> m_delta_user_sid;
-
-                osmium::util::DeltaEncode<int64_t, int64_t> m_delta_lat;
-                osmium::util::DeltaEncode<int64_t, int64_t> m_delta_lon;
-
-                const pbf_output_options& m_options;
-
-            public:
-
-                DenseNodes(StringTable& stringtable, const pbf_output_options& options) :
-                    m_stringtable(stringtable),
-                    m_options(options) {
-                }
-
-                /// Clear object for re-use. Keep the allocated memory.
-                void clear() {
-                    m_ids.clear();
-
-                    m_versions.clear();
-                    m_timestamps.clear();
-                    m_changesets.clear();
-                    m_uids.clear();
-                    m_user_sids.clear();
-                    m_visibles.clear();
-
-                    m_lats.clear();
-                    m_lons.clear();
-                    m_tags.clear();
-
-                    m_delta_id.clear();
-
-                    m_delta_timestamp.clear();
-                    m_delta_changeset.clear();
-                    m_delta_uid.clear();
-                    m_delta_user_sid.clear();
-
-                    m_delta_lat.clear();
-                    m_delta_lon.clear();
-                }
-
-                size_t size() const {
-                    return m_ids.size() * 3 * sizeof(int64_t);
-                }
-
-                void add_node(const osmium::Node& node) {
-                    m_ids.push_back(m_delta_id.update(node.id()));
-
-                    if (m_options.add_metadata) {
-                        m_versions.push_back(static_cast_with_assert<int32_t>(node.version()));
-                        m_timestamps.push_back(m_delta_timestamp.update(node.timestamp()));
-                        m_changesets.push_back(m_delta_changeset.update(node.changeset()));
-                        m_uids.push_back(m_delta_uid.update(node.uid()));
-                        m_user_sids.push_back(m_delta_user_sid.update(m_stringtable.add(node.user())));
-                        if (m_options.add_visible_flag) {
-                            m_visibles.push_back(node.visible());
-                        }
-                    }
-
-                    m_lats.push_back(m_delta_lat.update(lonlat2int(node.location().lat_without_check())));
-                    m_lons.push_back(m_delta_lon.update(lonlat2int(node.location().lon_without_check())));
-
-                    for (const auto& tag : node.tags()) {
-                        m_tags.push_back(static_cast_with_assert<int32_t>(m_stringtable.add(tag.key())));
-                        m_tags.push_back(static_cast_with_assert<int32_t>(m_stringtable.add(tag.value())));
-                    }
-                    m_tags.push_back(0);
-                }
-
-                std::string serialize() const {
-                    std::string data;
-                    protozero::pbf_builder<OSMFormat::DenseNodes> pbf_dense_nodes(data);
-
-                    pbf_dense_nodes.add_packed_sint64(OSMFormat::DenseNodes::packed_sint64_id, m_ids.cbegin(), m_ids.cend());
-
-                    if (m_options.add_metadata) {
-                        protozero::pbf_builder<OSMFormat::DenseInfo> pbf_dense_info(pbf_dense_nodes, OSMFormat::DenseNodes::optional_DenseInfo_denseinfo);
-                        pbf_dense_info.add_packed_int32(OSMFormat::DenseInfo::packed_int32_version, m_versions.cbegin(), m_versions.cend());
-                        pbf_dense_info.add_packed_sint64(OSMFormat::DenseInfo::packed_sint64_timestamp, m_timestamps.cbegin(), m_timestamps.cend());
-                        pbf_dense_info.add_packed_sint64(OSMFormat::DenseInfo::packed_sint64_changeset, m_changesets.cbegin(), m_changesets.cend());
-                        pbf_dense_info.add_packed_sint32(OSMFormat::DenseInfo::packed_sint32_uid, m_uids.cbegin(), m_uids.cend());
-                        pbf_dense_info.add_packed_sint32(OSMFormat::DenseInfo::packed_sint32_user_sid, m_user_sids.cbegin(), m_user_sids.cend());
-
-                        if (m_options.add_visible_flag) {
-                            pbf_dense_info.add_packed_bool(OSMFormat::DenseInfo::packed_bool_visible, m_visibles.cbegin(), m_visibles.cend());
-                        }
-                    }
-
-                    pbf_dense_nodes.add_packed_sint64(OSMFormat::DenseNodes::packed_sint64_lat, m_lats.cbegin(), m_lats.cend());
-                    pbf_dense_nodes.add_packed_sint64(OSMFormat::DenseNodes::packed_sint64_lon, m_lons.cbegin(), m_lons.cend());
-
-                    pbf_dense_nodes.add_packed_int32(OSMFormat::DenseNodes::packed_int32_keys_vals, m_tags.cbegin(), m_tags.cend());
-
-                    return data;
-                }
-
-            }; // class DenseNodes
-
-            class PrimitiveBlock {
-
-                std::string m_pbf_primitive_group_data;
-                protozero::pbf_builder<OSMFormat::PrimitiveGroup> m_pbf_primitive_group;
-                StringTable m_stringtable;
-                DenseNodes m_dense_nodes;
-                OSMFormat::PrimitiveGroup m_type;
-                int m_count;
-
-            public:
-
-                PrimitiveBlock(const pbf_output_options& options) :
-                    m_pbf_primitive_group_data(),
-                    m_pbf_primitive_group(m_pbf_primitive_group_data),
-                    m_stringtable(),
-                    m_dense_nodes(m_stringtable, options),
-                    m_type(OSMFormat::PrimitiveGroup::unknown),
-                    m_count(0) {
-                }
-
-                const std::string& group_data() {
-                    if (type() == OSMFormat::PrimitiveGroup::optional_DenseNodes_dense) {
-                        m_pbf_primitive_group.add_message(OSMFormat::PrimitiveGroup::optional_DenseNodes_dense, m_dense_nodes.serialize());
-                    }
-                    return m_pbf_primitive_group_data;
-                }
-
-                void reset(OSMFormat::PrimitiveGroup type) {
-                    m_pbf_primitive_group_data.clear();
-                    m_stringtable.clear();
-                    m_dense_nodes.clear();
-                    m_type = type;
-                    m_count = 0;
-                }
-
-                void write_stringtable(protozero::pbf_builder<OSMFormat::StringTable>& pbf_string_table) {
-                    for (const char* s : m_stringtable) {
-                        pbf_string_table.add_bytes(OSMFormat::StringTable::repeated_bytes_s, s);
-                    }
-                }
-
-                protozero::pbf_builder<OSMFormat::PrimitiveGroup>& group() {
-                    ++m_count;
-                    return m_pbf_primitive_group;
-                }
-
-                void add_dense_node(const osmium::Node& node) {
-                    m_dense_nodes.add_node(node);
-                    ++m_count;
-                }
-
-                uint32_t store_in_stringtable(const char* s) {
-                    return m_stringtable.add(s);
-                }
-
-                int count() const {
-                    return m_count;
-                }
-
-                OSMFormat::PrimitiveGroup type() const {
-                    return m_type;
-                }
-
-                size_t size() const {
-                    return m_pbf_primitive_group_data.size() + m_stringtable.size() + m_dense_nodes.size();
-                }
-
-                /**
-                 * The output buffer (block) will be filled to about
-                 * 95% and then written to disk. This leaves more than
-                 * enough space for the string table (which typically
-                 * needs about 0.1 to 0.3% of the block size).
-                 */
-                constexpr static size_t max_used_blob_size = max_uncompressed_blob_size * 95 / 100;
-
-                bool can_add(OSMFormat::PrimitiveGroup type) const {
-                    if (type != m_type) {
-                        return false;
-                    }
-                    if (count() >= max_entities_per_block) {
-                        return false;
-                    }
-                    return size() < max_used_blob_size;
-                }
-
-            }; // class PrimitiveBlock
-
-            class PBFOutputFormat : public osmium::io::detail::OutputFormat, public osmium::handler::Handler {
-
-                pbf_output_options m_options;
-
-                PrimitiveBlock m_primitive_block;
-
-                void store_primitive_block() {
-                    if (m_primitive_block.count() == 0) {
-                        return;
-                    }
-
-                    std::string primitive_block_data;
-                    protozero::pbf_builder<OSMFormat::PrimitiveBlock> primitive_block(primitive_block_data);
-
-                    {
-                        protozero::pbf_builder<OSMFormat::StringTable> pbf_string_table(primitive_block, OSMFormat::PrimitiveBlock::required_StringTable_stringtable);
-                        m_primitive_block.write_stringtable(pbf_string_table);
-                    }
-
-                    primitive_block.add_message(OSMFormat::PrimitiveBlock::repeated_PrimitiveGroup_primitivegroup, m_primitive_block.group_data());
-
-                    m_output_queue.push(osmium::thread::Pool::instance().submit(
-                        SerializeBlob{std::move(primitive_block_data),
-                                      pbf_blob_type::data,
-                                      m_options.use_compression}
-                    ));
-                }
-
-                template <typename T>
-                void add_meta(const osmium::OSMObject& object, T& pbf_object) {
-                    const osmium::TagList& tags = object.tags();
-
-                    auto map_tag_key = [this](const osmium::Tag& tag) -> uint32_t {
-                        return m_primitive_block.store_in_stringtable(tag.key());
-                    };
-                    auto map_tag_value = [this](const osmium::Tag& tag) -> uint32_t {
-                        return m_primitive_block.store_in_stringtable(tag.value());
-                    };
-
-                    pbf_object.add_packed_uint32(T::enum_type::packed_uint32_keys,
-                        boost::make_transform_iterator(tags.begin(), map_tag_key),
-                        boost::make_transform_iterator(tags.end(), map_tag_key));
-
-                    pbf_object.add_packed_uint32(T::enum_type::packed_uint32_vals,
-                        boost::make_transform_iterator(tags.begin(), map_tag_value),
-                        boost::make_transform_iterator(tags.end(), map_tag_value));
-
-                    if (m_options.add_metadata) {
-                        protozero::pbf_builder<OSMFormat::Info> pbf_info(pbf_object, T::enum_type::optional_Info_info);
-
-                        pbf_info.add_int32(OSMFormat::Info::optional_int32_version, static_cast_with_assert<int32_t>(object.version()));
-                        pbf_info.add_int64(OSMFormat::Info::optional_int64_timestamp, object.timestamp());
-                        pbf_info.add_int64(OSMFormat::Info::optional_int64_changeset, object.changeset());
-                        pbf_info.add_int32(OSMFormat::Info::optional_int32_uid, static_cast_with_assert<int32_t>(object.uid()));
-                        pbf_info.add_uint32(OSMFormat::Info::optional_uint32_user_sid, m_primitive_block.store_in_stringtable(object.user()));
-                        if (m_options.add_visible_flag) {
-                            pbf_info.add_bool(OSMFormat::Info::optional_bool_visible, object.visible());
-                        }
-                    }
-                }
-
-                void switch_primitive_block_type(OSMFormat::PrimitiveGroup type) {
-                    if (!m_primitive_block.can_add(type)) {
-                        store_primitive_block();
-                        m_primitive_block.reset(type);
-                    }
-                }
-
-            public:
-
-                PBFOutputFormat(const osmium::io::File& file, future_string_queue_type& output_queue) :
-                    OutputFormat(output_queue),
-                    m_options(),
-                    m_primitive_block(m_options) {
-                    m_options.use_dense_nodes = file.is_not_false("pbf_dense_nodes");
-                    m_options.use_compression = file.get("pbf_compression") != "none" && file.is_not_false("pbf_compression");
-                    m_options.add_metadata = file.is_not_false("pbf_add_metadata") && file.is_not_false("add_metadata");
-                    m_options.add_historical_information_flag = file.has_multiple_object_versions();
-                    m_options.add_visible_flag = file.has_multiple_object_versions();
-                }
-
-                PBFOutputFormat(const PBFOutputFormat&) = delete;
-                PBFOutputFormat& operator=(const PBFOutputFormat&) = delete;
-
-                ~PBFOutputFormat() noexcept = default;
-
-                void write_header(const osmium::io::Header& header) override final {
-                    std::string data;
-                    protozero::pbf_builder<OSMFormat::HeaderBlock> pbf_header_block(data);
-
-                    if (!header.boxes().empty()) {
-                        protozero::pbf_builder<OSMFormat::HeaderBBox> pbf_header_bbox(pbf_header_block, OSMFormat::HeaderBlock::optional_HeaderBBox_bbox);
-
-                        osmium::Box box = header.joined_boxes();
-                        pbf_header_bbox.add_sint64(OSMFormat::HeaderBBox::required_sint64_left,   int64_t(box.bottom_left().lon() * lonlat_resolution));
-                        pbf_header_bbox.add_sint64(OSMFormat::HeaderBBox::required_sint64_right,  int64_t(box.top_right().lon()   * lonlat_resolution));
-                        pbf_header_bbox.add_sint64(OSMFormat::HeaderBBox::required_sint64_top,    int64_t(box.top_right().lat()   * lonlat_resolution));
-                        pbf_header_bbox.add_sint64(OSMFormat::HeaderBBox::required_sint64_bottom, int64_t(box.bottom_left().lat() * lonlat_resolution));
-                    }
-
-                    pbf_header_block.add_string(OSMFormat::HeaderBlock::repeated_string_required_features, "OsmSchema-V0.6");
-
-                    if (m_options.use_dense_nodes) {
-                        pbf_header_block.add_string(OSMFormat::HeaderBlock::repeated_string_required_features, "DenseNodes");
-                    }
-
-                    if (m_options.add_historical_information_flag) {
-                        pbf_header_block.add_string(OSMFormat::HeaderBlock::repeated_string_required_features, "HistoricalInformation");
-                    }
-
-                    pbf_header_block.add_string(OSMFormat::HeaderBlock::optional_string_writingprogram, header.get("generator"));
-
-                    std::string osmosis_replication_timestamp = header.get("osmosis_replication_timestamp");
-                    if (!osmosis_replication_timestamp.empty()) {
-                        osmium::Timestamp ts(osmosis_replication_timestamp.c_str());
-                        pbf_header_block.add_int64(OSMFormat::HeaderBlock::optional_int64_osmosis_replication_timestamp, ts);
-                    }
-
-                    std::string osmosis_replication_sequence_number = header.get("osmosis_replication_sequence_number");
-                    if (!osmosis_replication_sequence_number.empty()) {
-                        pbf_header_block.add_int64(OSMFormat::HeaderBlock::optional_int64_osmosis_replication_sequence_number, std::atoll(osmosis_replication_sequence_number.c_str()));
-                    }
-
-                    std::string osmosis_replication_base_url = header.get("osmosis_replication_base_url");
-                    if (!osmosis_replication_base_url.empty()) {
-                        pbf_header_block.add_string(OSMFormat::HeaderBlock::optional_string_osmosis_replication_base_url, osmosis_replication_base_url);
-                    }
-
-                    m_output_queue.push(osmium::thread::Pool::instance().submit(
-                        SerializeBlob{std::move(data),
-                                      pbf_blob_type::header,
-                                      m_options.use_compression}
-                        ));
-                }
-
-                void write_buffer(osmium::memory::Buffer&& buffer) override final {
-                    osmium::apply(buffer.cbegin(), buffer.cend(), *this);
-                }
-
-                void write_end() override final {
-                    store_primitive_block();
-                }
-
-                void node(const osmium::Node& node) {
-                    if (m_options.use_dense_nodes) {
-                        switch_primitive_block_type(OSMFormat::PrimitiveGroup::optional_DenseNodes_dense);
-                        m_primitive_block.add_dense_node(node);
-                        return;
-                    }
-
-                    switch_primitive_block_type(OSMFormat::PrimitiveGroup::repeated_Node_nodes);
-                    protozero::pbf_builder<OSMFormat::Node> pbf_node{ m_primitive_block.group(), OSMFormat::PrimitiveGroup::repeated_Node_nodes };
-
-                    pbf_node.add_sint64(OSMFormat::Node::required_sint64_id, node.id());
-                    add_meta(node, pbf_node);
-
-                    pbf_node.add_sint64(OSMFormat::Node::required_sint64_lat, lonlat2int(node.location().lat_without_check()));
-                    pbf_node.add_sint64(OSMFormat::Node::required_sint64_lon, lonlat2int(node.location().lon_without_check()));
-                }
-
-                void way(const osmium::Way& way) {
-                    switch_primitive_block_type(OSMFormat::PrimitiveGroup::repeated_Way_ways);
-                    protozero::pbf_builder<OSMFormat::Way> pbf_way{ m_primitive_block.group(), OSMFormat::PrimitiveGroup::repeated_Way_ways };
-
-                    pbf_way.add_int64(OSMFormat::Way::required_int64_id, way.id());
-                    add_meta(way, pbf_way);
-
-                    static auto map_node_ref = [](osmium::NodeRefList::const_iterator node_ref) noexcept -> osmium::object_id_type {
-                        return node_ref->ref();
-                    };
-                    typedef osmium::util::DeltaEncodeIterator<osmium::NodeRefList::const_iterator, decltype(map_node_ref), osmium::object_id_type> it_type;
-
-                    const auto& nodes = way.nodes();
-                    it_type first { nodes.cbegin(), nodes.cend(), map_node_ref };
-                    it_type last { nodes.cend(), nodes.cend(), map_node_ref };
-                    pbf_way.add_packed_sint64(OSMFormat::Way::packed_sint64_refs, first, last);
-                }
-
-                void relation(const osmium::Relation& relation) {
-                    switch_primitive_block_type(OSMFormat::PrimitiveGroup::repeated_Relation_relations);
-                    protozero::pbf_builder<OSMFormat::Relation> pbf_relation { m_primitive_block.group(), OSMFormat::PrimitiveGroup::repeated_Relation_relations };
-
-                    pbf_relation.add_int64(OSMFormat::Relation::required_int64_id, relation.id());
-                    add_meta(relation, pbf_relation);
-
-                    auto map_member_role = [this](const osmium::RelationMember& member) -> uint32_t {
-                        return m_primitive_block.store_in_stringtable(member.role());
-                    };
-                    pbf_relation.add_packed_int32(OSMFormat::Relation::packed_int32_roles_sid,
-                        boost::make_transform_iterator(relation.members().begin(), map_member_role),
-                        boost::make_transform_iterator(relation.members().end(), map_member_role));
-
-                    static auto map_member_ref = [](osmium::RelationMemberList::const_iterator member) noexcept -> osmium::object_id_type {
-                        return member->ref();
-                    };
-                    typedef osmium::util::DeltaEncodeIterator<osmium::RelationMemberList::const_iterator, decltype(map_member_ref), osmium::object_id_type> it_type;
-                    const auto& members = relation.members();
-                    it_type first { members.cbegin(), members.cend(), map_member_ref };
-                    it_type last { members.cend(), members.cend(), map_member_ref };
-                    pbf_relation.add_packed_sint64(OSMFormat::Relation::packed_sint64_memids, first, last);
-
-                    static auto map_member_type = [](const osmium::RelationMember& member) noexcept -> int32_t {
-                        return int32_t(osmium::item_type_to_nwr_index(member.type()));
-                    };
-                    pbf_relation.add_packed_int32(OSMFormat::Relation::packed_MemberType_types,
-                        boost::make_transform_iterator(relation.members().begin(), map_member_type),
-                        boost::make_transform_iterator(relation.members().end(), map_member_type));
-                }
-
-            }; // class PBFOutputFormat
-
-            // we want the register_output_format() function to run, setting
-            // the variable is only a side-effect, it will never be used
-            const bool registered_pbf_output = osmium::io::detail::OutputFormatFactory::instance().register_output_format(osmium::io::file_format::pbf,
-                [](const osmium::io::File& file, future_string_queue_type& output_queue) {
-                    return new osmium::io::detail::PBFOutputFormat(file, output_queue);
-            });
-
-            // dummy function to silence the unused variable warning from above
-            inline bool get_registered_pbf_output() noexcept {
-                return registered_pbf_output;
-            }
-
-        } // namespace detail
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_PBF_OUTPUT_FORMAT_HPP
diff --git a/contrib/libosmium/osmium/io/detail/protobuf_tags.hpp b/contrib/libosmium/osmium/io/detail/protobuf_tags.hpp
deleted file mode 100644
index 3f23087..0000000
--- a/contrib/libosmium/osmium/io/detail/protobuf_tags.hpp
+++ /dev/null
@@ -1,170 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_PROTOBUF_TAGS_HPP
-#define OSMIUM_IO_DETAIL_PROTOBUF_TAGS_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <protozero/pbf_types.hpp>
-
-namespace osmium {
-
-    namespace io {
-
-        namespace detail {
-
-            // directly translated from
-            // https://github.com/scrosby/OSM-binary/blob/master/src/fileformat.proto
-
-            namespace FileFormat {
-
-                enum class Blob : protozero::pbf_tag_type {
-                    optional_bytes_raw       = 1,
-                    optional_int32_raw_size  = 2,
-                    optional_bytes_zlib_data = 3,
-                    optional_bytes_lzma_data = 4
-                };
-
-                enum class BlobHeader : protozero::pbf_tag_type {
-                    required_string_type     = 1,
-                    optional_bytes_indexdata = 2,
-                    required_int32_datasize  = 3
-                };
-
-            } // namespace FileFormat
-
-            // directly translated from
-            // https://github.com/scrosby/OSM-binary/blob/master/src/osmformat.proto
-
-            namespace OSMFormat {
-
-                enum class HeaderBlock : protozero::pbf_tag_type {
-                    optional_HeaderBBox_bbox          =  1,
-                    repeated_string_required_features =  4,
-                    repeated_string_optional_features =  5,
-                    optional_string_writingprogram    = 16,
-                    optional_string_source            = 17,
-                    optional_int64_osmosis_replication_timestamp       = 32,
-                    optional_int64_osmosis_replication_sequence_number = 33,
-                    optional_string_osmosis_replication_base_url       = 34
-                };
-
-                enum class HeaderBBox : protozero::pbf_tag_type {
-                    required_sint64_left   = 1,
-                    required_sint64_right  = 2,
-                    required_sint64_top    = 3,
-                    required_sint64_bottom = 4
-                };
-
-                enum class PrimitiveBlock : protozero::pbf_tag_type {
-                    required_StringTable_stringtable       =  1,
-                    repeated_PrimitiveGroup_primitivegroup =  2,
-                    optional_int32_granularity             = 17,
-                    optional_int32_date_granularity        = 18,
-                    optional_int64_lat_offset              = 19,
-                    optional_int64_lon_offset              = 20
-                };
-
-                enum class PrimitiveGroup : protozero::pbf_tag_type {
-                    unknown                       = 0,
-                    repeated_Node_nodes           = 1,
-                    optional_DenseNodes_dense     = 2,
-                    repeated_Way_ways             = 3,
-                    repeated_Relation_relations   = 4,
-                    repeated_ChangeSet_changesets = 5
-                };
-
-                enum class StringTable : protozero::pbf_tag_type {
-                    repeated_bytes_s = 1
-                };
-
-                enum class Info : protozero::pbf_tag_type {
-                    optional_int32_version   = 1,
-                    optional_int64_timestamp = 2,
-                    optional_int64_changeset = 3,
-                    optional_int32_uid       = 4,
-                    optional_uint32_user_sid = 5,
-                    optional_bool_visible    = 6
-                };
-
-                enum class DenseInfo : protozero::pbf_tag_type {
-                    packed_int32_version    = 1,
-                    packed_sint64_timestamp = 2,
-                    packed_sint64_changeset = 3,
-                    packed_sint32_uid       = 4,
-                    packed_sint32_user_sid  = 5,
-                    packed_bool_visible     = 6
-                };
-
-                enum class Node : protozero::pbf_tag_type {
-                    required_sint64_id  = 1,
-                    packed_uint32_keys  = 2,
-                    packed_uint32_vals  = 3,
-                    optional_Info_info  = 4,
-                    required_sint64_lat = 8,
-                    required_sint64_lon = 9
-                };
-
-                enum class DenseNodes : protozero::pbf_tag_type {
-                    packed_sint64_id             =  1,
-                    optional_DenseInfo_denseinfo =  5,
-                    packed_sint64_lat            =  8,
-                    packed_sint64_lon            =  9,
-                    packed_int32_keys_vals       = 10
-                };
-
-                enum class Way : protozero::pbf_tag_type {
-                    required_int64_id  = 1,
-                    packed_uint32_keys = 2,
-                    packed_uint32_vals = 3,
-                    optional_Info_info = 4,
-                    packed_sint64_refs = 8
-                };
-
-                enum class Relation : protozero::pbf_tag_type {
-                    required_int64_id       =  1,
-                    packed_uint32_keys      =  2,
-                    packed_uint32_vals      =  3,
-                    optional_Info_info      =  4,
-                    packed_int32_roles_sid  =  8,
-                    packed_sint64_memids    =  9,
-                    packed_MemberType_types = 10
-                };
-
-            } // namespace OSMFormat
-
-        } // namespace detail
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif //  OSMIUM_IO_DETAIL_PROTOBUF_TAGS_HPP
diff --git a/contrib/libosmium/osmium/io/detail/queue_util.hpp b/contrib/libosmium/osmium/io/detail/queue_util.hpp
deleted file mode 100644
index d410df1..0000000
--- a/contrib/libosmium/osmium/io/detail/queue_util.hpp
+++ /dev/null
@@ -1,157 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_QUEUE_UTIL_HPP
-#define OSMIUM_IO_DETAIL_QUEUE_UTIL_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <exception>
-#include <future>
-#include <string>
-
-#include <osmium/memory/buffer.hpp>
-#include <osmium/thread/queue.hpp>
-
-namespace osmium {
-
-    namespace io {
-
-        namespace detail {
-
-            /**
-             * This type of queue contains buffers with OSM data in them.
-             * The "end of file" is marked by an invalid Buffer.
-             * The buffers are wrapped in a std::future so that they can also
-             * transport exceptions. The future also helps with keeping the
-             * data in order.
-             */
-            using future_buffer_queue_type = osmium::thread::Queue<std::future<osmium::memory::Buffer>>;
-
-            /**
-             * This type of queue contains OSM file data in the form it is
-             * stored on disk, ie encoded as XML, PBF, etc.
-             * The "end of file" is marked by an empty string.
-             */
-            using string_queue_type = osmium::thread::Queue<std::string>;
-
-            /**
-             * This type of queue contains OSM file data in the form it is
-             * stored on disk, ie encoded as XML, PBF, etc.
-             * The "end of file" is marked by an empty string.
-             * The strings are wrapped in a std::future so that they can also
-             * transport exceptions. The future also helps with keeping the
-             * data in order.
-             */
-            using future_string_queue_type = osmium::thread::Queue<std::future<std::string>>;
-
-            template <typename T>
-            inline void add_to_queue(osmium::thread::Queue<std::future<T>>& queue, T&& data) {
-                std::promise<T> promise;
-                queue.push(promise.get_future());
-                promise.set_value(std::forward<T>(data));
-            }
-
-            template <typename T>
-            inline void add_to_queue(osmium::thread::Queue<std::future<T>>& queue, std::exception_ptr&& exception) {
-                std::promise<T> promise;
-                queue.push(promise.get_future());
-                promise.set_exception(std::move(exception));
-            }
-
-            template <typename T>
-            inline void add_end_of_data_to_queue(osmium::thread::Queue<std::future<T>>& queue) {
-                add_to_queue<T>(queue, T{});
-            }
-
-            inline bool at_end_of_data(const std::string& data) {
-                return data.empty();
-            }
-
-            inline bool at_end_of_data(osmium::memory::Buffer& buffer) {
-                return !buffer;
-            }
-
-            template <typename T>
-            class queue_wrapper {
-
-                using queue_type = osmium::thread::Queue<std::future<T>>;
-
-                queue_type& m_queue;
-                bool m_has_reached_end_of_data;
-
-            public:
-
-                queue_wrapper(queue_type& queue) :
-                    m_queue(queue),
-                    m_has_reached_end_of_data(false) {
-                }
-
-                ~queue_wrapper() noexcept {
-                    drain();
-                }
-
-                void drain() {
-                    while (!m_has_reached_end_of_data) {
-                        try {
-                            pop();
-                        } catch (...) {
-                            // Ignore any exceptions.
-                        }
-                    }
-                }
-
-                bool has_reached_end_of_data() const noexcept {
-                    return m_has_reached_end_of_data;
-                }
-
-                T pop() {
-                    T data;
-                    if (!m_has_reached_end_of_data) {
-                        std::future<T> data_future;
-                        m_queue.wait_and_pop(data_future);
-                        data = std::move(data_future.get());
-                        if (at_end_of_data(data)) {
-                            m_has_reached_end_of_data = true;
-                        }
-                    }
-                    return data;
-                }
-
-            }; // class queue_wrapper
-
-        } // namespace detail
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_QUEUE_UTIL_HPP
diff --git a/contrib/libosmium/osmium/io/detail/read_thread.hpp b/contrib/libosmium/osmium/io/detail/read_thread.hpp
deleted file mode 100644
index 6f96c0b..0000000
--- a/contrib/libosmium/osmium/io/detail/read_thread.hpp
+++ /dev/null
@@ -1,133 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_READ_THREAD_HPP
-#define OSMIUM_IO_DETAIL_READ_THREAD_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <atomic>
-#include <exception>
-#include <string>
-#include <thread>
-#include <utility>
-
-#include <osmium/io/compression.hpp>
-#include <osmium/io/detail/queue_util.hpp>
-#include <osmium/thread/util.hpp>
-
-namespace osmium {
-
-    namespace io {
-
-        namespace detail {
-
-            /**
-             * This code uses an internally managed thread to read data from
-             * the input file and (optionally) decompress it. The result is
-             * sent to the given queue. Any exceptions will also be send to
-             * the queue.
-             */
-            class ReadThreadManager {
-
-                // only used in the sub-thread
-                osmium::io::Decompressor& m_decompressor;
-                future_string_queue_type& m_queue;
-
-                // used in both threads
-                std::atomic<bool> m_done;
-
-                // only used in the main thread
-                std::thread m_thread;
-
-                void run_in_thread() {
-                    osmium::thread::set_thread_name("_osmium_read");
-
-                    try {
-                        while (!m_done) {
-                            std::string data {m_decompressor.read()};
-                            if (at_end_of_data(data)) {
-                                break;
-                            }
-                            add_to_queue(m_queue, std::move(data));
-                        }
-
-                        m_decompressor.close();
-                    } catch (...) {
-                        add_to_queue(m_queue, std::current_exception());
-                    }
-
-                    add_end_of_data_to_queue(m_queue);
-                }
-
-            public:
-
-                ReadThreadManager(osmium::io::Decompressor& decompressor,
-                                  future_string_queue_type& queue) :
-                    m_decompressor(decompressor),
-                    m_queue(queue),
-                    m_done(false),
-                    m_thread(std::thread(&ReadThreadManager::run_in_thread, this)) {
-                }
-
-                ReadThreadManager(const ReadThreadManager&) = delete;
-                ReadThreadManager& operator=(const ReadThreadManager&) = delete;
-
-                ReadThreadManager(ReadThreadManager&&) = delete;
-                ReadThreadManager& operator=(ReadThreadManager&&) = delete;
-
-                ~ReadThreadManager() noexcept {
-                    try {
-                        close();
-                    } catch (...) {
-                        // Ignore any exceptions because destructor must not throw.
-                    }
-                }
-
-                void stop() noexcept {
-                    m_done = true;
-                }
-
-                void close() {
-                    stop();
-                    if (m_thread.joinable()) {
-                        m_thread.join();
-                    }
-                }
-
-            }; // class ReadThreadManager
-
-        } // namespace detail
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_READ_THREAD_HPP
diff --git a/contrib/libosmium/osmium/io/detail/read_write.hpp b/contrib/libosmium/osmium/io/detail/read_write.hpp
deleted file mode 100644
index 5d1fa26..0000000
--- a/contrib/libosmium/osmium/io/detail/read_write.hpp
+++ /dev/null
@@ -1,180 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_READ_WRITE_HPP
-#define OSMIUM_IO_DETAIL_READ_WRITE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cerrno>
-#include <cstddef>
-#include <errno.h>
-#include <fcntl.h>
-#include <string>
-#include <system_error>
-
-#ifndef _MSC_VER
-# include <unistd.h>
-#else
-# include <io.h>
-#endif
-
-#include <osmium/io/writer_options.hpp>
-
-namespace osmium {
-
-    namespace io {
-
-        /**
-         * @brief Namespace for Osmium internal use
-         */
-        namespace detail {
-
-            /**
-             * Open file for writing. If the file exists, it is truncated, if
-             * not, it is created. If the file name is empty or "-", no file
-             * is opened and the stdout file descriptor (1) is returned.
-             *
-             * @param filename Name of file to be opened.
-             * @param allow_overwrite If the file exists, should it be overwritten?
-             * @returns File descriptor of open file.
-             * @throws system_error if the file can't be opened.
-             */
-            inline int open_for_writing(const std::string& filename, osmium::io::overwrite allow_overwrite = osmium::io::overwrite::no) {
-                if (filename == "" || filename == "-") {
-#ifdef _WIN32
-                    _setmode(1, _O_BINARY);
-#endif
-                    return 1; // stdout
-                } else {
-                    int flags = O_WRONLY | O_CREAT;
-                    if (allow_overwrite == osmium::io::overwrite::allow) {
-                        flags |= O_TRUNC;
-                    } else {
-                        flags |= O_EXCL;
-                    }
-#ifdef _WIN32
-                    flags |= O_BINARY;
-#endif
-                    int fd = ::open(filename.c_str(), flags, 0666);
-                    if (fd < 0) {
-                        throw std::system_error(errno, std::system_category(), std::string("Open failed for '") + filename + "'");
-                    }
-                    return fd;
-                }
-            }
-
-            /**
-             * Open file for reading. If the file name is empty or "-", no file
-             * is opened and the stdin file descriptor (0) is returned.
-             *
-             * @param filename Name of file to be opened.
-             * @returns File descriptor of open file.
-             * @throws system_error if the file can't be opened.
-             */
-            inline int open_for_reading(const std::string& filename) {
-                if (filename == "" || filename == "-") {
-                    return 0; // stdin
-                } else {
-                    int flags = O_RDONLY;
-#ifdef _WIN32
-                    flags |= O_BINARY;
-#endif
-                    int fd = ::open(filename.c_str(), flags);
-                    if (fd < 0) {
-                        throw std::system_error(errno, std::system_category(), std::string("Open failed for '") + filename + "'");
-                    }
-                    return fd;
-                }
-            }
-
-            /**
-             * Writes the given number of bytes from the output_buffer to the file descriptor.
-             * This is just a wrapper around write(2), because write(2) can write less than
-             * the given number of bytes.
-             *
-             * @param fd File descriptor.
-             * @param output_buffer Buffer with data to be written. Must be at least size bytes long.
-             * @param size Number of bytes to write.
-             * @throws std::system_error On error.
-             */
-            inline void reliable_write(const int fd, const unsigned char* output_buffer, const size_t size) {
-                constexpr size_t max_write = 100L * 1024L * 1024L; // Max 100 MByte per write
-                size_t offset = 0;
-                do {
-                    auto write_count = size - offset;
-                    if (write_count > max_write) {
-                        write_count = max_write;
-                    }
-                    auto length = ::write(fd, output_buffer + offset, static_cast<unsigned int>(write_count));
-                    if (length < 0) {
-                        throw std::system_error(errno, std::system_category(), "Write failed");
-                    }
-                    offset += static_cast<size_t>(length);
-                } while (offset < size);
-            }
-
-            /**
-             * Writes the given number of bytes from the output_buffer to the file descriptor.
-             * This is just a wrapper around write(2), because write(2) can write less than
-             * the given number of bytes.
-             *
-             * @param fd File descriptor.
-             * @param output_buffer Buffer with data to be written. Must be at least size bytes long.
-             * @param size Number of bytes to write.
-             * @throws std::system_error On error.
-             */
-            inline void reliable_write(const int fd, const char* output_buffer, const size_t size) {
-                reliable_write(fd, reinterpret_cast<const unsigned char*>(output_buffer), size);
-            }
-
-            inline void reliable_fsync(const int fd) {
-#ifdef _WIN32
-                if (_commit(fd) != 0) {
-#else
-                if (::fsync(fd) != 0) {
-#endif
-                    throw std::system_error(errno, std::system_category(), "Fsync failed");
-                }
-            }
-
-            inline void reliable_close(const int fd) {
-                if (::close(fd) != 0) {
-                    throw std::system_error(errno, std::system_category(), "Close failed");
-                }
-            }
-
-        } // namespace detail
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_READ_WRITE_HPP
diff --git a/contrib/libosmium/osmium/io/detail/string_table.hpp b/contrib/libosmium/osmium/io/detail/string_table.hpp
deleted file mode 100644
index a23035d..0000000
--- a/contrib/libosmium/osmium/io/detail/string_table.hpp
+++ /dev/null
@@ -1,265 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_STRING_TABLE_HPP
-#define OSMIUM_IO_DETAIL_STRING_TABLE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cassert>
-#include <cstdint>
-#include <cstdlib>
-#include <cstring>
-#include <iterator>
-#include <list>
-#include <map>
-#include <string>
-
-#include <osmium/io/detail/pbf.hpp>
-
-namespace osmium {
-
-    namespace io {
-
-        namespace detail {
-
-            /**
-             * class StringStore
-             *
-             * Storage of lots of strings (const char *). Memory is allocated in chunks.
-             * If a string is added and there is no space in the current chunk, a new
-             * chunk will be allocated. Strings added to the store must not be larger
-             * than the chunk size.
-             *
-             * All memory is released when the destructor is called. There is no other way
-             * to release all or part of the memory.
-             *
-             */
-            class StringStore {
-
-                size_t m_chunk_size;
-
-                std::list<std::string> m_chunks;
-
-                void add_chunk() {
-                    m_chunks.push_front(std::string());
-                    m_chunks.front().reserve(m_chunk_size);
-                }
-
-            public:
-
-                StringStore(size_t chunk_size) :
-                    m_chunk_size(chunk_size),
-                    m_chunks() {
-                    add_chunk();
-                }
-
-                void clear() noexcept {
-                    m_chunks.erase(std::next(m_chunks.begin()), m_chunks.end());
-                    m_chunks.front().clear();
-                }
-
-                /**
-                 * Add a null terminated string to the store. This will
-                 * automatically get more memory if we are out.
-                 * Returns a pointer to the copy of the string we have
-                 * allocated.
-                 */
-                const char* add(const char* string) {
-                    size_t len = std::strlen(string) + 1;
-
-                    assert(len <= m_chunk_size);
-
-                    size_t chunk_len = m_chunks.front().size();
-                    if (chunk_len + len > m_chunks.front().capacity()) {
-                        add_chunk();
-                        chunk_len = 0;
-                    }
-
-                    m_chunks.front().append(string);
-                    m_chunks.front().append(1, '\0');
-
-                    return m_chunks.front().c_str() + chunk_len;
-                }
-
-                class const_iterator : public std::iterator<std::forward_iterator_tag, const char*> {
-
-                    typedef std::list<std::string>::const_iterator it_type;
-                    it_type m_it;
-                    const it_type m_last;
-                    const char* m_pos;
-
-                public:
-
-                    const_iterator(it_type it, it_type last) :
-                        m_it(it),
-                        m_last(last),
-                        m_pos(it == last ? nullptr : m_it->c_str()) {
-                    }
-
-                    const_iterator& operator++() {
-                        assert(m_it != m_last);
-                        auto last_pos = m_it->c_str() + m_it->size();
-                        while (m_pos != last_pos && *m_pos) ++m_pos;
-                        if (m_pos != last_pos) ++m_pos;
-                        if (m_pos == last_pos) {
-                            ++m_it;
-                            if (m_it != m_last) {
-                                m_pos = m_it->c_str();
-                            } else {
-                                m_pos = nullptr;
-                            }
-                        }
-                        return *this;
-                    }
-
-                    const_iterator operator++(int) {
-                        const_iterator tmp(*this);
-                        operator++();
-                        return tmp;
-                    }
-
-                    bool operator==(const const_iterator& rhs) const {
-                        return m_it == rhs.m_it && m_pos == rhs.m_pos;
-                    }
-
-                    bool operator!=(const const_iterator& rhs) const {
-                        return !(*this == rhs);
-                    }
-
-                    const char* operator*() const {
-                        assert(m_it != m_last);
-                        assert(m_pos != nullptr);
-                        return m_pos;
-                    }
-
-                }; // class const_iterator
-
-                const_iterator begin() const {
-                    if (m_chunks.front().empty()) {
-                        return end();
-                    }
-                    return const_iterator(m_chunks.begin(), m_chunks.end());
-                }
-
-                const_iterator end() const {
-                    return const_iterator(m_chunks.end(), m_chunks.end());
-                }
-
-                // These functions get you some idea how much memory was
-                // used.
-                size_t get_chunk_size() const noexcept {
-                    return m_chunk_size;
-                }
-
-                size_t get_chunk_count() const noexcept {
-                    return m_chunks.size();
-                }
-
-                size_t get_used_bytes_in_last_chunk() const noexcept {
-                    return m_chunks.front().size();
-                }
-
-            }; // class StringStore
-
-            struct StrComp {
-
-                bool operator()(const char* lhs, const char* rhs) const {
-                    return strcmp(lhs, rhs) < 0;
-                }
-
-            }; // struct StrComp
-
-            class StringTable {
-
-                // This is the maximum number of entries in a string table.
-                // This should never be reached in practice but we better
-                // make sure it doesn't. If we had max_uncompressed_blob_size
-                // many entries, we are sure they would never fit into a PBF
-                // Blob.
-                static constexpr const uint32_t max_entries = max_uncompressed_blob_size;
-
-                StringStore m_strings;
-                std::map<const char*, size_t, StrComp> m_index;
-                uint32_t m_size;
-
-            public:
-
-                StringTable() :
-                    m_strings(1024 * 1024),
-                    m_index(),
-                    m_size(0) {
-                    m_strings.add("");
-                }
-
-                void clear() {
-                    m_strings.clear();
-                    m_index.clear();
-                    m_size = 0;
-                    m_strings.add("");
-                }
-
-                uint32_t size() const noexcept {
-                    return m_size + 1;
-                }
-
-                uint32_t add(const char* s) {
-                    auto f = m_index.find(s);
-                    if (f != m_index.end()) {
-                        return uint32_t(f->second);
-                    }
-
-                    const char* cs = m_strings.add(s);
-                    m_index[cs] = ++m_size;
-
-                    if (m_size > max_entries) {
-                        throw osmium::pbf_error("string table has too many entries");
-                    }
-
-                    return m_size;
-                }
-
-                StringStore::const_iterator begin() const {
-                    return m_strings.begin();
-                }
-
-                StringStore::const_iterator end() const {
-                    return m_strings.end();
-                }
-
-            }; // class StringTable
-
-        } // namespace detail
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_STRING_TABLE_HPP
diff --git a/contrib/libosmium/osmium/io/detail/string_util.hpp b/contrib/libosmium/osmium/io/detail/string_util.hpp
deleted file mode 100644
index 672266a..0000000
--- a/contrib/libosmium/osmium/io/detail/string_util.hpp
+++ /dev/null
@@ -1,206 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_STRING_UTIL_HPP
-#define OSMIUM_IO_DETAIL_STRING_UTIL_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cassert>
-#include <cstdint>
-#include <cstring>
-#include <string>
-#include <utility>
-
-#include <utf8.h>
-
-namespace osmium {
-
-    namespace io {
-
-        namespace detail {
-
-#ifndef _MSC_VER
-# define SNPRINTF std::snprintf
-#else
-# define SNPRINTF _snprintf
-#endif
-
-            template <typename... TArgs>
-            inline int string_snprintf(std::string& out,
-                                       size_t old_size,
-                                       size_t max_size,
-                                       const char* format,
-                                       TArgs&&... args) {
-                out.resize(old_size + max_size);
-
-                return SNPRINTF(max_size ? const_cast<char*>(out.c_str()) + old_size : nullptr,
-                                max_size,
-                                format,
-                                std::forward<TArgs>(args)...);
-            }
-
-#undef SNPRINTF
-
-            /**
-             * This is a helper function for writing printf-like formatted
-             * data into a std::string.
-             *
-             * @param out The data will be appended to this string.
-             * @param format A string with formatting instructions a la printf.
-             * @param args Any further arguments like in printf.
-             * @throws std::bad_alloc If the string needed to grow and there
-             *         wasn't enough memory.
-             */
-            template <typename... TArgs>
-            inline void append_printf_formatted_string(std::string& out,
-                                                   const char* format,
-                                                   TArgs&&... args) {
-
-                // First try to write string with the max_size, if that doesn't
-                // work snprintf will tell us how much space it needs. We
-                // reserve that much space and try again. So this will always
-                // work, even if the output is larger than the given max_size.
-                //
-                // Unfortunately this trick doesn't work on Windows, because
-                // the _snprintf() function there only returns the length it
-                // needs if max_size==0 and the buffer pointer is the null
-                // pointer. So we have to take this into account.
-
-#ifndef _MSC_VER
-                static const size_t max_size = 100;
-#else
-                static const size_t max_size = 0;
-#endif
-
-                size_t old_size = out.size();
-
-                int len = string_snprintf(out,
-                                          old_size,
-                                          max_size,
-                                          format,
-                                          std::forward<TArgs>(args)...);
-                assert(len > 0);
-
-                if (size_t(len) >= max_size) {
-                    int len2 = string_snprintf(out,
-                                               old_size,
-                                               size_t(len) + 1,
-                                               format,
-                                               std::forward<TArgs>(args)...);
-                    assert(len2 == len);
-                }
-
-                out.resize(old_size + size_t(len));
-            }
-
-            inline void append_utf8_encoded_string(std::string& out, const char* data) {
-                const char* end = data + std::strlen(data);
-
-                while (data != end) {
-                    const char* last = data;
-                    uint32_t c = utf8::next(data, end);
-
-                    // This is a list of Unicode code points that we let
-                    // through instead of escaping them. It is incomplete
-                    // and can be extended later.
-                    // Generally we don't want to let through any character
-                    // that has special meaning in the OPL format such as
-                    // space, comma, @, etc. and any non-printing characters.
-                    if ((0x0021 <= c && c <= 0x0024) ||
-                        (0x0026 <= c && c <= 0x002b) ||
-                        (0x002d <= c && c <= 0x003c) ||
-                        (0x003e <= c && c <= 0x003f) ||
-                        (0x0041 <= c && c <= 0x007e) ||
-                        (0x00a1 <= c && c <= 0x00ac) ||
-                        (0x00ae <= c && c <= 0x05ff)) {
-                        out.append(last, data);
-                    } else {
-                        out += '%';
-                        if (c <= 0xff) {
-                            append_printf_formatted_string(out, "%02x", c);
-                        } else {
-                            append_printf_formatted_string(out, "%04x", c);
-                        }
-                        out += '%';
-                    }
-                }
-            }
-
-            inline void append_xml_encoded_string(std::string& out, const char* data) {
-                for (; *data != '\0'; ++data) {
-                    switch(*data) {
-                        case '&':  out += "&";  break;
-                        case '\"': out += """; break;
-                        case '\'': out += "'"; break;
-                        case '<':  out += "<";   break;
-                        case '>':  out += ">";   break;
-                        case '\n': out += "&#xA;";  break;
-                        case '\r': out += "&#xD;";  break;
-                        case '\t': out += "&#x9;";  break;
-                        default:   out += *data;    break;
-                    }
-                }
-            }
-
-            inline void append_debug_encoded_string(std::string& out, const char* data, const char* prefix, const char* suffix) {
-                const char* end = data + std::strlen(data);
-
-                while (data != end) {
-                    const char* last = data;
-                    uint32_t c = utf8::next(data, end);
-
-                    // This is a list of Unicode code points that we let
-                    // through instead of escaping them. It is incomplete
-                    // and can be extended later.
-                    // Generally we don't want to let through any
-                    // non-printing characters.
-                    if ((0x0020 <= c && c <= 0x0021) ||
-                        (0x0023 <= c && c <= 0x003b) ||
-                        (0x003d == c) ||
-                        (0x003f <= c && c <= 0x007e) ||
-                        (0x00a1 <= c && c <= 0x00ac) ||
-                        (0x00ae <= c && c <= 0x05ff)) {
-                        out.append(last, data);
-                    } else {
-                        out.append(prefix);
-                        append_printf_formatted_string(out, "<U+%04X>", c);
-                        out.append(suffix);
-                    }
-                }
-            }
-
-        } // namespace detail
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_STRING_UTIL_HPP
diff --git a/contrib/libosmium/osmium/io/detail/write_thread.hpp b/contrib/libosmium/osmium/io/detail/write_thread.hpp
deleted file mode 100644
index 81ab194..0000000
--- a/contrib/libosmium/osmium/io/detail/write_thread.hpp
+++ /dev/null
@@ -1,107 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_WRITE_THREAD_HPP
-#define OSMIUM_IO_DETAIL_WRITE_THREAD_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <exception>
-#include <future>
-#include <string>
-
-#include <osmium/io/compression.hpp>
-#include <osmium/io/detail/queue_util.hpp>
-#include <osmium/thread/util.hpp>
-
-namespace osmium {
-
-    namespace io {
-
-        namespace detail {
-
-            /**
-             * This codes runs in its own thread, getting data from the given
-             * queue, (optionally) compressing it, and writing it to the output
-             * file.
-             */
-            class WriteThread {
-
-                queue_wrapper<std::string> m_queue;
-                std::unique_ptr<osmium::io::Compressor> m_compressor;
-                std::promise<bool> m_promise;
-
-            public:
-
-                WriteThread(future_string_queue_type& input_queue,
-                            std::unique_ptr<osmium::io::Compressor>&& compressor,
-                            std::promise<bool>&& promise) :
-                    m_queue(input_queue),
-                    m_compressor(std::move(compressor)),
-                    m_promise(std::move(promise)) {
-                }
-
-                WriteThread(const WriteThread&) = delete;
-                WriteThread& operator=(const WriteThread&) = delete;
-
-                WriteThread(WriteThread&&) = delete;
-                WriteThread& operator=(WriteThread&&) = delete;
-
-                ~WriteThread() noexcept = default;
-
-                void operator()() {
-                    osmium::thread::set_thread_name("_osmium_write");
-
-                    try {
-                        while (true) {
-                            std::string data = m_queue.pop();
-                            if (at_end_of_data(data)) {
-                                break;
-                            }
-                            m_compressor->write(data);
-                        }
-                        m_compressor->close();
-                        m_promise.set_value(true);
-                    } catch (...) {
-                        m_promise.set_exception(std::current_exception());
-                        m_queue.drain();
-                    }
-                }
-
-            }; // class WriteThread
-
-        } // namespace detail
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_WRITE_THREAD_HPP
diff --git a/contrib/libosmium/osmium/io/detail/xml_input_format.hpp b/contrib/libosmium/osmium/io/detail/xml_input_format.hpp
deleted file mode 100644
index 45dbde0..0000000
--- a/contrib/libosmium/osmium/io/detail/xml_input_format.hpp
+++ /dev/null
@@ -1,679 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_XML_INPUT_FORMAT_HPP
-#define OSMIUM_IO_DETAIL_XML_INPUT_FORMAT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cassert>
-#include <cstddef>
-#include <cstdlib>
-#include <cstring>
-#include <exception>
-#include <future>
-#include <memory>
-#include <string>
-#include <utility>
-
-#include <expat.h>
-
-#include <osmium/builder/builder.hpp>
-#include <osmium/builder/osm_object_builder.hpp>
-#include <osmium/io/detail/input_format.hpp>
-#include <osmium/io/detail/queue_util.hpp>
-#include <osmium/io/error.hpp>
-#include <osmium/io/file_format.hpp>
-#include <osmium/io/header.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm.hpp>
-#include <osmium/osm/box.hpp>
-#include <osmium/osm/entity_bits.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/osm/types_from_string.hpp>
-#include <osmium/thread/queue.hpp>
-#include <osmium/thread/util.hpp>
-#include <osmium/util/cast.hpp>
-
-namespace osmium {
-
-    /**
-     * Exception thrown when the XML parser failed. The exception contains
-     * (if available) information about the place where the error happened
-     * and the type of error.
-     */
-    struct xml_error : public io_error {
-
-        unsigned long line;
-        unsigned long column;
-        XML_Error error_code;
-        std::string error_string;
-
-        explicit xml_error(XML_Parser parser) :
-            io_error(std::string("XML parsing error at line ")
-                    + std::to_string(XML_GetCurrentLineNumber(parser))
-                    + ", column "
-                    + std::to_string(XML_GetCurrentColumnNumber(parser))
-                    + ": "
-                    + XML_ErrorString(XML_GetErrorCode(parser))),
-            line(XML_GetCurrentLineNumber(parser)),
-            column(XML_GetCurrentColumnNumber(parser)),
-            error_code(XML_GetErrorCode(parser)),
-            error_string(XML_ErrorString(error_code)) {
-        }
-
-        explicit xml_error(const std::string& message) :
-            io_error(message),
-            line(0),
-            column(0),
-            error_code(),
-            error_string(message) {
-        }
-
-    }; // struct xml_error
-
-    /**
-     * Exception thrown when an OSM XML files contains no version attribute
-     * on the 'osm' element or if the version is unknown.
-     */
-    struct format_version_error : public io_error {
-
-        std::string version;
-
-        explicit format_version_error() :
-            io_error("Can not read file without version (missing version attribute on osm element)."),
-            version() {
-        }
-
-        explicit format_version_error(const char* v) :
-            io_error(std::string("Can not read file with version ") + v),
-            version(v) {
-        }
-
-    }; // struct format_version_error
-
-    namespace io {
-
-        namespace detail {
-
-            class XMLParser : public Parser {
-
-                static constexpr int buffer_size = 2 * 1000 * 1000;
-
-                enum class context {
-                    root,
-                    top,
-                    node,
-                    way,
-                    relation,
-                    changeset,
-                    discussion,
-                    comment,
-                    comment_text,
-                    ignored_node,
-                    ignored_way,
-                    ignored_relation,
-                    ignored_changeset,
-                    in_object
-                }; // enum class context
-
-                context m_context;
-                context m_last_context;
-
-                /**
-                 * This is used only for change files which contain create, modify,
-                 * and delete sections.
-                 */
-                bool m_in_delete_section;
-
-                osmium::io::Header m_header;
-
-                osmium::memory::Buffer m_buffer;
-
-                std::unique_ptr<osmium::builder::NodeBuilder>                m_node_builder;
-                std::unique_ptr<osmium::builder::WayBuilder>                 m_way_builder;
-                std::unique_ptr<osmium::builder::RelationBuilder>            m_relation_builder;
-                std::unique_ptr<osmium::builder::ChangesetBuilder>           m_changeset_builder;
-                std::unique_ptr<osmium::builder::ChangesetDiscussionBuilder> m_changeset_discussion_builder;
-
-                std::unique_ptr<osmium::builder::TagListBuilder>             m_tl_builder;
-                std::unique_ptr<osmium::builder::WayNodeListBuilder>         m_wnl_builder;
-                std::unique_ptr<osmium::builder::RelationMemberListBuilder>  m_rml_builder;
-
-                std::string m_comment_text;
-
-                /**
-                 * A C++ wrapper for the Expat parser that makes sure no memory is leaked.
-                 */
-                template <typename T>
-                class ExpatXMLParser {
-
-                    XML_Parser m_parser;
-
-                    static void XMLCALL start_element_wrapper(void* data, const XML_Char* element, const XML_Char** attrs) {
-                        static_cast<XMLParser*>(data)->start_element(element, attrs);
-                    }
-
-                    static void XMLCALL end_element_wrapper(void* data, const XML_Char* element) {
-                        static_cast<XMLParser*>(data)->end_element(element);
-                    }
-
-                    static void XMLCALL character_data_wrapper(void* data, const XML_Char* text, int len) {
-                        static_cast<XMLParser*>(data)->characters(text, len);
-                    }
-
-                public:
-
-                    ExpatXMLParser(T* callback_object) :
-                        m_parser(XML_ParserCreate(nullptr)) {
-                        if (!m_parser) {
-                            throw osmium::io_error("Internal error: Can not create parser");
-                        }
-                        XML_SetUserData(m_parser, callback_object);
-                        XML_SetElementHandler(m_parser, start_element_wrapper, end_element_wrapper);
-                        XML_SetCharacterDataHandler(m_parser, character_data_wrapper);
-                    }
-
-                    ExpatXMLParser(const ExpatXMLParser&) = delete;
-                    ExpatXMLParser(ExpatXMLParser&&) = delete;
-
-                    ExpatXMLParser& operator=(const ExpatXMLParser&) = delete;
-                    ExpatXMLParser& operator=(ExpatXMLParser&&) = delete;
-
-                    ~ExpatXMLParser() noexcept {
-                        XML_ParserFree(m_parser);
-                    }
-
-                    void operator()(const std::string& data, bool last) {
-                        if (XML_Parse(m_parser, data.data(), static_cast_with_assert<int>(data.size()), last) == XML_STATUS_ERROR) {
-                            throw osmium::xml_error(m_parser);
-                        }
-                    }
-
-                }; // class ExpatXMLParser
-
-                template <typename T>
-                static void check_attributes(const XML_Char** attrs, T check) {
-                    while (*attrs) {
-                        check(attrs[0], attrs[1]);
-                        attrs += 2;
-                    }
-                }
-
-                const char* init_object(osmium::OSMObject& object, const XML_Char** attrs) {
-                    const char* user = "";
-
-                    if (m_in_delete_section) {
-                        object.set_visible(false);
-                    }
-
-                    osmium::Location location;
-
-                    check_attributes(attrs, [&location, &user, &object](const XML_Char* name, const XML_Char* value) {
-                        if (!strcmp(name, "lon")) {
-                            location.set_lon(std::atof(value)); // XXX doesn't detect garbage after the number
-                        } else if (!strcmp(name, "lat")) {
-                            location.set_lat(std::atof(value)); // XXX doesn't detect garbage after the number
-                        } else if (!strcmp(name, "user")) {
-                            user = value;
-                        } else {
-                            object.set_attribute(name, value);
-                        }
-                    });
-
-                    if (location && object.type() == osmium::item_type::node) {
-                        static_cast<osmium::Node&>(object).set_location(location);
-                    }
-
-                    return user;
-                }
-
-                void init_changeset(osmium::builder::ChangesetBuilder* builder, const XML_Char** attrs) {
-                    const char* user = "";
-                    osmium::Changeset& new_changeset = builder->object();
-
-                    osmium::Location min;
-                    osmium::Location max;
-                    check_attributes(attrs, [&min, &max, &user, &new_changeset](const XML_Char* name, const XML_Char* value) {
-                        if (!strcmp(name, "min_lon")) {
-                            min.set_lon(atof(value));
-                        } else if (!strcmp(name, "min_lat")) {
-                            min.set_lat(atof(value));
-                        } else if (!strcmp(name, "max_lon")) {
-                            max.set_lon(atof(value));
-                        } else if (!strcmp(name, "max_lat")) {
-                            max.set_lat(atof(value));
-                        } else if (!strcmp(name, "user")) {
-                            user = value;
-                        } else {
-                            new_changeset.set_attribute(name, value);
-                        }
-                    });
-
-                    new_changeset.bounds().extend(min);
-                    new_changeset.bounds().extend(max);
-
-                    builder->add_user(user);
-                }
-
-                void get_tag(osmium::builder::Builder* builder, const XML_Char** attrs) {
-                    const char* k = "";
-                    const char* v = "";
-                    check_attributes(attrs, [&k, &v](const XML_Char* name, const XML_Char* value) {
-                        if (name[0] == 'k' && name[1] == 0) {
-                            k = value;
-                        } else if (name[0] == 'v' && name[1] == 0) {
-                            v = value;
-                        }
-                    });
-                    if (!m_tl_builder) {
-                        m_tl_builder = std::unique_ptr<osmium::builder::TagListBuilder>(new osmium::builder::TagListBuilder(m_buffer, builder));
-                    }
-                    m_tl_builder->add_tag(k, v);
-                }
-
-                void mark_header_as_done() {
-                    set_header_value(m_header);
-                }
-
-                void start_element(const XML_Char* element, const XML_Char** attrs) {
-                    switch (m_context) {
-                        case context::root:
-                            if (!strcmp(element, "osm") || !strcmp(element, "osmChange")) {
-                                if (!strcmp(element, "osmChange")) {
-                                    m_header.set_has_multiple_object_versions(true);
-                                }
-                                check_attributes(attrs, [this](const XML_Char* name, const XML_Char* value) {
-                                    if (!strcmp(name, "version")) {
-                                        m_header.set("version", value);
-                                        if (strcmp(value, "0.6")) {
-                                            throw osmium::format_version_error(value);
-                                        }
-                                    } else if (!strcmp(name, "generator")) {
-                                        m_header.set("generator", value);
-                                    }
-                                });
-                                if (m_header.get("version") == "") {
-                                    throw osmium::format_version_error();
-                                }
-                            } else {
-                                throw osmium::xml_error(std::string("Unknown top-level element: ") + element);
-                            }
-                            m_context = context::top;
-                            break;
-                        case context::top:
-                            assert(!m_tl_builder);
-                            if (!strcmp(element, "node")) {
-                                mark_header_as_done();
-                                if (read_types() & osmium::osm_entity_bits::node) {
-                                    m_node_builder = std::unique_ptr<osmium::builder::NodeBuilder>(new osmium::builder::NodeBuilder(m_buffer));
-                                    m_node_builder->add_user(init_object(m_node_builder->object(), attrs));
-                                    m_context = context::node;
-                                } else {
-                                    m_context = context::ignored_node;
-                                }
-                            } else if (!strcmp(element, "way")) {
-                                mark_header_as_done();
-                                if (read_types() & osmium::osm_entity_bits::way) {
-                                    m_way_builder = std::unique_ptr<osmium::builder::WayBuilder>(new osmium::builder::WayBuilder(m_buffer));
-                                    m_way_builder->add_user(init_object(m_way_builder->object(), attrs));
-                                    m_context = context::way;
-                                } else {
-                                    m_context = context::ignored_way;
-                                }
-                            } else if (!strcmp(element, "relation")) {
-                                mark_header_as_done();
-                                if (read_types() & osmium::osm_entity_bits::relation) {
-                                    m_relation_builder = std::unique_ptr<osmium::builder::RelationBuilder>(new osmium::builder::RelationBuilder(m_buffer));
-                                    m_relation_builder->add_user(init_object(m_relation_builder->object(), attrs));
-                                    m_context = context::relation;
-                                } else {
-                                    m_context = context::ignored_relation;
-                                }
-                            } else if (!strcmp(element, "changeset")) {
-                                mark_header_as_done();
-                                if (read_types() & osmium::osm_entity_bits::changeset) {
-                                    m_changeset_builder = std::unique_ptr<osmium::builder::ChangesetBuilder>(new osmium::builder::ChangesetBuilder(m_buffer));
-                                    init_changeset(m_changeset_builder.get(), attrs);
-                                    m_context = context::changeset;
-                                } else {
-                                    m_context = context::ignored_changeset;
-                                }
-                            } else if (!strcmp(element, "bounds")) {
-                                osmium::Location min;
-                                osmium::Location max;
-                                check_attributes(attrs, [&min, &max](const XML_Char* name, const XML_Char* value) {
-                                    if (!strcmp(name, "minlon")) {
-                                        min.set_lon(atof(value));
-                                    } else if (!strcmp(name, "minlat")) {
-                                        min.set_lat(atof(value));
-                                    } else if (!strcmp(name, "maxlon")) {
-                                        max.set_lon(atof(value));
-                                    } else if (!strcmp(name, "maxlat")) {
-                                        max.set_lat(atof(value));
-                                    }
-                                });
-                                osmium::Box box;
-                                box.extend(min).extend(max);
-                                m_header.add_box(box);
-                            } else if (!strcmp(element, "delete")) {
-                                m_in_delete_section = true;
-                            }
-                            break;
-                        case context::node:
-                            m_last_context = context::node;
-                            m_context = context::in_object;
-                            if (!strcmp(element, "tag")) {
-                                get_tag(m_node_builder.get(), attrs);
-                            }
-                            break;
-                        case context::way:
-                            m_last_context = context::way;
-                            m_context = context::in_object;
-                            if (!strcmp(element, "nd")) {
-                                m_tl_builder.reset();
-
-                                if (!m_wnl_builder) {
-                                    m_wnl_builder = std::unique_ptr<osmium::builder::WayNodeListBuilder>(new osmium::builder::WayNodeListBuilder(m_buffer, m_way_builder.get()));
-                                }
-
-                                check_attributes(attrs, [this](const XML_Char* name, const XML_Char* value) {
-                                    if (!strcmp(name, "ref")) {
-                                        m_wnl_builder->add_node_ref(osmium::string_to_object_id(value));
-                                    }
-                                });
-                            } else if (!strcmp(element, "tag")) {
-                                m_wnl_builder.reset();
-                                get_tag(m_way_builder.get(), attrs);
-                            }
-                            break;
-                        case context::relation:
-                            m_last_context = context::relation;
-                            m_context = context::in_object;
-                            if (!strcmp(element, "member")) {
-                                m_tl_builder.reset();
-
-                                if (!m_rml_builder) {
-                                    m_rml_builder = std::unique_ptr<osmium::builder::RelationMemberListBuilder>(new osmium::builder::RelationMemberListBuilder(m_buffer, m_relation_builder.get()));
-                                }
-
-                                item_type type = item_type::undefined;
-                                object_id_type ref = 0;
-                                const char* role = "";
-                                check_attributes(attrs, [&type, &ref, &role](const XML_Char* name, const XML_Char* value) {
-                                    if (!strcmp(name, "type")) {
-                                        type = char_to_item_type(value[0]);
-                                    } else if (!strcmp(name, "ref")) {
-                                        ref = osmium::string_to_object_id(value);
-                                    } else if (!strcmp(name, "role")) {
-                                        role = static_cast<const char*>(value);
-                                    }
-                                });
-                                if (type != item_type::node && type != item_type::way && type != item_type::relation) {
-                                    throw osmium::xml_error("Unknown type on relation member");
-                                }
-                                if (ref == 0) {
-                                    throw osmium::xml_error("Missing ref on relation member");
-                                }
-                                m_rml_builder->add_member(type, ref, role);
-                            } else if (!strcmp(element, "tag")) {
-                                m_rml_builder.reset();
-                                get_tag(m_relation_builder.get(), attrs);
-                            }
-                            break;
-                        case context::changeset:
-                            m_last_context = context::changeset;
-                            if (!strcmp(element, "discussion")) {
-                                m_context = context::discussion;
-                                m_tl_builder.reset();
-                                if (!m_changeset_discussion_builder) {
-                                    m_changeset_discussion_builder = std::unique_ptr<osmium::builder::ChangesetDiscussionBuilder>(new osmium::builder::ChangesetDiscussionBuilder(m_buffer, m_changeset_builder.get()));
-                                }
-                            } else if (!strcmp(element, "tag")) {
-                                m_context = context::in_object;
-                                m_changeset_discussion_builder.reset();
-                                get_tag(m_changeset_builder.get(), attrs);
-                            }
-                            break;
-                        case context::discussion:
-                            if (!strcmp(element, "comment")) {
-                                m_context = context::comment;
-                                osmium::Timestamp date;
-                                osmium::user_id_type uid = 0;
-                                const char* user = "";
-                                check_attributes(attrs, [&date, &uid, &user](const XML_Char* name, const XML_Char* value) {
-                                    if (!strcmp(name, "date")) {
-                                        date = osmium::Timestamp(value);
-                                    } else if (!strcmp(name, "uid")) {
-                                        uid = osmium::string_to_user_id(value);
-                                    } else if (!strcmp(name, "user")) {
-                                        user = static_cast<const char*>(value);
-                                    }
-                                });
-                                m_changeset_discussion_builder->add_comment(date, uid, user);
-                            }
-                            break;
-                        case context::comment:
-                            if (!strcmp(element, "text")) {
-                                m_context = context::comment_text;
-                            }
-                            break;
-                        case context::comment_text:
-                            break;
-                        case context::ignored_node:
-                            break;
-                        case context::ignored_way:
-                            break;
-                        case context::ignored_relation:
-                            break;
-                        case context::ignored_changeset:
-                            break;
-                        case context::in_object:
-                            assert(false); // should never be here
-                            break;
-                    }
-                }
-
-                void end_element(const XML_Char* element) {
-                    switch (m_context) {
-                        case context::root:
-                            assert(false); // should never be here
-                            break;
-                        case context::top:
-                            if (!strcmp(element, "osm") || !strcmp(element, "osmChange")) {
-                                mark_header_as_done();
-                                m_context = context::root;
-                            } else if (!strcmp(element, "delete")) {
-                                m_in_delete_section = false;
-                            }
-                            break;
-                        case context::node:
-                            assert(!strcmp(element, "node"));
-                            m_tl_builder.reset();
-                            m_node_builder.reset();
-                            m_buffer.commit();
-                            m_context = context::top;
-                            flush_buffer();
-                            break;
-                        case context::way:
-                            assert(!strcmp(element, "way"));
-                            m_tl_builder.reset();
-                            m_wnl_builder.reset();
-                            m_way_builder.reset();
-                            m_buffer.commit();
-                            m_context = context::top;
-                            flush_buffer();
-                            break;
-                        case context::relation:
-                            assert(!strcmp(element, "relation"));
-                            m_tl_builder.reset();
-                            m_rml_builder.reset();
-                            m_relation_builder.reset();
-                            m_buffer.commit();
-                            m_context = context::top;
-                            flush_buffer();
-                            break;
-                        case context::changeset:
-                            assert(!strcmp(element, "changeset"));
-                            m_tl_builder.reset();
-                            m_changeset_discussion_builder.reset();
-                            m_changeset_builder.reset();
-                            m_buffer.commit();
-                            m_context = context::top;
-                            flush_buffer();
-                            break;
-                        case context::discussion:
-                            assert(!strcmp(element, "discussion"));
-                            m_context = context::changeset;
-                            break;
-                        case context::comment:
-                            assert(!strcmp(element, "comment"));
-                            m_context = context::discussion;
-                            break;
-                        case context::comment_text:
-                            assert(!strcmp(element, "text"));
-                            m_context = context::comment;
-                            m_changeset_discussion_builder->add_comment_text(m_comment_text);
-                            break;
-                        case context::in_object:
-                            m_context = m_last_context;
-                            break;
-                        case context::ignored_node:
-                            if (!strcmp(element, "node")) {
-                                m_context = context::top;
-                            }
-                            break;
-                        case context::ignored_way:
-                            if (!strcmp(element, "way")) {
-                                m_context = context::top;
-                            }
-                            break;
-                        case context::ignored_relation:
-                            if (!strcmp(element, "relation")) {
-                                m_context = context::top;
-                            }
-                            break;
-                        case context::ignored_changeset:
-                            if (!strcmp(element, "changeset")) {
-                                m_context = context::top;
-                            }
-                            break;
-                    }
-                }
-
-                void characters(const XML_Char* text, int len) {
-                    if (m_context == context::comment_text) {
-                        m_comment_text.append(text, len);
-                    } else {
-                        m_comment_text.resize(0);
-                    }
-                }
-
-                void flush_buffer() {
-                    if (m_buffer.committed() > buffer_size / 10 * 9) {
-                        send_to_output_queue(std::move(m_buffer));
-                        osmium::memory::Buffer buffer(buffer_size);
-                        using std::swap;
-                        swap(m_buffer, buffer);
-                    }
-                }
-
-            public:
-
-                XMLParser(future_string_queue_type& input_queue,
-                          future_buffer_queue_type& output_queue,
-                          std::promise<osmium::io::Header>& header_promise,
-                          osmium::osm_entity_bits::type read_types) :
-                    Parser(input_queue, output_queue, header_promise, read_types),
-                    m_context(context::root),
-                    m_last_context(context::root),
-                    m_in_delete_section(false),
-                    m_header(),
-                    m_buffer(buffer_size),
-                    m_node_builder(),
-                    m_way_builder(),
-                    m_relation_builder(),
-                    m_changeset_builder(),
-                    m_changeset_discussion_builder(),
-                    m_tl_builder(),
-                    m_wnl_builder(),
-                    m_rml_builder() {
-                }
-
-                ~XMLParser() noexcept = default;
-
-                void run() override final {
-                    osmium::thread::set_thread_name("_osmium_xml_in");
-
-                    ExpatXMLParser<XMLParser> parser(this);
-
-                    while (!input_done()) {
-                        std::string data = get_input();
-                        parser(data, input_done());
-                        if (read_types() == osmium::osm_entity_bits::nothing && header_is_done()) {
-                            break;
-                        }
-                    }
-
-                    mark_header_as_done();
-
-                    if (m_buffer.committed() > 0) {
-                        send_to_output_queue(std::move(m_buffer));
-                    }
-                }
-
-            }; // class XMLParser
-
-            // we want the register_parser() function to run, setting
-            // the variable is only a side-effect, it will never be used
-            const bool registered_xml_parser = ParserFactory::instance().register_parser(
-                file_format::xml,
-                [](future_string_queue_type& input_queue,
-                    future_buffer_queue_type& output_queue,
-                    std::promise<osmium::io::Header>& header_promise,
-                    osmium::osm_entity_bits::type read_which_entities) {
-                    return std::unique_ptr<Parser>(new XMLParser(input_queue, output_queue, header_promise, read_which_entities));
-            });
-
-            // dummy function to silence the unused variable warning from above
-            inline bool get_registered_xml_parser() noexcept {
-                return registered_xml_parser;
-            }
-
-        } // namespace detail
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_XML_INPUT_FORMAT_HPP
diff --git a/contrib/libosmium/osmium/io/detail/xml_output_format.hpp b/contrib/libosmium/osmium/io/detail/xml_output_format.hpp
deleted file mode 100644
index b91b051..0000000
--- a/contrib/libosmium/osmium/io/detail/xml_output_format.hpp
+++ /dev/null
@@ -1,473 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_XML_OUTPUT_FORMAT_HPP
-#define OSMIUM_IO_DETAIL_XML_OUTPUT_FORMAT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <cinttypes>
-#include <cstddef>
-#include <cstdio>
-#include <future>
-#include <iterator>
-#include <memory>
-#include <string>
-#include <thread>
-#include <utility>
-
-#include <osmium/io/detail/output_format.hpp>
-#include <osmium/io/file.hpp>
-#include <osmium/io/file_format.hpp>
-#include <osmium/io/header.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/memory/collection.hpp>
-#include <osmium/osm/box.hpp>
-#include <osmium/osm/changeset.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/relation.hpp>
-#include <osmium/osm/tag.hpp>
-#include <osmium/osm/timestamp.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/osm/way.hpp>
-#include <osmium/thread/pool.hpp>
-#include <osmium/visitor.hpp>
-
-namespace osmium {
-
-    namespace io {
-
-        namespace detail {
-
-            struct XMLWriteError {};
-
-            struct xml_output_options {
-
-                /// Should metadata of objects be added?
-                bool add_metadata;
-
-                /// Should the visible flag be added to all OSM objects?
-                bool add_visible_flag;
-
-                /**
-                 * Should <create>, <modify>, <delete> "operations" be added?
-                 * (This is used for .osc files.)
-                 */
-                bool use_change_ops;
-
-            };
-
-            class XMLOutputBlock : public OutputBlock {
-
-                // operation (create, modify, delete) for osc files
-                enum class operation {
-                    op_none   = 0,
-                    op_create = 1,
-                    op_modify = 2,
-                    op_delete = 3
-                }; // enum class operation
-
-                operation m_last_op {operation::op_none};
-
-                xml_output_options m_options;
-
-                void write_spaces(int num) {
-                    for (; num != 0; --num) {
-                        *m_out += ' ';
-                    }
-                }
-
-                int prefix_spaces() {
-                    return m_options.use_change_ops ? 4 : 2;
-                }
-
-                void write_prefix() {
-                    write_spaces(prefix_spaces());
-                }
-
-                void write_meta(const osmium::OSMObject& object) {
-                    output_formatted(" id=\"%" PRId64 "\"", object.id());
-
-                    if (m_options.add_metadata) {
-                        if (object.version()) {
-                            output_formatted(" version=\"%d\"", object.version());
-                        }
-
-                        if (object.timestamp()) {
-                            *m_out += " timestamp=\"";
-                            *m_out += object.timestamp().to_iso();
-                            *m_out += "\"";
-                        }
-
-                        if (!object.user_is_anonymous()) {
-                            output_formatted(" uid=\"%d\" user=\"", object.uid());
-                            append_xml_encoded_string(*m_out, object.user());
-                            *m_out += "\"";
-                        }
-
-                        if (object.changeset()) {
-                            output_formatted(" changeset=\"%d\"", object.changeset());
-                        }
-
-                        if (m_options.add_visible_flag) {
-                            if (object.visible()) {
-                                *m_out += " visible=\"true\"";
-                            } else {
-                                *m_out += " visible=\"false\"";
-                            }
-                        }
-                    }
-                }
-
-                void write_tags(const osmium::TagList& tags, int spaces) {
-                    for (const auto& tag : tags) {
-                        write_spaces(spaces);
-                        *m_out += "  <tag k=\"";
-                        append_xml_encoded_string(*m_out, tag.key());
-                        *m_out += "\" v=\"";
-                        append_xml_encoded_string(*m_out, tag.value());
-                        *m_out += "\"/>\n";
-                    }
-                }
-
-                void write_discussion(const osmium::ChangesetDiscussion& comments) {
-                    for (const auto& comment : comments) {
-                        output_formatted("   <comment uid=\"%d\" user=\"", comment.uid());
-                        append_xml_encoded_string(*m_out, comment.user());
-                        *m_out += "\" date=\"";
-                        *m_out += comment.date().to_iso();
-                        *m_out += "\">\n";
-                        *m_out += "    <text>";
-                        append_xml_encoded_string(*m_out, comment.text());
-                        *m_out += "</text>\n   </comment>\n";
-                    }
-                    *m_out += "  </discussion>\n";
-                }
-
-                void open_close_op_tag(const operation op = operation::op_none) {
-                    if (op == m_last_op) {
-                        return;
-                    }
-
-                    switch (m_last_op) {
-                        case operation::op_none:
-                            break;
-                        case operation::op_create:
-                            *m_out += "  </create>\n";
-                            break;
-                        case operation::op_modify:
-                            *m_out += "  </modify>\n";
-                            break;
-                        case operation::op_delete:
-                            *m_out += "  </delete>\n";
-                            break;
-                    }
-
-                    switch (op) {
-                        case operation::op_none:
-                            break;
-                        case operation::op_create:
-                            *m_out += "  <create>\n";
-                            break;
-                        case operation::op_modify:
-                            *m_out += "  <modify>\n";
-                            break;
-                        case operation::op_delete:
-                            *m_out += "  <delete>\n";
-                            break;
-                    }
-
-                    m_last_op = op;
-                }
-
-            public:
-
-                XMLOutputBlock(osmium::memory::Buffer&& buffer, const xml_output_options& options) :
-                    OutputBlock(std::move(buffer)),
-                    m_options(options) {
-                }
-
-                XMLOutputBlock(const XMLOutputBlock&) = default;
-                XMLOutputBlock& operator=(const XMLOutputBlock&) = default;
-
-                XMLOutputBlock(XMLOutputBlock&&) = default;
-                XMLOutputBlock& operator=(XMLOutputBlock&&) = default;
-
-                ~XMLOutputBlock() noexcept = default;
-
-                std::string operator()() {
-                    osmium::apply(m_input_buffer->cbegin(), m_input_buffer->cend(), *this);
-
-                    if (m_options.use_change_ops) {
-                        open_close_op_tag();
-                    }
-
-                    std::string out;
-                    using std::swap;
-                    swap(out, *m_out);
-
-                    return out;
-                }
-
-                void node(const osmium::Node& node) {
-                    if (m_options.use_change_ops) {
-                        open_close_op_tag(node.visible() ? (node.version() == 1 ? operation::op_create : operation::op_modify) : operation::op_delete);
-                    }
-
-                    write_prefix();
-                    *m_out += "<node";
-
-                    write_meta(node);
-
-                    if (node.location()) {
-                        *m_out += " lat=\"";
-                        osmium::util::double2string(std::back_inserter(*m_out), node.location().lat_without_check(), 7);
-                        *m_out += "\" lon=\"";
-                        osmium::util::double2string(std::back_inserter(*m_out), node.location().lon_without_check(), 7);
-                        *m_out += "\"";
-                    }
-
-                    if (node.tags().empty()) {
-                        *m_out += "/>\n";
-                        return;
-                    }
-
-                    *m_out += ">\n";
-
-                    write_tags(node.tags(), prefix_spaces());
-
-                    write_prefix();
-                    *m_out += "</node>\n";
-                }
-
-                void way(const osmium::Way& way) {
-                    if (m_options.use_change_ops) {
-                        open_close_op_tag(way.visible() ? (way.version() == 1 ? operation::op_create : operation::op_modify) : operation::op_delete);
-                    }
-
-                    write_prefix();
-                    *m_out += "<way";
-                    write_meta(way);
-
-                    if (way.tags().empty() && way.nodes().empty()) {
-                        *m_out += "/>\n";
-                        return;
-                    }
-
-                    *m_out += ">\n";
-
-                    for (const auto& node_ref : way.nodes()) {
-                        write_prefix();
-                        output_formatted("  <nd ref=\"%" PRId64 "\"/>\n", node_ref.ref());
-                    }
-
-                    write_tags(way.tags(), prefix_spaces());
-
-                    write_prefix();
-                    *m_out += "</way>\n";
-                }
-
-                void relation(const osmium::Relation& relation) {
-                    if (m_options.use_change_ops) {
-                        open_close_op_tag(relation.visible() ? (relation.version() == 1 ? operation::op_create : operation::op_modify) : operation::op_delete);
-                    }
-
-                    write_prefix();
-                    *m_out += "<relation";
-                    write_meta(relation);
-
-                    if (relation.tags().empty() && relation.members().empty()) {
-                        *m_out += "/>\n";
-                        return;
-                    }
-
-                    *m_out += ">\n";
-
-                    for (const auto& member : relation.members()) {
-                        write_prefix();
-                        *m_out += "  <member type=\"";
-                        *m_out += item_type_to_name(member.type());
-                        output_formatted("\" ref=\"%" PRId64 "\" role=\"", member.ref());
-                        append_xml_encoded_string(*m_out, member.role());
-                        *m_out += "\"/>\n";
-                    }
-
-                    write_tags(relation.tags(), prefix_spaces());
-
-                    write_prefix();
-                    *m_out += "</relation>\n";
-                }
-
-                void changeset(const osmium::Changeset& changeset) {
-                    *m_out += " <changeset";
-
-                    output_formatted(" id=\"%" PRId32 "\"", changeset.id());
-
-                    if (changeset.created_at()) {
-                        *m_out += " created_at=\"";
-                        *m_out += changeset.created_at().to_iso();
-                        *m_out += "\"";
-                    }
-
-                    if (changeset.closed_at()) {
-                        *m_out += " closed_at=\"";
-                        *m_out += changeset.closed_at().to_iso();
-                        *m_out += "\" open=\"false\"";
-                    } else {
-                        *m_out += " open=\"true\"";
-                    }
-
-                    if (!changeset.user_is_anonymous()) {
-                        *m_out += " user=\"";
-                        append_xml_encoded_string(*m_out, changeset.user());
-                        output_formatted("\" uid=\"%d\"", changeset.uid());
-                    }
-
-                    if (changeset.bounds()) {
-                        output_formatted(" min_lat=\"%.7f\"", changeset.bounds().bottom_left().lat_without_check());
-                        output_formatted(" min_lon=\"%.7f\"", changeset.bounds().bottom_left().lon_without_check());
-                        output_formatted(" max_lat=\"%.7f\"", changeset.bounds().top_right().lat_without_check());
-                        output_formatted(" max_lon=\"%.7f\"", changeset.bounds().top_right().lon_without_check());
-                    }
-
-                    output_formatted(" num_changes=\"%" PRId32 "\"", changeset.num_changes());
-                    output_formatted(" comments_count=\"%" PRId32 "\"", changeset.num_comments());
-
-                    // If there are no tags and no comments, we can close the
-                    // tag right here and are done.
-                    if (changeset.tags().empty() && changeset.num_comments() == 0) {
-                        *m_out += "/>\n";
-                        return;
-                    }
-
-                    *m_out += ">\n";
-
-                    write_tags(changeset.tags(), 0);
-
-                    if (changeset.num_comments() > 0) {
-                        *m_out += "  <discussion>\n";
-                        write_discussion(changeset.discussion());
-                    }
-
-                    *m_out += " </changeset>\n";
-                }
-
-            }; // class XMLOutputBlock
-
-            class XMLOutputFormat : public osmium::io::detail::OutputFormat, public osmium::handler::Handler {
-
-                xml_output_options m_options;
-
-            public:
-
-                XMLOutputFormat(const osmium::io::File& file, future_string_queue_type& output_queue) :
-                    OutputFormat(output_queue),
-                    m_options() {
-                    m_options.add_metadata     = file.is_not_false("add_metadata");
-                    m_options.use_change_ops   = file.is_true("xml_change_format");
-                    m_options.add_visible_flag = (file.has_multiple_object_versions() || file.is_true("force_visible_flag")) && !m_options.use_change_ops;
-                }
-
-                XMLOutputFormat(const XMLOutputFormat&) = delete;
-                XMLOutputFormat& operator=(const XMLOutputFormat&) = delete;
-
-                ~XMLOutputFormat() noexcept = default;
-
-                void write_header(const osmium::io::Header& header) override final {
-                    std::string out = "<?xml version='1.0' encoding='UTF-8'?>\n";
-
-                    if (m_options.use_change_ops) {
-                        out += "<osmChange version=\"0.6\" generator=\"";
-                    } else {
-                        out += "<osm version=\"0.6\"";
-
-                        std::string xml_josm_upload = header.get("xml_josm_upload");
-                        if (xml_josm_upload == "true" || xml_josm_upload == "false") {
-                            out += " upload=\"";
-                            out += xml_josm_upload;
-                            out += "\"";
-                        }
-                        out += " generator=\"";
-                    }
-                    append_xml_encoded_string(out, header.get("generator").c_str());
-                    out += "\">\n";
-
-                    for (const auto& box : header.boxes()) {
-                        out += "  <bounds";
-                        append_printf_formatted_string(out, " minlon=\"%.7f\"", box.bottom_left().lon());
-                        append_printf_formatted_string(out, " minlat=\"%.7f\"", box.bottom_left().lat());
-                        append_printf_formatted_string(out, " maxlon=\"%.7f\"", box.top_right().lon());
-                        append_printf_formatted_string(out, " maxlat=\"%.7f\"/>\n", box.top_right().lat());
-                    }
-
-                    send_to_output_queue(std::move(out));
-                }
-
-                void write_buffer(osmium::memory::Buffer&& buffer) override final {
-                    m_output_queue.push(osmium::thread::Pool::instance().submit(XMLOutputBlock{std::move(buffer), m_options}));
-                }
-
-                void write_end() override final {
-                    std::string out;
-
-                    if (m_options.use_change_ops) {
-                        out += "</osmChange>\n";
-                    } else {
-                        out += "</osm>\n";
-                    }
-
-                    send_to_output_queue(std::move(out));
-                }
-
-            }; // class XMLOutputFormat
-
-            // we want the register_output_format() function to run, setting
-            // the variable is only a side-effect, it will never be used
-            const bool registered_xml_output = osmium::io::detail::OutputFormatFactory::instance().register_output_format(osmium::io::file_format::xml,
-                [](const osmium::io::File& file, future_string_queue_type& output_queue) {
-                    return new osmium::io::detail::XMLOutputFormat(file, output_queue);
-            });
-
-            // dummy function to silence the unused variable warning from above
-            inline bool get_registered_xml_output() noexcept {
-                return registered_xml_output;
-            }
-
-        } // namespace detail
-
-    } // namespace output
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_XML_OUTPUT_FORMAT_HPP
diff --git a/contrib/libosmium/osmium/io/detail/zlib.hpp b/contrib/libosmium/osmium/io/detail/zlib.hpp
deleted file mode 100644
index 4d86168..0000000
--- a/contrib/libosmium/osmium/io/detail/zlib.hpp
+++ /dev/null
@@ -1,115 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_ZLIB_HPP
-#define OSMIUM_IO_DETAIL_ZLIB_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <memory>
-#include <stdexcept>
-#include <string>
-
-#include <zlib.h>
-
-#include <osmium/io/error.hpp>
-#include <osmium/util/cast.hpp>
-
-namespace osmium {
-
-    namespace io {
-
-        namespace detail {
-
-            /**
-             * Compress data using zlib.
-             *
-             * Note that this function can not compress data larger than
-             * what fits in an unsigned long, on Windows this is usually 32bit.
-             *
-             * @param input Data to compress.
-             * @returns Compressed data.
-             */
-            inline std::string zlib_compress(const std::string& input) {
-                unsigned long output_size = ::compressBound(osmium::static_cast_with_assert<unsigned long>(input.size()));
-
-                std::string output(output_size, '\0');
-
-                auto result = ::compress(
-                    reinterpret_cast<unsigned char*>(const_cast<char *>(output.data())),
-                    &output_size,
-                    reinterpret_cast<const unsigned char*>(input.data()),
-                    osmium::static_cast_with_assert<unsigned long>(input.size())
-                );
-
-                if (result != Z_OK) {
-                    throw io_error(std::string("failed to compress data: ") + zError(result));
-                }
-
-                output.resize(output_size);
-
-                return output;
-            }
-
-            /**
-             * Uncompress data using zlib.
-             *
-             * Note that this function can not uncompress data larger than
-             * what fits in an unsigned long, on Windows this is usually 32bit.
-             *
-             * @param input Compressed input data.
-             * @param raw_size Size of uncompressed data.
-             * @param output Uncompressed result data.
-             * @returns Pointer and size to incompressed data.
-             */
-            inline std::pair<const char*, size_t> zlib_uncompress_string(const char* input, unsigned long input_size, unsigned long raw_size, std::string& output) {
-                output.resize(raw_size);
-
-                auto result = ::uncompress(
-                    reinterpret_cast<unsigned char*>(&*output.begin()),
-                    &raw_size,
-                    reinterpret_cast<const unsigned char*>(input),
-                    input_size
-                );
-
-                if (result != Z_OK) {
-                    throw io_error(std::string("failed to uncompress data: ") + zError(result));
-                }
-
-                return std::make_pair(output.data(), output.size());
-            }
-
-        } // namespace detail
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_ZLIB_HPP
diff --git a/contrib/libosmium/osmium/io/error.hpp b/contrib/libosmium/osmium/io/error.hpp
deleted file mode 100644
index 0b5393f..0000000
--- a/contrib/libosmium/osmium/io/error.hpp
+++ /dev/null
@@ -1,70 +0,0 @@
-#ifndef OSMIUM_IO_ERROR_HPP
-#define OSMIUM_IO_ERROR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <stdexcept>
-#include <string>
-
-namespace osmium {
-
-    /**
-     * Exception thrown when some kind of input/output operation failed.
-     */
-    struct io_error : public std::runtime_error {
-
-        io_error(const std::string& what) :
-            std::runtime_error(what) {
-        }
-
-        io_error(const char* what) :
-            std::runtime_error(what) {
-        }
-
-    }; // struct io_error
-
-    struct unsupported_file_format_error : public io_error {
-
-        unsupported_file_format_error(const std::string& what) :
-            io_error(what) {
-        }
-
-        unsupported_file_format_error(const char* what) :
-            io_error(what) {
-        }
-
-    }; // struct unsupported_file_format_error
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_ERROR_HPP
diff --git a/contrib/libosmium/osmium/io/file.hpp b/contrib/libosmium/osmium/io/file.hpp
deleted file mode 100644
index 87fcc37..0000000
--- a/contrib/libosmium/osmium/io/file.hpp
+++ /dev/null
@@ -1,328 +0,0 @@
-#ifndef OSMIUM_IO_FILE_HPP
-#define OSMIUM_IO_FILE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstddef>
-#include <stdexcept>
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include <osmium/io/error.hpp>
-#include <osmium/io/file_format.hpp>
-#include <osmium/io/file_compression.hpp>
-#include <osmium/util/options.hpp>
-#include <osmium/util/compatibility.hpp>
-
-namespace osmium {
-
-    /**
-     * @brief Everything related to input and output of OSM data.
-     */
-    namespace io {
-
-        namespace detail {
-
-            inline std::vector<std::string> split(const std::string& in, const char delim) {
-                std::vector<std::string> result;
-                std::stringstream ss(in);
-                std::string item;
-                while (std::getline(ss, item, delim)) {
-                    result.push_back(item);
-                }
-                return result;
-            }
-
-        } // namespace detail
-
-        /**
-         * This class describes an OSM file in one of several different formats.
-         *
-         * If the filename is empty or "-", this means stdin or stdout is used.
-         */
-        class File : public osmium::util::Options {
-
-        private:
-
-            std::string m_filename;
-
-            const char* m_buffer;
-            size_t m_buffer_size;
-
-            std::string m_format_string;
-
-            file_format m_file_format {file_format::unknown};
-
-            file_compression m_file_compression {file_compression::none};
-
-            bool m_has_multiple_object_versions {false};
-
-        public:
-
-            /**
-             * Create File using type and encoding from filename or given
-             * format specification.
-             *
-             * @param filename Filename including suffix. The type and encoding
-             *                 of the file will be taken from the suffix.
-             *                 An empty filename or "-" means stdin or stdout.
-             * @param format File format as string. See the description of the
-             *               parse_format() function for details. If this is
-             *               empty the format will be deduced from the suffix
-             *               of the filename.
-             */
-            explicit File(const std::string& filename = "", const std::string& format = "") :
-                Options(),
-                m_filename(filename),
-                m_buffer(nullptr),
-                m_buffer_size(0),
-                m_format_string(format) {
-
-                // stdin/stdout
-                if (m_filename == "-") {
-                    m_filename = "";
-                }
-
-                // if filename is a URL, default to XML format
-                std::string protocol = m_filename.substr(0, m_filename.find_first_of(':'));
-                if (protocol == "http" || protocol == "https") {
-                    m_file_format = file_format::xml;
-                }
-
-                if (format.empty()) {
-                    detect_format_from_suffix(m_filename);
-                } else {
-                    parse_format(format);
-                }
-            }
-
-            /**
-             * Create File using buffer pointer and size and type and encoding
-             * from given format specification.
-             *
-             * @param buffer Pointer to buffer with data.
-             * @param size   Size of buffer.
-             * @param format File format as string. See the description of the
-             *               parse_format() function for details.
-             */
-            explicit File(const char* buffer, size_t size, const std::string& format = "") :
-                Options(),
-                m_filename(),
-                m_buffer(buffer),
-                m_buffer_size(size),
-                m_format_string(format) {
-                if (format != "") {
-                    parse_format(format);
-                }
-            }
-
-            File(const File&) = default;
-            File& operator=(const File&) = default;
-
-            File(File&&) = default;
-            File& operator=(File&&) = default;
-
-            ~File() = default;
-
-            const char* buffer() const noexcept {
-                return m_buffer;
-            }
-
-            size_t buffer_size() const noexcept {
-                return m_buffer_size;
-            }
-
-            void parse_format(const std::string& format) {
-                std::vector<std::string> options = detail::split(format, ',');
-
-                // if the first item in the format list doesn't contain
-                // an equals sign, it is a format
-                if (!options.empty() && options[0].find_first_of('=') == std::string::npos) {
-                    detect_format_from_suffix(options[0]);
-                    options.erase(options.begin());
-                }
-
-                for (auto& option : options) {
-                    size_t pos = option.find_first_of('=');
-                    if (pos == std::string::npos) {
-                        set(option, true);
-                    } else {
-                        std::string value = option.substr(pos+1);
-                        option.erase(pos);
-                        set(option, value);
-                    }
-                }
-
-                if (get("history") == "true") {
-                    m_has_multiple_object_versions = true;
-                } else if (get("history") == "false") {
-                    m_has_multiple_object_versions = false;
-                }
-            }
-
-            void detect_format_from_suffix(const std::string& name) {
-                std::vector<std::string> suffixes = detail::split(name, '.');
-
-                if (suffixes.empty()) return;
-
-                // if the last suffix is one of a known set of compressions,
-                // set that compression
-                if (suffixes.back() == "gz") {
-                    m_file_compression = file_compression::gzip;
-                    suffixes.pop_back();
-                } else if (suffixes.back() == "bz2") {
-                    m_file_compression = file_compression::bzip2;
-                    suffixes.pop_back();
-                }
-
-                if (suffixes.empty()) return;
-
-                // if the last suffix is one of a known set of formats,
-                // set that format
-                if (suffixes.back() == "pbf") {
-                    m_file_format = file_format::pbf;
-                    suffixes.pop_back();
-                } else if (suffixes.back() == "xml") {
-                    m_file_format = file_format::xml;
-                    suffixes.pop_back();
-                } else if (suffixes.back() == "opl") {
-                    m_file_format = file_format::opl;
-                    suffixes.pop_back();
-                } else if (suffixes.back() == "json") {
-                    m_file_format = file_format::json;
-                    suffixes.pop_back();
-                } else if (suffixes.back() == "o5m") {
-                    m_file_format = file_format::o5m;
-                    suffixes.pop_back();
-                } else if (suffixes.back() == "o5c") {
-                    m_file_format = file_format::o5m;
-                    m_has_multiple_object_versions = true;
-                    set("o5c_change_format", true);
-                    suffixes.pop_back();
-                } else if (suffixes.back() == "debug") {
-                    m_file_format = file_format::debug;
-                    suffixes.pop_back();
-                }
-
-                if (suffixes.empty()) return;
-
-                if (suffixes.back() == "osm") {
-                    if (m_file_format == file_format::unknown) m_file_format = file_format::xml;
-                    suffixes.pop_back();
-                } else if (suffixes.back() == "osh") {
-                    if (m_file_format == file_format::unknown) m_file_format = file_format::xml;
-                    m_has_multiple_object_versions = true;
-                    suffixes.pop_back();
-                } else if (suffixes.back() == "osc") {
-                    if (m_file_format == file_format::unknown) m_file_format = file_format::xml;
-                    m_has_multiple_object_versions = true;
-                    set("xml_change_format", true);
-                    suffixes.pop_back();
-                }
-            }
-
-            /**
-             * Check file format etc. for consistency and throw exception if
-             * there is a problem.
-             *
-             * @throws osmium::io_error
-             */
-            const File& check() const {
-                if (m_file_format == file_format::unknown) {
-                    std::string msg = "Could not detect file format";
-                    if (!m_format_string.empty())  {
-                        msg += " from format string '";
-                        msg += m_format_string;
-                        msg += "'";
-                    }
-                    if (m_filename.empty()) {
-                        msg += " for stdin/stdout";
-                    } else {
-                        msg += " for filename '";
-                        msg += m_filename;
-                        msg += "'";
-                    }
-                    msg += ".";
-                    throw io_error(msg);
-                }
-                return *this;
-            }
-
-            file_format format() const noexcept {
-                return m_file_format;
-            }
-
-            File& set_format(file_format format) noexcept {
-                m_file_format = format;
-                return *this;
-            }
-
-            file_compression compression() const noexcept {
-                return m_file_compression;
-            }
-
-            File& set_compression(file_compression compression) noexcept {
-                m_file_compression = compression;
-                return *this;
-            }
-
-            bool has_multiple_object_versions() const noexcept {
-                return m_has_multiple_object_versions;
-            }
-
-            File& set_has_multiple_object_versions(bool value) noexcept {
-                m_has_multiple_object_versions = value;
-                return *this;
-            }
-
-            File& filename(const std::string& filename) {
-                if (filename == "-") {
-                    m_filename = "";
-                } else {
-                    m_filename = filename;
-                }
-                return *this;
-            }
-
-            const std::string& filename() const noexcept {
-                return m_filename;
-            }
-
-        }; // class File
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_FILE_HPP
diff --git a/contrib/libosmium/osmium/io/file_compression.hpp b/contrib/libosmium/osmium/io/file_compression.hpp
deleted file mode 100644
index 292ddcf..0000000
--- a/contrib/libosmium/osmium/io/file_compression.hpp
+++ /dev/null
@@ -1,72 +0,0 @@
-#ifndef OSMIUM_IO_FILE_COMPRESSION_HPP
-#define OSMIUM_IO_FILE_COMPRESSION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <iosfwd>
-
-namespace osmium {
-
-    namespace io {
-
-        enum class file_compression {
-            none  = 0,
-            gzip  = 1,
-            bzip2 = 2
-        };
-
-// avoid g++ false positive
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wreturn-type"
-        inline const char* as_string(file_compression compression) {
-            switch (compression) {
-                case file_compression::none:
-                    return "none";
-                case file_compression::gzip:
-                    return "gzip";
-                case file_compression::bzip2:
-                    return "bzip2";
-            }
-        }
-#pragma GCC diagnostic pop
-
-        template <typename TChar, typename TTraits>
-        inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const file_compression compression) {
-            return out << as_string(compression);
-        }
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_FILE_COMPRESSION_HPP
diff --git a/contrib/libosmium/osmium/io/file_format.hpp b/contrib/libosmium/osmium/io/file_format.hpp
deleted file mode 100644
index edfb1ff..0000000
--- a/contrib/libosmium/osmium/io/file_format.hpp
+++ /dev/null
@@ -1,84 +0,0 @@
-#ifndef OSMIUM_IO_FILE_FORMAT_HPP
-#define OSMIUM_IO_FILE_FORMAT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <iosfwd>
-
-namespace osmium {
-
-    namespace io {
-
-        enum class file_format {
-            unknown = 0,
-            xml     = 1,
-            pbf     = 2,
-            opl     = 3,
-            json    = 4,
-            o5m     = 5,
-            debug   = 6
-        };
-
-// avoid g++ false positive
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wreturn-type"
-        inline const char* as_string(file_format format) {
-            switch (format) {
-                case file_format::unknown:
-                    return "unknown";
-                case file_format::xml:
-                    return "XML";
-                case file_format::pbf:
-                    return "PBF";
-                case file_format::opl:
-                    return "OPL";
-                case file_format::json:
-                    return "JSON";
-                case file_format::o5m:
-                    return "O5M";
-                case file_format::debug:
-                    return "DEBUG";
-            }
-        }
-#pragma GCC diagnostic pop
-
-        template <typename TChar, typename TTraits>
-        inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const file_format format) {
-            return out << as_string(format);
-        }
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_FILE_FORMAT_HPP
diff --git a/contrib/libosmium/osmium/io/gzip_compression.hpp b/contrib/libosmium/osmium/io/gzip_compression.hpp
deleted file mode 100644
index 705f416..0000000
--- a/contrib/libosmium/osmium/io/gzip_compression.hpp
+++ /dev/null
@@ -1,277 +0,0 @@
-#ifndef OSMIUM_IO_GZIP_COMPRESSION_HPP
-#define OSMIUM_IO_GZIP_COMPRESSION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-/**
- * @file
- *
- * Include this file if you want to read or write gzip-compressed OSM XML
- * files.
- *
- * @attention If you include this file, you'll need to link with `libz`.
- */
-
-#include <stdexcept>
-#include <string>
-
-#include <errno.h>
-#include <zlib.h>
-
-#include <osmium/io/compression.hpp>
-#include <osmium/io/error.hpp>
-#include <osmium/io/file_compression.hpp>
-#include <osmium/io/writer_options.hpp>
-#include <osmium/util/cast.hpp>
-#include <osmium/util/compatibility.hpp>
-
-namespace osmium {
-
-    /**
-     * Exception thrown when there are problems compressing or
-     * decompressing gzip files.
-     */
-    struct gzip_error : public io_error {
-
-        int gzip_error_code;
-        int system_errno;
-
-        gzip_error(const std::string& what, int error_code) :
-            io_error(what),
-            gzip_error_code(error_code),
-            system_errno(error_code == Z_ERRNO ? errno : 0) {
-        }
-
-    }; // struct gzip_error
-
-    namespace io {
-
-        namespace detail {
-
-            OSMIUM_NORETURN inline void throw_gzip_error(gzFile gzfile, const char* msg, int zlib_error = 0) {
-                std::string error("gzip error: ");
-                error += msg;
-                error += ": ";
-                int errnum = zlib_error;
-                if (zlib_error) {
-                    error += std::to_string(zlib_error);
-                } else {
-                    error += ::gzerror(gzfile, &errnum);
-                }
-                throw osmium::gzip_error(error, errnum);
-            }
-
-        } // namespace detail
-
-        class GzipCompressor : public Compressor {
-
-            int m_fd;
-            gzFile m_gzfile;
-
-        public:
-
-            explicit GzipCompressor(int fd, fsync sync) :
-                Compressor(sync),
-                m_fd(dup(fd)),
-                m_gzfile(::gzdopen(fd, "w")) {
-                if (!m_gzfile) {
-                    detail::throw_gzip_error(m_gzfile, "write initialization failed");
-                }
-            }
-
-            ~GzipCompressor() noexcept override final {
-                try {
-                    close();
-                } catch (...) {
-                    // Ignore any exceptions because destructor must not throw.
-                }
-            }
-
-            void write(const std::string& data) override final {
-                if (!data.empty()) {
-                    int nwrite = ::gzwrite(m_gzfile, data.data(), static_cast_with_assert<unsigned int>(data.size()));
-                    if (nwrite == 0) {
-                        detail::throw_gzip_error(m_gzfile, "write failed");
-                    }
-                }
-            }
-
-            void close() override final {
-                if (m_gzfile) {
-                    int result = ::gzclose(m_gzfile);
-                    m_gzfile = nullptr;
-                    if (result != Z_OK) {
-                        detail::throw_gzip_error(m_gzfile, "write close failed", result);
-                    }
-                    if (do_fsync()) {
-                        osmium::io::detail::reliable_fsync(m_fd);
-                    }
-                    osmium::io::detail::reliable_close(m_fd);
-                }
-            }
-
-        }; // class GzipCompressor
-
-        class GzipDecompressor : public Decompressor {
-
-            gzFile m_gzfile;
-
-        public:
-
-            explicit GzipDecompressor(int fd) :
-                Decompressor(),
-                m_gzfile(::gzdopen(fd, "r")) {
-                if (!m_gzfile) {
-                    detail::throw_gzip_error(m_gzfile, "read initialization failed");
-                }
-            }
-
-            ~GzipDecompressor() noexcept override final {
-                try {
-                    close();
-                } catch (...) {
-                    // Ignore any exceptions because destructor must not throw.
-                }
-            }
-
-            std::string read() override final {
-                std::string buffer(osmium::io::Decompressor::input_buffer_size, '\0');
-                int nread = ::gzread(m_gzfile, const_cast<char*>(buffer.data()), static_cast_with_assert<unsigned int>(buffer.size()));
-                if (nread < 0) {
-                    detail::throw_gzip_error(m_gzfile, "read failed");
-                }
-                buffer.resize(static_cast<std::string::size_type>(nread));
-                return buffer;
-            }
-
-            void close() override final {
-                if (m_gzfile) {
-                    int result = ::gzclose(m_gzfile);
-                    m_gzfile = nullptr;
-                    if (result != Z_OK) {
-                        detail::throw_gzip_error(m_gzfile, "read close failed", result);
-                    }
-                }
-            }
-
-        }; // class GzipDecompressor
-
-        class GzipBufferDecompressor : public Decompressor {
-
-            const char* m_buffer;
-            size_t m_buffer_size;
-            z_stream m_zstream;
-
-        public:
-
-            GzipBufferDecompressor(const char* buffer, size_t size) :
-                m_buffer(buffer),
-                m_buffer_size(size),
-                m_zstream() {
-                m_zstream.next_in = reinterpret_cast<unsigned char*>(const_cast<char*>(buffer));
-                m_zstream.avail_in = static_cast_with_assert<unsigned int>(size);
-                int result = inflateInit2(&m_zstream, MAX_WBITS | 32);
-                if (result != Z_OK) {
-                    std::string message("gzip error: decompression init failed: ");
-                    if (m_zstream.msg) {
-                        message.append(m_zstream.msg);
-                    }
-                    throw osmium::gzip_error(message, result);
-                }
-            }
-
-            ~GzipBufferDecompressor() noexcept override final {
-                try {
-                    close();
-                } catch (...) {
-                    // Ignore any exceptions because destructor must not throw.
-                }
-            }
-
-            std::string read() override final {
-                std::string output;
-
-                if (m_buffer) {
-                    const size_t buffer_size = 10240;
-                    output.append(buffer_size, '\0');
-                    m_zstream.next_out = reinterpret_cast<unsigned char*>(const_cast<char*>(output.data()));
-                    m_zstream.avail_out = buffer_size;
-                    int result = inflate(&m_zstream, Z_SYNC_FLUSH);
-
-                    if (result != Z_OK) {
-                        m_buffer = nullptr;
-                        m_buffer_size = 0;
-                    }
-
-                    if (result != Z_OK && result != Z_STREAM_END) {
-                        std::string message("gzip error: inflate failed: ");
-                        if (m_zstream.msg) {
-                            message.append(m_zstream.msg);
-                        }
-                        throw osmium::gzip_error(message, result);
-                    }
-
-                    output.resize(static_cast<unsigned long>(m_zstream.next_out - reinterpret_cast<const unsigned char*>(output.data())));
-                }
-
-                return output;
-            }
-
-            void close() override final {
-                inflateEnd(&m_zstream);
-            }
-
-        }; // class GzipBufferDecompressor
-
-        namespace detail {
-
-            // we want the register_compression() function to run, setting
-            // the variable is only a side-effect, it will never be used
-            const bool registered_gzip_compression = osmium::io::CompressionFactory::instance().register_compression(osmium::io::file_compression::gzip,
-                [](int fd, fsync sync) { return new osmium::io::GzipCompressor(fd, sync); },
-                [](int fd) { return new osmium::io::GzipDecompressor(fd); },
-                [](const char* buffer, size_t size) { return new osmium::io::GzipBufferDecompressor(buffer, size); }
-            );
-
-            // dummy function to silence the unused variable warning from above
-            inline bool get_registered_gzip_compression() noexcept {
-                return registered_gzip_compression;
-            }
-
-        } // namespace detail
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_GZIP_COMPRESSION_HPP
diff --git a/contrib/libosmium/osmium/io/header.hpp b/contrib/libosmium/osmium/io/header.hpp
deleted file mode 100644
index 4b0830a..0000000
--- a/contrib/libosmium/osmium/io/header.hpp
+++ /dev/null
@@ -1,122 +0,0 @@
-#ifndef OSMIUM_IO_HEADER_HPP
-#define OSMIUM_IO_HEADER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <initializer_list>
-#include <vector>
-
-#include <osmium/osm/box.hpp>
-#include <osmium/util/options.hpp>
-
-namespace osmium {
-
-    namespace io {
-
-        /**
-        * Meta information from the header of an OSM file.
-        */
-        class Header : public osmium::util::Options {
-
-            /// Bounding boxes
-            std::vector<osmium::Box> m_boxes;
-
-            /**
-            * Are there possibly multiple versions of the same object in this stream of objects?
-            * This is true for history files and for change files, but not for normal OSM files.
-            */
-            bool m_has_multiple_object_versions = false;
-
-        public:
-
-            Header() = default;
-
-            explicit Header(const std::initializer_list<osmium::util::Options::value_type>& values) :
-                Options(values) {
-            }
-
-            Header(const Header&) = default;
-            Header& operator=(const Header&) = default;
-
-            Header(Header&&) = default;
-            Header& operator=(Header&&) = default;
-
-            ~Header() = default;
-
-            std::vector<osmium::Box>& boxes() noexcept {
-                return m_boxes;
-            }
-
-            const std::vector<osmium::Box>& boxes() const noexcept {
-                return m_boxes;
-            }
-
-            Header& boxes(const std::vector<osmium::Box>& boxes) noexcept {
-                m_boxes = boxes;
-                return *this;
-            }
-
-            osmium::Box box() const {
-                return m_boxes.empty() ? osmium::Box() : m_boxes.front();
-            }
-
-            osmium::Box joined_boxes() const {
-                osmium::Box box;
-                for (const auto& b : m_boxes) {
-                    box.extend(b.bottom_left());
-                    box.extend(b.top_right());
-                }
-                return box;
-            }
-
-            Header& add_box(const osmium::Box& box) {
-                m_boxes.push_back(box);
-                return *this;
-            }
-
-            bool has_multiple_object_versions() const noexcept {
-                return m_has_multiple_object_versions;
-            }
-
-            Header& set_has_multiple_object_versions(bool value) noexcept {
-                m_has_multiple_object_versions = value;
-                return *this;
-            }
-
-        }; // class Header
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_HEADER_HPP
diff --git a/contrib/libosmium/osmium/io/input_iterator.hpp b/contrib/libosmium/osmium/io/input_iterator.hpp
deleted file mode 100644
index 8647763..0000000
--- a/contrib/libosmium/osmium/io/input_iterator.hpp
+++ /dev/null
@@ -1,178 +0,0 @@
-#ifndef OSMIUM_IO_INPUT_ITERATOR_HPP
-#define OSMIUM_IO_INPUT_ITERATOR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cassert>
-#include <cstddef>
-#include <iterator>
-#include <memory>
-#include <type_traits>
-
-#include <osmium/memory/buffer.hpp>
-#include <osmium/memory/item.hpp>
-#include <osmium/util/compatibility.hpp>
-
-namespace osmium {
-
-    namespace io {
-
-        /**
-         * This iterator class allows you to iterate over all items from a
-         * source. It hides all the buffer handling and makes the contents of a
-         * source accessible as a normal STL input iterator.
-         */
-        template <typename TSource, typename TItem = osmium::memory::Item>
-        class InputIterator {
-
-            static_assert(std::is_base_of<osmium::memory::Item, TItem>::value, "TItem must derive from osmium::buffer::Item");
-
-            typedef typename osmium::memory::Buffer::t_iterator<TItem> item_iterator;
-
-            TSource* m_source;
-            std::shared_ptr<osmium::memory::Buffer> m_buffer;
-            item_iterator m_iter {};
-
-            void update_buffer() {
-                do {
-                    m_buffer = std::make_shared<osmium::memory::Buffer>(std::move(m_source->read()));
-                    if (!m_buffer || !*m_buffer) { // end of input
-                        m_source = nullptr;
-                        m_buffer.reset();
-                        m_iter = item_iterator();
-                        return;
-                    }
-                    m_iter = m_buffer->begin<TItem>();
-                } while (m_iter == m_buffer->end<TItem>());
-            }
-
-        public:
-
-            typedef std::input_iterator_tag iterator_category;
-            typedef TItem                   value_type;
-            typedef ptrdiff_t               difference_type;
-            typedef TItem*                  pointer;
-            typedef TItem&                  reference;
-
-            explicit InputIterator(TSource& source) :
-                m_source(&source) {
-                update_buffer();
-            }
-
-            // end iterator
-            InputIterator() noexcept :
-                m_source(nullptr) {
-            }
-
-            InputIterator& operator++() {
-                assert(m_source);
-                assert(m_buffer);
-                assert(m_iter);
-                ++m_iter;
-                if (m_iter == m_buffer->end<TItem>()) {
-                    update_buffer();
-                }
-                return *this;
-            }
-
-            InputIterator operator++(int) {
-                InputIterator tmp(*this);
-                operator++();
-                return tmp;
-            }
-
-            bool operator==(const InputIterator& rhs) const noexcept {
-                return m_source == rhs.m_source &&
-                       m_buffer == rhs.m_buffer &&
-                       m_iter == rhs.m_iter;
-            }
-
-            bool operator!=(const InputIterator& rhs) const noexcept {
-                return !(*this == rhs);
-            }
-
-            reference operator*() const {
-                assert(m_iter);
-                return static_cast<reference>(*m_iter);
-            }
-
-            pointer operator->() const {
-                assert(m_iter);
-                return &static_cast<reference>(*m_iter);
-            }
-
-        }; // class InputIterator
-
-        template <typename TSource, typename TItem = osmium::memory::Item>
-        class InputIteratorRange {
-
-            InputIterator<TSource, TItem> m_begin;
-            InputIterator<TSource, TItem> m_end;
-
-        public:
-
-            InputIteratorRange(InputIterator<TSource, TItem>&& begin,
-                               InputIterator<TSource, TItem>&& end) :
-                m_begin(std::move(begin)),
-                m_end(std::move(end)) {
-            }
-
-            InputIterator<TSource, TItem> begin() const noexcept {
-                return m_begin;
-            }
-
-            InputIterator<TSource, TItem> end() const noexcept {
-                return m_end;
-            }
-
-            const InputIterator<TSource, TItem> cbegin() const noexcept {
-                return m_begin;
-            }
-
-            const InputIterator<TSource, TItem> cend() const noexcept {
-                return m_end;
-            }
-
-        }; // class InputIteratorRange
-
-        template <typename TItem, typename TSource>
-        InputIteratorRange<TSource, TItem> make_input_iterator_range(TSource& source) {
-            using it_type = InputIterator<TSource, TItem>;
-            return InputIteratorRange<TSource, TItem>(it_type{source}, it_type{});
-        }
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_INPUT_ITERATOR_HPP
diff --git a/contrib/libosmium/osmium/io/o5m_input.hpp b/contrib/libosmium/osmium/io/o5m_input.hpp
deleted file mode 100644
index b63f728..0000000
--- a/contrib/libosmium/osmium/io/o5m_input.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef OSMIUM_IO_O5M_INPUT_HPP
-#define OSMIUM_IO_O5M_INPUT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-/**
- * @file
- *
- * Include this file if you want to read OSM o5m and o5c files.
- */
-
-#include <osmium/io/reader.hpp> // IWYU pragma: export
-#include <osmium/io/detail/o5m_input_format.hpp> // IWYU pragma: export
-
-#endif // OSMIUM_IO_O5M_INPUT_HPP
diff --git a/contrib/libosmium/osmium/io/opl_output.hpp b/contrib/libosmium/osmium/io/opl_output.hpp
deleted file mode 100644
index 04385d9..0000000
--- a/contrib/libosmium/osmium/io/opl_output.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef OSMIUM_IO_OPL_OUTPUT_HPP
-#define OSMIUM_IO_OPL_OUTPUT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <osmium/io/writer.hpp> // IWYU pragma: export
-#include <osmium/io/detail/opl_output_format.hpp> // IWYU pragma: export
-
-#endif // OSMIUM_IO_OPL_OUTPUT_HPP
diff --git a/contrib/libosmium/osmium/io/output_iterator.hpp b/contrib/libosmium/osmium/io/output_iterator.hpp
deleted file mode 100644
index 3d60fe6..0000000
--- a/contrib/libosmium/osmium/io/output_iterator.hpp
+++ /dev/null
@@ -1,133 +0,0 @@
-#ifndef OSMIUM_IO_OUTPUT_ITERATOR_HPP
-#define OSMIUM_IO_OUTPUT_ITERATOR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstddef>
-#include <iterator>
-#include <memory>
-#include <utility>
-
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm/diff_object.hpp>
-#include <osmium/util/compatibility.hpp>
-
-namespace osmium {
-
-    namespace memory {
-        class Item;
-    } // namespace memory
-
-    namespace io {
-
-        template <typename TDest>
-        class OutputIterator : public std::iterator<std::output_iterator_tag, osmium::memory::Item> {
-
-            TDest* m_destination;
-
-        public:
-
-            explicit OutputIterator(TDest& destination) :
-                m_destination(&destination) {
-            }
-
-            /**
-             * Warning! Use of buffer size argument on OutputIterator
-             * constructor is deprecated. Call Writer::set_buffer_size()
-             * instead if you want to change the default.
-             */
-            OSMIUM_DEPRECATED OutputIterator(TDest& destination, const size_t buffer_size) :
-                m_destination(&destination) {
-                destination.set_buffer_size(buffer_size);
-            }
-
-            OutputIterator(const OutputIterator&) = default;
-            OutputIterator(OutputIterator&&) = default;
-
-            OutputIterator& operator=(const OutputIterator&) = default;
-            OutputIterator& operator=(OutputIterator&&) = default;
-
-            ~OutputIterator() = default;
-
-            /**
-             * Warning! Calling OutputIterator<Writer>::flush() is usually not
-             * needed any more. Call flush() on the Writer instead if needed.
-             */
-            OSMIUM_DEPRECATED void flush() {
-                m_destination->flush();
-            }
-
-            OutputIterator& operator=(const osmium::memory::Item& item) {
-                (*m_destination)(item);
-                return *this;
-            }
-
-            OutputIterator& operator=(const osmium::DiffObject& diff) {
-                return this->operator=(diff.curr());
-            }
-
-            OutputIterator& operator*() {
-                return *this;
-            }
-
-            OutputIterator& operator++() {
-                return *this;
-            }
-
-            OutputIterator& operator++(int) {
-                return *this;
-            }
-
-        }; // class OutputIterator
-
-        template <typename TDest>
-        OutputIterator<TDest> make_output_iterator(TDest& destination) {
-            return OutputIterator<TDest>{destination};
-        }
-
-        /**
-         * Warning! Use of buffer size argument on make_output_iterator is
-         * deprecated. Call Writer::set_buffer_size() instead if you want to
-         * change the default.
-         */
-        template <typename TDest>
-        OSMIUM_DEPRECATED OutputIterator<TDest> make_output_iterator(TDest& destination, const size_t buffer_size) {
-            destination.set_buffer_size(buffer_size);
-            return OutputIterator<TDest>{destination};
-        }
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_OUTPUT_ITERATOR_HPP
diff --git a/contrib/libosmium/osmium/io/overwrite.hpp b/contrib/libosmium/osmium/io/overwrite.hpp
deleted file mode 100644
index f9fbc71..0000000
--- a/contrib/libosmium/osmium/io/overwrite.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef OSMIUM_IO_OVERWRITE_HPP
-#define OSMIUM_IO_OVERWRITE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#pragma message("Including overwrite.hpp is deprecated, #include <osmium/io/writer_options.hpp> instead.")
-#include <osmium/io/writer_options.hpp>
-
-#endif // OSMIUM_IO_OVERWRITE_HPP
diff --git a/contrib/libosmium/osmium/io/pbf_input.hpp b/contrib/libosmium/osmium/io/pbf_input.hpp
deleted file mode 100644
index d7f3787..0000000
--- a/contrib/libosmium/osmium/io/pbf_input.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef OSMIUM_IO_PBF_INPUT_HPP
-#define OSMIUM_IO_PBF_INPUT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-/**
- * @file
- *
- * Include this file if you want to read OSM PBF files.
- *
- * @attention If you include this file, you'll need to link with
- *            `libz`, and enable multithreading.
- */
-
-#include <osmium/io/reader.hpp> // IWYU pragma: export
-#include <osmium/io/detail/pbf_input_format.hpp> // IWYU pragma: export
-
-#endif // OSMIUM_IO_PBF_INPUT_HPP
diff --git a/contrib/libosmium/osmium/io/pbf_output.hpp b/contrib/libosmium/osmium/io/pbf_output.hpp
deleted file mode 100644
index dad1013..0000000
--- a/contrib/libosmium/osmium/io/pbf_output.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef OSMIUM_IO_PBF_OUTPUT_HPP
-#define OSMIUM_IO_PBF_OUTPUT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-/**
- * @file
- *
- * Include this file if you want to write OSM PBF files.
- *
- * @attention If you include this file, you'll need to link with
- *            `libz`, and enable multithreading.
- */
-
-#include <osmium/io/writer.hpp> // IWYU pragma: export
-#include <osmium/io/detail/pbf_output_format.hpp> // IWYU pragma: export
-
-#endif // OSMIUM_IO_PBF_OUTPUT_HPP
diff --git a/contrib/libosmium/osmium/io/reader.hpp b/contrib/libosmium/osmium/io/reader.hpp
deleted file mode 100644
index 54c518e..0000000
--- a/contrib/libosmium/osmium/io/reader.hpp
+++ /dev/null
@@ -1,380 +0,0 @@
-#ifndef OSMIUM_IO_READER_HPP
-#define OSMIUM_IO_READER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cerrno>
-#include <cstdlib>
-#include <fcntl.h>
-#include <future>
-#include <memory>
-#include <string>
-#include <system_error>
-#include <thread>
-#include <utility>
-
-#ifndef _WIN32
-# include <sys/wait.h>
-#endif
-
-#ifndef _MSC_VER
-# include <unistd.h>
-#endif
-
-#include <osmium/io/compression.hpp>
-#include <osmium/io/detail/input_format.hpp>
-#include <osmium/io/detail/read_thread.hpp>
-#include <osmium/io/detail/read_write.hpp>
-#include <osmium/io/detail/queue_util.hpp>
-#include <osmium/io/error.hpp>
-#include <osmium/io/file.hpp>
-#include <osmium/io/header.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm/entity_bits.hpp>
-#include <osmium/thread/util.hpp>
-
-namespace osmium {
-
-    namespace io {
-
-        /**
-         * This is the user-facing interface for reading OSM files. Instantiate
-         * an object of this class with a file name or osmium::io::File object
-         * and then call read() on it in a loop until it returns an invalid
-         * Buffer.
-         */
-        class Reader {
-
-            static constexpr size_t max_input_queue_size = 20; // XXX
-            static constexpr size_t max_osmdata_queue_size = 20; // XXX
-
-            osmium::io::File m_file;
-            osmium::osm_entity_bits::type m_read_which_entities;
-
-            enum class status {
-                okay   = 0, // normal reading
-                error  = 1, // some error occurred while reading
-                closed = 2, // close() called successfully after eof
-                eof    = 3  // eof of file was reached without error
-            } m_status;
-
-            int m_childpid;
-
-            detail::future_string_queue_type m_input_queue;
-
-            std::unique_ptr<osmium::io::Decompressor> m_decompressor;
-
-            osmium::io::detail::ReadThreadManager m_read_thread_manager;
-
-            detail::future_buffer_queue_type m_osmdata_queue;
-            detail::queue_wrapper<osmium::memory::Buffer> m_osmdata_queue_wrapper;
-
-            std::future<osmium::io::Header> m_header_future;
-            osmium::io::Header m_header;
-
-            osmium::thread::thread_handler m_thread;
-
-            // This function will run in a separate thread.
-            static void parser_thread(const osmium::io::File& file,
-                                      detail::future_string_queue_type& input_queue,
-                                      detail::future_buffer_queue_type& osmdata_queue,
-                                      std::promise<osmium::io::Header>&& header_promise,
-                                      osmium::osm_entity_bits::type read_which_entities) {
-                std::promise<osmium::io::Header> promise = std::move(header_promise);
-                auto creator = detail::ParserFactory::instance().get_creator_function(file);
-                auto parser = creator(input_queue, osmdata_queue, promise, read_which_entities);
-                parser->parse();
-            }
-
-#ifndef _WIN32
-            /**
-             * Fork and execute the given command in the child.
-             * A pipe is created between the child and the parent.
-             * The child writes to the pipe, the parent reads from it.
-             * This function never returns in the child.
-             *
-             * @param command Command to execute in the child.
-             * @param filename Filename to give to command as argument.
-             * @returns File descriptor of pipe in the parent.
-             * @throws std::system_error if a system call fails.
-             */
-            static int execute(const std::string& command, const std::string& filename, int* childpid) {
-                int pipefd[2];
-                if (pipe(pipefd) < 0) {
-                    throw std::system_error(errno, std::system_category(), "opening pipe failed");
-                }
-                pid_t pid = fork();
-                if (pid < 0) {
-                    throw std::system_error(errno, std::system_category(), "fork failed");
-                }
-                if (pid == 0) { // child
-                    // close all file descriptors except one end of the pipe
-                    for (int i = 0; i < 32; ++i) {
-                        if (i != pipefd[1]) {
-                            ::close(i);
-                        }
-                    }
-                    if (dup2(pipefd[1], 1) < 0) { // put end of pipe as stdout/stdin
-                        exit(1);
-                    }
-
-                    ::open("/dev/null", O_RDONLY); // stdin
-                    ::open("/dev/null", O_WRONLY); // stderr
-                    // hack: -g switches off globbing in curl which allows [] to be used in file names
-                    // this is important for XAPI URLs
-                    // in theory this execute() function could be used for other commands, but it is
-                    // only used for curl at the moment, so this is okay.
-                    if (::execlp(command.c_str(), command.c_str(), "-g", filename.c_str(), nullptr) < 0) {
-                        exit(1);
-                    }
-                }
-                // parent
-                *childpid = pid;
-                ::close(pipefd[1]);
-                return pipefd[0];
-            }
-#endif
-
-            /**
-             * Open File for reading. Handles URLs or normal files. URLs
-             * are opened by executing the "curl" program (which must be installed)
-             * and reading from its output.
-             *
-             * @returns File descriptor of open file or pipe.
-             * @throws std::system_error if a system call fails.
-             */
-            static int open_input_file_or_url(const std::string& filename, int* childpid) {
-                std::string protocol = filename.substr(0, filename.find_first_of(':'));
-                if (protocol == "http" || protocol == "https" || protocol == "ftp" || protocol == "file") {
-#ifndef _WIN32
-                    return execute("curl", filename, childpid);
-#else
-                    throw io_error("Reading OSM files from the network currently not supported on Windows.");
-#endif
-                } else {
-                    return osmium::io::detail::open_for_reading(filename);
-                }
-            }
-
-        public:
-
-            /**
-             * Create new Reader object.
-             *
-             * @param file The file we want to open.
-             * @param read_which_entities Which OSM entities (nodes, ways, relations, and/or changesets)
-             *                            should be read from the input file. It can speed the read up
-             *                            significantly if objects that are not needed anyway are not
-             *                            parsed.
-             */
-            explicit Reader(const osmium::io::File& file, osmium::osm_entity_bits::type read_which_entities = osmium::osm_entity_bits::all) :
-                m_file(file.check()),
-                m_read_which_entities(read_which_entities),
-                m_status(status::okay),
-                m_childpid(0),
-                m_input_queue(max_input_queue_size, "raw_input"),
-                m_decompressor(m_file.buffer() ?
-                    osmium::io::CompressionFactory::instance().create_decompressor(file.compression(), m_file.buffer(), m_file.buffer_size()) :
-                    osmium::io::CompressionFactory::instance().create_decompressor(file.compression(), open_input_file_or_url(m_file.filename(), &m_childpid))),
-                m_read_thread_manager(*m_decompressor.get(), m_input_queue),
-                m_osmdata_queue(max_osmdata_queue_size, "parser_results"),
-                m_osmdata_queue_wrapper(m_osmdata_queue),
-                m_header_future(),
-                m_header(),
-                m_thread() {
-                std::promise<osmium::io::Header> header_promise;
-                m_header_future = header_promise.get_future();
-                m_thread = osmium::thread::thread_handler{parser_thread, std::ref(m_file), std::ref(m_input_queue), std::ref(m_osmdata_queue), std::move(header_promise), read_which_entities};
-            }
-
-            explicit Reader(const std::string& filename, osmium::osm_entity_bits::type read_types = osmium::osm_entity_bits::all) :
-                Reader(osmium::io::File(filename), read_types) {
-            }
-
-            explicit Reader(const char* filename, osmium::osm_entity_bits::type read_types = osmium::osm_entity_bits::all) :
-                Reader(osmium::io::File(filename), read_types) {
-            }
-
-            Reader(const Reader&) = delete;
-            Reader& operator=(const Reader&) = delete;
-
-            Reader(Reader&&) = default;
-            Reader& operator=(Reader&&) = default;
-
-            ~Reader() noexcept {
-                try {
-                    close();
-                } catch (...) {
-                    // Ignore any exceptions because destructor must not throw.
-                }
-            }
-
-            /**
-             * Close down the Reader. A call to this is optional, because the
-             * destructor of Reader will also call this. But if you don't call
-             * this function first, you might miss an exception, because the
-             * destructor is not allowed to throw.
-             *
-             * @throws Some form of osmium::io_error when there is a problem.
-             */
-            void close() {
-                m_status = status::closed;
-
-                m_read_thread_manager.stop();
-
-                m_osmdata_queue_wrapper.drain();
-
-                try {
-                    m_read_thread_manager.close();
-                } catch (...) {
-                    // Ignore any exceptions.
-                }
-
-#ifndef _WIN32
-                if (m_childpid) {
-                    int status;
-                    pid_t pid = ::waitpid(m_childpid, &status, 0);
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wold-style-cast"
-                    if (pid < 0 || !WIFEXITED(status) || WEXITSTATUS(status) != 0) {
-                        throw std::system_error(errno, std::system_category(), "subprocess returned error");
-                    }
-#pragma GCC diagnostic pop
-                    m_childpid = 0;
-                }
-#endif
-            }
-
-            /**
-             * Get the header data from the file.
-             *
-             * @returns Header.
-             * @throws Some form of osmium::io_error if there is an error.
-             */
-            osmium::io::Header header() {
-                if (m_status == status::error) {
-                    throw io_error("Can not get header from reader when in status 'error'");
-                }
-
-                try {
-                    if (m_header_future.valid()) {
-                        m_header = m_header_future.get();
-                        if (m_read_which_entities == osmium::osm_entity_bits::nothing) {
-                            m_status = status::eof;
-                        }
-                    }
-                } catch (...) {
-                    close();
-                    m_status = status::error;
-                    throw;
-                }
-                return m_header;
-            }
-
-            /**
-             * Reads the next buffer from the input. An invalid buffer signals
-             * end-of-file. After end-of-file all read() calls will return an
-             * invalid buffer. An invalid buffer is also always returned if
-             * osmium::osm_entity_bits::nothing was set when the Reader was
-             * constructed.
-             *
-             * @returns Buffer.
-             * @throws Some form of osmium::io_error if there is an error.
-             */
-            osmium::memory::Buffer read() {
-                osmium::memory::Buffer buffer;
-
-                if (m_status != status::okay ||
-                    m_read_which_entities == osmium::osm_entity_bits::nothing) {
-                    throw io_error("Can not read from reader when in status 'closed', 'eof', or 'error'");
-                }
-
-                try {
-                    // m_input_format.read() can return an invalid buffer to signal EOF,
-                    // or a valid buffer with or without data. A valid buffer
-                    // without data is not an error, it just means we have to
-                    // keep getting the next buffer until there is one with data.
-                    while (true) {
-                        buffer = m_osmdata_queue_wrapper.pop();
-                        if (detail::at_end_of_data(buffer)) {
-                            m_status = status::eof;
-                            m_read_thread_manager.close();
-                            return buffer;
-                        }
-                        if (buffer.committed() > 0) {
-                            return buffer;
-                        }
-                    }
-                } catch (...) {
-                    close();
-                    m_status = status::error;
-                    throw;
-                }
-            }
-
-            /**
-             * Has the end of file been reached? This is set after the last
-             * data has been read. It is also set by calling close().
-             */
-            bool eof() const {
-                return m_status == status::eof || m_status == status::closed;
-            }
-
-        }; // class Reader
-
-        /**
-         * Read contents of the given file into a buffer in one go. Takes
-         * the same arguments as any of the Reader constructors.
-         *
-         * The buffer can take up quite a lot of memory, so don't do this
-         * unless you are working with small OSM files and/or have lots of
-         * RAM.
-         */
-        template <typename... TArgs>
-        osmium::memory::Buffer read_file(TArgs&&... args) {
-            osmium::memory::Buffer buffer(1024*1024, osmium::memory::Buffer::auto_grow::yes);
-
-            Reader reader(std::forward<TArgs>(args)...);
-            while (osmium::memory::Buffer read_buffer = reader.read()) {
-                buffer.add_buffer(read_buffer);
-                buffer.commit();
-            }
-
-            return buffer;
-        }
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_READER_HPP
diff --git a/contrib/libosmium/osmium/io/reader_iterator.hpp b/contrib/libosmium/osmium/io/reader_iterator.hpp
deleted file mode 100644
index 8620789..0000000
--- a/contrib/libosmium/osmium/io/reader_iterator.hpp
+++ /dev/null
@@ -1,51 +0,0 @@
-#ifndef OSMIUM_IO_READER_ITERATOR_HPP
-#define OSMIUM_IO_READER_ITERATOR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <osmium/io/reader.hpp>
-#include <osmium/io/input_iterator.hpp>
-
-namespace std {
-
-    inline osmium::io::InputIterator<osmium::io::Reader> begin(osmium::io::Reader& reader) {
-        return osmium::io::InputIterator<osmium::io::Reader>(reader);
-    }
-
-    inline osmium::io::InputIterator<osmium::io::Reader> end(osmium::io::Reader&) {
-        return osmium::io::InputIterator<osmium::io::Reader>();
-    }
-
-} // namespace std
-
-#endif // OSMIUM_IO_READER_ITERATOR_HPP
diff --git a/contrib/libosmium/osmium/io/writer.hpp b/contrib/libosmium/osmium/io/writer.hpp
deleted file mode 100644
index 09c605c..0000000
--- a/contrib/libosmium/osmium/io/writer.hpp
+++ /dev/null
@@ -1,344 +0,0 @@
-#ifndef OSMIUM_IO_WRITER_HPP
-#define OSMIUM_IO_WRITER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cassert>
-#include <future>
-#include <memory>
-#include <stdexcept>
-#include <string>
-#include <thread>
-#include <utility>
-
-#include <osmium/io/compression.hpp>
-#include <osmium/io/detail/output_format.hpp>
-#include <osmium/io/detail/queue_util.hpp>
-#include <osmium/io/detail/read_write.hpp>
-#include <osmium/io/detail/write_thread.hpp>
-#include <osmium/io/error.hpp>
-#include <osmium/io/file.hpp>
-#include <osmium/io/header.hpp>
-#include <osmium/io/writer_options.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/thread/util.hpp>
-
-namespace osmium {
-
-    namespace io {
-
-        /**
-         * This is the user-facing interface for writing OSM files. Instantiate
-         * an object of this class with a file name or osmium::io::File object
-         * and optionally the data for the header and then call operator() on
-         * it to write Buffers or Items.
-         *
-         * The writer uses multithreading internally to do the actual encoding
-         * of the data into the intended format, possible compress the data and
-         * then write it out. But this is intentionally hidden from the user
-         * of this class who can use it without knowing those details.
-         *
-         * If you are done call the close() method to finish up. Only if you
-         * don't get an exception from the close() method, you can be sure
-         * the data is written correctly (modulo operating system buffering).
-         * The destructor of this class will also do the right thing if you
-         * forget to call close(), but because the destructor can't throw you
-         * will not get informed about any problems.
-         *
-         * The writer is usually used to write complete blocks of data stored
-         * in osmium::memory::Buffers. But you can also write single
-         * osmium::memory::Items. In this case the Writer uses an internal
-         * Buffer.
-         */
-        class Writer {
-
-            static constexpr size_t default_buffer_size = 10 * 1024 * 1024;
-
-            osmium::io::File m_file;
-
-            detail::future_string_queue_type m_output_queue;
-
-            std::unique_ptr<osmium::io::detail::OutputFormat> m_output;
-
-            osmium::memory::Buffer m_buffer;
-
-            size_t m_buffer_size;
-
-            std::future<bool> m_write_future;
-
-            osmium::thread::thread_handler m_thread;
-
-            enum class status {
-                okay   = 0, // normal writing
-                error  = 1, // some error occurred while writing
-                closed = 2  // close() called successfully
-            } m_status;
-
-            // This function will run in a separate thread.
-            static void write_thread(detail::future_string_queue_type& output_queue,
-                                     std::unique_ptr<osmium::io::Compressor>&& compressor,
-                                     std::promise<bool>&& write_promise) {
-                detail::WriteThread write_thread{output_queue,
-                                                 std::move(compressor),
-                                                 std::move(write_promise)};
-                write_thread();
-            }
-
-            void do_write(osmium::memory::Buffer&& buffer) {
-                if (buffer && buffer.committed() > 0) {
-                    m_output->write_buffer(std::move(buffer));
-                }
-            }
-
-            void do_flush() {
-                if (m_buffer && m_buffer.committed() > 0) {
-                    osmium::memory::Buffer buffer{m_buffer_size,
-                                                  osmium::memory::Buffer::auto_grow::no};
-                    using std::swap;
-                    swap(m_buffer, buffer);
-
-                    m_output->write_buffer(std::move(buffer));
-                }
-            }
-
-            template <typename TFunction, typename... TArgs>
-            void ensure_cleanup(TFunction func, TArgs&&... args) {
-                if (m_status != status::okay) {
-                    throw io_error("Can not write to writer when in status 'closed' or 'error'");
-                }
-
-                try {
-                    osmium::thread::check_for_exception(m_write_future);
-                    func(std::forward<TArgs>(args)...);
-                } catch (...) {
-                    m_status = status::error;
-                    detail::add_to_queue(m_output_queue, std::current_exception());
-                    detail::add_end_of_data_to_queue(m_output_queue);
-                    throw;
-                }
-            }
-
-            struct options_type {
-                osmium::io::Header header;
-                overwrite allow_overwrite = overwrite::no;
-                fsync sync = fsync::no;
-            };
-
-            static void set_option(options_type& options, const osmium::io::Header& header) {
-                options.header = header;
-            }
-
-            static void set_option(options_type& options, overwrite value) {
-                options.allow_overwrite = value;
-            }
-
-            static void set_option(options_type& options, fsync value) {
-                options.sync = value;
-            }
-
-        public:
-
-            /**
-             * The constructor of the Writer object opens a file and writes the
-             * header to it.
-             *
-             * @param file File (contains name and format info) to open.
-             * @param args All further arguments are optional and can appear
-             *             in any order:
-             *
-             * * osmium::io::Header: Optional header data. If this is
-             *       not given, a default constructed osmium::io::Header
-             *       object will be used.
-             *
-             * * osmium::io::overwrite: Allow overwriting of existing file?
-             *       Can be osmium::io::overwrite::allow or
-             *       osmium::io::overwrite::no (default).
-             *
-             * * osmium::io::fsync: Should fsync be called on the file
-             *       before closing it? Can be osmium::io::fsync::yes or
-             *       osmium::io::fsync::no (default).
-             *
-             * @throws osmium::io_error If there was an error.
-             * @throws std::system_error If the file could not be opened.
-             */
-            template <typename... TArgs>
-            explicit Writer(const osmium::io::File& file, TArgs&&... args) :
-                m_file(file.check()),
-                m_output_queue(20, "raw_output"), // XXX
-                m_output(osmium::io::detail::OutputFormatFactory::instance().create_output(m_file, m_output_queue)),
-                m_buffer(),
-                m_buffer_size(default_buffer_size),
-                m_write_future(),
-                m_thread(),
-                m_status(status::okay) {
-                assert(!m_file.buffer()); // XXX can't handle pseudo-files
-
-                options_type options;
-                (void)std::initializer_list<int>{
-                    (set_option(options, args), 0)...
-                };
-
-                std::unique_ptr<osmium::io::Compressor> compressor =
-                    CompressionFactory::instance().create_compressor(file.compression(),
-                                                                     osmium::io::detail::open_for_writing(m_file.filename(), options.allow_overwrite),
-                                                                     options.sync);
-
-                std::promise<bool> write_promise;
-                m_write_future = write_promise.get_future();
-                m_thread = osmium::thread::thread_handler{write_thread, std::ref(m_output_queue), std::move(compressor), std::move(write_promise)};
-
-                ensure_cleanup([&](){
-                    m_output->write_header(options.header);
-                });
-            }
-
-            template <typename... TArgs>
-            explicit Writer(const std::string& filename, TArgs&&... args) :
-                Writer(osmium::io::File(filename), std::forward<TArgs>(args)...) {
-            }
-
-            template <typename... TArgs>
-            explicit Writer(const char* filename, TArgs&&... args) :
-                Writer(osmium::io::File(filename), std::forward<TArgs>(args)...) {
-            }
-
-            Writer(const Writer&) = delete;
-            Writer& operator=(const Writer&) = delete;
-
-            Writer(Writer&&) = default;
-            Writer& operator=(Writer&&) = default;
-
-            ~Writer() noexcept {
-                try {
-                    close();
-                } catch (...) {
-                    // Ignore any exceptions because destructor must not throw.
-                }
-            }
-
-            /**
-             * Get the currently configured size of the internal buffer.
-             */
-            size_t buffer_size() const noexcept {
-                return m_buffer_size;
-            }
-
-            /**
-             * Set the size of the internal buffer. This will only take effect
-             * if you have not yet written anything or after the next flush().
-             */
-            void set_buffer_size(size_t size) noexcept {
-                m_buffer_size = size;
-            }
-
-            /**
-             * Flush the internal buffer if it contains any data. This is
-             * usually not needed as the buffer gets flushed on close()
-             * automatically.
-             *
-             * @throws Some form of osmium::io_error when there is a problem.
-             */
-            void flush() {
-                ensure_cleanup([&](){
-                    do_flush();
-                });
-            }
-
-            /**
-             * Write contents of a buffer to the output file. The buffer is
-             * moved into this function and will be in an undefined moved-from
-             * state afterwards.
-             *
-             * @param buffer Buffer that is being written out.
-             * @throws Some form of osmium::io_error when there is a problem.
-             */
-            void operator()(osmium::memory::Buffer&& buffer) {
-                ensure_cleanup([&](){
-                    do_flush();
-                    do_write(std::move(buffer));
-                });
-            }
-
-            /**
-             * Add item to the internal buffer for eventual writing to the
-             * output file.
-             *
-             * @param item Item to write (usually an OSM object).
-             * @throws Some form of osmium::io_error when there is a problem.
-             */
-            void operator()(const osmium::memory::Item& item) {
-                ensure_cleanup([&](){
-                    if (!m_buffer) {
-                        m_buffer = osmium::memory::Buffer{m_buffer_size,
-                                                          osmium::memory::Buffer::auto_grow::no};
-                    }
-                    try {
-                        m_buffer.push_back(item);
-                    } catch (osmium::buffer_is_full&) {
-                        do_flush();
-                        m_buffer.push_back(item);
-                    }
-                });
-            }
-
-            /**
-             * Flushes internal buffer and closes output file. If you do not
-             * call this, the destructor of Writer will also do the same
-             * thing. But because this call might throw an exception, which
-             * the destructor will ignore, it is better to call close()
-             * explicitly.
-             *
-             * @throws Some form of osmium::io_error when there is a problem.
-             */
-            void close() {
-                if (m_status == status::okay) {
-                    ensure_cleanup([&](){
-                        do_write(std::move(m_buffer));
-                        m_output->write_end();
-                        m_status = status::closed;
-                        detail::add_end_of_data_to_queue(m_output_queue);
-                    });
-                }
-
-                if (m_write_future.valid()) {
-                    m_write_future.get();
-                }
-            }
-
-        }; // class Writer
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_WRITER_HPP
diff --git a/contrib/libosmium/osmium/io/writer_options.hpp b/contrib/libosmium/osmium/io/writer_options.hpp
deleted file mode 100644
index ef19553..0000000
--- a/contrib/libosmium/osmium/io/writer_options.hpp
+++ /dev/null
@@ -1,60 +0,0 @@
-#ifndef OSMIUM_IO_WRITER_OPTIONS_HPP
-#define OSMIUM_IO_WRITER_OPTIONS_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-namespace osmium {
-
-    namespace io {
-
-        /**
-         * Allow overwriting of existing file?
-         */
-        enum class overwrite : bool {
-            no    = false,
-            allow = true
-        };
-
-        /**
-         * Should writer do an fsync before closing the file?
-         */
-        enum class fsync : bool {
-            no  = false,
-            yes = true
-        };
-
-    } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_WRITER_OPTIONS_HPP
diff --git a/contrib/libosmium/osmium/io/xml_input.hpp b/contrib/libosmium/osmium/io/xml_input.hpp
deleted file mode 100644
index dfcd0a9..0000000
--- a/contrib/libosmium/osmium/io/xml_input.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef OSMIUM_IO_XML_INPUT_HPP
-#define OSMIUM_IO_XML_INPUT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-/**
- * @file
- *
- * Include this file if you want to read OSM XML files.
- *
- * @attention If you include this file, you'll need to link with
- *            `libexpat`, and enable multithreading.
- */
-
-#include <osmium/io/reader.hpp> // IWYU pragma: export
-#include <osmium/io/detail/xml_input_format.hpp> // IWYU pragma: export
-
-#endif // OSMIUM_IO_XML_INPUT_HPP
diff --git a/contrib/libosmium/osmium/io/xml_output.hpp b/contrib/libosmium/osmium/io/xml_output.hpp
deleted file mode 100644
index 18a1386..0000000
--- a/contrib/libosmium/osmium/io/xml_output.hpp
+++ /dev/null
@@ -1,47 +0,0 @@
-#ifndef OSMIUM_IO_XML_OUTPUT_HPP
-#define OSMIUM_IO_XML_OUTPUT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-/**
- * @file
- *
- * Include this file if you want to write OSM XML files.
- *
- * @attention If you include this file, you'll need to enable multithreading.
- */
-
-#include <osmium/io/writer.hpp> // IWYU pragma: export
-#include <osmium/io/detail/xml_output_format.hpp> // IWYU pragma: export
-
-#endif // OSMIUM_IO_XML_OUTPUT_HPP
diff --git a/contrib/libosmium/osmium/memory/buffer.hpp b/contrib/libosmium/osmium/memory/buffer.hpp
deleted file mode 100644
index 11a4c97..0000000
--- a/contrib/libosmium/osmium/memory/buffer.hpp
+++ /dev/null
@@ -1,617 +0,0 @@
-#ifndef OSMIUM_MEMORY_BUFFER_HPP
-#define OSMIUM_MEMORY_BUFFER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <cassert>
-#include <cstddef>
-#include <cstring>
-#include <functional>
-#include <iterator>
-#include <stdexcept>
-#include <utility>
-#include <vector>
-
-#include <osmium/memory/item.hpp>
-#include <osmium/memory/item_iterator.hpp>
-#include <osmium/osm/entity.hpp>
-
-namespace osmium {
-
-    /**
-     * Exception thrown by the osmium::memory::Buffer class when somebody tries
-     * to write data into a buffer and it doesn't fit. Buffers with internal
-     * memory management will not throw this exception, but increase their size.
-     */
-    struct buffer_is_full : public std::runtime_error {
-
-        buffer_is_full() :
-            std::runtime_error("Osmium buffer is full") {
-        }
-
-    }; // struct buffer_is_full
-
-    /**
-     * @brief Memory management of items in buffers and iterators over this data.
-     */
-    namespace memory {
-
-        /**
-         * A memory area for storing OSM objects and other items. Each item stored
-         * has a type and a length. See the Item class for details.
-         *
-         * Data can be added to a buffer piece by piece using reserve_space() and
-         * add_item(). After all data that together forms an item is added, it must
-         * be committed using the commit() call. Usually this is done through the
-         * Builder class and its derived classes.
-         *
-         * You can iterate over all items in a buffer using the iterators returned
-         * by begin(), end(), cbegin(), and cend().
-         *
-         * Buffers exist in two flavours, those with external memory management and
-         * those with internal memory management. If you already have some memory
-         * with data in it (for instance read from disk), you create a Buffer with
-         * external memory management. It is your job then to free the memory once
-         * the buffer isn't used any more. If you don't have memory already, you can
-         * create a Buffer object and have it manage the memory internally. It will
-         * dynamically allocate memory and free it again after use.
-         *
-         * By default, if a buffer gets full it will throw a buffer_is_full exception.
-         * You can use the set_full_callback() method to set a callback functor
-         * which will be called instead of throwing an exception.
-         */
-        class Buffer {
-
-        public:
-
-            enum class auto_grow : bool {
-                yes = true,
-                no  = false
-            }; // enum class auto_grow
-
-        private:
-
-            std::vector<unsigned char> m_memory;
-            unsigned char* m_data;
-            size_t m_capacity;
-            size_t m_written;
-            size_t m_committed;
-            auto_grow m_auto_grow {auto_grow::no};
-            std::function<void(Buffer&)> m_full;
-
-        public:
-
-            typedef Item value_type;
-
-            /**
-             * The constructor without any parameters creates a non-initialized
-             * buffer, ie an empty hull of a buffer that has no actual memory
-             * associated with it. It can be used to signify end-of-data.
-             */
-            Buffer() noexcept :
-                m_memory(),
-                m_data(nullptr),
-                m_capacity(0),
-                m_written(0),
-                m_committed(0) {
-            }
-
-            /**
-             * Constructs an externally memory-managed buffer using the given
-             * memory and size.
-             *
-             * @param data A pointer to some already initialized data.
-             * @param size The size of the initialized data.
-             * @throws std::invalid_argument When the size isn't a multiple of the alignment.
-             */
-            explicit Buffer(unsigned char* data, size_t size) :
-                m_memory(),
-                m_data(data),
-                m_capacity(size),
-                m_written(size),
-                m_committed(size) {
-                if (size % align_bytes != 0) {
-                    throw std::invalid_argument("buffer size needs to be multiple of alignment");
-                }
-            }
-
-            /**
-             * Constructs an externally memory-managed buffer with the given
-             * capacity that already contains 'committed' bytes of data.
-             *
-             * @param data A pointer to some (possibly initialized) data.
-             * @param capacity The size of the memory for this buffer.
-             * @param committed The size of the initialized data. If this is 0, the buffer startes out empty.
-             * @throws std::invalid_argument When the capacity or committed isn't a multiple of the alignment.
-             */
-            explicit Buffer(unsigned char* data, size_t capacity, size_t committed) :
-                m_memory(),
-                m_data(data),
-                m_capacity(capacity),
-                m_written(committed),
-                m_committed(committed) {
-                if (capacity % align_bytes != 0) {
-                    throw std::invalid_argument("buffer capacity needs to be multiple of alignment");
-                }
-                if (committed % align_bytes != 0) {
-                    throw std::invalid_argument("buffer parameter 'committed' needs to be multiple of alignment");
-                }
-            }
-
-            /**
-             * Create an internally memory-managed buffer with the given capacity.
-             * different in that it internally gets dynamic memory of the
-             * required size. The dynamic memory will be automatically
-             * freed when the Buffer is destroyed.
-             */
-            explicit Buffer(size_t capacity, auto_grow auto_grow = auto_grow::yes) :
-                m_memory(capacity),
-                m_data(m_memory.data()),
-                m_capacity(capacity),
-                m_written(0),
-                m_committed(0),
-                m_auto_grow(auto_grow) {
-                if (capacity % align_bytes != 0) {
-                    throw std::invalid_argument("buffer capacity needs to be multiple of alignment");
-                }
-            }
-
-            // buffers can not be copied
-            Buffer(const Buffer&) = delete;
-            Buffer& operator=(const Buffer&) = delete;
-
-            // buffers can be moved
-            Buffer(Buffer&&) = default;
-            Buffer& operator=(Buffer&&) = default;
-
-            ~Buffer() = default;
-
-            /**
-             * Return a pointer to data inside the buffer.
-             */
-            unsigned char* data() const noexcept {
-                assert(m_data);
-                return m_data;
-            }
-
-            /**
-             * Returns the capacity of the buffer, ie how many bytes it can contain.
-             * Always returns 0 on invalid buffers.
-             */
-            size_t capacity() const noexcept {
-                return m_capacity;
-            }
-
-            /**
-             * Returns the number of bytes already filled in this buffer.
-             * Always returns 0 on invalid buffers.
-             */
-            size_t committed() const noexcept {
-                return m_committed;
-            }
-
-            /**
-             * Returns the number of bytes currently filled in this buffer that
-             * are not yet committed.
-             * Always returns 0 on invalid buffers.
-             */
-            size_t written() const noexcept {
-                return m_written;
-            }
-
-            /**
-             * This tests if the current state of the buffer is aligned
-             * properly. Can be used for asserts.
-             *
-             * The behaviour is undefined if you call this on an invalid
-             * buffer.
-             */
-            bool is_aligned() const noexcept {
-                assert(m_data);
-                return (m_written % align_bytes == 0) && (m_committed % align_bytes == 0);
-            }
-
-            /**
-             * Set functor to be called whenever the buffer is full
-             * instead of throwing buffer_is_full.
-             *
-             * The behaviour is undefined if you call this on an invalid
-             * buffer.
-             */
-            void set_full_callback(std::function<void(Buffer&)> full) {
-                assert(m_data);
-                m_full = full;
-            }
-
-            /**
-             * Grow capacity of this buffer to the given size.
-             * This works only with internally memory-managed buffers.
-             * If the given size is not larger than the current capacity, nothing is done.
-             * Already written but not committed data is discarded.
-             *
-             * The behaviour is undefined if you call this on an invalid
-             * buffer.
-             *
-             * @param size New capacity.
-             */
-            void grow(size_t size) {
-                assert(m_data);
-                if (m_memory.empty()) {
-                    throw std::logic_error("Can't grow Buffer if it doesn't use internal memory management.");
-                }
-                if (m_capacity < size) {
-                    if (size % align_bytes != 0) {
-                        throw std::invalid_argument("buffer capacity needs to be multiple of alignment");
-                    }
-                    m_memory.resize(size);
-                    m_data = m_memory.data();
-                    m_capacity = size;
-                }
-            }
-
-            /**
-             * Mark currently written bytes in the buffer as committed.
-             *
-             * The behaviour is undefined if you call this on an invalid
-             * buffer.
-             *
-             * @returns Last number of committed bytes before this commit.
-             */
-            size_t commit() {
-                assert(m_data);
-                assert(is_aligned());
-
-                const size_t offset = m_committed;
-                m_committed = m_written;
-                return offset;
-            }
-
-            /**
-             * Roll back changes in buffer to last committed state.
-             *
-             * The behaviour is undefined if you call this on an invalid
-             * buffer.
-             */
-            void rollback() {
-                assert(m_data);
-                m_written = m_committed;
-            }
-
-            /**
-             * Clear the buffer.
-             *
-             * No-op on an invalid buffer.
-             *
-             * @returns Number of bytes in the buffer before it was cleared.
-             */
-            size_t clear() {
-                const size_t committed = m_committed;
-                m_written = 0;
-                m_committed = 0;
-                return committed;
-            }
-
-            /**
-             * Get the data in the buffer at the given offset.
-             *
-             * The behaviour is undefined if you call this on an invalid
-             * buffer.
-             *
-             * @tparam T Type we want to the data to be interpreted as.
-             * @returns Reference of given type pointing to the data in the buffer.
-             */
-            template <typename T>
-            T& get(const size_t offset) const {
-                assert(m_data);
-                return *reinterpret_cast<T*>(&m_data[offset]);
-            }
-
-            /**
-             * Reserve space of given size in buffer and return pointer to it.
-             * This is the only way of adding data to the buffer. You reserve
-             * the space and then fill it.
-             *
-             * Note that you have to eventually call commit() to actually
-             * commit this data.
-             *
-             * If there isn't enough space in the buffer, one of three things
-             * can happen:
-             *
-             * * If you have set a callback with set_full_callback(), it is
-             *   called. After the call returns, you must have either grown
-             *   the buffer or cleared it by calling buffer.clear().
-             * * If no callback is defined and this buffer uses internal
-             *   memory management, the buffers capacity is grown, so that
-             *   the new data will fit.
-             * * Else the buffer_is_full exception is thrown.
-             *
-             * The behaviour is undefined if you call this on an invalid
-             * buffer.
-             *
-             * @param size Number of bytes to reserve.
-             * @returns Pointer to reserved space. Note that this pointer is
-             *         only guaranteed to be valid until the next call to
-             *         reserve_space().
-             * @throws osmium::buffer_is_full Might be thrown if the buffer is full.
-             */
-            unsigned char* reserve_space(const size_t size) {
-                assert(m_data);
-                if (m_written + size > m_capacity) {
-                    if (m_full) {
-                        m_full(*this);
-                    } else if (!m_memory.empty() && (m_auto_grow == auto_grow::yes)) {
-                        // double buffer size until there is enough space
-                        size_t new_capacity = m_capacity * 2;
-                        while (m_written + size > new_capacity) {
-                            new_capacity *= 2;
-                        }
-                        grow(new_capacity);
-                    } else {
-                        throw osmium::buffer_is_full();
-                    }
-                }
-                unsigned char* data = &m_data[m_written];
-                m_written += size;
-                return data;
-            }
-
-            /**
-             * Add an item to the buffer. The size of the item is stored inside
-             * the item, so we know how much memory to copy.
-             *
-             * Note that you have to eventually call commit() to actually
-             * commit this data.
-             *
-             * The behaviour is undefined if you call this on an invalid
-             * buffer.
-             *
-             * @tparam T Class of the item to be copied.
-             * @param item Reference to the item to be copied.
-             * @returns Reference to newly copied data in the buffer.
-             */
-            template <typename T>
-            T& add_item(const T& item) {
-                assert(m_data);
-                unsigned char* target = reserve_space(item.padded_size());
-                std::copy_n(reinterpret_cast<const unsigned char*>(&item), item.padded_size(), target);
-                return *reinterpret_cast<T*>(target);
-            }
-
-            /**
-             * Add committed contents of the given buffer to this buffer.
-             *
-             * The behaviour is undefined if you call this on an invalid
-             * buffer.
-             *
-             * Note that you have to eventually call commit() to actually
-             * commit this data.
-             */
-            void add_buffer(const Buffer& buffer) {
-                assert(m_data);
-                unsigned char* target = reserve_space(buffer.committed());
-                std::copy_n(reinterpret_cast<const unsigned char*>(buffer.data()), buffer.committed(), target);
-            }
-
-            /**
-             * Add an item to the buffer. This function is provided so that
-             * you can use std::back_inserter.
-             *
-             * The behaviour is undefined if you call this on an invalid
-             * buffer.
-             */
-            void push_back(const osmium::memory::Item& item) {
-                assert(m_data);
-                add_item(item);
-                commit();
-            }
-
-            /**
-             * These iterators can be used to iterate over all items in
-             * a buffer.
-             */
-            template <typename T>
-            using t_iterator = osmium::memory::ItemIterator<T>;
-
-            template <typename T>
-            using t_const_iterator = osmium::memory::ItemIterator<const T>;
-
-            typedef t_iterator<osmium::OSMEntity> iterator;
-            typedef t_const_iterator<osmium::OSMEntity> const_iterator;
-
-            template <typename T>
-            t_iterator<T> begin() {
-                assert(m_data);
-                return t_iterator<T>(m_data, m_data + m_committed);
-            }
-
-            iterator begin() {
-                assert(m_data);
-                return iterator(m_data, m_data + m_committed);
-            }
-
-            template <typename T>
-            t_iterator<T> get_iterator(size_t offset) {
-                assert(m_data);
-                return t_iterator<T>(m_data + offset, m_data + m_committed);
-            }
-
-            iterator get_iterator(size_t offset) {
-                assert(m_data);
-                return iterator(m_data + offset, m_data + m_committed);
-            }
-
-            template <typename T>
-            t_iterator<T> end() {
-                assert(m_data);
-                return t_iterator<T>(m_data + m_committed, m_data + m_committed);
-            }
-
-            iterator end() {
-                assert(m_data);
-                return iterator(m_data + m_committed, m_data + m_committed);
-            }
-
-            template <typename T>
-            t_const_iterator<T> cbegin() const {
-                assert(m_data);
-                return t_const_iterator<T>(m_data, m_data + m_committed);
-            }
-
-            const_iterator cbegin() const {
-                assert(m_data);
-                return const_iterator(m_data, m_data + m_committed);
-            }
-
-            template <typename T>
-            t_const_iterator<T> get_iterator(size_t offset) const {
-                assert(m_data);
-                return t_const_iterator<T>(m_data + offset, m_data + m_committed);
-            }
-
-            const_iterator get_iterator(size_t offset) const {
-                assert(m_data);
-                return const_iterator(m_data + offset, m_data + m_committed);
-            }
-
-            template <typename T>
-            t_const_iterator<T> cend() const {
-                assert(m_data);
-                return t_const_iterator<T>(m_data + m_committed, m_data + m_committed);
-            }
-
-            const_iterator cend() const {
-                assert(m_data);
-                return const_iterator(m_data + m_committed, m_data + m_committed);
-            }
-
-            template <typename T>
-            t_const_iterator<T> begin() const {
-                return cbegin<T>();
-            }
-
-            const_iterator begin() const {
-                return cbegin();
-            }
-
-            template <typename T>
-            t_const_iterator<T> end() const {
-                return cend<T>();
-            }
-
-            const_iterator end() const {
-                return cend();
-            }
-
-            /**
-             * In a bool context any initialized buffer is true.
-             */
-            explicit operator bool() const {
-                return m_data != nullptr;
-            }
-
-            friend void swap(Buffer& lhs, Buffer& rhs) {
-                using std::swap;
-
-                swap(lhs.m_memory, rhs.m_memory);
-                swap(lhs.m_data, rhs.m_data);
-                swap(lhs.m_capacity, rhs.m_capacity);
-                swap(lhs.m_written, rhs.m_written);
-                swap(lhs.m_committed, rhs.m_committed);
-            }
-
-            /**
-             * Purge removed items from the buffer. This is done by moving all
-             * non-removed items forward in the buffer overwriting removed
-             * items and then correcting the m_written and m_committed numbers.
-             *
-             * Note that calling this function invalidates all iterators on this
-             * buffer and all offsets in this buffer.
-             *
-             * For every non-removed item that moves its position, the function
-             * 'moving_in_buffer' is called on the given callback object with
-             * the old and new offsets in the buffer where the object used to
-             * be and is now, respectively. This call can be used to update any
-             * indexes.
-             *
-             * The behaviour is undefined if you call this on an invalid
-             * buffer.
-             */
-            template <typename TCallbackClass>
-            void purge_removed(TCallbackClass* callback) {
-                assert(m_data);
-                if (begin() == end()) {
-                    return;
-                }
-
-                iterator it_write = begin();
-
-                iterator next;
-                for (iterator it_read = begin(); it_read != end(); it_read = next) {
-                    next = std::next(it_read);
-                    if (!it_read->removed()) {
-                        if (it_read != it_write) {
-                            assert(it_read.data() >= data());
-                            assert(it_write.data() >= data());
-                            size_t old_offset = static_cast<size_t>(it_read.data() - data());
-                            size_t new_offset = static_cast<size_t>(it_write.data() - data());
-                            callback->moving_in_buffer(old_offset, new_offset);
-                            std::memmove(it_write.data(), it_read.data(), it_read->padded_size());
-                        }
-                        it_write.advance_once();
-                    }
-                }
-
-                assert(it_write.data() >= data());
-                m_written = static_cast<size_t>(it_write.data() - data());
-                m_committed = m_written;
-            }
-
-        }; // class Buffer
-
-        inline bool operator==(const Buffer& lhs, const Buffer& rhs) noexcept {
-            if (!lhs || !rhs) {
-                return !lhs && !rhs;
-            }
-            return lhs.data() == rhs.data() && lhs.capacity() == rhs.capacity() && lhs.committed() == rhs.committed();
-        }
-
-        inline bool operator!=(const Buffer& lhs, const Buffer& rhs) noexcept {
-            return ! (lhs == rhs);
-        }
-
-    } // namespace memory
-
-} // namespace osmium
-
-#endif // OSMIUM_MEMORY_BUFFER_HPP
diff --git a/contrib/libosmium/osmium/memory/collection.hpp b/contrib/libosmium/osmium/memory/collection.hpp
deleted file mode 100644
index 54a97f5..0000000
--- a/contrib/libosmium/osmium/memory/collection.hpp
+++ /dev/null
@@ -1,153 +0,0 @@
-#ifndef OSMIUM_MEMORY_COLLECTION_HPP
-#define OSMIUM_MEMORY_COLLECTION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <iterator>
-#include <iosfwd>
-#include <type_traits>
-
-#include <osmium/memory/item.hpp>
-
-namespace osmium {
-
-    namespace memory {
-
-        template <typename TMember>
-        class CollectionIterator : public std::iterator<std::forward_iterator_tag, TMember> {
-
-            // This data_type is either 'unsigned char*' or 'const unsigned char*' depending
-            // on whether TMember is const. This allows this class to be used as an iterator and
-            // as a const_iterator.
-            typedef typename std::conditional<std::is_const<TMember>::value, const unsigned char*, unsigned char*>::type data_type;
-
-            data_type m_data;
-
-        public:
-
-            CollectionIterator() noexcept :
-                m_data(nullptr) {
-            }
-
-            CollectionIterator(data_type data) noexcept :
-                m_data(data) {
-            }
-
-            CollectionIterator<TMember>& operator++() {
-                m_data = reinterpret_cast<TMember*>(m_data)->next();
-                return *static_cast<CollectionIterator<TMember>*>(this);
-            }
-
-            CollectionIterator<TMember> operator++(int) {
-                CollectionIterator<TMember> tmp(*this);
-                operator++();
-                return tmp;
-            }
-
-            bool operator==(const CollectionIterator<TMember>& rhs) const noexcept {
-                return m_data == rhs.m_data;
-            }
-
-            bool operator!=(const CollectionIterator<TMember>& rhs) const noexcept {
-                return m_data != rhs.m_data;
-            }
-
-            unsigned char* data() const noexcept {
-                return m_data;
-            }
-
-            TMember& operator*() const {
-                return *reinterpret_cast<TMember*>(m_data);
-            }
-
-            TMember* operator->() const {
-                return reinterpret_cast<TMember*>(m_data);
-            }
-
-            template <typename TChar, typename TTraits>
-            friend std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const CollectionIterator<TMember>& iter) {
-                return out << static_cast<const void*>(iter.m_data);
-            }
-
-        }; // class CollectionIterator
-
-        template <typename TMember, osmium::item_type TCollectionItemType>
-        class Collection : public Item {
-
-        public:
-
-            typedef CollectionIterator<TMember> iterator;
-            typedef CollectionIterator<const TMember> const_iterator;
-            typedef TMember value_type;
-
-            static constexpr osmium::item_type itemtype = TCollectionItemType;
-
-            Collection() :
-                Item(sizeof(Collection<TMember, TCollectionItemType>), TCollectionItemType) {
-            }
-
-            bool empty() const {
-                return sizeof(Collection<TMember, TCollectionItemType>) == byte_size();
-            }
-
-            iterator begin() {
-                return iterator(data() + sizeof(Collection<TMember, TCollectionItemType>));
-            }
-
-            iterator end() {
-                return iterator(data() + byte_size());
-            }
-
-            const_iterator cbegin() const {
-                return const_iterator(data() + sizeof(Collection<TMember, TCollectionItemType>));
-            }
-
-            const_iterator cend() const {
-                return const_iterator(data() + byte_size());
-            }
-
-            const_iterator begin() const {
-                return cbegin();
-            }
-
-            const_iterator end() const {
-                return cend();
-            }
-
-        }; // class Collection
-
-    } // namespace memory
-
-} // namespace osmium
-
-#endif // OSMIUM_MEMORY_COLLECTION_HPP
diff --git a/contrib/libosmium/osmium/memory/item.hpp b/contrib/libosmium/osmium/memory/item.hpp
deleted file mode 100644
index 30c5377..0000000
--- a/contrib/libosmium/osmium/memory/item.hpp
+++ /dev/null
@@ -1,177 +0,0 @@
-#ifndef OSMIUM_MEMORY_ITEM_HPP
-#define OSMIUM_MEMORY_ITEM_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstdint>
-#include <type_traits>
-
-namespace osmium {
-
-    // forward declaration, see osmium/osm/item_type.hpp for declaration
-    enum class item_type : uint16_t;
-
-    namespace builder {
-        class Builder;
-    }
-
-    namespace memory {
-
-        typedef uint32_t item_size_type;
-
-        // align datastructures to this many bytes
-        constexpr item_size_type align_bytes = 8;
-
-        template <typename T>
-        inline T padded_length(T length) noexcept {
-            static_assert(std::is_integral<T>::value && std::is_unsigned<T>::value, "Template parameter must be unsigned integral type");
-            return (length + align_bytes - 1) & ~(align_bytes - 1);
-        }
-
-        /**
-         * @brief Namespace for Osmium internal use
-         */
-        namespace detail {
-
-            /**
-            * This class contains only a helper method used in several
-            * other classes.
-            */
-            class ItemHelper {
-
-            protected:
-
-                ItemHelper() = default;
-
-                ~ItemHelper() = default;
-
-                ItemHelper(const ItemHelper&) = default;
-                ItemHelper(ItemHelper&&) = default;
-
-                ItemHelper& operator=(const ItemHelper&) = default;
-                ItemHelper& operator=(ItemHelper&&) = default;
-
-            public:
-
-                unsigned char* data() noexcept {
-                    return reinterpret_cast<unsigned char*>(this);
-                }
-
-                const unsigned char* data() const noexcept {
-                    return reinterpret_cast<const unsigned char*>(this);
-                }
-
-            }; // class ItemHelper
-
-        } // namespace detail
-
-        class Item : public osmium::memory::detail::ItemHelper {
-
-            item_size_type m_size;
-            item_type m_type;
-            uint16_t m_removed : 1;
-            uint16_t m_padding : 15;
-
-            template <typename TMember>
-            friend class CollectionIterator;
-
-            template <typename TMember>
-            friend class ItemIterator;
-
-            friend class osmium::builder::Builder;
-
-            Item& add_size(const item_size_type size) noexcept {
-                m_size += size;
-                return *this;
-            }
-
-        protected:
-
-            explicit Item(item_size_type size = 0, item_type type = item_type()) noexcept :
-                m_size(size),
-                m_type(type),
-                m_removed(false),
-                m_padding(0) {
-            }
-
-            Item(const Item&) = delete;
-            Item(Item&&) = delete;
-
-            Item& operator=(const Item&) = delete;
-            Item& operator=(Item&&) = delete;
-
-            Item& set_type(const item_type item_type) noexcept {
-                m_type = item_type;
-                return *this;
-            }
-
-        public:
-
-            unsigned char* next() noexcept {
-                return data() + padded_size();
-            }
-
-            const unsigned char* next() const noexcept {
-                return data() + padded_size();
-            }
-
-            item_size_type byte_size() const noexcept {
-                return m_size;
-            }
-
-            item_size_type padded_size() const {
-                return padded_length(m_size);
-            }
-
-            item_type type() const noexcept {
-                return m_type;
-            }
-
-            bool removed() const noexcept {
-                return m_removed;
-            }
-
-            void set_removed(bool removed) noexcept {
-                m_removed = removed;
-            }
-
-        }; // class Item
-
-        static_assert(sizeof(Item) == 8, "Class osmium::Item has wrong size!");
-        static_assert(sizeof(Item) % align_bytes == 0, "Class osmium::Item has wrong size to be aligned properly!");
-
-    } // namespace memory
-
-} // namespace osmium
-
-#endif // OSMIUM_MEMORY_ITEM_HPP
diff --git a/contrib/libosmium/osmium/memory/item_iterator.hpp b/contrib/libosmium/osmium/memory/item_iterator.hpp
deleted file mode 100644
index c6b4205..0000000
--- a/contrib/libosmium/osmium/memory/item_iterator.hpp
+++ /dev/null
@@ -1,234 +0,0 @@
-#ifndef OSMIUM_ITEM_ITERATOR_HPP
-#define OSMIUM_ITEM_ITERATOR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cassert>
-#include <iterator>
-#include <iosfwd>
-#include <type_traits>
-
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/item_type.hpp>
-
-namespace osmium {
-
-    class Node;
-    class Way;
-    class Relation;
-    class Area;
-    class Changeset;
-    class OSMObject;
-    class OSMEntity;
-    class TagList;
-    class WayNodeList;
-    class RelationMemberList;
-    class InnerRing;
-    class OuterRing;
-
-    namespace memory {
-
-        namespace detail {
-
-            template <typename T>
-            inline bool type_is_compatible(osmium::item_type) noexcept {
-                return true;
-            }
-
-            template <>
-            inline bool type_is_compatible<osmium::Node>(osmium::item_type t) noexcept {
-                return t == osmium::item_type::node;
-            }
-
-            template <>
-            inline bool type_is_compatible<osmium::Way>(osmium::item_type t) noexcept {
-                return t == osmium::item_type::way;
-            }
-
-            template <>
-            inline bool type_is_compatible<osmium::Relation>(osmium::item_type t) noexcept {
-                return t == osmium::item_type::relation;
-            }
-
-            template <>
-            inline bool type_is_compatible<osmium::Area>(osmium::item_type t) noexcept {
-                return t == osmium::item_type::area;
-            }
-
-            template <>
-            inline bool type_is_compatible<osmium::Changeset>(osmium::item_type t) noexcept {
-                return t == osmium::item_type::changeset;
-            }
-
-            template <>
-            inline bool type_is_compatible<osmium::OSMObject>(osmium::item_type t) noexcept {
-                return t == osmium::item_type::node || t == osmium::item_type::way || t == osmium::item_type::relation || t == osmium::item_type::area;
-            }
-
-            template <>
-            inline bool type_is_compatible<osmium::OSMEntity>(osmium::item_type t) noexcept {
-                return t == osmium::item_type::node || t == osmium::item_type::way || t == osmium::item_type::relation || t == osmium::item_type::area || t == osmium::item_type::changeset;
-            }
-
-            template <>
-            inline bool type_is_compatible<osmium::TagList>(osmium::item_type t) noexcept {
-                return t == osmium::item_type::tag_list;
-            }
-
-            template <>
-            inline bool type_is_compatible<osmium::WayNodeList>(osmium::item_type t) noexcept {
-                return t == osmium::item_type::way_node_list;
-            }
-
-            template <>
-            inline bool type_is_compatible<osmium::RelationMemberList>(osmium::item_type t) noexcept {
-                return t == osmium::item_type::relation_member_list || t == osmium::item_type::relation_member_list_with_full_members;
-            }
-
-            template <>
-            inline bool type_is_compatible<osmium::OuterRing>(osmium::item_type t) noexcept {
-                return t == osmium::item_type::outer_ring;
-            }
-
-            template <>
-            inline bool type_is_compatible<osmium::InnerRing>(osmium::item_type t) noexcept {
-                return t == osmium::item_type::inner_ring;
-            }
-
-        } // namespace detail
-
-        template <typename TMember>
-        class ItemIterator : public std::iterator<std::forward_iterator_tag, TMember> {
-
-            static_assert(std::is_base_of<osmium::memory::Item, TMember>::value, "TMember must derive from osmium::memory::Item");
-
-            // This data_type is either 'unsigned char*' or 'const unsigned char*' depending
-            // on whether TMember is const. This allows this class to be used as an iterator and
-            // as a const_iterator.
-            typedef typename std::conditional<std::is_const<TMember>::value, const unsigned char*, unsigned char*>::type data_type;
-
-            data_type m_data;
-            data_type m_end;
-
-            void advance_to_next_item_of_right_type() {
-                while (m_data != m_end &&
-                       !detail::type_is_compatible<typename std::remove_const<TMember>::type>(reinterpret_cast<const osmium::memory::Item*>(m_data)->type())) {
-                    m_data = reinterpret_cast<TMember*>(m_data)->next();
-                }
-            }
-
-        public:
-
-            ItemIterator() noexcept :
-                m_data(nullptr),
-                m_end(nullptr) {
-            }
-
-            ItemIterator(data_type data, data_type end) :
-                m_data(data),
-                m_end(end) {
-                advance_to_next_item_of_right_type();
-            }
-
-            template <typename T>
-            ItemIterator<T> cast() const {
-                return ItemIterator<T>(m_data, m_end);
-            }
-
-            ItemIterator<TMember>& operator++() {
-                assert(m_data);
-                assert(m_data != m_end);
-                m_data = reinterpret_cast<TMember*>(m_data)->next();
-                advance_to_next_item_of_right_type();
-                return *static_cast<ItemIterator<TMember>*>(this);
-            }
-
-            /**
-             * Like operator++() but will NOT skip items of unwanted
-             * types. Do not use this unless you know what you are
-             * doing.
-             */
-            ItemIterator<TMember>& advance_once() {
-                assert(m_data);
-                assert(m_data != m_end);
-                m_data = reinterpret_cast<TMember*>(m_data)->next();
-                return *static_cast<ItemIterator<TMember>*>(this);
-            }
-
-            ItemIterator<TMember> operator++(int) {
-                ItemIterator<TMember> tmp(*this);
-                operator++();
-                return tmp;
-            }
-
-            bool operator==(const ItemIterator<TMember>& rhs) const {
-                return m_data == rhs.m_data && m_end == rhs.m_end;
-            }
-
-            bool operator!=(const ItemIterator<TMember>& rhs) const {
-                return !(*this == rhs);
-            }
-
-            unsigned char* data() const {
-                assert(m_data);
-                return m_data;
-            }
-
-            TMember& operator*() const {
-                assert(m_data);
-                assert(m_data != m_end);
-                return *reinterpret_cast<TMember*>(m_data);
-            }
-
-            TMember* operator->() const {
-                assert(m_data);
-                assert(m_data != m_end);
-                return reinterpret_cast<TMember*>(m_data);
-            }
-
-            explicit operator bool() const {
-                return m_data != nullptr;
-            }
-
-            template <typename TChar, typename TTraits>
-            friend std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const ItemIterator<TMember>& iter) {
-                return out << static_cast<void*>(iter.m_data);
-            }
-
-        }; // class ItemIterator
-
-    } // namespace memory
-
-} // namespace osmium
-
-#endif // OSMIUM_ITEM_ITERATOR_HPP
diff --git a/contrib/libosmium/osmium/object_pointer_collection.hpp b/contrib/libosmium/osmium/object_pointer_collection.hpp
deleted file mode 100644
index 85566b6..0000000
--- a/contrib/libosmium/osmium/object_pointer_collection.hpp
+++ /dev/null
@@ -1,112 +0,0 @@
-#ifndef OSMIUM_OBJECT_POINTER_COLLECTION_HPP
-#define OSMIUM_OBJECT_POINTER_COLLECTION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <utility>
-#include <vector>
-
-#include <boost/iterator/indirect_iterator.hpp>
-
-#include <osmium/handler.hpp>
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/object.hpp>
-
-// IWYU pragma: no_forward_declare osmium::OSMObject
-// IWYU pragma: no_forward_declare osmium::memory::Item
-
-namespace osmium {
-
-    /**
-     * A collection of pointers to OSM objects. The pointers can be easily
-     * and quickly sorted or otherwise manipulated, while the objects
-     * themselves or the buffers they are in, do not have to be changed.
-     *
-     * An iterator is provided that can iterate over the pointers but looks
-     * like it is iterating over the underlying OSM objects.
-     *
-     * This class implements the visitor pattern which makes it easy to
-     * populate the collection from a buffer of OSM objects:
-     *
-     *   osmium::ObjectPointerCollection objects;
-     *   osmium::memory::Buffer buffer = reader.read();
-     *   osmium::apply(buffer, objects);
-     *
-     */
-    class ObjectPointerCollection : public osmium::handler::Handler {
-
-        std::vector<osmium::OSMObject*> m_objects;
-
-    public:
-
-        typedef boost::indirect_iterator<std::vector<osmium::OSMObject*>::iterator, osmium::OSMObject> iterator;
-        typedef boost::indirect_iterator<std::vector<osmium::OSMObject*>::const_iterator, const osmium::OSMObject> const_iterator;
-
-        ObjectPointerCollection() noexcept :
-            m_objects() {
-        }
-
-        void osm_object(osmium::OSMObject& object) {
-            m_objects.push_back(&object);
-        }
-
-        /**
-         * Sort objects according to the given order functor.
-         */
-        template <typename TCompare>
-        void sort(TCompare&& compare) {
-            std::sort(m_objects.begin(), m_objects.end(), std::forward<TCompare>(compare));
-        }
-
-        iterator begin() {
-            return iterator { m_objects.begin() };
-        }
-
-        iterator end() {
-            return iterator { m_objects.end() };
-        }
-
-        const_iterator cbegin() const {
-            return const_iterator { m_objects.cbegin() };
-        }
-
-        const_iterator cend() const {
-            return const_iterator { m_objects.cend() };
-        }
-
-    }; // class ObjectPointerCollection
-
-} // namespace osmium
-
-#endif // OSMIUM_OBJECT_POINTER_COLLECTION_HPP
diff --git a/contrib/libosmium/osmium/osm.hpp b/contrib/libosmium/osmium/osm.hpp
deleted file mode 100644
index e92d9b8..0000000
--- a/contrib/libosmium/osmium/osm.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef OSMIUM_OSM_HPP
-#define OSMIUM_OSM_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <osmium/osm/node.hpp> // IWYU pragma: export
-#include <osmium/osm/way.hpp> // IWYU pragma: export
-#include <osmium/osm/relation.hpp> // IWYU pragma: export
-#include <osmium/osm/area.hpp> // IWYU pragma: export
-#include <osmium/osm/changeset.hpp> // IWYU pragma: export
-
-/**
- * @brief Namespace for everything in the Osmium library.
- */
-namespace osmium {
-} // namespace osmium
-
-#endif // OSMIUM_OSM_HPP
diff --git a/contrib/libosmium/osmium/osm/area.hpp b/contrib/libosmium/osmium/osm/area.hpp
deleted file mode 100644
index 4e11c8b..0000000
--- a/contrib/libosmium/osmium/osm/area.hpp
+++ /dev/null
@@ -1,215 +0,0 @@
-#ifndef OSMIUM_OSM_AREA_HPP
-#define OSMIUM_OSM_AREA_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cassert>
-#include <cstdlib>
-#include <utility>
-
-#include <osmium/memory/collection.hpp>
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/osm/node_ref_list.hpp>
-
-namespace osmium {
-
-    namespace builder {
-        template <class T> class ObjectBuilder;
-    }
-
-    /**
-     * An outer ring of an Area.
-     */
-    class OuterRing : public NodeRefList {
-
-    public:
-
-        static constexpr osmium::item_type itemtype = osmium::item_type::outer_ring;
-
-        OuterRing():
-            NodeRefList(itemtype) {
-        }
-
-    }; // class OuterRing
-
-    static_assert(sizeof(OuterRing) % osmium::memory::align_bytes == 0, "Class osmium::OuterRing has wrong size to be aligned properly!");
-
-    /**
-     * An inner ring of an Area.
-     */
-    class InnerRing : public NodeRefList {
-
-    public:
-
-        static constexpr osmium::item_type itemtype = osmium::item_type::inner_ring;
-
-        InnerRing():
-            NodeRefList(itemtype) {
-        }
-
-    }; // class InnerRing
-
-    static_assert(sizeof(InnerRing) % osmium::memory::align_bytes == 0, "Class osmium::InnerRing has wrong size to be aligned properly!");
-
-    /**
-     * Convert way or (multipolygon) relation id into unique area id.
-     *
-     * @param id Id of a way or relation
-     * @param type Type of object (way or relation)
-     * @returns Area id
-     */
-    inline osmium::object_id_type object_id_to_area_id(osmium::object_id_type id, osmium::item_type type) noexcept {
-        osmium::object_id_type area_id = std::abs(id) * 2;
-        if (type == osmium::item_type::relation) {
-            ++area_id;
-        }
-        return id < 0 ? -area_id : area_id;
-    }
-
-    /**
-     * Convert area id into id of the way or relation it was created from.
-     *
-     * @param id Area id
-     * @returns Way or Relation id.
-     */
-    inline osmium::object_id_type area_id_to_object_id(osmium::object_id_type id) noexcept {
-        return id / 2;
-    }
-
-    /**
-     * An OSM area created out of a closed way or a multipolygon relation.
-     */
-    class Area : public OSMObject {
-
-        friend class osmium::builder::ObjectBuilder<osmium::Area>;
-
-        Area() :
-            OSMObject(sizeof(Area), osmium::item_type::area) {
-        }
-
-    public:
-
-        static constexpr osmium::item_type itemtype = osmium::item_type::area;
-
-        /**
-         * Was this area created from a way? (In contrast to areas
-         * created from a relation and their members.)
-         */
-        bool from_way() const noexcept {
-            return (positive_id() & 0x1) == 0;
-        }
-
-        /**
-         * Return the Id of the way or relation this area was created from.
-         */
-        osmium::object_id_type orig_id() const noexcept {
-            return osmium::area_id_to_object_id(id());
-        }
-
-        /**
-         * Count the number of outer and inner rings of this area.
-         *
-         * @returns Pair (number outer rings, number inner rings)
-         */
-        std::pair<int, int> num_rings() const {
-            std::pair<int, int> counter { 0, 0 };
-
-            for (auto it = cbegin(); it != cend(); ++it) {
-                switch (it->type()) {
-                    case osmium::item_type::outer_ring:
-                        ++counter.first;
-                        break;
-                    case osmium::item_type::inner_ring:
-                        ++counter.second;
-                        break;
-                    case osmium::item_type::tag_list:
-                        // ignore tags
-                        break;
-                    case osmium::item_type::undefined:
-                    case osmium::item_type::node:
-                    case osmium::item_type::way:
-                    case osmium::item_type::relation:
-                    case osmium::item_type::area:
-                    case osmium::item_type::changeset:
-                    case osmium::item_type::way_node_list:
-                    case osmium::item_type::relation_member_list:
-                    case osmium::item_type::relation_member_list_with_full_members:
-                    case osmium::item_type::changeset_discussion:
-                        assert(false && "Children of Area can only be outer/inner_ring and tag_list.");
-                        break;
-                }
-            }
-
-            return counter;
-        }
-
-        /**
-         * Check whether this area is a multipolygon, ie. whether it has more
-         * than one outer ring?
-         */
-        bool is_multipolygon() const {
-            return num_rings().first > 1;
-        }
-
-        /**
-         * Get iterator for iterating over all inner rings in a specified outer
-         * ring.
-         *
-         * @param it Iterator specifying outer ring.
-         * @returns Iterator to first inner ring in specified outer ring.
-         */
-        osmium::memory::ItemIterator<const osmium::InnerRing> inner_ring_cbegin(const osmium::memory::ItemIterator<const osmium::OuterRing>& it) const {
-            return it.cast<const osmium::InnerRing>();
-        }
-
-        /**
-         * Get iterator for iterating over all inner rings in a specified outer
-         * ring.
-         *
-         * @param it Iterator specifying outer ring.
-         * @returns Iterator one past last inner ring in specified outer ring.
-         */
-        osmium::memory::ItemIterator<const osmium::InnerRing> inner_ring_cend(const osmium::memory::ItemIterator<const osmium::OuterRing>& it) const {
-            return std::next(it).cast<const osmium::InnerRing>();
-        }
-
-    }; // class Area
-
-    static_assert(sizeof(Area) % osmium::memory::align_bytes == 0, "Class osmium::Area has wrong size to be aligned properly!");
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_AREA_HPP
diff --git a/contrib/libosmium/osmium/osm/box.hpp b/contrib/libosmium/osmium/osm/box.hpp
deleted file mode 100644
index 631f919..0000000
--- a/contrib/libosmium/osmium/osm/box.hpp
+++ /dev/null
@@ -1,250 +0,0 @@
-#ifndef OSMIUM_OSM_BOX_HPP
-#define OSMIUM_OSM_BOX_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cassert>
-#include <iosfwd>
-
-#include <osmium/util/compatibility.hpp>
-#include <osmium/osm/location.hpp>
-
-namespace osmium {
-
-    /**
-     * Bounding box. A box is defined by two locations (bottom left location
-     * and top right location) or, alternatively by four coordinates (minx,
-     * miny, maxx, and maxy). If both locations are undefined, the box is
-     * undefined, too.
-     */
-    class Box {
-
-        osmium::Location m_bottom_left;
-        osmium::Location m_top_right;
-
-    public:
-
-        /**
-         * Create undefined Box. Use the extend() function
-         * to add actual bounds.
-         */
-        constexpr Box() noexcept :
-            m_bottom_left(),
-            m_top_right() {
-        }
-
-        /**
-         * Create box from minimum and maximum coordinates.
-         *
-         * @pre @code minx <= maxx && miny <= maxy @endcode
-         */
-        Box(double minx, double miny, double maxx, double maxy) :
-            m_bottom_left(minx, miny),
-            m_top_right(maxx, maxy) {
-            assert(minx <= maxx && miny <= maxy);
-        }
-
-        /**
-         * Create box from bottom left and top right locations.
-         *
-         * @pre Either both locations must be defined or neither.
-         * @pre If both locations are defined, the
-         *      bottom left location must actually be to the left and below
-         *      the top right location. Same coordinates for bottom/top or
-         *      left/right are also okay.
-         */
-        Box(const osmium::Location& bottom_left, const osmium::Location& top_right) :
-            m_bottom_left(bottom_left),
-            m_top_right(top_right) {
-            assert(
-                (!!bottom_left && !!top_right) ||
-                (bottom_left.x() <= top_right.x() && bottom_left.y() <= top_right.y())
-            );
-        }
-
-        Box(const Box&) = default;
-        Box(Box&&) = default;
-        Box& operator=(const Box&) = default;
-        Box& operator=(Box&&) = default;
-        ~Box() = default;
-
-        /**
-         * Extend this bounding box by the specified location. If the
-         * location is undefined, the bounding box is unchanged. If
-         * the box is undefined it will only contain the location after
-         * this call.
-         *
-         * @param location The location we want to extend the box by.
-         * @returns A reference to this box.
-         */
-        Box& extend(const Location& location) noexcept {
-            if (location) {
-                if (m_bottom_left) {
-                    if (location.x() < m_bottom_left.x()) {
-                        m_bottom_left.set_x(location.x());
-                    }
-                    if (location.x() > m_top_right.x()) {
-                        m_top_right.set_x(location.x());
-                    }
-                    if (location.y() < m_bottom_left.y()) {
-                        m_bottom_left.set_y(location.y());
-                    }
-                    if (location.y() > m_top_right.y()) {
-                        m_top_right.set_y(location.y());
-                    }
-                } else {
-                    m_bottom_left = location;
-                    m_top_right = location;
-                }
-            }
-            return *this;
-        }
-
-        /**
-         * Extend this bounding box by the specified box. If the
-         * specified box is undefined, the bounding box is unchanged.
-         *
-         * @param box The box to extend by.
-         * @returns A reference to this box.
-         */
-        Box& extend(const Box& box) noexcept {
-            extend(box.bottom_left());
-            extend(box.top_right());
-            return *this;
-        }
-
-        /**
-         * Box is defined, ie. contains defined locations.
-         */
-        explicit constexpr operator bool() const noexcept {
-            return static_cast<bool>(m_bottom_left);
-        }
-
-        /**
-         * Box is valid, ie. defined and inside usual bounds
-         * (-180<=lon<=180, -90<=lat<=90).
-         */
-        OSMIUM_CONSTEXPR bool valid() const noexcept {
-            return bottom_left().valid() && top_right().valid();
-        }
-
-        /**
-         * Access bottom-left location.
-         */
-        OSMIUM_CONSTEXPR Location bottom_left() const noexcept {
-            return m_bottom_left;
-        }
-
-        /**
-         * Access bottom-left location.
-         */
-        Location& bottom_left() noexcept {
-            return m_bottom_left;
-        }
-
-        /**
-         * Access top-right location.
-         */
-        OSMIUM_CONSTEXPR Location top_right() const noexcept {
-            return m_top_right;
-        }
-
-        /**
-         * Access top-right location.
-         */
-        Location& top_right() noexcept {
-            return m_top_right;
-        }
-
-        /**
-         * Check whether the location is inside the box.
-         *
-         * @pre Location must be defined.
-         * @pre Box must be defined.
-         */
-        bool contains(const osmium::Location& location) const noexcept {
-            assert(bottom_left());
-            assert(top_right());
-            assert(location);
-            return location.x() >= bottom_left().x() && location.y() >= bottom_left().y() &&
-                   location.x() <= top_right().x() && location.y() <= top_right().y();
-        }
-
-        /**
-         * Calculate size of the box in square degrees.
-         *
-         * @throws osmium::invalid_location unless all coordinates are valid.
-         */
-        double size() const {
-            return (m_top_right.lon() - m_bottom_left.lon()) *
-                   (m_top_right.lat() - m_bottom_left.lat());
-        }
-
-    }; // class Box
-
-    /**
-     * Boxes are equal if both locations are equal. Undefined boxes will
-     * compare equal.
-     */
-    inline OSMIUM_CONSTEXPR bool operator==(const Box& lhs, const Box& rhs) noexcept {
-        return lhs.bottom_left() == rhs.bottom_left() &&
-               lhs.top_right() == rhs.top_right();
-    }
-
-    /**
-     * Output a box to a stream. The format is "(LON, LAT, LON, LAT)" or
-     * "(undefined)" if the box is undefined.
-     *
-     * @returns Reference to basic_ostream given as first parameter.
-     */
-    template <typename TChar, typename TTraits>
-    inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const osmium::Box& box) {
-        if (box) {
-            out << '('
-                << box.bottom_left().lon()
-                << ','
-                << box.bottom_left().lat()
-                << ','
-                << box.top_right().lon()
-                << ','
-                << box.top_right().lat()
-                << ')';
-        } else {
-            out << "(undefined)";
-        }
-        return out;
-    }
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_BOX_HPP
diff --git a/contrib/libosmium/osmium/osm/changeset.hpp b/contrib/libosmium/osmium/osm/changeset.hpp
deleted file mode 100644
index 051b525..0000000
--- a/contrib/libosmium/osmium/osm/changeset.hpp
+++ /dev/null
@@ -1,458 +0,0 @@
-#ifndef OSMIUM_OSM_CHANGESET_HPP
-#define OSMIUM_OSM_CHANGESET_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstring>
-
-#include <osmium/memory/collection.hpp>
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/box.hpp>
-#include <osmium/osm/entity.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/tag.hpp>
-#include <osmium/osm/timestamp.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/osm/types_from_string.hpp>
-
-namespace osmium {
-
-    namespace builder {
-        class ChangesetDiscussionBuilder;
-        template <typename T> class ObjectBuilder;
-    }
-
-    class Changeset;
-
-    class ChangesetComment : public osmium::memory::detail::ItemHelper {
-
-        friend class osmium::builder::ChangesetDiscussionBuilder;
-
-        osmium::Timestamp m_date;
-        osmium::user_id_type m_uid {0};
-        string_size_type m_user_size;
-        string_size_type m_text_size;
-
-        ChangesetComment(const ChangesetComment&) = delete;
-        ChangesetComment(ChangesetComment&&) = delete;
-
-        ChangesetComment& operator=(const ChangesetComment&) = delete;
-        ChangesetComment& operator=(ChangesetComment&&) = delete;
-
-        unsigned char* endpos() {
-            return data() + osmium::memory::padded_length(sizeof(ChangesetComment) + m_user_size + m_text_size);
-        }
-
-        const unsigned char* endpos() const {
-            return data() + osmium::memory::padded_length(sizeof(ChangesetComment) + m_user_size + m_text_size);
-        }
-
-        template <typename TMember>
-        friend class osmium::memory::CollectionIterator;
-
-        unsigned char* next() {
-            return endpos();
-        }
-
-        unsigned const char* next() const {
-            return endpos();
-        }
-
-        void set_user_size(string_size_type size) noexcept {
-            m_user_size = size;
-        }
-
-        void set_text_size(string_size_type size) noexcept {
-            m_text_size = size;
-        }
-
-    public:
-
-        static constexpr item_type collection_type = item_type::changeset_discussion;
-
-        ChangesetComment(osmium::Timestamp date, osmium::user_id_type uid) noexcept :
-            m_date(date),
-            m_uid(uid),
-            m_user_size(0),
-            m_text_size(0) {
-        }
-
-        osmium::Timestamp date() const noexcept {
-            return m_date;
-        }
-
-        osmium::user_id_type uid() const noexcept {
-            return m_uid;
-        }
-
-        const char* user() const noexcept {
-            return reinterpret_cast<const char*>(data() + sizeof(ChangesetComment));
-        }
-
-        const char* text() const noexcept {
-            return reinterpret_cast<const char*>(data() + sizeof(ChangesetComment) + m_user_size);
-        }
-
-    }; // class ChangesetComment
-
-    class ChangesetDiscussion : public osmium::memory::Collection<ChangesetComment, osmium::item_type::changeset_discussion> {
-
-        friend class osmium::builder::ObjectBuilder<osmium::Changeset>;
-
-    public:
-
-        typedef size_t size_type;
-
-        ChangesetDiscussion() :
-            osmium::memory::Collection<ChangesetComment, osmium::item_type::changeset_discussion>() {
-        }
-
-        size_type size() const noexcept {
-            return static_cast<size_type>(std::distance(begin(), end()));
-        }
-
-    }; // class ChangesetDiscussion
-
-    static_assert(sizeof(ChangesetDiscussion) % osmium::memory::align_bytes == 0, "Class osmium::ChangesetDiscussion has wrong size to be aligned properly!");
-
-    /**
-     * \brief An OSM Changeset, a group of changes made by a single user over
-     *        a short period of time.
-     *
-     * You can not create Changeset objects directly. Use the ChangesetBuilder
-     * class to create Changesets in a Buffer.
-     */
-    class Changeset : public osmium::OSMEntity {
-
-        friend class osmium::builder::ObjectBuilder<osmium::Changeset>;
-
-        osmium::Box       m_bounds;
-        osmium::Timestamp m_created_at;
-        osmium::Timestamp m_closed_at;
-        changeset_id_type m_id {0};
-        num_changes_type  m_num_changes {0};
-        num_comments_type m_num_comments {0};
-        user_id_type      m_uid {0};
-        string_size_type  m_user_size;
-        int16_t           m_padding1 {0};
-        int32_t           m_padding2 {0};
-
-        Changeset() :
-            OSMEntity(sizeof(Changeset), osmium::item_type::changeset) {
-        }
-
-        void set_user_size(string_size_type size) {
-            m_user_size = size;
-        }
-
-        unsigned char* subitems_position() {
-            return data() + osmium::memory::padded_length(sizeof(Changeset) + m_user_size);
-        }
-
-        const unsigned char* subitems_position() const {
-            return data() + osmium::memory::padded_length(sizeof(Changeset) + m_user_size);
-        }
-
-    public:
-
-        /// Get ID of this changeset
-        changeset_id_type id() const noexcept {
-            return m_id;
-        }
-
-        /**
-         * Set ID of this changeset
-         *
-         * @param id The id.
-         * @returns Reference to changeset to make calls chainable.
-         */
-        Changeset& set_id(changeset_id_type id) noexcept {
-            m_id = id;
-            return *this;
-        }
-
-        /**
-         * Set ID of this changeset.
-         *
-         * @param id The id.
-         * @returns Reference to object to make calls chainable.
-         */
-        Changeset& set_id(const char* id) {
-            return set_id(osmium::string_to_changeset_id(id));
-        }
-
-        /// Get user id.
-        user_id_type uid() const noexcept {
-            return m_uid;
-        }
-
-        /**
-         * Set user id.
-         *
-         * @param uid The user id.
-         * @returns Reference to changeset to make calls chainable.
-         */
-        Changeset& set_uid(user_id_type uid) noexcept {
-            m_uid = uid;
-            return *this;
-        }
-
-        /**
-         * Set user id to given uid or to 0 (anonymous user) if the given
-         * uid is smaller than 0.
-         *
-         * @param uid The user id.
-         * @returns Reference to changeset to make calls chainable.
-         */
-        Changeset& set_uid_from_signed(signed_user_id_type uid) noexcept {
-            m_uid = uid < 0 ? 0 : static_cast<user_id_type>(uid);
-            return *this;
-        }
-
-        /**
-         * Set user id to given uid or to 0 (anonymous user) if the given
-         * uid is smaller than 0.
-         *
-         * @returns Reference to changeset to make calls chainable.
-         */
-        Changeset& set_uid(const char* uid) {
-            return set_uid_from_signed(string_to_user_id(uid));
-        }
-
-        /// Is this user anonymous?
-        bool user_is_anonymous() const noexcept {
-            return m_uid == 0;
-        }
-
-        /// Get timestamp when this changeset was created.
-        osmium::Timestamp created_at() const noexcept {
-            return m_created_at;
-        }
-
-        /**
-         * Get timestamp when this changeset was closed.
-         *
-         * @returns Timestamp. Will return the empty Timestamp when the
-         *          changeset is not yet closed.
-         */
-        osmium::Timestamp closed_at() const noexcept {
-            return m_closed_at;
-        }
-
-        /// Is this changeset open?
-        bool open() const noexcept {
-            return m_closed_at == osmium::Timestamp();
-        }
-
-        /// Is this changeset closed?
-        bool closed() const noexcept {
-            return !open();
-        }
-
-        /**
-         * Set the timestamp when this changeset was created.
-         *
-         * @param timestamp Timestamp
-         * @returns Reference to changeset to make calls chainable.
-         */
-        Changeset& set_created_at(const osmium::Timestamp& timestamp) {
-            m_created_at = timestamp;
-            return *this;
-        }
-
-        /**
-         * Set the timestamp when this changeset was closed.
-         *
-         * @param timestamp Timestamp
-         * @returns Reference to changeset to make calls chainable.
-         */
-        Changeset& set_closed_at(const osmium::Timestamp& timestamp) {
-            m_closed_at = timestamp;
-            return *this;
-        }
-
-        /// Get the number of changes in this changeset
-        num_changes_type num_changes() const noexcept {
-            return m_num_changes;
-        }
-
-        /// Set the number of changes in this changeset
-        Changeset& set_num_changes(num_changes_type num_changes) noexcept {
-            m_num_changes = num_changes;
-            return *this;
-        }
-
-        /// Set the number of changes in this changeset
-        Changeset& set_num_changes(const char* num_changes) {
-            return set_num_changes(osmium::string_to_num_changes(num_changes));
-        }
-
-        /// Get the number of comments in this changeset
-        num_comments_type num_comments() const noexcept {
-            return m_num_comments;
-        }
-
-        /// Set the number of comments in this changeset
-        Changeset& set_num_comments(num_comments_type num_comments) noexcept {
-            m_num_comments = num_comments;
-            return *this;
-        }
-
-        /// Set the number of comments in this changeset
-        Changeset& set_num_comments(const char* num_comments) {
-            return set_num_comments(osmium::string_to_num_comments(num_comments));
-        }
-
-        /**
-         * Get the bounding box of this changeset.
-         *
-         * @returns Bounding box. Can be empty.
-         */
-        osmium::Box& bounds() noexcept {
-            return m_bounds;
-        }
-
-        /**
-         * Get the bounding box of this changeset.
-         *
-         * @returns Bounding box. Can be empty.
-         */
-        const osmium::Box& bounds() const noexcept {
-            return m_bounds;
-        }
-
-        /// Get user name.
-        const char* user() const {
-            return reinterpret_cast<const char*>(data() + sizeof(Changeset));
-        }
-
-        /// Get the list of tags.
-        const TagList& tags() const {
-            return osmium::detail::subitem_of_type<const TagList>(cbegin(), cend());
-        }
-
-        /**
-         * Set named attribute.
-         *
-         * @param attr Name of the attribute (must be one of "id", "version",
-         *             "changeset", "timestamp", "uid", "visible")
-         * @param value Value of the attribute
-         */
-        void set_attribute(const char* attr, const char* value) {
-            if (!strcmp(attr, "id")) {
-                set_id(value);
-            } else if (!strcmp(attr, "num_changes")) {
-                set_num_changes(value);
-            } else if (!strcmp(attr, "comments_count")) {
-                set_num_comments(value);
-            } else if (!strcmp(attr, "created_at")) {
-                set_created_at(osmium::Timestamp(value));
-            } else if (!strcmp(attr, "closed_at")) {
-                set_closed_at(osmium::Timestamp(value));
-            } else if (!strcmp(attr, "uid")) {
-                set_uid(value);
-            }
-        }
-
-        typedef osmium::memory::CollectionIterator<Item> iterator;
-        typedef osmium::memory::CollectionIterator<const Item> const_iterator;
-
-        iterator begin() {
-            return iterator(subitems_position());
-        }
-
-        iterator end() {
-            return iterator(data() + padded_size());
-        }
-
-        const_iterator cbegin() const {
-            return const_iterator(subitems_position());
-        }
-
-        const_iterator cend() const {
-            return const_iterator(data() + padded_size());
-        }
-
-        const_iterator begin() const {
-            return cbegin();
-        }
-
-        const_iterator end() const {
-            return cend();
-        }
-
-        ChangesetDiscussion& discussion() {
-            return osmium::detail::subitem_of_type<ChangesetDiscussion>(begin(), end());
-        }
-
-        const ChangesetDiscussion& discussion() const {
-            return osmium::detail::subitem_of_type<const ChangesetDiscussion>(cbegin(), cend());
-        }
-
-    }; // class Changeset
-
-    static_assert(sizeof(Changeset) % osmium::memory::align_bytes == 0, "Class osmium::Changeset has wrong size to be aligned properly!");
-
-    /**
-     * Changesets are equal if their IDs are equal.
-     */
-    inline bool operator==(const Changeset& lhs, const Changeset& rhs) {
-        return lhs.id() == rhs.id();
-    }
-
-    inline bool operator!=(const Changeset& lhs, const Changeset& rhs) {
-        return ! (lhs == rhs);
-    }
-
-    /**
-     * Changesets can be ordered by id.
-     */
-    inline bool operator<(const Changeset& lhs, const Changeset& rhs) {
-        return lhs.id() < rhs.id();
-    }
-
-    inline bool operator>(const Changeset& lhs, const Changeset& rhs) {
-        return rhs < lhs;
-    }
-
-    inline bool operator<=(const Changeset& lhs, const Changeset& rhs) {
-        return ! (rhs < lhs);
-    }
-
-    inline bool operator>=(const Changeset& lhs, const Changeset& rhs) {
-        return ! (lhs < rhs);
-    }
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_CHANGESET_HPP
diff --git a/contrib/libosmium/osmium/osm/crc.hpp b/contrib/libosmium/osmium/osm/crc.hpp
deleted file mode 100644
index 309f50a..0000000
--- a/contrib/libosmium/osmium/osm/crc.hpp
+++ /dev/null
@@ -1,242 +0,0 @@
-#ifndef OSMIUM_OSM_CRC_HPP
-#define OSMIUM_OSM_CRC_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstdint>
-
-#include <osmium/osm/area.hpp>
-#include <osmium/osm/changeset.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node.hpp>
-#include <osmium/osm/node_ref_list.hpp>
-#include <osmium/osm/relation.hpp>
-#include <osmium/osm/way.hpp>
-#include <osmium/util/endian.hpp>
-
-namespace osmium {
-
-    namespace util {
-
-        inline uint16_t byte_swap_16(uint16_t value) noexcept {
-# if defined(__GNUC__) || defined(__clang__)
-            return __builtin_bswap16(value);
-# else
-            return (value >> 8) | (value << 8);
-# endif
-        }
-
-        inline uint32_t byte_swap_32(uint32_t value) noexcept {
-# if defined(__GNUC__) || defined(__clang__)
-            return __builtin_bswap32(value);
-# else
-            return  (value >> 24) |
-                   ((value >>  8) & 0x0000FF00) |
-                   ((value <<  8) & 0x00FF0000) |
-                    (value << 24);
-# endif
-        }
-
-        inline uint64_t byte_swap_64(uint64_t value) noexcept {
-# if defined(__GNUC__) || defined(__clang__)
-            return __builtin_bswap64(value);
-# else
-            uint64_t val1 = byte_swap_32(value & 0xFFFFFFFF);
-            uint64_t val2 = byte_swap_32(value >> 32);
-            return (val1 << 32) | val2;
-# endif
-        }
-
-    }
-
-    template <typename TCRC>
-    class CRC {
-
-        TCRC m_crc;
-
-    public:
-
-        TCRC& operator()() {
-            return m_crc;
-        }
-
-        const TCRC& operator()() const {
-            return m_crc;
-        }
-
-        void update_bool(const bool value) {
-            m_crc.process_byte(value);
-        }
-
-        void update_int8(const uint8_t value) {
-            m_crc.process_byte(value);
-        }
-
-        void update_int16(const uint16_t value) {
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-            m_crc.process_bytes(&value, sizeof(uint16_t));
-#else
-            uint16_t v = osmium::util::byte_swap_16(value);
-            m_crc.process_bytes(&v, sizeof(uint16_t));
-#endif
-        }
-
-        void update_int32(const uint32_t value) {
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-            m_crc.process_bytes(&value, sizeof(uint32_t));
-#else
-            uint32_t v = osmium::util::byte_swap_32(value);
-            m_crc.process_bytes(&v, sizeof(uint32_t));
-#endif
-        }
-
-        void update_int64(const uint64_t value) {
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-            m_crc.process_bytes(&value, sizeof(uint64_t));
-#else
-            uint64_t v = osmium::util::byte_swap_64(value);
-            m_crc.process_bytes(&v, sizeof(uint64_t));
-#endif
-        }
-
-        void update_string(const char* str) {
-            while (*str) {
-                m_crc.process_byte(*str++);
-            }
-        }
-
-        void update(const Timestamp& timestamp) {
-            update_int32(uint32_t(timestamp));
-        }
-
-        void update(const osmium::Location& location) {
-            update_int32(location.x());
-            update_int32(location.y());
-        }
-
-        void update(const osmium::Box& box) {
-            update(box.bottom_left());
-            update(box.top_right());
-        }
-
-        void update(const NodeRef& node_ref) {
-            update_int64(node_ref.ref());
-        }
-
-        void update(const NodeRefList& node_refs) {
-            for (const NodeRef& node_ref : node_refs) {
-                update(node_ref);
-            }
-        }
-
-        void update(const TagList& tags) {
-            for (const Tag& tag : tags) {
-                update_string(tag.key());
-                update_string(tag.value());
-            }
-        }
-
-        void update(const osmium::RelationMember& member) {
-            update_int64(member.ref());
-            update_int16(uint16_t(member.type()));
-            update_string(member.role());
-        }
-
-        void update(const osmium::RelationMemberList& members) {
-            for (const RelationMember& member : members) {
-                update(member);
-            }
-        }
-
-        void update(const osmium::OSMObject& object) {
-            update_int64(object.id());
-            update_bool(object.visible());
-            update_int32(object.version());
-            update(object.timestamp());
-            update_int32(object.uid());
-            update_string(object.user());
-            update(object.tags());
-        }
-
-        void update(const osmium::Node& node) {
-            update(static_cast<const osmium::OSMObject&>(node));
-            update(node.location());
-        }
-
-        void update(const osmium::Way& way) {
-            update(static_cast<const osmium::OSMObject&>(way));
-            update(way.nodes());
-        }
-
-        void update(const osmium::Relation& relation) {
-            update(static_cast<const osmium::OSMObject&>(relation));
-            update(relation.members());
-        }
-
-        void update(const osmium::Area& area) {
-            update(static_cast<const osmium::OSMObject&>(area));
-            for (auto it = area.cbegin(); it != area.cend(); ++it) {
-                if (it->type() == osmium::item_type::outer_ring ||
-                    it->type() == osmium::item_type::inner_ring) {
-                    update(static_cast<const osmium::NodeRefList&>(*it));
-                }
-            }
-        }
-
-        void update(const osmium::ChangesetDiscussion& discussion) {
-            for (const auto& comment : discussion) {
-                update(comment.date());
-                update_int32(comment.uid());
-                update_string(comment.user());
-                update_string(comment.text());
-            }
-        }
-
-        void update(const osmium::Changeset& changeset) {
-            update_int64(changeset.id());
-            update(changeset.created_at());
-            update(changeset.closed_at());
-            update(changeset.bounds());
-            update_int32(changeset.num_changes());
-            update_int32(changeset.num_comments());
-            update_int32(changeset.uid());
-            update_string(changeset.user());
-            update(changeset.tags());
-            update(changeset.discussion());
-        }
-
-    }; // class CRC
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_CRC
diff --git a/contrib/libosmium/osmium/osm/diff_object.hpp b/contrib/libosmium/osmium/osm/diff_object.hpp
deleted file mode 100644
index 96e07bc..0000000
--- a/contrib/libosmium/osmium/osm/diff_object.hpp
+++ /dev/null
@@ -1,180 +0,0 @@
-#ifndef OSMIUM_OSM_DIFF_OBJECT_HPP
-#define OSMIUM_OSM_DIFF_OBJECT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <osmium/fwd.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/timestamp.hpp>
-#include <osmium/osm/types.hpp>
-
-namespace osmium {
-
-    class DiffObject {
-
-    protected:
-
-        osmium::OSMObject* m_prev;
-        osmium::OSMObject* m_curr;
-        osmium::OSMObject* m_next;
-
-    public:
-
-        DiffObject() noexcept :
-            m_prev(nullptr),
-            m_curr(nullptr),
-            m_next(nullptr) {
-        }
-
-        explicit DiffObject(osmium::OSMObject& prev, osmium::OSMObject& curr, osmium::OSMObject& next) noexcept :
-            m_prev(&prev),
-            m_curr(&curr),
-            m_next(&next) {
-        }
-
-        DiffObject(const DiffObject&) = default;
-        DiffObject& operator=(const DiffObject&) = default;
-
-        DiffObject(DiffObject&&) = default;
-        DiffObject& operator=(DiffObject&&) = default;
-
-        const osmium::OSMObject& prev() const noexcept {
-            return *m_prev;
-        }
-
-        const osmium::OSMObject& curr() const noexcept {
-            return *m_curr;
-        }
-
-        const osmium::OSMObject& next() const noexcept {
-            return *m_next;
-        }
-
-        bool first() const noexcept {
-            return m_prev == m_curr;
-        }
-
-        bool last() const noexcept {
-            return m_curr == m_next;
-        }
-
-        osmium::item_type type() const noexcept {
-            return m_curr->type();
-        }
-
-        osmium::object_id_type id() const noexcept {
-            return m_curr->id();
-        }
-
-        osmium::object_version_type version() const noexcept {
-            return m_curr->version();
-        }
-
-        osmium::changeset_id_type changeset() const noexcept {
-            return m_curr->changeset();
-        }
-
-        const osmium::Timestamp start_time() const noexcept {
-            return m_curr->timestamp();
-        }
-
-        /**
-         * Return the timestamp when the current version of the object is
-         * not valid any more, ie the time when the next version of the object
-         * is valid. If this is the last version of the object, this will
-         * return a special "end of time" timestamp that is guaranteed to
-         * be larger than any normal timestamp.
-         */
-        const osmium::Timestamp end_time() const noexcept {
-            return last() ? osmium::end_of_time() : m_next->timestamp();
-        }
-
-        /**
-         * Current object version is valid between time "from" (inclusive) and
-         * time "to" (not inclusive).
-         *
-         * This is a bit more complex than you'd think, because we have to
-         * handle the case properly where the start_time() == end_time().
-         */
-        bool is_between(const osmium::Timestamp& from, const osmium::Timestamp& to) const noexcept {
-            return start_time() < to &&
-                   ((start_time() != end_time() && end_time() >  from) ||
-                    (start_time() == end_time() && end_time() >= from));
-        }
-
-        /**
-         * Current object version is visible at the given timestamp.
-         */
-        bool is_visible_at(const osmium::Timestamp& timestamp) const noexcept {
-            return start_time() <= timestamp && end_time() > timestamp && m_curr->visible();
-        }
-
-    }; // class DiffObject
-
-    template <typename T>
-    class DiffObjectDerived : public DiffObject {
-
-    public:
-
-        DiffObjectDerived(T& prev, T& curr, T& next) noexcept :
-            DiffObject(prev, curr, next) {
-        }
-
-        DiffObjectDerived(const DiffObjectDerived&) = default;
-        DiffObjectDerived& operator=(const DiffObjectDerived&) = default;
-
-        DiffObjectDerived(DiffObjectDerived&&) = default;
-        DiffObjectDerived& operator=(DiffObjectDerived&&) = default;
-
-        const T& prev() const noexcept {
-            return *static_cast<const T*>(m_prev);
-        }
-
-        const T& curr() const noexcept {
-            return *static_cast<const T*>(m_curr);
-        }
-
-        const T& next() const noexcept {
-            return *static_cast<const T*>(m_next);
-        }
-
-    }; // class DiffObjectDerived
-
-    typedef DiffObjectDerived<osmium::Node>     DiffNode;
-    typedef DiffObjectDerived<osmium::Way>      DiffWay;
-    typedef DiffObjectDerived<osmium::Relation> DiffRelation;
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_DIFF_OBJECT_HPP
diff --git a/contrib/libosmium/osmium/osm/entity.hpp b/contrib/libosmium/osmium/osm/entity.hpp
deleted file mode 100644
index c7f7055..0000000
--- a/contrib/libosmium/osmium/osm/entity.hpp
+++ /dev/null
@@ -1,80 +0,0 @@
-#ifndef OSMIUM_OSM_ENTITY_HPP
-#define OSMIUM_OSM_ENTITY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/entity_bits.hpp>
-#include <osmium/osm/item_type.hpp>
-
-namespace osmium {
-
-    namespace detail {
-
-        template <typename TSubitem, typename TIter>
-        inline TSubitem& subitem_of_type(TIter it, TIter end) {
-            for (; it != end; ++it) {
-                if (it->type() == TSubitem::itemtype) {
-                    return reinterpret_cast<TSubitem&>(*it);
-                }
-            }
-
-            // If no subitem of the TSubitem type was found,
-            // return a default constructed one.
-            static TSubitem subitem;
-            return subitem;
-        }
-
-    } // namespace detail
-
-    /**
-     * \brief OSMEntity is the abstract base class for the OSMObject and
-     *        Changeset classes.
-     */
-    class OSMEntity : public osmium::memory::Item {
-
-    public:
-
-        explicit OSMEntity(osmium::memory::item_size_type size, osmium::item_type type) :
-            Item(size, type) {
-        }
-
-        bool type_is_in(osmium::osm_entity_bits::type entity_bits) const {
-            return (osm_entity_bits::from_item_type(type()) & entity_bits) != 0;
-        }
-
-    }; // class OSMEntity
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_ENTITY_HPP
diff --git a/contrib/libosmium/osmium/osm/entity_bits.hpp b/contrib/libosmium/osmium/osm/entity_bits.hpp
deleted file mode 100644
index 1c1cb80..0000000
--- a/contrib/libosmium/osmium/osm/entity_bits.hpp
+++ /dev/null
@@ -1,105 +0,0 @@
-#ifndef OSMIUM_OSM_ENTITY_BITS_HPP
-#define OSMIUM_OSM_ENTITY_BITS_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <osmium/osm/item_type.hpp>
-
-namespace osmium {
-
-    /**
-     * @brief Bitfield for OSM entity types.
-     */
-    namespace osm_entity_bits {
-
-        /**
-         * Describes zero or more OSM entities.
-         *
-         * Usage:
-         *
-         * @code{.cpp}
-         * osmium::osm_entity_bits::type entities = osmium::osm_entity_bits::node | osmium::osm_entity_bits::way;
-         *
-         * entities |= osmium::osm_entity_bits::relation;
-         *
-         * assert(entities & osmium::osm_entity_bits::object);
-         *
-         * assert(! (entities & osmium::osm_entity_bits::changeset));
-         * @endcode
-         */
-        enum type : unsigned char {
-
-            nothing    = 0x00,
-            node       = 0x01,
-            way        = 0x02,
-            relation   = 0x04,
-            nwr        = 0x07, ///< node, way, or relation object
-            area       = 0x08,
-            nwra       = 0x0f, ///< node, way, relation, or area object
-            object     = 0x0f, ///< node, way, relation, or area object
-            changeset  = 0x10,
-            all        = 0x1f  ///< object or changeset
-
-        }; // enum type
-
-        inline type operator|(const type lhs, const type rhs) noexcept {
-            return static_cast<type>(static_cast<int>(lhs) | static_cast<int> (rhs));
-        }
-
-        inline type& operator|=(type& lhs, const type rhs) noexcept {
-            lhs = lhs | rhs;
-            return lhs;
-        }
-
-        inline type operator&(const type lhs, const type rhs) noexcept {
-            return static_cast<type>(static_cast<int>(lhs) & static_cast<int> (rhs));
-        }
-
-        inline type operator~(const type value) noexcept {
-            return static_cast<type>(~static_cast<int>(value));
-        }
-
-        inline type operator&=(type& lhs, const type rhs) noexcept {
-            lhs = lhs & rhs;
-            return lhs;
-        }
-
-        inline type from_item_type(osmium::item_type item_type) noexcept {
-            return static_cast<osmium::osm_entity_bits::type>(0x1 << (static_cast<uint16_t>(item_type) - 1));
-        }
-
-    } // namespace osm_entity_bits
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_ENTITY_BITS_HPP
diff --git a/contrib/libosmium/osmium/osm/item_type.hpp b/contrib/libosmium/osmium/osm/item_type.hpp
deleted file mode 100644
index d8f5296..0000000
--- a/contrib/libosmium/osmium/osm/item_type.hpp
+++ /dev/null
@@ -1,200 +0,0 @@
-#ifndef OSMIUM_OSM_ITEM_TYPE_HPP
-#define OSMIUM_OSM_ITEM_TYPE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cassert>
-#include <cstdint> // IWYU pragma: keep
-#include <iosfwd>
-#include <stdexcept>
-
-namespace osmium {
-
-    enum class item_type : uint16_t {
-
-        undefined                              = 0x00,
-        node                                   = 0x01,
-        way                                    = 0x02,
-        relation                               = 0x03,
-        area                                   = 0x04,
-        changeset                              = 0x05,
-        tag_list                               = 0x11,
-        way_node_list                          = 0x12,
-        relation_member_list                   = 0x13,
-        relation_member_list_with_full_members = 0x23,
-        outer_ring                             = 0x40,
-        inner_ring                             = 0x41,
-        changeset_discussion                   = 0x80
-
-    }; // enum class item_type
-
-    /**
-     * Return item_type for index:
-     * 0 -> node, 1 -> way, 2 -> relation
-     */
-    inline item_type nwr_index_to_item_type(unsigned int i) noexcept {
-        assert(i <= 2);
-        return item_type(i+1);
-    }
-
-    /**
-     * Return index for item_type:
-     * node -> 0, way -> 1, relation -> 2
-     */
-    inline unsigned int item_type_to_nwr_index(item_type type) noexcept {
-        unsigned int i = static_cast<unsigned int>(type);
-        assert(i >= 1 && i <= 3);
-        return i - 1;
-    }
-
-    inline item_type char_to_item_type(const char c) noexcept {
-        switch (c) {
-            case 'X':
-                return item_type::undefined;
-            case 'n':
-                return item_type::node;
-            case 'w':
-                return item_type::way;
-            case 'r':
-                return item_type::relation;
-            case 'a':
-                return item_type::area;
-            case 'c':
-                return item_type::changeset;
-            case 'T':
-                return item_type::tag_list;
-            case 'N':
-                return item_type::way_node_list;
-            case 'M':
-                return item_type::relation_member_list;
-            case 'F':
-                return item_type::relation_member_list_with_full_members;
-            case 'O':
-                return item_type::outer_ring;
-            case 'I':
-                return item_type::inner_ring;
-            case 'D':
-                return item_type::changeset_discussion;
-            default:
-                return item_type::undefined;
-        }
-    }
-
-// avoid g++ false positive
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wreturn-type"
-    inline char item_type_to_char(const item_type type) noexcept {
-        switch (type) {
-            case item_type::undefined:
-                return 'X';
-            case item_type::node:
-                return 'n';
-            case item_type::way:
-                return 'w';
-            case item_type::relation:
-                return 'r';
-            case item_type::area:
-                return 'a';
-            case item_type::changeset:
-                return 'c';
-            case item_type::tag_list:
-                return 'T';
-            case item_type::way_node_list:
-                return 'N';
-            case item_type::relation_member_list:
-                return 'M';
-            case item_type::relation_member_list_with_full_members:
-                return 'F';
-            case item_type::outer_ring:
-                return 'O';
-            case item_type::inner_ring:
-                return 'I';
-            case item_type::changeset_discussion:
-                return 'D';
-        }
-    }
-
-    inline const char* item_type_to_name(const item_type type) noexcept {
-        switch (type) {
-            case item_type::undefined:
-                return "undefined";
-            case item_type::node:
-                return "node";
-            case item_type::way:
-                return "way";
-            case item_type::relation:
-                return "relation";
-            case item_type::area:
-                return "area";
-            case item_type::changeset:
-                return "changeset";
-            case item_type::tag_list:
-                return "tag_list";
-            case item_type::way_node_list:
-                return "way_node_list";
-            case item_type::relation_member_list:
-                return "relation_member_list";
-            case item_type::relation_member_list_with_full_members:
-                return "relation_member_list_with_full_members";
-            case item_type::outer_ring:
-                return "outer_ring";
-            case item_type::inner_ring:
-                return "inner_ring";
-            case item_type::changeset_discussion:
-                return "changeset_discussion";
-        }
-    }
-#pragma GCC diagnostic pop
-
-    template <typename TChar, typename TTraits>
-    inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const item_type item_type) {
-        return out << item_type_to_char(item_type);
-    }
-
-    /**
-     * This exception is thrown when a visitor encounters an unknown item type.
-     * Under usual circumstance this should not happen. If it does happen, it
-     * probably means the buffer contains different kinds of objects than were
-     * expected or that there is some kind of data corruption.
-     */
-    struct unknown_type : public std::runtime_error {
-
-        unknown_type() :
-            std::runtime_error("unknown item type") {
-        }
-
-    }; // struct unknown_type
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_ITEM_TYPE_HPP
diff --git a/contrib/libosmium/osmium/osm/location.hpp b/contrib/libosmium/osmium/osm/location.hpp
deleted file mode 100644
index 0d4fdc1..0000000
--- a/contrib/libosmium/osmium/osm/location.hpp
+++ /dev/null
@@ -1,285 +0,0 @@
-#ifndef OSMIUM_OSM_LOCATION_HPP
-#define OSMIUM_OSM_LOCATION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cmath>
-#include <cstdint>
-#include <iosfwd>
-#include <stdexcept>
-#include <string>
-
-#include <iostream>
-
-#include <osmium/util/compatibility.hpp>
-#include <osmium/util/double.hpp>
-
-namespace osmium {
-
-    /**
-     * Exception signaling an invalid location, ie a location
-     * outside the -180 to 180 and -90 to 90 degree range.
-     */
-    struct invalid_location : public std::range_error {
-
-        invalid_location(const std::string& what) :
-            std::range_error(what) {
-        }
-
-        invalid_location(const char* what) :
-            std::range_error(what) {
-        }
-
-    }; // struct invalid_location
-
-    /**
-     * Locations define a place on earth.
-     *
-     * Locations are stored in 32 bit integers for the x and y
-     * coordinates, respectively. This gives you an accuracy of a few
-     * centimeters, good enough for OSM use. (The main OSM database
-     * uses the same scheme.)
-     *
-     * An undefined Location can be created by calling the constructor
-     * without parameters.
-     *
-     * Coordinates are never checked on whether they are inside bounds.
-     * Call valid() to check this.
-     */
-    class Location {
-
-        int32_t m_x;
-        int32_t m_y;
-
-    public:
-
-        // this value is used for a coordinate to mark it as undefined
-        // MSVC doesn't declare std::numeric_limits<int32_t>::max() as
-        // constexpr, so we hard code this for the time being.
-        // static constexpr int32_t undefined_coordinate = std::numeric_limits<int32_t>::max();
-        static constexpr int32_t undefined_coordinate = 2147483647;
-
-        static constexpr int coordinate_precision = 10000000;
-
-        static int32_t double_to_fix(const double c) noexcept {
-            return static_cast<int32_t>(std::round(c * coordinate_precision));
-        }
-
-        static OSMIUM_CONSTEXPR double fix_to_double(const int32_t c) noexcept {
-            return static_cast<double>(c) / coordinate_precision;
-        }
-
-        /**
-         * Create undefined Location.
-         */
-        explicit constexpr Location() noexcept :
-            m_x(undefined_coordinate),
-            m_y(undefined_coordinate) {
-        }
-
-        /**
-         * Create Location with given x and y coordinates.
-         * Note that these coordinates are coordinate_precision
-         * times larger than the real coordinates.
-         */
-        constexpr Location(const int32_t x, const int32_t y) noexcept :
-            m_x(x),
-            m_y(y) {
-        }
-
-        /**
-         * Create Location with given x and y coordinates.
-         * Note that these coordinates are coordinate_precision
-         * times larger than the real coordinates.
-         */
-        constexpr Location(const int64_t x, const int64_t y) noexcept :
-            m_x(static_cast<int32_t>(x)),
-            m_y(static_cast<int32_t>(y)) {
-        }
-
-        /**
-         * Create Location with given longitude and latitude.
-         */
-        Location(const double lon, const double lat) :
-            m_x(double_to_fix(lon)),
-            m_y(double_to_fix(lat)) {
-        }
-
-        Location(const Location&) = default;
-        Location(Location&&) = default;
-        Location& operator=(const Location&) = default;
-        Location& operator=(Location&&) = default;
-        ~Location() = default;
-
-        /**
-         * Check whether the coordinates of this location
-         * are defined.
-         */
-        explicit constexpr operator bool() const noexcept {
-            return m_x != undefined_coordinate && m_y != undefined_coordinate;
-        }
-
-        /**
-         * Check whether the coordinates are inside the
-         * usual bounds (-180<=lon<=180, -90<=lat<=90).
-         */
-        constexpr bool valid() const noexcept {
-            return m_x >= -180 * coordinate_precision
-                && m_x <=  180 * coordinate_precision
-                && m_y >=  -90 * coordinate_precision
-                && m_y <=   90 * coordinate_precision;
-        }
-
-        constexpr int32_t x() const noexcept {
-            return m_x;
-        }
-
-        constexpr int32_t y() const noexcept {
-            return m_y;
-        }
-
-        Location& set_x(const int32_t x) noexcept {
-            m_x = x;
-            return *this;
-        }
-
-        Location& set_y(const int32_t y) noexcept {
-            m_y = y;
-            return *this;
-        }
-
-        /**
-         * Get longitude.
-         *
-         * @throws invalid_location if the location is invalid
-         */
-        double lon() const {
-            if (!valid()) {
-                throw osmium::invalid_location("invalid location");
-            }
-            return fix_to_double(m_x);
-        }
-
-        /**
-         * Get longitude without checking the validity.
-         */
-        double lon_without_check() const {
-            return fix_to_double(m_x);
-        }
-
-        /**
-         * Get latitude.
-         *
-         * @throws invalid_location if the location is invalid
-         */
-        double lat() const {
-            if (!valid()) {
-                throw osmium::invalid_location("invalid location");
-            }
-            return fix_to_double(m_y);
-        }
-
-        /**
-         * Get latitude without checking the validity.
-         */
-        double lat_without_check() const {
-            return fix_to_double(m_y);
-        }
-
-        Location& set_lon(double lon) noexcept {
-            m_x = double_to_fix(lon);
-            return *this;
-        }
-
-        Location& set_lat(double lat) noexcept {
-            m_y = double_to_fix(lat);
-            return *this;
-        }
-
-        template <typename T>
-        T as_string(T iterator, const char separator) const {
-            iterator = osmium::util::double2string(iterator, lon(), 7);
-            *iterator++ = separator;
-            return osmium::util::double2string(iterator, lat(), 7);
-        }
-
-    }; // class Location
-
-    /**
-     * Locations are equal if both coordinates are equal.
-     */
-    inline OSMIUM_CONSTEXPR bool operator==(const Location& lhs, const Location& rhs) noexcept {
-        return lhs.x() == rhs.x() && lhs.y() == rhs.y();
-    }
-
-    inline OSMIUM_CONSTEXPR bool operator!=(const Location& lhs, const Location& rhs) noexcept {
-        return ! (lhs == rhs);
-    }
-
-    /**
-     * Compare two locations by comparing first the x and then
-     * the y coordinate. If either of the locations is
-     * undefined the result is undefined.
-     */
-    inline OSMIUM_CONSTEXPR bool operator<(const Location& lhs, const Location& rhs) noexcept {
-        return (lhs.x() == rhs.x() && lhs.y() < rhs.y()) || lhs.x() < rhs.x();
-    }
-
-    inline OSMIUM_CONSTEXPR bool operator>(const Location& lhs, const Location& rhs) noexcept {
-        return rhs < lhs;
-    }
-
-    inline OSMIUM_CONSTEXPR bool operator<=(const Location& lhs, const Location& rhs) noexcept {
-        return ! (rhs < lhs);
-    }
-
-    inline OSMIUM_CONSTEXPR bool operator>=(const Location& lhs, const Location& rhs) noexcept {
-        return ! (lhs < rhs);
-    }
-
-    /**
-     * Output a location to a stream.
-     */
-    template <typename TChar, typename TTraits>
-    inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const osmium::Location& location) {
-        if (location) {
-            out << '(' << location.lon() << ',' << location.lat() << ')';
-        } else {
-            out << "(undefined,undefined)";
-        }
-        return out;
-    }
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_LOCATION_HPP
diff --git a/contrib/libosmium/osmium/osm/node.hpp b/contrib/libosmium/osmium/osm/node.hpp
deleted file mode 100644
index e9facef..0000000
--- a/contrib/libosmium/osmium/osm/node.hpp
+++ /dev/null
@@ -1,76 +0,0 @@
-#ifndef OSMIUM_OSM_NODE_HPP
-#define OSMIUM_OSM_NODE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/object.hpp>
-
-namespace osmium {
-
-    namespace builder {
-        template <typename T> class ObjectBuilder;
-    }
-
-    class Node : public OSMObject {
-
-        friend class osmium::builder::ObjectBuilder<osmium::Node>;
-
-        osmium::Location m_location;
-
-        Node() :
-            OSMObject(sizeof(Node), osmium::item_type::node) {
-        }
-
-    public:
-
-        static constexpr osmium::item_type itemtype = osmium::item_type::node;
-
-        osmium::Location location() const noexcept {
-            return m_location;
-        }
-
-        Node& set_location(const osmium::Location& location) {
-            m_location = location;
-            return *this;
-        }
-
-    }; // class Node
-
-    static_assert(sizeof(Node) % osmium::memory::align_bytes == 0, "Class osmium::Node has wrong size to be aligned properly!");
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_NODE_HPP
diff --git a/contrib/libosmium/osmium/osm/node_ref.hpp b/contrib/libosmium/osmium/osm/node_ref.hpp
deleted file mode 100644
index 72359cd..0000000
--- a/contrib/libosmium/osmium/osm/node_ref.hpp
+++ /dev/null
@@ -1,173 +0,0 @@
-#ifndef OSMIUM_OSM_NODE_REF_HPP
-#define OSMIUM_OSM_NODE_REF_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstdint>
-#include <cstdlib>
-#include <iosfwd>
-
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/types.hpp>
-
-namespace osmium {
-
-    /**
-     * This reference to a node contains a node ID and a (possibly empty)
-     * location.
-     */
-    class NodeRef : public osmium::memory::detail::ItemHelper {
-
-        osmium::object_id_type m_ref;
-        osmium::Location m_location;
-
-    public:
-
-        NodeRef(const osmium::object_id_type ref = 0, const osmium::Location& location = Location()) noexcept :
-            m_ref(ref),
-            m_location(location) {
-        }
-
-        osmium::object_id_type ref() const noexcept {
-            return m_ref;
-        }
-
-        osmium::unsigned_object_id_type positive_ref() const noexcept {
-            return static_cast<osmium::unsigned_object_id_type>(std::abs(m_ref));
-        }
-
-        /**
-         * Get reference to location in this NodeRef. Can be used to update it.
-         */
-        osmium::Location& location() noexcept {
-            return m_location;
-        }
-
-        osmium::Location location() const noexcept {
-            return m_location;
-        }
-
-        double lon() const {
-            return m_location.lon();
-        }
-
-        double lat() const {
-            return m_location.lat();
-        }
-
-        int32_t x() const noexcept {
-            return m_location.x();
-        }
-
-        int32_t y() const noexcept {
-            return m_location.y();
-        }
-
-        NodeRef& set_ref(const osmium::object_id_type ref) noexcept {
-            m_ref = ref;
-            return *this;
-        }
-
-        NodeRef& set_location(const osmium::Location& location) noexcept {
-            m_location = location;
-            return *this;
-        }
-
-    }; // class NodeRef
-
-    inline bool operator==(const NodeRef& lhs, const NodeRef& rhs) noexcept {
-        return lhs.ref() == rhs.ref();
-    }
-
-    inline bool operator!=(const NodeRef& lhs, const NodeRef& rhs) noexcept {
-        return ! (lhs == rhs);
-    }
-
-    inline bool operator<(const NodeRef& lhs, const NodeRef& rhs) noexcept {
-        return lhs.ref() < rhs.ref();
-    }
-
-    inline bool operator>(const NodeRef& lhs, const NodeRef& rhs) noexcept {
-        return rhs < lhs;
-    }
-
-    inline bool operator<=(const NodeRef& lhs, const NodeRef& rhs) noexcept {
-        return ! (rhs < lhs);
-    }
-
-    inline bool operator>=(const NodeRef& lhs, const NodeRef& rhs) noexcept {
-        return ! (lhs < rhs);
-    }
-
-    /**
-     * Output a NodeRef to a stream.
-     */
-    template <typename TChar, typename TTraits>
-    inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const osmium::NodeRef& nr) {
-        return out << "<" << nr.ref() << " " << nr.location() << ">";
-    }
-
-    /**
-     * Functor to compare NodeRefs by Location instead of id.
-     */
-    struct location_equal {
-
-        bool operator()(const NodeRef& lhs, const NodeRef& rhs) const noexcept {
-            return lhs.location() == rhs.location();
-        }
-
-        typedef NodeRef first_argument_type;
-        typedef NodeRef second_argument_type;
-        typedef bool result_type;
-
-    }; // struct location_equal
-
-    /**
-     * Functor to compare NodeRefs by Location instead of id.
-     */
-    struct location_less {
-
-        bool operator()(const NodeRef& lhs, const NodeRef& rhs) const noexcept {
-            return lhs.location() < rhs.location();
-        }
-
-        typedef NodeRef first_argument_type;
-        typedef NodeRef second_argument_type;
-        typedef bool result_type;
-
-    }; // struct location_less
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_NODE_REF_HPP
diff --git a/contrib/libosmium/osmium/osm/node_ref_list.hpp b/contrib/libosmium/osmium/osm/node_ref_list.hpp
deleted file mode 100644
index c6c4213..0000000
--- a/contrib/libosmium/osmium/osm/node_ref_list.hpp
+++ /dev/null
@@ -1,184 +0,0 @@
-#ifndef OSMIUM_OSM_NODE_REF_LIST_HPP
-#define OSMIUM_OSM_NODE_REF_LIST_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cassert>
-#include <cstddef>
-#include <iterator>
-
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/node_ref.hpp>
-
-namespace osmium {
-
-    /**
-     * A vector of NodeRef objects. Usually this is not instantiated directly,
-     * but one of its subclasses are used.
-     */
-    class NodeRefList : public osmium::memory::Item {
-
-    public:
-
-        NodeRefList(osmium::item_type itemtype) noexcept :
-            osmium::memory::Item(sizeof(NodeRefList), itemtype) {
-        }
-
-        /**
-         * Checks whether the node list is empty.
-         */
-        bool empty() const noexcept {
-            return sizeof(NodeRefList) == byte_size();
-        }
-
-        /**
-         * Returns the number of nodes in the list.
-         */
-        size_t size() const noexcept {
-            auto size_node_refs = byte_size() - sizeof(NodeRefList);
-            assert(size_node_refs % sizeof(NodeRef) == 0);
-            return size_node_refs / sizeof(NodeRef);
-        }
-
-        /**
-         * Access specified element.
-         *
-         * @param n Get this element of the list.
-         * @pre @code n < size() @endcode
-         */
-        const NodeRef& operator[](size_t n) const noexcept {
-            assert(n < size());
-            const NodeRef* node_ref = &*(cbegin());
-            return node_ref[n];
-        }
-
-        /**
-         * Access the first element.
-         *
-         * @pre @code !empty() @endcode
-         */
-        const NodeRef& front() const noexcept {
-            assert(!empty());
-            return operator[](0);
-        }
-
-        /**
-         * Access the last element.
-         *
-         * @pre @code !empty() @endcode
-         */
-        const NodeRef& back() const noexcept {
-            assert(!empty());
-            return operator[](size()-1);
-        }
-
-        /**
-         * Checks whether the first and last node in the list have the same ID.
-         *
-         * @pre @code !empty() @endcode
-         */
-        bool is_closed() const noexcept {
-            return front().ref() == back().ref();
-        }
-
-        /**
-         * Checks whether the first and last node in the list have the same ID.
-         *
-         * @pre @code !empty() @endcode
-         */
-        bool ends_have_same_id() const noexcept {
-            return front().ref() == back().ref();
-        }
-
-        /**
-         * Checks whether the first and last node in the list have the same
-         * location. The ID is not checked.
-         *
-         * @pre @code !empty() @endcode
-         * @pre @code front().location() && back().location() @endcode
-         */
-        bool ends_have_same_location() const {
-            assert(front().location() && back().location());
-            return front().location() == back().location();
-        }
-
-        typedef NodeRef* iterator;
-        typedef const NodeRef* const_iterator;
-        typedef std::reverse_iterator<const NodeRef*> const_reverse_iterator;
-
-        /// Returns an iterator to the beginning.
-        iterator begin() noexcept {
-            return iterator(data() + sizeof(NodeRefList));
-        }
-
-        /// Returns an iterator to the end.
-        iterator end() noexcept {
-            return iterator(data() + byte_size());
-        }
-
-        /// Returns an iterator to the beginning.
-        const_iterator cbegin() const noexcept {
-            return const_iterator(data() + sizeof(NodeRefList));
-        }
-
-        /// Returns an iterator to the end.
-        const_iterator cend() const noexcept {
-            return const_iterator(data() + byte_size());
-        }
-
-        /// Returns an iterator to the beginning.
-        const_iterator begin() const noexcept {
-            return cbegin();
-        }
-
-        /// Returns an iterator to the end.
-        const_iterator end() const noexcept {
-            return cend();
-        }
-
-        /// Returns a reverse_iterator to the beginning.
-        const_reverse_iterator crbegin() const noexcept {
-            return const_reverse_iterator(cend());
-        }
-
-        /// Returns a reverse_iterator to the end.
-        const_reverse_iterator crend() const noexcept {
-            return const_reverse_iterator(cbegin());
-        }
-
-    }; // class NodeRefList
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_NODE_REF_LIST_HPP
diff --git a/contrib/libosmium/osmium/osm/object.hpp b/contrib/libosmium/osmium/osm/object.hpp
deleted file mode 100644
index c0f46ad..0000000
--- a/contrib/libosmium/osmium/osm/object.hpp
+++ /dev/null
@@ -1,438 +0,0 @@
-#ifndef OSMIUM_OSM_OBJECT_HPP
-#define OSMIUM_OSM_OBJECT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstddef>
-#include <cstdint>
-#include <cstdlib>
-#include <cstring>
-#include <stdexcept>
-
-#include <osmium/memory/collection.hpp>
-#include <osmium/memory/item.hpp>
-#include <osmium/memory/item_iterator.hpp>
-#include <osmium/osm/entity.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/tag.hpp>
-#include <osmium/osm/timestamp.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/osm/types_from_string.hpp>
-
-namespace osmium {
-
-    /**
-     * OSMObject (Node, Way, Relation, or Area).
-     */
-    class OSMObject : public osmium::OSMEntity {
-
-        object_id_type      m_id;
-        bool                m_deleted : 1;
-        object_version_type m_version : 31;
-        osmium::Timestamp   m_timestamp;
-        user_id_type        m_uid;
-        changeset_id_type   m_changeset;
-
-        size_t sizeof_object() const noexcept {
-            return sizeof(OSMObject) + (type() == item_type::node ? sizeof(osmium::Location) : 0) + sizeof(string_size_type);
-        }
-
-        unsigned char* user_position() noexcept {
-            return data() + sizeof_object() - sizeof(string_size_type);
-        }
-
-        const unsigned char* user_position() const noexcept {
-            return data() + sizeof_object() - sizeof(string_size_type);
-        }
-
-        string_size_type user_size() const noexcept {
-            return *reinterpret_cast<const string_size_type*>(user_position());
-        }
-
-        unsigned char* subitems_position() {
-            return data() + osmium::memory::padded_length(sizeof_object() + user_size());
-        }
-
-        const unsigned char* subitems_position() const {
-            return data() + osmium::memory::padded_length(sizeof_object() + user_size());
-        }
-
-    protected:
-
-        OSMObject(osmium::memory::item_size_type size, osmium::item_type type) :
-            OSMEntity(size, type),
-            m_id(0),
-            m_deleted(false),
-            m_version(0),
-            m_timestamp(),
-            m_uid(0),
-            m_changeset(0) {
-        }
-
-        void set_user_size(string_size_type size) {
-            *reinterpret_cast<string_size_type*>(user_position()) = size;
-        }
-
-    public:
-
-        /// Get ID of this object.
-        object_id_type id() const noexcept {
-            return m_id;
-        }
-
-        /// Get absolute value of the ID of this object.
-        unsigned_object_id_type positive_id() const noexcept {
-            return static_cast<unsigned_object_id_type>(std::abs(m_id));
-        }
-
-        /**
-         * Set ID of this object.
-         *
-         * @returns Reference to object to make calls chainable.
-         */
-        OSMObject& set_id(object_id_type id) noexcept {
-            m_id = id;
-            return *this;
-        }
-
-        /**
-         * Set ID of this object.
-         *
-         * @returns Reference to object to make calls chainable.
-         */
-        OSMObject& set_id(const char* id) {
-            return set_id(osmium::string_to_object_id(id));
-        }
-
-        /// Is this object marked as deleted?
-        bool deleted() const noexcept {
-            return m_deleted;
-        }
-
-        /// Is this object marked visible (ie not deleted)?
-        bool visible() const noexcept {
-            return !deleted();
-        }
-
-        /**
-         * Mark this object as deleted (or not).
-         *
-         * @returns Reference to object to make calls chainable.
-         */
-        OSMObject& set_deleted(bool deleted) noexcept {
-            m_deleted = deleted;
-            return *this;
-        }
-
-        /**
-         * Mark this object as visible (ie not deleted) (or not).
-         *
-         * @returns Reference to object to make calls chainable.
-         */
-        OSMObject& set_visible(bool visible) noexcept {
-            m_deleted = !visible;
-            return *this;
-        }
-
-        /**
-         * Mark this object as visible (ie not deleted) or deleted.
-         *
-         * @param visible Either "true" or "false"
-         * @returns Reference to object to make calls chainable.
-         */
-        OSMObject& set_visible(const char* visible) {
-            if (!strcmp("true", visible)) {
-                set_visible(true);
-            } else if (!strcmp("false", visible)) {
-                set_visible(false);
-            } else {
-                throw std::invalid_argument("Unknown value for visible attribute (allowed is 'true' or 'false')");
-            }
-            return *this;
-        }
-
-        /// Get version of this object.
-        object_version_type version() const noexcept {
-            return m_version;
-        }
-
-        /**
-         * Set object version.
-         *
-         * @returns Reference to object to make calls chainable.
-         */
-        OSMObject& set_version(object_version_type version) noexcept {
-            m_version = version;
-            return *this;
-        }
-
-        /**
-         * Set object version.
-         *
-         * @returns Reference to object to make calls chainable.
-         */
-        OSMObject& set_version(const char* version) {
-            return set_version(string_to_object_version(version));
-        }
-
-        /// Get changeset id of this object.
-        changeset_id_type changeset() const noexcept {
-            return m_changeset;
-        }
-
-        /**
-         * Set changeset id of this object.
-         *
-         * @returns Reference to object to make calls chainable.
-         */
-        OSMObject& set_changeset(changeset_id_type changeset) noexcept {
-            m_changeset = changeset;
-            return *this;
-        }
-
-        /**
-         * Set changeset id of this object.
-         *
-         * @returns Reference to object to make calls chainable.
-         */
-        OSMObject& set_changeset(const char* changeset) {
-            return set_changeset(string_to_changeset_id(changeset));
-        }
-
-        /// Get user id of this object.
-        user_id_type uid() const noexcept {
-            return m_uid;
-        }
-
-        /**
-         * Set user id of this object.
-         *
-         * @returns Reference to object to make calls chainable.
-         */
-        OSMObject& set_uid(user_id_type uid) noexcept {
-            m_uid = uid;
-            return *this;
-        }
-
-        /**
-         * Set user id of this object.
-         * Sets uid to 0 (anonymous) if the given uid is smaller than 0.
-         *
-         * @returns Reference to object to make calls chainable.
-         */
-        OSMObject& set_uid_from_signed(signed_user_id_type uid) noexcept {
-            m_uid = uid < 0 ? 0 : static_cast<user_id_type>(uid);
-            return *this;
-        }
-
-        /**
-         * Set user id of this object.
-         *
-         * @returns Reference to object to make calls chainable.
-         */
-        OSMObject& set_uid(const char* uid) {
-            return set_uid_from_signed(string_to_user_id(uid));
-        }
-
-        /// Is this user anonymous?
-        bool user_is_anonymous() const noexcept {
-            return m_uid == 0;
-        }
-
-        /// Get timestamp when this object last changed.
-        osmium::Timestamp timestamp() const noexcept {
-            return m_timestamp;
-        }
-
-        /**
-         * Set the timestamp when this object last changed.
-         *
-         * @param timestamp Timestamp
-         * @returns Reference to object to make calls chainable.
-         */
-        OSMObject& set_timestamp(const osmium::Timestamp& timestamp) noexcept {
-            m_timestamp = timestamp;
-            return *this;
-        }
-
-        /// Get user name for this object.
-        const char* user() const noexcept {
-            return reinterpret_cast<const char*>(data() + sizeof_object());
-        }
-
-        /// Get the list of tags for this object.
-        const TagList& tags() const {
-            return osmium::detail::subitem_of_type<const TagList>(cbegin(), cend());
-        }
-
-        /**
-         * Get tag value by key.
-         *
-         * Convenience function that will forward to same function on TagList
-         * object.
-         */
-        const char* get_value_by_key(const char* key, const char* default_value = nullptr) const noexcept {
-            return tags().get_value_by_key(key, default_value);
-        }
-
-        /**
-         * Set named attribute.
-         *
-         * @param attr Name of the attribute (must be one of "id", "version", "changeset", "timestamp", "uid", "visible")
-         * @param value Value of the attribute
-         */
-        void set_attribute(const char* attr, const char* value) {
-            if (!strcmp(attr, "id")) {
-                set_id(value);
-            } else if (!strcmp(attr, "version")) {
-                set_version(value);
-            } else if (!strcmp(attr, "changeset")) {
-                set_changeset(value);
-            } else if (!strcmp(attr, "timestamp")) {
-                set_timestamp(osmium::Timestamp(value));
-            } else if (!strcmp(attr, "uid")) {
-                set_uid(value);
-            } else if (!strcmp(attr, "visible")) {
-                set_visible(value);
-            }
-        }
-
-        typedef osmium::memory::CollectionIterator<Item> iterator;
-        typedef osmium::memory::CollectionIterator<const Item> const_iterator;
-
-        iterator begin() {
-            return iterator(subitems_position());
-        }
-
-        iterator end() {
-            return iterator(next());
-        }
-
-        const_iterator cbegin() const {
-            return const_iterator(subitems_position());
-        }
-
-        const_iterator cend() const {
-            return const_iterator(next());
-        }
-
-        const_iterator begin() const {
-            return cbegin();
-        }
-
-        const_iterator end() const {
-            return cend();
-        }
-
-        template <typename T>
-        using t_iterator = osmium::memory::ItemIterator<T>;
-
-        template <typename T>
-        using t_const_iterator = osmium::memory::ItemIterator<const T>;
-
-        template <typename T>
-        t_iterator<T> begin() {
-            return t_iterator<T>(subitems_position(), next());
-        }
-
-        template <typename T>
-        t_iterator<T> end() {
-            return t_iterator<T>(next(), next());
-        }
-
-        template <typename T>
-        t_const_iterator<T> cbegin() const {
-            return t_const_iterator<T>(subitems_position(), next());
-        }
-
-        template <typename T>
-        t_const_iterator<T> cend() const {
-            return t_const_iterator<T>(next(), next());
-        }
-
-        template <typename T>
-        t_const_iterator<T> begin() const {
-            return cbegin<T>();
-        }
-
-        template <typename T>
-        t_const_iterator<T> end() const {
-            return cend<T>();
-        }
-
-    }; // class OSMObject
-
-    static_assert(sizeof(OSMObject) % osmium::memory::align_bytes == 0, "Class osmium::OSMObject has wrong size to be aligned properly!");
-
-    /**
-     * OSMObjects are equal if their type, id, and version are equal.
-     */
-    inline bool operator==(const OSMObject& lhs, const OSMObject& rhs) noexcept {
-        return lhs.type() == rhs.type() &&
-               lhs.id() == rhs.id() &&
-               lhs.version() == rhs.version();
-    }
-
-    inline bool operator!=(const OSMObject& lhs, const OSMObject& rhs) noexcept {
-        return ! (lhs == rhs);
-    }
-
-    /**
-     * OSMObjects can be ordered by type, id and version.
-     * Note that we use the absolute value of the id for a
-     * better ordering of objects with negative id.
-     */
-    inline bool operator<(const OSMObject& lhs, const OSMObject& rhs) noexcept {
-        if (lhs.type() != rhs.type()) {
-            return lhs.type() < rhs.type();
-        }
-        return (lhs.id() == rhs.id() && lhs.version() < rhs.version()) ||
-               lhs.positive_id() < rhs.positive_id();
-    }
-
-    inline bool operator>(const OSMObject& lhs, const OSMObject& rhs) noexcept {
-        return rhs < lhs;
-    }
-
-    inline bool operator<=(const OSMObject& lhs, const OSMObject& rhs) noexcept {
-        return ! (rhs < lhs);
-    }
-
-    inline bool operator>=(const OSMObject& lhs, const OSMObject& rhs) noexcept {
-        return ! (lhs < rhs);
-    }
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_OBJECT_HPP
diff --git a/contrib/libosmium/osmium/osm/object_comparisons.hpp b/contrib/libosmium/osmium/osm/object_comparisons.hpp
deleted file mode 100644
index bdf99e1..0000000
--- a/contrib/libosmium/osmium/osm/object_comparisons.hpp
+++ /dev/null
@@ -1,110 +0,0 @@
-#ifndef OSMIUM_OSM_OBJECT_COMPARISONS_HPP
-#define OSMIUM_OSM_OBJECT_COMPARISONS_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <osmium/osm/object.hpp>
-
-namespace osmium {
-
-    /**
-     * Function object class for comparing OSM objects for equality by type, id, and version.
-     */
-    struct object_equal_type_id_version {
-
-        bool operator()(const osmium::OSMObject& lhs, const osmium::OSMObject& rhs) const noexcept {
-            return lhs == rhs;
-        }
-
-        bool operator()(const osmium::OSMObject* lhs, const osmium::OSMObject* rhs) const noexcept {
-            return *lhs == *rhs;
-        }
-
-    }; // struct object_equal_type_id_version
-
-    /**
-     * Function object class for comparing OSM objects for equality by type and id,
-     * ignoring the version.
-     */
-    struct object_equal_type_id {
-
-        bool operator()(const osmium::OSMObject& lhs, const osmium::OSMObject& rhs) const noexcept {
-            return lhs.type() == rhs.type() &&
-                   lhs.id() == rhs.id();
-        }
-
-        bool operator()(const osmium::OSMObject* lhs, const osmium::OSMObject* rhs) const noexcept {
-            return operator()(*lhs, *rhs);
-        }
-
-    }; // struct object_equal_type_id
-
-    /**
-     * Function object class for ordering OSM objects by type, id, and version.
-     */
-    struct object_order_type_id_version {
-
-        bool operator()(const osmium::OSMObject& lhs, const osmium::OSMObject& rhs) const noexcept {
-            return lhs < rhs;
-        }
-
-        bool operator()(const osmium::OSMObject* lhs, const osmium::OSMObject* rhs) const noexcept {
-            return *lhs < *rhs;
-        }
-
-    }; // struct object_order_type_id_version
-
-    /**
-     * Function object class for ordering OSM objects by type, id, and reverse version,
-     * ie objects are ordered by type and id, but later versions of an object are
-     * ordered before earlier versions of the same object.
-     */
-    struct object_order_type_id_reverse_version {
-
-        bool operator()(const osmium::OSMObject& lhs, const osmium::OSMObject& rhs) const noexcept {
-            if (lhs.type() != rhs.type()) {
-                return lhs.type() < rhs.type();
-            }
-            return (lhs.id() == rhs.id() && lhs.version() > rhs.version()) ||
-                   lhs.positive_id() < rhs.positive_id();
-        }
-
-        bool operator()(const osmium::OSMObject* lhs, const osmium::OSMObject* rhs) const noexcept {
-            return operator()(*lhs, *rhs);
-        }
-
-    }; // struct object_order_type_id_reverse_version
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_OBJECT_COMPARISONS_HPP
diff --git a/contrib/libosmium/osmium/osm/relation.hpp b/contrib/libosmium/osmium/osm/relation.hpp
deleted file mode 100644
index 1a8b686..0000000
--- a/contrib/libosmium/osmium/osm/relation.hpp
+++ /dev/null
@@ -1,194 +0,0 @@
-#ifndef OSMIUM_OSM_RELATION_HPP
-#define OSMIUM_OSM_RELATION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstddef>
-#include <cstdint>
-#include <cstdlib>
-#include <iterator>
-
-#include <osmium/memory/collection.hpp> // IWYU pragma: keep
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/types.hpp>
-
-namespace osmium {
-
-    namespace builder {
-        template <typename> class ObjectBuilder;
-        class RelationMemberListBuilder;
-    }
-
-    class RelationMember : public osmium::memory::detail::ItemHelper {
-
-        friend class osmium::builder::RelationMemberListBuilder;
-
-        object_id_type   m_ref;
-        item_type        m_type;
-        uint16_t         m_flags;
-        string_size_type m_role_size {0};
-
-        RelationMember(const RelationMember&) = delete;
-        RelationMember(RelationMember&&) = delete;
-
-        RelationMember& operator=(const RelationMember&) = delete;
-        RelationMember& operator=(RelationMember&&) = delete;
-
-        unsigned char* endpos() {
-            return data() + osmium::memory::padded_length(sizeof(RelationMember) + m_role_size);
-        }
-
-        const unsigned char* endpos() const {
-            return data() + osmium::memory::padded_length(sizeof(RelationMember) + m_role_size);
-        }
-
-        template <typename TMember>
-        friend class osmium::memory::CollectionIterator;
-
-        unsigned char* next() {
-            if (full_member()) {
-                return endpos() + reinterpret_cast<osmium::memory::Item*>(endpos())->byte_size();
-            } else {
-                return endpos();
-            }
-        }
-
-        unsigned const char* next() const {
-            if (full_member()) {
-                return endpos() + reinterpret_cast<const osmium::memory::Item*>(endpos())->byte_size();
-            } else {
-                return endpos();
-            }
-        }
-
-        void set_role_size(string_size_type size) noexcept {
-            m_role_size = size;
-        }
-
-    public:
-
-        static constexpr item_type collection_type = item_type::relation_member_list;
-
-        RelationMember(const object_id_type ref = 0, const item_type type = item_type(), const bool full = false) noexcept :
-            m_ref(ref),
-            m_type(type),
-            m_flags(full ? 1 : 0) {
-        }
-
-        object_id_type ref() const noexcept {
-            return m_ref;
-        }
-
-        RelationMember& ref(object_id_type ref) noexcept {
-            m_ref = ref;
-            return *this;
-        }
-
-        unsigned_object_id_type positive_ref() const noexcept {
-            return static_cast<unsigned_object_id_type>(std::abs(m_ref));
-        }
-
-        RelationMember& set_ref(const osmium::object_id_type ref) noexcept {
-            m_ref = ref;
-            return *this;
-        }
-
-        item_type type() const noexcept {
-            return m_type;
-        }
-
-        bool full_member() const noexcept {
-            return m_flags == 1;
-        }
-
-        const char* role() const noexcept {
-            return reinterpret_cast<const char*>(data() + sizeof(RelationMember));
-        }
-
-        OSMObject& get_object() {
-            return *reinterpret_cast<OSMObject*>(endpos());
-        }
-
-        const OSMObject& get_object() const {
-            return *reinterpret_cast<const OSMObject*>(endpos());
-        }
-
-    }; // class RelationMember
-
-    class RelationMemberList : public osmium::memory::Collection<RelationMember, osmium::item_type::relation_member_list> {
-
-    public:
-
-        typedef size_t size_type;
-
-        RelationMemberList() :
-            osmium::memory::Collection<RelationMember, osmium::item_type::relation_member_list>() {
-        }
-
-        size_type size() const noexcept {
-            return static_cast<size_type>(std::distance(begin(), end()));
-        }
-
-    }; // class RelationMemberList
-
-    static_assert(sizeof(RelationMemberList) % osmium::memory::align_bytes == 0, "Class osmium::RelationMemberList has wrong size to be aligned properly!");
-
-    class Relation : public OSMObject {
-
-        friend class osmium::builder::ObjectBuilder<osmium::Relation>;
-
-        Relation() noexcept :
-            OSMObject(sizeof(Relation), osmium::item_type::relation) {
-        }
-
-    public:
-
-        static constexpr osmium::item_type itemtype = osmium::item_type::relation;
-
-        RelationMemberList& members() {
-            return osmium::detail::subitem_of_type<RelationMemberList>(begin(), end());
-        }
-
-        const RelationMemberList& members() const {
-            return osmium::detail::subitem_of_type<const RelationMemberList>(cbegin(), cend());
-        }
-
-    }; // class Relation
-
-    static_assert(sizeof(Relation) % osmium::memory::align_bytes == 0, "Class osmium::Relation has wrong size to be aligned properly!");
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_RELATION_HPP
diff --git a/contrib/libosmium/osmium/osm/segment.hpp b/contrib/libosmium/osmium/osm/segment.hpp
deleted file mode 100644
index f3a82c9..0000000
--- a/contrib/libosmium/osmium/osm/segment.hpp
+++ /dev/null
@@ -1,105 +0,0 @@
-#ifndef OSMIUM_OSM_SEGMENT_HPP
-#define OSMIUM_OSM_SEGMENT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <iosfwd>
-#include <utility>
-
-#include <osmium/osm/location.hpp>
-#include <osmium/util/compatibility.hpp>
-
-namespace osmium {
-
-    /**
-     * A Segment is the directed connection between two Locations.
-     */
-    class Segment {
-
-        osmium::Location m_first;
-        osmium::Location m_second;
-
-    public:
-
-        explicit constexpr Segment(const osmium::Location& location1, const osmium::Location& location2) noexcept :
-            m_first(location1),
-            m_second(location2) {
-        }
-
-        constexpr Segment(const Segment&) = default;
-        constexpr Segment(Segment&&) = default;
-
-        Segment& operator=(const Segment&) = default;
-        Segment& operator=(Segment&&) = default;
-
-        ~Segment() = default;
-
-        /// Return first Location of Segment.
-        OSMIUM_CONSTEXPR osmium::Location first() const noexcept {
-            return m_first;
-        }
-
-        /// Return second Location of Segment.
-        OSMIUM_CONSTEXPR osmium::Location second() const noexcept {
-            return m_second;
-        }
-
-    protected:
-
-        void swap_locations() {
-            using std::swap;
-            swap(m_first, m_second);
-        }
-
-    }; // class Segment
-
-    /// Segments are equal if both their locations are equal
-    inline OSMIUM_CONSTEXPR bool operator==(const Segment& lhs, const Segment& rhs) noexcept {
-        return lhs.first() == rhs.first() && lhs.second() == rhs.second();
-    }
-
-    inline OSMIUM_CONSTEXPR bool operator!=(const Segment& lhs, const Segment& rhs) noexcept {
-        return ! (lhs == rhs);
-    }
-
-    /**
-     * Output Segment to a stream.
-     */
-    template <typename TChar, typename TTraits>
-    inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const osmium::Segment& segment) {
-        return out << segment.first() << "->" << segment.second();
-    }
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_SEGMENT_HPP
diff --git a/contrib/libosmium/osmium/osm/tag.hpp b/contrib/libosmium/osmium/osm/tag.hpp
deleted file mode 100644
index 30e670d..0000000
--- a/contrib/libosmium/osmium/osm/tag.hpp
+++ /dev/null
@@ -1,140 +0,0 @@
-#ifndef OSMIUM_OSM_TAG_HPP
-#define OSMIUM_OSM_TAG_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <cstddef>
-#include <cstring>
-#include <iosfwd>
-#include <iterator>
-
-#include <osmium/memory/collection.hpp>
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/item_type.hpp>
-
-namespace osmium {
-
-    class Tag : public osmium::memory::detail::ItemHelper {
-
-        Tag(const Tag&) = delete;
-        Tag(Tag&&) = delete;
-
-        Tag& operator=(const Tag&) = delete;
-        Tag& operator=(Tag&&) = delete;
-
-        template <typename TMember>
-        friend class osmium::memory::CollectionIterator;
-
-        static unsigned char* after_null(unsigned char* ptr) {
-            return reinterpret_cast<unsigned char*>(std::strchr(reinterpret_cast<char*>(ptr), 0) + 1);
-        }
-
-        static const unsigned char* after_null(const unsigned char* ptr) {
-            return reinterpret_cast<const unsigned char*>(std::strchr(reinterpret_cast<const char*>(ptr), 0) + 1);
-        }
-
-        unsigned char* next() {
-            return after_null(after_null(data()));
-        }
-
-        const unsigned char* next() const {
-            return after_null(after_null(data()));
-        }
-
-    public:
-
-        static constexpr item_type collection_type = item_type::tag_list;
-
-        const char* key() const noexcept {
-            return reinterpret_cast<const char*>(data());
-        }
-
-        const char* value() const {
-            return reinterpret_cast<const char*>(after_null(data()));
-        }
-
-    }; // class Tag
-
-    inline bool operator==(const Tag& a, const Tag& b) {
-        return !std::strcmp(a.key(), b.key()) && !strcmp(a.value(), b.value());
-    }
-
-    inline bool operator<(const Tag& a, const Tag& b) {
-        return (!std::strcmp(a.key(), b.key()) && (std::strcmp(a.value(), b.value()) < 0)) || (std::strcmp(a.key(), b.key()) < 0);
-    }
-
-    /**
-     * Output a Tag to a stream.
-     */
-    template <typename TChar, typename TTraits>
-    inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const Tag& tag) {
-        return out << tag.key() << '=' << tag.value();
-    }
-
-    class TagList : public osmium::memory::Collection<Tag, osmium::item_type::tag_list> {
-
-    public:
-
-        typedef size_t size_type;
-
-        TagList() :
-            osmium::memory::Collection<Tag, osmium::item_type::tag_list>() {
-        }
-
-        size_type size() const noexcept {
-            return static_cast<size_type>(std::distance(begin(), end()));
-        }
-
-        const char* get_value_by_key(const char* key, const char* default_value = nullptr) const noexcept {
-            auto result = std::find_if(cbegin(), cend(), [key](const Tag& tag) {
-                return !strcmp(tag.key(), key);
-            });
-            if (result == cend()) {
-                return default_value;
-            } else {
-                return result->value();
-            }
-        }
-
-        const char* operator[](const char* key) const noexcept {
-            return get_value_by_key(key);
-        }
-
-    }; // class TagList
-
-    static_assert(sizeof(TagList) % osmium::memory::align_bytes == 0, "Class osmium::TagList has wrong size to be aligned properly!");
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_TAG_HPP
diff --git a/contrib/libosmium/osmium/osm/timestamp.hpp b/contrib/libosmium/osmium/osm/timestamp.hpp
deleted file mode 100644
index 2145fcb..0000000
--- a/contrib/libosmium/osmium/osm/timestamp.hpp
+++ /dev/null
@@ -1,193 +0,0 @@
-#ifndef OSMIUM_OSM_TIMESTAMP_HPP
-#define OSMIUM_OSM_TIMESTAMP_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstdint>
-#include <ctime>
-#include <iosfwd>
-#include <limits>
-#include <stdexcept>
-#include <string>
-
-#include <osmium/util/compatibility.hpp>
-#include <osmium/util/minmax.hpp> // IWYU pragma: keep
-
-namespace osmium {
-
-    /**
-     * A timestamp. Internal representation is an unsigned 32bit integer
-     * holding seconds since epoch, so this will overflow in 2038.
-     */
-    class Timestamp {
-
-        // length of ISO timestamp string yyyy-mm-ddThh:mm:ssZ\0
-        static constexpr int timestamp_length = 20 + 1;
-
-        /**
-         * The timestamp format for OSM timestamps in strftime(3) format.
-         * This is the ISO-Format yyyy-mm-ddThh:mm:ssZ
-         */
-        static const char* timestamp_format() {
-            static const char f[timestamp_length] = "%Y-%m-%dT%H:%M:%SZ";
-            return f;
-        }
-
-        uint32_t m_timestamp;
-
-    public:
-
-        constexpr Timestamp() noexcept :
-            m_timestamp(0) {
-        }
-
-        // Not "explicit" so that conversions from time_t work
-        // like in node.timestamp(123);
-        constexpr Timestamp(time_t timestamp) noexcept :
-            m_timestamp(static_cast<uint32_t>(timestamp)) {
-        }
-
-        /**
-         * Returns true if this timestamp is valid (ie set to something other
-         * than 0).
-         */
-        bool valid() const noexcept {
-            return m_timestamp != 0;
-        }
-
-        /**
-         * Construct timestamp from ISO date/time string.
-         * Throws std::invalid_argument, if the timestamp can not be parsed.
-         */
-        explicit Timestamp(const char* timestamp) {
-#ifndef _WIN32
-            struct tm tm {
-                0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-            };
-            if (strptime(timestamp, timestamp_format(), &tm) == nullptr) {
-                throw std::invalid_argument("can't parse timestamp");
-            }
-            m_timestamp = static_cast<uint32_t>(timegm(&tm));
-#else
-            struct tm tm;
-            int n = sscanf(timestamp, "%4d-%2d-%2dT%2d:%2d:%2dZ", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec);
-            if (n != 6) {
-                throw std::invalid_argument("can't parse timestamp");
-            }
-            tm.tm_year -= 1900;
-            tm.tm_mon--;
-            tm.tm_wday = 0;
-            tm.tm_yday = 0;
-            tm.tm_isdst = 0;
-            m_timestamp = static_cast<uint32_t>(_mkgmtime(&tm));
-#endif
-        }
-
-        constexpr time_t seconds_since_epoch() const noexcept {
-            return static_cast<time_t>(m_timestamp);
-        }
-
-        constexpr operator time_t() const noexcept {
-            return static_cast<time_t>(m_timestamp);
-        }
-
-        explicit constexpr operator uint32_t() const noexcept {
-            return m_timestamp;
-        }
-
-        template <typename T>
-        void operator+=(T time_difference) noexcept {
-            m_timestamp += time_difference;
-        }
-
-        template <typename T>
-        void operator-=(T time_difference) noexcept {
-            m_timestamp -= time_difference;
-        }
-
-        /**
-         * Return UTC Unix time as string in ISO date/time format.
-         */
-        std::string to_iso() const {
-            std::string s;
-
-            if (m_timestamp != 0) {
-                struct tm tm;
-                time_t sse = seconds_since_epoch();
-#ifndef _MSC_VER
-                gmtime_r(&sse, &tm);
-#else
-                gmtime_s(&tm, &sse);
-#endif
-
-                s.resize(timestamp_length);
-                /* This const_cast is ok, because we know we have enough space
-                in the string for the format we are using (well at least until
-                the year will have 5 digits). And by setting the size
-                afterwards from the result of strftime we make sure thats set
-                right, too. */
-                s.resize(strftime(const_cast<char*>(s.c_str()), timestamp_length, timestamp_format(), &tm));
-            }
-
-            return s;
-        }
-
-    }; // class Timestamp
-
-    inline OSMIUM_CONSTEXPR Timestamp start_of_time() noexcept {
-        return Timestamp(1);
-    }
-
-    inline OSMIUM_CONSTEXPR Timestamp end_of_time() noexcept {
-        return Timestamp(std::numeric_limits<time_t>::max());
-    }
-
-    template <typename TChar, typename TTraits>
-    inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, Timestamp timestamp) {
-        out << timestamp.to_iso();
-        return out;
-    }
-
-    template <>
-    inline osmium::Timestamp min_op_start_value<osmium::Timestamp>() {
-        return end_of_time();
-    }
-
-    template <>
-    inline osmium::Timestamp max_op_start_value<osmium::Timestamp>() {
-        return start_of_time();
-    }
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_TIMESTAMP_HPP
diff --git a/contrib/libosmium/osmium/osm/types.hpp b/contrib/libosmium/osmium/osm/types.hpp
deleted file mode 100644
index e4250d9..0000000
--- a/contrib/libosmium/osmium/osm/types.hpp
+++ /dev/null
@@ -1,66 +0,0 @@
-#ifndef OSMIUM_OSM_TYPES_HPP
-#define OSMIUM_OSM_TYPES_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstdint>
-
-namespace osmium {
-
-    /*
-     * The following typedefs are chosen so that they can represent all needed
-     * numbers and still be reasonably space efficient. As the OSM database
-     * needs 64 bit IDs for nodes, this size is used for all object IDs.
-     */
-    typedef int64_t  object_id_type;          ///< Type for OSM object (node, way, or relation) IDs.
-    typedef uint64_t unsigned_object_id_type; ///< Type for OSM object (node, way, or relation) IDs where we only allow positive IDs.
-    typedef uint32_t object_version_type;     ///< Type for OSM object version number.
-    typedef uint32_t changeset_id_type;       ///< Type for OSM changeset IDs.
-    typedef uint32_t user_id_type;            ///< Type for OSM user IDs.
-    typedef int32_t  signed_user_id_type;     ///< Type for signed OSM user IDs.
-    typedef uint32_t num_changes_type;        ///< Type for changeset num_changes.
-    typedef uint32_t num_comments_type;       ///< Type for changeset num_comments.
-
-    /**
-     * Size for strings in OSM data such as user names, tag keys, roles, etc.
-     * In Osmium they can be up to 2^16 bytes long, but OSM usually has lower
-     * defined limits.
-     */
-    typedef uint16_t string_size_type;
-
-    // maximum of 256 characters of max 4 bytes each (in UTF-8 encoding)
-    constexpr const int max_osm_string_length = 256 * 4;
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_TYPES_HPP
diff --git a/contrib/libosmium/osmium/osm/types_from_string.hpp b/contrib/libosmium/osmium/osm/types_from_string.hpp
deleted file mode 100644
index b0e22a7..0000000
--- a/contrib/libosmium/osmium/osm/types_from_string.hpp
+++ /dev/null
@@ -1,122 +0,0 @@
-#ifndef OSMIUM_OSM_TYPES_FROM_STRING_HPP
-#define OSMIUM_OSM_TYPES_FROM_STRING_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cassert>
-#include <cctype>
-#include <cstdint>
-#include <cstdlib>
-#include <limits>
-#include <string>
-#include <utility>
-
-#include <osmium/osm/entity_bits.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/util/cast.hpp>
-
-namespace osmium {
-
-    inline object_id_type string_to_object_id(const char* input) {
-        assert(input);
-        if (*input != '\0' && !std::isspace(*input)) {
-            char* end;
-            auto id = std::strtoll(input, &end, 10);
-            if (id != std::numeric_limits<long long>::min() && id != std::numeric_limits<long long>::max() && *end == '\0') {
-                return id;
-            }
-        }
-        throw std::range_error(std::string("illegal id: '") + input + "'");
-    }
-
-    inline std::pair<osmium::item_type, osmium::object_id_type> string_to_object_id(const char* input, osmium::osm_entity_bits::type types) {
-        assert(input);
-        assert(types != osmium::osm_entity_bits::nothing);
-        if (*input != '\0') {
-            if (std::isdigit(*input)) {
-                return std::make_pair(osmium::item_type::undefined, string_to_object_id(input));
-            }
-            osmium::item_type t = osmium::char_to_item_type(*input);
-            if (osmium::osm_entity_bits::from_item_type(t) & types) {
-                return std::make_pair(t, string_to_object_id(input+1));
-            }
-        }
-        throw std::range_error(std::string("not a valid id: '") + input + "'");
-    }
-
-    namespace detail {
-
-        inline unsigned long string_to_ulong(const char* input, const char *name) {
-            if (*input != '\0' && *input != '-' && !std::isspace(*input)) {
-                char* end;
-                auto value = std::strtoul(input, &end, 10);
-                if (value != std::numeric_limits<unsigned long>::max() && *end == '\0') {
-                    return value;
-                }
-            }
-            throw std::range_error(std::string("illegal ") + name + ": '" + input + "'");
-        }
-
-    } // namespace detail
-
-    inline object_version_type string_to_object_version(const char* input) {
-        assert(input);
-        return static_cast_with_assert<object_version_type>(detail::string_to_ulong(input, "version"));
-    }
-
-    inline changeset_id_type string_to_changeset_id(const char* input) {
-        assert(input);
-        return static_cast_with_assert<changeset_id_type>(detail::string_to_ulong(input, "changeset"));
-    }
-
-    inline signed_user_id_type string_to_user_id(const char* input) {
-        assert(input);
-        if (input[0] == '-' && input[1] == '1' && input[2] == '\0') {
-            return -1;
-        }
-        return static_cast_with_assert<signed_user_id_type>(detail::string_to_ulong(input, "user id"));
-    }
-
-    inline num_changes_type string_to_num_changes(const char* input) {
-        assert(input);
-        return static_cast_with_assert<num_changes_type>(detail::string_to_ulong(input, "value for num changes"));
-    }
-
-    inline num_comments_type string_to_num_comments(const char* input) {
-        assert(input);
-        return static_cast_with_assert<num_comments_type>(detail::string_to_ulong(input, "value for num comments"));
-    }
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_TYPES_FROM_STRING_HPP
diff --git a/contrib/libosmium/osmium/osm/undirected_segment.hpp b/contrib/libosmium/osmium/osm/undirected_segment.hpp
deleted file mode 100644
index 654ef7d..0000000
--- a/contrib/libosmium/osmium/osm/undirected_segment.hpp
+++ /dev/null
@@ -1,100 +0,0 @@
-#ifndef OSMIUM_OSM_UNDIRECTED_SEGMENT_HPP
-#define OSMIUM_OSM_UNDIRECTED_SEGMENT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <iosfwd>
-
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/segment.hpp>
-
-namespace osmium {
-
-    /**
-     * Undirected connection between two Locations. The first Location is
-     * always equal or "smaller" than the second Location, ie to the left
-     * and down.
-     */
-    class UndirectedSegment : public Segment {
-
-    public:
-
-        explicit UndirectedSegment(const osmium::Location& location1, const osmium::Location& location2) :
-            Segment(location1, location2) {
-            if (location2 < location1) {
-                swap_locations();
-            }
-        }
-
-        UndirectedSegment(const UndirectedSegment&) = default;
-        UndirectedSegment(UndirectedSegment&&) = default;
-
-        UndirectedSegment& operator=(const UndirectedSegment&) = default;
-        UndirectedSegment& operator=(UndirectedSegment&&) = default;
-
-        ~UndirectedSegment() = default;
-
-    }; // class UndirectedSegment
-
-    /**
-     * UndirectedSegments are "smaller" if they are to the left and down of another
-     * segment. The first() location is checked first() and only if they have the
-     * same first() location the second() location is taken into account.
-     */
-    inline bool operator<(const UndirectedSegment& lhs, const UndirectedSegment& rhs) noexcept {
-        return (lhs.first() == rhs.first() && lhs.second() < rhs.second()) || lhs.first() < rhs.first();
-    }
-
-    inline bool operator>(const UndirectedSegment& lhs, const UndirectedSegment& rhs) noexcept {
-        return rhs < lhs;
-    }
-
-    inline bool operator<=(const UndirectedSegment& lhs, const UndirectedSegment& rhs) noexcept {
-        return ! (rhs < lhs);
-    }
-
-    inline bool operator>=(const UndirectedSegment& lhs, const UndirectedSegment& rhs) noexcept {
-        return ! (lhs < rhs);
-    }
-
-    /**
-     * Output UndirectedSegment to a stream.
-     */
-    template <typename TChar, typename TTraits>
-    inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const osmium::UndirectedSegment& segment) {
-        return out << segment.first() << "--" << segment.second();
-    }
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_UNDIRECTED_SEGMENT_HPP
diff --git a/contrib/libosmium/osmium/osm/way.hpp b/contrib/libosmium/osmium/osm/way.hpp
deleted file mode 100644
index 89380e4..0000000
--- a/contrib/libosmium/osmium/osm/way.hpp
+++ /dev/null
@@ -1,117 +0,0 @@
-#ifndef OSMIUM_OSM_WAY_HPP
-#define OSMIUM_OSM_WAY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/osm/node_ref.hpp>
-#include <osmium/osm/node_ref_list.hpp>
-
-namespace osmium {
-
-    namespace builder {
-        template <typename T> class ObjectBuilder;
-    }
-
-    /**
-     * List of node references (id and location) in a way.
-     */
-    class WayNodeList : public NodeRefList {
-
-    public:
-
-        static constexpr osmium::item_type itemtype = osmium::item_type::way_node_list;
-
-        WayNodeList():
-            NodeRefList(itemtype) {
-        }
-
-    }; // class WayNodeList
-
-    static_assert(sizeof(WayNodeList) % osmium::memory::align_bytes == 0, "Class osmium::WayNodeList has wrong size to be aligned properly!");
-
-    class Way : public OSMObject {
-
-        friend class osmium::builder::ObjectBuilder<osmium::Way>;
-
-        Way() noexcept :
-            OSMObject(sizeof(Way), osmium::item_type::way) {
-        }
-
-    public:
-
-        WayNodeList& nodes() {
-            return osmium::detail::subitem_of_type<WayNodeList>(begin(), end());
-        }
-
-        const WayNodeList& nodes() const {
-            return osmium::detail::subitem_of_type<const WayNodeList>(cbegin(), cend());
-        }
-
-        /**
-         * Update all nodes in a way with the ID of the given NodeRef with the
-         * location of the given NodeRef.
-         */
-        void update_node_location(const NodeRef& new_node_ref) {
-            for (auto& node_ref : nodes()) {
-                if (node_ref.ref() == new_node_ref.ref()) {
-                    node_ref.set_location(new_node_ref.location());
-                }
-            }
-        }
-
-        /**
-         * Do the nodes in this way form a closed ring?
-         */
-        bool is_closed() const {
-            return nodes().is_closed();
-        }
-
-        bool ends_have_same_id() const {
-            return nodes().ends_have_same_id();
-        }
-
-        bool ends_have_same_location() const {
-            return nodes().ends_have_same_location();
-        }
-
-    }; // class Way
-
-    static_assert(sizeof(Way) % osmium::memory::align_bytes == 0, "Class osmium::Way has wrong size to be aligned properly!");
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_WAY_HPP
diff --git a/contrib/libosmium/osmium/relations/collector.hpp b/contrib/libosmium/osmium/relations/collector.hpp
deleted file mode 100644
index e7f76a2..0000000
--- a/contrib/libosmium/osmium/relations/collector.hpp
+++ /dev/null
@@ -1,544 +0,0 @@
-#ifndef OSMIUM_RELATIONS_COLLECTOR_HPP
-#define OSMIUM_RELATIONS_COLLECTOR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <cassert>
-#include <cstddef>
-#include <cstdint>
-#include <functional>
-#include <iomanip>
-//#include <iostream>
-#include <vector>
-
-#include <osmium/fwd.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/relation.hpp> // IWYU pragma: keep
-#include <osmium/osm/types.hpp>
-#include <osmium/handler.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/visitor.hpp>
-
-#include <osmium/relations/detail/relation_meta.hpp>
-#include <osmium/relations/detail/member_meta.hpp>
-
-namespace osmium {
-
-    /**
-     * @brief Code related to the assembly of OSM relations
-     */
-    namespace relations {
-
-        /**
-         * The Collector class collects members of a relation. This is a generic
-         * base class that can be used to assemble all kinds of relations. It has numerous
-         * hooks you can implement in derived classes to customize its behaviour.
-         *
-         * The collector provides two handlers (HandlerPass1 and HandlerPass2) for a first
-         * and second pass through an input file, respectively. In the first pass all
-         * relations we are interested in are stored in RelationMeta objects in the
-         * m_relations vector. All members we are interested in are stored in MemberMeta
-         * objects in the m_member_meta vectors.
-         * The MemberMeta objects also store the information where the relations containing
-         * those members are to be found.
-         *
-         * Later the m_member_meta vectors are sorted according to the
-         * member ids so that a binary search (with std::equal_range) can be used in the second
-         * pass to find the parent relations for each node, way, or relation coming along.
-         * The member objects are stored together with their relation and once a relation
-         * is complete the complete_relation() method is called which you must overwrite in
-         * a derived class of Collector.
-         *
-         * @tparam TCollector Derived class of this class.
-         *
-         * @tparam TNodes Are we interested in member nodes?
-         *
-         * @tparam TWays Are we interested in member ways?
-         *
-         * @tparam TRelations Are we interested in member relations?
-         */
-        template <typename TCollector, bool TNodes, bool TWays, bool TRelations>
-        class Collector {
-
-            /**
-             * This is the handler class for the first pass of the Collector.
-             */
-            class HandlerPass1 : public osmium::handler::Handler {
-
-                TCollector& m_collector;
-
-            public:
-
-                HandlerPass1(TCollector& collector) noexcept :
-                    m_collector(collector) {
-                }
-
-                void relation(const osmium::Relation& relation) {
-                    if (m_collector.keep_relation(relation)) {
-                        m_collector.add_relation(relation);
-                    }
-                }
-
-            }; // class HandlerPass1
-
-        public:
-
-            /**
-             * This is the handler class for the second pass of the Collector.
-             */
-            class HandlerPass2 : public osmium::handler::Handler {
-
-                TCollector& m_collector;
-
-                /**
-                 * This variable is initialized with the number of different
-                 * kinds of OSM objects we are interested in. If we only need
-                 * way members (for instance for the multipolygon collector)
-                 * it is intialized with 1 for instance. If node and way
-                 * members are needed, it is initialized with 2.
-                 *
-                 * In the after_* methods of this handler, it is decremented
-                 * and once it reaches 0, we know we have all members available
-                 * that we are ever going to get.
-                 */
-                int m_want_types;
-
-                /**
-                 * Find this object in the member vectors and add it to all
-                 * relations that need it.
-                 *
-                 * @returns true if the member was added to at least one
-                 *          relation and false otherwise
-                 */
-                bool find_and_add_object(const osmium::OSMObject& object) {
-                    auto& mmv = m_collector.member_meta(object.type());
-                    auto range = std::equal_range(mmv.begin(), mmv.end(), MemberMeta(object.id()));
-
-                    if (osmium::relations::count_not_removed(range.first, range.second) == 0) {
-                        // nothing found
-                        return false;
-                    }
-
-                    {
-                        m_collector.members_buffer().add_item(object);
-                        const size_t member_offset = m_collector.members_buffer().commit();
-
-                        for (auto it = range.first; it != range.second; ++it) {
-                            it->set_buffer_offset(member_offset);
-                        }
-                    }
-
-                    for (auto it = range.first; it != range.second; ++it) {
-                        MemberMeta& member_meta = *it;
-                        if (member_meta.removed()) {
-                            break;
-                        }
-                        assert(member_meta.member_id() == object.id());
-                        assert(member_meta.relation_pos() < m_collector.m_relations.size());
-                        RelationMeta& relation_meta = m_collector.m_relations[member_meta.relation_pos()];
-//                        std::cerr << "  => " << member_meta.member_pos() << " < " << m_collector.get_relation(relation_meta).members().size() << " (id=" << m_collector.get_relation(relation_meta).id() << ")\n";
-                        assert(member_meta.member_pos() < m_collector.get_relation(relation_meta).members().size());
-//                        std::cerr << "  add way " << member_meta.member_id() << " to rel " << m_collector.get_relation(relation_meta).id() << " at pos " << member_meta.member_pos() << "\n";
-                        relation_meta.got_one_member();
-                        if (relation_meta.has_all_members()) {
-                            const size_t relation_offset = member_meta.relation_pos();
-                            m_collector.complete_relation(relation_meta);
-                            m_collector.m_relations[relation_offset] = RelationMeta();
-                            m_collector.possibly_purge_removed_members();
-                        }
-                    }
-
-                    // Remove MemberMetas that were marked as removed.
-                    mmv.erase(std::remove_if(mmv.begin(), mmv.end(), [](MemberMeta& mm) {
-                        return mm.removed();
-                    }), mmv.end());
-
-                    return true;
-                }
-
-            public:
-
-                HandlerPass2(TCollector& collector) noexcept :
-                    m_collector(collector),
-                    m_want_types((TNodes?1:0) + (TWays?1:0) + (TRelations?1:0)) {
-                }
-
-                void node(const osmium::Node& node) {
-                    if (TNodes) {
-                        if (! find_and_add_object(node)) {
-                            m_collector.node_not_in_any_relation(node);
-                        }
-                    }
-                }
-
-                void way(const osmium::Way& way) {
-                    if (TWays) {
-                        if (! find_and_add_object(way)) {
-                            m_collector.way_not_in_any_relation(way);
-                        }
-                    }
-                }
-
-                void relation(const osmium::Relation& relation) {
-                    if (TRelations) {
-                        if (! find_and_add_object(relation)) {
-                            m_collector.relation_not_in_any_relation(relation);
-                        }
-                    }
-                }
-
-                void flush() {
-                    m_collector.flush();
-                }
-
-            }; // class HandlerPass2
-
-            HandlerPass2 m_handler_pass2;
-
-            // All relations we are interested in will be kept in this buffer
-            osmium::memory::Buffer m_relations_buffer;
-
-            // All members we are interested in will be kept in this buffer
-            osmium::memory::Buffer m_members_buffer;
-
-            /// Vector with all relations we are interested in
-            std::vector<RelationMeta> m_relations;
-
-            /**
-             * One vector each for nodes, ways, and relations containing all
-             * mappings from member ids to their relations.
-             */
-            std::vector<MemberMeta> m_member_meta[3];
-
-            int m_count_complete = 0;
-
-            typedef std::function<void(osmium::memory::Buffer&&)> callback_func_type;
-            callback_func_type m_callback;
-
-            static constexpr size_t initial_buffer_size = 1024 * 1024;
-
-        public:
-
-            /**
-             * Create an Collector.
-             */
-            Collector() :
-                m_handler_pass2(*static_cast<TCollector*>(this)),
-                m_relations_buffer(initial_buffer_size, osmium::memory::Buffer::auto_grow::yes),
-                m_members_buffer(initial_buffer_size, osmium::memory::Buffer::auto_grow::yes),
-                m_relations(),
-                m_member_meta() {
-            }
-
-        protected:
-
-            std::vector<MemberMeta>& member_meta(const item_type type) {
-                return m_member_meta[static_cast<uint16_t>(type) - 1];
-            }
-
-            callback_func_type callback() {
-                return m_callback;
-            }
-
-            const std::vector<RelationMeta>& relations() const {
-                return m_relations;
-            }
-
-            /**
-             * This method is called from the first pass handler for every
-             * relation in the input, to check whether it should be kept.
-             *
-             * Overwrite this method in a child class to only add relations
-             * you are interested in, for instance depending on the type tag.
-             * Storing relations takes a lot of memory, so it makes sense to
-             * filter this as much as possible.
-             */
-            bool keep_relation(const osmium::Relation& /*relation*/) const {
-                return true;
-            }
-
-            /**
-             * This method is called for every member of every relation that
-             * should be kept. It should decide if the member is interesting or
-             * not and return true or false to signal that. Only interesting
-             * members are later added to the relation.
-             *
-             * Overwrite this method in a child class. In the MultiPolygonCollector
-             * this is for instance used to only keep members of type way and
-             * ignore all others.
-             */
-            bool keep_member(const osmium::relations::RelationMeta& /*relation_meta*/, const osmium::RelationMember& /*member*/) const {
-                return true;
-            }
-
-            /**
-             * This method is called for all nodes that are not a member of
-             * any relation.
-             *
-             * Overwrite this method in a child class if you are interested
-             * in this.
-             */
-            void node_not_in_any_relation(const osmium::Node& /*node*/) {
-            }
-
-            /**
-             * This method is called for all ways that are not a member of
-             * any relation.
-             *
-             * Overwrite this method in a child class if you are interested
-             * in this.
-             */
-            void way_not_in_any_relation(const osmium::Way& /*way*/) {
-            }
-
-            /**
-             * This method is called for all relations that are not a member of
-             * any relation.
-             *
-             * Overwrite this method in a child class if you are interested
-             * in this.
-             */
-            void relation_not_in_any_relation(const osmium::Relation& /*relation*/) {
-            }
-
-            /**
-             * This method is called from the 2nd pass handler when all objects
-             * of types we are interested in have been seen.
-             *
-             * Overwrite this method in a child class if you are interested
-             * in this.
-             *
-             * Note that even after this call members might be missing if they
-             * were not in the input file! The derived class has to handle this
-             * case.
-             */
-            void flush() {
-            }
-
-            /**
-             * This removes all relations that have already been assembled
-             * from the m_relations vector.
-             */
-            void clean_assembled_relations() {
-                m_relations.erase(
-                    std::remove_if(m_relations.begin(), m_relations.end(), has_all_members()),
-                    m_relations.end()
-                );
-            }
-
-            const osmium::Relation& get_relation(size_t offset) const {
-                return m_relations_buffer.get<osmium::Relation>(offset);
-            }
-
-            /**
-             * Get the relation from a relation_meta.
-             */
-            const osmium::Relation& get_relation(const RelationMeta& relation_meta) const {
-                return get_relation(relation_meta.relation_offset());
-            }
-
-            osmium::OSMObject& get_member(size_t offset) const {
-                return m_members_buffer.get<osmium::OSMObject>(offset);
-            }
-
-            /**
-             * Tell the Collector that you are interested in this relation
-             * and want it kept until all members have been assembled and
-             * it is handed back to you.
-             *
-             * The relation is copied and stored in a buffer inside the
-             * collector.
-             */
-            void add_relation(const osmium::Relation& relation) {
-                const size_t offset = m_relations_buffer.committed();
-                m_relations_buffer.add_item(relation);
-
-                RelationMeta relation_meta(offset);
-
-                int n = 0;
-                for (auto& member : m_relations_buffer.get<osmium::Relation>(offset).members()) {
-                    if (static_cast<TCollector*>(this)->keep_member(relation_meta, member)) {
-                        member_meta(member.type()).emplace_back(member.ref(), m_relations.size(), n);
-                        relation_meta.increment_need_members();
-                    } else {
-                        member.ref(0); // set member id to zero to indicate we are not interested
-                    }
-                    ++n;
-                }
-
-                assert(offset == m_relations_buffer.committed());
-                if (relation_meta.has_all_members()) {
-                    m_relations_buffer.rollback();
-                } else {
-                    m_relations_buffer.commit();
-                    m_relations.push_back(std::move(relation_meta));
-//                    std::cerr << "added relation id=" << relation.id() << "\n";
-                }
-            }
-
-            /**
-             * Sort the vectors with the member infos so that we can do binary
-             * search on them.
-             */
-            void sort_member_meta() {
-/*                std::cerr << "relations:        " << m_relations.size() << "\n";
-                std::cerr << "node members:     " << m_member_meta[0].size() << "\n";
-                std::cerr << "way members:      " << m_member_meta[1].size() << "\n";
-                std::cerr << "relation members: " << m_member_meta[2].size() << "\n";*/
-                std::sort(m_member_meta[0].begin(), m_member_meta[0].end());
-                std::sort(m_member_meta[1].begin(), m_member_meta[1].end());
-                std::sort(m_member_meta[2].begin(), m_member_meta[2].end());
-            }
-
-        public:
-
-            uint64_t used_memory() const {
-                const uint64_t nmembers = m_member_meta[0].capacity() + m_member_meta[1].capacity() + m_member_meta[2].capacity();
-                const uint64_t members = nmembers * sizeof(MemberMeta);
-                const uint64_t relations = m_relations.capacity() * sizeof(RelationMeta);
-                const uint64_t relations_buffer_capacity = m_relations_buffer.capacity();
-                const uint64_t members_buffer_capacity = m_members_buffer.capacity();
-
-                std::cout << "  nR  = m_relations.capacity() ........... = " << std::setw(12) << m_relations.capacity() << "\n";
-                std::cout << "  nMN = m_member_meta[NODE].capacity() ... = " << std::setw(12) << m_member_meta[0].capacity() << "\n";
-                std::cout << "  nMW = m_member_meta[WAY].capacity() .... = " << std::setw(12) << m_member_meta[1].capacity() << "\n";
-                std::cout << "  nMR = m_member_meta[RELATION].capacity() = " << std::setw(12) << m_member_meta[2].capacity() << "\n";
-                std::cout << "  nM  = m_member_meta[*].capacity() ...... = " << std::setw(12) << nmembers << "\n";
-
-                std::cout << "  sRM = sizeof(RelationMeta) ............. = " << std::setw(12) << sizeof(RelationMeta) << "\n";
-                std::cout << "  sMM = sizeof(MemberMeta) ............... = " << std::setw(12) << sizeof(MemberMeta) << "\n\n";
-
-                std::cout << "  nR * sRM ............................... = " << std::setw(12) << relations << "\n";
-                std::cout << "  nM * sMM ............................... = " << std::setw(12) << members << "\n";
-                std::cout << "  relations_buffer_capacity .............. = " << std::setw(12) << relations_buffer_capacity << "\n";
-                std::cout << "  members_buffer_capacity ................ = " << std::setw(12) << members_buffer_capacity << "\n";
-
-                const uint64_t total = relations + members + relations_buffer_capacity + members_buffer_capacity;
-
-                std::cout << "  total .................................. = " << std::setw(12) << total << "\n";
-                std::cout << "  =======================================================\n";
-
-                return relations_buffer_capacity + members_buffer_capacity + relations + members;
-            }
-
-            /**
-             * Return reference to second pass handler.
-             */
-            HandlerPass2& handler(const callback_func_type& callback = nullptr) {
-                m_callback = callback;
-                return m_handler_pass2;
-            }
-
-            osmium::memory::Buffer& members_buffer() {
-                return m_members_buffer;
-            }
-
-            size_t get_offset(osmium::item_type type, osmium::object_id_type id) {
-                const auto& mmv = member_meta(type);
-                const auto range = std::equal_range(mmv.cbegin(), mmv.cend(), MemberMeta(id));
-                assert(range.first != range.second);
-                return range.first->buffer_offset();
-            }
-
-            template <typename TIter>
-            void read_relations(TIter begin, TIter end) {
-                HandlerPass1 handler(*static_cast<TCollector*>(this));
-                osmium::apply(begin, end, handler);
-                sort_member_meta();
-            }
-
-            template <typename TSource>
-            void read_relations(TSource& source) {
-                read_relations(std::begin(source), std::end(source));
-                source.close();
-            }
-
-            void moving_in_buffer(size_t old_offset, size_t new_offset) {
-                const osmium::OSMObject& object = m_members_buffer.get<osmium::OSMObject>(old_offset);
-                auto& mmv = member_meta(object.type());
-                auto range = std::equal_range(mmv.begin(), mmv.end(), osmium::relations::MemberMeta(object.id()));
-                for (auto it = range.first; it != range.second; ++it) {
-                    assert(it->buffer_offset() == old_offset);
-                    it->set_buffer_offset(new_offset);
-                }
-            }
-
-            /**
-             * Decide whether to purge removed members and then do it.
-             *
-             * Currently the purging is done every thousand calls.
-             * This could probably be improved upon.
-             */
-            void possibly_purge_removed_members() {
-                ++m_count_complete;
-                if (m_count_complete > 10000) { // XXX
-//                    const size_t size_before = m_members_buffer.committed();
-                    m_members_buffer.purge_removed(this);
-/*
-                    const size_t size_after = m_members_buffer.committed();
-                    double percent = static_cast<double>(size_before - size_after);
-                    percent /= size_before;
-                    percent *= 100;
-                    std::cerr << "PURGE (size before=" << size_before << " after=" << size_after << " purged=" << (size_before - size_after) << " / " << static_cast<int>(percent) << "%)\n";
-*/
-                    m_count_complete = 0;
-                }
-            }
-
-            /**
-             * Get a vector with pointers to all Relations that could not
-             * be completed, because members were missing in the input
-             * data.
-             *
-             * Note that these pointers point into memory allocated and
-             * owned by the Collector object.
-             */
-            std::vector<const osmium::Relation*> get_incomplete_relations() const {
-                std::vector<const osmium::Relation*> relations;
-                for (const auto& relation_meta : m_relations) {
-                    if (!relation_meta.has_all_members()) {
-                        relations.push_back(&get_relation(relation_meta));
-                    }
-                }
-                return relations;
-            }
-
-        }; // class Collector
-
-    } // namespace relations
-
-} // namespace osmium
-
-#endif // OSMIUM_RELATIONS_COLLECTOR_HPP
diff --git a/contrib/libosmium/osmium/relations/detail/member_meta.hpp b/contrib/libosmium/osmium/relations/detail/member_meta.hpp
deleted file mode 100644
index ea86734..0000000
--- a/contrib/libosmium/osmium/relations/detail/member_meta.hpp
+++ /dev/null
@@ -1,158 +0,0 @@
-#ifndef OSMIUM_RELATIONS_DETAIL_MEMBER_META_HPP
-#define OSMIUM_RELATIONS_DETAIL_MEMBER_META_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <cstddef>
-#include <iosfwd>
-#include <iterator>
-
-#include <osmium/osm/types.hpp>
-
-namespace osmium {
-
-    namespace relations {
-
-        /**
-         * Helper class for the Collector class.
-         *
-         * Stores an object ID and information where the object should be
-         * stored.
-         */
-        class MemberMeta {
-
-            /**
-             * Object ID of this relation member. Can be a node, way, or relation ID.
-             * It depends on the vector in which this object is stored which kind of
-             * object is referenced here.
-             */
-            osmium::object_id_type m_member_id;
-
-            /**
-             * Position of the relation this member is a part of in the
-             * m_relations vector.
-             */
-            size_t m_relation_pos;
-
-            /**
-             * Position of this member in the list of members of the
-             * relation this member is a part of.
-             */
-            size_t m_member_pos;
-
-            /**
-             * Offset in the buffer where the object is stored.
-             */
-            size_t m_buffer_offset { 0 };
-
-            bool m_removed = false;
-
-        public:
-
-            /**
-             * Create new MemberMeta. The variant with zeros for relation_pos and
-             * member_pos is used to create dummy MemberMeta that can be compared
-             * to the MemberMeta in the vectors using the equal_range algorithm.
-             */
-            explicit MemberMeta(osmium::object_id_type member_id, size_t relation_pos=0, size_t member_pos=0) noexcept :
-                m_member_id(member_id),
-                m_relation_pos(relation_pos),
-                m_member_pos(member_pos) {
-            }
-
-            osmium::object_id_type member_id() const noexcept {
-                return m_member_id;
-            }
-
-            size_t relation_pos() const noexcept {
-                return m_relation_pos;
-            }
-
-            size_t member_pos() const noexcept {
-                return m_member_pos;
-            }
-
-            size_t buffer_offset() const noexcept {
-                return m_buffer_offset;
-            }
-
-            void set_buffer_offset(size_t offset) noexcept {
-                m_buffer_offset = offset;
-            }
-
-            bool removed() const noexcept {
-                return m_removed;
-            }
-
-            void remove() noexcept {
-                m_removed = true;
-            }
-
-        }; // class MemberMeta
-
-        /**
-         * Compares two MemberMeta objects by only looking at the member id.
-         * Used to sort a vector of MemberMeta objects and to later find
-         * them using binary search.
-         */
-        inline bool operator<(const MemberMeta& a, const MemberMeta& b) noexcept {
-            return a.member_id() < b.member_id();
-        }
-
-        template <typename TChar, typename TTraits>
-        inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const MemberMeta& mm) {
-            out << "MemberMeta(member_id=" << mm.member_id() << " relation_pos=" << mm.relation_pos() << " member_pos=" << mm.member_pos() << " buffer_offset=" << mm.buffer_offset() << ")";
-            return out;
-        }
-
-        /**
-         * Count the number of MemberMeta objects in the iterator range
-         * that are not marked as removed.
-         *
-         * @tparam TIter Iterator that dereferences to a MemberMeta
-         * @param begin Begin of iterator range
-         * @param end End of iterator range
-         */
-        template <typename TIter>
-        inline typename std::iterator_traits<TIter>::difference_type count_not_removed(TIter begin, TIter end) {
-            return std::count_if(begin, end, [](MemberMeta& mm) {
-                return !mm.removed();
-            });
-        }
-
-    } // namespace relations
-
-} // namespace osmium
-
-#endif // OSMIUM_RELATIONS_DETAIL_MEMBER_META_HPP
diff --git a/contrib/libosmium/osmium/relations/detail/relation_meta.hpp b/contrib/libosmium/osmium/relations/detail/relation_meta.hpp
deleted file mode 100644
index a48c50a..0000000
--- a/contrib/libosmium/osmium/relations/detail/relation_meta.hpp
+++ /dev/null
@@ -1,136 +0,0 @@
-#ifndef OSMIUM_RELATIONS_DETAIL_RELATION_META_HPP
-#define OSMIUM_RELATIONS_DETAIL_RELATION_META_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cassert>
-#include <cstddef>
-#include <iosfwd>
-
-namespace osmium {
-
-    namespace relations {
-
-        /**
-         * Helper class for the Collector class.
-         *
-         * Stores information needed to collect all members of a relation. This
-         * includes the offset of the relation in a buffer plus the information
-         * needed to add members to this relation.
-         */
-        class RelationMeta {
-
-            /// The relation we are assembling.
-            size_t m_relation_offset;
-
-            /**
-             * The number of members still needed before the relation is
-             * complete. This will be set to the number of members we are
-             * interested in and then count down for every member we find.
-             * When it is 0, the relation is complete.
-             */
-            int m_need_members = 0;
-
-        public:
-
-            /**
-             * Initialize an empty RelationMeta. This is needed to zero out
-             * relations that have been completed.
-             */
-            RelationMeta() noexcept :
-                m_relation_offset(0) {
-            }
-
-            explicit RelationMeta(size_t relation_offset) noexcept :
-                m_relation_offset(relation_offset) {
-            }
-
-            /**
-             * Get offset of relation in buffer.
-             */
-            size_t relation_offset() const noexcept {
-                return m_relation_offset;
-            }
-
-            /**
-             * Increment the m_need_members counter.
-             */
-            void increment_need_members() noexcept {
-                ++m_need_members;
-            }
-
-            /**
-             * This decrements the "members needed" counter.
-             */
-            void got_one_member() {
-                assert(m_need_members > 0);
-                --m_need_members;
-            }
-
-            /**
-             * Returns true if all members for this relation are available.
-             */
-            bool has_all_members() const noexcept {
-                return m_need_members == 0;
-            }
-
-        }; // class RelationMeta
-
-        template <typename TChar, typename TTraits>
-        inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const RelationMeta& rm) {
-            out << "RelationMeta(relation_offset=" << rm.relation_offset() << " has_all_members=" << rm.has_all_members() << ")";
-            return out;
-        }
-
-        /**
-         * Function object to check if a relation is complete.
-         */
-        struct has_all_members {
-
-            typedef RelationMeta& argument_type;
-            typedef bool result_type;
-
-            /**
-             * @returns true if this relation is complete, false otherwise.
-             */
-            bool operator()(RelationMeta& relation_info) const {
-                return relation_info.has_all_members();
-            }
-
-        }; // struct has_all_members
-
-    } // namespace relations
-
-} // namespace osmium
-
-#endif // OSMIUM_RELATIONS_DETAIL_RELATION_META_HPP
diff --git a/contrib/libosmium/osmium/tags/filter.hpp b/contrib/libosmium/osmium/tags/filter.hpp
deleted file mode 100644
index 0d3fc4e..0000000
--- a/contrib/libosmium/osmium/tags/filter.hpp
+++ /dev/null
@@ -1,162 +0,0 @@
-#ifndef OSMIUM_TAGS_FILTER_HPP
-#define OSMIUM_TAGS_FILTER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <string>
-#include <type_traits>
-#include <vector>
-
-#include <boost/iterator/filter_iterator.hpp>
-
-#include <osmium/memory/collection.hpp>
-#include <osmium/osm/tag.hpp>
-
-namespace osmium {
-
-    namespace tags {
-
-        template <typename TKey>
-        struct match_key {
-            bool operator()(const TKey& rule_key, const char* tag_key) {
-                return rule_key == tag_key;
-            }
-        }; // struct match_key
-
-        struct match_key_prefix {
-            bool operator()(const std::string& rule_key, const char* tag_key) {
-                return rule_key.compare(0, std::string::npos, tag_key, 0, rule_key.size()) == 0;
-            }
-        }; // struct match_key_prefix
-
-        template <typename TValue>
-        struct match_value {
-            bool operator()(const TValue& rule_value, const char* tag_value) {
-                return rule_value == tag_value;
-            }
-        }; // struct match_value
-
-        template <>
-        struct match_value<void> {
-            bool operator()(const bool, const char*) {
-                return true;
-            }
-        }; // struct match_value<void>
-
-        template <typename TKey, typename TValue=void, typename TKeyComp=match_key<TKey>, typename TValueComp=match_value<TValue>>
-        class Filter {
-
-            typedef TKey key_type;
-            typedef typename std::conditional<std::is_void<TValue>::value, bool, TValue>::type value_type;
-
-            struct Rule {
-                key_type key;
-                value_type value;
-                bool ignore_value;
-                bool result;
-
-                explicit Rule(bool r, bool ignore, const key_type& k, const value_type& v) :
-                    key(k),
-                    value(v),
-                    ignore_value(ignore),
-                    result(r) {
-                }
-
-                explicit Rule(bool r, bool ignore, const key_type& k) :
-                    key(k),
-                    value(),
-                    ignore_value(ignore),
-                    result(r) {
-                }
-
-            }; // struct Rule
-
-            std::vector<Rule> m_rules;
-            bool m_default_result;
-
-        public:
-
-            typedef Filter<TKey, TValue, TKeyComp, TValueComp> filter_type;
-            typedef const osmium::Tag& argument_type;
-            typedef bool result_type;
-            typedef boost::filter_iterator<filter_type, osmium::TagList::const_iterator> iterator;
-
-            explicit Filter(bool default_result = false) :
-                m_default_result(default_result) {
-            }
-
-            template <typename V=TValue, typename std::enable_if<!std::is_void<V>::value, int>::type = 0>
-            Filter& add(bool result, const key_type& key, const value_type& value) {
-                m_rules.emplace_back(result, false, key, value);
-                return *this;
-            }
-
-            Filter& add(bool result, const key_type& key) {
-                m_rules.emplace_back(result, true, key);
-                return *this;
-            }
-
-            bool operator()(const osmium::Tag& tag) const {
-                for (const Rule& rule : m_rules) {
-                    if (TKeyComp()(rule.key, tag.key()) && (rule.ignore_value || TValueComp()(rule.value, tag.value()))) {
-                        return rule.result;
-                    }
-                }
-                return m_default_result;
-            }
-
-            /**
-             * Return the number of rules in this filter.
-             */
-            size_t count() const {
-                return m_rules.count();
-            }
-
-            /**
-             * Is this filter empty, ie are there no rules defined?
-             */
-            bool empty() const {
-                return m_rules.empty();
-            }
-
-        }; // class Filter
-
-        typedef Filter<std::string, std::string> KeyValueFilter;
-        typedef Filter<std::string> KeyFilter;
-        typedef Filter<std::string, void, match_key_prefix> KeyPrefixFilter;
-
-    } // namespace tags
-
-} // namespace osmium
-
-#endif // OSMIUM_TAGS_FILTER_HPP
diff --git a/contrib/libosmium/osmium/tags/regex_filter.hpp b/contrib/libosmium/osmium/tags/regex_filter.hpp
deleted file mode 100644
index 725c423..0000000
--- a/contrib/libosmium/osmium/tags/regex_filter.hpp
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef OSMIUM_TAGS_REGEX_FILTER_HPP
-#define OSMIUM_TAGS_REGEX_FILTER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <regex>
-#include <string>
-
-#include <osmium/tags/filter.hpp>
-
-namespace osmium {
-
-    namespace tags {
-
-        template <>
-        struct match_value<std::regex> {
-            bool operator()(const std::regex& rule_value, const char* tag_value) {
-                return std::regex_match(tag_value, rule_value);
-            }
-        }; // struct match_value<std::regex>
-
-        typedef Filter<std::string, std::regex> RegexFilter;
-
-    } // namespace tags
-
-} // namespace osmium
-
-#endif // OSMIUM_TAGS_REGEX_FILTER_HPP
diff --git a/contrib/libosmium/osmium/tags/taglist.hpp b/contrib/libosmium/osmium/tags/taglist.hpp
deleted file mode 100644
index 8fc9c68..0000000
--- a/contrib/libosmium/osmium/tags/taglist.hpp
+++ /dev/null
@@ -1,67 +0,0 @@
-#ifndef OSMIUM_TAGS_TAGLIST_HPP
-#define OSMIUM_TAGS_TAGLIST_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <utility>
-
-#include <osmium/osm/tag.hpp>
-
-namespace osmium {
-
-    /**
-     * @brief Code related to working with OSM tags
-     */
-    namespace tags {
-
-        template <typename TFilter>
-        inline bool match_any_of(const osmium::TagList& tag_list, TFilter&& filter) {
-            return std::any_of(tag_list.cbegin(), tag_list.cend(), std::forward<TFilter>(filter));
-        }
-
-        template <typename TFilter>
-        inline bool match_all_of(const osmium::TagList& tag_list, TFilter&& filter) {
-            return std::all_of(tag_list.cbegin(), tag_list.cend(), std::forward<TFilter>(filter));
-        }
-
-        template <typename TFilter>
-        inline bool match_none_of(const osmium::TagList& tag_list, TFilter&& filter) {
-            return std::none_of(tag_list.cbegin(), tag_list.cend(), std::forward<TFilter>(filter));
-        }
-
-    } // namespace tags
-
-} // namespace osmium
-
-#endif // OSMIUM_TAGS_TAGLIST_HPP
diff --git a/contrib/libosmium/osmium/thread/function_wrapper.hpp b/contrib/libosmium/osmium/thread/function_wrapper.hpp
deleted file mode 100644
index 95b85d6..0000000
--- a/contrib/libosmium/osmium/thread/function_wrapper.hpp
+++ /dev/null
@@ -1,123 +0,0 @@
-#ifndef OSMIUM_THREAD_FUNCTION_WRAPPER_HPP
-#define OSMIUM_THREAD_FUNCTION_WRAPPER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <memory>
-
-namespace osmium {
-
-    namespace thread {
-
-        /**
-         * This function wrapper can collect move-only functions unlike
-         * std::function which needs copyable functions.
-         * Taken from the book "C++ Concurrency in Action".
-         */
-        class function_wrapper {
-
-            struct impl_base {
-
-                virtual ~impl_base() = default;
-                virtual bool call() {
-                    return true;
-                }
-
-            }; // struct impl_base
-
-            std::unique_ptr<impl_base> impl;
-
-            template <typename F>
-            struct impl_type : impl_base {
-
-                F m_functor;
-
-                impl_type(F&& functor) :
-                    m_functor(std::forward<F>(functor)) {
-                }
-
-                bool call() override {
-                    m_functor();
-                    return false;
-                }
-
-            }; // struct impl_type
-
-        public:
-
-            // Constructor must not be "explicit" for wrapper
-            // to work seemlessly.
-            template <typename TFunction>
-            function_wrapper(TFunction&& f) :
-                impl(new impl_type<TFunction>(std::forward<TFunction>(f))) {
-            }
-
-            // The integer parameter is only used to signal that we want
-            // the special function wrapper that makes the worker thread
-            // shut down.
-            function_wrapper(int) :
-                impl(new impl_base()) {
-            }
-
-            bool operator()() {
-                return impl->call();
-            }
-
-            function_wrapper() = default;
-
-            function_wrapper(function_wrapper&& other) :
-                impl(std::move(other.impl)) {
-            }
-
-            function_wrapper& operator=(function_wrapper&& other) {
-                impl = std::move(other.impl);
-                return *this;
-            }
-
-            function_wrapper(const function_wrapper&) = delete;
-            function_wrapper& operator=(const function_wrapper&) = delete;
-
-            ~function_wrapper() = default;
-
-            explicit operator bool() const {
-                return static_cast<bool>(impl);
-            }
-
-        }; // class function_wrapper
-
-    } // namespace thread
-
-} // namespace osmium
-
-#endif // OSMIUM_THREAD_FUNCTION_WRAPPER_HPP
diff --git a/contrib/libosmium/osmium/thread/pool.hpp b/contrib/libosmium/osmium/thread/pool.hpp
deleted file mode 100644
index dd1023b..0000000
--- a/contrib/libosmium/osmium/thread/pool.hpp
+++ /dev/null
@@ -1,190 +0,0 @@
-#ifndef OSMIUM_THREAD_POOL_HPP
-#define OSMIUM_THREAD_POOL_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <atomic>
-#include <cstddef>
-#include <cstdlib>
-#include <future>
-#include <thread>
-#include <type_traits>
-#include <vector>
-
-#include <osmium/thread/function_wrapper.hpp>
-#include <osmium/thread/queue.hpp>
-#include <osmium/thread/util.hpp>
-#include <osmium/util/config.hpp>
-
-namespace osmium {
-
-    /**
-     * @brief Threading-related low-level code
-     */
-    namespace thread {
-
-        /**
-         *  Thread pool.
-         */
-        class Pool {
-
-            /**
-             * This class makes sure all pool threads will be joined when
-             * the pool is destructed.
-             */
-            class thread_joiner {
-
-                std::vector<std::thread>& m_threads;
-
-            public:
-
-                explicit thread_joiner(std::vector<std::thread>& threads) :
-                    m_threads(threads) {
-                }
-
-                ~thread_joiner() {
-                    for (auto& thread : m_threads) {
-                        if (thread.joinable()) {
-                            thread.join();
-                        }
-                    }
-                }
-
-            }; // class thread_joiner
-
-            osmium::thread::Queue<function_wrapper> m_work_queue;
-            std::vector<std::thread> m_threads;
-            thread_joiner m_joiner;
-            int m_num_threads;
-
-            void worker_thread() {
-                osmium::thread::set_thread_name("_osmium_worker");
-                while (true) {
-                    function_wrapper task;
-                    m_work_queue.wait_and_pop_with_timeout(task);
-                    if (task) {
-                        if (task()) {
-                            // The called tasks returns true only when the
-                            // worker thread should shut down.
-                            return;
-                        }
-                    }
-                }
-            }
-
-            /**
-             * Create thread pool with the given number of threads. If
-             * num_threads is 0, the number of threads is read from
-             * the environment variable OSMIUM_POOL_THREADS. The default
-             * value in that case is -2.
-             *
-             * If the number of threads is a negative number, it will be
-             * set to the actual number of cores on the system plus the
-             * given number, ie it will leave a number of cores unused.
-             *
-             * In all cases the minimum number of threads in the pool is 1.
-             */
-            explicit Pool(int num_threads, size_t max_queue_size) :
-                m_work_queue(max_queue_size, "work"),
-                m_threads(),
-                m_joiner(m_threads),
-                m_num_threads(num_threads) {
-
-                if (m_num_threads == 0) {
-                    m_num_threads = osmium::config::get_pool_threads();
-                }
-
-                if (m_num_threads <= 0) {
-                    m_num_threads = std::max(1, static_cast<int>(std::thread::hardware_concurrency()) + m_num_threads);
-                }
-
-                try {
-                    for (int i = 0; i < m_num_threads; ++i) {
-                        m_threads.push_back(std::thread(&Pool::worker_thread, this));
-                    }
-                } catch (...) {
-                    shutdown_all_workers();
-                    throw;
-                }
-            }
-
-        public:
-
-            static constexpr int default_num_threads = 0;
-            static constexpr size_t max_work_queue_size = 10;
-
-            static Pool& instance() {
-                static Pool pool(default_num_threads, max_work_queue_size);
-                return pool;
-            }
-
-            void shutdown_all_workers() {
-                for (int i = 0; i < m_num_threads; ++i) {
-                    // The special function wrapper makes a worker shut down.
-                    m_work_queue.push(function_wrapper{0});
-                }
-            }
-
-            ~Pool() {
-                shutdown_all_workers();
-                m_work_queue.shutdown();
-            }
-
-            size_t queue_size() const {
-                return m_work_queue.size();
-            }
-
-            bool queue_empty() const {
-                return m_work_queue.empty();
-            }
-
-            template <typename TFunction>
-            std::future<typename std::result_of<TFunction()>::type> submit(TFunction&& func) {
-
-                typedef typename std::result_of<TFunction()>::type result_type;
-
-                std::packaged_task<result_type()> task(std::forward<TFunction>(func));
-                std::future<result_type> future_result(task.get_future());
-                m_work_queue.push(std::move(task));
-
-                return future_result;
-            }
-
-        }; // class Pool
-
-    } // namespace thread
-
-} // namespace osmium
-
-#endif // OSMIUM_THREAD_POOL_HPP
diff --git a/contrib/libosmium/osmium/thread/queue.hpp b/contrib/libosmium/osmium/thread/queue.hpp
deleted file mode 100644
index 76ad9a0..0000000
--- a/contrib/libosmium/osmium/thread/queue.hpp
+++ /dev/null
@@ -1,192 +0,0 @@
-#ifndef OSMIUM_THREAD_QUEUE_HPP
-#define OSMIUM_THREAD_QUEUE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <atomic>
-#include <chrono>
-#include <condition_variable>
-#include <cstddef>
-#include <mutex>
-#include <queue>
-#include <string>
-#include <thread>
-#include <utility> // IWYU pragma: keep (for std::move)
-
-namespace osmium {
-
-    namespace thread {
-
-        static const std::chrono::milliseconds full_queue_sleep_duration { 10 }; // XXX
-
-        /**
-         *  A thread-safe queue.
-         */
-        template <typename T>
-        class Queue {
-
-            /// Maximum size of this queue. If the queue is full pushing to
-            /// the queue will block.
-            const size_t m_max_size;
-
-            /// Name of this queue (for debugging only).
-            const std::string m_name;
-
-            mutable std::mutex m_mutex;
-
-            std::queue<T> m_queue;
-
-            /// Used to signal readers when data is available in the queue.
-            std::condition_variable m_data_available;
-
-            std::atomic<bool> m_done;
-
-#ifdef OSMIUM_DEBUG_QUEUE_SIZE
-            /// The largest size the queue has been so far.
-            size_t m_largest_size;
-
-            /// The number of times the queue was full and a thread pushing
-            /// to the queue was blocked.
-            std::atomic<int> m_full_counter;
-#endif
-
-        public:
-
-            /**
-             * Construct a multithreaded queue.
-             *
-             * @param max_size Maximum number of elements in the queue. Set to
-             *                 0 for an unlimited size.
-             * @param name Optional name for this queue. (Used for debugging.)
-             */
-            Queue(size_t max_size = 0, const std::string& name = "") :
-                m_max_size(max_size),
-                m_name(name),
-                m_mutex(),
-                m_queue(),
-                m_data_available(),
-                m_done(false)
-#ifdef OSMIUM_DEBUG_QUEUE_SIZE
-                ,
-                m_largest_size(0),
-                m_full_counter(0)
-#endif
-            {
-            }
-
-            ~Queue() {
-                shutdown();
-#ifdef OSMIUM_DEBUG_QUEUE_SIZE
-                std::cerr << "queue '" << m_name << "' with max_size=" << m_max_size << " had largest size " << m_largest_size << " and was full " << m_full_counter << " times\n";
-#endif
-            }
-
-            /**
-             * Push an element onto the queue. If the queue has a max size, this
-             * call will block if the queue is full.
-             */
-            void push(T value) {
-                if (m_max_size) {
-                    while (size() >= m_max_size) {
-                        std::this_thread::sleep_for(full_queue_sleep_duration);
-#ifdef OSMIUM_DEBUG_QUEUE_SIZE
-                        ++m_full_counter;
-#endif
-                    }
-                }
-                std::lock_guard<std::mutex> lock(m_mutex);
-                m_queue.push(std::move(value));
-#ifdef OSMIUM_DEBUG_QUEUE_SIZE
-                if (m_largest_size < m_queue.size()) {
-                    m_largest_size = m_queue.size();
-                }
-#endif
-                m_data_available.notify_one();
-            }
-
-            void shutdown() {
-                m_done = true;
-                m_data_available.notify_all();
-            }
-
-            void wait_and_pop(T& value) {
-                std::unique_lock<std::mutex> lock(m_mutex);
-                m_data_available.wait(lock, [this] {
-                    return !m_queue.empty() || m_done;
-                });
-                if (!m_queue.empty()) {
-                    value = std::move(m_queue.front());
-                    m_queue.pop();
-                }
-            }
-
-            void wait_and_pop_with_timeout(T& value) {
-                std::unique_lock<std::mutex> lock(m_mutex);
-                if (!m_data_available.wait_for(lock, std::chrono::seconds(1), [this] {
-                    return !m_queue.empty() || m_done;
-                })) {
-                    return;
-                }
-                if (!m_queue.empty()) {
-                    value = std::move(m_queue.front());
-                    m_queue.pop();
-                }
-            }
-
-            bool try_pop(T& value) {
-                std::lock_guard<std::mutex> lock(m_mutex);
-                if (m_queue.empty()) {
-                    return false;
-                }
-                value = std::move(m_queue.front());
-                m_queue.pop();
-                return true;
-            }
-
-            bool empty() const {
-                std::lock_guard<std::mutex> lock(m_mutex);
-                return m_queue.empty();
-            }
-
-            size_t size() const {
-                std::lock_guard<std::mutex> lock(m_mutex);
-                return m_queue.size();
-            }
-
-        }; // class Queue
-
-    } // namespace thread
-
-} // namespace osmium
-
-#endif // OSMIUM_THREAD_QUEUE_HPP
diff --git a/contrib/libosmium/osmium/thread/sorted_queue.hpp b/contrib/libosmium/osmium/thread/sorted_queue.hpp
deleted file mode 100644
index e76ade1..0000000
--- a/contrib/libosmium/osmium/thread/sorted_queue.hpp
+++ /dev/null
@@ -1,159 +0,0 @@
-#ifndef OSMIUM_THREAD_SORTED_QUEUE_HPP
-#define OSMIUM_THREAD_SORTED_QUEUE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <condition_variable>
-#include <cstddef>
-#include <deque>
-#include <mutex>
-
-namespace osmium {
-
-    namespace thread {
-
-        /**
-         * This implements a sorted queue. It is a bit like a priority
-         * queue. We have n worker threads pushing items into the queue
-         * and one thread pulling them out again "in order". The order
-         * is defined by the monotonically increasing "num" parameter
-         * to the push() method. The wait_and_pop() and try_pop() methods
-         * will only give out the next numbered item. This way several
-         * workers can work in their own time on different pieces of
-         * some incoming data, but it all gets serialized properly again
-         * after the workers have done their work.
-         */
-        template <typename T>
-        class SortedQueue {
-
-            typedef typename std::deque<T>::size_type size_type;
-
-            mutable std::mutex m_mutex;
-            std::deque<T> m_queue;
-            std::condition_variable m_data_available;
-
-            size_type m_offset;
-
-            // this method expects that we already have the lock
-            bool empty_intern() const {
-                return m_queue.front() == T();
-            }
-
-        public:
-
-            SortedQueue() :
-                m_mutex(),
-                m_queue(1),
-                m_data_available(),
-                m_offset(0) {
-            }
-
-            /**
-             * Push an item into the queue.
-             *
-             * @param value The item to push into the queue.
-             * @param num Number to describe ordering for the items.
-             *            It must increase monotonically.
-             */
-            void push(T value, size_type num) {
-                std::lock_guard<std::mutex> lock(m_mutex);
-
-                num -= m_offset;
-                if (m_queue.size() <= num + 1) {
-                    m_queue.resize(num + 2);
-                }
-                m_queue[num] = std::move(value);
-
-                m_data_available.notify_one();
-            }
-
-            /**
-             * Wait until the next item becomes available and make it
-             * available through value.
-             */
-            void wait_and_pop(T& value) {
-                std::unique_lock<std::mutex> lock(m_mutex);
-
-                m_data_available.wait(lock, [this] {
-                    return !empty_intern();
-                });
-                value = std::move(m_queue.front());
-                m_queue.pop_front();
-                ++m_offset;
-            }
-
-            /**
-             * Get next item if it is available and return true. Or
-             * return false otherwise.
-             */
-            bool try_pop(T& value) {
-                std::lock_guard<std::mutex> lock(m_mutex);
-
-                if (empty_intern()) {
-                    return false;
-                }
-                value = std::move(m_queue.front());
-                m_queue.pop_front();
-                ++m_offset;
-                return true;
-            }
-
-            /**
-             * The queue is empty. This means try_pop() would fail if called.
-             * It does not mean that there is nothing on the queue. Because
-             * the queue is sorted, it could mean that the next item in the
-             * queue is not available, but other items are.
-             */
-            bool empty() const {
-                std::lock_guard<std::mutex> lock(m_mutex);
-
-                return empty_intern();
-            }
-
-            /**
-             * Returns the number of items in the queue, regardless of whether
-             * they can be accessed. If this is =0 it
-             * implies empty()==true, but not the other way around.
-             */
-            size_t size() const {
-                std::lock_guard<std::mutex> lock(m_mutex);
-                return m_queue.size();
-            }
-
-        }; // class SortedQueue
-
-    } // namespace thread
-
-} // namespace osmium
-
-#endif // OSMIUM_THREAD_SORTED_QUEUE_HPP
diff --git a/contrib/libosmium/osmium/thread/util.hpp b/contrib/libosmium/osmium/thread/util.hpp
deleted file mode 100644
index 00de0d8..0000000
--- a/contrib/libosmium/osmium/thread/util.hpp
+++ /dev/null
@@ -1,116 +0,0 @@
-#ifndef OSMIUM_THREAD_UTIL_HPP
-#define OSMIUM_THREAD_UTIL_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <chrono>
-#include <future>
-
-#ifdef __linux__
-# include <sys/prctl.h>
-#endif
-
-namespace osmium {
-
-    namespace thread {
-
-        /**
-         * Check if the future resulted in an exception. This will re-throw
-         * the exception stored in the future if there was one. Otherwise it
-         * will just return.
-         */
-        template <typename T>
-        inline void check_for_exception(std::future<T>& future) {
-            if (future.valid() && future.wait_for(std::chrono::seconds(0)) == std::future_status::ready) {
-                future.get();
-            }
-        }
-
-        /**
-         * Wait until the given future becomes ready. Will block if the future
-         * is not ready. Can be called more than once unlike future.get().
-         */
-        template <typename T>
-        inline void wait_until_done(std::future<T>& future) {
-            if (future.valid()) {
-                future.get();
-            }
-        }
-
-        /**
-         * Set name of current thread for debugging. This only works on Linux.
-         */
-#ifdef __linux__
-        inline void set_thread_name(const char* name) noexcept {
-            prctl(PR_SET_NAME, name, 0, 0, 0);
-        }
-#else
-        inline void set_thread_name(const char*) noexcept {
-            // intentionally left blank
-        }
-#endif
-
-        class thread_handler {
-
-            std::thread m_thread;
-
-        public:
-
-            thread_handler() :
-                m_thread() {
-            }
-
-            template <typename TFunction, typename... TArgs>
-            thread_handler(TFunction&& f, TArgs&&... args) :
-                m_thread(std::forward<TFunction>(f), std::forward<TArgs>(args)...) {
-            }
-
-            thread_handler(const thread_handler&) = delete;
-            thread_handler& operator=(const thread_handler&) = delete;
-
-            thread_handler(thread_handler&&) = default;
-            thread_handler& operator=(thread_handler&&) = default;
-
-            ~thread_handler() {
-                if (m_thread.joinable()) {
-                    m_thread.join();
-                }
-            }
-
-        }; // class thread_handler
-
-    } // namespace thread
-
-} // namespace osmium
-
-#endif //  OSMIUM_THREAD_UTIL_HPP
diff --git a/contrib/libosmium/osmium/util/cast.hpp b/contrib/libosmium/osmium/util/cast.hpp
deleted file mode 100644
index 4866fde..0000000
--- a/contrib/libosmium/osmium/util/cast.hpp
+++ /dev/null
@@ -1,103 +0,0 @@
-#ifndef OSMIUM_UTIL_CAST_HPP
-#define OSMIUM_UTIL_CAST_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#ifndef assert
-# include <cassert>
-#endif
-
-#include <cstdint>
-#include <limits>
-#include <type_traits>
-
-namespace osmium {
-
-    // These functions are wrappers around static_cast<>() that call assert()
-    // to check that there is no integer overflow happening before doing the
-    // cast. There are several versions of this templated function here
-    // depending on the types of the input and output. In any case, both input
-    // and output have to be integral types. If the cast can't overflow, no
-    // check is done.
-
-    template <typename A, typename B>
-    struct are_real_integers :
-        std::integral_constant<bool,
-            std::is_integral<A>::value &&
-            std::is_integral<B>::value &&
-            !std::is_same<A, bool>::value &&
-            !std::is_same<B, bool>::value> {
-    };
-
-    template <typename T, typename F, typename std::enable_if<are_real_integers<T, F>::value && std::is_same<T, F>::value, int>::type = 0>
-    inline T static_cast_with_assert(const F value) {
-        return value;
-    }
-
-    template <typename T, typename F, typename std::enable_if<are_real_integers<T, F>::value && !std::is_same<T, F>::value && (sizeof(T) > sizeof(F)), int>::type = 0>
-    inline T static_cast_with_assert(const F value) {
-        return static_cast<T>(value);
-    }
-
-    template <typename T, typename F, typename std::enable_if<are_real_integers<T, F>::value && !std::is_same<T, F>::value && std::is_signed<T>::value == std::is_signed<F>::value && (sizeof(T) == sizeof(F)), int>::type = 0>
-    inline T static_cast_with_assert(const F value) {
-        return static_cast<T>(value);
-    }
-
-    template <typename T, typename F, typename std::enable_if<are_real_integers<T, F>::value && !std::is_same<T, F>::value && (sizeof(T) < sizeof(F)) && std::is_signed<T>::value && std::is_signed<F>::value, int>::type = 0>
-    inline T static_cast_with_assert(const F value) {
-        assert(value >= std::numeric_limits<T>::min() && value <= std::numeric_limits<T>::max());
-        return static_cast<T>(value);
-    }
-
-    template <typename T, typename F, typename std::enable_if<are_real_integers<T, F>::value && !std::is_same<T, F>::value && (sizeof(T) <= sizeof(F)) && std::is_unsigned<T>::value && std::is_signed<F>::value, int>::type = 0>
-    inline T static_cast_with_assert(const F value) {
-        assert(value >= 0 && static_cast<typename std::make_unsigned<F>::type>(value) <= std::numeric_limits<T>::max());
-        return static_cast<T>(value);
-    }
-
-    template <typename T, typename F, typename std::enable_if<are_real_integers<T, F>::value && !std::is_same<T, F>::value && (sizeof(T) < sizeof(F)) && std::is_unsigned<T>::value && std::is_unsigned<F>::value, int>::type = 0>
-    inline T static_cast_with_assert(const F value) {
-        assert(value <= std::numeric_limits<T>::max());
-        return static_cast<T>(value);
-    }
-
-    template <typename T, typename F, typename std::enable_if<are_real_integers<T, F>::value && !std::is_same<T, F>::value && (sizeof(T) <= sizeof(F)) && std::is_signed<T>::value && std::is_unsigned<F>::value, int>::type = 0>
-    inline T static_cast_with_assert(const F value) {
-        assert(static_cast<int64_t>(value) <= static_cast<int64_t>(std::numeric_limits<T>::max()));
-        return static_cast<T>(value);
-    }
-
-} // namespace osmium
-
-#endif // OSMIUM_UTIL_CAST_HPP
diff --git a/contrib/libosmium/osmium/util/compatibility.hpp b/contrib/libosmium/osmium/util/compatibility.hpp
deleted file mode 100644
index 23753ce..0000000
--- a/contrib/libosmium/osmium/util/compatibility.hpp
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef OSMIUM_UTIL_COMPATIBILITY_HPP
-#define OSMIUM_UTIL_COMPATIBILITY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-// Workarounds for MSVC which doesn't support
-// * constexpr in all cases yet
-// * [[noreturn]]
-#ifdef _MSC_VER
-# define OSMIUM_CONSTEXPR
-# define OSMIUM_NORETURN __declspec(noreturn)
-#else
-# define OSMIUM_CONSTEXPR constexpr
-# define OSMIUM_NORETURN [[noreturn]]
-#endif
-
-// [[deprecated]] is only available in C++14, use this for the time being
-#ifdef __GNUC__
-# define OSMIUM_DEPRECATED __attribute__((deprecated))
-#elif defined(_MSC_VER)
-# define OSMIUM_DEPRECATED __declspec(deprecated)
-#else
-# define OSMIUM_DEPRECATED
-#endif
-
-#endif // OSMIUM_UTIL_COMPATIBILITY_HPP
diff --git a/contrib/libosmium/osmium/util/config.hpp b/contrib/libosmium/osmium/util/config.hpp
deleted file mode 100644
index 3285eed..0000000
--- a/contrib/libosmium/osmium/util/config.hpp
+++ /dev/null
@@ -1,72 +0,0 @@
-#ifndef OSMIUM_UTIL_CONFIG_HPP
-#define OSMIUM_UTIL_CONFIG_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cstdlib>
-#include <cstring>
-
-#ifdef _MSC_VER
-# define strcasecmp _stricmp
-#endif
-
-namespace osmium {
-
-    namespace config {
-
-        inline int get_pool_threads() {
-            const char* env = getenv("OSMIUM_POOL_THREADS");
-            if (env) {
-                return std::atoi(env);
-            }
-            return -2;
-        }
-
-        inline bool use_pool_threads_for_pbf_parsing() {
-            const char* env = getenv("OSMIUM_USE_POOL_THREADS_FOR_PBF_PARSING");
-            if (env) {
-                if (!strcasecmp(env, "off") ||
-                    !strcasecmp(env, "false") ||
-                    !strcasecmp(env, "no") ||
-                    !strcasecmp(env, "0")) {
-                    return false;
-                }
-            }
-            return true;
-        }
-
-    } // namespace config
-
-} // namespace osmium
-
-#endif // OSMIUM_UTIL_CONFIG_HPP
diff --git a/contrib/libosmium/osmium/util/data_file.hpp b/contrib/libosmium/osmium/util/data_file.hpp
deleted file mode 100644
index 53bb81c..0000000
--- a/contrib/libosmium/osmium/util/data_file.hpp
+++ /dev/null
@@ -1,194 +0,0 @@
-#ifndef OSMIUM_UTIL_DATA_FILE_HPP
-#define OSMIUM_UTIL_DATA_FILE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cerrno>
-#include <cstddef>
-#include <cstdio>
-#include <stdexcept>
-#include <string>
-#include <system_error>
-
-#ifdef _WIN32
-# include <io.h>
-# include <windows.h>
-#endif
-
-#include <osmium/util/file.hpp>
-
-namespace osmium {
-
-    namespace util {
-
-        /**
-         * Class wrapper for convenient access to some low-level file
-         * functions.
-         */
-        class DataFile {
-
-            FILE* m_file;
-
-        public:
-
-            /**
-             * Create and open a temporary file. It is removed after opening.
-             *
-             * @throws std::system_error if something went wrong.
-             */
-            DataFile() :
-                m_file(::tmpfile()) {
-                if (!m_file) {
-                    throw std::system_error(errno, std::system_category(), "tmpfile failed");
-                }
-            }
-
-            /**
-             * Create and open a temporary file with the specified size. It
-             * is removed after opening.
-             *
-             * @throws std::system_error if something went wrong.
-             */
-            explicit DataFile(size_t size) :
-                DataFile() {
-                grow(size);
-            }
-
-            /**
-             * Create and open a named file.
-             *
-             * @param filename the name of the file
-             * @param writable should the file be writable?
-             * @throws std::system_error if something went wrong.
-             */
-            DataFile(const char* filename, bool writable) :
-                m_file(::fopen(filename, writable ? "wb+" : "rb" )) {
-                if (!m_file) {
-                    throw std::system_error(errno, std::system_category(), "fopen failed");
-                }
-            }
-
-            /**
-             * Create and open a named file.
-             *
-             * @param filename the name of the file
-             * @param writable should the file be writable?
-             * @throws std::system_error if something went wrong.
-             */
-            DataFile(const std::string& filename, bool writable) :
-                DataFile(filename.c_str(), writable) {
-            }
-
-            /**
-             * In boolean context the DataFile class returns true if the file
-             * is open.
-             */
-            operator bool() const noexcept {
-                return m_file != nullptr;
-            }
-
-            /**
-             * Close the file.
-             *
-             * Does nothing if the file is already closed.
-             *
-             * @throws std::system_error if file could not be closed
-             */
-            void close() {
-                if (m_file) {
-                    if (::fclose(m_file) != 0) {
-                        throw std::system_error(errno, std::system_category(), "fclose failed");
-                    }
-                    m_file = nullptr;
-                }
-            }
-
-            ~DataFile() noexcept {
-                try {
-                    close();
-                } catch (std::system_error&) {
-                    // Ignore any exceptions because destructor must not throw.
-                }
-            }
-
-            /**
-             * Get file descriptor of underlying file.
-             *
-             * @throws std::runtime_errro if file is not open
-             * @throws std::system_error if fileno(3) call failed
-             */
-            int fd() const {
-                if (!m_file) {
-                    throw std::runtime_error("no open file");
-                }
-
-                int fd = ::fileno(m_file);
-
-                if (fd == -1) {
-                    throw std::system_error(errno, std::system_category(), "fileno failed");
-                }
-
-                return fd;
-            }
-
-            /**
-             * Ask the operating system for the size of this file.
-             *
-             * @throws std::system_error if fstat(2) call failed
-             */
-            size_t size() const {
-                return osmium::util::file_size(fd());
-            }
-
-            /**
-             * Grow file to given size.
-             *
-             * If the file is large enough already, nothing is done.
-             * The file is never shrunk.
-             *
-             * @throws std::system_error if ftruncate(2) call failed
-             */
-            void grow(size_t new_size) const {
-                if (size() < new_size) {
-                    osmium::util::resize_file(fd(), new_size);
-                }
-            }
-
-        }; // class DataFile
-
-    } // namespace util
-
-} // namespace osmium
-
-
-#endif // OSMIUM_UTIL_DATA_FILE_HPP
diff --git a/contrib/libosmium/osmium/util/delta.hpp b/contrib/libosmium/osmium/util/delta.hpp
deleted file mode 100644
index cdf3674..0000000
--- a/contrib/libosmium/osmium/util/delta.hpp
+++ /dev/null
@@ -1,174 +0,0 @@
-#ifndef OSMIUM_UTIL_DELTA_HPP
-#define OSMIUM_UTIL_DELTA_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <iterator>
-#include <type_traits>
-#include <utility>
-
-#include <osmium/util/cast.hpp>
-
-namespace osmium {
-
-    namespace util {
-
-        /**
-         * Helper class for delta encoding.
-         */
-        template <typename TValue, typename TDelta = int64_t>
-        class DeltaEncode {
-
-            static_assert(std::is_integral<TValue>::value,
-                          "DeltaEncode value type must be some integer");
-
-            static_assert(std::is_integral<TDelta>::value && std::is_signed<TDelta>::value,
-                          "DeltaEncode delta type must be some signed integer");
-
-            TValue m_value;
-
-        public:
-
-            using value_type = TValue;
-            using delta_type = TDelta;
-
-            DeltaEncode(TValue value = 0) :
-                m_value(value) {
-            }
-
-            void clear() noexcept {
-                m_value = 0;
-            }
-
-            TValue value() const noexcept {
-                return m_value;
-            }
-
-            TDelta update(TValue new_value) noexcept {
-                using std::swap;
-                swap(m_value, new_value);
-                return static_cast_with_assert<TDelta>(m_value) -
-                       static_cast_with_assert<TDelta>(new_value);
-            }
-
-        }; // class DeltaEncode
-
-        /**
-         * Helper class for delta decoding.
-         */
-        template <typename TValue, typename TDelta = int64_t>
-        class DeltaDecode {
-
-            static_assert(std::is_integral<TValue>::value,
-                          "DeltaDecode value type must be some integer");
-
-            static_assert(std::is_integral<TDelta>::value && std::is_signed<TDelta>::value,
-                          "DeltaDecode delta type must be some signed integer");
-
-            TValue m_value;
-
-        public:
-
-            using value_type = TValue;
-            using delta_type = TDelta;
-
-            DeltaDecode() :
-                m_value(0) {
-            }
-
-            void clear() noexcept {
-                m_value = 0;
-            }
-
-            TValue update(TDelta delta) noexcept {
-                m_value = static_cast_with_assert<TValue>(
-                              static_cast_with_assert<TDelta>(m_value) + delta);
-                return m_value;
-            }
-
-        }; // class DeltaDecode
-
-        template <typename TBaseIterator, typename TTransform, typename TValue, typename TDelta = int64_t>
-        class DeltaEncodeIterator : public std::iterator<std::input_iterator_tag, TValue> {
-
-            TBaseIterator m_it;
-            TBaseIterator m_end;
-            TTransform m_trans;
-            DeltaEncode<TValue, TDelta> m_value;
-            TDelta m_delta;
-
-        public:
-
-            using value_type = TValue;
-            using delta_type = TDelta;
-
-            DeltaEncodeIterator(TBaseIterator first, TBaseIterator last, TTransform& trans) :
-                m_it(first),
-                m_end(last),
-                m_trans(trans),
-                m_value(m_it != m_end ? m_trans(m_it) : 0),
-                m_delta(static_cast_with_assert<TDelta>(m_value.value())) {
-            }
-
-            DeltaEncodeIterator& operator++() {
-                if (++m_it != m_end) {
-                    m_delta = m_value.update(m_trans(m_it));
-                }
-                return *this;
-            }
-
-            DeltaEncodeIterator operator++(int) {
-                DeltaEncodeIterator tmp(*this);
-                operator++();
-                return tmp;
-            }
-
-            TDelta operator*() {
-                return m_delta;
-            }
-
-            bool operator==(const DeltaEncodeIterator& rhs) const {
-                return m_it == rhs.m_it && m_end == rhs.m_end;
-            }
-
-            bool operator!=(const DeltaEncodeIterator& rhs) const {
-                return !(*this == rhs);
-            }
-
-        }; // class DeltaEncodeIterator
-
-    } // namespace util
-
-} // namespace osmium
-
-#endif // OSMIUM_UTIL_DELTA_HPP
diff --git a/contrib/libosmium/osmium/util/double.hpp b/contrib/libosmium/osmium/util/double.hpp
deleted file mode 100644
index 85a2508..0000000
--- a/contrib/libosmium/osmium/util/double.hpp
+++ /dev/null
@@ -1,93 +0,0 @@
-#ifndef OSMIUM_UTIL_DOUBLE_HPP
-#define OSMIUM_UTIL_DOUBLE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <algorithm>
-#include <cassert>
-#include <cmath>
-#include <cstdio>
-#include <iterator>
-#include <string>
-
-namespace osmium {
-
-    namespace util {
-
-        constexpr int max_double_length = 20; // should fit any double
-
-        /**
-         * Write double to iterator, removing superfluous '0' characters at
-         * the end. The decimal dot will also be removed if necessary.
-         *
-         * @tparam T iterator type
-         * @param iterator output iterator
-         * @param value the value that should be written
-         * @param precision max number of digits after the decimal point (must be <= 17)
-         */
-        template <typename T>
-        inline T double2string(T iterator, double value, int precision) {
-            assert(precision <= 17);
-
-            char buffer[max_double_length];
-
-#ifndef _MSC_VER
-            int len = snprintf(buffer, max_double_length, "%.*f", precision, value);
-#else
-            int len = _snprintf(buffer, max_double_length, "%.*f", precision, value);
-#endif
-            assert(len > 0 && len < max_double_length);
-
-            while (buffer[len-1] == '0') --len;
-            if (buffer[len-1] == '.') --len;
-
-            return std::copy_n(buffer, len, iterator);
-        }
-
-        /**
-         * Write double to string, removing superfluous '0' characters at
-         * the end. The decimal dot will also be removed if necessary.
-         *
-         * @param out string
-         * @param value the value that should be written
-         * @param precision max number of digits after the decimal point
-         */
-        inline void double2string(std::string& out, double value, int precision) {
-            double2string(std::back_inserter(out), value, precision);
-        }
-
-    } // namespace util
-
-} // namespace osmium
-
-#endif // OSMIUM_UTIL_DOUBLE_HPP
diff --git a/contrib/libosmium/osmium/util/endian.hpp b/contrib/libosmium/osmium/util/endian.hpp
deleted file mode 100644
index a5d9154..0000000
--- a/contrib/libosmium/osmium/util/endian.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef OSMIUM_UTIL_ENDIAN_HPP
-#define OSMIUM_UTIL_ENDIAN_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-// Windows is only available for little endian architectures
-// http://stackoverflow.com/questions/6449468/can-i-safely-assume-that-windows-installations-will-always-be-little-endian
-#if !defined(_WIN32) && !defined(__APPLE__)
-# include <endian.h>
-#else
-# define __LITTLE_ENDIAN 1234
-# define __BYTE_ORDER __LITTLE_ENDIAN
-#endif
-
-#endif // OSMIUM_UTIL_ENDIAN_HPP
diff --git a/contrib/libosmium/osmium/util/file.hpp b/contrib/libosmium/osmium/util/file.hpp
deleted file mode 100644
index 39e01af..0000000
--- a/contrib/libosmium/osmium/util/file.hpp
+++ /dev/null
@@ -1,121 +0,0 @@
-#ifndef OSMIUM_UTIL_FILE_HPP
-#define OSMIUM_UTIL_FILE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cerrno>
-#include <cstddef>
-#include <cstdio>
-#include <system_error>
-#include <sys/stat.h>
-#include <sys/types.h>
-
-#ifdef _WIN32
-# include <io.h>
-# include <windows.h>
-#endif
-
-#ifndef _MSC_VER
-# include <unistd.h>
-#else
-// https://msdn.microsoft.com/en-us/library/whx354w1.aspx
-# define ftruncate _chsize_s
-#endif
-
-#include <osmium/util/cast.hpp>
-
-namespace osmium {
-
-    namespace util {
-
-        /**
-         * Get file size.
-         * This is a small wrapper around a system call.
-         *
-         * @param fd File descriptor
-         * @returns file size
-         * @throws std::system_error If system call failed
-         */
-        inline size_t file_size(int fd) {
-#ifdef _MSC_VER
-            // Windows implementation
-            // https://msdn.microsoft.com/en-us/library/dfbc2kec.aspx
-            auto size = ::_filelengthi64(fd);
-            if (size == -1L) {
-                throw std::system_error(errno, std::system_category(), "_filelengthi64 failed");
-            }
-            return size_t(size);
-#else
-            // Unix implementation
-            struct stat s;
-            if (::fstat(fd, &s) != 0) {
-                throw std::system_error(errno, std::system_category(), "fstat failed");
-            }
-            return size_t(s.st_size);
-#endif
-        }
-
-        /**
-         * Resize file.
-         * Small wrapper around ftruncate(2) system call.
-         *
-         * @param fd File descriptor
-         * @param new_size New size
-         * @throws std::system_error If ftruncate(2) call failed
-         */
-        inline void resize_file(int fd, size_t new_size) {
-            if (::ftruncate(fd, static_cast_with_assert<off_t>(new_size)) != 0) {
-                throw std::system_error(errno, std::system_category(), "ftruncate failed");
-            }
-        }
-
-        /**
-         * Get the page size for this system.
-         */
-        inline size_t get_pagesize() {
-#ifdef _WIN32
-            // Windows implementation
-            SYSTEM_INFO si;
-            GetSystemInfo(&si);
-            return si.dwPageSize;
-#else
-            // Unix implementation
-            return size_t(::sysconf(_SC_PAGESIZE));
-#endif
-        }
-
-    } // namespace util
-
-} // namespace osmium
-
-#endif // OSMIUM_UTIL_FILE_HPP
diff --git a/contrib/libosmium/osmium/util/memory_mapping.hpp b/contrib/libosmium/osmium/util/memory_mapping.hpp
deleted file mode 100644
index d5a057d..0000000
--- a/contrib/libosmium/osmium/util/memory_mapping.hpp
+++ /dev/null
@@ -1,757 +0,0 @@
-#ifndef OSMIUM_UTIL_MEMORY_MAPPING_HPP
-#define OSMIUM_UTIL_MEMORY_MAPPING_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <cassert>
-#include <cerrno>
-#include <stdexcept>
-#include <system_error>
-
-#include <osmium/util/file.hpp>
-
-#ifndef _WIN32
-# include <sys/mman.h>
-#else
-# include <fcntl.h>
-# include <io.h>
-# include <windows.h>
-# include <sys/types.h>
-#endif
-
-namespace osmium {
-
-    namespace util {
-
-        /**
-         * Class for wrapping memory mapping system calls.
-         *
-         * Usage for anonymous mapping:
-         * @code
-         * MemoryMapping mapping(1024);          // create anonymous mapping with size
-         * auto ptr = mapping.get_addr<char*>(); // get pointer to memory
-         * mapping.unmap();                      // release mapping by calling unmap() (or at end of scope)
-         * @endcode
-         *
-         * Or for file-backed mapping:
-         * @code
-         * int fd = ::open(...);
-         * {
-         *     MemoryMapping mapping(1024, MemoryMapping::mapping_mode::write_shared, fd, offset);
-         *     // use mapping
-         * }
-         * ::close(fd);
-         * @endcode
-         *
-         * If the file backing a file-backed mapping is not large enough, it
-         * will be resized. This works, of course, only for writable files,
-         * so for read-only files you have to make sure they are large enough
-         * for any mapping you want.
-         *
-         * If you ask for a zero-sized mapping, a mapping of the systems page
-         * size will be created instead. For file-backed mapping this will only
-         * work if the file is writable.
-         *
-         * There are different implementations for Unix and Windows systems.
-         * On Unix systems this wraps the mmap(), munmap(), and the mremap()
-         * system calls. On Windows it wraps the CreateFileMapping(),
-         * CloseHandle(), MapViewOfFile(), and UnmapViewOfFile() functions.
-         *
-         * On Windows the file will be set to binary mode before the memory
-         * mapping.
-         */
-        class MemoryMapping {
-
-public:
-            enum class mapping_mode {
-                readonly      = 0,
-                write_private = 1,
-                write_shared  = 2
-            };
-
-private:
-
-            /// The size of the mapping
-            size_t m_size;
-
-            /// Offset into the file
-            off_t m_offset;
-
-            /// File handle we got the mapping from
-            int m_fd;
-
-            /// Mapping mode
-            mapping_mode m_mapping_mode;
-
-#ifdef _WIN32
-            HANDLE m_handle;
-#endif
-
-            /// The address where the memory is mapped
-            void* m_addr;
-
-            bool is_valid() const noexcept;
-
-            void make_invalid() noexcept;
-
-#ifdef _WIN32
-            typedef DWORD flag_type;
-#else
-            typedef int flag_type;
-#endif
-
-            flag_type get_protection() const noexcept;
-
-            flag_type get_flags() const noexcept;
-
-            // A zero-sized mapping is not allowed by the operating system.
-            // So if the user asks for a mapping of size 0, we map a full
-            // page instead. This way we don't have a special case in the rest
-            // of the code.
-            static size_t initial_size(size_t size) {
-                if (size == 0) {
-                    return osmium::util::get_pagesize();
-                }
-                return size;
-            }
-
-#ifdef _WIN32
-            HANDLE get_handle() const noexcept;
-            HANDLE osmium::util::MemoryMapping::create_file_mapping() const noexcept;
-            void* osmium::util::MemoryMapping::map_view_of_file() const noexcept;
-#endif
-
-            int resize_fd(int fd) {
-                // Anonymous mapping doesn't need resizing.
-                if (fd == -1) {
-                    return -1;
-                }
-
-                // Make sure the file backing this mapping is large enough.
-                if (osmium::util::file_size(fd) < m_size + m_offset) {
-                    osmium::util::resize_file(fd, m_size + m_offset);
-                }
-                return fd;
-            }
-
-        public:
-
-            /**
-             * Create memory mapping of given size.
-             *
-             * If fd is not set (or fd == -1), an anonymous mapping will be
-             * created, otherwise a mapping based on the file descriptor will
-             * be created.
-             *
-             * @pre size > 0 or mode == write_shared oder write_private
-             *
-             * @param size Size of the mapping in bytes
-             * @param mode Mapping mode: readonly, or writable (shared or private)
-             * @param fd Open file descriptor of a file we want to map
-             * @param offset Offset into the file where the mapping should start
-             * @throws std::system_error if the mapping fails
-             */
-            MemoryMapping(size_t size, mapping_mode mode, int fd=-1, off_t offset=0);
-
-            /// DEPRECATED: For backwards compatibility
-            MemoryMapping(size_t size, bool writable=true, int fd=-1, off_t offset=0) :
-                MemoryMapping(size, writable ? mapping_mode::write_shared : mapping_mode::readonly, fd, offset)  {
-            }
-
-            /// You can not copy construct a MemoryMapping.
-            MemoryMapping(const MemoryMapping&) = delete;
-
-            /// You can not copy a MemoryMapping.
-            MemoryMapping& operator=(const MemoryMapping&) = delete;
-
-            /**
-             * Move construct a mapping from another one. The other mapping
-             * will be marked as invalid.
-             */
-            MemoryMapping(MemoryMapping&& other);
-
-            /**
-             * Move a mapping. The other mapping will be marked as invalid.
-             */
-            MemoryMapping& operator=(MemoryMapping&& other);
-
-            /**
-             * Releases the mapping by calling unmap(). Will never throw.
-             * Call unmap() instead if you want to be notified of any error.
-             */
-            ~MemoryMapping() noexcept {
-                try {
-                    unmap();
-                } catch (std::system_error&) {
-                    // Ignore any exceptions because destructor must not throw.
-                }
-            }
-
-            /**
-             * Unmap a mapping. If the mapping is not valid, it will do
-             * nothing.
-             *
-             * @throws std::system_error if the unmapping fails
-             */
-            void unmap();
-
-            /**
-             * Resize a mapping to the given new size.
-             *
-             * On Linux systems this will use the mremap() function. On other
-             * systems it will unmap and remap the memory. This can only be
-             * done for file-based mappings, not anonymous mappings!
-             *
-             * @param new_size Number of bytes to resize to
-             * @throws std::system_error if the remapping fails
-             */
-            void resize(size_t new_size);
-
-            /**
-             * In a boolean context a MemoryMapping is true when it is a valid
-             * existing mapping.
-             */
-            operator bool() const noexcept {
-                return is_valid();
-            }
-
-            /**
-             * The number of bytes mapped. This is the same size you created
-             * the mapping with. The actual mapping will probably be larger
-             * because the system will round it to the page size.
-             */
-            size_t size() const noexcept {
-                return m_size;
-            }
-
-            /**
-             * The file descriptor this mapping was created from.
-             *
-             * @returns file descriptor, -1 for anonymous mappings
-             */
-            int fd() const noexcept {
-                return m_fd;
-            }
-
-            /**
-             * Was this mapping created as a writable mapping?
-             */
-            bool writable() const noexcept {
-                return m_mapping_mode != mapping_mode::readonly;
-            }
-
-            /**
-             * Get the address of the mapping as any pointer type you like.
-             *
-             * @throws std::runtime_error if the mapping is invalid
-             */
-            template <typename T = void>
-            T* get_addr() const {
-                if (is_valid()) {
-                    return reinterpret_cast<T*>(m_addr);
-                }
-                throw std::runtime_error("invalid memory mapping");
-            }
-
-        }; // class MemoryMapping
-
-        /**
-         * Anonymous memory mapping.
-         *
-         * Usage for anonymous mapping:
-         * @code
-         * AnonymousMemoryMapping mapping(1024); // create anonymous mapping with size
-         * auto ptr = mapping.get_addr<char*>(); // get pointer to memory
-         * mapping.unmap();                      // release mapping by calling unmap() (or at end of scope)
-         * @endcode
-         */
-        class AnonymousMemoryMapping : public MemoryMapping {
-
-        public:
-
-            AnonymousMemoryMapping(size_t size) :
-                MemoryMapping(size, mapping_mode::write_private) {
-            }
-
-#ifndef __linux__
-            /**
-             * On systems other than Linux anonymous mappings can not be
-             * resized!
-             */
-            void resize(size_t) = delete;
-#endif
-
-        }; // class AnonymousMemoryMapping
-
-        /**
-         * A thin wrapper around the MemoryMapping class used when all the
-         * data in the mapped memory is of the same type. Instead of thinking
-         * about the number of bytes mapped, this counts sizes in the number
-         * of objects of that type.
-         *
-         * Note that no effort is made to actually initialize the objects in
-         * this memory. This has to be done by the caller!
-         */
-        template <typename T>
-        class TypedMemoryMapping {
-
-            MemoryMapping m_mapping;
-
-        public:
-
-            /**
-             * Create anonymous typed memory mapping of given size.
-             *
-             * @param size Number of objects of type T to be mapped
-             * @throws std::system_error if the mapping fails
-             */
-            TypedMemoryMapping(size_t size) :
-                m_mapping(sizeof(T) * size, MemoryMapping::mapping_mode::write_private) {
-            }
-
-            /**
-             * Create file-backed memory mapping of given size. The file must
-             * contain at least `sizeof(T) * size` bytes!
-             *
-             * @param size Number of objects of type T to be mapped
-             * @param mode Mapping mode: readonly, or writable (shared or private)
-             * @param fd Open file descriptor of a file we want to map
-             * @param offset Offset into the file where the mapping should start
-             * @throws std::system_error if the mapping fails
-             */
-            TypedMemoryMapping(size_t size, MemoryMapping::mapping_mode mode, int fd, off_t offset = 0) :
-                m_mapping(sizeof(T) * size, mode, fd, sizeof(T) * offset) {
-            }
-
-            /// DEPRECATED: For backwards compatibility
-            TypedMemoryMapping(size_t size, bool writable, int fd, off_t offset = 0) :
-                m_mapping(sizeof(T) * size, writable ? MemoryMapping::mapping_mode::write_shared : MemoryMapping::mapping_mode::readonly, fd, sizeof(T) * offset) {
-            }
-
-            /// You can not copy construct a TypedMemoryMapping.
-            TypedMemoryMapping(const TypedMemoryMapping&) = delete;
-
-            /// You can not copy a MemoryMapping.
-            TypedMemoryMapping& operator=(const TypedMemoryMapping&) = delete;
-
-            /**
-             * Move construct a mapping from another one. The other mapping
-             * will be marked as invalid.
-             */
-            TypedMemoryMapping(TypedMemoryMapping&& other) = default;
-
-            /**
-             * Move a mapping. The other mapping will be marked as invalid.
-             */
-            TypedMemoryMapping& operator=(TypedMemoryMapping&& other) = default;
-
-            /**
-             * Releases the mapping by calling unmap(). Will never throw.
-             * Call unmap() instead if you want to be notified of any error.
-             */
-            ~TypedMemoryMapping() noexcept = default;
-
-            /**
-             * Unmap a mapping. If the mapping is not valid, it will do
-             * nothing.
-             *
-             * @throws std::system_error if the unmapping fails
-             */
-            void unmap() {
-                m_mapping.unmap();
-            }
-
-            /**
-             * Resize a mapping to the given new size.
-             *
-             * On Linux systems this will use the mremap() function. On other
-             * systems it will unmap and remap the memory. This can only be
-             * done for file-based mappings, not anonymous mappings!
-             *
-             * @param new_size Number of objects of type T to resize to
-             * @throws std::system_error if the remapping fails
-             */
-            void resize(size_t new_size) {
-                m_mapping.resize(sizeof(T) * new_size);
-            }
-
-            /**
-             * In a boolean context a TypedMemoryMapping is true when it is
-             * a valid existing mapping.
-             */
-            operator bool() const noexcept {
-                return !!m_mapping;
-            }
-
-            /**
-             * The number of objects of class T mapped. This is the same size
-             * you created the mapping with. The actual mapping will probably
-             * be larger because the system will round it to the page size.
-             */
-            size_t size() const noexcept {
-                assert(m_mapping.size() % sizeof(T) == 0);
-                return m_mapping.size() / sizeof(T);
-            }
-
-            /**
-             * The file descriptor this mapping was created from.
-             *
-             * @returns file descriptor, -1 for anonymous mappings
-             */
-            int fd() const noexcept {
-                return m_mapping.fd();
-            }
-
-            /**
-             * Was this mapping created as a writable mapping?
-             */
-            bool writable() const noexcept {
-                return m_mapping.writable();
-            }
-
-            /**
-             * Get the address of the beginning of the mapping.
-             *
-             * @throws std::runtime_error if the mapping is invalid
-             */
-            T* begin() {
-                return m_mapping.get_addr<T>();
-            }
-
-            /**
-             * Get the address one past the end of the mapping.
-             *
-             * @throws std::runtime_error if the mapping is invalid
-             */
-            T* end() {
-                return m_mapping.get_addr<T>() + size();
-            }
-
-            const T* cbegin() const {
-                return m_mapping.get_addr<T>();
-            }
-
-            const T* cend() const {
-                return m_mapping.get_addr<T>() + size();
-            }
-
-            const T* begin() const {
-                return m_mapping.get_addr<T>();
-            }
-
-            const T* end() const {
-                return m_mapping.get_addr<T>() + size();
-            }
-
-        }; // class TypedMemoryMapping
-
-        template <typename T>
-        class AnonymousTypedMemoryMapping : public TypedMemoryMapping<T> {
-
-        public:
-
-            AnonymousTypedMemoryMapping(size_t size) :
-                TypedMemoryMapping<T>(size) {
-            }
-
-#ifndef __linux__
-            /**
-             * On systems other than Linux anonymous mappings can not be
-             * resized!
-             */
-            void resize(size_t) = delete;
-#endif
-
-        }; // class AnonymousTypedMemoryMapping
-
-    } // namespace util
-
-} // namespace osmium
-
-#ifndef _WIN32
-
-// =========== Unix implementation =============
-
-// MAP_FAILED is often a macro containing an old style cast
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wold-style-cast"
-
-inline bool osmium::util::MemoryMapping::is_valid() const noexcept {
-    return m_addr != MAP_FAILED;
-}
-
-inline void osmium::util::MemoryMapping::make_invalid() noexcept {
-    m_addr = MAP_FAILED;
-}
-
-#pragma GCC diagnostic pop
-
-// for BSD systems
-#ifndef MAP_ANONYMOUS
-# define MAP_ANONYMOUS MAP_ANON
-#endif
-
-inline int osmium::util::MemoryMapping::get_protection() const noexcept {
-    if (m_mapping_mode == mapping_mode::readonly) {
-        return PROT_READ;
-    }
-    return PROT_READ | PROT_WRITE;
-}
-
-inline int osmium::util::MemoryMapping::get_flags() const noexcept {
-    if (m_fd == -1) {
-        return MAP_PRIVATE | MAP_ANONYMOUS;
-    }
-    if (m_mapping_mode == mapping_mode::write_shared) {
-        return MAP_SHARED;
-    }
-    return MAP_PRIVATE;
-}
-
-inline osmium::util::MemoryMapping::MemoryMapping(size_t size, mapping_mode mode, int fd, off_t offset) :
-    m_size(initial_size(size)),
-    m_offset(offset),
-    m_fd(resize_fd(fd)),
-    m_mapping_mode(mode),
-    m_addr(::mmap(nullptr, m_size, get_protection(), get_flags(), m_fd, m_offset)) {
-    assert(!(fd == -1 && mode == mapping_mode::readonly));
-    if (!is_valid()) {
-        throw std::system_error(errno, std::system_category(), "mmap failed");
-    }
-}
-
-inline osmium::util::MemoryMapping::MemoryMapping(MemoryMapping&& other) :
-    m_size(other.m_size),
-    m_offset(other.m_offset),
-    m_fd(other.m_fd),
-    m_mapping_mode(other.m_mapping_mode),
-    m_addr(other.m_addr) {
-    other.make_invalid();
-}
-
-inline osmium::util::MemoryMapping& osmium::util::MemoryMapping::operator=(osmium::util::MemoryMapping&& other) {
-    unmap();
-    m_size         = other.m_size;
-    m_offset       = other.m_offset;
-    m_fd           = other.m_fd;
-    m_mapping_mode = other.m_mapping_mode;
-    m_addr         = other.m_addr;
-    other.make_invalid();
-    return *this;
-}
-
-inline void osmium::util::MemoryMapping::unmap() {
-    if (is_valid()) {
-        if (::munmap(m_addr, m_size) != 0) {
-            throw std::system_error(errno, std::system_category(), "munmap failed");
-        }
-        make_invalid();
-    }
-}
-
-inline void osmium::util::MemoryMapping::resize(size_t new_size) {
-    assert(new_size > 0 && "can not resize to zero size");
-    if (m_fd == -1) { // anonymous mapping
-#ifdef __linux__
-        m_addr = ::mremap(m_addr, m_size, new_size, MREMAP_MAYMOVE);
-        if (!is_valid()) {
-            throw std::system_error(errno, std::system_category(), "mremap failed");
-        }
-        m_size = new_size;
-#else
-        assert(false && "can't resize anonymous mappings on non-linux systems");
-#endif
-    } else { // file-based mapping
-        unmap();
-        m_size = new_size;
-        resize_fd(m_fd);
-        m_addr = ::mmap(nullptr, new_size, get_protection(), get_flags(), m_fd, m_offset);
-        if (!is_valid()) {
-            throw std::system_error(errno, std::system_category(), "mmap (remap) failed");
-        }
-    }
-}
-
-#else
-
-// =========== Windows implementation =============
-
-/* References:
- * CreateFileMapping: http://msdn.microsoft.com/en-us/library/aa366537(VS.85).aspx
- * CloseHandle:       http://msdn.microsoft.com/en-us/library/ms724211(VS.85).aspx
- * MapViewOfFile:     http://msdn.microsoft.com/en-us/library/aa366761(VS.85).aspx
- * UnmapViewOfFile:   http://msdn.microsoft.com/en-us/library/aa366882(VS.85).aspx
- */
-
-namespace osmium {
-
-    namespace util {
-
-        inline DWORD dword_hi(uint64_t x) {
-            return static_cast<DWORD>(x >> 32);
-        }
-
-        inline DWORD dword_lo(uint64_t x) {
-            return static_cast<DWORD>(x & 0xffffffff);
-        }
-
-    } // namespace util
-
-} // namespace osmium
-
-inline DWORD osmium::util::MemoryMapping::get_protection() const noexcept {
-    switch (m_mapping_mode) {
-        case mapping_mode::readonly:
-            return PAGE_READONLY;
-        case mapping_mode::write_private:
-            return PAGE_WRITECOPY;
-        case mapping_mode::write_shared:
-            return PAGE_READWRITE;
-    }
-}
-
-inline DWORD osmium::util::MemoryMapping::get_flags() const noexcept {
-    switch (m_mapping_mode) {
-        case mapping_mode::readonly:
-            return FILE_MAP_READ;
-        case mapping_mode::write_private:
-            return FILE_MAP_COPY;
-        case mapping_mode::write_shared:
-            return FILE_MAP_WRITE;
-    }
-}
-
-inline HANDLE osmium::util::MemoryMapping::get_handle() const noexcept {
-    if (m_fd == -1) {
-        return INVALID_HANDLE_VALUE;
-    }
-    return reinterpret_cast<HANDLE>(_get_osfhandle(m_fd));
-}
-
-inline HANDLE osmium::util::MemoryMapping::create_file_mapping() const noexcept {
-    if (m_fd != -1) {
-        _setmode(m_fd, _O_BINARY);
-    }
-    return CreateFileMapping(get_handle(), nullptr, get_protection(), osmium::util::dword_hi(static_cast<uint64_t>(m_size) + m_offset), osmium::util::dword_lo(static_cast<uint64_t>(m_size) + m_offset), nullptr);
-}
-
-inline void* osmium::util::MemoryMapping::map_view_of_file() const noexcept {
-    return MapViewOfFile(m_handle, get_flags(), osmium::util::dword_hi(m_offset), osmium::util::dword_lo(m_offset), m_size);
-}
-
-inline bool osmium::util::MemoryMapping::is_valid() const noexcept {
-    return m_addr != nullptr;
-}
-
-inline void osmium::util::MemoryMapping::make_invalid() noexcept {
-    m_addr = nullptr;
-}
-
-inline osmium::util::MemoryMapping::MemoryMapping(size_t size, MemoryMapping::mapping_mode mode, int fd, off_t offset) :
-    m_size(initial_size(size)),
-    m_offset(offset),
-    m_fd(resize_fd(fd)),
-    m_mapping_mode(mode),
-    m_handle(create_file_mapping()),
-    m_addr(nullptr) {
-
-    if (!m_handle) {
-        throw std::system_error(GetLastError(), std::system_category(), "CreateFileMapping failed");
-    }
-
-    m_addr = map_view_of_file();
-    if (!is_valid()) {
-        throw std::system_error(GetLastError(), std::system_category(), "MapViewOfFile failed");
-    }
-}
-
-inline osmium::util::MemoryMapping::MemoryMapping(MemoryMapping&& other) :
-    m_size(other.m_size),
-    m_offset(other.m_offset),
-    m_fd(other.m_fd),
-    m_mapping_mode(other.m_mapping_mode),
-    m_handle(std::move(other.m_handle)),
-    m_addr(other.m_addr) {
-    other.make_invalid();
-    other.m_handle = nullptr;
-}
-
-inline osmium::util::MemoryMapping& osmium::util::MemoryMapping::operator=(osmium::util::MemoryMapping&& other) {
-    unmap();
-    m_size         = other.m_size;
-    m_offset       = other.m_offset;
-    m_fd           = other.m_fd;
-    m_mapping_mode = other.m_mapping_mode;
-    m_handle       = std::move(other.m_handle);
-    m_addr         = other.m_addr;
-    other.make_invalid();
-    other.m_handle = nullptr;
-    return *this;
-}
-
-inline void osmium::util::MemoryMapping::unmap() {
-    if (is_valid()) {
-        if (! UnmapViewOfFile(m_addr)) {
-            throw std::system_error(GetLastError(), std::system_category(), "UnmapViewOfFile failed");
-        }
-        make_invalid();
-    }
-
-    if (m_handle) {
-        if (! CloseHandle(m_handle)) {
-            throw std::system_error(GetLastError(), std::system_category(), "CloseHandle failed");
-        }
-        m_handle = nullptr;
-    }
-}
-
-inline void osmium::util::MemoryMapping::resize(size_t new_size) {
-    unmap();
-
-    m_size = new_size;
-    resize_fd(m_fd);
-
-    m_handle = create_file_mapping();
-    if (!m_handle) {
-        throw std::system_error(GetLastError(), std::system_category(), "CreateFileMapping failed");
-    }
-
-    m_addr = map_view_of_file();
-    if (!is_valid()) {
-        throw std::system_error(GetLastError(), std::system_category(), "MapViewOfFile failed");
-    }
-}
-
-#endif
-
-#endif // OSMIUM_UTIL_MEMORY_MAPPING_HPP
diff --git a/contrib/libosmium/osmium/util/minmax.hpp b/contrib/libosmium/osmium/util/minmax.hpp
deleted file mode 100644
index 2eb601a..0000000
--- a/contrib/libosmium/osmium/util/minmax.hpp
+++ /dev/null
@@ -1,120 +0,0 @@
-#ifndef OSMIUM_UTIL_MINMAX_HPP
-#define OSMIUM_UTIL_MINMAX_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <limits>
-
-namespace osmium {
-
-    template <typename T>
-    inline T min_op_start_value() {
-         return std::numeric_limits<T>::max();
-    }
-
-    /**
-     * Class for calculating the minimum of a bunch of values.
-     * Works with any numeric type.
-     *
-     * Usage:
-     *
-     *    min_op<int> x;
-     *    x.update(27);
-     *    x.update(12);
-     *    auto min = x.get(); // 12
-     */
-    template <typename T>
-    class min_op {
-
-        T m_value;
-
-    public:
-
-        explicit min_op(T start_value = min_op_start_value<T>()) :
-            m_value(start_value) {
-        }
-
-        void update(T value) noexcept {
-            if (value < m_value) {
-                m_value = value;
-            }
-        }
-
-        T operator()() const noexcept {
-            return m_value;
-        }
-
-    };
-
-    template <typename T>
-    inline T max_op_start_value() {
-         return std::numeric_limits<T>::min();
-    }
-
-    /**
-     * Class for calculating the maximum of a bunch of values.
-     * Works with any numeric type.
-     *
-     * Usage:
-     *
-     *    max_op<int> x;
-     *    x.update(27);
-     *    x.update(12);
-     *    auto max = x.get(); // 27
-     */
-    template <typename T>
-    class max_op {
-
-        T m_value;
-
-    public:
-
-        explicit max_op(T start_value = max_op_start_value<T>()) :
-            m_value(start_value) {
-        }
-
-        void update(T value) noexcept {
-            if (value > m_value) {
-                m_value = value;
-            }
-        }
-
-        T operator()() const noexcept {
-            return m_value;
-        }
-
-    };
-
-} // namespace osmium
-
-#endif // OSMIUM_UTIL_MINMAX_HPP
diff --git a/contrib/libosmium/osmium/util/options.hpp b/contrib/libosmium/osmium/util/options.hpp
deleted file mode 100644
index 24c0918..0000000
--- a/contrib/libosmium/osmium/util/options.hpp
+++ /dev/null
@@ -1,165 +0,0 @@
-#ifndef OSMIUM_UTIL_OPTIONS_HPP
-#define OSMIUM_UTIL_OPTIONS_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <initializer_list>
-#include <map>
-#include <string>
-#include <utility>
-
-namespace osmium {
-
-    namespace util {
-
-        /**
-         * Stores key=value type options. This class can be used stand-alone or
-         * as a base class. Options are stored and retrieved by key using the
-         * different set() and get() methods.
-         *
-         * You can iterate over all set options. Dereferencing an iterator
-         * yields a std::pair of the key and value strings.
-         */
-        class Options {
-
-            typedef std::map<std::string, std::string> option_map;
-            option_map m_options;
-
-        public:
-
-            typedef option_map::iterator iterator;
-            typedef option_map::const_iterator const_iterator;
-            typedef option_map::value_type value_type;
-
-            Options() = default;
-
-            explicit Options(const std::initializer_list<value_type>& values) :
-                m_options(values) {
-            }
-
-            Options(const Options&) = default;
-            Options& operator=(const Options&) = default;
-
-            Options(Options&&) = default;
-            Options& operator=(Options&&) = default;
-
-            ~Options() = default;
-
-            void set(const std::string& key, const std::string& value) {
-                m_options[key] = value;
-            }
-
-            void set(const std::string& key, const char* value) {
-                m_options[key] = value;
-            }
-
-            void set(const std::string& key, bool value) {
-                m_options[key] = value ? "true" : "false";
-            }
-
-            void set(std::string data) {
-                size_t pos = data.find_first_of('=');
-                if (pos == std::string::npos) {
-                    m_options[data] = "true";
-                } else {
-                    std::string value = data.substr(pos+1);
-                    data.erase(pos);
-                    set(data, value);
-                }
-            }
-
-            /**
-             * Get value of "key" option. If not set the default_value (or
-             * empty string) is returned.
-             */
-            std::string get(const std::string& key, const std::string& default_value="") const noexcept {
-                auto it = m_options.find(key);
-                if (it == m_options.end()) {
-                    return default_value;
-                }
-                return it->second;
-            }
-
-            /**
-             * Is this option set to a true value ("true" or "yes")?
-             * Will return false if the value is unset.
-             */
-            bool is_true(const std::string& key) const noexcept {
-                std::string value = get(key);
-                return (value == "true" || value == "yes");
-            }
-
-            /**
-             * Is this option not set to a false value ("false" or "no")?
-             * Will return true if the value is unset.
-             */
-            bool is_not_false(const std::string& key) const noexcept {
-                std::string value = get(key);
-                return !(value == "false" || value == "no");
-            }
-
-            size_t size() const noexcept {
-                return m_options.size();
-            }
-
-            iterator begin() noexcept {
-                return m_options.begin();
-            }
-
-            iterator end() noexcept {
-                return m_options.end();
-            }
-
-            const_iterator begin() const noexcept {
-                return m_options.cbegin();
-            }
-
-            const_iterator end() const noexcept {
-                return m_options.cend();
-            }
-
-            const_iterator cbegin() const noexcept {
-                return m_options.cbegin();
-            }
-
-            const_iterator cend() const noexcept {
-                return m_options.cend();
-            }
-
-        }; // class Options
-
-    } // namespace util
-
-} // namespace osmium
-
-#endif // OSMIUM_UTIL_OPTIONS_HPP
diff --git a/contrib/libosmium/osmium/util/string.hpp b/contrib/libosmium/osmium/util/string.hpp
deleted file mode 100644
index 55bfc6c..0000000
--- a/contrib/libosmium/osmium/util/string.hpp
+++ /dev/null
@@ -1,102 +0,0 @@
-#ifndef OSMIUM_UTIL_STRING_HPP
-#define OSMIUM_UTIL_STRING_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <string>
-#include <vector>
-#include <iostream>
-
-namespace osmium {
-
-    /**
-     * Split string on the separator character.
-     *
-     * @param str The string to be split.
-     * @param sep The separator character.
-     * @param compact Set this to true to remove empty strings from result
-     * @returns Vector with the parts of the string split up.
-     */
-    inline std::vector<std::string> split_string(const std::string& str, const char sep, bool compact = false) {
-        std::vector<std::string> tokens;
-
-        if (!str.empty()) {
-            size_t pos = 0;
-            size_t nextpos = str.find_first_of(sep);
-            while (nextpos != std::string::npos) {
-                if (!compact || (nextpos - pos != 0)) {
-                    tokens.push_back(str.substr(pos, nextpos-pos));
-                }
-                pos = nextpos + 1;
-                nextpos = str.find_first_of(sep, pos);
-            }
-            if (!compact || pos != str.size()) {
-                tokens.push_back(str.substr(pos));
-            }
-        }
-
-        return tokens;
-    }
-
-    /**
-     * Split string on the separator character(s).
-     *
-     * @param str The string to be split.
-     * @param sep The separator character(s).
-     * @param compact Set this to true to remove empty strings from result
-     * @returns Vector with the parts of the string split up.
-     */
-    inline std::vector<std::string> split_string(const std::string& str, const char* sep, bool compact = false) {
-        std::vector<std::string> tokens;
-
-        if (!str.empty()) {
-            size_t pos = 0;
-            size_t nextpos = str.find_first_of(sep);
-            while (nextpos != std::string::npos) {
-                if (!compact || (nextpos - pos != 0)) {
-                    tokens.push_back(str.substr(pos, nextpos-pos));
-                }
-                pos = nextpos + 1;
-                nextpos = str.find_first_of(sep, pos);
-            }
-            if (!compact || pos != str.size()) {
-                tokens.push_back(str.substr(pos));
-            }
-        }
-
-        return tokens;
-    }
-
-} // namespace osmium
-
-#endif // OSMIUM_UTIL_STRING_HPP
diff --git a/contrib/libosmium/osmium/util/verbose_output.hpp b/contrib/libosmium/osmium/util/verbose_output.hpp
deleted file mode 100644
index 249d67f..0000000
--- a/contrib/libosmium/osmium/util/verbose_output.hpp
+++ /dev/null
@@ -1,139 +0,0 @@
-#ifndef OSMIUM_UTIL_VERBOSE_OUTPUT_HPP
-#define OSMIUM_UTIL_VERBOSE_OUTPUT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <time.h>
-
-#include <iomanip>
-#include <iostream>
-#include <sstream>
-
-namespace osmium {
-
-    /**
-     * @brief Helpful utility classes and functions not strictly OSM related
-     */
-    namespace util {
-
-        /**
-         * Osmium programs often run for a long time because of the amount of
-         * OSM data processed. This class helps with keeping the user up to
-         * date by offering an easy way for programs to optionally output
-         * verbose information about what's going on.
-         *
-         * Use an object of this class instead of std::cerr as an output
-         * stream. Nothing is actually written if the object is not set to
-         * verbose mode. If it is set to verbose mode, each line is prepended
-         * with the running time, ie the time since the VerboseOutput object
-         * was created.
-         */
-        class VerboseOutput {
-
-            /// all time output will be relative to this start time
-            time_t m_start;
-
-            /// is verbose mode enabled?
-            bool m_verbose;
-
-            /// a newline was written, start next output with runtime
-            bool m_newline;
-
-            /**
-             * If we remember that a newline was written as the last thing
-             * write out the time elapsed and reset the newline flag.
-             */
-            void start_line() {
-                if (m_newline) {
-                    time_t elapsed = runtime();
-
-                    char old_fill = std::cerr.fill();
-                    std::cerr << '[' << std::setw(2) << (elapsed / 60) << ':' << std::setw(2) << std::setfill('0') << (elapsed % 60) << "] ";
-                    std::cerr.fill(old_fill);
-
-                    m_newline = false;
-                }
-            }
-
-        public:
-
-            explicit VerboseOutput(bool verbose = false) noexcept :
-                m_start(time(NULL)),
-                m_verbose(verbose),
-                m_newline(true) {
-            }
-
-            ~VerboseOutput() = default;
-
-            VerboseOutput(const VerboseOutput&) = default;
-            VerboseOutput& operator=(const VerboseOutput&) = default;
-            VerboseOutput(VerboseOutput&&) = default;
-            VerboseOutput& operator=(VerboseOutput&&) = default;
-
-            time_t runtime() const noexcept {
-                return time(NULL) - m_start;
-            }
-
-            /// Get "verbose" setting.
-            bool verbose() const noexcept {
-                return m_verbose;
-            }
-
-            /// Set "verbose" setting.
-            void verbose(bool verbose) noexcept {
-                m_verbose = verbose;
-            }
-
-            template<typename T>
-            friend VerboseOutput& operator<<(VerboseOutput& verbose_output, const T& value) {
-                if (verbose_output.m_verbose) {
-                    verbose_output.start_line();
-                    std::cerr << value;
-
-                    // check if there was a newline a the end and remember that
-                    std::ostringstream output_buffer;
-                    output_buffer << value;
-                    if (!output_buffer.str().empty() && output_buffer.str().back() == '\n') {
-                        verbose_output.m_newline = true;
-                    }
-                }
-                return verbose_output;
-            }
-
-        }; // class VerboseOutput
-
-    } // namespace util
-
-} // namespace osmium
-
-#endif // OSMIUM_UTIL_VERBOSE_OUTPUT_HPP
diff --git a/contrib/libosmium/osmium/visitor.hpp b/contrib/libosmium/osmium/visitor.hpp
deleted file mode 100644
index 35fcb4e..0000000
--- a/contrib/libosmium/osmium/visitor.hpp
+++ /dev/null
@@ -1,258 +0,0 @@
-#ifndef OSMIUM_VISITOR_HPP
-#define OSMIUM_VISITOR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at topf.org> and others (see README).
-
-Boost Software License - Version 1.0 - August 17th, 2003
-
-Permission is hereby granted, free of charge, to any person or organization
-obtaining a copy of the software and accompanying documentation covered by
-this license (the "Software") to use, reproduce, display, distribute,
-execute, and transmit the Software, and to prepare derivative works of the
-Software, and to permit third-parties to whom the Software is furnished to
-do so, all subject to the following:
-
-The copyright notices in the Software and this entire statement, including
-the above license grant, this restriction and the following disclaimer,
-must be included in all copies of the Software, in whole or in part, and
-all derivative works of the Software, unless such copies or derivative
-works are solely in the form of machine-executable object code generated by
-a source language processor.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
-SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
-FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-*/
-
-#include <type_traits>
-
-#include <osmium/io/reader_iterator.hpp> // IWYU pragma: keep
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm.hpp>
-#include <osmium/osm/entity.hpp>
-#include <osmium/osm/item_type.hpp>
-
-namespace osmium {
-
-    class TagList;
-    class WayNodeList;
-    class RelationMemberList;
-    class OuterRing;
-    class InnerRing;
-
-    namespace memory {
-        class Item;
-    }
-
-    namespace detail {
-
-        template <typename T, typename U>
-        using ConstIfConst = typename std::conditional<std::is_const<T>::value, typename std::add_const<U>::type, U>::type;
-
-        template <typename THandler, typename TItem>
-        inline void apply_item_recurse(TItem& item, THandler& handler) {
-            switch (item.type()) {
-                case osmium::item_type::undefined:
-                    break;
-                case osmium::item_type::node:
-                    handler.osm_object(static_cast<ConstIfConst<TItem, osmium::OSMObject>&>(item));
-                    handler.node(static_cast<ConstIfConst<TItem, osmium::Node>&>(item));
-                    break;
-                case osmium::item_type::way:
-                    handler.osm_object(static_cast<ConstIfConst<TItem, osmium::OSMObject>&>(item));
-                    handler.way(static_cast<ConstIfConst<TItem, osmium::Way>&>(item));
-                    break;
-                case osmium::item_type::relation:
-                    handler.osm_object(static_cast<ConstIfConst<TItem, osmium::OSMObject>&>(item));
-                    handler.relation(static_cast<ConstIfConst<TItem, osmium::Relation>&>(item));
-                    break;
-                case osmium::item_type::area:
-                    handler.osm_object(static_cast<ConstIfConst<TItem, osmium::OSMObject>&>(item));
-                    handler.area(static_cast<ConstIfConst<TItem, osmium::Area>&>(item));
-                    break;
-                case osmium::item_type::changeset:
-                    handler.changeset(static_cast<ConstIfConst<TItem, osmium::Changeset>&>(item));
-                    break;
-                case osmium::item_type::tag_list:
-                    handler.tag_list(static_cast<ConstIfConst<TItem, osmium::TagList>&>(item));
-                    break;
-                case osmium::item_type::way_node_list:
-                    handler.way_node_list(static_cast<ConstIfConst<TItem, osmium::WayNodeList>&>(item));
-                    break;
-                case osmium::item_type::relation_member_list:
-                case osmium::item_type::relation_member_list_with_full_members:
-                    handler.relation_member_list(static_cast<ConstIfConst<TItem, osmium::RelationMemberList>&>(item));
-                    break;
-                case osmium::item_type::outer_ring:
-                    handler.outer_ring(static_cast<ConstIfConst<TItem, osmium::OuterRing>&>(item));
-                    break;
-                case osmium::item_type::inner_ring:
-                    handler.inner_ring(static_cast<ConstIfConst<TItem, osmium::InnerRing>&>(item));
-                    break;
-                case osmium::item_type::changeset_discussion:
-                    handler.changeset_discussion(static_cast<ConstIfConst<TItem, osmium::ChangesetDiscussion>&>(item));
-                    break;
-            }
-        }
-
-        template <typename THandler>
-        inline void apply_item_recurse(const osmium::OSMEntity& item, THandler& handler) {
-            switch (item.type()) {
-                case osmium::item_type::node:
-                    handler.osm_object(static_cast<const osmium::OSMObject&>(item));
-                    handler.node(static_cast<const osmium::Node&>(item));
-                    break;
-                case osmium::item_type::way:
-                    handler.osm_object(static_cast<const osmium::OSMObject&>(item));
-                    handler.way(static_cast<const osmium::Way&>(item));
-                    break;
-                case osmium::item_type::relation:
-                    handler.osm_object(static_cast<const osmium::OSMObject&>(item));
-                    handler.relation(static_cast<const osmium::Relation&>(item));
-                    break;
-                case osmium::item_type::area:
-                    handler.osm_object(static_cast<const osmium::OSMObject&>(item));
-                    handler.area(static_cast<const osmium::Area&>(item));
-                    break;
-                case osmium::item_type::changeset:
-                    handler.changeset(static_cast<const osmium::Changeset&>(item));
-                    break;
-                default:
-                    throw osmium::unknown_type();
-            }
-        }
-
-        template <typename THandler>
-        inline void apply_item_recurse(osmium::OSMEntity& item, THandler& handler) {
-            switch (item.type()) {
-                case osmium::item_type::node:
-                    handler.osm_object(static_cast<osmium::OSMObject&>(item));
-                    handler.node(static_cast<osmium::Node&>(item));
-                    break;
-                case osmium::item_type::way:
-                    handler.osm_object(static_cast<osmium::OSMObject&>(item));
-                    handler.way(static_cast<osmium::Way&>(item));
-                    break;
-                case osmium::item_type::relation:
-                    handler.osm_object(static_cast<osmium::OSMObject&>(item));
-                    handler.relation(static_cast<osmium::Relation&>(item));
-                    break;
-                case osmium::item_type::area:
-                    handler.osm_object(static_cast<osmium::OSMObject&>(item));
-                    handler.area(static_cast<osmium::Area&>(item));
-                    break;
-                case osmium::item_type::changeset:
-                    handler.changeset(static_cast<osmium::Changeset&>(item));
-                    break;
-                default:
-                    throw osmium::unknown_type();
-            }
-        }
-
-        template <typename THandler>
-        inline void apply_item_recurse(const osmium::OSMObject& item, THandler& handler) {
-            switch (item.type()) {
-                case osmium::item_type::node:
-                    handler.osm_object(item);
-                    handler.node(static_cast<const osmium::Node&>(item));
-                    break;
-                case osmium::item_type::way:
-                    handler.osm_object(item);
-                    handler.way(static_cast<const osmium::Way&>(item));
-                    break;
-                case osmium::item_type::relation:
-                    handler.osm_object(item);
-                    handler.relation(static_cast<const osmium::Relation&>(item));
-                    break;
-                case osmium::item_type::area:
-                    handler.osm_object(item);
-                    handler.area(static_cast<const osmium::Area&>(item));
-                    break;
-                default:
-                    throw osmium::unknown_type();
-            }
-        }
-
-        template <typename THandler>
-        inline void apply_item_recurse(osmium::OSMObject& item, THandler& handler) {
-            switch (item.type()) {
-                case osmium::item_type::node:
-                    handler.osm_object(item);
-                    handler.node(static_cast<osmium::Node&>(item));
-                    break;
-                case osmium::item_type::way:
-                    handler.osm_object(item);
-                    handler.way(static_cast<osmium::Way&>(item));
-                    break;
-                case osmium::item_type::relation:
-                    handler.osm_object(item);
-                    handler.relation(static_cast<osmium::Relation&>(item));
-                    break;
-                case osmium::item_type::area:
-                    handler.osm_object(item);
-                    handler.area(static_cast<osmium::Area&>(item));
-                    break;
-                default:
-                    throw osmium::unknown_type();
-            }
-        }
-
-        template <typename THandler, typename TItem, typename... TRest>
-        inline void apply_item_recurse(TItem& item, THandler& handler, TRest&... more) {
-            apply_item_recurse(item, handler);
-            apply_item_recurse(item, more...);
-        }
-
-        template <typename THandler>
-        inline void flush_recurse(THandler& handler) {
-            handler.flush();
-        }
-
-        template <typename THandler, typename... TRest>
-        inline void flush_recurse(THandler& handler, TRest&... more) {
-            flush_recurse(handler);
-            flush_recurse(more...);
-        }
-
-    } // namespace detail
-
-    template <typename... THandlers>
-    inline void apply_item(const osmium::memory::Item& item, THandlers&... handlers) {
-        detail::apply_item_recurse(item, handlers...);
-    }
-
-    template <typename... THandlers>
-    inline void apply_item(osmium::memory::Item& item, THandlers&... handlers) {
-        detail::apply_item_recurse(item, handlers...);
-    }
-
-    template <typename TIterator, typename... THandlers>
-    inline void apply(TIterator it, TIterator end, THandlers&... handlers) {
-        for (; it != end; ++it) {
-            detail::apply_item_recurse(*it, handlers...);
-        }
-        detail::flush_recurse(handlers...);
-    }
-
-    template <typename TContainer, typename... THandlers>
-    inline void apply(TContainer& c, THandlers&... handlers) {
-        apply(std::begin(c), std::end(c), handlers...);
-    }
-
-    template <typename... THandlers>
-    inline void apply(const osmium::memory::Buffer& buffer, THandlers&... handlers) {
-        apply(buffer.cbegin(), buffer.cend(), handlers...);
-    }
-
-} // namespace osmium
-
-#endif // OSMIUM_VISITOR_HPP
diff --git a/contrib/libosmium/protozero/byteswap.hpp b/contrib/libosmium/protozero/byteswap.hpp
deleted file mode 100644
index 29c312a..0000000
--- a/contrib/libosmium/protozero/byteswap.hpp
+++ /dev/null
@@ -1,69 +0,0 @@
-#ifndef PROTOZERO_BYTESWAP_HPP
-#define PROTOZERO_BYTESWAP_HPP
-
-/*****************************************************************************
-
-protozero - Minimalistic protocol buffer decoder and encoder in C++.
-
-This file is from https://github.com/mapbox/protozero where you can find more
-documentation.
-
-*****************************************************************************/
-
-/**
- * @file byteswap.hpp
- *
- * @brief Contains functions to swap bytes in values (for different endianness).
- */
-
-#include <cstdint>
-#include <cassert>
-
-namespace protozero {
-
-/**
- * Swap N byte value between endianness formats. This template function must
- * be specialized to actually work.
- */
-template <int N>
-inline void byteswap(const char* /*data*/, char* /*result*/) {
-    static_assert(N == 1, "Can only swap 4 or 8 byte values");
-}
-
-/**
- * Swap 4 byte value (int32_t, uint32_t, float) between endianness formats.
- */
-template <>
-inline void byteswap<4>(const char* data, char* result) {
-# if defined(__GNUC__) || defined(__clang__)
-    *reinterpret_cast<uint32_t*>(result) = __builtin_bswap32(*reinterpret_cast<const uint32_t*>(data));
-# else
-    result[3] = data[0];
-    result[2] = data[1];
-    result[1] = data[2];
-    result[0] = data[3];
-#endif
-}
-
-/**
- * Swap 8 byte value (int64_t, uint64_t, double) between endianness formats.
- */
-template <>
-inline void byteswap<8>(const char* data, char* result) {
-# if defined(__GNUC__) || defined(__clang__)
-    *reinterpret_cast<uint64_t*>(result) = __builtin_bswap64(*reinterpret_cast<const uint64_t*>(data));
-# else
-    result[7] = data[0];
-    result[6] = data[1];
-    result[5] = data[2];
-    result[4] = data[3];
-    result[3] = data[4];
-    result[2] = data[5];
-    result[1] = data[6];
-    result[0] = data[7];
-#endif
-}
-
-} // end namespace protozero
-
-#endif // PROTOZERO_BYTESWAP_HPP
diff --git a/contrib/libosmium/protozero/exception.hpp b/contrib/libosmium/protozero/exception.hpp
deleted file mode 100644
index 1229f7d..0000000
--- a/contrib/libosmium/protozero/exception.hpp
+++ /dev/null
@@ -1,68 +0,0 @@
-#ifndef PROTOZERO_EXCEPTION_HPP
-#define PROTOZERO_EXCEPTION_HPP
-
-/*****************************************************************************
-
-protozero - Minimalistic protocol buffer decoder and encoder in C++.
-
-This file is from https://github.com/mapbox/protozero where you can find more
-documentation.
-
-*****************************************************************************/
-
-/**
- * @file exception.hpp
- *
- * @brief Contains the exceptions used in the protozero library.
- */
-
-#include <exception>
-
-/**
- * @brief All parts of the protozero header-only library are in this namespace.
- */
-namespace protozero {
-
-/**
- * All exceptions explicitly thrown by the functions of the protozero library
- * derive from this exception.
- */
-struct exception : std::exception {
-    /// Returns the explanatory string.
-    const char *what() const noexcept { return "pbf exception"; }
-};
-
-/**
- * This exception is thrown when parsing a varint thats larger than allowed.
- * This should never happen unless the data is corrupted.
- */
-struct varint_too_long_exception : exception {
-    /// Returns the explanatory string.
-    const char *what() const noexcept { return "varint too long exception"; }
-};
-
-/**
- * This exception is thrown when the wire type of a pdf field is unknown.
- * This should never happen unless the data is corrupted.
- */
-struct unknown_pbf_wire_type_exception : exception {
-    /// Returns the explanatory string.
-    const char *what() const noexcept { return "unknown pbf field type exception"; }
-};
-
-/**
- * This exception is thrown when we are trying to read a field and there
- * are not enough bytes left in the buffer to read it. Almost all functions
- * of the pbf_reader class can throw this exception.
- *
- * This should never happen unless the data is corrupted or you have
- * initialized the pbf_reader object with incomplete data.
- */
-struct end_of_buffer_exception : exception {
-    /// Returns the explanatory string.
-    const char *what() const noexcept { return "end of buffer exception"; }
-};
-
-} // end namespace protozero
-
-#endif // PROTOZERO_EXCEPTION_HPP
diff --git a/contrib/libosmium/protozero/pbf_builder.hpp b/contrib/libosmium/protozero/pbf_builder.hpp
deleted file mode 100644
index 063fa9c..0000000
--- a/contrib/libosmium/protozero/pbf_builder.hpp
+++ /dev/null
@@ -1,137 +0,0 @@
-#ifndef PROTOZERO_PBF_BUILDER_HPP
-#define PROTOZERO_PBF_BUILDER_HPP
-
-/*****************************************************************************
-
-protozero - Minimalistic protocol buffer decoder and encoder in C++.
-
-This file is from https://github.com/mapbox/protozero where you can find more
-documentation.
-
-*****************************************************************************/
-
-/**
- * @file pbf_builder.hpp
- *
- * @brief Contains the pbf_builder template class.
- */
-
-#include <type_traits>
-
-#include <protozero/pbf_types.hpp>
-#include <protozero/pbf_writer.hpp>
-
-namespace protozero {
-
-/**
- * The pbf_builder is used to write PBF formatted messages into a buffer. It
- * is based on the pbf_writer class and has all the same methods. The
- * difference is that whereever the pbf_writer class takes an integer tag,
- * this template class takes a tag of the template type T.
- *
- * Almost all methods in this class can throw an std::bad_alloc exception if
- * the std::string used as a buffer wants to resize.
- *
- * Read the tutorial to understand how this class is used.
- */
-template <typename T>
-class pbf_builder : public pbf_writer {
-
-    static_assert(std::is_same<pbf_tag_type, typename std::underlying_type<T>::type>::value,
-                  "T must be enum with underlying type protozero::pbf_tag_type");
-
-public:
-
-    using enum_type = T;
-
-    pbf_builder(std::string& data) noexcept :
-        pbf_writer(data) {
-    }
-
-    template <typename P>
-    pbf_builder(pbf_writer& parent_writer, P tag) noexcept :
-        pbf_writer(parent_writer, pbf_tag_type(tag)) {
-    }
-
-/// @cond INTERNAL
-#define PROTOZERO_WRITER_WRAP_ADD_SCALAR(name, type) \
-    inline void add_##name(T tag, type value) { \
-        pbf_writer::add_##name(pbf_tag_type(tag), value); \
-    }
-
-    PROTOZERO_WRITER_WRAP_ADD_SCALAR(bool, bool)
-    PROTOZERO_WRITER_WRAP_ADD_SCALAR(enum, int32_t)
-    PROTOZERO_WRITER_WRAP_ADD_SCALAR(int32, int32_t)
-    PROTOZERO_WRITER_WRAP_ADD_SCALAR(sint32, int32_t)
-    PROTOZERO_WRITER_WRAP_ADD_SCALAR(uint32, uint32_t)
-    PROTOZERO_WRITER_WRAP_ADD_SCALAR(int64, int64_t)
-    PROTOZERO_WRITER_WRAP_ADD_SCALAR(sint64, int64_t)
-    PROTOZERO_WRITER_WRAP_ADD_SCALAR(uint64, uint64_t)
-    PROTOZERO_WRITER_WRAP_ADD_SCALAR(fixed32, uint32_t)
-    PROTOZERO_WRITER_WRAP_ADD_SCALAR(sfixed32, int32_t)
-    PROTOZERO_WRITER_WRAP_ADD_SCALAR(fixed64, uint64_t)
-    PROTOZERO_WRITER_WRAP_ADD_SCALAR(sfixed64, int64_t)
-    PROTOZERO_WRITER_WRAP_ADD_SCALAR(float, float)
-    PROTOZERO_WRITER_WRAP_ADD_SCALAR(double, double)
-
-#undef PROTOZERO_WRITER_WRAP_ADD_SCALAR
-/// @endcond
-
-    inline void add_bytes(T tag, const char* value, size_t size) {
-        pbf_writer::add_bytes(pbf_tag_type(tag), value, size);
-    }
-
-    inline void add_bytes(T tag, const std::string& value) {
-        pbf_writer::add_bytes(pbf_tag_type(tag), value);
-    }
-
-    inline void add_string(T tag, const char* value, size_t size) {
-        pbf_writer::add_string(pbf_tag_type(tag), value, size);
-    }
-
-    inline void add_string(T tag, const std::string& value) {
-        pbf_writer::add_string(pbf_tag_type(tag), value);
-    }
-
-    inline void add_string(T tag, const char* value) {
-        pbf_writer::add_string(pbf_tag_type(tag), value);
-    }
-
-    inline void add_message(T tag, const char* value, size_t size) {
-        pbf_writer::add_message(pbf_tag_type(tag), value, size);
-    }
-
-    inline void add_message(T tag, const std::string& value) {
-        pbf_writer::add_message(pbf_tag_type(tag), value);
-    }
-
-/// @cond INTERNAL
-#define PROTOZERO_WRITER_WRAP_ADD_PACKED(name) \
-    template <typename InputIterator> \
-    inline void add_packed_##name(T tag, InputIterator first, InputIterator last) { \
-        pbf_writer::add_packed_##name(pbf_tag_type(tag), first, last); \
-    }
-
-    PROTOZERO_WRITER_WRAP_ADD_PACKED(bool)
-    PROTOZERO_WRITER_WRAP_ADD_PACKED(enum)
-    PROTOZERO_WRITER_WRAP_ADD_PACKED(int32)
-    PROTOZERO_WRITER_WRAP_ADD_PACKED(sint32)
-    PROTOZERO_WRITER_WRAP_ADD_PACKED(uint32)
-    PROTOZERO_WRITER_WRAP_ADD_PACKED(int64)
-    PROTOZERO_WRITER_WRAP_ADD_PACKED(sint64)
-    PROTOZERO_WRITER_WRAP_ADD_PACKED(uint64)
-    PROTOZERO_WRITER_WRAP_ADD_PACKED(fixed32)
-    PROTOZERO_WRITER_WRAP_ADD_PACKED(sfixed32)
-    PROTOZERO_WRITER_WRAP_ADD_PACKED(fixed64)
-    PROTOZERO_WRITER_WRAP_ADD_PACKED(sfixed64)
-    PROTOZERO_WRITER_WRAP_ADD_PACKED(float)
-    PROTOZERO_WRITER_WRAP_ADD_PACKED(double)
-
-#undef PROTOZERO_WRITER_WRAP_ADD_PACKED
-/// @endcond
-
-};
-
-} // end namespace protozero
-
-#endif // PROTOZERO_PBF_BUILDER_HPP
diff --git a/contrib/libosmium/protozero/pbf_message.hpp b/contrib/libosmium/protozero/pbf_message.hpp
deleted file mode 100644
index 7fef06f..0000000
--- a/contrib/libosmium/protozero/pbf_message.hpp
+++ /dev/null
@@ -1,94 +0,0 @@
-#ifndef PROTOZERO_PBF_MESSAGE_HPP
-#define PROTOZERO_PBF_MESSAGE_HPP
-
-/*****************************************************************************
-
-protozero - Minimalistic protocol buffer decoder and encoder in C++.
-
-This file is from https://github.com/mapbox/protozero where you can find more
-documentation.
-
-*****************************************************************************/
-
-/**
- * @file pbf_message.hpp
- *
- * @brief Contains the pbf_message class.
- */
-
-#include <type_traits>
-
-#include <protozero/pbf_reader.hpp>
-#include <protozero/pbf_types.hpp>
-
-namespace protozero {
-
-/**
- * This class represents a protobuf message. Either a top-level message or
- * a nested sub-message. Top-level messages can be created from any buffer
- * with a pointer and length:
- *
- * @code
- *    enum class Message : protozero::pbf_tag_type {
- *       ...
- *    };
- *
- *    std::string buffer;
- *    // fill buffer...
- *    pbf_message<Message> message(buffer.data(), buffer.size());
- * @endcode
- *
- * Sub-messages are created using get_message():
- *
- * @code
- *    enum class SubMessage : protozero::pbf_tag_type {
- *       ...
- *    };
- *
- *    pbf_message<Message> message(...);
- *    message.next();
- *    pbf_message<SubMessage> submessage = message.get_message();
- * @endcode
- *
- * All methods of the pbf_message class except get_bytes() and get_string()
- * provide the strong exception guarantee, ie they either succeed or do not
- * change the pbf_message object they are called on. Use the get_data() method
- * instead of get_bytes() or get_string(), if you need this guarantee.
- *
- * This template class is based on the pbf_reader class and has all the same
- * methods. The difference is that whereever the pbf_reader class takes an
- * integer tag, this template class takes a tag of the template type T.
- *
- * Read the tutorial to understand how this class is used.
- */
-template <typename T>
-class pbf_message : public pbf_reader {
-
-    static_assert(std::is_same<pbf_tag_type, typename std::underlying_type<T>::type>::value, "T must be enum with underlying type protozero::pbf_tag_type");
-
-public:
-
-    using enum_type = T;
-
-    template <typename... Args>
-    pbf_message(Args&&... args) noexcept :
-        pbf_reader(std::forward<Args>(args)...) {
-    }
-
-    inline bool next() {
-        return pbf_reader::next();
-    }
-
-    inline bool next(T tag) {
-        return pbf_reader::next(pbf_tag_type(tag));
-    }
-
-    inline T tag() const noexcept {
-        return T(pbf_reader::tag());
-    }
-
-};
-
-} // end namespace protozero
-
-#endif // PROTOZERO_PBF_MESSAGE_HPP
diff --git a/contrib/libosmium/protozero/pbf_reader.hpp b/contrib/libosmium/protozero/pbf_reader.hpp
deleted file mode 100644
index ac3220c..0000000
--- a/contrib/libosmium/protozero/pbf_reader.hpp
+++ /dev/null
@@ -1,1067 +0,0 @@
-#ifndef PROTOZERO_PBF_READER_HPP
-#define PROTOZERO_PBF_READER_HPP
-
-/*****************************************************************************
-
-protozero - Minimalistic protocol buffer decoder and encoder in C++.
-
-This file is from https://github.com/mapbox/protozero where you can find more
-documentation.
-
-*****************************************************************************/
-
-/**
- * @file pbf_reader.hpp
- *
- * @brief Contains the pbf_reader class.
- */
-
-#include <cassert>
-#include <cstddef>
-#include <cstdint>
-#include <cstring>
-#include <iterator>
-#include <string>
-#include <utility>
-
-#include <protozero/pbf_types.hpp>
-#include <protozero/exception.hpp>
-#include <protozero/varint.hpp>
-
-#if __BYTE_ORDER != __LITTLE_ENDIAN
-# include <protozero/byteswap.hpp>
-#endif
-
-/// Wrapper for assert() used for testing
-#ifndef protozero_assert
-# define protozero_assert(x) assert(x)
-#endif
-
-namespace protozero {
-
-/**
- * This class represents a protobuf message. Either a top-level message or
- * a nested sub-message. Top-level messages can be created from any buffer
- * with a pointer and length:
- *
- * @code
- *    std::string buffer;
- *    // fill buffer...
- *    pbf_reader message(buffer.data(), buffer.size());
- * @endcode
- *
- * Sub-messages are created using get_message():
- *
- * @code
- *    pbf_reader message(...);
- *    message.next();
- *    pbf_reader submessage = message.get_message();
- * @endcode
- *
- * All methods of the pbf_reader class except get_bytes() and get_string()
- * provide the strong exception guarantee, ie they either succeed or do not
- * change the pbf_reader object they are called on. Use the get_data() method
- * instead of get_bytes() or get_string(), if you need this guarantee.
- */
-class pbf_reader {
-
-    // A pointer to the next unread data.
-    const char *m_data = nullptr;
-
-    // A pointer to one past the end of data.
-    const char *m_end = nullptr;
-
-    // The wire type of the current field.
-    pbf_wire_type m_wire_type = pbf_wire_type::unknown;
-
-    // The tag of the current field.
-    pbf_tag_type m_tag = 0;
-
-    template <typename T>
-    inline T get_fixed() {
-        T result;
-        skip_bytes(sizeof(T));
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-        memcpy(&result, m_data - sizeof(T), sizeof(T));
-#else
-        byteswap<sizeof(T)>(m_data - sizeof(T), reinterpret_cast<char*>(&result));
-#endif
-        return result;
-    }
-
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-    template <typename T>
-    inline std::pair<const T*, const T*> packed_fixed() {
-        protozero_assert(tag() != 0 && "call next() before accessing field value");
-        auto len = get_len_and_skip();
-        protozero_assert(len % sizeof(T) == 0);
-        return std::make_pair(reinterpret_cast<const T*>(m_data-len), reinterpret_cast<const T*>(m_data));
-    }
-
-#else
-
-    template <typename T>
-    class const_fixed_iterator : public std::iterator<std::forward_iterator_tag, T> {
-
-        const char* m_data;
-        const char* m_end;
-
-    public:
-
-        const_fixed_iterator() noexcept :
-            m_data(nullptr),
-            m_end(nullptr) {
-        }
-
-        const_fixed_iterator(const char *data, const char* end) noexcept :
-            m_data(data),
-            m_end(end) {
-        }
-
-        const_fixed_iterator(const const_fixed_iterator&) noexcept = default;
-        const_fixed_iterator(const_fixed_iterator&&) noexcept = default;
-
-        const_fixed_iterator& operator=(const const_fixed_iterator&) noexcept = default;
-        const_fixed_iterator& operator=(const_fixed_iterator&&) noexcept = default;
-
-        ~const_fixed_iterator() noexcept = default;
-
-        T operator*() {
-            T result;
-            byteswap<sizeof(T)>(m_data, reinterpret_cast<char*>(&result));
-            return result;
-        }
-
-        const_fixed_iterator& operator++() {
-            m_data += sizeof(T);
-            return *this;
-        }
-
-        const_fixed_iterator operator++(int) {
-            const const_fixed_iterator tmp(*this);
-            ++(*this);
-            return tmp;
-        }
-
-        bool operator==(const const_fixed_iterator& rhs) const noexcept {
-            return m_data == rhs.m_data && m_end == rhs.m_end;
-        }
-
-        bool operator!=(const const_fixed_iterator& rhs) const noexcept {
-            return !(*this == rhs);
-        }
-
-    }; // class const_fixed_iterator
-
-    template <typename T>
-    inline std::pair<const_fixed_iterator<T>, const_fixed_iterator<T>> packed_fixed() {
-        protozero_assert(tag() != 0 && "call next() before accessing field value");
-        auto len = get_len_and_skip();
-        protozero_assert(len % sizeof(T) == 0);
-        return std::make_pair(const_fixed_iterator<T>(m_data-len, m_data),
-                              const_fixed_iterator<T>(m_data, m_data));
-    }
-#endif
-
-    template <typename T> inline T get_varint();
-    template <typename T> inline T get_svarint();
-
-    inline pbf_length_type get_length() { return get_varint<pbf_length_type>(); }
-
-    inline void skip_bytes(pbf_length_type len);
-
-    inline pbf_length_type get_len_and_skip();
-
-public:
-
-    /**
-     * Construct a pbf_reader message from a data pointer and a length. The pointer
-     * will be stored inside the pbf_reader object, no data is copied. So you must
-     * make sure the buffer stays valid as long as the pbf_reader object is used.
-     *
-     * The buffer must contain a complete protobuf message.
-     *
-     * @post There is no current field.
-     */
-    inline pbf_reader(const char *data, size_t length) noexcept;
-
-    /**
-     * Construct a pbf_reader message from a data pointer and a length. The pointer
-     * will be stored inside the pbf_reader object, no data is copied. So you must
-     * make sure the buffer stays valid as long as the pbf_reader object is used.
-     *
-     * The buffer must contain a complete protobuf message.
-     *
-     * @post There is no current field.
-     */
-    inline pbf_reader(std::pair<const char *, size_t> data) noexcept;
-
-    /**
-     * Construct a pbf_reader message from a std::string. A pointer to the string
-     * internals will be stored inside the pbf_reader object, no data is copied.
-     * So you must make sure the string is unchanged as long as the pbf_reader
-     * object is used.
-     *
-     * The string must contain a complete protobuf message.
-     *
-     * @post There is no current field.
-     */
-    inline pbf_reader(const std::string& data) noexcept;
-
-    /**
-     * pbf_reader can be default constructed and behaves like it has an empty
-     * buffer.
-     */
-    inline pbf_reader() noexcept = default;
-
-    /// pbf_reader messages can be copied trivially.
-    inline pbf_reader(const pbf_reader&) noexcept = default;
-
-    /// pbf_reader messages can be moved trivially.
-    inline pbf_reader(pbf_reader&&) noexcept = default;
-
-    /// pbf_reader messages can be copied trivially.
-    inline pbf_reader& operator=(const pbf_reader& other) noexcept = default;
-
-    /// pbf_reader messages can be moved trivially.
-    inline pbf_reader& operator=(pbf_reader&& other) noexcept = default;
-
-    inline ~pbf_reader() = default;
-
-    /**
-     * In a boolean context the pbf_reader class evaluates to `true` if there are
-     * still fields available and to `false` if the last field has been read.
-     */
-    inline operator bool() const noexcept;
-
-    /**
-     * Return the length in bytes of the current message. If you have
-     * already called next() and/or any of the get_*() functions, this will
-     * return the remaining length.
-     *
-     * This can, for instance, be used to estimate the space needed for a
-     * buffer. Of course you have to know reasonably well what data to expect
-     * and how it is encoded for this number to have any meaning.
-     */
-    size_t length() const noexcept {
-        return size_t(m_end - m_data);
-    }
-
-    /**
-     * Set next field in the message as the current field. This is usually
-     * called in a while loop:
-     *
-     * @code
-     *    pbf_reader message(...);
-     *    while (message.next()) {
-     *        // handle field
-     *    }
-     * @endcode
-     *
-     * @returns `true` if there is a next field, `false` if not.
-     * @pre There must be no current field.
-     * @post If it returns `true` there is a current field now.
-     */
-    inline bool next();
-
-    /**
-     * Set next field with given tag in the message as the current field.
-     * Fields with other tags are skipped. This is usually called in a while
-     * loop for repeated fields:
-     *
-     * @code
-     *    pbf_reader message(...);
-     *    while (message.next(17)) {
-     *        // handle field
-     *    }
-     * @endcode
-     *
-     * or you can call it just once to get the one field with this tag:
-     *
-     * @code
-     *    pbf_reader message(...);
-     *    if (message.next(17)) {
-     *        // handle field
-     *    }
-     * @endcode
-     *
-     * @returns `true` if there is a next field with this tag.
-     * @pre There must be no current field.
-     * @post If it returns `true` there is a current field now with the given tag.
-     */
-    inline bool next(pbf_tag_type tag);
-
-    /**
-     * The tag of the current field. The tag is the field number from the
-     * description in the .proto file.
-     *
-     * Call next() before calling this function to set the current field.
-     *
-     * @returns tag of the current field.
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     */
-    inline pbf_tag_type tag() const noexcept;
-
-    /**
-     * Get the wire type of the current field. The wire types are:
-     *
-     * * 0 - varint
-     * * 1 - 64 bit
-     * * 2 - length-delimited
-     * * 5 - 32 bit
-     *
-     * All other types are illegal.
-     *
-     * Call next() before calling this function to set the current field.
-     *
-     * @returns wire type of the current field.
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     */
-    inline pbf_wire_type wire_type() const noexcept;
-
-    /**
-     * Check the wire type of the current field.
-     *
-     * @returns `true` if the current field has the given wire type.
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     */
-    inline bool has_wire_type(pbf_wire_type type) const noexcept;
-
-    /**
-     * Consume the current field.
-     *
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline void skip();
-
-    ///@{
-    /**
-     * @name Scalar field accessor functions
-     */
-
-    /**
-     * Consume and return value of current "bool" field.
-     *
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "bool".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline bool get_bool();
-
-    /**
-     * Consume and return value of current "enum" field.
-     *
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "enum".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline int32_t get_enum() {
-        protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint");
-        return get_varint<int32_t>();
-    }
-
-    /**
-     * Consume and return value of current "int32" varint field.
-     *
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "int32".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline int32_t get_int32() {
-        protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint");
-        return get_varint<int32_t>();
-    }
-
-    /**
-     * Consume and return value of current "sint32" varint field.
-     *
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "sint32".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline int32_t get_sint32() {
-        protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint");
-        return get_svarint<int32_t>();
-    }
-
-    /**
-     * Consume and return value of current "uint32" varint field.
-     *
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "uint32".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline uint32_t get_uint32() {
-        protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint");
-        return get_varint<uint32_t>();
-    }
-
-    /**
-     * Consume and return value of current "int64" varint field.
-     *
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "int64".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline int64_t get_int64() {
-        protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint");
-        return get_varint<int64_t>();
-    }
-
-    /**
-     * Consume and return value of current "sint64" varint field.
-     *
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "sint64".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline int64_t get_sint64() {
-        protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint");
-        return get_svarint<int64_t>();
-    }
-
-    /**
-     * Consume and return value of current "uint64" varint field.
-     *
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "uint64".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline uint64_t get_uint64() {
-        protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint");
-        return get_varint<uint64_t>();
-    }
-
-    /**
-     * Consume and return value of current "fixed32" field.
-     *
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "fixed32".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline uint32_t get_fixed32();
-
-    /**
-     * Consume and return value of current "sfixed32" field.
-     *
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "sfixed32".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline int32_t get_sfixed32();
-
-    /**
-     * Consume and return value of current "fixed64" field.
-     *
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "fixed64".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline uint64_t get_fixed64();
-
-    /**
-     * Consume and return value of current "sfixed64" field.
-     *
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "sfixed64".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline int64_t get_sfixed64();
-
-    /**
-     * Consume and return value of current "float" field.
-     *
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "float".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline float get_float();
-
-    /**
-     * Consume and return value of current "double" field.
-     *
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "double".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline double get_double();
-
-    /**
-     * Consume and return value of current "bytes" or "string" field.
-     *
-     * @returns A pair with a pointer to the data and the length of the data.
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "bytes" or "string".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline std::pair<const char*, pbf_length_type> get_data();
-
-    /**
-     * Consume and return value of current "bytes" field.
-     *
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "bytes".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline std::string get_bytes();
-
-    /**
-     * Consume and return value of current "string" field.
-     *
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "string".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline std::string get_string();
-
-    /**
-     * Consume and return value of current "message" field.
-     *
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "message".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline pbf_reader get_message() {
-        return pbf_reader(get_data());
-    }
-
-    ///@}
-
-private:
-
-    template <typename T>
-    class const_varint_iterator : public std::iterator<std::forward_iterator_tag, T> {
-
-    protected:
-
-        const char* m_data;
-        const char* m_end;
-
-    public:
-
-        const_varint_iterator() noexcept :
-            m_data(nullptr),
-            m_end(nullptr) {
-        }
-
-        const_varint_iterator(const char *data, const char* end) noexcept :
-            m_data(data),
-            m_end(end) {
-        }
-
-        const_varint_iterator(const const_varint_iterator&) noexcept = default;
-        const_varint_iterator(const_varint_iterator&&) noexcept = default;
-
-        const_varint_iterator& operator=(const const_varint_iterator&) noexcept = default;
-        const_varint_iterator& operator=(const_varint_iterator&&) noexcept = default;
-
-        ~const_varint_iterator() noexcept = default;
-
-        T operator*() {
-            const char* d = m_data; // will be thrown away
-            return static_cast<T>(decode_varint(&d, m_end));
-        }
-
-        const_varint_iterator& operator++() {
-            // Ignore the result, we call decode_varint() just for the
-            // side-effect of updating m_data.
-            decode_varint(&m_data, m_end);
-            return *this;
-        }
-
-        const_varint_iterator operator++(int) {
-            const const_varint_iterator tmp(*this);
-            ++(*this);
-            return tmp;
-        }
-
-        bool operator==(const const_varint_iterator& rhs) const noexcept {
-            return m_data == rhs.m_data && m_end == rhs.m_end;
-        }
-
-        bool operator!=(const const_varint_iterator& rhs) const noexcept {
-            return !(*this == rhs);
-        }
-
-    }; // class const_varint_iterator
-
-    template <typename T>
-    class const_svarint_iterator : public const_varint_iterator<T> {
-
-    public:
-
-        const_svarint_iterator() noexcept :
-            const_varint_iterator<T>() {
-        }
-
-        const_svarint_iterator(const char *data, const char* end) noexcept :
-            const_varint_iterator<T>(data, end) {
-        }
-
-        const_svarint_iterator(const const_svarint_iterator&) = default;
-        const_svarint_iterator(const_svarint_iterator&&) = default;
-
-        const_svarint_iterator& operator=(const const_svarint_iterator&) = default;
-        const_svarint_iterator& operator=(const_svarint_iterator&&) = default;
-
-        ~const_svarint_iterator() = default;
-
-        T operator*() {
-            const char* d = this->m_data; // will be thrown away
-            return static_cast<T>(decode_zigzag64(decode_varint(&d, this->m_end)));
-        }
-
-        const_svarint_iterator& operator++() {
-            // Ignore the result, we call decode_varint() just for the
-            // side-effect of updating m_data.
-            decode_varint(&this->m_data, this->m_end);
-            return *this;
-        }
-
-        const_svarint_iterator operator++(int) {
-            const const_svarint_iterator tmp(*this);
-            ++(*this);
-            return tmp;
-        }
-
-    }; // class const_svarint_iterator
-
-public:
-
-    /// Forward iterator for iterating over bool (int32 varint) values.
-    typedef const_varint_iterator< int32_t> const_bool_iterator;
-
-    /// Forward iterator for iterating over enum (int32 varint) values.
-    typedef const_varint_iterator< int32_t> const_enum_iterator;
-
-    /// Forward iterator for iterating over int32 (varint) values.
-    typedef const_varint_iterator< int32_t> const_int32_iterator;
-
-    /// Forward iterator for iterating over sint32 (varint) values.
-    typedef const_svarint_iterator<int32_t> const_sint32_iterator;
-
-    /// Forward iterator for iterating over uint32 (varint) values.
-    typedef const_varint_iterator<uint32_t> const_uint32_iterator;
-
-    /// Forward iterator for iterating over int64 (varint) values.
-    typedef const_varint_iterator< int64_t> const_int64_iterator;
-
-    /// Forward iterator for iterating over sint64 (varint) values.
-    typedef const_svarint_iterator<int64_t> const_sint64_iterator;
-
-    /// Forward iterator for iterating over uint64 (varint) values.
-    typedef const_varint_iterator<uint64_t> const_uint64_iterator;
-
-    ///@{
-    /**
-     * @name Repeated packed field accessor functions
-     */
-
-    /**
-     * Consume current "repeated packed bool" field.
-     *
-     * @returns a pair of iterators to the beginning and one past the end of
-     *          the data.
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "repeated packed bool".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline std::pair<pbf_reader::const_bool_iterator, pbf_reader::const_bool_iterator> get_packed_bool();
-
-    /**
-     * Consume current "repeated packed enum" field.
-     *
-     * @returns a pair of iterators to the beginning and one past the end of
-     *          the data.
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "repeated packed enum".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline std::pair<pbf_reader::const_enum_iterator, pbf_reader::const_enum_iterator> get_packed_enum();
-
-    /**
-     * Consume current "repeated packed int32" field.
-     *
-     * @returns a pair of iterators to the beginning and one past the end of
-     *          the data.
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "repeated packed int32".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline std::pair<pbf_reader::const_int32_iterator, pbf_reader::const_int32_iterator> get_packed_int32();
-
-    /**
-     * Consume current "repeated packed sint32" field.
-     *
-     * @returns a pair of iterators to the beginning and one past the end of
-     *          the data.
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "repeated packed sint32".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline std::pair<pbf_reader::const_sint32_iterator, pbf_reader::const_sint32_iterator> get_packed_sint32();
-
-    /**
-     * Consume current "repeated packed uint32" field.
-     *
-     * @returns a pair of iterators to the beginning and one past the end of
-     *          the data.
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "repeated packed uint32".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline std::pair<pbf_reader::const_uint32_iterator, pbf_reader::const_uint32_iterator> get_packed_uint32();
-
-    /**
-     * Consume current "repeated packed int64" field.
-     *
-     * @returns a pair of iterators to the beginning and one past the end of
-     *          the data.
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "repeated packed int64".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline std::pair<pbf_reader::const_int64_iterator, pbf_reader::const_int64_iterator> get_packed_int64();
-
-    /**
-     * Consume current "repeated packed sint64" field.
-     *
-     * @returns a pair of iterators to the beginning and one past the end of
-     *          the data.
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "repeated packed sint64".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline std::pair<pbf_reader::const_sint64_iterator, pbf_reader::const_sint64_iterator> get_packed_sint64();
-
-    /**
-     * Consume current "repeated packed uint64" field.
-     *
-     * @returns a pair of iterators to the beginning and one past the end of
-     *          the data.
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "repeated packed uint64".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline std::pair<pbf_reader::const_uint64_iterator, pbf_reader::const_uint64_iterator> get_packed_uint64();
-
-    /**
-     * Consume current "repeated packed fixed32" field.
-     *
-     * @returns a pair of iterators to the beginning and one past the end of
-     *          the data.
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "repeated packed fixed32".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline auto get_packed_fixed32() -> decltype(packed_fixed<uint32_t>()) {
-        return packed_fixed<uint32_t>();
-    }
-
-    /**
-     * Consume current "repeated packed sfixed32" field.
-     *
-     * @returns a pair of iterators to the beginning and one past the end of
-     *          the data.
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "repeated packed sfixed32".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline auto get_packed_sfixed32() -> decltype(packed_fixed<int32_t>()) {
-        return packed_fixed<int32_t>();
-    }
-
-    /**
-     * Consume current "repeated packed fixed64" field.
-     *
-     * @returns a pair of iterators to the beginning and one past the end of
-     *          the data.
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "repeated packed fixed64".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline auto get_packed_fixed64() -> decltype(packed_fixed<uint64_t>()) {
-        return packed_fixed<uint64_t>();
-    }
-
-    /**
-     * Consume current "repeated packed sfixed64" field.
-     *
-     * @returns a pair of iterators to the beginning and one past the end of
-     *          the data.
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "repeated packed sfixed64".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline auto get_packed_sfixed64() -> decltype(packed_fixed<int64_t>()) {
-        return packed_fixed<int64_t>();
-    }
-
-    /**
-     * Consume current "repeated packed float" field.
-     *
-     * @returns a pair of iterators to the beginning and one past the end of
-     *          the data.
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "repeated packed float".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline auto get_packed_float() -> decltype(packed_fixed<float>()) {
-        return packed_fixed<float>();
-    }
-
-    /**
-     * Consume current "repeated packed double" field.
-     *
-     * @returns a pair of iterators to the beginning and one past the end of
-     *          the data.
-     * @pre There must be a current field (ie. next() must have returned `true`).
-     * @pre The current field must be of type "repeated packed double".
-     * @post The current field was consumed and there is no current field now.
-     */
-    inline auto get_packed_double() -> decltype(packed_fixed<double>()) {
-        return packed_fixed<double>();
-    }
-
-    ///@}
-
-}; // class pbf_reader
-
-pbf_reader::pbf_reader(const char *data, size_t length) noexcept
-    : m_data(data),
-      m_end(data + length),
-      m_wire_type(pbf_wire_type::unknown),
-      m_tag(0) {
-}
-
-pbf_reader::pbf_reader(std::pair<const char *, size_t> data) noexcept
-    : m_data(data.first),
-      m_end(data.first + data.second),
-      m_wire_type(pbf_wire_type::unknown),
-      m_tag(0) {
-}
-
-pbf_reader::pbf_reader(const std::string& data) noexcept
-    : m_data(data.data()),
-      m_end(data.data() + data.size()),
-      m_wire_type(pbf_wire_type::unknown),
-      m_tag(0) {
-}
-
-pbf_reader::operator bool() const noexcept {
-    return m_data < m_end;
-}
-
-bool pbf_reader::next() {
-    if (m_data == m_end) {
-        return false;
-    }
-
-    auto value = get_varint<uint32_t>();
-    m_tag = value >> 3;
-
-    // tags 0 and 19000 to 19999 are not allowed as per
-    // https://developers.google.com/protocol-buffers/docs/proto
-    protozero_assert(((m_tag > 0 && m_tag < 19000) || (m_tag > 19999 && m_tag <= ((1 << 29) - 1))) && "tag out of range");
-
-    m_wire_type = pbf_wire_type(value & 0x07);
-    switch (m_wire_type) {
-        case pbf_wire_type::varint:
-        case pbf_wire_type::fixed64:
-        case pbf_wire_type::length_delimited:
-        case pbf_wire_type::fixed32:
-            break;
-        default:
-            throw unknown_pbf_wire_type_exception();
-    }
-
-    return true;
-}
-
-bool pbf_reader::next(pbf_tag_type requested_tag) {
-    while (next()) {
-        if (m_tag == requested_tag) {
-            return true;
-        } else {
-            skip();
-        }
-    }
-    return false;
-}
-
-pbf_tag_type pbf_reader::tag() const noexcept {
-    return m_tag;
-}
-
-pbf_wire_type pbf_reader::wire_type() const noexcept {
-    return m_wire_type;
-}
-
-bool pbf_reader::has_wire_type(pbf_wire_type type) const noexcept {
-    return wire_type() == type;
-}
-
-void pbf_reader::skip_bytes(pbf_length_type len) {
-    if (m_data + len > m_end) {
-        throw end_of_buffer_exception();
-    }
-    m_data += len;
-
-// In debug builds reset the tag to zero so that we can detect (some)
-// wrong code.
-#ifndef NDEBUG
-    m_tag = 0;
-#endif
-}
-
-void pbf_reader::skip() {
-    protozero_assert(tag() != 0 && "call next() before calling skip()");
-    switch (wire_type()) {
-        case pbf_wire_type::varint:
-            (void)get_uint32(); // called for the side-effect of skipping value
-            break;
-        case pbf_wire_type::fixed64:
-            skip_bytes(8);
-            break;
-        case pbf_wire_type::length_delimited:
-            skip_bytes(get_length());
-            break;
-        case pbf_wire_type::fixed32:
-            skip_bytes(4);
-            break;
-        default:
-            throw unknown_pbf_wire_type_exception();
-    }
-}
-
-pbf_length_type pbf_reader::get_len_and_skip() {
-    auto len = get_length();
-    skip_bytes(len);
-    return len;
-}
-
-template <typename T>
-T pbf_reader::get_varint() {
-    return static_cast<T>(decode_varint(&m_data, m_end));
-}
-
-template <typename T>
-T pbf_reader::get_svarint() {
-    protozero_assert((has_wire_type(pbf_wire_type::varint) || has_wire_type(pbf_wire_type::length_delimited)) && "not a varint");
-    return static_cast<T>(decode_zigzag64(decode_varint(&m_data, m_end)));
-}
-
-uint32_t pbf_reader::get_fixed32() {
-    protozero_assert(tag() != 0 && "call next() before accessing field value");
-    protozero_assert(has_wire_type(pbf_wire_type::fixed32) && "not a 32-bit fixed");
-    return get_fixed<uint32_t>();
-}
-
-int32_t pbf_reader::get_sfixed32() {
-    protozero_assert(tag() != 0 && "call next() before accessing field value");
-    protozero_assert(has_wire_type(pbf_wire_type::fixed32) && "not a 32-bit fixed");
-    return get_fixed<int32_t>();
-}
-
-uint64_t pbf_reader::get_fixed64() {
-    protozero_assert(tag() != 0 && "call next() before accessing field value");
-    protozero_assert(has_wire_type(pbf_wire_type::fixed64) && "not a 64-bit fixed");
-    return get_fixed<uint64_t>();
-}
-
-int64_t pbf_reader::get_sfixed64() {
-    protozero_assert(tag() != 0 && "call next() before accessing field value");
-    protozero_assert(has_wire_type(pbf_wire_type::fixed64) && "not a 64-bit fixed");
-    return get_fixed<int64_t>();
-}
-
-float pbf_reader::get_float() {
-    protozero_assert(tag() != 0 && "call next() before accessing field value");
-    protozero_assert(has_wire_type(pbf_wire_type::fixed32) && "not a 32-bit fixed");
-    return get_fixed<float>();
-}
-
-double pbf_reader::get_double() {
-    protozero_assert(tag() != 0 && "call next() before accessing field value");
-    protozero_assert(has_wire_type(pbf_wire_type::fixed64) && "not a 64-bit fixed");
-    return get_fixed<double>();
-}
-
-bool pbf_reader::get_bool() {
-    protozero_assert(tag() != 0 && "call next() before accessing field value");
-    protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint");
-    protozero_assert((*m_data & 0x80) == 0 && "not a 1 byte varint");
-    skip_bytes(1);
-    return m_data[-1] != 0; // -1 okay because we incremented m_data the line before
-}
-
-std::pair<const char*, pbf_length_type> pbf_reader::get_data() {
-    protozero_assert(tag() != 0 && "call next() before accessing field value");
-    protozero_assert(has_wire_type(pbf_wire_type::length_delimited) && "not of type string, bytes or message");
-    auto len = get_len_and_skip();
-    return std::make_pair(m_data-len, len);
-}
-
-std::string pbf_reader::get_bytes() {
-    auto d = get_data();
-    return std::string(d.first, d.second);
-}
-
-std::string pbf_reader::get_string() {
-    return get_bytes();
-}
-
-std::pair<pbf_reader::const_bool_iterator, pbf_reader::const_bool_iterator> pbf_reader::get_packed_bool() {
-    return get_packed_int32();
-}
-
-std::pair<pbf_reader::const_enum_iterator, pbf_reader::const_enum_iterator> pbf_reader::get_packed_enum() {
-    return get_packed_int32();
-}
-
-std::pair<pbf_reader::const_int32_iterator, pbf_reader::const_int32_iterator> pbf_reader::get_packed_int32() {
-    protozero_assert(tag() != 0 && "call next() before accessing field value");
-    auto len = get_len_and_skip();
-    return std::make_pair(pbf_reader::const_int32_iterator(m_data-len, m_data),
-                          pbf_reader::const_int32_iterator(m_data, m_data));
-}
-
-std::pair<pbf_reader::const_uint32_iterator, pbf_reader::const_uint32_iterator> pbf_reader::get_packed_uint32() {
-    protozero_assert(tag() != 0 && "call next() before accessing field value");
-    auto len = get_len_and_skip();
-    return std::make_pair(pbf_reader::const_uint32_iterator(m_data-len, m_data),
-                          pbf_reader::const_uint32_iterator(m_data, m_data));
-}
-
-std::pair<pbf_reader::const_sint32_iterator, pbf_reader::const_sint32_iterator> pbf_reader::get_packed_sint32() {
-    protozero_assert(tag() != 0 && "call next() before accessing field value");
-    auto len = get_len_and_skip();
-    return std::make_pair(pbf_reader::const_sint32_iterator(m_data-len, m_data),
-                          pbf_reader::const_sint32_iterator(m_data, m_data));
-}
-
-std::pair<pbf_reader::const_int64_iterator, pbf_reader::const_int64_iterator> pbf_reader::get_packed_int64() {
-    protozero_assert(tag() != 0 && "call next() before accessing field value");
-    auto len = get_len_and_skip();
-    return std::make_pair(pbf_reader::const_int64_iterator(m_data-len, m_data),
-                          pbf_reader::const_int64_iterator(m_data, m_data));
-}
-
-std::pair<pbf_reader::const_uint64_iterator, pbf_reader::const_uint64_iterator> pbf_reader::get_packed_uint64() {
-    protozero_assert(tag() != 0 && "call next() before accessing field value");
-    auto len = get_len_and_skip();
-    return std::make_pair(pbf_reader::const_uint64_iterator(m_data-len, m_data),
-                          pbf_reader::const_uint64_iterator(m_data, m_data));
-}
-
-std::pair<pbf_reader::const_sint64_iterator, pbf_reader::const_sint64_iterator> pbf_reader::get_packed_sint64() {
-    protozero_assert(tag() != 0 && "call next() before accessing field value");
-    auto len = get_len_and_skip();
-    return std::make_pair(pbf_reader::const_sint64_iterator(m_data-len, m_data),
-                          pbf_reader::const_sint64_iterator(m_data, m_data));
-}
-
-} // end namespace protozero
-
-#endif // PROTOZERO_PBF_READER_HPP
diff --git a/contrib/libosmium/protozero/pbf_types.hpp b/contrib/libosmium/protozero/pbf_types.hpp
deleted file mode 100644
index 9f38584..0000000
--- a/contrib/libosmium/protozero/pbf_types.hpp
+++ /dev/null
@@ -1,49 +0,0 @@
-#ifndef PROTOZERO_PBF_TYPES_HPP
-#define PROTOZERO_PBF_TYPES_HPP
-
-/*****************************************************************************
-
-protozero - Minimalistic protocol buffer decoder and encoder in C++.
-
-This file is from https://github.com/mapbox/protozero where you can find more
-documentation.
-
-*****************************************************************************/
-
-/**
- * @file pbf_types.hpp
- *
- * @brief Contains the declaration of low-level types used in the pbf format.
- */
-
-#include <cstdint>
-
-namespace protozero {
-
-    /**
-     * The type used for field tags (field numbers).
-     */
-    typedef uint32_t pbf_tag_type;
-
-    /**
-     * The type used to encode type information.
-     * See the table on
-     *    https://developers.google.com/protocol-buffers/docs/encoding
-     */
-    enum class pbf_wire_type : uint32_t {
-        varint           = 0, // int32/64, uint32/64, sint32/64, bool, enum
-        fixed64          = 1, // fixed64, sfixed64, double
-        length_delimited = 2, // string, bytes, embedded messages,
-                              // packed repeated fields
-        fixed32          = 5, // fixed32, sfixed32, float
-        unknown          = 99 // used for default setting in this library
-    };
-
-    /**
-     * The type used for length values, such as the length of a field.
-     */
-    typedef uint32_t pbf_length_type;
-
-} // end namespace protozero
-
-#endif // PROTOZERO_PBF_TYPES_HPP
diff --git a/contrib/libosmium/protozero/pbf_writer.hpp b/contrib/libosmium/protozero/pbf_writer.hpp
deleted file mode 100644
index e4e02de..0000000
--- a/contrib/libosmium/protozero/pbf_writer.hpp
+++ /dev/null
@@ -1,666 +0,0 @@
-#ifndef PROTOZERO_PBF_WRITER_HPP
-#define PROTOZERO_PBF_WRITER_HPP
-
-/*****************************************************************************
-
-protozero - Minimalistic protocol buffer decoder and encoder in C++.
-
-This file is from https://github.com/mapbox/protozero where you can find more
-documentation.
-
-*****************************************************************************/
-
-/**
- * @file pbf_writer.hpp
- *
- * @brief Contains the pbf_writer class.
- */
-
-#include <cassert>
-#include <cstddef>
-#include <cstdint>
-#include <cstring>
-#include <iterator>
-#include <limits>
-#include <string>
-
-#include <protozero/pbf_types.hpp>
-#include <protozero/varint.hpp>
-
-#if __BYTE_ORDER != __LITTLE_ENDIAN
-# include <protozero/byteswap.hpp>
-#endif
-
-/// Wrapper for assert() used for testing
-#ifndef protozero_assert
-# define protozero_assert(x) assert(x)
-#endif
-
-namespace protozero {
-
-/**
- * The pbf_writer is used to write PBF formatted messages into a buffer.
- *
- * Almost all methods in this class can throw an std::bad_alloc exception if
- * the std::string used as a buffer wants to resize.
- */
-class pbf_writer {
-
-    std::string* m_data;
-    pbf_writer* m_parent_writer;
-    size_t m_pos = 0;
-
-    inline void add_varint(uint64_t value) {
-        protozero_assert(m_pos == 0 && "you can't add fields to a parent pbf_writer if there is an existing pbf_writer for a submessage");
-        protozero_assert(m_data);
-        write_varint(std::back_inserter(*m_data), value);
-    }
-
-    inline void add_field(pbf_tag_type tag, pbf_wire_type type) {
-        protozero_assert(((tag > 0 && tag < 19000) || (tag > 19999 && tag <= ((1 << 29) - 1))) && "tag out of range");
-        uint32_t b = (tag << 3) | uint32_t(type);
-        add_varint(b);
-    }
-
-    inline void add_tagged_varint(pbf_tag_type tag, uint64_t value) {
-        add_field(tag, pbf_wire_type::varint);
-        add_varint(value);
-    }
-
-    template <typename T>
-    inline void add_fixed(T value) {
-        protozero_assert(m_pos == 0 && "you can't add fields to a parent pbf_writer if there is an existing pbf_writer for a submessage");
-        protozero_assert(m_data);
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-        m_data->append(reinterpret_cast<const char*>(&value), sizeof(T));
-#else
-        auto size = m_data->size();
-        m_data->resize(size + sizeof(T));
-        byteswap<sizeof(T)>(reinterpret_cast<const char*>(&value), const_cast<char*>(m_data->data() + size));
-#endif
-    }
-
-    template <typename T, typename It>
-    inline void add_packed_fixed(pbf_tag_type tag, It first, It last, std::input_iterator_tag) {
-        if (first == last) {
-            return;
-        }
-
-        pbf_writer sw(*this, tag);
-
-        while (first != last) {
-            sw.add_fixed<T>(*first++);
-        }
-    }
-
-    template <typename T, typename It>
-    inline void add_packed_fixed(pbf_tag_type tag, It first, It last, std::forward_iterator_tag) {
-        if (first == last) {
-            return;
-        }
-
-        add_length_varint(tag, sizeof(T) * pbf_length_type(std::distance(first, last)));
-
-        while (first != last) {
-            add_fixed<T>(*first++);
-        }
-    }
-
-    template <typename It>
-    inline void add_packed_varint(pbf_tag_type tag, It first, It last) {
-        if (first == last) {
-            return;
-        }
-
-        pbf_writer sw(*this, tag);
-
-        while (first != last) {
-            sw.add_varint(uint64_t(*first++));
-        }
-    }
-
-    template <typename It>
-    inline void add_packed_svarint(pbf_tag_type tag, It first, It last) {
-        if (first == last) {
-            return;
-        }
-
-        pbf_writer sw(*this, tag);
-
-        while (first != last) {
-            sw.add_varint(encode_zigzag64(*first++));
-        }
-    }
-
-    // The number of bytes to reserve for the varint holding the length of
-    // a length-delimited field. The length has to fit into pbf_length_type,
-    // and a varint needs 8 bit for every 7 bit.
-    static const int reserve_bytes = sizeof(pbf_length_type) * 8 / 7 + 1;
-
-    inline void open_submessage(pbf_tag_type tag) {
-        protozero_assert(m_pos == 0);
-        protozero_assert(m_data);
-        add_field(tag, pbf_wire_type::length_delimited);
-        m_data->append(size_t(reserve_bytes), '\0');
-        m_pos = m_data->size();
-    }
-
-    inline void close_submessage() {
-        protozero_assert(m_pos != 0);
-        protozero_assert(m_data);
-        auto length = pbf_length_type(m_data->size() - m_pos);
-
-        protozero_assert(m_data->size() >= m_pos - reserve_bytes);
-        auto n = write_varint(m_data->begin() + long(m_pos) - reserve_bytes, length);
-
-        m_data->erase(m_data->begin() + long(m_pos) - reserve_bytes + n, m_data->begin() + long(m_pos));
-        m_pos = 0;
-    }
-
-    inline void add_length_varint(pbf_tag_type tag, pbf_length_type length) {
-        add_field(tag, pbf_wire_type::length_delimited);
-        add_varint(length);
-    }
-
-public:
-
-    /**
-     * Create a writer using the given string as a data store. The pbf_writer
-     * stores a reference to that string and adds all data to it.
-     */
-    inline explicit pbf_writer(std::string& data) noexcept :
-        m_data(&data),
-        m_parent_writer(nullptr),
-        m_pos(0) {
-    }
-
-    /**
-     * Create a writer without a data store. In this form the writer can not
-     * be used!
-     */
-    inline pbf_writer() noexcept :
-        m_data(nullptr),
-        m_parent_writer(nullptr),
-        m_pos(0) {
-    }
-
-    /**
-     * Construct a pbf_writer for a submessage from the pbf_writer of the
-     * parent message.
-     *
-     * @param parent_writer The pbf_writer
-     * @param tag Tag (field number) of the field that will be written
-     */
-    inline pbf_writer(pbf_writer& parent_writer, pbf_tag_type tag) :
-        m_data(parent_writer.m_data),
-        m_parent_writer(&parent_writer),
-        m_pos(0) {
-        m_parent_writer->open_submessage(tag);
-    }
-
-    /// A pbf_writer object can be copied
-    pbf_writer(const pbf_writer&) noexcept = default;
-
-    /// A pbf_writer object can be copied
-    pbf_writer& operator=(const pbf_writer&) noexcept = default;
-
-    /// A pbf_writer object can be moved
-    inline pbf_writer(pbf_writer&&) noexcept = default;
-
-    /// A pbf_writer object can be moved
-    inline pbf_writer& operator=(pbf_writer&&) noexcept = default;
-
-    inline ~pbf_writer() {
-        if (m_parent_writer) {
-            m_parent_writer->close_submessage();
-        }
-    }
-
-    ///@{
-    /**
-     * @name Scalar field writer functions
-     */
-
-    /**
-     * Add "bool" field to data.
-     *
-     * @param tag Tag (field number) of the field
-     * @param value Value to be written
-     */
-    inline void add_bool(pbf_tag_type tag, bool value) {
-        add_field(tag, pbf_wire_type::varint);
-        protozero_assert(m_pos == 0 && "you can't add fields to a parent pbf_writer if there is an existing pbf_writer for a submessage");
-        protozero_assert(m_data);
-        m_data->append(1, value);
-    }
-
-    /**
-     * Add "enum" field to data.
-     *
-     * @param tag Tag (field number) of the field
-     * @param value Value to be written
-     */
-    inline void add_enum(pbf_tag_type tag, int32_t value) {
-        add_tagged_varint(tag, uint64_t(value));
-    }
-
-    /**
-     * Add "int32" field to data.
-     *
-     * @param tag Tag (field number) of the field
-     * @param value Value to be written
-     */
-    inline void add_int32(pbf_tag_type tag, int32_t value) {
-        add_tagged_varint(tag, uint64_t(value));
-    }
-
-    /**
-     * Add "sint32" field to data.
-     *
-     * @param tag Tag (field number) of the field
-     * @param value Value to be written
-     */
-    inline void add_sint32(pbf_tag_type tag, int32_t value) {
-        add_tagged_varint(tag, encode_zigzag32(value));
-    }
-
-    /**
-     * Add "uint32" field to data.
-     *
-     * @param tag Tag (field number) of the field
-     * @param value Value to be written
-     */
-    inline void add_uint32(pbf_tag_type tag, uint32_t value) {
-        add_tagged_varint(tag, value);
-    }
-
-    /**
-     * Add "int64" field to data.
-     *
-     * @param tag Tag (field number) of the field
-     * @param value Value to be written
-     */
-    inline void add_int64(pbf_tag_type tag, int64_t value) {
-        add_tagged_varint(tag, uint64_t(value));
-    }
-
-    /**
-     * Add "sint64" field to data.
-     *
-     * @param tag Tag (field number) of the field
-     * @param value Value to be written
-     */
-    inline void add_sint64(pbf_tag_type tag, int64_t value) {
-        add_tagged_varint(tag, encode_zigzag64(value));
-    }
-
-    /**
-     * Add "uint64" field to data.
-     *
-     * @param tag Tag (field number) of the field
-     * @param value Value to be written
-     */
-    inline void add_uint64(pbf_tag_type tag, uint64_t value) {
-        add_tagged_varint(tag, value);
-    }
-
-    /**
-     * Add "fixed32" field to data.
-     *
-     * @param tag Tag (field number) of the field
-     * @param value Value to be written
-     */
-    inline void add_fixed32(pbf_tag_type tag, uint32_t value) {
-        add_field(tag, pbf_wire_type::fixed32);
-        add_fixed<uint32_t>(value);
-    }
-
-    /**
-     * Add "sfixed32" field to data.
-     *
-     * @param tag Tag (field number) of the field
-     * @param value Value to be written
-     */
-    inline void add_sfixed32(pbf_tag_type tag, int32_t value) {
-        add_field(tag, pbf_wire_type::fixed32);
-        add_fixed<int32_t>(value);
-    }
-
-    /**
-     * Add "fixed64" field to data.
-     *
-     * @param tag Tag (field number) of the field
-     * @param value Value to be written
-     */
-    inline void add_fixed64(pbf_tag_type tag, uint64_t value) {
-        add_field(tag, pbf_wire_type::fixed64);
-        add_fixed<uint64_t>(value);
-    }
-
-    /**
-     * Add "sfixed64" field to data.
-     *
-     * @param tag Tag (field number) of the field
-     * @param value Value to be written
-     */
-    inline void add_sfixed64(pbf_tag_type tag, int64_t value) {
-        add_field(tag, pbf_wire_type::fixed64);
-        add_fixed<int64_t>(value);
-    }
-
-    /**
-     * Add "float" field to data.
-     *
-     * @param tag Tag (field number) of the field
-     * @param value Value to be written
-     */
-    inline void add_float(pbf_tag_type tag, float value) {
-        add_field(tag, pbf_wire_type::fixed32);
-        add_fixed<float>(value);
-    }
-
-    /**
-     * Add "double" field to data.
-     *
-     * @param tag Tag (field number) of the field
-     * @param value Value to be written
-     */
-    inline void add_double(pbf_tag_type tag, double value) {
-        add_field(tag, pbf_wire_type::fixed64);
-        add_fixed<double>(value);
-    }
-
-    /**
-     * Add "bytes" field to data.
-     *
-     * @param tag Tag (field number) of the field
-     * @param value Pointer to value to be written
-     * @param size Number of bytes to be written
-     */
-    inline void add_bytes(pbf_tag_type tag, const char* value, size_t size) {
-        protozero_assert(m_pos == 0 && "you can't add fields to a parent pbf_writer if there is an existing pbf_writer for a submessage");
-        protozero_assert(m_data);
-        assert(size <= std::numeric_limits<pbf_length_type>::max());
-        add_length_varint(tag, pbf_length_type(size));
-        m_data->append(value, size);
-    }
-
-    /**
-     * Add "bytes" field to data.
-     *
-     * @param tag Tag (field number) of the field
-     * @param value Value to be written
-     */
-    inline void add_bytes(pbf_tag_type tag, const std::string& value) {
-        add_bytes(tag, value.data(), value.size());
-    }
-
-    /**
-     * Add "string" field to data.
-     *
-     * @param tag Tag (field number) of the field
-     * @param value Pointer to value to be written
-     * @param size Number of bytes to be written
-     */
-    inline void add_string(pbf_tag_type tag, const char* value, size_t size) {
-        add_bytes(tag, value, size);
-    }
-
-    /**
-     * Add "string" field to data.
-     *
-     * @param tag Tag (field number) of the field
-     * @param value Value to be written
-     */
-    inline void add_string(pbf_tag_type tag, const std::string& value) {
-        add_bytes(tag, value.data(), value.size());
-    }
-
-    /**
-     * Add "string" field to data. Bytes from the value are written until
-     * a null byte is encountered. The null byte is not added.
-     *
-     * @param tag Tag (field number) of the field
-     * @param value Pointer to value to be written
-     */
-    inline void add_string(pbf_tag_type tag, const char* value) {
-        add_bytes(tag, value, std::strlen(value));
-    }
-
-    /**
-     * Add "message" field to data.
-     *
-     * @param tag Tag (field number) of the field
-     * @param value Pointer to message to be written
-     * @param size Length of the message
-     */
-    inline void add_message(pbf_tag_type tag, const char* value, size_t size) {
-        add_bytes(tag, value, size);
-    }
-
-    /**
-     * Add "message" field to data.
-     *
-     * @param tag Tag (field number) of the field
-     * @param value Value to be written. The value must be a complete message.
-     */
-    inline void add_message(pbf_tag_type tag, const std::string& value) {
-        add_bytes(tag, value.data(), value.size());
-    }
-
-    ///@}
-
-    ///@{
-    /**
-     * @name Repeated packed field writer functions
-     */
-
-    /**
-     * Add "repeated packed bool" field to data.
-     *
-     * @tparam InputIterator An type satisfying the InputIterator concept.
-     *         Dereferencing the iterator must yield a type assignable to bool.
-     * @param tag Tag (field number) of the field
-     * @param first Iterator pointing to the beginning of the data
-     * @param last Iterator pointing one past the end of data
-     */
-    template <typename InputIterator>
-    inline void add_packed_bool(pbf_tag_type tag, InputIterator first, InputIterator last) {
-        add_packed_varint(tag, first, last);
-    }
-
-    /**
-     * Add "repeated packed enum" field to data.
-     *
-     * @tparam InputIterator An type satisfying the InputIterator concept.
-     *         Dereferencing the iterator must yield a type assignable to int32_t.
-     * @param tag Tag (field number) of the field
-     * @param first Iterator pointing to the beginning of the data
-     * @param last Iterator pointing one past the end of data
-     */
-    template <typename InputIterator>
-    inline void add_packed_enum(pbf_tag_type tag, InputIterator first, InputIterator last) {
-        add_packed_varint(tag, first, last);
-    }
-
-    /**
-     * Add "repeated packed int32" field to data.
-     *
-     * @tparam InputIterator An type satisfying the InputIterator concept.
-     *         Dereferencing the iterator must yield a type assignable to int32_t.
-     * @param tag Tag (field number) of the field
-     * @param first Iterator pointing to the beginning of the data
-     * @param last Iterator pointing one past the end of data
-     */
-    template <typename InputIterator>
-    inline void add_packed_int32(pbf_tag_type tag, InputIterator first, InputIterator last) {
-        add_packed_varint(tag, first, last);
-    }
-
-    /**
-     * Add "repeated packed sint32" field to data.
-     *
-     * @tparam InputIterator An type satisfying the InputIterator concept.
-     *         Dereferencing the iterator must yield a type assignable to int32_t.
-     * @param tag Tag (field number) of the field
-     * @param first Iterator pointing to the beginning of the data
-     * @param last Iterator pointing one past the end of data
-     */
-    template <typename InputIterator>
-    inline void add_packed_sint32(pbf_tag_type tag, InputIterator first, InputIterator last) {
-        add_packed_svarint(tag, first, last);
-    }
-
-    /**
-     * Add "repeated packed uint32" field to data.
-     *
-     * @tparam InputIterator An type satisfying the InputIterator concept.
-     *         Dereferencing the iterator must yield a type assignable to uint32_t.
-     * @param tag Tag (field number) of the field
-     * @param first Iterator pointing to the beginning of the data
-     * @param last Iterator pointing one past the end of data
-     */
-    template <typename InputIterator>
-    inline void add_packed_uint32(pbf_tag_type tag, InputIterator first, InputIterator last) {
-        add_packed_varint(tag, first, last);
-    }
-
-    /**
-     * Add "repeated packed int64" field to data.
-     *
-     * @tparam InputIterator An type satisfying the InputIterator concept.
-     *         Dereferencing the iterator must yield a type assignable to int64_t.
-     * @param tag Tag (field number) of the field
-     * @param first Iterator pointing to the beginning of the data
-     * @param last Iterator pointing one past the end of data
-     */
-    template <typename InputIterator>
-    inline void add_packed_int64(pbf_tag_type tag, InputIterator first, InputIterator last) {
-        add_packed_varint(tag, first, last);
-    }
-
-    /**
-     * Add "repeated packed sint64" field to data.
-     *
-     * @tparam InputIterator An type satisfying the InputIterator concept.
-     *         Dereferencing the iterator must yield a type assignable to int64_t.
-     * @param tag Tag (field number) of the field
-     * @param first Iterator pointing to the beginning of the data
-     * @param last Iterator pointing one past the end of data
-     */
-    template <typename InputIterator>
-    inline void add_packed_sint64(pbf_tag_type tag, InputIterator first, InputIterator last) {
-        add_packed_svarint(tag, first, last);
-    }
-
-    /**
-     * Add "repeated packed uint64" field to data.
-     *
-     * @tparam InputIterator An type satisfying the InputIterator concept.
-     *         Dereferencing the iterator must yield a type assignable to uint64_t.
-     * @param tag Tag (field number) of the field
-     * @param first Iterator pointing to the beginning of the data
-     * @param last Iterator pointing one past the end of data
-     */
-    template <typename InputIterator>
-    inline void add_packed_uint64(pbf_tag_type tag, InputIterator first, InputIterator last) {
-        add_packed_varint(tag, first, last);
-    }
-
-    /**
-     * Add "repeated packed fixed32" field to data.
-     *
-     * @tparam InputIterator An type satisfying the InputIterator concept.
-     *         Dereferencing the iterator must yield a type assignable to uint32_t.
-     * @param tag Tag (field number) of the field
-     * @param first Iterator pointing to the beginning of the data
-     * @param last Iterator pointing one past the end of data
-     */
-    template <typename InputIterator>
-    inline void add_packed_fixed32(pbf_tag_type tag, InputIterator first, InputIterator last) {
-        add_packed_fixed<uint32_t, InputIterator>(tag, first, last,
-            typename std::iterator_traits<InputIterator>::iterator_category());
-    }
-
-    /**
-     * Add "repeated packed sfixed32" field to data.
-     *
-     * @tparam InputIterator An type satisfying the InputIterator concept.
-     *         Dereferencing the iterator must yield a type assignable to int32_t.
-     * @param tag Tag (field number) of the field
-     * @param first Iterator pointing to the beginning of the data
-     * @param last Iterator pointing one past the end of data
-     */
-    template <typename InputIterator>
-    inline void add_packed_sfixed32(pbf_tag_type tag, InputIterator first, InputIterator last) {
-        add_packed_fixed<int32_t, InputIterator>(tag, first, last,
-            typename std::iterator_traits<InputIterator>::iterator_category());
-    }
-
-    /**
-     * Add "repeated packed fixed64" field to data.
-     *
-     * @tparam InputIterator An type satisfying the InputIterator concept.
-     *         Dereferencing the iterator must yield a type assignable to uint64_t.
-     * @param tag Tag (field number) of the field
-     * @param first Iterator pointing to the beginning of the data
-     * @param last Iterator pointing one past the end of data
-     */
-    template <typename InputIterator>
-    inline void add_packed_fixed64(pbf_tag_type tag, InputIterator first, InputIterator last) {
-        add_packed_fixed<uint64_t, InputIterator>(tag, first, last,
-            typename std::iterator_traits<InputIterator>::iterator_category());
-    }
-
-    /**
-     * Add "repeated packed sfixed64" field to data.
-     *
-     * @tparam InputIterator An type satisfying the InputIterator concept.
-     *         Dereferencing the iterator must yield a type assignable to int64_t.
-     * @param tag Tag (field number) of the field
-     * @param first Iterator pointing to the beginning of the data
-     * @param last Iterator pointing one past the end of data
-     */
-    template <typename InputIterator>
-    inline void add_packed_sfixed64(pbf_tag_type tag, InputIterator first, InputIterator last) {
-        add_packed_fixed<int64_t, InputIterator>(tag, first, last,
-            typename std::iterator_traits<InputIterator>::iterator_category());
-    }
-
-    /**
-     * Add "repeated packed float" field to data.
-     *
-     * @tparam InputIterator An type satisfying the InputIterator concept.
-     *         Dereferencing the iterator must yield a type assignable to float.
-     * @param tag Tag (field number) of the field
-     * @param first Iterator pointing to the beginning of the data
-     * @param last Iterator pointing one past the end of data
-     */
-    template <typename InputIterator>
-    inline void add_packed_float(pbf_tag_type tag, InputIterator first, InputIterator last) {
-        add_packed_fixed<float, InputIterator>(tag, first, last,
-            typename std::iterator_traits<InputIterator>::iterator_category());
-    }
-
-    /**
-     * Add "repeated packed double" field to data.
-     *
-     * @tparam InputIterator An type satisfying the InputIterator concept.
-     *         Dereferencing the iterator must yield a type assignable to double.
-     * @param tag Tag (field number) of the field
-     * @param first Iterator pointing to the beginning of the data
-     * @param last Iterator pointing one past the end of data
-     */
-    template <typename InputIterator>
-    inline void add_packed_double(pbf_tag_type tag, InputIterator first, InputIterator last) {
-        add_packed_fixed<double, InputIterator>(tag, first, last,
-            typename std::iterator_traits<InputIterator>::iterator_category());
-    }
-
-    ///@}
-
-}; // class pbf_writer
-
-} // end namespace protozero
-
-#endif // PROTOZERO_PBF_WRITER_HPP
diff --git a/contrib/libosmium/protozero/varint.hpp b/contrib/libosmium/protozero/varint.hpp
deleted file mode 100644
index 27536fd..0000000
--- a/contrib/libosmium/protozero/varint.hpp
+++ /dev/null
@@ -1,132 +0,0 @@
-#ifndef PROTOZERO_VARINT_HPP
-#define PROTOZERO_VARINT_HPP
-
-/*****************************************************************************
-
-protozero - Minimalistic protocol buffer decoder and encoder in C++.
-
-This file is from https://github.com/mapbox/protozero where you can find more
-documentation.
-
-*****************************************************************************/
-
-/**
- * @file varint.hpp
- *
- * @brief Contains low-level varint and zigzag encoding and decoding functions.
- */
-
-#include <cstdint>
-
-#include <protozero/exception.hpp>
-
-namespace protozero {
-
-/**
- * The maximum length of a 64bit varint.
- */
-const int8_t max_varint_length = sizeof(uint64_t) * 8 / 7 + 1;
-
-// from https://github.com/facebook/folly/blob/master/folly/Varint.h
-/**
- * Decode a 64bit varint.
- *
- * String exception guarantee: if there is an exception the data pointer will
- * not be changed.
- *
- * @param[in,out] data Pointer to pointer to the input data. After the function
- *        returns this will point to the next data to be read.
- * @param[in] end Pointer one past the end of the input data.
- * @returns The decoded integer
- * @throws varint_too_long_exception if the varint is longer then the maximum
- *         length that would fit in a 64bit int. Usually this means your data
- *         is corrupted or you are trying to read something as a varint that
- *         isn't.
- * @throws end_of_buffer_exception if the *end* of the buffer was reached
- *         before the end of the varint.
- */
-inline uint64_t decode_varint(const char** data, const char* end) {
-    const int8_t* begin = reinterpret_cast<const int8_t*>(*data);
-    const int8_t* iend = reinterpret_cast<const int8_t*>(end);
-    const int8_t* p = begin;
-    uint64_t val = 0;
-
-    if (iend - begin >= max_varint_length) {  // fast path
-        do {
-            int64_t b;
-            b = *p++; val  = uint64_t((b & 0x7f)      ); if (b >= 0) break;
-            b = *p++; val |= uint64_t((b & 0x7f) <<  7); if (b >= 0) break;
-            b = *p++; val |= uint64_t((b & 0x7f) << 14); if (b >= 0) break;
-            b = *p++; val |= uint64_t((b & 0x7f) << 21); if (b >= 0) break;
-            b = *p++; val |= uint64_t((b & 0x7f) << 28); if (b >= 0) break;
-            b = *p++; val |= uint64_t((b & 0x7f) << 35); if (b >= 0) break;
-            b = *p++; val |= uint64_t((b & 0x7f) << 42); if (b >= 0) break;
-            b = *p++; val |= uint64_t((b & 0x7f) << 49); if (b >= 0) break;
-            b = *p++; val |= uint64_t((b & 0x7f) << 56); if (b >= 0) break;
-            b = *p++; val |= uint64_t((b & 0x7f) << 63); if (b >= 0) break;
-            throw varint_too_long_exception();
-        } while (false);
-    } else {
-        int shift = 0;
-        while (p != iend && *p < 0) {
-            val |= uint64_t(*p++ & 0x7f) << shift;
-            shift += 7;
-        }
-        if (p == iend) {
-            throw end_of_buffer_exception();
-        }
-        val |= uint64_t(*p++) << shift;
-    }
-
-    *data = reinterpret_cast<const char*>(p);
-    return val;
-}
-
-/**
- * Varint-encode a 64bit integer.
- */
-template <typename OutputIterator>
-inline int write_varint(OutputIterator data, uint64_t value) {
-    int n=1;
-
-    while (value >= 0x80) {
-        *data++ = char((value & 0x7f) | 0x80);
-        value >>= 7;
-        ++n;
-    }
-    *data++ = char(value);
-
-    return n;
-}
-
-/**
- * ZigZag encodes a 32 bit integer.
- */
-inline uint32_t encode_zigzag32(int32_t value) noexcept {
-    return (static_cast<uint32_t>(value) << 1) ^ (static_cast<uint32_t>(value >> 31));
-}
-
-/**
- * ZigZag encodes a 64 bit integer.
- */
-inline uint64_t encode_zigzag64(int64_t value) noexcept {
-    return (static_cast<uint64_t>(value) << 1) ^ (static_cast<uint64_t>(value >> 63));
-}
-
-/**
- * Decodes a 32 bit ZigZag-encoded integer.
- */
-inline int32_t decode_zigzag32(uint32_t value) noexcept {
-    return int32_t(value >> 1) ^ -int32_t(value & 1);
-}
-
-/**
- * Decodes a 64 bit ZigZag-encoded integer.
- */
-inline int64_t decode_zigzag64(uint64_t value) noexcept {
-    return int64_t(value >> 1) ^ -int64_t(value & 1);
-}
-
-} // end namespace protozero
-
-#endif // PROTOZERO_VARINT_HPP
diff --git a/contrib/libosmium/protozero/version.hpp b/contrib/libosmium/protozero/version.hpp
deleted file mode 100644
index f11d303..0000000
--- a/contrib/libosmium/protozero/version.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef PROTOZERO_VERSION_HPP
-#define PROTOZERO_VERSION_HPP
-
-/*****************************************************************************
-
-protozero - Minimalistic protocol buffer decoder and encoder in C++.
-
-This file is from https://github.com/mapbox/protozero where you can find more
-documentation.
-
-*****************************************************************************/
-
-#define PROTOZERO_VERSION_MAJOR 1
-#define PROTOZERO_VERSION_MINOR 2
-#define PROTOZERO_VERSION_PATCH 2
-
-#define PROTOZERO_VERSION_CODE (PROTOZERO_VERSION_MAJOR * 10000 + PROTOZERO_VERSION_MINOR * 100 + PROTOZERO_VERSION_PATCH)
-
-#define PROTOZERO_VERSION_STRING "1.2.2"
-
-
-#endif // PROTOZERO_VERSION_HPP

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/osm2pgsql.git



More information about the Pkg-grass-devel mailing list