/* SerializableGeeDualKeyMap.c generated by valac 0.44.3, the Vala compiler
 * generated from SerializableGeeDualKeyMap.vala, do not modify */

/* -*- Mode: vala; indent-tabs-mode: nil; c-basic-offset: 2; tab-width: 2 -*- */
/* SerializableGeeTreeModel.vala
 *
 * Copyright (C) 2013-2015  Daniel Espinosa <esodan@gmail.com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.

 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
 *
 * Authors:
 *      Daniel Espinosa <esodan@gmail.com>
 */

#include <glib-object.h>
#include <gee.h>
#include <glib.h>
#include <stdlib.h>
#include <string.h>
#include <gio/gio.h>
#include <glib/gi18n-lib.h>

#define GXML_TYPE_SERIALIZABLE (gxml_serializable_get_type ())
#define GXML_SERIALIZABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GXML_TYPE_SERIALIZABLE, GXmlSerializable))
#define GXML_IS_SERIALIZABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GXML_TYPE_SERIALIZABLE))
#define GXML_SERIALIZABLE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GXML_TYPE_SERIALIZABLE, GXmlSerializableIface))

typedef struct _GXmlSerializable GXmlSerializable;
typedef struct _GXmlSerializableIface GXmlSerializableIface;

#define GXML_TYPE_NODE (gxml_node_get_type ())
#define GXML_NODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GXML_TYPE_NODE, GXmlNode))
#define GXML_IS_NODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GXML_TYPE_NODE))
#define GXML_NODE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GXML_TYPE_NODE, GXmlNodeIface))

typedef struct _GXmlNode GXmlNode;
typedef struct _GXmlNodeIface GXmlNodeIface;

#define GXML_TYPE_ELEMENT_LIST (gxml_element_list_get_type ())
#define GXML_ELEMENT_LIST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GXML_TYPE_ELEMENT_LIST, GXmlElementList))
#define GXML_ELEMENT_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GXML_TYPE_ELEMENT_LIST, GXmlElementListClass))
#define GXML_IS_ELEMENT_LIST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GXML_TYPE_ELEMENT_LIST))
#define GXML_IS_ELEMENT_LIST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GXML_TYPE_ELEMENT_LIST))
#define GXML_ELEMENT_LIST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GXML_TYPE_ELEMENT_LIST, GXmlElementListClass))

typedef struct _GXmlElementList GXmlElementList;
typedef struct _GXmlElementListClass GXmlElementListClass;

#define GXML_TYPE_NAMESPACE (gxml_namespace_get_type ())
#define GXML_NAMESPACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GXML_TYPE_NAMESPACE, GXmlNamespace))
#define GXML_IS_NAMESPACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GXML_TYPE_NAMESPACE))
#define GXML_NAMESPACE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GXML_TYPE_NAMESPACE, GXmlNamespaceIface))

typedef struct _GXmlNamespace GXmlNamespace;
typedef struct _GXmlNamespaceIface GXmlNamespaceIface;
typedef enum  {
	GXML_NODE_TYPE_INVALID = 0,
	GXML_NODE_TYPE_ELEMENT = 1,
	GXML_NODE_TYPE_ATTRIBUTE,
	GXML_NODE_TYPE_TEXT,
	GXML_NODE_TYPE_CDATA_SECTION,
	GXML_NODE_TYPE_ENTITY_REFERENCE,
	GXML_NODE_TYPE_ENTITY,
	GXML_NODE_TYPE_PROCESSING_INSTRUCTION,
	GXML_NODE_TYPE_COMMENT,
	GXML_NODE_TYPE_DOCUMENT,
	GXML_NODE_TYPE_DOCUMENT_TYPE,
	GXML_NODE_TYPE_DOCUMENT_FRAGMENT,
	GXML_NODE_TYPE_NOTATION
} GXmlNodeType;

#define GXML_TYPE_NODE_TYPE (gxml_node_type_get_type ())

#define GXML_TYPE_DOCUMENT (gxml_document_get_type ())
#define GXML_DOCUMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GXML_TYPE_DOCUMENT, GXmlDocument))
#define GXML_IS_DOCUMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GXML_TYPE_DOCUMENT))
#define GXML_DOCUMENT_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GXML_TYPE_DOCUMENT, GXmlDocumentIface))

typedef struct _GXmlDocument GXmlDocument;
typedef struct _GXmlDocumentIface GXmlDocumentIface;

#define GXML_TYPE_ATTRIBUTE (gxml_attribute_get_type ())
#define GXML_ATTRIBUTE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GXML_TYPE_ATTRIBUTE, GXmlAttribute))
#define GXML_IS_ATTRIBUTE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GXML_TYPE_ATTRIBUTE))
#define GXML_ATTRIBUTE_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GXML_TYPE_ATTRIBUTE, GXmlAttributeIface))

typedef struct _GXmlAttribute GXmlAttribute;
typedef struct _GXmlAttributeIface GXmlAttributeIface;

#define GXML_TYPE_SERIALIZABLE_COLLECTION (gxml_serializable_collection_get_type ())
#define GXML_SERIALIZABLE_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GXML_TYPE_SERIALIZABLE_COLLECTION, GXmlSerializableCollection))
#define GXML_IS_SERIALIZABLE_COLLECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GXML_TYPE_SERIALIZABLE_COLLECTION))
#define GXML_SERIALIZABLE_COLLECTION_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GXML_TYPE_SERIALIZABLE_COLLECTION, GXmlSerializableCollectionIface))

typedef struct _GXmlSerializableCollection GXmlSerializableCollection;
typedef struct _GXmlSerializableCollectionIface GXmlSerializableCollectionIface;

#define GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP (gxml_serializable_dual_key_map_get_type ())
#define GXML_SERIALIZABLE_DUAL_KEY_MAP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP, GXmlSerializableDualKeyMap))
#define GXML_SERIALIZABLE_DUAL_KEY_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP, GXmlSerializableDualKeyMapClass))
#define GXML_IS_SERIALIZABLE_DUAL_KEY_MAP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP))
#define GXML_IS_SERIALIZABLE_DUAL_KEY_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP))
#define GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP, GXmlSerializableDualKeyMapClass))

typedef struct _GXmlSerializableDualKeyMap GXmlSerializableDualKeyMap;
typedef struct _GXmlSerializableDualKeyMapClass GXmlSerializableDualKeyMapClass;
typedef struct _GXmlSerializableDualKeyMapPrivate GXmlSerializableDualKeyMapPrivate;
enum  {
	GXML_SERIALIZABLE_DUAL_KEY_MAP_0_PROPERTY,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_P_TYPE,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_P_DUP_FUNC,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_P_DESTROY_FUNC,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_S_TYPE,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_S_DUP_FUNC,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_S_DESTROY_FUNC,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_V_TYPE,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_V_DUP_FUNC,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_V_DESTROY_FUNC,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_VALUE_TYPE_PROPERTY,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_PRIMARY_KEY_TYPE_PROPERTY,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_SECONDARY_KEY_TYPE_PROPERTY,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_PRIMARY_KEYS_PROPERTY,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_SIZE_PROPERTY,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_UNKNOWN_SERIALIZABLE_PROPERTIES_PROPERTY,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_UNKNOWN_SERIALIZABLE_NODES_PROPERTY,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_IGNORED_SERIALIZABLE_PROPERTIES_PROPERTY,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_SERIALIZED_XML_NODE_VALUE_PROPERTY,
	GXML_SERIALIZABLE_DUAL_KEY_MAP_NUM_PROPERTIES
};
static GParamSpec* gxml_serializable_dual_key_map_properties[GXML_SERIALIZABLE_DUAL_KEY_MAP_NUM_PROPERTIES];
#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
#define _g_hash_table_unref0(var) ((var == NULL) ? NULL : (var = (g_hash_table_unref (var), NULL)))
#define _g_free0(var) (var = (g_free (var), NULL))

#define GXML_TYPE_SERIALIZABLE_MAP_DUAL_KEY (gxml_serializable_map_dual_key_get_type ())
#define GXML_SERIALIZABLE_MAP_DUAL_KEY(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GXML_TYPE_SERIALIZABLE_MAP_DUAL_KEY, GXmlSerializableMapDualKey))
#define GXML_IS_SERIALIZABLE_MAP_DUAL_KEY(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GXML_TYPE_SERIALIZABLE_MAP_DUAL_KEY))
#define GXML_SERIALIZABLE_MAP_DUAL_KEY_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GXML_TYPE_SERIALIZABLE_MAP_DUAL_KEY, GXmlSerializableMapDualKeyIface))

typedef struct _GXmlSerializableMapDualKey GXmlSerializableMapDualKey;
typedef struct _GXmlSerializableMapDualKeyIface GXmlSerializableMapDualKeyIface;

#define GXML_TYPE_ELEMENT (gxml_element_get_type ())
#define GXML_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GXML_TYPE_ELEMENT, GXmlElement))
#define GXML_IS_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GXML_TYPE_ELEMENT))
#define GXML_ELEMENT_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GXML_TYPE_ELEMENT, GXmlElementIface))

typedef struct _GXmlElement GXmlElement;
typedef struct _GXmlElementIface GXmlElementIface;
#define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg);
#define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return; }
#define _vala_return_val_if_fail(expr, msg, val) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return val; }
#define _vala_warn_if_fail(expr, msg) if G_LIKELY (expr) ; else g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg);

struct _GXmlNamespaceIface {
	GTypeInterface parent_iface;
	gchar* (*get_uri) (GXmlNamespace* self);
	gchar* (*get_prefix) (GXmlNamespace* self);
};

struct _GXmlDocumentIface {
	GTypeInterface parent_iface;
	GXmlNode* (*create_element) (GXmlDocument* self, const gchar* name, GError** error);
	GXmlNode* (*create_text) (GXmlDocument* self, const gchar* text);
	GXmlNode* (*create_comment) (GXmlDocument* self, const gchar* text);
	GXmlNode* (*create_cdata) (GXmlDocument* self, const gchar* text);
	GXmlNode* (*create_pi) (GXmlDocument* self, const gchar* target, const gchar* data);
	gboolean (*save) (GXmlDocument* self, GCancellable* cancellable, GError** error);
	gboolean (*save_as) (GXmlDocument* self, GFile* f, GCancellable* cancellable, GError** error);
	gboolean (*get_indent) (GXmlDocument* self);
	void (*set_indent) (GXmlDocument* self, gboolean value);
	gboolean (*get_ns_top) (GXmlDocument* self);
	void (*set_ns_top) (GXmlDocument* self, gboolean value);
	gboolean (*get_prefix_default_ns) (GXmlDocument* self);
	void (*set_prefix_default_ns) (GXmlDocument* self, gboolean value);
	gboolean (*get_backup) (GXmlDocument* self);
	void (*set_backup) (GXmlDocument* self, gboolean value);
	GXmlNode* (*get_root) (GXmlDocument* self);
	GFile* (*get_file) (GXmlDocument* self);
	void (*set_file) (GXmlDocument* self, GFile* value);
};

struct _GXmlNodeIface {
	GTypeInterface parent_iface;
	GXmlNode* (*get) (GXmlNode* self, const gchar* key);
	GXmlElementList* (*get_elements_by_property_value) (GXmlNode* self, const gchar* property, const gchar* value);
	GXmlElementList* (*get_elements_by_name) (GXmlNode* self, const gchar* name);
	GXmlElementList* (*get_elements_by_name_ns) (GXmlNode* self, const gchar* name, const gchar* ns);
	gchar* (*to_string) (GXmlNode* self);
	gboolean (*set_namespace) (GXmlNode* self, const gchar* uri, const gchar* prefix);
	gchar* (*ns_prefix) (GXmlNode* self);
	gchar* (*ns_uri) (GXmlNode* self);
	GeeList* (*get_namespaces) (GXmlNode* self);
	GeeBidirList* (*get_children_nodes) (GXmlNode* self);
	GeeMap* (*get_attrs) (GXmlNode* self);
	gchar* (*get_name) (GXmlNode* self);
	gchar* (*get_value) (GXmlNode* self);
	void (*set_value) (GXmlNode* self, const gchar* value);
	GXmlNodeType (*get_type_node) (GXmlNode* self);
	GXmlDocument* (*get_document) (GXmlNode* self);
	GXmlNode* (*get_parent) (GXmlNode* self);
};

struct _GXmlAttributeIface {
	GTypeInterface parent_iface;
	GXmlNamespace* (*get_namespace) (GXmlAttribute* self);
	void (*set_namespace) (GXmlAttribute* self, GXmlNamespace* value);
	gchar* (*get_prefix) (GXmlAttribute* self);
};

struct _GXmlSerializableIface {
	GTypeInterface parent_iface;
	gboolean (*get_enable_unknown_serializable_property) (GXmlSerializable* self);
	gboolean (*set_default_namespace) (GXmlSerializable* self, GXmlNode* node);
	gboolean (*serialize_use_xml_node_value) (GXmlSerializable* self);
	gchar* (*node_name) (GXmlSerializable* self);
	gboolean (*property_use_nick) (GXmlSerializable* self);
	GXmlNode* (*serialize) (GXmlSerializable* self, GXmlNode* node, GError** error);
	GXmlNode* (*serialize_property) (GXmlSerializable* self, GXmlNode* element, GParamSpec* prop, GError** error);
	gboolean (*deserialize) (GXmlSerializable* self, GXmlNode* node, GError** error);
	gboolean (*deserialize_property) (GXmlSerializable* self, GXmlNode* property_node, GError** error);
	GParamSpec* (*find_property_spec) (GXmlSerializable* self, const gchar* property_name);
	GParamSpec* (*default_find_property_spec) (GXmlSerializable* self, const gchar* property_name);
	GParamSpec** (*list_serializable_properties) (GXmlSerializable* self, gint* result_length1);
	GParamSpec** (*default_list_serializable_properties) (GXmlSerializable* self, gint* result_length1);
	GeeMap* (*get_unknown_serializable_properties) (GXmlSerializable* self);
	GeeCollection* (*get_unknown_serializable_nodes) (GXmlSerializable* self);
	gchar* (*get_serialized_xml_node_value) (GXmlSerializable* self);
	void (*set_serialized_xml_node_value) (GXmlSerializable* self, const gchar* value);
};

struct _GXmlSerializableCollectionIface {
	GTypeInterface parent_iface;
	gboolean (*deserialize_proceed) (GXmlSerializableCollection* self);
	gboolean (*deserialized) (GXmlSerializableCollection* self);
	gboolean (*deserialize_node) (GXmlSerializableCollection* self, GXmlNode* node, GError** error);
	gboolean (*deserialize_children) (GXmlSerializableCollection* self, GError** error);
	gboolean (*is_collection) (GXmlSerializableCollection* self);
};

struct _GXmlSerializableDualKeyMap {
	GObject parent_instance;
	GXmlSerializableDualKeyMapPrivate * priv;
	GeeHashMultiMap* storage;
	GXmlNode* _node;
	gboolean _deserialized;
};

struct _GXmlSerializableDualKeyMapClass {
	GObjectClass parent_class;
	gboolean (*deserialize_proceed) (GXmlSerializableDualKeyMap* self);
	gboolean (*deserialized) (GXmlSerializableDualKeyMap* self);
	gboolean (*deserialize_node) (GXmlSerializableDualKeyMap* self, GXmlNode* node, GError** error);
	gboolean (*deserialize_children) (GXmlSerializableDualKeyMap* self, GError** error);
	gboolean (*set_default_namespace) (GXmlSerializableDualKeyMap* self, GXmlNode* node);
	gboolean (*get_enable_unknown_serializable_property) (GXmlSerializableDualKeyMap* self);
	gboolean (*serialize_use_xml_node_value) (GXmlSerializableDualKeyMap* self);
	gboolean (*property_use_nick) (GXmlSerializableDualKeyMap* self);
	gchar* (*node_name) (GXmlSerializableDualKeyMap* self);
	GParamSpec* (*find_property_spec) (GXmlSerializableDualKeyMap* self, const gchar* property_name);
	GParamSpec** (*list_serializable_properties) (GXmlSerializableDualKeyMap* self, gint* result_length1);
	GXmlNode* (*serialize) (GXmlSerializableDualKeyMap* self, GXmlNode* node, GError** error);
	GXmlNode* (*serialize_property) (GXmlSerializableDualKeyMap* self, GXmlNode* element, GParamSpec* prop, GError** error);
	gboolean (*deserialize) (GXmlSerializableDualKeyMap* self, GXmlNode* node, GError** error);
	gboolean (*deserialize_property) (GXmlSerializableDualKeyMap* self, GXmlNode* property_node, GError** error);
};

struct _GXmlSerializableDualKeyMapPrivate {
	GType p_type;
	GBoxedCopyFunc p_dup_func;
	GDestroyNotify p_destroy_func;
	GType s_type;
	GBoxedCopyFunc s_dup_func;
	GDestroyNotify s_destroy_func;
	GType v_type;
	GBoxedCopyFunc v_dup_func;
	GDestroyNotify v_destroy_func;
	GHashTable* _ignored_serializable_properties;
	gchar* _serialized_xml_node_value;
};

struct _GXmlSerializableMapDualKeyIface {
	GTypeInterface parent_iface;
	gpointer (*get_map_primary_key) (GXmlSerializableMapDualKey* self);
	gpointer (*get_map_secondary_key) (GXmlSerializableMapDualKey* self);
};

typedef enum  {
	GXML_SERIALIZABLE_ERROR_UNSUPPORTED_TYPE_ERROR,
	GXML_SERIALIZABLE_ERROR_STR_TO_VALUE_ERROR
} GXmlSerializableError;
#define GXML_SERIALIZABLE_ERROR gxml_serializable_error_quark ()
struct _GXmlElementIface {
	GTypeInterface parent_iface;
	void (*normalize) (GXmlElement* self);
	void (*set_attr) (GXmlElement* self, const gchar* name, const gchar* value);
	GXmlNode* (*get_attr) (GXmlElement* self, const gchar* name);
	void (*remove_attr) (GXmlElement* self, const gchar* name);
	void (*remove_ns_attr) (GXmlElement* self, const gchar* name, const gchar* uri);
	void (*set_ns_attr) (GXmlElement* self, const gchar* ns, const gchar* name, const gchar* value);
	GXmlNode* (*get_ns_attr) (GXmlElement* self, const gchar* name, const gchar* uri);
	gchar* (*get_tag_name) (GXmlElement* self);
	gchar* (*get_content) (GXmlElement* self);
	void (*set_content) (GXmlElement* self, const gchar* value);
};

static gint GXmlSerializableDualKeyMap_private_offset;
static gpointer gxml_serializable_dual_key_map_parent_class = NULL;
static GeeTraversableIface * gxml_serializable_dual_key_map_gee_traversable_parent_iface = NULL;
static GXmlSerializableIface * gxml_serializable_dual_key_map_gxml_serializable_parent_iface = NULL;
static GXmlSerializableCollectionIface * gxml_serializable_dual_key_map_gxml_serializable_collection_parent_iface = NULL;

GType gxml_element_list_get_type (void) G_GNUC_CONST;
GType gxml_namespace_get_type (void) G_GNUC_CONST;
GType gxml_node_type_get_type (void) G_GNUC_CONST;
GType gxml_document_get_type (void) G_GNUC_CONST;
GType gxml_node_get_type (void) G_GNUC_CONST;
GType gxml_attribute_get_type (void) G_GNUC_CONST;
GType gxml_serializable_get_type (void) G_GNUC_CONST;
GType gxml_serializable_collection_get_type (void) G_GNUC_CONST;
GType gxml_serializable_dual_key_map_get_type (void) G_GNUC_CONST;
gboolean gxml_serializable_dual_key_map_deserialize_proceed (GXmlSerializableDualKeyMap* self);
static gboolean gxml_serializable_dual_key_map_real_deserialize_proceed (GXmlSerializableDualKeyMap* self);
gboolean gxml_serializable_dual_key_map_deserialized (GXmlSerializableDualKeyMap* self);
static gboolean gxml_serializable_dual_key_map_real_deserialized (GXmlSerializableDualKeyMap* self);
gboolean gxml_serializable_dual_key_map_deserialize_node (GXmlSerializableDualKeyMap* self,
                                                          GXmlNode* node,
                                                          GError** error);
static gboolean gxml_serializable_dual_key_map_real_deserialize_node (GXmlSerializableDualKeyMap* self,
                                                               GXmlNode* node,
                                                               GError** error);
GType gxml_serializable_dual_key_map_get_value_type (GXmlSerializableDualKeyMap* self);
GType gxml_serializable_map_dual_key_get_type (void) G_GNUC_CONST;
GQuark gxml_serializable_error_quark (void);
GType gxml_element_get_type (void) G_GNUC_CONST;
gchar* gxml_node_get_name (GXmlNode* self);
gchar* gxml_serializable_node_name (GXmlSerializable* self);
gboolean gxml_serializable_collection_deserialize_children (GXmlSerializableCollection* self,
                                                            GError** error);
gboolean gxml_serializable_deserialize (GXmlSerializable* self,
                                        GXmlNode* node,
                                        GError** error);
void gxml_serializable_dual_key_map_set (GXmlSerializableDualKeyMap* self,
                                         gconstpointer primary_key,
                                         gconstpointer secundary_key,
                                         gconstpointer val);
gpointer gxml_serializable_map_dual_key_get_map_primary_key (GXmlSerializableMapDualKey* self);
gpointer gxml_serializable_map_dual_key_get_map_secondary_key (GXmlSerializableMapDualKey* self);
gboolean gxml_serializable_dual_key_map_deserialize_children (GXmlSerializableDualKeyMap* self,
                                                              GError** error);
static gboolean gxml_serializable_dual_key_map_real_deserialize_children (GXmlSerializableDualKeyMap* self,
                                                                   GError** error);
GeeBidirList* gxml_node_get_children_nodes (GXmlNode* self);
GeeCollection* gxml_serializable_dual_key_map_secondary_keys (GXmlSerializableDualKeyMap* self,
                                                              gconstpointer key);
static void gxml_serializable_dual_key_map_init (GXmlSerializableDualKeyMap* self);
GeeCollection* gxml_serializable_dual_key_map_values_for_key (GXmlSerializableDualKeyMap* self,
                                                              gconstpointer primary_key);
GeeCollection* gxml_serializable_dual_key_map_values (GXmlSerializableDualKeyMap* self);
gpointer gxml_serializable_dual_key_map_get (GXmlSerializableDualKeyMap* self,
                                             gconstpointer primary_key,
                                             gconstpointer secondary_key);
gboolean gxml_serializable_dual_key_map_set_default_namespace (GXmlSerializableDualKeyMap* self,
                                                               GXmlNode* node);
static gboolean gxml_serializable_dual_key_map_real_set_default_namespace (GXmlSerializableDualKeyMap* self,
                                                                    GXmlNode* node);
gboolean gxml_serializable_dual_key_map_get_enable_unknown_serializable_property (GXmlSerializableDualKeyMap* self);
static gboolean gxml_serializable_dual_key_map_real_get_enable_unknown_serializable_property (GXmlSerializableDualKeyMap* self);
gboolean gxml_serializable_dual_key_map_serialize_use_xml_node_value (GXmlSerializableDualKeyMap* self);
static gboolean gxml_serializable_dual_key_map_real_serialize_use_xml_node_value (GXmlSerializableDualKeyMap* self);
gboolean gxml_serializable_dual_key_map_property_use_nick (GXmlSerializableDualKeyMap* self);
static gboolean gxml_serializable_dual_key_map_real_property_use_nick (GXmlSerializableDualKeyMap* self);
gchar* gxml_serializable_dual_key_map_node_name (GXmlSerializableDualKeyMap* self);
static gchar* gxml_serializable_dual_key_map_real_node_name (GXmlSerializableDualKeyMap* self);
GParamSpec* gxml_serializable_dual_key_map_find_property_spec (GXmlSerializableDualKeyMap* self,
                                                               const gchar* property_name);
static GParamSpec* gxml_serializable_dual_key_map_real_find_property_spec (GXmlSerializableDualKeyMap* self,
                                                                    const gchar* property_name);
GParamSpec* gxml_serializable_default_find_property_spec (GXmlSerializable* self,
                                                          const gchar* property_name);
GParamSpec** gxml_serializable_dual_key_map_list_serializable_properties (GXmlSerializableDualKeyMap* self,
                                                                          gint* result_length1);
static GParamSpec** gxml_serializable_dual_key_map_real_list_serializable_properties (GXmlSerializableDualKeyMap* self,
                                                                               gint* result_length1);
GParamSpec** gxml_serializable_default_list_serializable_properties (GXmlSerializable* self,
                                                                     gint* result_length1);
GXmlNode* gxml_serializable_dual_key_map_serialize (GXmlSerializableDualKeyMap* self,
                                                    GXmlNode* node,
                                                    GError** error);
static GXmlNode* gxml_serializable_dual_key_map_real_serialize (GXmlSerializableDualKeyMap* self,
                                                         GXmlNode* node,
                                                         GError** error);
GXmlNode* gxml_serializable_dual_key_map_default_serialize (GXmlSerializableDualKeyMap* self,
                                                            GXmlNode* node,
                                                            GError** error);
GXmlNode* gxml_serializable_serialize (GXmlSerializable* self,
                                       GXmlNode* node,
                                       GError** error);
GXmlNode* gxml_serializable_dual_key_map_serialize_property (GXmlSerializableDualKeyMap* self,
                                                             GXmlNode* element,
                                                             GParamSpec* prop,
                                                             GError** error);
static GXmlNode* gxml_serializable_dual_key_map_real_serialize_property (GXmlSerializableDualKeyMap* self,
                                                                  GXmlNode* element,
                                                                  GParamSpec* prop,
                                                                  GError** error);
GXmlNode* gxml_serializable_dual_key_map_default_serialize_property (GXmlSerializableDualKeyMap* self,
                                                                     GXmlNode* element,
                                                                     GParamSpec* prop,
                                                                     GError** error);
gboolean gxml_serializable_dual_key_map_deserialize (GXmlSerializableDualKeyMap* self,
                                                     GXmlNode* node,
                                                     GError** error);
static gboolean gxml_serializable_dual_key_map_real_deserialize (GXmlSerializableDualKeyMap* self,
                                                          GXmlNode* node,
                                                          GError** error);
gboolean gxml_serializable_dual_key_map_default_deserialize (GXmlSerializableDualKeyMap* self,
                                                             GXmlNode* node,
                                                             GError** error);
gboolean gxml_serializable_dual_key_map_deserialize_property (GXmlSerializableDualKeyMap* self,
                                                              GXmlNode* property_node,
                                                              GError** error);
static gboolean gxml_serializable_dual_key_map_real_deserialize_property (GXmlSerializableDualKeyMap* self,
                                                                   GXmlNode* property_node,
                                                                   GError** error);
gboolean gxml_serializable_dual_key_map_default_deserialize_property (GXmlSerializableDualKeyMap* self,
                                                                      GXmlNode* property_node,
                                                                      GError** error);
static gboolean gxml_serializable_dual_key_map_real_foreach (GeeTraversable* base,
                                                      GeeForallFunc f,
                                                      gpointer f_target);
GXmlSerializableDualKeyMap* gxml_serializable_dual_key_map_new (GType p_type,
                                                                GBoxedCopyFunc p_dup_func,
                                                                GDestroyNotify p_destroy_func,
                                                                GType s_type,
                                                                GBoxedCopyFunc s_dup_func,
                                                                GDestroyNotify s_destroy_func,
                                                                GType v_type,
                                                                GBoxedCopyFunc v_dup_func,
                                                                GDestroyNotify v_destroy_func);
GXmlSerializableDualKeyMap* gxml_serializable_dual_key_map_construct (GType object_type,
                                                                      GType p_type,
                                                                      GBoxedCopyFunc p_dup_func,
                                                                      GDestroyNotify p_destroy_func,
                                                                      GType s_type,
                                                                      GBoxedCopyFunc s_dup_func,
                                                                      GDestroyNotify s_destroy_func,
                                                                      GType v_type,
                                                                      GBoxedCopyFunc v_dup_func,
                                                                      GDestroyNotify v_destroy_func);
GType gxml_serializable_dual_key_map_get_primary_key_type (GXmlSerializableDualKeyMap* self);
GType gxml_serializable_dual_key_map_get_secondary_key_type (GXmlSerializableDualKeyMap* self);
GeeCollection* gxml_serializable_dual_key_map_get_primary_keys (GXmlSerializableDualKeyMap* self);
gint gxml_serializable_dual_key_map_get_size (GXmlSerializableDualKeyMap* self);
GHashTable* gxml_serializable_dual_key_map_get_ignored_serializable_properties (GXmlSerializableDualKeyMap* self);
void gxml_serializable_dual_key_map_set_ignored_serializable_properties (GXmlSerializableDualKeyMap* self,
                                                                         GHashTable* value);
static GObject * gxml_serializable_dual_key_map_constructor (GType type,
                                                      guint n_construct_properties,
                                                      GObjectConstructParam * construct_properties);
void gxml_init_init (void);
static void gxml_serializable_dual_key_map_finalize (GObject * obj);
GeeMap* gxml_serializable_get_unknown_serializable_properties (GXmlSerializable* self);
GeeCollection* gxml_serializable_get_unknown_serializable_nodes (GXmlSerializable* self);
gchar* gxml_serializable_get_serialized_xml_node_value (GXmlSerializable* self);
static void _vala_gxml_serializable_dual_key_map_get_property (GObject * object,
                                                        guint property_id,
                                                        GValue * value,
                                                        GParamSpec * pspec);
void gxml_serializable_set_serialized_xml_node_value (GXmlSerializable* self,
                                                      const gchar* value);
static void _vala_gxml_serializable_dual_key_map_set_property (GObject * object,
                                                        guint property_id,
                                                        const GValue * value,
                                                        GParamSpec * pspec);

static inline gpointer
gxml_serializable_dual_key_map_get_instance_private (GXmlSerializableDualKeyMap* self)
{
	return G_STRUCT_MEMBER_P (self, GXmlSerializableDualKeyMap_private_offset);
}

static gboolean
gxml_serializable_dual_key_map_real_deserialize_proceed (GXmlSerializableDualKeyMap* self)
{
	gboolean result = FALSE;
	result = TRUE;
	return result;
}

gboolean
gxml_serializable_dual_key_map_deserialize_proceed (GXmlSerializableDualKeyMap* self)
{
	g_return_val_if_fail (self != NULL, FALSE);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->deserialize_proceed (self);
}

static gboolean
gxml_serializable_dual_key_map_real_deserialized (GXmlSerializableDualKeyMap* self)
{
	gboolean result = FALSE;
	result = self->_deserialized;
	return result;
}

gboolean
gxml_serializable_dual_key_map_deserialized (GXmlSerializableDualKeyMap* self)
{
	g_return_val_if_fail (self != NULL, FALSE);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->deserialized (self);
}

static gboolean
gxml_serializable_dual_key_map_real_deserialize_node (GXmlSerializableDualKeyMap* self,
                                                      GXmlNode* node,
                                                      GError** error)
{
	gboolean result = FALSE;
	gboolean _tmp0_ = FALSE;
	GType _tmp1_;
	GType _tmp2_;
	GError* _inner_error0_ = NULL;
	g_return_val_if_fail (node != NULL, FALSE);
	_tmp1_ = gxml_serializable_dual_key_map_get_value_type (self);
	_tmp2_ = _tmp1_;
	if (g_type_is_a (_tmp2_, GXML_TYPE_SERIALIZABLE)) {
		GType _tmp3_;
		GType _tmp4_;
		_tmp3_ = gxml_serializable_dual_key_map_get_value_type (self);
		_tmp4_ = _tmp3_;
		_tmp0_ = g_type_is_a (_tmp4_, GXML_TYPE_SERIALIZABLE_MAP_DUAL_KEY);
	} else {
		_tmp0_ = FALSE;
	}
	if (!_tmp0_) {
		const gchar* _tmp5_;
		GType _tmp6_;
		GType _tmp7_;
		const gchar* _tmp8_;
		GError* _tmp9_;
		gboolean _tmp10_ = FALSE;
		_tmp5_ = g_type_name (G_TYPE_FROM_INSTANCE ((GObject*) self));
		_tmp6_ = gxml_serializable_dual_key_map_get_value_type (self);
		_tmp7_ = _tmp6_;
		_tmp8_ = g_type_name (_tmp7_);
		_tmp9_ = g_error_new (GXML_SERIALIZABLE_ERROR, GXML_SERIALIZABLE_ERROR_UNSUPPORTED_TYPE_ERROR, _ ("%s: Value type '%s' is unsupported"), _tmp5_, _tmp8_);
		_inner_error0_ = _tmp9_;
		g_propagate_error (error, _inner_error0_);
		return _tmp10_;
	}
	if (G_TYPE_CHECK_INSTANCE_TYPE (node, GXML_TYPE_ELEMENT)) {
		GXmlSerializableMapDualKey* obj = NULL;
		GType _tmp11_;
		GType _tmp12_;
		GObject* _tmp13_;
		GObject* _tmp14_;
		gchar* _tmp15_;
		gchar* _tmp16_;
		gchar* _tmp17_;
		gchar* _tmp18_;
		gchar* _tmp19_;
		GXmlSerializableMapDualKey* _tmp20_;
		gchar* _tmp21_;
		gchar* _tmp22_;
		gchar* _tmp23_;
		gchar* _tmp24_;
		gboolean _tmp25_;
		_tmp11_ = gxml_serializable_dual_key_map_get_value_type (self);
		_tmp12_ = _tmp11_;
		_tmp13_ = g_object_new (_tmp12_, NULL);
		_tmp14_ = G_IS_INITIALLY_UNOWNED (_tmp13_) ? g_object_ref_sink (_tmp13_) : _tmp13_;
		obj = G_TYPE_CHECK_INSTANCE_CAST (_tmp14_, GXML_TYPE_SERIALIZABLE_MAP_DUAL_KEY, GXmlSerializableMapDualKey);
		_tmp15_ = gxml_node_get_name (node);
		_tmp16_ = _tmp15_;
		_tmp17_ = _tmp16_;
		_tmp18_ = g_utf8_strdown (_tmp17_, (gssize) -1);
		_tmp19_ = _tmp18_;
		_tmp20_ = obj;
		_tmp21_ = gxml_serializable_node_name (G_TYPE_CHECK_INSTANCE_CAST (_tmp20_, GXML_TYPE_SERIALIZABLE, GXmlSerializable));
		_tmp22_ = _tmp21_;
		_tmp23_ = g_utf8_strdown (_tmp22_, (gssize) -1);
		_tmp24_ = _tmp23_;
		_tmp25_ = g_strcmp0 (_tmp19_, _tmp24_) == 0;
		_g_free0 (_tmp24_);
		_g_free0 (_tmp22_);
		_g_free0 (_tmp19_);
		_g_free0 (_tmp17_);
		if (_tmp25_) {
			GXmlSerializableMapDualKey* _tmp26_;
			_tmp26_ = obj;
			if (G_TYPE_CHECK_INSTANCE_TYPE (_tmp26_, GXML_TYPE_SERIALIZABLE_COLLECTION)) {
				GXmlSerializableMapDualKey* _tmp27_;
				_tmp27_ = obj;
				gxml_serializable_collection_deserialize_children (G_TYPE_CHECK_INSTANCE_TYPE (_tmp27_, GXML_TYPE_SERIALIZABLE_COLLECTION) ? ((GXmlSerializableCollection*) _tmp27_) : NULL, &_inner_error0_);
				if (G_UNLIKELY (_inner_error0_ != NULL)) {
					gboolean _tmp28_ = FALSE;
					g_propagate_error (error, _inner_error0_);
					_g_object_unref0 (obj);
					return _tmp28_;
				}
			} else {
				GXmlSerializableMapDualKey* _tmp29_;
				GXmlSerializableMapDualKey* _tmp31_;
				gpointer _tmp32_;
				gpointer _tmp33_;
				GXmlSerializableMapDualKey* _tmp34_;
				gpointer _tmp35_;
				gpointer _tmp36_;
				GXmlSerializableMapDualKey* _tmp37_;
				_tmp29_ = obj;
				gxml_serializable_deserialize (G_TYPE_CHECK_INSTANCE_CAST (_tmp29_, GXML_TYPE_SERIALIZABLE, GXmlSerializable), node, &_inner_error0_);
				if (G_UNLIKELY (_inner_error0_ != NULL)) {
					gboolean _tmp30_ = FALSE;
					g_propagate_error (error, _inner_error0_);
					_g_object_unref0 (obj);
					return _tmp30_;
				}
				_tmp31_ = obj;
				_tmp32_ = gxml_serializable_map_dual_key_get_map_primary_key (_tmp31_);
				_tmp33_ = _tmp32_;
				_tmp34_ = obj;
				_tmp35_ = gxml_serializable_map_dual_key_get_map_secondary_key (_tmp34_);
				_tmp36_ = _tmp35_;
				_tmp37_ = obj;
				gxml_serializable_dual_key_map_set (self, _tmp33_, _tmp36_, _tmp37_);
				((_tmp36_ == NULL) || (self->priv->s_destroy_func == NULL)) ? NULL : (_tmp36_ = (self->priv->s_destroy_func (_tmp36_), NULL));
				((_tmp33_ == NULL) || (self->priv->p_destroy_func == NULL)) ? NULL : (_tmp33_ = (self->priv->p_destroy_func (_tmp33_), NULL));
			}
		}
		_g_object_unref0 (obj);
	}
	result = TRUE;
	return result;
}

gboolean
gxml_serializable_dual_key_map_deserialize_node (GXmlSerializableDualKeyMap* self,
                                                 GXmlNode* node,
                                                 GError** error)
{
	g_return_val_if_fail (self != NULL, FALSE);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->deserialize_node (self, node, error);
}

static gboolean
gxml_serializable_dual_key_map_real_deserialize_children (GXmlSerializableDualKeyMap* self,
                                                          GError** error)
{
	gboolean result = FALSE;
	GXmlNode* _tmp0_;
	gboolean _tmp1_ = FALSE;
	GType _tmp2_;
	GType _tmp3_;
	GError* _inner_error0_ = NULL;
	if (self->_deserialized) {
		result = FALSE;
		return result;
	}
	_tmp0_ = self->_node;
	if (_tmp0_ == NULL) {
		result = FALSE;
		return result;
	}
	_tmp2_ = gxml_serializable_dual_key_map_get_value_type (self);
	_tmp3_ = _tmp2_;
	if (g_type_is_a (_tmp3_, GXML_TYPE_SERIALIZABLE)) {
		GType _tmp4_;
		GType _tmp5_;
		_tmp4_ = gxml_serializable_dual_key_map_get_value_type (self);
		_tmp5_ = _tmp4_;
		_tmp1_ = g_type_is_a (_tmp5_, GXML_TYPE_SERIALIZABLE_MAP_DUAL_KEY);
	} else {
		_tmp1_ = FALSE;
	}
	if (!_tmp1_) {
		const gchar* _tmp6_;
		GType _tmp7_;
		GType _tmp8_;
		const gchar* _tmp9_;
		GError* _tmp10_;
		gboolean _tmp11_ = FALSE;
		_tmp6_ = g_type_name (G_TYPE_FROM_INSTANCE ((GObject*) self));
		_tmp7_ = gxml_serializable_dual_key_map_get_value_type (self);
		_tmp8_ = _tmp7_;
		_tmp9_ = g_type_name (_tmp8_);
		_tmp10_ = g_error_new (GXML_SERIALIZABLE_ERROR, GXML_SERIALIZABLE_ERROR_UNSUPPORTED_TYPE_ERROR, _ ("%s: Value type '%s' is unsupported"), _tmp6_, _tmp9_);
		_inner_error0_ = _tmp10_;
		g_propagate_error (error, _inner_error0_);
		return _tmp11_;
	}
	{
		GeeBidirList* _n_list = NULL;
		GXmlNode* _tmp12_;
		GeeBidirList* _tmp13_;
		GeeBidirList* _tmp14_;
		gint _n_size = 0;
		GeeBidirList* _tmp15_;
		gint _tmp16_;
		gint _tmp17_;
		gint _n_index = 0;
		_tmp12_ = self->_node;
		_tmp13_ = gxml_node_get_children_nodes (_tmp12_);
		_tmp14_ = _tmp13_;
		_n_list = _tmp14_;
		_tmp15_ = _n_list;
		_tmp16_ = gee_collection_get_size ((GeeCollection*) _tmp15_);
		_tmp17_ = _tmp16_;
		_n_size = _tmp17_;
		_n_index = -1;
		while (TRUE) {
			GXmlNode* n = NULL;
			GeeBidirList* _tmp18_;
			gpointer _tmp19_;
			GXmlNode* _tmp20_;
			_n_index = _n_index + 1;
			if (!(_n_index < _n_size)) {
				break;
			}
			_tmp18_ = _n_list;
			_tmp19_ = gee_list_get ((GeeList*) _tmp18_, _n_index);
			n = (GXmlNode*) _tmp19_;
			_tmp20_ = n;
			gxml_serializable_dual_key_map_deserialize_node (self, _tmp20_, &_inner_error0_);
			if (G_UNLIKELY (_inner_error0_ != NULL)) {
				gboolean _tmp21_ = FALSE;
				g_propagate_error (error, _inner_error0_);
				_g_object_unref0 (n);
				_g_object_unref0 (_n_list);
				return _tmp21_;
			}
			_g_object_unref0 (n);
		}
		_g_object_unref0 (_n_list);
	}
	self->_deserialized = TRUE;
	result = TRUE;
	return result;
}

gboolean
gxml_serializable_dual_key_map_deserialize_children (GXmlSerializableDualKeyMap* self,
                                                     GError** error)
{
	g_return_val_if_fail (self != NULL, FALSE);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->deserialize_children (self, error);
}

GeeCollection*
gxml_serializable_dual_key_map_secondary_keys (GXmlSerializableDualKeyMap* self,
                                               gconstpointer key)
{
	GeeCollection* result = NULL;
	GeeCollection* hs = NULL;
	GeeHashMultiMap* _tmp0_;
	GeeCollection* _tmp1_;
	GeeHashSet* s = NULL;
	GeeHashSet* _tmp2_;
	g_return_val_if_fail (self != NULL, NULL);
	gxml_serializable_dual_key_map_init (self);
	_tmp0_ = self->storage;
	_tmp1_ = gee_multi_map_get ((GeeMultiMap*) _tmp0_, key);
	hs = _tmp1_;
	_tmp2_ = gee_hash_set_new (self->priv->s_type, (GBoxedCopyFunc) self->priv->s_dup_func, (GDestroyNotify) self->priv->s_destroy_func, NULL, NULL, NULL, NULL, NULL, NULL);
	s = _tmp2_;
	{
		GeeIterator* _hm_it = NULL;
		GeeCollection* _tmp3_;
		GeeIterator* _tmp4_;
		_tmp3_ = hs;
		_tmp4_ = gee_iterable_iterator ((GeeIterable*) _tmp3_);
		_hm_it = _tmp4_;
		while (TRUE) {
			GeeIterator* _tmp5_;
			GeeHashMap* hm = NULL;
			GeeIterator* _tmp6_;
			gpointer _tmp7_;
			GeeHashSet* _tmp8_;
			GeeHashMap* _tmp9_;
			GeeSet* _tmp10_;
			GeeSet* _tmp11_;
			GeeSet* _tmp12_;
			_tmp5_ = _hm_it;
			if (!gee_iterator_next (_tmp5_)) {
				break;
			}
			_tmp6_ = _hm_it;
			_tmp7_ = gee_iterator_get (_tmp6_);
			hm = (GeeHashMap*) _tmp7_;
			_tmp8_ = s;
			_tmp9_ = hm;
			_tmp10_ = gee_abstract_map_get_keys ((GeeAbstractMap*) _tmp9_);
			_tmp11_ = _tmp10_;
			_tmp12_ = _tmp11_;
			gee_collection_add_all ((GeeCollection*) _tmp8_, (GeeCollection*) _tmp12_);
			_g_object_unref0 (_tmp12_);
			_g_object_unref0 (hm);
		}
		_g_object_unref0 (_hm_it);
	}
	result = (GeeCollection*) s;
	_g_object_unref0 (hs);
	return result;
}

GeeCollection*
gxml_serializable_dual_key_map_values_for_key (GXmlSerializableDualKeyMap* self,
                                               gconstpointer primary_key)
{
	GeeCollection* result = NULL;
	GeeCollection* hs = NULL;
	GeeHashMultiMap* _tmp0_;
	GeeCollection* _tmp1_;
	GeeHashSet* s = NULL;
	GeeHashSet* _tmp2_;
	g_return_val_if_fail (self != NULL, NULL);
	gxml_serializable_dual_key_map_init (self);
	_tmp0_ = self->storage;
	_tmp1_ = gee_multi_map_get ((GeeMultiMap*) _tmp0_, primary_key);
	hs = _tmp1_;
	_tmp2_ = gee_hash_set_new (self->priv->v_type, (GBoxedCopyFunc) self->priv->v_dup_func, (GDestroyNotify) self->priv->v_destroy_func, NULL, NULL, NULL, NULL, NULL, NULL);
	s = _tmp2_;
	{
		GeeIterator* _hm_it = NULL;
		GeeCollection* _tmp3_;
		GeeIterator* _tmp4_;
		_tmp3_ = hs;
		_tmp4_ = gee_iterable_iterator ((GeeIterable*) _tmp3_);
		_hm_it = _tmp4_;
		while (TRUE) {
			GeeIterator* _tmp5_;
			GeeHashMap* hm = NULL;
			GeeIterator* _tmp6_;
			gpointer _tmp7_;
			GeeHashSet* _tmp8_;
			GeeHashMap* _tmp9_;
			GeeCollection* _tmp10_;
			GeeCollection* _tmp11_;
			GeeCollection* _tmp12_;
			_tmp5_ = _hm_it;
			if (!gee_iterator_next (_tmp5_)) {
				break;
			}
			_tmp6_ = _hm_it;
			_tmp7_ = gee_iterator_get (_tmp6_);
			hm = (GeeHashMap*) _tmp7_;
			_tmp8_ = s;
			_tmp9_ = hm;
			_tmp10_ = gee_abstract_map_get_values ((GeeAbstractMap*) _tmp9_);
			_tmp11_ = _tmp10_;
			_tmp12_ = _tmp11_;
			gee_collection_add_all ((GeeCollection*) _tmp8_, _tmp12_);
			_g_object_unref0 (_tmp12_);
			_g_object_unref0 (hm);
		}
		_g_object_unref0 (_hm_it);
	}
	result = (GeeCollection*) s;
	_g_object_unref0 (hs);
	return result;
}

GeeCollection*
gxml_serializable_dual_key_map_values (GXmlSerializableDualKeyMap* self)
{
	GeeCollection* result = NULL;
	GeeHashSet* s = NULL;
	GeeHashSet* _tmp0_;
	g_return_val_if_fail (self != NULL, NULL);
	gxml_serializable_dual_key_map_init (self);
	_tmp0_ = gee_hash_set_new (self->priv->v_type, (GBoxedCopyFunc) self->priv->v_dup_func, (GDestroyNotify) self->priv->v_destroy_func, NULL, NULL, NULL, NULL, NULL, NULL);
	s = _tmp0_;
	{
		GeeIterator* _h_it = NULL;
		GeeHashMultiMap* _tmp1_;
		GeeCollection* _tmp2_;
		GeeCollection* _tmp3_;
		GeeIterator* _tmp4_;
		GeeIterator* _tmp5_;
		_tmp1_ = self->storage;
		_tmp2_ = gee_multi_map_get_values ((GeeMultiMap*) _tmp1_);
		_tmp3_ = _tmp2_;
		_tmp4_ = gee_iterable_iterator ((GeeIterable*) _tmp3_);
		_tmp5_ = _tmp4_;
		_g_object_unref0 (_tmp3_);
		_h_it = _tmp5_;
		while (TRUE) {
			GeeIterator* _tmp6_;
			GeeHashMap* h = NULL;
			GeeIterator* _tmp7_;
			gpointer _tmp8_;
			GeeHashSet* _tmp9_;
			GeeHashMap* _tmp10_;
			GeeCollection* _tmp11_;
			GeeCollection* _tmp12_;
			GeeCollection* _tmp13_;
			_tmp6_ = _h_it;
			if (!gee_iterator_next (_tmp6_)) {
				break;
			}
			_tmp7_ = _h_it;
			_tmp8_ = gee_iterator_get (_tmp7_);
			h = (GeeHashMap*) _tmp8_;
			_tmp9_ = s;
			_tmp10_ = h;
			_tmp11_ = gee_abstract_map_get_values ((GeeAbstractMap*) _tmp10_);
			_tmp12_ = _tmp11_;
			_tmp13_ = _tmp12_;
			gee_collection_add_all ((GeeCollection*) _tmp9_, _tmp13_);
			_g_object_unref0 (_tmp13_);
			_g_object_unref0 (h);
		}
		_g_object_unref0 (_h_it);
	}
	result = (GeeCollection*) s;
	return result;
}

void
gxml_serializable_dual_key_map_set (GXmlSerializableDualKeyMap* self,
                                    gconstpointer primary_key,
                                    gconstpointer secundary_key,
                                    gconstpointer val)
{
	GeeHashMap* h = NULL;
	GeeHashMap* _tmp0_;
	GeeHashMultiMap* _tmp1_;
	g_return_if_fail (self != NULL);
	gxml_serializable_dual_key_map_init (self);
	_tmp0_ = gee_hash_map_new (self->priv->s_type, (GBoxedCopyFunc) self->priv->s_dup_func, (GDestroyNotify) self->priv->s_destroy_func, self->priv->v_type, (GBoxedCopyFunc) self->priv->v_dup_func, (GDestroyNotify) self->priv->v_destroy_func, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
	h = _tmp0_;
	gee_abstract_map_set ((GeeAbstractMap*) h, secundary_key, val);
	_tmp1_ = self->storage;
	gee_multi_map_set ((GeeMultiMap*) _tmp1_, primary_key, h);
	_g_object_unref0 (h);
}

gpointer
gxml_serializable_dual_key_map_get (GXmlSerializableDualKeyMap* self,
                                    gconstpointer primary_key,
                                    gconstpointer secondary_key)
{
	gpointer result = NULL;
	GeeCollection* hs = NULL;
	GeeHashMultiMap* _tmp0_;
	GeeCollection* _tmp1_;
	g_return_val_if_fail (self != NULL, NULL);
	gxml_serializable_dual_key_map_init (self);
	_tmp0_ = self->storage;
	_tmp1_ = gee_multi_map_get ((GeeMultiMap*) _tmp0_, primary_key);
	hs = _tmp1_;
	{
		GeeIterator* _h_it = NULL;
		GeeCollection* _tmp2_;
		GeeIterator* _tmp3_;
		_tmp2_ = hs;
		_tmp3_ = gee_iterable_iterator ((GeeIterable*) _tmp2_);
		_h_it = _tmp3_;
		while (TRUE) {
			GeeIterator* _tmp4_;
			GeeHashMap* h = NULL;
			GeeIterator* _tmp5_;
			gpointer _tmp6_;
			GeeHashMap* _tmp7_;
			_tmp4_ = _h_it;
			if (!gee_iterator_next (_tmp4_)) {
				break;
			}
			_tmp5_ = _h_it;
			_tmp6_ = gee_iterator_get (_tmp5_);
			h = (GeeHashMap*) _tmp6_;
			_tmp7_ = h;
			if (gee_abstract_map_has_key ((GeeAbstractMap*) _tmp7_, secondary_key)) {
				GeeHashMap* _tmp8_;
				gpointer _tmp9_;
				_tmp8_ = h;
				_tmp9_ = gee_abstract_map_get ((GeeAbstractMap*) _tmp8_, secondary_key);
				result = _tmp9_;
				_g_object_unref0 (h);
				_g_object_unref0 (_h_it);
				_g_object_unref0 (hs);
				return result;
			}
			_g_object_unref0 (h);
		}
		_g_object_unref0 (_h_it);
	}
	result = NULL;
	_g_object_unref0 (hs);
	return result;
}

static void
gxml_serializable_dual_key_map_init (GXmlSerializableDualKeyMap* self)
{
	GeeHashMultiMap* _tmp0_;
	g_return_if_fail (self != NULL);
	_tmp0_ = self->storage;
	if (_tmp0_ == NULL) {
		GeeHashMultiMap* _tmp1_;
		_tmp1_ = gee_hash_multi_map_new (self->priv->p_type, (GBoxedCopyFunc) self->priv->p_dup_func, (GDestroyNotify) self->priv->p_destroy_func, GEE_TYPE_HASH_MAP, (GBoxedCopyFunc) g_object_ref, (GDestroyNotify) g_object_unref, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
		_g_object_unref0 (self->storage);
		self->storage = _tmp1_;
	}
}

static gboolean
gxml_serializable_dual_key_map_real_set_default_namespace (GXmlSerializableDualKeyMap* self,
                                                           GXmlNode* node)
{
	gboolean result = FALSE;
	g_return_val_if_fail (node != NULL, FALSE);
	result = TRUE;
	return result;
}

gboolean
gxml_serializable_dual_key_map_set_default_namespace (GXmlSerializableDualKeyMap* self,
                                                      GXmlNode* node)
{
	g_return_val_if_fail (self != NULL, FALSE);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->set_default_namespace (self, node);
}

static gboolean
gxml_serializable_dual_key_map_real_get_enable_unknown_serializable_property (GXmlSerializableDualKeyMap* self)
{
	gboolean result = FALSE;
	result = FALSE;
	return result;
}

gboolean
gxml_serializable_dual_key_map_get_enable_unknown_serializable_property (GXmlSerializableDualKeyMap* self)
{
	g_return_val_if_fail (self != NULL, FALSE);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->get_enable_unknown_serializable_property (self);
}

static gboolean
gxml_serializable_dual_key_map_real_serialize_use_xml_node_value (GXmlSerializableDualKeyMap* self)
{
	gboolean result = FALSE;
	result = FALSE;
	return result;
}

gboolean
gxml_serializable_dual_key_map_serialize_use_xml_node_value (GXmlSerializableDualKeyMap* self)
{
	g_return_val_if_fail (self != NULL, FALSE);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->serialize_use_xml_node_value (self);
}

static gboolean
gxml_serializable_dual_key_map_real_property_use_nick (GXmlSerializableDualKeyMap* self)
{
	gboolean result = FALSE;
	result = FALSE;
	return result;
}

gboolean
gxml_serializable_dual_key_map_property_use_nick (GXmlSerializableDualKeyMap* self)
{
	g_return_val_if_fail (self != NULL, FALSE);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->property_use_nick (self);
}

static gchar*
gxml_serializable_dual_key_map_real_node_name (GXmlSerializableDualKeyMap* self)
{
	gchar* result = NULL;
	GType _tmp0_;
	GType _tmp1_;
	GObject* _tmp2_;
	GObject* _tmp3_;
	GXmlSerializable* _tmp4_;
	gchar* _tmp5_;
	gchar* _tmp6_;
	_tmp0_ = gxml_serializable_dual_key_map_get_value_type (self);
	_tmp1_ = _tmp0_;
	_tmp2_ = g_object_new (_tmp1_, NULL);
	_tmp3_ = G_IS_INITIALLY_UNOWNED (_tmp2_) ? g_object_ref_sink (_tmp2_) : _tmp2_;
	_tmp4_ = G_TYPE_CHECK_INSTANCE_CAST (_tmp3_, GXML_TYPE_SERIALIZABLE, GXmlSerializable);
	_tmp5_ = gxml_serializable_node_name (_tmp4_);
	_tmp6_ = _tmp5_;
	_g_object_unref0 (_tmp4_);
	result = _tmp6_;
	return result;
}

gchar*
gxml_serializable_dual_key_map_node_name (GXmlSerializableDualKeyMap* self)
{
	g_return_val_if_fail (self != NULL, NULL);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->node_name (self);
}

static GParamSpec*
gxml_serializable_dual_key_map_real_find_property_spec (GXmlSerializableDualKeyMap* self,
                                                        const gchar* property_name)
{
	GParamSpec* result = NULL;
	GParamSpec* _tmp0_;
	g_return_val_if_fail (property_name != NULL, NULL);
	_tmp0_ = gxml_serializable_default_find_property_spec ((GXmlSerializable*) self, property_name);
	result = _tmp0_;
	return result;
}

GParamSpec*
gxml_serializable_dual_key_map_find_property_spec (GXmlSerializableDualKeyMap* self,
                                                   const gchar* property_name)
{
	g_return_val_if_fail (self != NULL, NULL);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->find_property_spec (self, property_name);
}

static GParamSpec**
gxml_serializable_dual_key_map_real_list_serializable_properties (GXmlSerializableDualKeyMap* self,
                                                                  gint* result_length1)
{
	GParamSpec** result = NULL;
	gint _tmp0_ = 0;
	GParamSpec** _tmp1_;
	GParamSpec** _tmp2_;
	gint _tmp2__length1;
	_tmp1_ = gxml_serializable_default_list_serializable_properties ((GXmlSerializable*) self, &_tmp0_);
	_tmp2_ = _tmp1_;
	_tmp2__length1 = _tmp0_;
	if (result_length1) {
		*result_length1 = _tmp2__length1;
	}
	result = _tmp2_;
	return result;
}

GParamSpec**
gxml_serializable_dual_key_map_list_serializable_properties (GXmlSerializableDualKeyMap* self,
                                                             gint* result_length1)
{
	g_return_val_if_fail (self != NULL, NULL);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->list_serializable_properties (self, result_length1);
}

static GXmlNode*
gxml_serializable_dual_key_map_real_serialize (GXmlSerializableDualKeyMap* self,
                                               GXmlNode* node,
                                               GError** error)
{
	GXmlNode* result = NULL;
	GXmlNode* _tmp0_ = NULL;
	GXmlNode* _tmp1_;
	GXmlNode* _tmp2_;
	GError* _inner_error0_ = NULL;
	g_return_val_if_fail (node != NULL, NULL);
	_vala_return_val_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (node, GXML_TYPE_ELEMENT), "node is GXml.Element", NULL);
	_tmp1_ = gxml_serializable_dual_key_map_default_serialize (self, node, &_inner_error0_);
	_tmp0_ = _tmp1_;
	if (G_UNLIKELY (_inner_error0_ != NULL)) {
		g_propagate_error (error, _inner_error0_);
		return NULL;
	}
	_tmp2_ = _tmp0_;
	_tmp0_ = NULL;
	result = _tmp2_;
	_g_object_unref0 (_tmp0_);
	return result;
}

GXmlNode*
gxml_serializable_dual_key_map_serialize (GXmlSerializableDualKeyMap* self,
                                          GXmlNode* node,
                                          GError** error)
{
	g_return_val_if_fail (self != NULL, NULL);
	_vala_return_val_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (node, GXML_TYPE_ELEMENT), "node is GXml.Element", NULL);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->serialize (self, node, error);
}

static gpointer
_g_object_ref0 (gpointer self)
{
	return self ? g_object_ref (self) : NULL;
}

GXmlNode*
gxml_serializable_dual_key_map_default_serialize (GXmlSerializableDualKeyMap* self,
                                                  GXmlNode* node,
                                                  GError** error)
{
	GXmlNode* result = NULL;
	GXmlNode* _tmp11_;
	GError* _inner_error0_ = NULL;
	g_return_val_if_fail (self != NULL, NULL);
	g_return_val_if_fail (node != NULL, NULL);
	_vala_return_val_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (node, GXML_TYPE_ELEMENT), "node is GXml.Element", NULL);
	{
		GeeIterator* _v_it = NULL;
		GeeCollection* _tmp0_;
		GeeCollection* _tmp1_;
		GeeIterator* _tmp2_;
		GeeIterator* _tmp3_;
		_tmp0_ = gxml_serializable_dual_key_map_values (self);
		_tmp1_ = _tmp0_;
		_tmp2_ = gee_iterable_iterator ((GeeIterable*) _tmp1_);
		_tmp3_ = _tmp2_;
		_g_object_unref0 (_tmp1_);
		_v_it = _tmp3_;
		while (TRUE) {
			GeeIterator* _tmp4_;
			gpointer v = NULL;
			GeeIterator* _tmp5_;
			gpointer _tmp6_;
			gconstpointer _tmp7_;
			_tmp4_ = _v_it;
			if (!gee_iterator_next (_tmp4_)) {
				break;
			}
			_tmp5_ = _v_it;
			_tmp6_ = gee_iterator_get (_tmp5_);
			v = _tmp6_;
			_tmp7_ = v;
			if (G_TYPE_CHECK_INSTANCE_TYPE (_tmp7_, GXML_TYPE_SERIALIZABLE)) {
				gconstpointer _tmp8_;
				GXmlNode* _tmp9_;
				GXmlNode* _tmp10_;
				_tmp8_ = v;
				_tmp9_ = gxml_serializable_serialize (G_TYPE_CHECK_INSTANCE_CAST (_tmp8_, GXML_TYPE_SERIALIZABLE, GXmlSerializable), node, &_inner_error0_);
				_tmp10_ = _tmp9_;
				_g_object_unref0 (_tmp10_);
				if (G_UNLIKELY (_inner_error0_ != NULL)) {
					g_propagate_error (error, _inner_error0_);
					((v == NULL) || (self->priv->v_destroy_func == NULL)) ? NULL : (v = (self->priv->v_destroy_func (v), NULL));
					_g_object_unref0 (_v_it);
					return NULL;
				}
			}
			((v == NULL) || (self->priv->v_destroy_func == NULL)) ? NULL : (v = (self->priv->v_destroy_func (v), NULL));
		}
		_g_object_unref0 (_v_it);
	}
	_tmp11_ = _g_object_ref0 (node);
	result = _tmp11_;
	return result;
}

static GXmlNode*
gxml_serializable_dual_key_map_real_serialize_property (GXmlSerializableDualKeyMap* self,
                                                        GXmlNode* element,
                                                        GParamSpec* prop,
                                                        GError** error)
{
	GXmlNode* result = NULL;
	GXmlNode* _tmp0_ = NULL;
	GXmlNode* _tmp1_;
	GXmlNode* _tmp2_;
	GError* _inner_error0_ = NULL;
	g_return_val_if_fail (element != NULL, NULL);
	g_return_val_if_fail (prop != NULL, NULL);
	_tmp1_ = gxml_serializable_dual_key_map_default_serialize_property (self, element, prop, &_inner_error0_);
	_tmp0_ = _tmp1_;
	if (G_UNLIKELY (_inner_error0_ != NULL)) {
		g_propagate_error (error, _inner_error0_);
		return NULL;
	}
	_tmp2_ = _tmp0_;
	_tmp0_ = NULL;
	result = _tmp2_;
	_g_object_unref0 (_tmp0_);
	return result;
}

GXmlNode*
gxml_serializable_dual_key_map_serialize_property (GXmlSerializableDualKeyMap* self,
                                                   GXmlNode* element,
                                                   GParamSpec* prop,
                                                   GError** error)
{
	g_return_val_if_fail (self != NULL, NULL);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->serialize_property (self, element, prop, error);
}

GXmlNode*
gxml_serializable_dual_key_map_default_serialize_property (GXmlSerializableDualKeyMap* self,
                                                           GXmlNode* element,
                                                           GParamSpec* prop,
                                                           GError** error)
{
	GXmlNode* result = NULL;
	GXmlNode* _tmp0_;
	g_return_val_if_fail (self != NULL, NULL);
	g_return_val_if_fail (element != NULL, NULL);
	g_return_val_if_fail (prop != NULL, NULL);
	_tmp0_ = _g_object_ref0 (element);
	result = _tmp0_;
	return result;
}

static gboolean
gxml_serializable_dual_key_map_real_deserialize (GXmlSerializableDualKeyMap* self,
                                                 GXmlNode* node,
                                                 GError** error)
{
	gboolean result = FALSE;
	gchar* _tmp0_;
	gchar* _tmp1_;
	gboolean _tmp2_ = FALSE;
	gboolean _tmp3_;
	GError* _inner_error0_ = NULL;
	g_return_val_if_fail (node != NULL, FALSE);
	_tmp0_ = gxml_serializable_dual_key_map_node_name (self);
	_tmp1_ = _tmp0_;
	_vala_return_val_if_fail (_tmp1_ != NULL, "node_name () != null", FALSE);
	_tmp3_ = gxml_serializable_dual_key_map_default_deserialize (self, node, &_inner_error0_);
	_g_free0 (_tmp1_);
	_tmp2_ = _tmp3_;
	if (G_UNLIKELY (_inner_error0_ != NULL)) {
		gboolean _tmp4_ = FALSE;
		g_propagate_error (error, _inner_error0_);
		return _tmp4_;
	}
	result = _tmp2_;
	return result;
}

gboolean
gxml_serializable_dual_key_map_deserialize (GXmlSerializableDualKeyMap* self,
                                            GXmlNode* node,
                                            GError** error)
{
	gchar* _tmp0_;
	gchar* _tmp1_;
	g_return_val_if_fail (self != NULL, FALSE);
	_tmp0_ = gxml_serializable_dual_key_map_node_name (self);
	_tmp1_ = _tmp0_;
	_vala_return_val_if_fail (_tmp1_ != NULL, "node_name () != null", FALSE);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->deserialize (self, node, error);
}

gboolean
gxml_serializable_dual_key_map_default_deserialize (GXmlSerializableDualKeyMap* self,
                                                    GXmlNode* node,
                                                    GError** error)
{
	gboolean result = FALSE;
	GXmlNode* _tmp0_;
	GError* _inner_error0_ = NULL;
	g_return_val_if_fail (self != NULL, FALSE);
	g_return_val_if_fail (node != NULL, FALSE);
	_vala_return_val_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (node, GXML_TYPE_ELEMENT), "node is Element", FALSE);
	_tmp0_ = _g_object_ref0 (node);
	_g_object_unref0 (self->_node);
	self->_node = _tmp0_;
	self->_deserialized = FALSE;
	if (gxml_serializable_dual_key_map_deserialize_proceed (self)) {
		gboolean _tmp1_ = FALSE;
		_tmp1_ = gxml_serializable_dual_key_map_deserialize_children (self, &_inner_error0_);
		if (G_UNLIKELY (_inner_error0_ != NULL)) {
			gboolean _tmp2_ = FALSE;
			g_propagate_error (error, _inner_error0_);
			return _tmp2_;
		}
		result = _tmp1_;
		return result;
	}
	result = FALSE;
	return result;
}

static gboolean
gxml_serializable_dual_key_map_real_deserialize_property (GXmlSerializableDualKeyMap* self,
                                                          GXmlNode* property_node,
                                                          GError** error)
{
	gboolean result = FALSE;
	gboolean _tmp0_ = FALSE;
	GError* _inner_error0_ = NULL;
	g_return_val_if_fail (property_node != NULL, FALSE);
	_tmp0_ = gxml_serializable_dual_key_map_default_deserialize_property (self, property_node, &_inner_error0_);
	if (G_UNLIKELY (_inner_error0_ != NULL)) {
		gboolean _tmp1_ = FALSE;
		g_propagate_error (error, _inner_error0_);
		return _tmp1_;
	}
	result = _tmp0_;
	return result;
}

gboolean
gxml_serializable_dual_key_map_deserialize_property (GXmlSerializableDualKeyMap* self,
                                                     GXmlNode* property_node,
                                                     GError** error)
{
	g_return_val_if_fail (self != NULL, FALSE);
	return GXML_SERIALIZABLE_DUAL_KEY_MAP_GET_CLASS (self)->deserialize_property (self, property_node, error);
}

gboolean
gxml_serializable_dual_key_map_default_deserialize_property (GXmlSerializableDualKeyMap* self,
                                                             GXmlNode* property_node,
                                                             GError** error)
{
	gboolean result = FALSE;
	gboolean _tmp0_ = FALSE;
	GError* _inner_error0_ = NULL;
	g_return_val_if_fail (self != NULL, FALSE);
	g_return_val_if_fail (property_node != NULL, FALSE);
	_tmp0_ = gxml_serializable_dual_key_map_deserialize_node (self, property_node, &_inner_error0_);
	if (G_UNLIKELY (_inner_error0_ != NULL)) {
		gboolean _tmp1_ = FALSE;
		g_propagate_error (error, _inner_error0_);
		return _tmp1_;
	}
	result = _tmp0_;
	return result;
}

static gboolean
gxml_serializable_dual_key_map_real_foreach (GeeTraversable* base,
                                             GeeForallFunc f,
                                             gpointer f_target)
{
	GXmlSerializableDualKeyMap * self;
	gboolean result = FALSE;
	GeeCollection* _tmp0_;
	GeeCollection* _tmp1_;
	gboolean _tmp2_;
	self = (GXmlSerializableDualKeyMap*) base;
	_tmp0_ = gxml_serializable_dual_key_map_values (self);
	_tmp1_ = _tmp0_;
	_tmp2_ = gee_traversable_foreach ((GeeTraversable*) _tmp1_, f, f_target);
	_g_object_unref0 (_tmp1_);
	result = _tmp2_;
	return result;
}

GXmlSerializableDualKeyMap*
gxml_serializable_dual_key_map_construct (GType object_type,
                                          GType p_type,
                                          GBoxedCopyFunc p_dup_func,
                                          GDestroyNotify p_destroy_func,
                                          GType s_type,
                                          GBoxedCopyFunc s_dup_func,
                                          GDestroyNotify s_destroy_func,
                                          GType v_type,
                                          GBoxedCopyFunc v_dup_func,
                                          GDestroyNotify v_destroy_func)
{
	GXmlSerializableDualKeyMap * self = NULL;
	self = (GXmlSerializableDualKeyMap*) g_object_new (object_type, NULL);
	self->priv->p_type = p_type;
	self->priv->p_dup_func = p_dup_func;
	self->priv->p_destroy_func = p_destroy_func;
	self->priv->s_type = s_type;
	self->priv->s_dup_func = s_dup_func;
	self->priv->s_destroy_func = s_destroy_func;
	self->priv->v_type = v_type;
	self->priv->v_dup_func = v_dup_func;
	self->priv->v_destroy_func = v_destroy_func;
	return self;
}

GXmlSerializableDualKeyMap*
gxml_serializable_dual_key_map_new (GType p_type,
                                    GBoxedCopyFunc p_dup_func,
                                    GDestroyNotify p_destroy_func,
                                    GType s_type,
                                    GBoxedCopyFunc s_dup_func,
                                    GDestroyNotify s_destroy_func,
                                    GType v_type,
                                    GBoxedCopyFunc v_dup_func,
                                    GDestroyNotify v_destroy_func)
{
	return gxml_serializable_dual_key_map_construct (GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP, p_type, p_dup_func, p_destroy_func, s_type, s_dup_func, s_destroy_func, v_type, v_dup_func, v_destroy_func);
}

GType
gxml_serializable_dual_key_map_get_value_type (GXmlSerializableDualKeyMap* self)
{
	GType result;
	g_return_val_if_fail (self != NULL, 0UL);
	gxml_serializable_dual_key_map_init (self);
	result = self->priv->v_type;
	return result;
}

GType
gxml_serializable_dual_key_map_get_primary_key_type (GXmlSerializableDualKeyMap* self)
{
	GType result;
	g_return_val_if_fail (self != NULL, 0UL);
	gxml_serializable_dual_key_map_init (self);
	result = self->priv->p_type;
	return result;
}

GType
gxml_serializable_dual_key_map_get_secondary_key_type (GXmlSerializableDualKeyMap* self)
{
	GType result;
	g_return_val_if_fail (self != NULL, 0UL);
	gxml_serializable_dual_key_map_init (self);
	result = self->priv->s_type;
	return result;
}

GeeCollection*
gxml_serializable_dual_key_map_get_primary_keys (GXmlSerializableDualKeyMap* self)
{
	GeeCollection* result;
	GeeHashMultiMap* _tmp0_;
	GeeSet* _tmp1_;
	g_return_val_if_fail (self != NULL, NULL);
	gxml_serializable_dual_key_map_init (self);
	_tmp0_ = self->storage;
	_tmp1_ = gee_multi_map_get_keys ((GeeMultiMap*) _tmp0_);
	result = (GeeCollection*) _tmp1_;
	return result;
}

gint
gxml_serializable_dual_key_map_get_size (GXmlSerializableDualKeyMap* self)
{
	gint result;
	GeeHashMultiMap* _tmp0_;
	gint _tmp1_;
	gint _tmp2_;
	g_return_val_if_fail (self != NULL, 0);
	_tmp0_ = self->storage;
	_tmp1_ = gee_multi_map_get_size ((GeeMultiMap*) _tmp0_);
	_tmp2_ = _tmp1_;
	result = _tmp2_;
	return result;
}

static GeeMap*
gxml_serializable_dual_key_map_real_get_unknown_serializable_properties (GXmlSerializable* base)
{
	GeeMap* result;
	GXmlSerializableDualKeyMap* self;
	GeeHashMap* _tmp0_;
	self = (GXmlSerializableDualKeyMap*) base;
	_tmp0_ = gee_hash_map_new (G_TYPE_STRING, (GBoxedCopyFunc) g_strdup, (GDestroyNotify) g_free, GXML_TYPE_ATTRIBUTE, (GBoxedCopyFunc) g_object_ref, (GDestroyNotify) g_object_unref, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
	result = (GeeMap*) _tmp0_;
	return result;
}

static GeeCollection*
gxml_serializable_dual_key_map_real_get_unknown_serializable_nodes (GXmlSerializable* base)
{
	GeeCollection* result;
	GXmlSerializableDualKeyMap* self;
	GeeArrayList* _tmp0_;
	self = (GXmlSerializableDualKeyMap*) base;
	_tmp0_ = gee_array_list_new (GXML_TYPE_NODE, (GBoxedCopyFunc) g_object_ref, (GDestroyNotify) g_object_unref, NULL, NULL, NULL);
	result = (GeeCollection*) _tmp0_;
	return result;
}

GHashTable*
gxml_serializable_dual_key_map_get_ignored_serializable_properties (GXmlSerializableDualKeyMap* self)
{
	GHashTable* result;
	GHashTable* _tmp0_;
	g_return_val_if_fail (self != NULL, NULL);
	_tmp0_ = self->priv->_ignored_serializable_properties;
	result = _tmp0_;
	return result;
}

static gpointer
_g_hash_table_ref0 (gpointer self)
{
	return self ? g_hash_table_ref (self) : NULL;
}

void
gxml_serializable_dual_key_map_set_ignored_serializable_properties (GXmlSerializableDualKeyMap* self,
                                                                    GHashTable* value)
{
	g_return_if_fail (self != NULL);
	if (gxml_serializable_dual_key_map_get_ignored_serializable_properties (self) != value) {
		GHashTable* _tmp0_;
		_tmp0_ = _g_hash_table_ref0 (value);
		_g_hash_table_unref0 (self->priv->_ignored_serializable_properties);
		self->priv->_ignored_serializable_properties = _tmp0_;
		g_object_notify_by_pspec ((GObject *) self, gxml_serializable_dual_key_map_properties[GXML_SERIALIZABLE_DUAL_KEY_MAP_IGNORED_SERIALIZABLE_PROPERTIES_PROPERTY]);
	}
}

static gchar*
gxml_serializable_dual_key_map_real_get_serialized_xml_node_value (GXmlSerializable* base)
{
	gchar* result;
	GXmlSerializableDualKeyMap* self;
	const gchar* _tmp0_;
	gchar* _tmp1_;
	self = (GXmlSerializableDualKeyMap*) base;
	_tmp0_ = self->priv->_serialized_xml_node_value;
	_tmp1_ = g_strdup (_tmp0_);
	result = _tmp1_;
	return result;
}

static void
gxml_serializable_dual_key_map_real_set_serialized_xml_node_value (GXmlSerializable* base,
                                                                   const gchar* value)
{
	GXmlSerializableDualKeyMap* self;
	self = (GXmlSerializableDualKeyMap*) base;
	if (g_strcmp0 (value, gxml_serializable_dual_key_map_real_get_serialized_xml_node_value (base)) != 0) {
		gchar* _tmp0_;
		_tmp0_ = g_strdup (value);
		_g_free0 (self->priv->_serialized_xml_node_value);
		self->priv->_serialized_xml_node_value = _tmp0_;
		g_object_notify_by_pspec ((GObject *) self, gxml_serializable_dual_key_map_properties[GXML_SERIALIZABLE_DUAL_KEY_MAP_SERIALIZED_XML_NODE_VALUE_PROPERTY]);
	}
}

static GObject *
gxml_serializable_dual_key_map_constructor (GType type,
                                            guint n_construct_properties,
                                            GObjectConstructParam * construct_properties)
{
	GObject * obj;
	GObjectClass * parent_class;
	GXmlSerializableDualKeyMap * self;
	parent_class = G_OBJECT_CLASS (gxml_serializable_dual_key_map_parent_class);
	obj = parent_class->constructor (type, n_construct_properties, construct_properties);
	self = G_TYPE_CHECK_INSTANCE_CAST (obj, GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP, GXmlSerializableDualKeyMap);
	gxml_init_init ();
	return obj;
}

static void
gxml_serializable_dual_key_map_class_init (GXmlSerializableDualKeyMapClass * klass,
                                           gpointer klass_data)
{
	gxml_serializable_dual_key_map_parent_class = g_type_class_peek_parent (klass);
	g_type_class_adjust_private_offset (klass, &GXmlSerializableDualKeyMap_private_offset);
	((GXmlSerializableDualKeyMapClass *) klass)->deserialize_proceed = (gboolean (*) (GXmlSerializableDualKeyMap*)) gxml_serializable_dual_key_map_real_deserialize_proceed;
	((GXmlSerializableDualKeyMapClass *) klass)->deserialized = (gboolean (*) (GXmlSerializableDualKeyMap*)) gxml_serializable_dual_key_map_real_deserialized;
	((GXmlSerializableDualKeyMapClass *) klass)->deserialize_node = (gboolean (*) (GXmlSerializableDualKeyMap*, GXmlNode*, GError**)) gxml_serializable_dual_key_map_real_deserialize_node;
	((GXmlSerializableDualKeyMapClass *) klass)->deserialize_children = (gboolean (*) (GXmlSerializableDualKeyMap*, GError**)) gxml_serializable_dual_key_map_real_deserialize_children;
	((GXmlSerializableDualKeyMapClass *) klass)->set_default_namespace = (gboolean (*) (GXmlSerializableDualKeyMap*, GXmlNode*)) gxml_serializable_dual_key_map_real_set_default_namespace;
	((GXmlSerializableDualKeyMapClass *) klass)->get_enable_unknown_serializable_property = (gboolean (*) (GXmlSerializableDualKeyMap*)) gxml_serializable_dual_key_map_real_get_enable_unknown_serializable_property;
	((GXmlSerializableDualKeyMapClass *) klass)->serialize_use_xml_node_value = (gboolean (*) (GXmlSerializableDualKeyMap*)) gxml_serializable_dual_key_map_real_serialize_use_xml_node_value;
	((GXmlSerializableDualKeyMapClass *) klass)->property_use_nick = (gboolean (*) (GXmlSerializableDualKeyMap*)) gxml_serializable_dual_key_map_real_property_use_nick;
	((GXmlSerializableDualKeyMapClass *) klass)->node_name = (gchar* (*) (GXmlSerializableDualKeyMap*)) gxml_serializable_dual_key_map_real_node_name;
	((GXmlSerializableDualKeyMapClass *) klass)->find_property_spec = (GParamSpec* (*) (GXmlSerializableDualKeyMap*, const gchar*)) gxml_serializable_dual_key_map_real_find_property_spec;
	((GXmlSerializableDualKeyMapClass *) klass)->list_serializable_properties = (GParamSpec** (*) (GXmlSerializableDualKeyMap*, gint*)) gxml_serializable_dual_key_map_real_list_serializable_properties;
	((GXmlSerializableDualKeyMapClass *) klass)->serialize = (GXmlNode* (*) (GXmlSerializableDualKeyMap*, GXmlNode*, GError**)) gxml_serializable_dual_key_map_real_serialize;
	((GXmlSerializableDualKeyMapClass *) klass)->serialize_property = (GXmlNode* (*) (GXmlSerializableDualKeyMap*, GXmlNode*, GParamSpec*, GError**)) gxml_serializable_dual_key_map_real_serialize_property;
	((GXmlSerializableDualKeyMapClass *) klass)->deserialize = (gboolean (*) (GXmlSerializableDualKeyMap*, GXmlNode*, GError**)) gxml_serializable_dual_key_map_real_deserialize;
	((GXmlSerializableDualKeyMapClass *) klass)->deserialize_property = (gboolean (*) (GXmlSerializableDualKeyMap*, GXmlNode*, GError**)) gxml_serializable_dual_key_map_real_deserialize_property;
	G_OBJECT_CLASS (klass)->get_property = _vala_gxml_serializable_dual_key_map_get_property;
	G_OBJECT_CLASS (klass)->set_property = _vala_gxml_serializable_dual_key_map_set_property;
	G_OBJECT_CLASS (klass)->constructor = gxml_serializable_dual_key_map_constructor;
	G_OBJECT_CLASS (klass)->finalize = gxml_serializable_dual_key_map_finalize;
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_P_TYPE, g_param_spec_gtype ("p-type", "type", "type", G_TYPE_NONE, G_PARAM_STATIC_STRINGS | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_P_DUP_FUNC, g_param_spec_pointer ("p-dup-func", "dup func", "dup func", G_PARAM_STATIC_STRINGS | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_P_DESTROY_FUNC, g_param_spec_pointer ("p-destroy-func", "destroy func", "destroy func", G_PARAM_STATIC_STRINGS | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_S_TYPE, g_param_spec_gtype ("s-type", "type", "type", G_TYPE_NONE, G_PARAM_STATIC_STRINGS | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_S_DUP_FUNC, g_param_spec_pointer ("s-dup-func", "dup func", "dup func", G_PARAM_STATIC_STRINGS | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_S_DESTROY_FUNC, g_param_spec_pointer ("s-destroy-func", "destroy func", "destroy func", G_PARAM_STATIC_STRINGS | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_V_TYPE, g_param_spec_gtype ("v-type", "type", "type", G_TYPE_NONE, G_PARAM_STATIC_STRINGS | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_V_DUP_FUNC, g_param_spec_pointer ("v-dup-func", "dup func", "dup func", G_PARAM_STATIC_STRINGS | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_V_DESTROY_FUNC, g_param_spec_pointer ("v-destroy-func", "destroy func", "destroy func", G_PARAM_STATIC_STRINGS | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_VALUE_TYPE_PROPERTY, gxml_serializable_dual_key_map_properties[GXML_SERIALIZABLE_DUAL_KEY_MAP_VALUE_TYPE_PROPERTY] = g_param_spec_gtype ("value-type", "value-type", "value-type", G_TYPE_NONE, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_PRIMARY_KEY_TYPE_PROPERTY, gxml_serializable_dual_key_map_properties[GXML_SERIALIZABLE_DUAL_KEY_MAP_PRIMARY_KEY_TYPE_PROPERTY] = g_param_spec_gtype ("primary-key-type", "primary-key-type", "primary-key-type", G_TYPE_NONE, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_SECONDARY_KEY_TYPE_PROPERTY, gxml_serializable_dual_key_map_properties[GXML_SERIALIZABLE_DUAL_KEY_MAP_SECONDARY_KEY_TYPE_PROPERTY] = g_param_spec_gtype ("secondary-key-type", "secondary-key-type", "secondary-key-type", G_TYPE_NONE, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_PRIMARY_KEYS_PROPERTY, gxml_serializable_dual_key_map_properties[GXML_SERIALIZABLE_DUAL_KEY_MAP_PRIMARY_KEYS_PROPERTY] = g_param_spec_object ("primary-keys", "primary-keys", "primary-keys", GEE_TYPE_COLLECTION, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_SIZE_PROPERTY, gxml_serializable_dual_key_map_properties[GXML_SERIALIZABLE_DUAL_KEY_MAP_SIZE_PROPERTY] = g_param_spec_int ("size", "size", "size", G_MININT, G_MAXINT, 0, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_UNKNOWN_SERIALIZABLE_PROPERTIES_PROPERTY, gxml_serializable_dual_key_map_properties[GXML_SERIALIZABLE_DUAL_KEY_MAP_UNKNOWN_SERIALIZABLE_PROPERTIES_PROPERTY] = g_param_spec_object ("unknown-serializable-properties", "unknown-serializable-properties", "unknown-serializable-properties", GEE_TYPE_MAP, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_UNKNOWN_SERIALIZABLE_NODES_PROPERTY, gxml_serializable_dual_key_map_properties[GXML_SERIALIZABLE_DUAL_KEY_MAP_UNKNOWN_SERIALIZABLE_NODES_PROPERTY] = g_param_spec_object ("unknown-serializable-nodes", "unknown-serializable-nodes", "unknown-serializable-nodes", GEE_TYPE_COLLECTION, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_IGNORED_SERIALIZABLE_PROPERTIES_PROPERTY, gxml_serializable_dual_key_map_properties[GXML_SERIALIZABLE_DUAL_KEY_MAP_IGNORED_SERIALIZABLE_PROPERTIES_PROPERTY] = g_param_spec_boxed ("ignored-serializable-properties", "ignored-serializable-properties", "ignored-serializable-properties", G_TYPE_HASH_TABLE, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE));
	g_object_class_install_property (G_OBJECT_CLASS (klass), GXML_SERIALIZABLE_DUAL_KEY_MAP_SERIALIZED_XML_NODE_VALUE_PROPERTY, gxml_serializable_dual_key_map_properties[GXML_SERIALIZABLE_DUAL_KEY_MAP_SERIALIZED_XML_NODE_VALUE_PROPERTY] = g_param_spec_string ("serialized-xml-node-value", "serialized-xml-node-value", "serialized-xml-node-value", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE));
}

static GType
gxml_serializable_dual_key_map_gee_traversable_get_g_type (GXmlSerializableDualKeyMap* self)
{
	return self->priv->v_type;
}

static GBoxedCopyFunc
gxml_serializable_dual_key_map_gee_traversable_get_g_dup_func (GXmlSerializableDualKeyMap* self)
{
	return self->priv->v_dup_func;
}

static GDestroyNotify
gxml_serializable_dual_key_map_gee_traversable_get_g_destroy_func (GXmlSerializableDualKeyMap* self)
{
	return self->priv->v_destroy_func;
}

static void
gxml_serializable_dual_key_map_gee_traversable_interface_init (GeeTraversableIface * iface,
                                                               gpointer iface_data)
{
	gxml_serializable_dual_key_map_gee_traversable_parent_iface = g_type_interface_peek_parent (iface);
	iface->foreach = (gboolean (*) (GeeTraversable*, GeeForallFunc, gpointer)) gxml_serializable_dual_key_map_real_foreach;
	iface->get_g_type = (GType (*) (GeeTraversable *)) gxml_serializable_dual_key_map_gee_traversable_get_g_type;
	iface->get_g_dup_func = (GBoxedCopyFunc (*) (GeeTraversable *)) gxml_serializable_dual_key_map_gee_traversable_get_g_dup_func;
	iface->get_g_destroy_func = (GDestroyNotify (*) (GeeTraversable *)) gxml_serializable_dual_key_map_gee_traversable_get_g_destroy_func;
}

static void
gxml_serializable_dual_key_map_gxml_serializable_interface_init (GXmlSerializableIface * iface,
                                                                 gpointer iface_data)
{
	gxml_serializable_dual_key_map_gxml_serializable_parent_iface = g_type_interface_peek_parent (iface);
	iface->set_default_namespace = (gboolean (*) (GXmlSerializable*, GXmlNode*)) gxml_serializable_dual_key_map_set_default_namespace;
	iface->get_enable_unknown_serializable_property = (gboolean (*) (GXmlSerializable*)) gxml_serializable_dual_key_map_get_enable_unknown_serializable_property;
	iface->serialize_use_xml_node_value = (gboolean (*) (GXmlSerializable*)) gxml_serializable_dual_key_map_serialize_use_xml_node_value;
	iface->property_use_nick = (gboolean (*) (GXmlSerializable*)) gxml_serializable_dual_key_map_property_use_nick;
	iface->node_name = (gchar* (*) (GXmlSerializable*)) gxml_serializable_dual_key_map_node_name;
	iface->find_property_spec = (GParamSpec* (*) (GXmlSerializable*, const gchar*)) gxml_serializable_dual_key_map_find_property_spec;
	iface->list_serializable_properties = (GParamSpec** (*) (GXmlSerializable*, gint*)) gxml_serializable_dual_key_map_list_serializable_properties;
	iface->serialize = (GXmlNode* (*) (GXmlSerializable*, GXmlNode*, GError**)) gxml_serializable_dual_key_map_serialize;
	iface->serialize_property = (GXmlNode* (*) (GXmlSerializable*, GXmlNode*, GParamSpec*, GError**)) gxml_serializable_dual_key_map_serialize_property;
	iface->deserialize = (gboolean (*) (GXmlSerializable*, GXmlNode*, GError**)) gxml_serializable_dual_key_map_deserialize;
	iface->deserialize_property = (gboolean (*) (GXmlSerializable*, GXmlNode*, GError**)) gxml_serializable_dual_key_map_deserialize_property;
	iface->get_unknown_serializable_properties = gxml_serializable_dual_key_map_real_get_unknown_serializable_properties;
	iface->get_unknown_serializable_nodes = gxml_serializable_dual_key_map_real_get_unknown_serializable_nodes;
	iface->get_serialized_xml_node_value = gxml_serializable_dual_key_map_real_get_serialized_xml_node_value;
	iface->set_serialized_xml_node_value = gxml_serializable_dual_key_map_real_set_serialized_xml_node_value;
}

static void
gxml_serializable_dual_key_map_gxml_serializable_collection_interface_init (GXmlSerializableCollectionIface * iface,
                                                                            gpointer iface_data)
{
	gxml_serializable_dual_key_map_gxml_serializable_collection_parent_iface = g_type_interface_peek_parent (iface);
	iface->deserialize_proceed = (gboolean (*) (GXmlSerializableCollection*)) gxml_serializable_dual_key_map_deserialize_proceed;
	iface->deserialized = (gboolean (*) (GXmlSerializableCollection*)) gxml_serializable_dual_key_map_deserialized;
	iface->deserialize_node = (gboolean (*) (GXmlSerializableCollection*, GXmlNode*, GError**)) gxml_serializable_dual_key_map_deserialize_node;
	iface->deserialize_children = (gboolean (*) (GXmlSerializableCollection*, GError**)) gxml_serializable_dual_key_map_deserialize_children;
}

static void
gxml_serializable_dual_key_map_instance_init (GXmlSerializableDualKeyMap * self,
                                              gpointer klass)
{
	self->priv = gxml_serializable_dual_key_map_get_instance_private (self);
	self->_deserialized = FALSE;
	self->priv->_serialized_xml_node_value = NULL;
}

static void
gxml_serializable_dual_key_map_finalize (GObject * obj)
{
	GXmlSerializableDualKeyMap * self;
	self = G_TYPE_CHECK_INSTANCE_CAST (obj, GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP, GXmlSerializableDualKeyMap);
	_g_object_unref0 (self->storage);
	_g_object_unref0 (self->_node);
	_g_hash_table_unref0 (self->priv->_ignored_serializable_properties);
	_g_free0 (self->priv->_serialized_xml_node_value);
	G_OBJECT_CLASS (gxml_serializable_dual_key_map_parent_class)->finalize (obj);
}

/**
 * Serializable Framework. A {@link Serializable} objects container
 * based on Gee interfaces with dual key. It requires to dump to a {@link GXml.Document}
 * or parse a pre-parsed XML tree {@link GXml.Document}. See {@link GXml.Collection} to avoid
 * pre/post parsing processes.
 *
 * It implements {@link Serializable} and {@link SerializableCollection} interfaces, it is iterable as
 * other Gee collections.
 */
GType
gxml_serializable_dual_key_map_get_type (void)
{
	static volatile gsize gxml_serializable_dual_key_map_type_id__volatile = 0;
	if (g_once_init_enter (&gxml_serializable_dual_key_map_type_id__volatile)) {
		static const GTypeInfo g_define_type_info = { sizeof (GXmlSerializableDualKeyMapClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) gxml_serializable_dual_key_map_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (GXmlSerializableDualKeyMap), 0, (GInstanceInitFunc) gxml_serializable_dual_key_map_instance_init, NULL };
		static const GInterfaceInfo gee_traversable_info = { (GInterfaceInitFunc) gxml_serializable_dual_key_map_gee_traversable_interface_init, (GInterfaceFinalizeFunc) NULL, NULL};
		static const GInterfaceInfo gxml_serializable_info = { (GInterfaceInitFunc) gxml_serializable_dual_key_map_gxml_serializable_interface_init, (GInterfaceFinalizeFunc) NULL, NULL};
		static const GInterfaceInfo gxml_serializable_collection_info = { (GInterfaceInitFunc) gxml_serializable_dual_key_map_gxml_serializable_collection_interface_init, (GInterfaceFinalizeFunc) NULL, NULL};
		GType gxml_serializable_dual_key_map_type_id;
		gxml_serializable_dual_key_map_type_id = g_type_register_static (G_TYPE_OBJECT, "GXmlSerializableDualKeyMap", &g_define_type_info, 0);
		g_type_add_interface_static (gxml_serializable_dual_key_map_type_id, GEE_TYPE_TRAVERSABLE, &gee_traversable_info);
		g_type_add_interface_static (gxml_serializable_dual_key_map_type_id, GXML_TYPE_SERIALIZABLE, &gxml_serializable_info);
		g_type_add_interface_static (gxml_serializable_dual_key_map_type_id, GXML_TYPE_SERIALIZABLE_COLLECTION, &gxml_serializable_collection_info);
		GXmlSerializableDualKeyMap_private_offset = g_type_add_instance_private (gxml_serializable_dual_key_map_type_id, sizeof (GXmlSerializableDualKeyMapPrivate));
		g_once_init_leave (&gxml_serializable_dual_key_map_type_id__volatile, gxml_serializable_dual_key_map_type_id);
	}
	return gxml_serializable_dual_key_map_type_id__volatile;
}

static void
_vala_gxml_serializable_dual_key_map_get_property (GObject * object,
                                                   guint property_id,
                                                   GValue * value,
                                                   GParamSpec * pspec)
{
	GXmlSerializableDualKeyMap * self;
	self = G_TYPE_CHECK_INSTANCE_CAST (object, GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP, GXmlSerializableDualKeyMap);
	switch (property_id) {
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_VALUE_TYPE_PROPERTY:
		g_value_set_gtype (value, gxml_serializable_dual_key_map_get_value_type (self));
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_PRIMARY_KEY_TYPE_PROPERTY:
		g_value_set_gtype (value, gxml_serializable_dual_key_map_get_primary_key_type (self));
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_SECONDARY_KEY_TYPE_PROPERTY:
		g_value_set_gtype (value, gxml_serializable_dual_key_map_get_secondary_key_type (self));
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_PRIMARY_KEYS_PROPERTY:
		g_value_take_object (value, gxml_serializable_dual_key_map_get_primary_keys (self));
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_SIZE_PROPERTY:
		g_value_set_int (value, gxml_serializable_dual_key_map_get_size (self));
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_UNKNOWN_SERIALIZABLE_PROPERTIES_PROPERTY:
		g_value_take_object (value, gxml_serializable_get_unknown_serializable_properties ((GXmlSerializable*) self));
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_UNKNOWN_SERIALIZABLE_NODES_PROPERTY:
		g_value_take_object (value, gxml_serializable_get_unknown_serializable_nodes ((GXmlSerializable*) self));
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_IGNORED_SERIALIZABLE_PROPERTIES_PROPERTY:
		g_value_set_boxed (value, gxml_serializable_dual_key_map_get_ignored_serializable_properties (self));
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_SERIALIZED_XML_NODE_VALUE_PROPERTY:
		g_value_take_string (value, gxml_serializable_get_serialized_xml_node_value ((GXmlSerializable*) self));
		break;
		default:
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
		break;
	}
}

static void
_vala_gxml_serializable_dual_key_map_set_property (GObject * object,
                                                   guint property_id,
                                                   const GValue * value,
                                                   GParamSpec * pspec)
{
	GXmlSerializableDualKeyMap * self;
	self = G_TYPE_CHECK_INSTANCE_CAST (object, GXML_TYPE_SERIALIZABLE_DUAL_KEY_MAP, GXmlSerializableDualKeyMap);
	switch (property_id) {
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_IGNORED_SERIALIZABLE_PROPERTIES_PROPERTY:
		gxml_serializable_dual_key_map_set_ignored_serializable_properties (self, g_value_get_boxed (value));
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_SERIALIZED_XML_NODE_VALUE_PROPERTY:
		gxml_serializable_set_serialized_xml_node_value ((GXmlSerializable*) self, g_value_get_string (value));
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_P_TYPE:
		self->priv->p_type = g_value_get_gtype (value);
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_P_DUP_FUNC:
		self->priv->p_dup_func = g_value_get_pointer (value);
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_P_DESTROY_FUNC:
		self->priv->p_destroy_func = g_value_get_pointer (value);
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_S_TYPE:
		self->priv->s_type = g_value_get_gtype (value);
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_S_DUP_FUNC:
		self->priv->s_dup_func = g_value_get_pointer (value);
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_S_DESTROY_FUNC:
		self->priv->s_destroy_func = g_value_get_pointer (value);
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_V_TYPE:
		self->priv->v_type = g_value_get_gtype (value);
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_V_DUP_FUNC:
		self->priv->v_dup_func = g_value_get_pointer (value);
		break;
		case GXML_SERIALIZABLE_DUAL_KEY_MAP_V_DESTROY_FUNC:
		self->priv->v_destroy_func = g_value_get_pointer (value);
		break;
		default:
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
		break;
	}
}

