23245653 Deliver libpeas 1.16.0 in Solaris
authorNiveditha Rau <Niveditha.Rau@Oracle.COM>
Sat, 25 Jun 2016 00:44:31 +0000
changeset 6335 8129e14951cc
parent 6334 0df352371b20
child 6336 6ba7729e5c3a
23245653 Deliver libpeas 1.16.0 in Solaris PSARC/2016/408 GNOME 3 Miscellaneous Libraries
components/gnome/libpeas/Makefile
components/gnome/libpeas/depend.mk
components/gnome/libpeas/libpeas.p5m
components/gnome/libpeas/patches/01-lua.patch
components/gnome/libpeas/patches/02-lua52.patch
components/gnome/libpeas/test/results-all.master
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/gnome/libpeas/Makefile	Sat Jun 25 00:44:31 2016 +0000
@@ -0,0 +1,100 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+#
+
+BUILD_BITS =            64_and_32
+# All components using gobject-introspection must be built with gcc as
+# gobject-introspection does not produce correct results when using Studio.
+COMPILER =              gcc
+include ../../../make-rules/shared-macros.mk
+
+COMPONENT_NAME=		libpeas
+COMPONENT_VERSION=	1.16.0
+COMPONENT_PROJECT_URL=  https://wiki.gnome.org/Projects/Libpeas
+COMPONENT_ARCHIVE_HASH=	\
+	sha256:b093008ecd65f7d55c80517589509698ff15ad41f664b11a3eb88ff461b1454e
+COMPONENT_BUGDB=        gnome/libraries
+
+TPNO=			25272
+
+# Needs pygobject3, not available on S11.
+ifeq ($(BUILD_TYPE), evaluation)
+BUILD_32_and_64=
+INSTALL_32_and_64=
+PUBLISH_STAMP=
+endif
+
+include $(WS_MAKE_RULES)/gnome-component.mk
+
+# Only build Python 2.7 support; most of GNOME still uses Python 2.x.  Building
+# both would lead to the possibility of both Python runtimes being loaded into
+# the same process space (not a good idea).
+PYTHON_VERSIONS=2.7
+
+CONFIGURE_ENV.32 += PYTHON=$(PYTHON.2.7.32)
+CONFIGURE_ENV.64 += PYTHON=$(PYTHON.2.7.64)
+
+CONFIGURE_OPTIONS += --disable-static
+CONFIGURE_OPTIONS += --enable-gtk
+CONFIGURE_OPTIONS += --enable-lua5.2
+CONFIGURE_OPTIONS += --enable-python2
+CONFIGURE_OPTIONS += --disable-python3
+CONFIGURE_OPTIONS += --enable-shared
+CONFIGURE_OPTIONS += --with-pic
+
+# Assumes GNU xgettext in PATH
+CONFIGURE_ENV += PATH=$(GNUBIN):$(PATH)
+
+# Required due to patches.
+COMPONENT_PREP_ACTION += (cd $(@D); autoreconf -fiv);
+
+# for the tests
+unexport SHELLOPTS
+COMPONENT_TEST_MASTER = $(COMPONENT_TEST_RESULTS_DIR)/results-all.master
+COMPONENT_TEST_ARGS =   -k -i
+# Strip pids from test output, since they're always different
+COMPONENT_TEST_TRANSFORMS += '-e "s% (pid=[0-9]*)%%"'
+COMPONENT_TEST_TRANSFORMS += \
+        '-n ' \
+        '-e "/TEST:/p" ' \
+        '-e "/PASS:/p" ' \
+        '-e "/FAIL:/p" '
+
+# Delete this when build servers are installed with pygobject3
+PYGOBJ_BASE = $(WS_COMPONENTS)/gnome/pygobject3/build/prototype/$(MACH)
+PKG_CONFIG_PATHS.32 += $(PYGOBJ_BASE)/usr/lib/pkgconfig/
+PKG_CONFIG_PATHS.64 += $(PYGOBJ_BASE)/usr/lib/$(MACH64)/pkgconfig/
+PKG_CONFIG_PATHS += $(PKG_CONFIG_PATHS.$(BITS))
+
+CONFIGURE_OPTIONS += PYGOBJECT_CFLAGS=-I$(PYGOBJ_BASE)/usr/include/pygobject-3.0
+#end Delete
+
+REQUIRED_PACKAGES += developer/documentation-tool/gtk-doc
+REQUIRED_PACKAGES += developer/documentation-tool/xmlto
+REQUIRED_PACKAGES += library/desktop/gdk-pixbuf
+REQUIRED_PACKAGES += library/desktop/gobject/gobject-introspection
+REQUIRED_PACKAGES += library/desktop/gtk3
+REQUIRED_PACKAGES += library/glib2
+REQUIRED_PACKAGES += runtime/lua
+REQUIRED_PACKAGES += runtime/python-27
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/gnome/libpeas/depend.mk	Sat Jun 25 00:44:31 2016 +0000
@@ -0,0 +1,1 @@
+gnome/libpeas: gnome/pygobject3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/gnome/libpeas/libpeas.p5m	Sat Jun 25 00:44:31 2016 +0000
@@ -0,0 +1,161 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+# Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+#
+
+<transform file path=usr.*/man/.+ -> \
+    default mangler.man.stability "pass-through volatile">
+set name=pkg.fmri \
+    value=pkg:/library/desktop/[email protected]$(IPS_COMPONENT_VERSION),$(BUILD_VERSION)
+set name=pkg.summary value="A gobject-based plugins engine for GNOME"
+set name=pkg.description \
+    value="libpeas is a gobject-based plugins engine, and is targeted at giving every application the chance to assume its own extensibility."
+set name=com.oracle.info.description value=$(COMPONENT_NAME)
+set name=com.oracle.info.tpno value=$(TPNO)
+set name=info.classification \
+    value="org.opensolaris.category.2008:Desktop (GNOME)/Libraries"
+set name=info.source-url value=$(COMPONENT_ARCHIVE_URL)
+set name=info.upstream-url value=$(COMPONENT_PROJECT_URL)
+set name=org.opensolaris.arc-caseid value=PSARC/2016/408
+set name=org.opensolaris.consolidation value=$(CONSOLIDATION)
+file path=usr/bin/peas-demo
+file path=usr/include/libpeas-1.0/libpeas-gtk/peas-gtk-autocleanups.h
+file path=usr/include/libpeas-1.0/libpeas-gtk/peas-gtk-configurable.h
+file path=usr/include/libpeas-1.0/libpeas-gtk/peas-gtk-plugin-manager-view.h
+file path=usr/include/libpeas-1.0/libpeas-gtk/peas-gtk-plugin-manager.h
+file path=usr/include/libpeas-1.0/libpeas-gtk/peas-gtk.h
+file path=usr/include/libpeas-1.0/libpeas/peas-activatable.h
+file path=usr/include/libpeas-1.0/libpeas/peas-autocleanups.h
+file path=usr/include/libpeas-1.0/libpeas/peas-engine.h
+file path=usr/include/libpeas-1.0/libpeas/peas-extension-base.h
+file path=usr/include/libpeas-1.0/libpeas/peas-extension-set.h
+file path=usr/include/libpeas-1.0/libpeas/peas-extension.h
+file path=usr/include/libpeas-1.0/libpeas/peas-object-module.h
+file path=usr/include/libpeas-1.0/libpeas/peas-plugin-info.h
+file path=usr/include/libpeas-1.0/libpeas/peas.h
+file path=usr/lib/$(MACH64)/girepository-1.0/Peas-1.0.typelib
+file path=usr/lib/$(MACH64)/girepository-1.0/PeasGtk-1.0.typelib
+link path=usr/lib/$(MACH64)/libpeas-1.0.so target=libpeas-1.0.so.0.1600.0
+link path=usr/lib/$(MACH64)/libpeas-1.0.so.0 target=libpeas-1.0.so.0.1600.0
+file path=usr/lib/$(MACH64)/libpeas-1.0.so.0.1600.0
+file path=usr/lib/$(MACH64)/libpeas-1.0/loaders/liblua52loader.so
+file path=usr/lib/$(MACH64)/libpeas-1.0/loaders/libpythonloader.so
+link path=usr/lib/$(MACH64)/libpeas-gtk-1.0.so \
+    target=libpeas-gtk-1.0.so.0.1600.0
+link path=usr/lib/$(MACH64)/libpeas-gtk-1.0.so.0 \
+    target=libpeas-gtk-1.0.so.0.1600.0
+file path=usr/lib/$(MACH64)/libpeas-gtk-1.0.so.0.1600.0
+file path=usr/lib/$(MACH64)/peas-demo/plugins/helloworld/helloworld.plugin
+file path=usr/lib/$(MACH64)/peas-demo/plugins/helloworld/libhelloworld.so
+file path=usr/lib/$(MACH64)/peas-demo/plugins/luahello/luahello.plugin
+file path=usr/lib/$(MACH64)/peas-demo/plugins/secondtime/libsecondtime.so
+file path=usr/lib/$(MACH64)/peas-demo/plugins/secondtime/secondtime.plugin
+file path=usr/lib/$(MACH64)/pkgconfig/libpeas-1.0.pc
+file path=usr/lib/$(MACH64)/pkgconfig/libpeas-gtk-1.0.pc
+file path=usr/lib/girepository-1.0/Peas-1.0.typelib
+file path=usr/lib/girepository-1.0/PeasGtk-1.0.typelib
+link path=usr/lib/libpeas-1.0.so target=libpeas-1.0.so.0.1600.0
+link path=usr/lib/libpeas-1.0.so.0 target=libpeas-1.0.so.0.1600.0
+file path=usr/lib/libpeas-1.0.so.0.1600.0
+file path=usr/lib/libpeas-1.0/loaders/liblua52loader.so
+file path=usr/lib/libpeas-1.0/loaders/libpythonloader.so
+link path=usr/lib/libpeas-gtk-1.0.so target=libpeas-gtk-1.0.so.0.1600.0
+link path=usr/lib/libpeas-gtk-1.0.so.0 target=libpeas-gtk-1.0.so.0.1600.0
+file path=usr/lib/libpeas-gtk-1.0.so.0.1600.0
+file path=usr/lib/peas-demo/plugins/helloworld/helloworld.plugin
+file path=usr/lib/peas-demo/plugins/helloworld/libhelloworld.so
+file path=usr/lib/peas-demo/plugins/luahello/luahello.plugin
+file path=usr/lib/peas-demo/plugins/secondtime/libsecondtime.so
+file path=usr/lib/peas-demo/plugins/secondtime/secondtime.plugin
+file path=usr/lib/pkgconfig/libpeas-1.0.pc
+file path=usr/lib/pkgconfig/libpeas-gtk-1.0.pc
+file path=usr/share/gir-1.0/Peas-1.0.gir
+file path=usr/share/gir-1.0/PeasGtk-1.0.gir
+file path=usr/share/icons/hicolor/16x16/actions/libpeas-plugin.png
+file path=usr/share/icons/hicolor/22x22/actions/libpeas-plugin.png
+file path=usr/share/icons/hicolor/32x32/actions/libpeas-plugin.png
+file path=usr/share/icons/hicolor/scalable/actions/libpeas-plugin.svg
+file path=usr/share/locale/an/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/ar/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/as/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/ast/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/be/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/bg/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/bn_IN/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/bs/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/ca/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/[email protected]/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/cs/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/da/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/de/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/el/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/en_GB/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/eo/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/es/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/et/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/eu/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/fa/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/fi/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/fr/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/fur/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/gl/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/gu/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/he/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/hi/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/hu/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/id/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/it/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/ja/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/kk/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/kn/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/ko/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/lt/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/lv/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/ml/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/mr/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/nb/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/nds/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/ne/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/nl/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/or/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/pa/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/pl/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/pt/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/pt_BR/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/ro/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/ru/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/sk/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/sl/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/sr/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/[email protected]/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/sv/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/ta/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/te/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/tg/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/th/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/tr/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/ug/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/uk/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/vi/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/zh_CN/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/zh_HK/LC_MESSAGES/libpeas.mo
+file path=usr/share/locale/zh_TW/LC_MESSAGES/libpeas.mo
+license COPYING license=LGPLv2.1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/gnome/libpeas/patches/01-lua.patch	Sat Jun 25 00:44:31 2016 +0000
@@ -0,0 +1,2888 @@
+patch to use Lua 5.2 instead of Lua 5.1.
+
+Need testing before contribution to upstream.
+
+XXX file upstream bug
+
+--- libpeas-1.14.0/configure.ac	2015-03-24 00:54:51.000000000 -0700
++++ libpeas-1.14.0/configure.ac	2015-06-25 22:36:33.670913172 -0700
[email protected]@ -236,7 +236,7 @@
+ dnl Lua
+ dnl ================================================================
+ 
+-LUA51_REQUIRED=5.1.0
++LUA52_REQUIRED=5.2.0
+ LUAJIT_REQUIRED=2.0
+ 
+ LGI_MAJOR_VERSION=0
[email protected]@ -274,89 +274,89 @@
+   return success ? 0 : 1;
+ }])
+ 
+-AC_ARG_ENABLE(lua5.1,
+-              AS_HELP_STRING([--enable-lua5.1],[Enable Lua 5.1 support]),
+-              [enable_lua51=$enableval],
+-              [enable_lua51=auto])
++AC_ARG_ENABLE(lua5.2,
++              AS_HELP_STRING([--enable-lua5.2],[Enable Lua 5.2 support]),
++              [enable_lua52=$enableval],
++              [enable_lua52=auto])
+ 
+ AC_ARG_ENABLE(luajit,
+-              AS_HELP_STRING([--enable-luajit],[Enable LuaJIT for Lua 5.1 support]),
++              AS_HELP_STRING([--enable-luajit],[Enable LuaJIT for Lua 5.2 support]),
+               [enable_luajit=$enableval],
+               [enable_luajit=auto])
+ 
+-AC_MSG_CHECKING([for Lua 5.1 availability.])
++AC_MSG_CHECKING([for Lua 5.2 availability.])
+ 
+-if test "x$enable_lua51" = "xno"; then
+-    found_lua51="no (disabled, use --enable-lua5.1 to enable)"
+-    AC_MSG_RESULT([$found_lua51])
++if test "x$enable_lua52" = "xno"; then
++    found_lua52="no (disabled, use --enable-lua5.2 to enable)"
++    AC_MSG_RESULT([$found_lua52])
+ else
+     if test "x$enable_luajit" != "xno"; then
+         PKG_CHECK_EXISTS([luajit >= $LUAJIT_REQUIRED], [
+-            found_lua51=yes
+-            with_lua51=luajit
++            found_lua52=yes
++            with_lua52=luajit
+         ], [
+-            found_lua51=no
++            found_lua52=no
+         ])
+ 
+-        if test "x$enable_luajit" = "xyes" -a "x$found_lua51" = "xno"; then
++        if test "x$enable_luajit" = "xyes" -a "x$found_lua52" = "xno"; then
+             AC_MSG_ERROR([You need to have LuaJIT >= $LUAJIT_REQUIRED
+                           installed to build libpeas])
+         fi
+     fi
+ 
+-    if test "x$found_lua51" != "xyes"; then
+-        PKG_CHECK_EXISTS([lua5.1 >= $LUA51_REQUIRED], [
+-            found_lua51=yes
+-            with_lua51=lua5.1
++    if test "x$found_lua52" != "xyes"; then
++        PKG_CHECK_EXISTS([lua >= $LUA52_REQUIRED], [
++            found_lua52=yes
++            with_lua52=lua
+         ], [
+-            found_lua51=no
++            found_lua52=no
+         ])
+ 
+-        if test "x$enable_lua51" = "xyes" -a "x$found_lua51" = "xno"; then
+-            AC_MSG_ERROR([You need to have Lua 5.1 >= $LUA51_REQUIRED
++        if test "x$enable_lua52" = "xyes" -a "x$found_lua52" = "xno"; then
++            AC_MSG_ERROR([You need to have Lua 5.2 >= $LUA52_REQUIRED
+                           installed to build libpeas])
+         fi
+     fi
+ 
+-    if test "x$found_lua51" != "xyes"; then
+-        AC_MSG_RESULT([$found_lua51])
++    if test "x$found_lua52" != "xyes"; then
++        AC_MSG_RESULT([$found_lua52])
+     else
+-        AC_MSG_RESULT([$found_lua51 ($with_lua51)])
++        AC_MSG_RESULT([$found_lua52 ($with_lua52)])
+ 
+-        LUA51_BIN="$with_lua51"
+-        LUA51_CFLAGS=`$PKG_CONFIG --cflags $with_lua51`
+-        LUA51_LIBS=`$PKG_CONFIG --libs $with_lua51`
+-        AC_SUBST(LUA51_BIN)
+-        AC_SUBST(LUA51_CFLAGS)
+-        AC_SUBST(LUA51_LIBS)
++        LUA52_BIN="$with_lua52"
++        LUA52_CFLAGS=`$PKG_CONFIG --cflags $with_lua52`
++        LUA52_LIBS=`$PKG_CONFIG --libs $with_lua52`
++        AC_SUBST(LUA52_BIN)
++        AC_SUBST(LUA52_CFLAGS)
++        AC_SUBST(LUA52_LIBS)
+ 
+-        AC_MSG_CHECKING(for LGI availability in Lua 5.1.)
++        AC_MSG_CHECKING(for LGI availability in Lua 5.2.)
+ 
+         peas_save_CFLAGS="$CFLAGS"
+         peas_save_LIBS="$LIBS"
+-        CFLAGS="$PEAS_CFLAGS $LUA51_CFLAGS -I${srcdir}/loaders/lua5.1"
+-        LIBS="$PEAS_LIBS $LUA51_LIBS"
++        CFLAGS="$PEAS_CFLAGS $LUA52_CFLAGS -I${srcdir}/loaders/lua5.2"
++        LIBS="$PEAS_LIBS $LUA52_LIBS"
+         AC_TRY_RUN(peas_lgi_version_test(0),
+-                   found_lua51=yes,
+-                   found_lua51=no,
+-                   found_lua51=yes)
++                   found_lua52=yes,
++                   found_lua52=no,
++                   found_lua52=yes)
+         CFLAGS="$peas_save_CFLAGS"
+         LIBS="$peas_save_LIBS"
+ 
+-        if test "x$enable_lua51" = "xyes" -a "x$found_lua51" = "xno"; then
++        if test "x$enable_lua52" = "xyes" -a "x$found_lua52" = "xno"; then
+             AC_MSG_ERROR([You need to have LGI >= $LGI_REQUIRED
+                           installed to build libpeas])
+         fi
+ 
+-        if test "x$found_lua51" = "xyes"; then
+-            AC_DEFINE(ENABLE_LUA51, 1, [Define to compile with Lua support])
++        if test "x$found_lua52" = "xyes"; then
++            AC_DEFINE(ENABLE_LUA52, 1, [Define to compile with Lua support])
+         fi
+ 
+-        AC_MSG_RESULT([$found_lua51])
++        AC_MSG_RESULT([$found_lua52])
+     fi
+ fi
+ 
+-AM_CONDITIONAL([ENABLE_LUA51], [test "x$found_lua51" = "xyes"])
++AM_CONDITIONAL([ENABLE_LUA52], [test "x$found_lua52" = "xyes"])
+ 
+ dnl ================================================================
+ dnl Python
[email protected]@ -541,8 +541,8 @@
+ libpeas/Makefile
+ libpeas-gtk/Makefile
+ loaders/Makefile
+-loaders/lua5.1/Makefile
+-loaders/lua5.1/resources/Makefile
++loaders/lua5.2/Makefile
++loaders/lua5.2/resources/Makefile
+ loaders/python/Makefile
+ loaders/python3/Makefile
+ data/Makefile
[email protected]@ -595,7 +595,7 @@
+ 
+ Languages support:
+ 
+-        Lua 5.1 support               : ${found_lua51}
++        Lua 5.2 support               : ${found_lua52}
+         Python 2 support              : ${found_python2}
+         Python 3 support              : ${found_python3}
+ "
+--- libpeas-1.14.0/docs/reference/html/PeasEngine.html	2015-03-24 01:08:07.000000000 -0700
++++ libpeas-1.14.0/docs/reference/html/PeasEngine.html	2015-06-25 22:38:45.383523822 -0700
[email protected]@ -421,7 +421,7 @@
+                            <em class="parameter"><code>const <span class="type">gchar</span> *loader_name</code></em>);</pre>
+ <p>Enable a loader, enables a loader for plugins.
+ The C plugin loader is always enabled. The other plugin
+-loaders are: lua5.1 and python and python3.</p>
++loaders are: lua5.2 and python and python3.</p>
+ <p>For instance, the following code will enable python plugins
+ to be loaded:</p>
+ <div class="informalexample">
[email protected]@ -1163,4 +1163,4 @@
+ <hr>
+           Generated by GTK-Doc V1.21.1</div>
+ </body>
+-</html>
+\ No newline at end of file
++</html>
+--- libpeas-1.14.0/libpeas/peas-engine.c	2015-02-14 12:35:54.000000000 -0800
++++ libpeas-1.14.0/libpeas/peas-engine.c	2015-06-25 22:37:26.903865452 -0700
[email protected]@ -808,7 +808,7 @@
+  *
+  * Enable a loader, enables a loader for plugins.
+  * The C plugin loader is always enabled. The other plugin
+- * loaders are: lua5.1 and python and python3.
++ * loaders are: lua5.2 and python and python3.
+  *
+  * For instance, the following code will enable python plugins
+  * to be loaded:
+--- libpeas-1.14.0/libpeas/peas-utils.c	2015-02-14 12:35:54.000000000 -0800
++++ libpeas-1.14.0/libpeas/peas-utils.c	2015-06-25 22:37:15.839853373 -0700
[email protected]@ -29,11 +29,11 @@
+ 
+ #include "peas-utils.h"
+ 
+-static const gchar *all_plugin_loaders[] = {"c", "lua5.1",
++static const gchar *all_plugin_loaders[] = {"c", "lua5.2",
+                                             "python", "python3"};
+ static const gint conflicting_plugin_loaders[PEAS_UTILS_N_LOADERS][2] = {
+   { -1, -1 }, /* c       => {}          */
+-  { -1, -1 }, /* lua5.1  => {}          */
++  { -1, -1 }, /* lua5.2  => {}          */
+   {  3, -1 }, /* python  => { python3 } */
+   {  2, -1 }  /* python3 => { python  } */
+ };
+--- libpeas-1.14.0/loaders/lua5.2/Makefile.am	1969-12-31 16:00:00.000000000 -0800
++++ libpeas-1.14.0/loaders/lua5.2/Makefile.am	2015-06-25 22:36:33.459623339 -0700
[email protected]@ -0,0 +1,45 @@
++# Lua 5.2 plugin loader
++
++SUBDIRS = resources
++
++loaderdir = $(libdir)/libpeas-1.0/loaders
++
++AM_CPPFLAGS = \
++	-I$(top_srcdir)		\
++	$(PEAS_CFLAGS)		\
++	$(GCOV_CFLAGS)		\
++	$(WARN_CFLAGS)		\
++	$(DISABLE_DEPRECATED)	\
++	$(LUA52_CFLAGS)
++
++loader_LTLIBRARIES = liblua52loader.la
++
++liblua52loader_la_SOURCES = \
++	peas-lua-internal.c		\
++	peas-lua-internal.h		\
++	peas-lua-resources.c		\
++	peas-plugin-loader-lua.c	\
++	peas-plugin-loader-lua.h	\
++	peas-lua-utils.c		\
++	peas-lua-utils.h
++
++liblua52loader_la_LDFLAGS = \
++	$(LOADER_LIBTOOL_FLAGS)		\
++	$(GCOV_LDFLAGS)
++
++liblua52loader_la_LIBADD = \
++	$(top_builddir)/libpeas/libpeas-1.0.la	\
++	$(PEAS_LIBS)				\
++	$(LUA52_LIBS)
++
++loader_resources_deps = $(shell $(GLIB_COMPILE_RESOURCES) --sourcedir=$(srcdir)/resources --generate-dependencies $(srcdir)/resources/peas-lua.gresource.xml)
++peas-lua-resources.c: $(srcdir)/resources/peas-lua.gresource.xml $(loader_resources_deps)
++	$(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --internal [email protected] --sourcedir=$(srcdir)/resources --generate-source $(srcdir)/resources/peas-lua.gresource.xml
++
++EXTRA_DIST = \
++	$(loader_resources_deps)
++
++CLEANFILES = peas-lua-resources.c
++
++gcov_sources = $(liblua52loader_la_SOURCES)
++include $(top_srcdir)/Makefile.gcov
+--- libpeas-1.14.0/loaders/lua5.2/peas-lua-internal.c	1969-12-31 16:00:00.000000000 -0800
++++ libpeas-1.14.0/loaders/lua5.2/peas-lua-internal.c	2015-06-25 22:36:33.454040413 -0700
[email protected]@ -0,0 +1,160 @@
++/*
++ * peas-lua-internal.c
++ * This file is part of libpeas
++ *
++ * Copyright (C) 2015 - Garrett Regier
++ *
++ * libpeas is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * libpeas is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
++ */
++
++#ifdef HAVE_CONFIG_H
++#include <config.h>
++#endif
++
++#include "peas-lua-internal.h"
++
++#include <lauxlib.h>
++
++#include "peas-lua-utils.h"
++
++
++static gpointer hooks_key = NULL;
++static gpointer failed_err_key = NULL;
++
++
++static int
++failed_fn (lua_State *L)
++{
++  gchar *msg;
++
++  /* The first parameter is the Hooks table instance */
++  luaL_checktype (L, 1, LUA_TTABLE);
++
++  /* The tracebacks have a trailing newline */
++  msg = g_strchomp (g_strdup (luaL_checkstring (L, 2)));
++
++  g_warning ("%s", msg);
++
++  /* peas_lua_internal_call() knows to check for this value */
++  lua_pushlightuserdata (L, &failed_err_key);
++
++  g_free (msg);
++  return lua_error (L);
++}
++
++gboolean
++peas_lua_internal_setup (lua_State *L)
++{
++  if (!peas_lua_utils_load_resource (L, "internal.lua", 0, 1))
++    {
++      /* Already warned */
++      return FALSE;
++    }
++
++  if (!lua_istable (L, -1))
++    {
++      g_warning ("Invalid result from 'internal.lua' resource: %s",
++                 lua_tostring (L, -1));
++
++      /* Pop result */
++      lua_pop (L, 1);
++      return FALSE;
++    }
++
++  /* Set Hooks.failed to failed_fn */
++  lua_pushcfunction (L, failed_fn);
++  lua_setfield (L, -2, "failed");
++
++  /* Set registry[&hooks_key] = hooks */
++  lua_pushlightuserdata (L, &hooks_key);
++  lua_pushvalue (L, -2);
++  lua_rawset (L, LUA_REGISTRYINDEX);
++
++  /* Pop hooks */
++  lua_pop (L, -1);
++  return TRUE;
++}
++
++void
++peas_lua_internal_shutdown (lua_State *L)
++{
++  lua_pushlightuserdata (L, &hooks_key);
++  lua_pushnil (L);
++  lua_rawset (L, LUA_REGISTRYINDEX);
++}
++
++gboolean
++peas_lua_internal_call (lua_State   *L,
++                        const gchar *name,
++                        guint        n_args,
++                        gint         return_type)
++{
++  /* Get the Hooks table */
++  lua_pushlightuserdata (L, &hooks_key);
++  lua_rawget (L, LUA_REGISTRYINDEX);
++
++  /* Get the method */
++  lua_getfield (L, -1, name);
++
++  /* Swap the method and the table */
++  lua_insert (L, -2);
++
++  if (n_args > 0)
++    {
++      /* Before: [args..., method, table]
++       * After:  [method, table, args...]
++       */
++      lua_insert (L, -n_args - 2);
++      lua_insert (L, -n_args - 2);
++    }
++
++  if (!peas_lua_utils_call (L, 1 + n_args, 1))
++    {
++      /* Raised by failed_fn() to prevent printing the error */
++      if (!lua_isuserdata (L, -1) ||
++          lua_touserdata (L, -1) != &failed_err_key)
++        {
++          g_warning ("Failed to run internal Lua hook '%s':\n%s",
++                     name, lua_tostring (L, -1));
++        }
++
++      /* Pop the error */
++      lua_pop (L, 1);
++      return FALSE;
++    }
++
++  if (lua_type (L, -1) != return_type)
++    {
++      /* Don't warn for a nil result */
++      if (lua_type (L, -1) != LUA_TNIL)
++        {
++          g_warning ("Invalid return value for internal Lua hook '%s': "
++                     "expected %s, got: %s (%s)", name,
++                     lua_typename (L, return_type),
++                     lua_typename (L, lua_type (L, -1)),
++                     lua_tostring (L, -1));
++        }
++
++      /* Pop result */
++      lua_pop (L, 1);
++      return FALSE;
++    }
++
++  /* Pop the result if nil */
++  if (return_type == LUA_TNIL)
++    lua_pop (L, 1);
++
++  return TRUE;
++}
+--- libpeas-1.14.0/loaders/lua5.2/peas-lua-internal.h	1969-12-31 16:00:00.000000000 -0800
++++ libpeas-1.14.0/loaders/lua5.2/peas-lua-internal.h	2015-06-25 22:36:33.459029540 -0700
[email protected]@ -0,0 +1,40 @@
++/*
++ * peas-lua-internal.h
++ * This file is part of libpeas
++ *
++ * Copyright (C) 2015 - Garrett Regier
++ *
++ * libpeas is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * libpeas is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
++ */
++
++#ifndef __PEAS_LUA_INTERNAL_H__
++#define __PEAS_LUA_INTERNAL_H__
++
++#include <glib.h>
++#include <lua.h>
++
++G_BEGIN_DECLS
++
++gboolean  peas_lua_internal_setup    (lua_State   *L);
++void      peas_lua_internal_shutdown (lua_State   *L);
++
++gboolean  peas_lua_internal_call     (lua_State   *L,
++                                      const gchar *name,
++                                      guint        n_args,
++                                      gint         return_type);
++
++G_END_DECLS
++
++#endif /* __PEAS_LUA_INTERNAL_H__ */
+--- libpeas-1.14.0/loaders/lua5.2/peas-lua-resources.c	1969-12-31 16:00:00.000000000 -0800
++++ libpeas-1.14.0/loaders/lua5.2/peas-lua-resources.c	2015-06-25 22:36:33.463601041 -0700
[email protected]@ -0,0 +1,943 @@
++#include <gio/gio.h>
++
++#if defined (__ELF__) && ( __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 6))
++# define SECTION __attribute__ ((section (".gresource.peas_lua"), aligned (8)))
++#else
++# define SECTION
++#endif
++
++static const SECTION union { const guint8 data[6452]; const double alignment; void * const ptr;}  peas_lua_resource_data = { {
++  0x47, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 
++  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
++  0x18, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 
++  0x00, 0x00, 0x00, 0x28, 0x08, 0x00, 0x00, 0x00, 
++  0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 
++  0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
++  0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 
++  0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
++  0xf8, 0x38, 0xf2, 0x36, 0x07, 0x00, 0x00, 0x00, 
++  0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x4c, 0x00, 
++  0x08, 0x01, 0x00, 0x00, 0x0c, 0x01, 0x00, 0x00, 
++  0xb0, 0xb7, 0x24, 0x30, 0x03, 0x00, 0x00, 0x00, 
++  0x0c, 0x01, 0x00, 0x00, 0x06, 0x00, 0x4c, 0x00, 
++  0x14, 0x01, 0x00, 0x00, 0x18, 0x01, 0x00, 0x00, 
++  0x8a, 0x19, 0x92, 0xdc, 0x05, 0x00, 0x00, 0x00, 
++  0x18, 0x01, 0x00, 0x00, 0x0c, 0x00, 0x76, 0x00, 
++  0x28, 0x01, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 
++  0x4b, 0x50, 0x90, 0x0b, 0x04, 0x00, 0x00, 0x00, 
++  0x00, 0x13, 0x00, 0x00, 0x04, 0x00, 0x4c, 0x00, 
++  0x04, 0x13, 0x00, 0x00, 0x08, 0x13, 0x00, 0x00, 
++  0xd4, 0xb5, 0x02, 0x00, 0xff, 0xff, 0xff, 0xff, 
++  0x08, 0x13, 0x00, 0x00, 0x01, 0x00, 0x4c, 0x00, 
++  0x0c, 0x13, 0x00, 0x00, 0x10, 0x13, 0x00, 0x00, 
++  0x1d, 0xc8, 0x7f, 0x8a, 0x00, 0x00, 0x00, 0x00, 
++  0x10, 0x13, 0x00, 0x00, 0x07, 0x00, 0x4c, 0x00, 
++  0x18, 0x13, 0x00, 0x00, 0x20, 0x13, 0x00, 0x00, 
++  0x06, 0x53, 0xad, 0xce, 0x05, 0x00, 0x00, 0x00, 
++  0x20, 0x13, 0x00, 0x00, 0x0a, 0x00, 0x76, 0x00, 
++  0x30, 0x13, 0x00, 0x00, 0x28, 0x19, 0x00, 0x00, 
++  0xbf, 0x75, 0x9f, 0x49, 0x01, 0x00, 0x00, 0x00, 
++  0x28, 0x19, 0x00, 0x00, 0x08, 0x00, 0x4c, 0x00, 
++  0x30, 0x19, 0x00, 0x00, 0x34, 0x19, 0x00, 0x00, 
++  0x6c, 0x6f, 0x61, 0x64, 0x65, 0x72, 0x73, 0x2f, 
++  0x05, 0x00, 0x00, 0x00, 0x67, 0x6e, 0x6f, 0x6d, 
++  0x65, 0x2f, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 
++  0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 
++  0x2e, 0x6c, 0x75, 0x61, 0x00, 0x00, 0x00, 0x00, 
++  0xc8, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
++  0x2d, 0x2d, 0x0a, 0x2d, 0x2d, 0x20, 0x20, 0x43, 
++  0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 
++  0x20, 0x28, 0x43, 0x29, 0x20, 0x32, 0x30, 0x31, 
++  0x35, 0x20, 0x2d, 0x20, 0x47, 0x61, 0x72, 0x72, 
++  0x65, 0x74, 0x74, 0x20, 0x52, 0x65, 0x67, 0x69, 
++  0x65, 0x72, 0x0a, 0x2d, 0x2d, 0x0a, 0x2d, 0x2d, 
++  0x20, 0x6c, 0x69, 0x62, 0x70, 0x65, 0x61, 0x73, 
++  0x20, 0x69, 0x73, 0x20, 0x66, 0x72, 0x65, 0x65, 
++  0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 
++  0x65, 0x3b, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 
++  0x61, 0x6e, 0x20, 0x72, 0x65, 0x64, 0x69, 0x73, 
++  0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 
++  0x69, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 
++  0x72, 0x0a, 0x2d, 0x2d, 0x20, 0x6d, 0x6f, 0x64, 
++  0x69, 0x66, 0x79, 0x20, 0x69, 0x74, 0x20, 0x75, 
++  0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 
++  0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x6f, 
++  0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 
++  0x55, 0x20, 0x4c, 0x65, 0x73, 0x73, 0x65, 0x72, 
++  0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 
++  0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x0a, 
++  0x2d, 0x2d, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 
++  0x73, 0x65, 0x20, 0x61, 0x73, 0x20, 0x70, 0x75, 
++  0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 
++  0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 
++  0x72, 0x65, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 
++  0x77, 0x61, 0x72, 0x65, 0x20, 0x46, 0x6f, 0x75, 
++  0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 
++  0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x0a, 
++  0x2d, 0x2d, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 
++  0x6f, 0x6e, 0x20, 0x32, 0x2e, 0x31, 0x20, 0x6f, 
++  0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x69, 
++  0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, 0x20, 0x6f, 
++  0x72, 0x20, 0x28, 0x61, 0x74, 0x20, 0x79, 0x6f, 
++  0x75, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 
++  0x6e, 0x29, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6c, 
++  0x61, 0x74, 0x65, 0x72, 0x20, 0x76, 0x65, 0x72, 
++  0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x2d, 0x2d, 
++  0x0a, 0x2d, 0x2d, 0x20, 0x6c, 0x69, 0x62, 0x70, 
++  0x65, 0x61, 0x73, 0x20, 0x69, 0x73, 0x20, 0x64, 
++  0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 
++  0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 
++  0x65, 0x20, 0x68, 0x6f, 0x70, 0x65, 0x20, 0x74, 
++  0x68, 0x61, 0x74, 0x20, 0x69, 0x74, 0x20, 0x77, 
++  0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 
++  0x73, 0x65, 0x66, 0x75, 0x6c, 0x2c, 0x0a, 0x2d, 
++  0x2d, 0x20, 0x62, 0x75, 0x74, 0x20, 0x57, 0x49, 
++  0x54, 0x48, 0x4f, 0x55, 0x54, 0x20, 0x41, 0x4e, 
++  0x59, 0x20, 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 
++  0x54, 0x59, 0x3b, 0x20, 0x77, 0x69, 0x74, 0x68, 
++  0x6f, 0x75, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 
++  0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6d, 0x70, 
++  0x6c, 0x69, 0x65, 0x64, 0x20, 0x77, 0x61, 0x72, 
++  0x72, 0x61, 0x6e, 0x74, 0x79, 0x20, 0x6f, 0x66, 
++  0x0a, 0x2d, 0x2d, 0x20, 0x4d, 0x45, 0x52, 0x43, 
++  0x48, 0x41, 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 
++  0x49, 0x54, 0x59, 0x20, 0x6f, 0x72, 0x20, 0x46, 
++  0x49, 0x54, 0x4e, 0x45, 0x53, 0x53, 0x20, 0x46, 
++  0x4f, 0x52, 0x20, 0x41, 0x20, 0x50, 0x41, 0x52, 
++  0x54, 0x49, 0x43, 0x55, 0x4c, 0x41, 0x52, 0x20, 
++  0x50, 0x55, 0x52, 0x50, 0x4f, 0x53, 0x45, 0x2e, 
++  0x20, 0x20, 0x53, 0x65, 0x65, 0x20, 0x74, 0x68, 
++  0x65, 0x20, 0x47, 0x4e, 0x55, 0x0a, 0x2d, 0x2d, 
++  0x20, 0x4c, 0x65, 0x73, 0x73, 0x65, 0x72, 0x20, 
++  0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 
++  0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 
++  0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x66, 
++  0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 
++  0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 
++  0x0a, 0x2d, 0x2d, 0x0a, 0x2d, 0x2d, 0x20, 0x59, 
++  0x6f, 0x75, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 
++  0x64, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x72, 
++  0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 
++  0x61, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 
++  0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 
++  0x55, 0x20, 0x4c, 0x65, 0x73, 0x73, 0x65, 0x72, 
++  0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 
++  0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x0a, 
++  0x2d, 0x2d, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 
++  0x73, 0x65, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, 
++  0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 
++  0x69, 0x73, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 
++  0x72, 0x79, 0x3b, 0x20, 0x69, 0x66, 0x20, 0x6e, 
++  0x6f, 0x74, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 
++  0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 
++  0x20, 0x46, 0x72, 0x65, 0x65, 0x20, 0x53, 0x6f, 
++  0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0a, 0x2d, 
++  0x2d, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 
++  0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x49, 0x6e, 
++  0x63, 0x2e, 0x2c, 0x20, 0x35, 0x31, 0x20, 0x46, 
++  0x72, 0x61, 0x6e, 0x6b, 0x6c, 0x69, 0x6e, 0x20, 
++  0x53, 0x74, 0x2c, 0x20, 0x46, 0x69, 0x66, 0x74, 
++  0x68, 0x20, 0x46, 0x6c, 0x6f, 0x6f, 0x72, 0x2c, 
++  0x20, 0x42, 0x6f, 0x73, 0x74, 0x6f, 0x6e, 0x2c, 
++  0x20, 0x4d, 0x41, 0x20, 0x20, 0x30, 0x32, 0x31, 
++  0x31, 0x30, 0x2d, 0x31, 0x33, 0x30, 0x31, 0x20, 
++  0x20, 0x55, 0x53, 0x41, 0x2e, 0x0a, 0x0a, 0x6c, 
++  0x6f, 0x63, 0x61, 0x6c, 0x20, 0x64, 0x65, 0x62, 
++  0x75, 0x67, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 
++  0x75, 0x69, 0x72, 0x65, 0x20, 0x27, 0x64, 0x65, 
++  0x62, 0x75, 0x67, 0x27, 0x0a, 0x6c, 0x6f, 0x63, 
++  0x61, 0x6c, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 
++  0x67, 0x65, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 
++  0x75, 0x69, 0x72, 0x65, 0x20, 0x27, 0x70, 0x61, 
++  0x63, 0x6b, 0x61, 0x67, 0x65, 0x27, 0x0a, 0x0a, 
++  0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x67, 
++  0x69, 0x20, 0x3d, 0x20, 0x72, 0x65, 0x71, 0x75, 
++  0x69, 0x72, 0x65, 0x20, 0x27, 0x6c, 0x67, 0x69, 
++  0x27, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 
++  0x47, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 
++  0x3d, 0x20, 0x6c, 0x67, 0x69, 0x2e, 0x47, 0x4f, 
++  0x62, 0x6a, 0x65, 0x63, 0x74, 0x0a, 0x6c, 0x6f, 
++  0x63, 0x61, 0x6c, 0x20, 0x50, 0x65, 0x61, 0x73, 
++  0x20, 0x3d, 0x20, 0x6c, 0x67, 0x69, 0x2e, 0x50, 
++  0x65, 0x61, 0x73, 0x0a, 0x0a, 0x0a, 0x6c, 0x6f, 
++  0x63, 0x61, 0x6c, 0x20, 0x48, 0x6f, 0x6f, 0x6b, 
++  0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 0x48, 
++  0x6f, 0x6f, 0x6b, 0x73, 0x2e, 0x5f, 0x5f, 0x69, 
++  0x6e, 0x64, 0x65, 0x78, 0x20, 0x3d, 0x20, 0x48, 
++  0x6f, 0x6f, 0x6b, 0x73, 0x0a, 0x0a, 0x66, 0x75, 
++  0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x48, 
++  0x6f, 0x6f, 0x6b, 0x73, 0x2e, 0x6e, 0x65, 0x77, 
++  0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 
++  0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 0x65, 0x6c, 
++  0x66, 0x20, 0x3d, 0x20, 0x7b, 0x20, 0x70, 0x72, 
++  0x69, 0x76, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x20, 
++  0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 
++  0x74, 0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 
++  0x6c, 0x65, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2c, 
++  0x20, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x29, 0x0a, 
++  0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 
++  0x66, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x2e, 0x6d, 
++  0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x63, 0x61, 
++  0x63, 0x68, 0x65, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 
++  0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 
++  0x66, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x2e, 0x65, 
++  0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 
++  0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x20, 0x3d, 
++  0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 
++  0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 
++  0x65, 0x6c, 0x66, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 
++  0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 
++  0x6e, 0x20, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x3a, 
++  0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x28, 0x6d, 
++  0x73, 0x67, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 
++  0x2d, 0x2d, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 
++  0x69, 0x73, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 
++  0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x62, 
++  0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x6c, 
++  0x75, 0x67, 0x69, 0x6e, 0x20, 0x6c, 0x6f, 0x61, 
++  0x64, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20, 0x20, 
++  0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x27, 0x48, 
++  0x6f, 0x6f, 0x6b, 0x73, 0x3a, 0x66, 0x61, 0x69, 
++  0x6c, 0x65, 0x64, 0x28, 0x29, 0x20, 0x77, 0x61, 
++  0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x6d, 
++  0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 
++  0x64, 0x21, 0x27, 0x29, 0x0a, 0x65, 0x6e, 0x64, 
++  0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 
++  0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 
++  0x20, 0x61, 0x64, 0x64, 0x5f, 0x70, 0x61, 0x63, 
++  0x6b, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x74, 
++  0x68, 0x28, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 
++  0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, 
++  0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 
++  0x6c, 0x20, 0x70, 0x61, 0x74, 0x68, 0x73, 0x20, 
++  0x3d, 0x20, 0x28, 0x27, 0x3b, 0x25, 0x73, 0x2f, 
++  0x3f, 0x2e, 0x6c, 0x75, 0x61, 0x3b, 0x25, 0x73, 
++  0x2f, 0x3f, 0x2f, 0x69, 0x6e, 0x69, 0x74, 0x2e, 
++  0x6c, 0x75, 0x61, 0x27, 0x29, 0x3a, 0x66, 0x6f, 
++  0x72, 0x6d, 0x61, 0x74, 0x28, 0x70, 0x61, 0x63, 
++  0x6b, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x74, 
++  0x68, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 
++  0x70, 0x61, 0x74, 0x68, 0x29, 0x0a, 0x0a, 0x20, 
++  0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 0x6f, 
++  0x74, 0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 
++  0x65, 0x2e, 0x70, 0x61, 0x74, 0x68, 0x3a, 0x66, 
++  0x69, 0x6e, 0x64, 0x28, 0x70, 0x61, 0x74, 0x68, 
++  0x73, 0x2c, 0x20, 0x31, 0x2c, 0x20, 0x74, 0x72, 
++  0x75, 0x65, 0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 
++  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 
++  0x2e, 0x70, 0x61, 0x74, 0x68, 0x20, 0x3d, 0x20, 
++  0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 
++  0x70, 0x61, 0x74, 0x68, 0x20, 0x2e, 0x2e, 0x20, 
++  0x70, 0x61, 0x74, 0x68, 0x73, 0x0a, 0x20, 0x20, 
++  0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x65, 0x6e, 
++  0x64, 0x0a, 0x0a, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 
++  0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 
++  0x6e, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 
++  0x5f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 
++  0x65, 0x78, 0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 
++  0x6e, 0x28, 0x65, 0x72, 0x72, 0x29, 0x0a, 0x20, 
++  0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x46, 0x6f, 
++  0x72, 0x6d, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 
++  0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x65, 
++  0x76, 0x65, 0x6e, 0x20, 0x69, 0x66, 0x20, 0x67, 
++  0x69, 0x76, 0x65, 0x6e, 0x20, 0x61, 0x20, 0x75, 
++  0x73, 0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x0a, 
++  0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 
++  0x6c, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 
++  0x74, 0x65, 0x64, 0x20, 0x3d, 0x20, 0x64, 0x65, 
++  0x62, 0x75, 0x67, 0x2e, 0x74, 0x72, 0x61, 0x63, 
++  0x65, 0x62, 0x61, 0x63, 0x6b, 0x28, 0x74, 0x6f, 
++  0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x65, 
++  0x72, 0x72, 0x29, 0x2c, 0x20, 0x32, 0x29, 0x0a, 
++  0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 
++  0x74, 0x79, 0x70, 0x65, 0x28, 0x66, 0x6f, 0x72, 
++  0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x29, 0x20, 
++  0x7e, 0x3d, 0x20, 0x27, 0x73, 0x74, 0x72, 0x69, 
++  0x6e, 0x67, 0x27, 0x20, 0x74, 0x68, 0x65, 0x6e, 
++  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 
++  0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 
++  0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 
++  0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 
++  0x2d, 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 
++  0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6d, 0x65, 0x6e, 
++  0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x6f, 0x66, 
++  0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x66, 0x69, 
++  0x6c, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 
++  0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6c, 0x69, 0x6e, 
++  0x65, 0x73, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 0x0a, 
++  0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 
++  0x6c, 0x69, 0x6e, 0x65, 0x20, 0x69, 0x6e, 0x20, 
++  0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 
++  0x64, 0x3a, 0x67, 0x6d, 0x61, 0x74, 0x63, 0x68, 
++  0x28, 0x27, 0x28, 0x5b, 0x5e, 0x5c, 0x6e, 0x5d, 
++  0x2b, 0x5c, 0x6e, 0x3f, 0x29, 0x27, 0x29, 0x20, 
++  0x64, 0x6f, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6c, 0x69, 
++  0x6e, 0x65, 0x3a, 0x66, 0x69, 0x6e, 0x64, 0x28, 
++  0x27, 0x70, 0x65, 0x61, 0x73, 0x2d, 0x6c, 0x75, 
++  0x61, 0x2d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 
++  0x61, 0x6c, 0x2e, 0x6c, 0x75, 0x61, 0x27, 0x2c, 
++  0x20, 0x31, 0x2c, 0x20, 0x74, 0x72, 0x75, 0x65, 
++  0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 
++  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x61, 
++  0x62, 0x6c, 0x65, 0x2e, 0x69, 0x6e, 0x73, 0x65, 
++  0x72, 0x74, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 
++  0x2c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x29, 0x0a, 
++  0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 
++  0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 
++  0x75, 0x72, 0x6e, 0x20, 0x74, 0x61, 0x62, 0x6c, 
++  0x65, 0x2e, 0x63, 0x6f, 0x6e, 0x63, 0x61, 0x74, 
++  0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2c, 0x20, 
++  0x27, 0x27, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 
++  0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 
++  0x6e, 0x20, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x3a, 
++  0x6c, 0x6f, 0x61, 0x64, 0x28, 0x66, 0x69, 0x6c, 
++  0x65, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x6d, 
++  0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x64, 0x69, 
++  0x72, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 
++  0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 
++  0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 
++  0x6c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 
++  0x20, 0x3d, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 
++  0x70, 0x72, 0x69, 0x76, 0x2e, 0x6d, 0x6f, 0x64, 
++  0x75, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 
++  0x65, 0x5b, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 
++  0x6d, 0x65, 0x5d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 
++  0x20, 0x69, 0x66, 0x20, 0x6d, 0x6f, 0x64, 0x75, 
++  0x6c, 0x65, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 
++  0x6c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 
++  0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6d, 0x6f, 
++  0x64, 0x75, 0x6c, 0x65, 0x20, 0x7e, 0x3d, 0x20, 
++  0x66, 0x61, 0x6c, 0x73, 0x65, 0x0a, 0x20, 0x20, 
++  0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 
++  0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x70, 0x61, 
++  0x63, 0x6b, 0x61, 0x67, 0x65, 0x2e, 0x6c, 0x6f, 
++  0x61, 0x64, 0x65, 0x64, 0x5b, 0x6d, 0x6f, 0x64, 
++  0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 
++  0x5d, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 
++  0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 
++  0x63, 0x61, 0x6c, 0x20, 0x6d, 0x73, 0x67, 0x20, 
++  0x3d, 0x20, 0x28, 0x22, 0x45, 0x72, 0x72, 0x6f, 
++  0x72, 0x20, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 
++  0x67, 0x20, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 
++  0x20, 0x27, 0x25, 0x73, 0x27, 0x3a, 0x20, 0x22, 
++  0x20, 0x2e, 0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x22, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 
++  0x20, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x27, 0x25, 
++  0x73, 0x27, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 
++  0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x62, 
++  0x65, 0x65, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x64, 
++  0x22, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 
++  0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x28, 0x6d, 
++  0x73, 0x67, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 
++  0x74, 0x28, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 
++  0x6d, 0x65, 0x2c, 0x20, 0x6d, 0x6f, 0x64, 0x75, 
++  0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 
++  0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 
++  0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 
++  0x64, 0x64, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 
++  0x67, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x28, 
++  0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x64, 
++  0x69, 0x72, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 
++  0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x73, 
++  0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x2c, 0x20, 
++  0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x20, 0x3d, 
++  0x20, 0x78, 0x70, 0x63, 0x61, 0x6c, 0x6c, 0x28, 
++  0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 
++  0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 
++  0x6e, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 
++  0x65, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 
++  0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 
++  0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x2c, 0x20, 
++  0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x5f, 0x70, 
++  0x6c, 0x75, 0x67, 0x69, 0x6e, 0x5f, 0x65, 0x78, 
++  0x63, 0x65, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x29, 
++  0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 
++  0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x75, 0x63, 
++  0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x68, 0x65, 
++  0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 
++  0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x22, 0x45, 
++  0x72, 0x72, 0x6f, 0x72, 0x20, 0x6c, 0x6f, 0x61, 
++  0x64, 0x69, 0x6e, 0x67, 0x20, 0x70, 0x6c, 0x75, 
++  0x67, 0x69, 0x6e, 0x20, 0x27, 0x25, 0x73, 0x27, 
++  0x3a, 0x5c, 0x6e, 0x25, 0x73, 0x22, 0x0a, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 
++  0x65, 0x6c, 0x66, 0x3a, 0x66, 0x61, 0x69, 0x6c, 
++  0x65, 0x64, 0x28, 0x6d, 0x73, 0x67, 0x3a, 0x66, 
++  0x6f, 0x72, 0x6d, 0x61, 0x74, 0x28, 0x6d, 0x6f, 
++  0x64, 0x75, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 
++  0x65, 0x2c, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 
++  0x69, 0x6e, 0x67, 0x28, 0x72, 0x65, 0x73, 0x75, 
++  0x6c, 0x74, 0x29, 0x29, 0x29, 0x0a, 0x20, 0x20, 
++  0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x20, 
++  0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x74, 0x79, 
++  0x70, 0x65, 0x28, 0x72, 0x65, 0x73, 0x75, 0x6c, 
++  0x74, 0x29, 0x20, 0x7e, 0x3d, 0x20, 0x27, 0x74, 
++  0x61, 0x62, 0x6c, 0x65, 0x27, 0x20, 0x74, 0x68, 
++  0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 
++  0x70, 0x72, 0x69, 0x76, 0x2e, 0x6d, 0x6f, 0x64, 
++  0x75, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 
++  0x65, 0x5b, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 
++  0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x61, 
++  0x6c, 0x73, 0x65, 0x0a, 0x0a, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 
++  0x61, 0x6c, 0x20, 0x6d, 0x73, 0x67, 0x20, 0x3d, 
++  0x20, 0x22, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x20, 
++  0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x20, 
++  0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x20, 0x27, 
++  0x25, 0x73, 0x27, 0x3a, 0x20, 0x65, 0x78, 0x70, 
++  0x65, 0x63, 0x74, 0x65, 0x64, 0x20, 0x74, 0x61, 
++  0x62, 0x6c, 0x65, 0x2c, 0x20, 0x67, 0x6f, 0x74, 
++  0x3a, 0x20, 0x25, 0x73, 0x20, 0x28, 0x25, 0x73, 
++  0x29, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x3a, 
++  0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x28, 0x6d, 
++  0x73, 0x67, 0x3a, 0x66, 0x6f, 0x72, 0x6d, 0x61, 
++  0x74, 0x28, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 
++  0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x74, 
++  0x79, 0x70, 0x65, 0x28, 0x72, 0x65, 0x73, 0x75, 
++  0x6c, 0x74, 0x29, 0x2c, 0x20, 0x74, 0x6f, 0x73, 
++  0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x72, 0x65, 
++  0x73, 0x75, 0x6c, 0x74, 0x29, 0x29, 0x29, 0x0a, 
++  0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 
++  0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 
++  0x66, 0x2e, 0x70, 0x72, 0x69, 0x76, 0x2e, 0x6d, 
++  0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x63, 0x61, 
++  0x63, 0x68, 0x65, 0x5b, 0x66, 0x69, 0x6c, 0x65, 
++  0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 0x20, 
++  0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x0a, 0x20, 
++  0x20, 0x20, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2e, 
++  0x70, 0x72, 0x69, 0x76, 0x2e, 0x65, 0x78, 0x74, 
++  0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 
++  0x61, 0x63, 0x68, 0x65, 0x5b, 0x66, 0x69, 0x6c, 
++  0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5d, 0x20, 0x3d, 
++  0x20, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 
++  0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 
++  0x72, 0x75, 0x65, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 
++  0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 
++  0x6e, 0x20, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 0x3a, 
++  0x66, 0x69, 0x6e, 0x64, 0x5f, 0x65, 0x78, 0x74, 
++  0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 
++  0x79, 0x70, 0x65, 0x28, 0x66, 0x69, 0x6c, 0x65, 
++  0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x20, 0x67, 0x74, 
++  0x79, 0x70, 0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 
++  0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 
++  0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x67, 0x74, 
++  0x79, 0x70, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x73, 
++  0x65, 0x6c, 0x66, 0x2e, 0x70, 0x72, 0x69, 0x76, 
++  0x2e, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 
++  0x6f, 0x6e, 0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 
++  0x5b, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 
++  0x65, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 
++  0x6f, 0x63, 0x61, 0x6c, 0x20, 0x65, 0x78, 0x74, 
++  0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 
++  0x79, 0x70, 0x65, 0x20, 0x3d, 0x20, 0x6d, 0x6f, 
++  0x64, 0x75, 0x6c, 0x65, 0x5f, 0x67, 0x74, 0x79, 
++  0x70, 0x65, 0x73, 0x5b, 0x67, 0x74, 0x79, 0x70, 
++  0x65, 0x5d, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 
++  0x69, 0x66, 0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 
++  0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 
++  0x65, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 
++  0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 
++  0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 
++  0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x20, 
++  0x3d, 0x3d, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 
++  0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 
++  0x20, 0x6e, 0x69, 0x6c, 0x0a, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 
++  0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 
++  0x20, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 
++  0x6f, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x0a, 
++  0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 
++  0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 
++  0x20, 0x5f, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 
++  0x65, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x61, 0x69, 
++  0x72, 0x73, 0x28, 0x73, 0x65, 0x6c, 0x66, 0x2e, 
++  0x70, 0x72, 0x69, 0x76, 0x2e, 0x6d, 0x6f, 0x64, 
++  0x75, 0x6c, 0x65, 0x5f, 0x63, 0x61, 0x63, 0x68, 
++  0x65, 0x5b, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 
++  0x6d, 0x65, 0x5d, 0x29, 0x20, 0x64, 0x6f, 0x0a, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x76, 0x61, 
++  0x6c, 0x75, 0x65, 0x5f, 0x67, 0x74, 0x79, 0x70, 
++  0x65, 0x20, 0x3d, 0x20, 0x76, 0x61, 0x6c, 0x75, 
++  0x65, 0x2e, 0x5f, 0x67, 0x74, 0x79, 0x70, 0x65, 
++  0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x69, 0x66, 0x20, 0x76, 0x61, 0x6c, 
++  0x75, 0x65, 0x5f, 0x67, 0x74, 0x79, 0x70, 0x65, 
++  0x20, 0x7e, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 
++  0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x69, 0x66, 0x20, 0x47, 0x4f, 0x62, 0x6a, 
++  0x65, 0x63, 0x74, 0x2e, 0x74, 0x79, 0x70, 0x65, 
++  0x5f, 0x69, 0x73, 0x5f, 0x61, 0x28, 0x76, 0x61, 
++  0x6c, 0x75, 0x65, 0x5f, 0x67, 0x74, 0x79, 0x70, 
++  0x65, 0x2c, 0x20, 0x67, 0x74, 0x79, 0x70, 0x65, 
++  0x29, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 
++  0x6f, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x67, 0x74, 
++  0x79, 0x70, 0x65, 0x73, 0x5b, 0x67, 0x74, 0x79, 
++  0x70, 0x65, 0x5d, 0x20, 0x3d, 0x20, 0x76, 0x61, 
++  0x6c, 0x75, 0x65, 0x5f, 0x67, 0x74, 0x79, 0x70, 
++  0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 
++  0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x67, 
++  0x74, 0x79, 0x70, 0x65, 0x0a, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x65, 0x6e, 0x64, 0x0a, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 
++  0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 
++  0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x6f, 
++  0x64, 0x75, 0x6c, 0x65, 0x5f, 0x67, 0x74, 0x79, 
++  0x70, 0x65, 0x73, 0x5b, 0x67, 0x74, 0x79, 0x70, 
++  0x65, 0x5d, 0x20, 0x3d, 0x20, 0x66, 0x61, 0x6c, 
++  0x73, 0x65, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 
++  0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x6e, 0x69, 
++  0x6c, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x6c, 
++  0x6f, 0x63, 0x61, 0x6c, 0x20, 0x66, 0x75, 0x6e, 
++  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x63, 0x68, 
++  0x65, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x74, 0x69, 
++  0x76, 0x65, 0x28, 0x6e, 0x61, 0x74, 0x69, 0x76, 
++  0x65, 0x2c, 0x20, 0x77, 0x72, 0x61, 0x70, 0x70, 
++  0x65, 0x64, 0x2c, 0x20, 0x74, 0x79, 0x70, 0x65, 
++  0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 0x20, 0x20, 
++  0x20, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 
++  0x6d, 0x73, 0x67, 0x20, 0x3d, 0x20, 0x28, 0x27, 
++  0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 
++  0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x20, 
++  0x66, 0x6f, 0x72, 0x20, 0x25, 0x73, 0x3a, 0x20, 
++  0x25, 0x73, 0x27, 0x29, 0x3a, 0x66, 0x6f, 0x72, 
++  0x6d, 0x61, 0x74, 0x28, 0x74, 0x79, 0x70, 0x65, 
++  0x6e, 0x61, 0x6d, 0x65, 0x2c, 0x0a, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x73, 0x74, 
++  0x72, 0x69, 0x6e, 0x67, 0x28, 0x77, 0x72, 0x61, 
++  0x70, 0x70, 0x65, 0x64, 0x29, 0x29, 0x0a, 0x0a, 
++  0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x20, 0x43, 
++  0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x20, 0x63, 0x6f, 
++  0x6d, 0x70, 0x61, 0x72, 0x65, 0x20, 0x75, 0x73, 
++  0x65, 0x72, 0x64, 0x61, 0x74, 0x61, 0x20, 0x64, 
++  0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x21, 
++  0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 
++  0x65, 0x72, 0x74, 0x28, 0x77, 0x72, 0x61, 0x70, 
++  0x70, 0x65, 0x64, 0x20, 0x7e, 0x3d, 0x20, 0x6e, 
++  0x69, 0x6c, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x29, 
++  0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x73, 0x73, 
++  0x65, 0x72, 0x74, 0x28, 0x74, 0x6f, 0x73, 0x74, 
++  0x72, 0x69, 0x6e, 0x67, 0x28, 0x6e, 0x61, 0x74, 
++  0x69, 0x76, 0x65, 0x29, 0x20, 0x3d, 0x3d, 0x20, 
++  0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 
++  0x28, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 
++  0x2e, 0x5f, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 
++  0x29, 0x2c, 0x20, 0x6d, 0x73, 0x67, 0x29, 0x0a, 
++  0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x66, 0x75, 0x6e, 
++  0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x48, 0x6f, 
++  0x6f, 0x6b, 0x73, 0x3a, 0x73, 0x65, 0x74, 0x75, 
++  0x70, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 
++  0x69, 0x6f, 0x6e, 0x28, 0x65, 0x78, 0x74, 0x65, 
++  0x6e, 0x2c, 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x29, 
++  0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x6f, 0x63, 
++  0x61, 0x6c, 0x20, 0x77, 0x72, 0x61, 0x70, 0x70, 
++  0x65, 0x64, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 
++  0x20, 0x3d, 0x20, 0x47, 0x4f, 0x62, 0x6a, 0x65, 
++  0x63, 0x74, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 
++  0x74, 0x28, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x2c, 
++  0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x29, 0x0a, 
++  0x20, 0x20, 0x20, 0x20, 0x63, 0x68, 0x65, 0x63, 
++  0x6b, 0x5f, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 
++  0x28, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x2c, 0x20, 
++  0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 
++  0x65, 0x78, 0x74, 0x65, 0x6e, 0x2c, 0x20, 0x27, 
++  0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 
++  0x6e, 0x27, 0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 
++  0x20, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 
++  0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x69, 
++  0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 0x50, 0x65, 
++  0x61, 0x73, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 
++  0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x28, 0x69, 0x6e, 
++  0x66, 0x6f, 0x2c, 0x20, 0x66, 0x61, 0x6c, 0x73, 
++  0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 
++  0x68, 0x65, 0x63, 0x6b, 0x5f, 0x6e, 0x61, 0x74, 
++  0x69, 0x76, 0x65, 0x28, 0x69, 0x6e, 0x66, 0x6f, 
++  0x2c, 0x20, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 
++  0x64, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x2c, 0x20, 
++  0x27, 0x50, 0x65, 0x61, 0x73, 0x50, 0x6c, 0x75, 
++  0x67, 0x69, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x27, 
++  0x29, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 
++  0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x65, 
++  0x78, 0x74, 0x65, 0x6e, 0x2e, 0x70, 0x72, 0x69, 
++  0x76, 0x2e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 
++  0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x20, 0x3d, 0x20, 
++  0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 
++  0x69, 0x6e, 0x66, 0x6f, 0x0a, 0x65, 0x6e, 0x64, 
++  0x0a, 0x0a, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 
++  0x6f, 0x6e, 0x20, 0x48, 0x6f, 0x6f, 0x6b, 0x73, 
++  0x3a, 0x67, 0x61, 0x72, 0x62, 0x61, 0x67, 0x65, 
++  0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 
++  0x28, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 
++  0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x67, 0x61, 
++  0x72, 0x62, 0x61, 0x67, 0x65, 0x28, 0x29, 0x0a, 
++  0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x72, 0x65, 0x74, 
++  0x75, 0x72, 0x6e, 0x20, 0x48, 0x6f, 0x6f, 0x6b, 
++  0x73, 0x2e, 0x6e, 0x65, 0x77, 0x28, 0x29, 0x0a, 
++  0x0a, 0x2d, 0x2d, 0x20, 0x65, 0x78, 0x3a, 0x74, 
++  0x73, 0x3d, 0x34, 0x3a, 0x65, 0x74, 0x3a, 0x0a, 
++  0x00, 0x00, 0x28, 0x75, 0x75, 0x61, 0x79, 0x29, 
++  0x6f, 0x72, 0x67, 0x2f, 0x01, 0x00, 0x00, 0x00, 
++  0x2f, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 
++  0x6c, 0x75, 0x61, 0x35, 0x2e, 0x31, 0x2f, 0x00, 
++  0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 
++  0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x2e, 0x6c, 
++  0x75, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
++  0xe8, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
++  0x2d, 0x2d, 0x0a, 0x2d, 0x2d, 0x20, 0x20, 0x43, 
++  0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 
++  0x20, 0x28, 0x43, 0x29, 0x20, 0x32, 0x30, 0x31, 
++  0x35, 0x20, 0x2d, 0x20, 0x47, 0x61, 0x72, 0x72, 
++  0x65, 0x74, 0x74, 0x20, 0x52, 0x65, 0x67, 0x69, 
++  0x65, 0x72, 0x0a, 0x2d, 0x2d, 0x0a, 0x2d, 0x2d, 
++  0x20, 0x6c, 0x69, 0x62, 0x70, 0x65, 0x61, 0x73, 
++  0x20, 0x69, 0x73, 0x20, 0x66, 0x72, 0x65, 0x65, 
++  0x20, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 
++  0x65, 0x3b, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x63, 
++  0x61, 0x6e, 0x20, 0x72, 0x65, 0x64, 0x69, 0x73, 
++  0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 
++  0x69, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x2f, 0x6f, 
++  0x72, 0x0a, 0x2d, 0x2d, 0x20, 0x6d, 0x6f, 0x64, 
++  0x69, 0x66, 0x79, 0x20, 0x69, 0x74, 0x20, 0x75, 
++  0x6e, 0x64, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 
++  0x20, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x6f, 
++  0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 
++  0x55, 0x20, 0x4c, 0x65, 0x73, 0x73, 0x65, 0x72, 
++  0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 
++  0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x0a, 
++  0x2d, 0x2d, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 
++  0x73, 0x65, 0x20, 0x61, 0x73, 0x20, 0x70, 0x75, 
++  0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x20, 
++  0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x46, 
++  0x72, 0x65, 0x65, 0x20, 0x53, 0x6f, 0x66, 0x74, 
++  0x77, 0x61, 0x72, 0x65, 0x20, 0x46, 0x6f, 0x75, 
++  0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 
++  0x20, 0x65, 0x69, 0x74, 0x68, 0x65, 0x72, 0x0a, 
++  0x2d, 0x2d, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 
++  0x6f, 0x6e, 0x20, 0x32, 0x2e, 0x31, 0x20, 0x6f, 
++  0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x69, 
++  0x63, 0x65, 0x6e, 0x73, 0x65, 0x2c, 0x20, 0x6f, 
++  0x72, 0x20, 0x28, 0x61, 0x74, 0x20, 0x79, 0x6f, 
++  0x75, 0x72, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 
++  0x6e, 0x29, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x6c, 
++  0x61, 0x74, 0x65, 0x72, 0x20, 0x76, 0x65, 0x72, 
++  0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x2d, 0x2d, 
++  0x0a, 0x2d, 0x2d, 0x20, 0x6c, 0x69, 0x62, 0x70, 
++  0x65, 0x61, 0x73, 0x20, 0x69, 0x73, 0x20, 0x64, 
++  0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 
++  0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 
++  0x65, 0x20, 0x68, 0x6f, 0x70, 0x65, 0x20, 0x74, 
++  0x68, 0x61, 0x74, 0x20, 0x69, 0x74, 0x20, 0x77, 
++  0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 
++  0x73, 0x65, 0x66, 0x75, 0x6c, 0x2c, 0x0a, 0x2d, 
++  0x2d, 0x20, 0x62, 0x75, 0x74, 0x20, 0x57, 0x49, 
++  0x54, 0x48, 0x4f, 0x55, 0x54, 0x20, 0x41, 0x4e, 
++  0x59, 0x20, 0x57, 0x41, 0x52, 0x52, 0x41, 0x4e, 
++  0x54, 0x59, 0x3b, 0x20, 0x77, 0x69, 0x74, 0x68, 
++  0x6f, 0x75, 0x74, 0x20, 0x65, 0x76, 0x65, 0x6e, 
++  0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6d, 0x70, 
++  0x6c, 0x69, 0x65, 0x64, 0x20, 0x77, 0x61, 0x72, 
++  0x72, 0x61, 0x6e, 0x74, 0x79, 0x20, 0x6f, 0x66, 
++  0x0a, 0x2d, 0x2d, 0x20, 0x4d, 0x45, 0x52, 0x43, 
++  0x48, 0x41, 0x4e, 0x54, 0x41, 0x42, 0x49, 0x4c, 
++  0x49, 0x54, 0x59, 0x20, 0x6f, 0x72, 0x20, 0x46, 
++  0x49, 0x54, 0x4e, 0x45, 0x53, 0x53, 0x20, 0x46, 
++  0x4f, 0x52, 0x20, 0x41, 0x20, 0x50, 0x41, 0x52, 
++  0x54, 0x49, 0x43, 0x55, 0x4c, 0x41, 0x52, 0x20, 
++  0x50, 0x55, 0x52, 0x50, 0x4f, 0x53, 0x45, 0x2e, 
++  0x20, 0x20, 0x53, 0x65, 0x65, 0x20, 0x74, 0x68, 
++  0x65, 0x20, 0x47, 0x4e, 0x55, 0x0a, 0x2d, 0x2d, 
++  0x20, 0x4c, 0x65, 0x73, 0x73, 0x65, 0x72, 0x20, 
++  0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x20, 
++  0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20, 0x4c, 
++  0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x20, 0x66, 
++  0x6f, 0x72, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 
++  0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2e, 
++  0x0a, 0x2d, 0x2d, 0x0a, 0x2d, 0x2d, 0x20, 0x59, 
++  0x6f, 0x75, 0x20, 0x73, 0x68, 0x6f, 0x75, 0x6c, 
++  0x64, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x72, 
++  0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x20, 
++  0x61, 0x20, 0x63, 0x6f, 0x70, 0x79, 0x20, 0x6f, 
++  0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x4e, 
++  0x55, 0x20, 0x4c, 0x65, 0x73, 0x73, 0x65, 0x72, 
++  0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 
++  0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x0a, 
++  0x2d, 0x2d, 0x20, 0x4c, 0x69, 0x63, 0x65, 0x6e, 
++  0x73, 0x65, 0x20, 0x61, 0x6c, 0x6f, 0x6e, 0x67, 
++  0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 
++  0x69, 0x73, 0x20, 0x6c, 0x69, 0x62, 0x72, 0x61, 
++  0x72, 0x79, 0x3b, 0x20, 0x69, 0x66, 0x20, 0x6e, 
++  0x6f, 0x74, 0x2c, 0x20, 0x77, 0x72, 0x69, 0x74, 
++  0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 
++  0x20, 0x46, 0x72, 0x65, 0x65, 0x20, 0x53, 0x6f, 
++  0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x0a, 0x2d, 
++  0x2d, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x61, 
++  0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x49, 0x6e, 
++  0x63, 0x2e, 0x2c, 0x20, 0x35, 0x31, 0x20, 0x46, 
++  0x72, 0x61, 0x6e, 0x6b, 0x6c, 0x69, 0x6e, 0x20, 
++  0x53, 0x74, 0x2c, 0x20, 0x46, 0x69, 0x66, 0x74, 
++  0x68, 0x20, 0x46, 0x6c, 0x6f, 0x6f, 0x72, 0x2c, 
++  0x20, 0x42, 0x6f, 0x73, 0x74, 0x6f, 0x6e, 0x2c, 
++  0x20, 0x4d, 0x41, 0x20, 0x20, 0x30, 0x32, 0x31, 
++  0x31, 0x30, 0x2d, 0x31, 0x33, 0x30, 0x31, 0x20, 
++  0x20, 0x55, 0x53, 0x41, 0x2e, 0x0a, 0x2d, 0x2d, 
++  0x0a, 0x2d, 0x2d, 0x20, 0x4d, 0x6f, 0x64, 0x69, 
++  0x66, 0x69, 0x65, 0x64, 0x20, 0x76, 0x65, 0x72, 
++  0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x3a, 
++  0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 
++  0x6d, 0x65, 0x74, 0x61, 0x6c, 0x75, 0x61, 0x2e, 
++  0x6c, 0x75, 0x61, 0x66, 0x6f, 0x72, 0x67, 0x65, 
++  0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x73, 0x72, 0x63, 
++  0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x73, 0x74, 0x72, 
++  0x69, 0x63, 0x74, 0x2e, 0x6c, 0x75, 0x61, 0x2e, 
++  0x68, 0x74, 0x6d, 0x6c, 0x0a, 0x0a, 0x5f, 0x5f, 
++  0x53, 0x54, 0x52, 0x49, 0x43, 0x54, 0x20, 0x3d, 
++  0x20, 0x74, 0x72, 0x75, 0x65, 0x0a, 0x0a, 0x6c, 
++  0x6f, 0x63, 0x61, 0x6c, 0x20, 0x6d, 0x74, 0x20, 
++  0x3d, 0x20, 0x67, 0x65, 0x74, 0x6d, 0x65, 0x74, 
++  0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x28, 0x5f, 
++  0x47, 0x29, 0x0a, 0x69, 0x66, 0x20, 0x6d, 0x74, 
++  0x20, 0x3d, 0x3d, 0x20, 0x6e, 0x69, 0x6c, 0x20, 
++  0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 
++  0x20, 0x6d, 0x74, 0x20, 0x3d, 0x20, 0x7b, 0x7d, 
++  0x0a, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 
++  0x6d, 0x65, 0x74, 0x61, 0x74, 0x61, 0x62, 0x6c, 
++  0x65, 0x28, 0x5f, 0x47, 0x2c, 0x20, 0x6d, 0x74, 
++  0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x66, 
++  0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 
++  0x6d, 0x74, 0x3a, 0x5f, 0x5f, 0x6e, 0x65, 0x77, 
++  0x69, 0x6e, 0x64, 0x65, 0x78, 0x28, 0x6e, 0x61, 
++  0x6d, 0x65, 0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 
++  0x65, 0x29, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 
++  0x66, 0x20, 0x5f, 0x5f, 0x53, 0x54, 0x52, 0x49, 
++  0x43, 0x54, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x20, 0x77, 0x68, 
++  0x61, 0x74, 0x20, 0x3d, 0x20, 0x64, 0x65, 0x62, 
++  0x75, 0x67, 0x2e, 0x67, 0x65, 0x74, 0x69, 0x6e, 
++  0x66, 0x6f, 0x28, 0x32, 0x2c, 0x20, 0x27, 0x53, 
++  0x27, 0x29, 0x2e, 0x77, 0x68, 0x61, 0x74, 0x0a, 
++  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x69, 0x66, 0x20, 0x77, 0x68, 0x61, 0x74, 
++  0x20, 0x7e, 0x3d, 0x20, 0x27, 0x43, 0x27, 0x20, 
++  0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x28, 0x22, 
++  0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x65, 
++  0x64, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x72, 0x65, 
++  0x61, 0x74, 0x65, 0x20, 0x67, 0x6c, 0x6f, 0x62, 
++  0x61, 0x6c, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 
++  0x62, 0x6c, 0x65, 0x20, 0x27, 0x22, 0x20, 0x2e, 
++  0x2e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x74, 0x6f, 0x73, 0x74, 
++  0x72, 0x69, 0x6e, 0x67, 0x28, 0x6e, 0x61, 0x6d, 
++  0x65, 0x29, 0x20, 0x2e, 0x2e, 0x20, 0x22, 0x27, 
++  0x22, 0x2c, 0x20, 0x32, 0x29, 0x0a, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 
++  0x64, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 
++  0x64, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x72, 
++  0x61, 0x77, 0x73, 0x65, 0x74, 0x28, 0x73, 0x65, 
++  0x6c, 0x66, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 
++  0x2c, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x29, 
++  0x0a, 0x65, 0x6e, 0x64, 0x0a, 0x0a, 0x66, 0x75, 
++  0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 
++  0x74, 0x3a, 0x5f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 
++  0x78, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 
++  0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x6e, 
++  0x6f, 0x74, 0x20, 0x5f, 0x5f, 0x53, 0x54, 0x52, 
++  0x49, 0x43, 0x54, 0x20, 0x6f, 0x72, 0x20, 0x64, 
++  0x65, 0x62, 0x75, 0x67, 0x2e, 0x67, 0x65, 0x74, 
++  0x69, 0x6e, 0x66, 0x6f, 0x28, 0x32, 0x2c, 0x20, 
++  0x27, 0x53, 0x27, 0x29, 0x2e, 0x77, 0x68, 0x61, 
++  0x74, 0x20, 0x3d, 0x3d, 0x20, 0x27, 0x43, 0x27, 
++  0x20, 0x74, 0x68, 0x65, 0x6e, 0x0a, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x72, 0x65, 
++  0x74, 0x75, 0x72, 0x6e, 0x20, 0x72, 0x61, 0x77, 
++  0x67, 0x65, 0x74, 0x28, 0x73, 0x65, 0x6c, 0x66, 
++  0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x29, 0x0a, 
++  0x20, 0x20, 0x20, 0x20, 0x65, 0x6e, 0x64, 0x0a, 
++  0x0a, 0x20, 0x20, 0x20, 0x20, 0x65, 0x72, 0x72, 
++  0x6f, 0x72, 0x28, 0x22, 0x41, 0x74, 0x74, 0x65, 
++  0x6d, 0x70, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 
++  0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 
++  0x6e, 0x6f, 0x6e, 0x65, 0x78, 0x69, 0x73, 0x74, 
++  0x65, 0x6e, 0x74, 0x20, 0x22, 0x20, 0x2e, 0x2e, 
++  0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 
++  0x20, 0x20, 0x20, 0x22, 0x67, 0x6c, 0x6f, 0x62, 
++  0x61, 0x6c, 0x20, 0x76, 0x61, 0x72, 0x69, 0x61, 
++  0x62, 0x6c, 0x65, 0x20, 0x27, 0x22, 0x20, 0x2e, 
++  0x2e, 0x20, 0x74, 0x6f, 0x73, 0x74, 0x72, 0x69, 
++  0x6e, 0x67, 0x28, 0x6e, 0x61, 0x6d, 0x65, 0x29, 
++  0x20, 0x2e, 0x2e, 0x20, 0x22, 0x27, 0x22, 0x2c, 
++  0x20, 0x32, 0x29, 0x0a, 0x65, 0x6e, 0x64, 0x0a, 
++  0x0a, 0x2d, 0x2d, 0x20, 0x65, 0x78, 0x3a, 0x74, 
++  0x73, 0x3d, 0x34, 0x3a, 0x65, 0x74, 0x3a, 0x0a, 
++  0x00, 0x00, 0x28, 0x75, 0x75, 0x61, 0x79, 0x29, 
++  0x6c, 0x69, 0x62, 0x70, 0x65, 0x61, 0x73, 0x2f, 
++  0x00, 0x00, 0x00, 0x00
++} };
++
++static GStaticResource static_resource = { peas_lua_resource_data.data, sizeof (peas_lua_resource_data.data), NULL, NULL, NULL };
++G_GNUC_INTERNAL GResource *peas_lua_get_resource (void);
++GResource *peas_lua_get_resource (void)
++{
++  return g_static_resource_get_resource (&static_resource);
++}
++/*
++  If G_HAS_CONSTRUCTORS is true then the compiler support *both* constructors and
++  destructors, in a sane way, including e.g. on library unload. If not you're on
++  your own.
++
++  Some compilers need #pragma to handle this, which does not work with macros,
++  so the way you need to use this is (for constructors):
++
++  #ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA
++  #pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(my_constructor)
++  #endif
++  G_DEFINE_CONSTRUCTOR(my_constructor)
++  static void my_constructor(void) {
++   ...
++  }
++
++*/
++
++#ifndef __GTK_DOC_IGNORE__
++
++#if  __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
++
++#define G_HAS_CONSTRUCTORS 1
++
++#define G_DEFINE_CONSTRUCTOR(_func) static void __attribute__((constructor)) _func (void);
++#define G_DEFINE_DESTRUCTOR(_func) static void __attribute__((destructor)) _func (void);
++
++#elif defined (_MSC_VER) && (_MSC_VER >= 1500)
++/* Visual studio 2008 and later has _Pragma */
++
++#define G_HAS_CONSTRUCTORS 1
++
++#define G_DEFINE_CONSTRUCTOR(_func) \
++  static void _func(void); \
++  static int _func ## _wrapper(void) { _func(); return 0; } \
++  __pragma(section(".CRT$XCU",read)) \
++  __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _wrapper;
++
++#define G_DEFINE_DESTRUCTOR(_func) \
++  static void _func(void); \
++  static int _func ## _constructor(void) { atexit (_func); return 0; } \
++  __pragma(section(".CRT$XCU",read)) \
++  __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _constructor;
++
++#elif defined (_MSC_VER)
++
++#define G_HAS_CONSTRUCTORS 1
++
++/* Pre Visual studio 2008 must use #pragma section */
++#define G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1
++#define G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1
++
++#define G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \
++  section(".CRT$XCU",read)
++#define G_DEFINE_CONSTRUCTOR(_func) \
++  static void _func(void); \
++  static int _func ## _wrapper(void) { _func(); return 0; } \
++  __declspec(allocate(".CRT$XCU")) static int (*p)(void) = _func ## _wrapper;
++
++#define G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \
++  section(".CRT$XCU",read)
++#define G_DEFINE_DESTRUCTOR(_func) \
++  static void _func(void); \
++  static int _func ## _constructor(void) { atexit (_func); return 0; } \
++  __declspec(allocate(".CRT$XCU")) static int (* _array ## _func)(void) = _func ## _constructor;
++
++#elif defined(__SUNPRO_C)
++
++/* This is not tested, but i believe it should work, based on:
++ * http://opensource.apple.com/source/OpenSSL098/OpenSSL098-35/src/fips/fips_premain.c
++ */
++
++#define G_HAS_CONSTRUCTORS 1
++
++#define G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA 1
++#define G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA 1
++
++#define G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(_func) \
++  init(_func)
++#define G_DEFINE_CONSTRUCTOR(_func) \
++  static void _func(void);
++
++#define G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(_func) \
++  fini(_func)
++#define G_DEFINE_DESTRUCTOR(_func) \
++  static void _func(void);
++
++#else
++
++/* constructors not supported for this compiler */
++
++#endif
++
++#endif /* __GTK_DOC_IGNORE__ */
++
++#ifdef G_HAS_CONSTRUCTORS
++
++#ifdef G_DEFINE_CONSTRUCTOR_NEEDS_PRAGMA
++#pragma G_DEFINE_CONSTRUCTOR_PRAGMA_ARGS(resource_constructor)
++#endif
++G_DEFINE_CONSTRUCTOR(resource_constructor)
++#ifdef G_DEFINE_DESTRUCTOR_NEEDS_PRAGMA
++#pragma G_DEFINE_DESTRUCTOR_PRAGMA_ARGS(resource_destructor)
++#endif
++G_DEFINE_DESTRUCTOR(resource_destructor)
++
++#else
++#warning "Constructor not supported on this compiler, linking in resources will not work"
++#endif
++
++static void resource_constructor (void)
++{
++  g_static_resource_init (&static_resource);
++}
++
++static void resource_destructor (void)
++{
++  g_static_resource_fini (&static_resource);
++}
+--- libpeas-1.14.0/loaders/lua5.2/peas-lua-utils.c	1969-12-31 16:00:00.000000000 -0800
++++ libpeas-1.14.0/loaders/lua5.2/peas-lua-utils.c	2015-06-25 22:36:33.456708211 -0700
[email protected]@ -0,0 +1,243 @@
++/*
++ * peas-lua-utils.c
++ * This file is part of libpeas
++ *
++ * Copyright (C) 2014-2015 - Garrett Regier
++ *
++ * libpeas is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * libpeas is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
++ */
++
++#ifdef HAVE_CONFIG_H
++#include <config.h>
++#endif
++
++#include "peas-lua-utils.h"
++
++#include <gio/gio.h>
++
++#include <lauxlib.h>
++
++
++gboolean
++peas_lua_utils_require (lua_State   *L,
++                        const gchar *name)
++{
++  luaL_checkstack (L, 2, "");
++
++  lua_getglobal (L, "require");
++  lua_pushstring (L, name);
++
++  if (lua_pcall (L, 1, 1, 0) != 0)
++    {
++      g_warning ("Error failed to load Lua module '%s': %s",
++                 name, lua_tostring (L, -1));
++
++      /* Pop error */
++      lua_pop (L, 1);
++      return FALSE;
++    }
++
++  if (!lua_istable (L, -1))
++    {
++      g_warning ("Error invalid Lua module for '%s': "
++                 "expected table, got: %s",
++                 name, lua_tostring (L, -1));
++
++      /* Pop the module's table */
++      lua_pop (L, 1);
++      return FALSE;
++    }
++
++  return TRUE;
++}
++
++gboolean
++peas_lua_utils_check_version (lua_State *L,
++                              guint      req_major,
++                              guint      req_minor,
++                              guint      req_micro)
++{
++  const gchar *version_str;
++  gchar **version_str_parts;
++  gint n_version_parts;
++  gint *version_parts;
++  gint i;
++  gboolean success = FALSE;
++
++  lua_getfield (L, -1, "_VERSION");
++  version_str = lua_tostring (L, -1);
++
++  version_str_parts = g_strsplit (version_str, ".", 0);
++
++  n_version_parts = g_strv_length (version_str_parts);
++  version_parts = g_newa (gint, n_version_parts);
++
++  for (i = 0; i < n_version_parts; ++i)
++    {
++      gchar *end;
++
++      version_parts[i] = g_ascii_strtoll (version_str_parts[i], &end, 10);
++
++      if (*end != '\0' ||
++          version_parts[i] < 0 ||
++          version_parts[i] == G_MAXINT64)
++        {
++          g_warning ("Invalid version string: %s", version_str);
++          goto error;
++        }
++    }
++
++  if (n_version_parts < 3 ||
++      version_parts[0] != req_major ||
++      version_parts[1] < req_minor ||
++      (version_parts[1] == req_minor && version_parts[2] < req_micro))
++    {
++      g_warning ("Version mismatch %d.%d.%d is required, found %s",
++                 req_major, req_minor, req_micro, version_str);
++      goto error;
++    }
++
++  success = TRUE;
++
++error:
++
++  /* Pop _VERSION */
++  lua_pop (L, 1);
++
++  g_strfreev (version_str_parts);
++  return success;
++}
++
++static gint
++traceback (lua_State *L)
++{
++  /* Always ignore an error that isn't a string */
++  if (!lua_isstring (L, 1))
++    return 1;
++
++  lua_getglobal (L, "debug");
++  if (!lua_istable (L, -1))
++    {
++      lua_pop (L, 1);
++      return 1;
++    }
++
++  lua_getfield (L, -1, "traceback");
++  if (!lua_isfunction (L, -1))
++    {
++      lua_pop (L, 2);
++      return 1;
++    }
++
++  /* Replace debug with traceback */
++  lua_replace (L, -2);
++
++  /* Push the error */
++  lua_pushvalue (L, 1);
++
++  /* Skip this function when generating the traceback */
++  lua_pushinteger (L, 2);
++
++  /* If we fail we have a new error object... */
++  lua_pcall (L, 2, 1, 0);
++  return 1;
++}
++
++gboolean
++peas_lua_utils_call (lua_State *L,
++                     guint      n_args,
++                     guint      n_results)
++{
++  gboolean success;
++
++  /* Push the error function */
++  lua_pushcfunction (L, traceback);
++
++  /* Move traceback to before the arguments */
++  lua_insert (L, -2 - n_args);
++
++  success = lua_pcall (L, n_args, n_results, -2 - n_args) == 0;
++
++  /* Remove traceback */
++  lua_remove (L, -1 - (success ? n_results : 1));
++  return success;
++}
++
++gboolean
++peas_lua_utils_load_resource (lua_State   *L,
++                              const gchar *name,
++                              guint        n_args,
++                              guint        n_results)
++{
++  gchar *resource_path;
++  GBytes *lua_resource;
++  const gchar *code;
++  gsize code_len;
++  gchar *lua_filename;
++
++  /* We don't use the byte-compiled Lua source
++   * because glib-compile-resources cannot output
++   * depends for generated files.
++   *
++   * There are also concerns that the bytecode is
++   * not stable enough between different Lua versions.
++   *
++   * https://bugzilla.gnome.org/show_bug.cgi?id=673101
++   */
++  resource_path = g_strconcat ("/org/gnome/libpeas/loaders/lua5.2/",
++                               name, NULL);
++  lua_resource = g_resources_lookup_data (resource_path,
++                                          G_RESOURCE_LOOKUP_FLAGS_NONE,
++                                          NULL);
++  g_free (resource_path);
++
++  if (lua_resource == NULL)
++    {
++      g_warning ("Failed to find '%s' resource", name);
++      return FALSE;
++    }
++
++  code = g_bytes_get_data (lua_resource, &code_len);
++
++  /* Filenames are prefixed with '@' */
++  lua_filename = g_strconcat ("@peas-lua-", name, NULL);
++
++  if (luaL_loadbuffer (L, code, code_len, lua_filename) != 0)
++    {
++      g_warning ("Failed to load '%s' resource: %s",
++                 name, lua_tostring (L, -1));
++
++      /* Pop error */
++      lua_pop (L, 1);
++      g_free (lua_filename);
++      g_bytes_unref (lua_resource);
++      return FALSE;
++    }
++
++  g_free (lua_filename);
++  g_bytes_unref (lua_resource);
++
++  if (!peas_lua_utils_call (L, n_args, n_results))
++    {
++      g_warning ("Failed to run '%s' resource: %s",
++                 name, lua_tostring (L, -1));
++
++      /* Pop error */
++      lua_pop (L, 1);
++      return FALSE;
++    }
++
++  return TRUE;
++}
+--- libpeas-1.14.0/loaders/lua5.2/peas-lua-utils.h	1969-12-31 16:00:00.000000000 -0800
++++ libpeas-1.14.0/loaders/lua5.2/peas-lua-utils.h	2015-06-25 22:36:33.458778831 -0700
[email protected]@ -0,0 +1,50 @@
++/*
++ * peas-lua-utils.h
++ * This file is part of libpeas
++ *
++ * Copyright (C) 2014-2015 - Garrett Regier
++ *
++ * libpeas is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * libpeas is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
++ */
++
++#ifndef __PEAS_LUA_UTILS_H__
++#define __PEAS_LUA_UTILS_H__
++
++#include <glib.h>
++#include <lua.h>
++
++G_BEGIN_DECLS
++
++
++gboolean peas_lua_utils_require       (lua_State   *L,
++                                       const gchar *name);
++
++gboolean peas_lua_utils_check_version (lua_State   *L,
++                                       guint        req_major,
++                                       guint        req_minor,
++                                       guint        req_micro);
++
++gboolean peas_lua_utils_call          (lua_State   *L,
++                                       guint        n_args,
++                                       guint        n_results);
++
++gboolean peas_lua_utils_load_resource (lua_State   *L,
++                                       const gchar *name,
++                                       guint        n_args,
++                                       guint        n_results);
++
++G_END_DECLS
++
++#endif /* __PEAS_LUA_UTILS_H__ */
+--- libpeas-1.14.0/loaders/lua5.2/peas-plugin-loader-lua.c	1969-12-31 16:00:00.000000000 -0800
++++ libpeas-1.14.0/loaders/lua5.2/peas-plugin-loader-lua.c	2015-06-25 22:36:33.455653941 -0700
[email protected]@ -0,0 +1,385 @@
++/*
++ * peas-plugin-loader-lua.c
++ * This file is part of libpeas
++ *
++ * Copyright (C) 2014-2015 - Garrett Regier
++ *
++ * libpeas is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * libpeas is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
++ */
++
++#ifdef HAVE_CONFIG_H
++#include <config.h>
++#endif
++
++#include "peas-plugin-loader-lua.h"
++#include "libpeas/peas-plugin-info-priv.h"
++
++#include <string.h>
++
++#include <lua.h>
++#include <lauxlib.h>
++#include <lualib.h>
++
++#include "peas-lua-internal.h"
++#include "peas-lua-utils.h"
++
++
++typedef void (* LgiLockFunc) (gpointer lgi_lock);
++
++
++typedef struct {
++  lua_State *L;
++
++  gpointer lgi_lock;
++  LgiLockFunc lgi_enter_func;
++  LgiLockFunc lgi_leave_func;
++} PeasPluginLoaderLuaPrivate;
++
++G_DEFINE_TYPE_WITH_PRIVATE (PeasPluginLoaderLua,
++                            peas_plugin_loader_lua,
++                            PEAS_TYPE_PLUGIN_LOADER)
++
++#define GET_PRIV(o) \
++  (peas_plugin_loader_lua_get_instance_private (o))
++
++static
++G_DEFINE_QUARK (peas-extension-type, extension_type)
++
++G_MODULE_EXPORT void
++peas_register_types (PeasObjectModule *module)
++{
++  peas_object_module_register_extension_type (module,
++                                              PEAS_TYPE_PLUGIN_LOADER,
++                                              PEAS_TYPE_PLUGIN_LOADER_LUA);
++}
++
++static lua_State *
++thread_enter (PeasPluginLoaderLua *lua_loader,
++              PeasPluginInfo      *info)
++{
++  PeasPluginLoaderLuaPrivate *priv = GET_PRIV (lua_loader);
++  lua_State *L = priv->L;
++  lua_State *NL = info->loader_data;
++
++  priv->lgi_enter_func (priv->lgi_lock);
++
++  if (NL != NULL)
++    {
++      /* We should never have multiple values on the stack */
++      g_assert_cmpint (lua_gettop (NL), ==, 0);
++    }
++  else
++    {
++      luaL_checkstack (L, 2, "");
++
++      lua_pushlightuserdata (L, info);
++      NL = lua_newthread (L);
++      lua_rawset (L, LUA_REGISTRYINDEX);
++
++      info->loader_data = NL;
++    }
++
++  return NL;
++}
++
++static void
++thread_leave (PeasPluginLoaderLua  *lua_loader,
++              PeasPluginInfo       *info,
++              lua_State           **L_ptr)
++{
++  PeasPluginLoaderLuaPrivate *priv = GET_PRIV (lua_loader);
++  lua_State *L = info->loader_data;
++
++  g_assert (*L_ptr == L);
++  *L_ptr = NULL;
++
++  /* The stack should always be empty */
++  g_assert_cmpint (lua_gettop (L), ==, 0);
++
++  priv->lgi_leave_func (priv->lgi_lock);
++}
++
++static GType
++find_lua_extension_type (lua_State      *L,
++                         PeasPluginInfo *info,
++                         GType           exten_type)
++{
++  luaL_checkstack (L, 2, "");
++  lua_pushstring (L, info->filename);
++  lua_pushlightuserdata (L, GSIZE_TO_POINTER (exten_type));
++
++  if (peas_lua_internal_call (L, "find_extension_type",
++                              2, LUA_TLIGHTUSERDATA))
++    {
++      GType extension_type;
++
++      extension_type = (GType) lua_touserdata (L, -1);
++      lua_pop (L, 1);
++
++      if (g_type_is_a (extension_type, exten_type))
++        return extension_type;
++
++      g_warning ("Found invalid extension type '%s' for '%s'",
++                 g_type_name (extension_type), g_type_name (exten_type));
++    }
++
++  return G_TYPE_INVALID;
++}
++
++static gboolean
++peas_plugin_loader_lua_provides_extension (PeasPluginLoader *loader,
++                                           PeasPluginInfo   *info,
++                                           GType             exten_type)
++{
++  PeasPluginLoaderLua *lua_loader = PEAS_PLUGIN_LOADER_LUA (loader);
++  lua_State *L;
++  GType the_type;
++
++  L = thread_enter (lua_loader, info);
++
++  the_type = find_lua_extension_type (L, info, exten_type);
++
++  thread_leave (lua_loader, info, &L);
++  return the_type != G_TYPE_INVALID;
++}
++
++static PeasExtension *
++peas_plugin_loader_lua_create_extension (PeasPluginLoader *loader,
++                                         PeasPluginInfo   *info,
++                                         GType             exten_type,
++                                         guint             n_parameters,
++                                         GParameter       *parameters)
++{
++  PeasPluginLoaderLua *lua_loader = PEAS_PLUGIN_LOADER_LUA (loader);
++  lua_State *L;
++  GType the_type;
++  GObject *object = NULL;
++
++  L = thread_enter (lua_loader, info);
++
++  the_type = find_lua_extension_type (L, info, exten_type);
++  if (the_type == G_TYPE_INVALID)
++    goto out;
++
++  object = g_object_newv (the_type, n_parameters, parameters);
++  if (object == NULL)
++    goto out;
++
++  /* We have to remember which interface we are instantiating
++   * for the deprecated peas_extension_get_extension_type().
++   */
++  g_object_set_qdata (object, extension_type_quark (),
++                      GSIZE_TO_POINTER (exten_type));
++
++  luaL_checkstack (L, 2, "");
++  lua_pushlightuserdata (L, object);
++  lua_pushlightuserdata (L, info);
++
++  if (!peas_lua_internal_call (L, "setup_extension", 2, LUA_TNIL))
++    g_clear_object (&object);
++
++out:
++
++  thread_leave (lua_loader, info, &L);
++  return object;
++}
++
++static gboolean
++peas_plugin_loader_lua_load (PeasPluginLoader *loader,
++                             PeasPluginInfo   *info)
++{
++  PeasPluginLoaderLua *lua_loader = PEAS_PLUGIN_LOADER_LUA (loader);
++  lua_State *L;
++  gboolean success = FALSE;
++
++  L = thread_enter (lua_loader, info);
++
++  luaL_checkstack (L, 3, "");
++  lua_pushstring (L, info->filename);
++  lua_pushstring (L, peas_plugin_info_get_module_dir (info));
++  lua_pushstring (L, peas_plugin_info_get_module_name (info));
++
++  if (peas_lua_internal_call (L, "load", 3, LUA_TBOOLEAN))
++    {
++      success = lua_toboolean (L, -1);
++      lua_pop (L, 1);
++    }
++
++  thread_leave (lua_loader, info, &L);
++  return success;
++}
++
++static void
++peas_plugin_loader_lua_unload (PeasPluginLoader *loader,
++                               PeasPluginInfo   *info)
++{
++  PeasPluginLoaderLua *lua_loader = PEAS_PLUGIN_LOADER_LUA (loader);
++  PeasPluginLoaderLuaPrivate *priv = GET_PRIV (lua_loader);
++  lua_State *L = priv->L;
++
++  priv->lgi_enter_func (priv->lgi_lock);
++
++  /* The stack should always be empty */
++  g_assert_cmpint (lua_gettop (info->loader_data), ==, 0);
++
++  /* Delete the thread's reference */
++  lua_pushlightuserdata (L, info);
++  lua_pushnil (L);
++  lua_rawset (L, LUA_REGISTRYINDEX);
++
++  info->loader_data = NULL;
++
++  priv->lgi_leave_func (priv->lgi_lock);
++}
++
++static void
++peas_plugin_loader_lua_garbage_collect (PeasPluginLoader *loader)
++{
++  PeasPluginLoaderLua *lua_loader = PEAS_PLUGIN_LOADER_LUA (loader);
++  PeasPluginLoaderLuaPrivate *priv = GET_PRIV (lua_loader);
++  lua_State *L = priv->L;
++
++  priv->lgi_enter_func (priv->lgi_lock);
++
++  peas_lua_internal_call (L, "garbage_collect", 0, LUA_TNIL);
++
++  priv->lgi_leave_func (priv->lgi_lock);
++}
++
++static int
++atpanic_handler (lua_State *L)
++{
++  G_BREAKPOINT ();
++  return 0;
++}
++
++static gboolean
++peas_plugin_loader_lua_initialize (PeasPluginLoader *loader)
++{
++  PeasPluginLoaderLua *lua_loader = PEAS_PLUGIN_LOADER_LUA (loader);
++  PeasPluginLoaderLuaPrivate *priv = GET_PRIV (lua_loader);
++  lua_State *L;
++
++  priv->L = L = luaL_newstate ();
++  if (L == NULL)
++    {
++      g_critical ("Failed to allocate lua_State");
++      return FALSE;
++    }
++
++  /* Set before any other code is run */
++  if (g_getenv ("PEAS_LUA_DEBUG") != NULL)
++    lua_atpanic (L, atpanic_handler);
++
++  luaL_openlibs (L);
++
++  if (!peas_lua_utils_load_resource (L, "strict.lua", 0, 0) ||
++      !peas_lua_utils_require (L, "lgi") ||
++      !peas_lua_utils_check_version (L,
++                                     LGI_MAJOR_VERSION,
++                                     LGI_MINOR_VERSION,
++                                     LGI_MICRO_VERSION))
++    {
++      /* Already warned */
++      return FALSE;
++    }
++
++  lua_pushliteral (L, "lock");
++  lua_rawget (L, -2);
++  priv->lgi_lock = lua_touserdata (L, -1);
++  lua_pop (L, 1);
++
++  lua_pushliteral (L, "enter");
++  lua_rawget (L, -2);
++  priv->lgi_enter_func = lua_touserdata (L, -1);
++  lua_pop (L, 1);
++
++  lua_pushliteral (L, "leave");
++  lua_rawget (L, -2);
++  priv->lgi_leave_func = lua_touserdata (L, -1);
++  lua_pop (L, 1);
++
++  if (priv->lgi_lock == NULL ||
++      priv->lgi_enter_func == NULL ||
++      priv->lgi_leave_func == NULL)
++    {
++      g_warning ("Failed to find 'lgi.lock', 'lgi.enter' and 'lgi.leave'");
++      return FALSE;
++    }
++
++  /* Pop lgi's module table */
++  lua_pop (L, 1);
++
++  if (!peas_lua_internal_setup (L))
++    {
++      /* Already warned */
++      return FALSE;
++    }
++
++  /* Assert that no values were leaked to the stack */
++  g_assert_cmpint (lua_gettop (L), ==, 0);
++
++  /* Initially the lock is taken by LGI,
++   * release as we are not running Lua code
++   */
++  priv->lgi_leave_func (priv->lgi_lock);
++  return TRUE;
++}
++
++static gboolean
++peas_plugin_loader_lua_is_global (PeasPluginLoader *loader)
++{
++  return FALSE;
++}
++
++static void
++peas_plugin_loader_lua_init (PeasPluginLoaderLua *lua_loader)
++{
++}
++
++static void
++peas_plugin_loader_lua_finalize (GObject *object)
++{
++  PeasPluginLoaderLua *lua_loader = PEAS_PLUGIN_LOADER_LUA (object);
++  PeasPluginLoaderLuaPrivate *priv = GET_PRIV (lua_loader);
++
++  /* Must take the lock as Lua code will run on lua_close
++   * and another thread might be running Lua code already
++   */
++  if (priv->lgi_enter_func != NULL)
++    priv->lgi_enter_func (priv->lgi_lock);
++
++  peas_lua_internal_shutdown (priv->L);
++  g_clear_pointer (&priv->L, (GDestroyNotify) lua_close);
++
++  G_OBJECT_CLASS (peas_plugin_loader_lua_parent_class)->finalize (object);
++}
++
++static void
++peas_plugin_loader_lua_class_init (PeasPluginLoaderLuaClass *klass)
++{
++  GObjectClass *object_class = G_OBJECT_CLASS (klass);
++  PeasPluginLoaderClass *loader_class = PEAS_PLUGIN_LOADER_CLASS (klass);
++
++  object_class->finalize = peas_plugin_loader_lua_finalize;
++
++  loader_class->initialize = peas_plugin_loader_lua_initialize;
++  loader_class->is_global = peas_plugin_loader_lua_is_global;
++  loader_class->load = peas_plugin_loader_lua_load;
++  loader_class->unload = peas_plugin_loader_lua_unload;
++  loader_class->create_extension = peas_plugin_loader_lua_create_extension;
++  loader_class->provides_extension = peas_plugin_loader_lua_provides_extension;
++  loader_class->garbage_collect = peas_plugin_loader_lua_garbage_collect;
++}
+--- libpeas-1.14.0/loaders/lua5.2/peas-plugin-loader-lua.h	1969-12-31 16:00:00.000000000 -0800
++++ libpeas-1.14.0/loaders/lua5.2/peas-plugin-loader-lua.h	2015-06-25 22:36:33.459354387 -0700
[email protected]@ -0,0 +1,57 @@
++/*
++ * peas-plugin-loader-lua.h
++ * This file is part of libpeas
++ *
++ * Copyright (C) 2014 - Garrett Regier
++ *
++ * libpeas is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * libpeas is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with this library; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
++ */
++
++#ifndef __PEAS_PLUGIN_LOADER_LUA_H__
++#define __PEAS_PLUGIN_LOADER_LUA_H__
++
++#include <libpeas/peas-plugin-loader.h>
++#include <libpeas/peas-object-module.h>
++
++G_BEGIN_DECLS
++
++#define PEAS_TYPE_PLUGIN_LOADER_LUA             (peas_plugin_loader_lua_get_type ())
++#define PEAS_PLUGIN_LOADER_LUA(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), PEAS_TYPE_PLUGIN_LOADER_LUA, PeasPluginLoaderLua))
++#define PEAS_PLUGIN_LOADER_LUA_CONST(obj)       (G_TYPE_CHECK_INSTANCE_CAST ((obj), PEAS_TYPE_PLUGIN_LOADER_LUA, PeasPluginLoaderLua const))
++#define PEAS_PLUGIN_LOADER_LUA_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), PEAS_TYPE_PLUGIN_LOADER_LUA, PeasPluginLoaderLuaClass))
++#define PEAS_IS_PLUGIN_LOADER_LUA(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PEAS_TYPE_PLUGIN_LOADER_LUA))
++#define PEAS_IS_PLUGIN_LOADER_LUA_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), PEAS_TYPE_PLUGIN_LOADER_LUA))
++#define PEAS_PLUGIN_LOADER_LUA_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), PEAS_TYPE_PLUGIN_LOADER_LUA, PeasPluginLoaderLuaClass))
++
++typedef struct _PeasPluginLoaderLua         PeasPluginLoaderLua;
++typedef struct _PeasPluginLoaderLuaClass    PeasPluginLoaderLuaClass;
++
++struct _PeasPluginLoaderLua {
++  PeasPluginLoader parent;
++};
++
++struct _PeasPluginLoaderLuaClass {
++  PeasPluginLoaderClass parent_class;
++};
++
++GType                    peas_plugin_loader_lua_get_type  (void) G_GNUC_CONST;
++
++/* All the loaders must implement this function */
++G_MODULE_EXPORT void     peas_register_types              (PeasObjectModule *module);
++
++G_END_DECLS
++
++#endif /* __PEAS_PLUGIN_LOADER_LUA_H__ */
++
+--- libpeas-1.14.0/loaders/lua5.2/resources/Makefile.am	1969-12-31 16:00:00.000000000 -0800
++++ libpeas-1.14.0/loaders/lua5.2/resources/Makefile.am	2015-06-25 22:36:33.457213770 -0700
[email protected]@ -0,0 +1,19 @@
++LUA_FILES =				\
++	peas-lua-internal.lua		\
++	peas-lua-strict.lua
++
++LUAC_FILES = $(addsuffix c,$(LUA_FILES))
++
++%.luac: %.lua
++	$(AM_V_GEN) $(LUA52_BIN) $(srcdir)/peas-lua-compile.lua $< [email protected]
++
++all-local: $(LUAC_FILES)
++
++CLEANFILES = \
++	$(LUAC_FILES)
++
++EXTRA_DIST = \
++	peas-lua-compile.lua	\
++	peas-lua.gresource.xml	\
++	$(LUA_FILES)
++
+--- libpeas-1.14.0/loaders/lua5.2/resources/peas-lua-compile.lua	1969-12-31 16:00:00.000000000 -0800
++++ libpeas-1.14.0/loaders/lua5.2/resources/peas-lua-compile.lua	2015-06-25 22:36:33.457043821 -0700
[email protected]@ -0,0 +1,59 @@
++--
++--  Copyright (C) 2015 - Garrett Regier
++--
++-- libpeas is free software; you can redistribute it and/or
++-- modify it under the terms of the GNU Lesser General Public
++-- License as published by the Free Software Foundation; either
++-- version 2.1 of the License, or (at your option) any later version.
++--
++-- libpeas is distributed in the hope that it will be useful,
++-- but WITHOUT ANY WARRANTY; without even the implied warranty of
++-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++-- Lesser General Public License for more details.
++--
++-- You should have received a copy of the GNU Lesser General Public
++-- License along with this library; if not, write to the Free Software
++-- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
++
++local io = require 'io'
++local os = require 'os'
++
++
++local function check(err, format, ...)
++    if err == nil then
++        return
++    end
++
++    io.stderr:write(('Error: %s:\n%s\n'):format(format:format(...), err))
++    os.exit(1)
++end
++
++
++local function main(arg)
++    for i = 1, #arg, 2 do
++        local filename = arg[i]
++        local output = arg[i + 1]
++
++        local input_file, err = io.open(filename, 'rb')
++        check(err, 'Failed to open file "%s"', filename)
++
++         -- Error includes the filename
++        local compiled, err = loadstring(input_file:read('*a'),
++                                         '@' .. filename)
++        check(err, 'Invalid Lua file')
++
++        local f, err = io.open(output, 'wb')
++        check(err, 'Failed to open file "%s"', output)
++
++        local success, err = f:write(string.dump(compiled))
++        check(err, 'Failed to write to "%s"', output)
++
++        local success, err = f:close()
++        check(err, 'Failed to save "%s"', output)
++    end
++end
++
++
++os.exit(main(arg) or 0)
++
++-- ex:ts=4:et:
+--- libpeas-1.14.0/loaders/lua5.2/resources/peas-lua-internal.lua	1969-12-31 16:00:00.000000000 -0800
++++ libpeas-1.14.0/loaders/lua5.2/resources/peas-lua-internal.lua	2015-06-25 22:36:33.458365048 -0700
[email protected]@ -0,0 +1,161 @@
++--
++--  Copyright (C) 2015 - Garrett Regier
++--
++-- libpeas is free software; you can redistribute it and/or
++-- modify it under the terms of the GNU Lesser General Public
++-- License as published by the Free Software Foundation; either
++-- version 2.1 of the License, or (at your option) any later version.
++--
++-- libpeas is distributed in the hope that it will be useful,
++-- but WITHOUT ANY WARRANTY; without even the implied warranty of
++-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++-- Lesser General Public License for more details.
++--
++-- You should have received a copy of the GNU Lesser General Public
++-- License along with this library; if not, write to the Free Software
++-- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
++
++local debug = require 'debug'
++local package = require 'package'
++
++local lgi = require 'lgi'
++local GObject = lgi.GObject
++local Peas = lgi.Peas
++
++
++local Hooks = {}
++Hooks.__index = Hooks
++
++function Hooks()
++    local self = { priv = {} }
++    setmetatable(self, Hooks)
++
++    self.priv.module_cache = {}
++    self.priv.extension_cache = {}
++    return self
++end
++
++function Hooks:failed(msg)
++    -- This is implemented by the plugin loader
++    error('Hooks:failed() was not implemented!')
++end
++
++local function add_package_path(package_path)
++    local paths = (';%s/?.lua;%s/?/init.lua'):format(package_path,
++                                                     package_path)
++
++    if not package.path:find(paths, 1, true) then
++        package.path = package.path .. paths
++    end
++end
++
++local function format_plugin_exception(err)
++    -- Format the error even if given a userdata
++    local formatted = debug.traceback(tostring(err), 2)
++
++    if type(formatted) ~= 'string' then
++        return formatted
++    end
++
++    -- Remove all mentions of this file
++    local lines = {}
++    for line in formatted:gmatch('([^\n]+\n?)') do
++        if line:find('peas-lua-internal.lua', 1, true) then
++            break
++        end
++
++        table.insert(lines, line)
++    end
++
++    return table.concat(lines, '')
++end
++
++function Hooks:load(filename, module_dir, module_name)
++    local module = self.priv.module_cache[filename]
++
++    if module ~= nil then
++        return module ~= false
++    end
++
++    if package.loaded[module_name] ~= nil then
++        local msg = ("Error loading plugin '%s': " ..
++                     "module name '%s' has already been used")
++        self:failed(msg:format(filename, module_name))
++    end
++
++    add_package_path(module_dir)
++
++    local success, result = xpcall(function()
++        return require(module_name)
++    end, format_plugin_exception)
++
++    if not success then
++        local msg = "Error loading plugin '%s':\n%s"
++        self:failed(msg:format(module_name, tostring(result)))
++    end
++
++    if type(result) ~= 'table' then
++        self.priv.module_cache[filename] = false
++
++        local msg = "Error loading plugin '%s': expected table, got: %s (%s)"
++        self:failed(msg:format(module_name, type(result), tostring(result)))
++    end
++
++    self.priv.module_cache[filename] = result
++    self.priv.extension_cache[filename] = {}
++    return true
++end
++
++function Hooks:find_extension_type(filename, gtype)
++    local module_gtypes = self.priv.extension_cache[filename]
++    local extension_type = module_gtypes[gtype]
++
++    if extension_type ~= nil then
++        if extension_type == false then
++            return nil
++        end
++
++        return extension_type
++    end
++
++    for _, value in pairs(self.priv.module_cache[filename]) do
++        local value_gtype = value._gtype
++
++        if value_gtype ~= nil then
++            if GObject.type_is_a(value_gtype, gtype) then
++                module_gtypes[gtype] = value_gtype
++                return value_gtype
++            end
++        end
++    end
++
++    module_gtypes[gtype] = false
++    return nil
++end
++
++local function check_native(native, wrapped, typename)
++    local msg = ('Invalid wrapper for %s: %s'):format(typename,
++                                                      tostring(wrapped))
++
++    -- Cannot compare userdata directly!
++    assert(wrapped ~= nil, msg)
++    assert(tostring(native) == tostring(wrapped._native), msg)
++end
++
++function Hooks:setup_extension(exten, info)
++    local wrapped_exten = GObject.Object(exten, false)
++    check_native(exten, wrapped_exten, 'extension')
++
++    local wrapped_info = Peas.PluginInfo(info, false)
++    check_native(info, wrapped_info, 'PeasPluginInfo')
++
++    wrapped_exten.priv.plugin_info = wrapped_info
++end
++
++function Hooks:garbage_collect()
++    collectgarbage()
++end
++
++return Hooks()
++
++-- ex:ts=4:et:
+--- libpeas-1.14.0/loaders/lua5.2/resources/peas-lua-strict.lua	1969-12-31 16:00:00.000000000 -0800
++++ libpeas-1.14.0/loaders/lua5.2/resources/peas-lua-strict.lua	2015-06-25 22:36:33.457527835 -0700
[email protected]@ -0,0 +1,50 @@
++--
++--  Copyright (C) 2015 - Garrett Regier
++--
++-- libpeas is free software; you can redistribute it and/or
++-- modify it under the terms of the GNU Lesser General Public
++-- License as published by the Free Software Foundation; either
++-- version 2.1 of the License, or (at your option) any later version.
++--
++-- libpeas is distributed in the hope that it will be useful,
++-- but WITHOUT ANY WARRANTY; without even the implied warranty of
++-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++-- Lesser General Public License for more details.
++--
++-- You should have received a copy of the GNU Lesser General Public
++-- License along with this library; if not, write to the Free Software
++-- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
++--
++-- Modified version of: http://metalua.luaforge.net/src/lib/strict.lua.html
++
++__STRICT = true
++
++local mt = getmetatable(_G)
++if mt == nil then
++    mt = {}
++    setmetatable(_G, mt)
++end
++
++function mt:__newindex(name, value)
++    if __STRICT then
++        local what = debug.getinfo(2, 'S').what
++
++        if what ~= 'C' then
++            error("Attempted to create global variable '" ..
++                  tostring(name) .. "'", 2)
++        end
++    end
++
++    rawset(self, name, value)
++end
++
++function mt:__index(name)
++    if not __STRICT or debug.getinfo(2, 'S').what == 'C' then
++        return rawget(self, name)
++    end
++
++    error("Attempted to access nonexistent " ..
++          "global variable '" .. tostring(name) .. "'", 2)
++end
++
++-- ex:ts=4:et:
+--- libpeas-1.14.0/loaders/lua5.2/resources/peas-lua.gresource.xml	1969-12-31 16:00:00.000000000 -0800
++++ libpeas-1.14.0/loaders/lua5.2/resources/peas-lua.gresource.xml	2015-06-25 22:36:33.457644068 -0700
[email protected]@ -0,0 +1,7 @@
++<?xml version="1.0" encoding="UTF-8"?>
++<gresources>
++  <gresource prefix="/org/gnome/libpeas/loaders/lua5.2">
++    <file alias="internal.lua">peas-lua-internal.lua</file>
++    <file alias="strict.lua">peas-lua-strict.lua</file>
++  </gresource>
++</gresources>
+--- libpeas-1.14.0/loaders/Makefile.am	2014-12-20 14:37:42.000000000 -0800
++++ libpeas-1.14.0/loaders/Makefile.am	2015-06-25 22:36:33.438742551 -0700
[email protected]@ -1,7 +1,7 @@
+ SUBDIRS =
+ 
+-if ENABLE_LUA51
+-SUBDIRS += lua5.1
++if ENABLE_LUA52
++SUBDIRS += lua5.2
+ endif
+ 
+ if ENABLE_PYTHON2
+--- libpeas-1.14.0/peas-demo/peas-demo.c	2015-02-14 12:35:54.000000000 -0800
++++ libpeas-1.14.0/peas-demo/peas-demo.c	2015-06-25 22:38:29.268000858 -0700
[email protected]@ -137,7 +137,7 @@
+ 
+   /* We don't care about leaking memory */
+   g_setenv ("PEAS_ALLOW_ALL_LOADERS", "1", TRUE);
+-  peas_engine_enable_loader (engine, "lua5.1");
++  peas_engine_enable_loader (engine, "lua5.2");
+   peas_engine_enable_loader (engine, "python3");
+ 
+   if (run_from_build_dir)
+--- libpeas-1.14.0/peas-demo/plugins/luahello/luahello.plugin	2014-12-20 14:37:42.000000000 -0800
++++ libpeas-1.14.0/peas-demo/plugins/luahello/luahello.plugin	2015-06-25 22:38:31.563451815 -0700
[email protected]@ -1,6 +1,6 @@
+ [Plugin]
+ Module=luahello
+-Loader=lua5.1
++Loader=lua5.2
+ Name=Lua Says Hello
+ Description=Inserts a box containing "Lua Says Hello" in every windows.
+ Authors=Garrett Regier <[email protected]>
+--- libpeas-1.14.0/peas-demo/plugins/Makefile.am	2014-12-20 14:37:42.000000000 -0800
++++ libpeas-1.14.0/peas-demo/plugins/Makefile.am	2015-06-25 22:36:33.506129543 -0700
[email protected]@ -1,6 +1,6 @@
+ SUBDIRS = helloworld secondtime
+ 
+-if ENABLE_LUA51
++if ENABLE_LUA52
+ SUBDIRS += luahello
+ endif
+ 
+--- libpeas-1.14.0/tests/libpeas/extension-lua.c	2015-02-18 17:32:53.000000000 -0800
++++ libpeas-1.14.0/tests/libpeas/extension-lua.c	2015-06-25 22:38:07.388270387 -0700
[email protected]@ -154,9 +154,9 @@
+   PeasPluginInfo *info;
+ 
+   testing_util_push_log_hook ("Error loading plugin "
+-                              "'extension-lua51-nonexistent'*");
++                              "'extension-lua52-nonexistent'*");
+ 
+-  info = peas_engine_get_plugin_info (engine, "extension-lua51-nonexistent");
++  info = peas_engine_get_plugin_info (engine, "extension-lua52-nonexistent");
+ 
+   g_assert (!peas_engine_load_plugin (engine, info));
+ }
[email protected]@ -168,12 +168,12 @@
+   testing_init (&argc, &argv);
+ 
+   /* Only test the basics */
+-  testing_extension_basic ("lua5.1");
++  testing_extension_basic ("lua5.2");
+ 
+   /* We still need to add the callable tests
+    * because of peas_extension_call()
+    */
+-  testing_extension_callable ("lua5.1");
++  testing_extension_callable ("lua5.2");
+ 
+ #undef EXTENSION_TEST
+ #undef EXTENSION_TEST_FUNC
[email protected]@ -186,10 +186,10 @@
+   g_test_add_func (EXTENSION_TEST_NAME (loader, path), \
+                    (gpointer) test_extension_lua_##func)
+ 
+-  EXTENSION_TEST (lua5.1, "instance-refcount", instance_refcount);
+-  EXTENSION_TEST (lua5.1, "activatable-subject-refcount",
++  EXTENSION_TEST (lua5.2, "instance-refcount", instance_refcount);
++  EXTENSION_TEST (lua5.2, "activatable-subject-refcount",
+                   activatable_subject_refcount);
+-  EXTENSION_TEST (lua5.1, "nonexistent", nonexistent);
++  EXTENSION_TEST (lua5.2, "nonexistent", nonexistent);
+ 
+   return testing_extension_run_tests ();
+ }
+--- libpeas-1.14.0/tests/libpeas/Makefile.am	2015-01-22 02:00:51.000000000 -0800
++++ libpeas-1.14.0/tests/libpeas/Makefile.am	2015-06-25 22:36:33.551058412 -0700
[email protected]@ -25,11 +25,11 @@
+ 	extension-set	\
+ 	plugin-info
+ 
+-if ENABLE_LUA51
+-TEST_PROGS               += extension-lua51
+-extension_lua51_SOURCES   = extension-lua.c
+-extension_lua51_CFLAGS    = $(LUA51_CFLAGS)
+-extension_lua51_LDADD     = $(LDADD) $(LUA51_LIBS)
++if ENABLE_LUA52
++TEST_PROGS               += extension-lua52
++extension_lua52_SOURCES   = extension-lua.c
++extension_lua52_CFLAGS    = $(LUA52_CFLAGS)
++extension_lua52_LDADD     = $(LDADD) $(LUA52_LIBS)
+ endif
+ 
+ if ENABLE_PYTHON2
+--- libpeas-1.14.0/tests/libpeas/plugins/extension-lua/extension-lua51.lua	2015-02-14 12:35:54.000000000 -0800
++++ libpeas-1.14.0/tests/libpeas/plugins/extension-lua/extension-lua51.lua	1969-12-31 16:00:00.000000000 -0800
[email protected]@ -1,105 +0,0 @@
+---
+---  Copyright (C) 2014 - Garrett Regier
+---
+--- libpeas is free software; you can redistribute it and/or
+--- modify it under the terms of the GNU Lesser General Public
+--- License as published by the Free Software Foundation; either
+--- version 2.1 of the License, or (at your option) any later version.
+---
+--- libpeas is distributed in the hope that it will be useful,
+--- but WITHOUT ANY WARRANTY; without even the implied warranty of
+--- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+--- Lesser General Public License for more details.
+---
+--- You should have received a copy of the GNU Lesser General Public
+--- License along with this library; if not, write to the Free Software
+--- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
+-
+-local lgi = require 'lgi'
+-
+-local GObject = lgi.GObject
+-local Introspection = lgi.Introspection
+-local Peas = lgi.Peas
+-
+-
+-local ExtensionLuaPlugin = GObject.Object:derive('ExtensionLuaPlugin', {
+-    Peas.Activatable,
+-    Introspection.Base,
+-    Introspection.Callable,
+-    Introspection.HasPrerequisite
+-})
+-
+-ExtensionLuaPlugin._property.object =
+-    GObject.ParamSpecObject('object', 'object', 'object',
+-                            GObject.Object._gtype,
+-                            { GObject.ParamFlags.READABLE,
+-                              GObject.ParamFlags.WRITABLE })
+-
+-ExtensionLuaPlugin._property.update_count =
+-    GObject.ParamSpecInt('update-count', 'update-count', 'update-count',
+-                         0, 1000000, 0,
+-                         { GObject.ParamFlags.READABLE })
+-
+-function ExtensionLuaPlugin:_init()
+-    self.priv.update_count = 0
+-end
+-
+-function ExtensionLuaPlugin:do_activate()
+-    collectgarbage('restart')
+-end
+-
+-function ExtensionLuaPlugin:do_deactivate()
+-    collectgarbage('stop')
+-end
+-
+-function ExtensionLuaPlugin:do_update_state()
+-    self.priv.update_count = self.priv.update_count + 1
+-end
+-
+-function ExtensionLuaPlugin:do_get_plugin_info()
+-    return self.priv.plugin_info
+-end
+-
+-function ExtensionLuaPlugin:do_get_settings()
+-    return self.priv.plugin_info:get_settings(nil)
+-end
+-
+-function ExtensionLuaPlugin:do_call_no_args()
+-end
+-
+-function ExtensionLuaPlugin:do_call_with_return()
+-    return 'Hello, World!'
+-end
+-
+-function ExtensionLuaPlugin:do_call_single_arg()
+-    return true
+-end
+-
+-function ExtensionLuaPlugin:do_call_multi_args(in_, inout)
+-    return inout, in_
+-end
+-
+--- Test strict mode
+-local UNIQUE = {}
+-
+-local function assert_error(success, result)
+-    assert(not success, result)
+-end
+-
+-assert_error(pcall(function() _G[UNIQUE] = true end))
+-assert(pcall(function()
+-    rawset(_G, UNIQUE, true)
+-    assert(_G[UNIQUE] == true)
+-    _G[UNIQUE] = nil
+-end))
+-assert_error(pcall(function() _G[UNIQUE] = true end))
+-assert(pcall(function()
+-    __STRICT = false
+-    _G[UNIQUE] = true
+-    _G[UNIQUE] = nil
+-    __STRICT = true
+-end))
+-
+-return { ExtensionLuaPlugin }
+-
+--- ex:set ts=4 et sw=4 ai:
+--- libpeas-1.14.0/tests/libpeas/plugins/extension-lua/extension-lua51.plugin	2014-12-20 14:37:42.000000000 -0800
++++ libpeas-1.14.0/tests/libpeas/plugins/extension-lua/extension-lua51.plugin	1969-12-31 16:00:00.000000000 -0800
[email protected]@ -1,7 +0,0 @@
+-[Plugin]
+-Module=extension-lua51
+-Loader=lua5.1
+-Name=Extension lua5.1
+-Description=This plugin is for the lua5.1 PeasExtension tests.
+-Authors=Garrett Regier
+-Copyright=Copyright © 2014 Garrett Regier
+--- libpeas-1.14.0/tests/libpeas/plugins/extension-lua/extension-lua52.gschema.xml	1969-12-31 16:00:00.000000000 -0800
++++ libpeas-1.14.0/tests/libpeas/plugins/extension-lua/extension-lua52.gschema.xml	2015-06-25 22:36:33.545141830 -0700
[email protected]@ -0,0 +1,9 @@
++<schemalist>
++  <schema id="extension-lua52" path="/org/gnome/libpeas/tests/extension-lua52/">
++    <key name="a-setting" type="s">
++      <default>'Blah'</default>
++      <summary>Just a setting.</summary>
++      <description>Just a setting.</description>
++    </key>
++  </schema>
++</schemalist>
+--- libpeas-1.14.0/tests/libpeas/plugins/extension-lua/extension-lua52.lua	1969-12-31 16:00:00.000000000 -0800
++++ libpeas-1.14.0/tests/libpeas/plugins/extension-lua/extension-lua52.lua	2015-06-25 22:36:33.545646501 -0700
[email protected]@ -0,0 +1,105 @@
++--
++--  Copyright (C) 2014 - Garrett Regier
++--
++-- libpeas is free software; you can redistribute it and/or
++-- modify it under the terms of the GNU Lesser General Public
++-- License as published by the Free Software Foundation; either
++-- version 2.1 of the License, or (at your option) any later version.
++--
++-- libpeas is distributed in the hope that it will be useful,
++-- but WITHOUT ANY WARRANTY; without even the implied warranty of
++-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++-- Lesser General Public License for more details.
++--
++-- You should have received a copy of the GNU Lesser General Public
++-- License along with this library; if not, write to the Free Software
++-- Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
++
++local lgi = require 'lgi'
++
++local GObject = lgi.GObject
++local Introspection = lgi.Introspection
++local Peas = lgi.Peas
++
++
++local ExtensionLuaPlugin = GObject.Object:derive('ExtensionLuaPlugin', {
++    Peas.Activatable,
++    Introspection.Base,
++    Introspection.Callable,
++    Introspection.HasPrerequisite
++})
++
++ExtensionLuaPlugin._property.object =
++    GObject.ParamSpecObject('object', 'object', 'object',
++                            GObject.Object._gtype,
++                            { GObject.ParamFlags.READABLE,
++                              GObject.ParamFlags.WRITABLE })
++
++ExtensionLuaPlugin._property.update_count =
++    GObject.ParamSpecInt('update-count', 'update-count', 'update-count',
++                         0, 1000000, 0,
++                         { GObject.ParamFlags.READABLE })
++
++function ExtensionLuaPlugin:_init()
++    self.priv.update_count = 0
++end
++
++function ExtensionLuaPlugin:do_activate()
++    collectgarbage('restart')
++end
++
++function ExtensionLuaPlugin:do_deactivate()
++    collectgarbage('stop')
++end
++
++function ExtensionLuaPlugin:do_update_state()
++    self.priv.update_count = self.priv.update_count + 1
++end
++
++function ExtensionLuaPlugin:do_get_plugin_info()
++    return self.priv.plugin_info
++end
++
++function ExtensionLuaPlugin:do_get_settings()
++    return self.priv.plugin_info:get_settings(nil)
++end
++
++function ExtensionLuaPlugin:do_call_no_args()
++end
++
++function ExtensionLuaPlugin:do_call_with_return()
++    return 'Hello, World!'
++end
++
++function ExtensionLuaPlugin:do_call_single_arg()
++    return true
++end
++
++function ExtensionLuaPlugin:do_call_multi_args(in_, inout)
++    return inout, in_
++end
++
++-- Test strict mode
++local UNIQUE = {}
++
++local function assert_error(success, result)
++    assert(not success, result)
++end
++
++assert_error(pcall(function() _G[UNIQUE] = true end))
++assert(pcall(function()
++    rawset(_G, UNIQUE, true)
++    assert(_G[UNIQUE] == true)
++    _G[UNIQUE] = nil
++end))
++assert_error(pcall(function() _G[UNIQUE] = true end))
++assert(pcall(function()
++    __STRICT = false
++    _G[UNIQUE] = true
++    _G[UNIQUE] = nil
++    __STRICT = true
++end))
++
++return { ExtensionLuaPlugin }
++
++-- ex:set ts=4 et sw=4 ai:
+--- libpeas-1.14.0/tests/libpeas/plugins/extension-lua/extension-lua52.plugin	1969-12-31 16:00:00.000000000 -0800
++++ libpeas-1.14.0/tests/libpeas/plugins/extension-lua/extension-lua52.plugin	2015-06-25 22:37:48.225666077 -0700
[email protected]@ -0,0 +1,7 @@
++[Plugin]
++Module=extension-lua52
++Loader=lua5.2
++Name=Extension lua5.2
++Description=This plugin is for the lua5.2 PeasExtension tests.
++Authors=Garrett Regier
++Copyright=Copyright © 2014 Garrett Regier
+--- libpeas-1.14.0/tests/libpeas/plugins/extension-lua/Makefile.am	2014-12-20 14:37:42.000000000 -0800
++++ libpeas-1.14.0/tests/libpeas/plugins/extension-lua/Makefile.am	2015-06-25 22:36:33.545017261 -0700
[email protected]@ -1,8 +1,8 @@
+ include $(top_srcdir)/tests/Makefile.plugin
+ 
+ noinst_PLUGIN = \
+-	extension-lua51.gschema.xml	\
+-	extension-lua51.plugin		\
+-	extension-lua51.lua
++	extension-lua52.gschema.xml	\
++	extension-lua52.plugin		\
++	extension-lua52.lua
+ 
+ EXTRA_DIST = $(noinst_PLUGIN)
+--- libpeas-1.14.0/tests/libpeas/plugins/extension-lua51-nonexistent.plugin	2014-12-20 14:37:42.000000000 -0800
++++ libpeas-1.14.0/tests/libpeas/plugins/extension-lua51-nonexistent.plugin	1969-12-31 16:00:00.000000000 -0800
[email protected]@ -1,7 +0,0 @@
+-[Plugin]
+-Module=extension-lua51-nonexistent
+-Loader=lua5.1
+-Name=Extension lua5.1 Nonexistent
+-Description=This plugin is nonexistent.
+-Authors=Garrett Regier
+-Copyright=Copyright © 2014 Garrett Regier
+--- libpeas-1.14.0/tests/libpeas/plugins/extension-lua52-nonexistent.plugin	1969-12-31 16:00:00.000000000 -0800
++++ libpeas-1.14.0/tests/libpeas/plugins/extension-lua52-nonexistent.plugin	2015-06-25 22:37:52.634496175 -0700
[email protected]@ -0,0 +1,7 @@
++[Plugin]
++Module=extension-lua52-nonexistent
++Loader=lua5.2
++Name=Extension lua5.2 Nonexistent
++Description=This plugin is nonexistent.
++Authors=Garrett Regier
++Copyright=Copyright © 2014 Garrett Regier
+--- libpeas-1.14.0/tests/libpeas/plugins/Makefile.am	2014-12-20 14:37:42.000000000 -0800
++++ libpeas-1.14.0/tests/libpeas/plugins/Makefile.am	2015-06-25 22:36:33.546394741 -0700
[email protected]@ -2,7 +2,7 @@
+ 
+ SUBDIRS = extension-c
+ 
+-if ENABLE_LUA51
++if ENABLE_LUA52
+ SUBDIRS += extension-lua
+ endif
+ 
[email protected]@ -16,7 +16,7 @@
+ 
+ noinst_PLUGIN = \
+ 	extension-c-nonexistent.plugin		\
+-	extension-lua51-nonexistent.plugin	\
++	extension-lua52-nonexistent.plugin	\
+ 	extension-python-nonexistent.plugin	\
+ 	extension-python3-nonexistent.plugin	\
+ 	info-missing-module.plugin		\
+--- libpeas-1.14.0/tests/libpeas/testing/testing-extension.c	2015-02-14 12:35:54.000000000 -0800
++++ libpeas-1.14.0/tests/libpeas/testing/testing-extension.c	2015-06-25 22:36:33.562437838 -0700
[email protected]@ -173,7 +173,7 @@
+ 
+   /* This cannot be tested in PyGI and Seed's log handler messes this up */
+   if (g_strcmp0 (extension_plugin, "extension-c") != 0 &&
+-      g_strcmp0 (extension_plugin, "extension-lua51") != 0 &&
++      g_strcmp0 (extension_plugin, "extension-lua52") != 0 &&
+       g_strcmp0 (extension_plugin, "extension-python") != 0 &&
+       g_strcmp0 (extension_plugin, "extension-python3") != 0)
+     {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/gnome/libpeas/patches/02-lua52.patch	Sat Jun 25 00:44:31 2016 +0000
@@ -0,0 +1,19 @@
+patch to use Lua 5.2 instead of Lua 5.1.
+
+Need testing before contribution to upstream.
+
+XXX file upstream bug
+
+--- libpeas-1.14.0/loaders/lua5.2/resources/peas-lua-compile.lua	2015-06-25 23:41:37.616161175 -0700
++++ libpeas-1.14.0/loaders/lua5.2/resources/peas-lua-compile.lua	2015-06-25 23:41:18.975741723 -0700
[email protected]@ -38,8 +38,8 @@
+         check(err, 'Failed to open file "%s"', filename)
+ 
+          -- Error includes the filename
+-        local compiled, err = loadstring(input_file:read('*a'),
+-                                         '@' .. filename)
++        local compiled, err = load(input_file:read('*a'),
++                                   '@' .. filename)
+         check(err, 'Invalid Lua file')
+ 
+         local f, err = io.open(output, 'wb')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/gnome/libpeas/test/results-all.master	Sat Jun 25 00:44:31 2016 +0000
@@ -0,0 +1,11 @@
+TEST: engine...
+PASS: engine
+TEST: extension-c...
+PASS: extension-c
+TEST: extension-set...
+PASS: extension-set
+TEST: plugin-info...
+PASS: plugin-info
+TEST: extension-lua52...
+TEST: plugin-manager...
+FAIL: plugin-manager