[chromium-freeworld: 14/15] 62.0.3202.89
by Miro Hrončok
commit bc9e77bbacb17d7eec4e5b01fbc358dcc5263528
Author: Tom Callaway <spot(a)fedoraproject.org>
Date: Wed Nov 8 12:59:00 2017 -0500
62.0.3202.89
.gitignore | 1 +
chromium.spec | 5 ++++-
sources | 2 +-
3 files changed, 6 insertions(+), 2 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index da86396..5662256 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,3 +32,4 @@
/chromium-61.0.3163.79-clean.tar.xz
/chromium-61.0.3163.100-clean.tar.xz
/chromium-62.0.3202.75-clean.tar.xz
+/chromium-62.0.3202.89-clean.tar.xz
diff --git a/chromium.spec b/chromium.spec
index 8c2b738..9b2e687 100644
--- a/chromium.spec
+++ b/chromium.spec
@@ -118,7 +118,7 @@ Name: chromium%{chromium_channel}%{?freeworld:-freeworld}
%else
Name: chromium%{chromium_channel}
%endif
-Version: %{majorversion}.0.3202.75
+Version: %{majorversion}.0.3202.89
Release: 1%{?dist}
Summary: A WebKit (Blink) powered web browser
Url: http://www.chromium.org/Home
@@ -1909,6 +1909,9 @@ getent group chrome-remote-desktop >/dev/null || groupadd -r chrome-remote-deskt
%changelog
+* Wed Nov 8 2017 Tom Callaway <spot(a)fedoraproject.org> 62.0.3202.89-1
+- update to 62.0.3202.89
+
* Fri Oct 27 2017 Tom Callaway <spot(a)fedoraproject.org> 62.0.3202.75-1
- update to 62.0.3202.75
- use devtoolset-7-toolchain to build on epel7
diff --git a/sources b/sources
index 2aea4ff..c0429f5 100644
--- a/sources
+++ b/sources
@@ -1,2 +1,2 @@
SHA512 (depot_tools.git-master.tar.gz) = d3d6a1873b2b0296a8cd99e0d8d2e629a17b1808934b4972556168f8b4ccea60577ebaeab4445baf15afb1b04080808db59a832a5b61d247bd48da14fa6acf03
-SHA512 (chromium-62.0.3202.75-clean.tar.xz) = 4b146d7f4d6d45ae8e56ede13539320a1cc0969fe4a00e6ef47d64dd162442b2089931f80265d852f3c376afc7de0c82fcc1f4544bba073256426626b709f71f
+SHA512 (chromium-62.0.3202.89-clean.tar.xz) = b1a8720ea61c5c71a0ff15a278f20e7d0d3218814f883ce2d5f6e949fb9dd61ac6d4cc6b4c517eb13b11b308593e648bde2f3de48ece390d5647670725b8f5d9
7 years
[chromium-freeworld: 13/15] fix merge
by Miro Hrončok
commit 7d1b47a15fda080ce7cf8381605e2b75f3211c4b
Merge: 2abf30d 4b560f7
Author: Tom Callaway <spot(a)fedoraproject.org>
Date: Sun Oct 29 10:29:25 2017 -0400
fix merge
.gitignore | 1 +
chromium.spec | 22 ++++++++++++++++++++--
sources | 2 +-
3 files changed, 22 insertions(+), 3 deletions(-)
---
7 years
[chromium-freeworld: 12/15] 62.0.3202.75
by Miro Hrončok
commit 4b560f74014f2dfab00e81ba329a0a0849188962
Author: Tom Callaway <spot(a)fedoraproject.org>
Date: Fri Oct 27 11:02:21 2017 -0400
62.0.3202.75
.gitignore | 1 +
chromium-62.0.3202.62-epel7-c++11-support.patch | 1980 -----------------------
chromium-62.0.3202.62-epel7-noc++14.patch | 12 -
chromium.spec | 33 +-
sources | 2 +-
5 files changed, 20 insertions(+), 2008 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index 33c625a..da86396 100644
--- a/.gitignore
+++ b/.gitignore
@@ -31,3 +31,4 @@
/chromium-60.0.3112.113.tar.xz
/chromium-61.0.3163.79-clean.tar.xz
/chromium-61.0.3163.100-clean.tar.xz
+/chromium-62.0.3202.75-clean.tar.xz
diff --git a/chromium.spec b/chromium.spec
index da74cc5..8c2b738 100644
--- a/chromium.spec
+++ b/chromium.spec
@@ -26,7 +26,7 @@
# Requires is trickier.
%global __provides_exclude_from %{chromium_path}/.*\\.so|%{chromium_path}/lib/.*\\.so
-%global privlibs libEGL|libGLESv2|libVkLayer_core_validation|libVkLayer_object_tracker|libVkLayer_parameter_validation|libVkLayer_swapchain|libVkLayer_threading|libVkLayer_unique_objects|libaccessibility|libanimation|libaura|libaura_extra|libbase|libbase_i18n|libbindings|libblink_android_mojo_bindings_shared|libblink_common|libblink_controller|libblink_core|libblink_modules|libblink_mojo_bindings_shared|libblink_offscreen_canvas_mojo_bindings_shared|libblink_platform|libbluetooth|libboringssl|libbrowser_ui_views|libcaptive_portal|libcapture_base|libcapture_lib|libcc|libcc_animation|libcc_base|libcc_blink|libcc_debug|libcc_ipc|libcc_paint|libcdm_manager|libchromium_sqlite3|libclearkeycdm|libcloud_policy_proto_generated_compile|libcodec|libcolor_space|libcommon|libcompositor|libcontent|libcontent_common_mojo_bindings_shared|libcontent_public_common_mojo_bindings_shared|libcrcrypto|libdbus|libdevice_base|libdevice_event_log|libdevice_gamepad|libdevice_vr_mojo_bindings|libdevice_vr_mojo
_bindings_blink|libdevice_vr_mojo_bindings_shared|libdevices|libdiscardable_memory_client|libdiscardable_memory_common|libdiscardable_memory_service|libdisplay|libdisplay_types|libdisplay_util|libdomain_reliability|libembedder|libevents|libevents_base|libevents_devices_x11|libevents_ozone_layout|libevents_x|libfingerprint|libffmpeg|libgcm|libgeolocation|libgeometry|libgeometry_skia|libgesture_detection|libgfx|libgfx_ipc|libgfx_ipc_color|libgfx_ipc_geometry|libgfx_ipc_skia|libgfx_switches|libgfx_x11|libgin|libgl_in_process_context|libgl_init|libgl_wrapper|libgles2_c_lib|libgles2_implementation|libgles2_utils|libgpu|libgtk3ui|libheadless|libhost|libicui18n|libicuuc|libinterfaces_shared|libipc|libipc_mojom|libipc_mojom_shared|libjs|libkeyboard|libkeyboard_with_content|libkeycodes_x11|libkeyed_service_content|libkeyed_service_core|libmanager|libmedia|libmedia_blink|libmedia_gpu|libmedia_mojo_services|libmessage_center|libmetrics_cpp|libmidi|libmirclient.9|libmojo_common_lib|libmojo_ime_
lib|libmojo_public_system|libmojo_public_system_cpp|libmojo_system_impl|libnative_theme|libnet|libnet_with_v8|libonc|libplatform|libpolicy_component|libpolicy_proto|libppapi_host|libppapi_proxy|libppapi_shared|libprefs|libprinting|libprotobuf_lite|libproxy_config|librange|libresource_coordinator_cpp|libresource_coordinator_public_interfaces_internal_shared|libsandbox_services|libseccomp_bpf|libsensors|libservice|libservice_manager_cpp|libservice_manager_cpp_types|libservice_manager_mojom|libservice_manager_mojom_blink|libservice_manager_mojom_constants|libservice_manager_mojom_constants_blink|libservice_manager_mojom_constants_shared|libservice_manager_mojom_shared|libsessions|libshared_memory_support|libshell_dialogs|libskia|libsnapshot|libsql|libstartup_tracing|libstorage_browser|libstorage_common|libstub_window|libsuid_sandbox_client|libsurface|libtracing|libui_base|libui_base_ime|libui_base_x|libui_data_pack|libui_devtools|libui_touch_selection|libui_views_mus_lib|liburl|liburl_
ipc|liburl_matcher|libuser_manager|libuser_prefs|libv8|libv8_libbase|libv8_libplatform|libviews|libviz_common|libviz_resource_format|libweb_dialogs|libwebdata_common|libwebview|libwidevinecdm.fedora|libwidevinecdmadapter|libwm|libwm_public|libwtf|libx11_events_platform|libx11_window
+%global privlibs libEGL|libGLESv2|libVkLayer_core_validation|libVkLayer_object_tracker|libVkLayer_parameter_validation|libVkLayer_swapchain|libVkLayer_threading|libVkLayer_unique_objects|libaccessibility|libanimation|libaura|libaura_extra|libbase|libbase_i18n|libbindings|libblink_android_mojo_bindings_shared|libblink_common|libblink_controller|libblink_core|libblink_modules|libblink_mojo_bindings_shared|libblink_offscreen_canvas_mojo_bindings_shared|libblink_platform|libbluetooth|libboringssl|libbrowser_ui_views|libcaptive_portal|libcapture_base|libcapture_lib|libcc|libcc_animation|libcc_base|libcc_blink|libcc_debug|libcc_ipc|libcc_paint|libcdm_manager|libchromium_sqlite3|libclearkeycdm|libcloud_policy_proto_generated_compile|libcodec|libcolor_space|libcommon|libcompositor|libcontent|libcontent_common_mojo_bindings_shared|libcontent_public_common_mojo_bindings_shared|libcrcrypto|libdbus|libdevice_base|libdevice_event_log|libdevice_gamepad|libdevice_vr_mojo_bindings|libdevice_vr_mojo
_bindings_blink|libdevice_vr_mojo_bindings_shared|libdevices|libdiscardable_memory_client|libdiscardable_memory_common|libdiscardable_memory_service|libdisplay|libdisplay_types|libdisplay_util|libdomain_reliability|libembedder|libevents|libevents_base|libevents_devices_x11|libevents_ozone_layout|libevents_x|libfingerprint|libffmpeg|libgcm|libgeolocation|libgeometry|libgeometry_skia|libgesture_detection|libgfx|libgfx_ipc|libgfx_ipc_color|libgfx_ipc_geometry|libgfx_ipc_skia|libgfx_switches|libgfx_x11|libgin|libgl_in_process_context|libgl_init|libgl_wrapper|libgles2_c_lib|libgles2_implementation|libgles2_utils|libgpu|libgtk3ui|libheadless|libhost|libicui18n|libicuuc|libinterfaces_shared|libipc|libipc_mojom|libipc_mojom_shared|libjs|libkeyboard|libkeyboard_with_content|libkeycodes_x11|libkeyed_service_content|libkeyed_service_core|libmanager|libmedia|libmedia_blink|libmedia_gpu|libmedia_mojo_services|libmessage_center|libmetrics_cpp|libmidi|libmirclient.9|libmojo_common_lib|libmojo_ime_
lib|libmojo_public_system|libmojo_public_system_cpp|libmojo_system_impl|libnative_theme|libnet|libnet_with_v8|libonc|libplatform|libpolicy_component|libpolicy_proto|libppapi_host|libppapi_proxy|libppapi_shared|libprefs|libprinting|libprotobuf_lite|libproxy_config|librange|libresource_coordinator_cpp|libresource_coordinator_public_interfaces_internal_shared|libsandbox_services|libseccomp_bpf|libsensors|libservice|libservice_manager_cpp|libservice_manager_cpp_types|libservice_manager_mojom|libservice_manager_mojom_blink|libservice_manager_mojom_constants|libservice_manager_mojom_constants_blink|libservice_manager_mojom_constants_shared|libservice_manager_mojom_shared|libsessions|libshared_memory_support|libshell_dialogs|libskia|libsnapshot|libsql|libstartup_tracing|libstorage_browser|libstorage_common|libstub_window|libsuid_sandbox_client|libsurface|libtracing|libui_base|libui_base_ime|libui_base_x|libui_data_pack|libui_devtools|libui_touch_selection|libui_views_mus_lib|liburl|liburl_
ipc|liburl_matcher|libuser_manager|libuser_prefs|libv8|libv8_libbase|libv8_libplatform|libviews|libviz_common|libviz_resource_format|libweb_dialogs|libwebdata_common|libwebview|libwidevinecdm|libwidevinecdmadapter|libwm|libwm_public|libwtf|libx11_events_platform|libx11_window
%global __requires_exclude ^(%{privlibs})\\.so
# Try to not use the Xvfb as it is slow..
@@ -118,8 +118,8 @@ Name: chromium%{chromium_channel}%{?freeworld:-freeworld}
%else
Name: chromium%{chromium_channel}
%endif
-Version: %{majorversion}.0.3202.62
-Release: 1%{?dist}.1
+Version: %{majorversion}.0.3202.75
+Release: 1%{?dist}
Summary: A WebKit (Blink) powered web browser
Url: http://www.chromium.org/Home
License: BSD and LGPLv2+ and ASL 2.0 and IJG and MIT and GPLv2+ and ISC and OpenSSL and (MPLv1.1 or GPLv2 or LGPLv2)
@@ -216,9 +216,6 @@ Patch62: chromium-gcc5-r3.patch
Patch63: chromium-gn-bootstrap-r17.patch
# Fix _cplusplus conditional
Patch64: chromium-62.0.3202.62-correct-cplusplus-check.patch
-# epel7 does not know about c++14
-Patch65: chromium-62.0.3202.62-epel7-noc++14.patch
-Patch66: chromium-62.0.3202.62-epel7-c++11-support.patch
### Chromium Tests Patches ###
Patch100: chromium-46.0.2490.86-use_system_opus.patch
@@ -399,6 +396,10 @@ BuildRequires: systemd
# using the built from source version on aarch64
BuildRequires: ninja-build
+%if 0%{?rhel} == 7
+BuildRequires: devtoolset-7-toolchain, devtoolset-7-libatomic-devel
+%endif
+
# We pick up an automatic requires on the library, but we need the version check
# because the nss shared library is unversioned.
# This is to prevent someone from hitting http://code.google.com/p/chromium/issues/detail?id=26448
@@ -668,8 +669,6 @@ udev.
%patch59 -p1 -b .gcc-nc
%patch60 -p1 -b .nonullptr
%patch61 -p1 -b .another-rvalue-fix
-%patch65 -p1 -b .epel7-noc++14
-%patch66 -p1 -b .epel7-c++11
%endif
%patch50 -p1 -b .pathfix
%patch53 -p1 -b .nogccoptmath
@@ -809,9 +808,6 @@ CHROMIUM_CORE_GN_DEFINES+=' treat_warnings_as_errors=false linux_use_bundled_bin
%ifarch aarch64
CHROMIUM_CORE_GN_DEFINES+=' target_cpu="arm64"'
%endif
-%if 0%{?rhel} == 7
-CHROMIUM_CORE_GN_DEFINES+=' use_cxx11=true'
-%endif
export CHROMIUM_CORE_GN_DEFINES
CHROMIUM_BROWSER_GN_DEFINES=""
@@ -990,10 +986,6 @@ build/linux/unbundle/remove_bundled_libraries.py \
'third_party/swiftshader/third_party/subzero' \
'third_party/swiftshader/third_party/LLVM' \
'third_party/swiftshader/third_party/llvm-subzero' \
-%if 0%{?rhel} == 7
- 'third_party/tao' \
- 'third_party/tao/seq' \
-%endif
'third_party/tcmalloc' \
'third_party/usb_ids' \
'third_party/usrsctp' \
@@ -1077,6 +1069,10 @@ sed -i '/aarch64)/ a \ exec "/usr/bin/ninja-build" "$@";;\' ../depot_tool
%endif
sed -i 's|exec "${THIS_DIR}/ninja-linux${LONG_BIT}"|exec "/usr/bin/ninja-build"|g' ../depot_tools/ninja
+%if 0%{?rhel} == 7
+. /opt/rh/devtoolset-7/enable
+%endif
+
tools/gn/bootstrap/bootstrap.py -v --gn-gen-args "$CHROMIUM_CORE_GN_DEFINES $CHROMIUM_BROWSER_GN_DEFINES"
%{target}/gn gen --args="$CHROMIUM_CORE_GN_DEFINES $CHROMIUM_BROWSER_GN_DEFINES" %{target}
@@ -1103,6 +1099,9 @@ FILE=chrome/common/channel_info_posix.cc
sed -i.orig -e 's/getenv("CHROME_VERSION_EXTRA")/"Fedora Project"/' $FILE
%build
+%if 0%{?rhel} == 7
+. /opt/rh/devtoolset-7/enable
+%endif
%if %{?tests}
# Tests targets taken from testing/buildbot/chromium.linux.json and obtained with
@@ -1910,6 +1909,10 @@ getent group chrome-remote-desktop >/dev/null || groupadd -r chrome-remote-deskt
%changelog
+* Fri Oct 27 2017 Tom Callaway <spot(a)fedoraproject.org> 62.0.3202.75-1
+- update to 62.0.3202.75
+- use devtoolset-7-toolchain to build on epel7
+
* Tue Oct 24 2017 Tom Callaway <spot(a)fedoraproject.org> 62.0.3202.62-1.1
- do not attempt std=c++14 on epel7
diff --git a/sources b/sources
index 9d1d29d..2aea4ff 100644
--- a/sources
+++ b/sources
@@ -1,2 +1,2 @@
SHA512 (depot_tools.git-master.tar.gz) = d3d6a1873b2b0296a8cd99e0d8d2e629a17b1808934b4972556168f8b4ccea60577ebaeab4445baf15afb1b04080808db59a832a5b61d247bd48da14fa6acf03
-SHA512 (chromium-62.0.3202.62-clean.tar.xz) = 5151cdd4cc9f5735984ea16615311dbec759d62496b619fa5a04e06e08821ccba7f11e2d1835e2020edcb783150cc7f1880e62084ae9f69057fabea0459e147b
+SHA512 (chromium-62.0.3202.75-clean.tar.xz) = 4b146d7f4d6d45ae8e56ede13539320a1cc0969fe4a00e6ef47d64dd162442b2089931f80265d852f3c376afc7de0c82fcc1f4544bba073256426626b709f71f
7 years
[chromium-freeworld: 11/15] even moar c++11
by Miro Hrončok
commit 2f12a9278f7bed47e7086ca076252ed5b973bb89
Author: Tom Callaway <spot(a)fedoraproject.org>
Date: Wed Oct 25 10:23:22 2017 -0400
even moar c++11
....3202.62-epel7-c++11-decay-enable_if-type.patch | 250 ---
chromium-62.0.3202.62-epel7-c++11-support.patch | 1980 ++++++++++++++++++++
chromium.spec | 6 +-
3 files changed, 1985 insertions(+), 251 deletions(-)
---
diff --git a/chromium-62.0.3202.62-epel7-c++11-support.patch b/chromium-62.0.3202.62-epel7-c++11-support.patch
new file mode 100644
index 0000000..eb4339a
--- /dev/null
+++ b/chromium-62.0.3202.62-epel7-c++11-support.patch
@@ -0,0 +1,1980 @@
+diff -up chromium-62.0.3202.62/base/bind_helpers.h.epel7-c++11 chromium-62.0.3202.62/base/bind_helpers.h
+--- chromium-62.0.3202.62/base/bind_helpers.h.epel7-c++11 2017-10-25 08:50:15.692276363 -0400
++++ chromium-62.0.3202.62/base/bind_helpers.h 2017-10-25 09:12:15.889484145 -0400
+@@ -282,7 +282,7 @@ class PassedWrapper {
+ };
+
+ template <typename T>
+-using Unwrapper = BindUnwrapTraits<std::decay_t<T>>;
++using Unwrapper = BindUnwrapTraits<typename std::decay<T>::type>;
+
+ template <typename T>
+ auto Unwrap(T&& o) -> decltype(Unwrapper<T>::Unwrap(std::forward<T>(o))) {
+@@ -438,7 +438,7 @@ static inline internal::OwnedWrapper<T>
+ // Both versions of Passed() prevent T from being an lvalue reference. The first
+ // via use of enable_if, and the second takes a T* which will not bind to T&.
+ template <typename T,
+- std::enable_if_t<!std::is_lvalue_reference<T>::value>* = nullptr>
++ typename std::enable_if<!std::is_lvalue_reference<T>::value>::type* = nullptr>
+ static inline internal::PassedWrapper<T> Passed(T&& scoper) {
+ return internal::PassedWrapper<T>(std::move(scoper));
+ }
+@@ -537,9 +537,9 @@ template <typename Functor, typename...
+ struct CallbackCancellationTraits<
+ Functor,
+ std::tuple<BoundArgs...>,
+- std::enable_if_t<
++ typename std::enable_if<
+ internal::IsWeakMethod<internal::FunctorTraits<Functor>::is_method,
+- BoundArgs...>::value>> {
++ BoundArgs...>::value>::type> {
+ static constexpr bool is_cancellable = true;
+
+ template <typename Receiver, typename... Args>
+diff -up chromium-62.0.3202.62/base/bind.h.epel7-c++11 chromium-62.0.3202.62/base/bind.h
+--- chromium-62.0.3202.62/base/bind.h.epel7-c++11 2017-10-25 08:55:22.603877014 -0400
++++ chromium-62.0.3202.62/base/bind.h 2017-10-25 10:12:28.753008563 -0400
+@@ -7,6 +7,8 @@
+
+ #include <utility>
+
++#include "third_party/tao/seq/integer_sequence.hpp"
++#include "third_party/tao/seq/make_integer_sequence.hpp"
+ #include "base/bind_internal.h"
+
+ // -----------------------------------------------------------------------------
+@@ -53,7 +55,7 @@ struct AssertConstructible {
+ // reference with repeating callbacks--is used instead of base::Passed().
+ static_assert(
+ param_is_forwardable ||
+- !std::is_constructible<Param, std::decay_t<Unwrapped>&&>::value,
++ !std::is_constructible<Param, typename std::decay<Unwrapped>::type&&>::value,
+ "Bound argument |i| is move-only but will be forwarded by copy. "
+ "Ensure |Arg| is bound using base::Passed(), not std::move().");
+ static_assert(
+@@ -64,7 +66,7 @@ struct AssertConstructible {
+ static constexpr bool arg_is_storable =
+ std::is_constructible<Storage, Arg>::value;
+ static_assert(arg_is_storable ||
+- !std::is_constructible<Storage, std::decay_t<Arg>&&>::value,
++ !std::is_constructible<Storage, typename std::decay<Arg>::type&&>::value,
+ "Bound argument |i| is move-only but will be bound by copy. "
+ "Ensure |Arg| is mutable and bound using std::move().");
+ static_assert(arg_is_storable,
+@@ -84,11 +86,11 @@ template <size_t... Ns,
+ typename... Args,
+ typename... Unwrapped,
+ typename... Params>
+-struct AssertBindArgsValidity<std::index_sequence<Ns...>,
++struct AssertBindArgsValidity<tao::seq::index_sequence<Ns...>,
+ TypeList<Args...>,
+ TypeList<Unwrapped...>,
+ TypeList<Params...>>
+- : AssertConstructible<Ns, Args, std::decay_t<Args>, Unwrapped, Params>... {
++ : AssertConstructible<Ns, Args, typename std::decay<Args>::type, Unwrapped, Params>... {
+ static constexpr bool ok = true;
+ };
+
+@@ -98,14 +100,14 @@ struct TransformToUnwrappedTypeImpl;
+
+ template <typename T>
+ struct TransformToUnwrappedTypeImpl<true, T> {
+- using StoredType = std::decay_t<T>;
++ using StoredType = typename std::decay<T>::type;
+ using ForwardType = StoredType&&;
+ using Unwrapped = decltype(Unwrap(std::declval<ForwardType>()));
+ };
+
+ template <typename T>
+ struct TransformToUnwrappedTypeImpl<false, T> {
+- using StoredType = std::decay_t<T>;
++ using StoredType = typename std::decay<T>::type;
+ using ForwardType = const StoredType&;
+ using Unwrapped = decltype(Unwrap(std::declval<ForwardType>()));
+ };
+@@ -153,7 +155,7 @@ using MakeUnwrappedTypeList =
+ template <typename Functor, typename... Args>
+ inline OnceCallback<MakeUnboundRunType<Functor, Args...>>
+ BindOnce(Functor&& functor, Args&&... args) {
+- static_assert(!internal::IsOnceCallback<std::decay_t<Functor>>() ||
++ static_assert(!internal::IsOnceCallback<typename std::decay<Functor>::type>() ||
+ (std::is_rvalue_reference<Functor&&>() &&
+ !std::is_const<std::remove_reference_t<Functor>>()),
+ "BindOnce requires non-const rvalue for OnceCallback binding."
+@@ -170,7 +172,7 @@ BindOnce(Functor&& functor, Args&&... ar
+ Args&&...>;
+ using BoundParamsList = typename Helper::BoundParamsList;
+ static_assert(internal::AssertBindArgsValidity<
+- std::make_index_sequence<Helper::num_bounds>, BoundArgsList,
++ tao::seq::make_index_sequence<Helper::num_bounds>, BoundArgsList,
+ UnwrappedArgsList, BoundParamsList>::ok,
+ "The bound args need to be convertible to the target params.");
+
+@@ -197,7 +199,7 @@ template <typename Functor, typename...
+ inline RepeatingCallback<MakeUnboundRunType<Functor, Args...>>
+ BindRepeating(Functor&& functor, Args&&... args) {
+ static_assert(
+- !internal::IsOnceCallback<std::decay_t<Functor>>(),
++ !internal::IsOnceCallback<typename std::decay<Functor>::type>(),
+ "BindRepeating cannot bind OnceCallback. Use BindOnce with std::move().");
+
+ // This block checks if each |args| matches to the corresponding params of the
+@@ -211,7 +213,7 @@ BindRepeating(Functor&& functor, Args&&.
+ Args&&...>;
+ using BoundParamsList = typename Helper::BoundParamsList;
+ static_assert(internal::AssertBindArgsValidity<
+- std::make_index_sequence<Helper::num_bounds>, BoundArgsList,
++ tao::seq::make_index_sequence<Helper::num_bounds>, BoundArgsList,
+ UnwrappedArgsList, BoundParamsList>::ok,
+ "The bound args need to be convertible to the target params.");
+
+diff -up chromium-62.0.3202.62/base/bind_internal.h.epel7-c++11 chromium-62.0.3202.62/base/bind_internal.h
+--- chromium-62.0.3202.62/base/bind_internal.h.epel7-c++11 2017-10-25 08:52:20.018873878 -0400
++++ chromium-62.0.3202.62/base/bind_internal.h 2017-10-25 10:14:03.619256659 -0400
+@@ -15,6 +15,8 @@
+ #include "base/memory/raw_scoped_refptr_mismatch_checker.h"
+ #include "base/memory/weak_ptr.h"
+ #include "base/template_util.h"
++#include "third_party/tao/seq/integer_sequence.hpp"
++#include "third_party/tao/seq/make_integer_sequence.hpp"
+ #include "build/build_config.h"
+
+ namespace base {
+@@ -98,9 +100,9 @@ struct HasRefCountedTypeAsRawPtr : std::
+ // parameters recursively.
+ template <typename T, typename... Args>
+ struct HasRefCountedTypeAsRawPtr<T, Args...>
+- : std::conditional_t<NeedsScopedRefptrButGetsRawPtr<T>::value,
++ : typedef std::conditional<NeedsScopedRefptrButGetsRawPtr<T>::value,
+ std::true_type,
+- HasRefCountedTypeAsRawPtr<Args...>> {};
++ HasRefCountedTypeAsRawPtr<Args...>::type> {};
+
+ // ForceVoidReturn<>
+ //
+@@ -125,7 +127,7 @@ struct FunctorTraits;
+ // to the function type while capturing lambdas can't.
+ template <typename Functor>
+ struct FunctorTraits<Functor,
+- std::enable_if_t<IsConvertibleToRunType<Functor>::value>> {
++ typename std::enable_if<IsConvertibleToRunType<Functor>::value>::type> {
+ using RunType = ExtractCallableRunType<Functor>;
+ static constexpr bool is_method = false;
+ static constexpr bool is_nullable = false;
+@@ -256,7 +258,7 @@ struct FunctorTraits<RepeatingCallback<R
+ };
+
+ template <typename Functor>
+-using MakeFunctorTraits = FunctorTraits<std::decay_t<Functor>>;
++using MakeFunctorTraits = FunctorTraits<typename std::decay<Functor>::type>;
+
+ // InvokeHelper<>
+ //
+@@ -317,7 +319,7 @@ struct Invoker<StorageType, R(UnboundArg
+ std::tuple_size<decltype(storage->bound_args_)>::value;
+ return RunImpl(std::move(storage->functor_),
+ std::move(storage->bound_args_),
+- std::make_index_sequence<num_bound_args>(),
++ tao::seq::make_index_sequence<num_bound_args>(),
+ std::forward<UnboundArgs>(unbound_args)...);
+ }
+
+@@ -329,7 +331,7 @@ struct Invoker<StorageType, R(UnboundArg
+ static constexpr size_t num_bound_args =
+ std::tuple_size<decltype(storage->bound_args_)>::value;
+ return RunImpl(storage->functor_, storage->bound_args_,
+- std::make_index_sequence<num_bound_args>(),
++ tao::seq::make_index_sequence<num_bound_args>(),
+ std::forward<UnboundArgs>(unbound_args)...);
+ }
+
+@@ -337,11 +339,11 @@ struct Invoker<StorageType, R(UnboundArg
+ template <typename Functor, typename BoundArgsTuple, size_t... indices>
+ static inline R RunImpl(Functor&& functor,
+ BoundArgsTuple&& bound,
+- std::index_sequence<indices...>,
++ tao::seq::index_sequence<indices...>,
+ UnboundArgs&&... unbound_args) {
+ static constexpr bool is_method = MakeFunctorTraits<Functor>::is_method;
+
+- using DecayedArgsTuple = std::decay_t<BoundArgsTuple>;
++ using DecayedArgsTuple = typename std::decay<BoundArgsTuple>::type;
+ static constexpr bool is_weak_call =
+ IsWeakMethod<is_method,
+ std::tuple_element_t<indices, DecayedArgsTuple>...>();
+@@ -383,13 +385,13 @@ struct BindTypeHelper {
+ };
+
+ template <typename Functor>
+-std::enable_if_t<FunctorTraits<Functor>::is_nullable, bool> IsNull(
++typename std::enable_if<FunctorTraits<Functor>::is_nullable, bool>::type IsNull(
+ const Functor& functor) {
+ return !functor;
+ }
+
+ template <typename Functor>
+-std::enable_if_t<!FunctorTraits<Functor>::is_nullable, bool> IsNull(
++typename std::enable_if<!FunctorTraits<Functor>::is_nullable, bool>::type IsNull(
+ const Functor&) {
+ return false;
+ }
+@@ -398,7 +400,7 @@ std::enable_if_t<!FunctorTraits<Functor>
+ template <typename Functor, typename BoundArgsTuple, size_t... indices>
+ bool ApplyCancellationTraitsImpl(const Functor& functor,
+ const BoundArgsTuple& bound_args,
+- std::index_sequence<indices...>) {
++ tao::seq::index_sequence<indices...>) {
+ return CallbackCancellationTraits<Functor, BoundArgsTuple>::IsCancelled(
+ functor, std::get<indices>(bound_args)...);
+ }
+@@ -412,7 +414,7 @@ bool ApplyCancellationTraits(const BindS
+ std::tuple_size<decltype(storage->bound_args_)>::value;
+ return ApplyCancellationTraitsImpl(
+ storage->functor_, storage->bound_args_,
+- std::make_index_sequence<num_bound_args>());
++ tao::seq::make_index_sequence<num_bound_args>());
+ };
+
+ // BindState<>
+@@ -479,33 +481,33 @@ struct MakeBindStateTypeImpl;
+
+ template <typename Functor, typename... BoundArgs>
+ struct MakeBindStateTypeImpl<false, Functor, BoundArgs...> {
+- static_assert(!HasRefCountedTypeAsRawPtr<std::decay_t<BoundArgs>...>::value,
++ static_assert(!HasRefCountedTypeAsRawPtr<typename std::decay<BoundArgs>::type...>::value,
+ "A parameter is a refcounted type and needs scoped_refptr.");
+- using Type = BindState<std::decay_t<Functor>, std::decay_t<BoundArgs>...>;
++ using Type = BindState<typename std::decay<Functor>::type, typename std::decay<BoundArgs>::type...>;
+ };
+
+ template <typename Functor>
+ struct MakeBindStateTypeImpl<true, Functor> {
+- using Type = BindState<std::decay_t<Functor>>;
++ using Type = BindState<typename std::decay<Functor>::type>;
+ };
+
+ template <typename Functor, typename Receiver, typename... BoundArgs>
+ struct MakeBindStateTypeImpl<true, Functor, Receiver, BoundArgs...> {
+ static_assert(!std::is_array<std::remove_reference_t<Receiver>>::value,
+ "First bound argument to a method cannot be an array.");
+- static_assert(!HasRefCountedTypeAsRawPtr<std::decay_t<BoundArgs>...>::value,
++ static_assert(!HasRefCountedTypeAsRawPtr<typename std::decay<BoundArgs>::type...>::value,
+ "A parameter is a refcounted type and needs scoped_refptr.");
+
+ private:
+- using DecayedReceiver = std::decay_t<Receiver>;
++ using DecayedReceiver = typename std::decay<Receiver>::type;
+
+ public:
+ using Type = BindState<
+- std::decay_t<Functor>,
+- std::conditional_t<std::is_pointer<DecayedReceiver>::value,
++ typename std::decay<Functor>::type,
++ typename std::conditional<std::is_pointer<DecayedReceiver>::value,
+ scoped_refptr<std::remove_pointer_t<DecayedReceiver>>,
+- DecayedReceiver>,
+- std::decay_t<BoundArgs>...>;
++ DecayedReceiver>::type,
++ typename std::decay<BoundArgs>::type...>;
+ };
+
+ template <typename Functor, typename... BoundArgs>
+diff -up chromium-62.0.3202.62/base/containers/span.h.epel7-c++11 chromium-62.0.3202.62/base/containers/span.h
+--- chromium-62.0.3202.62/base/containers/span.h.epel7-c++11 2017-10-25 08:51:25.260372472 -0400
++++ chromium-62.0.3202.62/base/containers/span.h 2017-10-25 09:13:53.035964265 -0400
+@@ -27,7 +27,7 @@ template <typename T>
+ struct IsSpanImpl<span<T>> : std::true_type {};
+
+ template <typename T>
+-using IsSpan = IsSpanImpl<std::decay_t<T>>;
++using IsSpan = IsSpanImpl<typename std::decay<T>::type>;
+
+ template <typename T>
+ struct IsStdArrayImpl : std::false_type {};
+@@ -36,7 +36,7 @@ template <typename T, size_t N>
+ struct IsStdArrayImpl<std::array<T, N>> : std::true_type {};
+
+ template <typename T>
+-using IsStdArray = IsStdArrayImpl<std::decay_t<T>>;
++using IsStdArray = IsStdArrayImpl<typename std::decay<T>::type>;
+
+ template <typename From, typename To>
+ using IsLegalSpanConversion = std::is_convertible<From*, To*>;
+@@ -51,7 +51,7 @@ using ContainerHasIntegralSize =
+
+ template <typename From, typename To>
+ using EnableIfLegalSpanConversion =
+- std::enable_if_t<IsLegalSpanConversion<From, To>::value>;
++ typename std::enable_if<IsLegalSpanConversion<From, To>::value>::type;
+
+ // SFINAE check if Container can be converted to a span<T>. Note that the
+ // implementation details of this check differ slightly from the requirements in
+@@ -67,18 +67,18 @@ using EnableIfLegalSpanConversion =
+ // container.
+ template <typename Container, typename T>
+ using EnableIfSpanCompatibleContainer =
+- std::enable_if_t<!internal::IsSpan<Container>::value &&
++ typename std::enable_if<!internal::IsSpan<Container>::value &&
+ !internal::IsStdArray<Container>::value &&
+ ContainerHasConvertibleData<Container, T>::value &&
+- ContainerHasIntegralSize<Container>::value>;
++ ContainerHasIntegralSize<Container>::value>::type;
+
+ template <typename Container, typename T>
+ using EnableIfConstSpanCompatibleContainer =
+- std::enable_if_t<std::is_const<T>::value &&
++ typename std::enable_if<std::is_const<T>::value &&
+ !internal::IsSpan<Container>::value &&
+ !internal::IsStdArray<Container>::value &&
+ ContainerHasConvertibleData<Container, T>::value &&
+- ContainerHasIntegralSize<Container>::value>;
++ ContainerHasIntegralSize<Container>::value>::type;
+
+ } // namespace internal
+
+diff -up chromium-62.0.3202.62/base/tuple.h.epel7-c++11 chromium-62.0.3202.62/base/tuple.h
+--- chromium-62.0.3202.62/base/tuple.h.epel7-c++11 2017-10-25 10:09:22.986397329 -0400
++++ chromium-62.0.3202.62/base/tuple.h 2017-10-25 10:11:00.392571745 -0400
+@@ -29,6 +29,7 @@
+ #include <tuple>
+ #include <utility>
+
++#include "third_party/tao/seq/integer_sequence.hpp"
+ #include "build/build_config.h"
+
+ namespace base {
+@@ -52,7 +53,7 @@ template <typename ObjT, typename Method
+ inline void DispatchToMethodImpl(const ObjT& obj,
+ Method method,
+ Tuple&& args,
+- std::index_sequence<Ns...>) {
++ tao::seq::index_sequence<Ns...>) {
+ (obj->*method)(std::get<Ns>(std::forward<Tuple>(args))...);
+ }
+
+@@ -69,7 +70,7 @@ inline void DispatchToMethod(const ObjT&
+ template <typename Function, typename Tuple, size_t... Ns>
+ inline void DispatchToFunctionImpl(Function function,
+ Tuple&& args,
+- std::index_sequence<Ns...>) {
++ tao::seq::index_sequence<Ns...>) {
+ (*function)(std::get<Ns>(std::forward<Tuple>(args))...);
+ }
+
+@@ -91,8 +92,8 @@ inline void DispatchToMethodImpl(const O
+ Method method,
+ InTuple&& in,
+ OutTuple* out,
+- std::index_sequence<InNs...>,
+- std::index_sequence<OutNs...>) {
++ tao::seq::index_sequence<InNs...>,
++ tao::seq::index_sequence<OutNs...>) {
+ (obj->*method)(std::get<InNs>(std::forward<InTuple>(in))...,
+ &std::get<OutNs>(*out)...);
+ }
+diff -up chromium-62.0.3202.62/components/login/base_screen_handler_utils.h.epel7-c++11 chromium-62.0.3202.62/components/login/base_screen_handler_utils.h
+--- chromium-62.0.3202.62/components/login/base_screen_handler_utils.h.epel7-c++11 2017-10-25 10:14:43.493099988 -0400
++++ chromium-62.0.3202.62/components/login/base_screen_handler_utils.h 2017-10-25 10:15:17.679108311 -0400
+@@ -17,6 +17,7 @@
+ #include "base/values.h"
+ #include "components/login/login_export.h"
+ #include "components/signin/core/account_id/account_id.h"
++#include "third_party/tao/seq/integer_sequence.hpp"
+
+ namespace login {
+
+@@ -86,7 +87,7 @@ typename UnwrapConstRef<Arg>::Type Parse
+ template <typename... Args, size_t... Ns>
+ inline void DispatchToCallback(const base::Callback<void(Args...)>& callback,
+ const base::ListValue* args,
+- std::index_sequence<Ns...> indexes) {
++ tao::seq::index_sequence<Ns...> indexes) {
+ DCHECK(args);
+ DCHECK_EQ(sizeof...(Args), args->GetSize());
+
+@@ -96,7 +97,7 @@ inline void DispatchToCallback(const bas
+ template <typename... Args>
+ void CallbackWrapper(const base::Callback<void(Args...)>& callback,
+ const base::ListValue* args) {
+- DispatchToCallback(callback, args, std::index_sequence_for<Args...>());
++ DispatchToCallback(callback, args, tao::seq::index_sequence_for<Args...>());
+ }
+
+
+diff -up chromium-62.0.3202.62/ipc/ipc_message_templates.h.epel7-c++11 chromium-62.0.3202.62/ipc/ipc_message_templates.h
+--- chromium-62.0.3202.62/ipc/ipc_message_templates.h.epel7-c++11 2017-10-25 09:15:02.382879317 -0400
++++ chromium-62.0.3202.62/ipc/ipc_message_templates.h 2017-10-25 10:16:41.889665510 -0400
+@@ -17,11 +17,13 @@
+ #include "build/build_config.h"
+ #include "ipc/ipc_message.h"
+ #include "ipc/ipc_message_utils.h"
++#include "third_party/tao/seq/integer_sequence.hpp"
++#include "third_party/tao/seq/make_integer_sequence.hpp"
+
+ namespace IPC {
+
+ template <typename Tuple, size_t... Ns>
+-auto TupleForwardImpl(Tuple&& tuple, std::index_sequence<Ns...>) -> decltype(
++auto TupleForwardImpl(Tuple&& tuple, tao::seq::index_sequence<Ns...>) -> decltype(
+ std::forward_as_tuple(std::get<Ns>(std::forward<Tuple>(tuple))...)) {
+ return std::forward_as_tuple(std::get<Ns>(std::forward<Tuple>(tuple))...);
+ }
+@@ -38,10 +40,10 @@ auto TupleForwardImpl(Tuple&& tuple, std
+ template <typename Tuple>
+ auto TupleForward(Tuple&& tuple) -> decltype(TupleForwardImpl(
+ std::forward<Tuple>(tuple),
+- std::make_index_sequence<std::tuple_size<std::decay_t<Tuple>>::value>())) {
++ tao::seq::make_index_sequence<std::tuple_size<std::decay_t<Tuple>>::value>())) {
+ return TupleForwardImpl(
+ std::forward<Tuple>(tuple),
+- std::make_index_sequence<std::tuple_size<std::decay_t<Tuple>>::value>());
++ tao::seq::make_index_sequence<std::tuple_size<std::decay_t<Tuple>>::value>());
+ }
+
+ // This function is for all the async IPCs that don't pass an extra parameter
+@@ -60,21 +62,21 @@ void DispatchToMethodImpl(ObjT* obj,
+ Method method,
+ P* parameter,
+ Tuple&& tuple,
+- std::index_sequence<Ns...>) {
++ tao::seq::index_sequence<Ns...>) {
+ (obj->*method)(parameter, std::get<Ns>(std::forward<Tuple>(tuple))...);
+ }
+
+ // The following function is for async IPCs which have a dispatcher with an
+ // extra parameter specified using IPC_BEGIN_MESSAGE_MAP_WITH_PARAM.
+ template <typename ObjT, typename P, typename... Args, typename Tuple>
+-std::enable_if_t<sizeof...(Args) == std::tuple_size<std::decay_t<Tuple>>::value>
++typename std::enable_if<sizeof...(Args) == std::tuple_size<std::decay_t<Tuple>>::value>::type
+ DispatchToMethod(ObjT* obj,
+ void (ObjT::*method)(P*, Args...),
+ P* parameter,
+ Tuple&& tuple) {
+ constexpr size_t size = std::tuple_size<std::decay_t<Tuple>>::value;
+ DispatchToMethodImpl(obj, method, parameter, std::forward<Tuple>(tuple),
+- std::make_index_sequence<size>());
++ tao::seq::make_index_sequence<size>());
+ }
+
+ enum class MessageKind {
+diff -up chromium-62.0.3202.62/ppapi/proxy/dispatch_reply_message.h.epel7-c++11 chromium-62.0.3202.62/ppapi/proxy/dispatch_reply_message.h
+--- chromium-62.0.3202.62/ppapi/proxy/dispatch_reply_message.h.epel7-c++11 2017-10-25 10:16:53.888317449 -0400
++++ chromium-62.0.3202.62/ppapi/proxy/dispatch_reply_message.h 2017-10-25 10:17:50.152688363 -0400
+@@ -17,6 +17,7 @@
+ #include "base/tuple.h"
+ #include "ipc/ipc_message_macros.h"
+ #include "ppapi/c/pp_errors.h"
++#include "third_party/tao/seq/integer_sequence.hpp"
+
+ namespace ppapi {
+ namespace proxy {
+@@ -28,7 +29,7 @@ inline void DispatchResourceReplyImpl(Ob
+ Method method,
+ const ResourceMessageReplyParams& params,
+ TupleType&& args_tuple,
+- std::index_sequence<indices...>) {
++ tao::seq::index_sequence<indices...>) {
+ (obj->*method)(params,
+ std::get<indices>(std::forward<TupleType>(args_tuple))...);
+ }
+@@ -51,7 +52,7 @@ template <typename CallbackType, typenam
+ inline void DispatchResourceReplyImpl(CallbackType&& callback,
+ const ResourceMessageReplyParams& params,
+ TupleType&& args_tuple,
+- std::index_sequence<indices...>) {
++ tao::seq::index_sequence<indices...>) {
+ std::forward<CallbackType>(callback).Run(
+ params, std::get<indices>(std::forward<TupleType>(args_tuple))...);
+ }
+diff -up chromium-62.0.3202.62/third_party/tao/seq/at_index.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/at_index.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/at_index.hpp.epel7-c++11 2017-10-25 10:08:42.418574130 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/at_index.hpp 2017-10-25 10:05:28.328204354 -0400
+@@ -0,0 +1,60 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_AT_INDEX_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_AT_INDEX_HPP
++
++#include <cstddef>
++
++#include "make_integer_sequence.hpp"
++
++namespace tao
++{
++ namespace seq
++ {
++ // based on http://talesofcpp.fusionfenix.com/post-22/true-story-efficient-packing
++
++ namespace impl
++ {
++ template< std::size_t, typename T >
++ struct indexed
++ {
++ using type = T;
++ };
++
++ template< typename, typename... Ts >
++ struct indexer;
++
++ template< std::size_t... Is, typename... Ts >
++ struct indexer< index_sequence< Is... >, Ts... >
++ : indexed< Is, Ts >...
++ {
++ };
++
++ template< std::size_t I, typename T >
++ indexed< I, T > select( const indexed< I, T >& );
++ }
++
++ template< std::size_t I, typename... Ts >
++ using at_index = decltype( impl::select< I >( impl::indexer< index_sequence_for< Ts... >, Ts... >() ) );
++
++#ifndef _MSC_VER
++ template< std::size_t I, typename... Ts >
++ using at_index_t = typename at_index< I, Ts... >::type;
++#else
++ namespace impl
++ {
++ template< typename T >
++ struct get_type
++ {
++ using type = typename T::type;
++ };
++ }
++
++ template< std::size_t I, typename... Ts >
++ using at_index_t = typename impl::get_type< at_index< I, Ts... > >::type;
++#endif
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_AT_INDEX_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/concatenate.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/concatenate.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/concatenate.hpp.epel7-c++11 2017-10-25 10:08:42.422574014 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/concatenate.hpp 2017-10-25 10:05:28.328204354 -0400
+@@ -0,0 +1,29 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_CONCATENATE_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_CONCATENATE_HPP
++
++#include <type_traits>
++
++#include "integer_sequence.hpp"
++
++namespace tao
++{
++ namespace seq
++ {
++ template< typename, typename >
++ struct concatenate;
++
++ template< typename TA, TA... As, typename TB, TB... Bs >
++ struct concatenate< integer_sequence< TA, As... >, integer_sequence< TB, Bs... > >
++ {
++ using type = integer_sequence< typename std::common_type< TA, TB >::type, As..., Bs... >;
++ };
++
++ template< typename A, typename B >
++ using concatenate_t = typename concatenate< A, B >::type;
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_CONCATENATE_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/config.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/config.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/config.hpp.epel7-c++11 2017-10-25 10:08:42.428573840 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/config.hpp 2017-10-25 10:05:28.328204354 -0400
+@@ -0,0 +1,25 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_CONFIG_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_CONFIG_HPP
++
++#if __cplusplus >= 201402L
++
++#define TAOCPP_USE_STD_INTEGER_SEQUENCE
++
++#if defined( _LIBCPP_VERSION )
++#define TAOCPP_USE_STD_MAKE_INTEGER_SEQUENCE
++#elif defined( _GLIBCXX_RELEASE ) && ( _GLIBCXX_RELEASE >= 8 )
++#define TAOCPP_USE_STD_MAKE_INTEGER_SEQUENCE
++#elif defined( _MSC_VER ) && ( _MSC_VER >= 190023918 )
++#define TAOCPP_USE_STD_MAKE_INTEGER_SEQUENCE
++#endif
++
++#endif // __cplusplus >= 201402L
++
++#if defined( __cpp_fold_expressions )
++#define TAOCPP_FOLD_EXPRESSIONS
++#endif
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_CONFIG_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/exclusive_scan.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/exclusive_scan.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/exclusive_scan.hpp.epel7-c++11 2017-10-25 10:08:42.429573811 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/exclusive_scan.hpp 2017-10-25 10:05:28.328204354 -0400
+@@ -0,0 +1,45 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_EXCLUSIVE_SCAN_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_EXCLUSIVE_SCAN_HPP
++
++#include <utility>
++
++#include "make_integer_sequence.hpp"
++#include "partial_sum.hpp"
++
++namespace tao
++{
++ namespace seq
++ {
++ namespace impl
++ {
++ template< typename S, typename = make_index_sequence< S::size() > >
++ struct exclusive_scan;
++
++ template< typename S, std::size_t... Is >
++ struct exclusive_scan< S, index_sequence< Is... > >
++ {
++ using type = integer_sequence< typename S::value_type, partial_sum< Is, S >::value... >;
++ };
++ }
++
++ template< typename T, T... Ns >
++ struct exclusive_scan
++ : impl::exclusive_scan< integer_sequence< T, Ns... > >
++ {
++ };
++
++ template< typename T, T... Ns >
++ struct exclusive_scan< integer_sequence< T, Ns... > >
++ : impl::exclusive_scan< integer_sequence< T, Ns... > >
++ {
++ };
++
++ template< typename T, T... Ns >
++ using exclusive_scan_t = typename exclusive_scan< T, Ns... >::type;
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_EXCLUSIVE_SCAN_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/fold.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/fold.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/fold.hpp.epel7-c++11 2017-10-25 10:08:42.430573782 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/fold.hpp 2017-10-25 10:05:28.328204354 -0400
+@@ -0,0 +1,58 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_FOLD_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_FOLD_HPP
++
++#include <type_traits>
++
++#include "integer_sequence.hpp"
++#include "make_integer_sequence.hpp"
++#include "select.hpp"
++
++namespace tao
++{
++ namespace seq
++ {
++ namespace impl
++ {
++ template< template< typename U, U, U > class, typename, bool, typename T, T... >
++ struct folder;
++
++ template< template< typename U, U, U > class OP, std::size_t... Is, typename T, T... Ns >
++ struct folder< OP, index_sequence< Is... >, false, T, Ns... >
++ {
++ using type = integer_sequence< T, OP< T, seq::select< 2 * Is, T, Ns... >::value, seq::select< 2 * Is + 1, T, Ns... >::value >::value... >;
++ };
++
++ template< template< typename U, U, U > class OP, std::size_t... Is, typename T, T N, T... Ns >
++ struct folder< OP, index_sequence< Is... >, true, T, N, Ns... >
++ {
++ using type = integer_sequence< T, N, OP< T, seq::select< 2 * Is, T, Ns... >::value, seq::select< 2 * Is + 1, T, Ns... >::value >::value... >;
++ };
++ }
++
++ template< template< typename U, U, U > class, typename T, T... >
++ struct fold;
++
++ template< template< typename U, U, U > class OP, typename T, T N >
++ struct fold< OP, T, N >
++ : std::integral_constant< T, N >
++ {
++ };
++
++ template< template< typename U, U, U > class OP, typename T, T... Ns >
++ struct fold
++ : fold< OP, typename impl::folder< OP, make_index_sequence< sizeof...( Ns ) / 2 >, sizeof...( Ns ) % 2 == 1, T, Ns... >::type >
++ {
++ };
++
++ template< template< typename U, U, U > class OP, typename T, T... Ns >
++ struct fold< OP, integer_sequence< T, Ns... > >
++ : fold< OP, T, Ns... >
++ {
++ };
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_FOLD_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/head.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/head.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/head.hpp.epel7-c++11 2017-10-25 10:08:42.431573753 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/head.hpp 2017-10-25 10:05:28.328204354 -0400
+@@ -0,0 +1,32 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_HEAD_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_HEAD_HPP
++
++#include <type_traits>
++
++#include "integer_sequence.hpp"
++
++namespace tao
++{
++ namespace seq
++ {
++ template< typename T, T... Ns >
++ struct head;
++
++ template< typename T, T N, T... Ns >
++ struct head< T, N, Ns... >
++ : std::integral_constant< T, N >
++ {
++ };
++
++ template< typename T, T... Ns >
++ struct head< integer_sequence< T, Ns... > >
++ : head< T, Ns... >
++ {
++ };
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_HEAD_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/inclusive_scan.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/inclusive_scan.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/inclusive_scan.hpp.epel7-c++11 2017-10-25 10:08:42.432573724 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/inclusive_scan.hpp 2017-10-25 10:05:28.328204354 -0400
+@@ -0,0 +1,34 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_INCLUSIVE_SCAN_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_INCLUSIVE_SCAN_HPP
++
++#include <utility>
++
++#include "exclusive_scan.hpp"
++#include "integer_sequence.hpp"
++#include "plus.hpp"
++
++namespace tao
++{
++ namespace seq
++ {
++ template< typename T, T... Ns >
++ struct inclusive_scan
++ : plus< exclusive_scan_t< T, Ns... >, integer_sequence< T, Ns... > >
++ {
++ };
++
++ template< typename T, T... Ns >
++ struct inclusive_scan< integer_sequence< T, Ns... > >
++ : plus< exclusive_scan_t< integer_sequence< T, Ns... > >, integer_sequence< T, Ns... > >
++ {
++ };
++
++ template< typename T, T... Ns >
++ using inclusive_scan_t = typename inclusive_scan< T, Ns... >::type;
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_INCLUSIVE_SCAN_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/integer_sequence.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/integer_sequence.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/integer_sequence.hpp.epel7-c++11 2017-10-25 10:08:42.433573695 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/integer_sequence.hpp 2017-10-25 10:05:28.328204354 -0400
+@@ -0,0 +1,42 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_INTEGER_SEQUENCE_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_INTEGER_SEQUENCE_HPP
++
++#include <cstddef>
++#include <utility>
++
++#include "config.hpp"
++
++namespace tao
++{
++ namespace seq
++ {
++
++#ifdef TAOCPP_USE_STD_INTEGER_SEQUENCE
++
++ using std::integer_sequence;
++ using std::index_sequence;
++
++#else
++
++ template< typename T, T... Ns >
++ struct integer_sequence
++ {
++ using value_type = T;
++
++ static constexpr std::size_t size() noexcept
++ {
++ return sizeof...( Ns );
++ }
++ };
++
++ template< std::size_t... Ns >
++ using index_sequence = integer_sequence< std::size_t, Ns... >;
++
++#endif
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_INTEGER_SEQUENCE_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/is_all.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/is_all.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/is_all.hpp.epel7-c++11 2017-10-25 10:08:42.433573695 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/is_all.hpp 2017-10-25 10:05:28.328204354 -0400
+@@ -0,0 +1,34 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_IS_ALL_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_IS_ALL_HPP
++
++#include "config.hpp"
++
++#ifndef TAOCPP_FOLD_EXPRESSIONS
++#include "integer_sequence.hpp"
++#endif
++
++#include <type_traits>
++
++namespace tao
++{
++ namespace seq
++ {
++
++#ifdef TAOCPP_FOLD_EXPRESSIONS
++
++ template< bool... Bs >
++ using is_all = std::integral_constant< bool, ( Bs && ... ) >;
++
++#else
++
++ template< bool... Bs >
++ using is_all = std::integral_constant< bool, std::is_same< integer_sequence< bool, true, Bs... >, integer_sequence< bool, Bs..., true > >::value >;
++
++#endif
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_IS_ALL_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/is_any.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/is_any.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/is_any.hpp.epel7-c++11 2017-10-25 10:08:42.434573666 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/is_any.hpp 2017-10-25 10:05:28.328204354 -0400
+@@ -0,0 +1,34 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_IS_ANY_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_IS_ANY_HPP
++
++#include "config.hpp"
++
++#ifndef TAOCPP_FOLD_EXPRESSIONS
++#include "is_all.hpp"
++#endif
++
++#include <type_traits>
++
++namespace tao
++{
++ namespace seq
++ {
++
++#ifdef TAOCPP_FOLD_EXPRESSIONS
++
++ template< bool... Bs >
++ using is_any = std::integral_constant< bool, ( Bs || ... ) >;
++
++#else
++
++ template< bool... Bs >
++ using is_any = std::integral_constant< bool, !is_all< !Bs... >::value >;
++
++#endif
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_IS_ANY_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/LICENSE.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/LICENSE
+--- chromium-62.0.3202.62/third_party/tao/seq/LICENSE.epel7-c++11 2017-10-25 10:08:42.435573638 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/LICENSE 2017-10-25 10:05:28.327204383 -0400
+@@ -0,0 +1,22 @@
++The MIT License (MIT)
++
++Copyright (c) 2015-2017 Daniel Frey
++
++Permission is hereby granted, free of charge, to any person obtaining a copy
++of this software and associated documentation files (the "Software"), to deal
++in the Software without restriction, including without limitation the rights
++to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++copies of the Software, and to permit persons to whom the Software is
++furnished to do so, subject to the following conditions:
++
++The above copyright notice and this permission notice shall be included in all
++copies or substantial portions of the Software.
++
++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 AND NONINFRINGEMENT. IN NO EVENT SHALL THE
++AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
++SOFTWARE.
++
+diff -up chromium-62.0.3202.62/third_party/tao/seq/make_integer_range.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/make_integer_range.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/make_integer_range.hpp.epel7-c++11 2017-10-25 10:08:42.435573638 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/make_integer_range.hpp 2017-10-25 10:05:28.328204354 -0400
+@@ -0,0 +1,39 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_MAKE_INTEGER_RANGE_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_MAKE_INTEGER_RANGE_HPP
++
++#include "make_integer_sequence.hpp"
++
++namespace tao
++{
++ namespace seq
++ {
++ namespace impl
++ {
++ template< typename T, T Begin, T Steps, bool Increase, T Delta = T( 1 ), typename = make_integer_sequence< T, Steps > >
++ struct generate_range;
++
++ template< typename T, T B, T S, T D, T... Ns >
++ struct generate_range< T, B, S, true, D, integer_sequence< T, Ns... > >
++ {
++ using type = integer_sequence< T, B + D * Ns... >;
++ };
++
++ template< typename T, T B, T S, T D, T... Ns >
++ struct generate_range< T, B, S, false, D, integer_sequence< T, Ns... > >
++ {
++ using type = integer_sequence< T, B - D * Ns... >;
++ };
++ }
++
++ template< typename T, T N, T M >
++ using make_integer_range = typename impl::generate_range< T, N, ( N <= M ) ? ( M - N ) : ( N - M ), ( N <= M ) >::type;
++
++ template< std::size_t N, std::size_t M >
++ using make_index_range = make_integer_range< std::size_t, N, M >;
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_MAKE_INTEGER_RANGE_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/make_integer_sequence.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/make_integer_sequence.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/make_integer_sequence.hpp.epel7-c++11 2017-10-25 10:08:42.436573608 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/make_integer_sequence.hpp 2017-10-25 10:05:28.328204354 -0400
+@@ -0,0 +1,87 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_MAKE_INTEGER_SEQUENCE_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_MAKE_INTEGER_SEQUENCE_HPP
++
++#include <cstddef>
++#include <type_traits>
++#include <utility>
++
++#include "config.hpp"
++#include "integer_sequence.hpp"
++
++namespace tao
++{
++ namespace seq
++ {
++
++#ifdef TAOCPP_USE_STD_MAKE_INTEGER_SEQUENCE
++
++ using std::make_integer_sequence;
++ using std::make_index_sequence;
++ using std::index_sequence_for;
++
++#else
++
++ namespace impl
++ {
++ // we have four instantiations of generate_sequence<>, independent of T or N.
++ // V is the current bit, E is the end marker - if true, this is the last step.
++ template< bool V, bool E >
++ struct generate_sequence;
++
++ // last step: generate final integer sequence
++ template<>
++ struct generate_sequence< false, true >
++ {
++ template< typename T, T M, T N, std::size_t S, T... Ns >
++ using f = integer_sequence< T, Ns... >;
++ };
++
++ template<>
++ struct generate_sequence< true, true >
++ {
++ template< typename T, T M, T N, std::size_t S, T... Ns >
++ using f = integer_sequence< T, Ns..., S >;
++ };
++
++ // intermediate step: double existing values, append one more if V is set.
++ template<>
++ struct generate_sequence< false, false >
++ {
++ template< typename T, T M, T N, std::size_t S, T... Ns >
++ using f = typename generate_sequence< ( N & ( M / 2 ) ) != 0, ( M / 2 ) == 0 >::template f< T, M / 2, N, 2 * S, Ns..., ( Ns + S )... >;
++ };
++
++ template<>
++ struct generate_sequence< true, false >
++ {
++ template< typename T, T M, T N, std::size_t S, T... Ns >
++ using f = typename generate_sequence< ( N & ( M / 2 ) ) != 0, ( M / 2 ) == 0 >::template f< T, M / 2, N, 2 * S + 1, Ns..., ( Ns + S )..., 2 * S >;
++ };
++
++ // the final sequence per T/N should be memoized, it will probably be used multiple times.
++ // also checks the limit and starts the above generator properly.
++ template< typename T, T N >
++ struct memoize_sequence
++ {
++ static_assert( N < T( 1 << 20 ), "N too large" );
++ using type = typename generate_sequence< false, false >::template f< T, ( N < T( 1 << 1 ) ) ? T( 1 << 1 ) : ( N < T( 1 << 2 ) ) ? T( 1 << 2 ) : ( N < T( 1 << 3 ) ) ? T( 1 << 3 ) : ( N < T( 1 << 4 ) ) ? T( 1 << 4 ) : ( N < T( 1 << 5 ) ) ? T( 1 << 5 ) : ( N < T( 1 << 6 ) ) ? T( 1 << 6 ) : ( N < T( 1 << 7 ) ) ? T( 1 << 7 ) : ( N < T( 1 << 8 ) ) ? T( 1 << 8 ) : ( N < T( 1 << 9 ) ) ? T( 1 << 9 ) : ( N < T( 1 << 10 ) ) ? T( 1 << 10 ) : T( 1 << 20 ), N, 0 >;
++ };
++ }
++
++ template< typename T, T N >
++ using make_integer_sequence = typename impl::memoize_sequence< T, N >::type;
++
++ template< std::size_t N >
++ using make_index_sequence = make_integer_sequence< std::size_t, N >;
++
++ template< typename... Ts >
++ using index_sequence_for = make_index_sequence< sizeof...( Ts ) >;
++
++#endif
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_MAKE_INTEGER_SEQUENCE_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/map.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/map.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/map.hpp.epel7-c++11 2017-10-25 10:08:42.437573579 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/map.hpp 2017-10-25 10:05:28.328204354 -0400
+@@ -0,0 +1,31 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_MAP_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_MAP_HPP
++
++#include <cstddef>
++#include <utility>
++
++#include "integer_sequence.hpp"
++#include "select.hpp"
++
++namespace tao
++{
++ namespace seq
++ {
++ template< typename, typename >
++ struct map;
++
++ template< std::size_t... Ns, typename M >
++ struct map< index_sequence< Ns... >, M >
++ {
++ using type = integer_sequence< typename M::value_type, select< Ns, M >::value... >;
++ };
++
++ template< typename S, typename M >
++ using map_t = typename map< S, M >::type;
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_MAP_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/max.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/max.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/max.hpp.epel7-c++11 2017-10-25 10:08:42.437573579 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/max.hpp 2017-10-25 10:05:28.328204354 -0400
+@@ -0,0 +1,35 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_MAX_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_MAX_HPP
++
++#include "fold.hpp"
++
++#include <type_traits>
++
++namespace tao
++{
++ namespace seq
++ {
++ namespace impl
++ {
++ template< typename T, T A, T B >
++ using max = std::integral_constant< T, ( ( A > B ) ? A : B ) >;
++ }
++
++ template< typename T, T... Ns >
++ struct max
++ : fold< impl::max, T, Ns... >
++ {
++ };
++
++ template< typename T, T... Ns >
++ struct max< integer_sequence< T, Ns... > >
++ : max< T, Ns... >
++ {
++ };
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_MAX_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/min.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/min.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/min.hpp.epel7-c++11 2017-10-25 10:08:42.438573550 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/min.hpp 2017-10-25 10:05:28.328204354 -0400
+@@ -0,0 +1,35 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_MIN_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_MIN_HPP
++
++#include "fold.hpp"
++
++#include <type_traits>
++
++namespace tao
++{
++ namespace seq
++ {
++ namespace impl
++ {
++ template< typename T, T A, T B >
++ using min = std::integral_constant< T, ( ( A < B ) ? A : B ) >;
++ }
++
++ template< typename T, T... Ns >
++ struct min
++ : fold< impl::min, T, Ns... >
++ {
++ };
++
++ template< typename T, T... Ns >
++ struct min< integer_sequence< T, Ns... > >
++ : min< T, Ns... >
++ {
++ };
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_MIN_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/minus.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/minus.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/minus.hpp.epel7-c++11 2017-10-25 10:08:42.438573550 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/minus.hpp 2017-10-25 10:05:28.328204354 -0400
+@@ -0,0 +1,29 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_MINUS_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_MINUS_HPP
++
++#include <type_traits>
++
++#include "zip.hpp"
++
++namespace tao
++{
++ namespace seq
++ {
++ namespace impl
++ {
++ template< typename T, T A, T B >
++ using minus = std::integral_constant< T, A - B >;
++ }
++
++ template< typename A, typename B >
++ using minus = zip< impl::minus, A, B >;
++
++ template< typename A, typename B >
++ using minus_t = typename minus< A, B >::type;
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_MINUS_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/partial_sum.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/partial_sum.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/partial_sum.hpp.epel7-c++11 2017-10-25 10:08:42.439573522 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/partial_sum.hpp 2017-10-25 10:05:28.328204354 -0400
+@@ -0,0 +1,44 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_PARTIAL_SUM_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_PARTIAL_SUM_HPP
++
++#include <cstddef>
++#include <utility>
++
++#include "make_integer_sequence.hpp"
++#include "sum.hpp"
++
++namespace tao
++{
++ namespace seq
++ {
++ namespace impl
++ {
++ template< std::size_t, typename S, typename = make_index_sequence< S::size() > >
++ struct partial_sum;
++
++ template< std::size_t I, typename T, T... Ns, std::size_t... Is >
++ struct partial_sum< I, integer_sequence< T, Ns... >, index_sequence< Is... > >
++ : seq::sum< T, ( ( Is < I ) ? Ns : 0 )... >
++ {
++ static_assert( I <= sizeof...( Is ), "tao::seq::partial_sum<I, S>: I is out of range" );
++ };
++ }
++
++ template< std::size_t I, typename T, T... Ns >
++ struct partial_sum
++ : impl::partial_sum< I, integer_sequence< T, Ns... > >
++ {
++ };
++
++ template< std::size_t I, typename T, T... Ns >
++ struct partial_sum< I, integer_sequence< T, Ns... > >
++ : impl::partial_sum< I, integer_sequence< T, Ns... > >
++ {
++ };
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_PARTIAL_SUM_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/plus.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/plus.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/plus.hpp.epel7-c++11 2017-10-25 10:08:42.439573522 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/plus.hpp 2017-10-25 10:05:28.328204354 -0400
+@@ -0,0 +1,29 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_PLUS_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_PLUS_HPP
++
++#include <type_traits>
++
++#include "zip.hpp"
++
++namespace tao
++{
++ namespace seq
++ {
++ namespace impl
++ {
++ template< typename T, T A, T B >
++ using plus = std::integral_constant< T, A + B >;
++ }
++
++ template< typename A, typename B >
++ using plus = zip< impl::plus, A, B >;
++
++ template< typename A, typename B >
++ using plus_t = typename plus< A, B >::type;
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_PLUS_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/README.chromium.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/README.chromium
+--- chromium-62.0.3202.62/third_party/tao/seq/README.chromium.epel7-c++11 2017-10-25 10:08:42.440573492 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/README.chromium 2017-10-25 10:08:18.341272571 -0400
+@@ -0,0 +1,15 @@
++Name: The Art of C++ / Sequences
++Short Name: tao/seq
++URL: https://github.com/taocpp/sequences
++Version: 5fd5378
++License: MIT
++License File: LICENSE
++Security Critical: No
++
++Description:
++Source archive:
++ https://github.com/taocpp/sequences
++
++The Art of C++ / Sequences is a zero-dependency C++11 header-only library that provides efficient
++algorithms to generate and work on variadic templates and std::integer_sequence.
++We use it to support gcc 4.8.
+diff -up chromium-62.0.3202.62/third_party/tao/seq/README.md.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/README.md
+--- chromium-62.0.3202.62/third_party/tao/seq/README.md.epel7-c++11 2017-10-25 10:08:42.441573463 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/README.md 2017-10-25 10:05:28.327204383 -0400
+@@ -0,0 +1,282 @@
++# The Art of C++ / Sequences
++
++[![Release](https://img.shields.io/github/release/taocpp/sequences.svg)](https://github.com/taocpp/sequences/releases/latest)
++[![TravisCI](https://travis-ci.org/taocpp/sequences.svg)](https://travis-ci.org/taocpp/sequences)
++[![AppVeyor](https://ci.appveyor.com/api/projects/status/github/taocpp/sequences?svg=true)](https://ci.appveyor.com/project/taocpp/sequences)
++
++The Art of C++ / Sequences is a zero-dependency C++11 header-only library that provides efficient algorithms to generate and work on variadic templates and [`std::integer_sequence`](http://en.cppreference.com/w/cpp/utility/integer_sequence).
++
++## Compatibility
++
++* Requires C++11 or newer.
++* Tested with GCC 4.8+, Clang 3.4+, Xcode 6+ and Visual Studio 2017.
++
++The following compilers have bugs which prevent our code from compiling:
++
++* Clang 4.0.
++* Xcode 7 and 8 when used with C++14 or higher.
++* Visual Studio 2015.
++
++(If you know how to fix those, please let us know)
++
++Part of the library might still work, e.g. Clang 4.0 only has problems with `zip` and `fold` (and everything based on it).
++
++## Provided algorithms and examples
++
++* All provided templates are in the nested namespace `tao::seq`.
++* All templates don't use C++14 features, therefore being compatible with C++11. Sometimes, C++14/C++17 features are used conditionally, taking advantage of newer language features when available but providing C++11-compatible implementations otherwise.
++* All templates use `tao::seq::integer_sequence`, etc. internally, therefore being compatible with C++11.
++* All templates use `tao::seq::make_integer_sequence`, etc. internally, therefore using the most scalable solution available.
++
++#### Header `tao/seq/integer_sequence.hpp`
++
++Provides:
++
++* `integer_sequence< typename T, T N >`
++* `index_sequence< std::size_t N >`
++
++Notes:
++
++* When available (C++14 or newer), the above are type-aliases for `std::integer_sequence` and `std::index_sequence`.
++
++#### Header `tao/seq/make_integer_sequence.hpp`
++
++Efficient versions of sequence generators.
++
++* `make_integer_sequence< typename T, T N >`
++* `make_index_sequence< std::size_t N >`
++* `index_sequence_for< typename... Ts >`
++
++Examples:
++
++* `make_integer_sequence<int,0>` ➙ `integer_sequence<int>`
++* `make_integer_sequence<int,1>` ➙ `integer_sequence<int,0>`
++* `make_integer_sequence<int,3>` ➙ `integer_sequence<int,0,1,2>`
++* `make_index_sequence<0>` ➙ `index_sequence<>`
++* `make_index_sequence<1>` ➙ `index_sequence<0>`
++* `make_index_sequence<5>` ➙ `index_sequence<0,1,2,3,4>`
++* `index_sequence_for<int,void,long>` ➙ `index_sequence<0,1,2>`
++
++Notes:
++
++libc++ already has very efficient versions for the above, so they are pulled in with a using-declaration. Only if we don't know if the STL's versions are at least O(log N) we provide our own implementations.
++
++Our own implementation has O(log N) instantiation depth. This allows for very large sequences without the need to increase the compiler's default instantiation depth limits. For example, GCC and Clang generate `index_sequence<10000>` in ~0.15s (on my machine, of course). The standard library version from libstdc++, when trying to create `index_sequence<5000>` and with its O(N) implementation, requires ~30s, >3GB of RAM and `-ftemplate-depth=5100`.
++
++#### Header `tao/seq/make_integer_range.hpp`
++
++Generate half-open ranges of integers.
++
++* `make_integer_range< typename T, T N, T M >`
++* `make_index_range< std::size_t N, std::size_t M >`
++
++Examples:
++
++* `make_integer_range<int,3,7>` ➙ `integer_sequence<int,3,4,5,6>`
++* `make_integer_range<int,7,3>` ➙ `integer_sequence<int,7,6,5,4>`
++* `make_integer_sequence<int,-2,2>` ➙ `integer_sequence<int,-2,-1,0,1>`
++* `make_index_range<5,5>` ➙ `index_sequence<>`
++* `make_index_range<2,5>` ➙ `index_sequence<2,3,4>`
++
++#### Header `tao/seq/sum.hpp`
++
++Integral constant to provide the sum of `Ns`.
++
++* `sum< typename T, T... Ns >`
++* `sum< typename S >`
++
++Examples:
++
++* `sum<int,1,4,3,1>::value` ➙ `9`
++* `sum<make_index_sequence<5>>::value` ➙ `10`
++
++#### Header `tao/seq/partial_sum.hpp`
++
++Integral constant to provide the sum of the first `I` elements of `Ns`.
++
++* `partial_sum< std::size_t I, typename T, T... Ns >`
++* `partial_sum< std::size_t I, typename S >`
++
++Examples:
++
++* `partial_sum<0,int,1,4,3,1>::value` ➙ `0`
++* `partial_sum<2,int,1,4,3,1>::value` ➙ `5`
++* `partial_sum<4,make_index_sequence<5>>::value` ➙ `6`
++
++#### Header `tao/seq/exclusive_scan.hpp`
++
++Provides a sequence with the exclusive scan of the input sequence.
++
++* `exclusive_scan_t< typename T, T... Ns >`
++* `exclusive_scan_t< typename S >`
++
++Examples:
++
++* `exclusive_scan_t<int,1,4,0,3,1>` ➙ `integer_sequence<int,0,1,5,5,8>`
++
++#### Header `tao/seq/inclusive_scan.hpp`
++
++Provides a sequence with the inclusive scan of the input sequence.
++
++* `inclusive_scan_t< typename T, T... Ns >`
++* `inclusive_scan_t< typename S >`
++
++Examples:
++
++* `inclusive_scan_t<int,1,4,0,3,1>` ➙ `integer_sequence<int,1,5,5,8,9>`
++
++#### Header `tao/seq/zip.hpp`
++
++Applies a binary operation to elements from two sequences.
++
++* `zip_t< template< typename U, U, U > class OP, typename L, typename R >`
++
++Notes:
++
++Both sequences may have a different element type, the resulting sequence's type is calculated with `std::common_type_t`.
++
++#### Header `tao/seq/plus.hpp`
++
++Provides a sequence which is the element-wise sum of its input sequences.
++
++* `plus_t< typename L, typename R >`
++
++Notes:
++
++Both sequences may have a different element type, the resulting sequence's type is calculated with `std::common_type_t`.
++
++Examples:
++
++* `using A = index_sequence<1,4,0,3,1>`
++* `using B = make_index_sequence<5>`
++* `plus_t<A,B>` ➙ `index_sequence<1,5,2,6,5>`
++
++#### Header `tao/seq/minus.hpp`
++
++Provides a sequence which is the element-wise sum of its input sequences.
++
++* `minus_t< typename L, typename R >`
++
++Notes:
++
++Both sequences may have a different element type, the resulting sequence's type is calculated with `std::common_type_t`.
++
++Examples:
++
++* `using A = integer_sequence<int,1,4,0,3,1>`
++* `using B = integer_sequence<int,0,1,2,3,4>`
++* `minus_t<A,B>` ➙ `integer_sequence<int,1,3,-2,0,-3>`
++* `minus_t<B,A>` ➙ `integer_sequence<int,-1,-3,2,0,3>`
++
++#### Header `tao/seq/head.hpp`
++
++Integral constant to provide the first element of a non-empty sequence.
++
++* `head< typename T, T... >`
++* `head< typename S >`
++
++#### Header `tao/seq/tail.hpp`
++
++Removed the first element of a non-empty sequence.
++
++* `tail_t< typename T, T... >`
++* `tail_t< typename S >`
++
++#### Header `tao/seq/select.hpp`
++
++Integral constant to provide the `I`th element of a non-empty sequence.
++
++* `select< std::size_t I, typename T, T... >`
++* `select< std::size_t I, typename S >`
++
++#### Header `tao/seq/concatenate.hpp`
++
++Concatenate the values.
++
++* `concatenate_t< typename T, typename U >`
++
++Notes:
++
++Both sequences may have a different element type, the resulting sequence's type is calculated with `std::common_type_t`.
++
++#### Header `tao/seq/fold.hpp`
++
++Integral constant calculated by "folding" a sequence of values with a given binary operation.
++
++* `fold< template< typename U, U, U > class OP, typename T, T... >`
++* `fold< template< typename U, U, U > class OP, typename S >`
++
++#### Header `tao/seq/min.hpp`
++
++Integral constant to provide the minimum value.
++
++* `min< typename T, T... >`
++* `min< typename S >`
++
++Notes:
++
++Implemented with `fold` like this:
++
++ namespace impl
++ {
++ template< typename T, T A, T B >
++ using min = std::integral_constant< T, ( ( A < B ) ? A : B ) >;
++ }
++
++ template< typename T, T... Ns >
++ using min = fold< impl::min, T, Ns... >;
++
++#### Header `tao/seq/max.hpp`
++
++Integral constant to provide the maximum value.
++
++* `max< typename T, T... >`
++* `max< typename S >`
++
++#### Header `tao/seq/map.hpp`
++
++Map a sequence of indices to a sequence of values.
++
++* `map_t< typename I, typename M >`
++
++Examples:
++
++* `using I = index_sequence<1,0,3,2,1,1,3>`
++* `using M = integer_sequence<int,5,6,-7,8,9>`
++* `map_t<I,M>` ➙ `integer_sequence<int,6,5,8,-7,6,6,8>`
++
++#### Header `tao/seq/is_all.hpp`
++
++Integral constant which is true if all boolean parameters are true (logical and).
++
++* `is_all< bool... >`
++
++Examples:
++
++* `is_all<true,true,true,true>::value` ➙ `true`
++* `is_all<true,true,false,true>::value` ➙ `false`
++* `is_all<>::value` ➙ `true`
++
++#### Header `tao/seq/is_any.hpp`
++
++Integral constant which is true if any boolean parameter is true (logical or).
++
++* `is_any< bool... >`
++
++Examples:
++
++* `is_any<false,true,false,false>::value` ➙ `true`
++* `is_any<false,false,false,false>::value` ➙ `false`
++* `is_any<>::value` ➙ `false`
++
++## License
++
++The Art of C++ is certified [Open Source](http://www.opensource.org/docs/definition.html) software. It may be used for any purpose, including commercial purposes, at absolutely no cost. It is distributed under the terms of the [MIT license](http://www.opensource.org/licenses/mit-license.html) reproduced here.
++
++> Copyright (c) 2015-2017 Daniel Frey
++>
++> Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
++>
++> The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
++>
++> 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 AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+diff -up chromium-62.0.3202.62/third_party/tao/seq/scale.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/scale.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/scale.hpp.epel7-c++11 2017-10-25 10:08:42.441573463 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/scale.hpp 2017-10-25 10:05:28.328204354 -0400
+@@ -0,0 +1,66 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_SCALE_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_SCALE_HPP
++
++#include "integer_sequence.hpp"
++
++namespace tao
++{
++ namespace seq
++ {
++ namespace impl
++ {
++ template< typename T >
++ struct is_integer_sequence : std::false_type
++ {
++ };
++
++ template< typename T, T... Ns >
++ struct is_integer_sequence< integer_sequence< T, Ns... > > : std::true_type
++ {
++ };
++
++ template< typename T >
++ struct element_type
++ {
++ using type = T;
++ };
++
++ template< typename T, T... Ns >
++ struct element_type< integer_sequence< T, Ns... > >
++ {
++ using type = T;
++ };
++
++ template< bool, typename >
++ struct scale
++ {
++ template< typename T, T S, T... Ns >
++ struct impl
++ {
++ using type = integer_sequence< T, S * Ns... >;
++ };
++ };
++
++ template< typename T, T... Ns >
++ struct scale< true, integer_sequence< T, Ns... > >
++ {
++ template< typename, T S >
++ struct impl
++ {
++ using type = integer_sequence< T, S * Ns... >;
++ };
++ };
++ }
++
++ template< typename T, typename impl::element_type< T >::type S, typename impl::element_type< T >::type... Ns >
++ using scale = typename impl::scale< impl::is_integer_sequence< T >::value, T >::template impl< T, S, Ns... >;
++
++ template< typename T, typename impl::element_type< T >::type S, typename impl::element_type< T >::type... Ns >
++ using scale_t = typename scale< T, S, Ns... >::type;
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_SCALE_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/select.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/select.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/select.hpp.epel7-c++11 2017-10-25 10:08:42.442573435 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/select.hpp 2017-10-25 10:05:28.328204354 -0400
+@@ -0,0 +1,31 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_SELECT_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_SELECT_HPP
++
++#include <cstddef>
++#include <utility>
++
++#include "at_index.hpp"
++#include "integer_sequence.hpp"
++
++namespace tao
++{
++ namespace seq
++ {
++ template< std::size_t I, typename T, T... Ns >
++ struct select
++ : at_index_t< I, std::integral_constant< T, Ns >... >
++ {
++ };
++
++ template< std::size_t I, typename T, T... Ns >
++ struct select< I, integer_sequence< T, Ns... > >
++ : select< I, T, Ns... >
++ {
++ };
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_SELECT_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/sum.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/sum.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/sum.hpp.epel7-c++11 2017-10-25 10:08:42.443573405 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/sum.hpp 2017-10-25 10:05:28.328204354 -0400
+@@ -0,0 +1,79 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_SUM_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_SUM_HPP
++
++#include <type_traits>
++#include <utility>
++
++#include "config.hpp"
++#include "integer_sequence.hpp"
++
++#ifndef TAOCPP_FOLD_EXPRESSIONS
++#include "make_integer_sequence.hpp"
++#include <cstddef>
++#endif
++
++namespace tao
++{
++ namespace seq
++ {
++
++#ifdef TAOCPP_FOLD_EXPRESSIONS
++
++ template< typename T, T... Ns >
++ struct sum
++ : std::integral_constant< T, ( Ns + ... + T( 0 ) ) >
++ {
++ };
++
++#else
++
++ namespace impl
++ {
++ template< std::size_t, std::size_t N >
++ struct chars
++ {
++ char dummy[ N + 1 ];
++ };
++
++ template< typename, std::size_t... >
++ struct collector;
++
++ template< std::size_t... Is, std::size_t... Ns >
++ struct collector< index_sequence< Is... >, Ns... >
++ : chars< Is, Ns >...
++ {
++ };
++
++ template< bool, std::size_t N, typename T, T... Ns >
++ struct sum
++ {
++ using type = std::integral_constant< T, T( sizeof( collector< make_index_sequence< N >, ( ( Ns > 0 ) ? Ns : 0 )... > ) - N ) - T( sizeof( collector< make_index_sequence< N >, ( ( Ns < 0 ) ? -Ns : 0 )... > ) - N ) >;
++ };
++
++ template< std::size_t N, typename T, T... Ns >
++ struct sum< true, N, T, Ns... >
++ {
++ using type = std::integral_constant< T, T( sizeof( collector< make_index_sequence< N >, ( ( Ns > 0 ) ? Ns : 0 )... > ) - N ) >;
++ };
++ }
++
++ template< typename T, T... Ns >
++ struct sum
++ : impl::sum< std::is_unsigned< T >::value, sizeof...( Ns ) + 1, T, Ns..., 0 >::type
++ {
++ };
++
++#endif
++
++ template< typename T, T... Ns >
++ struct sum< integer_sequence< T, Ns... > >
++ : sum< T, Ns... >
++ {
++ };
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_SUM_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/tail.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/tail.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/tail.hpp.epel7-c++11 2017-10-25 10:08:42.444573376 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/tail.hpp 2017-10-25 10:05:28.329204325 -0400
+@@ -0,0 +1,35 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_TAIL_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_TAIL_HPP
++
++#include <type_traits>
++
++#include "integer_sequence.hpp"
++
++namespace tao
++{
++ namespace seq
++ {
++ template< typename T, T... Ns >
++ struct tail;
++
++ template< typename T, T N, T... Ns >
++ struct tail< T, N, Ns... >
++ {
++ using type = integer_sequence< T, Ns... >;
++ };
++
++ template< typename T, T... Ns >
++ struct tail< integer_sequence< T, Ns... > >
++ : tail< T, Ns... >
++ {
++ };
++
++ template< typename T, T... Ns >
++ using tail_t = typename tail< T, Ns... >::type;
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_TAIL_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/type_by_index.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/type_by_index.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/type_by_index.hpp.epel7-c++11 2017-10-25 10:08:42.445573347 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/type_by_index.hpp 2017-10-25 10:05:28.329204325 -0400
+@@ -0,0 +1,57 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_TYPE_BY_INDEX_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_TYPE_BY_INDEX_HPP
++
++#include <cstddef>
++#include <type_traits>
++
++#include "make_integer_sequence.hpp"
++
++namespace tao
++{
++ namespace seq
++ {
++ // based on http://stackoverflow.com/questions/18942322
++
++ namespace impl
++ {
++ template< std::size_t >
++ struct any
++ {
++ any( ... );
++ };
++
++ template< typename >
++ struct wrapper;
++
++ template< typename >
++ struct unwrap;
++
++ template< typename T >
++ struct unwrap< wrapper< T > >
++ {
++ using type = T;
++ };
++
++ template< typename >
++ struct get_nth;
++
++ template< std::size_t... Is >
++ struct get_nth< index_sequence< Is... > >
++ {
++ template< typename T >
++ static T deduce( any< Is & 0 >..., T*, ... );
++ };
++ }
++
++ template< std::size_t I, typename... Ts >
++ using type_by_index = impl::unwrap< decltype( impl::get_nth< make_index_sequence< I > >::deduce( std::declval< impl::wrapper< Ts >* >()... ) ) >;
++
++ template< std::size_t I, typename... Ts >
++ using type_by_index_t = typename type_by_index< I, Ts... >::type;
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_TYPE_BY_INDEX_HPP
+diff -up chromium-62.0.3202.62/third_party/tao/seq/zip.hpp.epel7-c++11 chromium-62.0.3202.62/third_party/tao/seq/zip.hpp
+--- chromium-62.0.3202.62/third_party/tao/seq/zip.hpp.epel7-c++11 2017-10-25 10:08:42.446573319 -0400
++++ chromium-62.0.3202.62/third_party/tao/seq/zip.hpp 2017-10-25 10:05:28.329204325 -0400
+@@ -0,0 +1,30 @@
++// Copyright (c) 2015-2017 Daniel Frey
++// Please see LICENSE for license or visit https://github.com/taocpp/sequences/
++
++#ifndef TAOCPP_SEQUENCES_INCLUDE_ZIP_HPP
++#define TAOCPP_SEQUENCES_INCLUDE_ZIP_HPP
++
++#include <type_traits>
++
++#include "integer_sequence.hpp"
++
++namespace tao
++{
++ namespace seq
++ {
++ template< template< typename U, U, U > class, typename, typename >
++ struct zip;
++
++ template< template< typename U, U, U > class OP, typename TA, TA... As, typename TB, TB... Bs >
++ struct zip< OP, integer_sequence< TA, As... >, integer_sequence< TB, Bs... > >
++ {
++ using CT = typename std::common_type< TA, TB >::type;
++ using type = integer_sequence< CT, OP< CT, As, Bs >::value... >;
++ };
++
++ template< template< typename U, U, U > class OP, typename A, typename B >
++ using zip_t = typename zip< OP, A, B >::type;
++ }
++}
++
++#endif // TAOCPP_SEQUENCES_INCLUDE_ZIP_HPP
+diff -up chromium-62.0.3202.62/tools/ipc_fuzzer/fuzzer/fuzzer.cc.epel7-c++11 chromium-62.0.3202.62/tools/ipc_fuzzer/fuzzer/fuzzer.cc
+--- chromium-62.0.3202.62/tools/ipc_fuzzer/fuzzer/fuzzer.cc.epel7-c++11 2017-10-25 10:18:10.415133815 -0400
++++ chromium-62.0.3202.62/tools/ipc_fuzzer/fuzzer/fuzzer.cc 2017-10-25 10:18:58.888807178 -0400
+@@ -23,6 +23,7 @@
+ #include "tools/ipc_fuzzer/fuzzer/rand_util.h"
+ #include "tools/ipc_fuzzer/message_lib/message_cracker.h"
+ #include "tools/ipc_fuzzer/message_lib/message_file.h"
++#include "third_party/tao/seq/integer_sequence.hpp"
+
+ #if defined(OS_POSIX)
+ #include <unistd.h>
+@@ -1680,14 +1681,14 @@ class FuzzerHelper<IPC::MessageT<Meta, s
+ using Message = IPC::MessageT<Meta, std::tuple<Ins...>, void>;
+
+ static std::unique_ptr<IPC::Message> Fuzz(IPC::Message* msg, Fuzzer* fuzzer) {
+- return FuzzImpl(msg, fuzzer, std::index_sequence_for<Ins...>());
++ return FuzzImpl(msg, fuzzer, tao::seq::index_sequence_for<Ins...>());
+ }
+
+ private:
+ template <size_t... Ns>
+ static std::unique_ptr<IPC::Message> FuzzImpl(IPC::Message* msg,
+ Fuzzer* fuzzer,
+- std::index_sequence<Ns...>) {
++ tao::seq::index_sequence<Ns...>) {
+ typename Message::Param p;
+ if (msg) {
+ Message::Read(static_cast<Message*>(msg), &p);
+@@ -1707,14 +1708,14 @@ class FuzzerHelper<
+ using Message = IPC::MessageT<Meta, std::tuple<Ins...>, std::tuple<Outs...>>;
+
+ static std::unique_ptr<IPC::Message> Fuzz(IPC::Message* msg, Fuzzer* fuzzer) {
+- return FuzzImpl(msg, fuzzer, std::index_sequence_for<Ins...>());
++ return FuzzImpl(msg, fuzzer, tao::seq::index_sequence_for<Ins...>());
+ }
+
+ private:
+ template <size_t... Ns>
+ static std::unique_ptr<IPC::Message> FuzzImpl(IPC::Message* msg,
+ Fuzzer* fuzzer,
+- std::index_sequence<Ns...>) {
++ tao::seq::index_sequence<Ns...>) {
+ typename Message::SendParam p;
+ Message* real_msg = static_cast<Message*>(msg);
+ std::unique_ptr<Message> new_msg;
diff --git a/chromium.spec b/chromium.spec
index 14d6ef4..da74cc5 100644
--- a/chromium.spec
+++ b/chromium.spec
@@ -218,7 +218,7 @@ Patch63: chromium-gn-bootstrap-r17.patch
Patch64: chromium-62.0.3202.62-correct-cplusplus-check.patch
# epel7 does not know about c++14
Patch65: chromium-62.0.3202.62-epel7-noc++14.patch
-Patch66: chromium-62.0.3202.62-epel7-c++11-decay-enable_if-type.patch
+Patch66: chromium-62.0.3202.62-epel7-c++11-support.patch
### Chromium Tests Patches ###
Patch100: chromium-46.0.2490.86-use_system_opus.patch
@@ -990,6 +990,10 @@ build/linux/unbundle/remove_bundled_libraries.py \
'third_party/swiftshader/third_party/subzero' \
'third_party/swiftshader/third_party/LLVM' \
'third_party/swiftshader/third_party/llvm-subzero' \
+%if 0%{?rhel} == 7
+ 'third_party/tao' \
+ 'third_party/tao/seq' \
+%endif
'third_party/tcmalloc' \
'third_party/usb_ids' \
'third_party/usrsctp' \
7 years
[chromium-freeworld: 10/15] more C++11 type handling (enable_if)
by Miro Hrončok
commit 2180bdba879cfe15ed13fe549a5e69d8bcef00e8
Author: Tom Callaway <spot(a)fedoraproject.org>
Date: Wed Oct 25 09:17:17 2017 -0400
more C++11 type handling (enable_if)
....3202.62-epel7-c++11-decay-enable_if-type.patch | 96 +++++++++++++++++++++-
chromium.spec | 2 +-
2 files changed, 94 insertions(+), 4 deletions(-)
---
diff --git a/chromium-62.0.3202.62-epel7-c++11-decay-type.patch b/chromium-62.0.3202.62-epel7-c++11-decay-enable_if-type.patch
similarity index 61%
rename from chromium-62.0.3202.62-epel7-c++11-decay-type.patch
rename to chromium-62.0.3202.62-epel7-c++11-decay-enable_if-type.patch
index af0c5a7..0e651c6 100644
--- a/chromium-62.0.3202.62-epel7-c++11-decay-type.patch
+++ b/chromium-62.0.3202.62-epel7-c++11-decay-enable_if-type.patch
@@ -1,6 +1,6 @@
diff -up chromium-62.0.3202.62/base/bind_helpers.h.epel7-c++11 chromium-62.0.3202.62/base/bind_helpers.h
--- chromium-62.0.3202.62/base/bind_helpers.h.epel7-c++11 2017-10-25 08:50:15.692276363 -0400
-+++ chromium-62.0.3202.62/base/bind_helpers.h 2017-10-25 08:50:39.977611740 -0400
++++ chromium-62.0.3202.62/base/bind_helpers.h 2017-10-25 09:12:15.889484145 -0400
@@ -282,7 +282,7 @@ class PassedWrapper {
};
@@ -10,6 +10,27 @@ diff -up chromium-62.0.3202.62/base/bind_helpers.h.epel7-c++11 chromium-62.0.320
template <typename T>
auto Unwrap(T&& o) -> decltype(Unwrapper<T>::Unwrap(std::forward<T>(o))) {
+@@ -438,7 +438,7 @@ static inline internal::OwnedWrapper<T>
+ // Both versions of Passed() prevent T from being an lvalue reference. The first
+ // via use of enable_if, and the second takes a T* which will not bind to T&.
+ template <typename T,
+- std::enable_if_t<!std::is_lvalue_reference<T>::value>* = nullptr>
++ typename std::enable_if<!std::is_lvalue_reference<T>::value>::type* = nullptr>
+ static inline internal::PassedWrapper<T> Passed(T&& scoper) {
+ return internal::PassedWrapper<T>(std::move(scoper));
+ }
+@@ -537,9 +537,9 @@ template <typename Functor, typename...
+ struct CallbackCancellationTraits<
+ Functor,
+ std::tuple<BoundArgs...>,
+- std::enable_if_t<
++ typename std::enable_if<
+ internal::IsWeakMethod<internal::FunctorTraits<Functor>::is_method,
+- BoundArgs...>::value>> {
++ BoundArgs...>::value>::type> {
+ static constexpr bool is_cancellable = true;
+
+ template <typename Receiver, typename... Args>
diff -up chromium-62.0.3202.62/base/bind.h.epel7-c++11 chromium-62.0.3202.62/base/bind.h
--- chromium-62.0.3202.62/base/bind.h.epel7-c++11 2017-10-25 08:55:22.603877014 -0400
+++ chromium-62.0.3202.62/base/bind.h 2017-10-25 08:56:41.636714097 -0400
@@ -77,7 +98,16 @@ diff -up chromium-62.0.3202.62/base/bind.h.epel7-c++11 chromium-62.0.3202.62/bas
// This block checks if each |args| matches to the corresponding params of the
diff -up chromium-62.0.3202.62/base/bind_internal.h.epel7-c++11 chromium-62.0.3202.62/base/bind_internal.h
--- chromium-62.0.3202.62/base/bind_internal.h.epel7-c++11 2017-10-25 08:52:20.018873878 -0400
-+++ chromium-62.0.3202.62/base/bind_internal.h 2017-10-25 08:55:07.779282724 -0400
++++ chromium-62.0.3202.62/base/bind_internal.h 2017-10-25 09:14:48.526096108 -0400
+@@ -125,7 +125,7 @@ struct FunctorTraits;
+ // to the function type while capturing lambdas can't.
+ template <typename Functor>
+ struct FunctorTraits<Functor,
+- std::enable_if_t<IsConvertibleToRunType<Functor>::value>> {
++ typename std::enable_if<IsConvertibleToRunType<Functor>::value>::type> {
+ using RunType = ExtractCallableRunType<Functor>;
+ static constexpr bool is_method = false;
+ static constexpr bool is_nullable = false;
@@ -256,7 +256,7 @@ struct FunctorTraits<RepeatingCallback<R
};
@@ -96,6 +126,22 @@ diff -up chromium-62.0.3202.62/base/bind_internal.h.epel7-c++11 chromium-62.0.32
static constexpr bool is_weak_call =
IsWeakMethod<is_method,
std::tuple_element_t<indices, DecayedArgsTuple>...>();
+@@ -383,13 +383,13 @@ struct BindTypeHelper {
+ };
+
+ template <typename Functor>
+-std::enable_if_t<FunctorTraits<Functor>::is_nullable, bool> IsNull(
++typename std::enable_if<FunctorTraits<Functor>::is_nullable, bool>::type IsNull(
+ const Functor& functor) {
+ return !functor;
+ }
+
+ template <typename Functor>
+-std::enable_if_t<!FunctorTraits<Functor>::is_nullable, bool> IsNull(
++typename std::enable_if<!FunctorTraits<Functor>::is_nullable, bool>::type IsNull(
+ const Functor&) {
+ return false;
+ }
@@ -479,33 +479,33 @@ struct MakeBindStateTypeImpl;
template <typename Functor, typename... BoundArgs>
@@ -139,7 +185,7 @@ diff -up chromium-62.0.3202.62/base/bind_internal.h.epel7-c++11 chromium-62.0.32
template <typename Functor, typename... BoundArgs>
diff -up chromium-62.0.3202.62/base/containers/span.h.epel7-c++11 chromium-62.0.3202.62/base/containers/span.h
--- chromium-62.0.3202.62/base/containers/span.h.epel7-c++11 2017-10-25 08:51:25.260372472 -0400
-+++ chromium-62.0.3202.62/base/containers/span.h 2017-10-25 08:52:07.597213826 -0400
++++ chromium-62.0.3202.62/base/containers/span.h 2017-10-25 09:13:53.035964265 -0400
@@ -27,7 +27,7 @@ template <typename T>
struct IsSpanImpl<span<T>> : std::true_type {};
@@ -158,3 +204,47 @@ diff -up chromium-62.0.3202.62/base/containers/span.h.epel7-c++11 chromium-62.0.
template <typename From, typename To>
using IsLegalSpanConversion = std::is_convertible<From*, To*>;
+@@ -51,7 +51,7 @@ using ContainerHasIntegralSize =
+
+ template <typename From, typename To>
+ using EnableIfLegalSpanConversion =
+- std::enable_if_t<IsLegalSpanConversion<From, To>::value>;
++ typename std::enable_if<IsLegalSpanConversion<From, To>::value>::type;
+
+ // SFINAE check if Container can be converted to a span<T>. Note that the
+ // implementation details of this check differ slightly from the requirements in
+@@ -67,18 +67,18 @@ using EnableIfLegalSpanConversion =
+ // container.
+ template <typename Container, typename T>
+ using EnableIfSpanCompatibleContainer =
+- std::enable_if_t<!internal::IsSpan<Container>::value &&
++ typename std::enable_if<!internal::IsSpan<Container>::value &&
+ !internal::IsStdArray<Container>::value &&
+ ContainerHasConvertibleData<Container, T>::value &&
+- ContainerHasIntegralSize<Container>::value>;
++ ContainerHasIntegralSize<Container>::value>::type;
+
+ template <typename Container, typename T>
+ using EnableIfConstSpanCompatibleContainer =
+- std::enable_if_t<std::is_const<T>::value &&
++ typename std::enable_if<std::is_const<T>::value &&
+ !internal::IsSpan<Container>::value &&
+ !internal::IsStdArray<Container>::value &&
+ ContainerHasConvertibleData<Container, T>::value &&
+- ContainerHasIntegralSize<Container>::value>;
++ ContainerHasIntegralSize<Container>::value>::type;
+
+ } // namespace internal
+
+diff -up chromium-62.0.3202.62/ipc/ipc_message_templates.h.epel7-c++11 chromium-62.0.3202.62/ipc/ipc_message_templates.h
+--- chromium-62.0.3202.62/ipc/ipc_message_templates.h.epel7-c++11 2017-10-25 09:15:02.382879317 -0400
++++ chromium-62.0.3202.62/ipc/ipc_message_templates.h 2017-10-25 09:15:36.609343836 -0400
+@@ -67,7 +67,7 @@ void DispatchToMethodImpl(ObjT* obj,
+ // The following function is for async IPCs which have a dispatcher with an
+ // extra parameter specified using IPC_BEGIN_MESSAGE_MAP_WITH_PARAM.
+ template <typename ObjT, typename P, typename... Args, typename Tuple>
+-std::enable_if_t<sizeof...(Args) == std::tuple_size<std::decay_t<Tuple>>::value>
++typename std::enable_if<sizeof...(Args) == std::tuple_size<std::decay_t<Tuple>>::value>::type
+ DispatchToMethod(ObjT* obj,
+ void (ObjT::*method)(P*, Args...),
+ P* parameter,
diff --git a/chromium.spec b/chromium.spec
index 4ae1ecb..14d6ef4 100644
--- a/chromium.spec
+++ b/chromium.spec
@@ -218,7 +218,7 @@ Patch63: chromium-gn-bootstrap-r17.patch
Patch64: chromium-62.0.3202.62-correct-cplusplus-check.patch
# epel7 does not know about c++14
Patch65: chromium-62.0.3202.62-epel7-noc++14.patch
-Patch66: chromium-62.0.3202.62-epel7-c++11-decay-type.patch
+Patch66: chromium-62.0.3202.62-epel7-c++11-decay-enable_if-type.patch
### Chromium Tests Patches ###
Patch100: chromium-46.0.2490.86-use_system_opus.patch
7 years
[chromium-freeworld: 9/15] fix decay_t usage for gcc 4.8/c++11
by Miro Hrončok
commit f6767a1977aff985b5b24eaee915f052108a98f3
Author: Tom Callaway <spot(a)fedoraproject.org>
Date: Wed Oct 25 08:59:45 2017 -0400
fix decay_t usage for gcc 4.8/c++11
chromium-62.0.3202.62-epel7-c++11-decay-type.patch | 160 +++++++++++++++++++++
chromium.spec | 2 +
2 files changed, 162 insertions(+)
---
diff --git a/chromium-62.0.3202.62-epel7-c++11-decay-type.patch b/chromium-62.0.3202.62-epel7-c++11-decay-type.patch
new file mode 100644
index 0000000..af0c5a7
--- /dev/null
+++ b/chromium-62.0.3202.62-epel7-c++11-decay-type.patch
@@ -0,0 +1,160 @@
+diff -up chromium-62.0.3202.62/base/bind_helpers.h.epel7-c++11 chromium-62.0.3202.62/base/bind_helpers.h
+--- chromium-62.0.3202.62/base/bind_helpers.h.epel7-c++11 2017-10-25 08:50:15.692276363 -0400
++++ chromium-62.0.3202.62/base/bind_helpers.h 2017-10-25 08:50:39.977611740 -0400
+@@ -282,7 +282,7 @@ class PassedWrapper {
+ };
+
+ template <typename T>
+-using Unwrapper = BindUnwrapTraits<std::decay_t<T>>;
++using Unwrapper = BindUnwrapTraits<typename std::decay<T>::type>;
+
+ template <typename T>
+ auto Unwrap(T&& o) -> decltype(Unwrapper<T>::Unwrap(std::forward<T>(o))) {
+diff -up chromium-62.0.3202.62/base/bind.h.epel7-c++11 chromium-62.0.3202.62/base/bind.h
+--- chromium-62.0.3202.62/base/bind.h.epel7-c++11 2017-10-25 08:55:22.603877014 -0400
++++ chromium-62.0.3202.62/base/bind.h 2017-10-25 08:56:41.636714097 -0400
+@@ -53,7 +53,7 @@ struct AssertConstructible {
+ // reference with repeating callbacks--is used instead of base::Passed().
+ static_assert(
+ param_is_forwardable ||
+- !std::is_constructible<Param, std::decay_t<Unwrapped>&&>::value,
++ !std::is_constructible<Param, typename std::decay<Unwrapped>::type&&>::value,
+ "Bound argument |i| is move-only but will be forwarded by copy. "
+ "Ensure |Arg| is bound using base::Passed(), not std::move().");
+ static_assert(
+@@ -64,7 +64,7 @@ struct AssertConstructible {
+ static constexpr bool arg_is_storable =
+ std::is_constructible<Storage, Arg>::value;
+ static_assert(arg_is_storable ||
+- !std::is_constructible<Storage, std::decay_t<Arg>&&>::value,
++ !std::is_constructible<Storage, typename std::decay<Arg>::type&&>::value,
+ "Bound argument |i| is move-only but will be bound by copy. "
+ "Ensure |Arg| is mutable and bound using std::move().");
+ static_assert(arg_is_storable,
+@@ -88,7 +88,7 @@ struct AssertBindArgsValidity<std::index
+ TypeList<Args...>,
+ TypeList<Unwrapped...>,
+ TypeList<Params...>>
+- : AssertConstructible<Ns, Args, std::decay_t<Args>, Unwrapped, Params>... {
++ : AssertConstructible<Ns, Args, typename std::decay<Args>::type, Unwrapped, Params>... {
+ static constexpr bool ok = true;
+ };
+
+@@ -98,14 +98,14 @@ struct TransformToUnwrappedTypeImpl;
+
+ template <typename T>
+ struct TransformToUnwrappedTypeImpl<true, T> {
+- using StoredType = std::decay_t<T>;
++ using StoredType = typename std::decay<T>::type;
+ using ForwardType = StoredType&&;
+ using Unwrapped = decltype(Unwrap(std::declval<ForwardType>()));
+ };
+
+ template <typename T>
+ struct TransformToUnwrappedTypeImpl<false, T> {
+- using StoredType = std::decay_t<T>;
++ using StoredType = typename std::decay<T>::type;
+ using ForwardType = const StoredType&;
+ using Unwrapped = decltype(Unwrap(std::declval<ForwardType>()));
+ };
+@@ -153,7 +153,7 @@ using MakeUnwrappedTypeList =
+ template <typename Functor, typename... Args>
+ inline OnceCallback<MakeUnboundRunType<Functor, Args...>>
+ BindOnce(Functor&& functor, Args&&... args) {
+- static_assert(!internal::IsOnceCallback<std::decay_t<Functor>>() ||
++ static_assert(!internal::IsOnceCallback<typename std::decay<Functor>::type>() ||
+ (std::is_rvalue_reference<Functor&&>() &&
+ !std::is_const<std::remove_reference_t<Functor>>()),
+ "BindOnce requires non-const rvalue for OnceCallback binding."
+@@ -197,7 +197,7 @@ template <typename Functor, typename...
+ inline RepeatingCallback<MakeUnboundRunType<Functor, Args...>>
+ BindRepeating(Functor&& functor, Args&&... args) {
+ static_assert(
+- !internal::IsOnceCallback<std::decay_t<Functor>>(),
++ !internal::IsOnceCallback<typename std::decay<Functor>::type>(),
+ "BindRepeating cannot bind OnceCallback. Use BindOnce with std::move().");
+
+ // This block checks if each |args| matches to the corresponding params of the
+diff -up chromium-62.0.3202.62/base/bind_internal.h.epel7-c++11 chromium-62.0.3202.62/base/bind_internal.h
+--- chromium-62.0.3202.62/base/bind_internal.h.epel7-c++11 2017-10-25 08:52:20.018873878 -0400
++++ chromium-62.0.3202.62/base/bind_internal.h 2017-10-25 08:55:07.779282724 -0400
+@@ -256,7 +256,7 @@ struct FunctorTraits<RepeatingCallback<R
+ };
+
+ template <typename Functor>
+-using MakeFunctorTraits = FunctorTraits<std::decay_t<Functor>>;
++using MakeFunctorTraits = FunctorTraits<typename std::decay<Functor>::type>;
+
+ // InvokeHelper<>
+ //
+@@ -341,7 +341,7 @@ struct Invoker<StorageType, R(UnboundArg
+ UnboundArgs&&... unbound_args) {
+ static constexpr bool is_method = MakeFunctorTraits<Functor>::is_method;
+
+- using DecayedArgsTuple = std::decay_t<BoundArgsTuple>;
++ using DecayedArgsTuple = typename std::decay<BoundArgsTuple>::type;
+ static constexpr bool is_weak_call =
+ IsWeakMethod<is_method,
+ std::tuple_element_t<indices, DecayedArgsTuple>...>();
+@@ -479,33 +479,33 @@ struct MakeBindStateTypeImpl;
+
+ template <typename Functor, typename... BoundArgs>
+ struct MakeBindStateTypeImpl<false, Functor, BoundArgs...> {
+- static_assert(!HasRefCountedTypeAsRawPtr<std::decay_t<BoundArgs>...>::value,
++ static_assert(!HasRefCountedTypeAsRawPtr<typename std::decay<BoundArgs>::type...>::value,
+ "A parameter is a refcounted type and needs scoped_refptr.");
+- using Type = BindState<std::decay_t<Functor>, std::decay_t<BoundArgs>...>;
++ using Type = BindState<typename std::decay<Functor>::type, typename std::decay<BoundArgs>::type...>;
+ };
+
+ template <typename Functor>
+ struct MakeBindStateTypeImpl<true, Functor> {
+- using Type = BindState<std::decay_t<Functor>>;
++ using Type = BindState<typename std::decay<Functor>::type>;
+ };
+
+ template <typename Functor, typename Receiver, typename... BoundArgs>
+ struct MakeBindStateTypeImpl<true, Functor, Receiver, BoundArgs...> {
+ static_assert(!std::is_array<std::remove_reference_t<Receiver>>::value,
+ "First bound argument to a method cannot be an array.");
+- static_assert(!HasRefCountedTypeAsRawPtr<std::decay_t<BoundArgs>...>::value,
++ static_assert(!HasRefCountedTypeAsRawPtr<typename std::decay<BoundArgs>::type...>::value,
+ "A parameter is a refcounted type and needs scoped_refptr.");
+
+ private:
+- using DecayedReceiver = std::decay_t<Receiver>;
++ using DecayedReceiver = typename std::decay<Receiver>::type;
+
+ public:
+ using Type = BindState<
+- std::decay_t<Functor>,
++ typename std::decay<Functor>::type,
+ std::conditional_t<std::is_pointer<DecayedReceiver>::value,
+ scoped_refptr<std::remove_pointer_t<DecayedReceiver>>,
+ DecayedReceiver>,
+- std::decay_t<BoundArgs>...>;
++ typename std::decay<BoundArgs>::type...>;
+ };
+
+ template <typename Functor, typename... BoundArgs>
+diff -up chromium-62.0.3202.62/base/containers/span.h.epel7-c++11 chromium-62.0.3202.62/base/containers/span.h
+--- chromium-62.0.3202.62/base/containers/span.h.epel7-c++11 2017-10-25 08:51:25.260372472 -0400
++++ chromium-62.0.3202.62/base/containers/span.h 2017-10-25 08:52:07.597213826 -0400
+@@ -27,7 +27,7 @@ template <typename T>
+ struct IsSpanImpl<span<T>> : std::true_type {};
+
+ template <typename T>
+-using IsSpan = IsSpanImpl<std::decay_t<T>>;
++using IsSpan = IsSpanImpl<typename std::decay<T>::type>;
+
+ template <typename T>
+ struct IsStdArrayImpl : std::false_type {};
+@@ -36,7 +36,7 @@ template <typename T, size_t N>
+ struct IsStdArrayImpl<std::array<T, N>> : std::true_type {};
+
+ template <typename T>
+-using IsStdArray = IsStdArrayImpl<std::decay_t<T>>;
++using IsStdArray = IsStdArrayImpl<typename std::decay<T>::type>;
+
+ template <typename From, typename To>
+ using IsLegalSpanConversion = std::is_convertible<From*, To*>;
diff --git a/chromium.spec b/chromium.spec
index ac7a224..4ae1ecb 100644
--- a/chromium.spec
+++ b/chromium.spec
@@ -218,6 +218,7 @@ Patch63: chromium-gn-bootstrap-r17.patch
Patch64: chromium-62.0.3202.62-correct-cplusplus-check.patch
# epel7 does not know about c++14
Patch65: chromium-62.0.3202.62-epel7-noc++14.patch
+Patch66: chromium-62.0.3202.62-epel7-c++11-decay-type.patch
### Chromium Tests Patches ###
Patch100: chromium-46.0.2490.86-use_system_opus.patch
@@ -668,6 +669,7 @@ udev.
%patch60 -p1 -b .nonullptr
%patch61 -p1 -b .another-rvalue-fix
%patch65 -p1 -b .epel7-noc++14
+%patch66 -p1 -b .epel7-c++11
%endif
%patch50 -p1 -b .pathfix
%patch53 -p1 -b .nogccoptmath
7 years
[chromium-freeworld: 7/15] instead use std=c++11 on epel7
by Miro Hrončok
commit 530c35bcba6b80615c9f2c82fcafb9f0d50ced14
Author: Tom Callaway <spot(a)fedoraproject.org>
Date: Wed Oct 25 08:28:07 2017 -0400
instead use std=c++11 on epel7
chromium-62.0.3202.62-epel7-noc++14.patch | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
---
diff --git a/chromium-62.0.3202.62-epel7-noc++14.patch b/chromium-62.0.3202.62-epel7-noc++14.patch
index 57d24b0..6ed714a 100644
--- a/chromium-62.0.3202.62-epel7-noc++14.patch
+++ b/chromium-62.0.3202.62-epel7-noc++14.patch
@@ -6,7 +6,7 @@ diff -up chromium-62.0.3202.62/tools/gn/bootstrap/bootstrap.py.epel7-noc++14 chr
'-fno-exceptions'
])
- cflags_cc.extend(['-std=c++14', '-Wno-c++11-narrowing'])
-+ cflags_cc.extend(['-Wno-c++11-narrowing'])
++ cflags_cc.extend(['-std=c++11', '-Wno-c++11-narrowing'])
if is_aix:
cflags.extend(['-maix64'])
ldflags.extend([ '-maix64 -Wl,-bbigtoc' ])
7 years
[chromium-freeworld: 6/15] Fix the policy templates handling
by Miro Hrončok
commit d8f6aaaf5dc74a2e3cd63a06629fb5232f73d861
Author: Tomas Popela <tpopela(a)redhat.com>
Date: Wed Oct 25 10:30:34 2017 +0200
Fix the policy templates handling
Basically revert my previous commits as the policy templates are
generated during the build. The only thing that we were copying out from
the tarballs was the policy templates documentation, but that one is
generated as well so use that one and remove the policy_templates zip
file from sources
chromium-latest.py | 30 ------------------------------
chromium.spec | 6 +-----
sources | 1 -
3 files changed, 1 insertion(+), 36 deletions(-)
---
diff --git a/chromium-latest.py b/chromium-latest.py
index 2efe44b..c77899d 100755
--- a/chromium-latest.py
+++ b/chromium-latest.py
@@ -209,33 +209,6 @@ def download_chrome_latest_rpm(arch):
remove_file_if_exists (chrome_rpm)
sys.exit(1)
-def remove_and_download_latest_policy_templates(version_string):
-
- policy_file = 'policy_templates.zip'
- if version_string != 'stable':
- if version_string == 'unstable':
- policy_file = "dev_" + policy_file
- else:
- policy_file = version_string + "_" + policy_file
-
- path = 'https://dl.google.com/chrome/policy/%s' % policy_file
- remove_file_if_exists(policy_file)
-
- # Let's make sure we haven't already downloaded it.
- if os.path.isfile("./%s" % policy_file):
- print "%s already exists!" % policy_file
- else:
- print "Downloading %s" % path
- # Perhaps look at using python-progressbar at some point?
- info=urllib.urlretrieve(path, policy_file, reporthook=dlProgress)[1]
- urllib.urlcleanup()
- print ""
- if (info["Content-Type"] != "application/octet-stream"):
- print 'Policy templates are not on servers.' % version_string
- remove_file_if_exists (policy_file)
- sys.exit(1)
-
-
# This is where the magic happens
if __name__ == '__main__':
@@ -321,9 +294,6 @@ if __name__ == '__main__':
download_version(chromium_version)
- # Always download the newest policy templates
- remove_and_download_latest_policy_templates(version_string)
-
# Lets make sure we haven't unpacked it already
latest_dir = "%s/chromium-%s" % (chromium_root_dir, chromium_version)
if (args.clean and os.path.isdir(latest_dir)):
diff --git a/chromium.spec b/chromium.spec
index b5aec69..ac7a224 100644
--- a/chromium.spec
+++ b/chromium.spec
@@ -249,7 +249,6 @@ Source7: get_free_ffmpeg_source_files.py
Source8: get_linux_tests_names.py
# GNOME stuff
Source9: chromium-browser.xml
-Source10: https://dl.google.com/dl/edgedl/chrome/policy/policy_templates.zip
Source11: chrome-remote-desktop@.service
Source13: master_preferences
@@ -619,7 +618,6 @@ without support for alsa, cups, dbus, gconf, gio, kerberos, pulseaudio, or
udev.
%prep
-%setup -q -T -c -n %{name}-policies -a 10
%setup -q -T -c -n depot_tools -a 2
%if 0%{tests}
%setup -q -n chromium-%{version} -b 1
@@ -1323,10 +1321,8 @@ sed -i 's|@@CRD_PATH@@|%{crd_path}|g' %{buildroot}%{_unitdir}/chrome-remote-desk
# Add directories for policy management
mkdir -p %{buildroot}%{_sysconfdir}/chromium/policies/managed
mkdir -p %{buildroot}%{_sysconfdir}/chromium/policies/recommended
-cp -a ../%{name}-policies/common/html/en-US/*.html .
-# linux json files no longer in .zip file
-#cp -a ../%{name}-policies/linux/examples/*.json .
+cp -a out/Release/gen/chrome/app/policy/common/html/en-US/*.html .
cp -a out/Release/gen/chrome/app/policy/linux/examples/chrome.json .
mkdir -p %{buildroot}%{_datadir}/icons/hicolor/256x256/apps
diff --git a/sources b/sources
index 64106c5..9d1d29d 100644
--- a/sources
+++ b/sources
@@ -1,3 +1,2 @@
SHA512 (depot_tools.git-master.tar.gz) = d3d6a1873b2b0296a8cd99e0d8d2e629a17b1808934b4972556168f8b4ccea60577ebaeab4445baf15afb1b04080808db59a832a5b61d247bd48da14fa6acf03
-SHA512 (policy_templates.zip) = a7e07808a5a053e9e32fe879630ac227369f46e730b6155a570ae096e65e802297a6e635d325886720e55d06ea68ab598bc6b361ede84e61e5e0e577fd4c38fb
SHA512 (chromium-62.0.3202.62-clean.tar.xz) = 5151cdd4cc9f5735984ea16615311dbec759d62496b619fa5a04e06e08821ccba7f11e2d1835e2020edcb783150cc7f1880e62084ae9f69057fabea0459e147b
7 years
[chromium-freeworld: 5/15] Fix the policy templates handling
by Miro Hrončok
commit 2abf30d2cca743fd4e3e0ed01d4b9df315aad65d
Author: Tomas Popela <tpopela(a)redhat.com>
Date: Wed Oct 25 10:30:34 2017 +0200
Fix the policy templates handling
Basically revert my previous commits as the policy templates are
generated during the build. The only thing that we were copying out from
the tarballs was the policy templates documentation, but that one is
generated as well so use that one and remove the policy_templates zip
file from sources
chromium-latest.py | 30 ------------------------------
chromium.spec | 6 +-----
sources | 1 -
3 files changed, 1 insertion(+), 36 deletions(-)
---
diff --git a/chromium-latest.py b/chromium-latest.py
index 2efe44b..c77899d 100755
--- a/chromium-latest.py
+++ b/chromium-latest.py
@@ -209,33 +209,6 @@ def download_chrome_latest_rpm(arch):
remove_file_if_exists (chrome_rpm)
sys.exit(1)
-def remove_and_download_latest_policy_templates(version_string):
-
- policy_file = 'policy_templates.zip'
- if version_string != 'stable':
- if version_string == 'unstable':
- policy_file = "dev_" + policy_file
- else:
- policy_file = version_string + "_" + policy_file
-
- path = 'https://dl.google.com/chrome/policy/%s' % policy_file
- remove_file_if_exists(policy_file)
-
- # Let's make sure we haven't already downloaded it.
- if os.path.isfile("./%s" % policy_file):
- print "%s already exists!" % policy_file
- else:
- print "Downloading %s" % path
- # Perhaps look at using python-progressbar at some point?
- info=urllib.urlretrieve(path, policy_file, reporthook=dlProgress)[1]
- urllib.urlcleanup()
- print ""
- if (info["Content-Type"] != "application/octet-stream"):
- print 'Policy templates are not on servers.' % version_string
- remove_file_if_exists (policy_file)
- sys.exit(1)
-
-
# This is where the magic happens
if __name__ == '__main__':
@@ -321,9 +294,6 @@ if __name__ == '__main__':
download_version(chromium_version)
- # Always download the newest policy templates
- remove_and_download_latest_policy_templates(version_string)
-
# Lets make sure we haven't unpacked it already
latest_dir = "%s/chromium-%s" % (chromium_root_dir, chromium_version)
if (args.clean and os.path.isdir(latest_dir)):
diff --git a/chromium.spec b/chromium.spec
index f9ec65e..53569ec 100644
--- a/chromium.spec
+++ b/chromium.spec
@@ -247,7 +247,6 @@ Source7: get_free_ffmpeg_source_files.py
Source8: get_linux_tests_names.py
# GNOME stuff
Source9: chromium-browser.xml
-Source10: https://dl.google.com/dl/edgedl/chrome/policy/policy_templates.zip
Source11: chrome-remote-desktop@.service
Source13: master_preferences
@@ -617,7 +616,6 @@ without support for alsa, cups, dbus, gconf, gio, kerberos, pulseaudio, or
udev.
%prep
-%setup -q -T -c -n %{name}-policies -a 10
%setup -q -T -c -n depot_tools -a 2
%if 0%{tests}
%setup -q -n chromium-%{version} -b 1
@@ -1317,10 +1315,8 @@ sed -i 's|@@CRD_PATH@@|%{crd_path}|g' %{buildroot}%{_unitdir}/chrome-remote-desk
# Add directories for policy management
mkdir -p %{buildroot}%{_sysconfdir}/chromium/policies/managed
mkdir -p %{buildroot}%{_sysconfdir}/chromium/policies/recommended
-cp -a ../%{name}-policies/common/html/en-US/*.html .
-# linux json files no longer in .zip file
-#cp -a ../%{name}-policies/linux/examples/*.json .
+cp -a out/Release/gen/chrome/app/policy/common/html/en-US/*.html .
cp -a out/Release/gen/chrome/app/policy/linux/examples/chrome.json .
mkdir -p %{buildroot}%{_datadir}/icons/hicolor/256x256/apps
diff --git a/sources b/sources
index 64106c5..9d1d29d 100644
--- a/sources
+++ b/sources
@@ -1,3 +1,2 @@
SHA512 (depot_tools.git-master.tar.gz) = d3d6a1873b2b0296a8cd99e0d8d2e629a17b1808934b4972556168f8b4ccea60577ebaeab4445baf15afb1b04080808db59a832a5b61d247bd48da14fa6acf03
-SHA512 (policy_templates.zip) = a7e07808a5a053e9e32fe879630ac227369f46e730b6155a570ae096e65e802297a6e635d325886720e55d06ea68ab598bc6b361ede84e61e5e0e577fd4c38fb
SHA512 (chromium-62.0.3202.62-clean.tar.xz) = 5151cdd4cc9f5735984ea16615311dbec759d62496b619fa5a04e06e08821ccba7f11e2d1835e2020edcb783150cc7f1880e62084ae9f69057fabea0459e147b
7 years