/*** Autogenerated by WIDL 9.8 from include/windows.security.credentials.ui.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_security_credentials_ui_h__
#define __windows_security_credentials_ui_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics ABI::Windows::Security::Credentials::UI::IUserConsentVerifierStatics
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                namespace UI {
                    interface IUserConsentVerifierStatics;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CUI_CUserConsentVerifier_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CUI_CUserConsentVerifier_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                namespace UI {
                    class UserConsentVerifier;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CSecurity_CCredentials_CUI_CUserConsentVerifier __x_ABI_CWindows_CSecurity_CCredentials_CUI_CUserConsentVerifier;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CSecurity_CCredentials_CUI_CUserConsentVerifier_FWD_DEFINED__ */

#ifndef ____FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::UI::UserConsentVerificationResult >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::UI::UserConsentVerifierAvailability >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_UserConsentVerificationResult_FWD_DEFINED__
#define ____FIAsyncOperation_1_UserConsentVerificationResult_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_UserConsentVerificationResult __FIAsyncOperation_1_UserConsentVerificationResult;
#ifdef __cplusplus
#define __FIAsyncOperation_1_UserConsentVerificationResult ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::Credentials::UI::UserConsentVerificationResult >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_UserConsentVerifierAvailability_FWD_DEFINED__
#define ____FIAsyncOperation_1_UserConsentVerifierAvailability_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_UserConsentVerifierAvailability __FIAsyncOperation_1_UserConsentVerifierAvailability;
#ifdef __cplusplus
#define __FIAsyncOperation_1_UserConsentVerifierAvailability ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::Credentials::UI::UserConsentVerifierAvailability >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <inspectable.h>
#include <asyncinfo.h>
#include <eventtoken.h>
#include <windowscontracts.h>
#include <windows.foundation.h>
#include <windows.storage.streams.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CSecurity_CCredentials_CUI_CUserConsentVerificationResult __x_ABI_CWindows_CSecurity_CCredentials_CUI_CUserConsentVerificationResult;
#endif /* __cplusplus */

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CSecurity_CCredentials_CUI_CUserConsentVerifierAvailability __x_ABI_CWindows_CSecurity_CCredentials_CUI_CUserConsentVerifierAvailability;
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics ABI::Windows::Security::Credentials::UI::IUserConsentVerifierStatics
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                namespace UI {
                    interface IUserConsentVerifierStatics;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_UserConsentVerificationResult_FWD_DEFINED__
#define ____FIAsyncOperation_1_UserConsentVerificationResult_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_UserConsentVerificationResult __FIAsyncOperation_1_UserConsentVerificationResult;
#ifdef __cplusplus
#define __FIAsyncOperation_1_UserConsentVerificationResult ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::Credentials::UI::UserConsentVerificationResult >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_UserConsentVerifierAvailability_FWD_DEFINED__
#define ____FIAsyncOperation_1_UserConsentVerifierAvailability_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_UserConsentVerifierAvailability __FIAsyncOperation_1_UserConsentVerifierAvailability;
#ifdef __cplusplus
#define __FIAsyncOperation_1_UserConsentVerifierAvailability ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::Credentials::UI::UserConsentVerifierAvailability >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                namespace UI {
                    enum UserConsentVerificationResult {
                        UserConsentVerificationResult_Verified = 0,
                        UserConsentVerificationResult_DeviceNotPresent = 1,
                        UserConsentVerificationResult_NotConfiguredForUser = 2,
                        UserConsentVerificationResult_DisabledByPolicy = 3,
                        UserConsentVerificationResult_DeviceBusy = 4,
                        UserConsentVerificationResult_RetriesExhausted = 5,
                        UserConsentVerificationResult_Canceled = 6
                    };
                }
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CSecurity_CCredentials_CUI_CUserConsentVerificationResult {
    UserConsentVerificationResult_Verified = 0,
    UserConsentVerificationResult_DeviceNotPresent = 1,
    UserConsentVerificationResult_NotConfiguredForUser = 2,
    UserConsentVerificationResult_DisabledByPolicy = 3,
    UserConsentVerificationResult_DeviceBusy = 4,
    UserConsentVerificationResult_RetriesExhausted = 5,
    UserConsentVerificationResult_Canceled = 6
};
#ifdef WIDL_using_Windows_Security_Credentials_UI
#define UserConsentVerificationResult __x_ABI_CWindows_CSecurity_CCredentials_CUI_CUserConsentVerificationResult
#endif /* WIDL_using_Windows_Security_Credentials_UI */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                namespace UI {
                    enum UserConsentVerifierAvailability {
                        UserConsentVerifierAvailability_Available = 0,
                        UserConsentVerifierAvailability_DeviceNotPresent = 1,
                        UserConsentVerifierAvailability_NotConfiguredForUser = 2,
                        UserConsentVerifierAvailability_DisabledByPolicy = 3,
                        UserConsentVerifierAvailability_DeviceBusy = 4
                    };
                }
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CSecurity_CCredentials_CUI_CUserConsentVerifierAvailability {
    UserConsentVerifierAvailability_Available = 0,
    UserConsentVerifierAvailability_DeviceNotPresent = 1,
    UserConsentVerifierAvailability_NotConfiguredForUser = 2,
    UserConsentVerifierAvailability_DisabledByPolicy = 3,
    UserConsentVerifierAvailability_DeviceBusy = 4
};
#ifdef WIDL_using_Windows_Security_Credentials_UI
#define UserConsentVerifierAvailability __x_ABI_CWindows_CSecurity_CCredentials_CUI_CUserConsentVerifierAvailability
#endif /* WIDL_using_Windows_Security_Credentials_UI */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
/*****************************************************************************
 * IUserConsentVerifierStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics, 0xaf4f3f91, 0x564c, 0x4ddc, 0xb8,0xb5, 0x97,0x34,0x47,0x62,0x7c,0x65);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Security {
            namespace Credentials {
                namespace UI {
                    MIDL_INTERFACE("af4f3f91-564c-4ddc-b8b5-973447627c65")
                    IUserConsentVerifierStatics : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE CheckAvailabilityAsync(
                            ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::Credentials::UI::UserConsentVerifierAvailability > **result) = 0;

                        virtual HRESULT STDMETHODCALLTYPE RequestVerificationAsync(
                            HSTRING message,
                            ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Security::Credentials::UI::UserConsentVerificationResult > **result) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics, 0xaf4f3f91, 0x564c, 0x4ddc, 0xb8,0xb5, 0x97,0x34,0x47,0x62,0x7c,0x65)
#endif
#else
typedef struct __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStaticsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IUserConsentVerifierStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *CheckAvailabilityAsync)(
        __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics *This,
        __FIAsyncOperation_1_UserConsentVerifierAvailability **result);

    HRESULT (STDMETHODCALLTYPE *RequestVerificationAsync)(
        __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics *This,
        HSTRING message,
        __FIAsyncOperation_1_UserConsentVerificationResult **result);

    END_INTERFACE
} __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStaticsVtbl;

interface __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics {
    CONST_VTBL __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IUserConsentVerifierStatics methods ***/
#define __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_CheckAvailabilityAsync(This,result) (This)->lpVtbl->CheckAvailabilityAsync(This,result)
#define __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_RequestVerificationAsync(This,message,result) (This)->lpVtbl->RequestVerificationAsync(This,message,result)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_QueryInterface(__x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_AddRef(__x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_Release(__x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_GetIids(__x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_GetRuntimeClassName(__x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_GetTrustLevel(__x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IUserConsentVerifierStatics methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_CheckAvailabilityAsync(__x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics* This,__FIAsyncOperation_1_UserConsentVerifierAvailability **result) {
    return This->lpVtbl->CheckAvailabilityAsync(This,result);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_RequestVerificationAsync(__x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics* This,HSTRING message,__FIAsyncOperation_1_UserConsentVerificationResult **result) {
    return This->lpVtbl->RequestVerificationAsync(This,message,result);
}
#endif
#ifdef WIDL_using_Windows_Security_Credentials_UI
#define IID_IUserConsentVerifierStatics IID___x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics
#define IUserConsentVerifierStaticsVtbl __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStaticsVtbl
#define IUserConsentVerifierStatics __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics
#define IUserConsentVerifierStatics_QueryInterface __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_QueryInterface
#define IUserConsentVerifierStatics_AddRef __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_AddRef
#define IUserConsentVerifierStatics_Release __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_Release
#define IUserConsentVerifierStatics_GetIids __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_GetIids
#define IUserConsentVerifierStatics_GetRuntimeClassName __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_GetRuntimeClassName
#define IUserConsentVerifierStatics_GetTrustLevel __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_GetTrustLevel
#define IUserConsentVerifierStatics_CheckAvailabilityAsync __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_CheckAvailabilityAsync
#define IUserConsentVerifierStatics_RequestVerificationAsync __x_ABI_CWindows_CSecurity_CCredentials_CUI_CIUserConsentVerifierStatics_RequestVerificationAsync
#endif /* WIDL_using_Windows_Security_Credentials_UI */
#endif

#endif

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

/*
 * Class Windows.Security.Credentials.UI.UserConsentVerifier
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Security_Credentials_UI_UserConsentVerifier_DEFINED
#define RUNTIMECLASS_Windows_Security_Credentials_UI_UserConsentVerifier_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Security_Credentials_UI_UserConsentVerifier[] = {'W','i','n','d','o','w','s','.','S','e','c','u','r','i','t','y','.','C','r','e','d','e','n','t','i','a','l','s','.','U','I','.','U','s','e','r','C','o','n','s','e','n','t','V','e','r','i','f','i','e','r',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Security_Credentials_UI_UserConsentVerifier[] = L"Windows.Security.Credentials.UI.UserConsentVerifier";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Security_Credentials_UI_UserConsentVerifier[] = {'W','i','n','d','o','w','s','.','S','e','c','u','r','i','t','y','.','C','r','e','d','e','n','t','i','a','l','s','.','U','I','.','U','s','e','r','C','o','n','s','e','n','t','V','e','r','i','f','i','e','r',0};
#endif
#endif /* RUNTIMECLASS_Windows_Security_Credentials_UI_UserConsentVerifier_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::UI::UserConsentVerificationResult > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult, 0x0cffc6c9, 0x4c2b, 0x5cd4, 0xb3,0x8c, 0x7b,0x8d,0xf3,0xff,0x5a,0xfb);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("0cffc6c9-4c2b-5cd4-b38c-7b8df3ff5afb")
            IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::UI::UserConsentVerificationResult > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Security::Credentials::UI::UserConsentVerificationResult >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult, 0x0cffc6c9, 0x4c2b, 0x5cd4, 0xb3,0x8c, 0x7b,0x8d,0xf3,0xff,0x5a,0xfb)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResultVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::UI::UserConsentVerificationResult > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult *This,
        __FIAsyncOperation_1_UserConsentVerificationResult *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResultVtbl;

interface __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::UI::UserConsentVerificationResult > methods ***/
#define __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult_QueryInterface(__FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult_AddRef(__FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult_Release(__FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::UI::UserConsentVerificationResult > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult_Invoke(__FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult* This,__FIAsyncOperation_1_UserConsentVerificationResult *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_UserConsentVerificationResult IID___FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult
#define IAsyncOperationCompletedHandler_UserConsentVerificationResultVtbl __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResultVtbl
#define IAsyncOperationCompletedHandler_UserConsentVerificationResult __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult
#define IAsyncOperationCompletedHandler_UserConsentVerificationResult_QueryInterface __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult_QueryInterface
#define IAsyncOperationCompletedHandler_UserConsentVerificationResult_AddRef __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult_AddRef
#define IAsyncOperationCompletedHandler_UserConsentVerificationResult_Release __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult_Release
#define IAsyncOperationCompletedHandler_UserConsentVerificationResult_Invoke __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::UI::UserConsentVerifierAvailability > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability, 0x28988174, 0xace2, 0x5c15, 0xa0,0xdf, 0x58,0x0a,0x26,0xd9,0x42,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("28988174-ace2-5c15-a0df-580a26d94294")
            IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::UI::UserConsentVerifierAvailability > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Security::Credentials::UI::UserConsentVerifierAvailability >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability, 0x28988174, 0xace2, 0x5c15, 0xa0,0xdf, 0x58,0x0a,0x26,0xd9,0x42,0x94)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailabilityVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::UI::UserConsentVerifierAvailability > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability *This,
        __FIAsyncOperation_1_UserConsentVerifierAvailability *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailabilityVtbl;

interface __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailabilityVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::UI::UserConsentVerifierAvailability > methods ***/
#define __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability_QueryInterface(__FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability_AddRef(__FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability_Release(__FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Security::Credentials::UI::UserConsentVerifierAvailability > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability_Invoke(__FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability* This,__FIAsyncOperation_1_UserConsentVerifierAvailability *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_UserConsentVerifierAvailability IID___FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability
#define IAsyncOperationCompletedHandler_UserConsentVerifierAvailabilityVtbl __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailabilityVtbl
#define IAsyncOperationCompletedHandler_UserConsentVerifierAvailability __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability
#define IAsyncOperationCompletedHandler_UserConsentVerifierAvailability_QueryInterface __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability_QueryInterface
#define IAsyncOperationCompletedHandler_UserConsentVerifierAvailability_AddRef __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability_AddRef
#define IAsyncOperationCompletedHandler_UserConsentVerifierAvailability_Release __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability_Release
#define IAsyncOperationCompletedHandler_UserConsentVerifierAvailability_Invoke __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Security::Credentials::UI::UserConsentVerificationResult > interface
 */
#ifndef ____FIAsyncOperation_1_UserConsentVerificationResult_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_UserConsentVerificationResult_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_UserConsentVerificationResult, 0xfd596ffd, 0x2318, 0x558f, 0x9d,0xbe, 0xd2,0x1d,0xf4,0x37,0x64,0xa5);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("fd596ffd-2318-558f-9dbe-d21df43764a5")
            IAsyncOperation<ABI::Windows::Security::Credentials::UI::UserConsentVerificationResult > : IAsyncOperation_impl<ABI::Windows::Security::Credentials::UI::UserConsentVerificationResult >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_UserConsentVerificationResult, 0xfd596ffd, 0x2318, 0x558f, 0x9d,0xbe, 0xd2,0x1d,0xf4,0x37,0x64,0xa5)
#endif
#else
typedef struct __FIAsyncOperation_1_UserConsentVerificationResultVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::Security::Credentials::UI::UserConsentVerificationResult > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_UserConsentVerificationResult *This,
        __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_UserConsentVerificationResult *This,
        __FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_UserConsentVerificationResult *This,
        enum __x_ABI_CWindows_CSecurity_CCredentials_CUI_CUserConsentVerificationResult *results);

    END_INTERFACE
} __FIAsyncOperation_1_UserConsentVerificationResultVtbl;

interface __FIAsyncOperation_1_UserConsentVerificationResult {
    CONST_VTBL __FIAsyncOperation_1_UserConsentVerificationResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_UserConsentVerificationResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_UserConsentVerificationResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_UserConsentVerificationResult_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_UserConsentVerificationResult_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_UserConsentVerificationResult_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_UserConsentVerificationResult_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Security::Credentials::UI::UserConsentVerificationResult > methods ***/
#define __FIAsyncOperation_1_UserConsentVerificationResult_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_UserConsentVerificationResult_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_UserConsentVerificationResult_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_UserConsentVerificationResult_QueryInterface(__FIAsyncOperation_1_UserConsentVerificationResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_UserConsentVerificationResult_AddRef(__FIAsyncOperation_1_UserConsentVerificationResult* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_UserConsentVerificationResult_Release(__FIAsyncOperation_1_UserConsentVerificationResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_UserConsentVerificationResult_GetIids(__FIAsyncOperation_1_UserConsentVerificationResult* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_UserConsentVerificationResult_GetRuntimeClassName(__FIAsyncOperation_1_UserConsentVerificationResult* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_UserConsentVerificationResult_GetTrustLevel(__FIAsyncOperation_1_UserConsentVerificationResult* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Security::Credentials::UI::UserConsentVerificationResult > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_UserConsentVerificationResult_put_Completed(__FIAsyncOperation_1_UserConsentVerificationResult* This,__FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_UserConsentVerificationResult_get_Completed(__FIAsyncOperation_1_UserConsentVerificationResult* This,__FIAsyncOperationCompletedHandler_1_UserConsentVerificationResult **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_UserConsentVerificationResult_GetResults(__FIAsyncOperation_1_UserConsentVerificationResult* This,enum __x_ABI_CWindows_CSecurity_CCredentials_CUI_CUserConsentVerificationResult *results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_UserConsentVerificationResult IID___FIAsyncOperation_1_UserConsentVerificationResult
#define IAsyncOperation_UserConsentVerificationResultVtbl __FIAsyncOperation_1_UserConsentVerificationResultVtbl
#define IAsyncOperation_UserConsentVerificationResult __FIAsyncOperation_1_UserConsentVerificationResult
#define IAsyncOperation_UserConsentVerificationResult_QueryInterface __FIAsyncOperation_1_UserConsentVerificationResult_QueryInterface
#define IAsyncOperation_UserConsentVerificationResult_AddRef __FIAsyncOperation_1_UserConsentVerificationResult_AddRef
#define IAsyncOperation_UserConsentVerificationResult_Release __FIAsyncOperation_1_UserConsentVerificationResult_Release
#define IAsyncOperation_UserConsentVerificationResult_GetIids __FIAsyncOperation_1_UserConsentVerificationResult_GetIids
#define IAsyncOperation_UserConsentVerificationResult_GetRuntimeClassName __FIAsyncOperation_1_UserConsentVerificationResult_GetRuntimeClassName
#define IAsyncOperation_UserConsentVerificationResult_GetTrustLevel __FIAsyncOperation_1_UserConsentVerificationResult_GetTrustLevel
#define IAsyncOperation_UserConsentVerificationResult_put_Completed __FIAsyncOperation_1_UserConsentVerificationResult_put_Completed
#define IAsyncOperation_UserConsentVerificationResult_get_Completed __FIAsyncOperation_1_UserConsentVerificationResult_get_Completed
#define IAsyncOperation_UserConsentVerificationResult_GetResults __FIAsyncOperation_1_UserConsentVerificationResult_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_UserConsentVerificationResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Security::Credentials::UI::UserConsentVerifierAvailability > interface
 */
#ifndef ____FIAsyncOperation_1_UserConsentVerifierAvailability_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_UserConsentVerifierAvailability_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_UserConsentVerifierAvailability, 0xddd384f3, 0xd818, 0x5d83, 0xab,0x4b, 0x32,0x11,0x9c,0x28,0x58,0x7c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("ddd384f3-d818-5d83-ab4b-32119c28587c")
            IAsyncOperation<ABI::Windows::Security::Credentials::UI::UserConsentVerifierAvailability > : IAsyncOperation_impl<ABI::Windows::Security::Credentials::UI::UserConsentVerifierAvailability >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_UserConsentVerifierAvailability, 0xddd384f3, 0xd818, 0x5d83, 0xab,0x4b, 0x32,0x11,0x9c,0x28,0x58,0x7c)
#endif
#else
typedef struct __FIAsyncOperation_1_UserConsentVerifierAvailabilityVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

    /*** IAsyncOperation<ABI::Windows::Security::Credentials::UI::UserConsentVerifierAvailability > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_UserConsentVerifierAvailability *This,
        __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_UserConsentVerifierAvailability *This,
        __FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_UserConsentVerifierAvailability *This,
        enum __x_ABI_CWindows_CSecurity_CCredentials_CUI_CUserConsentVerifierAvailability *results);

    END_INTERFACE
} __FIAsyncOperation_1_UserConsentVerifierAvailabilityVtbl;

interface __FIAsyncOperation_1_UserConsentVerifierAvailability {
    CONST_VTBL __FIAsyncOperation_1_UserConsentVerifierAvailabilityVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_UserConsentVerifierAvailability_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_UserConsentVerifierAvailability_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_UserConsentVerifierAvailability_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_UserConsentVerifierAvailability_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_UserConsentVerifierAvailability_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_UserConsentVerifierAvailability_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Security::Credentials::UI::UserConsentVerifierAvailability > methods ***/
#define __FIAsyncOperation_1_UserConsentVerifierAvailability_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_UserConsentVerifierAvailability_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_UserConsentVerifierAvailability_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_UserConsentVerifierAvailability_QueryInterface(__FIAsyncOperation_1_UserConsentVerifierAvailability* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_UserConsentVerifierAvailability_AddRef(__FIAsyncOperation_1_UserConsentVerifierAvailability* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_UserConsentVerifierAvailability_Release(__FIAsyncOperation_1_UserConsentVerifierAvailability* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_UserConsentVerifierAvailability_GetIids(__FIAsyncOperation_1_UserConsentVerifierAvailability* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_UserConsentVerifierAvailability_GetRuntimeClassName(__FIAsyncOperation_1_UserConsentVerifierAvailability* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_UserConsentVerifierAvailability_GetTrustLevel(__FIAsyncOperation_1_UserConsentVerifierAvailability* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Security::Credentials::UI::UserConsentVerifierAvailability > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_UserConsentVerifierAvailability_put_Completed(__FIAsyncOperation_1_UserConsentVerifierAvailability* This,__FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_UserConsentVerifierAvailability_get_Completed(__FIAsyncOperation_1_UserConsentVerifierAvailability* This,__FIAsyncOperationCompletedHandler_1_UserConsentVerifierAvailability **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_UserConsentVerifierAvailability_GetResults(__FIAsyncOperation_1_UserConsentVerifierAvailability* This,enum __x_ABI_CWindows_CSecurity_CCredentials_CUI_CUserConsentVerifierAvailability *results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_UserConsentVerifierAvailability IID___FIAsyncOperation_1_UserConsentVerifierAvailability
#define IAsyncOperation_UserConsentVerifierAvailabilityVtbl __FIAsyncOperation_1_UserConsentVerifierAvailabilityVtbl
#define IAsyncOperation_UserConsentVerifierAvailability __FIAsyncOperation_1_UserConsentVerifierAvailability
#define IAsyncOperation_UserConsentVerifierAvailability_QueryInterface __FIAsyncOperation_1_UserConsentVerifierAvailability_QueryInterface
#define IAsyncOperation_UserConsentVerifierAvailability_AddRef __FIAsyncOperation_1_UserConsentVerifierAvailability_AddRef
#define IAsyncOperation_UserConsentVerifierAvailability_Release __FIAsyncOperation_1_UserConsentVerifierAvailability_Release
#define IAsyncOperation_UserConsentVerifierAvailability_GetIids __FIAsyncOperation_1_UserConsentVerifierAvailability_GetIids
#define IAsyncOperation_UserConsentVerifierAvailability_GetRuntimeClassName __FIAsyncOperation_1_UserConsentVerifierAvailability_GetRuntimeClassName
#define IAsyncOperation_UserConsentVerifierAvailability_GetTrustLevel __FIAsyncOperation_1_UserConsentVerifierAvailability_GetTrustLevel
#define IAsyncOperation_UserConsentVerifierAvailability_put_Completed __FIAsyncOperation_1_UserConsentVerifierAvailability_put_Completed
#define IAsyncOperation_UserConsentVerifierAvailability_get_Completed __FIAsyncOperation_1_UserConsentVerifierAvailability_get_Completed
#define IAsyncOperation_UserConsentVerifierAvailability_GetResults __FIAsyncOperation_1_UserConsentVerifierAvailability_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_UserConsentVerifierAvailability_INTERFACE_DEFINED__ */

/* 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_security_credentials_ui_h__ */
