[gnome-initial-setup/wip/accounts: 1/2] Split account page into two
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-initial-setup/wip/accounts: 1/2] Split account page into two
- Date: Sat, 14 Dec 2013 05:16:29 +0000 (UTC)
commit 71c9e9e5746c6218277c9df5941672e16c8e2ec8
Author: Matthias Clasen <mclasen redhat com>
Date: Sun Dec 8 22:38:25 2013 -0500
Split account page into two
This commit begins to split password setting off from account
information. The password page is only shown for local accounts -
this information is communicated between the accounts page and
the password page by storing the local account name in property
of GisDriver.
The basics of creating accounts are working.
Still to do:
- Add an avatar chooser
- Get account data from online account
configure.ac | 1 +
gnome-initial-setup/Makefile.am | 1 +
gnome-initial-setup/gis-driver.c | 30 +
gnome-initial-setup/gis-driver.h | 4 +
gnome-initial-setup/gnome-initial-setup.c | 2 +
gnome-initial-setup/pages/Makefile.am | 1 +
gnome-initial-setup/pages/account/Makefile.am | 1 -
.../pages/account/gis-account-page-enterprise.c | 1 -
.../pages/account/gis-account-page-enterprise.ui | 327 +-
.../pages/account/gis-account-page-local.c | 181 +-
.../pages/account/gis-account-page-local.h | 1 +
.../pages/account/gis-account-page-local.ui | 333 +-
.../pages/account/gis-account-page.c | 7 +-
.../pages/account/gis-account-page.ui | 8 +-
gnome-initial-setup/pages/password/Makefile.am | 42 +
.../pages/password/account-resources.c | 3381 ++++++++
.../pages/password/account-resources.h | 7 +
.../pages/password/gis-account-page-enterprise.c | 816 ++
.../pages/password/gis-account-page-enterprise.h | 64 +
.../pages/password/gis-account-page-enterprise.ui | 476 ++
.../pages/password/gis-account-page-local.c | 383 +
.../pages/password/gis-account-page-local.h | 58 +
.../pages/password/gis-account-page-local.ui | 299 +
.../pages/password/gis-password-page.c | 295 +
.../pages/password/gis-password-page.h | 59 +
.../pages/password/gis-password-page.ui | 165 +
.../pages/password/org.freedesktop.realmd.xml | 666 ++
.../pages/password/password-resources.c | 3869 +++++++++
.../pages/password/password-resources.h | 7 +
.../pages/password/password.gresource.xml | 8 +
.../pages/{account => password}/pw-utils.c | 0
.../pages/{account => password}/pw-utils.h | 0
.../pages/password/um-realm-generated.c | 8713 ++++++++++++++++++++
.../pages/password/um-realm-generated.h | 1147 +++
.../pages/password/um-realm-manager.c | 918 ++
.../pages/password/um-realm-manager.h | 109 +
gnome-initial-setup/pages/password/um-utils.c | 385 +
gnome-initial-setup/pages/password/um-utils.h | 43 +
38 files changed, 22248 insertions(+), 560 deletions(-)
---
diff --git a/configure.ac b/configure.ac
index 7d4eeec..4671b4d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -108,6 +108,7 @@ gnome-initial-setup/pages/network/Makefile
gnome-initial-setup/pages/timezone/Makefile
gnome-initial-setup/pages/goa/Makefile
gnome-initial-setup/pages/account/Makefile
+gnome-initial-setup/pages/password/Makefile
gnome-initial-setup/pages/summary/Makefile
po/Makefile.in
])
diff --git a/gnome-initial-setup/Makefile.am b/gnome-initial-setup/Makefile.am
index 34a3da9..8bcd46d 100644
--- a/gnome-initial-setup/Makefile.am
+++ b/gnome-initial-setup/Makefile.am
@@ -36,6 +36,7 @@ gnome_initial_setup_LDADD = \
pages/timezone/libgistimezone.la \
pages/goa/libgisgoa.la \
pages/account/libgisaccount.la \
+ pages/password/libgispassword.la \
pages/summary/libgissummary.la \
$(INITIAL_SETUP_LIBS) \
-lm
diff --git a/gnome-initial-setup/gis-driver.c b/gnome-initial-setup/gis-driver.c
index 8ee11e4..04b8e50 100644
--- a/gnome-initial-setup/gis-driver.c
+++ b/gnome-initial-setup/gis-driver.c
@@ -60,6 +60,7 @@ static guint signals[LAST_SIGNAL];
enum {
PROP_0,
PROP_MODE,
+ PROP_USERNAME,
PROP_LAST,
};
@@ -73,6 +74,7 @@ struct _GisDriverPrivate {
const gchar *user_password;
gchar *lang_id;
+ gchar *username;
GisDriverMode mode;
};
@@ -87,6 +89,7 @@ gis_driver_finalize (GObject *object)
GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
g_free (priv->lang_id);
+ g_free (priv->username);
G_OBJECT_CLASS (gis_driver_parent_class)->finalize (object);
}
@@ -139,6 +142,21 @@ gis_driver_get_user_language (GisDriver *driver)
}
void
+gis_driver_set_username (GisDriver *driver, const gchar *username)
+{
+ GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
+ g_free (priv->username);
+ priv->username = g_strdup (username);
+ g_object_notify (G_OBJECT (driver), "username");
+}
+
+const gchar *
+gis_driver_get_username (GisDriver *driver)
+{
+ GisDriverPrivate *priv = gis_driver_get_instance_private (driver);
+ return priv->username;
+}
+void
gis_driver_set_user_permissions (GisDriver *driver,
ActUser *user,
const gchar *password)
@@ -200,6 +218,9 @@ gis_driver_get_property (GObject *object,
case PROP_MODE:
g_value_set_enum (value, priv->mode);
break;
+ case PROP_USERNAME:
+ g_value_set_string (value, priv->username);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -219,6 +240,10 @@ gis_driver_set_property (GObject *object,
case PROP_MODE:
priv->mode = g_value_get_enum (value);
break;
+ case PROP_USERNAME:
+ g_free (priv->username);
+ priv->username = g_value_dup_string (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -320,6 +345,11 @@ gis_driver_class_init (GisDriverClass *klass)
GIS_DRIVER_MODE_EXISTING_USER,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+ obj_props[PROP_USERNAME] =
+ g_param_spec_string ("username", "", "",
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
g_object_class_install_properties (gobject_class, PROP_LAST, obj_props);
}
diff --git a/gnome-initial-setup/gis-driver.h b/gnome-initial-setup/gis-driver.h
index ff079df..5bd64ae 100644
--- a/gnome-initial-setup/gis-driver.h
+++ b/gnome-initial-setup/gis-driver.h
@@ -76,6 +76,10 @@ void gis_driver_set_user_language (GisDriver *driver,
const gchar *gis_driver_get_user_language (GisDriver *driver);
+void gis_driver_set_username (GisDriver *driver,
+ const gchar *username);
+const gchar *gis_driver_get_username (GisDriver *driver);
+
GisDriverMode gis_driver_get_mode (GisDriver *driver);
void gis_driver_add_page (GisDriver *driver,
diff --git a/gnome-initial-setup/gnome-initial-setup.c b/gnome-initial-setup/gnome-initial-setup.c
index 33f7968..039b776 100644
--- a/gnome-initial-setup/gnome-initial-setup.c
+++ b/gnome-initial-setup/gnome-initial-setup.c
@@ -46,6 +46,7 @@
#include "pages/timezone/gis-timezone-page.h"
#include "pages/goa/gis-goa-page.h"
#include "pages/account/gis-account-pages.h"
+#include "pages/password/gis-password-page.h"
#include "pages/summary/gis-summary-page.h"
static gboolean force_existing_user_mode;
@@ -69,6 +70,7 @@ static PageData page_table[] = {
PAGE (timezone, TRUE),
PAGE (goa, FALSE),
PAGE (account, TRUE),
+ PAGE (password, TRUE),
PAGE (summary, FALSE),
{ NULL },
};
diff --git a/gnome-initial-setup/pages/Makefile.am b/gnome-initial-setup/pages/Makefile.am
index 9292b05..4f2d5a0 100644
--- a/gnome-initial-setup/pages/Makefile.am
+++ b/gnome-initial-setup/pages/Makefile.am
@@ -8,4 +8,5 @@ SUBDIRS = \
timezone \
goa \
account \
+ password \
summary
diff --git a/gnome-initial-setup/pages/account/Makefile.am b/gnome-initial-setup/pages/account/Makefile.am
index 4a3180a..051d7ba 100644
--- a/gnome-initial-setup/pages/account/Makefile.am
+++ b/gnome-initial-setup/pages/account/Makefile.am
@@ -30,7 +30,6 @@ libgisaccount_la_SOURCES = \
gis-account-page-enterprise.c gis-account-page-enterprise.h \
um-realm-manager.c um-realm-manager.h \
um-utils.c um-utils.h \
- pw-utils.c pw-utils.h \
$(NULL)
libgisaccount_la_CFLAGS = $(INITIAL_SETUP_CFLAGS) -I "$(srcdir)/../.."
diff --git a/gnome-initial-setup/pages/account/gis-account-page-enterprise.c
b/gnome-initial-setup/pages/account/gis-account-page-enterprise.c
index f74a46a..9812671 100644
--- a/gnome-initial-setup/pages/account/gis-account-page-enterprise.c
+++ b/gnome-initial-setup/pages/account/gis-account-page-enterprise.c
@@ -33,7 +33,6 @@
#include "um-realm-manager.h"
#include "um-utils.h"
-#include "pw-utils.h"
static void join_show_prompt (GisAccountPageEnterprise *page,
GError *error);
diff --git a/gnome-initial-setup/pages/account/gis-account-page-enterprise.ui
b/gnome-initial-setup/pages/account/gis-account-page-enterprise.ui
index 723a6d8..efdb77b 100644
--- a/gnome-initial-setup/pages/account/gis-account-page-enterprise.ui
+++ b/gnome-initial-setup/pages/account/gis-account-page-enterprise.ui
@@ -3,200 +3,204 @@
<!-- interface-requires gtk+ 3.0 -->
<template class="GisAccountPageEnterprise" parent="GtkBin">
<child>
- <object class="GtkGrid" id="area">
+ <object class="GtkBox" id="area">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="hexpand">True</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">12</property>
+ <property name="orientation">vertical</property>
+ <property name="halign">center</property>
+ <property name="valign">fill</property>
<child>
- <object class="GtkFrame" id="sizer3">
+ <object class="GtkImage" id="image1">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">none</property>
+ <property name="pixel_size">96</property>
+ <property name="icon_name">dialog-password-symbolic</property>
+ <property name="icon_size">1</property>
+ <property name="margin_top">54</property>
+ <property name="margin_bottom">26</property>
+ <style>
+ <class name="dim-label" />
+ </style>
</object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">0</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
</child>
<child>
<object class="GtkLabel" id="title">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="halign">start</property>
- <property name="valign">start</property>
- <property name="margin_bottom">8</property>
<property name="hexpand">True</property>
- <property name="label" translatable="yes">Create an Enterprise Account</property>
+ <property name="label" translatable="yes">Enterprise Login</property>
+ <property name="margin_bottom">14</property>
<attributes>
<attribute name="weight" value="bold"/>
- <attribute name="scale" value="1.2"/>
+ <attribute name="scale" value="1.8"/>
</attributes>
</object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">0</property>
- <property name="width">2</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label4">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="halign">end</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">_Domain</property>
- <property name="use_underline">True</property>
- <property name="mnemonic_widget">domain</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">1</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label8">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="halign">end</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">_Username</property>
- <property name="use_underline">True</property>
- <property name="mnemonic_widget">login</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">3</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
</child>
<child>
- <object class="GtkLabel" id="label9">
+ <object class="GtkLabel" id="subtitle">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="halign">end</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">_Password</property>
- <property name="use_underline">True</property>
- <property name="mnemonic_widget">password</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">4</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="login">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hexpand">True</property>
- <property name="invisible_char">●</property>
- <property name="invisible_char_set">True</property>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">3</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="password">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="hexpand">True</property>
- <property name="visibility">False</property>
- <property name="invisible_char">●</property>
- <property name="activates_default">True</property>
- <property name="invisible_char_set">True</property>
+ <property name="valign">start</property>
+ <property name="margin_bottom">26</property>
+ <property name="label" translatable="yes">Enterprise login allows an existing centrally managed
user account to be used on this device.</property>
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <property name="max-width-chars">45</property>
</object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">4</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
</child>
+
<child>
- <object class="GtkComboBox" id="domain">
+ <object class="GtkGrid" id="form">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="hexpand">True</property>
- <property name="model">realms_model</property>
- <property name="has_entry">True</property>
- <property name="entry_text_column">0</property>
- <child internal-child="entry">
- <object class="GtkEntry" id="domain_entry">
+ <property name="row_spacing">12</property>
+ <property name="column_spacing">12</property>
+ <property name="margin_bottom">32</property>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">_Domain</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">domain</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">_Username</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">login</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">_Password</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">password</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">4</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="login">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ <property name="max-length">255</property>
+ <property name="width-chars">25</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="password">
+ <property name="visible">True</property>
<property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="visibility">False</property>
+ <property name="invisible_char">●</property>
+ <property name="activates_default">True</property>
+ <property name="invisible_char_set">True</property>
+ <property name="max-length">255</property>
+ <property name="width-chars">25</property>
</object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">4</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="domain">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="model">realms_model</property>
+ <property name="has_entry">True</property>
+ <property name="entry_text_column">0</property>
+ <child internal-child="entry">
+ <object class="GtkEntry" id="domain_entry">
+ <property name="can_focus">True</property>
+ <property name="max-length">255</property>
+ <property name="width-chars">25</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_bottom">12</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Enterprise domain or realm name</property>
+ <attributes>
+ <attribute name="scale" value="0.8"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="filler">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
</child>
</object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">1</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="label10">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="margin_bottom">12</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes">Enterprise domain or realm name</property>
- <attributes>
- <attribute name="scale" value="0.8"/>
- </attributes>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">2</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="filler">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- </object>
- <packing>
- <property name="left_attach">2</property>
- <property name="top_attach">4</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
</child>
</object>
</child>
</template>
-
<object class="GtkDialog" id="join_dialog">
<property name="can_focus">False</property>
<property name="border_width">10</property>
@@ -461,7 +465,6 @@
<action-widget response="-5">button2</action-widget>
</action-widgets>
</object>
-
<object class="GtkListStore" id="realms_model">
<columns>
<!-- column-name gchararray -->
diff --git a/gnome-initial-setup/pages/account/gis-account-page-local.c
b/gnome-initial-setup/pages/account/gis-account-page-local.c
index f408c5f..62748ba 100644
--- a/gnome-initial-setup/pages/account/gis-account-page-local.c
+++ b/gnome-initial-setup/pages/account/gis-account-page-local.c
@@ -23,6 +23,7 @@
#include "config.h"
+#include "gis-page.h"
#include "gis-account-page-local.h"
#include "gnome-initial-setup.h"
@@ -31,26 +32,18 @@
#include <string.h>
#include <act/act-user-manager.h>
-#include "pw-utils.h"
#include "um-utils.h"
struct _GisAccountPageLocalPrivate
{
GtkWidget *fullname_entry;
GtkWidget *username_combo;
- GtkWidget *password_entry;
- GtkWidget *confirm_entry;
- GtkWidget *password_strength;
- GtkWidget *password_strength_label;
ActUser *act_user;
ActUserManager *act_client;
gboolean valid_name;
gboolean valid_username;
- gboolean valid_confirm;
- const gchar *password_reason;
- guint reason_timeout;
ActUserAccountType account_type;
};
typedef struct _GisAccountPageLocalPrivate GisAccountPageLocalPrivate;
@@ -78,27 +71,12 @@ clear_account_page (GisAccountPageLocal *page)
priv->valid_name = FALSE;
priv->valid_username = FALSE;
- priv->valid_confirm = FALSE;
/* FIXME: change this for a large deployment scenario; maybe through a GSetting? */
priv->account_type = ACT_USER_ACCOUNT_TYPE_ADMINISTRATOR;
gtk_entry_set_text (GTK_ENTRY (priv->fullname_entry), "");
gtk_list_store_clear (GTK_LIST_STORE (gtk_combo_box_get_model (GTK_COMBO_BOX (priv->username_combo))));
- gtk_entry_set_text (GTK_ENTRY (priv->password_entry), "");
- gtk_entry_set_text (GTK_ENTRY (priv->confirm_entry), "");
-}
-
-static void
-update_valid_confirm (GisAccountPageLocal *page)
-{
- GisAccountPageLocalPrivate *priv = gis_account_page_local_get_instance_private (page);
- const gchar *password, *verify;
-
- password = gtk_entry_get_text (GTK_ENTRY (priv->password_entry));
- verify = gtk_entry_get_text (GTK_ENTRY (priv->confirm_entry));
-
- priv->valid_confirm = strcmp (password, verify) == 0;
}
static void
@@ -153,131 +131,11 @@ username_changed (GtkComboBoxText *combo,
}
else {
clear_entry_validation_error (GTK_ENTRY (entry));
- /* We hit this the first time when there has been no change to password but
- * the two empty passwords are valid for no password.
- */
- update_valid_confirm (page);
- }
-
- validation_changed (page);
-}
-
-static gboolean
-reason_timeout_cb (gpointer data)
-{
- GisAccountPageLocal *page = GIS_ACCOUNT_PAGE_LOCAL (data);
- GisAccountPageLocalPrivate *priv = gis_account_page_local_get_instance_private (page);
- const gchar *password;
- const gchar *verify;
-
- password = gtk_entry_get_text (GTK_ENTRY (priv->password_entry));
- verify = gtk_entry_get_text (GTK_ENTRY (priv->confirm_entry));
-
- if (strlen (password) == 0)
- set_entry_validation_error (GTK_ENTRY (priv->password_entry), _("No password"));
- else
- set_entry_validation_error (GTK_ENTRY (priv->password_entry), priv->password_reason);
-
- if (strlen (verify) > 0 && !priv->valid_confirm)
- set_entry_validation_error (GTK_ENTRY (priv->confirm_entry), _("Passwords do not match"));
-
- priv->reason_timeout = 0;
-
- return G_SOURCE_REMOVE;
-}
-
-static void
-refresh_reason_timeout (GisAccountPageLocal *page)
-{
- GisAccountPageLocalPrivate *priv = gis_account_page_local_get_instance_private (page);
-
- if (priv->reason_timeout != 0)
- g_source_remove (priv->reason_timeout);
-
- priv->reason_timeout = g_timeout_add (600, reason_timeout_cb, page);
-}
-
-static void
-update_password_entries (GisAccountPageLocal *page)
-{
- GisAccountPageLocalPrivate *priv = gis_account_page_local_get_instance_private (page);
- const gchar *password;
- const gchar *username;
- gdouble strength;
- gint strength_level;
- const gchar *hint;
- const gchar *long_hint = NULL;
- gchar *strength_hint;
-
- password = gtk_entry_get_text (GTK_ENTRY (priv->password_entry));
- username = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (priv->username_combo));
-
- strength = pw_strength (password, NULL, username, &hint, &long_hint, &strength_level);
- gtk_level_bar_set_value (GTK_LEVEL_BAR (priv->password_strength), strength_level);
-
- if (strlen (password) == 0)
- strength_hint = g_strdup ("");
- else
- strength_hint = g_strdup_printf (_("Strength: %s"), hint);
- gtk_label_set_label (GTK_LABEL (priv->password_strength_label), strength_hint);
- g_free (strength_hint);
-
- if (strength == 0.0) {
- priv->password_reason = long_hint ? long_hint : hint;
}
- update_valid_confirm (page);
-
- if (priv->valid_confirm)
- clear_entry_validation_error (GTK_ENTRY (priv->password_entry));
-
- gtk_widget_set_sensitive (priv->confirm_entry, TRUE);
-
- refresh_reason_timeout (page);
-}
-
-static void
-password_changed (GtkWidget *w,
- GParamSpec *pspec,
- GisAccountPageLocal *page)
-{
- clear_entry_validation_error (GTK_ENTRY (w));
- update_password_entries (page);
validation_changed (page);
}
-static gboolean
-password_entry_focus_out (GtkWidget *widget,
- GdkEventFocus *event,
- GisAccountPageLocal *page)
-{
- GisAccountPageLocalPrivate *priv = gis_account_page_local_get_instance_private (page);
-
- if (priv->reason_timeout != 0)
- g_source_remove (priv->reason_timeout);
-
- return FALSE;
-}
-
-static gboolean
-confirm_entry_focus_out (GtkWidget *widget,
- GdkEventFocus *event,
- GisAccountPageLocal *page)
-{
- GisAccountPageLocalPrivate *priv = gis_account_page_local_get_instance_private (page);
- GtkEntry *entry = GTK_ENTRY (widget);
- const gchar *verify;
-
- verify = gtk_entry_get_text (entry);
-
- if (strlen (verify) > 0 && !priv->valid_confirm)
- set_entry_validation_error (entry, _("Passwords do not match"));
- else
- clear_entry_validation_error (entry);
-
- return FALSE;
-}
-
static void
gis_account_page_local_constructed (GObject *object)
{
@@ -292,14 +150,6 @@ gis_account_page_local_constructed (GObject *object)
G_CALLBACK (fullname_changed), page);
g_signal_connect (priv->username_combo, "changed",
G_CALLBACK (username_changed), page);
- g_signal_connect (priv->password_entry, "notify::text",
- G_CALLBACK (password_changed), page);
- g_signal_connect (priv->confirm_entry, "notify::text",
- G_CALLBACK (password_changed), page);
- g_signal_connect_after (priv->password_entry, "focus-out-event",
- G_CALLBACK (password_entry_focus_out), page);
- g_signal_connect_after (priv->confirm_entry, "focus-out-event",
- G_CALLBACK (confirm_entry_focus_out), page);
clear_account_page (page);
}
@@ -309,13 +159,11 @@ local_create_user (GisAccountPageLocal *page)
{
GisAccountPageLocalPrivate *priv = gis_account_page_local_get_instance_private (page);
const gchar *username;
- const gchar *password;
const gchar *fullname;
GError *error = NULL;
username = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (priv->username_combo));
fullname = gtk_entry_get_text (GTK_ENTRY (priv->fullname_entry));
- password = gtk_entry_get_text (GTK_ENTRY (priv->password_entry));
priv->act_user = act_user_manager_create_user (priv->act_client, username, fullname, priv->account_type,
&error);
if (error != NULL) {
@@ -326,13 +174,8 @@ local_create_user (GisAccountPageLocal *page)
act_user_set_user_name (priv->act_user, username);
act_user_set_account_type (priv->act_user, priv->account_type);
- if (strlen (password) == 0)
- act_user_set_password_mode (priv->act_user, ACT_USER_PASSWORD_MODE_NONE);
- else
- act_user_set_password (priv->act_user, password, "");
- g_signal_emit (page, signals[USER_CREATED], 0,
- priv->act_user, password);
+ g_signal_emit (page, signals[USER_CREATED], 0, priv->act_user, "");
}
static void
@@ -344,10 +187,6 @@ gis_account_page_local_class_init (GisAccountPageLocalClass *klass)
gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageLocal,
fullname_entry);
gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageLocal,
username_combo);
- gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageLocal,
password_entry);
- gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageLocal,
confirm_entry);
- gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageLocal,
password_strength);
- gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageLocal,
password_strength_label);
object_class->constructed = gis_account_page_local_constructed;
@@ -371,9 +210,7 @@ gis_account_page_local_validate (GisAccountPageLocal *page)
{
GisAccountPageLocalPrivate *priv = gis_account_page_local_get_instance_private (page);
- return priv->valid_name &&
- priv->valid_username &&
- priv->valid_confirm;
+ return priv->valid_name && priv->valid_username;
}
void
@@ -381,3 +218,15 @@ gis_account_page_local_create_user (GisAccountPageLocal *page)
{
local_create_user (page);
}
+
+gboolean
+gis_account_page_local_apply (GisAccountPageLocal *local, GisPage *page)
+{
+ GisAccountPageLocalPrivate *priv = gis_account_page_local_get_instance_private (local);
+ const gchar *username;
+
+ username = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (priv->username_combo));
+ gis_driver_set_username (GIS_PAGE (page)->driver, username);
+
+ return FALSE;
+}
diff --git a/gnome-initial-setup/pages/account/gis-account-page-local.h
b/gnome-initial-setup/pages/account/gis-account-page-local.h
index ed00485..4c4eb15 100644
--- a/gnome-initial-setup/pages/account/gis-account-page-local.h
+++ b/gnome-initial-setup/pages/account/gis-account-page-local.h
@@ -51,6 +51,7 @@ struct _GisAccountPageLocalClass
GType gis_account_page_local_get_type (void);
gboolean gis_account_page_local_validate (GisAccountPageLocal *local);
+gboolean gis_account_page_local_apply (GisAccountPageLocal *local, GisPage *page);
void gis_account_page_local_create_user (GisAccountPageLocal *local);
G_END_DECLS
diff --git a/gnome-initial-setup/pages/account/gis-account-page-local.ui
b/gnome-initial-setup/pages/account/gis-account-page-local.ui
index 2de07ff..3dd740a 100644
--- a/gnome-initial-setup/pages/account/gis-account-page-local.ui
+++ b/gnome-initial-setup/pages/account/gis-account-page-local.ui
@@ -3,269 +3,156 @@
<!-- interface-requires gtk+ 3.0 -->
<template class="GisAccountPageLocal" parent="GtkBin">
<child>
- <object class="GtkGrid" id="area">
+ <object class="GtkBox" id="area">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="row_spacing">6</property>
- <property name="column_spacing">12</property>
+ <property name="halign">center</property>
+ <property name="valign">fill</property>
+ <property name="orientation">vertical</property>
<child>
- <object class="GtkLabel" id="title">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="halign">start</property>
- <property name="valign">start</property>
- <property name="margin_bottom">8</property>
- <property name="hexpand">True</property>
- <property name="label" translatable="yes">Create a Local Account</property>
- <attributes>
- <attribute name="weight" value="bold"/>
- <attribute name="scale" value="1.2"/>
- </attributes>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">0</property>
- <property name="width">2</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="fullname_label">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="halign">end</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">_Full Name</property>
- <property name="use_underline">True</property>
- <property name="mnemonic_widget">fullname_entry</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">1</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="fullname_entry">
- <property name="max_length">255</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="invisible_char">●</property>
- <property name="invisible_char_set">True</property>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">1</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="username_label">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="halign">end</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">_Username</property>
- <property name="use_underline">True</property>
- <property name="mnemonic_widget">username_combo</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">2</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkComboBoxText" id="username_combo">
+ <object class="GtkButton" id="avatar-button">
<property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="has_entry">True</property>
- <property name="entry_text_column">0</property>
- <property name="id_column">1</property>
- <child internal-child="entry">
- <object class="GtkEntry" id="comboboxtext-entry">
- <property name="can_focus">True</property>
+ <property name="margin_top">54</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage" id="avatar-image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixel_size">96</property>
+ <property name="icon_name">avatar-default-symbolic</property>
+ <property name="icon_size">1</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
</object>
</child>
</object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">2</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
</child>
<child>
- <object class="GtkLabel" id="username_explanation">
+ <object class="GtkLabel" id="title">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="halign">start</property>
- <property name="margin_bottom">12</property>
- <property name="label" translatable="yes">This will be used to name your home folder and can't
be changed.</property>
- <property name="wrap">True</property>
+ <property name="halign">center</property>
+ <property name="valign">start</property>
+ <property name="margin_top">26</property>
+ <property name="hexpand">True</property>
+ <property name="label" translatable="yes">About You</property>
<attributes>
- <attribute name="scale" value="0.8"/>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="1.8"/>
</attributes>
</object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">3</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="password_label">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="halign">end</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">_Password</property>
- <property name="use_underline">True</property>
- <property name="mnemonic_widget">password_entry</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">4</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkEntry" id="password_entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="visibility">False</property>
- <property name="invisible_char">●</property>
- <property name="invisible_char_set">True</property>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">4</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="confirm_label">
- <property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="halign">end</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">_Confirm password</property>
- <property name="use_underline">True</property>
- <property name="mnemonic_widget">confirm_entry</property>
- </object>
- <packing>
- <property name="left_attach">0</property>
- <property name="top_attach">5</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
</child>
<child>
- <object class="GtkEntry" id="confirm_entry">
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="visibility">False</property>
- <property name="sensitive">False</property>
- <property name="invisible_char">●</property>
- <property name="invisible_char_set">True</property>
- </object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">5</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
- </child>
- <child>
- <object class="GtkLabel" id="password_explanation">
+ <object class="GtkLabel" id="subtitle">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="halign">start</property>
- <property name="label" translatable="yes">Try to use at least 8 different characters. Mix upper
and lower case and use a number or two.</property>
+ <property name="valign">start</property>
+ <property name="margin_top">14</property>
+ <property name="label" translatable="yes">We need a few details to complete setup.</property>
+ <property name="justify">center</property>
<property name="wrap">True</property>
- <attributes>
- <attribute name="scale" value="0.8"/>
- </attributes>
+ <property name="max-width-chars">50</property>
</object>
- <packing>
- <property name="left_attach">1</property>
- <property name="top_attach">6</property>
- <property name="width">1</property>
- <property name="height">1</property>
- </packing>
</child>
<child>
- <object class="GtkBox" id="box1">
+ <object class="GtkGrid" id="form">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="valign">start</property>
- <property name="orientation">vertical</property>
- <property name="spacing">2</property>
+ <property name="column_spacing">12</property>
+ <property name="row_spacing">12</property>
+ <property name="margin_top">54</property>
<child>
- <object class="GtkLabel" id="password_strength_label">
+ <object class="GtkLabel" id="fullname_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">0</property>
- <property name="label"></property>
- <attributes>
- <attribute name="scale" value="0.8"/>
- </attributes>
+ <property name="halign">end</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">_Full Name</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">fullname_entry</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="fullname_entry">
+ <property name="max_length">255</property>
+ <property name="width-chars">25</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="username_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">_Username</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">username_combo</property>
</object>
<packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">0</property>
+ <property name="left_attach">0</property>
+ <property name="top_attach">4</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
</packing>
</child>
<child>
- <object class="GtkLevelBar" id="password_strength">
+ <object class="GtkComboBoxText" id="username_combo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="has_entry">True</property>
+ <property name="entry_text_column">0</property>
+ <property name="id_column">1</property>
+ <child internal-child="entry">
+ <object class="GtkEntry" id="comboboxtext-entry">
+ <property name="can_focus">True</property>
+ <property name="width-chars">25</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">4</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="username_explanation">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
- <property name="valign">center</property>
- <property name="max-value">4</property>
- <property name="mode">discrete</property>
+ <property name="margin_bottom">12</property>
+ <property name="label" translatable="yes">Your username cannot be changed after
setup.</property>
+ <property name="wrap">True</property>
+ <attributes>
+ <attribute name="scale" value="0.8"/>
+ </attributes>
</object>
<packing>
- <property name="expand">False</property>
- <property name="fill">True</property>
- <property name="position">1</property>
+ <property name="left_attach">1</property>
+ <property name="top_attach">5</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
</packing>
</child>
</object>
- <packing>
- <property name="left_attach">2</property>
- <property name="top_attach">4</property>
- <property name="width">1</property>
- <property name="height">2</property>
- </packing>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
</child>
</object>
</child>
diff --git a/gnome-initial-setup/pages/account/gis-account-page.c
b/gnome-initial-setup/pages/account/gis-account-page.c
index 49d4d47..7b0a02b 100644
--- a/gnome-initial-setup/pages/account/gis-account-page.c
+++ b/gnome-initial-setup/pages/account/gis-account-page.c
@@ -60,6 +60,7 @@ enterprise_apply_complete (GisPage *dummy,
gpointer user_data)
{
GisAccountPage *page = GIS_ACCOUNT_PAGE (user_data);
+ gis_driver_set_username (GIS_PAGE (page)->driver, NULL);
gis_page_apply_complete (GIS_PAGE (page), valid);
}
@@ -126,13 +127,13 @@ gis_account_page_apply (GisPage *gis_page,
switch (priv->mode) {
case UM_LOCAL:
- return FALSE;
+ return gis_account_page_local_apply (GIS_ACCOUNT_PAGE_LOCAL (priv->page_local), gis_page);
case UM_ENTERPRISE:
return gis_account_page_enterprise_apply (GIS_ACCOUNT_PAGE_ENTERPRISE (priv->page_enterprise),
cancellable,
enterprise_apply_complete, page);
- return TRUE;
default:
g_assert_not_reached ();
+ break;
}
}
@@ -199,7 +200,7 @@ gis_account_page_constructed (GObject *object)
static void
gis_account_page_locale_changed (GisPage *page)
{
- gis_page_set_title (GIS_PAGE (page), _("Login"));
+ gis_page_set_title (GIS_PAGE (page), _("About You"));
}
static void
diff --git a/gnome-initial-setup/pages/account/gis-account-page.ui
b/gnome-initial-setup/pages/account/gis-account-page.ui
index c590a9f..3332fc5 100644
--- a/gnome-initial-setup/pages/account/gis-account-page.ui
+++ b/gnome-initial-setup/pages/account/gis-account-page.ui
@@ -7,14 +7,13 @@
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">center</property>
+ <property name="valign">fill</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkStack" id="stack">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="valign">start</property>
- <property name="margin_left">80</property>
- <property name="margin_right">80</property>
<property name="vexpand">True</property>
<child>
<object class="GisAccountPageLocal" id="page_local">
@@ -37,9 +36,10 @@
<object class="GtkToggleButton" id="page_toggle">
<property name="visible">True</property>
<property name="use_underline">True</property>
- <property name="label" translatable="true">_Use Enterprise Login</property>
- <property name="halign">start</property>
+ <property name="label" translatable="true">Setup _Enterprise Login</property>
+ <property name="halign">center</property>
<property name="valign">end</property>
+ <property name="margin_bottom">32</property>
</object>
</child>
</object>
diff --git a/gnome-initial-setup/pages/password/Makefile.am b/gnome-initial-setup/pages/password/Makefile.am
new file mode 100644
index 0000000..015f5e3
--- /dev/null
+++ b/gnome-initial-setup/pages/password/Makefile.am
@@ -0,0 +1,42 @@
+
+NULL =
+
+noinst_LTLIBRARIES = libgispassword.la
+
+BUILT_SOURCES =
+
+um-realm-generated.c: um-realm-generated.h
+um-realm-generated.h: $(srcdir)/org.freedesktop.realmd.xml
+ $(AM_V_GEN) gdbus-codegen \
+ --interface-prefix org.freedesktop.realmd \
+ --generate-c-code um-realm-generated \
+ --c-namespace UmRealm $< \
+ --c-generate-object-manager \
+ --annotate "org.freedesktop.realmd.Realm" org.gtk.GDBus.C.Name Common
+BUILT_SOURCES += um-realm-generated.c um-realm-generated.h
+
+resource_files = $(shell glib-compile-resources --sourcedir=$(srcdir) --generate-dependencies
$(srcdir)/password.gresource.xml)
+password-resources.c: password.gresource.xml $(resource_files)
+ $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir) --generate-source $<
+password-resources.h: password.gresource.xml $(resource_files)
+ $(AM_V_GEN) $(GLIB_COMPILE_RESOURCES) --target=$@ --sourcedir=$(srcdir) --generate-header $<
+BUILT_SOURCES += password-resources.c password-resources.h
+
+libgispassword_la_SOURCES = \
+ $(BUILT_SOURCES) \
+ gis-password-page.c gis-password-page.h \
+ gis-account-page-local.c gis-account-page-local.h \
+ gis-account-page-enterprise.c gis-account-page-enterprise.h \
+ um-realm-manager.c um-realm-manager.h \
+ um-utils.c um-utils.h \
+ pw-utils.c pw-utils.h \
+ $(NULL)
+
+libgispassword_la_CFLAGS = $(INITIAL_SETUP_CFLAGS) -I "$(srcdir)/../.."
+libgispassword_la_LIBADD = $(INITIAL_SETUP_LIBS) -lcrypt
+libgispassword_la_LDFLAGS = -export_dynamic -avoid-version -module -no-undefined
+
+EXTRA_DIST = \
+ org.freedesktop.realmd.xml \
+ password.gresource.xml \
+ $(resource_files)
diff --git a/gnome-initial-setup/pages/password/account-resources.c
b/gnome-initial-setup/pages/password/account-resources.c
new file mode 100644
index 0000000..39cee33
--- /dev/null
+++ b/gnome-initial-setup/pages/password/account-resources.c
@@ -0,0 +1,3381 @@
+#include <gio/gio.h>
+
+#if defined (__ELF__) && ( __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 6))
+# define SECTION __attribute__ ((section (".gresource.account"), aligned (8)))
+#else
+# define SECTION
+#endif
+
+static const SECTION union { const guint8 data[25984]; const double alignment; void * const ptr;}
account_resource_data = { {
+ 0x47, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x18, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x28, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x05, 0x00, 0x00, 0x00, 0x4b, 0x50, 0x90, 0x0b,
+ 0x01, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x4c, 0x00, 0xe8, 0x00, 0x00, 0x00,
+ 0xec, 0x00, 0x00, 0x00, 0xd4, 0xb5, 0x02, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xec, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x4c, 0x00, 0xf0, 0x00, 0x00, 0x00,
+ 0xf4, 0x00, 0x00, 0x00, 0x52, 0x87, 0x91, 0x6a,
+ 0x04, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00,
+ 0x19, 0x00, 0x76, 0x00, 0x10, 0x01, 0x00, 0x00,
+ 0xa8, 0x25, 0x00, 0x00, 0xfa, 0xa8, 0x7d, 0x23,
+ 0x04, 0x00, 0x00, 0x00, 0xa8, 0x25, 0x00, 0x00,
+ 0x13, 0x00, 0x76, 0x00, 0xc0, 0x25, 0x00, 0x00,
+ 0x39, 0x2b, 0x00, 0x00, 0xa7, 0xee, 0x9a, 0xec,
+ 0x06, 0x00, 0x00, 0x00, 0x39, 0x2b, 0x00, 0x00,
+ 0x0e, 0x00, 0x4c, 0x00, 0x48, 0x2b, 0x00, 0x00,
+ 0x54, 0x2b, 0x00, 0x00, 0xa8, 0xa1, 0xf8, 0xa8,
+ 0x04, 0x00, 0x00, 0x00, 0x54, 0x2b, 0x00, 0x00,
+ 0x1e, 0x00, 0x76, 0x00, 0x78, 0x2b, 0x00, 0x00,
+ 0x73, 0x65, 0x00, 0x00, 0xb0, 0xb7, 0x24, 0x30,
+ 0x00, 0x00, 0x00, 0x00, 0x73, 0x65, 0x00, 0x00,
+ 0x06, 0x00, 0x4c, 0x00, 0x7c, 0x65, 0x00, 0x00,
+ 0x80, 0x65, 0x00, 0x00, 0x6f, 0x72, 0x67, 0x2f,
+ 0x06, 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x67, 0x69, 0x73, 0x2d,
+ 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2d,
+ 0x70, 0x61, 0x67, 0x65, 0x2d, 0x6c, 0x6f, 0x63,
+ 0x61, 0x6c, 0x2e, 0x75, 0x69, 0x00, 0x00, 0x00,
+ 0x88, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x3c, 0x3f, 0x78, 0x6d, 0x6c, 0x20, 0x76, 0x65,
+ 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x31,
+ 0x2e, 0x30, 0x22, 0x20, 0x65, 0x6e, 0x63, 0x6f,
+ 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x55, 0x54,
+ 0x46, 0x2d, 0x38, 0x22, 0x3f, 0x3e, 0x0a, 0x3c,
+ 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+ 0x65, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x69,
+ 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+ 0x2d, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65,
+ 0x73, 0x20, 0x67, 0x74, 0x6b, 0x2b, 0x20, 0x33,
+ 0x2e, 0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x3c, 0x74,
+ 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x69, 0x73, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e,
+ 0x74, 0x50, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x63,
+ 0x61, 0x6c, 0x22, 0x20, 0x70, 0x61, 0x72, 0x65,
+ 0x6e, 0x74, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x42,
+ 0x69, 0x6e, 0x22, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x42, 0x6f, 0x78,
+ 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x61, 0x72,
+ 0x65, 0x61, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f,
+ 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46,
+ 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68,
+ 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x63,
+ 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e,
+ 0x66, 0x69, 0x6c, 0x6c, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6f,
+ 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x22, 0x3e, 0x76, 0x65, 0x72, 0x74,
+ 0x69, 0x63, 0x61, 0x6c, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c,
+ 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b,
+ 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x61, 0x76, 0x61, 0x74,
+ 0x61, 0x72, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f,
+ 0x6e, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69,
+ 0x6e, 0x5f, 0x74, 0x6f, 0x70, 0x22, 0x3e, 0x35,
+ 0x34, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x61, 0x6c, 0x69,
+ 0x67, 0x6e, 0x22, 0x3e, 0x63, 0x65, 0x6e, 0x74,
+ 0x65, 0x72, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73,
+ 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x49, 0x6d,
+ 0x61, 0x67, 0x65, 0x22, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x2d,
+ 0x69, 0x6d, 0x61, 0x67, 0x65, 0x22, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63,
+ 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73,
+ 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f,
+ 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3e, 0x39, 0x36,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x69, 0x63, 0x6f, 0x6e, 0x5f,
+ 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x61, 0x76,
+ 0x61, 0x74, 0x61, 0x72, 0x2d, 0x64, 0x65, 0x66,
+ 0x61, 0x75, 0x6c, 0x74, 0x2d, 0x73, 0x79, 0x6d,
+ 0x62, 0x6f, 0x6c, 0x69, 0x63, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x73, 0x69, 0x7a,
+ 0x65, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x3c, 0x63,
+ 0x6c, 0x61, 0x73, 0x73, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x64, 0x69, 0x6d, 0x2d, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x2f, 0x3e, 0x3c,
+ 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x3c,
+ 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e,
+ 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x69, 0x74,
+ 0x6c, 0x65, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f,
+ 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46,
+ 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68,
+ 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x63,
+ 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e,
+ 0x73, 0x74, 0x61, 0x72, 0x74, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x74,
+ 0x6f, 0x70, 0x22, 0x3e, 0x32, 0x36, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x68, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20,
+ 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74,
+ 0x61, 0x62, 0x6c, 0x65, 0x3d, 0x22, 0x79, 0x65,
+ 0x73, 0x22, 0x3e, 0x41, 0x62, 0x6f, 0x75, 0x74,
+ 0x20, 0x59, 0x6f, 0x75, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x73, 0x3e, 0x3c, 0x61, 0x74, 0x74, 0x72,
+ 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x65, 0x69, 0x67,
+ 0x68, 0x74, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x3d, 0x22, 0x62, 0x6f, 0x6c, 0x64, 0x22,
+ 0x2f, 0x3e, 0x3c, 0x61, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x73, 0x63, 0x61, 0x6c, 0x65,
+ 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d,
+ 0x22, 0x31, 0x2e, 0x38, 0x22, 0x2f, 0x3e, 0x3c,
+ 0x2f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x73, 0x3e, 0x3c, 0x2f, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x2f, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73,
+ 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x4c, 0x61,
+ 0x62, 0x65, 0x6c, 0x22, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x73, 0x75, 0x62, 0x74, 0x69, 0x74, 0x6c,
+ 0x65, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66,
+ 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61,
+ 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x61,
+ 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x73, 0x74,
+ 0x61, 0x72, 0x74, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61,
+ 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x70,
+ 0x22, 0x3e, 0x31, 0x34, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72,
+ 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62,
+ 0x6c, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22,
+ 0x3e, 0x57, 0x65, 0x20, 0x6e, 0x65, 0x65, 0x64,
+ 0x20, 0x61, 0x20, 0x66, 0x65, 0x77, 0x20, 0x64,
+ 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x74,
+ 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65,
+ 0x74, 0x65, 0x20, 0x73, 0x65, 0x74, 0x75, 0x70,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6a, 0x75, 0x73, 0x74,
+ 0x69, 0x66, 0x79, 0x22, 0x3e, 0x63, 0x65, 0x6e,
+ 0x74, 0x65, 0x72, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x72,
+ 0x61, 0x70, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x78, 0x2d, 0x77,
+ 0x69, 0x64, 0x74, 0x68, 0x2d, 0x63, 0x68, 0x61,
+ 0x72, 0x73, 0x22, 0x3e, 0x35, 0x30, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
+ 0x47, 0x74, 0x6b, 0x47, 0x72, 0x69, 0x64, 0x22,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x66, 0x6f, 0x72,
+ 0x6d, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66,
+ 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61,
+ 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x6f,
+ 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x73, 0x70, 0x61,
+ 0x63, 0x69, 0x6e, 0x67, 0x22, 0x3e, 0x31, 0x32,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x72, 0x6f, 0x77, 0x5f, 0x73,
+ 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x22, 0x3e,
+ 0x31, 0x32, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72,
+ 0x67, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x70, 0x22,
+ 0x3e, 0x35, 0x34, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61,
+ 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x4c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x66, 0x75, 0x6c, 0x6c, 0x6e, 0x61,
+ 0x6d, 0x65, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c,
+ 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c,
+ 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f,
+ 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c,
+ 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x61, 0x6c,
+ 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x65, 0x6e, 0x64,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x78, 0x61, 0x6c, 0x69, 0x67,
+ 0x6e, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72,
+ 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62,
+ 0x6c, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22,
+ 0x3e, 0x5f, 0x46, 0x75, 0x6c, 0x6c, 0x20, 0x4e,
+ 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x75, 0x73,
+ 0x65, 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c,
+ 0x69, 0x6e, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x6e, 0x65, 0x6d,
+ 0x6f, 0x6e, 0x69, 0x63, 0x5f, 0x77, 0x69, 0x64,
+ 0x67, 0x65, 0x74, 0x22, 0x3e, 0x66, 0x75, 0x6c,
+ 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x65, 0x6e,
+ 0x74, 0x72, 0x79, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c,
+ 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74,
+ 0x61, 0x63, 0x68, 0x22, 0x3e, 0x30, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74,
+ 0x61, 0x63, 0x68, 0x22, 0x3e, 0x33, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e,
+ 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67,
+ 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
+ 0x47, 0x74, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79,
+ 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x66, 0x75,
+ 0x6c, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x65,
+ 0x6e, 0x74, 0x72, 0x79, 0x22, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61,
+ 0x78, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68,
+ 0x22, 0x3e, 0x32, 0x35, 0x35, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x77, 0x69, 0x64, 0x74, 0x68, 0x2d, 0x63, 0x68,
+ 0x61, 0x72, 0x73, 0x22, 0x3e, 0x32, 0x35, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c,
+ 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f,
+ 0x63, 0x75, 0x73, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x69, 0x6e, 0x76, 0x69,
+ 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68,
+ 0x61, 0x72, 0x22, 0x3e, 0xe2, 0x97, 0x8f, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x69, 0x6e, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72,
+ 0x5f, 0x73, 0x65, 0x74, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70,
+ 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c,
+ 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x61,
+ 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61,
+ 0x63, 0x68, 0x22, 0x3e, 0x33, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e, 0x31,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67, 0x68,
+ 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+ 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x75, 0x73, 0x65,
+ 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x61,
+ 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73,
+ 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e,
+ 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e,
+ 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x68, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e,
+ 0x65, 0x6e, 0x64, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x78, 0x61,
+ 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61,
+ 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3d, 0x22, 0x79,
+ 0x65, 0x73, 0x22, 0x3e, 0x5f, 0x55, 0x73, 0x65,
+ 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x75, 0x73, 0x65, 0x5f, 0x75, 0x6e, 0x64, 0x65,
+ 0x72, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x6e,
+ 0x65, 0x6d, 0x6f, 0x6e, 0x69, 0x63, 0x5f, 0x77,
+ 0x69, 0x64, 0x67, 0x65, 0x74, 0x22, 0x3e, 0x75,
+ 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f,
+ 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x30,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x34,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65,
+ 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x43, 0x6f, 0x6d,
+ 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x54, 0x65, 0x78,
+ 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x75,
+ 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f,
+ 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x22, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63,
+ 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73,
+ 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x68, 0x61, 0x73, 0x5f, 0x65, 0x6e,
+ 0x74, 0x72, 0x79, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x65, 0x6e, 0x74, 0x72,
+ 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x63,
+ 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x22, 0x3e, 0x30,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x69, 0x64, 0x5f, 0x63, 0x6f,
+ 0x6c, 0x75, 0x6d, 0x6e, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
+ 0x6c, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3d,
+ 0x22, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x63, 0x6f, 0x6d,
+ 0x62, 0x6f, 0x62, 0x6f, 0x78, 0x74, 0x65, 0x78,
+ 0x74, 0x2d, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63,
+ 0x75, 0x73, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68,
+ 0x2d, 0x63, 0x68, 0x61, 0x72, 0x73, 0x22, 0x3e,
+ 0x32, 0x35, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x2f,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x2f,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c,
+ 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74,
+ 0x61, 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74,
+ 0x61, 0x63, 0x68, 0x22, 0x3e, 0x34, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e,
+ 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67,
+ 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
+ 0x47, 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c,
+ 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x75, 0x73,
+ 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x65,
+ 0x78, 0x70, 0x6c, 0x61, 0x6e, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f,
+ 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46,
+ 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68,
+ 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x73,
+ 0x74, 0x61, 0x72, 0x74, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d,
+ 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x62, 0x6f,
+ 0x74, 0x74, 0x6f, 0x6d, 0x22, 0x3e, 0x31, 0x32,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c,
+ 0x22, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c,
+ 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3d, 0x22,
+ 0x79, 0x65, 0x73, 0x22, 0x3e, 0x59, 0x6f, 0x75,
+ 0x72, 0x20, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61,
+ 0x6d, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f,
+ 0x74, 0x20, 0x62, 0x65, 0x20, 0x63, 0x68, 0x61,
+ 0x6e, 0x67, 0x65, 0x64, 0x20, 0x61, 0x66, 0x74,
+ 0x65, 0x72, 0x20, 0x73, 0x65, 0x74, 0x75, 0x70,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x72, 0x61, 0x70,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62,
+ 0x75, 0x74, 0x65, 0x73, 0x3e, 0x3c, 0x61, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x73, 0x63,
+ 0x61, 0x6c, 0x65, 0x22, 0x20, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x3d, 0x22, 0x30, 0x2e, 0x38, 0x22,
+ 0x2f, 0x3e, 0x3c, 0x2f, 0x61, 0x74, 0x74, 0x72,
+ 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x3e, 0x3c,
+ 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e,
+ 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74,
+ 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74,
+ 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x35, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22,
+ 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69,
+ 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69,
+ 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x2f, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x47, 0x72, 0x69,
+ 0x64, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73,
+ 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x22, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22,
+ 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63,
+ 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x6f, 0x6c, 0x75,
+ 0x6d, 0x6e, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x69,
+ 0x6e, 0x67, 0x22, 0x3e, 0x31, 0x32, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x72, 0x6f, 0x77, 0x5f, 0x73, 0x70, 0x61,
+ 0x63, 0x69, 0x6e, 0x67, 0x22, 0x3e, 0x31, 0x32,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69,
+ 0x6e, 0x5f, 0x74, 0x6f, 0x70, 0x22, 0x3e, 0x31,
+ 0x38, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x4c, 0x61, 0x62,
+ 0x65, 0x6c, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64,
+ 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75,
+ 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x68, 0x61, 0x6c, 0x69, 0x67,
+ 0x6e, 0x22, 0x3e, 0x65, 0x6e, 0x64, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x78, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22,
+ 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x61, 0x62,
+ 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72, 0x61, 0x6e,
+ 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65,
+ 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3e, 0x5f,
+ 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x75, 0x73, 0x65, 0x5f, 0x75,
+ 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x65,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6d, 0x6e, 0x65, 0x6d, 0x6f, 0x6e, 0x69,
+ 0x63, 0x5f, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74,
+ 0x22, 0x3e, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f,
+ 0x72, 0x64, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63,
+ 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66,
+ 0x74, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68,
+ 0x22, 0x3e, 0x30, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74, 0x6f,
+ 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68,
+ 0x22, 0x3e, 0x36, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x69,
+ 0x64, 0x74, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22,
+ 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x70,
+ 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c,
+ 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c,
+ 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b,
+ 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x70, 0x61, 0x73, 0x73, 0x77,
+ 0x6f, 0x72, 0x64, 0x5f, 0x65, 0x6e, 0x74, 0x72,
+ 0x79, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66,
+ 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73,
+ 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22,
+ 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x69, 0x6e, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x22,
+ 0x3e, 0xe2, 0x97, 0x8f, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x69,
+ 0x6e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65,
+ 0x5f, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x65,
+ 0x74, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74,
+ 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22,
+ 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70,
+ 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22,
+ 0x3e, 0x36, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64,
+ 0x74, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e,
+ 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61,
+ 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61,
+ 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x4c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72,
+ 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63,
+ 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x61, 0x6c, 0x69,
+ 0x67, 0x6e, 0x22, 0x3e, 0x65, 0x6e, 0x64, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x78, 0x61, 0x6c, 0x69, 0x67, 0x6e,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x61,
+ 0x62, 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72, 0x61,
+ 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62, 0x6c,
+ 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3e,
+ 0x5f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d,
+ 0x20, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72,
+ 0x64, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x75, 0x73, 0x65, 0x5f,
+ 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69, 0x6e,
+ 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6d, 0x6e, 0x65, 0x6d, 0x6f, 0x6e,
+ 0x69, 0x63, 0x5f, 0x77, 0x69, 0x64, 0x67, 0x65,
+ 0x74, 0x22, 0x3e, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+ 0x72, 0x6d, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63,
+ 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66,
+ 0x74, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68,
+ 0x22, 0x3e, 0x30, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74, 0x6f,
+ 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68,
+ 0x22, 0x3e, 0x37, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x69,
+ 0x64, 0x74, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22,
+ 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x70,
+ 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c,
+ 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c,
+ 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b,
+ 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+ 0x72, 0x6d, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79,
+ 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c,
+ 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f,
+ 0x63, 0x75, 0x73, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0x3e,
+ 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76,
+ 0x65, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x69, 0x6e, 0x76, 0x69, 0x73,
+ 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61,
+ 0x72, 0x22, 0x3e, 0xe2, 0x97, 0x8f, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x69, 0x6e, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x5f,
+ 0x73, 0x65, 0x74, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61,
+ 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x65,
+ 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63,
+ 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74,
+ 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63,
+ 0x68, 0x22, 0x3e, 0x37, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77,
+ 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f,
+ 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e,
+ 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63,
+ 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74,
+ 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x70, 0x61, 0x73, 0x73,
+ 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x65, 0x78, 0x70,
+ 0x6c, 0x61, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c,
+ 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f,
+ 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c,
+ 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x61, 0x6c,
+ 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x73, 0x74, 0x61,
+ 0x72, 0x74, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x61, 0x62,
+ 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72, 0x61, 0x6e,
+ 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65,
+ 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3e, 0x54,
+ 0x72, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73,
+ 0x65, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61,
+ 0x73, 0x74, 0x20, 0x38, 0x20, 0x64, 0x69, 0x66,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x63,
+ 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72,
+ 0x73, 0x2e, 0x20, 0x4d, 0x69, 0x78, 0x20, 0x75,
+ 0x70, 0x70, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63,
+ 0x61, 0x73, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x75, 0x73, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x75,
+ 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x72, 0x20,
+ 0x74, 0x77, 0x6f, 0x2e, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77,
+ 0x72, 0x61, 0x70, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x78, 0x2d,
+ 0x77, 0x69, 0x64, 0x74, 0x68, 0x2d, 0x63, 0x68,
+ 0x61, 0x72, 0x73, 0x22, 0x3e, 0x33, 0x30, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x61, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x73, 0x3e, 0x3c, 0x61,
+ 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x73,
+ 0x63, 0x61, 0x6c, 0x65, 0x22, 0x20, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x30, 0x2e, 0x38,
+ 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x3e,
+ 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x31,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x38,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65,
+ 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x42, 0x6f, 0x78,
+ 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x62, 0x6f,
+ 0x78, 0x31, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f,
+ 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46,
+ 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76,
+ 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x73,
+ 0x74, 0x61, 0x72, 0x74, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6f,
+ 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x22, 0x3e, 0x76, 0x65, 0x72, 0x74,
+ 0x69, 0x63, 0x61, 0x6c, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x73,
+ 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x22, 0x3e,
+ 0x32, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x4c, 0x61, 0x62,
+ 0x65, 0x6c, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64,
+ 0x5f, 0x73, 0x74, 0x72, 0x65, 0x6e, 0x67, 0x74,
+ 0x68, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63,
+ 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x78, 0x61, 0x6c, 0x69,
+ 0x67, 0x6e, 0x22, 0x3e, 0x30, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x2f, 0x3e,
+ 0x3c, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x73, 0x3e, 0x3c, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x73, 0x63, 0x61,
+ 0x6c, 0x65, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x3d, 0x22, 0x30, 0x2e, 0x38, 0x22, 0x2f,
+ 0x3e, 0x3c, 0x2f, 0x61, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x73, 0x3e, 0x3c, 0x2f,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c,
+ 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x22, 0x3e,
+ 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x70, 0x6f, 0x73,
+ 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x30,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63,
+ 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73,
+ 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x4c, 0x65,
+ 0x76, 0x65, 0x6c, 0x42, 0x61, 0x72, 0x22, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x70, 0x61, 0x73, 0x73,
+ 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x73, 0x74, 0x72,
+ 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63,
+ 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73,
+ 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x68, 0x61, 0x6c, 0x69, 0x67, 0x6e,
+ 0x22, 0x3e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e,
+ 0x22, 0x3e, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x78, 0x2d, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x34, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x3e,
+ 0x64, 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63,
+ 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x65, 0x78, 0x70,
+ 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x46, 0x61, 0x6c,
+ 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x66, 0x69, 0x6c,
+ 0x6c, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69,
+ 0x6f, 0x6e, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74,
+ 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22,
+ 0x3e, 0x32, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70,
+ 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22,
+ 0x3e, 0x36, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64,
+ 0x74, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e,
+ 0x32, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61,
+ 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x2f,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c,
+ 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c,
+ 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e,
+ 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61,
+ 0x74, 0x65, 0x3e, 0x3c, 0x2f, 0x69, 0x6e, 0x74,
+ 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x3e, 0x0a,
+ 0x00, 0x00, 0x28, 0x75, 0x75, 0x61, 0x79, 0x29,
+ 0x67, 0x69, 0x73, 0x2d, 0x61, 0x63, 0x63, 0x6f,
+ 0x75, 0x6e, 0x74, 0x2d, 0x70, 0x61, 0x67, 0x65,
+ 0x2e, 0x75, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x69, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x3c, 0x3f, 0x78, 0x6d, 0x6c, 0x20, 0x76, 0x65,
+ 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x31,
+ 0x2e, 0x30, 0x22, 0x20, 0x65, 0x6e, 0x63, 0x6f,
+ 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x55, 0x54,
+ 0x46, 0x2d, 0x38, 0x22, 0x3f, 0x3e, 0x0a, 0x3c,
+ 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+ 0x65, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x69,
+ 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+ 0x2d, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65,
+ 0x73, 0x20, 0x67, 0x74, 0x6b, 0x2b, 0x20, 0x33,
+ 0x2e, 0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x3c, 0x74,
+ 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x69, 0x73, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e,
+ 0x74, 0x50, 0x61, 0x67, 0x65, 0x22, 0x20, 0x70,
+ 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x47,
+ 0x69, 0x73, 0x50, 0x61, 0x67, 0x65, 0x22, 0x3e,
+ 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63,
+ 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74,
+ 0x6b, 0x42, 0x6f, 0x78, 0x22, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75,
+ 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x68, 0x61, 0x6c, 0x69, 0x67,
+ 0x6e, 0x22, 0x3e, 0x63, 0x65, 0x6e, 0x74, 0x65,
+ 0x72, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x61, 0x6c, 0x69,
+ 0x67, 0x6e, 0x22, 0x3e, 0x66, 0x69, 0x6c, 0x6c,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6f, 0x72, 0x69, 0x65, 0x6e,
+ 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e,
+ 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
+ 0x22, 0x47, 0x74, 0x6b, 0x53, 0x74, 0x61, 0x63,
+ 0x6b, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73,
+ 0x74, 0x61, 0x63, 0x6b, 0x22, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69,
+ 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61,
+ 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e,
+ 0x73, 0x74, 0x61, 0x72, 0x74, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x76, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63,
+ 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x69,
+ 0x73, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+ 0x50, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x63, 0x61,
+ 0x6c, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70,
+ 0x61, 0x67, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x61,
+ 0x6c, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x2f, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x69, 0x73, 0x41, 0x63, 0x63,
+ 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x67, 0x65,
+ 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69,
+ 0x73, 0x65, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x70, 0x61, 0x67, 0x65, 0x5f, 0x65, 0x6e, 0x74,
+ 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x22,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x65, 0x78, 0x70, 0x61,
+ 0x6e, 0x64, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x66, 0x69, 0x6c, 0x6c,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f,
+ 0x6e, 0x22, 0x3e, 0x30, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+ 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65,
+ 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x70, 0x61, 0x67, 0x65,
+ 0x5f, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x22,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x75, 0x73, 0x65, 0x5f, 0x75, 0x6e, 0x64,
+ 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72,
+ 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62,
+ 0x6c, 0x65, 0x3d, 0x22, 0x74, 0x72, 0x75, 0x65,
+ 0x22, 0x3e, 0x53, 0x65, 0x74, 0x75, 0x70, 0x20,
+ 0x5f, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72,
+ 0x69, 0x73, 0x65, 0x20, 0x4c, 0x6f, 0x67, 0x69,
+ 0x6e, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x61, 0x6c, 0x69,
+ 0x67, 0x6e, 0x22, 0x3e, 0x63, 0x65, 0x6e, 0x74,
+ 0x65, 0x72, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x61, 0x6c,
+ 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x65, 0x6e, 0x64,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69,
+ 0x6e, 0x5f, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d,
+ 0x22, 0x3e, 0x33, 0x32, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e,
+ 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c,
+ 0x61, 0x74, 0x65, 0x3e, 0x3c, 0x2f, 0x69, 0x6e,
+ 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x3e,
+ 0x0a, 0x00, 0x00, 0x28, 0x75, 0x75, 0x61, 0x79,
+ 0x29, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c,
+ 0x2d, 0x73, 0x65, 0x74, 0x75, 0x70, 0x2f, 0x00,
+ 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x67, 0x69, 0x73, 0x2d,
+ 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2d,
+ 0x70, 0x61, 0x67, 0x65, 0x2d, 0x65, 0x6e, 0x74,
+ 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x2e,
+ 0x75, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xeb, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x3c, 0x3f, 0x78, 0x6d, 0x6c, 0x20, 0x76, 0x65,
+ 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x31,
+ 0x2e, 0x30, 0x22, 0x20, 0x65, 0x6e, 0x63, 0x6f,
+ 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x55, 0x54,
+ 0x46, 0x2d, 0x38, 0x22, 0x3f, 0x3e, 0x0a, 0x3c,
+ 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+ 0x65, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x69,
+ 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+ 0x2d, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65,
+ 0x73, 0x20, 0x67, 0x74, 0x6b, 0x2b, 0x20, 0x33,
+ 0x2e, 0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x3c, 0x74,
+ 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x69, 0x73, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e,
+ 0x74, 0x50, 0x61, 0x67, 0x65, 0x45, 0x6e, 0x74,
+ 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x22,
+ 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d,
+ 0x22, 0x47, 0x74, 0x6b, 0x42, 0x69, 0x6e, 0x22,
+ 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x42, 0x6f, 0x78, 0x22, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x61, 0x72, 0x65, 0x61, 0x22,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63,
+ 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6f, 0x72, 0x69, 0x65,
+ 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22,
+ 0x3e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61,
+ 0x6c, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x61, 0x6c, 0x69,
+ 0x67, 0x6e, 0x22, 0x3e, 0x63, 0x65, 0x6e, 0x74,
+ 0x65, 0x72, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x61, 0x6c,
+ 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x66, 0x69, 0x6c,
+ 0x6c, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x49, 0x6d, 0x61,
+ 0x67, 0x65, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x69, 0x6d, 0x61, 0x67, 0x65, 0x31, 0x22, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75,
+ 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x70, 0x69, 0x78, 0x65, 0x6c,
+ 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3e, 0x39,
+ 0x36, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x69, 0x63, 0x6f, 0x6e,
+ 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x64,
+ 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x2d, 0x70, 0x61,
+ 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2d, 0x73,
+ 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x69, 0x63, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x73,
+ 0x69, 0x7a, 0x65, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f,
+ 0x74, 0x6f, 0x70, 0x22, 0x3e, 0x35, 0x34, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e,
+ 0x5f, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x22,
+ 0x3e, 0x32, 0x36, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x73,
+ 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x3c, 0x63, 0x6c,
+ 0x61, 0x73, 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x64, 0x69, 0x6d, 0x2d, 0x6c, 0x61,
+ 0x62, 0x65, 0x6c, 0x22, 0x2f, 0x3e, 0x3c, 0x2f,
+ 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x3c, 0x2f,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c,
+ 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c,
+ 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b,
+ 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x74, 0x69, 0x74, 0x6c, 0x65,
+ 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c,
+ 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f,
+ 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c,
+ 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x78,
+ 0x70, 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x61, 0x62,
+ 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72, 0x61, 0x6e,
+ 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65,
+ 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3e, 0x45,
+ 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73,
+ 0x65, 0x20, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e,
+ 0x5f, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x22,
+ 0x3e, 0x31, 0x34, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x61,
+ 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
+ 0x73, 0x3e, 0x3c, 0x61, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x77, 0x65, 0x69, 0x67, 0x68,
+ 0x74, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x3d, 0x22, 0x62, 0x6f, 0x6c, 0x64, 0x22, 0x2f,
+ 0x3e, 0x3c, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62,
+ 0x75, 0x74, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x22,
+ 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22,
+ 0x31, 0x2e, 0x38, 0x22, 0x2f, 0x3e, 0x3c, 0x2f,
+ 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x73, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x2f, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x4c, 0x61, 0x62,
+ 0x65, 0x6c, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x73, 0x75, 0x62, 0x74, 0x69, 0x74, 0x6c, 0x65,
+ 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c,
+ 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f,
+ 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c,
+ 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x61, 0x6c,
+ 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x73, 0x74, 0x61,
+ 0x72, 0x74, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72,
+ 0x67, 0x69, 0x6e, 0x5f, 0x62, 0x6f, 0x74, 0x74,
+ 0x6f, 0x6d, 0x22, 0x3e, 0x32, 0x36, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20,
+ 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74,
+ 0x61, 0x62, 0x6c, 0x65, 0x3d, 0x22, 0x79, 0x65,
+ 0x73, 0x22, 0x3e, 0x45, 0x6e, 0x74, 0x65, 0x72,
+ 0x70, 0x72, 0x69, 0x73, 0x65, 0x20, 0x6c, 0x6f,
+ 0x67, 0x69, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x6f,
+ 0x77, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78,
+ 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x63,
+ 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x6c, 0x79,
+ 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64,
+ 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x61, 0x63,
+ 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x74, 0x6f,
+ 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64,
+ 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73,
+ 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6a, 0x75, 0x73, 0x74, 0x69,
+ 0x66, 0x79, 0x22, 0x3e, 0x63, 0x65, 0x6e, 0x74,
+ 0x65, 0x72, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x72, 0x61,
+ 0x70, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69,
+ 0x64, 0x74, 0x68, 0x2d, 0x63, 0x68, 0x61, 0x72,
+ 0x73, 0x22, 0x3e, 0x34, 0x35, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x47, 0x72, 0x69, 0x64, 0x22, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x66, 0x6f, 0x72, 0x6d,
+ 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c,
+ 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f,
+ 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c,
+ 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x72, 0x6f, 0x77,
+ 0x5f, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67,
+ 0x22, 0x3e, 0x31, 0x32, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63,
+ 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x73, 0x70,
+ 0x61, 0x63, 0x69, 0x6e, 0x67, 0x22, 0x3e, 0x31,
+ 0x32, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67,
+ 0x69, 0x6e, 0x5f, 0x62, 0x6f, 0x74, 0x74, 0x6f,
+ 0x6d, 0x22, 0x3e, 0x33, 0x32, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63,
+ 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74,
+ 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65,
+ 0x6c, 0x34, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f,
+ 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46,
+ 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68,
+ 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x65,
+ 0x6e, 0x64, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x78, 0x61, 0x6c,
+ 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20,
+ 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74,
+ 0x61, 0x62, 0x6c, 0x65, 0x3d, 0x22, 0x79, 0x65,
+ 0x73, 0x22, 0x3e, 0x5f, 0x44, 0x6f, 0x6d, 0x61,
+ 0x69, 0x6e, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x75, 0x73, 0x65,
+ 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69,
+ 0x6e, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6d, 0x6e, 0x65, 0x6d, 0x6f,
+ 0x6e, 0x69, 0x63, 0x5f, 0x77, 0x69, 0x64, 0x67,
+ 0x65, 0x74, 0x22, 0x3e, 0x64, 0x6f, 0x6d, 0x61,
+ 0x69, 0x6e, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70,
+ 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c,
+ 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x61,
+ 0x63, 0x68, 0x22, 0x3e, 0x30, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61,
+ 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e, 0x31,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67, 0x68,
+ 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+ 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x61, 0x62,
+ 0x65, 0x6c, 0x38, 0x22, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73,
+ 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e,
+ 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e,
+ 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x68, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e,
+ 0x65, 0x6e, 0x64, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x78, 0x61,
+ 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61,
+ 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3d, 0x22, 0x79,
+ 0x65, 0x73, 0x22, 0x3e, 0x5f, 0x55, 0x73, 0x65,
+ 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x75, 0x73, 0x65, 0x5f, 0x75, 0x6e, 0x64, 0x65,
+ 0x72, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x6e,
+ 0x65, 0x6d, 0x6f, 0x6e, 0x69, 0x63, 0x5f, 0x77,
+ 0x69, 0x64, 0x67, 0x65, 0x74, 0x22, 0x3e, 0x6c,
+ 0x6f, 0x67, 0x69, 0x6e, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e,
+ 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74,
+ 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x30, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74,
+ 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x33, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22,
+ 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69,
+ 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69,
+ 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
+ 0x22, 0x47, 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65,
+ 0x6c, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x39, 0x22, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63,
+ 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73,
+ 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x68, 0x61, 0x6c, 0x69, 0x67, 0x6e,
+ 0x22, 0x3e, 0x65, 0x6e, 0x64, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x78, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e,
+ 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65,
+ 0x6c, 0x22, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73,
+ 0x6c, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3d,
+ 0x22, 0x79, 0x65, 0x73, 0x22, 0x3e, 0x5f, 0x50,
+ 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x75, 0x73, 0x65, 0x5f, 0x75, 0x6e,
+ 0x64, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x65, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6d, 0x6e, 0x65, 0x6d, 0x6f, 0x6e, 0x69, 0x63,
+ 0x5f, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x22,
+ 0x3e, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72,
+ 0x64, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61,
+ 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x65,
+ 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63,
+ 0x68, 0x22, 0x3e, 0x30, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74,
+ 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63,
+ 0x68, 0x22, 0x3e, 0x34, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77,
+ 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f,
+ 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e,
+ 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63,
+ 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74,
+ 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x6f, 0x67, 0x69,
+ 0x6e, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66,
+ 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x78,
+ 0x70, 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x69, 0x6e, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63,
+ 0x68, 0x61, 0x72, 0x22, 0x3e, 0xe2, 0x97, 0x8f,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x69, 0x6e, 0x76, 0x69, 0x73,
+ 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61,
+ 0x72, 0x5f, 0x73, 0x65, 0x74, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61,
+ 0x78, 0x2d, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68,
+ 0x22, 0x3e, 0x32, 0x35, 0x35, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x77, 0x69, 0x64, 0x74, 0x68, 0x2d, 0x63, 0x68,
+ 0x61, 0x72, 0x73, 0x22, 0x3e, 0x32, 0x35, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74,
+ 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22,
+ 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70,
+ 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22,
+ 0x3e, 0x33, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64,
+ 0x74, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e,
+ 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61,
+ 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61,
+ 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x45,
+ 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f,
+ 0x72, 0x64, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f,
+ 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65,
+ 0x78, 0x70, 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69,
+ 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79,
+ 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x69, 0x6e, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72,
+ 0x22, 0x3e, 0xe2, 0x97, 0x8f, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65,
+ 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,
+ 0x74, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x69, 0x6e, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72,
+ 0x5f, 0x73, 0x65, 0x74, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x78,
+ 0x2d, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22,
+ 0x3e, 0x32, 0x35, 0x35, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77,
+ 0x69, 0x64, 0x74, 0x68, 0x2d, 0x63, 0x68, 0x61,
+ 0x72, 0x73, 0x22, 0x3e, 0x32, 0x35, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69,
+ 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f,
+ 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e,
+ 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f,
+ 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e,
+ 0x34, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74,
+ 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68,
+ 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63,
+ 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73,
+ 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x43, 0x6f,
+ 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x22, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x64, 0x6f, 0x6d, 0x61,
+ 0x69, 0x6e, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f,
+ 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46,
+ 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68,
+ 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d,
+ 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x3e, 0x72, 0x65,
+ 0x61, 0x6c, 0x6d, 0x73, 0x5f, 0x6d, 0x6f, 0x64,
+ 0x65, 0x6c, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x61, 0x73,
+ 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x65,
+ 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x74, 0x65, 0x78,
+ 0x74, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e,
+ 0x22, 0x3e, 0x30, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x20, 0x69, 0x6e, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2d, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3d, 0x22, 0x65, 0x6e, 0x74,
+ 0x72, 0x79, 0x22, 0x3e, 0x3c, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73,
+ 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x45, 0x6e,
+ 0x74, 0x72, 0x79, 0x22, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f,
+ 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63,
+ 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6d, 0x61, 0x78, 0x2d, 0x6c, 0x65, 0x6e,
+ 0x67, 0x74, 0x68, 0x22, 0x3e, 0x32, 0x35, 0x35,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68,
+ 0x2d, 0x63, 0x68, 0x61, 0x72, 0x73, 0x22, 0x3e,
+ 0x32, 0x35, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x2f,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x2f,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c,
+ 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74,
+ 0x61, 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74,
+ 0x61, 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e,
+ 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67,
+ 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
+ 0x47, 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c,
+ 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x61,
+ 0x62, 0x65, 0x6c, 0x31, 0x30, 0x22, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63,
+ 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73,
+ 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e,
+ 0x5f, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x22,
+ 0x3e, 0x31, 0x32, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x78, 0x61,
+ 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x30, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61,
+ 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3d, 0x22, 0x79,
+ 0x65, 0x73, 0x22, 0x3e, 0x45, 0x6e, 0x74, 0x65,
+ 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x20, 0x64,
+ 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x6f, 0x72,
+ 0x20, 0x72, 0x65, 0x61, 0x6c, 0x6d, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x61,
+ 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
+ 0x73, 0x3e, 0x3c, 0x61, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x73, 0x63, 0x61, 0x6c, 0x65,
+ 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d,
+ 0x22, 0x30, 0x2e, 0x38, 0x22, 0x2f, 0x3e, 0x3c,
+ 0x2f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x73, 0x3e, 0x3c, 0x2f, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61,
+ 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x65,
+ 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63,
+ 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74,
+ 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63,
+ 0x68, 0x22, 0x3e, 0x32, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77,
+ 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f,
+ 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e,
+ 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63,
+ 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74,
+ 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x66, 0x69, 0x6c, 0x6c,
+ 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f,
+ 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46,
+ 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e,
+ 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74,
+ 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x32, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74,
+ 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x34, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22,
+ 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69,
+ 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69,
+ 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x2f, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x2f, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x2f, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x2f, 0x74,
+ 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x44, 0x69, 0x61, 0x6c, 0x6f, 0x67,
+ 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6a, 0x6f,
+ 0x69, 0x6e, 0x5f, 0x64, 0x69, 0x61, 0x6c, 0x6f,
+ 0x67, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66,
+ 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61,
+ 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x62, 0x6f,
+ 0x72, 0x64, 0x65, 0x72, 0x5f, 0x77, 0x69, 0x64,
+ 0x74, 0x68, 0x22, 0x3e, 0x31, 0x30, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x61, 0x62,
+ 0x6c, 0x65, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x6f, 0x64, 0x61,
+ 0x6c, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f,
+ 0x79, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70,
+ 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74, 0x79,
+ 0x70, 0x65, 0x5f, 0x68, 0x69, 0x6e, 0x74, 0x22,
+ 0x3e, 0x64, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
+ 0x6c, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3d,
+ 0x22, 0x76, 0x62, 0x6f, 0x78, 0x22, 0x3e, 0x3c,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63,
+ 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74,
+ 0x6b, 0x42, 0x6f, 0x78, 0x22, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x64, 0x69, 0x61, 0x6c, 0x6f, 0x67,
+ 0x2d, 0x76, 0x62, 0x6f, 0x78, 0x31, 0x22, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75,
+ 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6f, 0x72, 0x69, 0x65, 0x6e,
+ 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e,
+ 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x73, 0x70, 0x61, 0x63, 0x69,
+ 0x6e, 0x67, 0x22, 0x3e, 0x32, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x69,
+ 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2d,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3d, 0x22, 0x61,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x72,
+ 0x65, 0x61, 0x22, 0x3e, 0x3c, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73,
+ 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x42, 0x75,
+ 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x22,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x69, 0x61,
+ 0x6c, 0x6f, 0x67, 0x2d, 0x61, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x5f, 0x61, 0x72, 0x65, 0x61, 0x31,
+ 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f,
+ 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c,
+ 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x61, 0x79,
+ 0x6f, 0x75, 0x74, 0x5f, 0x73, 0x74, 0x79, 0x6c,
+ 0x65, 0x22, 0x3e, 0x65, 0x6e, 0x64, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e,
+ 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x62, 0x75,
+ 0x74, 0x74, 0x6f, 0x6e, 0x31, 0x22, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x67, 0x74,
+ 0x6b, 0x2d, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x75, 0x73, 0x65, 0x5f, 0x61,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x70,
+ 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65,
+ 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c,
+ 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f,
+ 0x63, 0x75, 0x73, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f,
+ 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73,
+ 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x75, 0x73, 0x65, 0x5f, 0x61, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x70, 0x70, 0x65,
+ 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x3e,
+ 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x75, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x63,
+ 0x6b, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x65, 0x78, 0x70, 0x61,
+ 0x6e, 0x64, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x66, 0x69, 0x6c, 0x6c,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f,
+ 0x6e, 0x22, 0x3e, 0x30, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+ 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e,
+ 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x62, 0x75,
+ 0x74, 0x74, 0x6f, 0x6e, 0x32, 0x22, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72,
+ 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62,
+ 0x6c, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22,
+ 0x3e, 0x43, 0x5f, 0x6f, 0x6e, 0x74, 0x69, 0x6e,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x75, 0x73, 0x65,
+ 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
+ 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e,
+ 0x63, 0x65, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f,
+ 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61,
+ 0x6e, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,
+ 0x74, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x68, 0x61, 0x73, 0x5f, 0x64, 0x65,
+ 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x72, 0x65,
+ 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x5f, 0x64,
+ 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x75,
+ 0x73, 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f,
+ 0x6e, 0x5f, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72,
+ 0x61, 0x6e, 0x63, 0x65, 0x22, 0x3e, 0x46, 0x61,
+ 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x75, 0x73,
+ 0x65, 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c,
+ 0x69, 0x6e, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61,
+ 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x65, 0x78,
+ 0x70, 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x46, 0x61,
+ 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x66, 0x69,
+ 0x6c, 0x6c, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x70, 0x6f, 0x73, 0x69, 0x74,
+ 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69,
+ 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63,
+ 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x65, 0x78, 0x70,
+ 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x46, 0x61, 0x6c,
+ 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x66, 0x69, 0x6c,
+ 0x6c, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x74,
+ 0x79, 0x70, 0x65, 0x22, 0x3e, 0x65, 0x6e, 0x64,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x70, 0x6f, 0x73, 0x69, 0x74,
+ 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x30, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69,
+ 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
+ 0x22, 0x47, 0x74, 0x6b, 0x42, 0x6f, 0x78, 0x22,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x62, 0x6f, 0x78,
+ 0x32, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66,
+ 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61,
+ 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x62, 0x6f,
+ 0x72, 0x64, 0x65, 0x72, 0x5f, 0x77, 0x69, 0x64,
+ 0x74, 0x68, 0x22, 0x3e, 0x35, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x76, 0x65, 0x72,
+ 0x74, 0x69, 0x63, 0x61, 0x6c, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x22,
+ 0x3e, 0x31, 0x30, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61,
+ 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x4c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x37,
+ 0x31, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66,
+ 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61,
+ 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x61,
+ 0x62, 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72, 0x61,
+ 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62, 0x6c,
+ 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3e,
+ 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x41,
+ 0x64, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x72,
+ 0x61, 0x74, 0x6f, 0x72, 0x20, 0x4c, 0x6f, 0x67,
+ 0x69, 0x6e, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x61, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73,
+ 0x3e, 0x3c, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62,
+ 0x75, 0x74, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74,
+ 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d,
+ 0x22, 0x62, 0x6f, 0x6c, 0x64, 0x22, 0x2f, 0x3e,
+ 0x3c, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x22, 0x20,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x31,
+ 0x2e, 0x32, 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x61,
+ 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
+ 0x73, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x65, 0x78, 0x70, 0x61,
+ 0x6e, 0x64, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x66, 0x69, 0x6c, 0x6c,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f,
+ 0x6e, 0x22, 0x3e, 0x30, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+ 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x61, 0x62,
+ 0x65, 0x6c, 0x31, 0x32, 0x22, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69,
+ 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61,
+ 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22,
+ 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x78, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22,
+ 0x3e, 0x30, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x79, 0x61, 0x6c,
+ 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x30, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20,
+ 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74,
+ 0x61, 0x62, 0x6c, 0x65, 0x3d, 0x22, 0x79, 0x65,
+ 0x73, 0x22, 0x3e, 0x49, 0x6e, 0x20, 0x6f, 0x72,
+ 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x75,
+ 0x73, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x65, 0x72,
+ 0x70, 0x72, 0x69, 0x73, 0x65, 0x20, 0x6c, 0x6f,
+ 0x67, 0x69, 0x6e, 0x73, 0x2c, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75,
+ 0x74, 0x65, 0x72, 0x20, 0x6e, 0x65, 0x65, 0x64,
+ 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x0a,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64,
+ 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x20,
+ 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x68,
+ 0x61, 0x76, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x72,
+ 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,
+ 0x20, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x69, 0x73,
+ 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x0a, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74,
+ 0x79, 0x70, 0x65, 0x20, 0x74, 0x68, 0x65, 0x69,
+ 0x72, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e,
+ 0x20, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72,
+ 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x2c, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x63, 0x68, 0x6f, 0x6f,
+ 0x73, 0x65, 0x20, 0x61, 0x20, 0x75, 0x6e, 0x69,
+ 0x71, 0x75, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70,
+ 0x75, 0x74, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x79, 0x6f,
+ 0x75, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75,
+ 0x74, 0x65, 0x72, 0x2e, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e,
+ 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x22,
+ 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x70, 0x6f,
+ 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e,
+ 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61,
+ 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61,
+ 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x47,
+ 0x72, 0x69, 0x64, 0x22, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x67, 0x72, 0x69, 0x64, 0x31, 0x22, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75,
+ 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69,
+ 0x6e, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x22, 0x3e,
+ 0x31, 0x32, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x78,
+ 0x70, 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x72, 0x6f, 0x77,
+ 0x5f, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67,
+ 0x22, 0x3e, 0x36, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x6f,
+ 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x73, 0x70, 0x61,
+ 0x63, 0x69, 0x6e, 0x67, 0x22, 0x3e, 0x31, 0x32,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
+ 0x22, 0x47, 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65,
+ 0x6c, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x31, 0x33, 0x22, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75,
+ 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x78, 0x61, 0x6c, 0x69, 0x67,
+ 0x6e, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72,
+ 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62,
+ 0x6c, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22,
+ 0x3e, 0x5f, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x75, 0x73, 0x65, 0x5f, 0x75,
+ 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x65,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6d, 0x6e, 0x65, 0x6d, 0x6f, 0x6e, 0x69,
+ 0x63, 0x5f, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74,
+ 0x22, 0x3e, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x64,
+ 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x3c,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x64, 0x69, 0x6d, 0x2d,
+ 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x2f, 0x3e,
+ 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e,
+ 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x30,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x30,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65,
+ 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x4c, 0x61, 0x62,
+ 0x65, 0x6c, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x64, 0x6f, 0x6d,
+ 0x61, 0x69, 0x6e, 0x22, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73,
+ 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e,
+ 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e,
+ 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x74,
+ 0x6f, 0x70, 0x22, 0x3e, 0x35, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x62,
+ 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x22, 0x3e, 0x35,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x78, 0x61, 0x6c, 0x69, 0x67,
+ 0x6e, 0x22, 0x3e, 0x30, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e,
+ 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74,
+ 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74,
+ 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x30, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22,
+ 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69,
+ 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69,
+ 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
+ 0x22, 0x47, 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65,
+ 0x6c, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x31, 0x38, 0x22, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75,
+ 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x78, 0x61, 0x6c, 0x69, 0x67,
+ 0x6e, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72,
+ 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62,
+ 0x6c, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22,
+ 0x3e, 0x5f, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74,
+ 0x65, 0x72, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x75, 0x73, 0x65,
+ 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69,
+ 0x6e, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6d, 0x6e, 0x65, 0x6d, 0x6f,
+ 0x6e, 0x69, 0x63, 0x5f, 0x77, 0x69, 0x64, 0x67,
+ 0x65, 0x74, 0x22, 0x3e, 0x6a, 0x6f, 0x69, 0x6e,
+ 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65,
+ 0x72, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x73, 0x74, 0x79,
+ 0x6c, 0x65, 0x3e, 0x3c, 0x63, 0x6c, 0x61, 0x73,
+ 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x64, 0x69, 0x6d, 0x2d, 0x6c, 0x61, 0x62, 0x65,
+ 0x6c, 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x73, 0x74,
+ 0x79, 0x6c, 0x65, 0x3e, 0x3c, 0x2f, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61,
+ 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x65,
+ 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63,
+ 0x68, 0x22, 0x3e, 0x30, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74,
+ 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63,
+ 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77,
+ 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f,
+ 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e,
+ 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63,
+ 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74,
+ 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x6a, 0x6f, 0x69, 0x6e,
+ 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65,
+ 0x72, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66,
+ 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x78,
+ 0x70, 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70,
+ 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c,
+ 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x61,
+ 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61,
+ 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e, 0x31,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67, 0x68,
+ 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+ 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x61, 0x62,
+ 0x65, 0x6c, 0x31, 0x34, 0x22, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69,
+ 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61,
+ 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22,
+ 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x78, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22,
+ 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x61, 0x62,
+ 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72, 0x61, 0x6e,
+ 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65,
+ 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3e, 0x41,
+ 0x64, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x72,
+ 0x61, 0x74, 0x6f, 0x72, 0x20, 0x5f, 0x4e, 0x61,
+ 0x6d, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x75, 0x73, 0x65,
+ 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69,
+ 0x6e, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6d, 0x6e, 0x65, 0x6d, 0x6f,
+ 0x6e, 0x69, 0x63, 0x5f, 0x77, 0x69, 0x64, 0x67,
+ 0x65, 0x74, 0x22, 0x3e, 0x6a, 0x6f, 0x69, 0x6e,
+ 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x3c,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x64, 0x69, 0x6d, 0x2d,
+ 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x2f, 0x3e,
+ 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e,
+ 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x30,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x32,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65,
+ 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x45, 0x6e, 0x74,
+ 0x72, 0x79, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d,
+ 0x65, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66,
+ 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x78,
+ 0x70, 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x69, 0x6e, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63,
+ 0x68, 0x61, 0x72, 0x22, 0x3e, 0xe2, 0x97, 0x8f,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x69, 0x6e, 0x76, 0x69, 0x73,
+ 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61,
+ 0x72, 0x5f, 0x73, 0x65, 0x74, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c,
+ 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74,
+ 0x61, 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74,
+ 0x61, 0x63, 0x68, 0x22, 0x3e, 0x32, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e,
+ 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67,
+ 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
+ 0x47, 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c,
+ 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x61,
+ 0x62, 0x65, 0x6c, 0x31, 0x35, 0x22, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63,
+ 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73,
+ 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x78, 0x61, 0x6c, 0x69, 0x67, 0x6e,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x61,
+ 0x62, 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72, 0x61,
+ 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62, 0x6c,
+ 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3e,
+ 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74,
+ 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x50, 0x61,
+ 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x75, 0x73, 0x65, 0x5f, 0x75, 0x6e, 0x64,
+ 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d,
+ 0x6e, 0x65, 0x6d, 0x6f, 0x6e, 0x69, 0x63, 0x5f,
+ 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x22, 0x3e,
+ 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x73,
+ 0x73, 0x77, 0x6f, 0x72, 0x64, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x3c,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x64, 0x69, 0x6d, 0x2d,
+ 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x2f, 0x3e,
+ 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e,
+ 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x30,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x33,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65,
+ 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x45, 0x6e, 0x74,
+ 0x72, 0x79, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x73,
+ 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63,
+ 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x68, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c,
+ 0x69, 0x74, 0x79, 0x22, 0x3e, 0x46, 0x61, 0x6c,
+ 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x69, 0x6e, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63,
+ 0x68, 0x61, 0x72, 0x22, 0x3e, 0xe2, 0x97, 0x8f,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x61, 0x63, 0x74, 0x69, 0x76,
+ 0x61, 0x74, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x66,
+ 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x69, 0x6e, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63,
+ 0x68, 0x61, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x31,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x33,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65,
+ 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x2f, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61,
+ 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x65, 0x78,
+ 0x70, 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x46, 0x61,
+ 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x66, 0x69,
+ 0x6c, 0x6c, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x70, 0x6f, 0x73, 0x69, 0x74,
+ 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x32, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69,
+ 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63,
+ 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x65, 0x78, 0x70,
+ 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x46, 0x61, 0x6c,
+ 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x66, 0x69, 0x6c,
+ 0x6c, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69,
+ 0x6f, 0x6e, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x61, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x67, 0x65,
+ 0x74, 0x73, 0x3e, 0x3c, 0x61, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x67, 0x65,
+ 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x65, 0x3d, 0x22, 0x2d, 0x36, 0x22, 0x3e,
+ 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x31, 0x3c,
+ 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2d,
+ 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x3e, 0x3c,
+ 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x77,
+ 0x69, 0x64, 0x67, 0x65, 0x74, 0x20, 0x72, 0x65,
+ 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x22,
+ 0x2d, 0x35, 0x22, 0x3e, 0x62, 0x75, 0x74, 0x74,
+ 0x6f, 0x6e, 0x32, 0x3c, 0x2f, 0x61, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x67,
+ 0x65, 0x74, 0x3e, 0x3c, 0x2f, 0x61, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x67,
+ 0x65, 0x74, 0x73, 0x3e, 0x3c, 0x2f, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61,
+ 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x4c,
+ 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65,
+ 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x72, 0x65,
+ 0x61, 0x6c, 0x6d, 0x73, 0x5f, 0x6d, 0x6f, 0x64,
+ 0x65, 0x6c, 0x22, 0x3e, 0x3c, 0x63, 0x6f, 0x6c,
+ 0x75, 0x6d, 0x6e, 0x73, 0x3e, 0x3c, 0x21, 0x2d,
+ 0x2d, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e,
+ 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x67, 0x63,
+ 0x68, 0x61, 0x72, 0x61, 0x72, 0x72, 0x61, 0x79,
+ 0x20, 0x2d, 0x2d, 0x3e, 0x3c, 0x63, 0x6f, 0x6c,
+ 0x75, 0x6d, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65,
+ 0x3d, 0x22, 0x67, 0x63, 0x68, 0x61, 0x72, 0x61,
+ 0x72, 0x72, 0x61, 0x79, 0x22, 0x2f, 0x3e, 0x3c,
+ 0x21, 0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x6c, 0x75,
+ 0x6d, 0x6e, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x20,
+ 0x67, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x2d, 0x2d, 0x3e, 0x3c, 0x63, 0x6f, 0x6c, 0x75,
+ 0x6d, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d,
+ 0x22, 0x47, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x63, 0x6f, 0x6c,
+ 0x75, 0x6d, 0x6e, 0x73, 0x3e, 0x3c, 0x2f, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x2f,
+ 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+ 0x65, 0x3e, 0x0a, 0x00, 0x00, 0x28, 0x75, 0x75,
+ 0x61, 0x79, 0x29, 0x67, 0x6e, 0x6f, 0x6d, 0x65,
+ 0x2f, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00
+} };
+
+static GStaticResource static_resource = { account_resource_data.data, sizeof (account_resource_data.data),
NULL, NULL, NULL };
+extern GResource *account_get_resource (void);
+GResource *account_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) {
+ ...
+ }
+
+*/
+
+#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
+
+
+#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);
+}
diff --git a/gnome-initial-setup/pages/password/account-resources.h
b/gnome-initial-setup/pages/password/account-resources.h
new file mode 100644
index 0000000..d2abafe
--- /dev/null
+++ b/gnome-initial-setup/pages/password/account-resources.h
@@ -0,0 +1,7 @@
+#ifndef __RESOURCE_account_H__
+#define __RESOURCE_account_H__
+
+#include <gio/gio.h>
+
+extern GResource *account_get_resource (void);
+#endif
diff --git a/gnome-initial-setup/pages/password/gis-account-page-enterprise.c
b/gnome-initial-setup/pages/password/gis-account-page-enterprise.c
new file mode 100644
index 0000000..f74a46a
--- /dev/null
+++ b/gnome-initial-setup/pages/password/gis-account-page-enterprise.c
@@ -0,0 +1,816 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+/*
+ * Copyright (C) 2013 Red Hat
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Written by:
+ * Jasper St. Pierre <jstpierre mecheye net>
+ */
+
+#include "config.h"
+
+#include "gis-account-page-enterprise.h"
+#include "gnome-initial-setup.h"
+
+#include <glib/gi18n.h>
+#include <gio/gio.h>
+
+#include <act/act-user-manager.h>
+
+#include "um-realm-manager.h"
+#include "um-utils.h"
+#include "pw-utils.h"
+
+static void join_show_prompt (GisAccountPageEnterprise *page,
+ GError *error);
+
+static void on_join_login (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data);
+
+static void on_realm_joined (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data);
+
+struct _GisAccountPageEnterprisePrivate
+{
+ GtkWidget *login;
+ GtkWidget *password;
+ GtkWidget *domain;
+ GtkWidget *domain_entry;
+ GtkTreeModel *realms_model;
+
+ GtkWidget *join_dialog;
+ GtkWidget *join_name;
+ GtkWidget *join_password;
+ GtkWidget *join_domain;
+ GtkWidget *join_computer;
+
+ ActUserManager *act_client;
+ ActUser *act_user;
+
+ guint realmd_watch;
+ UmRealmManager *realm_manager;
+ gboolean domain_chosen;
+
+ /* Valid during apply */
+ UmRealmObject *realm;
+ GCancellable *cancellable;
+ gboolean join_prompted;
+
+ GisPageApplyCallback apply_complete_callback;
+ gpointer apply_complete_data;
+};
+typedef struct _GisAccountPageEnterprisePrivate GisAccountPageEnterprisePrivate;
+
+G_DEFINE_TYPE_WITH_PRIVATE (GisAccountPageEnterprise, gis_account_page_enterprise, GTK_TYPE_BIN);
+
+enum {
+ VALIDATION_CHANGED,
+ LAST_SIGNAL,
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+static void
+validation_changed (GisAccountPageEnterprise *page)
+{
+ g_signal_emit (page, signals[VALIDATION_CHANGED], 0);
+}
+
+static void
+apply_complete (GisAccountPageEnterprise *page,
+ gboolean valid)
+{
+ GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
+ priv->apply_complete_callback (NULL, valid, priv->apply_complete_data);
+}
+
+static void
+show_error_dialog (GisAccountPageEnterprise *page,
+ const gchar *message,
+ GError *error)
+{
+ GtkWidget *dialog;
+
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
+ return;
+
+ dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (page))),
+ GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_CLOSE,
+ "%s", message);
+
+ if (error != NULL) {
+ g_dbus_error_strip_remote_error (error);
+ gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
+ "%s", error->message);
+ }
+
+ g_signal_connect (dialog, "response", G_CALLBACK (gtk_widget_destroy), NULL);
+ gtk_window_present (GTK_WINDOW (dialog));
+}
+
+gboolean
+gis_account_page_enterprise_validate (GisAccountPageEnterprise *page)
+{
+ const gchar *name;
+ gboolean valid_name;
+ gboolean valid_domain;
+ GtkTreeIter iter;
+ GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
+
+ name = gtk_entry_get_text (GTK_ENTRY (priv->login));
+ valid_name = is_valid_name (name);
+
+ if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (priv->domain), &iter)) {
+ gtk_tree_model_get (gtk_combo_box_get_model (GTK_COMBO_BOX (priv->domain)),
+ &iter, 0, &name, -1);
+ } else {
+ name = gtk_entry_get_text (GTK_ENTRY (priv->domain_entry));
+ }
+
+ valid_domain = is_valid_name (name);
+ return valid_name && valid_domain;
+}
+
+static void
+on_permit_user_login (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GisAccountPageEnterprise *page = user_data;
+ GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
+ UmRealmCommon *common;
+ GError *error = NULL;
+ gchar *login;
+
+ common = UM_REALM_COMMON (source);
+ um_realm_common_call_change_login_policy_finish (common, result, &error);
+ if (error == NULL) {
+
+ /*
+ * Now tell the account service about this user. The account service
+ * should also lookup information about this via the realm and make
+ * sure all that is functional.
+ */
+ login = um_realm_calculate_login (common, gtk_entry_get_text (GTK_ENTRY (priv->login)));
+ g_return_if_fail (login != NULL);
+
+ g_debug ("Caching remote user: %s", login);
+
+ priv->act_user = act_user_manager_cache_user (priv->act_client, login, NULL);
+ apply_complete (page, TRUE);
+
+ g_free (login);
+ } else {
+ show_error_dialog (page, _("Failed to register account"), error);
+ g_message ("Couldn't permit logins on account: %s", error->message);
+ g_error_free (error);
+ apply_complete (page, FALSE);
+ }
+}
+
+static void
+enterprise_permit_user_login (GisAccountPageEnterprise *page, UmRealmObject *realm)
+{
+ GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
+ UmRealmCommon *common;
+ gchar *login;
+ const gchar *add[2];
+ const gchar *remove[1];
+ GVariant *options;
+
+ common = um_realm_object_get_common (realm);
+
+ login = um_realm_calculate_login (common, gtk_entry_get_text (GTK_ENTRY (priv->login)));
+ g_return_if_fail (login != NULL);
+
+ add[0] = login;
+ add[1] = NULL;
+ remove[0] = NULL;
+
+ g_debug ("Permitting login for: %s", login);
+ options = g_variant_new_array (G_VARIANT_TYPE ("{sv}"), NULL, 0);
+
+ um_realm_common_call_change_login_policy (common, "",
+ add, remove, options,
+ priv->cancellable,
+ on_permit_user_login,
+ page);
+
+ g_object_unref (common);
+ g_free (login);
+}
+
+static void
+on_set_static_hostname (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GisAccountPageEnterprise *page = user_data;
+ GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
+ GError *error = NULL;
+ GVariant *retval;
+
+ retval = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source), result, &error);
+ if (error != NULL) {
+ join_show_prompt (page, error);
+ g_error_free (error);
+ return;
+ }
+
+ g_variant_unref (retval);
+
+ /* Prompted for some admin credentials, try to use them to log in */
+ um_realm_login (priv->realm,
+ gtk_entry_get_text (GTK_ENTRY (priv->join_name)),
+ gtk_entry_get_text (GTK_ENTRY (priv->join_password)),
+ priv->cancellable, on_join_login, page);
+}
+
+static void
+on_join_response (GtkDialog *dialog,
+ gint response,
+ gpointer user_data)
+{
+ GisAccountPageEnterprise *page = user_data;
+ GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
+ GDBusConnection *connection;
+ GError *error = NULL;
+ gchar hostname[128];
+ const gchar *name;
+
+ gtk_widget_hide (GTK_WIDGET (dialog));
+ if (response != GTK_RESPONSE_OK) {
+ apply_complete (page, FALSE);
+ return;
+ }
+
+ name = gtk_entry_get_text (GTK_ENTRY (priv->join_computer));
+ if (gethostname (hostname, sizeof (hostname)) == 0 &&
+ !g_str_equal (name, hostname)) {
+ g_debug ("Setting StaticHostname to '%s'", name);
+
+ connection = g_bus_get_sync (G_BUS_TYPE_SYSTEM, priv->cancellable, &error);
+ if (error != NULL) {
+ apply_complete (page, FALSE);
+ g_warning ("Could not get DBus connection: %s", error->message);
+ g_error_free (error);
+ return;
+ }
+
+ g_dbus_connection_call (connection, "org.freedesktop.hostname1",
+ "/org/freedesktop/hostname1", "org.freedesktop.hostname1",
+ "SetStaticHostname",
+ g_variant_new ("(sb)", name, TRUE),
+ G_VARIANT_TYPE ("()"),
+ G_DBUS_CALL_FLAGS_NONE,
+ G_MAXINT, NULL, on_set_static_hostname, page);
+
+ } else {
+ name = gtk_entry_get_text (GTK_ENTRY (priv->join_name));
+ g_debug ("Logging in as admin user: %s", name);
+
+ /* Prompted for some admin credentials, try to use them to log in */
+ um_realm_login (priv->realm, name,
+ gtk_entry_get_text (GTK_ENTRY (priv->join_password)),
+ NULL, on_join_login, page);
+ }
+}
+
+static void
+join_show_prompt (GisAccountPageEnterprise *page,
+ GError *error)
+{
+ GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
+ UmRealmKerberosMembership *membership;
+ UmRealmKerberos *kerberos;
+ gchar hostname[128];
+ const gchar *name;
+
+ gtk_entry_set_text (GTK_ENTRY (priv->join_password), "");
+ gtk_widget_grab_focus (GTK_WIDGET (priv->join_password));
+
+ kerberos = um_realm_object_get_kerberos (priv->realm);
+ membership = um_realm_object_get_kerberos_membership (priv->realm);
+
+ gtk_label_set_text (GTK_LABEL (priv->join_domain),
+ um_realm_kerberos_get_domain_name (kerberos));
+
+ if (gethostname (hostname, sizeof (hostname)) == 0)
+ gtk_entry_set_text (GTK_ENTRY (priv->join_computer), hostname);
+
+ clear_entry_validation_error (GTK_ENTRY (priv->join_name));
+ clear_entry_validation_error (GTK_ENTRY (priv->join_password));
+
+ if (!priv->join_prompted) {
+ name = um_realm_kerberos_membership_get_suggested_administrator (membership);
+ if (name && !g_str_equal (name, "")) {
+ g_debug ("Suggesting admin user: %s", name);
+ gtk_entry_set_text (GTK_ENTRY (priv->join_name), name);
+ } else {
+ gtk_widget_grab_focus (GTK_WIDGET (priv->join_name));
+ }
+
+ } else if (g_error_matches (error, UM_REALM_ERROR, UM_REALM_ERROR_BAD_HOSTNAME)) {
+ g_debug ("Bad host name: %s", error->message);
+ set_entry_validation_error (GTK_ENTRY (priv->join_computer), error->message);
+
+ } else if (g_error_matches (error, UM_REALM_ERROR, UM_REALM_ERROR_BAD_PASSWORD)) {
+ g_debug ("Bad admin password: %s", error->message);
+ set_entry_validation_error (GTK_ENTRY (priv->join_password), error->message);
+
+ } else {
+ g_debug ("Admin login failure: %s", error->message);
+ g_dbus_error_strip_remote_error (error);
+ set_entry_validation_error (GTK_ENTRY (priv->join_name), error->message);
+ }
+
+ g_debug ("Showing admin password dialog");
+ gtk_window_set_transient_for (GTK_WINDOW (priv->join_dialog),
+ GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (page))));
+ gtk_window_set_modal (GTK_WINDOW (priv->join_dialog), TRUE);
+ gtk_window_present (GTK_WINDOW (priv->join_dialog));
+
+ priv->join_prompted = TRUE;
+ g_object_unref (kerberos);
+ g_object_unref (membership);
+
+ /* And now we wait for on_join_response() */
+}
+
+static void
+on_join_login (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GisAccountPageEnterprise *page = user_data;
+ GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
+ GError *error = NULL;
+ GBytes *creds;
+
+ um_realm_login_finish (priv->realm, result, &creds, &error);
+
+ /* Logged in as admin successfully, use creds to join domain */
+ if (error == NULL) {
+ if (!um_realm_join_as_admin (priv->realm,
+ gtk_entry_get_text (GTK_ENTRY (priv->join_name)),
+ gtk_entry_get_text (GTK_ENTRY (priv->join_password)),
+ creds, NULL, on_realm_joined, page)) {
+ show_error_dialog (page, _("No supported way to authenticate with this domain"), NULL);
+ g_message ("Authenticating as admin is not supported by the realm");
+ }
+
+ g_bytes_unref (creds);
+
+ /* Couldn't login as admin, show prompt again */
+ } else {
+ join_show_prompt (page, error);
+ g_message ("Couldn't log in as admin to join domain: %s", error->message);
+ g_error_free (error);
+ }
+}
+
+static void
+on_realm_joined (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GisAccountPageEnterprise *page = user_data;
+ GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
+ GError *error = NULL;
+
+ um_realm_join_finish (priv->realm, result, &error);
+
+ /* Yay, joined the domain, register the user locally */
+ if (error == NULL) {
+ g_debug ("Joining realm completed successfully");
+ enterprise_permit_user_login (page, priv->realm);
+
+ /* Credential failure while joining domain, prompt for admin creds */
+ } else if (g_error_matches (error, UM_REALM_ERROR, UM_REALM_ERROR_BAD_LOGIN) ||
+ g_error_matches (error, UM_REALM_ERROR, UM_REALM_ERROR_BAD_PASSWORD) ||
+ g_error_matches (error, UM_REALM_ERROR, UM_REALM_ERROR_BAD_HOSTNAME)) {
+ g_debug ("Joining realm failed due to credentials or host name");
+
+ join_show_prompt (page, error);
+
+ /* Other failure */
+ } else {
+ show_error_dialog (page, _("Failed to join domain"), error);
+ g_message ("Failed to join the domain: %s", error->message);
+ apply_complete (page, FALSE);
+ }
+
+ g_clear_error (&error);
+}
+
+static void
+on_realm_login (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GisAccountPageEnterprise *page = user_data;
+ GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
+ GError *error = NULL;
+ GBytes *creds = NULL;
+
+ um_realm_login_finish (priv->realm, result, &creds, &error);
+
+ /*
+ * User login is valid, but cannot authenticate right now (eg: user needs
+ * to change password at next login etc.)
+ */
+ if (g_error_matches (error, UM_REALM_ERROR, UM_REALM_ERROR_CANNOT_AUTH)) {
+ g_clear_error (&error);
+ creds = NULL;
+ }
+
+ if (error == NULL) {
+
+ /* Already joined to the domain, just register this user */
+ if (um_realm_is_configured (priv->realm)) {
+ g_debug ("Already joined to this realm");
+ enterprise_permit_user_login (page, priv->realm);
+
+ /* Join the domain, try using the user's creds */
+ } else if (creds == NULL ||
+ !um_realm_join_as_user (priv->realm,
+ gtk_entry_get_text (GTK_ENTRY (priv->login)),
+ gtk_entry_get_text (GTK_ENTRY (priv->password)),
+ creds, priv->cancellable,
+ on_realm_joined,
+ page)) {
+
+ /* If we can't do user auth, try to authenticate as admin */
+ g_debug ("Cannot join with user credentials");
+
+ join_show_prompt (page, error);
+ }
+
+ g_bytes_unref (creds);
+
+ /* A problem with the user's login name or password */
+ } else if (g_error_matches (error, UM_REALM_ERROR, UM_REALM_ERROR_BAD_LOGIN)) {
+ g_debug ("Problem with the user's login: %s", error->message);
+ set_entry_validation_error (GTK_ENTRY (priv->login), error->message);
+ gtk_widget_grab_focus (priv->login);
+ apply_complete (page, FALSE);
+
+ } else if (g_error_matches (error, UM_REALM_ERROR, UM_REALM_ERROR_BAD_PASSWORD)) {
+ g_debug ("Problem with the user's password: %s", error->message);
+ set_entry_validation_error (GTK_ENTRY (priv->password), error->message);
+ gtk_widget_grab_focus (priv->password);
+ apply_complete (page, FALSE);
+
+ /* Other login failure */
+ } else {
+ show_error_dialog (page, _("Failed to log into domain"), error);
+ g_message ("Couldn't log in as user: %s", error->message);
+ apply_complete (page, FALSE);
+ }
+
+ g_clear_error (&error);
+}
+
+static void
+enterprise_check_login (GisAccountPageEnterprise *page)
+{
+ GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
+
+ g_assert (priv->realm);
+
+ um_realm_login (priv->realm,
+ gtk_entry_get_text (GTK_ENTRY (priv->login)),
+ gtk_entry_get_text (GTK_ENTRY (priv->password)),
+ priv->cancellable,
+ on_realm_login,
+ page);
+}
+
+static void
+on_realm_discover_input (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GisAccountPageEnterprise *page = user_data;
+ GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
+ GError *error = NULL;
+ GList *realms;
+
+ realms = um_realm_manager_discover_finish (priv->realm_manager,
+ result, &error);
+
+ /* Found a realm, log user into domain */
+ if (error == NULL) {
+ g_assert (realms != NULL);
+ priv->realm = g_object_ref (realms->data);
+ enterprise_check_login (page);
+ g_list_free_full (realms, g_object_unref);
+
+ } else {
+ /* The domain is likely invalid */
+ g_dbus_error_strip_remote_error (error);
+ g_message ("Couldn't discover domain: %s", error->message);
+ gtk_widget_grab_focus (priv->domain_entry);
+ set_entry_validation_error (GTK_ENTRY (priv->domain_entry), error->message);
+ apply_complete (page, FALSE);
+ g_error_free (error);
+ }
+}
+
+static void
+enterprise_add_user (GisAccountPageEnterprise *page)
+{
+ GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
+ GtkTreeIter iter;
+
+ priv->join_prompted = FALSE;
+ g_clear_object (&priv->realm);
+
+ /* Already know about this realm, try to login as user */
+ if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (priv->domain), &iter)) {
+ gtk_tree_model_get (gtk_combo_box_get_model (GTK_COMBO_BOX (priv->domain)),
+ &iter, 1, &priv->realm, -1);
+ enterprise_check_login (page);
+
+ /* Something the user typed, we need to discover realm */
+ } else {
+ um_realm_manager_discover (priv->realm_manager,
+ gtk_entry_get_text (GTK_ENTRY (priv->domain_entry)),
+ priv->cancellable,
+ on_realm_discover_input,
+ page);
+ }
+}
+
+gboolean
+gis_account_page_enterprise_apply (GisAccountPageEnterprise *page,
+ GCancellable *cancellable,
+ GisPageApplyCallback callback,
+ gpointer data)
+{
+ GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
+
+ priv->apply_complete_callback = callback;
+ priv->apply_complete_data = data;
+ priv->cancellable = g_object_ref (cancellable);
+ enterprise_add_user (page);
+ return TRUE;
+}
+
+static gchar *
+realm_get_name (UmRealmObject *realm)
+{
+ UmRealmCommon *common;
+ gchar *name;
+
+ common = um_realm_object_get_common (realm);
+ name = g_strdup (um_realm_common_get_name (common));
+ g_object_unref (common);
+
+ return name;
+}
+
+static gboolean
+model_contains_realm (GtkTreeModel *model,
+ const gchar *realm_name)
+{
+ gboolean contains = FALSE;
+ GtkTreeIter iter;
+ gboolean match;
+ gchar *name;
+ gboolean ret;
+
+ ret = gtk_tree_model_get_iter_first (model, &iter);
+ while (ret) {
+ gtk_tree_model_get (model, &iter, 0, &name, -1);
+ match = (g_strcmp0 (name, realm_name) == 0);
+ g_free (name);
+ if (match) {
+ g_debug ("ignoring duplicate realm: %s", realm_name);
+ contains = TRUE;
+ break;
+ }
+ ret = gtk_tree_model_iter_next (model, &iter);
+ }
+
+ return contains;
+}
+
+static void
+enterprise_add_realm (GisAccountPageEnterprise *page,
+ UmRealmObject *realm)
+{
+ GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
+ GtkTreeIter iter;
+ gchar *name;
+
+ name = realm_get_name (realm);
+
+ /*
+ * Don't add a second realm if we already have one with this name.
+ * Sometimes realmd returns two realms for the same name, if it has
+ * different ways to use that realm. The first one that realmd
+ * returns is the one it prefers.
+ */
+
+ if (!model_contains_realm (GTK_TREE_MODEL (priv->realms_model), name)) {
+ gtk_list_store_append (GTK_LIST_STORE (priv->realms_model), &iter);
+ gtk_list_store_set (GTK_LIST_STORE (priv->realms_model), &iter,
+ 0, name,
+ 1, realm,
+ -1);
+
+ if (!priv->domain_chosen && um_realm_is_configured (realm))
+ gtk_combo_box_set_active_iter (GTK_COMBO_BOX (priv->domain), &iter);
+
+ g_debug ("added realm to drop down: %s %s", name,
+ g_dbus_object_get_object_path (G_DBUS_OBJECT (realm)));
+ }
+
+ g_free (name);
+}
+
+static void
+on_manager_realm_added (UmRealmManager *manager,
+ UmRealmObject *realm,
+ gpointer user_data)
+{
+ GisAccountPageEnterprise *page = user_data;
+ enterprise_add_realm (page, realm);
+}
+
+static void
+on_realm_manager_created (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GisAccountPageEnterprise *page = user_data;
+ GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
+ GError *error = NULL;
+ GList *realms, *l;
+
+ g_clear_object (&priv->realm_manager);
+ priv->realm_manager = um_realm_manager_new_finish (result, &error);
+
+ if (error != NULL) {
+ g_warning ("Couldn't contact realmd service: %s", error->message);
+ g_error_free (error);
+ return;
+ }
+
+ /* Lookup all the realm objects */
+ realms = um_realm_manager_get_realms (priv->realm_manager);
+ for (l = realms; l != NULL; l = g_list_next (l))
+ enterprise_add_realm (page, l->data);
+
+ g_list_free (realms);
+ g_signal_connect (priv->realm_manager, "realm-added",
+ G_CALLBACK (on_manager_realm_added), page);
+
+ /* When no realms try to discover a sensible default, triggers realm-added signal */
+ um_realm_manager_discover (priv->realm_manager, "", NULL, NULL, NULL);
+ gtk_widget_set_visible (GTK_WIDGET (page), TRUE);
+}
+
+static void
+on_realmd_appeared (GDBusConnection *connection,
+ const gchar *name,
+ const gchar *name_owner,
+ gpointer user_data)
+{
+ GisAccountPageEnterprise *page = user_data;
+ um_realm_manager_new (NULL, on_realm_manager_created, page);
+}
+
+static void
+on_realmd_disappeared (GDBusConnection *unused1,
+ const gchar *unused2,
+ gpointer user_data)
+{
+ GisAccountPageEnterprise *page = user_data;
+ GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
+
+ if (priv->realm_manager != NULL) {
+ g_signal_handlers_disconnect_by_func (priv->realm_manager,
+ on_manager_realm_added,
+ page);
+ g_clear_object (&priv->realm_manager);
+ }
+
+ gtk_widget_set_visible (GTK_WIDGET (page), FALSE);
+}
+
+static void
+on_domain_changed (GtkComboBox *widget,
+ gpointer user_data)
+{
+ GisAccountPageEnterprise *page = user_data;
+ GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
+
+ priv->domain_chosen = TRUE;
+ validation_changed (page);
+ clear_entry_validation_error (GTK_ENTRY (gtk_bin_get_child (GTK_BIN (widget))));
+}
+
+static void
+on_entry_changed (GtkEditable *editable,
+ gpointer user_data)
+{
+ GisAccountPageEnterprise *page = user_data;
+ validation_changed (page);
+ clear_entry_validation_error (GTK_ENTRY (editable));
+}
+
+static void
+gis_account_page_enterprise_constructed (GObject *object)
+{
+ GisAccountPageEnterprise *page = GIS_ACCOUNT_PAGE_ENTERPRISE (object);
+ GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
+
+ G_OBJECT_CLASS (gis_account_page_enterprise_parent_class)->constructed (object);
+
+ priv->act_client = act_user_manager_get_default ();
+
+ priv->realmd_watch = g_bus_watch_name (G_BUS_TYPE_SYSTEM, "org.freedesktop.realmd",
+ G_BUS_NAME_WATCHER_FLAGS_AUTO_START,
+ on_realmd_appeared, on_realmd_disappeared,
+ page, NULL);
+
+ g_signal_connect (priv->join_dialog, "response",
+ G_CALLBACK (on_join_response), page);
+ g_signal_connect (priv->domain, "changed",
+ G_CALLBACK (on_domain_changed), page);
+ g_signal_connect (priv->login, "changed",
+ G_CALLBACK (on_entry_changed), page);
+}
+
+static void
+gis_account_page_enterprise_dispose (GObject *object)
+{
+ GisAccountPageEnterprise *page = GIS_ACCOUNT_PAGE_ENTERPRISE (object);
+ GisAccountPageEnterprisePrivate *priv = gis_account_page_enterprise_get_instance_private (page);
+
+ if (priv->realmd_watch)
+ g_bus_unwatch_name (priv->realmd_watch);
+
+ priv->realmd_watch = 0;
+
+ g_cancellable_cancel (priv->cancellable);
+
+ g_clear_object (&priv->realm_manager);
+ g_clear_object (&priv->realm);
+ g_clear_object (&priv->cancellable);
+
+ G_OBJECT_CLASS (gis_account_page_enterprise_parent_class)->dispose (object);
+}
+
+static void
+gis_account_page_enterprise_class_init (GisAccountPageEnterpriseClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->constructed = gis_account_page_enterprise_constructed;
+ object_class->dispose = gis_account_page_enterprise_dispose;
+
+ gtk_widget_class_set_template_from_resource (GTK_WIDGET_CLASS (klass),
"/org/gnome/initial-setup/gis-account-page-enterprise.ui");
+
+ gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageEnterprise, login);
+ gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageEnterprise,
password);
+ gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageEnterprise, domain);
+ gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageEnterprise,
domain_entry);
+ gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageEnterprise,
realms_model);
+
+ gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageEnterprise,
join_dialog);
+ gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageEnterprise,
join_name);
+ gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageEnterprise,
join_password);
+ gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageEnterprise,
join_domain);
+ gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageEnterprise,
join_computer);
+
+ signals[VALIDATION_CHANGED] = g_signal_new ("validation-changed", GIS_TYPE_ACCOUNT_PAGE_ENTERPRISE,
+ G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL,
+ G_TYPE_NONE, 0);
+}
+
+static void
+gis_account_page_enterprise_init (GisAccountPageEnterprise *page)
+{
+ gtk_widget_init_template (GTK_WIDGET (page));
+}
diff --git a/gnome-initial-setup/pages/password/gis-account-page-enterprise.h
b/gnome-initial-setup/pages/password/gis-account-page-enterprise.h
new file mode 100644
index 0000000..2c7d14f
--- /dev/null
+++ b/gnome-initial-setup/pages/password/gis-account-page-enterprise.h
@@ -0,0 +1,64 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+/*
+ * Copyright (C) 2013 Red Hat
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Written by:
+ * Jasper St. Pierre <jstpierre mecheye net>
+ */
+
+#ifndef __GIS_ACCOUNT_PAGE_ENTERPRISE_H__
+#define __GIS_ACCOUNT_PAGE_ENTERPRISE_H__
+
+#include <gtk/gtk.h>
+
+/* For GisPageApplyCallback */
+#include "gis-page.h"
+
+G_BEGIN_DECLS
+
+#define GIS_TYPE_ACCOUNT_PAGE_ENTERPRISE (gis_account_page_enterprise_get_type ())
+#define GIS_ACCOUNT_PAGE_ENTERPRISE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),
GIS_TYPE_ACCOUNT_PAGE_ENTERPRISE, GisAccountPageEnterprise))
+#define GIS_ACCOUNT_PAGE_ENTERPRISE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass),
GIS_TYPE_ACCOUNT_PAGE_ENTERPRISE, GisAccountPageEnterpriseClass))
+#define GIS_IS_ACCOUNT_PAGE_ENTERPRISE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj),
GIS_TYPE_ACCOUNT_PAGE_ENTERPRISE))
+#define GIS_IS_ACCOUNT_PAGE_ENTERPRISE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),
GIS_TYPE_ACCOUNT_PAGE_ENTERPRISE))
+#define GIS_ACCOUNT_PAGE_ENTERPRISE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),
GIS_TYPE_ACCOUNT_PAGE_ENTERPRISE, GisAccountPageEnterpriseClass))
+
+typedef struct _GisAccountPageEnterprise GisAccountPageEnterprise;
+typedef struct _GisAccountPageEnterpriseClass GisAccountPageEnterpriseClass;
+
+struct _GisAccountPageEnterprise
+{
+ GtkBin parent;
+};
+
+struct _GisAccountPageEnterpriseClass
+{
+ GtkBinClass parent_class;
+};
+
+GType gis_account_page_enterprise_get_type (void);
+
+gboolean gis_account_page_enterprise_validate (GisAccountPageEnterprise *enterprise);
+gboolean gis_account_page_enterprise_apply (GisAccountPageEnterprise *enterprise,
+ GCancellable *cancellable,
+ GisPageApplyCallback callback,
+ gpointer data);
+
+G_END_DECLS
+
+#endif /* __GIS_ACCOUNT_PAGE_ENTERPRISE_H__ */
diff --git a/gnome-initial-setup/pages/password/gis-account-page-enterprise.ui
b/gnome-initial-setup/pages/password/gis-account-page-enterprise.ui
new file mode 100644
index 0000000..efdb77b
--- /dev/null
+++ b/gnome-initial-setup/pages/password/gis-account-page-enterprise.ui
@@ -0,0 +1,476 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.0 -->
+ <template class="GisAccountPageEnterprise" parent="GtkBin">
+ <child>
+ <object class="GtkBox" id="area">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="halign">center</property>
+ <property name="valign">fill</property>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixel_size">96</property>
+ <property name="icon_name">dialog-password-symbolic</property>
+ <property name="icon_size">1</property>
+ <property name="margin_top">54</property>
+ <property name="margin_bottom">26</property>
+ <style>
+ <class name="dim-label" />
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="title">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="label" translatable="yes">Enterprise Login</property>
+ <property name="margin_bottom">14</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="1.8"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="subtitle">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="margin_bottom">26</property>
+ <property name="label" translatable="yes">Enterprise login allows an existing centrally managed
user account to be used on this device.</property>
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <property name="max-width-chars">45</property>
+ </object>
+ </child>
+
+ <child>
+ <object class="GtkGrid" id="form">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="row_spacing">12</property>
+ <property name="column_spacing">12</property>
+ <property name="margin_bottom">32</property>
+ <child>
+ <object class="GtkLabel" id="label4">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">_Domain</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">domain</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label8">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">_Username</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">login</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label9">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">_Password</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">password</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">4</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="login">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ <property name="max-length">255</property>
+ <property name="width-chars">25</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="password">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="visibility">False</property>
+ <property name="invisible_char">●</property>
+ <property name="activates_default">True</property>
+ <property name="invisible_char_set">True</property>
+ <property name="max-length">255</property>
+ <property name="width-chars">25</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">4</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBox" id="domain">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="hexpand">True</property>
+ <property name="model">realms_model</property>
+ <property name="has_entry">True</property>
+ <property name="entry_text_column">0</property>
+ <child internal-child="entry">
+ <object class="GtkEntry" id="domain_entry">
+ <property name="can_focus">True</property>
+ <property name="max-length">255</property>
+ <property name="width-chars">25</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label10">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_bottom">12</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Enterprise domain or realm name</property>
+ <attributes>
+ <attribute name="scale" value="0.8"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="filler">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">4</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+ <object class="GtkDialog" id="join_dialog">
+ <property name="can_focus">False</property>
+ <property name="border_width">10</property>
+ <property name="resizable">False</property>
+ <property name="modal">True</property>
+ <property name="destroy_with_parent">True</property>
+ <property name="type_hint">dialog</property>
+ <child internal-child="vbox">
+ <object class="GtkBox" id="dialog-vbox1">
+ <property name="can_focus">False</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child internal-child="action_area">
+ <object class="GtkButtonBox" id="dialog-action_area1">
+ <property name="can_focus">False</property>
+ <property name="layout_style">end</property>
+ <child>
+ <object class="GtkButton" id="button1">
+ <property name="label">gtk-cancel</property>
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_stock">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkButton" id="button2">
+ <property name="label" translatable="yes">C_ontinue</property>
+ <property name="use_action_appearance">False</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="can_default">True</property>
+ <property name="has_default">True</property>
+ <property name="receives_default">True</property>
+ <property name="use_action_appearance">False</property>
+ <property name="use_underline">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">end</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box2">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="border_width">5</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">10</property>
+ <child>
+ <object class="GtkLabel" id="label71">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Domain Administrator Login</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="1.2"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label12">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="yalign">0</property>
+ <property name="label" translatable="yes">In order to use enterprise logins, this computer
needs to be
+ enrolled in the domain. Please have your network administrator
+ type their domain password here, and choose a unique computer
+ name for your computer.</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkGrid" id="grid1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_left">12</property>
+ <property name="hexpand">True</property>
+ <property name="row_spacing">6</property>
+ <property name="column_spacing">12</property>
+ <child>
+ <object class="GtkLabel" id="label13">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">_Domain</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">join_domain</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="join_domain">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="margin_top">5</property>
+ <property name="margin_bottom">5</property>
+ <property name="xalign">0</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label18">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">_Computer</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">join_computer</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="join_computer">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label14">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">Administrator _Name</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">join_name</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">2</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="join_name">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="label15">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">Administrator Password</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">join_password</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="join_password">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="hexpand">True</property>
+ <property name="visibility">False</property>
+ <property name="invisible_char">●</property>
+ <property name="activates_default">True</property>
+ <property name="invisible_char_set">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="-6">button1</action-widget>
+ <action-widget response="-5">button2</action-widget>
+ </action-widgets>
+ </object>
+ <object class="GtkListStore" id="realms_model">
+ <columns>
+ <!-- column-name gchararray -->
+ <column type="gchararray"/>
+ <!-- column-name gobject -->
+ <column type="GObject"/>
+ </columns>
+ </object>
+</interface>
diff --git a/gnome-initial-setup/pages/password/gis-account-page-local.c
b/gnome-initial-setup/pages/password/gis-account-page-local.c
new file mode 100644
index 0000000..f408c5f
--- /dev/null
+++ b/gnome-initial-setup/pages/password/gis-account-page-local.c
@@ -0,0 +1,383 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+/*
+ * Copyright (C) 2013 Red Hat
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Written by:
+ * Jasper St. Pierre <jstpierre mecheye net>
+ */
+
+#include "config.h"
+
+#include "gis-account-page-local.h"
+#include "gnome-initial-setup.h"
+
+#include <glib/gi18n.h>
+#include <gio/gio.h>
+
+#include <string.h>
+#include <act/act-user-manager.h>
+#include "pw-utils.h"
+#include "um-utils.h"
+
+struct _GisAccountPageLocalPrivate
+{
+ GtkWidget *fullname_entry;
+ GtkWidget *username_combo;
+ GtkWidget *password_entry;
+ GtkWidget *confirm_entry;
+ GtkWidget *password_strength;
+ GtkWidget *password_strength_label;
+
+ ActUser *act_user;
+ ActUserManager *act_client;
+
+ gboolean valid_name;
+ gboolean valid_username;
+ gboolean valid_confirm;
+ const gchar *password_reason;
+ guint reason_timeout;
+ ActUserAccountType account_type;
+};
+typedef struct _GisAccountPageLocalPrivate GisAccountPageLocalPrivate;
+
+G_DEFINE_TYPE_WITH_PRIVATE (GisAccountPageLocal, gis_account_page_local, GTK_TYPE_BIN);
+
+enum {
+ VALIDATION_CHANGED,
+ USER_CREATED,
+ LAST_SIGNAL,
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+static void
+validation_changed (GisAccountPageLocal *page)
+{
+ g_signal_emit (page, signals[VALIDATION_CHANGED], 0);
+}
+
+static void
+clear_account_page (GisAccountPageLocal *page)
+{
+ GisAccountPageLocalPrivate *priv = gis_account_page_local_get_instance_private (page);
+
+ priv->valid_name = FALSE;
+ priv->valid_username = FALSE;
+ priv->valid_confirm = FALSE;
+
+ /* FIXME: change this for a large deployment scenario; maybe through a GSetting? */
+ priv->account_type = ACT_USER_ACCOUNT_TYPE_ADMINISTRATOR;
+
+ gtk_entry_set_text (GTK_ENTRY (priv->fullname_entry), "");
+ gtk_list_store_clear (GTK_LIST_STORE (gtk_combo_box_get_model (GTK_COMBO_BOX (priv->username_combo))));
+ gtk_entry_set_text (GTK_ENTRY (priv->password_entry), "");
+ gtk_entry_set_text (GTK_ENTRY (priv->confirm_entry), "");
+}
+
+static void
+update_valid_confirm (GisAccountPageLocal *page)
+{
+ GisAccountPageLocalPrivate *priv = gis_account_page_local_get_instance_private (page);
+ const gchar *password, *verify;
+
+ password = gtk_entry_get_text (GTK_ENTRY (priv->password_entry));
+ verify = gtk_entry_get_text (GTK_ENTRY (priv->confirm_entry));
+
+ priv->valid_confirm = strcmp (password, verify) == 0;
+}
+
+static void
+fullname_changed (GtkWidget *w,
+ GParamSpec *pspec,
+ GisAccountPageLocal *page)
+{
+ GisAccountPageLocalPrivate *priv = gis_account_page_local_get_instance_private (page);
+ GtkWidget *entry;
+ GtkTreeModel *model;
+ const char *name;
+
+ name = gtk_entry_get_text (GTK_ENTRY (w));
+
+ entry = gtk_bin_get_child (GTK_BIN (priv->username_combo));
+ model = gtk_combo_box_get_model (GTK_COMBO_BOX (priv->username_combo));
+
+ gtk_list_store_clear (GTK_LIST_STORE (model));
+
+ priv->valid_name = is_valid_name (name);
+
+ if (!priv->valid_name) {
+ gtk_entry_set_text (GTK_ENTRY (entry), "");
+ return;
+ }
+
+ generate_username_choices (name, GTK_LIST_STORE (model));
+
+ gtk_combo_box_set_active (GTK_COMBO_BOX (priv->username_combo), 0);
+
+ validation_changed (page);
+}
+
+static void
+username_changed (GtkComboBoxText *combo,
+ GisAccountPageLocal *page)
+{
+ GisAccountPageLocalPrivate *priv = gis_account_page_local_get_instance_private (page);
+ const gchar *username;
+ gchar *tip;
+ GtkWidget *entry;
+
+ username = gtk_combo_box_text_get_active_text (combo);
+
+ priv->valid_username = is_valid_username (username, &tip);
+
+ entry = gtk_bin_get_child (GTK_BIN (combo));
+
+ if (tip) {
+ set_entry_validation_error (GTK_ENTRY (entry), tip);
+ g_free (tip);
+ }
+ else {
+ clear_entry_validation_error (GTK_ENTRY (entry));
+ /* We hit this the first time when there has been no change to password but
+ * the two empty passwords are valid for no password.
+ */
+ update_valid_confirm (page);
+ }
+
+ validation_changed (page);
+}
+
+static gboolean
+reason_timeout_cb (gpointer data)
+{
+ GisAccountPageLocal *page = GIS_ACCOUNT_PAGE_LOCAL (data);
+ GisAccountPageLocalPrivate *priv = gis_account_page_local_get_instance_private (page);
+ const gchar *password;
+ const gchar *verify;
+
+ password = gtk_entry_get_text (GTK_ENTRY (priv->password_entry));
+ verify = gtk_entry_get_text (GTK_ENTRY (priv->confirm_entry));
+
+ if (strlen (password) == 0)
+ set_entry_validation_error (GTK_ENTRY (priv->password_entry), _("No password"));
+ else
+ set_entry_validation_error (GTK_ENTRY (priv->password_entry), priv->password_reason);
+
+ if (strlen (verify) > 0 && !priv->valid_confirm)
+ set_entry_validation_error (GTK_ENTRY (priv->confirm_entry), _("Passwords do not match"));
+
+ priv->reason_timeout = 0;
+
+ return G_SOURCE_REMOVE;
+}
+
+static void
+refresh_reason_timeout (GisAccountPageLocal *page)
+{
+ GisAccountPageLocalPrivate *priv = gis_account_page_local_get_instance_private (page);
+
+ if (priv->reason_timeout != 0)
+ g_source_remove (priv->reason_timeout);
+
+ priv->reason_timeout = g_timeout_add (600, reason_timeout_cb, page);
+}
+
+static void
+update_password_entries (GisAccountPageLocal *page)
+{
+ GisAccountPageLocalPrivate *priv = gis_account_page_local_get_instance_private (page);
+ const gchar *password;
+ const gchar *username;
+ gdouble strength;
+ gint strength_level;
+ const gchar *hint;
+ const gchar *long_hint = NULL;
+ gchar *strength_hint;
+
+ password = gtk_entry_get_text (GTK_ENTRY (priv->password_entry));
+ username = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (priv->username_combo));
+
+ strength = pw_strength (password, NULL, username, &hint, &long_hint, &strength_level);
+ gtk_level_bar_set_value (GTK_LEVEL_BAR (priv->password_strength), strength_level);
+
+ if (strlen (password) == 0)
+ strength_hint = g_strdup ("");
+ else
+ strength_hint = g_strdup_printf (_("Strength: %s"), hint);
+ gtk_label_set_label (GTK_LABEL (priv->password_strength_label), strength_hint);
+ g_free (strength_hint);
+
+ if (strength == 0.0) {
+ priv->password_reason = long_hint ? long_hint : hint;
+ }
+
+ update_valid_confirm (page);
+
+ if (priv->valid_confirm)
+ clear_entry_validation_error (GTK_ENTRY (priv->password_entry));
+
+ gtk_widget_set_sensitive (priv->confirm_entry, TRUE);
+
+ refresh_reason_timeout (page);
+}
+
+static void
+password_changed (GtkWidget *w,
+ GParamSpec *pspec,
+ GisAccountPageLocal *page)
+{
+ clear_entry_validation_error (GTK_ENTRY (w));
+ update_password_entries (page);
+ validation_changed (page);
+}
+
+static gboolean
+password_entry_focus_out (GtkWidget *widget,
+ GdkEventFocus *event,
+ GisAccountPageLocal *page)
+{
+ GisAccountPageLocalPrivate *priv = gis_account_page_local_get_instance_private (page);
+
+ if (priv->reason_timeout != 0)
+ g_source_remove (priv->reason_timeout);
+
+ return FALSE;
+}
+
+static gboolean
+confirm_entry_focus_out (GtkWidget *widget,
+ GdkEventFocus *event,
+ GisAccountPageLocal *page)
+{
+ GisAccountPageLocalPrivate *priv = gis_account_page_local_get_instance_private (page);
+ GtkEntry *entry = GTK_ENTRY (widget);
+ const gchar *verify;
+
+ verify = gtk_entry_get_text (entry);
+
+ if (strlen (verify) > 0 && !priv->valid_confirm)
+ set_entry_validation_error (entry, _("Passwords do not match"));
+ else
+ clear_entry_validation_error (entry);
+
+ return FALSE;
+}
+
+static void
+gis_account_page_local_constructed (GObject *object)
+{
+ GisAccountPageLocal *page = GIS_ACCOUNT_PAGE_LOCAL (object);
+ GisAccountPageLocalPrivate *priv = gis_account_page_local_get_instance_private (page);
+
+ G_OBJECT_CLASS (gis_account_page_local_parent_class)->constructed (object);
+
+ priv->act_client = act_user_manager_get_default ();
+
+ g_signal_connect (priv->fullname_entry, "notify::text",
+ G_CALLBACK (fullname_changed), page);
+ g_signal_connect (priv->username_combo, "changed",
+ G_CALLBACK (username_changed), page);
+ g_signal_connect (priv->password_entry, "notify::text",
+ G_CALLBACK (password_changed), page);
+ g_signal_connect (priv->confirm_entry, "notify::text",
+ G_CALLBACK (password_changed), page);
+ g_signal_connect_after (priv->password_entry, "focus-out-event",
+ G_CALLBACK (password_entry_focus_out), page);
+ g_signal_connect_after (priv->confirm_entry, "focus-out-event",
+ G_CALLBACK (confirm_entry_focus_out), page);
+
+ clear_account_page (page);
+}
+
+static void
+local_create_user (GisAccountPageLocal *page)
+{
+ GisAccountPageLocalPrivate *priv = gis_account_page_local_get_instance_private (page);
+ const gchar *username;
+ const gchar *password;
+ const gchar *fullname;
+ GError *error = NULL;
+
+ username = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (priv->username_combo));
+ fullname = gtk_entry_get_text (GTK_ENTRY (priv->fullname_entry));
+ password = gtk_entry_get_text (GTK_ENTRY (priv->password_entry));
+
+ priv->act_user = act_user_manager_create_user (priv->act_client, username, fullname, priv->account_type,
&error);
+ if (error != NULL) {
+ g_warning ("Failed to create user: %s", error->message);
+ g_error_free (error);
+ return;
+ }
+
+ act_user_set_user_name (priv->act_user, username);
+ act_user_set_account_type (priv->act_user, priv->account_type);
+ if (strlen (password) == 0)
+ act_user_set_password_mode (priv->act_user, ACT_USER_PASSWORD_MODE_NONE);
+ else
+ act_user_set_password (priv->act_user, password, "");
+
+ g_signal_emit (page, signals[USER_CREATED], 0,
+ priv->act_user, password);
+}
+
+static void
+gis_account_page_local_class_init (GisAccountPageLocalClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ gtk_widget_class_set_template_from_resource (GTK_WIDGET_CLASS (klass),
"/org/gnome/initial-setup/gis-account-page-local.ui");
+
+ gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageLocal,
fullname_entry);
+ gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageLocal,
username_combo);
+ gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageLocal,
password_entry);
+ gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageLocal,
confirm_entry);
+ gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageLocal,
password_strength);
+ gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisAccountPageLocal,
password_strength_label);
+
+ object_class->constructed = gis_account_page_local_constructed;
+
+ signals[VALIDATION_CHANGED] = g_signal_new ("validation-changed", GIS_TYPE_ACCOUNT_PAGE_LOCAL,
+ G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL,
+ G_TYPE_NONE, 0);
+
+ signals[USER_CREATED] = g_signal_new ("user-created", GIS_TYPE_ACCOUNT_PAGE_LOCAL,
+ G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL,
+ G_TYPE_NONE, 2, ACT_TYPE_USER, G_TYPE_STRING);
+}
+
+static void
+gis_account_page_local_init (GisAccountPageLocal *page)
+{
+ gtk_widget_init_template (GTK_WIDGET (page));
+}
+
+gboolean
+gis_account_page_local_validate (GisAccountPageLocal *page)
+{
+ GisAccountPageLocalPrivate *priv = gis_account_page_local_get_instance_private (page);
+
+ return priv->valid_name &&
+ priv->valid_username &&
+ priv->valid_confirm;
+}
+
+void
+gis_account_page_local_create_user (GisAccountPageLocal *page)
+{
+ local_create_user (page);
+}
diff --git a/gnome-initial-setup/pages/password/gis-account-page-local.h
b/gnome-initial-setup/pages/password/gis-account-page-local.h
new file mode 100644
index 0000000..ed00485
--- /dev/null
+++ b/gnome-initial-setup/pages/password/gis-account-page-local.h
@@ -0,0 +1,58 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+/*
+ * Copyright (C) 2013 Red Hat
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Written by:
+ * Jasper St. Pierre <jstpierre mecheye net>
+ */
+
+#ifndef __GIS_ACCOUNT_PAGE_LOCAL_H__
+#define __GIS_ACCOUNT_PAGE_LOCAL_H__
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define GIS_TYPE_ACCOUNT_PAGE_LOCAL (gis_account_page_local_get_type ())
+#define GIS_ACCOUNT_PAGE_LOCAL(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),
GIS_TYPE_ACCOUNT_PAGE_LOCAL, GisAccountPageLocal))
+#define GIS_ACCOUNT_PAGE_LOCAL_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass),
GIS_TYPE_ACCOUNT_PAGE_LOCAL, GisAccountPageLocalClass))
+#define GIS_IS_ACCOUNT_PAGE_LOCAL(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj),
GIS_TYPE_ACCOUNT_PAGE_LOCAL))
+#define GIS_IS_ACCOUNT_PAGE_LOCAL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),
GIS_TYPE_ACCOUNT_PAGE_LOCAL))
+#define GIS_ACCOUNT_PAGE_LOCAL_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),
GIS_TYPE_ACCOUNT_PAGE_LOCAL, GisAccountPageLocalClass))
+
+typedef struct _GisAccountPageLocal GisAccountPageLocal;
+typedef struct _GisAccountPageLocalClass GisAccountPageLocalClass;
+
+struct _GisAccountPageLocal
+{
+ GtkBin parent;
+};
+
+struct _GisAccountPageLocalClass
+{
+ GtkBinClass parent_class;
+};
+
+GType gis_account_page_local_get_type (void);
+
+gboolean gis_account_page_local_validate (GisAccountPageLocal *local);
+void gis_account_page_local_create_user (GisAccountPageLocal *local);
+
+G_END_DECLS
+
+#endif /* __GIS_ACCOUNT_PAGE_LOCAL_H__ */
diff --git a/gnome-initial-setup/pages/password/gis-account-page-local.ui
b/gnome-initial-setup/pages/password/gis-account-page-local.ui
new file mode 100644
index 0000000..68839d6
--- /dev/null
+++ b/gnome-initial-setup/pages/password/gis-account-page-local.ui
@@ -0,0 +1,299 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.0 -->
+ <template class="GisAccountPageLocal" parent="GtkBin">
+ <child>
+ <object class="GtkBox" id="area">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">fill</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkButton" id="avatar-button">
+ <property name="visible">True</property>
+ <property name="margin_top">54</property>
+ <property name="halign">center</property>
+ <child>
+ <object class="GtkImage" id="avatar-image">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixel_size">96</property>
+ <property name="icon_name">avatar-default-symbolic</property>
+ <property name="icon_size">1</property>
+ <style>
+ <class name="dim-label"/>
+ </style>
+ </object>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="title">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">start</property>
+ <property name="margin_top">26</property>
+ <property name="hexpand">True</property>
+ <property name="label" translatable="yes">About You</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="1.8"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="subtitle">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="margin_top">14</property>
+ <property name="label" translatable="yes">We need a few details to complete setup.</property>
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <property name="max-width-chars">50</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkGrid" id="form">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">12</property>
+ <property name="row_spacing">12</property>
+ <property name="margin_top">54</property>
+ <child>
+ <object class="GtkLabel" id="fullname_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">_Full Name</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">fullname_entry</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="fullname_entry">
+ <property name="max_length">255</property>
+ <property name="width-chars">25</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="username_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">_Username</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">username_combo</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">4</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkComboBoxText" id="username_combo">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="has_entry">True</property>
+ <property name="entry_text_column">0</property>
+ <property name="id_column">1</property>
+ <child internal-child="entry">
+ <object class="GtkEntry" id="comboboxtext-entry">
+ <property name="can_focus">True</property>
+ <property name="width-chars">25</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">4</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="username_explanation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="margin_bottom">12</property>
+ <property name="label" translatable="yes">Your username cannot be changed after
setup.</property>
+ <property name="wrap">True</property>
+ <attributes>
+ <attribute name="scale" value="0.8"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">5</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <child>
+ <object class="GtkGrid" id="secrets">
+ <property name="visible">False</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">12</property>
+ <property name="row_spacing">12</property>
+ <property name="margin_top">18</property>
+ <child>
+ <object class="GtkLabel" id="password_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">_Password</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">password_entry</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">6</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="password_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="visibility">False</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">6</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="confirm_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">_Confirm password</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">confirm_entry</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">7</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="confirm_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="visibility">False</property>
+ <property name="sensitive">False</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">7</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="password_explanation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Try to use at least 8 different characters. Mix
upper and lower case and use a number or two.</property>
+ <property name="wrap">True</property>
+ <property name="max-width-chars">30</property>
+ <attributes>
+ <attribute name="scale" value="0.8"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">8</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkBox" id="box1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="orientation">vertical</property>
+ <property name="spacing">2</property>
+ <child>
+ <object class="GtkLabel" id="password_strength_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="xalign">0</property>
+ <property name="label"/>
+ <attributes>
+ <attribute name="scale" value="0.8"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLevelBar" id="password_strength">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="valign">center</property>
+ <property name="max-value">4</property>
+ <property name="mode">discrete</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="left_attach">2</property>
+ <property name="top_attach">6</property>
+ <property name="width">1</property>
+ <property name="height">2</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/gnome-initial-setup/pages/password/gis-password-page.c
b/gnome-initial-setup/pages/password/gis-password-page.c
new file mode 100644
index 0000000..5e99f9f
--- /dev/null
+++ b/gnome-initial-setup/pages/password/gis-password-page.c
@@ -0,0 +1,295 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+/*
+ * Copyright (C) 2012 Red Hat
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Written by:
+ * Jasper St. Pierre <jstpierre mecheye net>
+ */
+
+/* Password page {{{1 */
+
+#define PAGE_ID "password"
+
+#include "config.h"
+#include "password-resources.h"
+#include "gis-password-page.h"
+#include "gis-account-page-local.h"
+#include "gis-account-page-enterprise.h"
+#include "pw-utils.h"
+
+#include <glib/gi18n.h>
+#include <gio/gio.h>
+
+struct _GisPasswordPagePrivate
+{
+ GtkWidget *password_entry;
+ GtkWidget *confirm_entry;
+ GtkWidget *password_strength;
+ gboolean valid_confirm;
+ const gchar *password_reason;
+ guint reason_timeout;
+ const gchar *username;
+};
+typedef struct _GisPasswordPagePrivate GisPasswordPagePrivate;
+
+G_DEFINE_TYPE_WITH_PRIVATE (GisPasswordPage, gis_password_page, GIS_TYPE_PAGE);
+
+static void
+enterprise_apply_complete (GisPage *dummy,
+ gboolean valid,
+ gpointer user_data)
+{
+ GisPasswordPage *page = GIS_PASSWORD_PAGE (user_data);
+ gis_page_apply_complete (GIS_PAGE (page), valid);
+}
+
+static gboolean
+page_validate (GisPasswordPage *page)
+{
+ GisPasswordPagePrivate *priv = gis_password_page_get_instance_private (page);
+ return priv->valid_confirm;
+}
+
+static void
+update_page_validation (GisPasswordPage *page)
+{
+ gis_page_set_complete (GIS_PAGE (page), page_validate (page));
+}
+
+static void
+gis_password_page_save_data (GisPage *gis_page)
+{
+ GisPasswordPage *page = GIS_PASSWORD_PAGE (gis_page);
+ GisPasswordPagePrivate *priv = gis_password_page_get_instance_private (page);
+
+ ActUser *act_user;
+ const gchar *password;
+
+ gis_driver_get_user_permissions (gis_page->driver, &act_user, &password);
+
+ if (act_user == NULL) /* enterprise account */
+ return;
+
+ password = gtk_entry_get_text (GTK_ENTRY (priv->password_entry));
+
+ if (strlen (password) == 0)
+ act_user_set_password_mode (act_user, ACT_USER_PASSWORD_MODE_NONE);
+ else
+ act_user_set_password (act_user, password, "");
+
+ gis_driver_set_user_permissions (gis_page->driver, act_user, password);
+}
+
+static gboolean
+reason_timeout_cb (gpointer data)
+{
+ GisPasswordPage *page = GIS_PASSWORD_PAGE (data);
+ GisPasswordPagePrivate *priv = gis_password_page_get_instance_private (page);
+ const gchar *password;
+ const gchar *verify;
+
+ password = gtk_entry_get_text (GTK_ENTRY (priv->password_entry));
+ verify = gtk_entry_get_text (GTK_ENTRY (priv->confirm_entry));
+
+ if (strlen (password) == 0)
+ set_entry_validation_error (GTK_ENTRY (priv->password_entry), _("No password"));
+ else
+ set_entry_validation_error (GTK_ENTRY (priv->password_entry), priv->password_reason);
+
+ if (strlen (verify) > 0 && !priv->valid_confirm)
+ set_entry_validation_error (GTK_ENTRY (priv->confirm_entry), _("Passwords do not match"));
+
+ priv->reason_timeout = 0;
+
+ return G_SOURCE_REMOVE;
+}
+
+static void
+refresh_reason_timeout (GisPasswordPage *page)
+{
+ GisPasswordPagePrivate *priv = gis_password_page_get_instance_private (page);
+
+ if (priv->reason_timeout != 0)
+ g_source_remove (priv->reason_timeout);
+
+ priv->reason_timeout = g_timeout_add (600, reason_timeout_cb, page);
+}
+
+static void
+update_valid_confirm (GisPasswordPage *page)
+{
+ GisPasswordPagePrivate *priv = gis_password_page_get_instance_private (page);
+ const gchar *password, *verify;
+
+ password = gtk_entry_get_text (GTK_ENTRY (priv->password_entry));
+ verify = gtk_entry_get_text (GTK_ENTRY (priv->confirm_entry));
+
+ priv->valid_confirm = strcmp (password, verify) == 0;
+}
+
+static void
+update_password_entries (GisPasswordPage *page)
+{
+ GisPasswordPagePrivate *priv = gis_password_page_get_instance_private (page);
+ const gchar *password;
+ const gchar *username;
+ gdouble strength;
+ gint strength_level;
+ const gchar *hint;
+ const gchar *long_hint = NULL;
+
+ password = gtk_entry_get_text (GTK_ENTRY (priv->password_entry));
+
+ strength = pw_strength (password, NULL, priv->username, &hint, &long_hint, &strength_level);
+ gtk_level_bar_set_value (GTK_LEVEL_BAR (priv->password_strength), strength_level);
+
+ if (strength == 0.0) {
+ priv->password_reason = long_hint ? long_hint : hint;
+ }
+ update_valid_confirm (page);
+
+ if (priv->valid_confirm)
+ clear_entry_validation_error (GTK_ENTRY (priv->password_entry));
+
+ gtk_widget_set_sensitive (priv->confirm_entry, TRUE);
+
+ refresh_reason_timeout (page);
+}
+
+static gboolean
+password_entry_focus_out (GtkWidget *widget,
+ GdkEventFocus *event,
+ GisPasswordPage *page)
+{
+ GisPasswordPagePrivate *priv = gis_password_page_get_instance_private (page);
+
+ if (priv->reason_timeout != 0) {
+ g_source_remove (priv->reason_timeout);
+ priv->reason_timeout = 0;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+confirm_entry_focus_out (GtkWidget *widget,
+ GdkEventFocus *event,
+ GisPasswordPage *page)
+{
+ GisPasswordPagePrivate *priv = gis_password_page_get_instance_private (page);
+ GtkEntry *entry = GTK_ENTRY (widget);
+ const gchar *verify;
+
+ verify = gtk_entry_get_text (entry);
+
+ if (strlen (verify) > 0 && !priv->valid_confirm)
+ set_entry_validation_error (entry, _("Passwords do not match"));
+ else
+ clear_entry_validation_error (entry);
+
+ return FALSE;
+}
+
+static void
+password_changed (GtkWidget *w,
+ GParamSpec *pspec,
+ GisPasswordPage *page)
+{
+ clear_entry_validation_error (GTK_ENTRY (w));
+ update_password_entries (page);
+ update_page_validation (page);
+}
+
+static void
+username_changed (GObject *obj, GParamSpec *pspec, GisPasswordPage *page)
+{
+ GisPasswordPagePrivate *priv = gis_password_page_get_instance_private (page);
+ priv->username = gis_driver_get_username (GIS_DRIVER (obj));
+
+ if (priv->username)
+ gtk_widget_show (GTK_WIDGET (page));
+ else
+ gtk_widget_hide (GTK_WIDGET (page));
+}
+
+static void
+gis_password_page_constructed (GObject *object)
+{
+ GisPasswordPage *page = GIS_PASSWORD_PAGE (object);
+ GisPasswordPagePrivate *priv = gis_password_page_get_instance_private (page);
+
+ G_OBJECT_CLASS (gis_password_page_parent_class)->constructed (object);
+
+ g_signal_connect (priv->password_entry, "notify::text",
+ G_CALLBACK (password_changed), page);
+ g_signal_connect (priv->confirm_entry, "notify::text",
+ G_CALLBACK (password_changed), page);
+ g_signal_connect_after (priv->password_entry, "focus-out-event",
+ G_CALLBACK (password_entry_focus_out), page);
+ g_signal_connect_after (priv->confirm_entry, "focus-out-event",
+ G_CALLBACK (confirm_entry_focus_out), page);
+
+ g_signal_connect (GIS_PAGE (page)->driver, "notify::username",
+ G_CALLBACK (username_changed), page);
+
+ update_page_validation (page);
+
+ gtk_widget_show (GTK_WIDGET (page));
+}
+
+static void
+gis_password_page_locale_changed (GisPage *page)
+{
+ gis_page_set_title (GIS_PAGE (page), _("Password"));
+}
+
+static void
+gis_password_page_class_init (GisPasswordPageClass *klass)
+{
+ GisPageClass *page_class = GIS_PAGE_CLASS (klass);
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ gtk_widget_class_set_template_from_resource (GTK_WIDGET_CLASS (klass),
"/org/gnome/initial-setup/gis-password-page.ui");
+
+ gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisPasswordPage, password_entry);
+ gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisPasswordPage, confirm_entry);
+ gtk_widget_class_bind_template_child_private (GTK_WIDGET_CLASS (klass), GisPasswordPage,
password_strength);
+
+ page_class->page_id = PAGE_ID;
+ page_class->locale_changed = gis_password_page_locale_changed;
+ page_class->save_data = gis_password_page_save_data;
+ object_class->constructed = gis_password_page_constructed;
+}
+
+static void
+gis_password_page_init (GisPasswordPage *page)
+{
+ g_resources_register (password_get_resource ());
+
+ gtk_widget_init_template (GTK_WIDGET (page));
+}
+
+void
+gis_prepare_password_page (GisDriver *driver)
+{
+ gis_driver_add_page (driver,
+ g_object_new (GIS_TYPE_PASSWORD_PAGE,
+ "driver", driver,
+ NULL));
+}
+
diff --git a/gnome-initial-setup/pages/password/gis-password-page.h
b/gnome-initial-setup/pages/password/gis-password-page.h
new file mode 100644
index 0000000..3ff8f72
--- /dev/null
+++ b/gnome-initial-setup/pages/password/gis-password-page.h
@@ -0,0 +1,59 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+/*
+ * Copyright (C) 2012 Red Hat
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA.
+ *
+ * Written by:
+ * Jasper St. Pierre <jstpierre mecheye net>
+ */
+
+#ifndef __GIS_PASSWORD_PAGE_H__
+#define __GIS_PASSWORD_PAGE_H__
+
+#include <glib-object.h>
+
+#include "gnome-initial-setup.h"
+
+G_BEGIN_DECLS
+
+#define GIS_TYPE_PASSWORD_PAGE (gis_password_page_get_type ())
+#define GIS_PASSWORD_PAGE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj),
GIS_TYPE_PASSWORD_PAGE, GisPasswordPage))
+#define GIS_PASSWORD_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass),
GIS_TYPE_PASSWORD_PAGE, GisPasswordPageClass))
+#define GIS_IS_PASSWORD_PAGE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIS_TYPE_PASSWORD_PAGE))
+#define GIS_IS_PASSWORD_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIS_TYPE_PASSWORD_PAGE))
+#define GIS_PASSWORD_PAGE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj),
GIS_TYPE_PASSWORD_PAGE, GisPasswordPageClass))
+
+typedef struct _GisPasswordPage GisPasswordPage;
+typedef struct _GisPasswordPageClass GisPasswordPageClass;
+
+struct _GisPasswordPage
+{
+ GisPage parent;
+};
+
+struct _GisPasswordPageClass
+{
+ GisPageClass parent_class;
+};
+
+GType gis_password_page_get_type (void);
+
+void gis_prepare_password_page (GisDriver *driver);
+
+G_END_DECLS
+
+#endif /* __GIS_PASSWORD_PAGE_H__ */
diff --git a/gnome-initial-setup/pages/password/gis-password-page.ui
b/gnome-initial-setup/pages/password/gis-password-page.ui
new file mode 100644
index 0000000..9d03457
--- /dev/null
+++ b/gnome-initial-setup/pages/password/gis-password-page.ui
@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <!-- interface-requires gtk+ 3.0 -->
+ <template class="GisPasswordPage" parent="GisPage">
+ <child>
+ <object class="GtkBox" id="page">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">fill</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkImage" id="image1">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="pixel_size">96</property>
+ <property name="icon_name">dialog-password-symbolic</property>
+ <property name="icon_size">1</property>
+ <property name="margin_top">54</property>
+ <property name="margin_bottom">26</property>
+ <style>
+ <class name="dim-label" />
+ </style>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="title">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">center</property>
+ <property name="valign">start</property>
+ <property name="margin_top">26</property>
+ <property name="hexpand">True</property>
+ <property name="label" translatable="yes">Set a Password</property>
+ <attributes>
+ <attribute name="weight" value="bold"/>
+ <attribute name="scale" value="1.8"/>
+ </attributes>
+ </object>
+ </child>
+ <child>
+ <object class="GtkLabel" id="subtitle">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="valign">start</property>
+ <property name="margin_top">14</property>
+ <property name="label" translatable="yes">Be careful not to lose your password.</property>
+ <property name="justify">center</property>
+ <property name="wrap">True</property>
+ <property name="max-width-chars">50</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkGrid" id="secrets">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="column_spacing">12</property>
+ <property name="row_spacing">12</property>
+ <property name="margin_top">54</property>
+ <child>
+ <object class="GtkLabel" id="password_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">Choose a _password</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">password_entry</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="password_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="visibility">False</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">0</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="confirm_label">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">end</property>
+ <property name="xalign">1</property>
+ <property name="label" translatable="yes">_Confirm password</property>
+ <property name="use_underline">True</property>
+ <property name="mnemonic_widget">confirm_entry</property>
+ </object>
+ <packing>
+ <property name="left_attach">0</property>
+ <property name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkEntry" id="confirm_entry">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="visibility">False</property>
+ <property name="sensitive">False</property>
+ <property name="invisible_char">●</property>
+ <property name="invisible_char_set">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">3</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="password_explanation">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">start</property>
+ <property name="label" translatable="yes">Try to use at least 8 different characters. Mix
upper and lower case and use a number or two.</property>
+ <property name="wrap">True</property>
+ <property name="max-width-chars">30</property>
+ <attributes>
+ <attribute name="scale" value="0.8"/>
+ </attributes>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">2</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLevelBar" id="password_strength">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="halign">fill</property>
+ <property name="valign">center</property>
+ <property name="max-value">4</property>
+ <property name="mode">discrete</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="top_attach">1</property>
+ <property name="width">1</property>
+ <property name="height">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
+ </child>
+ </template>
+</interface>
diff --git a/gnome-initial-setup/pages/password/org.freedesktop.realmd.xml
b/gnome-initial-setup/pages/password/org.freedesktop.realmd.xml
new file mode 100644
index 0000000..316213a
--- /dev/null
+++ b/gnome-initial-setup/pages/password/org.freedesktop.realmd.xml
@@ -0,0 +1,666 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node name="/">
+
+ <!--
+ org.freedesktop.realmd.Provider:
+ @short_description: a realm provider
+
+ Various realm providers represent different software implementations
+ that provide access to realms or domains.
+
+ This interface is implemented by individual providers, but is
+ aggregated globally at the system bus name
+ <literal>org.freedesktop.realmd</literal>
+ with the object path <literal>/org/freedesktop/realmd</literal>
+ -->
+ <interface name="org.freedesktop.realmd.Provider">
+
+ <!--
+ Name: the name of the provider
+
+ The name of the provider. This is not normally displayed
+ to the user, but may be useful for diagnostics or debugging.
+ -->
+ <property name="Name" type="s" access="read"/>
+
+ <!--
+ Version: the version of the provider
+
+ The version of the provider. This is not normally used in
+ logic, but may be useful for diagnostics or debugging.
+ -->
+ <property name="Version" type="s" access="read"/>
+
+ <!--
+ Realms: a list of realms
+
+ A list of known, enrolled or discovered realms. All realms
+ that this provider knows about are listed here. As realms
+ are discovered they are added to this list.
+
+ Each realm is represented by the DBus object path of the
+ realm object.
+ -->
+ <property name="Realms" type="ao" access="read"/>
+
+ <!--
+ Discover:
+ @string: an input string to discover realms for
+ @options: options for the discovery operation
+ @relevance: the relevance of the returned results
+ @realm: a list of realms discovered
+
+ Discover realms for the given string. The input @string is
+ usually a domain or realm name, perhaps typed by a user. If
+ an empty string is provided the realm provider should try to
+ discover a default realm if possible (eg: from DHCP).
+
+ @options can contain, but is not limited to, the following values:
+ <itemizedlist>
+ <listitem><para><literal>operation</literal>: a string
+ identifier chosen by the client, which can then later be
+ passed to org.freedesktop.realmd.Service.Cancel() in order
+ to cancel the operation</para></listitem>
+ </itemizedlist>
+
+ The @relevance returned can be used to rank results from
+ different discover calls to different providers. Implementors
+ should return a positive number if the provider highly
+ recommends that the realms be handled by this provider,
+ or a zero if it can possibly handle the realms. Negative
+ should be returned if no realms are found.
+
+ This method does not return an error when no realms are
+ discovered. It simply returns an @realm list.
+
+ To see diagnostic information about the discovery process
+ connect to the org.freedesktop.realmd.Service::Diagnostics
+ signal.
+
+ This method requires authorization for the PolicyKit action
+ called <literal>org.freedesktop.realmd.discover-realm</literal>.
+
+ In addition to common DBus error results, this method may
+ return:
+ <itemizedlist>
+ <listitem><para><literal>org.freedesktop.realmd.Error.Failed</literal>:
+ may be returned if the discovery could not be run for some reason.</para></listitem>
+ <listitem><para><literal>org.freedesktop.realmd.Error.Cancelled</literal>:
+ returned if the operation was cancelled.</para></listitem>
+ <listitem><para><literal>org.freedesktop.realmd.Error.NotAuthorized</literal>:
+ returned if the calling client is not permitted to perform a discovery
+ operation.</para></listitem>
+ </itemizedlist>
+ -->
+ <method name="Discover">
+ <arg name="string" type="s" direction="in"/>
+ <arg name="options" type="a{sv}" direction="in"/>
+ <arg name="relevance" type="i" direction="out"/>
+ <arg name="realm" type="ao" direction="out"/>
+ </method>
+
+ </interface>
+
+ <!--
+ org.freedesktop.realmd.Service:
+ @short_description: the realmd service
+
+ Global calls for managing the realmd service. Usually you'll want
+ to use #org.freedesktop.realmd.Provider instead.
+
+ This interface is implemented by the realmd service, and is always
+ available at the object path <literal>/org/freedesktop/realmd</literal>
+
+ The service also implements the
+ <literal>org.freedesktop.DBus.ObjectManager</literal> interface which
+ makes it easy to retrieve all realmd objects and properties in one go.
+ -->
+ <interface name="org.freedesktop.realmd.Service">
+
+ <!--
+ Cancel:
+ @operation: the operation to cancel
+
+ Cancel a realmd operation. To be able to cancel an operation
+ pass a uniquely chosen <literal>operation</literal> string
+ identifier as an option in the methods <literal>options</literal>
+ argument.
+
+ These operation string identifiers should be unique per client
+ calling the realmd service.
+
+ It is not guaranteed that the service can or will cancel the
+ operation. For example the operation may have already completed
+ by the time this method is handled. The caller of the operation
+ method will receive a
+ <literal>org.freedesktop.realmd.Error.Cancelled</literal>
+ if the operation was cancelled.
+ -->
+ <method name="Cancel">
+ <arg name="operation" type="s" direction="in"/>
+ </method>
+
+ <!--
+ SetLocale:
+ @locale: the locale for the client
+
+ Set the language @locale for the client. This locale is used
+ for error messages. The locale is used until the next time
+ this method is called, the client disconnects, or the client
+ calls #org.freedesktop.realmd.Service.Release().
+ -->
+ <method name="SetLocale">
+ <arg name="locale" type="s" direction="in"/>
+ </method>
+
+ <!--
+ Diagnostics:
+ @data: diagnostic data
+ @operation: the operation this data resulted from
+
+ This signal is fired when diagnostics result from an operation
+ in the provider or one of its realms.
+
+ It is not guaranteed that this signal is emitted once per line.
+ More than one line may be contained in @data, or a partial
+ line. New line characters are embedded in @data.
+
+ This signal is sent explicitly to the client which invoked
+ operation method. In order to tell which operation this
+ diagnostic data results from, pass a unique
+ <literal>operation</literal> string identifier in the
+ <literal>options</literal> argument of the operation method.
+ That same identifier will be passed back via the @operation
+ argument of this signal.
+ -->
+ <signal name="Diagnostics">
+ <arg name="data" type="s"/>
+ <arg name="operation" type="s"/>
+ </signal>
+
+ <!--
+ Release:
+
+ Normally realmd waits until all clients have disconnected
+ before exiting itself, sometime later. For long lived clients
+ they can call this method to allow the realmd service to quit.
+ This is an optimization. The daemon will not exit immediately.
+ It is safe to call this multiple times.
+ -->
+ <method name="Release">
+ <!-- no arguments -->
+ </method>
+
+ </interface>
+
+ <!--
+ org.freedesktop.realmd.Realm:
+ @short_description: a realm
+
+ Represents one realm.
+
+ Contains generic information about a realm, and useful properties for
+ introspecting what kind of realm this is and how to work with
+ the realm.
+
+ Use #org.freedesktop.realmd.Provider:Realms or
+ #org.freedesktop.realmd.Provider.Discover() to get access to some
+ kerberos realm objects.
+
+ Realms will always implement additional interfaces, such as
+ #org.freedesktop.realmd.Kerberos. Do not assume that all realms
+ implement that kerberos interface. Use the
+ #org.freedesktop.realmd.Realm:SupportedInterfaces property to see
+ which interfaces are set.
+
+ Different realms support various ways to configure them on the
+ system. Use the #org.freedesktop.realmd.Realm:Configured property
+ to determine if a realm is configured. If it is configured the
+ property will be set to the interface of the mechanism that was
+ used to configure it.
+
+ To configure a realm, look in the
+ #org.freedesktop.realmd.Realm:SupportedInterfaces property for a
+ recognized purpose specific interface that can be used for
+ configuration, such as the
+ #org.freedesktop.realmd.KerberosMembership interface and its
+ #org.freedesktop.realmd.KerberosMembership.Join() method.
+
+ To deconfigure a realm from the current system, you can use the
+ #org.freedesktop.realmd.Realm.Deconfigure() method. In additon some
+ of the configuration specific interfaces provide methods to
+ deconfigure a realm in a specific way, such as
+ #org.freedesktop.realmd.KerberosMembership.Leave() method.
+
+ The various properties are guaranteed to have been updated before
+ the operation methods return, if they change state.
+ -->
+ <interface name="org.freedesktop.realmd.Realm">
+
+ <!--
+ Name: the realm name
+
+ This is the name of the realm, appropriate for display to
+ end users where necessary.
+ -->
+ <property name="Name" type="s" access="read"/>
+
+ <!--
+ Configured: whether this domain is configured and how
+
+ If this property is an empty string, then the realm is not
+ configured. Otherwise the realm is configured, and contains
+ a string which is the interface that represents how it was
+ configured, for example #org.freedesktop.realmd.KerberosMembership.
+ -->
+ <property name="Configured" type="s" access="read"/>
+
+ <!--
+ Deconfigure: deconfigure this realm
+
+ Deconfigure this realm from the local machine with standard
+ default behavior.
+
+ The behavior of this method depends on the which configuration
+ interface is present in the
+ #org.freedesktop.realmd.Realm.Configured property. It does not
+ always delete membership accounts in the realm, but just
+ reconfigures the local machine so it no longer is configured
+ for the given realm. In some cases the implementation may try
+ to update membership accounts, but this is not guaranteed.
+
+ Various configuration interfaces may support more specific ways
+ to deconfigure a realm in a specific way, such as the
+ #org.freedesktop.realmd.KerberosMembership.Leave() method.
+
+ @options can contain, but is not limited to, the following values:
+ <itemizedlist>
+ <listitem><para><literal>operation</literal>: a string
+ identifier chosen by the client, which can then later be
+ passed to org.freedesktop.realmd.Service.Cancel() in order
+ to cancel the operation</para></listitem>
+ </itemizedlist>
+
+ This method requires authorization for the PolicyKit action
+ called <literal>org.freedesktop.realmd.deconfigure-realm</literal>.
+
+ In addition to common DBus error results, this method may return:
+ <itemizedlist>
+ <listitem><para><literal>org.freedesktop.realmd.Error.Failed</literal>:
+ may be returned if the deconfigure failed for a generic reason.</para></listitem>
+ <listitem><para><literal>org.freedesktop.realmd.Error.Cancelled</literal>:
+ returned if the operation was cancelled.</para></listitem>
+ <listitem><para><literal>org.freedesktop.realmd.Error.NotAuthorized</literal>:
+ returned if the calling client is not permitted to deconfigure a
+ realm.</para></listitem>
+ <listitem><para><literal>org.freedesktop.realmd.Error.NotConfigured</literal>:
+ returned if this realm is not configured on the machine.</para></listitem>
+ <listitem><para><literal>org.freedesktop.realmd.Error.Busy</literal>:
+ returned if the service is currently performing another operation like
+ join or leave.</para></listitem>
+ </itemizedlist>
+ -->
+ <method name="Deconfigure">
+ <arg name="options" type="a{sv}" direction="in"/>
+ </method>
+
+ <!--
+ SupportedInterfaces:
+
+ Additional supported interfaces of this realm. This includes
+ interfaces that contain more information about the realm,
+ such as #org.freedesktop.realmd.Kerberos and interfaces
+ which contain methods for configuring a realm, such as
+ #org.freedesktop.realmd.KerberosMembership.
+ -->
+ <property name="SupportedInterfaces" type="as" access="read"/>
+
+ <!--
+ Details: informational details about the realm
+
+ Informational details about the realm. The following values
+ should be present:
+ <itemizedlist>
+ <listitem><para><literal>server-software</literal>:
+ identifier of the software running on the server (eg:
+ <literal>active-directory</literal>).</para></listitem>
+ <listitem><para><literal>client-software</literal>:
+ identifier of the software running on the client (eg:
+ <literal>sssd</literal>).</para></listitem>
+ </itemizedlist>
+ -->
+ <property name="Details" type="a(ss)" access="read"/>
+
+ <!--
+ LoginFormats: supported formats for login names
+
+ Supported formats for login to this realm. This is only
+ relevant once the realm has been enrolled. The formats
+ will contain a <literal>%U</literal> in the string, which
+ indicate where the user name should be placed. The formats
+ may contain a <literal>%D</literal> in the string which
+ indicate where a domain name should be placed.
+
+ The first format in the list is the preferred format for
+ login names.
+ -->
+ <property name="LoginFormats" type="as" access="read"/>
+
+ <!--
+ LoginPolicy: the policy for logins using this realm
+
+ The policy for logging into this computer using this realm.
+
+ The policy can be changed using the
+ #org.freedesktop.realmd.Realm.ChangeLoginPolicy() method.
+
+ The following policies are predefined. Not all providers
+ support all these policies and there may be provider specific
+ policies or multiple policies represented in the string:
+ <itemizedlist>
+ <listitem><para><literal>allow-any-login</literal>: allow
+ login by any authenticated user present in this
+ realm.</para></listitem>
+ <listitem><para><literal>allow-permitted-logins</literal>:
+ only allow the logins permitted in the
+ #org.freedesktop.realmd.Realm:PermittedLogins
+ property.</para></listitem>
+ <listitem><para><literal>deny-any-login</literal>:
+ don't allow any logins via authenticated users of this
+ realm.</para></listitem>
+ </itemizedlist>
+ -->
+ <property name="LoginPolicy" type="s" access="read"/>
+
+ <!--
+ PermittedLogins: the permitted login names
+
+ The list of permitted authenticated users allowed to login
+ into this computer. This is only relevant if the
+ #org.freedesktop.realmd.Realm:LoginPolicy property
+ contains the <literal>allow-permitted-logins</literal>
+ string.
+ -->
+ <property name="PermittedLogins" type="as" access="read"/>
+
+ <!--
+ ChangeLoginPolicy:
+ @login_policy: the new login policy, or an empty string
+ @permitted_add: a list of logins to permit
+ @permitted_remove: a list of logins to not permit
+ @options: options for this operation
+
+ Change the login policy and/or permitted logins for this realm.
+
+ Not all realms support the all the various login policies. An
+ error will be returned if the new login policy is not supported.
+ You may specify an empty string for the @login_policy argument
+ which will cause no change in the policy itself. If the policy
+ is changed, it will be reflected in the
+ #org.freedesktop.realmd.Realm:LoginPolicy property.
+
+ The @permitted_add and @permitted_remove arguments represent
+ lists of login names that should be added and removed from
+ the #org.freedesktop.realmd.Kerberos:PermittedLogins property.
+
+ @options can contain, but is not limited to, the following values:
+ <itemizedlist>
+ <listitem><para><literal>operation</literal>: a string
+ identifier chosen by the client, which can then later be
+ passed to org.freedesktop.realmd.Service.Cancel() in order
+ to cancel the operation</para></listitem>
+ </itemizedlist>
+
+ This method requires authorization for the PolicyKit action
+ called <literal>org.freedesktop.realmd.login-policy</literal>.
+
+ In addition to common DBus error results, this method may return:
+ <itemizedlist>
+ <listitem><para><literal>org.freedesktop.realmd.Error.Failed</literal>:
+ may be returned if the policy change failed for a generic reason.</para></listitem>
+ <listitem><para><literal>org.freedesktop.realmd.Error.Cancelled</literal>:
+ returned if the operation was cancelled.</para></listitem>
+ <listitem><para><literal>org.freedesktop.realmd.Error.NotAuthorized</literal>:
+ returned if the calling client is not permitted to change login policy
+ operation.</para></listitem>
+ <listitem><para><literal>org.freedesktop.realmd.Error.NotConfigured</literal>:
+ returned if the realm is not configured.</para></listitem>
+ <listitem><para><literal>org.freedesktop.realmd.Error.Busy</literal>:
+ returned if the service is currently performing another operation like
+ join or leave.</para></listitem>
+ </itemizedlist>
+ -->
+ <method name="ChangeLoginPolicy">
+ <arg name="login_policy" type="s" direction="in"/>
+ <arg name="permitted_add" type="as" direction="in"/>
+ <arg name="permitted_remove" type="as" direction="in"/>
+ <arg name="options" type="a{sv}" direction="in"/>
+ </method>
+
+ </interface>
+
+ <!--
+ org.freedesktop.realmd.Kerberos:
+ @short_description: a kerberos realm
+
+ An interface that describes a kerberos realm in more detail. This
+ is always implemented on an DBus object path that also implements
+ the #org.freedesktop.realmd.Realm interface.
+ -->
+ <interface name="org.freedesktop.realmd.Kerberos">
+
+ <!--
+ RealmName: the kerberos realm name
+
+ The kerberos name for this realm. This is usually in upper
+ case.
+ -->
+ <property name="RealmName" type="s" access="read"/>
+
+ <!--
+ DomainName: the DNS domain name
+
+ The DNS domain name for this realm.
+ -->
+ <property name="DomainName" type="s" access="read"/>
+
+ </interface>
+
+ <!--
+ org.freedesktop.realmd.KerberosMembership:
+
+ An interface used to configure this machine by joining a realm.
+
+ It sets up a computer/host account in the realm for this machine
+ and a keytab to track the credentials for that account.
+
+ The various properties are guaranteed to have been updated before
+ the operation methods return, if they change state.
+ -->
+ <interface name="org.freedesktop.realmd.KerberosMembership">
+
+ <!--
+ SuggestedAdministrator: common administrator name
+
+ The common administrator name for this type of realm. This
+ can be used by clients as a hint when prompting the user for
+ administrative authentication.
+ -->
+ <property name="SuggestedAdministrator" type="s" access="read"/>
+
+ <!--
+ SupportedJoinCredentials: credentials supported for joining
+
+ Various kinds of credentials that are supported when calling the
+ #org.freedesktop.realmd.Kerberos.Join() method.
+
+ Each credential is represented by a type, and an owner. The type
+ denotes which kind of credential is passed to the method. The
+ owner indicates to the client how to prompt the user or obtain
+ the credential, and to the service how to use the credential.
+
+ The various types are:
+ <itemizedlist>
+ <listitem><para><literal>ccache</literal>:
+ the credentials should contain an array of bytes as a
+ <literal>ay</literal> containing the data from a kerberos
+ credential cache file.</para></listitem>
+ <listitem><para><literal>password</literal>:
+ the credentials should contain a pair of strings as a
+ <literal>(ss)</literal> representing a name and
+ password. The name may contain a realm in the standard
+ kerberos format. If missing, it will default to this
+ realm. The name may be empty for a computer or one time
+ password.</para></listitem>
+ <listitem><para><literal>automatic</literal>:
+ the credentials should contain an empty string as a
+ <literal>s</literal>. Using <literal>automatic</literal>
+ indicates that default or system credentials are to be
+ used.</para></listitem>
+ </itemizedlist>
+
+ The various owners are:
+ <itemizedlist>
+ <listitem><para><literal>administrator</literal>:
+ the credentials belong to a kerberos user principal.
+ The caller may use this as a hint to prompt the user
+ for administrative credentials.</para></listitem>
+ <listitem><para><literal>user</literal>:
+ the credentials belong to a kerberos user principal.
+ The caller may use this as a hint to prompt the user
+ for his (possibly non-administrative)
+ credentials.</para></listitem>
+ <listitem><para><literal>computer</literal>:
+ the credentials belong to the computer realmd is
+ being run on.</para></listitem>
+ <listitem><para><literal>secret</literal>:
+ the credentials are a one time password or other secret
+ used to join or leave the computer.</para></listitem>
+ </itemizedlist>
+ -->
+ <property name="SupportedJoinCredentials" type="a(ss)" access="read"/>
+
+ <!--
+ SupportedLeaveCredentials: credentials supported for leaving
+
+ Various kinds of credentials that are supported when calling the
+ #org.freedesktop.realmd.Kerberos.Leave() method.
+
+ See #org.freedesktop.realmd.Kerberos:SupportedJoinCredentials for
+ a discussion of what the values represent.
+ -->
+ <property name="SupportedLeaveCredentials" type="a(ss)" access="read"/>
+
+ <!--
+ Join:
+
+ Join this machine to the realm and enroll the machine.
+
+ If this method returns successfully then the machine will be
+ joined to the realm. It is not necessary to restart services or the
+ machine afterward. Relevant properties on the realm will be updated
+ before the method returns.
+
+ The @credentials should be set according to one of the
+ supported credentials returned by
+ #org.freedesktop.realmd.Kerberos:SupportedJoinCredentials.
+ The first string in the tuple is the type, the second string
+ is the owner, and the variant contains the credential contents
+ See the discussion at
+ #org.freedesktop.realmd.Kerberos:SupportedJoinCredentials
+ for more information.
+
+ @options can contain, but is not limited to, the following values:
+ <itemizedlist>
+ <listitem><para><literal>operation</literal>: a string
+ identifier chosen by the client, which can then later be
+ passed to org.freedesktop.realmd.Service.Cancel() in order
+ to cancel the operation</para></listitem>
+ </itemizedlist>
+
+ This method requires authorization for the PolicyKit action
+ called <literal>org.freedesktop.realmd.configure-realm</literal>.
+
+ In addition to common DBus error results, this method may return:
+ <itemizedlist>
+ <listitem><para><literal>org.freedesktop.realmd.Error.Failed</literal>:
+ may be returned if the join failed for a generic reason.</para></listitem>
+ <listitem><para><literal>org.freedesktop.realmd.Error.Cancelled</literal>:
+ returned if the operation was cancelled.</para></listitem>
+ <listitem><para><literal>org.freedesktop.realmd.Error.NotAuthorized</literal>:
+ returned if the calling client is not permitted to perform an join
+ operation.</para></listitem>
+ <listitem><para><literal>org.freedesktop.realmd.Error.AuthenicationFailed</literal>:
+ returned if the credentials passed did not authenticate against the realm
+ correctly. It is appropriate to prompt the user again.</para></listitem>
+ <listitem><para><literal>org.freedesktop.realmd.Error.AlreadyEnrolled</literal>:
+ returned if already enrolled in this realm, or another realm and enrolling
+ in multiple realms is not supported.</para></listitem>
+ <listitem><para><literal>org.freedesktop.realmd.Error.Busy</literal>:
+ returned if the service is currently performing another operation like
+ join or leave.</para></listitem>
+ </itemizedlist>
+ -->
+ <method name="Join">
+ <arg name="credentials" type="(ssv)" direction="in"/>
+ <arg name="options" type="a{sv}" direction="in"/>
+ </method>
+
+ <!--
+ Leave:
+
+ Leave the realm and unenroll the machine.
+
+ If this method returns successfully then the machine will have
+ left the domain and been unenrolled. It is not necessary to restart
+ services or the machine afterward. Relevant properties on the realm
+ will be updated before the method returns.
+
+ The @credentials should be set according to one of the
+ supported credentials returned by
+ #org.freedesktop.realmd.Kerberos:SupportedUnenrollCredentials.
+ The first string in the tuple is the type, the second string
+ is the owner, and the variant contains the credential contents
+ See the discussion at
+ #org.freedesktop.realmd.Kerberos:SupportedEnrollCredentials
+ for more information.
+
+ @options can contain, but is not limited to, the following values:
+ <itemizedlist>
+ <listitem><para><literal>operation</literal>: a string
+ identifier chosen by the client, which can then later be
+ passed to org.freedesktop.realmd.Service.Cancel() in order
+ to cancel the operation</para></listitem>
+ </itemizedlist>
+
+ This method requires authorization for the PolicyKit action
+ called <literal>org.freedesktop.realmd.deconfigure-realm</literal>.
+
+ In addition to common DBus error results, this method may return:
+ <itemizedlist>
+ <listitem><para><literal>org.freedesktop.realmd.Error.Failed</literal>:
+ may be returned if the unenroll failed for a generic reason.</para></listitem>
+ <listitem><para><literal>org.freedesktop.realmd.Error.Cancelled</literal>:
+ returned if the operation was cancelled.</para></listitem>
+ <listitem><para><literal>org.freedesktop.realmd.Error.NotAuthorized</literal>:
+ returned if the calling client is not permitted to perform an unenroll
+ operation.</para></listitem>
+ <listitem><para><literal>org.freedesktop.realmd.Error.AuthenicationFailed</literal>:
+ returned if the credentials passed did not authenticate against the realm
+ correctly. It is appropriate to prompt the user again.</para></listitem>
+ <listitem><para><literal>org.freedesktop.realmd.Error.NotEnrolled</literal>:
+ returned if not enrolled in this realm.</para></listitem>
+ <listitem><para><literal>org.freedesktop.realmd.Error.Busy</literal>:
+ returned if the service is currently performing another operation like
+ enroll or unenroll.</para></listitem>
+ </itemizedlist>
+ -->
+ <method name="Leave">
+ <arg name="credentials" type="(ssv)" direction="in"/>
+ <arg name="options" type="a{sv}" direction="in"/>
+ </method>
+
+ </interface>
+
+</node>
diff --git a/gnome-initial-setup/pages/password/password-resources.c
b/gnome-initial-setup/pages/password/password-resources.c
new file mode 100644
index 0000000..f841f91
--- /dev/null
+++ b/gnome-initial-setup/pages/password/password-resources.c
@@ -0,0 +1,3869 @@
+#include <gio/gio.h>
+
+#if defined (__ELF__) && ( __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 6))
+# define SECTION __attribute__ ((section (".gresource.password"), aligned (8)))
+#else
+# define SECTION
+#endif
+
+static const SECTION union { const guint8 data[29888]; const double alignment; void * const ptr;}
password_resource_data = { {
+ 0x47, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x18, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x28, 0x07, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x05, 0x00, 0x00, 0x00, 0x60, 0x8c, 0xdc, 0x7a,
+ 0x04, 0x00, 0x00, 0x00, 0xe4, 0x00, 0x00, 0x00,
+ 0x14, 0x00, 0x76, 0x00, 0xf8, 0x00, 0x00, 0x00,
+ 0xad, 0x15, 0x00, 0x00, 0x4b, 0x50, 0x90, 0x0b,
+ 0x02, 0x00, 0x00, 0x00, 0xad, 0x15, 0x00, 0x00,
+ 0x04, 0x00, 0x4c, 0x00, 0xb4, 0x15, 0x00, 0x00,
+ 0xb8, 0x15, 0x00, 0x00, 0xd4, 0xb5, 0x02, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xb8, 0x15, 0x00, 0x00,
+ 0x01, 0x00, 0x4c, 0x00, 0xbc, 0x15, 0x00, 0x00,
+ 0xc0, 0x15, 0x00, 0x00, 0x52, 0x87, 0x91, 0x6a,
+ 0x04, 0x00, 0x00, 0x00, 0xc0, 0x15, 0x00, 0x00,
+ 0x19, 0x00, 0x76, 0x00, 0xe0, 0x15, 0x00, 0x00,
+ 0x78, 0x3a, 0x00, 0x00, 0xa7, 0xee, 0x9a, 0xec,
+ 0x06, 0x00, 0x00, 0x00, 0x78, 0x3a, 0x00, 0x00,
+ 0x0e, 0x00, 0x4c, 0x00, 0x88, 0x3a, 0x00, 0x00,
+ 0x94, 0x3a, 0x00, 0x00, 0xa8, 0xa1, 0xf8, 0xa8,
+ 0x04, 0x00, 0x00, 0x00, 0x94, 0x3a, 0x00, 0x00,
+ 0x1e, 0x00, 0x76, 0x00, 0xb8, 0x3a, 0x00, 0x00,
+ 0xb3, 0x74, 0x00, 0x00, 0xb0, 0xb7, 0x24, 0x30,
+ 0x01, 0x00, 0x00, 0x00, 0xb3, 0x74, 0x00, 0x00,
+ 0x06, 0x00, 0x4c, 0x00, 0xbc, 0x74, 0x00, 0x00,
+ 0xc0, 0x74, 0x00, 0x00, 0x67, 0x69, 0x73, 0x2d,
+ 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64,
+ 0x2d, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x75, 0x69,
+ 0xa5, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x3c, 0x3f, 0x78, 0x6d, 0x6c, 0x20, 0x76, 0x65,
+ 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x31,
+ 0x2e, 0x30, 0x22, 0x20, 0x65, 0x6e, 0x63, 0x6f,
+ 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x55, 0x54,
+ 0x46, 0x2d, 0x38, 0x22, 0x3f, 0x3e, 0x0a, 0x3c,
+ 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+ 0x65, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x69,
+ 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+ 0x2d, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65,
+ 0x73, 0x20, 0x67, 0x74, 0x6b, 0x2b, 0x20, 0x33,
+ 0x2e, 0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x3c, 0x74,
+ 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x69, 0x73, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f,
+ 0x72, 0x64, 0x50, 0x61, 0x67, 0x65, 0x22, 0x20,
+ 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x22,
+ 0x47, 0x69, 0x73, 0x50, 0x61, 0x67, 0x65, 0x22,
+ 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x42, 0x6f, 0x78, 0x22, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x70, 0x61, 0x67, 0x65, 0x22,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63,
+ 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x61, 0x6c, 0x69,
+ 0x67, 0x6e, 0x22, 0x3e, 0x63, 0x65, 0x6e, 0x74,
+ 0x65, 0x72, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x61, 0x6c,
+ 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x66, 0x69, 0x6c,
+ 0x6c, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6f, 0x72, 0x69, 0x65,
+ 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22,
+ 0x3e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61,
+ 0x6c, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x49, 0x6d, 0x61,
+ 0x67, 0x65, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x69, 0x6d, 0x61, 0x67, 0x65, 0x31, 0x22, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75,
+ 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x70, 0x69, 0x78, 0x65, 0x6c,
+ 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3e, 0x39,
+ 0x36, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x69, 0x63, 0x6f, 0x6e,
+ 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x64,
+ 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x2d, 0x70, 0x61,
+ 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2d, 0x73,
+ 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x69, 0x63, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x73,
+ 0x69, 0x7a, 0x65, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f,
+ 0x74, 0x6f, 0x70, 0x22, 0x3e, 0x35, 0x34, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e,
+ 0x5f, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x22,
+ 0x3e, 0x32, 0x36, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x73,
+ 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x3c, 0x63, 0x6c,
+ 0x61, 0x73, 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x64, 0x69, 0x6d, 0x2d, 0x6c, 0x61,
+ 0x62, 0x65, 0x6c, 0x22, 0x2f, 0x3e, 0x3c, 0x2f,
+ 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x3c, 0x2f,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c,
+ 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c,
+ 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b,
+ 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x74, 0x69, 0x74, 0x6c, 0x65,
+ 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c,
+ 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f,
+ 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c,
+ 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x61, 0x6c,
+ 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x63, 0x65, 0x6e,
+ 0x74, 0x65, 0x72, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x61,
+ 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x73, 0x74,
+ 0x61, 0x72, 0x74, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61,
+ 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x70,
+ 0x22, 0x3e, 0x32, 0x36, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68,
+ 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72,
+ 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62,
+ 0x6c, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22,
+ 0x3e, 0x53, 0x65, 0x74, 0x20, 0x61, 0x20, 0x50,
+ 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x61, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x73, 0x3e, 0x3c, 0x61,
+ 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77,
+ 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x20, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x62, 0x6f,
+ 0x6c, 0x64, 0x22, 0x2f, 0x3e, 0x3c, 0x61, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x73, 0x63,
+ 0x61, 0x6c, 0x65, 0x22, 0x20, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x3d, 0x22, 0x31, 0x2e, 0x38, 0x22,
+ 0x2f, 0x3e, 0x3c, 0x2f, 0x61, 0x74, 0x74, 0x72,
+ 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x3e, 0x3c,
+ 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e,
+ 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63,
+ 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74,
+ 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x73, 0x75, 0x62, 0x74,
+ 0x69, 0x74, 0x6c, 0x65, 0x22, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69,
+ 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61,
+ 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22,
+ 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22,
+ 0x3e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f,
+ 0x74, 0x6f, 0x70, 0x22, 0x3e, 0x31, 0x34, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61,
+ 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3d, 0x22, 0x79,
+ 0x65, 0x73, 0x22, 0x3e, 0x42, 0x65, 0x20, 0x63,
+ 0x61, 0x72, 0x65, 0x66, 0x75, 0x6c, 0x20, 0x6e,
+ 0x6f, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x6c, 0x6f,
+ 0x73, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x72, 0x20,
+ 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6a, 0x75, 0x73, 0x74,
+ 0x69, 0x66, 0x79, 0x22, 0x3e, 0x63, 0x65, 0x6e,
+ 0x74, 0x65, 0x72, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x72,
+ 0x61, 0x70, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x78, 0x2d, 0x77,
+ 0x69, 0x64, 0x74, 0x68, 0x2d, 0x63, 0x68, 0x61,
+ 0x72, 0x73, 0x22, 0x3e, 0x35, 0x30, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
+ 0x47, 0x74, 0x6b, 0x47, 0x72, 0x69, 0x64, 0x22,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73, 0x65, 0x63,
+ 0x72, 0x65, 0x74, 0x73, 0x22, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69,
+ 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61,
+ 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22,
+ 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f,
+ 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x22,
+ 0x3e, 0x31, 0x32, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x72, 0x6f,
+ 0x77, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e,
+ 0x67, 0x22, 0x3e, 0x31, 0x32, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x74,
+ 0x6f, 0x70, 0x22, 0x3e, 0x35, 0x34, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x70, 0x61, 0x73,
+ 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x6c, 0x61,
+ 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73,
+ 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e,
+ 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e,
+ 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x68, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e,
+ 0x65, 0x6e, 0x64, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x78, 0x61,
+ 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61,
+ 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3d, 0x22, 0x79,
+ 0x65, 0x73, 0x22, 0x3e, 0x43, 0x68, 0x6f, 0x6f,
+ 0x73, 0x65, 0x20, 0x61, 0x20, 0x5f, 0x70, 0x61,
+ 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x75, 0x73, 0x65, 0x5f, 0x75, 0x6e, 0x64,
+ 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d,
+ 0x6e, 0x65, 0x6d, 0x6f, 0x6e, 0x69, 0x63, 0x5f,
+ 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x22, 0x3e,
+ 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64,
+ 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69,
+ 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f,
+ 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e,
+ 0x30, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f,
+ 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e,
+ 0x30, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74,
+ 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68,
+ 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63,
+ 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73,
+ 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x45, 0x6e,
+ 0x74, 0x72, 0x79, 0x22, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72,
+ 0x64, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63,
+ 0x75, 0x73, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0x3e, 0x46,
+ 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x69,
+ 0x6e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65,
+ 0x5f, 0x63, 0x68, 0x61, 0x72, 0x22, 0x3e, 0xe2,
+ 0x97, 0x8f, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x69, 0x6e, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63,
+ 0x68, 0x61, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x31,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x30,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65,
+ 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x4c, 0x61, 0x62,
+ 0x65, 0x6c, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x5f,
+ 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63,
+ 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73,
+ 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x68, 0x61, 0x6c, 0x69, 0x67, 0x6e,
+ 0x22, 0x3e, 0x65, 0x6e, 0x64, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x78, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e,
+ 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65,
+ 0x6c, 0x22, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73,
+ 0x6c, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3d,
+ 0x22, 0x79, 0x65, 0x73, 0x22, 0x3e, 0x5f, 0x43,
+ 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x20, 0x70,
+ 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x75, 0x73, 0x65, 0x5f, 0x75, 0x6e,
+ 0x64, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x65, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6d, 0x6e, 0x65, 0x6d, 0x6f, 0x6e, 0x69, 0x63,
+ 0x5f, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x22,
+ 0x3e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d,
+ 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69,
+ 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f,
+ 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e,
+ 0x30, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f,
+ 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e,
+ 0x33, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74,
+ 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68,
+ 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63,
+ 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73,
+ 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x45, 0x6e,
+ 0x74, 0x72, 0x79, 0x22, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d,
+ 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75,
+ 0x73, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69,
+ 0x6c, 0x69, 0x74, 0x79, 0x22, 0x3e, 0x46, 0x61,
+ 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x73, 0x65,
+ 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x22,
+ 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x69, 0x6e, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x22,
+ 0x3e, 0xe2, 0x97, 0x8f, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x69,
+ 0x6e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65,
+ 0x5f, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x65,
+ 0x74, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74,
+ 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22,
+ 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70,
+ 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22,
+ 0x3e, 0x33, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64,
+ 0x74, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e,
+ 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61,
+ 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61,
+ 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x4c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f,
+ 0x72, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6c, 0x61,
+ 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75,
+ 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x68, 0x61, 0x6c, 0x69, 0x67,
+ 0x6e, 0x22, 0x3e, 0x73, 0x74, 0x61, 0x72, 0x74,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c,
+ 0x22, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c,
+ 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3d, 0x22,
+ 0x79, 0x65, 0x73, 0x22, 0x3e, 0x54, 0x72, 0x79,
+ 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x65, 0x20,
+ 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x73, 0x74,
+ 0x20, 0x38, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65,
+ 0x72, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61,
+ 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x73, 0x2e,
+ 0x20, 0x4d, 0x69, 0x78, 0x20, 0x75, 0x70, 0x70,
+ 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c,
+ 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63, 0x61, 0x73,
+ 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73,
+ 0x65, 0x20, 0x61, 0x20, 0x6e, 0x75, 0x6d, 0x62,
+ 0x65, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x77,
+ 0x6f, 0x2e, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x72, 0x61,
+ 0x70, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69,
+ 0x64, 0x74, 0x68, 0x2d, 0x63, 0x68, 0x61, 0x72,
+ 0x73, 0x22, 0x3e, 0x33, 0x30, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x73, 0x3e, 0x3c, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x73, 0x63, 0x61,
+ 0x6c, 0x65, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x3d, 0x22, 0x30, 0x2e, 0x38, 0x22, 0x2f,
+ 0x3e, 0x3c, 0x2f, 0x61, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x73, 0x3e, 0x3c, 0x2f,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c,
+ 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74,
+ 0x61, 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74,
+ 0x61, 0x63, 0x68, 0x22, 0x3e, 0x32, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e,
+ 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67,
+ 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
+ 0x47, 0x74, 0x6b, 0x4c, 0x65, 0x76, 0x65, 0x6c,
+ 0x42, 0x61, 0x72, 0x22, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72,
+ 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x6e, 0x67,
+ 0x74, 0x68, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f,
+ 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46,
+ 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68,
+ 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x66,
+ 0x69, 0x6c, 0x6c, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x61,
+ 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x63, 0x65,
+ 0x6e, 0x74, 0x65, 0x72, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d,
+ 0x61, 0x78, 0x2d, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x22, 0x3e, 0x34, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x6f,
+ 0x64, 0x65, 0x22, 0x3e, 0x64, 0x69, 0x73, 0x63,
+ 0x72, 0x65, 0x74, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e,
+ 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74,
+ 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74,
+ 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22,
+ 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69,
+ 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69,
+ 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x2f, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x2f, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x2f, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x2f, 0x74,
+ 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x3e,
+ 0x3c, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66,
+ 0x61, 0x63, 0x65, 0x3e, 0x0a, 0x00, 0x00, 0x28,
+ 0x75, 0x75, 0x61, 0x79, 0x29, 0x6f, 0x72, 0x67,
+ 0x2f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+ 0x2f, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x67, 0x69, 0x73, 0x2d, 0x61, 0x63, 0x63, 0x6f,
+ 0x75, 0x6e, 0x74, 0x2d, 0x70, 0x61, 0x67, 0x65,
+ 0x2d, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x2e, 0x75,
+ 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x88, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x3c, 0x3f, 0x78, 0x6d, 0x6c, 0x20, 0x76, 0x65,
+ 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x31,
+ 0x2e, 0x30, 0x22, 0x20, 0x65, 0x6e, 0x63, 0x6f,
+ 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x55, 0x54,
+ 0x46, 0x2d, 0x38, 0x22, 0x3f, 0x3e, 0x0a, 0x3c,
+ 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+ 0x65, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x69,
+ 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+ 0x2d, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65,
+ 0x73, 0x20, 0x67, 0x74, 0x6b, 0x2b, 0x20, 0x33,
+ 0x2e, 0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x3c, 0x74,
+ 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x69, 0x73, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e,
+ 0x74, 0x50, 0x61, 0x67, 0x65, 0x4c, 0x6f, 0x63,
+ 0x61, 0x6c, 0x22, 0x20, 0x70, 0x61, 0x72, 0x65,
+ 0x6e, 0x74, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x42,
+ 0x69, 0x6e, 0x22, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x42, 0x6f, 0x78,
+ 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x61, 0x72,
+ 0x65, 0x61, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f,
+ 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46,
+ 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68,
+ 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x63,
+ 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e,
+ 0x66, 0x69, 0x6c, 0x6c, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6f,
+ 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x22, 0x3e, 0x76, 0x65, 0x72, 0x74,
+ 0x69, 0x63, 0x61, 0x6c, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c,
+ 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b,
+ 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x61, 0x76, 0x61, 0x74,
+ 0x61, 0x72, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f,
+ 0x6e, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69,
+ 0x6e, 0x5f, 0x74, 0x6f, 0x70, 0x22, 0x3e, 0x35,
+ 0x34, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x61, 0x6c, 0x69,
+ 0x67, 0x6e, 0x22, 0x3e, 0x63, 0x65, 0x6e, 0x74,
+ 0x65, 0x72, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73,
+ 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x49, 0x6d,
+ 0x61, 0x67, 0x65, 0x22, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x2d,
+ 0x69, 0x6d, 0x61, 0x67, 0x65, 0x22, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63,
+ 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73,
+ 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x70, 0x69, 0x78, 0x65, 0x6c, 0x5f,
+ 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3e, 0x39, 0x36,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x69, 0x63, 0x6f, 0x6e, 0x5f,
+ 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x61, 0x76,
+ 0x61, 0x74, 0x61, 0x72, 0x2d, 0x64, 0x65, 0x66,
+ 0x61, 0x75, 0x6c, 0x74, 0x2d, 0x73, 0x79, 0x6d,
+ 0x62, 0x6f, 0x6c, 0x69, 0x63, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x73, 0x69, 0x7a,
+ 0x65, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x3c, 0x63,
+ 0x6c, 0x61, 0x73, 0x73, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x64, 0x69, 0x6d, 0x2d, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x2f, 0x3e, 0x3c,
+ 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x3c,
+ 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e,
+ 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x74, 0x69, 0x74,
+ 0x6c, 0x65, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f,
+ 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46,
+ 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68,
+ 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x63,
+ 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e,
+ 0x73, 0x74, 0x61, 0x72, 0x74, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x74,
+ 0x6f, 0x70, 0x22, 0x3e, 0x32, 0x36, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x68, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20,
+ 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74,
+ 0x61, 0x62, 0x6c, 0x65, 0x3d, 0x22, 0x79, 0x65,
+ 0x73, 0x22, 0x3e, 0x41, 0x62, 0x6f, 0x75, 0x74,
+ 0x20, 0x59, 0x6f, 0x75, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x73, 0x3e, 0x3c, 0x61, 0x74, 0x74, 0x72,
+ 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x65, 0x69, 0x67,
+ 0x68, 0x74, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x3d, 0x22, 0x62, 0x6f, 0x6c, 0x64, 0x22,
+ 0x2f, 0x3e, 0x3c, 0x61, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x73, 0x63, 0x61, 0x6c, 0x65,
+ 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d,
+ 0x22, 0x31, 0x2e, 0x38, 0x22, 0x2f, 0x3e, 0x3c,
+ 0x2f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x73, 0x3e, 0x3c, 0x2f, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x2f, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73,
+ 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x4c, 0x61,
+ 0x62, 0x65, 0x6c, 0x22, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x73, 0x75, 0x62, 0x74, 0x69, 0x74, 0x6c,
+ 0x65, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66,
+ 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61,
+ 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x61,
+ 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x73, 0x74,
+ 0x61, 0x72, 0x74, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61,
+ 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x70,
+ 0x22, 0x3e, 0x31, 0x34, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72,
+ 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62,
+ 0x6c, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22,
+ 0x3e, 0x57, 0x65, 0x20, 0x6e, 0x65, 0x65, 0x64,
+ 0x20, 0x61, 0x20, 0x66, 0x65, 0x77, 0x20, 0x64,
+ 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x74,
+ 0x6f, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65,
+ 0x74, 0x65, 0x20, 0x73, 0x65, 0x74, 0x75, 0x70,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6a, 0x75, 0x73, 0x74,
+ 0x69, 0x66, 0x79, 0x22, 0x3e, 0x63, 0x65, 0x6e,
+ 0x74, 0x65, 0x72, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x72,
+ 0x61, 0x70, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x78, 0x2d, 0x77,
+ 0x69, 0x64, 0x74, 0x68, 0x2d, 0x63, 0x68, 0x61,
+ 0x72, 0x73, 0x22, 0x3e, 0x35, 0x30, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
+ 0x47, 0x74, 0x6b, 0x47, 0x72, 0x69, 0x64, 0x22,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x66, 0x6f, 0x72,
+ 0x6d, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66,
+ 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61,
+ 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x6f,
+ 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x73, 0x70, 0x61,
+ 0x63, 0x69, 0x6e, 0x67, 0x22, 0x3e, 0x31, 0x32,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x72, 0x6f, 0x77, 0x5f, 0x73,
+ 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x22, 0x3e,
+ 0x31, 0x32, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72,
+ 0x67, 0x69, 0x6e, 0x5f, 0x74, 0x6f, 0x70, 0x22,
+ 0x3e, 0x35, 0x34, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61,
+ 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x4c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x66, 0x75, 0x6c, 0x6c, 0x6e, 0x61,
+ 0x6d, 0x65, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c,
+ 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c,
+ 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f,
+ 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c,
+ 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x61, 0x6c,
+ 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x65, 0x6e, 0x64,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x78, 0x61, 0x6c, 0x69, 0x67,
+ 0x6e, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72,
+ 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62,
+ 0x6c, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22,
+ 0x3e, 0x5f, 0x46, 0x75, 0x6c, 0x6c, 0x20, 0x4e,
+ 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x75, 0x73,
+ 0x65, 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c,
+ 0x69, 0x6e, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x6e, 0x65, 0x6d,
+ 0x6f, 0x6e, 0x69, 0x63, 0x5f, 0x77, 0x69, 0x64,
+ 0x67, 0x65, 0x74, 0x22, 0x3e, 0x66, 0x75, 0x6c,
+ 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x65, 0x6e,
+ 0x74, 0x72, 0x79, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c,
+ 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74,
+ 0x61, 0x63, 0x68, 0x22, 0x3e, 0x30, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74,
+ 0x61, 0x63, 0x68, 0x22, 0x3e, 0x33, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e,
+ 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67,
+ 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
+ 0x47, 0x74, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79,
+ 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x66, 0x75,
+ 0x6c, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x65,
+ 0x6e, 0x74, 0x72, 0x79, 0x22, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61,
+ 0x78, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68,
+ 0x22, 0x3e, 0x32, 0x35, 0x35, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x77, 0x69, 0x64, 0x74, 0x68, 0x2d, 0x63, 0x68,
+ 0x61, 0x72, 0x73, 0x22, 0x3e, 0x32, 0x35, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c,
+ 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f,
+ 0x63, 0x75, 0x73, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x69, 0x6e, 0x76, 0x69,
+ 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68,
+ 0x61, 0x72, 0x22, 0x3e, 0xe2, 0x97, 0x8f, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x69, 0x6e, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72,
+ 0x5f, 0x73, 0x65, 0x74, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70,
+ 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c,
+ 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x61,
+ 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61,
+ 0x63, 0x68, 0x22, 0x3e, 0x33, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e, 0x31,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67, 0x68,
+ 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+ 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x75, 0x73, 0x65,
+ 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x6c, 0x61,
+ 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73,
+ 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e,
+ 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e,
+ 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x68, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e,
+ 0x65, 0x6e, 0x64, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x78, 0x61,
+ 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61,
+ 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3d, 0x22, 0x79,
+ 0x65, 0x73, 0x22, 0x3e, 0x5f, 0x55, 0x73, 0x65,
+ 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x75, 0x73, 0x65, 0x5f, 0x75, 0x6e, 0x64, 0x65,
+ 0x72, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x6e,
+ 0x65, 0x6d, 0x6f, 0x6e, 0x69, 0x63, 0x5f, 0x77,
+ 0x69, 0x64, 0x67, 0x65, 0x74, 0x22, 0x3e, 0x75,
+ 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f,
+ 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x30,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x34,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65,
+ 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x43, 0x6f, 0x6d,
+ 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x54, 0x65, 0x78,
+ 0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x75,
+ 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f,
+ 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x22, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63,
+ 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73,
+ 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x68, 0x61, 0x73, 0x5f, 0x65, 0x6e,
+ 0x74, 0x72, 0x79, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x65, 0x6e, 0x74, 0x72,
+ 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x63,
+ 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x22, 0x3e, 0x30,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x69, 0x64, 0x5f, 0x63, 0x6f,
+ 0x6c, 0x75, 0x6d, 0x6e, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
+ 0x6c, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3d,
+ 0x22, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x63, 0x6f, 0x6d,
+ 0x62, 0x6f, 0x62, 0x6f, 0x78, 0x74, 0x65, 0x78,
+ 0x74, 0x2d, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63,
+ 0x75, 0x73, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68,
+ 0x2d, 0x63, 0x68, 0x61, 0x72, 0x73, 0x22, 0x3e,
+ 0x32, 0x35, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x2f,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x2f,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c,
+ 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74,
+ 0x61, 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74,
+ 0x61, 0x63, 0x68, 0x22, 0x3e, 0x34, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e,
+ 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67,
+ 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
+ 0x47, 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c,
+ 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x75, 0x73,
+ 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x65,
+ 0x78, 0x70, 0x6c, 0x61, 0x6e, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f,
+ 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46,
+ 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68,
+ 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x73,
+ 0x74, 0x61, 0x72, 0x74, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d,
+ 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x62, 0x6f,
+ 0x74, 0x74, 0x6f, 0x6d, 0x22, 0x3e, 0x31, 0x32,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c,
+ 0x22, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c,
+ 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3d, 0x22,
+ 0x79, 0x65, 0x73, 0x22, 0x3e, 0x59, 0x6f, 0x75,
+ 0x72, 0x20, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61,
+ 0x6d, 0x65, 0x20, 0x63, 0x61, 0x6e, 0x6e, 0x6f,
+ 0x74, 0x20, 0x62, 0x65, 0x20, 0x63, 0x68, 0x61,
+ 0x6e, 0x67, 0x65, 0x64, 0x20, 0x61, 0x66, 0x74,
+ 0x65, 0x72, 0x20, 0x73, 0x65, 0x74, 0x75, 0x70,
+ 0x2e, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x72, 0x61, 0x70,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62,
+ 0x75, 0x74, 0x65, 0x73, 0x3e, 0x3c, 0x61, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x73, 0x63,
+ 0x61, 0x6c, 0x65, 0x22, 0x20, 0x76, 0x61, 0x6c,
+ 0x75, 0x65, 0x3d, 0x22, 0x30, 0x2e, 0x38, 0x22,
+ 0x2f, 0x3e, 0x3c, 0x2f, 0x61, 0x74, 0x74, 0x72,
+ 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x3e, 0x3c,
+ 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e,
+ 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74,
+ 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74,
+ 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x35, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22,
+ 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69,
+ 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69,
+ 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x2f, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x47, 0x72, 0x69,
+ 0x64, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x73,
+ 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x22, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22,
+ 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63,
+ 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x6f, 0x6c, 0x75,
+ 0x6d, 0x6e, 0x5f, 0x73, 0x70, 0x61, 0x63, 0x69,
+ 0x6e, 0x67, 0x22, 0x3e, 0x31, 0x32, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x72, 0x6f, 0x77, 0x5f, 0x73, 0x70, 0x61,
+ 0x63, 0x69, 0x6e, 0x67, 0x22, 0x3e, 0x31, 0x32,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69,
+ 0x6e, 0x5f, 0x74, 0x6f, 0x70, 0x22, 0x3e, 0x31,
+ 0x38, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x4c, 0x61, 0x62,
+ 0x65, 0x6c, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64,
+ 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75,
+ 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x68, 0x61, 0x6c, 0x69, 0x67,
+ 0x6e, 0x22, 0x3e, 0x65, 0x6e, 0x64, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x78, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22,
+ 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x61, 0x62,
+ 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72, 0x61, 0x6e,
+ 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65,
+ 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3e, 0x5f,
+ 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x75, 0x73, 0x65, 0x5f, 0x75,
+ 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x65,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6d, 0x6e, 0x65, 0x6d, 0x6f, 0x6e, 0x69,
+ 0x63, 0x5f, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74,
+ 0x22, 0x3e, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f,
+ 0x72, 0x64, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63,
+ 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66,
+ 0x74, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68,
+ 0x22, 0x3e, 0x30, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74, 0x6f,
+ 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68,
+ 0x22, 0x3e, 0x36, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x69,
+ 0x64, 0x74, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22,
+ 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x70,
+ 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c,
+ 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c,
+ 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b,
+ 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x70, 0x61, 0x73, 0x73, 0x77,
+ 0x6f, 0x72, 0x64, 0x5f, 0x65, 0x6e, 0x74, 0x72,
+ 0x79, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66,
+ 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73,
+ 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22,
+ 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x69, 0x6e, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x22,
+ 0x3e, 0xe2, 0x97, 0x8f, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x69,
+ 0x6e, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65,
+ 0x5f, 0x63, 0x68, 0x61, 0x72, 0x5f, 0x73, 0x65,
+ 0x74, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74,
+ 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22,
+ 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70,
+ 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22,
+ 0x3e, 0x36, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64,
+ 0x74, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e,
+ 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61,
+ 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61,
+ 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x4c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72,
+ 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63,
+ 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x61, 0x6c, 0x69,
+ 0x67, 0x6e, 0x22, 0x3e, 0x65, 0x6e, 0x64, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x78, 0x61, 0x6c, 0x69, 0x67, 0x6e,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x61,
+ 0x62, 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72, 0x61,
+ 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62, 0x6c,
+ 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3e,
+ 0x5f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d,
+ 0x20, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72,
+ 0x64, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x75, 0x73, 0x65, 0x5f,
+ 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69, 0x6e,
+ 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6d, 0x6e, 0x65, 0x6d, 0x6f, 0x6e,
+ 0x69, 0x63, 0x5f, 0x77, 0x69, 0x64, 0x67, 0x65,
+ 0x74, 0x22, 0x3e, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+ 0x72, 0x6d, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63,
+ 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66,
+ 0x74, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68,
+ 0x22, 0x3e, 0x30, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74, 0x6f,
+ 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68,
+ 0x22, 0x3e, 0x37, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x69,
+ 0x64, 0x74, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22,
+ 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x70,
+ 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c,
+ 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c,
+ 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b,
+ 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x66, 0x69,
+ 0x72, 0x6d, 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79,
+ 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c,
+ 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f,
+ 0x63, 0x75, 0x73, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0x3e,
+ 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x73, 0x65, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x76,
+ 0x65, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x69, 0x6e, 0x76, 0x69, 0x73,
+ 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61,
+ 0x72, 0x22, 0x3e, 0xe2, 0x97, 0x8f, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x69, 0x6e, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x5f,
+ 0x73, 0x65, 0x74, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61,
+ 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x65,
+ 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63,
+ 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74,
+ 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63,
+ 0x68, 0x22, 0x3e, 0x37, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77,
+ 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f,
+ 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e,
+ 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63,
+ 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74,
+ 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x70, 0x61, 0x73, 0x73,
+ 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x65, 0x78, 0x70,
+ 0x6c, 0x61, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c,
+ 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f,
+ 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c,
+ 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x61, 0x6c,
+ 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x73, 0x74, 0x61,
+ 0x72, 0x74, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x61, 0x62,
+ 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72, 0x61, 0x6e,
+ 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65,
+ 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3e, 0x54,
+ 0x72, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73,
+ 0x65, 0x20, 0x61, 0x74, 0x20, 0x6c, 0x65, 0x61,
+ 0x73, 0x74, 0x20, 0x38, 0x20, 0x64, 0x69, 0x66,
+ 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x63,
+ 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72,
+ 0x73, 0x2e, 0x20, 0x4d, 0x69, 0x78, 0x20, 0x75,
+ 0x70, 0x70, 0x65, 0x72, 0x20, 0x61, 0x6e, 0x64,
+ 0x20, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x20, 0x63,
+ 0x61, 0x73, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20,
+ 0x75, 0x73, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x75,
+ 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x72, 0x20,
+ 0x74, 0x77, 0x6f, 0x2e, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77,
+ 0x72, 0x61, 0x70, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x78, 0x2d,
+ 0x77, 0x69, 0x64, 0x74, 0x68, 0x2d, 0x63, 0x68,
+ 0x61, 0x72, 0x73, 0x22, 0x3e, 0x33, 0x30, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x61, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x73, 0x3e, 0x3c, 0x61,
+ 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x73,
+ 0x63, 0x61, 0x6c, 0x65, 0x22, 0x20, 0x76, 0x61,
+ 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x30, 0x2e, 0x38,
+ 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x3e,
+ 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x31,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x38,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65,
+ 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x42, 0x6f, 0x78,
+ 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x62, 0x6f,
+ 0x78, 0x31, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f,
+ 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46,
+ 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76,
+ 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x73,
+ 0x74, 0x61, 0x72, 0x74, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6f,
+ 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x22, 0x3e, 0x76, 0x65, 0x72, 0x74,
+ 0x69, 0x63, 0x61, 0x6c, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x73,
+ 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x22, 0x3e,
+ 0x32, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x4c, 0x61, 0x62,
+ 0x65, 0x6c, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64,
+ 0x5f, 0x73, 0x74, 0x72, 0x65, 0x6e, 0x67, 0x74,
+ 0x68, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63,
+ 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x78, 0x61, 0x6c, 0x69,
+ 0x67, 0x6e, 0x22, 0x3e, 0x30, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x2f, 0x3e,
+ 0x3c, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x73, 0x3e, 0x3c, 0x61, 0x74, 0x74,
+ 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x73, 0x63, 0x61,
+ 0x6c, 0x65, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75,
+ 0x65, 0x3d, 0x22, 0x30, 0x2e, 0x38, 0x22, 0x2f,
+ 0x3e, 0x3c, 0x2f, 0x61, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x73, 0x3e, 0x3c, 0x2f,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c,
+ 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x22, 0x3e,
+ 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x70, 0x6f, 0x73,
+ 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x30,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63,
+ 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73,
+ 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x4c, 0x65,
+ 0x76, 0x65, 0x6c, 0x42, 0x61, 0x72, 0x22, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x70, 0x61, 0x73, 0x73,
+ 0x77, 0x6f, 0x72, 0x64, 0x5f, 0x73, 0x74, 0x72,
+ 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63,
+ 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73,
+ 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x68, 0x61, 0x6c, 0x69, 0x67, 0x6e,
+ 0x22, 0x3e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x76, 0x61, 0x6c, 0x69, 0x67, 0x6e,
+ 0x22, 0x3e, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x78, 0x2d, 0x76,
+ 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3e, 0x34, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x3e,
+ 0x64, 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63,
+ 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x65, 0x78, 0x70,
+ 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x46, 0x61, 0x6c,
+ 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x66, 0x69, 0x6c,
+ 0x6c, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69,
+ 0x6f, 0x6e, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74,
+ 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22,
+ 0x3e, 0x32, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70,
+ 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22,
+ 0x3e, 0x36, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64,
+ 0x74, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e,
+ 0x32, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61,
+ 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x2f,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c,
+ 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c,
+ 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e,
+ 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x2f, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61,
+ 0x74, 0x65, 0x3e, 0x3c, 0x2f, 0x69, 0x6e, 0x74,
+ 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x3e, 0x0a,
+ 0x00, 0x00, 0x28, 0x75, 0x75, 0x61, 0x79, 0x29,
+ 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x2d,
+ 0x73, 0x65, 0x74, 0x75, 0x70, 0x2f, 0x00, 0x00,
+ 0x05, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x67, 0x69, 0x73, 0x2d,
+ 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x2d,
+ 0x70, 0x61, 0x67, 0x65, 0x2d, 0x65, 0x6e, 0x74,
+ 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x2e,
+ 0x75, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xeb, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x3c, 0x3f, 0x78, 0x6d, 0x6c, 0x20, 0x76, 0x65,
+ 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x3d, 0x22, 0x31,
+ 0x2e, 0x30, 0x22, 0x20, 0x65, 0x6e, 0x63, 0x6f,
+ 0x64, 0x69, 0x6e, 0x67, 0x3d, 0x22, 0x55, 0x54,
+ 0x46, 0x2d, 0x38, 0x22, 0x3f, 0x3e, 0x0a, 0x3c,
+ 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+ 0x65, 0x3e, 0x3c, 0x21, 0x2d, 0x2d, 0x20, 0x69,
+ 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65,
+ 0x2d, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65,
+ 0x73, 0x20, 0x67, 0x74, 0x6b, 0x2b, 0x20, 0x33,
+ 0x2e, 0x30, 0x20, 0x2d, 0x2d, 0x3e, 0x3c, 0x74,
+ 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x69, 0x73, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e,
+ 0x74, 0x50, 0x61, 0x67, 0x65, 0x45, 0x6e, 0x74,
+ 0x65, 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x22,
+ 0x20, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d,
+ 0x22, 0x47, 0x74, 0x6b, 0x42, 0x69, 0x6e, 0x22,
+ 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x42, 0x6f, 0x78, 0x22, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x61, 0x72, 0x65, 0x61, 0x22,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63,
+ 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6f, 0x72, 0x69, 0x65,
+ 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22,
+ 0x3e, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61,
+ 0x6c, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x61, 0x6c, 0x69,
+ 0x67, 0x6e, 0x22, 0x3e, 0x63, 0x65, 0x6e, 0x74,
+ 0x65, 0x72, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x61, 0x6c,
+ 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x66, 0x69, 0x6c,
+ 0x6c, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x49, 0x6d, 0x61,
+ 0x67, 0x65, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x69, 0x6d, 0x61, 0x67, 0x65, 0x31, 0x22, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75,
+ 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x70, 0x69, 0x78, 0x65, 0x6c,
+ 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x3e, 0x39,
+ 0x36, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x69, 0x63, 0x6f, 0x6e,
+ 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x64,
+ 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x2d, 0x70, 0x61,
+ 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x2d, 0x73,
+ 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x69, 0x63, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x73,
+ 0x69, 0x7a, 0x65, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f,
+ 0x74, 0x6f, 0x70, 0x22, 0x3e, 0x35, 0x34, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e,
+ 0x5f, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x22,
+ 0x3e, 0x32, 0x36, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x73,
+ 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x3c, 0x63, 0x6c,
+ 0x61, 0x73, 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x64, 0x69, 0x6d, 0x2d, 0x6c, 0x61,
+ 0x62, 0x65, 0x6c, 0x22, 0x2f, 0x3e, 0x3c, 0x2f,
+ 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x3c, 0x2f,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c,
+ 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c,
+ 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b,
+ 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20, 0x69,
+ 0x64, 0x3d, 0x22, 0x74, 0x69, 0x74, 0x6c, 0x65,
+ 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c,
+ 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f,
+ 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c,
+ 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x78,
+ 0x70, 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x61, 0x62,
+ 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72, 0x61, 0x6e,
+ 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65,
+ 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3e, 0x45,
+ 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x69, 0x73,
+ 0x65, 0x20, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e,
+ 0x5f, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x22,
+ 0x3e, 0x31, 0x34, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x61,
+ 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
+ 0x73, 0x3e, 0x3c, 0x61, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x77, 0x65, 0x69, 0x67, 0x68,
+ 0x74, 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65,
+ 0x3d, 0x22, 0x62, 0x6f, 0x6c, 0x64, 0x22, 0x2f,
+ 0x3e, 0x3c, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62,
+ 0x75, 0x74, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x22,
+ 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22,
+ 0x31, 0x2e, 0x38, 0x22, 0x2f, 0x3e, 0x3c, 0x2f,
+ 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+ 0x65, 0x73, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x2f, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x4c, 0x61, 0x62,
+ 0x65, 0x6c, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x73, 0x75, 0x62, 0x74, 0x69, 0x74, 0x6c, 0x65,
+ 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c,
+ 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f,
+ 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c,
+ 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x61, 0x6c,
+ 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x73, 0x74, 0x61,
+ 0x72, 0x74, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72,
+ 0x67, 0x69, 0x6e, 0x5f, 0x62, 0x6f, 0x74, 0x74,
+ 0x6f, 0x6d, 0x22, 0x3e, 0x32, 0x36, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20,
+ 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74,
+ 0x61, 0x62, 0x6c, 0x65, 0x3d, 0x22, 0x79, 0x65,
+ 0x73, 0x22, 0x3e, 0x45, 0x6e, 0x74, 0x65, 0x72,
+ 0x70, 0x72, 0x69, 0x73, 0x65, 0x20, 0x6c, 0x6f,
+ 0x67, 0x69, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x6f,
+ 0x77, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78,
+ 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x63,
+ 0x65, 0x6e, 0x74, 0x72, 0x61, 0x6c, 0x6c, 0x79,
+ 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64,
+ 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x61, 0x63,
+ 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x74, 0x6f,
+ 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64,
+ 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73,
+ 0x20, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2e,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6a, 0x75, 0x73, 0x74, 0x69,
+ 0x66, 0x79, 0x22, 0x3e, 0x63, 0x65, 0x6e, 0x74,
+ 0x65, 0x72, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x72, 0x61,
+ 0x70, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69,
+ 0x64, 0x74, 0x68, 0x2d, 0x63, 0x68, 0x61, 0x72,
+ 0x73, 0x22, 0x3e, 0x34, 0x35, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x47, 0x72, 0x69, 0x64, 0x22, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x66, 0x6f, 0x72, 0x6d,
+ 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c,
+ 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f,
+ 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c,
+ 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x72, 0x6f, 0x77,
+ 0x5f, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67,
+ 0x22, 0x3e, 0x31, 0x32, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63,
+ 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x73, 0x70,
+ 0x61, 0x63, 0x69, 0x6e, 0x67, 0x22, 0x3e, 0x31,
+ 0x32, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67,
+ 0x69, 0x6e, 0x5f, 0x62, 0x6f, 0x74, 0x74, 0x6f,
+ 0x6d, 0x22, 0x3e, 0x33, 0x32, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63,
+ 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74,
+ 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65,
+ 0x6c, 0x34, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f,
+ 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46,
+ 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68,
+ 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x65,
+ 0x6e, 0x64, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x78, 0x61, 0x6c,
+ 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20,
+ 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74,
+ 0x61, 0x62, 0x6c, 0x65, 0x3d, 0x22, 0x79, 0x65,
+ 0x73, 0x22, 0x3e, 0x5f, 0x44, 0x6f, 0x6d, 0x61,
+ 0x69, 0x6e, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x75, 0x73, 0x65,
+ 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69,
+ 0x6e, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6d, 0x6e, 0x65, 0x6d, 0x6f,
+ 0x6e, 0x69, 0x63, 0x5f, 0x77, 0x69, 0x64, 0x67,
+ 0x65, 0x74, 0x22, 0x3e, 0x64, 0x6f, 0x6d, 0x61,
+ 0x69, 0x6e, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70,
+ 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c,
+ 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x61,
+ 0x63, 0x68, 0x22, 0x3e, 0x30, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61,
+ 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e, 0x31,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67, 0x68,
+ 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+ 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x61, 0x62,
+ 0x65, 0x6c, 0x38, 0x22, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73,
+ 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e,
+ 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e,
+ 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x68, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e,
+ 0x65, 0x6e, 0x64, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x78, 0x61,
+ 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61,
+ 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3d, 0x22, 0x79,
+ 0x65, 0x73, 0x22, 0x3e, 0x5f, 0x55, 0x73, 0x65,
+ 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x75, 0x73, 0x65, 0x5f, 0x75, 0x6e, 0x64, 0x65,
+ 0x72, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x6e,
+ 0x65, 0x6d, 0x6f, 0x6e, 0x69, 0x63, 0x5f, 0x77,
+ 0x69, 0x64, 0x67, 0x65, 0x74, 0x22, 0x3e, 0x6c,
+ 0x6f, 0x67, 0x69, 0x6e, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e,
+ 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74,
+ 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x30, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74,
+ 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x33, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22,
+ 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69,
+ 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69,
+ 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
+ 0x22, 0x47, 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65,
+ 0x6c, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x39, 0x22, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63,
+ 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73,
+ 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x68, 0x61, 0x6c, 0x69, 0x67, 0x6e,
+ 0x22, 0x3e, 0x65, 0x6e, 0x64, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x78, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e,
+ 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65,
+ 0x6c, 0x22, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73,
+ 0x6c, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3d,
+ 0x22, 0x79, 0x65, 0x73, 0x22, 0x3e, 0x5f, 0x50,
+ 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x75, 0x73, 0x65, 0x5f, 0x75, 0x6e,
+ 0x64, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x65, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6d, 0x6e, 0x65, 0x6d, 0x6f, 0x6e, 0x69, 0x63,
+ 0x5f, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x22,
+ 0x3e, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72,
+ 0x64, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61,
+ 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x65,
+ 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63,
+ 0x68, 0x22, 0x3e, 0x30, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74,
+ 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63,
+ 0x68, 0x22, 0x3e, 0x34, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77,
+ 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f,
+ 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e,
+ 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63,
+ 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74,
+ 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x6f, 0x67, 0x69,
+ 0x6e, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66,
+ 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x78,
+ 0x70, 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x69, 0x6e, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63,
+ 0x68, 0x61, 0x72, 0x22, 0x3e, 0xe2, 0x97, 0x8f,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x69, 0x6e, 0x76, 0x69, 0x73,
+ 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61,
+ 0x72, 0x5f, 0x73, 0x65, 0x74, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61,
+ 0x78, 0x2d, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68,
+ 0x22, 0x3e, 0x32, 0x35, 0x35, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x77, 0x69, 0x64, 0x74, 0x68, 0x2d, 0x63, 0x68,
+ 0x61, 0x72, 0x73, 0x22, 0x3e, 0x32, 0x35, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74,
+ 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22,
+ 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70,
+ 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22,
+ 0x3e, 0x33, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64,
+ 0x74, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e,
+ 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61,
+ 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61,
+ 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x45,
+ 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f,
+ 0x72, 0x64, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f,
+ 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65,
+ 0x78, 0x70, 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69,
+ 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79,
+ 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x69, 0x6e, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72,
+ 0x22, 0x3e, 0xe2, 0x97, 0x8f, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x61, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65,
+ 0x73, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,
+ 0x74, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x69, 0x6e, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x72,
+ 0x5f, 0x73, 0x65, 0x74, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x78,
+ 0x2d, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x22,
+ 0x3e, 0x32, 0x35, 0x35, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77,
+ 0x69, 0x64, 0x74, 0x68, 0x2d, 0x63, 0x68, 0x61,
+ 0x72, 0x73, 0x22, 0x3e, 0x32, 0x35, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69,
+ 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f,
+ 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e,
+ 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f,
+ 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e,
+ 0x34, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74,
+ 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68,
+ 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63,
+ 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73,
+ 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x43, 0x6f,
+ 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x22, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x64, 0x6f, 0x6d, 0x61,
+ 0x69, 0x6e, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f,
+ 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46,
+ 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68,
+ 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d,
+ 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x3e, 0x72, 0x65,
+ 0x61, 0x6c, 0x6d, 0x73, 0x5f, 0x6d, 0x6f, 0x64,
+ 0x65, 0x6c, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x61, 0x73,
+ 0x5f, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x65,
+ 0x6e, 0x74, 0x72, 0x79, 0x5f, 0x74, 0x65, 0x78,
+ 0x74, 0x5f, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e,
+ 0x22, 0x3e, 0x30, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x20, 0x69, 0x6e, 0x74,
+ 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2d, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3d, 0x22, 0x65, 0x6e, 0x74,
+ 0x72, 0x79, 0x22, 0x3e, 0x3c, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73,
+ 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x45, 0x6e,
+ 0x74, 0x72, 0x79, 0x22, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x5f,
+ 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63,
+ 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6d, 0x61, 0x78, 0x2d, 0x6c, 0x65, 0x6e,
+ 0x67, 0x74, 0x68, 0x22, 0x3e, 0x32, 0x35, 0x35,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68,
+ 0x2d, 0x63, 0x68, 0x61, 0x72, 0x73, 0x22, 0x3e,
+ 0x32, 0x35, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x2f,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x2f,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c,
+ 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74,
+ 0x61, 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74,
+ 0x61, 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e,
+ 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67,
+ 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
+ 0x47, 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c,
+ 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x61,
+ 0x62, 0x65, 0x6c, 0x31, 0x30, 0x22, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63,
+ 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73,
+ 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e,
+ 0x5f, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x22,
+ 0x3e, 0x31, 0x32, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x78, 0x61,
+ 0x6c, 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x30, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61,
+ 0x74, 0x61, 0x62, 0x6c, 0x65, 0x3d, 0x22, 0x79,
+ 0x65, 0x73, 0x22, 0x3e, 0x45, 0x6e, 0x74, 0x65,
+ 0x72, 0x70, 0x72, 0x69, 0x73, 0x65, 0x20, 0x64,
+ 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x6f, 0x72,
+ 0x20, 0x72, 0x65, 0x61, 0x6c, 0x6d, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x61,
+ 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
+ 0x73, 0x3e, 0x3c, 0x61, 0x74, 0x74, 0x72, 0x69,
+ 0x62, 0x75, 0x74, 0x65, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x73, 0x63, 0x61, 0x6c, 0x65,
+ 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d,
+ 0x22, 0x30, 0x2e, 0x38, 0x22, 0x2f, 0x3e, 0x3c,
+ 0x2f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x73, 0x3e, 0x3c, 0x2f, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61,
+ 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x65,
+ 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63,
+ 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74,
+ 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63,
+ 0x68, 0x22, 0x3e, 0x32, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77,
+ 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f,
+ 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e,
+ 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63,
+ 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74,
+ 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x66, 0x69, 0x6c, 0x6c,
+ 0x65, 0x72, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f,
+ 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46,
+ 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e,
+ 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74,
+ 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x32, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74,
+ 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x34, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22,
+ 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69,
+ 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69,
+ 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x2f, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x2f, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x2f, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x2f, 0x74,
+ 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x44, 0x69, 0x61, 0x6c, 0x6f, 0x67,
+ 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6a, 0x6f,
+ 0x69, 0x6e, 0x5f, 0x64, 0x69, 0x61, 0x6c, 0x6f,
+ 0x67, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66,
+ 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61,
+ 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x62, 0x6f,
+ 0x72, 0x64, 0x65, 0x72, 0x5f, 0x77, 0x69, 0x64,
+ 0x74, 0x68, 0x22, 0x3e, 0x31, 0x30, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x72, 0x65, 0x73, 0x69, 0x7a, 0x61, 0x62,
+ 0x6c, 0x65, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x6d, 0x6f, 0x64, 0x61,
+ 0x6c, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x64, 0x65, 0x73, 0x74, 0x72, 0x6f,
+ 0x79, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x70,
+ 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74, 0x79,
+ 0x70, 0x65, 0x5f, 0x68, 0x69, 0x6e, 0x74, 0x22,
+ 0x3e, 0x64, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61,
+ 0x6c, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3d,
+ 0x22, 0x76, 0x62, 0x6f, 0x78, 0x22, 0x3e, 0x3c,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63,
+ 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74,
+ 0x6b, 0x42, 0x6f, 0x78, 0x22, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x64, 0x69, 0x61, 0x6c, 0x6f, 0x67,
+ 0x2d, 0x76, 0x62, 0x6f, 0x78, 0x31, 0x22, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75,
+ 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6f, 0x72, 0x69, 0x65, 0x6e,
+ 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e,
+ 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x73, 0x70, 0x61, 0x63, 0x69,
+ 0x6e, 0x67, 0x22, 0x3e, 0x32, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x69,
+ 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2d,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3d, 0x22, 0x61,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x72,
+ 0x65, 0x61, 0x22, 0x3e, 0x3c, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73,
+ 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x42, 0x75,
+ 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x22,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x64, 0x69, 0x61,
+ 0x6c, 0x6f, 0x67, 0x2d, 0x61, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x5f, 0x61, 0x72, 0x65, 0x61, 0x31,
+ 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f,
+ 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c,
+ 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x61, 0x79,
+ 0x6f, 0x75, 0x74, 0x5f, 0x73, 0x74, 0x79, 0x6c,
+ 0x65, 0x22, 0x3e, 0x65, 0x6e, 0x64, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e,
+ 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x62, 0x75,
+ 0x74, 0x74, 0x6f, 0x6e, 0x31, 0x22, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x3e, 0x67, 0x74,
+ 0x6b, 0x2d, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x75, 0x73, 0x65, 0x5f, 0x61,
+ 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x70,
+ 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65,
+ 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c,
+ 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f,
+ 0x63, 0x75, 0x73, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f,
+ 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x73,
+ 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x75, 0x73, 0x65, 0x5f, 0x61, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x70, 0x70, 0x65,
+ 0x61, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x3e,
+ 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x75, 0x73, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x63,
+ 0x6b, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x65, 0x78, 0x70, 0x61,
+ 0x6e, 0x64, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x66, 0x69, 0x6c, 0x6c,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f,
+ 0x6e, 0x22, 0x3e, 0x30, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+ 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e,
+ 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x62, 0x75,
+ 0x74, 0x74, 0x6f, 0x6e, 0x32, 0x22, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72,
+ 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62,
+ 0x6c, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22,
+ 0x3e, 0x43, 0x5f, 0x6f, 0x6e, 0x74, 0x69, 0x6e,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x75, 0x73, 0x65,
+ 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
+ 0x61, 0x70, 0x70, 0x65, 0x61, 0x72, 0x61, 0x6e,
+ 0x63, 0x65, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69,
+ 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f,
+ 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61,
+ 0x6e, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c,
+ 0x74, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x68, 0x61, 0x73, 0x5f, 0x64, 0x65,
+ 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x72, 0x65,
+ 0x63, 0x65, 0x69, 0x76, 0x65, 0x73, 0x5f, 0x64,
+ 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x75,
+ 0x73, 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f,
+ 0x6e, 0x5f, 0x61, 0x70, 0x70, 0x65, 0x61, 0x72,
+ 0x61, 0x6e, 0x63, 0x65, 0x22, 0x3e, 0x46, 0x61,
+ 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x75, 0x73,
+ 0x65, 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c,
+ 0x69, 0x6e, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61,
+ 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x65, 0x78,
+ 0x70, 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x46, 0x61,
+ 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x66, 0x69,
+ 0x6c, 0x6c, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x70, 0x6f, 0x73, 0x69, 0x74,
+ 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69,
+ 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63,
+ 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x65, 0x78, 0x70,
+ 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x46, 0x61, 0x6c,
+ 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x66, 0x69, 0x6c,
+ 0x6c, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x70, 0x61, 0x63, 0x6b, 0x5f, 0x74,
+ 0x79, 0x70, 0x65, 0x22, 0x3e, 0x65, 0x6e, 0x64,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x70, 0x6f, 0x73, 0x69, 0x74,
+ 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x30, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69,
+ 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
+ 0x22, 0x47, 0x74, 0x6b, 0x42, 0x6f, 0x78, 0x22,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x62, 0x6f, 0x78,
+ 0x32, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66,
+ 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61,
+ 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x62, 0x6f,
+ 0x72, 0x64, 0x65, 0x72, 0x5f, 0x77, 0x69, 0x64,
+ 0x74, 0x68, 0x22, 0x3e, 0x35, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6f, 0x72, 0x69, 0x65, 0x6e, 0x74, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x76, 0x65, 0x72,
+ 0x74, 0x69, 0x63, 0x61, 0x6c, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x22,
+ 0x3e, 0x31, 0x30, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61,
+ 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x4c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20, 0x69, 0x64,
+ 0x3d, 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x37,
+ 0x31, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66,
+ 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x46, 0x61,
+ 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x61,
+ 0x62, 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72, 0x61,
+ 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62, 0x6c,
+ 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3e,
+ 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x41,
+ 0x64, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x72,
+ 0x61, 0x74, 0x6f, 0x72, 0x20, 0x4c, 0x6f, 0x67,
+ 0x69, 0x6e, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x61, 0x74,
+ 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73,
+ 0x3e, 0x3c, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62,
+ 0x75, 0x74, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74,
+ 0x22, 0x20, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d,
+ 0x22, 0x62, 0x6f, 0x6c, 0x64, 0x22, 0x2f, 0x3e,
+ 0x3c, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
+ 0x74, 0x65, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x22, 0x20,
+ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x31,
+ 0x2e, 0x32, 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x61,
+ 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
+ 0x73, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x65, 0x78, 0x70, 0x61,
+ 0x6e, 0x64, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73,
+ 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x66, 0x69, 0x6c, 0x6c,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f,
+ 0x6e, 0x22, 0x3e, 0x30, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+ 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x61, 0x62,
+ 0x65, 0x6c, 0x31, 0x32, 0x22, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69,
+ 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61,
+ 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22,
+ 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x78, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22,
+ 0x3e, 0x30, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x79, 0x61, 0x6c,
+ 0x69, 0x67, 0x6e, 0x22, 0x3e, 0x30, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20,
+ 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74,
+ 0x61, 0x62, 0x6c, 0x65, 0x3d, 0x22, 0x79, 0x65,
+ 0x73, 0x22, 0x3e, 0x49, 0x6e, 0x20, 0x6f, 0x72,
+ 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x75,
+ 0x73, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x65, 0x72,
+ 0x70, 0x72, 0x69, 0x73, 0x65, 0x20, 0x6c, 0x6f,
+ 0x67, 0x69, 0x6e, 0x73, 0x2c, 0x20, 0x74, 0x68,
+ 0x69, 0x73, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75,
+ 0x74, 0x65, 0x72, 0x20, 0x6e, 0x65, 0x65, 0x64,
+ 0x73, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x0a,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x65, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x64,
+ 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20,
+ 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x2e, 0x20,
+ 0x50, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x20, 0x68,
+ 0x61, 0x76, 0x65, 0x20, 0x79, 0x6f, 0x75, 0x72,
+ 0x20, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,
+ 0x20, 0x61, 0x64, 0x6d, 0x69, 0x6e, 0x69, 0x73,
+ 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x0a, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74,
+ 0x79, 0x70, 0x65, 0x20, 0x74, 0x68, 0x65, 0x69,
+ 0x72, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e,
+ 0x20, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72,
+ 0x64, 0x20, 0x68, 0x65, 0x72, 0x65, 0x2c, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x63, 0x68, 0x6f, 0x6f,
+ 0x73, 0x65, 0x20, 0x61, 0x20, 0x75, 0x6e, 0x69,
+ 0x71, 0x75, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x70,
+ 0x75, 0x74, 0x65, 0x72, 0x0a, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x79, 0x6f,
+ 0x75, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75,
+ 0x74, 0x65, 0x72, 0x2e, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e,
+ 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x22,
+ 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x66, 0x69, 0x6c, 0x6c, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x70, 0x6f,
+ 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3e,
+ 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61,
+ 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f,
+ 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63,
+ 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61,
+ 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x47,
+ 0x72, 0x69, 0x64, 0x22, 0x20, 0x69, 0x64, 0x3d,
+ 0x22, 0x67, 0x72, 0x69, 0x64, 0x31, 0x22, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75,
+ 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6d, 0x61, 0x72, 0x67, 0x69,
+ 0x6e, 0x5f, 0x6c, 0x65, 0x66, 0x74, 0x22, 0x3e,
+ 0x31, 0x32, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x78,
+ 0x70, 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x72, 0x6f, 0x77,
+ 0x5f, 0x73, 0x70, 0x61, 0x63, 0x69, 0x6e, 0x67,
+ 0x22, 0x3e, 0x36, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x6f,
+ 0x6c, 0x75, 0x6d, 0x6e, 0x5f, 0x73, 0x70, 0x61,
+ 0x63, 0x69, 0x6e, 0x67, 0x22, 0x3e, 0x31, 0x32,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
+ 0x22, 0x47, 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65,
+ 0x6c, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x31, 0x33, 0x22, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75,
+ 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x78, 0x61, 0x6c, 0x69, 0x67,
+ 0x6e, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72,
+ 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62,
+ 0x6c, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22,
+ 0x3e, 0x5f, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x75, 0x73, 0x65, 0x5f, 0x75,
+ 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x65,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6d, 0x6e, 0x65, 0x6d, 0x6f, 0x6e, 0x69,
+ 0x63, 0x5f, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74,
+ 0x22, 0x3e, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x64,
+ 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x3c,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x64, 0x69, 0x6d, 0x2d,
+ 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x2f, 0x3e,
+ 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e,
+ 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x30,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x30,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65,
+ 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x4c, 0x61, 0x62,
+ 0x65, 0x6c, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x64, 0x6f, 0x6d,
+ 0x61, 0x69, 0x6e, 0x22, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73,
+ 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e,
+ 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e,
+ 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x74,
+ 0x6f, 0x70, 0x22, 0x3e, 0x35, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x5f, 0x62,
+ 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x22, 0x3e, 0x35,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x78, 0x61, 0x6c, 0x69, 0x67,
+ 0x6e, 0x22, 0x3e, 0x30, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e,
+ 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74,
+ 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74,
+ 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x30, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22,
+ 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69,
+ 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69,
+ 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63,
+ 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d,
+ 0x22, 0x47, 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65,
+ 0x6c, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x31, 0x38, 0x22, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x63, 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75,
+ 0x73, 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x78, 0x61, 0x6c, 0x69, 0x67,
+ 0x6e, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c,
+ 0x61, 0x62, 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72,
+ 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62,
+ 0x6c, 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22,
+ 0x3e, 0x5f, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74,
+ 0x65, 0x72, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x75, 0x73, 0x65,
+ 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69,
+ 0x6e, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6d, 0x6e, 0x65, 0x6d, 0x6f,
+ 0x6e, 0x69, 0x63, 0x5f, 0x77, 0x69, 0x64, 0x67,
+ 0x65, 0x74, 0x22, 0x3e, 0x6a, 0x6f, 0x69, 0x6e,
+ 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65,
+ 0x72, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x73, 0x74, 0x79,
+ 0x6c, 0x65, 0x3e, 0x3c, 0x63, 0x6c, 0x61, 0x73,
+ 0x73, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x64, 0x69, 0x6d, 0x2d, 0x6c, 0x61, 0x62, 0x65,
+ 0x6c, 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x73, 0x74,
+ 0x79, 0x6c, 0x65, 0x3e, 0x3c, 0x2f, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61,
+ 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x65,
+ 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63,
+ 0x68, 0x22, 0x3e, 0x30, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x74,
+ 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61, 0x63,
+ 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x77,
+ 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f,
+ 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e,
+ 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e, 0x3c,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63,
+ 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74,
+ 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x20,
+ 0x69, 0x64, 0x3d, 0x22, 0x6a, 0x6f, 0x69, 0x6e,
+ 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65,
+ 0x72, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66,
+ 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x78,
+ 0x70, 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70,
+ 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c,
+ 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x61,
+ 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74, 0x61,
+ 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e, 0x31,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67, 0x68,
+ 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67,
+ 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x3e,
+ 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x47,
+ 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x22,
+ 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x61, 0x62,
+ 0x65, 0x6c, 0x31, 0x34, 0x22, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76, 0x69,
+ 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63, 0x61,
+ 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x22,
+ 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x78, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x22,
+ 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x61, 0x62,
+ 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72, 0x61, 0x6e,
+ 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62, 0x6c, 0x65,
+ 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3e, 0x41,
+ 0x64, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74, 0x72,
+ 0x61, 0x74, 0x6f, 0x72, 0x20, 0x5f, 0x4e, 0x61,
+ 0x6d, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x75, 0x73, 0x65,
+ 0x5f, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x6c, 0x69,
+ 0x6e, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x6d, 0x6e, 0x65, 0x6d, 0x6f,
+ 0x6e, 0x69, 0x63, 0x5f, 0x77, 0x69, 0x64, 0x67,
+ 0x65, 0x74, 0x22, 0x3e, 0x6a, 0x6f, 0x69, 0x6e,
+ 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x3c,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x64, 0x69, 0x6d, 0x2d,
+ 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x2f, 0x3e,
+ 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e,
+ 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x30,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x32,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65,
+ 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x45, 0x6e, 0x74,
+ 0x72, 0x79, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x6e, 0x61, 0x6d,
+ 0x65, 0x22, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x76, 0x69, 0x73, 0x69, 0x62,
+ 0x6c, 0x65, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x63, 0x61, 0x6e, 0x5f, 0x66,
+ 0x6f, 0x63, 0x75, 0x73, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x78,
+ 0x70, 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x69, 0x6e, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63,
+ 0x68, 0x61, 0x72, 0x22, 0x3e, 0xe2, 0x97, 0x8f,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x69, 0x6e, 0x76, 0x69, 0x73,
+ 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x68, 0x61,
+ 0x72, 0x5f, 0x73, 0x65, 0x74, 0x22, 0x3e, 0x54,
+ 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x2f,
+ 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c,
+ 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e,
+ 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
+ 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61, 0x74, 0x74,
+ 0x61, 0x63, 0x68, 0x22, 0x3e, 0x31, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x74, 0x74,
+ 0x61, 0x63, 0x68, 0x22, 0x3e, 0x32, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x22, 0x3e,
+ 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65, 0x69, 0x67,
+ 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69, 0x6c, 0x64,
+ 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
+ 0x47, 0x74, 0x6b, 0x4c, 0x61, 0x62, 0x65, 0x6c,
+ 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x6c, 0x61,
+ 0x62, 0x65, 0x6c, 0x31, 0x35, 0x22, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63,
+ 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73,
+ 0x22, 0x3e, 0x46, 0x61, 0x6c, 0x73, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x78, 0x61, 0x6c, 0x69, 0x67, 0x6e,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6c, 0x61,
+ 0x62, 0x65, 0x6c, 0x22, 0x20, 0x74, 0x72, 0x61,
+ 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x61, 0x62, 0x6c,
+ 0x65, 0x3d, 0x22, 0x79, 0x65, 0x73, 0x22, 0x3e,
+ 0x41, 0x64, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x74,
+ 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x50, 0x61,
+ 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x75, 0x73, 0x65, 0x5f, 0x75, 0x6e, 0x64,
+ 0x65, 0x72, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x6d,
+ 0x6e, 0x65, 0x6d, 0x6f, 0x6e, 0x69, 0x63, 0x5f,
+ 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x22, 0x3e,
+ 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x73,
+ 0x73, 0x77, 0x6f, 0x72, 0x64, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x3c,
+ 0x63, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x6e, 0x61,
+ 0x6d, 0x65, 0x3d, 0x22, 0x64, 0x69, 0x6d, 0x2d,
+ 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x2f, 0x3e,
+ 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e,
+ 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x30,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x33,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65,
+ 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
+ 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x45, 0x6e, 0x74,
+ 0x72, 0x79, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22,
+ 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x73,
+ 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x3e,
+ 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x63,
+ 0x61, 0x6e, 0x5f, 0x66, 0x6f, 0x63, 0x75, 0x73,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x68, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64,
+ 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d,
+ 0x22, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c,
+ 0x69, 0x74, 0x79, 0x22, 0x3e, 0x46, 0x61, 0x6c,
+ 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x69, 0x6e, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63,
+ 0x68, 0x61, 0x72, 0x22, 0x3e, 0xe2, 0x97, 0x8f,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x61, 0x63, 0x74, 0x69, 0x76,
+ 0x61, 0x74, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x66,
+ 0x61, 0x75, 0x6c, 0x74, 0x22, 0x3e, 0x54, 0x72,
+ 0x75, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x69, 0x6e, 0x76,
+ 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x5f, 0x63,
+ 0x68, 0x61, 0x72, 0x5f, 0x73, 0x65, 0x74, 0x22,
+ 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x3e, 0x3c, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x31,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x74, 0x6f, 0x70, 0x5f, 0x61,
+ 0x74, 0x74, 0x61, 0x63, 0x68, 0x22, 0x3e, 0x33,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68,
+ 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x68, 0x65,
+ 0x69, 0x67, 0x68, 0x74, 0x22, 0x3e, 0x31, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b,
+ 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68,
+ 0x69, 0x6c, 0x64, 0x3e, 0x3c, 0x2f, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61,
+ 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x65, 0x78,
+ 0x70, 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x46, 0x61,
+ 0x6c, 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f,
+ 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20,
+ 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x66, 0x69,
+ 0x6c, 0x6c, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65,
+ 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72,
+ 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x70, 0x6f, 0x73, 0x69, 0x74,
+ 0x69, 0x6f, 0x6e, 0x22, 0x3e, 0x32, 0x3c, 0x2f,
+ 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79,
+ 0x3e, 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69,
+ 0x6e, 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a,
+ 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x70, 0x61, 0x63,
+ 0x6b, 0x69, 0x6e, 0x67, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x65, 0x78, 0x70,
+ 0x61, 0x6e, 0x64, 0x22, 0x3e, 0x46, 0x61, 0x6c,
+ 0x73, 0x65, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x70,
+ 0x65, 0x72, 0x74, 0x79, 0x3e, 0x3c, 0x70, 0x72,
+ 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x20, 0x6e,
+ 0x61, 0x6d, 0x65, 0x3d, 0x22, 0x66, 0x69, 0x6c,
+ 0x6c, 0x22, 0x3e, 0x54, 0x72, 0x75, 0x65, 0x3c,
+ 0x2f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74,
+ 0x79, 0x3e, 0x3c, 0x70, 0x72, 0x6f, 0x70, 0x65,
+ 0x72, 0x74, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65,
+ 0x3d, 0x22, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69,
+ 0x6f, 0x6e, 0x22, 0x3e, 0x31, 0x3c, 0x2f, 0x70,
+ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x3e,
+ 0x3c, 0x2f, 0x70, 0x61, 0x63, 0x6b, 0x69, 0x6e,
+ 0x67, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69, 0x6c,
+ 0x64, 0x3e, 0x3c, 0x2f, 0x6f, 0x62, 0x6a, 0x65,
+ 0x63, 0x74, 0x3e, 0x3c, 0x2f, 0x63, 0x68, 0x69,
+ 0x6c, 0x64, 0x3e, 0x3c, 0x61, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x67, 0x65,
+ 0x74, 0x73, 0x3e, 0x3c, 0x61, 0x63, 0x74, 0x69,
+ 0x6f, 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x67, 0x65,
+ 0x74, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x73, 0x65, 0x3d, 0x22, 0x2d, 0x36, 0x22, 0x3e,
+ 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x31, 0x3c,
+ 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2d,
+ 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x3e, 0x3c,
+ 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x77,
+ 0x69, 0x64, 0x67, 0x65, 0x74, 0x20, 0x72, 0x65,
+ 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x3d, 0x22,
+ 0x2d, 0x35, 0x22, 0x3e, 0x62, 0x75, 0x74, 0x74,
+ 0x6f, 0x6e, 0x32, 0x3c, 0x2f, 0x61, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x67,
+ 0x65, 0x74, 0x3e, 0x3c, 0x2f, 0x61, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x2d, 0x77, 0x69, 0x64, 0x67,
+ 0x65, 0x74, 0x73, 0x3e, 0x3c, 0x2f, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x6f, 0x62,
+ 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6c, 0x61,
+ 0x73, 0x73, 0x3d, 0x22, 0x47, 0x74, 0x6b, 0x4c,
+ 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65,
+ 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x72, 0x65,
+ 0x61, 0x6c, 0x6d, 0x73, 0x5f, 0x6d, 0x6f, 0x64,
+ 0x65, 0x6c, 0x22, 0x3e, 0x3c, 0x63, 0x6f, 0x6c,
+ 0x75, 0x6d, 0x6e, 0x73, 0x3e, 0x3c, 0x21, 0x2d,
+ 0x2d, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e,
+ 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x20, 0x67, 0x63,
+ 0x68, 0x61, 0x72, 0x61, 0x72, 0x72, 0x61, 0x79,
+ 0x20, 0x2d, 0x2d, 0x3e, 0x3c, 0x63, 0x6f, 0x6c,
+ 0x75, 0x6d, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65,
+ 0x3d, 0x22, 0x67, 0x63, 0x68, 0x61, 0x72, 0x61,
+ 0x72, 0x72, 0x61, 0x79, 0x22, 0x2f, 0x3e, 0x3c,
+ 0x21, 0x2d, 0x2d, 0x20, 0x63, 0x6f, 0x6c, 0x75,
+ 0x6d, 0x6e, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x20,
+ 0x67, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20,
+ 0x2d, 0x2d, 0x3e, 0x3c, 0x63, 0x6f, 0x6c, 0x75,
+ 0x6d, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d,
+ 0x22, 0x47, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74,
+ 0x22, 0x2f, 0x3e, 0x3c, 0x2f, 0x63, 0x6f, 0x6c,
+ 0x75, 0x6d, 0x6e, 0x73, 0x3e, 0x3c, 0x2f, 0x6f,
+ 0x62, 0x6a, 0x65, 0x63, 0x74, 0x3e, 0x3c, 0x2f,
+ 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63,
+ 0x65, 0x3e, 0x0a, 0x00, 0x00, 0x28, 0x75, 0x75,
+ 0x61, 0x79, 0x29, 0x67, 0x6e, 0x6f, 0x6d, 0x65,
+ 0x2f, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00
+} };
+
+static GStaticResource static_resource = { password_resource_data.data, sizeof
(password_resource_data.data), NULL, NULL, NULL };
+extern GResource *password_get_resource (void);
+GResource *password_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) {
+ ...
+ }
+
+*/
+
+#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
+
+
+#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);
+}
diff --git a/gnome-initial-setup/pages/password/password-resources.h
b/gnome-initial-setup/pages/password/password-resources.h
new file mode 100644
index 0000000..35aeb8b
--- /dev/null
+++ b/gnome-initial-setup/pages/password/password-resources.h
@@ -0,0 +1,7 @@
+#ifndef __RESOURCE_password_H__
+#define __RESOURCE_password_H__
+
+#include <gio/gio.h>
+
+extern GResource *password_get_resource (void);
+#endif
diff --git a/gnome-initial-setup/pages/password/password.gresource.xml
b/gnome-initial-setup/pages/password/password.gresource.xml
new file mode 100644
index 0000000..9f240b1
--- /dev/null
+++ b/gnome-initial-setup/pages/password/password.gresource.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<gresources>
+ <gresource prefix="/org/gnome/initial-setup">
+ <file preprocess="xml-stripblanks" alias="gis-password-page.ui">gis-password-page.ui</file>
+ <file preprocess="xml-stripblanks" alias="gis-account-page-local.ui">gis-account-page-local.ui</file>
+ <file preprocess="xml-stripblanks"
alias="gis-account-page-enterprise.ui">gis-account-page-enterprise.ui</file>
+ </gresource>
+</gresources>
diff --git a/gnome-initial-setup/pages/account/pw-utils.c b/gnome-initial-setup/pages/password/pw-utils.c
similarity index 100%
rename from gnome-initial-setup/pages/account/pw-utils.c
rename to gnome-initial-setup/pages/password/pw-utils.c
diff --git a/gnome-initial-setup/pages/account/pw-utils.h b/gnome-initial-setup/pages/password/pw-utils.h
similarity index 100%
rename from gnome-initial-setup/pages/account/pw-utils.h
rename to gnome-initial-setup/pages/password/pw-utils.h
diff --git a/gnome-initial-setup/pages/password/um-realm-generated.c
b/gnome-initial-setup/pages/password/um-realm-generated.c
new file mode 100644
index 0000000..4613977
--- /dev/null
+++ b/gnome-initial-setup/pages/password/um-realm-generated.c
@@ -0,0 +1,8713 @@
+/*
+ * Generated by gdbus-codegen 2.39.2. DO NOT EDIT.
+ *
+ * The license of this code is the same as for the source it was derived from.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "um-realm-generated.h"
+
+#include <string.h>
+#ifdef G_OS_UNIX
+# include <gio/gunixfdlist.h>
+#endif
+
+typedef struct
+{
+ GDBusArgInfo parent_struct;
+ gboolean use_gvariant;
+} _ExtendedGDBusArgInfo;
+
+typedef struct
+{
+ GDBusMethodInfo parent_struct;
+ const gchar *signal_name;
+ gboolean pass_fdlist;
+} _ExtendedGDBusMethodInfo;
+
+typedef struct
+{
+ GDBusSignalInfo parent_struct;
+ const gchar *signal_name;
+} _ExtendedGDBusSignalInfo;
+
+typedef struct
+{
+ GDBusPropertyInfo parent_struct;
+ const gchar *hyphen_name;
+ gboolean use_gvariant;
+} _ExtendedGDBusPropertyInfo;
+
+typedef struct
+{
+ GDBusInterfaceInfo parent_struct;
+ const gchar *hyphen_name;
+} _ExtendedGDBusInterfaceInfo;
+
+typedef struct
+{
+ const _ExtendedGDBusPropertyInfo *info;
+ guint prop_id;
+ GValue orig_value; /* the value before the change */
+} ChangedProperty;
+
+static void
+_changed_property_free (ChangedProperty *data)
+{
+ g_value_unset (&data->orig_value);
+ g_free (data);
+}
+
+static gboolean
+_g_strv_equal0 (gchar **a, gchar **b)
+{
+ gboolean ret = FALSE;
+ guint n;
+ if (a == NULL && b == NULL)
+ {
+ ret = TRUE;
+ goto out;
+ }
+ if (a == NULL || b == NULL)
+ goto out;
+ if (g_strv_length (a) != g_strv_length (b))
+ goto out;
+ for (n = 0; a[n] != NULL; n++)
+ if (g_strcmp0 (a[n], b[n]) != 0)
+ goto out;
+ ret = TRUE;
+out:
+ return ret;
+}
+
+static gboolean
+_g_variant_equal0 (GVariant *a, GVariant *b)
+{
+ gboolean ret = FALSE;
+ if (a == NULL && b == NULL)
+ {
+ ret = TRUE;
+ goto out;
+ }
+ if (a == NULL || b == NULL)
+ goto out;
+ ret = g_variant_equal (a, b);
+out:
+ return ret;
+}
+
+G_GNUC_UNUSED static gboolean
+_g_value_equal (const GValue *a, const GValue *b)
+{
+ gboolean ret = FALSE;
+ g_assert (G_VALUE_TYPE (a) == G_VALUE_TYPE (b));
+ switch (G_VALUE_TYPE (a))
+ {
+ case G_TYPE_BOOLEAN:
+ ret = (g_value_get_boolean (a) == g_value_get_boolean (b));
+ break;
+ case G_TYPE_UCHAR:
+ ret = (g_value_get_uchar (a) == g_value_get_uchar (b));
+ break;
+ case G_TYPE_INT:
+ ret = (g_value_get_int (a) == g_value_get_int (b));
+ break;
+ case G_TYPE_UINT:
+ ret = (g_value_get_uint (a) == g_value_get_uint (b));
+ break;
+ case G_TYPE_INT64:
+ ret = (g_value_get_int64 (a) == g_value_get_int64 (b));
+ break;
+ case G_TYPE_UINT64:
+ ret = (g_value_get_uint64 (a) == g_value_get_uint64 (b));
+ break;
+ case G_TYPE_DOUBLE:
+ {
+ /* Avoid -Wfloat-equal warnings by doing a direct bit compare */
+ gdouble da = g_value_get_double (a);
+ gdouble db = g_value_get_double (b);
+ ret = memcmp (&da, &db, sizeof (gdouble)) == 0;
+ }
+ break;
+ case G_TYPE_STRING:
+ ret = (g_strcmp0 (g_value_get_string (a), g_value_get_string (b)) == 0);
+ break;
+ case G_TYPE_VARIANT:
+ ret = _g_variant_equal0 (g_value_get_variant (a), g_value_get_variant (b));
+ break;
+ default:
+ if (G_VALUE_TYPE (a) == G_TYPE_STRV)
+ ret = _g_strv_equal0 (g_value_get_boxed (a), g_value_get_boxed (b));
+ else
+ g_critical ("_g_value_equal() does not handle type %s", g_type_name (G_VALUE_TYPE (a)));
+ break;
+ }
+ return ret;
+}
+
+/* ------------------------------------------------------------------------
+ * Code for interface org.freedesktop.realmd.Provider
+ * ------------------------------------------------------------------------
+ */
+
+/**
+ * SECTION:UmRealmProvider
+ * @title: UmRealmProvider
+ * @short_description: Generated C code for the org.freedesktop.realmd.Provider D-Bus interface
+ *
+ * This section contains code for working with the <link
linkend="gdbus-interface-org-freedesktop-realmd-Provider.top_of_page">org.freedesktop.realmd.Provider</link>
D-Bus interface in C.
+ */
+
+/* ---- Introspection data for org.freedesktop.realmd.Provider ---- */
+
+static const _ExtendedGDBusArgInfo _um_realm_provider_method_info_discover_IN_ARG_string =
+{
+ {
+ -1,
+ (gchar *) "string",
+ (gchar *) "s",
+ NULL
+ },
+ FALSE
+};
+
+static const _ExtendedGDBusArgInfo _um_realm_provider_method_info_discover_IN_ARG_options =
+{
+ {
+ -1,
+ (gchar *) "options",
+ (gchar *) "a{sv}",
+ NULL
+ },
+ FALSE
+};
+
+static const _ExtendedGDBusArgInfo * const _um_realm_provider_method_info_discover_IN_ARG_pointers[] =
+{
+ &_um_realm_provider_method_info_discover_IN_ARG_string,
+ &_um_realm_provider_method_info_discover_IN_ARG_options,
+ NULL
+};
+
+static const _ExtendedGDBusArgInfo _um_realm_provider_method_info_discover_OUT_ARG_relevance =
+{
+ {
+ -1,
+ (gchar *) "relevance",
+ (gchar *) "i",
+ NULL
+ },
+ FALSE
+};
+
+static const _ExtendedGDBusArgInfo _um_realm_provider_method_info_discover_OUT_ARG_realm =
+{
+ {
+ -1,
+ (gchar *) "realm",
+ (gchar *) "ao",
+ NULL
+ },
+ FALSE
+};
+
+static const _ExtendedGDBusArgInfo * const _um_realm_provider_method_info_discover_OUT_ARG_pointers[] =
+{
+ &_um_realm_provider_method_info_discover_OUT_ARG_relevance,
+ &_um_realm_provider_method_info_discover_OUT_ARG_realm,
+ NULL
+};
+
+static const _ExtendedGDBusMethodInfo _um_realm_provider_method_info_discover =
+{
+ {
+ -1,
+ (gchar *) "Discover",
+ (GDBusArgInfo **) &_um_realm_provider_method_info_discover_IN_ARG_pointers,
+ (GDBusArgInfo **) &_um_realm_provider_method_info_discover_OUT_ARG_pointers,
+ NULL
+ },
+ "handle-discover",
+ FALSE
+};
+
+static const _ExtendedGDBusMethodInfo * const _um_realm_provider_method_info_pointers[] =
+{
+ &_um_realm_provider_method_info_discover,
+ NULL
+};
+
+static const _ExtendedGDBusPropertyInfo _um_realm_provider_property_info_name =
+{
+ {
+ -1,
+ (gchar *) "Name",
+ (gchar *) "s",
+ G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+ NULL
+ },
+ "name",
+ FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _um_realm_provider_property_info_version =
+{
+ {
+ -1,
+ (gchar *) "Version",
+ (gchar *) "s",
+ G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+ NULL
+ },
+ "version",
+ FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _um_realm_provider_property_info_realms =
+{
+ {
+ -1,
+ (gchar *) "Realms",
+ (gchar *) "ao",
+ G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+ NULL
+ },
+ "realms",
+ FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo * const _um_realm_provider_property_info_pointers[] =
+{
+ &_um_realm_provider_property_info_name,
+ &_um_realm_provider_property_info_version,
+ &_um_realm_provider_property_info_realms,
+ NULL
+};
+
+static const _ExtendedGDBusInterfaceInfo _um_realm_provider_interface_info =
+{
+ {
+ -1,
+ (gchar *) "org.freedesktop.realmd.Provider",
+ (GDBusMethodInfo **) &_um_realm_provider_method_info_pointers,
+ NULL,
+ (GDBusPropertyInfo **) &_um_realm_provider_property_info_pointers,
+ NULL
+ },
+ "provider",
+};
+
+
+/**
+ * um_realm_provider_interface_info:
+ *
+ * Gets a machine-readable description of the <link
linkend="gdbus-interface-org-freedesktop-realmd-Provider.top_of_page">org.freedesktop.realmd.Provider</link>
D-Bus interface.
+ *
+ * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free.
+ */
+GDBusInterfaceInfo *
+um_realm_provider_interface_info (void)
+{
+ return (GDBusInterfaceInfo *) &_um_realm_provider_interface_info.parent_struct;
+}
+
+/**
+ * um_realm_provider_override_properties:
+ * @klass: The class structure for a #GObject<!-- -->-derived class.
+ * @property_id_begin: The property id to assign to the first overridden property.
+ *
+ * Overrides all #GObject properties in the #UmRealmProvider interface for a concrete class.
+ * The properties are overridden in the order they are defined.
+ *
+ * Returns: The last property id.
+ */
+guint
+um_realm_provider_override_properties (GObjectClass *klass, guint property_id_begin)
+{
+ g_object_class_override_property (klass, property_id_begin++, "name");
+ g_object_class_override_property (klass, property_id_begin++, "version");
+ g_object_class_override_property (klass, property_id_begin++, "realms");
+ return property_id_begin - 1;
+}
+
+
+
+/**
+ * UmRealmProvider:
+ *
+ * Abstract interface type for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Provider.top_of_page">org.freedesktop.realmd.Provider</link>.
+ */
+
+/**
+ * UmRealmProviderIface:
+ * @parent_iface: The parent interface.
+ * @handle_discover: Handler for the #UmRealmProvider::handle-discover signal.
+ * @get_name: Getter for the #UmRealmProvider:name property.
+ * @get_realms: Getter for the #UmRealmProvider:realms property.
+ * @get_version: Getter for the #UmRealmProvider:version property.
+ *
+ * Virtual table for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Provider.top_of_page">org.freedesktop.realmd.Provider</link>.
+ */
+
+typedef UmRealmProviderIface UmRealmProviderInterface;
+G_DEFINE_INTERFACE (UmRealmProvider, um_realm_provider, G_TYPE_OBJECT);
+
+static void
+um_realm_provider_default_init (UmRealmProviderIface *iface)
+{
+ /* GObject signals for incoming D-Bus method calls: */
+ /**
+ * UmRealmProvider::handle-discover:
+ * @object: A #UmRealmProvider.
+ * @invocation: A #GDBusMethodInvocation.
+ * @arg_string: Argument passed by remote caller.
+ * @arg_options: Argument passed by remote caller.
+ *
+ * Signal emitted when a remote caller is invoking the <link
linkend="gdbus-method-org-freedesktop-realmd-Provider.Discover">Discover()</link> D-Bus method.
+ *
+ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a
reference to @invocation and eventually call um_realm_provider_complete_discover() or e.g.
g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler
handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+ *
+ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+ */
+ g_signal_new ("handle-discover",
+ G_TYPE_FROM_INTERFACE (iface),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (UmRealmProviderIface, handle_discover),
+ g_signal_accumulator_true_handled,
+ NULL,
+ g_cclosure_marshal_generic,
+ G_TYPE_BOOLEAN,
+ 3,
+ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_VARIANT);
+
+ /* GObject properties for D-Bus properties: */
+ /**
+ * UmRealmProvider:name:
+ *
+ * Represents the D-Bus property <link
linkend="gdbus-property-org-freedesktop-realmd-Provider.Name">"Name"</link>.
+ *
+ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to
read from it on both the client- and service-side. It is only meaningful, however, to write to it on the
service-side.
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_string ("name", "Name", "Name", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * UmRealmProvider:version:
+ *
+ * Represents the D-Bus property <link
linkend="gdbus-property-org-freedesktop-realmd-Provider.Version">"Version"</link>.
+ *
+ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to
read from it on both the client- and service-side. It is only meaningful, however, to write to it on the
service-side.
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_string ("version", "Version", "Version", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * UmRealmProvider:realms:
+ *
+ * Represents the D-Bus property <link
linkend="gdbus-property-org-freedesktop-realmd-Provider.Realms">"Realms"</link>.
+ *
+ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to
read from it on both the client- and service-side. It is only meaningful, however, to write to it on the
service-side.
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_boxed ("realms", "Realms", "Realms", G_TYPE_STRV, G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
+}
+
+/**
+ * um_realm_provider_get_name: (skip)
+ * @object: A #UmRealmProvider.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-freedesktop-realmd-Provider.Name">"Name"</link>
D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * <warning>The returned value is only valid until the property changes so on the client-side it is only
safe to use this function on the thread where @object was constructed. Use um_realm_provider_dup_name() if on
another thread.</warning>
+ *
+ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the
returned value, it belongs to @object.
+ */
+const gchar *
+um_realm_provider_get_name (UmRealmProvider *object)
+{
+ return UM_REALM_PROVIDER_GET_IFACE (object)->get_name (object);
+}
+
+/**
+ * um_realm_provider_dup_name: (skip)
+ * @object: A #UmRealmProvider.
+ *
+ * Gets a copy of the <link linkend="gdbus-property-org-freedesktop-realmd-Provider.Name">"Name"</link>
D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value
should be freed with g_free().
+ */
+gchar *
+um_realm_provider_dup_name (UmRealmProvider *object)
+{
+ gchar *value;
+ g_object_get (G_OBJECT (object), "name", &value, NULL);
+ return value;
+}
+
+/**
+ * um_realm_provider_set_name: (skip)
+ * @object: A #UmRealmProvider.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-freedesktop-realmd-Provider.Name">"Name"</link> D-Bus property
to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+um_realm_provider_set_name (UmRealmProvider *object, const gchar *value)
+{
+ g_object_set (G_OBJECT (object), "name", value, NULL);
+}
+
+/**
+ * um_realm_provider_get_version: (skip)
+ * @object: A #UmRealmProvider.
+ *
+ * Gets the value of the <link
linkend="gdbus-property-org-freedesktop-realmd-Provider.Version">"Version"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * <warning>The returned value is only valid until the property changes so on the client-side it is only
safe to use this function on the thread where @object was constructed. Use um_realm_provider_dup_version() if
on another thread.</warning>
+ *
+ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the
returned value, it belongs to @object.
+ */
+const gchar *
+um_realm_provider_get_version (UmRealmProvider *object)
+{
+ return UM_REALM_PROVIDER_GET_IFACE (object)->get_version (object);
+}
+
+/**
+ * um_realm_provider_dup_version: (skip)
+ * @object: A #UmRealmProvider.
+ *
+ * Gets a copy of the <link
linkend="gdbus-property-org-freedesktop-realmd-Provider.Version">"Version"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value
should be freed with g_free().
+ */
+gchar *
+um_realm_provider_dup_version (UmRealmProvider *object)
+{
+ gchar *value;
+ g_object_get (G_OBJECT (object), "version", &value, NULL);
+ return value;
+}
+
+/**
+ * um_realm_provider_set_version: (skip)
+ * @object: A #UmRealmProvider.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-freedesktop-realmd-Provider.Version">"Version"</link> D-Bus
property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+um_realm_provider_set_version (UmRealmProvider *object, const gchar *value)
+{
+ g_object_set (G_OBJECT (object), "version", value, NULL);
+}
+
+/**
+ * um_realm_provider_get_realms: (skip)
+ * @object: A #UmRealmProvider.
+ *
+ * Gets the value of the <link
linkend="gdbus-property-org-freedesktop-realmd-Provider.Realms">"Realms"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * <warning>The returned value is only valid until the property changes so on the client-side it is only
safe to use this function on the thread where @object was constructed. Use um_realm_provider_dup_realms() if
on another thread.</warning>
+ *
+ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the
returned value, it belongs to @object.
+ */
+const gchar *const *
+um_realm_provider_get_realms (UmRealmProvider *object)
+{
+ return UM_REALM_PROVIDER_GET_IFACE (object)->get_realms (object);
+}
+
+/**
+ * um_realm_provider_dup_realms: (skip)
+ * @object: A #UmRealmProvider.
+ *
+ * Gets a copy of the <link linkend="gdbus-property-org-freedesktop-realmd-Provider.Realms">"Realms"</link>
D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value
should be freed with g_strfreev().
+ */
+gchar **
+um_realm_provider_dup_realms (UmRealmProvider *object)
+{
+ gchar **value;
+ g_object_get (G_OBJECT (object), "realms", &value, NULL);
+ return value;
+}
+
+/**
+ * um_realm_provider_set_realms: (skip)
+ * @object: A #UmRealmProvider.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-freedesktop-realmd-Provider.Realms">"Realms"</link> D-Bus
property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+um_realm_provider_set_realms (UmRealmProvider *object, const gchar *const *value)
+{
+ g_object_set (G_OBJECT (object), "realms", value, NULL);
+}
+
+/**
+ * um_realm_provider_call_discover:
+ * @proxy: A #UmRealmProviderProxy.
+ * @arg_string: Argument to pass with the method invocation.
+ * @arg_options: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link
linkend="gdbus-method-org-freedesktop-realmd-Provider.Discover">Discover()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling
this method from.
+ * You can then call um_realm_provider_call_discover_finish() to get the result of the operation.
+ *
+ * See um_realm_provider_call_discover_sync() for the synchronous, blocking version of this method.
+ */
+void
+um_realm_provider_call_discover (
+ UmRealmProvider *proxy,
+ const gchar *arg_string,
+ GVariant *arg_options,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+ "Discover",
+ g_variant_new ("(s a{sv})",
+ arg_string,
+ arg_options),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ cancellable,
+ callback,
+ user_data);
+}
+
+/**
+ * um_realm_provider_call_discover_finish:
+ * @proxy: A #UmRealmProviderProxy.
+ * @out_relevance: (out): Return location for return parameter or %NULL to ignore.
+ * @out_realm: (out): Return location for return parameter or %NULL to ignore.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to
um_realm_provider_call_discover().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with um_realm_provider_call_discover().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+um_realm_provider_call_discover_finish (
+ UmRealmProvider *proxy,
+ gint *out_relevance,
+ gchar ***out_realm,
+ GAsyncResult *res,
+ GError **error)
+{
+ GVariant *_ret;
+ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+ if (_ret == NULL)
+ goto _out;
+ g_variant_get (_ret,
+ "(i^ao)",
+ out_relevance,
+ out_realm);
+ g_variant_unref (_ret);
+_out:
+ return _ret != NULL;
+}
+
+/**
+ * um_realm_provider_call_discover_sync:
+ * @proxy: A #UmRealmProviderProxy.
+ * @arg_string: Argument to pass with the method invocation.
+ * @arg_options: Argument to pass with the method invocation.
+ * @out_relevance: (out): Return location for return parameter or %NULL to ignore.
+ * @out_realm: (out): Return location for return parameter or %NULL to ignore.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link
linkend="gdbus-method-org-freedesktop-realmd-Provider.Discover">Discover()</link> D-Bus method on @proxy. The
calling thread is blocked until a reply is received.
+ *
+ * See um_realm_provider_call_discover() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+um_realm_provider_call_discover_sync (
+ UmRealmProvider *proxy,
+ const gchar *arg_string,
+ GVariant *arg_options,
+ gint *out_relevance,
+ gchar ***out_realm,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GVariant *_ret;
+ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+ "Discover",
+ g_variant_new ("(s a{sv})",
+ arg_string,
+ arg_options),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ cancellable,
+ error);
+ if (_ret == NULL)
+ goto _out;
+ g_variant_get (_ret,
+ "(i^ao)",
+ out_relevance,
+ out_realm);
+ g_variant_unref (_ret);
+_out:
+ return _ret != NULL;
+}
+
+/**
+ * um_realm_provider_complete_discover:
+ * @object: A #UmRealmProvider.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ * @relevance: Parameter to return.
+ * @realm: Parameter to return.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link
linkend="gdbus-method-org-freedesktop-realmd-Provider.Discover">Discover()</link> D-Bus method. If you
instead want to finish handling an invocation by returning an error, use
g_dbus_method_invocation_return_error() or similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+um_realm_provider_complete_discover (
+ UmRealmProvider *object,
+ GDBusMethodInvocation *invocation,
+ gint relevance,
+ const gchar *const *realm)
+{
+ g_dbus_method_invocation_return_value (invocation,
+ g_variant_new ("(i^ao)",
+ relevance,
+ realm));
+}
+
+/* ------------------------------------------------------------------------ */
+
+/**
+ * UmRealmProviderProxy:
+ *
+ * The #UmRealmProviderProxy structure contains only private data and should only be accessed using the
provided API.
+ */
+
+/**
+ * UmRealmProviderProxyClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #UmRealmProviderProxy.
+ */
+
+struct _UmRealmProviderProxyPrivate
+{
+ GData *qdata;
+};
+
+static void um_realm_provider_proxy_iface_init (UmRealmProviderIface *iface);
+
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+G_DEFINE_TYPE_WITH_CODE (UmRealmProviderProxy, um_realm_provider_proxy, G_TYPE_DBUS_PROXY,
+ G_ADD_PRIVATE (UmRealmProviderProxy)
+ G_IMPLEMENT_INTERFACE (UM_REALM_TYPE_PROVIDER, um_realm_provider_proxy_iface_init));
+
+#else
+G_DEFINE_TYPE_WITH_CODE (UmRealmProviderProxy, um_realm_provider_proxy, G_TYPE_DBUS_PROXY,
+ G_IMPLEMENT_INTERFACE (UM_REALM_TYPE_PROVIDER, um_realm_provider_proxy_iface_init));
+
+#endif
+static void
+um_realm_provider_proxy_finalize (GObject *object)
+{
+ UmRealmProviderProxy *proxy = UM_REALM_PROVIDER_PROXY (object);
+ g_datalist_clear (&proxy->priv->qdata);
+ G_OBJECT_CLASS (um_realm_provider_proxy_parent_class)->finalize (object);
+}
+
+static void
+um_realm_provider_proxy_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec G_GNUC_UNUSED)
+{
+ const _ExtendedGDBusPropertyInfo *info;
+ GVariant *variant;
+ g_assert (prop_id != 0 && prop_id - 1 < 3);
+ info = _um_realm_provider_property_info_pointers[prop_id - 1];
+ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (object), info->parent_struct.name);
+ if (info->use_gvariant)
+ {
+ g_value_set_variant (value, variant);
+ }
+ else
+ {
+ if (variant != NULL)
+ g_dbus_gvariant_to_gvalue (variant, value);
+ }
+ if (variant != NULL)
+ g_variant_unref (variant);
+}
+
+static void
+um_realm_provider_proxy_set_property_cb (GDBusProxy *proxy,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ const _ExtendedGDBusPropertyInfo *info = user_data;
+ GError *error;
+ GVariant *_ret;
+ error = NULL;
+ _ret = g_dbus_proxy_call_finish (proxy, res, &error);
+ if (!_ret)
+ {
+ g_warning ("Error setting property '%s' on interface org.freedesktop.realmd.Provider: %s (%s, %d)",
+ info->parent_struct.name,
+ error->message, g_quark_to_string (error->domain), error->code);
+ g_error_free (error);
+ }
+ else
+ {
+ g_variant_unref (_ret);
+ }
+}
+
+static void
+um_realm_provider_proxy_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec G_GNUC_UNUSED)
+{
+ const _ExtendedGDBusPropertyInfo *info;
+ GVariant *variant;
+ g_assert (prop_id != 0 && prop_id - 1 < 3);
+ info = _um_realm_provider_property_info_pointers[prop_id - 1];
+ variant = g_dbus_gvalue_to_gvariant (value, G_VARIANT_TYPE (info->parent_struct.signature));
+ g_dbus_proxy_call (G_DBUS_PROXY (object),
+ "org.freedesktop.DBus.Properties.Set",
+ g_variant_new ("(ssv)", "org.freedesktop.realmd.Provider", info->parent_struct.name, variant),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL, (GAsyncReadyCallback) um_realm_provider_proxy_set_property_cb, (GDBusPropertyInfo *)
&info->parent_struct);
+ g_variant_unref (variant);
+}
+
+static void
+um_realm_provider_proxy_g_signal (GDBusProxy *proxy,
+ const gchar *sender_name G_GNUC_UNUSED,
+ const gchar *signal_name,
+ GVariant *parameters)
+{
+ _ExtendedGDBusSignalInfo *info;
+ GVariantIter iter;
+ GVariant *child;
+ GValue *paramv;
+ guint num_params;
+ guint n;
+ guint signal_id;
+ info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *)
&_um_realm_provider_interface_info.parent_struct, signal_name);
+ if (info == NULL)
+ return;
+ num_params = g_variant_n_children (parameters);
+ paramv = g_new0 (GValue, num_params + 1);
+ g_value_init (¶mv[0], UM_REALM_TYPE_PROVIDER);
+ g_value_set_object (¶mv[0], proxy);
+ g_variant_iter_init (&iter, parameters);
+ n = 1;
+ while ((child = g_variant_iter_next_value (&iter)) != NULL)
+ {
+ _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1];
+ if (arg_info->use_gvariant)
+ {
+ g_value_init (¶mv[n], G_TYPE_VARIANT);
+ g_value_set_variant (¶mv[n], child);
+ n++;
+ }
+ else
+ g_dbus_gvariant_to_gvalue (child, ¶mv[n++]);
+ g_variant_unref (child);
+ }
+ signal_id = g_signal_lookup (info->signal_name, UM_REALM_TYPE_PROVIDER);
+ g_signal_emitv (paramv, signal_id, 0, NULL);
+ for (n = 0; n < num_params + 1; n++)
+ g_value_unset (¶mv[n]);
+ g_free (paramv);
+}
+
+static void
+um_realm_provider_proxy_g_properties_changed (GDBusProxy *_proxy,
+ GVariant *changed_properties,
+ const gchar *const *invalidated_properties)
+{
+ UmRealmProviderProxy *proxy = UM_REALM_PROVIDER_PROXY (_proxy);
+ guint n;
+ const gchar *key;
+ GVariantIter *iter;
+ _ExtendedGDBusPropertyInfo *info;
+ g_variant_get (changed_properties, "a{sv}", &iter);
+ while (g_variant_iter_next (iter, "{&sv}", &key, NULL))
+ {
+ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *)
&_um_realm_provider_interface_info.parent_struct, key);
+ g_datalist_remove_data (&proxy->priv->qdata, key);
+ if (info != NULL)
+ g_object_notify (G_OBJECT (proxy), info->hyphen_name);
+ }
+ g_variant_iter_free (iter);
+ for (n = 0; invalidated_properties[n] != NULL; n++)
+ {
+ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *)
&_um_realm_provider_interface_info.parent_struct, invalidated_properties[n]);
+ g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]);
+ if (info != NULL)
+ g_object_notify (G_OBJECT (proxy), info->hyphen_name);
+ }
+}
+
+static const gchar *
+um_realm_provider_proxy_get_name (UmRealmProvider *object)
+{
+ UmRealmProviderProxy *proxy = UM_REALM_PROVIDER_PROXY (object);
+ GVariant *variant;
+ const gchar *value = NULL;
+ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Name");
+ if (variant != NULL)
+ {
+ value = g_variant_get_string (variant, NULL);
+ g_variant_unref (variant);
+ }
+ return value;
+}
+
+static const gchar *
+um_realm_provider_proxy_get_version (UmRealmProvider *object)
+{
+ UmRealmProviderProxy *proxy = UM_REALM_PROVIDER_PROXY (object);
+ GVariant *variant;
+ const gchar *value = NULL;
+ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Version");
+ if (variant != NULL)
+ {
+ value = g_variant_get_string (variant, NULL);
+ g_variant_unref (variant);
+ }
+ return value;
+}
+
+static const gchar *const *
+um_realm_provider_proxy_get_realms (UmRealmProvider *object)
+{
+ UmRealmProviderProxy *proxy = UM_REALM_PROVIDER_PROXY (object);
+ GVariant *variant;
+ const gchar *const *value = NULL;
+ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Realms");
+ if (variant != NULL)
+ {
+ value = g_variant_get_objv (variant, NULL);
+ g_variant_unref (variant);
+ }
+ return value;
+}
+
+static void
+um_realm_provider_proxy_init (UmRealmProviderProxy *proxy)
+{
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+ proxy->priv = um_realm_provider_proxy_get_instance_private (proxy);
+#else
+ proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, UM_REALM_TYPE_PROVIDER_PROXY,
UmRealmProviderProxyPrivate);
+#endif
+
+ g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), um_realm_provider_interface_info ());
+}
+
+static void
+um_realm_provider_proxy_class_init (UmRealmProviderProxyClass *klass)
+{
+ GObjectClass *gobject_class;
+ GDBusProxyClass *proxy_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gobject_class->finalize = um_realm_provider_proxy_finalize;
+ gobject_class->get_property = um_realm_provider_proxy_get_property;
+ gobject_class->set_property = um_realm_provider_proxy_set_property;
+
+ proxy_class = G_DBUS_PROXY_CLASS (klass);
+ proxy_class->g_signal = um_realm_provider_proxy_g_signal;
+ proxy_class->g_properties_changed = um_realm_provider_proxy_g_properties_changed;
+
+ um_realm_provider_override_properties (gobject_class, 1);
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+ g_type_class_add_private (klass, sizeof (UmRealmProviderProxyPrivate));
+#endif
+}
+
+static void
+um_realm_provider_proxy_iface_init (UmRealmProviderIface *iface)
+{
+ iface->get_name = um_realm_provider_proxy_get_name;
+ iface->get_version = um_realm_provider_proxy_get_version;
+ iface->get_realms = um_realm_provider_proxy_get_realms;
+}
+
+/**
+ * um_realm_provider_proxy_new:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus
connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously creates a proxy for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Provider.top_of_page">org.freedesktop.realmd.Provider</link>.
See g_dbus_proxy_new() for more details.
+ *
+ * When the operation is finished, @callback will be invoked in the <link
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling
this method from.
+ * You can then call um_realm_provider_proxy_new_finish() to get the result of the operation.
+ *
+ * See um_realm_provider_proxy_new_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+um_realm_provider_proxy_new (
+ GDBusConnection *connection,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_async_initable_new_async (UM_REALM_TYPE_PROVIDER_PROXY, G_PRIORITY_DEFAULT, cancellable, callback,
user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path,
"g-interface-name", "org.freedesktop.realmd.Provider", NULL);
+}
+
+/**
+ * um_realm_provider_proxy_new_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to um_realm_provider_proxy_new().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with um_realm_provider_proxy_new().
+ *
+ * Returns: (transfer full) (type UmRealmProviderProxy): The constructed proxy object or %NULL if @error is
set.
+ */
+UmRealmProvider *
+um_realm_provider_proxy_new_finish (
+ GAsyncResult *res,
+ GError **error)
+{
+ GObject *ret;
+ GObject *source_object;
+ source_object = g_async_result_get_source_object (res);
+ ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+ g_object_unref (source_object);
+ if (ret != NULL)
+ return UM_REALM_PROVIDER (ret);
+ else
+ return NULL;
+}
+
+/**
+ * um_realm_provider_proxy_new_sync:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus
connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Synchronously creates a proxy for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Provider.top_of_page">org.freedesktop.realmd.Provider</link>.
See g_dbus_proxy_new_sync() for more details.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See um_realm_provider_proxy_new() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type UmRealmProviderProxy): The constructed proxy object or %NULL if @error is
set.
+ */
+UmRealmProvider *
+um_realm_provider_proxy_new_sync (
+ GDBusConnection *connection,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GInitable *ret;
+ ret = g_initable_new (UM_REALM_TYPE_PROVIDER_PROXY, cancellable, error, "g-flags", flags, "g-name", name,
"g-connection", connection, "g-object-path", object_path, "g-interface-name",
"org.freedesktop.realmd.Provider", NULL);
+ if (ret != NULL)
+ return UM_REALM_PROVIDER (ret);
+ else
+ return NULL;
+}
+
+
+/**
+ * um_realm_provider_proxy_new_for_bus:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Like um_realm_provider_proxy_new() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * When the operation is finished, @callback will be invoked in the <link
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling
this method from.
+ * You can then call um_realm_provider_proxy_new_for_bus_finish() to get the result of the operation.
+ *
+ * See um_realm_provider_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+um_realm_provider_proxy_new_for_bus (
+ GBusType bus_type,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_async_initable_new_async (UM_REALM_TYPE_PROVIDER_PROXY, G_PRIORITY_DEFAULT, cancellable, callback,
user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path,
"g-interface-name", "org.freedesktop.realmd.Provider", NULL);
+}
+
+/**
+ * um_realm_provider_proxy_new_for_bus_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to
um_realm_provider_proxy_new_for_bus().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with um_realm_provider_proxy_new_for_bus().
+ *
+ * Returns: (transfer full) (type UmRealmProviderProxy): The constructed proxy object or %NULL if @error is
set.
+ */
+UmRealmProvider *
+um_realm_provider_proxy_new_for_bus_finish (
+ GAsyncResult *res,
+ GError **error)
+{
+ GObject *ret;
+ GObject *source_object;
+ source_object = g_async_result_get_source_object (res);
+ ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+ g_object_unref (source_object);
+ if (ret != NULL)
+ return UM_REALM_PROVIDER (ret);
+ else
+ return NULL;
+}
+
+/**
+ * um_realm_provider_proxy_new_for_bus_sync:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Like um_realm_provider_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See um_realm_provider_proxy_new_for_bus() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type UmRealmProviderProxy): The constructed proxy object or %NULL if @error is
set.
+ */
+UmRealmProvider *
+um_realm_provider_proxy_new_for_bus_sync (
+ GBusType bus_type,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GInitable *ret;
+ ret = g_initable_new (UM_REALM_TYPE_PROVIDER_PROXY, cancellable, error, "g-flags", flags, "g-name", name,
"g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.freedesktop.realmd.Provider",
NULL);
+ if (ret != NULL)
+ return UM_REALM_PROVIDER (ret);
+ else
+ return NULL;
+}
+
+
+/* ------------------------------------------------------------------------ */
+
+/**
+ * UmRealmProviderSkeleton:
+ *
+ * The #UmRealmProviderSkeleton structure contains only private data and should only be accessed using the
provided API.
+ */
+
+/**
+ * UmRealmProviderSkeletonClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #UmRealmProviderSkeleton.
+ */
+
+struct _UmRealmProviderSkeletonPrivate
+{
+ GValue *properties;
+ GList *changed_properties;
+ GSource *changed_properties_idle_source;
+ GMainContext *context;
+ GMutex lock;
+};
+
+static void
+_um_realm_provider_skeleton_handle_method_call (
+ GDBusConnection *connection G_GNUC_UNUSED,
+ const gchar *sender G_GNUC_UNUSED,
+ const gchar *object_path G_GNUC_UNUSED,
+ const gchar *interface_name,
+ const gchar *method_name,
+ GVariant *parameters,
+ GDBusMethodInvocation *invocation,
+ gpointer user_data)
+{
+ UmRealmProviderSkeleton *skeleton = UM_REALM_PROVIDER_SKELETON (user_data);
+ _ExtendedGDBusMethodInfo *info;
+ GVariantIter iter;
+ GVariant *child;
+ GValue *paramv;
+ guint num_params;
+ guint num_extra;
+ guint n;
+ guint signal_id;
+ GValue return_value = G_VALUE_INIT;
+ info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation);
+ g_assert (info != NULL);
+ num_params = g_variant_n_children (parameters);
+ num_extra = info->pass_fdlist ? 3 : 2; paramv = g_new0 (GValue, num_params + num_extra);
+ n = 0;
+ g_value_init (¶mv[n], UM_REALM_TYPE_PROVIDER);
+ g_value_set_object (¶mv[n++], skeleton);
+ g_value_init (¶mv[n], G_TYPE_DBUS_METHOD_INVOCATION);
+ g_value_set_object (¶mv[n++], invocation);
+ if (info->pass_fdlist)
+ {
+#ifdef G_OS_UNIX
+ g_value_init (¶mv[n], G_TYPE_UNIX_FD_LIST);
+ g_value_set_object (¶mv[n++], g_dbus_message_get_unix_fd_list
(g_dbus_method_invocation_get_message (invocation)));
+#else
+ g_assert_not_reached ();
+#endif
+ }
+ g_variant_iter_init (&iter, parameters);
+ while ((child = g_variant_iter_next_value (&iter)) != NULL)
+ {
+ _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra];
+ if (arg_info->use_gvariant)
+ {
+ g_value_init (¶mv[n], G_TYPE_VARIANT);
+ g_value_set_variant (¶mv[n], child);
+ n++;
+ }
+ else
+ g_dbus_gvariant_to_gvalue (child, ¶mv[n++]);
+ g_variant_unref (child);
+ }
+ signal_id = g_signal_lookup (info->signal_name, UM_REALM_TYPE_PROVIDER);
+ g_value_init (&return_value, G_TYPE_BOOLEAN);
+ g_signal_emitv (paramv, signal_id, 0, &return_value);
+ if (!g_value_get_boolean (&return_value))
+ g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s
is not implemented on interface %s", method_name, interface_name);
+ g_value_unset (&return_value);
+ for (n = 0; n < num_params + num_extra; n++)
+ g_value_unset (¶mv[n]);
+ g_free (paramv);
+}
+
+static GVariant *
+_um_realm_provider_skeleton_handle_get_property (
+ GDBusConnection *connection G_GNUC_UNUSED,
+ const gchar *sender G_GNUC_UNUSED,
+ const gchar *object_path G_GNUC_UNUSED,
+ const gchar *interface_name G_GNUC_UNUSED,
+ const gchar *property_name,
+ GError **error,
+ gpointer user_data)
+{
+ UmRealmProviderSkeleton *skeleton = UM_REALM_PROVIDER_SKELETON (user_data);
+ GValue value = G_VALUE_INIT;
+ GParamSpec *pspec;
+ _ExtendedGDBusPropertyInfo *info;
+ GVariant *ret;
+ ret = NULL;
+ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *)
&_um_realm_provider_interface_info.parent_struct, property_name);
+ g_assert (info != NULL);
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
+ if (pspec == NULL)
+ {
+ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s",
property_name);
+ }
+ else
+ {
+ g_value_init (&value, pspec->value_type);
+ g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value);
+ ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature));
+ g_value_unset (&value);
+ }
+ return ret;
+}
+
+static gboolean
+_um_realm_provider_skeleton_handle_set_property (
+ GDBusConnection *connection G_GNUC_UNUSED,
+ const gchar *sender G_GNUC_UNUSED,
+ const gchar *object_path G_GNUC_UNUSED,
+ const gchar *interface_name G_GNUC_UNUSED,
+ const gchar *property_name,
+ GVariant *variant,
+ GError **error,
+ gpointer user_data)
+{
+ UmRealmProviderSkeleton *skeleton = UM_REALM_PROVIDER_SKELETON (user_data);
+ GValue value = G_VALUE_INIT;
+ GParamSpec *pspec;
+ _ExtendedGDBusPropertyInfo *info;
+ gboolean ret;
+ ret = FALSE;
+ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *)
&_um_realm_provider_interface_info.parent_struct, property_name);
+ g_assert (info != NULL);
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
+ if (pspec == NULL)
+ {
+ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s",
property_name);
+ }
+ else
+ {
+ if (info->use_gvariant)
+ g_value_set_variant (&value, variant);
+ else
+ g_dbus_gvariant_to_gvalue (variant, &value);
+ g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value);
+ g_value_unset (&value);
+ ret = TRUE;
+ }
+ return ret;
+}
+
+static const GDBusInterfaceVTable _um_realm_provider_skeleton_vtable =
+{
+ _um_realm_provider_skeleton_handle_method_call,
+ _um_realm_provider_skeleton_handle_get_property,
+ _um_realm_provider_skeleton_handle_set_property,
+ {NULL}
+};
+
+static GDBusInterfaceInfo *
+um_realm_provider_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
+{
+ return um_realm_provider_interface_info ();
+}
+
+static GDBusInterfaceVTable *
+um_realm_provider_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
+{
+ return (GDBusInterfaceVTable *) &_um_realm_provider_skeleton_vtable;
+}
+
+static GVariant *
+um_realm_provider_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton)
+{
+ UmRealmProviderSkeleton *skeleton = UM_REALM_PROVIDER_SKELETON (_skeleton);
+
+ GVariantBuilder builder;
+ guint n;
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+ if (_um_realm_provider_interface_info.parent_struct.properties == NULL)
+ goto out;
+ for (n = 0; _um_realm_provider_interface_info.parent_struct.properties[n] != NULL; n++)
+ {
+ GDBusPropertyInfo *info = _um_realm_provider_interface_info.parent_struct.properties[n];
+ if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE)
+ {
+ GVariant *value;
+ value = _um_realm_provider_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection
(G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path
(G_DBUS_INTERFACE_SKELETON (skeleton)), "org.freedesktop.realmd.Provider", info->name, NULL, skeleton);
+ if (value != NULL)
+ {
+ g_variant_take_ref (value);
+ g_variant_builder_add (&builder, "{sv}", info->name, value);
+ g_variant_unref (value);
+ }
+ }
+ }
+out:
+ return g_variant_builder_end (&builder);
+}
+
+static gboolean _um_realm_provider_emit_changed (gpointer user_data);
+
+static void
+um_realm_provider_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton)
+{
+ UmRealmProviderSkeleton *skeleton = UM_REALM_PROVIDER_SKELETON (_skeleton);
+ gboolean emit_changed = FALSE;
+
+ g_mutex_lock (&skeleton->priv->lock);
+ if (skeleton->priv->changed_properties_idle_source != NULL)
+ {
+ g_source_destroy (skeleton->priv->changed_properties_idle_source);
+ skeleton->priv->changed_properties_idle_source = NULL;
+ emit_changed = TRUE;
+ }
+ g_mutex_unlock (&skeleton->priv->lock);
+
+ if (emit_changed)
+ _um_realm_provider_emit_changed (skeleton);
+}
+
+static void um_realm_provider_skeleton_iface_init (UmRealmProviderIface *iface);
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+G_DEFINE_TYPE_WITH_CODE (UmRealmProviderSkeleton, um_realm_provider_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
+ G_ADD_PRIVATE (UmRealmProviderSkeleton)
+ G_IMPLEMENT_INTERFACE (UM_REALM_TYPE_PROVIDER,
um_realm_provider_skeleton_iface_init));
+
+#else
+G_DEFINE_TYPE_WITH_CODE (UmRealmProviderSkeleton, um_realm_provider_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
+ G_IMPLEMENT_INTERFACE (UM_REALM_TYPE_PROVIDER,
um_realm_provider_skeleton_iface_init));
+
+#endif
+static void
+um_realm_provider_skeleton_finalize (GObject *object)
+{
+ UmRealmProviderSkeleton *skeleton = UM_REALM_PROVIDER_SKELETON (object);
+ guint n;
+ for (n = 0; n < 3; n++)
+ g_value_unset (&skeleton->priv->properties[n]);
+ g_free (skeleton->priv->properties);
+ g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
+ if (skeleton->priv->changed_properties_idle_source != NULL)
+ g_source_destroy (skeleton->priv->changed_properties_idle_source);
+ g_main_context_unref (skeleton->priv->context);
+ g_mutex_clear (&skeleton->priv->lock);
+ G_OBJECT_CLASS (um_realm_provider_skeleton_parent_class)->finalize (object);
+}
+
+static void
+um_realm_provider_skeleton_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec G_GNUC_UNUSED)
+{
+ UmRealmProviderSkeleton *skeleton = UM_REALM_PROVIDER_SKELETON (object);
+ g_assert (prop_id != 0 && prop_id - 1 < 3);
+ g_mutex_lock (&skeleton->priv->lock);
+ g_value_copy (&skeleton->priv->properties[prop_id - 1], value);
+ g_mutex_unlock (&skeleton->priv->lock);
+}
+
+static gboolean
+_um_realm_provider_emit_changed (gpointer user_data)
+{
+ UmRealmProviderSkeleton *skeleton = UM_REALM_PROVIDER_SKELETON (user_data);
+ GList *l;
+ GVariantBuilder builder;
+ GVariantBuilder invalidated_builder;
+ guint num_changes;
+
+ g_mutex_lock (&skeleton->priv->lock);
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+ g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as"));
+ for (l = skeleton->priv->changed_properties, num_changes = 0; l != NULL; l = l->next)
+ {
+ ChangedProperty *cp = l->data;
+ GVariant *variant;
+ const GValue *cur_value;
+
+ cur_value = &skeleton->priv->properties[cp->prop_id - 1];
+ if (!_g_value_equal (cur_value, &cp->orig_value))
+ {
+ variant = g_dbus_gvalue_to_gvariant (cur_value, G_VARIANT_TYPE
(cp->info->parent_struct.signature));
+ g_variant_builder_add (&builder, "{sv}", cp->info->parent_struct.name, variant);
+ g_variant_unref (variant);
+ num_changes++;
+ }
+ }
+ if (num_changes > 0)
+ {
+ GList *connections, *ll;
+ GVariant *signal_variant;
+ signal_variant = g_variant_ref_sink (g_variant_new ("(sa{sv}as)", "org.freedesktop.realmd.Provider",
+ &builder, &invalidated_builder));
+ connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));
+ for (ll = connections; ll != NULL; ll = ll->next)
+ {
+ GDBusConnection *connection = ll->data;
+
+ g_dbus_connection_emit_signal (connection,
+ NULL, g_dbus_interface_skeleton_get_object_path
(G_DBUS_INTERFACE_SKELETON (skeleton)),
+ "org.freedesktop.DBus.Properties",
+ "PropertiesChanged",
+ signal_variant,
+ NULL);
+ }
+ g_variant_unref (signal_variant);
+ g_list_free_full (connections, g_object_unref);
+ }
+ else
+ {
+ g_variant_builder_clear (&builder);
+ g_variant_builder_clear (&invalidated_builder);
+ }
+ g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
+ skeleton->priv->changed_properties = NULL;
+ skeleton->priv->changed_properties_idle_source = NULL;
+ g_mutex_unlock (&skeleton->priv->lock);
+ return FALSE;
+}
+
+static void
+_um_realm_provider_schedule_emit_changed (UmRealmProviderSkeleton *skeleton, const
_ExtendedGDBusPropertyInfo *info, guint prop_id, const GValue *orig_value)
+{
+ ChangedProperty *cp;
+ GList *l;
+ cp = NULL;
+ for (l = skeleton->priv->changed_properties; l != NULL; l = l->next)
+ {
+ ChangedProperty *i_cp = l->data;
+ if (i_cp->info == info)
+ {
+ cp = i_cp;
+ break;
+ }
+ }
+ if (cp == NULL)
+ {
+ cp = g_new0 (ChangedProperty, 1);
+ cp->prop_id = prop_id;
+ cp->info = info;
+ skeleton->priv->changed_properties = g_list_prepend (skeleton->priv->changed_properties, cp);
+ g_value_init (&cp->orig_value, G_VALUE_TYPE (orig_value));
+ g_value_copy (orig_value, &cp->orig_value);
+ }
+}
+
+static void
+um_realm_provider_skeleton_notify (GObject *object,
+ GParamSpec *pspec G_GNUC_UNUSED)
+{
+ UmRealmProviderSkeleton *skeleton = UM_REALM_PROVIDER_SKELETON (object);
+ g_mutex_lock (&skeleton->priv->lock);
+ if (skeleton->priv->changed_properties != NULL &&
+ skeleton->priv->changed_properties_idle_source == NULL)
+ {
+ skeleton->priv->changed_properties_idle_source = g_idle_source_new ();
+ g_source_set_priority (skeleton->priv->changed_properties_idle_source, G_PRIORITY_DEFAULT);
+ g_source_set_callback (skeleton->priv->changed_properties_idle_source,
_um_realm_provider_emit_changed, g_object_ref (skeleton), (GDestroyNotify) g_object_unref);
+ g_source_attach (skeleton->priv->changed_properties_idle_source, skeleton->priv->context);
+ g_source_unref (skeleton->priv->changed_properties_idle_source);
+ }
+ g_mutex_unlock (&skeleton->priv->lock);
+}
+
+static void
+um_realm_provider_skeleton_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ UmRealmProviderSkeleton *skeleton = UM_REALM_PROVIDER_SKELETON (object);
+ g_assert (prop_id != 0 && prop_id - 1 < 3);
+ g_mutex_lock (&skeleton->priv->lock);
+ g_object_freeze_notify (object);
+ if (!_g_value_equal (value, &skeleton->priv->properties[prop_id - 1]))
+ {
+ if (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)) != NULL)
+ _um_realm_provider_schedule_emit_changed (skeleton,
_um_realm_provider_property_info_pointers[prop_id - 1], prop_id, &skeleton->priv->properties[prop_id - 1]);
+ g_value_copy (value, &skeleton->priv->properties[prop_id - 1]);
+ g_object_notify_by_pspec (object, pspec);
+ }
+ g_mutex_unlock (&skeleton->priv->lock);
+ g_object_thaw_notify (object);
+}
+
+static void
+um_realm_provider_skeleton_init (UmRealmProviderSkeleton *skeleton)
+{
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+ skeleton->priv = um_realm_provider_skeleton_get_instance_private (skeleton);
+#else
+ skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, UM_REALM_TYPE_PROVIDER_SKELETON,
UmRealmProviderSkeletonPrivate);
+#endif
+
+ g_mutex_init (&skeleton->priv->lock);
+ skeleton->priv->context = g_main_context_ref_thread_default ();
+ skeleton->priv->properties = g_new0 (GValue, 3);
+ g_value_init (&skeleton->priv->properties[0], G_TYPE_STRING);
+ g_value_init (&skeleton->priv->properties[1], G_TYPE_STRING);
+ g_value_init (&skeleton->priv->properties[2], G_TYPE_STRV);
+}
+
+static const gchar *
+um_realm_provider_skeleton_get_name (UmRealmProvider *object)
+{
+ UmRealmProviderSkeleton *skeleton = UM_REALM_PROVIDER_SKELETON (object);
+ const gchar *value;
+ g_mutex_lock (&skeleton->priv->lock);
+ value = g_value_get_string (&(skeleton->priv->properties[0]));
+ g_mutex_unlock (&skeleton->priv->lock);
+ return value;
+}
+
+static const gchar *
+um_realm_provider_skeleton_get_version (UmRealmProvider *object)
+{
+ UmRealmProviderSkeleton *skeleton = UM_REALM_PROVIDER_SKELETON (object);
+ const gchar *value;
+ g_mutex_lock (&skeleton->priv->lock);
+ value = g_value_get_string (&(skeleton->priv->properties[1]));
+ g_mutex_unlock (&skeleton->priv->lock);
+ return value;
+}
+
+static const gchar *const *
+um_realm_provider_skeleton_get_realms (UmRealmProvider *object)
+{
+ UmRealmProviderSkeleton *skeleton = UM_REALM_PROVIDER_SKELETON (object);
+ const gchar *const *value;
+ g_mutex_lock (&skeleton->priv->lock);
+ value = g_value_get_boxed (&(skeleton->priv->properties[2]));
+ g_mutex_unlock (&skeleton->priv->lock);
+ return value;
+}
+
+static void
+um_realm_provider_skeleton_class_init (UmRealmProviderSkeletonClass *klass)
+{
+ GObjectClass *gobject_class;
+ GDBusInterfaceSkeletonClass *skeleton_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gobject_class->finalize = um_realm_provider_skeleton_finalize;
+ gobject_class->get_property = um_realm_provider_skeleton_get_property;
+ gobject_class->set_property = um_realm_provider_skeleton_set_property;
+ gobject_class->notify = um_realm_provider_skeleton_notify;
+
+
+ um_realm_provider_override_properties (gobject_class, 1);
+
+ skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);
+ skeleton_class->get_info = um_realm_provider_skeleton_dbus_interface_get_info;
+ skeleton_class->get_properties = um_realm_provider_skeleton_dbus_interface_get_properties;
+ skeleton_class->flush = um_realm_provider_skeleton_dbus_interface_flush;
+ skeleton_class->get_vtable = um_realm_provider_skeleton_dbus_interface_get_vtable;
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+ g_type_class_add_private (klass, sizeof (UmRealmProviderSkeletonPrivate));
+#endif
+}
+
+static void
+um_realm_provider_skeleton_iface_init (UmRealmProviderIface *iface)
+{
+ iface->get_name = um_realm_provider_skeleton_get_name;
+ iface->get_version = um_realm_provider_skeleton_get_version;
+ iface->get_realms = um_realm_provider_skeleton_get_realms;
+}
+
+/**
+ * um_realm_provider_skeleton_new:
+ *
+ * Creates a skeleton object for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Provider.top_of_page">org.freedesktop.realmd.Provider</link>.
+ *
+ * Returns: (transfer full) (type UmRealmProviderSkeleton): The skeleton object.
+ */
+UmRealmProvider *
+um_realm_provider_skeleton_new (void)
+{
+ return UM_REALM_PROVIDER (g_object_new (UM_REALM_TYPE_PROVIDER_SKELETON, NULL));
+}
+
+/* ------------------------------------------------------------------------
+ * Code for interface org.freedesktop.realmd.Service
+ * ------------------------------------------------------------------------
+ */
+
+/**
+ * SECTION:UmRealmService
+ * @title: UmRealmService
+ * @short_description: Generated C code for the org.freedesktop.realmd.Service D-Bus interface
+ *
+ * This section contains code for working with the <link
linkend="gdbus-interface-org-freedesktop-realmd-Service.top_of_page">org.freedesktop.realmd.Service</link>
D-Bus interface in C.
+ */
+
+/* ---- Introspection data for org.freedesktop.realmd.Service ---- */
+
+static const _ExtendedGDBusArgInfo _um_realm_service_method_info_cancel_IN_ARG_operation =
+{
+ {
+ -1,
+ (gchar *) "operation",
+ (gchar *) "s",
+ NULL
+ },
+ FALSE
+};
+
+static const _ExtendedGDBusArgInfo * const _um_realm_service_method_info_cancel_IN_ARG_pointers[] =
+{
+ &_um_realm_service_method_info_cancel_IN_ARG_operation,
+ NULL
+};
+
+static const _ExtendedGDBusMethodInfo _um_realm_service_method_info_cancel =
+{
+ {
+ -1,
+ (gchar *) "Cancel",
+ (GDBusArgInfo **) &_um_realm_service_method_info_cancel_IN_ARG_pointers,
+ NULL,
+ NULL
+ },
+ "handle-cancel",
+ FALSE
+};
+
+static const _ExtendedGDBusArgInfo _um_realm_service_method_info_set_locale_IN_ARG_locale =
+{
+ {
+ -1,
+ (gchar *) "locale",
+ (gchar *) "s",
+ NULL
+ },
+ FALSE
+};
+
+static const _ExtendedGDBusArgInfo * const _um_realm_service_method_info_set_locale_IN_ARG_pointers[] =
+{
+ &_um_realm_service_method_info_set_locale_IN_ARG_locale,
+ NULL
+};
+
+static const _ExtendedGDBusMethodInfo _um_realm_service_method_info_set_locale =
+{
+ {
+ -1,
+ (gchar *) "SetLocale",
+ (GDBusArgInfo **) &_um_realm_service_method_info_set_locale_IN_ARG_pointers,
+ NULL,
+ NULL
+ },
+ "handle-set-locale",
+ FALSE
+};
+
+static const _ExtendedGDBusMethodInfo _um_realm_service_method_info_release =
+{
+ {
+ -1,
+ (gchar *) "Release",
+ NULL,
+ NULL,
+ NULL
+ },
+ "handle-release",
+ FALSE
+};
+
+static const _ExtendedGDBusMethodInfo * const _um_realm_service_method_info_pointers[] =
+{
+ &_um_realm_service_method_info_cancel,
+ &_um_realm_service_method_info_set_locale,
+ &_um_realm_service_method_info_release,
+ NULL
+};
+
+static const _ExtendedGDBusArgInfo _um_realm_service_signal_info_diagnostics_ARG_data =
+{
+ {
+ -1,
+ (gchar *) "data",
+ (gchar *) "s",
+ NULL
+ },
+ FALSE
+};
+
+static const _ExtendedGDBusArgInfo _um_realm_service_signal_info_diagnostics_ARG_operation =
+{
+ {
+ -1,
+ (gchar *) "operation",
+ (gchar *) "s",
+ NULL
+ },
+ FALSE
+};
+
+static const _ExtendedGDBusArgInfo * const _um_realm_service_signal_info_diagnostics_ARG_pointers[] =
+{
+ &_um_realm_service_signal_info_diagnostics_ARG_data,
+ &_um_realm_service_signal_info_diagnostics_ARG_operation,
+ NULL
+};
+
+static const _ExtendedGDBusSignalInfo _um_realm_service_signal_info_diagnostics =
+{
+ {
+ -1,
+ (gchar *) "Diagnostics",
+ (GDBusArgInfo **) &_um_realm_service_signal_info_diagnostics_ARG_pointers,
+ NULL
+ },
+ "diagnostics"
+};
+
+static const _ExtendedGDBusSignalInfo * const _um_realm_service_signal_info_pointers[] =
+{
+ &_um_realm_service_signal_info_diagnostics,
+ NULL
+};
+
+static const _ExtendedGDBusInterfaceInfo _um_realm_service_interface_info =
+{
+ {
+ -1,
+ (gchar *) "org.freedesktop.realmd.Service",
+ (GDBusMethodInfo **) &_um_realm_service_method_info_pointers,
+ (GDBusSignalInfo **) &_um_realm_service_signal_info_pointers,
+ NULL,
+ NULL
+ },
+ "service",
+};
+
+
+/**
+ * um_realm_service_interface_info:
+ *
+ * Gets a machine-readable description of the <link
linkend="gdbus-interface-org-freedesktop-realmd-Service.top_of_page">org.freedesktop.realmd.Service</link>
D-Bus interface.
+ *
+ * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free.
+ */
+GDBusInterfaceInfo *
+um_realm_service_interface_info (void)
+{
+ return (GDBusInterfaceInfo *) &_um_realm_service_interface_info.parent_struct;
+}
+
+/**
+ * um_realm_service_override_properties:
+ * @klass: The class structure for a #GObject<!-- -->-derived class.
+ * @property_id_begin: The property id to assign to the first overridden property.
+ *
+ * Overrides all #GObject properties in the #UmRealmService interface for a concrete class.
+ * The properties are overridden in the order they are defined.
+ *
+ * Returns: The last property id.
+ */
+guint
+um_realm_service_override_properties (GObjectClass *klass, guint property_id_begin)
+{
+ return property_id_begin - 1;
+}
+
+
+
+/**
+ * UmRealmService:
+ *
+ * Abstract interface type for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Service.top_of_page">org.freedesktop.realmd.Service</link>.
+ */
+
+/**
+ * UmRealmServiceIface:
+ * @parent_iface: The parent interface.
+ * @handle_cancel: Handler for the #UmRealmService::handle-cancel signal.
+ * @handle_release: Handler for the #UmRealmService::handle-release signal.
+ * @handle_set_locale: Handler for the #UmRealmService::handle-set-locale signal.
+ * @diagnostics: Handler for the #UmRealmService::diagnostics signal.
+ *
+ * Virtual table for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Service.top_of_page">org.freedesktop.realmd.Service</link>.
+ */
+
+typedef UmRealmServiceIface UmRealmServiceInterface;
+G_DEFINE_INTERFACE (UmRealmService, um_realm_service, G_TYPE_OBJECT);
+
+static void
+um_realm_service_default_init (UmRealmServiceIface *iface)
+{
+ /* GObject signals for incoming D-Bus method calls: */
+ /**
+ * UmRealmService::handle-cancel:
+ * @object: A #UmRealmService.
+ * @invocation: A #GDBusMethodInvocation.
+ * @arg_operation: Argument passed by remote caller.
+ *
+ * Signal emitted when a remote caller is invoking the <link
linkend="gdbus-method-org-freedesktop-realmd-Service.Cancel">Cancel()</link> D-Bus method.
+ *
+ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a
reference to @invocation and eventually call um_realm_service_complete_cancel() or e.g.
g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler
handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+ *
+ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+ */
+ g_signal_new ("handle-cancel",
+ G_TYPE_FROM_INTERFACE (iface),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (UmRealmServiceIface, handle_cancel),
+ g_signal_accumulator_true_handled,
+ NULL,
+ g_cclosure_marshal_generic,
+ G_TYPE_BOOLEAN,
+ 2,
+ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING);
+
+ /**
+ * UmRealmService::handle-set-locale:
+ * @object: A #UmRealmService.
+ * @invocation: A #GDBusMethodInvocation.
+ * @arg_locale: Argument passed by remote caller.
+ *
+ * Signal emitted when a remote caller is invoking the <link
linkend="gdbus-method-org-freedesktop-realmd-Service.SetLocale">SetLocale()</link> D-Bus method.
+ *
+ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a
reference to @invocation and eventually call um_realm_service_complete_set_locale() or e.g.
g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler
handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+ *
+ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+ */
+ g_signal_new ("handle-set-locale",
+ G_TYPE_FROM_INTERFACE (iface),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (UmRealmServiceIface, handle_set_locale),
+ g_signal_accumulator_true_handled,
+ NULL,
+ g_cclosure_marshal_generic,
+ G_TYPE_BOOLEAN,
+ 2,
+ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING);
+
+ /**
+ * UmRealmService::handle-release:
+ * @object: A #UmRealmService.
+ * @invocation: A #GDBusMethodInvocation.
+ *
+ * Signal emitted when a remote caller is invoking the <link
linkend="gdbus-method-org-freedesktop-realmd-Service.Release">Release()</link> D-Bus method.
+ *
+ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a
reference to @invocation and eventually call um_realm_service_complete_release() or e.g.
g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler
handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+ *
+ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+ */
+ g_signal_new ("handle-release",
+ G_TYPE_FROM_INTERFACE (iface),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (UmRealmServiceIface, handle_release),
+ g_signal_accumulator_true_handled,
+ NULL,
+ g_cclosure_marshal_generic,
+ G_TYPE_BOOLEAN,
+ 1,
+ G_TYPE_DBUS_METHOD_INVOCATION);
+
+ /* GObject signals for received D-Bus signals: */
+ /**
+ * UmRealmService::diagnostics:
+ * @object: A #UmRealmService.
+ * @arg_data: Argument.
+ * @arg_operation: Argument.
+ *
+ * On the client-side, this signal is emitted whenever the D-Bus signal <link
linkend="gdbus-signal-org-freedesktop-realmd-Service.Diagnostics">"Diagnostics"</link> is received.
+ *
+ * On the service-side, this signal can be used with e.g. g_signal_emit_by_name() to make the object emit
the D-Bus signal.
+ */
+ g_signal_new ("diagnostics",
+ G_TYPE_FROM_INTERFACE (iface),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (UmRealmServiceIface, diagnostics),
+ NULL,
+ NULL,
+ g_cclosure_marshal_generic,
+ G_TYPE_NONE,
+ 2, G_TYPE_STRING, G_TYPE_STRING);
+
+}
+
+/**
+ * um_realm_service_emit_diagnostics:
+ * @object: A #UmRealmService.
+ * @arg_data: Argument to pass with the signal.
+ * @arg_operation: Argument to pass with the signal.
+ *
+ * Emits the <link linkend="gdbus-signal-org-freedesktop-realmd-Service.Diagnostics">"Diagnostics"</link>
D-Bus signal.
+ */
+void
+um_realm_service_emit_diagnostics (
+ UmRealmService *object,
+ const gchar *arg_data,
+ const gchar *arg_operation)
+{
+ g_signal_emit_by_name (object, "diagnostics", arg_data, arg_operation);
+}
+
+/**
+ * um_realm_service_call_cancel:
+ * @proxy: A #UmRealmServiceProxy.
+ * @arg_operation: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link
linkend="gdbus-method-org-freedesktop-realmd-Service.Cancel">Cancel()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling
this method from.
+ * You can then call um_realm_service_call_cancel_finish() to get the result of the operation.
+ *
+ * See um_realm_service_call_cancel_sync() for the synchronous, blocking version of this method.
+ */
+void
+um_realm_service_call_cancel (
+ UmRealmService *proxy,
+ const gchar *arg_operation,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+ "Cancel",
+ g_variant_new ("(s)",
+ arg_operation),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ cancellable,
+ callback,
+ user_data);
+}
+
+/**
+ * um_realm_service_call_cancel_finish:
+ * @proxy: A #UmRealmServiceProxy.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to um_realm_service_call_cancel().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with um_realm_service_call_cancel().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+um_realm_service_call_cancel_finish (
+ UmRealmService *proxy,
+ GAsyncResult *res,
+ GError **error)
+{
+ GVariant *_ret;
+ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+ if (_ret == NULL)
+ goto _out;
+ g_variant_get (_ret,
+ "()");
+ g_variant_unref (_ret);
+_out:
+ return _ret != NULL;
+}
+
+/**
+ * um_realm_service_call_cancel_sync:
+ * @proxy: A #UmRealmServiceProxy.
+ * @arg_operation: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link
linkend="gdbus-method-org-freedesktop-realmd-Service.Cancel">Cancel()</link> D-Bus method on @proxy. The
calling thread is blocked until a reply is received.
+ *
+ * See um_realm_service_call_cancel() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+um_realm_service_call_cancel_sync (
+ UmRealmService *proxy,
+ const gchar *arg_operation,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GVariant *_ret;
+ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+ "Cancel",
+ g_variant_new ("(s)",
+ arg_operation),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ cancellable,
+ error);
+ if (_ret == NULL)
+ goto _out;
+ g_variant_get (_ret,
+ "()");
+ g_variant_unref (_ret);
+_out:
+ return _ret != NULL;
+}
+
+/**
+ * um_realm_service_call_set_locale:
+ * @proxy: A #UmRealmServiceProxy.
+ * @arg_locale: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link
linkend="gdbus-method-org-freedesktop-realmd-Service.SetLocale">SetLocale()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling
this method from.
+ * You can then call um_realm_service_call_set_locale_finish() to get the result of the operation.
+ *
+ * See um_realm_service_call_set_locale_sync() for the synchronous, blocking version of this method.
+ */
+void
+um_realm_service_call_set_locale (
+ UmRealmService *proxy,
+ const gchar *arg_locale,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+ "SetLocale",
+ g_variant_new ("(s)",
+ arg_locale),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ cancellable,
+ callback,
+ user_data);
+}
+
+/**
+ * um_realm_service_call_set_locale_finish:
+ * @proxy: A #UmRealmServiceProxy.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to
um_realm_service_call_set_locale().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with um_realm_service_call_set_locale().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+um_realm_service_call_set_locale_finish (
+ UmRealmService *proxy,
+ GAsyncResult *res,
+ GError **error)
+{
+ GVariant *_ret;
+ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+ if (_ret == NULL)
+ goto _out;
+ g_variant_get (_ret,
+ "()");
+ g_variant_unref (_ret);
+_out:
+ return _ret != NULL;
+}
+
+/**
+ * um_realm_service_call_set_locale_sync:
+ * @proxy: A #UmRealmServiceProxy.
+ * @arg_locale: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link
linkend="gdbus-method-org-freedesktop-realmd-Service.SetLocale">SetLocale()</link> D-Bus method on @proxy.
The calling thread is blocked until a reply is received.
+ *
+ * See um_realm_service_call_set_locale() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+um_realm_service_call_set_locale_sync (
+ UmRealmService *proxy,
+ const gchar *arg_locale,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GVariant *_ret;
+ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+ "SetLocale",
+ g_variant_new ("(s)",
+ arg_locale),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ cancellable,
+ error);
+ if (_ret == NULL)
+ goto _out;
+ g_variant_get (_ret,
+ "()");
+ g_variant_unref (_ret);
+_out:
+ return _ret != NULL;
+}
+
+/**
+ * um_realm_service_call_release:
+ * @proxy: A #UmRealmServiceProxy.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link
linkend="gdbus-method-org-freedesktop-realmd-Service.Release">Release()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling
this method from.
+ * You can then call um_realm_service_call_release_finish() to get the result of the operation.
+ *
+ * See um_realm_service_call_release_sync() for the synchronous, blocking version of this method.
+ */
+void
+um_realm_service_call_release (
+ UmRealmService *proxy,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+ "Release",
+ g_variant_new ("()"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ cancellable,
+ callback,
+ user_data);
+}
+
+/**
+ * um_realm_service_call_release_finish:
+ * @proxy: A #UmRealmServiceProxy.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to um_realm_service_call_release().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with um_realm_service_call_release().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+um_realm_service_call_release_finish (
+ UmRealmService *proxy,
+ GAsyncResult *res,
+ GError **error)
+{
+ GVariant *_ret;
+ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+ if (_ret == NULL)
+ goto _out;
+ g_variant_get (_ret,
+ "()");
+ g_variant_unref (_ret);
+_out:
+ return _ret != NULL;
+}
+
+/**
+ * um_realm_service_call_release_sync:
+ * @proxy: A #UmRealmServiceProxy.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link
linkend="gdbus-method-org-freedesktop-realmd-Service.Release">Release()</link> D-Bus method on @proxy. The
calling thread is blocked until a reply is received.
+ *
+ * See um_realm_service_call_release() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+um_realm_service_call_release_sync (
+ UmRealmService *proxy,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GVariant *_ret;
+ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+ "Release",
+ g_variant_new ("()"),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ cancellable,
+ error);
+ if (_ret == NULL)
+ goto _out;
+ g_variant_get (_ret,
+ "()");
+ g_variant_unref (_ret);
+_out:
+ return _ret != NULL;
+}
+
+/**
+ * um_realm_service_complete_cancel:
+ * @object: A #UmRealmService.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link
linkend="gdbus-method-org-freedesktop-realmd-Service.Cancel">Cancel()</link> D-Bus method. If you instead
want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or
similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+um_realm_service_complete_cancel (
+ UmRealmService *object,
+ GDBusMethodInvocation *invocation)
+{
+ g_dbus_method_invocation_return_value (invocation,
+ g_variant_new ("()"));
+}
+
+/**
+ * um_realm_service_complete_set_locale:
+ * @object: A #UmRealmService.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link
linkend="gdbus-method-org-freedesktop-realmd-Service.SetLocale">SetLocale()</link> D-Bus method. If you
instead want to finish handling an invocation by returning an error, use
g_dbus_method_invocation_return_error() or similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+um_realm_service_complete_set_locale (
+ UmRealmService *object,
+ GDBusMethodInvocation *invocation)
+{
+ g_dbus_method_invocation_return_value (invocation,
+ g_variant_new ("()"));
+}
+
+/**
+ * um_realm_service_complete_release:
+ * @object: A #UmRealmService.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link
linkend="gdbus-method-org-freedesktop-realmd-Service.Release">Release()</link> D-Bus method. If you instead
want to finish handling an invocation by returning an error, use g_dbus_method_invocation_return_error() or
similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+um_realm_service_complete_release (
+ UmRealmService *object,
+ GDBusMethodInvocation *invocation)
+{
+ g_dbus_method_invocation_return_value (invocation,
+ g_variant_new ("()"));
+}
+
+/* ------------------------------------------------------------------------ */
+
+/**
+ * UmRealmServiceProxy:
+ *
+ * The #UmRealmServiceProxy structure contains only private data and should only be accessed using the
provided API.
+ */
+
+/**
+ * UmRealmServiceProxyClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #UmRealmServiceProxy.
+ */
+
+struct _UmRealmServiceProxyPrivate
+{
+ GData *qdata;
+};
+
+static void um_realm_service_proxy_iface_init (UmRealmServiceIface *iface);
+
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+G_DEFINE_TYPE_WITH_CODE (UmRealmServiceProxy, um_realm_service_proxy, G_TYPE_DBUS_PROXY,
+ G_ADD_PRIVATE (UmRealmServiceProxy)
+ G_IMPLEMENT_INTERFACE (UM_REALM_TYPE_SERVICE, um_realm_service_proxy_iface_init));
+
+#else
+G_DEFINE_TYPE_WITH_CODE (UmRealmServiceProxy, um_realm_service_proxy, G_TYPE_DBUS_PROXY,
+ G_IMPLEMENT_INTERFACE (UM_REALM_TYPE_SERVICE, um_realm_service_proxy_iface_init));
+
+#endif
+static void
+um_realm_service_proxy_finalize (GObject *object)
+{
+ UmRealmServiceProxy *proxy = UM_REALM_SERVICE_PROXY (object);
+ g_datalist_clear (&proxy->priv->qdata);
+ G_OBJECT_CLASS (um_realm_service_proxy_parent_class)->finalize (object);
+}
+
+static void
+um_realm_service_proxy_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec G_GNUC_UNUSED)
+{
+}
+
+static void
+um_realm_service_proxy_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec G_GNUC_UNUSED)
+{
+}
+
+static void
+um_realm_service_proxy_g_signal (GDBusProxy *proxy,
+ const gchar *sender_name G_GNUC_UNUSED,
+ const gchar *signal_name,
+ GVariant *parameters)
+{
+ _ExtendedGDBusSignalInfo *info;
+ GVariantIter iter;
+ GVariant *child;
+ GValue *paramv;
+ guint num_params;
+ guint n;
+ guint signal_id;
+ info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *)
&_um_realm_service_interface_info.parent_struct, signal_name);
+ if (info == NULL)
+ return;
+ num_params = g_variant_n_children (parameters);
+ paramv = g_new0 (GValue, num_params + 1);
+ g_value_init (¶mv[0], UM_REALM_TYPE_SERVICE);
+ g_value_set_object (¶mv[0], proxy);
+ g_variant_iter_init (&iter, parameters);
+ n = 1;
+ while ((child = g_variant_iter_next_value (&iter)) != NULL)
+ {
+ _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1];
+ if (arg_info->use_gvariant)
+ {
+ g_value_init (¶mv[n], G_TYPE_VARIANT);
+ g_value_set_variant (¶mv[n], child);
+ n++;
+ }
+ else
+ g_dbus_gvariant_to_gvalue (child, ¶mv[n++]);
+ g_variant_unref (child);
+ }
+ signal_id = g_signal_lookup (info->signal_name, UM_REALM_TYPE_SERVICE);
+ g_signal_emitv (paramv, signal_id, 0, NULL);
+ for (n = 0; n < num_params + 1; n++)
+ g_value_unset (¶mv[n]);
+ g_free (paramv);
+}
+
+static void
+um_realm_service_proxy_g_properties_changed (GDBusProxy *_proxy,
+ GVariant *changed_properties,
+ const gchar *const *invalidated_properties)
+{
+ UmRealmServiceProxy *proxy = UM_REALM_SERVICE_PROXY (_proxy);
+ guint n;
+ const gchar *key;
+ GVariantIter *iter;
+ _ExtendedGDBusPropertyInfo *info;
+ g_variant_get (changed_properties, "a{sv}", &iter);
+ while (g_variant_iter_next (iter, "{&sv}", &key, NULL))
+ {
+ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *)
&_um_realm_service_interface_info.parent_struct, key);
+ g_datalist_remove_data (&proxy->priv->qdata, key);
+ if (info != NULL)
+ g_object_notify (G_OBJECT (proxy), info->hyphen_name);
+ }
+ g_variant_iter_free (iter);
+ for (n = 0; invalidated_properties[n] != NULL; n++)
+ {
+ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *)
&_um_realm_service_interface_info.parent_struct, invalidated_properties[n]);
+ g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]);
+ if (info != NULL)
+ g_object_notify (G_OBJECT (proxy), info->hyphen_name);
+ }
+}
+
+static void
+um_realm_service_proxy_init (UmRealmServiceProxy *proxy)
+{
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+ proxy->priv = um_realm_service_proxy_get_instance_private (proxy);
+#else
+ proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, UM_REALM_TYPE_SERVICE_PROXY, UmRealmServiceProxyPrivate);
+#endif
+
+ g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), um_realm_service_interface_info ());
+}
+
+static void
+um_realm_service_proxy_class_init (UmRealmServiceProxyClass *klass)
+{
+ GObjectClass *gobject_class;
+ GDBusProxyClass *proxy_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gobject_class->finalize = um_realm_service_proxy_finalize;
+ gobject_class->get_property = um_realm_service_proxy_get_property;
+ gobject_class->set_property = um_realm_service_proxy_set_property;
+
+ proxy_class = G_DBUS_PROXY_CLASS (klass);
+ proxy_class->g_signal = um_realm_service_proxy_g_signal;
+ proxy_class->g_properties_changed = um_realm_service_proxy_g_properties_changed;
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+ g_type_class_add_private (klass, sizeof (UmRealmServiceProxyPrivate));
+#endif
+}
+
+static void
+um_realm_service_proxy_iface_init (UmRealmServiceIface *iface)
+{
+}
+
+/**
+ * um_realm_service_proxy_new:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus
connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously creates a proxy for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Service.top_of_page">org.freedesktop.realmd.Service</link>.
See g_dbus_proxy_new() for more details.
+ *
+ * When the operation is finished, @callback will be invoked in the <link
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling
this method from.
+ * You can then call um_realm_service_proxy_new_finish() to get the result of the operation.
+ *
+ * See um_realm_service_proxy_new_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+um_realm_service_proxy_new (
+ GDBusConnection *connection,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_async_initable_new_async (UM_REALM_TYPE_SERVICE_PROXY, G_PRIORITY_DEFAULT, cancellable, callback,
user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path,
"g-interface-name", "org.freedesktop.realmd.Service", NULL);
+}
+
+/**
+ * um_realm_service_proxy_new_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to um_realm_service_proxy_new().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with um_realm_service_proxy_new().
+ *
+ * Returns: (transfer full) (type UmRealmServiceProxy): The constructed proxy object or %NULL if @error is
set.
+ */
+UmRealmService *
+um_realm_service_proxy_new_finish (
+ GAsyncResult *res,
+ GError **error)
+{
+ GObject *ret;
+ GObject *source_object;
+ source_object = g_async_result_get_source_object (res);
+ ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+ g_object_unref (source_object);
+ if (ret != NULL)
+ return UM_REALM_SERVICE (ret);
+ else
+ return NULL;
+}
+
+/**
+ * um_realm_service_proxy_new_sync:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus
connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Synchronously creates a proxy for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Service.top_of_page">org.freedesktop.realmd.Service</link>.
See g_dbus_proxy_new_sync() for more details.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See um_realm_service_proxy_new() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type UmRealmServiceProxy): The constructed proxy object or %NULL if @error is
set.
+ */
+UmRealmService *
+um_realm_service_proxy_new_sync (
+ GDBusConnection *connection,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GInitable *ret;
+ ret = g_initable_new (UM_REALM_TYPE_SERVICE_PROXY, cancellable, error, "g-flags", flags, "g-name", name,
"g-connection", connection, "g-object-path", object_path, "g-interface-name",
"org.freedesktop.realmd.Service", NULL);
+ if (ret != NULL)
+ return UM_REALM_SERVICE (ret);
+ else
+ return NULL;
+}
+
+
+/**
+ * um_realm_service_proxy_new_for_bus:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Like um_realm_service_proxy_new() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * When the operation is finished, @callback will be invoked in the <link
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling
this method from.
+ * You can then call um_realm_service_proxy_new_for_bus_finish() to get the result of the operation.
+ *
+ * See um_realm_service_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+um_realm_service_proxy_new_for_bus (
+ GBusType bus_type,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_async_initable_new_async (UM_REALM_TYPE_SERVICE_PROXY, G_PRIORITY_DEFAULT, cancellable, callback,
user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path,
"g-interface-name", "org.freedesktop.realmd.Service", NULL);
+}
+
+/**
+ * um_realm_service_proxy_new_for_bus_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to
um_realm_service_proxy_new_for_bus().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with um_realm_service_proxy_new_for_bus().
+ *
+ * Returns: (transfer full) (type UmRealmServiceProxy): The constructed proxy object or %NULL if @error is
set.
+ */
+UmRealmService *
+um_realm_service_proxy_new_for_bus_finish (
+ GAsyncResult *res,
+ GError **error)
+{
+ GObject *ret;
+ GObject *source_object;
+ source_object = g_async_result_get_source_object (res);
+ ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+ g_object_unref (source_object);
+ if (ret != NULL)
+ return UM_REALM_SERVICE (ret);
+ else
+ return NULL;
+}
+
+/**
+ * um_realm_service_proxy_new_for_bus_sync:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Like um_realm_service_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See um_realm_service_proxy_new_for_bus() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type UmRealmServiceProxy): The constructed proxy object or %NULL if @error is
set.
+ */
+UmRealmService *
+um_realm_service_proxy_new_for_bus_sync (
+ GBusType bus_type,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GInitable *ret;
+ ret = g_initable_new (UM_REALM_TYPE_SERVICE_PROXY, cancellable, error, "g-flags", flags, "g-name", name,
"g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.freedesktop.realmd.Service",
NULL);
+ if (ret != NULL)
+ return UM_REALM_SERVICE (ret);
+ else
+ return NULL;
+}
+
+
+/* ------------------------------------------------------------------------ */
+
+/**
+ * UmRealmServiceSkeleton:
+ *
+ * The #UmRealmServiceSkeleton structure contains only private data and should only be accessed using the
provided API.
+ */
+
+/**
+ * UmRealmServiceSkeletonClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #UmRealmServiceSkeleton.
+ */
+
+struct _UmRealmServiceSkeletonPrivate
+{
+ GValue *properties;
+ GList *changed_properties;
+ GSource *changed_properties_idle_source;
+ GMainContext *context;
+ GMutex lock;
+};
+
+static void
+_um_realm_service_skeleton_handle_method_call (
+ GDBusConnection *connection G_GNUC_UNUSED,
+ const gchar *sender G_GNUC_UNUSED,
+ const gchar *object_path G_GNUC_UNUSED,
+ const gchar *interface_name,
+ const gchar *method_name,
+ GVariant *parameters,
+ GDBusMethodInvocation *invocation,
+ gpointer user_data)
+{
+ UmRealmServiceSkeleton *skeleton = UM_REALM_SERVICE_SKELETON (user_data);
+ _ExtendedGDBusMethodInfo *info;
+ GVariantIter iter;
+ GVariant *child;
+ GValue *paramv;
+ guint num_params;
+ guint num_extra;
+ guint n;
+ guint signal_id;
+ GValue return_value = G_VALUE_INIT;
+ info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation);
+ g_assert (info != NULL);
+ num_params = g_variant_n_children (parameters);
+ num_extra = info->pass_fdlist ? 3 : 2; paramv = g_new0 (GValue, num_params + num_extra);
+ n = 0;
+ g_value_init (¶mv[n], UM_REALM_TYPE_SERVICE);
+ g_value_set_object (¶mv[n++], skeleton);
+ g_value_init (¶mv[n], G_TYPE_DBUS_METHOD_INVOCATION);
+ g_value_set_object (¶mv[n++], invocation);
+ if (info->pass_fdlist)
+ {
+#ifdef G_OS_UNIX
+ g_value_init (¶mv[n], G_TYPE_UNIX_FD_LIST);
+ g_value_set_object (¶mv[n++], g_dbus_message_get_unix_fd_list
(g_dbus_method_invocation_get_message (invocation)));
+#else
+ g_assert_not_reached ();
+#endif
+ }
+ g_variant_iter_init (&iter, parameters);
+ while ((child = g_variant_iter_next_value (&iter)) != NULL)
+ {
+ _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra];
+ if (arg_info->use_gvariant)
+ {
+ g_value_init (¶mv[n], G_TYPE_VARIANT);
+ g_value_set_variant (¶mv[n], child);
+ n++;
+ }
+ else
+ g_dbus_gvariant_to_gvalue (child, ¶mv[n++]);
+ g_variant_unref (child);
+ }
+ signal_id = g_signal_lookup (info->signal_name, UM_REALM_TYPE_SERVICE);
+ g_value_init (&return_value, G_TYPE_BOOLEAN);
+ g_signal_emitv (paramv, signal_id, 0, &return_value);
+ if (!g_value_get_boolean (&return_value))
+ g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s
is not implemented on interface %s", method_name, interface_name);
+ g_value_unset (&return_value);
+ for (n = 0; n < num_params + num_extra; n++)
+ g_value_unset (¶mv[n]);
+ g_free (paramv);
+}
+
+static GVariant *
+_um_realm_service_skeleton_handle_get_property (
+ GDBusConnection *connection G_GNUC_UNUSED,
+ const gchar *sender G_GNUC_UNUSED,
+ const gchar *object_path G_GNUC_UNUSED,
+ const gchar *interface_name G_GNUC_UNUSED,
+ const gchar *property_name,
+ GError **error,
+ gpointer user_data)
+{
+ UmRealmServiceSkeleton *skeleton = UM_REALM_SERVICE_SKELETON (user_data);
+ GValue value = G_VALUE_INIT;
+ GParamSpec *pspec;
+ _ExtendedGDBusPropertyInfo *info;
+ GVariant *ret;
+ ret = NULL;
+ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *)
&_um_realm_service_interface_info.parent_struct, property_name);
+ g_assert (info != NULL);
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
+ if (pspec == NULL)
+ {
+ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s",
property_name);
+ }
+ else
+ {
+ g_value_init (&value, pspec->value_type);
+ g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value);
+ ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature));
+ g_value_unset (&value);
+ }
+ return ret;
+}
+
+static gboolean
+_um_realm_service_skeleton_handle_set_property (
+ GDBusConnection *connection G_GNUC_UNUSED,
+ const gchar *sender G_GNUC_UNUSED,
+ const gchar *object_path G_GNUC_UNUSED,
+ const gchar *interface_name G_GNUC_UNUSED,
+ const gchar *property_name,
+ GVariant *variant,
+ GError **error,
+ gpointer user_data)
+{
+ UmRealmServiceSkeleton *skeleton = UM_REALM_SERVICE_SKELETON (user_data);
+ GValue value = G_VALUE_INIT;
+ GParamSpec *pspec;
+ _ExtendedGDBusPropertyInfo *info;
+ gboolean ret;
+ ret = FALSE;
+ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *)
&_um_realm_service_interface_info.parent_struct, property_name);
+ g_assert (info != NULL);
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
+ if (pspec == NULL)
+ {
+ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s",
property_name);
+ }
+ else
+ {
+ if (info->use_gvariant)
+ g_value_set_variant (&value, variant);
+ else
+ g_dbus_gvariant_to_gvalue (variant, &value);
+ g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value);
+ g_value_unset (&value);
+ ret = TRUE;
+ }
+ return ret;
+}
+
+static const GDBusInterfaceVTable _um_realm_service_skeleton_vtable =
+{
+ _um_realm_service_skeleton_handle_method_call,
+ _um_realm_service_skeleton_handle_get_property,
+ _um_realm_service_skeleton_handle_set_property,
+ {NULL}
+};
+
+static GDBusInterfaceInfo *
+um_realm_service_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
+{
+ return um_realm_service_interface_info ();
+}
+
+static GDBusInterfaceVTable *
+um_realm_service_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
+{
+ return (GDBusInterfaceVTable *) &_um_realm_service_skeleton_vtable;
+}
+
+static GVariant *
+um_realm_service_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton)
+{
+ UmRealmServiceSkeleton *skeleton = UM_REALM_SERVICE_SKELETON (_skeleton);
+
+ GVariantBuilder builder;
+ guint n;
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+ if (_um_realm_service_interface_info.parent_struct.properties == NULL)
+ goto out;
+ for (n = 0; _um_realm_service_interface_info.parent_struct.properties[n] != NULL; n++)
+ {
+ GDBusPropertyInfo *info = _um_realm_service_interface_info.parent_struct.properties[n];
+ if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE)
+ {
+ GVariant *value;
+ value = _um_realm_service_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection
(G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path
(G_DBUS_INTERFACE_SKELETON (skeleton)), "org.freedesktop.realmd.Service", info->name, NULL, skeleton);
+ if (value != NULL)
+ {
+ g_variant_take_ref (value);
+ g_variant_builder_add (&builder, "{sv}", info->name, value);
+ g_variant_unref (value);
+ }
+ }
+ }
+out:
+ return g_variant_builder_end (&builder);
+}
+
+static void
+um_realm_service_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton)
+{
+}
+
+static void
+_um_realm_service_on_signal_diagnostics (
+ UmRealmService *object,
+ const gchar *arg_data,
+ const gchar *arg_operation)
+{
+ UmRealmServiceSkeleton *skeleton = UM_REALM_SERVICE_SKELETON (object);
+
+ GList *connections, *l;
+ GVariant *signal_variant;
+ connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));
+
+ signal_variant = g_variant_ref_sink (g_variant_new ("(ss)",
+ arg_data,
+ arg_operation));
+ for (l = connections; l != NULL; l = l->next)
+ {
+ GDBusConnection *connection = l->data;
+ g_dbus_connection_emit_signal (connection,
+ NULL, g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)),
"org.freedesktop.realmd.Service", "Diagnostics",
+ signal_variant, NULL);
+ }
+ g_variant_unref (signal_variant);
+ g_list_free_full (connections, g_object_unref);
+}
+
+static void um_realm_service_skeleton_iface_init (UmRealmServiceIface *iface);
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+G_DEFINE_TYPE_WITH_CODE (UmRealmServiceSkeleton, um_realm_service_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
+ G_ADD_PRIVATE (UmRealmServiceSkeleton)
+ G_IMPLEMENT_INTERFACE (UM_REALM_TYPE_SERVICE,
um_realm_service_skeleton_iface_init));
+
+#else
+G_DEFINE_TYPE_WITH_CODE (UmRealmServiceSkeleton, um_realm_service_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
+ G_IMPLEMENT_INTERFACE (UM_REALM_TYPE_SERVICE,
um_realm_service_skeleton_iface_init));
+
+#endif
+static void
+um_realm_service_skeleton_finalize (GObject *object)
+{
+ UmRealmServiceSkeleton *skeleton = UM_REALM_SERVICE_SKELETON (object);
+ g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
+ if (skeleton->priv->changed_properties_idle_source != NULL)
+ g_source_destroy (skeleton->priv->changed_properties_idle_source);
+ g_main_context_unref (skeleton->priv->context);
+ g_mutex_clear (&skeleton->priv->lock);
+ G_OBJECT_CLASS (um_realm_service_skeleton_parent_class)->finalize (object);
+}
+
+static void
+um_realm_service_skeleton_init (UmRealmServiceSkeleton *skeleton)
+{
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+ skeleton->priv = um_realm_service_skeleton_get_instance_private (skeleton);
+#else
+ skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, UM_REALM_TYPE_SERVICE_SKELETON,
UmRealmServiceSkeletonPrivate);
+#endif
+
+ g_mutex_init (&skeleton->priv->lock);
+ skeleton->priv->context = g_main_context_ref_thread_default ();
+}
+
+static void
+um_realm_service_skeleton_class_init (UmRealmServiceSkeletonClass *klass)
+{
+ GObjectClass *gobject_class;
+ GDBusInterfaceSkeletonClass *skeleton_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gobject_class->finalize = um_realm_service_skeleton_finalize;
+
+ skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);
+ skeleton_class->get_info = um_realm_service_skeleton_dbus_interface_get_info;
+ skeleton_class->get_properties = um_realm_service_skeleton_dbus_interface_get_properties;
+ skeleton_class->flush = um_realm_service_skeleton_dbus_interface_flush;
+ skeleton_class->get_vtable = um_realm_service_skeleton_dbus_interface_get_vtable;
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+ g_type_class_add_private (klass, sizeof (UmRealmServiceSkeletonPrivate));
+#endif
+}
+
+static void
+um_realm_service_skeleton_iface_init (UmRealmServiceIface *iface)
+{
+ iface->diagnostics = _um_realm_service_on_signal_diagnostics;
+}
+
+/**
+ * um_realm_service_skeleton_new:
+ *
+ * Creates a skeleton object for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Service.top_of_page">org.freedesktop.realmd.Service</link>.
+ *
+ * Returns: (transfer full) (type UmRealmServiceSkeleton): The skeleton object.
+ */
+UmRealmService *
+um_realm_service_skeleton_new (void)
+{
+ return UM_REALM_SERVICE (g_object_new (UM_REALM_TYPE_SERVICE_SKELETON, NULL));
+}
+
+/* ------------------------------------------------------------------------
+ * Code for interface org.freedesktop.realmd.Realm
+ * ------------------------------------------------------------------------
+ */
+
+/**
+ * SECTION:UmRealmCommon
+ * @title: UmRealmCommon
+ * @short_description: Generated C code for the org.freedesktop.realmd.Realm D-Bus interface
+ *
+ * This section contains code for working with the <link
linkend="gdbus-interface-org-freedesktop-realmd-Realm.top_of_page">org.freedesktop.realmd.Realm</link> D-Bus
interface in C.
+ */
+
+/* ---- Introspection data for org.freedesktop.realmd.Realm ---- */
+
+static const _ExtendedGDBusArgInfo _um_realm_common_method_info_deconfigure_IN_ARG_options =
+{
+ {
+ -1,
+ (gchar *) "options",
+ (gchar *) "a{sv}",
+ NULL
+ },
+ FALSE
+};
+
+static const _ExtendedGDBusArgInfo * const _um_realm_common_method_info_deconfigure_IN_ARG_pointers[] =
+{
+ &_um_realm_common_method_info_deconfigure_IN_ARG_options,
+ NULL
+};
+
+static const _ExtendedGDBusMethodInfo _um_realm_common_method_info_deconfigure =
+{
+ {
+ -1,
+ (gchar *) "Deconfigure",
+ (GDBusArgInfo **) &_um_realm_common_method_info_deconfigure_IN_ARG_pointers,
+ NULL,
+ NULL
+ },
+ "handle-deconfigure",
+ FALSE
+};
+
+static const _ExtendedGDBusArgInfo _um_realm_common_method_info_change_login_policy_IN_ARG_login_policy =
+{
+ {
+ -1,
+ (gchar *) "login_policy",
+ (gchar *) "s",
+ NULL
+ },
+ FALSE
+};
+
+static const _ExtendedGDBusArgInfo _um_realm_common_method_info_change_login_policy_IN_ARG_permitted_add =
+{
+ {
+ -1,
+ (gchar *) "permitted_add",
+ (gchar *) "as",
+ NULL
+ },
+ FALSE
+};
+
+static const _ExtendedGDBusArgInfo _um_realm_common_method_info_change_login_policy_IN_ARG_permitted_remove =
+{
+ {
+ -1,
+ (gchar *) "permitted_remove",
+ (gchar *) "as",
+ NULL
+ },
+ FALSE
+};
+
+static const _ExtendedGDBusArgInfo _um_realm_common_method_info_change_login_policy_IN_ARG_options =
+{
+ {
+ -1,
+ (gchar *) "options",
+ (gchar *) "a{sv}",
+ NULL
+ },
+ FALSE
+};
+
+static const _ExtendedGDBusArgInfo * const
_um_realm_common_method_info_change_login_policy_IN_ARG_pointers[] =
+{
+ &_um_realm_common_method_info_change_login_policy_IN_ARG_login_policy,
+ &_um_realm_common_method_info_change_login_policy_IN_ARG_permitted_add,
+ &_um_realm_common_method_info_change_login_policy_IN_ARG_permitted_remove,
+ &_um_realm_common_method_info_change_login_policy_IN_ARG_options,
+ NULL
+};
+
+static const _ExtendedGDBusMethodInfo _um_realm_common_method_info_change_login_policy =
+{
+ {
+ -1,
+ (gchar *) "ChangeLoginPolicy",
+ (GDBusArgInfo **) &_um_realm_common_method_info_change_login_policy_IN_ARG_pointers,
+ NULL,
+ NULL
+ },
+ "handle-change-login-policy",
+ FALSE
+};
+
+static const _ExtendedGDBusMethodInfo * const _um_realm_common_method_info_pointers[] =
+{
+ &_um_realm_common_method_info_deconfigure,
+ &_um_realm_common_method_info_change_login_policy,
+ NULL
+};
+
+static const _ExtendedGDBusPropertyInfo _um_realm_common_property_info_name =
+{
+ {
+ -1,
+ (gchar *) "Name",
+ (gchar *) "s",
+ G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+ NULL
+ },
+ "name",
+ FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _um_realm_common_property_info_configured =
+{
+ {
+ -1,
+ (gchar *) "Configured",
+ (gchar *) "s",
+ G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+ NULL
+ },
+ "configured",
+ FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _um_realm_common_property_info_supported_interfaces =
+{
+ {
+ -1,
+ (gchar *) "SupportedInterfaces",
+ (gchar *) "as",
+ G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+ NULL
+ },
+ "supported-interfaces",
+ FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _um_realm_common_property_info_details =
+{
+ {
+ -1,
+ (gchar *) "Details",
+ (gchar *) "a(ss)",
+ G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+ NULL
+ },
+ "details",
+ FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _um_realm_common_property_info_login_formats =
+{
+ {
+ -1,
+ (gchar *) "LoginFormats",
+ (gchar *) "as",
+ G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+ NULL
+ },
+ "login-formats",
+ FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _um_realm_common_property_info_login_policy =
+{
+ {
+ -1,
+ (gchar *) "LoginPolicy",
+ (gchar *) "s",
+ G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+ NULL
+ },
+ "login-policy",
+ FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _um_realm_common_property_info_permitted_logins =
+{
+ {
+ -1,
+ (gchar *) "PermittedLogins",
+ (gchar *) "as",
+ G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+ NULL
+ },
+ "permitted-logins",
+ FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo * const _um_realm_common_property_info_pointers[] =
+{
+ &_um_realm_common_property_info_name,
+ &_um_realm_common_property_info_configured,
+ &_um_realm_common_property_info_supported_interfaces,
+ &_um_realm_common_property_info_details,
+ &_um_realm_common_property_info_login_formats,
+ &_um_realm_common_property_info_login_policy,
+ &_um_realm_common_property_info_permitted_logins,
+ NULL
+};
+
+static const _ExtendedGDBusInterfaceInfo _um_realm_common_interface_info =
+{
+ {
+ -1,
+ (gchar *) "org.freedesktop.realmd.Realm",
+ (GDBusMethodInfo **) &_um_realm_common_method_info_pointers,
+ NULL,
+ (GDBusPropertyInfo **) &_um_realm_common_property_info_pointers,
+ NULL
+ },
+ "common",
+};
+
+
+/**
+ * um_realm_common_interface_info:
+ *
+ * Gets a machine-readable description of the <link
linkend="gdbus-interface-org-freedesktop-realmd-Realm.top_of_page">org.freedesktop.realmd.Realm</link> D-Bus
interface.
+ *
+ * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free.
+ */
+GDBusInterfaceInfo *
+um_realm_common_interface_info (void)
+{
+ return (GDBusInterfaceInfo *) &_um_realm_common_interface_info.parent_struct;
+}
+
+/**
+ * um_realm_common_override_properties:
+ * @klass: The class structure for a #GObject<!-- -->-derived class.
+ * @property_id_begin: The property id to assign to the first overridden property.
+ *
+ * Overrides all #GObject properties in the #UmRealmCommon interface for a concrete class.
+ * The properties are overridden in the order they are defined.
+ *
+ * Returns: The last property id.
+ */
+guint
+um_realm_common_override_properties (GObjectClass *klass, guint property_id_begin)
+{
+ g_object_class_override_property (klass, property_id_begin++, "name");
+ g_object_class_override_property (klass, property_id_begin++, "configured");
+ g_object_class_override_property (klass, property_id_begin++, "supported-interfaces");
+ g_object_class_override_property (klass, property_id_begin++, "details");
+ g_object_class_override_property (klass, property_id_begin++, "login-formats");
+ g_object_class_override_property (klass, property_id_begin++, "login-policy");
+ g_object_class_override_property (klass, property_id_begin++, "permitted-logins");
+ return property_id_begin - 1;
+}
+
+
+
+/**
+ * UmRealmCommon:
+ *
+ * Abstract interface type for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Realm.top_of_page">org.freedesktop.realmd.Realm</link>.
+ */
+
+/**
+ * UmRealmCommonIface:
+ * @parent_iface: The parent interface.
+ * @handle_change_login_policy: Handler for the #UmRealmCommon::handle-change-login-policy signal.
+ * @handle_deconfigure: Handler for the #UmRealmCommon::handle-deconfigure signal.
+ * @get_configured: Getter for the #UmRealmCommon:configured property.
+ * @get_details: Getter for the #UmRealmCommon:details property.
+ * @get_login_formats: Getter for the #UmRealmCommon:login-formats property.
+ * @get_login_policy: Getter for the #UmRealmCommon:login-policy property.
+ * @get_name: Getter for the #UmRealmCommon:name property.
+ * @get_permitted_logins: Getter for the #UmRealmCommon:permitted-logins property.
+ * @get_supported_interfaces: Getter for the #UmRealmCommon:supported-interfaces property.
+ *
+ * Virtual table for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Realm.top_of_page">org.freedesktop.realmd.Realm</link>.
+ */
+
+typedef UmRealmCommonIface UmRealmCommonInterface;
+G_DEFINE_INTERFACE (UmRealmCommon, um_realm_common, G_TYPE_OBJECT);
+
+static void
+um_realm_common_default_init (UmRealmCommonIface *iface)
+{
+ /* GObject signals for incoming D-Bus method calls: */
+ /**
+ * UmRealmCommon::handle-deconfigure:
+ * @object: A #UmRealmCommon.
+ * @invocation: A #GDBusMethodInvocation.
+ * @arg_options: Argument passed by remote caller.
+ *
+ * Signal emitted when a remote caller is invoking the <link
linkend="gdbus-method-org-freedesktop-realmd-Realm.Deconfigure">Deconfigure()</link> D-Bus method.
+ *
+ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a
reference to @invocation and eventually call um_realm_common_complete_deconfigure() or e.g.
g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler
handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+ *
+ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+ */
+ g_signal_new ("handle-deconfigure",
+ G_TYPE_FROM_INTERFACE (iface),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (UmRealmCommonIface, handle_deconfigure),
+ g_signal_accumulator_true_handled,
+ NULL,
+ g_cclosure_marshal_generic,
+ G_TYPE_BOOLEAN,
+ 2,
+ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_VARIANT);
+
+ /**
+ * UmRealmCommon::handle-change-login-policy:
+ * @object: A #UmRealmCommon.
+ * @invocation: A #GDBusMethodInvocation.
+ * @arg_login_policy: Argument passed by remote caller.
+ * @arg_permitted_add: Argument passed by remote caller.
+ * @arg_permitted_remove: Argument passed by remote caller.
+ * @arg_options: Argument passed by remote caller.
+ *
+ * Signal emitted when a remote caller is invoking the <link
linkend="gdbus-method-org-freedesktop-realmd-Realm.ChangeLoginPolicy">ChangeLoginPolicy()</link> D-Bus method.
+ *
+ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a
reference to @invocation and eventually call um_realm_common_complete_change_login_policy() or e.g.
g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler
handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+ *
+ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+ */
+ g_signal_new ("handle-change-login-policy",
+ G_TYPE_FROM_INTERFACE (iface),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (UmRealmCommonIface, handle_change_login_policy),
+ g_signal_accumulator_true_handled,
+ NULL,
+ g_cclosure_marshal_generic,
+ G_TYPE_BOOLEAN,
+ 5,
+ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_STRING, G_TYPE_STRV, G_TYPE_STRV, G_TYPE_VARIANT);
+
+ /* GObject properties for D-Bus properties: */
+ /**
+ * UmRealmCommon:name:
+ *
+ * Represents the D-Bus property <link
linkend="gdbus-property-org-freedesktop-realmd-Realm.Name">"Name"</link>.
+ *
+ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to
read from it on both the client- and service-side. It is only meaningful, however, to write to it on the
service-side.
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_string ("name", "Name", "Name", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * UmRealmCommon:configured:
+ *
+ * Represents the D-Bus property <link
linkend="gdbus-property-org-freedesktop-realmd-Realm.Configured">"Configured"</link>.
+ *
+ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to
read from it on both the client- and service-side. It is only meaningful, however, to write to it on the
service-side.
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_string ("configured", "Configured", "Configured", NULL, G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
+ /**
+ * UmRealmCommon:supported-interfaces:
+ *
+ * Represents the D-Bus property <link
linkend="gdbus-property-org-freedesktop-realmd-Realm.SupportedInterfaces">"SupportedInterfaces"</link>.
+ *
+ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to
read from it on both the client- and service-side. It is only meaningful, however, to write to it on the
service-side.
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_boxed ("supported-interfaces", "SupportedInterfaces", "SupportedInterfaces", G_TYPE_STRV,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * UmRealmCommon:details:
+ *
+ * Represents the D-Bus property <link
linkend="gdbus-property-org-freedesktop-realmd-Realm.Details">"Details"</link>.
+ *
+ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to
read from it on both the client- and service-side. It is only meaningful, however, to write to it on the
service-side.
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_variant ("details", "Details", "Details", G_VARIANT_TYPE ("a(ss)"), NULL, G_PARAM_READWRITE
| G_PARAM_STATIC_STRINGS));
+ /**
+ * UmRealmCommon:login-formats:
+ *
+ * Represents the D-Bus property <link
linkend="gdbus-property-org-freedesktop-realmd-Realm.LoginFormats">"LoginFormats"</link>.
+ *
+ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to
read from it on both the client- and service-side. It is only meaningful, however, to write to it on the
service-side.
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_boxed ("login-formats", "LoginFormats", "LoginFormats", G_TYPE_STRV, G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
+ /**
+ * UmRealmCommon:login-policy:
+ *
+ * Represents the D-Bus property <link
linkend="gdbus-property-org-freedesktop-realmd-Realm.LoginPolicy">"LoginPolicy"</link>.
+ *
+ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to
read from it on both the client- and service-side. It is only meaningful, however, to write to it on the
service-side.
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_string ("login-policy", "LoginPolicy", "LoginPolicy", NULL, G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
+ /**
+ * UmRealmCommon:permitted-logins:
+ *
+ * Represents the D-Bus property <link
linkend="gdbus-property-org-freedesktop-realmd-Realm.PermittedLogins">"PermittedLogins"</link>.
+ *
+ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to
read from it on both the client- and service-side. It is only meaningful, however, to write to it on the
service-side.
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_boxed ("permitted-logins", "PermittedLogins", "PermittedLogins", G_TYPE_STRV,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+}
+
+/**
+ * um_realm_common_get_name: (skip)
+ * @object: A #UmRealmCommon.
+ *
+ * Gets the value of the <link linkend="gdbus-property-org-freedesktop-realmd-Realm.Name">"Name"</link>
D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * <warning>The returned value is only valid until the property changes so on the client-side it is only
safe to use this function on the thread where @object was constructed. Use um_realm_common_dup_name() if on
another thread.</warning>
+ *
+ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the
returned value, it belongs to @object.
+ */
+const gchar *
+um_realm_common_get_name (UmRealmCommon *object)
+{
+ return UM_REALM_COMMON_GET_IFACE (object)->get_name (object);
+}
+
+/**
+ * um_realm_common_dup_name: (skip)
+ * @object: A #UmRealmCommon.
+ *
+ * Gets a copy of the <link linkend="gdbus-property-org-freedesktop-realmd-Realm.Name">"Name"</link> D-Bus
property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value
should be freed with g_free().
+ */
+gchar *
+um_realm_common_dup_name (UmRealmCommon *object)
+{
+ gchar *value;
+ g_object_get (G_OBJECT (object), "name", &value, NULL);
+ return value;
+}
+
+/**
+ * um_realm_common_set_name: (skip)
+ * @object: A #UmRealmCommon.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-freedesktop-realmd-Realm.Name">"Name"</link> D-Bus property to
@value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+um_realm_common_set_name (UmRealmCommon *object, const gchar *value)
+{
+ g_object_set (G_OBJECT (object), "name", value, NULL);
+}
+
+/**
+ * um_realm_common_get_configured: (skip)
+ * @object: A #UmRealmCommon.
+ *
+ * Gets the value of the <link
linkend="gdbus-property-org-freedesktop-realmd-Realm.Configured">"Configured"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * <warning>The returned value is only valid until the property changes so on the client-side it is only
safe to use this function on the thread where @object was constructed. Use um_realm_common_dup_configured()
if on another thread.</warning>
+ *
+ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the
returned value, it belongs to @object.
+ */
+const gchar *
+um_realm_common_get_configured (UmRealmCommon *object)
+{
+ return UM_REALM_COMMON_GET_IFACE (object)->get_configured (object);
+}
+
+/**
+ * um_realm_common_dup_configured: (skip)
+ * @object: A #UmRealmCommon.
+ *
+ * Gets a copy of the <link
linkend="gdbus-property-org-freedesktop-realmd-Realm.Configured">"Configured"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value
should be freed with g_free().
+ */
+gchar *
+um_realm_common_dup_configured (UmRealmCommon *object)
+{
+ gchar *value;
+ g_object_get (G_OBJECT (object), "configured", &value, NULL);
+ return value;
+}
+
+/**
+ * um_realm_common_set_configured: (skip)
+ * @object: A #UmRealmCommon.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-freedesktop-realmd-Realm.Configured">"Configured"</link> D-Bus
property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+um_realm_common_set_configured (UmRealmCommon *object, const gchar *value)
+{
+ g_object_set (G_OBJECT (object), "configured", value, NULL);
+}
+
+/**
+ * um_realm_common_get_supported_interfaces: (skip)
+ * @object: A #UmRealmCommon.
+ *
+ * Gets the value of the <link
linkend="gdbus-property-org-freedesktop-realmd-Realm.SupportedInterfaces">"SupportedInterfaces"</link> D-Bus
property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * <warning>The returned value is only valid until the property changes so on the client-side it is only
safe to use this function on the thread where @object was constructed. Use
um_realm_common_dup_supported_interfaces() if on another thread.</warning>
+ *
+ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the
returned value, it belongs to @object.
+ */
+const gchar *const *
+um_realm_common_get_supported_interfaces (UmRealmCommon *object)
+{
+ return UM_REALM_COMMON_GET_IFACE (object)->get_supported_interfaces (object);
+}
+
+/**
+ * um_realm_common_dup_supported_interfaces: (skip)
+ * @object: A #UmRealmCommon.
+ *
+ * Gets a copy of the <link
linkend="gdbus-property-org-freedesktop-realmd-Realm.SupportedInterfaces">"SupportedInterfaces"</link> D-Bus
property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value
should be freed with g_strfreev().
+ */
+gchar **
+um_realm_common_dup_supported_interfaces (UmRealmCommon *object)
+{
+ gchar **value;
+ g_object_get (G_OBJECT (object), "supported-interfaces", &value, NULL);
+ return value;
+}
+
+/**
+ * um_realm_common_set_supported_interfaces: (skip)
+ * @object: A #UmRealmCommon.
+ * @value: The value to set.
+ *
+ * Sets the <link
linkend="gdbus-property-org-freedesktop-realmd-Realm.SupportedInterfaces">"SupportedInterfaces"</link> D-Bus
property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+um_realm_common_set_supported_interfaces (UmRealmCommon *object, const gchar *const *value)
+{
+ g_object_set (G_OBJECT (object), "supported-interfaces", value, NULL);
+}
+
+/**
+ * um_realm_common_get_details: (skip)
+ * @object: A #UmRealmCommon.
+ *
+ * Gets the value of the <link
linkend="gdbus-property-org-freedesktop-realmd-Realm.Details">"Details"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * <warning>The returned value is only valid until the property changes so on the client-side it is only
safe to use this function on the thread where @object was constructed. Use um_realm_common_dup_details() if
on another thread.</warning>
+ *
+ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the
returned value, it belongs to @object.
+ */
+GVariant *
+um_realm_common_get_details (UmRealmCommon *object)
+{
+ return UM_REALM_COMMON_GET_IFACE (object)->get_details (object);
+}
+
+/**
+ * um_realm_common_dup_details: (skip)
+ * @object: A #UmRealmCommon.
+ *
+ * Gets a copy of the <link linkend="gdbus-property-org-freedesktop-realmd-Realm.Details">"Details"</link>
D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value
should be freed with g_variant_unref().
+ */
+GVariant *
+um_realm_common_dup_details (UmRealmCommon *object)
+{
+ GVariant *value;
+ g_object_get (G_OBJECT (object), "details", &value, NULL);
+ return value;
+}
+
+/**
+ * um_realm_common_set_details: (skip)
+ * @object: A #UmRealmCommon.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-freedesktop-realmd-Realm.Details">"Details"</link> D-Bus
property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+um_realm_common_set_details (UmRealmCommon *object, GVariant *value)
+{
+ g_object_set (G_OBJECT (object), "details", value, NULL);
+}
+
+/**
+ * um_realm_common_get_login_formats: (skip)
+ * @object: A #UmRealmCommon.
+ *
+ * Gets the value of the <link
linkend="gdbus-property-org-freedesktop-realmd-Realm.LoginFormats">"LoginFormats"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * <warning>The returned value is only valid until the property changes so on the client-side it is only
safe to use this function on the thread where @object was constructed. Use
um_realm_common_dup_login_formats() if on another thread.</warning>
+ *
+ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the
returned value, it belongs to @object.
+ */
+const gchar *const *
+um_realm_common_get_login_formats (UmRealmCommon *object)
+{
+ return UM_REALM_COMMON_GET_IFACE (object)->get_login_formats (object);
+}
+
+/**
+ * um_realm_common_dup_login_formats: (skip)
+ * @object: A #UmRealmCommon.
+ *
+ * Gets a copy of the <link
linkend="gdbus-property-org-freedesktop-realmd-Realm.LoginFormats">"LoginFormats"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value
should be freed with g_strfreev().
+ */
+gchar **
+um_realm_common_dup_login_formats (UmRealmCommon *object)
+{
+ gchar **value;
+ g_object_get (G_OBJECT (object), "login-formats", &value, NULL);
+ return value;
+}
+
+/**
+ * um_realm_common_set_login_formats: (skip)
+ * @object: A #UmRealmCommon.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-freedesktop-realmd-Realm.LoginFormats">"LoginFormats"</link>
D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+um_realm_common_set_login_formats (UmRealmCommon *object, const gchar *const *value)
+{
+ g_object_set (G_OBJECT (object), "login-formats", value, NULL);
+}
+
+/**
+ * um_realm_common_get_login_policy: (skip)
+ * @object: A #UmRealmCommon.
+ *
+ * Gets the value of the <link
linkend="gdbus-property-org-freedesktop-realmd-Realm.LoginPolicy">"LoginPolicy"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * <warning>The returned value is only valid until the property changes so on the client-side it is only
safe to use this function on the thread where @object was constructed. Use um_realm_common_dup_login_policy()
if on another thread.</warning>
+ *
+ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the
returned value, it belongs to @object.
+ */
+const gchar *
+um_realm_common_get_login_policy (UmRealmCommon *object)
+{
+ return UM_REALM_COMMON_GET_IFACE (object)->get_login_policy (object);
+}
+
+/**
+ * um_realm_common_dup_login_policy: (skip)
+ * @object: A #UmRealmCommon.
+ *
+ * Gets a copy of the <link
linkend="gdbus-property-org-freedesktop-realmd-Realm.LoginPolicy">"LoginPolicy"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value
should be freed with g_free().
+ */
+gchar *
+um_realm_common_dup_login_policy (UmRealmCommon *object)
+{
+ gchar *value;
+ g_object_get (G_OBJECT (object), "login-policy", &value, NULL);
+ return value;
+}
+
+/**
+ * um_realm_common_set_login_policy: (skip)
+ * @object: A #UmRealmCommon.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-freedesktop-realmd-Realm.LoginPolicy">"LoginPolicy"</link>
D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+um_realm_common_set_login_policy (UmRealmCommon *object, const gchar *value)
+{
+ g_object_set (G_OBJECT (object), "login-policy", value, NULL);
+}
+
+/**
+ * um_realm_common_get_permitted_logins: (skip)
+ * @object: A #UmRealmCommon.
+ *
+ * Gets the value of the <link
linkend="gdbus-property-org-freedesktop-realmd-Realm.PermittedLogins">"PermittedLogins"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * <warning>The returned value is only valid until the property changes so on the client-side it is only
safe to use this function on the thread where @object was constructed. Use
um_realm_common_dup_permitted_logins() if on another thread.</warning>
+ *
+ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the
returned value, it belongs to @object.
+ */
+const gchar *const *
+um_realm_common_get_permitted_logins (UmRealmCommon *object)
+{
+ return UM_REALM_COMMON_GET_IFACE (object)->get_permitted_logins (object);
+}
+
+/**
+ * um_realm_common_dup_permitted_logins: (skip)
+ * @object: A #UmRealmCommon.
+ *
+ * Gets a copy of the <link
linkend="gdbus-property-org-freedesktop-realmd-Realm.PermittedLogins">"PermittedLogins"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value
should be freed with g_strfreev().
+ */
+gchar **
+um_realm_common_dup_permitted_logins (UmRealmCommon *object)
+{
+ gchar **value;
+ g_object_get (G_OBJECT (object), "permitted-logins", &value, NULL);
+ return value;
+}
+
+/**
+ * um_realm_common_set_permitted_logins: (skip)
+ * @object: A #UmRealmCommon.
+ * @value: The value to set.
+ *
+ * Sets the <link
linkend="gdbus-property-org-freedesktop-realmd-Realm.PermittedLogins">"PermittedLogins"</link> D-Bus property
to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+um_realm_common_set_permitted_logins (UmRealmCommon *object, const gchar *const *value)
+{
+ g_object_set (G_OBJECT (object), "permitted-logins", value, NULL);
+}
+
+/**
+ * um_realm_common_call_deconfigure:
+ * @proxy: A #UmRealmCommonProxy.
+ * @arg_options: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link
linkend="gdbus-method-org-freedesktop-realmd-Realm.Deconfigure">Deconfigure()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling
this method from.
+ * You can then call um_realm_common_call_deconfigure_finish() to get the result of the operation.
+ *
+ * See um_realm_common_call_deconfigure_sync() for the synchronous, blocking version of this method.
+ */
+void
+um_realm_common_call_deconfigure (
+ UmRealmCommon *proxy,
+ GVariant *arg_options,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+ "Deconfigure",
+ g_variant_new ("(@a{sv})",
+ arg_options),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ cancellable,
+ callback,
+ user_data);
+}
+
+/**
+ * um_realm_common_call_deconfigure_finish:
+ * @proxy: A #UmRealmCommonProxy.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to
um_realm_common_call_deconfigure().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with um_realm_common_call_deconfigure().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+um_realm_common_call_deconfigure_finish (
+ UmRealmCommon *proxy,
+ GAsyncResult *res,
+ GError **error)
+{
+ GVariant *_ret;
+ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+ if (_ret == NULL)
+ goto _out;
+ g_variant_get (_ret,
+ "()");
+ g_variant_unref (_ret);
+_out:
+ return _ret != NULL;
+}
+
+/**
+ * um_realm_common_call_deconfigure_sync:
+ * @proxy: A #UmRealmCommonProxy.
+ * @arg_options: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link
linkend="gdbus-method-org-freedesktop-realmd-Realm.Deconfigure">Deconfigure()</link> D-Bus method on @proxy.
The calling thread is blocked until a reply is received.
+ *
+ * See um_realm_common_call_deconfigure() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+um_realm_common_call_deconfigure_sync (
+ UmRealmCommon *proxy,
+ GVariant *arg_options,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GVariant *_ret;
+ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+ "Deconfigure",
+ g_variant_new ("(@a{sv})",
+ arg_options),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ cancellable,
+ error);
+ if (_ret == NULL)
+ goto _out;
+ g_variant_get (_ret,
+ "()");
+ g_variant_unref (_ret);
+_out:
+ return _ret != NULL;
+}
+
+/**
+ * um_realm_common_call_change_login_policy:
+ * @proxy: A #UmRealmCommonProxy.
+ * @arg_login_policy: Argument to pass with the method invocation.
+ * @arg_permitted_add: Argument to pass with the method invocation.
+ * @arg_permitted_remove: Argument to pass with the method invocation.
+ * @arg_options: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link
linkend="gdbus-method-org-freedesktop-realmd-Realm.ChangeLoginPolicy">ChangeLoginPolicy()</link> D-Bus method
on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling
this method from.
+ * You can then call um_realm_common_call_change_login_policy_finish() to get the result of the operation.
+ *
+ * See um_realm_common_call_change_login_policy_sync() for the synchronous, blocking version of this method.
+ */
+void
+um_realm_common_call_change_login_policy (
+ UmRealmCommon *proxy,
+ const gchar *arg_login_policy,
+ const gchar *const *arg_permitted_add,
+ const gchar *const *arg_permitted_remove,
+ GVariant *arg_options,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+ "ChangeLoginPolicy",
+ g_variant_new ("(s^as^as a{sv})",
+ arg_login_policy,
+ arg_permitted_add,
+ arg_permitted_remove,
+ arg_options),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ cancellable,
+ callback,
+ user_data);
+}
+
+/**
+ * um_realm_common_call_change_login_policy_finish:
+ * @proxy: A #UmRealmCommonProxy.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to
um_realm_common_call_change_login_policy().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with um_realm_common_call_change_login_policy().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+um_realm_common_call_change_login_policy_finish (
+ UmRealmCommon *proxy,
+ GAsyncResult *res,
+ GError **error)
+{
+ GVariant *_ret;
+ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+ if (_ret == NULL)
+ goto _out;
+ g_variant_get (_ret,
+ "()");
+ g_variant_unref (_ret);
+_out:
+ return _ret != NULL;
+}
+
+/**
+ * um_realm_common_call_change_login_policy_sync:
+ * @proxy: A #UmRealmCommonProxy.
+ * @arg_login_policy: Argument to pass with the method invocation.
+ * @arg_permitted_add: Argument to pass with the method invocation.
+ * @arg_permitted_remove: Argument to pass with the method invocation.
+ * @arg_options: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link
linkend="gdbus-method-org-freedesktop-realmd-Realm.ChangeLoginPolicy">ChangeLoginPolicy()</link> D-Bus method
on @proxy. The calling thread is blocked until a reply is received.
+ *
+ * See um_realm_common_call_change_login_policy() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+um_realm_common_call_change_login_policy_sync (
+ UmRealmCommon *proxy,
+ const gchar *arg_login_policy,
+ const gchar *const *arg_permitted_add,
+ const gchar *const *arg_permitted_remove,
+ GVariant *arg_options,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GVariant *_ret;
+ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+ "ChangeLoginPolicy",
+ g_variant_new ("(s^as^as a{sv})",
+ arg_login_policy,
+ arg_permitted_add,
+ arg_permitted_remove,
+ arg_options),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ cancellable,
+ error);
+ if (_ret == NULL)
+ goto _out;
+ g_variant_get (_ret,
+ "()");
+ g_variant_unref (_ret);
+_out:
+ return _ret != NULL;
+}
+
+/**
+ * um_realm_common_complete_deconfigure:
+ * @object: A #UmRealmCommon.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link
linkend="gdbus-method-org-freedesktop-realmd-Realm.Deconfigure">Deconfigure()</link> D-Bus method. If you
instead want to finish handling an invocation by returning an error, use
g_dbus_method_invocation_return_error() or similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+um_realm_common_complete_deconfigure (
+ UmRealmCommon *object,
+ GDBusMethodInvocation *invocation)
+{
+ g_dbus_method_invocation_return_value (invocation,
+ g_variant_new ("()"));
+}
+
+/**
+ * um_realm_common_complete_change_login_policy:
+ * @object: A #UmRealmCommon.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link
linkend="gdbus-method-org-freedesktop-realmd-Realm.ChangeLoginPolicy">ChangeLoginPolicy()</link> D-Bus
method. If you instead want to finish handling an invocation by returning an error, use
g_dbus_method_invocation_return_error() or similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+um_realm_common_complete_change_login_policy (
+ UmRealmCommon *object,
+ GDBusMethodInvocation *invocation)
+{
+ g_dbus_method_invocation_return_value (invocation,
+ g_variant_new ("()"));
+}
+
+/* ------------------------------------------------------------------------ */
+
+/**
+ * UmRealmCommonProxy:
+ *
+ * The #UmRealmCommonProxy structure contains only private data and should only be accessed using the
provided API.
+ */
+
+/**
+ * UmRealmCommonProxyClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #UmRealmCommonProxy.
+ */
+
+struct _UmRealmCommonProxyPrivate
+{
+ GData *qdata;
+};
+
+static void um_realm_common_proxy_iface_init (UmRealmCommonIface *iface);
+
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+G_DEFINE_TYPE_WITH_CODE (UmRealmCommonProxy, um_realm_common_proxy, G_TYPE_DBUS_PROXY,
+ G_ADD_PRIVATE (UmRealmCommonProxy)
+ G_IMPLEMENT_INTERFACE (UM_REALM_TYPE_COMMON, um_realm_common_proxy_iface_init));
+
+#else
+G_DEFINE_TYPE_WITH_CODE (UmRealmCommonProxy, um_realm_common_proxy, G_TYPE_DBUS_PROXY,
+ G_IMPLEMENT_INTERFACE (UM_REALM_TYPE_COMMON, um_realm_common_proxy_iface_init));
+
+#endif
+static void
+um_realm_common_proxy_finalize (GObject *object)
+{
+ UmRealmCommonProxy *proxy = UM_REALM_COMMON_PROXY (object);
+ g_datalist_clear (&proxy->priv->qdata);
+ G_OBJECT_CLASS (um_realm_common_proxy_parent_class)->finalize (object);
+}
+
+static void
+um_realm_common_proxy_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec G_GNUC_UNUSED)
+{
+ const _ExtendedGDBusPropertyInfo *info;
+ GVariant *variant;
+ g_assert (prop_id != 0 && prop_id - 1 < 7);
+ info = _um_realm_common_property_info_pointers[prop_id - 1];
+ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (object), info->parent_struct.name);
+ if (info->use_gvariant)
+ {
+ g_value_set_variant (value, variant);
+ }
+ else
+ {
+ if (variant != NULL)
+ g_dbus_gvariant_to_gvalue (variant, value);
+ }
+ if (variant != NULL)
+ g_variant_unref (variant);
+}
+
+static void
+um_realm_common_proxy_set_property_cb (GDBusProxy *proxy,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ const _ExtendedGDBusPropertyInfo *info = user_data;
+ GError *error;
+ GVariant *_ret;
+ error = NULL;
+ _ret = g_dbus_proxy_call_finish (proxy, res, &error);
+ if (!_ret)
+ {
+ g_warning ("Error setting property '%s' on interface org.freedesktop.realmd.Realm: %s (%s, %d)",
+ info->parent_struct.name,
+ error->message, g_quark_to_string (error->domain), error->code);
+ g_error_free (error);
+ }
+ else
+ {
+ g_variant_unref (_ret);
+ }
+}
+
+static void
+um_realm_common_proxy_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec G_GNUC_UNUSED)
+{
+ const _ExtendedGDBusPropertyInfo *info;
+ GVariant *variant;
+ g_assert (prop_id != 0 && prop_id - 1 < 7);
+ info = _um_realm_common_property_info_pointers[prop_id - 1];
+ variant = g_dbus_gvalue_to_gvariant (value, G_VARIANT_TYPE (info->parent_struct.signature));
+ g_dbus_proxy_call (G_DBUS_PROXY (object),
+ "org.freedesktop.DBus.Properties.Set",
+ g_variant_new ("(ssv)", "org.freedesktop.realmd.Realm", info->parent_struct.name, variant),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL, (GAsyncReadyCallback) um_realm_common_proxy_set_property_cb, (GDBusPropertyInfo *)
&info->parent_struct);
+ g_variant_unref (variant);
+}
+
+static void
+um_realm_common_proxy_g_signal (GDBusProxy *proxy,
+ const gchar *sender_name G_GNUC_UNUSED,
+ const gchar *signal_name,
+ GVariant *parameters)
+{
+ _ExtendedGDBusSignalInfo *info;
+ GVariantIter iter;
+ GVariant *child;
+ GValue *paramv;
+ guint num_params;
+ guint n;
+ guint signal_id;
+ info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *)
&_um_realm_common_interface_info.parent_struct, signal_name);
+ if (info == NULL)
+ return;
+ num_params = g_variant_n_children (parameters);
+ paramv = g_new0 (GValue, num_params + 1);
+ g_value_init (¶mv[0], UM_REALM_TYPE_COMMON);
+ g_value_set_object (¶mv[0], proxy);
+ g_variant_iter_init (&iter, parameters);
+ n = 1;
+ while ((child = g_variant_iter_next_value (&iter)) != NULL)
+ {
+ _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1];
+ if (arg_info->use_gvariant)
+ {
+ g_value_init (¶mv[n], G_TYPE_VARIANT);
+ g_value_set_variant (¶mv[n], child);
+ n++;
+ }
+ else
+ g_dbus_gvariant_to_gvalue (child, ¶mv[n++]);
+ g_variant_unref (child);
+ }
+ signal_id = g_signal_lookup (info->signal_name, UM_REALM_TYPE_COMMON);
+ g_signal_emitv (paramv, signal_id, 0, NULL);
+ for (n = 0; n < num_params + 1; n++)
+ g_value_unset (¶mv[n]);
+ g_free (paramv);
+}
+
+static void
+um_realm_common_proxy_g_properties_changed (GDBusProxy *_proxy,
+ GVariant *changed_properties,
+ const gchar *const *invalidated_properties)
+{
+ UmRealmCommonProxy *proxy = UM_REALM_COMMON_PROXY (_proxy);
+ guint n;
+ const gchar *key;
+ GVariantIter *iter;
+ _ExtendedGDBusPropertyInfo *info;
+ g_variant_get (changed_properties, "a{sv}", &iter);
+ while (g_variant_iter_next (iter, "{&sv}", &key, NULL))
+ {
+ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *)
&_um_realm_common_interface_info.parent_struct, key);
+ g_datalist_remove_data (&proxy->priv->qdata, key);
+ if (info != NULL)
+ g_object_notify (G_OBJECT (proxy), info->hyphen_name);
+ }
+ g_variant_iter_free (iter);
+ for (n = 0; invalidated_properties[n] != NULL; n++)
+ {
+ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *)
&_um_realm_common_interface_info.parent_struct, invalidated_properties[n]);
+ g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]);
+ if (info != NULL)
+ g_object_notify (G_OBJECT (proxy), info->hyphen_name);
+ }
+}
+
+static const gchar *
+um_realm_common_proxy_get_name (UmRealmCommon *object)
+{
+ UmRealmCommonProxy *proxy = UM_REALM_COMMON_PROXY (object);
+ GVariant *variant;
+ const gchar *value = NULL;
+ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Name");
+ if (variant != NULL)
+ {
+ value = g_variant_get_string (variant, NULL);
+ g_variant_unref (variant);
+ }
+ return value;
+}
+
+static const gchar *
+um_realm_common_proxy_get_configured (UmRealmCommon *object)
+{
+ UmRealmCommonProxy *proxy = UM_REALM_COMMON_PROXY (object);
+ GVariant *variant;
+ const gchar *value = NULL;
+ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Configured");
+ if (variant != NULL)
+ {
+ value = g_variant_get_string (variant, NULL);
+ g_variant_unref (variant);
+ }
+ return value;
+}
+
+static const gchar *const *
+um_realm_common_proxy_get_supported_interfaces (UmRealmCommon *object)
+{
+ UmRealmCommonProxy *proxy = UM_REALM_COMMON_PROXY (object);
+ GVariant *variant;
+ const gchar *const *value = NULL;
+ value = g_datalist_get_data (&proxy->priv->qdata, "SupportedInterfaces");
+ if (value != NULL)
+ return value;
+ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "SupportedInterfaces");
+ if (variant != NULL)
+ {
+ value = g_variant_get_strv (variant, NULL);
+ g_datalist_set_data_full (&proxy->priv->qdata, "SupportedInterfaces", (gpointer) value, g_free);
+ g_variant_unref (variant);
+ }
+ return value;
+}
+
+static GVariant *
+um_realm_common_proxy_get_details (UmRealmCommon *object)
+{
+ UmRealmCommonProxy *proxy = UM_REALM_COMMON_PROXY (object);
+ GVariant *variant;
+ GVariant *value = NULL;
+ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "Details");
+ value = variant;
+ if (variant != NULL)
+ g_variant_unref (variant);
+ return value;
+}
+
+static const gchar *const *
+um_realm_common_proxy_get_login_formats (UmRealmCommon *object)
+{
+ UmRealmCommonProxy *proxy = UM_REALM_COMMON_PROXY (object);
+ GVariant *variant;
+ const gchar *const *value = NULL;
+ value = g_datalist_get_data (&proxy->priv->qdata, "LoginFormats");
+ if (value != NULL)
+ return value;
+ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "LoginFormats");
+ if (variant != NULL)
+ {
+ value = g_variant_get_strv (variant, NULL);
+ g_datalist_set_data_full (&proxy->priv->qdata, "LoginFormats", (gpointer) value, g_free);
+ g_variant_unref (variant);
+ }
+ return value;
+}
+
+static const gchar *
+um_realm_common_proxy_get_login_policy (UmRealmCommon *object)
+{
+ UmRealmCommonProxy *proxy = UM_REALM_COMMON_PROXY (object);
+ GVariant *variant;
+ const gchar *value = NULL;
+ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "LoginPolicy");
+ if (variant != NULL)
+ {
+ value = g_variant_get_string (variant, NULL);
+ g_variant_unref (variant);
+ }
+ return value;
+}
+
+static const gchar *const *
+um_realm_common_proxy_get_permitted_logins (UmRealmCommon *object)
+{
+ UmRealmCommonProxy *proxy = UM_REALM_COMMON_PROXY (object);
+ GVariant *variant;
+ const gchar *const *value = NULL;
+ value = g_datalist_get_data (&proxy->priv->qdata, "PermittedLogins");
+ if (value != NULL)
+ return value;
+ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "PermittedLogins");
+ if (variant != NULL)
+ {
+ value = g_variant_get_strv (variant, NULL);
+ g_datalist_set_data_full (&proxy->priv->qdata, "PermittedLogins", (gpointer) value, g_free);
+ g_variant_unref (variant);
+ }
+ return value;
+}
+
+static void
+um_realm_common_proxy_init (UmRealmCommonProxy *proxy)
+{
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+ proxy->priv = um_realm_common_proxy_get_instance_private (proxy);
+#else
+ proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, UM_REALM_TYPE_COMMON_PROXY, UmRealmCommonProxyPrivate);
+#endif
+
+ g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), um_realm_common_interface_info ());
+}
+
+static void
+um_realm_common_proxy_class_init (UmRealmCommonProxyClass *klass)
+{
+ GObjectClass *gobject_class;
+ GDBusProxyClass *proxy_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gobject_class->finalize = um_realm_common_proxy_finalize;
+ gobject_class->get_property = um_realm_common_proxy_get_property;
+ gobject_class->set_property = um_realm_common_proxy_set_property;
+
+ proxy_class = G_DBUS_PROXY_CLASS (klass);
+ proxy_class->g_signal = um_realm_common_proxy_g_signal;
+ proxy_class->g_properties_changed = um_realm_common_proxy_g_properties_changed;
+
+ um_realm_common_override_properties (gobject_class, 1);
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+ g_type_class_add_private (klass, sizeof (UmRealmCommonProxyPrivate));
+#endif
+}
+
+static void
+um_realm_common_proxy_iface_init (UmRealmCommonIface *iface)
+{
+ iface->get_name = um_realm_common_proxy_get_name;
+ iface->get_configured = um_realm_common_proxy_get_configured;
+ iface->get_supported_interfaces = um_realm_common_proxy_get_supported_interfaces;
+ iface->get_details = um_realm_common_proxy_get_details;
+ iface->get_login_formats = um_realm_common_proxy_get_login_formats;
+ iface->get_login_policy = um_realm_common_proxy_get_login_policy;
+ iface->get_permitted_logins = um_realm_common_proxy_get_permitted_logins;
+}
+
+/**
+ * um_realm_common_proxy_new:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus
connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously creates a proxy for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Realm.top_of_page">org.freedesktop.realmd.Realm</link>. See
g_dbus_proxy_new() for more details.
+ *
+ * When the operation is finished, @callback will be invoked in the <link
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling
this method from.
+ * You can then call um_realm_common_proxy_new_finish() to get the result of the operation.
+ *
+ * See um_realm_common_proxy_new_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+um_realm_common_proxy_new (
+ GDBusConnection *connection,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_async_initable_new_async (UM_REALM_TYPE_COMMON_PROXY, G_PRIORITY_DEFAULT, cancellable, callback,
user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path,
"g-interface-name", "org.freedesktop.realmd.Realm", NULL);
+}
+
+/**
+ * um_realm_common_proxy_new_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to um_realm_common_proxy_new().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with um_realm_common_proxy_new().
+ *
+ * Returns: (transfer full) (type UmRealmCommonProxy): The constructed proxy object or %NULL if @error is
set.
+ */
+UmRealmCommon *
+um_realm_common_proxy_new_finish (
+ GAsyncResult *res,
+ GError **error)
+{
+ GObject *ret;
+ GObject *source_object;
+ source_object = g_async_result_get_source_object (res);
+ ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+ g_object_unref (source_object);
+ if (ret != NULL)
+ return UM_REALM_COMMON (ret);
+ else
+ return NULL;
+}
+
+/**
+ * um_realm_common_proxy_new_sync:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus
connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Synchronously creates a proxy for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Realm.top_of_page">org.freedesktop.realmd.Realm</link>. See
g_dbus_proxy_new_sync() for more details.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See um_realm_common_proxy_new() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type UmRealmCommonProxy): The constructed proxy object or %NULL if @error is
set.
+ */
+UmRealmCommon *
+um_realm_common_proxy_new_sync (
+ GDBusConnection *connection,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GInitable *ret;
+ ret = g_initable_new (UM_REALM_TYPE_COMMON_PROXY, cancellable, error, "g-flags", flags, "g-name", name,
"g-connection", connection, "g-object-path", object_path, "g-interface-name", "org.freedesktop.realmd.Realm",
NULL);
+ if (ret != NULL)
+ return UM_REALM_COMMON (ret);
+ else
+ return NULL;
+}
+
+
+/**
+ * um_realm_common_proxy_new_for_bus:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Like um_realm_common_proxy_new() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * When the operation is finished, @callback will be invoked in the <link
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling
this method from.
+ * You can then call um_realm_common_proxy_new_for_bus_finish() to get the result of the operation.
+ *
+ * See um_realm_common_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+um_realm_common_proxy_new_for_bus (
+ GBusType bus_type,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_async_initable_new_async (UM_REALM_TYPE_COMMON_PROXY, G_PRIORITY_DEFAULT, cancellable, callback,
user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path,
"g-interface-name", "org.freedesktop.realmd.Realm", NULL);
+}
+
+/**
+ * um_realm_common_proxy_new_for_bus_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to
um_realm_common_proxy_new_for_bus().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with um_realm_common_proxy_new_for_bus().
+ *
+ * Returns: (transfer full) (type UmRealmCommonProxy): The constructed proxy object or %NULL if @error is
set.
+ */
+UmRealmCommon *
+um_realm_common_proxy_new_for_bus_finish (
+ GAsyncResult *res,
+ GError **error)
+{
+ GObject *ret;
+ GObject *source_object;
+ source_object = g_async_result_get_source_object (res);
+ ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+ g_object_unref (source_object);
+ if (ret != NULL)
+ return UM_REALM_COMMON (ret);
+ else
+ return NULL;
+}
+
+/**
+ * um_realm_common_proxy_new_for_bus_sync:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Like um_realm_common_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See um_realm_common_proxy_new_for_bus() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type UmRealmCommonProxy): The constructed proxy object or %NULL if @error is
set.
+ */
+UmRealmCommon *
+um_realm_common_proxy_new_for_bus_sync (
+ GBusType bus_type,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GInitable *ret;
+ ret = g_initable_new (UM_REALM_TYPE_COMMON_PROXY, cancellable, error, "g-flags", flags, "g-name", name,
"g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.freedesktop.realmd.Realm",
NULL);
+ if (ret != NULL)
+ return UM_REALM_COMMON (ret);
+ else
+ return NULL;
+}
+
+
+/* ------------------------------------------------------------------------ */
+
+/**
+ * UmRealmCommonSkeleton:
+ *
+ * The #UmRealmCommonSkeleton structure contains only private data and should only be accessed using the
provided API.
+ */
+
+/**
+ * UmRealmCommonSkeletonClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #UmRealmCommonSkeleton.
+ */
+
+struct _UmRealmCommonSkeletonPrivate
+{
+ GValue *properties;
+ GList *changed_properties;
+ GSource *changed_properties_idle_source;
+ GMainContext *context;
+ GMutex lock;
+};
+
+static void
+_um_realm_common_skeleton_handle_method_call (
+ GDBusConnection *connection G_GNUC_UNUSED,
+ const gchar *sender G_GNUC_UNUSED,
+ const gchar *object_path G_GNUC_UNUSED,
+ const gchar *interface_name,
+ const gchar *method_name,
+ GVariant *parameters,
+ GDBusMethodInvocation *invocation,
+ gpointer user_data)
+{
+ UmRealmCommonSkeleton *skeleton = UM_REALM_COMMON_SKELETON (user_data);
+ _ExtendedGDBusMethodInfo *info;
+ GVariantIter iter;
+ GVariant *child;
+ GValue *paramv;
+ guint num_params;
+ guint num_extra;
+ guint n;
+ guint signal_id;
+ GValue return_value = G_VALUE_INIT;
+ info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation);
+ g_assert (info != NULL);
+ num_params = g_variant_n_children (parameters);
+ num_extra = info->pass_fdlist ? 3 : 2; paramv = g_new0 (GValue, num_params + num_extra);
+ n = 0;
+ g_value_init (¶mv[n], UM_REALM_TYPE_COMMON);
+ g_value_set_object (¶mv[n++], skeleton);
+ g_value_init (¶mv[n], G_TYPE_DBUS_METHOD_INVOCATION);
+ g_value_set_object (¶mv[n++], invocation);
+ if (info->pass_fdlist)
+ {
+#ifdef G_OS_UNIX
+ g_value_init (¶mv[n], G_TYPE_UNIX_FD_LIST);
+ g_value_set_object (¶mv[n++], g_dbus_message_get_unix_fd_list
(g_dbus_method_invocation_get_message (invocation)));
+#else
+ g_assert_not_reached ();
+#endif
+ }
+ g_variant_iter_init (&iter, parameters);
+ while ((child = g_variant_iter_next_value (&iter)) != NULL)
+ {
+ _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra];
+ if (arg_info->use_gvariant)
+ {
+ g_value_init (¶mv[n], G_TYPE_VARIANT);
+ g_value_set_variant (¶mv[n], child);
+ n++;
+ }
+ else
+ g_dbus_gvariant_to_gvalue (child, ¶mv[n++]);
+ g_variant_unref (child);
+ }
+ signal_id = g_signal_lookup (info->signal_name, UM_REALM_TYPE_COMMON);
+ g_value_init (&return_value, G_TYPE_BOOLEAN);
+ g_signal_emitv (paramv, signal_id, 0, &return_value);
+ if (!g_value_get_boolean (&return_value))
+ g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s
is not implemented on interface %s", method_name, interface_name);
+ g_value_unset (&return_value);
+ for (n = 0; n < num_params + num_extra; n++)
+ g_value_unset (¶mv[n]);
+ g_free (paramv);
+}
+
+static GVariant *
+_um_realm_common_skeleton_handle_get_property (
+ GDBusConnection *connection G_GNUC_UNUSED,
+ const gchar *sender G_GNUC_UNUSED,
+ const gchar *object_path G_GNUC_UNUSED,
+ const gchar *interface_name G_GNUC_UNUSED,
+ const gchar *property_name,
+ GError **error,
+ gpointer user_data)
+{
+ UmRealmCommonSkeleton *skeleton = UM_REALM_COMMON_SKELETON (user_data);
+ GValue value = G_VALUE_INIT;
+ GParamSpec *pspec;
+ _ExtendedGDBusPropertyInfo *info;
+ GVariant *ret;
+ ret = NULL;
+ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *)
&_um_realm_common_interface_info.parent_struct, property_name);
+ g_assert (info != NULL);
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
+ if (pspec == NULL)
+ {
+ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s",
property_name);
+ }
+ else
+ {
+ g_value_init (&value, pspec->value_type);
+ g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value);
+ ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature));
+ g_value_unset (&value);
+ }
+ return ret;
+}
+
+static gboolean
+_um_realm_common_skeleton_handle_set_property (
+ GDBusConnection *connection G_GNUC_UNUSED,
+ const gchar *sender G_GNUC_UNUSED,
+ const gchar *object_path G_GNUC_UNUSED,
+ const gchar *interface_name G_GNUC_UNUSED,
+ const gchar *property_name,
+ GVariant *variant,
+ GError **error,
+ gpointer user_data)
+{
+ UmRealmCommonSkeleton *skeleton = UM_REALM_COMMON_SKELETON (user_data);
+ GValue value = G_VALUE_INIT;
+ GParamSpec *pspec;
+ _ExtendedGDBusPropertyInfo *info;
+ gboolean ret;
+ ret = FALSE;
+ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *)
&_um_realm_common_interface_info.parent_struct, property_name);
+ g_assert (info != NULL);
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
+ if (pspec == NULL)
+ {
+ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s",
property_name);
+ }
+ else
+ {
+ if (info->use_gvariant)
+ g_value_set_variant (&value, variant);
+ else
+ g_dbus_gvariant_to_gvalue (variant, &value);
+ g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value);
+ g_value_unset (&value);
+ ret = TRUE;
+ }
+ return ret;
+}
+
+static const GDBusInterfaceVTable _um_realm_common_skeleton_vtable =
+{
+ _um_realm_common_skeleton_handle_method_call,
+ _um_realm_common_skeleton_handle_get_property,
+ _um_realm_common_skeleton_handle_set_property,
+ {NULL}
+};
+
+static GDBusInterfaceInfo *
+um_realm_common_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
+{
+ return um_realm_common_interface_info ();
+}
+
+static GDBusInterfaceVTable *
+um_realm_common_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
+{
+ return (GDBusInterfaceVTable *) &_um_realm_common_skeleton_vtable;
+}
+
+static GVariant *
+um_realm_common_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton)
+{
+ UmRealmCommonSkeleton *skeleton = UM_REALM_COMMON_SKELETON (_skeleton);
+
+ GVariantBuilder builder;
+ guint n;
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+ if (_um_realm_common_interface_info.parent_struct.properties == NULL)
+ goto out;
+ for (n = 0; _um_realm_common_interface_info.parent_struct.properties[n] != NULL; n++)
+ {
+ GDBusPropertyInfo *info = _um_realm_common_interface_info.parent_struct.properties[n];
+ if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE)
+ {
+ GVariant *value;
+ value = _um_realm_common_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection
(G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path
(G_DBUS_INTERFACE_SKELETON (skeleton)), "org.freedesktop.realmd.Realm", info->name, NULL, skeleton);
+ if (value != NULL)
+ {
+ g_variant_take_ref (value);
+ g_variant_builder_add (&builder, "{sv}", info->name, value);
+ g_variant_unref (value);
+ }
+ }
+ }
+out:
+ return g_variant_builder_end (&builder);
+}
+
+static gboolean _um_realm_common_emit_changed (gpointer user_data);
+
+static void
+um_realm_common_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton)
+{
+ UmRealmCommonSkeleton *skeleton = UM_REALM_COMMON_SKELETON (_skeleton);
+ gboolean emit_changed = FALSE;
+
+ g_mutex_lock (&skeleton->priv->lock);
+ if (skeleton->priv->changed_properties_idle_source != NULL)
+ {
+ g_source_destroy (skeleton->priv->changed_properties_idle_source);
+ skeleton->priv->changed_properties_idle_source = NULL;
+ emit_changed = TRUE;
+ }
+ g_mutex_unlock (&skeleton->priv->lock);
+
+ if (emit_changed)
+ _um_realm_common_emit_changed (skeleton);
+}
+
+static void um_realm_common_skeleton_iface_init (UmRealmCommonIface *iface);
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+G_DEFINE_TYPE_WITH_CODE (UmRealmCommonSkeleton, um_realm_common_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
+ G_ADD_PRIVATE (UmRealmCommonSkeleton)
+ G_IMPLEMENT_INTERFACE (UM_REALM_TYPE_COMMON, um_realm_common_skeleton_iface_init));
+
+#else
+G_DEFINE_TYPE_WITH_CODE (UmRealmCommonSkeleton, um_realm_common_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
+ G_IMPLEMENT_INTERFACE (UM_REALM_TYPE_COMMON, um_realm_common_skeleton_iface_init));
+
+#endif
+static void
+um_realm_common_skeleton_finalize (GObject *object)
+{
+ UmRealmCommonSkeleton *skeleton = UM_REALM_COMMON_SKELETON (object);
+ guint n;
+ for (n = 0; n < 7; n++)
+ g_value_unset (&skeleton->priv->properties[n]);
+ g_free (skeleton->priv->properties);
+ g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
+ if (skeleton->priv->changed_properties_idle_source != NULL)
+ g_source_destroy (skeleton->priv->changed_properties_idle_source);
+ g_main_context_unref (skeleton->priv->context);
+ g_mutex_clear (&skeleton->priv->lock);
+ G_OBJECT_CLASS (um_realm_common_skeleton_parent_class)->finalize (object);
+}
+
+static void
+um_realm_common_skeleton_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec G_GNUC_UNUSED)
+{
+ UmRealmCommonSkeleton *skeleton = UM_REALM_COMMON_SKELETON (object);
+ g_assert (prop_id != 0 && prop_id - 1 < 7);
+ g_mutex_lock (&skeleton->priv->lock);
+ g_value_copy (&skeleton->priv->properties[prop_id - 1], value);
+ g_mutex_unlock (&skeleton->priv->lock);
+}
+
+static gboolean
+_um_realm_common_emit_changed (gpointer user_data)
+{
+ UmRealmCommonSkeleton *skeleton = UM_REALM_COMMON_SKELETON (user_data);
+ GList *l;
+ GVariantBuilder builder;
+ GVariantBuilder invalidated_builder;
+ guint num_changes;
+
+ g_mutex_lock (&skeleton->priv->lock);
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+ g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as"));
+ for (l = skeleton->priv->changed_properties, num_changes = 0; l != NULL; l = l->next)
+ {
+ ChangedProperty *cp = l->data;
+ GVariant *variant;
+ const GValue *cur_value;
+
+ cur_value = &skeleton->priv->properties[cp->prop_id - 1];
+ if (!_g_value_equal (cur_value, &cp->orig_value))
+ {
+ variant = g_dbus_gvalue_to_gvariant (cur_value, G_VARIANT_TYPE
(cp->info->parent_struct.signature));
+ g_variant_builder_add (&builder, "{sv}", cp->info->parent_struct.name, variant);
+ g_variant_unref (variant);
+ num_changes++;
+ }
+ }
+ if (num_changes > 0)
+ {
+ GList *connections, *ll;
+ GVariant *signal_variant;
+ signal_variant = g_variant_ref_sink (g_variant_new ("(sa{sv}as)", "org.freedesktop.realmd.Realm",
+ &builder, &invalidated_builder));
+ connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));
+ for (ll = connections; ll != NULL; ll = ll->next)
+ {
+ GDBusConnection *connection = ll->data;
+
+ g_dbus_connection_emit_signal (connection,
+ NULL, g_dbus_interface_skeleton_get_object_path
(G_DBUS_INTERFACE_SKELETON (skeleton)),
+ "org.freedesktop.DBus.Properties",
+ "PropertiesChanged",
+ signal_variant,
+ NULL);
+ }
+ g_variant_unref (signal_variant);
+ g_list_free_full (connections, g_object_unref);
+ }
+ else
+ {
+ g_variant_builder_clear (&builder);
+ g_variant_builder_clear (&invalidated_builder);
+ }
+ g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
+ skeleton->priv->changed_properties = NULL;
+ skeleton->priv->changed_properties_idle_source = NULL;
+ g_mutex_unlock (&skeleton->priv->lock);
+ return FALSE;
+}
+
+static void
+_um_realm_common_schedule_emit_changed (UmRealmCommonSkeleton *skeleton, const _ExtendedGDBusPropertyInfo
*info, guint prop_id, const GValue *orig_value)
+{
+ ChangedProperty *cp;
+ GList *l;
+ cp = NULL;
+ for (l = skeleton->priv->changed_properties; l != NULL; l = l->next)
+ {
+ ChangedProperty *i_cp = l->data;
+ if (i_cp->info == info)
+ {
+ cp = i_cp;
+ break;
+ }
+ }
+ if (cp == NULL)
+ {
+ cp = g_new0 (ChangedProperty, 1);
+ cp->prop_id = prop_id;
+ cp->info = info;
+ skeleton->priv->changed_properties = g_list_prepend (skeleton->priv->changed_properties, cp);
+ g_value_init (&cp->orig_value, G_VALUE_TYPE (orig_value));
+ g_value_copy (orig_value, &cp->orig_value);
+ }
+}
+
+static void
+um_realm_common_skeleton_notify (GObject *object,
+ GParamSpec *pspec G_GNUC_UNUSED)
+{
+ UmRealmCommonSkeleton *skeleton = UM_REALM_COMMON_SKELETON (object);
+ g_mutex_lock (&skeleton->priv->lock);
+ if (skeleton->priv->changed_properties != NULL &&
+ skeleton->priv->changed_properties_idle_source == NULL)
+ {
+ skeleton->priv->changed_properties_idle_source = g_idle_source_new ();
+ g_source_set_priority (skeleton->priv->changed_properties_idle_source, G_PRIORITY_DEFAULT);
+ g_source_set_callback (skeleton->priv->changed_properties_idle_source, _um_realm_common_emit_changed,
g_object_ref (skeleton), (GDestroyNotify) g_object_unref);
+ g_source_attach (skeleton->priv->changed_properties_idle_source, skeleton->priv->context);
+ g_source_unref (skeleton->priv->changed_properties_idle_source);
+ }
+ g_mutex_unlock (&skeleton->priv->lock);
+}
+
+static void
+um_realm_common_skeleton_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ UmRealmCommonSkeleton *skeleton = UM_REALM_COMMON_SKELETON (object);
+ g_assert (prop_id != 0 && prop_id - 1 < 7);
+ g_mutex_lock (&skeleton->priv->lock);
+ g_object_freeze_notify (object);
+ if (!_g_value_equal (value, &skeleton->priv->properties[prop_id - 1]))
+ {
+ if (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)) != NULL)
+ _um_realm_common_schedule_emit_changed (skeleton, _um_realm_common_property_info_pointers[prop_id -
1], prop_id, &skeleton->priv->properties[prop_id - 1]);
+ g_value_copy (value, &skeleton->priv->properties[prop_id - 1]);
+ g_object_notify_by_pspec (object, pspec);
+ }
+ g_mutex_unlock (&skeleton->priv->lock);
+ g_object_thaw_notify (object);
+}
+
+static void
+um_realm_common_skeleton_init (UmRealmCommonSkeleton *skeleton)
+{
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+ skeleton->priv = um_realm_common_skeleton_get_instance_private (skeleton);
+#else
+ skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, UM_REALM_TYPE_COMMON_SKELETON,
UmRealmCommonSkeletonPrivate);
+#endif
+
+ g_mutex_init (&skeleton->priv->lock);
+ skeleton->priv->context = g_main_context_ref_thread_default ();
+ skeleton->priv->properties = g_new0 (GValue, 7);
+ g_value_init (&skeleton->priv->properties[0], G_TYPE_STRING);
+ g_value_init (&skeleton->priv->properties[1], G_TYPE_STRING);
+ g_value_init (&skeleton->priv->properties[2], G_TYPE_STRV);
+ g_value_init (&skeleton->priv->properties[3], G_TYPE_VARIANT);
+ g_value_init (&skeleton->priv->properties[4], G_TYPE_STRV);
+ g_value_init (&skeleton->priv->properties[5], G_TYPE_STRING);
+ g_value_init (&skeleton->priv->properties[6], G_TYPE_STRV);
+}
+
+static const gchar *
+um_realm_common_skeleton_get_name (UmRealmCommon *object)
+{
+ UmRealmCommonSkeleton *skeleton = UM_REALM_COMMON_SKELETON (object);
+ const gchar *value;
+ g_mutex_lock (&skeleton->priv->lock);
+ value = g_value_get_string (&(skeleton->priv->properties[0]));
+ g_mutex_unlock (&skeleton->priv->lock);
+ return value;
+}
+
+static const gchar *
+um_realm_common_skeleton_get_configured (UmRealmCommon *object)
+{
+ UmRealmCommonSkeleton *skeleton = UM_REALM_COMMON_SKELETON (object);
+ const gchar *value;
+ g_mutex_lock (&skeleton->priv->lock);
+ value = g_value_get_string (&(skeleton->priv->properties[1]));
+ g_mutex_unlock (&skeleton->priv->lock);
+ return value;
+}
+
+static const gchar *const *
+um_realm_common_skeleton_get_supported_interfaces (UmRealmCommon *object)
+{
+ UmRealmCommonSkeleton *skeleton = UM_REALM_COMMON_SKELETON (object);
+ const gchar *const *value;
+ g_mutex_lock (&skeleton->priv->lock);
+ value = g_value_get_boxed (&(skeleton->priv->properties[2]));
+ g_mutex_unlock (&skeleton->priv->lock);
+ return value;
+}
+
+static GVariant *
+um_realm_common_skeleton_get_details (UmRealmCommon *object)
+{
+ UmRealmCommonSkeleton *skeleton = UM_REALM_COMMON_SKELETON (object);
+ GVariant *value;
+ g_mutex_lock (&skeleton->priv->lock);
+ value = g_value_get_variant (&(skeleton->priv->properties[3]));
+ g_mutex_unlock (&skeleton->priv->lock);
+ return value;
+}
+
+static const gchar *const *
+um_realm_common_skeleton_get_login_formats (UmRealmCommon *object)
+{
+ UmRealmCommonSkeleton *skeleton = UM_REALM_COMMON_SKELETON (object);
+ const gchar *const *value;
+ g_mutex_lock (&skeleton->priv->lock);
+ value = g_value_get_boxed (&(skeleton->priv->properties[4]));
+ g_mutex_unlock (&skeleton->priv->lock);
+ return value;
+}
+
+static const gchar *
+um_realm_common_skeleton_get_login_policy (UmRealmCommon *object)
+{
+ UmRealmCommonSkeleton *skeleton = UM_REALM_COMMON_SKELETON (object);
+ const gchar *value;
+ g_mutex_lock (&skeleton->priv->lock);
+ value = g_value_get_string (&(skeleton->priv->properties[5]));
+ g_mutex_unlock (&skeleton->priv->lock);
+ return value;
+}
+
+static const gchar *const *
+um_realm_common_skeleton_get_permitted_logins (UmRealmCommon *object)
+{
+ UmRealmCommonSkeleton *skeleton = UM_REALM_COMMON_SKELETON (object);
+ const gchar *const *value;
+ g_mutex_lock (&skeleton->priv->lock);
+ value = g_value_get_boxed (&(skeleton->priv->properties[6]));
+ g_mutex_unlock (&skeleton->priv->lock);
+ return value;
+}
+
+static void
+um_realm_common_skeleton_class_init (UmRealmCommonSkeletonClass *klass)
+{
+ GObjectClass *gobject_class;
+ GDBusInterfaceSkeletonClass *skeleton_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gobject_class->finalize = um_realm_common_skeleton_finalize;
+ gobject_class->get_property = um_realm_common_skeleton_get_property;
+ gobject_class->set_property = um_realm_common_skeleton_set_property;
+ gobject_class->notify = um_realm_common_skeleton_notify;
+
+
+ um_realm_common_override_properties (gobject_class, 1);
+
+ skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);
+ skeleton_class->get_info = um_realm_common_skeleton_dbus_interface_get_info;
+ skeleton_class->get_properties = um_realm_common_skeleton_dbus_interface_get_properties;
+ skeleton_class->flush = um_realm_common_skeleton_dbus_interface_flush;
+ skeleton_class->get_vtable = um_realm_common_skeleton_dbus_interface_get_vtable;
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+ g_type_class_add_private (klass, sizeof (UmRealmCommonSkeletonPrivate));
+#endif
+}
+
+static void
+um_realm_common_skeleton_iface_init (UmRealmCommonIface *iface)
+{
+ iface->get_name = um_realm_common_skeleton_get_name;
+ iface->get_configured = um_realm_common_skeleton_get_configured;
+ iface->get_supported_interfaces = um_realm_common_skeleton_get_supported_interfaces;
+ iface->get_details = um_realm_common_skeleton_get_details;
+ iface->get_login_formats = um_realm_common_skeleton_get_login_formats;
+ iface->get_login_policy = um_realm_common_skeleton_get_login_policy;
+ iface->get_permitted_logins = um_realm_common_skeleton_get_permitted_logins;
+}
+
+/**
+ * um_realm_common_skeleton_new:
+ *
+ * Creates a skeleton object for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Realm.top_of_page">org.freedesktop.realmd.Realm</link>.
+ *
+ * Returns: (transfer full) (type UmRealmCommonSkeleton): The skeleton object.
+ */
+UmRealmCommon *
+um_realm_common_skeleton_new (void)
+{
+ return UM_REALM_COMMON (g_object_new (UM_REALM_TYPE_COMMON_SKELETON, NULL));
+}
+
+/* ------------------------------------------------------------------------
+ * Code for interface org.freedesktop.realmd.Kerberos
+ * ------------------------------------------------------------------------
+ */
+
+/**
+ * SECTION:UmRealmKerberos
+ * @title: UmRealmKerberos
+ * @short_description: Generated C code for the org.freedesktop.realmd.Kerberos D-Bus interface
+ *
+ * This section contains code for working with the <link
linkend="gdbus-interface-org-freedesktop-realmd-Kerberos.top_of_page">org.freedesktop.realmd.Kerberos</link>
D-Bus interface in C.
+ */
+
+/* ---- Introspection data for org.freedesktop.realmd.Kerberos ---- */
+
+static const _ExtendedGDBusPropertyInfo _um_realm_kerberos_property_info_realm_name =
+{
+ {
+ -1,
+ (gchar *) "RealmName",
+ (gchar *) "s",
+ G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+ NULL
+ },
+ "realm-name",
+ FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo _um_realm_kerberos_property_info_domain_name =
+{
+ {
+ -1,
+ (gchar *) "DomainName",
+ (gchar *) "s",
+ G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+ NULL
+ },
+ "domain-name",
+ FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo * const _um_realm_kerberos_property_info_pointers[] =
+{
+ &_um_realm_kerberos_property_info_realm_name,
+ &_um_realm_kerberos_property_info_domain_name,
+ NULL
+};
+
+static const _ExtendedGDBusInterfaceInfo _um_realm_kerberos_interface_info =
+{
+ {
+ -1,
+ (gchar *) "org.freedesktop.realmd.Kerberos",
+ NULL,
+ NULL,
+ (GDBusPropertyInfo **) &_um_realm_kerberos_property_info_pointers,
+ NULL
+ },
+ "kerberos",
+};
+
+
+/**
+ * um_realm_kerberos_interface_info:
+ *
+ * Gets a machine-readable description of the <link
linkend="gdbus-interface-org-freedesktop-realmd-Kerberos.top_of_page">org.freedesktop.realmd.Kerberos</link>
D-Bus interface.
+ *
+ * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free.
+ */
+GDBusInterfaceInfo *
+um_realm_kerberos_interface_info (void)
+{
+ return (GDBusInterfaceInfo *) &_um_realm_kerberos_interface_info.parent_struct;
+}
+
+/**
+ * um_realm_kerberos_override_properties:
+ * @klass: The class structure for a #GObject<!-- -->-derived class.
+ * @property_id_begin: The property id to assign to the first overridden property.
+ *
+ * Overrides all #GObject properties in the #UmRealmKerberos interface for a concrete class.
+ * The properties are overridden in the order they are defined.
+ *
+ * Returns: The last property id.
+ */
+guint
+um_realm_kerberos_override_properties (GObjectClass *klass, guint property_id_begin)
+{
+ g_object_class_override_property (klass, property_id_begin++, "realm-name");
+ g_object_class_override_property (klass, property_id_begin++, "domain-name");
+ return property_id_begin - 1;
+}
+
+
+
+/**
+ * UmRealmKerberos:
+ *
+ * Abstract interface type for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Kerberos.top_of_page">org.freedesktop.realmd.Kerberos</link>.
+ */
+
+/**
+ * UmRealmKerberosIface:
+ * @parent_iface: The parent interface.
+ * @get_domain_name: Getter for the #UmRealmKerberos:domain-name property.
+ * @get_realm_name: Getter for the #UmRealmKerberos:realm-name property.
+ *
+ * Virtual table for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Kerberos.top_of_page">org.freedesktop.realmd.Kerberos</link>.
+ */
+
+typedef UmRealmKerberosIface UmRealmKerberosInterface;
+G_DEFINE_INTERFACE (UmRealmKerberos, um_realm_kerberos, G_TYPE_OBJECT);
+
+static void
+um_realm_kerberos_default_init (UmRealmKerberosIface *iface)
+{
+ /* GObject properties for D-Bus properties: */
+ /**
+ * UmRealmKerberos:realm-name:
+ *
+ * Represents the D-Bus property <link
linkend="gdbus-property-org-freedesktop-realmd-Kerberos.RealmName">"RealmName"</link>.
+ *
+ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to
read from it on both the client- and service-side. It is only meaningful, however, to write to it on the
service-side.
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_string ("realm-name", "RealmName", "RealmName", NULL, G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
+ /**
+ * UmRealmKerberos:domain-name:
+ *
+ * Represents the D-Bus property <link
linkend="gdbus-property-org-freedesktop-realmd-Kerberos.DomainName">"DomainName"</link>.
+ *
+ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to
read from it on both the client- and service-side. It is only meaningful, however, to write to it on the
service-side.
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_string ("domain-name", "DomainName", "DomainName", NULL, G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS));
+}
+
+/**
+ * um_realm_kerberos_get_realm_name: (skip)
+ * @object: A #UmRealmKerberos.
+ *
+ * Gets the value of the <link
linkend="gdbus-property-org-freedesktop-realmd-Kerberos.RealmName">"RealmName"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * <warning>The returned value is only valid until the property changes so on the client-side it is only
safe to use this function on the thread where @object was constructed. Use um_realm_kerberos_dup_realm_name()
if on another thread.</warning>
+ *
+ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the
returned value, it belongs to @object.
+ */
+const gchar *
+um_realm_kerberos_get_realm_name (UmRealmKerberos *object)
+{
+ return UM_REALM_KERBEROS_GET_IFACE (object)->get_realm_name (object);
+}
+
+/**
+ * um_realm_kerberos_dup_realm_name: (skip)
+ * @object: A #UmRealmKerberos.
+ *
+ * Gets a copy of the <link
linkend="gdbus-property-org-freedesktop-realmd-Kerberos.RealmName">"RealmName"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value
should be freed with g_free().
+ */
+gchar *
+um_realm_kerberos_dup_realm_name (UmRealmKerberos *object)
+{
+ gchar *value;
+ g_object_get (G_OBJECT (object), "realm-name", &value, NULL);
+ return value;
+}
+
+/**
+ * um_realm_kerberos_set_realm_name: (skip)
+ * @object: A #UmRealmKerberos.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-freedesktop-realmd-Kerberos.RealmName">"RealmName"</link>
D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+um_realm_kerberos_set_realm_name (UmRealmKerberos *object, const gchar *value)
+{
+ g_object_set (G_OBJECT (object), "realm-name", value, NULL);
+}
+
+/**
+ * um_realm_kerberos_get_domain_name: (skip)
+ * @object: A #UmRealmKerberos.
+ *
+ * Gets the value of the <link
linkend="gdbus-property-org-freedesktop-realmd-Kerberos.DomainName">"DomainName"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * <warning>The returned value is only valid until the property changes so on the client-side it is only
safe to use this function on the thread where @object was constructed. Use
um_realm_kerberos_dup_domain_name() if on another thread.</warning>
+ *
+ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the
returned value, it belongs to @object.
+ */
+const gchar *
+um_realm_kerberos_get_domain_name (UmRealmKerberos *object)
+{
+ return UM_REALM_KERBEROS_GET_IFACE (object)->get_domain_name (object);
+}
+
+/**
+ * um_realm_kerberos_dup_domain_name: (skip)
+ * @object: A #UmRealmKerberos.
+ *
+ * Gets a copy of the <link
linkend="gdbus-property-org-freedesktop-realmd-Kerberos.DomainName">"DomainName"</link> D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value
should be freed with g_free().
+ */
+gchar *
+um_realm_kerberos_dup_domain_name (UmRealmKerberos *object)
+{
+ gchar *value;
+ g_object_get (G_OBJECT (object), "domain-name", &value, NULL);
+ return value;
+}
+
+/**
+ * um_realm_kerberos_set_domain_name: (skip)
+ * @object: A #UmRealmKerberos.
+ * @value: The value to set.
+ *
+ * Sets the <link linkend="gdbus-property-org-freedesktop-realmd-Kerberos.DomainName">"DomainName"</link>
D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+um_realm_kerberos_set_domain_name (UmRealmKerberos *object, const gchar *value)
+{
+ g_object_set (G_OBJECT (object), "domain-name", value, NULL);
+}
+
+/* ------------------------------------------------------------------------ */
+
+/**
+ * UmRealmKerberosProxy:
+ *
+ * The #UmRealmKerberosProxy structure contains only private data and should only be accessed using the
provided API.
+ */
+
+/**
+ * UmRealmKerberosProxyClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #UmRealmKerberosProxy.
+ */
+
+struct _UmRealmKerberosProxyPrivate
+{
+ GData *qdata;
+};
+
+static void um_realm_kerberos_proxy_iface_init (UmRealmKerberosIface *iface);
+
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+G_DEFINE_TYPE_WITH_CODE (UmRealmKerberosProxy, um_realm_kerberos_proxy, G_TYPE_DBUS_PROXY,
+ G_ADD_PRIVATE (UmRealmKerberosProxy)
+ G_IMPLEMENT_INTERFACE (UM_REALM_TYPE_KERBEROS, um_realm_kerberos_proxy_iface_init));
+
+#else
+G_DEFINE_TYPE_WITH_CODE (UmRealmKerberosProxy, um_realm_kerberos_proxy, G_TYPE_DBUS_PROXY,
+ G_IMPLEMENT_INTERFACE (UM_REALM_TYPE_KERBEROS, um_realm_kerberos_proxy_iface_init));
+
+#endif
+static void
+um_realm_kerberos_proxy_finalize (GObject *object)
+{
+ UmRealmKerberosProxy *proxy = UM_REALM_KERBEROS_PROXY (object);
+ g_datalist_clear (&proxy->priv->qdata);
+ G_OBJECT_CLASS (um_realm_kerberos_proxy_parent_class)->finalize (object);
+}
+
+static void
+um_realm_kerberos_proxy_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec G_GNUC_UNUSED)
+{
+ const _ExtendedGDBusPropertyInfo *info;
+ GVariant *variant;
+ g_assert (prop_id != 0 && prop_id - 1 < 2);
+ info = _um_realm_kerberos_property_info_pointers[prop_id - 1];
+ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (object), info->parent_struct.name);
+ if (info->use_gvariant)
+ {
+ g_value_set_variant (value, variant);
+ }
+ else
+ {
+ if (variant != NULL)
+ g_dbus_gvariant_to_gvalue (variant, value);
+ }
+ if (variant != NULL)
+ g_variant_unref (variant);
+}
+
+static void
+um_realm_kerberos_proxy_set_property_cb (GDBusProxy *proxy,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ const _ExtendedGDBusPropertyInfo *info = user_data;
+ GError *error;
+ GVariant *_ret;
+ error = NULL;
+ _ret = g_dbus_proxy_call_finish (proxy, res, &error);
+ if (!_ret)
+ {
+ g_warning ("Error setting property '%s' on interface org.freedesktop.realmd.Kerberos: %s (%s, %d)",
+ info->parent_struct.name,
+ error->message, g_quark_to_string (error->domain), error->code);
+ g_error_free (error);
+ }
+ else
+ {
+ g_variant_unref (_ret);
+ }
+}
+
+static void
+um_realm_kerberos_proxy_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec G_GNUC_UNUSED)
+{
+ const _ExtendedGDBusPropertyInfo *info;
+ GVariant *variant;
+ g_assert (prop_id != 0 && prop_id - 1 < 2);
+ info = _um_realm_kerberos_property_info_pointers[prop_id - 1];
+ variant = g_dbus_gvalue_to_gvariant (value, G_VARIANT_TYPE (info->parent_struct.signature));
+ g_dbus_proxy_call (G_DBUS_PROXY (object),
+ "org.freedesktop.DBus.Properties.Set",
+ g_variant_new ("(ssv)", "org.freedesktop.realmd.Kerberos", info->parent_struct.name, variant),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL, (GAsyncReadyCallback) um_realm_kerberos_proxy_set_property_cb, (GDBusPropertyInfo *)
&info->parent_struct);
+ g_variant_unref (variant);
+}
+
+static void
+um_realm_kerberos_proxy_g_signal (GDBusProxy *proxy,
+ const gchar *sender_name G_GNUC_UNUSED,
+ const gchar *signal_name,
+ GVariant *parameters)
+{
+ _ExtendedGDBusSignalInfo *info;
+ GVariantIter iter;
+ GVariant *child;
+ GValue *paramv;
+ guint num_params;
+ guint n;
+ guint signal_id;
+ info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *)
&_um_realm_kerberos_interface_info.parent_struct, signal_name);
+ if (info == NULL)
+ return;
+ num_params = g_variant_n_children (parameters);
+ paramv = g_new0 (GValue, num_params + 1);
+ g_value_init (¶mv[0], UM_REALM_TYPE_KERBEROS);
+ g_value_set_object (¶mv[0], proxy);
+ g_variant_iter_init (&iter, parameters);
+ n = 1;
+ while ((child = g_variant_iter_next_value (&iter)) != NULL)
+ {
+ _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1];
+ if (arg_info->use_gvariant)
+ {
+ g_value_init (¶mv[n], G_TYPE_VARIANT);
+ g_value_set_variant (¶mv[n], child);
+ n++;
+ }
+ else
+ g_dbus_gvariant_to_gvalue (child, ¶mv[n++]);
+ g_variant_unref (child);
+ }
+ signal_id = g_signal_lookup (info->signal_name, UM_REALM_TYPE_KERBEROS);
+ g_signal_emitv (paramv, signal_id, 0, NULL);
+ for (n = 0; n < num_params + 1; n++)
+ g_value_unset (¶mv[n]);
+ g_free (paramv);
+}
+
+static void
+um_realm_kerberos_proxy_g_properties_changed (GDBusProxy *_proxy,
+ GVariant *changed_properties,
+ const gchar *const *invalidated_properties)
+{
+ UmRealmKerberosProxy *proxy = UM_REALM_KERBEROS_PROXY (_proxy);
+ guint n;
+ const gchar *key;
+ GVariantIter *iter;
+ _ExtendedGDBusPropertyInfo *info;
+ g_variant_get (changed_properties, "a{sv}", &iter);
+ while (g_variant_iter_next (iter, "{&sv}", &key, NULL))
+ {
+ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *)
&_um_realm_kerberos_interface_info.parent_struct, key);
+ g_datalist_remove_data (&proxy->priv->qdata, key);
+ if (info != NULL)
+ g_object_notify (G_OBJECT (proxy), info->hyphen_name);
+ }
+ g_variant_iter_free (iter);
+ for (n = 0; invalidated_properties[n] != NULL; n++)
+ {
+ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *)
&_um_realm_kerberos_interface_info.parent_struct, invalidated_properties[n]);
+ g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]);
+ if (info != NULL)
+ g_object_notify (G_OBJECT (proxy), info->hyphen_name);
+ }
+}
+
+static const gchar *
+um_realm_kerberos_proxy_get_realm_name (UmRealmKerberos *object)
+{
+ UmRealmKerberosProxy *proxy = UM_REALM_KERBEROS_PROXY (object);
+ GVariant *variant;
+ const gchar *value = NULL;
+ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "RealmName");
+ if (variant != NULL)
+ {
+ value = g_variant_get_string (variant, NULL);
+ g_variant_unref (variant);
+ }
+ return value;
+}
+
+static const gchar *
+um_realm_kerberos_proxy_get_domain_name (UmRealmKerberos *object)
+{
+ UmRealmKerberosProxy *proxy = UM_REALM_KERBEROS_PROXY (object);
+ GVariant *variant;
+ const gchar *value = NULL;
+ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "DomainName");
+ if (variant != NULL)
+ {
+ value = g_variant_get_string (variant, NULL);
+ g_variant_unref (variant);
+ }
+ return value;
+}
+
+static void
+um_realm_kerberos_proxy_init (UmRealmKerberosProxy *proxy)
+{
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+ proxy->priv = um_realm_kerberos_proxy_get_instance_private (proxy);
+#else
+ proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, UM_REALM_TYPE_KERBEROS_PROXY,
UmRealmKerberosProxyPrivate);
+#endif
+
+ g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), um_realm_kerberos_interface_info ());
+}
+
+static void
+um_realm_kerberos_proxy_class_init (UmRealmKerberosProxyClass *klass)
+{
+ GObjectClass *gobject_class;
+ GDBusProxyClass *proxy_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gobject_class->finalize = um_realm_kerberos_proxy_finalize;
+ gobject_class->get_property = um_realm_kerberos_proxy_get_property;
+ gobject_class->set_property = um_realm_kerberos_proxy_set_property;
+
+ proxy_class = G_DBUS_PROXY_CLASS (klass);
+ proxy_class->g_signal = um_realm_kerberos_proxy_g_signal;
+ proxy_class->g_properties_changed = um_realm_kerberos_proxy_g_properties_changed;
+
+ um_realm_kerberos_override_properties (gobject_class, 1);
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+ g_type_class_add_private (klass, sizeof (UmRealmKerberosProxyPrivate));
+#endif
+}
+
+static void
+um_realm_kerberos_proxy_iface_init (UmRealmKerberosIface *iface)
+{
+ iface->get_realm_name = um_realm_kerberos_proxy_get_realm_name;
+ iface->get_domain_name = um_realm_kerberos_proxy_get_domain_name;
+}
+
+/**
+ * um_realm_kerberos_proxy_new:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus
connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously creates a proxy for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Kerberos.top_of_page">org.freedesktop.realmd.Kerberos</link>.
See g_dbus_proxy_new() for more details.
+ *
+ * When the operation is finished, @callback will be invoked in the <link
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling
this method from.
+ * You can then call um_realm_kerberos_proxy_new_finish() to get the result of the operation.
+ *
+ * See um_realm_kerberos_proxy_new_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+um_realm_kerberos_proxy_new (
+ GDBusConnection *connection,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_async_initable_new_async (UM_REALM_TYPE_KERBEROS_PROXY, G_PRIORITY_DEFAULT, cancellable, callback,
user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path", object_path,
"g-interface-name", "org.freedesktop.realmd.Kerberos", NULL);
+}
+
+/**
+ * um_realm_kerberos_proxy_new_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to um_realm_kerberos_proxy_new().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with um_realm_kerberos_proxy_new().
+ *
+ * Returns: (transfer full) (type UmRealmKerberosProxy): The constructed proxy object or %NULL if @error is
set.
+ */
+UmRealmKerberos *
+um_realm_kerberos_proxy_new_finish (
+ GAsyncResult *res,
+ GError **error)
+{
+ GObject *ret;
+ GObject *source_object;
+ source_object = g_async_result_get_source_object (res);
+ ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+ g_object_unref (source_object);
+ if (ret != NULL)
+ return UM_REALM_KERBEROS (ret);
+ else
+ return NULL;
+}
+
+/**
+ * um_realm_kerberos_proxy_new_sync:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus
connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Synchronously creates a proxy for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Kerberos.top_of_page">org.freedesktop.realmd.Kerberos</link>.
See g_dbus_proxy_new_sync() for more details.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See um_realm_kerberos_proxy_new() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type UmRealmKerberosProxy): The constructed proxy object or %NULL if @error is
set.
+ */
+UmRealmKerberos *
+um_realm_kerberos_proxy_new_sync (
+ GDBusConnection *connection,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GInitable *ret;
+ ret = g_initable_new (UM_REALM_TYPE_KERBEROS_PROXY, cancellable, error, "g-flags", flags, "g-name", name,
"g-connection", connection, "g-object-path", object_path, "g-interface-name",
"org.freedesktop.realmd.Kerberos", NULL);
+ if (ret != NULL)
+ return UM_REALM_KERBEROS (ret);
+ else
+ return NULL;
+}
+
+
+/**
+ * um_realm_kerberos_proxy_new_for_bus:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Like um_realm_kerberos_proxy_new() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * When the operation is finished, @callback will be invoked in the <link
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling
this method from.
+ * You can then call um_realm_kerberos_proxy_new_for_bus_finish() to get the result of the operation.
+ *
+ * See um_realm_kerberos_proxy_new_for_bus_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+um_realm_kerberos_proxy_new_for_bus (
+ GBusType bus_type,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_async_initable_new_async (UM_REALM_TYPE_KERBEROS_PROXY, G_PRIORITY_DEFAULT, cancellable, callback,
user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path,
"g-interface-name", "org.freedesktop.realmd.Kerberos", NULL);
+}
+
+/**
+ * um_realm_kerberos_proxy_new_for_bus_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to
um_realm_kerberos_proxy_new_for_bus().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with um_realm_kerberos_proxy_new_for_bus().
+ *
+ * Returns: (transfer full) (type UmRealmKerberosProxy): The constructed proxy object or %NULL if @error is
set.
+ */
+UmRealmKerberos *
+um_realm_kerberos_proxy_new_for_bus_finish (
+ GAsyncResult *res,
+ GError **error)
+{
+ GObject *ret;
+ GObject *source_object;
+ source_object = g_async_result_get_source_object (res);
+ ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+ g_object_unref (source_object);
+ if (ret != NULL)
+ return UM_REALM_KERBEROS (ret);
+ else
+ return NULL;
+}
+
+/**
+ * um_realm_kerberos_proxy_new_for_bus_sync:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Like um_realm_kerberos_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See um_realm_kerberos_proxy_new_for_bus() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type UmRealmKerberosProxy): The constructed proxy object or %NULL if @error is
set.
+ */
+UmRealmKerberos *
+um_realm_kerberos_proxy_new_for_bus_sync (
+ GBusType bus_type,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GInitable *ret;
+ ret = g_initable_new (UM_REALM_TYPE_KERBEROS_PROXY, cancellable, error, "g-flags", flags, "g-name", name,
"g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name", "org.freedesktop.realmd.Kerberos",
NULL);
+ if (ret != NULL)
+ return UM_REALM_KERBEROS (ret);
+ else
+ return NULL;
+}
+
+
+/* ------------------------------------------------------------------------ */
+
+/**
+ * UmRealmKerberosSkeleton:
+ *
+ * The #UmRealmKerberosSkeleton structure contains only private data and should only be accessed using the
provided API.
+ */
+
+/**
+ * UmRealmKerberosSkeletonClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #UmRealmKerberosSkeleton.
+ */
+
+struct _UmRealmKerberosSkeletonPrivate
+{
+ GValue *properties;
+ GList *changed_properties;
+ GSource *changed_properties_idle_source;
+ GMainContext *context;
+ GMutex lock;
+};
+
+static void
+_um_realm_kerberos_skeleton_handle_method_call (
+ GDBusConnection *connection G_GNUC_UNUSED,
+ const gchar *sender G_GNUC_UNUSED,
+ const gchar *object_path G_GNUC_UNUSED,
+ const gchar *interface_name,
+ const gchar *method_name,
+ GVariant *parameters,
+ GDBusMethodInvocation *invocation,
+ gpointer user_data)
+{
+ UmRealmKerberosSkeleton *skeleton = UM_REALM_KERBEROS_SKELETON (user_data);
+ _ExtendedGDBusMethodInfo *info;
+ GVariantIter iter;
+ GVariant *child;
+ GValue *paramv;
+ guint num_params;
+ guint num_extra;
+ guint n;
+ guint signal_id;
+ GValue return_value = G_VALUE_INIT;
+ info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation);
+ g_assert (info != NULL);
+ num_params = g_variant_n_children (parameters);
+ num_extra = info->pass_fdlist ? 3 : 2; paramv = g_new0 (GValue, num_params + num_extra);
+ n = 0;
+ g_value_init (¶mv[n], UM_REALM_TYPE_KERBEROS);
+ g_value_set_object (¶mv[n++], skeleton);
+ g_value_init (¶mv[n], G_TYPE_DBUS_METHOD_INVOCATION);
+ g_value_set_object (¶mv[n++], invocation);
+ if (info->pass_fdlist)
+ {
+#ifdef G_OS_UNIX
+ g_value_init (¶mv[n], G_TYPE_UNIX_FD_LIST);
+ g_value_set_object (¶mv[n++], g_dbus_message_get_unix_fd_list
(g_dbus_method_invocation_get_message (invocation)));
+#else
+ g_assert_not_reached ();
+#endif
+ }
+ g_variant_iter_init (&iter, parameters);
+ while ((child = g_variant_iter_next_value (&iter)) != NULL)
+ {
+ _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra];
+ if (arg_info->use_gvariant)
+ {
+ g_value_init (¶mv[n], G_TYPE_VARIANT);
+ g_value_set_variant (¶mv[n], child);
+ n++;
+ }
+ else
+ g_dbus_gvariant_to_gvalue (child, ¶mv[n++]);
+ g_variant_unref (child);
+ }
+ signal_id = g_signal_lookup (info->signal_name, UM_REALM_TYPE_KERBEROS);
+ g_value_init (&return_value, G_TYPE_BOOLEAN);
+ g_signal_emitv (paramv, signal_id, 0, &return_value);
+ if (!g_value_get_boolean (&return_value))
+ g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s
is not implemented on interface %s", method_name, interface_name);
+ g_value_unset (&return_value);
+ for (n = 0; n < num_params + num_extra; n++)
+ g_value_unset (¶mv[n]);
+ g_free (paramv);
+}
+
+static GVariant *
+_um_realm_kerberos_skeleton_handle_get_property (
+ GDBusConnection *connection G_GNUC_UNUSED,
+ const gchar *sender G_GNUC_UNUSED,
+ const gchar *object_path G_GNUC_UNUSED,
+ const gchar *interface_name G_GNUC_UNUSED,
+ const gchar *property_name,
+ GError **error,
+ gpointer user_data)
+{
+ UmRealmKerberosSkeleton *skeleton = UM_REALM_KERBEROS_SKELETON (user_data);
+ GValue value = G_VALUE_INIT;
+ GParamSpec *pspec;
+ _ExtendedGDBusPropertyInfo *info;
+ GVariant *ret;
+ ret = NULL;
+ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *)
&_um_realm_kerberos_interface_info.parent_struct, property_name);
+ g_assert (info != NULL);
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
+ if (pspec == NULL)
+ {
+ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s",
property_name);
+ }
+ else
+ {
+ g_value_init (&value, pspec->value_type);
+ g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value);
+ ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature));
+ g_value_unset (&value);
+ }
+ return ret;
+}
+
+static gboolean
+_um_realm_kerberos_skeleton_handle_set_property (
+ GDBusConnection *connection G_GNUC_UNUSED,
+ const gchar *sender G_GNUC_UNUSED,
+ const gchar *object_path G_GNUC_UNUSED,
+ const gchar *interface_name G_GNUC_UNUSED,
+ const gchar *property_name,
+ GVariant *variant,
+ GError **error,
+ gpointer user_data)
+{
+ UmRealmKerberosSkeleton *skeleton = UM_REALM_KERBEROS_SKELETON (user_data);
+ GValue value = G_VALUE_INIT;
+ GParamSpec *pspec;
+ _ExtendedGDBusPropertyInfo *info;
+ gboolean ret;
+ ret = FALSE;
+ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *)
&_um_realm_kerberos_interface_info.parent_struct, property_name);
+ g_assert (info != NULL);
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
+ if (pspec == NULL)
+ {
+ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s",
property_name);
+ }
+ else
+ {
+ if (info->use_gvariant)
+ g_value_set_variant (&value, variant);
+ else
+ g_dbus_gvariant_to_gvalue (variant, &value);
+ g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value);
+ g_value_unset (&value);
+ ret = TRUE;
+ }
+ return ret;
+}
+
+static const GDBusInterfaceVTable _um_realm_kerberos_skeleton_vtable =
+{
+ _um_realm_kerberos_skeleton_handle_method_call,
+ _um_realm_kerberos_skeleton_handle_get_property,
+ _um_realm_kerberos_skeleton_handle_set_property,
+ {NULL}
+};
+
+static GDBusInterfaceInfo *
+um_realm_kerberos_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
+{
+ return um_realm_kerberos_interface_info ();
+}
+
+static GDBusInterfaceVTable *
+um_realm_kerberos_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton G_GNUC_UNUSED)
+{
+ return (GDBusInterfaceVTable *) &_um_realm_kerberos_skeleton_vtable;
+}
+
+static GVariant *
+um_realm_kerberos_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton)
+{
+ UmRealmKerberosSkeleton *skeleton = UM_REALM_KERBEROS_SKELETON (_skeleton);
+
+ GVariantBuilder builder;
+ guint n;
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+ if (_um_realm_kerberos_interface_info.parent_struct.properties == NULL)
+ goto out;
+ for (n = 0; _um_realm_kerberos_interface_info.parent_struct.properties[n] != NULL; n++)
+ {
+ GDBusPropertyInfo *info = _um_realm_kerberos_interface_info.parent_struct.properties[n];
+ if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE)
+ {
+ GVariant *value;
+ value = _um_realm_kerberos_skeleton_handle_get_property (g_dbus_interface_skeleton_get_connection
(G_DBUS_INTERFACE_SKELETON (skeleton)), NULL, g_dbus_interface_skeleton_get_object_path
(G_DBUS_INTERFACE_SKELETON (skeleton)), "org.freedesktop.realmd.Kerberos", info->name, NULL, skeleton);
+ if (value != NULL)
+ {
+ g_variant_take_ref (value);
+ g_variant_builder_add (&builder, "{sv}", info->name, value);
+ g_variant_unref (value);
+ }
+ }
+ }
+out:
+ return g_variant_builder_end (&builder);
+}
+
+static gboolean _um_realm_kerberos_emit_changed (gpointer user_data);
+
+static void
+um_realm_kerberos_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton)
+{
+ UmRealmKerberosSkeleton *skeleton = UM_REALM_KERBEROS_SKELETON (_skeleton);
+ gboolean emit_changed = FALSE;
+
+ g_mutex_lock (&skeleton->priv->lock);
+ if (skeleton->priv->changed_properties_idle_source != NULL)
+ {
+ g_source_destroy (skeleton->priv->changed_properties_idle_source);
+ skeleton->priv->changed_properties_idle_source = NULL;
+ emit_changed = TRUE;
+ }
+ g_mutex_unlock (&skeleton->priv->lock);
+
+ if (emit_changed)
+ _um_realm_kerberos_emit_changed (skeleton);
+}
+
+static void um_realm_kerberos_skeleton_iface_init (UmRealmKerberosIface *iface);
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+G_DEFINE_TYPE_WITH_CODE (UmRealmKerberosSkeleton, um_realm_kerberos_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
+ G_ADD_PRIVATE (UmRealmKerberosSkeleton)
+ G_IMPLEMENT_INTERFACE (UM_REALM_TYPE_KERBEROS,
um_realm_kerberos_skeleton_iface_init));
+
+#else
+G_DEFINE_TYPE_WITH_CODE (UmRealmKerberosSkeleton, um_realm_kerberos_skeleton, G_TYPE_DBUS_INTERFACE_SKELETON,
+ G_IMPLEMENT_INTERFACE (UM_REALM_TYPE_KERBEROS,
um_realm_kerberos_skeleton_iface_init));
+
+#endif
+static void
+um_realm_kerberos_skeleton_finalize (GObject *object)
+{
+ UmRealmKerberosSkeleton *skeleton = UM_REALM_KERBEROS_SKELETON (object);
+ guint n;
+ for (n = 0; n < 2; n++)
+ g_value_unset (&skeleton->priv->properties[n]);
+ g_free (skeleton->priv->properties);
+ g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
+ if (skeleton->priv->changed_properties_idle_source != NULL)
+ g_source_destroy (skeleton->priv->changed_properties_idle_source);
+ g_main_context_unref (skeleton->priv->context);
+ g_mutex_clear (&skeleton->priv->lock);
+ G_OBJECT_CLASS (um_realm_kerberos_skeleton_parent_class)->finalize (object);
+}
+
+static void
+um_realm_kerberos_skeleton_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec G_GNUC_UNUSED)
+{
+ UmRealmKerberosSkeleton *skeleton = UM_REALM_KERBEROS_SKELETON (object);
+ g_assert (prop_id != 0 && prop_id - 1 < 2);
+ g_mutex_lock (&skeleton->priv->lock);
+ g_value_copy (&skeleton->priv->properties[prop_id - 1], value);
+ g_mutex_unlock (&skeleton->priv->lock);
+}
+
+static gboolean
+_um_realm_kerberos_emit_changed (gpointer user_data)
+{
+ UmRealmKerberosSkeleton *skeleton = UM_REALM_KERBEROS_SKELETON (user_data);
+ GList *l;
+ GVariantBuilder builder;
+ GVariantBuilder invalidated_builder;
+ guint num_changes;
+
+ g_mutex_lock (&skeleton->priv->lock);
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+ g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as"));
+ for (l = skeleton->priv->changed_properties, num_changes = 0; l != NULL; l = l->next)
+ {
+ ChangedProperty *cp = l->data;
+ GVariant *variant;
+ const GValue *cur_value;
+
+ cur_value = &skeleton->priv->properties[cp->prop_id - 1];
+ if (!_g_value_equal (cur_value, &cp->orig_value))
+ {
+ variant = g_dbus_gvalue_to_gvariant (cur_value, G_VARIANT_TYPE
(cp->info->parent_struct.signature));
+ g_variant_builder_add (&builder, "{sv}", cp->info->parent_struct.name, variant);
+ g_variant_unref (variant);
+ num_changes++;
+ }
+ }
+ if (num_changes > 0)
+ {
+ GList *connections, *ll;
+ GVariant *signal_variant;
+ signal_variant = g_variant_ref_sink (g_variant_new ("(sa{sv}as)", "org.freedesktop.realmd.Kerberos",
+ &builder, &invalidated_builder));
+ connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));
+ for (ll = connections; ll != NULL; ll = ll->next)
+ {
+ GDBusConnection *connection = ll->data;
+
+ g_dbus_connection_emit_signal (connection,
+ NULL, g_dbus_interface_skeleton_get_object_path
(G_DBUS_INTERFACE_SKELETON (skeleton)),
+ "org.freedesktop.DBus.Properties",
+ "PropertiesChanged",
+ signal_variant,
+ NULL);
+ }
+ g_variant_unref (signal_variant);
+ g_list_free_full (connections, g_object_unref);
+ }
+ else
+ {
+ g_variant_builder_clear (&builder);
+ g_variant_builder_clear (&invalidated_builder);
+ }
+ g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
+ skeleton->priv->changed_properties = NULL;
+ skeleton->priv->changed_properties_idle_source = NULL;
+ g_mutex_unlock (&skeleton->priv->lock);
+ return FALSE;
+}
+
+static void
+_um_realm_kerberos_schedule_emit_changed (UmRealmKerberosSkeleton *skeleton, const
_ExtendedGDBusPropertyInfo *info, guint prop_id, const GValue *orig_value)
+{
+ ChangedProperty *cp;
+ GList *l;
+ cp = NULL;
+ for (l = skeleton->priv->changed_properties; l != NULL; l = l->next)
+ {
+ ChangedProperty *i_cp = l->data;
+ if (i_cp->info == info)
+ {
+ cp = i_cp;
+ break;
+ }
+ }
+ if (cp == NULL)
+ {
+ cp = g_new0 (ChangedProperty, 1);
+ cp->prop_id = prop_id;
+ cp->info = info;
+ skeleton->priv->changed_properties = g_list_prepend (skeleton->priv->changed_properties, cp);
+ g_value_init (&cp->orig_value, G_VALUE_TYPE (orig_value));
+ g_value_copy (orig_value, &cp->orig_value);
+ }
+}
+
+static void
+um_realm_kerberos_skeleton_notify (GObject *object,
+ GParamSpec *pspec G_GNUC_UNUSED)
+{
+ UmRealmKerberosSkeleton *skeleton = UM_REALM_KERBEROS_SKELETON (object);
+ g_mutex_lock (&skeleton->priv->lock);
+ if (skeleton->priv->changed_properties != NULL &&
+ skeleton->priv->changed_properties_idle_source == NULL)
+ {
+ skeleton->priv->changed_properties_idle_source = g_idle_source_new ();
+ g_source_set_priority (skeleton->priv->changed_properties_idle_source, G_PRIORITY_DEFAULT);
+ g_source_set_callback (skeleton->priv->changed_properties_idle_source,
_um_realm_kerberos_emit_changed, g_object_ref (skeleton), (GDestroyNotify) g_object_unref);
+ g_source_attach (skeleton->priv->changed_properties_idle_source, skeleton->priv->context);
+ g_source_unref (skeleton->priv->changed_properties_idle_source);
+ }
+ g_mutex_unlock (&skeleton->priv->lock);
+}
+
+static void
+um_realm_kerberos_skeleton_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ UmRealmKerberosSkeleton *skeleton = UM_REALM_KERBEROS_SKELETON (object);
+ g_assert (prop_id != 0 && prop_id - 1 < 2);
+ g_mutex_lock (&skeleton->priv->lock);
+ g_object_freeze_notify (object);
+ if (!_g_value_equal (value, &skeleton->priv->properties[prop_id - 1]))
+ {
+ if (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)) != NULL)
+ _um_realm_kerberos_schedule_emit_changed (skeleton,
_um_realm_kerberos_property_info_pointers[prop_id - 1], prop_id, &skeleton->priv->properties[prop_id - 1]);
+ g_value_copy (value, &skeleton->priv->properties[prop_id - 1]);
+ g_object_notify_by_pspec (object, pspec);
+ }
+ g_mutex_unlock (&skeleton->priv->lock);
+ g_object_thaw_notify (object);
+}
+
+static void
+um_realm_kerberos_skeleton_init (UmRealmKerberosSkeleton *skeleton)
+{
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+ skeleton->priv = um_realm_kerberos_skeleton_get_instance_private (skeleton);
+#else
+ skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, UM_REALM_TYPE_KERBEROS_SKELETON,
UmRealmKerberosSkeletonPrivate);
+#endif
+
+ g_mutex_init (&skeleton->priv->lock);
+ skeleton->priv->context = g_main_context_ref_thread_default ();
+ skeleton->priv->properties = g_new0 (GValue, 2);
+ g_value_init (&skeleton->priv->properties[0], G_TYPE_STRING);
+ g_value_init (&skeleton->priv->properties[1], G_TYPE_STRING);
+}
+
+static const gchar *
+um_realm_kerberos_skeleton_get_realm_name (UmRealmKerberos *object)
+{
+ UmRealmKerberosSkeleton *skeleton = UM_REALM_KERBEROS_SKELETON (object);
+ const gchar *value;
+ g_mutex_lock (&skeleton->priv->lock);
+ value = g_value_get_string (&(skeleton->priv->properties[0]));
+ g_mutex_unlock (&skeleton->priv->lock);
+ return value;
+}
+
+static const gchar *
+um_realm_kerberos_skeleton_get_domain_name (UmRealmKerberos *object)
+{
+ UmRealmKerberosSkeleton *skeleton = UM_REALM_KERBEROS_SKELETON (object);
+ const gchar *value;
+ g_mutex_lock (&skeleton->priv->lock);
+ value = g_value_get_string (&(skeleton->priv->properties[1]));
+ g_mutex_unlock (&skeleton->priv->lock);
+ return value;
+}
+
+static void
+um_realm_kerberos_skeleton_class_init (UmRealmKerberosSkeletonClass *klass)
+{
+ GObjectClass *gobject_class;
+ GDBusInterfaceSkeletonClass *skeleton_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gobject_class->finalize = um_realm_kerberos_skeleton_finalize;
+ gobject_class->get_property = um_realm_kerberos_skeleton_get_property;
+ gobject_class->set_property = um_realm_kerberos_skeleton_set_property;
+ gobject_class->notify = um_realm_kerberos_skeleton_notify;
+
+
+ um_realm_kerberos_override_properties (gobject_class, 1);
+
+ skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);
+ skeleton_class->get_info = um_realm_kerberos_skeleton_dbus_interface_get_info;
+ skeleton_class->get_properties = um_realm_kerberos_skeleton_dbus_interface_get_properties;
+ skeleton_class->flush = um_realm_kerberos_skeleton_dbus_interface_flush;
+ skeleton_class->get_vtable = um_realm_kerberos_skeleton_dbus_interface_get_vtable;
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+ g_type_class_add_private (klass, sizeof (UmRealmKerberosSkeletonPrivate));
+#endif
+}
+
+static void
+um_realm_kerberos_skeleton_iface_init (UmRealmKerberosIface *iface)
+{
+ iface->get_realm_name = um_realm_kerberos_skeleton_get_realm_name;
+ iface->get_domain_name = um_realm_kerberos_skeleton_get_domain_name;
+}
+
+/**
+ * um_realm_kerberos_skeleton_new:
+ *
+ * Creates a skeleton object for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Kerberos.top_of_page">org.freedesktop.realmd.Kerberos</link>.
+ *
+ * Returns: (transfer full) (type UmRealmKerberosSkeleton): The skeleton object.
+ */
+UmRealmKerberos *
+um_realm_kerberos_skeleton_new (void)
+{
+ return UM_REALM_KERBEROS (g_object_new (UM_REALM_TYPE_KERBEROS_SKELETON, NULL));
+}
+
+/* ------------------------------------------------------------------------
+ * Code for interface org.freedesktop.realmd.KerberosMembership
+ * ------------------------------------------------------------------------
+ */
+
+/**
+ * SECTION:UmRealmKerberosMembership
+ * @title: UmRealmKerberosMembership
+ * @short_description: Generated C code for the org.freedesktop.realmd.KerberosMembership D-Bus interface
+ *
+ * This section contains code for working with the <link
linkend="gdbus-interface-org-freedesktop-realmd-KerberosMembership.top_of_page">org.freedesktop.realmd.KerberosMembership</link>
D-Bus interface in C.
+ */
+
+/* ---- Introspection data for org.freedesktop.realmd.KerberosMembership ---- */
+
+static const _ExtendedGDBusArgInfo _um_realm_kerberos_membership_method_info_join_IN_ARG_credentials =
+{
+ {
+ -1,
+ (gchar *) "credentials",
+ (gchar *) "(ssv)",
+ NULL
+ },
+ FALSE
+};
+
+static const _ExtendedGDBusArgInfo _um_realm_kerberos_membership_method_info_join_IN_ARG_options =
+{
+ {
+ -1,
+ (gchar *) "options",
+ (gchar *) "a{sv}",
+ NULL
+ },
+ FALSE
+};
+
+static const _ExtendedGDBusArgInfo * const _um_realm_kerberos_membership_method_info_join_IN_ARG_pointers[] =
+{
+ &_um_realm_kerberos_membership_method_info_join_IN_ARG_credentials,
+ &_um_realm_kerberos_membership_method_info_join_IN_ARG_options,
+ NULL
+};
+
+static const _ExtendedGDBusMethodInfo _um_realm_kerberos_membership_method_info_join =
+{
+ {
+ -1,
+ (gchar *) "Join",
+ (GDBusArgInfo **) &_um_realm_kerberos_membership_method_info_join_IN_ARG_pointers,
+ NULL,
+ NULL
+ },
+ "handle-join",
+ FALSE
+};
+
+static const _ExtendedGDBusArgInfo _um_realm_kerberos_membership_method_info_leave_IN_ARG_credentials =
+{
+ {
+ -1,
+ (gchar *) "credentials",
+ (gchar *) "(ssv)",
+ NULL
+ },
+ FALSE
+};
+
+static const _ExtendedGDBusArgInfo _um_realm_kerberos_membership_method_info_leave_IN_ARG_options =
+{
+ {
+ -1,
+ (gchar *) "options",
+ (gchar *) "a{sv}",
+ NULL
+ },
+ FALSE
+};
+
+static const _ExtendedGDBusArgInfo * const _um_realm_kerberos_membership_method_info_leave_IN_ARG_pointers[]
=
+{
+ &_um_realm_kerberos_membership_method_info_leave_IN_ARG_credentials,
+ &_um_realm_kerberos_membership_method_info_leave_IN_ARG_options,
+ NULL
+};
+
+static const _ExtendedGDBusMethodInfo _um_realm_kerberos_membership_method_info_leave =
+{
+ {
+ -1,
+ (gchar *) "Leave",
+ (GDBusArgInfo **) &_um_realm_kerberos_membership_method_info_leave_IN_ARG_pointers,
+ NULL,
+ NULL
+ },
+ "handle-leave",
+ FALSE
+};
+
+static const _ExtendedGDBusMethodInfo * const _um_realm_kerberos_membership_method_info_pointers[] =
+{
+ &_um_realm_kerberos_membership_method_info_join,
+ &_um_realm_kerberos_membership_method_info_leave,
+ NULL
+};
+
+static const _ExtendedGDBusPropertyInfo _um_realm_kerberos_membership_property_info_suggested_administrator =
+{
+ {
+ -1,
+ (gchar *) "SuggestedAdministrator",
+ (gchar *) "s",
+ G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+ NULL
+ },
+ "suggested-administrator",
+ FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo
_um_realm_kerberos_membership_property_info_supported_join_credentials =
+{
+ {
+ -1,
+ (gchar *) "SupportedJoinCredentials",
+ (gchar *) "a(ss)",
+ G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+ NULL
+ },
+ "supported-join-credentials",
+ FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo
_um_realm_kerberos_membership_property_info_supported_leave_credentials =
+{
+ {
+ -1,
+ (gchar *) "SupportedLeaveCredentials",
+ (gchar *) "a(ss)",
+ G_DBUS_PROPERTY_INFO_FLAGS_READABLE,
+ NULL
+ },
+ "supported-leave-credentials",
+ FALSE
+};
+
+static const _ExtendedGDBusPropertyInfo * const _um_realm_kerberos_membership_property_info_pointers[] =
+{
+ &_um_realm_kerberos_membership_property_info_suggested_administrator,
+ &_um_realm_kerberos_membership_property_info_supported_join_credentials,
+ &_um_realm_kerberos_membership_property_info_supported_leave_credentials,
+ NULL
+};
+
+static const _ExtendedGDBusInterfaceInfo _um_realm_kerberos_membership_interface_info =
+{
+ {
+ -1,
+ (gchar *) "org.freedesktop.realmd.KerberosMembership",
+ (GDBusMethodInfo **) &_um_realm_kerberos_membership_method_info_pointers,
+ NULL,
+ (GDBusPropertyInfo **) &_um_realm_kerberos_membership_property_info_pointers,
+ NULL
+ },
+ "kerberos-membership",
+};
+
+
+/**
+ * um_realm_kerberos_membership_interface_info:
+ *
+ * Gets a machine-readable description of the <link
linkend="gdbus-interface-org-freedesktop-realmd-KerberosMembership.top_of_page">org.freedesktop.realmd.KerberosMembership</link>
D-Bus interface.
+ *
+ * Returns: (transfer none): A #GDBusInterfaceInfo. Do not free.
+ */
+GDBusInterfaceInfo *
+um_realm_kerberos_membership_interface_info (void)
+{
+ return (GDBusInterfaceInfo *) &_um_realm_kerberos_membership_interface_info.parent_struct;
+}
+
+/**
+ * um_realm_kerberos_membership_override_properties:
+ * @klass: The class structure for a #GObject<!-- -->-derived class.
+ * @property_id_begin: The property id to assign to the first overridden property.
+ *
+ * Overrides all #GObject properties in the #UmRealmKerberosMembership interface for a concrete class.
+ * The properties are overridden in the order they are defined.
+ *
+ * Returns: The last property id.
+ */
+guint
+um_realm_kerberos_membership_override_properties (GObjectClass *klass, guint property_id_begin)
+{
+ g_object_class_override_property (klass, property_id_begin++, "suggested-administrator");
+ g_object_class_override_property (klass, property_id_begin++, "supported-join-credentials");
+ g_object_class_override_property (klass, property_id_begin++, "supported-leave-credentials");
+ return property_id_begin - 1;
+}
+
+
+
+/**
+ * UmRealmKerberosMembership:
+ *
+ * Abstract interface type for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-KerberosMembership.top_of_page">org.freedesktop.realmd.KerberosMembership</link>.
+ */
+
+/**
+ * UmRealmKerberosMembershipIface:
+ * @parent_iface: The parent interface.
+ * @handle_join: Handler for the #UmRealmKerberosMembership::handle-join signal.
+ * @handle_leave: Handler for the #UmRealmKerberosMembership::handle-leave signal.
+ * @get_suggested_administrator: Getter for the #UmRealmKerberosMembership:suggested-administrator property.
+ * @get_supported_join_credentials: Getter for the #UmRealmKerberosMembership:supported-join-credentials
property.
+ * @get_supported_leave_credentials: Getter for the #UmRealmKerberosMembership:supported-leave-credentials
property.
+ *
+ * Virtual table for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-KerberosMembership.top_of_page">org.freedesktop.realmd.KerberosMembership</link>.
+ */
+
+typedef UmRealmKerberosMembershipIface UmRealmKerberosMembershipInterface;
+G_DEFINE_INTERFACE (UmRealmKerberosMembership, um_realm_kerberos_membership, G_TYPE_OBJECT);
+
+static void
+um_realm_kerberos_membership_default_init (UmRealmKerberosMembershipIface *iface)
+{
+ /* GObject signals for incoming D-Bus method calls: */
+ /**
+ * UmRealmKerberosMembership::handle-join:
+ * @object: A #UmRealmKerberosMembership.
+ * @invocation: A #GDBusMethodInvocation.
+ * @arg_credentials: Argument passed by remote caller.
+ * @arg_options: Argument passed by remote caller.
+ *
+ * Signal emitted when a remote caller is invoking the <link
linkend="gdbus-method-org-freedesktop-realmd-KerberosMembership.Join">Join()</link> D-Bus method.
+ *
+ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a
reference to @invocation and eventually call um_realm_kerberos_membership_complete_join() or e.g.
g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler
handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+ *
+ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+ */
+ g_signal_new ("handle-join",
+ G_TYPE_FROM_INTERFACE (iface),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (UmRealmKerberosMembershipIface, handle_join),
+ g_signal_accumulator_true_handled,
+ NULL,
+ g_cclosure_marshal_generic,
+ G_TYPE_BOOLEAN,
+ 3,
+ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_VARIANT, G_TYPE_VARIANT);
+
+ /**
+ * UmRealmKerberosMembership::handle-leave:
+ * @object: A #UmRealmKerberosMembership.
+ * @invocation: A #GDBusMethodInvocation.
+ * @arg_credentials: Argument passed by remote caller.
+ * @arg_options: Argument passed by remote caller.
+ *
+ * Signal emitted when a remote caller is invoking the <link
linkend="gdbus-method-org-freedesktop-realmd-KerberosMembership.Leave">Leave()</link> D-Bus method.
+ *
+ * If a signal handler returns %TRUE, it means the signal handler will handle the invocation (e.g. take a
reference to @invocation and eventually call um_realm_kerberos_membership_complete_leave() or e.g.
g_dbus_method_invocation_return_error() on it) and no order signal handlers will run. If no signal handler
handles the invocation, the %G_DBUS_ERROR_UNKNOWN_METHOD error is returned.
+ *
+ * Returns: %TRUE if the invocation was handled, %FALSE to let other signal handlers run.
+ */
+ g_signal_new ("handle-leave",
+ G_TYPE_FROM_INTERFACE (iface),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (UmRealmKerberosMembershipIface, handle_leave),
+ g_signal_accumulator_true_handled,
+ NULL,
+ g_cclosure_marshal_generic,
+ G_TYPE_BOOLEAN,
+ 3,
+ G_TYPE_DBUS_METHOD_INVOCATION, G_TYPE_VARIANT, G_TYPE_VARIANT);
+
+ /* GObject properties for D-Bus properties: */
+ /**
+ * UmRealmKerberosMembership:suggested-administrator:
+ *
+ * Represents the D-Bus property <link
linkend="gdbus-property-org-freedesktop-realmd-KerberosMembership.SuggestedAdministrator">"SuggestedAdministrator"</link>.
+ *
+ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to
read from it on both the client- and service-side. It is only meaningful, however, to write to it on the
service-side.
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_string ("suggested-administrator", "SuggestedAdministrator", "SuggestedAdministrator",
NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * UmRealmKerberosMembership:supported-join-credentials:
+ *
+ * Represents the D-Bus property <link
linkend="gdbus-property-org-freedesktop-realmd-KerberosMembership.SupportedJoinCredentials">"SupportedJoinCredentials"</link>.
+ *
+ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to
read from it on both the client- and service-side. It is only meaningful, however, to write to it on the
service-side.
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_variant ("supported-join-credentials", "SupportedJoinCredentials",
"SupportedJoinCredentials", G_VARIANT_TYPE ("a(ss)"), NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
+ * UmRealmKerberosMembership:supported-leave-credentials:
+ *
+ * Represents the D-Bus property <link
linkend="gdbus-property-org-freedesktop-realmd-KerberosMembership.SupportedLeaveCredentials">"SupportedLeaveCredentials"</link>.
+ *
+ * Since the D-Bus property for this #GObject property is readable but not writable, it is meaningful to
read from it on both the client- and service-side. It is only meaningful, however, to write to it on the
service-side.
+ */
+ g_object_interface_install_property (iface,
+ g_param_spec_variant ("supported-leave-credentials", "SupportedLeaveCredentials",
"SupportedLeaveCredentials", G_VARIANT_TYPE ("a(ss)"), NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+}
+
+/**
+ * um_realm_kerberos_membership_get_suggested_administrator: (skip)
+ * @object: A #UmRealmKerberosMembership.
+ *
+ * Gets the value of the <link
linkend="gdbus-property-org-freedesktop-realmd-KerberosMembership.SuggestedAdministrator">"SuggestedAdministrator"</link>
D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * <warning>The returned value is only valid until the property changes so on the client-side it is only
safe to use this function on the thread where @object was constructed. Use
um_realm_kerberos_membership_dup_suggested_administrator() if on another thread.</warning>
+ *
+ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the
returned value, it belongs to @object.
+ */
+const gchar *
+um_realm_kerberos_membership_get_suggested_administrator (UmRealmKerberosMembership *object)
+{
+ return UM_REALM_KERBEROS_MEMBERSHIP_GET_IFACE (object)->get_suggested_administrator (object);
+}
+
+/**
+ * um_realm_kerberos_membership_dup_suggested_administrator: (skip)
+ * @object: A #UmRealmKerberosMembership.
+ *
+ * Gets a copy of the <link
linkend="gdbus-property-org-freedesktop-realmd-KerberosMembership.SuggestedAdministrator">"SuggestedAdministrator"</link>
D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value
should be freed with g_free().
+ */
+gchar *
+um_realm_kerberos_membership_dup_suggested_administrator (UmRealmKerberosMembership *object)
+{
+ gchar *value;
+ g_object_get (G_OBJECT (object), "suggested-administrator", &value, NULL);
+ return value;
+}
+
+/**
+ * um_realm_kerberos_membership_set_suggested_administrator: (skip)
+ * @object: A #UmRealmKerberosMembership.
+ * @value: The value to set.
+ *
+ * Sets the <link
linkend="gdbus-property-org-freedesktop-realmd-KerberosMembership.SuggestedAdministrator">"SuggestedAdministrator"</link>
D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+um_realm_kerberos_membership_set_suggested_administrator (UmRealmKerberosMembership *object, const gchar
*value)
+{
+ g_object_set (G_OBJECT (object), "suggested-administrator", value, NULL);
+}
+
+/**
+ * um_realm_kerberos_membership_get_supported_join_credentials: (skip)
+ * @object: A #UmRealmKerberosMembership.
+ *
+ * Gets the value of the <link
linkend="gdbus-property-org-freedesktop-realmd-KerberosMembership.SupportedJoinCredentials">"SupportedJoinCredentials"</link>
D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * <warning>The returned value is only valid until the property changes so on the client-side it is only
safe to use this function on the thread where @object was constructed. Use
um_realm_kerberos_membership_dup_supported_join_credentials() if on another thread.</warning>
+ *
+ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the
returned value, it belongs to @object.
+ */
+GVariant *
+um_realm_kerberos_membership_get_supported_join_credentials (UmRealmKerberosMembership *object)
+{
+ return UM_REALM_KERBEROS_MEMBERSHIP_GET_IFACE (object)->get_supported_join_credentials (object);
+}
+
+/**
+ * um_realm_kerberos_membership_dup_supported_join_credentials: (skip)
+ * @object: A #UmRealmKerberosMembership.
+ *
+ * Gets a copy of the <link
linkend="gdbus-property-org-freedesktop-realmd-KerberosMembership.SupportedJoinCredentials">"SupportedJoinCredentials"</link>
D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value
should be freed with g_variant_unref().
+ */
+GVariant *
+um_realm_kerberos_membership_dup_supported_join_credentials (UmRealmKerberosMembership *object)
+{
+ GVariant *value;
+ g_object_get (G_OBJECT (object), "supported-join-credentials", &value, NULL);
+ return value;
+}
+
+/**
+ * um_realm_kerberos_membership_set_supported_join_credentials: (skip)
+ * @object: A #UmRealmKerberosMembership.
+ * @value: The value to set.
+ *
+ * Sets the <link
linkend="gdbus-property-org-freedesktop-realmd-KerberosMembership.SupportedJoinCredentials">"SupportedJoinCredentials"</link>
D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+um_realm_kerberos_membership_set_supported_join_credentials (UmRealmKerberosMembership *object, GVariant
*value)
+{
+ g_object_set (G_OBJECT (object), "supported-join-credentials", value, NULL);
+}
+
+/**
+ * um_realm_kerberos_membership_get_supported_leave_credentials: (skip)
+ * @object: A #UmRealmKerberosMembership.
+ *
+ * Gets the value of the <link
linkend="gdbus-property-org-freedesktop-realmd-KerberosMembership.SupportedLeaveCredentials">"SupportedLeaveCredentials"</link>
D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * <warning>The returned value is only valid until the property changes so on the client-side it is only
safe to use this function on the thread where @object was constructed. Use
um_realm_kerberos_membership_dup_supported_leave_credentials() if on another thread.</warning>
+ *
+ * Returns: (transfer none): The property value or %NULL if the property is not set. Do not free the
returned value, it belongs to @object.
+ */
+GVariant *
+um_realm_kerberos_membership_get_supported_leave_credentials (UmRealmKerberosMembership *object)
+{
+ return UM_REALM_KERBEROS_MEMBERSHIP_GET_IFACE (object)->get_supported_leave_credentials (object);
+}
+
+/**
+ * um_realm_kerberos_membership_dup_supported_leave_credentials: (skip)
+ * @object: A #UmRealmKerberosMembership.
+ *
+ * Gets a copy of the <link
linkend="gdbus-property-org-freedesktop-realmd-KerberosMembership.SupportedLeaveCredentials">"SupportedLeaveCredentials"</link>
D-Bus property.
+ *
+ * Since this D-Bus property is readable, it is meaningful to use this function on both the client- and
service-side.
+ *
+ * Returns: (transfer full): The property value or %NULL if the property is not set. The returned value
should be freed with g_variant_unref().
+ */
+GVariant *
+um_realm_kerberos_membership_dup_supported_leave_credentials (UmRealmKerberosMembership *object)
+{
+ GVariant *value;
+ g_object_get (G_OBJECT (object), "supported-leave-credentials", &value, NULL);
+ return value;
+}
+
+/**
+ * um_realm_kerberos_membership_set_supported_leave_credentials: (skip)
+ * @object: A #UmRealmKerberosMembership.
+ * @value: The value to set.
+ *
+ * Sets the <link
linkend="gdbus-property-org-freedesktop-realmd-KerberosMembership.SupportedLeaveCredentials">"SupportedLeaveCredentials"</link>
D-Bus property to @value.
+ *
+ * Since this D-Bus property is not writable, it is only meaningful to use this function on the service-side.
+ */
+void
+um_realm_kerberos_membership_set_supported_leave_credentials (UmRealmKerberosMembership *object, GVariant
*value)
+{
+ g_object_set (G_OBJECT (object), "supported-leave-credentials", value, NULL);
+}
+
+/**
+ * um_realm_kerberos_membership_call_join:
+ * @proxy: A #UmRealmKerberosMembershipProxy.
+ * @arg_credentials: Argument to pass with the method invocation.
+ * @arg_options: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link
linkend="gdbus-method-org-freedesktop-realmd-KerberosMembership.Join">Join()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling
this method from.
+ * You can then call um_realm_kerberos_membership_call_join_finish() to get the result of the operation.
+ *
+ * See um_realm_kerberos_membership_call_join_sync() for the synchronous, blocking version of this method.
+ */
+void
+um_realm_kerberos_membership_call_join (
+ UmRealmKerberosMembership *proxy,
+ GVariant *arg_credentials,
+ GVariant *arg_options,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+ "Join",
+ g_variant_new ("(@(ssv)@a{sv})",
+ arg_credentials,
+ arg_options),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ cancellable,
+ callback,
+ user_data);
+}
+
+/**
+ * um_realm_kerberos_membership_call_join_finish:
+ * @proxy: A #UmRealmKerberosMembershipProxy.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to
um_realm_kerberos_membership_call_join().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with um_realm_kerberos_membership_call_join().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+um_realm_kerberos_membership_call_join_finish (
+ UmRealmKerberosMembership *proxy,
+ GAsyncResult *res,
+ GError **error)
+{
+ GVariant *_ret;
+ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+ if (_ret == NULL)
+ goto _out;
+ g_variant_get (_ret,
+ "()");
+ g_variant_unref (_ret);
+_out:
+ return _ret != NULL;
+}
+
+/**
+ * um_realm_kerberos_membership_call_join_sync:
+ * @proxy: A #UmRealmKerberosMembershipProxy.
+ * @arg_credentials: Argument to pass with the method invocation.
+ * @arg_options: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link
linkend="gdbus-method-org-freedesktop-realmd-KerberosMembership.Join">Join()</link> D-Bus method on @proxy.
The calling thread is blocked until a reply is received.
+ *
+ * See um_realm_kerberos_membership_call_join() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+um_realm_kerberos_membership_call_join_sync (
+ UmRealmKerberosMembership *proxy,
+ GVariant *arg_credentials,
+ GVariant *arg_options,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GVariant *_ret;
+ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+ "Join",
+ g_variant_new ("(@(ssv)@a{sv})",
+ arg_credentials,
+ arg_options),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ cancellable,
+ error);
+ if (_ret == NULL)
+ goto _out;
+ g_variant_get (_ret,
+ "()");
+ g_variant_unref (_ret);
+_out:
+ return _ret != NULL;
+}
+
+/**
+ * um_realm_kerberos_membership_call_leave:
+ * @proxy: A #UmRealmKerberosMembershipProxy.
+ * @arg_credentials: Argument to pass with the method invocation.
+ * @arg_options: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied or %NULL.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously invokes the <link
linkend="gdbus-method-org-freedesktop-realmd-KerberosMembership.Leave">Leave()</link> D-Bus method on @proxy.
+ * When the operation is finished, @callback will be invoked in the <link
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling
this method from.
+ * You can then call um_realm_kerberos_membership_call_leave_finish() to get the result of the operation.
+ *
+ * See um_realm_kerberos_membership_call_leave_sync() for the synchronous, blocking version of this method.
+ */
+void
+um_realm_kerberos_membership_call_leave (
+ UmRealmKerberosMembership *proxy,
+ GVariant *arg_credentials,
+ GVariant *arg_options,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_dbus_proxy_call (G_DBUS_PROXY (proxy),
+ "Leave",
+ g_variant_new ("(@(ssv)@a{sv})",
+ arg_credentials,
+ arg_options),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ cancellable,
+ callback,
+ user_data);
+}
+
+/**
+ * um_realm_kerberos_membership_call_leave_finish:
+ * @proxy: A #UmRealmKerberosMembershipProxy.
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to
um_realm_kerberos_membership_call_leave().
+ * @error: Return location for error or %NULL.
+ *
+ * Finishes an operation started with um_realm_kerberos_membership_call_leave().
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+um_realm_kerberos_membership_call_leave_finish (
+ UmRealmKerberosMembership *proxy,
+ GAsyncResult *res,
+ GError **error)
+{
+ GVariant *_ret;
+ _ret = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, error);
+ if (_ret == NULL)
+ goto _out;
+ g_variant_get (_ret,
+ "()");
+ g_variant_unref (_ret);
+_out:
+ return _ret != NULL;
+}
+
+/**
+ * um_realm_kerberos_membership_call_leave_sync:
+ * @proxy: A #UmRealmKerberosMembershipProxy.
+ * @arg_credentials: Argument to pass with the method invocation.
+ * @arg_options: Argument to pass with the method invocation.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL.
+ *
+ * Synchronously invokes the <link
linkend="gdbus-method-org-freedesktop-realmd-KerberosMembership.Leave">Leave()</link> D-Bus method on @proxy.
The calling thread is blocked until a reply is received.
+ *
+ * See um_realm_kerberos_membership_call_leave() for the asynchronous version of this method.
+ *
+ * Returns: (skip): %TRUE if the call succeded, %FALSE if @error is set.
+ */
+gboolean
+um_realm_kerberos_membership_call_leave_sync (
+ UmRealmKerberosMembership *proxy,
+ GVariant *arg_credentials,
+ GVariant *arg_options,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GVariant *_ret;
+ _ret = g_dbus_proxy_call_sync (G_DBUS_PROXY (proxy),
+ "Leave",
+ g_variant_new ("(@(ssv)@a{sv})",
+ arg_credentials,
+ arg_options),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ cancellable,
+ error);
+ if (_ret == NULL)
+ goto _out;
+ g_variant_get (_ret,
+ "()");
+ g_variant_unref (_ret);
+_out:
+ return _ret != NULL;
+}
+
+/**
+ * um_realm_kerberos_membership_complete_join:
+ * @object: A #UmRealmKerberosMembership.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link
linkend="gdbus-method-org-freedesktop-realmd-KerberosMembership.Join">Join()</link> D-Bus method. If you
instead want to finish handling an invocation by returning an error, use
g_dbus_method_invocation_return_error() or similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+um_realm_kerberos_membership_complete_join (
+ UmRealmKerberosMembership *object,
+ GDBusMethodInvocation *invocation)
+{
+ g_dbus_method_invocation_return_value (invocation,
+ g_variant_new ("()"));
+}
+
+/**
+ * um_realm_kerberos_membership_complete_leave:
+ * @object: A #UmRealmKerberosMembership.
+ * @invocation: (transfer full): A #GDBusMethodInvocation.
+ *
+ * Helper function used in service implementations to finish handling invocations of the <link
linkend="gdbus-method-org-freedesktop-realmd-KerberosMembership.Leave">Leave()</link> D-Bus method. If you
instead want to finish handling an invocation by returning an error, use
g_dbus_method_invocation_return_error() or similar.
+ *
+ * This method will free @invocation, you cannot use it afterwards.
+ */
+void
+um_realm_kerberos_membership_complete_leave (
+ UmRealmKerberosMembership *object,
+ GDBusMethodInvocation *invocation)
+{
+ g_dbus_method_invocation_return_value (invocation,
+ g_variant_new ("()"));
+}
+
+/* ------------------------------------------------------------------------ */
+
+/**
+ * UmRealmKerberosMembershipProxy:
+ *
+ * The #UmRealmKerberosMembershipProxy structure contains only private data and should only be accessed
using the provided API.
+ */
+
+/**
+ * UmRealmKerberosMembershipProxyClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #UmRealmKerberosMembershipProxy.
+ */
+
+struct _UmRealmKerberosMembershipProxyPrivate
+{
+ GData *qdata;
+};
+
+static void um_realm_kerberos_membership_proxy_iface_init (UmRealmKerberosMembershipIface *iface);
+
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+G_DEFINE_TYPE_WITH_CODE (UmRealmKerberosMembershipProxy, um_realm_kerberos_membership_proxy,
G_TYPE_DBUS_PROXY,
+ G_ADD_PRIVATE (UmRealmKerberosMembershipProxy)
+ G_IMPLEMENT_INTERFACE (UM_REALM_TYPE_KERBEROS_MEMBERSHIP,
um_realm_kerberos_membership_proxy_iface_init));
+
+#else
+G_DEFINE_TYPE_WITH_CODE (UmRealmKerberosMembershipProxy, um_realm_kerberos_membership_proxy,
G_TYPE_DBUS_PROXY,
+ G_IMPLEMENT_INTERFACE (UM_REALM_TYPE_KERBEROS_MEMBERSHIP,
um_realm_kerberos_membership_proxy_iface_init));
+
+#endif
+static void
+um_realm_kerberos_membership_proxy_finalize (GObject *object)
+{
+ UmRealmKerberosMembershipProxy *proxy = UM_REALM_KERBEROS_MEMBERSHIP_PROXY (object);
+ g_datalist_clear (&proxy->priv->qdata);
+ G_OBJECT_CLASS (um_realm_kerberos_membership_proxy_parent_class)->finalize (object);
+}
+
+static void
+um_realm_kerberos_membership_proxy_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec G_GNUC_UNUSED)
+{
+ const _ExtendedGDBusPropertyInfo *info;
+ GVariant *variant;
+ g_assert (prop_id != 0 && prop_id - 1 < 3);
+ info = _um_realm_kerberos_membership_property_info_pointers[prop_id - 1];
+ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (object), info->parent_struct.name);
+ if (info->use_gvariant)
+ {
+ g_value_set_variant (value, variant);
+ }
+ else
+ {
+ if (variant != NULL)
+ g_dbus_gvariant_to_gvalue (variant, value);
+ }
+ if (variant != NULL)
+ g_variant_unref (variant);
+}
+
+static void
+um_realm_kerberos_membership_proxy_set_property_cb (GDBusProxy *proxy,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ const _ExtendedGDBusPropertyInfo *info = user_data;
+ GError *error;
+ GVariant *_ret;
+ error = NULL;
+ _ret = g_dbus_proxy_call_finish (proxy, res, &error);
+ if (!_ret)
+ {
+ g_warning ("Error setting property '%s' on interface org.freedesktop.realmd.KerberosMembership: %s
(%s, %d)",
+ info->parent_struct.name,
+ error->message, g_quark_to_string (error->domain), error->code);
+ g_error_free (error);
+ }
+ else
+ {
+ g_variant_unref (_ret);
+ }
+}
+
+static void
+um_realm_kerberos_membership_proxy_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec G_GNUC_UNUSED)
+{
+ const _ExtendedGDBusPropertyInfo *info;
+ GVariant *variant;
+ g_assert (prop_id != 0 && prop_id - 1 < 3);
+ info = _um_realm_kerberos_membership_property_info_pointers[prop_id - 1];
+ variant = g_dbus_gvalue_to_gvariant (value, G_VARIANT_TYPE (info->parent_struct.signature));
+ g_dbus_proxy_call (G_DBUS_PROXY (object),
+ "org.freedesktop.DBus.Properties.Set",
+ g_variant_new ("(ssv)", "org.freedesktop.realmd.KerberosMembership", info->parent_struct.name, variant),
+ G_DBUS_CALL_FLAGS_NONE,
+ -1,
+ NULL, (GAsyncReadyCallback) um_realm_kerberos_membership_proxy_set_property_cb, (GDBusPropertyInfo *)
&info->parent_struct);
+ g_variant_unref (variant);
+}
+
+static void
+um_realm_kerberos_membership_proxy_g_signal (GDBusProxy *proxy,
+ const gchar *sender_name G_GNUC_UNUSED,
+ const gchar *signal_name,
+ GVariant *parameters)
+{
+ _ExtendedGDBusSignalInfo *info;
+ GVariantIter iter;
+ GVariant *child;
+ GValue *paramv;
+ guint num_params;
+ guint n;
+ guint signal_id;
+ info = (_ExtendedGDBusSignalInfo *) g_dbus_interface_info_lookup_signal ((GDBusInterfaceInfo *)
&_um_realm_kerberos_membership_interface_info.parent_struct, signal_name);
+ if (info == NULL)
+ return;
+ num_params = g_variant_n_children (parameters);
+ paramv = g_new0 (GValue, num_params + 1);
+ g_value_init (¶mv[0], UM_REALM_TYPE_KERBEROS_MEMBERSHIP);
+ g_value_set_object (¶mv[0], proxy);
+ g_variant_iter_init (&iter, parameters);
+ n = 1;
+ while ((child = g_variant_iter_next_value (&iter)) != NULL)
+ {
+ _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.args[n - 1];
+ if (arg_info->use_gvariant)
+ {
+ g_value_init (¶mv[n], G_TYPE_VARIANT);
+ g_value_set_variant (¶mv[n], child);
+ n++;
+ }
+ else
+ g_dbus_gvariant_to_gvalue (child, ¶mv[n++]);
+ g_variant_unref (child);
+ }
+ signal_id = g_signal_lookup (info->signal_name, UM_REALM_TYPE_KERBEROS_MEMBERSHIP);
+ g_signal_emitv (paramv, signal_id, 0, NULL);
+ for (n = 0; n < num_params + 1; n++)
+ g_value_unset (¶mv[n]);
+ g_free (paramv);
+}
+
+static void
+um_realm_kerberos_membership_proxy_g_properties_changed (GDBusProxy *_proxy,
+ GVariant *changed_properties,
+ const gchar *const *invalidated_properties)
+{
+ UmRealmKerberosMembershipProxy *proxy = UM_REALM_KERBEROS_MEMBERSHIP_PROXY (_proxy);
+ guint n;
+ const gchar *key;
+ GVariantIter *iter;
+ _ExtendedGDBusPropertyInfo *info;
+ g_variant_get (changed_properties, "a{sv}", &iter);
+ while (g_variant_iter_next (iter, "{&sv}", &key, NULL))
+ {
+ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *)
&_um_realm_kerberos_membership_interface_info.parent_struct, key);
+ g_datalist_remove_data (&proxy->priv->qdata, key);
+ if (info != NULL)
+ g_object_notify (G_OBJECT (proxy), info->hyphen_name);
+ }
+ g_variant_iter_free (iter);
+ for (n = 0; invalidated_properties[n] != NULL; n++)
+ {
+ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *)
&_um_realm_kerberos_membership_interface_info.parent_struct, invalidated_properties[n]);
+ g_datalist_remove_data (&proxy->priv->qdata, invalidated_properties[n]);
+ if (info != NULL)
+ g_object_notify (G_OBJECT (proxy), info->hyphen_name);
+ }
+}
+
+static const gchar *
+um_realm_kerberos_membership_proxy_get_suggested_administrator (UmRealmKerberosMembership *object)
+{
+ UmRealmKerberosMembershipProxy *proxy = UM_REALM_KERBEROS_MEMBERSHIP_PROXY (object);
+ GVariant *variant;
+ const gchar *value = NULL;
+ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "SuggestedAdministrator");
+ if (variant != NULL)
+ {
+ value = g_variant_get_string (variant, NULL);
+ g_variant_unref (variant);
+ }
+ return value;
+}
+
+static GVariant *
+um_realm_kerberos_membership_proxy_get_supported_join_credentials (UmRealmKerberosMembership *object)
+{
+ UmRealmKerberosMembershipProxy *proxy = UM_REALM_KERBEROS_MEMBERSHIP_PROXY (object);
+ GVariant *variant;
+ GVariant *value = NULL;
+ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "SupportedJoinCredentials");
+ value = variant;
+ if (variant != NULL)
+ g_variant_unref (variant);
+ return value;
+}
+
+static GVariant *
+um_realm_kerberos_membership_proxy_get_supported_leave_credentials (UmRealmKerberosMembership *object)
+{
+ UmRealmKerberosMembershipProxy *proxy = UM_REALM_KERBEROS_MEMBERSHIP_PROXY (object);
+ GVariant *variant;
+ GVariant *value = NULL;
+ variant = g_dbus_proxy_get_cached_property (G_DBUS_PROXY (proxy), "SupportedLeaveCredentials");
+ value = variant;
+ if (variant != NULL)
+ g_variant_unref (variant);
+ return value;
+}
+
+static void
+um_realm_kerberos_membership_proxy_init (UmRealmKerberosMembershipProxy *proxy)
+{
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+ proxy->priv = um_realm_kerberos_membership_proxy_get_instance_private (proxy);
+#else
+ proxy->priv = G_TYPE_INSTANCE_GET_PRIVATE (proxy, UM_REALM_TYPE_KERBEROS_MEMBERSHIP_PROXY,
UmRealmKerberosMembershipProxyPrivate);
+#endif
+
+ g_dbus_proxy_set_interface_info (G_DBUS_PROXY (proxy), um_realm_kerberos_membership_interface_info ());
+}
+
+static void
+um_realm_kerberos_membership_proxy_class_init (UmRealmKerberosMembershipProxyClass *klass)
+{
+ GObjectClass *gobject_class;
+ GDBusProxyClass *proxy_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gobject_class->finalize = um_realm_kerberos_membership_proxy_finalize;
+ gobject_class->get_property = um_realm_kerberos_membership_proxy_get_property;
+ gobject_class->set_property = um_realm_kerberos_membership_proxy_set_property;
+
+ proxy_class = G_DBUS_PROXY_CLASS (klass);
+ proxy_class->g_signal = um_realm_kerberos_membership_proxy_g_signal;
+ proxy_class->g_properties_changed = um_realm_kerberos_membership_proxy_g_properties_changed;
+
+ um_realm_kerberos_membership_override_properties (gobject_class, 1);
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+ g_type_class_add_private (klass, sizeof (UmRealmKerberosMembershipProxyPrivate));
+#endif
+}
+
+static void
+um_realm_kerberos_membership_proxy_iface_init (UmRealmKerberosMembershipIface *iface)
+{
+ iface->get_suggested_administrator = um_realm_kerberos_membership_proxy_get_suggested_administrator;
+ iface->get_supported_join_credentials = um_realm_kerberos_membership_proxy_get_supported_join_credentials;
+ iface->get_supported_leave_credentials =
um_realm_kerberos_membership_proxy_get_supported_leave_credentials;
+}
+
+/**
+ * um_realm_kerberos_membership_proxy_new:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus
connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously creates a proxy for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-KerberosMembership.top_of_page">org.freedesktop.realmd.KerberosMembership</link>.
See g_dbus_proxy_new() for more details.
+ *
+ * When the operation is finished, @callback will be invoked in the <link
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling
this method from.
+ * You can then call um_realm_kerberos_membership_proxy_new_finish() to get the result of the operation.
+ *
+ * See um_realm_kerberos_membership_proxy_new_sync() for the synchronous, blocking version of this
constructor.
+ */
+void
+um_realm_kerberos_membership_proxy_new (
+ GDBusConnection *connection,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_async_initable_new_async (UM_REALM_TYPE_KERBEROS_MEMBERSHIP_PROXY, G_PRIORITY_DEFAULT, cancellable,
callback, user_data, "g-flags", flags, "g-name", name, "g-connection", connection, "g-object-path",
object_path, "g-interface-name", "org.freedesktop.realmd.KerberosMembership", NULL);
+}
+
+/**
+ * um_realm_kerberos_membership_proxy_new_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to
um_realm_kerberos_membership_proxy_new().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with um_realm_kerberos_membership_proxy_new().
+ *
+ * Returns: (transfer full) (type UmRealmKerberosMembershipProxy): The constructed proxy object or %NULL if
@error is set.
+ */
+UmRealmKerberosMembership *
+um_realm_kerberos_membership_proxy_new_finish (
+ GAsyncResult *res,
+ GError **error)
+{
+ GObject *ret;
+ GObject *source_object;
+ source_object = g_async_result_get_source_object (res);
+ ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+ g_object_unref (source_object);
+ if (ret != NULL)
+ return UM_REALM_KERBEROS_MEMBERSHIP (ret);
+ else
+ return NULL;
+}
+
+/**
+ * um_realm_kerberos_membership_proxy_new_sync:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus
connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Synchronously creates a proxy for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-KerberosMembership.top_of_page">org.freedesktop.realmd.KerberosMembership</link>.
See g_dbus_proxy_new_sync() for more details.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See um_realm_kerberos_membership_proxy_new() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type UmRealmKerberosMembershipProxy): The constructed proxy object or %NULL if
@error is set.
+ */
+UmRealmKerberosMembership *
+um_realm_kerberos_membership_proxy_new_sync (
+ GDBusConnection *connection,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GInitable *ret;
+ ret = g_initable_new (UM_REALM_TYPE_KERBEROS_MEMBERSHIP_PROXY, cancellable, error, "g-flags", flags,
"g-name", name, "g-connection", connection, "g-object-path", object_path, "g-interface-name",
"org.freedesktop.realmd.KerberosMembership", NULL);
+ if (ret != NULL)
+ return UM_REALM_KERBEROS_MEMBERSHIP (ret);
+ else
+ return NULL;
+}
+
+
+/**
+ * um_realm_kerberos_membership_proxy_new_for_bus:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Like um_realm_kerberos_membership_proxy_new() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * When the operation is finished, @callback will be invoked in the <link
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling
this method from.
+ * You can then call um_realm_kerberos_membership_proxy_new_for_bus_finish() to get the result of the
operation.
+ *
+ * See um_realm_kerberos_membership_proxy_new_for_bus_sync() for the synchronous, blocking version of this
constructor.
+ */
+void
+um_realm_kerberos_membership_proxy_new_for_bus (
+ GBusType bus_type,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_async_initable_new_async (UM_REALM_TYPE_KERBEROS_MEMBERSHIP_PROXY, G_PRIORITY_DEFAULT, cancellable,
callback, user_data, "g-flags", flags, "g-name", name, "g-bus-type", bus_type, "g-object-path", object_path,
"g-interface-name", "org.freedesktop.realmd.KerberosMembership", NULL);
+}
+
+/**
+ * um_realm_kerberos_membership_proxy_new_for_bus_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to
um_realm_kerberos_membership_proxy_new_for_bus().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with um_realm_kerberos_membership_proxy_new_for_bus().
+ *
+ * Returns: (transfer full) (type UmRealmKerberosMembershipProxy): The constructed proxy object or %NULL if
@error is set.
+ */
+UmRealmKerberosMembership *
+um_realm_kerberos_membership_proxy_new_for_bus_finish (
+ GAsyncResult *res,
+ GError **error)
+{
+ GObject *ret;
+ GObject *source_object;
+ source_object = g_async_result_get_source_object (res);
+ ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+ g_object_unref (source_object);
+ if (ret != NULL)
+ return UM_REALM_KERBEROS_MEMBERSHIP (ret);
+ else
+ return NULL;
+}
+
+/**
+ * um_realm_kerberos_membership_proxy_new_for_bus_sync:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusProxyFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Like um_realm_kerberos_membership_proxy_new_sync() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See um_realm_kerberos_membership_proxy_new_for_bus() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type UmRealmKerberosMembershipProxy): The constructed proxy object or %NULL if
@error is set.
+ */
+UmRealmKerberosMembership *
+um_realm_kerberos_membership_proxy_new_for_bus_sync (
+ GBusType bus_type,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GInitable *ret;
+ ret = g_initable_new (UM_REALM_TYPE_KERBEROS_MEMBERSHIP_PROXY, cancellable, error, "g-flags", flags,
"g-name", name, "g-bus-type", bus_type, "g-object-path", object_path, "g-interface-name",
"org.freedesktop.realmd.KerberosMembership", NULL);
+ if (ret != NULL)
+ return UM_REALM_KERBEROS_MEMBERSHIP (ret);
+ else
+ return NULL;
+}
+
+
+/* ------------------------------------------------------------------------ */
+
+/**
+ * UmRealmKerberosMembershipSkeleton:
+ *
+ * The #UmRealmKerberosMembershipSkeleton structure contains only private data and should only be accessed
using the provided API.
+ */
+
+/**
+ * UmRealmKerberosMembershipSkeletonClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #UmRealmKerberosMembershipSkeleton.
+ */
+
+struct _UmRealmKerberosMembershipSkeletonPrivate
+{
+ GValue *properties;
+ GList *changed_properties;
+ GSource *changed_properties_idle_source;
+ GMainContext *context;
+ GMutex lock;
+};
+
+static void
+_um_realm_kerberos_membership_skeleton_handle_method_call (
+ GDBusConnection *connection G_GNUC_UNUSED,
+ const gchar *sender G_GNUC_UNUSED,
+ const gchar *object_path G_GNUC_UNUSED,
+ const gchar *interface_name,
+ const gchar *method_name,
+ GVariant *parameters,
+ GDBusMethodInvocation *invocation,
+ gpointer user_data)
+{
+ UmRealmKerberosMembershipSkeleton *skeleton = UM_REALM_KERBEROS_MEMBERSHIP_SKELETON (user_data);
+ _ExtendedGDBusMethodInfo *info;
+ GVariantIter iter;
+ GVariant *child;
+ GValue *paramv;
+ guint num_params;
+ guint num_extra;
+ guint n;
+ guint signal_id;
+ GValue return_value = G_VALUE_INIT;
+ info = (_ExtendedGDBusMethodInfo *) g_dbus_method_invocation_get_method_info (invocation);
+ g_assert (info != NULL);
+ num_params = g_variant_n_children (parameters);
+ num_extra = info->pass_fdlist ? 3 : 2; paramv = g_new0 (GValue, num_params + num_extra);
+ n = 0;
+ g_value_init (¶mv[n], UM_REALM_TYPE_KERBEROS_MEMBERSHIP);
+ g_value_set_object (¶mv[n++], skeleton);
+ g_value_init (¶mv[n], G_TYPE_DBUS_METHOD_INVOCATION);
+ g_value_set_object (¶mv[n++], invocation);
+ if (info->pass_fdlist)
+ {
+#ifdef G_OS_UNIX
+ g_value_init (¶mv[n], G_TYPE_UNIX_FD_LIST);
+ g_value_set_object (¶mv[n++], g_dbus_message_get_unix_fd_list
(g_dbus_method_invocation_get_message (invocation)));
+#else
+ g_assert_not_reached ();
+#endif
+ }
+ g_variant_iter_init (&iter, parameters);
+ while ((child = g_variant_iter_next_value (&iter)) != NULL)
+ {
+ _ExtendedGDBusArgInfo *arg_info = (_ExtendedGDBusArgInfo *) info->parent_struct.in_args[n - num_extra];
+ if (arg_info->use_gvariant)
+ {
+ g_value_init (¶mv[n], G_TYPE_VARIANT);
+ g_value_set_variant (¶mv[n], child);
+ n++;
+ }
+ else
+ g_dbus_gvariant_to_gvalue (child, ¶mv[n++]);
+ g_variant_unref (child);
+ }
+ signal_id = g_signal_lookup (info->signal_name, UM_REALM_TYPE_KERBEROS_MEMBERSHIP);
+ g_value_init (&return_value, G_TYPE_BOOLEAN);
+ g_signal_emitv (paramv, signal_id, 0, &return_value);
+ if (!g_value_get_boolean (&return_value))
+ g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_UNKNOWN_METHOD, "Method %s
is not implemented on interface %s", method_name, interface_name);
+ g_value_unset (&return_value);
+ for (n = 0; n < num_params + num_extra; n++)
+ g_value_unset (¶mv[n]);
+ g_free (paramv);
+}
+
+static GVariant *
+_um_realm_kerberos_membership_skeleton_handle_get_property (
+ GDBusConnection *connection G_GNUC_UNUSED,
+ const gchar *sender G_GNUC_UNUSED,
+ const gchar *object_path G_GNUC_UNUSED,
+ const gchar *interface_name G_GNUC_UNUSED,
+ const gchar *property_name,
+ GError **error,
+ gpointer user_data)
+{
+ UmRealmKerberosMembershipSkeleton *skeleton = UM_REALM_KERBEROS_MEMBERSHIP_SKELETON (user_data);
+ GValue value = G_VALUE_INIT;
+ GParamSpec *pspec;
+ _ExtendedGDBusPropertyInfo *info;
+ GVariant *ret;
+ ret = NULL;
+ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *)
&_um_realm_kerberos_membership_interface_info.parent_struct, property_name);
+ g_assert (info != NULL);
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
+ if (pspec == NULL)
+ {
+ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s",
property_name);
+ }
+ else
+ {
+ g_value_init (&value, pspec->value_type);
+ g_object_get_property (G_OBJECT (skeleton), info->hyphen_name, &value);
+ ret = g_dbus_gvalue_to_gvariant (&value, G_VARIANT_TYPE (info->parent_struct.signature));
+ g_value_unset (&value);
+ }
+ return ret;
+}
+
+static gboolean
+_um_realm_kerberos_membership_skeleton_handle_set_property (
+ GDBusConnection *connection G_GNUC_UNUSED,
+ const gchar *sender G_GNUC_UNUSED,
+ const gchar *object_path G_GNUC_UNUSED,
+ const gchar *interface_name G_GNUC_UNUSED,
+ const gchar *property_name,
+ GVariant *variant,
+ GError **error,
+ gpointer user_data)
+{
+ UmRealmKerberosMembershipSkeleton *skeleton = UM_REALM_KERBEROS_MEMBERSHIP_SKELETON (user_data);
+ GValue value = G_VALUE_INIT;
+ GParamSpec *pspec;
+ _ExtendedGDBusPropertyInfo *info;
+ gboolean ret;
+ ret = FALSE;
+ info = (_ExtendedGDBusPropertyInfo *) g_dbus_interface_info_lookup_property ((GDBusInterfaceInfo *)
&_um_realm_kerberos_membership_interface_info.parent_struct, property_name);
+ g_assert (info != NULL);
+ pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (skeleton), info->hyphen_name);
+ if (pspec == NULL)
+ {
+ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_INVALID_ARGS, "No property with name %s",
property_name);
+ }
+ else
+ {
+ if (info->use_gvariant)
+ g_value_set_variant (&value, variant);
+ else
+ g_dbus_gvariant_to_gvalue (variant, &value);
+ g_object_set_property (G_OBJECT (skeleton), info->hyphen_name, &value);
+ g_value_unset (&value);
+ ret = TRUE;
+ }
+ return ret;
+}
+
+static const GDBusInterfaceVTable _um_realm_kerberos_membership_skeleton_vtable =
+{
+ _um_realm_kerberos_membership_skeleton_handle_method_call,
+ _um_realm_kerberos_membership_skeleton_handle_get_property,
+ _um_realm_kerberos_membership_skeleton_handle_set_property,
+ {NULL}
+};
+
+static GDBusInterfaceInfo *
+um_realm_kerberos_membership_skeleton_dbus_interface_get_info (GDBusInterfaceSkeleton *skeleton
G_GNUC_UNUSED)
+{
+ return um_realm_kerberos_membership_interface_info ();
+}
+
+static GDBusInterfaceVTable *
+um_realm_kerberos_membership_skeleton_dbus_interface_get_vtable (GDBusInterfaceSkeleton *skeleton
G_GNUC_UNUSED)
+{
+ return (GDBusInterfaceVTable *) &_um_realm_kerberos_membership_skeleton_vtable;
+}
+
+static GVariant *
+um_realm_kerberos_membership_skeleton_dbus_interface_get_properties (GDBusInterfaceSkeleton *_skeleton)
+{
+ UmRealmKerberosMembershipSkeleton *skeleton = UM_REALM_KERBEROS_MEMBERSHIP_SKELETON (_skeleton);
+
+ GVariantBuilder builder;
+ guint n;
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+ if (_um_realm_kerberos_membership_interface_info.parent_struct.properties == NULL)
+ goto out;
+ for (n = 0; _um_realm_kerberos_membership_interface_info.parent_struct.properties[n] != NULL; n++)
+ {
+ GDBusPropertyInfo *info = _um_realm_kerberos_membership_interface_info.parent_struct.properties[n];
+ if (info->flags & G_DBUS_PROPERTY_INFO_FLAGS_READABLE)
+ {
+ GVariant *value;
+ value = _um_realm_kerberos_membership_skeleton_handle_get_property
(g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)), NULL,
g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON (skeleton)),
"org.freedesktop.realmd.KerberosMembership", info->name, NULL, skeleton);
+ if (value != NULL)
+ {
+ g_variant_take_ref (value);
+ g_variant_builder_add (&builder, "{sv}", info->name, value);
+ g_variant_unref (value);
+ }
+ }
+ }
+out:
+ return g_variant_builder_end (&builder);
+}
+
+static gboolean _um_realm_kerberos_membership_emit_changed (gpointer user_data);
+
+static void
+um_realm_kerberos_membership_skeleton_dbus_interface_flush (GDBusInterfaceSkeleton *_skeleton)
+{
+ UmRealmKerberosMembershipSkeleton *skeleton = UM_REALM_KERBEROS_MEMBERSHIP_SKELETON (_skeleton);
+ gboolean emit_changed = FALSE;
+
+ g_mutex_lock (&skeleton->priv->lock);
+ if (skeleton->priv->changed_properties_idle_source != NULL)
+ {
+ g_source_destroy (skeleton->priv->changed_properties_idle_source);
+ skeleton->priv->changed_properties_idle_source = NULL;
+ emit_changed = TRUE;
+ }
+ g_mutex_unlock (&skeleton->priv->lock);
+
+ if (emit_changed)
+ _um_realm_kerberos_membership_emit_changed (skeleton);
+}
+
+static void um_realm_kerberos_membership_skeleton_iface_init (UmRealmKerberosMembershipIface *iface);
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+G_DEFINE_TYPE_WITH_CODE (UmRealmKerberosMembershipSkeleton, um_realm_kerberos_membership_skeleton,
G_TYPE_DBUS_INTERFACE_SKELETON,
+ G_ADD_PRIVATE (UmRealmKerberosMembershipSkeleton)
+ G_IMPLEMENT_INTERFACE (UM_REALM_TYPE_KERBEROS_MEMBERSHIP,
um_realm_kerberos_membership_skeleton_iface_init));
+
+#else
+G_DEFINE_TYPE_WITH_CODE (UmRealmKerberosMembershipSkeleton, um_realm_kerberos_membership_skeleton,
G_TYPE_DBUS_INTERFACE_SKELETON,
+ G_IMPLEMENT_INTERFACE (UM_REALM_TYPE_KERBEROS_MEMBERSHIP,
um_realm_kerberos_membership_skeleton_iface_init));
+
+#endif
+static void
+um_realm_kerberos_membership_skeleton_finalize (GObject *object)
+{
+ UmRealmKerberosMembershipSkeleton *skeleton = UM_REALM_KERBEROS_MEMBERSHIP_SKELETON (object);
+ guint n;
+ for (n = 0; n < 3; n++)
+ g_value_unset (&skeleton->priv->properties[n]);
+ g_free (skeleton->priv->properties);
+ g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
+ if (skeleton->priv->changed_properties_idle_source != NULL)
+ g_source_destroy (skeleton->priv->changed_properties_idle_source);
+ g_main_context_unref (skeleton->priv->context);
+ g_mutex_clear (&skeleton->priv->lock);
+ G_OBJECT_CLASS (um_realm_kerberos_membership_skeleton_parent_class)->finalize (object);
+}
+
+static void
+um_realm_kerberos_membership_skeleton_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec G_GNUC_UNUSED)
+{
+ UmRealmKerberosMembershipSkeleton *skeleton = UM_REALM_KERBEROS_MEMBERSHIP_SKELETON (object);
+ g_assert (prop_id != 0 && prop_id - 1 < 3);
+ g_mutex_lock (&skeleton->priv->lock);
+ g_value_copy (&skeleton->priv->properties[prop_id - 1], value);
+ g_mutex_unlock (&skeleton->priv->lock);
+}
+
+static gboolean
+_um_realm_kerberos_membership_emit_changed (gpointer user_data)
+{
+ UmRealmKerberosMembershipSkeleton *skeleton = UM_REALM_KERBEROS_MEMBERSHIP_SKELETON (user_data);
+ GList *l;
+ GVariantBuilder builder;
+ GVariantBuilder invalidated_builder;
+ guint num_changes;
+
+ g_mutex_lock (&skeleton->priv->lock);
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}"));
+ g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE ("as"));
+ for (l = skeleton->priv->changed_properties, num_changes = 0; l != NULL; l = l->next)
+ {
+ ChangedProperty *cp = l->data;
+ GVariant *variant;
+ const GValue *cur_value;
+
+ cur_value = &skeleton->priv->properties[cp->prop_id - 1];
+ if (!_g_value_equal (cur_value, &cp->orig_value))
+ {
+ variant = g_dbus_gvalue_to_gvariant (cur_value, G_VARIANT_TYPE
(cp->info->parent_struct.signature));
+ g_variant_builder_add (&builder, "{sv}", cp->info->parent_struct.name, variant);
+ g_variant_unref (variant);
+ num_changes++;
+ }
+ }
+ if (num_changes > 0)
+ {
+ GList *connections, *ll;
+ GVariant *signal_variant;
+ signal_variant = g_variant_ref_sink (g_variant_new ("(sa{sv}as)",
"org.freedesktop.realmd.KerberosMembership",
+ &builder, &invalidated_builder));
+ connections = g_dbus_interface_skeleton_get_connections (G_DBUS_INTERFACE_SKELETON (skeleton));
+ for (ll = connections; ll != NULL; ll = ll->next)
+ {
+ GDBusConnection *connection = ll->data;
+
+ g_dbus_connection_emit_signal (connection,
+ NULL, g_dbus_interface_skeleton_get_object_path
(G_DBUS_INTERFACE_SKELETON (skeleton)),
+ "org.freedesktop.DBus.Properties",
+ "PropertiesChanged",
+ signal_variant,
+ NULL);
+ }
+ g_variant_unref (signal_variant);
+ g_list_free_full (connections, g_object_unref);
+ }
+ else
+ {
+ g_variant_builder_clear (&builder);
+ g_variant_builder_clear (&invalidated_builder);
+ }
+ g_list_free_full (skeleton->priv->changed_properties, (GDestroyNotify) _changed_property_free);
+ skeleton->priv->changed_properties = NULL;
+ skeleton->priv->changed_properties_idle_source = NULL;
+ g_mutex_unlock (&skeleton->priv->lock);
+ return FALSE;
+}
+
+static void
+_um_realm_kerberos_membership_schedule_emit_changed (UmRealmKerberosMembershipSkeleton *skeleton, const
_ExtendedGDBusPropertyInfo *info, guint prop_id, const GValue *orig_value)
+{
+ ChangedProperty *cp;
+ GList *l;
+ cp = NULL;
+ for (l = skeleton->priv->changed_properties; l != NULL; l = l->next)
+ {
+ ChangedProperty *i_cp = l->data;
+ if (i_cp->info == info)
+ {
+ cp = i_cp;
+ break;
+ }
+ }
+ if (cp == NULL)
+ {
+ cp = g_new0 (ChangedProperty, 1);
+ cp->prop_id = prop_id;
+ cp->info = info;
+ skeleton->priv->changed_properties = g_list_prepend (skeleton->priv->changed_properties, cp);
+ g_value_init (&cp->orig_value, G_VALUE_TYPE (orig_value));
+ g_value_copy (orig_value, &cp->orig_value);
+ }
+}
+
+static void
+um_realm_kerberos_membership_skeleton_notify (GObject *object,
+ GParamSpec *pspec G_GNUC_UNUSED)
+{
+ UmRealmKerberosMembershipSkeleton *skeleton = UM_REALM_KERBEROS_MEMBERSHIP_SKELETON (object);
+ g_mutex_lock (&skeleton->priv->lock);
+ if (skeleton->priv->changed_properties != NULL &&
+ skeleton->priv->changed_properties_idle_source == NULL)
+ {
+ skeleton->priv->changed_properties_idle_source = g_idle_source_new ();
+ g_source_set_priority (skeleton->priv->changed_properties_idle_source, G_PRIORITY_DEFAULT);
+ g_source_set_callback (skeleton->priv->changed_properties_idle_source,
_um_realm_kerberos_membership_emit_changed, g_object_ref (skeleton), (GDestroyNotify) g_object_unref);
+ g_source_attach (skeleton->priv->changed_properties_idle_source, skeleton->priv->context);
+ g_source_unref (skeleton->priv->changed_properties_idle_source);
+ }
+ g_mutex_unlock (&skeleton->priv->lock);
+}
+
+static void
+um_realm_kerberos_membership_skeleton_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ UmRealmKerberosMembershipSkeleton *skeleton = UM_REALM_KERBEROS_MEMBERSHIP_SKELETON (object);
+ g_assert (prop_id != 0 && prop_id - 1 < 3);
+ g_mutex_lock (&skeleton->priv->lock);
+ g_object_freeze_notify (object);
+ if (!_g_value_equal (value, &skeleton->priv->properties[prop_id - 1]))
+ {
+ if (g_dbus_interface_skeleton_get_connection (G_DBUS_INTERFACE_SKELETON (skeleton)) != NULL)
+ _um_realm_kerberos_membership_schedule_emit_changed (skeleton,
_um_realm_kerberos_membership_property_info_pointers[prop_id - 1], prop_id,
&skeleton->priv->properties[prop_id - 1]);
+ g_value_copy (value, &skeleton->priv->properties[prop_id - 1]);
+ g_object_notify_by_pspec (object, pspec);
+ }
+ g_mutex_unlock (&skeleton->priv->lock);
+ g_object_thaw_notify (object);
+}
+
+static void
+um_realm_kerberos_membership_skeleton_init (UmRealmKerberosMembershipSkeleton *skeleton)
+{
+#if GLIB_VERSION_MAX_ALLOWED >= GLIB_VERSION_2_38
+ skeleton->priv = um_realm_kerberos_membership_skeleton_get_instance_private (skeleton);
+#else
+ skeleton->priv = G_TYPE_INSTANCE_GET_PRIVATE (skeleton, UM_REALM_TYPE_KERBEROS_MEMBERSHIP_SKELETON,
UmRealmKerberosMembershipSkeletonPrivate);
+#endif
+
+ g_mutex_init (&skeleton->priv->lock);
+ skeleton->priv->context = g_main_context_ref_thread_default ();
+ skeleton->priv->properties = g_new0 (GValue, 3);
+ g_value_init (&skeleton->priv->properties[0], G_TYPE_STRING);
+ g_value_init (&skeleton->priv->properties[1], G_TYPE_VARIANT);
+ g_value_init (&skeleton->priv->properties[2], G_TYPE_VARIANT);
+}
+
+static const gchar *
+um_realm_kerberos_membership_skeleton_get_suggested_administrator (UmRealmKerberosMembership *object)
+{
+ UmRealmKerberosMembershipSkeleton *skeleton = UM_REALM_KERBEROS_MEMBERSHIP_SKELETON (object);
+ const gchar *value;
+ g_mutex_lock (&skeleton->priv->lock);
+ value = g_value_get_string (&(skeleton->priv->properties[0]));
+ g_mutex_unlock (&skeleton->priv->lock);
+ return value;
+}
+
+static GVariant *
+um_realm_kerberos_membership_skeleton_get_supported_join_credentials (UmRealmKerberosMembership *object)
+{
+ UmRealmKerberosMembershipSkeleton *skeleton = UM_REALM_KERBEROS_MEMBERSHIP_SKELETON (object);
+ GVariant *value;
+ g_mutex_lock (&skeleton->priv->lock);
+ value = g_value_get_variant (&(skeleton->priv->properties[1]));
+ g_mutex_unlock (&skeleton->priv->lock);
+ return value;
+}
+
+static GVariant *
+um_realm_kerberos_membership_skeleton_get_supported_leave_credentials (UmRealmKerberosMembership *object)
+{
+ UmRealmKerberosMembershipSkeleton *skeleton = UM_REALM_KERBEROS_MEMBERSHIP_SKELETON (object);
+ GVariant *value;
+ g_mutex_lock (&skeleton->priv->lock);
+ value = g_value_get_variant (&(skeleton->priv->properties[2]));
+ g_mutex_unlock (&skeleton->priv->lock);
+ return value;
+}
+
+static void
+um_realm_kerberos_membership_skeleton_class_init (UmRealmKerberosMembershipSkeletonClass *klass)
+{
+ GObjectClass *gobject_class;
+ GDBusInterfaceSkeletonClass *skeleton_class;
+
+ gobject_class = G_OBJECT_CLASS (klass);
+ gobject_class->finalize = um_realm_kerberos_membership_skeleton_finalize;
+ gobject_class->get_property = um_realm_kerberos_membership_skeleton_get_property;
+ gobject_class->set_property = um_realm_kerberos_membership_skeleton_set_property;
+ gobject_class->notify = um_realm_kerberos_membership_skeleton_notify;
+
+
+ um_realm_kerberos_membership_override_properties (gobject_class, 1);
+
+ skeleton_class = G_DBUS_INTERFACE_SKELETON_CLASS (klass);
+ skeleton_class->get_info = um_realm_kerberos_membership_skeleton_dbus_interface_get_info;
+ skeleton_class->get_properties = um_realm_kerberos_membership_skeleton_dbus_interface_get_properties;
+ skeleton_class->flush = um_realm_kerberos_membership_skeleton_dbus_interface_flush;
+ skeleton_class->get_vtable = um_realm_kerberos_membership_skeleton_dbus_interface_get_vtable;
+
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_38
+ g_type_class_add_private (klass, sizeof (UmRealmKerberosMembershipSkeletonPrivate));
+#endif
+}
+
+static void
+um_realm_kerberos_membership_skeleton_iface_init (UmRealmKerberosMembershipIface *iface)
+{
+ iface->get_suggested_administrator = um_realm_kerberos_membership_skeleton_get_suggested_administrator;
+ iface->get_supported_join_credentials =
um_realm_kerberos_membership_skeleton_get_supported_join_credentials;
+ iface->get_supported_leave_credentials =
um_realm_kerberos_membership_skeleton_get_supported_leave_credentials;
+}
+
+/**
+ * um_realm_kerberos_membership_skeleton_new:
+ *
+ * Creates a skeleton object for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-KerberosMembership.top_of_page">org.freedesktop.realmd.KerberosMembership</link>.
+ *
+ * Returns: (transfer full) (type UmRealmKerberosMembershipSkeleton): The skeleton object.
+ */
+UmRealmKerberosMembership *
+um_realm_kerberos_membership_skeleton_new (void)
+{
+ return UM_REALM_KERBEROS_MEMBERSHIP (g_object_new (UM_REALM_TYPE_KERBEROS_MEMBERSHIP_SKELETON, NULL));
+}
+
+/* ------------------------------------------------------------------------
+ * Code for Object, ObjectProxy and ObjectSkeleton
+ * ------------------------------------------------------------------------
+ */
+
+/**
+ * SECTION:UmRealmObject
+ * @title: UmRealmObject
+ * @short_description: Specialized GDBusObject types
+ *
+ * This section contains the #UmRealmObject, #UmRealmObjectProxy, and #UmRealmObjectSkeleton types which
make it easier to work with objects implementing generated types for D-Bus interfaces.
+ */
+
+/**
+ * UmRealmObject:
+ *
+ * The #UmRealmObject type is a specialized container of interfaces.
+ */
+
+/**
+ * UmRealmObjectIface:
+ * @parent_iface: The parent interface.
+ *
+ * Virtual table for the #UmRealmObject interface.
+ */
+
+typedef UmRealmObjectIface UmRealmObjectInterface;
+G_DEFINE_INTERFACE_WITH_CODE (UmRealmObject, um_realm_object, G_TYPE_OBJECT,
g_type_interface_add_prerequisite (g_define_type_id, G_TYPE_DBUS_OBJECT));
+
+static void
+um_realm_object_default_init (UmRealmObjectIface *iface)
+{
+ /**
+ * UmRealmObject:provider:
+ *
+ * The #UmRealmProvider instance corresponding to the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Provider.top_of_page">org.freedesktop.realmd.Provider</link>,
if any.
+ *
+ * Connect to the #GObject::notify signal to get informed of property changes.
+ */
+ g_object_interface_install_property (iface, g_param_spec_object ("provider", "provider", "provider",
UM_REALM_TYPE_PROVIDER, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS));
+
+ /**
+ * UmRealmObject:service:
+ *
+ * The #UmRealmService instance corresponding to the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Service.top_of_page">org.freedesktop.realmd.Service</link>,
if any.
+ *
+ * Connect to the #GObject::notify signal to get informed of property changes.
+ */
+ g_object_interface_install_property (iface, g_param_spec_object ("service", "service", "service",
UM_REALM_TYPE_SERVICE, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS));
+
+ /**
+ * UmRealmObject:common:
+ *
+ * The #UmRealmCommon instance corresponding to the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Realm.top_of_page">org.freedesktop.realmd.Realm</link>, if
any.
+ *
+ * Connect to the #GObject::notify signal to get informed of property changes.
+ */
+ g_object_interface_install_property (iface, g_param_spec_object ("common", "common", "common",
UM_REALM_TYPE_COMMON, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS));
+
+ /**
+ * UmRealmObject:kerberos:
+ *
+ * The #UmRealmKerberos instance corresponding to the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Kerberos.top_of_page">org.freedesktop.realmd.Kerberos</link>,
if any.
+ *
+ * Connect to the #GObject::notify signal to get informed of property changes.
+ */
+ g_object_interface_install_property (iface, g_param_spec_object ("kerberos", "kerberos", "kerberos",
UM_REALM_TYPE_KERBEROS, G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS));
+
+ /**
+ * UmRealmObject:kerberos-membership:
+ *
+ * The #UmRealmKerberosMembership instance corresponding to the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-KerberosMembership.top_of_page">org.freedesktop.realmd.KerberosMembership</link>,
if any.
+ *
+ * Connect to the #GObject::notify signal to get informed of property changes.
+ */
+ g_object_interface_install_property (iface, g_param_spec_object ("kerberos-membership",
"kerberos-membership", "kerberos-membership", UM_REALM_TYPE_KERBEROS_MEMBERSHIP,
G_PARAM_READWRITE|G_PARAM_STATIC_STRINGS));
+
+}
+
+/**
+ * um_realm_object_get_provider:
+ * @object: A #UmRealmObject.
+ *
+ * Gets the #UmRealmProvider instance for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Provider.top_of_page">org.freedesktop.realmd.Provider</link>
on @object, if any.
+ *
+ * Returns: (transfer full): A #UmRealmProvider that must be freed with g_object_unref() or %NULL if @object
does not implement the interface.
+ */
+UmRealmProvider *um_realm_object_get_provider (UmRealmObject *object)
+{
+ GDBusInterface *ret;
+ ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.freedesktop.realmd.Provider");
+ if (ret == NULL)
+ return NULL;
+ return UM_REALM_PROVIDER (ret);
+}
+
+/**
+ * um_realm_object_get_service:
+ * @object: A #UmRealmObject.
+ *
+ * Gets the #UmRealmService instance for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Service.top_of_page">org.freedesktop.realmd.Service</link> on
@object, if any.
+ *
+ * Returns: (transfer full): A #UmRealmService that must be freed with g_object_unref() or %NULL if @object
does not implement the interface.
+ */
+UmRealmService *um_realm_object_get_service (UmRealmObject *object)
+{
+ GDBusInterface *ret;
+ ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.freedesktop.realmd.Service");
+ if (ret == NULL)
+ return NULL;
+ return UM_REALM_SERVICE (ret);
+}
+
+/**
+ * um_realm_object_get_common:
+ * @object: A #UmRealmObject.
+ *
+ * Gets the #UmRealmCommon instance for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Realm.top_of_page">org.freedesktop.realmd.Realm</link> on
@object, if any.
+ *
+ * Returns: (transfer full): A #UmRealmCommon that must be freed with g_object_unref() or %NULL if @object
does not implement the interface.
+ */
+UmRealmCommon *um_realm_object_get_common (UmRealmObject *object)
+{
+ GDBusInterface *ret;
+ ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.freedesktop.realmd.Realm");
+ if (ret == NULL)
+ return NULL;
+ return UM_REALM_COMMON (ret);
+}
+
+/**
+ * um_realm_object_get_kerberos:
+ * @object: A #UmRealmObject.
+ *
+ * Gets the #UmRealmKerberos instance for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Kerberos.top_of_page">org.freedesktop.realmd.Kerberos</link>
on @object, if any.
+ *
+ * Returns: (transfer full): A #UmRealmKerberos that must be freed with g_object_unref() or %NULL if @object
does not implement the interface.
+ */
+UmRealmKerberos *um_realm_object_get_kerberos (UmRealmObject *object)
+{
+ GDBusInterface *ret;
+ ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.freedesktop.realmd.Kerberos");
+ if (ret == NULL)
+ return NULL;
+ return UM_REALM_KERBEROS (ret);
+}
+
+/**
+ * um_realm_object_get_kerberos_membership:
+ * @object: A #UmRealmObject.
+ *
+ * Gets the #UmRealmKerberosMembership instance for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-KerberosMembership.top_of_page">org.freedesktop.realmd.KerberosMembership</link>
on @object, if any.
+ *
+ * Returns: (transfer full): A #UmRealmKerberosMembership that must be freed with g_object_unref() or %NULL
if @object does not implement the interface.
+ */
+UmRealmKerberosMembership *um_realm_object_get_kerberos_membership (UmRealmObject *object)
+{
+ GDBusInterface *ret;
+ ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.freedesktop.realmd.KerberosMembership");
+ if (ret == NULL)
+ return NULL;
+ return UM_REALM_KERBEROS_MEMBERSHIP (ret);
+}
+
+
+/**
+ * um_realm_object_peek_provider: (skip)
+ * @object: A #UmRealmObject.
+ *
+ * Like um_realm_object_get_provider() but doesn't increase the reference count on the returned object.
+ *
+ * <warning>It is not safe to use the returned object if you are on another thread than the one where the
#GDBusObjectManagerClient or #GDBusObjectManagerServer for @object is running.</warning>
+ *
+ * Returns: (transfer none): A #UmRealmProvider or %NULL if @object does not implement the interface. Do not
free the returned object, it is owned by @object.
+ */
+UmRealmProvider *um_realm_object_peek_provider (UmRealmObject *object)
+{
+ GDBusInterface *ret;
+ ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.freedesktop.realmd.Provider");
+ if (ret == NULL)
+ return NULL;
+ g_object_unref (ret);
+ return UM_REALM_PROVIDER (ret);
+}
+
+/**
+ * um_realm_object_peek_service: (skip)
+ * @object: A #UmRealmObject.
+ *
+ * Like um_realm_object_get_service() but doesn't increase the reference count on the returned object.
+ *
+ * <warning>It is not safe to use the returned object if you are on another thread than the one where the
#GDBusObjectManagerClient or #GDBusObjectManagerServer for @object is running.</warning>
+ *
+ * Returns: (transfer none): A #UmRealmService or %NULL if @object does not implement the interface. Do not
free the returned object, it is owned by @object.
+ */
+UmRealmService *um_realm_object_peek_service (UmRealmObject *object)
+{
+ GDBusInterface *ret;
+ ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.freedesktop.realmd.Service");
+ if (ret == NULL)
+ return NULL;
+ g_object_unref (ret);
+ return UM_REALM_SERVICE (ret);
+}
+
+/**
+ * um_realm_object_peek_common: (skip)
+ * @object: A #UmRealmObject.
+ *
+ * Like um_realm_object_get_common() but doesn't increase the reference count on the returned object.
+ *
+ * <warning>It is not safe to use the returned object if you are on another thread than the one where the
#GDBusObjectManagerClient or #GDBusObjectManagerServer for @object is running.</warning>
+ *
+ * Returns: (transfer none): A #UmRealmCommon or %NULL if @object does not implement the interface. Do not
free the returned object, it is owned by @object.
+ */
+UmRealmCommon *um_realm_object_peek_common (UmRealmObject *object)
+{
+ GDBusInterface *ret;
+ ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.freedesktop.realmd.Realm");
+ if (ret == NULL)
+ return NULL;
+ g_object_unref (ret);
+ return UM_REALM_COMMON (ret);
+}
+
+/**
+ * um_realm_object_peek_kerberos: (skip)
+ * @object: A #UmRealmObject.
+ *
+ * Like um_realm_object_get_kerberos() but doesn't increase the reference count on the returned object.
+ *
+ * <warning>It is not safe to use the returned object if you are on another thread than the one where the
#GDBusObjectManagerClient or #GDBusObjectManagerServer for @object is running.</warning>
+ *
+ * Returns: (transfer none): A #UmRealmKerberos or %NULL if @object does not implement the interface. Do not
free the returned object, it is owned by @object.
+ */
+UmRealmKerberos *um_realm_object_peek_kerberos (UmRealmObject *object)
+{
+ GDBusInterface *ret;
+ ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.freedesktop.realmd.Kerberos");
+ if (ret == NULL)
+ return NULL;
+ g_object_unref (ret);
+ return UM_REALM_KERBEROS (ret);
+}
+
+/**
+ * um_realm_object_peek_kerberos_membership: (skip)
+ * @object: A #UmRealmObject.
+ *
+ * Like um_realm_object_get_kerberos_membership() but doesn't increase the reference count on the returned
object.
+ *
+ * <warning>It is not safe to use the returned object if you are on another thread than the one where the
#GDBusObjectManagerClient or #GDBusObjectManagerServer for @object is running.</warning>
+ *
+ * Returns: (transfer none): A #UmRealmKerberosMembership or %NULL if @object does not implement the
interface. Do not free the returned object, it is owned by @object.
+ */
+UmRealmKerberosMembership *um_realm_object_peek_kerberos_membership (UmRealmObject *object)
+{
+ GDBusInterface *ret;
+ ret = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.freedesktop.realmd.KerberosMembership");
+ if (ret == NULL)
+ return NULL;
+ g_object_unref (ret);
+ return UM_REALM_KERBEROS_MEMBERSHIP (ret);
+}
+
+
+static void
+um_realm_object_notify (GDBusObject *object, GDBusInterface *interface)
+{
+ g_object_notify (G_OBJECT (object), ((_ExtendedGDBusInterfaceInfo *) g_dbus_interface_get_info
(interface))->hyphen_name);
+}
+
+/**
+ * UmRealmObjectProxy:
+ *
+ * The #UmRealmObjectProxy structure contains only private data and should only be accessed using the
provided API.
+ */
+
+/**
+ * UmRealmObjectProxyClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #UmRealmObjectProxy.
+ */
+
+static void
+um_realm_object_proxy__um_realm_object_iface_init (UmRealmObjectIface *iface G_GNUC_UNUSED)
+{
+}
+
+static void
+um_realm_object_proxy__g_dbus_object_iface_init (GDBusObjectIface *iface)
+{
+ iface->interface_added = um_realm_object_notify;
+ iface->interface_removed = um_realm_object_notify;
+}
+
+
+G_DEFINE_TYPE_WITH_CODE (UmRealmObjectProxy, um_realm_object_proxy, G_TYPE_DBUS_OBJECT_PROXY,
+ G_IMPLEMENT_INTERFACE (UM_REALM_TYPE_OBJECT,
um_realm_object_proxy__um_realm_object_iface_init)
+ G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT,
um_realm_object_proxy__g_dbus_object_iface_init));
+
+static void
+um_realm_object_proxy_init (UmRealmObjectProxy *object G_GNUC_UNUSED)
+{
+}
+
+static void
+um_realm_object_proxy_set_property (GObject *gobject,
+ guint prop_id,
+ const GValue *value G_GNUC_UNUSED,
+ GParamSpec *pspec)
+{
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+}
+
+static void
+um_realm_object_proxy_get_property (GObject *gobject,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ UmRealmObjectProxy *object = UM_REALM_OBJECT_PROXY (gobject);
+ GDBusInterface *interface;
+
+ switch (prop_id)
+ {
+ case 1:
+ interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.freedesktop.realmd.Provider");
+ g_value_take_object (value, interface);
+ break;
+
+ case 2:
+ interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.freedesktop.realmd.Service");
+ g_value_take_object (value, interface);
+ break;
+
+ case 3:
+ interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.freedesktop.realmd.Realm");
+ g_value_take_object (value, interface);
+ break;
+
+ case 4:
+ interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.freedesktop.realmd.Kerberos");
+ g_value_take_object (value, interface);
+ break;
+
+ case 5:
+ interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object),
"org.freedesktop.realmd.KerberosMembership");
+ g_value_take_object (value, interface);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+um_realm_object_proxy_class_init (UmRealmObjectProxyClass *klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ gobject_class->set_property = um_realm_object_proxy_set_property;
+ gobject_class->get_property = um_realm_object_proxy_get_property;
+
+ g_object_class_override_property (gobject_class, 1, "provider");
+ g_object_class_override_property (gobject_class, 2, "service");
+ g_object_class_override_property (gobject_class, 3, "common");
+ g_object_class_override_property (gobject_class, 4, "kerberos");
+ g_object_class_override_property (gobject_class, 5, "kerberos-membership");
+}
+
+/**
+ * um_realm_object_proxy_new:
+ * @connection: A #GDBusConnection.
+ * @object_path: An object path.
+ *
+ * Creates a new proxy object.
+ *
+ * Returns: (transfer full): The proxy object.
+ */
+UmRealmObjectProxy *
+um_realm_object_proxy_new (GDBusConnection *connection,
+ const gchar *object_path)
+{
+ g_return_val_if_fail (G_IS_DBUS_CONNECTION (connection), NULL);
+ g_return_val_if_fail (g_variant_is_object_path (object_path), NULL);
+ return UM_REALM_OBJECT_PROXY (g_object_new (UM_REALM_TYPE_OBJECT_PROXY, "g-connection", connection,
"g-object-path", object_path, NULL));
+}
+
+/**
+ * UmRealmObjectSkeleton:
+ *
+ * The #UmRealmObjectSkeleton structure contains only private data and should only be accessed using the
provided API.
+ */
+
+/**
+ * UmRealmObjectSkeletonClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #UmRealmObjectSkeleton.
+ */
+
+static void
+um_realm_object_skeleton__um_realm_object_iface_init (UmRealmObjectIface *iface G_GNUC_UNUSED)
+{
+}
+
+
+static void
+um_realm_object_skeleton__g_dbus_object_iface_init (GDBusObjectIface *iface)
+{
+ iface->interface_added = um_realm_object_notify;
+ iface->interface_removed = um_realm_object_notify;
+}
+
+G_DEFINE_TYPE_WITH_CODE (UmRealmObjectSkeleton, um_realm_object_skeleton, G_TYPE_DBUS_OBJECT_SKELETON,
+ G_IMPLEMENT_INTERFACE (UM_REALM_TYPE_OBJECT,
um_realm_object_skeleton__um_realm_object_iface_init)
+ G_IMPLEMENT_INTERFACE (G_TYPE_DBUS_OBJECT,
um_realm_object_skeleton__g_dbus_object_iface_init));
+
+static void
+um_realm_object_skeleton_init (UmRealmObjectSkeleton *object G_GNUC_UNUSED)
+{
+}
+
+static void
+um_realm_object_skeleton_set_property (GObject *gobject,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ UmRealmObjectSkeleton *object = UM_REALM_OBJECT_SKELETON (gobject);
+ GDBusInterfaceSkeleton *interface;
+
+ switch (prop_id)
+ {
+ case 1:
+ interface = g_value_get_object (value);
+ if (interface != NULL)
+ {
+ g_warn_if_fail (UM_REALM_IS_PROVIDER (interface));
+ g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object), interface);
+ }
+ else
+ {
+ g_dbus_object_skeleton_remove_interface_by_name (G_DBUS_OBJECT_SKELETON (object),
"org.freedesktop.realmd.Provider");
+ }
+ break;
+
+ case 2:
+ interface = g_value_get_object (value);
+ if (interface != NULL)
+ {
+ g_warn_if_fail (UM_REALM_IS_SERVICE (interface));
+ g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object), interface);
+ }
+ else
+ {
+ g_dbus_object_skeleton_remove_interface_by_name (G_DBUS_OBJECT_SKELETON (object),
"org.freedesktop.realmd.Service");
+ }
+ break;
+
+ case 3:
+ interface = g_value_get_object (value);
+ if (interface != NULL)
+ {
+ g_warn_if_fail (UM_REALM_IS_COMMON (interface));
+ g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object), interface);
+ }
+ else
+ {
+ g_dbus_object_skeleton_remove_interface_by_name (G_DBUS_OBJECT_SKELETON (object),
"org.freedesktop.realmd.Realm");
+ }
+ break;
+
+ case 4:
+ interface = g_value_get_object (value);
+ if (interface != NULL)
+ {
+ g_warn_if_fail (UM_REALM_IS_KERBEROS (interface));
+ g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object), interface);
+ }
+ else
+ {
+ g_dbus_object_skeleton_remove_interface_by_name (G_DBUS_OBJECT_SKELETON (object),
"org.freedesktop.realmd.Kerberos");
+ }
+ break;
+
+ case 5:
+ interface = g_value_get_object (value);
+ if (interface != NULL)
+ {
+ g_warn_if_fail (UM_REALM_IS_KERBEROS_MEMBERSHIP (interface));
+ g_dbus_object_skeleton_add_interface (G_DBUS_OBJECT_SKELETON (object), interface);
+ }
+ else
+ {
+ g_dbus_object_skeleton_remove_interface_by_name (G_DBUS_OBJECT_SKELETON (object),
"org.freedesktop.realmd.KerberosMembership");
+ }
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+um_realm_object_skeleton_get_property (GObject *gobject,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ UmRealmObjectSkeleton *object = UM_REALM_OBJECT_SKELETON (gobject);
+ GDBusInterface *interface;
+
+ switch (prop_id)
+ {
+ case 1:
+ interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.freedesktop.realmd.Provider");
+ g_value_take_object (value, interface);
+ break;
+
+ case 2:
+ interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.freedesktop.realmd.Service");
+ g_value_take_object (value, interface);
+ break;
+
+ case 3:
+ interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.freedesktop.realmd.Realm");
+ g_value_take_object (value, interface);
+ break;
+
+ case 4:
+ interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object), "org.freedesktop.realmd.Kerberos");
+ g_value_take_object (value, interface);
+ break;
+
+ case 5:
+ interface = g_dbus_object_get_interface (G_DBUS_OBJECT (object),
"org.freedesktop.realmd.KerberosMembership");
+ g_value_take_object (value, interface);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+um_realm_object_skeleton_class_init (UmRealmObjectSkeletonClass *klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+ gobject_class->set_property = um_realm_object_skeleton_set_property;
+ gobject_class->get_property = um_realm_object_skeleton_get_property;
+
+ g_object_class_override_property (gobject_class, 1, "provider");
+ g_object_class_override_property (gobject_class, 2, "service");
+ g_object_class_override_property (gobject_class, 3, "common");
+ g_object_class_override_property (gobject_class, 4, "kerberos");
+ g_object_class_override_property (gobject_class, 5, "kerberos-membership");
+}
+
+/**
+ * um_realm_object_skeleton_new:
+ * @object_path: An object path.
+ *
+ * Creates a new skeleton object.
+ *
+ * Returns: (transfer full): The skeleton object.
+ */
+UmRealmObjectSkeleton *
+um_realm_object_skeleton_new (const gchar *object_path)
+{
+ g_return_val_if_fail (g_variant_is_object_path (object_path), NULL);
+ return UM_REALM_OBJECT_SKELETON (g_object_new (UM_REALM_TYPE_OBJECT_SKELETON, "g-object-path",
object_path, NULL));
+}
+
+/**
+ * um_realm_object_skeleton_set_provider:
+ * @object: A #UmRealmObjectSkeleton.
+ * @interface_: (allow-none): A #UmRealmProvider or %NULL to clear the interface.
+ *
+ * Sets the #UmRealmProvider instance for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Provider.top_of_page">org.freedesktop.realmd.Provider</link>
on @object.
+ */
+void um_realm_object_skeleton_set_provider (UmRealmObjectSkeleton *object, UmRealmProvider *interface_)
+{
+ g_object_set (G_OBJECT (object), "provider", interface_, NULL);
+}
+
+/**
+ * um_realm_object_skeleton_set_service:
+ * @object: A #UmRealmObjectSkeleton.
+ * @interface_: (allow-none): A #UmRealmService or %NULL to clear the interface.
+ *
+ * Sets the #UmRealmService instance for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Service.top_of_page">org.freedesktop.realmd.Service</link> on
@object.
+ */
+void um_realm_object_skeleton_set_service (UmRealmObjectSkeleton *object, UmRealmService *interface_)
+{
+ g_object_set (G_OBJECT (object), "service", interface_, NULL);
+}
+
+/**
+ * um_realm_object_skeleton_set_common:
+ * @object: A #UmRealmObjectSkeleton.
+ * @interface_: (allow-none): A #UmRealmCommon or %NULL to clear the interface.
+ *
+ * Sets the #UmRealmCommon instance for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Realm.top_of_page">org.freedesktop.realmd.Realm</link> on
@object.
+ */
+void um_realm_object_skeleton_set_common (UmRealmObjectSkeleton *object, UmRealmCommon *interface_)
+{
+ g_object_set (G_OBJECT (object), "common", interface_, NULL);
+}
+
+/**
+ * um_realm_object_skeleton_set_kerberos:
+ * @object: A #UmRealmObjectSkeleton.
+ * @interface_: (allow-none): A #UmRealmKerberos or %NULL to clear the interface.
+ *
+ * Sets the #UmRealmKerberos instance for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-Kerberos.top_of_page">org.freedesktop.realmd.Kerberos</link>
on @object.
+ */
+void um_realm_object_skeleton_set_kerberos (UmRealmObjectSkeleton *object, UmRealmKerberos *interface_)
+{
+ g_object_set (G_OBJECT (object), "kerberos", interface_, NULL);
+}
+
+/**
+ * um_realm_object_skeleton_set_kerberos_membership:
+ * @object: A #UmRealmObjectSkeleton.
+ * @interface_: (allow-none): A #UmRealmKerberosMembership or %NULL to clear the interface.
+ *
+ * Sets the #UmRealmKerberosMembership instance for the D-Bus interface <link
linkend="gdbus-interface-org-freedesktop-realmd-KerberosMembership.top_of_page">org.freedesktop.realmd.KerberosMembership</link>
on @object.
+ */
+void um_realm_object_skeleton_set_kerberos_membership (UmRealmObjectSkeleton *object,
UmRealmKerberosMembership *interface_)
+{
+ g_object_set (G_OBJECT (object), "kerberos-membership", interface_, NULL);
+}
+
+
+/* ------------------------------------------------------------------------
+ * Code for ObjectManager client
+ * ------------------------------------------------------------------------
+ */
+
+/**
+ * SECTION:UmRealmObjectManagerClient
+ * @title: UmRealmObjectManagerClient
+ * @short_description: Generated GDBusObjectManagerClient type
+ *
+ * This section contains a #GDBusObjectManagerClient that uses
um_realm_object_manager_client_get_proxy_type() as the #GDBusProxyTypeFunc.
+ */
+
+/**
+ * UmRealmObjectManagerClient:
+ *
+ * The #UmRealmObjectManagerClient structure contains only private data and should only be accessed using
the provided API.
+ */
+
+/**
+ * UmRealmObjectManagerClientClass:
+ * @parent_class: The parent class.
+ *
+ * Class structure for #UmRealmObjectManagerClient.
+ */
+
+G_DEFINE_TYPE (UmRealmObjectManagerClient, um_realm_object_manager_client,
G_TYPE_DBUS_OBJECT_MANAGER_CLIENT);
+
+static void
+um_realm_object_manager_client_init (UmRealmObjectManagerClient *manager G_GNUC_UNUSED)
+{
+}
+
+static void
+um_realm_object_manager_client_class_init (UmRealmObjectManagerClientClass *klass G_GNUC_UNUSED)
+{
+}
+
+/**
+ * um_realm_object_manager_client_get_proxy_type:
+ * @manager: A #GDBusObjectManagerClient.
+ * @object_path: The object path of the remote object (unused).
+ * @interface_name: (allow-none): Interface name of the remote object or %NULL to get the object proxy
#GType.
+ * @user_data: User data (unused).
+ *
+ * A #GDBusProxyTypeFunc that maps @interface_name to the generated #GDBusObjectProxy<!-- -->- and
#GDBusProxy<!-- -->-derived types.
+ *
+ * Returns: A #GDBusProxy<!-- -->-derived #GType if @interface_name is not %NULL, otherwise the #GType for
#UmRealmObjectProxy.
+ */
+GType
+um_realm_object_manager_client_get_proxy_type (GDBusObjectManagerClient *manager G_GNUC_UNUSED, const gchar
*object_path G_GNUC_UNUSED, const gchar *interface_name, gpointer user_data G_GNUC_UNUSED)
+{
+ static gsize once_init_value = 0;
+ static GHashTable *lookup_hash;
+ GType ret;
+
+ if (interface_name == NULL)
+ return UM_REALM_TYPE_OBJECT_PROXY;
+ if (g_once_init_enter (&once_init_value))
+ {
+ lookup_hash = g_hash_table_new (g_str_hash, g_str_equal);
+ g_hash_table_insert (lookup_hash, (gpointer) "org.freedesktop.realmd.Provider", GSIZE_TO_POINTER
(UM_REALM_TYPE_PROVIDER_PROXY));
+ g_hash_table_insert (lookup_hash, (gpointer) "org.freedesktop.realmd.Service", GSIZE_TO_POINTER
(UM_REALM_TYPE_SERVICE_PROXY));
+ g_hash_table_insert (lookup_hash, (gpointer) "org.freedesktop.realmd.Realm", GSIZE_TO_POINTER
(UM_REALM_TYPE_COMMON_PROXY));
+ g_hash_table_insert (lookup_hash, (gpointer) "org.freedesktop.realmd.Kerberos", GSIZE_TO_POINTER
(UM_REALM_TYPE_KERBEROS_PROXY));
+ g_hash_table_insert (lookup_hash, (gpointer) "org.freedesktop.realmd.KerberosMembership",
GSIZE_TO_POINTER (UM_REALM_TYPE_KERBEROS_MEMBERSHIP_PROXY));
+ g_once_init_leave (&once_init_value, 1);
+ }
+ ret = (GType) GPOINTER_TO_SIZE (g_hash_table_lookup (lookup_hash, interface_name));
+ if (ret == (GType) 0)
+ ret = G_TYPE_DBUS_PROXY;
+ return ret;
+}
+
+/**
+ * um_realm_object_manager_client_new:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus
connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Asynchronously creates #GDBusObjectManagerClient using um_realm_object_manager_client_get_proxy_type() as
the #GDBusProxyTypeFunc. See g_dbus_object_manager_client_new() for more details.
+ *
+ * When the operation is finished, @callback will be invoked in the <link
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling
this method from.
+ * You can then call um_realm_object_manager_client_new_finish() to get the result of the operation.
+ *
+ * See um_realm_object_manager_client_new_sync() for the synchronous, blocking version of this constructor.
+ */
+void
+um_realm_object_manager_client_new (
+ GDBusConnection *connection,
+ GDBusObjectManagerClientFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_async_initable_new_async (UM_REALM_TYPE_OBJECT_MANAGER_CLIENT, G_PRIORITY_DEFAULT, cancellable,
callback, user_data, "flags", flags, "name", name, "connection", connection, "object-path", object_path,
"get-proxy-type-func", um_realm_object_manager_client_get_proxy_type, NULL);
+}
+
+/**
+ * um_realm_object_manager_client_new_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to
um_realm_object_manager_client_new().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with um_realm_object_manager_client_new().
+ *
+ * Returns: (transfer full) (type UmRealmObjectManagerClient): The constructed object manager client or
%NULL if @error is set.
+ */
+GDBusObjectManager *
+um_realm_object_manager_client_new_finish (
+ GAsyncResult *res,
+ GError **error)
+{
+ GObject *ret;
+ GObject *source_object;
+ source_object = g_async_result_get_source_object (res);
+ ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+ g_object_unref (source_object);
+ if (ret != NULL)
+ return G_DBUS_OBJECT_MANAGER (ret);
+ else
+ return NULL;
+}
+
+/**
+ * um_realm_object_manager_client_new_sync:
+ * @connection: A #GDBusConnection.
+ * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.
+ * @name: (allow-none): A bus name (well-known or unique) or %NULL if @connection is not a message bus
connection.
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Synchronously creates #GDBusObjectManagerClient using um_realm_object_manager_client_get_proxy_type() as
the #GDBusProxyTypeFunc. See g_dbus_object_manager_client_new_sync() for more details.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See um_realm_object_manager_client_new() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type UmRealmObjectManagerClient): The constructed object manager client or
%NULL if @error is set.
+ */
+GDBusObjectManager *
+um_realm_object_manager_client_new_sync (
+ GDBusConnection *connection,
+ GDBusObjectManagerClientFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GInitable *ret;
+ ret = g_initable_new (UM_REALM_TYPE_OBJECT_MANAGER_CLIENT, cancellable, error, "flags", flags, "name",
name, "connection", connection, "object-path", object_path, "get-proxy-type-func",
um_realm_object_manager_client_get_proxy_type, NULL);
+ if (ret != NULL)
+ return G_DBUS_OBJECT_MANAGER (ret);
+ else
+ return NULL;
+}
+
+
+/**
+ * um_realm_object_manager_client_new_for_bus:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @callback: A #GAsyncReadyCallback to call when the request is satisfied.
+ * @user_data: User data to pass to @callback.
+ *
+ * Like um_realm_object_manager_client_new() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * When the operation is finished, @callback will be invoked in the <link
linkend="g-main-context-push-thread-default">thread-default main loop</link> of the thread you are calling
this method from.
+ * You can then call um_realm_object_manager_client_new_for_bus_finish() to get the result of the operation.
+ *
+ * See um_realm_object_manager_client_new_for_bus_sync() for the synchronous, blocking version of this
constructor.
+ */
+void
+um_realm_object_manager_client_new_for_bus (
+ GBusType bus_type,
+ GDBusObjectManagerClientFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_async_initable_new_async (UM_REALM_TYPE_OBJECT_MANAGER_CLIENT, G_PRIORITY_DEFAULT, cancellable,
callback, user_data, "flags", flags, "name", name, "bus-type", bus_type, "object-path", object_path,
"get-proxy-type-func", um_realm_object_manager_client_get_proxy_type, NULL);
+}
+
+/**
+ * um_realm_object_manager_client_new_for_bus_finish:
+ * @res: The #GAsyncResult obtained from the #GAsyncReadyCallback passed to
um_realm_object_manager_client_new_for_bus().
+ * @error: Return location for error or %NULL
+ *
+ * Finishes an operation started with um_realm_object_manager_client_new_for_bus().
+ *
+ * Returns: (transfer full) (type UmRealmObjectManagerClient): The constructed object manager client or
%NULL if @error is set.
+ */
+GDBusObjectManager *
+um_realm_object_manager_client_new_for_bus_finish (
+ GAsyncResult *res,
+ GError **error)
+{
+ GObject *ret;
+ GObject *source_object;
+ source_object = g_async_result_get_source_object (res);
+ ret = g_async_initable_new_finish (G_ASYNC_INITABLE (source_object), res, error);
+ g_object_unref (source_object);
+ if (ret != NULL)
+ return G_DBUS_OBJECT_MANAGER (ret);
+ else
+ return NULL;
+}
+
+/**
+ * um_realm_object_manager_client_new_for_bus_sync:
+ * @bus_type: A #GBusType.
+ * @flags: Flags from the #GDBusObjectManagerClientFlags enumeration.
+ * @name: A bus name (well-known or unique).
+ * @object_path: An object path.
+ * @cancellable: (allow-none): A #GCancellable or %NULL.
+ * @error: Return location for error or %NULL
+ *
+ * Like um_realm_object_manager_client_new_sync() but takes a #GBusType instead of a #GDBusConnection.
+ *
+ * The calling thread is blocked until a reply is received.
+ *
+ * See um_realm_object_manager_client_new_for_bus() for the asynchronous version of this constructor.
+ *
+ * Returns: (transfer full) (type UmRealmObjectManagerClient): The constructed object manager client or
%NULL if @error is set.
+ */
+GDBusObjectManager *
+um_realm_object_manager_client_new_for_bus_sync (
+ GBusType bus_type,
+ GDBusObjectManagerClientFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error)
+{
+ GInitable *ret;
+ ret = g_initable_new (UM_REALM_TYPE_OBJECT_MANAGER_CLIENT, cancellable, error, "flags", flags, "name",
name, "bus-type", bus_type, "object-path", object_path, "get-proxy-type-func",
um_realm_object_manager_client_get_proxy_type, NULL);
+ if (ret != NULL)
+ return G_DBUS_OBJECT_MANAGER (ret);
+ else
+ return NULL;
+}
+
+
diff --git a/gnome-initial-setup/pages/password/um-realm-generated.h
b/gnome-initial-setup/pages/password/um-realm-generated.h
new file mode 100644
index 0000000..571743d
--- /dev/null
+++ b/gnome-initial-setup/pages/password/um-realm-generated.h
@@ -0,0 +1,1147 @@
+/*
+ * Generated by gdbus-codegen 2.39.2. DO NOT EDIT.
+ *
+ * The license of this code is the same as for the source it was derived from.
+ */
+
+#ifndef __UM_REALM_GENERATED_H__
+#define __UM_REALM_GENERATED_H__
+
+#include <gio/gio.h>
+
+G_BEGIN_DECLS
+
+
+/* ------------------------------------------------------------------------ */
+/* Declarations for org.freedesktop.realmd.Provider */
+
+#define UM_REALM_TYPE_PROVIDER (um_realm_provider_get_type ())
+#define UM_REALM_PROVIDER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), UM_REALM_TYPE_PROVIDER, UmRealmProvider))
+#define UM_REALM_IS_PROVIDER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), UM_REALM_TYPE_PROVIDER))
+#define UM_REALM_PROVIDER_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), UM_REALM_TYPE_PROVIDER,
UmRealmProviderIface))
+
+struct _UmRealmProvider;
+typedef struct _UmRealmProvider UmRealmProvider;
+typedef struct _UmRealmProviderIface UmRealmProviderIface;
+
+struct _UmRealmProviderIface
+{
+ GTypeInterface parent_iface;
+
+
+ gboolean (*handle_discover) (
+ UmRealmProvider *object,
+ GDBusMethodInvocation *invocation,
+ const gchar *arg_string,
+ GVariant *arg_options);
+
+ const gchar * (*get_name) (UmRealmProvider *object);
+
+ const gchar *const * (*get_realms) (UmRealmProvider *object);
+
+ const gchar * (*get_version) (UmRealmProvider *object);
+
+};
+
+GType um_realm_provider_get_type (void) G_GNUC_CONST;
+
+GDBusInterfaceInfo *um_realm_provider_interface_info (void);
+guint um_realm_provider_override_properties (GObjectClass *klass, guint property_id_begin);
+
+
+/* D-Bus method call completion functions: */
+void um_realm_provider_complete_discover (
+ UmRealmProvider *object,
+ GDBusMethodInvocation *invocation,
+ gint relevance,
+ const gchar *const *realm);
+
+
+
+/* D-Bus method calls: */
+void um_realm_provider_call_discover (
+ UmRealmProvider *proxy,
+ const gchar *arg_string,
+ GVariant *arg_options,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+gboolean um_realm_provider_call_discover_finish (
+ UmRealmProvider *proxy,
+ gint *out_relevance,
+ gchar ***out_realm,
+ GAsyncResult *res,
+ GError **error);
+
+gboolean um_realm_provider_call_discover_sync (
+ UmRealmProvider *proxy,
+ const gchar *arg_string,
+ GVariant *arg_options,
+ gint *out_relevance,
+ gchar ***out_realm,
+ GCancellable *cancellable,
+ GError **error);
+
+
+
+/* D-Bus property accessors: */
+const gchar *um_realm_provider_get_name (UmRealmProvider *object);
+gchar *um_realm_provider_dup_name (UmRealmProvider *object);
+void um_realm_provider_set_name (UmRealmProvider *object, const gchar *value);
+
+const gchar *um_realm_provider_get_version (UmRealmProvider *object);
+gchar *um_realm_provider_dup_version (UmRealmProvider *object);
+void um_realm_provider_set_version (UmRealmProvider *object, const gchar *value);
+
+const gchar *const *um_realm_provider_get_realms (UmRealmProvider *object);
+gchar **um_realm_provider_dup_realms (UmRealmProvider *object);
+void um_realm_provider_set_realms (UmRealmProvider *object, const gchar *const *value);
+
+
+/* ---- */
+
+#define UM_REALM_TYPE_PROVIDER_PROXY (um_realm_provider_proxy_get_type ())
+#define UM_REALM_PROVIDER_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), UM_REALM_TYPE_PROVIDER_PROXY,
UmRealmProviderProxy))
+#define UM_REALM_PROVIDER_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), UM_REALM_TYPE_PROVIDER_PROXY,
UmRealmProviderProxyClass))
+#define UM_REALM_PROVIDER_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), UM_REALM_TYPE_PROVIDER_PROXY,
UmRealmProviderProxyClass))
+#define UM_REALM_IS_PROVIDER_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), UM_REALM_TYPE_PROVIDER_PROXY))
+#define UM_REALM_IS_PROVIDER_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), UM_REALM_TYPE_PROVIDER_PROXY))
+
+typedef struct _UmRealmProviderProxy UmRealmProviderProxy;
+typedef struct _UmRealmProviderProxyClass UmRealmProviderProxyClass;
+typedef struct _UmRealmProviderProxyPrivate UmRealmProviderProxyPrivate;
+
+struct _UmRealmProviderProxy
+{
+ /*< private >*/
+ GDBusProxy parent_instance;
+ UmRealmProviderProxyPrivate *priv;
+};
+
+struct _UmRealmProviderProxyClass
+{
+ GDBusProxyClass parent_class;
+};
+
+GType um_realm_provider_proxy_get_type (void) G_GNUC_CONST;
+
+void um_realm_provider_proxy_new (
+ GDBusConnection *connection,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+UmRealmProvider *um_realm_provider_proxy_new_finish (
+ GAsyncResult *res,
+ GError **error);
+UmRealmProvider *um_realm_provider_proxy_new_sync (
+ GDBusConnection *connection,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error);
+
+void um_realm_provider_proxy_new_for_bus (
+ GBusType bus_type,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+UmRealmProvider *um_realm_provider_proxy_new_for_bus_finish (
+ GAsyncResult *res,
+ GError **error);
+UmRealmProvider *um_realm_provider_proxy_new_for_bus_sync (
+ GBusType bus_type,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error);
+
+
+/* ---- */
+
+#define UM_REALM_TYPE_PROVIDER_SKELETON (um_realm_provider_skeleton_get_type ())
+#define UM_REALM_PROVIDER_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), UM_REALM_TYPE_PROVIDER_SKELETON,
UmRealmProviderSkeleton))
+#define UM_REALM_PROVIDER_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), UM_REALM_TYPE_PROVIDER_SKELETON,
UmRealmProviderSkeletonClass))
+#define UM_REALM_PROVIDER_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o),
UM_REALM_TYPE_PROVIDER_SKELETON, UmRealmProviderSkeletonClass))
+#define UM_REALM_IS_PROVIDER_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), UM_REALM_TYPE_PROVIDER_SKELETON))
+#define UM_REALM_IS_PROVIDER_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k),
UM_REALM_TYPE_PROVIDER_SKELETON))
+
+typedef struct _UmRealmProviderSkeleton UmRealmProviderSkeleton;
+typedef struct _UmRealmProviderSkeletonClass UmRealmProviderSkeletonClass;
+typedef struct _UmRealmProviderSkeletonPrivate UmRealmProviderSkeletonPrivate;
+
+struct _UmRealmProviderSkeleton
+{
+ /*< private >*/
+ GDBusInterfaceSkeleton parent_instance;
+ UmRealmProviderSkeletonPrivate *priv;
+};
+
+struct _UmRealmProviderSkeletonClass
+{
+ GDBusInterfaceSkeletonClass parent_class;
+};
+
+GType um_realm_provider_skeleton_get_type (void) G_GNUC_CONST;
+
+UmRealmProvider *um_realm_provider_skeleton_new (void);
+
+
+/* ------------------------------------------------------------------------ */
+/* Declarations for org.freedesktop.realmd.Service */
+
+#define UM_REALM_TYPE_SERVICE (um_realm_service_get_type ())
+#define UM_REALM_SERVICE(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), UM_REALM_TYPE_SERVICE, UmRealmService))
+#define UM_REALM_IS_SERVICE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), UM_REALM_TYPE_SERVICE))
+#define UM_REALM_SERVICE_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), UM_REALM_TYPE_SERVICE,
UmRealmServiceIface))
+
+struct _UmRealmService;
+typedef struct _UmRealmService UmRealmService;
+typedef struct _UmRealmServiceIface UmRealmServiceIface;
+
+struct _UmRealmServiceIface
+{
+ GTypeInterface parent_iface;
+
+
+ gboolean (*handle_cancel) (
+ UmRealmService *object,
+ GDBusMethodInvocation *invocation,
+ const gchar *arg_operation);
+
+ gboolean (*handle_release) (
+ UmRealmService *object,
+ GDBusMethodInvocation *invocation);
+
+ gboolean (*handle_set_locale) (
+ UmRealmService *object,
+ GDBusMethodInvocation *invocation,
+ const gchar *arg_locale);
+
+ void (*diagnostics) (
+ UmRealmService *object,
+ const gchar *arg_data,
+ const gchar *arg_operation);
+
+};
+
+GType um_realm_service_get_type (void) G_GNUC_CONST;
+
+GDBusInterfaceInfo *um_realm_service_interface_info (void);
+guint um_realm_service_override_properties (GObjectClass *klass, guint property_id_begin);
+
+
+/* D-Bus method call completion functions: */
+void um_realm_service_complete_cancel (
+ UmRealmService *object,
+ GDBusMethodInvocation *invocation);
+
+void um_realm_service_complete_set_locale (
+ UmRealmService *object,
+ GDBusMethodInvocation *invocation);
+
+void um_realm_service_complete_release (
+ UmRealmService *object,
+ GDBusMethodInvocation *invocation);
+
+
+
+/* D-Bus signal emissions functions: */
+void um_realm_service_emit_diagnostics (
+ UmRealmService *object,
+ const gchar *arg_data,
+ const gchar *arg_operation);
+
+
+
+/* D-Bus method calls: */
+void um_realm_service_call_cancel (
+ UmRealmService *proxy,
+ const gchar *arg_operation,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+gboolean um_realm_service_call_cancel_finish (
+ UmRealmService *proxy,
+ GAsyncResult *res,
+ GError **error);
+
+gboolean um_realm_service_call_cancel_sync (
+ UmRealmService *proxy,
+ const gchar *arg_operation,
+ GCancellable *cancellable,
+ GError **error);
+
+void um_realm_service_call_set_locale (
+ UmRealmService *proxy,
+ const gchar *arg_locale,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+gboolean um_realm_service_call_set_locale_finish (
+ UmRealmService *proxy,
+ GAsyncResult *res,
+ GError **error);
+
+gboolean um_realm_service_call_set_locale_sync (
+ UmRealmService *proxy,
+ const gchar *arg_locale,
+ GCancellable *cancellable,
+ GError **error);
+
+void um_realm_service_call_release (
+ UmRealmService *proxy,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+gboolean um_realm_service_call_release_finish (
+ UmRealmService *proxy,
+ GAsyncResult *res,
+ GError **error);
+
+gboolean um_realm_service_call_release_sync (
+ UmRealmService *proxy,
+ GCancellable *cancellable,
+ GError **error);
+
+
+
+/* ---- */
+
+#define UM_REALM_TYPE_SERVICE_PROXY (um_realm_service_proxy_get_type ())
+#define UM_REALM_SERVICE_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), UM_REALM_TYPE_SERVICE_PROXY,
UmRealmServiceProxy))
+#define UM_REALM_SERVICE_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), UM_REALM_TYPE_SERVICE_PROXY,
UmRealmServiceProxyClass))
+#define UM_REALM_SERVICE_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), UM_REALM_TYPE_SERVICE_PROXY,
UmRealmServiceProxyClass))
+#define UM_REALM_IS_SERVICE_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), UM_REALM_TYPE_SERVICE_PROXY))
+#define UM_REALM_IS_SERVICE_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), UM_REALM_TYPE_SERVICE_PROXY))
+
+typedef struct _UmRealmServiceProxy UmRealmServiceProxy;
+typedef struct _UmRealmServiceProxyClass UmRealmServiceProxyClass;
+typedef struct _UmRealmServiceProxyPrivate UmRealmServiceProxyPrivate;
+
+struct _UmRealmServiceProxy
+{
+ /*< private >*/
+ GDBusProxy parent_instance;
+ UmRealmServiceProxyPrivate *priv;
+};
+
+struct _UmRealmServiceProxyClass
+{
+ GDBusProxyClass parent_class;
+};
+
+GType um_realm_service_proxy_get_type (void) G_GNUC_CONST;
+
+void um_realm_service_proxy_new (
+ GDBusConnection *connection,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+UmRealmService *um_realm_service_proxy_new_finish (
+ GAsyncResult *res,
+ GError **error);
+UmRealmService *um_realm_service_proxy_new_sync (
+ GDBusConnection *connection,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error);
+
+void um_realm_service_proxy_new_for_bus (
+ GBusType bus_type,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+UmRealmService *um_realm_service_proxy_new_for_bus_finish (
+ GAsyncResult *res,
+ GError **error);
+UmRealmService *um_realm_service_proxy_new_for_bus_sync (
+ GBusType bus_type,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error);
+
+
+/* ---- */
+
+#define UM_REALM_TYPE_SERVICE_SKELETON (um_realm_service_skeleton_get_type ())
+#define UM_REALM_SERVICE_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), UM_REALM_TYPE_SERVICE_SKELETON,
UmRealmServiceSkeleton))
+#define UM_REALM_SERVICE_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), UM_REALM_TYPE_SERVICE_SKELETON,
UmRealmServiceSkeletonClass))
+#define UM_REALM_SERVICE_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o),
UM_REALM_TYPE_SERVICE_SKELETON, UmRealmServiceSkeletonClass))
+#define UM_REALM_IS_SERVICE_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), UM_REALM_TYPE_SERVICE_SKELETON))
+#define UM_REALM_IS_SERVICE_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), UM_REALM_TYPE_SERVICE_SKELETON))
+
+typedef struct _UmRealmServiceSkeleton UmRealmServiceSkeleton;
+typedef struct _UmRealmServiceSkeletonClass UmRealmServiceSkeletonClass;
+typedef struct _UmRealmServiceSkeletonPrivate UmRealmServiceSkeletonPrivate;
+
+struct _UmRealmServiceSkeleton
+{
+ /*< private >*/
+ GDBusInterfaceSkeleton parent_instance;
+ UmRealmServiceSkeletonPrivate *priv;
+};
+
+struct _UmRealmServiceSkeletonClass
+{
+ GDBusInterfaceSkeletonClass parent_class;
+};
+
+GType um_realm_service_skeleton_get_type (void) G_GNUC_CONST;
+
+UmRealmService *um_realm_service_skeleton_new (void);
+
+
+/* ------------------------------------------------------------------------ */
+/* Declarations for org.freedesktop.realmd.Realm */
+
+#define UM_REALM_TYPE_COMMON (um_realm_common_get_type ())
+#define UM_REALM_COMMON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), UM_REALM_TYPE_COMMON, UmRealmCommon))
+#define UM_REALM_IS_COMMON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), UM_REALM_TYPE_COMMON))
+#define UM_REALM_COMMON_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), UM_REALM_TYPE_COMMON,
UmRealmCommonIface))
+
+struct _UmRealmCommon;
+typedef struct _UmRealmCommon UmRealmCommon;
+typedef struct _UmRealmCommonIface UmRealmCommonIface;
+
+struct _UmRealmCommonIface
+{
+ GTypeInterface parent_iface;
+
+
+ gboolean (*handle_change_login_policy) (
+ UmRealmCommon *object,
+ GDBusMethodInvocation *invocation,
+ const gchar *arg_login_policy,
+ const gchar *const *arg_permitted_add,
+ const gchar *const *arg_permitted_remove,
+ GVariant *arg_options);
+
+ gboolean (*handle_deconfigure) (
+ UmRealmCommon *object,
+ GDBusMethodInvocation *invocation,
+ GVariant *arg_options);
+
+ const gchar * (*get_configured) (UmRealmCommon *object);
+
+ GVariant * (*get_details) (UmRealmCommon *object);
+
+ const gchar *const * (*get_login_formats) (UmRealmCommon *object);
+
+ const gchar * (*get_login_policy) (UmRealmCommon *object);
+
+ const gchar * (*get_name) (UmRealmCommon *object);
+
+ const gchar *const * (*get_permitted_logins) (UmRealmCommon *object);
+
+ const gchar *const * (*get_supported_interfaces) (UmRealmCommon *object);
+
+};
+
+GType um_realm_common_get_type (void) G_GNUC_CONST;
+
+GDBusInterfaceInfo *um_realm_common_interface_info (void);
+guint um_realm_common_override_properties (GObjectClass *klass, guint property_id_begin);
+
+
+/* D-Bus method call completion functions: */
+void um_realm_common_complete_deconfigure (
+ UmRealmCommon *object,
+ GDBusMethodInvocation *invocation);
+
+void um_realm_common_complete_change_login_policy (
+ UmRealmCommon *object,
+ GDBusMethodInvocation *invocation);
+
+
+
+/* D-Bus method calls: */
+void um_realm_common_call_deconfigure (
+ UmRealmCommon *proxy,
+ GVariant *arg_options,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+gboolean um_realm_common_call_deconfigure_finish (
+ UmRealmCommon *proxy,
+ GAsyncResult *res,
+ GError **error);
+
+gboolean um_realm_common_call_deconfigure_sync (
+ UmRealmCommon *proxy,
+ GVariant *arg_options,
+ GCancellable *cancellable,
+ GError **error);
+
+void um_realm_common_call_change_login_policy (
+ UmRealmCommon *proxy,
+ const gchar *arg_login_policy,
+ const gchar *const *arg_permitted_add,
+ const gchar *const *arg_permitted_remove,
+ GVariant *arg_options,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+gboolean um_realm_common_call_change_login_policy_finish (
+ UmRealmCommon *proxy,
+ GAsyncResult *res,
+ GError **error);
+
+gboolean um_realm_common_call_change_login_policy_sync (
+ UmRealmCommon *proxy,
+ const gchar *arg_login_policy,
+ const gchar *const *arg_permitted_add,
+ const gchar *const *arg_permitted_remove,
+ GVariant *arg_options,
+ GCancellable *cancellable,
+ GError **error);
+
+
+
+/* D-Bus property accessors: */
+const gchar *um_realm_common_get_name (UmRealmCommon *object);
+gchar *um_realm_common_dup_name (UmRealmCommon *object);
+void um_realm_common_set_name (UmRealmCommon *object, const gchar *value);
+
+const gchar *um_realm_common_get_configured (UmRealmCommon *object);
+gchar *um_realm_common_dup_configured (UmRealmCommon *object);
+void um_realm_common_set_configured (UmRealmCommon *object, const gchar *value);
+
+const gchar *const *um_realm_common_get_supported_interfaces (UmRealmCommon *object);
+gchar **um_realm_common_dup_supported_interfaces (UmRealmCommon *object);
+void um_realm_common_set_supported_interfaces (UmRealmCommon *object, const gchar *const *value);
+
+GVariant *um_realm_common_get_details (UmRealmCommon *object);
+GVariant *um_realm_common_dup_details (UmRealmCommon *object);
+void um_realm_common_set_details (UmRealmCommon *object, GVariant *value);
+
+const gchar *const *um_realm_common_get_login_formats (UmRealmCommon *object);
+gchar **um_realm_common_dup_login_formats (UmRealmCommon *object);
+void um_realm_common_set_login_formats (UmRealmCommon *object, const gchar *const *value);
+
+const gchar *um_realm_common_get_login_policy (UmRealmCommon *object);
+gchar *um_realm_common_dup_login_policy (UmRealmCommon *object);
+void um_realm_common_set_login_policy (UmRealmCommon *object, const gchar *value);
+
+const gchar *const *um_realm_common_get_permitted_logins (UmRealmCommon *object);
+gchar **um_realm_common_dup_permitted_logins (UmRealmCommon *object);
+void um_realm_common_set_permitted_logins (UmRealmCommon *object, const gchar *const *value);
+
+
+/* ---- */
+
+#define UM_REALM_TYPE_COMMON_PROXY (um_realm_common_proxy_get_type ())
+#define UM_REALM_COMMON_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), UM_REALM_TYPE_COMMON_PROXY,
UmRealmCommonProxy))
+#define UM_REALM_COMMON_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), UM_REALM_TYPE_COMMON_PROXY,
UmRealmCommonProxyClass))
+#define UM_REALM_COMMON_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), UM_REALM_TYPE_COMMON_PROXY,
UmRealmCommonProxyClass))
+#define UM_REALM_IS_COMMON_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), UM_REALM_TYPE_COMMON_PROXY))
+#define UM_REALM_IS_COMMON_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), UM_REALM_TYPE_COMMON_PROXY))
+
+typedef struct _UmRealmCommonProxy UmRealmCommonProxy;
+typedef struct _UmRealmCommonProxyClass UmRealmCommonProxyClass;
+typedef struct _UmRealmCommonProxyPrivate UmRealmCommonProxyPrivate;
+
+struct _UmRealmCommonProxy
+{
+ /*< private >*/
+ GDBusProxy parent_instance;
+ UmRealmCommonProxyPrivate *priv;
+};
+
+struct _UmRealmCommonProxyClass
+{
+ GDBusProxyClass parent_class;
+};
+
+GType um_realm_common_proxy_get_type (void) G_GNUC_CONST;
+
+void um_realm_common_proxy_new (
+ GDBusConnection *connection,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+UmRealmCommon *um_realm_common_proxy_new_finish (
+ GAsyncResult *res,
+ GError **error);
+UmRealmCommon *um_realm_common_proxy_new_sync (
+ GDBusConnection *connection,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error);
+
+void um_realm_common_proxy_new_for_bus (
+ GBusType bus_type,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+UmRealmCommon *um_realm_common_proxy_new_for_bus_finish (
+ GAsyncResult *res,
+ GError **error);
+UmRealmCommon *um_realm_common_proxy_new_for_bus_sync (
+ GBusType bus_type,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error);
+
+
+/* ---- */
+
+#define UM_REALM_TYPE_COMMON_SKELETON (um_realm_common_skeleton_get_type ())
+#define UM_REALM_COMMON_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), UM_REALM_TYPE_COMMON_SKELETON,
UmRealmCommonSkeleton))
+#define UM_REALM_COMMON_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), UM_REALM_TYPE_COMMON_SKELETON,
UmRealmCommonSkeletonClass))
+#define UM_REALM_COMMON_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o),
UM_REALM_TYPE_COMMON_SKELETON, UmRealmCommonSkeletonClass))
+#define UM_REALM_IS_COMMON_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), UM_REALM_TYPE_COMMON_SKELETON))
+#define UM_REALM_IS_COMMON_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), UM_REALM_TYPE_COMMON_SKELETON))
+
+typedef struct _UmRealmCommonSkeleton UmRealmCommonSkeleton;
+typedef struct _UmRealmCommonSkeletonClass UmRealmCommonSkeletonClass;
+typedef struct _UmRealmCommonSkeletonPrivate UmRealmCommonSkeletonPrivate;
+
+struct _UmRealmCommonSkeleton
+{
+ /*< private >*/
+ GDBusInterfaceSkeleton parent_instance;
+ UmRealmCommonSkeletonPrivate *priv;
+};
+
+struct _UmRealmCommonSkeletonClass
+{
+ GDBusInterfaceSkeletonClass parent_class;
+};
+
+GType um_realm_common_skeleton_get_type (void) G_GNUC_CONST;
+
+UmRealmCommon *um_realm_common_skeleton_new (void);
+
+
+/* ------------------------------------------------------------------------ */
+/* Declarations for org.freedesktop.realmd.Kerberos */
+
+#define UM_REALM_TYPE_KERBEROS (um_realm_kerberos_get_type ())
+#define UM_REALM_KERBEROS(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), UM_REALM_TYPE_KERBEROS, UmRealmKerberos))
+#define UM_REALM_IS_KERBEROS(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), UM_REALM_TYPE_KERBEROS))
+#define UM_REALM_KERBEROS_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), UM_REALM_TYPE_KERBEROS,
UmRealmKerberosIface))
+
+struct _UmRealmKerberos;
+typedef struct _UmRealmKerberos UmRealmKerberos;
+typedef struct _UmRealmKerberosIface UmRealmKerberosIface;
+
+struct _UmRealmKerberosIface
+{
+ GTypeInterface parent_iface;
+
+ const gchar * (*get_domain_name) (UmRealmKerberos *object);
+
+ const gchar * (*get_realm_name) (UmRealmKerberos *object);
+
+};
+
+GType um_realm_kerberos_get_type (void) G_GNUC_CONST;
+
+GDBusInterfaceInfo *um_realm_kerberos_interface_info (void);
+guint um_realm_kerberos_override_properties (GObjectClass *klass, guint property_id_begin);
+
+
+/* D-Bus property accessors: */
+const gchar *um_realm_kerberos_get_realm_name (UmRealmKerberos *object);
+gchar *um_realm_kerberos_dup_realm_name (UmRealmKerberos *object);
+void um_realm_kerberos_set_realm_name (UmRealmKerberos *object, const gchar *value);
+
+const gchar *um_realm_kerberos_get_domain_name (UmRealmKerberos *object);
+gchar *um_realm_kerberos_dup_domain_name (UmRealmKerberos *object);
+void um_realm_kerberos_set_domain_name (UmRealmKerberos *object, const gchar *value);
+
+
+/* ---- */
+
+#define UM_REALM_TYPE_KERBEROS_PROXY (um_realm_kerberos_proxy_get_type ())
+#define UM_REALM_KERBEROS_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), UM_REALM_TYPE_KERBEROS_PROXY,
UmRealmKerberosProxy))
+#define UM_REALM_KERBEROS_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), UM_REALM_TYPE_KERBEROS_PROXY,
UmRealmKerberosProxyClass))
+#define UM_REALM_KERBEROS_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), UM_REALM_TYPE_KERBEROS_PROXY,
UmRealmKerberosProxyClass))
+#define UM_REALM_IS_KERBEROS_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), UM_REALM_TYPE_KERBEROS_PROXY))
+#define UM_REALM_IS_KERBEROS_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), UM_REALM_TYPE_KERBEROS_PROXY))
+
+typedef struct _UmRealmKerberosProxy UmRealmKerberosProxy;
+typedef struct _UmRealmKerberosProxyClass UmRealmKerberosProxyClass;
+typedef struct _UmRealmKerberosProxyPrivate UmRealmKerberosProxyPrivate;
+
+struct _UmRealmKerberosProxy
+{
+ /*< private >*/
+ GDBusProxy parent_instance;
+ UmRealmKerberosProxyPrivate *priv;
+};
+
+struct _UmRealmKerberosProxyClass
+{
+ GDBusProxyClass parent_class;
+};
+
+GType um_realm_kerberos_proxy_get_type (void) G_GNUC_CONST;
+
+void um_realm_kerberos_proxy_new (
+ GDBusConnection *connection,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+UmRealmKerberos *um_realm_kerberos_proxy_new_finish (
+ GAsyncResult *res,
+ GError **error);
+UmRealmKerberos *um_realm_kerberos_proxy_new_sync (
+ GDBusConnection *connection,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error);
+
+void um_realm_kerberos_proxy_new_for_bus (
+ GBusType bus_type,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+UmRealmKerberos *um_realm_kerberos_proxy_new_for_bus_finish (
+ GAsyncResult *res,
+ GError **error);
+UmRealmKerberos *um_realm_kerberos_proxy_new_for_bus_sync (
+ GBusType bus_type,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error);
+
+
+/* ---- */
+
+#define UM_REALM_TYPE_KERBEROS_SKELETON (um_realm_kerberos_skeleton_get_type ())
+#define UM_REALM_KERBEROS_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), UM_REALM_TYPE_KERBEROS_SKELETON,
UmRealmKerberosSkeleton))
+#define UM_REALM_KERBEROS_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), UM_REALM_TYPE_KERBEROS_SKELETON,
UmRealmKerberosSkeletonClass))
+#define UM_REALM_KERBEROS_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o),
UM_REALM_TYPE_KERBEROS_SKELETON, UmRealmKerberosSkeletonClass))
+#define UM_REALM_IS_KERBEROS_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), UM_REALM_TYPE_KERBEROS_SKELETON))
+#define UM_REALM_IS_KERBEROS_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k),
UM_REALM_TYPE_KERBEROS_SKELETON))
+
+typedef struct _UmRealmKerberosSkeleton UmRealmKerberosSkeleton;
+typedef struct _UmRealmKerberosSkeletonClass UmRealmKerberosSkeletonClass;
+typedef struct _UmRealmKerberosSkeletonPrivate UmRealmKerberosSkeletonPrivate;
+
+struct _UmRealmKerberosSkeleton
+{
+ /*< private >*/
+ GDBusInterfaceSkeleton parent_instance;
+ UmRealmKerberosSkeletonPrivate *priv;
+};
+
+struct _UmRealmKerberosSkeletonClass
+{
+ GDBusInterfaceSkeletonClass parent_class;
+};
+
+GType um_realm_kerberos_skeleton_get_type (void) G_GNUC_CONST;
+
+UmRealmKerberos *um_realm_kerberos_skeleton_new (void);
+
+
+/* ------------------------------------------------------------------------ */
+/* Declarations for org.freedesktop.realmd.KerberosMembership */
+
+#define UM_REALM_TYPE_KERBEROS_MEMBERSHIP (um_realm_kerberos_membership_get_type ())
+#define UM_REALM_KERBEROS_MEMBERSHIP(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), UM_REALM_TYPE_KERBEROS_MEMBERSHIP,
UmRealmKerberosMembership))
+#define UM_REALM_IS_KERBEROS_MEMBERSHIP(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o),
UM_REALM_TYPE_KERBEROS_MEMBERSHIP))
+#define UM_REALM_KERBEROS_MEMBERSHIP_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o),
UM_REALM_TYPE_KERBEROS_MEMBERSHIP, UmRealmKerberosMembershipIface))
+
+struct _UmRealmKerberosMembership;
+typedef struct _UmRealmKerberosMembership UmRealmKerberosMembership;
+typedef struct _UmRealmKerberosMembershipIface UmRealmKerberosMembershipIface;
+
+struct _UmRealmKerberosMembershipIface
+{
+ GTypeInterface parent_iface;
+
+
+ gboolean (*handle_join) (
+ UmRealmKerberosMembership *object,
+ GDBusMethodInvocation *invocation,
+ GVariant *arg_credentials,
+ GVariant *arg_options);
+
+ gboolean (*handle_leave) (
+ UmRealmKerberosMembership *object,
+ GDBusMethodInvocation *invocation,
+ GVariant *arg_credentials,
+ GVariant *arg_options);
+
+ const gchar * (*get_suggested_administrator) (UmRealmKerberosMembership *object);
+
+ GVariant * (*get_supported_join_credentials) (UmRealmKerberosMembership *object);
+
+ GVariant * (*get_supported_leave_credentials) (UmRealmKerberosMembership *object);
+
+};
+
+GType um_realm_kerberos_membership_get_type (void) G_GNUC_CONST;
+
+GDBusInterfaceInfo *um_realm_kerberos_membership_interface_info (void);
+guint um_realm_kerberos_membership_override_properties (GObjectClass *klass, guint property_id_begin);
+
+
+/* D-Bus method call completion functions: */
+void um_realm_kerberos_membership_complete_join (
+ UmRealmKerberosMembership *object,
+ GDBusMethodInvocation *invocation);
+
+void um_realm_kerberos_membership_complete_leave (
+ UmRealmKerberosMembership *object,
+ GDBusMethodInvocation *invocation);
+
+
+
+/* D-Bus method calls: */
+void um_realm_kerberos_membership_call_join (
+ UmRealmKerberosMembership *proxy,
+ GVariant *arg_credentials,
+ GVariant *arg_options,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+gboolean um_realm_kerberos_membership_call_join_finish (
+ UmRealmKerberosMembership *proxy,
+ GAsyncResult *res,
+ GError **error);
+
+gboolean um_realm_kerberos_membership_call_join_sync (
+ UmRealmKerberosMembership *proxy,
+ GVariant *arg_credentials,
+ GVariant *arg_options,
+ GCancellable *cancellable,
+ GError **error);
+
+void um_realm_kerberos_membership_call_leave (
+ UmRealmKerberosMembership *proxy,
+ GVariant *arg_credentials,
+ GVariant *arg_options,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+gboolean um_realm_kerberos_membership_call_leave_finish (
+ UmRealmKerberosMembership *proxy,
+ GAsyncResult *res,
+ GError **error);
+
+gboolean um_realm_kerberos_membership_call_leave_sync (
+ UmRealmKerberosMembership *proxy,
+ GVariant *arg_credentials,
+ GVariant *arg_options,
+ GCancellable *cancellable,
+ GError **error);
+
+
+
+/* D-Bus property accessors: */
+const gchar *um_realm_kerberos_membership_get_suggested_administrator (UmRealmKerberosMembership *object);
+gchar *um_realm_kerberos_membership_dup_suggested_administrator (UmRealmKerberosMembership *object);
+void um_realm_kerberos_membership_set_suggested_administrator (UmRealmKerberosMembership *object, const
gchar *value);
+
+GVariant *um_realm_kerberos_membership_get_supported_join_credentials (UmRealmKerberosMembership *object);
+GVariant *um_realm_kerberos_membership_dup_supported_join_credentials (UmRealmKerberosMembership *object);
+void um_realm_kerberos_membership_set_supported_join_credentials (UmRealmKerberosMembership *object,
GVariant *value);
+
+GVariant *um_realm_kerberos_membership_get_supported_leave_credentials (UmRealmKerberosMembership *object);
+GVariant *um_realm_kerberos_membership_dup_supported_leave_credentials (UmRealmKerberosMembership *object);
+void um_realm_kerberos_membership_set_supported_leave_credentials (UmRealmKerberosMembership *object,
GVariant *value);
+
+
+/* ---- */
+
+#define UM_REALM_TYPE_KERBEROS_MEMBERSHIP_PROXY (um_realm_kerberos_membership_proxy_get_type ())
+#define UM_REALM_KERBEROS_MEMBERSHIP_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o),
UM_REALM_TYPE_KERBEROS_MEMBERSHIP_PROXY, UmRealmKerberosMembershipProxy))
+#define UM_REALM_KERBEROS_MEMBERSHIP_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k),
UM_REALM_TYPE_KERBEROS_MEMBERSHIP_PROXY, UmRealmKerberosMembershipProxyClass))
+#define UM_REALM_KERBEROS_MEMBERSHIP_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o),
UM_REALM_TYPE_KERBEROS_MEMBERSHIP_PROXY, UmRealmKerberosMembershipProxyClass))
+#define UM_REALM_IS_KERBEROS_MEMBERSHIP_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o),
UM_REALM_TYPE_KERBEROS_MEMBERSHIP_PROXY))
+#define UM_REALM_IS_KERBEROS_MEMBERSHIP_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k),
UM_REALM_TYPE_KERBEROS_MEMBERSHIP_PROXY))
+
+typedef struct _UmRealmKerberosMembershipProxy UmRealmKerberosMembershipProxy;
+typedef struct _UmRealmKerberosMembershipProxyClass UmRealmKerberosMembershipProxyClass;
+typedef struct _UmRealmKerberosMembershipProxyPrivate UmRealmKerberosMembershipProxyPrivate;
+
+struct _UmRealmKerberosMembershipProxy
+{
+ /*< private >*/
+ GDBusProxy parent_instance;
+ UmRealmKerberosMembershipProxyPrivate *priv;
+};
+
+struct _UmRealmKerberosMembershipProxyClass
+{
+ GDBusProxyClass parent_class;
+};
+
+GType um_realm_kerberos_membership_proxy_get_type (void) G_GNUC_CONST;
+
+void um_realm_kerberos_membership_proxy_new (
+ GDBusConnection *connection,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+UmRealmKerberosMembership *um_realm_kerberos_membership_proxy_new_finish (
+ GAsyncResult *res,
+ GError **error);
+UmRealmKerberosMembership *um_realm_kerberos_membership_proxy_new_sync (
+ GDBusConnection *connection,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error);
+
+void um_realm_kerberos_membership_proxy_new_for_bus (
+ GBusType bus_type,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+UmRealmKerberosMembership *um_realm_kerberos_membership_proxy_new_for_bus_finish (
+ GAsyncResult *res,
+ GError **error);
+UmRealmKerberosMembership *um_realm_kerberos_membership_proxy_new_for_bus_sync (
+ GBusType bus_type,
+ GDBusProxyFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error);
+
+
+/* ---- */
+
+#define UM_REALM_TYPE_KERBEROS_MEMBERSHIP_SKELETON (um_realm_kerberos_membership_skeleton_get_type ())
+#define UM_REALM_KERBEROS_MEMBERSHIP_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o),
UM_REALM_TYPE_KERBEROS_MEMBERSHIP_SKELETON, UmRealmKerberosMembershipSkeleton))
+#define UM_REALM_KERBEROS_MEMBERSHIP_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k),
UM_REALM_TYPE_KERBEROS_MEMBERSHIP_SKELETON, UmRealmKerberosMembershipSkeletonClass))
+#define UM_REALM_KERBEROS_MEMBERSHIP_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o),
UM_REALM_TYPE_KERBEROS_MEMBERSHIP_SKELETON, UmRealmKerberosMembershipSkeletonClass))
+#define UM_REALM_IS_KERBEROS_MEMBERSHIP_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o),
UM_REALM_TYPE_KERBEROS_MEMBERSHIP_SKELETON))
+#define UM_REALM_IS_KERBEROS_MEMBERSHIP_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k),
UM_REALM_TYPE_KERBEROS_MEMBERSHIP_SKELETON))
+
+typedef struct _UmRealmKerberosMembershipSkeleton UmRealmKerberosMembershipSkeleton;
+typedef struct _UmRealmKerberosMembershipSkeletonClass UmRealmKerberosMembershipSkeletonClass;
+typedef struct _UmRealmKerberosMembershipSkeletonPrivate UmRealmKerberosMembershipSkeletonPrivate;
+
+struct _UmRealmKerberosMembershipSkeleton
+{
+ /*< private >*/
+ GDBusInterfaceSkeleton parent_instance;
+ UmRealmKerberosMembershipSkeletonPrivate *priv;
+};
+
+struct _UmRealmKerberosMembershipSkeletonClass
+{
+ GDBusInterfaceSkeletonClass parent_class;
+};
+
+GType um_realm_kerberos_membership_skeleton_get_type (void) G_GNUC_CONST;
+
+UmRealmKerberosMembership *um_realm_kerberos_membership_skeleton_new (void);
+
+
+/* ---- */
+
+#define UM_REALM_TYPE_OBJECT (um_realm_object_get_type ())
+#define UM_REALM_OBJECT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), UM_REALM_TYPE_OBJECT, UmRealmObject))
+#define UM_REALM_IS_OBJECT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), UM_REALM_TYPE_OBJECT))
+#define UM_REALM_OBJECT_GET_IFACE(o) (G_TYPE_INSTANCE_GET_INTERFACE ((o), UM_REALM_TYPE_OBJECT,
UmRealmObject))
+
+struct _UmRealmObject;
+typedef struct _UmRealmObject UmRealmObject;
+typedef struct _UmRealmObjectIface UmRealmObjectIface;
+
+struct _UmRealmObjectIface
+{
+ GTypeInterface parent_iface;
+};
+
+GType um_realm_object_get_type (void) G_GNUC_CONST;
+
+UmRealmProvider *um_realm_object_get_provider (UmRealmObject *object);
+UmRealmService *um_realm_object_get_service (UmRealmObject *object);
+UmRealmCommon *um_realm_object_get_common (UmRealmObject *object);
+UmRealmKerberos *um_realm_object_get_kerberos (UmRealmObject *object);
+UmRealmKerberosMembership *um_realm_object_get_kerberos_membership (UmRealmObject *object);
+UmRealmProvider *um_realm_object_peek_provider (UmRealmObject *object);
+UmRealmService *um_realm_object_peek_service (UmRealmObject *object);
+UmRealmCommon *um_realm_object_peek_common (UmRealmObject *object);
+UmRealmKerberos *um_realm_object_peek_kerberos (UmRealmObject *object);
+UmRealmKerberosMembership *um_realm_object_peek_kerberos_membership (UmRealmObject *object);
+
+#define UM_REALM_TYPE_OBJECT_PROXY (um_realm_object_proxy_get_type ())
+#define UM_REALM_OBJECT_PROXY(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), UM_REALM_TYPE_OBJECT_PROXY,
UmRealmObjectProxy))
+#define UM_REALM_OBJECT_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), UM_REALM_TYPE_OBJECT_PROXY,
UmRealmObjectProxyClass))
+#define UM_REALM_OBJECT_PROXY_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), UM_REALM_TYPE_OBJECT_PROXY,
UmRealmObjectProxyClass))
+#define UM_REALM_IS_OBJECT_PROXY(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), UM_REALM_TYPE_OBJECT_PROXY))
+#define UM_REALM_IS_OBJECT_PROXY_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), UM_REALM_TYPE_OBJECT_PROXY))
+
+typedef struct _UmRealmObjectProxy UmRealmObjectProxy;
+typedef struct _UmRealmObjectProxyClass UmRealmObjectProxyClass;
+typedef struct _UmRealmObjectProxyPrivate UmRealmObjectProxyPrivate;
+
+struct _UmRealmObjectProxy
+{
+ /*< private >*/
+ GDBusObjectProxy parent_instance;
+ UmRealmObjectProxyPrivate *priv;
+};
+
+struct _UmRealmObjectProxyClass
+{
+ GDBusObjectProxyClass parent_class;
+};
+
+GType um_realm_object_proxy_get_type (void) G_GNUC_CONST;
+UmRealmObjectProxy *um_realm_object_proxy_new (GDBusConnection *connection, const gchar *object_path);
+
+#define UM_REALM_TYPE_OBJECT_SKELETON (um_realm_object_skeleton_get_type ())
+#define UM_REALM_OBJECT_SKELETON(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), UM_REALM_TYPE_OBJECT_SKELETON,
UmRealmObjectSkeleton))
+#define UM_REALM_OBJECT_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), UM_REALM_TYPE_OBJECT_SKELETON,
UmRealmObjectSkeletonClass))
+#define UM_REALM_OBJECT_SKELETON_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o),
UM_REALM_TYPE_OBJECT_SKELETON, UmRealmObjectSkeletonClass))
+#define UM_REALM_IS_OBJECT_SKELETON(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), UM_REALM_TYPE_OBJECT_SKELETON))
+#define UM_REALM_IS_OBJECT_SKELETON_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), UM_REALM_TYPE_OBJECT_SKELETON))
+
+typedef struct _UmRealmObjectSkeleton UmRealmObjectSkeleton;
+typedef struct _UmRealmObjectSkeletonClass UmRealmObjectSkeletonClass;
+typedef struct _UmRealmObjectSkeletonPrivate UmRealmObjectSkeletonPrivate;
+
+struct _UmRealmObjectSkeleton
+{
+ /*< private >*/
+ GDBusObjectSkeleton parent_instance;
+ UmRealmObjectSkeletonPrivate *priv;
+};
+
+struct _UmRealmObjectSkeletonClass
+{
+ GDBusObjectSkeletonClass parent_class;
+};
+
+GType um_realm_object_skeleton_get_type (void) G_GNUC_CONST;
+UmRealmObjectSkeleton *um_realm_object_skeleton_new (const gchar *object_path);
+void um_realm_object_skeleton_set_provider (UmRealmObjectSkeleton *object, UmRealmProvider *interface_);
+void um_realm_object_skeleton_set_service (UmRealmObjectSkeleton *object, UmRealmService *interface_);
+void um_realm_object_skeleton_set_common (UmRealmObjectSkeleton *object, UmRealmCommon *interface_);
+void um_realm_object_skeleton_set_kerberos (UmRealmObjectSkeleton *object, UmRealmKerberos *interface_);
+void um_realm_object_skeleton_set_kerberos_membership (UmRealmObjectSkeleton *object,
UmRealmKerberosMembership *interface_);
+
+/* ---- */
+
+#define UM_REALM_TYPE_OBJECT_MANAGER_CLIENT (um_realm_object_manager_client_get_type ())
+#define UM_REALM_OBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_CAST ((o),
UM_REALM_TYPE_OBJECT_MANAGER_CLIENT, UmRealmObjectManagerClient))
+#define UM_REALM_OBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k),
UM_REALM_TYPE_OBJECT_MANAGER_CLIENT, UmRealmObjectManagerClientClass))
+#define UM_REALM_OBJECT_MANAGER_CLIENT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o),
UM_REALM_TYPE_OBJECT_MANAGER_CLIENT, UmRealmObjectManagerClientClass))
+#define UM_REALM_IS_OBJECT_MANAGER_CLIENT(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o),
UM_REALM_TYPE_OBJECT_MANAGER_CLIENT))
+#define UM_REALM_IS_OBJECT_MANAGER_CLIENT_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k),
UM_REALM_TYPE_OBJECT_MANAGER_CLIENT))
+
+typedef struct _UmRealmObjectManagerClient UmRealmObjectManagerClient;
+typedef struct _UmRealmObjectManagerClientClass UmRealmObjectManagerClientClass;
+typedef struct _UmRealmObjectManagerClientPrivate UmRealmObjectManagerClientPrivate;
+
+struct _UmRealmObjectManagerClient
+{
+ /*< private >*/
+ GDBusObjectManagerClient parent_instance;
+ UmRealmObjectManagerClientPrivate *priv;
+};
+
+struct _UmRealmObjectManagerClientClass
+{
+ GDBusObjectManagerClientClass parent_class;
+};
+
+GType um_realm_object_manager_client_get_type (void) G_GNUC_CONST;
+
+GType um_realm_object_manager_client_get_proxy_type (GDBusObjectManagerClient *manager, const gchar
*object_path, const gchar *interface_name, gpointer user_data);
+
+void um_realm_object_manager_client_new (
+ GDBusConnection *connection,
+ GDBusObjectManagerClientFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+GDBusObjectManager *um_realm_object_manager_client_new_finish (
+ GAsyncResult *res,
+ GError **error);
+GDBusObjectManager *um_realm_object_manager_client_new_sync (
+ GDBusConnection *connection,
+ GDBusObjectManagerClientFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error);
+
+void um_realm_object_manager_client_new_for_bus (
+ GBusType bus_type,
+ GDBusObjectManagerClientFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+GDBusObjectManager *um_realm_object_manager_client_new_for_bus_finish (
+ GAsyncResult *res,
+ GError **error);
+GDBusObjectManager *um_realm_object_manager_client_new_for_bus_sync (
+ GBusType bus_type,
+ GDBusObjectManagerClientFlags flags,
+ const gchar *name,
+ const gchar *object_path,
+ GCancellable *cancellable,
+ GError **error);
+
+
+G_END_DECLS
+
+#endif /* __UM_REALM_GENERATED_H__ */
diff --git a/gnome-initial-setup/pages/password/um-realm-manager.c
b/gnome-initial-setup/pages/password/um-realm-manager.c
new file mode 100644
index 0000000..597c3b8
--- /dev/null
+++ b/gnome-initial-setup/pages/password/um-realm-manager.c
@@ -0,0 +1,918 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright 2009-2012 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Written by: Matthias Clasen <mclasen redhat com>
+ * Stef Walter <stefw gnome org>
+ */
+
+#include "config.h"
+
+#include "um-realm-manager.h"
+
+#include <krb5/krb5.h>
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <glib/gstdio.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <fcntl.h>
+
+
+struct _UmRealmManager {
+ UmRealmObjectManagerClient parent;
+ UmRealmProvider *provider;
+ guint diagnostics_sig;
+};
+
+typedef struct {
+ UmRealmProviderProxyClass parent_class;
+} UmRealmManagerClass;
+
+enum {
+ REALM_ADDED,
+ NUM_SIGNALS,
+};
+
+static gint signals[NUM_SIGNALS] = { 0, };
+
+G_DEFINE_TYPE (UmRealmManager, um_realm_manager, UM_REALM_TYPE_OBJECT_MANAGER_CLIENT);
+
+GQuark
+um_realm_error_get_quark (void)
+{
+ static GQuark quark = 0;
+ if (quark == 0)
+ quark = g_quark_from_static_string ("um-realm-error");
+ return quark;
+}
+
+static gboolean
+is_realm_with_kerberos_and_membership (gpointer object)
+{
+ GDBusInterface *interface;
+
+ if (!G_IS_DBUS_OBJECT (object))
+ return FALSE;
+
+ interface = g_dbus_object_get_interface (object, "org.freedesktop.realmd.Kerberos");
+ if (interface == NULL)
+ return FALSE;
+ g_object_unref (interface);
+
+ interface = g_dbus_object_get_interface (object, "org.freedesktop.realmd.KerberosMembership");
+ if (interface == NULL)
+ return FALSE;
+ g_object_unref (interface);
+
+ return TRUE;
+}
+
+static void
+on_interface_added (GDBusObjectManager *manager,
+ GDBusObject *object,
+ GDBusInterface *interface)
+{
+ g_dbus_proxy_set_default_timeout (G_DBUS_PROXY (interface), G_MAXINT);
+}
+
+static void
+on_object_added (GDBusObjectManager *manager,
+ GDBusObject *object,
+ gpointer user_data)
+{
+ GList *interfaces, *l;
+
+ interfaces = g_dbus_object_get_interfaces (object);
+ for (l = interfaces; l != NULL; l = g_list_next (l))
+ on_interface_added (manager, object, l->data);
+ g_list_free_full (interfaces, g_object_unref);
+
+ if (is_realm_with_kerberos_and_membership (object)) {
+ g_debug ("Saw realm: %s", g_dbus_object_get_object_path (object));
+ g_signal_emit (user_data, signals[REALM_ADDED], 0, object);
+ }
+}
+
+static void
+um_realm_manager_init (UmRealmManager *self)
+{
+ g_signal_connect (self, "object-added", G_CALLBACK (on_object_added), self);
+ g_signal_connect (self, "interface-added", G_CALLBACK (on_interface_added), self);
+}
+
+static void
+um_realm_manager_dispose (GObject *obj)
+{
+ UmRealmManager *self = UM_REALM_MANAGER (obj);
+ GDBusConnection *connection;
+
+ g_clear_object (&self->provider);
+
+ if (self->diagnostics_sig) {
+ connection = g_dbus_object_manager_client_get_connection (G_DBUS_OBJECT_MANAGER_CLIENT
(self));
+ if (connection != NULL)
+ g_dbus_connection_signal_unsubscribe (connection, self->diagnostics_sig);
+ self->diagnostics_sig = 0;
+ }
+
+ G_OBJECT_CLASS (um_realm_manager_parent_class)->dispose (obj);
+}
+
+static void
+um_realm_manager_class_init (UmRealmManagerClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->dispose = um_realm_manager_dispose;
+
+ signals[REALM_ADDED] = g_signal_new ("realm-added", UM_TYPE_REALM_MANAGER,
+ G_SIGNAL_RUN_FIRST, 0, NULL, NULL,
+ g_cclosure_marshal_generic,
+ G_TYPE_NONE, 1, UM_REALM_TYPE_OBJECT);
+}
+
+static void
+on_realm_diagnostics (GDBusConnection *connection,
+ const gchar *sender_name,
+ const gchar *object_path,
+ const gchar *interface_name,
+ const gchar *signal_name,
+ GVariant *parameters,
+ gpointer user_data)
+{
+ const gchar *message;
+ const gchar *unused;
+
+ if (g_variant_is_of_type (parameters, G_VARIANT_TYPE ("(ss)"))) {
+ /* Data is already formatted appropriately for stderr */
+ g_variant_get (parameters, "(&s&s)", &message, &unused);
+ g_printerr ("%s", message);
+ }
+}
+
+typedef struct {
+ GCancellable *cancellable;
+ UmRealmManager *manager;
+} NewClosure;
+
+static void
+new_closure_free (gpointer data)
+{
+ NewClosure *closure = data;
+ g_clear_object (&closure->cancellable);
+ g_clear_object (&closure->manager);
+ g_slice_free (NewClosure, closure);
+}
+
+static void
+on_provider_new (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GSimpleAsyncResult *async = G_SIMPLE_ASYNC_RESULT (user_data);
+ NewClosure *closure = g_simple_async_result_get_op_res_gpointer (async);
+ GError *error = NULL;
+ UmRealmProvider *provider;
+
+ provider = um_realm_provider_proxy_new_finish (result, &error);
+ closure->manager->provider = provider;
+
+ if (error == NULL) {
+ g_dbus_proxy_set_default_timeout (G_DBUS_PROXY (closure->manager->provider), -1);
+ g_debug ("Created realm manager");
+ } else {
+ g_simple_async_result_take_error (async, error);
+ }
+ g_simple_async_result_complete (async);
+
+ g_object_unref (async);
+}
+
+static void
+on_manager_new (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GSimpleAsyncResult *async = G_SIMPLE_ASYNC_RESULT (user_data);
+ NewClosure *closure = g_simple_async_result_get_op_res_gpointer (async);
+ GDBusConnection *connection;
+ GError *error = NULL;
+ GObject *object;
+ guint sig;
+
+ object = g_async_initable_new_finish (G_ASYNC_INITABLE (source), result, &error);
+ if (error == NULL) {
+ closure->manager = UM_REALM_MANAGER (object);
+ connection = g_dbus_object_manager_client_get_connection (G_DBUS_OBJECT_MANAGER_CLIENT
(object));
+
+ g_debug ("Connected to realmd");
+
+ sig = g_dbus_connection_signal_subscribe (connection,
+ "org.freedesktop.realmd",
+ "org.freedesktop.realmd.Service",
+ "Diagnostics",
+ NULL,
+ NULL,
+ G_DBUS_SIGNAL_FLAGS_NONE,
+ on_realm_diagnostics,
+ NULL,
+ NULL);
+ closure->manager->diagnostics_sig = sig;
+
+ um_realm_provider_proxy_new (connection,
+ G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
+ "org.freedesktop.realmd",
+ "/org/freedesktop/realmd",
+ closure->cancellable,
+ on_provider_new, g_object_ref (async));
+ } else {
+ g_simple_async_result_take_error (async, error);
+ g_simple_async_result_complete (async);
+ }
+
+ g_object_unref (async);
+}
+
+void
+um_realm_manager_new (GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GSimpleAsyncResult *async;
+ NewClosure *closure;
+
+ g_debug ("Connecting to realmd...");
+
+ async = g_simple_async_result_new (NULL, callback, user_data,
+ um_realm_manager_new);
+ closure = g_slice_new (NewClosure);
+ closure->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
+ g_simple_async_result_set_op_res_gpointer (async, closure, new_closure_free);
+
+ g_async_initable_new_async (UM_TYPE_REALM_MANAGER, G_PRIORITY_DEFAULT,
+ cancellable, on_manager_new, g_object_ref (async),
+ "flags", G_DBUS_OBJECT_MANAGER_CLIENT_FLAGS_NONE,
+ "name", "org.freedesktop.realmd",
+ "bus-type", G_BUS_TYPE_SYSTEM,
+ "object-path", "/org/freedesktop/realmd",
+ "get-proxy-type-func", um_realm_object_manager_client_get_proxy_type,
+ NULL);
+
+ g_object_unref (async);
+}
+
+UmRealmManager *
+um_realm_manager_new_finish (GAsyncResult *result,
+ GError **error)
+{
+ GSimpleAsyncResult *async;
+ NewClosure *closure;
+
+ g_return_val_if_fail (g_simple_async_result_is_valid (result, NULL,
+ um_realm_manager_new), NULL);
+
+ async = G_SIMPLE_ASYNC_RESULT (result);
+ if (g_simple_async_result_propagate_error (async, error))
+ return NULL;
+
+ closure = g_simple_async_result_get_op_res_gpointer (async);
+ return g_object_ref (closure->manager);
+}
+
+typedef struct {
+ GDBusObjectManager *manager;
+ GCancellable *cancellable;
+ GList *realms;
+} DiscoverClosure;
+
+static void
+discover_closure_free (gpointer data)
+{
+ DiscoverClosure *discover = data;
+ g_object_unref (discover->manager);
+ g_clear_object (&discover->cancellable);
+ g_list_free_full (discover->realms, g_object_unref);
+ g_slice_free (DiscoverClosure, discover);
+}
+
+static void
+on_provider_discover (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GSimpleAsyncResult *async = G_SIMPLE_ASYNC_RESULT (user_data);
+ DiscoverClosure *discover = g_simple_async_result_get_op_res_gpointer (async);
+ GDBusObject *object;
+ GError *error = NULL;
+ gboolean no_membership = FALSE;
+ gchar **realms;
+ gint relevance;
+ gint i;
+
+ um_realm_provider_call_discover_finish (UM_REALM_PROVIDER (source), &relevance,
+ &realms, result, &error);
+ if (error == NULL) {
+ for (i = 0; realms[i]; i++) {
+ object = g_dbus_object_manager_get_object (discover->manager, realms[i]);
+ if (object == NULL) {
+ g_warning ("Realm is not in object manager: %s", realms[i]);
+ } else {
+ if (is_realm_with_kerberos_and_membership (object)) {
+ g_debug ("Discovered realm: %s", realms[i]);
+ discover->realms = g_list_prepend (discover->realms, object);
+ } else {
+ g_debug ("Realm does not support kerberos membership: %s",
realms[i]);
+ no_membership = TRUE;
+ g_object_unref (object);
+ }
+ }
+ }
+ g_strfreev (realms);
+
+ if (!discover->realms && no_membership) {
+ g_simple_async_result_set_error (async, UM_REALM_ERROR, UM_REALM_ERROR_GENERIC,
+ _("Cannot automatically join this type of domain"));
+ }
+ } else {
+ g_simple_async_result_take_error (async, error);
+ }
+
+ g_simple_async_result_complete (async);
+ g_object_unref (async);
+}
+
+void
+um_realm_manager_discover (UmRealmManager *self,
+ const gchar *input,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GSimpleAsyncResult *res;
+ DiscoverClosure *discover;
+ GVariant *options;
+
+ g_return_if_fail (UM_IS_REALM_MANAGER (self));
+ g_return_if_fail (input != NULL);
+ g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+
+ g_debug ("Discovering realms for: %s", input);
+
+ res = g_simple_async_result_new (G_OBJECT (self), callback, user_data,
+ um_realm_manager_discover);
+ discover = g_slice_new0 (DiscoverClosure);
+ discover->manager = g_object_ref (self);
+ discover->cancellable = cancellable ? g_object_ref (cancellable) : NULL;
+ g_simple_async_result_set_op_res_gpointer (res, discover, discover_closure_free);
+
+ options = g_variant_new_array (G_VARIANT_TYPE ("{sv}"), NULL, 0);
+
+ um_realm_provider_call_discover (self->provider, input, options, cancellable,
+ on_provider_discover, g_object_ref (res));
+
+ g_object_unref (res);
+}
+
+GList *
+um_realm_manager_discover_finish (UmRealmManager *self,
+ GAsyncResult *result,
+ GError **error)
+{
+ GSimpleAsyncResult *async;
+ DiscoverClosure *discover;
+ GList *realms;
+
+ g_return_val_if_fail (UM_IS_REALM_MANAGER (self), NULL);
+ g_return_val_if_fail (g_simple_async_result_is_valid (result, G_OBJECT (self),
+ um_realm_manager_discover), NULL);
+ g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+
+ async = G_SIMPLE_ASYNC_RESULT (result);
+ if (g_simple_async_result_propagate_error (async, error))
+ return NULL;
+
+ discover = g_simple_async_result_get_op_res_gpointer (async);
+ if (!discover->realms) {
+ g_set_error (error, UM_REALM_ERROR, UM_REALM_ERROR_GENERIC,
+ _("No such domain or realm found"));
+ return NULL;
+ }
+
+ realms = g_list_reverse (discover->realms);
+ discover->realms = NULL;
+ return realms;
+}
+
+GList *
+um_realm_manager_get_realms (UmRealmManager *self)
+{
+ GList *objects;
+ GList *realms = NULL;
+ GList *l;
+
+ g_return_val_if_fail (UM_IS_REALM_MANAGER (self), NULL);
+
+ objects = g_dbus_object_manager_get_objects (G_DBUS_OBJECT_MANAGER (self));
+ for (l = objects; l != NULL; l = g_list_next (l)) {
+ if (is_realm_with_kerberos_and_membership (l->data))
+ realms = g_list_prepend (realms, g_object_ref (l->data));
+ }
+
+ g_list_free_full (objects, g_object_unref);
+ return realms;
+}
+
+static void
+string_replace (GString *string,
+ const gchar *find,
+ const gchar *replace)
+{
+ const gchar *at;
+ gssize pos;
+
+ at = strstr (string->str, find);
+ if (at != NULL) {
+ pos = at - string->str;
+ g_string_erase (string, pos, strlen (find));
+ g_string_insert (string, pos, replace);
+ }
+}
+
+gchar *
+um_realm_calculate_login (UmRealmCommon *realm,
+ const gchar *username)
+{
+ GString *string;
+ const gchar *const *formats;
+ gchar *login = NULL;
+
+ formats = um_realm_common_get_login_formats (realm);
+ if (formats[0] != NULL) {
+ string = g_string_new (formats[0]);
+ string_replace (string, "%U", username);
+ string_replace (string, "%D", um_realm_common_get_name (realm));
+ login = g_string_free (string, FALSE);
+ }
+
+ return login;
+
+}
+
+gboolean
+um_realm_is_configured (UmRealmObject *realm)
+{
+ UmRealmCommon *common;
+ const gchar *configured;
+ gboolean is;
+
+ common = um_realm_object_get_common (realm);
+ configured = um_realm_common_get_configured (common);
+ is = configured != NULL && !g_str_equal (configured, "");
+ g_object_unref (common);
+
+ return is;
+}
+
+static const gchar *
+find_supported_credentials (UmRealmKerberosMembership *membership,
+ const gchar *owner)
+{
+ const gchar *cred_owner;
+ const gchar *cred_type;
+ GVariant *supported;
+ GVariantIter iter;
+
+ supported = um_realm_kerberos_membership_get_supported_join_credentials (membership);
+ g_return_val_if_fail (supported != NULL, NULL);
+
+ g_variant_iter_init (&iter, supported);
+ while (g_variant_iter_loop (&iter, "(&s&s)", &cred_type, &cred_owner)) {
+ if (g_str_equal (owner, cred_owner)) {
+ if (g_str_equal (cred_type, "ccache") ||
+ g_str_equal (cred_type, "password")) {
+ return g_intern_string (cred_type);
+ }
+ }
+ }
+
+ return NULL;
+}
+
+static void
+on_realm_join_complete (GObject *source,
+ GAsyncResult *result,
+ gpointer user_data)
+{
+ GSimpleAsyncResult *async = G_SIMPLE_ASYNC_RESULT (user_data);
+
+ g_debug ("Completed Join() method call");
+
+ g_simple_async_result_set_op_res_gpointer (async, g_object_ref (result), g_object_unref);
+ g_simple_async_result_complete_in_idle (async);
+ g_object_unref (async);
+}
+
+static gboolean
+realm_join_as_owner (UmRealmObject *realm,
+ const gchar *owner,
+ const gchar *login,
+ const gchar *password,
+ GBytes *credentials,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ UmRealmKerberosMembership *membership;
+ GSimpleAsyncResult *async;
+ GVariant *contents;
+ GVariant *options;
+ GVariant *option;
+ GVariant *creds;
+ const gchar *type;
+
+ membership = um_realm_object_get_kerberos_membership (realm);
+ g_return_val_if_fail (membership != NULL, FALSE);
+
+ type = find_supported_credentials (membership, owner);
+ if (type == NULL) {
+ g_debug ("Couldn't find supported credential type for owner: %s", owner);
+ g_object_unref (membership);
+ return FALSE;
+ }
+
+ async = g_simple_async_result_new (G_OBJECT (realm), callback, user_data,
+ realm_join_as_owner);
+
+ if (g_str_equal (type, "ccache")) {
+ g_debug ("Using a kerberos credential cache to join the realm");
+ contents = g_variant_new_from_data (G_VARIANT_TYPE ("ay"),
+ g_bytes_get_data (credentials, NULL),
+ g_bytes_get_size (credentials),
+ TRUE, (GDestroyNotify)g_bytes_unref, credentials);
+
+ } else if (g_str_equal (type, "password")) {
+ g_debug ("Using a user/password to join the realm");
+ contents = g_variant_new ("(ss)", login, password);
+
+ } else {
+ g_assert_not_reached ();
+ }
+
+ creds = g_variant_new ("(ssv)", type, owner, contents);
+ option = g_variant_new ("{sv}", "manage-system", g_variant_new_boolean (FALSE));
+ options = g_variant_new_array (G_VARIANT_TYPE ("{sv}"), &option, 1);
+
+ g_debug ("Calling the Join() method with %s credentials", owner);
+
+ um_realm_kerberos_membership_call_join (membership, creds, options,
+ cancellable, on_realm_join_complete,
+ g_object_ref (async));
+
+ g_object_unref (async);
+ g_object_unref (membership);
+
+ return TRUE;
+}
+
+gboolean
+um_realm_join_as_user (UmRealmObject *realm,
+ const gchar *login,
+ const gchar *password,
+ GBytes *credentials,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_return_val_if_fail (UM_REALM_IS_OBJECT (realm), FALSE);
+ g_return_val_if_fail (credentials != NULL, FALSE);
+ g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE);
+ g_return_val_if_fail (login != NULL, FALSE);
+ g_return_val_if_fail (password != NULL, FALSE);
+ g_return_val_if_fail (credentials != NULL, FALSE);
+
+ return realm_join_as_owner (realm, "user", login, password,
+ credentials, cancellable, callback, user_data);
+}
+
+gboolean
+um_realm_join_as_admin (UmRealmObject *realm,
+ const gchar *login,
+ const gchar *password,
+ GBytes *credentials,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ g_return_val_if_fail (UM_REALM_IS_OBJECT (realm), FALSE);
+ g_return_val_if_fail (credentials != NULL, FALSE);
+ g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), FALSE);
+ g_return_val_if_fail (login != NULL, FALSE);
+ g_return_val_if_fail (password != NULL, FALSE);
+ g_return_val_if_fail (credentials != NULL, FALSE);
+
+ return realm_join_as_owner (realm, "administrator", login, password, credentials,
+ cancellable, callback, user_data);
+}
+
+gboolean
+um_realm_join_finish (UmRealmObject *realm,
+ GAsyncResult *result,
+ GError **error)
+{
+ UmRealmKerberosMembership *membership;
+ GError *call_error = NULL;
+ gchar *dbus_error;
+ GAsyncResult *async;
+
+ g_return_val_if_fail (UM_REALM_IS_OBJECT (realm), FALSE);
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+ membership = um_realm_object_get_kerberos_membership (realm);
+ g_return_val_if_fail (membership != NULL, FALSE);
+
+ async = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (result));
+ um_realm_kerberos_membership_call_join_finish (membership, async, &call_error);
+ g_object_unref (membership);
+
+ if (call_error == NULL)
+ return TRUE;
+
+ dbus_error = g_dbus_error_get_remote_error (call_error);
+ if (dbus_error == NULL) {
+ g_debug ("Join() failed because of %s", call_error->message);
+ g_propagate_error (error, call_error);
+ return FALSE;
+ }
+
+ g_dbus_error_strip_remote_error (call_error);
+
+ if (g_str_equal (dbus_error, "org.freedesktop.realmd.Error.AuthenticationFailed")) {
+ g_debug ("Join() failed because of invalid/insufficient credentials");
+ g_set_error (error, UM_REALM_ERROR, UM_REALM_ERROR_BAD_LOGIN,
+ "%s", call_error->message);
+ g_error_free (call_error);
+ } else if (g_str_equal (dbus_error, "org.freedesktop.realmd.Error.BadHostname")) {
+ g_debug ("Join() failed because of invalid/conflicting host name");
+ g_set_error (error, UM_REALM_ERROR, UM_REALM_ERROR_BAD_HOSTNAME,
+ "%s", call_error->message);
+ g_error_free (call_error);
+ } else {
+ g_debug ("Join() failed because of %s", call_error->message);
+ g_propagate_error (error, call_error);
+ }
+
+ g_free (dbus_error);
+ return FALSE;
+}
+
+typedef struct {
+ gchar *domain;
+ gchar *realm;
+ gchar *user;
+ gchar *password;
+ GBytes *credentials;
+} LoginClosure;
+
+static void
+login_closure_free (gpointer data)
+{
+ LoginClosure *login = data;
+ g_free (login->domain);
+ g_free (login->realm);
+ g_free (login->user);
+ g_free (login->password);
+ g_bytes_unref (login->credentials);
+ g_slice_free (LoginClosure, login);
+}
+
+static krb5_error_code
+login_perform_kinit (krb5_context k5,
+ const gchar *realm,
+ const gchar *login,
+ const gchar *password,
+ const gchar *filename)
+{
+ krb5_get_init_creds_opt *opts;
+ krb5_error_code code;
+ krb5_principal principal;
+ krb5_ccache ccache;
+ krb5_creds creds;
+ gchar *name;
+
+ name = g_strdup_printf ("%s %s", login, realm);
+ code = krb5_parse_name (k5, name, &principal);
+
+ if (code != 0) {
+ g_debug ("Couldn't parse principal name: %s: %s",
+ name, krb5_get_error_message (k5, code));
+ g_free (name);
+ return code;
+ }
+
+ g_debug ("Using principal name to kinit: %s", name);
+ g_free (name);
+
+ if (filename == NULL)
+ code = krb5_cc_default (k5, &ccache);
+ else
+ code = krb5_cc_resolve (k5, filename, &ccache);
+
+ if (code != 0) {
+ krb5_free_principal (k5, principal);
+ g_debug ("Couldn't open credential cache: %s: %s",
+ filename ? filename : "<default>",
+ krb5_get_error_message (k5, code));
+ return code;
+ }
+
+ code = krb5_get_init_creds_opt_alloc (k5, &opts);
+ g_return_val_if_fail (code == 0, code);
+
+ code = krb5_get_init_creds_opt_set_out_ccache (k5, opts, ccache);
+ g_return_val_if_fail (code == 0, code);
+
+ code = krb5_get_init_creds_password (k5, &creds, principal,
+ (char *)password,
+ NULL, 0, 0, NULL, opts);
+
+ krb5_get_init_creds_opt_free (k5, opts);
+ krb5_cc_close (k5, ccache);
+ krb5_free_principal (k5, principal);
+
+ if (code == 0) {
+ g_debug ("kinit succeeded");
+ krb5_free_cred_contents (k5, &creds);
+ } else {
+ g_debug ("kinit failed: %s", krb5_get_error_message (k5, code));
+ }
+
+ return code;
+}
+
+static void
+kinit_thread_func (GTask *task,
+ gpointer source_object,
+ gpointer task_data,
+ GCancellable *cancellable)
+{
+ LoginClosure *login = task_data;
+ krb5_context k5 = NULL;
+ krb5_error_code code;
+ GError *error = NULL;
+ gchar *filename = NULL;
+ gchar *contents;
+ gsize length;
+ gint temp_fd;
+
+ filename = g_build_filename (g_get_user_runtime_dir (),
+ "um-krb5-creds.XXXXXX", NULL);
+ temp_fd = g_mkstemp_full (filename, O_RDWR, S_IRUSR | S_IWUSR);
+ if (temp_fd == -1) {
+ g_warning ("Couldn't create credential cache file: %s: %s",
+ filename, g_strerror (errno));
+ g_free (filename);
+ filename = NULL;
+ } else {
+ close (temp_fd);
+ }
+
+ code = krb5_init_context (&k5);
+ if (code == 0) {
+ code = login_perform_kinit (k5, login->realm, login->user,
+ login->password, filename);
+ }
+
+ switch (code) {
+ case 0:
+ if (filename != NULL) {
+ g_file_get_contents (filename, &contents, &length, &error);
+ if (error == NULL) {
+ login->credentials = g_bytes_new_take (contents, length);
+ g_debug ("Read in credential cache: %s", filename);
+ } else {
+ g_warning ("Couldn't read credential cache: %s: %s",
+ filename, error->message);
+ g_error_free (error);
+ }
+ }
+ g_task_return_boolean (task, TRUE);
+ break;
+
+ case KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN:
+ case KRB5KDC_ERR_POLICY:
+ g_task_return_new_error (task, UM_REALM_ERROR, UM_REALM_ERROR_BAD_LOGIN,
+ _("Cannot log in as %s at the %s domain"),
+ login->user, login->domain);
+ break;
+ case KRB5KDC_ERR_PREAUTH_FAILED:
+ case KRB5KRB_AP_ERR_BAD_INTEGRITY:
+ g_task_return_new_error (task, UM_REALM_ERROR, UM_REALM_ERROR_BAD_PASSWORD,
+ _("Invalid password, please try again"));
+ break;
+ case KRB5_PREAUTH_FAILED:
+ case KRB5KDC_ERR_KEY_EXP:
+ case KRB5KDC_ERR_CLIENT_REVOKED:
+ case KRB5KDC_ERR_ETYPE_NOSUPP:
+ case KRB5_PROG_ETYPE_NOSUPP:
+ g_task_return_new_error (task, UM_REALM_ERROR, UM_REALM_ERROR_CANNOT_AUTH,
+ _("Cannot log in as %s at the %s domain"),
+ login->user, login->domain);
+ break;
+ default:
+ g_task_return_new_error (task, UM_REALM_ERROR, UM_REALM_ERROR_GENERIC,
+ _("Couldn't connect to the %s domain: %s"),
+ login->domain, krb5_get_error_message (k5, code));
+ break;
+ }
+
+ if (filename) {
+ g_unlink (filename);
+ g_debug ("Deleted credential cache: %s", filename);
+ g_free (filename);
+ }
+
+ if (k5)
+ krb5_free_context (k5);
+}
+
+void
+um_realm_login (UmRealmObject *realm,
+ const gchar *user,
+ const gchar *password,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GTask *task;
+ LoginClosure *login;
+ UmRealmKerberos *kerberos;
+
+ g_return_if_fail (UM_REALM_IS_OBJECT (realm));
+ g_return_if_fail (user != NULL);
+ g_return_if_fail (password != NULL);
+ g_return_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable));
+
+ kerberos = um_realm_object_get_kerberos (realm);
+ g_return_if_fail (kerberos != NULL);
+
+ task = g_task_new (realm, cancellable, callback, user_data);
+ login = g_slice_new0 (LoginClosure);
+ login->domain = g_strdup (um_realm_kerberos_get_domain_name (kerberos));
+ login->realm = g_strdup (um_realm_kerberos_get_realm_name (kerberos));
+ login->user = g_strdup (user);
+ login->password = g_strdup (password);
+ g_task_set_task_data (task, login, login_closure_free);
+
+ g_task_set_check_cancellable (task, TRUE);
+ g_task_set_return_on_cancel (task, TRUE);
+
+ g_task_run_in_thread (task, kinit_thread_func);
+
+ g_object_unref (task);
+ g_object_unref (kerberos);
+}
+
+gboolean
+um_realm_login_finish (UmRealmObject *realm,
+ GAsyncResult *result,
+ GBytes **credentials,
+ GError **error)
+{
+ GTask *task;
+ LoginClosure *login;
+
+ g_return_val_if_fail (g_task_is_valid (result, realm), FALSE);
+ g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
+
+ task = G_TASK (result);
+ if (!g_task_propagate_boolean (task, error))
+ return FALSE;
+
+ login = g_task_get_task_data (task);
+ if (credentials) {
+ if (login->credentials)
+ *credentials = g_bytes_ref (login->credentials);
+ else
+ *credentials = NULL;
+ }
+
+ return TRUE;
+}
diff --git a/gnome-initial-setup/pages/password/um-realm-manager.h
b/gnome-initial-setup/pages/password/um-realm-manager.h
new file mode 100644
index 0000000..2003cda
--- /dev/null
+++ b/gnome-initial-setup/pages/password/um-realm-manager.h
@@ -0,0 +1,109 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright 2012 Red Hat, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * Written by: Stef Walter <stefw gnome org>
+ */
+
+#ifndef __UM_REALM_MANAGER_H__
+#define __UM_REALM_MANAGER_H__
+
+#include "um-realm-generated.h"
+
+G_BEGIN_DECLS
+
+typedef enum {
+ UM_REALM_ERROR_BAD_LOGIN,
+ UM_REALM_ERROR_BAD_PASSWORD,
+ UM_REALM_ERROR_CANNOT_AUTH,
+ UM_REALM_ERROR_BAD_HOSTNAME,
+ UM_REALM_ERROR_GENERIC,
+} UmRealmErrors;
+
+#define UM_REALM_ERROR (um_realm_error_get_quark ())
+
+GQuark um_realm_error_get_quark (void) G_GNUC_CONST;
+
+#define UM_TYPE_REALM_MANAGER (um_realm_manager_get_type ())
+#define UM_REALM_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), UM_TYPE_REALM_MANAGER,
UmRealmManager))
+#define UM_IS_REALM_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), UM_TYPE_REALM_MANAGER))
+
+typedef struct _UmRealmManager UmRealmManager;
+
+GType um_realm_manager_get_type (void) G_GNUC_CONST;
+
+void um_realm_manager_new (GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+UmRealmManager * um_realm_manager_new_finish (GAsyncResult *result,
+ GError **error);
+
+void um_realm_manager_discover (UmRealmManager *self,
+ const gchar *input,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+GList * um_realm_manager_discover_finish (UmRealmManager *self,
+ GAsyncResult *result,
+ GError **error);
+
+GList * um_realm_manager_get_realms (UmRealmManager *self);
+
+void um_realm_login (UmRealmObject *realm,
+ const gchar *login,
+ const gchar *password,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data);
+
+gboolean um_realm_login_finish (UmRealmObject *realm,
+ GAsyncResult *result,
+ GBytes **credentials,
+ GError **error);
+
+gboolean um_realm_join_as_user (UmRealmObject *realm,
+ const gchar *login,
+ const gchar *password,
+ GBytes *credentials,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+ G_GNUC_WARN_UNUSED_RESULT;
+
+gboolean um_realm_join_as_admin (UmRealmObject *realm,
+ const gchar *login,
+ const gchar *password,
+ GBytes *credentials,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+ G_GNUC_WARN_UNUSED_RESULT;
+
+gboolean um_realm_join_finish (UmRealmObject *realm,
+ GAsyncResult *result,
+ GError **error);
+
+gboolean um_realm_is_configured (UmRealmObject *realm);
+
+gchar * um_realm_calculate_login (UmRealmCommon *realm,
+ const gchar *username);
+
+G_END_DECLS
+
+#endif /* __UM_REALM_H__ */
diff --git a/gnome-initial-setup/pages/password/um-utils.c b/gnome-initial-setup/pages/password/um-utils.c
new file mode 100644
index 0000000..0ee5920
--- /dev/null
+++ b/gnome-initial-setup/pages/password/um-utils.c
@@ -0,0 +1,385 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright 2009-2010 Red Hat, Inc,
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA
+ *
+ * Written by: Matthias Clasen <mclasen redhat com>
+ */
+
+#include "config.h"
+
+#include <math.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <pwd.h>
+#include <utmp.h>
+
+#include <glib.h>
+#include <glib/gi18n.h>
+
+#include "um-utils.h"
+
+void
+set_entry_validation_error (GtkEntry *entry,
+ const gchar *text)
+{
+ g_object_set (entry, "caps-lock-warning", FALSE, NULL);
+ gtk_entry_set_icon_from_stock (entry,
+ GTK_ENTRY_ICON_SECONDARY,
+ GTK_STOCK_CAPS_LOCK_WARNING);
+ gtk_entry_set_icon_tooltip_text (entry,
+ GTK_ENTRY_ICON_SECONDARY,
+ text);
+}
+
+void
+clear_entry_validation_error (GtkEntry *entry)
+{
+ gboolean warning;
+
+ g_object_get (entry, "caps-lock-warning", &warning, NULL);
+
+ if (warning)
+ return;
+
+ gtk_entry_set_icon_from_pixbuf (entry,
+ GTK_ENTRY_ICON_SECONDARY,
+ NULL);
+ g_object_set (entry, "caps-lock-warning", TRUE, NULL);
+}
+
+#define MAXNAMELEN (UT_NAMESIZE - 1)
+
+static gboolean
+is_username_used (const gchar *username)
+{
+ struct passwd *pwent;
+
+ if (username == NULL || username[0] == '\0') {
+ return FALSE;
+ }
+
+ pwent = getpwnam (username);
+
+ return pwent != NULL;
+}
+
+gboolean
+is_valid_name (const gchar *name)
+{
+ gboolean is_empty = TRUE;
+ const gchar *c;
+
+ /* Valid names must contain:
+ * 1) at least one character.
+ * 2) at least one non-"space" character.
+ */
+ for (c = name; *c; c++) {
+ gunichar unichar;
+
+ unichar = g_utf8_get_char_validated (c, -1);
+
+ /* Partial UTF-8 sequence or end of string */
+ if (unichar == (gunichar) -1 || unichar == (gunichar) -2)
+ break;
+
+ /* Check for non-space character */
+ if (!g_unichar_isspace (unichar)) {
+ is_empty = FALSE;
+ break;
+ }
+ }
+
+ return !is_empty;
+}
+
+gboolean
+is_valid_username (const gchar *username, gchar **tip)
+{
+ gboolean empty;
+ gboolean in_use;
+ gboolean too_long;
+ gboolean valid;
+ const gchar *c;
+
+ if (username == NULL || username[0] == '\0') {
+ empty = TRUE;
+ in_use = FALSE;
+ too_long = FALSE;
+ } else {
+ empty = FALSE;
+ in_use = is_username_used (username);
+ too_long = strlen (username) > MAXNAMELEN;
+ }
+ valid = TRUE;
+
+ if (!in_use && !empty && !too_long) {
+ /* First char must be a letter, and it must only composed
+ * of ASCII letters, digits, and a '.', '-', '_'
+ */
+ for (c = username; *c; c++) {
+ if (! ((*c >= 'a' && *c <= 'z') ||
+ (*c >= 'A' && *c <= 'Z') ||
+ (*c >= '0' && *c <= '9') ||
+ (*c == '_') || (*c == '.') ||
+ (*c == '-' && c != username)))
+ valid = FALSE;
+ }
+ }
+
+ valid = !empty && !in_use && !too_long && valid;
+
+ if (!empty && (in_use || too_long || !valid)) {
+ if (in_use) {
+ *tip = g_strdup_printf (_("A user with the username '%s' already exists"),
+ username);
+ }
+ else if (too_long) {
+ *tip = g_strdup_printf (_("The username is too long"));
+ }
+ else if (username[0] == '-') {
+ *tip = g_strdup (_("The username cannot start with a '-'"));
+ }
+ else {
+ *tip = g_strdup (_("The username must only consist of:\n"
+ " \xe2\x9e\xa3 letters from the English alphabet\n"
+ " \xe2\x9e\xa3 digits\n"
+ " \xe2\x9e\xa3 any of the characters '.', '-' and '_'"));
+ }
+ }
+ else {
+ *tip = NULL;
+ }
+
+ return valid;
+}
+
+void
+generate_username_choices (const gchar *name,
+ GtkListStore *store)
+{
+ gboolean in_use, same_as_initial;
+ char *lc_name, *ascii_name, *stripped_name;
+ char **words1;
+ char **words2 = NULL;
+ char **w1, **w2;
+ char *c;
+ char *unicode_fallback = "?";
+ GString *first_word, *last_word;
+ GString *item0, *item1, *item2, *item3, *item4;
+ int len;
+ int nwords1, nwords2, i;
+ GHashTable *items;
+ GtkTreeIter iter;
+
+ gtk_list_store_clear (store);
+
+ ascii_name = g_convert_with_fallback (name, -1, "ASCII//TRANSLIT", "UTF-8",
+ unicode_fallback, NULL, NULL, NULL);
+
+ lc_name = g_ascii_strdown (ascii_name, -1);
+
+ /* Remove all non ASCII alphanumeric chars from the name,
+ * apart from the few allowed symbols.
+ *
+ * We do remove '.', even though it is usually allowed,
+ * since it often comes in via an abbreviated middle name,
+ * and the dot looks just wrong in the proposals then.
+ */
+ stripped_name = g_strnfill (strlen (lc_name) + 1, '\0');
+ i = 0;
+ for (c = lc_name; *c; c++) {
+ if (!(g_ascii_isdigit (*c) || g_ascii_islower (*c) ||
+ *c == ' ' || *c == '-' || *c == '_' ||
+ /* used to track invalid words, removed below */
+ *c == '?') )
+ continue;
+
+ stripped_name[i] = *c;
+ i++;
+ }
+
+ if (strlen (stripped_name) == 0) {
+ g_free (ascii_name);
+ g_free (lc_name);
+ g_free (stripped_name);
+ return;
+ }
+
+ /* we split name on spaces, and then on dashes, so that we can treat
+ * words linked with dashes the same way, i.e. both fully shown, or
+ * both abbreviated
+ */
+ words1 = g_strsplit_set (stripped_name, " ", -1);
+ len = g_strv_length (words1);
+
+ /* The default item is a concatenation of all words without ? */
+ item0 = g_string_sized_new (strlen (stripped_name));
+
+ g_free (ascii_name);
+ g_free (lc_name);
+ g_free (stripped_name);
+
+ /* Concatenate the whole first word with the first letter of each
+ * word (item1), and the last word with the first letter of each
+ * word (item2). item3 and item4 are symmetrical respectively to
+ * item1 and item2.
+ *
+ * Constant 5 is the max reasonable number of words we may get when
+ * splitting on dashes, since we can't guess it at this point,
+ * and reallocating would be too bad.
+ */
+ item1 = g_string_sized_new (strlen (words1[0]) + len - 1 + 5);
+ item3 = g_string_sized_new (strlen (words1[0]) + len - 1 + 5);
+
+ item2 = g_string_sized_new (strlen (words1[len - 1]) + len - 1 + 5);
+ item4 = g_string_sized_new (strlen (words1[len - 1]) + len - 1 + 5);
+
+ /* again, guess at the max size of names */
+ first_word = g_string_sized_new (20);
+ last_word = g_string_sized_new (20);
+
+ nwords1 = 0;
+ nwords2 = 0;
+ for (w1 = words1; *w1; w1++) {
+ if (strlen (*w1) == 0)
+ continue;
+
+ /* skip words with string '?', most likely resulting
+ * from failed transliteration to ASCII
+ */
+ if (strstr (*w1, unicode_fallback) != NULL)
+ continue;
+
+ nwords1++; /* count real words, excluding empty string */
+
+ item0 = g_string_append (item0, *w1);
+
+ words2 = g_strsplit_set (*w1, "-", -1);
+ /* reset last word if a new non-empty word has been found */
+ if (strlen (*words2) > 0)
+ last_word = g_string_set_size (last_word, 0);
+
+ for (w2 = words2; *w2; w2++) {
+ if (strlen (*w2) == 0)
+ continue;
+
+ nwords2++;
+
+ /* part of the first "toplevel" real word */
+ if (nwords1 == 1) {
+ item1 = g_string_append (item1, *w2);
+ first_word = g_string_append (first_word, *w2);
+ }
+ else {
+ item1 = g_string_append_unichar (item1,
+ g_utf8_get_char (*w2));
+ item3 = g_string_append_unichar (item3,
+ g_utf8_get_char (*w2));
+ }
+
+ /* not part of the last "toplevel" word */
+ if (w1 != words1 + len - 1) {
+ item2 = g_string_append_unichar (item2,
+ g_utf8_get_char (*w2));
+ item4 = g_string_append_unichar (item4,
+ g_utf8_get_char (*w2));
+ }
+
+ /* always save current word so that we have it if last one reveals empty */
+ last_word = g_string_append (last_word, *w2);
+ }
+
+ g_strfreev (words2);
+ }
+ item2 = g_string_append (item2, last_word->str);
+ item3 = g_string_append (item3, first_word->str);
+ item4 = g_string_prepend (item4, last_word->str);
+
+ items = g_hash_table_new (g_str_hash, g_str_equal);
+
+ in_use = is_username_used (item0->str);
+ if (!in_use && !g_ascii_isdigit (item0->str[0])) {
+ gtk_list_store_append (store, &iter);
+ gtk_list_store_set (store, &iter, 0, item0->str, -1);
+ g_hash_table_insert (items, item0->str, item0->str);
+ }
+
+ in_use = is_username_used (item1->str);
+ same_as_initial = (g_strcmp0 (item0->str, item1->str) == 0);
+ if (!same_as_initial && nwords2 > 0 && !in_use && !g_ascii_isdigit (item1->str[0])) {
+ gtk_list_store_append (store, &iter);
+ gtk_list_store_set (store, &iter, 0, item1->str, -1);
+ g_hash_table_insert (items, item1->str, item1->str);
+ }
+
+ /* if there's only one word, would be the same as item1 */
+ if (nwords2 > 1) {
+ /* add other items */
+ in_use = is_username_used (item2->str);
+ if (!in_use && !g_ascii_isdigit (item2->str[0]) &&
+ !g_hash_table_lookup (items, item2->str)) {
+ gtk_list_store_append (store, &iter);
+ gtk_list_store_set (store, &iter, 0, item2->str, -1);
+ g_hash_table_insert (items, item2->str, item2->str);
+ }
+
+ in_use = is_username_used (item3->str);
+ if (!in_use && !g_ascii_isdigit (item3->str[0]) &&
+ !g_hash_table_lookup (items, item3->str)) {
+ gtk_list_store_append (store, &iter);
+ gtk_list_store_set (store, &iter, 0, item3->str, -1);
+ g_hash_table_insert (items, item3->str, item3->str);
+ }
+
+ in_use = is_username_used (item4->str);
+ if (!in_use && !g_ascii_isdigit (item4->str[0]) &&
+ !g_hash_table_lookup (items, item4->str)) {
+ gtk_list_store_append (store, &iter);
+ gtk_list_store_set (store, &iter, 0, item4->str, -1);
+ g_hash_table_insert (items, item4->str, item4->str);
+ }
+
+ /* add the last word */
+ in_use = is_username_used (last_word->str);
+ if (!in_use && !g_ascii_isdigit (last_word->str[0]) &&
+ !g_hash_table_lookup (items, last_word->str)) {
+ gtk_list_store_append (store, &iter);
+ gtk_list_store_set (store, &iter, 0, last_word->str, -1);
+ g_hash_table_insert (items, last_word->str, last_word->str);
+ }
+
+ /* ...and the first one */
+ in_use = is_username_used (first_word->str);
+ if (!in_use && !g_ascii_isdigit (first_word->str[0]) &&
+ !g_hash_table_lookup (items, first_word->str)) {
+ gtk_list_store_append (store, &iter);
+ gtk_list_store_set (store, &iter, 0, first_word->str, -1);
+ g_hash_table_insert (items, first_word->str, first_word->str);
+ }
+ }
+
+ g_hash_table_destroy (items);
+ g_strfreev (words1);
+ g_string_free (first_word, TRUE);
+ g_string_free (last_word, TRUE);
+ g_string_free (item0, TRUE);
+ g_string_free (item1, TRUE);
+ g_string_free (item2, TRUE);
+ g_string_free (item3, TRUE);
+ g_string_free (item4, TRUE);
+}
diff --git a/gnome-initial-setup/pages/password/um-utils.h b/gnome-initial-setup/pages/password/um-utils.h
new file mode 100644
index 0000000..5befff5
--- /dev/null
+++ b/gnome-initial-setup/pages/password/um-utils.h
@@ -0,0 +1,43 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*-
+ *
+ * Copyright 2009-2010 Red Hat, Inc,
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA
+ *
+ * Written by: Matthias Clasen <mclasen redhat com>
+ */
+
+#ifndef __UM_UTILS_H__
+#define __UM_UTILS_H__
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+void set_entry_validation_error (GtkEntry *entry,
+ const gchar *text);
+void clear_entry_validation_error (GtkEntry *entry);
+
+gboolean is_valid_name (const gchar *name);
+gboolean is_valid_username (const gchar *name,
+ gchar **tip);
+
+void generate_username_choices (const gchar *name,
+ GtkListStore *store);
+
+G_END_DECLS
+
+#endif
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]