Merge mozilla-central to fx-team
authorCarsten "Tomcat" Book <cbook@mozilla.com>
Tue, 26 Jan 2016 12:46:28 +0100
changeset 319834 8f84d08f4d8be041911ef3bc9a166f5c8f174a28
parent 319833 88a1fe447c9e0407879b120a5d724c84af17c463 (current diff)
parent 319823 c0ba5835ca489d15f8f170d5deb01f8dad92709a (diff)
child 319835 c79c550405c8b4a4be62484bf2cfb9b6daf809e3
push id1128
push userjlund@mozilla.com
push dateWed, 01 Jun 2016 01:31:59 +0000
treeherdermozilla-release@fe0d30de989d [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
milestone47.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge mozilla-central to fx-team
b2g/branding/browserhtml/Makefile.in
b2g/branding/horizon/Makefile.in
b2g/branding/official/Makefile.in
b2g/branding/unofficial/Makefile.in
browser/components/nsBrowserGlue.js
config/external/nspr/Makefile.in
configure.in
python/virtualenv/virtualenv_support/pip-6.0.6-py2.py3-none-any.whl
python/virtualenv/virtualenv_support/setuptools-11.0-py2.py3-none-any.whl
testing/mochitest/manifests/Makefile.in
--- a/CLOBBER
+++ b/CLOBBER
@@ -17,10 +17,11 @@
 #
 # Modifying this file will now automatically clobber the buildbot machines \o/
 #
 
 # Are you updating CLOBBER because you think it's needed for your WebIDL
 # changes to stick? As of bug 928195, this shouldn't be necessary! Please
 # don't change CLOBBER for WebIDL changes any more.
 
+Bug 1241975 - port B2G branding Makefiles to moz.build;
+Bug 1241974 - remove testing/mochitest/manifests/Makefile.in;
 
-Merge day clobber
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/b2g/branding/branding-common.mozbuild
@@ -0,0 +1,24 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+@template
+def B2GBranding():
+    if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'windows':
+        BRANDING_FILES += [
+            'app.ico',
+        ]
+    elif CONFIG['MOZ_WIDGET_TOOLKIT'] == 'cocoa':
+        BRANDING_FILES += [
+            'app.icns',
+            'background.png',
+            'disk.icns',
+            'dsstore',
+        ]
+
+    if CONFIG['MOZ_WIDGET_GTK']:
+        BRANDING_FILES += [
+            'default.png',
+        ]
deleted file mode 100644
--- a/b2g/branding/browserhtml/Makefile.in
+++ /dev/null
@@ -1,30 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-include $(topsrcdir)/config/config.mk
-
-ifeq ($(MOZ_WIDGET_TOOLKIT),windows)
-BRANDING_FILES := \
-	app.ico \
-	$(NULL)
-endif
-
-ifeq ($(MOZ_WIDGET_TOOLKIT),cocoa)
-BRANDING_FILES := \
-	app.icns \
-	background.png \
-	disk.icns \
-	dsstore \
-	$(NULL)
-endif
-
-ifdef MOZ_WIDGET_GTK
-BRANDING_FILES := \
-	default.png \
-	$(NULL)
-endif
-
-BRANDING_DEST := $(DIST)/branding
-BRANDING_TARGET := export
-INSTALL_TARGETS += BRANDING
--- a/b2g/branding/browserhtml/moz.build
+++ b/b2g/branding/browserhtml/moz.build
@@ -1,7 +1,10 @@
 # -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 DIRS += ['content', 'locales']
+
+include('../branding-common.mozbuild')
+B2GBranding()
deleted file mode 100644
--- a/b2g/branding/horizon/Makefile.in
+++ /dev/null
@@ -1,30 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-include $(topsrcdir)/config/config.mk
-
-ifeq ($(MOZ_WIDGET_TOOLKIT),windows)
-BRANDING_FILES := \
-	app.ico \
-	$(NULL)
-endif
-
-ifeq ($(MOZ_WIDGET_TOOLKIT),cocoa)
-BRANDING_FILES := \
-	app.icns \
-	background.png \
-	disk.icns \
-	dsstore \
-	$(NULL)
-endif
-
-ifdef MOZ_WIDGET_GTK
-BRANDING_FILES := \
-	default.png \
-	$(NULL)
-endif
-
-BRANDING_DEST := $(DIST)/branding
-BRANDING_TARGET := export
-INSTALL_TARGETS += BRANDING
--- a/b2g/branding/horizon/moz.build
+++ b/b2g/branding/horizon/moz.build
@@ -1,7 +1,10 @@
 # -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 DIRS += ['content', 'locales']
+
+include('../branding-common.mozbuild')
+B2GBranding()
deleted file mode 100644
--- a/b2g/branding/official/Makefile.in
+++ /dev/null
@@ -1,30 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-include $(topsrcdir)/config/config.mk
-
-ifeq ($(MOZ_WIDGET_TOOLKIT),windows)
-BRANDING_FILES := \
-	app.ico \
-	$(NULL)
-endif
-
-ifeq ($(MOZ_WIDGET_TOOLKIT),cocoa)
-BRANDING_FILES := \
-	app.icns \
-	background.png \
-	disk.icns \
-	dsstore \
-	$(NULL)
-endif
-
-ifdef MOZ_WIDGET_GTK
-BRANDING_FILES := \
-	default.png \
-	$(NULL)
-endif
-
-BRANDING_DEST := $(DIST)/branding
-BRANDING_TARGET := export
-INSTALL_TARGETS += BRANDING
--- a/b2g/branding/official/moz.build
+++ b/b2g/branding/official/moz.build
@@ -1,7 +1,10 @@
 # -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 DIRS += ['content', 'locales']
+
+include('../branding-common.mozbuild')
+B2GBranding()
deleted file mode 100644
--- a/b2g/branding/unofficial/Makefile.in
+++ /dev/null
@@ -1,30 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-include $(topsrcdir)/config/config.mk
-
-ifeq ($(MOZ_WIDGET_TOOLKIT),windows)
-BRANDING_FILES := \
-	app.ico \
-	$(NULL)
-endif
-
-ifeq ($(MOZ_WIDGET_TOOLKIT),cocoa)
-BRANDING_FILES := \
-	app.icns \
-	background.png \
-	disk.icns \
-	dsstore \
-	$(NULL)
-endif
-
-ifdef MOZ_WIDGET_GTK
-BRANDING_FILES := \
-	default.png \
-	$(NULL)
-endif
-
-BRANDING_DEST := $(DIST)/branding
-BRANDING_TARGET := export
-INSTALL_TARGETS += BRANDING
--- a/b2g/branding/unofficial/moz.build
+++ b/b2g/branding/unofficial/moz.build
@@ -1,7 +1,10 @@
 # -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 DIRS += ['content', 'locales']
+
+include('../branding-common.mozbuild')
+B2GBranding()
--- a/build/autoconf/nspr-build.m4
+++ b/build/autoconf/nspr-build.m4
@@ -28,17 +28,17 @@ MOZ_ARG_WITH_STRING(nspr-cflags,
     NSPR_CFLAGS=$withval)
 MOZ_ARG_WITH_STRING(nspr-libs,
 [  --with-nspr-libs=LIBS   Pass LIBS to LD when linking code that uses NSPR.
                           See --with-nspr-cflags for more details.],
     NSPR_LIBS=$withval)
 
 ifdef([CONFIGURING_JS],[
     MOZ_ARG_ENABLE_BOOL(nspr-build,
-[  --enable-nspr-build     Configure and build NSPR from source tree],
+[  --enable-nspr-build     Build NSPR from source tree],
         MOZ_BUILD_NSPR=1,
         MOZ_BUILD_NSPR=)
 ])
 
 if test -z "$BUILDING_JS" || test -n "$JS_STANDALONE"; then
   _IS_OUTER_CONFIGURE=1
 fi
 
@@ -182,77 +182,8 @@ if test -n "$MOZ_NATIVE_NSPR"; then
                 AC_MSG_ERROR([system NSPR does not support PR_STATIC_ASSERT]))
     CFLAGS=$_SAVE_CFLAGS
 fi
 AC_SUBST(NSPR_PKGCONF_CHECK)
 
 fi # _IS_OUTER_CONFIGURE
 
 ])
-
-AC_DEFUN([MOZ_SUBCONFIGURE_NSPR], [
-
-if test -z "$MOZ_NATIVE_NSPR"; then
-    ac_configure_args="$_SUBDIR_CONFIG_ARGS --with-dist-prefix=$MOZ_BUILD_ROOT/dist --with-mozilla"
-    if test -n "$MOZ_USING_CCACHE"; then
-        # Avoid double prepending ccache by omitting --with-ccache in building NSPR.
-        ac_configure_args="`echo $ac_configure_args | sed -e 's/--with-ccache[[^ ]]*//'`"
-    fi
-
-    if test -z "$MOZ_DEBUG"; then
-        ac_configure_args="$ac_configure_args --disable-debug"
-    else
-        ac_configure_args="$ac_configure_args --enable-debug"
-        if test -n "$MOZ_NO_DEBUG_RTL"; then
-            ac_configure_args="$ac_configure_args --disable-debug-rtl"
-        fi
-    fi
-    if test "$MOZ_OPTIMIZE" = "1"; then
-        ac_configure_args="$ac_configure_args --enable-optimize"
-    elif test -z "$MOZ_OPTIMIZE"; then
-        ac_configure_args="$ac_configure_args --disable-optimize"
-    fi
-    if test -n "$HAVE_64BIT_BUILD"; then
-        ac_configure_args="$ac_configure_args --enable-64bit"
-    fi
-    if test -n "$USE_ARM_KUSER"; then
-        ac_configure_args="$ac_configure_args --with-arm-kuser"
-    fi
-    # A configure script generated by autoconf 2.68 does not allow the cached
-    # values of "precious" variables such as CFLAGS and LDFLAGS to differ from
-    # the values passed to the configure script. Since we modify CFLAGS and
-    # LDFLAGS before passing them to NSPR's configure script, we cannot share
-    # config.cache with NSPR. As a result, we cannot pass AS, CC, CXX, etc. to
-    # NSPR via a shared config.cache file and must pass them to NSPR on the
-    # configure command line.
-    for var in AS CC CXX CPP LD AR RANLIB STRIP; do
-        ac_configure_args="$ac_configure_args $var='`eval echo \\${${var}}`'"
-    done
-    # A configure script generated by autoconf 2.68 warns if --host is
-    # specified but --build isn't. So we always pass --build to NSPR's
-    # configure script.
-    ac_configure_args="$ac_configure_args --build=$build"
-    ac_configure_args="$ac_configure_args $NSPR_CONFIGURE_ARGS"
-
-    # Save these, so we can mess with them for the subconfigure ..
-    _SAVE_CFLAGS="$CFLAGS"
-    _SAVE_CPPFLAGS="$CPPFLAGS"
-    _SAVE_LDFLAGS="$LDFLAGS"
-
-    if test -n "$MOZ_LINKER" -a "$ac_cv_func_dladdr" = no ; then
-      # dladdr is supported by the new linker, even when the system linker doesn't
-      # support it. Trick nspr into using dladdr when it's not supported.
-      export CPPFLAGS="-include $_topsrcdir/mozglue/linker/dladdr.h $CPPFLAGS"
-    fi
-    export LDFLAGS="$LDFLAGS $NSPR_LDFLAGS"
-    export CFLAGS="$CFLAGS $MOZ_FRAMEPTR_FLAGS $MOZ_FOLD_LIBS_FLAGS"
-
-    AC_OUTPUT_SUBDIRS(nsprpub)
-
-    # .. and restore them
-    CFLAGS="$_SAVE_CFLAGS"
-    CPPFLAGS="$_SAVE_CPPFLAGS"
-    LDFLAGS="$_SAVE_LDFLAGS"
-
-    ac_configure_args="$_SUBDIR_CONFIG_ARGS"
-fi
-
-])
deleted file mode 100644
--- a/config/external/nspr/Makefile.in
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-include $(topsrcdir)/config/rules.mk
-
-ifdef MOZ_BUILD_NSPR
-
-# Copy NSPR to the SDK
-
-ifdef MOZ_FOLD_LIBS
-# Trick the nspr build system into not building shared libraries.
-# bug #851869.
-EXTRA_MAKE_FLAGS := SHARED_LIBRARY= IMPORT_LIBRARY= SHARED_LIB_PDB=
-
-# Work around libVersionPoint conflict between all three libraries.
-# See bug #838566.
-EXTRA_MAKE_FLAGS += XP_DEFINE=-DlibVersionPoint='libVersionPoint$$(LIBRARY_NAME)'
-else
-# nspr's make export compiles and links everything, but linking can't happen
-# during export on platforms where nspr is linked against mozcrt/mozglue.
-export:: EXTRA_MAKE_FLAGS += SHARED_LIBRARY= IMPORT_LIBRARY= SHARED_LIB_PDB=
-endif
-
-MOZ_BUILDID := $(shell cat $(DEPTH)/config/buildid)
-
-# The NSPR build system uses build-time generated dates for public API
-# exposed data structures. Use the buildid as forced date, to avoid
-# having to deal with what changing NSPR itself might mean.
-
-# SH_DATE is a date with the format "%Y-%m-%d %T"
-EXTRA_MAKE_FLAGS += SH_DATE="$(shell $(PYTHON) -c 'd = "$(MOZ_BUILDID)"; print d[0:4]+"-"+d[4:6]+"-"+d[6:8]+" "+d[8:10]+":"+d[10:12]+":"+d[12:14]')"
-
-# SH_NOW is a date as a unix timestamp in ┬Áseconds
-EXTRA_MAKE_FLAGS += SH_NOW="$(shell $(PYTHON) -c 'import time, calendar; print calendar.timegm(time.strptime("$(MOZ_BUILDID)", "%Y%m%d%H%M%S"))')000000"
-
-clean distclean export::
-	$(MAKE) -C $(DEPTH)/nsprpub $@ $(EXTRA_MAKE_FLAGS)
-
-target::
-# nspr's libs and install rule re-export headers, and that can race with other
-# compilations, so use a separate directory here. The headers are exported
-# during export anyways.
-	$(MAKE) -C $(DEPTH)/nsprpub libs $(EXTRA_MAKE_FLAGS) dist_includedir=$(ABS_DIST)/nspr-include
-	$(MAKE) -C $(DEPTH)/nsprpub install prefix=$(ABS_DIST)/sdk exec_prefix=$(ABS_DIST)/sdk bindir=$(ABS_DIST)/sdk/dummy includedir=$(ABS_DIST)/nspr-include libdir=$(ABS_DIST)/sdk/lib datadir=$(ABS_DIST)/sdk/dummy DESTDIR= $(EXTRA_MAKE_FLAGS)
-	$(INSTALL) $(DEPTH)/nsprpub/config/nspr-config $(DIST)/sdk/bin
-	$(RM) -rf $(DIST)/sdk/dummy
-ifneq (,$(filter WINNT,$(OS_ARCH))) # {
-	$(RM) -f $(DIST)/sdk/lib/$(DLL_PREFIX)nspr4$(DLL_SUFFIX) $(DIST)/sdk/lib/$(DLL_PREFIX)plc4$(DLL_SUFFIX) $(DIST)/sdk/lib/$(DLL_PREFIX)plds4$(DLL_SUFFIX)
-	$(RM) -f $(DIST)/sdk/lib/$(LIB_PREFIX)nspr4_s.$(LIB_SUFFIX) $(DIST)/sdk/lib/$(LIB_PREFIX)plc4_s.$(LIB_SUFFIX) $(DIST)/sdk/lib/$(LIB_PREFIX)plds4_s.$(LIB_SUFFIX)
-else # } {
-	$(RM) -f $(DIST)/sdk/lib/$(LIB_PREFIX)nspr4.$(LIB_SUFFIX) $(DIST)/sdk/lib/$(LIB_PREFIX)plc4.$(LIB_SUFFIX) $(DIST)/sdk/lib/$(LIB_PREFIX)plds4.$(LIB_SUFFIX)
-endif # }
-
-endif
new file mode 100644
--- /dev/null
+++ b/config/external/nspr/_pl_bld.h
@@ -0,0 +1,6 @@
+/*
+ * This file was previously generated at build time to set some preprocessor
+ * macros for use by plvrsion.c, but that file will set the values to (empty)
+ * defaults if they're not set, so this is just a stub to avoid having to
+ * generate another header file at build time.
+ */
new file mode 100644
--- /dev/null
+++ b/config/external/nspr/_pr_bld.h
@@ -0,0 +1,6 @@
+/*
+ * This file was previously generated at build time to set some preprocessor
+ * macros for use by prvrsion.c, but that file will set the values to (empty)
+ * defaults if they're not set, so this is just a stub to avoid having to
+ * generate another header file at build time.
+ */
new file mode 100644
--- /dev/null
+++ b/config/external/nspr/ds/moz.build
@@ -0,0 +1,34 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+if CONFIG['MOZ_FOLD_LIBS']:
+    Library('plds4')
+else:
+    SharedLibrary('plds4')
+    SOURCES += ['/nsprpub/lib/ds/plvrsion.c']
+    USE_LIBS += ['nspr4']
+
+# We allow warnings for third-party code that can be updated from upstream.
+# TODO: fix NSPR warnings and remove this
+ALLOW_COMPILER_WARNINGS = True
+
+DEFINES['_NSPR_BUILD_'] = True
+
+LOCAL_INCLUDES += [
+    '/config/external/nspr',
+    '/nsprpub/pr/include',
+]
+
+EXPORTS.nspr += [
+    '/nsprpub/lib/ds/plarena.h',
+    '/nsprpub/lib/ds/plarenas.h',
+    '/nsprpub/lib/ds/plhash.h',
+]
+
+SOURCES += [
+    '/nsprpub/lib/ds/plarena.c',
+    '/nsprpub/lib/ds/plhash.c',
+]
new file mode 100644
--- /dev/null
+++ b/config/external/nspr/libc/moz.build
@@ -0,0 +1,45 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+if CONFIG['MOZ_FOLD_LIBS']:
+    Library('plc4')
+else:
+    SharedLibrary('plc4')
+    SOURCES += ['/nsprpub/lib/libc/src/plvrsion.c']
+    USE_LIBS += ['nspr4']
+
+# We allow warnings for third-party code that can be updated from upstream.
+# TODO: fix NSPR warnings and remove this
+ALLOW_COMPILER_WARNINGS = True
+
+DEFINES['_NSPR_BUILD_'] = True
+
+LOCAL_INCLUDES += [
+    '/config/external/nspr',
+]
+
+EXPORTS.nspr += [
+    '/nsprpub/lib/libc/include/plbase64.h',
+    '/nsprpub/lib/libc/include/plerror.h',
+    '/nsprpub/lib/libc/include/plgetopt.h',
+    '/nsprpub/lib/libc/include/plstr.h',
+]
+
+SOURCES += [
+    '/nsprpub/lib/libc/src/base64.c',
+    '/nsprpub/lib/libc/src/plerror.c',
+    '/nsprpub/lib/libc/src/plgetopt.c',
+    '/nsprpub/lib/libc/src/strcase.c',
+    '/nsprpub/lib/libc/src/strcat.c',
+    '/nsprpub/lib/libc/src/strchr.c',
+    '/nsprpub/lib/libc/src/strcmp.c',
+    '/nsprpub/lib/libc/src/strcpy.c',
+    '/nsprpub/lib/libc/src/strdup.c',
+    '/nsprpub/lib/libc/src/strlen.c',
+    '/nsprpub/lib/libc/src/strpbrk.c',
+    '/nsprpub/lib/libc/src/strstr.c',
+    '/nsprpub/lib/libc/src/strtok.c',
+]
--- a/config/external/nspr/moz.build
+++ b/config/external/nspr/moz.build
@@ -1,21 +1,28 @@
 # -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 Library('nspr')
 
-if CONFIG['MOZ_FOLD_LIBS']:
-    # When folding libraries, nspr is actually in the nss library.
-    USE_LIBS += [
-        'nss',
+if CONFIG['MOZ_BUILD_NSPR']:
+    DIRS += [
+        'pr',
+        'ds',
+        'libc',
     ]
-elif CONFIG['MOZ_BUILD_NSPR']:
-    USE_LIBS += [
-        '/nsprpub/lib/ds/plds4',
-        '/nsprpub/lib/libc/src/plc4',
-        '/nsprpub/pr/src/nspr4',
-    ]
+    if CONFIG['MOZ_FOLD_LIBS']:
+        # When folding libraries, nspr is actually in the nss library.
+        USE_LIBS += [
+            'nss',
+        ]
+    else:
+        USE_LIBS += [
+            'nspr4',
+            'plc4',
+            'plds4',
+        ]
+    EXPORTS.nspr += ['prcpucfg.h']
 else:
     OS_LIBS += CONFIG['NSPR_LIBS']
new file mode 100644
--- /dev/null
+++ b/config/external/nspr/pr/moz.build
@@ -0,0 +1,221 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+if CONFIG['MOZ_FOLD_LIBS']:
+    Library('nspr4')
+else:
+    SharedLibrary('nspr4')
+
+# We allow warnings for third-party code that can be updated from upstream.
+# TODO: fix NSPR warnings and remove this
+ALLOW_COMPILER_WARNINGS = True
+
+DEFINES['_NSPR_BUILD_'] = True
+if CONFIG['OS_ARCH'] == 'Linux':
+    OS_LIBS += CONFIG['REALTIME_LIBS']
+    DEFINES.update(
+        LINUX=True,
+        HAVE_FCNTL_FILE_LOCKING=True,
+        _GNU_SOURCE=True,
+    )
+    SOURCES += ['/nsprpub/pr/src/md/unix/linux.c']
+    if CONFIG['CPU_ARCH'] == 'x86_64':
+        SOURCES += ['/nsprpub/pr/src/md/unix/os_Linux_x86_64.s']
+    elif CONFIG['CPU_ARCH'] == 'x86':
+        DEFINES['i386'] = True
+        SOURCES += ['/nsprpub/pr/src/md/unix/os_Linux_x86.s']
+    elif CONFIG['CPU_ARCH'] == 'ppc':
+        SOURCES += ['/nsprpub/pr/src/md/unix/os_Linux_ppc.s']
+elif CONFIG['OS_TARGET'] == 'Darwin':
+    DEFINES.update(
+        DARWIN=True,
+        HAVE_BSD_FLOCK=True,
+        HAVE_SOCKLEN_T=True,
+    )
+    SOURCES += [
+        '/nsprpub/pr/src/md/unix/darwin.c',
+        '/nsprpub/pr/src/md/unix/os_Darwin.s',
+    ]
+    if not CONFIG['MOZ_IOS']:
+        DEFINES['HAVE_CRT_EXTERNS_H'] = True
+elif CONFIG['OS_TARGET'] == 'WINNT':
+    OS_LIBS += [
+        'advapi32',
+        'ws2_32',
+        'mswsock',
+        'winmm',
+    ]
+    DEFINES.update(
+        XP_PC=True,
+        WIN32=True,
+        # For historical reasons we use the WIN95 NSPR target instead of
+        # WINNT.
+        WIN95=True,
+        WINNT=False,
+        _PR_GLOBAL_THREADS_ONLY=True,
+    )
+    if CONFIG['CPU_ARCH'] == 'x86_64':
+        DEFINES['_AMD64_'] = True
+    else:
+        DEFINES['_X86_'] = True
+else:
+    error('Not a supported OS_TARGET for NSPR in moz.build: "%s". Use --with-system-nspr' % CONFIG['OS_TARGET'])
+
+
+LOCAL_INCLUDES += [
+    '/config/external/nspr',
+    '/nsprpub/pr/include',
+    '/nsprpub/pr/include/private',
+]
+
+SOURCES += [
+    '/nsprpub/pr/src/io/prfdcach.c',
+    '/nsprpub/pr/src/io/priometh.c',
+    '/nsprpub/pr/src/io/pripv6.c',
+    '/nsprpub/pr/src/io/prlayer.c',
+    '/nsprpub/pr/src/io/prlog.c',
+    '/nsprpub/pr/src/io/prmapopt.c',
+    '/nsprpub/pr/src/io/prmmap.c',
+    '/nsprpub/pr/src/io/prmwait.c',
+    '/nsprpub/pr/src/io/prpolevt.c',
+    '/nsprpub/pr/src/io/prprf.c',
+    '/nsprpub/pr/src/io/prscanf.c',
+    '/nsprpub/pr/src/io/prstdio.c',
+    '/nsprpub/pr/src/linking/prlink.c',
+    '/nsprpub/pr/src/malloc/prmalloc.c',
+    '/nsprpub/pr/src/malloc/prmem.c',
+    '/nsprpub/pr/src/md/prosdep.c',
+    '/nsprpub/pr/src/memory/prseg.c',
+    '/nsprpub/pr/src/memory/prshm.c',
+    '/nsprpub/pr/src/memory/prshma.c',
+    '/nsprpub/pr/src/misc/pralarm.c',
+    '/nsprpub/pr/src/misc/pratom.c',
+    '/nsprpub/pr/src/misc/praton.c',
+    '/nsprpub/pr/src/misc/prcountr.c',
+    '/nsprpub/pr/src/misc/prdtoa.c',
+    '/nsprpub/pr/src/misc/prenv.c',
+    '/nsprpub/pr/src/misc/prerr.c',
+    '/nsprpub/pr/src/misc/prerror.c',
+    '/nsprpub/pr/src/misc/prerrortable.c',
+    '/nsprpub/pr/src/misc/prinit.c',
+    '/nsprpub/pr/src/misc/prinrval.c',
+    '/nsprpub/pr/src/misc/pripc.c',
+    '/nsprpub/pr/src/misc/prlog2.c',
+    '/nsprpub/pr/src/misc/prlong.c',
+    '/nsprpub/pr/src/misc/prnetdb.c',
+    '/nsprpub/pr/src/misc/prolock.c',
+    '/nsprpub/pr/src/misc/prrng.c',
+    '/nsprpub/pr/src/misc/prsystem.c',
+    '/nsprpub/pr/src/misc/prthinfo.c',
+    '/nsprpub/pr/src/misc/prtime.c',
+    '/nsprpub/pr/src/misc/prtpool.c',
+    '/nsprpub/pr/src/misc/prtrace.c',
+    '/nsprpub/pr/src/threads/prcmon.c',
+    '/nsprpub/pr/src/threads/prrwlock.c',
+    '/nsprpub/pr/src/threads/prtpd.c',
+]
+
+if CONFIG['OS_TARGET'] != 'WINNT':
+    DEFINES['_PR_PTHREADS'] = True
+    SOURCES += [
+        '/nsprpub/pr/src/md/unix/unix.c',
+        '/nsprpub/pr/src/md/unix/unix_errors.c',
+        '/nsprpub/pr/src/md/unix/uxproces.c',
+        '/nsprpub/pr/src/md/unix/uxrng.c',
+        '/nsprpub/pr/src/md/unix/uxshm.c',
+        '/nsprpub/pr/src/md/unix/uxwrap.c',
+        '/nsprpub/pr/src/pthreads/ptio.c',
+        '/nsprpub/pr/src/pthreads/ptmisc.c',
+        '/nsprpub/pr/src/pthreads/ptsynch.c',
+        '/nsprpub/pr/src/pthreads/ptthread.c',
+    ]
+else:
+    SOURCES += [
+        '/nsprpub/pr/src/io/prdir.c',
+        '/nsprpub/pr/src/io/prfile.c',
+        '/nsprpub/pr/src/io/prio.c',
+        '/nsprpub/pr/src/io/prsocket.c',
+        '/nsprpub/pr/src/md/windows/ntgc.c',
+        '/nsprpub/pr/src/md/windows/ntinrval.c',
+        '/nsprpub/pr/src/md/windows/ntmisc.c',
+        '/nsprpub/pr/src/md/windows/ntsec.c',
+        '/nsprpub/pr/src/md/windows/ntsem.c',
+        '/nsprpub/pr/src/md/windows/w32ipcsem.c',
+        '/nsprpub/pr/src/md/windows/w32poll.c',
+        '/nsprpub/pr/src/md/windows/w32rng.c',
+        '/nsprpub/pr/src/md/windows/w32shm.c',
+        '/nsprpub/pr/src/md/windows/w95cv.c',
+        '/nsprpub/pr/src/md/windows/w95dllmain.c',
+        '/nsprpub/pr/src/md/windows/w95io.c',
+        '/nsprpub/pr/src/md/windows/w95sock.c',
+        '/nsprpub/pr/src/md/windows/w95thred.c',
+        '/nsprpub/pr/src/md/windows/win32_errors.c',
+        '/nsprpub/pr/src/misc/pripcsem.c',
+        '/nsprpub/pr/src/threads/combined/prucpu.c',
+        '/nsprpub/pr/src/threads/combined/prucv.c',
+        '/nsprpub/pr/src/threads/combined/prulock.c',
+        '/nsprpub/pr/src/threads/combined/prustack.c',
+        '/nsprpub/pr/src/threads/combined/pruthr.c',
+        '/nsprpub/pr/src/threads/prcthr.c',
+        '/nsprpub/pr/src/threads/prdump.c',
+        '/nsprpub/pr/src/threads/prmon.c',
+        '/nsprpub/pr/src/threads/prsem.c',
+    ]
+
+EXPORTS.nspr += [
+    '/nsprpub/pr/include/nspr.h',
+    '/nsprpub/pr/include/pratom.h',
+    '/nsprpub/pr/include/prbit.h',
+    '/nsprpub/pr/include/prclist.h',
+    '/nsprpub/pr/include/prcmon.h',
+    '/nsprpub/pr/include/prcountr.h',
+    '/nsprpub/pr/include/prcvar.h',
+    '/nsprpub/pr/include/prdtoa.h',
+    '/nsprpub/pr/include/prenv.h',
+    '/nsprpub/pr/include/prerr.h',
+    '/nsprpub/pr/include/prerror.h',
+    '/nsprpub/pr/include/prinet.h',
+    '/nsprpub/pr/include/prinit.h',
+    '/nsprpub/pr/include/prinrval.h',
+    '/nsprpub/pr/include/prio.h',
+    '/nsprpub/pr/include/pripcsem.h',
+    '/nsprpub/pr/include/prlink.h',
+    '/nsprpub/pr/include/prlock.h',
+    '/nsprpub/pr/include/prlog.h',
+    '/nsprpub/pr/include/prlong.h',
+    '/nsprpub/pr/include/prmem.h',
+    '/nsprpub/pr/include/prmon.h',
+    '/nsprpub/pr/include/prmwait.h',
+    '/nsprpub/pr/include/prnetdb.h',
+    '/nsprpub/pr/include/prolock.h',
+    '/nsprpub/pr/include/prpdce.h',
+    '/nsprpub/pr/include/prprf.h',
+    '/nsprpub/pr/include/prproces.h',
+    '/nsprpub/pr/include/prrng.h',
+    '/nsprpub/pr/include/prrwlock.h',
+    '/nsprpub/pr/include/prshm.h',
+    '/nsprpub/pr/include/prshma.h',
+    '/nsprpub/pr/include/prsystem.h',
+    '/nsprpub/pr/include/prthread.h',
+    '/nsprpub/pr/include/prtime.h',
+    '/nsprpub/pr/include/prtpool.h',
+    '/nsprpub/pr/include/prtrace.h',
+    '/nsprpub/pr/include/prtypes.h',
+    '/nsprpub/pr/include/prvrsion.h',
+    '/nsprpub/pr/include/prwin16.h',
+]
+
+EXPORTS.nspr.md += [
+    '/nsprpub/pr/include/md/_darwin.cfg',
+    '/nsprpub/pr/include/md/_linux.cfg',
+    '/nsprpub/pr/include/md/_win95.cfg',
+]
+
+EXPORTS.nspr.private += [
+    '/nsprpub/pr/include/private/pprio.h',
+    '/nsprpub/pr/include/private/pprthred.h',
+    '/nsprpub/pr/include/private/prpriv.h',
+]
new file mode 100644
--- /dev/null
+++ b/config/external/nspr/prcpucfg.h
@@ -0,0 +1,23 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef NSPR_PRCPUCFG_H_
+#define NSPR_PRCPUCFG_H_
+
+/*
+ * Need to support conditionals that are defined in both the top-level build
+ * system as well as NSS' build system for now.
+ */
+#if defined(XP_DARWIN) || defined(DARWIN)
+#include "md/_darwin.cfg"
+#elif defined(XP_WIN) || defined(_WINDOWS)
+#include "md/_win95.cfg"
+#elif defined(__linux__)
+#include "md/_linux.cfg"
+#else
+#error "Unsupported platform!"
+#endif
+
+#endif /* NSPR_PRCPUCFG_H_ */
--- a/config/external/nss/Makefile.in
+++ b/config/external/nss/Makefile.in
@@ -252,16 +252,20 @@ DEFAULT_GMAKE_FLAGS += MODULE_INCLUDES='
 
 # Work around NSS's MAKE_OBJDIR being racy. See bug #836220
 DEFAULT_GMAKE_FLAGS += MAKE_OBJDIR='$$(INSTALL) -D $$(OBJDIR)'
 
 # Work around NSS adding IMPORT_LIBRARY to TARGETS with no rule for
 # it, creating race conditions. See bug #836220
 DEFAULT_GMAKE_FLAGS += TARGETS='$$(LIBRARY) $$(SHARED_LIBRARY) $$(PROGRAM)'
 
+ifeq ($(MOZ_FOLD_LIBS),1)
+MOZ_FOLD_LIBS_FLAGS += -D_NSPR_BUILD_=1
+endif
+
 ifdef MOZ_FOLD_LIBS_FLAGS
 DEFAULT_GMAKE_FLAGS += XCFLAGS='$(MOZ_FOLD_LIBS_FLAGS)'
 endif
 
 ifndef WARNINGS_AS_ERRORS
 DEFAULT_GMAKE_FLAGS += NSS_ENABLE_WERROR=0
 endif
 ifeq ($(OS_TARGET),Android)
--- a/config/external/nss/moz.build
+++ b/config/external/nss/moz.build
@@ -11,27 +11,20 @@ if CONFIG['MOZ_NATIVE_NSS']:
     OS_LIBS += CONFIG['NSS_LIBS']
 elif CONFIG['MOZ_FOLD_LIBS']:
     GeckoSharedLibrary('nss', linkage=None)
     # TODO: The library name can be changed when bug 845217 is fixed.
     SHARED_LIBRARY_NAME = 'nss3'
 
     SDK_LIBRARY = True
 
-    # Normally, there should be /something/ to ensure nspr is built
-    # before this directory, but since nspr is built during "export",
-    # it actually doesn't matter.
-    if CONFIG['OS_TARGET'] == 'WINNT':
-        suffix = '_s'
-    else:
-        suffix = ''
     USE_LIBS += [
-        'static:/nsprpub/lib/ds/plds4%s' % suffix,
-        'static:/nsprpub/lib/libc/src/plc4%s' % suffix,
-        'static:/nsprpub/pr/src/nspr4%s' % suffix,
+        'nspr4',
+        'plc4',
+        'plds4',
     ]
 
     OS_LIBS += CONFIG['REALTIME_LIBS']
 
     SYMBOLS_FILE = 'nss.symbols'
 else:
     Library('nss')
     USE_LIBS += [
--- a/configure.in
+++ b/configure.in
@@ -939,17 +939,16 @@ AS='$(CC)'
 AS_DASH_C_FLAG='-c'
 DLL_PREFIX=lib
 LIB_PREFIX=lib
 DLL_SUFFIX=.so
 OBJ_SUFFIX=o
 LIB_SUFFIX=a
 ASM_SUFFIX=s
 IMPORT_LIB_SUFFIX=
-TARGET_MD_ARCH=unix
 DIRENT_INO=d_ino
 MOZ_USER_DIR=".mozilla"
 
 MOZ_FIX_LINK_PATHS="-Wl,-rpath-link,${DIST}/bin -Wl,-rpath-link,${prefix}/lib"
 
 MOZ_FS_LAYOUT=unix
 
 USE_DEPENDENT_LIBS=1
@@ -1838,17 +1837,16 @@ case "$host" in
         HOST_AR=lib
         HOST_AR_FLAGS='-NOLOGO -OUT:$@'
         HOST_CFLAGS="$HOST_CFLAGS -TC -nologo"
         HOST_RANLIB='echo ranlib'
     else
         HOST_CFLAGS="$HOST_CFLAGS -mwindows"
     fi
     HOST_CFLAGS="$HOST_CFLAGS -DXP_WIN32 -DXP_WIN -DWIN32 -D_WIN32 -DNO_X11 -D_CRT_SECURE_NO_WARNINGS"
-    HOST_NSPR_MDCPUCFG='"md/_winnt.cfg"'
     HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O2}"
     HOST_BIN_SUFFIX=.exe
     case "$host" in
     *mingw*)
         PERL="/bin/sh ${_topsrcdir}/build/msys-perl-wrapper"
         ;;
     esac
 
@@ -1864,23 +1862,21 @@ case "$host" in
         fi
         HOST_CFLAGS="$HOST_CFLAGS -D_AMD64_"
         ;;
     esac
     ;;
 
 *-darwin*)
     HOST_CFLAGS="$HOST_CFLAGS -DXP_UNIX -DXP_MACOSX -DNO_X11"
-    HOST_NSPR_MDCPUCFG='"md/_darwin.cfg"'
     HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O3}"
     ;;
 
 *-linux*|*-kfreebsd*-gnu|*-gnu*)
     HOST_CFLAGS="$HOST_CFLAGS -DXP_UNIX"
-    HOST_NSPR_MDCPUCFG='"md/_linux.cfg"'
     HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O3}"
     ;;
 
 *)
     HOST_CFLAGS="$HOST_CFLAGS -DXP_UNIX"
     HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O2}"
     ;;
 esac
@@ -2007,17 +2003,16 @@ case "$target" in
         AC_DEFINE(XP_MACOSX)
         AC_DEFINE(XP_DARWIN)
         _PLATFORM_DEFAULT_TOOLKIT='cairo-cocoa'
         # The ExceptionHandling framework is needed for Objective-C exception
         # logging code in nsObjCExceptions.h. Currently we only use that in debug
         # builds.
         MOZ_DEBUG_LDFLAGS="$MOZ_DEBUG_LDFLAGS -framework ExceptionHandling";
     fi
-    TARGET_NSPR_MDCPUCFG='\"md/_darwin.cfg\"'
 
     if test "x$lto_is_enabled" = "xyes"; then
         echo "Skipping -dead_strip because lto is enabled."
     dnl DTrace and -dead_strip don't interact well. See bug 403132.
     dnl ===================================================================
     elif test "x$enable_dtrace" = "xyes"; then
         echo "Skipping -dead_strip because DTrace is enabled. See bug 403132."
     else
@@ -2100,17 +2095,16 @@ ia64*-hpux*)
         MOZ_B2G_FM=1
         MOZ_SYNTH_PICO=1
     else
         _PLATFORM_DEFAULT_TOOLKIT=cairo-android
         if test "$COMPILE_ENVIRONMENT"; then
             MOZ_LINKER=1
         fi
     fi
-    TARGET_NSPR_MDCPUCFG='\"md/_linux.cfg\"'
 
     MOZ_GFX_OPTIMIZE_MOBILE=1
     MOZ_OPTIMIZE_FLAGS="-Os -fno-reorder-functions"
     if test -z "$CLANG_CC"; then
        MOZ_OPTIMIZE_FLAGS="-freorder-blocks $MOZ_OPTIMIZE_FLAGS"
     fi
     ;;
 
@@ -2124,18 +2118,16 @@ ia64*-hpux*)
     elif test "$GNU_CC" -o "$GNU_CXX"; then
         MOZ_PGO_OPTIMIZE_FLAGS="-O3"
         MOZ_OPTIMIZE_FLAGS="-Os"
         if test -z "$CLANG_CC"; then
            MOZ_OPTIMIZE_FLAGS="-freorder-blocks $MOZ_OPTIMIZE_FLAGS"
         fi
     fi
 
-    TARGET_NSPR_MDCPUCFG='\"md/_linux.cfg\"'
-
     MOZ_MEMORY=1
 
     case "${target_cpu}" in
     alpha*)
         CFLAGS="$CFLAGS -mieee"
         CXXFLAGS="$CXXFLAGS -mieee"
     ;;
     esac
@@ -2221,20 +2213,18 @@ ia64*-hpux*)
         WIN32_CONSOLE_EXE_LDFLAGS=-SUBSYSTEM:CONSOLE,$WIN32_SUBSYSTEM_VERSION
         WIN32_GUI_EXE_LDFLAGS=-SUBSYSTEM:WINDOWS,$WIN32_SUBSYSTEM_VERSION
         DSO_LDOPTS=-SUBSYSTEM:WINDOWS,$WIN32_SUBSYSTEM_VERSION
         _USE_CPP_INCLUDE_FLAG=1
         _DEFINES_CFLAGS='-FI $(topobjdir)/mozilla-config.h -DMOZILLA_CLIENT'
         _DEFINES_CXXFLAGS='-FI $(topobjdir)/mozilla-config.h -DMOZILLA_CLIENT'
         CFLAGS="$CFLAGS -W3 -Gy"
         CXXFLAGS="$CXXFLAGS -W3 -Gy"
-        if test "$CPU_ARCH" = "x86" -a -z "$CLANG_CL"; then
+        if test "$CPU_ARCH" = "x86"; then
             dnl VS2012+ defaults to -arch:SSE2.
-            dnl Clang-cl gets confused by -arch:IA32, so don't add it.
-            dnl (See https://llvm.org/bugs/show_bug.cgi?id=24335)
             CFLAGS="$CFLAGS -arch:IA32"
             CXXFLAGS="$CXXFLAGS -arch:IA32"
         fi
         dnl VS2013+ requires -FS when parallel building by make -jN.
         dnl If nothing, compiler sometimes causes C1041 error.
         CFLAGS="$CFLAGS -FS"
         CXXFLAGS="$CXXFLAGS -FS"
         # khuey says we can safely ignore MSVC warning C4251
@@ -2321,23 +2311,19 @@ ia64*-hpux*)
         CFLAGS="$CFLAGS -we4553"
         CXXFLAGS="$CXXFLAGS -we4553"
         LIBS="$LIBS kernel32.lib user32.lib gdi32.lib winmm.lib wsock32.lib advapi32.lib secur32.lib netapi32.lib"
         MOZ_DEBUG_LDFLAGS='-DEBUG -DEBUGTYPE:CV'
         WARNINGS_AS_ERRORS='-WX'
         MOZ_OPTIMIZE_FLAGS='-O1 -Oi'
         MOZ_FIX_LINK_PATHS=
         MOZ_COMPONENT_NSPR_LIBS='$(NSPR_LIBS)'
-        # Disable these flags on clang-cl since it doesn't ignore unknown arguments by default, and
-        # autoconf insists on passing $LDFLAGS to the compiler.
-        if test -z "$CLANG_CL"; then
-            LDFLAGS="$LDFLAGS -LARGEADDRESSAWARE -NXCOMPAT"
-            if test -z "$DEVELOPER_OPTIONS"; then
-                LDFLAGS="$LDFLAGS -RELEASE"
-            fi
+        LDFLAGS="$LDFLAGS -LARGEADDRESSAWARE -NXCOMPAT"
+        if test -z "$DEVELOPER_OPTIONS"; then
+            LDFLAGS="$LDFLAGS -RELEASE"
         fi
         dnl For profile-guided optimization
         PROFILE_GEN_CFLAGS="-GL"
         PROFILE_GEN_LDFLAGS="-LTCG:PGINSTRUMENT"
         dnl XXX: PGO builds can fail with warnings treated as errors,
         dnl specifically "no profile data available" appears to be
         dnl treated as an error sometimes. This might be a consequence
         dnl of using WARNINGS_AS_ERRORS in some modules, combined
@@ -2368,24 +2354,20 @@ ia64*-hpux*)
     AC_DEFINE(WIN32)
     AC_DEFINE(XP_WIN)
     AC_DEFINE(XP_WIN32)
     AC_DEFINE(HW_THREADS)
     AC_DEFINE(STDC_HEADERS)
     AC_DEFINE(WIN32_LEAN_AND_MEAN)
     dnl See http://support.microsoft.com/kb/143208 to use STL
     AC_DEFINE(NOMINMAX)
-    TARGET_MD_ARCH=win32
     _PLATFORM_DEFAULT_TOOLKIT='cairo-windows'
     BIN_SUFFIX='.exe'
     MOZ_USER_DIR="Mozilla"
 
-    dnl Hardcode to win95 for now - cls
-    TARGET_NSPR_MDCPUCFG='\"md/_win95.cfg\"'
-
     dnl set NO_X11 defines here as the general check is skipped on win32
     no_x=yes
     AC_DEFINE(NO_X11)
 
     case "$host" in
     *-mingw*)
         if test -n "$L10NBASEDIR"; then
             L10NBASEDIR=`cd $L10NBASEDIR && pwd -W`
@@ -2406,21 +2388,17 @@ ia64*-hpux*)
         fi
 
         if test -n "$GNU_CC"; then
             CFLAGS="$CFLAGS -mstackrealign -fno-keep-inline-dllexport"
             CXXFLAGS="$CXXFLAGS -mstackrealign -fno-keep-inline-dllexport"
             LDFLAGS="$LDFLAGS -Wl,--enable-stdcall-fixup -Wl,--large-address-aware"
         else
             DSO_LDOPTS="$DSO_LDOPTS -MACHINE:X86"
-            # Disable this flag on clang-cl since it doesn't ignore unknown arguments by default, and
-            # autoconf insists on passing $LDFLAGS to the compiler.
-            if test -z "$CLANG_CL"; then
-                LDFLAGS="$LDFLAGS -SAFESEH"
-            fi
+            LDFLAGS="$LDFLAGS -SAFESEH"
         fi
 
         AC_DEFINE(_X86_)
         ;;
     x86_64-*)
         if test -z "$HAVE_64BIT_BUILD"; then
             AC_MSG_ERROR([You are targeting 64-bit but using the 32-bit compiler.])
         fi
@@ -2472,17 +2450,16 @@ ia64*-hpux*)
     DSO_LDOPTS='-shared -fPIC'
     if test "$LIBRUNPATH"; then
         DSO_LDOPTS="-R$LIBRUNPATH $DSO_LDOPTS"
     fi
     ;;
 
 *-solaris*)
     AC_DEFINE(SOLARIS)
-    TARGET_NSPR_MDCPUCFG='\"md/_solaris.cfg\"'
     MOZ_FIX_LINK_PATHS=
     # $ORIGIN/.. is for shared libraries under components/ to locate shared
     # libraries one level up (e.g. libnspr4.so)
     if test "$SOLARIS_SUNPRO_CC"; then
        LDFLAGS="$LDFLAGS -z ignore -R '\$\$ORIGIN:\$\$ORIGIN/..' -z lazyload -z combreloc -z muldefs"
        LIBS="-lCrun -lCstd -lc $LIBS"
        AC_DEFINE(NSCAP_DISABLE_DEBUG_PTR_TYPES)
        CFLAGS="$CFLAGS -xlibmieee -xstrconst -xbuiltin=%all -D__FUNCTION__=__func__"
@@ -3001,17 +2978,17 @@ then
     MOZ_CHECK_HEADERS(pthread.h)
 fi
 
 
 dnl Checks for library functions.
 dnl ========================================================
 AC_PROG_GCC_TRADITIONAL
 AC_FUNC_MEMCMP
-AC_CHECK_FUNCS(stat64 lstat64 truncate64 statvfs64 statvfs statfs64 statfs getpagesize gmtime_r localtime_r arc4random arc4random_buf mallinfo)
+AC_CHECK_FUNCS(stat64 lstat64 truncate64 statvfs64 statvfs statfs64 statfs getpagesize gmtime_r localtime_r arc4random arc4random_buf mallinfo gettid lchown setpriority strerror syscall)
 
 dnl check for clock_gettime(), the CLOCK_MONOTONIC clock
 AC_CACHE_CHECK(for clock_gettime(CLOCK_MONOTONIC),
                ac_cv_clock_monotonic,
                [for libs in "" -lrt; do
                     _SAVE_LIBS="$LIBS"
                     LIBS="$LIBS $libs"
                     AC_TRY_LINK([#include <time.h>],
@@ -8849,25 +8826,22 @@ AC_SUBST(HOST_CXX)
 AC_SUBST(HOST_CFLAGS)
 AC_SUBST(HOST_CXXFLAGS)
 AC_SUBST(HOST_LDFLAGS)
 AC_SUBST(HOST_OPTIMIZE_FLAGS)
 AC_SUBST(HOST_AR)
 AC_SUBST(HOST_AR_FLAGS)
 AC_SUBST(HOST_LD)
 AC_SUBST(HOST_RANLIB)
-AC_SUBST(HOST_NSPR_MDCPUCFG)
 AC_SUBST(HOST_BIN_SUFFIX)
 AC_SUBST(HOST_OS_ARCH)
 
 AC_SUBST(TARGET_CPU)
 AC_SUBST(TARGET_VENDOR)
 AC_SUBST(TARGET_OS)
-AC_SUBST(TARGET_NSPR_MDCPUCFG)
-AC_SUBST(TARGET_MD_ARCH)
 AC_SUBST(TARGET_XPCOM_ABI)
 AC_SUBST(OS_TARGET)
 AC_SUBST(OS_ARCH)
 AC_SUBST(OS_RELEASE)
 AC_SUBST(OS_TEST)
 AC_SUBST(CPU_ARCH)
 AC_SUBST(INTEL_ARCHITECTURE)
 AC_SUBST(HAVE_TOOLCHAIN_SUPPORT_MSSSE3)
@@ -9161,18 +9135,16 @@ if test -n "$_subconfigure_subdir"; then
   ac_configure_args="$_save_ac_configure_args"
   srcdir="$_save_srcdir"
 fi
 
 if test "$COMPILE_ENVIRONMENT"; then
 
 export WRAP_LDFLAGS
 
-MOZ_SUBCONFIGURE_NSPR()
-
 dnl ========================================================
 dnl = Setup a nice relatively clean build environment for
 dnl = sub-configures.
 dnl ========================================================
 CC="$_SUBDIR_CC"
 CXX="$_SUBDIR_CXX"
 CFLAGS="$_SUBDIR_CFLAGS"
 CPPFLAGS="$_SUBDIR_CPPFLAGS"
--- a/dom/base/nsDOMWindowUtils.cpp
+++ b/dom/base/nsDOMWindowUtils.cpp
@@ -2727,18 +2727,18 @@ nsDOMWindowUtils::IsPartOfOpaqueLayer(ns
   nsCOMPtr<nsIContent> content = do_QueryInterface(aElement, &rv);
   NS_ENSURE_SUCCESS(rv, rv);
 
   nsIFrame* frame = content->GetPrimaryFrame();
   if (!frame) {
     return NS_ERROR_FAILURE;
   }
 
-  Layer* layer = FrameLayerBuilder::GetDebugSingleOldLayerForFrame(frame);
-  if (!layer || !layer->AsPaintedLayer()) {
+  PaintedLayer* layer = FrameLayerBuilder::GetDebugSingleOldPaintedLayerForFrame(frame);
+  if (!layer) {
     return NS_ERROR_FAILURE;
   }
 
   *aResult = (layer->GetContentFlags() & Layer::CONTENT_OPAQUE);
   return NS_OK;
 }
 
 NS_IMETHODIMP
@@ -2756,22 +2756,22 @@ nsDOMWindowUtils::NumberOfAssignedPainte
     nsCOMPtr<nsIContent> content = do_QueryInterface(aElements[i], &rv);
     NS_ENSURE_SUCCESS(rv, rv);
 
     nsIFrame* frame = content->GetPrimaryFrame();
     if (!frame) {
       return NS_ERROR_FAILURE;
     }
 
-    Layer* layer = FrameLayerBuilder::GetDebugSingleOldLayerForFrame(frame);
-    if (!layer || !layer->AsPaintedLayer()) {
+    PaintedLayer* layer = FrameLayerBuilder::GetDebugSingleOldPaintedLayerForFrame(frame);
+    if (!layer) {
       return NS_ERROR_FAILURE;
     }
 
-    layers.PutEntry(layer->AsPaintedLayer());
+    layers.PutEntry(layer);
   }
 
   *aResult = layers.Count();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsDOMWindowUtils::EnableDialogs()
--- a/dom/base/nsObjectLoadingContent.cpp
+++ b/dom/base/nsObjectLoadingContent.cpp
@@ -1522,16 +1522,17 @@ nsObjectLoadingContent::ShouldRewriteYou
   if (!StringBeginsWith(path, NS_LITERAL_CSTRING("/v/"))) {
     return false;
   }
 
   // See if requester is planning on using the JS API.
   nsAutoCString uri;
   aURI->GetSpec(uri);
   if (uri.Find("enablejsapi=1", true, 0, -1) != kNotFound) {
+    Telemetry::Accumulate(Telemetry::YOUTUBE_NONREWRITABLE_EMBED_SEEN, 1);
     return false;
   }
 
   // If we've made it this far, we've got a rewritable embed. Log it in
   // telemetry.
   Telemetry::Accumulate(Telemetry::YOUTUBE_REWRITABLE_EMBED_SEEN, 1);
 
   // Even if node is rewritable, only rewrite if the pref tells us we should.
--- a/dom/crypto/test/test_WebCrypto_PBKDF2.html
+++ b/dom/crypto/test/test_WebCrypto_PBKDF2.html
@@ -146,17 +146,17 @@ TestArray.addTest(
       .then(doDerive)
       .then(complete(that, function (x) {
         return hasKeyFields(x) && x.algorithm.length == 128;
       }), error(that));
   }
 );
 
 // -----------------------------------------------------------------------------
-/*TestArray.addTest(
+TestArray.addTest(
   "Import raw PBKDF2 key and derive bits using HMAC-SHA-256",
   function() {
     var that = this;
     var alg = "PBKDF2";
     var key = tv.pbkdf2_sha256.password;
 
     function doDerive(x) {
       if (!hasKeyFields(x)) {
@@ -168,21 +168,21 @@ TestArray.addTest(
         hash: "SHA-256",
         salt: tv.pbkdf2_sha256.salt,
         iterations: tv.pbkdf2_sha256.iterations
       };
       return crypto.subtle.deriveBits(alg, x, tv.pbkdf2_sha256.length);
     }
     function fail(x) { console.log("failing"); error(that)(x); }
 
-    crypto.subtle.importKey("raw", key, alg, false, ["deriveKey"])
+    crypto.subtle.importKey("raw", key, alg, false, ["deriveBits"])
       .then( doDerive, fail )
       .then( memcmp_complete(that, tv.pbkdf2_sha256.derived), fail );
   }
-);*/
+);
 /*]]>*/</script>
 </head>
 
 <body>
 
 <div id="content">
 	<div id="head">
 		<b>Web</b>Crypto<br>
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -785,16 +785,17 @@ void HTMLMediaElement::NoSupportedMediaS
 {
   NS_ASSERTION(mNetworkState == NETWORK_LOADING,
                "Not loading during source selection?");
 
   mError = new MediaError(this, nsIDOMMediaError::MEDIA_ERR_SRC_NOT_SUPPORTED);
   ChangeNetworkState(nsIDOMHTMLMediaElement::NETWORK_NO_SOURCE);
   DispatchAsyncEvent(NS_LITERAL_STRING("error"));
   ChangeDelayLoadStatus(false);
+  UpdateAudioChannelPlayingState();
 }
 
 typedef void (HTMLMediaElement::*SyncSectionFn)();
 
 // Runs a "synchronous section", a function that must run once the event loop
 // has reached a "stable state". See:
 // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#synchronous-section
 class nsSyncSection : public nsMediaEvent
@@ -3511,16 +3512,17 @@ void HTMLMediaElement::Error(uint16_t aE
   DispatchAsyncEvent(NS_LITERAL_STRING("error"));
   if (mReadyState == nsIDOMHTMLMediaElement::HAVE_NOTHING) {
     ChangeNetworkState(nsIDOMHTMLMediaElement::NETWORK_EMPTY);
     DispatchAsyncEvent(NS_LITERAL_STRING("emptied"));
   } else {
     ChangeNetworkState(nsIDOMHTMLMediaElement::NETWORK_IDLE);
   }
   ChangeDelayLoadStatus(false);
+  UpdateAudioChannelPlayingState();
 }
 
 void HTMLMediaElement::PlaybackEnded()
 {
   // We changed state which can affect AddRemoveSelfReference
   AddRemoveSelfReference();
 
   NS_ASSERTION(!mDecoder || mDecoder->IsEndedOrShutdown(),
@@ -4725,16 +4727,21 @@ HTMLMediaElement::MaybeCreateAudioChanne
 bool
 HTMLMediaElement::IsPlayingThroughTheAudioChannel() const
 {
   // Are we paused or muted
   if (mPaused || Muted()) {
     return false;
   }
 
+  // If we have an error, we are not playing.
+  if (mError) {
+    return false;
+  }
+
   // If this element doesn't have any audio tracks.
   if (!HasAudio()) {
     return false;
   }
 
   // The volume should not be ~0
   if (std::fabs(Volume()) <= 1e-7) {
     return false;
--- a/dom/ipc/ContentParent.cpp
+++ b/dom/ipc/ContentParent.cpp
@@ -2378,16 +2378,17 @@ ContentParent::InitializeMembers()
   mSendDataStoreInfos = false;
   mCalledClose = false;
   mCalledCloseWithError = false;
   mCalledKillHard = false;
   mCreatedPairedMinidumps = false;
   mShutdownPending = false;
   mIPCOpen = true;
   mHangMonitorActor = nullptr;
+  mHasGamepadListener = false;
 }
 
 bool
 ContentParent::LaunchSubprocess(ProcessPriority aInitialPriority /* = PROCESS_PRIORITY_FOREGROUND */)
 {
   PROFILER_LABEL_FUNC(js::ProfileEntry::Category::OTHER);
 
   std::vector<std::string> extraArgs;
@@ -2421,17 +2422,16 @@ ContentParent::ContentParent(mozIApplica
                              ContentParent* aOpener,
                              bool aIsForBrowser,
                              bool aIsForPreallocated,
                              bool aIsNuwaProcess /* = false */)
   : nsIContentParent()
   , mOpener(aOpener)
   , mIsForBrowser(aIsForBrowser)
   , mIsNuwaProcess(aIsNuwaProcess)
-  , mHasGamepadListener(false)
 {
   InitializeMembers();  // Perform common initialization.
 
   // No more than one of !!aApp, aIsForBrowser, aIsForPreallocated should be
   // true.
   MOZ_ASSERT(!!aApp + aIsForBrowser + aIsForPreallocated <= 1);
 
   // Only the preallocated process uses Nuwa.
--- a/dom/push/PushNotifier.cpp
+++ b/dom/push/PushNotifier.cpp
@@ -126,17 +126,17 @@ PushNotifier::NotifyPushWorkers(const ns
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
     return swm->SendPushEvent(originSuffix, aScope, aData);
   }
 
   // Otherwise, we're in the parent and e10s is enabled. Broadcast the event
   // to all content processes.
-  bool ok = false;
+  bool ok = true;
   nsTArray<ContentParent*> contentActors;
   ContentParent::GetAll(contentActors);
   for (uint32_t i = 0; i < contentActors.Length(); ++i) {
     if (aData) {
       ok &= contentActors[i]->SendPushWithData(PromiseFlatCString(aScope),
         IPC::Principal(aPrincipal), aData.ref());
     } else {
       ok &= contentActors[i]->SendPush(PromiseFlatCString(aScope),
@@ -164,17 +164,17 @@ PushNotifier::NotifySubscriptionChangeWo
     nsresult rv = aPrincipal->GetOriginSuffix(originSuffix);
     if (NS_WARN_IF(NS_FAILED(rv))) {
       return rv;
     }
     return swm->SendPushSubscriptionChangeEvent(originSuffix, aScope);
   }
 
   // Parent process, e10s enabled.
-  bool ok = false;
+  bool ok = true;
   nsTArray<ContentParent*> contentActors;
   ContentParent::GetAll(contentActors);
   for (uint32_t i = 0; i < contentActors.Length(); ++i) {
     ok &= contentActors[i]->SendPushSubscriptionChange(
       PromiseFlatCString(aScope), IPC::Principal(aPrincipal));
   }
   return ok ? NS_OK : NS_ERROR_FAILURE;
 }
new file mode 100644
--- /dev/null
+++ b/js/src/asmjs/Wasm.cpp
@@ -0,0 +1,556 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: set ts=8 sts=4 et sw=4 tw=99:
+ *
+ * Copyright 2015 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "asmjs/Wasm.h"
+
+#include "asmjs/WasmGenerator.h"
+#include "asmjs/WasmText.h"
+
+using namespace js;
+using namespace js::wasm;
+
+typedef Handle<WasmModuleObject*> HandleWasmModule;
+typedef MutableHandle<WasmModuleObject*> MutableHandleWasmModule;
+
+/*****************************************************************************/
+// reporting
+
+static bool
+Fail(JSContext* cx, const char* str)
+{
+    JS_ReportErrorNumber(cx, GetErrorMessage, nullptr, JSMSG_WASM_FAIL, str);
+    return false;
+}
+
+static bool
+Fail(JSContext* cx, Decoder& d, const char* str)
+{
+    uint32_t offset = d.currentOffset();
+    char offsetStr[sizeof "4294967295"];
+    JS_snprintf(offsetStr, sizeof offsetStr, "%" PRIu32, offset);
+    JS_ReportErrorNumber(cx, GetErrorMessage, nullptr, JSMSG_WASM_DECODE_FAIL, offsetStr, str);
+    return false;
+}
+
+/*****************************************************************************/
+// wasm function body validation
+
+class FunctionDecoder
+{
+    JSContext* cx_;
+    Decoder& d_;
+    ModuleGenerator& mg_;
+    FunctionGenerator& fg_;
+    uint32_t funcIndex_;
+
+  public:
+    FunctionDecoder(JSContext* cx, Decoder& d, ModuleGenerator& mg, FunctionGenerator& fg,
+                    uint32_t funcIndex)
+      : cx_(cx), d_(d), mg_(mg), fg_(fg), funcIndex_(funcIndex)
+    {}
+    JSContext* cx() const { return cx_; }
+    Decoder& d() const { return d_; }
+    ModuleGenerator& mg() const { return mg_; }
+    FunctionGenerator& fg() const { return fg_; }
+    uint32_t funcIndex() const { return funcIndex_; }
+    ExprType ret() const { return mg_.funcSig(funcIndex_).ret(); }
+
+    bool fail(const char* str) {
+        return Fail(cx_, d_, str);
+    }
+};
+
+static bool
+CheckType(FunctionDecoder& f, ExprType actual, ExprType expected)
+{
+    if (actual == expected || expected == ExprType::Void)
+        return true;
+
+    return f.fail("type mismatch");
+}
+
+static bool
+DecodeExpr(FunctionDecoder& f, ExprType expected)
+{
+    Expr expr;
+    if (!f.d().readExpr(&expr))
+        return f.fail("unable to read expression");
+
+    switch (expr) {
+      case Expr::Nop:
+        return CheckType(f, ExprType::Void, expected);
+      case Expr::I32Const:
+        if (!f.d().readVarU32())
+            return f.fail("unable to read i32.const immediate");
+        return CheckType(f, ExprType::I32, expected);
+      default:
+        break;
+    }
+
+    return f.fail("bad expression code");
+}
+
+static bool
+DecodeFuncBody(JSContext* cx, Decoder& d, ModuleGenerator& mg, FunctionGenerator& fg,
+               uint32_t funcIndex)
+{
+    const uint8_t* bodyBegin = d.currentPosition();
+
+    FunctionDecoder f(cx, d, mg, fg, funcIndex);
+    if (!DecodeExpr(f, f.ret()))
+        return false;
+
+    const uint8_t* bodyEnd = d.currentPosition();
+    uintptr_t bodyLength = bodyEnd - bodyBegin;
+    if (!fg.bytecode().resize(bodyLength))
+        return false;
+
+    PodCopy(fg.bytecode().begin(), bodyBegin, bodyLength);
+    return true;
+}
+
+/*****************************************************************************/
+// wasm decoding and generation
+
+static bool
+DecodeSignatureSection(JSContext* cx, Decoder& d, ModuleGeneratorData* init)
+{
+    if (!d.readCStringIf(SigSection))
+        return true;
+
+    uint32_t sectionStart;
+    if (!d.startSection(&sectionStart))
+        return Fail(cx, d, "expected decl section byte size");
+
+    uint32_t numSigs;
+    if (!d.readVarU32(&numSigs))
+        return Fail(cx, d, "expected number of declarations");
+
+    if (!init->sigs.resize(numSigs))
+        return false;
+
+    for (uint32_t sigIndex = 0; sigIndex < numSigs; sigIndex++) {
+        uint32_t numArgs;
+        if (!d.readVarU32(&numArgs))
+            return Fail(cx, d, "bad number of signature args");
+
+        ExprType result;
+        if (!d.readExprType(&result))
+            return Fail(cx, d, "bad result type");
+
+        ValTypeVector args;
+        if (!args.resize(numArgs))
+            return false;
+
+        for (uint32_t i = 0; i < numArgs; i++) {
+            if (!d.readValType(&args[i]))
+                return Fail(cx, d, "bad arg type");
+        }
+
+        init->sigs[sigIndex] = Sig(Move(args), result);
+    }
+
+    if (!d.finishSection(sectionStart))
+        return Fail(cx, d, "decls section byte size mismatch");
+
+    return true;
+}
+
+static bool
+DecodeDeclarationSection(JSContext* cx, Decoder& d, ModuleGeneratorData* init)
+{
+    if (!d.readCStringIf(DeclSection))
+        return true;
+
+    uint32_t sectionStart;
+    if (!d.startSection(&sectionStart))
+        return Fail(cx, d, "expected decl section byte size");
+
+    uint32_t numDecls;
+    if (!d.readVarU32(&numDecls))
+        return Fail(cx, d, "expected number of declarations");
+
+    if (!init->funcSigs.resize(numDecls))
+        return false;
+
+    for (uint32_t i = 0; i < numDecls; i++) {
+        uint32_t sigIndex;
+        if (!d.readVarU32(&sigIndex))
+            return Fail(cx, d, "expected declaration signature index");
+
+        if (sigIndex > init->sigs.length())
+            return Fail(cx, d, "declaration signature index out of range");
+
+        init->funcSigs[i] = &init->sigs[sigIndex];
+    }
+
+    if (!d.finishSection(sectionStart))
+        return Fail(cx, d, "decls section byte size mismatch");
+
+    return true;
+}
+
+static bool
+DecodeExport(JSContext* cx, Decoder& d, ModuleGenerator& mg, ExportMap* exportMap)
+{
+    if (!d.readCStringIf(FuncSubsection))
+        return Fail(cx, d, "expected 'func' tag");
+
+    uint32_t funcIndex;
+    if (!d.readVarU32(&funcIndex))
+        return Fail(cx, d, "expected export internal index");
+
+    if (funcIndex >= mg.numFuncSigs())
+        return Fail(cx, d, "export function index out of range");
+
+    uint32_t exportIndex;
+    if (!mg.declareExport(funcIndex, &exportIndex))
+        return false;
+
+    MOZ_ASSERT(exportIndex <= exportMap->exportNames.length());
+    if (exportIndex == exportMap->exportNames.length()) {
+        UniqueChars funcName(JS_smprintf("%u", unsigned(funcIndex)));
+        if (!funcName || !exportMap->exportNames.emplaceBack(Move(funcName)))
+            return false;
+    }
+
+    if (!exportMap->fieldsToExports.append(exportIndex))
+        return false;
+
+    const char* chars;
+    if (!d.readCString(&chars))
+        return Fail(cx, d, "expected export external name string");
+
+    return exportMap->fieldNames.emplaceBack(DuplicateString(chars));
+}
+
+typedef HashSet<const char*, CStringHasher> CStringSet;
+
+static bool
+DecodeExportsSection(JSContext* cx, Decoder& d, ModuleGenerator& mg, ExportMap* exportMap)
+{
+    if (!d.readCStringIf(ExportSection))
+        return true;
+
+    uint32_t sectionStart;
+    if (!d.startSection(&sectionStart))
+        return Fail(cx, d, "expected export section byte size");
+
+    uint32_t numExports;
+    if (!d.readVarU32(&numExports))
+        return Fail(cx, d, "expected number of exports");
+
+    for (uint32_t i = 0; i < numExports; i++) {
+        if (!DecodeExport(cx, d, mg, exportMap))
+            return false;
+    }
+
+    if (!d.finishSection(sectionStart))
+        return Fail(cx, d, "export section byte size mismatch");
+
+    CStringSet dupSet(cx);
+    if (!dupSet.init())
+        return false;
+    for (const UniqueChars& prevName : exportMap->fieldNames) {
+        CStringSet::AddPtr p = dupSet.lookupForAdd(prevName.get());
+        if (p)
+            return Fail(cx, d, "duplicate export");
+        if (!dupSet.add(p, prevName.get()))
+            return false;
+    }
+
+    return true;
+}
+
+static bool
+DecodeFunc(JSContext* cx, Decoder& d, ModuleGenerator& mg, uint32_t funcIndex)
+{
+    int64_t before = PRMJ_Now();
+
+    FunctionGenerator fg;
+    if (!mg.startFuncDef(d.currentOffset(), &fg))
+        return false;
+
+    if (!d.readCStringIf(FuncSubsection))
+        return Fail(cx, d, "expected 'func' tag");
+
+    uint32_t sectionStart;
+    if (!d.startSection(&sectionStart))
+        return Fail(cx, d, "expected func section byte size");
+
+    if (!DecodeFuncBody(cx, d, mg, fg, funcIndex))
+        return false;
+
+    if (!d.finishSection(sectionStart))
+        return Fail(cx, d, "func section byte size mismatch");
+
+    int64_t after = PRMJ_Now();
+    unsigned generateTime = (after - before) / PRMJ_USEC_PER_MSEC;
+
+    return mg.finishFuncDef(funcIndex, generateTime, &fg);
+}
+
+static bool
+DecodeCodeSection(JSContext* cx, Decoder& d, ModuleGenerator& mg)
+{
+    if (!mg.startFuncDefs())
+        return false;
+
+    uint32_t funcIndex = 0;
+    while (d.readCStringIf(CodeSection)) {
+        uint32_t sectionStart;
+        if (!d.startSection(&sectionStart))
+            return Fail(cx, d, "expected code section byte size");
+
+        uint32_t numFuncs;
+        if (!d.readVarU32(&numFuncs))
+            return Fail(cx, d, "expected number of functions");
+
+        if (funcIndex + numFuncs > mg.numFuncSigs())
+            return Fail(cx, d, "more function definitions than declarations");
+
+        for (uint32_t i = 0; i < numFuncs; i++) {
+            if (!DecodeFunc(cx, d, mg, funcIndex++))
+                return false;
+        }
+
+        if (!d.finishSection(sectionStart))
+            return Fail(cx, d, "code section byte size mismatch");
+    }
+
+    if (!mg.finishFuncDefs())
+        return false;
+
+    return true;
+}
+
+static bool
+DecodeUnknownSection(JSContext* cx, Decoder& d)
+{
+    const char* unused;
+    if (!d.readCString(&unused))
+        return Fail(cx, d, "failed to read section name");
+
+    if (!d.skipSection())
+        return Fail(cx, d, "unable to skip unknown section");
+
+    return true;
+}
+
+static bool
+DecodeModule(JSContext* cx, UniqueChars filename, const uint8_t* bytes, uint32_t length,
+             MutableHandle<WasmModuleObject*> moduleObj, ExportMap* exportMap)
+{
+    Decoder d(bytes, bytes + length);
+
+    uint32_t u32;
+    if (!d.readU32(&u32) || u32 != MagicNumber)
+        return Fail(cx, d, "failed to match magic number");
+
+    if (!d.readU32(&u32) || u32 != EncodingVersion)
+        return Fail(cx, d, "failed to match binary version");
+
+    UniqueModuleGeneratorData init = MakeUnique<ModuleGeneratorData>();
+    if (!init)
+        return false;
+
+    if (!DecodeSignatureSection(cx, d, init.get()))
+        return false;
+
+    if (!DecodeDeclarationSection(cx, d, init.get()))
+        return false;
+
+    ModuleGenerator mg(cx);
+    if (!mg.init(Move(init)))
+        return false;
+
+    if (!DecodeExportsSection(cx, d, mg, exportMap))
+        return false;
+
+    HeapUsage heapUsage = HeapUsage::None;
+
+    if (!DecodeCodeSection(cx, d, mg))
+        return false;
+
+    CacheableCharsVector funcNames;
+
+    while (!d.readCStringIf(EndSection)) {
+        if (!DecodeUnknownSection(cx, d))
+            return false;
+    }
+
+    if (!d.done())
+        return Fail(cx, d, "failed to consume all bytes of module");
+
+    UniqueModuleData module;
+    UniqueStaticLinkData link;
+    SlowFunctionVector slowFuncs(cx);
+    if (!mg.finish(heapUsage, Move(filename), Move(funcNames), &module, &link, &slowFuncs))
+        return false;
+
+    moduleObj.set(WasmModuleObject::create(cx));
+    if (!moduleObj)
+        return false;
+
+    if (!moduleObj->init(cx->new_<Module>(Move(module))))
+        return false;
+
+    return moduleObj->module().staticallyLink(cx, *link);
+}
+
+/*****************************************************************************/
+// JS entry poitns
+
+static bool
+WasmEval(JSContext* cx, unsigned argc, Value* vp)
+{
+    CallArgs args = CallArgsFromVp(argc, vp);
+    RootedObject callee(cx, &args.callee());
+
+    if (args.length() < 1 || args.length() > 2) {
+        ReportUsageError(cx, callee, "Wrong number of arguments");
+        return false;
+    }
+
+    if (!args[0].isObject() || !args[0].toObject().is<ArrayBufferObject>()) {
+        ReportUsageError(cx, callee, "First argument must be an ArrayBuffer");
+        return false;
+    }
+
+    if (!args.get(1).isUndefined() && !args.get(1).isObject()) {
+        ReportUsageError(cx, callee, "Second argument, if present, must be an Object");
+        return false;
+    }
+
+    UniqueChars filename;
+    if (!DescribeScriptedCaller(cx, &filename))
+        return false;
+
+    Rooted<ArrayBufferObject*> code(cx, &args[0].toObject().as<ArrayBufferObject>());
+    const uint8_t* bytes = code->dataPointer();
+    uint32_t length = code->byteLength();
+
+    Vector<uint8_t> copy(cx);
+    if (code->hasInlineData()) {
+        if (!copy.append(bytes, length))
+            return false;
+        bytes = copy.begin();
+    }
+
+    Rooted<WasmModuleObject*> moduleObj(cx);
+    ExportMap exportMap;
+    if (!DecodeModule(cx, Move(filename), bytes, length, &moduleObj, &exportMap)) {
+        if (!cx->isExceptionPending())
+            ReportOutOfMemory(cx);
+        return false;
+    }
+
+    Module& module = moduleObj->module();
+
+    Rooted<ArrayBufferObject*> heap(cx);
+    if (module.usesHeap())
+        return Fail(cx, "Heap not implemented yet");
+
+    Rooted<FunctionVector> imports(cx, FunctionVector(cx));
+    if (module.imports().length() > 0)
+        return Fail(cx, "Imports not implemented yet");
+
+    if (!module.dynamicallyLink(cx, heap, imports))
+        return false;
+
+    RootedObject exportObj(cx);
+    if (!module.createExportObject(cx, moduleObj, exportMap, &exportObj))
+        return false;
+
+    args.rval().setObject(*exportObj);
+    return true;
+}
+
+static bool
+WasmTextToBinary(JSContext* cx, unsigned argc, Value* vp)
+{
+    CallArgs args = CallArgsFromVp(argc, vp);
+    RootedObject callee(cx, &args.callee());
+
+    if (args.length() != 1) {
+        ReportUsageError(cx, callee, "Wrong number of arguments");
+        return false;
+    }
+
+    if (!args[0].isString()) {
+        ReportUsageError(cx, callee, "First argument must be a String");
+        return false;
+    }
+
+    AutoStableStringChars twoByteChars(cx);
+    if (!twoByteChars.initTwoByte(cx, args[0].toString()))
+        return false;
+
+    UniqueChars error;
+    wasm::UniqueBytecode bytes = wasm::TextToBinary(twoByteChars.twoByteChars(), &error);
+    if (!bytes) {
+        JS_ReportError(cx, error.get() ? error.get() : "out of memory");
+        return false;
+    }
+
+    Rooted<ArrayBufferObject*> buffer(cx, ArrayBufferObject::create(cx, bytes->length()));
+    if (!buffer)
+        return false;
+
+    memcpy(buffer->dataPointer(), bytes->begin(), bytes->length());
+
+    args.rval().setObject(*buffer);
+    return true;
+}
+
+static const JSFunctionSpecWithHelp WasmTestingFunctions[] = {
+    JS_FN_HELP("wasmEval", WasmEval, 2, 0,
+"wasmEval(buffer, imports)",
+"  Compiles the given binary wasm module given by 'buffer' (which must be an ArrayBuffer)\n"
+"  and links the module's imports with the given 'imports' object."),
+
+    JS_FN_HELP("wasmTextToBinary", WasmTextToBinary, 1, 0,
+"wasmTextToBinary(str)",
+"  Translates the given text wasm module into its binary encoding."),
+
+    JS_FS_HELP_END
+};
+
+static bool
+SupportsWasm(JSContext* cx)
+{
+#if defined(JS_CODEGEN_NONE) || defined(JS_CODEGEN_ARM64)
+    return false;
+#endif
+
+    if (!cx->jitSupportsFloatingPoint())
+        return false;
+
+    if (cx->gcSystemPageSize() != AsmJSPageSize)
+        return false;
+
+    return true;
+}
+
+bool
+wasm::DefineTestingFunctions(JSContext* cx, HandleObject globalObj)
+{
+    if (SupportsWasm(cx))
+        return JS_DefineFunctionsWithHelp(cx, globalObj, WasmTestingFunctions);
+    return true;
+}
new file mode 100644
--- /dev/null
+++ b/js/src/asmjs/Wasm.h
@@ -0,0 +1,34 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: set ts=8 sts=4 et sw=4 tw=99:
+ *
+ * Copyright 2015 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef wasm_h
+#define wasm_h
+
+#include "gc/Rooting.h"
+
+namespace js {
+namespace wasm {
+
+// Add wasm testing JS functions to the given JS global object.
+bool
+DefineTestingFunctions(JSContext* cx, HandleObject globalObj);
+
+}  // namespace wasm
+}  // namespace js
+
+#endif // namespace wasm_h
--- a/js/src/asmjs/WasmBinary.h
+++ b/js/src/asmjs/WasmBinary.h
@@ -22,16 +22,30 @@
 #include "asmjs/WasmTypes.h"
 
 namespace js {
 
 class PropertyName;
 
 namespace wasm {
 
+// Module header constants
+static const uint32_t MagicNumber = 0x6d736100; // "\0asm"
+static const uint32_t EncodingVersion = -1;     // experimental
+
+// Module section names:
+static const char SigSection[] =     "sig";
+static const char DeclSection[] =    "decl";
+static const char ExportSection[] =  "export";
+static const char CodeSection[] =    "code";
+static const char EndSection[] =     "";
+
+// Subsection names:
+static const char FuncSubsection[] = "func";
+
 enum class Expr : uint8_t
 {
     // Control opcodes
     Nop,
     Block,
     Loop,
     If,
     IfElse,
@@ -326,16 +340,25 @@ class Encoder
     template <class T>
     void patchEnum(size_t pc, T v) {
         // See writeEnum comment.
         static_assert(mozilla::IsEnum<T>::value, "is an enum");
         MOZ_ASSERT(uint64_t(v) < UINT8_MAX);
         bytecode_[pc] = uint8_t(v);
     }
 
+    template <class T>
+    static const T load(const uint8_t* p) {
+        T t;
+        memcpy(&t, p, sizeof(T));
+        return t;
+    }
+
+    static const uint32_t BadSectionLength = uint32_t(-1);
+
   public:
     explicit Encoder(Bytecode& bytecode)
       : bytecode_(bytecode)
     {
         MOZ_ASSERT(empty());
     }
 
     size_t bytecodeOffset() const { return bytecode_.length(); }
@@ -350,19 +373,21 @@ class Encoder
                 byte |= 0x80;
             if (!writeU8(byte))
                 return false;
         } while(i != 0);
         return true;
     }
 
     MOZ_WARN_UNUSED_RESULT bool
-    writeExpr(Expr expr, size_t* offset = nullptr) {
-        return writeEnum(expr, offset);
-    }
+    writeExpr(Expr expr, size_t* offset = nullptr)         { return writeEnum(expr, offset); }
+    MOZ_WARN_UNUSED_RESULT bool
+    writeValType(ValType type, size_t* offset = nullptr)   { return writeEnum(type, offset); }
+    MOZ_WARN_UNUSED_RESULT bool
+    writeExprType(ExprType type, size_t* offset = nullptr) { return writeEnum(type, offset); }
 
     MOZ_WARN_UNUSED_RESULT bool
     writeU8(uint8_t i, size_t* offset = nullptr)   { return write<uint8_t>(i, offset); }
     MOZ_WARN_UNUSED_RESULT bool
     writeI32(int32_t i, size_t* offset = nullptr)  { return write<int32_t>(i, offset); }
     MOZ_WARN_UNUSED_RESULT bool
     writeU32(uint32_t i, size_t* offset = nullptr) { return write<uint32_t>(i, offset); }
     MOZ_WARN_UNUSED_RESULT bool
@@ -386,16 +411,35 @@ class Encoder
             return false;
         for (size_t i = 1; i < 4; i++) {
             if (!writeF32(f4[i]))
                 return false;
         }
         return true;
     }
 
+    MOZ_WARN_UNUSED_RESULT bool writeCString(const char* cstr) {
+        MOZ_ASSERT(cstr);
+        return bytecode_.append(reinterpret_cast<const uint8_t*>(cstr), strlen(cstr) + 1);
+    }
+
+    MOZ_WARN_UNUSED_RESULT bool startSection(size_t* offset) {
+        if (!writeU32(BadSectionLength))
+            return false;
+        *offset = bytecode_.length();
+        return true;
+    }
+    void finishSection(size_t offset) {
+        uint8_t* patchAt = bytecode_.begin() + offset - sizeof(uint32_t);
+        MOZ_ASSERT(patchAt <= bytecode_.end() - sizeof(uint32_t));
+        MOZ_ASSERT(load<uint32_t>(patchAt) == BadSectionLength);
+        uint32_t numBytes = bytecode_.length() - offset;
+        memcpy(patchAt, &numBytes, sizeof(uint32_t));
+    }
+
 #ifdef DEBUG
     bool pcIsPatchable(size_t pc, unsigned size) const {
         bool patchable = true;
         for (unsigned i = 0; patchable && i < size; i++)
             patchable &= Expr(bytecode_[pc]) == Expr::Unreachable;
         return patchable;
     }
 #endif
@@ -422,30 +466,32 @@ class Decoder
     const uint8_t* const end_;
     const uint8_t* cur_;
 
     template <class T>
     MOZ_WARN_UNUSED_RESULT bool
     read(T* out) {
         if (uintptr_t(end_ - cur_) < sizeof(T))
             return false;
-        memcpy((void*)out, cur_, sizeof(T));
+        if (out)
+            memcpy((void*)out, cur_, sizeof(T));
         cur_ += sizeof(T);
         return true;
     }
 
     template <class T>
     MOZ_WARN_UNUSED_RESULT bool
     readEnum(T* out) {
         static_assert(mozilla::IsEnum<T>::value, "is an enum");
         // See Encoder::writeEnum.
         uint8_t u8;
         if (!read(&u8))
             return false;
-        *out = T(u8);
+        if (out)
+            *out = T(u8);
         return true;
     }
 
     template <class T>
     T uncheckedPeek() const {
         MOZ_ASSERT(uintptr_t(end_ - cur_) >= sizeof(T));
         T ret;
         memcpy(&ret, cur_, sizeof(T));
@@ -469,80 +515,149 @@ class Decoder
     template <class T>
     T uncheckedReadEnum() {
         // See Encoder::writeEnum.
         static_assert(mozilla::IsEnum<T>::value, "is an enum");
         return (T)uncheckedReadU8();
     }
 
   public:
+    Decoder(const uint8_t* begin, const uint8_t* end)
+      : beg_(begin),
+        end_(end),
+        cur_(begin)
+    {
+        MOZ_ASSERT(begin <= end);
+    }
     explicit Decoder(const Bytecode& bytecode)
       : beg_(bytecode.begin()),
         end_(bytecode.end()),
         cur_(bytecode.begin())
     {}
 
     bool done() const {
         MOZ_ASSERT(cur_ <= end_);
         return cur_ == end_;
     }
 
+    const uint8_t* currentPosition() const {
+        return cur_;
+    }
+    size_t currentOffset() const {
+        return cur_ - beg_;
+    }
     void assertCurrentIs(const DebugOnly<size_t> offset) const {
-        MOZ_ASSERT(size_t(cur_ - beg_) == offset);
+        MOZ_ASSERT(currentOffset() == offset);
     }
 
     // The fallible unpacking API should be used when we're not assuming
     // anything about the bytecode, in particular if it is well-formed.
-    MOZ_WARN_UNUSED_RESULT bool readU8 (uint8_t* i)         { return read(i); }
-    MOZ_WARN_UNUSED_RESULT bool readI32(int32_t* i)         { return read(i); }
-    MOZ_WARN_UNUSED_RESULT bool readF32(float* f)           { return read(f); }
-    MOZ_WARN_UNUSED_RESULT bool readU32(uint32_t* u)        { return read(u); }
-    MOZ_WARN_UNUSED_RESULT bool readF64(double* d)          { return read(d); }
+    MOZ_WARN_UNUSED_RESULT bool readU8 (uint8_t* i = nullptr)  { return read(i); }
+    MOZ_WARN_UNUSED_RESULT bool readI32(int32_t* i = nullptr)  { return read(i); }
+    MOZ_WARN_UNUSED_RESULT bool readF32(float* f = nullptr)    { return read(f); }
+    MOZ_WARN_UNUSED_RESULT bool readU32(uint32_t* u = nullptr) { return read(u); }
+    MOZ_WARN_UNUSED_RESULT bool readF64(double* d = nullptr)   { return read(d); }
 
-    MOZ_WARN_UNUSED_RESULT bool readI32X4(jit::SimdConstant* c) {
+    MOZ_WARN_UNUSED_RESULT bool readI32X4(jit::SimdConstant* c = nullptr) {
         int32_t v[4] = { 0, 0, 0, 0 };
         for (size_t i = 0; i < 4; i++) {
             if (!readI32(&v[i]))
                 return false;
         }
-        *c = jit::SimdConstant::CreateX4(v[0], v[1], v[2], v[3]);
+        if (c)
+            *c = jit::SimdConstant::CreateX4(v[0], v[1], v[2], v[3]);
         return true;
     }
-    MOZ_WARN_UNUSED_RESULT bool readF32X4(jit::SimdConstant* c) {
+    MOZ_WARN_UNUSED_RESULT bool readF32X4(jit::SimdConstant* c = nullptr) {
         float v[4] = { 0., 0., 0., 0. };
         for (size_t i = 0; i < 4; i++) {
             if (!readF32(&v[i]))
                 return false;
         }
-        *c = jit::SimdConstant::CreateX4(v[0], v[1], v[2], v[3]);
+        if (c)
+            *c = jit::SimdConstant::CreateX4(v[0], v[1], v[2], v[3]);
         return true;
     }
 
-    MOZ_WARN_UNUSED_RESULT bool readVarU32(uint32_t* decoded) {
-        *decoded = 0;
+    MOZ_WARN_UNUSED_RESULT bool readVarU32(uint32_t* out = nullptr) {
+        uint32_t u32 = 0;
         uint8_t byte;
         uint32_t shift = 0;
         do {
             if (!readU8(&byte))
                 return false;
             if (!(byte & 0x80)) {
-                *decoded |= uint32_t(byte & 0x7F) << shift;
+                if (out)
+                    *out = u32 | uint32_t(byte & 0x7F) << shift;
                 return true;
             }
-            *decoded |= uint32_t(byte & 0x7F) << shift;
+            u32 |= uint32_t(byte & 0x7F) << shift;
             shift += 7;
         } while (shift != 28);
         if (!readU8(&byte) || (byte & 0xF0))
             return false;
-        *decoded |= uint32_t(byte) << 28;
+        if (out)
+            *out = u32 | uint32_t(byte) << 28;
         return true;
     }
-    MOZ_WARN_UNUSED_RESULT bool readExpr(Expr* expr) {
+    MOZ_WARN_UNUSED_RESULT bool readExpr(Expr* expr = nullptr) {
         return readEnum(expr);
     }
+    MOZ_WARN_UNUSED_RESULT bool readValType(ValType* type = nullptr) {
+        return readEnum(type);
+    }
+    MOZ_WARN_UNUSED_RESULT bool readExprType(ExprType* type = nullptr) {
+        return readEnum(type);
+    }
+
+    MOZ_WARN_UNUSED_RESULT bool readCString(const char** cstr = nullptr) {
+        if (cstr)
+            *cstr = reinterpret_cast<const char*>(cur_);
+        for (; cur_ != end_; cur_++) {
+            if (!*cur_) {
+                cur_++;
+                return true;
+            }
+        }
+        return false;
+    }
+    MOZ_WARN_UNUSED_RESULT bool readCStringIf(const char* tag) {
+        for (const uint8_t* p = cur_; p != end_; p++, tag++) {
+            if (*p != *tag)
+                return false;
+            if (!*p) {
+                cur_ = p + 1;
+                return true;
+            }
+        }
+        return false;
+    }
+
+    MOZ_WARN_UNUSED_RESULT bool startSection(uint32_t* offset) {
+        uint32_t unused;
+        if (!readU32(&unused))
+            return false;
+        *offset = currentOffset();
+        return true;
+    }
+    MOZ_WARN_UNUSED_RESULT bool finishSection(uint32_t offset) {
+        const uint8_t* start = beg_ + offset;
+        uint32_t numBytes;
+        memcpy(&numBytes, start - sizeof(uint32_t), sizeof(uint32_t));
+        return numBytes == uintptr_t(cur_ - start);
+    }
+    MOZ_WARN_UNUSED_RESULT bool skipSection() {
+        uint32_t numBytes;
+        if (!readU32(&numBytes))
+            return false;
+        if (uintptr_t(end_ - cur_) < numBytes)
+            return false;
+        cur_ += numBytes;
+        return true;
+    }
 
     // The infallible unpacking API should be used when we are sure that the
     // bytecode is well-formed.
     uint8_t        uncheckedReadU8 () { return uncheckedRead<uint8_t>(); }
     int32_t        uncheckedReadI32() { return uncheckedRead<int32_t>(); }
     float          uncheckedReadF32() { return uncheckedRead<float>(); }
     uint32_t       uncheckedReadU32() { return uncheckedRead<uint32_t>(); }
     double         uncheckedReadF64() { return uncheckedRead<double>(); }
--- a/js/src/asmjs/WasmGenerator.cpp
+++ b/js/src/asmjs/WasmGenerator.cpp
@@ -100,16 +100,19 @@ ParallelCompilationEnabled(ExclusiveCont
     // If 'cx' isn't a JSContext, then we are already off the main thread so
     // off-thread compilation must be enabled.
     return !cx->isJSContext() || cx->asJSContext()->runtime()->canUseOffthreadIonCompilation();
 }
 
 bool
 ModuleGenerator::init(UniqueModuleGeneratorData shared, ModuleKind kind)
 {
+    if (!funcIndexToExport_.init())
+        return false;
+
     module_ = MakeUnique<ModuleData>();
     if (!module_)
         return false;
 
     module_->globalBytes = InitialGlobalDataBytes;
     module_->compileArgs = CompileArgs(cx_);
     module_->kind = kind;
 
@@ -380,19 +383,16 @@ ModuleGenerator::defineExport(uint32_t i
 bool
 ModuleGenerator::startFuncDefs()
 {
     MOZ_ASSERT(!startedFuncDefs());
     threadView_ = MakeUnique<ModuleGeneratorThreadView>(*shared_);
     if (!threadView_)
         return false;
 
-    if (!funcIndexToExport_.init())
-        return false;
-
     uint32_t numTasks;
     if (ParallelCompilationEnabled(cx_) &&
         HelperThreadState().wasmCompilationInProgress.compareExchange(false, true))
     {
 #ifdef DEBUG
         {
             AutoLockHelperThreadState lock;
             MOZ_ASSERT(!HelperThreadState().wasmFailed());
new file mode 100644
--- /dev/null
+++ b/js/src/asmjs/WasmText.cpp
@@ -0,0 +1,957 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: set ts=8 sts=4 et sw=4 tw=99:
+ *
+ * Copyright 2015 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "asmjs/WasmText.h"
+
+#include "mozilla/CheckedInt.h"
+#include "mozilla/Maybe.h"
+
+#include "jsnum.h"
+#include "jsprf.h"
+
+#include "asmjs/WasmBinary.h"
+#include "ds/LifoAlloc.h"
+#include "js/CharacterEncoding.h"
+#include "js/HashTable.h"
+
+using namespace js;
+using namespace js::wasm;
+using mozilla::CheckedInt;
+using mozilla::Maybe;
+using mozilla::Range;
+
+static const unsigned AST_LIFO_DEFAULT_CHUNK_SIZE = 4096;
+
+/*****************************************************************************/
+// wasm AST
+
+template <class T>
+using WasmAstVector = mozilla::Vector<T, 0, LifoAllocPolicy<Fallible>>;
+
+template <class K, class V, class HP>
+using WasmAstHashMap = HashMap<K, V, HP, LifoAllocPolicy<Fallible>>;
+
+typedef WasmAstVector<ValType> WasmAstValTypeVector;
+
+struct WasmAstBase
+{
+    void* operator new(size_t numBytes, LifoAlloc& astLifo) throw() {
+        return astLifo.alloc(numBytes);
+    }
+};
+
+class WasmAstSig : public WasmAstBase
+{
+    WasmAstValTypeVector args_;
+    ExprType ret_;
+
+  public:
+    WasmAstSig(WasmAstValTypeVector&& args, ExprType ret)
+      : args_(Move(args)),
+        ret_(ret)
+    {}
+    WasmAstSig(WasmAstSig&& rhs)
+      : args_(Move(rhs.args_)),
+        ret_(rhs.ret_)
+    {}
+    const WasmAstValTypeVector& args() const {
+        return args_;
+    }
+    ExprType ret() const {
+        return ret_;
+    }
+
+    typedef const WasmAstSig& Lookup;
+    static HashNumber hash(Lookup sig) {
+        return AddContainerToHash(sig.args(), HashNumber(sig.ret()));
+    }
+    static bool match(const WasmAstSig* lhs, Lookup rhs) {
+        return lhs->ret() == rhs.ret() && EqualContainers(lhs->args(), rhs.args());
+    }
+};
+
+enum class WasmAstKind
+{
+    Nop,
+    Const,
+    Func,
+    Export,
+    Module
+};
+
+class WasmAstNode : public WasmAstBase
+{
+    const WasmAstKind kind_;
+
+  public:
+    explicit WasmAstNode(WasmAstKind kind)
+      : kind_(kind)
+    {}
+    WasmAstKind kind() const { return kind_; }
+};
+
+class WasmAstExpr : public WasmAstNode
+{
+  protected:
+    explicit WasmAstExpr(WasmAstKind kind)
+      : WasmAstNode(kind)
+    {}
+
+  public:
+    template <class T>
+    T& as() {
+        MOZ_ASSERT(kind() == T::Kind);
+        return static_cast<T&>(*this);
+    }
+};
+
+struct WasmAstNop : WasmAstExpr
+{
+    WasmAstNop()
+      : WasmAstExpr(WasmAstKind::Nop)
+    {}
+};
+
+class WasmAstConst : public WasmAstExpr
+{
+    const Val val_;
+
+  public:
+    static const WasmAstKind Kind = WasmAstKind::Const;
+    explicit WasmAstConst(Val val)
+      : WasmAstExpr(Kind),
+        val_(val)
+    {}
+    Val val() const { return val_; }
+};
+
+class WasmAstFunc : public WasmAstNode
+{
+    const uint32_t sigIndex_;
+    WasmAstExpr* const maybeBody_;
+
+  public:
+    WasmAstFunc(uint32_t sigIndex, WasmAstExpr* maybeBody)
+      : WasmAstNode(WasmAstKind::Func),
+        sigIndex_(sigIndex),
+        maybeBody_(maybeBody)
+    {}
+    uint32_t sigIndex() const { return sigIndex_; }
+    WasmAstExpr* maybeBody() const { return maybeBody_; }
+};
+
+class WasmAstExport : public WasmAstNode
+{
+    const char16_t* const externalName_;
+    const size_t externalNameLength_;
+    uint32_t internalIndex_;
+
+  public:
+    WasmAstExport(const char16_t* externalNameBegin,
+                  const char16_t* externalNameEnd)
+      : WasmAstNode(WasmAstKind::Export),
+        externalName_(externalNameBegin),
+        externalNameLength_(externalNameEnd - externalNameBegin),
+        internalIndex_(UINT32_MAX)
+    {
+        MOZ_ASSERT(externalNameBegin <= externalNameEnd);
+    }
+    const char16_t* externalName() const { return externalName_; }
+    size_t externalNameLength() const { return externalNameLength_; }
+
+    void initInternalIndex(uint32_t internalIndex) {
+        MOZ_ASSERT(internalIndex_ == UINT32_MAX);
+        internalIndex_ = internalIndex;
+    }
+    size_t internalIndex() const {
+        MOZ_ASSERT(internalIndex_ != UINT32_MAX);
+        return internalIndex_;
+    }
+};
+
+class WasmAstModule : public WasmAstNode
+{
+    typedef WasmAstVector<WasmAstFunc*> FuncVector;
+    typedef WasmAstVector<WasmAstExport*> ExportVector;
+    typedef WasmAstVector<WasmAstSig*> SigVector;
+    typedef WasmAstHashMap<WasmAstSig*, uint32_t, WasmAstSig> SigMap;
+
+    LifoAlloc& lifo_;
+    FuncVector funcs_;
+    ExportVector exports_;
+    SigVector sigs_;
+    SigMap sigMap_;
+
+  public:
+    explicit WasmAstModule(LifoAlloc& lifo)
+      : WasmAstNode(WasmAstKind::Module),
+        lifo_(lifo),
+        funcs_(lifo),
+        exports_(lifo),
+        sigs_(lifo),
+        sigMap_(lifo)
+    {}
+    bool init() {
+        return sigMap_.init();
+    }
+    bool declare(WasmAstSig&& sig, uint32_t* sigIndex) {
+        SigMap::AddPtr p = sigMap_.lookupForAdd(sig);
+        if (p) {
+            *sigIndex = p->value();
+            return true;
+        }
+        *sigIndex = sigs_.length();
+        return sigs_.append(new (lifo_) WasmAstSig(Move(sig))) &&
+               sigMap_.add(p, sigs_.back(), *sigIndex);
+    }
+    const SigVector& sigs() const {
+        return sigs_;
+    }
+    bool append(WasmAstFunc* func) {
+        return funcs_.append(func);
+    }
+    const FuncVector& funcs() const {
+        return funcs_;
+    }
+    bool append(WasmAstExport* exp) {
+        return exports_.append(exp);
+    }
+    const ExportVector& exports() const {
+        return exports_;
+    }
+};
+
+/*****************************************************************************/
+// wasm text token stream
+
+class WasmToken
+{
+  public:
+    enum Kind
+    {
+        OpenParen,
+        CloseParen,
+        Name,
+        Text,
+        Integer,
+        ValueType,
+        Const,
+        Module,
+        Func,
+        Param,
+        Result,
+        Export,
+        Nop,
+        EndOfFile,
+        Error
+    };
+  private:
+    Kind kind_;
+    const char16_t* begin_;
+    const char16_t* end_;
+    union {
+        uint32_t integer_;
+        ValType valueType_;
+    } u;
+  public:
+    explicit WasmToken() = default;
+    WasmToken(Kind kind, const char16_t* begin, const char16_t* end)
+      : kind_(kind),
+        begin_(begin),
+        end_(end)
+    {
+        MOZ_ASSERT(kind_ != Error);
+        MOZ_ASSERT((kind == EndOfFile) == (begin == end));
+    }
+    explicit WasmToken(uint32_t integer, const char16_t* begin, const char16_t* end)
+      : kind_(Integer),
+        begin_(begin),
+        end_(end)
+    {
+        MOZ_ASSERT(begin != end);
+        u.integer_ = integer;
+    }
+    explicit WasmToken(Kind kind, ValType valueType, const char16_t* begin, const char16_t* end)
+      : kind_(kind),
+        begin_(begin),
+        end_(end)
+    {
+        MOZ_ASSERT(begin != end);
+        MOZ_ASSERT(kind_ == ValueType || kind_ == Const);
+        u.valueType_ = valueType;
+    }
+    explicit WasmToken(const char16_t* begin)
+      : kind_(Error),
+        begin_(begin),
+        end_(begin)
+    {}
+    Kind kind() const {
+        return kind_;
+    }
+    const char16_t* begin() const {
+        return begin_;
+    }
+    const char16_t* end() const {
+        return end_;
+    }
+    const char16_t* textBegin() const {
+        MOZ_ASSERT(kind_ == Text);
+        MOZ_ASSERT(begin_[0] == '"');
+        return begin_ + 1;
+    }
+    const char16_t* textEnd() const {
+        MOZ_ASSERT(kind_ == Text);
+        MOZ_ASSERT(end_[-1] == '"');
+        return end_ - 1;
+    }
+    uint32_t integer() const {
+        MOZ_ASSERT(kind_ == Integer);
+        return u.integer_;
+    }
+    ValType valueType() const {
+        MOZ_ASSERT(kind_ == ValueType || kind_ == Const);
+        return u.valueType_;
+    }
+};
+
+static bool
+IsWasmNewLine(char16_t c)
+{
+    return c == '\n';
+}
+
+static bool
+IsWasmSpace(char16_t c)
+{
+    switch (c) {
+      case ' ':
+      case '\n':
+      case '\r':
+      case '\t':
+      case '\v':
+      case '\f':
+        return true;
+      default:
+        return false;
+    }
+}
+
+static bool
+IsWasmDigit(char16_t c)
+{
+    return c >= '0' && c <= '9';
+}
+
+static bool
+IsWasmLetter(char16_t c)
+{
+    return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
+}
+
+static bool
+IsNameAfterDollar(char16_t c)
+{
+    return c == '_' || IsWasmDigit(c) || IsWasmLetter(c);
+}
+
+class WasmTokenStream
+{
+    static const uint32_t LookaheadSize = 2;
+
+    const char16_t* cur_;
+    const char16_t* const end_;
+    const char16_t* lineStart_;
+    unsigned line_;
+    uint32_t lookaheadIndex_;
+    uint32_t lookaheadDepth_;
+    WasmToken lookahead_[LookaheadSize];
+
+    bool consume(const char16_t* end, const char16_t* match) {
+        const char16_t* p = cur_;
+        for (; *match; p++, match++) {
+            if (p == end || *p != *match)
+                return false;
+        }
+        cur_ = p;
+        return true;
+    }
+    WasmToken fail(const char16_t* begin) const {
+        return WasmToken(begin);
+    }
+    WasmToken next() {
+        while (cur_ != end_ && IsWasmSpace(*cur_)) {
+            if (IsWasmNewLine(*cur_++)) {
+                lineStart_ = cur_;
+                line_++;
+            }
+        }
+
+        if (cur_ == end_)
+            return WasmToken(WasmToken::EndOfFile, cur_, cur_);
+
+        const char16_t* begin = cur_++;
+        switch (*begin) {
+          case '"':
+            while (cur_ != end_ && *cur_ != '"')
+                cur_++;
+            return WasmToken(WasmToken::Text, begin, ++cur_);
+
+          case '$':
+            while (cur_ != end_ && IsNameAfterDollar(*cur_))
+                cur_++;
+            return WasmToken(WasmToken::Name, begin, cur_);
+
+          case '(':
+            return WasmToken(WasmToken::OpenParen, begin, cur_);
+
+          case ')':
+            return WasmToken(WasmToken::CloseParen, begin, cur_);
+
+          case '0': case '1': case '2': case '3': case '4':
+          case '5': case '6': case '7': case '8': case '9': {
+            CheckedInt<uint32_t> u32 = *begin - '0';
+            while (cur_ != end_ && IsWasmDigit(*cur_)) {
+                u32 *= 10;
+                u32 += *cur_ - '0';
+                if (!u32.isValid())
+                    return fail(begin);
+                cur_++;
+            }
+            return WasmToken(u32.value(), begin, cur_);
+          }
+
+          case 'e':
+            if (consume(end_, MOZ_UTF16("xport")))
+                return WasmToken(WasmToken::Export, begin, cur_);
+            break;
+
+          case 'f':
+            if (consume(end_, MOZ_UTF16("unc")))
+                return WasmToken(WasmToken::Func, begin, cur_);
+            if (consume(end_, MOZ_UTF16("32"))) {
+                if (consume(end_, MOZ_UTF16(".const")))
+                    return WasmToken(WasmToken::Const, ValType::F32, begin, cur_);
+                else
+                    return WasmToken(WasmToken::ValueType, ValType::F32, begin, cur_);
+            }
+            if (consume(end_, MOZ_UTF16("64"))) {
+                if (consume(end_, MOZ_UTF16(".const")))
+                    return WasmToken(WasmToken::Const, ValType::F64, begin, cur_);
+                else
+                    return WasmToken(WasmToken::ValueType, ValType::F64, begin, cur_);
+            }
+            break;
+
+          case 'i':
+            if (consume(end_, MOZ_UTF16("32"))) {
+                if (consume(end_, MOZ_UTF16(".const")))
+                    return WasmToken(WasmToken::Const, ValType::I32, begin, cur_);
+                else
+                    return WasmToken(WasmToken::ValueType, ValType::I32, begin, cur_);
+            }
+            if (consume(end_, MOZ_UTF16("64"))) {
+                if (consume(end_, MOZ_UTF16(".const")))
+                    return WasmToken(WasmToken::Const, ValType::I64, begin, cur_);
+                else
+                    return WasmToken(WasmToken::ValueType, ValType::I64, begin, cur_);
+            }
+            break;
+
+          case 'p':
+            if (consume(end_, MOZ_UTF16("aram")))
+                return WasmToken(WasmToken::Param, begin, cur_);
+            break;
+
+          case 'm':
+            if (consume(end_, MOZ_UTF16("odule")))
+                return WasmToken(WasmToken::Module, begin, cur_);
+            break;
+
+          case 'n':
+            if (consume(end_, MOZ_UTF16("op")))
+                return WasmToken(WasmToken::Nop, begin, cur_);
+            break;
+
+          case 'r':
+            if (consume(end_, MOZ_UTF16("esult")))
+                return WasmToken(WasmToken::Result, begin, cur_);
+            break;
+
+          default:
+            break;
+        }
+
+        return fail(begin);
+    }
+
+  public:
+    WasmTokenStream(const char16_t* text, UniqueChars* error)
+      : cur_(text),
+        end_(text + js_strlen(text)),
+        lineStart_(text),
+        line_(0),
+        lookaheadIndex_(0),
+        lookaheadDepth_(0)
+    {}
+    void generateError(WasmToken token, UniqueChars* error) {
+        unsigned column = token.begin() - lineStart_ + 1;
+        error->reset(JS_smprintf("parsing wasm text at at %u:%u", line_, column));
+    }
+
+    WasmToken peek() {
+        if (!lookaheadDepth_) {
+            lookahead_[lookaheadIndex_] = next();
+            lookaheadDepth_ = 1;
+        }
+        return lookahead_[lookaheadIndex_];
+    }
+    WasmToken get() {
+        static_assert(LookaheadSize == 2, "can just flip");
+        if (lookaheadDepth_) {
+            lookaheadDepth_--;
+            WasmToken ret = lookahead_[lookaheadIndex_];
+            lookaheadIndex_ ^= 1;
+            return ret;
+        }
+        return next();
+    }
+    void unget(WasmToken token) {
+        static_assert(LookaheadSize == 2, "can just flip");
+        lookaheadDepth_++;
+        lookaheadIndex_ ^= 1;
+        lookahead_[lookaheadIndex_] = token;
+    }
+
+    // Helpers:
+    bool getIf(WasmToken::Kind kind) {
+        if (peek().kind() == kind) {
+            get();
+            return true;
+        }
+        return false;
+    }
+    bool match(WasmToken::Kind expect, WasmToken* token, UniqueChars* error) {
+        *token = get();
+        if (token->kind() == expect)
+            return true;
+        generateError(*token, error);
+        return false;
+    }
+    bool match(WasmToken::Kind expect, UniqueChars* error) {
+        WasmToken token;
+        return match(expect, &token, error);
+    }
+};
+
+
+/*****************************************************************************/
+// wasm text format parser
+
+struct WasmParseContext
+{
+    WasmTokenStream ts;
+    LifoAlloc& lifo;
+    UniqueChars* error;
+
+    WasmParseContext(const char16_t* text, LifoAlloc& lifo, UniqueChars* error)
+      : ts(text, error),
+        lifo(lifo),
+        error(error)
+    {}
+};
+
+static WasmAstConst*
+ParseConst(WasmParseContext& c, WasmToken constToken)
+{
+    switch (constToken.valueType()) {
+      case ValType::I32: {
+        WasmToken val;
+        if (!c.ts.match(WasmToken::Integer, &val, c.error))
+            return nullptr;
+        return new(c.lifo) WasmAstConst(Val(val.integer()));
+      }
+      default:
+        c.ts.generateError(constToken, c.error);
+        return nullptr;
+    }
+}
+
+static WasmAstExpr*
+ParseExpr(WasmParseContext& c)
+{
+    WasmToken expr = c.ts.get();
+
+    switch (expr.kind()) {
+      case WasmToken::Nop:
+        return new(c.lifo) WasmAstNop;
+      case WasmToken::Const:
+        return ParseConst(c, expr);
+      default:
+        c.ts.generateError(expr, c.error);
+        return nullptr;
+    }
+}
+
+static WasmAstFunc*
+ParseFunc(WasmParseContext& c, WasmAstModule* module)
+{
+    WasmAstValTypeVector args(c.lifo);
+    ExprType result = ExprType::Void;
+
+    WasmAstExpr* maybeBody = nullptr;
+    while (c.ts.getIf(WasmToken::OpenParen) && !maybeBody) {
+        WasmToken field = c.ts.get();
+
+        switch (field.kind()) {
+          case WasmToken::Param: {
+            WasmToken valueType;
+            if (!c.ts.match(WasmToken::ValueType, &valueType, c.error))
+                return nullptr;
+            if (!args.append(valueType.valueType()))
+                return nullptr;
+            break;
+          }
+          case WasmToken::Result: {
+            if (result != ExprType::Void) {
+                c.ts.generateError(field, c.error);
+                return nullptr;
+            }
+            WasmToken valueType;
+            if (!c.ts.match(WasmToken::ValueType, &valueType, c.error))
+                return nullptr;
+            result = ToExprType(valueType.valueType());
+            break;
+          }
+          default:
+            c.ts.unget(field);
+            maybeBody = ParseExpr(c);
+            if (!maybeBody)
+                return nullptr;
+            break;
+        }
+
+        if (!c.ts.match(WasmToken::CloseParen, c.error))
+            return nullptr;
+    }
+
+    uint32_t sigIndex;
+    if (!module->declare(WasmAstSig(Move(args), result), &sigIndex))
+        return nullptr;
+
+    return new(c.lifo) WasmAstFunc(sigIndex, maybeBody);
+}
+
+static WasmAstExport*
+ParseExport(WasmParseContext& c)
+{
+    WasmToken externalName;
+    if (!c.ts.match(WasmToken::Text, &externalName, c.error))
+        return nullptr;
+
+    auto exp = new(c.lifo) WasmAstExport(externalName.textBegin(), externalName.textEnd());
+    if (!exp)
+        return nullptr;
+
+    WasmToken internalName = c.ts.get();
+    switch (internalName.kind()) {
+      case WasmToken::Integer:
+        exp->initInternalIndex(internalName.integer());
+        break;
+      default:
+        c.ts.generateError(internalName, c.error);
+        return nullptr;
+    }
+
+    return exp;
+}
+
+static WasmAstModule*
+TextToAst(const char16_t* text, LifoAlloc& lifo, UniqueChars* error)
+{
+    WasmParseContext c(text, lifo, error);
+
+    if (!c.ts.match(WasmToken::OpenParen, c.error))
+        return nullptr;
+    if (!c.ts.match(WasmToken::Module, c.error))
+        return nullptr;
+
+    auto module = new(c.lifo) WasmAstModule(c.lifo);
+    if (!module || !module->init())
+        return nullptr;
+
+    while (c.ts.getIf(WasmToken::OpenParen)) {
+        WasmToken section = c.ts.get();
+
+        switch (section.kind()) {
+          case WasmToken::Export: {
+            WasmAstExport* exp = ParseExport(c);
+            if (!exp || !module->append(exp))
+                return nullptr;
+            break;
+          }
+          case WasmToken::Func: {
+            WasmAstFunc* func = ParseFunc(c, module);
+            if (!func || !module->append(func))
+                return nullptr;
+            break;
+          }
+          default:
+            c.ts.generateError(section, c.error);
+            return nullptr;
+        }
+
+        if (!c.ts.match(WasmToken::CloseParen, c.error))
+            return nullptr;
+    }
+
+    if (!c.ts.match(WasmToken::CloseParen, c.error))
+        return nullptr;
+    if (!c.ts.match(WasmToken::EndOfFile, c.error))
+        return nullptr;
+
+    return module;
+}
+
+/*****************************************************************************/
+// wasm function body serialization
+
+static bool
+EncodeConst(Encoder& e, WasmAstConst& c)
+{
+    switch (c.val().type()) {
+      case ValType::I32:
+        return e.writeExpr(Expr::I32Const) &&
+               e.writeVarU32(c.val().i32());
+      default:
+        break;
+    }
+    MOZ_CRASH("Bad value type");
+}
+
+static bool
+EncodeExpr(Encoder& e, WasmAstExpr& expr)
+{
+    switch (expr.kind()) {
+      case WasmAstKind::Nop:
+        return e.writeExpr(Expr::Nop);
+      case WasmAstKind::Const:
+        return EncodeConst(e, expr.as<WasmAstConst>());
+      default:;
+    }
+    MOZ_CRASH("Bad expr kind");
+}
+
+/*****************************************************************************/
+// wasm AST binary serialization
+
+static bool
+EncodeSignatureSection(Encoder& e, WasmAstModule& module)
+{
+    if (module.funcs().empty())
+        return true;
+
+    if (!e.writeCString(SigSection))
+        return false;
+
+    size_t offset;
+    if (!e.startSection(&offset))
+        return false;
+
+    if (!e.writeVarU32(module.sigs().length()))
+        return false;
+
+    for (WasmAstSig* sig : module.sigs()) {
+        if (!e.writeVarU32(sig->args().length()))
+            return false;
+
+        if (!e.writeExprType(sig->ret()))
+            return false;
+
+        for (ValType t : sig->args()) {
+            if (!e.writeValType(t))
+                return false;
+        }
+    }
+
+    e.finishSection(offset);
+    return true;
+}
+
+static bool
+EncodeDeclarationSection(Encoder& e, WasmAstModule& module)
+{
+    if (module.funcs().empty())
+        return true;
+
+    if (!e.writeCString(DeclSection))
+        return false;
+
+    size_t offset;
+    if (!e.startSection(&offset))
+        return false;
+
+    if (!e.writeVarU32(module.funcs().length()))
+        return false;
+
+    for (WasmAstFunc* func : module.funcs()) {
+        if (!e.writeVarU32(func->sigIndex()))
+            return false;
+    }
+
+    e.finishSection(offset);
+    return true;
+}
+
+static bool
+EncodeExport(Encoder& e, WasmAstExport& exp)
+{
+    if (!e.writeCString(FuncSubsection))
+        return false;
+
+    if (!e.writeVarU32(exp.internalIndex()))
+        return false;
+
+    Range<const char16_t> twoByte(exp.externalName(), exp.externalNameLength());
+    UniqueChars utf8(JS::CharsToNewUTF8CharsZ(nullptr, twoByte).c_str());
+    if (!utf8)
+        return false;
+
+    if (!e.writeCString(utf8.get()))
+        return false;
+
+    return true;
+}
+
+static bool
+EncodeExportSection(Encoder& e, WasmAstModule& module)
+{
+    if (module.exports().empty())
+        return true;
+
+    if (!e.writeCString(ExportSection))
+        return false;
+
+    size_t offset;
+    if (!e.startSection(&offset))
+        return false;
+
+    if (!e.writeVarU32(module.exports().length()))
+        return false;
+
+    for (WasmAstExport* exp : module.exports()) {
+        if (!EncodeExport(e, *exp))
+            return false;
+    }
+
+    e.finishSection(offset);
+    return true;
+}
+
+static bool
+EncodeFunc(Encoder& e, WasmAstFunc& func)
+{
+    if (!e.writeCString(FuncSubsection))
+        return false;
+
+    size_t offset;
+    if (!e.startSection(&offset))
+        return false;
+
+    if (func.maybeBody()) {
+        if (!EncodeExpr(e, *func.maybeBody()))
+            return false;
+    } else {
+        if (!e.writeExpr(Expr::Nop))
+            return false;
+    }
+
+    e.finishSection(offset);
+
+    return true;
+}
+
+static bool
+EncodeCodeSection(Encoder& e, WasmAstModule& module)
+{
+    if (module.funcs().empty())
+        return true;
+
+    if (!e.writeCString(CodeSection))
+        return false;
+
+    size_t offset;
+    if (!e.startSection(&offset))
+        return false;
+
+    if (!e.writeVarU32(module.funcs().length()))
+        return false;
+
+    for (WasmAstFunc* func : module.funcs()) {
+        if (!EncodeFunc(e, *func))
+            return false;
+    }
+
+    e.finishSection(offset);
+    return true;
+}
+
+static UniqueBytecode
+AstToBinary(WasmAstModule& module)
+{
+    UniqueBytecode bytecode = MakeUnique<Bytecode>();
+    if (!bytecode)
+        return nullptr;
+
+    Encoder e(*bytecode);
+
+    if (!e.writeU32(MagicNumber))
+        return nullptr;
+
+    if (!e.writeU32(EncodingVersion))
+        return nullptr;
+
+    if (!EncodeSignatureSection(e, module))
+        return nullptr;
+
+    if (!EncodeDeclarationSection(e, module))
+        return nullptr;
+
+    if (!EncodeExportSection(e, module))
+        return nullptr;
+
+    if (!EncodeCodeSection(e, module))
+        return nullptr;
+
+    if (!e.writeCString(EndSection))
+        return nullptr;
+
+    return Move(bytecode);
+}
+
+/*****************************************************************************/
+
+UniqueBytecode
+wasm::TextToBinary(const char16_t* text, UniqueChars* error)
+{
+    LifoAlloc lifo(AST_LIFO_DEFAULT_CHUNK_SIZE);
+    WasmAstModule* module = TextToAst(text, lifo, error);
+    if (!module)
+        return nullptr;
+
+    return AstToBinary(*module);
+}
new file mode 100644
--- /dev/null
+++ b/js/src/asmjs/WasmText.h
@@ -0,0 +1,38 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
+ * vim: set ts=8 sts=4 et sw=4 tw=99:
+ *
+ * Copyright 2015 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef wasm_text_h
+#define wasm_text_h
+
+#include "asmjs/WasmBinary.h"
+#include "js/Utility.h"
+
+namespace js {
+namespace wasm {
+
+// Translate the textual representation of a wasm module (given by a
+// null-terminated char16_t array) into a Bytecode object. If there is an error
+// other than out-of-memory an error message string will be stored in 'error'.
+
+extern UniqueBytecode
+TextToBinary(const char16_t* text, UniqueChars* error);
+
+} // namespace wasm
+} // namespace js
+
+#endif // wasm_text_h
--- a/js/src/asmjs/WasmTypes.h
+++ b/js/src/asmjs/WasmTypes.h
@@ -221,31 +221,20 @@ class Sig
         return *this;
     }
 
     ValType arg(unsigned i) const { return args_[i]; }
     const ValTypeVector& args() const { return args_; }
     const ExprType& ret() const { return ret_; }
 
     HashNumber hash() const {
-        HashNumber hn = HashNumber(ret_);
-        for (unsigned i = 0; i < args_.length(); i++)
-            hn = mozilla::AddToHash(hn, HashNumber(args_[i]));
-        return hn;
+        return AddContainerToHash(args_, HashNumber(ret_));
     }
     bool operator==(const Sig& rhs) const {
-        if (ret() != rhs.ret())
-            return false;
-        if (args().length() != rhs.args().length())
-            return false;
-        for (unsigned i = 0; i < args().length(); i++) {
-            if (arg(i) != rhs.arg(i))
-                return false;
-        }
-        return true;
+        return ret() == rhs.ret() && EqualContainers(args(), rhs.args());
     }
     bool operator!=(const Sig& rhs) const {
         return !(*this == rhs);
     }
 };
 
 // A "declared" signature is a Sig object that is created and owned by the
 // ModuleGenerator. These signature objects are read-only and have the same
--- a/js/src/builtin/TestingFunctions.cpp
+++ b/js/src/builtin/TestingFunctions.cpp
@@ -14,16 +14,17 @@
 #include "jscntxt.h"
 #include "jsfriendapi.h"
 #include "jsgc.h"
 #include "jsobj.h"
 #include "jsprf.h"
 #include "jswrapper.h"
 
 #include "asmjs/AsmJS.h"
+#include "asmjs/Wasm.h"
 #include "jit/InlinableNatives.h"
 #include "jit/JitFrameIterator.h"
 #include "js/Debug.h"
 #include "js/HashTable.h"
 #include "js/StructuredClone.h"
 #include "js/UbiNode.h"
 #include "js/UbiNodeBreadthFirst.h"
 #include "js/UniquePtr.h"
@@ -3667,13 +3668,16 @@ js::DefineTestingFunctions(JSContext* cx
                            bool disableOOMFunctions_)
 {
     fuzzingSafe = fuzzingSafe_;
     if (EnvVarIsDefined("MOZ_FUZZING_SAFE"))
         fuzzingSafe = true;
 
     disableOOMFunctions = disableOOMFunctions_;
 
+    if (!wasm::DefineTestingFunctions(cx, obj))
+        return false;
+
     if (!JS_DefineProperties(cx, obj, TestingProperties))
         return false;
 
     return JS_DefineFunctionsWithHelp(cx, obj, TestingFunctions);
 }
--- a/js/src/configure.in
+++ b/js/src/configure.in
@@ -755,17 +755,16 @@ AS='$(CC)'
 AS_DASH_C_FLAG='-c'
 DLL_PREFIX=lib
 LIB_PREFIX=lib
 DLL_SUFFIX=.so
 OBJ_SUFFIX=o
 LIB_SUFFIX=a
 ASM_SUFFIX=s
 IMPORT_LIB_SUFFIX=
-TARGET_MD_ARCH=unix
 DIRENT_INO=d_ino
 MOZ_USER_DIR=".mozilla"
 
 MOZ_FIX_LINK_PATHS="-Wl,-rpath-link,${DIST}/bin -Wl,-rpath-link,${prefix}/lib"
 
 USE_DEPENDENT_LIBS=1
 
 _PLATFORM_DEFAULT_TOOLKIT=cairo-gtk2
@@ -1493,17 +1492,16 @@ case "$target" in
     MKCSHLIB='$(CC) $(CFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -o $@'
     MOZ_OPTIMIZE_FLAGS="-O3 -fno-stack-protector"
     CFLAGS="$CFLAGS -fno-common"
     CXXFLAGS="$CXXFLAGS -fno-common"
     DLL_SUFFIX=".dylib"
     DSO_LDOPTS=''
     STRIP="$STRIP -x -S"
     _PLATFORM_DEFAULT_TOOLKIT='cairo-cocoa'
-    TARGET_NSPR_MDCPUCFG='\"md/_darwin.cfg\"'
     LDFLAGS="$LDFLAGS -lobjc"
     # The ExceptionHandling framework is needed for Objective-C exception
     # logging code in nsObjCExceptions.h. Currently we only use that in debug
     # builds.
     _SAVE_LDFLAGS=$LDFLAGS
      AC_MSG_CHECKING([for -framework ExceptionHandling])
     LDFLAGS="$LDFLAGS -framework ExceptionHandling"
     AC_TRY_LINK(,[return 0;],
@@ -1575,17 +1573,16 @@ ia64*-hpux*)
     MOZ_POST_PROGRAM_COMMAND='chatr +s enable'
     AC_DEFINE(NSCAP_DISABLE_DEBUG_PTR_TYPES)
     ;;
 
 *-android*|*-linuxandroid*)
     AC_DEFINE(NO_PW_GECOS)
     no_x=yes
     _PLATFORM_DEFAULT_TOOLKIT=cairo-android
-    TARGET_NSPR_MDCPUCFG='\"md/_linux.cfg\"'
 
     MOZ_GFX_OPTIMIZE_MOBILE=1
     MOZ_OPTIMIZE_FLAGS="-O3 -fno-reorder-functions"
     if test -z "$CLANG_CC"; then
        MOZ_OPTIMIZE_FLAGS="-freorder-blocks $MOZ_OPTIMIZE_FLAGS"
     fi
     # The Maemo builders don't know about this flag
     MOZ_ARM_VFP_FLAGS="-mfpu=vfp"
@@ -1601,18 +1598,16 @@ ia64*-hpux*)
     elif test "$GNU_CC" -o "$GNU_CXX"; then
         MOZ_PGO_OPTIMIZE_FLAGS="-O3"
         MOZ_OPTIMIZE_FLAGS="-O3"
         if test -z "$CLANG_CC"; then
            MOZ_OPTIMIZE_FLAGS="-freorder-blocks $MOZ_OPTIMIZE_FLAGS"
         fi
     fi
 
-    TARGET_NSPR_MDCPUCFG='\"md/_linux.cfg\"'
-
     case "${target_cpu}" in
     alpha*)
     	CFLAGS="$CFLAGS -mieee"
     	CXXFLAGS="$CXXFLAGS -mieee"
     ;;
     esac
 
     if test -z "$MC"; then
@@ -1686,20 +1681,18 @@ ia64*-hpux*)
         WIN32_CONSOLE_EXE_LDFLAGS=-SUBSYSTEM:CONSOLE,$WIN32_SUBSYSTEM_VERSION
         WIN32_GUI_EXE_LDFLAGS=-SUBSYSTEM:WINDOWS,$WIN32_SUBSYSTEM_VERSION
         DSO_LDOPTS=-SUBSYSTEM:WINDOWS,$WIN32_SUBSYSTEM_VERSION
         _USE_CPP_INCLUDE_FLAG=1
         _DEFINES_CFLAGS='-FI $(topobjdir)/js/src/js-confdefs.h -DMOZILLA_CLIENT'
         _DEFINES_CXXFLAGS='-FI $(topobjdir)/js/src/js-confdefs.h -DMOZILLA_CLIENT'
         CFLAGS="$CFLAGS -W3 -Gy"
         CXXFLAGS="$CXXFLAGS -W3 -Gy"
-        if test "$CPU_ARCH" = "x86" -a -z "$CLANG_CL"; then
+        if test "$CPU_ARCH" = "x86"; then
             dnl VS2012+ defaults to -arch:SSE2.
-            dnl Clang-cl gets confused by -arch:IA32, so don't add it.
-            dnl (See https://llvm.org/bugs/show_bug.cgi?id=24335)
             CFLAGS="$CFLAGS -arch:IA32"
             CXXFLAGS="$CXXFLAGS -arch:IA32"
         fi
         dnl VS2013+ requires -FS when parallel building by make -jN.
         dnl If nothing, compiler sometimes causes C1041 error.
         CFLAGS="$CFLAGS -FS"
         CXXFLAGS="$CXXFLAGS -FS"
         # khuey says we can safely ignore MSVC warning C4251
@@ -1777,23 +1770,19 @@ ia64*-hpux*)
         # make 'foo == bar;' error out
         CFLAGS="$CFLAGS -we4553"
         CXXFLAGS="$CXXFLAGS -we4553"
         LIBS="$LIBS kernel32.lib user32.lib gdi32.lib winmm.lib wsock32.lib advapi32.lib psapi.lib"
         MOZ_DEBUG_LDFLAGS='-DEBUG -DEBUGTYPE:CV'
         WARNINGS_AS_ERRORS='-WX'
         MOZ_OPTIMIZE_FLAGS="-O2"
         MOZ_FIX_LINK_PATHS=
-        # Disable these flags on clang-cl since it doesn't ignore unknown arguments by default, and
-        # autoconf insists on passing $LDFLAGS to the compiler.
-        if test -z "$CLANG_CL"; then
-            LDFLAGS="$LDFLAGS -LARGEADDRESSAWARE -NXCOMPAT"
-            if test -z "$DEVELOPER_OPTIONS"; then
-                LDFLAGS="$LDFLAGS -RELEASE"
-            fi
+        LDFLAGS="$LDFLAGS -LARGEADDRESSAWARE -NXCOMPAT"
+        if test -z "$DEVELOPER_OPTIONS"; then
+            LDFLAGS="$LDFLAGS -RELEASE"
         fi
         dnl For profile-guided optimization
         PROFILE_GEN_CFLAGS="-GL"
         PROFILE_GEN_LDFLAGS="-LTCG:PGINSTRUMENT"
         dnl XXX: PGO builds can fail with warnings treated as errors,
         dnl specifically "no profile data available" appears to be
         dnl treated as an error sometimes. This might be a consequence
         dnl of using WARNINGS_AS_ERRORS in some modules, combined
@@ -1811,24 +1800,20 @@ ia64*-hpux*)
     AC_DEFINE(HAVE__MSIZE)
     AC_DEFINE(_WINDOWS)
     AC_DEFINE(WIN32)
     AC_DEFINE(XP_WIN)
     AC_DEFINE(XP_WIN32)
     AC_DEFINE(HW_THREADS)
     AC_DEFINE(STDC_HEADERS)
     AC_DEFINE(WIN32_LEAN_AND_MEAN)
-    TARGET_MD_ARCH=win32
     _PLATFORM_DEFAULT_TOOLKIT='cairo-windows'
     BIN_SUFFIX='.exe'
     MOZ_USER_DIR="Mozilla"
 
-    dnl Hardcode to win95 for now - cls
-    TARGET_NSPR_MDCPUCFG='\"md/_win95.cfg\"'
-
     dnl set NO_X11 defines here as the general check is skipped on win32
     no_x=yes
     AC_DEFINE(NO_X11)
 
     case "$host_os" in
     cygwin*|msvc*|mks*)
         AC_MSG_ERROR([Using a Cygwin build environment is unsupported. Configure cannot check for presence of necessary headers. Please upgrade to MozillaBuild; see https://developer.mozilla.org/en/Windows_Build_Prerequisites.])
         ;;
@@ -1841,21 +1826,17 @@ ia64*-hpux*)
         fi
 
         if test -n "$GNU_CC"; then
             CFLAGS="$CFLAGS -mstackrealign -fno-keep-inline-dllexport"
             CXXFLAGS="$CXXFLAGS -mstackrealign -fno-keep-inline-dllexport"
             LDFLAGS="$LDFLAGS -Wl,--large-address-aware"
         else
             DSO_LDOPTS="$DSO_LDOPTS -MACHINE:X86"
-            # Disable this flag on clang-cl since it doesn't ignore unknown arguments by default, and
-            # autoconf insists on passing $LDFLAGS to the compiler.
-            if test -z "$CLANG_CL"; then
-                LDFLAGS="$LDFLAGS -SAFESEH"
-            fi
+            LDFLAGS="$LDFLAGS -SAFESEH"
         fi
 
     	AC_DEFINE(_X86_)
 	;;
     x86_64-*)
         if test -n "$_WIN32_MSVC"; then
             DSO_LDOPTS="$DSO_LDOPTS -MACHINE:X64"
         fi
@@ -1896,17 +1877,16 @@ ia64*-hpux*)
     DSO_LDOPTS='-shared -fPIC'
     if test "$LIBRUNPATH"; then
 	DSO_LDOPTS="-R$LIBRUNPATH $DSO_LDOPTS"
     fi
     ;;
 
 *-solaris*)
     AC_DEFINE(SOLARIS)
-    TARGET_NSPR_MDCPUCFG='\"md/_solaris.cfg\"'
     if test -z "$CROSS_COMPILE" && pkginfo -q SUNWpr && pkginfo -q SUNWprd; then
        NO_NSPR_CONFIG_SYSTEM_LDFLAGS="-L/usr/lib/mps -R/usr/lib/mps -lnspr4"
        NO_NSPR_CONFIG_SYSTEM_CFLAGS="-I/usr/include/mps"
        NO_NSPR_CONFIG_SYSTEM_VERSION=["`pkgparam SUNWpr SUNW_PRODVERS | sed -e 's/^[1-9][0-9]*\.[0-9][0-9]*$/&.0/'`"]
     fi
     MOZ_FIX_LINK_PATHS=
     # $ORIGIN/.. is for shared libraries under components/ to locate shared
     # libraries one level up (e.g. libnspr4.so)
@@ -3707,18 +3687,16 @@ AC_SUBST(HOST_AR_FLAGS)
 AC_SUBST(HOST_LD)
 AC_SUBST(HOST_RANLIB)
 AC_SUBST(HOST_BIN_SUFFIX)
 AC_SUBST(HOST_OS_ARCH)
 
 AC_SUBST(TARGET_CPU)
 AC_SUBST(TARGET_VENDOR)
 AC_SUBST(TARGET_OS)
-AC_SUBST(TARGET_NSPR_MDCPUCFG)
-AC_SUBST(TARGET_MD_ARCH)
 AC_SUBST(TARGET_XPCOM_ABI)
 AC_SUBST(OS_TARGET)
 AC_SUBST(OS_ARCH)
 AC_SUBST(OS_RELEASE)
 AC_SUBST(OS_TEST)
 AC_SUBST(CPU_ARCH)
 AC_SUBST(INTEL_ARCHITECTURE)
 
@@ -3827,19 +3805,16 @@ if test -n "$GNU_CC"; then
 JS_CONFIG_MOZ_JS_LIBS='-L${libdir} -l${JS_LIBRARY_NAME}'
 else
 JS_CONFIG_MOZ_JS_LIBS='${libdir}/${JS_LIBRARY_NAME}.lib'
 fi
 AC_SUBST(JS_LIBRARY_NAME)
 AC_SUBST(JS_CONFIG_MOZ_JS_LIBS)
 AC_SUBST(JS_CONFIG_LIBS)
 
-if test -n "$MOZ_BUILD_NSPR"; then
-    MOZ_SUBCONFIGURE_NSPR()
-fi
 MOZ_SUBCONFIGURE_FFI()
 MOZ_SUBCONFIGURE_JEMALLOC()
 
 # Avoid using obsolete NSPR features
 AC_DEFINE(NO_NSPR_10_SUPPORT)
 
 dnl Spit out some output
 dnl ========================================================
--- a/js/src/jit-test/lib/asserts.js
+++ b/js/src/jit-test/lib/asserts.js
@@ -70,20 +70,20 @@ if (typeof assertErrorMessage === 'undef
     var assertErrorMessage = function assertErrorMessage(f, ctor, test) {
         try {
             f();
         } catch (e) {
             if (!(e instanceof ctor))
                 throw new Error("Assertion failed: expected exception " + ctor.name + ", got " + e);
             if (typeof test == "string") {
                 if (test != e.message)
-                    throw new Error("Assertion failed: expeceted " + test + ", got " + e.message);
+                    throw new Error("Assertion failed: expected " + test + ", got " + e.message);
             } else {
                 if (!test.test(e.message))
-                    throw new Error("Assertion failed: expeceted " + test.toString() + ", got " + e.message);
+                    throw new Error("Assertion failed: expected " + test.toString() + ", got " + e.message);
             }
             return;
         }
         throw new Error("Assertion failed: expected exception " + ctor.name + ", no exception thrown");
     };
 }
 
 if (typeof assertTypeErrorMessage === 'undefined') {
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/lib/wasm.js
@@ -0,0 +1,5 @@
+load(libdir + "asserts.js");
+
+function wasmEvalText(str, imports) {
+    return wasmEval(wasmTextToBinary(str), imports);
+}
--- a/js/src/jit-test/tests/SIMD/bug1241872.js
+++ b/js/src/jit-test/tests/SIMD/bug1241872.js
@@ -1,10 +1,10 @@
 if (typeof SIMD !== 'object')
-    exit(0);
+    quit(0);
 
 function test() {
     return SIMD.Float32x4().toSource();
 }
 
 var r = '';
 for (var i = 0; i < 10000; i++)
     r = test();
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/basic.js
@@ -0,0 +1,91 @@
+load(libdir + "wasm.js");
+
+if (!this.wasmEval)
+    quit();
+
+function mismatchError(expect, actual) {
+    return /type mismatch/;
+}
+
+// ----------------------------------------------------------------------------
+// exports
+
+var o = wasmEvalText('(module)');
+assertEq(Object.getOwnPropertyNames(o).length, 0);
+
+var o = wasmEvalText('(module (func))');
+assertEq(Object.getOwnPropertyNames(o).length, 0);
+
+var o = wasmEvalText('(module (func) (export "" 0))');
+assertEq(typeof o, "function");
+assertEq(o.name, "0");
+assertEq(o.length, 0);
+assertEq(o(), undefined);
+
+var o = wasmEvalText('(module (func) (export "a" 0))');
+var names = Object.getOwnPropertyNames(o);
+assertEq(names.length, 1);
+assertEq(names[0], 'a');
+var desc = Object.getOwnPropertyDescriptor(o, 'a');
+assertEq(typeof desc.value, "function");
+assertEq(desc.value.name, "0");
+assertEq(desc.value.length, 0);
+assertEq(desc.value(), undefined);
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, true);
+assertEq(desc.value(), undefined);
+
+var o = wasmEvalText('(module (func) (func) (export "" 0) (export "a" 1))');
+assertEq(typeof o, "function");
+assertEq(o.name, "0");
+assertEq(o.length, 0);
+assertEq(o(), undefined);
+var desc = Object.getOwnPropertyDescriptor(o, 'a');
+assertEq(typeof desc.value, "function");
+assertEq(desc.value.name, "1");
+assertEq(desc.value.length, 0);
+assertEq(desc.value(), undefined);
+assertEq(desc.writable, true);
+assertEq(desc.enumerable, true);
+assertEq(desc.configurable, true);
+assertEq(desc.value(), undefined);
+
+wasmEvalText('(module (func) (func) (export "a" 0))');
+wasmEvalText('(module (func) (func) (export "a" 1))');
+assertErrorMessage(() => wasmEvalText('(module (func) (export "a" 1))'), Error, /export function index out of range/);
+assertErrorMessage(() => wasmEvalText('(module (func) (func) (export "a" 2))'), Error, /export function index out of range/);
+
+var o = wasmEvalText('(module (func) (export "a" 0) (export "b" 0))');
+assertEq(Object.getOwnPropertyNames(o).sort().toString(), "a,b");
+assertEq(o.a.name, "0");
+assertEq(o.b.name, "0");
+assertEq(o.a === o.b, true);
+
+var o = wasmEvalText('(module (func) (func) (export "a" 0) (export "b" 1))');
+assertEq(Object.getOwnPropertyNames(o).sort().toString(), "a,b");
+assertEq(o.a.name, "0");
+assertEq(o.b.name, "1");
+assertEq(o.a === o.b, false);
+
+var o = wasmEvalText('(module (func (result i32) (i32.const 1)) (func (result i32) (i32.const 2)) (export "a" 0) (export "b" 1))');
+assertEq(o.a(), 1);
+assertEq(o.b(), 2);
+var o = wasmEvalText('(module (func (result i32) (i32.const 1)) (func (result i32) (i32.const 2)) (export "a" 1) (export "b" 0))');
+assertEq(o.a(), 2);
+assertEq(o.b(), 1);
+
+assertErrorMessage(() => wasmEvalText('(module (func) (export "a" 0) (export "a" 0))'), Error, /duplicate export/);
+assertErrorMessage(() => wasmEvalText('(module (func) (func) (export "a" 0) (export "a" 1))'), Error, /duplicate export/);
+
+// ----------------------------------------------------------------------------
+// signatures
+
+assertErrorMessage(() => wasmEvalText('(module (func (result i32)))'), Error, mismatchError("i32", "void"));
+assertErrorMessage(() => wasmEvalText('(module (func (result i32) (nop)))'), Error, mismatchError("i32", "void"));
+wasmEvalText('(module (func (nop)))');
+wasmEvalText('(module (func (result i32) (i32.const 42)))');
+wasmEvalText('(module (func (param i32)))');
+wasmEvalText('(module (func (param i32) (result i32) (i32.const 42)))');
+wasmEvalText('(module (func (result i32) (param i32) (i32.const 42)))');
+
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/binary.js
@@ -0,0 +1,33 @@
+load(libdir + "wasm.js");
+
+if (!this.wasmEval)
+    quit();
+
+// MagicNumber = 0x4d534100
+var magic0 = 0;
+var magic1 = 97;  // 'a'
+var magic2 = 115; // 's'
+var magic3 = 109; // 'm'
+
+// EncodingVersion = -1
+var ver0 = 0xff;
+var ver1 = 0xff;
+var ver2 = 0xff;
+var ver3 = 0xff;
+
+var magicError = /failed to match magic number/;
+var versionError = /failed to match binary version/;
+var extraError = /failed to consume all bytes of module/;
+
+assertErrorMessage(() => wasmEval(Uint8Array.of().buffer), Error, magicError);
+assertErrorMessage(() => wasmEval(Uint8Array.of(42).buffer), Error, magicError);
+assertErrorMessage(() => wasmEval(Uint8Array.of(magic0, magic1, magic2).buffer), Error, magicError);
+assertErrorMessage(() => wasmEval(Uint8Array.of(1,2,3,4).buffer), Error, magicError);
+assertErrorMessage(() => wasmEval(Uint8Array.of(magic0, magic1, magic2, magic3).buffer), Error, versionError);
+assertErrorMessage(() => wasmEval(Uint8Array.of(magic0, magic1, magic2, magic3, 1).buffer), Error, versionError);
+assertErrorMessage(() => wasmEval(Uint8Array.of(magic0, magic1, magic2, magic3, ver0).buffer), Error, versionError);
+assertErrorMessage(() => wasmEval(Uint8Array.of(magic0, magic1, magic2, magic3, ver0, ver1, ver2).buffer), Error, versionError);
+assertErrorMessage(() => wasmEval(Uint8Array.of(magic0, magic1, magic2, magic3, ver0, ver1, ver2, ver3, 0, 1).buffer), Error, extraError);
+
+var o = wasmEval(Uint8Array.of(magic0, magic1, magic2, magic3, ver0, ver1, ver2, ver3, 0).buffer);
+assertEq(Object.getOwnPropertyNames(o).length, 0);
new file mode 100644
--- /dev/null
+++ b/js/src/jit-test/tests/wasm/text.js
@@ -0,0 +1,15 @@
+load(libdir + "wasm.js");
+
+if (!this.wasmEval)
+    quit();
+
+var parsingError = /parsing wasm text at/;
+
+assertErrorMessage(() => wasmEvalText(""), Error, parsingError);
+assertErrorMessage(() => wasmEvalText("("), Error, parsingError);
+assertErrorMessage(() => wasmEvalText("(m"), Error, parsingError);
+assertErrorMessage(() => wasmEvalText("(module"), Error, parsingError);
+assertErrorMessage(() => wasmEvalText("(moduler"), Error, parsingError);
+
+// Note: the s-expression text format is temporary, this file is mostly just to
+// hold basic error smoke tests.
--- a/js/src/js.msg
+++ b/js/src/js.msg
@@ -355,16 +355,20 @@ MSG_DEF(JSMSG_DEFAULT_IN_PATTERN,      0
 MSG_DEF(JSMSG_BAD_NEWTARGET,           0, JSEXN_SYNTAXERR, "new.target only allowed in non-exotic functions")
 MSG_DEF(JSMSG_ESCAPED_KEYWORD,         0, JSEXN_SYNTAXERR, "keywords must be written literally, without embedded escapes")
 
 // asm.js
 MSG_DEF(JSMSG_USE_ASM_TYPE_FAIL,       1, JSEXN_TYPEERR, "asm.js type error: {0}")
 MSG_DEF(JSMSG_USE_ASM_LINK_FAIL,       1, JSEXN_TYPEERR, "asm.js link error: {0}")
 MSG_DEF(JSMSG_USE_ASM_TYPE_OK,         1, JSEXN_NONE,    "Successfully compiled asm.js code ({0})")
 
+// wasm
+MSG_DEF(JSMSG_WASM_FAIL,               1, JSEXN_TYPEERR, "wasm error: {0}")
+MSG_DEF(JSMSG_WASM_DECODE_FAIL,        2, JSEXN_TYPEERR, "wasm validation error at offset {0}: {1}")
+
 // Proxy
 MSG_DEF(JSMSG_BAD_TRAP_RETURN_VALUE,   2, JSEXN_TYPEERR,"trap {1} for {0} returned a primitive value")
 MSG_DEF(JSMSG_CANT_CHANGE_EXTENSIBILITY, 0, JSEXN_TYPEERR, "can't change object's extensibility")
 MSG_DEF(JSMSG_CANT_DEFINE_INVALID,     0, JSEXN_TYPEERR, "proxy can't define an incompatible property descriptor")
 MSG_DEF(JSMSG_CANT_DEFINE_NEW,         0, JSEXN_TYPEERR, "proxy can't define a new property on a non-extensible object")
 MSG_DEF(JSMSG_CANT_DEFINE_NE_AS_NC,    0, JSEXN_TYPEERR, "proxy can't define a non-existent property as non-configurable")
 MSG_DEF(JSMSG_PROXY_DEFINE_RETURNED_FALSE, 1, JSEXN_TYPEERR, "proxy defineProperty handler returned false for property '{0}'")
 MSG_DEF(JSMSG_PROXY_DELETE_RETURNED_FALSE, 1, JSEXN_TYPEERR, "can't delete property '{0}': proxy deleteProperty handler returned false")
--- a/js/src/jsutil.h
+++ b/js/src/jsutil.h
@@ -9,16 +9,17 @@
  */
 
 #ifndef jsutil_h
 #define jsutil_h
 
 #include "mozilla/Assertions.h"
 #include "mozilla/Compiler.h"
 #include "mozilla/GuardObjects.h"
+#include "mozilla/HashFunctions.h"
 #include "mozilla/PodOperations.h"
 
 #include <limits.h>
 
 #include "js/Utility.h"
 #include "js/Value.h"
 
 #define JS_ALWAYS_TRUE(expr)      MOZ_ALWAYS_TRUE(expr)
@@ -129,16 +130,38 @@ Find(Container& c, const typename Contai
 template <typename InputIterT, typename CallableT>
 void
 ForEach(InputIterT begin, InputIterT end, CallableT f)
 {
     for (; begin != end; ++begin)
         f(*begin);
 }
 
+template <class Container1, class Container2>
+static inline bool
+EqualContainers(const Container1& lhs, const Container2& rhs)
+{
+    if (lhs.length() != rhs.length())
+        return false;
+    for (size_t i = 0, n = lhs.length(); i < n; i++) {
+        if (lhs[i] != rhs[i])
+            return false;
+    }
+    return true;
+}
+
+template <class Container>
+static inline HashNumber
+AddContainerToHash(const Container& c, HashNumber hn = 0)
+{
+    for (size_t i = 0; i < c.length(); i++)
+        hn = mozilla::AddToHash(hn, HashNumber(c[i]));
+    return hn;
+}
+
 template <class T>
 static inline T
 Min(T t1, T t2)
 {
     return t1 < t2 ? t1 : t2;
 }
 
 template <class T>
--- a/js/src/moz.build
+++ b/js/src/moz.build
@@ -139,22 +139,24 @@ EXPORTS.js += [
     '../public/Utility.h',
     '../public/Value.h',
     '../public/Vector.h',
     '../public/WeakMapPtr.h',
 ]
 
 UNIFIED_SOURCES += [
     'asmjs/AsmJS.cpp',
+    'asmjs/Wasm.cpp',
     'asmjs/WasmFrameIterator.cpp',
     'asmjs/WasmGenerator.cpp',
     'asmjs/WasmIonCompile.cpp',
     'asmjs/WasmModule.cpp',
     'asmjs/WasmSignalHandlers.cpp',
     'asmjs/WasmStubs.cpp',
+    'asmjs/WasmText.cpp',
     'asmjs/WasmTypes.cpp',
     'builtin/AtomicsObject.cpp',
     'builtin/Eval.cpp',
     'builtin/Intl.cpp',
     'builtin/MapObject.cpp',
     'builtin/ModuleObject.cpp',
     'builtin/Object.cpp',
     'builtin/Profilers.cpp',
--- a/js/src/vm/ArrayBufferObject.h
+++ b/js/src/vm/ArrayBufferObject.h
@@ -268,22 +268,16 @@ class ArrayBufferObject : public ArrayBu
     // non-incrementalized sweep time.
     ArrayBufferViewObject* firstView();
 
     bool addView(JSContext* cx, JSObject* view);
 
     void setNewOwnedData(FreeOp* fop, BufferContents newContents);
     void changeContents(JSContext* cx, BufferContents newContents);
 
-    /*
-     * Ensure data is not stored inline in the object. Used when handing back a
-     * GC-safe pointer.
-     */
-    static bool ensureNonInline(JSContext* cx, Handle<ArrayBufferObject*> buffer);
-
     /* Neuter this buffer and all its views. */
     static MOZ_WARN_UNUSED_RESULT bool
     neuter(JSContext* cx, Handle<ArrayBufferObject*> buffer, BufferContents newContents);
 
   private:
     void neuterView(JSContext* cx, ArrayBufferViewObject* view,
                     BufferContents newContents);
     void changeViewContents(JSContext* cx, ArrayBufferViewObject* view,
--- a/js/src/vm/Xdr.h
+++ b/js/src/vm/Xdr.h
@@ -28,17 +28,17 @@ namespace js {
  * this wiki page:
  *
  *  https://developer.mozilla.org/en-US/docs/SpiderMonkey/Internals/Bytecode
  */
 static const uint32_t XDR_BYTECODE_VERSION_SUBTRAHEND = 342;
 static const uint32_t XDR_BYTECODE_VERSION =
     uint32_t(0xb973c0de - XDR_BYTECODE_VERSION_SUBTRAHEND);
 
-static_assert(JSErr_Limit == 438,
+static_assert(JSErr_Limit == 440,
               "GREETINGS, POTENTIAL SUBTRAHEND INCREMENTER! If you added or "
               "removed MSG_DEFs from js.msg, you should increment "
               "XDR_BYTECODE_VERSION_SUBTRAHEND and update this assertion's "
               "expected JSErr_Limit value.");
 
 class XDRBuffer {
   public:
     explicit XDRBuffer(JSContext* cx)
--- a/layout/base/FrameLayerBuilder.cpp
+++ b/layout/base/FrameLayerBuilder.cpp
@@ -172,18 +172,21 @@ FrameLayerBuilder::DisplayItemData::EndU
   mUsed = false;
 }
 
 void
 FrameLayerBuilder::DisplayItemData::EndUpdate(nsAutoPtr<nsDisplayItemGeometry> aGeometry)
 {
   MOZ_RELEASE_ASSERT(mLayer);
   MOZ_ASSERT(mItem);
-
-  mGeometry = aGeometry;
+  MOZ_ASSERT(mGeometry || aGeometry);
+
+  if (aGeometry) {
+    mGeometry = aGeometry;
+  }
   mClip = mItem->GetClip();
   mFrameListChanges.Clear();
 
   mItem = nullptr;
   EndUpdate();
 }
 
 void
@@ -404,17 +407,16 @@ struct AssignedDisplayItem
  * makes it more likely a display item will be rendered to an opaque
  * layer, giving us the best chance of getting subpixel AA.
  */
 class PaintedLayerData {
 public:
   PaintedLayerData() :
     mAnimatedGeometryRoot(nullptr),
     mScrollClip(nullptr),
-    mFixedPosFrameForLayerData(nullptr),
     mReferenceFrame(nullptr),
     mLayer(nullptr),
     mSolidColor(NS_RGBA(0, 0, 0, 0)),
     mIsSolidColorInVisibleRegion(false),
     mFontSmoothingBackgroundColor(NS_RGBA(0,0,0,0)),
     mExclusiveToOneItem(false),
     mSingleItemFixedToViewport(false),
     mIsCaret(false),
@@ -549,17 +551,16 @@ public:
    * The offset between mAnimatedGeometryRoot and the reference frame.
    */
   nsPoint mAnimatedGeometryRootOffset;
   /**
    * If non-null, the frame from which we'll extract "fixed positioning"
    * metadata for this layer. This can be a position:fixed frame or a viewport
    * frame; the latter case is used for background-attachment:fixed content.
    */
-  const nsIFrame* mFixedPosFrameForLayerData;
   const nsIFrame* mReferenceFrame;
   PaintedLayer* mLayer;
   /**
    * If mIsSolidColorInVisibleRegion is true, this is the color of the visible
    * region.
    */
   nscolor      mSolidColor;
   /**
@@ -666,32 +667,30 @@ public:
   nsTArray<AssignedDisplayItem> mAssignedDisplayItems;
 
 };
 
 struct NewLayerEntry {
   NewLayerEntry()
     : mAnimatedGeometryRoot(nullptr)
     , mScrollClip(nullptr)
-    , mFixedPosFrameForLayerData(nullptr)
     , mLayerContentsVisibleRect(0, 0, -1, -1)
     , mLayerState(LAYER_INACTIVE)
     , mHideAllLayersBelow(false)
     , mOpaqueForAnimatedGeometryRootParent(false)
     , mPropagateComponentAlphaFlattening(true)
     , mUntransformedVisibleRegion(false)
     , mIsCaret(false)
     , mIsPerspectiveItem(false)
   {}
   // mLayer is null if the previous entry is for a PaintedLayer that hasn't
   // been optimized to some other form (yet).
   RefPtr<Layer> mLayer;
   AnimatedGeometryRoot* mAnimatedGeometryRoot;
   const DisplayItemScrollClip* mScrollClip;
-  const nsIFrame* mFixedPosFrameForLayerData;
   // If non-null, this FrameMetrics is set to the be the first FrameMetrics
   // on the layer.
   UniquePtr<FrameMetrics> mBaseFrameMetrics;
   // The following are only used for retained layers (for occlusion
   // culling of those layers). These regions are all relative to the
   // container reference frame.
   nsIntRegion mVisibleRegion;
   nsIntRegion mOpaqueRegion;
@@ -1073,20 +1072,16 @@ public:
     bool isAtRoot = !aContainerItem || (aContainerItem->Frame() == mBuilder->RootReferenceFrame());
     MOZ_ASSERT_IF(isAtRoot, mContainerReferenceFrame == mBuilder->RootReferenceFrame());
     mContainerAnimatedGeometryRoot = isAtRoot
       ? aBuilder->GetRootAnimatedGeometryRoot()
       : aContainerItem->GetAnimatedGeometryRoot();
     MOZ_ASSERT(!mBuilder->IsPaintingToWindow() ||
       nsLayoutUtils::IsAncestorFrameCrossDoc(mBuilder->RootReferenceFrame(),
                                              *mContainerAnimatedGeometryRoot));
-    NS_ASSERTION(!aContainerItem || !aContainerItem->ShouldFixToViewport(mBuilder),
-                 "Container items never return true for ShouldFixToViewport");
-    mContainerFixedPosFrame =
-        FindFixedPosFrameForLayerData(mContainerAnimatedGeometryRoot, false);
     // When AllowResidualTranslation is false, display items will be drawn
     // scaled with a translation by integer pixels, so we know how the snapping
     // will work.
     mSnappingEnabled = aManager->IsSnappingEffectiveTransforms() &&
       !mParameters.AllowResidualTranslation();
     CollectOldLayers();
   }
 
@@ -1277,34 +1272,16 @@ protected:
   /**
    * If aItem used to belong to a PaintedLayer, invalidates the area of
    * aItem in that layer. If aNewLayer is a PaintedLayer, invalidates the area of
    * aItem in that layer.
    */
   void InvalidateForLayerChange(nsDisplayItem* aItem,
                                 PaintedLayer* aNewLayer);
   /**
-   * Find the fixed-pos frame, if any, containing (or equal to)
-   * aAnimatedGeometryRoot. Only return a fixed-pos frame if its viewport
-   * has a displayport.
-   * aDisplayItemFixedToViewport is true if the layer contains a single display
-   * item which returned true for ShouldFixToViewport.
-   * This can return the actual viewport frame for layers whose display items
-   * are directly on the viewport (e.g. background-attachment:fixed backgrounds).
-   */
-  const nsIFrame* FindFixedPosFrameForLayerData(AnimatedGeometryRoot* aAnimatedGeometryRoot,
-                                                bool aDisplayItemFixedToViewport);
-  /**
-   * Set fixed-pos layer metadata on aLayer according to the data for aFixedPosFrame.
-   */
-  void SetFixedPositionLayerData(Layer* aLayer,
-                                 const nsIFrame* aFixedPosFrame,
-                                 bool aIsClipFixed);
-
-  /**
    * Returns true if aItem's opaque area (in aOpaque) covers the entire
    * scrollable area of its presshell.
    */
   bool ItemCoversScrollableArea(nsDisplayItem* aItem, const nsRegion& aOpaque);
 
   /**
    * Set FrameMetrics and scroll-induced clipping on aEntry's layer.
    */
@@ -1326,17 +1303,16 @@ protected:
   /**
    * Computes the snapped opaque area of aItem. Sets aList's opaque flag
    * if it covers the entire list bounds. Sets *aHideAllLayersBelow to true
    * this item covers the entire viewport so that all layers below are
    * permanently invisible.
    */
   nsIntRegion ComputeOpaqueRect(nsDisplayItem* aItem,
                                 AnimatedGeometryRoot* aAnimatedGeometryRoot,
-                                const nsIFrame* aFixedPosFrame,
                                 const DisplayItemClip& aClip,
                                 nsDisplayList* aList,
                                 bool* aHideAllLayersBelow,
                                 bool* aOpaqueForAnimatedGeometryRootParent);
 
   /**
    * Return a PaintedLayerData object that is initialized for a layer that
    * aItem will be assigned to.
@@ -1381,17 +1357,16 @@ protected:
                                   AnimatedGeometryRoot **aAnimatedGeometryRoot);
 
   nsDisplayListBuilder*            mBuilder;
   LayerManager*                    mManager;
   FrameLayerBuilder*               mLayerBuilder;
   nsIFrame*                        mContainerFrame;
   nsIFrame*                        mContainerReferenceFrame;
   AnimatedGeometryRoot*            mContainerAnimatedGeometryRoot;
-  const nsIFrame*                  mContainerFixedPosFrame;
   ContainerLayer*                  mContainerLayer;
   nsRect                           mContainerBounds;
   const DisplayItemScrollClip*     mContainerScrollClip;
   DebugOnly<nsRect>                mAccumulatedChildBounds;
   ContainerLayerParameters         mParameters;
   /**
    * The region of PaintedLayers that should be invalidated every time
    * we recycle one.
@@ -1972,36 +1947,39 @@ FrameLayerBuilder::GetDebugOldLayerFor(n
 
     if (data->mDisplayItemKey == aDisplayItemKey) {
       return data->mLayer;
     }
   }
   return nullptr;
 }
 
-/* static */ Layer*
-FrameLayerBuilder::GetDebugSingleOldLayerForFrame(nsIFrame* aFrame)
+/* static */ PaintedLayer*
+FrameLayerBuilder::GetDebugSingleOldPaintedLayerForFrame(nsIFrame* aFrame)
 {
   const nsTArray<DisplayItemData*>* array =
     static_cast<nsTArray<DisplayItemData*>*>(aFrame->Properties().Get(LayerManagerDataProperty()));
 
   if (!array) {
     return nullptr;
   }
 
   Layer* layer = nullptr;
   for (DisplayItemData* data : *array) {
     AssertDisplayItemData(data);
+    if (!data->mLayer->AsPaintedLayer()) {
+      continue;
+    }
     if (layer && layer != data->mLayer) {
       // More than one layer assigned, bail.
       return nullptr;
     }
     layer = data->mLayer;
   }
-  return layer;
+  return layer->AsPaintedLayer();
 }
 
 already_AddRefed<ColorLayer>
 ContainerState::CreateOrRecycleColorLayer(PaintedLayer *aPainted)
 {
   PaintedDisplayItemLayerUserData* data =
       static_cast<PaintedDisplayItemLayerUserData*>(aPainted->GetUserData(&gPaintedDisplayItemLayerUserData));
   RefPtr<ColorLayer> layer = data->mColorLayer;
@@ -2978,87 +2956,16 @@ PaintedLayerDataTree::FindNodeForAncesto
   PaintedLayerDataNode* node = mNodes.Get(aAnimatedGeometryRoot);
   if (node) {
     return node;
   }
   *aOutAncestorChild = aAnimatedGeometryRoot;
   return FindNodeForAncestorAnimatedGeometryRoot(aAnimatedGeometryRoot->mParentAGR, aOutAncestorChild);
 }
 
-const nsIFrame*
-ContainerState::FindFixedPosFrameForLayerData(AnimatedGeometryRoot* aAnimatedGeometryRoot,
-                                              bool aDisplayItemFixedToViewport)
-{
-  if (!mManager->IsWidgetLayerManager()) {
-    // Never attach any fixed-pos metadata to inactive layers, it's pointless!
-    return nullptr;
-  }
-
-  nsPresContext* presContext = mContainerFrame->PresContext();
-  nsIFrame* viewport = presContext->PresShell()->GetRootFrame();
-
-  if (viewport == *aAnimatedGeometryRoot && aDisplayItemFixedToViewport &&
-      nsLayoutUtils::ViewportHasDisplayPort(presContext)) {
-    // Probably a background-attachment:fixed item
-    return viewport;
-  }
-  // Viewports with no fixed-pos frames are not relevant.
-  if (!viewport->GetChildList(nsIFrame::kFixedList).FirstChild()) {
-    return nullptr;
-  }
-  for (const nsIFrame* f = *aAnimatedGeometryRoot; f; f = f->GetParent()) {
-    if (nsLayoutUtils::IsFixedPosFrameInDisplayPort(f)) {
-      return f;
-    }
-    if (f == mContainerReferenceFrame) {
-      // The metadata will go on an ancestor layer if necessary.
-      return nullptr;
-    }
-  }
-  return nullptr;
-}
-
-void
-ContainerState::SetFixedPositionLayerData(Layer* aLayer,
-                                          const nsIFrame* aFixedPosFrame,
-                                          bool aIsClipFixed)
-{
-  aLayer->SetIsFixedPosition(aFixedPosFrame != nullptr);
-  if (!aFixedPosFrame) {
-    return;
-  }
-
-  nsPresContext* presContext = aFixedPosFrame->PresContext();
-
-  const nsIFrame* viewportFrame = aFixedPosFrame->GetParent();
-  // anchorRect will be in the container's coordinate system (aLayer's parent layer).
-  // This is the same as the display items' reference frame.
-  nsRect anchorRect;
-  if (viewportFrame) {
-    // Fixed position frames are reflowed into the scroll-port size if one has
-    // been set.
-    if (presContext->PresShell()->IsScrollPositionClampingScrollPortSizeSet()) {
-      anchorRect.SizeTo(presContext->PresShell()->GetScrollPositionClampingScrollPortSize());
-    } else {
-      anchorRect.SizeTo(viewportFrame->GetSize());
-    }
-  } else {
-    // A display item directly attached to the viewport.
-    // For background-attachment:fixed items, the anchor point is always the
-    // top-left of the viewport currently.
-    viewportFrame = aFixedPosFrame;
-  }
-  // The anchorRect top-left is always the viewport top-left.
-  anchorRect.MoveTo(viewportFrame->GetOffsetToCrossDoc(mContainerReferenceFrame));
-
-  nsLayoutUtils::SetFixedPositionLayerData(aLayer,
-      viewportFrame, anchorRect, aFixedPosFrame, presContext, mParameters,
-      aIsClipFixed);
-}
-
 static bool
 CanOptimizeAwayPaintedLayer(PaintedLayerData* aData,
                            FrameLayerBuilder* aLayerBuilder)
 {
   if (!aLayerBuilder->IsBuildingRetainedLayers()) {
     return false;
   }
 
@@ -3202,17 +3109,16 @@ void ContainerState::FinishPaintedLayerD
       NS_ASSERTION(newLayerEntry->mLayer == data->mLayer,
                    "Painted layer at wrong index");
       // Store optimized layer in reserved slot
       newLayerEntry = &mNewChildLayers[data->mNewChildLayersIndex + 1];
       NS_ASSERTION(!newLayerEntry->mLayer, "Slot already occupied?");
       newLayerEntry->mLayer = layer;
       newLayerEntry->mAnimatedGeometryRoot = data->mAnimatedGeometryRoot;
       newLayerEntry->mScrollClip = data->mScrollClip;
-      newLayerEntry->mFixedPosFrameForLayerData = data->mFixedPosFrameForLayerData;
       newLayerEntry->mIsCaret = data->mIsCaret;
 
       // Hide the PaintedLayer. We leave it in the layer tree so that we
       // can find and recycle it later.
       ParentLayerIntRect emptyRect;
       data->mLayer->SetClipRect(Some(emptyRect));
       data->mLayer->SetVisibleRegion(LayerIntRegion());
       data->mLayer->InvalidateRegion(data->mLayer->GetValidRegion().GetBounds());
@@ -3341,19 +3247,16 @@ void ContainerState::FinishPaintedLayerD
   } else if (data->mNeedComponentAlpha && !hidpi) {
     flags |= Layer::CONTENT_COMPONENT_ALPHA;
   }
   if (data->mDisableFlattening) {
     flags |= Layer::CONTENT_DISABLE_FLATTENING;
   }
   layer->SetContentFlags(flags);
 
-  SetFixedPositionLayerData(layer, data->mFixedPosFrameForLayerData,
-                            !data->mSingleItemFixedToViewport);
-
   PaintedLayerData* containingPaintedLayerData =
      mLayerBuilder->GetContainingPaintedLayerData();
   if (containingPaintedLayerData) {
     if (!data->mDispatchToContentHitRegion.GetBounds().IsEmpty()) {
       nsRect rect = nsLayoutUtils::TransformFrameRectToAncestor(
         mContainerReferenceFrame,
         data->mDispatchToContentHitRegion.GetBounds(),
         containingPaintedLayerData->mReferenceFrame);
@@ -3615,28 +3518,25 @@ ContainerState::NewPaintedLayerData(nsDi
                                     const DisplayItemScrollClip* aScrollClip,
                                     const nsPoint& aTopLeft,
                                     bool aShouldFixToViewport)
 {
   PaintedLayerData data;
   data.mAnimatedGeometryRoot = aAnimatedGeometryRoot;
   data.mScrollClip = aScrollClip;
   data.mAnimatedGeometryRootOffset = aTopLeft;
-  data.mFixedPosFrameForLayerData =
-    FindFixedPosFrameForLayerData(aAnimatedGeometryRoot, aShouldFixToViewport);
   data.mReferenceFrame = aItem->ReferenceFrame();
   data.mSingleItemFixedToViewport = aShouldFixToViewport;
   data.mBackfaceHidden = aItem->Frame()->BackfaceIsHidden();
   data.mIsCaret = aItem->GetType() == nsDisplayItem::TYPE_CARET;
 
   data.mNewChildLayersIndex = mNewChildLayers.Length();
   NewLayerEntry* newLayerEntry = mNewChildLayers.AppendElement();
   newLayerEntry->mAnimatedGeometryRoot = aAnimatedGeometryRoot;
   newLayerEntry->mScrollClip = aScrollClip;
-  newLayerEntry->mFixedPosFrameForLayerData = data.mFixedPosFrameForLayerData;
   newLayerEntry->mIsCaret = data.mIsCaret;
   // newLayerEntry->mOpaqueRegion is filled in later from
   // paintedLayerData->mOpaqueRegion, if necessary.
 
   // Allocate another entry for this layer's optimization to ColorLayer/ImageLayer
   mNewChildLayers.AppendElement();
 
   return data;
@@ -3738,33 +3638,31 @@ ContainerState::ChooseAnimatedGeometryRo
     return true;
   }
   return false;
 }
 
 nsIntRegion
 ContainerState::ComputeOpaqueRect(nsDisplayItem* aItem,
                                   AnimatedGeometryRoot* aAnimatedGeometryRoot,
-                                  const nsIFrame* aFixedPosFrame,
                                   const DisplayItemClip& aClip,
                                   nsDisplayList* aList,
                                   bool* aHideAllLayersBelow,
                                   bool* aOpaqueForAnimatedGeometryRootParent)
 {
   bool snapOpaque;
   nsRegion opaque = aItem->GetOpaqueRegion(mBuilder, &snapOpaque);
   nsIntRegion opaquePixels;
   if (!opaque.IsEmpty()) {
     nsRegion opaqueClipped;
     nsRegionRectIterator iter(opaque);
     for (const nsRect* r = iter.Next(); r; r = iter.Next()) {
       opaqueClipped.Or(opaqueClipped, aClip.ApproximateIntersectInward(*r));
     }
     if (aAnimatedGeometryRoot == mContainerAnimatedGeometryRoot &&
-        aFixedPosFrame == mContainerFixedPosFrame &&
         opaqueClipped.Contains(mContainerBounds)) {
       *aHideAllLayersBelow = true;
       aList->SetIsOpaque();
     }
     // Add opaque areas to the "exclude glass" region. Only do this when our
     // container layer is going to be the rootmost layer, otherwise transforms
     // etc will mess us up (and opaque contributions from other containers are
     // not needed).
@@ -4125,20 +4023,16 @@ ContainerState::ProcessDisplayItems(nsDi
       if (item->BackfaceIsHidden()) {
         ownLayer->SetContentFlags(ownLayer->GetContentFlags() |
                                   Layer::CONTENT_BACKFACE_HIDDEN);
       } else {
         ownLayer->SetContentFlags(ownLayer->GetContentFlags() &
                                   ~Layer::CONTENT_BACKFACE_HIDDEN);
       }
 
-      const nsIFrame* fixedPosFrame =
-        FindFixedPosFrameForLayerData(animatedGeometryRoot, shouldFixToViewport);
-      SetFixedPositionLayerData(ownLayer, fixedPosFrame, !shouldFixToViewport);
-
       nsRect invalid;
       if (item->IsInvalid(invalid)) {
         ownLayer->SetInvalidRectToVisibleRegion();
       }
 
       // If it's not a ContainerLayer, we need to apply the scale transform
       // ourselves.
       if (!ownLayer->AsContainerLayer()) {
@@ -4172,17 +4066,16 @@ ContainerState::ProcessDisplayItems(nsDi
       }
       NS_ASSERTION(FindIndexOfLayerIn(mNewChildLayers, ownLayer) < 0,
                    "Layer already in list???");
 
       NewLayerEntry* newLayerEntry = mNewChildLayers.AppendElement();
       newLayerEntry->mLayer = ownLayer;
       newLayerEntry->mAnimatedGeometryRoot = animatedGeometryRoot;
       newLayerEntry->mScrollClip = agrScrollClip;
-      newLayerEntry->mFixedPosFrameForLayerData = fixedPosFrame;
       newLayerEntry->mLayerState = layerState;
       if (itemType == nsDisplayItem::TYPE_PERSPECTIVE) {
         newLayerEntry->mIsPerspectiveItem = true;
       }
 
       // Don't attempt to flatten compnent alpha layers that are within
       // a forced active layer, or an active transform;
       if (itemType == nsDisplayItem::TYPE_TRANSFORM ||
@@ -4207,17 +4100,17 @@ ContainerState::ProcessDisplayItems(nsDi
           // to avoid failure caused by singular transforms.
           newLayerEntry->mUntransformedVisibleRegion = true;
           newLayerEntry->mVisibleRegion =
             item->GetVisibleRectForChildren().ToOutsidePixels(mAppUnitsPerDevPixel);
         } else {
           newLayerEntry->mVisibleRegion = itemVisibleRect;
         }
         newLayerEntry->mOpaqueRegion = ComputeOpaqueRect(item,
-          animatedGeometryRoot, fixedPosFrame, layerClip, aList,
+          animatedGeometryRoot, layerClip, aList,
           &newLayerEntry->mHideAllLayersBelow,
           &newLayerEntry->mOpaqueForAnimatedGeometryRootParent);
       } else {
         bool useChildrenVisible =
           itemType == nsDisplayItem::TYPE_TRANSFORM &&
           item->Frame()->IsPreserve3DLeaf();
         const nsIntRegion &visible = useChildrenVisible ?
           item->GetVisibleRectForChildren().ToOutsidePixels(mAppUnitsPerDevPixel):
@@ -4242,21 +4135,20 @@ ContainerState::ProcessDisplayItems(nsDi
       }
 
       /**
        * No need to allocate geometry for items that aren't
        * part of a PaintedLayer.
        */
       mLayerBuilder->AddLayerDisplayItem(ownLayer, item, layerState, nullptr);
     } else {
-      bool forceOwnLayer = shouldFixToViewport;
       bool avoidCreatingLayer = (maxLayers != -1 && layerCount >= maxLayers);
       PaintedLayerData* paintedLayerData =
         mPaintedLayerDataTree.FindPaintedLayerFor(animatedGeometryRoot, agrScrollClip,
-                                                  itemVisibleRect, forceOwnLayer,
+                                                  itemVisibleRect, false,
                                                   item->Frame()->BackfaceIsHidden(),
                                                   avoidCreatingLayer,
                                                   [&]() {
           layerCount++;
           return NewPaintedLayerData(item, animatedGeometryRoot, agrScrollClip,
                                      topLeft, shouldFixToViewport);
         });
 
@@ -4266,18 +4158,17 @@ ContainerState::ProcessDisplayItems(nsDi
         paintedLayerData->AccumulateEventRegions(this, eventRegions);
       } else {
         // check to see if the new item has rounded rect clips in common with
         // other items in the layer
         if (mManager->IsWidgetLayerManager()) {
           paintedLayerData->UpdateCommonClipCount(itemClip);
         }
         nsIntRegion opaquePixels = ComputeOpaqueRect(item,
-            animatedGeometryRoot, paintedLayerData->mFixedPosFrameForLayerData,
-            itemClip, aList,
+            animatedGeometryRoot, itemClip, aList,
             &paintedLayerData->mHideAllLayersBelow,
             &paintedLayerData->mOpaqueForAnimatedGeometryRootParent);
         MOZ_ASSERT(nsIntRegion(itemDrawRect).Contains(opaquePixels));
         opaquePixels.AndWith(itemVisibleRect);
         paintedLayerData->Accumulate(this, item, opaquePixels,
             itemVisibleRect, itemClip, layerState);
 
         // If we removed the clip from the display item above because it's
@@ -4351,74 +4242,77 @@ FrameLayerBuilder::ComputeGeometryChange
   PaintedLayer* paintedLayer = aData->mLayer->AsPaintedLayer();
   if (!item || !paintedLayer) {
     aData->EndUpdate();
     return;
   }
 
   PaintedLayerItemsEntry* entry = mPaintedLayerItems.GetEntry(paintedLayer);
 
-  nsAutoPtr<nsDisplayItemGeometry> geometry(item->AllocateGeometry(mDisplayListBuilder));
+  nsAutoPtr<nsDisplayItemGeometry> geometry;
 
   PaintedDisplayItemLayerUserData* layerData =
     static_cast<PaintedDisplayItemLayerUserData*>(aData->mLayer->GetUserData(&gPaintedDisplayItemLayerUserData));
   nsPoint shift = layerData->mAnimatedGeometryRootOrigin - layerData->mLastAnimatedGeometryRootOrigin;
 
   const DisplayItemClip& clip = item->GetClip();
 
-  // If the frame is marked as invalidated, and didn't specify a rect to invalidate  then we want to
+  // If the frame is marked as invalidated, and didn't specify a rect to invalidate then we want to
   // invalidate both the old and new bounds, otherwise we only want to invalidate the changed areas.
   // If we do get an invalid rect, then we want to add this on top of the change areas.
   nsRect invalid;
   nsRegion combined;
   bool notifyRenderingChanged = true;
   if (!aData->mGeometry) {
     // This item is being added for the first time, invalidate its entire area.
-    //TODO: We call GetGeometry again in AddPaintedDisplayItem, we should reuse this.
+    geometry = item->AllocateGeometry(mDisplayListBuilder);
     combined = clip.ApplyNonRoundedIntersection(geometry->ComputeInvalidationRegion());
 #ifdef MOZ_DUMP_PAINTING
     if (nsLayoutUtils::InvalidationDebuggingIsEnabled()) {
       printf_stderr("Display item type %s(%p) added to layer %p!\n", item->Name(), item->Frame(), aData->mLayer.get());
     }
 #endif
   } else if (aData->mIsInvalid || (item->IsInvalid(invalid) && invalid.IsEmpty())) {
-    // Either layout marked item as needing repainting, invalidate the entire old and new areas.
+    // Layout marked item/frame as needing repainting (without an explicit rect), invalidate the entire old and new areas.
+    geometry = item->AllocateGeometry(mDisplayListBuilder);
     combined = aData->mClip.ApplyNonRoundedIntersection(aData->mGeometry->ComputeInvalidationRegion());
     combined.MoveBy(shift);
     combined.Or(combined, clip.ApplyNonRoundedIntersection(geometry->ComputeInvalidationRegion()));
 #ifdef MOZ_DUMP_PAINTING
     if (nsLayoutUtils::InvalidationDebuggingIsEnabled()) {
       printf_stderr("Display item type %s(%p) (in layer %p) belongs to an invalidated frame!\n", item->Name(), item->Frame(), aData->mLayer.get());
     }
 #endif
   } else {
     // Let the display item check for geometry changes and decide what needs to be
     // repainted.
 
     const nsTArray<nsIFrame*>& changedFrames = aData->GetFrameListChanges();
-
-    // We have an optimization to cache the drawing background-attachment: fixed canvas
+    aData->mGeometry->MoveBy(shift);
+    item->ComputeInvalidationRegion(mDisplayListBuilder, aData->mGeometry, &combined);
+
+    // We have an optimization to cache the drawing of background-attachment: fixed canvas
     // background images so we can scroll and just blit them when they are flattened into
     // the same layer as scrolling content. NotifyRenderingChanged is only used to tell
     // the canvas bg image item to purge this cache. We want to be careful not to accidentally
     // purge the cache if we are just invalidating due to scrolling (ie the background image
     // moves on the scrolling layer but it's rendering stays the same) so if
     // AddOffsetAndComputeDifference is the only thing that will invalidate we skip the
     // NotifyRenderingChanged call (ComputeInvalidationRegion for background images also calls
     // NotifyRenderingChanged if anything changes).
-    if (aData->mGeometry->ComputeInvalidationRegion() == geometry->ComputeInvalidationRegion() &&
-        aData->mClip == clip && invalid.IsEmpty() && changedFrames.Length() == 0) {
+    if (!combined.IsEmpty()) {
+      geometry = item->AllocateGeometry(mDisplayListBuilder);
+    } else if (aData->mClip == clip && invalid.IsEmpty() && changedFrames.Length() == 0) {
       notifyRenderingChanged = false;
     }
-
-    aData->mGeometry->MoveBy(shift);
-    item->ComputeInvalidationRegion(mDisplayListBuilder, aData->mGeometry, &combined);
     aData->mClip.AddOffsetAndComputeDifference(entry->mCommonClipCount,
                                                shift, aData->mGeometry->ComputeInvalidationRegion(),
-                                               clip, entry->mLastCommonClipCount, geometry->ComputeInvalidationRegion(),
+                                               clip, entry->mLastCommonClipCount,
+                                               geometry ? geometry->ComputeInvalidationRegion() :
+                                                          aData->mGeometry->ComputeInvalidationRegion(),
                                                &combined);
 
     // Add in any rect that the frame specified
     combined.Or(combined, invalid);
 
     for (uint32_t i = 0; i < changedFrames.Length(); i++) {
       combined.Or(combined, changedFrames[i]->GetVisualOverflowRect());
     }
@@ -4743,29 +4637,26 @@ ContainerState::CollectOldLayers()
                    "Could not recycle mask layer, unsupported layer type.");
       mRecycledMaskImageLayers.Put(MaskLayerKey(layer, Some(i)), static_cast<ImageLayer*>(maskLayer));
     }
   }
 }
 
 struct OpaqueRegionEntry {
   AnimatedGeometryRoot* mAnimatedGeometryRoot;
-  const nsIFrame* mFixedPosFrameForLayerData;
   nsIntRegion mOpaqueRegion;
 };
 
 static OpaqueRegionEntry*
 FindOpaqueRegionEntry(nsTArray<OpaqueRegionEntry>& aEntries,
-                      AnimatedGeometryRoot* aAnimatedGeometryRoot,
-                      const nsIFrame* aFixedPosFrameForLayerData)
+                      AnimatedGeometryRoot* aAnimatedGeometryRoot)
 {
   for (uint32_t i = 0; i < aEntries.Length(); ++i) {
     OpaqueRegionEntry* d = &aEntries[i];
-    if (d->mAnimatedGeometryRoot == aAnimatedGeometryRoot &&
-        d->mFixedPosFrameForLayerData == aFixedPosFrameForLayerData) {
+    if (d->mAnimatedGeometryRoot == aAnimatedGeometryRoot) {
       return d;
     }
   }
   return nullptr;
 }
 
 void
 ContainerState::SetupScrollingMetadata(NewLayerEntry* aEntry)
@@ -4893,18 +4784,17 @@ ContainerState::PostprocessRetainedLayer
       continue;
     }
 
     // If mFlattenToSingleLayer is true, there isn't going to be any
     // async scrolling so we can apply all our opaqueness to the same
     // entry, the entry for mContainerAnimatedGeometryRoot.
     AnimatedGeometryRoot* animatedGeometryRootForOpaqueness =
         mFlattenToSingleLayer ? mContainerAnimatedGeometryRoot : e->mAnimatedGeometryRoot;
-    OpaqueRegionEntry* data = FindOpaqueRegionEntry(opaqueRegions,
-        animatedGeometryRootForOpaqueness, e->mFixedPosFrameForLayerData);
+    OpaqueRegionEntry* data = FindOpaqueRegionEntry(opaqueRegions, animatedGeometryRootForOpaqueness);
 
     SetupScrollingMetadata(e);
 
     if (hideAll) {
       e->mVisibleRegion.SetEmpty();
     } else if (!e->mLayer->IsScrollbarContainer()) {
       const Maybe<ParentLayerIntRect>& clipRect = GetStationaryClipInContainer(e->mLayer);
       if (clipRect && opaqueRegionForContainer >= 0 &&
@@ -4925,29 +4815,26 @@ ContainerState::PostprocessRetainedLayer
       InvalidateVisibleBoundsChangesForScrolledLayer(p);
     }
 
     if (!e->mOpaqueRegion.IsEmpty()) {
       AnimatedGeometryRoot* animatedGeometryRootToCover = animatedGeometryRootForOpaqueness;
       if (e->mOpaqueForAnimatedGeometryRootParent &&
           e->mAnimatedGeometryRoot->mParentAGR == mContainerAnimatedGeometryRoot) {
         animatedGeometryRootToCover = mContainerAnimatedGeometryRoot;
-        data = FindOpaqueRegionEntry(opaqueRegions,
-            animatedGeometryRootToCover, e->mFixedPosFrameForLayerData);
+        data = FindOpaqueRegionEntry(opaqueRegions, animatedGeometryRootToCover);
       }
 
       if (!data) {
-        if (animatedGeometryRootToCover == mContainerAnimatedGeometryRoot &&
-            e->mFixedPosFrameForLayerData == mContainerFixedPosFrame) {
+        if (animatedGeometryRootToCover == mContainerAnimatedGeometryRoot) {
           NS_ASSERTION(opaqueRegionForContainer == -1, "Already found it?");
           opaqueRegionForContainer = opaqueRegions.Length();
         }
         data = opaqueRegions.AppendElement();
         data->mAnimatedGeometryRoot = animatedGeometryRootToCover;
-        data->mFixedPosFrameForLayerData = e->mFixedPosFrameForLayerData;
       }
 
       nsIntRegion clippedOpaque = e->mOpaqueRegion;
       Maybe<ParentLayerIntRect> clipRect = e->mLayer->GetCombinedClipRect();
       if (clipRect) {
         clippedOpaque.AndWith(clipRect->ToUnknownRect());
       }
       if (e->mLayer->GetIsFixedPosition() && !e->mLayer->IsClipFixed()) {
--- a/layout/base/FrameLayerBuilder.h
+++ b/layout/base/FrameLayerBuilder.h
@@ -353,17 +353,17 @@ public:
   static Layer* GetDebugOldLayerFor(nsIFrame* aFrame, uint32_t aDisplayItemKey);
 
   /**
    * Return the layer that all display items of aFrame were assigned to in the
    * last paint, or nullptr if there was no single layer assigned to all of the
    * frame's display items (i.e. zero, or more than one).
    * This function is for testing purposes and not performance sensitive.
    */
-  static Layer* GetDebugSingleOldLayerForFrame(nsIFrame* aFrame);
+  static PaintedLayer* GetDebugSingleOldPaintedLayerForFrame(nsIFrame* aFrame);
 
   /**
    * Destroy any stored LayerManagerDataProperty and the associated data for
    * aFrame.
    */
   static void DestroyDisplayItemDataFor(nsIFrame* aFrame);
 
   LayerManager* GetRetainingLayerManager() { return mRetainingManager; }
--- a/layout/base/ZoomConstraintsClient.cpp
+++ b/layout/base/ZoomConstraintsClient.cpp
@@ -43,16 +43,19 @@ ZoomConstraintsClient::ZoomConstraintsCl
 
 ZoomConstraintsClient::~ZoomConstraintsClient()
 {
 }
 
 static nsIWidget*
 GetWidget(nsIPresShell* aShell)
 {
+  if (!aShell) {
+    return nullptr;
+  }
   if (nsIFrame* rootFrame = aShell->GetRootFrame()) {
 #if defined(MOZ_WIDGET_ANDROID) || defined(MOZ_WIDGET_UIKIT)
     return rootFrame->GetNearestWidget();
 #else
     if (nsView* view = rootFrame->GetView()) {
       return view->GetWidget();
     }
 #endif
--- a/layout/base/nsDisplayItemTypesList.h
+++ b/layout/base/nsDisplayItemTypesList.h
@@ -20,16 +20,17 @@ DECLARE_DISPLAY_ITEM_TYPE(CARET)
 DECLARE_DISPLAY_ITEM_TYPE(CHECKED_CHECKBOX)
 DECLARE_DISPLAY_ITEM_TYPE(CHECKED_RADIOBUTTON)
 DECLARE_DISPLAY_ITEM_TYPE(CLEAR_BACKGROUND)
 DECLARE_DISPLAY_ITEM_TYPE(COLUMN_RULE)
 DECLARE_DISPLAY_ITEM_TYPE(COMBOBOX_FOCUS)
 DECLARE_DISPLAY_ITEM_TYPE(EVENT_RECEIVER)
 DECLARE_DISPLAY_ITEM_TYPE(LAYER_EVENT_REGIONS)
 DECLARE_DISPLAY_ITEM_TYPE(FIELDSET_BORDER_BACKGROUND)
+DECLARE_DISPLAY_ITEM_TYPE(FIXED_POSITION)
 DECLARE_DISPLAY_ITEM_TYPE(STICKY_POSITION)
 DECLARE_DISPLAY_ITEM_TYPE(FRAMESET_BORDER)
 DECLARE_DISPLAY_ITEM_TYPE(FRAMESET_BLANK)
 DECLARE_DISPLAY_ITEM_TYPE(HEADER_FOOTER)
 DECLARE_DISPLAY_ITEM_TYPE(IMAGE)
 DECLARE_DISPLAY_ITEM_TYPE(LIST_FOCUS)
 DECLARE_DISPLAY_ITEM_TYPE(MIX_BLEND_MODE)
 DECLARE_DISPLAY_ITEM_TYPE(OPACITY)
--- a/layout/base/nsDisplayList.cpp
+++ b/layout/base/nsDisplayList.cpp
@@ -2240,17 +2240,16 @@ RegisterThemeGeometry(nsDisplayListBuild
 }
 
 nsDisplayBackgroundImage::nsDisplayBackgroundImage(nsDisplayListBuilder* aBuilder,
                                                    nsIFrame* aFrame,
                                                    uint32_t aLayer,
                                                    const nsStyleBackground* aBackgroundStyle)
   : nsDisplayImageContainer(aBuilder, aFrame)
   , mBackgroundStyle(aBackgroundStyle)
-  , mAnimatedGeometryRootForScrollMetadata(mAnimatedGeometryRoot)
   , mLayer(aLayer)
 {
   MOZ_COUNT_CTOR(nsDisplayBackgroundImage);
 
   mBounds = GetBoundsInternal(aBuilder);
   mDestArea = GetDestAreaInternal(aBuilder);
   if (ShouldFixToViewport(aBuilder)) {
     mAnimatedGeometryRoot = aBuilder->FindAnimatedGeometryRootFor(this);
@@ -2427,17 +2426,23 @@ nsDisplayBackgroundImage::AppendBackgrou
     if (!aBuilder->IsForEventDelivery()) {
       const nsStyleBackground::Layer& layer = bg->mLayers[i];
       SetBackgroundClipRegion(clipState, aFrame, toRef,
                               layer, willPaintBorder);
     }
 
     nsDisplayBackgroundImage* bgItem =
       new (aBuilder) nsDisplayBackgroundImage(aBuilder, aFrame, i, bg);
-    bgItemList.AppendNewToTop(bgItem);
+
+    if (bgItem->ShouldFixToViewport(aBuilder)) {
+      bgItemList.AppendNewToTop(
+        nsDisplayFixedPosition::CreateForFixedBackground(aBuilder, aFrame, bgItem, i));
+    } else {
+      bgItemList.AppendNewToTop(bgItem);
+    }
   }
 
   if (needBlendContainer) {
     bgItemList.AppendNewToTop(
       new (aBuilder) nsDisplayBlendContainer(aBuilder, aFrame, &bgItemList));
   }
 
   aList->AppendToTop(&bgItemList);
@@ -2991,16 +2996,23 @@ nsDisplayBackgroundImage::GetBoundsInter
 
 uint32_t
 nsDisplayBackgroundImage::GetPerFrameKey()
 {
   return (mLayer << nsDisplayItem::TYPE_BITS) |
     nsDisplayItem::GetPerFrameKey();
 }
 
+void
+nsDisplayBackgroundImage::MarkBoundsAsVisible(nsDisplayListBuilder* aBuilder)
+{
+  bool snap;
+  mVisibleRect = GetBounds(aBuilder, &snap);
+}
+
 nsDisplayThemedBackground::nsDisplayThemedBackground(nsDisplayListBuilder* aBuilder,
                                                      nsIFrame* aFrame)
   : nsDisplayItem(aBuilder, aFrame)
 {
   MOZ_COUNT_CTOR(nsDisplayThemedBackground);
 
   const nsStyleDisplay* disp = mFrame->StyleDisplay();
   mAppearance = disp->mAppearance;
@@ -4619,16 +4631,127 @@ nsDisplayResolution::BuildLayer(nsDispla
     aBuilder, aManager, containerParameters);
   layer->SetPostScale(1.0f / presShell->GetResolution(),
                       1.0f / presShell->GetResolution());
   layer->AsContainerLayer()->SetScaleToResolution(
       presShell->ScaleToResolution(), presShell->GetResolution());
   return layer.forget();
 }
 
+nsDisplayFixedPosition::nsDisplayFixedPosition(nsDisplayListBuilder* aBuilder,
+                                               nsIFrame* aFrame,
+                                               nsDisplayList* aList)
+  : nsDisplayOwnLayer(aBuilder, aFrame, aList)
+  , mIndex(0)
+  , mIsFixedBackground(false)
+{
+  MOZ_COUNT_CTOR(nsDisplayFixedPosition);
+  Init(aBuilder);
+}
+
+nsDisplayFixedPosition::nsDisplayFixedPosition(nsDisplayListBuilder* aBuilder,
+                                               nsIFrame* aFrame,
+                                               nsDisplayList* aList,
+                                               uint32_t aIndex)
+  : nsDisplayOwnLayer(aBuilder, aFrame, aList)
+  , mIndex(aIndex)
+  , mIsFixedBackground(true)
+{
+  MOZ_COUNT_CTOR(nsDisplayFixedPosition);
+  Init(aBuilder);
+}
+
+void
+nsDisplayFixedPosition::Init(nsDisplayListBuilder* aBuilder)
+{
+  bool snap;
+  mVisibleRect = GetBounds(aBuilder, &snap);
+  mAnimatedGeometryRootForScrollMetadata = mAnimatedGeometryRoot;
+  if (ShouldFixToViewport(aBuilder)) {
+    mAnimatedGeometryRoot = aBuilder->FindAnimatedGeometryRootFor(this);
+  }
+}
+
+/* static */ nsDisplayFixedPosition*
+nsDisplayFixedPosition::CreateForFixedBackground(nsDisplayListBuilder* aBuilder,
+                                                 nsIFrame* aFrame,
+                                                 nsDisplayBackgroundImage* aImage,
+                                                 uint32_t aIndex)
+{
+  // Clear clipping on the child item, since we will apply it to the
+  // fixed position item as well.
+  aImage->SetClip(aBuilder, DisplayItemClip());
+  aImage->SetScrollClip(nullptr);
+  aImage->MarkBoundsAsVisible(aBuilder);
+
+  nsDisplayList temp;
+  temp.AppendToTop(aImage);
+
+  return new (aBuilder) nsDisplayFixedPosition(aBuilder, aFrame, &temp, aIndex + 1);
+}
+
+
+#ifdef NS_BUILD_REFCNT_LOGGING
+nsDisplayFixedPosition::~nsDisplayFixedPosition() {
+  MOZ_COUNT_DTOR(nsDisplayFixedPosition);
+}
+#endif
+
+already_AddRefed<Layer>
+nsDisplayFixedPosition::BuildLayer(nsDisplayListBuilder* aBuilder,
+                                   LayerManager* aManager,
+                                   const ContainerLayerParameters& aContainerParameters) {
+  RefPtr<Layer> layer =
+    nsDisplayOwnLayer::BuildLayer(aBuilder, aManager, aContainerParameters);
+
+  layer->SetIsFixedPosition(true);
+
+  nsPresContext* presContext = Frame()->PresContext();
+  nsIFrame* fixedFrame = mIsFixedBackground ? presContext->PresShell()->GetRootFrame() : Frame();
+
+  const nsIFrame* viewportFrame = fixedFrame->GetParent();
+  // anchorRect will be in the container's coordinate system (aLayer's parent layer).
+  // This is the same as the display items' reference frame.
+  nsRect anchorRect;
+  if (viewportFrame) {
+    // Fixed position frames are reflowed into the scroll-port size if one has
+    // been set.
+    if (presContext->PresShell()->IsScrollPositionClampingScrollPortSizeSet()) {
+      anchorRect.SizeTo(presContext->PresShell()->GetScrollPositionClampingScrollPortSize());
+    } else {
+      anchorRect.SizeTo(viewportFrame->GetSize());
+    }
+  } else {
+    // A display item directly attached to the viewport.
+    // For background-attachment:fixed items, the anchor point is always the
+    // top-left of the viewport currently.
+    viewportFrame = fixedFrame;
+  }
+  // The anchorRect top-left is always the viewport top-left.
+  anchorRect.MoveTo(viewportFrame->GetOffsetToCrossDoc(ReferenceFrame()));
+
+  nsLayoutUtils::SetFixedPositionLayerData(layer,
+      viewportFrame, anchorRect, fixedFrame, presContext, aContainerParameters, !mIsFixedBackground);
+
+  return layer.forget();
+}
+
+bool nsDisplayFixedPosition::TryMerge(nsDisplayItem* aItem) {
+  if (aItem->GetType() != TYPE_FIXED_POSITION)
+    return false;
+  // Items with the same fixed position frame can be merged.
+  nsDisplayFixedPosition* other = static_cast<nsDisplayFixedPosition*>(aItem);
+  if (other->mFrame != mFrame)
+    return false;
+  if (aItem->GetClip() != GetClip())
+    return false;
+  MergeFromTrackingMergedFrames(other);
+  return true;
+}
+
 nsDisplayStickyPosition::nsDisplayStickyPosition(nsDisplayListBuilder* aBuilder,
                                                  nsIFrame* aFrame,
                                                  nsDisplayList* aList)
   : nsDisplayOwnLayer(aBuilder, aFrame, aList)
 {
   MOZ_COUNT_CTOR(nsDisplayStickyPosition);
 }
 
--- a/layout/base/nsDisplayList.h
+++ b/layout/base/nsDisplayList.h
@@ -1149,16 +1149,17 @@ private:
   /**
    * Returns the nearest ancestor frame to aFrame that is considered to have
    * (or will have) animated geometry. This can return aFrame.
    */
   nsIFrame* FindAnimatedGeometryRootFrameFor(nsIFrame* aFrame);
 
   friend class nsDisplayCanvasBackgroundImage;
   friend class nsDisplayBackgroundImage;
+  friend class nsDisplayFixedPosition;
   AnimatedGeometryRoot* FindAnimatedGeometryRootFor(nsDisplayItem* aItem);
 
   AnimatedGeometryRoot* WrapAGRForFrame(nsIFrame* aAnimatedGeometryRoot,
                                         AnimatedGeometryRoot* aParent = nullptr);
 
   friend class nsDisplayItem;
   AnimatedGeometryRoot* FindAnimatedGeometryRootFor(nsIFrame* aFrame);
 
@@ -2742,19 +2743,17 @@ public:
   virtual void ConfigureLayer(ImageLayer* aLayer,
                               const ContainerLayerParameters& aParameters) override;
 
   static nsRegion GetInsideClipRegion(nsDisplayItem* aItem, uint8_t aClip,
                                       const nsRect& aRect);
 
   virtual bool ShouldFixToViewport(nsDisplayListBuilder* aBuilder) override;
 
-  AnimatedGeometryRoot* AnimatedGeometryRootForScrollMetadata() const override {
-    return mAnimatedGeometryRootForScrollMetadata;
-  }
+  void MarkBoundsAsVisible(nsDisplayListBuilder* aBuilder);
 
 protected:
   typedef class mozilla::layers::ImageContainer ImageContainer;
   typedef class mozilla::layers::ImageLayer ImageLayer;
 
   bool TryOptimizeToImageLayer(LayerManager* aManager, nsDisplayListBuilder* aBuilder);
   bool IsSingleFixedPositionImage(nsDisplayListBuilder* aBuilder,
                                   const nsRect& aClipRect,
@@ -2777,17 +2776,16 @@ protected:
                                          LayerManager* aManager);
 
   // Cache the result of nsCSSRendering::FindBackground. Always null if
   // mIsThemed is true or if FindBackground returned false.
   const nsStyleBackground* mBackgroundStyle;
   nsCOMPtr<imgIContainer> mImage;
   RefPtr<ImageContainer> mImageContainer;
   LayoutDeviceRect mImageLayerDestRect;
-  AnimatedGeometryRoot* mAnimatedGeometryRootForScrollMetadata;
   /* Bounds of this display item */
   nsRect mBounds;
   nsRect mDestArea;
   uint32_t mLayer;
 };
 
 
 /**
@@ -3614,16 +3612,62 @@ public:
                                    LayerManager* aManager,
                                    const ContainerLayerParameters& aParameters) override
   {
     return mozilla::LAYER_ACTIVE;
   }
   virtual bool TryMerge(nsDisplayItem* aItem) override;
 };
 
+class nsDisplayFixedPosition : public nsDisplayOwnLayer {
+public:
+  nsDisplayFixedPosition(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame,
+                          nsDisplayList* aList);
+
+  static nsDisplayFixedPosition* CreateForFixedBackground(nsDisplayListBuilder* aBuilder,
+                                                          nsIFrame* aFrame,
+                                                          nsDisplayBackgroundImage* aImage,
+                                                          uint32_t aIndex);
+
+
+#ifdef NS_BUILD_REFCNT_LOGGING
+  virtual ~nsDisplayFixedPosition();
+#endif
+
+  virtual already_AddRefed<Layer> BuildLayer(nsDisplayListBuilder* aBuilder,
+                                             LayerManager* aManager,
+                                             const ContainerLayerParameters& aContainerParameters) override;
+  NS_DISPLAY_DECL_NAME("FixedPosition", TYPE_FIXED_POSITION)
+  virtual LayerState GetLayerState(nsDisplayListBuilder* aBuilder,
+                                   LayerManager* aManager,
+                                   const ContainerLayerParameters& aParameters) override
+  {
+    return mozilla::LAYER_ACTIVE;
+  }
+  virtual bool TryMerge(nsDisplayItem* aItem) override;
+
+  virtual bool ShouldFixToViewport(nsDisplayListBuilder* aBuilder) override { return mIsFixedBackground; }
+
+  virtual uint32_t GetPerFrameKey() override { return (mIndex << nsDisplayItem::TYPE_BITS) | nsDisplayItem::GetPerFrameKey(); }
+
+  AnimatedGeometryRoot* AnimatedGeometryRootForScrollMetadata() const override {
+    return mAnimatedGeometryRootForScrollMetadata;
+  }
+
+private:
+  // For background-attachment:fixed
+  nsDisplayFixedPosition(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame,
+                         nsDisplayList* aList, uint32_t aIndex);
+  void Init(nsDisplayListBuilder* aBuilder);
+
+  AnimatedGeometryRoot* mAnimatedGeometryRootForScrollMetadata;
+  uint32_t mIndex;
+  bool mIsFixedBackground;
+};
+
 /**
  * This creates an empty scrollable layer. It has no child layers.
  * It is used to record the existence of a scrollable frame in the layer
  * tree.
  */
 class nsDisplayScrollInfoLayer : public nsDisplayWrapList
 {
 public:
--- a/layout/base/nsLayoutDebugger.cpp
+++ b/layout/base/nsLayoutDebugger.cpp
@@ -162,20 +162,16 @@ PrintDisplayItemTo(nsDisplayListBuilder*
           aItem->IsUniform(aBuilder, &color) ? " uniform" : "",
           aItem->ReferenceFrame(), aItem->GetAnimatedGeometryRoot()->mFrame);
 
   nsRegionRectIterator iter(opaque);
   for (const nsRect* r = iter.Next(); r; r = iter.Next()) {
     aStream << nsPrintfCString(" (opaque %d,%d,%d,%d)", r->x, r->y, r->width, r->height);
   }
 
-  if (aItem->ShouldFixToViewport(aBuilder)) {
-    aStream << " fixed";
-  }
-
   if (aItem->Frame()->StyleDisplay()->mWillChange.Length() > 0) {
     aStream << " (will-change=";
     for (size_t i = 0; i < aItem->Frame()->StyleDisplay()->mWillChange.Length(); i++) {
       if (i > 0) {
         aStream << ",";
       }
       aStream << NS_LossyConvertUTF16toASCII(aItem->Frame()->StyleDisplay()->mWillChange[i]).get();
     }
--- a/layout/generic/nsCanvasFrame.cpp
+++ b/layout/generic/nsCanvasFrame.cpp
@@ -412,18 +412,24 @@ nsCanvasFrame::BuildDisplayList(nsDispla
     // Create separate items for each background layer.
     NS_FOR_VISIBLE_BACKGROUND_LAYERS_BACK_TO_FRONT(i, bg) {
       if (bg->mLayers[i].mImage.IsEmpty()) {
         continue;
       }
       if (bg->mLayers[i].mBlendMode != NS_STYLE_BLEND_NORMAL) {
         needBlendContainer = true;
       }
-      aLists.BorderBackground()->AppendNewToTop(
-        new (aBuilder) nsDisplayCanvasBackgroundImage(aBuilder, this, i, bg));
+      nsDisplayCanvasBackgroundImage* bgItem =
+        new (aBuilder) nsDisplayCanvasBackgroundImage(aBuilder, this, i, bg);
+      if (bgItem->ShouldFixToViewport(aBuilder)) {
+        aLists.BorderBackground()->AppendNewToTop(
+          nsDisplayFixedPosition::CreateForFixedBackground(aBuilder, this, bgItem, i));
+      } else {
+        aLists.BorderBackground()->AppendNewToTop(bgItem);
+      }
     }
 
     if (needBlendContainer) {
       aLists.BorderBackground()->AppendNewToTop(
         new (aBuilder) nsDisplayBlendContainer(aBuilder, this, aLists.BorderBackground()));
     }
   }
 
--- a/layout/generic/nsFrame.cpp
+++ b/layout/generic/nsFrame.cpp
@@ -2038,30 +2038,31 @@ nsIFrame::BuildDisplayListForStackingCon
 
   bool useOpacity = HasVisualOpacity() && !nsSVGUtils::CanOptimizeOpacity(this);
   bool useBlendMode = disp->mMixBlendMode != NS_STYLE_BLEND_NORMAL;
   bool useStickyPosition = disp->mPosition == NS_STYLE_POSITION_STICKY &&
     IsScrollFrameActive(aBuilder,
                         nsLayoutUtils::GetNearestScrollableFrame(GetParent(),
                         nsLayoutUtils::SCROLLABLE_SAME_DOC |
                         nsLayoutUtils::SCROLLABLE_INCLUDE_HIDDEN));
+  bool useFixedPosition = nsLayoutUtils::IsFixedPosFrameInDisplayPort(this);
 
   nsDisplayListBuilder::AutoBuildingDisplayList
     buildingDisplayList(aBuilder, this, dirtyRect, true);
 
   mozilla::gfx::VRDeviceProxy* vrHMDInfo = nullptr;
   if ((GetStateBits() & NS_FRAME_HAS_VR_CONTENT)) {
     vrHMDInfo = static_cast<mozilla::gfx::VRDeviceProxy*>(mContent->GetProperty(nsGkAtoms::vr_state));
   }
 
   DisplayListClipState::AutoSaveRestore clipState(aBuilder);
 
   nsDisplayListBuilder::AutoSaveRestorePerspectiveIndex perspectiveIndex(aBuilder, this);
 
-  if (isTransformed || useBlendMode || usingSVGEffects || useStickyPosition) {
+  if (isTransformed || useBlendMode || usingSVGEffects || useFixedPosition || useStickyPosition) {
     // We don't need to pass ancestor clipping down to our children;
     // everything goes inside a display item's child list, and the display
     // item itself will be clipped.
     // For transforms we also need to clear ancestor clipping because it's
     // relative to the wrong display item reference frame anyway.
     // We clear both regular and scroll clips here. Our content needs to be
     // able to walk up the complete cross stacking context scroll clip chain,
     // so we call a special method on the clip state that keeps the ancestor
@@ -2268,17 +2269,20 @@ nsIFrame::BuildDisplayListForStackingCon
           aBuilder, this,
           GetContainingBlock()->GetContent()->GetPrimaryFrame(), &resultList));
     }
 
   }
 
   /* If we have sticky positioning, wrap it in a sticky position item.
    */
-  if (useStickyPosition) {
+  if (useFixedPosition) {
+    resultList.AppendNewToTop(
+        new (aBuilder) nsDisplayFixedPosition(aBuilder, this, &resultList));
+  } else if (useStickyPosition) {
     resultList.AppendNewToTop(
         new (aBuilder) nsDisplayStickyPosition(aBuilder, this, &resultList));
   }
 
   /* If we're doing VR rendering, then we need to wrap everything in a nsDisplayVR
    */
   if (vrHMDInfo && !resultList.IsEmpty()) {
     resultList.AppendNewToTop(
--- a/layout/mathml/moz.build
+++ b/layout/mathml/moz.build
@@ -52,12 +52,12 @@ LOCAL_INCLUDES += [
 JAR_MANIFESTS += ['jar.mn']
 
 RESOURCE_FILES.fonts += [
     'mathfont.properties',
     'mathfontSTIXGeneral.properties',
     'mathfontUnicode.properties',
 ]
 
-if CONFIG['TARGET_MD_ARCH'] == 'win32':
+if CONFIG['OS_TARGET'] == 'WINNT':
     RESOURCE_FILES.fonts += [
         'mathfontSymbol.properties',
     ]
--- a/layout/reftests/forms/input/number/number-disabled-ref.html
+++ b/layout/reftests/forms/input/number/number-disabled-ref.html
@@ -1,8 +1,9 @@
 <!DOCTYPE html>
 <html>
   <body>
-    <input type="text" disabled>
+    <input type="text" disabled
+           style="-moz-appearance: none"><!-- Workaround for bug 1223198 -->
     <!-- div to cover spin box area -->
     <div style="display:block; position:absolute; background-color:black; width:200px; height:100px; top:0px; left:100px;">
   </body>
 </html>
--- a/layout/reftests/forms/input/number/number-disabled.html
+++ b/layout/reftests/forms/input/number/number-disabled.html
@@ -1,8 +1,9 @@
 <!DOCTYPE html>
 <html>
   <body>
-    <input type="number" disabled>
+    <input type="number" disabled
+           style="-moz-appearance: none"><!-- Workaround for bug 1223198 -->
     <!-- div to cover spin box area -->
     <div style="display:block; position:absolute; background-color:black; width:200px; height:100px; top:0px; left:100px;">
   </body>
 </html>
--- a/media/libstagefright/binding/MP4Metadata.cpp
+++ b/media/libstagefright/binding/MP4Metadata.cpp
@@ -107,17 +107,17 @@ MP4Metadata::MP4Metadata(Stream* aSource
 }
 
 MP4Metadata::~MP4Metadata()
 {
 }
 
 #ifdef MOZ_RUST_MP4PARSE
 // Helper to test the rust parser on a data source.
-static bool try_rust(const UniquePtr<mp4parse_state, FreeMP4ParseState>& aRustState, RefPtr<Stream> aSource)
+static int32_t try_rust(const UniquePtr<mp4parse_state, FreeMP4ParseState>& aRustState, RefPtr<Stream> aSource)
 {
   static LazyLogModule sLog("MP4Metadata");
   int64_t length;
   if (!aSource->Length(&length) || length <= 0) {
     MOZ_LOG(sLog, LogLevel::Warning, ("Couldn't get source length"));
     return false;
   }
   MOZ_LOG(sLog, LogLevel::Debug,
--- a/media/libstagefright/binding/capi.rs
+++ b/media/libstagefright/binding/capi.rs
@@ -119,17 +119,17 @@ pub unsafe extern "C" fn mp4parse_read(c
 
     // Parse in a subthread to catch any panics.
     let task = std::thread::spawn(move || read_mp4(&mut c, &mut context));
     // The task's JoinHandle will return an error result if the
     // thread panicked, and will wrap the closure's return'd
     // result in an Ok(..) otherwise, meaning we could see
     // Ok(Err(Error::..)) here. So map thread failures back
     // to an mp4parse::Error before converting to a C return value.
-    match task.join().or(Err(Error::AssertCaught)) {
+    match task.join().unwrap_or(Err(Error::AssertCaught)) {
         Ok(_) => MP4PARSE_OK,
         Err(Error::InvalidData) => MP4PARSE_ERROR_INVALID,
         Err(Error::Unsupported) => MP4PARSE_ERROR_UNSUPPORTED,
         Err(Error::UnexpectedEOF) => MP4PARSE_ERROR_EOF,
         Err(Error::AssertCaught) => MP4PARSE_ASSERT,
         Err(Error::Io(_)) => MP4PARSE_ERROR_IO,
     }
 }
--- a/modules/libmar/tool/moz.build
+++ b/modules/libmar/tool/moz.build
@@ -54,11 +54,8 @@ elif CONFIG['OS_ARCH'] == 'Darwin':
     ]
 
 if CONFIG['HOST_OS_ARCH'] == 'WINNT':
     HOST_OS_LIBS += [
         'ws2_32',
     ]
 
 HOST_DEFINES['NO_SIGN_VERIFY'] = True
-
-if CONFIG['CROSS_COMPILE'] and CONFIG['HOST_NSPR_MDCPUCFG']:
-    HOST_DEFINES['MDCPUCFG'] = CONFIG['HOST_NSPR_MDCPUCFG']
--- a/netwerk/base/nsSocketTransport2.cpp
+++ b/netwerk/base/nsSocketTransport2.cpp
@@ -468,17 +468,21 @@ nsSocketInputStream::AsyncWait(nsIInputS
                                uint32_t amount,
                                nsIEventTarget *target)
 {
     SOCKET_LOG(("nsSocketInputStream::AsyncWait [this=%p]\n", this));
 
     bool hasError = false;
     {
         MutexAutoLock lock(mTransport->mLock);
-
+        if (mTransport->mState != nsSocketTransport::STATE_TRANSFERRING && NS_FAILED(mCondition)) {
+            SOCKET_LOG(("nsSocketInputStream::AsyncWait [this=%p] "
+                        "Not Transferring %X.\n", mTransport, mCondition));
+            return NS_OK;
+        }
         if (callback && target) {
             //
             // build event proxy
             //
             mCallback = NS_NewInputStreamReadyEvent(callback, target);
         }
         else
             mCallback = callback;
@@ -702,17 +706,22 @@ nsSocketOutputStream::AsyncWait(nsIOutpu
                                 uint32_t flags,
                                 uint32_t amount,
                                 nsIEventTarget *target)
 {
     SOCKET_LOG(("nsSocketOutputStream::AsyncWait [this=%p]\n", this));
 
     {
         MutexAutoLock lock(mTransport->mLock);
-
+        if (mTransport->mState != nsSocketTransport::STATE_TRANSFERRING && NS_FAILED(mCondition)) {
+            // do not take the callback reference if we will not call onOutputReady
+            SOCKET_LOG(("nsSocketOutputStream::AsyncWait [this=%p] mTransport=%p "
+                        "Not Transferring %X.\n",this, mTransport, mCondition));
+            return NS_OK;
+        }
         if (callback && target) {
             //
             // build event proxy
             //
             mCallback = NS_NewOutputStreamReadyEvent(callback, target);
         }
         else
             mCallback = callback;
--- a/netwerk/base/nsSocketTransport2.h
+++ b/netwerk/base/nsSocketTransport2.h
@@ -182,17 +182,16 @@ private:
         MSG_INPUT_PENDING,
         MSG_OUTPUT_CLOSED,
         MSG_OUTPUT_PENDING
     };
     nsresult PostEvent(uint32_t type, nsresult status = NS_OK, nsISupports *param = nullptr);
 
     enum {
         STATE_CLOSED,
-        STATE_IDLE,
         STATE_RESOLVING,
         STATE_CONNECTING,
         STATE_TRANSFERRING
     };
 
     // Safer way to get and automatically release PRFileDesc objects.
     class MOZ_STACK_CLASS PRFileDescAutoLock
     {
--- a/nsprpub/lib/ds/plarena.h
+++ b/nsprpub/lib/ds/plarena.h
@@ -91,21 +91,21 @@ struct PLArenaPool {
 #elif defined(__SANITIZE_ADDRESS__)
 #define PL_SANITIZE_ADDRESS 1
 #endif
 
 #if defined(PL_SANITIZE_ADDRESS)
 
 /* These definitions are usually provided through the
  * sanitizer/asan_interface.h header installed by ASan.
- * See https://code.google.com/p/address-sanitizer/wiki/ManualPoisoning
+ * See https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning
  */
 
-void __asan_poison_memory_region(void const volatile *addr, size_t size);
-void __asan_unpoison_memory_region(void const volatile *addr, size_t size);
+PR_IMPORT(void) __asan_poison_memory_region(void const volatile *addr, size_t size);
+PR_IMPORT(void) __asan_unpoison_memory_region(void const volatile *addr, size_t size);
 
 #define PL_MAKE_MEM_NOACCESS(addr, size) \
     __asan_poison_memory_region((addr), (size))
 
 #define PL_MAKE_MEM_UNDEFINED(addr, size) \
     __asan_unpoison_memory_region((addr), (size))
 
 #define PL_MAKE_MEM_DEFINED(addr, size) \
--- a/nsprpub/pr/src/md/unix/unix.c
+++ b/nsprpub/pr/src/md/unix/unix.c
@@ -2710,17 +2710,17 @@ static void* _MD_Unix_mmap64(
 {
     PR_SetError(PR_FILE_TOO_BIG_ERROR, 0);
     return NULL;
 }  /* _MD_Unix_mmap64 */
 #endif /* defined(_PR_NO_LARGE_FILES) || defined(SOLARIS2_5) */
 
 /* Android <= 19 doesn't have mmap64. */
 #if defined(ANDROID) && __ANDROID_API__ <= 19
-extern void *__mmap2(void *, size_t, int, int, int, size_t);
+PR_IMPORT(void) *__mmap2(void *, size_t, int, int, int, size_t);
 
 #define ANDROID_PAGE_SIZE 4096
 
 static void *
 mmap64(void *addr, size_t len, int prot, int flags, int fd, loff_t offset)
 {
     if (offset & (ANDROID_PAGE_SIZE - 1)) {
         errno = EINVAL;
--- a/nsprpub/pr/src/md/windows/ntinrval.c
+++ b/nsprpub/pr/src/md/windows/ntinrval.c
@@ -3,16 +3,20 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 /*
  * NT interval timers
  *
  */
 
+/* Mozilla's build system defines this globally. */
+#ifdef WIN32_LEAN_AND_MEAN
+#undef WIN32_LEAN_AND_MEAN
+#endif
 #include "primpl.h"
 
 #ifdef WINCE
 typedef DWORD (*IntervalFuncType)(void);
 static IntervalFuncType intervalFunc;
 #endif
 
 void
--- a/python/mozbuild/mozbuild/backend/cpp_eclipse.py
+++ b/python/mozbuild/mozbuild/backend/cpp_eclipse.py
@@ -163,17 +163,16 @@ class CppEclipseBackend(CommonBackend):
     def _write_language_settings(self, fh):
         settings = LANGUAGE_SETTINGS_TEMPLATE
 
         settings = settings.replace('@GLOBAL_INCLUDE_PATH@', os.path.join(self.environment.topobjdir, 'dist/include'))
         settings = settings.replace('@NSPR_INCLUDE_PATH@', os.path.join(self.environment.topobjdir, 'dist/include/nspr'))
         settings = settings.replace('@IPDL_INCLUDE_PATH@', os.path.join(self.environment.topobjdir, 'ipc/ipdl/_ipdlheaders'))
         settings = settings.replace('@PREINCLUDE_FILE_PATH@', os.path.join(self.environment.topobjdir, 'dist/include/mozilla-config.h'))
         settings = settings.replace('@DEFINE_MOZILLA_INTERNAL_API@', self._define_entry('MOZILLA_INTERNAL_API', '1'))
-        settings = settings.replace('@DEFINE_MDCPUCFG@', self._define_entry('MDCPUCFG', self.environment.substs['TARGET_NSPR_MDCPUCFG']))
         settings = settings.replace("@COMPILER_FLAGS@", self._cxx + " " + self._cppflags);
 
         fh.write(settings)
 
     def _write_launch_files(self, launch_dir):
         bin_dir = os.path.join(self.environment.topobjdir, 'dist')
 
         # TODO Improve binary detection
@@ -423,17 +422,16 @@ LANGUAGE_SETTINGS_TEMPLATE = """<?xml ve
                                                 </entry>
                                                 <!--
                                                   Because of https://developer.mozilla.org/en-US/docs/Eclipse_CDT#Headers_are_only_parsed_once
                                                   we need to make sure headers are parsed with MOZILLA_INTERNAL_API to make sure
                                                   the indexer gets the version that is used in most of the true. This means that
                                                   MOZILLA_EXTERNAL_API code will suffer.
                                                 -->
                                                 @DEFINE_MOZILLA_INTERNAL_API@
-                                                @DEFINE_MDCPUCFG@
                                         </resource>
                                 </language>
                         </provider>
                         <provider class="org.eclipse.cdt.internal.build.crossgcc.CrossGCCBuiltinSpecsDetector" console="false" env-hash="-859273372804152468" id="org.eclipse.cdt.build.crossgcc.CrossGCCBuiltinSpecsDetector" keep-relative-paths="false" name="CDT Cross GCC Built-in Compiler Settings" parameter="@COMPILER_FLAGS@ -E -P -v -dD &quot;${INPUTS}&quot; -std=c++11" prefer-non-shared="true" store-entries-with-project="true">
                              <language-scope id="org.eclipse.cdt.core.gcc"/>
                              <language-scope id="org.eclipse.cdt.core.g++"/>
                         </provider>
                         <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
--- a/python/mozbuild/mozbuild/compilation/codecomplete.py
+++ b/python/mozbuild/mozbuild/compilation/codecomplete.py
@@ -50,9 +50,9 @@ class Introspection(MachCommandBase):
             name = 'COMPILE_CFLAGS'
         else:
             name = 'COMPILE_CXXFLAGS'
 
         if name not in build_vars:
             return
 
         print(' '.join(shell_quote(arg)
-                       for arg in shell_split(build_vars[name])))
+                       for arg in util.sanitize_cflags(shell_split(build_vars[name]))))
--- a/python/mozbuild/mozbuild/compilation/database.py
+++ b/python/mozbuild/mozbuild/compilation/database.py
@@ -105,17 +105,17 @@ class CompileDBBackend(CommonBackend):
         build_vars = util.get_build_vars(directory, self._cmd)
 
         # We only care about the following build variables.
         for name in ('COMPILE_CFLAGS', 'COMPILE_CXXFLAGS',
                      'COMPILE_CMFLAGS', 'COMPILE_CMMFLAGS'):
             if name not in build_vars:
                 continue
 
-            build_vars[name] = shell_split(build_vars[name])
+            build_vars[name] = util.sanitize_cflags(shell_split(build_vars[name]))
 
         self._flags[directory] = build_vars
         return self._flags[directory]
 
     def _build_db_line(self, objdir, cenv, filename, canonical_suffix, flags, ishost):
         # Distinguish between host and target files.
         prefix = 'HOST_' if ishost else ''
         if canonical_suffix == '.c':
--- a/python/mozbuild/mozbuild/compilation/util.py
+++ b/python/mozbuild/mozbuild/compilation/util.py
@@ -28,8 +28,27 @@ def get_build_vars(directory, cmd):
         old_logger = cmd.log_manager.replace_terminal_handler(None)
         cmd._run_make(directory=directory, target='showbuild', log=False,
                 print_directory=False, allow_parallel=False, silent=True,
                 line_handler=on_line)
     finally:
         cmd.log_manager.replace_terminal_handler(old_logger)
 
     return build_vars
+
+def sanitize_cflags(flags):
+    # We filter out -Xclang arguments as clang based tools typically choke on
+    # passing these flags down to the clang driver.  -Xclang tells the clang
+    # driver driver to pass whatever comes after it down to clang cc1, which is
+    # why we skip -Xclang and the argument immediately after it.  Here is an
+    # example: the following two invocations pass |-foo -bar -baz| to cc1:
+    # clang -cc1 -foo -bar -baz
+    # clang -Xclang -foo -Xclang -bar -Xclang -baz
+    sanitized = []
+    saw_xclang = False
+    for flag in flags:
+        if flag == '-Xclang':
+            saw_xclang = True
+        elif saw_xclang:
+            saw_xclang = False
+        else:
+            sanitized.append(flag)
+    return sanitized
--- a/python/mozbuild/mozbuild/frontend/context.py
+++ b/python/mozbuild/mozbuild/frontend/context.py
@@ -124,16 +124,21 @@ class Context(KeyedDefaultDict):
         if not self.main_path:
             self.main_path = self.current_path = path
         # Insert at the beginning of the list so that it's always before the
         # main path.
         if path not in self._all_paths:
             self._all_paths.insert(0, path)
 
     @property
+    def error_is_fatal(self):
+        """Returns True if the error function should be fatal."""
+        return self.config and getattr(self.config, 'error_is_fatal', True)
+
+    @property
     def all_paths(self):
         """Returns all paths ever added to the context."""
         return set(self._all_paths)
 
     @property
     def source_stack(self):
         """Returns the current stack of pushed sources."""
         if not self.current_path:
--- a/python/mozbuild/mozbuild/frontend/reader.py
+++ b/python/mozbuild/mozbuild/frontend/reader.py
@@ -129,16 +129,17 @@ class EmptyConfig(object):
         for k, v in self.substs.items():
             if isinstance(v, str):
                 udict[k.decode('utf-8')] = v.decode('utf-8')
             else:
                 udict[k] = v
         self.substs_unicode = self.PopulateOnGetDict(EmptyValue, udict)
         self.defines = self.substs
         self.external_source_dir = None
+        self.error_is_fatal = False
 
 
 def is_read_allowed(path, config):
     """Whether we are allowed to load a mozbuild file at the specified path.
 
     This is used as cheap security to ensure the build is isolated to known
     source directories.
 
@@ -320,17 +321,20 @@ class MozbuildSandbox(Sandbox):
         # path is a SourcePath
         self.exec_file(path.full_path)
 
     def _warning(self, message):
         # FUTURE consider capturing warnings in a variable instead of printing.
         print('WARNING: %s' % message, file=sys.stderr)
 
     def _error(self, message):
-        raise SandboxCalledError(self._context.source_stack, message)
+        if self._context.error_is_fatal:
+            raise SandboxCalledError(self._context.source_stack, message)
+        else:
+            self._warning(message)
 
     def _template_decorator(self, func):
         """Registers a template function."""
 
         if not inspect.isfunction(func):
             raise Exception('`template` is a function decorator. You must '
                 'use it as `@template` preceding a function declaration.')
 
--- a/python/mozbuild/mozbuild/test/common.py
+++ b/python/mozbuild/mozbuild/test/common.py
@@ -13,17 +13,21 @@ import mozpack.path as mozpath
 
 # By including this module, tests get structured logging.
 log_manager = LoggingManager()
 log_manager.add_terminal_logging()
 
 # mozconfig is not a reusable type (it's actually a module) so, we
 # have to mock it.
 class MockConfig(object):
-    def __init__(self, topsrcdir='/path/to/topsrcdir', extra_substs={}):
+    def __init__(self,
+                 topsrcdir='/path/to/topsrcdir',
+                 extra_substs={},
+                 error_is_fatal=True,
+             ):
         self.topsrcdir = mozpath.abspath(topsrcdir)
         self.topobjdir = mozpath.abspath('/path/to/topobjdir')
 
         self.substs = ReadOnlyDict({
             'MOZ_FOO': 'foo',
             'MOZ_BAR': 'bar',
             'MOZ_TRUE': '1',
             'MOZ_FALSE': '',
@@ -36,8 +40,9 @@ class MockConfig(object):
 
         self.external_source_dir = None
         self.lib_prefix = 'lib'
         self.lib_suffix = '.a'
         self.import_prefix = 'lib'
         self.import_suffix = '.so'
         self.dll_prefix = 'lib'
         self.dll_suffix = '.so'
+        self.error_is_fatal = error_is_fatal
--- a/python/mozbuild/mozbuild/test/frontend/test_reader.py
+++ b/python/mozbuild/mozbuild/test/frontend/test_reader.py
@@ -37,21 +37,23 @@ class TestBuildReader(unittest.TestCase)
         os.environ.clear()
         os.environ.update(self._old_env)
 
     def config(self, name, **kwargs):
         path = mozpath.join(data_path, name)
 
         return MockConfig(path, **kwargs)
 
-    def reader(self, name, enable_tests=False, **kwargs):
+    def reader(self, name, enable_tests=False, error_is_fatal=True, **kwargs):
         extra = {}
         if enable_tests:
             extra['ENABLE_TESTS'] = '1'
-        config = self.config(name, extra_substs=extra)
+        config = self.config(name,
+                             extra_substs=extra,
+                             error_is_fatal=error_is_fatal)
 
         return BuildReader(config, **kwargs)
 
     def file_path(self, name, *args):
         return mozpath.join(data_path, name, *args)
 
     def test_dirs_traversal_simple(self):
         reader = self.reader('traversal-simple')
@@ -234,16 +236,21 @@ class TestBuildReader(unittest.TestCase)
 
         with self.assertRaises(BuildReaderError) as bre:
             list(reader.read_topsrcdir())
 
         e = bre.exception
         self.assertIn('A moz.build file called the error() function.', str(e))
         self.assertIn('    Some error.', str(e))
 
+    def test_error_error_func_ok(self):
+        reader = self.reader('reader-error-error-func', error_is_fatal=False)
+
+        contexts = list(reader.read_topsrcdir())
+
     def test_inheriting_variables(self):
         reader = self.reader('inheriting-variables')
 
         contexts = list(reader.read_topsrcdir())
 
         self.assertEqual(len(contexts), 4)
         self.assertEqual([context.relsrcdir for context in contexts],
             ['', 'foo', 'foo/baz', 'bar'])
--- a/python/virtualenv/LICENSE.txt
+++ b/python/virtualenv/LICENSE.txt
@@ -1,11 +1,11 @@
 Copyright (c) 2007 Ian Bicking and Contributors
 Copyright (c) 2009 Ian Bicking, The Open Planning Project
-Copyright (c) 2011-2014 The virtualenv developers
+Copyright (c) 2011-2015 The virtualenv developers
 
 Permission is hereby granted, free of charge, to any person obtaining
 a copy of this software and associated documentation files (the
 "Software"), to deal in the Software without restriction, including
 without limitation the rights to use, copy, modify, merge, publish,
 distribute, sublicense, and/or sell copies of the Software, and to
 permit persons to whom the Software is furnished to do so, subject to
 the following conditions:
--- a/python/virtualenv/MANIFEST.in
+++ b/python/virtualenv/MANIFEST.in
@@ -1,11 +1,12 @@
-recursive-include bin *
 recursive-include docs *
-recursive-include scripts *
+recursive-include tests *.py *.sh *.expected
 recursive-include virtualenv_support *.whl
 recursive-include virtualenv_embedded *
 recursive-exclude docs/_templates *
 recursive-exclude docs/_build *
 include virtualenv_support/__init__.py
+include bin/*
+include scripts/*
 include *.py
 include AUTHORS.txt
 include LICENSE.txt
--- a/python/virtualenv/PKG-INFO
+++ b/python/virtualenv/PKG-INFO
@@ -1,11 +1,11 @@
 Metadata-Version: 1.1
 Name: virtualenv
-Version: 12.0.5
+Version: 14.0.1
 Summary: Virtual Python Environment builder
 Home-page: https://virtualenv.pypa.io/
 Author: Jannis Leidel, Carl Meyer and Brian Rosner
 Author-email: python-virtualenv@groups.google.com
 License: MIT
 Description: Virtualenv
         ==========
         
@@ -42,798 +42,72 @@ Description: Virtualenv
         share libraries with other virtualenv environments (and optionally
         doesn't access the globally installed libraries either).
         
         .. comment: 
         
         Release History
         ===============
         
-        12.0.5 (2015-01-03)
-        ~~~~~~~~~~~~~~~~~~~
-        
-        * Upgrade pip to 6.0.6
-        
-        * Upgrade setuptools to 11.0
-        
-        
-        12.0.4 (2014-22-23)
-        ~~~~~~~~~~~~~~~~~~~
-        
-        * Revert the fix to ``-p`` on Debian based pythons as it was broken in other
-          situations.
-        
-        * Revert several sys.path changes new in 12.0 which were breaking virtualenv.
-        
-        12.0.3 (2014-22-23)
-        ~~~~~~~~~~~~~~~~~~~
-        
-        * Fix an issue where Debian based Pythons would fail when using -p with the
-          host Python.
-        
-        * Upgrade pip to 6.0.3
-        
-        12.0.2 (2014-12-23)
-        ~~~~~~~~~~~~~~~~~~~
-        
-        * Upgraded pip to 6.0.2
-        
-        12.0.1 (2014-12-22)
-        ~~~~~~~~~~~~~~~~~~~
-        
-        * Upgraded pip to 6.0.1
-        
-        12.0 (2014-12-22)
-        ~~~~~~~~~~~~~~~~~
-        
-        * **PROCESS** Version numbers are now simply ``X.Y`` where the leading ``1``
-          has been dropped.
-        * Split up documentation into structured pages
-        * Now using pytest framework
-        * Correct sys.path ordering for debian, issue #461
-        * Correctly throws error on older Pythons, issue #619
-        * Allow for empty $PATH, pull #601
-        * Don't set prompt if $env:VIRTUAL_ENV_DISABLE_PROMPT is set for Powershell
-        * Updated setuptools to 7.0
-        
-        1.11.6 (2014-05-16)
-        ~~~~~~~~~~~~~~~~~~~
-        
-        * Updated setuptools to 3.6
-        * Updated pip to 1.5.6
-        
-        1.11.5 (2014-05-03)
-        ~~~~~~~~~~~~~~~~~~~
-        
-        * Updated setuptools to 3.4.4
-        * Updated documentation to use https://virtualenv.pypa.io/
-        * Updated pip to 1.5.5
-        
-        1.11.4 (2014-02-21)
-        ~~~~~~~~~~~~~~~~~~~
-        
-        * Updated pip to 1.5.4
-        
-        
-        1.11.3 (2014-02-20)
-        ~~~~~~~~~~~~~~~~~~~
-        
-        * Updated setuptools to 2.2
-        * Updated pip to 1.5.3
-        
-        
-        1.11.2 (2014-01-26)
-        ~~~~~~~~~~~~~~~~~~~
-        
-        * Fixed easy_install installed virtualenvs by updated pip to 1.5.2
-        
-        1.11.1 (2014-01-20)
-        ~~~~~~~~~~~~~~~~~~~
-        
-        * Fixed an issue where pip and setuptools were not getting installed when using
-          the ``--system-site-packages`` flag.
-        * Updated setuptools to fix an issue when installed with easy_install
-        * Fixed an issue with Python 3.4 and sys.stdout encoding being set to ascii
-        * Upgraded pip to v1.5.1
-        * Upgraded setuptools to v2.1
-        
-        1.11 (2014-01-02)
-        ~~~~~~~~~~~~~~~~~
-        
-        * **BACKWARDS INCOMPATIBLE** Switched to using wheels for the bundled copies of
-          setuptools and pip. Using sdists is no longer supported - users supplying
-          their own versions of pip/setuptools will need to provide wheels.
-        * **BACKWARDS INCOMPATIBLE** Modified the handling of ``--extra-search-dirs``.
-          This option now works like pip's ``--find-links`` option, in that it adds
-          extra directories to search for compatible wheels for pip and setuptools.
-          The actual wheel selected is chosen based on version and compatibility, using
-          the same algorithm as ``pip install setuptools``.
-        * Fixed #495, --always-copy was failing (#PR 511)
-        * Upgraded pip to v1.5
-        * Upgraded setuptools to v1.4
-        
-        1.10.1 (2013-08-07)
-        ~~~~~~~~~~~~~~~~~~~
-        
-        * **New Signing Key** Release 1.10.1 is using a different key than normal with
-          fingerprint: 7C6B 7C5D 5E2B 6356 A926 F04F 6E3C BCE9 3372 DCFA
-        * Upgraded pip to v1.4.1
-        * Upgraded setuptools to v0.9.8
-        
-        
-        1.10 (2013-07-23)
-        ~~~~~~~~~~~~~~~~~
-        
-        * **BACKWARDS INCOMPATIBLE** Dropped support for Python 2.5. The minimum
-          supported Python version is now Python 2.6.
-        
-        * **BACKWARDS INCOMPATIBLE** Using ``virtualenv.py`` as an isolated script
-          (i.e. without an associated ``virtualenv_support`` directory) is no longer
-          supported for security reasons and will fail with an error.
-        
-          Along with this, ``--never-download`` is now always pinned to ``True``, and
-          is only being maintained in the short term for backward compatibility
-          (Pull #412).
-        
-        * **IMPORTANT** Switched to the new setuptools (v0.9.7) which has been merged
-          with Distribute_ again and works for Python 2 and 3 with one codebase.
-          The ``--distribute`` and ``--setuptools`` options are now no-op.
-        
-        * Updated to pip 1.4.
-        
-        * Added support for PyPy3k
-        
-        * Added the option to use a version number with the ``-p`` option to get the
-          system copy of that Python version (Windows only)
-        
-        * Removed embedded ``ez_setup.py``, ``distribute_setup.py`` and
-          ``distribute_from_egg.py`` files as part of switching to merged setuptools.
-        
-        * Fixed ``--relocatable`` to work better on Windows.
-        
-        * Fixed issue with readline on Windows.
-        
-        .. _Distribute: https://pypi.python.org/pypi/distribute
-        
-        1.9.1 (2013-03-08)
-        ~~~~~~~~~~~~~~~~~~
-        
-        * Updated to pip 1.3.1 that fixed a major backward incompatible change of
-          parsing URLs to externally hosted packages that got accidentily included
-          in pip 1.3.
-        
-        1.9 (2013-03-07)
-        ~~~~~~~~~~~~~~~~
-        
-        * Unset VIRTUAL_ENV environment variable in deactivate.bat (Pull #364)
-        * Upgraded distribute to 0.6.34.
-        * Added ``--no-setuptools`` and ``--no-pip`` options (Pull #336).
-        * Fixed Issue #373. virtualenv-1.8.4 was failing in cygwin (Pull #382).
-        * Fixed Issue #378. virtualenv is now "multiarch" aware on debian/ubuntu (Pull #379).
-        * Fixed issue with readline module path on pypy and OSX (Pull #374).
-        * Made 64bit detection compatible with Python 2.5 (Pull #393).
-        
-        
-        1.8.4 (2012-11-25)
-        ~~~~~~~~~~~~~~~~~~
-        
-        * Updated distribute to 0.6.31. This fixes #359 (numpy install regression) on
-          UTF-8 platforms, and provides a workaround on other platforms:
-          ``PYTHONIOENCODING=utf8 pip install numpy``.
-        
-        * When installing virtualenv via curl, don't forget to filter out arguments
-          the distribute setup script won't understand. Fixes #358.
-        
-        * Added some more integration tests.
-        
-        * Removed the unsupported embedded setuptools egg for Python 2.4 to reduce
-          file size.
-        
-        1.8.3 (2012-11-21)
-        ~~~~~~~~~~~~~~~~~~
-        
-        * Fixed readline on OS X. Thanks minrk
-        
-        * Updated distribute to 0.6.30 (improves our error reporting, plus new
-          distribute features and fixes). Thanks Gabriel (g2p)
-        
-        * Added compatibility with multiarch Python (Python 3.3 for example). Added an
-          integration test. Thanks Gabriel (g2p)
-        
-        * Added ability to install distribute from a user-provided egg, rather than the
-          bundled sdist, for better speed. Thanks Paul Moore.
+        14.0.1 (2016-01-21)
+        -------------------
         
-        * Make the creation of lib64 symlink smarter about already-existing symlink,
-          and more explicit about full paths. Fixes #334 and #330. Thanks Jeremy Orem.
-        
-        * Give lib64 site-dir preference over lib on 64-bit systems, to avoid wrong
-          32-bit compiles in the venv. Fixes #328. Thanks Damien Nozay.
-        
-        * Fix a bug with prompt-handling in ``activate.csh`` in non-interactive csh
-          shells. Fixes #332. Thanks Benjamin Root for report and patch.
-        
-        * Make it possible to create a virtualenv from within a Python
-          3.3. pyvenv. Thanks Chris McDonough for the report.
-        
-        * Add optional --setuptools option to be able to switch to it in case
-          distribute is the default (like in Debian).
-        
-        1.8.2 (2012-09-06)
-        ~~~~~~~~~~~~~~~~~~
-        
-        * Updated the included pip version to 1.2.1 to fix regressions introduced
-          there in 1.2.
-        
-        
-        1.8.1 (2012-09-03)
-        ~~~~~~~~~~~~~~~~~~
-        
-        * Fixed distribute version used with `--never-download`. Thanks michr for
-          report and patch.
-        
-        * Fix creating Python 3.3 based virtualenvs by unsetting the
-          ``__PYVENV_LAUNCHER__`` environment variable in subprocesses.
-        
-        
-        1.8 (2012-09-01)
-        ~~~~~~~~~~~~~~~~
-        
-        * **Dropped support for Python 2.4** The minimum supported Python version is
-          now Python 2.5.
-        
-        * Fix `--relocatable` on systems that use lib64. Fixes #78. Thanks Branden
-          Rolston.
-        
-        * Symlink some additional modules under Python 3. Fixes #194. Thanks Vinay
-          Sajip, Ian Clelland, and Stefan Holek for the report.
-        
-        * Fix ``--relocatable`` when a script uses ``__future__`` imports. Thanks
-          Branden Rolston.
-        
-        * Fix a bug in the config option parser that prevented setting negative
-          options with environment variables. Thanks Ralf Schmitt.
-        
-        * Allow setting ``--no-site-packages`` from the config file.
-        
-        * Use ``/usr/bin/multiarch-platform`` if available to figure out the include
-          directory. Thanks for the patch, Mika Laitio.
-        
-        * Fix ``install_name_tool`` replacement to work on Python 3.X.
-        
-        * Handle paths of users' site-packages on Mac OS X correctly when changing
-          the prefix.
-        
-        * Updated the embedded version of distribute to 0.6.28 and pip to 1.2.
-        
-        
-        1.7.2 (2012-06-22)
-        ~~~~~~~~~~~~~~~~~~
-        
-        * Updated to distribute 0.6.27.
-        
-        * Fix activate.fish on OS X. Fixes #8. Thanks David Schoonover.
-        
-        * Create a virtualenv-x.x script with the Python version when installing, so
-          virtualenv for multiple Python versions can be installed to the same
-          script location. Thanks Miki Tebeka.
-        
-        * Restored ability to create a virtualenv with a path longer than 78
-          characters, without breaking creation of virtualenvs with non-ASCII paths.
-          Thanks, Bradley Ayers.
-        
-        * Added ability to create virtualenvs without having installed Apple's
-          developers tools (using an own implementation of ``install_name_tool``).
-          Thanks Mike Hommey.
-        
-        * Fixed PyPy and Jython support on Windows. Thanks Konstantin Zemlyak.
-        
-        * Added pydoc script to ease use. Thanks Marc Abramowitz. Fixes #149.
-        
-        * Fixed creating a bootstrap script on Python 3. Thanks Raul Leal. Fixes #280.
-        
-        * Fixed inconsistency when having set the ``PYTHONDONTWRITEBYTECODE`` env var
-          with the --distribute option or the ``VIRTUALENV_USE_DISTRIBUTE`` env var.
-          ``VIRTUALENV_USE_DISTRIBUTE`` is now considered again as a legacy alias.
-        
-        
-        1.7.1.2 (2012-02-17)
-        ~~~~~~~~~~~~~~~~~~~~
+        * Upgrade from pip 8.0.0 to 8.0.2.
         
-        * Fixed minor issue in `--relocatable`. Thanks, Cap Petschulat.
-        
-        
-        1.7.1.1 (2012-02-16)
-        ~~~~~~~~~~~~~~~~~~~~
-        
-        * Bumped the version string in ``virtualenv.py`` up, too.
-        
-        * Fixed rST rendering bug of long description.
-        
-        
-        1.7.1 (2012-02-16)
-        ~~~~~~~~~~~~~~~~~~
-        
-        * Update embedded pip to version 1.1.
-        
-        * Fix `--relocatable` under Python 3. Thanks Doug Hellmann.
-        
-        * Added environ PATH modification to activate_this.py. Thanks Doug
-          Napoleone. Fixes #14.
-        
-        * Support creating virtualenvs directly from a Python build directory on
-          Windows. Thanks CBWhiz. Fixes #139.
-        
-        * Use non-recursive symlinks to fix things up for posix_local install
-          scheme. Thanks michr.
-        
-        * Made activate script available for use with msys and cygwin on Windows.
-          Thanks Greg Haskins, Cliff Xuan, Jonathan Griffin and Doug Napoleone.
-          Fixes #176.
-        
-        * Fixed creation of virtualenvs on Windows when Python is not installed for
-          all users. Thanks Anatoly Techtonik for report and patch and Doug
-          Napoleone for testing and confirmation. Fixes #87.
-        
-        * Fixed creation of virtualenvs using -p in installs where some modules
-          that ought to be in the standard library (e.g. `readline`) are actually
-          installed in `site-packages` next to `virtualenv.py`. Thanks Greg Haskins
-          for report and fix. Fixes #167.
-        
-        * Added activation script for Powershell (signed by Jannis Leidel). Many
-          thanks to Jason R. Coombs.
-        
-        
-        1.7 (2011-11-30)
-        ~~~~~~~~~~~~~~~~
-        
-        * Gave user-provided ``--extra-search-dir`` priority over default dirs for
-          finding setuptools/distribute (it already had priority for finding pip).
-          Thanks Ethan Jucovy.
-        
-        * Updated embedded Distribute release to 0.6.24. Thanks Alex Gronholm.
-        
-        * Made ``--no-site-packages`` behavior the default behavior.  The
-          ``--no-site-packages`` flag is still permitted, but displays a warning when
-          used. Thanks Chris McDonough.
-        
-        * New flag: ``--system-site-packages``; this flag should be passed to get the
-          previous default global-site-package-including behavior back.
-        
-        * Added ability to set command options as environment variables and options
-          in a ``virtualenv.ini`` file.
-        
-        * Fixed various encoding related issues with paths. Thanks Gunnlaugur Thor Briem.
-        
-        * Made ``virtualenv.py`` script executable.
-        
-        
-        1.6.4 (2011-07-21)
-        ~~~~~~~~~~~~~~~~~~
-        
-        * Restored ability to run on Python 2.4, too.
-        
-        
-        1.6.3 (2011-07-16)
-        ~~~~~~~~~~~~~~~~~~
-        
-        * Restored ability to run on Python < 2.7.
-        
-        
-        1.6.2 (2011-07-16)
-        ~~~~~~~~~~~~~~~~~~
-        
-        * Updated embedded distribute release to 0.6.19.
-        
-        * Updated embedded pip release to 1.0.2.
-        
-        * Fixed #141 - Be smarter about finding pkg_resources when using the
-          non-default Python interpreter (by using the ``-p`` option).
-        
-        * Fixed #112 - Fixed path in docs.
-        
-        * Fixed #109 - Corrected doctests of a Logger method.
-        
-        * Fixed #118 - Fixed creating virtualenvs on platforms that use the
-          "posix_local" install scheme, such as Ubuntu with Python 2.7.
-        
-        * Add missing library to Python 3 virtualenvs (``_dummy_thread``).
+        * Fix the default of ``--(no-)download`` to default to downloading.
         
         
-        1.6.1 (2011-04-30)
-        ~~~~~~~~~~~~~~~~~~
-        
-        * Start to use git-flow.
-        
-        * Added support for PyPy 1.5
-        
-        * Fixed #121 -- added sanity-checking of the -p argument. Thanks Paul Nasrat.
-        
-        * Added progress meter for pip installation as well as setuptools. Thanks Ethan
-          Jucovy.
-        
-        * Added --never-download and --search-dir options. Thanks Ethan Jucovy.
-        
-        
-        1.6
-        ~~~
-        
-        * Added Python 3 support! Huge thanks to Vinay Sajip and Vitaly Babiy.
-        
-        * Fixed creation of virtualenvs on Mac OS X when standard library modules
-          (readline) are installed outside the standard library.
+        14.0.0 (2016-01-19)
+        -------------------
         
-        * Updated bundled pip to 1.0.
-        
-        
-        1.5.2
-        ~~~~~
-        
-        * Moved main repository to Github: https://github.com/pypa/virtualenv
-        
-        * Transferred primary maintenance from Ian to Jannis Leidel, Carl Meyer and Brian Rosner
-        
-        * Fixed a few more pypy related bugs.
+        * **BACKWARDS INCOMPATIBLE** Drop support for Python 3.2.
         
-        * Updated bundled pip to 0.8.2.
-        
-        * Handed project over to new team of maintainers.
-        
-        * Moved virtualenv to Github at https://github.com/pypa/virtualenv
+        * Upgrade setuptools to 19.4
         
-        
-        1.5.1
-        ~~~~~
-        
-        * Added ``_weakrefset`` requirement for Python 2.7.1.
+        * Upgrade wheel to 0.26.0
         
-        * Fixed Windows regression in 1.5
-        
-        
-        1.5
-        ~~~
-        
-        * Include pip 0.8.1.
-        
-        * Add support for PyPy.
+        * Upgrade pip to 8.0.0
         
-        * Uses a proper temporary dir when installing environment requirements.
-        
-        * Add ``--prompt`` option to be able to override the default prompt prefix.
-        
-        * Fix an issue with ``--relocatable`` on Windows.
-        
-        * Fix issue with installing the wrong version of distribute.
-        
-        * Add fish and csh activate scripts.
-        
+        * Upgrade argparse to 1.4.0
         
-        1.4.9
-        ~~~~~
-        
-        * Include pip 0.7.2
-        
-        
-        1.4.8
-        ~~~~~
-        
-        * Fix for Mac OS X Framework builds that use
-          ``--universal-archs=intel``
+        * Added support for ``python-config`` script (PR #798)
         
-        * Fix ``activate_this.py`` on Windows.
-        
-        * Allow ``$PYTHONHOME`` to be set, so long as you use ``source
-          bin/activate`` it will get unset; if you leave it set and do not
-          activate the environment it will still break the environment.
+        * Updated activate.fish (PR #589) (PR #799)
         
-        * Include pip 0.7.1
-        
-        
-        1.4.7
-        ~~~~~
-        
-        * Include pip 0.7
+        * Account for a ``site.pyo`` correctly in some python implementations (PR #759)
         
-        
-        1.4.6
-        ~~~~~
-        
-        * Allow ``activate.sh`` to skip updating the prompt (by setting
-          ``$VIRTUAL_ENV_DISABLE_PROMPT``).
-        
-        
-        1.4.5
-        ~~~~~
+        * Properly restore an empty PS1 (#407)
         
-        * Include pip 0.6.3
-        
-        * Fix ``activate.bat`` and ``deactivate.bat`` under Windows when
-          ``PATH`` contained a parenthesis
-        
-        
-        1.4.4
-        ~~~~~
-        
-        * Include pip 0.6.2 and Distribute 0.6.10
+        * Properly remove ``pydoc`` when deactivating
         
-        * Create the ``virtualenv`` script even when Setuptools isn't
-          installed
-        
-        * Fix problem with ``virtualenv --relocate`` when ``bin/`` has
-          subdirectories (e.g., ``bin/.svn/``); from Alan Franzoni.
-        
-        * If you set ``$VIRTUALENV_DISTRIBUTE`` then virtualenv will use
-          Distribute by default (so you don't have to remember to use
-          ``--distribute``).
-        
+        * Remove workaround for very old Mageia / Mandriva linuxes (PR #472)
         
-        1.4.3
-        ~~~~~
-        
-        * Include pip 0.6.1
-        
+        * Added a space after virtualenv name in the prompt: ``(env) $PS1``
         
-        1.4.2
-        ~~~~~
-        
-        * Fix pip installation on Windows
-        
-        * Fix use of stand-alone ``virtualenv.py`` (and boot scripts)
+        * Make sure not to run a --user install when creating the virtualenv (PR #803)
         
-        * Exclude ~/.local (user site-packages) from environments when using
-          ``--no-site-packages``
-        
-        
-        1.4.1
-        ~~~~~
-        
-        * Include pip 0.6
-        
+        * Remove virtualenv file's path from directory when executing with a new
+          python. Fixes issue #779, #763 (PR #805)
         
-        1.4
-        ~~~
-        
-        * Updated setuptools to 0.6c11
-        
-        * Added the --distribute option
-        
-        * Fixed packaging problem of support-files
-        
-        
-        1.3.4
-        ~~~~~
+        * Remove use of () in .bat files so ``Program Files (x86)`` works #35
         
-        * Virtualenv now copies the actual embedded Python binary on
-          Mac OS X to fix a hang on Snow Leopard (10.6).
-        
-        * Fail more gracefully on Windows when ``win32api`` is not installed.
-        
-        * Fix site-packages taking precedent over Jython's ``__classpath__``
-          and also specially handle the new ``__pyclasspath__`` entry in
-          ``sys.path``.
-        
-        * Now copies Jython's ``registry`` file to the virtualenv if it exists.
-        
-        * Better find libraries when compiling extensions on Windows.
+        * Download new releases of the preinstalled software from PyPI when there are
+          new releases available. This behavior can be disabled using
+          ``--no-download``.
         
-        * Create ``Scripts\pythonw.exe`` on Windows.
-        
-        * Added support for the Debian/Ubuntu
-          ``/usr/lib/pythonX.Y/dist-packages`` directory.
-        
-        * Set ``distutils.sysconfig.get_config_vars()['LIBDIR']`` (based on
-          ``sys.real_prefix``) which is reported to help building on Windows.
-        
-        * Make ``deactivate`` work on ksh
-        
-        * Fixes for ``--python``: make it work with ``--relocatable`` and the
-          symlink created to the exact Python version.
+        * Make ``--no-setuptools``, ``--no-pip``, and ``--no-wheel`` independent of
+          each other.
         
         
-        1.3.3
-        ~~~~~
-        
-        * Use Windows newlines in ``activate.bat``, which has been reported to help
-          when using non-ASCII directory names.
-        
-        * Fixed compatibility with Jython 2.5b1.
-        
-        * Added a function ``virtualenv.install_python`` for more fine-grained
-          access to what ``virtualenv.create_environment`` does.
-        
-        * Fix `a problem <https://bugs.launchpad.net/virtualenv/+bug/241581>`_
-          with Windows and paths that contain spaces.
-        
-        * If ``/path/to/env/.pydistutils.cfg`` exists (or
-          ``/path/to/env/pydistutils.cfg`` on Windows systems) then ignore
-          ``~/.pydistutils.cfg`` and use that other file instead.
-        
-        * Fix ` a problem
-          <https://bugs.launchpad.net/virtualenv/+bug/340050>`_ picking up
-          some ``.so`` libraries in ``/usr/local``.
-        
-        
-        1.3.2
-        ~~~~~
-        
-        * Remove the ``[install] prefix = ...`` setting from the virtualenv
-          ``distutils.cfg`` -- this has been causing problems for a lot of
-          people, in rather obscure ways.
-        
-        * If you use a boot script it will attempt to import ``virtualenv``
-          and find a pre-downloaded Setuptools egg using that.
-        
-        * Added platform-specific paths, like ``/usr/lib/pythonX.Y/plat-linux2``
-        
-        
-        1.3.1
-        ~~~~~
-        
-        * Real Python 2.6 compatibility.  Backported the Python 2.6 updates to
-          ``site.py``, including `user directories
-          <http://docs.python.org/dev/whatsnew/2.6.html#pep-370-per-user-site-packages-directory>`_
-          (this means older versions of Python will support user directories,
-          whether intended or not).
-        
-        * Always set ``[install] prefix`` in ``distutils.cfg`` -- previously
-          on some platforms where a system-wide ``distutils.cfg`` was present
-          with a ``prefix`` setting, packages would be installed globally
-          (usually in ``/usr/local/lib/pythonX.Y/site-packages``).
-        
-        * Sometimes Cygwin seems to leave ``.exe`` off ``sys.executable``; a
-          workaround is added.
-        
-        * Fix ``--python`` option.
-        
-        * Fixed handling of Jython environments that use a
-          jython-complete.jar.
-        
-        
-        1.3
-        ~~~
-        
-        * Update to Setuptools 0.6c9
-        * Added an option ``virtualenv --relocatable EXISTING_ENV``, which
-          will make an existing environment "relocatable" -- the paths will
-          not be absolute in scripts, ``.egg-info`` and ``.pth`` files.  This
-          may assist in building environments that can be moved and copied.
-          You have to run this *after* any new packages installed.
-        * Added ``bin/activate_this.py``, a file you can use like
-          ``execfile("path_to/activate_this.py",
-          dict(__file__="path_to/activate_this.py"))`` -- this will activate
-          the environment in place, similar to what `the mod_wsgi example
-          does <http://code.google.com/p/modwsgi/wiki/VirtualEnvironments>`_.
-        * For Mac framework builds of Python, the site-packages directory
-          ``/Library/Python/X.Y/site-packages`` is added to ``sys.path``, from
-          Andrea Rech.
-        * Some platform-specific modules in Macs are added to the path now
-          (``plat-darwin/``, ``plat-mac/``, ``plat-mac/lib-scriptpackages``),
-          from Andrea Rech.
-        * Fixed a small Bashism in the ``bin/activate`` shell script.
-        * Added ``__future__`` to the list of required modules, for Python
-          2.3.  You'll still need to backport your own ``subprocess`` module.
-        * Fixed the ``__classpath__`` entry in Jython's ``sys.path`` taking
-          precedent over virtualenv's libs.
-        
-        
-        1.2
-        ~~~
-        
-        * Added a ``--python`` option to select the Python interpreter.
-        * Add ``warnings`` to the modules copied over, for Python 2.6 support.
-        * Add ``sets`` to the module copied over for Python 2.3 (though Python
-          2.3 still probably doesn't work).
-        
-        
-        1.1.1
-        ~~~~~
-        
-        * Added support for Jython 2.5.
-        
-        
-        1.1
-        ~~~
-        
-        * Added support for Python 2.6.
-        * Fix a problem with missing ``DLLs/zlib.pyd`` on Windows.  Create
-        * ``bin/python`` (or ``bin/python.exe``) even when you run virtualenv
-          with an interpreter named, e.g., ``python2.4``
-        * Fix MacPorts Python
-        * Added --unzip-setuptools option
-        * Update to Setuptools 0.6c8
-        * If the current directory is not writable, run ez_setup.py in ``/tmp``
-        * Copy or symlink over the ``include`` directory so that packages will
-          more consistently compile.
-        
-        
-        1.0
-        ~~~
-        
-        * Fix build on systems that use ``/usr/lib64``, distinct from
-          ``/usr/lib`` (specifically CentOS x64).
-        * Fixed bug in ``--clear``.
-        * Fixed typos in ``deactivate.bat``.
-        * Preserve ``$PYTHONPATH`` when calling subprocesses.
-        
-        
-        0.9.2
-        ~~~~~
-        
-        * Fix include dir copying on Windows (makes compiling possible).
-        * Include the main ``lib-tk`` in the path.
-        * Patch ``distutils.sysconfig``: ``get_python_inc`` and
-          ``get_python_lib`` to point to the global locations.
-        * Install ``distutils.cfg`` before Setuptools, so that system
-          customizations of ``distutils.cfg`` won't effect the installation.
-        * Add ``bin/pythonX.Y`` to the virtualenv (in addition to
-          ``bin/python``).
-        * Fixed an issue with Mac Framework Python builds, and absolute paths
-          (from Ronald Oussoren).
-        
-        
-        0.9.1
-        ~~~~~
-        
-        * Improve ability to create a virtualenv from inside a virtualenv.
-        * Fix a little bug in ``bin/activate``.
-        * Actually get ``distutils.cfg`` to work reliably.
-        
-        
-        0.9
-        ~~~
-        
-        * Added ``lib-dynload`` and ``config`` to things that need to be
-          copied over in an environment.
-        * Copy over or symlink the ``include`` directory, so that you can
-          build packages that need the C headers.
-        * Include a ``distutils`` package, so you can locally update
-          ``distutils.cfg`` (in ``lib/pythonX.Y/distutils/distutils.cfg``).
-        * Better avoid downloading Setuptools, and hitting PyPI on environment
-          creation.
-        * Fix a problem creating a ``lib64/`` directory.
-        * Should work on MacOSX Framework builds (the default Python
-          installations on Mac).  Thanks to Ronald Oussoren.
-        
-        
-        0.8.4
-        ~~~~~
-        
-        * Windows installs would sometimes give errors about ``sys.prefix`` that
-          were inaccurate.
-        * Slightly prettier output.
-        
-        
-        0.8.3
-        ~~~~~
-        
-        * Added support for Windows.
-        
-        
-        0.8.2
-        ~~~~~
-        
-        * Give a better warning if you are on an unsupported platform (Mac
-          Framework Pythons, and Windows).
-        * Give error about running while inside a workingenv.
-        * Give better error message about Python 2.3.
-        
-        
-        0.8.1
-        ~~~~~
-        
-        Fixed packaging of the library.
-        
-        
-        0.8
-        ~~~
-        
-        Initial release.  Everything is changed and new!
-        
+        `Full Changelog <https://virtualenv.pypa.io/en/latest/changes.html>`_.
 Keywords: setuptools deployment installation distutils
 Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Intended Audience :: Developers
 Classifier: License :: OSI Approved :: MIT License
 Classifier: Programming Language :: Python :: 2
 Classifier: Programming Language :: Python :: 2.6
 Classifier: Programming Language :: Python :: 2.7
 Classifier: Programming Language :: Python :: 3
 Classifier: Programming Language :: Python :: 3.1
 Classifier: Programming Language :: Python :: 3.2
+Classifier: Programming Language :: Python :: 3.3
+Classifier: Programming Language :: Python :: 3.4
--- a/python/virtualenv/README.rst
+++ b/python/virtualenv/README.rst
@@ -1,10 +1,20 @@
 virtualenv
 ==========
 
-.. image:: https://pypip.in/v/virtualenv/badge.png
+.. image:: https://img.shields.io/pypi/v/virtualenv.svg
         :target: https://pypi.python.org/pypi/virtualenv
 
-.. image:: https://secure.travis-ci.org/pypa/virtualenv.png?branch=develop
+.. image:: https://img.shields.io/travis/pypa/virtualenv/develop.svg
    :target: http://travis-ci.org/pypa/virtualenv
 
 For documentation, see https://virtualenv.pypa.io/
+
+
+Code of Conduct
+---------------
+
+Everyone interacting in the virtualenv project's codebases, issue trackers,
+chat rooms, and mailing lists is expected to follow the
+`PyPA Code of Conduct`_.
+
+.. _PyPA Code of Conduct: https://www.pypa.io/en/latest/code-of-conduct/
--- a/python/virtualenv/bin/rebuild-script.py
+++ b/python/virtualenv/bin/rebuild-script.py
@@ -1,71 +1,73 @@
 #!/usr/bin/env python
 """
 Helper script to rebuild virtualenv.py from virtualenv_support
 """
+from __future__ import print_function
 
+import os
 import re
-import os
-import sys
+import codecs
+from zlib import crc32
 
 here = os.path.dirname(__file__)
 script = os.path.join(here, '..', 'virtualenv.py')
 
-file_regex = re.compile(
-    r'##file (.*?)\n([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*convert\("""(.*?)"""\)',
-    re.S)
-file_template = '##file %(filename)s\n%(varname)s = convert("""\n%(data)s""")'
+gzip = codecs.lookup('zlib')
+b64 = codecs.lookup('base64')
 
-def rebuild():
-    f = open(script, 'rb')
-    content = f.read()
-    f.close()
+file_regex = re.compile(
+    br'##file (.*?)\n([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*convert\("""\n(.*?)"""\)',
+    re.S)
+file_template = b'##file %(filename)s\n%(varname)s = convert("""\n%(data)s""")'
+
+def rebuild(script_path):
+    with open(script_path, 'rb') as f:
+        script_content = f.read()
     parts = []
     last_pos = 0
     match = None
-    for match in file_regex.finditer(content):
-        parts.append(content[last_pos:match.start()])
+    for match in file_regex.finditer(script_content):
+        parts += [script_content[last_pos:match.start()]]
         last_pos = match.end()
-        filename = match.group(1)
+        filename, fn_decoded = match.group(1), match.group(1).decode()
         varname = match.group(2)
         data = match.group(3)
-        print('Found reference to file %s' % filename)
-        pathname = os.path.join(here, '..', 'virtualenv_embedded', filename)
-        f = open(pathname, 'rb')
-        c = f.read()
-        f.close()
-        new_data = c.encode('zlib').encode('base64')
+
+        print('Found file %s' % fn_decoded)
+        pathname = os.path.join(here, '..', 'virtualenv_embedded', fn_decoded)
+
+        with open(pathname, 'rb') as f:
+            embedded = f.read()
+        new_crc = crc32(embedded)
+        new_data = b64.encode(gzip.encode(embedded)[0])[0]
+
         if new_data == data:
-            print('  Reference up to date (%s bytes)' % len(c))
-            parts.append(match.group(0))
+            print('  File up to date (crc: %s)' % new_crc)
+            parts += [match.group(0)]
             continue
-        print('  Content changed (%s bytes -> %s bytes)' % (
-            zipped_len(data), len(c)))
-        new_match = file_template % dict(
-            filename=filename,
-            varname=varname,
-            data=new_data)
-        parts.append(new_match)
-    parts.append(content[last_pos:])
-    new_content = ''.join(parts)
-    if new_content != content:
-        sys.stdout.write('Content updated; overwriting... ')
-        f = open(script, 'wb')
-        f.write(new_content)
-        f.close()
+        # Else: content has changed
+        crc = crc32(gzip.decode(b64.decode(data)[0])[0])
+        print('  Content changed (crc: %s -> %s)' %
+              (crc, new_crc))
+        new_match = file_template % {
+            b'filename': filename,
+            b'varname': varname,
+            b'data': new_data
+        }
+        parts += [new_match]
+
+    parts += [script_content[last_pos:]]
+    new_content = b''.join(parts)
+
+    if new_content != script_content:
+        print('Content updated; overwriting... ', end='')
+        with open(script_path, 'wb') as f:
+            f.write(new_content)
         print('done.')
     else:
         print('No changes in content')
     if match is None:
         print('No variables were matched/found')
 
-def zipped_len(data):
-    if not data:
-        return 'no data'
-    try:
-        return len(data.decode('base64').decode('zlib'))
-    except:
-        return 'unknown'
-
 if __name__ == '__main__':
-    rebuild()
-    
+    rebuild(script)
--- a/python/virtualenv/docs/changes.rst
+++ b/python/virtualenv/docs/changes.rst
@@ -1,125 +1,260 @@
 Release History
 ===============
 
+14.0.1 (2016-01-21)
+-------------------
+
+* Upgrade from pip 8.0.0 to 8.0.2.
+
+* Fix the default of ``--(no-)download`` to default to downloading.
+
+
+14.0.0 (2016-01-19)
+-------------------
+
+* **BACKWARDS INCOMPATIBLE** Drop support for Python 3.2.
+
+* Upgrade setuptools to 19.4
+
+* Upgrade wheel to 0.26.0
+
+* Upgrade pip to 8.0.0
+
+* Upgrade argparse to 1.4.0
+
+* Added support for ``python-config`` script (:pull:`798`)
+
+* Updated activate.fish (:pull:`589`) (:pull:`799`)
+
+* Account for a ``site.pyo`` correctly in some python implementations (:pull:`759`)
+
+* Properly restore an empty PS1 (:issue:`407`)
+
+* Properly remove ``pydoc`` when deactivating
+
+* Remove workaround for very old Mageia / Mandriva linuxes (:pull:`472`)
+
+* Added a space after virtualenv name in the prompt: ``(env) $PS1``
+
+* Make sure not to run a --user install when creating the virtualenv (:pull:`803`)
+
+* Remove virtualenv file's path from directory when executing with a new
+  python. Fixes issue :issue:`779`, :issue:`763` (:pull:`805`)
+
+* Remove use of () in .bat files so ``Program Files (x86)`` works :issue:`35`
+
+* Download new releases of the preinstalled software from PyPI when there are
+  new releases available. This behavior can be disabled using
+  ``--no-download``.
+
+* Make ``--no-setuptools``, ``--no-pip``, and ``--no-wheel`` independent of
+  each other.
+
+
+13.1.2 (2015-08-23)
+-------------------
+
+* Upgrade pip to 7.1.2.
+
+13.1.1 (2015-08-20)
+-------------------
+
+* Upgrade pip to 7.1.1.
+
+* Upgrade setuptools to 18.2.
+
+* Make the activate script safe to use when bash is running with ``-u``.
+
+13.1.0 (2015-06-30)
+-------------------
+
+* Upgrade pip to 7.1.0
+
+* Upgrade setuptools to 18.0.1
+
+
+13.0.3 (2015-06-01)
+-------------------
+
+* Upgrade pip to 7.0.3
+
+
+13.0.2 (2015-06-01)
+-------------------
+
+* Upgrade pip to 7.0.2
+
+* Upgrade setuptools to 17.0
+
+
+13.0.1 (2015-05-22)
+-------------------
+
+* Upgrade pip to 7.0.1
+
+
+13.0.0 (2015-05-21)
+-------------------
+
+* Automatically install wheel when creating a new virutalenv. This can be
+  disabled by using the ``--no-wheel`` option.
+
+* Don't trust the current directory as a location to discover files to install
+  packages from.
+
+* Upgrade setuptools to 16.0.
+
+* Upgrade pip to 7.0.0.
+
+
+12.1.1 (2015-04-07)
+-------------------
+
+* Upgrade pip to 6.1.1
+
+
+12.1.0 (2015-04-07)
+-------------------
+
+* Upgrade setuptools to 15.0
+
+* Upgrade pip to 6.1.0
+
+
+12.0.7 (2015-02-04)
+-------------------
+
+* Upgrade pip to 6.0.8
+
+
+12.0.6 (2015-01-28)
+-------------------
+
+* Upgrade pip to 6.0.7
+
+* Upgrade setuptools to 12.0.5
+
+
 12.0.5 (2015-01-03)
-~~~~~~~~~~~~~~~~~~~
+-------------------
 
 * Upgrade pip to 6.0.6
 
 * Upgrade setuptools to 11.0
 
 
-12.0.4 (2014-22-23)
-~~~~~~~~~~~~~~~~~~~
+12.0.4 (2014-12-23)
+-------------------
 
 * Revert the fix to ``-p`` on Debian based pythons as it was broken in other
   situations.
 
 * Revert several sys.path changes new in 12.0 which were breaking virtualenv.
 
-12.0.3 (2014-22-23)
-~~~~~~~~~~~~~~~~~~~
+12.0.3 (2014-12-23)
+-------------------
 
 * Fix an issue where Debian based Pythons would fail when using -p with the
   host Python.
 
 * Upgrade pip to 6.0.3
 
 12.0.2 (2014-12-23)
-~~~~~~~~~~~~~~~~~~~
+-------------------
 
 * Upgraded pip to 6.0.2
 
 12.0.1 (2014-12-22)
-~~~~~~~~~~~~~~~~~~~
+-------------------
 
 * Upgraded pip to 6.0.1
 
+
 12.0 (2014-12-22)
-~~~~~~~~~~~~~~~~~
+-----------------
 
 * **PROCESS** Version numbers are now simply ``X.Y`` where the leading ``1``
   has been dropped.
 * Split up documentation into structured pages
 * Now using pytest framework
 * Correct sys.path ordering for debian, issue #461
 * Correctly throws error on older Pythons, issue #619
 * Allow for empty $PATH, pull #601
 * Don't set prompt if $env:VIRTUAL_ENV_DISABLE_PROMPT is set for Powershell
 * Updated setuptools to 7.0
 
 1.11.6 (2014-05-16)
-~~~~~~~~~~~~~~~~~~~
+-------------------
 
 * Updated setuptools to 3.6
 * Updated pip to 1.5.6
 
 1.11.5 (2014-05-03)
-~~~~~~~~~~~~~~~~~~~
+-------------------
 
 * Updated setuptools to 3.4.4
 * Updated documentation to use https://virtualenv.pypa.io/
 * Updated pip to 1.5.5
 
 1.11.4 (2014-02-21)
-~~~~~~~~~~~~~~~~~~~
+-------------------
 
 * Updated pip to 1.5.4
 
 
 1.11.3 (2014-02-20)
-~~~~~~~~~~~~~~~~~~~
+-------------------
 
 * Updated setuptools to 2.2
 * Updated pip to 1.5.3
 
 
 1.11.2 (2014-01-26)
-~~~~~~~~~~~~~~~~~~~
+-------------------
 
 * Fixed easy_install installed virtualenvs by updated pip to 1.5.2
 
 1.11.1 (2014-01-20)
-~~~~~~~~~~~~~~~~~~~
+-------------------
 
 * Fixed an issue where pip and setuptools were not getting installed when using
   the ``--system-site-packages`` flag.
 * Updated setuptools to fix an issue when installed with easy_install
 * Fixed an issue with Python 3.4 and sys.stdout encoding being set to ascii
 * Upgraded pip to v1.5.1
 * Upgraded setuptools to v2.1
 
 1.11 (2014-01-02)
-~~~~~~~~~~~~~~~~~
+-----------------
 
 * **BACKWARDS INCOMPATIBLE** Switched to using wheels for the bundled copies of
   setuptools and pip. Using sdists is no longer supported - users supplying
   their own versions of pip/setuptools will need to provide wheels.
 * **BACKWARDS INCOMPATIBLE** Modified the handling of ``--extra-search-dirs``.
   This option now works like pip's ``--find-links`` option, in that it adds
   extra directories to search for compatible wheels for pip and setuptools.
   The actual wheel selected is chosen based on version and compatibility, using
   the same algorithm as ``pip install setuptools``.
 * Fixed #495, --always-copy was failing (#PR 511)
 * Upgraded pip to v1.5
 * Upgraded setuptools to v1.4
 
 1.10.1 (2013-08-07)
-~~~~~~~~~~~~~~~~~~~
+-------------------
 
 * **New Signing Key** Release 1.10.1 is using a different key than normal with
   fingerprint: 7C6B 7C5D 5E2B 6356 A926 F04F 6E3C BCE9 3372 DCFA
 * Upgraded pip to v1.4.1
 * Upgraded setuptools to v0.9.8
 
 
 1.10 (2013-07-23)
-~~~~~~~~~~~~~~~~~
+-----------------
 
 * **BACKWARDS INCOMPATIBLE** Dropped support for Python 2.5. The minimum
   supported Python version is now Python 2.6.
 
 * **BACKWARDS INCOMPATIBLE** Using ``virtualenv.py`` as an isolated script
   (i.e. without an associated ``virtualenv_support`` directory) is no longer
   supported for security reasons and will fail with an error.
 
@@ -143,51 +278,51 @@ 1.10 (2013-07-23)
 
 * Fixed ``--relocatable`` to work better on Windows.
 
 * Fixed issue with readline on Windows.
 
 .. _Distribute: https://pypi.python.org/pypi/distribute
 
 1.9.1 (2013-03-08)
-~~~~~~~~~~~~~~~~~~
+------------------
 
 * Updated to pip 1.3.1 that fixed a major backward incompatible change of
   parsing URLs to externally hosted packages that got accidentily included
   in pip 1.3.
 
 1.9 (2013-03-07)
-~~~~~~~~~~~~~~~~
+----------------
 
 * Unset VIRTUAL_ENV environment variable in deactivate.bat (Pull #364)
 * Upgraded distribute to 0.6.34.
 * Added ``--no-setuptools`` and ``--no-pip`` options (Pull #336).
 * Fixed Issue #373. virtualenv-1.8.4 was failing in cygwin (Pull #382).
 * Fixed Issue #378. virtualenv is now "multiarch" aware on debian/ubuntu (Pull #379).
 * Fixed issue with readline module path on pypy and OSX (Pull #374).
 * Made 64bit detection compatible with Python 2.5 (Pull #393).
 
 
 1.8.4 (2012-11-25)
-~~~~~~~~~~~~~~~~~~
+------------------
 
 * Updated distribute to 0.6.31. This fixes #359 (numpy install regression) on
   UTF-8 platforms, and provides a workaround on other platforms:
   ``PYTHONIOENCODING=utf8 pip install numpy``.
 
 * When installing virtualenv via curl, don't forget to filter out arguments
   the distribute setup script won't understand. Fixes #358.
 
 * Added some more integration tests.
 
 * Removed the unsupported embedded setuptools egg for Python 2.4 to reduce
   file size.
 
 1.8.3 (2012-11-21)
-~~~~~~~~~~~~~~~~~~
+------------------
 
 * Fixed readline on OS X. Thanks minrk
 
 * Updated distribute to 0.6.30 (improves our error reporting, plus new
   distribute features and fixes). Thanks Gabriel (g2p)
 
 * Added compatibility with multiarch Python (Python 3.3 for example). Added an
   integration test. Thanks Gabriel (g2p)
@@ -206,34 +341,34 @@ 1.8.3 (2012-11-21)
 
 * Make it possible to create a virtualenv from within a Python
   3.3. pyvenv. Thanks Chris McDonough for the report.
 
 * Add optional --setuptools option to be able to switch to it in case
   distribute is the default (like in Debian).
 
 1.8.2 (2012-09-06)
-~~~~~~~~~~~~~~~~~~
+------------------
 
 * Updated the included pip version to 1.2.1 to fix regressions introduced
   there in 1.2.
 
 
 1.8.1 (2012-09-03)
-~~~~~~~~~~~~~~~~~~
+------------------
 
 * Fixed distribute version used with `--never-download`. Thanks michr for
   report and patch.
 
 * Fix creating Python 3.3 based virtualenvs by unsetting the
   ``__PYVENV_LAUNCHER__`` environment variable in subprocesses.
 
 
 1.8 (2012-09-01)
-~~~~~~~~~~~~~~~~
+----------------
 
 * **Dropped support for Python 2.4** The minimum supported Python version is
   now Python 2.5.
 
 * Fix `--relocatable` on systems that use lib64. Fixes #78. Thanks Branden
   Rolston.
 
 * Symlink some additional modules under Python 3. Fixes #194. Thanks Vinay
@@ -254,17 +389,17 @@ 1.8 (2012-09-01)
 
 * Handle paths of users' site-packages on Mac OS X correctly when changing
   the prefix.
 
 * Updated the embedded version of distribute to 0.6.28 and pip to 1.2.
 
 
 1.7.2 (2012-06-22)
-~~~~~~~~~~~~~~~~~~
+------------------
 
 * Updated to distribute 0.6.27.
 
 * Fix activate.fish on OS X. Fixes #8. Thanks David Schoonover.
 
 * Create a virtualenv-x.x script with the Python version when installing, so
   virtualenv for multiple Python versions can be installed to the same
   script location. Thanks Miki Tebeka.
@@ -284,31 +419,31 @@ 1.7.2 (2012-06-22)
 * Fixed creating a bootstrap script on Python 3. Thanks Raul Leal. Fixes #280.
 
 * Fixed inconsistency when having set the ``PYTHONDONTWRITEBYTECODE`` env var
   with the --distribute option or the ``VIRTUALENV_USE_DISTRIBUTE`` env var.
   ``VIRTUALENV_USE_DISTRIBUTE`` is now considered again as a legacy alias.
 
 
 1.7.1.2 (2012-02-17)
-~~~~~~~~~~~~~~~~~~~~
+--------------------
 
 * Fixed minor issue in `--relocatable`. Thanks, Cap Petschulat.
 
 
 1.7.1.1 (2012-02-16)
-~~~~~~~~~~~~~~~~~~~~
+--------------------
 
 * Bumped the version string in ``virtualenv.py`` up, too.
 
 * Fixed rST rendering bug of long description.
 
 
 1.7.1 (2012-02-16)
-~~~~~~~~~~~~~~~~~~
+------------------
 
 * Update embedded pip to version 1.1.
 
 * Fix `--relocatable` under Python 3. Thanks Doug Hellmann.
 
 * Added environ PATH modification to activate_this.py. Thanks Doug
   Napoleone. Fixes #14.
 
@@ -331,17 +466,17 @@ 1.7.1 (2012-02-16)
   installed in `site-packages` next to `virtualenv.py`. Thanks Greg Haskins
   for report and fix. Fixes #167.
 
 * Added activation script for Powershell (signed by Jannis Leidel). Many
   thanks to Jason R. Coombs.
 
 
 1.7 (2011-11-30)
-~~~~~~~~~~~~~~~~
+----------------
 
 * Gave user-provided ``--extra-search-dir`` priority over default dirs for
   finding setuptools/distribute (it already had priority for finding pip).
   Thanks Ethan Jucovy.
 
 * Updated embedded Distribute release to 0.6.24. Thanks Alex Gronholm.
 
 * Made ``--no-site-packages`` behavior the default behavior.  The
@@ -355,29 +490,29 @@ 1.7 (2011-11-30)
   in a ``virtualenv.ini`` file.
 
 * Fixed various encoding related issues with paths. Thanks Gunnlaugur Thor Briem.
 
 * Made ``virtualenv.py`` script executable.
 
 
 1.6.4 (2011-07-21)
-~~~~~~~~~~~~~~~~~~
+------------------
 
 * Restored ability to run on Python 2.4, too.
 
 
 1.6.3 (2011-07-16)
-~~~~~~~~~~~~~~~~~~
+------------------
 
 * Restored ability to run on Python < 2.7.
 
 
 1.6.2 (2011-07-16)
-~~~~~~~~~~~~~~~~~~
+------------------
 
 * Updated embedded distribute release to 0.6.19.
 
 * Updated embedded pip release to 1.0.2.
 
 * Fixed #141 - Be smarter about finding pkg_resources when using the
   non-default Python interpreter (by using the ``-p`` option).
 
@@ -387,67 +522,67 @@ 1.6.2 (2011-07-16)
 
 * Fixed #118 - Fixed creating virtualenvs on platforms that use the
   "posix_local" install scheme, such as Ubuntu with Python 2.7.
 
 * Add missing library to Python 3 virtualenvs (``_dummy_thread``).
 
 
 1.6.1 (2011-04-30)
-~~~~~~~~~~~~~~~~~~
+------------------
 
 * Start to use git-flow.
 
 * Added support for PyPy 1.5
 
 * Fixed #121 -- added sanity-checking of the -p argument. Thanks Paul Nasrat.
 
 * Added progress meter for pip installation as well as setuptools. Thanks Ethan
   Jucovy.
 
 * Added --never-download and --search-dir options. Thanks Ethan Jucovy.
 
 
 1.6
-~~~
+---
 
 * Added Python 3 support! Huge thanks to Vinay Sajip and Vitaly Babiy.
 
 * Fixed creation of virtualenvs on Mac OS X when standard library modules
   (readline) are installed outside the standard library.
 
 * Updated bundled pip to 1.0.
 
 
 1.5.2
-~~~~~
+-----
 
 * Moved main repository to Github: https://github.com/pypa/virtualenv
 
 * Transferred primary maintenance from Ian to Jannis Leidel, Carl Meyer and Brian Rosner
 
 * Fixed a few more pypy related bugs.
 
 * Updated bundled pip to 0.8.2.
 
 * Handed project over to new team of maintainers.
 
 * Moved virtualenv to Github at https://github.com/pypa/virtualenv
 
 
 1.5.1
-~~~~~
+-----
 
 * Added ``_weakrefset`` requirement for Python 2.7.1.
 
 * Fixed Windows regression in 1.5
 
 
 1.5
-~~~
+---
 
 * Include pip 0.8.1.
 
 * Add support for PyPy.
 
 * Uses a proper temporary dir when installing environment requirements.
 
 * Add ``--prompt`` option to be able to override the default prompt prefix.
@@ -455,109 +590,109 @@ 1.5
 * Fix an issue with ``--relocatable`` on Windows.
 
 * Fix issue with installing the wrong version of distribute.
 
 * Add fish and csh activate scripts.
 
 
 1.4.9
-~~~~~
+-----
 
 * Include pip 0.7.2
 
 
 1.4.8
-~~~~~
+-----
 
 * Fix for Mac OS X Framework builds that use
   ``--universal-archs=intel``
 
 * Fix ``activate_this.py`` on Windows.
 
 * Allow ``$PYTHONHOME`` to be set, so long as you use ``source
   bin/activate`` it will get unset; if you leave it set and do not
   activate the environment it will still break the environment.
 
 * Include pip 0.7.1
 
 
 1.4.7
-~~~~~
+-----
 
 * Include pip 0.7
 
 
 1.4.6
-~~~~~
+-----
 
 * Allow ``activate.sh`` to skip updating the prompt (by setting
   ``$VIRTUAL_ENV_DISABLE_PROMPT``).
 
 
 1.4.5
-~~~~~
+-----
 
 * Include pip 0.6.3
 
 * Fix ``activate.bat`` and ``deactivate.bat`` under Windows when
   ``PATH`` contained a parenthesis
 
 
 1.4.4
-~~~~~
+-----
 
 * Include pip 0.6.2 and Distribute 0.6.10
 
 * Create the ``virtualenv`` script even when Setuptools isn't
   installed
 
 * Fix problem with ``virtualenv --relocate`` when ``bin/`` has
   subdirectories (e.g., ``bin/.svn/``); from Alan Franzoni.
 
 * If you set ``$VIRTUALENV_DISTRIBUTE`` then virtualenv will use
   Distribute by default (so you don't have to remember to use
   ``--distribute``).
 
 
 1.4.3
-~~~~~
+-----
 
 * Include pip 0.6.1
 
 
 1.4.2
-~~~~~
+-----
 
 * Fix pip installation on Windows
 
 * Fix use of stand-alone ``virtualenv.py`` (and boot scripts)
 
 * Exclude ~/.local (user site-packages) from environments when using
   ``--no-site-packages``
 
 
 1.4.1
-~~~~~
+-----
 
 * Include pip 0.6
 
 
 1.4
-~~~
+---
 
 * Updated setuptools to 0.6c11
 
 * Added the --distribute option
 
 * Fixed packaging problem of support-files
 
 
 1.3.4
-~~~~~
+-----
 
 * Virtualenv now copies the actual embedded Python binary on
   Mac OS X to fix a hang on Snow Leopard (10.6).
 
 * Fail more gracefully on Windows when ``win32api`` is not installed.
 
 * Fix site-packages taking precedent over Jython's ``__classpath__``
   and also specially handle the new ``__pyclasspath__`` entry in
@@ -577,17 +712,17 @@ 1.3.4
 
 * Make ``deactivate`` work on ksh
 
 * Fixes for ``--python``: make it work with ``--relocatable`` and the
   symlink created to the exact Python version.
 
 
 1.3.3
-~~~~~
+-----
 
 * Use Windows newlines in ``activate.bat``, which has been reported to help
   when using non-ASCII directory names.
 
 * Fixed compatibility with Jython 2.5b1.
 
 * Added a function ``virtualenv.install_python`` for more fine-grained
   access to what ``virtualenv.create_environment`` does.
@@ -600,30 +735,30 @@ 1.3.3
   ``~/.pydistutils.cfg`` and use that other file instead.
 
 * Fix ` a problem
   <https://bugs.launchpad.net/virtualenv/+bug/340050>`_ picking up
   some ``.so`` libraries in ``/usr/local``.
 
 
 1.3.2
-~~~~~
+-----
 
 * Remove the ``[install] prefix = ...`` setting from the virtualenv
   ``distutils.cfg`` -- this has been causing problems for a lot of
   people, in rather obscure ways.
 
 * If you use a boot script it will attempt to import ``virtualenv``
   and find a pre-downloaded Setuptools egg using that.
 
 * Added platform-specific paths, like ``/usr/lib/pythonX.Y/plat-linux2``
 
 
 1.3.1
-~~~~~
+-----
 
 * Real Python 2.6 compatibility.  Backported the Python 2.6 updates to
   ``site.py``, including `user directories
   <http://docs.python.org/dev/whatsnew/2.6.html#pep-370-per-user-site-packages-directory>`_
   (this means older versions of Python will support user directories,
   whether intended or not).
 
 * Always set ``[install] prefix`` in ``distutils.cfg`` -- previously
@@ -636,17 +771,17 @@ 1.3.1
 
 * Fix ``--python`` option.
 
 * Fixed handling of Jython environments that use a
   jython-complete.jar.
 
 
 1.3
-~~~
+---
 
 * Update to Setuptools 0.6c9
 * Added an option ``virtualenv --relocatable EXISTING_ENV``, which
   will make an existing environment "relocatable" -- the paths will
   not be absolute in scripts, ``.egg-info`` and ``.pth`` files.  This
   may assist in building environments that can be moved and copied.
   You have to run this *after* any new packages installed.
 * Added ``bin/activate_this.py``, a file you can use like
@@ -663,119 +798,119 @@ 1.3
 * Fixed a small Bashism in the ``bin/activate`` shell script.
 * Added ``__future__`` to the list of required modules, for Python
   2.3.  You'll still need to backport your own ``subprocess`` module.
 * Fixed the ``__classpath__`` entry in Jython's ``sys.path`` taking
   precedent over virtualenv's libs.
 
 
 1.2
-~~~
+---
 
 * Added a ``--python`` option to select the Python interpreter.
 * Add ``warnings`` to the modules copied over, for Python 2.6 support.
 * Add ``sets`` to the module copied over for Python 2.3 (though Python
   2.3 still probably doesn't work).
 
 
 1.1.1
-~~~~~
+-----
 
 * Added support for Jython 2.5.
 
 
 1.1
-~~~
+---
 
 * Added support for Python 2.6.
 * Fix a problem with missing ``DLLs/zlib.pyd`` on Windows.  Create
 * ``bin/python`` (or ``bin/python.exe``) even when you run virtualenv
   with an interpreter named, e.g., ``python2.4``
 * Fix MacPorts Python
 * Added --unzip-setuptools option
 * Update to Setuptools 0.6c8
 * If the current directory is not writable, run ez_setup.py in ``/tmp``
 * Copy or symlink over the ``include`` directory so that packages will
   more consistently compile.
 
 
 1.0
-~~~
+---
 
 * Fix build on systems that use ``/usr/lib64``, distinct from
   ``/usr/lib`` (specifically CentOS x64).
 * Fixed bug in ``--clear``.
 * Fixed typos in ``deactivate.bat``.
 * Preserve ``$PYTHONPATH`` when calling subprocesses.
 
 
 0.9.2
-~~~~~
+-----
 
 * Fix include dir copying on Windows (makes compiling possible).
 * Include the main ``lib-tk`` in the path.
 * Patch ``distutils.sysconfig``: ``get_python_inc`` and
   ``get_python_lib`` to point to the global locations.
 * Install ``distutils.cfg`` before Setuptools, so that system
   customizations of ``distutils.cfg`` won't effect the installation.
 * Add ``bin/pythonX.Y`` to the virtualenv (in addition to
   ``bin/python``).
 * Fixed an issue with Mac Framework Python builds, and absolute paths
   (from Ronald Oussoren).
 
 
 0.9.1
-~~~~~
+-----
 
 * Improve ability to create a virtualenv from inside a virtualenv.
 * Fix a little bug in ``bin/activate``.
 * Actually get ``distutils.cfg`` to work reliably.
 
 
 0.9
-~~~
+---
 
 * Added ``lib-dynload`` and ``config`` to things that need to be
   copied over in an environment.
 * Copy over or symlink the ``include`` directory, so that you can
   build packages that need the C headers.
 * Include a ``distutils`` package, so you can locally update
   ``distutils.cfg`` (in ``lib/pythonX.Y/distutils/distutils.cfg``).
 * Better avoid downloading Setuptools, and hitting PyPI on environment
   creation.
 * Fix a problem creating a ``lib64/`` directory.
 * Should work on MacOSX Framework builds (the default Python
   installations on Mac).  Thanks to Ronald Oussoren.
 
 
 0.8.4
-~~~~~
+-----
 
 * Windows installs would sometimes give errors about ``sys.prefix`` that
   were inaccurate.
 * Slightly prettier output.
 
 
 0.8.3
-~~~~~
+-----
 
 * Added support for Windows.
 
 
 0.8.2
-~~~~~
+-----
 
 * Give a better warning if you are on an unsupported platform (Mac
   Framework Pythons, and Windows).
 * Give error about running while inside a workingenv.
 * Give better error message about Python 2.3.
 
 
 0.8.1
-~~~~~
+-----
 
 Fixed packaging of the library.
 
 
 0.8
-~~~
+---
 
 Initial release.  Everything is changed and new!
--- a/python/virtualenv/docs/conf.py
+++ b/python/virtualenv/docs/conf.py
@@ -19,20 +19,19 @@ on_rtd = os.environ.get('READTHEDOCS', N
 # If your extensions are in another directory, add it here.
 sys.path.insert(0, os.path.abspath(os.pardir))
 
 # General configuration
 # ---------------------
 
 # Add any Sphinx extension module names here, as strings. They can be extensions
 # coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
-extensions = ['sphinx.ext.autodoc']
+extensions = ['sphinx.ext.autodoc', 'sphinx.ext.extlinks']
 
 # Add any paths that contain templates here, relative to this directory.
-## FIXME: disabled for now because I haven't figured out how to use this:
 #templates_path = ['_templates']
 
 # The suffix of source filenames.
 source_suffix = '.rst'
 
 # The master toctree document.
 master_doc = 'index'
 
@@ -69,16 +68,21 @@ unused_docs = []
 
 # If true, sectionauthor and moduleauthor directives will be shown in the
 # output. They are ignored by default.
 #show_authors = False
 
 # The name of the Pygments (syntax highlighting) style to use.
 pygments_style = 'sphinx'
 
+extlinks = {
+    'issue': ('https://github.com/pypa/virtualenv/issues/%s', '#'),
+    'pull': ('https://github.com/pypa/virtualenv/pull/%s', 'PR #'),
+}
+
 
 # Options for HTML output
 # -----------------------
 
 # The style sheet to use for HTML and HTML Help pages. A file of that name
 # must exist either in Sphinx' static/ path, or in one of the custom paths
 # given in html_static_path.
 #html_style = 'default.css'
--- a/python/virtualenv/docs/index.rst
+++ b/python/virtualenv/docs/index.rst
@@ -72,18 +72,18 @@ Other Documentation and Links
 * Chris Perkins created a `showmedo video including virtualenv
   <http://showmedo.com/videos/video?name=2910000&fromSeriesID=291>`_.
 
 * Doug Hellmann's `virtualenvwrapper`_ is a useful set of scripts to make
   your workflow with many virtualenvs even easier. `His initial blog post on it`__.
   He also wrote `an example of using virtualenv to try IPython`__.
 
   .. _virtualenvwrapper: https://pypi.python.org/pypi/virtualenvwrapper/
-  .. __: http://www.doughellmann.com/articles/CompletelyDifferent-2008-05-virtualenvwrapper/index.html
-  .. __: http://www.doughellmann.com/articles/CompletelyDifferent-2008-02-ipython-and-virtualenv/index.html
+  .. __: https://doughellmann.com/blog/2008/05/01/virtualenvwrapper/
+  .. __: https://doughellmann.com/blog/2008/02/01/ipython-and-virtualenv/
 
 * `Pew`_ is another wrapper for virtualenv that makes use of a different
   activation technique.
 
   .. _Pew: https://pypi.python.org/pypi/pew/
 
 * `Using virtualenv with mod_wsgi
   <http://code.google.com/p/modwsgi/wiki/VirtualEnvironments>`_.
--- a/python/virtualenv/docs/reference.rst
+++ b/python/virtualenv/docs/reference.rst
@@ -64,38 +64,43 @@ Options
    This fixes up scripts and makes all .pth files relative.
 
 .. option:: --unzip-setuptools
 
    Unzip Setuptools when installing it.
 
 .. option:: --no-setuptools
 
-   Do not install setuptools (or pip) in the new
-   virtualenv.
+   Do not install setuptools in the new virtualenv.
 
 .. option:: --no-pip
 
    Do not install pip in the new virtualenv.
 
+.. option:: --no-wheel
+
+   Do not install wheel in the new virtualenv.
+
 .. option:: --extra-search-dir=DIR
 
    Directory to look for setuptools/pip distributions in.
    This option can be specified multiple times.
 
 .. option:: --prompt=PROMPT
 
    Provides an alternative prompt prefix for this
    environment.
 
-.. option:: --never-download
+.. option:: --download
+
+   Download preinstalled packages from PyPI.
 
-   DEPRECATED. Retained only for backward compatibility.
-   This option has no effect. Virtualenv never downloads
-   pip or setuptools.
+.. option:: --no-download
+
+   Do not download preinstalled packages from PyPI.
 
 .. option:: --no-site-packages
 
    DEPRECATED. Retained only for backward compatibility.
    Not having access to global site-packages is now the
    default behavior.
 
 .. option:: --distribute
--- a/python/virtualenv/docs/userguide.rst
+++ b/python/virtualenv/docs/userguide.rst
@@ -120,16 +120,25 @@ below.
 
         PS C:\> Set-ExecutionPolicy RemoteSigned
 
     Since the ``activate.ps1`` script is generated locally for each virtualenv,
     it is not considered a remote script and can then be executed.
 
 .. _`execution policies`: http://technet.microsoft.com/en-us/library/dd347641.aspx
 
+Removing an Environment
+~~~~~~~~~~~~~~~~~~~~~~~
+
+Removing a virtual environment is simply done by deactivating it and deleting the
+environment folder with all its contents::
+
+    (ENV)$ deactivate
+    $ rm -r /path/to/ENV
+
 The :option:`--system-site-packages` Option
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 If you build with ``virtualenv --system-site-packages ENV``, your virtual
 environment will inherit packages from ``/usr/lib/python2.7/site-packages``
 (or wherever your global site-packages directory is).
 
 This can be used if you have control over the global site-packages directory,
@@ -240,10 +249,8 @@ pip's standard algorithm for selecting t
 the latest compatible wheel.
 
 As well as the extra directories, the search order includes:
 
 #. The ``virtualenv_support`` directory relative to virtualenv.py
 #. The directory where virtualenv.py is located.
 #. The current directory.
 
-If no satisfactory local distributions are found, virtualenv will
-fail. Virtualenv will never download packages.
--- a/python/virtualenv/setup.cfg
+++ b/python/virtualenv/setup.cfg
@@ -1,5 +1,8 @@
+[wheel]
+universal = 1
+
 [egg_info]
-tag_build = 
 tag_svn_revision = 0
 tag_date = 0
+tag_build = 
 
--- a/python/virtualenv/setup.py
+++ b/python/virtualenv/setup.py
@@ -10,28 +10,27 @@ try:
     from setuptools import setup
     from setuptools.command.test import test as TestCommand
 
     class PyTest(TestCommand):
         user_options = [('pytest-args=', 'a', "Arguments to pass to py.test")]
 
         def initialize_options(self):
             TestCommand.initialize_options(self)
-            self.pytest_args = None
+            self.pytest_args = []
 
         def finalize_options(self):
             TestCommand.finalize_options(self)
-            self.test_args = []
-            self.test_suite = True
+            #self.test_args = []
+            #self.test_suite = True
 
         def run_tests(self):
             # import here, because outside the eggs aren't loaded
             import pytest
-            errno = pytest.main(self.pytest_args)
-            sys.exit(errno)
+            sys.exit(pytest.main(self.pytest_args))
 
     setup_params = {
         'entry_points': {
             'console_scripts': [
                 'virtualenv=virtualenv:main',
                 'virtualenv-%s.%s=virtualenv:main' % sys.version_info[:2]
             ],
         },
@@ -56,17 +55,34 @@ def read_file(*paths):
     here = os.path.dirname(os.path.abspath(__file__))
     with open(os.path.join(here, *paths)) as f:
         return f.read()
 
 # Get long_description from index.rst:
 long_description = read_file('docs', 'index.rst')
 long_description = long_description.strip().split('split here', 1)[0]
 # Add release history
-long_description += "\n\n" + read_file('docs', 'changes.rst')
+changes = read_file('docs', 'changes.rst')
+# Only report last two releases for brevity
+releases_found = 0
+change_lines = []
+for line in changes.splitlines():
+    change_lines.append(line)
+    if line.startswith('--------------'):
+        releases_found += 1
+    if releases_found > 2:
+        break
+
+changes = '\n'.join(change_lines[:-2]) + '\n'
+changes += '`Full Changelog <https://virtualenv.pypa.io/en/latest/changes.html>`_.'
+# Replace issue/pull directives
+changes = re.sub(r':pull:`(\d+)`', r'PR #\1', changes)
+changes = re.sub(r':issue:`(\d+)`', r'#\1', changes)
+
+long_description += '\n\n' + changes
 
 
 def get_version():
     version_file = read_file('virtualenv.py')
     version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]",
                               version_file, re.M)
     if version_match:
         return version_match.group(1)
@@ -92,16 +108,18 @@ setup(
         'Intended Audience :: Developers',
         'License :: OSI Approved :: MIT License',
         'Programming Language :: Python :: 2',
         'Programming Language :: Python :: 2.6',
         'Programming Language :: Python :: 2.7',
         'Programming Language :: Python :: 3',
         'Programming Language :: Python :: 3.1',
         'Programming Language :: Python :: 3.2',
+        'Programming Language :: Python :: 3.3',
+        'Programming Language :: Python :: 3.4',
     ],
     keywords='setuptools deployment installation distutils',
     author='Ian Bicking',
     author_email='ianb@colorstudy.com',
     maintainer='Jannis Leidel, Carl Meyer and Brian Rosner',
     maintainer_email='python-virtualenv@groups.google.com',
     url='https://virtualenv.pypa.io/',
     license='MIT',
new file mode 100644
new file mode 100755
--- /dev/null
+++ b/python/virtualenv/tests/test_activate.sh
@@ -0,0 +1,96 @@
+#!/bin/sh
+
+set -u
+
+ROOT="$(dirname $0)/.."
+VIRTUALENV="${ROOT}/virtualenv.py"
+TESTENV="/tmp/test_virtualenv_activate.venv"
+
+rm -rf ${TESTENV}
+
+echo "$0: Creating virtualenv ${TESTENV}..." 1>&2
+
+${VIRTUALENV} ${TESTENV} | tee ${ROOT}/tests/test_activate_output.actual
+if ! diff ${ROOT}/tests/test_activate_output.expected ${ROOT}/tests/test_activate_output.actual; then
+    echo "$0: Failed to get expected output from ${VIRTUALENV}!" 1>&2
+    exit 1
+fi
+
+echo "$0: Created virtualenv ${TESTENV}." 1>&2
+
+echo "$0: Activating ${TESTENV}..." 1>&2
+. ${TESTENV}/bin/activate
+echo "$0: Activated ${TESTENV}." 1>&2
+
+echo "$0: Checking value of \$VIRTUAL_ENV..." 1>&2
+
+if [ "$VIRTUAL_ENV" != "${TESTENV}" ]; then
+    echo "$0: Expected \$VIRTUAL_ENV to be set to \"${TESTENV}\"; actual value: \"${VIRTUAL_ENV}\"!" 1>&2
+    exit 2
+fi
+
+echo "$0: \$VIRTUAL_ENV = \"${VIRTUAL_ENV}\" -- OK." 1>&2
+
+echo "$0: Checking output of \$(which python)..." 1>&2
+
+if [ "$(which python)" != "${TESTENV}/bin/python" ]; then
+    echo "$0: Expected \$(which python) to return \"${TESTENV}/bin/python\"; actual value: \"$(which python)\"!" 1>&2
+    exit 3
+fi
+
+echo "$0: Output of \$(which python) is OK." 1>&2
+
+echo "$0: Checking output of \$(which pip)..." 1>&2
+
+if [ "$(which pip)" != "${TESTENV}/bin/pip" ]; then
+    echo "$0: Expected \$(which pip) to return \"${TESTENV}/bin/pip\"; actual value: \"$(which pip)\"!" 1>&2
+    exit 4
+fi
+
+echo "$0: Output of \$(which pip) is OK." 1>&2
+
+echo "$0: Checking output of \$(which easy_install)..." 1>&2
+
+if [ "$(which easy_install)" != "${TESTENV}/bin/easy_install" ]; then
+    echo "$0: Expected \$(which easy_install) to return \"${TESTENV}/bin/easy_install\"; actual value: \"$(which easy_install)\"!" 1>&2
+    exit 5
+fi
+
+echo "$0: Output of \$(which easy_install) is OK." 1>&2
+
+echo "$0: Executing a simple Python program..." 1>&2
+
+TESTENV=${TESTENV} python <<__END__
+import os, sys
+
+expected_site_packages = os.path.join(os.environ['TESTENV'], 'lib','python%s' % sys.version[:3], 'site-packages')
+site_packages = os.path.join(os.environ['VIRTUAL_ENV'], 'lib', 'python%s' % sys.version[:3], 'site-packages')
+
+assert site_packages == expected_site_packages, 'site_packages did not have expected value; actual value: %r' % site_packages
+
+open(os.path.join(site_packages, 'pydoc_test.py'), 'w').write('"""This is pydoc_test.py"""\n')
+__END__
+
+if [ $? -ne 0 ]; then
+    echo "$0: Python script failed!" 1>&2
+    exit 6
+fi
+
+echo "$0: Execution of a simple Python program -- OK." 1>&2
+
+echo "$0: Testing pydoc..." 1>&2
+
+if ! PAGER=cat pydoc pydoc_test | grep 'This is pydoc_test.py' > /dev/null; then
+    echo "$0: pydoc test failed!" 1>&2
+    exit 7
+fi
+
+echo "$0: pydoc is OK." 1>&2
+
+echo "$0: Deactivating ${TESTENV}..." 1>&2
+deactivate
+echo "$0: Deactivated ${TESTENV}." 1>&2
+echo "$0: OK!" 1>&2
+
+rm -rf ${TESTENV}
+
new file mode 100644
--- /dev/null
+++ b/python/virtualenv/tests/test_activate_output.expected
@@ -0,0 +1,2 @@
+New python executable in /tmp/test_virtualenv_activate.venv/bin/python
+Installing setuptools, pip, wheel...done.
new file mode 100644
--- /dev/null
+++ b/python/virtualenv/tests/test_virtualenv.py
@@ -0,0 +1,139 @@
+import virtualenv
+import optparse
+import os
+import shutil
+import sys
+import tempfile
+import pytest
+import platform  # noqa
+
+from mock import patch, Mock
+
+
+def test_version():
+    """Should have a version string"""
+    assert virtualenv.virtualenv_version, "Should have version"
+
+
+@patch('os.path.exists')
+def test_resolve_interpreter_with_absolute_path(mock_exists):
+    """Should return absolute path if given and exists"""
+    mock_exists.return_value = True
+    virtualenv.is_executable = Mock(return_value=True)
+    test_abs_path = os.path.abspath("/usr/bin/python53")
+
+    exe = virtualenv.resolve_interpreter(test_abs_path)
+
+    assert exe == test_abs_path, "Absolute path should return as is"
+    mock_exists.assert_called_with(test_abs_path)
+    virtualenv.is_executable.assert_called_with(test_abs_path)
+
+
+@patch('os.path.exists')
+def test_resolve_interpreter_with_nonexistent_interpreter(mock_exists):
+    """Should SystemExit with an nonexistent python interpreter path"""
+    mock_exists.return_value = False
+
+    with pytest.raises(SystemExit):
+        virtualenv.resolve_interpreter("/usr/bin/python53")
+
+    mock_exists.assert_called_with("/usr/bin/python53")
+
+
+@patch('os.path.exists')
+def test_resolve_interpreter_with_invalid_interpreter(mock_exists):
+    """Should exit when with absolute path if not exists"""
+    mock_exists.return_value = True
+    virtualenv.is_executable = Mock(return_value=False)
+    invalid = os.path.abspath("/usr/bin/pyt_hon53")
+
+    with pytest.raises(SystemExit):
+        virtualenv.resolve_interpreter(invalid)
+
+    mock_exists.assert_called_with(invalid)
+    virtualenv.is_executable.assert_called_with(invalid)
+
+
+def test_activate_after_future_statements():
+    """Should insert activation line after last future statement"""
+    script = [
+        '#!/usr/bin/env python',
+        'from __future__ import with_statement',
+        'from __future__ import print_function',
+        'print("Hello, world!")'
+    ]
+    assert virtualenv.relative_script(script) == [
+        '#!/usr/bin/env python',
+        'from __future__ import with_statement',
+        'from __future__ import print_function',
+        '',
+        "import os; activate_this=os.path.join(os.path.dirname(os.path.realpath(__file__)), 'activate_this.py'); exec(compile(open(activate_this).read(), activate_this, 'exec'), dict(__file__=activate_this)); del os, activate_this",
+        '',
+        'print("Hello, world!")'
+    ]
+
+
+def test_cop_update_defaults_with_store_false():
+    """store_false options need reverted logic"""
+    class MyConfigOptionParser(virtualenv.ConfigOptionParser):
+        def __init__(self, *args, **kwargs):
+            self.config = virtualenv.ConfigParser.RawConfigParser()
+            self.files = []
+            optparse.OptionParser.__init__(self, *args, **kwargs)
+
+        def get_environ_vars(self, prefix='VIRTUALENV_'):
+            yield ("no_site_packages", "1")
+
+    cop = MyConfigOptionParser()
+    cop.add_option(
+        '--no-site-packages',
+        dest='system_site_packages',
+        action='store_false',
+        help="Don't give access to the global site-packages dir to the "
+             "virtual environment (default)")
+
+    defaults = {}
+    cop.update_defaults(defaults)
+    assert defaults == {'system_site_packages': 0}
+
+def test_install_python_bin():
+    """Should create the right python executables and links"""
+    tmp_virtualenv = tempfile.mkdtemp()
+    try:
+        home_dir, lib_dir, inc_dir, bin_dir = \
+                                virtualenv.path_locations(tmp_virtualenv)
+        virtualenv.install_python(home_dir, lib_dir, inc_dir, bin_dir, False,
+                                  False)
+
+        if virtualenv.is_win:
+            required_executables = [ 'python.exe', 'pythonw.exe']
+        else:
+            py_exe_no_version = 'python'
+            py_exe_version_major = 'python%s' % sys.version_info[0]
+            py_exe_version_major_minor = 'python%s.%s' % (
+                sys.version_info[0], sys.version_info[1])
+            required_executables = [ py_exe_no_version, py_exe_version_major,
+                                     py_exe_version_major_minor ]
+
+        for pth in required_executables:
+            assert os.path.exists(os.path.join(bin_dir, pth)), ("%s should "
+                            "exist in bin_dir" % pth)
+    finally:
+        shutil.rmtree(tmp_virtualenv)
+
+
+@pytest.mark.skipif("platform.python_implementation() == 'PyPy'")
+def test_always_copy_option():
+    """Should be no symlinks in directory tree"""
+    tmp_virtualenv = tempfile.mkdtemp()
+    ve_path = os.path.join(tmp_virtualenv, 'venv')
+    try:
+        virtualenv.create_environment(ve_path, symlink=False)
+
+        for root, dirs, files in os.walk(tmp_virtualenv):
+            for f in files + dirs:
+                full_name = os.path.join(root, f)
+                assert not os.path.islink(full_name), "%s should not be a" \
+                    " symlink (to %s)" % (full_name, os.readlink(full_name))
+    finally:
+        shutil.rmtree(tmp_virtualenv)
--- a/python/virtualenv/virtualenv.py
+++ b/python/virtualenv/virtualenv.py
@@ -1,49 +1,56 @@
 #!/usr/bin/env python
-"""Create a "virtual" Python installation
-"""
+"""Create a "virtual" Python installation"""
+
+import os
+import sys
 
-__version__ = "12.0.5"
-virtualenv_version = __version__  # legacy
+# If we are running in a new interpreter to create a virtualenv,
+# we do NOT want paths from our existing location interfering with anything,
+# So we remove this file's directory from sys.path - most likely to be
+# the previous interpreter's site-packages. Solves #705, #763, #779
+if os.environ.get('VIRTUALENV_INTERPRETER_RUNNING'):
+    for path in sys.path[:]:
+        if os.path.realpath(os.path.dirname(__file__)) == os.path.realpath(path):
+            sys.path.remove(path)
 
 import base64
-import sys
-import os
 import codecs
 import optparse
 import re
 import shutil
 import logging
-import tempfile
 import zlib
 import errno
 import glob
 import distutils.sysconfig
-from distutils.util import strtobool
 import struct
 import subprocess
-import tarfile
+from distutils.util import strtobool
+from os.path import join
+
+try:
+    import ConfigParser
+except ImportError:
+    import configparser as ConfigParser
+
+__version__ = "14.0.1"
+virtualenv_version = __version__  # legacy
 
 if sys.version_info < (2, 6):
     print('ERROR: %s' % sys.exc_info()[1])
     print('ERROR: this script requires Python 2.6 or greater.')
     sys.exit(101)
 
 try:
     basestring
 except NameError:
     basestring = str
 
-try:
-    import ConfigParser
-except ImportError:
-    import configparser as ConfigParser
-
-join = os.path.join
 py_version = 'python%s.%s' % (sys.version_info[0], sys.version_info[1])
 
 is_jython = sys.platform.startswith('java')
 is_pypy = hasattr(sys, 'pypy_version_info')
 is_win = (sys.platform == 'win32')
 is_cygwin = (sys.platform == 'cygwin')
 is_darwin = (sys.platform == 'darwin')
 abiflags = getattr(sys, 'abiflags', '')
@@ -71,17 +78,17 @@ else:
     try:
         import winreg
     except ImportError:
         import _winreg as winreg
 
     def get_installed_pythons():
         try:
             python_core = winreg.CreateKey(winreg.HKEY_LOCAL_MACHINE,
-                    "Software\\Python\\PythonCore")
+                                           "Software\\Python\\PythonCore")
         except WindowsError:
             # No registered Python installations
             return {}
         i = 0
         versions = []
         while True:
             try:
                 versions.append(winreg.EnumKey(python_core, i))
@@ -118,191 +125,45 @@ majver, minver = sys.version_info[:2]
 if majver == 2:
     if minver >= 6:
         REQUIRED_MODULES.extend(['warnings', 'linecache', '_abcoll', 'abc'])
     if minver >= 7:
         REQUIRED_MODULES.extend(['_weakrefset'])
 elif majver == 3:
     # Some extra modules are needed for Python 3, but different ones
     # for different versions.
-    REQUIRED_MODULES.extend(['_abcoll', 'warnings', 'linecache', 'abc', 'io',
-                             '_weakrefset', 'copyreg', 'tempfile', 'random',
-                             '__future__', 'collections', 'keyword', 'tarfile',
-                             'shutil', 'struct', 'copy', 'tokenize', 'token',
-                             'functools', 'heapq', 'bisect', 'weakref',
-                             'reprlib'])
+    REQUIRED_MODULES.extend([
+    	'_abcoll', 'warnings', 'linecache', 'abc', 'io', '_weakrefset',
+    	'copyreg', 'tempfile', 'random', '__future__', 'collections',
+    	'keyword', 'tarfile', 'shutil', 'struct', 'copy', 'tokenize',
+    	'token', 'functools', 'heapq', 'bisect', 'weakref', 'reprlib'
+    ])
     if minver >= 2:
         REQUIRED_FILES[-1] = 'config-%s' % majver
     if minver >= 3:
         import sysconfig
         platdir = sysconfig.get_config_var('PLATDIR')
         REQUIRED_FILES.append(platdir)
-        # The whole list of 3.3 modules is reproduced below - the current
-        # uncommented ones are required for 3.3 as of now, but more may be
-        # added as 3.3 development continues.
         REQUIRED_MODULES.extend([
-            #"aifc",
-            #"antigravity",
-            #"argparse",
-            #"ast",
-            #"asynchat",
-            #"asyncore",
-            "base64",
-            #"bdb",
-            #"binhex",
-            #"bisect",
-            #"calendar",
-            #"cgi",
-            #"cgitb",
-            #"chunk",
-            #"cmd",
-            #"codeop",
-            #"code",
-            #"colorsys",
-            #"_compat_pickle",
-            #"compileall",
-            #"concurrent",
-            #"configparser",
-            #"contextlib",
-            #"cProfile",
-            #"crypt",
-            #"csv",
-            #"ctypes",
-            #"curses",
-            #"datetime",
-            #"dbm",
-            #"decimal",
-            #"difflib",
-            #"dis",
-            #"doctest",
-            #"dummy_threading",
-            "_dummy_thread",
-            #"email",
-            #"filecmp",
-            #"fileinput",
-            #"formatter",
-            #"fractions",
-            #"ftplib",
-            #"functools",
-            #"getopt",
-            #"getpass",
-            #"gettext",
-            #"glob",
-            #"gzip",
-            "hashlib",
-            #"heapq",
-            "hmac",
-            #"html",
-            #"http",
-            #"idlelib",
-            #"imaplib",
-            #"imghdr",
-            "imp",
-            "importlib",
-            #"inspect",
-            #"json",
-            #"lib2to3",
-            #"logging",
-            #"macpath",
-            #"macurl2path",
-            #"mailbox",
-            #"mailcap",
-            #"_markupbase",
-            #"mimetypes",
-            #"modulefinder",
-            #"multiprocessing",
-            #"netrc",
-            #"nntplib",
-            #"nturl2path",
-            #"numbers",
-            #"opcode",
-            #"optparse",
-            #"os2emxpath",
-            #"pdb",
-            #"pickle",
-            #"pickletools",
-            #"pipes",
-            #"pkgutil",
-            #"platform",
-            #"plat-linux2",
-            #"plistlib",
-            #"poplib",
-            #"pprint",
-            #"profile",
-            #"pstats",
-            #"pty",
-            #"pyclbr",
-            #"py_compile",
-            #"pydoc_data",
-            #"pydoc",
-            #"_pyio",
-            #"queue",
-            #"quopri",
-            #"reprlib",
-            "rlcompleter",
-            #"runpy",
-            #"sched",
-            #"shelve",
-            #"shlex",
-            #"smtpd",
-            #"smtplib",
-            #"sndhdr",
-            #"socket",
-            #"socketserver",
-            #"sqlite3",
-            #"ssl",
-            #"stringprep",
-            #"string",
-            #"_strptime",
-            #"subprocess",
-            #"sunau",
-            #"symbol",
-            #"symtable",
-            #"sysconfig",
-            #"tabnanny",
-            #"telnetlib",
-            #"test",
-            #"textwrap",
-            #"this",
-            #"_threading_local",
-            #"threading",
-            #"timeit",
-            #"tkinter",
-            #"tokenize",
-            #"token",
-            #"traceback",
-            #"trace",
-            #"tty",
-            #"turtledemo",
-            #"turtle",
-            #"unittest",
-            #"urllib",
-            #"uuid",
-            #"uu",
-            #"wave",
-            #"weakref",
-            #"webbrowser",
-            #"wsgiref",
-            #"xdrlib",
-            #"xml",
-            #"xmlrpc",
-            #"zipfile",
+        	'base64', '_dummy_thread', 'hashlib', 'hmac',
+        	'imp', 'importlib', 'rlcompleter'
         ])
     if minver >= 4:
         REQUIRED_MODULES.extend([
             'operator',
             '_collections_abc',
             '_bootlocale',
         ])
 
 if is_pypy:
     # these are needed to correctly display the exceptions that may happen
     # during the bootstrap
     REQUIRED_MODULES.extend(['traceback', 'linecache'])
 
+
 class Logger(object):
 
     """
     Logging object for use in command-line script.  Allows ranges of
     levels, to avoid some redundancy of displayed information.
     """
 
     DEBUG = logging.DEBUG
@@ -317,26 +178,32 @@ class Logger(object):
     def __init__(self, consumers):
         self.consumers = consumers
         self.indent = 0
         self.in_progress = None
         self.in_progress_hanging = False
 
     def debug(self, msg, *args, **kw):
         self.log(self.DEBUG, msg, *args, **kw)
+
     def info(self, msg, *args, **kw):
         self.log(self.INFO, msg, *args, **kw)
+
     def notify(self, msg, *args, **kw):
         self.log(self.NOTIFY, msg, *args, **kw)
+
     def warn(self, msg, *args, **kw):
         self.log(self.WARN, msg, *args, **kw)
+
     def error(self, msg, *args, **kw):
         self.log(self.ERROR, msg, *args, **kw)
+
     def fatal(self, msg, *args, **kw):
         self.log(self.FATAL, msg, *args, **kw)
+
     def log(self, level, msg, *args, **kw):
         if args:
             if kw:
                 raise TypeError(
                     "You may give positional or keyword arguments, not both")
         args = args or kw
         rendered = None
         for consumer_level, consumer in self.consumers:
@@ -521,26 +388,26 @@ def _find_file(filename, dirs):
     for dir in reversed(dirs):
         files = glob.glob(os.path.join(dir, filename))
         if files and os.path.isfile(files[0]):
             return True, files[0]
     return False, filename
 
 def file_search_dirs():
     here = os.path.dirname(os.path.abspath(__file__))
-    dirs = ['.', here,
-            join(here, 'virtualenv_support')]
+    dirs = [here, join(here, 'virtualenv_support')]
     if os.path.splitext(os.path.dirname(__file__))[0] != 'virtualenv':
         # Probably some boot script; just in case virtualenv is installed...
         try:
             import virtualenv
         except ImportError:
             pass
         else:
-            dirs.append(os.path.join(os.path.dirname(virtualenv.__file__), 'virtualenv_support'))
+            dirs.append(os.path.join(
+                os.path.dirname(virtualenv.__file__), 'virtualenv_support'))
     return [d for d in dirs if os.path.isdir(d)]
 
 
 class UpdatingDefaultsHelpFormatter(optparse.IndentedHelpFormatter):
     """
     Custom help formatter for use in ConfigOptionParser that updates
     the defaults before expanding them, allowing them to show up correctly
     in the help listing
@@ -709,41 +576,55 @@ def main():
         action='store_true',
         help='Make an EXISTING virtualenv environment relocatable. '
              'This fixes up scripts and makes all .pth files relative.')
 
     parser.add_option(
         '--no-setuptools',
         dest='no_setuptools',
         action='store_true',
-        help='Do not install setuptools (or pip) in the new virtualenv.')
+        help='Do not install setuptools in the new virtualenv.')
 
     parser.add_option(
         '--no-pip',
         dest='no_pip',
         action='store_true',
         help='Do not install pip in the new virtualenv.')
 
+    parser.add_option(
+        '--no-wheel',
+        dest='no_wheel',
+        action='store_true',
+        help='Do not install wheel in the new virtualenv.')
+
     default_search_dirs = file_search_dirs()
     parser.add_option(
         '--extra-search-dir',
         dest="search_dirs",
         action="append",
         metavar='DIR',
         default=default_search_dirs,
         help="Directory to look for setuptools/pip distributions in. "
               "This option can be used multiple times.")
 
     parser.add_option(
-        '--never-download',
-        dest="never_download",
+        "--download",
+        dest="download",
+        default=True,
         action="store_true",
-        default=True,
-        help="DEPRECATED. Retained only for backward compatibility. This option has no effect. "
-              "Virtualenv never downloads pip or setuptools.")
+        help="Download preinstalled packages from PyPI.",
+    )
+
+    parser.add_option(
+        "--no-download",
+        '--never-download',
+        dest="download",
+        action="store_false",
+        help="Do not download preinstalled packages from PyPI.",
+    )
 
     parser.add_option(
         '--prompt',
         dest='prompt',
         help='Provides an alternative prompt prefix for this environment.')
 
     parser.add_option(
         '--setuptools',
@@ -804,29 +685,26 @@ def main():
     if 'PYTHONHOME' in os.environ:
         logger.warn('PYTHONHOME is set.  You *must* activate the virtualenv before using it')
         del os.environ['PYTHONHOME']
 
     if options.relocatable:
         make_environment_relocatable(home_dir)
         return
 
-    if not options.never_download:
-        logger.warn('The --never-download option is for backward compatibility only.')
-        logger.warn('Setting it to false is no longer supported, and will be ignored.')
-
     create_environment(home_dir,
                        site_packages=options.system_site_packages,
                        clear=options.clear,
                        unzip_setuptools=options.unzip_setuptools,
                        prompt=options.prompt,
                        search_dirs=options.search_dirs,
-                       never_download=True,
+                       download=options.download,
                        no_setuptools=options.no_setuptools,
                        no_pip=options.no_pip,
+                       no_wheel=options.no_wheel,
                        symlink=options.symlink)
     if 'after_install' in globals():
         after_install(options, home_dir)
 
 def call_subprocess(cmd, show_stdout=True,
                     filter_stdout=None, cwd=None,
                     raise_on_returncode=True, extra_env=None,
                     remove_from_env=None):
@@ -932,48 +810,69 @@ def find_wheels(projects, search_dirs):
                 wheels.append(os.path.abspath(files[0]))
                 break
         else:
             # We're out of luck, so quit with a suitable error
             logger.fatal('Cannot find a wheel for %s' % (project,))
 
     return wheels
 
-def install_wheel(project_names, py_executable, search_dirs=None):
+def install_wheel(project_names, py_executable, search_dirs=None,
+                  download=False):
     if search_dirs is None:
         search_dirs = file_search_dirs()
 
     wheels = find_wheels(['setuptools', 'pip'], search_dirs)
     pythonpath = os.pathsep.join(wheels)
-    findlinks = ' '.join(search_dirs)
+
+    # PIP_FIND_LINKS uses space as the path separator and thus cannot have paths
+    # with spaces in them. Convert any of those to local file:// URL form.
+    try:
+        from urlparse import urljoin
+        from urllib import pathname2url
+    except ImportError:
+        from urllib.parse import urljoin
+        from urllib.request import pathname2url
+    def space_path2url(p):
+        if ' ' not in p:
+            return p
+        return urljoin('file:', pathname2url(os.path.abspath(p)))
+    findlinks = ' '.join(space_path2url(d) for d in search_dirs)
 
     cmd = [
         py_executable, '-c',
         'import sys, pip; sys.exit(pip.main(["install", "--ignore-installed"] + sys.argv[1:]))',
     ] + project_names
     logger.start_progress('Installing %s...' % (', '.join(project_names)))
     logger.indent += 2
+
+    env = {
+        "PYTHONPATH": pythonpath,
+        "JYTHONPATH": pythonpath,  # for Jython < 3.x
+        "PIP_FIND_LINKS": findlinks,
+        "PIP_USE_WHEEL": "1",
+        "PIP_ONLY_BINARY": ":all:",
+        "PIP_PRE": "1",
+        "PIP_USER": "0",
+    }
+
+    if not download:
+        env["PIP_NO_INDEX"] = "1"
+
     try:
-        call_subprocess(cmd, show_stdout=False,
-            extra_env = {
-                'PYTHONPATH': pythonpath,
-                'PIP_FIND_LINKS': findlinks,
-                'PIP_USE_WHEEL': '1',
-                'PIP_PRE': '1',
-                'PIP_NO_INDEX': '1'
-            }
-        )
+        call_subprocess(cmd, show_stdout=False, extra_env=env)
     finally:
         logger.indent -= 2
         logger.end_progress()
 
 def create_environment(home_dir, site_packages=False, clear=False,
                        unzip_setuptools=False,
-                       prompt=None, search_dirs=None, never_download=False,
-                       no_setuptools=False, no_pip=False, symlink=True):
+                       prompt=None, search_dirs=None, download=False,
+                       no_setuptools=False, no_pip=False, no_wheel=False,
+                       symlink=True):
     """
     Creates a new environment in ``home_dir``.
 
     If ``site_packages`` is true, then the global ``site-packages/``
     directory will be on the path.
 
     If ``clear`` is true (default False) then the environment will
     first be cleared.
@@ -981,30 +880,46 @@ def create_environment(home_dir, site_pa
     home_dir, lib_dir, inc_dir, bin_dir = path_locations(home_dir)
 
     py_executable = os.path.abspath(install_python(
         home_dir, lib_dir, inc_dir, bin_dir,
         site_packages=site_packages, clear=clear, symlink=symlink))
 
     install_distutils(home_dir)
 
+    to_install = []
+
     if not no_setuptools:
-        to_install = ['setuptools']
-        if not no_pip:
-            to_install.append('pip')
-        install_wheel(to_install, py_executable, search_dirs)
+        to_install.append('setuptools')
+
+    if not no_pip:
+        to_install.append('pip')
+
+    if not no_wheel:
+        to_install.append('wheel')
+
+    if to_install:
+        install_wheel(
+            to_install,
+            py_executable,
+            search_dirs,
+            download=download,
+        )
 
     install_activate(home_dir, bin_dir, prompt)
 
+    install_python_config(home_dir, bin_dir, prompt)
+
 def is_executable_file(fpath):
     return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
 
 def path_locations(home_dir):
     """Return the path locations for the environment (where libraries are,
     where scripts go, etc)"""
+    home_dir = os.path.abspath(home_dir)
     # XXX: We'd use distutils.sysconfig.get_python_inc/lib but its
     # prefix arg is broken: http://bugs.python.org/issue3386
     if is_win:
         # Windows has lots of problems with executables with spaces in
         # the name; this function will remove them (using the ~1
         # format):
         mkdir(home_dir)
         if ' ' in home_dir:
@@ -1031,27 +946,17 @@ def path_locations(home_dir):
         inc_dir = join(home_dir, 'Include')
         bin_dir = join(home_dir, 'bin')
     elif is_pypy:
         lib_dir = home_dir
         inc_dir = join(home_dir, 'include')
         bin_dir = join(home_dir, 'bin')
     elif not is_win:
         lib_dir = join(home_dir, 'lib', py_version)
-        multiarch_exec = '/usr/bin/multiarch-platform'
-        if is_executable_file(multiarch_exec):
-            # In Mageia (2) and Mandriva distros the include dir must be like:
-            # virtualenv/include/multiarch-x86_64-linux/python2.7
-            # instead of being virtualenv/include/python2.7
-            p = subprocess.Popen(multiarch_exec, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-            stdout, stderr = p.communicate()
-            # stdout.strip is needed to remove newline character
-            inc_dir = join(home_dir, 'include', stdout.strip(), py_version + abiflags)
-        else:
-            inc_dir = join(home_dir, 'include', py_version + abiflags)
+        inc_dir = join(home_dir, 'include', py_version + abiflags)
         bin_dir = join(home_dir, 'bin')
     return home_dir, lib_dir, inc_dir, bin_dir
 
 
 def change_prefix(filename, dst_prefix):
     prefixes = [sys.prefix]
 
     if is_darwin:
@@ -1080,55 +985,44 @@ def change_prefix(filename, dst_prefix):
                 assert relpath[0] == os.sep
                 relpath = relpath[1:]
             return join(dst_prefix, relpath)
     assert False, "Filename %s does not start with any of these prefixes: %s" % \
         (filename, prefixes)
 
 def copy_required_modules(dst_prefix, symlink):
     import imp
-    # If we are running under -p, we need to remove the current
-    # directory from sys.path temporarily here, so that we
-    # definitely get the modules from the site directory of
-    # the interpreter we are running under, not the one
-    # virtualenv.py is installed under (which might lead to py2/py3
-    # incompatibility issues)
-    _prev_sys_path = sys.path
-    if os.environ.get('VIRTUALENV_INTERPRETER_RUNNING'):
-        sys.path = sys.path[1:]
-    try:
-        for modname in REQUIRED_MODULES:
-            if modname in sys.builtin_module_names:
-                logger.info("Ignoring built-in bootstrap module: %s" % modname)
-                continue
-            try:
-                f, filename, _ = imp.find_module(modname)
-            except ImportError:
-                logger.info("Cannot import bootstrap module: %s" % modname)
+
+    for modname in REQUIRED_MODULES:
+        if modname in sys.builtin_module_names:
+            logger.info("Ignoring built-in bootstrap module: %s" % modname)
+            continue
+        try:
+            f, filename, _ = imp.find_module(modname)
+        except ImportError:
+            logger.info("Cannot import bootstrap module: %s" % modname)
+        else:
+            if f is not None:
+                f.close()
+            # special-case custom readline.so on OS X, but not for pypy:
+            if modname == 'readline' and sys.platform == 'darwin' and not (
+                    is_pypy or filename.endswith(join('lib-dynload', 'readline.so'))):
+                dst_filename = join(dst_prefix, 'lib', 'python%s' % sys.version[:3], 'readline.so')
+            elif modname == 'readline' and sys.platform == 'win32':
+                # special-case for Windows, where readline is not a
+                # standard module, though it may have been installed in
+                # site-packages by a third-party package
+                pass
             else:
-                if f is not None:
-                    f.close()
-                # special-case custom readline.so on OS X, but not for pypy:
-                if modname == 'readline' and sys.platform == 'darwin' and not (
-                        is_pypy or filename.endswith(join('lib-dynload', 'readline.so'))):
-                    dst_filename = join(dst_prefix, 'lib', 'python%s' % sys.version[:3], 'readline.so')
-                elif modname == 'readline' and sys.platform == 'win32':
-                    # special-case for Windows, where readline is not a
-                    # standard module, though it may have been installed in
-                    # site-packages by a third-party package
-                    pass
-                else:
-                    dst_filename = change_prefix(filename, dst_prefix)
-                copyfile(filename, dst_filename, symlink)
-                if filename.endswith('.pyc'):
-                    pyfile = filename[:-1]
-                    if os.path.exists(pyfile):
-                        copyfile(pyfile, dst_filename[:-1], symlink)
-    finally:
-        sys.path = _prev_sys_path
+                dst_filename = change_prefix(filename, dst_prefix)
+            copyfile(filename, dst_filename, symlink)
+            if filename.endswith('.pyc'):
+                pyfile = filename[:-1]
+                if os.path.exists(pyfile):
+                    copyfile(pyfile, dst_filename[:-1], symlink)
 
 
 def subst_path(prefix_path, prefix, home_dir):
     prefix_path = os.path.normpath(prefix_path)
     prefix = os.path.normpath(prefix)
     home_dir = os.path.normpath(home_dir)
     if not prefix_path.startswith(prefix):
         logger.warn('Path not in prefix %r %r', prefix_path, prefix)
@@ -1179,17 +1073,17 @@ def install_python(home_dir, lib_dir, in
                     copyfile(join(stdlib_dir, fn), join(lib_dir, fn), symlink)
         # ...and modules
         copy_required_modules(home_dir, symlink)
     finally:
         logger.indent -= 2
     mkdir(join(lib_dir, 'site-packages'))
     import site
     site_filename = site.__file__
-    if site_filename.endswith('.pyc'):
+    if site_filename.endswith('.pyc') or site_filename.endswith('.pyo'):
         site_filename = site_filename[:-1]
     elif site_filename.endswith('$py.class'):
         site_filename = site_filename.replace('$py.class', '.py')
     site_filename_dst = change_prefix(site_filename, home_dir)
     site_dir = os.path.dirname(site_filename_dst)
     writefile(site_filename_dst, SITE_PY)
     writefile(join(site_dir, 'orig-prefix.txt'), prefix)
     site_packages_filename = join(site_dir, 'no-global-site-packages.txt')
@@ -1474,17 +1368,16 @@ def install_python(home_dir, lib_dir, in
         if os.path.exists(site_packages_filename):
             logger.info('Deleting %s' % site_packages_filename)
             os.unlink(site_packages_filename)
 
     return py_executable
 
 
 def install_activate(home_dir, bin_dir, prompt=None):
-    home_dir = os.path.abspath(home_dir)
     if is_win or is_jython and os._name == 'nt':
         files = {
             'activate.bat': ACTIVATE_BAT,
             'deactivate.bat': DEACTIVATE_BAT,
             'activate.ps1': ACTIVATE_PS,
         }
 
         # MSYS needs paths of the form /c/path/to/file
@@ -1502,27 +1395,40 @@ def install_activate(home_dir, bin_dir, 
         # suppling activate.fish in addition to, not instead of, the
         # bash script support.
         files['activate.fish'] = ACTIVATE_FISH
 
         # same for csh/tcsh support...
         files['activate.csh'] = ACTIVATE_CSH
 
     files['activate_this.py'] = ACTIVATE_THIS
+
+    install_files(home_dir, bin_dir, prompt, files)
+
+def install_files(home_dir, bin_dir, prompt, files):
     if hasattr(home_dir, 'decode'):
         home_dir = home_dir.decode(sys.getfilesystemencoding())
     vname = os.path.basename(home_dir)
     for name, content in files.items():
         content = content.replace('__VIRTUAL_PROMPT__', prompt or '')
         content = content.replace('__VIRTUAL_WINPROMPT__', prompt or '(%s)' % vname)
         content = content.replace('__VIRTUAL_ENV__', home_dir)
         content = content.replace('__VIRTUAL_NAME__', vname)
         content = content.replace('__BIN_NAME__', os.path.basename(bin_dir))
         writefile(os.path.join(bin_dir, name), content)
 
+def install_python_config(home_dir, bin_dir, prompt=None):
+    if sys.platform == 'win32' or is_jython and os._name == 'nt':
+        files = {}
+    else:
+        files = {'python-config': PYTHON_CONFIG}
+    install_files(home_dir, bin_dir, prompt, files)
+    for name, content in files.items():
+        make_exe(os.path.join(bin_dir, name))
+
 def install_distutils(home_dir):
     distutils_path = change_prefix(distutils.__path__[0], home_dir)
     mkdir(distutils_path)
     ## FIXME: maybe this prefix setting should only be put in place if
     ## there's a local distutils.cfg with a prefix setting?
     home_dir = os.path.abspath(home_dir)
     ## FIXME: this is breaking things, removing for now:
     #distutils_cfg = DISTUTILS_CFG + "\n[install]\nprefix=%s\n" % home_dir
@@ -1550,56 +1456,58 @@ def fix_local_scheme(home_dir, symlink=T
                                                             os.path.join(local_path, subdir_name), symlink)
 
 def fix_lib64(lib_dir, symlink=True):
     """
     Some platforms (particularly Gentoo on x64) put things in lib64/pythonX.Y
     instead of lib/pythonX.Y.  If this is such a platform we'll just create a
     symlink so lib64 points to lib
     """
-    if [p for p in distutils.sysconfig.get_config_vars().values()
-        if isinstance(p, basestring) and 'lib64' in p]:
-        # PyPy's library path scheme is not affected by this.
-        # Return early or we will die on the following assert.
-        if is_pypy:
-            logger.debug('PyPy detected, skipping lib64 symlinking')
-            return
+    # PyPy's library path scheme is not affected by this.
+    # Return early or we will die on the following assert.
+    if is_pypy:
+        logger.debug('PyPy detected, skipping lib64 symlinking')
+        return
+    # Check we have a lib64 library path
+    if not [p for p in distutils.sysconfig.get_config_vars().values()
+            if isinstance(p, basestring) and 'lib64' in p]:
+        return
 
-        logger.debug('This system uses lib64; symlinking lib64 to lib')
+    logger.debug('This system uses lib64; symlinking lib64 to lib')
 
-        assert os.path.basename(lib_dir) == 'python%s' % sys.version[:3], (
-            "Unexpected python lib dir: %r" % lib_dir)
-        lib_parent = os.path.dirname(lib_dir)
-        top_level = os.path.dirname(lib_parent)
-        lib_dir = os.path.join(top_level, 'lib')
-        lib64_link = os.path.join(top_level, 'lib64')
-        assert os.path.basename(lib_parent) == 'lib', (
-            "Unexpected parent dir: %r" % lib_parent)
-        if os.path.lexists(lib64_link):
-            return
-        if symlink:
-            os.symlink('lib', lib64_link)
-        else:
-            copyfile('lib', lib64_link)
+    assert os.path.basename(lib_dir) == 'python%s' % sys.version[:3], (
+        "Unexpected python lib dir: %r" % lib_dir)
+    lib_parent = os.path.dirname(lib_dir)
+    top_level = os.path.dirname(lib_parent)
+    lib_dir = os.path.join(top_level, 'lib')
+    lib64_link = os.path.join(top_level, 'lib64')
+    assert os.path.basename(lib_parent) == 'lib', (
+        "Unexpected parent dir: %r" % lib_parent)
+    if os.path.lexists(lib64_link):
+        return
+    if symlink:
+        os.symlink('lib', lib64_link)
+    else:
+        copyfile('lib', lib64_link)
 
 def resolve_interpreter(exe):
     """
     If the executable given isn't an absolute path, search $PATH for the interpreter
     """
     # If the "executable" is a version number, get the installed executable for
     # that version
     python_versions = get_installed_pythons()
     if exe in python_versions:
         exe = python_versions[exe]
 
     if os.path.abspath(exe) != exe:
         paths = os.environ.get('PATH', '').split(os.pathsep)
         for path in paths:
-            if os.path.exists(os.path.join(path, exe)):
-                exe = os.path.join(path, exe)
+            if os.path.exists(join(path, exe)):
+                exe = join(path, exe)
                 break
     if not os.path.exists(exe):
         logger.fatal('The executable %s (from --python=%s) does not exist' % (exe, exe))
         raise SystemExit(3)
     if not is_executable(exe):
         logger.fatal('The executable %s (from --python=%s) is not executable' % (exe, exe))
         raise SystemExit(3)
     return exe
@@ -1998,81 +1906,80 @@ MXdeKul0J2Ypp5Suh3s1JySsW1w5UNknGNrbdEpS
 n6kJTcsp4tG42yeT7nQbtdUFwgVJjwDSUYEAC8F0dKOTILrlLO/xC70bnNd0Ha97whQ6UkHJYj5H
 cA/j+zX4tbtTIfGjujOKpj83aHOgXnIQbvYduNXEC4UMm4T21Bs+GHABuCa7v//LR/TvpjHa7oe7
 /Grb6lVvHSD7spj5iplBLRKZxxEYGdCbY9LWWC5hBB2voWno6DJUMzfkC3T8KJsWL9umDQY5szPt
 AVijEPwfucjncQ==
 """)
 
 ##file activate.sh
 ACTIVATE_SH = convert("""
-eJytVVFvokAQfudXTLEPtTlLeo9tvMSmJpq02hSvl7u2wRUG2QR2DSxSe7n/frOACEVNLlceRHa+
-nfl25pvZDswCnoDPQ4QoTRQsENIEPci4CsBMZBq7CAsuLOYqvmYKTTj3YxnBgiXBudGBjUzBZUJI
-BXEqgCvweIyuCjeG4eF2F5x14bcB9KQiQQWrjSddI1/oQIx6SYYeoFjzWIoIhYI1izlbhJjkKO7D
-M/QEmKfO9O7WeRo/zr4P7pyHwWxkwitcgwpQ5Ej96OX+PmiFwLeVjFUOrNYKaq1Nud3nR2n8nI2m
-k9H0friPTGVsUdptaxGrTEfpNVFEskxpXtUkkCkl1UNF9cgLBkx48J4EXyALuBtAwNYIjF5kcmUU
-abMKmMq1ULoiRbgsDEkTSsKSGFCJ6Z8vY/2xYiSacmtyAfCDdCNTVZoVF8vSTQOoEwSnOrngBkws
-MYGMBMg8/bMBLSYKS7pYEXP0PqT+ZmBT0Xuy+Pplj5yn4aM9nk72JD8/Wi+Gr98sD9eWSMOwkapD
-BbUv91XSvmyVkICt2tmXR4tWmrcUCsjWOpw87YidEC8i0gdTSOFhouJUNxR+4NYBG0MftoCTD9F7
-2rTtxG3oPwY1b2HncYwhrlmj6Wq924xtGDWqfdNxap+OYxplEurnMVo9RWks+rH8qKEtx7kZT5zJ
-4H7oOFclrN6uFe+d+nW2aIUsSgs/42EIPuOhXq+jEo3S6tX6w2ilNkDnIpHCWdEQhFgwj9pkk7FN
-l/y5eQvRSIQ5+TrL05lewxWpt/Lbhes5cJF3mLET1MGhcKCF+40tNWnUulxrpojwDo2sObdje3Bz
-N3QeHqf3D7OjEXMVV8LN3ZlvuzoWHqiUcNKHtwNd0IbvPGKYYM31nPKCgkUILw3KL+Y8l7aO1ArS
-Ad37nIU0fCj5NE5gQCuC5sOSu+UdI2NeXg/lFkQIlFpdWVaWZRfvqGiirC9o6liJ9FXGYrSY9mI1
-D/Ncozgn13vJvsznr7DnkJWXsyMH7e42ljdJ+aqNDF1bFnKWFLdj31xtaJYK6EXFgqmV/ymD/ROG
-+n8O9H8f5vsGOWXsL1+1k3g=
+eJytVdtu2kAQffdXDAalSVqK6GMrqhIFCaQEIkyp2qZyFnuIVzVrtLsmIZd/76wvYONAHxI/gHdn
+dvbMnDPjOkwCrmDOQ4RFrDTMEGKFPtxxHYCtolh6CDMuWszTfMU02nA6l9ECZkwFp1Yd1lEMHhMi
+0iBjAVyDzyV6Olxblo/5KTg+gUcL6ImFQg3NOSzXfuRZyV4dJJrdKPQBxYrLSCxQaFgxydksRJV5
+1eA3NB+g8Tjtjt+7z/CHzulYCgVaxgh8DmQAysdHL2SS0mAaWBgmx8manbcbj+7o4tydDsaT790L
+96o76VM4m+J9AR2gSPzNYywdu1HxtjceeL+MpE4cN3tpipVDiX3O/wfm56Q/GvZHl709kDb2CrCN
+pQpvYzoIsuxFULO6JxpRQRQTPz5qYjehH5jw4UEFH+Au4F4AAVshMPojkxctFsasA6LAKCsLRfry
+iBGiRkdwSwhIMPQ2j6RZLBlJMDuqPgL8IBVGsc7MmovbLEzJ0RQIGqbE4AVM3KKCO5Iz883PGow0
+6VqS2JKQo58TQOUXpvxnXaffTEr99LTZ/OX03Wlv7AxGw+ZLNCRJNiV8+trycdUScaayvGgHCHba
+e5h12hVKnXaVS6d9kMTMnANJXXJrbzjdpl8z2NomvQ7YIhI+Kuoj07G4A68ODoZzyB1qOwCaxpS3
+en77s0XTIbVzKTHEFSu1dGE4lO+2rALaju26haXr2lZWh2JKVqXZqJJpo2aLgnfLdc8GQ3fYvey5
+7ufMrdjHG9zbhjAFox2rROuhVt3TWAbWTpvuXmUZ5lJ5JrcUsz8fON2zi557NR5dXk0qwtwVgrkt
+V1AS0b7fVjONQQWFWgfu98ix6r6NiKHCsvfxDY0FFGyBcF0q+bV9cwLbk9kQLAja5FyHS/YXQcUS
+zUiIBQs5U+l3wsDn+p2iaS6R+WsDVaJV9Ch0IhRej47KkSwrdd98kJZrmjECmossjt34ZqfifZOx
+9wYj75Xj7jWj7qUxR1z9A7WjbI8=
 """)
 
 ##file activate.fish
 ACTIVATE_FISH = convert("""
-eJydVW2P2jgQ/s6vmAZQoVpA9/WkqqJaTou0u6x2uZVOVWWZZEKsS+yc7UDpr+84bziQbauLxEvs
-eXnsZ56ZIWwTYSAWKUJWGAs7hMJgBEdhEwiMKnSIsBNywUMrDtziPBYmCeBDrFUG7v8HmCTW5n8u
-Fu7NJJim81Bl08EQTqqAkEupLOhCgrAQCY2hTU+DQVxIiqgkRNiEBphFEKy+kd1BaFvwFOUBuIxA
-oy20BKtAKp3xFMo0QNtCK5mhtMEA6BmSpUELKo38TThwLfguRVNaiRgs0llnEoIR29zfstf18/bv
-5T17Wm7vAiiN3ONCzfbfwC3DtWXXDqHfAGX0q6z/bO82j3ebh1VwnbrduwTQbvwcRtesAfMGor/W
-L3fs6Xnz8LRlm9fV8/P61sM0LDNwCZjl9gSpCokJRzpryGQ5t8kNGFUt51QjOZGu0Mj35FlYlXEr
-yC09EVOp4lEXfF84Lz1qbhBsgl59vDedXI3rTV03xipduSgt9kLytI3XmBp3aV6MPoMQGNUU62T6
-uQdeefTy1Hfj10zVHg2pq8fXDoHBiOv94csfXwN49xECqWREy7pwukKfvxdMY2j23vXDPuuxxeE+
-JOdCOhxCE3N44B1ZeSLuZh8Mmkr2wEPAmPfKWHA2uxIRjEopdbQYjDz3BWOf14/scfmwoki1eQvX
-ExBdF60Mqh+Y/QcX4uiH4Amwzx79KOVFtbL63sXJbtcvy8/3q5rupmO5CnE91wBviQAhjUUegYpL
-vVEbpLt2/W+PklRgq5Ku6mp+rpMhhCo/lXthQTxJ2ysO4Ka0ad97S7VT/n6YXus6fzk3fLnBZW5C
-KDC6gSO62QDqgFqLCCtPmjegjnLeAdArtSE8VYGbAJ/aLb+vnQutFhk768E9uRbSxhCMzdgEveYw
-IZ5ZqFKl6+kz7UR4U+buqQZXu9SIujrAfD7f0FXpozB4Q0gwp31H9mVTZGGC4b871/wm7lvyDLu1
-FUyvTj/yvD66k3UPTs08x1AQQaGziOl0S1qRkPG9COtBTSTWM9NzQ4R64B+Px/l3tDzCgxv5C6Ni
-e+QaF9xFWrxx0V/G5uvYQOdiZzvYpQUVQSIsTr1TTghI33GnPbTA7/GCqcE3oE3GZurq4HeQXQD6
-32XS1ITj/qLjN72ob0hc5C9bzw8MhfmL
+eJyFVVFv0zAQfs+vONJO3RDNxCsSQoMVrdK2Vl03CSHkesllMXLsYDvZivjx2GmTOG0YfWhV+7u7
+73z33Y1gnTENKeMIeakNPCKUGhP7xcQTbCJ4ZOKcxoZV1GCUMp1t4O0zMxkTQEGVQjicO4dTyIwp
+Ppyfu386Q86jWOZwBhq1ZlK8jYIRXEoQ0jhDYAYSpjA2fBsFQVoKG0UKSLAJB9MEJrMXi6uYMiXl
+KCrIZYJARQIKTakEGAkmQ+tU5ZSDRTAlRY7CRJMA7GdkgRoNSJ74t1BRxegjR12jWAoGbfpTAeGY
+LK4vycN8tb6/uCbLi/VVWGPcx3maPr2AO4VjYB+HMAxAkQT/i/ptfbW4vVrczAZit3eHDNqL13n0
+Ya+w+Tq/uyLL1eJmuSaLh9lqNb/0+IzgznqnAjAvzBa4jG0BNmNXfdJUkxTU2I6xRaKcy+e6VApz
+WVmoTGFTgwslrYdN03ONrbbMN1E/FQ7H7gOP0UxRjV67TPRBjF3naCMV1mSkYk9MUN7F8cODZzsE
+iIHYviIe6n8WeGQxWKuhl+9Xa49uijq7fehXMRxT9VR9f/8jhDcfYSKkSOyxKp22cNIrIk+nzd2b
+Yc7FNpHx8FUn15ZfzXEE98JxZEohx4r6kosCT+R9ZkHQtLmXGYSEeH8JCTvYkcRgXAutp9Rw7Jmf
+E/J5fktuL25m1tMe3vLdjDt9bNxr2sMo2P3C9BccqGeYhqfQITz6XurXaqdf99LF1mT2YJrvzqCu
+5w7dKvV3PzNyOb+7+Hw923dOuB+AX2SxrZs9Lm0xbCH6kmhjUyuWw+7cC7DX8367H3VzDz6oBtty
+tMIeobE21JT6HaRS+TbaoqhbE7rgdGs3xtE4cOF3xo0TfxwsdyRlhUoxuzes18r+Jp88zDx1G+kd
+/HTrr1BY2CeuyfnbQtAcu9j+pOw6cy9X0k3IuoyKCZPC5ESf6MkgHE5tLiSW3Oa+W2NnrQfkGv/h
+7tR5PNFnMBlw4B9NJTxnzKA9fLTT0aXSb5vw7FUKzcTZPddqYHi2T9/axJmEEN3qHncVCuEPaFmq
+uEtpcBj2Z1wjrqGReJBHrY6/go21NA==
 """)
 
 ##file activate.csh
 ACTIVATE_CSH = convert("""
-eJx9VG1P2zAQ/u5fcYQKNgTNPtN1WxlIQ4KCUEGaxuQ6yYVYSuzKdhqVX7+zk3bpy5YPUXL3PPfc
-ne98DLNCWshliVDV1kGCUFvMoJGugMjq2qQIiVSxSJ1cCofD1BYRnOVGV0CfZ0N2DD91DalQSjsw
-tQLpIJMGU1euvPe7QeJlkKzgWixlhnAt4aoUVsLnLBiy5NtbJWQ5THX1ZciYKKWwkOFaE04dUm6D
-r/zh7pq/3D7Nnid3/HEy+wFHY/gEJydg0aFaQrBFgz1c5DG1IhTs+UZgsBC2GMFBlaeH+8dZXwcW
-VPvCjXdlAvCfQsE7al0+07XjZvrSCUevR5dnkVeKlFYZmUztG4BdzL2u9KyLVabTU0bdfg7a0hgs
-cSmUg6UwUiQl2iHrcbcVGNvPCiLOe7+cRwG13z9qRGgx2z6DHjfm/Op2yqeT+xvOLzs0PTKHDz2V
-tkckFHoQfQRXoGJAj9el0FyJCmEMhzgMS4sB7KPOE2ExoLcSieYwDvR+cP8cg11gKkVJc2wRcm1g
-QhYFlXiTaTfO2ki0fQoiFM4tLuO4aZrhOzqR4dIPcWx17hphMBY+Srwh7RTyN83XOWkcSPh1Pg/k
-TXX/jbJTbMtUmcxZ+/bbqOsy82suFQg/BhdSOTRhMNBHlUarCpU7JzBhmkKmRejKOQzayQe6MWoa
-n1wqWmuh6LZAaHxcdeqIlVLhIBJdO9/kbl0It2oEXQj+eGjJOuvOIR/YGRqvFhttUB2XTvLXYN2H
-37CBdbW2W7j2r2+VsCn0doVWcFG1/4y1VwBjfwAyoZhD
+eJx1U2FP2zAQ/e5f8TAV3Soo+0zXbYUiDQkKQgVp2ibjJNfFUuIg22nVf885SVFLO3+I7Lt3fr6X
+d8eY58ZjYQpCWfuAhFB7yrAyIYf0Ve1SQmLsuU6DWepAw9TnEoOFq0rwdjAUx/hV1Ui1tVWAqy1M
+QGYcpaFYx+yVI67LkKwx1UuTEaYGl4X2Bl+zJpAlP/6V2hTDtCq/DYXQhdEeGW040Q/Eb+t9V/e3
+U/V88zh/mtyqh8n8J47G+IKTE3gKZJdoYrK3h5MRU1tGYS83gqNc+3yEgyyP93cP820evHLvr2H8
+kaYB/peoyY7aVHzpJnE9e+6I5Z+ji4GMTNJWNuOQq6MA1N25p8pW9HWdVWlfsNpPDbdxjgpaahuw
+1M7opCA/FFu1uwxC7L8KUqmto1KyQe3rx0I0Eovdf7BVe67U5c1MzSZ310pddGheZoFPWyytRkzU
+aCA/I+RkBXhFXr5aWV0SxjhUI6jwdAj8kmhPzX7nTfJFkM3MImp2VdVFFq1vLHSU5szYQK4Ri+Jd
+xlW2JBtOGcyYVW7SnB3v6RS91g3gKapZ0oWxbHVteYIIq3iv7QeuSrUj6KSqQ+yqsxDj1ivNQxKF
+YON10Q+NH/ARS95i5Tuqq2Vxfvc23f/FO6zrtXXmJr+ZtMY9/A15ZXFWtmch2rEQ4g1ryVHH
 """)
 
 ##file activate.bat
 ACTIVATE_BAT = convert("""
-eJx9UdEKgjAUfW6wfxjiIH+hEDKUFHSKLCMI7kNOEkIf9P9pTJ3OLJ/03HPPPed4Es9XS9qqwqgT
-PbGKKOdXL4aAFS7A4gvAwgijuiKlqOpGlATS2NeMLE+TjJM9RkQ+SmqAXLrBo1LLIeLdiWlD6jZt
-r7VNubWkndkXaxg5GO3UaOOKS6drO3luDDiO5my3iA0YAKGzPRV1ack8cOdhysI0CYzIPzjSiH5X
-0QcvC8Lfaj0emsVKYF2rhL5L3fCkVjV76kShi59NHwDniAHzkgDgqBcwOgTMx+gDQQqXCw==
+eJx9Ul9LhEAQfxf8DoOclI/dYyFkaCmcq4gZQTBUrincuZFbff12T133TM+nnd35/Zvxlr7XDFhV
+mUZHOVhFlOWP3g4DUriIWoVomYZpNBWUtGpaWgImO191pFkSpzlcmgaI70jVX7n2Qp8tuByg+46O
+CMHbMq64T+nmlJt082D1T44muCDk2prgEHF4mdI9RaS/QwSt3zSyIAaftRccvqVTBziD1x/WlPD5
+xd729NDBb8Nr4DU9QNMKsJeH9pkhPedhQsIkDuCDCa6A+NF9IevVFAohkqizdHetg/tkWvPoftWJ
+MCqnOxv7/x7Np6yv9P2Ker5dmX8yNyCkkWnbZy3N5LarczlqL8htx2EM9rQ/2H5BvIsIEi8OEG8U
++g8CsNTr
 """)
 
 ##file deactivate.bat
 DEACTIVATE_BAT = convert("""
-eJxzSE3OyFfIT0vj4ipOLVEI8wwKCXX0iXf1C7Pl4spMU0hJTcvMS01RiPf3cYmHyQYE+fsGhCho
-cCkAAUibEkTEVhWLMlUlLk6QGixStlyaeCyJDPHw9/Pw93VFsQguim4ZXAJoIUw5DhX47XUM8UCx
-EchHtwsohN1bILUgw61c/Vy4AJYPYm4=
+eJyFkN0KgkAUhO8F32EQpHqFQEjQUPAPMaErqVxzId3IrV6/XST/UDx3c86c4WMO5FYysKJQFVVp
+CEfqxsnJ9DI7SA25i20fFqs3HO+GYLsDZ7h8GM3xfLHrg1QNvpSX4CWpQGvokZk4uqrQAjXjyElB
+a5IjCz0r+2dHcehHCe5MZNmB5R7TdqMqECMptHZh6DN/utb7Zs6Cej8OXYE5J04YOKFvD4GkHuJ0
+pilSd1jG6n87tDZ+BUwUOepI6CGSkFMYWf0ihvT33Qj1A+tCkSI=
 """)
 
 ##file activate.ps1
 ACTIVATE_PS = convert("""
 eJylWdmO41hyfW+g/0FTU7C7IXeJIqmtB/3AnZRIStxF2kaBm7gv4ipyMF/mB3+Sf8GXVGVl1tLT
 43ECSqR4b5wbETeWE8z/+a///vNCDaN6cYtSf5G1dbNw/IVXNIu6aCvX9xa3qsgWl0IJ/7IYinbh
 2nkOVqs2X0TNjz/8eeFFle826fBhQRaLBkD9uviw+LCy3Sbq7Mb/UNbrH3+YNtLcVaB+Xbipb+eL
 tly0eVsD/M6u6g8//vC+dquobH5VWU75eMFUdvHb4n02RHlXuHYTFfmHbHCLLLNz70NpN+GrBI4p
@@ -2204,16 +2111,35 @@ siwTIvpxKYCembPAU4Muwi/Z4zfvrZ/MXipKeB8C
 xVx8zU6VG/PXLXvfsyyzUqjeWR8hjGE+2iCE1W1tQ82hsCJN9dzKaoexyB/uH79TnjwvxcW0ntSb
 yZ8jq1Z5Q1UXsyy3gf9nbjTEj7NzQMfCJa/YSmrQ+2D/BqfiOi6sclrGzvoeVivIj8rcfcmnIQRF
 7XCyeZI7DFe5/lhlCs5PRf5QW66VXT/NrlQ46oD/D6InkOmi3IQcbhKxAX2g4a+Xd5s3UtCtG2py
 m8eg6WYWqR6SL5OjKMGfSrYt/6kxxQtOpeAgj1LXBNmpE2ElmCSIy5H0zFd8gJ924HWijWhb2hRC
 6wNEm1QdDZtuSZcEprIUBo/XRNcbQe1OUbQ/r3hPTaPJJDNtFLu8KHV5XoNr3Eo6h6YtOKw8e8yw
 VF5PnJ+ts3a9/Mz38RpG/AUSzYUW
 """)
 
+##file python-config
+PYTHON_CONFIG = convert("""
+eJyNVV1P2zAUfc+v8ODBiSABxlulTipbO6p1LWqBgVhlhcZpPYUkctzSivHfd6+dpGloGH2Ja/ue
+e+65Hz78xNhtf3x90xmw7vCWsRPGLvpDNuz87MKfdKMWSWxZ4ilNpCLZJiuWc66SVFUOZkkcirll
+rfxIBAzOMtImDzSVPBRrekwoX/OZu/0r4lm0DHiG60g86u8sjPw5rCyy86NRkB8QuuBRSqfAKESn
+3orLTCQxE3GYkC9tYp8fk89OSwNsmXgizrhUtnumeSgeo5GbLUMk49Rv+2nK48Cm/qMwfp333J2/
+dVcAGE0CIQHBsgIeEr4Wij0LtWDLzJ9ze5YEvH2WI6CHTAVcSu9ZCsXtgxu81CIvp6/k4eXsdfo7
+PvDCRD75yi41QitfzlcPp1OI7i/1/iQitqnr0iMgQ+A6wa+IKwwdxyk9IiXNAzgquTFU8NIxAVjM
+osm1Zz526e+shQ4hKRVci69nPC3Kw4NQEmkQ65E7OodxorSvxjvpBjQHDmWFIQ1mlmzlS5vedseT
+/mgIEsMJ7Lxz2bLAF9M5xeLEhdbHxpWOw0GdkJApMVBRF1y+a0z3c9WZPAXGFcFrJgCIB+024uad
+0CrzmEoRa3Ub4swNIHPGf7QDV+2uj2OiFWsChgCwjKqN6rp5izpbH6Wc1O1TclQTP/XVwi6anTr1
+1sbubjZLI1+VptPSdCfwnFBrB1jvebrTA9uUhU2/9gad7xPqeFkaQcnnLbCViZK8d7R1kxzFrIJV
+8EaLYmKYpvGVkig+3C5HCXbM1jGCGekiM2pRCVPyRyXYdPf6kcbWEQ36F5V4Gq9N7icNNw+JHwRE
+LTgxRXACpvnQv/PuT0xCCAywY/K4hE6Now2qDwaSE5FB+1agsoUveYDepS83qFcF1NufvULD3fTl
+g6Hgf7WBt6lzMeiyyWVn3P1WVbwaczHmTzE9A5SyItTVgFYyvs/L/fXlaNgbw8v3azT+0eikVlWD
+/vBHbzQumP23uBCjsYdrL9OWARwxs/nuLOzeXbPJTa/Xv6sUmQir5pC1YRLz3eA+CD8Z0XpcW8v9
+MZWF36ryyXXf3yBIz6nzqz8Muyz0m5Qj7OexfYo/Ph3LqvkHUg7AuA==
+""")
+
 MH_MAGIC = 0xfeedface
 MH_CIGAM = 0xcefaedfe
 MH_MAGIC_64 = 0xfeedfacf
 MH_CIGAM_64 = 0xcffaedfe
 FAT_MAGIC = 0xcafebabe
 BIG_ENDIAN = '>'
 LITTLE_ENDIAN = '<'
 LC_LOAD_DYLIB = 0xc
@@ -2346,11 +2272,11 @@ def mach_o_change(path, what, value):
 
     assert(len(what) >= len(value))
     do_file(open(path, 'r+b'))
 
 
 if __name__ == '__main__':
     main()
 
-## TODO:
-## Copy python.exe.manifest
-## Monkeypatch distutils.sysconfig
+# TODO:
+# Copy python.exe.manifest
+# Monkeypatch distutils.sysconfig
--- a/python/virtualenv/virtualenv_embedded/activate.bat
+++ b/python/virtualenv/virtualenv_embedded/activate.bat
@@ -2,25 +2,29 @@
 set "VIRTUAL_ENV=__VIRTUAL_ENV__"
 
 if defined _OLD_VIRTUAL_PROMPT (
     set "PROMPT=%_OLD_VIRTUAL_PROMPT%"
 ) else (
     if not defined PROMPT (
         set "PROMPT=$P$G"
     )
-	set "_OLD_VIRTUAL_PROMPT=%PROMPT%"	
+    set "_OLD_VIRTUAL_PROMPT=%PROMPT%"
 )
 set "PROMPT=__VIRTUAL_WINPROMPT__ %PROMPT%"
 
-if not defined _OLD_VIRTUAL_PYTHONHOME (
+REM Don't use () to avoid problems with them in %PATH%
+if defined _OLD_VIRTUAL_PYTHONHOME goto ENDIFVHOME
     set "_OLD_VIRTUAL_PYTHONHOME=%PYTHONHOME%"
-)
+:ENDIFVHOME
+
 set PYTHONHOME=
 
-if defined _OLD_VIRTUAL_PATH (
+REM if defined _OLD_VIRTUAL_PATH (
+if not defined _OLD_VIRTUAL_PATH goto ENDIFVPATH1
     set "PATH=%_OLD_VIRTUAL_PATH%"
-) else (
+:ENDIFVPATH1
+REM ) else (
+if defined _OLD_VIRTUAL_PATH goto ENDIFVPATH2
     set "_OLD_VIRTUAL_PATH=%PATH%"
-)
+:ENDIFVPATH2
+
 set "PATH=%VIRTUAL_ENV%\__BIN_NAME__;%PATH%"
-
-:END
--- a/python/virtualenv/virtualenv_embedded/activate.csh
+++ b/python/virtualenv/virtualenv_embedded/activate.csh
@@ -12,23 +12,17 @@ setenv VIRTUAL_ENV "__VIRTUAL_ENV__"
 set _OLD_VIRTUAL_PATH="$PATH"
 setenv PATH "$VIRTUAL_ENV/__BIN_NAME__:$PATH"
 
 
 
 if ("__VIRTUAL_PROMPT__" != "") then
     set env_name = "__VIRTUAL_PROMPT__"
 else
-    if (`basename "$VIRTUAL_ENV"` == "__") then
-        # special case for Aspen magic directories
-        # see http://www.zetadev.com/software/aspen/
-        set env_name = `basename \`dirname "$VIRTUAL_ENV"\``
-    else
-        set env_name = `basename "$VIRTUAL_ENV"`
-    endif
+    set env_name = `basename "$VIRTUAL_ENV"`
 endif
 
 # Could be in a non-interactive environment,
 # in which case, $prompt is undefined and we wouldn't
 # care about the prompt anyway.
 if ( $?prompt ) then
     set _OLD_VIRTUAL_PROMPT="$prompt"
     set prompt = "[$env_name] $prompt"
--- a/python/virtualenv/virtualenv_embedded/activate.fish
+++ b/python/virtualenv/virtualenv_embedded/activate.fish
@@ -1,74 +1,76 @@
-# This file must be used with "source bin/activate.fish" *from fish* (http://fishshell.com)
-# you cannot run it directly
+# This file must be used using `. bin/activate.fish` *within a running fish ( http://fishshell.com ) session*.
+# Do not run it directly.
 
-function deactivate  -d "Exit virtualenv and return to normal shell environment"
+function deactivate -d 'Exit virtualenv mode and return to the normal environment.'
     # reset old environment variables
-    if test -n "$_OLD_VIRTUAL_PATH" 
+    if test -n "$_OLD_VIRTUAL_PATH"
         set -gx PATH $_OLD_VIRTUAL_PATH
         set -e _OLD_VIRTUAL_PATH
     end
+
     if test -n "$_OLD_VIRTUAL_PYTHONHOME"
         set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
         set -e _OLD_VIRTUAL_PYTHONHOME
     end
-    
+
     if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
-        # set an empty local fish_function_path, so fish_prompt doesn't automatically reload
+        # Set an empty local `$fish_function_path` to allow the removal of `fish_prompt` using `functions -e`.
         set -l fish_function_path
-        # erase the virtualenv's fish_prompt function, and restore the original
+
+        # Erase virtualenv's `fish_prompt` and restore the original.
         functions -e fish_prompt
         functions -c _old_fish_prompt fish_prompt
         functions -e _old_fish_prompt
         set -e _OLD_FISH_PROMPT_OVERRIDE
     end
-    
+
     set -e VIRTUAL_ENV
-    if test "$argv[1]" != "nondestructive"
-        # Self destruct!
+
+    if test "$argv[1]" != 'nondestructive'
+        # Self-destruct!
+        functions -e pydoc
         functions -e deactivate
     end
 end
 
-# unset irrelevant variables
+# Unset irrelevant variables.
 deactivate nondestructive
 
 set -gx VIRTUAL_ENV "__VIRTUAL_ENV__"
 
 set -gx _OLD_VIRTUAL_PATH $PATH
 set -gx PATH "$VIRTUAL_ENV/__BIN_NAME__" $PATH
 
-# unset PYTHONHOME if set
+# Unset `$PYTHONHOME` if set.
 if set -q PYTHONHOME
     set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
     set -e PYTHONHOME
 end
 
+function pydoc
+    python -m pydoc $argv
+end
+
 if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
-    # fish uses a function instead of an env var to generate the prompt.
-    
-    # copy the current fish_prompt function as the function _old_fish_prompt
+    # Copy the current `fish_prompt` function as `_old_fish_prompt`.
     functions -c fish_prompt _old_fish_prompt
-    
-    # with the original prompt function copied, we can override with our own.
+
     function fish_prompt
-        # Prompt override?
+        # Save the current $status, for fish_prompts that display it.
+        set -l old_status $status
+
+        # Prompt override provided?
+        # If not, just prepend the environment name.
         if test -n "__VIRTUAL_PROMPT__"
-            printf "%s%s" "__VIRTUAL_PROMPT__" (set_color normal)
-            _old_fish_prompt
-            return
+            printf '%s%s' "__VIRTUAL_PROMPT__" (set_color normal)
+        else
+            printf '%s(%s%s%s) ' (set_color normal) (set_color -o white) (basename "$VIRTUAL_ENV") (set_color normal)
         end
-        # ...Otherwise, prepend env
-        set -l _checkbase (basename "$VIRTUAL_ENV")
-        if test $_checkbase = "__"
-            # special case for Aspen magic directories
-            # see http://www.zetadev.com/software/aspen/
-            printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal) 
-            _old_fish_prompt
-        else
-            printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal)
-            _old_fish_prompt
-        end
-    end 
-    
+
+        # Restore the original $status
+        echo "exit $old_status" | source
+        _old_fish_prompt
+    end
+
     set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
 end
--- a/python/virtualenv/virtualenv_embedded/activate.sh
+++ b/python/virtualenv/virtualenv_embedded/activate.sh
@@ -1,80 +1,78 @@
 # This file must be used with "source bin/activate" *from bash*
 # you cannot run it directly
 
 deactivate () {
-    unset pydoc
+    unset -f pydoc
 
     # reset old environment variables
-    if [ -n "$_OLD_VIRTUAL_PATH" ] ; then
+    # ! [ -z ${VAR+_} ] returns true if VAR is declared at all
+    if ! [ -z "${_OLD_VIRTUAL_PATH+_}" ] ; then
         PATH="$_OLD_VIRTUAL_PATH"
         export PATH
         unset _OLD_VIRTUAL_PATH
     fi
-    if [ -n "$_OLD_VIRTUAL_PYTHONHOME" ] ; then
+    if ! [ -z "${_OLD_VIRTUAL_PYTHONHOME+_}" ] ; then
         PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME"
         export PYTHONHOME
         unset _OLD_VIRTUAL_PYTHONHOME
     fi
 
     # This should detect bash and zsh, which have a hash command that must
     # be called to get it to forget past commands.  Without forgetting
     # past commands the $PATH changes we made may not be respected
-    if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then
+    if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then
         hash -r 2>/dev/null
     fi
 
-    if [ -n "$_OLD_VIRTUAL_PS1" ] ; then
+    if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then
         PS1="$_OLD_VIRTUAL_PS1"
         export PS1
         unset _OLD_VIRTUAL_PS1
     fi
 
     unset VIRTUAL_ENV
-    if [ ! "$1" = "nondestructive" ] ; then
+    if [ ! "${1-}" = "nondestructive" ] ; then
     # Self destruct!
         unset -f deactivate
     fi
 }
 
 # unset irrelevant variables
 deactivate nondestructive
 
 VIRTUAL_ENV="__VIRTUAL_ENV__"
 export VIRTUAL_ENV
 
 _OLD_VIRTUAL_PATH="$PATH"
 PATH="$VIRTUAL_ENV/__BIN_NAME__:$PATH"
 export PATH
 
 # unset PYTHONHOME if set
-# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
-# could use `if (set -u; : $PYTHONHOME) ;` in bash
-if [ -n "$PYTHONHOME" ] ; then
+if ! [ -z "${PYTHONHOME+_}" ] ; then
     _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME"
     unset PYTHONHOME
 fi
 
-if [ -z "$VIRTUAL_ENV_DISABLE_PROMPT" ] ; then
+if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then
     _OLD_VIRTUAL_PS1="$PS1"
     if [ "x__VIRTUAL_PROMPT__" != x ] ; then
         PS1="__VIRTUAL_PROMPT__$PS1"
     else
-    if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
-        # special case for Aspen magic directories
-        # see http://www.zetadev.com/software/aspen/
-        PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
-    else
-        PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
-    fi
+        PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1"
     fi
     export PS1
 fi
 
-alias pydoc="python -m pydoc"
+# Make sure to unalias pydoc if it's already there
+alias pydoc 2>/dev/null >/dev/null && unalias pydoc
+
+pydoc () {
+    python -m pydoc "$@"
+}
 
 # This should detect bash and zsh, which have a hash command that must
 # be called to get it to forget past commands.  Without forgetting
 # past commands the $PATH changes we made may not be respected
-if [ -n "$BASH" -o -n "$ZSH_VERSION" ] ; then
+if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then
     hash -r 2>/dev/null
 fi
--- a/python/virtualenv/virtualenv_embedded/deactivate.bat
+++ b/python/virtualenv/virtualenv_embedded/deactivate.bat
@@ -1,20 +1,19 @@
-@echo off
-
-set VIRTUAL_ENV=
-
-if defined _OLD_VIRTUAL_PROMPT (
-    set "PROMPT=%_OLD_VIRTUAL_PROMPT%"
-	set _OLD_VIRTUAL_PROMPT=
-)
-
-if defined _OLD_VIRTUAL_PYTHONHOME (
-    set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%"
-    set _OLD_VIRTUAL_PYTHONHOME=
-)
-
-if defined _OLD_VIRTUAL_PATH (
-    set "PATH=%_OLD_VIRTUAL_PATH%"
-	set _OLD_VIRTUAL_PATH=
-)
-
-:END
+@echo off
+
+set VIRTUAL_ENV=
+
+REM Don't use () to avoid problems with them in %PATH%
+if not defined _OLD_VIRTUAL_PROMPT goto ENDIFVPROMPT
+    set "PROMPT=%_OLD_VIRTUAL_PROMPT%"
+    set _OLD_VIRTUAL_PROMPT=
+:ENDIFVPROMPT
+
+if not defined _OLD_VIRTUAL_PYTHONHOME goto ENDIFVHOME
+    set "PYTHONHOME=%_OLD_VIRTUAL_PYTHONHOME%"
+    set _OLD_VIRTUAL_PYTHONHOME=
+:ENDIFVHOME
+
+if not defined _OLD_VIRTUAL_PATH goto ENDIFVPATH
+    set "PATH=%_OLD_VIRTUAL_PATH%"
+    set _OLD_VIRTUAL_PATH=
+:ENDIFVPATH
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/python/virtualenv/virtualenv_embedded/python-config
@@ -0,0 +1,78 @@
+#!__VIRTUAL_ENV__/__BIN_NAME__/python
+
+import sys
+import getopt
+import sysconfig
+
+valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags',
+              'ldflags', 'help']
+
+if sys.version_info >= (3, 2):
+    valid_opts.insert(-1, 'extension-suffix')
+    valid_opts.append('abiflags')
+if sys.version_info >= (3, 3):
+    valid_opts.append('configdir')
+
+
+def exit_with_usage(code=1):
+    sys.stderr.write("Usage: {0} [{1}]\n".format(
+        sys.argv[0], '|'.join('--'+opt for opt in valid_opts)))
+    sys.exit(code)
+
+try:
+    opts, args = getopt.getopt(sys.argv[1:], '', valid_opts)
+except getopt.error:
+    exit_with_usage()
+
+if not opts:
+    exit_with_usage()
+
+pyver = sysconfig.get_config_var('VERSION')
+getvar = sysconfig.get_config_var
+
+opt_flags = [flag for (flag, val) in opts]
+
+if '--help' in opt_flags:
+    exit_with_usage(code=0)
+
+for opt in opt_flags:
+    if opt == '--prefix':
+        print(sysconfig.get_config_var('prefix'))
+
+    elif opt == '--exec-prefix':
+        print(sysconfig.get_config_var('exec_prefix'))
+
+    elif opt in ('--includes', '--cflags'):
+        flags = ['-I' + sysconfig.get_path('include'),
+                 '-I' + sysconfig.get_path('platinclude')]
+        if opt == '--cflags':
+            flags.extend(getvar('CFLAGS').split())
+        print(' '.join(flags))
+
+    elif opt in ('--libs', '--ldflags'):
+        abiflags = getattr(sys, 'abiflags', '')
+        libs = ['-lpython' + pyver + abiflags]
+        libs += getvar('LIBS').split()
+        libs += getvar('SYSLIBS').split()
+        # add the prefix/lib/pythonX.Y/config dir, but only if there is no
+        # shared library in prefix/lib/.
+        if opt == '--ldflags':
+            if not getvar('Py_ENABLE_SHARED'):
+                libs.insert(0, '-L' + getvar('LIBPL'))
+            if not getvar('PYTHONFRAMEWORK'):
+                libs.extend(getvar('LINKFORSHARED').split())
+        print(' '.join(libs))
+
+    elif opt == '--extension-suffix':
+        ext_suffix = sysconfig.get_config_var('EXT_SUFFIX')
+        if ext_suffix is None:
+            ext_suffix = sysconfig.get_config_var('SO')
+        print(ext_suffix)
+
+    elif opt == '--abiflags':
+        if not getattr(sys, 'abiflags', None):
+            exit_with_usage()
+        print(sys.abiflags)
+
+    elif opt == '--configdir':
+        print(sysconfig.get_config_var('LIBPL'))
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..dfef51d4483025c5a535e553266234d372480439
GIT binary patch
literal 23000
zc$@$ZK=Hp&O9KQH000080FA9IM<Xd$py5gY0DfEn01E&B0AX@xaA9(DWiD`e?S1`s
z8_99t@BAw!)aeZ%0my1E_wJr-Y>rvWwl1->Pb(+ynakh}fgw2-ID=pSQC!>q`_)%>
zSAPvaO1rW1GKp8jOm}s4b#--hbyf9~;%vXW>9#M6?|1dbx-I_StoWyTcT;Uw#V>n$
zHM`{B|M&W~YSy!5cl*uk<Vo?ns%dxdzZ&Ykzv*tPzWBFly}GU1w)o}l?*HD&k7>R7
zI9t`<oSdAVo_^ci!n@UU4fTpmwe6esx>z@t+iH7%a`OJB>5JQLwO`i-{8hC@x7lH-
zdfK%8rrFl3VmSbz06cduPfiMWro{~uTi1PY+3ju+P}8;58i1~fP1iT(=k|JkTerJj
zDs8sV{1R&2G}kxl`=V*Dy6tVXYd+S+zOSz9;<oPbUsIvqZ#La_*Ap)FwkI5lRnu>(
z-SVc`bx`7RDj%_nb#c|L*WDfBjh!s|=616-(CbeX{URv+{<a4UcJ(y^zS?%T@V-9r
zNPzvh+cvuzTds?3-S5{sY_=+{nsxnB$iWB{bL=qvJv)=0e@9<NR0^L}-7mKdk!xN8
z1_ah30a)R0L7_kt%CTx;R;^YGLsSQ}Gyuv85O7z0thRG}2R~aV-OtPC@aOJ+Q_tb;
z#MZm1*PD3>j3D)~W0y4&=C)oP)$nw>?ydp$s=lg#GV}hvpY^*{x8F&7mLR_da=nK)
zqw=mChbUmDk)FlfO}(v&21uL!rrWPqh!T#$u5JY<>=O`MP@{hkxqjq6&j7C(johew
z+Ly&s1URBEhFIgE^m5(xHGm*4l6kW1XcqG5JI>ndFW1eoSgxzSuX{Tu{6R0K(}F+&
zfCApa4BB+iIKbH^C)%tyqlPST47*mB9ZV3Q#$7)lOuW$;<Cx!cE9Ccm50e;1ano(~
z>uTpfVJ+d(y9Q=#wL})|373PjcZU6FV^~6T)qc}{>^?9GK)R3hmKmA`jG5a)@hAXf
z=}017{;^)}1jXHM+g$Ep?#)61zuIm)OW*p_vZfvs+p59-U*3l!!C-r2FRvS0L=7My
zxSm^egerSOrCITcOGpEEH^8eFjuDe;=8EtD(93FneX~oTgtV@2k*il05(s$@fDwka
z|7H?l*UyS8K(7O?!ZCyi*tCQNeC~_xisn-<GkUqLff-iEF&MD>u4<PI#kPo@0ocv5
zT7%%;Amgt9VUH<j##^?*>H(u-Wi^^aT{DcARbTUrq7DhO+7Wnf+cvBV7}?hQdJO~2
zV~@BYC3;|=7Wi)6e5i}E2U69G-F9D>1%NNB&8BWw3*gdzR|1*5j&Ku0U6~cX?e1Xx
z-cAVHYa;O0G4~$YyKR1~sE1HH9DVM?1eY(7B2<bga$DV7NHBUdwn%N9o`&#AJS}N|
z3u5)xw6yLJ#dp=+uiU~De|%qm+WBv7`v&n}v4rovVmNm0hv^7RkL8U80G+{3_=sPb
zN(-u_C=Cp&IW(Xf4cB&$d_VI$iP8rl%Sz-rFwl3RXsY|gu3oQ|D6qiVjxbz;_H$k9
zo*=^^Bj9=lwLii72f&Y{BCuBPbRl2>n2-CNqlxrMO*SGDH3ma|2Do-8&Fl!kg0oZF
z9tk3#T(hcC$s>&j0dr$3&=?w=mZP(E-(eR;K}ympPfKW|YuEQDswG(`VbDdew-v}V
z<Qhc(?7P><^d3K0QQh<>{jPzYDR8K%q;Q{&QTshPSu9{e_V9kO0QI1JG5d$vS7lK=
zDeh1K1oZX*|E?{hRMGBlFOhTFRgJ=+;)$-=FL<6n4{@;q*|GwynAJm63)eMDFQPfX
z-GHo`Av(YZ^%j=W1r#Qn-h=!>Fff3()d$paMBRZ^4mu4|1SK5)DBl0}_4lZHPjbj0
z9O6e5p8IAEJZRAS?j9CogC!yYV5$9c0#^F7s+{<5X|W4m;v(REFe`)k?Qug`JIVK^
z&;VDdBGDu@-`*fkZK|ckgr%tY_4duH#oKp_-@SeJ%D(#U{p+`H&i=*x{_gDE_pjdB
zwqE`2?Dd;pxfkF6{=4tqz54!p^ZO64-n~^IFHTNQfGuI00=&ApM{Zx>ALeD()2psG
zFHq}%7qEQE3(%VB4g70fp$NI#RvUV6ew>`pF6Fx3;hRE=nx9zm<OI~rmxN|t?@m}X
zDv&}ncKqcDFR;ubzbw9<{R65Uu%l`&n{~6hFGf&TZxvZnf<<*%L+SrHW-x>cl@vt2
zuL%ik*r9>TI<LeTY+M20PxwQ30ic3<^tfJdDG;3kW(0eIZFRY>Coljg0qXg$t94&X
zZ}5@r-5jP}zq94X!S@-$8@ad5l>zwDo2pV;zKt}P-G1B3cVHgGae=xGwl)F*C@4v}
zo2o}u7(YykazP~*i*k%=O!$q6i5~&1VOtc1^SSvopO+^mW&+@+e=JWlL*uJw<%ya#
z_~v<e!jlAloXuvl^2AOPd_`{-zkl=Y)wged^XBy*Uj1ru_U<>|FV5b-r|*k>yRDbq
zb=&+{lN!|n7Eg-#&;#Fpzhj2H+P6mO1BolE+`;-MtW7S?%tqq3-5M5>5ic=9WLP-P
zE`jYpmC`CGEr6SC_YsyJ00EPAvt2Aize07@yfT{~9xSprFf-E{Y*x0Hjy1kT_{hs6
z9Jx8Jh?7G738Wm`R@@$l)>l~W>g_ElgLOkIKIpp@qdZ*$qpe*H5mt*2cR=n1ExfQ%
z@2Cpedw>LH*J3n&=+vrN?y#RiniD&TOn*T(tgqCZL7ktV!!YCD{C&2dcZ-GF+W-<q
zBZqb9!hXP63?FG#g{rd!$TQhk`twOan6dUgLX>b*KOTGFn2;Z<^}hDO5-pAaTt4mR
zPq%0`7%5=mXbwZU(bIlR1uZ3DCc^*E{s^1>k%A4i9W@m;0YL?_2rb6l3=4>)TR=Yq
zGyvxO!U&kUMP*|_9idLqnmN(LlIkGP04m9qsN5USFvhqh;2*BFK3AUMYH^kUjS?%G
z(D3HhPQS+0KT$@exu+XMbKL2vv|X!PknIH2H#?Giv3fTt^M*5+=5Jfn&tT3F%agVU
z#9$2Y52dUc?HANs*m%o+f~5s(@*-Yn(@Mqzf)Xg}S)DgEMVq$S$rMefjnLk8;x($j
z?GEZLx75n~>qMd3>eB+ru`u?b`PcuDD0bJZb~kfk60wTm^Th06kWcJZiOT9#lwQQV
zg^yJUqQ*d&G_WBD^=ekPADeC0o|oUg{g>bW?#=h*#n`JOdc^3T>wD58CdI!ZchcYE
zJox|f)k*w%IxoIHQS6Vi6zPj*N%$xD5|WsZ_Fn}xB6>rW=v`39Ak2gfJ}&p$EjPGg
z1ilIi@bVGAXBz_{w65E0YT>I8`nKzKi@sh8ru_1I{>|*jk|TpuSW|-wo4UI}b36(T
zz-hO<A-g*)PIz>(fj!A+TmH~LFT<wRU3<N_gbmh*e6<$;537oTIjCNM<l$1%O%feU
zU7n|Usvif7CNYBu#d&fNpU*S=l^j|q{Xz)~5Io1WGd<W2DrC5kN!9)a_yyL(*ZgZ$
zqcM`qwDr2XE4~87F@^2aVk=sl;U+8D)tO2t`<y*tf)*TTcLKt^T7l>>!bwkQYS)<{
z=B|2NjKT5ggQkEjAnia2`716$%Q$O6UMIL&n&aWPFcWbB(b<rkKt?l7bV(4V8d(sj
zXefxqYTS7<#v@;JqAp`*rz(rD7tn|@P2q#m9aZ)T8~%+7M%|7Pz>=e9SkiA3ixVxN
zVbZ0}Rms6N0=fS=)R0*+J_$xblo<eYL&`pzv5XwMgKcnqyV>1`cwob}UvcY3t1QFj
zs?|y?e#~5n_S&wUCfoG5QaW$<hA6aB1=7@s7Lkx#eu1dIn;YfRXZ_Ru<qs{X&VDrz
z7N9_Dtb%oX9d5M)*b(`NeHFo`C@h+4U9|Nbp0rFn;v!9qc{SM4)9^4e!g5hssWNe+
z3fRM!3$3H$(E)xp!pX92R`3d*%+6+0GEx-}u2J&&cdXcwfsi_P+^XbkCp(zk1|7lQ
z3`&T6Bsqo^f@F^!^iU0PG-T2!VL1UwdW>qJ^a<=6p8x2c9U2YWk8qTNrGN|hk^|er
zE}*4O`j3CACUHuWRWC6^^@n(7Mg+p2LLNSfILCi30#s<{Be>At6L&0iz3uiJ_;<6d
zubNNcnhB`#wkg0h+E(KtHw^mdju<esOnCjUhjQE%Zpg=$-_2+-iEs|r*ao+NuwBEm
z>?Nsk{_2K1ZuiYHh2SabvMb<=V+Rx0e;?FHP`~i1;6m5$FZr7@XP|X*VU&P{Ezpmm
z{wLZt5+!KgLK#Qv-F~yGc6?L;JAvkQe@hat;4ML>k8Z;Nbw=m#Ya}Z-E!Ya7V8s?9
z+UhaL=Sf{N#Z8Ir3u2S`I&j(&Jsy@3#mtgTWRe3rv@0LY@s$X~bN(ZozScX#<9ofN
zkY&xXjeJjt4sQ|(0~}ah<SW`-rs@RrsKv$hVnE#$wJ+WcYO(Lz;A4%-0}}85X29+v
z+Vs&nzTS*ewdsr%Z9p3=TaJPA@ZZqRM!JGq@ttBUqqCu9R1ATUm97+P;W-w|a-g_H
z>~J(Syle%a3YBNafo-(5cuI<vvq!B8zKG>_Y3q%AgZ=iXB$zLYa;(imdO<<UbaU0z
zs|lUiq9H!J@Wf5=XIXVXwM4_|2rV*mXQK(5ZaeD&)uVyjxj?ZsuKHLtYd$%$t^aY~
z?|e&7z1G+vW<+;HGdcAPrsY$@Z%j^V$Dr$Q_5HOXWS7-?NnT*w)&QpAaCO%YM2wN^
zH|u7n@S_t#g`ij574wb*2m#fn=;IMmO;|-%eQwB1mbj#cj9D3t7z_)h_Z|V#A&`Jf
zq>IBY0CWr<1vwuLdWk#zq;k<O{PDy`)*{1HTz=$e{9NN_X7V`Akml^-ymxE$IT??=
zW-e%Rc@cGwj;(REV}K+Dv1qd^(I2fVP!#*tUC>Ug^-|k1r-xU00E~Kth$QGI{-T!0
z#WxCapy$a*;Cf)D0=gg~?i-vvMQqieK}NB=t*`4(xHfFdA4aoh|M<iB`JaC{$3HIM
zkMEzCQ8gHc?9ikKLpUm|b#M?(YfN>vaH2*F3hhWCKXE9f+dWv{A{W;eW1!_Di_aKT
z0@v`tdKM3=XB$inBrd;lwnIb6ZtHCwk07pfsP@uV>Jqs;vfUxQ-O&$Ki-nT@od4=A
zlX)wP28P-tIwU9-pB68YRq~=K0gQW`2NvoY8M!IFvcR7gFJua0rEmu3AQ=3t;57Da
z#|!v*9J5*oAy4~9(!o?Qm{GS56Z!dE5#f0Twh(T3%pOORM{rty{?!G!zVM&tiaIaT
zBo*bA=UHM>5)vJm6#JWQyPJpyJ*))mYn{`&Qj2*k<Vgi7emO6`n*HzpRXjV$Y1U{7
z1cc(F97GtdEK#i}J3vcl#R(Z&J1+pPtsP37VUFr&=tn5qb&*>}G#W@5J|I=k7Jd}c
zQB%W6AC^KSJ_-5(ra?Uc8r!4E9Nj7#Sdq|u6M;NHF$>0B4SQOTla<e{qKXECYeHsO
z$ubjSLgi6TzBqztdC8VxlZfF4MCfO7nm@8Qp>kq@jPYEYbgr~AV6{=$Y&&t+dz&E<
zaU@G*V;ODC%cuR*o;LY-(7-ihAD7tudJ490Sh4!nON9X$3+X*lr&)>zNrQxHu3W4F
z^q6bgy7beuM{2L<Q`n*^gzx|K7tfw!+7fU_cu9~2A4Ah5k^)EZ(}=3i79JKL^^*=0
z&PyV3BGf@g+r2-2>A47eMIN4r4$IpV5;1q#om_uTm0tp&3)Bcx)zh=c-!mRx4<D}>
z+RCzfLqQgoTW(@o|HmG~DhG8ZCJ32BY0QV!Bq_v{xIjIlEY9N%hk1sjaRMN~8vtht
z^9U5>MY`y4t6!wgqc7X%0dQfT$LXTTVhwg_i=iPS!{#q0$oHAega+Rb@IRMYzAZsr
z!l(&6jZgu5Xc!1he`eJR94niN;`_SY-=f=FJ#x0<(1NqyfQaNs9b;c6v(jy~#kf8a
zwWv!5^|tjbMv(m(#28>w?J!u54=!SO;r2Z^oJk)h**+R|*moyV;Dn$vSi(jP?Hqxs
zIn98JZn_N=O{f$hIMNM|2g#~rKq`rW=0V+FM<Z!lc9z3~CaevMc;8lpPNC)uLEx<F
zemBl&U1Xj?iy8~B2_eRYoNkY9F$wj<j-C~(!}3%N(zMecNn=gZ=hGMb?jl22)lDk@
z;w98bb;X>!2x8)mojZUrV0(Xqml-pTQ{MKlf2r;fCda!nkv4`9m)mOjq27f<nvzQ1
zz}iJR7;hj~X3VhNw<dab)zy7l?us1-7FFzdYdoP~V#SR=!T(HY^M!HTfl*GzOE7Br
zG#55o8S5txjl^1e_#cBi;@m$7X$&uLnA6V(><NrN>Riu^83?O-J4!F?*nc-p`I#n=
z^Lq=XQo)28d6b&yR+96Sg2rGswC=hOE^gb*UX&O{=Rn%H*_;|#C0}eMa)0KDL#|3k
z&1%!D^QZj<c8U(Me)5_5L}YD29#}SaLR&A<<z;(s6mow(qyuz`2Vzm}!htY2FIcGw
zf%E1it<L9et-jEB(1xZG2X7+}$;FSBOY&7!v76}2p{?w6KupNtAI9FsgNiSl0q4T&
z{&HPcZ2`N1V9mYV@Aec%2<rQK-(zl#VDHgw$o{o0&wn@{DIJb7AjpS{vHBo5qcIo{
zO}8ZmJrq3CYhe0q`NNA+JX-RV3KJ?p?HpSR=E^fWS+FsxJ;v&XEB`PWo&WovFP@Em
z7?;Bh;y-fE>rq*@ksPD>$+4(;kME*w<e-<2IaezwL<l|yn>dG0_S{XEeayj0U=kTD
zYvNH@;x+3v_l_Nl90Jxnzz5`bM4s7Q=lpb@xbP-Pwjx4_yJWobIFrV@x~$i>YUC;3
zv^fV4Kra>Fpq`8a{@8CVP4%>Uz93<$_}He03SNI5)<@4ca!($1IEs%QpA<J82*&m1
z7qat0>5K6zHpdN$W=v_*I-f|*vTCV_-7I!{=Vg&{<n*xjYKHw{r%*Q4094%pG9cTf
z32;|kA;(UyJDUo4<*o}wFR9gNc<>q~8?qjvM|Dpo!2>%xebyI+>8>s<p7yM4dI1+t
z$SyiSiWVh@H-fPq^wW*mKqvgkk=W-_!iA=m)FWy&^*nLyR@X!2BJh&nm}PW~ri~>o
zj1J(07@lpA-IYt)pm{#a@6-*E(oDhn(+0SXeUehfA*x{vq+EquCB(#P0Zx=?@gaDM
zkS6&^)0oH3wT1>g9}bd167J}7FJ4|8*lv4mdIQOg%2|{egKjHQMdXRm`BeriyJbPs
zAfE`eft!kxJTlHRDBELMcE?JnYZhhvp5zMhlWFfMcbK*Aigwya4i8|QyL#=Gm@ndn
z>EV}<;%N^|tAt=Sv-Wx&IgEHqv~oS;!}Hua?0J4>U1yK9LP*-NiDhtkv9Q4bNn6Ay
zIBJugNad3O38oBQ!Djul_QkTjoTPTd$L)rBjO839Nx8_p@VMQu-U&~#`{48*_+k6s
z&))mGEMp579sdCLtUweUvwIGRY)*r0V0JV&Vusa|!gkJ-OFEd#xBQ{I%`o9t@MWHS
zTi$eZpp*s11+c?35#ZkuzhWP2{##L60A8dqD*yDf{|i#JoCt{&{PDm{v=9OcrDEGg
zpdzdRWb<RV)5h&?ZxRuV80Ms);tA`ypF%@_N%Omuw{XYkFJMs#1u5g2keepX{ur*n
zBUHl=hlOGYC&64SbdnyMZV-85sJ69))!b!8n8^i_gJ`Te4}qx@iVVOl@PD(}>>_I5
z>qAJp^dxyoSnv;pZd04&U{ku2K@glRWdJt>F+|mni<xC;qSGMb3}3kOCf)uxH^YtW
z6IkP*eGf)BCrq{)e8u@Bl+v3~AJ8mCfv#l5fF`V3G%2z+4U@p5ATNP_H)1HUxZwBa
zSoUK0;AmB^z0wbF%jDV7P$=OJXE_P=P}g}uZ|?n!v!mGV&^c2nlDZrp68^N@;m}T;
z(=ILpvI2-T5gWEJFD|03h5sGEDd1@(6WNA#0leCpVP)elfKz;u)sQnx6FD(pTdta0
zI~V>3H+R@;!DjtQcrIWv!hyM#31>7M<81?cB*N4(_}n-3dgUr5T8cvjz5SsxBu>~C
zrm3a(p>b*ij&UiB(bF0@gF&?!#%B1Rk#0(_g4XyKVPvg;KOJV+`Y33Uf_P=1=3>7X
zwCx2C;Lz9qv3J&wxpCQYy$)GD!?tFN=Bx%MCNs@Ie!G$P%cZNq*Cr{AN{&dGHL)qm
zNsL=q6@1mSdT;$Vk+9}r92EvjS&vvUFKE*S8}o4r@eHDq9Xvg8BNC+(91RT90|!P8
z3MP&PN?Hrk-@>RID|^%th$glp^I-PJN3lL-N;R8T+8$GiV=rUV-vWt`6e<#fsD+C8
z#0N=c$6cD^+N{;m>8OT$gTdQ^DHa6$7NXY{=VrGs@pSwF&yZk$Usz8(v!7|BcG5Ng
zq6PbYNrjh%BS1gSgk<Kj1j2i^x3I_Nne|S}l|OOm*4TX3QVu_<=TfIxUW|5Xf|qrl
z;*Enz-JG+7NUfs$dzVr!Rb!lhY4)GO9ON`Lu_K;Xy@HAfkZ34+I6SN+!1@eDLZLxw
z+vt@^?yk}`ww$n?!wV_3IZ4`WvF|y3hZ_SMX5~j1j8!5>F-UQ?KqDqxPI*ZyEdmMV
z=>Gba6YroAng>0~+$=foC8IT_l3Z4ln!ni{%-d!wPE4a=UJ6sdq+QH2rC-ko)wuzz
zQ2;W;$sJAh7{A4&3Bm>}f>bhi_j;3@-q2zNOR1+Luc2{|GduyzGt-zuaw#|0T|J--
zdacdlp2jPg&4PTGF<~Dg?k(mfgvz_vL;1f{lsR*TOo5<icM=OOcyY$tj$8s%i!C1}
zgo#fbrmrK8z3J{WstH7Cp_RnalB8Q^kzi#qcjL0SmwOmsE(RIg0SIR8tb3jswVpi$
zt*z^oTw;MW+@XhM6Cy9hSEI8_w{-~GJ6sTs?gCw4QGBTH@4Bt_Y!%-lLspkuo{xyu
zJzonzu9_|rt4q{xuSyU~{Ij%RR}<x6J1v5hknV6ms{;b`?tKtfLQ~Msr%%(_UW@|6
z-7TBS$Rn0svcT%LNo>na3r-<Y31*QNH^3&W-|&4AGNdDYVlm|_Wh^XCp&s@?k(jR9
zG5Go>44^lZTFr`oy0>}zX<+S8-(d#$%i0!YX9eL14;agDQ(hc40d(<}^5lxH*tE;_
zew8o~Pm4Fj$lZi9HZ6jvQ=J)+bAh?UsG`w}PdlcVRM`RevEFvbs=8xwAkh@lF2|LK
zzaN3Xa|KIJm4|?OV{ZbWbKB<X3iMn|6MR|k?&`YL_bqU)1G;SJ1+STvZ<n{1tJs0I
z6FWV06TW7}Ewkp4Rwjb8xub`c{$Y^bjG)<W*qF=nWhth#IhO0JB4ATf7-u98FDbY0
zDG128E-?M*K(FnD4TG7<1bh%CsDN2)Ja9X?9_GE=$08f2#N{-G5u7j)>9202!DrV^
zR2gEXE4)tyg%jEx`J$=vYTZ@z2PV{9*PrN`mCB#+lH=Um20^r`mbj4i;o-K^9gEjj
zq;L3(xj}$#`RZAYc*85FXC!5XMOaXoZKEfcP{wz6C@@}MS&OURVs%B=T%^f}7GeNX
zw~mNrb*VNmj+<?xuVW&*!sy^FAxhaa3@i5xkqf99?h3RvBWqF02cncbXhNxPUFeV@
z@al=ibE~<<Bqr7RuDb8(-Y>`AyNJ8P<+Pz)G+y`tcvU$2uJ&vHIw?&kpOW@sDUB>`
z@Pu<!=4CNzU7BR&!Cg08*KBn33deJZG!f(d!>HlKPHur=vE<>WT6f$>07_g(%Rs#B
z)x|d0@*`3+`>H{r0JfWW&9X4&RT(mnaJi4>#<t97y2>dBm#0?lvtc^EULjF{?tIHs
zHrLk$DHupM5A>&bKsCQGDLnJSZanP=W6Gd^{ZG6k%$aZ@IO8xOfBBzD(sBa)0HlZ^
zd#2)lwi9%2$>tYOS*XIzoH<(dj@u6;m*@L;%snvXDSbkgfutp#58e^=!k2uRR#cnl
z6~5lNt7BY!If4paW9P$n(rNYD*`Q47dr94I63+APn)Y>L@8pk&a-k<HU$Nm*clDS^
zSS76IC1m0=V92v1#8HWQZLEUziuaC-Q8}}Xj7hr79be_x?Kv0U<CSHympe12!T%O1
zUr3~&Z(GKVi$~6dJ&%~(`S5Q?YP1|i(h3Soz&FKLzd(rh-M+|&lG0P&R3B@bI2dm*
zMTj=cyy*96=kBGUL%{GtyTYQy0!(gPV}0K#AEoD1!bR2bveV#;zsq`sWC&x(@N~;p
zvTin@7Rc3lPc1BEj@qN6nPzZK2aETH2v;XmYs1U)A=XB&p2w`sTuuM=KQKqre?vgb
z&C!K&_z*9X0_Ou0HkN<=kCuteAO2@zVajIfy*Auy9fQ8Km`YsTVHZ#XA{0vBBDsEc
z$&?r*Z=`-seMB*^BF4|d#b1314nCF}e{P0zide{WxPdX2&5-av2m2Xv=Gf?XKFctY
z>)=n#N6a$V-cQ3Z-nbDt{u%}@?yujk$Bvuo;LkH~2}Hm2$eod|^?xg$#b1^3$sX`o
z?Gw{U98ws~?imj_$cjkHnlY|e>m#=`Ijn!OfeW!>jnbHw{#JBQ&FKHFg#KqKq2@*$
zx;S-){~2X3tW(OuxsGr1?#eKFs~zn@rGu(Q((k{uTs=kpYpc0`>-?_OW;=Wj;`wj8
zef#rs`xoQtm~B;u{!<wCuXOv>)_1^ldrJRs49|V#C$Jr6DhpgO7CLnPw0vbRHy&WH
zfg%Gu<Z%C~S!j@3lKk}(@(9<PfzH-OS8d3*`ct!0uD*+Zt+zb@{OJbzBR7!O|Gx|$
zoc8Dng&|4X>bC4nv&PW{6;$l{Y0N7g1^%kp#UhRq*K}}hy86Yr$+e&x)Efa)BI#M^
zstfCd0QAj`QiP7cT$JTFE<3ZgaS6CIha0a#SI@hEM%y~}m+a!!C+C1!WmzfzuCMp2
zE?LkK-}4HUd&1WZ-taE>)g(jk<<OH(IB)%PZQLR<fY<@b)MgKBNz|n7vF3WdgHX>|
zM8p&l^naG>t4xa!ikl|E%s9W8s2Pw`*Ao3ms&1btfim|eGrKHkfFB{49-x=|6PMy9
z7xr$Q#I?g3Gdnl<XHb&D5#{@Bwej-~OPUyo33PFII`u+^34R{Mi-T>`yWnL1K64X*
zqJx2Xlk?d#K6LkTT7kaA3C)djDlQ*Ad8`LF;KA(V`Wyp_mCD3b>-ccFb1rk?XB3Qh
z!``oMYRg=PYSJDiD=p<MO!<+Ye1x4rF-nFe^3*uCX@5~pH4p`;(8)a>v2#Ol9-ROO
zDnCw)qi~&#CrpXal!WvJO^T1r2FhzE)qhG(#6HX>V^*^>K3>36!SZ2I)w6D7S!8(r
z>8N3NrLmz5kOmKP*Hf`?F&mQ^SnIfq57`az1BC~r#D5wEDw@JU+$;2J>va-@_r?(+
z$uane^j8xf!BsGes+|GbYvo2H-(S4+a!BFCRb$T1B3HC=12LrhbWD&0t-6CjRl|EH
zh4k1*#3jdKnwxJ?sC2-3;gG5p94#bV`k(9jM4&Y12~+hZN+(D*;!nBT9y7+^wQuc*
z7VmBl44-ZbnQ<87!O8}-6(j>9ORpaf#C!o@{fhuNQa~d2w)L&}19uYPMfVIC_dKG!
zrZ0PRwD&NJw)L{RZkr#`_g(5rRyB56g#qiFOZ2YWC^&p?xpZ(@VO-m?S)l`NMRH=*
zS#QHzw;Ok?;4`J!g5f_4qMhX0ai!F}@biVZB7r8285mrh8Sta*A4ZGczj^oS+qb`Y
z^ZF03ezm|XLW{Ha@89`1>*8}A^Kho_*d{@8_>9wWEf`jFFskL(&AP^d?gn_o=k)aS
z*A<3r+;hqU6ApIOC_iJUB|_%4iP%6lS_6>|L!eNzq`avZe<L29Xkm}yMF>z3*5civ
zIhNqjd{l^`=Cru&Ry8{*+ssI-X32e^pd3m$y{4!u_GrZ{sOYGCCXUmg_bR1A6enl#
zO2r%J03uZd?C>6G_7!$`T<)(h6^`+s#U@J(we8705x!nQFR_HzaL|}9I}SBG6a<H4
znU`A-HiB5vBXmL3n^WoFi|NnY0LU&fk}yguZPYXLhOXAmRrqvzO0Ld*(cky8ez*El
z(@whm?l0a-AX&0NC7TAB%uylQmM(Q1BAv}tw2(F$KVJmJVwQIgg#uUxU{Xnvtg!aF
zOfrk;{B(<A+BF*oo<wJJzMziQt0yG0JBrZp?;9{a)x`QFYeHIj!<?l6F`mf}=1`yb
z)sMMfei)!i-NWnY>$i#JwBF+4OrrwD78v?A8lS)L!>3)C=3;aT>qxodgw2@t2N%oJ
zp;giaC>k)hB@lF>`LVYl#z?$4>eIw}XUXL$Qi&8a2o|M2yV>HYbkj0aIi&V;S_c${
zej5A32nF!SY#}*kj!W}4&IWe}A>KHPL1q8W#{U*5wK0R@aD7>L-k7CsAfobn3jH?=
zj&T&FI2Ic?D9eF$2kr~dB|**J-BYNfjl^RoZN%6pyArB}IS4pV20;)okvBG^vN}$@
zCbp{DBRaKR>mxVniP?veLMe>3Slm?o&0+x@!C~DFgZe*g`!wa_-2o{mG~6gb=@*yO
zVA}c+800M~LHA8Y03;fyw_rZh_c0K7>7?ueLyQ*-bwbQLmv2pAkyA>Jwl}F{ElFb&
z?%iRh1Vl)DwsFcy128?%&8sz{eFN;X_UL2|c7skt)|zo(a?-h5=eh%au@Jdp9^va(
z(48eymiy@!4Ew~v8s4jL4+lG#ZGGL~L<yrW7VZOEyi`^GRGVxSQQQW9g|(7CgYe@Z
zA??#VK3J!uy+`@DY6}Ush<$R8hJfDV7Jzd<Ji7iBp2}JP$`9@c2yA!3%Gw3z=!&lQ
zk$b`sFzAdDE2~4|BdT#EiaydjqLQ31U_I}M=!mMk3G9i&fo0Xt4@^3M7fL9Rer9$Q
zX2M|HUJL6=69gJ@N*XTY-+&;dHym+&Q6Jaxtik>#&qAXL`tvNfnnFY68`_ev%^epD
zd&h-WSiu*0(`WFvpF_OtT?80^U$chV7N^{)Q@VhqFV+pE6mIKlSa&~~X!y{!Ctnx*
z)g(ZZdnzzm7IfUvw*2?$53A?@<Inidvma*ox1YY+pwV$Y7eAG?yGoU;6LdceVP{%b
zfEW)7jpblvj-&27G-#sX0%Jiz_DY;{y=r!0SQ;+!QOANC-A}l+q-MpR-m&=QJQO<L
z(m*X-S?yHe<y)lqy%?w@YqDo0z{eD`<}oMzwIw8g_NTv$BM9fz1lmTq5w+&q+GxWc
zLQgxs<jkZF!E+DD1)UK1fW|}gPEy~hwJwH#iFfB<s(^!Ikr^4Fqn%QDRnwn(v;Ag;
zm(m%_xZ+e6VtwsqF-;!gczcXuH;zc^&DuBak=1lte{8zFOC08z^jv0ww!ZTc(EGPW
zdh#xxTdUvY6li>c6kO)?<6Ko&fr!_RnnFxUn*Q>$F`Ua8vAgam%nFviFWOIX7^-p}
z@7mEtR%HV>U)gtnPvz^`YNf~4)53=9ngcp(jT1H`uiF$inzTDKKDr`fJ)6yVyEB&w
z2QS9y3PC#Z;O8(PyIZrI-*zfv6>pzW+LLE<!xwx}_&xefV{!`f9tKqd+Svs7Zc(UO
zKgZ0(=Gt*BY7Ia-XkQscJyPDaDU6a9Y&qo{UAlr~N7j46e7B{W?eH!@Nhd}SV!ox0
zLj{SwADCUSYdCSarOfUQPbsgwRA9Dq!MP*1Vb=<rimsB0t`3>XyZ-_g=(`3ly1J`N
zT&9JkTf11tgpEy42|P^oW3XU8GLsvxLow9AOOW-c=9JGb!by$xMiatq1}a5=@i{Rk
z(==8W;aD2+=!=MWARQEL_`>$z)H!ESsVk9fG`;^E6l&SVqCKmkt2z{}bo#4F;&3=P
zwG-vmcxA{bac3^slau1`oLDB*!sJjH>C%BGP&^OJ@tfd!`m{eq`<e$MK+xu$jE=68
z8xKl+=BF2-qzFQKgSN8;!^Z`l2ZZVvt4@+1z$`VAE5-d7AdH24kSb5NA$oKUY3oO4
z-m=1?%x9ki&s`u~d3Z~5aQ)#cy<s<CY`DJ}s5Z1wGOi5tD>AF{J&+!vxm{FVbF;Yq
zPO82#HGh+;c<iq2L6~d$b9+(VR5ai8-TEW%jm#c6+-1TpZ24hfzNW5CqdS2*8*k;^
zQR!)0rUM3sKb2-K{}3~~e~aa+{-mc3rOmtd7w8_v$xY>7X8D*KRR*@^=ib{3JO5Ko
z5m)Q#nil66(Rk}=Hk_Z0ygl{FY^i7TudjwB60(cLIASB4&P01eMZ*u2csg^Pq)D<T
zR1TP4(_VI#c*XVs#`l?$tHeTzW{~AcQ(R!$_uhOmSG0+h1@j;`yS2X76o2w`jy(u*
zz*%$z+Z37q(J<5N8NsA{-ahbwqswL0;@IBS+iRDlV@j6+3hEU2SYa-~r`z(lBTPJr
zQWynyss+fMtCBd0l=Na!B6aEtcd^!yu7RDce^2i*gtQ|SQPabZlt8%$*ll*1wzP@v
zjVf5}CQfY)U|26e+$A$Cnr$X>)FM-cT}ce7=#dA9^#EyEON&?B<gBGya|I#oL#z%p
zr10=LO%WfoNWJL%B^(wUT_^XAcS*B#B=#!!n|*F$ao~DpM>;NoR2w2{xcKQ&J$$e5
zlj6<W_pe?OzYVAt1>Uz@TvMui9+hCvs>c9H(n{`jbV8t{YnUTeykYnn8g>?_F1wHQ
z!MT#vLIQXC{jUDBFba=lwXDvRFqTM&7Zce0d>9)L7C#{~s9uI+Pg!p@PMkI0BvRZ8
zmOgGiUXg?fu(BADm8kMv#)s7G%zoS%$ui#9<UNZaZ!R@rm`&5$`I=H$vx8Z9PIXbr
z|0$;|Ds8c6cSyT&DEE!P#qqY<en^=u$j8fd<_dE+uImc33X@$(4=QJRj1tWSj^~`(
zZES>eF6DpPBi&K~nG3a_L#+h2g&9lFVS_`y#k9H=XMd)(u<Zf`HdMqYxi~lG#iB%!
zDj|D@W|~9$Kz;wUTz8E5HaqLb8eteEL{#TwSZ^^@AgzQ)WPT!Bd!^yi3Dc@WlOkU{
zOoYUgw=U5`7~CKnfaB>kisnC~6KX@^fQn}(mPZs&=3WjYt0*ZugvOSvjUZRZ89AW`
zvgdPP!p++|Ez_jcNAhhB=xWGGSYa1fHv>&oVtOowth6dl@Z0rA*=#-hT~Ig>j~oQK
zKih|0d{ewg@06m3UL4zyc@k`#>7cizMrT!=rcGP%no>@uS6w%~thQw_{iZ14$AW&4
zyqSLDx1SsbdG<_>PT@S5a*Uz6XdM4z^CFTf?m+6Mm44?Jf~FHSbqoVOxyxM>(1ro2
zY^i?D*_toriiRxWD9&Qp?*?WrNl&DdU9X%FlEd_e?8yc=T=i!rhk~PWiY^t4GPfV+
zW5`v!P&{%)NM8C&t3zb$6*n{sGI=y?&9Yw9mhly_$G`!yDch>8WHhd{er3Et0{2k8
zP8o-8xr-%qHsQY8n(~^At0p+7lxD0QZozSENp~-2Z3sPyjj7OcQjFS*ymW^y35*sT
ziwzkU_tbAX%6l2JZH8r&z0!0KY?6VQM~%T%)3S<grVn2;V@AMT2GRKrdQ>8G)i57F
z!!Q?B8?ZFSBErYY9tj*{r#t}5E*IhHtY0j=Z+*ym%$cin8-9lpPKqfPtD!1(FBCMS
zStXn|wF;2(s>4S`J~flIr+KN0`l{6ks$g*G_$0#Ct}e>?+aq&!UH6`d?Ixj7bnxMg
zX4p^dSe^(ZGZb=e@<FeLNG<$v6tO+FLVGOD+L+n{=JAQYr4Ad3?0wRX_WyJ3cx97w
z+t`f<*4KgQN$XO8zIcB4So)V*wA~%up%CuJCZ;#d&cENs0dhtO3`i#NvkS!&IU^hv
zWQr!rcHx`e?P6(t!M$_4$g4W<6Yemdh#`!fh_(HT-z2w-WTXKJb=&lG@majXy#(=v
z3rb|9wNO~;aY}`AgbRu|0byiRsqjy%X<>D(JbG2rTBWHL9>RN7!;e9BKO(lvP~nYJ
z=<A-SInv{xt-xtl3pN$Ha1Z}bh7I3heGSfQJiA@w!Ah=}#chZFTJ91mYsinsG~wIs
zF>}Tl-nAc_?Si5?*IrdIStJ0XoNrZ4^EN1a$m8^fa6vWj1}i@3SlMdegAA3hTMi6&
z?&SFMjsb`8OG~pM6vJ~wBlt2-0Dim2i9bKlTilg&Q&GT*JG}Hebnu=HcO0sj@j=|-
zd@M~9nf*lKAjOGnlg89==n?yhgy&Asr@s!S3~~BmjOfQ=M^So{I9$sG?!9#pdm9c4
zOkaLTDFl+&9}b3hQ|gz*y?c^iOx<ORL7~6~AJ4y1nk#zfqjpLG;{2ykSY6F(zw4&g
zHFS&Y7o;UwhSIQf_!dFbF95MSli0vuhn}OVe!Xed(jC0q{i?$|vy5(G&pGrZ<eCz&
ziXnqTZ3$$7_PRcI6WInGHYINZT{KlIST-A%c+mk&?>1@4wnc-AIqWEyUfnD0;iY5G
z0MNJ2>PlN`F~&wdn;Hg^93zz%M*_pL_Ao8nCZV6`KwFV>qi~n`$tj#U>q{C!v_Az1
z-=~ugbYeqE?1HCs#%nI^IzwHwnBM&Tl-{VV#)Iy`LdMG_!y@({NdM=n%yALs-rUy%
z=>>&*F(Fy}F<{5J$BPGIJLhPYOn^*rR1Ue2B?c0x`;H1F*$h(co3W*&`Fa=YXX{IQ
z)i$>qJiY=Ix%JMg@G&oE_(yzb4%~vwd@606s%w<HFy}^t5gkCEC5pY7=f|(WeTS!^
zlu#g7;?#5ECpUdwVdg4!&+y0Tn^X4OKh1%|OJVD31%FM7UkQFt^WV7RI;0j=8*hu^
zcW`)%GPpxY7*0G!IuKnPbJP*>#xZ*hc)-}eJaj4Kge@ejRSrAgG+I5ACoA*?w5hJ2
zZK~bP>=MS9?!I1l>!`0yNToPa-d@aL^soO(*1Wlh5C3DFJJb6dE>rVRQUt}5tH?Yp
z3;e296wmF<Rr%iFP2|VoyG#XImvU1Oi0tD6%4^C6p&W;5o8Fjt)#GI}uH5f0CGgct
zBEW28<FYxakNJR$OS1xa&F+4b^!zmEA--KQ2)z}rb2hpdc#%smQJV5I$oM-I22D*h
zM$uK<dsS=1SJT&@HZUKWon?LyYM{_=x0omDdfi<r!o)TWbV!+!CrbY8R4Tc&kWj-G
zh>r`S;u^9(B($Lw!d(fkVo!=j;=ym}d3oc`tmNIZub-!``oqVFV~M{$oXeM%E?~Ew
zQz(H5(dwVg;;VVj^ian1vpe`P*+ILYWc%oroWtETi;_k>ON^s48%O-k%8zzAg0hjB
zMz&B`vT2RNl=41LdmnR!z_m6!=2L{0Bx!gPY-}>Z=ZGUdd^TDRQ@!M&dOBv+{5}+Y
zD__3@A+)=<iFb~RvvtbzgYWgE{GdKVl(fbruJ|;%L-;Apv1PE5C9VPujK%(UBS*gY
z1)dKGfHuj2{$3>pk|4cD2S8)L-1?Odq_Lq4YO%}e)2xV?t3$=bovx9*1?Foo@sI`M
zFRZ~tR{1PhBQaN0>-7u7A|oOxg)EHdh+tIe<fb68T)L*Qw__;D>aCn8(S6iox}2Av
zF`F+&+UtSAVH%SCrC4h`J%UF==c@7Rd+g4qQ>pVUPZ7yEo3k&uZccd_M4}`ISgTxK
zW=m9At;Cbz@(n?9AGl4H+J9&^8?EC!Nf<9kgc}FQQv&$%^fNLN>m2OvusfB39Uou6
zOh(w6Wg*BuX_9;#2q;VAM#D#a9XYjsqOqAs3&2{*cwm)sIg=57#{N>n8H9UdsZ9in
zD$;oIW>WLGxKWimCSe`+K&4Wy=K}Z~-{#%3xyy+-C%@~Vu#arY4>7nO8}WwjAVa3`
z+<aAoGFU&?7tbA7hg-#&Kh86r4+E(lqOv){Tm&d3rrS@7RQ3@50c*EgzQ5IGdTS;!
zM*N4a;Cd0~q`S&#yRx?ux|F+-dmc?Yv^?0v2#MUiLrHr-X3mSew8U0|2R=ELS!?BP
zR@&<u0QxxQQ^4mW=(R%k_`W~kEDdT`OBqz}VN-p}t@u6d(~F2?I&dbOASJhf?=sg=
zepx>85WOba3eZ)HrhKwl_j#^zJx0nCx>^Xcy9F7I`nU-xV|D4#>0^dch^v`&Q}tmc
zW(6h@_Zqh4<wnRi=eR4%{H)rW1aOn&3&!Xm`HsmKk*7w642gcItA~RO6NxnAzQSy_
z&En3aQgYEmQ~|Q#Ue-_jt(Nqo#fEf0(e+$P?u54!s&|s8`vJMVV<+uZy*{>b$}SgB
z!!60Oi`UM3k4UPkL?f&@qc9V0UiPJut^0`v$h(}<+Ij&p$Oe?X7<6i23(Pql?f%jh
z-|RlH@-oC5H=l~OB>e(`E$C!1$hhv1#ZW^$6&&<H5a}IcWmZt&!+jx%iI>a$mi7^W
zmT7$@`#6AEM^?H#*2hI<hOSZyR^TiUZUKsBBBh;Bu3P9Fo|=#Ha1wJy_bu$M-X81b
z;!OG;Bs&Fl)8{Xnhu3NFy1tjb;0m0@`Iy%v7IxnJBH4`7)`qq>t%7rR(=2buO|xo?
z@@?sa9>+Wic;x<;6I)F5DgbrPqB@4dCTJ6=*ut$#VCarBVf$`n(hr}-;vV4i-UY7i
zYKklx-nZgE{?rNB$9?meCxkVQJaXkI9=db2;{$iTf4QBe0=m3A95|PJm`r}CqsDs&
zNEvgFWaRc^{ygl{8o<HE&dSKcSEax*)+ZE`&gc|HG#W-(p#)@x<oqaPm!kYtmd%bZ
z+6uSq_8T%H>GjoY$JF4(#By;B3?ivMnn%cjXD(-PBw`vtg{05Y=gox++M>n}wfQz~
z^U#>dOHWkbc7Y8M4W47cU|n<CQ5ZEebchwhmkgSP6iROMkwn9{k#z0HdP~{=)j}$q
zqT))CH#j9g^`Y)n;Jh+b)U8?}Kpv0A{zsU1M$L-~+LEXjU>p8kf8x&PtYR>D6;X&0
z+Mpu4fzXiQ%556jF2=92C`1!aW#ejkw>K8WqC&T=TFigE%$pRM>-zu_qOLP+R(-#}
zWtXqYW@Y3bCY@a9KhA*IEs3LsL1$Uh<?MJ1EllZC(fv;oQqZG`>43M>NNM=#LC(@1
zAG$rpoLV>)AzI&crUF>fv)il$tQ=nXJ(slsMB`=$HL?QeN3fSzJK`nvY82p@hcg&K
zL#74=HeyGdMmob4Q0ESKp;<9AENfCg?G}`IC4e!iXV)|FZH$8*h2|N4$?t7F1EaqM
z(SRmltf|(mOb8?hD-mLzqE0@HUeZTjT%nx7T;|Z8Ta+j!d_hZJtV~=>5-tmo9Tl!9
z`R9)3JXQ7T1#4k?)lu#G`zJHlL12$@XuusvxLyTV3zGNRztOpg$f85n3Aq&@$ph0*
z_dn8YNVa?r?~3VtG5t~UT~;Pps!O_}AyMKYdyeBy6TH`n?sLZiMG_y-i-D-<Di;iv
zbe;J93dG&Y#Wz__;1ioLW(gl_tQl53U>mTloX@u7J#RSEliPa5*n)K1ce)c=ZMUv0
zPJhST+Q93aqB#uHVj$M5y*GIqynQF-vqk<*k;3D(!Hk~xAQ{Xx=l;N2!4<2lVQ&@r
z@z$00dR<RfRexhQI;f109@2IhKx*w2`mh!07B8KPLH0#>SCb+h<Fu=qwfWl%l}lDT
zoT@h<vm)HQ_=>t1<#5O+?Dd8~PZ}GB>(<Uts^*s;Y$%jjVG0BNgvk%6{&SCmhN|N&
z_JL&cs>1dfH>+>7Q+gT&5N(pgZ6I(e3nLX)?ZM5{9v^$&=hZnBKCPdC2q9gvb@Q7Y
z^SI#p>$bzdoJgLeQ$gtGuu`ItJ#wl;6^sX|Kf!NFuI(h;U0r@m4>@Scd&-`FwMW&K
z6H>0!9Q_4biSfm{>o#dYz7FSKCa(%U{jMXv3M6-~xR{vFHA(V=KRk8WAbsrQy##gt
zLyq`%rvge{x4#VJE2xMhYh-JYgAuY$hPXpK`MLb~*}Uj4u%IP;`32U7jJm*`l>NnG
z<2ZV9fO+$@<&;auv1v~i-PS8(B_Q)^Y*}Ef=4G0Bk68AjX40do=NF)C0q2?xuoWy3
zN(R#}G{q9r%Q<@)7dK-`p^IK{Nmu?EJSebnAnR_pbyGk*o}vqN0O^%i0dG#-?)<(*
zhWLR#svS31PUHkl+hpQBnyzHk+|EmLXh{O<)OXtProP%qeo4~SR=<#4RgX7e`e_26
zP?WuF;FP0?GCDoT-RYrQOYM*!=o5NtsWJ0+m;Qju1uJ;dN_+1S1>OOWzPSu+kvz@N
zqSvU@E&k-|&G+z7&YOut^PSNRX1$%1y`ApT&d77>3LA=Zv90lDi0<ktwl^wsBr-2$
z?)@&lC4=D@e=dZgy-M2^<@lv}qo(4})DSTS6XM5a<9Ek(J9D6$5=BD5KoVO}v5@i#
z&IbfwZblxUvgR!^Ai^H`j~M;TQ!Wrwp*6u1S|PmhprBIpJby{I+^ZLITZyIdMOv0v
z@&tBloNxZjfu6jzrjBZjEC{@{zMmA(0PN<V=jhI>z{nlc#3+=^Gr7^@oxg97(8C5B
zIQu@_Oc<L_;B-`dT13SN5_}mY0Svj%<-tvz4#3tEjrT9-xtftN%+NcORv33zuS{@q
zi}A{dV<UW@>n|oVitP}QT@4>PALMhYHcjP}L4#|2<0(fMkxf(6<?rTMj1z$kjv5QR
zFwu1E(29`KP1!J`?H2)6(F&=py3$AjRAja&R{O0PC%saNCtr$k>8^dFX*HmZT1q6r
zq^&3&29fXM{v6PJ4>T1DHKL%9jt}fZqR@8?k|+Odx>pD`NZ~59Q;J=8mALMSHyU^N
zACe&nKMx_b?uM9sju0bE0OP5WTZ?kM9Ir)U;uMF6=zKm+^Bnk`2#HymmUDFbvwJ9-
z={~*vMh8v#sfB|4;?xNHSrth5o3%s9_-^xv`TQg~M=hV(ovuCE4B4a)Rvt4T{s0@?
z0w)x&ZQRkDc9o(enKitYcU@Op)prV#*2&CuRx`cODN+nY(g@^i$c)Ptj;PukGUn8i
zu#=-pcBL^&x(ySvz#i@lYG#{0JWl$84kn#3PwoV8=-|&MmO60MDO}5O@wD)BYg!)3
z%0_hFmhFt^P)k|hBz_(R*Q(=eZm<yp0_N;L#^u{PN~k_|n6eWFj#IjDb7n`Cwz)o$
z8{$T+RNhwi#Z}d;$JRt>NPvDQ*UiTo6y3|bxgOU{=eGh~Y+91)=(2ZjPQ2`)W6mBw
zO8e`+A<JaDN>;Pgdn9JnF6#ga;9d2#$=`ek%mGj1gZ1McBs@(u#LTHWJ_o#z2l3$g
zo>PU}u=w7~$H)N*M!G>>ZLLz1@?(CSucN&*B|o(va}9)m{v5Z2j7isAH|PmSkn}6M
znH5ulAjgwLd4RC6v8@jhUJoGAaD69XDTF+5DM;J)tTmbV!WSNWBtQ=d-yoKQ=n>|t
zjj~v~pa$`n$|`!X1GcR7R6_E5C7g^S7irHgn(t*%y*6&pl<T9>c0oK=@?D#Ql*Czo
z#b`H(rMLC<eqAZo<q4Y=#4d9SqHp=Zq>Y?aP+aYnh8uSX!94_bCpa|j?!g^`JB<V<
zIKhHLa3@IP8r&PVpg|kA;4nE;HS?d7I`hxjyY|IbwZEs<#gcd3ys7ewrb4F*9>TV3
z=7PH`c?#!CeikHZ0o(k+3~&Lx4C$VmrZOOWn%@2MO-hG8%EI|-(B8I0R(Wz5?W>ue
zgd$c33?K!^oHv?QL-vF+D0ZuuUB3!~cEp0}%&DWFz6Tl~36RJF*)Y4&?!O{Bbx%Rn
zs_*!1C?ERlJX=|92%D?XG2>NzT2Agk$*RkIYg^YVimmXBZi;<jJ{O+}ZoTV97w5C{
zca)T=O8vI@I8w;G=*ohpnl@uE<d9?$OJoAd_d?SJnyqEy_A4V!@C?&t7l+ni=xkbv
zWtRG~N4ESUQ$-!!<F@o2#ji$6YL(Y_<rN{iI>H7+E(_s0g^5(`{W#7cp!I%2i{PVI
zcyW>9AD=$yl%iIr`@tI5wAbIbl2&-`n!WAP2LCi@LHf|;W64Su1!zV~c764{_2hcf
z@<B```|!AwVn$ky8|7`d6Fp5V5J!$b!}YF@46CoVmu|A9g;vkFl?lA{X+fM%7(%L?
zYn64r5k?@8!oPn`tN77-K-DOtRmPIAQOW&9Z54ErKLuRf5zc<QkwL$QjEWd3`hG2A
zKIsRl!}%wKR_Tz@p+>u!Lu@iQ*;kOlTRU|{V|b<rKf|-0a1_M+X0n$C%8N)*QBQSi
za^s5Yvu0U7L6EwsF8O{dNPchiI4#-gbN&oYeZ3@i_HJ<+GX8Za2>XahD4b`nLD{Sh
z&ZlsQQ$Wo*mum<CR52J%`+|bnvoe0Nrmtv8@bSG)6+dxxa<-fTu;tdMo31_~OmBQq
zG4MdU_dS@JPUdxxd4}kTV~LP{ZA<6DIQhaNyW%c3kA6^6J;l^j!V0hwX9W`b2GjGR
zl+_4KcYqxjv{x1EZPm)uOfL2UE|H1HaWugC%KN@^zxUu#6Z-|wGU{{Sl<J2Y{?u&9
zqTMS4a8Pe2?36m{`O-<s(}2{D7lKW`pZYP@15ERTE;)6Lq303vA!O{`q60?j;)q&T
z>)V-3wB0%xL=@j~5Sp`Bijx!M<f7C1(+y3B19d>{T`oF4wHY0XNIs-xWpo#`e*BPN
z*s=TiriEyI8_D1*zk?_|Z9JRK<*=u`d*SRLG7~iooq4V}Qyrhna;S``#)^;=$8h8(
z)PF2xg|5DYUJ7S^?cttyE-OlBt+V;0H6_mFSWuWHmM%n8aCn>x_)AxHA2#VtXTC~g
zvO8b^$1;3iE{F=-otb8-wibD9ja8>s>ldsS!l$_b^P){0)$f2ABTH#^_7Zekd8IIO
z(6-d+FpmLL^gjHi2Ty+*U!4!IGD4n5klddqJHeA>BPNBj*=*Z170}g=B21R^&H4A9
z8Z~ti4o}hD=}_(D83XpJqJ0ak8<8qA=c7~v0Ws9ci5LbzUrq~4nzocFbUyitAKkWb
zo*zj~${X~J)$&zZ{+ij`|1@TpZoolA`WZ9ES)opclBC{#w$nXyuBYFJoqXBKmkfUs
zIHT4qanaa}WDB5lvF7d+#ylD7<uR{)cufp1Qa3{SRkF}-^jT&sbhG@mU7{z4;dk!h
z3QT=PleNUTHC^va_g##vBhTS@$`ORgWTHg%n@buK)U*<~p4o8eC(DDN_8csDft)$a
zTB0Rb{E)K=;{gB9rCi)z6J7HyMQ3*xM=?ww*oPNMqqqZCW|;^nGsinNexC#B*FTaL
zC`|KBw^^#eb`#V%i27RY>jEE&jfRbg$+#(WD!J%A55Y*(ssOj}_{G-b;X+wdSVt?d
zmyV+GA<K@F6WRfe6jDYAOC&9d71enXclsDRsVfu7Y=)-dux`!>@f5L+r30=OyB24V
znWQZq{i}NGQ@(-^k$$n%q&xnj#TjT0M>{t6NA~yj1|Zwf(oxa*mFhea$YH2zvCkXf
zbit&n&4Fi^W}YZ4;n^P)MjgH%Vi%Dzg+w!rs8<R#pj4T&R+qimW4w_@P80AB=EfSM
zIqT1DI$eUkPrEubYh-p$exP5x>xRDH`%XN&RleNB%Rt-ez1ArPkPkjfN7Xy;qa{Er
zoDH2GVC0hQHf-Y!!q#ACtm{+;lNBbLotsy9I9OafgHej<FJ{8L8-;RebIza<wU+@E
zf-SizF4e2%hw^g`5cHy04>#3sm_=kMlkTe-q-^RVk3SQm?}K$+n=K}>g<TXs(?XVo
z(XokPfT!l<Nvd>}^*yRCqJpU;#8ygblM^i`eM&jeU;AA5j&_%kCh!}WWC+~tIcw!K
z4vNmXt-*s=KwcfB%2ytlicI9`m3j+T0*QE4gB(;MS%Cx9y!(%!m{UnrmXsfeN^lcX
zag5&29zJ>e*4+0g&Q7}|SNl<C76?wj>aeA~o%*_N3xpA74wtFo?ZP?F-T5|#oRAL(
zl8^Y?zpy_bM`D_)O;9zomFXLY&;j`ctOBpiQk@ybXtClPM1A6iWnxcZ22`t&<H;(;
zA{dU8skurD+jHp#Gw{Hwlm%vrj<~4y-#KO&nXqZ${Dt}kmz|$<mvz&NFv}g-shP8B
zCE`2wn`0N*wi{wFO+jus*{ObccO0)`a+uxCKmeWOz0jIr@8F2p_cZZ|HYE))gFhbw
z&(CV6)rrxJzlV;zrea`5C57^z^x^D}<~b;+uKvho8Ft)h(&yIC!@5sWh&mhX`<`RC
zkm4?G#sYye^!YSpICg{9Y7At}O*9=eUc+KD<U?&h05ugTObm%*T712h@NeZ&hs?^Y
zF=bxA?U{MKBK_8ZVk!=a=W{()g#csdNyz-ghxbEd-b7bx5<NOca?}Lc^QMhEZydf=
zVV9VMhsVBamAP{TDi1_U$*qm9Exf_a9gbOZs8#v#GuuOxEogEzrORgTuuVdkVhM_)
z<@Jd3iz3Oo!7u!*;R^#1-8kQvjq73jR*;PH{1ACQO^~Ru&yo)jS7XreiKQp`>S$(M
z-DI39$J(sIh2d4weRMSgLI?ySh*`eXc%Fie*Co>GAkM_8VjMZb>b0f_w~zrkQVC(t
zx;F|N&Acz8kzL!<F1CU1{smJzo(E%7G56pa!~{u&RnMiVsdP%<`669Hr^h=;ueXO9
zNt{0)r+&<zgU%G|;5tOGly9M{?_%$$R$SaLA{l6@^U<tkIo-=6F?e%F$hi#GWw$%P
zLXZbrt0zTt;_}THNA)@)*VyL3*ChX{OCnh_=T@j~R+;s~ww9a`8lFxAG~ZZoNHPZ|
z@VpPvI6kl^rHKFDt=8mLQP~+4M0wCX7Y(g@AdFl#Pk)b2Px*0=6`j19x!F%8GKO38
zGyQW%x6RP9&pXrypF~3g^NV29MZ%i4U&H|>c?<$Y)mA-*o@IgoREeUhoGm@r4HT@(
z!Ku>(4_A>N>}1?gnzBB5Ar-cz9{(!8rlM|>N@8Sa;r_aj${x*GS%h1h*y$Ssrz?8{
z^<v5vQ{xQKAaONbmc7<nCUYx@@;2y=+R7zhARk6o1|eEPK-(4<8!vbhMG_WV$&n0S
zO1U`}_ADc`J7orn9uw%o$=okLF<E)7AUb84+_oIhI2rrfVX82!sEtk2u7+6JH=XVo
zFU66s^y8+pRB3ko=pHIY$}E<~+o3s;!7=#i3<5D?#|6t`JKT3l2tl@Y)_oQmMjg?Z
zHL+djJ!LxqdmI5dDA=`!)|f|!6<eJvZEas@tU23+KI2kPvhv3RF%02p$)iit$JP(S
zV<?lUu;5-5uxF&7)J;P4pJ~cQ6}Z)J4pAI-9=<4Q3rReGr3v%5C<0Sm-fq9Zss67M
zmSqB~j9CnB&pj*v0FMX&(EpPY77GU}H!C}<g{_-Ai>;%T6Pu)zhJ?DDs-~QZGOMeb
zyN9Ns(=7WdznhxHLHwf6`*;bez~FM(lvm>Ur$b7-kscy~mB($PUDij`gFuDChlK3x
z>~yjR7nAAfczxKJiKgK#87KaP$UXr@Tw$_4$zojHQk>puFb+>Z(@ZtZ2U4b=Zxu>N
zFv05afu#L6`ChZG5l><fz`-AM$BX^JERRe?o2qKk{AzrJAIiA=U(@F16F*XNrM>&P
zA)!aRu9hYqTj#G7&t?PR^`2(9&yFjenpZBj9?Yj&M7JND=0#X72$guoupACeIQt^i
zZn1V0btcxaWQ|y<?J#f*<~gR&gFG`>*sasCdt9Bv87`cnGCn&(4;dFk3+!M?BSLPS
z(crdB3~U>^Ly_TGmY{S~oO4(GqvB9@?<4C;(gH%|Fzz^`t&z<})w6s@YglLUrzk;4
z?K_roZhU%n*&Z_8Rr^h81p66uT#hr<z=9myVv+9<y3sJ3srnK6!ra=beUwW^3<A4v
zLygQ8?ZWPar%}G%X#VNM$FG8^<R64sEWSP{)TREQ=XpQ!d`p&ec~UO-HVrNoL6@Z)
zFU>x^`Q*?Z*zq-5Zwatk1RUEGN@m?f7R{4P3L{WQjgw#8qCcad&k08&sIpx|z@<hK
zmU_y!T`EI8PUX-i*<hbph-iCo5<NNejsa+RMQ0CW@Re0u?p10L`qjyXf62cQGR)+h
zf=hn0fUVi?TQghXv)9@=Z0vNgu<}~M0wy!_-h-#aG|6~n_Fdk^20K66+&9H1rEN9Z
z4OeAeZbWIM?_8|s+i3%!ER*-Zw0D<t=WcrZGy!E?R8Q7){Wb<4^|RIXV49klGxmY~
z8Ts5!8>oRFd!edwdW|R`5%W5`-51EzHcogZTZYgD=jPmMv<vaLrIdL($AwX~kSS?A
zFOR|FxY}e8vKmYILI}p?zFDXIgt8}HKty089~?jT8$dEJo=W|*aPnQS0MD^vXPvek
zzpPv4vV!Qk>_(W|usWMb)nJ)>fK)cHf*?>iE7k3ZjWlQdU+d?aGkVSq3;@82007Yb
zUHv#%x|>><x|_1vxj8w;CiTQEv%d;A?jI>jk^f$2&*TEN^Qw4Tg~})^tcjfNjqGSH
zSVvcge14McBCeovJ)V9ibUArC%wOSw!Yjs$vvd)PWZge<T$@DRN4KC)qo#4>k+&8(
zCXZu#P$7LUVg;c2?CJ|o@oDdon!>Fd7R@OCl5~ZE%z1?jV0UhnrBZx%%OdfWNBVvy
z_S3XlU%6Tp3-U>U1C3qBWz1A;acZ;Inj{TxxFcwNXQor|QG8lyN^H|@zHh7LZA&Y;
z_}Ww8>!vCS*jz)=b(mU|`utLE@?}Hi;Hc{!BBIV={m;Db4an&0(7@`|_87W9>VW<X
z2w$&Sdw_G7qtJsxzm^=f&TSEsb}fPEI?3IxT&`2-+DfYXJzpSY5$X36^LO0jK?2k0
zP4QDqI6AgVmTsF+(al-@8nf$<<o4gb#2-1kC%Zj^-nP|agn-e3r#wC+(L%l0b_-{D
zW?`>a-dJ&+zmYaO$hK3+0q6Bq$4MC<srgz{DgVF`4n5>@Q(!9)iyYLp{YK*)P&zS=
zOq3dj6Fp}j#CxSJ(+XU-t!TCJzV>$0E(tWbmp4=PCvkNA%<$UC#}?hKW?H+da>FV9
z1;;O=(DWv9?!v-3168Cj_*A0@E0XKxqZz9A7u4eAZ0Jw_)1S*ct=p%fz8>`_OS=~&
zf2EGu@6^G5UK#&~`5+45|4AKpCud`OOHWICR(EfA1!j3RS!PD%9azA>W?}@_M<?Uo
zC&%9(`QPDmWTm7O(I#b;#-}h8SQsb9ChOJNXSp_9RmK%q<e7)r>eOZBhnZO;*^tWA
zAnXt>&M7X)HtNVE+tfAlJO(|B{P?h9ojN@OqtXtloMMwYeJS_!_~@j<oYGiDXe1$(
zWb+@P(YC4%YQO^k`=|f_<==&-B&7+I1Zo0Pv{xK|@V@fj(>a?$@dPW8mUO>mfwr>R
z%_^Z+PKn?*a3>;b6w0eJ9iIAzC;r+h6axnygTuMpCeqQak)*UrOXoi(Vl6LK`Q`f4
ziByC)s^67si6rnXu31u;ta>OFJbp{TlBmp1Y3Y4w)Fp9{tBYt%;l3aKnQ%MK)8MET
z=Is&Vu;|E}66bM~+~aVm+a?{>mCW#}$8k4?#ATJTVSVI0FiS;oa$%O<p^@{K=yj5%
zQojh3?2p4N`#iYjY$o#>p<!b~>mFR8ZFlKMWr<Ti>^Mzp){E}2M@2ayLOg{%64IuS
zW)4PpLp#_JV;hwLFvb$Sms&sT(6P4BFxc;`df#=THE44flD=NG`r*|6BBVFAzNbUL
z)tYK47}aMLFT-Bh&v_)GE-O3R`#h4ZP0(kxaqW1s^~u;SOZq-|@mqde8>OV(KmtHR
zb=28jNDwnMMMtR@^JYYw4C+7Dx<UWZx9jY2XZm)@H6ANkxEkNr&*13%Nxg`@T|sz_
z<(IBOSO0ahpH{rg0yGOF;+F`KEG78|0Zi`@AMV?N90pl3nlkpGeT!2M>ZSAcFXSQG
zX`A*$$g#kyq7eoQ^C8bZ1~f)fthySlZ6PvirCQ;q8Cw-o8vYR&@tWArMb!cT4?|q=
zAyJPF{9ppPg3btgD7xc=VnB2VXOG;Rl>Jbto8{OW#yX*9F^wc!jb+wv0T>9+B-2!6
z;t@65zZ+Gi{abR2qMMk&zA>eh4$fA-Y1o^?Zb-4+<1O5cX;f4V{d3e)S8zETZba~H
zj|kKS#wPQ%lBu{P{7&@U^3b=uNBHs@vZKm$8a|0K2)OFfW#Ehf=xpRi3?t^VtpGiP
zooyF(iJ&J!&db9roXGt;fLiNeH2Ntx0++8Gm<MHn@2^%C!^usThJC_YPVp1(Q2&lX
zOwEaKm%bLzE|vu13u|w-O_suG?*?z#eI*#-8u>9m>3LUg;qM$Re|RKt+P=4vPxkH*
z*BgO)lA57{GxbedG67XRal1zF(D+gb^F0D6Ffy@u5^{2M_Ev}}2DSsHPvSf;pNI{q
z0lTqN<%mu>$uh-+z&jQ~D`uK_<Mpm7*Q-g-FA|y7k(M7k<?`xqW>T(PwQVAgD@(;s
zrR|VYs{sk;$^#y^Jreocv%!StvWDsTngdK()8EwItZn|z;DTd~Q2d9U=0uwNairUu
z_y943tqDY#c2Q)?bK8<%g^OT4L9s?$Q|=4stuM&cPmlP?o#~}_y5GHKLS?YjJP3_B
zT1Y^QLx95)P8)DlVI8LarB-p{l8cc^`q8V1)F5K(B7ZZn1a%T>)F4r@UTKkO7Zaeu
zG^vrfrc8e@S~Y=zou8&V8G>=X-QO&)Oxt!<4Gh6ggK;DVh$ZWTy+t=Xe`;%#EtC`%
z?WXWZ{FEl1v6#^LDGkdyMssJ6s?DcZ<l#2Uu@5B)!b~e}2_VDF{Rs1~9ch}un9K6_
z*cSLLeJTE~BdJSCsHjW&Lq<LG*#U?f{*wop@U$odrW|PSxIo|=&EtV2>`%J5)WB~l
zqV<Gr+X$U6;)3(jaRjap@Q;eM#V_H;kIpsTM}6^b8rK+{{_kpMQf+0k-0@flp6#;0
zeZlC2w9?QAlBXJ3S#3-DJv;(+52j4x1#w6gDx<Ntn=iutrO!J_2X^}${{tuK#hU0l
z0?vzYe{1PbtQd>3Q!;1=LPGF0%E!HyllvY0c=!|4X#scY*7Bz^u#}Kh5V<3N89#o$
zFpGb&0VD?|bOW9#<CiW$e12*_y^)aVTy^vvtWn6Svx>_`RY6}+?pDBA<1l9v%b_4)
z-(as!5Py)9ff+x3t&!uE%VD9OEzgo(z4dmE+@?$W30dha9kG!(LjQDvRz3zspfzny
z9@#r^(p+j~zUs-X%H_|5*LC>|4$q1|IF&jSsWIR8lBe7z%k8LR`wxdlM`8qWdqC6s
zz%Q|g8&Ah<stPc$xN!fsN$>wW4MBi^we0=pi~nw?`RgL8!hgQu{7L;&>HS5OSN>0R
z-#;_|odo!c8K(N53W7i5{8I<~#hm>+=6|b#KUsec?!Q=0YX89){}cCT)%}Ho(f)sH
WP*ni|@gF}U{eCHa0}6Ehar!UP6A?xL
deleted file mode 100644
index e2be1055f375447e667e34ce2ce018ec41a12221..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..cff6237a14ef4f3639c5b505ae7c79580313e286
GIT binary patch
literal 1188805
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