diff --git a/.firefox.metadata b/.firefox.metadata
new file mode 100644
index 0000000..f33918f
--- /dev/null
+++ b/.firefox.metadata
@@ -0,0 +1,9 @@
+18a8f30a0356c751b8d0ea6f76e764cab13ee046 SOURCES/Python-2.7.13.tar.xz
+e86c38c48960b95353503b78e1de9ddca1ed34d7 SOURCES/cbindgen-vendor.tar.xz
+ee6406ec1280afc24d4a90c392ff09ff5060686e SOURCES/firefox-68.9.0esr.source.tar.xz
+cbb1c23ae26fc81578036403dbceef7cd10fc98b SOURCES/firefox-langpacks-68.9.0esr-20200529.tar.xz
+0de63f863b158454b9429234b52ed28a397ec45c SOURCES/gtk3-private-3.22.26-1.el6.src.rpm
+e188ab1a444697bc649e223c28389d82ca94c472 SOURCES/libffi-3.0.13-18.el7_3.src.rpm
+4f8d3bf2483d95261ff90742ecec82d6a899eca3 SOURCES/nodejs-8.11.4-1.3.fc27.src.rpm
+a379070abf5000cde61411c97af7e733b267a4d3 SOURCES/openssl-1.0.2k-19.6.bundle.el7_7.src.rpm
+77fd30f7ebc12a629a31c1e252cec06af55a71fe SOURCES/yasm-1.2.0-3.el5.src.rpm
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..94cbab6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,9 @@
+SOURCES/Python-2.7.13.tar.xz
+SOURCES/cbindgen-vendor.tar.xz
+SOURCES/firefox-68.9.0esr.source.tar.xz
+SOURCES/firefox-langpacks-68.9.0esr-20200529.tar.xz
+SOURCES/gtk3-private-3.22.26-1.el6.src.rpm
+SOURCES/libffi-3.0.13-18.el7_3.src.rpm
+SOURCES/nodejs-8.11.4-1.3.fc27.src.rpm
+SOURCES/openssl-1.0.2k-19.6.bundle.el7_7.src.rpm
+SOURCES/yasm-1.2.0-3.el5.src.rpm
diff --git a/SOURCES/build-debug-qcms.patch b/SOURCES/build-debug-qcms.patch
new file mode 100644
index 0000000..a65223a
--- /dev/null
+++ b/SOURCES/build-debug-qcms.patch
@@ -0,0 +1,12 @@
+diff -up firefox-60.0/gfx/qcms/transform-altivec.c.debug firefox-60.0/gfx/qcms/transform-altivec.c
+--- firefox-60.0/gfx/qcms/transform-altivec.c.debug	2018-05-15 09:26:43.603043100 +0200
++++ firefox-60.0/gfx/qcms/transform-altivec.c	2018-05-15 09:28:57.302385632 +0200
+@@ -30,7 +30,7 @@
+ static const ALIGN float floatScaleX4 = FLOATSCALE;
+ static const ALIGN float clampMaxValueX4 = CLAMPMAXVAL;
+ 
+-inline vector float load_aligned_float(float *dataPtr)
++static vector float load_aligned_float(float *dataPtr)
+ {
+ 	vector float data = vec_lde(0, dataPtr);
+ 	vector unsigned char moveToStart = vec_lvsl(0, dataPtr);
diff --git a/SOURCES/build-icu-big-endian.patch b/SOURCES/build-icu-big-endian.patch
new file mode 100644
index 0000000..ee5fd6a
--- /dev/null
+++ b/SOURCES/build-icu-big-endian.patch
@@ -0,0 +1,13 @@
+diff -up firefox-68.0/build/autoconf/icu.m4.icu firefox-68.0/build/autoconf/icu.m4
+--- firefox-68.0/build/autoconf/icu.m4.icu	2019-06-25 21:25:25.394425654 +0200
++++ firefox-68.0/build/autoconf/icu.m4	2019-06-25 21:26:23.544210474 +0200
+@@ -78,7 +78,7 @@ if test -n "$USE_ICU"; then
+     # TODO: the l is actually endian-dependent
+     # We could make this set as 'l' or 'b' for little or big, respectively,
+     # but we'd need to check in a big-endian version of the file.
+-    ICU_DATA_FILE="icudt${version}l.dat"
++    ICU_DATA_FILE="icudt${version}b.dat"
+ fi
+ 
+ AC_SUBST(MOZ_ICU_VERSION)
+
diff --git a/SOURCES/build-icu-make.patch b/SOURCES/build-icu-make.patch
new file mode 100644
index 0000000..6a04091
--- /dev/null
+++ b/SOURCES/build-icu-make.patch
@@ -0,0 +1,13 @@
+diff -up firefox-68.8.0/intl/icu_sources_data.py.icu-makefile firefox-68.8.0/intl/icu_sources_data.py
+--- firefox-68.8.0/intl/icu_sources_data.py.icu-makefile	2020-05-11 17:00:03.642605718 +0200
++++ firefox-68.8.0/intl/icu_sources_data.py	2020-05-11 17:00:37.774642749 +0200
+@@ -246,8 +246,7 @@ def update_data_file(topsrcdir):
+     if not try_run(
+             'icu-make',
+             ['make',
+-             '--jobs=%d' % multiprocessing.cpu_count(),
+-             '--output-sync'],
++             '--jobs=1'],
+             cwd=objdir):
+         return False
+     print('Copying ICU data file...')
diff --git a/SOURCES/build-mozconfig-fix.patch b/SOURCES/build-mozconfig-fix.patch
new file mode 100644
index 0000000..91dffb1
--- /dev/null
+++ b/SOURCES/build-mozconfig-fix.patch
@@ -0,0 +1,12 @@
+diff -up mozilla-release-c61f5f5ead48c78a80c80db5c489bdc7cfaf8175/python/mozbuild/mozbuild/mozconfig.py.mozconfig-fix mozilla-release-c61f5f5ead48c78a80c80db5c489bdc7cfaf8175/python/mozbuild/mozbuild/mozconfig.py
+--- mozilla-release-c61f5f5ead48c78a80c80db5c489bdc7cfaf8175/python/mozbuild/mozbuild/mozconfig.py.mozconfig-fix	2018-03-13 17:22:19.018466884 +0100
++++ mozilla-release-c61f5f5ead48c78a80c80db5c489bdc7cfaf8175/python/mozbuild/mozbuild/mozconfig.py	2018-03-13 17:23:57.379559640 +0100
+@@ -446,7 +446,7 @@ class MozconfigLoader(object):
+                             value = value[1:]
+ 
+                         # Lines with a quote not ending in a quote are multi-line.
+-                        if has_quote and not value.endswith("'"):
++                        if has_quote and not value.endswith(("'", ";")):
+                             in_variable = name
+                             current.append(value)
+                             continue
diff --git a/SOURCES/build-nss-version.patch b/SOURCES/build-nss-version.patch
new file mode 100644
index 0000000..7847090
--- /dev/null
+++ b/SOURCES/build-nss-version.patch
@@ -0,0 +1,12 @@
+diff -up firefox-68.3.0/old-configure.in.nss-version firefox-68.3.0/old-configure.in
+--- firefox-68.3.0/old-configure.in.nss-version	2019-11-27 19:48:01.045677621 +0100
++++ firefox-68.3.0/old-configure.in	2019-11-27 19:59:52.856894047 +0100
+@@ -1537,7 +1537,7 @@ MOZ_ARG_WITH_BOOL(system-nss,
+     _USE_SYSTEM_NSS=1 )
+ 
+ if test -n "$_USE_SYSTEM_NSS"; then
+-    AM_PATH_NSS(3.44.4, [MOZ_SYSTEM_NSS=1], [AC_MSG_ERROR([you don't have NSS installed or your version is too old])])
++    AM_PATH_NSS(3.44.0, [MOZ_SYSTEM_NSS=1], [AC_MSG_ERROR([you don't have NSS installed or your version is too old])])
+ fi
+ 
+ NSS_CFLAGS="$NSS_CFLAGS -I${DIST}/include/nss"
diff --git a/SOURCES/build-ppc64le-inline.patch b/SOURCES/build-ppc64le-inline.patch
new file mode 100644
index 0000000..de0f6d9
--- /dev/null
+++ b/SOURCES/build-ppc64le-inline.patch
@@ -0,0 +1,27 @@
+diff -up firefox-68.1.0/js/xpconnect/src/XPCWrappedNative.cpp.ppc64le-inline firefox-68.1.0/js/xpconnect/src/XPCWrappedNative.cpp
+--- firefox-68.1.0/js/xpconnect/src/XPCWrappedNative.cpp.ppc64le-inline	2019-08-26 18:52:28.000000000 +0200
++++ firefox-68.1.0/js/xpconnect/src/XPCWrappedNative.cpp	2019-08-29 08:49:57.695687874 +0200
+@@ -1092,7 +1092,11 @@ class MOZ_STACK_CLASS CallMethodHelper f
+   MOZ_ALWAYS_INLINE bool GetOutParamSource(uint8_t paramIndex,
+                                            MutableHandleValue srcp) const;
+ 
++#if (__GNUC__ && __linux__ && __PPC64__ && _LITTLE_ENDIAN)
++  bool GatherAndConvertResults();
++#else
+   MOZ_ALWAYS_INLINE bool GatherAndConvertResults();
++#endif
+ 
+   MOZ_ALWAYS_INLINE bool QueryInterfaceFastPath();
+ 
+@@ -1139,7 +1143,11 @@ class MOZ_STACK_CLASS CallMethodHelper f
+ 
+   ~CallMethodHelper();
+ 
++#if (__GNUC__ && __linux__ && __PPC64__ && _LITTLE_ENDIAN)
++  bool Call();
++#else
+   MOZ_ALWAYS_INLINE bool Call();
++#endif
+ 
+   // Trace implementation so we can put our CallMethodHelper in a Rooted<T>.
+   void trace(JSTracer* aTrc);
diff --git a/SOURCES/distribution.ini b/SOURCES/distribution.ini
new file mode 100644
index 0000000..8bf461e
--- /dev/null
+++ b/SOURCES/distribution.ini
@@ -0,0 +1,9 @@
+[Global]
+id=redhat
+version=1.0
+about=Mozilla Firefox for Red Hat Enterprise Linux
+
+[Preferences]
+app.distributor=redhat
+app.distributor.channel=redhat
+app.partner.fedora=redhat
diff --git a/SOURCES/firefox-debugedits-error.patch b/SOURCES/firefox-debugedits-error.patch
new file mode 100644
index 0000000..a4b005f
--- /dev/null
+++ b/SOURCES/firefox-debugedits-error.patch
@@ -0,0 +1,50 @@
+diff -up firefox-68.0/media/libyuv/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.old firefox-68.0/media/libyuv/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium
+diff -up firefox-68.0/media/webrtc/trunk/Makefile.old firefox-68.0/media/webrtc/trunk/Makefile
+diff -up firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft.cc.old firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft.cc
+--- firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft.cc.old	2019-06-12 08:17:02.673268442 +0200
++++ firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft.cc	2019-06-12 08:17:13.582328073 +0200
+@@ -21,7 +21,7 @@
+  *  be found in the AUTHORS file in the root of the source tree.
+  */
+ 
+-#include "modules/audio_processing//utility/ooura_fft.h"
++#include "modules/audio_processing/utility/ooura_fft.h"
+ 
+ #include <math.h>
+ 
+diff -up firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft_sse2.cc.old firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft_sse2.cc
+--- firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft_sse2.cc.old	2019-06-12 08:17:36.671454285 +0200
++++ firefox-68.0/media/webrtc/trunk/webrtc/modules/audio_processing/utility/ooura_fft_sse2.cc	2019-06-12 08:17:46.989510679 +0200
+@@ -8,7 +8,7 @@
+  *  be found in the AUTHORS file in the root of the source tree.
+  */
+ 
+-#include "modules/audio_processing//utility/ooura_fft.h"
++#include "modules/audio_processing/utility/ooura_fft.h"
+ 
+ #include <emmintrin.h>
+ 
+diff -up firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_avx2.c.old firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_avx2.c
+--- firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_avx2.c.old	2019-06-12 08:16:15.673011534 +0200
++++ firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_avx2.c	2019-06-12 08:16:22.602049410 +0200
+@@ -17,7 +17,7 @@
+ #include "aom_dsp/blend.h"
+ #include "aom/aom_integer.h"
+ #include "aom_dsp/x86/synonyms.h"
+-#include "aom_dsp/x86//masked_sad_intrin_ssse3.h"
++#include "aom_dsp/x86/masked_sad_intrin_ssse3.h"
+ 
+ static INLINE unsigned int masked_sad32xh_avx2(
+     const uint8_t *src_ptr, int src_stride, const uint8_t *a_ptr, int a_stride,
+diff -up firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_ssse3.c.old firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_ssse3.c
+--- firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_ssse3.c.old	2019-06-12 08:16:35.404119384 +0200
++++ firefox-68.0/third_party/aom/aom_dsp/x86/masked_sad_intrin_ssse3.c	2019-06-12 08:16:43.415163174 +0200
+@@ -19,7 +19,7 @@
+ #include "aom/aom_integer.h"
+ #include "aom_dsp/x86/synonyms.h"
+ 
+-#include "aom_dsp/x86//masked_sad_intrin_ssse3.h"
++#include "aom_dsp/x86/masked_sad_intrin_ssse3.h"
+ 
+ // For width a multiple of 16
+ static INLINE unsigned int masked_sad_ssse3(const uint8_t *src_ptr,
diff --git a/SOURCES/firefox-dont-check-binary.patch b/SOURCES/firefox-dont-check-binary.patch
new file mode 100644
index 0000000..c498034
--- /dev/null
+++ b/SOURCES/firefox-dont-check-binary.patch
@@ -0,0 +1,47 @@
+diff -up firefox-68.0/config/rules.mk.old firefox-68.0/config/rules.mk
+--- firefox-68.0/config/rules.mk.old	2019-06-26 09:36:58.537034443 +0200
++++ firefox-68.0/config/rules.mk	2019-06-26 09:37:38.004970573 +0200
+@@ -569,7 +569,6 @@ ifdef MOZ_PROFILE_GENERATE
+ endif
+ else # !WINNT || GNU_CC
+ 	$(call EXPAND_CC_OR_CXX,$@) -o $@ $(COMPUTED_CXX_LDFLAGS) $(PGO_CFLAGS) $($(notdir $@)_$(OBJS_VAR_SUFFIX)) $(RESFILE) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(STATIC_LIBS) $(RUST_STATIC_LIB) $(MOZ_PROGRAM_LDFLAGS) $(SHARED_LIBS) $(OS_LIBS)
+-	$(call py_action,check_binary,--target $@)
+ endif # WINNT && !GNU_CC
+ 
+ ifdef ENABLE_STRIP
+@@ -604,9 +603,6 @@ else
+ 	$(HOST_CC) -o $@ $(HOST_C_LDFLAGS) $(HOST_LDFLAGS) $($(notdir $@)_OBJS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
+ endif # HOST_CPP_PROG_LINK
+ endif
+-ifndef CROSS_COMPILE
+-	$(call py_action,check_binary,--host $@)
+-endif
+ 
+ #
+ # This is an attempt to support generation of multiple binaries
+@@ -630,7 +626,6 @@ ifdef MSMANIFEST_TOOL
+ endif	# MSVC with manifest tool
+ else
+ 	$(call EXPAND_CC_OR_CXX,$@) $(COMPUTED_CXX_LDFLAGS) $(PGO_CFLAGS) -o $@ $($@_$(OBJS_VAR_SUFFIX)) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(STATIC_LIBS) $(MOZ_PROGRAM_LDFLAGS) $(SHARED_LIBS) $(OS_LIBS)
+-	$(call py_action,check_binary,--target $@)
+ endif # WINNT && !GNU_CC
+ 
+ ifdef ENABLE_STRIP
+@@ -651,9 +646,6 @@ else
+ 	$(HOST_CC) $(HOST_OUTOPTION)$@ $(HOST_C_LDFLAGS) $($(notdir $@)_OBJS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
+ endif
+ endif
+-ifndef CROSS_COMPILE
+-	$(call py_action,check_binary,--host $@)
+-endif
+ 
+ $(LIBRARY): $(OBJS) $(STATIC_LIBS) $(EXTRA_DEPS) $(GLOBAL_DEPS)
+ 	$(REPORT_BUILD)
+@@ -691,7 +683,6 @@ ifndef INCREMENTAL_LINKER
+ 	$(RM) $@
+ endif
+ 	$(MKSHLIB) $($@_$(OBJS_VAR_SUFFIX)) $(RESFILE) $(LDFLAGS) $(STATIC_LIBS) $(RUST_STATIC_LIB) $(SHARED_LIBS) $(EXTRA_DSO_LDOPTS) $(MOZ_GLUE_LDFLAGS) $(OS_LIBS)
+-	$(call py_action,check_binary,--target $@)
+ 
+ ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH))
+ ifdef MSMANIFEST_TOOL
diff --git a/SOURCES/firefox-enable-addons.patch b/SOURCES/firefox-enable-addons.patch
new file mode 100644
index 0000000..15d0707
--- /dev/null
+++ b/SOURCES/firefox-enable-addons.patch
@@ -0,0 +1,13 @@
+diff -up firefox-55.0/browser/app/profile/firefox.js.addons firefox-55.0/browser/app/profile/firefox.js
+--- firefox-55.0/browser/app/profile/firefox.js.addons	2017-08-02 10:58:30.566363833 +0200
++++ firefox-55.0/browser/app/profile/firefox.js	2017-08-02 10:59:15.377216959 +0200
+@@ -65,7 +65,8 @@ pref("extensions.systemAddon.update.url"
+ 
+ // Disable add-ons that are not installed by the user in all scopes by default.
+ // See the SCOPE constants in AddonManager.jsm for values to use here.
+-pref("extensions.autoDisableScopes", 15);
++pref("extensions.autoDisableScopes", 0);
++pref("extensions.showMismatchUI", false);
+ // Scopes to scan for changes at startup.
+ pref("extensions.startupScanScopes", 0);
+ 
diff --git a/SOURCES/firefox-mozconfig b/SOURCES/firefox-mozconfig
new file mode 100644
index 0000000..5585559
--- /dev/null
+++ b/SOURCES/firefox-mozconfig
@@ -0,0 +1,28 @@
+. $topsrcdir/browser/config/mozconfig
+
+ac_add_options --enable-default-toolkit=cairo-gtk3
+
+ac_add_options --prefix="$PREFIX"
+ac_add_options --libdir="$LIBDIR"
+ac_add_options --with-system-zlib
+ac_add_options --with-system-bz2
+ac_add_options --disable-strip
+ac_add_options --disable-tests
+#ac_add_options --enable-libnotify
+ac_add_options --enable-necko-wifi
+ac_add_options --enable-startup-notification
+ac_add_options --disable-updater
+ac_add_options --enable-chrome-format=omni
+ac_add_options --enable-pulseaudio
+ac_add_options --with-system-icu
+ac_add_options --with-mozilla-api-keyfile=../mozilla-api-key
+ac_add_options --with-google-location-service-api-keyfile=../google-api-key
+ac_add_options --with-google-safebrowsing-api-keyfile=../google-api-key
+ac_add_options --disable-av1
+
+export BUILD_OFFICIAL=1
+export MOZILLA_OFFICIAL=1
+export MOZ_TELEMETRY_REPORTING=1
+mk_add_options BUILD_OFFICIAL=1
+mk_add_options MOZILLA_OFFICIAL=1
+mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/objdir
diff --git a/SOURCES/firefox-pipewire-0-3.patch b/SOURCES/firefox-pipewire-0-3.patch
new file mode 100644
index 0000000..7aa06b9
--- /dev/null
+++ b/SOURCES/firefox-pipewire-0-3.patch
@@ -0,0 +1,821 @@
+diff --git a/config/system-headers.mozbuild b/config/system-headers.mozbuild
+index 2081d0c683a4..641133bf1ea4 100644
+--- a/config/system-headers.mozbuild
++++ b/config/system-headers.mozbuild
+@@ -314,6 +314,7 @@ system_headers = [
+     'Gestalt.h',
+     'getopt.h',
+     'gio/gio.h',
++    'gio/gunixfdlist.h',
+     'glibconfig.h',
+     'glib.h',
+     'glib-object.h',
+@@ -607,6 +608,7 @@ system_headers = [
+     'Pgenerr.h',
+     'PGenErr.h',
+     'Ph.h',
++    'pipewire/pipewire.h',
+     'pixman.h',
+     'pk11func.h',
+     'pk11pqg.h',
+diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build b/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build
+index 90b40431c7e4..d844aa79d591 100644
+--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build
++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build
+@@ -194,6 +194,30 @@ if CONFIG["OS_TARGET"] == "Linux":
+         "/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc"
+     ]
+ 
++# PipeWire specific files
++if CONFIG["OS_TARGET"] == "Linux":
++
++    DEFINES["WEBRTC_USE_PIPEWIRE"] = "1"
++
++    OS_LIBS += [
++        "rt",
++        "pipewire-0.3",
++        "glib-2.0",
++        "gio-2.0",
++        "gobject-2.0"
++    ]
++
++    CXXFLAGS += CONFIG['TK_CFLAGS']
++    CXXFLAGS += [ "-I/usr/include/pipewire-0.3" ]
++    CXXFLAGS += [ "-I/usr/include/spa-0.2" ]
++
++    UNIFIED_SOURCES += [
++        "/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc",
++        "/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc",
++        "/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc"
++    ]
++
++
+ if CONFIG["OS_TARGET"] == "NetBSD":
+ 
+     DEFINES["USE_X11"] = "1"
+diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h b/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h
+index 1eb8ead26efa..316468eed1fc 100644
+--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h
++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h
+@@ -141,7 +141,7 @@ class DesktopCaptureOptions {
+   bool disable_effects_ = true;
+   bool detect_updated_region_ = false;
+ #if defined(WEBRTC_USE_PIPEWIRE)
+-  bool allow_pipewire_ = false;
++  bool allow_pipewire_ = true;
+ #endif
+ };
+ 
+diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc
+index 379341c833de..53e2683df2e8 100644
+--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc
++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc
+@@ -15,8 +15,11 @@
+ 
+ #include <spa/param/format-utils.h>
+ #include <spa/param/props.h>
+-#include <spa/param/video/raw-utils.h>
+-#include <spa/support/type-map.h>
++
++#include <linux/dma-buf.h>
++#include <sys/mman.h>
++#include <sys/ioctl.h>
++#include <sys/syscall.h>
+ 
+ #include <memory>
+ #include <utility>
+@@ -36,31 +39,36 @@ const char kSessionInterfaceName[] = "org.freedesktop.portal.Session";
+ const char kRequestInterfaceName[] = "org.freedesktop.portal.Request";
+ const char kScreenCastInterfaceName[] = "org.freedesktop.portal.ScreenCast";
+ 
+-// static
+-void BaseCapturerPipeWire::OnStateChanged(void* data,
+-                                          pw_remote_state old_state,
+-                                          pw_remote_state state,
+-                                          const char* error_message) {
+-  BaseCapturerPipeWire* that = static_cast<BaseCapturerPipeWire*>(data);
+-  RTC_DCHECK(that);
+ 
+-  switch (state) {
+-    case PW_REMOTE_STATE_ERROR:
+-      RTC_LOG(LS_ERROR) << "PipeWire remote state error: " << error_message;
+-      break;
+-    case PW_REMOTE_STATE_CONNECTED:
+-      RTC_LOG(LS_INFO) << "PipeWire remote state: connected.";
+-      that->CreateReceivingStream();
+-      break;
+-    case PW_REMOTE_STATE_CONNECTING:
+-      RTC_LOG(LS_INFO) << "PipeWire remote state: connecting.";
++// static
++void BaseCapturerPipeWire::SyncDmaBuf(int fd, uint64_t start_or_end) {
++  struct dma_buf_sync sync = { 0 };
++
++  sync.flags = start_or_end | DMA_BUF_SYNC_READ;
++
++  while(true) {
++    int ret;
++    ret = ioctl (fd, DMA_BUF_IOCTL_SYNC, &sync);
++    if (ret == -1 && errno == EINTR) {
++      continue;
++    } else if (ret == -1) {
++      RTC_LOG(LS_ERROR) << "Failed to synchronize DMA buffer: " << g_strerror(errno);
+       break;
+-    case PW_REMOTE_STATE_UNCONNECTED:
+-      RTC_LOG(LS_INFO) << "PipeWire remote state: unconnected.";
++    } else {
+       break;
++    }
+   }
+ }
+ 
++// static
++void BaseCapturerPipeWire::OnCoreError(void *data,
++                                       uint32_t id,
++                                       int seq,
++                                       int res,
++                                       const char *message) {
++  RTC_LOG(LS_ERROR) << "core error: " << message;
++}
++
+ // static
+ void BaseCapturerPipeWire::OnStreamStateChanged(void* data,
+                                                 pw_stream_state old_state,
+@@ -73,76 +81,54 @@ void BaseCapturerPipeWire::OnStreamStateChanged(void* data,
+     case PW_STREAM_STATE_ERROR:
+       RTC_LOG(LS_ERROR) << "PipeWire stream state error: " << error_message;
+       break;
+-    case PW_STREAM_STATE_CONFIGURE:
+-      pw_stream_set_active(that->pw_stream_, true);
+-      break;
+-    case PW_STREAM_STATE_UNCONNECTED:
+-    case PW_STREAM_STATE_CONNECTING:
+-    case PW_STREAM_STATE_READY:
+     case PW_STREAM_STATE_PAUSED:
+     case PW_STREAM_STATE_STREAMING:
++    case PW_STREAM_STATE_UNCONNECTED:
++    case PW_STREAM_STATE_CONNECTING:
+       break;
+   }
+ }
+ 
+ // static
+-void BaseCapturerPipeWire::OnStreamFormatChanged(void* data,
+-                                                 const struct spa_pod* format) {
++void BaseCapturerPipeWire::OnStreamParamChanged(void *data, uint32_t id,
++                                                const struct spa_pod *format) {
+   BaseCapturerPipeWire* that = static_cast<BaseCapturerPipeWire*>(data);
+   RTC_DCHECK(that);
+ 
+-  RTC_LOG(LS_INFO) << "PipeWire stream format changed.";
++  RTC_LOG(LS_INFO) << "PipeWire stream param changed.";
+ 
+-  if (!format) {
+-    pw_stream_finish_format(that->pw_stream_, /*res=*/0, /*params=*/nullptr,
+-                            /*n_params=*/0);
++  if (!format || id != SPA_PARAM_Format) {
+     return;
+   }
+ 
+-  that->spa_video_format_ = new spa_video_info_raw();
+-  spa_format_video_raw_parse(format, that->spa_video_format_,
+-                             &that->pw_type_->format_video);
++  spa_format_video_raw_parse(format, &that->spa_video_format_);
+ 
+-  auto width = that->spa_video_format_->size.width;
+-  auto height = that->spa_video_format_->size.height;
++  auto width = that->spa_video_format_.size.width;
++  auto height = that->spa_video_format_.size.height;
+   auto stride = SPA_ROUND_UP_N(width * kBytesPerPixel, 4);
+   auto size = height * stride;
+ 
++  that->desktop_size_ = DesktopSize(width, height);
++
+   uint8_t buffer[1024] = {};
+   auto builder = spa_pod_builder{buffer, sizeof(buffer)};
+ 
+   // Setup buffers and meta header for new format.
+-  const struct spa_pod* params[2];
+-  params[0] = reinterpret_cast<spa_pod*>(spa_pod_builder_object(
+-      &builder,
+-      // id to enumerate buffer requirements
+-      that->pw_core_type_->param.idBuffers,
+-      that->pw_core_type_->param_buffers.Buffers,
+-      // Size: specified as integer (i) and set to specified size
+-      ":", that->pw_core_type_->param_buffers.size, "i", size,
+-      // Stride: specified as integer (i) and set to specified stride
+-      ":", that->pw_core_type_->param_buffers.stride, "i", stride,
+-      // Buffers: specifies how many buffers we want to deal with, set as
+-      // integer (i) where preferred number is 8, then allowed number is defined
+-      // as range (r) from min and max values and it is undecided (u) to allow
+-      // negotiation
+-      ":", that->pw_core_type_->param_buffers.buffers, "iru", 8,
+-      SPA_POD_PROP_MIN_MAX(1, 32),
+-      // Align: memory alignment of the buffer, set as integer (i) to specified
+-      // value
+-      ":", that->pw_core_type_->param_buffers.align, "i", 16));
+-  params[1] = reinterpret_cast<spa_pod*>(spa_pod_builder_object(
+-      &builder,
+-      // id to enumerate supported metadata
+-      that->pw_core_type_->param.idMeta, that->pw_core_type_->param_meta.Meta,
+-      // Type: specified as id or enum (I)
+-      ":", that->pw_core_type_->param_meta.type, "I",
+-      that->pw_core_type_->meta.Header,
+-      // Size: size of the metadata, specified as integer (i)
+-      ":", that->pw_core_type_->param_meta.size, "i",
+-      sizeof(struct spa_meta_header)));
+-
+-  pw_stream_finish_format(that->pw_stream_, /*res=*/0, params, /*n_params=*/2);
++  const struct spa_pod* params[3];
++  params[0] = reinterpret_cast<spa_pod *>(spa_pod_builder_add_object(&builder,
++              SPA_TYPE_OBJECT_ParamBuffers, SPA_PARAM_Buffers,
++              SPA_PARAM_BUFFERS_size, SPA_POD_Int(size),
++              SPA_PARAM_BUFFERS_stride, SPA_POD_Int(stride),
++              SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int(8, 1, 32)));
++  params[1] = reinterpret_cast<spa_pod *>(spa_pod_builder_add_object(&builder,
++              SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++              SPA_PARAM_META_type, SPA_POD_Id(SPA_META_Header),
++              SPA_PARAM_META_size, SPA_POD_Int(sizeof(struct spa_meta_header))));
++  params[2] = reinterpret_cast<spa_pod *>(spa_pod_builder_add_object(&builder,
++              SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
++              SPA_PARAM_META_type, SPA_POD_Id (SPA_META_VideoCrop),
++              SPA_PARAM_META_size, SPA_POD_Int (sizeof(struct spa_meta_region))));
++  pw_stream_update_params(that->pw_stream_, params, 3);
+ }
+ 
+ // static
+@@ -150,15 +136,25 @@ void BaseCapturerPipeWire::OnStreamProcess(void* data) {
+   BaseCapturerPipeWire* that = static_cast<BaseCapturerPipeWire*>(data);
+   RTC_DCHECK(that);
+ 
+-  pw_buffer* buf = nullptr;
++  struct pw_buffer *next_buffer;
++  struct pw_buffer *buffer = nullptr;
+ 
+-  if (!(buf = pw_stream_dequeue_buffer(that->pw_stream_))) {
++  next_buffer = pw_stream_dequeue_buffer(that->pw_stream_);
++  while (next_buffer) {
++    buffer = next_buffer;
++    next_buffer = pw_stream_dequeue_buffer(that->pw_stream_);
++
++    if (next_buffer)
++      pw_stream_queue_buffer (that->pw_stream_, buffer);
++  }
++
++  if (!buffer) {
+     return;
+   }
+ 
+-  that->HandleBuffer(buf);
++  that->HandleBuffer(buffer);
+ 
+-  pw_stream_queue_buffer(that->pw_stream_, buf);
++  pw_stream_queue_buffer(that->pw_stream_, buffer);
+ }
+ 
+ BaseCapturerPipeWire::BaseCapturerPipeWire(CaptureSourceType source_type)
+@@ -169,38 +165,22 @@ BaseCapturerPipeWire::~BaseCapturerPipeWire() {
+     pw_thread_loop_stop(pw_main_loop_);
+   }
+ 
+-  if (pw_type_) {
+-    delete pw_type_;
+-  }
+-
+-  if (spa_video_format_) {
+-    delete spa_video_format_;
+-  }
+-
+   if (pw_stream_) {
+     pw_stream_destroy(pw_stream_);
+   }
+ 
+-  if (pw_remote_) {
+-    pw_remote_destroy(pw_remote_);
++  if (pw_core_) {
++    pw_core_disconnect(pw_core_);
+   }
+ 
+-  if (pw_core_) {
+-    pw_core_destroy(pw_core_);
++  if (pw_context_) {
++    pw_context_destroy(pw_context_);
+   }
+ 
+   if (pw_main_loop_) {
+     pw_thread_loop_destroy(pw_main_loop_);
+   }
+ 
+-  if (pw_loop_) {
+-    pw_loop_destroy(pw_loop_);
+-  }
+-
+-  if (current_frame_) {
+-    free(current_frame_);
+-  }
+-
+   if (start_request_signal_id_) {
+     g_dbus_connection_signal_unsubscribe(connection_, start_request_signal_id_);
+   }
+@@ -250,27 +230,35 @@ void BaseCapturerPipeWire::InitPortal() {
+ void BaseCapturerPipeWire::InitPipeWire() {
+   pw_init(/*argc=*/nullptr, /*argc=*/nullptr);
+ 
+-  pw_loop_ = pw_loop_new(/*properties=*/nullptr);
+-  pw_main_loop_ = pw_thread_loop_new(pw_loop_, "pipewire-main-loop");
+-
+-  pw_core_ = pw_core_new(pw_loop_, /*properties=*/nullptr);
+-  pw_core_type_ = pw_core_get_type(pw_core_);
+-  pw_remote_ = pw_remote_new(pw_core_, nullptr, /*user_data_size=*/0);
++  pw_main_loop_ = pw_thread_loop_new("pipewire-main-loop", nullptr);
++  pw_context_ = pw_context_new(pw_thread_loop_get_loop(pw_main_loop_), nullptr, 0);
++  if (!pw_context_) {
++    RTC_LOG(LS_ERROR) << "Failed to create PipeWire context";
++    return;
++  }
+ 
+-  InitPipeWireTypes();
++  pw_core_ = pw_context_connect(pw_context_, nullptr, 0);
++  if (!pw_core_) {
++    RTC_LOG(LS_ERROR) << "Failed to connect PipeWire context";
++    return;
++  }
+ 
+   // Initialize event handlers, remote end and stream-related.
+-  pw_remote_events_.version = PW_VERSION_REMOTE_EVENTS;
+-  pw_remote_events_.state_changed = &OnStateChanged;
++  pw_core_events_.version = PW_VERSION_CORE_EVENTS;
++  pw_core_events_.error = &OnCoreError;
+ 
+   pw_stream_events_.version = PW_VERSION_STREAM_EVENTS;
+   pw_stream_events_.state_changed = &OnStreamStateChanged;
+-  pw_stream_events_.format_changed = &OnStreamFormatChanged;
++  pw_stream_events_.param_changed = &OnStreamParamChanged;
+   pw_stream_events_.process = &OnStreamProcess;
+ 
+-  pw_remote_add_listener(pw_remote_, &spa_remote_listener_, &pw_remote_events_,
+-                         this);
+-  pw_remote_connect_fd(pw_remote_, pw_fd_);
++  pw_core_add_listener(pw_core_, &spa_core_listener_, &pw_core_events_, this);
++
++  pw_stream_ = CreateReceivingStream();
++  if (!pw_stream_) {
++    RTC_LOG(LS_ERROR) << "Failed to create PipeWire stream";
++    return;
++  }
+ 
+   if (pw_thread_loop_start(pw_main_loop_) < 0) {
+     RTC_LOG(LS_ERROR) << "Failed to start main PipeWire loop";
+@@ -278,81 +266,120 @@ void BaseCapturerPipeWire::InitPipeWire() {
+   }
+ }
+ 
+-void BaseCapturerPipeWire::InitPipeWireTypes() {
+-  spa_type_map* map = pw_core_type_->map;
+-  pw_type_ = new PipeWireType();
+-
+-  spa_type_media_type_map(map, &pw_type_->media_type);
+-  spa_type_media_subtype_map(map, &pw_type_->media_subtype);
+-  spa_type_format_video_map(map, &pw_type_->format_video);
+-  spa_type_video_format_map(map, &pw_type_->video_format);
+-}
+-
+-void BaseCapturerPipeWire::CreateReceivingStream() {
++pw_stream* BaseCapturerPipeWire::CreateReceivingStream() {
+   spa_rectangle pwMinScreenBounds = spa_rectangle{1, 1};
+-  spa_rectangle pwScreenBounds =
+-      spa_rectangle{static_cast<uint32_t>(desktop_size_.width()),
+-                    static_cast<uint32_t>(desktop_size_.height())};
++  spa_rectangle pwMaxScreenBounds = spa_rectangle{INT32_MAX, INT32_MAX};
+ 
+-  spa_fraction pwFrameRateMin = spa_fraction{0, 1};
+-  spa_fraction pwFrameRateMax = spa_fraction{60, 1};
++  auto stream = pw_stream_new(pw_core_, "webrtc-pipewire-stream", nullptr);
+ 
+-  pw_properties* reuseProps = pw_properties_new("pipewire.client.reuse", "1",
+-                                                /*end of varargs*/ nullptr);
+-  pw_stream_ = pw_stream_new(pw_remote_, "webrtc-consume-stream", reuseProps);
++  if (!stream) {
++    RTC_LOG(LS_ERROR) << "Could not create receiving stream.";
++    return nullptr;
++  }
+ 
+   uint8_t buffer[1024] = {};
+-  const spa_pod* params[1];
+-  spa_pod_builder builder = spa_pod_builder{buffer, sizeof(buffer)};
+-  params[0] = reinterpret_cast<spa_pod*>(spa_pod_builder_object(
+-      &builder,
+-      // id to enumerate formats
+-      pw_core_type_->param.idEnumFormat, pw_core_type_->spa_format, "I",
+-      pw_type_->media_type.video, "I", pw_type_->media_subtype.raw,
+-      // Video format: specified as id or enum (I), preferred format is BGRx,
+-      // then allowed formats are enumerated (e) and the format is undecided (u)
+-      // to allow negotiation
+-      ":", pw_type_->format_video.format, "Ieu", pw_type_->video_format.BGRx,
+-      SPA_POD_PROP_ENUM(2, pw_type_->video_format.RGBx,
+-                        pw_type_->video_format.BGRx),
+-      // Video size: specified as rectangle (R), preferred size is specified as
+-      // first parameter, then allowed size is defined as range (r) from min and
+-      // max values and the format is undecided (u) to allow negotiation
+-      ":", pw_type_->format_video.size, "Rru", &pwScreenBounds, 2,
+-      &pwMinScreenBounds, &pwScreenBounds,
+-      // Frame rate: specified as fraction (F) and set to minimum frame rate
+-      // value
+-      ":", pw_type_->format_video.framerate, "F", &pwFrameRateMin,
+-      // Max frame rate: specified as fraction (F), preferred frame rate is set
+-      // to maximum value, then allowed frame rate is defined as range (r) from
+-      // min and max values and it is undecided (u) to allow negotiation
+-      ":", pw_type_->format_video.max_framerate, "Fru", &pwFrameRateMax, 2,
+-      &pwFrameRateMin, &pwFrameRateMax));
+-
+-  pw_stream_add_listener(pw_stream_, &spa_stream_listener_, &pw_stream_events_,
+-                         this);
++  const spa_pod* params[2];
++  spa_pod_builder builder = SPA_POD_BUILDER_INIT(buffer, sizeof (buffer));
++
++  params[0] = reinterpret_cast<spa_pod *>(spa_pod_builder_add_object(&builder,
++              SPA_TYPE_OBJECT_Format, SPA_PARAM_EnumFormat,
++              SPA_FORMAT_mediaType, SPA_POD_Id(SPA_MEDIA_TYPE_video),
++              SPA_FORMAT_mediaSubtype, SPA_POD_Id(SPA_MEDIA_SUBTYPE_raw),
++              SPA_FORMAT_VIDEO_format, SPA_POD_CHOICE_ENUM_Id(5, SPA_VIDEO_FORMAT_BGRx, SPA_VIDEO_FORMAT_RGBx, SPA_VIDEO_FORMAT_RGBA,
++                                                                 SPA_VIDEO_FORMAT_BGRx, SPA_VIDEO_FORMAT_BGRA),
++              SPA_FORMAT_VIDEO_size, SPA_POD_CHOICE_RANGE_Rectangle(&pwMinScreenBounds,
++                                                                    &pwMinScreenBounds,
++                                                                    &pwMaxScreenBounds),
++              0));
++  pw_stream_add_listener(stream, &spa_stream_listener_, &pw_stream_events_, this);
++
+   pw_stream_flags flags = static_cast<pw_stream_flags>(
+-      PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_INACTIVE |
+-      PW_STREAM_FLAG_MAP_BUFFERS);
+-  if (pw_stream_connect(pw_stream_, PW_DIRECTION_INPUT, /*port_path=*/nullptr,
+-                        flags, params,
+-                        /*n_params=*/1) != 0) {
++      PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_INACTIVE);
++
++  if (pw_stream_connect(stream, PW_DIRECTION_INPUT, pw_stream_node_id_, PW_STREAM_FLAG_AUTOCONNECT, params, 1) != 0) {
+     RTC_LOG(LS_ERROR) << "Could not connect receiving stream.";
+     portal_init_failed_ = true;
+-    return;
+   }
++
++  return stream;
+ }
+ 
+ void BaseCapturerPipeWire::HandleBuffer(pw_buffer* buffer) {
++  struct spa_meta_region* video_crop;
+   spa_buffer* spaBuffer = buffer->buffer;
+-  void* src = nullptr;
++  uint8_t *map = nullptr;
++  uint8_t* src = nullptr;
++  uint8_t* dst = nullptr;
++
++  if (spaBuffer->datas[0].chunk->size == 0) {
++    map = nullptr;
++    src = nullptr;
++  } else if (spaBuffer->datas[0].type == SPA_DATA_MemFd) {
++    map = static_cast<uint8_t*>(mmap(
++        nullptr, spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset,
++        PROT_READ, MAP_PRIVATE, spaBuffer->datas[0].fd, 0));
++    src = SPA_MEMBER(map, spaBuffer->datas[0].mapoffset, uint8_t);
++  } else if (spaBuffer->datas[0].type == SPA_DATA_DmaBuf) {
++    int fd;
++    fd = spaBuffer->datas[0].fd;
++
++    map = static_cast<uint8_t*>(mmap(
++        nullptr, spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset,
++        PROT_READ, MAP_PRIVATE, fd, 0));
++    SyncDmaBuf(fd, DMA_BUF_SYNC_START);
++
++    src = SPA_MEMBER(map, spaBuffer->datas[0].mapoffset, uint8_t);
++  } else if (spaBuffer->datas[0].type == SPA_DATA_MemPtr) {
++    map = nullptr;
++    src = static_cast<uint8_t*>(spaBuffer->datas[0].data);
++  } else {
++    return;
++  }
+ 
+-  if (!(src = spaBuffer->datas[0].data)) {
++  if (!src) {
+     return;
+   }
+ 
+-  uint32_t maxSize = spaBuffer->datas[0].maxsize;
+-  int32_t srcStride = spaBuffer->datas[0].chunk->stride;
++  DesktopSize prev_crop_size = DesktopSize(0, 0);
++  if (video_crop_size_initialized_) {
++    prev_crop_size = video_crop_size_;
++  }  
++
++  if ((video_crop = static_cast<struct spa_meta_region*>(
++           spa_buffer_find_meta_data(spaBuffer, SPA_META_VideoCrop, sizeof(*video_crop))))) {
++    RTC_DCHECK(video_crop->region.size.width <= desktop_size_.width() &&
++               video_crop->region.size.height <= desktop_size_.height());
++    if ((video_crop->region.size.width != desktop_size_.width() ||
++        video_crop->region.size.height != desktop_size_.height()) && video_crop->region.size.width && video_crop->region.size.height) {
++      video_crop_size_ = DesktopSize(video_crop->region.size.width, video_crop->region.size.height);
++      video_crop_size_initialized_ = true;
++    } else {
++      video_crop_size_initialized_ = false;
++    }
++  } else {
++    video_crop_size_initialized_ = false;
++  }
++
++  size_t frame_size;
++  if (video_crop_size_initialized_) {
++    frame_size =
++        video_crop_size_.width() * video_crop_size_.height() * kBytesPerPixel;
++  } else {
++    frame_size =
++        desktop_size_.width() * desktop_size_.height() * kBytesPerPixel;
++  }
++
++  if (!current_frame_ ||
++      (video_crop_size_initialized_ && !video_crop_size_.equals(prev_crop_size))) {
++    current_frame_ = std::make_unique<uint8_t[]>(frame_size);
++  }
++  RTC_DCHECK(current_frame_ != nullptr);
++
++  const int32_t dstStride = video_crop_size_initialized_
++                                ? video_crop_size_.width() * kBytesPerPixel
++                                : desktop_size_.width() * kBytesPerPixel;
++  const int32_t srcStride = spaBuffer->datas[0].chunk->stride;
++
+   if (srcStride != (desktop_size_.width() * kBytesPerPixel)) {
+     RTC_LOG(LS_ERROR) << "Got buffer with stride different from screen stride: "
+                       << srcStride
+@@ -361,21 +388,40 @@ void BaseCapturerPipeWire::HandleBuffer(pw_buffer* buffer) {
+     return;
+   }
+ 
+-  if (!current_frame_) {
+-    current_frame_ = static_cast<uint8_t*>(malloc(maxSize));
++  dst = current_frame_.get();
++
++  // Adjust source content based on crop video position
++  if (video_crop_size_initialized_ &&
++      (video_crop->region.position.y + video_crop_size_.height() <= desktop_size_.height())) {
++    for (int i = 0; i < video_crop->region.position.y; ++i) {
++      src += srcStride;
++    }
++  }
++  const int xOffset =
++      video_crop_size_initialized_ && (video_crop->region.position.x + video_crop_size_.width() <=
++                           desktop_size_.width())
++          ? video_crop->region.position.x * kBytesPerPixel
++          : 0;
++  const int height = video_crop_size_initialized_ ? video_crop_size_.height() : desktop_size_.height();
++  for (int i = 0; i < height; ++i) {
++    // Adjust source content based on crop video position if needed
++    src += xOffset;
++    std::memcpy(dst, src, dstStride);
++    // If both sides decided to go with the RGBx format we need to convert it to
++    // BGRx to match color format expected by WebRTC.
++    if (spa_video_format_.format == SPA_VIDEO_FORMAT_RGBx ||
++        spa_video_format_.format == SPA_VIDEO_FORMAT_RGBA) {
++      ConvertRGBxToBGRx(dst, dstStride);
++    }
++    src += srcStride - xOffset;
++    dst += dstStride;
+   }
+-  RTC_DCHECK(current_frame_ != nullptr);
+ 
+-  // If both sides decided to go with the RGBx format we need to convert it to
+-  // BGRx to match color format expected by WebRTC.
+-  if (spa_video_format_->format == pw_type_->video_format.RGBx) {
+-    uint8_t* tempFrame = static_cast<uint8_t*>(malloc(maxSize));
+-    std::memcpy(tempFrame, src, maxSize);
+-    ConvertRGBxToBGRx(tempFrame, maxSize);
+-    std::memcpy(current_frame_, tempFrame, maxSize);
+-    free(tempFrame);
+-  } else {
+-    std::memcpy(current_frame_, src, maxSize);
++  if (map) {
++    if (spaBuffer->datas[0].type == SPA_DATA_DmaBuf) {
++      SyncDmaBuf(spaBuffer->datas[0].fd, DMA_BUF_SYNC_END);
++    }
++    munmap(map, spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset);
+   }
+ }
+ 
+@@ -725,10 +771,7 @@ void BaseCapturerPipeWire::OnStartRequestResponseSignal(
+       g_variant_get(variant, "(u@a{sv})", &stream_id, &options);
+       RTC_DCHECK(options != nullptr);
+ 
+-      g_variant_lookup(options, "size", "(ii)", &width, &height);
+-
+-      that->desktop_size_.set(width, height);
+-
++      that->pw_stream_node_id_ = stream_id;
+       g_variant_unref(options);
+       g_variant_unref(variant);
+     }
+@@ -813,10 +856,15 @@ void BaseCapturerPipeWire::CaptureFrame() {
+     return;
+   }
+ 
+-  std::unique_ptr<DesktopFrame> result(new BasicDesktopFrame(desktop_size_));
++  DesktopSize frame_size = desktop_size_;
++  if (video_crop_size_initialized_) {
++    frame_size = video_crop_size_;
++  }
++  
++  std::unique_ptr<DesktopFrame> result(new BasicDesktopFrame(frame_size));
+   result->CopyPixelsFrom(
+-      current_frame_, (desktop_size_.width() * kBytesPerPixel),
+-      DesktopRect::MakeWH(desktop_size_.width(), desktop_size_.height()));
++      current_frame_.get(), (frame_size.width() * kBytesPerPixel),
++      DesktopRect::MakeWH(frame_size.width(), frame_size.height()));
+   if (!result) {
+     callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr);
+     return;
+@@ -837,4 +885,22 @@ bool BaseCapturerPipeWire::SelectSource(SourceId id) {
+   return true;
+ }
+ 
++// static
++std::unique_ptr<DesktopCapturer>
++BaseCapturerPipeWire::CreateRawScreenCapturer(
++    const DesktopCaptureOptions& options) {
++  std::unique_ptr<BaseCapturerPipeWire> capturer =
++      std::make_unique<BaseCapturerPipeWire>(BaseCapturerPipeWire::CaptureSourceType::kAny);
++  return std::move(capturer);}
++
++// static
++std::unique_ptr<DesktopCapturer>
++BaseCapturerPipeWire::CreateRawWindowCapturer(
++    const DesktopCaptureOptions& options) {
++
++  std::unique_ptr<BaseCapturerPipeWire> capturer =
++      std::make_unique<BaseCapturerPipeWire>(BaseCapturerPipeWire::CaptureSourceType::kAny);
++  return std::move(capturer);
++}
++
+ }  // namespace webrtc
+diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h
+index 56b101acbaa6..de54157d1a2a 100644
+--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h
++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.h
+@@ -22,17 +22,13 @@
+ 
+ namespace webrtc {
+ 
+-class PipeWireType {
+- public:
+-  spa_type_media_type media_type;
+-  spa_type_media_subtype media_subtype;
+-  spa_type_format_video format_video;
+-  spa_type_video_format video_format;
+-};
+-
+ class BaseCapturerPipeWire : public DesktopCapturer {
+  public:
+-  enum CaptureSourceType { Screen = 1, Window };
++  enum CaptureSourceType : uint32_t {
++    kScreen = 0b01,
++    kWindow = 0b10,
++    kAny = 0b11
++  };
+ 
+   explicit BaseCapturerPipeWire(CaptureSourceType source_type);
+   ~BaseCapturerPipeWire() override;
+@@ -43,28 +39,32 @@ class BaseCapturerPipeWire : public DesktopCapturer {
+   bool GetSourceList(SourceList* sources) override;
+   bool SelectSource(SourceId id) override;
+ 
++  static std::unique_ptr<DesktopCapturer> CreateRawScreenCapturer(
++      const DesktopCaptureOptions& options);
++
++  static std::unique_ptr<DesktopCapturer> CreateRawWindowCapturer(
++      const DesktopCaptureOptions& options);
++
+  private:
+   // PipeWire types -->
++  pw_context* pw_context_ = nullptr;
+   pw_core* pw_core_ = nullptr;
+-  pw_type* pw_core_type_ = nullptr;
+   pw_stream* pw_stream_ = nullptr;
+-  pw_remote* pw_remote_ = nullptr;
+-  pw_loop* pw_loop_ = nullptr;
+   pw_thread_loop* pw_main_loop_ = nullptr;
+-  PipeWireType* pw_type_ = nullptr;
+ 
++  spa_hook spa_core_listener_ = {};
+   spa_hook spa_stream_listener_ = {};
+-  spa_hook spa_remote_listener_ = {};
+ 
++  pw_core_events pw_core_events_ = {};
+   pw_stream_events pw_stream_events_ = {};
+-  pw_remote_events pw_remote_events_ = {};
+ 
+-  spa_video_info_raw* spa_video_format_ = nullptr;
++  struct spa_video_info_raw spa_video_format_;
+ 
++  guint32 pw_stream_node_id_ = 0;
+   gint32 pw_fd_ = -1;
+ 
+   CaptureSourceType capture_source_type_ =
+-      BaseCapturerPipeWire::CaptureSourceType::Screen;
++      BaseCapturerPipeWire::CaptureSourceType::kAny;
+ 
+   // <-- end of PipeWire types
+ 
+@@ -78,33 +78,37 @@ class BaseCapturerPipeWire : public DesktopCapturer {
+   guint sources_request_signal_id_ = 0;
+   guint start_request_signal_id_ = 0;
+ 
++  bool video_crop_size_initialized_ = false;
++  DesktopSize video_crop_size_;;
+   DesktopSize desktop_size_ = {};
+   DesktopCaptureOptions options_ = {};
+ 
+-  uint8_t* current_frame_ = nullptr;
++  std::unique_ptr<uint8_t[]> current_frame_;
+   Callback* callback_ = nullptr;
+ 
+   bool portal_init_failed_ = false;
+ 
+   void InitPortal();
+   void InitPipeWire();
+-  void InitPipeWireTypes();
+ 
+-  void CreateReceivingStream();
++  pw_stream* CreateReceivingStream();
+   void HandleBuffer(pw_buffer* buffer);
+ 
+   void ConvertRGBxToBGRx(uint8_t* frame, uint32_t size);
+ 
+-  static void OnStateChanged(void* data,
+-                             pw_remote_state old_state,
+-                             pw_remote_state state,
+-                             const char* error);
++  static void SyncDmaBuf(int fd, uint64_t start_or_end);
++  static void OnCoreError(void *data,
++                          uint32_t id,
++                          int seq,
++                          int res,
++                          const char *message);
++  static void OnStreamParamChanged(void *data,
++                                   uint32_t id,
++                                   const struct spa_pod *format);
+   static void OnStreamStateChanged(void* data,
+                                    pw_stream_state old_state,
+                                    pw_stream_state state,
+                                    const char* error_message);
+-
+-  static void OnStreamFormatChanged(void* data, const struct spa_pod* format);
+   static void OnStreamProcess(void* data);
+   static void OnNewBuffer(void* data, uint32_t id);
+ 
+diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc
+index 26956fc67dc8..3813d697bb38 100644
+--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc
++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc
+@@ -15,7 +15,7 @@
+ namespace webrtc {
+ 
+ ScreenCapturerPipeWire::ScreenCapturerPipeWire()
+-    : BaseCapturerPipeWire(BaseCapturerPipeWire::CaptureSourceType::Screen) {}
++    : BaseCapturerPipeWire(BaseCapturerPipeWire::CaptureSourceType::kScreen) {}
+ ScreenCapturerPipeWire::~ScreenCapturerPipeWire() {}
+ 
+ // static
+diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc
+index 35436475cb4d..c43a1f1a0c4e 100644
+--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc
++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc
+@@ -15,7 +15,7 @@
+ namespace webrtc {
+ 
+ WindowCapturerPipeWire::WindowCapturerPipeWire()
+-    : BaseCapturerPipeWire(BaseCapturerPipeWire::CaptureSourceType::Window) {}
++    : BaseCapturerPipeWire(BaseCapturerPipeWire::CaptureSourceType::kWindow) {}
+ WindowCapturerPipeWire::~WindowCapturerPipeWire() {}
+ 
+ // static
+diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/screen_capturer_linux.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/screen_capturer_linux.cc
+index cf8a9dd0e0db..d27fab8d28d9 100644
+--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/screen_capturer_linux.cc
++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/screen_capturer_linux.cc
+@@ -26,7 +26,7 @@ std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawScreenCapturer(
+     const DesktopCaptureOptions& options) {
+ #if defined(WEBRTC_USE_PIPEWIRE)
+   if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) {
+-    return ScreenCapturerPipeWire::CreateRawScreenCapturer(options);
++    return BaseCapturerPipeWire::CreateRawScreenCapturer(options);
+   }
+ #endif  // defined(WEBRTC_USE_PIPEWIRE)
+ 
+diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc
+index 82359e50c2db..bb9724cf7cc2 100644
+--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc
++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc
+@@ -26,7 +26,7 @@ std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawWindowCapturer(
+     const DesktopCaptureOptions& options) {
+ #if defined(WEBRTC_USE_PIPEWIRE)
+   if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) {
+-    return WindowCapturerPipeWire::CreateRawWindowCapturer(options);
++    return BaseCapturerPipeWire::CreateRawWindowCapturer(options);
+   }
+ #endif  // defined(WEBRTC_USE_PIPEWIRE)
+ 
diff --git a/SOURCES/firefox-pipewire.patch b/SOURCES/firefox-pipewire.patch
new file mode 100644
index 0000000..7233a73
--- /dev/null
+++ b/SOURCES/firefox-pipewire.patch
@@ -0,0 +1,63 @@
+diff -up firefox-68.0/config/system-headers.mozbuild.firefox-pipewire firefox-68.0/config/system-headers.mozbuild
+--- firefox-68.0/config/system-headers.mozbuild.firefox-pipewire	2019-07-01 22:30:26.000000000 +0200
++++ firefox-68.0/config/system-headers.mozbuild	2019-07-08 15:26:15.397161627 +0200
+@@ -314,6 +314,7 @@ system_headers = [
+     'Gestalt.h',
+     'getopt.h',
+     'gio/gio.h',
++    'gio/gunixfdlist.h',
+     'glibconfig.h',
+     'glib.h',
+     'glib-object.h',
+@@ -607,6 +608,7 @@ system_headers = [
+     'Pgenerr.h',
+     'PGenErr.h',
+     'Ph.h',
++    'pipewire/pipewire.h',
+     'pixman.h',
+     'pk11func.h',
+     'pk11pqg.h',
+diff -up firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build.firefox-pipewire firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build
+--- firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build.firefox-pipewire	2019-07-01 22:30:33.000000000 +0200
++++ firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build	2019-07-08 15:26:15.397161627 +0200
+@@ -194,6 +194,28 @@ if CONFIG["OS_TARGET"] == "Linux":
+         "/media/webrtc/trunk/webrtc/modules/desktop_capture/window_capturer_linux.cc"
+     ]
+ 
++# PipeWire specific files
++if CONFIG["OS_TARGET"] == "Linux":
++
++    DEFINES["WEBRTC_USE_PIPEWIRE"] = "1"
++
++    OS_LIBS += [
++        "rt",
++        "pipewire-0.2",
++        "glib-2.0",
++        "gio-2.0",
++        "gobject-2.0"
++    ]
++
++    CXXFLAGS += CONFIG['TK_CFLAGS']
++
++    UNIFIED_SOURCES += [
++        "/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc",
++        "/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/screen_capturer_pipewire.cc",
++        "/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/window_capturer_pipewire.cc"
++    ]
++
++
+ if CONFIG["OS_TARGET"] == "NetBSD":
+ 
+     DEFINES["USE_X11"] = "1"
+diff -up firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h.firefox-pipewire firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h
+--- firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h.firefox-pipewire	2019-07-08 16:42:13.936254926 +0200
++++ firefox-68.0/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_options.h	2019-07-08 16:42:17.509264974 +0200
+@@ -141,7 +141,7 @@ class DesktopCaptureOptions {
+   bool disable_effects_ = true;
+   bool detect_updated_region_ = false;
+ #if defined(WEBRTC_USE_PIPEWIRE)
+-  bool allow_pipewire_ = false;
++  bool allow_pipewire_ = true;
+ #endif
+ };
+ 
diff --git a/SOURCES/firefox-redhat-default-prefs.js b/SOURCES/firefox-redhat-default-prefs.js
new file mode 100644
index 0000000..607a132
--- /dev/null
+++ b/SOURCES/firefox-redhat-default-prefs.js
@@ -0,0 +1,35 @@
+pref("app.update.auto",                     false);
+pref("app.update.enabled",                  false);
+pref("app.update.autoInstallEnabled",       false);
+pref("general.smoothScroll",                true);
+pref("intl.locale.matchOS",                 true);
+pref("toolkit.storage.synchronous",         0);
+pref("toolkit.networkmanager.disable",      false);
+pref("offline.autoDetect",                  true);
+pref("browser.backspace_action",            2);
+pref("browser.display.use_system_colors",   true);
+pref("browser.download.folderList",         1);
+pref("browser.link.open_external",          3);
+pref("browser.shell.checkDefaultBrowser",   false);
+pref("network.manage-offline-status",       true);
+pref("extensions.shownSelectionUI",         true);
+pref("ui.SpellCheckerUnderlineStyle",       1);
+pref("startup.homepage_override_url",       "http://www.redhat.com");
+pref("startup.homepage_welcome_url",        "http://www.redhat.com");
+pref("browser.startup.homepage",            "data:text/plain,browser.startup.homepage=file:///usr/share/doc/HTML/index.html");
+pref("geo.wifi.uri", "https://location.services.mozilla.com/v1/geolocate?key=%MOZILLA_API_KEY%");
+pref("media.gmp-gmpopenh264.provider.enabled",false);
+pref("media.gmp-gmpopenh264.autoupdate",false);
+pref("media.gmp-gmpopenh264.enabled",false);
+pref("media.gmp-gmpopenh264.enabled",false);
+pref("plugins.notifyMissingFlash", false);
+/* See https://bugzilla.redhat.com/show_bug.cgi?id=1226489 */
+pref("browser.display.use_system_colors", false);
+pref("layers.use-image-offscreen-surfaces", false);
+/* Allow sending credetials to all https:// sites */
+pref("network.negotiate-auth.trusted-uris", "https://");
+pref("security.use_sqldb", false);
+/* Use OS settings for UI language */
+pref("intl.locale.requested", "");
+/* See https://bugzilla.redhat.com/show_bug.cgi?id=1672424 */
+pref("storage.nfs_filesystem", true);
\ No newline at end of file
diff --git a/SOURCES/firefox-rhel6-hugepage.patch b/SOURCES/firefox-rhel6-hugepage.patch
new file mode 100644
index 0000000..4855721
--- /dev/null
+++ b/SOURCES/firefox-rhel6-hugepage.patch
@@ -0,0 +1,13 @@
+diff -up firefox-68.1.0/xpcom/threads/nsThread.cpp.old firefox-68.1.0/xpcom/threads/nsThread.cpp
+--- firefox-68.1.0/xpcom/threads/nsThread.cpp.old	2019-09-20 12:17:35.481661390 +0200
++++ firefox-68.1.0/xpcom/threads/nsThread.cpp	2019-09-20 12:19:14.269180516 +0200
+@@ -556,7 +556,8 @@ void nsThread::InitCommon() {
+     // kernel report them as separate regions, even when they are adjacent to
+     // heap memory. This allows us to accurately track the actual memory
+     // consumption of our allocated stacks.
+-    madvise(mStackBase, stackSize, MADV_NOHUGEPAGE);
++    // not supported on RHEL6
++    // madvise(mStackBase, stackSize, MADV_NOHUGEPAGE);
+ 
+     pthread_attr_destroy(&attr);
+ #elif defined(XP_WIN)
diff --git a/SOURCES/firefox-rhel6-nss-tls1.3.patch b/SOURCES/firefox-rhel6-nss-tls1.3.patch
new file mode 100644
index 0000000..2b6e8f7
--- /dev/null
+++ b/SOURCES/firefox-rhel6-nss-tls1.3.patch
@@ -0,0 +1,13 @@
+diff -up firefox-68.2.0/security/manager/ssl/nsNSSComponent.cpp.old firefox-68.2.0/security/manager/ssl/nsNSSComponent.cpp
+--- firefox-68.2.0/security/manager/ssl/nsNSSComponent.cpp.old	2019-10-24 14:20:21.227037984 +0200
++++ firefox-68.2.0/security/manager/ssl/nsNSSComponent.cpp	2019-10-24 14:45:52.769506967 +0200
+@@ -996,6 +996,9 @@ void nsNSSComponent::FillTLSVersionRange
+     return;
+   }
+ 
++  // Enable TLS 1.3 as our NSS supports it.
++  supported.max = 0x304;
++
+   // Clip the defaults by what NSS actually supports to enable
+   // working with a system NSS with different ranges.
+   rangeOut.min = std::max(rangeOut.min, supported.min);
diff --git a/SOURCES/firefox-symbolic.svg b/SOURCES/firefox-symbolic.svg
new file mode 100644
index 0000000..7a2c73e
--- /dev/null
+++ b/SOURCES/firefox-symbolic.svg
@@ -0,0 +1,30 @@
+<?xml version='1.0' encoding='UTF-8' standalone='no'?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg xmlns:cc='http://creativecommons.org/ns#' xmlns:dc='http://purl.org/dc/elements/1.1/' sodipodi:docname='firefox-symbolic.svg' height='16' id='svg7384' xmlns:inkscape='http://www.inkscape.org/namespaces/inkscape' xmlns:osb='http://www.openswatchbook.org/uri/2009/osb' xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#' xmlns:sodipodi='http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd' xmlns:svg='http://www.w3.org/2000/svg' version='1.1' inkscape:version='0.91 r13725' width='16' xmlns='http://www.w3.org/2000/svg'>
+  <metadata id='metadata90'>
+    <rdf:RDF>
+      <cc:Work rdf:about=''>
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type rdf:resource='http://purl.org/dc/dcmitype/StillImage'/>
+        <dc:title>Gnome Symbolic Icon Theme</dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <sodipodi:namedview inkscape:bbox-paths='true' bordercolor='#666666' borderopacity='1' inkscape:current-layer='layer9' inkscape:cx='-10.975734' inkscape:cy='233.73843' gridtolerance='10' inkscape:guide-bbox='true' guidetolerance='10' id='namedview88' inkscape:object-nodes='false' inkscape:object-paths='false' objecttolerance='10' pagecolor='#555753' inkscape:pageopacity='1' inkscape:pageshadow='2' showborder='false' showgrid='false' showguides='true' inkscape:snap-bbox='true' inkscape:snap-bbox-midpoints='false' inkscape:snap-global='true' inkscape:snap-grids='true' inkscape:snap-nodes='true' inkscape:snap-others='false' inkscape:snap-to-guides='true' inkscape:window-height='1403' inkscape:window-maximized='1' inkscape:window-width='2560' inkscape:window-x='2560' inkscape:window-y='0' inkscape:zoom='1'>
+    <inkscape:grid empspacing='2' enabled='true' id='grid4866' originx='-222.00001' originy='-381.99852' snapvisiblegridlinesonly='true' spacingx='1px' spacingy='1px' type='xygrid' visible='true'/>
+  </sodipodi:namedview>
+  <title id='title9167'>Gnome Symbolic Icon Theme</title>
+  <defs id='defs7386'>
+    <linearGradient id='linearGradient7212' osb:paint='solid'>
+      <stop id='stop7214' offset='0' style='stop-color:#000000;stop-opacity:1;'/>
+    </linearGradient>
+  </defs>
+  <g inkscape:groupmode='layer' id='layer9' inkscape:label='apps' style='display:inline' transform='translate(-463.00021,164.99852)'>
+    
+    <path inkscape:connector-curvature='0' d='M 469.05437,-154.9679 Z' id='path17747' style='fill:none;stroke:#000000;stroke-width:0.99851286px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
+    <path inkscape:connector-curvature='0' d='M 469.08553,-154.9054 Z' id='path17749' style='fill:none;stroke:#000000;stroke-width:0.99851286px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1'/>
+    <path inkscape:connector-curvature='0' d='m 473.0627,-162.9375 c -0.41568,-0.0182 -0.62813,0.0274 -0.625,0.0312 0.006,0.008 1.72988,0.32697 2.03125,0.75 0,0 -0.71915,0.007 -1.4375,0.21875 -0.0325,0.01 2.64053,0.33122 3.1875,3.0625 0,0 -0.29354,-0.64386 -0.65625,-0.75 0.23852,0.74134 0.16466,2.17583 -0.0625,2.875 -0.0292,0.0899 -0.0525,-0.38762 -0.5,-0.59375 0.14332,1.04923 -0.006,2.6978 -0.71875,3.15625 -0.0555,0.0357 0.43942,-1.64894 0.0937,-1 -2.06368,3.2325 -4.50486,1.31102 -5.5,0.625 0.79871,0.19996 1.80035,0.0704 2.125,-0.15625 0.49572,-0.34615 0.79916,-0.59107 1.0625,-0.53125 0.26322,0.0601 0.42318,-0.22934 0.21875,-0.46875 -0.20466,-0.23989 -0.70268,-0.55471 -1.375,-0.375 -0.47415,0.12687 -1.04057,0.54268 -1.9375,0 -0.7652,-0.46319 -0.67076,-0.69942 -0.67076,-0.93907 0,-0.23977 0.21387,-0.59107 0.59375,-0.53125 0.0851,0.0134 0.15074,0.009 0.1875,0 0.18483,0.0422 0.35743,0.0964 0.53125,0.1875 0.008,-0.2241 -0.0292,-0.87345 -0.15625,-1.23012 0.0106,0.004 0.0289,0.011 0.0312,0 0.0384,-0.17687 1.05477,-0.18386 1.37388,-0.59643 0.20404,-0.26362 0.14073,-0.79683 0.14073,-0.79683 l -1,0 c -0.52354,0.002 -0.97244,-0.75086 -1.01451,-0.85669 0.11444,-0.62597 0.48612,-0.83952 1.01451,-1.14331 -0.39748,-0.003 -0.18871,0 -1,0 -0.52875,0 -0.84718,0.36158 -1.01451,0.54956 -0.70058,-0.16587 -1.38144,-0.25227 -1.86049,-0.0609 -0.22125,-0.22941 -0.39604,-0.80055 -0.42188,-1.48863 0,0 -1.20486,0.73864 -1.07812,2.55113 -0.002,0.14904 -0.0499,0.21348 -0.0625,0.3125 -0.13061,0.22845 -0.1553,0.40492 -0.125,0.375 -0.0656,0.13627 -0.15391,0.28402 -0.21875,0.46875 -0.0149,0.0362 -0.0495,0.0463 -0.0625,0.0937 -0.009,0.0322 0.002,0.0638 0,0.0937 -0.11512,0.36099 -0.21516,0.98244 -0.3125,1.54262 0,0 0.12424,-0.51425 0.3125,-0.88637 -0.15639,0.54353 -0.26211,1.54974 -0.1875,2.73012 0,0 0.015,-0.20429 0.0625,-0.5 0.0465,0.80102 0.25925,1.72737 0.84375,2.75 1.46152,2.5575 3.89248,3.68885 6.4375,3.46875 0.44516,-0.0296 0.89639,-0.10834 1.34375,-0.21875 5.92923,-1.46449 5.28125,-8.78118 5.28125,-8.78118 l -0.15625,1.09375 c 0,0 -0.24147,-1.99977 -0.53125,-2.75 -0.44412,-1.14957 -0.62372,-1.15791 -0.625,-1.15625 0.29743,0.77226 0.21875,1.1875 0.21875,1.1875 0,0 -0.51279,-1.43939 -1.90625,-1.90625 -0.82515,-0.27632 -1.45932,-0.38807 -1.875,-0.40625 z' id='path159-6' sodipodi:nodetypes='sccccccccccsccccscccccscccccccccccccccccccccccccccs' style='fill:#bebebe;fill-opacity:1;stroke:none'/>
+    <path inkscape:connector-curvature='0' d='m 470.87695,-164.01953 c -0.83043,0.0139 -1.67042,0.17659 -2.48047,0.5 l -0.46289,0.18359 c 0.66083,0.79767 1.84339,0.43951 1.84339,0.43951 2.50802,-0.52344 5.12427,0.6034 6.44177,2.89252 1.49591,2.59908 0.85463,5.89258 -1.50586,7.74219 -2.36049,1.84961 -5.71108,1.68349 -7.87695,-0.39062 -2.16588,-2.07412 -2.47623,-5.41522 -0.73047,-7.85352 l 0.29101,-0.40625 -0.81445,-0.58203 -0.29101,0.40625 c -2.03104,2.83673 -1.66628,6.74516 0.85351,9.1582 2.5198,2.41305 6.43934,2.60693 9.18555,0.45508 2.74621,-2.15185 3.49621,-6.00355 1.75586,-9.02734 -1.30527,-2.26785 -3.7177,-3.55935 -6.20899,-3.51758 z' id='path22109' sodipodi:nodetypes='ccccsssccccsssc' style='color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#bebebe;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.99999994;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;paint-order:normal;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate'/>
+  </g>
+</svg>
diff --git a/SOURCES/firefox.1 b/SOURCES/firefox.1
new file mode 100644
index 0000000..4311322
--- /dev/null
+++ b/SOURCES/firefox.1
@@ -0,0 +1,141 @@
+.TH FIREFOX 1 "November 30, 2017" firefox "Linux User's Manual"
+.SH NAME
+firefox \- a Web browser for X11 derived from the Mozilla browser
+
+.SH SYNOPSIS
+.B firefox
+[\fIOPTIONS\fR ...] [\fIURL\fR]
+
+.B firefox-bin
+[\fIOPTIONS\fR] [\fIURL\fR]
+
+.SH DESCRIPTION
+\fBMozilla Firefox\fR is an open-source web browser, designed for
+standards compliance, performance and portability.
+
+.SH USAGE
+\fBfirefox\fR is a simple shell script that will set up the
+environment for the actual executable, \fBfirefox-bin\fR.
+
+.SH OPTIONS
+A summary of the options supported by \fBfirefox\fR is included below.
+
+.SS "X11 options"
+.TP
+.BI \-\-display= DISPLAY
+X display to use
+.TP
+.B \--sync
+Make X calls synchronous
+.TP
+.B \-\-g-fatal-warnings
+Make all warnings fatal
+
+.SS "Firefox options"
+.TP
+.B \-h, \-help
+Show summary of options.
+.TP
+.B \-v, \-version
+Print Firefox version.
+.TP
+\fB\-P\fR \fIprofile\fR
+Start with \fIprofile\fR.
+.TP
+\fB\-\-profile\fR \fIpath\fR
+Start with profile at \fIpath\fR.
+.TP
+\fB\-\-migration\fR
+Start with migration wizard.
+.TP
+.B \-\-ProfileManager
+Start with ProfileManager.
+.TP
+\fB\-\-no\-remote\fR
+Do not accept or send remote commands; implies \fB--new-instance\fR.
+.TP
+\fB\-\-new\-instance\fR
+Open new instance, not a new window in running instance.
+.TP
+\fB\-\-UILocale\fR \fIlocale\fR
+Start with \fIlocale\fR resources as UI Locale.
+.TP
+\fB\-\-save\-mode\fR
+Disables extensions and themes for this session.
+.TP
+\fB\-\-headless\fR
+Run without a GUI.
+.TP
+\fB\-\-marionette\fR
+Enable remote control server.
+.TP
+\fB\-\-browser\fR
+Open a browser window.
+.TP
+\fB\-\-new-window\fR \fIurl\fR
+Open \fIurl\fR in a new window.
+.TP
+\fB\-\-new-tab\fR \fIurl\fR
+Open \fIurl\fR in a new tab.
+.TP
+\fB\-\-private-window\fR \fIurl\fR
+Open \fIurl\fR in a new private window.
+.TP
+\fB\-\-preferences\fR
+Open Preferences dialog.
+.TP
+\fB\-\-screenshot\fR [\fIpath\fR]
+Save screenshot to \fIpath\fR or in working directory.
+.TP
+\fB\-\-window-size\fR \fIwidth\fR[,\fIheight\fR]
+Width and optionally height of screenshot.
+.TP
+\fB\-\-search\fR \fIterm\fR
+Search \fIterm\fR with your default search engine.
+.TP
+
+
+\fB\-\-jsconsole\fR
+Open the Browser Console.
+.TP
+\fB\-\-jsdebugger\fR
+Open the Browser Toolbox.
+.TP
+\fB\-\-wait-for-jsdebugger\fR
+Spin event loop until JS debugger connects.  Enables debugging (some) application startup code paths.  Only has an effect when \fI--jsdebugger\fR is also supplied.
+.TP
+\fB\-\-devtools\fR
+Open DevTools on initial load.
+.TP
+\fB\-\-start-debugger-server\fR [ws:][\fIport\fR|\fIpath\fR]
+Start the debugger server on a TCP port or Unix domain socket path. Defaults to TCP port 6000. Use WebSocket protocol if ws: prefix is specified.
+.TP
+\fB\-\-recording\fR \fIfile\fR
+Record drawing for a given URL.
+.TP
+\fB\-\-recording-output\fR \fIfile\fR
+Specify destination file for a drawing recording.
+.TP
+\fB\-\-setDefaultBrowser\fR
+Set this app as the default browser.
+
+.SH FILES
+\fI/usr/bin/firefox\fR - shell script wrapping
+\fBfirefox\fR
+.br
+\fI/usr/lib64/firefox/firefox-bin\fR - \fBfirefox\fR
+executable
+
+.SH VERSION
+57.0
+
+.SH BUGS
+To report a bug, please visit \fIhttp://bugzilla.mozilla.org/\fR
+
+.SH AUTHORS
+.TP
+.B The Mozilla Organization
+.I http://www.mozilla.org/about.html
+.TP
+.B Tobias Girstmair
+.I https://gir.st/
diff --git a/SOURCES/firefox.desktop b/SOURCES/firefox.desktop
new file mode 100644
index 0000000..f13e600
--- /dev/null
+++ b/SOURCES/firefox.desktop
@@ -0,0 +1,272 @@
+[Desktop Entry]
+Version=1.0
+Name=Firefox
+GenericName=Web Browser
+GenericName[ca]=Navegador web
+GenericName[cs]=Webový prohlížeč
+GenericName[es]=Navegador web
+GenericName[fa]=مرورگر اینترنتی
+GenericName[fi]=WWW-selain
+GenericName[fr]=Navigateur Web
+GenericName[hu]=Webböngésző
+GenericName[it]=Browser Web
+GenericName[ja]=ウェブ・ブラウザ
+GenericName[ko]=웹 브라우저
+GenericName[nb]=Nettleser
+GenericName[nl]=Webbrowser
+GenericName[nn]=Nettlesar
+GenericName[no]=Nettleser
+GenericName[pl]=Przeglądarka WWW
+GenericName[pt]=Navegador Web
+GenericName[pt_BR]=Navegador Web
+GenericName[sk]=Internetový prehliadač
+GenericName[sv]=Webbläsare
+Comment=Browse the Web
+Comment[ca]=Navegueu per el web
+Comment[cs]=Prohlížení stránek World Wide Webu
+Comment[de]=Im Internet surfen
+Comment[es]=Navegue por la web
+Comment[fa]=صفحات شبکه جهانی اینترنت را مرور نمایید
+Comment[fi]=Selaa Internetin WWW-sivuja
+Comment[fr]=Navigue sur Internet
+Comment[hu]=A világháló böngészése
+Comment[it]=Esplora il web
+Comment[ja]=ウェブを閲覧します
+Comment[ko]=웹을 돌아 다닙니다
+Comment[nb]=Surf på nettet
+Comment[nl]=Verken het internet
+Comment[nn]=Surf på nettet
+Comment[no]=Surf på nettet
+Comment[pl]=Przeglądanie stron WWW 
+Comment[pt]=Navegue na Internet
+Comment[pt_BR]=Navegue na Internet
+Comment[sk]=Prehliadanie internetu
+Comment[sv]=Surfa på webben
+Exec=firefox %u
+Icon=firefox
+Terminal=false
+Type=Application
+MimeType=text/html;text/xml;application/xhtml+xml;application/vnd.mozilla.xul+xml;text/mml;x-scheme-handler/http;x-scheme-handler/https;
+StartupNotify=true
+Categories=Network;WebBrowser;
+Keywords=web;browser;internet;
+Actions=new-window;new-private-window;
+
+[Desktop Action new-window]
+Name=Open a New Window
+Name[ach]=Dirica manyen
+Name[af]=Nuwe venster
+Name[an]=Nueva finestra
+Name[ar]=نافذة جديدة
+Name[as]=নতুন উইন্ডো
+Name[ast]=Ventana nueva
+Name[az]=Yeni Pəncərə
+Name[be]=Новае акно
+Name[bg]=Нов прозорец
+Name[bn-BD]=নতুন উইন্ডো (N)
+Name[bn-IN]=নতুন উইন্ডো
+Name[br]=Prenestr nevez
+Name[brx]=गोदान उइन्ड'(N)
+Name[bs]=Novi prozor
+Name[ca]=Finestra nova
+Name[cak]=K'ak'a' tzuwäch
+Name[cs]=Nové okno
+Name[cy]=Ffenestr Newydd
+Name[da]=Nyt vindue
+Name[de]=Neues Fenster
+Name[dsb]=Nowe wokno
+Name[el]=Νέο παράθυρο
+Name[en-GB]=New Window
+Name[en-US]=New Window
+Name[en-ZA]=New Window
+Name[eo]=Nova fenestro
+Name[es-AR]=Nueva ventana
+Name[es-CL]=Nueva ventana
+Name[es-ES]=Nueva ventana
+Name[es-MX]=Nueva ventana
+Name[et]=Uus aken
+Name[eu]=Leiho berria
+Name[fa]=پنجره جدید‌
+Name[ff]=Henorde Hesere
+Name[fi]=Uusi ikkuna
+Name[fr]=Nouvelle fenêtre
+Name[fy-NL]=Nij finster
+Name[ga-IE]=Fuinneog Nua
+Name[gd]=Uinneag ùr
+Name[gl]=Nova xanela
+Name[gn]=Ovetã pyahu
+Name[gu-IN]=નવી વિન્ડો
+Name[he]=חלון חדש
+Name[hi-IN]=नया विंडो
+Name[hr]=Novi prozor
+Name[hsb]=Nowe wokno
+Name[hu]=Új ablak
+Name[hy-AM]=Նոր Պատուհան
+Name[id]=Jendela Baru
+Name[is]=Nýr gluggi
+Name[it]=Nuova finestra
+Name[ja]=新しいウィンドウ
+Name[ja-JP-mac]=新規ウインドウ
+Name[ka]=ახალი ფანჯარა
+Name[kk]=Жаңа терезе
+Name[km]=បង្អួច​​​ថ្មី
+Name[kn]=ಹೊಸ ಕಿಟಕಿ
+Name[ko]=새 창
+Name[kok]=नवें जनेल
+Name[ks]=نئئ وِنڈو
+Name[lij]=Neuvo barcon
+Name[lo]=ຫນ້າຕ່າງໃຫມ່
+Name[lt]=Naujas langas
+Name[ltg]=Jauns lūgs
+Name[lv]=Jauns logs
+Name[mai]=नव विंडो
+Name[mk]=Нов прозорец
+Name[ml]=പുതിയ ജാലകം
+Name[mr]=नवीन पटल
+Name[ms]=Tetingkap Baru
+Name[my]=ဝင်းဒိုးအသစ်
+Name[nb-NO]=Nytt vindu
+Name[ne-NP]=नयाँ सञ्झ्याल
+Name[nl]=Nieuw venster
+Name[nn-NO]=Nytt vindauge
+Name[or]=ନୂତନ ୱିଣ୍ଡୋ
+Name[pa-IN]=ਨਵੀਂ ਵਿੰਡੋ
+Name[pl]=Nowe okno
+Name[pt-BR]=Nova janela
+Name[pt-PT]=Nova janela
+Name[rm]=Nova fanestra
+Name[ro]=Fereastră nouă
+Name[ru]=Новое окно
+Name[sat]=नावा विंडो (N)
+Name[si]=නව කවුළුවක්
+Name[sk]=Nové okno
+Name[sl]=Novo okno
+Name[son]=Zanfun taaga
+Name[sq]=Dritare e Re
+Name[sr]=Нови прозор
+Name[sv-SE]=Nytt fönster
+Name[ta]=புதிய சாளரம்
+Name[te]=కొత్త విండో
+Name[th]=หน้าต่างใหม่
+Name[tr]=Yeni pencere
+Name[tsz]=Eraatarakua jimpani
+Name[uk]=Нове вікно
+Name[ur]=نیا دریچہ
+Name[uz]=Yangi oyna
+Name[vi]=Cửa sổ mới
+Name[wo]=Palanteer bu bees
+Name[xh]=Ifestile entsha
+Name[zh-CN]=新建窗口
+Name[zh-TW]=開新視窗
+
+
+Exec=firefox %u
+
+[Desktop Action new-private-window]
+Name=Open a New Private Window
+Name[ach]=Dirica manyen me mung
+Name[af]=Nuwe privaatvenster
+Name[an]=Nueva finestra privada
+Name[ar]=نافذة خاصة جديدة
+Name[as]=নতুন ব্যক্তিগত উইন্ডো
+Name[ast]=Ventana privada nueva
+Name[az]=Yeni Məxfi Pəncərə
+Name[be]=Новае акно адасаблення
+Name[bg]=Нов прозорец за поверително сърфиране
+Name[bn-BD]=নতুন ব্যক্তিগত উইন্ডো
+Name[bn-IN]=নতুন ব্যক্তিগত উইন্ডো
+Name[br]=Prenestr merdeiñ prevez nevez
+Name[brx]=गोदान प्राइभेट उइन्ड'
+Name[bs]=Novi privatni prozor
+Name[ca]=Finestra privada nova
+Name[cak]=K'ak'a' ichinan tzuwäch
+Name[cs]=Nové anonymní okno
+Name[cy]=Ffenestr Breifat Newydd
+Name[da]=Nyt privat vindue
+Name[de]=Neues privates Fenster
+Name[dsb]=Nowe priwatne wokno
+Name[el]=Νέο παράθυρο ιδιωτικής περιήγησης
+Name[en-GB]=New Private Window
+Name[en-US]=New Private Window
+Name[en-ZA]=New Private Window
+Name[eo]=Nova privata fenestro
+Name[es-AR]=Nueva ventana privada
+Name[es-CL]=Nueva ventana privada
+Name[es-ES]=Nueva ventana privada
+Name[es-MX]=Nueva ventana privada
+Name[et]=Uus privaatne aken
+Name[eu]=Leiho pribatu berria
+Name[fa]=پنجره ناشناس جدید
+Name[ff]=Henorde Suturo Hesere
+Name[fi]=Uusi yksityinen ikkuna
+Name[fr]=Nouvelle fenêtre de navigation privée
+Name[fy-NL]=Nij priveefinster
+Name[ga-IE]=Fuinneog Nua Phríobháideach
+Name[gd]=Uinneag phrìobhaideach ùr
+Name[gl]=Nova xanela privada
+Name[gn]=Ovetã ñemi pyahu
+Name[gu-IN]=નવી ખાનગી વિન્ડો
+Name[he]=חלון פרטי חדש
+Name[hi-IN]=नयी निजी विंडो
+Name[hr]=Novi privatni prozor
+Name[hsb]=Nowe priwatne wokno
+Name[hu]=Új privát ablak
+Name[hy-AM]=Սկսել Գաղտնի դիտարկում
+Name[id]=Jendela Mode Pribadi Baru
+Name[is]=Nýr huliðsgluggi
+Name[it]=Nuova finestra anonima
+Name[ja]=新しいプライベートウィンドウ
+Name[ja-JP-mac]=新規プライベートウインドウ
+Name[ka]=ახალი პირადი ფანჯარა
+Name[kk]=Жаңа жекелік терезе
+Name[km]=បង្អួច​ឯកជន​ថ្មី
+Name[kn]=ಹೊಸ ಖಾಸಗಿ ಕಿಟಕಿ
+Name[ko]=새 사생활 보호 모드
+Name[kok]=नवो खाजगी विंडो
+Name[ks]=نْو پرایوٹ وینڈو&amp;
+Name[lij]=Neuvo barcon privou
+Name[lo]=ເປີດຫນ້າຕ່າງສວນຕົວຂື້ນມາໃຫມ່
+Name[lt]=Naujas privataus naršymo langas
+Name[ltg]=Jauns privatais lūgs
+Name[lv]=Jauns privātais logs
+Name[mai]=नया निज विंडो (W)
+Name[mk]=Нов приватен прозорец
+Name[ml]=പുതിയ സ്വകാര്യ ജാലകം
+Name[mr]=नवीन वैयक्तिक पटल
+Name[ms]=Tetingkap Persendirian Baharu
+Name[my]=New Private Window
+Name[nb-NO]=Nytt privat vindu
+Name[ne-NP]=नयाँ निजी सञ्झ्याल
+Name[nl]=Nieuw privévenster
+Name[nn-NO]=Nytt privat vindauge
+Name[or]=ନୂତନ ବ୍ୟକ୍ତିଗତ ୱିଣ୍ଡୋ
+Name[pa-IN]=ਨਵੀਂ ਪ੍ਰਾਈਵੇਟ ਵਿੰਡੋ
+Name[pl]=Nowe okno prywatne
+Name[pt-BR]=Nova janela privativa
+Name[pt-PT]=Nova janela privada
+Name[rm]=Nova fanestra privata
+Name[ro]=Fereastră privată nouă
+Name[ru]=Новое приватное окно
+Name[sat]=नावा निजेराक् विंडो (W )
+Name[si]=නව පුද්ගලික කවුළුව (W)
+Name[sk]=Nové okno v režime Súkromné prehliadanie
+Name[sl]=Novo zasebno okno
+Name[son]=Sutura zanfun taaga
+Name[sq]=Dritare e Re Private
+Name[sr]=Нови приватан прозор
+Name[sv-SE]=Nytt privat fönster
+Name[ta]=புதிய தனிப்பட்ட சாளரம்
+Name[te]=కొత్త ఆంతరంగిక విండో
+Name[th]=หน้าต่างส่วนตัวใหม่
+Name[tr]=Yeni gizli pencere
+Name[tsz]=Juchiiti eraatarakua jimpani
+Name[uk]=Приватне вікно
+Name[ur]=نیا نجی دریچہ
+Name[uz]=Yangi maxfiy oyna
+Name[vi]=Cửa sổ riêng tư mới
+Name[wo]=Panlanteeru biir bu bees
+Name[xh]=Ifestile yangasese entsha
+Name[zh-CN]=新建隐私浏览窗口
+Name[zh-TW]=新增隱私視窗
+Exec=firefox --private-window %u
+
diff --git a/SOURCES/firefox.sh.in b/SOURCES/firefox.sh.in
new file mode 100644
index 0000000..a33e812
--- /dev/null
+++ b/SOURCES/firefox.sh.in
@@ -0,0 +1,280 @@
+#!/bin/bash
+#
+# The contents of this file are subject to the Netscape Public
+# License Version 1.1 (the "License"); you may not use this file
+# except in compliance with the License. You may obtain a copy of
+# the License at http://www.mozilla.org/NPL/
+#
+# Software distributed under the License is distributed on an "AS
+# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# rights and limitations under the License.
+#
+# The Original Code is mozilla.org code.
+#
+# The Initial Developer of the Original Code is Netscape
+# Communications Corporation.  Portions created by Netscape are
+# Copyright (C) 1998 Netscape Communications Corporation. All
+# Rights Reserved.
+#
+# Contributor(s): 
+#
+
+## 
+## Usage:
+##
+## $ firefox
+##
+## This script is meant to run a mozilla program from the mozilla
+## rpm installation.
+##
+## The script will setup all the environment voodoo needed to make
+## mozilla work.
+
+cmdname=`basename $0`
+
+##
+## Variables
+##
+MOZ_ARCH=$(uname -m)
+case $MOZ_ARCH in
+	x86_64 | s390x | sparc64)
+		MOZ_LIB_DIR="/usr/lib64"
+		SECONDARY_LIB_DIR="/usr/lib"
+		;;
+	* )
+		MOZ_LIB_DIR="/usr/lib"
+		SECONDARY_LIB_DIR="/usr/lib64"
+		;;
+esac
+
+MOZ_FIREFOX_FILE="firefox"
+
+if [ ! -r $MOZ_LIB_DIR/firefox/$MOZ_FIREFOX_FILE ]; then
+    if [ ! -r $SECONDARY_LIB_DIR/firefox/$MOZ_FIREFOX_FILE ]; then
+	echo "Error: $MOZ_LIB_DIR/firefox/$MOZ_FIREFOX_FILE not found"
+	if [ -d $SECONDARY_LIB_DIR ]; then
+	    echo "       $SECONDARY_LIB_DIR/firefox/$MOZ_FIREFOX_FILE not found"
+	fi
+	exit 1
+    fi
+    MOZ_LIB_DIR="$SECONDARY_LIB_DIR"
+fi
+MOZ_DIST_BIN="$MOZ_LIB_DIR/firefox"
+MOZ_LANGPACKS_DIR="$MOZ_DIST_BIN/langpacks"
+MOZ_EXTENSIONS_PROFILE_DIR="$HOME/.mozilla/extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}"
+MOZ_PROGRAM="$MOZ_DIST_BIN/$MOZ_FIREFOX_FILE"
+MOZ_LAUNCHER="$MOZ_DIST_BIN/run-mozilla.sh"
+
+##
+## Set MOZ_GRE_CONF
+##
+MOZ_GRE_CONF=/etc/gre.d/gre.conf
+if [ "$MOZ_LIB_DIR" == "/usr/lib64" ]; then
+  MOZ_GRE_CONF=/etc/gre.d/gre64.conf
+fi
+export MOZ_GRE_CONF
+
+##
+## Set MOZILLA_FIVE_HOME
+##
+MOZILLA_FIVE_HOME="$MOZ_DIST_BIN"
+
+export MOZILLA_FIVE_HOME
+
+##
+## Make sure that we set the plugin path
+##
+MOZ_PLUGIN_DIR="plugins"
+
+if [ "$MOZ_PLUGIN_PATH" ]
+then
+  MOZ_PLUGIN_PATH=$MOZ_PLUGIN_PATH:$MOZ_LIB_DIR/mozilla/$MOZ_PLUGIN_DIR:$MOZ_DIST_BIN/$MOZ_PLUGIN_DIR
+else
+  MOZ_PLUGIN_PATH=$MOZ_LIB_DIR/mozilla/$MOZ_PLUGIN_DIR:$MOZ_DIST_BIN/$MOZ_PLUGIN_DIR
+fi
+export MOZ_PLUGIN_PATH
+
+##
+## Set MOZ_APP_LAUNCHER for gnome-session
+##
+export MOZ_APP_LAUNCHER="/usr/bin/firefox"
+
+##
+## Set FONTCONFIG_PATH for Xft/fontconfig
+##
+FONTCONFIG_PATH="/etc/fonts:${MOZILLA_FIVE_HOME}/res/Xft"
+export FONTCONFIG_PATH
+
+##
+## In order to better support certain scripts (such as Indic and some CJK 
+## scripts), Fedora builds its Firefox, with permission from the Mozilla 
+## Corporation, with the Pango system as its text renderer.  This change 
+## may negatively impact performance on some pages.  To disable the use of
+## Pango, set MOZ_DISABLE_PANGO=1 in your environment before launching
+## Firefox.
+##
+#
+# MOZ_DISABLE_PANGO=1
+# export MOZ_DISABLE_PANGO
+#
+
+##
+## Disable the GNOME crash dialog, Moz has it's own
+##
+GNOME_DISABLE_CRASH_DIALOG=1
+export GNOME_DISABLE_CRASH_DIALOG
+
+##
+## Disable the SLICE allocator (rhbz#1014858)
+##
+export G_SLICE=always-malloc
+
+##
+## Enable Xinput2 (mozbz#1207973)
+##
+export MOZ_USE_XINPUT2=1
+
+# OK, here's where all the real work gets done
+
+
+##
+## To disable the use of Firefox localization, set MOZ_DISABLE_LANGPACKS=1
+## in your environment before launching Firefox.
+##
+#
+# MOZ_DISABLE_LANGPACKS=1
+# export MOZ_DISABLE_LANGPACKS
+#
+
+##
+## Automatically installed langpacks are tracked by .fedora-langpack-install
+## config file.
+##
+FEDORA_LANGPACK_CONFIG="$MOZ_EXTENSIONS_PROFILE_DIR/.fedora-langpack-install"
+
+# Since Firefox 60 the installation of individual langpack cannot be done by
+# copying xpi file to the home directory, because the langpack is loaded
+# as to the available languages after the language has been decided and
+# for the first run it won't be in language according to the locale.
+#
+# The current workaround is to put all langpacks to the location
+# for system wide extensions. So we set MOZ_DISABLE_LANGPACKS=1 for this moment
+export MOZ_DISABLE_LANGPACKS=1
+# MOZ_DISABLE_LANGPACKS disables language packs completely
+MOZILLA_DOWN=0
+if ! [ $MOZ_DISABLE_LANGPACKS ] || [ $MOZ_DISABLE_LANGPACKS -eq 0 ]; then
+    if [ -x $MOZ_DIST_BIN/$MOZ_FIREFOX_FILE ]; then
+        # Is firefox running?
+        /usr/bin/pidof firefox > /dev/null 2>&1
+        MOZILLA_DOWN=$?
+    fi
+fi
+
+# Modify language pack configuration only when firefox is not running 
+# and language packs are not disabled
+if [ $MOZILLA_DOWN -ne 0 ]; then
+
+    # Clear already installed langpacks
+    mkdir -p $MOZ_EXTENSIONS_PROFILE_DIR
+    if [ -f $FEDORA_LANGPACK_CONFIG ]; then
+        rm `cat $FEDORA_LANGPACK_CONFIG` > /dev/null 2>&1
+        rm $FEDORA_LANGPACK_CONFIG > /dev/null 2>&1
+        # remove all empty langpacks dirs while they block installation of langpacks
+        rmdir $MOZ_EXTENSIONS_PROFILE_DIR/langpack* > /dev/null 2>&1
+    fi
+
+    # Get locale from system
+    CURRENT_LOCALE=$LC_ALL
+    CURRENT_LOCALE=${CURRENT_LOCALE:-$LC_MESSAGES}
+    CURRENT_LOCALE=${CURRENT_LOCALE:-$LANG}
+
+    # Try with a local variant first, then without a local variant
+    SHORTMOZLOCALE=`echo $CURRENT_LOCALE | sed "s|_\([^.]*\).*||g"`
+    MOZLOCALE=`echo $CURRENT_LOCALE | sed "s|_\([^.]*\).*|-\1|g"`
+
+    function create_langpack_link() {
+        local language=$*
+        local langpack=langpack-${language}@firefox.mozilla.org.xpi
+        if [ -f $MOZ_LANGPACKS_DIR/$langpack ]; then
+            rm -rf $MOZ_EXTENSIONS_PROFILE_DIR/$langpack
+            # If the target file is a symlink (the fallback langpack), 
+            # install the original file instead of the fallback one
+            if [ -h $MOZ_LANGPACKS_DIR/$langpack ]; then
+                langpack=`readlink $MOZ_LANGPACKS_DIR/$langpack`
+            fi
+            ln -s $MOZ_LANGPACKS_DIR/$langpack \
+                  $MOZ_EXTENSIONS_PROFILE_DIR/$langpack
+            echo $MOZ_EXTENSIONS_PROFILE_DIR/$langpack > $FEDORA_LANGPACK_CONFIG
+            return 0
+        fi
+        return 1
+    }
+
+    create_langpack_link $MOZLOCALE || create_langpack_link $SHORTMOZLOCALE || true
+fi
+
+# BEAST fix (rhbz#1005611)
+NSS_SSL_CBC_RANDOM_IV=${NSS_SSL_CBC_RANDOM_IV-1}
+export NSS_SSL_CBC_RANDOM_IV
+
+# Prepare command line arguments
+script_args=""
+pass_arg_count=0
+while [ $# -gt $pass_arg_count ]
+do
+  case "$1" in
+    -g | --debug)
+      script_args="$script_args -g"
+      debugging=1
+      shift
+      ;;
+    -d | --debugger)
+      if [ $# -gt 1 ]; then
+        script_args="$script_args -d $2"
+        shift 2
+      else
+        shift
+      fi
+      ;;
+    *)
+      # Move the unrecognized argument to the end of the list.
+      arg="$1"
+      shift
+      set -- "$@" "$arg"
+      pass_arg_count=`expr $pass_arg_count + 1`
+      ;;
+  esac
+done
+
+# Linux version specific environment variables
+%RHEL_ENV_VARS%
+
+# Don't throw "old profile" dialog box.
+export MOZ_ALLOW_DOWNGRADE=1
+
+# Make sure at-spi-bus is running
+if ! dbus-send --session            \
+     --dest=org.freedesktop.DBus    \
+     --type=method_call             \
+     --print-reply                  \
+     /org/freedesktop/DBus          \
+     org.freedesktop.DBus.ListNames \
+     | grep org.a11y.Bus > /dev/null; then
+    if [ -f "$MOZ_LIB_DIR/firefox/bundled/libexec/at-spi-bus-launcher" ]; then
+        echo "Starting a11y dbus service..."
+        $MOZ_LIB_DIR/firefox/bundled/libexec/at-spi-bus-launcher &
+    else
+        echo "Running without a11y support!"
+    fi
+fi
+
+# Run the browser
+debugging=0
+if [ $debugging = 1 ]
+then
+  echo $MOZ_LAUNCHER $script_args $MOZ_PROGRAM "$@"
+fi
+
+
+exec $MOZ_LAUNCHER $script_args $MOZ_PROGRAM "$@"
diff --git a/SOURCES/google-api-key b/SOURCES/google-api-key
new file mode 100644
index 0000000..b95d189
--- /dev/null
+++ b/SOURCES/google-api-key
@@ -0,0 +1 @@
+AIzaSyBPGXa4AYD4FC3HJK7LnIKxm4fDusVuuco
diff --git a/SOURCES/gtk3-private-3.22.26-1-files.inc b/SOURCES/gtk3-private-3.22.26-1-files.inc
new file mode 100644
index 0000000..8e1e31a
--- /dev/null
+++ b/SOURCES/gtk3-private-3.22.26-1-files.inc
@@ -0,0 +1,54 @@
+%dir %{gtk3_install_path}/bin
+%{gtk3_install_path}/bin/gdk-pixbuf-query-loaders-%{__isa_bits}
+%{gtk3_install_path}/bin/gdk-pixbuf-thumbnailer
+%{gtk3_install_path}/bin/gio-querymodules-%{__isa_bits}
+%{gtk3_install_path}/bin/glib-compile-schemas
+%{gtk3_install_path}/bin/gtk-query-immodules-3.0-%{__isa_bits}
+%{gtk3_install_path}/bin/gtk-update-icon-cache
+%{gtk3_install_path}/bin/fc-cache
+
+%{gtk3_install_path}/etc
+
+%dir %{gtk3_install_path}/%{_lib}
+%{gtk3_install_path}/%{_lib}/libatk-1.0.so.*
+%{gtk3_install_path}/%{_lib}/libatk-bridge-2.0.so.*
+%{gtk3_install_path}/%{_lib}/libatspi.so.*
+%{gtk3_install_path}/%{_lib}/libcairo.so.*
+%{gtk3_install_path}/%{_lib}/libcairo-gobject.so.*
+%{gtk3_install_path}/%{_lib}/libfontconfig.so.*
+%{gtk3_install_path}/%{_lib}/libfreetype.so.*
+%{gtk3_install_path}/%{_lib}/libgdk-3.so.*
+%{gtk3_install_path}/%{_lib}/libgdk_pixbuf-2.0.so.*
+%{gtk3_install_path}/%{_lib}/libgio-2.0.so.*
+%{gtk3_install_path}/%{_lib}/libglib-2.0.so.*
+%{gtk3_install_path}/%{_lib}/libgmodule-2.0.so.*
+%{gtk3_install_path}/%{_lib}/libgobject-2.0.so.*
+%{gtk3_install_path}/%{_lib}/libgthread-2.0.so.*
+%{gtk3_install_path}/%{_lib}/libgtk-3.so.*
+%{gtk3_install_path}/%{_lib}/libharfbuzz.so.*
+%{gtk3_install_path}/%{_lib}/libpango-1.0.so.*
+%{gtk3_install_path}/%{_lib}/libpangocairo-1.0.so.*
+%{gtk3_install_path}/%{_lib}/libpangoft2-1.0.so.*
+%{gtk3_install_path}/%{_lib}/libpcre.so.*
+%{gtk3_install_path}/%{_lib}/librsvg-2.so.*
+%dir %{gtk3_install_path}/%{_lib}/cairo
+%{gtk3_install_path}/%{_lib}/cairo/cairo-fdr.so.*
+%{gtk3_install_path}/%{_lib}/cairo/cairo-sphinx.so.*
+%{gtk3_install_path}/%{_lib}/cairo/libcairo-trace.so.*
+%{gtk3_install_path}/%{_lib}/gdk-pixbuf-2.0
+%ghost %attr(644, root, root) %{gtk3_install_path}/%{_lib}/gdk-pixbuf-2.0/2.10.0/loaders.cache
+%{gtk3_install_path}/%{_lib}/gio
+%ghost %attr(644, root, root) %{gtk3_install_path}/%{_lib}/gio/modules/giomodule.cache
+%{gtk3_install_path}/%{_lib}/gtk-3.0
+%ghost %attr(644, root, root) %{gtk3_install_path}/%{_lib}/gtk-3.0/3.0.0/immodules.cache
+
+%{gtk3_install_path}/libexec
+
+%{gtk3_install_path}/share
+%ghost %attr(644, root, root) %{gtk3_install_path}/share/icons/Adwaita/icon-theme.cache
+%ghost %attr(644, root, root) %{gtk3_install_path}/share/icons/hicolor/icon-theme.cache
+%ghost %attr(644, root, root) %{gtk3_install_path}/share/glib-2.0/schemas/gschemas.compiled
+
+%{gtk3_install_path}/var
+%dir %{gtk3_install_path}/var/cache/fontconfig
+
diff --git a/SOURCES/gtk3-private-3.22.26-1-post.inc b/SOURCES/gtk3-private-3.22.26-1-post.inc
new file mode 100644
index 0000000..04acf06
--- /dev/null
+++ b/SOURCES/gtk3-private-3.22.26-1-post.inc
@@ -0,0 +1,23 @@
+# adwaita-icon-theme
+touch --no-create %{gtk3_install_path}/share/icons/Adwaita &>/dev/null || :
+touch --no-create %{gtk3_install_path}/share/icons/hicolor &>/dev/null || :
+%{gtk3_install_path}/bin/gdk-pixbuf-query-loaders-%{__isa_bits} --update-cache || :
+
+# glib2
+%{gtk3_install_path}/bin/gio-querymodules-%{__isa_bits} %{gtk3_install_path}/%{_lib}/gio/modules
+
+# gtk3
+%{gtk3_install_path}/bin/gtk-query-immodules-3.0-%{__isa_bits} --update-cache
+%{gtk3_install_path}/bin/glib-compile-schemas %{gtk3_install_path}/share/glib-2.0/schemas &> /dev/null || :
+
+# fontconfig
+umask 0022
+
+# Force regeneration of all fontconfig cache files
+# The check for existance is needed on dual-arch installs (the second
+#  copy of fontconfig might install the binary instead of the first)
+# The HOME setting is to avoid problems if HOME hasn't been reset
+# FIXME hardcoded version !
+if [ -x %{gtk3_install_path}/bin/fc-cache ] && %{gtk3_install_path}/bin/fc-cache --version 2>&1 | grep -q 2.10.95 ; then
+  HOME=/root %{gtk3_install_path}/bin/fc-cache -f
+fi
diff --git a/SOURCES/gtk3-private-3.22.26-1-posttrans.inc b/SOURCES/gtk3-private-3.22.26-1-posttrans.inc
new file mode 100644
index 0000000..8c5f2d7
--- /dev/null
+++ b/SOURCES/gtk3-private-3.22.26-1-posttrans.inc
@@ -0,0 +1,3 @@
+%{gtk3_install_path}/gtk-update-icon-cache %{gtk3_install_path}/share/icons/hicolor &>/dev/null || :
+# adwaita
+%{gtk3_install_path}/gtk-update-icon-cache %{gtk3_install_path}/share/icons/Adwaita &>/dev/null || :
diff --git a/SOURCES/gtk3-private-3.22.26-1-postun.inc b/SOURCES/gtk3-private-3.22.26-1-postun.inc
new file mode 100644
index 0000000..3b5df73
--- /dev/null
+++ b/SOURCES/gtk3-private-3.22.26-1-postun.inc
@@ -0,0 +1,27 @@
+# adwaita
+if [ $1 -eq 0 ] ; then
+    touch --no-create %{gtk3_install_path}/share/icons/Adwaita &>/dev/null
+    touch --no-create %{gtk3_install_path}/share/icons/hicolor &>/dev/null
+    %{gtk3_install_path}/bin/gtk-update-icon-cache %{gtk3_install_path}/share/icons/Adwaita &>/dev/null || :
+    %{gtk3_install_path}/bin/gtk-update-icon-cache %{gtk3_install_path}/share/icons/hicolor &>/dev/null || :
+fi
+
+# gdk-pixbuf2
+if [ $1 -gt 0 ]; then
+  %{gtk3_install_path}/bin/gdk-pixbuf-query-loaders-%{__isa_bits} --update-cache || :
+fi
+
+# glib2
+[ ! -x %{gtk3_install_path}/bin/gio-querymodules-%{__isa_bits} ] || \
+%{gtk3_install_path}/bin/gio-querymodules-%{__isa_bits} %{gtk3_install_path}/%{_lib}/gio/modules
+
+# gtk3
+if [ $1 -gt 0 ]; then
+  %{gtk3_install_path}/bin/gtk-query-immodules-3.0-%{__isa_bits} --update-cache
+fi
+
+if [ $1 -eq 0 ] ; then
+    rm -rf %{gtk3_install_path}/var/cache/fontconfig/* &>/dev/null || :
+fi
+
+%{gtk3_install_path}/bin/glib-compile-schemas %{gtk3_install_path}/share/glib-2.0/schemas &> /dev/null || :
diff --git a/SOURCES/gtk3-private-3.22.26-1-requires-provides-filter.inc b/SOURCES/gtk3-private-3.22.26-1-requires-provides-filter.inc
new file mode 100644
index 0000000..f5fa495
--- /dev/null
+++ b/SOURCES/gtk3-private-3.22.26-1-requires-provides-filter.inc
@@ -0,0 +1,26 @@
+%filter_provides_in %{gtk3_install_path}/%{_lib}
+%filter_requires_in %{gtk3_install_path}/%{_lib}
+
+%filter_from_requires /libgdk-3.*/d
+%filter_from_requires /libatk-1.0.so.*/d
+%filter_from_requires /libatk-bridge-2.0.so.*/d
+%filter_from_requires /libatspi.so.*/d
+%filter_from_requires /libcairo.so.*/d
+%filter_from_requires /libcairo-gobject.so.*/d
+%filter_from_requires /libfontconfig.so.*/d
+%filter_from_requires /libfreetype.so.*/d
+%filter_from_requires /libgdk-3.so.*/d
+%filter_from_requires /libgdk_pixbuf-2.0.so.*/d
+%filter_from_requires /libgio-2.0.so.*/d
+%filter_from_requires /libglib-2.0.so.*/d
+%filter_from_requires /libgmodule-2.0.so.*/d
+%filter_from_requires /libgobject-2.0.so.*/d
+%filter_from_requires /libgthread-2.0.so.*/d
+%filter_from_requires /libgtk-3.so.*/d
+%filter_from_requires /libharfbuzz.so.*/d
+%filter_from_requires /libpango-1.0.so.*/d
+%filter_from_requires /libpangocairo-1.0.so.*/d
+%filter_from_requires /libpangoft2-1.0.so.*/d
+%filter_from_requires /libpcre.so.*/d
+
+# Don't forget to call %%filter_setup from the consumer!
diff --git a/SOURCES/gtk3-private-3.22.26-1-setup-flags-env.inc b/SOURCES/gtk3-private-3.22.26-1-setup-flags-env.inc
new file mode 100644
index 0000000..eb54164
--- /dev/null
+++ b/SOURCES/gtk3-private-3.22.26-1-setup-flags-env.inc
@@ -0,0 +1,34 @@
+%if "%{name}" == "gtk3-private"
+    function prepend_buildroot_include_path_to_compiler_flags() {
+        export CFLAGS="-I%{_buildrootdir}%{gtk3_install_path}/$@ $CFLAGS" \
+        export CXXFLAGS="-I%{_buildrootdir}%{gtk3_install_path}/$@ $CXXFLAGS"
+    }
+    
+    prepend_buildroot_include_path_to_compiler_flags include
+    prepend_buildroot_include_path_to_compiler_flags include/glib-2.0
+    prepend_buildroot_include_path_to_compiler_flags include/glib-2.0
+    prepend_buildroot_include_path_to_compiler_flags include/gio-unix-2.0
+    prepend_buildroot_include_path_to_compiler_flags %{_lib}/glib-2.0/include
+    prepend_buildroot_include_path_to_compiler_flags include/freetype2
+    prepend_buildroot_include_path_to_compiler_flags include/fontconfig
+    prepend_buildroot_include_path_to_compiler_flags include/harfbuzz
+    prepend_buildroot_include_path_to_compiler_flags include/gdk-pixbuf-2.0
+    prepend_buildroot_include_path_to_compiler_flags include/atk-1.0
+    prepend_buildroot_include_path_to_compiler_flags include/at-spi-2.0
+    prepend_buildroot_include_path_to_compiler_flags include/at-spi2-atk/2.0
+    prepend_buildroot_include_path_to_compiler_flags include/cairo
+    prepend_buildroot_include_path_to_compiler_flags include/pango-1.0
+    prepend_buildroot_include_path_to_compiler_flags include/librsvg-2.0
+    prepend_buildroot_include_path_to_compiler_flags include/cairo
+    prepend_buildroot_include_path_to_compiler_flags include/gtk-3.0
+    prepend_buildroot_include_path_to_compiler_flags include/gtk-3.0/unix-print
+    prepend_buildroot_include_path_to_compiler_flags include/librsvg-2.0
+%else
+    sed -i 's@%{gtk3_install_path}@%{_buildrootdir}%{gtk3_install_path}@g' %{_buildrootdir}%{gtk3_install_path}/%{_lib}/pkgconfig/*.pc
+%endif
+
+export LDFLAGS="-L%{_buildrootdir}%{gtk3_install_path}/%{_lib} $LDFLAGS"
+export LDFLAGS="-Wl,-rpath,%{gtk3_install_path}/%{_lib} $LDFLAGS"
+export LDFLAGS="-Wl,-rpath-link,%{_buildrootdir}%{gtk3_install_path}/%{_lib} $LDFLAGS"
+
+export PKG_CONFIG_PATH=%{_buildrootdir}%{gtk3_install_path}/%{_lib}/pkgconfig
diff --git a/SOURCES/mozilla-1170092.patch b/SOURCES/mozilla-1170092.patch
new file mode 100644
index 0000000..5aebd73
--- /dev/null
+++ b/SOURCES/mozilla-1170092.patch
@@ -0,0 +1,99 @@
+diff -up firefox-68.5.0/extensions/pref/autoconfig/src/nsReadConfig.cpp.1170092 firefox-68.5.0/extensions/pref/autoconfig/src/nsReadConfig.cpp
+--- firefox-68.5.0/extensions/pref/autoconfig/src/nsReadConfig.cpp.1170092	2020-02-07 01:27:03.000000000 +0100
++++ firefox-68.5.0/extensions/pref/autoconfig/src/nsReadConfig.cpp	2020-02-24 11:30:32.058044651 +0100
+@@ -246,8 +246,20 @@ nsresult nsReadConfig::openAndEvaluateJS
+     if (NS_FAILED(rv)) return rv;
+ 
+     rv = NS_NewLocalFileInputStream(getter_AddRefs(inStr), jsFile);
+-    if (NS_FAILED(rv)) return rv;
++    if (NS_FAILED(rv)) {
++      // Look for cfg file in /etc/<application>/pref
++      rv = NS_GetSpecialDirectory(NS_APP_PREFS_SYSTEM_CONFIG_DIR,
++                                  getter_AddRefs(jsFile));
++      NS_ENSURE_SUCCESS(rv, rv);
++
++      rv = jsFile->AppendNative(NS_LITERAL_CSTRING("pref"));
++      NS_ENSURE_SUCCESS(rv, rv);
++      rv = jsFile->AppendNative(nsDependentCString(aFileName));
++      NS_ENSURE_SUCCESS(rv, rv);
+ 
++      rv = NS_NewLocalFileInputStream(getter_AddRefs(inStr), jsFile);
++      NS_ENSURE_SUCCESS(rv, rv);
++    }
+   } else {
+     nsAutoCString location("resource://gre/defaults/autoconfig/");
+     location += aFileName;
+diff -up firefox-68.5.0/modules/libpref/Preferences.cpp.1170092 firefox-68.5.0/modules/libpref/Preferences.cpp
+--- firefox-68.5.0/modules/libpref/Preferences.cpp.1170092	2020-02-24 11:30:32.059044645 +0100
++++ firefox-68.5.0/modules/libpref/Preferences.cpp	2020-02-24 11:35:14.613443673 +0100
+@@ -4436,6 +4436,8 @@ static nsresult pref_ReadDefaultPrefs(co
+   //
+   // Thus, in the omni.jar case, we always load app-specific default
+   // preferences from omni.jar, whether or not `$app == $gre`.
++  // At very end load configuration from system config location:
++  // - /etc/firefox/pref/*.js
+ 
+   nsresult rv = NS_ERROR_FAILURE;
+   nsZipFind* findPtr;
+diff -up firefox-68.5.0/toolkit/xre/nsXREDirProvider.cpp.1170092 firefox-68.5.0/toolkit/xre/nsXREDirProvider.cpp
+--- firefox-68.5.0/toolkit/xre/nsXREDirProvider.cpp.1170092	2020-02-07 01:28:06.000000000 +0100
++++ firefox-68.5.0/toolkit/xre/nsXREDirProvider.cpp	2020-02-24 11:34:27.284704700 +0100
+@@ -61,6 +61,7 @@
+ #endif
+ #ifdef XP_UNIX
+ #  include <ctype.h>
++#  include "nsIXULAppInfo.h"
+ #endif
+ #ifdef XP_IOS
+ #  include "UIKitDirProvider.h"
+@@ -524,6 +525,21 @@ nsXREDirProvider::GetFile(const char* aP
+       }
+     }
+   }
++
++#if defined(XP_UNIX)
++  if (!strcmp(aProperty, NS_APP_PREFS_SYSTEM_CONFIG_DIR)) {
++    nsCString sysConfigDir = NS_LITERAL_CSTRING("/etc/");
++    nsCOMPtr<nsIXULAppInfo> appInfo = do_GetService("@mozilla.org/xre/app-info;1");
++    if (!appInfo)
++      return NS_ERROR_NOT_AVAILABLE;
++    nsCString appName;
++    appInfo->GetName(appName);
++    ToLowerCase(appName);
++    sysConfigDir.Append(appName);
++    return NS_NewNativeLocalFile(sysConfigDir, false, aFile);
++  }
++#endif
++
+   if (NS_FAILED(rv) || !file) return NS_ERROR_FAILURE;
+ 
+   if (ensureFilePermissions) {
+@@ -880,6 +896,17 @@ nsresult nsXREDirProvider::GetFilesInter
+     LoadDirIntoArray(mXULAppDir, kAppendPrefDir, directories);
+     LoadDirsIntoArray(mAppBundleDirectories, kAppendPrefDir, directories);
+ 
++    // Add /etc/<application>/pref/ directory if it exists
++    nsCOMPtr<nsIFile> systemPrefDir;
++    rv = NS_GetSpecialDirectory(NS_APP_PREFS_SYSTEM_CONFIG_DIR,
++                                getter_AddRefs(systemPrefDir));
++    if (NS_SUCCEEDED(rv)) {
++      rv = systemPrefDir->AppendNative(NS_LITERAL_CSTRING("pref"));
++      if (NS_SUCCEEDED(rv)) {
++        directories.AppendObject(systemPrefDir);
++      }
++    }
++
+     rv = NS_NewArrayEnumerator(aResult, directories, NS_GET_IID(nsIFile));
+   } else if (!strcmp(aProperty, NS_APP_CHROME_DIR_LIST)) {
+     // NS_APP_CHROME_DIR_LIST is only used to get default (native) icons
+diff -up firefox-68.5.0/xpcom/io/nsAppDirectoryServiceDefs.h.1170092 firefox-68.5.0/xpcom/io/nsAppDirectoryServiceDefs.h
+--- firefox-68.5.0/xpcom/io/nsAppDirectoryServiceDefs.h.1170092	2020-02-07 01:27:52.000000000 +0100
++++ firefox-68.5.0/xpcom/io/nsAppDirectoryServiceDefs.h	2020-02-24 11:30:32.059044645 +0100
+@@ -62,6 +62,7 @@
+ #define NS_APP_PREFS_DEFAULTS_DIR_LIST "PrefDL"
+ #define NS_APP_PREFS_OVERRIDE_DIR \
+   "PrefDOverride"  // Directory for per-profile defaults
++#define NS_APP_PREFS_SYSTEM_CONFIG_DIR          "PrefSysConf"   // Directory with system-wide configuration
+ 
+ #define NS_APP_USER_PROFILE_50_DIR "ProfD"
+ #define NS_APP_USER_PROFILE_LOCAL_50_DIR "ProfLD"
diff --git a/SOURCES/mozilla-1196777.patch b/SOURCES/mozilla-1196777.patch
new file mode 100644
index 0000000..7fa1595
--- /dev/null
+++ b/SOURCES/mozilla-1196777.patch
@@ -0,0 +1,13 @@
+diff -up firefox-68.0/widget/gtk/nsWindow.cpp.1196777 firefox-68.0/widget/gtk/nsWindow.cpp
+--- firefox-68.0/widget/gtk/nsWindow.cpp.1196777	2019-05-21 11:29:55.833376744 +0200
++++ firefox-68.0/widget/gtk/nsWindow.cpp	2019-05-21 12:15:35.446089316 +0200
+@@ -156,7 +156,8 @@ const gint kEvents =
+ #if GTK_CHECK_VERSION(3, 4, 0)
+     GDK_SMOOTH_SCROLL_MASK | GDK_TOUCH_MASK |
+ #endif
+-    GDK_SCROLL_MASK | GDK_POINTER_MOTION_MASK | GDK_PROPERTY_CHANGE_MASK;
++    GDK_SCROLL_MASK | GDK_POINTER_MOTION_MASK | GDK_PROPERTY_CHANGE_MASK |
++    GDK_FOCUS_CHANGE_MASK;
+ 
+ #if !GTK_CHECK_VERSION(3, 22, 0)
+ typedef enum {
diff --git a/SOURCES/mozilla-1603112-accept-lang.patch b/SOURCES/mozilla-1603112-accept-lang.patch
new file mode 100644
index 0000000..b67b232
--- /dev/null
+++ b/SOURCES/mozilla-1603112-accept-lang.patch
@@ -0,0 +1,12 @@
+diff --git a/intl/strres/nsStringBundle.cpp b/intl/strres/nsStringBundle.cpp
+--- a/intl/strres/nsStringBundle.cpp
++++ b/intl/strres/nsStringBundle.cpp
+@@ -66,7 +66,6 @@
+     "chrome://global/locale/commonDialogs.properties",
+     "chrome://global/locale/css.properties",
+     "chrome://global/locale/dom/dom.properties",
+-    "chrome://global/locale/intl.properties",
+     "chrome://global/locale/layout/HtmlForm.properties",
+     "chrome://global/locale/layout/htmlparser.properties",
+     "chrome://global/locale/layout_errors.properties",
+
diff --git a/SOURCES/mozilla-api-key b/SOURCES/mozilla-api-key
new file mode 100644
index 0000000..81877bc
--- /dev/null
+++ b/SOURCES/mozilla-api-key
@@ -0,0 +1 @@
+9008bb7e-1e22-4038-94fe-047dd48ccc0b
diff --git a/SOURCES/mozilla-bmo1005535.patch b/SOURCES/mozilla-bmo1005535.patch
new file mode 100644
index 0000000..96f6e1a
--- /dev/null
+++ b/SOURCES/mozilla-bmo1005535.patch
@@ -0,0 +1,20 @@
+# HG changeset patch
+# User Steve Singer <steve@ssinger.info>
+# Date 1558451540 -7200
+#      Tue May 21 17:12:20 2019 +0200
+# Node ID 433beec63e6b5f409683af20a0c1ab137cc7bfad
+# Parent  42c99b59a87b904063bad3193f10c51d068d2eac
+Bug 1005535 - Get skia GPU building on big endian.
+
+diff -r 42c99b59a87b -r 433beec63e6b gfx/skia/skia/include/private/GrColor.h
+--- a/gfx/skia/skia/include/private/GrColor.h	Wed Jun 05 08:48:08 2019 +0200
++++ b/gfx/skia/skia/include/private/GrColor.h	Tue May 21 17:12:20 2019 +0200
+@@ -63,7 +63,7 @@
+  *  Since premultiplied means that alpha >= color, we construct a color with
+  *  each component==255 and alpha == 0 to be "illegal"
+  */
+-#define GrColor_ILLEGAL     (~(0xFF << GrColor_SHIFT_A))
++#define GrColor_ILLEGAL     ((uint32_t)(~(0xFF << GrColor_SHIFT_A)))
+ 
+ /** Normalizes and coverts an uint8_t to a float. [0, 255] -> [0.0, 1.0] */
+ static inline float GrNormalizeByteToFloat(uint8_t value) {
diff --git a/SOURCES/mozilla-bmo1504834-part1.patch b/SOURCES/mozilla-bmo1504834-part1.patch
new file mode 100644
index 0000000..cb985bb
--- /dev/null
+++ b/SOURCES/mozilla-bmo1504834-part1.patch
@@ -0,0 +1,81 @@
+# HG changeset patch
+# Parent  051b75a600dfbf7503c3485cebfd34d4eb29be96
+Taken from https://bugzilla.mozilla.org/show_bug.cgi?id=1504834
+
+diff -r 051b75a600df gfx/2d/DrawTargetSkia.cpp
+--- a/gfx/2d/DrawTargetSkia.cpp	Fri Jul 05 12:42:44 2019 +0200
++++ b/gfx/2d/DrawTargetSkia.cpp	Mon Jul 08 10:59:30 2019 +0200
+@@ -138,8 +138,7 @@
+   return surfaceBounds.Intersect(bounds);
+ }
+ 
+-static const int kARGBAlphaOffset =
+-    SurfaceFormat::A8R8G8B8_UINT32 == SurfaceFormat::B8G8R8A8 ? 3 : 0;
++static const int kARGBAlphaOffset = 0;  // Skia is always BGRA SurfaceFormat::A8R8G8B8_UINT32 == SurfaceFormat::B8G8R8A8 ? 3 : 0;
+ 
+ static bool VerifyRGBXFormat(uint8_t* aData, const IntSize& aSize,
+                              const int32_t aStride, SurfaceFormat aFormat) {
+diff -r 051b75a600df gfx/2d/Types.h
+--- a/gfx/2d/Types.h	Fri Jul 05 12:42:44 2019 +0200
++++ b/gfx/2d/Types.h	Mon Jul 08 10:59:30 2019 +0200
+@@ -85,15 +85,8 @@
+ // The following values are endian-independent synonyms. The _UINT32 suffix
+ // indicates that the name reflects the layout when viewed as a uint32_t
+ // value.
+-#if MOZ_LITTLE_ENDIAN
+   A8R8G8B8_UINT32 = B8G8R8A8,  // 0xAARRGGBB
+   X8R8G8B8_UINT32 = B8G8R8X8   // 0x00RRGGBB
+-#elif MOZ_BIG_ENDIAN
+-  A8R8G8B8_UINT32 = A8R8G8B8,  // 0xAARRGGBB
+-  X8R8G8B8_UINT32 = X8R8G8B8   // 0x00RRGGBB
+-#else
+-#  error "bad endianness"
+-#endif
+ };
+ 
+ static inline int BytesPerPixel(SurfaceFormat aFormat) {
+diff -r 051b75a600df gfx/skia/skia/third_party/skcms/skcms.cc
+--- a/gfx/skia/skia/third_party/skcms/skcms.cc	Fri Jul 05 12:42:44 2019 +0200
++++ b/gfx/skia/skia/third_party/skcms/skcms.cc	Mon Jul 08 10:59:30 2019 +0200
+@@ -17,6 +17,8 @@
+     #include <arm_neon.h>
+ #elif defined(__SSE__)
+     #include <immintrin.h>
++#else
++    #define SKCMS_PORTABLE
+ #endif
+ 
+ // sizeof(x) will return size_t, which is 32-bit on some machines and 64-bit on others.
+@@ -124,20 +126,28 @@
+ static uint16_t read_big_u16(const uint8_t* ptr) {
+     uint16_t be;
+     memcpy(&be, ptr, sizeof(be));
+-#if defined(_MSC_VER)
++#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
++    return be;
++#else
++    #if defined(_MSC_VER)
+     return _byteswap_ushort(be);
+-#else
++    #else
+     return __builtin_bswap16(be);
++    #endif
+ #endif
+ }
+ 
+ static uint32_t read_big_u32(const uint8_t* ptr) {
+     uint32_t be;
+     memcpy(&be, ptr, sizeof(be));
+-#if defined(_MSC_VER)
++#if __BYTE_ORDER == __ORDER_BIG_ENDIAN__
++    return be;
++#else
++    #if defined(_MSC_VER)
+     return _byteswap_ulong(be);
+-#else
++    #else
+     return __builtin_bswap32(be);
++    #endif
+ #endif
+ }
+ 
diff --git a/SOURCES/mozilla-bmo1504834-part2.patch b/SOURCES/mozilla-bmo1504834-part2.patch
new file mode 100644
index 0000000..e6e6aa5
--- /dev/null
+++ b/SOURCES/mozilla-bmo1504834-part2.patch
@@ -0,0 +1,88 @@
+# HG changeset patch
+# Parent  36563351309ddbc6c29559ba50a41d005f925abb
+Skia does not support big endian. The places to fix are too numerous and upstream (skia, not Mozilla)
+has no interest in maintaining big endian.
+So here we try to swizzle the input for skia, so that skia always works on LE, and when it comes
+out again, we transform back to BE.
+
+diff -r 36563351309d gfx/2d/ConvolutionFilter.cpp
+--- a/gfx/2d/ConvolutionFilter.cpp	Mon Sep 09 17:59:28 2019 +0200
++++ b/gfx/2d/ConvolutionFilter.cpp	Tue Sep 10 08:25:13 2019 +0200
+@@ -35,9 +35,38 @@
+   return true;
+ }
+ 
++static void ByteSwapArray(uint8_t *u8Array, int32_t size) {
++    uint32_t *array = reinterpret_cast<uint32_t*>(u8Array);
++    for (int pxl = 0; pxl < size; ++pxl) {
++        // Use an endian swap to move the bytes, i.e. BGRA -> ARGB.
++        uint32_t rgba = array[pxl];
++        array[pxl] = NativeEndian::swapToLittleEndian(rgba);
++    }
++}
++
+ void ConvolutionFilter::ConvolveHorizontally(const uint8_t* aSrc, uint8_t* aDst,
+                                              bool aHasAlpha) {
++#if MOZ_BIG_ENDIAN
++    int outputSize = mFilter->numValues();
++
++    // Input size isn't handed in, so we have to calculate it quickly
++    int inputSize = 0;
++    for (int xx = 0; xx < outputSize; ++xx) {
++        // Get the filter that determines the current output pixel.
++        int filterOffset, filterLength;
++        mFilter->FilterForValue(xx, &filterOffset, &filterLength);
++        inputSize = std::max(inputSize, filterOffset + filterLength);
++    }
++
++    ByteSwapArray((uint8_t*)aSrc, inputSize);
++#endif
++
+   SkOpts::convolve_horizontally(aSrc, *mFilter, aDst, aHasAlpha);
++
++#if MOZ_BIG_ENDIAN
++    ByteSwapArray((uint8_t*)aSrc, inputSize);
++    ByteSwapArray(aDst, outputSize);
++#endif
+ }
+ 
+ void ConvolutionFilter::ConvolveVertically(uint8_t* const* aSrc, uint8_t* aDst,
+@@ -49,8 +78,26 @@
+   int32_t filterLength;
+   auto filterValues =
+       mFilter->FilterForValue(aRowIndex, &filterOffset, &filterLength);
++
++#if MOZ_BIG_ENDIAN
++  for (int filterY = 0; filterY < filterLength; filterY++) {
++      // Skia only knows LE, so we have to swizzle the input
++    ByteSwapArray(aSrc[filterY], aRowSize);
++  }
++#endif
++
+   SkOpts::convolve_vertically(filterValues, filterLength, aSrc, aRowSize, aDst,
+                               aHasAlpha);
++
++#if MOZ_BIG_ENDIAN
++  // After skia is finished, we swizzle back to BE, in case
++  // the input is used again somewhere else
++  for (int filterY = 0; filterY < filterLength; filterY++) {
++    ByteSwapArray(aSrc[filterY], aRowSize);
++  }
++  // The destination array as well
++  ByteSwapArray(aDst, aRowSize);
++#endif
+ }
+ 
+ /* ConvolutionFilter::ComputeResizeFactor is derived from Skia's
+diff -r 36563351309d gfx/skia/skia/include/core/SkPreConfig.h
+--- a/gfx/skia/skia/include/core/SkPreConfig.h	Mon Sep 09 17:59:28 2019 +0200
++++ b/gfx/skia/skia/include/core/SkPreConfig.h	Tue Sep 10 08:25:13 2019 +0200
+@@ -73,7 +73,7 @@
+       defined(__ppc__) || defined(__hppa) || \
+       defined(__PPC__) || defined(__PPC64__) || \
+       defined(_MIPSEB) || defined(__ARMEB__) || \
+-      defined(__s390__) || \
++      defined(__s390__) || defined(__s390x__) || \
+       (defined(__sh__) && defined(__BIG_ENDIAN__)) || \
+       (defined(__ia64) && defined(__BIG_ENDIAN__))
+          #define SK_CPU_BENDIAN
diff --git a/SOURCES/mozilla-bmo1504834-part3.patch b/SOURCES/mozilla-bmo1504834-part3.patch
new file mode 100644
index 0000000..1a498f8
--- /dev/null
+++ b/SOURCES/mozilla-bmo1504834-part3.patch
@@ -0,0 +1,44 @@
+# HG changeset patch
+# Parent  aecb4600e5da17443b224c79eee178c1d8e155e3
+For FF68, AntiAliasing of XULTexts seem to be broken on big endian (s390x). Text and icons of the sandwich-menu to the
+right of the address bar, as well as plugin-windows appears transparant, which usually means unreadable (white on white).
+
+diff -r aecb4600e5da gfx/skia/skia/include/private/SkNx.h
+--- a/gfx/skia/skia/include/private/SkNx.h	Tue Aug 20 09:46:55 2019 +0200
++++ b/gfx/skia/skia/include/private/SkNx.h	Mon Sep 09 10:04:06 2019 +0200
+@@ -238,7 +238,18 @@
+     AI SkNx operator*(const SkNx& y) const { return fVal * y.fVal; }
+     AI SkNx operator/(const SkNx& y) const { return fVal / y.fVal; }
+ 
++    // On Big endian the commented out variant doesn't work,
++    // and honestly, I have no idea why it exists in the first place.
++    // The reason its broken is, I think, that it defaults to the double-variant of ToBits()
++    // which gets a 64-bit integer, and FromBits returns 32-bit,
++    // cutting off the wrong half again.
++    // Overall, I see no reason to have ToBits and FromBits at all (even for floats/doubles).
++    // Still we are only "fixing" this for big endian and leave little endian alone (never touch a running system)
++#ifdef SK_CPU_BENDIAN
++    AI SkNx operator&(const SkNx& y) const { return fVal & y.fVal; }
++#else
+     AI SkNx operator&(const SkNx& y) const { return FromBits(ToBits(fVal) & ToBits(y.fVal)); }
++#endif
+     AI SkNx operator|(const SkNx& y) const { return FromBits(ToBits(fVal) | ToBits(y.fVal)); }
+     AI SkNx operator^(const SkNx& y) const { return FromBits(ToBits(fVal) ^ ToBits(y.fVal)); }
+ 
+diff -r aecb4600e5da gfx/skia/skia/src/opts/SkBlitMask_opts.h
+--- a/gfx/skia/skia/src/opts/SkBlitMask_opts.h	Tue Aug 20 09:46:55 2019 +0200
++++ b/gfx/skia/skia/src/opts/SkBlitMask_opts.h	Mon Sep 09 10:04:06 2019 +0200
+@@ -203,7 +203,13 @@
+             //   ~~~>
+             // a = 1*aa + d(1-1*aa) = aa + d(1-aa)
+             // c = 0*aa + d(1-1*aa) =      d(1-aa)
++
++            // For big endian we have to swap the alpha-mask from 0,0,0,255 to 255,0,0,0
++#ifdef SK_CPU_BENDIAN
++            return Sk4px(Sk16b(aa) & Sk16b(255,0,0,0, 255,0,0,0, 255,0,0,0, 255,0,0,0))
++#else
+             return Sk4px(Sk16b(aa) & Sk16b(0,0,0,255, 0,0,0,255, 0,0,0,255, 0,0,0,255))
++#endif
+                  + d.approxMulDiv255(aa.inv());
+         };
+         while (h --> 0) {
diff --git a/SOURCES/mozilla-bmo1504834-part4.patch b/SOURCES/mozilla-bmo1504834-part4.patch
new file mode 100644
index 0000000..9d2ffc4
--- /dev/null
+++ b/SOURCES/mozilla-bmo1504834-part4.patch
@@ -0,0 +1,30 @@
+# HG changeset patch
+# Parent  46ea866ca3acb8bb5e1709ceb799b9c94f591dec
+Problem description: Tab-titles that are too long to fit into a tab get faded out.
+                     On big endian this is broken and instead of fading out, the 
+                     tab gets white and the font transparent, leading to an unreadable
+                     tab-title
+Solution: This is not a real solution, but a hack. The real solution would have been
+          to byte-swap the correct buffer, but I could not find it.
+          So the next best thing is to deactivate the fading-effect. Now all tab-titles
+          are readable, albeit not as pretty to look at as they could be. 
+Side-effects: I have not yet found an unwanted side-effect.
+
+diff -r 46ea866ca3ac -r 6ef20eee3f8f gfx/2d/DrawTargetSkia.cpp
+--- a/gfx/2d/DrawTargetSkia.cpp	Tue Oct 22 12:27:22 2019 +0200
++++ b/gfx/2d/DrawTargetSkia.cpp	Thu Oct 31 09:11:56 2019 +0100
+@@ -1861,6 +1861,14 @@
+       SkCanvas::kPreserveLCDText_SaveLayerFlag |
+           (aCopyBackground ? SkCanvas::kInitWithPrevious_SaveLayerFlag : 0));
+ 
++#if MOZ_BIG_ENDIAN
++  // Pushing a layer where an aMask is defined produces wrong output.
++  // We _should_ endian swap the data, but I couldn't find a workable way to do so
++  // Therefore I deactivate those layers in the meantime.
++  // The result is: Tab-titles that are longer than the available space should be faded out.
++  //                The fading doesn't work, so we deactivate the fading-effect here.
++  if (!aMask)
++#endif
+   mCanvas->saveLayer(saveRec);
+ 
+   SetPermitSubpixelAA(aOpaque);
diff --git a/SOURCES/mozilla-bmo1554971.patch b/SOURCES/mozilla-bmo1554971.patch
new file mode 100644
index 0000000..ab25c2d
--- /dev/null
+++ b/SOURCES/mozilla-bmo1554971.patch
@@ -0,0 +1,22 @@
+# HG changeset patch
+# Parent  a25cebecb02d5460b8ad757fe9cb4a9c8d1d7658
+Eliminate startup error message:
+JavaScript error: , line 0: Error: Type error for platformInfo value (Error processing arch: Invalid enumeration value "s390x") for runtime.getPlatformInfo.
+
+Reported here: https://bugzilla.mozilla.org/show_bug.cgi?id=1554971
+
+Uncertain if this is causing real problems or not. Also uncertain if the fix actually fixes anything.
+No response from upstream yet.
+
+diff -r a25cebecb02d -r 378b81b00e73 toolkit/components/extensions/schemas/runtime.json
+--- a/toolkit/components/extensions/schemas/runtime.json	Fri Jul 05 12:42:44 2019 +0200
++++ b/toolkit/components/extensions/schemas/runtime.json	Fri Jul 19 13:19:30 2019 +0200
+@@ -64,7 +64,7 @@
+       {
+         "id": "PlatformArch",
+         "type": "string",
+-        "enum": ["arm", "x86-32", "x86-64"],
++        "enum": ["arm", "x86-32", "x86-64", "s390x", "aarch64", "ppc64le"],
+         "allowedContexts": ["content", "devtools"],
+         "description": "The machine's processor architecture."
+       },
diff --git a/SOURCES/mozilla-bmo1602730.patch b/SOURCES/mozilla-bmo1602730.patch
new file mode 100644
index 0000000..c11f958
--- /dev/null
+++ b/SOURCES/mozilla-bmo1602730.patch
@@ -0,0 +1,28 @@
+diff -r 6ef20eee3f8f gfx/layers/basic/BasicCompositor.cpp
+--- a/gfx/layers/basic/BasicCompositor.cpp	Thu Oct 31 09:11:56 2019 +0100
++++ b/gfx/layers/basic/BasicCompositor.cpp	Wed Dec 11 16:16:09 2019 +0100
+@@ -693,9 +693,13 @@
+ 
+   RefPtr<SourceSurface> sourceMask;
+   Matrix maskTransform;
++  // Setting an alpha-mask here breaks the URL-bar on big endian (s390x)
++  // if the typed URL is too long for the textbox (automatic scrolling needed)
++#if MOZ_LITTLE_ENDIAN
+   if (aTransform.Is2D()) {
+     SetupMask(aEffectChain, dest, offset, sourceMask, maskTransform);
+   }
++#endif
+ 
+   CompositionOp blendMode = CompositionOp::OP_OVER;
+   if (Effect* effect =
+diff -r 6ef20eee3f8f gfx/layers/composite/CompositableHost.cpp
+--- a/gfx/layers/composite/CompositableHost.cpp	Thu Oct 31 09:11:56 2019 +0100
++++ b/gfx/layers/composite/CompositableHost.cpp	Wed Dec 11 16:16:09 2019 +0100
+@@ -91,6 +91,7 @@
+   }
+   MOZ_ASSERT(source);
+ 
++  // Alternatively: Comment out these lines where the alpha-mask is set
+   RefPtr<EffectMask> effect =
+       new EffectMask(source, source->GetSize(), aTransform);
+   aEffects.mSecondaryEffects[EffectTypes::MASK] = effect;
diff --git a/SOURCES/mozilla-bmo849632.patch b/SOURCES/mozilla-bmo849632.patch
new file mode 100644
index 0000000..177fdc3
--- /dev/null
+++ b/SOURCES/mozilla-bmo849632.patch
@@ -0,0 +1,23 @@
+Problem:  webGL sites are displayed in the wrong color (usually blue-ish)
+Solution: Problem is with skia once again. Output of webgl seems endian-correct, but skia only
+          knows how to deal with little endian.
+          So we swizzle the output of webgl after reading it from readpixels()
+Note:     This does not fix all webGL sites, but is a step in the right direction
+diff -r 6b017d3e9733 gfx/gl/GLContext.h
+--- a/gfx/gl/GLContext.h    Mon Sep 09 10:04:05 2019 +0200
++++ b/gfx/gl/GLContext.h    Wed Nov 13 17:13:04 2019 +0100
+@@ -1551,6 +1551,13 @@
+     BEFORE_GL_CALL;
+     mSymbols.fReadPixels(x, y, width, height, format, type, pixels);
+     OnSyncCall();
++#if MOZ_BIG_ENDIAN
++    uint8_t* itr = (uint8_t*)pixels;
++    for (GLsizei i = 0; i < width * height; i++) {
++      NativeEndian::swapToLittleEndianInPlace((uint32_t*)itr, 1);
++      itr += 4;
++    }
++#endif
+     AFTER_GL_CALL;
+     mHeavyGLCallsSinceLastFlush = true;
+   }
+
diff --git a/SOURCES/mozilla-nestegg-big-endian.patch b/SOURCES/mozilla-nestegg-big-endian.patch
new file mode 100644
index 0000000..de9adbf
--- /dev/null
+++ b/SOURCES/mozilla-nestegg-big-endian.patch
@@ -0,0 +1,38 @@
+# HG changeset patch
+# Parent  381102061fccdec40efda75c7423a766f68201ba
+Bug-behavior: Youtube-videos using VP9 and opus as audio-codec started loading but did not play
+Reason: While parsing the audio-stream, the sampling frequency (short rate) was wrongly parsed by
+        nestegg, returning 0 all the time. This led to the audio-track reporting that it neither had 
+        valid video nor audio. Which led to an endless-loop in the video state machine.
+Solution: Correct parsing of rate in nestegg, which is a float and cuts of bytes.
+Link: https://github.com/kinetiknz/nestegg/issues/64
+
+diff -r 381102061fcc -r 8da4be020b1e media/libnestegg/src/nestegg.c
+--- a/media/libnestegg/src/nestegg.c	Tue Aug 13 07:51:27 2019 +0200
++++ b/media/libnestegg/src/nestegg.c	Tue Aug 20 07:59:54 2019 +0200
+@@ -768,7 +768,15 @@
+ {
+   union {
+     uint64_t u;
+-    float f;
++    struct {
++#if __FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__
++      uint32_t _pad;
++      float f;
++#else
++      float f;
++      uint32_t _pad;
++#endif
++    } f;
+     double d;
+   } value;
+   int r;
+@@ -780,7 +788,7 @@
+   if (r != 1)
+     return r;
+   if (length == 4)
+-    *val = value.f;
++    *val = value.f.f;
+   else
+     *val = value.d;
+   return 1;
diff --git a/SOURCES/mozilla-s390-context.patch b/SOURCES/mozilla-s390-context.patch
new file mode 100644
index 0000000..55bd7a8
--- /dev/null
+++ b/SOURCES/mozilla-s390-context.patch
@@ -0,0 +1,36 @@
+# HG changeset patch
+# User msirringhaus@suse.de
+# Date 1558452408 -7200
+#      Tue May 21 17:26:48 2019 +0200
+# Node ID 602e92722e765a3c238d3b96b26c0c8063b5eeb4
+# Parent  a3cc550d25e3a04d906f516928cbcbe50efd585e
+[mq]: mozilla-s390-context.patch
+
+diff -r a3cc550d25e3 -r 602e92722e76 js/src/wasm/WasmSignalHandlers.cpp
+--- a/js/src/wasm/WasmSignalHandlers.cpp	Tue May 21 17:22:06 2019 +0200
++++ b/js/src/wasm/WasmSignalHandlers.cpp	Tue May 21 17:26:48 2019 +0200
+@@ -154,6 +154,10 @@
+ #    define R01_sig(p) ((p)->uc_mcontext.gp_regs[1])
+ #    define R32_sig(p) ((p)->uc_mcontext.gp_regs[32])
+ #  endif
++#  if defined(__linux__) && defined(__s390x__)
++#    define GR_sig(p,x) ((p)->uc_mcontext.gregs[x])
++#    define PSWa_sig(p) ((p)->uc_mcontext.psw.addr)
++#  endif
+ #elif defined(__NetBSD__)
+ #  define EIP_sig(p) ((p)->uc_mcontext.__gregs[_REG_EIP])
+ #  define EBP_sig(p) ((p)->uc_mcontext.__gregs[_REG_EBP])
+@@ -385,8 +389,13 @@
+ #  define PC_sig(p) R32_sig(p)
+ #  define SP_sig(p) R01_sig(p)
+ #  define FP_sig(p) R01_sig(p)
++#elif defined(__s390x__)
++# define PC_sig(p) PSWa_sig(p)
++# define SP_sig(p) GR_sig(p, 15)
++# define FP_sig(p) GR_sig(p, 11)
+ #endif
+ 
++
+ static void SetContextPC(CONTEXT* context, uint8_t* pc) {
+ #ifdef PC_sig
+   *reinterpret_cast<uint8_t**>(&PC_sig(context)) = pc;
diff --git a/SOURCES/no-rust-lto.patch b/SOURCES/no-rust-lto.patch
new file mode 100644
index 0000000..7d8ae5d
--- /dev/null
+++ b/SOURCES/no-rust-lto.patch
@@ -0,0 +1,12 @@
+diff -up firefox-68.0/config/makefiles/rust.mk.old firefox-68.0/config/makefiles/rust.mk
+--- firefox-68.0/config/makefiles/rust.mk.old	2019-06-05 10:33:34.290128660 +0200
++++ firefox-68.0/config/makefiles/rust.mk	2019-06-05 10:33:59.835052814 +0200
+@@ -47,7 +47,7 @@ cargo_rustc_flags = $(CARGO_RUSTCFLAGS)
+ ifndef DEVELOPER_OPTIONS
+ ifndef MOZ_DEBUG_RUST
+ # Enable link-time optimization for release builds.
+-cargo_rustc_flags += -C lto
++#cargo_rustc_flags += -C lto
+ endif
+ endif
+ 
diff --git a/SOURCES/node-stdout-nonblocking-wrapper b/SOURCES/node-stdout-nonblocking-wrapper
new file mode 100755
index 0000000..e36d134
--- /dev/null
+++ b/SOURCES/node-stdout-nonblocking-wrapper
@@ -0,0 +1,3 @@
+#!/bin/sh
+#exec /usr/bin/node "$@" 2>&1 | cat -
+exec $MOZ_NODEJS "$@" 2>&1 | cat -
diff --git a/SOURCES/nss-build-mozilla-1564499.patch b/SOURCES/nss-build-mozilla-1564499.patch
new file mode 100644
index 0000000..9d5bb5c
--- /dev/null
+++ b/SOURCES/nss-build-mozilla-1564499.patch
@@ -0,0 +1,12 @@
+diff -up firefox-68.0/security/nss/lib/freebl/mpi/mpcpucache.c.old firefox-68.0/security/nss/lib/freebl/mpi/mpcpucache.c
+--- firefox-68.0/security/nss/lib/freebl/mpi/mpcpucache.c.old	2019-07-26 07:09:02.383303420 +0200
++++ firefox-68.0/security/nss/lib/freebl/mpi/mpcpucache.c	2019-07-26 07:09:27.228193798 +0200
+@@ -727,7 +727,7 @@ static inline void
+ dcbzl(char *array)
+ {
+     register char *a asm("r2") = array;
+-    __asm__ __volatile__("dcbzl %0,r0"
++    __asm__ __volatile__("dcbzl %0,0"
+                          : "=r"(a)
+                          : "0"(a));
+ }
diff --git a/SOURCES/python-2.7-gcc8-fix.patch b/SOURCES/python-2.7-gcc8-fix.patch
new file mode 100644
index 0000000..d4da520
--- /dev/null
+++ b/SOURCES/python-2.7-gcc8-fix.patch
@@ -0,0 +1,57 @@
+commit 0b91f8a668201fc58fa732b8acc496caedfdbae0
+Author: Florian Weimer <fw@deneb.enyo.de>
+Date:   Sun Apr 29 12:18:33 2018 -0700
+
+    Indicate that _PyGC_Head is only 8-byte aligned. (closes bpo-33374)
+
+    By spec, the "long double" in _PyGC_Head requires the union to always be 16-byte
+    aligned. However, obmalloc only yields 8-byte alignment. Compilers including GCC
+    8 are starting to use alignment information to do store-merging. So, the "long
+    double" needs to be changed to a simple "double" as was long ago done in Python
+    3 by e348c8d154cf6342c79d627ebfe89dfe9de23817. For 2.7, we need to add some
+    dummy padding to make sure _PyGC_Head stays the same size.
+
+diff --git a/Include/objimpl.h b/Include/objimpl.h
+index 5f28683329..cbf6bc3f87 100644
+--- Python-2.7.13/Include/objimpl.h
++++ Python-2.7.13/Include/objimpl.h
+@@ -248,6 +248,20 @@ PyAPI_FUNC(PyVarObject *) _PyObject_GC_Resize(PyVarObject *, Py_ssize_t);
+ /* for source compatibility with 2.2 */
+ #define _PyObject_GC_Del PyObject_GC_Del
+
++/*
++ * Former over-aligned definition of PyGC_Head, used to compute the size of the
++ * padding for the new version below.
++ */
++union _gc_head;
++union _gc_head_old {
++    struct {
++        union _gc_head_old *gc_next;
++        union _gc_head_old *gc_prev;
++        Py_ssize_t gc_refs;
++    } gc;
++    long double dummy;
++};
++
+ /* GC information is stored BEFORE the object structure. */
+ typedef union _gc_head {
+     struct {
+@@ -255,7 +269,8 @@ typedef union _gc_head {
+         union _gc_head *gc_prev;
+         Py_ssize_t gc_refs;
+     } gc;
+-    long double dummy;  /* force worst-case alignment */
++    double dummy; /* Force at least 8-byte alignment. */
++    char dummy_padding[sizeof(union _gc_head_old)];
+ } PyGC_Head;
+
+ extern PyGC_Head *_PyGC_generation0;
+diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-04-29-12-07-00.bpo-33374.-xegL6.rst b/Misc/NEWS.d/next/Core and Builtins/2018-04-29-12-07-00.bpo-33374.-xegL6.rst
+new file mode 100644
+index 0000000000..9ec1a605c8
+--- /dev/null
++++ Python-2.7.13/Misc/NEWS.d/next/Core and Builtins/2018-04-29-12-07-00.bpo-33374.-xegL6.rst
+@@ -0,0 +1,3 @@
++Tweak the definition of PyGC_Head, so compilers do not believe it is always
++16-byte aligned on x86. This prevents crashes with more aggressive
++optimizations present in GCC 8.
diff --git a/SOURCES/python-2.7.patch b/SOURCES/python-2.7.patch
new file mode 100644
index 0000000..cad1c67
--- /dev/null
+++ b/SOURCES/python-2.7.patch
@@ -0,0 +1,17 @@
+diff -up Python-2.7.13/configure.build Python-2.7.13/configure
+--- Python-2.7.13/configure.build	2019-06-04 13:32:12.772134075 +0200
++++ Python-2.7.13/configure	2019-06-04 13:32:26.140144601 +0200
+@@ -6018,11 +6018,11 @@ then
+ 		# debug builds.
+ 		OPT="-g -O0 -Wall $STRICT_PROTO"
+ 	    else
+-		OPT="-g $WRAP -O3 -Wall $STRICT_PROTO"
++		OPT="-g $WRAP -O2 -Wall $STRICT_PROTO"
+ 	    fi
+ 	    ;;
+ 	*)
+-	    OPT="-O3 -Wall $STRICT_PROTO"
++	    OPT="-O2 -Wall $STRICT_PROTO"
+ 	    ;;
+ 	esac
+ 	case $ac_sys_system in
diff --git a/SOURCES/python-encode.patch b/SOURCES/python-encode.patch
new file mode 100644
index 0000000..2f3bad9
--- /dev/null
+++ b/SOURCES/python-encode.patch
@@ -0,0 +1,12 @@
+diff -up firefox-68.0/python/mozbuild/mozbuild/controller/building.py.old firefox-68.0/python/mozbuild/mozbuild/controller/building.py
+--- firefox-68.0/python/mozbuild/mozbuild/controller/building.py.old	2019-05-29 10:46:55.403262995 +0200
++++ firefox-68.0/python/mozbuild/mozbuild/controller/building.py	2019-05-29 10:47:42.691176970 +0200
+@@ -571,7 +571,7 @@ class TerminalLoggingHandler(logging.Han
+             if self.footer:
+                 self.footer.clear()
+ 
+-            self.fh.write(msg)
++            self.fh.write(msg.encode("utf-8"))
+             self.fh.write('\n')
+ 
+             if self.footer:
diff --git a/SOURCES/python-missing-utimensat.patch b/SOURCES/python-missing-utimensat.patch
new file mode 100644
index 0000000..d19ecab
--- /dev/null
+++ b/SOURCES/python-missing-utimensat.patch
@@ -0,0 +1,12 @@
+diff -up python3/Python-3.6.8/configure.old python3/Python-3.6.8/configure
+--- Python-3.6.8/configure.old	2019-10-01 12:56:35.074551835 +0200
++++ Python-3.6.8/configure	2019-10-01 12:56:44.240517798 +0200
+@@ -11438,7 +11438,7 @@ for ac_func in alarm accept4 setitimer g
+  sigaction sigaltstack siginterrupt sigpending sigrelse \
+  sigtimedwait sigwait sigwaitinfo snprintf strftime strlcpy symlinkat sync \
+  sysconf tcgetpgrp tcsetpgrp tempnam timegm times tmpfile tmpnam tmpnam_r \
+- truncate uname unlinkat unsetenv utimensat utimes waitid waitpid wait3 wait4 \
++ truncate uname unlinkat unsetenv utimes waitid waitpid wait3 wait4 \
+  wcscoll wcsftime wcsxfrm wmemcmp writev _getpty
+ do :
+   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
diff --git a/SOURCES/rhbz-1173156.patch b/SOURCES/rhbz-1173156.patch
new file mode 100644
index 0000000..c35d901
--- /dev/null
+++ b/SOURCES/rhbz-1173156.patch
@@ -0,0 +1,12 @@
+diff -up firefox-60.5.0/extensions/auth/nsAuthSambaNTLM.cpp.rhbz-1173156 firefox-60.5.0/extensions/auth/nsAuthSambaNTLM.cpp
+--- firefox-60.5.0/extensions/auth/nsAuthSambaNTLM.cpp.rhbz-1173156	2019-01-22 10:36:09.284069020 +0100
++++ firefox-60.5.0/extensions/auth/nsAuthSambaNTLM.cpp	2019-01-22 10:37:12.669757744 +0100
+@@ -161,7 +161,7 @@ nsresult nsAuthSambaNTLM::SpawnNTLMAuthH
+   const char* username = PR_GetEnv("USER");
+   if (!username) return NS_ERROR_FAILURE;
+ 
+-  const char* const args[] = {"ntlm_auth",
++  const char* const args[] = {"/usr/bin/ntlm_auth",
+                               "--helper-protocol",
+                               "ntlmssp-client-1",
+                               "--use-cached-creds",
diff --git a/SOURCES/rhbz-1821418.patch b/SOURCES/rhbz-1821418.patch
new file mode 100644
index 0000000..588084c
--- /dev/null
+++ b/SOURCES/rhbz-1821418.patch
@@ -0,0 +1,37 @@
+diff -up firefox-68.7.0/xpcom/base/AvailableMemoryTracker.cpp.rhbz-1821418 firefox-68.7.0/xpcom/base/AvailableMemoryTracker.cpp
+--- firefox-68.7.0/xpcom/base/AvailableMemoryTracker.cpp.rhbz-1821418	2020-04-03 21:30:08.000000000 +0200
++++ firefox-68.7.0/xpcom/base/AvailableMemoryTracker.cpp	2020-04-23 21:15:56.015491502 +0200
+@@ -147,8 +147,12 @@ bool nsAvailableMemoryWatcher::IsVirtual
+ 
+ /* static */
+ bool nsAvailableMemoryWatcher::IsCommitSpaceLow(const MEMORYSTATUSEX& aStat) {
+-  if ((kLowCommitSpaceThreshold != 0) &&
+-      (aStat.ullAvailPageFile < kLowCommitSpaceThreshold)) {
++  const char* threshold = getenv("MOZ_GC_THRESHOLD");
++  if (threshold) {
++    kLowCommitSpaceThreshold = atoi(threshold);
++  }
++
++  if ((kLowCommitSpaceThreshold == 0) || (aStat.ullAvailPageFile < kLowCommitSpaceThreshold)) {
+     sNumLowCommitSpaceEvents++;
+     CrashReporter::AnnotateCrashReport(
+         CrashReporter::Annotation::LowCommitSpaceEvents,
+@@ -206,13 +210,16 @@ void nsAvailableMemoryWatcher::AdjustPol
+ // polling interval accordingly.
+ NS_IMETHODIMP
+ nsAvailableMemoryWatcher::Notify(nsITimer* aTimer) {
++  const char* threshold = getenv("MOZ_GC_THRESHOLD");
++  bool forceLowMem = (threshold && atoi(threshold) == 0);
++
+   MEMORYSTATUSEX stat;
+   stat.dwLength = sizeof(stat);
+   bool success = GlobalMemoryStatusEx(&stat);
+ 
+-  if (success) {
++  if (success || forceLowMem) {
+     bool lowMemory = IsVirtualMemoryLow(stat) || IsCommitSpaceLow(stat) ||
+-                     IsPhysicalMemoryLow(stat);
++                     IsPhysicalMemoryLow(stat) || forceLowMem;
+ 
+     if (lowMemory) {
+       SendMemoryPressureEvent();
diff --git a/SOURCES/rust-network-check.patch b/SOURCES/rust-network-check.patch
new file mode 100644
index 0000000..d18f2fe
--- /dev/null
+++ b/SOURCES/rust-network-check.patch
@@ -0,0 +1,105 @@
+diff -up firefox-68.0/config/makefiles/rust.mk.rust-network-check firefox-68.0/config/makefiles/rust.mk
+--- firefox-68.0/config/makefiles/rust.mk.rust-network-check	2019-06-06 10:29:18.984737603 +0200
++++ firefox-68.0/config/makefiles/rust.mk	2019-06-06 11:39:51.581028835 +0200
+@@ -127,7 +127,7 @@ export RUST_BACKTRACE=full
+ export MOZ_TOPOBJDIR=$(topobjdir)
+ 
+ target_rust_ltoable := force-cargo-library-build
+-target_rust_nonltoable := force-cargo-test-run force-cargo-library-check $(foreach b,build check,force-cargo-program-$(b))
++target_rust_nonltoable := force-cargo-test-run $(foreach b,build check,force-cargo-program-$(b))
+ 
+ $(target_rust_ltoable): RUSTFLAGS:=$(rustflags_override) $(RUSTFLAGS) $(if $(MOZ_LTO_RUST),-Clinker-plugin-lto)
+ $(target_rust_nonltoable): RUSTFLAGS:=$(rustflags_override) $(RUSTFLAGS)
+@@ -238,19 +238,9 @@ force-cargo-library-build:
+ 	$(call CARGO_BUILD) --lib $(cargo_target_flag) $(rust_features_flag) -- $(cargo_rustc_flags)
+ 
+ $(RUST_LIBRARY_FILE): force-cargo-library-build
+-# When we are building in --enable-release mode; we add an additional check to confirm
+-# that we are not importing any networking-related functions in rust code. This reduces
+-# the chance of proxy bypasses originating from rust code.
+-ifndef DEVELOPER_OPTIONS
+-ifndef MOZ_DEBUG_RUST
+-ifeq ($(OS_ARCH), Linux)
+-	$(call py_action,check_binary,--target --networking $@)
+-endif
+-endif
+-endif
+ 
+ force-cargo-library-check:
+-	$(call CARGO_CHECK) --lib $(cargo_target_flag) $(rust_features_flag)
++	@true
+ else
+ force-cargo-library-check:
+ 	@true
+diff -up firefox-68.0/python/mozbuild/mozbuild/action/check_binary.py.rust-network-check firefox-68.0/python/mozbuild/mozbuild/action/check_binary.py
+--- firefox-68.0/python/mozbuild/mozbuild/action/check_binary.py.rust-network-check	2019-05-20 18:17:57.000000000 +0200
++++ firefox-68.0/python/mozbuild/mozbuild/action/check_binary.py	2019-06-06 10:29:18.986737599 +0200
+@@ -250,43 +250,6 @@ def check_mozglue_order(target, binary):
+         raise RuntimeError('Could not parse readelf output?')
+ 
+ 
+-def check_networking(binary):
+-    retcode = 0
+-    networking_functions = set([
+-        # socketpair is not concerning; it is restricted to AF_UNIX
+-        "socket", "connect", "accept", "bind", "listen",
+-        "getsockname", "getsockopt", "setsockopt",
+-        "recv", "recvfrom",
+-        "send", "sendto",
+-        # We would be concerned by recvmsg and sendmsg; but we believe
+-        # they are okay as documented in 1376621#c23
+-        "gethostbyname", "gethostbyaddr", "gethostent", "sethostent", "endhostent",
+-        "gethostent_r", "gethostbyname2", "gethostbyaddr_r", "gethostbyname_r",
+-        "gethostbyname2_r",
+-        "getaddrinfo", "getservent", "getservbyname", "getservbyport", "setservent",
+-        "getprotoent", "getprotobyname", "getprotobynumber", "setprotoent",
+-        "endprotoent"])
+-    bad_occurences_names = set()
+-
+-    try:
+-        for sym in at_least_one(iter_symbols(binary)):
+-            if sym['addr'] == 0 and sym['name'] in networking_functions:
+-                bad_occurences_names.add(sym['name'])
+-    except Empty:
+-        raise RuntimeError('Could not parse llvm-objdump output?')
+-
+-    basename = os.path.basename(binary)
+-    if bad_occurences_names:
+-        s = 'TEST-UNEXPECTED-FAIL | check_networking | {} | Identified {} ' + \
+-            'networking function(s) being imported in the rust static library ({})'
+-        print(s.format(basename, len(bad_occurences_names),
+-            ",".join(sorted(bad_occurences_names))),
+-            file=sys.stderr)
+-        retcode = 1
+-    elif buildconfig.substs.get('MOZ_AUTOMATION'):
+-        print('TEST-PASS | check_networking | {}'.format(basename))
+-    return retcode
+-
+ def checks(target, binary):
+     # The clang-plugin is built as target but is really a host binary.
+     # Cheat and pretend we were passed the right argument.
+@@ -330,8 +293,6 @@ def main(args):
+                         help='Perform checks for a host binary')
+     parser.add_argument('--target', action='store_true',
+                         help='Perform checks for a target binary')
+-    parser.add_argument('--networking', action='store_true',
+-                        help='Perform checks for networking functions')
+ 
+     parser.add_argument('binary', metavar='PATH',
+                         help='Location of the binary to check')
+@@ -343,14 +304,7 @@ def main(args):
+               file=sys.stderr)
+         return 1
+ 
+-    if options.networking and options.host:
+-        print('--networking is only valid with --target',
+-               file=sys.stderr)
+-        return 1
+-
+-    if options.networking:
+-        return check_networking(options.binary)
+-    elif options.host:
++    if options.host:
+         return checks(HOST, options.binary)
+     elif options.target:
+         return checks(TARGET, options.binary)
diff --git a/SPECS/firefox.spec b/SPECS/firefox.spec
new file mode 100644
index 0000000..6ab0762
--- /dev/null
+++ b/SPECS/firefox.spec
@@ -0,0 +1,1643 @@
+# Set for local builds only
+%global disable_toolsets  0
+
+# Use system nspr/nss? FIXME
+%if 0%{?rhel} == 8
+%global system_nss        1
+%endif
+%if 0%{?rhel} == 7
+%global system_nss        1
+%endif
+%if 0%{?rhel} == 6
+%global system_nss        1
+%endif
+%define use_bundled_ffi   0
+%if 0%{?rhel} == 8
+%define use_bundled_python_2 1
+%define use_bundled_python_3 0
+%else
+%define use_bundled_python_2 1
+%define use_bundled_python_3 1
+%endif
+%define bundle_gnome_extension 0
+
+# Don't use system hunspell for now
+%global system_hunspell   0
+%global system_sqlite     0
+%if 0%{?rhel} == 8
+%global use_llvmts        0
+%else
+%global use_llvmts        1
+%endif
+
+%if 0%{?rhel} > 6
+%global system_ffi        1
+%else
+%global system_ffi        0
+%endif
+%if 0%{?rhel} < 8
+%global use_dts           1
+%endif
+
+%global use_rustts        1
+%global dts_version       8
+%if 0%{?rhel} == 6
+%global dts_version       8
+%endif
+%global rust_version         1.31
+%global rust_toolset_version 1.35
+%global llvm_version      7.0
+%if 0%{?rhel} == 8
+%global llvm_version      6.0
+%endif
+
+%if 0%{?disable_toolsets}
+%global use_rustts        0
+%global use_dts           0
+%global use_llvmts        0
+%endif
+
+# Use system cairo?
+%global system_cairo      0
+
+# Use system libvpx?
+%global system_libvpx     0
+
+# Use system libicu?
+%global system_libicu     0
+
+# Big endian platforms
+%ifarch ppc64 s390x
+# Javascript Intl API is not supported on big endian platforms right now:
+# https://bugzilla.mozilla.org/show_bug.cgi?id=1322212
+%global big_endian        1
+%endif
+
+# Hardened build?
+%global hardened_build    1
+
+%global system_jpeg       1
+
+%ifarch %{ix86} x86_64
+%global run_tests         0
+%else
+%global run_tests         0
+%endif
+
+# Build as a debug package?
+%global debug_build       0
+
+%global default_bookmarks_file  %{_datadir}/bookmarks/default-bookmarks.html
+%global firefox_app_id  \{ec8030f7-c20a-464f-9b0e-13a3a9e97384\}
+# Minimal required versions
+%global cairo_version 1.13.1
+%global freetype_version 2.1.9
+%if %{?system_libvpx}
+%global libvpx_version 1.4.0
+%endif
+
+%global rhel_minor_version -1
+%if "%{?dist}" == "el8"
+%global rhel_minor_version 3
+%endif
+%if "%{?dist}" == ".el8_2"
+%global rhel_minor_version 2
+%endif
+%if "%{?dist}" == ".el8_1"
+%global rhel_minor_version 1
+%endif
+%if "%{?dist}" == ".el8_0"
+%global rhel_minor_version 0
+%endif
+
+
+%if 0%{?system_nss}
+%global nspr_version 4.21
+# NSS/NSPR quite often ends in build override, so as requirement the version
+# we're building against could bring us some broken dependencies from time to time.
+#%global nspr_build_version %(pkg-config --silence-errors --modversion nspr 2>/dev/null || echo 65536)
+%global nspr_build_version %{nspr_version}
+%global nss_version 3.44
+#%global nss_build_version %(pkg-config --silence-errors --modversion nss 2>/dev/null || echo 65536)
+%global nss_build_version %{nss_version}
+%endif
+
+%if %{?system_sqlite}
+%global sqlite_version 3.8.4.2
+# The actual sqlite version (see #480989):
+%global sqlite_build_version %(pkg-config --silence-errors --modversion sqlite3 2>/dev/null || echo 65536)
+%endif
+
+%define bundled_python_version_2 2.7.13
+%define bundled_python_version_3 3.6.8
+%define use_bundled_yasm        1
+%define use_bundled_openssl     0
+%define use_bundled_nodejs      0
+%if 0%{?rhel} < 8
+%define use_bundled_nodejs      1
+%if 0%{?rhel} == 6
+%define use_bundled_openssl     1
+%endif
+%endif
+
+# GTK3 bundling
+%define avoid_bundled_rebuild   0
+%if 0%{?rhel} == 6
+%define bundle_gtk3             1
+# In-tree libffi is able to build on following platforms, we have to bundle it for the rest
+%ifnarch x86_64 i686 aarch64
+%define use_bundled_ffi         1
+%endif
+%endif
+
+%define gtk3_nvr 3.22.26-1
+%define gtk3_install_path %{mozappdir}/bundled
+
+%if 0%{?bundle_gtk3}
+# We could use %%include, but in %%files, %%post and other sections, but in these
+# sections it could lead to syntax errors about unclosed %%if. Work around it by
+# using the following macro
+%define include_file() %{expand:%(cat '%1')}
+%endif
+
+
+%global mozappdir     %{_libdir}/%{name}
+%global mozappdirdev  %{_libdir}/%{name}-devel-%{version}
+%global langpackdir   %{mozappdir}/distribution/extensions
+%global tarballdir    %{name}-%{version}
+%global pre_version   esr
+#global pre_tag       alpha
+
+%global official_branding       1
+%global build_langpacks         1
+
+%global enable_mozilla_crashreporter       0
+%if !%{debug_build}
+%ifarch %{ix86} x86_64
+%global enable_mozilla_crashreporter       0
+%endif
+%endif
+
+Summary:        Mozilla Firefox Web browser
+Name:           firefox
+Version:        68.9.0
+Release:        1%{?dist}
+URL:            https://www.mozilla.org/firefox/
+License:        MPLv1.1 or GPLv2+ or LGPLv2+
+%if 0%{?rhel} == 7
+ExcludeArch:    s390 ppc
+%endif
+%if 0%{?rhel} == 6
+ExclusiveArch:  i686 x86_64 ppc64 s390x
+%endif
+
+Source0:        https://hg.mozilla.org/releases/mozilla-release/archive/firefox-%{version}%{?pre_version}.source.tar.xz
+%if %{build_langpacks}
+Source1:        firefox-langpacks-%{version}%{?pre_version}-20200529.tar.xz
+%endif
+Source2:        cbindgen-vendor.tar.xz
+Source10:       firefox-mozconfig
+%if 0%{?centos}
+Source12:       firefox-centos-default-prefs.js
+%else
+Source12:       firefox-redhat-default-prefs.js
+%endif
+Source20:       firefox.desktop
+Source21:       firefox.sh.in
+Source23:       firefox.1
+Source24:       mozilla-api-key
+Source25:       firefox-symbolic.svg
+Source26:       distribution.ini
+Source27:       google-api-key
+Source28:       node-stdout-nonblocking-wrapper
+
+Source200:      gtk3-private-%{gtk3_nvr}.el6.src.rpm
+Source201:      gtk3-private-%{gtk3_nvr}-post.inc
+Source202:      gtk3-private-%{gtk3_nvr}-postun.inc
+Source203:      gtk3-private-%{gtk3_nvr}-posttrans.inc
+Source204:      gtk3-private-%{gtk3_nvr}-files.inc
+Source205:      gtk3-private-%{gtk3_nvr}-setup-flags-env.inc
+Source206:      gtk3-private-%{gtk3_nvr}-requires-provides-filter.inc
+Source301:      yasm-1.2.0-3.el5.src.rpm
+Source303:      libffi-3.0.13-18.el7_3.src.rpm
+Source304:      nodejs-8.11.4-1.3.fc27.src.rpm
+Source305:      openssl-1.0.2k-19.6.bundle.el7_7.src.rpm
+
+#Python
+%if 0%{?use_bundled_python_2}
+Source100:      https://www.python.org/ftp/python/%{bundled_python_version_2}/Python-%{bundled_python_version_2}.tar.xz
+%endif
+%if 0%{?use_bundled_python_3}
+Source101:      https://www.python.org/ftp/python/%{bundled_python_version_3}/Python-%{bundled_python_version_3}.tar.xz
+%endif
+# Build patches
+Patch1000:      python-2.7.patch
+Patch1001:      build-ppc64le-inline.patch
+Patch1002:      python-2.7-gcc8-fix.patch
+Patch1003:      python-missing-utimensat.patch
+Patch1004:      build-icu-make.patch
+# workaround for https://bugzilla.redhat.com/show_bug.cgi?id=1699374
+Patch1:         no-rust-lto.patch
+Patch2:         rust-network-check.patch
+Patch4:         build-mozconfig-fix.patch
+Patch6:         build-nss-version.patch
+Patch7:         firefox-debugedits-error.patch
+Patch8:         firefox-dont-check-binary.patch
+Patch9:         nss-build-mozilla-1564499.patch
+Patch26:        build-icu-big-endian.patch
+Patch41:        build-debug-qcms.patch
+
+# Fedora/RHEL specific patches
+Patch215:        firefox-enable-addons.patch
+Patch219:        rhbz-1173156.patch
+Patch224:        mozilla-1170092.patch
+#ARM run-time patch
+#Patch226:        rhbz-1354671.patch
+Patch231:        firefox-pipewire.patch
+Patch232:        firefox-rhel6-hugepage.patch
+Patch233:        firefox-rhel6-nss-tls1.3.patch
+Patch234:        rhbz-1821418.patch
+Patch235:        firefox-pipewire-0-3.patch
+
+# Upstream patches
+Patch402:        mozilla-1196777.patch
+
+#Patch500:        debug.patch
+Patch501:        python-encode.patch
+Patch502:        mozilla-1603112-accept-lang.patch
+Patch503:        mozilla-s390-context.patch
+Patch504:        mozilla-nestegg-big-endian.patch
+Patch505:        mozilla-bmo1005535.patch
+Patch506:        mozilla-bmo1504834-part1.patch
+Patch507:        mozilla-bmo1504834-part2.patch
+Patch508:        mozilla-bmo1504834-part3.patch
+Patch509:        mozilla-bmo1504834-part4.patch
+Patch510:        mozilla-bmo1554971.patch
+Patch511:        mozilla-bmo1602730.patch
+Patch512:        mozilla-bmo849632.patch
+
+# CentOS patches
+%if 0%{?centos}
+Patch10000:      Bug-1238661---fix-mozillaSignalTrampoline-to-work-.patch
+Patch10001:      Bug-1526653---fix_user_vfp_armv7.patch
+%endif
+
+%if %{?system_nss}
+BuildRequires:  pkgconfig(nspr) >= %{nspr_version}
+BuildRequires:  pkgconfig(nss) >= %{nss_version}
+BuildRequires:  nss-static >= %{nss_version}
+%endif
+%if %{?system_cairo}
+BuildRequires:  pkgconfig(cairo) >= %{cairo_version}
+%endif
+BuildRequires:  pkgconfig(libpng)
+BuildRequires:  xz
+BuildRequires:  libXt-devel
+BuildRequires:  mesa-libGL-devel
+Requires:       liberation-fonts-common
+Requires:       liberation-sans-fonts
+%if %{?system_jpeg}
+BuildRequires:  libjpeg-devel
+%endif
+BuildRequires:  zip
+BuildRequires:  bzip2-devel
+BuildRequires:  pkgconfig(zlib)
+BuildRequires:  pkgconfig(libIDL-2.0)
+BuildRequires:  pkgconfig(gtk+-2.0)
+BuildRequires:  krb5-devel
+BuildRequires:  pkgconfig(pango)
+BuildRequires:  pkgconfig(freetype2) >= %{freetype_version}
+BuildRequires:  pkgconfig(xt)
+BuildRequires:  pkgconfig(xrender)
+%if %{?system_hunspell}
+BuildRequires:  hunspell-devel
+%endif
+BuildRequires:  pkgconfig(libstartup-notification-1.0)
+BuildRequires:  pkgconfig(libnotify)
+BuildRequires:  pkgconfig(dri)
+BuildRequires:  pkgconfig(libcurl)
+BuildRequires:  dbus-glib-devel
+%if %{?system_libvpx}
+BuildRequires:  libvpx-devel >= %{libvpx_version}
+%endif
+BuildRequires:  autoconf213
+BuildRequires:  pkgconfig(libpulse)
+BuildRequires:  pkgconfig(gconf-2.0)
+
+%if 0%{?use_dts}
+BuildRequires:  devtoolset-%{dts_version}-gcc-c++
+BuildRequires:  devtoolset-%{dts_version}-gcc
+BuildRequires:  devtoolset-%{dts_version}-binutils
+BuildRequires:  devtoolset-%{dts_version}-libatomic-devel
+%if 0%{?use_llvmts}
+BuildRequires:  llvm-toolset-%{llvm_version}
+BuildRequires:  llvm-toolset-%{llvm_version}-llvm-devel
+%endif
+%endif
+
+BuildRequires:  scl-utils
+
+
+%if 0%{?rhel} == 8
+BuildRequires:  cargo
+BuildRequires:  rust >= %{rust_version}
+BuildRequires:  llvm >= %{llvm_version}
+BuildRequires:  llvm-devel >= %{llvm_version}
+BuildRequires:  clang >= %{llvm_version}
+BuildRequires:  clang-devel >= %{llvm_version}
+BuildRequires:  rustfmt >= %{rust_version}
+BuildRequires:  python3
+BuildRequires:  nodejs >= 8.11
+%else
+%if 0%{?use_rustts}
+BuildRequires:  rust-toolset-%{rust_toolset_version}
+%endif
+%if 0%{?use_llvmts}
+BuildRequires:  llvm-toolset-%{llvm_version}
+BuildRequires:  llvm-toolset-%{llvm_version}-llvm-devel
+%endif
+%endif
+
+%if 0%{?use_bundled_python_2}
+# Needed for Python in RHEL6
+BuildRequires:  openssl-devel
+%endif
+
+%if 0%{?rhel} == 8
+BuildRequires:  pipewire-devel
+%endif
+
+%if 0%{?bundle_gtk3}
+BuildRequires:        automake
+BuildRequires:        autoconf
+BuildRequires:        cups-devel
+BuildRequires:        dbus-devel
+BuildRequires:        desktop-file-utils
+BuildRequires:        expat-devel
+BuildRequires:        fontpackages-devel
+BuildRequires:        gamin-devel
+BuildRequires:        gettext-devel
+BuildRequires:        git
+BuildRequires:        intltool
+BuildRequires:        jasper-devel
+BuildRequires:        libepoxy-devel
+BuildRequires:        libcroco-devel
+BuildRequires:        libffi-devel
+BuildRequires:        libpng-devel
+BuildRequires:        libtiff-devel
+BuildRequires:        libtool
+BuildRequires:        libxml2-devel
+BuildRequires:        libX11-devel
+BuildRequires:        libXcomposite-devel
+BuildRequires:        libXcursor-devel
+BuildRequires:        libXinerama-devel
+BuildRequires:        libXevie-devel
+BuildRequires:        libXrandr-devel
+BuildRequires:        libXrender-devel
+BuildRequires:        libXtst-devel
+BuildRequires:        mesa-libGL-devel
+BuildRequires:        mesa-libEGL-devel
+BuildRequires:        pixman-devel
+BuildRequires:        rest-devel
+BuildRequires:        readline-devel
+# TODO: We miss that dependency in our bundled gtk3 package.
+# As a hotfix we put it here and fix gtk3 in next release.
+Requires:             mesa-libEGL%{?_isa}
+Requires:             libcroco%{?_isa}
+Requires:             mesa-libGL%{?_isa}
+Requires:             bzip2-libs%{?_isa}
+Requires:             libXtst%{?_isa}
+%else
+BuildRequires:        gtk3-devel
+BuildRequires:        glib2-devel
+%endif
+
+Requires:       mozilla-filesystem
+Requires:       p11-kit-trust
+%if %{?system_nss}
+Requires:       nspr >= %{nspr_build_version}
+Requires:       nss >= %{nss_build_version}
+%endif
+
+BuildRequires:  desktop-file-utils
+BuildRequires:  system-bookmarks
+Requires:       redhat-indexhtml
+%if %{?system_sqlite}
+BuildRequires:  pkgconfig(sqlite3) >= %{sqlite_version}
+Requires:       sqlite >= %{sqlite_build_version}
+%endif
+
+
+%if %{?run_tests}
+BuildRequires:  xorg-x11-server-Xvfb
+%endif
+
+%if %{?system_ffi}
+  %if !%{use_bundled_ffi}0
+BuildRequires:  pkgconfig(libffi)
+  %endif
+%endif
+
+Obsoletes:      mozilla <= 37:1.7.13
+Provides:       webclient
+
+%description
+Mozilla Firefox is an open-source web browser, designed for standards
+compliance, performance and portability.
+
+%if %{enable_mozilla_crashreporter}
+%global moz_debug_prefix %{_prefix}/lib/debug
+%global moz_debug_dir %{moz_debug_prefix}%{mozappdir}
+%global uname_m %(uname -m)
+%global symbols_file_name %{name}-%{version}.en-US.%{_os}-%{uname_m}.crashreporter-symbols.zip
+%global symbols_file_path %{moz_debug_dir}/%{symbols_file_name}
+%global _find_debuginfo_opts -p %{symbols_file_path} -o debugcrashreporter.list
+%global crashreporter_pkg_name mozilla-crashreporter-%{name}-debuginfo
+%package -n %{crashreporter_pkg_name}
+Summary: Debugging symbols used by Mozilla's crash reporter servers
+%description -n %{crashreporter_pkg_name}
+This package provides debug information for Firefox, for use by
+Mozilla's crash reporter servers.  If you are trying to locally
+debug %{name}, you want to install %{name}-debuginfo instead.
+%files -n %{crashreporter_pkg_name} -f debugcrashreporter.list
+%endif
+
+%if %{run_tests}
+%global testsuite_pkg_name mozilla-%{name}-testresults
+%package -n %{testsuite_pkg_name}
+Summary: Results of testsuite
+%description -n %{testsuite_pkg_name}
+This package contains results of tests executed during build.
+%files -n %{testsuite_pkg_name}
+/test_results
+%endif
+
+#---------------------------------------------------------------------
+
+%if %{?bundle_gnome_extension}
+%package        -n firefox-gnome-shell-extension
+%global         firefox_gnome_shell_addon_name addon-751081-latest.xpi
+Summary:        Support for managing GNOME Shell Extensions through web browsers
+Requires:       %{name}%{?_isa} = %{version}-%{release}
+
+License:        GPLv3+
+URL:            https://wiki.gnome.org/Projects/GnomeShellIntegrationForChrome
+Source2:        https://addons.mozilla.org/firefox/downloads/latest/gnome-shell-integration/platform:2/%{firefox_gnome_shell_addon_name}
+
+Requires:       dbus
+Requires:       gnome-icon-theme
+Requires:       gnome-shell
+Requires:       hicolor-icon-theme
+Requires:       mozilla-filesystem
+
+%description -n firefox-gnome-shell-extension
+Browser extension for Firefox and native host messaging connector that provides
+integration with GNOME Shell and the corresponding extensions repository
+https://extensions.gnome.org.
+
+%files -n firefox-gnome-shell-extension
+%{mozappdir}/distribution/extensions/chrome-gnome-shell@gnome.org.xpi
+%endif
+
+%prep
+%if 0%{?use_bundled_python_2}
+%setup -q -T -c -n python2 -a 100
+%patch1000 -p0 -b .build
+%patch1002 -p0 -b .gcc8
+%endif
+%if 0%{?use_bundled_python_3}
+%setup -q -T -c -n python3 -a 101
+%if 0%{?rhel} == 6
+%patch1003 -p0 -b .missing-utimensat.patch
+%endif
+%endif
+%setup -q -n %{tarballdir}
+# Build patches, can't change backup suffix from default because during build
+# there is a compare of config and js/config directories and .orig suffix is
+# ignored during this compare.
+%patch1 -p1 -b .no-rust-lto
+%patch2 -p1 -b .rust-network-check
+%patch7 -p1 -b .debugedits-error
+%ifarch %{ix86} %{arm} ppc
+# binary check fails OOM on 32bit arches
+%patch8 -p1 -b .dont-check-binary
+%endif
+%patch9 -p1 -b .nss-build-mozilla-1564499
+
+%if %{?debug_build}
+%patch41 -p1 -b .build-debug-qcms
+%endif
+#%if 0%{?rhel} == 8
+#%endif
+
+%patch4  -p1 -b .build-mozconfig-fix
+%patch6  -p1 -b .nss-version
+
+# Fedora patches
+%patch215 -p1 -b .addons
+%patch219 -p1 -b .rhbz-1173156
+%patch224 -p1 -b .1170092
+%if 0%{?rhel} == 8
+  %if 0%{?rhel_minor_version} >= 3
+%patch235 -p1 -b .pipewire-0-3
+  %else
+%patch231 -p1 -b .pipewire
+  %endif
+%endif
+%if 0%{?rhel} == 6
+%patch232 -p1 -b .hugepage
+%patch233 -p1 -b .rhel6-nss-tls1.3
+%endif
+%patch234 -p1 -b .rhbz-1821418
+
+#ARM run-time patch
+#%ifarch aarch64
+#%patch226 -p1 -b .1354671
+#%endif
+
+%patch402 -p1 -b .1196777
+
+# Patch for big endian platforms only
+%if 0%{?big_endian}
+%patch26 -p1 -b .icu
+%endif
+
+#%patch500 -p1 -b .debug
+%patch501 -p1 -b .python-encode
+%patch502 -p1 -b .1603112-accept-lang
+%patch503 -p1 -b .mozilla-s390-context
+%patch504 -p1 -b .mozilla-nestegg-big-endian
+%patch505 -p1 -b .mozilla-bmo1005535
+%patch506 -p1 -b .mozilla-bmo1504834-part1
+%patch507 -p1 -b .mozilla-bmo1504834-part2
+%patch508 -p1 -b .mozilla-bmo1504834-part3
+%patch509 -p1 -b .mozilla-bmo1504834-part4
+%patch510 -p1 -b .mozilla-bmo1554971
+%patch511 -p1 -b .mozilla-bmo1602730
+%patch512 -p1 -b .mozilla-bmo849632
+%patch1001 -p1 -b .ppc64le-inline
+%patch1004 -p1 -b .icu-make
+
+# CentOS patches
+%if 0%{?centos}
+%patch10000 -p1 -b .mozilla-1238661
+%patch10001 -p1 -b .mozilla-1526653
+%endif
+
+%{__rm} -f .mozconfig
+%{__cp} %{SOURCE10} .mozconfig
+%if %{official_branding}
+echo "ac_add_options --enable-official-branding" >> .mozconfig
+%endif
+%{__cp} %{SOURCE24} mozilla-api-key
+%{__cp} %{SOURCE27} google-api-key
+
+%if %{?system_nss}
+echo "ac_add_options --with-system-nspr" >> .mozconfig
+echo "ac_add_options --with-system-nss" >> .mozconfig
+%else
+echo "ac_add_options --without-system-nspr" >> .mozconfig
+echo "ac_add_options --without-system-nss" >> .mozconfig
+%endif
+
+%if %{?system_sqlite}
+echo "ac_add_options --enable-system-sqlite" >> .mozconfig
+%else
+echo "ac_add_options --disable-system-sqlite" >> .mozconfig
+%endif
+
+%if %{?system_cairo}
+echo "ac_add_options --enable-system-cairo" >> .mozconfig
+%else
+echo "ac_add_options --disable-system-cairo" >> .mozconfig
+%endif
+
+%if 0%{?use_bundled_ffi}
+echo "ac_add_options --enable-system-ffi" >> .mozconfig
+%endif
+%if 0%{?system_ffi}
+echo "ac_add_options --enable-system-ffi" >> .mozconfig
+%endif
+
+%ifarch %{arm} %{ix86} x86_64
+echo "ac_add_options --disable-elf-hack" >> .mozconfig
+%endif
+
+%if %{?system_hunspell}
+echo "ac_add_options --enable-system-hunspell" >> .mozconfig
+%else
+# not available?
+#echo "ac_add_options --disable-system-hunspell" >> .mozconfig
+%endif
+
+%if %{?debug_build}
+echo "ac_add_options --enable-debug" >> .mozconfig
+echo "ac_add_options --disable-optimize" >> .mozconfig
+%else
+%global optimize_flags "-g -O2"
+%ifarch s390 s390x
+%global optimize_flags "-g -O1"
+%endif
+%ifarch armv7hl
+# ARMv7 need that (rhbz#1426850)
+%global optimize_flags "-g -O2 -fno-schedule-insns"
+%endif
+%ifarch ppc64le aarch64
+%global optimize_flags "-g -O2"
+%endif
+%if %{optimize_flags} != "none"
+echo 'ac_add_options --enable-optimize=%{?optimize_flags}' >> .mozconfig
+%else
+echo 'ac_add_options --enable-optimize' >> .mozconfig
+%endif
+echo "ac_add_options --disable-debug" >> .mozconfig
+%endif
+
+# Second arches fail to start with jemalloc enabled
+%ifnarch %{ix86} x86_64
+echo "ac_add_options --disable-jemalloc" >> .mozconfig
+%endif
+
+%ifnarch %{ix86} x86_64
+echo "ac_add_options --disable-webrtc" >> .mozconfig
+%endif
+
+%if !%{enable_mozilla_crashreporter}
+echo "ac_add_options --disable-crashreporter" >> .mozconfig
+%endif
+
+%if %{?run_tests}
+echo "ac_add_options --enable-tests" >> .mozconfig
+%endif
+
+%if !%{?system_jpeg}
+echo "ac_add_options --without-system-jpeg" >> .mozconfig
+%else
+echo "ac_add_options --with-system-jpeg" >> .mozconfig
+%endif
+
+%if %{?system_libvpx}
+echo "ac_add_options --with-system-libvpx" >> .mozconfig
+%else
+echo "ac_add_options --without-system-libvpx" >> .mozconfig
+%endif
+
+%if %{?system_libicu}
+echo "ac_add_options --with-system-icu" >> .mozconfig
+%else
+echo "ac_add_options --without-system-icu" >> .mozconfig
+%endif
+%ifarch s390 s390x
+echo "ac_add_options --disable-ion" >> .mozconfig
+%endif
+
+echo 'export NODEJS="%{_buildrootdir}/bin/node-stdout-nonblocking-wrapper"' >> .mozconfig
+
+# Remove executable bit to make brp-mangle-shebangs happy.
+chmod -x third_party/rust/itertools/src/lib.rs
+
+#---------------------------------------------------------------------
+
+%build
+set -e
+# Hack for missing shell when building in brew on RHEL6
+%if 0%{?rhel} == 6
+export SHELL=/bin/sh
+%endif
+
+%if ! 0%{?avoid_bundled_rebuild}
+    rm -rf %{_buildrootdir}/*
+%endif
+export PATH="%{_buildrootdir}/bin:$PATH"
+
+function install_rpms_to_current_dir() {
+    PACKAGE_RPM=$(eval echo $1)
+    PACKAGE_DIR=%{_rpmdir}
+
+    if [ ! -f $PACKAGE_DIR/$PACKAGE_RPM ]; then
+        # Hack for tps tests
+        ARCH_STR=%{_arch}
+        %ifarch i386 i686
+            ARCH_STR="i?86"
+        %endif
+        PACKAGE_DIR="$PACKAGE_DIR/$ARCH_STR"
+     fi
+
+     for package in $(ls $PACKAGE_DIR/$PACKAGE_RPM)
+     do
+         echo "$package"
+         rpm2cpio "$package" | cpio -idu
+     done
+}
+
+function build_bundled_package() {
+  PACKAGE_RPM=$1
+  PACKAGE_FILES=$2
+  PACKAGE_SOURCE=$3
+  export PACKAGE_DIR="%{_topdir}/RPMS"
+
+  PACKAGE_ALREADY_BUILD=0
+  %if %{?avoid_bundled_rebuild}
+    if ls $PACKAGE_DIR/$PACKAGE_RPM; then
+      PACKAGE_ALREADY_BUILD=1
+    fi
+    if ls $PACKAGE_DIR/%{_arch}/$PACKAGE_RPM; then
+      PACKAGE_ALREADY_BUILD=1
+    fi
+  %endif
+  if [ $PACKAGE_ALREADY_BUILD == 0 ]; then
+    echo "Rebuilding $PACKAGE_RPM from $PACKAGE_SOURCE"; echo "==============================="
+    rpmbuild --nodeps --rebuild $PACKAGE_SOURCE
+  fi
+
+  if [ ! -f $PACKAGE_DIR/$PACKAGE_RPM ]; then
+    # Hack for tps tests
+    ARCH_STR=%{_arch}
+    %ifarch i386 i686
+    ARCH_STR="i?86"
+    %endif
+    export PACKAGE_DIR="$PACKAGE_DIR/$ARCH_STR"
+  fi
+  pushd $PACKAGE_DIR
+
+  echo "Installing $PACKAGE_DIR/$PACKAGE_RPM"; echo "==============================="
+  PACKAGE_LIST=$(echo $PACKAGE_DIR/$PACKAGE_RPM | tr " " "\n")
+  for PACKAGE in $PACKAGE_LIST
+  do
+      rpm2cpio $PACKAGE | cpio -iduv
+  done
+
+  PATH=$PACKAGE_DIR/usr/bin:$PATH
+  export PATH
+  LD_LIBRARY_PATH=$PACKAGE_DIR/usr/%{_lib}:$LD_LIBRARY_PATH
+  export LD_LIBRARY_PATH
+
+  # Clean rpms to avoid including them to package
+  %if ! 0%{?avoid_bundled_rebuild}
+    rm -f $PACKAGE_FILES
+  %endif
+
+  popd
+}
+
+# Build and install local yasm if needed
+# ======================================
+%if %{use_bundled_yasm}
+  build_bundled_package 'yasm-1*.rpm' 'yasm-*.rpm' '%{SOURCE301}'
+%endif
+
+%if 0%{?bundle_gtk3}
+   %if ! 0%{?avoid_bundled_rebuild}
+    rpm -ivh %{SOURCE200}
+    rpmbuild --nodeps --define '_prefix %{gtk3_install_path}' -ba %{_specdir}/gtk3-private.spec
+   %endif
+   pushd %{_buildrootdir}
+   install_rpms_to_current_dir gtk3-private-%{gtk3_nvr}*.rpm
+   install_rpms_to_current_dir gtk3-private-devel-%{gtk3_nvr}*.rpm
+   install_rpms_to_current_dir gtk3-private-rpm-scripts-%{gtk3_nvr}*.rpm
+   popd
+%endif
+
+%if 0%{?bundle_gtk3}
+# gtk3-private-3.22.26.el6-1-requires-provides-filter.inc
+%include_file %{SOURCE206}
+%endif
+%if 0%{use_bundled_ffi}
+  # Install libraries to the predefined location to later add them to the Firefox libraries
+  rpm -ivh %{SOURCE303}
+  rpmbuild --nodeps --define '_prefix %{gtk3_install_path}' -ba %{_specdir}/libffi.spec
+  pushd %{_buildrootdir}
+  install_rpms_to_current_dir 'libffi*.rpm'
+  popd
+  %filter_from_requires /libffi.so.6/d
+%endif
+%filter_setup
+
+# If needed build the bundled python 2.7 and 3.6 and put it in the PATH
+%if 0%{?use_bundled_python_3}
+    pushd %{_builddir}/python3/Python-%{bundled_python_version_3}
+    ./configure --prefix="%{_buildrootdir}" --exec-prefix="%{_buildrootdir}" --libdir="%{_buildrootdir}/lib" --with-pydebug
+    make %{?_smp_mflags} install V=1 -j1
+    cp Tools/scripts/pathfix.py %{_buildrootdir}/bin
+    popd
+%endif
+%if 0%{?use_bundled_python_2}
+    pushd %{_builddir}/python2/Python-%{bundled_python_version_2}
+    ./configure --prefix="%{_buildrootdir}" --exec-prefix="%{_buildrootdir}" --libdir="%{_buildrootdir}/lib"
+    make %{?_smp_mflags} install V=1
+    popd
+%endif
+
+function replace_prefix() {
+  FILE_NAME=$1
+  PKG_CONFIG_PREFIX=$2
+
+  cat $FILE_NAME | tail -n +2 > tmp.txt
+  echo "$PKG_CONFIG_PREFIX" > $FILE_NAME
+  cat tmp.txt >> $FILE_NAME
+  rm -rf tmp.txt
+}
+
+# Build and install local openssl if needed
+# =========================================
+%if 0%{?use_bundled_openssl}
+  rpm -ivh %{SOURCE305}
+  rpmbuild --nodeps -ba %{_specdir}/openssl.spec
+  pushd %{_buildrootdir}
+  install_rpms_to_current_dir openssl-1.0.2k*.rpm
+  install_rpms_to_current_dir openssl-libs-1.0.2k*.rpm
+  install_rpms_to_current_dir openssl-devel-1.0.2k*.rpm
+  install_rpms_to_current_dir openssl-static-1.0.2k*.rpm
+  # openssl is installed to %{_buildrootdir}/usr/lib(64)/...
+  export PKG_CONFIG_PATH=%{_buildrootdir}/%{_libdir}/pkgconfig/:$PKG_CONFIG_PATH
+  replace_prefix %{_buildrootdir}/%{_libdir}/pkgconfig/libcrypto.pc prefix=%{_buildrootdir}/usr
+  replace_prefix %{_buildrootdir}/%{_libdir}/pkgconfig/libssl.pc prefix=%{_buildrootdir}/usr
+  replace_prefix %{_buildrootdir}/%{_libdir}/pkgconfig/openssl.pc prefix=%{_buildrootdir}/usr
+  cat  %{_buildrootdir}/%{_libdir}/pkgconfig/libcrypto.pc
+  cat  %{_buildrootdir}/%{_libdir}/pkgconfig/libssl.pc
+  cat  %{_buildrootdir}/%{_libdir}/pkgconfig/openssl.pc
+  pushd %{_rpmdir}
+  rm -f openssl-*.rpm
+  popd
+  popd
+%endif
+
+# We need to disable exit on error temporarily for the following scripts:
+set +e
+%if 0%{?use_dts}
+source scl_source enable devtoolset-%{dts_version}
+%endif
+%if 0%{?use_rustts}
+source scl_source enable rust-toolset-%{rust_toolset_version}
+%endif
+
+# Build and install local node if needed
+# ======================================
+%if %{use_bundled_nodejs}
+  build_bundled_package 'nodejs-8*.rpm' 'nodejs-*.rpm' %{SOURCE304}
+  export MOZ_NODEJS=$PACKAGE_DIR/usr/bin/node
+%else
+  export MOZ_NODEJS=/usr/bin/node
+%endif
+
+mkdir -p my_rust_vendor
+cd my_rust_vendor
+%{__tar} xf %{SOURCE2}
+cd -
+mkdir -p .cargo
+cat > .cargo/config <<EOL
+[source.crates-io]
+replace-with = "vendored-sources"
+
+[source.vendored-sources]
+directory = "`pwd`/my_rust_vendor"
+EOL
+
+export CARGO_HOME=.cargo
+cargo install cbindgen
+export PATH=`pwd`/.cargo/bin:$PATH
+export CBINDGEN=`pwd`/.cargo/bin/cbindgen
+
+
+%if %{?system_sqlite}
+# Do not proceed with build if the sqlite require would be broken:
+# make sure the minimum requirement is non-empty, ...
+sqlite_version=$(expr "%{sqlite_version}" : '\([0-9]*\.\)[0-9]*\.') || exit 1
+# ... and that major number of the computed build-time version matches:
+case "%{sqlite_build_version}" in
+  "$sqlite_version"*) ;;
+  *) exit 1 ;;
+esac
+%endif
+
+%if 0%{?big_endian}
+echo "Generate big endian version of config/external/icu/data/icud64l.dat"
+ ./mach python intl/icu_sources_data.py .
+ rm -f config/external/icu/data/icudt*l.dat
+# mv config/external/icu/data/icudt64l.dat config/external/icu/data/icudt64b.dat
+ ls -l config/external/icu/data
+ cat /tmp/icu-make*
+%endif
+
+mkdir %{_buildrootdir}/bin || :
+cp %{SOURCE28} %{_buildrootdir}/bin || :
+
+# Update the various config.guess to upstream release for aarch64 support
+find ./ -name config.guess -exec cp /usr/lib/rpm/config.guess {} ';'
+
+# -fpermissive is needed to build with gcc 4.6+ which has become stricter
+#
+# Mozilla builds with -Wall with exception of a few warnings which show up
+# everywhere in the code; so, don't override that.
+#
+# Disable C++ exceptions since Mozilla code is not exception-safe
+#
+MOZ_OPT_FLAGS=$(echo "%{optflags}" | %{__sed} -e 's/-Wall//')
+#rhbz#1037063
+# -Werror=format-security causes build failures when -Wno-format is explicitly given
+# for some sources
+# Explicitly force the hardening flags for Firefox so it passes the checksec test;
+# See also https://fedoraproject.org/wiki/Changes/Harden_All_Packages
+MOZ_OPT_FLAGS="$MOZ_OPT_FLAGS -Wformat-security -Wformat -Werror=format-security"
+%if 0%{?fedora} > 23
+# Disable null pointer gcc6 optimization in gcc6 (rhbz#1328045)
+MOZ_OPT_FLAGS="$MOZ_OPT_FLAGS -fno-delete-null-pointer-checks"
+%endif
+# Use hardened build?
+%if %{?hardened_build}
+MOZ_OPT_FLAGS="$MOZ_OPT_FLAGS -fPIC -Wl,-z,relro -Wl,-z,now"
+%endif
+%if %{?debug_build}
+MOZ_OPT_FLAGS=$(echo "$MOZ_OPT_FLAGS" | %{__sed} -e 's/-O2//')
+%endif
+%ifarch s390
+MOZ_OPT_FLAGS=$(echo "$MOZ_OPT_FLAGS" | %{__sed} -e 's/-g/-g1/')
+# If MOZ_DEBUG_FLAGS is empty, firefox's build will default it to "-g" which
+# overrides the -g1 from line above and breaks building on s390
+# (OOM when linking, rhbz#1238225)
+export MOZ_DEBUG_FLAGS=" "
+%endif
+%ifarch s390 %{arm} ppc aarch64 i686
+MOZ_LINK_FLAGS="-Wl,--no-keep-memory -Wl,--reduce-memory-overheads"
+%endif
+%ifarch %{arm}
+export RUSTFLAGS="-Cdebuginfo=0"
+%endif
+export CFLAGS=$MOZ_OPT_FLAGS
+export CXXFLAGS=$MOZ_OPT_FLAGS
+export LDFLAGS=$MOZ_LINK_FLAGS
+
+export PREFIX='%{_prefix}'
+export LIBDIR='%{_libdir}'
+export CC=gcc
+export CXX=g++
+
+MOZ_SMP_FLAGS=-j1
+# More than two build tasks can lead to OOM gcc crash.
+%if 0%{?rhel} < 8
+[ -z "$RPM_BUILD_NCPUS" ] && \
+     RPM_BUILD_NCPUS="`/usr/bin/getconf _NPROCESSORS_ONLN`"
+[ "$RPM_BUILD_NCPUS" -ge 2 ] && MOZ_SMP_FLAGS=-j2
+%else
+%ifarch %{ix86} x86_64 ppc ppc64 ppc64le aarch64
+[ -z "$RPM_BUILD_NCPUS" ] && \
+     RPM_BUILD_NCPUS="`/usr/bin/getconf _NPROCESSORS_ONLN`"
+[ "$RPM_BUILD_NCPUS" -ge 2 ] && MOZ_SMP_FLAGS=-j2
+[ "$RPM_BUILD_NCPUS" -ge 4 ] && MOZ_SMP_FLAGS=-j4
+[ "$RPM_BUILD_NCPUS" -ge 8 ] && MOZ_SMP_FLAGS=-j8
+%endif
+%endif
+
+%if 0%{?bundle_gtk3}
+# gtk3-private-setup-flags-env.inc
+%include_file %{SOURCE205}
+%endif
+
+export MOZ_MAKE_FLAGS="$MOZ_SMP_FLAGS"
+export MOZ_SERVICES_SYNC="1"
+export STRIP=/bin/true
+./mach build -v
+
+# create debuginfo for crash-stats.mozilla.com
+%if %{enable_mozilla_crashreporter}
+#cd %{moz_objdir}
+make -C objdir buildsymbols
+%endif
+
+%if %{?run_tests}
+%if %{?system_nss}
+ln -s /usr/bin/certutil objdir/dist/bin/certutil
+ln -s /usr/bin/pk12util objdir/dist/bin/pk12util
+
+%endif
+mkdir test_results
+./mach --log-no-times check-spidermonkey &> test_results/check-spidermonkey || true
+./mach --log-no-times check-spidermonkey &> test_results/check-spidermonkey-2nd-run || true
+./mach --log-no-times cppunittest &> test_results/cppunittest || true
+xvfb-run ./mach --log-no-times crashtest &> test_results/crashtest || true
+./mach --log-no-times gtest &> test_results/gtest || true
+xvfb-run ./mach --log-no-times jetpack-test &> test_results/jetpack-test || true
+# not working right now ./mach marionette-test &> test_results/marionette-test || true
+xvfb-run ./mach --log-no-times mochitest-a11y &> test_results/mochitest-a11y || true
+xvfb-run ./mach --log-no-times mochitest-browser &> test_results/mochitest-browser || true
+xvfb-run ./mach --log-no-times mochitest-chrome &> test_results/mochitest-chrome || true
+xvfb-run ./mach --log-no-times mochitest-devtools &> test_results/mochitest-devtools || true
+xvfb-run ./mach --log-no-times mochitest-plain &> test_results/mochitest-plain || true
+xvfb-run ./mach --log-no-times reftest &> test_results/reftest || true
+xvfb-run ./mach --log-no-times webapprt-test-chrome &> test_results/webapprt-test-chrome || true
+xvfb-run ./mach --log-no-times webapprt-test-content &> test_results/webapprt-test-content || true
+./mach --log-no-times webidl-parser-test &> test_results/webidl-parser-test || true
+xvfb-run ./mach --log-no-times xpcshell-test &> test_results/xpcshell-test || true
+%if %{?system_nss}
+rm -f  objdir/dist/bin/certutil
+rm -f  objdir/dist/bin/pk12util
+%endif
+
+%endif
+#---------------------------------------------------------------------
+
+%install
+%if 0%{?rhel} == 6
+export SHELL=/bin/sh
+%endif
+
+%if 0%{?bundle_gtk3}
+function install_rpms_to_current_dir() {
+    PACKAGE_RPM=$(eval echo $1)
+    PACKAGE_DIR=%{_rpmdir}
+
+    if [ ! -f $PACKAGE_DIR/$PACKAGE_RPM ]; then
+        # Hack for tps tests
+        ARCH_STR=%{_arch}
+        %ifarch i386 i686
+            ARCH_STR="i?86"
+        %endif
+        PACKAGE_DIR="$PACKAGE_DIR/$ARCH_STR"
+     fi
+
+     for package in $(ls $PACKAGE_DIR/$PACKAGE_RPM)
+     do
+         echo "$package"
+         rpm2cpio "$package" | cpio -idu
+     done
+}
+
+pushd %{buildroot}
+# Install gtk3-private again to the buildroot, but without devel subpackage
+install_rpms_to_current_dir gtk3-private-%{gtk3_nvr}*.rpm
+install_rpms_to_current_dir gtk3-private-rpm-scripts-%{gtk3_nvr}*.rpm
+popd
+%endif
+
+# Install bundled libffi
+%if %{use_bundled_ffi}
+  pushd %{buildroot}
+  install_rpms_to_current_dir libffi-3*.rpm
+  popd
+%endif
+
+# set up our default bookmarks
+%{__cp} -p %{default_bookmarks_file} objdir/dist/bin/browser/chrome/en-US/locale/browser/bookmarks.html
+
+# Make sure locale works for langpacks
+%{__cat} > objdir/dist/bin/browser/defaults/preferences/firefox-l10n.js << EOF
+pref("general.useragent.locale", "chrome://global/locale/intl.properties");
+EOF
+
+DESTDIR=%{buildroot} make -C objdir install
+
+%{__mkdir_p} %{buildroot}{%{_libdir},%{_bindir},%{_datadir}/applications}
+
+desktop-file-install --dir %{buildroot}%{_datadir}/applications %{SOURCE20}
+
+# set up the firefox start script
+%{__rm} -rf %{buildroot}%{_bindir}/firefox
+%{__cat} %{SOURCE21} > %{buildroot}%{_bindir}/firefox
+%if 0%{?bundle_gtk3}
+sed -i -e 's|%RHEL_ENV_VARS%|export XDG_DATA_DIRS="$MOZ_LIB_DIR/firefox/bundled/share:/usr/share:$XDG_DATA_DIRS"\nexport FONTCONFIG_FILE="$MOZ_LIB_DIR/firefox/bundled/etc/fonts/fonts.conf"|' %{buildroot}%{_bindir}/firefox
+%else
+sed -i -e 's|%RHEL_ENV_VARS%||' %{buildroot}%{_bindir}/firefox
+%endif
+
+%{__chmod} 755 %{buildroot}%{_bindir}/firefox
+
+%{__install} -p -D -m 644 %{SOURCE23} %{buildroot}%{_mandir}/man1/firefox.1
+
+%{__rm} -f %{buildroot}/%{mozappdir}/firefox-config
+%{__rm} -f %{buildroot}/%{mozappdir}/update-settings.ini
+
+for s in 16 22 24 32 48 256; do
+    %{__mkdir_p} %{buildroot}%{_datadir}/icons/hicolor/${s}x${s}/apps
+    %{__cp} -p browser/branding/official/default${s}.png \
+               %{buildroot}%{_datadir}/icons/hicolor/${s}x${s}/apps/firefox.png
+done
+
+# Install hight contrast icon
+%{__mkdir_p} %{buildroot}%{_datadir}/icons/hicolor/symbolic/apps
+%{__cp} -p %{SOURCE25} \
+           %{buildroot}%{_datadir}/icons/hicolor/symbolic/apps
+
+# Register as an application to be visible in the software center
+#
+# NOTE: It would be *awesome* if this file was maintained by the upstream
+# project, translated and installed into the right place during `make install`.
+#
+# See http://www.freedesktop.org/software/appstream/docs/ for more details.
+#
+%{__mkdir_p} %{buildroot}%{_datadir}/appdata
+cat > %{buildroot}%{_datadir}/appdata/%{name}.appdata.xml <<EOF
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2014 Richard Hughes <richard@hughsie.com> -->
+<!--
+BugReportURL: https://bugzilla.mozilla.org/show_bug.cgi?id=1071061
+SentUpstream: 2014-09-22
+-->
+<application>
+  <id type="desktop">firefox.desktop</id>
+  <metadata_license>CC0-1.0</metadata_license>
+  <description>
+    <p>
+      Bringing together all kinds of awesomeness to make browsing better for you.
+      Get to your favorite sites quickly – even if you don’t remember the URLs.
+      Type your term into the location bar (aka the Awesome Bar) and the autocomplete
+      function will include possible matches from your browsing history, bookmarked
+      sites and open tabs.
+    </p>
+    <!-- FIXME: Needs another couple of paragraphs -->
+  </description>
+  <url type="homepage">http://www.mozilla.org/</url>
+  <screenshots>
+    <screenshot type="default">https://raw.githubusercontent.com/hughsie/fedora-appstream/master/screenshots-extra/firefox/a.png</screenshot>
+    <screenshot>https://raw.githubusercontent.com/hughsie/fedora-appstream/master/screenshots-extra/firefox/b.png</screenshot>
+    <screenshot>https://raw.githubusercontent.com/hughsie/fedora-appstream/master/screenshots-extra/firefox/c.png</screenshot>
+  </screenshots>
+  <!-- FIXME: change this to an upstream email address for spec updates
+  <updatecontact>someone_who_cares@upstream_project.org</updatecontact>
+   -->
+</application>
+EOF
+
+echo > %{name}.lang
+%if %{build_langpacks}
+# Extract langpacks, make any mods needed, repack the langpack, and install it.
+%{__mkdir_p} %{buildroot}%{langpackdir}
+%{__tar} xf %{SOURCE1}
+for langpack in `ls firefox-langpacks/*.xpi`; do
+  language=`basename $langpack .xpi`
+  extensionID=langpack-$language@firefox.mozilla.org
+  %{__mkdir_p} $extensionID
+  unzip -qq $langpack -d $extensionID
+  find $extensionID -type f | xargs chmod 644
+
+  cd $extensionID
+  zip -qq -r9mX ../${extensionID}.xpi *
+  cd -
+
+  %{__install} -m 644 ${extensionID}.xpi %{buildroot}%{langpackdir}
+  language=`echo $language | sed -e 's/-/_/g'`
+  echo "%%lang($language) %{langpackdir}/${extensionID}.xpi" >> %{name}.lang
+done
+%{__rm} -rf firefox-langpacks
+
+# Install langpack workaround (see #707100, #821169)
+function create_default_langpack() {
+language_long=$1
+language_short=$2
+cd %{buildroot}%{langpackdir}
+ln -s langpack-$language_long@firefox.mozilla.org.xpi langpack-$language_short@firefox.mozilla.org.xpi
+cd -
+echo "%%lang($language_short) %{langpackdir}/langpack-$language_short@firefox.mozilla.org.xpi" >> %{name}.lang
+}
+
+# Table of fallbacks for each language
+# please file a bug at bugzilla.redhat.com if the assignment is incorrect
+create_default_langpack "es-AR" "es"
+create_default_langpack "fy-NL" "fy"
+create_default_langpack "ga-IE" "ga"
+create_default_langpack "gu-IN" "gu"
+create_default_langpack "hi-IN" "hi"
+create_default_langpack "hy-AM" "hy"
+create_default_langpack "nb-NO" "nb"
+create_default_langpack "nn-NO" "nn"
+create_default_langpack "pa-IN" "pa"
+create_default_langpack "pt-PT" "pt"
+create_default_langpack "sv-SE" "sv"
+create_default_langpack "zh-TW" "zh"
+%endif
+
+# Keep compatibility with the old preference location.
+%{__mkdir_p} %{buildroot}%{mozappdir}/defaults/preferences
+%{__mkdir_p} %{buildroot}%{mozappdir}/browser/defaults
+ln -s %{mozappdir}/defaults/preferences $RPM_BUILD_ROOT/%{mozappdir}/browser/defaults/preferences
+# Default preferences
+%{__cp} %{SOURCE12} %{buildroot}%{mozappdir}/defaults/preferences/all-redhat.js
+
+# System config dir
+%{__mkdir_p} %{buildroot}/%{_sysconfdir}/%{name}/pref
+
+# System extensions
+%{__mkdir_p} %{buildroot}%{_datadir}/mozilla/extensions/%{firefox_app_id}
+%{__mkdir_p} %{buildroot}%{_libdir}/mozilla/extensions/%{firefox_app_id}
+
+# Copy over the LICENSE
+%{__install} -p -c -m 644 LICENSE %{buildroot}/%{mozappdir}
+
+# Use the system hunspell dictionaries
+%{__rm} -rf %{buildroot}%{mozappdir}/dictionaries
+ln -s %{_datadir}/myspell %{buildroot}%{mozappdir}/dictionaries
+
+# Enable crash reporter for Firefox application
+%if %{enable_mozilla_crashreporter}
+sed -i -e "s/\[Crash Reporter\]/[Crash Reporter]\nEnabled=1/" %{buildroot}/%{mozappdir}/application.ini
+# Add debuginfo for crash-stats.mozilla.com
+%{__mkdir_p} %{buildroot}/%{moz_debug_dir}
+%{__cp} objdir/dist/%{symbols_file_name} %{buildroot}/%{moz_debug_dir}
+%endif
+
+%if %{run_tests}
+# Add debuginfo for crash-stats.mozilla.com
+%{__mkdir_p} %{buildroot}/test_results
+%{__cp} test_results/* %{buildroot}/test_results
+%endif
+
+
+# Copy over run-mozilla.sh
+%{__cp} build/unix/run-mozilla.sh %{buildroot}%{mozappdir}
+
+# Add distribution.ini
+%{__mkdir_p} %{buildroot}%{mozappdir}/distribution
+%{__cp} %{SOURCE26} %{buildroot}%{mozappdir}/distribution
+
+%if 0%{?centos}
+sed -i -e 's|Red Hat Enterprise|CentOS|' %{buildroot}%{mozappdir}/distribution/distribution.ini
+%endif
+
+# Remove copied libraries to speed up build
+rm -f %{buildroot}%{mozappdirdev}/sdk/lib/libmozjs.so
+rm -f %{buildroot}%{mozappdirdev}/sdk/lib/libmozalloc.so
+rm -f %{buildroot}%{mozappdirdev}/sdk/lib/libxul.so
+
+%if %{bundle_gnome_extension}
+# Gnome extension
+%{__mkdir_p} %{buildroot}%{mozappdir}/distribution/extensions
+%{__cp} -p %{SOURCE2} %{buildroot}%{mozappdir}/distribution/extensions/chrome-gnome-shell@gnome.org.xpi
+chmod 644 %{buildroot}%{mozappdir}/distribution/extensions/chrome-gnome-shell@gnome.org.xpi
+%endif
+#---------------------------------------------------------------------
+
+%preun
+# is it a final removal?
+if [ $1 -eq 0 ]; then
+  %{__rm} -rf %{mozappdir}/components
+  %{__rm} -rf %{mozappdir}/extensions
+  %{__rm} -rf %{mozappdir}/plugins
+  %{__rm} -rf %{langpackdir}
+fi
+
+%clean
+rm -rf %{_srcrpmdir}/gtk3-private-%{gtk3_nvr}*.src.rpm
+find %{_rpmdir} -name "gtk3-private-*%{gtk3_nvr}*.rpm" -delete
+rm -rf %{_srcrpmdir}/libffi*.src.rpm
+find %{_rpmdir} -name "libffi*.rpm" -delete
+rm -rf %{_srcrpmdir}/openssl*.src.rpm
+find %{_rpmdir} -name "openssl*.rpm" -delete
+
+%post
+update-desktop-database &> /dev/null || :
+touch --no-create %{_datadir}/icons/hicolor &>/dev/null || :
+%if 0%{?bundle_gtk3}
+# gtk3-private-post.inc
+%include_file %{SOURCE201}
+%endif
+
+%postun
+update-desktop-database &> /dev/null || :
+if [ $1 -eq 0 ] ; then
+    touch --no-create %{_datadir}/icons/hicolor &>/dev/null
+    gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
+fi
+%if 0%{?bundle_gtk3}
+# gtk3-private-postun.inc
+%include_file %{SOURCE202}
+%endif
+
+%posttrans
+gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
+%if 0%{?bundle_gtk3}
+# gtk3-private-posttrans.inc
+%include_file %{SOURCE203}
+%endif
+
+%files -f %{name}.lang
+%{_bindir}/firefox
+%{mozappdir}/firefox
+%{mozappdir}/firefox-bin
+%doc %{_mandir}/man1/*
+%dir %{_sysconfdir}/%{name}
+%dir %{_sysconfdir}/%{name}/*
+%dir %{_datadir}/mozilla/extensions/*
+%dir %{_libdir}/mozilla/extensions/*
+%{_datadir}/appdata/*.appdata.xml
+%{_datadir}/applications/*.desktop
+%dir %{mozappdir}
+%doc %{mozappdir}/LICENSE
+%{mozappdir}/browser/chrome
+%{mozappdir}/browser/chrome.manifest
+%{mozappdir}/defaults/preferences/*
+%{mozappdir}/browser/defaults/preferences
+%{mozappdir}/browser/features/*.xpi
+%{mozappdir}/distribution/distribution.ini
+%attr(644, root, root) %{mozappdir}/browser/blocklist.xml
+%if %{build_langpacks}
+%dir %{langpackdir}
+%endif
+%{mozappdir}/browser/omni.ja
+%{mozappdir}/chrome.manifest
+%{mozappdir}/run-mozilla.sh
+%{mozappdir}/application.ini
+%{mozappdir}/pingsender
+%exclude %{mozappdir}/removed-files
+%{_datadir}/icons/hicolor/16x16/apps/firefox.png
+%{_datadir}/icons/hicolor/22x22/apps/firefox.png
+%{_datadir}/icons/hicolor/24x24/apps/firefox.png
+%{_datadir}/icons/hicolor/256x256/apps/firefox.png
+%{_datadir}/icons/hicolor/32x32/apps/firefox.png
+%{_datadir}/icons/hicolor/48x48/apps/firefox.png
+%{_datadir}/icons/hicolor/symbolic/apps/firefox-symbolic.svg
+%if %{enable_mozilla_crashreporter}
+%{mozappdir}/crashreporter
+%{mozappdir}/crashreporter.ini
+%{mozappdir}/minidump-analyzer
+%{mozappdir}/Throbber-small.gif
+%{mozappdir}/browser/crashreporter-override.ini
+%endif
+%{mozappdir}/*.so
+%{mozappdir}/gtk2/*.so
+%{mozappdir}/defaults/pref/channel-prefs.js
+%{mozappdir}/dependentlibs.list
+%{mozappdir}/dictionaries
+%{mozappdir}/omni.ja
+%{mozappdir}/platform.ini
+%{mozappdir}/plugin-container
+%{mozappdir}/gmp-clearkey
+%{mozappdir}/fonts/*.ttf
+%if !%{?system_libicu}
+#%{mozappdir}/icudt*.dat
+%endif
+%if !%{?system_nss}
+%{mozappdir}/libfreeblpriv3.chk
+%{mozappdir}/libnssdbm3.chk
+%{mozappdir}/libsoftokn3.chk
+%exclude %{mozappdir}/libnssckbi.so
+%endif
+%if 0%{use_bundled_ffi}
+%{mozappdir}/bundled/%{_lib}/libffi.so*
+%exclude %{_datadir}/doc/libffi*
+%endif
+
+%if 0%{?bundle_gtk3}
+# gtk3-private-files.inc
+%include_file %{SOURCE204}
+%endif
+
+
+#---------------------------------------------------------------------
+
+%changelog
+* Fri May 29 2020 Jan Horak <jhorak@redhat.com>
+- Update to 68.9.0 build1
+- Added patch for pipewire 0.3
+
+* Mon May 11 2020 Jan Horak <jhorak@redhat.com>
+- Added s390x specific patches
+
+* Wed Apr 29 2020 Jan Horak <jhorak@redhat.com>
+- Update to 68.8.0 build1
+
+* Thu Apr 23 2020 Martin Stransky <stransky@redhat.com> - 68.7.0-3
+- Added fix for rhbz#1821418
+
+* Tue Apr 07 2020 Jan Horak <jhorak@redhat.com> - 68.7.0-2
+- Update to 68.7.0 build3
+
+* Mon Apr  6 2020 Jan Horak <jhorak@redhat.com> - 68.6.1-1
+- Update to 68.6.1 ESR
+
+* Wed Mar 04 2020 Jan Horak <jhorak@redhat.com>
+- Update to 68.6.0 build1
+
+* Mon Feb 24 2020 Martin Stransky <stransky@redhat.com> - 68.5.0-3
+- Added fix for rhbz#1805667
+- Enabled mzbz@1170092 - Firefox prefs at /etc
+
+* Fri Feb 07 2020 Jan Horak <jhorak@redhat.com>
+- Update to 68.5.0 build2
+
+* Wed Feb 05 2020 Jan Horak <jhorak@redhat.com>
+- Update to 68.5.0 build1
+
+* Wed Jan 08 2020 Jan Horak <jhorak@redhat.com>
+- Update to 68.4.1esr build1
+
+* Fri Jan 03 2020 Jan Horak <jhorak@redhat.com>
+- Update to 68.4.0esr build1
+
+* Wed Dec 18 2019 Jan Horak <jhorak@redhat.com>
+- Fix for wrong intl.accept_lang when using non en-us langpack
+
+* Wed Nov 27 2019 Martin Stransky <stransky@redhat.com> - 68.3.0-1
+- Update to 68.3.0 ESR
+
+* Thu Oct 24 2019 Martin Stransky <stransky@redhat.com> - 68.2.0-4
+- Added patch for TLS 1.3 support.
+
+* Wed Oct 23 2019 Martin Stransky <stransky@redhat.com> - 68.2.0-3
+- Rebuild
+
+* Mon Oct 21 2019 Martin Stransky <stransky@redhat.com> - 68.2.0-2
+- Rebuild
+
+* Thu Oct 17 2019 Martin Stransky <stransky@redhat.com> - 68.2.0-1
+- Update to 68.2.0 ESR
+
+* Thu Oct 10 2019 Martin Stransky <stransky@redhat.com> - 68.1.0-6
+- Enable system nss on RHEL6
+
+* Thu Sep  5 2019 Jan Horak <jhorak@redhat.com> - 68.1.0-2
+- Enable building langpacks
+
+* Wed Aug 28 2019 Jan Horak <jhorak@redhat.com> - 68.1.0-1
+- Update to 68.1.0 ESR
+
+* Mon Aug 5 2019 Martin Stransky <stransky@redhat.com> - 68.0.1-4
+- Enable system nss
+
+* Mon Jul 29 2019 Martin Stransky <stransky@redhat.com> - 68.0.1-3
+- Enable official branding
+
+* Fri Jul 26 2019 Martin Stransky <stransky@redhat.com> - 68.0.1-2
+- Enabled PipeWire on RHEL8
+
+* Fri Jul 26 2019 Martin Stransky <stransky@redhat.com> - 68.0.1-1
+- Updated to 68.0.1 ESR
+
+* Tue Jul 16 2019 Jan Horak <jhorak@redhat.com> - 68.0-0.11
+- Update to 68.0 ESR
+
+* Tue Jun 25 2019 Martin Stransky <stransky@redhat.com> - 68.0-0.10
+- Updated to 68.0 alpha 13
+- Enabled second arches
+
+* Fri Mar 22 2019 Martin Stransky <stransky@redhat.com> - 68.0-0.1
+- Updated to 68.0 alpha
+
+* Fri Mar 15 2019 Martin Stransky <stransky@redhat.com> - 60.6.0-3
+- Added Google API keys (mozbz#1531176)
+
+* Thu Mar 14 2019 Martin Stransky <stransky@redhat.com> - 60.6.0-2
+- Update to 60.6.0 ESR (Build 2)
+
+* Wed Mar 13 2019 Martin Stransky <stransky@redhat.com> - 60.6.0-1
+- Update to 60.6.0 ESR (Build 1)
+
+* Wed Feb 13 2019 Jan Horak <jhorak@redhat.com> - 60.5.1-1
+- Update to 60.5.1 ESR
+
+* Wed Feb 6 2019 Martin Stransky <stransky@redhat.com> - 60.5.0-3
+- Added fix for rhbz#1672424 - Firefox crashes on NFS drives.
+
+* Fri Jan 25 2019 Martin Stransky <stransky@redhat.com> - 60.5.0-2
+- Updated to 60.5.0 ESR build2
+
+* Tue Jan 22 2019 Martin Stransky <stransky@redhat.com> - 60.5.0-1
+- Updated to 60.5.0 ESR build1
+
+* Thu Jan 10 2019 Jan Horak <jhorak@redhat.com> - 60.4.0-3
+- Fixing fontconfig warnings (rhbz#1601475)
+
+* Wed Jan  9 2019 Jan Horak <jhorak@redhat.com> - 60.4.0-2
+- Added pipewire patch from Tomas Popela (rhbz#1664270)
+
+* Wed Dec  5 2018 Jan Horak <jhorak@redhat.com> - 60.4.0-1
+- Update to 60.4.0 ESR
+
+* Tue Dec  4 2018 Jan Horak <jhorak@redhat.com> - 60.3.0-2
+- Added firefox-gnome-shell-extension
+
+* Fri Oct 19 2018 Jan Horak <jhorak@redhat.com> - 60.3.0-1
+- Update to 60.3.0 ESR
+
+* Wed Oct 10 2018 Jan Horak <jhorak@redhat.com> - 60.2.2-2
+- Added patch for rhbz#1633932
+
+* Tue Oct  2 2018 Jan Horak <jhorak@redhat.com> - 60.2.2-1
+- Update to 60.2.2 ESR
+
+* Mon Sep 24 2018 Jan Horak <jhorak@redhat.com> - 60.2.1-1
+- Update to 60.2.1 ESR
+
+* Fri Aug 31 2018 Jan Horak <jhorak@redhat.com> - 60.2.0-1
+- Update to 60.2.0 ESR
+
+* Tue Aug 28 2018 Jan Horak <jhorak@redhat.com> - 60.1.0-9
+- Do not set user agent (rhbz#1608065)
+- GTK dialogs are localized now (rhbz#1619373)
+- JNLP association works again (rhbz#1607457)
+
+* Thu Aug 16 2018 Jan Horak <jhorak@redhat.com> - 60.1.0-8
+- Fixed homepage and bookmarks (rhbz#1606778)
+- Fixed missing file associations in RHEL6 (rhbz#1613565)
+
+* Thu Jul 12 2018 Jan Horak <jhorak@redhat.com> - 60.1.0-7
+- Run at-spi-bus if not running already (for the bundled gtk3)
+
+* Mon Jul  9 2018 Jan Horak <jhorak@redhat.com> - 60.1.0-6
+- Fix for missing schemes for bundled gtk3
+
+* Mon Jun 25 2018 Martin Stransky <stransky@redhat.com> - 60.1.0-5
+- Added mesa-libEGL dependency to gtk3/rhel6
+
+* Sun Jun 24 2018 Martin Stransky <stransky@redhat.com> - 60.1.0-4
+- Disabled jemalloc on all second arches
+
+* Fri Jun 22 2018 Martin Stransky <stransky@redhat.com> - 60.1.0-3
+- Updated to 60.1.0 ESR build2
+
+* Thu Jun 21 2018 Martin Stransky <stransky@redhat.com> - 60.1.0-2
+- Disabled jemalloc on second arches
+
+* Wed Jun 20 2018 Martin Stransky <stransky@redhat.com> - 60.1.0-1
+- Updated to 60.1.0 ESR
+
+* Wed Jun 13 2018 Jan Horak <jhorak@redhat.com> - 60.0-12
+- Fixing bundled libffi issues
+- Readded some requirements
+
+* Mon Jun 11 2018 Martin Stransky <stransky@redhat.com> - 60.0-10
+- Added fix for mozilla BZ#1436242 - IPC crashes.
+
+* Mon Jun 11 2018 Jan Horak <jhorak@redhat.com> - 60.0-9
+- Bundling libffi for the sec-arches
+- Added openssl-devel for the Python
+- Fixing bundled gtk3
+
+* Fri May 18 2018 Martin Stransky <stransky@redhat.com> - 60.0-8
+- Added fix for mozilla BZ#1458492
+
+* Wed May 16 2018 Martin Stransky <stransky@redhat.com> - 60.0-7
+- Added patch from rhbz#1498561 to fix ppc64(le) crashes.
+
+* Wed May 16 2018 Martin Stransky <stransky@redhat.com> - 60.0-6
+- Disabled jemalloc on second arches
+
+* Sun May  6 2018 Jan Horak <jhorak@redhat.com> - 60.0-4
+- Update to 60.0 ESR
+
+* Thu Mar  8 2018 Jan Horak <jhorak@redhat.com> - 52.7.0-1
+- Update to 52.7.0 ESR
+
+* Mon Jan 29 2018 Martin Stransky <stransky@redhat.com> - 52.6.0-2
+- Build Firefox for desktop arches only (x86_64 and ppc64le)
+
+* Thu Jan 18 2018 Martin Stransky <stransky@redhat.com> - 52.6.0-1
+- Update to 52.6.0 ESR
+
+* Thu Nov  9 2017 Jan Horak <jhorak@redhat.com> - 52.5.0-1
+- Update to 52.5.0 ESR
+
+* Mon Sep 25 2017 Jan Horak <jhorak@redhat.com> - 52.4.0-1
+- Update to 52.4.0 ESR
+
+* Thu Aug  3 2017 Jan Horak <jhorak@redhat.com> - 52.3.0-3
+- Update to 52.3.0 ESR (b2)
+- Require correct nss version
+
+* Tue Jun 13 2017 Jan Horak <jhorak@redhat.com> - 52.2.0-1
+- Update to 52.2.0 ESR
+
+* Wed May 24 2017 Jan Horak <jhorak@redhat.com> - 52.1.2-1
+- Update to 52.1.2 ESR
+
+* Wed May 24 2017 Jan Horak <jhorak@redhat.com> - 52.0-7
+- Added fix for accept language (rhbz#1454322)
+
+* Wed Mar 22 2017 Jan Horak <jhorak@redhat.com> - 52.0-6
+- Removing patch required for older NSS from RHEL 7.3
+- Added patch for rhbz#1414564
+
+* Fri Mar 17 2017 Martin Stransky <stransky@redhat.com> - 52.0-5
+- Added fix for mozbz#1348168/CVE-2017-5428
+
+* Mon Mar  6 2017 Jan Horak <jhorak@redhat.com> - 52.0-4
+- Update to 52.0 ESR (b4)
+
+* Thu Mar 2 2017 Martin Stransky <stransky@redhat.com> - 52.0-3
+- Added fix for rhbz#1423012 - ppc64 gfx crashes
+
+* Wed Mar  1 2017 Jan Horak <jhorak@redhat.com> - 52.0-2
+- Enable system nss
+
+* Tue Feb 28 2017 Martin Stransky <stransky@redhat.com> - 52.0-1
+- Update to 52.0ESR (B1)
+- Build RHEL7 package for Gtk3
+
+* Mon Feb 27 2017 Martin Stransky <stransky@redhat.com> - 52.0-0.13
+- Added fix for rhbz#1414535
+
+* Tue Feb 21 2017 Jan Horak <jhorak@redhat.com> - 52.0-0.12
+- Update to 52.0b8
+
+* Tue Feb  7 2017 Jan Horak <jhorak@redhat.com> - 52.0-0.11
+- Readded addons patch
+
+* Mon Feb  6 2017 Jan Horak <jhorak@redhat.com> - 52.0-0.10
+- Update to 52.0b3
+
+* Tue Jan 31 2017 Jan Horak <jhorak@redhat.com> - 52.0-0.9
+- Update to 52.0b2
+
+* Fri Jan 27 2017 Jan Horak <jhorak@redhat.com> - 52.0-0.8
+- Update to 52.0b1
+
+* Thu Dec  8 2016 Jan Horak <jhorak@redhat.com> - 52.0-0.5
+- Firefox Aurora 52 testing build