/*** Autogenerated by WIDL 11.5 from include/windows.ui.xaml.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __windows_ui_xaml_h__
#define __windows_ui_xaml_h__

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback ABI::Windows::UI::Xaml::ICreateDefaultValueCallback
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                interface ICreateDefaultValueCallback;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback ABI::Windows::UI::Xaml::IDependencyPropertyChangedCallback
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                interface IDependencyPropertyChangedCallback;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback ABI::Windows::UI::Xaml::IPropertyChangedCallback
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                interface IPropertyChangedCallback;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey ABI::Windows::UI::Xaml::IDataTemplateKey
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                interface IDataTemplateKey;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory ABI::Windows::UI::Xaml::IDataTemplateKeyFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                interface IDataTemplateKeyFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CXaml_CIDependencyObject __x_ABI_CWindows_CUI_CXaml_CIDependencyObject;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject ABI::Windows::UI::Xaml::IDependencyObject
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                interface IDependencyObject;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2 __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2 ABI::Windows::UI::Xaml::IDependencyObject2
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                interface IDependencyObject2;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory ABI::Windows::UI::Xaml::IDependencyObjectFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                interface IDependencyObjectFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty ABI::Windows::UI::Xaml::IDependencyProperty
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                interface IDependencyProperty;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs ABI::Windows::UI::Xaml::IDependencyPropertyChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                interface IDependencyPropertyChangedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics ABI::Windows::UI::Xaml::IDependencyPropertyStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                interface IDependencyPropertyStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata ABI::Windows::UI::Xaml::IPropertyMetadata
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                interface IPropertyMetadata;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory ABI::Windows::UI::Xaml::IPropertyMetadataFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                interface IPropertyMetadataFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics ABI::Windows::UI::Xaml::IPropertyMetadataStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                interface IPropertyMetadataStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CXaml_CDataTemplateKey_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CDataTemplateKey_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                class DataTemplateKey;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CXaml_CDataTemplateKey __x_ABI_CWindows_CUI_CXaml_CDataTemplateKey;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CXaml_CDataTemplateKey_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CXaml_CDependencyObject_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CDependencyObject_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                class DependencyObject;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CXaml_CDependencyObject __x_ABI_CWindows_CUI_CXaml_CDependencyObject;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CXaml_CDependencyObject_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CXaml_CDependencyProperty_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CDependencyProperty_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                class DependencyProperty;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CXaml_CDependencyProperty __x_ABI_CWindows_CUI_CXaml_CDependencyProperty;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CXaml_CDependencyProperty_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CXaml_CDependencyPropertyChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CDependencyPropertyChangedEventArgs_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                class DependencyPropertyChangedEventArgs;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CXaml_CDependencyPropertyChangedEventArgs __x_ABI_CWindows_CUI_CXaml_CDependencyPropertyChangedEventArgs;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CXaml_CDependencyPropertyChangedEventArgs_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CUI_CXaml_CPropertyMetadata_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CPropertyMetadata_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                class PropertyMetadata;
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CUI_CXaml_CPropertyMetadata __x_ABI_CWindows_CUI_CXaml_CPropertyMetadata;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CUI_CXaml_CPropertyMetadata_FWD_DEFINED__ */

/* Headers for imported files */

#include <inspectable.h>
#include <asyncinfo.h>
#include <eventtoken.h>
#include <windowscontracts.h>
#include <windows.foundation.h>
#include <windows.applicationmodel.h>
#include <windows.applicationmodel.activation.h>
#include <windows.applicationmodel.core.h>
#include <windows.foundation.numerics.h>
#include <windows.graphics.imaging.h>
#include <windows.ui.h>
#include <windows.ui.composition.h>
#include <windows.ui.core.h>
#include <windows.ui.input.h>
#include <windows.ui.xaml.interop.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey ABI::Windows::UI::Xaml::IDataTemplateKey
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                interface IDataTemplateKey;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CXaml_CIDependencyObject __x_ABI_CWindows_CUI_CXaml_CIDependencyObject;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject ABI::Windows::UI::Xaml::IDependencyObject
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                interface IDependencyObject;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty ABI::Windows::UI::Xaml::IDependencyProperty
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                interface IDependencyProperty;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs ABI::Windows::UI::Xaml::IDependencyPropertyChangedEventArgs
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                interface IDependencyPropertyChangedEventArgs;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics ABI::Windows::UI::Xaml::IDependencyPropertyStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                interface IDependencyPropertyStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata ABI::Windows::UI::Xaml::IPropertyMetadata
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                interface IPropertyMetadata;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory ABI::Windows::UI::Xaml::IPropertyMetadataFactory
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                interface IPropertyMetadataFactory;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics ABI::Windows::UI::Xaml::IPropertyMetadataStatics
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                interface IPropertyMetadataStatics;
            }
        }
    }
}
#endif /* __cplusplus */
#endif

/*****************************************************************************
 * ICreateDefaultValueCallback interface
 */
#if !defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)
#define WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION 0xe0000
#endif // defined(WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION)

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback, 0xd6ecb12c, 0x15b5, 0x4ec8, 0xb9,0x5c, 0xcd,0xd2,0x08,0xf0,0x81,0x53);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                MIDL_INTERFACE("d6ecb12c-15b5-4ec8-b95c-cdd208f08153")
                ICreateDefaultValueCallback : public IUnknown
                {
                    virtual HRESULT STDMETHODCALLTYPE Invoke(
                        IInspectable **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback, 0xd6ecb12c, 0x15b5, 0x4ec8, 0xb9,0x5c, 0xcd,0xd2,0x08,0xf0,0x81,0x53)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallbackVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback *This);

    /*** ICreateDefaultValueCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback *This,
        IInspectable **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallbackVtbl;

interface __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback {
    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_Release(This) (This)->lpVtbl->Release(This)
/*** ICreateDefaultValueCallback methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_Invoke(This,result) (This)->lpVtbl->Invoke(This,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_AddRef(__x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_Release(__x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** ICreateDefaultValueCallback methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_Invoke(__x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback* This,IInspectable **result) {
    return This->lpVtbl->Invoke(This,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Xaml
#define IID_ICreateDefaultValueCallback IID___x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback
#define ICreateDefaultValueCallbackVtbl __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallbackVtbl
#define ICreateDefaultValueCallback __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback
#define ICreateDefaultValueCallback_QueryInterface __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_QueryInterface
#define ICreateDefaultValueCallback_AddRef __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_AddRef
#define ICreateDefaultValueCallback_Release __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_Release
#define ICreateDefaultValueCallback_Invoke __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_Invoke
#endif /* WIDL_using_Windows_UI_Xaml */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDependencyPropertyChangedCallback interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback, 0x45883d16, 0x27bf, 0x4bc1, 0xac,0x26, 0x94,0xc1,0x60,0x1f,0x3a,0x49);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                MIDL_INTERFACE("45883d16-27bf-4bc1-ac26-94c1601f3a49")
                IDependencyPropertyChangedCallback : public IUnknown
                {
                    virtual HRESULT STDMETHODCALLTYPE Invoke(
                        ABI::Windows::UI::Xaml::IDependencyObject *sender,
                        ABI::Windows::UI::Xaml::IDependencyProperty *dp) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback, 0x45883d16, 0x27bf, 0x4bc1, 0xac,0x26, 0x94,0xc1,0x60,0x1f,0x3a,0x49)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallbackVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback *This);

    /*** IDependencyPropertyChangedCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback *This,
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *sender,
        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallbackVtbl;

interface __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback {
    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IDependencyPropertyChangedCallback methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_Invoke(This,sender,dp) (This)->lpVtbl->Invoke(This,sender,dp)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_AddRef(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_Release(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IDependencyPropertyChangedCallback methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_Invoke(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback* This,__x_ABI_CWindows_CUI_CXaml_CIDependencyObject *sender,__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp) {
    return This->lpVtbl->Invoke(This,sender,dp);
}
#endif
#ifdef WIDL_using_Windows_UI_Xaml
#define IID_IDependencyPropertyChangedCallback IID___x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback
#define IDependencyPropertyChangedCallbackVtbl __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallbackVtbl
#define IDependencyPropertyChangedCallback __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback
#define IDependencyPropertyChangedCallback_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_QueryInterface
#define IDependencyPropertyChangedCallback_AddRef __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_AddRef
#define IDependencyPropertyChangedCallback_Release __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_Release
#define IDependencyPropertyChangedCallback_Invoke __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_Invoke
#endif /* WIDL_using_Windows_UI_Xaml */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IPropertyChangedCallback interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback, 0x5a9f8a25, 0xd142, 0x44a4, 0x82,0x31, 0xfd,0x67,0x67,0x24,0xf2,0x9b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                MIDL_INTERFACE("5a9f8a25-d142-44a4-8231-fd676724f29b")
                IPropertyChangedCallback : public IUnknown
                {
                    virtual HRESULT STDMETHODCALLTYPE Invoke(
                        ABI::Windows::UI::Xaml::IDependencyObject *obj,
                        ABI::Windows::UI::Xaml::IDependencyPropertyChangedEventArgs *args) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback, 0x5a9f8a25, 0xd142, 0x44a4, 0x82,0x31, 0xfd,0x67,0x67,0x24,0xf2,0x9b)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallbackVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback *This);

    /*** IPropertyChangedCallback methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback *This,
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *obj,
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs *args);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallbackVtbl;

interface __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback {
    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_Release(This) (This)->lpVtbl->Release(This)
/*** IPropertyChangedCallback methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_Invoke(This,obj,args) (This)->lpVtbl->Invoke(This,obj,args)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_AddRef(__x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_Release(__x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IPropertyChangedCallback methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_Invoke(__x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback* This,__x_ABI_CWindows_CUI_CXaml_CIDependencyObject *obj,__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs *args) {
    return This->lpVtbl->Invoke(This,obj,args);
}
#endif
#ifdef WIDL_using_Windows_UI_Xaml
#define IID_IPropertyChangedCallback IID___x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback
#define IPropertyChangedCallbackVtbl __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallbackVtbl
#define IPropertyChangedCallback __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback
#define IPropertyChangedCallback_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_QueryInterface
#define IPropertyChangedCallback_AddRef __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_AddRef
#define IPropertyChangedCallback_Release __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_Release
#define IPropertyChangedCallback_Invoke __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_Invoke
#endif /* WIDL_using_Windows_UI_Xaml */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDataTemplateKey interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey, 0x873b6c28, 0xcceb, 0x4b61, 0x86,0xfa, 0xb2,0xce,0xc3,0x9c,0xc2,0xfa);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                MIDL_INTERFACE("873b6c28-cceb-4b61-86fa-b2cec39cc2fa")
                IDataTemplateKey : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_DataType(
                        IInspectable **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE put_DataType(
                        IInspectable *value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey, 0x873b6c28, 0xcceb, 0x4b61, 0x86,0xfa, 0xb2,0xce,0xc3,0x9c,0xc2,0xfa)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey *This,
        TrustLevel *trustLevel);

    /*** IDataTemplateKey methods ***/
    HRESULT (STDMETHODCALLTYPE *get_DataType)(
        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey *This,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *put_DataType)(
        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey *This,
        IInspectable *value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyVtbl;

interface __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey {
    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataTemplateKey methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_get_DataType(This,value) (This)->lpVtbl->get_DataType(This,value)
#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_put_DataType(This,value) (This)->lpVtbl->put_DataType(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_AddRef(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_Release(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_GetIids(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_GetRuntimeClassName(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_GetTrustLevel(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataTemplateKey methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_get_DataType(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey* This,IInspectable **value) {
    return This->lpVtbl->get_DataType(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_put_DataType(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey* This,IInspectable *value) {
    return This->lpVtbl->put_DataType(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Xaml
#define IID_IDataTemplateKey IID___x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey
#define IDataTemplateKeyVtbl __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyVtbl
#define IDataTemplateKey __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey
#define IDataTemplateKey_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_QueryInterface
#define IDataTemplateKey_AddRef __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_AddRef
#define IDataTemplateKey_Release __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_Release
#define IDataTemplateKey_GetIids __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_GetIids
#define IDataTemplateKey_GetRuntimeClassName __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_GetRuntimeClassName
#define IDataTemplateKey_GetTrustLevel __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_GetTrustLevel
#define IDataTemplateKey_get_DataType __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_get_DataType
#define IDataTemplateKey_put_DataType __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_put_DataType
#endif /* WIDL_using_Windows_UI_Xaml */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDataTemplateKeyFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory, 0xe96b2959, 0xd982, 0x4152, 0x91,0xcb, 0xde,0x0e,0x4d,0xfd,0x76,0x93);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                MIDL_INTERFACE("e96b2959-d982-4152-91cb-de0e4dfd7693")
                IDataTemplateKeyFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateInstance(
                        IInspectable *base_interface,
                        IInspectable **inner_interface,
                        ABI::Windows::UI::Xaml::IDataTemplateKey **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateInstanceWithType(
                        IInspectable *data_type,
                        IInspectable *base_interface,
                        IInspectable **inner_interface,
                        ABI::Windows::UI::Xaml::IDataTemplateKey **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory, 0xe96b2959, 0xd982, 0x4152, 0x91,0xcb, 0xde,0x0e,0x4d,0xfd,0x76,0x93)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory *This,
        TrustLevel *trustLevel);

    /*** IDataTemplateKeyFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateInstance)(
        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory *This,
        IInspectable *base_interface,
        IInspectable **inner_interface,
        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey **value);

    HRESULT (STDMETHODCALLTYPE *CreateInstanceWithType)(
        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory *This,
        IInspectable *data_type,
        IInspectable *base_interface,
        IInspectable **inner_interface,
        __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactoryVtbl;

interface __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDataTemplateKeyFactory methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_CreateInstance(This,base_interface,inner_interface,value) (This)->lpVtbl->CreateInstance(This,base_interface,inner_interface,value)
#define __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_CreateInstanceWithType(This,data_type,base_interface,inner_interface,value) (This)->lpVtbl->CreateInstanceWithType(This,data_type,base_interface,inner_interface,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_AddRef(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_Release(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_GetIids(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDataTemplateKeyFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_CreateInstance(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory* This,IInspectable *base_interface,IInspectable **inner_interface,__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey **value) {
    return This->lpVtbl->CreateInstance(This,base_interface,inner_interface,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_CreateInstanceWithType(__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory* This,IInspectable *data_type,IInspectable *base_interface,IInspectable **inner_interface,__x_ABI_CWindows_CUI_CXaml_CIDataTemplateKey **value) {
    return This->lpVtbl->CreateInstanceWithType(This,data_type,base_interface,inner_interface,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Xaml
#define IID_IDataTemplateKeyFactory IID___x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory
#define IDataTemplateKeyFactoryVtbl __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactoryVtbl
#define IDataTemplateKeyFactory __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory
#define IDataTemplateKeyFactory_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_QueryInterface
#define IDataTemplateKeyFactory_AddRef __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_AddRef
#define IDataTemplateKeyFactory_Release __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_Release
#define IDataTemplateKeyFactory_GetIids __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_GetIids
#define IDataTemplateKeyFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_GetRuntimeClassName
#define IDataTemplateKeyFactory_GetTrustLevel __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_GetTrustLevel
#define IDataTemplateKeyFactory_CreateInstance __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_CreateInstance
#define IDataTemplateKeyFactory_CreateInstanceWithType __x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_CreateInstanceWithType
#endif /* WIDL_using_Windows_UI_Xaml */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIDataTemplateKeyFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDependencyObject interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIDependencyObject, 0x5c526665, 0xf60e, 0x4912, 0xaf,0x59, 0x5f,0xe0,0x68,0x0f,0x08,0x9d);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                MIDL_INTERFACE("5c526665-f60e-4912-af59-5fe0680f089d")
                IDependencyObject : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetValue(
                        ABI::Windows::UI::Xaml::IDependencyProperty *dp,
                        IInspectable **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE SetValue(
                        ABI::Windows::UI::Xaml::IDependencyProperty *dp,
                        IInspectable *value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE ClearValue(
                        ABI::Windows::UI::Xaml::IDependencyProperty *dp) = 0;

                    virtual HRESULT STDMETHODCALLTYPE ReadLocalValue(
                        ABI::Windows::UI::Xaml::IDependencyProperty *dp,
                        IInspectable **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE GetAnimationBaseValue(
                        ABI::Windows::UI::Xaml::IDependencyProperty *dp,
                        IInspectable **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_Dispatcher(
                        ABI::Windows::UI::Core::ICoreDispatcher **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject, 0x5c526665, 0xf60e, 0x4912, 0xaf,0x59, 0x5f,0xe0,0x68,0x0f,0x08,0x9d)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This,
        TrustLevel *trustLevel);

    /*** IDependencyObject methods ***/
    HRESULT (STDMETHODCALLTYPE *GetValue)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This,
        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,
        IInspectable **result);

    HRESULT (STDMETHODCALLTYPE *SetValue)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This,
        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,
        IInspectable *value);

    HRESULT (STDMETHODCALLTYPE *ClearValue)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This,
        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp);

    HRESULT (STDMETHODCALLTYPE *ReadLocalValue)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This,
        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,
        IInspectable **result);

    HRESULT (STDMETHODCALLTYPE *GetAnimationBaseValue)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This,
        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,
        IInspectable **result);

    HRESULT (STDMETHODCALLTYPE *get_Dispatcher)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject *This,
        __x_ABI_CWindows_CUI_CCore_CICoreDispatcher **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectVtbl;

interface __x_ABI_CWindows_CUI_CXaml_CIDependencyObject {
    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDependencyObject methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetValue(This,dp,result) (This)->lpVtbl->GetValue(This,dp,result)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_SetValue(This,dp,value) (This)->lpVtbl->SetValue(This,dp,value)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_ClearValue(This,dp) (This)->lpVtbl->ClearValue(This,dp)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_ReadLocalValue(This,dp,result) (This)->lpVtbl->ReadLocalValue(This,dp,result)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetAnimationBaseValue(This,dp,result) (This)->lpVtbl->GetAnimationBaseValue(This,dp,result)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_get_Dispatcher(This,value) (This)->lpVtbl->get_Dispatcher(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_AddRef(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_Release(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetIids(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetRuntimeClassName(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetTrustLevel(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDependencyObject methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetValue(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This,__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,IInspectable **result) {
    return This->lpVtbl->GetValue(This,dp,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_SetValue(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This,__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,IInspectable *value) {
    return This->lpVtbl->SetValue(This,dp,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_ClearValue(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This,__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp) {
    return This->lpVtbl->ClearValue(This,dp);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_ReadLocalValue(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This,__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,IInspectable **result) {
    return This->lpVtbl->ReadLocalValue(This,dp,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetAnimationBaseValue(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This,__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,IInspectable **result) {
    return This->lpVtbl->GetAnimationBaseValue(This,dp,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_get_Dispatcher(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject* This,__x_ABI_CWindows_CUI_CCore_CICoreDispatcher **value) {
    return This->lpVtbl->get_Dispatcher(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Xaml
#define IID_IDependencyObject IID___x_ABI_CWindows_CUI_CXaml_CIDependencyObject
#define IDependencyObjectVtbl __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectVtbl
#define IDependencyObject __x_ABI_CWindows_CUI_CXaml_CIDependencyObject
#define IDependencyObject_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_QueryInterface
#define IDependencyObject_AddRef __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_AddRef
#define IDependencyObject_Release __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_Release
#define IDependencyObject_GetIids __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetIids
#define IDependencyObject_GetRuntimeClassName __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetRuntimeClassName
#define IDependencyObject_GetTrustLevel __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetTrustLevel
#define IDependencyObject_GetValue __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetValue
#define IDependencyObject_SetValue __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_SetValue
#define IDependencyObject_ClearValue __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_ClearValue
#define IDependencyObject_ReadLocalValue __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_ReadLocalValue
#define IDependencyObject_GetAnimationBaseValue __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_GetAnimationBaseValue
#define IDependencyObject_get_Dispatcher __x_ABI_CWindows_CUI_CXaml_CIDependencyObject_get_Dispatcher
#endif /* WIDL_using_Windows_UI_Xaml */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDependencyObject2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIDependencyObject2, 0x29fed85d, 0x3d22, 0x43a1, 0xad,0xd0, 0x17,0x02,0x7c,0x08,0xb2,0x12);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                MIDL_INTERFACE("29fed85d-3d22-43a1-add0-17027c08b212")
                IDependencyObject2 : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE RegisterPropertyChangedCallback(
                        ABI::Windows::UI::Xaml::IDependencyProperty *dp,
                        ABI::Windows::UI::Xaml::IDependencyPropertyChangedCallback *callback,
                        INT64 *result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE UnregisterPropertyChangedCallback(
                        ABI::Windows::UI::Xaml::IDependencyProperty *dp,
                        INT64 token) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject2, 0x29fed85d, 0x3d22, 0x43a1, 0xad,0xd0, 0x17,0x02,0x7c,0x08,0xb2,0x12)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2 *This,
        TrustLevel *trustLevel);

    /*** IDependencyObject2 methods ***/
    HRESULT (STDMETHODCALLTYPE *RegisterPropertyChangedCallback)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2 *This,
        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback *callback,
        INT64 *result);

    HRESULT (STDMETHODCALLTYPE *UnregisterPropertyChangedCallback)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2 *This,
        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,
        INT64 token);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2Vtbl;

interface __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2 {
    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDependencyObject2 methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_RegisterPropertyChangedCallback(This,dp,callback,result) (This)->lpVtbl->RegisterPropertyChangedCallback(This,dp,callback,result)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_UnregisterPropertyChangedCallback(This,dp,token) (This)->lpVtbl->UnregisterPropertyChangedCallback(This,dp,token)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_AddRef(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_Release(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_GetIids(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_GetRuntimeClassName(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_GetTrustLevel(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDependencyObject2 methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_RegisterPropertyChangedCallback(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject2* This,__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedCallback *callback,INT64 *result) {
    return This->lpVtbl->RegisterPropertyChangedCallback(This,dp,callback,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_UnregisterPropertyChangedCallback(__x_ABI_CWindows_CUI_CXaml_CIDependencyObject2* This,__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *dp,INT64 token) {
    return This->lpVtbl->UnregisterPropertyChangedCallback(This,dp,token);
}
#endif
#ifdef WIDL_using_Windows_UI_Xaml
#define IID_IDependencyObject2 IID___x_ABI_CWindows_CUI_CXaml_CIDependencyObject2
#define IDependencyObject2Vtbl __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2Vtbl
#define IDependencyObject2 __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2
#define IDependencyObject2_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_QueryInterface
#define IDependencyObject2_AddRef __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_AddRef
#define IDependencyObject2_Release __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_Release
#define IDependencyObject2_GetIids __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_GetIids
#define IDependencyObject2_GetRuntimeClassName __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_GetRuntimeClassName
#define IDependencyObject2_GetTrustLevel __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_GetTrustLevel
#define IDependencyObject2_RegisterPropertyChangedCallback __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_RegisterPropertyChangedCallback
#define IDependencyObject2_UnregisterPropertyChangedCallback __x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_UnregisterPropertyChangedCallback
#endif /* WIDL_using_Windows_UI_Xaml */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIDependencyObject2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDependencyObjectFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory, 0x9a03af92, 0x7d8a, 0x4937, 0x88,0x4f, 0xec,0xf3,0x4f,0xe0,0x2a,0xcb);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                MIDL_INTERFACE("9a03af92-7d8a-4937-884f-ecf34fe02acb")
                IDependencyObjectFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateInstance(
                        IInspectable *base_interface,
                        IInspectable **inner_interface,
                        ABI::Windows::UI::Xaml::IDependencyObject **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory, 0x9a03af92, 0x7d8a, 0x4937, 0x88,0x4f, 0xec,0xf3,0x4f,0xe0,0x2a,0xcb)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory *This,
        TrustLevel *trustLevel);

    /*** IDependencyObjectFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateInstance)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory *This,
        IInspectable *base_interface,
        IInspectable **inner_interface,
        __x_ABI_CWindows_CUI_CXaml_CIDependencyObject **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactoryVtbl;

interface __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDependencyObjectFactory methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_CreateInstance(This,base_interface,inner_interface,value) (This)->lpVtbl->CreateInstance(This,base_interface,inner_interface,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_AddRef(__x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_Release(__x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_GetIids(__x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDependencyObjectFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_CreateInstance(__x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory* This,IInspectable *base_interface,IInspectable **inner_interface,__x_ABI_CWindows_CUI_CXaml_CIDependencyObject **value) {
    return This->lpVtbl->CreateInstance(This,base_interface,inner_interface,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Xaml
#define IID_IDependencyObjectFactory IID___x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory
#define IDependencyObjectFactoryVtbl __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactoryVtbl
#define IDependencyObjectFactory __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory
#define IDependencyObjectFactory_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_QueryInterface
#define IDependencyObjectFactory_AddRef __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_AddRef
#define IDependencyObjectFactory_Release __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_Release
#define IDependencyObjectFactory_GetIids __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_GetIids
#define IDependencyObjectFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_GetRuntimeClassName
#define IDependencyObjectFactory_GetTrustLevel __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_GetTrustLevel
#define IDependencyObjectFactory_CreateInstance __x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_CreateInstance
#endif /* WIDL_using_Windows_UI_Xaml */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIDependencyObjectFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDependencyProperty interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIDependencyProperty, 0x85b13970, 0x9bc4, 0x4e96, 0xac,0xf1, 0x30,0xc8,0xfd,0x3d,0x55,0xc8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                MIDL_INTERFACE("85b13970-9bc4-4e96-acf1-30c8fd3d55c8")
                IDependencyProperty : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE GetMetadata(
                        ABI::Windows::UI::Xaml::Interop::TypeName type,
                        ABI::Windows::UI::Xaml::IPropertyMetadata **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty, 0x85b13970, 0x9bc4, 0x4e96, 0xac,0xf1, 0x30,0xc8,0xfd,0x3d,0x55,0xc8)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *This,
        TrustLevel *trustLevel);

    /*** IDependencyProperty methods ***/
    HRESULT (STDMETHODCALLTYPE *GetMetadata)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty *This,
        __x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName type,
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyVtbl;

interface __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty {
    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDependencyProperty methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetMetadata(This,type,result) (This)->lpVtbl->GetMetadata(This,type,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_AddRef(__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_Release(__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetIids(__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetRuntimeClassName(__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetTrustLevel(__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDependencyProperty methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetMetadata(__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty* This,__x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName type,__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **result) {
    return This->lpVtbl->GetMetadata(This,type,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Xaml
#define IID_IDependencyProperty IID___x_ABI_CWindows_CUI_CXaml_CIDependencyProperty
#define IDependencyPropertyVtbl __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyVtbl
#define IDependencyProperty __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty
#define IDependencyProperty_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_QueryInterface
#define IDependencyProperty_AddRef __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_AddRef
#define IDependencyProperty_Release __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_Release
#define IDependencyProperty_GetIids __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetIids
#define IDependencyProperty_GetRuntimeClassName __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetRuntimeClassName
#define IDependencyProperty_GetTrustLevel __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetTrustLevel
#define IDependencyProperty_GetMetadata __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_GetMetadata
#endif /* WIDL_using_Windows_UI_Xaml */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIDependencyProperty_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDependencyPropertyChangedEventArgs interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs, 0x81212c2b, 0x24d0, 0x4957, 0xab,0xc3, 0x22,0x44,0x70,0xa9,0x3a,0x4e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                MIDL_INTERFACE("81212c2b-24d0-4957-abc3-224470a93a4e")
                IDependencyPropertyChangedEventArgs : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_Property(
                        ABI::Windows::UI::Xaml::IDependencyProperty **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_OldValue(
                        IInspectable **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_NewValue(
                        IInspectable **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs, 0x81212c2b, 0x24d0, 0x4957, 0xab,0xc3, 0x22,0x44,0x70,0xa9,0x3a,0x4e)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs *This,
        TrustLevel *trustLevel);

    /*** IDependencyPropertyChangedEventArgs methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Property)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs *This,
        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty **value);

    HRESULT (STDMETHODCALLTYPE *get_OldValue)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs *This,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *get_NewValue)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs *This,
        IInspectable **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgsVtbl;

interface __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs {
    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDependencyPropertyChangedEventArgs methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_get_Property(This,value) (This)->lpVtbl->get_Property(This,value)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_get_OldValue(This,value) (This)->lpVtbl->get_OldValue(This,value)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_get_NewValue(This,value) (This)->lpVtbl->get_NewValue(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_AddRef(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_Release(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_GetIids(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_GetRuntimeClassName(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_GetTrustLevel(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDependencyPropertyChangedEventArgs methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_get_Property(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs* This,__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty **value) {
    return This->lpVtbl->get_Property(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_get_OldValue(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs* This,IInspectable **value) {
    return This->lpVtbl->get_OldValue(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_get_NewValue(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs* This,IInspectable **value) {
    return This->lpVtbl->get_NewValue(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Xaml
#define IID_IDependencyPropertyChangedEventArgs IID___x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs
#define IDependencyPropertyChangedEventArgsVtbl __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgsVtbl
#define IDependencyPropertyChangedEventArgs __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs
#define IDependencyPropertyChangedEventArgs_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_QueryInterface
#define IDependencyPropertyChangedEventArgs_AddRef __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_AddRef
#define IDependencyPropertyChangedEventArgs_Release __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_Release
#define IDependencyPropertyChangedEventArgs_GetIids __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_GetIids
#define IDependencyPropertyChangedEventArgs_GetRuntimeClassName __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_GetRuntimeClassName
#define IDependencyPropertyChangedEventArgs_GetTrustLevel __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_GetTrustLevel
#define IDependencyPropertyChangedEventArgs_get_Property __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_get_Property
#define IDependencyPropertyChangedEventArgs_get_OldValue __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_get_OldValue
#define IDependencyPropertyChangedEventArgs_get_NewValue __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_get_NewValue
#endif /* WIDL_using_Windows_UI_Xaml */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyChangedEventArgs_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDependencyPropertyStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics, 0x49e5f28f, 0x8259, 0x4d5c, 0xaa,0xe0, 0x83,0xd5,0x6d,0xbb,0x68,0xd9);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                MIDL_INTERFACE("49e5f28f-8259-4d5c-aae0-83d56dbb68d9")
                IDependencyPropertyStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_UnsetValue(
                        IInspectable **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE Register(
                        HSTRING name,
                        ABI::Windows::UI::Xaml::Interop::TypeName property_type,
                        ABI::Windows::UI::Xaml::Interop::TypeName owner_type,
                        ABI::Windows::UI::Xaml::IPropertyMetadata *type_metadata,
                        ABI::Windows::UI::Xaml::IDependencyProperty **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE RegisterAttached(
                        HSTRING name,
                        ABI::Windows::UI::Xaml::Interop::TypeName property_type,
                        ABI::Windows::UI::Xaml::Interop::TypeName owner_type,
                        ABI::Windows::UI::Xaml::IPropertyMetadata *default_metadata,
                        ABI::Windows::UI::Xaml::IDependencyProperty **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics, 0x49e5f28f, 0x8259, 0x4d5c, 0xaa,0xe0, 0x83,0xd5,0x6d,0xbb,0x68,0xd9)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStaticsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics *This,
        TrustLevel *trustLevel);

    /*** IDependencyPropertyStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *get_UnsetValue)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics *This,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *Register)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics *This,
        HSTRING name,
        __x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName property_type,
        __x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName owner_type,
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *type_metadata,
        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty **result);

    HRESULT (STDMETHODCALLTYPE *RegisterAttached)(
        __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics *This,
        HSTRING name,
        __x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName property_type,
        __x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName owner_type,
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *default_metadata,
        __x_ABI_CWindows_CUI_CXaml_CIDependencyProperty **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStaticsVtbl;

interface __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDependencyPropertyStatics methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_get_UnsetValue(This,value) (This)->lpVtbl->get_UnsetValue(This,value)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_Register(This,name,property_type,owner_type,type_metadata,result) (This)->lpVtbl->Register(This,name,property_type,owner_type,type_metadata,result)
#define __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_RegisterAttached(This,name,property_type,owner_type,default_metadata,result) (This)->lpVtbl->RegisterAttached(This,name,property_type,owner_type,default_metadata,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_AddRef(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_Release(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_GetIids(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDependencyPropertyStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_get_UnsetValue(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics* This,IInspectable **value) {
    return This->lpVtbl->get_UnsetValue(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_Register(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics* This,HSTRING name,__x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName property_type,__x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName owner_type,__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *type_metadata,__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty **result) {
    return This->lpVtbl->Register(This,name,property_type,owner_type,type_metadata,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_RegisterAttached(__x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics* This,HSTRING name,__x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName property_type,__x_ABI_CWindows_CUI_CXaml_CInterop_CTypeName owner_type,__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *default_metadata,__x_ABI_CWindows_CUI_CXaml_CIDependencyProperty **result) {
    return This->lpVtbl->RegisterAttached(This,name,property_type,owner_type,default_metadata,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Xaml
#define IID_IDependencyPropertyStatics IID___x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics
#define IDependencyPropertyStaticsVtbl __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStaticsVtbl
#define IDependencyPropertyStatics __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics
#define IDependencyPropertyStatics_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_QueryInterface
#define IDependencyPropertyStatics_AddRef __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_AddRef
#define IDependencyPropertyStatics_Release __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_Release
#define IDependencyPropertyStatics_GetIids __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_GetIids
#define IDependencyPropertyStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_GetRuntimeClassName
#define IDependencyPropertyStatics_GetTrustLevel __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_GetTrustLevel
#define IDependencyPropertyStatics_get_UnsetValue __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_get_UnsetValue
#define IDependencyPropertyStatics_Register __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_Register
#define IDependencyPropertyStatics_RegisterAttached __x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_RegisterAttached
#endif /* WIDL_using_Windows_UI_Xaml */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIDependencyPropertyStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IPropertyMetadata interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata, 0x814ef30d, 0x8d18, 0x448a, 0x86,0x44, 0xf2,0xcb,0x51,0xe7,0x03,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                MIDL_INTERFACE("814ef30d-8d18-448a-8644-f2cb51e70380")
                IPropertyMetadata : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE get_DefaultValue(
                        IInspectable **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE get_CreateDefaultValueCallback(
                        ABI::Windows::UI::Xaml::ICreateDefaultValueCallback **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata, 0x814ef30d, 0x8d18, 0x448a, 0x86,0x44, 0xf2,0xcb,0x51,0xe7,0x03,0x80)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *This,
        TrustLevel *trustLevel);

    /*** IPropertyMetadata methods ***/
    HRESULT (STDMETHODCALLTYPE *get_DefaultValue)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *This,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *get_CreateDefaultValueCallback)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata *This,
        __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataVtbl;

interface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata {
    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPropertyMetadata methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_get_DefaultValue(This,value) (This)->lpVtbl->get_DefaultValue(This,value)
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_get_CreateDefaultValueCallback(This,value) (This)->lpVtbl->get_CreateDefaultValueCallback(This,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_AddRef(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_Release(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_GetIids(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_GetRuntimeClassName(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_GetTrustLevel(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPropertyMetadata methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_get_DefaultValue(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata* This,IInspectable **value) {
    return This->lpVtbl->get_DefaultValue(This,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_get_CreateDefaultValueCallback(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata* This,__x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback **value) {
    return This->lpVtbl->get_CreateDefaultValueCallback(This,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Xaml
#define IID_IPropertyMetadata IID___x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata
#define IPropertyMetadataVtbl __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataVtbl
#define IPropertyMetadata __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata
#define IPropertyMetadata_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_QueryInterface
#define IPropertyMetadata_AddRef __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_AddRef
#define IPropertyMetadata_Release __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_Release
#define IPropertyMetadata_GetIids __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_GetIids
#define IPropertyMetadata_GetRuntimeClassName __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_GetRuntimeClassName
#define IPropertyMetadata_GetTrustLevel __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_GetTrustLevel
#define IPropertyMetadata_get_DefaultValue __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_get_DefaultValue
#define IPropertyMetadata_get_CreateDefaultValueCallback __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_get_CreateDefaultValueCallback
#endif /* WIDL_using_Windows_UI_Xaml */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IPropertyMetadataFactory interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory, 0xc1b81cc0, 0x57cd, 0x4f2f, 0xb0,0xa9, 0xe1,0x80,0x1b,0x28,0xf7,0x6b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                MIDL_INTERFACE("c1b81cc0-57cd-4f2f-b0a9-e1801b28f76b")
                IPropertyMetadataFactory : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateInstanceWithDefaultValue(
                        IInspectable *default_value,
                        IInspectable *base_interface,
                        IInspectable **inner_interface,
                        ABI::Windows::UI::Xaml::IPropertyMetadata **value) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateInstanceWithDefaultValueAndCallback(
                        IInspectable *default_value,
                        ABI::Windows::UI::Xaml::IPropertyChangedCallback *property_changed_callback,
                        IInspectable *base_interface,
                        IInspectable **inner_interface,
                        ABI::Windows::UI::Xaml::IPropertyMetadata **value) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory, 0xc1b81cc0, 0x57cd, 0x4f2f, 0xb0,0xa9, 0xe1,0x80,0x1b,0x28,0xf7,0x6b)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactoryVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory *This,
        TrustLevel *trustLevel);

    /*** IPropertyMetadataFactory methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateInstanceWithDefaultValue)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory *This,
        IInspectable *default_value,
        IInspectable *base_interface,
        IInspectable **inner_interface,
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **value);

    HRESULT (STDMETHODCALLTYPE *CreateInstanceWithDefaultValueAndCallback)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory *This,
        IInspectable *default_value,
        __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback *property_changed_callback,
        IInspectable *base_interface,
        IInspectable **inner_interface,
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **value);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactoryVtbl;

interface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory {
    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPropertyMetadataFactory methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_CreateInstanceWithDefaultValue(This,default_value,base_interface,inner_interface,value) (This)->lpVtbl->CreateInstanceWithDefaultValue(This,default_value,base_interface,inner_interface,value)
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_CreateInstanceWithDefaultValueAndCallback(This,default_value,property_changed_callback,base_interface,inner_interface,value) (This)->lpVtbl->CreateInstanceWithDefaultValueAndCallback(This,default_value,property_changed_callback,base_interface,inner_interface,value)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_AddRef(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_Release(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_GetIids(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_GetRuntimeClassName(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_GetTrustLevel(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPropertyMetadataFactory methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_CreateInstanceWithDefaultValue(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory* This,IInspectable *default_value,IInspectable *base_interface,IInspectable **inner_interface,__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **value) {
    return This->lpVtbl->CreateInstanceWithDefaultValue(This,default_value,base_interface,inner_interface,value);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_CreateInstanceWithDefaultValueAndCallback(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory* This,IInspectable *default_value,__x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback *property_changed_callback,IInspectable *base_interface,IInspectable **inner_interface,__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **value) {
    return This->lpVtbl->CreateInstanceWithDefaultValueAndCallback(This,default_value,property_changed_callback,base_interface,inner_interface,value);
}
#endif
#ifdef WIDL_using_Windows_UI_Xaml
#define IID_IPropertyMetadataFactory IID___x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory
#define IPropertyMetadataFactoryVtbl __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactoryVtbl
#define IPropertyMetadataFactory __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory
#define IPropertyMetadataFactory_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_QueryInterface
#define IPropertyMetadataFactory_AddRef __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_AddRef
#define IPropertyMetadataFactory_Release __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_Release
#define IPropertyMetadataFactory_GetIids __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_GetIids
#define IPropertyMetadataFactory_GetRuntimeClassName __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_GetRuntimeClassName
#define IPropertyMetadataFactory_GetTrustLevel __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_GetTrustLevel
#define IPropertyMetadataFactory_CreateInstanceWithDefaultValue __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_CreateInstanceWithDefaultValue
#define IPropertyMetadataFactory_CreateInstanceWithDefaultValueAndCallback __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_CreateInstanceWithDefaultValueAndCallback
#endif /* WIDL_using_Windows_UI_Xaml */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataFactory_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IPropertyMetadataStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics, 0x3b01077a, 0x6e06, 0x45e9, 0x8b,0x5c, 0xaf,0x24,0x34,0x58,0xc0,0x62);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace UI {
            namespace Xaml {
                MIDL_INTERFACE("3b01077a-6e06-45e9-8b5c-af243458c062")
                IPropertyMetadataStatics : public IInspectable
                {
                    virtual HRESULT STDMETHODCALLTYPE CreateWithDefaultValue(
                        IInspectable *default_value,
                        ABI::Windows::UI::Xaml::IPropertyMetadata **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateWithDefaultValueAndCallback(
                        IInspectable *default_value,
                        ABI::Windows::UI::Xaml::IPropertyChangedCallback *property_changed_callback,
                        ABI::Windows::UI::Xaml::IPropertyMetadata **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateWithFactory(
                        ABI::Windows::UI::Xaml::ICreateDefaultValueCallback *create_default_value_callback,
                        ABI::Windows::UI::Xaml::IPropertyMetadata **result) = 0;

                    virtual HRESULT STDMETHODCALLTYPE CreateWithFactoryAndCallback(
                        ABI::Windows::UI::Xaml::ICreateDefaultValueCallback *create_default_value_callback,
                        ABI::Windows::UI::Xaml::IPropertyChangedCallback *property_changed_callback,
                        ABI::Windows::UI::Xaml::IPropertyMetadata **result) = 0;

                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics, 0x3b01077a, 0x6e06, 0x45e9, 0x8b,0x5c, 0xaf,0x24,0x34,0x58,0xc0,0x62)
#endif
#else
typedef struct __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStaticsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics *This,
        TrustLevel *trustLevel);

    /*** IPropertyMetadataStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *CreateWithDefaultValue)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics *This,
        IInspectable *default_value,
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **result);

    HRESULT (STDMETHODCALLTYPE *CreateWithDefaultValueAndCallback)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics *This,
        IInspectable *default_value,
        __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback *property_changed_callback,
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **result);

    HRESULT (STDMETHODCALLTYPE *CreateWithFactory)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics *This,
        __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback *create_default_value_callback,
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **result);

    HRESULT (STDMETHODCALLTYPE *CreateWithFactoryAndCallback)(
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics *This,
        __x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback *create_default_value_callback,
        __x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback *property_changed_callback,
        __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **result);

    END_INTERFACE
} __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStaticsVtbl;

interface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics {
    CONST_VTBL __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IPropertyMetadataStatics methods ***/
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithDefaultValue(This,default_value,result) (This)->lpVtbl->CreateWithDefaultValue(This,default_value,result)
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithDefaultValueAndCallback(This,default_value,property_changed_callback,result) (This)->lpVtbl->CreateWithDefaultValueAndCallback(This,default_value,property_changed_callback,result)
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithFactory(This,create_default_value_callback,result) (This)->lpVtbl->CreateWithFactory(This,create_default_value_callback,result)
#define __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithFactoryAndCallback(This,create_default_value_callback,property_changed_callback,result) (This)->lpVtbl->CreateWithFactoryAndCallback(This,create_default_value_callback,property_changed_callback,result)
#else
/*** IUnknown methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_QueryInterface(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_AddRef(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_Release(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_GetIids(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_GetRuntimeClassName(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_GetTrustLevel(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IPropertyMetadataStatics methods ***/
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithDefaultValue(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics* This,IInspectable *default_value,__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **result) {
    return This->lpVtbl->CreateWithDefaultValue(This,default_value,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithDefaultValueAndCallback(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics* This,IInspectable *default_value,__x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback *property_changed_callback,__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **result) {
    return This->lpVtbl->CreateWithDefaultValueAndCallback(This,default_value,property_changed_callback,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithFactory(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics* This,__x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback *create_default_value_callback,__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **result) {
    return This->lpVtbl->CreateWithFactory(This,create_default_value_callback,result);
}
static inline HRESULT __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithFactoryAndCallback(__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics* This,__x_ABI_CWindows_CUI_CXaml_CICreateDefaultValueCallback *create_default_value_callback,__x_ABI_CWindows_CUI_CXaml_CIPropertyChangedCallback *property_changed_callback,__x_ABI_CWindows_CUI_CXaml_CIPropertyMetadata **result) {
    return This->lpVtbl->CreateWithFactoryAndCallback(This,create_default_value_callback,property_changed_callback,result);
}
#endif
#ifdef WIDL_using_Windows_UI_Xaml
#define IID_IPropertyMetadataStatics IID___x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics
#define IPropertyMetadataStaticsVtbl __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStaticsVtbl
#define IPropertyMetadataStatics __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics
#define IPropertyMetadataStatics_QueryInterface __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_QueryInterface
#define IPropertyMetadataStatics_AddRef __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_AddRef
#define IPropertyMetadataStatics_Release __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_Release
#define IPropertyMetadataStatics_GetIids __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_GetIids
#define IPropertyMetadataStatics_GetRuntimeClassName __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_GetRuntimeClassName
#define IPropertyMetadataStatics_GetTrustLevel __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_GetTrustLevel
#define IPropertyMetadataStatics_CreateWithDefaultValue __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithDefaultValue
#define IPropertyMetadataStatics_CreateWithDefaultValueAndCallback __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithDefaultValueAndCallback
#define IPropertyMetadataStatics_CreateWithFactory __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithFactory
#define IPropertyMetadataStatics_CreateWithFactoryAndCallback __x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_CreateWithFactoryAndCallback
#endif /* WIDL_using_Windows_UI_Xaml */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CUI_CXaml_CIPropertyMetadataStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Xaml.DataTemplateKey
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Xaml_DataTemplateKey_DEFINED
#define RUNTIMECLASS_Windows_UI_Xaml_DataTemplateKey_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Xaml_DataTemplateKey[] = {'W','i','n','d','o','w','s','.','U','I','.','X','a','m','l','.','D','a','t','a','T','e','m','p','l','a','t','e','K','e','y',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Xaml_DataTemplateKey[] = L"Windows.UI.Xaml.DataTemplateKey";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Xaml_DataTemplateKey[] = {'W','i','n','d','o','w','s','.','U','I','.','X','a','m','l','.','D','a','t','a','T','e','m','p','l','a','t','e','K','e','y',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Xaml_DataTemplateKey_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Xaml.DependencyObject
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Xaml_DependencyObject_DEFINED
#define RUNTIMECLASS_Windows_UI_Xaml_DependencyObject_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Xaml_DependencyObject[] = {'W','i','n','d','o','w','s','.','U','I','.','X','a','m','l','.','D','e','p','e','n','d','e','n','c','y','O','b','j','e','c','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Xaml_DependencyObject[] = L"Windows.UI.Xaml.DependencyObject";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Xaml_DependencyObject[] = {'W','i','n','d','o','w','s','.','U','I','.','X','a','m','l','.','D','e','p','e','n','d','e','n','c','y','O','b','j','e','c','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Xaml_DependencyObject_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Xaml.DependencyProperty
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Xaml_DependencyProperty_DEFINED
#define RUNTIMECLASS_Windows_UI_Xaml_DependencyProperty_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Xaml_DependencyProperty[] = {'W','i','n','d','o','w','s','.','U','I','.','X','a','m','l','.','D','e','p','e','n','d','e','n','c','y','P','r','o','p','e','r','t','y',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Xaml_DependencyProperty[] = L"Windows.UI.Xaml.DependencyProperty";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Xaml_DependencyProperty[] = {'W','i','n','d','o','w','s','.','U','I','.','X','a','m','l','.','D','e','p','e','n','d','e','n','c','y','P','r','o','p','e','r','t','y',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Xaml_DependencyProperty_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Xaml.DependencyPropertyChangedEventArgs
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Xaml_DependencyPropertyChangedEventArgs_DEFINED
#define RUNTIMECLASS_Windows_UI_Xaml_DependencyPropertyChangedEventArgs_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Xaml_DependencyPropertyChangedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','X','a','m','l','.','D','e','p','e','n','d','e','n','c','y','P','r','o','p','e','r','t','y','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Xaml_DependencyPropertyChangedEventArgs[] = L"Windows.UI.Xaml.DependencyPropertyChangedEventArgs";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Xaml_DependencyPropertyChangedEventArgs[] = {'W','i','n','d','o','w','s','.','U','I','.','X','a','m','l','.','D','e','p','e','n','d','e','n','c','y','P','r','o','p','e','r','t','y','C','h','a','n','g','e','d','E','v','e','n','t','A','r','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Xaml_DependencyPropertyChangedEventArgs_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.UI.Xaml.PropertyMetadata
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_UI_Xaml_PropertyMetadata_DEFINED
#define RUNTIMECLASS_Windows_UI_Xaml_PropertyMetadata_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_UI_Xaml_PropertyMetadata[] = {'W','i','n','d','o','w','s','.','U','I','.','X','a','m','l','.','P','r','o','p','e','r','t','y','M','e','t','a','d','a','t','a',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Xaml_PropertyMetadata[] = L"Windows.UI.Xaml.PropertyMetadata";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_UI_Xaml_PropertyMetadata[] = {'W','i','n','d','o','w','s','.','U','I','.','X','a','m','l','.','P','r','o','p','e','r','t','y','M','e','t','a','d','a','t','a',0};
#endif
#endif /* RUNTIMECLASS_Windows_UI_Xaml_PropertyMetadata_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER HSTRING_UserSize     (ULONG *, ULONG, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserMarshal  (ULONG *, unsigned char *, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
void            __RPC_USER HSTRING_UserFree     (ULONG *, HSTRING *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_ui_xaml_h__ */
